Raspberry PiにMPDサーバを構築するAnsible Playbookを公開した

FAQ タイトルの件のPlaybookはどこ?→ https://github.com/toshia/RPi-tools

自宅で音楽を聴くための良いプレイヤーソフトを決め兼ねていたのですが、最近はMPDで安定しています。ベッドに寝転がった状態でiPhoneAndroidからプレイリストを選んで曲を再生するとか、cronで毎朝目覚まし代わりに音楽再生とか、いろいろやってます。

MPDはせっかくクライアントサーバシステムになってるから、なんとなく別のマシンで常にMPDを動かしておきたいなあと思ったので、余っていたRaspberry Piを一台使ってMPDサーバにしました。 今回はAnsibleのPlaybookを作成して、ゼロから同じ環境をセットアップできるようにしました。 要するに、簡単に誰でも同じ環境を構築できるということです。

この記事でやってること

記事を書いていると、今回の主役である「MPDが動いてる音楽再生用のRaspberry Pi」の名前がないと不便なことに気がついたので、この記事では略して「MPD Pi」と呼ぶことにします。

  • MPD Piをつくる
    • 構築してから何年も経つとどうやったか忘れるので、Ansibleで完全に構築が完了するようにする
  • MPDとかの布教

MPD Pi(MPDサーバの構築)

早速MPD Piを構築しますが、たんなるMPDサーバなので、実は検索すると同じような話はいくらでも出てきます。別にRaspberry Piである必要はないですし、しまいにはVolumioをRaspberry Piに入れるといった上位互換みたいな記事もあります。

ではこの記事の意味は何なのかというと、私が書いたAnsible Playbookの使い方を説明することと、MPDの布教にあります。あとは強いて言うなら、オーディオの話になると凝った環境の話が多いですが、この記事では適当にサウンドを再生するだけなので、私のようにあまりこだわりのない人間には丁度よいです。

とは

MPD

Music Player Daemon の略で、クライアントとサーバに分かれている音楽再生ソフトです。

サーバの方は基本的にMPDが使われているので、この記事でもMPDを使います。

一方クライアントのほうは、MPDプロトコルで通信できればいいだけなので、多くのクライアントソフトが開発されています。ただの音楽プレイヤーのような見た目で、サーバのプレイリストを管理したり、再生する楽曲を選択したりできます。再生した音楽は サーバ側で鳴る ので、「オフィス等の共有スペースのBGMを流したい」とか「ノートPCやスマフォで操作しつつ、自宅の良いスピーカーで音楽を聴きたい」といった用途に使えそうです。 私は単純に、寝ようと思って横になった時に音楽を再生しっぱなしだったことに気づいてまた立ち上がるということがしばしばあって、寝たままスマフォで停止したいという理由で使い始めました。一人暮らしなうえ音質にも拘ってません。

Ansible

構成管理ツールの一種です。似たようなソフトで有名なものにChefなどがあります。

Playbookと呼ばれる、「mpdとsambaをaptで導入してー、音楽ディレクトリの場所かえてー、そこをsambaで公開してー…」といった一連の設定手順を用意しておくと、手元のAnsibleが勝手に指定したホストマシンにsshで入っていい感じにセットアップしてくれるというものです。多数のマシンを同時にセットアップするのに向いていますが、YAMLなのでgitで構築手順を管理できたり、今私がやっているようにgithubに公開すれば他の人がPlaybookを利用して同じ環境を構築できるなど、一台だけセットアップするときにもメリットがあります。

Raspberry Piのイメージをそのまま圧縮して公開している人もいますが、サイズが大きかったり、そもそも何が入っているかわからないので怖いという問題があります。AnsibleのPlaybookであれば、どういったセットアップ手順なのか明確にわかりますし、独自に手順を削ったり追加したりできます。

Raspberry Piの準備

最低限用意すべきは

  • Raspberry Pi(B, 2B, 3Bで確認済)
  • Micro SD
  • Micro USBケーブル
  • スピーカー

です。また、むき出しで設置するのが嫌ならケースとかが現実的には必要ですね。

Raspberry Piは基本的にPimoroniで購入しています。別にどこで買っても条件を満たすハードならなんでも良いです。

今回の用途であれば、ネットワークアクセス可能でイヤホンジャックでサウンドを出力できればなんでも構いません。私は初代Raspberry PiのModel Bが余っていたのでそれを使い、新規購入はしませんでした。

Micro SDの容量ですが、楽曲ファイルを保存するため、一応32GBのものを使いました。そんなに曲はないので16GBでも足りるんですが。

スピーカーから音を出す必要があるので、スピーカーを準備する必要があります。持ってるスピーカーについていたミキサ機能がついに役立つ時が来たかと思ったんですが、知らないうちにPS4に奪われていたので、適当にかっこいいケーブルを買いました。

こういう微生物いますよね。しっぽで泳ぐやつ。

AnsibleのインストールとPlaybookのダウンロード

Ansibleは、手元のマシンにインストールして、Raspberry Piなどのホストマシンにリモート接続してセットアップしてくれるやつなので、とりあえず作業用マシンのほうにAnsibleをインストールします。OSも、MacでもLinuxでも使ったことがあります。インストール方法はOSによって違ってくるので割愛します。

$ ansible-playbook --version
ansible-playbook 2.2.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

インストールしたら上記のコマンドで確認。入ってますね。

Playbook実行環境を整える最低限の設定を手動でやる

Raspberry Piについては有益な情報が溢れていて書くメリットがないので、どういう設定をしたかを簡単に書いておくだけにします。

イメージを入れて、Raspbianのインストール完了まで

Raspberry Piが手に入ったら、Ansibleがコントロールできる状態までは手動でセットアップしてやる必要があります。 Micro SDにRaspbian Jessie LITEを入れて、Raspberry Piを起動しましょう。 今回の用途にはDesktopは使わず、Lite(GUIなし)を使いました。結局AnsibleでセットアップするのでXが入っていようがいまいが一緒だと思います。

ホスト名

Playbookのhostsファイルに書くので、いい感じに設定しておきます。

SSHでログインできるようにしよう

標準だとsshdが入っているのに、SSHリモートアクセスができないようになっています。Ansibleを使うにはそのマシンにSSHアクセスできないといけないので、気合で有効にしましょう。

公開鍵を登録する

作業マシンで ssh-keygen コマンドを使って秘密鍵と公開鍵のペアを作成し、パスワードなしで作業マシンからMPD Piにアクセスできるようにしましょう。

Playbookの入手・実行

早速私の作ったPlaybookを作業マシンでダウンロードしましょう。

github.com

Akkiesoft さんが、自分の作ったRaspberry PiのPlaybookを公開しているものをフォークして、MPD Pi等のレシピを混ぜたものです。なので温度計を作るレシピとかが入ってますが、今回使うのは私が作ったmpdというレシピだけです。

gitとかで作業マシンにcloneして、 ansible/ ディレクトリに移動して、 hosts というファイルを作り、以下のような内容にします。

[all]
mpdpi.local ANSIBLE_SSH_USER=pi 

