Hatena::ブログ(Diary)

暗号、数学、時々プログラミング このページをアンテナに追加 RSSフィード

2009-09-20

ホテル暮らしを開始

21:01 | ホテル暮らしを開始を含むブックマーク


日本への帰任という事で、3年間お世話になったアパートを出てホテルへと移動することになった。ドイツの慣習では、退去後に大家さんと立会いを済ませた場合、それ以上は住みつづけてはいけないのだそうで。(まぁ、一緒に確認した「現状」が変わる恐れがあるんだから、ダメだわな)


そんなワケでミュンヘン滞在はあと数日あるのだが、今のアパートとは本日でサヨナラ。

正直あんまり愛着もないし、ミュンヘン大好き!という事もなかったので大した感慨はナシ。


OCaml Meeting 以降、随分とバタバタしたがこれで一段落。もちろん、日本に着いてからの引っ越しはもっと大変なので、本格的に落ち着くまでにはあと数週間は必要だろうけど…


とにもかくにも、ようやく帰国でござる。

やっと毎日美味いメシが食えるワケですな…

moridaimoridai 2009/09/20 22:09 >やっと毎日美味いメシが食えるワケですな…
僕も帰国の時はこんな心境でしたw

2009-08-11

ブコメの文字数が足りないので、トラバをしてみたでござる

| 17:51 | ブコメの文字数が足りないので、トラバをしてみたでござるを含むブックマーク


が、コメントを伝える為の役割を果たしたので削除させて頂いたでござる。

間違いを指摘する系のエントリは、あまり気分の良いものではないので…

2009-07-30

【第6話】レコードで悪戦苦闘

| 06:36 | 【第6話】レコードで悪戦苦闘を含むブックマーク


#light "off" 

type gakusei_t = {
	namae : string;
	tensuu : int;
	seiseki : string;
};;
#load "test11.fs";;

> > > [Loading C:\Program Files\SharpDevelop\3.0\bin\test11.fs]

namespace FSI_0007
  type gakusei_t =
    {namae: string;
     tensuu: int;
     seiseki: string;}
let student1 = { namae = "asai";  tensuu = 70;   seiseki = "B"};;

  let student1 = { namae = "asai";  tensuu = 70;   seiseki = "B"};;
  -----------------^^^^^

stdin(23,18): error FS0039: The record label 'namae' is not defined.

「うーん、、、なんだ? なんで駄目なんだ。。。?」

いろいろ試してコレで3回目。何がなんだか分からない。

一体何がドウなってんの??

「え?レコードの定義ならアタシは出来たよ?」と余裕のミラっち。そう、僕等は今「喫茶:ガロアの時間」にいる。そしてミラっちはいつものようにストローで爽健美茶を飲みながらニンマリと僕の方を見てる。

これはなんだか悔しい。。だけど、ここは教えを請う方が早い気がする。

「僕のやり方と何が違うのかな?」

質問する僕に、グラスを置いたミラっちが少し嬉しそうに話し始める。

インタラクティブコンソールを使って定義したダケなんだけど、SharpDevelopって改行させると変になるじゃない?だからこんな感じで型を定義して、、、」

と、ここでミラっちが自分のほうにキーボードを向ける。

type gakusei_t = {namae : string;tensuu : int;seiseki : string};;
 > 
type gakusei_t =
  {namae: string;
   tensuu: int;
   seiseki: string;}

「うーん。。ここまでは僕の場合も上手く行ってるみたいなんだけど。。。」

と、呟く僕にお構いなしでミラっちはキーを打ち続ける。すると・・・

let student1 = { namae = "asai";  tensuu = 70;   seiseki = "B"};;

> 
val student1 : gakusei_t = {namae = "asai";
                            tensuu = 70;
                            seiseki = "B";}

「あ、、、ホントだ。。」

「ね?」と、得意顔のミラっち。

いや、出来てるのは分かったんだけど、何かこう、、、納得がいかない。

「で、、、僕のやり方との差分って何なんだろ?」

呟かずにはいられなかった。

「確かに見た感じは一緒よね。アタシの場合はレコードの定義を1行で済ませちゃってるのと、それぞれのフィールド定義の間に文字を挟んでないとこが違うって言えば違うところなんだろうけど・・・」

