Hatena::ブログ(Diary)

GANAwareはてな版 RSSフィード

2010-03-11

日本語 diff モドキ

ぐぐっても見つからなかったので、日本語文字コードの違いを無視してくれる diff へのラッパーを書いてみました。

http://dl.dropbox.com/u/1340991/diffja/diffja.txt

内部で gnu diff を呼び出しますので、パスの通ったところに diff が必要です。また、実行には Ruby 1.8.x か 1.9.x が必要になります。

-r オプション (recursive)、--from-file オプション、--to-file オプションが指定されている場合は日本語関連の処理はせず、オリジナルdiff と同じ動作になります。

使用例

$ svn diff hoge.txt

としたときに、以前のバージョンhoge.txt は CP932 で記述されていたのに、現在hoge.txt は UTF-8記述されており、文字コード以外の違いを観察しづらい場合

$ svn diff --diff-cmd diffja hoge.txt

とすることで、文字コード以外の違いのみを表示することができます。*1

*1:もともとこの用途のために作ったラッパーですので、それ以外の用途についてのテストはほとんどしていません

2008-04-17

sh のリダイレクト

一度理解してもすぐに忘れて混乱するのでメモ

$ command 2>&1 >hoge

このコマンドラインを実行すると command標準出力(1)は hoge へ書かれ、command標準エラー出力(2)は画面に出力される。


間違った理解をしている時は、頭の中では配管工事*1イメージしている。

通常の配管は次のようになっている。

0──→0
1──→1
2──→2

以下のコマンドラインを実行すると、

$ command 2>&1 >hoge

2>&1 の部分で 2 から 1 へ配管工事が行われ

0──→0
1─┬→1
2─┘  2

となり、次に >hoge の部分で

0──→0
1─┬→hoge
2─┘  2

となるという誤った理解をしてしまう。


正しい理解は、駅のホームの番号と、電車の行き先というイメージ

通常は、ホームの番号とそのホームに入ってくる電車の行き先は次のようになっている。

(ホームの番号:「電車の行き先」)
0:「キーボード」
1:「画面」
2:「画面」

以下のコマンドラインを実行すると、

$ command 2>&1 >hoge

2>&1 の部分で 2 番線の電車の行き先は、1 番線の電車の行き先と同じになる。

0:「キーボード」
1:「画面」2:「画面」 ← 1 番線の電車の行き先と同じなる*2

次に >hoge の部分で 1 番線の電車の行き先を hoge に変更する*3

0:「キーボード」
1:「hoge」 ← 行き先が変更される
2:「画面」

したがって、command標準出力(1)は hoge へ書かれ、command標準エラー出力(2)は画面に出力される。


上記のコマンドラインと似て非なる次のコマンドラインの場合、

$ command >hoge 2>&1

>hoge の部分で 1 番線の電車の行き先を hoge に変更する。

0:「キーボード」
1:「hoge」 ← 行き先が変更される
2:「画面」

2>&1 の部分で 2 番線の電車の行き先は、1 番線の電車の行き先と同じになる。

0:「キーボード」
1:「hoge」
2:「hoge」 ← 1 番線の電車の行き先と同じなる

したがって、command標準出力(1)と標準エラー出力(2)はどちらも hoge へ書かれることになる。


ちゃんと調べてないが

  • a>&b は dup2(b, a);
  • c>filename は fd = open("filename"); dup2(fd, c);

*1:「|」の名前がパイプであることに影響されているかもしれない

*2:もともと同じなので変化しない

*3:>hoge は 1>hoge と同じ意味である

2008-04-11

コマンドラインでのZip自己解凍書庫(SFX)の作り方メモ

Debian などの UNIX 系 OS:

zip と unzip のパッケージが必要

% zip -A hoge.zip hoge.txt &&
  cat /usr/bin/unzipsfx hoge.zip > hoge &&
  chmod a+x hoge

Cygwin:

zip と unzip のパッケージが必要

% zip -A hoge.zip hoge.txt &&
  cat /usr/bin/unzipsfx.exe hoge.zip > hoge.exe &&
  chmod a+x hoge.exe

Windows:

Info-ZIP Home Page の unz552xN.exe と zip232xN.zip を利用

C:\> zip -A hoge.zip hoge.txt
C:\> copy /b unzipsfx.exe+hoge.zip hoge.exe
  • 最初に hoge.zip を作成する時に -A を付け忘れた時は、最後の実行可能ファイルに対して zip -A hoge.exe とすれば良い
  • 暗号化Zipを解凍できるようにするには unzipsfx を自分でビルドしなおす必要がある
  • たぶん zip を使うより rar や 7-zip を使うほうが簡単で、しかも高圧縮率のものができると思います