Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

親からうけた恩は子に返す

私が親から受けた教えの中で一番印象に残っているものが

「親から受けた恩は親に返すのではなくてお前の子供に返してあげればよい」

という言葉です。今でも意識している私の中の大切な考え方です。実践できているかどうかはさておき・・・。

これは親子の間にだけ成立する考え方ではなくて、例えば仕事上での人との関わりにおいてもそういうことがあるのかなぁと最近意識するようになりました。


長いこと生きていればお世話になった人はそりゃたくさんいます。その中でも特に、私の魂を救済してくれたといってもいいレベルでお世話になった人も一人や二人はいるわけです。

そんな人たちに対して直接恩を返したい、少しでもお役に立ちたい、と心から思うのですけど、自分の力不足だったりなんだったりでその想いを遂げることはできずじまいでいます。それがただ申し訳なくて心苦しくて悲しくて。

その人たちは恩を着せたり見返りを求めようとしていたわけではないのだろうと思います。 なので、私の恩を返したいという思いはそもそも的はずれであるのでしょう。

でも、私がその人たちから何か大切なものを受け取ったことも紛れもない事実です。それを直接返すことには意味はなく、叶わない願いなのならば、せめて他の誰かに受けた恩を返すというか、分配することができればいいのではないか、むしろそうするべきなのではないかと、少しずつ思えるようになってきました。

はたして私にうまくできるようになるのだろうかという問題はさておき・・・。

「Geeks Who Drink in Kyoto」に行ってきました

nulab.connpass.com

に行ってきました。

個人的に印象に残ったことをメモしています。全体を網羅しているわけではないのでご容赦を。

開催前

大宮通りの路地裏に佇むヌーラボ京都事務所が会場です。ぬ印ののれんも含めて外観がどうみても呉服屋にしか見えないと思ったら、実際に元呉服屋の事務所だったそうです。正直入るのに数秒とまどったレベルでしたw

入ったら入ったで暖かく迎えて頂き、畳なのでどこでも座ってくださいって、まるで友達の家に遊びにきたかのような感覚に襲われました。 そして、ほんわかまったりしていたら「元」ヌーラボの染田さんの挨拶でイベントがスタートしていました。

Orpening Activity

ハカルス 菊本知美さん

京都の CHO 室

メインの?エクササイズの前に、CHO の取り組みなどを聞かせていただきました。体の健康ももちろん心の健康も重視しているとか、ハカルスには老人が多いので気を使うとか、Python はわからないけど Marathon はわかるとか、硬軟織り交ぜた楽しいお話でした。 そして、まずはハカルスだけではなく京都の IT スタートアップ企業の CHO 室を目指していくのだそうです。

エクササイズ

そして、机などを移動させて、エクササイズに突入。序盤のストレッチあたりではまだ「おおお」っていう感じだったのですが、最後の上下運動が(多分ほどんどの参加者の予想を超えた)質と量だったので会場全体が(もちろん私も)「ひえぇぇぇー」ってなってました。

Hacarus on Twitter: "みなさんをヒィヒィ言わせてしまいました!#GWD_Nulab… "

Talk

ヌーラボ 金悠さん

資料はこちら

speakerdeck.com

研修として DIY をやる

仕事ではないことに真剣に取り組むことでそれぞれの個性があぶり出されて、結果的にお互いのことがよく知れるようになるとのこと。仕事じゃないことなので各人がやりたいようにやりだすため、普段隠れていた性格などが見えてくるようになるそうです。 事務所を作るとかそういうレベルになるとさすがにどこでも誰でもができるようなことじゃないので、例えばチームでゲームで遊んでみるとかをやってみるのはいいかもしれないと思いました。

また、知らないことに取り組むことで試行錯誤をせざるを得なくなり、未知の課題への対策ができるようになるのだとか。そして、課題へトライした結果がうまくいかなくても、その失敗はみんなでカバーできるに気づけるとのこと。