mpdpi.local の部分に、MPD Piのホスト名又はIPアドレスを書きます。Ansibleがsshで繋ぐ時に使います。

そしたらあとは、以下のコマンドでPlaybookを実行。

$ ansible-playbook -i hosts mpd.yml

必要なパッケージが入ってなかったらインストールするなどいろいろやるので、わりと時間がかかるかもしれません。

MPDを使ってみる

成功すると、早速MPD Piとして稼働しているはずなので、イヤホンジャックにスピーカーなどを繋いで、サウンドを再生する準備をしましょう。

音楽ファイルを入れる

再生する音楽が必要です。そしてそれをMPD Piに転送する必要がありますが、Sambaで音楽ディレクトリが「music」という名前で共有されているので、適当にmp3などのファイルを突っ込みます。 \\MPDPI\MUSIC みたいな感じで。このPlaybookで構成すると、デフォルトでは匿名でアクセスして書き込みもできるようになっています。

ディレクトリを再帰的に辿って音楽ファイルを探してくれるので、私はアルバムごとにディレクトリが分かれているMusicフォルダを丸ごと入れました。

自分のメインマシン(Linux)からコントロール

MPDを操作するクライアントは色々ありますが、とりあえず人気の高いクライアントの一つとされているSonataをインストールしてみましょう。

設定で、MPDサーバとしてMPD Piのホスト名またはIPアドレスを入れると、先ほど入れた楽曲がちゃんと見えているはずです。操作方法は割愛しますが、作業用マシンのSonataを操作したらMPD Piにつながってるスピーカーから音が鳴るわけです。

f:id:toshi_a:20170302201233p:plain

以上で構築は終了です。お疲れ様でした。ここからは話を逸していきます。

普通の音楽再生ソフトは、UIが気に入らないだけで乗り換えるということがありますが、MPDの場合はクライアントを変えるだけなので、移行コストは有って無いようなものです。私はSonataを使ってましたが、最近Cantataに乗り換えつつあります。

f:id:toshi_a:20170302202915p:plain

クライアントだけを乗り換えたり、併用したりできるのもMPDを推す理由です。自分でMPDクライアントを作るのも楽しそうです。

Androidクライアント

せっかくなので、スマートフォンから操作してみましょう。

iOSの場合はMPoDというのがついこの間まで使えたのですが、現在はストアでは公開されていないようです。有料のものを使うか、次の節で紹介するWebクライアントを利用しましょう。

Androidの場合は選択肢が多いですが、MPDroidというやつを使っています。再生ボタンなどのコントロールウィジェットとして配置できたり、通知領域に再生情報などを表示してくれるなど、いろんな機能があります。

f:id:toshi_a:20170302204526p:plain

Webクライアント(ympd)

Webインターフェイスを使えば、ブラウザからmpdの操作ができます。これもかなり数があるのですが、ひとまずympdを使ってみました。ympdというplaybookを作っておいたので、mpdを入れたのと同じマシンに簡単にセットアップできます。

$ ansible-playbook -i hosts ympd.yml

http://raspberrypi.local:8080/ みたいな感じでブラウザからアクセスすると、Web上からプレイリストの操作などができます。使う予定がないなら入れる必要はないですが、mpdクライアントがない環境でもコントロールできるようになるのでお薦めです。

f:id:toshi_a:20170302193918p:plain

Vivaldi は、サイドバーにWebページを入れることができます。ympdはレスポンシブデザインなので、サイドバーでも全く問題ないですね。

f:id:toshi_a:20170302194901j:plain

PS Vitaのブラウザです。ゲーム中に操作できるのは便利かも。

Pocket C.H.I.P. のWebブラウザで。画面サイズは如何ともしがたい。

その他のクライアント

mpd.wikia.com

上記ページにまとまっています。コマンドラインインターフェースのmpcや、リッチなCUIのクライアントもあります。Emacsで操作したかったので調べたところ、Emacs 24あたりからバンドルされているようです。自分が普段使っている意外なソフトにMPDクライアントのエクステンションがあるかもしれません。

MPD Piまとめ

MPDを紹介して、MPD Piを作成するPlaybookの使い方を紹介しました。Playbookがやっていることは、MPDの設定とSambaの設定がほとんどです。Sambaが特にそうですが、LAN内ならなんでも書き込めるようになっているなど、状況によってはそのまま使えない環境もあると思います。このPlaybookはカスタマイズしやすいようにできるだけ余計なことはしないようにしているので、外付けHDDに音楽ファイルを置くとか、Sambaを外してNASの音楽ディレクトリをマウントするとか、思いつくだけでもいろいろと応用できそうです。

PocketC.H.I.P.を買った

出会い

KOF 2016にて。見た目が良いデバイスが置いてあって、かわいいねー君なんて言うのーなどとナンパしていたら、mikutterが入っているという恐ろしい体験をしました。

CHIPとは

kapper1224.sblo.jp

気になる…

名前だけ覚えていて、12月になるかどうかでポチってしまった。

getchip.com

二週間くらいで届くという話だったけど、年末ということもあってか三週間かかった。

開ける

写真撮ってなかった…。 まずすげえと思ったのは、取り出してMicro USBで給電してやれば即使えたこと。初めてMacBookPro買った時も速攻で使い始められてめっちゃ感動したので、俺はこういうのに弱いのかもしれない。 CHIPと殻をPPAPするとかもなくて、本当にすぐ使える状態で入っていた。 これ買う人がそれ求めてるのかわからんけど、いいですね。

画面は感圧式のタッチパネルで解像度は420x272。小さすぎと思っていたが意外と大丈夫なことが多い。

キーボードはめっちゃ使いづらいと聞いていたけれど、そこまで酷くはない。見た目CTRLがめっちゃ右下にあっておかしいやろと思ったりしたけれど、標準のキーアサインとかいろいろ考えると、両手で持って片手ずつで同時押しが可能な配置になっているので思ったより良い。 キーは爪の先で押す感じかな。そういう押し心地。

期待するとガッカリ、舐めてかかると意外と良いという感じか。俺はPocketCHIPの見た目が気に入って買ったのでこれで使ってみよう。

適当に触る

ゲームする

f:id:toshi_a:20161223135134p:plain

幾つかファミコン風の謎のゲームが入っていて、死ぬほど難易度が高い。ESCキー押したらゲームのコードとか編集できるし、マップもわりとリッチなマップエディタで修正できてしまう。 俺は小学校の時に生まれて初めてテトリスを与えられた時「全然クリアできないから糞ゲーだなー改造したいなー」と思ってからプログラミングという行為でゲームを作るということを知るのに6年かかったので(家にパソコンがあったのは幸運だったが、まさかこれがゲームを作るための機械だったとは…!)、このESCキーは俺の人生の6年分の価値があるということになる。ほんとかよ。

しかしこれ改造しないと最初のマップから脱出無理な気がするんだけど。ゲームは一周クリアするまでは攻略見ない派なんだけど、ハックするのが正規ルートなんじゃねえかこれとか思った。つか調べてないけど攻略とかあんのかこれ。買ってもない宝くじが当たって仕事辞めて暇になったらこのブログで謎ゲープレイ日記再開してこのゲームdisってやるからな

