2014年10月3日金曜日

Mac上のmusrfitはもはやXを使わない(というか正確にはrootが)

Mac上のmusrfitで,いままで唯一不満だったのが ,rootがXQuartzを使ってしまという点でした.
せっかくmusreditがaqua対応になったのに,おしい!もう一息!と思っていました.

しかし,rootも現時点でVersion 5.34.21となり,今はXを使わなくても動くらしいという情報をつかみました.
そこで,あらためてmusrfitをイチからセットアップ.

詳細はリンク先が詳しいと思いますが,今回そのままではうまくいかなかったことがあったので,メモしておきます.

まず,rootはバイナリではなくソースからインストールするとXを使わないrootが出来上がります.

musrfitは,makeするにあたりboostを見失うので,boostのパスも明示します.
私が実際にconfigureしたときのオプションは以下の通りです.

 $ ./configure --with-boostinc=/sw/opt/boost-1_55/include --with-qt4=/sw/lib/qt4-mac --prefix=$ROOTSYS --enable-NeXus

私はfinkを使っていて,Qtはqt4-base-macのパッケージを中心にそろえています.
っというかその方が(qt4-base-x11とくらべて)XQuartzを使わないので綺麗です.

それから,NeXusフォーマットを有効にする際は,make中になぜかNeXusのヘッダーファイルを 見失うので,/usr/local/include以下にnapiconfig.hとnxconfig.hをコピーしてもってきておくといいみたいです.
(本当はboost同様configureのオプションで対応できるはずだと思うのですが,どうしてもうまくいきませんでした??)



こんな感じでmusrfitが出来上がりました.
musrviewのフォントもアンチエイリアスが効いて綺麗です.


そして,fキーをおすだけでしっかりfftもできます.

2014年5月2日金曜日

Scientific Linux 6.5にGPIBのメモ

移籍して初のPCセットアップでいろいろ忘れていたことがあり苦心しました。

まず、linux-gpibをインストールしたのですが、昔作ったソースがそのままで動かないorz
コンパイルして実行すると、

./a.out: error while loading shared libraries: libgpib.so.0: cannot open shared object file: No such file or directory
とのこと。
これはすぐ解決。

$ export LD_LIBRARY_PATH=/usr/local/lib

でおっけー。
次に、なんだか悩んだのは、再起動すると常に/dev/gpib*のグループが"root"にもどってしまい、 いちいちパーミッションを与えないといけないこと。
これは、ちょっと忘れていたのですが、しばらくして思い出しました。
/etc/udev/rules.d/の下に適当な名前の.rulesファイルを作って、グループとパーミッションを指定してあげればよかった。
たとえば、

 [yishii@gpibnote01 Gtk]$ more /etc/udev/rules.d/96-gpib.rules
KERNEL=="gpib[0-9]*", MODE="0660", GROUP="gpib"
というかんじ。
一般ユーザでgpibインターフェースを使いたいときは必須。
当然、グループgpibに追加したユーザのみ使えます。

またメモしておかないと忘れるので。



2014年2月21日金曜日

「ことばの力学」

先月1/25に代々木であったシンポジウムで,ピッツバーグ大学の白井先生の講演をきくことが出来ました.

http://www.meiseigakuen.ed.jp/album/2014/index.html#symposium

最近,職場で『東大話法』の話題になることが多く,その中で白井先生の「ことばの力学」という本が話題にあがり,個人的に読んでみたいと思っていたところだったので,ナイスタイミングでした.

帰宅し,著者割引で購入させて頂いた「ことばの力学」を拝読しました.
理系の私でも楽しく読める内容だったのですが,特に7章でメディアや政府が発する言葉は批判的な姿勢で受け取る必要がある,という内容のことが書かれてあり,興味深かったです.

最近では堤未果さんもそのような内容の本を出版されていて,原発事故をきっかけにだんだんそういう意識が広まってきたのかなぁ,と感じています.
日本のメディアはどうして体制に不利な内容を発信できないのかなぁ,とオトナ社会の構造に思いをはせてしまいました.
体制に批判的なメディアを好む人々も一定数いると思うのですが...

一方,私が大学教員になりたての頃に読んだ,宇佐美寛先生の著書「大学の授業」のなかでは,『引用なきところ印象はびこる』という言葉が繰り返し出てきます.
印象で判断するな,原典にあたって論理的に示せ,という意味だと思います.
ことばの『メタファー』にダマされないためには,報道内容についても,かならず『一次データ』にあたることが大事なんだろうなぁ,と.
報道されている内容も鵜呑みにせず,なにか判断が必要なときは必ず『一次データ』にあたる.
でも,それってきちんと『一次データ』を理解できる程度に勉強しないといけないので,大変なことだと思います.

『一次データ』にあたろうとする意識をもち,なおかつきちんと勉強しようという意識をもった国民を育てることが,教育者としての私たちのミッションでもあるのかなぁ,と,えらそうなことを考えた金曜日でした.


2014年1月7日火曜日

MacとLinuxの挙動の違いについて

昨日ポストした,mac上で作ったGtk+を使って計算するプログラムを,Linuxでも動かそうと思ってコンパイルしてみました.
プラットフォームに依存することはしていないので完全に互換のはず,と思って単純にコンパイルだけしました.

