« October 2007 | Main | December 2007 »

2007.11.30

今週の読書

・狼と香辛料 1巻
読んだ。まずます。

・とある魔術の禁書目録 14巻
面白かった。またフラグ立ちまくり。

・日本の技、日本の匠―IPAドキュメンタリ ソフトウェア開発最前線 (単行本)
なんつーか、誰が聞いても知っているような大企業がIPAからお金もらうってどうよ、って思った。
アックスまでがギリギリだろと思う。

・不思議で素朴な囲われた世界
これはよい。マジでよい。途中で投げ出したくなったけど、最後で一気にああああとなった。こんなやり方もあるのかと。(犯人とか、動機とかじゃない方ね)
女の子の魅力をもっと書いて欲しかった。ちょっともったいない気がする。ミステリーなので、この辺で勘弁。

・Python クックブック
日本語版の方。C++のcookbookような内容を想像していたがちょっと違う。各章のイントロダクションや、必要以上に詳しい各レシピの考察は、英語ではきつかったと思う。日本語で良かった。翻訳していただいた方に感謝。著者陣がPerl嫌いで、Lispスキーだって事は分かった。

6.オブジェクト指向プログラミングのイントロダクションから

> Python 1.5.2でも他のどのポピュラー言語よりよいオブジェクト指向プログラムが書けた。

までは良い。ここから

>(Lispとその変種を除くのはもちろんだが。Lispでうまく書けない物があるのか疑問だ。まああのカッコだらけの構文が消化できれば)

と続いていて笑う。
もうね、本のタイトルを5回声を出して読めと言いたい。そこは、今でもどの言語より良いオブジェクト指向プログラムが書けるって断言して良いところだ。そんなにLispが好きなのか。

・Implementation Patterns
先週の日曜日にモバ校仲間から紹介されて、この本でモバ校勉強会をしようかという話になりました。
と、思ったらすでにブームが来ている予感。まあ、すぐ読んでどうこうって本でもなさそうなので、まったり行きましょう。

http://blog.so-net.ne.jp/yshibata/2007-11-16
http://www.kt.rim.or.jp/~kbk/zakkicho/07/zakkicho0711c.html#D20071124
http://d.hatena.ne.jp/sumim/20071125/p1
http://twitter.1x1.jp/search/?source=&keyword=Implementation+Patterns&lang=

とりあえず、僕の仕事が一段落待ち。

| | Comments (0) | TrackBack (0)

2007.11.29

ヤター! 長門Pythonできたよー!

Python界では、みんpy、はじpy、pypyといろんなpyがあるなか、次は貧pyだと信じて疑わない私です。
東大ではとっくにmini pyを授業に取り入れている事に気がつき、いろんな意味で勝負にならないと思いました。(主にpy的な意味で)

もうすぐクリスマスなので、PythonのIDLEも長門プロンプトに変えてみました。


C:\Python25\Lib\idlelib以下のファイルを書き換えました。
変更箇所は3箇所です。
・EditorWindow.py 91行目:プロンプトを長門プロンプトに
   sys.ps1 = 'YUKI.N> '
・PyShell.py 2行目:エンコードの指定を追加
# -*- coding: utf-8 -*-
・PyShell.py 990行目:起動メッセージの変更
   self.write("Python %s on %s\n%s\n\nIDLE %s %s(Yuki Nagato)\n" %
         (sys.version, sys.platform, self.COPYRIGHT,
         idlever.IDLE_VERSION, nosub))
   self.console.write(u'YUKI.N> みえてる?\nYUKI.N> うまく言語化できない。情報の伝達に齟齬が発生するかもしれない。でも、聞いて。')

最後に、PyShell.pyをutf-8で保存すればOK。
クリスマスは長門とPythonプログラミングを楽しもう!

| | Comments (0) | TrackBack (0)

2007.11.28

New Nios II Embedded Evaluation Kit, Cyclone III Edition

新ボードktkr
http://www.altera.com/products/devkits/altera/kit-cyc3-embedded.html?WT.mc_id=ec_ae_al_bd_tx_a_482

俺、この仕事が一段落ついたらNios II ボード買うんだ。

| | Comments (0) | TrackBack (0)

2007.11.24

[HOP]パーサを作ろう その2

なんとかターゲット決めうちで、ここまでパース出来るようになった。

>>>
('expression',)
('(', 'expression', ')')
('(', 'INT', '*', 'expression', ')')
('(', 'INT', '*', '(', 'expression', ')', ')')
('(', 'INT', '*', '(', 'INT', '+', 'expression', ')', ')')
('(', 'INT', '*', '(', 'INT', '+', 'INT', ')', ')')
>>>

ソースはここ

深さ優先で検索する方法が分かった。よく考えると、このパーサーのアルゴリズムで答えが無かったら無限ループするのって、幅優先も深さ優先も同じじゃね?と思ったら、やっぱりそうらしい。ここまで自分の手で動かして、ようやく@alohakun発言の意味が分かる。俺、コンピュータサイエンス弱ぇー。
http://twitter.com/alohakun/statuses/431771522
バックの絵きんもー!

yaccとか、lexとか、bisonとかいうのも、Wizard形式のプログラミングと一緒で、もともとそういうのが無くても出来る人が楽するためにあるんだよな。一歩ずつ行こう。

そんなことを思っていたら、本にコーヒーをこぼしてしまった。もう、誰にも貸せない本になった・・・

8.2 Parsing in general終了。
ようやく、再帰下降のパーサーに入る。

| | Comments (6) | TrackBack (0)

2007.11.22

今日の日記

・理大祭
今やっているらしい、って事を東大生から聞くのってどうよ。

・やったー項羽でケータイ小説できたよー(^o^)ノ
これは上手い
http://anond.hatelabo.jp/20071115192607

・twitter勉強会
非決定性(Nondeterministic)は、なぜそう呼ばれるか?
http://twitter.com/alohakun/statuses/431742672

朝の部は4:00~8:00なので、朝型だけでなく徹夜形の人もOK。

・35歳
バカが征く で見つけたような気もするんだが、若い人の方が実力がどんどん伸びて技術者として追い抜かれるってのは本来あるべき姿なんだよな。ベテランにはベテランの場所ってのがあって、必死でその場所を探さないといけない。探した結果が、人を動かすことならそれで良いじゃん。人を動かすことが得意だと自力で気がついたのなら凄いことだ。そうやってベテランが自らフィールドを広げていくことが、結果的に若い人にチャンスが回ってくる。

できない管理職とか言って叩く人ってのは、自分の事しか見れて無くない?自分のプログラミングスキルだけ上がればOK?プログラミング自体じゃなくて、プログラミングを通して何かをしたいって強く思っていると、その何かをするために自分が出来ることを必死で考える。チームが最大のパフォーマンスを出すためには、誰かが顧客と交渉しないといけないし、だれかが社内的な調整をしないといけないし、プログラミングだけじゃチームが回らないって考えれば分かる。プログラミングだけやっていたら楽しいけど、誰かが管理職やってくれているから僕たちがプログラミングできるんだよ。誰かがお金のことをしっかりやっているから、当たり前のように給料が振り込まれるんだよ。

10倍の生産性をほこるプログラマよりも、『「プログラマを育てることができるプログラマ」を育てられる人』の方が偉い。上手く再帰すれば、優秀な人がどんどん増えるわけだし。経営者は目先のことばかり・・・とか言ってないで、自分たちも3年後、5年後のあるべき姿を考えようよ。そのためにできることってあるはずなんだ。まあ、中には1000倍とかの生産性を持つプログラマもいるわけで、そういう人は別格で扱った方がよい。

