生物と計算機のあいだ

個人的にうまくいったかなとおもったことを書いています。うまくいかなかったらごめんなさい。

BeanshellでMicro-managerを動かす

大学院生時代の研究室では顕微鏡の操作にMetaMorphという商用のソフトウェアを使っていた。現在、ポスドクをしている研究室ではMicro-Managerというソフトウェアを使って顕微鏡を動かしている。画像解析でよく広く使わているImageJの顕微鏡制御用プラグインといった感じだろうか、Micro-Managerを立ち上げるとImageJも同時に立ち上がる。研究を進めていくうえで、ソフトウェアで予め用意されているMulti-Dimensional Acquisition (MDA) ではカバーできない操作をする必要が出てきたので、自分用にカスタマイズしたMDAを作ってみた。その過程で得られたTipsを備忘録として書き残したい。

MetaMorphにはJournalというプログラミング風な機能が実装されており、ソフトウェアで提供されているメソッドをGUIでグリグリ指定することで、顕微鏡の動作をカスタマイズできる。一方で、Micro-Managerでは公開されているAPIにアクセスしてプログラミングをすることで、自分好みの挙動を実装しなくてはいけない。公式のドキュメントによると使用可能な言語はBeanshell (Javaインタプリタ型?), MATLAB, Pythonの3言語をサポートしているらしい。Beanshellは過去の遺物になっている感が否めなかったが、Micro-Manager本体にエディタが付属していたのでこちらを使ってみることにした。

読んでよかった資料

Micro-Managerを使用すること自体に慣れていなかったので、まずは公式が出している記事やドキュメントをちゃんと読むことにした。

プログラミングガイド

これのおかげでなんとなくどういうことが可能かを理解できた気がする。ただ、ここに載っているサンプルコードはJavaユーザー向けにかかれているようで、Beanshellでは使うことができない。
Micro-Manager Programming Guide - Micro-Manager

SourceForgeのMicro-managerのページ

Mailing listのタブから利用者からの質問と開発者からの回答が読める。いまいち自分が知りたい情報にアクセスするのが難しい気がする。下記2つのドキュメントをちゃんと読もうという気にさせてくれた。
sourceforge.net

Micro-Managerを動かすために必要な基本的な関数たち

いわゆるドキュメント。命名規則がしっかりしているので、やりたいことに対応する単語がちゃんとイメージできれば知らない関数でも見つけるのはあまり難しくない。ここにある関数は"mmc.関数名"で呼び出せる。
CMMCore

Micro-managerのGUIに関する機能を使うために必要な関数たち

GUIにあるパラメータや撮影ポジションを登録するウィンドウから情報を取得する時に使った。ここで実装されているメソッドは"gui.関数名"で呼び出せる。
ScriptInterface

サンプルコード

これまでに実装されていたコードが公開されている。しかし、バージョンの変更に伴う仕様の違いなのか、コピペプログラミングをしようとするとそこそこエラーに遭遇する。笑 ただ雰囲気を掴むためには非常に有用だった。とくに1つ目のリンクは選抜されたコードのようなので、一通り読んだ。
Example Beanshell scripts - Micro-Manager
scripts – Micro-Manager
この中でも、"acqLC.bsh"と"Burst.bsh"は自分でMDAを実装をする上でとても参考になった。

実装していった中での学び

サンプルコードにある方法ではクラスをインポートできない。APIが整理されており、それに伴って呼び出し方が変更されている。パスが変更されているのは
Micro-managerのSourceForgeメーリスで言及されているのをたまたま見つけて知った。

)
import org.micromanager.navigation.PositionList;
import org.micromanager.navigation.MultiStagePosition;
import org.micromanager.navigation.StagePosition;

正)
import org.micromanager.api.PositionList;
import org.micromanager.api.MultiStagePosition;
import org.micromanager.api.StagePosition;

CMMCoreにあるメソッドはimportしなくても呼び出すことができる。使うことが前提だからなのかスクリプトの最初で宣言する必要がない。これに関しては特別言及されていなかったような気がする。サンプルコードからその雰囲気を感じ取った。

