Kahjin’s Weblog

[ゲーム]

未分類 カテゴリーへ kahjin が 12月 20, 2009 に投稿

http://www.worldofmunchkin.com/

なかなか楽しめた。絵柄がユニーク。機会があれば、もっとやってみたい。

http://www.zmangames.com/boardgames/pandemic.htm

深夜だったので、ルールの説明が頭に入らない。しかし、いろいろ凝っている。

epidemicが起きた都市は再発しやすい 破棄した都市カードをシャッフリングして、山に戻す。

epidemicの発生は周期変動 定期的にepidemicカードが出るよう初期調整

epidemicの突発(潜伏) カード山の一番最後を引く

都市カードのサンプリング ウイルス株の収集

ワクチンの開発と体制の構築 基地

沈静化 …

epidemicからpandemicになるウイルス伝播モデルとグラフ理論の応用

[写真]

未分類 カテゴリーへ kahjin が 12月 20, 2009 に投稿

[和訳]LYHGG2-7

未分類 カテゴリーへ kahjin が 12月 20, 2009 に投稿

http://learnyouahaskell.com/starting-out#im-a-list-comprehension

Creative Commons

I’m a list comprehension※49

数学の授業を受けたことがあるなら、おそらく集合の内包表記(set comprehension)に出くわしたと思うんだ。ある集合から特定の集合を構築するときによく使われてたよね。例えば、基本的な表記で10までの自然数でその2倍の集合となると、

set notation

だったよね。|(パイプ)の前の部分はoutput関数で、xがvariable、Nがinputの集合で、x <= 10がpredicateってわけ。この集合はx <= 10を満たしている自然数のダブルを含んでいるという意味になるんだ。これをHaskellで書きたいなら、さっきのようにtake 10 [2,4..]ってできるだろうね。ただ、これだと複雑な関数に適用しずらいよね?そんなときはlist comprehensionを使うんだ。書き方もset comprehensionと似てるしね。じゃあ、さっきのやつをHaskellで書いてみよう。

[x*2 | x <- [1..10]]って書けるんだよ。xは[1..10]から値を受け取って(変数束縛)、それを2倍にするんだ。実行してみて。

ghci> [x*2 | x <- [1..10]]
[2,4,6,8,10,12,14,16,18,20]

望んでいる結果が得られたね。じゃあ、条件(or predicate)をlist comprehensionに追加してみよう。predicateはカンマで追加していくんだ。12以上のダブルの要素だけがほしいなら、こう宣言しよう。

ghci> [x*2 | x <- [1..10], x*2 >= 12]
[12,14,16,18,20]

cool!うまくいったね。50から100までの自然数で7で割ると余りが3になる数を選びたかったら、どうする?

ghci> [ x | x <- [50..100], x `mod` 7 == 3]
[52,59,66,73,80,87,94]

やったね!predicateでリストを刈り取ることをfilteringとも呼んでいるから。今ちょうど、リストの数を受け取って、predicateでfilterしたところ。すっきりしたでしょ?※50。別の例も考えよう。10より大きい奇数の場合、”BANG!” と、10より小さい奇数の場合、”BOOM!”という文字列に置換するlist comprehensionを宣言してみよう。もし、数が奇数でないのなら、リストから捨てちまうよ。簡単なことなんだけど、関数もそのcomprehensionの中に組み込めるから、再利用が容易なんだ。

boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]

最後のところ(odd x)がpredicateね。odd関数は数が奇数ならTrueを、偶数ならFalseを返す関数だよ。リストにはpredicateでTrueと評価された要素しか入らないんだ。

ghci> boomBangs [7..13]
["BOOM!","BOOM!","BANG!","BANG!"]

predicateはいくつでもいけるよ。例えば、10から20までの数で13,15,19をfileterしたかったら、こうする。

ghci> [ x | x <- [10..20], x /= 13, x /= 15, x /= 19]
[10,11,12,14,16,17,18,20]

複数のpredicateをlist comprehensionの中に組み込めるだけでなく、複数のリストもその中に組み込めるよ。ただし、複数のリストを組み込んだ場合、要素の組み合わせの数すべてにpredicateが適用され、outputされるんだ。何もfilteringしなければ、長さが4のリストが二組あれば、16の長さのリストが作られるんだ。[2,5,10] と[8,10,11]の2組のリストがあったとしたら、要素をすべて掛け合わせた結果は以下のとおり。

ghci> [ x*y | x <- [2,5,10], y <- [8,10,11]]
[16,20,22,40,50,55,80,100,110]

予想どおり、9つの要素のリストが得られたね。これを50以上の要素だけ欲しい場合はどうするかな?

ghci> [ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50]
[55,80,100,110]

形容詞と名詞のリストでlist comprehensionならこう… for epic hilarity※51