「そうだね。うーん。。。これも"Lightweight Syntax"とか F# 独特の記法の問題になるのかなぁ・・・?」

「・・・なんかそれっぽい気はするわね。。」とミラっち。

「でも、この前ネットでダウンロードした資料"Foundations of F#" の66ページ辺りにある説明を読む限り、レコードの宣言で改行を使っちゃ駄目なんて事は書いてないと思うんだよなぁ・・・」

「え? 何それ?」

「ああ、コレだよ。"Foundations of F#"。このサイトで配られてる無料電子ブックなんだけど、本としても出版されてるものみたい。」


「へー。。 でも、そこまでやってもアタシより・・・」

意地悪く笑いながら僕を見るミラっち。

「うー。それは言わないでよ。。。」

確かに、とほーっ!って感じだ。。

「少なくとも言えるのは、ミラっちのやり方でファイルを作ったとしても、、、」

#light "off" 

type gakusei_t = {namae : string;tensuu : int;seiseki : string};;
let student3 = { namae = "ishii";  tensuu = 90;   seiseki = "A"};;
#load "test11b.fs";;

> [Loading C:\Program Files\SharpDevelop\3.0\bin\test11b.fs]

namespace FSI_0023
  type gakusei_t =
    {namae: string;
     tensuu: int;
     seiseki: string;}
  val student3 : gakusei_t
student3;;

  student3;;
  ^^^^^^^^

stdin(33,1): error FS0039: The value or constructor 'student3' is not defined.

「期待通りには動いてくれないってコトだね」

「あー。ホントだ。なんでなんで??」

不満顔のミラっち。

「いや、僕に聞かれても・・・ 差分といえば、やっぱり明示的に『#light "off"』ってやってる部分だとは思うんだけど・・・」

「うー。なんかスッキリしないわね・・・」

「うん。。もうちょっとしっかり調べないとだなぁ。。」

「そうね。。。 っていうかさ。」

「ん?」

「F#って、基本的にはみんな『#light "off"』はやらないだろう、って前提で本が書かれてるワケよね?」

「あー。。分からないけど、確かに"Foundations of F#"に関してはそんな印象を受けるかも」

「だとするとアタシ達の挑戦してる事って、結構無謀だったりするんじゃない?」

「・・・うーん。。どうだろ?」

なんか否定はできないような気がするけど、肯定できるほどにはまだ良くF# を理解出来てないからなぁ・・・

「あんまりリンダさんに頼りすぎるのも悪い気はするし、、状況が結構厳しいのは確かだよね・・・」

「・・・そうね」

少し不機嫌そうに返事するミラっち。あれ?何か僕、変な事を言ったっけ?

「いずれにせよ、近いうちに『OCamlの学習環境として F# を使う』のか? それとも『F# を効率的に勉強するために OCaml の本を使う』のか? って辺りについては、ハッキリさせないといけない時が来るのかなぁ、、、って気はするね」

「どっちかを選ぶ、、、かぁ・・・」

何か考え事をしてるのか、ミラっちがグラスを指で何度も弾く。

「うん。選ばないといけないだろうね」

そんなミラっちをぼーっと眺めながら、僕はそう呟いた。


・・・・・・・・・

「えーと、なんか一応『#light "off"』を外してみると、やろうと思えば、、」


type gakusei_t = 
   {namae : string;
    tensuu : int;
    seiseki : string }

let student3 = { namae = "ishii";  tensuu = 90;   seiseki = "A"}

printf "%s" student3.seiseki;;
> [Loading C:\Program Files\SharpDevelop\3.0\bin\test11b.fs]
A
namespace FSI_0049
  type gakusei_t =
    {namae: string;
     tensuu: int;
     seiseki: string;}
  val student3 : gakusei_t

「・・・って感じで動くは動くみたいだね」

「ホントだー」

ふー。トライ&エラーで20分近く。ここまでたどり着くまでが長かったなぁ・・・

「F# の扱いをドウするかはまた考えるとして、ひとまず今は、教科書の第8章を進めることにしてみない?」

「ま、それが妥当よね」と、あっさり賛同するミラっち。

「それじゃ、まずはレコードのデータをパターンマッチで取り出してみようか」

