FSLのJHU-labels.xml から、sed を使って領域名だけを抽出する方法

FSLには Johns Hopkins University の白質アトラスがついてきます。
そのアトラスの領域名を抽出したいと思いました。

Short answer

cat JHU-labels.xml |\
sed -e 's@<label.*">@@' \
    -e 's@</label>@@' \
    -e 's@ @_@g' -e 's@__@@' |\
sed -n 17,66p

で、以下のようになります。

Middle_cerebellar_peduncle
Pontine_crossing_tract_(a_part_of_MCP)
Genu_of_corpus_callosum
Body_of_corpus_callosum
Splenium_of_corpus_callosum
...

もし、アトラスの番号を振りたかったら以下のようにします。

cat JHU-labels.xml |\
sed -e 's@<label.*">@@' \
    -e 's@</label>@@' \
    -e 's@ @_@g' \
    -e 's@__@@' |\
sed -n 17,66p |\
nl -n rz |
sed -E 's@0{4}@@'

この結果は以下になります。

01  Middle_cerebellar_peduncle
02  Pontine_crossing_tract_(a_part_of_MCP)
03  Genu_of_corpus_callosum
04  Body_of_corpus_callosum
05  Splenium_of_corpus_callosum
...

続きを読む

Ubuntu 22.04でのClaude Codeセットアップガイド【2025年11月版】

Claude Code を自分のUbuntuにセットアップしたいと思いました。Claude CodeなのでClaudeチャットにセットアップのドキュメントを準備するようにお願いしたところ、結構わかりやすく準備してくれたので、少し手を入れながら公開します。以下、Claudeが生成した文章です。私はFreeSurferの関係でまだ Ubuntu 22.04 を使っているので、Ubuntu 22.04用となります。なお、Claude Codeのセットアップは実際に手を動かして問題がありませんでした。

続きを読む

Ubuntuを使用する際、IPv6 環境やポート22 が閉じている場合に SSH でGitHub/GitLabを操作するための対処法

私は GitHub と GitLab をどちらも使っています。
ほぼ同時期に以下のことが起き、GitHub/GitLab との通信ができなくなりました。

  • ある場所のネットワークがIPv6に切り替わった。
  • 勤務先のひとつのネットワークが更新され、ポート22が閉じられた。

それぞれ調べて、以下のことがわかりました。

続きを読む

Lin4Neuroの Ubuntu 20.04版 から Ubuntu 22.04版 へのアップグレード

Lin4Neuroは現在、Ubuntu 22.04版がメインとなっています。
FreeSurferがまだUbuntu 24.04に対応していないためです。

しばらく前からLin4Neuroを使っている方は、Ubuntu 20.04版をお使いの可能性があります。
これをUbuntu 22.04版に更新する方法を説明します。

続きを読む

Ubuntuで apt-key が廃止になった今、理解しておいた方がいいこと

Ubuntuでサードパーティーのソフトウェアをインストールする際、過去には、apt-key コマンドでパッケージの電子署名用のOpenPGP公開鍵を扱っていました。

しかし、現在、apt-keyは廃止となりました。

私の中で混乱があったのでポイントをまとめました。

続きを読む

Windowsで、openai-whisperを使って文字起こしを行う方法 step-by-step

OpenAI は whisper という文字起こしができるソフトウェアを提供しています。
オープンソース版を使えば、料金がかかることなく使うことができるのですが、Windowsでのセットアップはやや厄介です。
このため、Windowsでのセットアップの方法を解説していきます。また、公開されているサンプルデータを使って、実際に文字起こしにもトライしてみます。

続きを読む

Lin4Neuroアンケート結果

