開発環境がLinuxに戻ってそれなりにこなれてきたので現在の環境について書く

Macを捨ててThinkpadGentooを入れて開発環境としてから2ヶ月が過ぎた。
世の中にはMacから離れようとしてThinkpadを買ったら、矢印キーボード押しにくいとかタッチパッドがクソなので、Macに戻っていった人も居るみたいですが、私としては至極快適に過ごしております。
そもそもThinkpadタッチパッドは基本無効化するものなのでどうでもいい。まあそのスペース邪魔なんだよ、とは思いますがw
Wi-Fiの無効化キーを誤爆するという危険があるらしいが、Gentooだと頑張って設定しないとそういう特殊なキーはそもそも動かないので、そんな危険もなく安全ですね。
Gentoo入れてタッチパッドを無効化すれば、Windows10というOSも使わなくていいし、全て解決するんではないでしょうか。


前置きはこのぐらいにして、色々と使うものが安定してきたので今の環境について書いていきます。

デスクトップ環境

Gentooportageというパッケージ管理システムがよく壊れるというか、依存関係が複雑なパッケージ入れてるとバージョンアップのタイミングでコンフリクトしたりする。
なので、依存関係の複雑になりがちなGUI周りのコンポーネントはできるだけ入れたくない。
というわけで、GTKベースにしつつGNOMEKDEとかいう重厚なデスクトップ環境を丸ごと入れるということはせずに、Awesomeというタイル型ウインドウマネージャーを直接起動している。
PCが起動すると、コンソールのログイン画面が出て、ログイン後にコマンドでGUIを起動するようにしている。xinitrcに"exec awesome"と書いてstartxを実行する。
おかげでめっちゃ軽い。起動直後のメモリ消費は200MB程で済む。

ランチャー

AlbertというAlfredもどきがあったのでランチャーとして使っている。
元々Alfredの高度な機能はほとんど使ってなかったので、アプリの起動さえ出来れば特に困らなかった。
Gentooにはパッケージもあったので簡単に入って便利。

ターミナル

mltermを使っている。
24bitのtrue colorが表示できて、sixelが使えるから使っているのだが、正直そこまで軽量とは感じないので、もうちょっと軽いターミナルを探している。
mltermの良い所は依存コンポーネントが少ないところ。gnome-terminalとかkonsoleとかは依存が多過ぎてもっての外だ。
urxvtが24bit表示できれば良かったのだが……。

クリップボード管理

parcelliteを使っている。
システムトレイに常駐できるし、基本的な機能があって、これも依存が少なかったので採用した。

開発環境

最近はneovimとdockerがあれば大体何とかなる。ホストOS側に色々と入れるとportageが壊れやすくなるので、できるだけdocker内に封じ込める様にしている。
コンテナ内で操作することも色々あるのでストレスなく操作できる様に、自分のzshrcとかpecoとかを突っ込んで"docker exec"を実行できる簡単なラッパースクリプトを書いている。

Twitterクライアント

TweetDeckがメイン。普通にChromiumで表示している。たまにmikutterを使うこともある。

チャット

仕事ではSlackを使っていて、Gentooにはパッケージがあったのでそれをそのまま入れて使っている。

音楽再生

wine上でfoobar2000を動かして使っている。というか未だにこれより便利な音楽プレーヤーが無いのってどうなんだ。10年前から何も変わってないぞw
自分の持ってたUSBのDAC兼ヘッドホンアンプは普通に使えたので、wine経由してWASAPIで再生している。96kもちゃんと出た。
問題は、iTunesレーティングが同期しないことで、iPhoneを使っている身としてはちょっと辛い点が増えた。

動画再生

mpvが軽くて良い。
しかし、自分のT460sは一応GeForceを積んでいるのだが、今のところLinuxでこういうノート用の追加3DコントローラーでVDPAUを上手く使う方法が無い。
色々調べたのだがかなり厳しそうだ。
DRI2で動かせば、可能性ありそうな気がするんだが、良く分からなかった。
なので、GPUは上手く活用できていない。

ファイラー

とりあえずspacefmとvimfilerを併用して使っている。
これも依存が少ないから採用した。nautilusとかGNOMEが入ってしまうので駄目だ。
その外のファイラーも大体デスクトップ環境とセットで入ってしまって辛かった。

Wi-Fi接続とbluetooth接続

それぞれコマンドでやっている。
Wi-Fiはiwコマンドかiwconfigコマンドで電源を操作して、wpa_supplicantを起動しておけば勝手に繋がった。
接続設定とかパスフレーズはwpa_passphraseコマンドの実行結果を/etc/wpa_supplicant/wpa_supplicant-.confに書いておく
bluetoothは、bluetoothctlというコマンドを使ってconnectしている。しかしBluetooth4.0規格のマウスが上手く繋がらないとか時々ハマる。
ヘッドセットとかイヤホンの類はまだ試してない。

パスワード管理

1passwordのWeb版をお試し中。wine使ってWindows版を入れるかどうかも検討しているが、まだ決めてない。

電子書籍とか画像ビューワー

KindleはwineでWindows版入れたら普通に使えた。
画像系はmcomixというビューワーでzipとかrarの中身も見れるのでこれを使っている。
PDFとかePubはあんまり良いビューワーが見つかってない。ePubFBReaderというのを使ってるが正直微妙。

マルチディスプレイ

最近は、EDIDの情報がちゃんと取れれば普通にディスプレイを認識するので、"xrandr"コマンドでディスプレイ表示を切り替えれば、大体上手く動作する。
ただ、接続チェックはちゃんとした方が良い。

まとめ

全体的な感覚としては、Macより2倍は動作が軽い。
特にタイル型ウインドウマネージャー派としては、Mac上で無理矢理やってるのとは全く反応速度が違う。久々の感覚だが、やはりこうであって欲しい。
Dockerを開発に使う上でも、変なハマりどころとかパフォーマンス上の問題が発生しないのでめっちゃ快適だった。
そもそもコンテナは起動が速いとか言ってるけど、Macだと結局VM噛んでるから別に早くないし、むしろストレージに問題ありまくりでめっちゃ辛かった。
開発機として使うなら、やはりLinuxの方が良い。iOS開発者はどうしようもないけど……。
最近のLinuxは蓋を閉めたらちゃんとスリープできるので、バッテリー問題も困ることはそんなに無い。
まあ、稀に復帰できないことはあるんだけど、そもそもMacでも時々復帰しないし。
CPUがあんまり高クロックで動作しない様に上限かければ6時間は電池が持つ。


というわけで、今のMacが気に入らないなら、そろそろMacから離れる好機かもしれない。
宗教上の理由でLenovoのPCを使いたくない、という人も居るかもしれないし、別にThinkpadを進めるわけではないけど……。


2/3 15:00 追記
はてブコメントで、資料作成とOfficeどうしてるんだろう?というものがチラホラあったので追記しました。

資料作成について

資料は、よっぽどビジュアルに凝ったものを作る場合を除いてmarkdownで書いてreveal.jsで表示する形にしている。
Mac使ってた時も最近の時期はそうだった。
ビジュアルが必要なかっちりした発表の時は、仕方ないのでMacを引っ張り出してきてkeynote使うかもしれない。

Officeについて

一応、必要になったらlibreofficeを入れようと思っているが、ここ3年でプレゼンテーション資料以外の用途でOfficeっぽいものが必要になったことはない。
基本的にはGoogle DocsGoogle Spreadsheetで対処している。
そもそもMacにもOffice自体は入ってなかった。あのKeyNoteの付属品みたいなものは、あんま役に立たないし……。
謎マクロが大量に入ったExcelがやってきたら詰むけど、元々の状況に変化は無いw

MacBook Proを捨ててThinkpad T460sを買ってgentooを入れた

英字キーボード配列にできて開発ユースに耐えうるノートPCがとても選択し辛い昨今、なんとなく安牌ポジションだったMBPについにさよならしました。
元々、Macを好んで使っていたというより、解像度が高くて英字配列にできて電池の持ちが良いというノートPCがMBPだっただけで使ってたのですが。

一番大きな要因がコンテナの利用頻度が増えて開発環境も含めてDockerを使う様になったので、Macだとどうにも面倒だという点です。
docker-machineのデフォルトとかdocker for Macのデフォルトが遅過ぎて話にならないし、dinghy使ってもdocker-sync使っても微妙でかつ面倒くさい。
普通にLinux上で直接動かせるなら、無駄な苦労だと思って、まず開発用PCをLinuxにしようと決めました。
そしたら新しいMBPが30万越えるのに、一世代前のCPUとメモリでドヤ顔してくるわ、キーボードがペラッペラの気に食わない形になったので、買う気が失せたのを機にMBPを買うのを止めた次第です。
(Touchbarはどうでもいい)
まあ、昨今Thinkpadレノボ化してからあんまりいい話聞かないので悩みはしましたが。

T460sスペック

  • CPU: skylakeのi7-6600U (これは残念)
  • メモリ: DDR4 24GB
  • ディスプレイ解像度: 2560x1440
  • ストレージ: NVMe 1TB

基本部分はざっくりこんな感じ

MBP 2016との比較としては、

  • CPUは同等
  • メモリは多いし早い
  • ストレージの上限はMacの方が多い
  • ディスプレイの解像度はMacが買ってるが、非光沢なのは良い (というか3年以上前からあの解像度のMacがヤバイ)
  • キーボードはMacより良い (トラックポインタ付いてるし)
  • TouchpadはMBPの方が精度良いと思う
  • 重さは13インチとほぼ同じ
  • ベゼルが180度まで開く
  • 普通のUSB3.0端子がある
  • 10万近く安い
  • ドック追加しても数万円安い
  • ESCキーとかFnキーがある!(どうせHHKB使うけど)

自分は、3年前のMBPからの移行だったのでかなりスペックが上がったし、やっと4kディスプレイが60hzで出せるようになってちゃんと使えるようになったのが嬉しい。
MBPと比べてでかいのは、普通のUSB端子があるのでケーブル買い替えなくていいし、無駄なアダプタケーブル持ち歩かずに今まで通りで良くて楽。
ディスプレイに関しては、3年以上前にRetina出してた当時のMBPは今思えば異常だった気がする。あの時はテンション上がったのになあ……。今は細いバーでDJ出来るぜーとか言っててもうなんか……。えー、それ?って感じである。

使用感におけるMacとの比較

