BSDで生まれ、Linuxで発展したfortuneゲームをVisual C++でコンパイルしてWindowsで動くようにしたものです。このページでは、プログラムとデータがまとめられたZIPファイルをダウンロードすることができます。また簡単な説明も示します。
fortune-windows.zip

データファイルのみ(上記zipには含まれています。PCKをダウンロードした方でfortuneデータが必要な方のために用意したリンクです)


fortune入門


 fortuneパッケージには、fortune、randstr、strfile、unstr、rotの5つのプログラムが含まれています。これらのプログラムとデータファイルについて簡単に説明します。

fortuneデータの基本


 fortuneでおみくじを表示するためには、最低でも2つのファイルが必要です。1つはメッセージが格納されているテキストファイルで拡張子なし、もう1つは第1のファイルについての情報をまとめたバイナリファイルで、第1のファイルと同じ名前に拡張子.datを付けたものです。たとえば、cookieというメッセージファイルがある場合、cookie.datというデータファイルが必要になります。
 メッセージファイルのメッセージは、特定の1文字だけから構成される行によって区切られています。たとえば、オリジナルアーカイブに含まれているcookieファイルの冒頭は、次のようになっています。

"You know, of course, that the Tasmanians, who never committed adultery, are
now extinct."
- M. Somerset Maugham
%
"If it ain't broke, don't fix it."
- Bert Lantz
%
"The one charm of marriage is that it makes a life of deception a neccessity."
- Oscar Wilde
%

%のみの行で区切られていることがおわかりのことと思います。通常、区切り文字としてはこの%が使われます。
 一方、データファイルは4バイトのbig-endianの整数を並べた形になっています。そのうち、先頭の6個分の整数は、ヘッダ情報になっており、順にバージョン番号、メッセージ数、もっとも長いメッセージのサイズ、もっとも短いメッセージのサイズ、フラグ、区切り文字となっています。区切り文字とは、先ほどの例の%のようなものです。フラグについてはあとで説明します。7個目以降の整数は、個々のメッセージのファイル内での位置(ファイルの先頭から何バイト目にメッセージの先頭があるか)を示します。最後の数値は、ファイルの末尾を示します。

メッセージファイルディレクトリ

>
 実際には、オリジナルパッケージには無数のメッセージファイルが含まれています。これらのメッセージファイルは、通常のメッセージファイルとoffensive(攻撃的)なメッセージファイルの2種類に分類されています。UNIXでは、通常のメッセージファイル(および対応するデータファイル)が/usr/share/games/fortuneディレクトリ、offensiveメッセージファイル(およびデータファイル)が/usr/share/games/fortune/offディレクトリに格納されますが、このWindows版では、offensiveメッセージが通常メッセージディレクトリのoffサブディレクトリに格納されていれば、通常メッセージディレクトリはどこでもかまわないようになっています。環境変数FORTUNEDIRが指定されていれば、fortuneはそのディレクトリにメッセージファイルとデータファイルを探しに行きます。そうでなければ、カレントディレクトリでメッセージファイルとデータファイルを探します。メッセージファイルに対応するデータファイルは、かならずメッセージファイルと同じディレクトリに格納しなければなりません。

fortuneがメッセージファイルを選ぶ仕組み


 前節で説明したように環境変数FORTUNEDIRを設定し、メッセージディレクトリを用意すると、コマンド行引数によってfortuneがメッセージを選ぶファイルをさまざまに変えることができます。

引数なし 通常メッセージファイル群からメッセージを選びます。
-oオプション offensiveメッセージファイル群からメッセージを選びます。
-aオプション 両方のメッセージファイル群からメッセージを選びます。
ファイル FORTUNEDIRの特定のファイル(複数指定可)からメッセージを
選びます。
ディレクトリ FORTUNEDIRの特定のサブディレクトリ(複数指定可)に含まれる
メッセージファイル群からメッセージを選びます。
all FORTUNEDIRのすべてのメッセージファイル群からメッセージを
選びます。これだけを指定した場合には、引数なしと同じ意味に
なりますが、他のディレクトリと通常メッセージファイル群の
両方からメッセージを選びたいときには、これが役に立ちます。

なお、ファイル、ディレクトリ、allを指定したとき、その前に%記号付きの数値を挿入すると、そのファイル、ディレクトリが選択される確率を指定することができます。

fortuneのその他のオプション


 fortuneには、どのメッセージファイルを選ぶかを規定する上記のコマンド行引数のほかにも、いくつかのオプションが用意されています。

-eオプション 通常、特定のメッセージが選択される確率は、すべての選択対象
メッセージファイルのすべてのメッセージ数で1を除算した値に
なりますが、このオプションを指定すると、メッセージファイル数
とそのメッセージが含まれるメッセージファイルのメッセージ数の
積で1を除算した値になります。
-lオプション -nオプションで指定された長さよりも長いメッセージを表示します
(-nが指定されていない場合には160バイト)。そういうものが
なければ、もっとも長いいくつかのメッセージのなかから
適当なものを表示します。
-sオプション -nオプションで指定された長さよりも短いメッセージを表示します
(-nが指定されていない場合には160バイト)。そういうものが
なければ、もっとも短いいくつかのメッセージのなかから
適当なものを表示します。
-nオプション -l、-sオプションで長さを判断するための基準値を指定します。
-fオプション おみくじを表示せず、個々のファイル内のメッセージが表示される
確率を標準エラー出力に出力します。
-vオプション バージョンを表示します。
-?オプション
-zオプション このWindows版に追加されたオプション。

fortuneとrandstrの違い


 randstrも、メッセージファイルとデータファイルの対からメッセージを表示できます。しかし、randstrはfortuneの簡易版であり、fortuneが複数のメッセージファイルからメッセージを選択できるのに対して、randstrはコマンド行引数で指定された特定のメッセージファイルしか操作できません。コマンド行引数では、メッセージファイルとデータファイルのどちらを指定してもかまいません。このWindows版には、fortuneと同様の機能を持つ-zオプションが追加されています。また、ファイル名の後ろに数値を入力すると、そのファイルの指定された番号のメッセージ(先頭は0)を表示します。

データファイルを生成するstrfile


 メッセージファイルに対応するデータファイルは、strfileによって生成します。コマンド行引数として単純にメッセージファイル名だけを指定すると、メッセージファイルの区切り文字が%であれば、そのファイルに対応するデータファイルが生成されます。%以外の区切り文字を使っているメッセージファイルのデータファイルを作りたい場合には、

-c <区切り文字>

オプションを指定します。-sオプションを指定すると、通常なら表示される次のようなメッセージが表示されなくなります。

"cookie.dat" created
There were 1140 strings
Longest string: 1818 bytes
Shortest string: 11 bytes

 strfileは、少し凝ったデータファイルも作ることができます。先ほども触れたように、データファイルにはフラグフィールドがあります。フラグは3種類の値の組み合わせとして指定されます(どれも使わない0という値もあり得ます)。

1 ランダムな順番
2 アルファベット順
4 rot13処理を経たメッセージ

strfileに-o、-r、-xオプションを指定すると、これらのフラグが指定されたデータファイルを作ることができます。-rが1、-oが2、-xが4です。-rと-oの両方を指定した場合、-rは無視されます。-xと-r、-xと-oを指定した場合は、フラグの値はそれぞれ5、6になります。
 フラグ値が0のデータファイルでは、メッセージ位置を示す値は、小さいものから順に並んでいますが、1、2、5、6のデータファイルでは、順番にはなっていません。フラグ値が2、6のデータファイルは、メッセージをアルファベット順に並べ替えた新しいメッセージファイルを作ったときに、個々のメッセージが新メッセージファイルの先頭から何バイト目になるかを記述したものになります。もっとも、わざわざ新しいメッセージファイルを作らなくても、fortuneやrandstrは正しく動作します。ただし、-zで表示される順番は、新しいメッセージファイルにおける順番になります。-oオプションとともに-iオプションを指定すると、並べ替えのときに大文字と小文字を区別しなくなりますが、フラグ値は2または6で変わりません。
 フラグ値が1、5のデータファイルは、メッセージをランダムに並べ替えた新しいメッセージファイルを作ったときに、個々のメッセージが新メッセージファイルの先頭から何バイト目になるかを記述したものになります。わざわざ新メッセージファイルを作る必要がないこと、fortune/randstrの-zの順番が新メッセージファイルにおける順番になることは、2、6のデータファイルと同じです。ただし、-o、-ioオプションを指定したときにできるデータファイルはいつも同じですが、-rオプションを指定してできるデータファイルは、実行ごとに異なるものになります。

rotプログラムが行うrot13処理


 フラグ値が4、5、6のデータファイルは、メッセージファイルがrot13処理を経ていることを示しています。rot13処理とは、個々のアルファベットを13個前、または13個後ろの文字に置き換えるという初歩的な暗号化処理です。たとえば、Aなら13個後ろのN、Oなら13個前のBに置き換えます。rotプログラムを使えば、この暗号化処理を実行できます。rotは、コマンド行引数を一切取らず、標準入力を処理して標準出力に書き出すだけです。
 strfileで-xを指定してデータファイルを作っても、strfileはメッセージファイルに手を付けません。そこで、このデータファイルを使ってfortune、randstrを実行すると、出力がrot13されたものになってしまいます。ですから、このデータファイルで正しい出力を得るためには、rotでメッセージファイルを変換する必要があります。

C:\fortune> strfile -sx cookie
C:\fortune> ren cookie cookie.org
C:\fortune> rot < cookie.org > cookie

なお、offensiveメッセージファイルは、offensiveなメッセージが満載されていますので、メッセージファイルを誤って覗いても意味がわからないようにrot13処理するのがエチケットとされています。

データファイルに合ったメッセージファイルを作るunstr


 先ほど、-r、-oを指定すると、メッセージの並べ方を変えた新しいメッセージファイルに対応するデータファイルができると書きましたが、実際には新しいメッセージファイルを作る必要はないとも書きました。unstrを使えば、そのようなメッセージファイルを実際に作ることができます。ただし、そのようなメッセージファイルを作った場合には、あらためてstrfileを実行して新しいデータファイルを作らなければなりません。unstrは、コマンド行引数としてまず旧メッセージファイル名、次に新メッセージファイル名を取ります。また、

-c <区切り文字>

オプションを指定すると、新メッセージファイルの区切り文字が指定されたものに変わります。%以外の区切り文字を使ったメッセージファイルに対応するデータファイルを作るときには、strfileにも-cオプションを与え、同じ区切り文字を指定しなければなりません。また、unstrはrot13処理とは無関係です。つまり、フラグが4、5、6になっているデータファイルを作ってunstrを実行しても、生成されるメッセージファイルはrot13されたものにはなりません。rot13処理をしたいときには、rotを使ってください。

[フロントページ][技術翻訳][ソフトウェア][詩][Hypertext][その他]

mailto: webmaster@longtail.co.jp