RFC2045 6.8 で定義されている符号化方式。
[A-Za-z0-9+/=] の65文字を使って符号化する。 = は padding 用の文字。
符号化された文字列は76文字以内でなければならない。 それ以上の場合は複数の行に分割する。
'/' が含まれているため、バイト列を符号化してファイル名にするといった用途には不向き。
RFC3548 The Base16, Base32, and Base64 Data Encodings 「4. Base 64 Encoding with URL and Filename Safe Alphabet」では、[A-Za-z0-9-_=] が使用される。
Perl では MIME::Base64 モジュールがある。
Memcached まわりをいじったので、キャッシュ具合をテストしていたら変な現象が。 WikiPage が表示されるべきところに、検索結果が表示されている。 あれ?
WiKicker では WikiPage のレンダリング結果も検索結果もキャッシュしているが、それぞれ別のキャッシュキーになるようにしている (WiKickerのバージョンを $V とすると、'$V:h:ページ名' と '$V:s:検索語')ので混ざるはずがないんだけれどな。 キャッシュしているデータの形式も違うし。
最初は Memcached まわりのアップデートで不具合がでたのかと思ったが、戻しても変わらない。ということは、ずっと以前からこの問題が発生していたのか。 やば。 設定でニックネームを設定している(cookie に保存している)と、その Web ブラウザに対してはキャッシュ機能が働かないようになっているので発見が遅れてしまった。
で結局コードをチェックしてみたら「WikiPage 表示と検索結果表示の View クラスを同じにしていたため、検索結果のレンダリングが WikiPage レンダリング結果と同じ領域にキャッシュされる」という風になってしまっていた。 ということで誰かがページ名で検索するとそれがキャッシュされてしまい、ページを読もうとしてもキャッシュ破棄されるまで検索結果が表示されてしまうというひどい状況になっていたと。
修正。
Memcached の出力をチェックしていたら、たまにエラーが起きていることを確認。 Memcached のプロトコルをチェックしたら、キーには制御文字と空白は使えないとある。 Cache::Memcached を見たらキーはそのまま through するだけ。 ということでページ名に空白が含まれている場合などの時には、まずい事になっていたようだ。 こちらは、キーを自前でエンコーディング(ページデータベースファイル名の作成に使っている base64 の亜種)するように修正。
Windows で「最後がピリオド(.)で終わるファイル名」を新規作成する。 最後のピリオド(ドット)が無くなる。
……。
8.3形式の名残なのか? Explorer 上で作成しても、プログラム(Perlスクリプト)から作成しても駄目。
環境は Windows XP Home Edition SP2 + NTFS。 Windows 2000 + NTFS でも同様。
これは WiKicker のテストをしていて気がついた。 WiKicker では「PageName の base64 を生成し 『/』 を 『.』 で置き換えたもの」をファイル名にしている。 例えば UTF-8 で「タ」は
44K/
となるので、ファイル名は 「44K.」となる。 で最後の文字が消えてしまうので、デコードするとおかしくなると。
これを機会に Windows 環境でのエンコーディングは RFC3548 「4. Base 64 Encoding with URL and Filename Safe Alphabet」を使うように変更するか。
本当は全てこれに変更したいのだけれど、すでに動いている WikiForum の事を考えると移行は難しいかも。
重要な事を忘れていた。
perl -MMIME::Base64 -e "print encode_base64('abc')" perl -MMIME::Base64 -e "print encode_base64('abI')"
先日のピリオド問題発覚以前に、Windows には大文字小文字を区別しないという問題があるんだった……。
今回のファイル名生成規則の見直しにあわせて、今までの WiKicker のデータベースをどう簡単にコンバートするかということをずっと考えていたのだが、そういうレベルではないな。
Windows 版と UNIX 系版は、ファイル名生成規則は別物でいっか。
[ MIME::Base64 ]
WiKicker では PageName を エンコードした文字列を URI に埋め込んだり、サーバで保存する際のファイル名にしたりしている。 このため、PageName の最長文字数はそれらの最長文字数に依存しているはずである。
今まで確認を後回しにしていたのだが、新しい機能の追加の際に確認しておく必要があるので調査してみた。
WiKicker の実装がらみとして最長を決める要素としては
がある。
上記の中ではファイル名による制約が一番大きい。
WiKicker 内部でファイル名として base64 (の亜種) でエンコードしたものを使っているので、元の文字列はは最長 189バイトまでなければならない。base64 だと3バイトで4文字になるため、189バイトで 252文字となる。
WiKicker ではここでさらにファイル名に ',v'、'-lock' をつける事があるので、実際には元の文字列は最長 186 バイトまでとなる。
PageName が 186 バイトまでだとすると、URL エスケープしたとして558バイト。 WikiEngine のスクリプトの URL や他のパラメータとあわせても、これぐらいなら大丈夫のはずである。
ということで WiKicker では Linux 上だと通常 PageName は 186 バイトが最長と言ってよさそうだ。 日本語の文字はだいたい UTF-8 で3バイトになるので、62 文字までということになる。
そのうち、WiKicker に制約チェックを入れることにしよう。 そのうち。
iA Writer の Web プレビューを Google ドキュメントに貼り付けて共有する方法で一緒に貼り付けられる画像はインターネット公開されているものだけなのがちょっと不便だった。iA Writer の Web プレビューのクリップボードコピーには画像データが直接含まれないため。
でいろいろ試したところ iA Writer 側で データ URL として画像を貼り付ければ、コピー & ペーストで Google ドキュメントに貼り付けられることが分かった。
画像データを base64 コマンドなどで base64 で符号化し、 Markdown ファイル上で

とすれば OK(image/png はメディアタイプに合わせる)。 iA Writer で Web プレビューで表示される。
とても長い URL なので文章中に直接含めておくのは不便。実際には img.png.txt など別のファイルに書いておいて
iA Writer の content block 機能を使って
/img.png.txt
のような形で include して実用するのが良さそうだ。ロケーションの中にファイルを置くことで検索にひっかかって不便な場合は、別のフォルダに置いて
../img/img.png.txt
のように相対指定かな。
[ ノート・日記はテキストファイルに ] [ Markdown で書いているノートを Google ドライブで共有する ]
Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。