OSはgentoo linuxを入れて使っている。archと悩んだがそれなりにgentoo党なので慣れてる方にした。
久々にインストールバトルしたから、ハマりまくって辛かったが……。

gentooにして余計なものを結構削ぎ落とした構成にしたので、GUIを起動しても起動した辞典でメモリ消費量は350MB程で、24GBメモリ積んでるので、これなら相当富豪的に使っても無くなったりしないだろう。
dockerがめっちゃサクサク使えるし速い!やっぱMacOSはこの辺り辛い。
全体的にクソ早くなった。自分のMacが大分色々と肥大化してて無駄なものが動いてたってのもあるが、このサクサク感は嬉しい。
キーリピートとかキーレイアウトは普通に変えられるが、KarabinerがSierraでも元の機能レベルで動く様になったならあっちの方が多機能で良い。あそこまで簡単にレイアウト変えるのはLinuxだとちょっと辛い。
homebrewは何だかんだで良くできてて楽。バイナリパッケージとコンパイルを適度に組み合わせられるのが良かった。
この辺りはgentooを使ってるので色々と時間がかかる。まあ、そこが大事な人はarchを使えば良いと思う。
後は、どうせvimでコード書いて端末で動かすので開発環境的には大して変わらない。

今は、ファイラーどうしようか悩んでる所なのでFinderとの差は良く分からん。Finderサムネイルがサクっと確認できてリサイズも簡単だからそこは強力だと思う。

全体としては、開発環境としてはやっぱLinuxの方がどう考えてもサクサク感が高い。ちょっぱやである。

一つ大きな問題があって、今まで1passwordに超依存した生活になっていて、これをどう移行するか目処が立ってないところである。
もう良く使うものはFirefoxにマスターパスワード付きで保管して、他の特殊なものはiPhoneの1passwordから参照する、という手段で大体の利用側は何とかなる。
問題は登録だがこっちは良いソリューションが無い……。

gentoo苦労話

そんな苦労するぐらいなら使うなって突っ込みもあるかと思いますが、苦労するだけの見返りはあるのでgentooを使ってます。とはいえ色々ハマったのでまとめておきます。
ちなみにgentooを使ってて嬉しいのはパッケージ管理でライセンス上きついものも普通に管理できるし、コンパイルオプションレベルで必要なもの取捨選択できて、色んなものをマニュアルで設定する訓練が積めるのでLinuxの事が良く分かる、とかそんな所ですね。
ここからは、gentooの設定の流れをつらつらと書いてるだけなので、興味無い人は続きは読まなくて大丈夫ですw


まず、インストールする時、GentooのLiveDVDが普通に動作するので、変にハマらなければそんなに苦労は無い見込みだった。(結果ハマったけど)
lspciとかdmesg見ながらカーネルに組込むドライバをぽちぽちとやる。コンパイルまでは問題無かった。
しかしUEFIのノートPCにLinuxをまともに入れるのはこれが初だったので、UEFIについての知識が無くgrubのインストールで調べものをする。
で、元々Windowsに使われてたブート領域に相乗りすることにし、efibootmgrを使ってgrubの起動処理を書き込もうとしたのだが、なんかefibootmgrがバグってたのか俺のchrootのやり方が悪かったのか分からんのだが、chroot環境の中でgrubefiバイナリのパスを指定すると、HDDのタイプとかUUIDが全部0で埋まってしまうという訳の分からん状態になった。
エラーメッセージも何も出なくて成功した様に終了したので、最初それに気付かなくてgrubが動かねええええ!って唸ってた。

1時間ちょっとぐらい悩んで0埋めされてておかしいことに気付いて、色々ググった結果同じ症状が出てた人を発見。なんかバージョン上げると解決する、みたいな話があったのでchrootの外に出て、efibootmgrをunmaskして新しいバージョンを取ってきたら、無事にEFIの設定を書き込めた。
これでgrubが起動できるようになった。

その後、カーネルが動かなかったのだが、これはframe buffer consoleのサポートを有効にしてないという凡ミスで、大分時間を浪費した。久々過ぎて忘れてた。
一回、カーネルを入れた後で、Arch LinuxwikiによるとACPIとかサスペンド回りでバグがあるらしいんで、カーネルをunmaskして4.8.9まで上げる。

後、dockerとかKVMで必要になりそうなカーネルコンフィグを組み込んでいく。
wifiはドライバはあるけどファームウェアは組み込んでおくか、どっかに用意しとく必要があるっぽかったので、wireless-wikiからfirmwareを落としてきて、Gentoowikiを見ながらカーネルに組み込んだ。
無事認識できて良かった。

これで初期インストールは完了。


とりあえずインターネットに繋がらないと何もできないが、dhcpcdを入れて有線で繋げばすぐに繋がったので、しばらくそれで作業した。繋げばDHCPからIP取れるのありがたい。
wifiはArch LinuxWikiを見ながらsystemdからwpa_supplicantが起動できるように設定をして、パスフレーズを設定ファイルに書いたら勝手に繋がった。最近のLinuxはすげー楽で焦った。


