焼きプリンが安かった

※この記事は『極搾り りんご』を飲んで書かれた。

購買部では日替わりでお菓子が安くなっているのだが、今日は焼きプリンが安かった。好物なので嬉しかった。おわり。

※この記事は『本麒麟』を飲んで書かれた。

特に面白いことはなかった。実験を黙々とこなし、その他の作業はやる気が出ない。

帰ってからやろうと思ったこともやっていない。

うん。

人生だね。

通報

※この記事は『アサヒ クリアセブン』を飲んで書かれた。

今日はインターネットで法律に反した書き込みを見て不愉快な気分になったので、然るべきところに通報した。ネットを厳しくしていくのは本意ではないが、だからといってネットで現実ではできないようなことをして他人を傷つけるのは許されることではない。

友人に誘われ、週末は白浜坂高校合唱同好会演奏会「歌おう!いつの日も。」に行くことになった。合唱は本格的に学んだことはないが、高校の音楽の授業で多少声楽の指導を受けたことやNコンの上位演奏を聴きまくったことでなんとなく良し悪しはわかるようになった。声が大きければ上手い。これは冗談ではなくて、大きい音を出せるのはとても大事なこと。大きな音と小さな音できちんと区別をつけられることが音楽表現の豊かさにつながるからだ。

今日のUI心理学

3.2 桁数の多い数字

表示や入力の際は桁数を区切ったほうがいいよねという話。これは短期記憶の容量と結びつけて考えられるだろう。マジカルナンバー7という有名な研究では人間の短期記憶は数列にすると7桁くらいが限界だと言われている。種々の実験条件の違いでこの数字は変わってきて、4とかいう研究もある。

とにかく人間の短期記憶の容量はそのくらいなので、そこに収まるように区切るのは妥当だろう。

セフセフ2

まだ3日の36時です。

今日(3日)は大学に行く時間帯だけ雨に降られて損した気分だ。明日は降るのかと思いきや台風は関東には来ないそうで、祭りに参加できないような寂しさがある。とはいっても災害は無い方がいい。

初速

自分で立てたマストドンインスタンスに人がこない。マストドンの本来の意義は情報の発信や保管を人に任せないという点で、それは自分のインスタンスに人がいなくても問題はない。

しかしインスタンスをわざわざ立てたきっかけはツイッターのユーザーストリーミングの廃止だ。アニメを見ながら大量かつ高速にツイートするアニメ実況がやりにくくなった。マストドンなら今までどおりの使用感で実況ができると思ったんだが、自分一人しかいないインスタンスでは実況しても何も楽しくない。実況の醍醐味は一体感だからだ。

マストドンユーザーで他にアニメを実況している人間がいないか探してみたが、そもそも 探す方法がない。プロフィール検索は存在しないし、地道に大手インスタンスのトップページで公開されているタイムラインからアニメ実況している人を探したが、pawooに一人いただけだった。

ツイッターからマストドンに人を引き抜くためには、初速が大事だ。クラスタを丸ごと同時に引き抜かないと定着しない。そのための方法を何か考えるべきだった。

というわけでアニメ実況したい人のためのインスタンスanimedon.chao.tokyoをよろしく。

嫌になる

今日はアホみたいなミスで待ち合わせに失敗してとても悲しかった。東京で指定の場所に時間通りに到着するのは僕のようなグズには難しい。

『君の膵臓を食べたい』はつまらなかったです。

明日も大学に行く用事があるのだが、昼頃には済むはずなので帰って洗濯をして休もう。疲れている。

Mastodonに自動ハッシュタグ機能をつけた

アニメ実況時は同じハッシュタグで継続的にツイートする。よってハッシュタグを保持し自動的に付加し続けてくれる機能は便利だ。作った。

やたらとトゥートの反映が遅いのはサーバーがイマイチだからかな…

この機能追加はReact+Reduxの処理階層を知っていれば全然難しくない。まずハッシュタグ入力欄と、そこへの入力を処理するaction, reducer, stateを作る(全部compose-formのコピー)。さらにCtrl+Enterによるトゥートを処理するhandleKeyDownにShift+Enterによって発火する別ルートのトゥート投稿処理を追加する。これもトゥートボタンによって発火する処理をほとんどコピー。そのルートの最後にあるのがこれ。

const status = getState().getIn(['compose', 'text'], '') + ' ' + getState().getIn(['compose', 'preservedHashtag']);

これだけが実質的に意味のあるコードだ。興味のある方はコミットログをどうぞ。

1年前のドワンゴインターンではJavaScriptが全然わからず(わからなかったのはJavaScriptだけではないが)チームメンバーに教えてもらっていたが、今では自力で触れるようになった。

Mastodonでハッシュタグ補完すると1文字目が勝手に確定する問題

Mastodon(v2.5.0rc1)でトゥート入力時にペーストでハッシュタグを入力すると、ハッシュタグ補完機能でハッシュタグの候補が表示される。それをEnterやクリックで確定して投稿すると、次のトゥートを入力するときに日本語入力を有効にしていても1文字目が勝手に確定される。

1文字目が勝手に確定されるという現象は割とよくあるやつで、slackでもTwitter公式でも発生した事例はある。しかし今回はハッシュタグ補完時のみという条件があるので、もしかしたらハッシュタグ補完が発生したときにはトゥート投稿時の投稿欄の情報リセット忘れがあるのかもしれない。現在ソースコードを確認中だ。

なおfriends.nicoでも同様の現象が起きることを確認済み。OSはUbuntu18.04で日本語入力はmozcだ。書いてて思ったが変換の方で何か悪さをしている可能性は十分ある。あるいはデスクトップ環境かも知れないし、ブラウザかも知れない。なかなか手強そうだ。