let tsuuchi gakusei = match gakusei with
     {namae = n; tensuu = t; seiseki = s} ->
     n ^ " さんは" ^ string(t) ^ " 点で、成績は" ^ s ^ " です。"
   
let ans = tsuuchi {namae="umeda"; tensuu=62; seiseki="C"}

printf "%s" ans

int型の点数"t"を文字列型に変換するやり方が OCaml と微妙に違うところがポイントだ。

書き方としては、OCamlの方が自然言語っぽい感じするけど、入力する側としてみるとF#の方が楽かな?

さてと結果は…

#load "test12.fs";;

「ありゃ・・・?」

test12.fs(2,6): warning FS0058: possible incorrect indentation: this token is offside of context started at position (1:23). Try indenting this token further or using standard formatting conventions
> [Loading C:\Program Files\SharpDevelop\3.0\bin\test12.fs]
umeda ?????62 ?_??A???т?C ????B
namespace FSI_0060
  val tsuuchi : gakusei_t -> string
  val ans : string

文字化けした上に、インデントのつけ方まで警告されちゃったわね。。。」

「うーん、、今度は何だ??」

何だか嫌な予感がするなぁ・・・

let tsuuchi gakusei =
    match gakusei with
    {namae = n; tensuu = t; seiseki = s} ->
    n ^ " さんは" ^ string(t) ^ " 点で、成績は" ^ s ^ " です。"
   
let ans = tsuuchi {namae="umeda"; tensuu=62; seiseki="C"}

printfn "%s" ans
#load "test12.fs";;
> [Loading C:\Program Files\SharpDevelop\3.0\bin\test12.fs]
umeda ?????62 ?_??A???т?C ????B

namespace FSI_0069
  val tsuuchi : gakusei_t -> string
  val ans : string

「インデントの警告は出なくなったけど、相変わらず文字化けしてるわね・・・」

「うーん、、、文字列の出力で、何か特別にケアしなきゃいけないことってのがあるのかなぁ、、、、」

「そうね。何かがありそうなのは確かだけど、今のところは打つ手なしって感じじゃない? 処理そのものは上手くいってるっぽいし、ここはひとまず保留にして先に進まない?」

「確かにミラっちの言うとおりカモね。どうやら日本語表示特有の問題っぽいし」

let tsuuchi gakusei =
    match gakusei with
    {namae = n; tensuu = t; seiseki = s} ->
    n ^ " san's score is ..." ^ string(t) ^ " ,so grade is " ^ s
   
let ans = tsuuchi {namae="umeda"; tensuu=62; seiseki="C"}

printfn "%s" ans
#load "test12b.fs";;
> [Loading C:\Program Files\SharpDevelop\3.0\bin\test12b.fs]
umeda san's score is ...62 ,so grade is C

namespace FSI_0072
  val tsuuchi : gakusei_t -> string
  val ans : string

「あー、ホントだ。日本語文字を使わないと、表示はちゃんとできてるわね」

「ここら辺になると、"Foundations of F#"では扱ってなさそうだよね。英語圏では無縁の問題っぽいし」

「そうね。。ちょっと厄介そうな感じしてきたカモ・・・」

「うーん。。とりあえず先に進もうか?」

「りょーかい」

「じゃあ、次は評価を自動的に行う形に改造するプログラムを、、、っと」


let hyouka gakusei =
    match gakusei with
    {namae = n; tensuu = t; seiseki = s} ->
    {namae = n;
     tensuu = t;
     seiseki = if t >= 80 then "A"
               else if t >= 70 then "B"
               else if t >= 60 then "C" else "D" }
   
let ans = hyouka {namae="umeda"; tensuu=62; seiseki=""}

printf "%s" ans.seiseki
#load "test13.fs";;
> > [Loading C:\Program Files\SharpDevelop\3.0\bin\test13.fs]
C
namespace FSI_0075
  val hyouka : gakusei_t -> gakusei_t
  val ans : gakusei_t

「まぁ、一応動いてるみたいね」

「だね。ただ、、」

let hyouka gakusei =
    match gakusei with
    {namae = n; tensuu = t; seiseki = s} ->
    {namae = n;
     tensuu = t;
     seiseki = if t >= 80 then "A"
               else if t >= 70 then "B"
               else if t >= 60 then "C" else "D" }
   