ウインドウマネージャは前Awesomeを使っていて挙動も好みだったので、Awesomeを使うことにする。
最初gnomeをベースにしようかと思っていたが、余計なもの入れて時間かかるのもなーって感じだったので単体で突っ込んで、xinitrcから直接起動することにした。
なんかこれで問題無く動くし、起動時にstartxするぐらい大した手間でもないので、もうディスプレイマネージャーもデスクトップ環境全体も必要無いやと判断して、このまま運用しようと思っている。
おかげで、起動した時点での消費メモリは350MBぐらいで、異常に軽量になった。
この時点で、開発に使うだけなら使えなくはないぐらいにはなったけど、まあ流石にまだちょっと辛い。


次は音を出せるようにする。これはArch Linuxwikiを見つつpulseaudioを入れたらすぐに認識した。最近はデバイスドライバさえちゃんと入ってれば、ほとんど勝手に認識するから素晴らしい。まあここで認識してくれてなかったら大分辛いところだったが……。
音量の調節は最初コマンドでやってたが、流石に辛いのでvolumeiconとpavucontrolをインストールした。volumeiconのおかげでキーボードのVolUpとVolDownキーが効く様になったが、ちょっとイマイチなので今後直す。


サスペンドがまともに動かんのはノートPCだと結構辛いので、ACPIのwikiを見つつacpidを入れたら、初期設定で普通に動作した。蓋を開け閉めした時も勝手に動くので驚いた。一応ちゃんとカーネルコンフィグは事前に準備しておいたのだが、最近は普通に動くんだなーと思った。


ちなみにカメラもドライバを組み込んでおいたら勝手に認識して動作した。ビデオチャットサービスに繋いだら普通に使えて良かった。


こんな感じで大体仕事で使えるようになったのだが、自宅のPCレイアウト変えたり仕事の合間に調べものしながら作業してたりで、結局5日ぐらいかかってしまった。
まあ、おかげで現在は結構快適です。ibus-skkでスティッキーシフトができないことを除けば……。

やっぱ、MacOSより開発用としてはLinuxの方が良いし、個人的にもこっちの方が好きだ。
このタイミングで捨てて正解だったような気がする。
今更移行するに移行できない1passwordとiTunesというものがあって、この辺りをどうするかは未だに目処が立ってないんで、当分の間自宅からMacが無くなることはないけど。

今更だがISUCON本戦の感想と反省

もう2週間ぐらい経ってしまったが、tagomoris & tnmtとチームを組んでISUCON本戦に出場してきた感想を書こうと思う。
中々ブログ書いてる暇が無くて、えらく遅くなってしまった。
ちなみに結果は6位。3位以下は割と団子状態で、後一手ぐらい刺さってれば3位は行けただろうなあと、残念な思いがある。
まあ、どっちにしろ1位はちょっと難しかった。


細かい流れはモリスさんのブログに既に書かれているので、そちらに譲る。


今回のお題はdockerがバリバリ活用されていたのと、SSE + Reactによるサーバーサイドレンダリングの組み合わせという非常にモダンな構成だった。
お題の発表後は、流石にうわー……マジかーって感じになった。
そもそも、現時点のRubyのWebフレームワークというものはSSEの様なストリーム配信と余り相性が良くない。
なので、あんまり使わないし、最適化のノウハウも溜まってない。辛い。


dockerに関しては、仕事でバリバリ使ってたので余り問題にならなかった。自分がdocker周りの環境整備を引き受けて、諸々の調整をしてたしログの確認もそんなに問題無く実現できたと思う。仕事で使ってて良かった。
なので、多くのチームがdockerを剥がしにかかってたけど、うちは最後までdockerを使ってた。これは良い点もあったが、もしかしたら悪い点もあったかもしれない。
良い点は、動作確認がめっちゃ楽だったこと。これは予選で動作確認が辛かった反省を活かせたと思う。実装の修正がとても楽だった。そして、プロセスの数の調整とかredisの追加とかも割と簡単にできたこと。これはdockerに慣れてないと手間取る可能性はあったが、上手く対応できて良かった。
悪い点は、もしかしたら有意なレベルでオーバーヘッドがあったかもしれないこと。自分の感覚ではそこまでスコアに影響するレベルじゃなかったとは思っているのだが……。


今回は、redisの投入周りやdocker周りの処理を大体引き受けて、まあまあ役には立てたと思う。
大きな反省点としては、やはりSSEとサーバーサイドレンダリングの知見が足りなかったので、ちょっとした変更で改善できそうな点を見過ごしてしまってたところがある。
後はやる事に手一杯過ぎてベンチマーカーのログをちゃんと確認するのに意識が回らなかった。この辺りISUCON経験の無さが出た気がする。


最も失策だったのは、nodeで書かれたサーバーサイドReactに手を入れなかったこと。かなりCPU食ってたのは分かってたんだが、ここ弄って勝てるならnode選択が有利過ぎるんじゃないのか、と思ってしまって結局手を入れることができなかった。
割と普通のWebアプリケーションとしてチューニングできるところはある程度処理できたはずなので、ここのキャッシュが上手く出来てればベースのスコア水準は割と高い方だったんじゃないだろうか。無念である。
ISUCON本戦は複数台構成になることもあって、やれる事の範囲が滅茶苦茶多くなるので、時間内に上手く最善手を見つけてその手を打ち切れた所が勝つって感じだと思うが、うちのチームはそれがやれなかった。