ghci> let nouns = ["hobo","frog","pope"]
ghci> let adjectives = ["lazy","grouchy","scheming"]
ghci> [adjective ++ " " ++ noun | adjective <- adjectives, noun <- nouns]
["lazy hobo","lazy frog","lazy pope","grouchy hobo","grouchy frog",
"grouchy pope","scheming hobo","scheming frog","scheming pope"]

list comprehensionを使って、独自のlength関数を書いてみよう。length’関数とでも呼ぼうか。

length’ xs = sum [1 | _ <- xs]

_はワイルドカードね。どんな変数名のやつがきても気にしない。この関数はすべての要素を1に換えて、それらを合計しているんだ。結果的にsumはリストを長さを計算していることになるよね。

ちょっと思いだしてみて。文字列もリストだから、list comprehensionを使って、文字列を操作することも可能なんだ。文字列を受け取って、Uppercaseな文字だけを返す関数を考えよう。

removeNonUppercase st = [ c | c <- st, c `elem` ['A'..'Z']]

即実行!

ghci> removeNonUppercase “Hahaha! Ahahaha!”
“HA”
ghci> removeNonUppercase “IdontLIKEFROGS”
“ILIKEFROGS”

ここでもpredicateが機能したね。['A'..'Z']に含まれている文字だけのリストが生成されたよね。リストがネストした場合もlist comprehensionはうまくいくんだ。リストを展開せずにリストの中にあるリストから奇数だけを取り除きたいなら、こうする。

ghci> let xxs = [[1,3,5,2,3,1,2,4,5],[1,2,3,4,5,6,7,8,9],[1,2,4,2,1,6,3,1,3,2,3,6]]
ghci> [ [ x | x <- xs, even x ] | xs <- xxs]
[[2,2,4],[2,4,6,8],[2,4,2,6,2,6]]

次文省略 You can write list comprehensions across several lines. So if you’re not in GHCI, it’s better to split longer list comprehensions across multiple lines, especially if they’re nested.

ではよいお年を〜

  • ※49 蛙の子は蛙 あるカエルの種は体内で卵を孵化させ、子を育てるよ。だから、何だってんだい、カエル野郎!御免返る
  • ※50 Success Storyは理髪店。
  • ※51  どうも訳せなかった。わかりました?

[メモ]traceroute

未分類 カテゴリーへ kahjin が 12月 20, 2009 に投稿

(VMware上の)ubuntuからtracerouteをする場合、root権限だと、
traceroute: icmp socket: Operation not permitted

とpromptに表示されたので、userに権限変更したら、使えた。

初めての場合

Command ‘traceroute’ from package ‘traceroute-nanog’ (universe)
Command ‘traceroute’ from package ‘traceroute’ (main)

となる。

man traceroute

NAME
traceroute – print the route packets trace to network host

SYNOPSIS
traceroute [-46dFITUnreAV] [-f first_ttl] [-g gate,...]
[-i device] [-m max_ttl] [-p port] [-s src_addr]
[-q nqueries] [-N squeries] [-t tos]
[-l flow_label] [-w waittime] [-z sendwait]
[-UL] [-P proto] [--sport=port] [-M method] [-O mod_options]
[--mtu] [--back]
host [packet_len]
traceroute6  [options]

DESCRIPTION
traceroute  tracks  the route packets taken from an IP network on their
way to a given host. It utilizes the IP protocol’s time to  live  (TTL)
field  and  attempts to elicit an ICMP TIME_EXCEEDED response from each
gateway along the path to the host.

traceroute6 is equivalent to traceroute -6

注意
Windowsと*nix系の(tracert/traceroute)違い、ICMPとUDPのパケット送信の違い


[徒然]

未分類 カテゴリーへ kahjin が 12月 12, 2009 に投稿

映画館の前を通りかかったら、なにやら長蛇の列ができていて、何かな?って中を見たら、「ワンピース」の封切りだった。数珠つなぎってやつですかの。

[写真]

未分類 カテゴリーへ kahjin が 12月 11, 2009 に投稿

[和訳]LYHGG2-6

未分類 カテゴリーへ kahjin が 12月 11, 2009 に投稿

http://learnyouahaskell.com/starting-out#texas-ranges

Creative Commons

Texas ranges※42

1から20までの数のリストがほしいなら、どうしたらいい?もちろん、全部を書き下すことはできるんけど、ちっとも美しくないし、紳士ならそんなことはしない。じゃあ、どうするかって?rangesを使うのさ。rangesはある法則に従って、並べられた要素のリストを作る方法なんだ※43。例えば、数なら、1,2,3,4 ってね。文字でも同じことa,b,c,d …。アルファベットでもAからZとかね。名前がenumerateされるだって?冗談もよしこさん!”John”の後に何が来るってのさ?んなこと、知らないよ※44。1から20までの自然数をすべて含むリストを作りたかったら、[1..20]て書けばいいだけだよ。これは[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]って書いたのと一緒のことなんだ。これらの書き方に本質的な違いはないんだけど、後者の書き方をするのは愚か者だけさ※45。

