雑記

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

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 )… ってなってる。

トップレベルのコンピュータエンジニアなら普段からチェックして当然の技術系メディアN選

〜〜が知っておくべきサイト20選とか、エンジニアなら今すぐフォローすべき有名人とか、いつも釣られてみにいくと全く興味なかったり拍子抜けしたりするわけだが、こういうのが並んでいたらあまりの格の違いに絶望してしまうだろうというものを適当に並べてみた。私が見ているわけではなくて、こうありたいと思っている私の願望である。どちらかというとインフラ系とか基盤系のものに偏っているが、あくまで私が興味ある一連の例だと思ってください。「これが入ってない!」というクレームは受け付けますので、是非教えてください。一緒に成層圏まで意識を高めましょう。

情報サイト、有名ブログ

Software Engineering Radio : IEEEが主催しているソフトウェアエンジニア向けのPodCast。データベースからフロントエンド、暗号、ハードウェア、マイクロサービス、などなどとにかく多様なジャンルの最新のトピックの著名人を連れてきてインタビュー形式でいろいろ語らせるというものだ。とにかく質問が上手くて、全然背景知識がなくても基本的なことから全部説明させる。たとえば、あなたの会社はどのようなビジネスをしていますか?みたいなところから上手く技術的なところに帰着させる(そんあ質問が本当にあったかどうかは忘れた)。基本的に話が上手い人ばかりなので、英会話が苦手な我々でも単語は分かるしノリに慣れればわりとよく聞ける。

The Morning Paper : Adrian Coyler という学生?かな?計算機科学徒が学期中にひたすら毎朝論文を読んでザックリとメモを残していくというブログ。論文のチョイスがいいところを突いていて、適度に深く適度にホット、それでいてたまに古典に戻ったりするので、ああ向こうではきっとオフラインでこういうのずっと話してるんだろうなあと思わせる。これに出てくる論文を我慢して全部読んでいけばかなり広範な知識が手に入るだろう(とはいえ、ひとつの論文をじっくりよんで内容を実装すことも大事なので数こなすだけではダメだ)。

追記:


Peter Bailis: Highly Available, Seldom Consistent | Peter Bailis : Peter Bailisという、分散システム界の有名人のブログ。UCBの学生だったのがいつの間にかStanfordでポストを手に入れたぽい。RAMP TransactionとかI-Confluenceとかああいった話は全部ここから来ている。この人を追えばStanfordでも分散システム系の動きは大体追えるんじゃないかっていう気はしている。

The Next Platform : ちょっと変わって普通のメディア。これはまあ適度にナウくてライトで分量もそれなりなので、興味のあまりない話題を適度に拾って「そんな世界もあるんだ〜」と追うのに向いている。

スーパーコンピューティングの将来 : GRAPEを開発したことで知られる牧野淳一郎先生がわりと真面目にコンピュータとかそれに付随する話題について語った一連の文章。非常に読み応えがあるけど更新が少ないので、もっとしっかり追いかけたい人は先生のTwitterを見ておくのがよいだろう。

Aphyr : データベース界に衝撃をもたらしたJepsenを開発した孤高の筋肉野郎Kyle Kingsburyのサイト。彼のおかげで世のデータベースはだいぶ安全になったし、ネットワーク越しの分散が実はとても難しいんだと知った人は多いのではないだろうか。なんか最近はKSPやってるみたいだけど…そういえば彼のTwitterはたまに重要な情報が流れてくるけど、フォローするのはちょっとした覚悟がいる。

All Things Distributed : 言わずと知れたAmazon CTOのブログ。正直AWSの新サービスとかAWSの話はあまり興味はないのだけど、たまに Back to Basics という、CSの古典論文を思い出して読んだメモをここに書くことがあって、それはとても面白いので一応フィードに登録だけはしてある。

Perspectives – James Hamilton's Blog : AWS の実質CTOといわれるJames Hamiltonのブログ。こちらの方が技術的な内容が多い。

https://danluu.com/ : MSやGoogleでエンジニアをやっていたDan Luuという人の記事。コンピューターに関する知識や洞察が非常に深く、とても実用的だけど普段の仕事ではなかなか身につかない、手の届かないかゆいところに届くような知識が沢山書いてある。

企業系

重要なOSSや論文は最近は大学ではなく企業の研究開発機関から出てくることが多くなった。

Facebook Research / Publications – Facebook Research : Facebook Research は深層学習やWebだけでなく、分散システムやネットワークなどのより基礎的な分野でも重要な研究を多く発表して世界をリードしている。個人的にはGoogleのようなチート感もAmazonやMSのような感じもなくていちばん親近感を持っている。

Google Research Blog https://research.googleblog.com : まあ言わずとしれたGoogleの研究成果を発表する場所。計算機科学に関する研究開発は、その質も量も圧倒的に他社を引き離して2周ほど先を行ってる感じがある。本当は Publications の方を直接追いたいんだけど、こっちはRSSがないので…。

Dropbox Tech Blog : SE Radio で出てきたExodus from AWS の話を聞いて購読を始めた。それまでDropboxって大したことしてないのかなあと思っていたけど、PythonだけでなくGoやRustも使いこなして自前で高効率のストレージを構築したというのだから私の目が曇っていたのだった。いちいちセンスがあって感動する。

Netflix TechBlog – Medium : Webサービス界の巨人Netflixの技術ブログだ。話題は多岐にわたりNetflixのサービス運用、配信系、マイクロサービス、OSS、Brendan Greggという、ストリーミングだけでなく高パフォーマンスなシステムを作るのに欠かせない話題が山のように出てくる。

Google Open Source Blog : グーグルがOSSの話を出すところ。Researchと違って実用的だったりインターンの話だったりする。ガチじゃないゆるふわ勢の癒やしになるかも。

Blog - Microsoft Research : MSといえばSurface, Azure, Windows ... といったなんとなくザックリなイメージかもしれないけど、計算機科学の研究としても一流です。私が興味のある分散システムやデータベース、データセンターネットワークについては長い歴史に裏打ちされた面白い発想のものが山のように出てきます。Googleもそうなんだけど、歴史があって昔のことをしっていると、自分たちが考えたことだから簡単に前提を否定してスクラッチから考え直すことができるみたい。

O'Reilly Japan - Books :: New and Upcoming : ちょっと毛色がかわるけど、技術書ならオライリーということで、Twitterで宣伝されるのではなくここで新刊情報を余計なバイアスやフィルターなしで、いち早くみておくとよい。SNS経由の紹介だとポジティブな宣伝も多いけど、宣伝だけ見ていてもダメなので。

トップカンファレンス

ツイッタばかりみてると有益な情報は少なくて密度は少ないですね。えっあなたのFollowがおかしいって?うっ否定はしない。そこで最新の研究をいち早く追うためにトップカンファレンスを見たほうがよい。今メジャーになって普及しているOSSも、こういったトップカンファレンスで登場したものがOSSだったり、OSSで実装が登場したりする。たとえばHadoopだったりMesosだったり、Kubernetesだったり。TensorflowのもとになたDistBeliefは有名なNIPSが初出だ。

SOSP 2017-Symposium on Operating Systems Principles : SOSPはまあそのタイトルの通りOSの基本的なことに関するカンファレンスだけど、まあ割といろいろ広範かな。UsenixとSIGOPSだったとは(今知った)。西暦奇数年の10月くらいにやる。

NSDI '18 | USENIX : NSDIはネットワーク界で不動のトップカンファレンス。誰が何と言おうと文句なしでトップ。

OSDI '18 | USENIX : SOSPがPrincipleなのに対してOSDIはDesign and Implementationsなのでちょっと実装寄りの話が多い、かもしれない。こちらは偶数年の10月に開催なので、OSに関しては理論と実装がとても近い現代、まあ大体ジャンルはかぶっているといえばかぶっている。

USENIX ATC '18 | USENIX : Usenix ATCはまあ言わば全国大会みたいなもんだろうか。とはいえShort paperではなく6ページくらいは書いてある。

Call for Participation | LADIS 2018 : LADIS は巨大システムの運用技術とかの話題が多い。その流れで有名サイトや有名システムの内容がちょろっと出てきたりするのが面白い(だったような)。

SysML Conference : 初回なのに参加者登録が15分で売り切れて、2nd authorがカンファレンスに参加できなくなってしまうほどの大人気カンファレンス、SysML。同名のソフトウェアと論文がI◯Mから出ていた気がするが細かいことは忘れて…機械学習を支えるシステム技術に関するカンファレンス。あー今年の分みなきゃ。まだみてない。

arxiv.org/cs Computer Science authors/titles recent submissions : カンファレンスやジャーナルよりもいちはやく最新の研究成果が集積されることで有名な Arxiv の計算機科学分野の論文たち。これを全部毎日読んだら最強になれると思う。ただし一日あたり100〜300くらい流れてくる。

arxiv.org/cs.DC Distributed, Parallel, and Cluster Computing authors/titles recent submissions : CS全体だとちょっと多すぎるのと分野が散漫になるので、こちらも見て分散システム関係で見落としがないように気を付けている。

arxiv.org/cs.DB Databases authors/titles recent submissions : いまは見てないけど、Arxivのフィードでデータベースまわりに絞るならこちら。ただ機械学習分野と比べて流量は少ないのでDB技術者はSIGMODやVLDBを追う方にリソースを割いた方がいいだろうなとは思う。

その他(もう解説疲れた、みんな知ってるよね?)

  • ICME
  • EuroSys
  • VLDB
  • SIGMOD

適切な解像度で物事をみるということ

タイトルに書いてしまうと書き終えた気になってしまうのだが…大人として社会に生きる以上は何事にも目をつぶっていくことはできない。ある物事に対して、関わりが少なければボンヤリとした理解でいいだろう。関与が薄い場合は善意も悪意もなく無関心であるからだ。もちろん、例えば児童虐待のように無関心では済まされない問題もあるけれども、◯◯に無関心では済まされないというのは内容や社会のあり方によって変わってくるからだ。これは良し悪しの問題ではなく、単にそれぞれ時代や背景、事情があるということだ。

積極的に関わっていくのであれば高い解像度で対象を理解しなければならない。細部まで理解した上で全体最適になるような問題を定義して解決法を考えるのがよいだけなのだが、それをしないで、曖昧な理解のまま関与を深めていくと大抵事態は悪化する。そういうものは大抵「関与してる俺意識高くてハイアー・マインドかっこいい」といった自意識から生じるものが多く、そもそもそういった目的であれば詳細など不要であるから解像度は低いままで、なんとなくの理解で進んだ方がいろいろ都合がよいことが多い。

高い解像度で理解できるようになって初めて、その視点を再度遠くに戻して解像度をあえて下げることで大局的な理解もさらに進めることができるし、高い解像度に基いた根拠のある状態であえて解像度を低くして抽象的に考えることも重要だ。はー、Convolution2D勉強しなきゃ…

FreeBSDサーバーのディスクを壊れてないけど交換...と思ったら別のところが壊れた

こういうことです

A post shared by Kota UENISHI (@kuenishi) on

まとめると…

  • 2TBx4 の構成だったけど年末セールで安いゾってので 4TBx4 に換装するかーと思ってハードディスクを手配
  • 一枚ずつ zpool replace していく作戦
  • メーカーによって replace の性能が全然違う
  • そうこうしているうちに zroot に使っていたSSDがREAD_ERRORを吐きはじめてピンチ
  • そっちを対処
  • なんとか時間をかけて 4TB x4 にアップグレード


これまでの構成は

  • ada0 - SSD 128TB
  • ada1 - SG 3TB ada1 as 予備
  • ada2 - WD 2TB diskid/DISK-WD-WMC4M0F82E9F
  • ada3 - WD 2TB diskid/DISK-WD-WMC4M0E8R6PS
  • ada4 - TSB 2TB diskid/DISK-25RE667AS
  • ada5 - TSB 2TB diskid/DISK-25RE65JAS

で、

# zpool create data mirror ada2 ada3 mirror ada4 ada5 

という感じで作ってある(実際の名前は何か知らんけど再起動のときに変わった)。ところが、2017年の写真をアーカイブして保存して、いろいろやっていたら残り容量が330GBほどになってしまって、あと2年以内に一杯になることがわかった。

%> df -h | grep data
data                  918G    587G    332G    64%    /data
data/user             2.6T    2.3T    332G    88%    /data/user
%> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
data   3.62T  3.19T   448G         -    30%    87%  1.00x  ONLINE  -
zroot   109G  18.8G  90.2G         -    19%    17%  1.00x  ONLINE  -

やはり空き容量は3〜4割程度に維持しておきたい。ちょうどいいことに、手元にうっかり買ってしまったSeaGateの4TB HDD2枚と、WDの4TB HDDが3枚あるので全部リプレースする。最終的には

# zpool create mirror ada2 (SG) ada3 (WD) mirror ada4 (SG) ada5 (WD)

といった感じにしたい。WDの4TB玉がひとつ余るが、それは予備の遊び場として ada1 あたりにつけておく。

初日 (1/8夜)

リプレース作業開始。まず箱を開けないで、試しに予め ada2 に刺さっている予備の 3TB 玉で gpt/system とかいう変な名前(こういう名前は zpool status で確認しておく)の2TB玉を交換。

%> sudo zpool replace data gpt/system ada1 

これの完了にだいたい1日くらいかかった。これで一日一発という交換ペースが確立。

二日目 (1/9夜)

前日のresilveringが完了していることを完了して、箱をあけて gpt/system とかいうふざけた名前(今はどこにもマウントされないはず)の ada2 を SeaGate の 4TB 玉に換装。マザーボードのどのSATAポートがどの玉に繋がっているのか、KKDで当てるのが醍醐味。無事に交換できたら、 まずは試しに

%> sudo zpool create tank ada2
%> ls /tank
%> sudo zpool destroy tank

などとやってちゃんと使えること ( /tank にマウントされていること ) を確認する。確認できたら壊す。壊したら

%> sudo zpool replace data diskid/DISK-WD-WMC4M0E8R6PSp1 ada2

で交換。 zpool status の結果は

  pool: data
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Tue Jan  9 22:29:28 2018
        28.8G scanned out of 3.19T at 168M/s, 5h29m to go
        14.2G resilvered, 0.88% done
config:

        NAME                                 STATE     READ WRITE CKSUM
        data                                 ONLINE       0     0     0
          mirror-0                           ONLINE       0     0     0
            diskid/DISK-25RE667ASp1          ONLINE       0     0     0
            diskid/DISK-25RE65JASp1          ONLINE       0     0     0
          mirror-1                           ONLINE       0     0     0
            ada1                             ONLINE       0     0     0
            replacing-1                      ONLINE       0     0     0
              diskid/DISK-WD-WMC4M0E8R6PSp1  ONLINE       0     0     0
              ada2                           ONLINE       0     0     0  (resilvering)

となり、ディスク交換が始まったことがわかる。

三日目朝 (1/10)

さてさて終わってるかな、と思ってサーバー覗きにいったらそもそもつながらない。再起動してもダメ。あわてて押入れからディスプレイ出してさしてみるも正常稼働していたので、インターネットつながらないしこりゃルーターがダメなんかなと思って再起動したらつながってホッとした。慌てている状況でも冷静に切り分けすることが重要です。そろそろフレッツのルーターも換え時っぽい…

