Solrのフィールド名に日本語を使えるか

前回の記事に引き続き、今回はフィールド名に日本語を使えるかどうかを調査しました。

フィールド名の仕様については、Solrリファレンスガイドの”Field Type Definitions and Properties”に記載があります。

The name of the fieldType. This value gets used in field definitions, in the “type” attribute. It is strongly recommended that names consist of alphanumeric or underscore characters only and not start with a digit. This is not currently strictly enforced.

  • 英数字(先頭文字として数字は使えない)
  • アンダースコア

「今は厳密には強制していません」というのが微妙なところです。“Defining Fields”にもう少し詳しい説明がありました。

Field names should consist of alphanumeric or underscore characters only and not start with a digit. This is not currently strictly enforced, but other field names will not have first class support from all components and back compatibility is not guaranteed.

英数字とアンダースコア以外の文字も使えないことはないけど、全部のコンポーネントがサポートしているとは限らないよ、ということのようです。

フィールド名に日本語を使うとどういうことが起こるか試してみました。

まずtestという名のコレクションを作成します。

$ curl -s 'http://localhost:8983/solr/admin/collections?action=CREATE&name=test&numShards=1&replicationFactor=1'

「日付」というフィールドを追加します。

$ cat add_field_j.json 
{
  "add-field":{
     "name":"日付",
     "type":"pdate",
     "stored":true }
}
$ curl -s -X POST -H 'Content-type:application/json' -d @add_field_j.json http://localhost:8983/solr/test/schema

APIで「日付」フィールドが存在することを確認できます。

$ curl -s 'http://localhost:8983/solr/test/schema/fields/%E6%97%A5%E4%BB%98'
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "field":{
    "name":"日付",
    "type":"pdate",
    "stored":true}}

「日付」フィールドに値を持つデータを投入してみます。

$ cat j.json
{"日付":"2019-01-01"}
$ ./post -c test j.json

比較のため、”date”フィールドを追加してデータを投入します。

$ cat add_field_e.json
{
  "add-field":{
     "name":"date",
     "type":"pdate",
     "stored":true }
}
$ curl -s -X POST -H 'Content-type:application/json' -d @add_field_e.json http://localhost:8983/solr/test/schema
$ cat e.json
{"date":"1999-01-01"}
$ ./post -c test e.json

データがどう保持されているか比較します。

$ curl -s 'http://localhost:8983/solr/test/select?q=*%3A*&omitHeader=true'
{
  "response":{"numFound":2,"start":0,"docs":[
      {
        "id":"578b7513-831e-4ef3-bdb9-770268f27a7e",
        "__":["2019-01-01T00:00:00Z"],
        "_version_":1651454167605051392},
      {
        "date":"1999-01-01T00:00:00Z",
        "id":"892eb3b5-a648-45a5-80c1-5b975e8ebc47",
        "_version_":1651454169922404352}]
  }}

“date”の方は特に問題ありません。「日付」フィールドは無く”__”というフィールドに値が格納されています。値が配列になっていることから、「日付」フィールドの定義とは異なるフィールドとして扱われていることが分かります。何か別のダイナミックフィールドのルールにヒットしたようです。

当然検索もできません。

$ curl -s 'http://localhost:8983/solr/test/select?q=%E6%97%A5%E4%BB%98%3A%5B*%20TO%20*%5D&omitHeader=true'
{
  "response":{"numFound":0,"start":0,"docs":[]
  }}
$ curl -s 'http://localhost:8983/solr/test/select?q=date%3A%5B*%20TO%20*%5D&omitHeader=true'
{
  "response":{"numFound":1,"start":0,"docs":[
      {
        "date":"1999-01-01T00:00:00Z",
        "id":"892eb3b5-a648-45a5-80c1-5b975e8ebc47",
        "_version_":1651454169922404352}]
  }}

というわけで、割と基本的なところで躓いてしまいました。結論としては、フィールド名に日本語を使うのも実用としては無理ということになりそうです。

好きな漫画について語ってみた

こんにちわ。
リエです。

突然ですが、皆さんは漫画を読みますか?
私はよく読みます(漫画大好き!)

最近、2年ほどかけて読んでいた闇金ウシジマくんをついに読み終えてしまい寂しい気持ちでいっぱいです。洗脳くん編は衝撃だったなぁ。

