「驚愕」感想

最近、状態が悪いのだが、それと「驚愕」を読む事とは別問題である。

とりあえず、感想。
覚えてる訳ないので、分裂から読みなおした。

並行宇宙ものであることはわかったのだが、最初はどっちに何が起きたかを把握する必要があったので、メモをとりながら読んで、βの方がシリアス展開。

ヤスミの正体については、読み違えた。

できれば、朝倉VS九曜の戦闘がもう一度見たかった。

並行宇宙はともかくとして、藤原の未来に何があったのかが気になったが、こいつもう登場のしようがないぞ。どーすんだ。

朝比奈さん(大)とはそのうち敵対することになりそうだな。

Emacsでできるらしいこと

ファイルマネージャ:Dired
ウェブブラウザ:w3m
文書作成:Yatex
表計算:org-mode、csv-mode(?)
グラフ作成:gnuplot.el
辞書:sdic、その他
音楽プレイヤ:mpg123、EMMS
動画:movie.el
画像編集:gimp-shell-mode
DTM:mi.el

まさか、MIDIエディタまであるとは思わなかった・・・
Diredは使えるようになっとこうか。便利そうだし。

作品なんで貼っとく-Parallel Simulation Script-

WindowsでEmbrassingly parallelでシミュレータを回すためのスクリプト

Windowsでやるには、プロセスの数数えるのと、forkのエミュレーション用のモジュールのインポートがめんどくさい。Unix系だったら、もうちょっと簡単。

やってることは、
・ParameterList.csvからパラメータのリストを読み込む。
・Simulation用のパラメータを読み込んでは子供に渡す
・子供はシミュレータを回すコマンドを生成し、コマンドプロンプトに投げ、終わったら死ぬ。
・親は子供の数を数え、子供が15人以下なら新しく作る。(コア数が16個のマシンだから
・出力ファイルの処理。(ここは見るべきところなし)

Windowsでfork(親プロセスから子供を生成)するのは、デフォでは対応してないので、3行目の

use POSIX

Unixをエミュレートしてる。。。らしい。

プロセスのカウントはUnixなら

ps -e | grep "process name" | wc

とかで一発なんだが、うまいやり方が思いつかなかったので、一旦ファイルに書きだしてからPerlで数えてる。

Windows,Perl,fork」とかで検索して来た人はmainルーチンと、process_countルーチン以外は読む価値なしだから。


use strict;
use warnings;
use POSIX ":sys_wait_h";#for fork emulation

#main routine
#need 2 commandline parameter.
if( @ARGV != 2 ){
die "How to use...\n$0 ModelFile.ind ParameterList.csv\n";# $0 is program name
}

my $model_file = $ARGV[0];#*.ind
my $parameter_list_file=$ARGV[1]; chomp($parameter_list_file);#parameter list

my $prefix_master =$` if($model_file =~ /.ind/);
my $exe_name="fullwave.exe";
my $process_limit=15;
my $parameter_name_string = "Ratio,Period,fdtd_stop_time,fdtd_stop_time";

open (LIST,"<$parameter_list_file");
while(my $line=<LIST>){
chomp($line);
my $parameter_list_string = $line;
my $generate_success=0;
while (!$generate_success){
if (&process_count($exe_name) < $process_limit){
my $pid = fork;
if (!defined $pid){
die "fork failed\n";#Never comes here
}elsif($pid){ # Parent process
print "generating child\n";
}elsif(!$pid){ #Child process
&run_simulater($parameter_name_string,$parameter_list_string);
print "$$ exit\n";
exit; #Kill child
}
$generate_success=1;
} else {
$generate_success=0;
sleep 10;
}
}
}
close(LIST);

&file_transaction();

# simulation command routine (forked children)
sub run_simulater {
(my $parameter_name_string ,my $parameter_list_string) = @_;
my @parameter_name = split(/,/,$parameter_name_string);
my @parameter_list = split(/,/,$parameter_list_string);
my $parameter_number = @parameter_name;
my $prefix =sprintf("%s%s%.1f%s%.1f",$prefix_master,"_$parameter_name[0]",$parameter_list[0],"_$parameter_name[1]",$parameter_list[1]);
my $symbols ="wait=0 prefix=$prefix";
for (my $i=0 ; $i < $parameter_number - 2 ;$i++){
$symbols .= " scan_variable=$parameter_name[$i] $parameter_name[$i]=$parameter_list[$i] ";
}
my $stop_time1 = " scan_variable=$parameter_name[2] $parameter_name[2]=$parameter_list[2] ";
my $stop_time2 = " scan_variable=$parameter_name[3] $parameter_name[3]=$parameter_list[3] ";
print "$symbols $stop_time1\n";
`start /min fullwave $model_file $symbols $stop_time1`;
print "$symbols $stop_time2\n";
`start /min fullwave $model_file $symbols $stop_time2`;
my $log_file_name ='Log' . $$ . '.txt';
open (LOG, ">$log_file_name");
print LOG "I'm a child. My pid is $$ \n";
print LOG "$parameter_name_string";
print LOG "$parameter_list_string";
close(LOG);
}

#counting thread routine
sub process_count{
(my $exe_name) = @_;
`tasklist > process.txt`;
open (PS, "process.txt");
my $process_number=0;
while (my $line = <PS>) {
$process_number++ if ($line =~ /$exe_name/);
}
close (PS);
return "$process_number\n";
}

sub file_transactio{
open(DIR,'.');
my @file_list = readdir(DIR);
foreach my $file_name(@file_list){
if ($file_name=~ /_m([0-9]+)_t[0-9]+_e[xyz]\.dat$/){
my $postfix=$&;
my $prefix=$`;
$postfix=~ s/\.dat/\.tmp/;
open(DAT,$file_name) or die "can't open file\n";
open(TMP,">>$prefix$postfix");
for (my $i=1;!eof(DAT);$i++){
my $line=<DAT>;
if ($i > 4){
$line =~ s/^ //;
$line =~ s/ / /g;
$line =~ s/ $//;
}
print TMP $line;
}
close(TMP);
close(DAT);
unlink $file_name;
rename "$prefix$postfix" , "$file_name";
unlink "$prefix\.fst";
unlink "$prefix\.dataindex";
}
}
}