さて replace の進捗はどうかなと思って見にいったら予想に反して全然進んでいない。zpoolでresilveringの様子をみても 15M/s くらいか出ていなくて、このままだと35時間くらいかかるとかいう。はて…( ゚д゚)ハッ!この新しいディスクはあのメーカーのやつだ!ということで確信めいた状態で smartctl する。smartctlの結果そのものは正直分からないし、ベンダーにとって意味があるんだろうけど、かかった時間が非常に示唆的でありまして…

%> for n in `seq 0 5`; do time sudo smartctl -a /dev/ada$n > ada$n.txt; done
sudo smartctl -a /dev/ada$n > ada$n.txt  0.02s user 0.02s system 87% cpu 0.047 total
sudo smartctl -a /dev/ada$n > ada$n.txt  0.03s user 0.02s system 23% cpu 0.192 total
sudo smartctl -a /dev/ada$n > ada$n.txt  0.03s user 0.01s system 0% cpu 5.412 total
sudo smartctl -a /dev/ada$n > ada$n.txt  0.03s user 0.01s system 40% cpu 0.090 total
sudo smartctl -a /dev/ada$n > ada$n.txt  0.03s user 0.01s system 3% cpu 1.269 total
sudo smartctl -a /dev/ada$n > ada$n.txt  0.02s user 0.02s system 3% cpu 1.277 total

というわけで、 ada2 の再交換決定。昨夜 iostat 流したらどうもスループットがでてなくて怪しいなと思っていたんだが、道理でダメなわけだ。とりあえず、 ada2 をreplaceから外す。

%> sudo zpool detach data ada2

これだけでmirror-1のreplaceのタスクがキャンセルされたらしく、無事に前の状態にもどってscrub (resilvering) が再開されたようだった。"zfs disk failure during replace" とかで検索しても何もみつからなくて不安だったけど、ドキュメントから類推したらバッチリだった。また筐をあけて玉を交換して、試してみる。

%> for n in `seq 0 5`; do time sudo smartctl -a /dev/ada$n > /dev/null ; done
sudo smartctl -a /dev/ada$n > /dev/null  0.03s user 0.01s system 91% cpu 0.042 total
sudo smartctl -a /dev/ada$n > /dev/null  0.03s user 0.01s system 12% cpu 0.344 total
sudo smartctl -a /dev/ada$n > /dev/null  0.04s user 0.00s system 14% cpu 0.332 total
sudo smartctl -a /dev/ada$n > /dev/null  0.03s user 0.01s system 26% cpu 0.163 total
sudo smartctl -a /dev/ada$n > /dev/null  0.04s user 0.00s system 3% cpu 1.393 total
sudo smartctl -a /dev/ada$n > /dev/null  0.02s user 0.02s system 2% cpu 1.509 total

これなら大丈夫でしょう、ということで再度同じものを replace する。

%> sudo zpool replace data diskid/DISK-WD-WMC4M0E8R6PSp1 ada2

流れているかウォッチ。

%> iostat  -n 6 1                                                            
       tty            ada0             ada1             ada2             ada3             ada4             ada5             cpu
 tin  tout  KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s  us ni sy in id
   1   290 17.14   4  0.06  111.99 171 18.72  120.54 590 69.49  118.04 442 50.95   7.82  28  0.21   7.91  28  0.21   0  0  3  0 97
   0   848  0.00   0  0.00  48.00  28  1.30  101.37 130 12.89  102.61 117 11.76  12.41  29  0.35  13.54  26  0.34   0  0  1  0 99
   0   513  0.00   0  0.00  123.09 101 12.12  122.53 339 40.60  122.81 239 28.61   4.00   2  0.01   4.00   1  0.00   0  0  1  0 99
   0   302  0.00   0  0.00  125.15  88 10.72  118.76 351 40.67  117.56 261 29.97   4.00   5  0.02   4.00   6  0.02   0  0  2  0 98
   0   300  0.00   0  0.00  125.43 145 17.76  122.88 433 51.97  122.43 286 34.20   4.00  12  0.05   4.00   9  0.04   0  0  2  0 98
   0   298  0.00   0  0.00  125.42 143 17.49  124.64 476 57.96  123.96 334 40.47   4.00   4  0.02   4.00   5  0.02   0  0  2  0 98
^C
%> zpool status data
   pool: data
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Wed Jan 10 08:05:23 2018
        150G scanned out of 3.19T at 150M/s, 5h53m to go
        74.7G resilvered, 4.59% done
(snip)

よさそう。とりあえず件の玉は購入したドスパラに交換を要請した。

三日目夜

無事に replace は完了していた。

%> zpool status data
  pool: data
 state: ONLINE
  scan: resilvered 1.60T in 5h3m with 0 errors on Wed Jan 10 13:08:41 2018
config:

        NAME                         STATE     READ WRITE CKSUM
        data                         ONLINE       0     0     0
          mirror-0                   ONLINE       0     0     0
            diskid/DISK-25RE667ASp1  ONLINE       0     0     0
            diskid/DISK-25RE65JASp1  ONLINE       0     0     0
          mirror-1                   ONLINE       0     0     0
            ada1                     ONLINE       0     0     0
            ada2                     ONLINE       0     0     0

errors: No known data errors
%> zpool list              
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
data   4.53T  3.19T  1.34T         -    23%    70%  1.00x  ONLINE  -
zroot   109G  18.8G  90.2G         -    19%    17%  1.00x  ONLINE  -

サイズも4.5TBになって無事 autoexpand が働いていることがわかる。ZFS素晴らしい

ここで、いま宙ぶらりんになっている 2TB 玉を外して、 4TB 玉(SG)に入れ替える。

%> dmesg | grep ada3 
...
ada3 at ahcich3 bus 0 scbus3 target 0 lun 0
ada3: <ST4000DM004-2CV104 0001> ACS-3 ATA SATA 3.x device
ada3: Serial Number ZFN0FBG6
ada3: 600.000MB/s transfers (SATA 3.x, UDMA6, PIO 8192bytes)
ada3: Command Queueing enabled
ada3: 3815447MB (7814037168 512 byte sectors)
ada3: quirks=0x1<4K>
...
%> sudo zpool create tank ada3

で、 /tank が作成される。昨日のこともあるのでスループットをみながら、ちょっと小一時間ほどファイルを書いてみることにする。
1時間ほどcpを回して全然スループットが落ちなかったので replace 開始。

%> sudo zpool replace data ada1 ada3
%> zpool status data
  pool: data
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Wed Jan 10 21:59:14 2018
        498M scanned out of 3.19T at 33.2M/s, 27h56m to go
        234M resilvered, 0.01% done
config:

        NAME                         STATE     READ WRITE CKSUM
        data                         ONLINE       0     0     0
          mirror-0                   ONLINE       0     0     0
            diskid/DISK-25RE667ASp1  ONLINE       0     0     0
            diskid/DISK-25RE65JASp1  ONLINE       0     0     0
          mirror-1                   ONLINE       0     0     0
            replacing-0              ONLINE       0     0     0
              ada1                   ONLINE       0     0     0
              ada3                   ONLINE       0     0     0  (resilvering)
            ada2                     ONLINE       0     0     0

errors: No known data errors

無事始まった。ひと晩で終わるはず。

... 小一時間でスループット下がってしまった。

status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Wed Jan 10 21:59:14 2018
        95.7G scanned out of 3.19T at 36.5M/s, 24h42m to go
        48.1G resilvered, 2.93% done

これはハードウェアの故障じゃない感じがする。ぃゃそれともまさかのダブル故障?!
と思って、昨日諦めた方のディスクをLinuxマシンに差して500GBほど書いてみたんだけどおかしなこともない。
FreeBSD側も頑張ってもういちどreplace してみる。

%> sudo zpool replace data ada1 ada3
%> zpool status data
 ...
          29.5G scanned out of 3.19T at 96.5M/s, 9h32m to go
 ...

帰宅、夕食後にチェックしたら無事replaceが終わっていた。OK。そのまま今度は ada1 を交換する。これで ada1 もWDの 4TB HDD になった。