チームとしては、やはり皆経験豊富だしめっちゃやりやすい感じだった。会社バラバラでチーム組んでる中ではかなり良いチームだったと思う。
しかし、モリスさんが最近ミドルウェアばっか書いてる様に、俺もあんまり普通のWebアプリケーション書いてないというかデータフローの設計とか分析基盤依りの仕事ばっかしてるので、ちょっと勘が失われている所があったかもしれないw
何にせよ、優勝は逃したものの初出場で本戦で勝負になるスコアが残せたのは、優れたチームメイトのおかげであることは間違いない。
負けたのは残念だったけど、とても楽しい1日だった。
モリスさん、tnmtさんと、ISUCON運営メンバーの皆様、ありがとうございました。

ISUCON初出場と予選通過

少し前にtagomorisさんと飲んでたらISUCON出ようぜーって誘われたので、一緒に出ることになりました。
メンバーは、私(joker1007)、tagomoris, tnmtの3人。

今までの職場で一緒にISUCON出ようって感じの人が周りに居なかったので、今回何気に初参加だったのでえらい緊張してました。
特にモリスさんはISUCON無敗神話を持ってたので、足引っぱらないか不安でしたね。
前日に素振りした感じでは、Webアプリとして真っ当にチューニングしてスコア出せる感じなら大体いけるやろーと思ってたんですが、当日のあの問題の感じでは割と焦りまくりでした。

やった事は大体以下の様な感じ。

  • isutarを統合する (不要なマイクロサービスは殺すべし)
  • keywordリストを全部redisに乗っける
  • 瞬間的に各keywordに大量のアクセスが来てunicornが詰まるのでpumaに変える (loginとかのPOSTが詰まると減点がでかい)
  • nginxで静的なファイルの配信をしてクライアント側にキャッシュさせる

この辺りで、大体5000ぐらい。
周りが既に数万とか越えてて、これはいよいよアカンかなあと思ってました。
大体15時前ぐらいまでこんな感じで、俺達は駄目だ〜〜……という雰囲気ですげー辛かったです。
(後で知った感じだと、Rubyでやったチームは割と皆この辺まで辛そうだったみたいですが)
その後で、モリスさんがhtmlifyした結果を事前にrenderしてDBに全部保持するようにしたら50000越えて一気に10倍になりました。
この辺りでテンション上がってやる気が復活してきたw
後は以下の様なことに時間を費しました。

  • キーワードが新しく追加された時だけ、それを含むドキュメントをexpireする
  • トップページのHTMLをredisに突っ込む

これで大体10万から12万ぐらいになりました。
ただ、リンクが無いよというエラーがめっちゃ大量に出て辛く、キャッシュではそれをどうしても消し切れなかった。
ここで時間食い過ぎて、もうちょっと改善する余地があってもトライしきれなかった。
正直、エラー表示を気にし過ぎたのが失点だったと思います。無視して突っ走ればもうちょっと時間が取れた。
多分、pumaのワーカー数を上げるとかすればもうちょっとスコア伸びてたはずで、ちゃんとベンチの結果を得られてなかったのが残念でした。
最後の最後で、エラー消し切れてないけどスコアは出てるからこれでエンキュー。
これは落ちたなーと思って「人権をロストした」とかツイートしながらヤケ酒を飲みにいきました。
特に最後トップページのキャッシュを実装してたのが私だったので、時間内にやり切れなかった感じで、本当しくじったなーと思ってました。
途中から何となく思ってて終わってからモリスさんに、JRubyに変えてシングルプロセスでメモリ上に全部積んでスレッド立てまくれば実は結構スコア伸びたんじゃ、という話をしたら早く言ってくださいよー!って言われたw
そんな感じで店を探してる途中で、予選通過の案内を確認してその場でハイタッチしてヤケ酒から祝杯へチェンジすることになりました。



名立たるISUCONの猛者達が次々と爆死する中予選突破出来たのはとても嬉しいです。
モリスさんの無敗神話が継続できたのでチームメンバーとしてとてもホッとしました。


今回は私がRailsの基盤周りとnginxのちょっとした修正、後はモリスさんと相談して分担しつつ重いところを直すって感じで、インフラ方面をtnmtさんに見てもらってました。
インフラ方面の設定を任せてたらいい感じに準備しておいてくれるのにとても助かりました。後ログの情報を取っておいてもらったり、再起動のスクリプト用意してもらったり。
モリスさんには流石にISUCON慣れしていて段取りがとてもスムーズだったのにも、とても助けられました。


どうも参加者のツイートなりブログなりを見る感じだと、10万辺りで割と団子だったっぽく、ベンチマークのスコアのブレが結構大きかったこともあって、本当に運が良かっただけっぽいなあという気もしてますが、せっかく本戦出場できる機会を得たので、本戦ではしっかりと結果出していきたいなあと思います。


初参加でめっちゃ疲れましたが、とても楽しかった。そして予選突破できて本当良かったです。

CTOとしてデビューすることになりました

近況報告、というかタイトル通りなのですが、CTOとしてデビューすることになりました。
7月から、最近お世話になってたReproという所のCTOという肩書を得ました。
自営業の個人事業主からいきなりCTOですよw
まあ、CTOといっても、そこのフェーズ次第でやることってのは色々と変わってくると思います。
私の当面のミッションは、中長期的なアーキテクチャの方針決定とそれを実際に形にすること。
そしてリクルーティング、つまり転職斡旋おじさん業です。
なので、責任とコミットする割合が増えるだけで、そんなに今までとやってることは変わらないと思う……多分。


