(広辞苑より)2009年3月28日土曜日ErlangでFizzBuzz問題、それをC++のテンプレートで表現するTweet今更ながらFizzBuzz問題を解いてみる。今回はErlangで解いてみた。それだけだとつまらないので、それをC++のテンプレートで表現してみた。因みにErlangを使っているけど並列処理はしていない。普通に何の工夫もなく書いてみた。io:nl().うーん、面白くない。いうわけで、今度は以下のように書いた。これをC++のテンプレートで書いてみると以下のようになる。}どうせなら2つある関数(C++ならクラス)を1つにしてみよう。5).C++のテンプレートでは以下の通り。}何だかちょっとやり過ぎな気がするなぁ。Engineを使ってウェブアプリケーションとして実装してみた。最初、はてなブックマーク件数取得APIを使ってみたが、非常に遅い。APIによる実装だが、件数を取得するまでブラウザに表示できないのでかなり待たされる。Engineの制限によりタイムアウトしてしまうこともあった。仕方がないので素直にhttp://b.hatena.ne.jp/entry/を使って画像表示を行うことにした。(画像表示版)今時のブラウザは遅延読み込みによる画像表示のため待たされずにサクサク表示できる。API版)一方、API版は画面に表示されるまでかなり待たされる。コードについては、あまり時間をかけずにザザッと書いたので結構いい加減かも。日本語処理で少しはまって適当に処置した。最後にソースコードを示しておく。self.response.out.write(content)追記(2009/3/26):日本語処理を若干修正。ここで示してるコードはかなりひどいので少し手直しして、CUDAで作成した分子動力学計算プログラムを書き直してみたという記事にまとめた。こちらも参照して欲しい。最近、自分の周りではCUDAを使ったGPGPUが流行っているので、どんなものかこの週末にいじってみた。XPマシンにCUDAをインストールをしてリファレンスやサンプルプログラムをパラパラと読んでみた。二日目になんちゃって分子動力学(MD)計算プログラムを書いた。擬似原子を扱っており、全原子のvdW力とクーロン力のみを考慮して分子内結合については考慮しない、液滴中のMD計算だ。半径20Åの液滴中に1229原子を入れて1000ステップ計算させてみた。C++で書いたプログラムでは4分30秒かかった計算がCUDAでは32秒で計算できた。約9倍ほどの速度が出ているようだ。C++のコードも併せて一日で書いたので最適化や高速化については考慮していない。後でスレッドでの分割がやりやすいかもと思ってiとjをそのまま全部計算しているし。気が向いたらちゃんとしたプログラムを書いてみるかも。CUDAアーキテクチャについてはまだまだ理解が足りない。効率のよいメモリの扱い方を覚えないとなぁ。あと、sharedメモリをうまく扱えてないっぽい。一日二日じゃキツイか。初心者が一日で書いたコードなので参考になるかわからないが、以下にソースコードとサンプルの入力データを示しておく。入力データについては、上記で用いた1229原子ではブログ記事するには大きすぎるので154原子の小さなデータを用意した。記事の表示量が多くなりすぎるのでC++のソースは割愛させてもらった。Windows上でのコンパイルは下記の通り。simple_md_gpu.exe入力ファイルをmd.datとして、100ステップ計算させる場合は、以下のように実行する。100最初に初期構造が表示され、次いでステップごとのエネルギー、最後に最終構造が出力される。1.000追記:特に記述しなかったが、出力エネルギーはポテンシャルエネルギーなので、念のため。ここでは時間積分について考慮していない。NVEアンサンブル(定エネルギー)であれば、時間積分は速度ベルレ法がもっとも実装しやすいように思う。dt/2で速度を求め、そこからdtの座標を計算し、その座標からさらにdt/2で速度を求める。プログラミング2009年3月13日金曜日C++のテンプレートで素数を求めるTweetふと、C++のテンプレートで素数の計算をさせてみようと思い立ち、コードを書いてみた。書いた後でググってみたら同じことを考えた人がやっぱりいたけど気にしない。これは車輪の再発明ではなくてパズル遊びだから。コードの書き方も違うしね。因みに、このテンプレートによる素数計算ではコンパイル完了時に既に素数が求まっており、実行ではそれを表示するだけなので、ある意味、最速の素数計算プログラムと言えるかも。短いコードだから読めばわかると思うけど、一応説明しておく。Primesに渡したテンプレートパラメータnを1ずつ減らしながら順番にPrimeに渡して、それが素数なら出力する。false>が呼ばれて何もしない。dについてはテンプレートの入れ子を減らしてコンパイル時間を短くするために、2および3で割り切れない値を次のdとしている。true>が呼ばれて値を出力する。以下に100までの素数を出力するコードを示す。main関数のPrimes<100>();の数値を変更すれば任意の数までの素数を出力できる。上に書いたコードを含むソースをコンパイルしたらエラーが出た。コンパイラにとって何かの情報が足りないようだ。どこが間違っているのだろうか?答えは以下の通りで、「typenameが抜けている」。}コンパイラからはテンプレートパラメータTを含むstd::vector<T>::const_iteratorが型かどうか判断できないので、型であることを明示的に教える必要がある。コンパイラによってはtypenameがなくても通っちゃったりするんだけどね。プログラミング2009年3月3日火曜日Bloggerの記事が表示されない不具合TweetBlogger(blogspot)の記事(エントリ)が正常に表示されない不具合が確認されている。こちらでもその不具合を確認した。ブログのタイトルやサイドバーは表示されるのだが、記事そのものがブランクとなり表示されない。表示されない記事はランダムで決まるようだ。Googleのディスカッションボードでもかなりの被害が報告されている。対策として、新しい記事をドラフトで保存しキャッシュをクリアする方法がある。これは一時的な対策であり、しばらくするとまた表示されなくなったりする。Connect関連のエラーかと思い、ダッシュボードのプロフィールの設定で「読者になっているサイトを表示」のチェックをはずしたところ、今のところ不具合は出ていない。今後再発するかもしれないがそしたらそのとき考えよう。ポインタと配列についてTweetC言語の入門書を読み始めたばかりの初心者である学生が、先生に質問をしているようです。どんな内容かちょっと聞いてみましょう。先生、ポインタの宣言ってこれで合っていますよね。5;のように使うとエラーが出るんです。メモリを確保しないと使えないぞ。a[10];のように宣言したら使えましたよ。ポインタって全然ダメですね。ポインタと配列はまったく違うものだから、どちらがダメでどちらが良いと云うことはないよ。配列はその場でメモリを確保して使えるが(上記の場合はintを10個分)、プログラム内で決め打ちした数値になってしまう。後から大きさの変更ができないんだ。ポインタは宣言しただけでは使えないが、後から自由にメモリを割り当ててその大きさを変えられるから、少ないメモリで済む場合は小さく、たくさんのメモリが必要な場合は大きくメモリを自由に確保することができる。それはこのようにすればいい。sizeof(int));これは、intのポインタにintの大きさで10個分のメモリを割り当てるという意味だ。確保したメモリが不要になったならfree(p);で開放する。この辺についてはその入門書にも載っているだろう。なんだか難しそうですね。慣れれば難しいことなどないよ。C言語ならmallocでメモリを割り当て、freeで開放と覚えていればいい。