読者です 読者をやめる 読者になる 読者になる

Folioscope

プログラミング/Unix系/デザイン/CG などのメモがもりもり

Twitterの文字数制限の緩和で気軽にパッチが送れる

Twitterの文字数制限が10000文字になるのではと盛り上がってますが、これが実現されるとTwitterでバグ報告だけでなく、気軽にパッチも送れそうです。 そこでTwitterでパッチまで送れるか調べてみます。 Gitプロジェクトのリポジトリの各コミットからパッチを生成して、 どのくらいのサイズのパッチがTwitterで送れるのか集計してみました。

パッチを生成

Gitにはファイルの差分、コミットメッセージ、作者などの情報を、ひとつのパッチファイルにまとめる git format-patch コマンドがあります。 今回は各コミットから1パッチを作成します。 git rev-list で全てのリビジョンのリストを取得して、git format-patch でパッチを生成します。

for r in $(git rev-list HEAD); do git format-patch -1 $r; don

HEADが 7548842 の状態で、 41633のコミット数なので、対象となるパッチ数も41633となります。

10000文字以内のパッチ

生成した41633のパッチから,10000文字以下のパッチを数えます。 その数は,39344/41633 でした。 この時点で9割以上のパッチが送れることがわかります。 なお10000文字以下の最大のパッチは3つあり、 39598f97b3b151cca5d94 です。 しかしまだ圧縮の余地があるので、パッチを圧縮してみます。

パッチを圧縮する

パッチを一度gzipで圧縮し、圧縮されたバイナリをBase64でASCIIの文字に変換します。

gzip -9 < your_change.patch | base64 >encoded_patch

このトリックを使うことで、圧縮されたバイナリ情報もTwitterで送ることができます。 圧縮・Base64エンコードされたファイルを元のパッチファイルに戻すには、その逆を適用するだけです。

base64 -d < encoded_patch | gzip -d > your_change/patch

ただしBase64によりバイナリ情報がおよそ(4/3)倍になるため、gzipで(3/4)未満のサイズにならないと効果は得られません。 とはいえテキストファイルは基本的に圧縮率が高いので、ファイルサイズが大きくなるにつれて圧縮率が良くなります。 この方法で、Base64後に10000文字以内となったパッチの数は、40859/41633 となりました。 98%のパッチをTwitterで送ることができました。

10000文字以下の最大のパッチは、 1a9d15d でした。このパッチは、圧縮前は27776文字なので、元の半分以下のサイズまで圧縮できました。

Base65536

Twitterで扱う文字はUnicodeです。 ASCIIの1文字もUnicodeの1文字も同じ文字数とカウントするので、1文字あたりの情報量が多い文字を使うとお得です。 2オクテットの文字を65536文字使ってエンコードする、base65536というのがあります。 1文字あたり2バイトなので、20000バイトまでのバイナリをTwitterで送ることができます。 gzip圧縮後のバイト数が20000バイト以下のパッチは、41317/41633でした。 99%のパッチをTwitterで送ることができました。

20000バイト以下の最大のパッチは、 5e9637c でした。 このパッチは圧縮前は64935文字なので、3分の1程度まで圧縮できました。

パッチ以外に

パッチ以外にも、任意のバイナリデータを印刷可能文字に変換することで、Twitter上で送ることができます。 そのサイズは、gzip + base64 なら7.2kBちょっと、Base65536なら20kBまで送ることができます。 Googleのロゴ画像で5.7bytes、slの実行ファイルが14kByteほどなので、簡単なファイルならTwitterで発信できますね。