let ans = hyouka {namae="umeda"; tensuu=62; seiseki=""}

「ってやるダケで OCaml なら・・・」

- : gakusei_t = {namae="umeda"; tensuu=62; seiseki="C"}

「って感じですぐ表示されるハズなのに、実際には・・・」

> [Loading C:\Program Files\SharpDevelop\3.0\bin\test13.fs]

namespace FSI_0073
  val hyouka : gakusei_t -> gakusei_t
  val ans : gakusei_t

「って出るダケで終わっちゃってるんだよね。。。」

「たしかに。。追加でこんな風にしても・・・」

ans;;
  ans;;
  ^^^

stdin(85,1): error FS0039: The value or constructor 'ans' is not defined.

「って感じでエラーになっちゃうしね。。。」

「うーん。なんか、似てると思うと似てなくて、諦めると結構 OCaml 風で行けちゃったりして、、、なんだか・・・」

と、ここで僕は次の言葉を続けるのを止めた。だって、、、

「・・・なんだか?」

と、ミラっち。

いや、ここで『ミラっちみたいに気難しいヤツだよね』とか言ったら絶対怒るよなぁ・・・

「うん。なんだかその、、、扱いづらいよなぁ、、、って」

「。。。そうね。 なんか別のことを言いたそうな気もしたけど・・・」

ギクリ。す、鋭い。。。

「いや、、特にはないよ。うん。」

「ふぅーん・・・」

疑わしそうに僕を見るミラっち。イカン! 話題を変えねば!!

「えっと、、とりあえず、じゃあ次は教科書の通り、今の2つの関数の合わせ技を確認してみよう!」

let hyouka gakusei =
    match gakusei with
    {namae = n; tensuu = t; seiseki = s} ->
    {namae = n;
     tensuu = t;
     seiseki = if t >= 80 then "A"
               else if t >= 70 then "B"
               else if t >= 60 then "C" else "D" }
   
let result = hyouka {namae="umeda"; tensuu=62; seiseki=""}

let tsuuchi gakusei =
    match gakusei with
    {namae = n; tensuu = t; seiseki = s} ->
    n ^ " san's score is ..." ^ string(t) ^ " ,so grade is " ^ s
   
let ans = tsuuchi result

printfn "%s" ans

> [Loading C:\Program Files\SharpDevelop\3.0\bin\test14.fs]
umeda san's score is ...62 ,so grade is C

namespace FSI_0078
  val hyouka : gakusei_t -> gakusei_t
  val result : gakusei_t
  val tsuuchi : gakusei_t -> string
  val ans : string

「よし、上手く行ったみたいだ」

「・・・そうね」

何か言いたげなミラっちだけど、ここは敢えてスルーしておこう。うん。

「それじゃ次は、、、型定義についてはもうやったから、、と」

「そうね。不明点が解決できてないのが悔しいけど。。」

「うん、、」

「じゃあ、デザインレシピのところを読んでみようか?」

少し気落ちした僕を気遣ってくれたのか、ミラっちのテンションが少し上がった気がする。

こういうところ、イイ奴なんだよなぁ・・・

「そうだね。F#じゃ適用できなさそうな部分がないか?って感じで見てみようか」

「うん。りょーかい」


・・・・・・・・・

「どうやら、デザインレシピについてはそのまま使えそうだね。」

「そうね。F#ならではで、余分に付け加えないといけないものはあるけど、ロジックを組む上ではそのまま使えそうね」

「じゃあ、次はメトロネットワークの問題に特化した話に行こう」

「はぁーい」

「まずは問題8.5.にある"ekimei_t"の定義からだ」

type ekimei_t = {
   kanji : string; // 漢字の駅名
   kana : string; // ひらがなの駅名
   romaji : string; // ローマ字の駅名
   shozoku : string; // 駅が所属している路線名
}
> [Loading C:\Program Files\SharpDevelop\3.0\bin\test15.fs]

namespace FSI_0079
  type ekimei_t =
    {kanji: string;
     kana: string;
     romaji: string;
     shozoku: string;}

「よし。これは特に問題なさそうだ」

「みたいね」