ターミナル

f:id:toshi_a:20161223135315p:plain

いきなりランチャーに「Terminal」とかいうのがあるのでタップしたら案の定端末が開く。

f:id:toshi_a:20161223135214p:plain

uname -aとかやったら普通にそれっぽい文字列が出てくる。Xのアプリケーションを起動したら全部全画面表示になるんだけど、よく調べたらWMがAwesomeだった。俺が今使ってるこれじゃん。Awesomeは色々カスタマイズ効くのでこういうふうにも使えるか〜などと思ったりした。

様々なカスタマイズが入ってるけど、装飾キーがAltに変更されていたり(Superがないので)、C-qがウィンドウ閉じるのに割り当てられたりしてるっぽい。Awesomeならカスタマイズわりと慣れているのでキーマップ変えたりいろいろできて良さそう。luaでちょっとしたものも書けるのでいいぞ。

設定

画面の明るさ、音量(イヤホンさしたら音が出る)、Wifiの設定ができる。ステルスSSIDを設定できなくて残念だった(ターミナルを開いてくいっとやったらできるけど、ここまで手軽だったのでWifiくらい手軽にやりたいとか思ってしまう)。

設定画面はそれだけ。シンプル。

Debian

Debianカーネルとかいくつかのパッケージに独自のパッチを当てたディストリが入っているらしい。Debianはサーバでしか使ってないけど一番長いこと使っている。いいぞ。

とりあえず apt update からの apt upgrade で軽く優勝してからsshdとtmuxを入れてメインマシンから入っていろいろやった。雑に日本語化してfcitx入れたら日本語入力もできた。

f:id:toshi_a:20161223135346p:plain

ただ、fcitxに限らないけど、設定のダイアログがこんな小さいウィンドウを想定して無い。Awesomeは標準ではダイアログウィンドウはフロート表示する。また、ダイアログはサイズを変更できないことも多くて、はみ出して難易度が高かった。ALT押しながらドラッグして頑張ったらいける。

mikutter mobile

形から

おかのさんにもらったmikutterロゴシールを貼った。色もPocketCHIPのピンクとほとんど同じで、このためのデバイスだったのかと思うほど。

パッケージがあるからめっちゃ楽

ゆうて中身がDebianなので…。つまり…。

# apt install mikutter

これでmikutter 3.0が入ります。拍子抜けやわぁ。 日本語入力も適当なIM入れておけばいけるので、これでどこでもmikutterですね。バッテリの持ちはしらん(通常は5時間持つらしいが、mikutterを入れたら…)。

肝心の動作は全く不満がないレベル。重いんじゃねえのとか思っていた時期もあったけど、これは普通に使える。ツイートもサクサクできるし。近所の喫茶店で1時間くらい遊んでたけど全く問題ない。若干周囲の視線が気になる程度。

3.5.0-alpha2を使いたい

mikutter開発者たるものHEAD使いたいよね。 gitを入れてpullしていつもどおりに bundle --path=vendor/bundle/ --without=test です。

Installing nokogiri 1.6.8.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.1 extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /home/chip/mikutter/vendor/bundle/ruby/2.1.0/gems/unf_ext-0.0.7.2 for inspection.
Results logged to /home/chip/mikutter/vendor/bundle/ruby/2.1.0/extensions/arm-linux/2.1.0/unf_ext-0.0.7.2/gem_make.out

An error occurred while installing unf_ext (0.0.7.2), and Bundler cannot continue.
Make sure that `gem install unf_ext -v '0.0.7.2'` succeeds before bundling.

アウ

mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h とか言われるときは sudo apt install ruby-dev build-essential ですね。

そしてまたbundleなんだけど、異様に時間がかかる。Raspberry Pi Zeroくらいの性能らしいので、いろいろとビルドして時間がかかるのは仕方ないね。

その他設定

ストレージが4GBしかなくてすぐに限界がくるので、物理的に小さくて容量がでかいUSBメモリとかを常に脳天に突き刺しておくのが良いかも。 そうでない場合、mikutterの画像キャッシュなどは一切切っといたほうがいいかもしれない。俺は何もやってないけど。

実はmikutterのキャッシュに使っているmonetaというライブラリは、ファイルシステム以外にもいろんなKVSに対応していて、バックエンドをMemcachedやRedisとかに変更することができる。やらないけど。

あと、キーバインドはメインマシンとはかなり違うのにした。キー配置が違うから当然だね。コンテキストメニューどうやって出すかわからんので、野々村とかヨドバシもキーに割り当てる感じになると思う。コンテキストメニューを表示するmikutterコマンドの実装をしような。 ディスプレイのタッチはあんまり積極的に利用したくないんだけど、一通りの操作はキーボードで済む。こういう時あらゆるキーバインドを変更できるmikutterは強い。

mikutterはクソ

f:id:toshi_a:20161223061220p:plain

一部のダイアログボックスがサイズ決め打ちなのでディスプレイに収まっていない。特にキーボードショートカットの設定とか。これはなんとかしたいね。 あと、アイコンサイズ変更できないのはどうでもいいと思っていたけれどこれを手に入れてから考えが変わった。48px四方とかでかすぎませんか!横幅420pxの人も居るんですよ!

画像ビューアも、mikutter 3.5だとダイアログウィンドウ且つデフォルトサイズが640x480になっているため、画像の全容が表示されない。mikutter 3.0では通常ウィンドウなのでフルスクリーン表示になる。こういう違いはWMの実装によって変わってくるので、一概に通常ウィンドウに戻せば全ての環境でベターな振る舞いをするとも限らないし、そもそもベターというのも人によるところがある。 かつてこの仕様については、画像ビューアのウィンドウはダイアログウィンドウにするか通常ウィンドウにするか設定できるようにするという案もあったんだけど、エンドユーザが通常ウィンドウとダイアログウィンドウがどういう扱いの違いを受けるのかなんて知るわけがないし、いやLinuxデスクトップ使ってるなら知ってるかも知れないしおれもAwesomeに於いてはなんとなく知ってるけど、かと言ってそれをエンドユーザの立場から選ばされるのは違う気がするし、そんな設定生やしまくってたら設定多すぎてキリがないので困ったなと言って放置されてた。

ただmikutterいいところもあって、開発者が自分なので、自分が不便だと思い始めたら近いうちに修正されます。ううん、しかしそれぞれ、どう解決したものか。

ポータブルなmikutter端末としてアリか

多分3GやLTE使えないとやってられないという人が多いんだろうけど、俺はテザリングしてiPod touch使うとか日常的にやっているので回線的には問題ない。 文字サイズ8pxにしたら、ツイートは1画面に表示できて3ツイートくらい。2ペインだと倍表示できるけど、そうしたら長文だと1ペインに1ツイートを表示しきらないこともある。閲覧は辛いかも。