しかし,コンパイラではerrorもwarningも出なかったのですが,実行してみたらセグメンテーション違反になってしまう.
がっくりきて小一時間いろいろ試したら,動くようになりました.

理由が二つありました.


  1. パイプを使ってgnuplotを開くときのパスの指定の仕方
  2. ファイルオープンが失敗したときにfcloseするべきかどうか


前者は,mac上ではgnuplotにパスが通っていれば,

FILE *gp;
gp = popen("gnuplot", "w");

で動いたのですが,Linuxでは

FILE *gp;
gp = popen("/usr/bin/gnuplot", "w");

としないと動きません.
これはすぐに分かったのですが,問題は次のファイルオープンが失敗した時の処理です.

計算し終わったデータを格納するファイルが,同じファイル名で既に存在する場合,基本的にはアペンドモードで追記しているので問題ないのですが,念のため以下のように確認するダイアログを出していました.

  if((fp = fopen (filename, "r")) == NULL){
    fclose(fp);
    start_or_stop=1;
  }
  else{
  fclose(fp);
  GtkWidget *dialog;
  GtkWidget *parent;
  GtkWidget *labeld;
  gint response;
.
.
.
(以下にダイアログを出すコードが続きます.)
これは単純にファイルが存在するかどうかを確認するために付け加えたコードでした.
以前,c言語ではファイルのオープンに失敗しても,そのポインタにNULLが格納されて,以後書き込む時にNULLに書き込んでしまい危険だから云々...
と勉強した記憶があったので,fcloseを書いていました.

macではこれで実行しても問題ないし,linuxでもコンパイラではerrorもwarningも出なかったのですが,実行すると無情のセグメンテーション違反とのお答えが..

おかしい場所はここしかないと思ったので,fpがNULLのときのfcloseをコメントアウトすると,無事に動きました.

なぜでしょう??

2014年1月6日月曜日

Macでgtk2のテーマをかえてみたい!(finkです)

Finkでgtk+のテーマを変更する方法を見つけたのでメモしておきます.

まずは,finkでgtk-change-theme,gtk2-engineをインストール.
これで最低限テーマを変更できるようになります.
起動は,

$ gtk-chtheme

です.GUIのテーマセレクタが現れて,いくつか選べるようになります.



上の画像は,すでに他のテーマをいくつかインストールしたあとなので,選択肢が豊富です.
単純に,finkでgnome-themesとgnome-themes-glossy-pをインストールするだけでもかなりの数のテーマが使えるようになりますが,ウェブから落としてきたテーマを/sw/share/themes以下にコピーしても使えます.

見た目はかなりいじれるようになり,


こんな感じになったり,


こんな感じにすることも出来ます.

ちなみにこの画像は前のブログエントリで書いたマルチスレッドのGTKプログラムですが,fileメニューはただQuitだけがあるシンプルなものです.
グラフはgnuplotに描かせているのですが,これはプログラムの中からパイプで呼び出しています.
今回,gnuplotの出力ターミナルをwxtにしています.

これには理由が二つあり,

  1. 右クリックでグラフのレンジを変えられる(拡大が可能)
  2. デフォルトだとaquatermになってしまうので,プロットするたびにマウスフォーカスがaquaにうつってしまい,煩わしい(wxtならマウスフォーカスは常にX11のまま)

からです.



C言語で,Gtk+とgthread

gtk+2.0とgthreadでマルチスレッドのプログラムを作りたいのですが,意外と情報が少なく困っています.

たとえばGUIで測定プログラムを動かしていて,途中で電流値などのパラメータを変えたいと思っても,マルチスレッド化しなければ普通はループが終るまで変数の変更を許してくれません.

そこで,測定ルーチンは別のスレッドで無限ループにしておいて,メインのスレッドではボタンをクリックしたりentryウィジェットで数値を入力したりしてループ条件やパラメータを変更する,と言う風にスレッドを分けることが必要になります.

具体的には,メイン関数の中で
GThread* thread;

g_thread_init(NULL);
gdk_threads_init();

と初期化した後,
thread = g_thread_create ( thread_func, (gpointer)label3, FALSE, &error );
という風にしてthread_funcを別スレッドで立ち上げる.ここでlabel3を引数として与えているのは,thread_funcのなかでlabel3のテキストをリアルタイムで書き換えているからです.

thread_funcはgpointer型にする必要があるらしく,実際の中身は
static gpointer thread_func ( gpointer data )
{
  while( TRUE ){
  g_usleep(500000);
   
  if(start_or_stop != 0){
  .
  .
  .
  gtk_label_set_text(GTK_LABEL (data), buf);
  }
  
  }
みたいな感じにしています.

ここで,start_or_stopはintで宣言していて,0のときは何も実行されない.
メイン関数のボタンをクリックするとstart_or_stopが0になったり1になったりする,という仕組みです.
gboolean型でも良かったのかもしれないのですが,caseで処理を分けるかもしれないことを考えて,intにしておきました.

実際はこんな感じ



これは実際に測定しているわけではなく,0.5秒おきにスピン1/2三角格子ハイゼンベルグ反強磁性体の帯磁率を1ケルビンおきに計算してプロットするというプログラムを測定ルーチンのかわりに入れています.