フォーチュンサモナーズ
«前の日記(2008-02-22) 最新 次の日記(2008-03-01)» 編集

Don'tStopMusic

2003|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|02|03|04|05|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|

カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年

知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。


2008-02-27

_ [rails][OpenFL] OpenFL ことオープンソース版 Fastladder のコードを読む その3 このエントリーを含むブックマーク

続きです。その1その2

今回はデータベースのスキーマを見ます。タイトルに反してコードを全然読んでないですね。データ構造を把握しておくとモデルやコントローラのコードを読む助けになりますので、先に確認しておきます。

db/schema.rb を眺めるのもいいのですが、テーブル間の関連を手っ取り早く把握するために図を作ります。図の生成には RailRoad を使います。まず、graphviz をインストールしておきます。RailRoad のインストールは gem で実施。

# gem install railroad

これで railroad コマンドがインストールされます。コマンドを実行する前にデータベースを migration しておきます(まだしてなければ)。

$ rake db:migrate

データベースが出来たら、railroad コマンドを実行。railroad コマンド自体は graphviz 用のグラフデータをテキストで出力しますので、それを graphviz のコマンドに食わせて画像データに変換します。

SVG にする場合は、

$ railroad -M | dot -Tsvg > models.svg

PNG の場合、

$ railroad -M | dot -Tpng > models.png

こんな具合の図が生成されます。
OpenFLのモデル

さて、図を見ると以下のようなモデル/テーブルが登場していることがわかります。

  • Member: 利用者
  • Pin: ピン
  • Folder: フィードのフォルダ
  • Feed: フィード
  • Subscription: フィードの購読
  • Item: 記事
  • CrawlStatus: クロール状況
  • Favicon: favicon

それぞれのモデル/テーブルの役割は LDR や Fastladder を使ったことがあるならすぐに分かりますね。Favicon のデータをデータベースに格納している、クロール結果もデータベースで管理している、ピンはユーザから多対一の関連を持つだけでフィードやアイテムと関連を持たない、あたりが興味深いですね。

画像はファイルで管理したくなりますが、favicon はサイズの上限も決まってますので予想外に膨れ上がるということもないのでしょう。数もブログごとに一つかなしかということを考えると記事に比べて消費するバイトはだいぶ少ないですね。

クロール状況をデータベースで持つかどうかは、

  • 実行制御: クロール間隔など
  • エラー制御: クロールに失敗した場合の対処
  • ロギング: いつクロールしたかを記録

といった事を行うかどうかによります。バッチで実行して、エラーになっても放置か単にやりなおすだけというやり方もありえますが、クロール対象となるフィードの数が膨大になればそういう素朴なやり方は通用しなくなります。一回のバッチ実行ですべて終わらせるのは難しくなりますので、前回のクロールから十分に時間間隔があいたフィードだけ取得するのが効率が良いですし、何度もクロールに失敗した場合には対象から外すといった措置も必要になるでしょう。クローラのコードを読むときにはその辺が読みどころですね。

OpenFL の場合は関係ありませんが、広くネットユーザに公開しているサービスの場合、クロール記録があるとクロール間隔の制御に使えるだけでなく、「フィードを登録したのに全然更新されないがどうなってるんだ何が最速だ」といった問い合わせに対して「○○時○○分に確かにクロールしています。というかブログに記事が一件もないですが?」などと返答に利用できるわけです。記録がなかったら、「たぶんちゃんとクロールはしているはずですが、クロール対象が多くていつも高負荷なので遅れることがよくあります。ご不便をおかけしますがご了承ください」といった返答しかできません。これは困りますね。

また脇道にそれがちなので続きはまた今度に……次回こそコードを読もうと思います。

_ [ゲーム] Windows 版 Freeciv を gentoo でクロスコンパイル このエントリーを含むブックマーク

Freeciv を日本語でプレイすると「金%sを発見しました」などと悲しい表示になります。gettext の使い方が間違ってるんじゃない?ということでコードを直したくなるわけですが、C で書かれていますので、直してすぐ実行ということはできません。ということでビルドしてみることに。

crossdev による mingw32 クロスコンパイル環境

gentoo には crossdev というパッケージがあり、クロスコンパイル環境を簡単に用意できます。詳細は Gentoo Linux Documentation -- Gentoo Cross Development Guide

とりあえず、

# emerge crossdev
# crossdev -t mingw32

と打てば OK です。mingw32-gcc などが出来るはずです。/usr/mingw32/ が mingw32 用の環境となります(インクルードファイルやライブラリなどを置く)。

freeciv が必要とするライブラリをインストール

zlib、libiconv、libpng が必要です。

zlib

emerge できればいいんですが、mingw 用にパッチ作って ebuild 改造して overray においてとやらないといけないっぽいので、手動でコンパイルしました。

