LinusがZFSにLKMLで言及した件

先日Linusが盛大にZFSを非難したことがインターネット・カーネル界隈の噂を駆け巡った。これをタイトルだけみたり本文をちょっと読んだら「ああ、LinusはZFSが嫌いなんだ」とか「LinuxでZFSを使うべきではない」といった理解をする人が非常に多いだろうと思う。Linusは当然Linuxユーザーにとって大きな影響力を持つ人物であり、多くのLinuxユーザーがこの理解のままでいることになりかねない。公私ともにZFSに頼りっきりになっている私は特にそういう状況は非常に困るし、Canonicalは19.10からUbuntu LinuxでのZFS rootを標準にしようとしているくらいだからもっと困るだろう。複雑な状況になっていると思うので、このニュースの深層を探ってみよう。

まず元スレ

元になったLinusのレスによると、そもそも最近カーネルにドライバのインターフェース変更があってZFSがこれで大きな影響を受けたとのこと。カーネルのFPUのインターフェースがGPL-onlyと宣言されたことでZFS on Linuxは非常に困っている。これについてLinusに「どう思う?」と質問があったという流れだ。

  • 「ユーザーに影響を与えない」ポリシーはユーザー空間のアプリと、私が見ている範囲のカーネルについての話だ
  • 外部のカーネルモジュールは対象外で、その面倒までは見きれない
  • Oracleの法務かLarryがサインした書類がなければZFSに関するコードは一切マージしない
  • それどころか、shimみたいなのも一切入れる気はない、Oracleのインターフェース著作権(Javaのアレとか)のことを考えればライセンスに関して落とし所はないだろう
  • ZFS使うなよ。バズワードでしょ。ライセンスの問題がある限りは一考に値しない
  • ベンチマークもそんなにいいと思わないしそもそもメンテされてないんじゃね