mmc.xxx; // このような形式でアクセスできる。

撮影した画像のセーブなどはMicro-managerの関数ではなく、ImageJで用意されている関数を使用する必要がある。機器制御はMicro-manager, 画像はImageJと役割分担がきっちりしているので、一度このことを知れば関数探しに手間取ることもないだろう。ImageJの関数を使うためには以下のような感じでImageJの関数群を予め呼び出しておく必要がある。ImageJの関数は画像をtiffとして保存することにしか使わなかったが、うまいこと組み合わせれば撮影と同時に解析して逐次定量データをテキストファイルに保存することなどもできそう。

import ij.process.*;
import ij.ImagePlus;
import ij.io.FileSaver;

完全に理解できているわけではないが、この辺のMicro-managerを動かすために必要な前提知識さえ手に入れてしまえば、その後のプログラミング自体は (他の言語での経験があれば) 全然難しくないと思う。Micro-managerに関する日本語の情報は名大の塚田さんが日本語訳のページを用意してくださっていたりするが、自分で動かす系の記事が思いの外見当たらなかったので、誰かの助けになったら嬉しい。

アメリカにJ-1ビザで研究留学するまでの大まかな流れ

縁あって、アメリカの大学でポスドクをすることになった。
ビザを取得して渡航するまでの流れを大まかに書いておきたいと思う。

【2018年6月】
 受け入れ先の研究室にEメールでコンタクトをとった。分野を少し変えるのもあり、面識がなかったのでメールでのコンタクトになった。似た分野でポスドク先を探す場合は学会などで自分をアピールするとよいと思う。ポスドク先の探し方に関してはまた別の記事として書きたいと思う。

【2018年7月】
 7月上旬にSkypeでの面接。ラボメンバー全員がいる前で自分の研究をプレゼンすることになった。大体はボスとの1対1でのらしいが、私のケースではポスドクや学生もいた。これはかなり緊張したが、なんとが無事に乗り切ることができた。当日中に先方のお金で雇うから来ないか、というオファーをもらうことができた。
 7月下旬に研究室訪問。これまで面識もなく面接の時にもじっくり話をすることもなかったので、ボスがどんな人であるのか、ラボの雰囲気などが知りたいと、ラボ訪問をさせてほしい旨を伝えた。幸いなことに旅費も出してももらい、研究室見学をすることができた。旅費を出してもらえるかは交渉次第だと思う。変に気を使わず、自分の思っていることはちゃんと主張するべきだと思う。ここで、ラボメンバーとの個別なディスカッションの時間も設けてもらい、研究に関することやラボの雰囲気についても聞くことができた。お昼にはラボメンバー全員でご飯を食べに行き、夜はボスと2人でご飯を食べに行く時間も作ってもらうことができたので、ラボの雰囲気に関しては安心することができた。
 もう一つ、この研究室見学の渡航で大事だと感じたのは、同じ大学にいる他の研究室のポスドクや大学院生と知り合いになっておくことだと思う。私の場合は学部生時代の先輩から、同じ大学にいるポスドクのお友達を紹介してもらった。アポイントをとってできればご飯などを一緒に食べに行けるとよいと思う。現地の空気感を母国語で体験談として聞くことができるし、なによりいざ渡航するとなった場合にいろいろと教えてもらわないといけないので、相談できる相手を見つけるというのはとても大事だと感じた。
 日本に帰ってきてオファーレターにサインをして先方の事務に送って、晴れて留学先が確定した。

【2018年8月】
 アメリカの大学の事務から雇用手続きを進めるにあたって必要なメールが送られてくる。やったこととしては次の3つ。