まさか自分がCTOになるとは全然思ってなかったんですが、30歳も越えたし肩書きと共に仕事するのも新しい挑戦としては良いかと思いました。
後は、収入ラインとかIT健保の任意継続が切れた後の社会保障の確保ですかね……。まあ、金は大事ですよね。
他にも色々と仕事してみたい所とか一杯あったんですが、自分の体が二つ無いのが悲しい所です。影分身が欲しい……。


転職斡旋おじさんとしても活動しなければならんので、「なんか新しい環境で仕事したい」と思ってる人が居たらですね、匂わせてくれると寿司とか日本酒ぐらいごちそうできるかもしれません。
特に機能追加に追従しつつRailsコードのリファクタリングとアップデートができる人とかインフラ見れる人とかが足らんので、業務委託も含めて人を探しております。
他にもハイスループットでデータを処理できるアーキテクチャが組める人とか。
まあ、そんな簡単にホイホイと雇える程でかいところではないのですが。


コード的なアウトプットのペースが下がらないかとか、自分を売り込むのは慣れてるけど人を雇うのは慣れてないとか、色々と不安も一杯ありますが、何とか頑張っていこうと思います。
CTOの先輩とか採用活動の先輩の皆様方におかれましては、色々と参考にさせていただきたいので、勉強会やらコミュニティで会ったらお話聞かせてください。


一応、例のリスト。
(最近入れたものが、もう無くなってしまってたので休止中。)

これから忘年会を迎える諸君らに伝えたいオススメの日本酒45選

そろそろ忘年会シーズンですね。年末の飲酒予定がちらほらと埋まってきている頃だと思います。
というわけで、日本酒を飲んだ経験ならRubyist界の中でもトップクラスと勝手に自負しているこのjoker1007が、年末に向けてオススメの日本酒を紹介したいと思います。
居酒屋で日本酒を選ぶ時や、酒屋で買って宅飲みする時の参考にしていただけると幸いです。
ちなみに、書いてる内容は私の主観であって明確な根拠があるわけじゃありません。
私の味覚が適当な場合もあるし、同じ銘柄でも作り方によってはかなり違った味わいになるし、年によっても味は結構変わりますので最終的には勘に頼ってくださいw

鉄板

まず、ここ最近の俺的鉄板銘柄をいくつか。自分が旨味のしっかりした銘柄の純米吟醸が好きなので、その辺りで美味しい所が多いです。

東洋美人 (山口県)

少し前に大規模な水害に遭って蔵元がかなりの被害を受けましたが、その後復活してから非常に良い酒を連発していて本当素晴らしいなと思います。
最近飲んだ原点からの一歩として作られた「IPPO」も美味かった。

宝剣 (広島県)

ほうけんと読みます。
超辛純米、純米吟醸純米大吟醸、様々なラインナップで外れ無しです。
超辛純米はめちゃめちゃコスパの良い日本酒なのですっきりとした辛口が好きな人にはオススメできると思います。
以前TokyuRuby会議に持ち込んだ「純米吟醸 山田錦」は単品の人気投票としてトップを獲得した逸品です。

津島屋 (岐阜県)

旨味のある味わい深い酒が多い印象です。山田錦系の酒が美味い。
「外伝」というシリーズ(?)があるんですが、やばい美味さでした。
ただ外伝は中々手に入らないか……。普通の津島屋もめっちゃ美味いので是非。

勝駒 (富山県)

かちこまと読みます。
数が余り出ないので、中々見かけないのだが、もし見かけたら飲んでおきたいお酒。
個人的なおすすめは「純米吟醸」。
昔は生もあったように思うけど、最近は火入れしか出してないのかな。

メジャーなとこ

続いて割とメジャーだと思っているお酒を紹介。

醸し人九平次 (愛知県)

関東だと割と良く見る銘柄。多分、東京駅でも割と良いのが買える。
きれい目の味だがバランスの良い旨味があると思う。ただコスパがそんなに良くない印象。
純米大吟醸 別誂」が香り良く美味いのだが、かなり高いです。
ものによってはかなりワインに近い味です。

梵 (福井県)

割と甘めのフルーティな味のものが多いように思います。
良く飲むのは「艶 純米大吟醸」。
置いてる所には安定してあったりするので、見つけたら試してみると良いかもしれません。

而今 (三重県)

メジャーなので、入手しづらいのが難点。
後、味に幅があって割と好みの当たり外れがある気がします。
個人的には山田錦を使ったものが一番良いと思います。

新政 (秋田県)

最近、急にメジャーになってきた気がする。
かなり甘口のお酒が多い。日本酒初心者にも勧めやすいし、割とあちこちで飲めるのでここから入るのは良いかも。

その他のオススメラインナップ

その他、これは良い!と思ってる酒をまとめて紹介します。

東一 (佐賀県)

あずまいちと読みます。
どっしりした味わい深いお酒が美味いところだと思います。
濃い目のつまみと合わせてじっくり飲みたいお酒。

作 (三重県)

ざくと読みます。
某MSを連想させますが、ちゃんとプロトタイプ-Hとかそれっぽい名前のバリエーションが付けられていて期待を裏切らないお酒です。
どっしり目の重めのお酒から旨口系のお酒の印象があります。
料理と合わせても負けない味です。