「オレも昔はプログラマーだった」だけでかちんと来る人は、スーパーエンジニアへの道―技術リーダーシップの人間学を読めばいいと思うよ。

・Python
どうも分からないことがあると思っていたら、タプルとリストを間違えていた。a = (1, 2, 3)がリストだと思っていた。あと、要素が一つのタプル("aaa")とかが、("aaa",)と書かないといけない理由がわからず3日程悩む。リストだと思っているから、いくら本を読んでも見つからない。電車の中でDive into Pythonを順に読んでいて、ようやく理由を見つける。普通の()と見分けがつかないからか。で、あらためてタプルの所を見ると、どの本にもしっかりと書いてあって落ち込む。

| | Comments (0) | TrackBack (0)

2007.11.20

今日の日記

ときどきの雑記帖 リターンズさんから
redditってのはLisperが集まるマ板のような気がしてきた。

programming: Why Lisp is Differentを読んでみる。

> I understand that 1 is needed to allow for 2 and 2 allows for 3, but really I think that if possible 1 should be omitted. Programmers shouldn't have to write parse trees themselves. That's what we have parsers for.
ここは面白かったのだが、途中で()論争に入ったら読むのが嫌になった。

EM-ONEでPython動くのか!
リナザウやめてEM-ONEにするか。しかしXXXX oneという名前にはいろいろと思い出が。無ければ(ry

・VeritakのたっくさんとBoostのkinabaさん
がエディタでつながっていることを知った。天才同士は自然に結びつくのね。
メモhttp://sourceforge.net/projects/ivtest/:verilog test suite

・R.O.D 11巻 最後の上巻/下巻の件でで泣いた。そんなシーンいらないよ~。

・よくわかる現代魔法 2, 3, 4, 5
面白かった。ストーリは所々で、gdgdになるけと、それ以上にキャラと小ネタを楽しめた。もう少し小ネタは多くても良かった。
パンツはいていないと、おっとテレポータが良かった。

・タバサの冒険 2 本編のストーリを進めて欲しい。

・とらドラ スピンオフ これはよい。

・刀語 11巻 いよいよ大詰め。最終巻が待てない。ペンギンかわいそすぎる。

ハルヒの分裂と、とらドラ5巻を残して、ストックしてあるラノベを読んでしまった。とらドラつながりで田村くんにいくか、狼と香辛料にいくか。狼と香辛料は絵が好みじゃないんだよな。

・Python
好き度が大幅アップ中。Dive into Pythonをモバ機に入れて、電車の中で読む。if __name__ == "__main__": イディオムを覚える。
ちょっとPythonをかじってから、某雑記帖とか某神様なんてをみていると、再度読み込んでしまう。これは危険。

・スパコン
スパコンは作って欲しい。その予算の中で1億円でもよいから、簡単に成果物にアクセスできる仕組みに回して欲しい。
議事録とか、回路の前提となる論文とか、解きたい問題についてとか。できたら、RTLやテストベンチ、チップのシミュレーション環境一式とかも。Wikiベースでパブリックコメント書き込めたらいいなぁ。目標はNASAみたいに、世代を問わずにわくわくできるようにしてほしい。

・ゆうゆ
http://kyanchi.blog73.fc2.com/blog-entry-2883.html

| | Comments (0) | TrackBack (0)

2007.11.19

[HOP]パーサを作ろう その1

何年後かの自分向けメモ

Higher-Order Perlにでてくるparserを自分の物にしたい。
まずはgrammerを定義する。

# grammar definition
expression_clause1 = ('INT', '+', 'expression')
expression_clause2 = ('INT', '*', 'expression')
expression_clause3 = ('(', 'expression', ')')
expression_clause4 = ('INT')

grammar = {'expression' : (expression_clause1, expression_clause2, expression_clause3, expression_clause4)}

リファレンスとか、デリファレンスとか気にしないで良いので、perlよりはわかりやすくなっていると思う。電卓の文法だと、exressionの代わりに、exprとかtermが来る。

最初の関数is_nonterminalは簡単で、引数がterminalかnonterminalかを判断する。

def is_nonterminal (symbol):
  return grammar.has_key(symbol)

is_interestingの方は難しくて、別の章で定義してあるツリーの検索ルーチンから呼ばれる。directory walkingのようにツリー構造の構文を順に検索しながら、目的のパターンと一致したかを返す。このとき、ツリー構造の検索には深さ優先ではなく、幅優先を使う。

一般的にツリー構造を検索していく場合、再帰しながら深さ優先で下っていく方が簡単。ただ、深さ優先には無限ループに入ってしまう欠点がある(ディレクトリだと、ループ構造のシンボリックリンクがそう)。幅優先だと、検索の効率(メモリの使用量なども)は悪いが、検索対象が存在するなら必ず検索に成功する。30代半ばにして始めて知る事実。

これがparseしたいtoken列がこんな感じとする。(これはlexerから渡されるtokenのリスト)

target = ('(', 'INT', '*', '(', 'INT', '+', 'INT', ')', ')' )

これをtargetとして、ツリー検索ルーチンがこんなリストを渡してくる。

1回目:'expression' → これはparerに与えられた、最初はどこから始めるかという値。expressionはnonterminalなので(True)返しとく
2回目:'INT + expression' → 1回目で(True)が返ったのでツリーを深く検索していく。先頭が(じゃないから(False)を返す。
3回目:'INT * expression' → 最初のgrammerで定義されたexpressionが順番に渡されている。先頭が(じゃないから(False)を返す。
4回目:'( expression )' → 最初が(で一致、次のexpressionが nonterminalなので、(True)を返す。
5回目:'( INT + expression )' → 4回目に(True)を返したので、ツリーを一歩深くする。expressionが、'INT + expression'になっているのは、2回目と同じ理由。
6回目:'( INT * expression )' → 3回目と同じく( expression )のexpressionが、INT * expressionに展開される。今度は、*まで一致していて、expressionがnonterminalなので(True)を返し、さらに深く検索を続ける
7回目( INT * INT + expression ):以下同様

最後に( INT * ( INT + INT ) ) で、parse終了。

def is_interesting (sentential_form):
  for i in range(len(sentential_form)):
    if is_nonterminal(sentential_form[i]):
      return (True)
    if i >= len(target) :
      return (False)
    if sentential_form[i] != target[i]:
      return (False)

  return sentential_form

rangeが痒いところに手が届いてくれてうれしい。
C言語の文字列は、+1とか、-1とか微妙な所で致命的に・・→ 後で書く。

次は、ツリーを検索するアルゴリズムを追おう。
ソースはここ

| | Comments (0) | TrackBack (0)

2007.11.18

昔の自分

ちょっとひらさんっぽい話。

そんなこんなで私物を整理していたら、昔の勉強ノートがでてきたわけです。中を見てみるとなつかしい事が書いてあってうれしい。Blogも良いけど紙のノートにまとめるのも思い出がよみがえってきて良い。新人~2年目くらいに書いたんだろうけど、ハードのことを必死で勉強しているのが分かる。トラ技を3年くらい続けて読んでいたり、情報処理検定の勉強と絡めていたりしている。デバッグルームで、RS-232Cのピン配置とかアスキーコードを知りたいとき、このノートにお世話になった。今じゃGoogleだけどね。

そんななか、ノートが昔勉強したMINIXの所に来て驚く。ノートにソースコード貼り付けて、それにコメント入れて勉強している!そうだ、昔はノートに切り貼りしながら勉強するスタイルだった。これは勉強に時間がかかるはずだ。必死でMINIXを勉強した事実は覚えているんだが、いまいち自分の血肉になっていない気がする。MINIXのシステムコールの一覧やら、inodeのフォーマットなんてまとめてもしょうがないだろと今の自分なら思うけど、当時はこれが大事だと思っていたんだよな。

MINIXの後は、仕事で使ったμITRONのマニュアルから丁寧にシステムコールが順にまとめられている。マニュアルそのまま持ち運んだ方が絶対によいと思うんだが、まとめたかったんだろうな。続いてコードコンプリートとパタヘネか。パタヘネは図を書いた方が良いよ。これだけは正解。状態遷移図とかノートに写してうんうん言っていた。

ふと思い立って、コンピュータアーキテクチャをパラパラと読んでみる。あれ、買ったときこんな難しい本絶対無理と思ったけど、意外に簡単じゃね?と思った。見ている視点が、パタヘネとは違うけど普通に面白いと思う。

ちょっと脱線。
コンピュータアーキテクチャ(日本語版)を流し読みした感想は、「良い本だけど、ちょっと内容が古いかな」って感じ。原書が書かれたのが1990年で、17年前なのにちょっと古いという表現が思いついたのは凄いと思う。勉強するならパタヘネの方がよいと思いますよ。コンピュータアーキテクチャは性能をどう評価するかを重点的に書いてあるのに対し、パタヘネは一つ一つの説明が丁寧でどう動くかを中心に書いてあります。コンピュータアーキテクチャの方が図や式がやや抽象的で、パタヘネは実際のハードウェア近くまで書いてある。正直、パタヘネじゃなくてコンピュータアーキテクチャ(ヘネパタ)の方を薦める人って、本当に読んだのかと問いつめたい。両方読めとかどんなけCPU設計するんだよって思う。コンピュータアーキテクチャ(ヘネパタ)は、SHマイコン萌えな人が読む本だよ。

整理を続けていると、こんどはコンパイラ構成法がでてきた。これも最初の方がさっぱり分からなかったけど、今読むとHOPと同じような事がかいてあって少しは分かる。

勉強の記録をつけるのは大事で、勉強し続けるとそれなりに成長はしているんだなと思った。

| | Comments (0) | TrackBack (0)

忙しいので小ネタ

・バレンタイン
長門はどうした!
http://blog.livedoor.jp/dqnplus/archives/1056350.html

・Zipでくれた
http://www.altera.co.jp/literature/lit-nio2.jsp


レジデント初期研修用資料
考えさせられる

・掃除
会社の私物を実家へ送る。
全然意識に無いところから段ボールが出てきてあせる。


段ボールの中からオブジェクト指向入門発見。これを読めばC++ができるようになると思っていた時代もありました。

未来への自分へのメモ。
これらの本は実家にあるから、欲しくても買うな。絶対買うな。
Project retrospcetive、Gargabe Collection、Occam本、SICP日本語、プログラミングの心理学、コードコンプリート、プログラミングテクニックアドバンス、プログラミングテクニック、Linuxのブートプロセスをみる、FreeBSDのブートプロセスをみる

・少数派?
よみかたあんけーとをする。

その結果

> あなたが孤立気味な単語は SATA(14%), Restore(19%), tcsh(11%), Ubuntu(4%), MIME(4%), exp(14%), oops(2%), Char(2%), asm(13%), 値(2%), chroot(5%), .org(14%), .htaccess(2%), yum(13%), sudo(1%), DivX(2%), atan2(16%), orz(17%), mkdir(15%), Wi-Fi(14%), var(17%), UInt32(8%), glibc(6%), Boehm(5%), strrchr(18%), *(4%), OCaml(5%), pLaTeX(8%), #!(8%), X68000(12%), argv(7%), argc(7%), 404 Not Found(1%), GNOME(17%), False(15%), volatile(13%), tar.gz(5%), TeX(9%), Tcl(10%) です。

SATAはしりあるえーてぃーえーだろ。常考。えすあたなんで認めない。

| | Comments (0) | TrackBack (0)

2007.11.15

今日の日記

・熟練した××は、○○しながら、△△を瞬時に選んで、最適な□□を書けるのです。
ときどきの雑記帖 リターンズさんから

> このように「熟練したCプログラマは、生成される機械語コードを予測しながら、複数の記述方法の
> 中から最短最速になるだろう記述を瞬時に選んで、最適なソースコードを書ける」のです。
コピペに出来そうだけど、上手いのができない。

このように「熟練した赤ちゃんは、うんこと夜泣きをしながら、親が疲れ切るタイミングを瞬時に選んで、最適な笑顔を投げかける」のです。

Blogなつたんは、子育てエンジニアを応援中です。

・営業の人
愛すべき営業さん
これも雑記帖さん経由で知った。

褒め合うというか、エンジニアの方は取り替え可能なんだよなと思うときの方が多い。
僕の場合は挨拶から始まって、何から何まで営業の人に頼りっぱなしです。愚痴っぽく話すとしたら、受注できてからもお客、エンジニア両方のフォローはして欲しいかな。それ以外は、いつもありがとうございますですよ。本当に。

・本屋
ガウディ本を見たくて本屋に寄った。思っていたより難しくなさそう。並列処理関係の面白そうな本があったが、どうせよまないので我慢。がちでボーナスでたら買う。

HDLによるデジタル設計入門―SystemC/Verilog-HDLを用いたハードウェア/LSI設計を発見。CMOSの仕組みから、UMLまで書いてあって、対象読者は誰なんだろう。筆者みたいに、用語を織り交ぜながらいろいろとビジネスを展開してく人向け?
一年前なら迷わずが買ったのだろうが、がまん。

しかし、Verilogの良い本ないな。

Verilog‐HDLによるテストベンチ―アサーション検証の効率化のためにも面白そうだったんだけど我慢。ボーナス出るようになったら買う。

なにげに置いてあった掃除の本を見て知る衝撃の事実
「掃除は他の人が気持ちよく過ごすためにする」
な、なんだって!。自分が生活しやすいかどうかが、掃除する/しないの基準じゃないのか。こういうのが、ビジネスマナーとか、テーブルマナーとか、コミュ能力とかにつながるんだろうな。
この本は買った。

・HOP
ようやくPerlで最初の方が動くようになった。print文いっぱい入れて動作を追うのはこれから。

| | Comments (2) | TrackBack (1)

2007.11.13

今日の日記

・Twitter面白い
というわけでブログ離れが進んでしまった。ラノベ読んでも、Twitterにちょっと書けばおしまい。
どうでもよいことを、Twitterに書くことでS/N比がが変化するかとも思ったけど、書いている本人は全部Sのつもりでかいているから難しい。


・VerilogでFizzBuzz
ときどきの雑記帖 リターンズさんから、

VerilogでFizzBuzzは、2chかどこかで既に見ていて、まあいいやってなってました。解説付きは素晴らしいですね。
問題の取りようが難しくて、他の言語だと余剰の演算子があるから、1から100が、100から300になっても、300から200へ減っていってもそれなりに動くのですが、Verilogだと多くの部分が作り直し。7の倍数が入ってきたらどうしたらよいを考え出すと眠れなくなってきます。

> 3でも5でも割り切れるときの出力である "FizzBuzz"が3のときの"Fizz" と5のときの"Buzz"を連結したものというのではなかったとしたらこういうことは はじめからできないわけですし。
ここは、きむら(K)さんに同意。たまたま同じ文字列なのか、連結する仕様なのかで書き方変わってきますよね。

時間があればテーブル検索に置き換えてみよう。自力であまりを求めるのも楽しいはず。

| | Comments (0) | TrackBack (0)

言語処理系の高速道路発見!

Higher-Order Perlの筆者であるMark Dominusからコメントもらった。やったー!

Chapter8 Parserの章で速度が落ちている。
この章はSICPでいう4章に当たる部分で、ボリュームも大きいし、今までに使った技を普通に使っている。本文だけ読んで飛ばした俺涙目。パーサーの勉強を初めてしたのは社会人なる前で、いまだによくわからない。10年来の仇敵でもあるわけで、ちゃんと勉強しようと英文を一行ずつちゃんと読んでいる。1日、1~2ページしかすすまず、コードがでてきたらもっと速度が落ちると思うが頑張ろう。

それはさておき、Twitter界隈では空前のパーサーブームが起きているようです。
渦中の日記を書く[・ _ゝ・]はやみずさんに、ダメ元で話題を振ったところ、東大の演習テキストの情報をいただきました。

http://www.logos.ic.i.u-tokyo.ac.jp/lectures/enshu2006/index.php?%B9%D6%B5%C1%BB%F1%CE%C1

これは素晴らしい。

何年か前のひげぽんさんとか、この授業受けたかったのではないかと。僕も今から受講したいよ。

もし今の記憶をもったまま10代に戻れるなら、東大に入って勉強したい。そして、40代になったときに、「もし今の記憶を持ったまま30代に戻れるなら・・・」と後悔しないために今頑張ろう。

| | Comments (2) | TrackBack (2)

2007.11.11

今日の日記

・若いっていい
理系の女の子の取扱説明書 - 毛の生えたようなもの
理系というか、論理的に話す女の人はもてると思いますよ。長門とか。

「だがしかし「女」なのである!」以下については、謎は謎のままにしておくのも良いと思う。あとは、男の子は女の子が思っている以上に血に弱い。これまじ。

> 顔はそこまでひどくなければ正直気にしていない。
と書いておいて、顔が~で断られた日には男の子はどうすればよいんだろう・・・

・リファラで気がついた
http://yankeerunner.blog98.fc2.com/
リンクありがとうございます。
僕も頑張らないとな。

ああ、学生もどりたい!

・HOPから
For more complicated sorts of input, many programmers fall back on a lot of weird hackery.
But writing parsers can be straightforward and elegant, even for complex inputs, once you have right set of tool available.

1行1レコードみたいなファイルだとsplitでなんとでもなって、それ以外だとまともに仕様が決まっていない事が多いのでは。仕様っていっても、○○の設定:文字列XXXXの後、設定値が続く。例:○○○○ みたいに、仕様という名の例文しか無いとかありがち。つまり、設定ファイルの仕様を決める人は、パーサーの動きを知っていた方がよいという事か。一理あるな。
むしろ設定ファイルの仕様を決めた所(人 or 部署)が責任持ってパーサーを出せば良いという理想論を言ってみる。

なんとなくlexerが終わってようやくparserに。
電卓のgrammer見るの何回目だよ、と過去の挫折を引きずりながら頑張ってみる。電卓からVerilogのパースまでが遠すぎる。

・Python
HOPの問題をPythonで書いてみた。
自力でiterator作った後、Pythonのiteratorに乗せてみたら、無茶苦茶簡単だった。
C++で自分クラスをvectorに乗せるのが3日くらいかかったから、それに比べると簡単すぎて驚いた。

あと、家で勉強しながら、
> p = re.compile('print\b') って\bは\\bにしないと動かない。ここのエスケープはいらんと思う。常考
って某所に書いたら、すぐにr'print\b'にすればOKと返事もらった。永久凍土なんて無いよ。

| | Comments (0) | TrackBack (0)

2007.11.09

今日の日記

ときどきの雑記帖 リターンズさんが、なかなか追い切れない。

> いずれにしろ組み込みの世界にマルチコアの波が来るのは遠い?
ARM+XXとか非対称なマルチコアは結構普通にあります。それぞれ個別にプログラミングして、個別にICEつないでデバッグしています。一つの統合された環境でというのはまだまだ先だけども、確実に市場はあります。Green Hillsは、新しい自社ツールを買って欲しいので、移行を煽る側ですね。最近の組み込み系展示会は、マルチコア対応XXというが多いです。

ここ2~3年はこないかと。

> The multi-CPU embedded systems I've worked on have throught of each CPU as dedicated to a different
> function. So you had one CPU dedicated to input from the first source, and the second dedicated to
> input from the second - this all starts at the hardware level, so the first CPU has close interconnects
> to it's input, poor interconnect the the second input. A main processor then sits off to the side, but
> with poor interconnects to any input.
よく似たことが書いてあるな。

> Here's the problem. Most embedded software developers don't see themselves as programmers.
> The came into the field through the side, through hardware. As a result, it's a very conservative community.
日本だけじゃなくて安心した。
組み込みプログラマでこれなら、Verilogやっていて、自分をプログラマだと思っている人なんて少数派。
僕は、どっちかというと組み込みプログラマと言われたい。

learn the ropesは、できるようになるとか、やり方を覚えるとかいう慣用句なので、
> Pythonの“one obvious way”という基本的な考え方は、キミがやり方を覚えようとする時に役に立つはずだ。
でどうですか。

・流行にがんばってのってみる
「Closure」「Carrying」がどんだけのCプログラマを無気力にさせてるか少しは考えろ

・HOP
Streamとか内容は丁寧にコード付きで書いてあるんだけど、悪い意味でSICPに似てきた。何のためにこんな面倒な事をしているのかがさっぱりわからん。Stream使ってNetHackの怪物を順番に動かすとかそんな話にしてくれよ。

Streamを抜けてCurry化の話。
Cが最速なんてもう言わないってこれがCurry化なのか!最適化うんぬんは本質じゃないとして、引数で与えられるパラメータで新しい関数が作られる事。自力でなんかつかんだうれしさを久しぶりに感じる。

そして、Parsingへ

http://cpan.uwinnipeg.ca/htdocs/Verilog-Perl/Verilog/Parser.html
HOPを読んでいたら、この辺の使い方が想像できるようになった。

・プログラマとコーダー
昨日まで掃除ってのは「雑巾や、掃除機の先を、特定の範囲内でまんべんなく移動させること」だと思っていたよ。汚れや埃を取り除くことが掃除なのか。どうりで嫁と掃除の話が食い違うわけだ。

| | Comments (3) | TrackBack (0)

2007.11.07

郵便局への銀行振り込みの方法が分からない

なにしたいかっていうと、郵便局なんて行く暇が無いから、コンビニATMから郵便局の口座にお金を移したいんだが、振込先に郵便局ってのが無いんだ。

なんだかよく分からないけど、娘を育てるために市から補助金みたいのが僕の銀行口座に振り込まれているらしい。僕が手続きをしたはずなのだが全く記憶になく、普通にAmazonに消えていったわけよ。それが、次女の手続きで嫁にばれて「あなた、娘のための大事なお金を、自分のお小遣いにしていませんか?」と真顔で問いつめられた。答えはYes。

OK,OK,そんなに怖い顔するなよハニー、今すぐ別の場所に振り込んでちゃんと分けるよ、と言ってはいたが、嫁指定の振込先が郵便局でどうしてよいのかわからない。そういうやりとりがあったのが一ヶ月前の話なので、今更嫁に振り込み方分からないなんて怖くて言えない。

| | Comments (2) | TrackBack (0)

みんな平等に

娘が2人もいるというのは幸せな物で、なにかあると「(長女)かわいいー、(次女)もかわいいよ」と家で連呼しています。片方だけ褒めると、もう片方がすねるので両方言わないといけない。特に長女のぐれっぷりは泣けてくる。義理の母が相手していてくれて、本当に助かる。

まあ、そんなこんなが続いた後、どうせ私は可愛くないんだと嫁がぐれだした。しょうがないので、「(長女)かわいい。(次女)かわいい。(嫁)もカワイイヨ」と、毎回つけるようにした。最後だけ明らかに棒読みなのだが、嫁的にはOKらしい。どうみてもオーバーヘッドなのだが、これくらいは平和な家庭のために受け入れよう。

そんななか、ある夕飯の時事件が起きた。
例によって、「(長女)かわいい。(次女)かわいい。(嫁)もカワイイ」と言っていたら、2歳の長女の真顔の一言で、食卓が凍り付く。

長女「ばあちゃんは?」

僕・嫁「え?」

長女「ばあちゃんも女の子でしょ。かわいい言わないと駄目でしょ。ばあちゃんはかわいくないの?」

ごめん、それは無理。

| | Comments (0) | TrackBack (0)

再帰からループへ

Higher-order Perlから

Chapter4は延々とイテレータについて。
自作イテレータをちょこちょこと改造していく。
イテレータを使った、mapとgrepの実装は面白い。無限ストリームにも使えそう。

Chapter5は、再帰からループの変換について。
再帰で美しく書かれているアルゴリズムを、自作スタックとGOTOでループに変えていく。それってどうよ?と思うんだが、Perlの場合は再帰よりもループの方が効率的らしい。

面白いと思ったのが2つ

・他の書籍に突っ込む
Mastering Algorithms With Perlに出てくる再帰を書き直す話。

最初:http://perl.codefetch.com/example/ht/Examples/Chap5/powerset-0?qy=%25s
最後:http://perl.codefetch.com/example/ht/Examples/Chap5/powerset-4?qy=null

再帰が無くなっただけでなく、プロタイプがすっきしりたり、for(;;)の構文が無くなってローカル変数が減ったりしている。ムックとか雑誌ならありそうだけど、普通の技術書でこういう他の書籍に出典付きで突っ込むって珍しと思った。

・再帰からループへ

sub fib {
 my $n = shift;
 if ($n < 2) { return $n }
 fib($n-2) + fib($n-1);
}

のような綺麗だけど効率の悪い再帰も、この本にかかるとこんな感じ。

sub fib {
 my $n = shift;
 my ($s1, $return);
 my $BRANCH = 0;
 my @STACK;
 while (1) {
  if ($n < 2) {
   $return = $n;
  } else {
   if ($BRANCH == 0) {
    push (@STACK, [ 1, 0, $n ]), $n -= 1 while $n >= 2;
    $return = $n;
   } elsif ($BRANCH == 1) {
    push @STACK, [ 2, $return, $n ];
    $n -= 2;
    $BRANCH = 0;
    next;
   } elsif ($BRANCH == 2) {
    $return += $s1;
   }
  }

  return $return unless @STACK;
  ($BRANCH, $s1, $n) = @{pop @STACK};
 }
}

10ページ近く書けて、ゆっくりと再帰を剥がして最適化していく。わかりにくくなったよ。ママン。
興味がある人は、ここのfib-0からfib-12まで順に見てみよう。
http://hop.perl.plover.com/Examples/Chap5/

250ページを読んでまだまだ絶賛ベタ褒め中。

| | Comments (0) | TrackBack (0)

2007.11.06

今日の日記

・MINIX
AO diaryさんから。

DIY CPU demo'd running Minix
ちょwww、作っている最中に何かおかしいと思わなかったのか?マシン語ってレベルじゃねーぞ。

http://www.homebrewcpu.com/に一応説明ある。
> TTL rather than FPGA.
> My reasons here pretty much boil down to "because that's what I want to do." FPGAs do sound fun, but I really am drawn towards using technology that is similar to that which was current when I first became introduced to computers. Perhaps for Magic-2....

Some of my other projects
おっさん、趣味に力入れすぎだろ・・・

Crayの偉い人とは別人

日々の破片
ときどきの雑記帖 リターンズさん経由で知る。
単体の記事では読んだことがあったけど、n時間がぶり読みする。仕事はどうした。n<1.0だよ、多分。

・オシロスコープ
オシロスコープっていうけど、ハードの設計している人はデジタルオシロとか、デジタルストレージと呼んで、アナログのオシロと区別している。アナログのオシロとデジタルのオシロだと動いている原理が違うし、測定できる物も違う。オシロって、デジタルストレージですよね?と念押しをしてみて、会話が成り立たなかったらその人はオシロを良く知らない可能性が高い。

wikipediaの使用例が、微妙にいい味だしてる。
http://ja.wikipedia.org/wiki/オシロスコープ
TVの説明で、最も古典的な使い方はニュースを見ることである、別の使用方法は娯楽番組を見ることである、もう一つの使用方法は巨人ファンのためのものである、とか書いてあるような違和感。

テスターの方は違和感無いのにね。
http://ja.wikipedia.org/wiki/回路計

ちなみに、日本大百科全書はこう。
【オシロスコープの使用例】
現在もっとも多く用いられ、使用例の典型となるものをあげると、次のようになる。
(1)電圧の測定 内蔵の校正電圧発生装置の正確な電圧によって、管面の単位目盛り当りの電圧値を正確に校正しておき、これと観測電圧の波形とを比較して電圧値を測定する。
(2)時間の測定 掃引速度は、横軸の単位長さ当りの時間で示されているので、観測波形上の2点間の時間は容易に測定できる。
(3)周波数の測定 観測波形の一周期の時間を測定すれば、その逆数として周波数が求められる。また、水平偏向板に、別の標準信号発生器からの正確な既知周波数の正弦波信号を加え、垂直偏向板に被測正弦波信号電圧を加えると、周波数比および位相差によって、リサジューの図とよばれる特定の図形が得られ、これから周波数を求めることができる。
(4)距離の測定 電気パルスを送り出し、その反射波の戻る時間を観測すれば、伝搬速度から距離が測定できる。代表例として送電線路の故障点標定法がある。〈高尾利治〉

Wikipediaも商用百科事典も、共存できるはずだから、どっちも頑張れ。
百科事典の進化としては、90年代後半に流行った「マルチメディア化」というのは正当な進化だと思う。
文字で伝えきれない事を、あの手この手で伝えるのだ。

ベンチャーで一発当てて大金持ちになったら、ブリタニカ百科事典買うからそれまでつぶれないでいて欲しい。

・アクセス
なんか、アクセス跳ね上がってると思ったら弾さんからリンクされてる!
なんでこんな所読んでいるんだと思ったら、Python Cookbookから逆探知されたのか。
Cookbookの書評助かりましたと、今更だけどお礼はきっちりしておこう。

翻訳するときに章をはしょるってのは、cookbook特有の問題だと思うんだが、他の本でもあるのだろうか。C++ Cookbookも章減ってるし。むう。


| | Comments (0) | TrackBack (0)

2007.11.05

今日の日記

IPAフォーラム2007
学生の人頭良いな。

「コミュニケーション力が必要というのは他の業界も一緒であって、IT業界に固有のものとして、例えば、プログラミングの知識を求めていないのか」
「入社時にITのスキルを問わないというのは、Googleのような企業の方針とは反対であるが、それですばらしいサービスを作ることができるのか」

もう優秀な学生は大企業行くのやめようぜ。プログラミング言語どころか、エディタだってインストールするのに申請いるんだぜ。新しいことなんかできるわけないじゃん、と逆FUDをかけてみる。FPGAの業界は、入社時にハードとかFPGAの知識あるとうれしいけど無くても大丈夫だよ。っていうのは、経験が無いからで切ると優秀な人を逃すからだよ。自分でプロセッサとか作れるよ。


・雑談
あろはさんの所に何か書こうとしたけど忘れた。

爆牌世代なんてあるのか。こんな感じで良いのかなと、調べずに書く
麻雀放浪記世代 → ぎゃんぶらぁ自己中/スーパーズガン世代 → 鳴きの竜世代 → ぁ空間世代 → 爆牌世代 → 雀鬼世代 → 二階堂姉妹世代 → はじるす世代

Linux板は巡回しないというか、だんだん2chから離れてきてます。
とか書きながら該当スレ読んでワラタ

//  if (argc != 3) {      // なんかコマンドライン入力をやろうとして
//    cout << "usage: ... "; //  断念しましたね。
//    goto terminate;     // やり方わすれちゃったんだな。
//  }
あるある。gotoはねーよ!

コミュについて書きたかったけど、上手くまとまらず。最近は毎週のように、「(僕)さんは、コミュニケーションがへたくそやねー」とDisられている。頑張らねば。

・花嫁募集
shinhさんから遠回しな花嫁募集のお知らせが

> seq 1 1000 | sed 's/[^0]//g;/0/{:;x;s/$/_@0123456789_0/;:a;s/^_/1/;s/\(.\)_\(.*\)\(@.*\1\(_*.\).*\)/\4\2\3/;ta;s/@.*//;x;s/0//;/0/b};${x;p};d'
> こんなワンライナー書く人がいたら求婚する。
ギークなお姉さんはPHPなんかやらないで、sedを勉強するべきですよ。

・Python Cookbook
http://blog.livedoor.jp/dankogai/archives/50856126.html

404から

16. Programs About Programs
17. Extending and Embedding
18. Algorithms
19. Iterators and Generators
20. Descriptors, Decorators,and Metaclasses

が抜けているのって痛くね?そのかわりに、翻訳は日本語だし、コードのミスが直ってる。
両方買えって事か。

・Verilog
taskの書き方が分からずにネットをさまよう。本棚には浴びるほどC++とPerlの本があるのに、Verilogの本もういらねーってどこかにやってしまった。僕はC++とかPerlとか勉強する熱意の1/10でも、Verilogに向けるべきだ。

| | Comments (0) | TrackBack (1)

Iteratorで順列を作る

Higher-order Perlから

Chap4はiteratorの話。一番身近なiteratorはファイルハンドル、という説明は分かりやすい。

タイトルの通り、Iteratorを使って順列を作る話。('A' 'B' 'C')のリストからこんな出力が欲しい。
[A B C]
[A C B]
[B A C]
[B C A]
[C A B]
[C B A]

普通に再帰を使って順列を作ると、CPUとメモリを大きく消費するし、順列に対して一つずつ処理するのがやりにくい。(ファイルハンドルでも、ファイルを全部読み込みたいときと、1行ずつ or 一文字ずつ処理したいときあるよね)

そこでIteratorを使う。
面白いのが、まずこんな感じのカウンターを作ります。(名前ありそうだけどね)

0000
0010
0100
0110
0200
0210
1000
1010
1100
1110
1200
1210
2000
2010
:
2210
3000
3010

3200
3210

最下位の桁は0固定として、その次から下位から順に、2進、3進、4進のカウンターになっています。4桁だとちょうど24個で、順列の数になっています。0000から始まって、3210が最大です。3桁だと、000から210までなので、これも3個の順列で6個の値を取ります。

戦略としては、iteratorを使ってこのカウンターを順次インクリメントする→カウンターの値から対応するリストを取り出す、になります。順列を一つずつ作る部分と、順列からリストを作る部分が分離しているのが美しい。

目的のリストのつくりかたを簡単に説明します。カウンターの最上位に対応する要素を抜き出します、抜き出されて要素が一つ減ったリストと、カウンターの最上位を取り除いた物で同じように処理します。簡単な再帰なのですが、文章だけではわかりにくいと思います。

もとのリストが、(A B C D)カウンターの値が2010の時、カウンターの最上位が2なので、Cを取り出します。

元のリスト カウンター 新しいリスト
(A B C D) 2010     ()
(A B D)   010    (C)    ← Cを抜き出し、カウンターの最上位を取り除く。

次は、カウンターの最上位が0なので、(A B D)の0番目にあたるAを取り除きます。

(B D)    10   (C A)    ← Aを抜き出し、カウンターの最上位を取り除く。

次は、カウンターの最上位が1なので、(B D)の1番目にあたるDを取り除きます。

(B)     0  (C A D)    ← Dを抜き出し、カウンターの最上位を取り除く。

最後、カウンターの最上位が0なので、(B)の0番目にあたるBを取り除きます。

()         (C A D B)    ← Bを抜き出し、カウンターの最上位を取り除く。

これで、(A B C D)と2010から、(C A D B)が取り出せます。

使い方はこんな感じです。
my $it = permute('A' .. 'D'); #iteratorを返す

while (my @p = $it->()) { # iteratorが空のリストを返すまで順次インクリメント
 print "@p\n";
}

package Iterator_Utils;が上手く使えず、自力で書いたのは秘密。

| | Comments (0) | TrackBack (0)

2007.11.04

Cが最速なんてもう言わない

例によってHigher-order Perlから

昨日までは、同じ処理を同じアルゴリズムで書いたらC/C++が一番早いに決まっているという信念があったのですが、この本を読んで考えが変わりました。2007年11月3日はそんな記念日。

相変わらずメモ化の話なんですが、

・フィボナッチ書けたよ → 遅くね?
・メモ化したよ → 毎回メモ化の仕組み作るの面倒じゃね?
・closureがあるよ → 引数が一つの時しか使えなくね?
・joinでつなぐよ → f("x,", "y")と、f("x", ",y")でバグるよ
・正規表現でエスケープするよ → 遅くね?
・key generatorを引数で渡して、if文で切り替えたらどうよ → if文無駄じゃね?
・eval使うよ ← 今ここ

という議論を経て、evalを使う話。上の議論は全部Perlのソース付きで説明されています。
で、問題のコードがこれ。

sub memoize {
 my ($func, $keygen) = @_;
 $keygen ||= q{join ',', @_};

 my %cache;
 my $newcode = q{
  sub { my $key = do { KEYGEN };
    $cache{$key} = $func->(@_) unless exists $cache{$key};
     return $cache{$key};
    }
 };
 $newcode =~ s/KEYGEN/$keygen/g;
 return eval $newcode;
}
 
引用のレベルだと思うけど、念のため。ソースはここから取得可能、ソースのライセンスはここです。

evalを使う前ののソースが、my $key = $keygen ? $keygen->(_@) : join ',' , @_; と、引数$keygenがあるかないかで、joinを使うか、引数で与えられた$keygen関数を使うかを切り分けていたのが、上のやり方で三項演算子が一つ消えている。つまり、自分で最適化されたソースを作り出し(KEYGEN部分の置換)、evalしてそのまま利用することで条件分岐を減らしているわけだ。これはC言語では難しい。条件分岐をnopでつぶすとか、DLL作り直して再ロードとかできなくはないが、明らかにCの範囲を超えている。これCommon Lispでできたらすごい事になる事に気がついた。

状況としては、良く呼ばれてボトルネックになっている関数があるとする。その関数が、起動時のオプションや実行時の状態によって、ちょっとずつ動きを変える必要があるとする。Cで書くと、どうしても動きを変えるためにif文が必要になる。Common Lispだと動きを変えたS式を作り出し、最適化を書けてコンパイルして使い続けることができる。Lispについてのよくある誤解と、その中にあるちょっとした真実にあるように、もともとCommon Lispのコンパイル能力は高いらしいので、「いろいろ変わる条件」が複雑になればなるほど、Common Lispの方が速い可能性が出てくる。Cでも、考えられる組み合わせにはそれぞれ別の関数を作るってやり方もあるけど「100回以上呼ばれたら、自動的に最適化されたS式を作り出して、再コンパイル」みたいな芸当はCにはできない。

結論:Lispすげー!

メモ化の話としては、内容的にも、ページ数的にも、ここで折り返し
後は、特殊な状況下での考察がソース付きで続く。Higher-Orderはあまり関係ない。

キーワードだけ列挙
・f(A=>32, C=>99)と、A(C=>99, A=>32)を同じに扱うべきかどうか
・デフォルト引数的な動きをする関数をどう扱うか。
・オブジェクトのメソッドをメモ化するときの注意点
・オブジェクト(のアドレス)をキーにしてはいけない理由
・メモ化の結果をDiskに残して、後で再利用する
・時刻を取得する関数をメモ化が有効な時
・sort関数でのメモ化
・Orcish Maneuver
・Semipredicate problem
・"0e0"問題
・100回呼ばれたら自動的にメモ化する

100ページを読んでまだまだ絶賛ベタ褒め中。

| | Comments (2) | TrackBack (0)

今日のシンコーシン

・C++信仰
ときどきの雑記帖 リターンズ さんから

> んとですね、わたしが「信仰」という単語を持ち出したのは、 確たる理由もなく相手の状況を一顧だにせずC/C++を押し付ける(曰く「必要だ」 「ポインタが理解できれば云々」)その態度が、宗教(特に新興宗教といわれるそれ) の押し付けに近いものを感じたからです。 ですのでなつたんさんがご自分の姿勢と態度を称して信仰といわれるのは にんともかんとも。
あっ、他人に対してなのか。誤読失礼しました。
自分自身、何でC++勉強してるのかさっぱり分からなくなって、C++信仰じゃね、って言われたときに図星を指された気がして反応してしまった。

# 図星は、突くのか指すのかわからない。
明鏡:指す
国語大辞典:突く
大辞泉、広辞苑:両方


・最強伝説
神様なんて信じない僕らのためにさんから
[c/c++]C++が最強に決まってるだろ!

> だいたい、
> 何かのコスト(お金や学習時間、調査時間など)を払わずに、
> プログラムをしようだなんてことが間違っているんだよ!!!!!!
かっこえー。

退職金でBDS狙っているんだけど、BCB5 Personalからアップグレードできないみたい。できても高そうだけど。素直に、Visual Studio買うか。

> C++はいいものだ……。
早くここまで行こう。
目標「それ、Boostで出来るの知っているけど、(前向きな理由)であえて使わない」とさらっと言えるところまで頑張る。
使えないと使わないの違い。

・Higher-Order Perl
3.11 EVANGELISM (伝道師)
If you're trying to explain to a C programmer why Perl is good, automatic memoization makes a wonderful example.
CプログラマにPerlの良いところを説明しようとしているなら、自動的なメモ化の話は見事な例になるよ。

何というタイムリー、Perlの良さを説明するのにわざわざ1節とってある。みるみる信仰心がゆらいでいく~。一応、If you are a C programmer, じゃないのが救い。

そういえばCode Completeにもプログラミングに宗教を持ち込むなで1章取ってあった気がする。こっちは真面目に書いてあったけど、新しい版にも残っているのだろうか。

・神の比較
noboshemonさんの所から
「仏教も、キリスト教も、イスラム教も、それで飯食えるくらいまでいったけど、状況による使い分けが大事だよ。」
「宗教初心者は日本に行って神道から始めると良いんじゃないかな。断食とかお布施とか無いから初心者向け」
とかいう人はいない。宗教ってそういうシステムになっているんだな。

| | Comments (0) | TrackBack (0)

2007.11.03

中はLISPです

Higher-Order Perl、chap3から。

メモ化の話
少し前に流行った、fib関数をメモ化して速度を上げる話。
普通にいろんな実装方法を説明した後、どうやって一般化するかでMemoize.pmの紹介がある。

Perlだと メモ化を個人で実装する必要はなくて、
use Memoize;
memoize 'fib';
で関数fibをメモ化できる。この本では、紹介だけでなくMemoize.pmの動きをちゃんと説明している。Memoize.pmはPerlの内部テーブルを書き換える話をした後に、closureが来る。

どうみても、Lispです。
Padというのは、ローカル変数のbindingを行うデータ構造で、StubはPerlのjargonではCV(code,value)と呼ばれる。carが手続き(code)をさして、cdrがpad(ローカル変数のbinding)を指すと説明が入る。Perlでclosureが作られるとその数だけCVが作られる。普通にbindとか、lexical closureとか単語が飛び出し、ここだけ読んだらPerlの本とは思えない。SICP実践編って感じだ。銀行口座よりも、メモ化で高速にする方が面白い。

気がついたんだけど、Pythonとかanonymousなんちゃらの概念がある言語って同じ仕組みになっている気がする。ということは、gccもPerlもRubyもPythonも中はLispでできているんじゃね?Lispはあまり普及していないっていうけど、見えないところにLispの根ってのががっちり蔓延っていて、僕たちは毎日Lispを無意識に使っているんですよ。

あとは、将来言語設計に進みたい人はLispってのが避けて通れないと思った。

| | Comments (1) | TrackBack (0)

2007.11.02

電卓

Higher-Order Perl、から。

Perlで逆ポーランドの電卓を作ろうという話題

#!/bin/perl
use strict;

my @stack;
my $actions = {
    '+' => sub { push @stack, pop(@stack) + pop(@stack) },
    '*' => sub { push @stack, pop(@stack) * pop(@stack) },
    '-' => sub { my $s = pop(@stack); push @stack, pop(@stack) - $s },
    '/' => sub { my $s = pop(@stack); push @stack, pop(@stack) / $s },
    'NUMBER' => sub {push @stack, $_[0] },
    '_DEFAULT_' => sub { die "Unrecognized token '$_[0]'; aborting" }
};

my $result = evaluate($ARGV[0], $actions);
print "Result: $result\n";

sub evaluate {
    my ($expr, $actions) = @_;
    my @tokens = split /\s+/, $expr;
    
    for my $token (@tokens) {
        my $type;
        if ($token =~ /^\d+$/) {
            $type = 'NUMBER';
        }

        my $action = $actions->{$type} || $actions->{$token} || $actions->{_DEFAULT_};

        $action->($token, $type, $actions);
    }
    return pop(@stack);
}

ざっとこんな感じ。
my $action = $actions->{$type} || $actions->{$token} || $actions->{_DEFAULT_};
この辺りがLLぽい。一つめのハッシュが駄目なら、次のハッシュ。

class calclator {
public:
  int calc(std::vector tokens) {
    std::vector::iterator it;
    for(it=tokens.begin();it!=tokens.end();it++) {
      if(it->type() == NUMBER) {
        st.push(*it);
      } else if(it->type() == OPERATOR) {
        token op2 = st.top(); st.pop();
        token op1 = st.top(); st.pop();
        st.push((*it)(op1, op2));
      } else {
        std::cout << "error" << std::endl;
      }
    }
    token result = st.top();
    st.pop();
    return result.value();
  }
  
private:
  std::stack st;
};

一応C++でもそれっぽくできて動いたけど、なんかダサイ。
スタックに、文字列でも数字でも入れられるようにしようとしたのが失敗。逆ポーランド記法ではスタックに入るのは数字のみと気がついたのは、完成間近。それに気がついたとたんやる気がなくなった。なんでもほいほいpushできるLLすげー。普通の会社でC++で開発していて、やべー設計間違ってるって時、どうしてるんだろうな。

'+'のアクションで、std::plusが使えそうだったけど上手く行かなかった。今日はstd::stackが使えるようになったので良しとしよう。一日一歩。

Perl、入出力込みで数時間。(丸写しだけどね)
C++、3日がかりで、入力はソースに直書き。

むう、そろそろC++挫折しそうになってきた。

| | Comments (0) | TrackBack (0)

MINIX本

# 昨日、寝ぼけ眼で一度アップしましたが、朝見てみると熱い思いが足りなかったので少し書き足しました。

MINIX本の魅力というのは、OSに関しての最低限の知識を与えつつ、その中の一つをCで実装するという点。だから、○○が知りたいからMINIXのソースを見るというのは、あまり効率が良くない気がする。どっしり座って、前から順番に読んだ方が面白いし、説明を読んでからソースを見た方が理解が早い。僕の中では、コードよりも本文の方が価値が高い。

デッドロックについても、アルゴリムや検討事項を書いておきながら、結局MINIXの実装では何もしていない(ダチョウアルゴリズムらしい)。ちょっww、これだけ書いてあるんだから、なんか仕組み入れろよ!と突っ込むのが正しい読み方だと思う。OSを書こうって思うときは、ブートとファイルシステム入出力で途方に暮れるから、スケジューラだけ作ってみたいとか、そういう人の最初の一歩には良いんじゃないかと。でもすぐにLinuxとか次のOSに移っちゃうじゃないかな。なんかブートさせたいだけなら30日OS本もある。

この本が出ていた頃というのは、OSの実装について体系だって書かれた本が少なかったと思う。4.3の悪魔本386 BSDカ-ネルソ-スコ-ドの秘密くらいじゃないかな。見落としもいっぱいあると思うが、Amazonで気楽に技術書を探す時代でも無かったので、本屋に無い本は存在しない本だった。最前線UNIXのカーネルLions’ Commentary on UNIXはもう少し後だ。どの本も敷居が高そうで、頭から予備知識なしで読んで行くにはMINIX本がベストでした。256本があったのもうれしい。今だったら、googleでいろいろ調べられるし、あえてMINIX本を読まなくても好きなOSから勉強始めることができる。Virtual Machimeも無料で複数あるし、パソコン壊す心配もない。勉強の仕方も変わったと思う。Tanenbaum先生に怒られる覚悟で言うと、MINIXの歴史的な役割は終わったのかなと思う。MINIX 3 - Improvements since V2の「The kernel has been heavily rewritten, cleaned up, and reduced to under 4000 lines of code」は、もっと評価されても良い。このページ見ていたら、もう一回ちゃんと勉強したくなってきたじゃないか。どうしてくれる。

ピンポイントで読むとしたら、スケジューリングの所も良いけど、fork、execの所と、brk周りはわかりやすかったので勧めておきます。ただ、今動いているOSはもっと複雑なことをしているというのは、頭に入れておいて読んだ方が良いです。あくまでとっかかりとして。

そういえば、このころの書店ってLinuxとFreeBSDって同じくらい本棚の場所取ってたんだよ。場所によったらインストール本がずらっと並んで、BSD関係の方が多かったと思う。MINIXつながりで言うと256本も面白かった。FreeBSDの256本と併せて、貧乏くさいテクニックがいっぱい載っていた。引数で動作を変えるクランチバイナリとか(今のbusyboxに繋がる)、FDDのフォーマットを変えて無理矢理データを押し込むとか。僕はこの本でbrkの動きが分かり、C言語の256本でMS-DOSでのmallocはUNIXのsbrkの動作をまねている。だからfreeしても領域は再利用されない、という説明を読んで、ああなるほどと思ったりもした。

今、パラパラとページをめくってみると、意外にボリューム少ない。今なら一ヶ月あれば十分読めそうな気がするが、勉強したときは半年以上かかりっきりで読んでいた。コードコンプリートも一年がかりで読んだし。最初の頃は1冊の技術書読むのはそれくらい時間がかかった。今は、年を取って感動する事が減ったのか、あとで詳しく知りたくなったらgoogleとか思うようになったので、一冊の本をしっかり読むのは減ったと思う。

MINIXの魅力を書くつもりが、いつの間にかただの昔話に!

まとめ:
OSって何か分からないけど作ってみたい、って人にはお勧めしますが、すでに興味のあるOSが有るのならそちらの書籍を買って読んだ方が良いと思います。小難しい話抜きで、何かブートさせたいなら、30日OSがお勧め。

| | Comments (0) | TrackBack (0)

2007.11.01

今日の日記

・C++信仰
ときどきの雑記帖 リターンズさんから

僕はありますよ。C++できたら、世の中の問題は全て解決出来ると信じています。複雑な方が良いみたいな「奥が深い症候群」なのでしょう。面白そうな本も多いし。最近になって、LLも凄いとやや信仰が薄れてきました。

それなりに理由をつけてみると、尊敬している人たちがC++を普通に使うというのが一つの理由。C++ D&Eを読んで、プログラマに言語上のなにかを強制しないというStroustrupのスタンスに共感したのが2つ目。その裏で、Stroustrupはプログラマに勉強を強制しているんだけどね。Stroustrupの空気読めなさは、結構好きな人も多いんじゃないかと。

C++ D&EのPython版って無いのかな。

・マ板から
OS作れよ http://pc11.2ch.net/test/read.cgi/prog/1189402769/

> 1 名前:仕様書無しさん[] 投稿日:2007/09/10(月) 14:39:29
> おめーら
> 能書きばっかり垂れてねえで
> OSの一つや二つ作ってミロや
>
> そしたらちんこしゃぶってあげる

> 25 名前:仕様書無しさん[] 投稿日:2007/11/01(木) 10:08:18
> しかし、スレ伸びないな。
> それだけ、糞グラマーが多いってことか。

板違いだからじゃないかな。
OS板とまではいかなくても、せめてム板だな。

・某404アマグラマーのすすめ
なんかちがう。あそこのおもしろさは、○○はわかっていない→俺ならこう書く→仕事っていうのは→アメリカでは・・、俺税金納めるの大変、結婚して家族もいるよ、本も一杯あるよ、っていう、上から目線から始まる全然隠す気が無い俺スゲーだと思う。中二病を実現させるとこんな大人になるみたいな。
そういえばvoidさんの本も立ち読みしたけど普通だったな。そんなもんか。

・C++
calc.cpp:23: error: `token_type token::type() const' is private
calc.cpp:38: error: within this context
こんなエラーで悩む。contextによって、アクセス権限変わるのか!と驚き、いっぱい調べる。
http://gcc.gnu.org/bugs.html#cxx_rvalbindが関係あるかと思っていたが、publicとprivateを普通に打ち間違えてただけだった。

泣きそう

| | Comments (2) | TrackBack (0)

« October 2007 | Main | December 2007 »