・バックグラウンドチェック。(webサービスに登録。これは登録しただけで他には何もしていない。)
・英語力チェックのためのskype面接。大学の事務職員との面接。20分くらい世間話をして終了した。向こうから話を振られてくるというよりはこちらの留学に際しての不安点などを質問すると答えてくれるという感じ。TOEFLかIELTSのスコアを持っていれば面接にかえることができる。
・書類仕事諸々。この処理が遅れるとDS2019という書類が発行されるのが遅くなるらしい。ビザを取得するためには必須なのでなるべく早く対応する必要がある。9月になるとアメリカでは新学期が始まるため事務がどっと忙しくなるので、8月中に終わらせるようにとアドバイスがあった。この書類系に関しては印鑑をついて郵送みたいな日本的な文化は完全に排除されていて、大学が契約しているクラウドストレージにアップロードするように指示された。どこの州で就職するかで必要な書類は変わってくるのだと思う。とにかくわからないことはメールで聞いて、速攻終わらせるべし。

【2018年11月】
 DS-2019という書類が届く。この書類を持って大使館/領事館に行ってビザを発行してもらうようにと言われる。面接の前に大学が用意しているweb教材でビザ取得までの流れを把握しておくようにという指示があった。国際学会があったり、研究を進めないといけなかったり、博士論文を書いたりしなくてはいけなかったので、結局1月まで放置してしまう。

【2019年1月】
 重たい腰を上げて領事館のサイトから面接の予約をする。私の場合は大阪だったのでそんなに混んでいなかったが、東京では繁忙期になると1週間後まで予約が取れないこともあるらしい。予約時間の枠が決まっているので、自分の希望する時間を選ぶ。朝一番の時間が定石とのこと。
 大阪での面接では次の3つのことを聞かれて、あっという間にビザがおりてしまった。
・何を研究するのか。
・どれくらいの期間いるのか。
・誰がお給料を払うのか。
私の前の人も同業者と思われる話の内容だったけど、めちゃめちゃ話をしていた。理由はわからない。私の場合は必要最低限の書類の他に、大学からのオファーレター、預金通帳、これまでに発表した論文、卒業見込証明書を持参して、預金通帳以外はその場で面接官に出した。その書類もチェックしていたので、それが効いていたのかもしれない。
1週間もしないうちにビザが郵送されてきた。

【2019年3月】
 家探しをスタート。ネットでもある程度情報は見ることができるので、現地にいる知り合いにどのエリアがいいかなどのアドバイスを受けながら候補を探していった。日本人コミュニティ内でアパートのサブリース相手を探している場合もあるので、そういう情報も仕入れるとよりスムーズに住みやすい家を探すことができると思う。あとはラボメンバーに相談するのもかなり有効な手段だと思う。日本人価格感覚ではない家賃相場が知りたくて、ラボメンバーに相談したらシェアハウスを申し出てもらった。結局はそこに住むことにして、今はとても満足な暮らしができている。シェアハウスは相手次第なので、知らない人とのいきなりの共同生活は大変かもしれない。私のシェアハウス相手は日本人の友だちになんとなく似ていたのと、研究室見学に行った時に人当たりのよさが感じ取れたのでサクッと決めてしまった。
 大学の事務からは1週間前くらいに現地入りをしてAirbnbやホテルで借りぐらしをしながら家を探したらいいとアドバイスを受けた。私のケースはかなりラッキーでそうやって家を探すのがスタンダードらしい。

【2019年4月】
 飛行機のチケットを予約。我ながら遅い。本当に留学する気があるのかと言われた。もっと早くに取るべきだったとは思うが、やり残している研究で頭が一杯だったのと、どのくらい実家に滞在するかを決めあぐねていたらギリギリに予約することになってしまった。
 実際は3月末にラボを引き上げて、2週間弱実家に滞在した。実家にこんなに長く滞在できる期間はもう人生においてないかもしれないので、自分にとっても親にとってもいい時間になったのではないかと思う。
 出国当日は、パスポート、DS-2019、SIMフリーの携帯、クレジットカード(お金)を持っていることだけは10回くらい確認して、他のものは最悪お金で解決しようという大船に乗った気持ちで家を出た。
 入国審査でも基本的はビザの面接と同じことしか聞かれなかった。あとは住む場所に関しても聞かれたが、住むアパートが決まっていたのでスイスイ進むことができた。