「じゃあ、次は問題8.6.に行こう」

type ekimei_t = {
   kanji : string; // 漢字の駅名
   kana : string; // ひらがなの駅名
   romaji : string; // ローマ字の駅名
   shozoku : string; // 駅が所属している路線名
}

let hyoji ekimei = 
    match ekimei with
    {kanji = k1; kana = k2; romaji = r; shozoku = s} ->
    s ^ ", " ^ k1 ^ "(" ^ k2 ^ ")"
    
let ans = hyoji {kanji = "茗荷谷"; kana = "みょうがだに"; romaji = "myougadani"; shozoku = "丸の内線"}

printf "%s" ans
#load "test16.fs";;
> [Loading C:\Program Files\SharpDevelop\3.0\bin\test16.fs]
?????, ??J(?????????)
namespace FSI_0082
  type ekimei_t =
    {kanji: string;
     kana: string;
     romaji: string;
     shozoku: string;}
  val hyoji : ekimei_t -> string

「、、、また日本語部分が化けてるみたいね…」

「うううぅぅぅ。。なんだかなぁ…」

「ひとまず、次が最後の問題だしこれも終わらせてから考える?」

「そうだね。うん。そうしよう」

type ekikan_t = {
   kiten : string; // 起点の駅名
   shuten : string; // 終点の駅名
   keiyu : string; // 経由する路線名
   kyori : float; // 2駅間の距離(km)
   jikan : int; // 所要時間()
}
#load "test17.fs";;
> [Loading C:\Program Files\SharpDevelop\3.0\bin\test17.fs]

namespace FSI_0083
  type ekikan_t =
    {kiten: string;
     shuten: string;
     keiyu: string;
     kyori: float;
     jikan: int;}

「・・・っと、これは特に問題なさそうだね」

「そうね。。 それじゃ、今日の不明点をもうちょっと調べてみよっか? てか、アンタ調べなさいよ」

そう言いながら空になったグラスに爽健美茶を注ぐミラっち。

おいおい、自分の店じゃないだろー。まぁ、似たようなものかもだけど 笑

「うーん、、、やるだけやってみるよ。。」


さてさて、今日は長くなりそうだ…。僕もコーヒーをお替りしておこうかな。。


【本日使った本】

Foundations of F# (Expert's Voice in .NET)

Foundations of F# (Expert's Voice in .NET)

プログラミングの基礎 (Computer Science Library)

プログラミングの基礎 (Computer Science Library)


次回につづく。

camlspottercamlspotter 2009/07/30 08:15 浅井先生70点?かわいそす。

