フォーチュンサモナーズ
最新 追記

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|

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

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


2004-01-01 この日を編集

_ [私生活] あけおめ このエントリーを含むブックマーク

この日記、たくさん書いたような気がしますがまだ半年も続いてないのですよね。大学に在学中のときに作成したサイトは一時に書きたくって後は放置というパターンでしたので、ここはその逆、細く長く行きたいと思います。さて、実家に帰省していますので、仕事始めまでは更新停止です。


2004-01-05 この日を編集

_ [散財] Golden Silver このエントリーを含むブックマーク

  • Golden Silver / mixed by Kagami : Kagami 最高です。ご飯何杯でもいけます。


2004-01-10 この日を編集

_ [メモ] tdiarygrep このエントリーを含むブックマーク

カテゴリページを使ってしのいでいますが、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

そんなに難しいこともなく直せるとは思いますが、とりあえずメモだけしておきます。

追記(2004/01/12)

前者は、2 文字より少ない検索語では検索できないという仕様と、search_error_page メソッドがエラーメッセージ(reason)を引き継いでない?ためのようです。実用上問題はないので放置です。後者は Plugin#eval_src で @date にダミーの値を設定することで逃げました ^^;

_ [ソフトウェア] タビアたん このエントリーを含むブックマーク

某伺かのようにゴーストが乗るようになると萌えブラウザ界が創出されてしまうのでは。などと妄想夢が広がります。


2004-01-11 この日を編集

_ [散財] 青白い炎など このエントリーを含むブックマーク

_ [Gentoo] noip-updater 2.0.12 このエントリーを含むブックマーク

[サイト運営] 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

主なオプション

  • -h : ヘルプ表示
  • -C : 設定ファイル作成
  • -S : ステータス表示

2004-01-14 この日を編集

_ [ゲーム] 秋意海岸の殺人 その1 このエントリーを含むブックマーク

昨日からプレイし始めました。まだ第一章ですが。検索してこの日記を訪れる方がいますし、たまにはきちんと説明文でも書きます。

秋意海岸の殺人」は有限会社ファインセクションさんが制作したミステリーアドベンチャーゲーム。 警部補・高原祐介シリーズとして過去にもいくつかの作品を発表しており、定評があるようです。残念ながら秋意海岸の殺人以外の既作に関しては公開終了とのこと。私はどれも未プレイです。

さて、まだ始めたばかりですので内容以外の部分について少し書きます。趣味の問題で UI については分量が多目です。

プログラム

Macromedia Director 製。Director というとマルチメディアという言葉が生まれた頃を思い出します。マルチメディアという名が冠された、ちょっとばかり絵が動いて音が鳴る物凄く重いソフトウェアがこれを使って粗製乱造されていました。Director 製 = 重いという先入観が植え付けられていたのですが、このゲーム別に重くもなんともありませんでした。所詮先入観は先入観だったみたいです。まあ当時 i386SX-20MHz でしたからね。

システム

オーソドックスなコマンド選択型 AVG です。「しらべる」->「あたり」->「とくにあやしいところはないようだ」なとど手当たり次第選ぶアレです。「秋意海岸の殺人」では推理という要素が加わっています。ストーリーの要所要所において、ユーザが推理(選択肢から選ぶなど)をすることで事件の真相を暴いていく、という作りになっています。といってもミステリー AVG にはこういう趣向のものは過去にたくさんありますので、やはりオーソドックスと言っていいでしょう。

ユーザインタフェイス

シンプルです。上部が舞台背景画像、下部に登場人物のバストアップ画像とセリフ欄、右手にコマンドメニュー。ゲームを始めたばかりでも迷うことなく操作できると思います。

セリフ欄は 26 文字 × 4 行くらいと割と広めのスペースが取られています。また、フォントはアンチエイリアスのかかった太目のゴシック体と読みやすいものが使われています。セリフ送りのときにマウスカーソルの形状が変化するともっと良かったと思いました。

コマンドはカーソルでポイントするだけで選択肢が表示されますので、クリック連打で指が疲れるというコマンド選択型 AVG の難点が緩和されています。ただ、コマンドメニューが縦に並んでいるため、下のほうにある調査・使用では選択肢までのカーソル移動距離が長いのが気になりました。

ユーザの行動に対してフィードバックがちゃんと設定されています(画面上のユーザの操作対象となるオブジェクトをポイント・クリックした時に、ポイント対象がアニメーションしたり色が変化する、あるいはポインタの形状が変わるなど)。コマンドメニューの開いたウインドウが、マウスアウトで不用意に閉じたりしないのも好印象です。

音楽

今のところ、アップテンポなものが多いですね。そう印象深い曲ではなく、BGM 然としています。

その他