四日目

…さて、と思ったが、どうも様子がおかしい。 pkg update などが度々コケるのである。どうもおかしいと思って dmesg してみると ada0 が今度はおかしい。当時のログをみてみると

Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): RES: 41 40 e8 39 1b 40 01 00 00 08 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): Retrying command
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 e2 39 1b 40 01 00 00 00 00 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): RES: 41 40 e8 39 1b 40 01 00 00 08 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): Retrying command
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 e2 39 1b 40 01 00 00 00 00 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): RES: 41 40 e8 39 1b 40 01 00 00 08 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): Retrying command
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 e2 39 1b 40 01 00 00 00 00 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): RES: 41 40 e8 39 1b 40 01 00 00 08 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): Retrying command
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): READ_FPDMA_QUEUED. ACB: 60 08 e2 39 1b 40 01 00 00 00 00 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): CAM status: ATA Status Error
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): ATA status: 41 (DRDY ERR), error: 40 (UNC )
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): RES: 41 40 e8 39 1b 40 01 00 00 08 00
Jan 10 07:16:10 kushana kernel: (ada0:ahcich0:0:0:0): Error 5, Retries exhausted

といった具合にファイルを読めていない。このままではそもそもOSが危ういと判断して急遽SSDを追加発注。全ての作業をストップさせる。それで、遊んでいる ada1 を急遽ブートディスクに仕立てて、いつでもブートできるようにしておく。

%> sudo gpart add -i 1 -t freebsd-boot -s 1024 ada1                                                                                                                       
ada1p1 added   
%> sudo gpart add -i 2 -t freebsd-swap -s 4194304 ada1
ada1p2 added
kuenishi@kushana:~
%> sudo gpart add -i 3 -t freebsd-zfs ada1
ada1p3 added

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1024     1  freebsd-boot  (512K)
        1064     4194304     2  freebsd-swap  (2.0G)
     4195368  7809841752     3  freebsd-zfs  (3.6T)
  7814037120           8        - free -  (4.0K)
%> sudo zpool attach zroot  diskid/DISK-150315401930p3 ada1p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zroot', you may need to update
boot code on newly attached disk 'ada1p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

%> sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
partcode written to ada1p1
bootcode written to ada1

これで本当に出来たのかどうか知らないが、とりあえず ada1 からブートできるようになったはずだ。いつ ada0 (最初から刺さっていたSSD)が壊れても問題ないはず。

day 5 (1/12)

SSDが届いて、妻に受け取ってもらった。土曜日に作業をする。

day 6 (1/13)

子供達を放置して鯖管作業です

A post shared by Kota UENISHI (@kuenishi) on

さてここからが本番。 resilvering が完了していることを確認して、電源を落としてSSDを交換する。それで起動すると

%> zpool status zroot
  pool: zroot
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat Jan 13 10:51:50 2018
        5.30G scanned out of 18.8G at 1/s, (scan is slow, no estimated time)
        59.1M resilvered, 28.25% done
config:

        NAME                               STATE     READ WRITE CKSUM
        zroot                              DEGRADED     2     0     0
          mirror-0                         DEGRADED     4     0     0
            5134801585683106761            UNAVAIL      0     0     0  was /dev/diskid/DISK-150315401930p3
            diskid/DISK-WD-WCC7K5CCC1X0p3  ONLINE       0     0     4  (resilvering)

となっており、diskid/DISK-150315401930p3 が取り除かれていることがわかる。かわりに ada0 には新しく 240GB のSSDが刺さっているので、これも同様にブートディスク用にセットアップする。

%> sudo gpart create -s GPT ada0                                                      
Password:
ada0 created
%> sudo gpart add -i 1 -t freebsd-boot -s 1024 ada0 
ada0p1 added
kuenishi@kushana:~
%> sudo gpart add -i 2 -t freebsd-swap -s 4194304 ada0 
ada0p2 added
kuenishi@kushana:~
%> sudo gpart add -i 3 -t freebsd-zfs ada0            
ada0p3 added

セットアップができたらさっそく zroot に追加する。起動できるように bootcode も書き込んでおく。

%> sudo zpool attach zroot diskid/DISK-WD-WCC7K5CCC1X0p3 ada0p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zroot', you may need to update
boot code on newly attached disk 'ada0p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

%> sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0                    
partcode written to ada0p1
bootcode written to ada0

もうそもそも存在しないやつなので、古いやつを外そうとすると叱られる。こいつを外すのに結構苦戦した。

%> sudo zpool detach  zroot  5134801585683106761 
cannot detach 5134801585683106761: no valid replicas
kuenishi@kushana:~
%> sudo zpool detach  zroot /dev/diskid/DISK-150315401930p3
cannot detach /dev/diskid/DISK-150315401930p3: no valid replicas

zpool status で様子をみると

  pool: zroot
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat Jan 13 10:59:30 2018
        8.28G scanned out of 18.8G at 49.9M/s, 0h3m to go
        8.46G resilvered, 44.15% done
config:

        NAME                               STATE     READ WRITE CKSUM
        zroot                              DEGRADED    34     0     0
          mirror-0                         DEGRADED    68     0     0
            5134801585683106761            UNAVAIL      0     0     0  was /dev/diskid/DISK-150315401930p3
            diskid/DISK-WD-WCC7K5CCC1X0p3  ONLINE       0     0    68  (resilvering)
            ada0p3                         ONLINE       0     0    16  (resilvering)

errors: 40 data errors, use '-v' for a list

となっていて、40ほど壊れたファイルがあるのでまず '-v' をつけて確認して、それを何とかしろといわれる。 -v して出て来るファイルはほとんどが pkg で入るやつで、基本的には無害なので全部 rm で消していく。ファイルを直接消すと引っかかって固まるので、ディレクトリごと消すか、上書きをする。

%> sudo echo "" > /path/to/broken/file

などとやっていくと、

  pool: zroot
 state: DEGRADED
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://illumos.org/msg/ZFS-8000-8A
  scan: scrub in progress since Sat Jan 13 12:48:39 2018
        3.98G scanned out of 15.3G at 41.2M/s, 0h4m to go
        0 repaired, 25.94% done
config:

        NAME                               STATE     READ WRITE CKSUM
        zroot                              DEGRADED     4     0     0
          mirror-0                         DEGRADED     8     0     0
            5134801585683106761            UNAVAIL      0     0     0  was /dev/diskid/DISK-150315401930p3
            diskid/DISK-WD-WCC7K5CCC1X0p3  ONLINE       0     0     8
            ada0p3                         ONLINE       0     0     8

errors: Permanent errors have been detected in the following files:

        zroot/ROOT/default:<0xb6c01>
        zroot/ROOT/default:<0x6309>
        zroot/ROOT/default:<0x14263>

という風に減っていく。 resilvering が終わってしまっている場合はファイルを消してもういちど "zpool scrub zroot" だ。ちなみにこのとき用事されている
ZFS-8000-8A のURLを見に行くと「プールを再作成する他生き残る道はない」みたいなことが書かれているが、ファイルを諦めるなり自分で作り直せるはずなので特に気にしなくてよい。システムがダメな場合はSSDが壊れた時点でOSが起動しないはずだから。 "zpool status zroot" して

%> sudo zpool status -v zroot   
Password:
  pool: zroot
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
        the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-2Q
  scan: scrub repaired 0 in 0h3m with 0 errors on Sat Jan 13 12:52:35 2018
config:

        NAME                               STATE     READ WRITE CKSUM
        zroot                              DEGRADED     4     0     0
          mirror-0                         DEGRADED     8     0     0
            5134801585683106761            UNAVAIL      0     0     0  was /dev/diskid/DISK-150315401930p3
            diskid/DISK-WD-WCC7K5CCC1X0p3  ONLINE       0     0     8
            ada0p3                         ONLINE       0     0     8