ツイートの投稿の方は特に問題ない。俺はメインのLinux環境で使ってるfcitx-mozcで全く同じような環境を構築した。辞書も移行できるはずなのでへんな顔文字使いたくなったらやってみようかな。そういえば長音が入れられなくて、ハイフンを押したら本当にハイフンが入って変換に支障をきたすので、ローマ字のマップ変えたほうがいいかも。でもそれやるなら俺はAZIKユーザなのでAZIKにしちゃおうか。一回のキータイプのコストが大きいのでタイプ数が減る工夫は大きく効いてきそう。

ともかくCHIP、手軽に楽しめて良い。

mikutter 3.5とmikutter mobile

CHIPのランチャには以下の機能がある。

  • (電源を切る等)
  • ターミナル
  • ゲーム
  • 音楽作成ソフト
  • ヘルプ
  • テキストエディタ
  • ファイルブラウザ
  • (設定)

このうち必要そうなのは、電源と設定とターミナルということになる。 mikutterはターミナルを表示するプラグインがあるので、このランチャをそのままmikutterに置き換えてしまうのはアリっぽい。 また、ファイルブラウザはfilerプラグインという、mikutter 3.5で動作するプラグインを既に公開していて、これを使えばとりあえずファイラとしてmikutterを使用できないこともない。 mikutter 3.5には関連付け機能もあるので、ファイラプラグインでテキストファイルに対して「開く」コマンドを実行したらよしなに開いてくれるテキストエディタプラグインというのも作れそうではある。画像ビューアは先に上げたような問題があるけどバンドルされているものがそのまま使えている。関連付けはファイルではなくModelリソース全てに対して行えるので、URLを外部のブラウザではなく内部ブラウザプラグインで開く、つまり本当の意味でmikutterと連携するWebブラウザも作ることが可能なはず。mikutterのWebブラウザは何人か作っている人見たので誰かIntentに対応してくれ…!

id:ahiruZ が作ってるslackプラグインを使ってCHIPでSlackするというのも良さそう。Slackの公式クライアントをCHIPで動かすのいろいろとキツイはずなので(試してないけど、画面サイズが厳しいと思う)サードパーティクライアントに期待がかかる。図らずもmikutterがTwitterにおいてそうなっているように、SlackプラグインがCHIPのSlack環境としてデファクトスタンダードを勝ち取る未来があるかもしれない(なんだそれ)。

世の中ではCHIPでいろいろ凄そうなことしている人が多いけど、俺はとりあえずmikutterがこういうデバイスのシェルになりそうなの面白いなあと思ってる。

ワイワイタを懲らしめてやった話

誕生日らしい

先日d250g2 slackであったやりとり。

toshi_a [10:53 AM]  
お誕生日おめでt−−−−− :cake:

akkiesoft [10:53 AM]  
あらめでたい

ahiru [10:53 AM]  
おめでた

whywaita [10:53 AM]  
ありがとう〜〜

[10:53]  
(昨日)

toshi_a [10:54 AM]  
1日くらい誤差やろ、お前いくつやねん

whywaita [10:54 AM]  
22歳になったで…

toshi_a [10:54 AM]  
もう若くないのよ

ahiru [10:54 AM]  
え…

toshi_a [10:54 AM]  
エッ

エッ見た目より若いな。

少子高齢化の時代です。相対的に若いことの価値は上がっています。無闇に若いことは罪です。これはこらしめてやらねばなりませんよ。なにか贈りましょう。こう見えて俺は、微妙な気分になる贈り物を選ぶことについては自信があるのです。

わいわいたのことよくわからん

ツイートから見るwhywaita

そういえばアイツは何なんだろう。ツイートを見返してみると、情報系の学生っぽいことはよくツイートしているけど、アニメとかについてはツイートしておらず、少し見たところ趣味がよくわからないな。

ブログなどでネトスト

彼の情報を調べ始めると意味不明なコンテンツばかり出てきて頭が痛くなるのですが、その中でもアニメの総評を書いている記事を見つけることができました。

http://whywaita.hateblo.jp/entry/2016/07/07/133947

こういうのは好みの方向性がわかって有益なんでしょうが、俺はアニメ見ないので分かりませんでした。

他の記事もざっと目を通しましたが、どういうものが好みかを読み取ることはできませんでした。

干し芋は鏡

どっちみちほしいものリストの脆弱性を使ってギフトを送ることになるので、彼がどんなものをほしいものリストに入れているか見てみましょう。

https://www.amazon.co.jp/registry/wishlist/I8UFDP9ZQB17/ref=cm_sw_r_cp_ep_ws_k5UnybBV13KVQ?view=null&filter=siS3SUBQOS45I0PI

うーん、娯楽関連はポケモンの新作と3DSと牛タンブロックだけですね。完全に理解しました。

微妙なお気持ちになる贈り物ガイドライン2016

ここで、俺が今回どういうものを送りたいか明確にしておきます。

  • 相手が嫌がらない
  • 相手が喜ばない
  • 嫌がらせで送られてるのか善意か判断が難しいが、お世辞にも嬉しくはないので反応に困る
    • 困った結果、ギフトカードに書いてある内容を撮影してTwitterにアップし、商品に対するリアクションを避けようとする

これらを満たす贈り物とは

  • 大きすぎず、場所を取らない: 処分しようと思ったら簡単に処分できるもの。法的・大きさ的にゴミ箱に入れていいもの。
  • 安っぽくないもの: 見るからに1000円を割っているような安物だと気軽にdisれるので良くない
  • 負い目を感じさせないもの: 高価すぎると、相手が嫌がらせの可能性を考えなくなる。また、食べ物なんかは腐らせてしまう・アレルギーを持っている・嫌いといったことがあるとわざわざ貰ったのに食べられなくて申し訳ないと思われてしまう。
  • 使おうと思ったら使える: 実用性はあって、確かに自分は持ってないし生活に利用できなくはないが、別に困っていた問題を解決してくれるわけではないもの。ぬいぐるみやフィギュアのように実用品でないものでも、相手の好みにかするようなもの。

と、私は考えています。私は今年の夏にYukari for Androidの作者に結月ゆかりパーカーを送りましたが、それはそれは良い反応でした。

whywaitaの好みを分析

彼が喜ぶものを考えれて、それを手がかりに贈り物を考えましょう。皮肉なことですが、喜ばれる贈り物を考えるときと、決定のプロセスは似通っているのです。要するに、やはりほしいものリストが参考になります。

彼のほしいものリストに入っているものの問題点を見てみましょう。

  • 牛タンブロック: 調理の必要。日持ちしない。
  • フィリップスの4kディスプレイ: 実用的。高価。
  • ハンガー: 実用的。安っぽいわりには高価。
  • ポケモン: 遊べない可能性(3DS干し芋に入っている)。実用的(ポケモンは楽しい)。

問題点は干し芋に入っているという点を無視して書いているので、実際には問題にならないことも挙げています(牛タンの調理など)。そもそも、干し芋のリストに入っていることが一番の問題です。

やはり彼は実用的なものを好むようです。かわいいぬいぐるみなどは今回にはふさわしくなく、実用性が微妙な雑貨を贈るのが良さそうと判断しました。

贈り物の選定

エビフライ