紀土 KID (和歌山県)

キッドと読みます。かなりコスパの良いお酒です。
純米、純米吟醸ぐらいなら一升瓶でも2,3000円ぐらいだったと思う。
しかし、味はしっかり美味い。

風の森 (奈良県)

私の地元の奈良県のお酒です。今の所、奈良のお酒では一番好きかもしれない。
旨味の強い系のお酒で、中でも笊籬採り(いかきどり)という独自の技法を使ったシリーズがとても美味い。

タクシードライバー (岩手県)

比較的最近知ったお酒。日本酒らしからぬ変な名前と、B級映画のポスターみたいな謎なラベルで怪しさが凄いんですが、これが美味いから驚かされる。
きれい系に媚びない、しっかりした味わいと酸味のあるお酒です。

来福 (茨城県)

甘口で香り良い日本酒としてオススメできるお酒です。
特に愛山という米を使った純米吟醸が好みで何度か飲んでいます。

仙禽 (栃木県)

せんきんと読みます。
かなり独特の味わいで、やたらフルーティです。酸味もかなり強い。知らずに飲むと日本酒と分からないかもしれません。

遊穂 (石川県)

酸味と旨味のバランスが良いお酒。秋前に「山おろし 純米」と秋刀魚で飲んだのですが、とても美味かった。

会津娘 (福島県)

めっちゃバランスの良いお酒です。山田錦純米吟醸は最高に美味かった。

七本槍 (滋賀県)

宝剣と並んで辛口が美味いお酒です。
辛口の切れ味がありながら旨味もちゃんとあるのが七本槍の良い所です。

王祿 (島根県)

おうろくと読みます。
辛口から旨み系、酸味もしっかり系まで色々とバリエーションがありますが、最近どうも甘口に寄ってる気もする。
個人的には純米吟醸か超辛純米がおすすめです。
熟成された数年前の純米吟醸とかは死ぬ程美味いのですが、ちょっと手に入らないですね……。

十旭日 (島根県)

じゅうじあさひと読みます。王祿と同じく島根のお酒です。
こちらはどっしりとした重量感のある旨味が特徴です。
濃い目の料理にも負けない味わいです。

段々書くのが疲れてきた

ここからは、飲んだことあってオススメできるものをひたすら書いていきます。味はググったりして想像してくださいw


というわけで、オススメの日本酒45種類(多分)紹介しました。
ちなみに、後半羅列してるものは、本当に単に書くのが疲れてキリが無くなってきたからで、ちゃんとコメント書いてるものにも全然劣らない美味い酒です。
記憶と過去に撮った写真から思い出して書いてるので、普通に書き忘れも色々あると思うので、思い出したり増えたりしたら、またいつか書きます。
とりあえず、これだけの銘柄を頭に叩き込んでおけば、割と良い日本酒生活が出来るはずです。
日本酒はワインやウイスキーに比べて大分安いので、良い地酒を扱ってる酒屋を見つけて買いにいくととても安く良いお酒が飲めます。
3000円も出せば、かなり良い一升瓶が買えて、普通の酒量なら毎日飲んでも10日弱は持ちます。1日300円ですね。
ただ開けて放置すると味が抜けたり酸味が強くなり過ぎたりすることもあるので、開けたら早めに飲みましょう。


さあ、年末に向けて、美味い酒飲んでいきましょう。

Electronでメディアファイル用のファイルブラウザ「BlackAlbum」を作った

Electronで動作する動画ファイル及びJPG in Zip向けのファイルブラウザを作ってみました。
構成としてはElectron+React+Reduxで、gulpfile以外はbabelを使って書いてます。
そこそこ今風な感じを目指して、一部flowtypeとかも取り入れてますが、割と適当な感じで使ってます。
実は以前Node.jsで同じもの作ってたんだけど、せっかくちゃんとデスクトップアプリとして作れるようになったしReactにも慣れたのでElectronと今の技術で作り直してみたのがこれです。名前も同じだったりする。


https://github.com/joker1007/blackalbum
https://github.com/joker1007/blackalbum/releases/download/v0.2.0/BlackAlbum-darwin-x64-0.2.0.zip
https://github.com/joker1007/blackalbum/releases/download/v0.2.0/BlackAlbum-linux-x64-0.2.0.zip

Screenshot


仕様

動作にはffmpegthumbnailerとffprobe(ffmpeg付属)という二つのコマンドが必要です。
Macならhomebrewで両方入ります。
その他は、PureJSのライブラリで動作しているのでLinuxでもコマンドがあれば動くと思います。(バイナリは作ったけどロクにテストしていない)


特定のディレクトリのファイルを攫って、メタデータとファイルパスをIndexedDBに登録しつつElectronアプリ用のuserDataパスにサムネイルを生成します。
ファイルは完全にフラットに並び、無限スクロールで全てのファイルを参照できます。
後は、設定で拡張子毎に再生用のアプリケーションの実行コマンドを書いておけば実行できます。
再生用アプリケーションは複数登録可能で、右クリックで再生プレイヤーを選択して起動できます。
雑な検索フォーム、ソート順変更、お気に入り登録と、検索クエリのプリセット保存機能なんかがあります。
しかし、設定画面作るのが面倒だったので、設定はuserDataパスにYAMLで直で書くスタイルです。
設定ファイルはこんな感じで、Macだと~/Library/Application Support/blackalbum/config.ymlにLinuxだと~/.blackalbum/config.ymlに置きます。

