クラウド温泉3.0@小樽 - connpass(幹事:@nakayoshix氏)
クラウドを題して(と言ってもそればかりでないのですが)開催される、IT技術者向け合宿。今回は「代数」と「Object Functional」(オブジェクト指向&関数型言語)がテーマ。
今回が3年目で、私は以前から存在は知っていたのですが、参加は初です。
朝は@nakayoshix氏おすすめの店・粋Laboratoryで、参加者が集まり食事。話には何度か聞いていたが、初めて来た。
有機野菜などにこだわっている店。
←送迎バスで小樽へ移動
会場に到着。
←会場となったロッジ「ガルミッシュ」
←スキー場が隣接している←寝室
←設営
←@nakayoshixさんの本尊(別名:ソウルジェム)
←はじまりはじまり
関数型言語の「関数」は、プログラミングにおける「関数」ではなく数学の「関数」を指している、すなわち「(本来ならば)いつ実行しても結果が変わらない」ということを意味している。そのため関数型言語は普通に記述した場合、それらが実行される順序が書いた通りであることを保証しない。これは一見すると不便に見えるのだが、逆に「並列処理に向いている」(複数のCPUのコアに仕事を割り振ったりできる)という特性も持っている。今後CPUのマルチコア・マルチスレッド化やクラウドコンピューティングが進展すると、このような技術が特に効果を発揮するのでは、と述べられていた。
またこのような数学的意味の「関数」では、外部の環境とのやり取り(例えば入出力)が出来ない。表題にある「Monad」(モナド)とは、そういった外部の環境とのやり取りに数学的な意味を与え、また実装したものである。これにより、処理順序(例えば、入出力の結果を待つなど)に意味のある処理が書けるとのことである。
氏はJava VM上で動く関数型言語「Scala」を用いているのだが、「Scalaは実際難しい言語なのだが、ScalaはDSLを作るのに強い」と述べていた。すなわち、実際にアプリケーションを作るにあたっては、Scalaの難しいところには触れずに、Scalaで書かれたフレームワークを用いることが多くなるのではと予測していた。
発表:@zenzengood氏(発表資料)
型クラスとは、関数型言語において、型が持つ性質を定義付けるものである。C++で言えば、virtual付きの関数(仮想関数)を定義したり、テンプレートを使ってクラスが特定のメソッドを持つことを要請したりすることに相当する。JavaだとInterfaceの用途に近い。「すごいH本」においては、Eq型クラス(等価性が判断できる)やOrd型クラス(大小比較ができる)などが例として挙げられていた。
このセッションのテーマは、この型クラスを業務システム構築にどう生かしていくかという話である。業務システムにおいては、一つ一つのビジネス処理(例:単価の決定方法)が簡単でも、実際にビジネスを行う方法(例:取引フロー)を実装するとなると複雑になるとのことである。その際に、各ビジネス処理が持つべきインターフェイスを型クラスとして定義し、実際にビジネスを行うシステムを構築するにあたって、それらを組み合わせればよいようにした、とのことであった。
会場であった指摘によると、「考え方自体はオブジェクト指向のときと変わってないのではないか?」とのことであった。ただ、コードは分かりやすくなりそうとのことであった。
分散型ストレージについての話題。
データベースを分散型にする際の難しさとして4つの軸「集中/分散」「密結合/疎結合」「同期/非同期」「ステートフル/ステートレス」が挙げられていた。いずれも後者を選べれば容易に分散型になるのだが、実際にはパフォーマンスの問題やアプリケーションの問題で前者を選ばざるを得ない場合もあるとのことであった。現実には、「分散」「疎結合」「同期/非同期は使い分け」「ステートフル」で行っているとのことであった。
また分散型ストレージではデータの同期処理などがボトルネックとなるため、その際の対処方法として、Hadoopは「同期をきちんと行う代わりに、アクセスできるようになるまでの時間は伸ばす(Availabilityを下げる)」方針である一方、Cassandraは「同期が完全に行われない可能性もあるものの、早くアクセス可能にする(Consistencyを完全には保証しない)」方針ということが述べられていた。
温泉は近くのホテルの日帰り入浴。
←朝里クラッセホテル
←牛乳
夕食。なかなか量が多かった。
←夕食
←お酒
LTが終わると23時になっていたのだが、それでもみんな話したいことが多くてしゃべっていた。宿にあったホワイトボードを持ち出してモナドの概念を説明したりとか。あと@sumim氏が相変わらずのSmalltalk力を発揮しており、Smalltalkから派生した言語「SELF」についてデモを交えて説明されていたりした。
←ホワイトボード
←朝食バイキング
発表:@nakayoshix氏
モナドを語る上でさらに基礎となる数学がどんなものであるかの説明。氏いわく「1時間でモナドまで行くのは厳しい」とのことであったが、その手前の概念である群論はちゃんと説明した上で、モナドの定義に入っていた。群論における重要な特性として、演算が閉じている、すなわち定義されている演算を繰り返し適用できるということが挙げられていた。また群論における「逆元」「非可換」などがルービックキューブを例に示されていた。
途中から「じゃあ実際のプログラミングではどういう意味を持つの?」という議論に。例えばIOモナドについては「関数型言語でいう関数(数学における関数)は "外部の環境" を直接扱うことは出来ないため、IOモナドはそれを包括する役割がある」という話だった。
発表:@okachimachiorz1氏
データベースにおけるTX(トランザクション)について。ANSIのSQL規格には不備があり、それを指摘している論文を解説するというものであった。TXの性質として「ACID」と呼ばれる4つの性質があり[1]、ANSIの規格ではこれらを満たせないケースが挙げられていた。またそのために数学が用いられていることも分かった。ただ具体的にどこが問題かまでは理解できませんでした…いつか復習する。
インターネット上でコンピュータを、IPアドレスの代わりに「hhiro.net」などの名前(ドメインネーム)で指定する仕組み(DNS)が問題を抱えているという話。通信先のドメイン名だけ知っているコンピュータは、DNS情報を提供するサーバ(DNSサーバ)に問い合わせてIPアドレスを取得し、それによって通信が可能になるのだが、そこに悪意のある通信が割り込むことで、本来通信を行うべきコンピュータと異なるものを指し示され、情報漏えいなどが起きることがある(DNSポイズニング)。この発表ではその具体的な手口が示され、DNSは信頼し切れるものではない、ということが述べられた。
←みんなでお寿司
←ちらし寿司
まず@asami224氏の導入セッション(発表資料)。関数型言語とオブジェクト指向言語の考え方について述べられた。関数型言語の背景知識として、伝統的な関数型言語はラムダ計算がポイントとなっているが、最近のものは圏論などが関わってくる、とのことであった。また関数型言語とオブジェクト指向言語はどう連携させるべきか?という話で、表側の処理はオブジェクト指向で、裏側の【数学的な意味での】関数(前述)として書けるものは関数型言語で、という話があった。
最後の1時間では、@c255氏がHaskellで作ったシューティングゲームのコードリーディングが行われ、どのようにモナドが用いられているか(ちなみにシューティングゲームでは、画面の書き換えやキー操作の受け取りが頻繁に起こるため、そこは全部モナドが必要になってくる。前述)ということが示されていた。
懇親会には8人が参加。まだまだ話し足りないことを語りました。
←ビアホールで懇親会
←ピザ
その後2次会へも。
22:30の電車で小樽駅を出ました。
←小樽駅
合間の時間で将棋板をいじっていたら、詰将棋を思いついたので置いておきます。9手詰。