ヴィクトール・フランクル「夜と霧」

大した読書家でもないが、この世界でこれ以上尊い言葉はないだろう。
あらすじは紹介しないが、一番凄まじいところだけ引用しておく。

「あなた方が経験したことは、この世界のどんな力も奪えない」(中略)
過去で『ある』ことも、一種の『ある』ことであり、おそらくはもっとも確実な『ある』ことなのだ。

つまり過去を存在と認め、それがどんなに今が悲惨であろうとも、誰にも汚すことも貶めることもできないものだと表明したのだ。
ここに至るまでに踏まえておくべきところがある。
収容所に収容されるとき、ユダヤ人たちは、自分の持ち物は服、メガネ、頭髪に至るまで全て取り上げられた。
そのときフランクルは古参の囚人に、「自分が今執筆している論文だけは、持たせてくれ」と嘆願するが、嘲りとともに、「糞ったれ!」と返答される。

「このとき、わたしはことの次第をのみこんだ。そして、この第一段階のクライマックスにおける心理学的反応をした。つまり、それまでの人生をすべてなかったことにしたのだ」

妻と子供も同時に収容され、その生死は知れない。(二人とも生きて帰ることはなかった)。その後、人類史上、もっとも凄惨な時間・凄惨な場所で過ごし、フランクルは先に挙げた言葉にたどり着く。人間に、そんなことが可能なのかと呆然とする。
フランクル自身も、そうした中でも誇りを失わない人たちに対して、同じ思いを抱いたのだろう。収容所正解活を記した章の最後の文を引用して終わる。

わたしたちは、おそらくこれまでどの時代の人間も知らなかった「人間」を知った。では、この人間とは何者か。人間とは、人間とは何かを常に決定する存在だ。人間とは、ガス室を発明した存在だ。しかし同時に、ガス室に入っても毅然として祈りの言葉を口にする存在でもあるのだ。

地震

あまりの事に愕然とした。
映像で見てもこれほど怖いのだったら、実際に襲われた方の恐怖はいかばかりだろう。

一人でも多く助かるようにお祈りします。

落ち着いたら片付けに行くつもり。この分だと電力ないから復帰しても研究進まないし。

Openboxのメニューにアプリケーションの一覧を

OpenboxでGnomeのようなアプリケーションの起動メニューを使いたいと思う人は多いだろう。というよりは、デフォルトで対応してないために、使うのを諦めてしまう人が多いと思う。
自分はOpenbox Menu Generatorというプログラムを使っていて、使い勝手は非常に良く満足している。OpenBox Menu Generator in Launchpad

しかしUbuntuのレポジトリに入っていないので、自力インストールが必要で、幾分か敷居が高いことは事実だろう。
より簡単なやり方について調べたのでメモしておく。
まず、Openbox-xdgmenuをapt-getなりSynapticなりソフトウェアセンターからインストールする。
まずは、コマンドをそのまま叩いてみよう。

shin@shin-laptop:~$ openbox-xdgmenu
Creates an OpenBox menu from an Xdg menu structure.

Usage:
openbox-xdgmenu [options]

Options:
-a: Show the amount of items in each category next to its name.
-p: Do not use categories.

For example:
openbox-xdgmenu "/etc/xdg/menus/applications.menu"

exampleの通りにコマンドをうってみると、




baobab


/usr/bin/emacs23

(長いので中略)

のように、xmlのソースがずらずらと端末の画面に表示される。このxmlのタグ、というのが、動的なメニューを実現してくれる。動的なメニューというのは、つまり、その項目を選択するたびに動的に内容を生成して表示するタイプのメニューのこと。これは非常に便利で、しかもShellScriptであったり、Perlとかの動的な言語(Cでも書けるけど)を知っているのであれば、メニューを単なるランチャーという範疇を超えてカスタマイズすることができるので、使ってて楽しい部分でもある。