以上のことから、whywaitaにはエビフライグッズを送るのが良いということがわかります。早速Amazonで調べてみると、結構贈り物にしては安くで品質の良いエビフライが売っていることがわかります。エビフライは贈り物のコスパとしては優れているかも知れませんね。

エビフライの罠

しかしこれには罠があって、大抵次のような注意書きがあります。

  • 食べる分を、凍ったまま170-180度の油で、4-5分程度油調して下さい。

考えれば分かることですが、スーパーの冷食とかと違って、ギフト用は自分で揚げる必要があります。一人暮らしだと絶望的ですし、実家だったとしても親が料理好きじゃないと嫌な顔をされること間違いなしです。食用エビフライは微妙な気持ちになる贈り物としては不適切で、主に上流階級が嫌いなやつに対して贈る贈り物なのです。

エビフライグッズ

エビフライは実は食品サンプル業界ではかなり重要な存在で[要出典]、Amazonでもハイクオリティなエビフライの食品サンプルがたくさんあります。エビフライの食品サンプルは、食べることができない代わりに、揚げる必要がないのでおかあさんに怒られるリスクが低いというメリットがあります。

ネックレス

正常な人間はただの食品サンプルを買って喜ばないので、食品サンプルの技術を転用したグッズがいろいろと売られています。例えばネックレスなんかは彼女に贈ると喜ばれそうです。

f:id:toshi_a:20161209004554j:plain

でかっ!意外にでかい。これは良いですね。大きすぎるものは良くないと書きましたが、それは業務用食塩25kgとかカラーコーンのことを言っているのであって、これくらいなら問題ありません。しかしこんなネックレスしてる女と出くわしたら相当怖いですね。グッズとしては気に入りましたが、あまりファッションには興味が無さそうに見えるので却下でしょうか。まあ、ファッションに興味のある人間こそこんなもの身につけないと思いますけど。

だきまくら

すみっコぐらし えびふらい抱きまくら MR48801

すみっコぐらし えびふらい抱きまくら MR48801

これはすみっコぐらしという優良コンテンツのキャラクターです。何が良いかと言うと、大体のやつがこれを貰ったら微妙な気持ちになる(いらんけどかわいい)という、いわばジョーカーカードの一種です。しかし彼の干し芋を見ている限り、かわいい系のグッズは刺さりそうにありません。ものが大きいというのもマイナスポイントです。同じキャラクターのグッズでペンケースもありますが、私はペンケースを持ち歩く習慣がなく、ユースケースが思いつかないためやはり却下です。

USBメモリ

食品サンプルUSBメモリですね。USBメモリなのでそれなりに喜ばれそうですが、かさばって意外と邪魔になる、エビフライが邪魔で刺さらない機器が多い、なんかアクセス速度が遅い、そもそもよく考えたらUSBメモリなんてそんなに使わないなど、使っていくうちにだんだん問題点に気づいていくという大器晩成型の贈り物です。しかし、さっきのネックレスと衣の質感を見比べると明らかに見劣りします。予算ももうちょっと出せるので、却下とします。

エビフライ系の問題

ここまで調べてエビフライは無理そうという結論になりました。まず、エビフライで検索すると大抵が食べることを想定した商品となっており、この時点で9割が脱落します。残りもファッション又は一発勝負のグッズばかりで、微妙な実用性という要件を満たせるものはありませんでした。

わいわいたがほしいもの

なんかどうでも良くなってきた頃、こんなツイートを見つけました。

どうやら食べ物が欲しいみたいです。茨の道ですが、あえて食べ物で考えてみましょうか。

相手を微妙な気持ちにさせたいのに要求を聞くのか、と思うかも知れませんが、相手のほしいものを理解した上で微妙にずれたものを贈るのが微妙な贈り物の鉄則。単に相手のほしいものをあげるだけなら誰にだってできます。本当に相手のことを考えないと微妙なものは贈れないのです。その意味で、微妙な贈り物は相手が喜ぶ贈り物より心がこもっているといえるでしょう。

自炊はイヤ?

どうやら自炊は普段しないようです。しかし、自炊において最も費用のかかる初期投資について言及していないので、どうやら食器や最低限の調理器具は持っているようです。であれば、簡単に調理できるが調理しなければいけないくらいを狙えば、微妙な気持ちになること間違いなしです。

逆に、この口ぶりからすると揚げる必要のあるエビフライなんかは絶対ダメですね。

質より量

エンゲル係数を下げたいということは、量が欲しいのでしょう。わいわいたはデブなので、よく食べるはずです。

つまり、量より質です。

米食べろ

上記の一連のツイートの中で、アルファ米についての言及を見つけました。デブのくせに、口に入ったら何でも食べ物というわけではなく、ある程度舌は肥えているようです。であれば、良さそうな米を送ってあげるのが良いのではないでしょうか。

米は食べ物ですが、保存が効きます。長期保存すると味が落ちますが、エンゲル係数を下げたいんだろ、贅沢言うな。米アレルギーというのも存在するようですが、米を炊いていることがわかるツイートがあったので、大丈夫そうです。炊飯器を持っている又は自由に使える状況にあることもほぼ確実です。

あと、突然米が送られてきたら引くんじゃないでしょうか。俺は引きます。

強いお米

良いものを見つけました。

うまい米が小分けになっていていろいろ楽しめるというものです。これは喜ばれそうです。 いや、本当にそうでしょうか。このセット、270g☓3というすっごい微妙な量です。これはエンゲル係数に貢献しないこと間違い無し!

エビフライの再来

これだけだと以外と安いので、おかずもほしいですね。 あれだけエビフライの話をしたので、エビフライの食品サンプルでもつけておきましょう。先程エビフライの問題点については散々見てきました。しかし、これがメインでないとなると話は別です。数あるエビフライの中からこれを選んだのは、次のような理由からです。

  • 実用性がない
  • 衣の質感が良い(写真で見る限り)
    • 全く実利に貢献しないクオリティ
  • 値段が米とほぼ同じ

その他テク

ギフトラッピングは必ず着けましょう。これは308円かかり、今回は二品なので倍かかります。受け取った相手からしたら「こんなことに金かけるくらいならもっとマシなもん送れや!」という気持ちになりますが、わざわざラッピングにお金をかけてくれた人にそんなことを言うわけにもいかず、グッと飲み込むしかありません。これです!この体験こそ私が送りたいものなのです!たった616円で微妙さが一気に増すので、安い取引です。

あと、私は必ずメッセージに「私はmikutterの作者です」と一言添えます。これは「私はメガネケエスの作者です」のパロディーですが、元ネタを分かって無くても脱力感を与える不思議な力がある言葉です。また、直接名乗らなくとも誰からの贈り物なのかわかるというメリットもあります。

実戦

いざ、尋常に勝負!リアクションに困れや!

そういえば随分誕生日から日数が経過しているので困惑していますね。

ギフトラッピングに困惑しています。

mikutter作っててよかったと思うことって、これができることくらいなんですよね。 あれっ?俺が微妙な気持ちになってきた

米によってエビフライがよく引き立っていますね。狙い通りです。

