2006年03月
ぐりちゃれ決勝
- 2006-03-31 (Fri)
- プログラミング
とりあえず自分のスロットを消費完了.決勝問題のサイズが大きく read 関数で一度に読みきれなかったため転送ミスで間違った答え連発… これに気づいて修正するのに30分を無駄にしてしまった.けどまあ,そのあとは順調に答えが出たので今回のプログラムはそれなりにうまく出来ていたらしい.結局全部で500台1000CPUぐらいは占有して計算できたので去年に比べればだいぶ進歩したかなと.戦略を間違えたのでいい答えが出たかはよくわからんが,とにかくあとは結果まち.
- Comments: 0
- TrackBack (Close): -
pthread のキャンセルポイント
- 2006-03-30 (Thu)
- プログラミング
usleep がキャンセルポイントになっているであろうと思い込んでいたら実はキャンセルポイントになっていない環境があることに気づいた.ということで,pthread_testcancel() をループ中に叩き込みまくる羽目に.美しくないプログラムだなぁ.
- Comments: 0
- TrackBack (Close): -
GridChallenge 間に合うか?
- 2006-03-29 (Wed)
- プログラミング
とりあえず,プログラムの連続稼動はあきらめて各問題で再起動させることにして… あとはファイルサイズがどの程度か気になるけど全員に読ませることにして… 仕掛けは出来上がったので後はグリッド上でテストしよう.どうでもいいけど障害多すぎて練習時間削られてるのは非常に痛い.
- Comments: 0
- TrackBack (Close): -
genericタイプの配列 in Java
知らずに引っかかってしまったが,ここらへんの記述によると generic の配列は作れないそうな.代わりに Vector を使えばいいのだけど Java の Vector はアクセスが面倒…
- Comments: 0
- TrackBack (Close): -
変なコード?
g++ (GCC) 3.3.5-20050130 (Gentoo 3.3.5.20050130-r1, ssp-3.3.5.20050130-1, pie-8.7.7.1) で以下のコードがエラー無くコンパイルされた.3.4.4 とか VC++ (VS.NET 2005) ではコンパイルできなかったのに…
#include <iostream> #include <string> int main(int argc, char *argv[]) { for({std::cout << "Hello?" << std::endl; std::cout << "world?" << std::endl; } 0 ; 0) { std::cout << "loop?" << std::endl; } return 0; }
- Comments: 0
- TrackBack (Close): -
Haskell の導出インスタンス
data と newtype の宣言で deriving つけたらインスタンスが自動生成されることを始めて知った… Eq、Ord、Enum、 Bounded、Show、 Read に対して使えるようでかなり手間が省ける.
- Comments: 0
- TrackBack (Close): -
あまり見ない C++ コード
ひとつ目.switch の後に { } がない(switch の意味が無いが…).return でカンマ区切りの式.throw がカンマ区切りをともなってネスト.
#include <iostream> int main(int argc, char *argv[]) { try { switch(argc) case 1 : return std::cout << "no argument!" << std::endl, 0, throw (1,throw 9,2), 1; } catch (int k) { std::cout << "cought exception: " << k << std::endl; } return 0; }
どうやらこのコードでは 9 が投げられるらしい.
二つ目.Pointer to Member Function: .* and ->*
#include <iostream> struct Base { virtual void f() { std::cout << "Base! " << std::endl; } }; struct DerivedA : public Base { int k; DerivedA(int kk) : k(kk) {}; void f() { // オーバーライド std::cout << "DerivedA with k = " << k << std::endl; } }; struct DerivedB : public Base { }; int main(int argc, char *argv[]) { DerivedA *pobjA, objA(5); DerivedA objA2(3); DerivedB objB; typedef void (Base::*f_type)(); f_type f_base = &Base::f; pobjA = &objA; (objA2.*f_base)(); (pobjA->*f_base)(); (objB.*f_base)(); }
なんに使えるのかよくわからないが,とりあえずちゃんとオーバライドした関数も呼ばれる.
- Comments: 0
- TrackBack (Close): -
C++のコメントを抜き出す by Haskell
C++ のソースからコメントだけを抜き出したい衝動に駆られたのでおもむろに Haskell で実装.やはり簡単なプログラムの実装は Haskell のほうが簡単だ…
-- Extract C++ comments from stdin import List import System -- for C-style comments, i.e. /* comments... */ judgeC (t,c) (c1,c2,c3) = if t==0 && c2=='/' && c3=='*' then (1,0) else if t==1 && c1=='*' && c2=='/' && c > 2 then (0,0) else (t,c+1) -- for C++-style comments, i.e. /* comments... */ or // comment... \n judgeCXX (t,c) (c1,c2,c3) = if t==0 && c2=='/' && c3=='/' then (2,0) else if t==2 && c2=='\n' then (0,0) else judgeC (t,c) (c1,c2,c3) unfilterComments x judge = let dx = (zip3 (" "++init x) x (tail x++" ")) cms = scanl judge (0,0) dx cms' = zipWith (\(c1,_) (c2,_) -> c1 > 0 || c2 > 0) cms (tail cms) in map (\(x,c) -> x) (filter (\(_,c) -> c) (zip x cms')) main = getArgs >>= (\args -> getContents >>= (\x -> putStr (unfilterComments x (if not (args ==[]) && head args == "-c" then judgeC else judgeCXX))))
- Comments: 0
- TrackBack (Close): -
どうでもよいけど微妙な驚き
Haskell の多倍長演算の中身は GMP だったのねと.GHC をコンパイルして初めて気づいた.ほんと,どうでもいいことだ…
- Comments: 0
- TrackBack (Close): -
とりあえず autoreconf -vfi で
- 2006-03-16 (Thu)
- プログラミング ソフトウェア ( Linux/coLinux )
- Comments: 0
- TrackBack (Close): -
OpenC++ のコンパイル
OpenC++Core だと Metaclass のロード部分が省略されてしまっているのでバッククォートを使った PTree の簡単な生成が出来ない.Metaclassをスタティックにリンクしてロード部分を自前で書いたうえで ClassWalker を変更すればどうにかできそうだがそれも面倒なので OpenC++ のコンパイルに再びチャレンジ.とりあえず CVS からとってこれなかったので snapshot で我慢するとして,試行錯誤の末にようやくコンパイルできた.
opencxx-20050912.tar.gz を展開後,configure スクリプトを作ってコンパイルするまでの流れ:改行コードを直して, AM_INIT_AUTOMAKE の引数を直してNEWS ファイルを作って(automake と libtools の古いファイルを消して(-f つけて上書きのほうがよいか)),libtools のファイルを生成して,スクリプト生成(aclocal; autoheader; automake -a; autoconf),コンパイル (./configure; make).
まあ,automake に --foreign つけたら NEWS がいらなかったり,そもそも bootstrap スクリプトを動かせ libtoolize 以下は自動でやってくれるのだが… というか,改行コードの修正後に bootstrap で呼び出す automake と libtoolize に -f つけるだけってのが一番楽か.最終的に,autoreconf -vif と実行するのが一番スマートだということに気づいた
とりあえず以下の環境で確認:(GNU automake) 1.9.6,(GNU Autoconf) 2.59,(GNU libtool) 1.5.22,gcc 3.3.5
自前でやるときのマンドは以下のとおり.
tar xfvz opencxx-20050912.tar.gz cd opencxx for fname in `find . -regex '.*\.\(am\|in\|m4\|sh\)'` bootstrap; do mv $fname $fname.old && (nkf --unix $fname.old > $fname); done mv configure.in configure.in.old && (sed -e 's/AM_INIT_AUTOMAKE($PACKAGE, $VERSION)/AM_INIT_AUTOMAKE($PACKAGE, $VERSION, no-define)/' configure.in.old > configure.in) mv opencxx/main-con.cc opencxx/main-con.cc.old && (sed -e 's/static char thisVersion\[\] = VERSION;/static char thisVersion\[\] = PACKAGE_VERSION;/' opencxx/main-con.cc.old > opencxx/main-con.cc) mv occ2.in occ2.in.old && (sed -e 's/\*\.cc|\*\.mc)/\*\.cc|\*\.mc|\*\.cpp)/' occ2.in.old > occ2.in) touch NEWS autoreconf -vif ./configure make
autoreconf を使わなくても以下のコマンドで代用できると.
#rm -Rf missing install-sh mkinstalldirs libltdl depcomp libtoolize --ltdl --copy -f aclocal autoheader automake -a --include-deps --copy -f autoconf
とりあえず,examples が動くかどうかを確認してうまくいけば次の仕事に移れるかも…
- Comments: 0
- TrackBack (Close): -
Libtool
- 2006-03-16 (Thu)
- プログラミング
適当に Web を眺めつつ libtool の使い方をとりあえず覚える.とにかく libtoolize で必要なファイルを生成しておいて AC_PROG_LIBTOOL を configure.in に書けばいいと.古いファイルの上書きに --force をつけて,サブディレクトリに libltdl を持ってくるために --ltdl をつけて,必要なファイルをリンクでなくコピーで持ってくるために --copy をつけときゃいいと.
ということで結局 libtoolize --ltdl --copy --force をして,このあとに aclocal; autoheader; automake -a; autoconf でいけばOKらしい.
- Comments: 0
- TrackBack (Close): -
Autotool
- 2006-03-16 (Thu)
- プログラミング
とりあえず,configure.in と Makefile.am を用意して aclocal; autoheader; automake -a; autoconf という流れでやればいいことは理解した.memo
configure.in とかの改行コードが CR+LF で引っかかったり AM_INIT_AUTOMAKE の書き方が古くて(?)怒られたりしたがどうにか configure の生成が出来た….次は Libtool だ,先は長い.
以下参考にしたところ.
http://www.h7.dion.ne.jp/~matsu/feature/automake/index.html
http://larse-gtk.hp.infoseek.co.jp/automake.html
http://home.catv.ne.jp/pp/ginoue/gnu/autoconf.html
http://www.ncfreak.com/research/magazine/No.004/autoconf.html
- Comments: 0
- TrackBack (Close): -
automake autoconf
- 2006-03-14 (Tue)
- プログラミング
使い方がよくわからない.configure スクリプトを生成できない.CVS snapshot からコンパイルできない.使い方本気で覚えようかなぁ?
- Comments: 0
- TrackBack (Close): -
OpenC++ Core
OpenC++ のパーサ部分(frontend)だけ欲しいと思っていたら丁度良く OpenC++Core なるものがあった.とりあえず普通にコンパイルできてテストのソースも読むことができてるので自前でパーサを作る必要が無くなって一安心.ただ,シェルスクリプトやテストの出力比較用ファイルが CR+LF の改行になっているのはいただけない… CVSから最新版を落とそうとしたらタイムアウトしたのも残念…
- Comments: 0
- TrackBack (Close): -
デバイスコンテキストの解放
- 2006-03-03 (Fri)
- プログラミング
1つのビットマップオブジェクトを同時に複数のデバイスコンテキストで選択することはできない.なので,複数のビットマップをサイクリックに BitBlt したいときに,毎回新しい(コンパチの)デバイスコンテキスト作ってから解放せずにほっとくと,次回からそのビットマップが描画できなくなる.このようなバグを埋め込んでしまった場合にそれを解決しようとする試みは人それぞれだと思うところだが,毎回新しくビットマップをロードしてハンドル作りまくるのはどうかと… これをやるとリソースか関係でむちゃくちゃになるのでとりあえず作ったものは解放しましょうと言いたい.
とは言え今後自分がはまらないとも限らんので記録として書いておくことにしよう.
- Comments: 0
- TrackBack (Close): -