errors: No known data errors

となるまでこれを繰り返す。ここまできたらやっともとのSSDを消すことができる。

%> sudo zpool detach zroot /dev/diskid/DISK-150315401930p3
%> sudo zpool status  zroot
  pool: zroot
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-9P
  scan: scrub repaired 0 in 0h3m with 0 errors on Sat Jan 13 12:52:35 2018
config:

        NAME                               STATE     READ WRITE CKSUM
        zroot                              ONLINE       4     0     0
          mirror-0                         ONLINE       8     0     0
            diskid/DISK-WD-WCC7K5CCC1X0p3  ONLINE       0     0     8
            ada0p3                         ONLINE       0     0     8

errors: No known data errors

ここまできたら、一時的に使ったHDDも不要なので detach して、新しく追加したSSDだけで起動できるように bootcode をかきなおす。

%> sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0                    
partcode written to ada0p1
bootcode written to ada0

%> sudo zpool detach zroot diskid/DISK-WD-WCC7K5CCC1X0p3          
%> zpool status zroot

  pool: zroot
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://illumos.org/msg/ZFS-8000-9P
  scan: scrub repaired 0 in 0h3m with 0 errors on Sat Jan 13 12:52:35 2018
config:

        NAME        STATE     READ WRITE CKSUM
        zroot       ONLINE       4     0     0
          ada0p3    ONLINE       0     0     8

errors: No known data errors

ここで一旦再起動してみて、ちゃんと上がってくることを確認する。いちばんハラハラした瞬間だ。ディスプレイなしで再起動したら上がってこないんだけど、なぜかディスプレイをつなぐと必ず上がってくるという事件に遭遇した。原因は分からないが、上がってきたからよしとするか…。

さてもとのHDD交換作業に戻る。 ada1 にブート用のパーティションを作っているので、まずはそれを作り直す。

%> sudo gpart delete -i 3 ada1
ada1p3 deleted
kuenishi@kushana:~
%> sudo gpart delete -i 2 ada1
ada1p2 deleted
kuenishi@kushana:~
%> sudo gpart delete -i 1 ada1
ada1p1 deleted
kuenishi@kushana:~
%> sudo gpart show ada1       
=>        40  7814037088  ada1  GPT  (3.6T)
          40  7814037088        - free -  (3.6T)

kuenishi@kushana:~
%> sudo gpart add -i 1 
kuenishi@kushana:~
%> sudo gpart add -i 1 -t freebsd-zfs ada1                       
ada1p1 added
kuenishi@kushana:~
%> sudo gpart show ada1                   
=>        40  7814037088  ada1  GPT  (3.6T)
          40  7814037080     1  freebsd-zfs  (3.6T)
  7814037120           8        - free -  (4.0K)

で、これを mirror-0 の 2TB 玉と交換する

%> sudo zpool replace data diskid/DISK-25RE667ASp1 ada1p1


夕食やらなんやらを済ませてジムから帰ってきたら ada1 が無事に入っていた。

%> zpool status data

  pool: data
 state: ONLINE
  scan: resilvered 1.41T in 4h9m with 0 errors on Sat Jan 13 17:13:33 2018
config:

        NAME                         STATE     READ WRITE CKSUM
        data                         ONLINE       0     0     0
          mirror-0                   ONLINE       0     0     0
            ada1p1                   ONLINE       0     0     0
            diskid/DISK-25RE65JASp1  ONLINE       0     0     0
          mirror-1                   ONLINE       0     0     0
            ada3                     ONLINE       0     0     0
            ada2                     ONLINE       0     0     0

errors: No known data errors

で、こんどは電源を落として、まだ筐体に残っている diskid/DISK-25RE667ASp1 を別の4TB 玉に交換する。

%> sudo gpart show ada4                   
=>        40  7814037088  ada4  GPT  (3.6T)
          40  7814037080     1  freebsd-zfs  (3.6T)
  7814037120           8        - free -  (4.0K)

パーティションつくったのでリプレース

%> sudo zpool replace data diskid/DISK-25RE65JASp1 ada4p1
%> zpool status data                                     
  pool: data
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat Jan 13 17:57:08 2018
        22.2M scanned out of 2.86T at 2.47M/s, 337h21m to go
        11.7M resilvered, 0.00% done
config:

        NAME                           STATE     READ WRITE CKSUM
        data                           ONLINE       0     0     0
          mirror-0                     ONLINE       0     0     0
            ada1p1                     ONLINE       0     0     0
            replacing-1                ONLINE       0     0     0
              diskid/DISK-25RE65JASp1  ONLINE       0     0     0
              ada4p1                   ONLINE       0     0     0  (resilvering)
          mirror-1                     ONLINE       0     0     0
            ada3                       ONLINE       0     0     0
            ada2                       ONLINE       0     0     0

夕方には完了していたので、 diskid/DISK-25RE65JASp1 を最後の一玉と交換。

%> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
data   7.25T  2.86T  4.39T         -    12%    39%  1.00x  ONLINE  -
zroot   221G  15.3G   206G         -     9%     6%  1.00x  ONLINE  -

さてここで気づいたのだが、なんと ada2 と ada3 はGPTを作らずにそのまま attach してしまっていた。このままでは gpart で一切いじれなくなって、 "No such geom." みたいなエラーが事あるごとに出てくるので、それを是正するためにまた作業をする。また、 mirror-0とmirror-1 はどちらのペアも別ベンダーのディスクにするようにこれから作業していく。まず差し替えた ada5 を ada3 と交換する方向で。

%> dmesg | grep ada5
ada5 at ahcich5 bus 0 scbus5 target 0 lun 0
ada5: <ST4000DM004-2CV104 0001> ACS-3 ATA SATA 3.x device
ada5: Serial Number ZFN0FKPR
ada5: 600.000MB/s transfers (SATA 3.x, UDMA6, PIO 8192bytes)
ada5: Command Queueing enabled
ada5: 3815447MB (7814037168 512 byte sectors)
ada5: quirks=0x1<4K>
%> sudo gpart create -s GPT ada5
gpart: geom 'ada5': Operation not permitted

パーティション作ろうと思ったらとりつくしまもない。

%> ls /dev/diskid
DISK-WD-WCC7K5ZPD3D3    DISK-WD-WCC7K5ZPD3D3p1  DISK-ZFN0FBG6           DISK-ZFN0FKPR           DISK-ZFN0FKPRp1

デバイスがあったのでこっちを使う。

%> sudo gpart create -s GPT diskid/DISK-ZFN0FBG6       
diskid/DISK-ZFN0FBG6 created
%> sudo gpart add -i 1 -t freebsd-zfs diskid/DISK-ZFN0FBG6
diskid/DISK-ZFN0FBG6p1 added
%> gpart show diskid/DISK-ZFN0FBG6                        
=>        40  7814037088  diskid/DISK-ZFN0FBG6  GPT  (3.6T)
          40  7814037080                     1  freebsd-zfs  (3.6T)
  7814037120           8                        - free -  (4.0K)
%> sudo zpool replace data ada1p1 diskid/DISK-ZFN0FBG6p1
%> sudo zpool replace data ada3 diskid/DISK-ZFN0FKPRp1 ##こんな操作もやったはず…
%> zpool status data                         
  pool: data
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat Jan 13 22:29:17 2018
        2.45G scanned out of 2.86T at 18.1M/s, 46h1m to go
        2.45G resilvered, 0.08% done
config:

        NAME                               STATE     READ WRITE CKSUM
        data                               ONLINE       0     0     0
          mirror-0                         ONLINE       0     0     0
            replacing-0                    ONLINE       0     0     0
              ada1p1                       ONLINE       0     0     0
              diskid/DISK-ZFN0FBG6p1       ONLINE       0     0     0  (resilvering)
            diskid/DISK-WD-WCC7K5ZPD3D3p1  ONLINE       0     0     0
          mirror-1                         ONLINE       0     0     0
            ada2                           ONLINE       0     0     0
            diskid/DISK-ZFN0FKPRp1         ONLINE       0     0     0  (resilvering)

