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 とJupyter Notebook を起動する使い方を優先する場合は,

    • 起動の時間が2分から短縮して一瞬になった SageMath-9.0.app へのアップグレードも考慮に値しますが
    • デバッグに期待して, SageMath-9.1.appSageMath-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 にも通用しない可能性があります.

参考資料

が参考になりました.

SageMath-9.0.app を MacOS Mojave にインストールする

SageMath-9.0.app のディスクイメージファイルダウンロード

作業アカウント: どちらかというと管理者アカウント以外を推奨

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

  • Sagemath の公式ホームページに行きます. Google だと Sagemath を検索して, タイトル SageMath - Open-Source Mathematical Software System を見つけて移動します.
  • Download 9.0 ボタンをクリックして SageMath - Download Binaries に移動します. (このボタンのバージョン・ナンバーは Sagemath の最新バージョンに追従するようです. )
  • 近所のミラー・サイトを選んでクリックします. (日本でインストールする場合は Riken, JapanSage MirrorYamagata University, JPSage Mirror で OK です. )
  • Sage Mirror ContentApple Mac OS X — binaries for Intel and PowerPC systemsApple Mac OS X をクリックします. (理研の場合は SageMath Download - osx に移動になります.)
  • FilesIntel をクリックします. (理研の場合は SageMath Download - osx/intel に移動になります.)
  • ファイルのリストから sage-9.0-OSX_10.15.2-x86_64.app.dmg を見つけてクリックします. ダウンロードの許可を求めるダイアログが出たら 許可 ボタンをクリックします. 転送エラーによるファイルの破損が心配な場合は転送したファイルのボタンのすぐ下の MD5 の行をテキストエディターにコピペするなどしてテキストファイルに保存しておきます.

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

ディスクイメージファイルのマウント

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

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

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

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

    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 でコマンド
     myhone$ /Applications/SageMath-9.0.app/sage

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

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

そのダイアログが出た後, Sagemath のメニューの ServerView Log からログファイル ~/Library/Logs/sage.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

というメッセージが出ていました.
このメッセージを頼りにソースファイルを調べてみると, 該当する変更箇所が見つかりました.

    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 という モジュールが無いというエラーが出ます. ヘルプ機能を使っても同じ状況でした.

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

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

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

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

    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 は起動できませんでした.