Making use of eddy_cuda of FSL 6.0.4 on Ubuntu 18.04

eddy implemented in FSL is time-consuming program. FSL recommends using eddy_cuda, GPU version of eddy. They ship eddy_cuda8.0 and edddy_cuda9.1. If you use Ubuntu 18.04, you can make use of eddy_cuda9.1 with only 4 commands.

Disclaimer: Installing nvidia-driver could cause display problem. I am not responsible for the problem…

続きを読む

Ubuntu18.04上のFSL6.0.4でeddy_cudaを使う方法

FSLにはeddyという拡散MRI画像の渦電流を補正するプログラムが搭載されています。
かつてはeddy_correctというシンプルなプログラムでしたが、
今のeddyは、計算量がとてつもなく大きな(=処理時間がかかる)プログラムとなっています。

Liux版のFSLには、eddy_openmp というCPU版と、eddy_cuda{8.0,9.1}というGPU版があります。

Ubuntu 18.04 が搭載されているLinuxで NVIDIA製のグラフィックボードが搭載されている場合、eddy_cudaを比較的簡単にセットアップできるので紹介します。

注意:NVIDIAのドライバを入れる時点で、ディスプレイの解像度が変になることがあります。現在の実働マシンに使う場合は相当注意しながら行ってください。個々人の環境があまりにも違うのでこの方法で不具合が起こっても責任は負いかねます。(すでに3台のマシンでセットアップを行い問題ないことを確認していますが…)

続きを読む

Ubuntu で Rの「署名が無効です」への対処法

UbuntuでRを使っていらっしゃる方は多いと思います。
R3.5以上を使う場合、https://cran.rstudio.com/bin/linux/ubuntu bionic-cran35 を使っている場合が多いです。
このリポジトリの署名が2020年10月16日に失効しました。

このため、apt update で以下のエラーが出ます。

署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG
エラー: https://cran.rstudio.com/bin/linux/ubuntu bionic-cran35/ InRelease:
以下の署名が無効です: EXPKEYSIG 51716619E084DAB9 Michael Rutter
<marutter@gmail.com>
W: https://cran.rstudio.com/bin/linux/ubuntu/bionic-cran35/InRelease
の取得に失敗しました  以下の署名が無効です: EXPKEYSIG 51716619E084DAB9
Michael Rutter <marutter@gmail.com>
W:
いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

この対処法としては、署名の有効期限をアップデートする必要があります。

まず、apt-key listで公開鍵の一覧を取得します。

apt-key list

そうすると、結果の中で以下が見つかるかと思います。

pub   rsa2048 2010-10-19 [SCA] [期限切れ: 2020-10-16]
       E298 A3A8 25C0 D65D FD57  CBB6 5171 6619 E084 DAB9
uid           [期限切れ] Michael Rutter <marutter@gmail.com>

公開鍵は E298 A3A8 25C0 D65D FD57 CBB6 5171 6619 E084 DAB9 となります。

視認性のために4文字ごとに半角スペースが入っていますが、それを取り除くと以下になります。

E298A3A825C0D65DFD57CBB651716619E084DAB9

この鍵を用いて、以下のコマンドで新しい署名を入手します。

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

そうすると、以下のような表示になるかと思います。

gpg: 鍵51716619E084DAB9: "Michael Rutter <marutter@gmail.com>" 新しい署名を2個
gpg: 処理数の合計: 1
gpg:         新しい署名: 2

apt-key list を再度行うと、以下のようになり、有効期限が2027年9月30日になったことが確認できるかと思います。

pub   rsa2048 2010-10-19 [SCA] [有効期限: 2027-09-30]
      E298 A3A8 25C0 D65D FD57  CBB6 5171 6619 E084 DAB9
uid           [  不明  ] Michael Rutter <marutter@gmail.com>
sub   rsa2048 2010-10-19 [E] [有効期限: 2027-09-30]