スプラップアンドビルド

※この記事は『極搾り ピーチ』を飲んで書かれた。

マストドンにelasticsearchをつけようと思ったらなんか壊れてしまったので作り直した。

なんか壊れてしまったというのは、マウント関連だ。リバースプロキシであるnginx-proxyは設定ファイルを外部から読み込むために、ホストの設定ファイル(./my_custom_proxy_settings.conf)をマウントしている。この状態で更にvolumes_fromでmastodon-nginxからnginx-proxyをマウントするとなんだかよくわからないがマウント関連っぽいエラーが出る。read onlyとかなんとか書いてあった。

この2重マウントは僕もわけがわからずやっているが、そんなことだからエラーが出るのは当然だ。面倒なので一回全部消してマストドンを立て直した。前回のデプロイから1週間ちょっとしか経っていないが、github上のデプロイガイドが書き換わっていて驚いた。mastodonの進化はまことに速い。

新しいdocker-compose.ymlはこうだ。今回は自分で改造することも視野に入れ、自前でビルドすることにした。なおmastodonのバージョンはv2.5.0rc1だ。

version: '3'
services:

  mstdn-nginx:
    image: nginx:1.11.10-alpine
    expose:
      - "9090"
    restart: always
    tty: false
    env_file: .env.production
    links:
      - web
      - streaming
    volumes:
      - ./setting/nginx/conf.d:/etc/nginx/conf.d:ro
      - ./setting/nginx/conf:/etc/nginx/conf/:ro
      - /var/www/certs:/etc/nginx/certs:ro
    networks:
      - common_link
      - back-mastodon
  db:
    restart: always
    image: postgres:9.6-alpine
    networks:
      - back-mastodon
### Uncomment to enable DB persistance
    volumes:
      - ./postgres:/var/lib/postgresql/data

  redis:
    restart: always
    image: redis:4.0-alpine
    networks:
      - back-mastodon
### Uncomment to enable REDIS persistance
    volumes:
      - ./redis:/data

  es:
    restart: always
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.1.3
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    networks:
      - back-mastodon
### Uncomment to enable ES persistance
    volumes:
      - ./elasticsearch:/usr/share/elasticsearch/data

  web:
    build: .
    image: tootsuite/mastodon
    restart: always
    env_file: .env.production
    command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000 -b '0.0.0.0'"
    networks:
      - back-mastodon
    ports:
      - "127.0.0.1:3000:3000"
    depends_on:
      - db
      - redis
#      - es
    volumes:
      - ./public/assets:/mastodon/public/assets
      - ./public/packs:/mastodon/public/packs
      - ./public/system:/mastodon/public/system

  streaming:
    build: .
    image: tootsuite/mastodon
    restart: always
    env_file: .env.production
    command: yarn start
    networks:
      - back-mastodon
    ports:
      - "127.0.0.1:4000:4000"
    depends_on:
      - db
      - redis

  sidekiq:
    build: .
    image: tootsuite/mastodon
    restart: always
    env_file: .env.production
    command: bundle exec sidekiq -q default -q mailers -q pull -q push
    depends_on:
      - db
      - redis
    networks:
      - back-mastodon
    volumes:
      - ./public/packs:/mastodon/public/packs
      - ./public/system:/mastodon/public/system
## Uncomment to enable federation with tor instances along with adding the following ENV variables
## http_proxy=http://privoxy:8118
## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
#  tor:
#    build: https://github.com/usbsnowcrash/docker-tor.git
#    networks:
#      - common_link
#      - back-mastodon
#
#  privoxy:
#    build: https://github.com/usbsnowcrash/docker-privoxy.git
#    command: /opt/sbin/privoxy --no-daemon --user privoxy.privoxy /opt/config
#    volumes:
#      - ./priv-config:/opt/config
#    networks:
#      - common_link
#      - back-mastodon

networks:
  common_link:
    external: true
  back-mastodon:
    external: true

注目してほしいのはmstdn-nginxのvolumesでホストマシンの/var/www/certsをマウントしていることだ。nginx-proxyでもホストマシンの同じディレクトリをマウントしている。2重マウントを解消し同じディレクトリをマウントするようにした。

elasticsearchはデフォルトで日本語対応してません。日本語対応プラグインを入れるのはちょっとしんどそうなのでまた今度やります。

ぶっ壊してまたイチから作ってというのを繰り返せるのは楽しい。無限にやりたい。

Ubuntu18.04はlibinput

※この記事は『本搾り オレンジ』を飲みながら書かれた。

昨日の記事の続きだ。新しいデバイス名を指定することで変換行列を指定することには成功した。しかし奇妙な現象が発生した。Kritaで絵を描くとき、細い線が引けないのだ。よく調べてみると、筆圧が5%を超えるまでクリック判定が発生していなかった。これをつぶさに調べる過程でデバイス名が変わっていた理由も判明した。

なぜUbuntu18.04にアップグレードするとデバイス名が変化していたのか。なぜ筆圧とクリックの挙動が変わってしまったのか。それはlibinputのせいだ。libinputはデバイス入力ドライバで、xinputの奥で動いているものらしい。16.04では液晶タブレットはevdevドライバで動いていた。18.04ではlibinputドライバが導入され、液晶タブレットの管理もlibinputに引き継がれたようだ。

考えるのが面倒だったのでlibinputを消したら解決した。

sudo apt purge xserver-xorg-input-libinput

libinputを消したらマウスの加速プロファイルが変わってしまって違和感があった。GNOME Tweaksから設定をFlatに戻したら直った。

今日のUI心理学

やろうと思ったんですが、ゲシュタルトの法則を一つずつ紹介していくだけだとクソつまんないのでもうちょっと面白いところまで読み進むのを待っててください。