以上の手続きで大事だと感じたのは事務作業はなるべく早くやって、わからないことはちゃんと質問するということと、あとは現地の知り合いを作っておくことだった。
 事務作業で対応してくれる相手は外国人相手をするプロなので、多少英語がおかしくても理解してくれるし、分かりづらいことは言い換えて説明してくれる。研究室同期もアメリカに留学するのだが、諸般の事情で事務作業を遅らせていたらDS2019の書類が3月中に準備できず、渡航の予定がずれたと言っていた。
 現地の知り合いは渡航までにはいろいろなことで相談にものっていただいたし、到着当日は空港まで迎えに来てくださって、最初に生活を始めるにあたって必要なものの買い出しにも付き合ってくださった。こうした人の助けがなかったら最初の買い物はとても苦労すると思う。

これから留学を考えているかたの参考に少しでもなれば嬉しい。

Arduino Dueでのコンパイルエラー (arm-none-eabi-g++: error)

研究機器を制御する用途でArduino Dueを触り始めた。

公式サイトが公開しているコードをコピペして実行しようとした時点でコンパイルエラーに嵌ってしまったので、メモ。

実行環境
Windows10
機器:Arduino Due
Arduino IDE: 1.8.4

コンパイル前にやったこととしては、
1. ArduinoをUSBでPCに接続
2. Dueを使用するために必要なパッケージをIDEに表示されたメッセージに従ってダウンロード
の2ステップだけ。

エラーメッセージは

arm-none-eabi-g++: error: CreateProcess: No such file or directory

exit status 1
ボードArduino Due (Programming Port)に対するコンパイル時にエラーが発生しました。

と表示されており、似たようなエラーで困っているStack Overflowとかを読んでもいまいち解決せず。
IDEの設定を見てると、コンパイル過程を出力する設定 (ファイル > 環境設定 > 設定 > より詳細な情報を表示する > コンパイル) があったので、そこにチェックを入れて再度ファイルのアップロードを実行。
すると、下記ファイルを探しにいって見つからないとエラーを吐いていることがわかった。

"C:\Users\USER_NAME\AppData\Local\Arduino15\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1/bin/arm-none-eabi-g++"

実際にこのファイルをエクスプローラーで探そうとしても、ファイルはおろか、Arduino15というディレクトリ自体が存在していないことがわかった。
ArduinoをインストールしたことでWindowsのドキュメントフォルダの中に作成されていたArduinoDataというディレクトリの中に探していたファイルを発見。Arduino15というディレクトリ名がArduinoDataになっていること以外はサブディレクトリの名前も完全に一致しているので、ディレクトリを"AppData\Local"の下にコピーしてディレクトリ名を変更してアップロードを実行すると、何事もなかったかのようにコンパイル成功。

どうしてこんなことになってしまったのかはわからないけれど、一応解決。

Dropboxを用いてPukiwikiを複数マシンで同期する

以前、WindowsマシンでCygwinを使ってPukiwikiを作成するということをしました。
vlpius.hatenablog.com

ラボのデスクトップPC以外からwikiの編集をしたいという需要が個人的に高まったので、Dropboxwikiのソースを置いて複数のPCから管理が可能にしようとトライした次第です。(Githubwikiのレポジトリを登録してもいいのだけど、恥ずかしい&pushとかpullとかいちいちやるのめんどいので。)

細かな説明を省いて言えば、
wikiのソースをDropboxにおいて、それぞれのPCのwebサーバのフォルダにシンボリックリンクを張る
それだけです。

同期させたいPC
Windows 7 デスクトップ
Mac book (OS X: El Capitan)
iMac (OS X : El Capitan)

1. これまでのwikiのソースをDropboxに置く。
これはコピペでOK。ただし、Dropboxでのファイルのパーミッションで詰まることがあるらしい。
とりあえず、755にしておいたのですが、書き込みのエラーが吐かれたので、なにも考えずに777にしてしまいました。(こういうのはたぶんよくない。)

