2008年03月
Linux の antivirus
- 2008-03-31 (Mon)
- 一般
必要性が見出せない気もするのだが,大学のネットワークを使う為のルールに「ウイルスチェックなしの利用」を禁止する項目があってくれるので avast! を入れた.amd64 環境に i386 なパッケージを --force-architecture で突っ込んでる時点で怪しい気もするけれど…
- Comments: 0
- TrackBack (Close): -
ラノベ:グロリアスドーン
- 2008-03-30 (Sun)
- 一般
アマゾンでお勧めされ続けていたので出版されている分を全部購入して読んだ.
結論:「ドリルはすばらしい」
むしろドリル以外が思い出せない…
- Comments: 0
- TrackBack (Close): -
新宿御苑へ
明日は雨が降りそうなので朝一で桜見に行ってきた.開園前に行列できてたので並んだ.んで,昼ごろには周りを気にしながら移動しなければならないくらい混んでた.みんな暇だねぇ.
- Comments: 0
- TrackBack (Close): -
プリンタ設定す
- 2008-03-28 (Fri)
- 一般
この前いれたubuntuから何かを印刷するときには
cat hoge.ps | ssh user@remote_server "lpr -Phuga"
とか ps ファイルを cat して別サーバで ssh ログインで実行した lpr にパイプで流すということをしていた.まあ,これで何の問題もない気がするのだけど折角だからとプリンタ設定してみた.
「システム」→「システム設定」→「印刷」で「新規プリンタ」を選択.なにやらLAN上をサーチしに行くようでしばらく応答がなくなる.応答が帰ってくるとLAN上のプリンタ一覧が出るので使いたいのを選択.次いで対応するPPDが存在していればそいつを選択(存在していれば自動で選択されるらしい)してプリンタの登録完了.楽だなぁ.
落とし穴としては,プリンタに対応するPPDをubuntuが自動で見つけてくれるのだけど,その見つけてくれたやつだと日本語psがうまく印刷できない(フォント周りで何か変)という現象にはまった.ps2psを一度通せば印刷できるとか.で,結局,使いたいプリンタがPostscriptプリンタなので,Genericの中にある PostscriptPrinter の PPD を使ってやったら問題なくなった.なんのこっちゃ.
- Comments: 0
- TrackBack (Close): -
テクレポ
- 2008-03-27 (Thu)
- 一般
とりあえず一つ目終わり.あとは二つ目.
ところで実験の実行及び結果のまとめに bash と awk でスクリプト何個も書くのは普通なのだろうか? スクリプト走らせるだけで設定を変えたプログラム群の生成からTeXのテーブル生成までやってくれるのだが… スクリプト書く時間が無駄だという気もしなくない.やり直し時の再実行時間の短縮にはなるけれど.
- Comments: 0
- TrackBack (Close): -
metapostる
- 2008-03-26 (Wed)
- 一般
約一年ぶりにmetapostで図を書いた気がする.でも,部屋のレイアウト決めにはGUIでオブジェクトを移動できるようなソフトのほうが適している気もしなくない.いっそのこと3次元に起こして物理エンジンで空間をシミュレーションするってのもいいかもしれない.データ作るの面倒そうだけど.
- Comments: 0
- TrackBack (Close): -
VMware で direct3d をまた失敗
- 2008-03-25 (Tue)
- 一般
32bit版の ubuntu いれて試したけど何も言わずに Linux ごと死んでくれる.なーにが悪いんかな?
- Comments: 0
- TrackBack (Close): -
バスに乗る
- 2008-03-24 (Mon)
- 一般
東京に出てきて7年くらいたつのだけれども今日初めて都営バスに乗った.雨降ってる中秋葉原へいく用事があったので.でも秋葉原まででも200円なのは高い気がしなくもない.バスの待ち時間も合わせると歩いたほうが早い可能性がるし.地下鉄のが10円安いし.
- Comments: 0
- TrackBack (Close): -
topological sort @sed
- 2008-03-23 (Sun)
- プログラミング ( sed/wake/awk )
書いてから気づいた.辞書順って出力文字列の辞書順か.点の番号での辞書順じゃないのね.最初に辞書順に並び替える部分書き加えればいいのだろうけど面倒なのでやらない方向で.どちらにせよ,最後の入力は時間オーバーだし.
G h $!d g s/^/\n/ : h s/\(.*\n\)\(\w*\):\n\(.*\)/\2/p G s//\1\3/ :1 s/^\(\(\w\+\).*\) \2\b/\1/ t1 s/.*\n//m /:/b d
固定文字列に対してはマッチした部分の消去が楽に出来るけど,動的な文字列にマッチした部分の消去ってのはまだうまくかけない.これの速度を上げられないといろいろな問題で困る.どうしたもんかなぁ.
それはさておき研究室に行ったのにネットワークが使えないってのは仕事すんなってことかな?
- Comments: 0
- TrackBack (Close): -
青梅の梅
青梅市にある梅の公園の梅が見ごろになってきたそうなので新しいカメラのテストを兼ねて旅に出た.が,カメラのバッテリー残量が少ないことに青梅駅で気づく.結局50枚程度で電池切れ.そして人多すぎた.以下抜粋.
- Comments: 0
- TrackBack (Close): -
MST by Kruskal & Prim @sed
- 2008-03-21 (Fri)
- プログラミング ( sed/wake/awk )
追いコンで「Primの方が単純ではないか」という指摘をもらったので試しに sed でも prim を実装することにした.
とりあえずオリジナルの Kruskal バージョン.大半がソートに取られている.もっと簡単で速いソートがほしい.
# input: # a set of edges # each line: v_in v_out weight # # output: # a set of edges marked with use-flag # eachline: useflag v_in v_out weight # # useflag = T if the edge is used # F if the edge is not used # # the order of edges in the output is not the same as the input # edges are sorted by weights # H $!d s/.*// x s/\n// h # make a set of vertices s/^\(\w* \w* \).*$/\1/gm :Z s/\b\(\w\+\)\b\(.*\b\1\b\)/\2/ tZ s/[ \n]\+/\n/g s/^\n*\|\n*$//g x # here, # hold space: vertices # pattern space: edges # rearrange to weight,v_in,v_out s/^\(\w*\) \(\w*\) \(.*\)$/\3,\1,\2/gm #=================== start of merge sort by key ============== # input: key1,value11,value12,...value1n\nkey2,value21,value22,...value2n\n... # output: sorted items # # a key is a number (i.e., key = [0-9]\+) # a value does not contain symbols (i.e., value = \w*) # s/$/ /gm :a /\n/!bq # each line is sorted: key1,value11,value12,...,value1n key2,value21,... # consequtive items are separated by a space # each item has a key and values # key is on the head, followed by values s/^\(.*\)\n\(.*\)$/@\1: %\2/gm # each line: @item11 item12 ... item1n : %item21 item22 ... item2m # ':' is a separator of two lists # '@' is the head of non-merged part of the first list # '%' is the head of non-merged part of the second list :b # each line: sortedpart @item1i ... item1n : %item2j ... item2m # already done s/^[^%@:\n]*$/~&/gm # done (2nd list is consumed completely) s/^\(.*\)@\(.*\): % *$/~\1\2/gm # done (1st list is consumed completely) s/^\(.*\)@: \(.*\)%\(.*\)/~\1\2\3/gm /@/!be x s/$/\n==mergesort_by_num_key==/ x H # ignore merged lists s/^~.*$/~/gm # prepare to comparation s/^.*@\(\w*\)\(,\w*\)*.*%\(\w*\)\(,\w*\)*.*$/\1 \3/gm #================= start of num_comparator ================ # # num11 num12\nnum21 num22\n...\n~\n...\nnumn1 numn2 # # each line is replaced with a relation # numk1 < numk2 -> < # numk1 > numk2 -> > # numk1 = numk2 -> = # a line of '~' is ignored # preserve the hold space x s/$/\n==num_comparator==/ x H # comparation by lengths :1 s/^ $/=/gm s/^ .*/</gm s/.* $/>/gm s/^[0-9]\|\b[0-9]//gm t1 s/\n//g G s/\n.*==num_comparator==// x s/\n==num_comparator==.*// x :2 s/\`=\(.*\)\n\(.*\)$/\1#\2/m s/\`<\(.*\)\n\(.*\)$/\1#</m s/\`>\(.*\)\n\(.*\)$/\1#>/m s/\`~\(.*\)\n.*$/\1#~/m t2 # comparation by values s/#/\n/g s/\n// s/^/#/gm :3 s/#\(.\)\(.*\) \(.\)\(.*\)/\1\3 #\2 \4/gm t3 s/#//g :4 s/00/=/g s/0[1-9]/</g s/[1-9]0/>/g y/123456789/012345678/ /[0-9]/b4 s/ //gm s/=*\(.\).*/\1/gm #================= end of num_comparator ================ s/\n//g G s/\n.*==mergesort_by_num_key==/#/ x s/\n==mergesort_by_num_key==.*// x # [<>=~]*#\nmergedpart @rest_of_list1 %rest_of_list2\n... # according to the results of comparations held in the head, # move a head of either the rest of list1 or list2 to the tail of merged_part. :m s/^[<=]\(.*\)\n\(.*\)@\(\(\w\|,\)*\) \(.*\)%\(\(\w\|,\)*\)/\1-\2\3 @\5%\6/m s/^>\(.*\)\n\(.*\)@\(\(\w\|,\)*\)\(.*\)%\(\(\w\|,\)*\) /\1-\2\6 @\3\5%/m s/^~\([^\n]*\)\n~/\1-/ tm s/-/\n/g s/#\n// bb :e s/~//g ba :q #=================== end of merge sort by key ============== s/ $// s/ /\n/g # restore the order s/^\(.*\),\(\w*\),\(\w*\)$/\2 \3 \1/gm x # hold space: sorted edges # pattern space: vertices # make singleton sets s/^.*$/& &/gm x s/^/#/ s/$/\n/ x # main loop # # use marked edge ('#' on the head) to union sets :Y # finished? x /#$/bX x s/$/\n==end_of_vertices==/ G s/==end_of_vertices==.*#\(\w* \w*\) .*/\1/ s/\(.*\)\n\(.*\)/\2\n\1\n/ #============== start of unionfind ======================== # # input: namex namey\nname1 parent1\nname2 parent2\n...\n # # output: root flag\nname1 parent1\n...\nnamex root\n...\nnamey root\n... # where root is the representive name of the set # parents of namex and namey are set to root # flag is F if namex and namey have already been in the same set # T otherwise (i.e., sets are unioned) # # find the root of the first element :A s/^\(\w\+\) \(.*\n\1 \(\w\+\)\b\)\([^#]\)/\3 \2#\4/ tA # find the root of the second element :B s/^\(\w\+\) \(\w\+\)\b\(.*\n\2 \(\w\+\)\b\)\([^#]\)/\1 \4\3#\5/ tB /^\(\w*\) \1\b/{s//\1 F/;bD} /^\w\+ \(\w\+\)\b.*\n\1 \1#/{s/^\(\w*\) \w*\b/\1 T/;bD} s/^\(\w*\) \w*\b/\1 F/ :D # refine the parent-relation :E s/^\(\w*\)\( .* \)\w*#/\1\2\1/ tE # add flags s/\n$// #============== end of unionfind ======================== # marking the edge x s/$/\n==end_of_edges==/ G s/#\([^\n]*\n\)\(.*\)\n==end_of_edges==\n\w* \(.\).*/\3 \1#\2/ x # remove return value of unonfind s/.*\n//m bY :X s/// s/\n$//
これのコメントをなくしてホールドスペースの保護用のマークを小さくすれば 1600B 弱になる.
次に,Kruskal のエッジソート後の処理を変えて作った Prim の実装.
# input: # a set of edges # each line: v_in v_out weight # # output: # a set of edges marked with use-flag # eachline: useflag v_in v_out weight # # useflag = T if the edge is used # F if the edge is not used # # the order of edges in the output is not the same as the input # edges are sorted by weights # H $!d s/.*// x s/\n// h # make a set of vertices s/^\(\w* \w* \).*$/\1/gm :Z s/\b\(\w\+\)\b\(.*\b\1\b\)/\2/ tZ s/[ \n]\+/ /g s/^ *\| *$//g x # here, # hold space: vertices # pattern space: edges # rearrange to weight,v_in,v_out s/^\(\w*\) \(\w*\) \(.*\)$/\3,\1,\2/gm #=================== start of merge sort by key ============== # input: key1,value11,value12,...value1n\nkey2,value21,value22,...value2n\n... # output: sorted items # # a key is a number (i.e., key = [0-9]\+) # a value does not contain symbols (i.e., value = \w*) # s/$/ /gm :a /\n/!bq # each line is sorted: key1,value11,value12,...,value1n key2,value21,... # consequtive items are separated by a space # each item has a key and values # key is on the head, followed by values s/^\(.*\)\n\(.*\)$/@\1: %\2/gm # each line: @item11 item12 ... item1n : %item21 item22 ... item2m # ':' is a separator of two lists # '@' is the head of non-merged part of the first list # '%' is the head of non-merged part of the second list :b # each line: sortedpart @item1i ... item1n : %item2j ... item2m # already done s/^[^%@:\n]*$/~&/gm # done (2nd list is consumed completely) s/^\(.*\)@\(.*\): % *$/~\1\2/gm # done (1st list is consumed completely) s/^\(.*\)@: \(.*\)%\(.*\)/~\1\2\3/gm /@/!be x s/$/\n==mergesort_by_num_key==/ x H # ignore merged lists s/^~.*$/~/gm # prepare to comparation s/^.*@\(\w*\)\(,\w*\)*.*%\(\w*\)\(,\w*\)*.*$/\1 \3/gm #================= start of num_comparator ================ # # num11 num12\nnum21 num22\n...\n~\n...\nnumn1 numn2 # # each line is replaced with a relation # numk1 < numk2 -> < # numk1 > numk2 -> > # numk1 = numk2 -> = # a line of '~' is ignored # preserve the hold space x s/$/\n==num_comparator==/ x H # comparation by lengths :1 s/^ $/=/gm s/^ .*/</gm s/.* $/>/gm s/^[0-9]\|\b[0-9]//gm t1 s/\n//g G s/\n.*==num_comparator==// x s/\n==num_comparator==.*// x :2 s/\`=\(.*\)\n\(.*\)$/\1#\2/m s/\`<\(.*\)\n\(.*\)$/\1#</m s/\`>\(.*\)\n\(.*\)$/\1#>/m s/\`~\(.*\)\n.*$/\1#~/m t2 # comparation by values s/#/\n/g s/\n// s/^/#/gm :3 s/#\(.\)\(.*\) \(.\)\(.*\)/\1\3 #\2 \4/gm t3 s/#//g :4 s/00/=/g s/0[1-9]/</g s/[1-9]0/>/g y/123456789/012345678/ /[0-9]/b4 s/ //gm s/=*\(.\).*/\1/gm #================= end of num_comparator ================ s/\n//g G s/\n.*==mergesort_by_num_key==/#/ x s/\n==mergesort_by_num_key==.*// x # [<>=~]*#\nmergedpart @rest_of_list1 %rest_of_list2\n... # according to the results of comparations held in the head, # move a head of either the rest of list1 or list2 to the tail of merged_part. :m s/^[<=]\(.*\)\n\(.*\)@\(\(\w\|,\)*\) \(.*\)%\(\(\w\|,\)*\)/\1-\2\3 @\5%\6/m s/^>\(.*\)\n\(.*\)@\(\(\w\|,\)*\)\(.*\)%\(\(\w\|,\)*\) /\1-\2\6 @\3\5%/m s/^~\([^\n]*\)\n~/\1-/ tm s/-/\n/g s/#\n// bb :e s/~//g ba :q #=================== end of merge sort by key ============== s/ $// s/ /\n/g # restore the order s/^\(.*\),\(\w*\),\(\w*\)$/\2 \3 \1/gm # pattern space: sorted edges # hold space: vertices s/^/F /gm s/$/%/ G s/%./\n% / # the first vertex s/ \w*$// #======== start of main loop :Y s/#// /%$/bX s/F/#F/ :V # marked with # is the current # used v1, unused v2 /#F \(\w\+\)\b.*%.* \1\b/!{/#F\( \w* \(\w\+\)\b.*%.*\) \2\b/{s//#T\1/ bY} bW} # used v2 unused v1 /#F \w* \(\w\+\)\b.*%.* \1\b/!{/#F\( \(\w\+\)\b.*%.*\) \2\b/{s//#T\1/ bY}} :W /#\(.[^F]*\)F/!bY s//\1#F/ bV #======== end of main loop :X s/.%//
こいつのコメントなどの無駄を省くと 1350B強.
ということで,Prim のほうが短く出来た.union/find なんか使わずに単純な処理で追加するエッジが選べるので短い.
が,しかし,上のPrimの実装はKruskalに比べて2倍近く遅い.ソート部分が同じなので,エッジの選択だけだと3~4倍は遅い.おかげで timeout をくらい提出できず.まだまだ改良の余地があるけれど,打数が伸びそうなので放っておくことにする.
- Comments: 0
- TrackBack (Close): -
海腹川背Portable の凄さに感動
- 2008-03-20 (Thu)
- 一般
バグってレベルでも仕様ってレベルでもなくただのジョークにしか見えない.まだ4月1日じゃないよなぁ? ま,全く別のゲームとしてやりこむ分には面白そうだけど.
とりあえず誰かがオープンソースでオリジナルのクローンを作り始めないかな?
- Comments: 0
- TrackBack (Close): -
VMware で direct3d 使おうとしたが…
- 2008-03-19 (Wed)
- ソフトウェア
vmx に mks.enable3d = "TRUE" と書いておいても色々な理由でフラグを落とされてうまく行かず.
とりあえず
svga.autodetect = "FALSE" svga.numDisplays = "1"
でディスプレイの枚数を一枚にしないといけないと.svga.autodetect = "TRUE" になってたもんだから numDisplays の設定が効かずに手間取った.
で,ubuntu の 64bit版を使っているので VMware が使用する 32bit 版のOpenGLまわりのライブラリを持ってこないといけない.手動で 32bit 版のnvidia ドライバ落としてきて /usr/lib32/ に突っ込む.
と,ここまでやってみたもののVMの起動時に signal 11 で落ちてくれる. さてどうしたもんか?
- Comments: 0
- TrackBack (Close): -
VMware Player 入れる
- 2008-03-18 (Tue)
- ソフトウェア
時々 Windows でしかうまく見られない添付ファイルが届くので,VMware Player に Windows XP 突っ込んで VM 上で開くことにした.
とりあえず VMware からtarを直接落としてきて sudo ./vmware-install.pl で手動インストール.仮想マシンの生成は http://www.easyvmx.com/ でやった.あと,XPインストール後にVMwareTools の iso ファイルをWindows版のVMware Player から持ってきてインストール.
いまんところ普通に動いてるもよう.
- Comments: 0
- TrackBack (Close): -
Qwerty + Dvorak
- 2008-03-17 (Mon)
- ソフトウェア ( Linux/coLinux )
Linux というか X だとキーボード配列の切替が楽でいい.大量に打ち込みをするウィンドウには Dvorak 使って,ショートカットを大量に使うGUIアプリには Qwerty 使うと快適.Windowsのとき Dvorak は打ち込みが楽だけど多くのショートカットキーが左手一本でカバーできなくなるのが面倒だったので.でも時々どのウィンドウがどっちの配列だか忘れて危険な打ち込みをすることに… ls と打ったつもりが no になったり,Ctrl-x で切り取り使用としたら Ctrl-w になっててウィンドウが閉じたり.あとコンソールだと Ctrl 押したときだけ強制Qwertyになる現象が起きているのでどうにかしたいところ.
- Comments: 0
- TrackBack (Close): -
なぜだらう?
- 2008-03-16 (Sun)
- 一般
VNC で接続したときに限って firefox が落ちる.例のSCIMの設定周りの問題が起きてるのだろうか? よくわからんので別のブラウザ使うことにする.
それはさておき日曜早朝の研究室は快適だ.
- Comments: 0
- TrackBack (Close): -
あなごるに問題投げる
- 2008-03-15 (Sat)
- 一般
よく知られているアルゴリズムを短くかける言語って何かなぁ,とか思ったので Minimum Spanning Tree の問題を投げてみた.アルゴリズムとしては Kruskal を想定.重み順のソートと,頭からのイテレーションと,union find とがあれば終わる.もしくはプライオリティキューで Prim か.どちらにせよ単純な問題を二つ合わせた分くらいの難易度かと思う.
以上が建前.
本音は, sed でも Kruskal のアルゴリズムくらいかけるので,頑張って書いた sed のアルゴリズムが普通の言語に比べてどれだけ長いかを確かめたい.ということで,問題の入力とかが sed のプログラムのタイムアウトに合わせて作られている.これくらいなら他の変な言語でも普通に解けるでしょう.metapost でもかけるくらいだし.
さてどうなることやら.
- Comments: 0
- TrackBack (Close): -
いまさらながら入館登録
- 2008-03-14 (Fri)
- 一般
土日や深夜(早朝)に研究室に入れないと作業効率が悪いので事務に入って職員証の入館登録をしてもらってきた.が,何か登録の手続きが事務の管理構造を上行ったり下行ったりで面倒そうだった.もっとスマートに処理できる体制になってほしいと思う.ついでに,情報を上下する際に職員証のコピーがとられたのだけど,クレジットカードの番号がついてるので危険な気が… ま,何か問題があったらこれのせいにしよう.
- Comments: 0
- TrackBack (Close): -
64bit版の ubuntu 入れる
- 2008-03-13 (Thu)
- ソフトウェア ( Linux/coLinux )
メモリが多いので 64bit 版がほしくなった.で,ローカライズド版の64bitがあるのかどうか知らんけど見つからないので本家の 64bit 版を入れた.インストール自体は何の問題もなし.
そんで,フォント周りとか気に食わないのでJapanese Teamのパッケージリポジトリを登録して追加パッケージをインストール.これも今のところ普通に動いている.
グラフィックまわりは, アプリケーション→追加と削除 で nVidia binary X.Org driver ('new' driver) をインストール,制限つきドライバの管理でドライバを有効化,sudo nvidia-settings で TwinView 設定,という流れでWUXGA x 2 という構成で動いた.とりあえず前回インストール時に GNOME のデスクトップへの切替で解像度がおかしくなる現象に見舞われたので,今回はディスプレイの解像度と座標を nvidia-settings で固定値にしておいた.ついでに システム→システム管理→モニタとグラフィックスカード で3840x1200の解像度を選択しておいた.
論文書くのに LaTeX がないと何も出来ないので,とりあえずいろいろと突っ込んだ.途中のシンボリックリンクはエラー回避の誤魔化し.
sudo apt-get install latex-env-ja sudo apt-get install latex-extra-ja sudo apt-get install texlive-latex-extra sudo ln -s /bin/true /usr/bin/mkcfm sudo apt-get install gs-cjk-resource cmap-adobe-{japan1,japan2,cns1,gb1} sudo apt-get install xpdf-japanese sudo ln -s /usr/bin/dvips /usr/bin/dvipsk sudo dpkg-reconfigure ptex-jisfonts
現状,A4で10ページ程度ではあるけれど, platex, bibtex, platex, platex, dvipsk のコンボが1秒で終わるのはありがたい.Linux だからなのかマシンが速いのかは知らんけど,とりあえずこれで生産性が向上する.
- Comments: 0
- TrackBack (Close): -
健康診断
- 2008-03-12 (Wed)
- 一般
どうしても血圧計とかに慣れることができない.血圧・脈拍ともに通常時の1.5~2倍に跳ね上がる.どこかに非接触式の血圧計とかないのだろうか・・・ 絶対に技術者の怠慢だと思うぞ.
- Comments: 0
- TrackBack (Close): -
宇治まっ茶のチロルチョコ
- 2008-03-11 (Tue)
- 一般
生協に行ったら大量に売っていたのでおもむろに45個入りを箱買い.抹茶が濃くてよい感じ.
- Comments: 0
- TrackBack (Close): -
でふらぐ
- 2008-03-10 (Mon)
- 一般
UltraDefragとかいうのを試した.速かった気がする.でもディスクの使用領域が小さかったからかも知れない.
とりあえずこれで Linux 用パーティションが用意できるのでさっさと Linux 入れよう.
- Comments: 0
- TrackBack (Close): -
Haskell で並列計算を試す
Control.Parallel の par を使うと第一引数を別スレッドで評価してくれる(かも).ということで,試した.
import Control.Parallel homP op f x = h x where h [a] = f a h (a:x) = fa `par` (hx `seq` (fa `op` hx)) where fa = f a hx = h x mapP f = homP (++) (\x->[f x]) chunk n [] = [] chunk n x = take n x:chunk n (drop n x) split p x = chunk (div (length x + p - 1) p) x mapS f dxs = mapP (map f) dxs reduceS op dxs = homP op (foldl1 op) dxs main = print $ reduceS(+) $ mapS f $ split 32 [1..10000] f n = fib 16 fib 0 = 1 fib 1 = 1 fib n = fib (n - 1) + fib (n - 2)
基本,split でチャンクに切り分けて,homP で各チャンクに対する計算を並列評価する.
par の型は a -> b -> b で,デフォルトだと最初の引数を完全に無視する.んで,コンパイルというかリンク時に -threaded をつけてやると別スレッドでの並列評価を試みるコードになってくれるらしい.あと,実行時に +RST -N2 とかやって, N オプションで生成するネイティブスレッドの数を指定する.
とりあえず上のコードを デュアルコアで動かしたら 2.5 秒が 1.5 秒になる程度の効果が現れた.確かに並列で評価してくれているらしい.
ちなみに,
main = print $ sum $ concat $ mapS f $ split 32 [1..10000]
としてあげると並列計算の効果が全く現れない.sum の計算が concat の結果を頭から消費していく形なので,前のチャンクの結果が sum で消費しつくされてからしか次のチャンクの評価が起こらない.なので,mapS f での各チャンクに対する map f の評価が逐次的にしか起きてくれず,並列計算にならない.と思う.とりあえず遅延評価があると思ったより面倒だなぁ.
- Comments: 0
- TrackBack (Close): -
PPL三日目
- 2008-03-07 (Fri)
- 一般
普通に終了.帰りのバスと電車で頭を二回ぶつけたせいで聞いた内容が吹っ飛んだ.Modal μ-calculus のトリックと離散数学でのトリックとの関係が気になる.
- Comments: 0
- TrackBack (Close): -
PPL二日目
- 2008-03-06 (Thu)
- 一般
マイナーな言語でプログラム書いて喰っていけるという話は面白かったなぁ.Scheme と OCaml は使ってる会社があるから Haskell でやってる会社とかもあるのかしら? 実アプリケーションにおいて遅延評価ってどうなんだろ?
そして夜は宣伝の突撃をかます.
- Comments: 0
- TrackBack (Close): -
PPL一日目
- 2008-03-05 (Wed)
- 一般
とりあえず,静的な片付け言語で変数の型を明示するのはユーザにとって面倒だから,動的な型付け言語で変数の型を明示しないでプログラム書きたいよねという雰囲気になっていたような.これって別に動的でなくても型推論が超強力なら問題ない気もするのだけど… 型ってそんなに邪魔かねぇ?
- Comments: 0
- TrackBack (Close): -