少女漫画はあまり読まず、青年漫画ばっかり読んでいます。
ということで最近読んでいる漫画をざっくり語らせていただきます。

日常系

・ゆるキャン

https://yurucamp.jp/
知っている方も多いとは思いますが、女子高生がキャンプをする話です。
アニメ化とドラマ化もされており、漫画含めどれも大好きです!
ドラマでリンちゃんを演じている福原遥さんがかわいいのなんのって。
この漫画を読んで一時期キャンプに行きたいと言いまくっていました。

・きのう何食べた?

https://morning.kodansha.co.jp/c/nanitabe
有名な漫画ですし2019年にテレビ東京でドラマ化されたので、ご存知の方は多いかもしれないですね。ゲイカップルの日常を描いている漫画です。ドラマのキャストはまじで神でした。
出てくるお料理もどれも美味しそうで夜中に読むと危険です。(お腹がすく)

ダークサイド系

・ホームルーム

https://www.mbs.jp/homeroom_drama/
日常サイコパス系ラブコメです。(すごいジャンルだな)
コーポレートブログでこの漫画の詳細を書くと始末書を書かなきゃいけないかもなので、気になった方は読んでみてください。
ドラマ特別枠で2020年1月からドラマがスタートするそうで、よくドラマ化したなとびっくりしました。あの話を地上波に流すとなるとどう収めるんだろうと気になっています。

・闇金ウシジマくん

https://ymkn-ushijima-movie.com/
2004年から2019年まで連載されていた長編漫画です。
46巻あるのですが、ちびちび読んでいたので読むのに2年かかりました。
私の周りでは読むと病むと言われている漫画なのですが、(私は別に病まなかった)すごいなという一言につきます。完結してしまって寂しいです( TДT)


最近読んだ漫画はこのくらいでしょうか。
上には書いていませんが、凪のお暇も好きで何回も読み直したな。
ジョジョの奇妙な冒険は名前は知っていましたが読む機会はありませんでした。でも2017年にUSJとコラボした時にアトラクションに乗りたかったので、第3部まで頑張って読みました。そこから第6部まで読んだのですがまた続きが読みたいなと思っています。
あー、書いてたら最初から読みたくなってきた/(^o^)\時間を忘れて読んじゃうので引きこもりする時に読もうかな。

ちなみに今話題沸騰の鬼滅の刃はハマりそうでまだ手を出せていません。
おすすめの漫画がありましたらぜひ教えてくださいm(__)m

SketchプラグインのCraftでプロトタイプを作成してクライアントと共有しよう!

Craftとは

Craftとは、InVisionが提供するSketchとPhotoshop用の無料プライグインです。

プロトタイプを作成する他にも、SketchでUIデザインするときに便利な機能がたくさんあります!

プロトタイプの共有方法

1.  InVisionに登録し、Craftをインストールします。
インストール方法はこちらをご覧ください。

2. Craftを起動し、InVisionにログインします。

3. Sketchでリンクしたい要素をクリックし、キーボードの「C」を押します。
青い矢印が出てくるので、リンク先のアートボードを選択します。

4. アートボードをつなげたら、syncボタンをクリックします。 

5. 初回の場合のみ「Create new」を選択し、デバイスなどを設定します。
設定が完了したら「Publish」をクリックします。

6. InVisionの管理画面にアクセスすると、先程作成したプロトタイプがあります。(その他デフォルトに並んでいるのはサンプルです。)

マウスーバーをすると「SHARE」ボタンが表示されるので、そちらをクリックします。

7. 招待ウィンドウが開きます。通常に招待すると招待された方もInVisionにログインする必要があるのですが、下部にある「public share link」をクリックしたときにコピーされるURLを共有すれば、どのデバイスからでもプロトタイプを確認することができます。

共有されたプロトタイプにはコメントを残すことができます。

簡単ですが、Craftのプロトタイプの共有について紹介をいたしました。
Sketchがメインの制作環境の場合、Craftを活用するとプロトタイプの制作と共有が簡単にできそうですね!

面倒な事をシステムでなんとかする

弊社では勤怠システムがWEBシステムになっているのですが、忘れることがあったのでえいやーでなんとかしてみました。

・WEB上に勤怠システムがある
・emailアドレスとパスワードでログインする必要がある
・システムではlaravelのtoken処理が使われているらしく、cookieとtokenも一致させなければいけない
・Macの起動と終了で勤務時間とみなす
・自分しか使わない前提でとりあえず動くもの