directories:
  - "/path/to/target/directory"
filterWords:
  - NGWORD
thumbnail:
  concurrency: 3
  size: 200
players:
  mplayer: open -a "/Applications/MPlayer OSX Extended.app"
  vlc: open -a "/Applications/VLC.app"
  cooViewer: open -a "/Applications/cooViewer.app"
extensions:
  avi:
    - mplayer
    - vlc
  mkv:
    - mplayer
    - vlc
  mp4:
    - mplayer
    - vlc
  m4v:
    - mplayer
    - vlc
  mpg:
    - mplayer
    - vlc
  wmv:
    - mplayer
    - vlc
  zip:
    - cooViewer


自分のために作ったものなので、色々不親切ですが自分としてはそれなりに便利に使えてます。
その内、もうちょっと親切なインターフェースを作るかもしれませんが、あんまりモチベーションは無いですw

使った主要なライブラリ

dexie.js

IndexedDBを操作するために使ってます。大体何でもPromiseで帰ってくるのでasync/awaitが使えると綺麗に書き易い。

immutable.js

不変データ構造定番のやつ。

material-ui

Material DesignなReact Componentを簡単に使えるライブラリ。見た目がそれっぽくなるw

react-infinite

React用の無限スクロールライブラリ。リングバッファっぽくなっていて、何件表示しようが一定範囲しかDOMを描画しないので項目が大量になっても動作が軽い。
同種のライブラリが他にもいくつかあった。
ファイル数が数万の単位になると、この手のライブラリが無いと重過ぎてまともに描画できなくなる。

mousetrap

キーボード操作によるホットキーの定義に利用。

redux-thunk/redux-promise

Reduxで非同期処理のアクションを扱うためのミドルウェア

sweetalert

Material Designっぽいアラートダイアログ。

jszip

Pure JSなzipの圧縮・解凍用ライブラリ。adm-zipという同種のライブラリがあるが、こっちの方が大分早い。

pica

Pure JSな画像リサイズライブラリ。lanczosでリサイズできて、触ってみた中ではPureJSでは結構早い方だと思う。

humanize

ファイルサイズとか日付を読み易く整形する。

ビルド環境

gulpとbrowserifyでビルドし、パッケージ化にelectron-packagerを使っています。
一部、browserifyをバイパスしなければならないライブラリがいくつかあるので、その用途で使うものだけどdependenciesに追加し、後は全てdevDependenciesにしてます。
最終的にパッケージ化する時にelectron-packagerのignore設定でdevDependenciesのライブラリを全てignoreすることで、無駄なパッケージでファイルサイズが肥大化しないようにしています。
参考にしたのは以下の記事です。

また、実験的にReactのホットリロードにlivereactloadを使っていますが、SourceMapがおかしくなったりしてちょっと微妙感があります。後、バージョン上げたらビルド壊れたりするし……。

苦労した点

別に大したことはしてないのですが、いくつかハマりました。


まず、無限スクロールはreact-infiniteと同種のライブラリを見つけるまでは、初期描画のパフォーマンスに大きな問題があった。
後、リストする対象が多いのでshouldComponentUpdateをちゃんとやらないとクソ重くなりました。


zip展開と画像縮小のパフォーマンス問題の解決に少し手間取りました。
最初に選択したライブラリが割と遅くて、動作はするけど使い物にならなかった。
picaは高速だったけどbitmap化された画像しか扱えなかったので、BufferをBlobに変換してからCanvasに取り込んでpicaで縮小してからCanvasをElectronのnative-imageモジュールで画像に戻す、というやり方でそこそこ実用的なスピードでzip展開とサムネイル作成ができました。


picaの画像縮小はWebWorkerを使って並列で動作できるようになっているが、そのために利用しているwebworkifyというnpmパッケージが作成したobjectURLをrevokeせずに放置するため、いくつも処理するとobjectURLが溜まり続ける問題があった。そのせいか300件程処理した時点でWebWorkerにアクセスできなくなる謎のエラーが発生。適切にrevokeするようにライブラリをforkして修正して解決しました。


async/awaitのエラー処理をサボると、何の情報も無いままいきなり処理が止まるのでデバッグに苦労した。当たり前ですが、失敗しそうな処理はちゃんとtry/catch書くようにした方が良さそうです。


ElectronはNode.jsのネイティブモジュールが呼べるので、一部のモジュールがbrowserifyと衝突します。何が大丈夫で何が引っかかるのか手探りだったので、動いたり動かなかったり調べてglobal.requireしていくのが面倒だった。
でもbrowserify使わないとnode_modulesでファイルサイズが無駄に膨れ上がるし、それはそれで困る。


後、これ→→ Electronを使ってMac向けのアプリを開発する時のファイル名の扱いについて (所謂UTF-8-MAC問題) - Qiita


と、こんな感じで1ヶ月弱ぐらいElectronとReduxを触ってみたけど、大体使えるようになった気がする。
まあソースコードは割と雑な感じになってるしテストも無いんだけど……。