[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

ScalaMatsuri 2019でLTしました

ScalaMatsuriのアンカンファレンスで人類の4分の1くらいが困っているであろう問題について話して来ました。

スライド2日でなんとか錬成したはいいけどストーリー的にあまりScala感がなくて悩んでました。そういえばHaskell以外の話をしたのは久しぶりな気がします。

この管理画面問題、みんなどうしてるのかなーと以前から疑問でしたが、軽く聞いてみたところみんな困っていそうということがわかりました(つまり未解決)。

どうでもいいですがslideshareが日本語を表示しなくなった(そしてworkaroundめんどい)のでspeakerdeckに上げました。slideshare何が起こったの。

speakerdeck.com

Q&A (うろ覚え+回答いくらか追加)

Q1. OSSにしないの?

するかもしれないですがやりたいことがまだ完成してないかつそれ入れると綺麗に切れるか微妙(ここで話してない別の問題がある)という問題があります。

やりたいこと:

  • とりあえずthriftでstruct定義したらview気にせず管理画面の機能ぶっこめる
  • Viewがデフォルトで使いづらくて気に食わなくなってきたらCustomView的なもので便利にする

Q2. thrift以外にも対応しないの?

ユニバーサルパーサとユニバーサルASTが必要になりそうで大変そうです。

Q3. サーバーのCRUD周りも自動生成できないの?

やってないけどできると思います。

Q4. 管理画面のためだけにdjangoとか使うという話を聞いたことがあります。LLのゆるふわ感とScalaのきっちりしたところをうまく使い分けたい。

djangoを独立した機能として扱うなら問題ないと思う。 管理画面は割と複雑なロジックを書く必要があるので型のサポートが手厚い言語は必須だと思ってます。 そしてScalaはゆるふわもきっちりも雑に富豪的にも書けるので全部Scalaで書けばいい。 スクリプトもAmmonite(LTか何かで紹介されたらしい)で書けるので便利。

はてなダイアリーからはてなブログへ移行

思い立って唐突に実行した。10分くらいで終わった。こんなに簡単にできるとは。 こういうサービスの移行、考えるだけで面倒くさいんだがよくやったなこれ... 旧サービスの要らない部分を選別してサブセットを作って、新サービスに旧サービス(サブセット)が埋め込めるだけの機能追加して、マイグレーション。 ああ。お疲れ様です。

おかげでmarkdownでブログが書けるようになりました。

不眠、その原因と対策

エンジニアで周囲だけでも睡眠に困っている人が予想以上に観測できるので、僕自身が行った試行錯誤について書いておこうと思う。 僕は不眠症というわけではないが夜に眠ることがうまく出来ず、長い間(10年以上)試行錯誤を続けてきた。 つい三週間前は0時に布団に入ったが6時まで眠ることはできなかった。非常につらい。 それが今では夜自然に眠れるようになった。それが二週間以上続いている。二週間も続いたらこれはもう勝ちだろ、ということでエントリを書くことにした。

当たり前だが僕は臨床医でもなんでもなく、単なるソフトウェアエンジニアなので以下の体験はサンプル数N=1である。疑って読んでほしい。

世界に溢れる「眠れるようになった」という体験談

さて夜に眠るということは意外と難しい。というか難しい。眠りたいときにいくら気合を入れても眠れないのだ。普段の生活習慣がものを言う。そんなの難しいに決まっている。

厄介なのが「これをやったら私は眠れるようになりました!」というような体験談がインターネット上には散見されるということだ。 そしてその実際の中身はなぜかバラバラである。カフェインを取らないようにしたら眠れるようになりましただの、メトロノームを鳴らしたら眠れるようになっただの。 みんな違うことをやって、それぞれ眠れるようになっていったらしい。しかし自分は眠れない。困る。

そこで一つの仮説を立てることにした。

  • (習慣的に眠ることが困難な人の)眠れない原因は一人一人異なる

これなら眠れるようになった手法が異なっていても筋は通る。 カフェインは人によって効き目が異なるようだし、カフェインに敏感な人がカフェインを断てば眠れるようになる、というのは分かりやすいケースだ。 メトロノーム例ではその人はおそらく楽器プレイヤーであって、彼/彼女の習慣からメトロノームを聞くと特定の身体状態へ移行するように動機付けされていたのかもしれない。そしてそれが眠るのに適したというだった、ということでは。など。 僕自身はカフェインに対しては強い方らしく、カフェインの有無に有意な差は感じられなかった。楽器はやっていたし夜に音楽流すのは少し効果ありそうだったが、眠れないときは眠れない。特効薬というわけにはいかなかった。

そしてこの仮定が正しいならば、次のことも言えるだろう:

  • 眠れない原因は複数あるかもしれない

一人一人眠れない原因がある、ということはそれら複数の原因を一人が抱えていてもおかしくはないということだ。 この仮説によって、この睡眠プロジェクトの方針は原因を一つ探る、ではなく、原因を全て取り除くとなった。 もう一歩進んで次のようにも考えられるかもしれない:

  • 眠るために適した「いい感じ」の身体状態があり、そこから外れると眠れない

さてこの「いい感じの状態」とは何か、が問題だ。 ここでは精神状態は扱わない。これは身体異常イベントの原因を探る際、精神状態よりも身体異常の方に原因を見つけた方がほとんどの場合において適切だった、という個人的な経験則に依る。

身体異常の認識、原因追求

人間にはバグがあって、自分自身の状態を正確に認識することはできない。これは次回は直しておいてほしいが、仕方ないので他の手段をとる。 自分の場合、原因追求を素早く行えるように様々な身体異常イベントにトリガーを設定し、原因探索を行うようにした。 身体異常を検知したときに、身体センサ集中、心理的異常探索、空間異常探索、時系列イベント探索を行う。

わかりやすい原因は身体センサによってすぐに発見出来たりする。例えば生ゴミ等の異臭による身体異常などはこれで発見できる。ただし嗅覚は鈍いので、臭いという認識がないほど薄い臭いでも身体異常が発生することがあるようだ。

以下身体異常例と対策、睡眠との関係を列挙していく。

水分不足に伴う頭痛

全身に集中してもわかりにくい問題は、数ヶ月以上注意深く観察しつづけしないと発見できなかったりする。例えば水分不足。頭痛の原因には色々あるようだが、その原因の一つが水分不足である。水分不足は自分での認識が非常に困難だ。尿の色によって判別できるわけだが、喉が乾いたという認識の時には大体結構な水分不足になっているようだ。よっ水分を最近とったかどうかを記憶しておいて、異常時には水分摂取の有無を確認する。 つまりは頭痛に対して時系列で直近の水分摂取を探索し、結果取得出来なかったらとりあえず400mlくらい水を飲む、などするようになる。実際これで割と治ったりするし、そのうち感覚的にも水分不足に対して早い段階で気付けたりする。 頻繁に水分を摂るようになると、水分は身体にいいという俗説よりも、水は身体にとって消耗品であって水分不足が身体に悪いのだな、という実感が得られる。そして人間は1日1.5リットルくらい水分採った方がいいらしいが、ほとんどの人間は水分不足なのだろうなとも思う。 なお結果トイレに頻繁に寄ることになるが僕はエンジニアなのでそこは大した問題ではなかった。ビジネスのフロントで客の前に立つ人は少し大変かもしれない。がんばって水分摂取してほしい。 ところで水分不足は眠りとはあまり関係がなかったように思う。ただ頭痛はだいぶ減った。

血糖値低下に伴う倦怠感

もう一つ、認識が難しい問題は血糖値変動である。 夜眠れない人間にとって、朝起きて頭が動かない問題は同様に大きな問題である。これを大きく改善する手法が糖分摂取だ。日本人的に朝に味噌汁を飲むなども試したが効かなかった。糖分、とくに液体であると吸収もはやく効果が高い。要するにエナジードリンクが非常に良く効く。脳の栄養はブドウ糖のみらしいが、ここまで強烈に効くとは思わなかった。

エンジニアは食事を摂ることを忘れてしまうことがあるようだ。これは僕に限らない。食事の忘却はそのうち大きな倦怠感を引き起こし、様々なステータス低下を同時に引き起こす。これも長らく困っていたが、その倦怠感は糖分を摂取すると回復するらしいことにそのうち気づいた。よくよく観察すると糖分を摂らずに長い間放置するとあの飢餓状態に陥り、糖分を摂取すると回復する。どうやら血糖値が問題であるらしい。 この飢餓状態はかなりつらい。飢餓状態への突入、回復を繰り返しているとつらくて仕事がなかなか進まない。なのでこの血糖値をどうしたら適切にコントロール出来るのかを考える必要があった。血糖値低下を検知してその時点で糖分を摂ればいいのだが、そもそも仕事に集中してそこに気付けない。血糖値の非侵襲なセンサーとかあるのだろうか...とかしばらく考えていたが、ある時閃いた。

定期的にご飯(炭水化物)を食べればいいのだ。

この発見は本当に衝撃的だった。目から鱗が落ちるというか、開いた口が塞がらないというか。 なるほど人間が朝昼晩、つまり定期的にご飯を食べることにはちゃんとした理由が存在したのだな、すげえな人間やるじゃん................と気づくと同時にそこまでたどり着くのに超苦労した自分がアホらしくなってくる。いや事実超アホだったのだけど。どうやら僕は、自分自身をある意味状態がないステートレスなものとして考えていたようなのだ。ステートレスとかアホかよ純粋関数じゃねーんだから... 兎に角そうして定期的にご飯を食べるといいぞ、という知見が溜まった。3年前くらいの話だ(笑えない)。

現在も血糖値常時モニタリングしたいなーと考えていたりする。コンタクトレンズで血糖値を測るというプロジェクトが存在したようだが、最近頓挫したというニュースを見た。残念だ。別に糖尿病でなくても血糖値の簡易モニタリングの需要はあると思うのだ。

心拍数異常パターンと認識が難しい身体異常

最近はAppleWatchをおおよそほぼ常に着用するようにしている。寝るときも付けている。腕時計は人によって苦手だったりするらしいが、腕の締め付けがーとか慣れなのでどうでもいいのである。そんなことより睡眠だ。 これでわかることは心拍数程度だが、それでも長らく見ていると1日単位で正常パターンと異常パターンがおおよそ分かって来て異常検知に一役買ってくれる。これは自分では認識が難しい身体異常が心拍数パターンで検知出来たりする。もちろん全てが検知出来るわけではない。 欲を言うと心拍数だけでなく体温を常にモニタリングしたい。と言う話を周囲のエンジニアに話すと「でも発熱体(AppleWatch)の近くで体温測れるのか」「腕の表皮温度から体内深部温度が逆算できるのか」などと非常に的確な指摘をしてくれ、腕時計による体温モニタリングは今後も(技術的に)難しそうだぞ、という気分になってくる。

アルコールと睡眠の質の低下

心拍数を計測していると、正常時には睡眠時50-45程度まで下がることがわかる。この心拍数の下がり方は、睡眠の質(体感)と比較すると綺麗になだらかに下がることが望ましいらしい。アルコールを摂取するとこの心拍数が下がり切らずにばたつくことが観察によりわかる。翌日も眠気が十分にとれず、仕事のパフォーマンスが落ちることがままある。アルコールをとると眠りやすく、起きやすくなるらしいがそれはある程度実感できる。しかし睡眠サイクルの改善は起床時のパフォーマンスを期待していいることもあり、そちらが落ちてしまうならば嬉しくはない。

運動不足に伴う異常(風邪)

運動不足は明らかに体調不良(風邪)の頻度を高くした。ラトビア出身の友人によるとスクワットするといいらしいので、スクワットをするようにした。腕立て伏せは数十回も出来ないが、スクワットは慣れれば数十回くらい余裕で出来るようになるからだとか。 風邪の時は問題なく睡眠がとれるというかいくらでも眠れるのだが、そもそも風邪なんだから意味がない。健康のまま夜に眠れる必要がある。 スクワットは1日10x2くらいの弱いやつでも効果がちゃんとある。というかそれだけで効果が出る程度に体力がなさすぎただけかもしれない。 よってスクワットをすることで解決した。身体を動かすことで心理的にも気分が良くなることが実感できるので(原因が解決してないのに心が軽くなる。すげえな人間意味わからないぞ)不安定になったらスクワットをとりあえずすることにした。 これは健康に繋がったが不眠とはあまり関連づけが出来なかった。もちろん十分疲れた日に良く眠れることに対して異論はないが、スクワット30-60程度では効果が薄いように思う。

夜食事することに伴う朝のもたれ

夜遅くに食事をすると次の日の朝に影響が出ることが観察を続けていると分かった。一般には22時以降食べない方がよい、と言われているようだが、19-21時くらいに食べてしまうと次の日起きるのが楽になる。また、夜おそくに食事をとると次の日の朝胃腸がもたれる感じがする。食べ物の消化には胃でも腸でも数時間動き続けるらしいので、この因果関係は直接的に思える。 夜食事をしないことは、個人的には非常に効果が高かった。朝起きるのが辛いとそのまま2度寝に突入してしまうからだ。

夜暗くする、携帯やタブレットを見ないことの効果

正直わからない。ディスプレイは仕事柄常に見てるからかもしれない。 部屋を暗くして布団に横たわっていてもそこから4時間くらい眠れなかったりするのだ。ディスプレイのせいだけとは思えない。

睡眠の質を高くするというグリシンアミノ酸

全く効果が感じられなかった。まあともかくビタミン類やアミノ酸サプリメントとして(つまりそれが主体ではない程度に)飲み続けている。

身体保温状況の認識不可能性と天気予報

朝に天気予報を確認し、それに応じて適切な服を選ぶようになってから風邪が顕著に少なくなった。少しだけ寒い、という状態だと人間はその寒さに慣れてしまうようだが、確実にダメージが残っているようで風邪を引く。天気予報は素晴らしいことに春先の三寒四温などあってもかなりの精度で気温を当てて来る。本当に素晴らしいと思う。 前述したように風邪は良くない。健康体時の適切な睡眠をとりたいのであって異常時の睡眠ではない。しかもこの異常時の仕方なく行う睡眠は、睡眠サイクルを大きく狂わす。風邪は正常な睡眠サイクルにとって大きな障害である。 天気予報は素晴らしいのだが問題は身体の寒暖に対する鈍感さである。僕はこの寒暖の検知が非常に苦手らしく、何度も失敗している。仕方ないので少し厚着するくらいを心がけている。

室温湿度を計測、環境維持

何度も書くが風邪は良くない。 温度はエアコンをつければそれで良い。湿度は計測してみると冬場は20%とかにすぐ下がっていってしまう。加湿器でひたすら水を供給する必要ある。

寝具の影響

寝るときの姿勢は重要だろう。いい感じの状態を探すのだから色々探る必要がある。 とりあえず枕はテンピュールにしてみた。悪くはないのだが眠れないときはやはり眠れない。

保温性異常に伴う不眠

睡眠時に寒いのは論外だ。風邪をひいてしまう。暑いと眠れない。 これに加え、身体の上下の保温状態が異なる際に眠れなくなることに気づいた。 この改善のためにパジャマとかいう寝具を導入する。あれが上下同じ素材で用意されているのはそういう意味があったのだな...意外と合理性に満ちてるよな周囲...とか思う。

太陽の光を浴びて体内時計リセットとかいう謎システム

正直あまり納得がいかないのだが、最終的に夜眠れるようになった手段がこれだった。人間は体内時計が25時間であって?それを日光に当たることでリセットし?夜眠気が来るようになる?どんな雑システムだよ。1日の長さに合わせて体内サイクルを設定しないからそんなことが起きるんだ。体内時計リセットするシステム組み込んでおいたからあとは運用でカバーしてくれ、という設計者の雑な思想が透けて見える。バカにしてるのか、ちゃんと直しておけ。というのは冗談だが、人間というシステムは本当に良くわからない。

一応もう少し説明すると、膝の裏に日光(というか強い光)を浴びせると体内時計がリセットされる、という論文が結構前に出たらしい。論文の主張はともかく、朝に膝の裏に30分ほど(時間としては十分すぎるほど長いと思われる)当てるようにしてみたその日から、僕は夜に眠れるようになった。冗談のような話だ。日光を当てるだけなのでもちろん身体的な影響はほとんど認識出来ない。しかし夜ちゃんと眠れるのだ。いまだに半信半疑だがあれから問題なく眠れている。なんなんだよ。いままでどれだけ苦労してきたと。

まあもちろんこれだけが効いたのではなく、他の試みとの合わせ技なのかもしれない。

回顧録

一時期仕事でベトナムに半年ほど居たのだが、そのときやたら生活サイクルが整っており、うまくいっていた。 食べ物のせいか?温暖な気候のせいか?と色々考えたが結局そのときはわからなかった。 その後日本に帰って来てまた少しずつ睡眠がおかしくなっていったのだが、考えてみればあのとき住んで居た部屋は、朝日が強烈に差し込む部屋だった...

まとめ

  • 夜食べない
  • 血糖値保つ
  • 風邪ひかない
    • 軽く運動する
    • 身体保温適切に
    • 室内温度湿度整える
  • 眠る際適切に保温する
  • 朝に日光を膝裏に当てる

はじめに述べたようにこれは個人的な試行錯誤であり、全員に当てはまるとはとても思えない。 ただ、眠れない原因は人によって異なるという仮説は、個人個人で隠れた(というか自分で気づいていない)睡眠パラメータの探索に役にたつかもしれない。 睡眠がうまくいかないと、遅刻もまあ問題だが、そもそも動かない頭で働くのは非常につらいのだ。全然仕事が進まないし。そうして社会的に死んでしまうという危機があった。

僕みたいに身体的に鈍感な人間はどうやら多いようなので、何かの参考になればと思う。

パラメトリック多相


何か具体的な正しいステートメントが存在するときに、それを抽象化する試みは穴あきの文章を考えることから始まる。そうしてその穴の部分にどれだけ一般的な単語を当てはめられるか、どれだけ一般化しても元のステートメントが正しいかを考えていく。という過程は日常的に行う抽象化手段のひとつと思う。


僕はジェネリクスパラメトリック多相はプログラミングにとってとても重要な機能だと思っている。関数型言語関数型プログラミングはそれなりに普及して来ている様だが、それらは「もし式の中に一般化したい箇所があるならばそこを変数として関数にしてしまえば良い」という手法を提供する。それを気軽にできる様な機能を提供する。
パラメトリック多相はそれと似た様な機能を型レベルで提供する。つまり型シグネチャの中で一般化したい部分があるならば切り取って型変数にしてしまえば良い、ということが気軽にできる様になる。

それらは同じ様な動機によって必要になる手段だ。


この考えはいろんな箇所で役に立つ。
HaskellにはArrowという型クラスがあるが、これは`(->)`の抽象である。

f :: forall x y. x -> y

という型に対して、`->`をArrowで抽象化すると

f' :: forall a x y. Arrow a => a x y

となる。`a :: * -> * -> *`であるが何も問題はない。


例えばghc-8.4で導入予定のlinear-typeに関する論文、

を読んでいると(->)に下付きの`p`, `q`などが出てくるが、

  • >_1`, `->_2`, `->_3`, ...あたりを抽象化して`forall p. ->_p` といったものが現れるのはそんなに不思議ではない。

rustにおいて`mut`とnon `mut`を抽象化したいという声をどこかで見た気がするが、実現可能性はともかく`mut`部分を変数化すると言うアイデアは面白い。

`mut`とnon-`mut`を抽象化しても型チェック通すには多分`mut`相当の扱いをしないといけないよなー...とかそこから色々考えたりするわけだ。


雑な抽象化の試みによってたまに新しい構造が見えたりするのは面白かったりする。

最低限必要な言語機能

チーム開発で必要な最低限の機能、条件を見極めたいと以前からずっと思っていた。その後の手法も考えているけど今は省略。現状の仮説は以下だ:

  • Parametric polymorphism
  • Closures
  • nullが存在しないこと

この条件を満たすとなると途端にHaskellOCamlあたりしかなくなるという現実。特に三番目がなかなかのネックだ。
早くnullが無い言語が主流になってほしい。

Parametricity

最近parametricityについてジャバを書きながらずっと考えていたのだけど、割と便利な結論が出てきたと思う。

継承を用いたデザインパターンはできないだろ、とか突っ込まれそうだけど実質同じ用途だったら同じとする。そこの差異に興味はない。
デザインパターンの定義はなんだよ、とかparametricityはなんだよとかも突っ込まれそうだけどまあそのうち。


論自体はまだまだ続くのだけど。例えば型クラス拡張版は簡単に導出できる。後はhigher-order-kindの型パラメータどうするかとか、Theorems for free!を基に考えてみるとか。あとプログラミングだけでなく一般の思考メソッドとしても用いることが出来る。


そのうちまとめてどこかで発表するかもしれない。


今まで設計に関する議論で気になってたことは、ドメインに踏み込めないことだ。そこをなんとかしたいとずっと考えていた。しかしparametricityならドメインの問題に踏み込みつつドメイン情報を排除し、問題の構造パターンを正しく構築し、間違えずに再利用することが出来る。パターンを組み合わせても問題なく動く。素晴らしいじゃないか。


幸い現在は関数プログラミング周辺が賑やかになっている。parametric polymorphismを活用するには静的型付き関数型言語はOOPLより良いものだ。その理由は関数がオブジェクトに比べて十分に小さいからだ。

最近関数型言語デザインパターンに関して本も出版されたし、これから設計手法、実装手法がもっと発達しそうだ。


関数プログラミング交流会で発表した

ブログに書くという行為を忘れがちな昨今。
9/13に関数プログラミング交流会があったので発表してきました。

http://connpass.com/event/16193/

関数プログラミングという題目のため、参加者はかなり広いと思われました。そのためわかり易い話題とわかり易い遷移を心がけつつコアな人にも何か持って帰るものがあるといいなーと作成しました。まあしかし発表時間の短さ故にかなり早口で喋ったため、置いて行かれたように感じた方もいたようです...


twitterで質問がありましたが、スタックオーバーフローとかネタとしてはもう少しあったのですが流石に詰まりすぎかなと断念。並行プログラミングネタをもっと前面に押し出さないと題名負けかなーと思ったけどこれも色々あって断念。並行プログラミング関係なく継続モナドが便利なだけでは?という心の声を無視しつつスライドを完成させました。まあ非同期例外にも触れられたし後はheyhey Haskell本を読めばわかるでしょう。


並行周りは何かもう少しありそうだし色々試したいですね。
STM良いですよねSTM。