カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
文字列を表すときには、シングルクォートとダブルクォートがあり、それぞれ機能が異なりますが、どちらでも良い場合はどちらを使っていますか? 最初は違いを知らず、シングルクォートのみを使っていましたが、うまく動作しない場合があり、適当に(^^;ダブルクォートを使っていました。今後慣れていくにあたって、どちらを使う癖をつけておいたほうが良いなどはあるのでしょうか?
[ruby-list:44590] ' との " 使い分け
前田さんのRubyコーディング規約には、
文字列リテラルには基本的に"..."を使用する。ただし、特殊文字を解釈させたくない場合のみ、'...'を使用する。また、原則的にヒアドキュメントは使用しない。
Rubyコーディング規約:文字列リテラル
とあります。
この辺の書き方は人によって流儀がありそうです。私の場合は、
というように使い分けています。「それ以外」はダブルクォートでもいいのですけどね。
まず、単に固定を文字列を出力するだけなら、puts が改行も出力してくれるので、以下のようにシングルクォートにしています。
puts 'wait a moment...'
処理結果を出力するときには変数が混じるのでダブルクォート。
num_errors = count_errors
puts "errors:\t#{num_errors}"
これは以下のようにも書けますが、文字列の結合を多用すると読みにくいので、なるべく式展開を使うようにしています。
puts "errors:\t" + num_errors.to_s
禁則処理のように文字列を文字単位でアルゴリズムに則って処理するならば + を使った方が読みやすくなると思いますが、処理結果を出力するくらいであれば式展開の方が出力されるメッセージに近い見た目になるのでいいですね。
長い文章を扱うときにはヒアドキュメントを使います。画面に出力する文字列だとコマンドの usage くらいにしか使ったことありませんが。あとは eruby のテンプレートを別ファイルにせずにスクリプトに埋め込むときくらいですかね。
def usage
puts <<-_USAGE_
usage: #{$0} -foo foo -bar bar file, [file...]
This program...
-foo ...
-bar ...
_USAGE_
end
文字列中にシングルクォートやダブルクォートが含まれる場合には、% 記法を使ってます。HTML/XML タグを直接書く場合など。
image_tag = %Q!<img src="#{url}" />!
世間に氾濫するトンデモ科学報道。センセーショナリズム、記者の思い込み、捏造、それを利用する企業や市民団体…。メディア・バイアスの構造を解き明かし、科学情報の真贋の見極め方、リスク評価の視点を解説する。
メディアのあり方や食について興味のある方はぜひ一読してほしい一冊です。著者は元毎日新聞記者で現在フリーのサイエンスライターをしている松永和紀さん。
内容は多岐に渡っていますので、ここで部分的に紹介はせず、各章の見出しだけ記載します。新聞やテレビの報道がいかに偏っており事実の一部の側面だけを過剰に取り上げているのか、実際のさまざまな事例を挙げて実態を明らかにしています。
この問題を解決するには、新聞やテレビが正しい報道をし、消費者が科学的な素養とメディアリテラシーを学んで情報の真偽を見極める目を持つことしかありませんが、どちらも難しそうですね。新聞やテレビには期待できないので、後者の方がまだ芽があるかもしれません。
メディア・バイアス あやしい健康情報とニセ科学 (光文社新書 (298))(松永 和紀)
私は冬場には手足をはじめとしてあちこちが痒くなる乾燥肌です。が、顔も乾燥しているはずなのに鼻や額だけは脂ぎっているという状態でした。つまり、眉間や頬は乾燥していて荒れているのに鼻や額はテカテカしているという。あと、ニキビは思春期だけできるものだと子供の頃は思ってたのですが、大人になってもできるもんなんですよね。呼び方が変わるだけで。
妻の薦めで顔のお手入れをするようにしてから顔の乾燥については改善しました。ニキビもできにくくなってるかと。
で、お手入れですが、洗顔後に化粧水と乳液をつけるようにしてます。七面倒だしお金もかかるしという印象がありますが、そう手間もかからないしお金もかかっていません。
化粧水はぴたぴたと手のひらで軽く叩きながら、乳液は刷り込むような感じにしています。まあ、実際のところ最初は面倒ですが、洗顔の手順の一部として習慣化してしまえば、そこまで億劫ではありませんね。
さて、使ってる化粧水と乳液ですが、別に DHC が出しているようなメンズ用の化粧品は使ってません(今調べたらそもそも DHC の男性向けのは化粧水や乳液が存在してないですね←追記)ローション=化粧水、ジェル=乳液相当とのこと)。では何を使っているかというと、100 円ショップとしておなじみのダイソーの「酒しずく」です。それぞれ100 円合計 200 円。これで 1 月は持ちます。酒しずくは All About に写真があります。「酒のしずく」という似た名前の商品もありますが、「の」が入らない方です。
そもそも何もお手入れをしてなかったわけで、100 円ショップの化粧水や乳液でも十分効果がありますね。顔の肌荒れや乾燥が気になる男性諸氏は一度(というか一週間くらい)お試しください。
お手入れしてるのは顔だけなので、脚は依然として乾燥して痒くなります。ひどいと寝ている間に掻きむしっていて、朝起きると爪に血が……ということも。こっちも対策しようということで、ここんところはコーワのケラチナミンを愛用してます。塗るとすぐに痒みが治まるし、長くて数日で乾燥して荒れた肌も滑らかになるしで医薬品なだけあります。こっちは結構高いのですけどね。ドラッグストアで買ってますが、Amazon でも買える模様。しかし Amazon は何でも売ってますね。
Ruby/LibGTop2 は GNOME の libgtop ライブラリ のバージョン 2.x への Ruby バインディングです。
今回は単なるメンテナンスリリースです。libgtop の 2.14.8 から 2.21.5 までの差分を確認して変更点を反映させました。Linux でしか動作は確認してませんけども……
届きました(先週末に)。これで私も Ruby Association Certified Ruby Programmer Silver です。長いですね。
認定証は出雲和紙で出来ているそうで、写真じゃわかりにくいですが趣のある風合いになっています。
いつの間にか更新されていたRuby技術者認定試験案内ページによれば、今年の10月にゴールド、来年の 4 月にプラチナの試験が開始される予定のようです。いずれ Rails 版も出来たりするのでしょうかね。Ruby Association Certified Rails Web Developer とかなんとか。
というのを昔書いたことがあります。結局使っていませんが。せっかくなので晒しておきます。RubyHostingPolicy
今読み返して思いましたが、実際に提供するとしたらマイナーバージョンアップはなるべく避けた方が無難ですね。現状動作している CGI が動かなくなるリスクの方が、バージョンアップするメリットよりも大きいからです。また、需要のある CGI プログラムであれば、そのプログラムの提供者側がユーザからの要望に応じて古いバージョンの環境でも動作するようにしてくれる可能性が高いのではないかと。
しかし、世のホスティング(共用サーバ)はどういう風にしているんでしょうね。
Beta 2 から使っています。Beta 3 が出たので更新しました。次は RC ですかね。Firefox 3 に関するリンクを挙げておきます。
「鍵穴」と呼ばれている戻るボタンが強調された新テーマは見た目がいまいちしっくりきません。他に気になるところはないですね。いきなり落ちるようなこともなく、ベータの割りに安定していると思います。
Gecko のバージョンがあがったためか、Firefox 2 よりもレンダリングは速くなっていると思います。Javascript は SunSpider でベンチをとってみましたが、変化なしでした。新しいエンジンが搭載される予定の Firefox 4 に期待です。
まだベータなので動かない拡張もあります。私の使っている拡張を Nighlty Tester Tools を使った状態で動いているものとちゃんと動かないものに分類してみます。
まず、使えているもの。
というか、ほとんど普通に使えてますね。次にだめなもの。
fx3 からは、更新が HTTPS か署名されていないと無効にされます。正式版がリリースされれば、拡張側でそれに追随して対応されるでしょう(Bloglines Toolkit はたぶん放置されると思いますが)。
江戸雪は豆腐や油揚げなどの豆腐・豆製品を作っている会社です。近所のスーパーで取り扱っているのですが、この江戸雪の製品には「雪ちゃん」というキャラがプリントされています。google さまで検索しても言及している人があんまりいないので、少しでも世に知らしめるために書いておきます。
これは1月下旬に買った絹豆腐。雪だるまを作っているところですね。他にも 4 種類(計 5 種)絵柄があります。さらには、これは冬バージョンだったりします。つまり、季節によって絵柄が変わるんですね。夏バージョンにはテニスラケットを持った雪ちゃんなどがあります。
油揚げやいなり用の揚げにもまた雪ちゃんがいて、江戸雪の製品に全面的に展開されているわけです。かなりの力の入れようだと思いませんか。
追記:スーパーに行って少し確認してきました(併せて上の文を少し訂正)。絹豆腐の絵柄はなんと 5 種類も。絵柄が複数ある製品は絹豆腐だけで、他は小さめに描かれているだけでした。お稲りさん用の揚げには、作り方を示す二コマか三コマのイラストがフィーチャーされており、ファン必見。
先日公開されたオープンソース版 Fastladder を遅ればせながらダウンロードしてみました。オープンソース版は Rails 製。せっかくなのでコードを読んでみることにします。
Fastladder Open Source / Free Downloadのページから、Unix / Linux 版をダウンロードします。
$ wget http://fastladder.org/downloads/fastladder-0.0.2-src.tar.gz $ tar fxz fastladder-0.0.2-src.tar.gz $ cd fastladder
INSTALL.txt に書いてある通りです。
どんなプラグインを使っているかを調べるため、vendor/plugins を見ます。
$ ls vendor/plugins restful_authentication
restful_authentication は Rails 2.0 でデファクトスタンダードな認証プラグインです。使っているのはこれのみのようですね。
とりあえずアプリの規模を知るために LoC を調べます。rake のタスクにコードのメトリクスを得る stats というのがあります。
$ rake stats (in /home/date/tmp/fastladder) +----------------------+-------+-------+---------+---------+-----+-------+ | Name | Lines | LOC | Classes | Methods | M/C | LOC/M | +----------------------+-------+-------+---------+---------+-----+-------+ | Controllers | 1015 | 886 | 22 | 73 | 3 | 10 | | Helpers | 90 | 85 | 0 | 9 | 0 | 7 | | Models | 282 | 232 | 8 | 29 | 3 | 6 | | Libraries | 602 | 484 | 2 | 37 | 18 | 11 | | Integration tests | 0 | 0 | 0 | 0 | 0 | 0 | | Functional tests | 366 | 274 | 28 | 57 | 2 | 2 | | Unit tests | 171 | 133 | 8 | 21 | 2 | 4 | +----------------------+-------+-------+---------+---------+-----+-------+ | Total | 2526 | 2094 | 68 | 226 | 3 | 7 | +----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 1687 Test LOC: 407 Code to Test Ratio: 1:0.2
Code LOC: 1687 なので、サーバ側は結構コンパクトなコードだと言えます。余り時間を書けずに読めそうですね。
他の値も少し見てみます。全体の規模からするとコントローラのクラス数が多いですね。画面数あるいは機能数が多いのかもしれません。コントローラとモデルの Methods/Class が 3 と少なめですから、(コード的に)軽量な画面や機能が多いか細かく分割していると考えられます。統合テストが 0 ですが、Code to Test Ratio は 1:0.2 なので TDD でない Rails アプリでは普通くらいでしょうか。まあ、この辺のメトリクスの値は多いから良いとか悪いとかではないので、傾向が多少分かるくらいの話ですが。
参考までに他の Rails アプリの stats の結果を挙げておきます。
(in /home/date/tmp/redmine-0.6.3) +----------------------+-------+-------+---------+---------+-----+-------+ | Name | Lines | LOC | Classes | Methods | M/C | LOC/M | +----------------------+-------+-------+---------+---------+-----+-------+ | Controllers | 3888 | 2814 | 36 | 242 | 6 | 9 | | Helpers | 1850 | 1026 | 2 | 84 | 42 | 10 | | Models | 3748 | 2293 | 54 | 276 | 5 | 6 | | Libraries | 7111 | 4838 | 39 | 313 | 8 | 13 | | APIs | 25 | 8 | 1 | 0 | 0 | 0 | | Integration tests | 268 | 166 | 4 | 10 | 2 | 14 | | Functional tests | 1686 | 1140 | 40 | 163 | 4 | 4 | | Unit tests | 1938 | 1125 | 32 | 149 | 4 | 5 | +----------------------+-------+-------+---------+---------+-----+-------+ | Total | 20514 | 13410 | 208 | 1237 | 5 | 8 | +----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 10979 Test LOC: 2431 Code to Test Ratio: 1:0.2
多機能なだけあって Code LOC は 10000 超えです。ライブラリが約半分を占めていますが、サードパーティー製で大きいのは SVG グラフくらいなのでそれを除いても 10000 前後でしょう。モデルがやたら多いですね。ヘルパーの Methods/Class が 42 なので、これは明らかに詰め込みすぎ。
(in /home/date/tmp/typo-5.0.2) +----------------------+-------+-------+---------+---------+-----+-------+ | Name | Lines | LOC | Classes | Methods | M/C | LOC/M | +----------------------+-------+-------+---------+---------+-----+-------+ | Controllers | 2124 | 1752 | 37 | 220 | 5 | 5 | | Helpers | 765 | 608 | 0 | 104 | 0 | 3 | | Models | 3041 | 2432 | 57 | 415 | 7 | 3 | | Libraries | 1446 | 1047 | 33 | 161 | 4 | 4 | | APIs | 437 | 355 | 17 | 23 | 1 | 13 | | Components | 0 | 0 | 0 | 0 | 0 | 0 | | Model specs | 1022 | 805 | 2 | 19 | 9 | 40 | | View specs | 118 | 94 | 0 | 9 | 0 | 8 | | Controller specs | 870 | 675 | 1 | 19 | 19 | 33 | | Helper specs | 50 | 37 | 0 | 0 | 0 | 0 | +----------------------+-------+-------+---------+---------+-----+-------+ | Total | 9873 | 7805 | 147 | 970 | 6 | 6 | +----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 6194 Test LOC: 1611 Code to Test Ratio: 1:0.3
こちらもモデルクラスが多いですね。LOC/Method が総じて低いので、すっきりしたコードなのでしょう。
(in /home/date/tmp/pref-shimane-cms-1.0) +----------------------+-------+-------+---------+---------+-----+-------+ | Name | Lines | LOC | Classes | Methods | M/C | LOC/M | +----------------------+-------+-------+---------+---------+-----+-------+ | Helpers | 317 | 288 | 0 | 23 | 0 | 10 | | Controllers | 2860 | 2576 | 8 | 199 | 24 | 10 | | APIs | 4 | 2 | 1 | 0 | 0 | 0 | | Components | 0 | 0 | 0 | 0 | 0 | 0 | | Functional tests | 2660 | 2358 | 12 | 165 | 13 | 12 | | Models | 1817 | 1536 | 22 | 149 | 6 | 8 | | Unit tests | 1510 | 1270 | 24 | 131 | 5 | 7 | | Libraries | 8275 | 6270 | 128 | 414 | 3 | 13 | +----------------------+-------+-------+---------+---------+-----+-------+ | Total | 17443 | 14300 | 195 | 1081 | 5 | 11 | +----------------------+-------+-------+---------+---------+-----+-------+ Code LOC: 10672 Test LOC: 3628 Code to Test Ratio: 1:0.3
LOC が 2576 と大きいわりに、コントローラ数が少なく、Methods/Class が 24 と大きいです。あまり画面遷移をさせずに色々できるようにしているのかもしれません。LOC/Method も 8〜10 と大き目ですね。リファクタリングの余地がありそうです。
わき道に逸れたので今回はここまで。
続きです。その1
ディレクトリ構造を見ます。
$ ls INSTALL.txt README.txt app db lib public test vendor LICENSE.txt Rakefile config doc log script tmp
一般的な Rails のディレクトリ構造です。特殊なディレクトリはないので、Rails の CoC に則って作られているようですね。
config ディレクトリ以下を確認します。環境設定や起動に関するものはここに入るので、OpenFL 特有の設定などをを知ることができます。
特に Rails アプリ一般と変わりはありませんでした。
session の secret を外部ファイル化しています。この secret は Rails 2.0 でセッション情報をクッキーに突っ込むようになって増えたパラメタです。デフォルトだと environment.rb に埋め込まれるので公開するコードだと困るんですよね。コードはRails 2.0 移行ログ -- BONNOH FRACTION 13のものでしょうかね。
rails コマンドで生成されたそのまま。
OpenFL で追加されたファイルです。environment.rb のコメントに元から書いてあるように、initializers 以下の *.rb はアプリケーション起動の初期時に自動的に読まれて実行されます。なのでアプリケーションの設定をここに書くことが強く推奨されています。
さて、constants.rb には定数がいくつか記述されています。定数なので constants.rb なのでしょうけど、意味からすれば別のファイル名のほうがいいんじゃないでしょうかね。global_settings.rb とか。ちょっと長いかな……
定数のそれぞれの意味は必要になったら調べることにします。とりえあず、名前から推測されるところをメモっておきます。MAX_UNREAD_COUNT と CRAWL_INTERVAL 以外は大体分からないでもないですね。
直接ファイルを眺めてもいいですし、rake routes してもいいです。rake routes すると定義されている route が展開された状態で全部表示されます。map.resource 使っていると長くなるのが玉に瑕。
さて中身ですが、members と session を map.resource してますね。これは restful_authentication が必要としている設定です。
また、
map.connect "api/config/load", :controller => "api/config", :action => "get"
map.connect "api/config/save", :controller => "api/config", :action => "put"
map.connect "/api/:action", :controller => "api"
map.connect "/:controller/:action", :requirements =>{:controller => /api\/\w+/}
と、api に関する定義が多いです。最後の requirements している定義で /api/ 以下にさらにコントローラが複数あることがわかります。実際ファイルを調べてみると、
$ ls app/controller/api config_controller.rb folder_controller.rb pin_controller.rb feed_controller.rb item_controller.rb search_controller.rb
という感じです。名前からするとほとんどの機能はこの /api/ 配下に集中しているのかもしれません。
今回の対象は設定ファイルなので、深入りは止めておきます。また次回。
Amazon.co.jpからのお知らせ お客様からご注文いただいた 商品 を本日発送させていただきました。 ご注文の処理が完了しましたのでお知らせします。 Amazon.co.jpをご利用いただき、ありがとうございました。またのご利用を お待ちしております。 今回発送する商品は以下のとおりです。 --------------------------------------------------------------------- 数量 商品 価格 発送済み 小計 --------------------------------------------------------------------- 1 世界樹の迷宮II 諸王の聖杯 ¥4,706 1 ¥4,706
特典あり「世界樹の迷宮II 諸王の聖杯」 はプレミア付いてますね。特典なしの「世界樹の迷宮II 諸王の聖杯(特典無し)」は普通に買える模様。しかも届くのは金曜日。
すでに Wiki が立ってますが、なるべく見ないようにしようと思います。
影舞の開発が再開したようです。目出度い。会社で業務に使っています。コードをベースとしてやりとりする際には trac、タスクがベースなら影舞という使い分けをしています(あとは、新しいプロジェクトには redMine を使ってみたり)。
1.8 では obsolete になってる部分を修正するパッチを取り込んでもらいました。ありがとうございます。
Ruby 1.9 でも動くようにとコードをいじってみているのですが、stable-0_8 タグですと testall でエラーが大量に出ます。ほとんどが No such file or directory なので何か設定に問題があると思うのですが、良く分からず。
↓checkout したそのままの状態で実行した結果の一部。
141) Error:
test_update2(TestXMLStore):
Errno::ENOENT: No such file or directory - /home/date/work/kagemai/project/_tmp/messages.ja.cache
./lib/kagemai/message_bundle.rb:65:in `initialize'
./lib/kagemai/message_bundle.rb:65:in `open'
./lib/kagemai/message_bundle.rb:65:in `initialize'
./lib/kagemai/message_bundle.rb:30:in `new'
./lib/kagemai/message_bundle.rb:30:in `open'
/home/date/work/kagemai/test/xmlstore_test.rb:13:in `setup'
142) Error:
test_update2(TestXMLStore):
Errno::ENOENT: No such file or directory - /spool
./lib/kagemai/util.rb:133:in `open'
./lib/kagemai/util.rb:133:in `foreach'
./lib/kagemai/util.rb:133:in `delete_dir'
./lib/kagemai/filestore.rb:76:in `destroy'
/home/date/work/kagemai/test/xmlstore_test.rb:41:in `teardown'
project/_tmp ディレクトリを作っておいても、
95) Error:
test_update2(TestXMLStore):
ArgumentError: wrong number of arguments (0 for 1)
./lib/kagemai/reporttype.rb:154:in `parse'
./lib/kagemai/reporttype.rb:154:in `parse'
./lib/kagemai/reporttype.rb:36:in `load'
./lib/kagemai/sharedfile.rb:62:in `read_open'
./lib/kagemai/sharedfile.rb:60:in `open'
./lib/kagemai/sharedfile.rb:60:in `read_open'
./lib/kagemai/sharedfile.rb:47:in `sync'
/usr/lib/ruby/1.8/sync.rb:229:in `synchronize'
./lib/kagemai/sharedfile.rb:46:in `sync'
./lib/kagemai/sharedfile.rb:59:in `read_open'
./lib/kagemai/reporttype.rb:35:in `load'
/home/date/work/kagemai/test/xmlstore_test.rb:15:in `setup'
96) Error:
test_update2(TestXMLStore):
Errno::ENOENT: No such file or directory - test/testfile/spool
./lib/kagemai/util.rb:133:in `open'
./lib/kagemai/util.rb:133:in `foreach'
./lib/kagemai/util.rb:133:in `delete_dir'
./lib/kagemai/filestore.rb:76:in `destroy'
/home/date/work/kagemai/test/xmlstore_test.rb:41:in `teardown'
インストール済みの xmlscan と影舞バンドルのそれとのバージョンが違っていたため、それでエラーになっているものがありました(filestore_test)。これは以下のように kagemai の lib の探索順位を上げて対応。
Index: testall.rb
===================================================================
RCS file: /cvsroot/kagemai/kagemai/testall.rb,v
retrieving revision 1.1.1.1.2.5
diff -u -r1.1.1.1.2.5 testall.rb
--- testall.rb 20 Feb 2008 11:52:44 -0000 1.1.1.1.2.5
+++ testall.rb 22 Feb 2008 14:56:59 -0000
@@ -10,7 +10,7 @@
$SAFE = 1
$WIN32 = (RUBY_PLATFORM =~ /mswin32|cygwin/) != nil
-$:.push("./lib");
+$:.unshift("./lib");
kagemai_root = "."
あとは、Kagemai::MessageBuldle.open で wrong number of arguments (4 for 3) が出るというもの。こっちは fukuoka さんが直してくれました。0F0E です。
$ ruby -v testall.rb ruby 1.8.6 (2007-12-03 patchlevel 113) [i686-linux] (略) 171 tests, 327 assertions, 0 failures, 0 errors
今回はデータベースのスキーマを見ます。タイトルに反してコードを全然読んでないですね。データ構造を把握しておくとモデルやコントローラのコードを読む助けになりますので、先に確認しておきます。
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).
_ fukuoka [こんばんは。最初の project/_tmp がないというのは、テストケースの問題ですね。これは手元でも再現しますし..]
_ だて [こんばんは。ありがとうございます。手元で 0 failures, 0 errors になりました(1.8 で)。 ..]