# wget http://www.zlib.net/zlib-1.2.3.tar.gz
# tar fxz zlib-1.2.3.tar.gz
# cd zlib-1.2.3
# vi win32/Makefile.gcc # mingw32-gcc や mingw32-ar を使うように修正
# make -f win32/Makefile.gcc
# INCLUDE_PATH=/usr/mingw32/usr/include/ LIBRARY_PATH=/usr/mingw32/usr/lib/ make -f win32/Makefile.gcc install

makefile の修正はこんな感じです。

--- win32/Makefile.gcc.orig     2008-02-27 23:14:28.000000000 +0900
+++ win32/Makefile.gcc  2008-02-27 23:15:50.000000000 +0900
@@ -30,7 +30,7 @@
 #LOC = -DASMV
 #LOC = -DDEBUG -g
 
-CC = gcc
+CC = mingw32-gcc
 CFLAGS = $(LOC) -O3 -Wall
 
 AS = $(CC)
@@ -39,10 +39,10 @@
 LD = $(CC)
 LDFLAGS = $(LOC) -s
 
-AR = ar
+AR = mingw32-ar
 ARFLAGS = rcs
 
-RC = windres
+RC = mingw32-windres
 RCFLAGS = --define GCC_WINDRES
 
 CP = cp -fp
@@ -50,7 +50,7 @@
 INSTALL = $(CP)
 RM = rm -f
 
-prefix = /usr/local
+prefix = /usr/mingw32/usr
 exec_prefix = $(prefix)
 
 OBJS = adler32.o compress.o crc32.o deflate.o gzio.o infback.o \
@@ -79,7 +79,7 @@
 $(IMPLIB): $(SHAREDLIB)
 
 $(SHAREDLIB): win32/zlib.def $(OBJS) $(OBJA) zlibrc.o
-       dllwrap --driver-name $(CC) --def win32/zlib.def \
+       mingw32-dllwrap --driver-name $(CC) --def win32/zlib.def \
          --implib $(IMPLIB) -o $@ $(OBJS) $(OBJA) zlibrc.o
        strip $@
 

libiconv

Linux 用にビルドするにしても glibc 付属のではだめなようです。

$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
$ tar fxz libiconv-1.12.tar.gz
$ libiconv-1.12
$ ./configure --host=mingw32  --prefix=/usr/mingw32/usr/
$ make
# make install

これは configure が --host に対応しているので簡単です。

libpng

$ wget http://nchc.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.25.tar.bz2
$ tar fxj libpng-1.2.25.tar.bz2
$ cd libpng-1.2.25/
$ ./configure --host=mingw32  --prefix=/usr/mingw32/usr/
$ make
# make install

これも同様 host 指定だけでクロスコンパイルできます。

freeciv 2.1.3

いよいよ freeciv をクロスコンパイルします。

$ wget http://jaist.dl.sourceforge.net/sourceforge/freeci
v/freeciv-2.1.3.tar.bz2
$ tar fxj freeciv-2.1.3.tar.bz2
$ cd freeciv-2.1.3
$ vi client/gui-win32/happiness.c # typo ってるので
$ ./configure --host=mingw32 --with-included-gettext --enable-client=win32 --prefix=/home//freeciv 
$ make
$ make install

client/gui-win32/happiness.c の修正点は以下の通りです。

--- freeciv-2.1.3/client/gui-win32/happiness.c.orig  2008-01-23 20:19:09.000000000 +0900
+++ freeciv-2.1.3/client/gui-win32/happiness.c 2008-02-26 00:17:44.000000000 +0900
@@ -181,13 +181,13 @@
   repaint_happiness_box(dlg,hdc);
   ReleaseDC(dlg->win,hdc);
 
-  SetWindowText(pdialog->mod_label[CITIES],
+  SetWindowText(dlg->mod_label[CITIES],
                text_happiness_cities(dlg->pcity));
   SetWindowText(dlg->mod_label[LUXURIES],
                text_happiness_luxuries(dlg->pcity));
   SetWindowText(dlg->mod_label[BUILDINGS],
                text_happiness_buildings(dlg->pcity));
-  SetWindowText(pdialog->mod_label[UNITS],
+  SetWindowText(dlg->mod_label[UNITS],
                text_happiness_units(dlg->pcity));
   SetWindowText(dlg->mod_label[WONDERS],
                text_happiness_wonders(dlg->pcity));

host に加えて、--with-included-gettext をつけます。さらに -enable-client=win32 とクライアントに win32 を選択します。作ったバイナリを Windows に移動させて動かすのでインストール先はホームディレクトリの下にしておきます。

結果

無事 civclient.exe や civserver.exe がコンパイルできました。が、実行しても何も反応がなく終了します。うーん残念。修正が必要という時点であんまりケアされてないのではという懸念がありましたが。配布されている Windows 版が GTK+ 版なので client は gtk にしたほうがいいのかもしれません。

お名前:
E-mail:
コメント:
[]

最近のコメント:

  1. だて (02-23)
  2. fukuoka (02-22)

RSS
Creative Commons License
This work is licensed under a Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).