Hatena::ブログ(Diary)

星一の日記 このページをアンテナに追加 RSSフィード

2011-01-12 MacBook Air 11インチ欲しい!

2010-09-23

ブログを移行します

移行先: HajimeHoshi.com

どうぞよろしくお願いします。

(DNS レコードの設定をしたのが昨晩なので、見当違いのページに行ってしまうかもしれません。)

2010-08-20

[] gomingw で cgo が動かない

gomingw (MinGW 版 Go) で cgo を実行すると次のようなエラーが出ます。

exec gcc: no such file or directory

cgo などのソースを読んだところ、複数の原因がわかりました。ツリー状に記述します。

  • $GOROOT/src/cmd/cgo/gcc.go 549 行目付近の runGcc 関数が失敗する
    • $GOROOT/src/cmd/cgo/util.go 18 行目付近の run 関数が失敗する
      • exec.LookPath(argv[0]) が失敗する (argv[0] には文字列 "gcc" などが入りうる)。
        • PATH 環境変数と argv[0] の組み合わせがうまくいかず、 gcc が (C:\MinGW\bin\gcc.exe (MSYS 方式では /c/MinGW/bin/gcc) として存在するにもかかわらず) 存在しないことになってしまう (この点について解決策はないこともなく、 PATH=. として $GOBIN/cgo を実行し、カレントディレクトリに gcc という /c/MinGW/bin/gcc を実行するだけのシェルスクリプトをおいておけばよい)
          • PATH 環境変数は MSYS が気を利かせているせいか、 ; 区切りの Windows 方式になる。しかし LookPath 関数内では PATH を : で区切って処理してしまう (exec.canExec に c:/ で始まる絶対パスを渡すことができない)。
          • PATH を空にすると強制的にファイルが見つからないエラーになる。
          • (おまけ: argv[0] に入る文字列は、 CC 環境変数が設定されている場合はそれ、設定されていない場合は gcc となる。これを gcc.exe にしないと、つぎの exec.canExec 関数で「ファイルがない」エラーになるおそれがある。)
        • exec.canExec 関数が MinGW 向けにカスタマイズされていない
          • os.Stat("/c/MinGW/..") といった MSYS 式絶対パス記法は、ファイルが見つからないエラーになる (os.Stat("c:/MinGW/..") なら良いけれども、上記の通り c:/ といった絶対パスも渡せないので、結局相対パスしか渡せないということになる)。
          • os.Stat 関数にどんなファイル名を入れても、パーミッションが 0666 (実行権限なし) として返ってくる (※)

パス周りは Windows と MSYS/MinGW との間の表記の揺れで本格的にどうしようもない感じになっています。

また※の問題が致命的で、これを解決する術が見つかりません。

2010-07-27

[]「プログラミングの魔導書」創刊号レビュー

創刊号のテーマは Construct the World, C++ です。まず、レビューを書くという条件でこの雑誌を紹介してくださったくださった深川宏樹さん (id:hiroki_f)、また高橋晶さん (id:faith_and_brave) をはじめとする「C++ 闇の軍団」の皆様に感謝いたします。ありがとうございます。

僕は仕事で C++ を使っていますが、 C++ のスキルはたいしたことがありません。スキルをどう表現するかは難しいところですが、 Exceptional C++ を読んで「当たり前じゃん」ではなく「勉強になるなあ」と思える程度の能力です。そして C++ が好きな言語というとそうではなく、どちらかというと嫌いな部類です。C++ の記述の面倒くささやコンパイル時間の長さに辟易して D に逃げてしまったくらいです。しかし C++ には学ぶところがたくさんあります。 C++ の三十年ほどの長い歴史から言語仕様策定の難しさが学べたり、 Boost を通じてメタプログラミングなどの最新の技法を学べる、という点ではよいとは思っています。でも趣味ではあまり使いたくないというか…。

「プログラミングの魔導書」の内容は、 C++ の最新のライブラリ解説、 C++ の作者の一人である Bjarne Stroustrup へのインタビュー、カンファレンス体験記などなど、 C++ プログラマーが興味をそそるものばかりです。想定読者は C++ に精通している中・上級者向けであり、かなりレベルが高いと感じました。雑誌という形態を取っており、一つの記事あたりおおよそ 10 ページほどあり、ブログという形態に比べて一つ一つのテーマが深く解説されています。

ライブラリ解説記事に関しては Boost はもちろんのこと、他 iostream の設計の深い話や、新しいライブラリである Oven なども解説されています。ちょっと前まで僕は D を触っていたので、 D の Range と考え方が同じである Oven ライブラリの記事は興味深く読めました。 Oven は Range を中心としたライブラリで、 Range は大雑把に言うとイテレータの begin と end を一つにまとめた「範囲」を表す概念です。 Oven は Range とそのリスト演算を含むライブラリで、パイプ演算子を用いて流れるように処理を書く事ができます。リスト演算の大本は関数型言語だと思いますが、 C++ の Oven だけではなく RubyC# (LINQ) などをみるに、リスト演算はトレンドなんでしょうね。ちなみに Oven を使った例 (P.64) は以下のようなものです。

const std::vector<int> v = initial_values(3, 1, 4, 5, 2);
std::cout << (v | filtered(&is_even) | transformed(&to_string)) << std::endl;

稲葉一浩さんの「Hello, C++ World!」は驚くべき記事で、単純な Hello World プログラムがこれでもかというくらい詳しく解説されています。名前空間と ADL、演算子オーバーロード、テンプレート、関数ポインタ、コンストラクタ・デストラクタなどです。単なる Hello World プログラムからデストラクタに説明が及ぶのに感銘を受けました。プログラム終了時に確実にバッファをフラッシュさせるために static オブジェクト (のデストラクタ) が必要になるという具合です。このように Hello World プログラムには C++ のエッセンスが詰まっており、稲葉さんは次のように述べられております:

「C++ というのは、ハロー・ワールドひとつ見れば全ての機能の存在理由が説明できるくらい、明快な言語だ!」と私は思っています。八割は冗談ですが、「ハロー・ワールドひとつ使いやすくするのにすら使えない言語機能なんて、何に使うんですか?」なんて言ってしまったりして。 (P.91)

江添亮さんの「C++ の歴史」で、 C++ の歴史からいろいろなトリビアを知ることができました。メタプログラミングが実は、テンプレートプログラミングの良くない (と思われていた) 使用方法から始まったのは驚きです。

1994年のことであった。標準化委員会の会議中に、Erwin Unruhなる者が、ある、興味深いコードを示した。そのコードは、コンパイル時に、テンプレートのインスタンス化を用いて、素数を計算するというものであった。これが、記録に残る初めての、テンプレートを用いた、メタプログラムのコードであった。

しかし、Erwin Unruhの本来の意図は、メタプログラミングの可能性を示すものではなかった。彼は、テンプレートを用いて、コンパイル時に計算するようなコードが書けることを、危険だと考えていた。それ故、彼は、コンパイル時に素数を計算するコードを示して、以てテンプレートの危険性を周知させようとしていたのであった。

しかし、Bjarneその他の者は、むしろ素晴らしいと、絶賛した。彼は、この意外な反応にひどく驚いたという。 (P.144)

他にも記事がたくさんあります。「プログラミングの魔導書」は、C++ の始まりから最先端までを良質な記事を通して知ることができる、類をみない雑誌であると思います。

2010-01-15

自分がインタビューに答える様子が、スカパーの番組で放映されたらしい

これに出たらしいですが確認してません。