カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
今回はデータベースのスキーマを見ます。タイトルに反してコードを全然読んでないですね。データ構造を把握しておくとモデルやコントローラのコードを読む助けになりますので、先に確認しておきます。
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
さて、図を見ると以下のようなモデル/テーブルが登場していることがわかります。
それぞれのモデル/テーブルの役割は LDR や Fastladder を使ったことがあるならすぐに分かりますね。Favicon のデータをデータベースに格納している、クロール結果もデータベースで管理している、ピンはユーザから多対一の関連を持つだけでフィードやアイテムと関連を持たない、あたりが興味深いですね。
画像はファイルで管理したくなりますが、favicon はサイズの上限も決まってますので予想外に膨れ上がるということもないのでしょう。数もブログごとに一つかなしかということを考えると記事に比べて消費するバイトはだいぶ少ないですね。
クロール状況をデータベースで持つかどうかは、
といった事を行うかどうかによります。バッチで実行して、エラーになっても放置か単にやりなおすだけというやり方もありえますが、クロール対象となるフィードの数が膨大になればそういう素朴なやり方は通用しなくなります。一回のバッチ実行ですべて終わらせるのは難しくなりますので、前回のクロールから十分に時間間隔があいたフィードだけ取得するのが効率が良いですし、何度もクロールに失敗した場合には対象から外すといった措置も必要になるでしょう。クローラのコードを読むときにはその辺が読みどころですね。
OpenFL の場合は関係ありませんが、広くネットユーザに公開しているサービスの場合、クロール記録があるとクロール間隔の制御に使えるだけでなく、「フィードを登録したのに全然更新されないがどうなってるんだ何が最速だ」といった問い合わせに対して「○○時○○分に確かにクロールしています。というかブログに記事が一件もないですが?」などと返答に利用できるわけです。記録がなかったら、「たぶんちゃんとクロールはしているはずですが、クロール対象が多くていつも高負荷なので遅れることがよくあります。ご不便をおかけしますがご了承ください」といった返答しかできません。これは困りますね。
また脇道にそれがちなので続きはまた今度に……次回こそコードを読もうと思います。
Freeciv を日本語でプレイすると「金%sを発見しました」などと悲しい表示になります。gettext の使い方が間違ってるんじゃない?ということでコードを直したくなるわけですが、C で書かれていますので、直してすぐ実行ということはできません。ということでビルドしてみることに。
gentoo には crossdev というパッケージがあり、クロスコンパイル環境を簡単に用意できます。詳細は Gentoo Linux Documentation -- Gentoo Cross Development Guide。
とりあえず、
# emerge crossdev # crossdev -t mingw32
と打てば OK です。mingw32-gcc などが出来るはずです。/usr/mingw32/ が mingw32 用の環境となります(インクルードファイルやライブラリなどを置く)。
zlib、libiconv、libpng が必要です。
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 $@
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 に対応しているので簡単です。
$ 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 をクロスコンパイルします。
$ 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 にしたほうがいいのかもしれません。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).