話が脱線した。このパイプメニューをどうやってroot-menu(デスクトップで右クリックしたときに表示されるメニュー)に組み込むかだ。

Openboxのメニューを編集できる、GUIのソフトとして、obmenuというのが用意されている。もし入ってないなら、

sudo apt-get install obmenu

をやってから進もう。できた?では'obmenu'とターミナルで叩いて起動する。

とまあ、こんな感じで表示されるはず。(はじめてOpenboxを使うならもっと殺風景だろうけど)

さて、さっきのパイプメニューを組み込んでみよう。
Add>Pipemenu
を選ぶ。上下の位置は、動かしたい項目を選んで矢印を押せばいい。
さて、できたNewpipeを選んでもらうと、Label,id,Action(今回これは入力できない),commandが編集できるようになるだろう。

それぞれの項目の説明を一応しておくと、Labelが表示される名前、idはそれぞれのPipemenuを区別するidだ。なんでこんなもんが必要かという事についてはあとで触れる。actionは項目を選択したときの動作の種類(Executeが基本と思っていい)。commandは実行するコマンド。簡単だよね。

Label、idは何でもいい。好きな名前にしてもらって構わないけど、labelは"アプリケーション、idは"applications"とかにしとけばわかりやすいだろう。commandの欄は、さきほどxmlを吐いてきたコマンド、つまり

openbox-xdgmenu /etc/xdg/menus/applications.menu

としよう。これで、File -> 保存を選択する。

これで、アプリケーションの一覧にアクセスするメニューが出来ていると思う。

ではidの使い方について。

確かにこれで、アプリケーションを起動するときにいちいちターミナルで打ち込まなくてもよくなった。しかし、右クリック、「アプリケーション」を選択、「アプリの分類」目的のアプリと、一階層だけ無駄に階層が深くなってしまった気がする。一発でアプリケーションの選択ができるようにな工夫があってもいいはずだ。

もちろん極度のめんどくさがり屋であるハッカー達が用意してないわけがない。キーボードショートカットにパイプメニューを直に表示する方法がある。

そのまえに、~/.config/openbox/にrc.xmlというファイルはあるだろうか?なければ、とりあえず、デフォルトの設定をもらってこよう。

cp /etc/xdg/openbox/rc.xml ~/.config/openbox/rc.xml

このrc.xmlというのは、キーボードショートカットやマウスの挙動、ウィンドウ装飾のテーマなんかの設定ファイルだ。今回はキーボードに登録しておこう。他ボタンマウスを持っていれば、マウスに割り当てるのもいいだろう。
本当は、この辺の登録もGUIでやりたいのだが、公式設定ツールのobconfにまだ機能がないので、直接編集することにする。ただのxmlだし。
まずはルートメニュー。



root-menu

をrc.xml(中略)の間に記述する。
これで、Windowsキーとスペースキーでルートメニューが表示されるようになった。
さて、さっき作ったPipemenuを登録しよう。とりあえずWindowsキー+aとかにしておく。



applications

となる。これで、アプリケーションを起動するときに、余計な階層を一つたどる必要がなくなった。

今のところ、不満なのは、root-menuから、pipemenuを削除すると、このキーボードショートカットも使えなくなること。既にルートに記述されている必要がないので、消したくなることもたまにあるだろう。回避方法はありそうな気はするんだけど・・・。

これを応用すれば、結構いろいろ作れる。例えばシステムの情報を動的に生成させてメニューを開けばみれるようにしておくとか、ファイルの一覧を取得して開くようなpipemenuを使えば、ファイルマネージャを使うまでもない時なんかは便利だ。

自分はこれでaudaciousという音楽プレイヤーの制御をしている。いちいちAlt-tabでウィンドウを切り替える必要がないので重宝している。

追記:アプリケーションメニューだけを表示する。
回避方法が見つかった。

Openboxはメニューファイルを複数設定できることを利用する。
前述のrc.xmlにメニューファイルを指定する箇所がある。

/var/lib/openbox/debian-menu.xml
menu.xml
200
no 100
yes

の部分。ここで、通常の~/.config/openbox/menu.xmlの他に、/var/lib/openbox/Debian-menu.xmlを指定する。これはデフォルトで存在かどうかはスマンが知らない。

で、このファイルの内容を見てみると、

とあるので、「Windows+a」に割り振ったrc.xml設定の

applications

Debian

に変更する。多分これが一番簡単。

他のやり方としては、例えば、menu2.xmlとかを作ってそこにPipe−menuを記述しといて、pipemenuをキーボードショートカットで呼び出すとかかな?
ま、いずれにせよ、これでroot-menuを肥大化させずに、さまざまなメニューを利用することが可能であることがわかった。