昔の最近の出来事(2007.01)

2007/01/31

気持ち遅めに帰着。

ちょろっとコーディングして眠くて死亡。

2007/01/30

気持ち早めに帰着。

TV見てたらいつの間にか寝てたり。
Cygwinのパッケージインストールしたりスナップショットをビルド したり。

cairoの使い方を探ったり。結局、cairoのソースアーカイブ内 にあるテスト用のコードが、全体の流儀を知るには一番良いという 結論だったり。なんとなく文字表示方法が判ってみたり。

2007/01/29

気持ち早めに帰着。

DUITのページを何気に眺めていたら、ソースツリーのビュワーが あるのに気づいたり。見てみた所、cairoを使った時計デモの ソースがつい最近コミットされており、また、cairoへのアタッチ ソースも存在しているようなので、これぁタイムリーだと ダウンロードしてみる事に。
最初、CVSか何かでダウンロードするものかと思ったら、 ソース一覧表示の下の方に、zipアーカイブで取り出すボタンが 付いており、それを押すと今のスナップショットが取れると いう仕掛けになってました。いや、便利なもんです。

OpenGL系ソースで存在しない関数を消す話と、DLLのロードパス やcairoのDLL名の変更を手で入れてビルドしてみたり。 そしてほどなく終了。ビルドできてみたり。そして、cairo を利用した時計アプリは次のような感じ。

DUIT_cairo_clock

JSTじゃなくてGMTになってますが、それはそれとして。

で、fedoraに持っていってコンパイルしてみたり。結果は これまでのDUITと同様、起動時にSegfaultでずっこけて立ち上がらず。

2007/01/28

朝普通に起きてみたり。

OpenGL窓に文字描画をする話。Win32APIのTextOut()と混在で 文字表示がうまくできない件で、 以前解決方法がイマイチ よく判らなかったのですが、GLUTのglutBitmapCharacter()実装を見てみると 他関数と深い繋がりがある感じではなかったので、glutBitmapCharacter() を使ってみたり。この関数を使いたい為だけにglutライブラリが必要 なのもイマイチな感じですが、まぁそれはそれとして。

DUIT_OpenGL_test2

何気にcairoの使い方を 探ってみたり。DUITにデモコードが入っているには入っているのですが、 全然何をする訳でも無いコードになってて参考にならなかったり。 とりあえずCで書かれたの時計のコードを見つけたので眺めてみたり。 それにしても、探し方が悪いせいか、firefoxのレンダリングエンジンに採用される 話は見つかったのですが、日本語で書かれたサンプルコードが 見当たらなかったり。まぁ、用途的に結構限られたところで使用される ライブラリなので、少ないだろうというのは予想できる所なのですが、 ほぼ皆無というのは思いもよらないところだったかも。

DUITの掲示板を眺めているとcairoを使ったテストコードへのリンク が張ってあったので、ダウンロードしてみたり。Cで書かれた時計のコード をDUITに移植した感じだったので、これぁ参考になるかもと、とりあえず makeしてみたり。ところが、エラーしてコンパイルできず。コード自体は 2006年の春ごろのコードみたいでしたが、そこから大分DUITの 構成自体が変わっている所によっているみたい。んー、参考コードを見た 感じ、OpenGLをGTKにアタッチするのにDUITのsrcglディレクトリ下のコード が使われているのですが、なんとなく、以前は cairoもOpenGLに似たGTKへの アタッチコードが用意されていた模様。

2007/01/27

昼前に起床。

TV観ながらぐうたら過ごしたり。

しつこくキーボードイベントの続き。ふと思いつきで、MainWindow に対してイベントハンドラを入れるのはどうか?と思ったり。 すると、この方法であれば、キーボードイベントを捕らえる事が できました。OpenGLの描画WidgetはMainWindowの子ウインドとして はめ込んでいる訳なのですが、キーイベントが子ウインドまで 伝わっていないという感じになるのかも。でも、MainWindowsで イベントを取ってしまうせいか、キーボードによる NoteBook(俗に言うタブ)やボタンの切り替えは効かなくなって みたり。階層をずらせばメニューバーのショートカットも効く ようなので、着目しているWidgetの一つ上の階層で取るといける のかなぁという感じ。まぁ、イベントを捕まえられさえすれば、 どうにかする方法はあるだろうという感じ。

fedoraの方でダメなのは結局追求せず。判らずじまいのまま。

そんな訳でテストコードを書いてみたり。GLUTやWin32APIでこなして いたレイヤーをDUITに差し替えてみた感じ。でも、何故か初回表示の アスペクト比が微妙に狂っていて悩んでみたり。調べた所 ウインド のリサイズイベントが発生した際、何故かウインド幅と高さに-1が 返る場合があり、それをgluPerspective()に食わせてしまった為に 変になっている事が判ったり。何故そういう事になってるのか 判りませんが、とりあえず変な値の場合は無視するというコードを 入れてみたり。

Macの新しいCM。いやいや、いくらWindowsでもXPならばそんな 勢いで再起動は必要にならんでしょう。まぁ Windowsとは言って ませんが。

2007/01/26

早くもなく遅くもなく。帰りに思いっきり雨が降っててぐったり。

猛烈に眠くなって早々に死亡。

2007/01/25

早くもなく遅くもなく。

