MATLAB/PTB-3 setup on Linux/Ubuntu

私は視覚や聴覚に関する研究をしていて、最近視覚刺激系を構築しました。
しかし使っていたMAC mini (Late 2014, Monterey) のMATLAB/Psychtoolbox (PTB) で出していた刺激が時々遅延する問題があり、システムの改善に着手しました。

Psychtoolboxの公式ページに
> **GNU/Linux is the recommended operating system of choice for demanding experimental setups and experimental paradigms.** [http://psychtoolbox.org/linux](http://psychtoolbox.org/linux)
> 
とあり、使ったことはないのですが、Linuxにシステムを移管しようと思いました。
そこで、その辺にあったWindows PCをリサイクルして、
何かのために既存のWindows10をパソコンに残した上で、Linux OSをインストールしたいと考えました。

簡単な話に聴こえますが、PC初心者の僕にはトラブルだらけでしんどかったので、初心者向けのケースレポートとしてシェアしておきます。

パソコン　Dell Optiplex3050 CPU:Intel Core i3-6100 @ 3.70GHz x4 , RAM: 16GB, HDD: 500GB

グラボ AMD Radeon R5 xGB、ディスプレイ2画面

作業時にスクショを撮る余裕はなかったので、ほとんど画像はありませんw

また思い出しながら書いている上、作業環境は全て英語で行なっているため、メニュー名が異なることがあります。

## (0)Virtual boxでUbuntu導入

詳細な方法は割愛しますが、PTBインストールした後に、DotDemoを行うと毎回クラッシュしてしまいました。
この解決策も分からず、後述のディスプレイ問題にも不安があったため、VM環境を一掃し、デュアルブーストでLinuxを導入することにしました。

## (1) インストールするパソコンのパーテーションを変更する

Linux用に割り当てるハードディスク領域を設定します。

詳しくは[こちらのサイト](https://jp.minitool.com/partition-disk/windows-11-and-linux-dual-boot.html)に従い、200GB程度の空白領域を作成しました。

## (2) Ubuntuのインストール用のUSBを作成する。

**Ubuntu 22.04.2 LTS**のインストーラ（isoイメージ）を公式サイトから入手します。

[https://ubuntu.com/download/desktop](https://ubuntu.com/download/desktop)

このファイルは大体4.6GB程度あ理ます。

このisoイメージを起動可能な形で書き込むために[Rufus](https://rufus.ie/ja/)（フリーソフト）を使ってUSBに書き込みます。
通常の64bit OSだったので、rufus-4.0.exeをダウンロードして起動しました。

Rufusは書き込む際にファイルを消去してしまうので、空のFAT32 USBメモリを準備しました。
書き込みは10分くらいで終了しました。

## (3) BIOSからUSBを起動

メーカーロゴでF12を押してBoot menuに入ります。
USBからブートするメニューがあるので、押してみると、Ubuntuに関するメニューが表示されます。

ここで、Try or install Ubuntuを選択する、すると

452: out of range pointer 0xcbdff020

というエラーが表示され、普通にWindowsが起動してしまいました。

検索するとRufusのエラーとも出てきますが、[2023年4月現在でこのエラーは修正](https://askubuntu.com/questions/1464573/452-out-of-range-pointer-during-installation-why-and-how-to-fix-it)されているそうです。

そこで、BIOSでUSB起動の設定を確認した。
Dell PCでのUSB起動に関しては[こちらの記事](https://relax-tech.net/dell-notepc-usb-boot/)を参照しました。

メーカーロゴでF2を押して設定に入り、
general>Boot Sequence
に入り、Boot List OptionをUEFIに変更

Add Boot OptionからOption nameを分かるものに設定し、File system list内にあるUSBの文言を含むやつを選択してOK (File Nameは空欄にした)

Boot sequenceで一番上に並び替え、BIOSの設定をApply>Exit

再度メーカーロゴでF12を押して、新しく設定した名前のUSB起動を選択します。
同様にUbuntuのメニューが表示されるので、Try or install Ubuntuを選択すると、
最初は同様のエラーが表示されがっくりして、Press buttonをしましたが、
その後、急にフォントがかわり、インストール画面が表示されました。（これであっているのだろうか？w）

## (4) Ubuntuインストール

表示されるままに言語を選択、通常のインストールを行います。

次にディスクを削除してUbuntuをインストールするか聞かれたので、「Something else それ以外」的なところを選択して進みます。

すると、HDDのどこのパーテーションにインストールするか聞かれるので、(1)で作っておいた空白領域を選択しフォーマットします。
この時、どういう風にしても複数のパーテーションが作れなかったので、最大容量を選択し、ext4形式（最初から選択されてるやつ）、
Mount point: /（このスラッシュは三角押してリストから選ぶ。これをしないと、No root file system is definedというエラーが出る）でOKしてフォーマットをかけ、Install nowをクリック！すると、

No EFI system partition was Found

と出てきて、「インストール失敗すると思うよ？ここから先は自己責任でね？」とプレッシャーをかけてきます。

EFIとは、BIOSなんかを動かすための最小限のプログラムが入っている100MBくらいの領域なんだそうです。

(1)の時点でも確認できる小さなパーテーションです。

通常のWindowsパソコンなら最初から入っていると思うので、この領域を右クリックして、Use as: EFI system Partitionに設定します。

すると、 地域を選ぶ画面に移り、インストールを開始することができます。

このパートは英語のフォーラム記事を参照しました。[参照1](https://www.itechguides.com/no-root-file-system-is-defined/)、[参照2](https://askubuntu.com/questions/1144552/dual-boot-no-efi-system-partition-was-found)

## (5) MATLABインストール

Ubuntuの初期設定が終了したら、既存のブラウザ（Firefox）からMATLABのページにとび、インストーラーをダウンロード。他のパソコンとの互換性から今回は2022bをインストールします。

Downloadフォルダからextractする。この時、ターミナルからunzipする方法もあるらしいけど、ちょっとわからない、、、

ターミナルからcdでDownloadのフォルダに移動して、

$ sudo ./install

でインストーラーを起動。しかし、インストール先のフォルダを設定時に「書き込めない」旨のエラー文が出て進めない。Linuxではいちいちロックされている（？）らしく、これを解除しないといけない。

MATLAB Answersでの質疑応答[1](https://jp.mathworks.com/matlabcentral/answers/478492-linux-os-ubuntu)、 [2](https://jp.mathworks.com/matlabcentral/answers/1763280-ubuntu20-04-matlabr2022a)と[ブログ](https://blog.goo.ne.jp/osqzss/e/06a46c43b971065e42af320ac17bb2e8)を参考にして、ターミナルに
```
$ sudo mkdir -p /usr/local/MATLAB/R2022b
$ sudo chmod 777 /usr/local/MATLAB/R2022b

$ sudo chown ユーザー名:users /usr/local/MATLAB/R2022b

$ sudo chmod 777 /usr/local/bin
```
（実際は一番下を入れ忘れてシンボリックリンクを作成できていない）

を入れてから、
```
$ sudo ./install
```
でインストーラーを起動。これでインストールができる！

## (6) MATLABショートカットの作成

やっとインストールを終了し、さあテストするぞ！と意気込んでいると

他のOSと違い、起動アイコンがない！！開けない！！

ということでショートカットを作成することにしました。

[こちらのブログ記事](https://pa-kamedia.net/2021/09/16/%E3%80%90matlab%E3%80%91ubuntu%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bmatlab%E3%81%AElauncher%E8%A1%A8%E7%A4%BA/)をもとに、
```
$ sudo wget http://upload.wikimedia.org/wikipedia/commons/2/21/Matlab_Logo.png-O /usr/share/icons/matlab.png
```
を行なってアイコンをダウンロードし、
```
$ sudo nano /usr/share/applications/matlab.desktop
```
を打ち込むとNanoというエディターが開くので、そこに
```
[Desktop Entry]
Type=Application
Icon=/usr/share/icons/matlab.png
Name=MATLAB R2022b
Comment=Start MATLAB - The Language of Technical Computing
Exec=matlab -desktop
Categories=Development;
```
と打ち込む。^O保存みたいなのがあるので、Ctrl + Oで保存し、Ctrl + Xで終了する。

するとランチャーにMATLABが出現した！起動できる嬉しい！

## (7) Psychtoolbox-3のインストール

[公式によると](http://psychtoolbox.org/download.html)、Linux環境では、WinやMacのようにDownloadPsychtoolbox.mを動かすやり方ではなく、NeuroDebianというとこからダウンロードすることが推奨されている。

書いてある通りに[NeuroDebianのページ](http://neuro.debian.net/pkgs/matlab-psychtoolbox-3.html)に進み、青いInstall this packageをおす。

するとStep1, 2が表示される。まずStep1でLinuxのOSを選択し、近いサーバーを選択する（今回はCA）。そして、[こちらのサイト](https://sites.google.com/site/ptbganba/test1/2-5-linuxhenoptbnoinsutoru)のように、all softwareを選択する（初めonly~を選んでエラーばかり出ていた）。

表示されたスクリプトをターミナルに打ち込むと、ダウンロードが始まります。

この際にいくつか選択肢が表示されますが、公式にある通り

> the installation will ask you for the location of your Matlab installation, and if you want it to rename some Matlab libraries to fix compatibility issues caused by Matlab. **Answer YES to these questions, this is crucial!**
> 

を守って、YESを選択します。（他にy/nを聞かれる選択肢はないはず）

インストールが完了したら、usr/share/ にpsychtoolbox-3のフォルダがいると思うので、MATLABのHOMEタブのSet PathからサブフォルダごとPathを設定してあげましょう。
```
help Screen
```
とか適当なやつで動作を確認します。

## (8) Screen関数が動かない

最初に
```
DotDemo
```
とかで視覚刺激をチェックしようとするとエラー文が返ってきます。

Ubuntu 22.04ではディスプレイサーバーの設定が、Waylandというやつがデフォルトになっていますが、PTBはそれに対応していないそうです。
この問題は一度ログアウトし、ユーザーを選びパスワードを入力する画面になると右下に歯車アイコンが表示されるので、そこをクリックし、Ubuntu on Xorgを選択して入り直せばOKです。

## (9) 2つのディスプレイに半分ずつScreenが表示されてしまう

意気揚々とDotDemoをすると2つのディスプレイに紫の画面が。おやおや？
![IMG_0833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726431/9c4967b6-7851-34bc-4cfa-10093c3a2030.jpeg)

WinやMacだと複数のディスプレイで拡張していれば、基本1ディスプレイに出るはずです。

僕の理想としてはメインディスプレイでMATLABのGUIを制御、サブに視覚刺激を表示がベスト。

Linuxでは勝手が違うらしい、ぐふぅ

この問題に関して[公式](https://psychtoolbox.discourse.group/t/external-monitor-and-refresh-rate/3907/2)曰く

> Did you install from NeuroDebian or your Ubuntu/Debian distribution, instead of via `DownloadPsychtoolbox`or `SetupPsychtoolbox`? Then you should run `PsychLinuxConfiguration` manually once.
> 

~~いや、instructionに書けよ~~　素晴らしいsuggestionですね

これを実行すると追加で色々インストールしていいか聞かれます。

イエスマンなので全部Yで回答。

その後、
```
XOrgConfCreator
```
を実行すると、グラフィックカードを認識したのち、

Do you want a single X-Screen (s) or a dual/multi X-Screen (m) setup? [s / m] 

と聞かれるのでmを選択。

ディスプレイ一覧が出て、Please enter the numbers of the outputs which should be assigned to X-Screen 0.と聞かれます。X-Screenってなんすか？？

Linuxのディスプレイそれぞれの割り振り番号のようなものらしく、GUIはX-Screen 0でしか表示できないらしいので、メインディスプレイを選択。

There are 1 unassigned active video outputs left.Do you want to create another X-Screen for some of these? [y/n] 

と聞かれたので、yを押してサブディスプレイをX-Screen 1.に設定する。advanceはよくわからなかったのでn。

これでディスプレイ設定ファイル（90-ptbconfig_2_xscreens_2_output的なやつ）ができたらしいので、
```
XOrgConfSelector
```
でどのディスプレイ設定ファイルを参照するか、一覧が出るので、先ほど作成したファイルがあればそれを選び、もう一度ログインしなおす。この時、サブディスプレイが認識されなくなっていたら成功。

ただ、僕の場合はこれが一筋縄ではいかなかった。XOrgConfSelectorで番号を入力すると、

> Error using copyfile
> Cannot write to destination: /etc/X11/xorg.conf.d. Use the 'f' option to override.
> Error in XOrgConfSelector (line 56)
> copyfile([sdir conffiles{answer}], '/etc/X11/xorg.conf.d/90-ptbxorg.conf');

といったエラーが表示され進めなくなった。

書き込めないということはパーミッションの問題？と思い、[Linuxの解説サイト](https://qiita.com/shisama/items/5f4c4fa768642aad9e06)を見ながらターミナルに
```
$ cd /etc/X11/
$ sudo chmod 777 xorg.conf.d
```
を入力してMATLABに戻り、XOrgConfCreatorとXOrgConfSelectorを実行する。

すると前回なかった90-ptbconfig_2_xscreens_2_output的なやつ（末尾が少し違う）が表示されたので、それを選択し、ログインし直すと、目的のディスプレイコンディションに。

試しにDotDemoを行うと紫の画面がサブディスプレイからのみに！素敵！

## 最後に
今回のケースのようにマニアックなセットアップの場合、各ステップに一々トラブルが発生します。
実際、筆者は(0)の部分で3日、(1)~(9)で2日を要して、~~発狂しつつ~~ 調べながら構築を進めました。
今後、もう一台同じようなセットアップを構築する予定なので、そこで再現性を確かめて、この記事をまた更新できればと思っています。
どこか1つのトラブルに関してでも助けになることがあれば嬉しいです。
ここまでお読みいただき、ありがとうございました。