2. Dropboxに置いたソースのシンボリックリンクwindowsマシンで作成する。
まず、これまでの環境を維持するために、Windowsから手をつけました。Cygwinでlnコマンドを使ってやったのですが、ブラウザから確認しても404が吐かれてしまいました。。。Windowsのcmdでもシンボリックリンクを張るmklinkというコマンドがあるようだったので、こちらで試したところうまくいきました。Cygwinで作られたリンクだとwindows側で正常に読み取られていないっぽい。

3. Dropboxに置いたソースのエイリアスMacで作成する。
Finderでpukiwikiのフォルダをクリックして反転させたあとに右クリックのメニューから"Make alias"を実行する。作られたエイリアスを"~/Sites"以下にコピーする。

これだけで複数マシンの同期が完了しました。なかなかに便利です。
おしまい。

MATLAB: セル配列から文字列を検索してインデックスを返す

セル配列にある文字列のインデックスと配列の構造体の任意の次元の値が対応しており、文字列の情報を引数にデータを引っ張り出してきたいという場面に出くわしました。
(しっかり設計していれば、インデックスで対応させるんじゃなくて、構造体にまとめるなりなんなり出来るはずですが。)

MATLABの文字列検索三兄弟(strncmp, strmatch, validatestring)のstrmatchを使ったら期待通りの結果が得られました。

>> city = {'tokyo', 'kyoto', 'osaka', 'okinawa'}

city = 
    'tokyo'    'kyoto'    'osaka'    'okinawa'

>> index = strmatch('kyoto', city)

index =
     2

% 第三引数に'exact'をつけると完全一致を探してくれるみたいです。

ただ、公式のドキュメントにこのstrmatchの使用は推奨されないとの表記が。。
strncmpだと全てのセル配列との比較結果が論理値が返ってくるから、インデックス番号を知りたければfindを使うみたいです。
ということでこちらがナウい書き方

>> index = find(strncmp('kyoto', city, 5))

index =
     2

ずぼらなので、第三引数に数字を渡さなきゃいけないのがとんでもなくめんどくさいと思ってしまいます。

追記:昔のフォルダを漁っていたら、同じことをするためにstrcmp, for, ifを駆使してインデックスを見つけてくるという闇魔術関数を作成していた...

MATLABで任意の配列の全体に処理を行う

ある配列の最大値・最小値を取ってきたり、allやanyを使って非ゼロの判定をする時に、行ごとや列ごとではなく、全体を一度処理したいことがあると思います。

% 配列の定義
>> A = rand(3)
A =

    0.2551    0.8909    0.1386
    0.5060    0.9593    0.1493
    0.6991    0.5472    0.2575

% 最大値の取得
>> max(A(:))
ans =

    0.9593

(:)は配列全体をひとつの列として処理するという処理になるみたいです。こんな書き方があるのを知りませんでした。。
すっきりした書き方を知るとコードの可読性も上がるし、ちゃんとドキュメントを読むのが重要ですね。
今まではこんな感じで配列の次元の数だけmax関数を使うという、なんとも原始的な方法を使っていました。(恥)

>> max(max(A))
ans =

    0.9593

MATLABのタテとヨコ

他のアプリケーションで作成した(x,y)の成分で表される情報(画像など)をMATLAB上で行列として取り込む時に素直に代入してしまうと、期待していなかった行列が生成されてしまってウンウン唸ることがありました。(昨日、数カ月ぶり2度目)

% x_info: 外部アプリで作成したx成分, y_info: 外部アプリで作成したy成分
mat(x_info, y_info) = value;

MATLABMATは行列なので、第一要素には行成分、第二要素には列成分が入ります。
なので、x,yの2次元のグラフを頭の中で描くときとは値の代入の仕方が違うんですよね。

転置すればそれで万事解決なのですが。。 これに気づくのに1時間近く無駄にしてしまいました(泣