Dwarf Standing on the Shoulders of Giants

If I have seen further it is only by standing on the shoulders of giants. by Issac Newton

2010年1月30日

sed

この記事で、コードを書くときにタブは expand したはいいが、 <, >, & をエスケープし忘れて、意味不明なコードになってしまった。

修正するにあたって、またワンライナーを書こうと思ったが、よく考えるとこれからも結構使うので、ファイルに残しておくことにした。

#!/bin/sed -f

s/\&/\&amp;/g
s/</\&lt;/g
s/>/\&gt;/g

このコードも、早速このスクリプトでエスケープしてある。

ラベル:

LL プログラミング

つい先日、ヒストグラムを作る用事があったが、 gnuplot には生データをヒストグラムに変えてくれる機能はついていないので、自分で作ることにした。最初はワンライナーで書いていたのだが、根本のアルゴリズムが sort して uniq するというものであったので、データ数が多くなると遅い。それ以上に、ヒストグラムを規格化したくなったので、そうすると総和を求めて後からそれで割るわけだから、ループを二回回さなくてはならず、そもそもワンライナーでは書けない。そういうわけで、自分でスクリプトを書くことにした。

スクリプトを書くにあたって、まあアルゴリズムとかもそりゃ大事なのだろうが(データ構造はたぶんスクリプトの場合ほとんど問題にならないはず)、何よりも大事なのは言語の選択だと思う。自然言語でも Sapir-Whorf だとか言われるが、プログラミング言語においても全く同様で、言語がプログラミングパラダイムを非常に強く規定するので、それを通してプログラマの思考も支配されることになる。

とりあえずデータ処理をするにあたって、一番最初に考えるべき選択肢は awk だと思う。が、この場合はループを二回回す以上、 awk は却下。次に、 Coreutils とワンライナーの awk や ruby 等を使って簡単に書けるならば、シェルスクリプトを検討すべき。だが、この操作ではループを回したりデータを配列変数に貯めたり四則演算をしたりといった操作が必要になる。ならば、シェルスクリプトは却って面倒であろう。そうなると選択肢は perl か ruby となる( Python は自分が使えない/使う気がないので最初から却下)。ここでは標準入力をいじったり、あるいはオプションを getopts を使って処理したい。そうすると perl の方が向いている気がする(そう考えて書いたが、よくよく考えると ruby の方が簡単だったかもしれない)。

コードはこんな感じ。最初はワンライナーから始めたが、エラー処理等つけるとこんなにタイプ量が多くなってしまった。少し負け組な気がする。

#!/usr/bin/perl

use     POSIX;
use Scalar::Util qw( looks_like_number ); 
use     Getopt::Std;

getopts("nk:b:e:",\%opt);

print   keys %_;

if(exists $opt{k})
{
        $split  = 1;
        $key    = $opt{k}-1;
}
else
{
        $split  = 0;
}

if(exists $opt{r})
{
        $isreg  = 1;
}
else
{
        $isreg  = 0;
}

($unit,$input)  = @ARGV;
unless( looks_like_number($unit) && $unit>0 )
{
        print   STDERR  << "END";
histogram [-kbe] unit [input]
  -n       :    normalization
  -k <key> :    key
  -b <val> :    begin value
  -e <val> :    end value
END

exit    1;
}

if( $input eq "" ){     $input  = "/dev/stdin"; }

open( FIS, $input );
@list   = ();
while(<FIS>)
{
        chomp;
        if( $split )
        {
                @temp   = split /\s+/;
                $_      = $temp[$key];
        }
        push( @list, $_ );
}
close( FIS );

foreach (@list)
{
        $hashkey        = floor($_/$unit)*$unit;
        $hash{$hashkey}++;
}
@hashkeys       = sort { $a <=> $b }    keys    %hash;

if( looks_like_number($opt{b}) ){       $begin  = $opt{b};      }
else{   $begin  = $hashkeys[0]; }
if( looks_like_number($opt{e}) ){       $end    = $opt{e};      }
else{   $end    = $hashkeys[-1];        }
if( $begin > $end ){    print   STDERR  "Strange begin/end value\n";    }


