Zoomでブレークアウトセッションに移行する際、全員のビデオをオフ、マイクをミュートにすると、一部の参加者が落ちてしまうことが防げる可能性が高い

気づけばほぼ毎日Zoomで何らかの会議やワークショップに参加する日々です。

先日、あるワークショップでホストをする機会がありました。

ブレークアウトセッションを多く使うワークショップですが、
毎回、何人かブレークアウトセッションに移行できず落ちてしまうという現象が起こりました。

おそらくネットワークの負荷が大きく、タイムアウトを起こしているのだろうという仮説を立てました。

Zoomのヘルプによると、ネットワーク帯域幅は以下のようになっています。

  • For group video calling:
    • 800kbps/1.0Mbps (up/down) for high quality video
  • For gallery view and/or 720p HD video: 1.5Mbps/1.5Mbps (up/down)
    • Receiving 1080p HD video requires 2.5mbps (up/down)
    • Sending 1080p HD video requires 3.0 Mbps (up/down)
  • For screen sharing only (no video thumbnail): 50-75kbps

  • For screen sharing with video thumbnail: 50-150kbps
  • For audio VoiP: 60-80kbps

これを見ると、一番負荷が少ない状態は、「誰もビデオをonにせず、ホストのみオーディオを有効にしている状態」であると考えられます。この状態は、上記の For audio VoiP: 60-80kbps となるかと思います。ギャラリービューで皆がビデオをonにしている時の1.5Mbpsからしたら、ネットワークの負荷は、約20分の1になります。

そこで、受講者の皆様に「実験に参加していただけますか?」とお願いして、
全員のビデオをオフ、スピーカーをミュートにし、ホストのビデオもオフにしたうえで、
(有効になっているのはホストのマイクのみ)ブレイクアウトルームを開始したところ、
それ以降、落ちる人がゼロになりました!

おそらく「ブレークアウトセッションに移行する際はネットワークの負荷が高まる」という仮説が正しいのだと思われます。

ブレークアウトセッションに移行してから、ビデオとマイクをオンにしていただければ、各部屋では問題ありませんでした。

ネットワークが少しでも弱い方がいるような環境では、ブレークアウトセッションを開始する際には、全員のビデオをオフ、マイクはミュートにし、ネットワークの負荷を最小限にしてからはじめることをお勧めします。

SF映画で宇宙船がワープする際に、不用品を捨ててからワープしますが、そんなようなイメージです。

助かる人もいると思うので、グッドプラクティスということで紹介しておきます。

第2回国際脳MRI・臨床データ解析チュートリアル(2020年9月27日Zoom)

東京大学の小池先生から、第2回国際脳MRI・臨床データ解析チュートリアルの開催案内をいただきました。

今回はZoomでの開催とのことです。
ご関心のある方は、ぜひ下記をご覧いただき、ご応募ください。
(クリックするとPDFが入手できます)

私は今回もLin4Neuroを提供する方向で調整しています。前回よりもさらに必要なものをしっかり実装したものを提供できる予定です。

シェルスクリプトで改行を削除したい時は、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は、少しずつ増えていっているので、おそらく監視しているフォルダ数がそれほど多くないのかもしれませんね。

動的プログラミング言語を知っている人のためのPython入門

最近、Pythonの勉強をしていますが、いろいろ調べている中で、Matthew Brett氏がMatlabやRに慣れている人のためのPythonの手引き、”Brisk Introduction to Python“を書かれているのを見つけました。既にMatlabやRを知っている方々がPythonのコツを理解するのによいテキストと思います。このため、Brett氏の承諾を得て、研究室のメンバーで翻訳しました。

動的プログラミング言語を知っている人のためのPython入門はこちらからどうぞ。

Jupyter_Notebookはこちら(右クリックで保存してください)

macOS 10.15 (Catalina) でFSLのインストールがうまくいかない時の解決方法

FSLのMLに最近、macOS 10.15の方々がインストールがうまくいかないという相談がたくさんなされています。

エラーメッセージは以下のような感じです。

Stage 1
By installing this python distribution you agree to the license terms in
/usr/local/fsl/fslpython/LICENSE.txt
100%
/usr/local/fsl/etc/fslconf/fslpython_install.sh: line 188: /usr/local/fsl/fslpython/bin/conda: No such file or directory
/usr/local/fsl/etc/fslconf/fslpython_install.sh: line 189: /usr/local/fsl/fslpython/bin/conda: No such file or directory
/usr/local/fsl/etc/fslconf/fslpython_install.sh: line 190: /usr/local/fsl/fslpython/bin/conda: No such file or directory
/usr/local/fsl/etc/fslconf/fslpython_install.sh: line 191: /usr/local/fsl/fslpython/bin/conda: No such file or directory

これに対する解決法がFSLの中の人から示されています。

https://www.jiscmail.ac.uk/cgi-bin/webadmin?A2=FSL;bd0fa8bf.2004

具体的には以下になります。

  1. テキストエディタで fslpython_install.sh を開きます。管理者権限が必要です。
  2. sudo open -e /usr/local/fsl/etc/fslconf/fslpython_install.sh
    
  3. コードの修正
  4. 149行目が以下のようになっているはずです。

    dl_cmd_opts=”–fail”

    これを以下のように修正します。( -L を追加するだけです )

    dl_cmd_opts=”–fail -L”

  5. コマンドの実行
  6. 以下のコマンドを実行します。

    sudo rm -r /usr/local/fsl/fslpython
    sudo /usr/local/fsl/etc/fslconf/fslpython_install.sh  -f  /usr/local/fsl
    

私はCatalinaをまだ使っていませんが、たぶんはまる人がたくさんいると思いますので、掲載しておきます。

国際脳ヒトMRI研究ポータルサイト

東京大学の小池先生が国際脳のヒトMRI研究ポータルサイトを開設されました。

http://mriportal.umin.jp/

このサイトは、国際脳ヒト脳MRI研究プロジェクトで策定されたデータ取得手順、データ集約と共有化、前処理技術開発、Traveling subject project、倫理的配慮などの情報を集約し、国内のヒト脳MRI研究を発展させることを目的としたウェブサイトとのことです。

プロトコル論文がpreprintで公開されていたり、有用な情報が掲載されていますので、一見の価値ありです。

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のアップデート(2020年5月16日)

Covid-19対応に追われる日々ですが、それだけだとつらくなるので、Lin4Neuroのアップデートを行い、公開しました。
主な変更点は以下になります。

  • isoイメージは、Ubuntu 18.04 desktop を元に作成しました。これまで、PinguyBuilderというソフトを使ってインストーラーを準備していましたが、うまく動かないという報告を多々いただいたので、方針を変更しました。
  • Connectome workbench がインストールされました。
  • AFNI, FreeSurfer, FSLといった大きなソフトはインストーラーを提供するという方針に変更しました。デスクトップ上にある “installer” をクリックしていただければ、必要なソフトをインストールできます。
  • MRIcroGLなど、もともと入っているソフトはすべて最新のものにしました。
  • 現在利用可能なソフトの一覧は、こちらになります。
  • VirtualBox 仮想アプライアンスを今回から正式にリリースしました。ユーザー名は”brain” でパスワードは “lin4neuro”になります。メモリは4GB, ハードディスクは120GBで設定してあります。

最新のLin4Neuroはこちらから入手できます。

英語版のサイトはアップデートしましたが、日本語版はこれからです。

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.

SPMの結果をFreeSurferの脳表画像に投影する方法

以前、DTIの画像などをFreeSurferの脳表に投影する方法を紹介しましたが、SPMの結果のspmT画像をFreeSurferの脳画像に投影する方法もわかりましたので紹介したいと思います。

必要なコマンドは、mri_vol2surf です。

  • 入力ファイルと出力ファイル名
  • 入力画像は、spmT_0001.nii とします。出力ファイル名は、左半球の画像ということで、lh.spmT_0001.mgzとします。

  • mri_vol2surf のオプション
  • 今回、大事になるのは、–mni152reg というオプションです(木村先生、教えてくれてありがとうございました)。MNI空間でのあわせこみに使えるオプションです。

  • 実際のコマンド
  • シンプルに以下でいけました。

    mri_vol2surf --mov spmT_0001.nii --mni152reg --hemi lh --o lh.spmT_0001.mgz
    

    入出力ファイル以外のオプションは2つだけ、–mni152reg と –hemi lh だけです。

  • Freeviewでの表示
  • 最後にfreeviewで表示します。T値が3以上を表示したいと思ったので、thresholdを3,5としてあります。

    freeview -f \
    $SUBJECTS_DIR/fsaverage/surf/lh.inflated:overlay=lh.spmT_0001.mgz:overlay_threshold=3,5\
      --viewport 3d --layout 1
    

    結果、以上のような感じで表示できました。

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でローカル環境でコードを改変していく時のミニマルエッセンシャル

gitでブランチを切って上手に開発していきたい、そんな思いから必要最低限なことをメモしておきます。developブランチを作成し、masterにマージするまでです。

  • ブランチの確認
    git branch
    
  • ブランチの作成
    git branch develop
    
  • ブランチの切り替え
    git checkout develop
    
  • ブランチでの作業後
    git add file(s)
    git commit -m comments
    
  • ブランチのマージ
    git checkout master
    git merge develop