冒頭の現場のシーンでは主要登場人物の紹介、次の回想シーンでは新米の高原祐介となって捜査の基本を行う、というように他のシリーズ作を知らない人やミステリ AVG をやったことがない人でも導入がスムーズになるような序盤のシナリオ構成になっています。

総じて、ゲームを作りなれている感じですね。


2004-01-15 この日を編集

_ [散財] 呪禁局特別捜査官 ルーキー このエントリーを含むブックマーク

  • 呪禁局特別捜査官 ルーキー / 牧野 修 : まだまだ強化月間中につき。雨宮や龍頭など表面的にだけ「狙った」キャラ設定には、にやりとさせられました。


2004-01-16 この日を編集

_ [スクラップ] iPod と Bluetooth このエントリーを含むブックマーク

elog | ただいま開発中?iPodからBluetoothで音を飛ばす周辺機器

例えば Bluetooth 搭載の iPod が携帯くらいの普及率になったとします(もちろん後述することが実現するにはまだいくつかブレイクスルーは必要ですが最低要件として)。すると街が p2p ネットワークになるわけです。横断歩道ですれ違った人と、マックでポテトをつまんでいるときに隣に座った人と、音楽を交換する世界。音楽交換から目を離すと、そこにあるのはインターネット以外の広域ネットワークです。しかも人が存在するときにだけそのネットワークも存在する。そういうネットワークがあったら何か面白いことができないでしょうか。

追記

>たださん
そうなんですよね。上に書いた与太話も単に音楽データの交換というだけでは RIAA や JASRAC が嫌がるくいらで面白くもなんともなくて、コミュニケーションの一形態まで昇華されてこそなのだと思います(記事にあるように道端でイヤホン貸してくれと言われたら逃げちゃいますけど ^^;)。
threedegrees やウェブログの now playing プラグイン、そしてiTunes Catalog のように、iPod(という製品にこだわる必要はないのですが) という外部デバイスがネットワークにおいて自分のパーソナリティを表明する手段として一般化されている世界ってどんな様子だろうと思いを馳せます。SF 小説のネタくらいにはなるかな。

_ [スクラップ] ぼくドラえもん創刊 このエントリーを含むブックマーク

high_land view 経由。おおー。これはちょっとほしくなりますね。のび太と恐竜に感動し、結婚前夜に涙するドラえもん世代なものですから。

_ [ソフトウェア] Mozilla 1.6 release このエントリーを含むブックマーク

出ました。メーラ関係の FIX が多いようです。目を引く機能追加はベータリリースのときと同じですが、クラスプラットフォームな NTLM 認証対応、ページ翻訳の復活、Chatzilla 統合などでしょうか。

_ [RubyForge] TourneyBot, Ripper, Runt, Borges, Simple Wiki このエントリーを含むブックマーク

Ripper が実用になると応用品がたくさんできそうですね。楽しみです。

  • TourneyBot : FIBS というバックギャモンの試合を管理するシステムだそうです。tourney=試合でいいのかな。 現在 1.0-alpha リリース済み。
  • Ripper : 期待の一品。Ruby プログラムのパーサです。現在未リリース。
  • ペーパーを元に作られている、カレンダーベースでスケジュールを表現するChronicJ の Ruby 版です。現在未リリース。
  • Borges : 一行野郎的にウェブアプリケーションを記述できるようにするウェブアプリケーションツールキットだそうです。ボルヘスという名前が気に入りました。現在未リリース。
  • Simple Wiki : MySQL を使ったシンプルな Wiki エンジンだそうです。現在未リリース。
本日のツッコミ(全1件) [ツッコミを入れる]