思ったよりまともなものじゃねえか!とリアクションに困っています。いやいや、よく見てみたまえ、まあまあ意味不明なものが今手元にあるぞ。そんなこともわからないくらい彼は混乱しているのです。

きましたーーーーーー!!!!!奇行に走り出しました!!!!!大勝利です!!!!!!!!!

被害妄想をはじめました。精神的にかなり追い詰められているようです。

これから家にいるあいだ、常にわいわいたの側には謎のエビフライがくっついていることになるでしょう。 そして、デブなので米はすぐになくなるでしょう。米の空き缶という異常な物体と微妙な大きさのエビフライを前に、彼は何を思うのでしょうか。

反省

私は満足しました。わいわいたがどう思おうが俺には関係ありません。リアクションが面白かったのと、ちゃんと俺が起きている時に実況したことは褒めてやりましょう。

ただ、これはギフトを送った翌日くらいに見た記事なのですが、

ひたすら右腕を挙げたまま仁王立ちをしていました

友人がオタクライブに行った話 〜 whywaita Advent Calendar 5日目 〜 - 上から下まで面白いことを…

わいわいたは、なんと初めて行った声優ライブでひたすら右腕を挙げたまま仁王立ちをするオタクゥらしいのです。それだったら、エビフライのペンダントのほうが良かった…。贈り物にもしもはないですが、エビフライを首から提げてひたすら右腕を挙げたまま仁王立ちをするオタクゥが爆誕したかもしれないのです。更に悪いことに、今これを書いている時点ではあのエビフライネックレスは売り切れてしまっています。もしかしたら、この世界の何処か別のわいわいたは声優ライブでエビフライを掲げて仁王立ちしているかもしれません。エビフライネックレスの使い方に困って声優ライブに着けていくわいわいたが存在したとしたら、それはどんなに素敵なことでしょう。

今回わいわいたについて初めてちゃんと調べましたが、相当な異常者だということがわかりました。きっとエビフライがマグネットだろうとネックレスだろうと、常人では思いもよらないような奇行に走ってくれるはずです。私も、もっともっと微妙なものを贈れるように精進します。

RubyKaigi 2016に行ってきた

RubyKaigi 2016が京都であるということで、行ってきました。 俺は京都に住んでいて、今回の会場の国際会館には行ったことはないけれど、会社とわりと近いので、行かない理由がない!

この記事は個人用のメモで、RubyKaigiってどんなところだろうとか、どんな内容が話されていたのか気になっている人には役に立ちません。時間を無駄にしたい人だけ読もう。

RubyKaigiとは

RubyKaigiはいいぞ

Ruby3 Typing

Matzの話。最近は静的型付け言語が流行っていて、動的型付けのRubyオワコンだよねみたいな風潮が嫌なので新しいことをしたいという話。 俺はよく知らなかったので、タイプヒンティングみたいなのが入るのかなーと思っていた。

class Duck
  def bake(Fire f) -> Coal
  end
end

class IMac < Computer
  def bake(Fire f) -> DropBox
  end
end

def ahiruyaki(Duck duck) -> Coal
  duck.bake
end

そもそもbakeメソッドを実装していればあひるでなくても焼けるのがDuck Typingで、型を固定するとIMacを焼くことができない。戻り値も共通のスーパクラスがない。

俺は「とはいえ想定しない型を渡されても困るから、表明したほうが良いのでは?」と以前は思っていて、だからmikutterでも type_strict というユーティリティメソッドがある。しかし長くメンテナンスを続けていって、いろんな機能拡張を行っていくにつれ、「type_strictさえなければ動くのに!」ということがしばしば発生してる。短期的には型を指定するのは一見悪くないんだけど、長く使うコードだと癌になるということを身をもって体験しているところだった。

とはいえ型がなければ、そもそも短期的に事故る、そこをどうするか。Rubyでは全ての値はオブジェクトで、全てが何らかのクラスのインスタンスなので、型=クラスと考えている時期が私にもありましたけれど、型というのは同じ振る舞いをする集団であって、クラスではない。IMacもDuckも、bakeできるという意味においては同じ型で、このことを踏まえればDuck Typingによってどんなクラスでも引数として受け取れるメソッドは、特定の型のオブジェクトのみを受け入れているにすぎないと言える、のかな。タイプヒンティングはクラスと型を取り違えていて、少なくともRubyにとってはあまりよい手ではなさそう。クラスを限定すると、不必要なものを要求してしまう。joinメソッドさえあればいいのに、Arrayであることを要求してしまうとか。過不足無く要求を明示できれば、安全且つ将来にわたって拡張性を担保できる。

MatzはGolangインターフェイスを取り上げて、あれはかなり上手くやっている方だと言っていた。確かにあの仕組みだと、クラスではなく型自体を明確に要求できて良い。そのGolangにMatzが「おしい!」と言っていた点は確か:

という点だったと思う。「名前を決めるのはめっちゃ大変」というのはかなり同意できて、日本語だったとしても、一言で説明できないと思うことは結構多い。今のRubyではこういう検査機構は無くて、型がほしいという人が本当に意味しているのはこういった検査機構がほしいということだと思う。型を静的に書くためには名前をつける必要がある。「絶対に型は書きたくない!」というフレーズがやたらと取り上げられているけれど、俺は「型の名前を考えたくない!」というのがその真意だと受け取った。確かにロジックは頭のなかに出来上がってるのに名前で迷ってしまって手が止まるということはよくあるので、名前を考える機会を増やさずにいくらかでもその恩恵に肖ることができるなら嬉しい。

ここからは俺の知識では正確な意味を捉えかねる部分だった。今時だと俺が使った中ではPHP Stormとかは静的にコードを解析して、かなり正確に要求される型を予測して、静的にエラーとなりそうな箇所を教えてくれる。Rubyは動的にメソッドを追加・削除することができてしまうのでこれが難しい。そんな中でもJavaScriptとかはわりと頑張ってるんだけど、動的になればなるほど静的な解析には限界があるなあと思う。

しかし何らかの方法で、あるメソッドが書き換えられてないと分かってしまえば、その部分については予想できる。完全ではないが、現代のRubyでは実行時にしかわからないエラーのうちのいくつかが、実行前にわかるのではないか。100%は無理だが、8割、5割でも分かれば、今より良いよね、という趣旨のことを言っていたのだと思う。

実行前というのはコンパイル時かというとそういうわけでもないようで、Gemとかには静的解析した結果みたいなファイルをつけておいて、そのファイルがRubyランタイムやIDEから利用できれば良さそうという言及があった。これは確かTypeScriptにそんなのがあったなーと思いながら聞いていたけれど、これは実際にはぜんぜん違うものを意図しているのかもしれない。

値というのはメモリ上のビット列に過ぎず、それがどういった値なのかを説明するのが型だったが、それはコンピュータの都合だったのでなんやかんやあって動的型が流行り、しかし最近は型推論が強くなったりマシンスペックが上がってIDEがいろいろと助けてくれるとかもあって、これからは静的型が優勝なんだなあと俺は思っていた。一方Matzはもっと長い目でこの流れを見ていて、Ruby3.0が出る頃にはまた動的型付けにボールが戻って来ているかもしれない、と言っていた。刹那の流行に流されて後追いになっていくと、本当に時代遅れの言語になっていきそう。確かに他の言語と同じことをやったのでは後追いになるので、追い越していったほうが面白くなると思う。