errors: No known data errors

day 7 (1/14)

じーっと見てるだけでほとんど何もなかった。

day 8 朝 (1/15)

ふたつの resilvering が夜に終わったので、 ada2 を更にリプレースする。

%> sudo zpool replace data ada2 ada1p1
%> zpool status data                  
  pool: data
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Mon Jan 15 08:42:30 2018
        11.2G scanned out of 2.86T at 197M/s, 4h12m to go
        9.19M resilvered, 0.00% done
config:

        NAME                               STATE     READ WRITE CKSUM
        data                               ONLINE       0     0     0
          mirror-0                         ONLINE       0     0     0
            diskid/DISK-ZFN0FBG6p1         ONLINE       0     0     0
            diskid/DISK-WD-WCC7K5ZPD3D3p1  ONLINE       0     0     0
          mirror-1                         ONLINE       0     0     0
            replacing-0                    ONLINE       0     0     0
              ada2                         ONLINE       0     0     0
              ada1p1                       ONLINE       0     0     0  (resilvering)
            diskid/DISK-ZFN0FKPRp1         ONLINE       0     0     0

errors: No known data errors

day 8 夜 (1/15)

完了してた。

%> zpool status data           
  pool: data
 state: ONLINE
  scan: resilvered 1.45T in 3h50m with 0 errors on Mon Jan 15 12:32:58 2018
config:

        NAME                               STATE     READ WRITE CKSUM
        data                               ONLINE       0     0     0
          mirror-0                         ONLINE       0     0     0
            diskid/DISK-ZFN0FBG6p1         ONLINE       0     0     0
            diskid/DISK-WD-WCC7K5ZPD3D3p1  ONLINE       0     0     0
          mirror-1                         ONLINE       0     0     0
            ada1p1                         ONLINE       0     0     0
            diskid/DISK-ZFN0FKPRp1         ONLINE       0     0     0

errors: No known data errors

なっがい道のりでした。予備のディスクも遊べるようにとっておく。

%> sudo gpart create -s GPT ada2
(中略)
%> sudo zpool create attic ada2p1

できあがり。

%> zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
attic                256K  3.51T    88K  /attic
data                2.86T  4.16T   593G  /data
data/user           2.28T  4.16T  2.28T  /data/user
zroot               15.3G   199G    96K  none
zroot/ROOT          13.1G   199G    96K  none
(snip)
%> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
attic  3.62T   304K  3.62T         -     0%     0%  1.00x  ONLINE  -
data   7.25T  2.86T  4.39T         -    12%    39%  1.00x  ONLINE  -
zroot   221G  15.3G   206G         -     9%     6%  1.00x  ONLINE  -

番外編 壊れたっぽいHDD

ドスパラに連絡したところ、FreeBSD上で見えた状況だけで交換はしてもらえそう。
しかし問い合わせに書いてしまったので、別のLinux箱に挿してもういちど✔してみる。

翌日丁寧な回答が来て、とりあえず送付して調査してもらえそうな感じだった。非常によい対応でした。
Linuxに挿したらふつうに使えたので、 replace のときだけちょっと遅いらしくそのまま使うことにした。なので壊れてはいなかった。なので、修理は依頼しないことにした。

壊れたのは2年ちょい使ったSSDの方だった。

まとめ

  • ブートディスクになっていた 120GB SSDをOSの再インストールなしに240 GB SSDにリプレースした
  • 2TB x4 + 3TB のHDD構成を 4TB x5 にバックアップサーバーもプール再作成もなしで交換した(ダウンタイムはまあそれなりにあった)
  • ZFSは本当にすごい

まあしかしこんなにHDD買ってストレージサーバー回してたら、いったいGCSにどんだけデータ置けるんだよっていう話だわな。

2017年を振り返る

まあ特になんもなかったんですが。いやいろいろあったし特に遠い昔のことのようで上半期の記憶はほとんどありませんが。写真は夏に下鴨神社に行ったときのもので、TVアニメ 有頂天家族の聖地的なやつです。

この写真を見て「(アニメの)あ、あそこだな」と分かった皆さん、さすがです。写真はあまり撮っていなくて、いまみたら100GBちょっとでした。2016年の170GBに比べると大幅減です。改めて振り返ってみると書くことがあまりになくて、ああ2017年はプライベートの時間でほとんどプログラミングも勉強もやってないんだな(スプラトゥーンばっかりやってたんだな)って思いました。

発表など

実はエンジニアリングという意味で費やしていた時間はあまり多くなかったのですが、Apache Mesos(と、拙作Retz)のことを対外的にはやっていました。家でパソコン開いてやってたのは、スプラトゥーンの録画とかだった気がします。

トレーニングをしました

夏頃に減量を始めました。目標は6kg減らすことだったのですが、3kgくらい減らしたところで停滞中です。冬休みがよくない。家でプロテインを飲むときはシェイカーよりもハンドミキサー(ブレンダー)を使った方がいいです。

本をレビューしました

転職時に時間の余裕をつくったので10月はまるまる自分のために時間を使うことができました。収入なかったけど時間はあったので、「仕事ではじめる機械学習」と「Goならわかるシステムプログラミング」のレビューをしました。

仕事ではじめる機械学習

仕事ではじめる機械学習

Goならわかるシステムプログラミング

Goならわかるシステムプログラミング

これで 7つのデータベース 7つの世界すごいErlangゆかいに学ぼう! に続き4冊目です。とても勉強になりました。〆切直前なのにちゃぶ台返して議論を巻き戻すようなコメントばっかりつけてしまってごめんなさい。

転職してPythonを書いています

11月からプリファードネットワークスというところで分散深層学習のフレームワークを作る仕事をしています。本来の目標にはまだ遠いですが、とりあえず何とかして2ヶ月で成果らしいものを出せたのでよかったです。PythonとかOpenCVとか何度もビルドしています。このジャンルはレッドオーシャンとはいっても、まだまだやることできることが沢山あって課題は山積しているし、ソフトウェアエンジニアリング、それも分散システムや分散処理で世界を相手にする職場は東京には少ないのでとてもやりがいがあります。前職のプロダクトも使っているので当面はなんとか仕事がありそうです。

仕事用のOSはArch Linuxにしました。これまでのキャリアで初めてフリーなOSをラップトップで使用しています。マイナーな問題にはいくつか遭遇していますが、他のプロプライエタリなOSのようにどうにもできなくて窓から投げ捨てたくなるようなことはありません。しいていえばNVIDIAのGPUが刺さっていないのでCUDAやCuDNNが使えなくてちょっと困るくらいですかね。まだ外部向けにプレゼンテーションする機会がないのでそちらは未知数ですが、社内で外部ディスプレイに接続するのは支障なくできているので、多分大丈夫そうです。

2018年

4月から下の子が幼稚園に入って初めての社会生活を経験するのでその不安が非常に大きいですが、一方でここ数年で最もエキサイティングな仕事でもあります。論文も一般書も積読はたまる一方で子供は大きくなって家は狭くなるばかりでしょう。身体はますます下り坂の重力加速度にどれだけトレーニングで抗えるかがポイントになるでしょう。一方で人生の経験値もたまってきているのでうまく立ち回れるようにしたいです。もっとも重要な目標はガチアサリでS+にまで上がることです。

最近のトレなど

どうもこんにちはダボハゼことkuenishiです。これは Pyspa アドベントカレンダー 2017 の記事です。主にトレーニングと減量について、近況の変化と共に書くつもりです。結論からいうと想定外の事態はあったものの、減量のマイルストーンを順調にこなしている状態で、このままいけば来年の4月には70kgを切る予定です。