for     ( $i = 0 ;  ; $i++ )
{
        $_      = $i*$unit+$begin;
        if( $_ > $end ){        last;   }
        unless( exists $hash{$_} ){     $hash{$_}       = 0;    }
        if( $isreg ){   $hash{$_}       /= $#list;      }
        print   "$_\t$hash{$_}\n";
}

ちなみに、自分のコーディングスタイルはタブを多用するもの。こうやって expand で開くとかなり見にくい。

シェルスクリプトを使ったものとしては、こういうのが気に入っている。どうせ platex は2回実行して、その後に dvipdfmx を実行して、最後にファイルを開くのは決まりきっているのだから、こういうスクリプト。

#!/bin/zsh

isslide=0
while   getopts s       OPT
do
        case $OPT in
        "s" )   isslide=1;shift
        esac
        if      [ $# -eq 1 ]
                then
                        break
        fi
done

arg=`dirname $1`/`basename $1 .tex`


platex  $arg
platex  $arg

if      [ $isslide -ne 0 ]
        then
                dvips -z -f     $arg | bkmk2uni >$arg.ps
                cjkps2pdf       $arg.ps
        else
                dvipdfmx -f dl-14.map   $arg
fi

gnome-open      $arg.pdf        1>/dev/null     2>/dev/null &

ちなみに、オプション -s はスライド作成に powerdot を使い、 dvipdfmx が使えないときのため。

やはりプログラミングをしていて一番楽しいのは ruby で、気に入っているのはこのようなコード。たくさんある研究室のサーバのうち。一体どれが空いているのかを調べるのはかなり面倒なので、こういうスクリプトを書いた。

#!/usr/bin/ruby

servers = [ 'foo', 'bar', ... , 'hoge' ]  #server's names in the lab
servers.each    do      |server|
        print   "#{server}:\n"
        print   `ssh #{server}  ps axu|gawk '{sum+=\$3}END{print sum}'`
end

もちろんほぼ同じタイプ量で同じ内容のコードを perl でも書けるが、なぜか ruby の方が楽しい。途中に awk を使っているのもミソ。

ラベル:

2009年11月28日

sprintf

Gnuplot に sprintf 関数あったのか。例えばこんな風に、フィットさせて得た値を凡例に直接入れることができて便利。


f a*x+b "data.dat" via a,b
p "data.dat" t "data", a*x+b t sprintf("%f x + %f", a, b )
ちなみに、 Gnuplot に詳しくない読者のために補足しておくと、 Gnuplot では、よく使う文字列を例えば以下のように略記ができます。
plotp
fitf
usingu
titlet
withw
linepointslp
yerrorbarsye
その他、他にもあるので適当に自分で試してみてください。

こういったことは全部(略記はなかったような気がするけど)、竹野研のページに書いてある。 Gnuplot に慣れたあたりで一度は読んでみると、今まで知らなかった機能を知れてビックリするかもしれない(自分も1年半くらい前に逆数プロットがしたくなって、 using (1/$1) とかやるだけでできることを知ったときはビックリした)。もっとも、そんなに深く機能を知らなくても適当に使えることもまた、 Gnuplot の懐の深さだと思う。

本題とは関係ないが、上の表で border-collapse を指定するとなぜか表の外枠が消えて表示されるのは Firefox のバグ? 他のブラウザでは面倒で見る気になれない。

ラベル:

2009年11月21日

GNU/Linux 環境

現状で使いこなせる(と思い込んでいる)ツール・言語・ライブラリetc
  • C++(0x対応コンパイラを待ちわびている信者なので)

  • Warning: getimagesize(/virtual/spt27/public_html/texpng/0b6b708d8aea0157495e13a2f3987a6e.png): failed to open stream: No such file or directory in /virtual/spt27/public_html/bin/texpng.php on line 152
    \end{align*}\LaTeX\begin{align*}関連諸ツール( platex とか dvipdfmx とか、 Word も PowerPoint も、ましてや OpenOffice なんて使う気がしないので必須)
  • gnuplot (usingとかsetを使いこなせるようになると飛躍的に便利になる)
そこそこ使えるが、まだまだ勉強が足りないツール・言語・ライブラリetc
  • AWK (たぶん文法はほとんど知ってるけど毎回忘れる、これさえあれば数値実験のデータ解析は大体用が足りて、 Excel はほとんど不要)
  • Ruby (まだまだ勉強中)
  • PHP (研究には絶対使わないし、大規模システムは絶対 PHP では組みたくないけど、このサイトとかちょっとしたウェブアプリには便利)
  • XHTML (文法はほとんど忘れてる、別に勉強したところで得るものは W3C に準拠しているという満足感だけだろうけど)
  • CSS (同上)
  • boost (C++信者には欠かせないライブラリ)
  • make (これも研究で必要になることはないだろうけど)
  • gdb (効率的に使えるようになるとデバッグが進んでうれしいな)
  • ssh (自分の知らない機能が大量にあるはず)
  • apache (研究で Web サーバ立てることなどまずない)
  • Coreutils (コマンド使いこなせるようになるとちょっとスキルアップした気がする)
  • Emacs (完璧に gEdit っぽいキーバインドになるのなら便利なエディタだけど)
  • vim (こっちはキーバインドどころではないが、使いこなせたら便利そう)
  • zsh (「漢のシェル」だが、機能が多すぎてぜんぜん全体像までたどり着けない)
ほとんど使えないが勉強してみたいツール・言語・ライブラリetc
  • R (統計関数が山ほど入っているのがうれしい、どうでもいいが一語の命名は検索にかからないからやめて)
  • subversion (数値実験のソースをバージョン管理した方がいい気がしてきた)
  • gprof (性能解析も今後必要になるだろうな)
  • JavaScript (その気になればすぐ習得できるだろうけど面倒なので労力を割かない)
  • SWIG ( Ruby と C++ を一緒に使えるのはかなり魅力的)
  • autoconf (まあ、研究で使う機会は皆無だろうね)
  • bison, flex (同上)
  • as (コンピュータを使うものの教養程度には…… アセンブラ使った方が早くなる計算処理とかあるのかなあ)
  • Postfix (まあ、サーバ立てる機会があれば)
  • GSL (数値計算やるものとしては魅力的だが如何せん言語が C だし)
  • GTK++ ( X プログラミングで、計算結果を画像で見れるとうれしい)
  • OpenGL (3次元の数値計算では、やっぱりこういうので絵で見られればいいな)
  • ImageMagickconvertしか使えません)
  • ghostscript ( TeX やってると、関連ソフトにはお世話にはなるけど)
  • XSL (昔真面目に使ったことはあるけど、もはや完全に忘れてしまった)