俺は目先のことしか見ていないんだなーということがよくわかった。Rubyがこれからどうなっていくのかわからないけれど、きっとなんかいい感じになると思いました!

dRuby

この3日間めっちゃ濃かったのでまともにまとめてたらめっちゃ時間かかってしまうので以下簡単にしか書かない。

これ標準ライブラリだったの知らんかった。Rubyなんもわからん。これ使ったらmikutterプラグインを複数プロセスで動作させられるのでは…。 フィルタは普通に今でもマルチスレッドだし、どうしても同じプロセスにロードされてないといけないプラグインっていうのもあるけど、それって依存プラグインでしょ?プラグインの定義ファイルで依存プラグイン明示してるし、静的にわかるじゃん。しかもforkするみたいな感じじゃなくて、既に起動してるmikutterにattachできるし、既にサーバから起動してるmikutterにUIだけattachして使うみたいなアホなことも頑張るだけでできるのでは…。

Ruby何もわからんなと思いました。

A proposal of new concurrency model for Ruby 3

Rubyはスレッドがない時代に生まれたのでC extensionがスレッドセーフに書かれておらず、その頃から互換性があるのでマルチスレッドで動くと破滅するという認識だったので、GVLがなくなって複数スレッドが同時に動くというのは無理なんだろうなあと思っていた。

でもRuby 3ではGuildという仕組みが導入される予定らしくて、複数スレッドが同時に動くことができるようになるらしい。 Threadは(必ず?)(ひとつの?)Guildに属して、同じGuildのThreadは同時に走らないが、違うGuildであれば並列に実行しようとすると。グローバル変数とかもGuildごとに分けるらしい。まあそうじゃないとおかしなことになるわな。 確かErlangかなんかは同じプロセスに複数のVMを持てたような気がするけど、Guildはそれに近い使い勝手になるのかな。実際の実装は知らん。でもRubyはもともとThreadのことは考慮されていなかったということは、C extensionで(Cの)グローバル変数とかstatic変数とか使ってたらあかんのでは。Cなんもわからん。

今気づいたけどこのセッション英語だったのか。その割には俺ちゃんと理解してるな(全く違う理解をしている可能性もある)。日本人の英語聞き取りやすいのでは?でも日本人となら日本語で話したほうが良いと思います。英語なんもわからん。

Unifying Fixnum and Bignum into Integer

数がFixnumになったりBignumになったりしてだるかったのでIntegerだけにするぞという話。 もともとFixnumとBignumは両方ともIntegerのサブクラス。FixnumとBignumはRuby 2.4ではIntegerを指す形で残るので、互換性あるよーという話。うああ、数という意味でFixnum使ってるコード手元にあるし…。Ruby 2.4でも普通に動くけど、Integerに直しておこう。

数値なんもわからん。

Fearlessly Refactoring Legacy Ruby

リファクタリングの話。mikutterとかは、6年前といえばユニットテストとか存在すら知らなかったし、mikutterにはテストがあんまりない。それが最近は苦痛で、PluggaloidをはじめとしたGemにはある程度テストを書いている。書いているうちに成長してきて、今はPluggaloidのテストとかマジアレだなと思ってる。つらいなあ。

このセッションのキーワードは Characterization test と Suture gem、ということでいいのかな。このセッションこそどの程度理解したか自信がないんだけど、要はリファクタリング前のコードの入力に対する出力を記録して、それがリファクタリング後とちゃんと一致することを以ってコードの意味が変わってないことを検証するというのがSutureの少なくとも一機能らしい。 Suture gemは面白くて、リファクタリング前と後を両方実行するとか、最後の方は集中力切れてて微妙なんだけど、どっちを実行するかを乱数で決めたりとかしてたような気がする。Sutureについては曖昧な感じだけどマニュアルしっかりしてるっぽいし実際に使っていったらわかりが発生するかも。

レガシーなコードにはテストがないので、リファクタリングの前にテストを書いてからリファクタリングするのが定石だと思うけど、どうせレガシーなコードはミュータブルなのでテスト書けず、まずは副作用をなくしてからテストを書きたい、しかし書き換えると言ってもそもそもテストがなくてだな…となって無限再帰に陥ってどれくらいかかるか見積もりもできない。憶えがありすぎる。mikutterお前のことだよ。2010年の俺、この記事見てるか。

リファクタリングなんもわからんけど、Sutureは手札に入れておくべきだと思いました!

How to create bindings 2016

お世話になっておりますと思いました!

GIの紹介。おお、Gtk3の実装に使われているGIっちゅうのはこうなっとったのか!と思いながら聞いていたけれど、どう使うかはわかった(つもりになった)がどうなってるかはなんもわからんかった。すごいなあ。

Learn Programming Essence from Ruby patches

俺もここ半年くらいになってようやくRubyのパッチとか読むようになったんだけど、このセッションはRubyのパッチを読んで学びを得ようと言う奴だった。 俺は、Rubyはでかいのでとりあえずパッチだけちょっと見とこうと思っていたが、パッチはその変更に関連する箇所しか出てこないし、コミットメッセージでその変更の内容や理由が説明されていていいぞっておっしゃられていて、たしかになーと思いました!

Ruby Reference Manual 2016 Autumn

るりまの話。よくお世話になる〜。mikutterに関するマニュアルとかちゃんと書きたいと思っていて、そのために役立つことがないかと思って聞いた。 本来の目的という意味では特に新たに得られたものはなかったかなという感じだったんだけど、るりまとるびまって1文字しか違うやんけとか、るりまのSEOとかいう面白いワードが出てきて個人的にはとても満足した。

あれ、なんか本当に良い話だったんだけど俺の文章スッカスカだな。日本語なんもわからん。

Modern Black Mages Fighting in the Real World

TDでFluentdの0.12→0.14で、APIがアレだった部分を修正したいけど互換性ぶっ壊れる…というところで、黒魔術を使ってうまく両立してやったぜ!という話。 mikutterでもそういうところあって、何度かおさけーさんにそのことを褒めてもらって第一話の平沢唯みたいにニヤニヤしたことがあったんだけど(アへへへへヘアへへヘ)、Fluentdはmikutterみたいな悪ふざけじゃなくてちゃんとしたものだから、ちゃんと大変な思いでちゃんと黒魔術を使っていて、すごいと思いました!

個人的には、Module#prepend確かに便利そうだけどどうやって実用するのかなんもわからんなと思っていたので、その実用例が見れて最高に盛り上がった。

It's More Fun to Compute

国際会館の最強の音響をフルに使って、Rubyでいろいろ演奏していてすごいと思いました!俺もPocket mikuでmikutterの効果音再生したりしてたけど、こちらはSonic Piを使っていました。 複数トラックを演奏するのにdrubyをさらっと使っていて、優勝かよって思いました!

Optimizing Ruby