f:id:kuenishi:20171212233052p:plain
減量計画、予定と実績

昨年のアドベントカレンダーの記事をみると2015年末に70kg, 2016年末に73kgほどだった体重が、今年の夏頃には 76kg 超まで増えてしまっていた。これは由々しき事態で、なぜなら週1〜2回のトレーニングは仕事がだるいながらも何とか続けていたからだ。当時のトレーニング内容は毎回同じメニューで、記録をみるに典型的なのは

7/10
Chinning Y6 6 5 4 順手 6 53 パラ 4 3
Hanging raise 15x3
One hand cable over row l/r 5kg 10x2 7.5kg 15x2 10kg 10x2
Shoulder press 10kg 10x2 25kg 8x2
Bench press 40kg->60kg Δ5kg x5 60kg 6x0
Deadlift 60kg 5x2 80kg 5x3
Low row 50kg 10x3

といった具合に、強くもなく弱くもなく、ダラダラと続けていた。微弱な運動量に対して食事量はむしろ増え気味だったので、体重が順調に増え続けていたのは当然ともいえる。10月までは毎月体重と体脂肪率を機械で測定していたが、なかなか図にせずに特に記録もまとめていなかったせいで体重の増加傾向にも気づけなかった。いや気付いていたのだけど、精神的にも少し弱っていたので遅れたのだった。

これではいかんと決心し師匠に相談しながら、自分の方針と計画を固めていった。大前提としては

  • カロリー収支を必ず赤字にすること(アンダーカロリーをキープする)
  • インシュリン濃度を制するものが減量を制する
  • 目的のない脂肪の摂取は厳禁
  • 減量中は筋肉は増えないので、減らさないためにトレーニングをする(あと、トレーニングで一日の消費カロリーを稼ぐ、代謝量を維持することも目的)
  • 腹の減らない減量なんてウソ

などがある。その上で、個人の体質なり性格に合わせて具体的な手段を詰めて計画を立てるわけだが、

  • カーボはなるべくトレーニング後に摂るようにする。これは、トレーニング後の筋グリコーゲンを消費した状態であればインシュリンが分泌されても筋肉に入りやすい(≒相対的に脂肪細胞に入りにくい)ため
  • 付き合いなどで酒を飲む場合はなるべく昼間にトレーニングをしておく。食事で摂取した余剰な炭水化物をなるべく筋肉にいかせるのが目的だが、アセトアルデヒドを分解して得られる酢酸のうち、肝臓で分解しきれないものは筋肉にまわってしまうせいだ。個人的な感覚であるが、酢酸を筋肉で分解するときに筋肉も一緒に分解してしまうためだ。
  • 痛飲してはいけない。前述の理由と同じだが、トレーニングしてもカバーしきれないレベルになるし、二日酔いになるとそれだけ減量が遅れる。
  • アンダーカロリーをキープできない日があってもよいが、それは純粋に計画の遅れになって返ってくるだけだ。減量期間が予定よりも延びてしまい、継続性やモチベーションに問題がでるだろう。
  • チートデイは特に役に立たない。アンダーカロリーを計画通りにキープしていれば身体が勝手に代謝量を下げることはない。
  • アンダーカロリー状態になっているとき、特にトレーニング直後は抵抗力が大きく下がるのでMVMなどをきちんと摂取して(増やしはしない)風邪などの病気を防ぐ。風邪を引くとトレーニングにも減量にも悪影響がでる。
  • ケトジェニックはやらない。個人的な体質だと思うが、血糖値が低下した状態でも脂肪からエネルギーが代謝されにくいようだし、頭がぼーっとして身体全体がだるくなって行動不能になるので、日中はある程度血糖値を維持することを心がける。

といったあたりを基本方針にして、計画を立てる。

食事

人間の脂肪細胞はおよそ 7000kcal / kg なので、体脂肪を 1kg 減らすためには、たとえば 100kcal のアンダーカロリー生活を70日続ければよさそうだ。200kcalなら35日だ。実際にはアンダーカロリー分が100%脂肪から供出されるわけではないが、まあそれを仮定して計算を進める。例えば、一日で可能なアンダーカロリーを200kcal、除脂肪体重60kgとすると基礎代謝量がせいぜい1600kcalになる。通勤など日常生活でのカロリー消費が400kcalと見積もるとざっくり2000kcalくらいになる。200kcalのアンダーカロリーを達成するためには1800kcalを摂取することにして、さらにマージンを400kcalほどに設定する(マージンについてはあとで説明する)と、1400kcalが一日で食事から計画的に摂取するカロリーになる。そのうち25%を脂肪から摂取するとして、350kcal / 9.0 = 38.9 g (純粋な脂肪は 9kcal/g)程度の脂肪分を一日を摂取する。これは思ったより少なくて、たとえば鶏肉についている皮とか、ハンバーグに入っている肉汁に含まれる脂肪とかですぐにいってしまう。

また、炭水化物は目安があって、これは体重の 1 / 500 程度にすると血糖値を維持できる(本当は除脂肪体重で計算しなければならない)。75kg であれば150gだ(白米や小麦なら調理前の重さでよい)。一日3食であれば50gずつ、2食であれば75gずつだ。これで600kcalくらいになる。特に好き嫌いがないのであれば全粒粉パンかオートミール、もしくは蕎麦がよいだろう。うどんやパン、白米はGI値が高い(アミロペクチンが多い)ので積極的に選ぶことはない。なるべくアミロース系でGI値が低いもので摂取カロリーを満たしていきたいところだ。

最後に蛋白質であるが、この時点で残り 450kcal 程度になる。これは 450kcal / 4.0 = 112.5g (純粋な蛋白質は 4kcal/g)程度である。この量の蛋白質をとるのは案外難しくて、Mサイズの卵ひとつが蛋白質7.5g(ただし黄身の脂肪分に注意)だし、肉のなかで最も効率のよい鶏ささみであれば 489g (87.5 * 43 / 9.89 ≒ 489 参考)ほどになる。肉に付随する余分な脂肪や、肉料理に付随する余分なカーボのリスクを考えると結局これはプロテインで摂取するのがよくて、たとえば 1杯に 27g 蛋白質が含まれるようなものであれば 3杯、朝昼晩1杯ずつ+食事中の蛋白質30gくらいでほぼ用が済む。30gくらいであれば、全卵と肉100g程度で十分にとれるもちろん料理に入っている肉からより多くの蛋白質を摂れるとよいが、自炊でもしない限りきちんとコントロールされた状態で天然の蛋白質を摂取するのは難しい。つまり外食は全くもってダメだし、付属してくる脂肪を避けられないのだからプロテインの粉だけ一日4杯の方が全然よいということだ。ちなみに、我が家ではGold Standardのダブルリッチチョコレート味を定番にしている。下記はミルクチョコレート味だが、 https://1protein.com/ に行けば全ての味のものが手に入る。

【国内正規品】Gold Standard 100% ホエイ エクストリーム ミルクチョコレート 2.27kg (5lb)

【国内正規品】Gold Standard 100% ホエイ エクストリーム ミルクチョコレート 2.27kg (5lb)

簡単にまとめると

  • 脂肪で +350kcal ~ 39g
  • 炭水化物で +600kcal ~ 150g
  • 蛋白質で +450kcal ~ 112.5g
  • マージンで +400kcal
  • 代謝などで - 2000kcal
  • 毎日の赤字: -200kcal

という具合にカロリー収支を制御する。

マージンは、これは食事に混入する、避けられないかつ防御不可能な炭水化物や脂肪分だ。醤油、ソース、ラー油、味噌など、調味料に含まれるカロリーや、肉に付属する脂肪、タレに含まれる糖分からも防御しなければならない。我々は水を飲んで空気を吸っていても太るような人種なのだから。

