<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns="http://purl.org/rss/1.0/"
>

<channel rdf:about="http://shuns.sblo.jp/">
<title>週記</title>
<link>http://shuns.sblo.jp/</link>
<description>たぶんポアソン分布します。本家→http://shuns.sakura.ne.jp/</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="http://blog.sakura.ne.jp/" />
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://shuns.sblo.jp/article/52156269.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/46937842.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/46829357.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/46738950.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/46694394.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/46694260.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/46694105.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/46143249.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/44015873.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/42340444.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/41056052.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/41010196.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/39713703.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/39582157.html" />
<rdf:li rdf:resource="http://shuns.sblo.jp/article/39320300.html" />
</rdf:Seq>
</items>
</channel>

<item rdf:about="http://shuns.sblo.jp/article/52156269.html">
<link>http://shuns.sblo.jp/article/52156269.html</link>
<title>面白CS論文紹介</title>
<description>この記事は、今年読んだ面白CS論文紹介カレンダー( http://bit.ly/vKrdxq )6日目の参加記事です。CSの中でも、ちょっと数値系に偏った記事になります。Quasi-Newton Methods for Markov Chain Monte Carlohttp://homepages.inf.ed.ac.uk/csutton/publications/hmcbfgs.pdfこれはなに？メトロポリス法（ボルツマンサンプリング）はCSにいたら一度ぐらいは聞いたこと..</description>
<dc:subject>日記</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2011-12-19T22:50:21+09:00</dc:date>
<content:encoded><![CDATA[
この記事は、今年読んだ面白CS論文紹介カレンダー( <a href="http://bit.ly/vKrdxq" target="_blank">http://bit.ly/vKrdxq</a> )6日目の参加記事です。CSの中でも、ちょっと数値系に偏った記事になります。<br /><br /><h1>Quasi-Newton Methods for Markov Chain Monte Carlo</h1><br /><a href="http://homepages.inf.ed.ac.uk/csutton/publications/hmcbfgs.pdf" target="_blank">http://homepages.inf.ed.ac.uk/csutton/publications/hmcbfgs.pdf</a><br /><br /><h2>これはなに？</h2><br /><br /><a href="http://ja.wikipedia.org/wiki/メトロポリス法">メトロポリス法（ボルツマンサンプリング）</a>はCSにいたら一度ぐらいは聞いたことがあるかとおもいます。TopCoderのマラソンマッチに出たことがある人にはこれを用いた焼き鈍し法がおなじみではないでしょうか。また、機械学習タスクを楽しまれる淑女紳士の皆さんには、メトロポリス法は非常になじみ深いものかと思います。メトロポリス法は、構造空間を広くサンプルし、かつ目的関数の値が充分に低い場所をまとめて拾ってくるには便利な方法です。<br /><br />しかし、メトロポリス法は、対象が高次元だったり目的関数の異方性が強かったりする場合には、なかなか効率よく空間をサンプル出来ません。この論文で紹介するHMCBFGS法は、こうした問題に対処する新しいサンプラーを提唱しています。<br /><br /><h2>アイディア</h2><br /><br />異方性が問題になるなら、異方性が消えるように空間をねじ曲げてスケールしてしまえばいいじゃないか……というのが答えになるわけですが、単純に目的関数をスケールして正しいサンプラーを組み立てることは非常に難しい作業です。著者はHamiltonian Monte Carloという力学系を用いたサンプラーの先行研究をまず紹介します。実は、統計力学では、質量をどんなに適当にいじっても、無限時間が経った後の系の確率密度は同じであることが保証されていますから、質量に異方性を入れてスケールすれば、異方性をうまく消しながら空間をサンプルすることが可能になります。あとは、良い質量の決め方を探すだけです。<br /><br /><h2>出会い</h2><br /><br />この論文は、NIPS2011のaccepted papersを眺めていたときに出会いました。タイトルで一目惚れした論文です。<br /><br /><h2>なんでそんなに気に入ったのか</h2><br /><br />一つには今の自分の研究が力学系だし良いサンプラーを必要としている、というのがあります。もう一つ、単純ながら置き換えの効かないメトロポリス法を倒せる可能性のある候補である、というのがあります。メトロポリス法が作られたのは実に1953年ですから、50年も生き延びている優秀なアルゴリズムなわけです。これに勝てるかもしれない、って聞くと、みなさんワクワクしませんか？<br /><br /><h1>Fixed block compression boosting in FM-indexes</h1><br /><a href="http://arxiv.org/pdf/1104.3810" target="_blank">http://arxiv.org/pdf/1104.3810</a><br /><br /><h2>これはなに？</h2><br /><br />FM-indexという、文字列を圧縮したまま検索したり、元の文を復元したりできる不思議なデータ構造があるのですが、そのきわめて簡単で且つ圧縮率の高いな実装方法を見つけたよ、という話です。FM-indexの実装においては、文字の出現頻度だけを見て圧縮するwavelet treeという高速で実装も単純な方法が知られています。しかし、この手法では文字の出現頻度しか見ないため、文章のなかでたとえば頻出単語が存在する場合、圧縮率がもっと伸ばせるのに……という事態が起こりえます。<br /><br /><h2>アイディア</h2><br /><br />この論文では、まずFM-indexを構成する要素であるBurrows-Wheeler Transform(BWT)を<b>適切に</b>ぶった切れば圧縮率が理論上界まで伸ばせることを示し、しかる後に<b>適当に</b>ぶった切っても圧縮率が大して悪化しないことを示します。<br /><br />中身については、PFI社の岡野原さんもちょっと触れていますのでご参考まで。<br /><a href="http://www.slideshare.net/pfi/succinct-data-structure-for-analyzing-document-collection" target="_blank">http://www.slideshare.net/pfi/succinct-data-structure-for-analyzing-document-collection</a><br /><br /><h2>出会い</h2><br /><br />同じくSPIRE2011のaccepted papersを眺めていたときに見つけました。Juha Karkkainen, Gonzalo Navarro, Veli Makinen その他の各先生の著作はストーキング対象です。<br /><br /><h2>なんでそんなに気に入ったのか</h2><br /><br />「やぁみんな。複雑な方法で今まで、k次経験エントロピーサイズまで圧縮する面倒な手法を実装してただろう？　もうそんなことは必要ない。今日からは、BWTの文字列を、ただぶった切れば良いんだ（意訳）」って言われたら、そりゃ惚れますよ。<br /><br /><h1>Accelerating nearest neighbor search on manycore systems</h1><br /><a href="http://people.kyb.tuebingen.mpg.de/lcayton/papers.html" target="_blank">http://people.kyb.tuebingen.mpg.de/lcayton/papers.html</a><br /><br /><h2>これはなに？</h2><br /><br />「点の集合が与えられたとき、その点に一番近い点を求めなさい。」はい、よくある最近点・最近点対問題です。この問題を解くのには、k-D treeなどといった木のデータ構造を作成するのが普通です。これは確かに効率は良いのですが、並列化向きでないという問題があります。<br /><br /><h2>アイディア</h2><br /><br />点の中からランダムに、代表点を複数抽出します。代表点の近くにある点を、順番に決まった個数取り出し、最長距離を覚えておきます。この処理はきわめて容易に並列化できます。これをインデックスとしましょう。<br /><br />クエリが来たら、代表点との距離をまず測り、最長距離を用いて枝狩りをして生き残った候補との距離を測ります。この処理もまた、きわめて容易に並列化できます。これで近い順に点を出力すれば終わりです。<br /><br /><h2>出会い</h2><br /><br />この問題を解く、state-of-artな方法を探していたときに見つけました。<br /><br /><h2>なんでそんなに気に入ったのか</h2><br /><br />原理単純、実装単純、それでいて理論的にも実際にも優秀な性能のためです。SIMD命令を手で加えて高速化した<a href="http://www.cs.umd.edu/~mount/ANN">ANN</a>との速度比較を実際に行ってみましたが、シングルコア・マルチコア共に本手法の方が高速だったので、惚れました。行列積さえ実装できれば良いのでGPGPUでも動かせます。また、手法が単純なため容易に拡張できる点も素晴らしいです。ちょっと考えれば代表点を階層的にしてvan Emde Boas tree作ったりとか、面白そうな遊びを思いつきますよね？<br /><br /><br /><br />ちょっと連続系的な話に偏ってしまいました。次は @kmizu さん、よろしくお願いします。/h2<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/46937842.html">
<link>http://shuns.sblo.jp/article/46937842.html</link>
<title>Hello, javascript</title>
<description>あなたはホームページを運用するうちに、ページ来訪者と大いに語らう場を作りたくなりました。そこで、ブラウザ上で動くチャットルームを作ることにします。チャットルームには発言者の名前と、最新から20個の発言が順に表示されます。まずはデータの格納先を定義しましょう。ユーザーの名前と、投稿テキストを格納する先を作ります。// chatは投稿者名とテキストからなるdb /chat : {name: string; text: string}Opaのデータベースは、実はデータベースに格納さ..</description>
<dc:subject>OPA</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2011-07-25T02:30:02+09:00</dc:date>
<content:encoded><![CDATA[
あなたはホームページを運用するうちに、ページ来訪者と大いに語らう場を作りたくなりました。そこで、ブラウザ上で動くチャットルームを作ることにします。チャットルームには発言者の名前と、最新から20個の発言が順に表示されます。<br />まずはデータの格納先を定義しましょう。ユーザーの名前と、投稿テキストを格納する先を作ります。<br /><br /><pre><span class="comment-delimiter">// </span><span class="comment">chatは投稿者名とテキストからなる<br /></span><span class="keyword">db</span> /chat : <span class="keyword">{</span>name: string<span class="keyword">;</span> text: string<span class="keyword">}</span><br /></pre><br /><br />Opaのデータベースは、実はデータベースに格納された過去値をすべて覚えています。そのため、これだけで「最新のn件」が取得可能です。この辺の仕様は誤って上書きしたデータを簡単に復元できるなど便利なことがある反面、データ容量や個人情報保護などの観点から問題が起きることもありますので、運用の際には注意してください。<br /><br /><pre>  <span class="builtin">recents =</span> <span class="function-name">Db.history</span>(@/chat, 0, <span class="keyword">-</span>num_print)<br /></pre><br /><br />これで最新の<tt>num_print</tt>件が取得できます。<br /><br />ではまず、これを使い、チャットの表示更新のところを書いてみましょう。まず、得られたrecentsをxhtmlに変換します。<br /><br /><pre><span class="function-name">update</span><span class="function-name">_chat</span>() = <br />  <span class="comment-delimiter">// </span><span class="comment">最新の20件を取得<br /></span>  <span class="builtin">recents =</span> <span class="function-name">Db.history</span>(@/chat, 0, <span class="keyword">-</span>num_print)<br />  <span class="comment-delimiter">// </span><span class="comment">発言をxhtmlに変換<br /></span>  <span class="builtin">lines =</span> <span class="function-name">List.map</span>((x <span class="keyword">-&gt;</span> <span class="opa-font-xhtml-face">&lt;</span><span class="keyword">div </span><span class="opa-font-xhtml-face">class=&quot;line&quot;</span><span class="opa-font-xhtml-face">&gt;</span><span class="opa-font-xhtml-face"><br />                           &lt;</span><span class="keyword">div </span><span class="opa-font-xhtml-face">class=&quot;user&quot;&gt;{</span>x<span class="constant">.name</span><span class="opa-font-xhtml-face">}:&lt;</span><span class="keyword">/div</span><span class="opa-font-xhtml-face">&gt;</span><br />                           <span class="opa-font-xhtml-face">&lt;</span><span class="keyword">div </span><span class="opa-font-xhtml-face">class=&quot;text&quot;&gt;{</span>x<span class="constant">.text</span><span class="opa-font-xhtml-face">}&lt;</span><span class="keyword">/div</span><span class="opa-font-xhtml-face">&gt;</span><br />                         &lt;/div&gt;), recents)<br />  <span class="comment-delimiter">// </span><span class="comment">表示！<br /></span>  <span class="function-name">Dom.transform</span>([#chat <span class="keyword">&lt;-</span> lines])<br /></pre><br /><br />あとはDom.transformで&lt;div id=#chat&gt;に書き出すだけです。<br /><br />「え、この処理はどこで実行されるの？」と疑問に思う方もいるかと思います。答えは、<b>ブラウザとwebサーバー両方です</b>。Dom.transformなどの処理はブラウザでjavascriptとして実行され、Dbアクセスはwebサーバーで実行されます。Dbアクセスはブラウザ側のjavascriptから<b>RPCとして呼び出され</b>、実行されます。プログラマはこのRPCを個別に書く必要が全くありません！　これはOpaの非常によい特性であると思います。この機能を使う際には<a href="http://www.jumperz.net/texts/csrf.htm">CSRF</a>に注意してください。見知らぬ人に「こんにちはこんにちは！」などと書かれることのありませぬよう。<br /><br />最後に、ページを表示し、ボタンを押したら発言を更新するようにしましょう。これでとりあえず、手動更新のチャットの完成です。<br /><br /><pre><span class="comment-delimiter">// </span><span class="comment">chatは投稿者名とテキストからなる<br /></span><span class="keyword">db</span> /chat : <span class="keyword">{</span>name: string<span class="keyword">;</span> text: string<span class="keyword">}</span><br /><br /><span class="builtin">num_print =</span> 20<br /><br /><span class="function-name">update</span><span class="function-name">_chat</span>() = <br />  <span class="comment-delimiter">// </span><span class="comment">最新の20件を取得<br /></span>  <span class="builtin">recents =</span> <span class="function-name">Db.history</span>(@/chat, 0, <span class="keyword">-</span>num_print)<br />  <span class="comment-delimiter">// </span><span class="comment">発言をxhtmlに変換<br /></span>  <span class="builtin">lines =</span> <span class="function-name">List.map</span>((x <span class="keyword">-&gt;</span> <span class="opa-font-xhtml-face">&lt;</span><span class="keyword">div </span><span class="opa-font-xhtml-face">class=&quot;line&quot;</span><span class="opa-font-xhtml-face">&gt;</span><span class="opa-font-xhtml-face"><br />                           &lt;</span><span class="keyword">div </span><span class="opa-font-xhtml-face">class=&quot;user&quot;&gt;{</span>x<span class="constant">.name</span><span class="opa-font-xhtml-face">}:&lt;</span><span class="keyword">/div</span><span class="opa-font-xhtml-face">&gt;</span><br />                           <span class="opa-font-xhtml-face">&lt;</span><span class="keyword">div </span><span class="opa-font-xhtml-face">class=&quot;text&quot;&gt;{</span>x<span class="constant">.text</span><span class="opa-font-xhtml-face">}&lt;</span><span class="keyword">/div</span><span class="opa-font-xhtml-face">&gt;</span><br />                         &lt;/div&gt;), recents)<br />  <span class="comment-delimiter">// </span><span class="comment">表示！<br /></span>  <span class="function-name">Dom.transform</span>([#chat <span class="keyword">&lt;-</span> lines])<br /><br /><span class="function-name">submit_chat</span>() = (<br />  <span class="builtin">name =</span> <span class="function-name">Dom.get_value</span>(#name)<br />  <span class="builtin">text =</span> <span class="function-name">Dom.get_value</span>(#text)<br />  <span class="comment-delimiter">// </span><span class="comment">textが空でなければ発言<br /></span>  <span class="keyword">do</span> (<br />    <span class="keyword">if</span> text != <span class="string">&quot;&quot;</span> <span class="keyword">then</span><br />      <span class="keyword">do</span> /chat <span class="keyword">&lt;</span><span class="keyword">-</span> <span class="keyword">{</span>~name<span class="keyword">;</span> ~text<span class="keyword">}</span><br />      <span class="function-name">Dom.clear_value</span>(#text))<br />  <span class="comment-delimiter">// </span><span class="comment">textの中身にかかわらず更新はする<br /></span>  <span class="function-name">update_chat</span>()<br />)<br /><br /><span class="function-name">show_page</span>() =<br />  <span class="opa-font-xhtml-face">&lt;</span><span class="keyword">div</span><span class="opa-font-xhtml-face">&gt;<br />    &lt;</span><span class="keyword">input </span><span class="opa-font-xhtml-face">id=#name </span><span class="keyword">/</span><span class="opa-font-xhtml-face">&gt;</span><span class="opa-font-xhtml-face"><br />    &lt;</span><span class="keyword">input </span><span class="opa-font-xhtml-face">id=#text onnewline={</span>_ <span class="keyword">-&gt;</span> <span class="function-name">submit_chat</span>()<span class="opa-font-xhtml-face">}</span><span class="keyword">/</span><span class="opa-font-xhtml-face">&gt;</span><span class="opa-font-xhtml-face"><br />    &lt;</span><span class="keyword">button </span><span class="opa-font-xhtml-face">type=&quot;button&quot; onclick={</span>_ <span class="keyword">-&gt;</span> <span class="function-name">submit_chat</span>()<span class="opa-font-xhtml-face">}&gt;投稿・更新&lt;</span><span class="keyword">/</span><span class="opa-font-xhtml-face">&gt;</span><br />  &lt;/&gt;<br />  <span class="opa-font-xhtml-face">&lt;</span><span class="keyword">div </span><span class="opa-font-xhtml-face">id=#chat onready={</span>_ <span class="keyword">-&gt;</span> <span class="function-name">update_chat</span>()<span class="opa-font-xhtml-face">}&gt;&lt;</span><span class="keyword">/</span><span class="opa-font-xhtml-face">&gt;</span><br /><br /><span class="keyword">server</span><span class="builtin"> =</span> <span class="function-name">Server.one_page_bundle</span>(<span class="string">&quot;Chat&quot;</span>,<br />  [<span class="opa-font-directive-face">@static_resource_directory</span>(<span class="string">&quot;resources&quot;</span>)],<br />  [<span class="string">&quot;resources/css.css&quot;</span>], show_page)<br /></pre><br /><br />(次回に続く)<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/46829357.html">
<link>http://shuns.sblo.jp/article/46829357.html</link>
<title>Hello, CSS</title>
<description>こうしてできたページを見てみると、微妙にweb0.9感が漂い、web1.0には何かが足りないことに気づきます。いったい何が不足しているのでしょう？そうだ、web1.0時代はフォントの色やサイズを変えて遊ぶのが流行っていたのでした。黒背景に白文字・センタリング・フォントサイズ+4。早速これを実装してみましょう。Opaでは、cssなどのファイルも、できるだけ実行ファイルに含めるような設計になっています。これは、scpなどで１ファイルだけコピーすれば設置が終わるようにという配慮です..</description>
<dc:subject>OPA</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2011-07-19T00:48:53+09:00</dc:date>
<content:encoded><![CDATA[
こうしてできたページを見てみると、微妙にweb0.9感が漂い、web1.0には何かが足りないことに気づきます。いったい何が不足しているのでしょう？<br /><br />そうだ、web1.0時代はフォントの色やサイズを変えて遊ぶのが流行っていたのでした。黒背景に白文字・センタリング・フォントサイズ+4。早速これを実装してみましょう。<br /><br />Opaでは、cssなどのファイルも、できるだけ実行ファイルに含めるような設計になっています。これは、scpなどで１ファイルだけコピーすれば設置が終わるようにという配慮です。細かいことですが、大量のサーバーに配置する際も設置に失敗して404ということが無くなりますし、テストサーバーから本番系に移設する際にも移行途中でのミスは起きません。代わりに、設置時にcssを書き上げておかねばならず、変更に伴い再コンパイルが必要になります。もちろん、開発中のことも考え、cssをon-the-flyで記述したり、ディスクから読むようにしたり、といったことも可能になっています。<br /><br /><pre><span class="keyword">server</span><span class="builtin"> =</span> <br />  <span class="function-name">Server.one_page_bundle</span>(<span class="string">&quot;Hello&quot;</span>,<br />    [<span class="opa-font-directive-face">@static_resource_directory</span>(<span class="string">&quot;resources&quot;</span>)],<br />    [<span class="string">&quot;resources/css.css&quot;</span>], hello)<br /></pre><br /><br /><pre><span class="comment-delimiter">/*</span><span class="comment"><br />  resources/css.css<br />  </span><span class="comment-delimiter">*/</span><br /><span class="css-selector">body </span>{<br />    <span class="css-property">background-color</span>: #000000;<br />    <span class="css-property">color</span>: #FFFFFF;<br />}<br /><br /><span class="css-selector">p </span>{<br />    <span class="css-property">text-align</span>: center;<br />    <span class="css-property">font-size</span>: 32pt;<br />}<br /></pre><br /><br />無事にソウルフルなページになりましたでしょうか？　これで<tt>&lt;marquee&gt;</tt>タグあたりを付けるとさらにweb1.0っぽくなりますが、悪ノリはとりあえずこの程度にとどめておきます。<br /><br />＃ところで上のCSSを適用すると、Opera11.50でタブ全体ではなく文章の部分だけが黒背景になるのですが、この原因をご存じの方はいらっしゃいませんでしょうか……？<br /><br />(次回に続く)<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/46738950.html">
<link>http://shuns.sblo.jp/article/46738950.html</link>
<title>Hello, transaction</title>
<description>さて今回初めてデータベースを使ったわけですが、このカウンタには問題があります。ユーザーがきわめて多くなると、並列実行の問題から正常にカウントアップされないかもしれません！このページが1000ページビュー/秒を達成したときに備え、トランザクションを用いてプログラムを書き直しましょう。トランザクションを用いるには、２つの操作が必要です。・DBに名前を付ける・Db.transactionを用いてDBにアクセスするDBに名前を付けるには、database文を使います。database..</description>
<dc:subject>OPA</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2011-07-14T00:16:07+09:00</dc:date>
<content:encoded><![CDATA[
さて今回初めてデータベースを使ったわけですが、このカウンタには問題があります。ユーザーがきわめて多くなると、並列実行の問題から正常にカウントアップされないかもしれません！<br />このページが1000ページビュー/秒を達成したときに備え、トランザクションを用いてプログラムを書き直しましょう。<br /><br />トランザクションを用いるには、２つの操作が必要です。<br />・DBに名前を付ける<br />・<tt>Db.transaction</tt>を用いてDBにアクセスする<br /><br />DBに名前を付けるには、<tt>database</tt>文を使います。<br /><pre><span class="keyword">database</span> <span class="builtin">counter =</span> @<span class="function-name">local</span>(<span class="string">&quot;./hogehoge&quot;</span>)<br /></pre>この場合、webサーバーを実行した際のカレントディレクトリ上に、<tt>hogehoge_</tt>から始まる一連のファイルを作成し、データベースをそこに保存する、という意味になります。<br /><br />トランザクションを用いるには、トランザクション処理の開始から終了までをまとめた関数を作る必要があります。以前の<tt>incr_count</tt>をそのままリネームして<tt>atomic_incr</tt>としてしまいましょう。後は<tt>Db.transaction</tt>にDB名と、トランザクション処理関数を与えるだけです。<br /><pre>  <span class="builtin">result =</span> <span class="function-name">Db.transaction</span>(counter, atomic_incr)<span class="keyword">;</span><br /></pre>トランザクションの実行が成功すると、実行結果が<tt>{ some=結果 }</tt>という値になって返ってきます。一方、トランザクションの実行途中に別のプロセスがDBの同じ値を書き換えてしまった場合、トランザクションの実行は失敗し<tt>{ none }</tt>という値が返ってきます。この値を取り出すには、<tt>match</tt>文を使います。<br /><pre>  <span class="keyword">match</span> result <span class="keyword">with</span><br />    | <span class="keyword">{</span> none <span class="keyword">}</span> <span class="keyword">-&gt;</span> <span class="function-name">incr_count</span>() <span class="comment-delimiter">// </span><span class="comment">トランザクションをやり直す<br /></span>    | <span class="keyword">{</span> <span class="builtin">some =</span> result <span class="keyword">}</span> <span class="keyword">-&gt;</span> result<br /></pre><br />なお、<tt>{ some = result } -> result</tt> なんて書くのはかったるい！　という人のために、<tt>~{some} -&gt; some</tt>という構文が用意されています。<tt>~{some}</tt>は<tt>{ some = some }</tt>の糖衣構文です。<br /><br />これで、あなたのカウンタの1000ページビュー/秒対応が完了しました。あとは中身を充実させるだけですね？<br /><br /><pre><span class="keyword">database</span> <span class="builtin">counter =</span> @<span class="function-name">local</span>(<span class="string">&quot;./counter&quot;</span>) <span class="comment-delimiter">// </span><span class="comment">DBに名前を付ける<br /></span><span class="keyword">db</span> /counter/cnt <span class="type">: int</span> <span class="comment-delimiter">// </span><span class="comment">DBの&quot;/counter/cnt&quot;はint型<br /></span><br /><span class="function-name">incr_count</span>() = <br />(<br />  <span class="builtin">result =</span> <span class="function-name">Db.transaction</span>(counter, atomic_incr)<span class="keyword">;</span><br />  <span class="keyword">match</span> result <span class="keyword">with</span><br />    | <span class="keyword">{</span> none <span class="keyword">}</span> <span class="keyword">-&gt;</span> <span class="function-name">incr_count</span>() <span class="comment-delimiter">// </span><span class="comment">トランザクションをやり直す<br /></span>    | <span class="keyword">{</span> <span class="builtin">some =</span> result <span class="keyword">}</span> <span class="keyword">-&gt;</span> result<br />)<br /><br /><span class="function-name">atomic_incr</span>() =<br />(<br />  <span class="builtin">c =</span> /counter/cnt<span class="keyword">;</span><br />  <span class="keyword">do</span> /counter/cnt <span class="keyword">&lt;-</span> c <span class="keyword">+</span> 1<span class="keyword">;</span><br />  c <span class="keyword">+</span> 1<br />)<br /><br /><span class="function-name">hello</span>() = <br />  <span class="opa-font-xhtml-face">&lt;</span><span class="keyword">p</span><span class="opa-font-xhtml-face">&gt;<br />    あなたは{</span><span class="function-name">incr_count</span>()<span class="opa-font-xhtml-face">}番目のお客様です。<br />  &lt;</span><span class="keyword">/</span><span class="opa-font-xhtml-face">&gt;</span><br /><br /><span class="keyword">server</span><span class="builtin"> =</span> <br />  <span class="function-name">Server.one_page_server</span>(<span class="string">&quot;Hello&quot;</span>, <span class="keyword">-&gt;</span> <span class="function-name">hello</span>())<br /></pre><br /><br />(次回に続く)<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/46694394.html">
<link>http://shuns.sblo.jp/article/46694394.html</link>
<title>Hello, counter</title>
<description>Web1.0時代は、「あなたは○○人目の来訪者です」というカウンタをつけるのが流行っていました。このチープ感あふれる仕組みを含むページを作ってみましょう。OPAには組み込みのデータベースがあり、dbの後に続けてパスを指定することでデータベースの構造を定義できます。データベースには「型」を指定する必要があります。カウンタはどう考えても整数ですから、整数を表すint型を指定しましょう。incr_countは、データベースの値を取ってきて、1増やした値をデータベースに入れ、増やした..</description>
<dc:subject>OPA</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2011-07-11T23:32:16+09:00</dc:date>
<content:encoded><![CDATA[
Web1.0時代は、「あなたは○○人目の来訪者です」というカウンタをつけるのが流行っていました。<br />このチープ感あふれる仕組みを含むページを作ってみましょう。<br /><br />OPAには組み込みのデータベースがあり、<tt>db</tt>の後に続けてパスを指定することでデータベースの構造を定義できます。データベースには「型」を指定する必要があります。カウンタはどう考えても整数ですから、整数を表す<tt>int</tt>型を指定しましょう。<br /><br /><tt>incr_count</tt>は、データベースの値を取ってきて、1増やした値をデータベースに入れ、増やした後の値を返す手続き（opaではこれを関数と呼びます）です。あとは、<tt>incr_count()</tt>を呼ぶたびカウンタ増えるよぽぽぽぽ〜んという寸法です。簡単ですね？<br /><br />データベースの初期値はどうなるか、気になる人も居ると思います。データベースの初期値は、型によって決まります。intの場合は0が入りますので、このdbの値は0からスタートします。1増やした後の値を返していたのはこういう理由からです。<br /><br />あとは、ソースファイルをコンパイルすれば、サーバーができあがります。繰り返しますがopaのデータベースは組み込みですので、ライブラリを持って行ったり、DBの設定をする必要はありません。<br /><br />この実装を見て「あれ、ロックは？」と思った方。ごもっともです。次の回で詳しく説明します。<br /><br /><br /><pre><span class="keyword">db</span> /counter <span class="type">: int</span><br /><br /><span class="function-name">incr_count</span>() = (<br />  <span class="builtin">c =</span> /counter<br />  <span class="keyword">do</span> /counter <span class="keyword">&lt;-</span> c <span class="keyword">+</span> 1<span class="keyword">;</span><br />  c<br />)<br /><br /><span class="function-name">hello</span>() = <br />  <span class="opa-font-xhtml-face">&lt;</span><span class="keyword">p</span><span class="opa-font-xhtml-face">&gt;<br />    あなたは{</span><span class="function-name">incr_count</span>()<span class="opa-font-xhtml-face">}番目のお客様です。<br />  &lt;</span><span class="keyword">/</span><span class="opa-font-xhtml-face">&gt;</span><br /><br /><span class="keyword">server</span><span class="builtin"> =</span> <br />  <span class="function-name">Server.one_page_server</span>(<span class="string">&quot;Hello&quot;</span>, <span class="keyword">-&gt;</span> <span class="function-name">hello</span>())<br /></pre><br /><br />（次回に続く）<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/46694260.html">
<link>http://shuns.sblo.jp/article/46694260.html</link>
<title>Hello, OPA</title>
<description>プログラミング言語を遊ぶ以上、まずは何はともあれHello, Worldです。OPAで書かれたプログラムはコンパイルされ、単体でサーバーとして動作する実行プログラムを出力します。// hello.opahello() =   &amp;lt;h1&amp;gt;    Hello, World!  &amp;lt;/&amp;gt;server =   Server.one_page_server(&amp;quot;Hello&amp;quot;, -&amp;gt; hello())このファイルをhello.opaとして保存し..</description>
<dc:subject>OPA</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2011-07-11T23:17:52+09:00</dc:date>
<content:encoded><![CDATA[
プログラミング言語を遊ぶ以上、まずは何はともあれHello, Worldです。OPAで書かれたプログラムはコンパイルされ、単体でサーバーとして動作する実行プログラムを出力します。<br /><br /><pre><span class="comment-delimiter">// </span><span class="comment">hello.opa<br /></span><span class="function-name">hello</span>() = <br />  <span class="opa-font-xhtml-face">&lt;</span><span class="keyword">h1</span><span class="opa-font-xhtml-face">&gt;<br />    Hello, World!<br />  &lt;</span><span class="keyword">/</span><span class="opa-font-xhtml-face">&gt;</span><br /><br /><span class="keyword">server</span><span class="builtin"> =</span> <br />  <span class="function-name">Server.one_page_server</span>(<span class="string">&quot;Hello&quot;</span>, <span class="keyword">-&gt;</span> <span class="function-name">hello</span>())<br /></pre><br /><br />このファイルをhello.opaとして保存し、<br /><pre>$ opa hello.opa<br />$ ./hello.exe<br /></pre><br />とするとlocalhost:8080にwebサーバーが起動します。ページが見れましたでしょうか。Web0.1時代の開幕です。<br /><br />(次回に続く)<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/46694105.html">
<link>http://shuns.sblo.jp/article/46694105.html</link>
<title>Web1.0で遊ぶOPA</title>
<description>OPAをご存じでしょうか？ OPAはMLstateという会社が開発したweb開発用の言語です。わたしはこのOPAがかなり気に入ってしまったので、これから数回にわたり、ちまちまと紹介記事を書こうかと思います。といっても、わたしはあまりwebページの作成経験がないので、どちらかというとWeb 1.0的なテーマをネタに、サンプルを作ることになりそうですが。わたしの思う、OPAの良いところリストは以下の通りです。・パターンマッチ・パターンマッチ・パターンマッチ（大事なことなので３回言..</description>
<dc:subject>OPA</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2011-07-11T22:59:29+09:00</dc:date>
<content:encoded><![CDATA[
<a href="http://opalang.org/">OPA</a>をご存じでしょうか？ OPAはMLstateという会社が開発したweb開発用の言語です。<br />わたしはこのOPAがかなり気に入ってしまったので、これから数回にわたり、ちまちまと紹介記事を書こうかと思います。<br />といっても、わたしはあまりwebページの作成経験がないので、どちらかというとWeb <b>1.0</b>的なテーマをネタに、サンプルを作ることになりそうですが。<br />わたしの思う、OPAの良いところリストは以下の通りです。<br />・パターンマッチ<br />・パターンマッチ<br />・パターンマッチ（大事なことなので３回言いました）<br />・代数型と、それと親和性の良いDB<br />・型検査（＋推論）<br />・サーバー側とクライアント側を同一の言語で書ける<br />これからのシリーズで、この特徴をいくつか見ていければ良いかなと思います。よろしくお願いします。<br /><br /><ul><li><a href="http://shuns.sblo.jp/article/46694260.html">Hello, OPA</a></li><li><a href="http://shuns.sblo.jp/article/46694394.html">Hello, counter</a></li><li><a href="http://shuns.sblo.jp/article/46738950.html">Hello, transaction</a></li><li>Hello, CSS</li><li>Hello, BBS</li></ul><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/46143249.html">
<link>http://shuns.sblo.jp/article/46143249.html</link>
<title>ICFPC2011</title>
<description>AIの挙動とかは後でチームの誰かが書いてくれるだろうし、覚えている限りでどういう戦い方をしたのか記録しておこうと思う。</description>
<dc:subject>関数型</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2011-06-20T09:09:53+09:00</dc:date>
<content:encoded><![CDATA[
AIの挙動とかは後でチームの誰かが書いてくれるだろうし、覚えている限りでどういう戦い方をしたのか記録しておこうと思う。<br /><br /><a name="more"></a>+1:00 問題文解読終了。どういうパーツがあるのか考え始める。「これ絶対iroriさんとか強い」<br />+2:00 apply F xをどのように作るかで頭をひねる。「S(get (succ x))(get x)zero」この時主に見ていたのは <a href="http://www.angelfire.com/tx4/cus/combinator/birds.html" target="_blank">http://www.angelfire.com/tx4/cus/combinator/birds.html</a> combinator birds。<br />+3:00 f[0] <- x; apply0 Fというパーツが作られたことで最初のイディオム、apply0が生まれる。<br />+7:00 ICFPC恒例、若者の人間離れ。SKIllfulな人間になる。ま、まだ若者だもん。<br />+8:00 一足早く人間離れを起こしていたxhl氏の助力で、lazy evaluationができる。<br />+9:00 Zombie初テスト。もちろんテストプログラムの名前はSayaka。初submitでチーム名を間違え、そのまま使い続ける羽目に。<br />+10:00 Zombieの中でattackを発行することに成功し、初のexcellentゲット。このときはまだ20000ターン掛かっていた。<br />+13:00 自分と相手の255番にZombieを生成し合うプログラムを作成しテスト。内部コードネーム「円環の理」。<br />+15:00 Zombieの改良を続けて就寝。<br />+30:00 復帰。libgmpバージョン問題とかと戦う。lazyApplyがイディオムとして定着。<br />+32:00 細かいバグをつぶし、改良を重ねてSayaka改めKyoukoを安定させる。<br />+35:00 チーム内で割と効率よく殺し合いができるようになったので、部分式のキャッシュなどを実装する。SATSU☆GAIされたときにうまく動くように。<br />+37:00 円環の理に攻撃コードを埋め込むテストなどをする。詠唱に時間が掛かりすぎるので廃案。<br />+48:00 この辺はKyoukoの安定化をいろいろ。<br />+50:00 自己駆動型ループで新しい攻撃手段が作れないか模索するもSKKの間に挟まれて頓死。<br />+63:00 xhl氏が新しいAIのアイディアと実装を出してきたので、急いでYumaを組み立てて対戦させる。こっちの方向で追求しても良かったかもしれない。<br />+66:00 テストと洗練が間に合いそうにないので中止。仮眠。<br />+70:00 のんびりとスコアボードを眺めつつ、終了を待つ。<br /><br />Haskellをメインで使ってみての感想：利点に関してはもう世界でいろいろ宣伝されているので、欠点について。バグがとても取りにくい言語だと思う。開発中、系が無限ループに陥るケースがいくつかあったのだが、これを見つけるのに１つあたり３０分以上掛かった。主な原因は実行中プロセスに対してアタッチができず、スタックトレースも取れないこと、ちゃんとしたデバッガがまだまだないことあたりにあると思う。OSのエコシステムに期待できない言語なのだから、そのへんは自前サポートが必要。<br />あと、某offside-trap.elを入れておかなかったことを死ぬほど高階した。あれは必要なものだ。<br />

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/44015873.html">
<link>http://shuns.sblo.jp/article/44015873.html</link>
<title>続：Amazon Clusterインスタンスで計算</title>
<description>震災から2週間が過ぎました。まず、今回の震災で被害に遭われた方々、またご家族が被害に遭われた方々にお見舞い申し上げます。被災地域直接ではありませんが、震災の影響範囲に私なりに少しでも出来ることをと考え、この記事を書くことにしました。ご存じの通り、現在の東日本では電力状況が切迫しており、輪番停電が実施されております。これは、計算機クラスタを日常的に研究に使う者にとっては非常に厳しい状況です。各研究室で所有しているクラスタも、節電と輪番停電のため動かせない状況が続いていると伺って..</description>
<dc:subject>日記</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2011-03-28T02:52:38+09:00</dc:date>
<content:encoded><![CDATA[
震災から2週間が過ぎました。<br />まず、今回の震災で被害に遭われた方々、またご家族が被害に遭われた方々にお見舞い申し上げます。<br /><br />被災地域直接ではありませんが、震災の影響範囲に私なりに少しでも出来ることをと考え、この記事を書くことにしました。<br />ご存じの通り、現在の東日本では電力状況が切迫しており、輪番停電が実施されております。<br />これは、計算機クラスタを日常的に研究に使う者にとっては非常に厳しい状況です。<br />各研究室で所有しているクラスタも、節電と輪番停電のため動かせない状況が続いていると伺っています。<br />また、外部計算リソースについても、現在の日本の外部利用可能な計算機の状況を@plus7さんが<a href="http://d.tnose.net/?p=1914">ブログで纏めて下さいました</a>。これはほぼ壊滅的と言って良い状況です。<br />そこで、本記事では<a href="http://aws.amazon.com/ec2/">Amazon Elastic Compute Cloud (EC2)</a>を使って、即席計算リソースを作る手順を記述してみようと思います。操作環境はLinuxを想定しています。<br /><a name="more"></a>(追記: 3/30 @ar1 さんの指摘によりplacement周りを修正しました。)<br /><br /><h2>お値段と職業研究者の方への留意点</h2><br />話に入る前に、お値段の事を説明しておきます。<a href="http://aws.amazon.com/jp/ec2/hpc-applications/">Amazon EC2 HPCインスタンス</a>の費用は3/27日現在で$1.60 / hrです。現在のレートだと一日3000円強に相当します。これに更に、データ移動費としておよそ$0.10~0.15 / GBがかかります。特に計算結果の回収などでかなりのお金がかかりますので、その点を十分に見越した運用をしてください。また、インスタンスを保存すると別途お金が必要です。<br /><br />加えて、支払い方法が<b>カード払いのみ</b>となります。各団体の支払い責任者と相談し、法人カードが使えるかどうかなどを検討してください。<br /><br /><h2>性能諸元</h2><br />Amazon EC2 HPCインスタンスの性能は、<a href="http://aws.amazon.com/jp/ec2/hpc-applications/">こちらにあるとおりXeon X5570 * 2 (+ Tesla M2050 * 2)です。</a>ノード間は10GbEですが、placement groupを用いてもレイテンシのばらつきを押さえるのは難しいようです。HPCですとどうしても均質かつ低レイテンシな通信が必要となるので、通信性能には期待しない方が良さそうです。(3/30追記・修正: StarClusterではplacementも自動で設定してくれるので、比較的近くにノードは配置されるのですが、実測してみるとばらつきが大きくなっていました。)<br /><br /><h2>AWS(Amazon Web Services)アカウント準備</h2><br />アカウントの準備に関しては、既に良いガイドをImpress Bussiness Mediaさんが作成されているので、そちらをご参照下さい。<br /><a href="http://cloud.impressbm.co.jp/article/658" target="_blank">http://cloud.impressbm.co.jp/article/658</a><br />オンラインサインアップのため、電話を受けられる場所・設備から試してください。携帯電話でも問題なく動作します。<br /><br /><h2>HPCインスタンスセットアップ - StarClusterの導入</h2><br />HPCインスタンスを手動でセットアップすることも出来ますが、今回は<a href="http://web.mit.edu/stardev/cluster/index.html">StarCluster</a>という非常に良くできているユーティリティを利用します。<br />まず、pythonのPyPIを準備します。Debian系(Debian, Ubuntu, etc.)なら、<br /><pre>% sudo aptitude install python-setuptools python-dev<br /></pre><br />Redhat系(RHEL, Fedora, CentOS)なら<br /><pre>% su -<br />% yum install python-setuptools-devel<br /></pre><br />として、PyPI/easy_installを準備しましょう。<br />StarClusterのページから、最新版のCluster Computing Instance対応版をダウンロードします。<br />執筆時点ではgit版以外は対応していないため、次のようにtarballを直接ダウンロードしインストールします。<br /><pre>% wget <a href="http://github.com/jtriley/StarCluster/tarball/master" target="_blank">http://github.com/jtriley/StarCluster/tarball/master</a> -O starcluster.tar.gz<br />% tar xzf starcluster.tar.gz<br />% cd jtriley-StarCluster-*<br />% python setup.py build<br />% sudo python setup.py install<br /></pre><br />Redhat系をお使いの方はsudoの代わりにsu -してから操作してください。<br /><br />インストールが無事に終了したら、次のコマンドを実行できるはずです。<br /><br /><pre>% starcluster --help<br />StarCluster - (<a href="http://web.mit.edu/starcluster)" target="_blank">http://web.mit.edu/starcluster)</a> (v. 0.9999)<br />Software Tools for Academics and Researchers (STAR)<br />Please submit bug reports to starcluster@mit.edu<br /><br />Usage: StarCluster Command Line Interface:<br /><br />starcluster [global-opts] action [action-opts] [<action-args> ...]<br /><br />Available Commands:<br />-------------------<br />NOTE: Pass --help to any command for a list of its options and detailed usage information<br />...<br /></pre><br /><br />使用法が正しく表示されれば、導入は終わりです。<br /><br /><h2>HPCインスタンスセットアップ - StarClusterの設定</h2><br />次に、StarCluster自体の設定を行います。まず、StarClusterには設定ファイルのひな形を自分で作ってくれる機能があるので、これを利用しましょう。<br /><pre>% starcluster help<br />StarCluster - (<a href="http://web.mit.edu/starcluster)" target="_blank">http://web.mit.edu/starcluster)</a> (v. 0.9999)<br />Software Tools for Academics and Researchers (STAR)<br />Please submit bug reports to starcluster@mit.edu<br /><br />cli.py:92 - ERROR - config file /home/shun/.starcluster/config does not exist<br /><br />Options:<br />--------<br />[1] Show the StarCluster config template<br />[2] Write config template to /home/shun/.starcluster/config<br />[q] Quit<br /><br />Please enter your selection: 2<br /><br />>>> Config template written to /home/shun/.starcluster/config. Please customize this file.<br /></pre><br />途中選択が出ますので、2.の"Write config template to ..."を選びます。<br /><br />設定ファイルが ~/.starcluster/config に記述されるので、ここを書き換えて設定することになります。<br />下記設定ファイルを参考に、設定ファイルを書き換えます。特に記述のない場所はそのままで構いません。<br /><pre>[aws info]<br /># ↓この先で説明するアカウントID・秘密ID・ユーザーIDで置き換える<br />AWS_ACCESS_KEY_ID = ABCDEFGHIJKL123456<br />AWS_SECRET_ACCESS_KEY = foobarhogemogehage<br />AWS_USER_ID= 0000-0000-0000<br /><br />[key gsg-keypair]<br /># ↓このファイルは後ほど作成する。ディレクトリを自分の$HOMEに修正するのを忘れずに。<br />KEY_LOCATION=/home/shun/.ssh/id_rsa-gsg-keypair<br /><br />[cluster smallcluster]<br />KEYNAME = gsg-keypair<br /><br /># ↓クラスタの台数。最初は1台から、追加していくことも可能。1台あたりXeon 5570 * 2 socket = 8 CPU Cores.<br />CLUSTER_SIZE = 1<br /><br /># ↓ノードに入れるディスクイメージの識別子。この通りの番号で指定する。一覧には無いので注意。<br />NODE_IMAGE_ID = ami-12b6477b<br /># ↓GPUを利用したい場合はcg1.4xlargeとする。<br />NODE_INSTANCE_TYPE = cc1.4xlarge<br /></pre><br /><br />インスタンスは、<a href="http://mailman.mit.edu/pipermail/starcluster/2010-December/000572.html">今回新たに追加されたHPC用のStarClusterインスタンス</a>を用います。<br /><br />[aws info]の箇所は、利用者のAmazon AWSのユーザーIDを入れる必要があります。ユーザーIDは次のように取得します。まず、<a href="https://aws-portal.amazon.com/gp/aws/developer/account/index.html">https://aws-portal.amazon.com/gp/aws/developer/account/index.html</a>でログインし、左端メニューから「セキュリティ証明書」を選びます。<br /><img src="http://shuns.sakura.ne.jp/sblo_files/shuns/image/security-cert.png" width="214" height="210" border="0" align="" alt="AWSの画面 - セキュリティ証明書" /><br />アクセス証明書から、アクセスIDキーをAWS_ACCESS_KEY_IDに、シークレットアクセスキーをAWS_SECRET_ACCESS_KEYに設定してください。<br /><img src="http://shuns.sakura.ne.jp/sblo_files/shuns/image/access_key.png" width="714" height="99" border="0" align="" alt="AWSの画面 - アクセスIDキー" /><br />また、アカウント識別子をAWS_USER_IDに設定します。<br /><img src="http://shuns.sakura.ne.jp/sblo_files/shuns/image/account_id.png" width="303" height="50" border="0" align="" alt="AWSの画面 - アカウントID" /><br />最後に、EC2との間の通信に用いる公開鍵を生成します。<br /><pre>% starcluster createkey -o ~/.ssh/id_rsa-gsg-keypair geg-keypair<br /></pre><br /><br />これで準備は終わりです。クラスタを起動します。<br /><pre>% starcluster start small-cluster<br />StarCluster - (<a href="http://web.mit.edu/starcluster)" target="_blank">http://web.mit.edu/starcluster)</a> (v. 0.9999)<br />Software Tools for Academics and Researchers (STAR)<br />Please submit bug reports to starcluster@mit.edu<br /><br />>>> Using default cluster template: smallcluster<br />>>> Validating cluster template settings...<br />>>> Cluster template settings are valid<br />>>> Starting cluster...<br />>>> Launching a 1-node cluster...<br />...<br />>>> Starting cluster took 5.811 mins<br /></pre><br /><br />起動を待ったり、nfsの設定等にはかなりの時間がかかります。私の場合、1-nodeのクラスタを立ち上げるのに、6分ほど必要でした。<br /><br /><h2>プログラムの実行と、インスタンスの終了</h2><br /><br />実行中のインスタンスに接続しましょう。<br /><pre>% starcluster sshmaster smallcluster<br />...<br />The authenticity of host 'ec2-000-000-000-000.compute-1.amazonaws.com (000.000.000.000)' can't be established.<br />RSA key fingerprint is 00:00:00:00:00:00:...:00.<br />Are you sure you want to continue connecting (yes/no)? yes<br />..<br />[root@master ~]#<br /></pre><br />おなじみのsshのfingerprint確認が発生した後、マスターノードに接続できます。ユーザーsgeadminが追加されていますので、システム管理以外の作業（計算など）はそちらでの実行を推奨します。尚、sgeadminというユーザー名が嫌だという方は設定ファイル内のCLUSTER_USERを変更してインスタンスを再作成して下さい。<br /><pre>[root@master ~]# su - sgeadmin<br />[sgeadmin@master]~% <br /></pre><br /><br />コンパイラはgcc, mpicc(OpenMPI)などが使えます。また、ジョブサブミットシステムとしてSun Grid Engineが使えます。SGE経由でMPIプログラムを実行する際には、次のようにして下さい。nodelistはSGEから自動的にmpirunに渡されます。<br /><br /><pre>% cat foo.sh<br />#!/bin/bash<br />/usr/lib64/openmpi/1.4-gcc/bin/mpirun -np 8 ./a.out<br />% qsub -pe orte 8 foo.sh<br /></pre><br /><br />インスタンスを使い終えたら、次のようにして終了します。(3/30 修正)<br /><pre>% starcluster stop smallcluster<br /></pre><br />AWSの<a href="https://console.aws.amazon.com/ec2/home">management console</a>を開き、EC2 -> Instance を見て、インスタンスが止まっている(StatusがStopになっている)ことを確認して下さい。これで<b>計算ノードへの</b>課金は止まります。後述しますがディスク領域はAmazon側で保管されており、停止するまで課金が続きます。(3/30 修正)<br /><br />インスタンスの利用を再開するには、次のようにします。<br /><pre>% starcluster start -x smallcluster<br /></pre><br />この際、IPアドレスなどが再割り付けされますので、sshで手動アクセスする際などには気をつけてください。<br /><br />インスタンスを停止しても、ディスク領域には課金が続くことに注意してください($0.10 / GB-month)。完全に停止させるには、ディスク領域ごと破棄する必要があります。<br /><pre>% starcluster terminate smallcluster<br /></pre><br />上記の方法でどうしても止められなくなった場合は、<a href="https://console.aws.amazon.com/ec2/home">AWS management console</a>からインスタンスを直接選び、右クリックで"Terminate"を選んでください。<br /><br /><h2>注意点・TIPSなど</h2><br />動的にクラスタ台数を変更したい場合、 starcluster addnode で台数を増やすことが可能です。逆に removenode で台数を動的に減らすことが可能です。<br />ディスク容量を増やす<s>したり、データを一時的にAmazonに置いた上でインスタンスを停止させたりする</s>には、Amazon S3やAmazon EBSを使います。RX7さんのこちらの解説をどうぞ。<a href="http://d.hatena.ne.jp/rx7/20080429/p1">http://d.hatena.ne.jp/rx7/20080429/p1</a> <a href="http://d.hatena.ne.jp/rx7/20080825/p1">http://d.hatena.ne.jp/rx7/20080825/p1</a><br />また、様々な変更を行った後のディスクイメージを保存しておくには、starclusterのs3imageやebsimageを使うことが出来ます。<br />Fortranのコンパイラが欲しければ、gfortranを用いるか、<a href="http://www.open64.net/">Open64</a>などを用いると良いと思われます。Open64を利用してmpiプログラムをコンパイルする際には、<br /><pre>open64-4.2.3-0/bin/openf90 foo.f90 `mpif90 -showme:compile` `mpif90 -showme:link`<br /></pre><br />のようにすると良いでしょう。<br /><br /><h2>ベンチマークなど</h2><br />ノード間は10GbEで接続されていますが、レイテンシはお世辞にも良いとは言えません。ping(round-trip time)がおよそ<s>200us</s>90us-150usです。さらに、起動時のplacementによって通信性能が変化します。このため、ノード間をまたがる計算はあまり推奨できません。<s>また、クラスタを2個指定してインスタンスを立ち上げても、ネットワーク上で近い位置に配置してくれるわけではありません。</s><br />HyperThreadingを活用する都合上、システムにはプロセッサが8コア/ソケットのように見えますが、<a href="http://ark.intel.com/Product.aspx?id=37111">実際には4コア/ソケット</a>です。並列化効率が良くないプログラムでは、1ノードあたり8プロセス(=4コア/ソケット)にとどめるのが良いと思われます。<br /><br />参考までに分子動力学プログラムでのベンチマークを載せておきます。<br /><h3>GROMACS 4.5.4</h3><br /><a href="http://www.gromacs.org/About_Gromacs/Benchmarks" target="_blank">http://www.gromacs.org/About_Gromacs/Benchmarks</a> のgmxbench 3.0の参考データです。単精度でのみ計算しています。<table border=1><br /><tr><th>並列化方式</th><th>dppc (ns/day)</th><th>lzm.pme</th><th>poly-ch2</th><th>villin</th></tr><br /><tr><td>Threaded (n=16)</td><td>6.1</td><td>30.7</td><td>94.4</td><td>200.7</td></tr><br /><tr><td>MPI (2nodes)</td><td>9.2</td><td>29.8</td><td>49.5</td><td>161.5</td></tr><br /><tr><td>(参考) Corei5-750 Threaded (n=4)</td><td>2.3</td><td>17.5</td><td>37.4</td><td>96.2</td></tr><br /></table><br /><h3>NAMD-2.8b1-thread/TCP</h3><br />UDP使用バージョンはノード間を跨いだときにまともに動かなかったため未掲載（一定確率で落ちる）。系はSPC 1万分子(3万原子).<br /><s>どうもHVMと相性が悪くCPUを使い切れていないようなのでOpenMPIを使ってcharmmを再コンパイルするのが好ましい？</s>執筆直前にリリースされた2.8b1からスレッド並列がサポートされ、こちらは著しく改善しました。<br /><br />Threaded 8-thread / 16-thread<br />Info: Benchmark time: 8 CPUs 0.0350919 s/step 0.406156 days/ns 568.039 MB memory<br />Info: Benchmark time: 16 CPUs 0.0308002 s/step 0.356484 days/ns 1152.82 MB memory<br /><br />TCP 2-node<br />Info: Benchmark time: 16 CPUs 0.0372307 s/step 0.43091 days/ns 20.8592 MB memory<br />Info: Benchmark time: 32 CPUs 0.0320962 s/step 0.371484 days/ns 18.4872 MB memory<br /><br />(参考) Corei5-750:<br />Info: Benchmark time: 4 CPUs 0.0827083 s/step 0.957272 days/ns 32.3621 MB memory<br /><br /><h3>llcbench</h3><br /><a href="http://icl.cs.utk.edu/projects/llcbench/">llcbench</a>内のmpbenchを用いてMPI round-trip timeを測定しました。パケットサイズに対し、send/recvの対が終わるまでに掛かる時間を測定しています。Placement group指定付きでクラスタを2回起動してround trip timeを計測しました。<br /><table border=1><tr><th>Bytes</th><th>Round-trip time (us)</th></tr><br /><tr><td>4</td><td>106, 130</td></tr><br /><tr><td>4k</td><td>180, 188</td></tr><br /><tr><td>64k</td><td>691, 742</td></tr><br /><tr><td>1M</td><td>3878, 3888</td></tr></table><br /><br />

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/42340444.html">
<link>http://shuns.sblo.jp/article/42340444.html</link>
<title>2010年を振り返る</title>
<description>2010年は卒業含め色々と大変な年でした。1・2月はほとんど卒業に向けての何かで過ぎていった記憶があります。3月には4年過ごした部屋を引き払って京都に移り住みました。引っ越し前後のスケジュールが悲惨きわまりない状況になっていたため、ボロボロになりながら京都に到着、京都に着いてからもさらに1日大変な目にあったのが良い思い出です。4月からは京都の宇治（京大化研）でポスドクを開始。いきなり研究室の引っ越しをしたりと色々大変でした。5月からは事情により大学の仕事がデスマ進行になってし..</description>
<dc:subject>日記</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2011-01-01T19:08:32+09:00</dc:date>
<content:encoded><![CDATA[
2010年は卒業含め色々と大変な年でした。<br /><br /><span style="font-size:x-small;">1・2月はほとんど卒業に向けての何かで過ぎていった記憶があります。3月には4年過ごした部屋を引き払って京都に移り住みました。引っ越し前後のスケジュールが悲惨きわまりない状況になっていたため、ボロボロになりながら京都に到着、京都に着いてからもさらに1日大変な目にあったのが良い思い出です。4月からは京都の宇治（京大化研）でポスドクを開始。いきなり研究室の引っ越しをしたりと色々大変でした。5月からは事情により大学の仕事がデスマ進行になってしまい（ところでマーチ＋進行って頭痛が痛い？）大変なことに。9月までずっと繁忙期でした。まぁこの時見つけたネタをいま色々と料理している状況なので、悪いことばかりではありません。繁忙期と言いつつ6月には休暇を取って東京に行きICFP contestに参加。チームのメンバーが凄すぎて生きているのが辛い(TM)状況に。優勝を勝ち取ったものの、ぶっちゃけ僕が居なくてもこのチームは取れたと今でも思ってます！　7月8月は繁忙期継続。9月-10月には優勝したおかげでICFPの本会議に出席してくることが出来ました。<a href="http://twitter.com/chunjp/status/25939391420">twitterでも書きました</a>が、英語が聞けて関数型言語に興味ある人はぜひ一度は学会に出てみると良いと思います（宿泊費も参加費も旅費も高いですけどそれでも！　しかも今年は東京ですよみなさん！）。濃密な<strong>実現可能な妄想</strong>が飛び交う空間というのは素晴らしいです。出張途中に寄った大学でも新しいネタをもらって来ました。11月はちょっと休息モード。流石に5月からの進行のツケが回ってきたので一旦休憩したり。あと3ヶ月ぐらい真面目に考えていたネタが潰れて凹んだりしていました。あと長年苦しんだ論文が<a href="http://link.aip.org/link/?JCP/133/185102">出版されました</a>。なんかカバーペーパーになったらしく非常に嬉しいです。この論文は難産でしたし、結果も何かを証明するには微妙に不足しているのですが、モデルは非常に気に入っているのでこれからも頑張って育てていきたいと思います。12月は溜まりに溜まったタスクを潰したりしていました。あとFO3:NVやったりとか。近接戦闘のシステムがあんまり進化していないのでES5が心配です。</span><br /><br />皆様2011年もよろしくお願いします。<a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/41056052.html">
<link>http://shuns.sblo.jp/article/41056052.html</link>
<title>ICFP contest 2010 優勝</title>
<description>ICFP contest 2010で優勝しました。6人編成のチーム pure pure code++ として参加していました。参加の様子などは下記エントリを参照下さい。http://shuns.sblo.jp/article/39084088.htmlhttp://shuns.sblo.jp/article/39320300.htmlhttp://shuns.sblo.jp/article/39240773.html&quot;please keep your status (winn..</description>
<dc:subject>日記</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2010-10-02T09:54:09+09:00</dc:date>
<content:encoded><![CDATA[
ICFP contest 2010で優勝しました。6人編成のチーム <a href="http://twitter.com/nya3jp/status/16604202811">pure pure code++</a> として参加していました。参加の様子などは下記エントリを参照下さい。<br /><br /><a href="http://shuns.sblo.jp/article/39084088.html" target="_blank">http://shuns.sblo.jp/article/39084088.html</a><br /><a href="http://shuns.sblo.jp/article/39320300.html" target="_blank">http://shuns.sblo.jp/article/39320300.html</a><br /><a href="http://shuns.sblo.jp/article/39240773.html" target="_blank">http://shuns.sblo.jp/article/39240773.html</a><br /><br />"please keep your status (winning the contest) a secret until you get the prize during the conference." と言われていたので渡航とかの話は途中までカモフラージュしていたのですが、ICFP（関数型言語に関する国際会議）の会場参加者から私の存在がtweetされたりして意味が無かったです。バレバレ。というかメンバーが軒並み出張はどうみても怪しいです本当にありがとうございました。<br /><br />ところでこの渡航の途中にアメリカのある研究室に寄ったのですが、その会話がこんな代物でした：<br />「で、どんなものを競うコンテストだったんだい？」<br />「ああ、説明が難しいな。えぇと、僕たちは『プログラムが停止するか』を判定するプログラムを書いたんだ。」<br />（嘘は吐いてない、嘘は吐いてない、ちょっと、ちょこっと真実をぼかしただけ！）<br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/41010196.html">
<link>http://shuns.sblo.jp/article/41010196.html</link>
<title>HLPP参加記</title>
<description>HLPP参加記。例によって辛口。Dr.Hu 招待講演(NII) 電車を一本逃したので途中から参加。USの列車に期待してはならない。 Homomorphismを使ってプログラムをﾊﾞﾘﾊﾞﾘ変換するお話。 変換のために便利なのがweak inverse. この手の変換をするには逆関数が非常に重要。 全単射ではないので変換結果が正しくなるような関数群のうちの一つを使う Non-trivialな問題をMap-reduce型とかに変換できる。J. Enmyren. SkePU Mul..</description>
<dc:subject>日記</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2010-09-30T00:30:35+09:00</dc:date>
<content:encoded><![CDATA[
HLPP参加記。例によって辛口。<br /><br />Dr.Hu 招待講演(NII)<br /><ul><br /><li> 電車を一本逃したので途中から参加。USの列車に期待してはならない。<br /><li> Homomorphismを使ってプログラムをﾊﾞﾘﾊﾞﾘ変換するお話。<br /><li> 変換のために便利なのがweak inverse. この手の変換をするには逆関数が非常に重要。<br /><li> 全単射ではないので変換結果が正しくなるような関数群のうちの一つを使う<br /><li> Non-trivialな問題をMap-reduce型とかに変換できる。<br /></ul><br /><br />J. Enmyren. SkePU Multi-GPU programming library<br /><ul><br /><li> SkePUというマルチGPUのskeleton programing library. 話者はSkeep-youと発音。<br /><li> 関数をマクロで定義する。 BINARY_FUNC(plus, double, a, b, return a + b;) みたいに。<br /><li> 普通のスケルトン並列ライブラリ。新しいところはMulti-GPUサポート。<br /><li> 実は時間を一番食うのはHost-GPU間のデータ転送。メモリ転送をlazyに実行することで隠蔽するよう頑張る。<br /><li> 実例: ODEソルバ。手書きCUDAと比較して10%程度のオーバーヘッドで計算。<br />www.ida.liu.se/~chrke/skepu<br /><li> 質問: Non-uniform memory accessにどうやって対処するつもりか？ <br /> 本人は問題を把握しているようだが、回答がよく分からなかった。今回はGPUで扱いやすい問題をメインに扱うから問題ない？<br /></ul><br /><br />K. Matsuzaki. Lessens from Implementing the BiCGStab Method with SkeTo Library<br /><ul><br /><li> "Real application experience report". <br /><li> Sparse matrixの形状が決まっている。高速な計算が可能か？<br /><li> SkeTo はC++/MPIの普通のskeleton並列ライブラリ。<br /><li> SkeToはC++のテンプレートを大活用してskeletonを融合する。ループ操作を纏めるとかそう言う感じ。<br /><li> 知見： flexible data reallocation / shiftはライブラリ内でサポートしておくべき。<br /><li> stencilで分解するとfusionが足りないので自力でoptimizationを色々やる必要がある。今回はmanual fusionしたけど本当はライブラリでやって欲しいよね<br /><li> データのコピーオーバーヘッドが問題に。今回はsmart pointerを用いてコピーを節約するようにSkeToを改造<br /></ul><br /><br />O. Lobachev. Estimating Parallel Performance, A Skeleton-Based Approach.<br /><ul><br /><li> "Parallel penalty" の計測を考える。T(n)/p + A(n, p)<br /><li> A(n, p)を計測して実際に掛かる時間を予測する<br /><li> Amdahl's law に近いが単純に/pするだけじゃなくて、Divide & Conquerの時とかはコスト関数の和を真面目に考える。<br /><li> どんな関数で補外するのが良いかも調べる。<br /></ul><br /><br />BSP-WHY<br /><ul><br /><li> Loop invariantとかを表示することでBSPのプログラムをverify.<br /><li> 並列を直列実行でシミュレート。<br /><li> 要はCPU1台でマルチタスクのプログラムを走らせたと思えば。<br /><li> モデルがBSPだから確かに何とかなる気がする。<br /><li> 並列をfor proc in 1..p の形のループにしてしまう。<br /><li> loop variant / invariantをannotationとして入れる。<br /><li> いろんな証明器に対応。あるinvariantが1つのプログラムで証明できなくても他の証明器で証明できるかが調べられる。<br /><li> 質問: annotation必要なのはどーよ？ Loop終了の判定とかは全自動で出来ないの？<br /><li> 質問: ループの順番を変えても大丈夫であることはこの方法では証明できないのではないか？<br /><li> 質問への回答は聞き取れず(French-Englishは非常に辛い。。。)<br /></ul><br /><br />SymGrid-Par: <br /><ul><br /><li> Computational Algebra (Mathematica etc.)のparallelization<br /><li> socket経由で分散計算して回収したい。<br /><li> 問題点： この並列はdynamic（コンパイル時にタスクサイズが決まらない）でかつ並列度がタスクごとに大きく異なる<br /><li> Parallel Haskellバックボーン<br /><li> 中身はよくあるskeleton並列<br /><li> prefetch付きのidiomを導入。prefetchにより遅延を隠蔽するなど。<br /></ul><br /><br />Parallel Greedy Graph Matching<br /><ul><br /><li> Maximum cardinality matchingを考える。<br /><li> Greedy algorithmをどう並列にするか？ "find Best" "add edge" "remove edge" ... なんか並列化しづらそうですよ？<br /><li> Karp-Sipser algorithmを実装。意外とどうにかなるものである。<br /><li> Vertex based distribution (1D distribution) / Edge based distribution (2D distribution)<br /><li> BSP based parallel modelling。BSPはうまく実装するとちゃんとロードバランシングできるらしい。。。<br /><li> 確かに、待ち時間を調べてメッセージ交換すると出来るような気がする。<br /><li> ユースケース紹介だが、得られた知見はmatching問題特有のもので今ひとつよく分からず。<br /></ul><br /><br />Hybrid Bulk Sychronous Parallelism Library for Clustered SMP Architectures<br /><ul><br /><li> BSP modelのライブラリ in C++ (BSML (gava:09) のObject-oriented versionC++)<br /><li> C++ lambda support<br /><li> BSP_SECTIONで開始。ま た マ ク ロ か ！<br /><li> BSPは（まぁ当然ですけど）OpenMPに比べて8倍ぐらいsync速度が遅いです<br /><li> Hybrid BSP: 同じコードでMPI / OpenMP. <br /><li> OpenMPはsyncのコストが問題に。False sharingが起きるとMPIの方が早いケースも。。。<br /><li> 割と試してみたいと思う。が、C->C++以上の新奇性は？<br /></ul><br /><br />全体感想:<br /><ul><br /><li> 率直な外野からの感想からすると割とショボい。<br /><li> 何がショボいかというと色々あるんだけれど、同じようなアプローチを同じようにみんなで実施して同じような問題を抱えているようにしか見えない。Eccentricな提案がない。<br /><li> 計算のモデルが計算機に合わなくなってきている。今では計算そのものよりも通信やメモリ領域などがネックになりつつあるのに、そういう計算モデルを持ってきた人は皆無で、現在のHPCの人たちの問題意識などと著しく解離しているなーという気がする。かといってpost map-reduce型の計算を何か模索しているのかと思うとそうでもない。<br /><li> つまり現実にも適合してなければ理論的に現実の先や現実にないマシンを見ているわけでもない。<br /><li> 割とこの分野は熱的死に陥ってないか。今のやり方は過去(Flat parallelism; Map-Reduce; Calculation cost > memory transfer cost)に合わせているだけである。未来どころか現在にすら合っていない。<br /><li> 新しい血が必要という感想。<br /></ul><br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/39713703.html">
<link>http://shuns.sblo.jp/article/39713703.html</link>
<title>EC2 HPCを試す</title>
<description>EC2 HPCが出たので試してみました。結果から見るとhttp://shuns.sblo.jp/article/29808872.htmlhttp://shuns.sblo.jp/article/29809062.htmlとかで書いていたEC2スケールしない問題は無事に解消されているようです。ディスクが遅いという問題はあるものの、計算インテンシブなHPCであれば実機とほぼ同等のパフォーマンスが出るので、緊急に計算力が必要になった際にはかなり使えそうです。</description>
<dc:subject>日記</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2010-07-19T18:51:02+09:00</dc:date>
<content:encoded><![CDATA[
EC2 HPCが出たので試してみました。結果から見ると<br /><br /><a href="http://shuns.sblo.jp/article/29808872.html" target="_blank">http://shuns.sblo.jp/article/29808872.html</a><br /><a href="http://shuns.sblo.jp/article/29809062.html" target="_blank">http://shuns.sblo.jp/article/29809062.html</a><br />とかで書いていたEC2スケールしない問題は無事に解消されているようです。<br />ディスクが遅いという問題はあるものの、計算インテンシブなHPCであれば実機とほぼ同等のパフォーマンスが出るので、緊急に計算力が必要になった際にはかなり使えそうです。<br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/39582157.html">
<link>http://shuns.sblo.jp/article/39582157.html</link>
<title>固有値本</title>
<description>oxy君の日記に倣って最近読んでいる本を紹介してみます。Twitterでも何度かつぶやいたのですが、The Matrix Eigenvalue Problem: GR and Krylov Subspace Methodsを最近読んでいます。非常に良く解説された、固有値計算について最新の研究を纏めた教科書です。但し、人を選びます。本書では、いかにして行列を固有値計算に性質の良い形に変形していくかという点に絞り、QR法の同類(本書ではGR法と記述)と、Krylov部分空間法を解..</description>
<dc:subject>日記</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2010-07-11T23:57:36+09:00</dc:date>
<content:encoded><![CDATA[
<a href="http://mono.kmc.gr.jp/~oxy/d/?date=20090226">oxy君の日記</a>に倣って最近読んでいる本を紹介してみます。<br /><br />Twitterでも<a href="http://twitter.com/chunjp/status/17835909808">何度</a><a href="http://twitter.com/chunjp/status/17836129582">か</a>つぶやいたのですが、<a href="http://www.amazon.co.jp/gp/product/0898716411?ie=UTF8&tag=shuns-22&linkCode=as2&camp=247&creative=7399&creativeASIN=0898716411">The Matrix Eigenvalue Problem: GR and Krylov Subspace Methods</a><img src="http://www.assoc-amazon.jp/e/ir?t=shuns-22&l=as2&o=9&a=0898716411" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />を最近読んでいます。非常に良く解説された、固有値計算について最新の研究を纏めた教科書です。但し、人を選びます。<br /><br />本書では、いかにして行列を固有値計算に性質の良い形に変形していくかという点に絞り、QR法の同類(本書ではGR法と記述)と、Krylov部分空間法を解説します。説明は首尾一貫して基礎理論→実例の順に行われます。例えば3章ではeliminationの基本型をGRアルゴリズムとして紹介し、これでもかこれでもかと応用例(QR, LR, HR, SR)を示しています。<br /><br />数学書として見ると、手間の掛かる（が重要でない）証明が演習問題に回されることで、全体の見通しが非常に良くなっています。演習問題は一歩一歩細かく証明のステップを示してくれるので、行間が空きすぎると言うことはありません。<br /><br />私にとって収穫が特に大きかったのはproduct eigenvalue problemの部分で、ABCDEx=λFGHIJKxのような式をどう安定に解くか、という内容です。Product eigenvalue problemを紹介し、一般的な形式としてcyclic matrixに落とした後で、「特異値分解に特化した解法」としてdqdアルゴリズムを(再)紹介します。この一連の流れは非常に美しいです。私の頭の中で個々の別々のアルゴリズムとして記憶されていた固有値・特異値計算の数々の手法が繋がっていく過程が爽快でした。<br /><br />欠点としては(M)<a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.7650">RRR</a>などの比較的新しく、かつ重要な固有値計算方法が載っていないことが挙げられると思います。良くも悪くもこの本はQRの兄弟たちを基本としています。<a href="http://dx.doi.org/10.1007/BF01396757">D</a>&<a href="http://dx.doi.org/10.1137/S0895479892241287">C</a>もRRRも<a href="http://web.math.hr/~drmac/#PA">魔改造されたJacobi method</a>も載っていません。筆者は決してこれらを無視しているのではなく、はっきりと有効性を認めているので、せっかくだから纏めて欲しかった気もします。<br /><br />本書は自分で固有値・特異値計算を実装する事を考えている、修士以上の学生さんや、意欲のある学部4年生などにお勧めできます。逆に、ライブラリを使うだけの場合はZ. Baiの<a href="http://www.cs.ucdavis.edu/~bai/ET/contents.html">Templates for the Solution of Algebraic Eigenvalue Problems</a>(<a href="http://www.amazon.co.jp/gp/product/0898714710?ie=UTF8&tag=shuns-22&linkCode=as2&camp=247&creative=7399&creativeASIN=0898714710">Amazon</a><img src="http://www.assoc-amazon.jp/e/ir?t=shuns-22&l=as2&o=9&a=0898714710" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><br />) の方がアルゴリズムの選択チャートがあるので、簡便だと思われます。<br /><a name="more"></a>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="http://shuns.sblo.jp/article/39320300.html">
<link>http://shuns.sblo.jp/article/39320300.html</link>
<title>ひとりはんせいかい (ICFP-PC'10)</title>
<description></description>
<dc:subject>日記</dc:subject>
<dc:creator>chun</dc:creator>
<dc:date>2010-06-29T04:29:22+09:00</dc:date>
<content:encoded><![CDATA[
<br /><a name="more"></a>なんか今年は例年にも増してチームの役に立ってない度が高くて、終わった後もメンバーのみなさんが頑張って良かった探ししてくれる状況に涙を禁じ得なかったわけですが、どうしてこうなった。<br /><br />まぁ何が悪かったのかは比較的よく分かっていて、結局の所改造や改良に終始してしまって新しい方向性を実装orテストしなかったのがよくない。いろいろ出来ることはあったんだよなぁ……とりあえず挙げてみると<br /><br />・非線形整数計画と分かっていたんだから落ちているソルバを探すべきだった。こういうのは大抵Fortranだから動かすのも改造するのも俺向きだったはず<br />・Simulated Annealing以外のEmpirical Solversをいろいろ知っていたのだから試すべきだった。これも大改造が必要なものに手を出さなかった。<br />・おっくうがらずに色々手を動かすべきだった。<br /><br />うーむなんというか手を動かせという点に尽きるなぁ。これからも頑張ろう。<br />

]]><![CDATA[
]]></content:encoded>
</item>
</rdf:RDF>

