Ubuntuでlessを使って構文をカラー表示する方法

viやgeditなどを使うと、シェルスクリプトなど、様々な構文を自動でカラー表示させることができて便利です。しかし、lessで表示させると白黒でわかりづらくなってしまいます。

そこで、lessでカラー表示する方法がないか調べたところ、様々な方がその情報を発信されていました。

  • とりあえず、解決法
  • 時間がない方は、以下の2つをやってください。

    まず、source-highlightをインストールします。

    $ sudo apt-get install source-highlight
    

    次に、以下の2行をホームディレクトリにある.bashrcに追加します。

    #Source-hilight with less
    export LESSOPEN="| /usr/share/source-highlight/src-hilite-lesspipe.sh %s"
    export LESS='-R'
    

    これを保存し、シェルを新しく起動すると、lessでシェルスクリプトが色付きで表示されるようになります。ちょっと感動です。

    私のサンプルスクリプトは下図のようになります。

    less_color

    ここまでなら、いくつもあるのですが、原典にあたってみたいということと、LESSとLESSOPENの意味を調べてみたので、少し紹介します。

  • 原典
  • この情報の出処は、GNU Source-highlightの解説サイトと考えられます。こちらになります。

    引用しておきます。

    This was suggested by Konstantine Serebriany. The script src-hilite-lesspipe.sh will be installed together with source-highlight. You can use the following environment variables:

    export LESSOPEN=”| /path/to/src-hilite-lesspipe.sh %s”
    export LESS=’ -R ‘

    This way, when you use less to browse a file, if it is a source file handled by source-highlight, it will be automatically highlighted.

  • 変数LESSの意味
  • 次に、LESS=’-R’の意味が何かを調べてみました。いろいろ調べたところ、lessのmanページの解説が一番しっくりきました。以下のように記載されています。

    -R または –RAW-CONTROL-CHARS
    -r と似ているが、可能な場合には画面表示を正しく維持しようとする。 このオプションが有効なのは、入力が通常のテキストの場合である。入力には ANSI の「カラー」エスケープシーケンスが含まれていてもよい。 このシーケンスは

    ESC [ … m

    のような形式で、”…” は “m” 以外の 0 個以上の文字である。画面の状況を保つため、 全ての制御文字と ANSI カラーシーケンスは カーソルを移動させないと仮定している。 less に “m” 以外の文字を ANSIカラーエスケープシーケンスの終了文字として認識させることもできる。そのためには、認識させたい終了文字のリストを 環境変数LESSANSIENDCHARS に設定すればよい。

    ここに「カラー」エスケープシーケンスとありました。
    どうもこれを指定することで、色がきちんと表示されそうです。
    ちなみに、これを指定しないとどうなるかやってみました。
    その結果は、一目瞭然です。

    less_bw

  • LESSOPENの意味
  • 次に、LESSOPENです。なぜ、最初にいきなりパイプが入っていたり、最後に%sがあるのでしょうか。これも、lessのmanページに記載がありました。引用します。

    入力プリプロセッサ
    less のための「入力プリプロセッサ」を定義することができる。 less がファイルを開く前に、入力プリプロセッサで 入力ファイルの内容の表示の仕方を変更することができる。 入力プリプロセッサに渡される。 入力プリプロセッサは、ファイルの内容を 代替ファイルと呼ばれる別ファイルに書き出す 単純な実行可能プログラム (もしくは、シェルスクリプト) である。 代替ファイルの内容がオリジナルファイルの内容の代わりに表示される。 しかし、ユーザーにとってはオリジナルファイルが開かれているかのように見える。less は現在の代替ファイルの名前としてオリジナルファイルの名前を表示する。

    入力プリプロセッサは、ユーザーによって入力される オリジナルファイル名を1 つのコマンドライン引き数として受け付ける。 そして、代替ファイルを生成し終えると、代替ファイル名を標準出力に表示する。 入力プリプロセッサが代替ファイル名を出力しない場合、less は標準としてオリジナルファイルを用いる。 入力プリプロセッサは、標準入力を閲覧する場合には呼び出されない。
    入力プリプロセッサを設定するためには、 入力プリプロセッサを呼び出すコマンドラインを環境変数 LESSOPENに設定する。このコマンドラインには、入力プリプロセッサコマンドが呼び出されるときに、ファイル名に置き換えられる文字列 “%s” を含んでいなければならない。

    ここで%sの意味が明らかになりました。最後の%sは、ファイル名を意味するのですね。

    その後に以下のような記載があります。

    ファイルのデータを代替ファイルに書き出さず、そのまま、less にパイプするような入力プリプロセッサを設定することも可能である。こうすることにより、閲覧する前に圧縮ファイル全体を展開するのが避けられる。このような働きをする入力プリプロセッサは、入力パイプと呼ばれる。 入力パイプは、代替ファイル名を標準出力に表示する代わりに、代替ファイルの内容全てを標準出力に書き出す。入力パイプが標準出力に何も書き出さない場合、代替ファイルは生成されず、less は普通にオリジナルファイルを使う。入力パイプを使う場合は、入力プリプロセッサが入力パイプであることを知らせるために、環境変数 LESSOPEN の最初の文字を、縦棒 (|) に設定する。

    つまり、LESSOPENの最初に指定するパイプ(|)は、入力プリプロセッサが入力パイプであることを明示しているわけですね。

    つまり、私の理解では、上記の2行によって、

    • ファイルをパイプで、src-hilite-lesspipe.shに渡す。%sは渡すファイル名を意味
    • 変数LESSに-Rを指定することによって、色のエスケープシーケンスを設定し、端末上に色が表示されるようにする

    ことを可能にしているわけですね。

掘り下げて勉強した結果、manページに当たることの大切さを再び学びました。

How to install official NVIDIA drivers on Xubuntu 14.04

(I wrote this post originally in Japanese, but this post may be helpful universally, so re-write in English.)

I got a new PC with NVIDIA GeForce GTX 750 Ti in December 2014.

At that time nvidia-current did not support GTX750Ti, so I needed to install drivers from nvidia website. However, some tweaks were needed to get things done, so I drop a note how to install NVIDIA drivers without much pain.

続きを読む

A Matlab script to generate ROI masks using an Atlas in SPM12

SPM12 introduces some useful functions such as spm_atlas or new atlas “labels_Neuromorphometrics.” We find the description about labels_Neuromorphometrics in SPM12 Release note.

Maximum probability tissue labels derived from the “MICCAI 2012 Grand Challenge and Workshop on Multi-Atlas Labeling” are available in files tpm/labels Neuromorphometrics.{nii,xml}. These
data were released under the Creative Commons Attribution-NonCommercial (CC BY-NC) with no end date. Users should credit the MRI scans as originating from the OASIS project and the labeled
data as “provided by Neuromorphometrics, Inc. under academic subscription”. These references should be included in all workshop and final publications. See spm templates.man for more details about the generation of this file.

I wanted to generate masks of some regions using this labels_Neuromorphometrics.

Below is the tiny script which generates masks from your preferred atlas.
Running script brings up a file selector. You can choose any atlas you want.
Then it brings up another dialog which lists the region within the atlas. You can choose as many regions as you want, and the scripts generates masks whose file name is the name of the regions.


%generate_masks_from_atlas.m
%This script generate mask files from any atlases you prefer.
%K. Nemoto 25 April 2015

xA=spm_atlas('load');
S=spm_atlas('select',xA);

for i = 1:size(S,2)
    fname=strcat(S{i},'.nii');
    VM=spm_atlas('mask',xA,S{i});
    VM.fname=fname;
    spm_write_vol(VM,spm_read_vols(VM));
end

Download generate_masks_from_atlas.m (right click and save as)

A Matlab script to set origin to the center of the image using SPM

Sometimes we need to handle images whose origin is far from the center of the image.
My friend, Fumio Yamashita, from Iwate Medical University wrote a script which set the origin to the center of the image.

Usage is very simple.

    Download
  1. setorigin_center.m (Right click and save as…) and save in SPM directory or any directories under MATLAB path.
  2. Type the following in Matlab command window.
  3. >>setorigin_center
  4. This will pop up the file selector, so choose the images you want to set the origin to the center.

That’s it.

Below is the example of the script.

Left is before applying the script. You can see that the origin is far from the center.
Right is after applying the script. Now origin is set to the center.

setorigin_screenshot

(筑波大関係者専用)Ubuntuで筑波大のVPNサービスに接続する方法

筑波大の学術情報メディアセンターはVPNサービスを運用してくださっています。
非常にわかりやすいマニュアルを提供してくださっていますが、残念ながら、Linuxのマニュアルはまだ提供されていません。

そこで、私の環境(Xubuntu 14.04)でOpenVPNを使ってうまくVPN接続に成功しましたので、備忘録を兼ねて書いておきます。

続きを読む

Ubuntu12.04以降に本家TeX Live 2014を簡単にインストールする方法

先日、私のシステムをXubuntu 12.04からXubuntu 14.04にアップグレードしました。
私はLaTeXに関しては、本家のTeX Live 2014を使っています。インストーラーは十分に使いやすいのですが、怠け者なので、より簡単にできないかと方法を探してみました。

なぜかというと、本家を使う場合、リンクにあるように、少し設定が必要だからです。

そのリンクをひとつずつ確認していたところ、ある方が、Ubuntu用の本家TeX Live 2014インストールスクリプトを公開しているということを知りました。

早速トライしてみたら便利だったので、紹介します。

続きを読む

Ubuntu 14.04 へのFreeSurferのインストール

以前、FreeSurferのインストールの方法を記載しましたが、しばらく時間が経ちました。最近、改めてFreeSurferをインストールする機会がありましたので、改めてまとめてみます。2014年12月現在、FreeSurferのバージョンは、5.3.0です。コピペでもいけるぐらいにまとめてみます。

英語でのFreesurferをLinuxにインストールするときの具体的な方法は、
http://surfer.nmr.mgh.harvard.edu/fswiki/LinuxInstall
に書いてあります。以下は英語を読むのがつらい方のためです。

続きを読む

2014年12月包括脳VBMチュートリアル配布資料(VBMの実践)

2014年12月13日に包括脳MRI脳画像解析チュートリアルが開催されました。
私はVBMチュートリアルを担当しましたが、その時の配布資料を公開します。

このPDFは、「すぐできるVBM」の補足のような位置づけにあります。
すぐできるVBMのサンプルデータを使っていますし、チュートリアルを受講していない方々でも、このPDFを参考にしていただければ、さらなる知識が得られるのではないかと思います。

ダウンロードはこちらからどうぞ。

SPM8とSPM12をよりスマートに同一のMatlabのライセンスで使用する方法

しばらく前に、SPM8とSPM12を同一のMatlabのライセンスで使用する方法という記事を書きましたが、先日の包括脳チュートリアルのアンケートで、「SPM8とSPM12を併存する方法がわかりにくい」というご指摘をいただきました。

ということで、ひとつのスクリプトで全部解決できる方法を考えてみました。
奇しくも、SPM-MLで同じような話題があり、私もその話題に加わったもので、その結果を受けています。

続きを読む

Linuxにおけるハイフンの意味

ときどき、下記のような表現を見ます。

$ wget -O- http://www.example.com/example.gpg.key | sudo apt-key add -

この -Oのあとについているハイフンや、apt-key addのあとについているハイフンの意味をきちんと理解していませんでした。

改めて、調べたら、いろいろな方が解説してくれていました。

結論からいうと、

Linuxにおけるハイフンは、標準入出力をさす

のですね。

上記の例の場合、wget -O は本当はファイル名を引数にもつはずで、

wget -O file となるはずなんです。

でも、今の場合、-を指定することで、

wget -O- はその内容を、標準出力に表示するんですね。
今の場合は、example.gpg.keyが表示されるわけです。

で、上記の場合、さらにパイプがつながっていて、apt-key add -と続きます。
今回のハイフンは、今度は標準入力になるわけですね。

つまり、example.gpg.keyの内容が標準出力に出力され、
それがパイプで今度は標準入力になって、apt-key addの引数として使われるわけです。

となると、次と同じということですね。

$ wget -O tmpfile http://www.example.com/example.gpg.key
$ sudo apt-key add tmpfile
$ rm tmpfile

ハイフンを上手に使うことで一時ファイルを作ることなくパイプを使うことができるわけです。
スマートですね。

Xubuntu 14.04にNVIDIAの最新ドライバーをインストールする方法(Xubuntuをテキストモードで起動させる方法)

先日、新しいデスクトップマシンが職場に到着しました。
早速、Lin4Neuro-14.04をインストールしたところ、画面解像度が1280×1024までしかでなく、悲しいことに…。

グラフィックボードはNVIDIA GeForce GTX 750 Tiが搭載されています。

Ubuntuのnvidia-currentではまだ未対応であることから、本家のサイトからドライバーをインストールすることとしましたが、ひと手間だったので、その経過をまとめます。

続きを読む

Lin4Neuro based on Xubuntu 14.04LTS was released

I managed to customize Xubuntu 14.04LTS to be Lin4Neuro-14.04.

L4N-trusty-screenshot

For this customization I did the following;

  • .desktop files for neuroimaging analysis packages are stored in .local/share/applications
  • Neuroimaging.directory is stored in .local/share/desktop-directories.
  • Custom icons are stored in ~/.icons

If you look at these files, you will see how you can add your entries to menu.

I keep maintaining Xubuntu 12.04 because I am not certain Connectome mapper works in Xubuntu 14.04. If you want to use Connectome mapper, I recommend to use Lin4Neuro 12.04.

Grubで困った時にまずすること

先日、デュアルブートのマシンでXubuntuのアップデートをした時にGrubがアップデートされ、質問に適当に答えていたら、Grubのエントリーが消えてしまうという事件がありました。

Grubの設定をいろいろするのはめんどくさい、何かいい方法がないかなと探していました。
そうしたら、ありました。めんどくさがりにぴったりなコマンドが。

$ sudo update-grub

これで、システムに入っているOSを探し出し、自動でメニューにエントリーしてくれます。

ということで、Grubで困ったら、焦らず、まずはupdate-grubをタイプしてみてはどうでしょうか。

Mac OSX YosemiteにアップグレードしたらFSLが動かなくなった場合の対処法

私自身も遭遇しましたし、他の方からも問い合わせがありましたので、簡単に記載しておきます。

MacをYosemiteにアップグレードした際に、FSLが動作しなくなることがあります。
その際には、バタバタする前に、まず、XQuartzを再インストールしてみてください。
それだけで問題が解決することがあります。

本家にも情報がありました。

Note for Yosemite (10.10) users: even if you have previously installed X11, you will need to reinstall it from the XQuartz web page to get FSL to work.

これで、問題解決といって大丈夫そうです。

Making 2-up pdf files using pdfnup included in Tex Live 2014

I needed to make a 2-up pdf out of slide pdfs. That is, original slide pdf is landscape, and I wanted to put 2 slides in one page.

Googling led me “pdfnup”. Since I installed Tex Live 2014 on my machine, pdfnup was already installed.

So, I tried the following

$ pdfnup --orient portrait --nup 1x2 input.pdf

This resulted in error, which said

  pdfnup ERROR: the --orient option is not allowed,
  use --landscape or --no-landscape to specify
  the output page orientation</blockquote>

so I used –no-landscape option

$ pdfnup --no-landscape --nup 1x2 input.pdf

This made input-nup.pdf and that is 2-up pdf!

This tool is so useful for preparing handouts for presentation.

In addition to the above example, the author shows a nice example of how to produce a handout from a file of presentation slides.
For slides made with the standard 4:3 aspect ratio a nice 6-up handout on A4 paper can be made by

$ pdfjam --nup 2x3 --frame true --noautoscale false \
  --delta "0.2cm 0.3cm" --scale 0.95 myslides.pdf \
  --outfile myhandout.pdf

Scripts to convert hdr/img format into nii format

Nifti file havs two kinds of extensions, hdr/img or nii.
Sometimes hdr/file nifti files can be confusing because the extension is the same as ANALYZE format.
There are some ways to convert hdr/img into nifti.
One is to use fslchfiletype included in FSL. This is the easiest, but it requires FSL.
The other is to use SPM. However, some scripting is needed.
So I wrote tiny scripts for converting hdr/img format into nii format.

If you prefer SPM, use img2nii_spm.m. Save the script into a folder under MATLAB path and type “img2nii_spm” from MATLAB command window.

%%img2nii.m--------------------------------------------
%Script to convert hdr/img files to nii.
%This script uses SPM function, so you need to install SPM5 or later.
%Kiyotaka Nemoto 05-Nov-2014

%select files
f = spm_select(Inf,'img$','Select img files to be converted');

%convert img files to nii
for i=1:size(f,1)
	input = deblank(f(i,:));
	[pathstr,fname,ext] = fileparts(input);
    output = strcat(fname,'.nii');
    V=spm_vol(input);
    ima=spm_read_vols(V);
    V.fname=output;
    spm_write_vol(V,ima);
end

If you prefer FSL, use img2nii_fsl.sh. Save the script into a folder, add executable attribute using “chmod 755 img2nii_fsl.sh”.
Wild card can be used for selecting files.

#!/bin/sh

#Image file type converter using fslchfiletype
#This script converts various image files into NIFTI format (.nii) files.
#K. Nemoto 19 Jan 2013

if [ $# -lt 1 ] ; then
	echo "Please specify the files you want to convert!"
	echo "Usage: $0 filename"
	exit 1
fi

for file in "$@" ; do
	if [ -f $file ] ; then
		fslchfiletype NIFTI $file
	else
		echo "$file: No such file"
	fi
done

Download img2nii_spm.m (Right-click and save).
Download img2nii_fsl.sh (Right-click and save).

SPM12におけるspm_defaults.mの設定 【重要】

SPM12の正式版が出て、気づいたのですが、spm_defaults.mの設定に関して、重要な変更が行われました。

今後は、spm_defaults.mは直接いじってはいけないことになりました。
これは、非常に理にかなっていることで、これまで、spm_defaults.mを修正しても、アップデートによってこれが上書きされてしまうことがありました。これを回避するために、新たな方法が導入されました。

「すぐできるVBM」のp.22 「8.SPMの設定」に関しての記載を以下のように訂正します。

spm_defaults.mの最初の記載のスクリーンショットは以下のようになります。

spm_defaults_screenshot

シンプルにいうと、以下のようになります。

  • spm_defaults.mは編集しない
  • MATLABのパスが通っているところにspm_my_defaults.mを作成する

私がSPMをインストールして行う作業は、defaults.stats.maxmemを編集することです。これは、統計の際に、Matlabにメモリをどの程度まで使わせてあげるかという設定です。デフォルトは2^26バイトで、64MBになります。せっかくメモリを多く積んでいる場合、これはもったいないです。そのため、私は2^31(=2GB)としています。

Matlabから以下のようにタイプします。

edit spm_my_defaults.m

そこに以下のように記載します。

global defaults
defaults.stats.maxmem = 2^31;

スクリーンショットを以下に示します。

spm_my_defaults_screenshot

これを保存するのですが、MATLABのパスが通っているところならばいいのですが、
無難なのは、ドキュメントフォルダの下のMATLABフォルダもしくは、SPM12のフォルダ内に保存したらよいと思います。

このうえで、SPMを起動すると、きちんと認識されると、Matlabのコマンドウィンドウ内に以下の表示がなされるはずです。

spm_screenshot_modified_defaults

これで設定が終了です。これは重要な設定ですので、チェックするようにしてください。

包括脳MRIチュートリアルが12月13日に開催されます

毎年開催している包括脳MRIチュートリアルですが、
今年は12月13日(土)に開催されることになりました。

詳しい案内はこちらをご覧ください。

VBMチュートリアルに関しては、席はあと20席程度残っているとのことです。

今回は、

・画像のQC(岩手医大山下先生)
・多重比較補正についての理解(京大川口先生)
・SPMの結果を論文に載せるまでの具体的手順

といった内容を計画しています。

関心のある方は、こちらにある申し込み方法をご覧のうえ、ご応募ください。

Linuxでfind, sedを使いながら文字列を再利用してファイル名の途中に文字列を挿入する方法

最近、以下のようなことをやる必要がありました。

ファイル名が

201105_ID.jpg
20120608_ID.jpg
20130704_ID.jpg
201409_ID.jpg

となっているファイル(年月が必ずあり、日が時についている)に対して、
年の後にアンダースコアを入れたい、つまり、

2011_05_ID.jpg
2012_0608_ID.jpg
2013_0704_ID.jpg
2014_09_ID.jpg

としたいわけです。

もし、最初の4文字が全く同一の文字列ならばただ置換すればよいので、全く問題ありません。
たとえば、すべて最初が2011からはじまるのであれば、
renameを使って、

find . -name '2011*' | rename 's/^2011/2011_/'

とするだけです。

しかし、今回は、4文字ということでは規則性がありますが、それぞれの中はバラバラの値です。

(ブログのコメントを受けて、ここを修正します。ちょうど2015年1月の正月に正規表現の勉強をしていたので、非常にタイミングのよいコメントをいただきました。松森様、どうもありがとうございます)

ただ、規則性はあります。最初は数字4文字、で、その後にアンダースコアを入れて残りの数字をいれたらいいわけです。

正規表現で、数字は\dで表すことができます。そして、繰り返し回数は{n}であらわせます。
今の場合、数字4桁は、\d{4}となるわけですね。

その後の数字は、\d+ とあらわすことができます。+は正規表現で1回かそれ以上ですから。

そして、最初の数字4桁のグループと残りの数字をそれぞれ()で2つのグループにわけます。

ファイルの最初は^であらわせますから、ファイルの最初の数字は以下のように表現できます。

(^\d{4})(\d+)

そして、前半のグループは$1、後半のグループは$2で表現できます。
今、グループ1とグループ2をアンダースコアで接続したもので置換したいので、
renameを使うと以下のように表現できます。

$ rename 's/(^\d{4})(\d+)/$1_$2/' 20*ID.jpg

これで一気に置換できます。正規表現でのグルーピングは慣れるととても強力ですね。
このようにネット上で教えてもらえるのはとてもありがたいことです。
完全に独学ですので…。

(以降はオリジナルの記事です)

いろいろ調べる中で、いくつかポイントが見つかりました。

  • findのオプション、-execを組み合わせる
  • findで合致したファイル名を再利用するには、{}を使う
  • sedにおいて検索で使った文字列を再利用するには、&を使う
  • bashで文字列を引数にとるためには、-cオプションを使う
  • find -execオプションは必ず;で終わらないといけないが、bashではエスケープシーケンスが必要になるために、必ず\;となる。

今回うまくいったワンライナーをご紹介します。(といっても上のワンライナーの方がずっとエレガントです。ただ、自分の学習過程を記録しておくことも意味があるので、残しておきます)

$ find . -name '201*' -exec bash -c "mv {} \`echo {} | sed -e 's/201./&_/'\`" \;

これを(あとで自分が忘れないために)もう少し解説します。

find . -name '201*'

この部分は、findの基本的な使い方です。
find <検索したい場所> -name <ファイル名> です。
ワイルドカードを使いたい場合は、シングルクオートかダブルクオートでくくらなければいけません。
*の場合は、どちらでも大丈夫です。

-exec bash -c

findのオプションで-execを使うと、コマンドを実行することができます。

今は、複雑なことをやりたいので、シェルを呼び出します。そのために、bashとしています。
man bashとすると以下のように書かれています。

オプション
bash は以下のオプションを起動時に解釈します (組み込みコマンド set の説
明で述べられている 1 文字のシェルオプションも使えます):

-c string -c オプションが指定されると、コマンドが string から読み込まれ
ます。 string の後に引き数があれば、これらは 位置パラメータ
(positional parameter: $0 からはじまるパラメータ) に代入され

今は複数のコマンドを読み込みたいので、-cオプションを指定します。

"mv {} \`echo {} | sed -e 's/201./&_/'\`" \;

これが今回のキモです。

まず、bash -cの後は文字列ですので、それを明記するために全体をダブルクオーテーションでくくっています。
そして、find -execの最後は;で終わるとなっているのですが、エスケープシーケンスが必要のために\;とします。

残るは mv {} \`echo {} | sed -e ‘s/201./&_/’\` です。

mv の後の{} はfindで見つかったファイル名を意味します。ここで、findの結果を利用できるわけです。

そして、\`echo {} | sed -e ‘s/201./&_/’\`

がmvの後半部分になります。これは全体がバッククオート`でくくられています。エスケープさせる必要があるために、\`となっています。

バッククオートの中を見ると、

echo {} | sed -e ‘s/201./&_/’

となっていて、先ほどと同様に{}はfindの結果を利用するわけで、echo {}で文字列を表示したうえで、それをsedを使って文字列置換をするわけです。

sedの文字列置換は正規表現を用いることができますので、検索文字列は2011,2012,2013,2014のいずれかですから、201.としました。
そして、その後が大事なのですが、sedの検索文字列をそのまま使える方法が、&となります。
今の場合、見つけた文字列の後にアンダースコアをつけたいので、&_としました。

これで無事にファイル名を変更することができました。数千のファイルをたった1行のコマンドで一気に変更できましたので、かなりすっきりしました。といってもここにたどり着くまでに数週間かかりましたが…。

bashでできる技なので、Linuxに限らず、Macでも同様にできるかと思われます。
ただ、これは我流でたどり着いた方法なので、もっとエレガントな方法がありましたら、ぜひ教えていただきたいです。

SPM8とSPM12を同一のMatlabのライセンスで使用する方法

SPMのメーリングリストでSPMの中の人が明らかにしていますが、SPM12の正式版がそろそろ公開されるようです。SPM12が正式に公開されました。(2014年10月1日)

SPM12はいろいろよい点も加わっていますが、まだ、プラグインで対応していないものも多々あります。
このため、しばらくは、SPM8とSPM12が同時に動かせる環境にあった方がよいですよね。

いい方法がありますので、ご紹介します。

以下の2つのファイル(spm8.mとspm12.m)をMatlabのパスが通っているフォルダ(ディレクトリ)に保存します。
Windowsの場合、「ドキュメント」の下のMATLABフォルダがよいでしょう。
Macの場合、「書類」の下のMATLABフォルダがよいでしょう。
これらはパスが通っているフォルダです。

そして、最初の4行と最後の方のaddpathからはじまる行を自分の環境にあわせて調整します。

このスクリプトがしているのは3つです。

  1. SPMのパスとツールボックスのパスを変数として指定します。
  2. SPMのパスが既にある場合、spm_rmpathを用いてそのパスを取り除きます。
  3. 改めてSPM8もしくはSPM12のパスを設定します。

以下にspm8.mのスクリプトを例に説明していきます。

%%spm8.m
%%specify spm8 and other toolbox path
spm8_path = 'c:\spm\spm8';
pickatlas_path = 'c:\spm\spm8\toolbox\wfu_pickatlas';
%spm-related_path = 'path_to_the_application';

%からはじまる行はすべてコメントなので気にしなくていいです。
spm8_path = のところで、SPM8がインストールされているフォルダを設定します。
pickatlas_path = のところで、(例として)PickAtlasのフォルダを設定します。
同様に、他にも設定しなくてはいけないプラグインがあったら、ここに設定します。
(これまで、設定する必要があったのは、PickAtlasとAnatomyツールボックスぐらいです。
その他はあえて設定する必要はありません)
これを後に使います。

% remove spm path
while true
  try
    spm_rmpath;
  catch
    break
  end
end

ここはいじる必要がありません。
まず、spm_rmpathというコマンドをトライします。
もし、SPMにパスが通っていれば、このコマンドが実行され、SPMのパスが取り除かれます。
もし、パスが通っていなければ、実行されずにそのまま次に進みます。

% add spm8 and related path
addpath(spm8_path,pickatlas_path);

次に、addpathを使ってパスを設定します。
addpathの中に先程設定したパスを書きこんでいきます。順序が大事で、先にspm8_pathを書き、その次にツールボックスのパスを書きます。

% run spm8
spm;

最後にSPMを起動します。

関心のある方は、下記の2つをダウンロードして、ご自身の設定にあわせて修正してご利用ください。

spm8.mをダウンロード(右クリックで「名前をつけ保存」から保存してください)
spm12.mをダウンロード