掲示板お問い合わせランダムジャンプ

別のblogとか

2012年05月11日
patchコマンドのバグ?
今日、マラーティー語フォント(デーヴァナーガリーではない)の改良作業をしていたらpatchコマンドの変な挙動を見つけたので書き留めておく次第。

「foo.txt(元ファイル)から、bar.diff(パッチファイル)の内容に従ってbar.txtを生成する」という場合、
$ patch -o bar.txt < bar.diff
で良いように思える(bar.diffがUnified形式で、foo.txtにパッチを当てるよう書かれている場合)。しかし、
patching file bar.txt
Hunk #1 FAILED at 490.
Hunk #2 FAILED at 34817.
2 out of 2 hunks FAILED -- saving rejects to file bar.txt.rej
と、なぜか(この時点ではまだ存在しないはずの)bar.txtにパッチを当てようとしてしまう(この出力は実際に私が遭遇した例をもとにしている)。しかし、
$ patch -o baz.txt < bar.diff
のように出力先を変えると
patching file foo.txt
とだけ出力され、パッチは成功する。

なお、パッチファイルの最初
--- foo.txt 2012-05-11 11:53:30.454290300 +0900
+++ bar.txt 2012-05-11 15:50:26.057026200 +0900

と書いてあるところで、bar.txtを何かほかのファイル名に変えてやると
$ patch -o bar.txt < bar.diff
で正しくパッチされる。

◕‿‿◕「わけがわからないよ。どうして君たちはそんなに、ファイル名にこだわるんだい?」

[ 投稿者:芙蓉美晴 (MihailJP) at 17:10 | コーディング | コメント(0) | トラックバック(0) ]

2012年01月12日
複素数型と関数ライブラリ
色々あって複素数が必要な場面の場合、複素数をどう表現するのか、ということを調べてきました。

Perlの場合、use Math::Complex;すればよい。私の環境では既に入っていた。ただ、気になったのはprint i*i,"\n";の結果が[1,pi]と極形式になること。
なお、さっきのコードを見ればわかるように演算子は普通に実数で使っていたものが(オーバーロードされていて)使えるし、iと書けば虚数単位として認識される。
共役複素数を返す単項演算子は~である。use Math::Complex; $z=1+2*i; print ~$z;というコードを書けば、1-2iと、今度は直交形式で表示される。
ほかに、print sin(i);とか数学関数に複素数を放り込んでもちゃんと計算してくれるし(この場合は1.1752011936438iと表示された)、使いやすい。

Pythonの場合、複素数型がビルトインになっている。但し、虚数単位にはjを使う(数値の後ろに付けると、その数値は実数ではなく純虚数とみなされる)。特に何もせず、print 1j*1j;とだけすると、(-1+0j)と表示される。このように普通に四則計算もできる。
複素数における関数は、実数におけるmathに対応するものとして複素数ではcmathを使う。これは、Pythonの標準ライブラリである。import cmath; print cmath.sin(1j)とすれば、1.17520119364jという結果を得る。

Rubyは、実地で試してみようと思ったらうちのopenSUSEにはRubyがなかったのでsudo zypper install rubyした。リポジトリから持ってこれたバージョンは1.8.7である。
require 'complex'すれば複素数が使えるようになるのだが、どうやらRuby 1.9では、Complexクラスがbuilt-inになるようだ。require 'complex'; print Complex::I*Complex::I;の結果は、-1+0iとなる。ここで、Complex::Iは虚数単位である。
複素数の関数計算は、require 'cmath'すれば、Cmathモジュールで行えるようになる……はずなのだが、どうやら1.8系列にはこのモジュールはないらしい。math.rbすら入っていないし……どういうことなの。

PHPの場合は需要がない? のか、そんなライブラリはないようだ。かろうじて見つけたのがこれこれ

Javaの場合、標準ライブラリには入っていない。Jakarta Commonsにはあるらしいのだが……

VBやC#の場合、.NET Framework 4.0にはComplex構造体があるらしい。私が以前練習で作った関数電卓の場合は.NET 2.0で作ってたのでそんなものはなかった。

C言語だったら最近のバージョンはcomplex.hを使えばいい。

HSPにはそんなものはなかったので、作った
[ 投稿者:芙蓉美晴 (MihailJP) at 02:24 | コーディング | コメント(0) | トラックバック(0) ]

コマンドラインオプションをパースするライブラリ
例えば、lsコマンドに-lをつけて実行すると詳細情報が表示されるし、-aをつければドットファイルも表示される。-la とすればその両方を指定したことになる。
コマンドライン引数の取得自体はARGVとかのビルトイン変数なり関数なりを使えばいいんだけど、これをコマンドラインオプション(スイッチ)として認識するにはどうすればいいのか。いちいち専用のコードを組むのは大変だ、ライブラリがあるに違いない。

実際、あるようだ。以下、備忘録を兼ねて。

Rubyでは、OptionParserを使えばよい。OptionParser.new()でオブジェクト初期化し、OptionParser.on("-a")でコードを書くと良いようだ。--help--versionは別に登録しなくても使用できる。

Perlでは、Getopt::Longというモジュールが元から使用できるようだ。ほかに、Getopt::Compactというモジュールもあるらしく、そちらを使用する人もいる。

Pythonでは、getoptoptparseが標準添付されている。optparseのほうが簡便で使いやすいようだ。

C言語では、getopt()というライブラリ関数がある。長い形式を扱うためのgetopt_long()という関数もある(こっちはどうもGNU拡張らしい?)。

Javaにはそういうライブラリ関数が標準添付されていないらしい。しかし、ライブラリ自体はいくつかあるようだ。中にはC言語用の GNU getopt をJavaに移植したものもあった。

PHPの場合……PHPでコマンドライン、って正気か? と思ってましたが、よく考え直すとそれは私の考えが浅はかだっただけの様です。PHPにはいくつかの実装があるようです。Pearには4つパッケージがあるようで、Console_CommandLineが使いやすそうです。

HSPの場合……引数自体はdir_cmdlineで取得できるのですが、残念なことに個々の引数に分解するのも、-aのようなスイッチを認識したりするのも、自前でコードを書く必要があるようだ。
[ 投稿者:芙蓉美晴 (MihailJP) at 00:46 | コーディング | コメント(0) | トラックバック(0) ]