ここでは、fortuneパッケージに含まれるstrfile、unstr、rotについて説明します。
メッセージファイルに対応するデータファイル(拡張子.dat)は、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オプションを指定してできるデータファイルは、実行ごとに異なるものになります。
フラグ値が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処理するのがエチケットとされています。
先ほど、-r、-oを指定すると、メッセージの並べ方を変えた新しいメッセージファイルに対応するデータファイルができると書きましたが、実際には新しいメッセージファイルを作る必要はないとも書きました。unstrを使えば、そのようなメッセージファイルを実際に作ることができます。ただし、そのようなメッセージファイルを作った場合には、あらためてstrfileを実行して新しいデータファイルを作らなければなりません。unstrは、コマンド行引数としてまず旧メッセージファイル名、次に新メッセージファイル名を取ります。また、
-c <区切り文字>
オプションを指定すると、新メッセージファイルの区切り文字が指定されたものに変わります。%以外の区切り文字を使ったメッセージファイルに対応するデータファイルを作るときには、strfileにも-cオプションを与え、同じ区切り文字を指定しなければなりません。また、unstrはrot13処理とは無関係です。つまり、フラグが4、5、6になっているデータファイルを作ってunstrを実行しても、生成されるメッセージファイルはrot13されたものにはなりません。rot13処理をしたいときには、rotを使ってください。