{{outline}} !!!告知ページ [クラウド温泉3.0@小樽 - connpass|http://connpass.com/event/778/](幹事:{{tw nakayoshix}}氏) [[クラウド|WP:クラウドコンピューティング]]を題して(と言ってもそればかりでないのですが)開催される、IT技術者向け合宿。今回は「代数」と「Object Functional」(オブジェクト指向&関数型言語)がテーマ。 今回が3年目で、私は以前から存在は知っていたのですが、参加は初です。 !!!1日目 !!出発〜会場到着 朝は@nakayoshix氏おすすめの店・[粋Laboratory|http://ikilab.com/]で、参加者が集まり食事。話には何度か聞いていたが、初めて来た。 有機野菜などにこだわっている店。 {{image "/misc/20120818/DSCN5639s.JPG","粋Laboratoryで食事",400,300}} {{image2 "/misc/20120818/DSCN5643x.JPG","送迎バスで小樽へ移動",400,300}} 会場に到着。 {{image2 "/misc/20120818/DSCN5644s.JPG","会場となったロッジ「ガルミッシュ」",400,300}} {{image2 "/misc/20120818/DSCN5652s.JPG","スキー場が隣接している",400,300}} {{image2 "/misc/20120818/DSCN5651s.JPG","寝室",400,300}} {{image2 "/misc/20120818/DSCN5646s.JPG","設営",400,300}} {{image "/misc/20120818/DSCN5648x.jpg","設営",400,300}} {{image2 "/misc/20120818/DSCN5649s.JPG","@nakayoshixさんの本尊(別名:ソウルジェム)",400,300}} {{image2 "/misc/20120818/DSCN5650s.JPG","はじまりはじまり",400,300}} !!発表(1)「Monadicプログラミング・マニアックス」 発表:{{tw asami224}}氏([発表資料|http://www.slideshare.net/asami224/monadic-14014281]) 関数型言語の「関数」は、プログラミングにおける「関数」ではなく数学の「関数」を指している、すなわち「(本来ならば)いつ実行しても結果が変わらない」ということを意味している。 そのため関数型言語は普通に記述した場合、それらが実行される順序が書いた通りであることを保証しない。これは一見すると不便に見えるのだが、逆に「並列処理に向いている」(複数のCPUのコアに仕事を割り振ったりできる)という特性も持っている。今後CPUのマルチコア・マルチスレッド化やクラウドコンピューティングが進展すると、このような技術が特に効果を発揮するのでは、と述べられていた。 またこのような数学的意味の「関数」では、外部の環境とのやり取り(例えば入出力)が出来ない。表題にある「Monad」(モナド)とは、そういった外部の環境とのやり取りに数学的な意味を与え、また実装したものである。これにより、処理順序(例えば、入出力の結果を待つなど)に意味のある処理が書けるとのことである。 氏はJava VM上で動く関数型言語「[[Scala|WP:Scala]]」を用いているのだが、「Scalaは実際難しい言語なのだが、Scalaは[[DSL|WP:ドメイン固有言語]]を作るのに強い」と述べていた。すなわち、実際にアプリケーションを作るにあたっては、Scalaの難しいところには触れずに、Scalaで書かれたフレームワークを用いることが多くなるのではと予測していた。 !!発表(2)「業務システムで使う型クラス」 発表:{{tw zenzengood}}氏([発表資料|http://www.slideshare.net/zenjikanzaki/ss-14011764]) 型クラスとは、関数型言語において、型が持つ性質を定義付けるものである。C++で言えば、virtual付きの関数(仮想関数)を定義したり、テンプレートを使ってクラスが特定のメソッドを持つことを要請したりすることに相当する。JavaだとInterfaceの用途に近い。「[すごいH本|http://www.amazon.co.jp/dp/4274068854]」においては、Eq型クラス(等価性が判断できる)やOrd型クラス(大小比較ができる)などが例として挙げられていた。 このセッションのテーマは、この型クラスを業務システム構築にどう生かしていくかという話である。業務システムにおいては、一つ一つのビジネス処理(例:単価の決定方法)が簡単でも、実際にビジネスを行う方法(例:取引フロー)を実装するとなると複雑になるとのことである。その際に、各ビジネス処理が持つべきインターフェイスを型クラスとして定義し、実際にビジネスを行うシステムを構築するにあたって、それらを組み合わせればよいようにした、とのことであった。 会場であった指摘によると、「考え方自体はオブジェクト指向のときと変わってないのではないか?」とのことであった。ただ、コードは分かりやすくなりそうとのことであった。 !!発表(3)「ぶいてく流 スケーラブルアプリの作り方 2012」 発表:{{tw stakezaki}}氏([発表資料|http://www.slideshare.net/takezaki/reflex-works20120818-1?ref=http://blog.virtual-tech.net/2012/08/2012.html]) 分散型ストレージについての話題。 データベースを分散型にする際の難しさとして4つの軸「集中/分散」「密結合/疎結合」「同期/非同期」「ステートフル/ステートレス」が挙げられていた。いずれも後者を選べれば容易に分散型になるのだが、実際にはパフォーマンスの問題やアプリケーションの問題で前者を選ばざるを得ない場合もあるとのことであった。現実には、「分散」「疎結合」「同期/非同期は使い分け」「ステートフル」で行っているとのことであった。 また分散型ストレージではデータの同期処理などがボトルネックとなるため、その際の対処方法として、Hadoopは「同期をきちんと行う代わりに、アクセスできるようになるまでの時間は伸ばす(Availabilityを下げる)」方針である一方、Cassandraは「同期が完全に行われない可能性もあるものの、早くアクセス可能にする(Consistencyを完全には保証しない)」方針ということが述べられていた。 !!温泉/夕食 温泉は近くのホテルの日帰り入浴。 {{image2 "/misc/20120818/DSCN5653s.JPG","朝里クラッセホテル",400,300}} {{image2 "/misc/20120818/DSCN5654s.JPG","牛乳",300,400}} 夕食。なかなか量が多かった。 {{image2 "/misc/20120818/DSCN5655s.JPG","夕食",400,300}} {{image2 "/misc/20120818/DSCN5656s.JPG","お酒",400,300}} !!LT ::{{tw nakayoshix}}氏「クラウド禅問答」 :::元ネタ:[バラード禅問答|http://www.nicovideo.jp/watch/sm8067923] ::{{tw tss_ontap}}氏「IPv6の理想と現実〜若者に未来を託して〜」 :::IP網は「自由に使える環境」ではなく「統制されている環境」になりつつあるのではないか?という話。そして若者にはもっと自由に挑戦してほしい、とのことであった。 ::{{tw sumim}}氏「EclipseとPharo SmalltalkのTDD対決ムービーを副音声で解説!」 :::元動画:[TDD Static vs. Dynamic - Parte 1/2|http://www.youtube.com/watch?v=RLAZjiK4UHc]{{br}}Java(+Eclipse)と、Pharo Smalltalkで[[TDD|WP:テスト駆動開発]]を行う場合に、その準備をするのに(コードを書くのも、IDEの操作をするのも含む)かかる時間を比べたもの。Javaの場合はコンパイル時に型のチェックが入るので、一旦「失敗するテストを書く」までに時間がかかる、という特徴が挙げられた。これは確かに自分も、C++でテストファーストで単体テストを書くときに感じた。 ::{{tw tomooda}}氏「HaskellとSmalltalkの会話」「画面ゆらゆら系デモ」 :::Smalltalkの開発者であるアラン・ケイが目指していたオブジェクト指向は、「利用者が認識する対象に対してプログラミングする」(例えば、ウィンドウに対して「掴む」という操作をするとか)ものであった一方、実際にオブジェクト指向でコードに書くときは「ウィンドウに、ものを掴める場所を作ることを指示する」にとどまっていることを指摘している。{{br}}また「HaskellとSmalltalkの会話」という観点では、何か強力な連携を見せると見せかけて、SmalltalkからHaskellのコードを呼ぶだけ、というオチ付きであった。会場大笑い。 ::{{tw okachimachiorz1}}氏「Asakusa Framework 近況報告」 :::分散型ストレージ「Hadoop」を、実際に業務で使うためのフレームワーク。Hadoopはあくまで分散ストレージ「だけ」を担っているソフトで、実際にそれを用いてソフトウェアを作るには別途フレームワークが必要になってくる、とのことであった。またHadoopは「軽いデータに対して使うとオーバーヘッドが大きい」という弱点があり、かと言ってHadoop向けとふつうのRDB向けの処理を混在させなくてもよいよう、分散しないHadoopを入れられるようにしているとのことであった。 !!深夜 LTが終わると23時になっていたのだが、それでもみんな話したいことが多くてしゃべっていた。宿にあったホワイトボードを持ち出してモナドの概念を説明したりとか。あと{{tw sumim}}氏が相変わらずのSmalltalk力を発揮しており、Smalltalkから派生した言語「SELF」についてデモを交えて説明されていたりした。 {{image2 "/misc/20120818/DSCN5660s.JPG","ホワイトボード",300,400}} !!!2日目 !!朝食 {{image2 "/misc/20120818/DSCN5662s.JPG","朝食バイキング",400,300}} !!発表(4)「プログラマのための代数入門2 Monadへの道」 発表:{{tw nakayoshix}}氏 モナドを語る上でさらに基礎となる数学がどんなものであるかの説明。氏いわく「1時間でモナドまで行くのは厳しい」とのことであったが、その手前の概念である群論はちゃんと説明した上で、モナドの定義に入っていた。群論における重要な特性として、演算が閉じている、すなわち定義されている演算を繰り返し適用できるということが挙げられていた。また群論における「逆元」「非可換」などがルービックキューブを例に示されていた。 途中から「じゃあ実際のプログラミングではどういう意味を持つの?」という議論に。例えばIOモナドについては「関数型言語でいう関数(数学における関数)は "外部の環境" を直接扱うことは出来ないため、IOモナドはそれを包括する役割がある」という話だった。 !!発表(5)「基礎から見直すTX処理〜A Critique of ANSI SQL Isolation Levelsを再読する」 発表:{{tw okachimachiorz1}}氏 データベースにおけるTX(トランザクション)について。ANSIのSQL規格には不備があり、それを指摘している論文を解説するというものであった。TXの性質として「ACID」と呼ばれる4つの性質があり{{fn それぞれAtomic(処理が「全部行われる」か「全部失敗する」こと)、Consistency(DBが指定する条件を崩さないこと)、Isolated(別の操作から独立であること)、Durable(永続性があること)}}、ANSIの規格ではこれらを満たせないケースが挙げられていた。またそのために数学が用いられていることも分かった。ただ具体的にどこが問題かまでは理解できませんでした…いつか復習する。 !!発表(6)「本当は怖いDNSの話」 インターネット上でコンピュータを、IPアドレスの代わりに「hhiro.net」などの名前(ドメインネーム)で指定する仕組み(DNS)が問題を抱えているという話。通信先のドメイン名だけ知っているコンピュータは、DNS情報を提供するサーバ(DNSサーバ)に問い合わせてIPアドレスを取得し、それによって通信が可能になるのだが、そこに悪意のある通信が割り込むことで、本来通信を行うべきコンピュータと異なるものを指し示され、情報漏えいなどが起きることがある(DNSポイズニング)。この発表ではその具体的な手口が示され、DNSは信頼し切れるものではない、ということが述べられた。 !!昼食 {{image2 "/misc/20120818/DSCN5667x.JPG","みんなでお寿司",400,300}} {{image2 "/misc/20120818/DSCN5666s.JPG","ちらし寿司",400,300}} !!ディスカッション@小樽商大 {{image "/misc/20120818/DSCN5669s.JPG","小樽商大にて",400,300}} まず{{tw asami224}}氏の導入セッション([発表資料|http://www.slideshare.net/asami224/objectfunctional-analysis-and-design-and-programming])。関数型言語とオブジェクト指向言語の考え方について述べられた。関数型言語の背景知識として、伝統的な関数型言語はラムダ計算がポイントとなっているが、最近のものは圏論などが関わってくる、とのことであった。また関数型言語とオブジェクト指向言語はどう連携させるべきか?という話で、表側の処理はオブジェクト指向で、裏側の【数学的な意味での】関数(前述)として書けるものは関数型言語で、という話があった。 最後の1時間では、{{tw c255}}氏がHaskellで作ったシューティングゲームのコードリーディングが行われ、どのようにモナドが用いられているか(ちなみにシューティングゲームでは、画面の書き換えやキー操作の受け取りが頻繁に起こるため、そこは全部モナドが必要になってくる。前述)ということが示されていた。 !!懇親会 懇親会には8人が参加。まだまだ話し足りないことを語りました。 {{image2 "/misc/20120818/DSCN5670s.JPG","ビアホールで懇親会",400,300}} {{image2 "/misc/20120818/DSCN5673s.JPG","ピザ",400,300}} その後2次会へも。 {{image "/misc/20120818/DSCN5679s.JPG","屋台街",400,300}} {{image "/misc/20120818/DSCN5676s.JPG","店",400,300}} {{image "/misc/20120818/DSCN5677s.JPG","テキーラコーヒー",300,400}} 22:30の電車で小樽駅を出ました。 {{image2 "/misc/20120818/DSCN5680s.JPG","小樽駅",400,300}} !!!感想 * 予習が出来なかった{{fn その前日に国際会議の投稿締め切りがあったため}}ので、深く理解するには至らなかったのは少々残念でした。 * ただ、関数型言語とかOOPとかDBとかネットワークとか、今までそれほど突っ込んで勉強してなかった分野において、面白いトピックがたくさんあるということが分かって、しかもそれが自分の数学好きな心をくすぐるようなものが多かったので、いい刺激になりました。 !!!おまけ 合間の時間で将棋板をいじっていたら、詰将棋を思いついたので置いておきます。9手詰。 {{image "/misc/20120818/DSCN5661s.JPG","詰将棋",300,400}} ---- {{footnote_list}}