先日ビルドしたlibglibを手で差し替えた所、不当命令でずっこけ なくはなったものの、別の関数でやっぱりsegfault。なんで? シンボルが付いていなかったので、関数の引数とかが判らず。 ステップ実行してもただ死ぬだけ(^^;もっかいビルドし直してみるか....

2007/01/24

気持ち早めに帰着。

デバッガでDUITの動きを追いかけて、GTK関数群の使われ方を 見るのはどうじゃろ?と思ったり。Cygwinのgdbだと何かとすぐに 固まるので、fedoraの方でやってみる事を考えたり。でも、 fedoraの方はそもそもDUITのデモプログラムがsegfaultで 起動できないという問題があり、まずはそちらを解決してみる 事にしたり。glibのthread初期化関数を実行しているようですが、 そこで何故かずっこけている模様。同じ関数をWindowsの方でも ブレークポイントを張ってみた所、こちらは停止する事無く 立ち上がってみたり。単純に問題の関数呼び出しをコメントアウト してみたのですが、そんなことでは解決せず(^^; うーむ。
デモプログラムのメインソースを見ると、Win32とそれ以外とで Duit.init()を使うかDUIT.initMultiThread()を使うかが切り替え られていて、Windowsは前者を使っていたり。でも、Thread初期化 の実行ありなしの違いしか無いので、試しにコメントアウトした時 と結局動きが変わらず。
Windowsのそれと動きが同じになってるハズという事で、Windowsでも 同じように止めながら進めてみようとした所、ちっとも ブレークがかからず。正確に言うと、Dソースのシンボルでは ブレークがかかるものの、glibやgtk系の関数シンボルは スルーしてしまう感じ。うむー、うまくいかないなぁ。

で、fedoraの方は次のような感じで、不当命令実行で死ぬ感じ。

 Program received signal SIGILL, Illegal instruction.
[Switching to Thread -1208268592 (LWP 8698)]
0x081adef4 in g_shell_unquote ()
(gdb) where
#0  0x081adef4 in g_shell_unquote ()
#1  0x4ef95105 in gtk_parse_args () from /usr/lib/libgtk-x11-2.0.so.0
#2  0x4ef951d4 in gtk_init_check () from /usr/lib/libgtk-x11-2.0.so.0
#3  0x4ef95214 in gtk_init () from /usr/lib/libgtk-x11-2.0.so.0
#4  0x080a1e8a in _D3gtk4Duit4Duit4initFAAaZv ()
#5  0x08096a93 in _Dmain ()
#6  0x0810fbce in _D9dgccmain211_d_run_mainUiPPaPUAAaZiZi2goMFZv ()
    at ../../../libphobos/internal/dgccmain2.d:83
#7  0x0810fcba in _d_run_main (argc=1, argv=0x1, main_func=0x1)
    at ../../../libphobos/internal/dgccmain2.d:93
#8  0x0810ec17 in main (argc=1, argv=0x1) at ../../../libphobos/internal/cmain.d:5
 

g_shell_unquote()を調べてみたらあまり変な事をする関数では無い らしい。んー?そういや 以前、コンパイルオプションに pentimu-mチューニングを入れると動かないpovrayの実行バイナリが生成 されたりしたのですが、もしやそれと同じ話があったりする?
そんな訳で、パッケージインストールされているglibと同じバージョン をビルドしてみたり。make check は通るっぽい。さて.....

2007/01/23

早くもなく遅くもなく。

しつこくキーイベント取得の続き。 Cベースの別の例でイベント発生でシグナルを飛ばす例を見たり。 やっぱりgtk_widget_set_events()を使ってイベントマスクを 上げれば良いように見えてみたり。で、Webを探ってみたところ、 GTKの1.2のドキュメントの中にウインドを実体化する前にイベント マスクをセットする必要がある事を見つけたり。確かに、 gtk_widget_show_all()した後でset_eventsを実行しても 無効になる事が判ったり。
という事を踏まえてDUITコードを色々書き換えてみるも反応 示さず。惨敗。

溜池観たり。自由すぎ(^^;

2007/01/22

早くもなく遅くもなく。

先日のキーイベント取得の続き。Cベースの例を順に見ていった 所、 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); という フォーカスフラグをセットするステップがあり、これの 有無でキーイベントが発生するか否かが変わるという事が 判りました。ことろが、このフラグセッターはマクロで実装 されていて、どこをどう設定してるのかを追いかけ切れなかったり。 CAN_FOCUSなどの文字列をキーに、DUITのソース内をgrepで 探ってみたのですが、イマイチ相当する操作を見つける事が できなかったり。

ひとまず、マウスモーション時のSHIFTキーやControlキーと同時押し はコールバック関数の第一引数となる GdkEventMotion* の メンバー変数 state に対して、 enum ModifierType でもって フラグ検査を行えば良いらしい。これはこれで収穫(^^;

2007/01/21

朝普通に起きてみるもぐうたら過ごして一日終了。

DUITでキーイベントを取得しようとしようとしたところ、何故か 反応せず。addOnKeyPress()でもって、イベントに反応させようと したのですが、イベント自体が発生していない予感。一応DUITの ソースにもデバッグコードを入れて反応を見てみたのですが、 イベント自体が発生していない感じ。マウスのボタンイベントと 同じようなコードなので、マウスボタンとキーボードとでは 違いが無いと思われるのですが.....

Webを探ってみた所、C言語ベースでGTKのキーイベントを取得する 例を見つけたのですが、g_signal_connect()を使うのと同時に、 gtk_widget_add_events() で反応するイベントを追加するような例 が載っていたり。それを元にもう一度DUITのコードを見てみると、 マウスボタンのaddOnでは addEvents(EventMask.BUTTON_PRESS_MASK) を使って起こるイベントを追加しているようでしたが、 キーボードの方にはそれがありませんでした。てっきりイベントは 勝手に発生するものなのかと思っていたのですが、そうでは無いのか? という訳で、 addEvents(EventMask.KEY_PRESS_MASK|EventMask.KEY_RELEASE_MASK); てな感じで足してみたりもしたのですが、やっぱり変わらず。 あれぇ?

2007/01/20

朝一瞬普通に起きてみるも、二度寝したら昼過ぎ。

マジシャンのセロの出てる番組(たぶん再放送)を見たり。 ハンバーガーをポスターから出したり食ったり戻したり、破れた 障子を直したり、いつ見ても、てゆーか、見る度に強力になって いるような気がしてなりません。

たまたまチャンネルザッピングしてて見た「美の巨人たち」。 平櫛田中(ひらくしでんちゅう)という木彫刻家の回でした。 TANEは別に彫刻芸術に詳しい訳でもなんでも無いのですが、 その造形をみるや思わず「スゲー」とTVに話しかけてしまいました(^^; CGを使って立体とか作っていると、あーだこーだといじりまわす事ができる ので、時間をかければそれなりの物は出来てしまうのですが、 木や石の場合「ぐりっ」っていっちゃうと元には 戻せない。木や石が彫刻で形になっているのは、それだけで凄い事だと 思う所なのですが、今回見た作品群は、なんかもうね、迫力が違うって 感じな訳です。是非一度、実物を見てみたいかもと思ってしまいました。

DUITでOpenGLを試したり。基本的な使い方はGLUTと似た感じに なっている様で、initGL(),drawGL(),resizeGL() と、他必要に応じて addOnほげほげ()でマウスなどのイベントを拾うという感じみたい。ふむー。

DUIT_OpenGL_test

povray 3.7beta19が出ていたので試してみたり。beta18での、レンダリング 終了後もcpu使いっぱなしになる不具合は直っているもよう。でも、 まだサポートされてない機能とかあるようなので、仕上がる絵は3.6とか とは違う場合がありますなぁ。

2007/01/19

久々に日付越え。

眠さに耐えられなくて、インターネットTVのバイファム見た後 すぐに死亡。

2007/01/18

気持ち遅めに帰着。

DUITでOpenGLを使うサンプルコードを眺めて終わり。

2007/01/17

早くもなく遅くもなく。

そういや、DUITって使っている人居るかしら?と思い、検索して みたところ、見事に日本語ページは出てこなかったり。最初 「duit gtk」で検索してみたのですが、出てこなかったので、 duitだけにすると、今度はやけにひっかかったり。英単語では なさそうなので、いくつかヒットしたページを見てみたところ、マレーシア語 で「お金」の事らしい。なんかやらしいなぁ。調べるんじゃなかった(^^;

2007/01/16

早くもなく遅くもなく。

Widgetを色々いじったり調べたりして終了。

2007/01/15

気持ち早めに帰着。

DUITいじり。スライダの値を動的に得る方法を習得したので、 それを使って実際に画像ウインドを変化させるコードを書いてみたり。 ところが、何故か画像の再描画がかからず。先日のテーブル再描画 と同じくshowALL()してみても変わらず。で、調べてみた所、 領域の無効化を行って、再描画イベントを発生させる必要があったり。 gtk_window_invalidate_rect()とかを使う例があったのですが、 DUITの場合はgtk_widget_queue_draw(GtkWidget*)を使用した queueDraw()というメソッドが実装されていたので、Pixbufの 内容をいじった後に、queueDraw()を実行してやる事で、再描画 が行われるようになりました。これでひとまず簡単な事をやらせる アプリは作れそうな予感。気のせいかも知れませんが(^^;

2007/01/14

AM中に起きてぐうたら過ごしたり。

DUITで遊んでいたり。DUIの実験コードを移行してみたのですが、 画像の表示で再ロードを行うと何故か画像表示されず。 一回目の表示はできている為、表示コードが間違っている という感じではないと思われ。デモコードの方でも再ロード時 の表示がうまく機能していない為、DUITの問題っぽい予感。 Image自体は再ロードしたファイルの情報を得られている為、 画像をはめているTableの動きに問題がありそうな予感。

もう少し調べてみたところ、 TableをshowAll()メソッド(基底クラスWidgetのメソッド)で明示的 に再表示指示をする必要があるっぽい。 一番最初はnewでTableインスタンスを割り当てるのですが、その時は どこかで表示されることが指示されているものと思われます。一方、 再ロードではテーブルを一度removeAll()でクリアした後、新しい Imageをテーブルにはめ込み直すという動きを行っていますが、 ここで明示的にshowAll()を使用して中身の表示を行う必要があるっぽい。 DUI時には特に何もしなくても再表示されていたのですが、 DUIとDUITの実装の違いまでは追跡できず。

DUITのページから 辿れる(公式?)掲示板を眺めてみたり。どうやってコンパイルすりゃ いいのか?とか、最初につまづく感じの質問とかが多くて、 実際にバグやら不具合やらを報告する感じのものはまだ無さげ。 てゆーか、恐らく作者以外に本気で使っている人はほとんど居ない というのが現状っぽい。まぁ、インプリに対する高級な話をされても ついていけないので(主に英語が読めないところによる)、まだ それくらいの方がTANE的には丁度良い所なのですが(^^;
どうやらDUITの作者さんはLinuxの方がメインで、Windows用の方が ポートっぽいらしい。そういえば、画像表示のサンプルで、 パスを含むファイル名の先頭が'/'(ルートからの絶対パス指定)でなければ、 カレントディレクトリのとあるディレクトリ名を足してファイルをロード するようなコードが入っているのですが、Windowsでは 絶対パス 指定が C: のドライブ名始まりだったりする為、うまく動作し なかったりするのはその為らしい。

掲示板を読んでいるとOpenGLコードも既に含まれているようなことが書かれて いたので、「あれ?そうなの?」と思い、アーカイブの中を見てみると、 srcglというディレクトリが別に用意してあり、その中にOpenGL関連コードが入っていたり。 てか、何故分かれてるの?
早速コンパイルを試してみたり。OpenGL系関数だけextern(Windows)宣言 する必要があるのと、一部Cygwinパッケージのw32api/{libopengl32.a,libglu32.a} には含まれていない関数があるのを削る必要がありましたが、デモコードは コンパイルできてみたり(原因が判るまで苦戦したのは秘密)。

2007/01/13

昼ごろ起床。TVなど観ながらぐうたら過ごしたり。

DUITの調査。WindowsでDLLローディングがうまくいかない件について 調べたり。そもそも何が失敗しているのかと言うと、 \Program Files\Common Files\GTK\2.0\bin\ から始まるパスからDLLをロードしようとしているのですが、そこには インストールされてなくて、別のパスにインストールしていました。 どこから\Program Files\....というパスが出てくるのかを調べた 所、src/lib/paths.dに固定パスで埋め込まれていた為、そこを とりあえず今インストールしてあるパスに書き換えてビルドし直した 所、うまくビルドした実行ファイルを起動する事ができました(^^)v。 Windowsの方はそれが原因だっただけのようですが、Fedoraでダメな 理由はイマイチよく判らず。

DUIと基本的な使い方は変わらないようですが、DUIのビルドはdoolと いう外付けライブラリが必要だったのが、DUITでは外付けライブラリ 不要になっていて、依存性が無い点などは良いかも。 まだOpenGLの方はソースが足りなくてビルドできないようですが、 DUIの方で(少し手を入れる必要がありましたが基本的には)使えて いたので、普通に使えるようになるのも時間の問題かなぁと思われ ます。

DUITを使ってみたり。マウスのドラッグなんかは addOnDragMotion() てのが追加されていたりするので、それを使えば解決...... と思ったのですが、どうにも反応していないような。
ソースを眺めてみたのですが、そもそもイベントがどのように してボタンやスライダーに伝わるのかがよく判らなかったので調べたり。 生のGTK(正確にはGTK2ではglib)でsignalに反応させる場合、

gulong g_signal_connect( gpointer      *object,
                         const gchar   *name,
                         GCallback     func,
                         gpointer      func_data );

でどのオブジェクト(object)にイベントが発生した時、コールバック関数 (func)を実行する、という感じで設定しておき、コールバック関数に やりたい動作を書きます。オブジェクト(object)に対してどのイベント を対応させるかは シグナル名(name)で指定し、それらはGTKのヘッダで 定義されている模様。で、DUITを見てみると、どうもシグナル名が 間違えているような予感。例えば drag_begin が drag-beginてな感じで アンダーバーであるべき所がハイフンになってたり。で、ボタンクリック 場合は clicked てな感じでアンダーバーを含まないのでたまたま合っている という予感が。で、ちょっといじってみたけどやっぱり変化無し。 うーむ?
実は、やりたかった事は、「スライダーの変化を動的に得る操作」 だった訳ですが、DUIの時にはその方法が判らず、マウスのモーションイベント を捕らえる事で代用するのか?と考えた訳なのです。しかし、DUITでは Scaleクラスの基底クラスであるところのRangeクラス に、addOnValueChanged()というメソッドが追加されていたので、 それを使えばスライダーに変化があった時にイベントが発生し、 動的に値を得られる事が判ったり。まぁ、ひとまずはこれで良いか。

2007/01/12

気持ち早めに帰着。

RubyでもGTK+を使用する事ができるという事で、少し実装を探ってみたり。 あまり高度にラップしている感じでは無さげ。シグナル設定もsignal_connect() を使って行うみたい。

で、DUIでのイベント処理をよく見たり。その結果、addOnほげほげ() というメソッドが用意されており、ほげほげの部分がイベント種類によって 各種用意されているという事が判りました。マウスのクリックやモーション などのイベントで反応したければ、addOnClick()やaddOnMotionNotify() にコールバック関数を引数として指定するという感じ。signal_connect() を使うよりも生っぽくない感じがするので、DUIの実装の方が個人的には 好みかも。

で、ドラッグにはどうやって反応すれば良いの?と思ってソースを眺めて みたところ、未実装っぽくも見えるのですが、サンプルコードでは マウスドラッグで絵を描く事ができていたので、応用の範囲内っぽい。

そんな訳で、DUIの正式版となるDUITのpre-releaseをダウンロードして みたり。ビルドの手段が良くわからなかったので、gdmdを使って スクリプトでビルドしてみたり。とりあえずエラー無くリンクできたものの、 DLLのローディングがうまくできなくて終了。外部関数呼び出し(ローディング) に技が使われているっぽい。
Windowsはダメだったので、Fedoraでビルドしてみたり。リンクはうまく できるものの、やっぱりライブラリのローディングで失敗したり。むぅ。

2007/01/11

遅めに帰着。

んー、signalの通知方法がよく判らず。

2007/01/10

早めに帰着。

そういや、pkg-config を使ってGTKが使用するライブラリやらヘッダ ファイルやらを自動的に検査してリンクするようなMakefileを 書いていたのですが、ある日を境に突然うまく動かなくなって 謎に思っていました。久しぶりにCygwinのMailingListを 眺めてみると、CR/LF問題と称した改行コード問題というのが あるらしく、もしやそれか?と調べてみたところ、どうやら ビンゴっぽい模様。

$ pkg-config --cflags gtk+-2.0 | dump | tail -1
00000140  6c75 6465 2020 0d0a                     lude  ..
                         ^^^^
この為、

$ gcc -o sample.exe sample.o -mno-cygwin -Wl,--subsystem,windows `/gtk/bin/pkg-config --libs gtk+-2.0`
: No such file or directory
てな感じで、エラーして動作せずとなってました。
結局、SHELLOPTという環境変数にigncrというキーワードが入って いれば良いらしいのですが、SHELLOPTはread_onlyな為設定が できず。そもそもMAKE_MODE=unixとなってる時点でUNIX改行コード モードで動作しているハズなのですが、それが無視されている のが問題のような?

もう少しよく調べてみたところ、pkg-config はCygwinパッケージ のではなく、GTKのWindowsポートに入っていたバイナリを実行していたり。 Windowsポートの為、出力がCRLFを返していたというのが真相らしい。 Cygwinパッケージのpkg-configで実行すると、CRLF改行コードには なっていない模様。むー。で、Cygwinパッケージのpkg-configを 使えないかと思った所、実行結果が微妙に違うようで、イマイチ 使えず。ちぇっ。

Pixbufの中身を調べたりいじったりする方法を探ったり、 スライダー(GTKではScale)の値を得る方法を探ったり。スライダー の方が意外と盲点で、スライダーを出してマウスで触れますよって 例はあるのですが、実際にスライダーの値を知る方法がすぐに 判らなくて悩んだり。Adjustの派生クラスの一つがスライダークラスで あるHScaleやVScaleで、現在値はAdjustの中に入っているという 感じらしい。Pixbufの方はWidth以外にrowstrideという実データ幅 というのがあるのですが、Pixbufのコードにrowstrideを得るメソッドが まだ実装されてなくて、それに気づくのにしばらく時間がかかったり。 rowstrideはBMPフォーマットの様に4バイト境界にアライメント されていて、bpp=3byteで Widthの値によっては Width*bpp!=rowstride の場合に思い通りのチャンネルをいじってない事になったり して、すっぽりとハマってました(^^;

2007/01/09

気持ち遅めに帰着。

GTKのマニュアルを眺めたり。2.0系は意外と日本語化されてなくて、 これって情報が得られず。GLIBが想像以上に複雑な事をやっている のを初めて知ってへぇと思ったり。

2007/01/08

昼過ぎ起床。ぐうたら過ごして一日終了。

暇つぶしで観ているインターネットTVのじゃりン子チエですが、 ヒラメちゃんの出てくるのってこんなに後の方だったっけ? と思ったり。

GTKのpixbufのマニュアルを眺めたりコードを調べたり。 特に生産物は無く。

2007/01/07

AM中に起床。

テストコードをいじりながらDUIの反応を見たり。 utf-8ならメニューに日本語使えるなぁとか。メニューはJavaなんかと 同じくボタンクラスを作って配置してとかそんな感じなのですが、 パッキングで勝手にレイアウトするので適当に並べてもそれなりに 配置されたりとか。 FOX toolkit とか非常に良くできているツールキットは存在するのですが、 C++で書かれているのがDでのラップを困難にしている理由だったりする のは寂しいところ。C++のクラスをDでもそのまま利用できると、 かっこいいのですがそれはそれとして。 まぁ結局の所、言語でもコンパイラでもなくて、ライブラリが 使いものになるか否かで用事になるかどうかが決まるというだけ なのかも知れません。まぁいいや。

で、Windowsだと画像表示テストで正しく表示できなかったりしたのですが、 UNIX系とWindowsとのファイルパス表現の違いからくるものだったり。 DUIでは画像を扱うクラスは JavaのImageクラスっぽい感じで実装されて いるのですが、直接ピクセルを扱う為のメソッドは実装されていなかった ので追加してみたり。互換性を考えるなら継承して機能追加する べきなのですが、gtkのラップを必要とする分については、やっぱり DUIのクラスに直接メソッド追加する方が良いんだろうなぁとか、 ごちゃごちゃといじりまわしたり。

2007/01/06

AM中に起床。もう普通の土曜日という感じ。

gdc-0.21をビルドしてみたり。cygwinビルドはエラー無く通った のですが、mingwビルドがconfigureオプションを変えたせいか なかなか通らず。

fedoraの方は、例の /usr/lib/libstdc++.so.6 シンボリックリンク問題がyumのアップデートのせいかまた元に 戻っていましたが、それ意外はエラー無く通り、いくつかテストコードの コンパイルも問題無し。

mingwビルドの方は事前の仕込みが足りないだけでした。てへっ。 以下mingwビルドを行うための事前仕込みのメモ。これまでの 積み重ねがありますので、クリーンな状態から始めると少し手順 が足りなかったりするやも知れません。

  1. configure で --prefix=/usr/local/gdc021 を指定するものとしたとき、
  2. mkdir /usr/local/gdc021
    mkdir /usr/local/gdc021/i686-pc-mingw32
  3. mkdir /usr/local/gdc021/i686-pc-mingw32/bin
    cd /usr/local/gdc021/i686-pc-mingw32/bin
    ln -s /usr/bin/ar.exe .
    ln -s /usr/bin/as.exe .
    ln -s /usr/bin/ld.exe .
    ln -s /usr/bin/nm.exe .
    ln -s /usr/bin/ranlib.exe .
    ln -s /usr/bin/strip.exe .
  4. mkdir /usr/local/gdc021/i686-pc-mingw32/sys-include
    cd /usr/local/gdc021/i686-pc-mingw32/sys-include
    cp -r /usr/include/w32api/* .
  5. mkdir /usr/local/gdc021/i686-pc-mingw32/include
    cd /usr/local/gdc021/i686-pc-mingw32/include
    cp -r /usr/include/mingw/* .
  6. mkdir /usr/local/gdc021/i686-pc-mingw32/lib
    cd /usr/local/gdc021/i686-pc-mingw32/lib
    cp -r /usr/lib/mingw/* .

prefix指定のパスにビルドの為の道具が揃っていないので、コピーして事前に 環境を整えておくという感じ。もちろんコピーではなくて全てシンボリック リンクにしても良いかも知れませんが、その場合libphobosは常に 最新に上書きされてしまいますので、多数のバージョンを保持する 為にコピーで持っているという感じです。これで、
../configure   --prefix=/usr/local/gdc021 --target=i686-pc-mingw32 --with-gnu-ld \
--with-gnu-as --enable-threads --disable-win32-registry --disable-shared \
--enable-sjlj-exceptions --disable-nls --enable-languages=c,c++,d

てな感じでconfigure実行してmake。今度は大丈夫でした。
手持ちソースをコンパイルしてみて特に問題無さそう。 でも、DUIのテストコードの方はやっぱりダメっぽい。

で、DUIのテストコードを見てみたり。エラーメッセージを頼りに Tree表示系が怪しいという感じでコメントアウトしながら反応する 箇所を調べた所、TreeView1 ってのを実行しなければずっこけなかったり。 Fedoraの方で同じのをもう一度確認してみたところ、Segfaultでずっこけはしないものの、 タブを選んでも何も表示されていなかったり。たまたまずっこけないだけ っぽい。そこを外せば概ねOKそう。

DUI_tests.png

イメージが表示されるかどうかはシステムに依存するみたい。 そもそもイメージがどこに入っているのかも良くわからなかったり する訳ですが。

で、やっとそれっぽく使える雰囲気が出てきた所で、 DUIのページを見に行って みると、DMD 1.00 用にアップデートする為、サイト自体も改装中に なっていたり。結構がんばったのに。ちぇっ。でも、正式に直してもらえると 色々と都合が良いので、ウォッチを続けてみようと思ったところ。

DUIアーカイブに含まれていたOpenGLのテストコードをコンパイルしてみたり。 こちらはgl系関数をextern(Windows)宣言しなくてはなりませんでしたが、 リンクに成功し実行もできてみたり。でも、コードがプラットフォーム依存に なってしまうので、extern(Windows)宣言無しでリンクする方法って 本当に無いのかなぁ?と思ったり。

そういや少し前にビデオドライバを最新と思われるものに入れ替えていたの ですが、何気にWingsを立ち上げた所、多ポリゴンモデルの表示が激重に なってたり。シェーディングを効かせると軽くなったりしたので、 PolygonOffsetに関連した性能劣化が起こっていると推測しました。 ドライバを古いのに差し替えると元通りの表示性能に戻ったり。 うっかりすると「このビデオカード遅っせー」と、あらぬ誤解を招く 可能性がありそう。新しい方が良くないというのはよくある事では あるのですが、ここまでひどいのはありえないなぁと思ったり。

2007/01/05

気持ち早めに帰着。

先日の続き。_utf8付き関数へ書き換え。そしてDUIアーカイブに 含まれるテストコードをコンパイル&リンクできたものの、アクセス 違反で死亡。むー。

いわゆるハローワールドレベルでウインド自体を開く事ができる のかをテストしてみたり。唯一見つけたWebページのコードを 参考に次のようなコードを書いてみたり。

private import dui.DUI;
private import dui.Label;
private import dui.MainWindow;

class HelloWorld : MainWindow
{
    this()
    {
        super("Start GUI Programing");
        add(new Label("こんにちはDUI"));
        setSizeRequest(150,20);
        show();
    }   
}

void main(char [][]args)
{
    DUI dui = DUI.dui(args); 
    new HelloWorld();
    dui.go();                   
}

どうにかウインドだけは開く事ができたり。

こんにちはDUI

どこまでちゃんとしているかはこれから使ってみて判るという 所かも。

Fedoraでもビルドしてみたり。version(linux)時のコードを少し 直す必要がありましたが、基本的にはWindowsで直したコード でOKそう。でも、gtkの一部の関数を_utf8付きに直したのに、それだと Fedoraの方ではリンクできず、再び_utf8無しコード に戻す必要がありました(T_T)。むー、なんでだ? でも、DUIに含まれているテストプログラムが一応起動できてみたり。 一部起動時にワーニングが出たりするようですが、それとなくOKそうな予感。

DUI_tests.png

特に何も設定していないのですが、日本語表示が勝手にされるようです。

ふぅ、と一息ついたら、DMD 1.00 ベースのgdc-0.21が リリースされていた りしてずっこけてみる。

2007/01/04

仕事始め。早めに帰着。

DUIを直したり。やっとエラーを取る事ができたり。importの順番とか が微妙に影響するようになったり、import のデフォルトがprivateに 変更になったりした事が影響していた模様。
で、肝心のテストプログラムのリンクは失敗。一つは、doolという 外付けのライブラリが必要なのですが、それも完全にコンパイルできる 必要がある点、もう一つはgtkの関数がリンクできず。後者はOpenGLの それと同じ理由だと思われるので、extern(Windows)で解決しそう な見込みなのですが、前者のdoolというライブラリのコンパイルで つっかかりまくり。
そもそも、以前よりversion()文で指定できる定義済みバージョン識別子 の一覧を得る事ができない為、どれでも無い場合を踏んでしまって 関数が見つからないという感じになっているのですが、具体的に どう直せば良いのかが判らず。そんな訳で、次のようなしょーもない テストコードで調べてみたり。

$ cat main.d 
import std.c.stdlib ;
import std.c.stdio ;

int main()
{
    version(linux)  { printf("I am linux\n"  ) ; }
    version(Windows){ printf("I am Windows\n") ; }
    version(Win32)  { printf("I am Win32\n"  ) ; }
    version(GNU)    { printf("I am GNU\n"    ) ; }
    version(Unix)   { printf("I am Unix\n"   ) ; }

    return(0) ;
}

$ gdc main.d 

$ ./a.exe 
I am GNU
I am Unix

$ gdc -mno-cygwin main.d

$ ./a.exe 
I am Windows
I am Win32
I am GNU

Cygwin上ではこんな感じ。自分で管理しきれないものを取り込む場合は -mno-cygwinでビルドするのが良さげという事に今頃気づいてみたり。 因みにLinux上では次のような感じ。

$ gdc main.d
$ ./a.out
I am linux
I am GNU
I am Unix

Linuxへのポートはきっとあまり問題が起きない予感がします。

SQL関係でエラーするも定義自体がどこにも見当たらなくて、どうせ使わない から省いてしまって、どうにかdoolのライブラリコンパイル ができたり。で、gtk関数のextern(Windows)宣言.....って、これやると Windows用コードにしかならないのですが(これは主にgdcの問題と思われ)、 どうにかならんかなぁ......

ちょっと書き換えてリンクを試してみるも失敗。gtkの lib*.dll.a を objdumpで逆アセンブルして調べてみると、extern(C) のままでリンクできそう な予感だったので、試しに lib*.dll.a をリンクしてみると、書き換えなくても 大丈夫そうだったり。でもやっぱりリンク失敗。一部の関数が utf8対応 されているようで、aliasするか _utf8 という文字列を最後に加えた関数に 書き換えるかする必要がある模様。もう一息か?

2007/01/03

昼過ぎ起床。

DUIという GTKのラッパーモジュールをダウンロードしたままほったらかし にしていたのを思い出したので、触ってみる事にしたり。 でも、コンパイルが通らない所から始まる罠。
いくつか廃止となった記述を使用している為それを直してみたものの、 もう一つ別のライブラリが必要と判ってそれをダウンロード。同じく 記述修正をしてみたりするものの、こちらもエラーしまくり。むー。
新たな発見として、versionコントロールに変数の様に代入できる 事を知りました。次のような感じ。

version(linux)
{
        version=CommonUnix;
}
version(Unix)
{
        version=CommonUnix;
}
:
        version (CommonUnix)
        {
           :
        }


以前、version文内に 式が書けないという事を書いたのですが、前述の方法で直接的では ありませんが、間接的にバージョンコントロールができるようです。 ただ、影響範囲がどこまであるのかはよく判らず。影響範囲が 広すぎると、おかしな事になるやも知れません。また、あまり広い 範囲に適用するよりは、一つのモジュール内とか見渡せる 範囲内で使用するのが、混乱を避ける為にも良さそうな感じがします。

簡単なHelloWorldくらいはなんとかならないかとgtkのヘッダを 変換ツールhtodで変換してみたり。でも、エラーしまくりであえなく 撃沈。てゆーか、プリプロセスして28000行あるってどうよ?(>gtk/gtk.h)

結局DUIを直してみたり。でも、templateを使ったエラーをどうしても 修正する事ができず。てゆーか、templateを使った事が無いので まずい部分がよく判らず。

2007/01/02

昼過ぎ起床。

で、先日のUSB-SCSI変換機を探してみる事に。近所のPC屋を 見てみたのですが、当然のように置いていなかった為、秋葉まで 繰り出してみたり。で、思いっきり探し回るも、まず「SCSI」と いう単語自体が出てこない。で、やっとこその変換機を見つけて みるも、あまり安く無い(ほぼ定価売りで7000円也)。UltraSCSIの PCIボードの方が安かったりする罠。あと、どうしてもアンフェノール -ピンタイプの変換コネクタを見つける事ができず(まだ休業の店が多かった のもあるのですが)。最後の頼みとMac向けのサプライ品置き場を 見たところ、やっとそれらしい変換器を見つけたのですが、 次のような感じで形状が合わず。


    ┌─┐    ┌─┐    ┌─┐          ┌─┐
    │  │    │  │    │  │          │  │
    │  └──┘  │    │  │          │  │
    │  ┌──┐  │    │  ├─────┤  │→スキャナ
    │  │    │  │    │  │          │  │
    └─┘    └─┘    └─┘          └─┘
   ピン50♀   AH50♂    AH50♂           AFull
  │                │  │                  │
  └見つけた変換器─┘  └スキャナ側ケーブル┘

   AH50 :アンフェノールハーフピッチ50pin
   AFull:アンフェノールフルピッチ

つまるところ、アンフェノールハーフ側は♂しか無いので、直接 ピン50の方に変換する事ができず。この状態でも唯一繋ぐ方法と して、AH50♀を持つSCSIのハードディスクなどを間に挟んで、 デイジーチェーンにすれば良いのですが、スキャナを繋ぐ為にそこまでする のはありえないなぁと思ったり。それにしても、SCSI2までは アンフェノールのハーフピッチって普通の存在だったのに、ここまで 駆逐されているとは思いませんでした。
結局惨敗。腹いせにIntuos3でも買ってやろうかと思ったらそれも 売ってなくて更にしょんぼり。

疲れ果てて帰ってみたり。で、もう一度、今回のスキャナ接続に かかる費用を少し計算しなおしてみたり。Ultra-SCSIのボードが 約4000円、SCSI形状変換が安くても2000円くらい、そしてボードと 変換器を繋ぐSCSIケーブルが2000円弱で、合計8000円也。 えーと、2400DPIのA4フラットベッドのスキャナであれば、 それくらいの値段で新品が買えるらしい........終了。 USB-SCSI変換自体が2000円くらいで済むか、SCSIカードが1000円 くらいで売ってれば、まだ分があるところなのですが、世の中 うまくいかないもんですなぁ。

2007/01/01

明けましておめでとうございます。今年もよろしくお願いします。

そういや年越しカウントダウンを見ていて、日テレだけカウントダウンする 事無く淡々とガキ使のスペシャルやっていたのが新鮮だったり。

ちょっこりボリュームレンダリングについて調べたりTVを観たりしながら ぐうたら過ごしたり。

ベンチマークプログラムである所の3DMark6を入れてみたり。表示解像度が 変えられないという所はあるのですが、大体どのベンチマークも1fps以下と いう感じで全く勝負になっていないという結果でした(^^; オンラインに繋がないとスコアが見れないのがイマイチでしたが、 スコアは459でした。相当遅い方です。因みにfastestは13046....って どないやねん(^^; fastestシステムはCPUはQuadCoreの2.66GHz、 ビデオはATI RADEON X1950 CrossFire Edition というやつらしい。 3GHzのPentium4と比べてもCPUだけでは3倍がせいぜいだと思いますので、 残りはビデオで稼いでいるのだろうなぁと推測します。 それにしても、グラフィックカードの性能だけでこれを60fpsにできるの? という所の方に驚きを感じたりします。逆に、ベンチマークを除けば、 ビデオをこれだけ使うアプリはゲームくらいしか無い訳で、あればある だけ性能を使う唯一の用途なのかも。
で、システムの詳細を見てみると、非常に細かな情報が採取されていて驚きました。 その中で、以前、真のプロセッサ数の区別 はできるのか?という事を書いたのですが、3DMarkの結果を見てみると、 PhysicalProcessors×1とLogicalProcessors×2という形で表示されており、 ハイパースレッドとDualコアの区別が付くような表示になってました。 他にもメモリの物理的な実装(どのスロットにどういう容量のDIMMが載っているか まで表示できている)や、ビデオドライバのバージョン、現在起動中の プロセスやなど、ベンチマーク実行時の情報がことこまかく表示されてました。 これだけ情報が細かければ、例えばアプリが落ちる時の環境の情報表示としても 十分な感じがするので、デバッグ情報としても有効に利用できる感じが しました。

何気にWebを眺めていたら、USB-SCSI変換するアダプタの存在を 知りました。で、それを使ってエプソンのスキャナであるところの GT-5000WINSを接続して使う事ができるらしいという情報を得てみました。 X68kに接続して使っていたスキャナですが、PCの方にはSCSIボードを 搭載しなかったので、X68kをしまいこんだのと同時にスキャナも しまいっぱなしになっていました。そういうのがあるのならば、 折角なので使えるようにしてみようかと思った次第。で、更に調べて みたところ、変換自体は良いのですが、SCSIコネクタがピンタイプになる ようで、アンフェノール(セントロニクスとも言うらしい)にするのに もう一段変換が必要臭い。明日探してみるか....


TOP PREV