Lin4Neuroのアンケートについてご協力いただきありがとうございました。アンケート結果を公開します。コメントは随時ここに追加していきます。

  • 研究目的に限らず、ご自分が普段使用していて一番慣れているPC・OSを教えて下さい
  • 実機・VirtualBox問わず、現在、研究にLin4Neuroを使用していますか?
  • Linuxの初心者向けセミナーが開催されたら、参加したいですか?
  • Lin4Neuroをどの機器で使用したいですか?(複数選択可)
  • 今後Lin4Neuroを使用するにあたり、気になることや、心配なことはありますか?(複数選択可)
  • その他、Lin4Neuroの使用にあたり、気になる点やご要望などありましたらご自由にお書きください。
    • Lin4Neuroと研究仮説が整えば研究ができそうなので、頑張るしかないです。
    • メモリ、GPUの種類などある程度選択肢があると嬉しいです
    • Linuxを使い始めばかりで質問するのにハードルが高く感じるときがあります。
    • GPUの計算能力に興味があるものの、脳画像解析では使用できていません。ハードウェアの選択とソフトウェアのセットアップのハードルの高さであると思いますが、その辺りが解消されるとありがたいです。
    • また仮想環境の手軽さも捨てがたく、複数の環境を使い分けている状況です。
    • 仮想環境というものがよく理解できないので、通常環境で使用できるとありがたいです。
    • FreeSurferのAIを用いていくのにメモリが大量に必要とするとハードウェアがかなり限られてくるように思います 複数のハードウェアを用意するのは簡単ではなくなってくるかもしれませんね
    • 導入に大体どれくらいお金がかかるものなのでしょうか?初歩的な質問で失礼致します。
    • いつも利用しています、とても助かっています。日本のMRI技術の発展を支える重要なお仕事です。
    • VirtualBoxで使う際に、複数画面表示に対応していただけたら嬉しいです。
    • 現在のデスクトップ型のwindows11(intel core i7-13700 コア16、24スレッド,2.10GHz-5.20GHz,32G,)で仮想環境でlin4neuroを扱うとき、作業(今はTBSSを考えていますが)にどれくらい時間がかかるのか、それがlinux実機だと多少緩和されるのか
    • 昔ノートパソコンに入れていたので、性能的な問題で今は使っていません。ただ初心者が最初にLinuxに慣れるという意味では大変ありがたく、非常に感謝しております。一方で研究施設内ですでにクラスタの環境が整っているというところもあり、その場合の使い分けが気になります。
    • Appleシリコンに対応していただけるとありがたいです

Lin4Neuroのハードウェアに関するアンケート

私はこれまで脳画像解析に特化したLinux, Lin4Neuroの開発をしてきました。
WindowsやmacOSの方が気軽に触れられるように仮想環境で使えるようにしてきましたが、
脳画像解析ソフトがGPUを必要としてきたり、Dockerの環境が増えてきたりと、いろいろ変化がある中、
実機にLinuxが入っている環境を充実させる必要があると感じています。

そこでアンケートをさせていただけたらと思います。

このアンケートの結果は後日公開します。匿名で3分程度で終わるアンケートなので、皆様のご意見をお聞かせいただけますでしょうか。
今後の開発の参考にいたします。

どうぞよろしくお願いします。2025年2月末に一度集計したいと思います。

以下のリンクからご協力ください。

(アンケートは終了しました。ご協力いただきありがとうございました)

https://forms.gle/RnH66Zvud6dXHSBW8

Bashのシェルスクリプトのshebang行は #!/usr/bin/env bash の方がいいかもしれない

シェルスクリプトを記載する時、bashで実行されることを意識する際、冒頭のシェバン (shebang) 行に

#!/bin/bash

と記載することが多いです。

Linuxではこれで全く問題ないのですが、近年の macOS の状況を見ていると、これはちょっと考え直した方がいいかなと思ってきました。

簡潔に言うと、

#!/usr/bin/env bash

とするのが汎用性の高い運用になると思います。

続きを読む

mkdir -p のあまり知られていない機能

mkdir -pmkdir --parents であり、必要に応じて親ディレクトリを作成する便利なオプションです。

しかし、ふと、man を見たらもうひとつの機能があることに気づきました。それは「ディレクトリが存在していてもエラーを返さない」というものです。

私はこれまでいつもスクリプトでディレクトリを作成する際は、

[[ -d some_directory ]] || mkdir some_directory

としていました。

しかし、実は、これは

mkdir -p some_directory

で終わってしまうということですね。

小さなことですが、勉強になったので、備忘録として記録しておきます。

Ubuntu でNVIDIAのGPUがうまく動かなくなった時の対処法【2024年12月版】

NVIDIAのGPUドライバーがプロプライエタリからオープンソースに移行したことに伴い、過去にプロプライエタリドライバを使っていた方がアップデートがうまくいかずトラブル場合が多々あります。

その時の対処法を以下に示します。

続きを読む

Windows11 22H2からアップデートできない時の対処法