_ ただただし [iPod、こんな儀式(?)もあるそうですよ http://www.hotwired.co.jp/news/news/..]


2004-01-18 この日を編集

_ [Ruby] ruby-lang.org の What's New が RSS フィード開始 このエントリーを含むブックマーク

RSSフィード開始しましたとのことです。今のところ ruby-lang.org トップはリリースやイベント情報など大きい話しか載らないようですので RSS で更新チェックするというニーズがあるのか分かりませんけれども。ML トピックスのブログ版、RNN よりもっとラフに Ruby 関連の動向をメモできるようなものがあるといいかもですね。

追記 2004/02/01

前言撤回。更新の頻度があまり高くないサイトのほうが、告知の媒体としてサイトよりも RSS の方が有効といえます。以下その理由です。

更新頻度が低いサイトには訪問の頻度も低くなります。一方、RSS リーダに限らず巡回ツールや更新チェッカといったツールでは個別に更新状況を確かめるということはありませんので、一年更新されてなかろうと、巡回の度に更新をチェックします。また、一度登録するとあまり削除(巡回対象から除外)はしません。


2004-01-19 この日を編集

_ [メモ] W32.Beagle.A@mm 流行 このエントリーを含むブックマーク

今日はやけに出回ってました。Hi というサブジェクトの .exe 添付ファイル付きメールです。増殖するだけなのでトラフィック以外にはダメージを与えないようではありますが。
購読している ML の中では libxml の ML にたくさん届いてました

_ [スクラップ] Warp recordsがオンラインmp3販売サイトBleepを開店 このエントリーを含むブックマーク

warp は最も好きなレーベルの一つなので大歓迎です。FAQ によれば支払いはクレジットカードや Paypal とあるので、どこに住んでいても買えるのでしょう。また、楽曲は LAME の --alt-preset standard VBR でエンコードしているとのことです。その Bleep はここ


2004-01-20 この日を編集

_ [散財] 不思議のひと触れ など このエントリーを含むブックマーク

  • C MAGAZINE 2004/02 : 第一特集の『コンピュータで「空間」を表現する』は、プログラミング以前の位置にいる人に下地をつけてもらうという目的に適った良い匙加減の記事でした。筆者の狙いは成功していると思います。それでも雑誌だとページの制約が大きいので、内容はこのくらいで実例をふんだんに散りばめた新書程度の本があるとよりとっつきやすいかも。第二特集はプログラミングに関するフレームの種を集めた、じゃなくて実際に起きがちな議論を紹介した『プログラミングの○×△』です。Malloc/Free や Java のポイント等々おなじみの議論がまとめられています。知っておくと不用意にフレームへ足を踏み入れなくて済むかもしません。
  • 不思議のひと触れ / シオドア・スタージョン : スタージョンの本を買うのは初めて。まだ読み途中ですが、子供の目を通した世界をセンシティブに描いた「影よ、影よ、影の国」が気に入りました。


2004-01-21 この日を編集

_ [スクラップ] 「PC-蘇る9801伝説」@ /.JP このエントリーを含むブックマーク

スラッシュドット ジャパン「PC-蘇る9801伝説」
ASCIIから既刊のMSXマガジン永久保存版から続くエミュレータシリーズ第三弾は「蘇るPC-9801伝説」だ。

*蘇る* に *伝説* ですか。かつての国民機がまるでミイラか何かのような扱いですね。十年二昔三昔の世界ですから致し方ないとはいえ、一抹の寂しさを感じます。そういいつつ、もう実機持ってませんけども。

「蘇るPC-9801伝説」は書籍ですが、プロジェクト EGGという OLD PC ゲームを販売しているサイトもあります。


2004-01-24 この日を編集

_ [ソフトウェア] Adobe Reader SpeedUp このエントリーを含むブックマーク

窓の杜 - 【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

_ [ゲーム] 秋意海岸の殺人 その2 このエントリーを含むブックマーク

クリアしました。プレイ時間は 6 時間くらいかな。一日一章ずつ進めていくと丁度良いと思います。正統派で(ゲーム的に)歯ごたえのあるミステリー AVG でした。犯人の動機はちょっと納得できないところもありましたが。

攻略のポイント(微妙に攻略本風)

  • 自分が何をすべきかが分かっていれば、詰まることもなく次に進めます。同じコマンドを何度も選ばないと手がかりが得られなかったり、コマンドで選んだ行動と無関係にイベントが起きたりはしません。今何をしているのか分からなくなったら右クリックをすれば捜査の進行状況などを確認できます。
  • こまめにセーブしましょう。章と章の間でセーブを促されますが、何か進展があったらセーブするくらいの気持ちで。推理を誤ると即ゲームオーバーというシビアなシーンもあります。やり直しの時には Enter キーを押しっぱなしにしてメッセージを飛ばすと失敗したところまで素早く進めます。
  • 登場人物は覚えておきましょう。誰と誰が知り合いなのか、誰が生きていて死んでいるのか、事件の縦糸となる登場人物たちを忘れていては真相を突き止めることはできません。メモやセーブポイントを活用しましょう。

2004-01-25 この日を編集

_ [散財] HHK Lite2 など このエントリーを含むブックマーク

  • Happy Hacking Keyboard Lite2 (PD-KB210W/P) : 打鍵が気持ちいいキーボードです。大学のゼミ室でも使っていました。
  • Matrox Millennium P650 64MB BULK : 3D ゲームはしませんので、文字の読みやすさ重視です。OVERTOP で ¥178,00- でした。リテールも置いていない店が多かったですが、バルクは輪をかけて置いていないですね。
  • Rephlexions! An Album Of Braindance! : Rephlex のコンピ盤です。前のコンピ盤である Braindance Coindence よりも全体にまとまりがあって聴きやすいです。その分ラストトラックではやられた気分になります。
  • device people / riow arai : ビートしかありません。でもそこにすべてがあります。スタイリッシュな音というのも違うし、丹精を込めて磨き上げた音とでも形容すればいいのかな。いや、キックもスネアも利いていて決して丸くはないですが。
  • YosepH / Luke Vibert


2004-01-26 この日を編集

_ [メモ] Oracle Master このエントリーを含むブックマーク

1Z0-011J SQL を取得しました。Silver まで後二教科です。

例によって中庸な正答数
#################    17
#################### 20

_ [散財] 二十面相の娘 2 このエントリーを含むブックマーク

  • 二十面相の娘 2 / 小原 愼司 : まだちょい役ながら明智探偵も登場。意地悪な同級生や人間タンクも登場。いや、いーですなこの漫画。


2004-01-27 この日を編集

_ [メモ] rss 出力 このエントリーを含むブックマーク

dc:date を iso8601 形式にしました。


2004-01-28 この日を編集

_ [ソフトウェア] ReactOS 0.2 リリース このエントリーを含むブックマーク

Windwos 互換 OS を目指す ReactOS の新しいリリースが出ました。

軽く試してみました。スクリーンショット(402KB)です 。Bochs イメージで起動したものを vnc2swf で記録していますのでコマ落ち状態ですが、ネイティブで動かせばもう少し滑らかだと思います。


2004-01-30 この日を編集

_ [散財] JavaWorld このエントリーを含むブックマーク

  • Java World 2004/03 : ネイティブ XML データベース導入ガイドとして、EsTerraXSSeXistOracle XML DBTamino を端的に評価・比較しています。導入はまだ時期尚早としても、XML DB の現状を知るのには良い記事だと思います。

_ [Ruby] コマンドラインオプション その1 このエントリーを含むブックマーク

初心者向けチュートリアルシリーズです。やる気が続く限りちまちま連載します(つまり続かない……)。

はじめに

Ruby でツールを作成するときに意外と悩むのが、どのようなコマンドラインオプションを用意するのかということと、どのようにコマンドラインオプションを処理するのかということです。ここでは主に後者、プログラムに与えられたオプションの解析と利用方法について述べます。

  1. コマンドラインオプションとは何か
  2. オプションをプログラムで使うにはどうすればいいのか
  3. コマンドラインオプションを解析するライブラリの使い方
  4. イディオム

コマンドラインオプションとは何か

プログラムの動作や設定を指定するための方法です。ユーザは複数のオプションを組み合わせて指定することで、プログラムに望みの処理をさせることができます。

シェルによって提供されるコマンドを入力するための行のことをコマンドラインと言い、そこで指定するオプションなのでコマンドラインオプションです。コマンドライン引数と言ったりもします。

平たく言えばプログラムを実行するときにコマンドの後につけるあれやこれのことです。

[例]
$ ruby -v
ruby 1.8.1 (2003-12-25) [i686-linux-gnu]

この場合、-v がコマンドラインオプションとなります。プログラムは「コマンドラインオプションに -v があったらバージョン情報を表示して終了」という処理をしているわけです。

このように指定のオプションに応じてプログラムを動作させるには、コマンドラインオプションを解析するという作業が必要となります。


2004-01-31 _ この日を編集

_ [Ruby][] Amrita と空要素タグ このエントリーを含むブックマーク

amrita 1.8.2 の XML モードで、 <hoge></hoge><hoge/> と出力する方法求む。。。

_ [Ruby][] Amrita とデータベース このエントリーを含むブックマーク

データベースから取ってきた値をほとんどそのまま表示するような単純なアプリの場合、dbiclassamrita を使えば何も考えずにプログラムが書けます。そのままではなく値を加工して表示するときにどういう風にすると綺麗なのだろうという悩みです。

例えば、次のようなレスを表すテーブルのデータから、

[テーブル定義 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>

データベースから取ってきた値をそのまま出力するならこれで事足りますが、普通は、日付の書式は指定したい、名前がなかったら「名無しさん」としたい、メールアドレスはリンクにしたいなど、値を加工して表示をしたくなります。方法としては、

  • module や class 再定義で Resu クラスにメソッドを追加する。例えば、mail_uri など。
  • Resu をラッピングするクラスを作り、加工した値を返す同名のメソッドを定義する。例えば、def email; "mailto:#{@obj.email}"; end
  • amrita に渡すデータに加工を行う proc を混ぜる。

などが思いつくところですが、今一すっきりとした解答が見つかりません。。。この中では二番目が分かりやすいかなあ。

_ [Ruby] コマンドラインオプション その2 このエントリーを含むブックマーク

その値をプログラムで使うにはどうすればいいのか

組み込み変数 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 ただの配列ですので、要素を追加したり削除したりできます。また、個々の引数はただの文字列ですので、書き換えたりできます。一度変更してしまうと実行したばかりのときの初期値には戻せません。


最近のコメント:

  1. ただただし (01-16)

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