しょぼい英語でもそれなりに伝わる

これについては普段から思うところがあって、下手な英語は基本的には伝わらないんですよ。実感としてそれは本当にそうです。

ただ、伝える側の伝えようとする熱意と受け取り側の受け取ろうとする意志が噛み合えば、上手い下手や(言語として)通じているいないはあまり関係なくなって「しょぼい英語でもそれなりに伝わる」ようになるのだと思っています。だから、きっとその場はお互いの意志が噛み合っていたのではないかなー、と。

Nota 洛西一周さん

お金は WWW からやってくる

「お金は WWW からやってくる世代」だそうです。拾いに行くのではなくて、やってくる。時代じゃなくて世代。なんかすごい。(←語彙) あと「未来に生きて自分が必要なものを作る」とか。自分に対する自信とそれを支える能力がないと出てこない発想でやっぱりすごい。

リモートワーク

リモートワークを、現実をバーチャルに実現するものと捉えると失敗するとのこと。これはリモートワークによって実現したいものが何なのかによっても結論が変わってくるんじゃないかと思いました。確かに現実をそのまま置き換えようとしてもうまくはいかないだろうなという感覚があります。

一方で、洛西さんも言及されていましたが、例えばあとで登壇された粕谷(だいくしー)さんなんかはまたちょっと違った感想を持たれているのではないかと。( 以前別の場所で発表されていたリモートワークの話を聞いた印象として https://speakerdeck.com/daiksy/kanjava-remote)

ともあれ、リモートワークはまだまだ試行錯誤が必要だし、リモートワークに必要とされるものは条件によって違うということなのでしょうね。

ハカルス 染田貴志さん

資料はこちら

speakerdeck.com

初っ端から「皆さん酔っ払ってらっしゃるので(私の発表から)持って帰るものもないかと思いますが〜」とぶちかましてくる染田さんw

個々のメンバーが気持ちのよい道具を使うことが大事

当たり前といえば当たり前のことなんですけど、じゃあそれが実践できているところがどれだけあるかというとなかなかないんですよね。 金融系などのお固いところだと外部ネットワークに一切繋げないという環境もまだまだあるでしょうし、ソフトウェアのインストールなども自由にはさせてもらえなかったりするし、個人所有のキーボード持ち込み禁止なども地味に辛い。極端な例だとコーディングするのにメモ帳かワードパッドの二択(つまり Windows に標準でインストールされているものだけ)を強いられる現場の話なども聞いたことがあります。

とにかく、こういうことを公に発信されるだけでもありがたいし心強いです。

ベストプラクティスから学ぶ、でも違うことをする勇気を持つ

スライドのタイトルからして「よそはよそ、うちはうち」で、人と同じことをしても仕方ないし面白くない、と。 また、コミュニケーションを楽しく・意識的にふざけるとか、「仕事がつまらないのは自分のせい、面白い仕事は自分で作る」などとも言われていて、とにかく能動的に自分を面白い場所にもっていくことが大事だということですね。

なんというか、発表全体からベンチャーとしての気概をひしひしと感じました。

はてな 粕谷大輔さん

Mackerel 200 週リリースの舞台裏についてのお話。

当たり前のことを当たり前に

リリースの定義は、ユーザーにとって価値のある機能に限るとのこと。 今自分が関わっているサービスも、バグフィックスやユーザーに見えない部分の改善も含めれば最近は結構な数のリリースをしていますが、ユーザーにとって価値のある機能を安定してリリースし続ける、それも 4 年間もというのはちょっと気が遠くなる話ですね。 これを質量を保って続ける秘訣は、運用の自動化、継続的インテグレーションなど当たり前のことを当たり前にやるとのこと。

また、Mackerel は一部が OSS 化されていて、その部分に対するユーザからのコントリビューションも 200 週リリースの中に含まれているそうです。言葉にすると簡単なことですが、それは、サービスがユーザーに必要とされていてかつ愛されていないとなし得ないことだと思います。

このあともまだまだ話は続きそうだったのですが、今回は縮小版ということで続きはデブサミ関西で、とのことw

event.shoeisha.jp

今見たら、「残席わずか」らしいですよ!

ギルドワークス 中村洋さん

タックマンモデル、インセプションデッキ、ドラッガー風エクササイズ、Working Agreement などアジャイルなツールのお話。

チームから二人抜けたからといって安易に二人補充すればいいというものではない

タックマンモデルのに関連した話で、新しく人を迎え入れるということは関係性を一から作り直さなければならないということだから数を合わせれば OK というはなしにはならないということ。

確かに、新しい人が入ったからといっていなくなった人の「代わり」ができることはないですね。能力的な上下のことじゃなくて、フォローできる範囲という意味で人間を単純に入れ替えるなんてことはできないです。

ワークショップだけやっていてもだめ

常にチームの目標をすり合わせて修正していかなければならないとのこと。

まとめ

京都にそういう企業を育てる土壌があるのか、それとも今回発表された人たちがたまたま京都に集まっただけなのか、それはわからないですが、私も人生で一度くらいはそのような空間で働いてみたいと、一サラリーマンエンジニアは心から思ったのでした。

最後になりますが、会場提供のヌーラボ様、登壇者の皆様、会場・オンラインを含めた参加者の皆様、お疲れ様でした&ありがとうございました。本当に楽しかったです!!

「Spring 5 & Spring Boot 2ハンズオン」に行ってきました

kanjava.connpass.com

に行ってきました。

株式会社カサレアルの多田さん (@suke_masa) によるハンズオンです。

資料はこちら

初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー

GitHub - MasatoshiTada/spring5-boot2-handson: Spring 5 & Spring Boot 2ハンズオンの資料です。準備手順はこちら→

また、

Spring 5 & Spring Boot 2の初心者向け入門ハンズオンを公開しました

これを見れば独習も可能だと思いますので、興味のある方はぜひどうぞ。

直接的に得たもの

Spring Boot の役割と Spring 自身の重要性

Spring Boot はSpring の機能の一部をあらかじめまとめているものであって、 Spring を超える何かではないということ。 要は PC のパーツをバラバラに買ってきて自分で組み立てるか、組み立て済みのものを買うかのような違いだと思います。(ほんまか?) 多田さんは「出来合いのもの」という表現をされていました。 なので、Spring Boot を使っているからといって Spring そのものの知識が不要になることはない し、Spring Boot を使わないときにくらべて開発そのものが楽になるわけではない(スタート地点は違うけど)ということです。

ハンズオンはまず Spring Boot なしの状態から始まってありの状態に進んでいくのですが、Spring Boot ありの演習までたどり着くと

こうなります。ツイートでは面倒なので「おおお!!」で済ませましたが、つまり Spring Boot がいかにいろんなことをしてくれていて、いかに楽をできるかが実感できたというわけです。

日本語で読めるリファレンス

これはぶっちゃけ意外だったんですけど、Terasoluna はほとんど素の Spring なので(SIerフレームワークにありがちな魔改造をされていないと解釈)、そのリファレンスは Spring のものとして十分有用なのだそうです。 今まではググって Terasoluna のドキュメントが出てきたら「それちょっとちがう・・・」と思っていたのですが、今後はちょっと気をつけてみてみようかと思いました。

間接的に得たもの

自分が今、何のために何をやっているのか

ハンズオンの教材自体は、多田さんいわく独習でも躓かずにすむように引っかかりポイントを敢えて排除されているそうで、本当にサクサク進むので油断しているとただの流れ作業になりそうになります。もちろん Spring を理解するためにハンズオンに参加しているので、いろんなことを考えながら演習を進めないといけないのです。それが再認識できたのは個人的に収穫でした。

純粋に楽しい

わたしは結局ひたすら黙々と課題をこなしていたのですが、二時間あまりの間黙々とプログラミング作業できる事自体がそれはそれは幸せな時間でございました。 もうそういう時間がなかなか自分の意志だけでは作りにくいお年頃なんで、色んな意味で。

締め

多田さん、会場提供のサイボウズ様(ほんと、いつ行ってもめっちゃ綺麗)、関ジャバのみなさま、参加者の皆様お疲れ様でした & ありがとうございました。

感情の話

「好き」も「嫌い」も、感情は正しい判断を阻害することが多い。

「好き」は判断を鈍らせる。

「嫌い」は判断を早まってしまう。

じゃあ感情なんて排してしまえばよいのかといえば、ある意味ではそうで、ある意味そうではなくて。 僕が今までに「すごいなー」「かなわんなー」と思わされた人たちは皆、感情を(実際に持ってる持ってないは別として)理論的に道具として利用できる人たちだった。感情に動かされることなく、必要とあらば感情を利用して人を動かすことのできる人たち。

じゃあ自分もそうすればいいじゃん、って言われそうだし、過去に当時の上司に「Toy さんならそれくらいできるでしょ」って言われたこともあるけど・・・。

できないんだよなぁ。だってにんげんだもの

自分の感情、直感を無視して結果として成功するよりは、仮に失敗したとしても自分の感覚を大事にしたい。残念ながら私はそんな人間である。あと、感情を抑えて行動すると、あとで強烈な反動が来ることが多い。適当に昇華させることができない。困ったもんだ。 さらに困ったことには、私は非論理的な思考をことさら嫌う人間でもあるということ。なんなんでしょうね、本当に。

Ubuntu をバージョンアップしたら StepMania が動かなくなったときにすること

2020-08-15 追記

以下の記事はXubuntu 18.04のときに書いたものですが、Xubuntu 20.04でも同様のエラーが出るので、同様の対策をすればOKでした。

なお、あらたにlibmad0とlibjpeg62でも同様のエラーが出るようになっていますが、これらは標準のリポジトリに含まれているので、特に新しくリポジトリを追加する作業なく、apt installすればOKです。

症状

Ubuntu をバージョンアップしたあとで StepMania を起動したら・・・

stepmania: error while loading shared libraries: libva.so.1: cannot open shared object file: No such file or directory

こんなメッセージが出て動かなくなった場合の話。

原因

Ubuntu 18.04 では(私の環境は Xubuntu ですが多分同じ)、すでに libva1 が提供されていません。

$ sudo apt install libva<TAB>
libva2                    libvala-0.40-0            libvaladoc-data           libvalidate-yubikey-perl  libvamsas-client-java     libvanessa-logger-dev     libvanessa-socket-pipe    libvariantslib-ocaml      libvar-pairs-perl
libva-dev                 libvala-0.40-dev          libvalapanel0             libvalidation-class-perl  libvanessa-adt1           libvanessa-logger-sample  libvarconf-1.0-8v5        libvariantslib-ocaml-dev  libva-wayland2
libva-drm2                libvaladoc-0.40-0         libvalapanel-dev          libvamp-hostsdk3v5        libvanessa-adt-dev        libvanessa-socket2        libvarconf-dev            libvarnishapi1            libva-x11-2
libva-glx2                libvaladoc-0.40-dev       libvalidate-net-perl      libvamp-sdk2v5            libvanessa-logger0        libvanessa-socket-dev     libvariable-magic-perl    libvarnishapi-dev

対処法

提供されていたバージョンのリポジトリから libva1 をインストールすればいいのです。

$ sudo add-apt-repository "deb http://jp.archive.ubuntu.com/ubuntu/ xenial universe"
$ sudo apt update
$ sudo apt install libva1

これで動くようになっているはずです。

動作を確認したら、古いリポジトリは削除しておきましょう。

$ sudo add-apt-repository --remove "deb http://jp.archive.ubuntu.com/ubuntu/ xenial universe"

以上です。

PARANOiA BDP の MFC を狙うための自分用メモ

しばらく DDR をプレイする機会がなさそうなので、将来の自分のためにこれを記す。

基礎知識

判定

PARANOiA の判定は色んな意味でずれている。ただし、これは個人の感覚によるところが大きいので人の言うことをあてにしてはいけない。

八分

八分の「間隔」が大きく分けて二つある。サビで多用されている印象的な SE 「ててん」を基準にするとわかりやすい。すなわち、音に合わせるとき「ててん」と踏むと合うところと、「」と踏むと合うところが存在する。

自分でも何を言っているのかよくわからないが、それで実際に光らせているのだから仕方がない。

見た目

音と矢印がずれているところと、矢印と判定がずれているところがある。自分でも何を言っているのかよくわからないが、それで実際に(以下略

ついでにいうと、旧筐体とX筐体で、見た目の判定が顕著に違う場所が存在する。自分でも何を(略

距離

これは PARANOiA に限らず DP 全般においてそうなのだが、矢印の配置により足の移動量が都度大きく変化することがある。そのため相対的に急いだりゆっくりしたりしなければならなくなる。ここに判定のズレが加わるのでなかなか大変である。

筐体差

(2019-06-09追記) X筐体と金筐体ではプレイ感に差はなかった。ただし、前述の通り、旧筐体とX筐体では感覚的に判定が異なる箇所が存在する。

個別の注意点

開始前

次項で詳細に述べるが、PARANOiA BDP は最初からクライマックスである。よって、スタートボタンを押すところから集中し始めないといけない。立ち位置などの準備を怠ってもいけない。

ちなみに、私のルーティンは

  • 中央後方に立つ
  • 垂直ジャンプを数回(身体のバランスを調整するため)
  • かかとでバーをちょんちょんと触って立ち位置を確認・調整

である。

最初の一歩

f:id:mdstoy:20180607225009p:plain

この曲にかかわらず DDR のスコアアタックにおいて一歩目が大きな難所であることは言うまでもないが、この曲に関して言えば、いきなり1P↓・2P↓の遠配置で始まるのでその難しさは他の曲の比ではない。前述のルーティンを忘れてはいけない。

しばらく足踏み

f:id:mdstoy:20180607225254p:plain

最初を抜けたら、しばらくは 1P 側で足踏み→2P側で足踏みするだけ。判定も特に気にするところはない。ただ、1P から 2P に移るところは遠い上に同じ足(右足)を使わって移動しないといけないので地味に面倒。

同時踏み二つ

f:id:mdstoy:20180607225615p:plain

足踏みのあと、1P→2P←、1P側↓↑と同時踏みが続く。まあまあ距離があるので気を抜かない。判定はまだ気にしなくていい。後のことを考えて1P側↓↑は右を向く。もっともこれは DPer ならば考えずとも自然にできる動きなので問題ない。

また足踏み

1P 側でしばらく足踏み。何もない。

初めての渡り

f:id:mdstoy:20180607225724p:plain

特記することはない。ただの渡り。体が覚えている。

またまた足踏み、からの音合わせ

f:id:mdstoy:20180607225828p:plain

「てっ、てっ、てってれー」この音合わせは完全に音に合わせて気分よく踏めばいい。

四度足踏み

f:id:mdstoy:20180607225934p:plain

徐々に判定が狂い出す。

判定

この足踏み中はずっと遅い。足踏みのあと2P側で一周するが、そこも多分遅い。

1Pへの渡り

f:id:mdstoy:20180607230036p:plain

曲中ベスト3に入ると思われる難所。

配置

この渡りは渡り終える部分の同時踏み←↑が、ホームポジションからのロングジャンプかつ上が絡む同時踏みなので思った以上に遠く感じる。また続けざまに↑→で戻ってこなければならずまた上が絡む同時踏みが続くので結構なバランス感覚が要求される。

判定

渡り始めはそれまでの遅めから判定が一瞬普通に戻る。で、同時踏みでまた狂う。

感覚的には、←↑は早く、次の↑→は遅い。そもそも前述のとおり配置が曲中屈指の難易度であるため、単に判定だけの問題ではない気もするが。

3拍休符

f:id:mdstoy:20180607230128p:plain

上記難所のあとはしばらく何事もないし判定もおとなしくなるのだが、そのあとに3拍休みがくる。ここはぼーっとせずにリズムを取り続けること。そうでないと、次でミスる可能性が高くなる。ようするに一歩目問題と同じようなこと。

変な同時踏み3連

f:id:mdstoy:20180607230215p:plain

3拍休みの少しあとに、1P↓→、1P→2P←、2P←↓、という他の譜面にあまりないパターンの同時踏みの連続がある。珍しいだけで難しいわけではないので、この譜面をやりこんでいればたいして問題でもないけれど。

渡りの連続

同時踏みで渡ったあとは、同じようなパターンの渡りが連続する。SP だと連打地帯だが、BDP の場合は難しいことは何も考えず、ただただ DP ならではの渡りを楽しむところ。

厳密に言えばちょっと気持ち悪い判定のところがないわけではないが、1クレもやれば(私は)調整できるはず。むしろ1クレやっても調整できない日は、それはもうだめな日なのであきらめて別のことをしたほうがよい。

一応一番の注意点だけ言っておくと、同時踏み二つの前はちょっと遅い。慌てないことが肝心。

音合わせ

f:id:mdstoy:20180607230350p:plain

ドラムに合わせるところ。完全に音に合わせてよい。

いわゆるチュンリー*1地帯

f:id:mdstoy:20180607230520p:plain

判定的に超難所。

配置

DP っぽく1P↓を右足、2P↓を左足で踏もうと思えば踏める配置なのだけど、チュンリーで特におかしなことになるわけでもないしリスクを冒す必要もないので、正面向いてチュンリーが安定。途中で混ざる八分もそのほうが踏みやすくなる。

判定

ものによっててんでばらばらなので困る。

まず同時踏みの判定がすべて明らかに変で、音ではなく「見た目を基準にして」早め。つまりここは普段通りの目押しは利かない。どうでもいいけど、私はずれていることを前提として目押しの位置をここだけアジャストしている。さらにどうでもいいことだが、これが旧筐体の場合「見た目を基準にして」超遅めになっている。

途中で混ざる八分は、全般的に音を基準にして「すべて」遅め。相当ゆっくりを意識しないとだめな気がする。

チュンリーで取る部分は多分普通の判定。いやでも体で覚えている部分があるのでどうなんだろう?

ビジステップ地帯

f:id:mdstoy:20180607230716p:plain

地帯、といっても二つしかないけど。判定がえぐい。

判定

ひとつめのビジスッテップから「だんだん」遅くなっていく。そして、ふたつめのビジステップが曲中でもっとも(?)遅い部分となる。とにかくゆっくりを心がける。

遠配置の渡り

f:id:mdstoy:20180607230917p:plain

配置

渡りの連続。かなり遠配置の部分があるにはあるが、配置自体は大した問題はない。

判定

先のビジステップが終わった瞬間から、いきなり早めになる。(遅いところから連続的に普通〜早めではなく、いきなり「早い」ゾーンに入る)そして、さらにだんだん早くなっていく。もっとも遠配置の部分(右足を2P↓から1P↑にぶん回すところ)が一番早くなっているような気がする。遠いから相対的に早くしないといけないだけかもしれないけど。

サビの直前

f:id:mdstoy:20180607231043p:plain

配置

チュンリーでこなすのが無難。

判定

先の渡りを終えたところから相対的に急速に遅くなるので要注意。

サビの入り口〜サビふたつ目の八分まで

f:id:mdstoy:20180607231226p:plain

最大の難所。

配置

PARANOiA といえば同方向三連打というイメージがあるのだが、なんと BDP だけはそれが一つもない。二連打もここ一箇所にしかない。

そこから、猶予はあるが強烈な左右振りが待っている。とはいえ 1P 側の同時踏みを踏んだあと右足からスタートして 2P 側に歩いていけば次の 2P→にぴったり合うので、ぼーっとしてなければ何の問題もない。

判定

連打は、ひとつ目が遅くふたつ目が早い。二連打はただでさえタイミングが取りにくいのにひどい仕打ちである。で、同時踏みは遅い(ような気がする)。手前が八分でなおかつ早いので、体感的には同時踏みはものすごく溜めて踏まないといけない(ような気がする)。

そこから 2P 側にすみやかに移動して→↑と踏んだあとの八分は「ててん」。

1P への渡り

f:id:mdstoy:20180607231416p:plain

配置

美しくないのは承知の上で、ここは右右左左と踏み、同時踏み二つは正面向きで平行移動するのが無難。

渡ったあと

f:id:mdstoy:20180607231531p:plain

判定

八分は「」。そこから少し遅くなっていく。八分三連のところが一番遅い。その後しばらくは判定は戻る。

休符のあと

SP だと連打が終わって譜面が落ち着くあたり BSP は二拍休みが入る。

配置

何ということはない四分の連続だが、足運びをこだわると結構面倒くさい。正面を向いて、素直に出た方の足で踏めばいい。

判定

休んだあとの判定はかなり遅い。とにかく落ち着くこと。

最後の同時踏み三つ

f:id:mdstoy:20180607231638p:plain

MFC を狙うという観点でいえば間違いなく最大の難所。個人的には、短期間で P1 を 3 回出してしまったうちの 2 回がラストの一歩だった程度には難所。

配置

超遠配置の同時踏み。必要なのはとにかく気合。あと、体の軸は真ん中で保ったまま足だけ振り回すことを意識すると、最後の同時踏みが楽かも。

判定

感覚的には「早い・早い・ほんのちょっとだけ遅い」。ふたつ目の早いは、超遠配置なので早く感じるだけなのかも。最後の一歩は遅いといえども、目押しのタイミングをずらすほどは遅くない。気持ちだけゆっくり踏む。本当に微妙。

本当に大切なこと

何度も何度もプレイして、攻略を積み上げて、それを体で覚えて、さらに少しずつ内容をアップデートして、また何度も何度もプレイして、攻略が極まっていくと、無意識にこなせる領域が増えていく。

それが完全に煮詰まった時、いわゆる「ゾーン」に入って、MARVELOUS を狙って矢印を踏むのではなく踏んだ場所に矢印が吸い込まれていくような奇妙な感覚に襲われるときがくる。

20 年近く DDR をプレイしていて、「ゾーン」に入れたことは片手で足りるほどしかないけれど、私はもう一度あの感覚を味わいたいがために DDR を、PARANOiA BDP のスコアアタックをやめられずにいるのかもしれない。

*1:DP攻略 Wikiを参照のこと

「構文解析ハンズオン 関西出張版」に行ってきました

lang-impl.connpass.com

に行ってきました。

水島さん (@kmizu) による、構文解析ハンズオンです。ここ最近はずっとこれに参加できることを心の支えにしてました。

ハンズオンの流れと思考の変遷

いくつかのトピックについて、水島さんの講義 -> ハンズオンの流れをテーマごとに繰り返して進んでいきました。 トピックは順を追って少しずつ複雑な概念を含むようになっていて、BNF が講義の中で示されるのでそれをもとにハンズオンの時間で皆が実装するという形式です。

数値の構文解析

一桁整数の構文解析

一文字を数値であるかどうか判定するというもの。これ自身はまあさすがに大丈夫でした。これ自身は。

余談

ch - '0' って昔は入門書にも載っていたようなテクニックじゃなかったかと思うんですけど、意外と反響があるようだったのでびっくり。(老害並感) まあ、さすがに今時はもう使うようなことはないでしょうし私もまず使いませんけど。

非負数値の構文解析

与えられた文字列が数値であるかどうかを判定するというもの。 これは、0 は許されるけど 012 などは許されないために最初に 0 (zero) であるかどうかを判定する、ということを気をつけていれば問題ありません。数値であるかどうか判定は前回のを流用できますし。

と、この時点では軽く考えていました。

余談

前(左)から順番に読み込む実装をしているにもかかわらず、一の位から順に計算しているかのように

result += ch *  Math.pow(10, i);

のような実装をしていて恥ずかしながらしばらくはまっていました。

それ以前に、Java には累乗の演算子がないことをすっかり忘れていました。私はもうだめだ・・・。

単純算術式の構文解析

かっこなし、演算子は一度だけ出てくる (1+1 のような) 算術式の解析です。

BNF はこちら

expression = addition | subtraction
           | multiplication | division | integer;
addition = integer '+' integer;
subtraction = integer '-' integer;
multiplication = integer '*' integer;
division = integer '/' integer;

ここでちょっとつまづきました。

演算子を判別する時点で failure だったときと右側の数値を取る時点で failure だったときどうするかという点がまずひとつ。 左側の数値は解析済みで返せる値なので、そこまで戻ってやらないといけない。

もう一つは、前段の非負数値の構文解析がすぐに流用できなかったこと。ひとつ目の問題と関連しますが、そこまではリストアすることを意識していなかったのでここに至って今までのソースがすんなり流用できなくなってしまいました。

そこでようやく、@kmizu さんの模範実装が try-catchthrow Exception を多用していたことの意味をあらためて意識しだしました。ただし動くものは作れましたが、この時点で理解はまだ正しくできていません。

算術式の構文解析

かっこや複数の演算子が登場する算術式の解析。

BNF はこちら

expression = additive;
additive = multitive 
           {'+' multitive | '-' multitive};
multitive = primary
           {'*' primary | '/' primary};
primary = '(' expression ')' | integer;

ここであらためて、@kmizu さんの講義の内容や模範実装の意味を咀嚼し直しました。 また、周りの人たちが「なんかわからんけど BNF 通り実装したら動いた」(意訳)と口々に言っていたので、私も邪念(?)を捨ててとにかく BNF を書き下すことに専念することにしました。あと、前述の、数値の解析が足を引っ張っているのをなんとか潰す。

そうしたら、なんかわからんけど BNF 通り実装したら動きました。その瞬間、私も「やったー」より「お?おおおお?」という感覚になりました。 また、何も考えずに実装した結果としてなぜそのような実装をするのかをようやく理解したというよくわからないことに。

JSON構文解析

書いている途中でタイムアップ。あとで続きやろう・・・。

特に印象に残ったこと

「なんかわからんけど BNF 通り実装したら動いた」

いろんな方が言っていた、これ。

よくよく考えたらなんかわからんなんてことなんかなくて、BNF という絶対的な仕様があるのだからそれを自然に書き下したらそりゃ動くんじゃないかなぁ、って後で思いました。普段そういうコーディングをすることがそうそうないからなんかよくわからんように思えるだけで。

日々の業務も BNF 的なもので書き下せれば簡単にプログラムで書き下せるようになるのかしらん?って、その BNF 的なものをどうやって作るんだよって話ですけど。

締め

とにかく楽しかったし勉強になりました。 プログラミング欲も満たされた、というかむしろ増大して飢えがひどくなったかもしれません。 懇親会も二次会もいろいろな話題で楽しめました。

関西出張して今回の機会を作っていただいた @kmizu さん、スポンサードしていただいたエフ・コード様、会場提供していただいたはてな様、本当にありがとうございました。 次の機会にも期待せざるを得ない!