カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
カテゴリページを使ってしのいでいますが、tDiary って過去に書いた日記を参照するのに割と手数がかかります。ということで、tdiarygrep の導入を試みてみました。
一文字のクエリを入れると undefined method `source' for "a":String などと言われました。
q=1 NoMethodError undefined method `source' for "1":String ./grep.rb:457:in `patterns2html' ./grep.rb:457:in `map' ./grep.rb:457:in `each' ./grep.rb:457:in `map' ./grep.rb:457:in `patterns2html' (erb):16:in `search_error_page' ./grep.rb:425:in `search_error_page' ./grep.rb:327:in `generate_page' ./grep.rb:305:in `main' ./grep.rb:786
image_ex プラグインで画像をはっているページが検索されると、例によって apply_plugin するときに例外が起きました。
q=ruby NoMethodError undefined method `strftime' for nil:NilClass (eval):96:in `image' (erb):4:in `apply_plugin' ./tdiary.rb:743:in `apply_plugin' ./grep.rb:653:in `apply_plugins' ./grep.rb:613:in `apply_plugins' ./grep.rb:609:in `short_html' (erb):35:in `search_result_page' (erb):28:in `match_topics' ./grep.rb:475:in `match_topics0' ./grep.rb:486:in `each' ./grep.rb:568:in `each_topic' ./grep.rb:486:in `match_topics0' ./grep.rb:485:in `reverse_each' ./grep.rb:485:in `match_topics0' ./grep.rb:484:in `reverse_each' ./grep.rb:498:in `foreach_data_file' ./grep.rb:484:in `match_topics0' ./grep.rb:475:in `match_topics' (erb):28:in `search_result_page' ./grep.rb:418:in `search_result_page' ./grep.rb:323:in `generate_page' ./grep.rb:305:in `main' ./grep.rb:786
そんなに難しいこともなく直せるとは思いますが、とりあえずメモだけしておきます。
前者は、2 文字より少ない検索語では検索できないという仕様と、search_error_page メソッドがエラーメッセージ(reason)を引き継いでない?ためのようです。実用上問題はないので放置です。後者は Plugin#eval_src で @date にダミーの値を設定することで逃げました ^^;
[サイト運営] noip-updater で書いた noip-updater がメジャーバージョンアップしていました。noip-updater は Dynamic DNS サービスの no-ip.com 用のクライアントソフトウェアです。これを走らせておくと、再接続などをして自宅サーバの IP アドレスが変更されても、自動的に新しい IP アドレスを登録してくれます。
Gentoo のパッケージでは、インストール後、デーモンの初回起動時に対話的に conf ファイルを作成します。また、バージョン 1.x 系とは違って、conf ファイルはテキストからバイナリデータとなり、ぱっと見でパスワードなどが分からないようになりました。私の場合、ロギングデーモンには metalog を使ってますので、/var/log/everything 配下にログが出力されます。syslog の場合は /var/log/message ですね。
# emege -u noip-updater
<snip>
# /etc/init.d/noip start
* Answer the following questions about your no-ip account.
Auto configuration for Linux client of no-ip.com.
Please enter the login/email string for no-ip.com ****@********.ne.jp
Please enter the password for user '****@********.ne.jp' *****
Only one host [dontstopmusic.no-ip.org] is registered to this account.
It will be used.
Please enter an update interval:[30]
Do you wish to run something at successful update?[N] (y/N) N
New configuration file '/etc/no-ip2.conf' created.
* Starting noip... [ ok ]
# emerge -s noip-updater
Searching...
[ Results for search key : noip-updater ]
[ Applications found : 1 ]
* net-dns/noip-updater
Latest version available: 2.0.12
Latest version installed: 2.0.12
Size of downloaded files: 66 kB
Homepage: http://www.no-ip.com
Description: no-ip.com dynamic DNS updater
ちょっとメモ。RubyForge でホストされている R:O:S, Ruby Operating System プロジェクトが slashdot'ted していた模様です。
昨日からプレイし始めました。まだ第一章ですが。検索してこの日記を訪れる方がいますし、たまにはきちんと説明文でも書きます。
「秋意海岸の殺人」は有限会社ファインセクションさんが制作したミステリーアドベンチャーゲーム。 警部補・高原祐介シリーズとして過去にもいくつかの作品を発表しており、定評があるようです。残念ながら秋意海岸の殺人以外の既作に関しては公開終了とのこと。私はどれも未プレイです。
さて、まだ始めたばかりですので内容以外の部分について少し書きます。趣味の問題で UI については分量が多目です。
Macromedia Director 製。Director というとマルチメディアという言葉が生まれた頃を思い出します。マルチメディアという名が冠された、ちょっとばかり絵が動いて音が鳴る物凄く重いソフトウェアがこれを使って粗製乱造されていました。Director 製 = 重いという先入観が植え付けられていたのですが、このゲーム別に重くもなんともありませんでした。所詮先入観は先入観だったみたいです。まあ当時 i386SX-20MHz でしたからね。
オーソドックスなコマンド選択型 AVG です。「しらべる」->「あたり」->「とくにあやしいところはないようだ」なとど手当たり次第選ぶアレです。「秋意海岸の殺人」では推理という要素が加わっています。ストーリーの要所要所において、ユーザが推理(選択肢から選ぶなど)をすることで事件の真相を暴いていく、という作りになっています。といってもミステリー AVG にはこういう趣向のものは過去にたくさんありますので、やはりオーソドックスと言っていいでしょう。
シンプルです。上部が舞台背景画像、下部に登場人物のバストアップ画像とセリフ欄、右手にコマンドメニュー。ゲームを始めたばかりでも迷うことなく操作できると思います。
セリフ欄は 26 文字 × 4 行くらいと割と広めのスペースが取られています。また、フォントはアンチエイリアスのかかった太目のゴシック体と読みやすいものが使われています。セリフ送りのときにマウスカーソルの形状が変化するともっと良かったと思いました。
コマンドはカーソルでポイントするだけで選択肢が表示されますので、クリック連打で指が疲れるというコマンド選択型 AVG の難点が緩和されています。ただ、コマンドメニューが縦に並んでいるため、下のほうにある調査・使用では選択肢までのカーソル移動距離が長いのが気になりました。
ユーザの行動に対してフィードバックがちゃんと設定されています(画面上のユーザの操作対象となるオブジェクトをポイント・クリックした時に、ポイント対象がアニメーションしたり色が変化する、あるいはポインタの形状が変わるなど)。コマンドメニューの開いたウインドウが、マウスアウトで不用意に閉じたりしないのも好印象です。
今のところ、アップテンポなものが多いですね。そう印象深い曲ではなく、BGM 然としています。
冒頭の現場のシーンでは主要登場人物の紹介、次の回想シーンでは新米の高原祐介となって捜査の基本を行う、というように他のシリーズ作を知らない人やミステリ AVG をやったことがない人でも導入がスムーズになるような序盤のシナリオ構成になっています。
総じて、ゲームを作りなれている感じですね。
elog | ただいま開発中?iPodからBluetoothで音を飛ばす周辺機器
例えば Bluetooth 搭載の iPod が携帯くらいの普及率になったとします(もちろん後述することが実現するにはまだいくつかブレイクスルーは必要ですが最低要件として)。すると街が p2p ネットワークになるわけです。横断歩道ですれ違った人と、マックでポテトをつまんでいるときに隣に座った人と、音楽を交換する世界。音楽交換から目を離すと、そこにあるのはインターネット以外の広域ネットワークです。しかも人が存在するときにだけそのネットワークも存在する。そういうネットワークがあったら何か面白いことができないでしょうか。
>たださん
そうなんですよね。上に書いた与太話も単に音楽データの交換というだけでは RIAA や JASRAC が嫌がるくいらで面白くもなんともなくて、コミュニケーションの一形態まで昇華されてこそなのだと思います(記事にあるように道端でイヤホン貸してくれと言われたら逃げちゃいますけど ^^;)。
threedegrees やウェブログの now playing プラグイン、そしてiTunes Catalog のように、iPod(という製品にこだわる必要はないのですが) という外部デバイスがネットワークにおいて自分のパーソナリティを表明する手段として一般化されている世界ってどんな様子だろうと思いを馳せます。SF 小説のネタくらいにはなるかな。
high_land view 経由。おおー。これはちょっとほしくなりますね。のび太と恐竜に感動し、結婚前夜に涙するドラえもん世代なものですから。
出ました。メーラ関係の FIX が多いようです。目を引く機能追加はベータリリースのときと同じですが、クラスプラットフォームな NTLM 認証対応、ページ翻訳の復活、Chatzilla 統合などでしょうか。
Ripper が実用になると応用品がたくさんできそうですね。楽しみです。
RSSフィード開始しましたとのことです。今のところ ruby-lang.org トップはリリースやイベント情報など大きい話しか載らないようですので RSS で更新チェックするというニーズがあるのか分かりませんけれども。ML トピックスのブログ版、RNN よりもっとラフに Ruby 関連の動向をメモできるようなものがあるといいかもですね。
前言撤回。更新の頻度があまり高くないサイトのほうが、告知の媒体としてサイトよりも RSS の方が有効といえます。以下その理由です。
更新頻度が低いサイトには訪問の頻度も低くなります。一方、RSS リーダに限らず巡回ツールや更新チェッカといったツールでは個別に更新状況を確かめるということはありませんので、一年更新されてなかろうと、巡回の度に更新をチェックします。また、一度登録するとあまり削除(巡回対象から除外)はしません。
今日はやけに出回ってました。Hi というサブジェクトの .exe 添付ファイル付きメールです。増殖するだけなのでトラフィック以外にはダメージを与えないようではありますが。
購読している ML の中では libxml の ML にたくさん届いてました。
スラッシュドット ジャパン「PC-蘇る9801伝説」
ASCIIから既刊のMSXマガジン永久保存版から続くエミュレータシリーズ第三弾は「蘇るPC-9801伝説」だ。
*蘇る* に *伝説* ですか。かつての国民機がまるでミイラか何かのような扱いですね。十年二昔三昔の世界ですから致し方ないとはいえ、一抹の寂しさを感じます。そういいつつ、もう実機持ってませんけども。
「蘇るPC-9801伝説」は書籍ですが、プロジェクト EGGという OLD PC ゲームを販売しているサイトもあります。
窓の杜 - 【Review NEWS】「Adobe Reader」の起動を高速化できる「Adobe Reader SpeedUp」が公開
起動時に読み込むプラグインの種類をあらかじめ制限することで高速起動を実現
どこ経由だったかちょっと失念。これはいいですね。バージョンアップとともに鈍重になっていく Acrobat/Adobe Reader には辟易していました。単独起動では、初回起動 6 秒(二回目以降 2 秒弱)から初回起動 2 秒(二回目以降 1 秒以下)に改善されました(環境は Windows2000/AthlonXP2700+ です)。
このサーバから異音が聞こえてます。おそらくファンに埃でも詰まったのだと思います。掃除と点検のために明日しばらくサーバを停止します。uptime が 2 ヶ月くらいいってるので何か勿体無いですけども。
$ uptime 00:53:47 up 59 days, 17:04, 1 user, load average: 0.00, 0.00, 0.01
クリアしました。プレイ時間は 6 時間くらいかな。一日一章ずつ進めていくと丁度良いと思います。正統派で(ゲーム的に)歯ごたえのあるミステリー AVG でした。犯人の動機はちょっと納得できないところもありましたが。
Windwos 互換 OS を目指す ReactOS の新しいリリースが出ました。
軽く試してみました。スクリーンショット(402KB)です 。Bochs イメージで起動したものを vnc2swf で記録していますのでコマ落ち状態ですが、ネイティブで動かせばもう少し滑らかだと思います。
初心者向けチュートリアルシリーズです。やる気が続く限りちまちま連載します(つまり続かない……)。
Ruby でツールを作成するときに意外と悩むのが、どのようなコマンドラインオプションを用意するのかということと、どのようにコマンドラインオプションを処理するのかということです。ここでは主に後者、プログラムに与えられたオプションの解析と利用方法について述べます。
プログラムの動作や設定を指定するための方法です。ユーザは複数のオプションを組み合わせて指定することで、プログラムに望みの処理をさせることができます。
シェルによって提供されるコマンドを入力するための行のことをコマンドラインと言い、そこで指定するオプションなのでコマンドラインオプションです。コマンドライン引数と言ったりもします。
平たく言えばプログラムを実行するときにコマンドの後につけるあれやこれのことです。
[例] $ ruby -v ruby 1.8.1 (2003-12-25) [i686-linux-gnu]
この場合、-v がコマンドラインオプションとなります。プログラムは「コマンドラインオプションに -v があったらバージョン情報を表示して終了」という処理をしているわけです。
このように指定のオプションに応じてプログラムを動作させるには、コマンドラインオプションを解析するという作業が必要となります。
データベースから取ってきた値をほとんどそのまま表示するような単純なアプリの場合、dbiclass と amrita を使えば何も考えずにプログラムが書けます。そのままではなく値を加工して表示するときにどういう風にすると綺麗なのだろうという悩みです。
例えば、次のようなレスを表すテーブルのデータから、
[テーブル定義 1] create table resu ( id serial primary key, sure_id integer not null, date timestamp with time zone not null, name varchar(255), email varchar(255), body text not null );
スレッド番号 1 に属するレスを取る仕事は以下のコードでできます。(まあ、dbiclass で複雑なことをしようとすると壁に当たりますが、今回は amrita の話なのでそれはおいておきます。)
[プログラム 1]
require 'dbiclass'
class Resu < DBI::Class
table 'resu'
columns %w(id sure_id date name email body)
primary 'id'
end
Resu.dbh = DBI::connect('dbi:pg:bbs')
resues = Resu.search('sure_id', 1)
これをさらに amrita にかけて HTML で出力します。
[テンプレート 1] sure.html <html><body> <div id="resues"> <p><span id="date">日付</span> : <span id="name">名前</span> / <span id="email">メール</span></p> <p id="body">本文</p> </div> </body></html>
[プログラム 2] (1 から続く)
require 'amrita/template'
class Resu
include Amrita::ExpandByMember
end
template = Amrita::TemplateFile.new('sure.html')
template.expand( $stdout, 'resues' => resues )
これで大体以下のような HTML の出力結果が得られます。
[出力結果 1] <html><body> <div> <p>Sat Jan 31 02:32:07 JST 2004 : だて / ***@****.ne.jp</p> <p>ほげほげ</p> </div><div> <p>Sat Jan 31 02:32:09 JST 2004 : だて / ***@****.ne.jp</p> <p>ふにゃふにゃ</p> </div> </body></html>
データベースから取ってきた値をそのまま出力するならこれで事足りますが、普通は、日付の書式は指定したい、名前がなかったら「名無しさん」としたい、メールアドレスはリンクにしたいなど、値を加工して表示をしたくなります。方法としては、
def email; "mailto:#{@obj.email}"; endなどが思いつくところですが、今一すっきりとした解答が見つかりません。。。この中では二番目が分かりやすいかなあ。
組み込み変数 ARGV を用います。ARGV は Ruby スクリプトに与えられた引数の配列のオブジェクトです。*1
以下のような ARGV を表示するだけのプログラム foo.rb があるとします。
[サンプルプログラム 1] foo.rb p ARGV
まずは引数なしで実行してみます。
[実行例 1] $ ruby foo.rb []
空の配列です。次に適当な引数を付けて実行してみます。
[実行例 2] $ ruby foo.rb hoge ["hoge"] $ ruby foo.rb To be or not to be, that is the question ["To", "be", "or", "not", "to", "be,", "that", "is", "the", "question"]
実行するスクリプト名の後に打たれた文字が空白で区切られて ARGV に格納されることが分かると思います。
では、もう少し実用的?なサンプルプログラムを挙げてみます。オプションで指定されたファイルを読み込んで表示するプログラムです。
[サンプルプログラム 2] foo2.rb file = ARGV[0] p file fp = File.open(file) print fp.read fp.close
[サンプルテキスト 1] fw.txt riverrun, past Eve and Adam's, from swerve of shore to bend of bay, brings us by a commodius vicus of recirculation back to Howth Castle and Environs.
[実行例 3] $ ruby foo2.rb fw.txt "fw.txt" riverrun, past Eve and Adam's, from swerve of shore to bend of bay, brings us by a commodius vicus of recirculation back to Howth Castle and Environs.
上手く表示されました。が、しかし、世の中こんなに簡単なオプションのプログラムばかりではありません。ruby インタプリタだって -a -c -d -e -i などなどと多くのオプションを指定できます。次回はこの節の続きとして複数のオプション指定の場合について述べようと思います。
さて、サンプルプログラム 2 でふと魔が差して存在しないファイル名をオプションに指定したらどうなるでしょうか?
[実行例 4]
$ ruby foo2.rb necronomicon.txt
"necronomicon.txt"
foo2.rb:3:in `initialize': No such file or directory - necronomicon.txt (Errno::ENOENT)
from foo2.rb:3:in `open'
from foo2.rb:3
案の定エラーになりました。このプログラムはあまり親切とはいえません。せめてエラーメッセージを日本語にしたくなります。
[サンプルプログラム 3] foo2_1.rb file = ARGV[0] unless FileTest::exist?(file) puts "ファイルないよ" exit end p file fp = File.open(file) print fp.read fp.close
方針その 1 が上のプログラムです。オプションというプログラムの外から入力された値が正しいかどうかをチェックして、正しいときだけ先に進みます。
[サンプルプログラム 4] foo2_2.rb file = ARGV[0] p file begin fp = File.open(file) print fp.read fp.close rescue Errno::ENOENT puts "ファイルないよ" end
方針 2 では、例外処理を使っています。ファイルを開いて表示するという、このプログラムで実現したい処理をしているところをブロックで囲んで例外補足するというやり方です。どちらが適切かはケースバイケースですし、このくらいの短いプログラムではどっちもどっちですが。もう少し長いプログラムで考えてみると、例えば前者は長い長い処理をした後にファイルが開けなくて終了してしまうといったことが防げます。同じく後者は、複数のファイルを開いて表示したいが、一つのファイルがないくらいでプログラムを終了させたくないという時に書きやすいでしょう。
このような話をもっと一般化させるとアサーションや適切な例外処理や Design by Contract やテスティングといった話題になりそうですが、脱線もいいところなのでこの辺で。
*1 ただの配列ですので、要素を追加したり削除したりできます。また、個々の引数はただの文字列ですので、書き換えたりできます。一度変更してしまうと実行したばかりのときの初期値には戻せません。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).
_ ただただし [iPod、こんな儀式(?)もあるそうですよ http://www.hotwired.co.jp/news/news/..]