という要旨で、まあZFSのことそんなによく知らないのかな?と思ったら、これに対する反応はだいたい次のような感じ。

  • カーネルモジュールのことは仕方がない、サードパーティだしね
  • マージされるとかshimがあり得ないとか、それも当然そうだと思う(より安全だしね
  • VM動かす系のユースケースだと使いやすい類似のファイルシステムはBtrfsしかないんだけどちょっとね…
  • VDO+thinp+XFSみたいなので頑張れなくはないけどそれでも機能がたりない
  • わたしのワークロードだとARC?が効いてページキャッシュがめちゃヒットして性能出る
  • いやOpenZFSむっちゃアクティブだよ!!!

これに対して、OpenZFSについてLinusから返事が(わたしの超訳です)。

  • ZFSといったらOracleのやつに決まってんじゃん!メンテされてないでしょそっちは
  • OpenZFSがアクティブなのは知ってる。でも著作権リスクについては同じことだよね

ここでスレは終わっている。つまりOpenZFSについては法的リスクだけを懸念しているわけで、他のことについては何もいってない。まとめると、ZoLユーザーは法的リスクを理解した上でZoLを使っているということになる。OracleのオリジナルのZFSについては、ZoLユーザーは関心はないだろう。

ZoLの法的リスクについて

これについては、Canonicalが一応の結論を出している。今年の8月にUbuntuがこれからZFSやっていくぜと宣言したときに、2年前に大丈夫だという結論を出したとかいている。ここは簡単に結論を引用しておこう。

While the CDDL and GPLv2 are both “copyleft” licenses, they have different scope. The CDDL applies to all files under the CDDL, while the GPLv2 applies to derivative works.

The CDDL cannot apply to the Linux kernel because zfs.ko is a self-contained file system module — the kernel itself is quite obviously not a derivative work of this new file system.

And zfs.ko, as a self-contained file system module, is clearly not a derivative work of the Linux kernel but rather quite obviously a derivative work of OpenZFS and OpenSolaris. Equivalent exceptions have existed for many years, for various other stand alone, self-contained, non-GPL kernel modules.

私もこれで大丈夫だと思うんだが、まあOracleが何をやってくるのか分からないということに関しては同意しておこう。ただまあOracleが訴えたのはクラウド事業で競合関係にあるどころか数歩先を行く先行者のGoogleで、かつGoogleは基幹の事業ではめちゃくちゃ儲かっているとか、いろいろ条件が揃ってこうなったんじゃないかというのが私の推測だ。Javaのアレはこちらの解説が詳しいので深くは踏み込まないが、あのときはDalvikがすでに標準化が進んでいるJVMの仕様について、それの実装を作って利益を得たという状況だった。ZoLだと少し違って、LinuxがOpenZFSをライブラリ(VFSのひとつ)として利用している形態になる(しかも配布は別々で、ユーザーは自分でくっつける)。

まとめると

  • Linusが非難したのはOracle ZFSであってOpenZFSではない
  • とはいえLinuxにZFSがマージされることはないだろう
  • Ubuntuはライセンスは問題ないと3年以上前に宣言している

あたりが事実。

ちなみに、Oracleが公開しているZFSのドキュメントはLinuxの他のどのファイルシステムよりもよく書かれている。個人的には、ZFSはLinuxが標準で用意しているどのファイルシステムよりも必要な機能が揃っていて安定していて使いやすい(それゆえにシステム管理者から絶大な人気がある)ので、このまま使い続けられる状態であってほしい。FreeBSDみたいに標準でROOTにできるようにしてほしい。ZFSは割と無茶なオペレーションもやり遂げられるので安心感が違う。

(追記)見返したらタイトルが煽りっぽかったので変えました

(追記2)より詳しい解説が出ていた:
Linus Torvalds says “Don’t use ZFS”—but doesn’t seem to understand it

コードを書いて金を稼ぐ

初めてまともに携わったシステムはNTT研究所で作られていたCBoCといわれるものであった。内容について詳しくは述べないが、国内では割と先進的でありながらとにかくNTTの事業会社(割と稼いでいる)で使えるものを作ろうというものであった。この時期は研究所は研究だけしていればよいというものではなく事業貢献が求められており、論文になるような研究を生み出すだけでなくそれをどうやってビジネスにするかが重要視されていたのだと思う。このとき作ったものは実際に事業会社で使われ、退職の前後には年間数万円が口座に振り込まれるようになっていた。なお収入なので税金の扱いを間違えないように。しかし特許といえばガッポガポ…というイメージだがそんなに当たることはない。わたしが携わったそのソフトウェアは確かに使われていたが、事業会社のビジネスの中核を支えていくようなものにはならなかった。ならなかったのでメンテナンスフェーズというやつに暗黙に入っていき、投資は徐々に細くなっていった。これから金と人を投入してさらにスケールさせていくというタイミングでそうなったのには諸事情があるがとても口惜しかった。

さて開発に携わったとはいえ、大きなソフトウェアを大人数でスクラッチから開発するには多くの分業が必要になり、その多くの職種のうちわたしは最上流のアーキテクトのような立場になった。要求条件と仕様をまとめて、背景にあるベース設計を考えて伝えて、基本設計書をまとめてもらい、さらに詳細設計をレビューしたりコードをレビューしたり、協力会社が常駐できる環境を整えたりするのだ。何とかSubversionまでは用意したが、HudsonやBuildbotまでは用意できなかった。コードを書いたりコンピュータを動かす以外の仕事が沢山あり、それらを順番にこなしつつ、Subversionを監視しながら日々追加される大量のソースコードに圧倒されていた。

 

次に関わったのはJubatusというソフトウェアだ。これは小規模なスタートであったから、最初の学習器のベース実装を確かOさんとUさんに作ってもらってサーバーに乗せて分散化する設計と実装をやった。今度はうって変わって精鋭たちとサクッと実装してサクッと動くものができた。このときTさんとペアプロして、まともなC++の書き方を初めて学んだ。大学の研究室でつくるようなのりだ。これで稼ぐソフトウェアが作れたのだろうか?という疑問の通り、実装はしたもののなかなか実用化には至らなかった。これは理由がいくつかあって、まずはそもそも先進的過ぎたということと、機械学習でしかもオンライン学習でなければならないアプリケーションは実は世間にはあまりなかったのだということが、あちこち営業して廻って気付いたことだった。

技術開発には大きくわけてシーズベースのものとニーズベースの方法論があるが、どちらもビジネスや社会の現場の知識や経験がないと、最終的ては金にならないという当たり前の話である。当たり前の話であるが、とにかくモノがなければ始まらないので、作ったこと自体は間違いではない。それでもJubatus自体はニッチでもユースケースを見つけ、いくつか?のサービスで使われたらしいとは退職後に聞いた。10年近く経った今でもメンテナンスされているようだ。

 

転職して次に関わったのはRiakというソフトウェアだ。これはErlang/OTPで実装された分散データベースであり、これもまだ市場には普及していない新しい技術を実装したものであった。アメリカ東海岸のスタートアップであり、アメリカに多くの顧客を抱えておりこれから日本にも進出するという。今度はある程度実績のあるソフトウェアに関われるということで興奮していた。これなら日本でも多く使われるようになって、自分の書いたコードが稼ぐようになるんじゃないかと思った。実際に顧客からの要望を受けて機能開発をしたりしていた。途中からRiak CSというファミリー製品のテックリードとなり製品にある程度責任ある立場となり、ますますコードを書くようになった。CEOが日本にやってきて外国の某社に数億円でライセンスが売れたと聞いたときはとても嬉しかったことを覚えている。結末は皆さんご存知の通りで、少し売れたくらいではソフトウェア作って食っていけるわけではなく、数年かけて最終的にその会社はなくなってしまった。

 

次に作ったソフトウェアはRetzというApache Mesosにジョブスケジューラの機能を追加するものだ。今でこそKubernetesが全盛だが、先発のソフトウェアが必ずしも覇権をとるわけではないしそもそもあるソフトウェアが永遠に使われ続けることなんてないのだ。当時はMesosが最新で、データセンタースケジューラーが市場で必要になると踏んでMesosに足りないものを補完するソフトウェアとしてRetzを作った。このRetz(とMesos)は金を稼いだか?まず単体ではNoだ。当時はクラウドネイティブという言葉がやっと出始めたばかりの頃でコンテナで全てのサービスを運用するなんて先進的すぎたし誰もやっていなかっただろう。今だってちゃんとできているサービスは少数なんじゃないかと疑っているくらいだ。未熟なソフトウェアで未熟な市場に切り込むのはハイリターンが期待できるが、ハイリスク低確率なのである。しかもバッチ処理というエンプラど真ん中のニッチな用途では尚更である。結局RetzとMesosが本番環境でみんなに使われたのは2例しかなかった。
ソフトウェアそのものを売って金にする時代はわたしは終わったと思っている。Sunが買収されMicrosoftもOracleもサービスを売り始めた。こういう例は枚挙に暇がない。ビジネス応用とデプロイメントが多様化しており、ユーザーに求められる能力や知識がどんどん高度化しているためだ。OSSじゃないといけないとか、エコシステムを育てるとかそういった問題ではない。

 

転職して次に開発することになったのはChainerだ。これは既に会社を支える最先端のソフトウェアであり、わたしが入社したときには十分に稼ぐソフトウェアになっていた。しかも、Chainerそのものを販売しているわけではなかった。これは日本ではなく世界で最先端のソフトウェアであったし、ビジネスで使えるアプリケーションをすでに生んでいた。わたしは書いたコードが使われることにとても満足していたが、論文の執筆に少しだけ関わってKDD著者にもなることができた。Chainerは獲得したユーザーからは厚い支持を受けたものの、その数には限界があって結局世界的な潮流に飲まれてしまった。

 

コードを書いてソフトウェアで稼ぐには、稼いでいるビジネスをコンピュータの力で支えるか、コンピュータやソフトウェアの力で新しいビジネスを生み出すかのどちらかしかない。これができている人を本当に尊敬するし、わたしにはビジネスは全然分からないし、コンピュータもよく分からない。できるのはそういう人に後ろからついていってちょっとお助けするくらいのものだ。コードを書いて家族を養うのはとてもとても難しい。

とても難しいが、キャリアを通じてそういう場所にだんだん近づいていってる実感はある。今までもそういう期待を持ってやってきたし、今作っているもの、これから作ろうとしているものもそういう期待があってやっている。先のことは分からないけど、どうやらそれしか能がないのかな?

りんごチャレンジ

先日都内某所で行われた秘密の会合の目的は、有志が一年間の進捗を共有するというものであった。私は減量を終えてから一月近く経過しており、しかも最悪なことに11月はほとんど怪我でトレーニングができていない状態だったため増量に入れておらず、特に報告できる進捗もなくトボトボと参加したのであった。みんなが進捗を確認しつつ談笑している中で @yuitowest が持ち込んだ秋映が机の上にゴロっと無造作に転がっていたのだが、いかんせん会場が会場なだけに特にナイフやまな板があるわけでもなく、どうやってリンゴを食べたものかと逡巡…していなかったのだが、リンゴを握りつぶすことで有名な @hiroki_niinuma がいきなりパカッと真っ二つに素手で割ってかじり始めたのだった。そこからは早かった。彼のように片手でリンゴを握りつぶすことはできなくても、両手を使えば割れるのではないか。そんな希望が湧いてきた。のでやってみた。


りんごチャレンジ day 0 (秋映)

そうできなかったのである。ワイワイ盛り上がっていたが、一緒にいた友人たちは次々とパカパカ割っていくではないか。私は焦った。焦っていくつもリンゴに挑戦し、その度にヘタの辺りを妙に凹ませたりベタベタにしたりするが結局割れなかった。そのとき割れなかった人も他に何人かいたが、全員が翌日までに「帰ってやってみたら割れた」というではないか。なんということだ。私はクソザコのままなのか。更に焦った。というわけで、翌日からトレーニングメニューを一新してリンゴを割ることにフォーカスした。主なメニューは

  • CoC G 親指ピンチング: 普段は親指の付け根で握るが、親指の第一関節と手のひらを使って握る。これは案外力がよわく、全然閉じることができなかった。
  • ケトルベル親指ピンチング: たまたま自宅に4kgのケトルベルがあったので、親指だけで持ち上げる。

である。これを数日間毎日続けた。とくに筋力が上がるわけではないが、日々神経が通っていくことを実感していた。「これならいける!」私は確信して今日、先日の会合の折に頂いて帰った秋映最後の一個を手にとった。


りんごチャレンジ Day 4 秋映

・・・

そうまたしても割れなかったのである。本当にクソザコだ。このままではダメだ。死ぬしかないそう思ったとき、撮影していた妻がおもむろに別室から別のリンゴを持ってきて私に手渡した。どれ、む、少し小さいな。手が余る。うーん割れるのかといいながら、また握った。


りんごチャレンジ Day 4延長線 シナノスイート

ええーこんな簡単に割れんの?!?!?!?まあいいやとにかく大勝利!!!!大勝利だ!!!111

私は上がりきったテンションでリンゴをかじる。シャクっと音がする。リンゴが好きな妻は家に大量のストックを持っており、その中のひとつがシナノスイートという品種だそうだ。こちらは秋映よりも小ぶりで軽め、さっぱりとした味だ。うんうまい。こうして私は大勝利をおさめ、今ここに筆を執ったのである。

…いや思ったよりサクッと割れたのでもう一回秋映に挑戦したのだが、こちらはどんなに頑張ってもダメだったので、妻に頼んで切り分けてもらい、家族で楽しく食べましたとさ。なお動画から音声を抜くのに使ったコマンドは次の通り。 "-an" オプションが、オーディオについては何もしないという意味になる。

$ ffmpeg -i VID_20191203_201430.mp4 -vcodec copy -an akibae.mp4

アドベントカレンダーは以上だ。今年は肉体に進捗なく、他に特筆することもまだなく、いよいよ不惑が近くなったが人格は特に成長せず、仕事でも進捗がなく、うーん…来年こそはいいことがありますように。明日はPythonの良心こと @aodag 先生だ。

減量記録2019

前回の減量は一年近くかけて、2018年の連休明けくらいまでかけて66~67kgくらいまで落としたのだけど、最後はたしか風邪を引いて、それを治すために終わりにしてそのままだった。そこから1年経ってまた75kgくらいまで戻ったので、また減量した。

kuenishi.hatenadiary.jp

今回の目標はあんまりはっきりとは決めていなかったけど、たしか6月に始めるつもりがダラダラ伸びて結局7月の始めに「ホラやるんでしょ」みたいな感じで妻に促されて始まった。なんでダラダラ始めなかったかというと、食事メニューがなかなか決まらなかったからだ。PuLPを使っていい感じに線形最適化されたメニューを組もうとしたのだけど、PFCだけをパラメータに食材を決めるとどうなるかというと、米とプロテイン粉末とMCTオイルだけの食事になってしまうのである。わたしはもうちょっと幸福に生きたいと思って、幸福度を最適化目標のひとつに入れようとしたり、もっと食物の選択肢を増やそうと食品成分表を持ってこようとしたりして回り道をしすぎていた。

妻が結局メニューを組んでくれて、最初は

  • 一日二食、鶏胸肉orささみと葉っぱをそれなりに12pmと8pmくらいに
  • ライスは360g/day, 120gずつオニギリor茶碗ひとつにして、昼2個、夜1杯
  • プロテインは9am, 3pm, 11pm で3回
  • トレ中はマルトデキストリン+BCAA溶液を入れる
  • 仕事中に腹が減ったら適当にアーモンドorプロテイン
  • トレは週2~3回、重量落とさずにrep数少なめで

みたいな感じにしていた。たしか1ヶ月くらいは内臓中の消化物がはけていくのと、水分が抜けるので順調に減っていったのだけど、結局脂肪と筋肉はあんまり減っていなかったように思う。停滞を感じたわたしは

  • ライスは300g/day, 100gずつオニギリor茶碗にして、 昼1個、3pmに1個、夜1杯

に変更した。これが一番効いて8月9月1杯まででおよそ5kgほど減って、水分が抜けた朝一番なんかは70kgちょうどくらいまでになった。ところがここからまた停滞した。9月終わりから10月頭にかけてである。外食もほとんどしていなかったしウーンわからんとなっていた。

トレーニングの内容も、満足度が低かったので少し内容を変えた。上半身とかをなんとなく広くやっていたのを、体幹系の種目に集中するようにした。二分割して、上半身と下半身を交互にこなすようにした。特に脚を重視して、最大重量を維持することよりも12〜15repできる重量をきっちりこなすようにして、翌日、翌々日に歩行困難に出るくらいになることを意識した。わたしの場合はバーベルスクワットは60~70kg程度だ。上半身のメニューでは大胸筋、僧帽筋のメニューを軸にした。あとはウォームアップにチンニングと、下半身強化のためのアブローラーをメニューの仕上げに入れることにした。これで体幹系の大きい筋肉のグリコーゲンを消費することを心がけたのである。腕や肩、膝より下はあまりやらず、体幹系のメニューをやって疲れる程度で満足するようにしておいた。

ちょうど微妙なタイミングで、右上7番の臼歯の再植手術をした。出血するし麻酔するし抗生物質は飲むしで、ようは静養が必要な状態になった。しかもそれに加えて、再植部分に雑菌が入らないようになるべく反対側の歯で噛むようにしなければならず、口内の衛生状態を保つために食後する歯を磨くことにした。オフィスでの食後の歯磨きは面倒なので、家で全部食事をとることにした。一日二食を少し運用を変更して

  • 一日二食、鶏胸肉orささみと葉っぱをそれなりに830amと8pmくらいに
  • オートミールは200g/day, 100gずつにして、朝夜1杯ずつ
  • プロテインも食事時のみ、一日2回
  • 仕事中も間食はなし
  • 安静にするためにジムなし

といった生活に切り替えたところ、さらに体重がおよそ-1kgくらいになった。トレーニングをしていないので筋肉も落ちただろうが、血糖値を上げずに食事回数を増やす(トータルの食事は増やさない)という常識ををうちやぶって、食事を一日になるべく固めるというのでもわたしくらいのレベルだと成果が出なくはなくてキープができるということが分かったのは収穫だった。

というわけで無事に今回の減量も終了。

f:id:kuenishi:20191101230242p:plain
まあまあ順調に減っている。4ヶ月で5kgくらい


今回実感したのは、カロリーを計算するよりも食事そのものをコントロールすることの方が重要だということ。以前ゴールドジム国立店でジャガー佐藤さんの「わたしはカロリーはあまり計算しないけど、ライスの量でカロリーをコントロールする」といった旨の話を聞いて「そんなもんかぁ〜」と思っていたのだが、今回はそれを強く納得できた。つまり、カロリーの書いてあるよくわからない既製品や外食よりも、自分で炊いた米の重さを量った方がいいということだ。毎日の変動要因をなるべく抑えて、観測と自分の感覚に耳を澄まして食事や生活にフィードバックしていくことが重要だということでもある。

追記

分散システムデザインパターン寸評

「分散システム」という言葉は大まかにいって複数のコンピュータが一つの系となって協調動作するようなシステムのことを指す。本書のお題はそのときにどういうパターンがあるかを解説するものだ。作者がKubernetesの開発者であることや、副題をみても、複数のコンピュータを使って大規模にスケールするサービスを設計するときに必要なテクニックを解説するものだ。

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

分散システムデザインパターン ―コンテナを使ったスケーラブルなサービスの設計

しかしながら、分散システムという言葉は狭義には「いつでも故障しうる」複数のコンピュータがひとつの系となって協調動作するシステムという強い条件がつく。その上で協調動作のなかでも最も難易度の高いコンセンサス(合意)という問題を解くことが、学問分野として長年研究されてきた。なので私もそのためのデザインパターンを記述したものだと期待してしまったのだが、そうではなかった。
分散合意(Distributed Consensus)は分散システムの中でもとても重要な問題で、これを上手く解かないと、Durability(永続性)のあるシステムを組むことができない。Durabilityのあるシステムとは、つまりデータを保存する能力をもったシステムやサービスのことを指す。これができていないと、例えばひとつのデータを保存したつもりが、読むときに各々のコンピュータが別の値を返してくることになる。

本書では、第一部から、第二部の8章まではずっと準備運動のようなもので、Kubernetesでよくあるデザインパターンつまり、いかに上手くシステムを組むかのノウハウが伝授される。例題もほとんどがステートレスなものだったり、コンセンサスやDurabilityが必要ないものだ。
9章だけはetcdを使った分散ロックの実装サンプルで、分散操作のプリミティブを組み合わせて別のプリミティブを組み合わせるという面白い問題だ。しかしながらロックを実装するサンプルになってしまっていて、実用的な場面について多くが語られているわけではない。それどころか、こう、わりとバッサリ切り捨てている。

マスタ選出は 2 種類の実装方法があります。1 つめは、Paxos や Raft のような分 散コンセンサスアルゴリズムを実装する方法です。しかし、これらのアルゴリズムの 複雑さはこの本の範囲を超えてしまっていますし、自分で実装するほどの価値はあり ません。こういったアルゴリズムを実装するのは、アセンブリのコンペア・アンド・ スワップ命令の上にロックを実装するようなものです。学部生のコンピュータ科学 コースの課題としては興味深いですが、普通は実践するようなものではありません。

バッサリと切り捨ててからロックの実装を解説している…が、実用性をめざすのであれば適当なライブラリを使ったらよいと思うし、 etcdのclientv3にはよいExampleが入っている。ここだけは中途半端で、実用性という意味ではちょっと物足りないし、原理の解説については始めから諦めているし、どうしてこのような章があるのかちょっと分からなかった。
実用的には、ライブラリを使うときのAdvisory Lockの問題点(Mandatoryにすることはできないので、コーナーケースを詰めきることはできない)を解説して、この上にリトライ機構を頑張って組んでアプリケーションのレベルで安全性を保証することを解説しないといけない。そこを乗り越えないと実用的にはならないので、ちょっと何というかメインディッシュを外された感じがする。

まあステート管理はすべてクラウドストレージとかマネージドDBMSでやるんだと割り切ればこういう話でいいのだろうし、本一冊の内容になるといえばなる。これまでの分散システムの解説本でそういうことが十分に解説されてきたか?といえばまあ疑問だが。。。

第三部ではバッチとか、オンラインじゃない処理をスケールさせるときの代表的な手法が解説されている。たしかにWebサービスやふつうのITシステムを組む上で必要十分かもしれないけど、ここ2年ほど深層学習目的のHPCクラスタ上で分散計算をしている身では物足りない・・・。

そういうわけで、本書は分散システムの最も難しくて重要な問題に切り込んでおらず、でもシステムを組む上で頻出する簡単なパターンを網羅している。簡単なパターンばかりなのでわりとアドホックに作り込むことができるものばかりだ(ライブラリや基盤的なシステムとして外だしする必要がない)。つまりタイトルの付け方がうまくて、もっとSpecificにつけるなら「分散アプリケーションデザインパターン」である。アプリケーションとは何だという話ではあるが、Kubernetes上でたくさんのコンテナを使ってサービスを構築・運用していきたい人には良書だと思う。私はそちらの方は疎いけど。。。


[1] リンク https://www.oreilly.co.jp/books/9784873118758/
[2] 原著 https://www.oreilly.com/library/view/designing-distributed-systems/9781491983638/
[3] Azure Download https://azure.microsoft.com/ja-jp/resources/designing-distributed-systems/en-us/

雑記

箱根関所跡の見張り台から富士山を望む
箱根関所跡の見張り台から富士山を望む

2018年も暮れになってアドベントカレンダーの季節になってきました。夜中に今年のことを少しずつ思い出しながらこれを書いています。一年間のアルバムをいろいろ見返したのですが、撮れ高としてはイマイチで、箱根にいったときのものくらいしかあまりよいものがありませんでした。箱根はIT健保の保養所があるので何回か予約合戦をして行っているのですが、いつ行ってもいいですね。いつも同じところを巡るのですが、子どもたちも毎年違う楽しみ方をしています。

箱根駒ヶ岳から山頂の神社を望む
箱根駒ヶ岳から山頂の神社を望む

さて2018年を振り返ると、これまでのように対外的に発表をしたりといったこともなく、目立つ活動は年々減っているような気がします。本当にいろいろな意味でよくないことなのですが、2019年、2020年に向けていろいろと仕込んでいるということにしておきましょう。さすがに昔のように、よくわからないプログラムを仕事でもないのに書き連ねて公開するということはなくなりました。長男がScratchにハマって日々よくわからないものを作っていて、たまに見せられるのですが本当によくわからなくて、「オッおおう」みたいな反応をするのを反省したいところです。長男は面白くて、大人と話すときは「俺Pythonやってるんだよねー」というのですが、家でずっとやっているのはScratchです。その影響を受けて次男もパソコンがほしいといいだして、Chromeで音声検索して目当ての電車やトーマスに行き着いたりするハックを日々実践しています。まだかろうじて字が読めるくらいで、ろくに日本語も書けないしタイピングもできないのに、ですよ。長男はブラウザのタブを大量に開いてWikipediaのよくわからない項目を読みふけっていたかと思いきや、Scratchでよくわからないメロディーを鳴らしたりしています。YouTubeを見るのに我が家では30分制限/dayを課しているのですが、長男はその30分タイマーも最初Scratchで自作していました(後になんかWebサービスみつけてそっちを今は使っています)。現代のテクノロジーは人間をenforceするんだなあと感心しきりです。

一方の旧世代のオッサンたる私は何をしているかというと、ひたすらNintendo Switchでスプラトゥーンをプレイしています。さっきプロフィールを確認したらプレイ時間が720時間になっていたので、均等に期間をわりあてると今年は500時間ほどプレイしたことになります。今どきコンソールゲームで遊ぶなんてオッサンですね。若者はソシャゲです。オッサンは仕事ではMacをやめてLinux一筋で、プログラムは主にEmacsで書いてMakefileやsetup.pyを書いたりしています。21世紀も2/5近く経つのに20世紀なことばっかりです。扱う題材も流行りのディープラーニング…かと思いきや、結局MPIとか分散処理とかTCP/IPとかRPCとか、20世紀の頃からあったものばっかりです。もちろんニューラルネットワークというやつもこの10年で急に登場したわけではなくて、古くて新しい技術がここ数年で急に実用化され始めたということなのですが。あいかわらずlsとかmakeとかsshとかやって、会社には電車で通勤して、土日は家でゴロゴロ…と、なにひとつ未来な感じがありませんね。インターネットで通販しまくっているというのはもしかしたら新世代かも。

引っ越し

通勤で思い出しましたが、子供部屋を用意して隔離^H^H勉強に集中させようとして家を探したのですが、当時住んでいた国立の近辺によい物件がなかったので、思い切って10年ほど住んだ国立を離れることにしました。会社の近くになって、子供部屋も用意できて、住宅ローンという名の生命保険も加入できて、まあそれなりに生活は改善されました(もちろん全てが改善というわけにはいきませんが、概ねポジティブです)。いろいろなPaperworkがあったのですがこれもひとつ人生の勉強になりました。

さてこれまで明に公言はしませんでしたが、国立はとてもよいところです。もしも職場が中央線沿いなら、新宿以西なら、とてもよいところだと思います。たしかに中央線は脆弱で遅延などは多いですが、わたしのようにある程度時間に自由が利く職種ならそれも大きな問題になることは少ないです(なにかの事故で四谷トンネルの中で止まって、しかしお急ぎのあまり線路上で途中下車したお客様を探して安全確保のためにさらに待たされたときはさすがにちょっとムカッとしましたが)。まず国立は治安がよいです。駅前にパチンコ屋がありませんし、歩道を爆走する自転車が少ないです(ないとはいいません)。紀伊国屋スーパーや三浦屋など、国産食材を安心して調達できるスーパーが駅近くにありますし、各種私塾や習い事などの教育環境も整っています。一橋大学があって夜中でも学生がウロウロしているので、夜道が比較的安全(な気がする)。

なかでもよかったのは、味にうるさい我が家がお気に入りで行きつけになっていた店が近所にいくつもあったところです。

どの店も、週末には国立まで電車で来た客で埋まるくらい人気があります。どこも飽きない味で、いっときはこの3店で三週間かけて週末の外食ローテンションをしていました。シエル・ドゥ・リヨンとマナリッカはランチもお手頃価格なので、地元のマダムたちが大挙して押し寄せて歓談しています。天ぷらやましたは、銀座レベルの本格和風天ぷらがまあまあ(といっても毎月行けるか?といわれると悩む)の価格で味わうことができます。わざわざ銀座や都心までいっておいしい天ぷら屋を探さなくてもよかったので本当に楽だった。衣がきれいな色でサクッと軽いんですよね。
シエル・ドゥ・リヨンは、ランチメニューもよいですが個人的にはデザートがおすすめです。バニラアイスは上等なバニラを粒が確認できるくらい大量に突っ込んでいてとにかく香りがよいです。ルバーブのソルベは東京ではあまりありませんが、雑草の茎とは思えないくらい上品な酸味が効いていてこれも好きです。夏はルバーブのソルベで冬はバニラアイスがいいです。他のデザートも味と盛りがよくてよいです。
マナリッカは、なんか普通の民家なのに中に巨大なピザ窯があって薪が大量に積んであります。窯で薪で焼いたピザは生地がスモーキーに仕上がってパンチがあっていいんですよね。ピザはどれも原価率高そうな感じの素材を上手く使っていて、しかも定期的にメニューがアップデートされるので飽きずに毎月とか毎週行ける感じです。

歯の根管治療を始めた

二人子連れの引っ越しはやはり体力を使うものらしく、引っ越したら歯の根幹がそろそろ死にかけているという診断を受けました。歯に穴を開けて、根の先っぽまで中の組織をとっていって埋めるやつです。今通っている歯科医が非常に腕のよい人で安心しています。痛いかといわれたら最初の穴あけは痛かったんですが、穴あけたあと飲み会にいって日本酒飲んでるんだから世話ないよなという話です。そのあときっちり風邪でダウンしました。

トレーニングの進捗

昨年のアドベントカレンダーの記事を書いた頃はちょうど減量真っ最中だったのですが、その後半年近く減量をダラダラとやってしまい、最終的には連休明けに風邪を引いてしまい、目標体重65kgまで届かずに終了となりました。

減量2017-2018
減量2017-2018

減量が終了した後は筋肥大しつつ増量していこうとしています。なんか目標あった方がトレーニングの方針決まるよねということで、ビッグ3で合計300目指してパワーに寄せたメニューにしています。現時点では1RMでそれぞれBench 85, Deadlift 125, Squat 85 といったところです(同日というわけではなく、ここ最近のそれぞれの最大値)。あとちょいなんですが、ここからがなかなか伸びない。コンスタントにこの数字を維持できるようになりたいところです。仕事で忙しいことを言い訳にしがちですが、まあ子持ちの社会人なんてそんなものかもしれません。食事については、最近は特に気を遣わずに自然にしています。血糖値を落としすぎるとカタボリックになってしまうので、血糖値を上げすぎず下げすぎず、プロテインは食事含めて3時間に1回補給することを心がけていて、体重は70-72kg 近辺をウロウロしています。急に増え続けているわけではなくバランスしているので、このままよいコンディションで筋量を上げていきたいところです。

なお新居になってスペースができたのでふるさと納税でチンニングスタンドを導入しました。

View this post on Instagram

A wild chinning stand appeared home

A post shared by Kota UENISHI (@kuenishi) on

チンニングスタンドとPowerBlockがあるという環境なので、次はベンチが欲しくなります。うーん、スペースがない…ベンチとダンベルがあれば大抵のことはできるようになります。そこがスタートラインという気がしますが、きっとベンチを手に入れたらバーベルが欲しくなるのだろうと思って、なかなか難しいなと躊躇しています。ちなみに体重が増えたのでチンニングそのものはあまり伸びていません。ワイドでYができるようになったくらいかな。

キーボード作り

ErgoDoxがあまりに大きくて職場の卓上を占拠して邪魔区さいので、Ergo42を組みました。その後ErgoDoxを職場の同僚に譲ったところ、もともとのユーザーも含めてチーム全員がErgoDox-ezを購入するという現象が発生し驚いています。

View this post on Instagram

Deployed Ergo42! Very compact

A post shared by Kota UENISHI (@kuenishi) on

しかしながら、拡張のない4段では数字を入力するときにModifierが必要になり厳しかったのでIrisを作ろうとしましたがたくさん失敗しました。

View this post on Instagram

Failures, hard time

A post shared by Kota UENISHI (@kuenishi) on

たくさんの失敗を経た後、無事に完動品を複数実戦投入できました。

特にこちらの2つ目は、翌日が在宅勤務予定なのにLinuxデスクトップ用のキーボードが家にひとつもない(ので、朝までに完成させなければならない)というプレッシャーもありながらよく完成までこぎつけました。

View this post on Instagram

So here comes another one, 1am.

A post shared by Kota UENISHI (@kuenishi) on

今年面白かったアニメ、漫画

  • ブラックラグーン
  • 五等分の花嫁
  • 雪の峠・剣の舞
  • かぐや様は告らせたい
  • ウィッチクラフトワークス
  • 宇宙よりも遠い場所
  • 妹さえいればいい。

転職してから1年以上

転職してから1年以上になりますが、こうやってお仕事があるのは有り難いことで、比較的裁量がありながらもスタートアップの強いプレッシャーと期待感の下で仕事をすることができています。具体的には、社内で多く使われているDNNの学習プロセスを速く大きくするための技術開発とかインフラ開発がわたしの仕事になります。といってもスタートアップや外資にありがちなJD (Job Description) ベースの仕事定義ではなく、面白いこと、会社のためになることなら何でもやるといった、一見和風な企業文化のまま世界レベルの成果を出し続け…といっても当たり前のことを当たり前にやっているだけなんですが。

その一環にChainerMNというソフトウェア(5.0からはChainer本体にマージされました)を開発、メンテナンスし続けるというものがあります。並列計算ということもあり、このソフトウェアは一見たいへん扱いが難しいところがありますが、それを簡単に使いやすくしつつ、より速く学習が終わるようになるためにいろいろなコードを書いては捨てたりマージできたり、といったことを繰り返しています。Pythonで深層学習なんてそれにしてもナウい響きですが、やってることはミドルウェアの開発とメンテナンスなので地味だったりします。地味ですが社内で多く使われているのでふつうにフィードバックがよく来ます。あと深層学習で分散計算、ImageNetだけでいえば世間的には解かれいているかのような気がしますが、まだまだ未知の部分も多くて毎日が忙しいです。

あと現職で急に変わったことがひとつあります。前職までは私が最年少か、年齢でいって下から2番めというところばかりだったのですが、現職からはチーム内で私が最年長ということが多くなってきました。態度がデカいからなのか、それとも風格があるからなのかはわかりませんが、たまに若者たちに「上西さん、〜〜ってどうなんですか」などと最近ナウいアレやコレのことを聞かれたりします。でもその若者たちは大抵Ph.Dを持っていたりトップカンファレンスにバンバン論文通していたり、なんかすごいコード書いていたり、すごい外資経験していたり、なんとかのコンテストで世界優勝していたりするわけです。話していると滲み出てくる頭のよさ。そういうすごい若者たちとうまく対等に付き合う方法は難し…いかと思ったのですが、なんのことはない、みんな人格者なのでそこそこ上手くやってこれたのでこれっぽっちも心配いらなかったのでした。Preferred Networksという会社は、老いも若きも対等に成功を目指すことができる、夢のある職場です。つきましてはみなさん、私と一緒にChainerを分散させる仕事をしませんか。先日発表したMN-Coreもちろんスコープにはいっていますよ。本当にやることが沢山ありすぎて呆然としているんですが、そういうバタバタして何もない環境でこそ燃えるという皆さんのご応募をお待ちしています。

www.preferred-networks.jp

P.S. こちらの19日目の記事でした。

adventar.org

スプラトゥーンのガチマッチで勝つために気をつけていること

反射神経とエイム力(=相手に狙いを当てる能力)はそう簡単に身につくものではない。野良で味方を当てる運ゲーとも言われるが、運は待つのではなく引き寄せるものだ。年齢を重ねてしまった今そういうものを後から得られることはないが、頭を使ってできることもあるので、そういうことを書き並べてみようと思う。ちなみにウデマエはまだXに達したことがない程度のエンジョイ勢です。


多勢で挑む

まず多勢で挑むこと。多勢がより有利になることを数理的に示したランチェスターの法則によれば、多勢が攻撃を集中した場合は単に人数比ではなく、その自乗に比例して相手の戦力を削っていくことができる。つまり、すごい雑にいうと 4vs1 の場合、こちらは一人も削られることはないということだ。逆に 1vs4 の場合は相手を一人でも削れたら戦術的にはすごいことなのだが、全体的にはメリットは薄いので引くに如かずということになる。

どうしても局面的に数で押せない場合は、

  • 味方のいる場所まで逃げる
  • 近距離系のスペシャルで一気に倒す
  • 相手の射線がかぶるように立つ(こちらから見て向こうが縦一列に並んでいるような位置取りをする)
  • インクが塗れている場所や隘路に誘導して一人ずつ倒す

などを心がけよう。ブラスターやダイナモなど複数同時に倒せるブキもあるが、あちらの攻撃の手数は減らないのでやられるリスクの方が大きい。

1vs1 で勝てるかどうか

まず何よりもメインウェポンの基礎知識、相性とチョイスが重要。基本的に全部のブキを現場で使って試してみること、ネットで基本的な使い方やテクニックを覚えておくことをおすすめする。自分ができるかどうかは別にしても、上級者のプレイ動画を見ておくとよいだろう。自分の常用じゃなくても、ブキに対する理解は倒すときにも役立つ。そのためにも、まず各ブキの基本動作を習得しよう。おおまかにいって、それぞれ以下のようなものがある。

  • マニューバーでのスライド: 前後左右にシャコシャコ動くことで相手のエイムを混乱させることができる。物陰から急に登場して対応する前に倒すことができたりする。各種類で連続スライドの回数と硬直時間が微妙に違うので特徴をおさえておくとさらによいだろう *1
  • シューターでの斜撃ち: 高台にいる的に対して放物線状に弾を飛ばして当てる技術 *2 だ。基本的には高台から下に撃つのが有利なのだが、スプラトゥーンの世界では微妙に物理学が違うので斜撃ちをマスターすることによって 1:1 における高台の有利さをほとんど打ち消すことができる。ちなみに私は苦手だ。
  • チャージャーでのドラッグショット: 射線を相手に認識させることなくいきなりインクを当てる技術。ドラッグによってエイムがずれやすいのをどれだけ練習で修正できるかがコツ。これを理解しておくと、位置取りが悪いと射線がなくてもいきなりキルされることがわかるので、悪い位置取りを事前に避けることができるようになる。ドラッグショットとは直接関係ないが、各ステージにチャージャーの定位置がいくつかあるので、それを予め覚えておくと事前に警戒することができるし、上手くて近づけないチャージャーであれば早々に裏を取る戦術に切り替えることができる。

基本動作を習得して、実践で使っていくときにいくつか特性がみえてくるので、それを把握しておく。

  • 射程長めのシューター: 基本的には遠くから当てる中衛〜後衛用。懐に入られたら厄介だが、ギリギリなんとかなる場合も多い。裏をとりにくには向かない。キルタイムが長めのものが多い。
  • 射程短めのシューター: 基本的には前衛〜中衛用。射程によって、相手の懐や裏から倒すものと、距離感を維持しながら駆け引きで倒すものがある。キルタイムが短めのものが多い。
  • チャージャー: 射程が長く後衛用(スクイックリンと竹は中衛用)。キルをとりにいく場合はいかに位置を特定されずに移動し続けるかが重要。特定の拠点防衛には思ったより向かないが、上級者になると全く近寄れないので注意。たとえ下手でも、練習するとエイム力と相手のムーブに対する読みを鍛えることができる。
  • ローラー&フデ: 射程が短く扱いが難しいが、短距離で1確(一発で仕留めることができる)のローラーは貴重。フデはシューターに負けると思われがちだが、案外弾幕になって勝てることがあったりする。ダイナモは先読みとインク使用がシビアだが、そのセンスを磨くにはとてもよい。
  • ブラスター: 各種ブラスターをある程度使っておくことで射撃間隔のリズムをつかんでおくのが重要。同時に射程を把握しておくことで、爆風で被弾したときに前進して倒しにいくか、後退して避けるかを判断できるようにしておく。射程の長いブラスターであれば前進して倒す戦略がとりやすいが、射程の短いブラスターだと逃げたほうが得なことが多い。
  • スピナー: 射程とキルタイムが最強。中長距離でもキルタイムが短いので正面から近づくとすぐにやられる。裏をとりにいけないところに位置どられたらチャージャーに任せるしかない。逆に、チャージャーはスピナーを優先的に倒すようにしないといけない。
  • スロッシャー: 連射速度がブラスターよりも少しだけ短いのでうまく躱しながらやるとブラスターよりも圧倒的に強くなる。洗濯機は特に射程とダメージのバランスがよく中衛として人気がある。ほぼ垂直にインクがおちるので、シューターで斜撃ちが苦手な人には扱いやすいかもしれない。バケットスロッシャーは射程も長く2確のあたり範囲も少し広いので、上級者が持つと本当に強い。
  • シェルター: 傘を開くタイミングをうまく覚えると、単に連射で突っ込んでくるシューターや暴走イカスフィア、スーパーチャクチなどに対して防御ができるようになるので、戦術の幅が大きく広がる。傘を相手にしたときに開かれるタイミングもある程度予測できるようになっておくとよい。

射程の長いブキで射程の短いブキを倒すのが基本戦術になるが、射程の長過ぎるブキは射程が短くてもフットワークの軽いブキで工夫して倒すことができるようになっているので、自分が倒しやすいブキの相手を倒しながら、チームメイトと上手くタイミングをあわせて難しいブキ(上手いチャージャー)を倒しに行くようにする。たとえば味方がスペシャルやサブウェポンを使って相手を牽制している隙に裏に回り込んで倒すなど。

そのときになるべくうまく会敵することを心がける。射程の長いブキであれば正面からあたりにいってもよいが、基本的には first find first kill の原則に従って相手の死角から倒しにいくべきだ。したがって接敵方向は

後ろから > 横から >> 正面から

が有利な順番になる。もちろん後ろをとりにいったら、自分が相手に後ろをとられやすくなるし、相手のサイドにまわろうとしている時点で、別の敵に横腹を見せている可能性があることをお忘れなく。

味方チーム内のレベル差

みんな違ってみんないいので、4人集まれば当然上手いやつも上手くないやつも、相性のいいやつも相性の悪いやつもいる。さすがに下手なやつとか合わないやつばっかりとマッチングされるとこちらも人間なのでだんだんとテンションが下がってくるが、下手なやつは過去の自分だと思って責めすぎないようにしよう。責めたところで意味がないし、怒りをもたないように心がける方が簡単でコスパがよいからだ。全員のスキルレベルも必ず戦略、戦術に組み込んで行動するのがよい。切り込み隊長がいたら囮に使って裏にまわればよいし、あまり上手でない味方がいたら囮に使って敵を倒せばよい。もちろんこちらの行動が制限されたり難しくなることが多いだろうけど、本当に上手いやつはそれでも勝つといっていた。結果的に上手いやつが無双して勝ったようにみえても、そういういろんな駆け引きの上に勝利があるんだと思うことにしている。

地形

地形にあわせて有利なブキを選ぼう。理想的にはすべてのマップの地形と初動パターンを頭に入れておくのがよいが、そうでなくてもざっくりと頭に入れておくのがよいだろう。

平地vs凹凸の多い地形

ホテルオークラやモズク農園など、平地の多いマップでは見通しがよいので、射程の長いブキが有利だ。イカ速をつけて機動力をアップしても戦術の選択肢がひろがる。広い平地をなるべくよく塗っておくことで自由に移動しながら素早く移動して相手をつかまえて倒せるようになる。あと平地だとカーリングボム移動が捗る。

一方でハコフグ倉庫やタチウオパーキングなど凹凸の多いマップでは見通しが悪いので、射程の短いブキを使って物陰に隠れながら敵にアプローチしやすくなる。塗りが多少悪くてもなんとかなることもある。しかし凹凸の多いマップだからブラスターが有利か?というと個人的にはそう感じないことも多い。難しい…

細い地形vs広い地形

細い地形だといくつかのスペシャルウェポンが有利になる。具体的にはハイパープレッサーとマルチミサイルが逃げ場が少なくなるので脅威だ。時点でルールによってはアメフラシか。逆に丸く開けたマップだとこういうブキは扱いが難しいことがある。広い地形だと裏にまわるルートが増えることが多いので、インクアーマーやスーパーチャクチなど単独行に向いたスペシャルとメインウェポンを選ぶとよい。

駆け引き

「裏をとりにくべきかどうか?」は、おおまかにいって次のように考えている。

  • 正面で拮抗または押されていて打開したいときに有効
  • 正面で押している場合は無用なリスクになる(相手が裏をとってくる場合がある)
  • 戦線が溶けかかっているとき→裏をとれなくても横からいくべき
  • 裏をとられている場合(何度もやられている場合)→かならず殿を誰かがやる

裏を取ると効果が高いのは、↑で述べたように後ろや横から会敵した場合に1:1でも勝つ可能性が高いからだ。いちど勝って戦力差をつけた瞬間からランチェスターの二次法則でさらに戦力差がついていくので、状況を打開するきっかけになりやすい。では、「正面で拮抗または押されていて打開したいときに有効」と述べたが、こういうときに必ず裏をとりにいくべきか?については自明ではない。というか、これはスプラトゥーンだけでなく、人類の戦史上かなり重要なテーマである。

リデルハート戦略論 間接的アプローチ 上

リデルハート戦略論 間接的アプローチ 上

リデル・ハートの著書によれば、戦史上大きな戦果は裏をとりにいって相手に多正面作戦を強いるたときに、数の多寡に関わらず勝てるという結論になっている。では、裏をとりにいってよいときはどういうときか?これは、前線を維持できる限りにおいて裏をとりにいってよいと書いてある。つまり、拮抗状態を維持する工夫や、前線を崩壊させない工夫なしに前線を抜けたりしてはいけないのである。工夫というのは、たとえばマルチミサイルで回避行動をとらせて気をそらすとか、ボムなどで牽制してからこっそり後退するとか、まあスペシャルとかサブウェポンを使った、そういう工夫である。それでも勘のいいやつはマップをみて裏とりに気付くので、そういうときは味方にスペシャルつきで陽動をしてもらうとか連携が大事になってきたりする。

戦況把握

駆け引きというか、それ以前にこの先30秒〜1分間の行動を決定するのに最も重要なのが戦況の把握だ。これには2つ手段があって、TPSでの目視観察と、マップでの全体観察である。前者は、前線に近い場所で潜伏して5〜10秒ジッとしているだけで実は案外いろんなことがわかる。これを上手く使っていたのがMOTTYで、プレイ動画を参考にするとよいだろう。ちょっとジッとしているだけで相手に移動飛沫がみえたり、遠くでリスポーンするやつがいたり、チャージャーの射線がみえたり、ブラスターの爆風がみえたりする。裏を取りに変わったルートで回り込んでくるヤツもマップによっては見えたりする。これで相手の位置をきっちり特定すればその後の行動をきめて相手の不意をついて倒せるようになるし、相手が顔を出して攻撃してくるタイミングもおおよそ読めるので、私はかなり重視している。

後者のマップでの全体観察はよく言われることだが、ここからわかることは案外少ない。インクの塗り具合と、今どこが塗られているか、味方の位置と、インクで塗れている敵の位置がわかるくらいだ。きっちり自陣を塗った上でマメに確認することで、裏とりを未然に察知できるくらいだ。その割に目の前が見えなくなるし目がチカチカするしで個人的にはあまりメリットは少ないと思っている。

裏とりに気づいたら、おおっぴらに追いかけるのもよいが、相手のルートを予想して潜伏して、待ち伏せて華麗に倒すととても気持ちがいい。

対複数戦

多勢に無勢になってしまったときは、まず基本的には三十六計逃げるに如かずである。しかしまあどうにもならないときには、自分のまわりがある程度塗れているときに限って、

  • 近距離系のスペシャルで同時に倒す
  • 相手の射線がかぶるように位置どって一人ずつ倒す
  • 置きボムで逃げながら少しずつ倒す

現実世界だと逃げながら待ち伏せて一人ずつ倒すというのが可能だが、スプラトゥーンの世界ではみんな移動力が同じなのと、複数人だと交互に塗りながら進めるので実は単独で追うよりも速度が出てしまい難しいことが多いので、逃げるときは逃げると決めて逃げよう。スーパージャンプは相手に位置が特定されていないとき、発見されるまで時間がありそうなときにだけ使おう。

相手の動きを読む、コントロールする

ボムを右側に投げ込んでおいて左側に出てくるのを待つ

動きを読む
 戦況把握
 敵陣奥深く、前線よりちょっと奥で潜伏して後ろからキル
 なるべく丹念にリスポーン〜前線までのルートを塗っておいてリスク回避
 隠れてそうな物陰を遠くから塗ってみたり、センサーを投げてみたりする

定跡(だと思っているもの)

エリア

 エリアの中に入らない
 潜伏系の戦術があまり通用しない
 回り込んで相手の人数減らせるかどうか
 エリア確保できたら押し込んでいくのが基本
 エリアは逆転要素少ないので実力が如実に出る

ホコ

 ホコの位置を常に確認
 ホコを割ると周囲が塗れるので有利
 割るのに必死になっていると横からやられる場合がある
 相手の人数を減らしてからホコを運ぶのが基本
 相手の虚をつければ人数を減らせてなくても勝てる
 ホコのルート選びがセンスを問われる
 ホコが最強のブキなので撃ちまくる
 エイムがよければ警備は不要
 裏とられると弱いので、後ろに護衛が必要
 誰がホコを持つか?問題

ヤグラ

 誰がヤグラに乗るか?問題
  できればチャージャーかスピナーなど射程の長いブキが乗るべきだが、地形次第では難しい場合も
  うまくサポートに回れるチャージャーなら、射程の短いブキでも乗るべき
 ヤグラから降りるタイミング
  敵が近づいてきているが、1:1でも倒せそうな相手の場合は降りて倒す
  降りずに倒すのがベストだが物陰を利用されたりフットワークのよい相手だと難しい
  味方がジャンプしてきている場合
  自分よりもふさわしい味方が乗ってきた場合(ラスト30秒以外)
 ヤグラから降りるべきでないとき
  周囲が完全に塗られていて孤立している場合
  多勢に囲まれていてカウントを更新し続けている場合は1つでもカウントを進めるべき
  味方がジャンプしてこない場合
 ヤグラは裏をとられにくいが、それでも裏に回ってくる場合があるので余裕があるときにマップなどで確認
 ヤグラの上ではジャンプしない
 ヤグラの上ではインクチャージ以外で潜伏しない
 ヤグラに乗ってない人はクリアリングまたは前線開拓に専念する
 ブラスター対策
  斜撃ちを練習してマスター

アサリ

 難しい、未だに慣れない
 9まで貯めといてアサリをひとつずつ投げながらコッソリゴールまで移動する
 ボールができたら、ゴール下にいる味方に向かってスーパージャンプする
 ディフェンスが案外大事で、味方が攻め気のときに一人残ってクリアリングしつつ、↑のような裏とりを防ぐ

復習

stat.inkイカリング2 | スプラトゥーン2 | Nintendo Switch | 任天堂を使うと、各バトルのStatsが見れるので、次のバトルまでの短い時間でよいので、バトルでの自分の手応えと、実際のStatsを見て感覚を修正する作業を怠らないこと。手応えないな~と思ってたら意外と苦戦していたり、キル数で差がついていなくてもデス数で差がついていたりすることもあるので、僕は必ずやることにしている。あと勝ったときもね!

まとめ

自分がスプラトゥーンを何百時間かやったり動画をみたりして、いろいろ思っていたのを言葉にしてまとめてみた。基本的には、個別の知識よりも全体的な考え方とか、抽象的な考え方と、どこでも応用できる基本動作に絞って初級〜中級くらいの難易度でまとめた。ネットで言われていることやまとめサイトに書かれていることが膨大すぎてちょっとダルいし体系だってないので、自分向けに基本を忘れないようにできたらいい。

*1:私はマニューバーだけがどうしても苦手だったりする

*2:正確にはスプラトゥーンの世界では放物線にインクが飛ぶことはないが、まあ現実に対するアナロジーとして

Ergo42 というキーボードを自作した

学部時代、研究室で雑談しているときに自転車の話になって、バーハンドルとドロップハンドルのどちらがよいかという話になったときに先輩が「人間の腕はこうついてるんだよ、こうじゃないんだよ」といって前ならえのポーズをして主張したことがあった。確かに前腕を前に出したときに、手のひらを前にむけて指を上にむけるよりも、前ならえの格好のように手のひらを内側に向けて指を前に向けた方が人間の骨格や筋肉がより自然な状態に近くなり、緊張している部分が少ないことがわかる。健康のためには、なるべく自然な姿勢でいなければならない。というわけでセパレート型のキーボードを自分で組んで職場で使っている。自作PCくらい簡単だった。

Deployed Ergo42! Very compact

A post shared by Kota UENISHI (@kuenishi) on


背景

わたしのようなデスクワーカーはキーボードにタイプをするのが仕事の一部なわけで、一日のうち少なくない時間をこれに費やしている。
Community Blog - 握力王 vs 日本男児 ヘルシーすぎるプログラマ対談(Part2) でも述べられているように、上半身の健康のためには人間の身体がなるべく自然な状態でキーボードを使えるようにするために、人類はセパレート型のキーボードを使うべきである。ちょっと誇張したかもしれない。実際私は既にKinesisユーザーであったが、卓上でスペースをとりすぎる、幅が固定されているなどの問題があって、次はErgoDox-ezを使った。Ergodox-ezにしてよかったのは、幅や位置を自由にできる、卓上のスペースを少し節約できる、キーボード配列をファームウェアレベルで変更できるということだ。特に配列を自由に組めるというのはとても便利で、OSの設定を変更しなくてよいとか、どのマシンにつないでもすぐ使えるというメリットがあって、我々のようにたまにマシンを複数台使い分けるようなケースでこれが以外と便利なのだ。それでKinesisっぽい配列を自分で作ってしばらく職場で便利に使っていた。

/* Keymap 0: Basic layer
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |   =    |   1  |   2  |   3  |   4  |   5  | Esc  |           | Meh  |   6  |   7  |   8  |   9  |   0  |   -_   |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * | Tab    |   Q  |   W  |   E  |   R  |   T  | Alt  |           | L1   |   Y  |   U  |   I  |   O  |   P  |   \|   |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | LCtrl  |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |  ;:  | '"     |
 * |--------+------+------+------+------+------| Alt  |           | L2   |------+------+------+------+------+--------|
 * | LShift |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |  /   | RShift |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   | `~   |  \|  | Alt  | Left | Right|                                       |  Up  | Down |   [  |   ]  | Alt  |
 *   `----------------------------------'                                       `----------------------------------'
 *                                        ,-------------.       ,--------------.
 *                                        | Ctrl | Alt  |       | Cmd  |Ctrl   |
 *                                 ,------|------|------|       |------+-------+------.
 *                                 |      |      | Home |       | PgUp |       |      |
 *                                 | BS   | Del  |------|       |------| Enter |Space |
 *                                 |      |      | End  |       | PgDn |       |      |
 *                                 `--------------------'       `----------------------'
 */

とくにこの配列で気を付けたのは、Emacsenは小指が命、小指でCtrlを押すように出来上がってしまっているので、この配列が変わってしまうと生産性が 1/10 になってしまうことだ。そういうわけでしばらく既製品のErgoDoxで満足していて、キーボード自作ブームとは少し距離をおいていた。

…しかし、やっぱり机を広く使いたかった。

とりあえず何か作ってみる

自分はミニマリストではないので、MiniDoxとかPlanckにはあまり惹かれなかった。キー数が少ないとレイヤーを切り替えながら使うことになるのだが、キーボードを小さくするのにキーストローク数が増えてはかえって効率が落ちて本末転倒だと考えたからだ。なのでErgoDoxと似たような配列でサイズが小さくなった感じのIrisを…と思ったら在庫切れていた。で、岡本さんに教えてもらったErgo42も勢いでとりあえずポチった。 当時のEarly Birdで rev1 を買った。今は入手方法は違うかもしれないが、PCBの設計はGitHubで公開されているので、いざとなれば自分でメーカーに注文して焼いてもらうこともできるだろう。調べたら今は5枚から安く作れるようになっているようだ。先輩方に教えてもらいながらAliExpressでパーツを大量に買いまくった。失敗してもいいように、必要量の2倍くらい買った。それでもAliExpressは安くて、秋葉原や日本の通販サイトで買うよりもかなりやすい。

  • TRRSジャック( PJ320A headphone jack)
  • TRRSケーブル
  • キースイッチ
  • キーキャップ
  • 1N4148ダイオード
  • Pro Micro
  • タクタイルスイッチ

ネジとかケースはErgo42もIrisもPCBに付属しているので、とりあえずそれでよい。理想の形を追求するときはまた考えるけど…さすがに香港シンガポール深圳からエアメールで届くので時間はかかる。早いもので2週間、長いやつで3週間ちょいくらいだったかな。

Keyboard DIY parts, all get ready

A post shared by Kota UENISHI (@kuenishi) on

半田セットも、小学生のときに使ってたものを去年か今年捨ててしまったばかりだったので、改めて買い直した。面倒なのでこのあたりは全部HAKKOで揃えた。高温になる部品だし信頼性を優先して国産でちゃんとしたものを yodobashi.com で買い揃えた。

あとは半田吸いがあると、失敗した半田をやり直すのに役に立つ。テスターは適当に秋葉原でダイオードチェックができるやつを買った。

実際に組む

本家のREADMEはキーボード組むのに慣れている人には十分だが、初心者には難しいので、写真つきで詳しい解説のある
自作キーボード (Ergo42) を組み立てた - Qiita を参考にするのがよいだろう。というか、組むことが目的ならこの記事を見るだけでよくて、以下の私の文章は特に読む必要はない。しかしErgo42だけでなく、半田づけとかキーボードづくりのノリを学ぶために他のキーボード自作の記録をネット上でよく見ておくとよいと思う。手順はそんなに複雑ではないけど、ここでも私の理解を並べておこう。

1. ダイオードをさす

こんな感じで、全部さしておく。曲げるのは本当はリードベンダー( サンハヤト リードベンダー RB-5 リード線、部品の簡易折り曲げ器 )を使った方がよいが、まあ手で曲げても疲れるのと不格好なのを我慢できれば問題ない。このときダイオードの向きを間違えると動作しないので注意。

A post shared by Kota UENISHI (@kuenishi) on

これをひとつずつ半田づけして、余ったワイヤーをニッパーで丹念に切っていく。だるい。これで徐々に半田に慣れておくと、ロジックボードやタクタイルスイッチ、TRRSジャックなどのちょっと難しい半田づけもやりやすくなるだろう。基本的には、付け根をぐっと小手先で抑えて熱しながら半田線を当てると、ある温度になった瞬間に半田が接合面にシュッと吸い込まれているので、その瞬間を逃さずに半田線をパッと離す。ダラダラ半田線をつけているとどんどん溶解してダマになってしまう。小手を離すのが早いと半田線が接合面についたまま冷えてしまって半田線がとれなくなってしまう(それを離すためにまた小手で加熱すると不要な半田が接着部に流れ込んでダマになる)。

自信のない人や、はんだ付けが初めての人は先にプロの解説講座を一通り読むことを強くすすめる。脳内でシミュレーションしたり、別のボードを買って練習しておけば絶対に私よりも上手にできるようになっていることだろう。私は子供時代にはんだ付けしたことがあったという謎の自信だけがあり、時間が勿体なかったのでざっとナナメ読みだけして半田セットの機器選定だけ参考にした。

ダイオードを全部さしたら、テスターでダイオードの動作確認をきちんとやっておこう。ダイオードは片方向にだけ電流を流すことができて、反対方向には電流が一切流れない電子部品である。ダイオードモードのあるテスターを買っておくことが望ましいが、そうでなければ抵抗測定で代用してもいいだろう。とりあえず全部のダイオードがショートしていないこと、接着面が導通していることを確認しよう。

テスターのダイオード測定モードは電流を少し流して雑に測るもののようで、このあとの導通テストも全部ダイオード測定モードでやってしまえるくらい万能である。ダイオード測定モードのついているテスターを必ず買おう。ボタン電池で動くやつがコンパクトでいいと思う。こういうやつ。

2. 他の電子部品をはんだ付けする

タクタイルスイッチ、TRRSジャック、Pro Micro。Pro Microは表裏を間違えずにやること。Pro Microの足が多く間隔が狭いので、ここがショートしてしまうとあとで動かなくなる。接着に成功したら、タクタイルスイッチとTRRSジャックの導通はこの時点で確認しておこう。タクタイルスイッチはボタンを押している間だけ導通する。TRRSジャックは、ケーブルをつないで、左右のそれぞれの電極「だけ」が導通していることをチェックしよう。

3. キースイッチをつける

安物のキースイッチだと信頼性に不安があるので、キースイッチを全部フレームにはめた時点で導通を確認しよう。キースイッチは、キーを押している間だけ導通していること、キーを押してないときは絶縁していることを確認する。それをPCBにはめる。PCBの穴にキースイッチがはまると仮止めになるので、あとは順にはんだ付けしている。はんだ付けが終わったら、接着面をテスターで抑えながらキースイッチを押して導通を確認しよう。キースイッチを押しても導通しない場合ははんだ付けに失敗しているか、キースイッチが不良品のどちらかのケースだ。

私の場合は、フレームをはめるのを忘れて、キースイッチを直接PCBにはめ込んで全キーはんだ付けした後にフレームをつけるのを失念していたことに気付いた(というか、ドキュメントなどをろくに読まなかったのでフレームを先につけないといけないことを知らなかった)ので、一旦PCBにはんだ付けしたキースイッチを全て外してから(一つずつ半田を熱して引っ張ってとるという危険な作業)、改めてフレーム越しに半田づけするという残念でアホな失敗をとりかえす作業で3時間以上ロスをした。この過程でキースイッチが5,6個ダメになったのだが、それに気づけたのは、適当なタイミングでテスターを使ってテストをまめに繰り返していたからだ。

キースイッチがついた時点で、物理的な配線は全て完了している。本格的にネジなどで組み立てる前にこの時点で各種テストを行っておくののがよい。

4. 回路テスト

テスターでの導通テストはここまでで一通り済んでいるはずなので、ここではパソコンにつないでキーを使えることをテストする。片側だけでいいので、 Pro Micro をパソコンに接続して、ファームウェアをインストールする。(Macであれば port install avrdude などとしてQMK用の環境を整えておこう)

$ git clone git://github.com/qmk/qmk_firmware
$ cd qmk_firmware
$ make ergo42/rev1:default:avrdude

Linuxの場合は最後のMakeはroot権限が必要になるだろう。クロスコンパイル環境やavrdude が入っていれば、この時点で ...... という入力待ちになるので、タクタイルスイッチをポチッとするとファームウェアの書き込みが行われる。

ファームウェアの書き込みが終わったらUSBキーボードとして使える状態になっているので、ひとつひとつのキーを全部押して動作確認をする。デフォルトの配列はソースコードに次のように書かれている。

/* BASE
 * ,------------------------------------------------.   ,------------------------------------------------.
 * | ESC  | Tab  |   Q  |   W  |   E  |   R  |  T   |   |  Y   |   U  |   I  |   O  |   P  |   [  | Bksp |
 * |------+------+------+------+------+------+------|   |-------------+------+------+------+------+------|
 * | Del  | RCtrl|   A  |   S  |   D  |   F  |  G   |   |  H   |   J  |   K  |   L  |   ;  |   ]  | Enter|
 * |------+------+------+------+------+------+------|   |------|------+------+------+------+------+------|
 * | SYMB | LSft |   Z  |   X  |   C  |   V  |  B   |   |  N   |   M  |   ,  |   .  |   /  |  UP  | RSft |
 * |------+------+------+------+------+------+------|   |------+------+------+------+------+------+------|
 * | META | LCtrl|   `  |   \  | LAlt | LGUI |Space |   |Space |   '  |   -  |   =  | LEFT | DOWN | RIGHT|
 * `------------------------------------------------'   `------------------------------------------------'
 */

右側のPro Microを挿したときも同様にファームウェアを書き込む。このとき、配列は右側のそれではなく左側の裏返しのようになるので注意すること。

これで正常動作しないキーがあったら、そこのはんだ付けかパーツがおかしいことがほとんどなので、それを再度確認して戻って直す。ほとんどないと思うがPCBが万が一破損していたら別のPCBでやり直すしかないだろう。

再確認できたら、左側のPro Microをパソコンに接続して、TRRSケーブルで左右をつないで全キーの動作確認する。左右の確認がそれぞれできていたら、全体の大抵は動く、はず…。ちなみに私がやったときはここまで何度の手戻りして、ここまでで午前5時くらいだったはず。平日にやるもんじゃない。

5. フレームなどを整えてキーキャップをさす

ここはまあTrivialといえばTrivialだし、楽しいといえば楽しいところ。予め買っておいたキーキャップを淡々とはめていく。

It’s 5am when I finished. My first DIY keyboard.

A post shared by Kota UENISHI (@kuenishi) on


6. キーボード配列を考えて実装する

ErgoDoxから 4x7 の配列になってキー数が大幅に減ってとても困っていてここはわりと悩んだ。悩んでいまのところこういう配列になった。

/* BASE
 * ,------------------------------------------------.          ,------------------------------------------------.
 * | ESC  | Tab  |   Q  |   W  |   E  |   R  |  T   |          |  Y   |   U  |   I  |   O  |   P  |   [  |  ]   |
 * |------+------+------+------+------+------+------|          |-------------+------+------+------+------+------|
 * | LCtrl| LCtrl|   A  |   S  |   D  |   F  |  G   |          |  H   |   J  |   K  |   L  |   ;  |   '  |  \   |
 * |------+------+------+------+------+------+------|          |------|------+------+------+------+------+------|
 * | LSft | LSft |   Z  |   X  |   C  |   V  |  B   |          |  N   |   M  |   ,  |   .  |   /  | RSft |      |
 * |------+------+------+------+------+------+------|          |------+------+------+------+------+------+------|
 * | META |      |      | LGUI | LAlt | Bksp |Space |          |Space | Entr |      |                    | SYMB |
 * `------------------------------------------------'          `------------------------------------------------'
 */

METAを押している間レイヤーが切り替わって、最上段で数字を打ち込めるようになる。またSYMBを押している間は最上段+Shiftを押した状態をイメージして、各種記号を打てるようになる。ちなみにこれは読みやすくしたソースコードのコメントなので、本体このコメント直下のマクロを並べたものである。このコメントだけ書き換えて下のマクロを直し忘れて、いざファームを書いても反映されない…?ということがよくあるので、注意するとよい。

で、これはデフォルトとは違う配列なので、改めて standard という適当な名前のディレクトリをコピーで作って、それにあわせて次のようにビルドして書き込む。

$ make ergo42/rev1:standard:avrdude

最後の :avrdude をとるとファームウェアをビルドするだけになるので、Linuxだとルート権限がいらなくなる。

というわけで、できあがり。最初はちょっと違った配列だったのだけど、職場でもちょいちょい配列を組み直したりして業務改善して上記の配列になった。今は冒頭の写真とはちょっと違ったキーキャップがささっていて、自分で油性ペンで適当に "[] \ ⬆" などの記号を書き足したりしてある。

おまけ

Ergo42パーツが全部揃って、さあやるかといったときにIrisのPCBも届いて大変なことになっているけど、またやろう。ロープロファイルを作りたい。Kalihの キースイッチはAliExpressにあるんだけど、果たしてこれはOKなやつなんだろうかとか、キーキャップたけえなあ ( Kailh Low Profile Keycaps - Blank – NovelKeys, LLC , Kailhロープロ無刻印キーキャップ | 遊舎工房 SHOP )… ってなってる。