Workaround for FSL 6.0.4 python dependencies

imglob or imcp provided with FSL requires numpy.testing.decorators. However, numpy.testing.decorators has been deprecated from numpy 1.18. So, if you use numpy >=1.18, you see the following error:

ModuleNotFoundError: No module named 'numpy.testing.decorators'

Paul Mccarthy kindly suggested a workaround for this problem.

The below is his original message.
https://www.jiscmail.ac.uk/cgi-bin/wa-jisc.exe?A2=FSL;a26a0779.2010

1. Move $FSLDIR/fslpython/envs/fslpython/bin/python3.7 to $FSLDIR/fslpython/envs/fslpython/bin/python3.7_bin
2. Replace $FSLDIR/fslpython/envs/fslpython/bin/python3.7 with a script containing this:

#!/usr/bin/env bash
thisdir=$(cd $(dirname $0) && pwd)
$thisdir/python3.7_bin -I "$@"

3. Change the permissions of the new $FSLDIR/fslpython/envs/fslpython/bin/python3.7 to make it executable

With this suggestion, I wrote a tiny script.

#!/bin/bash

cd $FSLDIR/fslpython/envs/fslpython/bin/
sudo mv python3.7 python3.7_bin

cat << 'EOF' | sudo tee python3.7 > /dev/null
#!/usr/bin/env bash
thisdir=$(cd $(dirname $0) && pwd)
$thisdir/python3.7_bin -I "$@"
EOF

sudo chmod 755 python3.7

This script will make FSL use internal python within FSL.

シェルスクリプトで改行を削除したい時は、perl -pe ‘s/\n//’ が便利

タイトル通りの投稿ですが、よく忘れるので、備忘録として。

スクリプトを書いている時に、入力ファイルの改行を全部とって1行にしたいという時があります。

たとえば、

seq 5 > list
cat list
1
2
3
4
5

となっている時、これを

1 2 3 4 5

としたいような時をイメージしてください。

これを sed でやろうとするとうまくいきません。

sed 's/\n//' list
sed 's/\r//' list

などでいくかと思えどうまくいかず、いろいろはまることになります。
さらにmacとLinuxでは、sedがBSDのsedとGNU sed で違うため、ここもまたはまる原因になります。

でも、sedにこだわらず、Perlで

perl -pe 's/\n/ /' list

とすると、あっさりうまくいきます。
(細かく言うと、Windowsだと、\r\nだったりしますが、とりあえず、UNIX環境と仮定します)

なお、perlのオプション -e は引数をそのままプログラムとして実行するオプションで、ワンライナーでは必須のものであり、オプション -p は、入力の各行に対してプログラムを実行し、最後に結果を表示するオプションとのことです。こちらのサイトに詳しく書いてあり、勉強になりました。

ということで、シェルスクリプトで改行の削除に困ったら、sedにこだわらず、perl -pe を活用すると迷う時間が減るかもしれません。

UbuntuでGnumericを用いてCSVをXLSXに変換する方法

あるプロジェクトで、csvファイルをxlsxに変換する必要がありました。
いろいろな方法がありますが、比較的やりやすかった方法がありましたので、備忘録として記載します。

方法は、gnumeric (とnkf)を使う方法です。インストールは簡単です。

sudo apt install gnumeric nkf

ここでは、例として、sample.csv を sample.xlsx に変換したいと考えます。

  1. 文字コードをUTF-8に変換
  2. 日本語が入っている場合、Shift-JISなどだとうまくいかない場合があるので、文字コードをUTF-8に変換します。

    nkf -wLu --overwrite sample.csv
    
  3. Gnumericで変換
  4. Gnumericについているssconvertというプログラムが簡単に変換してくれます。

    ssconvert sample.csv sample.xlsx
    
  5. XLSXシートのタブ名から.csvを取り除く
  6. 簡単なのですが、この場合、sample.xlsxのシート名が sample.csv となってしまいます。これは気持ち悪いなと思いました。

    なので、これを取り除く工夫が以下です。xlsxをxmlに変換し、xmlの中の.csvをsedで取り除き、そして、再度xmlをxlsxに変換します。

    ssconvert --export-type=Gnumeric_XmlIO:sax:0 $sample.xlsx sample.xml
    sed -i 's/.csv//' sample.xml
    ssconvert --export-type=Gnumeric_Excel:xlsx sample.xml sample.xlsx
    rm sample.xml
    