ghci> [1..20]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
ghci> ['a'..'z']
“abcdefghijklmnopqrstuvwxyz”
ghci> ['K'..'Z']
“KLMNOPQRSTUVWXYZ”

rangesは階段を登るのに何段跳ばしにするか?みたいなこともできて、便利なんだ。例えば、1から20までの自然数で、二段跳ばし(2の倍数)や三段跳ばし(3の倍数)がほしいなら、

ghci> [2,4..20]
[2,4,6,8,10,12,14,16,18,20]
ghci> [3,6..20]
[3,6,9,12,15,18]

一つ目と二つ目の要素をカンマで区切って、何段跳ばしにするか決めてからrangesの上限を設定するんだ。一見細身になってかわいいんだけど、このやり方はそれほど賢くはないんだ。例えば、1から100までの間で、2の乗数がほしいと思って、このように[1,2,4,8,16..100]ってやろうとしてもできない。rangesは何段跳ばしにするのか決めないと使えないし、これだと、何段跳ばしにするのかがはっきりしないし、曖昧だから※46。20から1までの間のすべての数のリストがほしいなら、[20..1]ではなく、[20,19..1]にすることね※47。floating point numbersにrangesを使ったところを観てみよう。ひどい結果になったね。

ghci> [0.1, 0.3 .. 1]
[0.1,0.3,0.5,0.7,0.8999999999999999,1.0999999999999999]

定義(抑え)が不正確(安定)だからなんだけど、rangesの起用法には気をつけてね。ただ、僕ならfloating point numbersには使わないけどね。rangesは上限のない無限リストにも使えるんだ。無限リストは後で詳しく説明するよ。それじゃあ、13の倍数の数を頭から24個ほしいって思ったら、どうする?[13,26..24*13]ってするかもね。でも、take 24 [13,26..]の方がいいでしょ。それって、Haskellがlazyだからなんだけど、無限リストをすぐさま評価しようとしても、決して終わらないからね。君が無限リストから必要な分だけ取り出すのを見守っているんだ。そして、24個とれたら、そっと役目を終えるんだ。じゃあ、無限リストを生成する関数を紹介しよう。

cycle関数はリストを受け取って、それを無限リストに放り込む関数なんだ。一度でもcycle関数を呼び出した結果を見ようものなら、その無限リストは果てしなく続いているだろうから、どこかでその輪廻を絶ちきってやらないといけない。

ghci> take 10 (cycle [1,2,3])
[1,2,3,1,2,3,1,2,3,1]
ghci> take 12 (cycle “LOL “)
“LOL LOL LOL “

repeat関数はある要素を受け取って、その要素のみの無限リストを生成する関数なんだ。たった一つの要素が繰り返すcycle関数のように※48

ghci> take 10 (repeat 5)
[5,5,5,5,5,5,5,5,5,5]

同じ要素のリストがほしいなら、replicate関数を使うともっと単純にできるけどね。こんな風に、replicate 3 10  returns [10,10,10].

  • ※42 テキサスレンジャーズ ってガンマンの絵なのかい!*..* て二丁拳銃をぶっ放しているように見えるよね。
  • ※43 ちょっと前にEnumクラスがどうとかって言ってたけど、Enumerateね。列挙するとか訳としてはあるけど、列挙型とかいってぱっとわかるかな?テキサスレンジャー部隊なら、訳としては整列のほうがいいよね。
  • ※44 ブレスト中… とマイケル、ホプキンス、デンバー、トラボルタ 、ジャック・ルソー、ソン、ホッパー だめだ限界。
  • ※45 決闘の場に丸腰で望むのかい?銃を持たないのなら、ストーブの蓋でも身につけることだな。ただのB.T.F. III好きです。
  • ※46 one stepのみ。 ホップ、ステップ、ステップ.. ジャンプだとフライング。あと、助走している最中に、跳び箱の段数が変化したら戸惑うでしょ。
  • ※47 ちなみに、[20..1]でやると…
  • ※48 Like a rolling stone  どんぐりころころどんぐりこ

[写真]

未分類 カテゴリーへ kahjin が 12月 8, 2009 に投稿

[音楽]

未分類 カテゴリーへ kahjin が 12月 6, 2009 に投稿

浮世の沙汰も金次第。

Wow> sum [M,M,M,M]

4M$

Wow> product [M,M,M,M]

YStory

inspired by a book, “How the Impressionist Painting Conquered the World”

[徒然]

未分類 カテゴリーへ kahjin が 12月 6, 2009 に投稿

道である場所がどこかと尋ねられたので、「わかりませんが、広域の地図なら持っています(たまたま、持って外出していた)」と言ったら、「いいです」と言って、去っていかれた。地図を持っているなんて、怪しまれたのか。

道往く人に尋ねまくっている様子だったけど、これ何かの実験なんですかね?

認知度テスト?

<<<>>>

正確ではないのだが、まあこんな感じです。