サプリメントは、これも特に日常のものと変えることはしない。基本的にはMVM(エランバイタル、OPTI-MEN)とメラトニンだ。メラトニンは睡眠導入と、抵抗力強化の効果があり副作用がないので飲まない理由がない。他にもBCAAを必要に応じて、グルタミンとクレアチンを一日に適量ずつ。

また、トレーニング中はグリコのCCDとBCAAの混ぜものを自分で水に溶かして持ち込んでいる。これをトレーニング中に飲むと血糖値の低下を避けられるので集中力を維持することができる。ただしコツがあって、トレーニング開始前に飲み始めてしまうとインシュリンが分泌されて脂肪細胞にまわってしまう可能性がるので、トレーニング開始前後は給水器かなにかの水だけにしておいて、開始10〜20分くらいしてから飲み始めるのがよい。これはいつも600~700ccほど作ってもっていく。 1000ccで340kcalなので700ccだと238kcal程度だ。トレーニング直後ということでまあ少し甘めにみる。間違っても自販機でスポーツ飲料を買って飲んだりなどしないように。あれはただの砂糖水だ。インシュリンが出すぎてしまう。

コンディショニング

昨年はあれだけ自慢したが、春頃からほとんど家やっていない。次男が邪魔するというのが大きいが、日常的に肩甲骨を動かし続けたりストレッチすることを意識できるようになってきたので、背中や肩が激しく凝ることが減った。それでも少し凝ることがあったら妻に頼んで揉んでもらうことにしている(私も妻のバキバキの背中を揉む)。しかし下半身は全くといっていいほど何もできていないのでお粗末である。これは要改善の課題。

トレーニング

パワーアップではなく代謝とパワー維持が目的になる。アンダーカロリーの状態だと基本的にパワーが出ないので、あまり重いウェイトは狙わずに、正しいフォームで狙ったところにきちんと入れるようにする。時間があればマシンを使ってアイソレーション系の種目を中心にすると怪我のリスクが少ない。時間がない場合は種目を絞って、落としたくない部分をいくつかやりつつ、複数の協働筋が巻き込まれる種目をやっていこう。大きい筋肉を狙うならベンチプレス、デッドリフト、バーベルスクワットがよいだろうが、いずれも正しいフォームで行うのが難しいので減量前にフォームをある程度固めて慣れておくのがよいだろう。少しパワーをつけてからの方が神経系に余裕を持って対応できるかも。ただし怪我のリスクが多少なりともあるので、慣れていないなら懸垂から始めるのがよいだろう。慣れている人なら懸垂の良さを分かっているだろうから解説は不要だろう。懸垂がいくつかある種目の中でも最も怪我のリスクが低く身体への負担も少ない、それでいて最も効率のよい種目の一つでもある。順手、逆手、ワイド、片手など様々なフォームがある。全くあがらない状態でも、毎日ぶら下がっていれば誰でも上がるようになるのがまた懸垂の素晴らしいところだ。できれば職場にチンニングスタンドを持ち込んで仕事中に1時間毎に懸垂をするのがよい。

有酸素運動は基本的にはやっていない。私自身があまり好きでも得意でもないということが一番大きな理由だが、140bbmを維持するほどのマシンがジムにないこと、退屈なことも理由にある。また時間をかけた割に100~150kcal程度しか効かないので、食事を減らした方が楽なのではと思う。まあとにかくトレーニングに関しての情報収集はアイアンマンの鈴木雅の連載を読めばよい。

IRONMAN(アイアンマン) (2017年12月号)

IRONMAN(アイアンマン) (2017年12月号)

IRONMAN(アイアンマン) (2017年11月号)

IRONMAN(アイアンマン) (2017年11月号)

私の工夫としては、減量してパワーが下がったので一回あたりの種目を絞って、トレーニング時間を短縮しつつ回数を増やすというアプローチだ。上半身・下半身で分けている。減量も進んだ頃の私のメニューはざっくり以下のローテーションだ。

11/8
Bench press 50kg->65kg Δ5kg x5 60kg 5x3
Partial deadlift 65kg 5 85kg 5 95kg 5 85kg 5x2
ISO-lateral incline press 30kg 10 50kg 8 6
ISO-lateral row 40kg 15 60kg 11
Torso rotation l/r 32kg 15 50kg 15x3

11/3
Barbell squat 40kg 10 60kg 8 70kg 8
Adduction 100lbs 20 200lbs 15x3 12
Abduction 100lbs 15 200lbs 15 13 12 13
Prone Leg curl 50lbs 12 70lbs 12 12 11 10
Leg extension l/r 55lbs 10 70lbs 10x2
85lbs 7 8
Seated calf raise 30kg 15 60kg 15 13 40kg 15x2
Leg press 260lbs 15 300lbs 15 320lbs 15 340lbs 15

今は、ここからAdductionとAbductionは削ってしまった。レッグプレスも体調次第ではスキップする。このローテーションを1〜2週で一周りすることを目指している。…目指している…というのは、こういうことだ。

環境の変化

10月一杯はニートをしていて、11月から転職をした。つまり10月はトレーニングや減量に精力を注げたが、11月からは新しい環境でみそっかすに逆戻りしたのでトレーニングだけに集中できる環境ではなくなってしまった。食事を完全制御できる自宅から職場へ、週5回食事が移ってしまった。幸い新しい職場は食事に選択肢があり、内容をコントロールできる店もあるので悪くはない。また、午後は仕事に没頭できる状況なので余計な間食を基本的に防げる。ただ食事間隔が長くなりすぎてしまうのもよくないので、帰りが遅くなりそうなときは軽く煎餅的なものを入れるようにしている。またオフィスにプロテインのボトルを持ち込んで一日に1〜2回(30g)飲むようにしている。

中間結果(進捗)

わたしは6kg減らすのが目的なので200kcalで35日/kg、ざっくり一ヶ月で1kgを目標にした。つまり半年の計画で、9月に開始して3月末に70kgを下回る計画だ。その計画と今日まで実績が冒頭のグラフになる。赤い点が月初めの目標値で、青い点が毎日の実測値になる。毎日というわけではないが基本的には赤い点を下回っており、今のところ計画した通りの値が出ている。外見の進歩に対する妻の評価も上々だ。しかしながら想定外のこともいくつかあって、

  • 11月に環境が代わり、ジムへ行く頻度が下がった
  • 睡眠時間が安定しなくなった
  • 季節の変わり目に微妙な風邪を引きかけて(家族も風邪をひき)、大事のためジムへ行けなかった
  • 体調を維持して風邪に対抗するために食事をオーバーカロリーにした時期があった

などである。特に風邪っぽい状態はかなり厳しくて、万全の睡眠と体温維持ができていなかったことが悔やまれる。今後のリスクは忘年会シーズン、寝正月や真冬の低気温などがあり予断を許さない状況である。

減量時やってはいけない目安

  • 痛飲
  • 週2日以上のオーバーカロリー
  • 週4回以上の外食(コントロールされていない食事)
  • チートデイ(かなりストリクトにしていないと意味がないし、していても意味があるかどうか分からない)

その他

近況

  • 仕事がだるかったので転職した。だるかった時期と体重が増加した時期がわりと一致していたことにさっき気付いて、身体は正直だなと思った。
  • 転職してついにPythonを書くのが本職になった。Python型がなくて難しい。これではPyspaらしからぬ有様だ。
  • ChainerMNとかPythonの話はまた別の記事で書くかもしれない。
  • 子供が小学校に入ってますます成長。Scratchを書くようになった。次はPythonに興味を持った(すぐに飽きた)。
  • 春アニメは有頂天家族2,夏はゲーマーズ!がよかった。
  • 夏アニメはJust Because, 魔法使いの嫁、妹さえいればいい。がどれも面白くて割とよい。
  • 本年3月に祖母が逝去したので新年のご挨拶は遠慮いたします。