これで望みどおりの変換ができました。

以上、まとめると、以下のようなスクリプトになります。

#!/bin/bash
#prerequisites: nkf and gnumeric
for f in *.csv
do
  nkf -wLu --overwrite $f
  base=${f%.csv}
  ssconvert $f ${base}.xlsx
  ssconvert --export-type=Gnumeric_XmlIO:sax:0 ${base}.xlsx ${base}.xml
  sed -i 's/.csv//' ${base}.xml
  ssconvert --export-type=Gnumeric_Excel:xlsx ${base}.xml ${base}.xlsx
  rm ${base}.xml
  mv $f csv
done

UbuntuでDropboxの同期が進まない時は、ディレクトリ数を確認する

最近、あるワークステーションを新規にセットアップしました。
いつもファイルはDropbox経由で同期することによって楽しているので、今回も同じようにしたら、
1週間たっても同期がされません。

おかしいなと思っていろいろ調べてみたら、公式ドキュメントにヒントがありました。

同期できない場合 – 互換性のない特殊文字と不良なファイル名に関する問題の解決方法

Linux で 1 万件以上のフォルダを監視する

Linux 版の Dropbox デスクトップ アプリは、デフォルト設定により 1 万件以上のフォルダを監視することはできません。制限数を超えた場合は監視されないため、同期中に無視されます。簡単な回避策として、まずターミナルを開き、次を入力してください。

echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p

このコマンドでシステムに 10 万件までのフォルダを監視するように指示することができます。コマンドを入力しパスワードを入力したら、すぐに Dropbox が同期を再開します。

私のDropbox内のフォルダ数はどのくらいだろう?と思って、以下のコマンドでディレクトリ数を数えてみました。

find Dropbox -type d | wc -l

その結果ですが、14454 と出てきました。1万件超えています。

そこで、アドバイス通り、以下のコマンドを入力しました。

echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p

そうしたところ、同期がはじまりました!システムで何か変な設定をしてしまったのではないかと心配だったのでほっとしました。

普段使っているDropboxは、少しずつ増えていっているので、おそらく監視しているフォルダ数がそれほど多くないのかもしれませんね。

Bashの様々な設定は、.bashrc ではなく .bash_aliases に書くと事故が防げる

先日、あるスクリプトを書いている中、.bashrcに追記する内容を書いた時に

echo "something" >> ~/.bashrc

と書くべきものを

echo "something" > ~/.bashrc

と誤って書いてしまい、テストでスクリプトを走らせて .bashrc を確認したところ、

something

の一語だけになっており、顔から血の気がひくという経験をしました。

幸いなことに他のシステムの .bashrc をもってきて事なきを得たのですが、
このインシデントに対し、解決策を調べようと思い、.bashrcを見直したところ、以下の記載がありました。

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

意訳します。

# エイリアスの定義
# このファイルに何か追加したい場合、直接追加するのではなく、
# ~/.bash_aliases のような別のファイルに記載したほうがいいかもしれません。
# 詳しくは bash-doc パッケージにある /usr/share/doc/bash-doc/examples をみてください。

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Alias definitions となっていますが、これは、aliasで設定する(いわゆる)エイリアスではなく、
.bashrcのエイリアス(別ファイルとでも言った方がいいのでしょうか)という意味ですね。

まさに私の望むものがありました。

早速、ホームディレクトリの下に、 .bash_aliases というファイルを作成し、
この中にいつもだったら .bashrc に記載する様々な設定を書いたところ、
(もちろんですが、)問題なく動きました。