ひとまず出勤と退勤処理をするためのプログラムを作成
できあがったものが以下

#!/usr/bin/env bash

function usage {
  cat <<EOM
Usage: $(basename "$0") [OPTION]...
  -h Display help
  -e VALUE E-mail address
  -p VALUE Password
  -t VALUE Type(start, end)
EOM

  exit 2
}

API_HOST='kintai-system-no-host-dayo'
_EMAIL=''
_PASS=''
_TYPE='start'

while getopts ":e:p:t:h" optKey; do
  case "$optKey" in
    e)
      _EMAIL="${OPTARG}"
      ;;
    p)
      _PASS="${OPTARG}"
      ;;
    t)
      if [ "x${OPTARG}" = "xstart" ]; then
        _TYPE='start'
      elif [ "x${OPTARG}" = "xend" ]; then
        _TYPE='end'
      else
        echo "-t ${OPTARG}: unknown type."
        usage
      fi
      ;;
    '-h'|'--help'|* )
      usage
      ;;
  esac
done


if [ "x${_EMAIL}" = "x" ]; then
  read -p "E-mail address: " _EMAIL
fi

if [ "x${_PASS}" = "x" ]; then
  read -sp "Password: " _PASS
fi

# cookieの保存場所
tmpfile=$(mktemp)

# トークンの取得
_TOKEN=$(curl -s -c ${tmpfile} https://${API_HOST}/login | xmllint --html --xpath '//*form/input/@value' - | grep value= | sed 's/[^"]*"\([^"]*\)"[^"]*/\1/g')

# ログイン
curl -L -b ${tmpfile} -c ${tmpfile} -d "_token=${_TOKEN}&email=${_EMAIL}&password=${_PASS}" https://${API_HOST}/login

# 出勤もしくは退勤
curl -L -b ${tmpfile} -c ${tmpfile} -d "_token=${_TOKEN}" https://${API_HOST}/dashboard/${_TYPE}/

exit

適当なファイル名eiya-de-kintai.shとして保存し、実行権限をつけておきます。

$ chmod +x ~/eiya-de-kintai.sh



実行するには以下のようにします。
出勤

$ ~/eiya-de-kintai.sh -e email@example.splout.co.jp -p password-desu -t start


退勤

$ ~/eiya-de-kintai.sh -e email@example.splout.co.jp -p password-desu -t end

プログラムの内容は
・curlでログインページの取得を行い、一時ファイルにcookieを保存
 同時にレスポンスbodyからxpathでinput要素のvalueにあるtokenを取得
・取得したcookieとtokenとメールアドレス(-e)とパスワード(-p)をログインページへPOSTし、ログイン状態のcookieを保存
・出勤もしくは退勤(-tで指定)のエンドポイントへログイン状態のcookieを使いtokenをPOST

ログイン判定してないとかcookieが残骸として残る等かなり手を抜いているがひとまず気にしない。徐々に手を加えていく予定。

Macの起動と終了で処理を走らせるには、「Macの起動=アプリケーションの起動」、「終了=アプリケーションの終了」とみなすことにし、作成したシェルスクリプトを呼び出すApplescriptを作成しました。

Macに標準で入っているスクリプトエディタを起動

↑こんなアイコン

以下のコードを記述

on run
	do shell script "~/eiya-de-kintai.sh -e email@example.splout.co.jp -p password-desu -t start"
end run

on quit
	do shell script "~/eiya-de-kintai.sh -e email@example.splout.co.jp -p password-desu -t end"
	continue quit
end quit

これを
 ファイルフォーマット:アプリケーション
 オプション:ハンドラの実行後に終了しない。
で保存します。

出来上がったアプリケーションをMacのログイン時に実行されるようにします。
「システム環境設定」にある「ユーザとグループ」を開き
「ログイン項目」へ作成したアプリケーションの登録を行います。

以上でとりあえずのものが出来上がりました。

Macを起動し、ログインすると自動で出勤処理が行われます。
Macの終了時には自動で退勤処理が行われ、何も意識しなくても勤怠処理が行われるようになりました。


そう、エラーさえなければ・・・

アカウント情報を平文で書いているとかApplescript使うならシェルいらないのでは?とかエラー処理されていないとか、実用するにはまだまだまだまだ改善すべき箇所が多く残っていますが、ひとまず目標は達成しました。