hamatsu1974hamatsu1974 2009/07/30 14:24 あ、、いえ。。教科書のサンプルどおりなのですー。他意はないのですー(^_^;
というか、梅田さんがCランクになっている方がつっこまれると思ってました 笑
これももちろん五十音順で思いつく名前を並べただけで、全く他意はありませんが。

いげ太いげ太 2009/07/30 22:45 > #load "test11.fs";;
namespace なしの fs ファイルを #load した場合、ファイル名の 1 文字目を大文字にした module が作られます。つまり、open Test11 とすれば OK です。

> 文字化け
文字コードは UTF-8 でお願いします。

hamatsu1974hamatsu1974 2009/07/31 07:12 なるほど。#load が何をする処理なのか、今ようやく理解しました。少しずつF#がそんな変な仕様で出来た言語ってワケではなさそうだという事が見えてきたような気がします。

文字コードの件は確かに何故かShift-JISで保存されてました。(SharpDevelopのエディタの設定では確かに「UTF-8」になってるのですが、、、多分、何かのファイルを使いまわししたとか、変な事を私がしたのでしょうね(^^;)ご指摘ありがとうございます!

2009-07-21

本ブログの運用方針を変更しますた

| 20:13 | 本ブログの運用方針を変更しますたを含むブックマーク


昨日で結婚1周年を迎え、区切りとして何をしようかな・・・と昨晩考えていました。で、そういやアクセス数だのぶくま数だのRSS購読者数だのを気にしだすと、変な邪念が出てきてロクな事が無いよなぁ、、、とか最近考えていたのもあり、その手の情報が自分の目には入らないよう、以下のような感じで本ブログの運用方針を変えることにしました。


1.各エントリ毎についているブックマーク数の画像表示を止めた

2.TopHatenerのブログパーツを外した

3.ブログスカウターブログパーツを外した

4.フィードメーターのブログパーツを外した

5.人気エントリ、注目エントリの表示を外した


これからは、単に思ったコトや学んだことをつらつらと書き綴る感じで、淡々と、ひっそりと続けていこうと思います。(ブコメでの反応を全く気にしなくなるワケなので、逆に物言いは過激になるかも知れませんけど・・・。)


以上。

2009-07-20

航空便で本が届いた

| 20:49 | 航空便で本が届いたを含むブックマーク


当面は実家に帰る予定もないという事で、Amazonで購入しても引き取る手段がないので久し振りに通販で日本から本を購入してたのだが、今日会社に荷物が届いた。月に1回の発送になっているので注文から1ヶ月程経ってしまってはいるものの、やはり便利でイイ! 今回届いたのは次の4冊。


まずはコレ。

最短経路の本

最短経路の本

タイトルからしてなんか「学習の高速道路」っぽい風情が漂うこの本、巷では「数学ガールグラフ理論版」とか言われてるらしい。ちなみに舞台となっている主人公の住んでる町がミュンヘンというのが、何かちょっとした縁を感じてしまったりする今日この頃。地名とかに湧く親近感がぱねぇっス。

ちょうど「少年オッカムル」でも「プログラミングの基礎」を教科書として使ってて、扱ってる題材も「ダイクストラ法を使ったメトロネットワークの最短路問題」だったりするので、補助教材的にアリなんじゃないか?と思って購入。しっかり読みたい。

というワケで、「少年オッカムル」については飽きて放り出すつもりは全然ない。むしろ、

安西先生、、OCamlが、、、OCamlが、、、したいです」

とかそんな感じ。


それから、たまにはプログラミングから少し離れた本を読んで気分転換するのも重要だよね、と思って買った2冊。

リーマン予想は解決するのか?_絶対数学の戦略

リーマン予想は解決するのか?_絶対数学の戦略

尊敬する数学エッセイストの小島寛之さん(「ゼロから学ぶ線形代数」とか)と数学者 黒川信重さん(岩波書店の「数論」とか)の本という事で著者買い。数学からヒントを得るものって物理に限らず色々とあると思うので、この手の「数学の最前線」にまつわる話から学ぶことは多いんじゃないだろうか、、とかそういう期待は勿論あるのだけど、「数学好きが、好きな数学について熱く語る」って空気が好きなので、細かい理屈は抜きにして読んでみたかった本である。


「宇宙」と「量子コンピュータ」というキーワードには、個人的に「漢の浪漫」を感じずにはいられない。まして「宇宙をプログラムしているのは宇宙自身である」って詩的なタイトル!!これは完全にヤラレタ。これはもうただのロマンではない。大スペクタクル浪漫(よく意味分かってない)である!!ので、結構前から本屋めぐりをして探していたのだけど見つけられていなかった。今回待望の入荷。夜に1人でウヒウヒ言いながら読みたい。


それから、日本語で読めるプログラミング言語関係の本という事で購入したのがコチラ。

プログラミング言語を作る

プログラミング言語を作る

オリジナルのプログラミング言語を作りたいとかそういう事は最近はあまり考えないのだけど、自分が使う道具のコトはやはり良く知っておくべきだと思うので。ただ、この手の本は「どこまで深く理解すべきか?」という意味で付き合い方が難しい。学ぶ目的を見失わないようにしながら読み進めたい。


しかし、、うーん。。焼肉と同じで「読み終わってから次の本を買う」ってルールを自分の中で作った方が良いような気がしないでもない今日この頃。絶版とかが怖くて、ついつい手に入るうちに買ってしまおうとするのだけど、本棚に読んでいない本がたまっていくというのは結構な心理的プレッシャーが。。こういうのって絶対良くない面があると思うんだよなぁ。。。 全ての本がPDF化される(または全ての本についてPOD対応してもらえる)ようになったら、少なくとも自分の本の買い方ってかなり変わるような気がする。うん。

※ とか思ってたらタイムリーな記事が出てますな、、、最近は世の中の流れが速いなぁ・・・