そこそこユーザはいるものの今更使う気にならないツール・言語
  • FORTRAN (この業界未だにいるよね、自分で使ってる分にはいいけど何も学生に教えなくてもいいのにと思う)
  • C (例えクラスもテンプレートも使わなくても、 C++ を better C として使った方が圧倒的によい)
  • Java (中間言語って、こういうことやってるとあらゆる意味で中途半端)
  • Perl (読みにくさは犯罪的、 zsh 以上 ruby 以下の作業があればもしかしたら使うかもしれないけど)
  • Python (一面的な価値観の押し付けは嫌い、そういう意味で Ruby も同等だけど、あっちの方がだいぶマシ)
  • bash その他シェル( zsh に勝てるところってあったっけ? 軽さ?)

なんか XHTML とか JavaScropt とかが場違いな気がするけど、まあいいや。

ラベル:

2009年11月19日

(int)

例えば、1/2が0として(意に反して)認識されるというバグはよく埋め込まれる。今日ちょうどこれで数週間悩んでいたのが発覚して、あまりの呆気なさに愕然とした。指摘されればすぐ気づくバグではあるが、なかなか自分では気づかないのが悲しい。

ところが、これも同じく今日気づいたのだが(これで悩んだのは数十分)、こちらはどう考えても言語設計が悪いだろうという罠。


container<double> x; // 0 <= x[i] < 1
std::cout << std::accumulate(
 x.begin(),
 x.end(),
 0,
 std::plus<double>()
) << std::endl;
// prints 0.

期待した結果が欲しければ、以下のようにせねばならない。


std::accumulate(
 x.begin(),
 x.end(),
 0.0,
 std::plus<double>()
)

そう、std::accumulateは第3引数で型を推論しているので、第4引数にどんな関数オブジェクトを指定しても出力は第3引数の型となる。これは非常に厄介だ。まあ、実装する側になって考えれば、この罠を回避するうまい術は思いつかないのだが。

ラベル:

2009年11月9日

Pileon

先週の日曜、UbuntuをJauntyからKarmicにアップデートした(検索に引っかかるようにUbuntu 9.10とも書いておこう)。GCCは4.4.0が標準なようなので、C++-0xのautoを使いたいがために野良ビルドしたGCC4.4.0を削除する(でも4.5が出たらLambda使いたいがためにまた野良ビルドすることになると思う)。zshも4.3.10にアップデートされているな(RPROMPTに`zsh --version`を表示しているのですぐに気づく)。Open Officeもアップデートされているようだが、ほとんど使わないので気にしない。GCCの他に野良ビルドしているアプリケーションといえばpteTeXなのだが、LiveTeXの方はUTF-8のソースコードに対応しているのだろうか。対応しているようならそちらもCanonicalの方のパッケージに戻してもよいんだが(誰か情報ください)。先週の日曜は音が出ない問題等々に忙殺されてしまった。

フリーセルをしようと思ったらない。一瞬焦ったが、AisleRiotソリティアを初めて開いてみたら、そちらに収録されていた。山ほどゲームがあるので色々やってみた。個人的には完全情報ゲームの方が好き(なのでWindowsを使っていた時代にもソリティアはほとんどやらなかった)だが、その中でも特に面白いと思ったのがPileon。日本語ではピレノンと書かれているが、どう考えても音写ミスだろうな。意味から考えても"Pile on"ととるべき。

最初は全然クリアできなかったが、だんだんコツを掴んできた。ほとんどの場合、最初の数手、つまり空きスペースにどれを置くかでそのゲームをクリアできるか否かが決まる。始めてすぐは、**Xの形の山と**XXの形の山ができてしまうせいで手詰まりになるケースが多かったので、それを避けることくらいは学んだ。

それにしても、RhythmBoxとかPidginとか、画面右上に表示されるポップアップ(って呼び名でいいの?)のフォントって変えられないの? なんかKarmicにアップデートしたらフォントがセリフ体に変わってしまった。これに関しても情報持ってる方がいたらお願いします。

Windowsは良くできてますよ。

自分が(多少Windowsより不便なところがあっても)Linuxを使うのは、研究やる上で空気のようにUNIX環境を使いたい(使う必要がある)から。その辺、Mac OS Xでもまあいいんだけど、WindowsでCygwinはあまりにストレスがたまる。まあ、でもDTMやるときはWindows使ってるけどね。一応WindowsとUbuntuの両方で使う可能性のもっとも高いFirefoxはプロファイル共有してる。

ラベル:

2009年10月30日

Enjoy programming

Enjoy Programmingとかいう割には、Rubyは細かいところで手が届かない。特に、イテレータは大好きで、よく使っているんだけど(C++にもさっさとLambda入らないかなあ……0xは10進法じゃなさそうだし)、ちょっとやはり物足りない。each_with_indexが入ったのも1.9でようやくだし、てかmap!とかにも実装してほしいんですけど。この類のメソッドはeach_with_indexの挙動をデフォルトにして、|item,i|のiをオプションにすればいいのに。

あと、


std::transform(
 InputIteratorBegin,
 InputIteratorEnd,
 OutputIteratorBegin,
 UnaryFunctor
);

OutputArray = InputArray.map { |x| Sentence }
とか書けるけど、

std::transform(
 InputIterator1Begin,
 InputIterator1End,
 InputIterator2Begin,
 OutputIteratorBegin,
 BinaryFunctor
);
はどうすんの? 全般的にもうちょっとこの辺関数型プログラミング的にならないかなあ。

全然話は変わるが、AWKは使えるときには超便利。しかし、たまにしか使わないから書く度に文法忘れてるので、毎回文法調べて書いてる。そしてそんなAWKをRubyから(別にperlでもPHPでもいいけど)簡単に呼び出せる``演算子はもっと超便利。

ちなみに、研究室のサーバに自動認証かけられなかったのは自分の手違いでした。

ラベル:

2009年10月25日

Log

このサイトのログを見るのが楽しい。アクセス解析された結果を見るのもいいが、やっぱり一番面白いのは生ログ。こんなこと書いてるとストーカーじみてるように思われるかもしれないけど。

おそらく知人と思しきログや、熱力学・統計力学の記事に関して検索してきたログ(うちを含んだ大学からのアクセスが多い)が多い。中には教科書とか書いている偉い先生かもしれないログも(でも、他のページ見ずにすぐ帰ってるから別人かもしれない)。

OSはやっぱりWindowsが多いけど、Macもそこそこいる。Linux使ってるのは自分くらいかと思ってたら、どうやら他にもLinuxの閲覧があった。ブラウザはWindowsはIEが多い(あんなブラウザ、よく使う気になれるなと思うけど)が、2番手はChrome、意外。その後にFirefox。なんと懐かしきネスケのログもあった。MacユーザはSaafriとFirefoxが大体同数。

ちなみに、Adsenseのクリック数は0。まあ、別に期待なんか最初からしていないが、それにしてももう少し物理関係の広告だしてほしいな。

ラベル:

2009年10月16日

研究テーマ

昨日は、研究室セミナー(自己紹介)と歓迎会があった。自己紹介(研究の概要紹介)はさすがによく分からない。歓迎会ではとある大先生の武勇伝(研究室でキレて醤油ブチまけたとか)が聞けた。ほかにも「あの人は一時期株にはまってた」とか「この人は偏見が強いからなあ」とか。M1の先輩によると熊本ラーメン(今年度秋の物理学会は物性は熊本)はまずかったらしい。

今日は師匠と面談して、研究テーマ決め。5つ考えてこいとの難題で、2つは内容を詰められたが3つは苦し紛れ。結局苦し紛れな方の3つは捨てて、残り2つの、反応速度論を非平衡から真面目にやるか、超流動(超伝導)の輸送係数の消失を非平衡で真面目に出すかというところに決定。まずはこの2本立てでやってみて、あとで絞ろうという話に。

とりあえず、今日は疲れたから自分の手は動かさずにまずは勉強。現象論としてGinzburg-Landau理論を調べてみる。巨視的波動関数って何じゃ一体。まずは現象論を抑えて、次に先学期聴いた院の講義(最後フェードアウトしてしまったけど)にも出てきたBCS理論、Bogoliubov理論で平衡統計力学の範疇の理解をしなきゃ。あと、線型応答も極めて怪しいので、応答係数と時間相関関数の関係とかKubo公式の導出あたりは土日にやっといた方がいいかもしれない。

そんなこと考えてると気が滅入ってくるので、研究室のサーバの設定もしてみようと思い、まずはSSHでログイン。authorized_key2をSCPで送ってみる。しかし、一向にパスワードの入力がサボれない。これはひょっとするとRSA認証を許可してないのか? 今度管理してる先輩に会ったら聞いてみよう。それにしても、SFTPが使えないようだ。これは、テキストファイルのちょっとした編集をするのにはEmacs(かvi)を使うしかなさそう。Emacsはあのキーバインドにどうしても慣れないので、今まではgEdit使ってたけど、さすがにそろそろ宗旨変えが必要かなあ。気が乗らないなあ。

今日の講義の名言。「Kramers-Kronig関係式の導出には因果律しか使ってないので、どれだけ強い非平衡であっても、例えば生物をどついてもその応答はKramers-Kronig関係式が成立する」

ラベル: ,

2009年9月27日

TeX導入成功!

TeX導入に成功! ちゃんとtxfontsにもできた。


Warning: getimagesize(/virtual/spt27/public_html/texpng/c4eb5b9c508b1f26bd8d0586f81b5f08.png): failed to open stream: No such file or directory in /virtual/spt27/public_html/bin/texpng.php on line 152
\int_{-\infty}^\infty dx\,\exp(-ax^2)=\sqrt{\frac{\pi}{a}}

platexはあってもdvipngがXREAになかったので野良ビルド。CGIは当初はrubyで書こうと思ったけど結局PHPで書いた。ご希望の方がいればコードもアップロードします。

ラベル:

2009年9月19日

XREA TeX導入計画

調べてみたところ、どうもXREAにはplatexは入ってたけど、dvipsもdvipngも入っていなかった(dvipsを内部呼び出しするdvipdfはなぜか入っているのに!)。どっちか入れてくださいと要望しといた。入れてくれるといいな。

個人的にはMediawikiみたいな感じを想定してる。Computer Modernは嫌いなのでtxfonts使うと思うけど。

ラベル:

2009年9月17日

If I have seen further

卒研も始まることだし、ボスに倣ってブログを始めて(再開して)みることにした。どうせまたすぐ飽きるだろうけど。

前にやってたのは、とにかく仕様にできるだけ縛られず自由にやりたかったので、そうなると自分でコードを書くのが良かろうということで、fc2もMovable Typeも使わず自力で1からPHPでコードを書いて、SQLでコメントとトラックバック管理して、フィードも込みで何とかブログと呼べるようなものになったと思う(実際、フィードやトラックバックの実装は良い勉強になった)。しかし、バグの修正や記事書く面倒さで2ヶ月くらいで飽きてしまった。今ではそのコードも誰が書いたか分からんくらい読めたもんじゃない(というか、PHPで数年後に読めるコード書くのは不可能だろう)。

そうこうしてるうちに、GoogleがBloggerなるサービスやってることを知り、Googleがやってるので拡張性は抜群だろうと思ったら案の定。さすがに自分で書くほどではないが、その手間をかけるほどできない機能があるわけではない。しかも、外部サーバに公開できるということで、長年(といっても実働期間は少ないが)世話になってるXREAに公開。読者の皆さん、俺のAdsenseなんかどうだっていいのでXREAの広告をクリックしてあげてください、素晴らしいレンタルサーバです(そして無料サービスをゲットできたのは当時知名度がまだ大きくなかったから)。

ラベル: