nDiki : base64

base64

RFC2045 6.8 で定義されている符号化方式。

[A-Za-z0-9+/=] の65文字を使って符号化する。 = は padding 用の文字。

符号化された文字列は76文字以内でなければならない。 それ以上の場合は複数の行に分割する。

base64ファイル名

'/' が含まれているため、バイト列を符号化してファイル名にするといった用途には不向き。

RFC3548 The Base16, Base32, and Base64 Data Encodings 「4. Base 64 Encoding with URL and Filename Safe Alphabet」では、[A-Za-z0-9-_=] が使用される。

RFC4648 では base64url なども言及されている。

Perl

Perl では MIME::Base64 モジュールがある。

スポンサード リンク

2002年10月20日 (日)

WiKicker 実装

URI まわりと、DB まわりの実装すすめる。UTF-8 PageNameファイル名にマッピングするのに base64 を使おうと思ったら、符号化される文字に '/' が含まれているのか。 '.' に置き換えた変形 base64 にすればいいかな。

[ 10月20日全て ]

2004年6月5日 (土)

[ WiKicker ] キャッシュまわりにバグ

Memcached まわりをいじったので、キャッシュ具合をテストしていたら変な現象が。 WikiPage が表示されるべきところに、検索結果が表示されている。 あれ?

ページの内容が表示されるところに検索結果が

WiKicker では WikiPage のレンダリング結果も検索結果もキャッシュしているが、それぞれ別のキャッシュキーになるようにしている (WiKickerのバージョンを $V とすると、'$V:h:ページ名' と '$V:s:検索語')ので混ざるはずがないんだけれどな。 キャッシュしているデータの形式も違うし。

最初は Memcached まわりのアップデートで不具合がでたのかと思ったが、戻しても変わらない。ということは、ずっと以前からこの問題が発生していたのか。 やば。 設定でニックネームを設定している(cookie に保存している)と、その Web ブラウザに対してはキャッシュ機能が働かないようになっているので発見が遅れてしまった。

で結局コードをチェックしてみたら「WikiPage 表示と検索結果表示の View クラスを同じにしていたため、検索結果のレンダリングが WikiPage レンダリング結果と同じ領域にキャッシュされる」という風になってしまっていた。 ということで誰かがページ名で検索するとそれがキャッシュされてしまい、ページを読もうとしてもキャッシュ破棄されるまで検索結果が表示されてしまうというひどい状況になっていたと。

修正。

キャッシュキーのバグ

Memcached の出力をチェックしていたら、たまにエラーが起きていることを確認。 Memcachedプロトコルをチェックしたら、キーには制御文字と空白は使えないとある。 Cache::Memcached を見たらキーはそのまま through するだけ。 ということでページ名に空白が含まれている場合などの時には、まずい事になっていたようだ。 こちらは、キーを自前でエンコーディング(ページデータベースファイル名の作成に使っている base64 の亜種)するように修正。

[ 6月5日全て ]

2005年4月19日 (火)

最後がピリオド(.)で終わるファイル名をつけられない

Windows で「最後がピリオド(.)で終わるファイル名」を新規作成する。 最後のピリオド(ドット)が無くなる。

……。

8.3形式の名残なのか? Explorer 上で作成しても、プログラム(Perlスクリプト)から作成しても駄目。

環境は Windows XP Home Edition SP2 + NTFSWindows 2000 + NTFS でも同様。

WiKicker

これは WiKicker のテストをしていて気がついた。 WiKicker では「PageNamebase64 を生成し 『/』 を 『.』 で置き換えたもの」をファイル名にしている。 例えば UTF-8 で「タ」は

 44K/

となるので、ファイル名は 「44K.」となる。 で最後の文字が消えてしまうので、デコードするとおかしくなると。

これを機会に Windows 環境でのエンコーディングは RFC3548 「4. Base 64 Encoding with URL and Filename Safe Alphabet」を使うように変更するか。

本当は全てこれに変更したいのだけれど、すでに動いている WikiForum の事を考えると移行は難しいかも。

[ 4月19日全て ]

2005年4月21日 (木)

base64 亜種でのファイル名生成と、Windows

重要な事を忘れていた。

 perl -MMIME::Base64 -e "print encode_base64('abc')"
 perl -MMIME::Base64 -e "print encode_base64('abI')"

先日のピリオド問題発覚以前に、Windows には大文字小文字を区別しないという問題があるんだった……。

今回のファイル名生成規則の見直しにあわせて、今までの WiKickerデータベースをどう簡単にコンバートするかということをずっと考えていたのだが、そういうレベルではないな。

Windows 版と UNIX 系版は、ファイル名生成規則は別物でいっか。


[ MIME::Base64 ]

[ 4月21日全て ]

2006年6月10日 (土)

WiKicker における PageName 最長文字数

WiKicker では PageName を エンコードした文字列を URI に埋め込んだり、サーバで保存する際のファイル名にしたりしている。 このため、PageName の最長文字数はそれらの最長文字数に依存しているはずである。

今まで確認を後回しにしていたのだが、新しい機能の追加の際に確認しておく必要があるので調査してみた。

WiKicker実装

WiKicker実装がらみとして最長を決める要素としては

がある。

仕様等による制約

  • HTTP では URI の長さには制限なし (RFC2616 3.2.1)
  • Web サーバは Request-URI が長いと 414 Request-URI Too Long を返す (RFC2616 10.4.15)。Apache は LimitRequestLine ディレクティブにより、URI を含むリクエスト行のサイズを制限することができる(配布時には 8190)。
  • Internet Explorer が扱える URL の長さは 2083文字。
  • ext2ファイル名は 255文字まで(増やすこともできる)。
  • 手元の Linux 2.6.15 で試したところ、パス名は 4095文字まで。

WiKicker で問題が出ない PageName 最長文字数

上記の中ではファイル名による制約が一番大きい。

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 に制約チェックを入れることにしよう。 そのうち。

[ 6月10日全て ]

2011年1月29日 (土)

今日のさえずり: お年玉付き年賀はがきの当選番号チェックしました。全滅でした!

2011年01月28日

2011年01月29日

[ 1月29日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィでマネージャー・プロダクトオーナーをしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

follow us in feedly

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.332951s / load averages: 0.48, 0.45, 0.47
nDiki by WATANABE Yoshimasa (Naney, Google profile)
Powered by DiKicker