Rubyは全然最適化されていないので、まだまだ早くなる余地があるとのこと。1+1とかも、Integer#+をオーバライドできるので単純に2に置き換えることはできない。 この話で初めてdeoptimizationという言葉を聞いた。純粋なメソッドは一旦最適化してしまって、メソッドがオーバライドされて純粋でなくなったら非最適化するというアプローチで、今まで最適化できなかった1+1のような式も思い切って最適化できるらしい。なるほど定義が変わったら戻してしまえばいいということかな? 確かにこの理屈だと、Rubyだったら無理そうだなーと思っていた最適化もできるようになりそうだし、実際かなり早くなっているらしい。Ruby3は3倍早くするとか無理じゃねと思ってたけど、目標に向かって着実に高速化を進めておられて、すごいと思いました!

まとめ

ほんと話聞いてただけなのにこの三日間は滅茶苦茶疲れて、翌日は1日寝てました。

3日というのはかなり長くも感じたし短かったような気もするし、とても充実してました。たくさんおもちゃを入荷したのでしばらくは遊べそうです。フィリスのアトリエの発売延期してつらいなあと思っていたけれど、調度良かったかも。

Rubyなんもわからんなと思いました!あと、RubyKaigiはいいぞ!

MC1.10 MOBに特定のMOBを打たせる方法

f:id:toshi_a:20160619163759p:plain

teocraftのバトルドームに出現させるモンスターを作っている時に、特定の別のモンスターを攻撃するモンスターを作成したくてハマった。要するに

  • エンティティを召喚する時にUUIDを指定するには、UUIDMost:とUUIDLeast:を使う
  • ThrownPotionとかSnowballのownerNameに"0-0-0-0-1"のような省略形は使えなくなった。ちゃんと指定する

ということになったらしい。

MOB A(ストレイ)にMOB B(豚)を打たせる

役者を召喚

ケルトンがMOBを誤射するとターゲットを変更するのを利用して、豚にポーションを投げさせる。それがストレイに当たると、ストレイは豚に対して敵対状態になる。

/summon Pig ~ ~1 ~ {CustomName:A,CustomNameVisible:1b,UUIDMost:0,UUIDLeast:1}

/summon Skeleton ~ ~1 ~ {SkeletonType:2,CustomName:B,CustomNameVisible:1,HandItems:[{id:"minecraft:bow"},{}]}

まずMOBを召喚。この時、豚のNBTタグにUUIDMost:0,UUIDLeast:1が設定してあって、召喚された時にUUIDが00000000-0000-0000-0000-000000000001になる。

弾を召喚

雪玉かポーションを召喚し、ownerNameには投げたプレイヤーの名前を書くのが普通だが、ここでは豚のUUIDを指定する。ポイントは、ここではUUIDMost:とUUIDLeast:ではなく、1.8同様UUIDを書く必要があるということ。コンバートするスクリプトとか手元に置いておくと便利かもしれん

/execute @e[name=B] ~ ~ ~ summon ThrownPotion ~ ~1 ~ {Potion:{id:"minecraft:splash_potion",Count:1,tag:{Potion:minecraft:healing}},ownerName:"00000000-0000-0000-0000-000000000001"}

これを実行するとストレイの頭に豚から投げられた治癒ポーションが出現してストレイに当たる。そうするとストレイは豚を狙い始める。1.9からポーションの書き方が変わったので若干手こずった

弾の困った問題

こういう用途には雪玉が良くて、ダメージを与えずに喧嘩を売ることができるし巻き込みもないので扱いやすい。1.10からか、なんか投げてからしばらくクールダウンタイムみたいなのが入ったようで、出現直後の雪玉に当たり判定がないっぽい。~3あたりから落としてやると当たるんだけど、Motionタグで落下速度を早めると当たらなかった。流石に自由落下させるとMOBが移動中だと回避されてしまうのでまずい。Wiki見てもそれっぽいこと書いてないようだし、今回はSplashPotionを使った。

でもSplashPotionにも問題があって、炸裂するので隣接する関係ないモンスターも同時に敵対してしまうことと、実際にダメージを与えないと敵対しないというのがある。ダメージを与えないと、というのは結構意外だった。1.9から追加されたエフェクトなしのスプラッシュポーションなどを当てても敵対しない。また、ストレイのようなアンデッドにダメージポーションを投げても(回復するので)敵対しない。slownessのポーションは状態異常にはなるが、ダメージがないからか敵対しない。毒が有効なMOBに変えてpoisonを投げてもだめだった(ポーションに因るダメージじゃなくて、状態異常に因るダメージだからか)。そういうわけでストレイにはhealingが有効だった。

とりあえず、あしゅりーをバトルドームに出現させて何故かモンスターにリンチされているというギミックは作れるっぽい

参考

Advanced Commands Tutorial: Controlling Mobs Using Custom UUID Targets - YouTube

www.minecraftforum.net

www.minecraftforum.net

30秒で通勤する方法

30秒で八王子から東京まで通勤するゲーム。無理に決まってるけど意外と頑張れば手が届きそうなんだよなこれ。電車の中で走れば早くつくぞ。あほか。

 

ゲーム開始時は寝てる

社内を走ってる。走るのは自動で、フリックでレーンチェンジできる。3レーンあって、人を吹き飛ばしながら進んでいくのだが…

デブに当たると加速が止まる。しかもデブは2レーン消費しているから避けるのが大変。痩せろ。

女性専用車両は難関。痴漢冤罪をかけられまくって全く進めない。ふっ飛ばして進んでいる人間に痴漢というのは適切なのか。こいつも2レーン使っている。

LINEでさくっとクビになった。

説明するまでもない完璧なバカゲー。Unity 3Dに謝れ。2016年最高の滑り出しといっても言い過ぎではない。こういうのを求めていた。

アクション要素があるので難しく感じるが、何故かプレイするたびに強化ポイントが溜まっていって性能をアップグレードできるので、やってりゃそのうちクリアできるようになりそう。俺は立川までしかいけなかった。ガルパンでも見て帰るか。

中央線の駅を覚えられる効能があるという謳い文句だが、無理。

怒りゲージがMAXになると、一定時間自転車に乗り始める。その間は痴漢女やデブを吹き飛ばせる。自転車で女性専用車両を駆け抜ける快感は、これをプレイした人間にしか味わえない。iOS/Android両対応なので、是非遊ぶべき。

禅とから揚げ釣りと私

唐揚げを釣るゲームがリリースされた。意味不明すぎてダウンロード不可避

釣る(箸)

意外とシビアだな。

初めて釣れた唐揚げ。嬉しい。

何回か釣っていたらわりとでかいのが釣れた。

 

ゲームとしてはとても単純でわかりやすいが、なんかやればやるほど、俺はこんなことをしていて良いのかと邪念が湧いてくる。禅とはなんだったのか。

マイクラプレイヤーならマイクラで釣りをしたほうがメリットが大きい。唐揚げは釣れないが、釣り竿が釣れるので、無限に釣りができる。でも取引してくれる村人を養殖したほうが効率が良い、取引すれば同じものがいくらでも手に入るので。

 

釣りは向かないっぽい(これは釣りなのだろうか)