私はWindowsは仮想環境で使うことが多いのですが、Windows11が22H2以降、アップデートできない現象に遭遇しました。

対処法を簡単に書いておきます。検索すればたくさん情報は出てきます。ちなみに、これはシステム要件を満たしているのにアップデートできない場合とお考えください。

  • Windows11から、Windows11のダウンロードページにアクセス
     https://www.microsoft.com/ja-jp/software-download/windows11

  • Windows11のISOを入手。方法は2つ

    • 「Windows 11 のインストール メディアを作成する」から、mediacreationtool.exe を入手し、実行して、ISOを入手
    • 「x64 デバイス用 Windows 11 ディスク イメージ (ISO) をダウンロードする」からISOを入手
  • 入手したISOを右クリックし、「マウント」を選択。ISOがDVDドライブとしてマウントされるので、ドライブ名を確認。

  • コマンドプロンプトを管理者権限で実行

  • マウントされたドライブに移動。Dドライブなら cd d: で移動できる

  • 以下のコマンドを実行

    setup /product server
    
  • serverとなっているが気にしなくてよい。自分の現在のライセンスのままアップグレードされる。

やはり、最後の手段はCLIですね。

VirtualBox のDebian 12 ゲストに Guest Additions をインストールする方法

VirtualBox上でDebianをインストールしていろいろ試しているのですが、Guest Additionsをインストールしようとしてちょっと困ったので、備忘録として残しておきます。

short answer

cd /media/cdrom
sudo sh VBoxLinuxAdditions.run

でいけます

long answer

最初、普通Ubuntuでやるように

cd /media/cdrom
sudo ./VBoxLinuxAdditions.run

としたところ、

sudo: unable to execute ./VBoxLinuxAdditions.run: Permission denied

となりました。

なんでだろうと思ったところ、https://forums.virtualbox.org/viewtopic.php?t=58799にヒントが書かれていました。

cdromをマウントする際、/etc/fstabに

/dev/sr0    /media/cdrom0    udf,iso9660    user,noauto    0    0

と書かれています。この noauto を exec にすることで、実行可能になるということでした。

もちろん、これを exec に変えるのも方法ですが、この場合、任意のCDが実行されてしまうリスクもはらんでいます。

それ以外の方法がないかと考えたところ、直接実行するのではなく、シェルから実行するという方法があるかなと思いました。

そうしたら、上記のリンクの最後にその旨が書かれていました。

なので、実際に試してみました。

cd /media/cdrom
sudo sh VBoxLinuxAdditions.run

そうしたところ、あっさりと動きました。

スクリプトを直接実行ではなく、シェルから実行というのは常に頭のどこかに置いておくといいんだなということを学びました。

【Python】DICOMヘッダーをCSVに保存

1. 目的

PythonのPydicomライブラリを用いて、DICOMヘッダーをCSVにまとめて保存

2. 準備

2.1. ライブラリの準備

Pydicomは、DICOMのヘッダーや画像を操作するのに用いるライブラリである。

Pydicomのインストールは、以下のコマンドを実行。

pip3 install pydicom

CSV形式の表データを扱うには、Pandasライブラリを用いる。

Pandasライブラリのインストールは、以下のコマンドを実行。

pip3 install pandas

2.2. データの準備

次のような、フォルダ構造でデータを準備する。この場合では、各被験者フォルダの中にDICOMが保存されている。

DICOM_folder
├── Subject001
│   ├── XXX.dcm
│   ├── ...
│   └── XXX.dcm
├── Subject002
│   ├── XXX.dcm
│   ├── ...
│   └── XXX.dcm
├── ...
└── SubjectXXX

2.3. スクリプトの準備

次のコードを、extract_dcm_header.pyとして保存する。このとき、スクリプトはDICOM_folderフォルダと同じ階層に保存する。

import os
import pydicom
import pandas as pd

input='DICOM_folder'  # Input folder
output='dicom_headers.csv'  # Output CSV

dcm_dfs = []
failed_files = []
processed_files = []
for root, _, files in os.walk(input):  # Find DICOM file for each subject
    if len(files) != 0:  # If DICOM files exist
        try:
            f = os.path.join(root, files[0])
            dcm = pydicom.dcmread(f)  # Read DICOM
            _df = pd.DataFrame({dcm[k].keyword: [dcm[k].value] for k in dcm.keys() if dcm[k].keyword != "PixelData"})  # Read Headers
            dcm_dfs.append(_df)  # Gather headers of all subjects in a list
            processed_files.append(f)
        except:
            failed_files.append(f)

dcm_dfs = pd.concat(dcm_dfs, ignore_index=True)  # Concat headers of all subjects in a table
dcm_dfs.to_csv(output, index=False)  # Save as CSV

3. プログラムの実行

2.3. スクリプトの準備で用意した、extract_dcm_header.pyを実行するには、次のコマンドを実行する。

python3 ./extract_dcm_header.py

4. 結果の確認

収集したDICOMヘッダーは、dicom_headers.csvとして保存される。

5. コードの解説

まず、必要なライブラリを読み込む。

import os
import pydicom
import pandas as pd

ここでは、入力となるDICOMフォルダーと出力となるDICOMヘッダーのまとまったCSVの名前を定義している。

今回の場合だとinput='DICOM_folder'output='dicom_headers.csv'

input='DICOM_folder'  # Input folder
output='dicom_headers.csv'  # Output CSV

データを格納するための、箱(リスト)を定義。

dcm_dfs = []
failed_files = []
processed_files = []

被験者ごとのDICOMファイルを検索。

for root, _, files in os.walk(input):  # Find DICOM file for each subject

DICOMファイルがある場合のみ、処理を実行。

    if len(files) != 0:  # If DICOM files exist

Pydicomを用いて、DICOMデータを読み込む。

        try:
            f = os.path.join(root, files[0])
            dcm = pydicom.dcmread(f)  # Read DICOM

DICOMからヘッダー(Header)情報を、Pandasで読み込む。

PixelDataタグを含めると、出力(CSV)が崩れておかしくなるので、収集に含めないようにしている。

            _df = pd.DataFrame({dcm[k].keyword: [dcm[k].value] for k in dcm.keys() if dcm[k].keyword != "PixelData"})  # Read Headers

収集した結果を、被験者ごとに処理をして、一つの箱(リスト)にまとめる。

            dcm_dfs.append(_df)  # Gather headers of all subjects in a list
            processed_files.append(f)
        except:
            failed_files.append(f)

すべての被験者のヘッダー情報を、一つの表形式のデータ(DataFrame型)に変換する。


dcm_dfs = pd.concat(dcm_dfs, ignore_index=True)  # Concat headers of all subjects in a table

結果を、CSVとして保存する。

dcm_dfs.to_csv(output, index=False)  # Save as CSV

2024年10月現在、FreeSurferはUbuntu 24.04 では動作しません

ときどきこの質問を受けるので言及しておきます。

2024年4月にUbuntu 24.04が公開されました。
しかし、Ubuntu 24.04上では現行のFreeSurfer 7.4.1は動きません。
このため、FreeSurferを実行したい場合は、しばらくUbuntu 22.04からアップグレードしないようにしましょう。

Pythonでオブジェクトの型に準備されている通常メソッドの一覧を出力する関数

Pythonを勉強していると、「この型のメソッドは何だろう?」と思う時があります。
この時、オブジェクトを obj とすると

dir(obj)

とすることで、一覧を得ることができます。

たとえば、リスト型のメソッドを知りたいとします。dir() を使うと以下のようになります。

x = [1, 2]
dir(x)

[code lang=text]
['__add__', '__class__', '__class_getitem__',
 '__contains__', '__delattr__', '__delitem__',
 '__dir__', '__doc__', '__eq__', '__format__',
 '__ge__', '__getattribute__', '__getitem__',
 '__gt__', '__hash__', '__iadd__', '__imul__',
 '__init__', '__init_subclass__', '__iter__',
 '__le__', '__len__', '__lt__', '__mul__',
 '__ne__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__reversed__', '__rmul__', '__setattr__',
 '__setitem__', '__sizeof__', '__str__', '__subclasshook__',
 'append', 'clear', 'copy', 'count', 'extend',
 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
[/code]

ここで、”–” からはじまるメソッドは特殊メソッドと言われ、その型の振る舞いを細かく調整するものとのことです。今回はここには踏み込みません。

今、私は、「通常メソッドだけリストアップしたい」と思いました。どうしたらできるでしょうか?

続きを読む