Sagemath の MacOS アプリSageMath-9.0 をなんとかインストールすると古い Notebook 形式を開けない欠点と起動が速い利点が見つかった件

Sagemath の MacOS アプリの起動に2分かかる事象が `SageMath-9.0.app` で解消しました. また, MacOS 10.15 Catalina の対応のためかアプリに署名がついたようです. なぜか, 私のMac (MacOS Mojave) ではインストールが少し難しくなってしまい, 曲がりなりのインストールになってしまいました.

ここに現状を報告します.

* 古い Notebook 形式を使い続ける場合は
    * Jupyter Notebook に乗り換えるか,
    * `SageMath-8.9.app` まででアップグレードを止めるか
    
    の二者択一になります. 
    ( [Sagemath-9.0 は SageNB Notebook (Legacy Notebook) を開けない](#sagemath-90-は-sagenb-notebook-legacy-notebook-を開けない) 参照 )
* アプリのダブルクリックで Sagemath とJupyter Notebook を起動する使い方を優先する場合は,
    * 起動の時間が2分から短縮して一瞬になった  `SageMath-9.0.app `  へのアップグレードも考慮に値しますが
    * デバッグに期待して, `SageMath-9.1.app` か  `SageMath-9.2.app` を待つことをお勧めします

## 実際に試した使用環境
* 作業記録の日付 2020年01月21日--02月01日 (起動成功は1月22日, その後はトラブルの同定にかかった日数です.)
* 機械: MacBook Pro (13-inch, 2018, Four Thunderbolt 3 Ports) -- 計測時間関連
* macOS Mojave 10.14.6 (`Finder`→`境設定`→ `すべてのファイル名拡張子を表示` に √ )
* SageMath-9.0.app (ディストリビューションは `sage-9.0-OSX_10.15.2-x86_64.app.dmg` )
* システム環境設定の一般のデフォルトの Web ブラウザは `Safari`

2020年は MacOS のアプリの検証の仕組の大幅な変更の年になるようです.
この記事にあるインストール方法はすぐに陳腐化する可能性があります.

ここ数年, MacOS のアプリの検証の仕組みの変化が続いていますので, ここで紹介するインストール方法や動作テストの結果は macOS Mojave と密接に関連していてい macOS High Sierra にも macOS Catalina にも通用しない可能性があります.

## 参考資料
* `DYNY` さんの `Contents Creation Lab` 内の[Mac で「壊れているため開けません。 ゴミ箱に入れる必要があります。」と弾かれたときの対処法とは？](https://dyny001.net/mac-broken-file) 
*  `@zeriyoshi` さん(Qiita) の [macOSアプリにオレオレ再署名する(e.g. 夜フクロウを省電力に改造してみる)](https://qiita.com/zeriyoshi/items/78b4c7227217e2eac536) 
*  `@noby111` さん(Qiita)の  [macOS の App Notarization について](https://qiita.com/noby111/items/89840a8ef46185863ace)

が参考になりました.

## SageMath-9.0.app を MacOS Mojave にインストールする
### SageMath-9.0.app のディスクイメージファイルダウンロード
作業アカウント: どちらかというと管理者アカウント以外を推奨

まず, 公式サイトのダウンロード・ページ(のミラーサイト)から SageMath-9.0.app のディスクイメージファイルをゲットします.

* Sagemath の公式ホームページに行きます.
Google だと `Sagemath` を検索して,
タイトル [SageMath - Open-Source Mathematical Software System](https://www.sagemath.org) を見つけて移動します.
* `Download 9.0` ボタンをクリックして
[SageMath - Download Binaries](https://www.sagemath.org/download.html) に移動します. (このボタンのバージョン・ナンバーは Sagemath の最新バージョンに追従するようです. )
* 近所のミラー・サイトを選んでクリックします.
(日本でインストールする場合は `Riken, Japan` → [Sage Mirror](http://ftp.riken.jp/sagemath/index.html) か `Yamagata University, JP`→ [Sage Mirror](http://ftp.yz.yamagata-u.ac.jp/pub/math/sage/index.html) で OK です.  )
* `Sage Mirror Content`→`Apple Mac OS X — binaries for Intel and PowerPC systems` の `Apple Mac OS X` をクリックします.
(理研の場合は [SageMath Download - osx](http://ftp.riken.jp/sagemath/osx/index.html) に移動になります.) 
* `Files`→`Intel` をクリックします.
(理研の場合は [SageMath Download - osx/intel](http://ftp.riken.jp/sagemath/osx/intel/index.html) に移動になります.)
* ファイルのリストから `sage-9.0-OSX_10.15.2-x86_64.app.dmg` を見つけてクリックします.
ダウンロードの許可を求めるダイアログが出たら `許可` ボタンをクリックします.
転送エラーによるファイルの破損が心配な場合は転送したファイルのボタンのすぐ下の `MD5` の行をテキストエディターにコピペするなどしてテキストファイルに保存しておきます.

管理者アカウント以外でダウンロードした場合は, 管理者アカウントからアクセスできる場所にディスクイメージファイル (と `MD5` の行を保存したテキストファイル) を移します.

### ディスクイメージファイルのマウント
作業アカウント: 管理者アカウントを推奨, ウィルス対策の優先度が非常に高い場合は管理者アカウント以外で試した上で管理者アカウントで実行

ディスクイメージファイルのマウントはウィルス対策ソフトと相性が悪いことがあります. そのため, ここの手順はウィルス対策ソフトの癖によって若干変化します. ディスクイメージファイルの破損を疑いたくなる状況もあるかと思いますので, 点検の仕方から書き起こします.

* ディスクイメージファイルは内部でチェックサムによる検証がありますので,  `md5` を自分で使って転送結果を検証する必要はないはずです . それでも転送エラーによるファイルの破損が心配だという場合は `md5` コマンドでチェックすることができます. Terminal.app でディスクイメージファイルを置いてあるフォルダーに移動してから `md5` コマンドにディスクイメージファイルを引数として渡します.

```console
    myhome$ $ md5 sage-9.0-OSX_10.15.2-x86_64.app.dmg 
MD5 (sage-9.0-OSX_10.15.2-x86_64.app.dmg) = eb2e6040c863718a8944f7012b9475f2
```

この結果を公式サイト(のミラー)からコピペしたデータと比較して一致していれば大丈夫です.

* MacOS の異常終了の対策よりウィルス対策を優先する場合は, 起動中のソフトを全て終了させてから, `sage-9.0-OSX_10.15.2-x86_64.app.dmg`  をダブルクリックしてマウントしてみます. ディスクイメージファイルの検証で時間がかかりますが, そのすぐ後のボリューム検証まで無事に終わるとデスクトップに `sage-9.0-OSX_10.15.2-x86_64` というディスクが出てきます.
これがうまくいった時は次のステップをスキップします. うまく行かなかった場合は, ディスクイメージの検証終了の後のボリュームの検証に入ったところで
 Mac の電源が切れてしまいます. この異常終了の前にファンが回る音が聴こえる場合と聴こえない場合があります.
 
 * MacOSの異常終了の回避を優先する場合や, 異常終了が起きてしまった場合は,
ウィルス対策ソフトのリアルタイム・スキャンを一時的に停止してから `sage-9.0-OSX_10.15.2-x86_64.app.dmg` をマウントして, マウント完了後(デスクトップに `sage-9.0-OSX_10.15.2-x86_64` というドライブのアイコンが出てきた後) すぐにリアルタイム・スキャンを再開します. ここで, `sage-9.0-OSX_10.15.2-x86_64` に手動でウィルス・スキャンを掛けておくと, 同じアカウントで`sage-9.0-OSX_10.15.2-x86_64.app.dmg` を再度マウントするときにウィルス対策ソフトのリアルタイム・スキャンが ON のままでよくなるようです. (私は管理者アカウントでマウントしてウィルス・スキャンをしてからユーザーアカウントでこの記事を執筆中に, ドライブ名を確認する目的で `sage-9.0-OSX_10.15.2-x86_64.app.dmg` をダブルクリックしてMacOS異常終了の憂き目に遭いました. 再起動後, 管理者アカウントでウィルス対策ソフトのリアルタイム・スキャンを ON にした状態で `sage-9.0-OSX_10.15.2-x86_64.app.dmg` をマウントしてドライブ名を無事確認することができました.)

### アプリ `SageMath-9.0.app` のコピー
作業アカウント: 管理者アカウント推奨

アプリ `SageMath-9.0.app` を `/Applications` にコピーします.

* アプリ `SageMath-9.0.app` を`sage-9.0-OSX_10.15.2-x86_64` から `/Applications` にコピーします. (管理者アカウント以外の場合はパスワード入力の手続が入ります.)

ここまでの手順を発見した後に `SageMath-9.0.app` を削除してログインしなおしてから時間計測の目的で作業を最初から行ったところ, マウント開始からコピー終了までの時間は 15分でした. 

### アプリ `SageMath-9.0.app` の実行許可
作業アカウント: 直前のステップおよび直後のステップと同じアカウントで実行してトラブルを防ぐことを推奨

* MacOS のアプリ検証機能を一時停止して SageMath-9.0.app の実行許可を設定します.
具体的には, Terminal.app で

```console
    myhome$ sudo spctl  --master-disable
```

というコマンドを使用してから, `/Applications/SageMath-9.0.app` をダブルクリックして, その後出てくる検証のダイアログで `開く` ボタンをクリックしてから Terminal.app で

```console
    myhome$ sudo spctl  --master-enable
```

というコマンドを実行します.

MacOS のアプリ検証機能を停止せずに `/Applications/SageMath-9.0.app` をダブルクリックしてしまうと検証が始まって 5 分後ぐらいに　`/Applications/SageMath-9.0.app`  が壊れているという内容のダイアログが出てきます. 私はその状態になってから状況を調べて, MacOS のアプリ検証機能を一時停止してこのステップの手順を試しました. その時は MacOS によるアプリの検証が少し短かったように思います.

### SageMath-9.0.app のローカリゼーション 
作業アカウント: SageMath-9.0を `/Applications` にコピーしたときと同一のアカウントということが必須条件です. (異なるアカウントの場合は `chown` コマンドを再帰的に使用してファイルの所有者を変更しないとパッチ当ての作業ができないという事情です. `chown` を使う処理を使う場合のローカリゼーションの動作は確認していません.)

最近の SageMath-X.X.app に共通の事情で `SageMath-9.0.app` の起動の際にダイアログがでたり, 様々な  Web ページが出てきたりします. インストール作業中の対応の仕方はこのステップの本体の後に注意書きを入れておきますので, 作業の前に目を通しておいて下さい.

SageMath-X.X.app のローカリゼーションはパス名のパッチ当てです. SageMath-8.9.app までは(Sagemath 実行時に動的に読込む目的であらかじめコンパイルしてあるプログラムの)ライブラリーにパッチを当てていましたが, SageMath-9.0.app は同梱のソースコードにパッチを当てる方法に変更になっているようです.

 * `SageMath-9.0.app` をシステムにローカライズします.
 具体的には Terminal.app でコマンド
  
 ```console
     myhone$ /Applications/SageMath-9.0.app/sage
 ```
 
を打つか `/Applications/SageMath-9.0.app` をダブルクリックするかします.
ローカライズの作業の中身は Sagemath 内で使うパス名のパッチ当てです. Terminal.app を使う方の手順では パス名のパッチのメッセージが流れていってからポーズがあって, 最後に `sage: ` というプロンプトが出てきますので, `exit` 関数でクイットします.

```sagemath
    sage: exit()
```

`/Applications/SageMath-9.0.app` をダブルクリックする場合は `loading-page.htmel` や Jupyter のログインページがブラウザーで出てくるまで待ちます. 

ローカリゼーションの所要時間は 1〜2分でした.

#### ダイアログについて (1)
この作業の途中で `Read-only Sage` のダイアログが出てしまった場合は, `quit` して `/Applications/SageMath-9.0.app` の所有権を点検して下さい. その所有者のアカウントでローカライズすればよいはずです. 誤ってディスクイメージの方の `SageMath-9.0.app` をダブルクリックしてしまって場合もこのメッセージが出ますので, ディスクイメージ `sage-9.0-OSX_10.15.2-x86_64` をイジェクトしてから `/Applications/SageMath-9.0.app`をダブルクリックしてやり直して下さい.

#### ダイアログについて(2)
この作業の途中で  `Please choose a Jupyter Directory` のダイアログが出てきた場合は, Sagemath のファイル専用に使うフォルダーを指定して下さい. Sagemath-8.9 専用の既存のフォルダーがある場合はそのフォルダーを指定して大丈夫だと思います. 

#### ダイアログについて (3)
この作業の途中で `Sage Notebook Upgrade` のダイアログが出てきた場合は, とりあえず `Ask me Later` をクリックして作業を続けて下さい.

#### Jupyter のログインページについて (1)
Jupyter のパスワードの設定がまだの場合は Jupyter のログインページが少し変化します. `~/Library/Logs/sage.log` の最後の方の行の `http://localhost:8888/?token=...` の `...` の部分のトークンを入力してログインするページになると思います. ただし, Jupyter のパスワードを SageMath-8.9 で設定してある場合はパスワードが引き継がれるようです.

####  Jupyter のログインページについて (2)
Sagemath の MacOS アプリは Jupyter のログインページ (`http://localhost:8888` など) をスキップして `Jupyter Home` (`http://localhost:8888/tree`) に直接すすむことがあります.

#### `loading-page.html` について (1)
`loading-page.html` の`Jupyter`-ボタンは `http://localhost:8080` に繋がっていますが, 正しくは `http://localhost:8888` です.  `/Applications/SageMath-9.0.app` を起動してから Jupyter のログインページが出てくるのが遅い場合は, ブラウザーでアドレス `http://localhost:8888` を開いて下さい. (Sagemath の Jupyter Server を複数起動すると, ポート番号が 1 ずつ増えていきます. )

#### `loading-page.html` について (2)
Sagemath の起動の際, ブラウザーが自動的に立ち上がってから, `loading-page.html` の表示が出てくるまでに2分間かかるという症状が SageMath-8.9 までにありましたが, SageMath-9.0 では解消したようです. ログ・ファイル周辺のバグが変化したことによるものと思われます.

### SageMath-9.0.app の起動
作業アカウント: ディスクイメージファイルのマウントからのやり直しに備えて管理者アカウントで最初にテストすることを推奨します.

一度, ブラウザーを終了させて, メニュー・バーの Sagemath からメニューのクイットを選択して Sagemath の方も終了させた上で, `/Applications/SageMath-9.0.app` をダブルクリックすると, 今度も `loading-page.html` とJupyter のページがすぐに出てきます.

ここのところは, システム環境設定の `一般` タブのデフォルトの Web ブラウザが `Safari` の場合です. デフォルトの Web ブラウザが  `SageMath-9.0.app` の場合は起動できない場合があります.
当面の対応は  `Safari` をデフォルトの Web ブラウザにすることです.

利用者アカウントで SageMath-9.0 を起動するときは `Read-only Sage` というダイアログが出てきますので, `Continue` というボタンをクリックすると Sagemath が起動します.

## Sagemath-9.0 は SageNB Notebook (Legacy Notebook) を開けない

Sagemath-9.0 では `loading-page.htmel` の `SageNB interface`-ボタンをクリックしても古い Notebook 形式 ( = Legacy Notebook = SageNB Notebook ≒ sws-ファイル) を扱う Web インターフェイスが出てきません.
`SageMath-8.9` のメニューの `Start SageNB Server` を選択すると
`Sage Server failed to start` というダイアログが出てきて, `SageNB Server` の起動が拒否されてしまいます.

そのダイアログが出た後, Sagemath のメニューの `Server`→ `View Log` からログファイル `~/Library/Logs/sage.log` を確認すると.

```log
CRITICAL:root:trying to use old notebook under Python 3
old notebook not working under Python 3, use Jupyter notebook
see https://wiki.sagemath.org/Python3-Switch
```
というメッセージが出ていました.
このメッセージを頼りにソースファイルを調べてみると, 該当する変更箇所が見つかりました.

```console
    myhome$ diff sage-{8.9,9.0}/src/bin/sage-notebook 
1c1
< #!/usr/bin/env sage-python23
---
> #!/usr/bin/env sage-python
81c81
<     then rebuild Python (sage -f python2).
---
>     then rebuild Python (sage -f python3).
251a252,257
>     if sys.version_info.major == 3 and args.notebook == "sagenb":
>         logger.critical('trying to use old notebook under Python 3')
>         print('old notebook not working under Python 3, use Jupyter notebook')
>         print('see https://wiki.sagemath.org/Python3-Switch')
>         sys.exit(1)
```

最後の行で SageNB Server の起動を拒否していることがわかります.

コマンドラインから起動を試みても同じ状況です.
まず,  `sage` コマンドを実行して `notebook()` を使用すると `sagenb` という モジュールが無いというエラーが出ます. ヘルプ機能を使っても同じ状況でした.

```console
    myhome$  /Applications/SageMath-9.0/sage
sage: notebook?
....
ModuleNotFoundError: No module named 'sagenb'
```

次に, コマンドラインから `--notebook` オプションを使用して Web インターフェイスを起動した場合, `Jupyter` と `Old Sage Notebook` のボタンが出てきますが,  `Old Sage Notebook` ボタンをクリックすると,  `The Sage Notebook failed to start :-(` というエラーメッセージがでます. (この Web インターフェイスは自動的に出てくる場合, Jupyter のログインページが自動的にでてきてログインすると遷移する場合, ブラウザーで `http://localhost:8888/` を開いてログインしてから遷移する場合があります. )
  裏では Terminal.app にエラーメッセージが出ていました.

```console
    myhome$ /Applications/SageMath-9.0/sage  --notebook
...
ModuleNotFoundError: No module named 'sagenb'
```

今度は, コマンドラインから直接  SageNB Server を起動しようとして, オプション `--notebook=sagenb` を使用すると `sage.log` に記録されていたものと同じエラーメッセージが出てきました.

```console
    myhome$ /Applications/SageMath-9.0/sage  --notebook=sagenb
CRITICAL:root:trying to use old notebook under Python 3
old notebook not working under Python 3, use Jupyter notebook
see https://wiki.sagemath.org/Python3-Switch
```

以上, どの方法を使っても SageNB Server は起動できませんでした.