history

青木日記 RSS

<前の日 | この月 | 次の日>

2008-09-21

ping

生きてます。

ようやく終わりが見えたきた。気がする。

(00:31)

最近のプログラミング

さて、3ヶ月近く放置したことで この日記を見る人も激減していると思うので、 ここぞとばかりに適当なことを書き散らすことにする。

ふつぱいらのコンパイラがJavaなので、 最近家ではJavaばっかり書いている。 さんざんJavaで書きまくってると、 Javaも意外と悪くないなあと思うようになってきた。 先入観イクナイ。

でも Java 1.4 は本当にイクナイ。 generics のない静的型付きオブジェクト指向言語なんてありえん。 キャストの嵐がめどすぎる。 コンパイラも実は 1.4 対応なんだけど、Java 5 にすればよかった。 まさか 2 年以上かかるとは思ってなかったからなあ。

それとは対照的に C# は俺内評価が下がりぎみ。 Java ばっかりいじってたからかもしらんけど、どうも気に食わない。 もっとも、言語がというより IDE が気に食わない可能性も大。 メソッドが全部大文字で始まってるあたりが地味に嫌だ。 あと言語的には virtual を書かせるあたりが嫌だ。

一方、昼間は相変わらずシェルスクリプトばかり書いている。 シェルスクリプトもそれほど悪くないのだが、 500行を越えるとウンザリしてくる。 特に素の sh にはローカル変数がないので地獄を見る (見た)。 ksh であっても local があったりなかったりして嫌だ。 しかたないので防衛的に、 常に alias local=typeset を入れておかなければいけない。

それと、UNIX の常識的なルールに従う限りは問題ないのだが、 スペースの入ってるパスもちゃんと扱おうとか、 マルチバイト文字の入ってるパスもちゃんと扱おうとか、 そういう余計なことを考えるととたんにウザくなる。 local basedir="$(dirname "$(dirname "$0")")" とか書くのはもう疲れた。 何回クオートすればいいんだよ!

スペースやマルチバイト文字の入ってるパスなんて 実際にはないだろうと考えて無視したいところだが、 SUA (SFU) だとフツーにありうるから困る。 あの環境には心底ウンザリだよ。

最近のプログラミング (2)

そんなわけで結論としてはやっぱり Ruby がいいなあー、 ということになったのであった。 最近はちょっとしたツールくらいしか書いてないけど、実に楽だ。 each と map がサクッと書けるだけで感動できる。

もっとも、そのへんはシェルスクリプトでも意外と 同じようなことができるわけだが、 行より細かい単位の文字列処理がからむと Ruby が圧倒的に楽でいい。 awk とか sed とか cut とか expr とか駆使して チマチマ処理していると発狂しそうになる。

そもそも echo に移植性がない時点で泣ける。 こないだ発見したバグなんてひどかった。 "C:\WINDOWS\SUA\home\bwuser" っていうパスを echo すると "\b" がバックスペースになってしまうというバグ。 こんな感じのコードで発覚した。

echo ".export report file = `NativePath "$path"` > "$tmp"

この時は cat + ヒアドキュメントで回避できたのだが、 いつか回避できないときが来るような気がしてならない。 恐ろしい。

最近のプログラミング (3)

Ruby が楽だという話をするはずなのに、 気付くとシェルスクリプトに対する不満に変わっているのはなぜだろう。

やっぱねー、Ruby はいいよねー。 例外あるからエラー処理が楽だし、配列もハッシュテーブルもあるし。

ちなみにシェルスクリプトの嫌なところをもう一つ。 以下のコードで $stat が絶対に変化しない理由を述べよ。

#!/bin/ksh
 
main() {
     stat=0
     cat $file | procfile
     exit $stat
}
 
procfile() {
     if ! sed .....
     then
         echo "$0: error: sed failed" 1>&2
         stat=1
         return 1
     fi
}
 
main "#@"

ヒント: 次のコードなら $stat は変化する

#!/bin/ksh
 
main() {
     stat=0
     procfile < $file
     exit $stat
}
 
procfile() {
     if ! sed .....
     then
         echo "$0: error: sed failed" 1>&2
         stat=1
         return 1
     fi
}
 
main "#@"

そのてん Ruby ならこんな変な罠はないし、 オブジェクトを返せるから情報の受け渡しには苦労しない。

あと、仮引数だよな。 関数の仮引数を明示的に書けないのは非常に、非常に、非常によくない! ソースコードのわかりやすさが極端に下がる。

もちろん、もっと単純な、 スカッとパイプライン一本で解決するような話なら シェルスクリプトはめっちゃ楽なんだけどさ。 やっぱ根本的にシェルスクリプトに向いてない処理を やろうとしてる気がするな。 真剣に Java 化を考えよう。

(01:19)

AMD64のRIP相対アドレッシング

AMD64 はいいよねー。何がいいって、 汎用レジスタの本数が増えたことが一番だが、 RIP(プログラムカウンタ)相対アドレッシングが地味によい。 おかげで PIC でもグローバル変数アクセスが超簡単。 グローバル変数からのロードもこんなコードで一発ですよ。

movq    gv@GOTPCREL(%rip), %rax

x86だとサンクをcallしてスタックから 戻りアドレスを取って……と激しくめどい。

(02:31)

本日のツッコミ(全4件) [ツッコミを入れる]
hiroshi (2008-09-22 09:25)

安心しました。ーーーーーーー初歩の質問「Javaで何書いてますか?」

tntn (2008-09-25 03:02)

ふっぱいら、googleに聞いたが「ふつうのLinux」みたいなものと出た。いったい何なの?、青木さん、googleが答えられるように情報流してね!!切実な訴えです。本気!!

a-kan (2008-10-12 20:29)

有益なサイトです。青木さん頑張ってください。Ruby+@

a-kan (2008-10-12 20:30)

有益なサイトです。青木さん頑張ってください。Ruby+@

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS