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 を使っているのもミソ。

ラベル:

続・ヒウィッヒヒー

結局 twitter を始めてしまった。英語の練習も兼ねて、独り言(特に物理関係)は英語でつぶやくようにしている。

まあ、繰り返すがそもそも自分はまとまった文章を書く方が好きなので、あくまで twitter は雑談、情報収集、英語の修行という使い道が妥当だと思う。

あと、一応こっちでは本名も所属も伏せてあるし(まあ、見る人が見れば指導教官くらい分かるのかもしれないけど)、本名と所属出してる twitter ではバカな書き込みして「こいつの指導教官の顔が見たい」とか思われてボスに迷惑かけるのも嫌だから(不肖の弟子ですいません)、まあきわどい書き込みはこっちの方でやると思う。

それにしても、やってみて思うが、140字という制限は言語によってかなり違う。英語で140字だとほとんど何も書けないが、日本語だと色々書けてしまう(これは、日本語だけで書いている人には分からないと思うので、一回試してみるべし)。例えば、このような感じ。

日本語
カレー食べに渋谷行ってきた。(14字)
英語
I went to Shibuya to eat curry.(31字)
フランス語
Je suis allé à Shibuya à manger curry.(38字)
ドイツ語
Ich habe zu Shibuya gegangen, um Curry zu essen.(48字)
中国語
我到涩谷吃咖喱.(8字)

実にドイツ語は中国語の6倍。一体この差は何だ。

2010年1月10日

ヒウィッヒヒー

twitterは、一体何を目的としたメディアなのだろうと、ふと考えてみた。位置づけはこんな感じなのだろうか。

短文長文
顕名twitterブログ
匿名2ちゃんねるはてな匿名ダイアリー

要するに、 2ch 的な、短文で、その代わりある程度即時的なコミュニケーションを顕名でしたいということか。とはいえ、これで説明できるのはある程度読者を意識した tweets であって、「帰宅なう」みたいな、 2ch では「チラ裏」として忌避されるような tweets は、一体何を目的としてやっているのかよく分からない。

twitter を見ていて、一番の欠点だと思っているのは第三者がログを追いにくいこと。もっとも、それはやはり 2ch も五十歩百歩で、コミュニケーションの当事者はやりとりを直に追っているからいずれにせよ問題ない。 2ch に関しては専ブラの機能等で、アンカーの内容をポップアップしてくれれば極めてやりとりの流れを追いやすくなる。 twitter にも専ブラがあればいいということ? その前に retweet の機能を公式にサポートすることからだな。ちなみに、ログの追いやすさということに関しては一応 2ch の方が「五十歩」で、あっちは基本的に1つの会話に関しては1つのスレッド内で完結しているので、画面をスクロールして行ったり来たりすればよろしい。 twitter の方は、会話の内容を追うためには会話に参加しているユーザのページをそれぞれ見ないといけないから「百歩」。

何でこんなことをいきなり言い出したかというと、物理学者が結構やっているから。自分の分野でも佐々さんとか菊池さんとか、分野が変われば早野さんとかいろ物さんとかもいる。こういう会話のログを追おうとすると、結構面倒くさい。他にも教授とかユキヒロさんとかもやっているみたいだし(細野さんはやってないらしい)、あと個人的友人も何人か。そういうわけで、始めてみようかとも思わなくもないが、ここを見れば分かるように、独り言(とは言ってもある程度は仮想の読者は意識しているが)を垂れ流すだけなら、自分は一気にまとめてダラダラと長文を書く方が好きなので、いまいち踏ん切りもつかない。コミュニケーション目的なら、 2ch 的な非「チラ裏」なやりとりであれば嫌いではないので、悪くないかもしれない。

Pidgin に Pidgin-twitter なるプラグインがあるらしく、これは便利そうだと、アカウントも取ってないのに思ってみた。それでは計算するので消えます。ぼわん。

2010年1月9日

あけましておめでたい自分

昨年末から「古典力学」の問題を考えているが、元旦に起きて早々、計算をしてみる。Hamiltonian H が保存する周期運動をする古典系において(ただし正準運動量 p は速度 v 、質量 m とすると、単純に p = mv の系)、その軌道をエネルギー E で指定する。この時周期を T とすると、
Warning: getimagesize(/virtual/spt27/public_html/texpng/50b5e4ca7cdbe5a7697b6ba392475d1b.png): failed to open stream: No such file or directory in /virtual/spt27/public_html/bin/texpng.php on line 152

Fatal error: Call to undefined function mb_internal_encoding() in /virtual/spt27/public_html/bin/texpng.php on line 158