ということで、

「Ubuntu で .bashrc に追加記載するものは、すべて .bash_aliases に記載すると事故が防げる」

ということを学びましたので、共有させていただきました。

Lin4Neuro based on Ubuntu 18.04 is updated (16 May 2020)

Lin4Neuro based on Ubuntu 18.04 is updated.
Below are main changes.

  • Now iso is generated from Ubuntu 18.04 Desktop so that installer can function properly.
  • Connectome workbench is installed and configured.
  • I changed the strategy to provide installers for huge packages such as AFNI, FreeSurfer, or FSL. It does not come with the release, but you can easily install them by just clicking the installer icons.
  • Bundled software packages are all updated.
  • The neuroimaging software packages available on Lin4Neuro is listed here.
  • VirtualBox appliances are officially provided from now on. Username is “brain” and password is “lin4neuro”. RAM is set to 4GB, and HDD 120GB.

You can get the latest version from here.

Ubuntu で Jupyter Notebook を Google Chrome で起動したい時の設定

Ubuntu で Jupyter notebook を入れるとデフォルトでは Firefox が起動します。
Google Chrome にする方法を探しました。

こちらのリンクに方法が記載されていましたが、記載しておきます。

  • 設定ファイルの書き出し
  • jupyter notebook --generate-config
    

    これで、 ~/.jupyter/jupyter_notebook_config.py が生成されます。

  • Google Chromeのパスの確認
  • which google-chrome
    

    私の場合は /usr/bin/google-chrome でした。

  • jupyter_notebook_config.py の編集
  • 以下の記載を探します。

    # c.NotebookApp.browser = ''
    

    ここを以下に修正します。

    c.NotebookApp.browser = '/usr/bin/google-chrome'
    

    これだけです。

Git LFS on Ubuntu 18.04

Ubuntu 18.04 で Git LFSを使うための備忘録です。リポジトリの作成者側、そして利用者側の観点が必要です。

  • 共通して準備する事項
    • git lfsのインストール
    • sudo apt install git-lfs
      
  • リポジトリ作成側
    • 当該のリポジトリでLFSが使えるようにする
    • git lfs install
      
    • エラー回避
    • .git/hooks/pre-pushがpushエラーを起こすため、削除(後で再作成される)

      cd リポジトリ
      rm .git/hooks/pre-push
      
    • LFSで管理したい拡張子を登録
    • git lfs track "*.nii" "*.nii.gz" "*.mgz"
      

      これで、.gitattributesが作成される。

    • 拡張子が登録されたか確認
    • git lfs track
      
    • コミット
    • 通常どおり、git add; git commitでコミットする。.gitattributesもaddする。

    • プッシュ
    • 通常どおり git push を行う

      git push origin master
      

      パスワードが複数回聞かれる。(理由は調べる必要あり)

  • リポジトリ利用者側
    • クローン
    • git clone を行う

      git clone リポジトリ
      

      この時点では、ファイルの実体はダウンロードされていない。次の git lfs pull で実体がダウンロードされる。少なくとも、この時点で、git lfs を使わない場合に起こるメモリの消費は起こらない。

    • プル
    • ここで、git lfs pull を使う

      git lfs pull
      

Ubuntu上のFSLやFreeSurferでsyntax errorが出る時の対処法

Ubuntu上でFSLやFreeSurferを走らせる時、

Syntax error: "(" unexpected.

といったエラーが出ることがあります。

この原因を探っていたらわかったことがありました。

FSLのプログラムは、基本、bashで動くことを前提にしていますが、ファイルの冒頭のShebang行は、#!/bin/shとなっています。

RedHatやCentOSは、/bin/sh は、bashにシンボリックリンクが張られていますが、
Ubuntuでは、dashにシンボリックリンクが張られています。
ls -l で確認するとすぐに確認できます。

$ ls -l /bin/sh
lrwxrwxrwx 1 root root /bin/sh -> dash

dashとbashは完全に互換性がないため、ときにbashの文法が通用しないことがあります。

解決策は以下の2つです。

  1. シェルスクリプトのShebang行を #!/bin/bash に変更する
  2. 自分でシェルスクリプトを書く場合などはこれがいいでしょう。
    しかし、FSLでは、300以上のスクリプトがありますので、これを全部変えるのはめんどくさいですね。

  3. dpkg-reconfigureで、dashをbashに変更する
  4. Ubuntuでは、 dpkg-reconfigure dash というコマンドで、dashを使わずにbashを使うようにすることができます。

    インタラクティブに行うには、以下のコマンドを叩きます。

    $ sudo dpkg-reconfigure dash
    

    すると、次の画面が出るので、「いいえ」を選びます。

    再度、/bin/shのシンボリックリンク先を確認してみます。

    $ ls -l /bin/sh
    lrwxrwxrwx 1 root root /bin/sh -> bash
    

    今度はbashに変更されていることがわかります。

    なお、インタラクティブでなく変更したい際は、以下で行います。
    いくつかのサイトで情報が提供されていましたが、正しくないものもありましたので、試行錯誤した結果、以下が最適な解決法とわかりました。

    echo "dash dash/sh boolean false" | sudo debconf-set-selections
    sudo dpkg-reconfigure --frontend=noninteractive dash
    

Ubuntu 18.04 で、NVIDIAのリポジトリを利用してtensorflow-gpu環境を構築するシンプルな方法

Ubuntu 18.04で、ディープラーニング環境を構築したいと考えました。

いろいろネットの情報を得てトライしてみたのですが、苦戦しました。
しかし、トライしているうちに、いくつか大事なことがわかってきました。

ポイントは、以下のとおりです。

  • グラフィックボードのドライバーによって使えるCUDAのバージョンが異なる
  • まずいちばん大事なのはこれです。ドライバーが古いものしか対応していないと、対応するCUDAのバージョンも古くなります。

  • NVIDIAはリポジトリをdebファイルで配布しているので、それを使うのがよい
  • これから詳しく記載します。

  • カーネルはデフォルトのものを使う
  • カーネルを最新のものを追いかけるとCUDAは動かないという事象が起きます。Ubuntu 18.04では、標準が4.15、そしてHWEが4.18です。CUDAは、この2つのバージョン(標準とHWEカーネル)だけサポートします。詳しくは、NVIDIAのページをご覧ください。

これらのコツをつかんだら、再現性が高くセットアップすることができるようになりました。
Step by Stepで示します。

続きを読む

Linuxでdcmtkを利用することにより、DICOMヘッダーから被験者のID、生年月日、性別、年齢を取得できるワンライナー

ある研究データセットにおいて、被験者リストに性別や年齢の記載もれがあり、MRIのDICOMデータから取得することを考えてみました。

説明が不要な方は、dcmtkさえインストールしてあれば、次のワンライナーで得られます。

$ for f in $(ls -F | grep /); do echo $f; dcmdump $(find $f -type f | sed -n 1p) | grep -E "0010,0020|0010,0030|0010,0040|0010,1010" | awk '{ print $7, $3}' ; echo ""; done

以下、解説です。

続きを読む

Ubuntuで有線LANで接続しようとしても、「デバイスは管理されていません」と出てしまう時の簡単な解決法

Ubuntu 18.04で経験した現象ですが、無線LANは接続できるのに、有線LANで接続しようとすると、
「デバイスは管理されていません」”device not managed” と出てしまって接続できないことがあります。

こんな感じです。

ネットを探してみるといろいろな情報が出てきますが、日本語の情報だと、「PCにあったドライバをインストールする」という情報が多いです。

しかし、これは汎用的ではありません。もっと根本的な解決法がほしいと思いました。

続きを読む