3年以上の時を経て、Pythonista 3 がバージョン 3.4 にアップデート (Python 3.10 サポート)

もう終わったのかと思っていたけど、、、うれしかった!

iPad で実行。Stash の version コマンドの出力。Python 3.10.4 になってます

Python 3 は 3.10.4 にアップデート。Python 2 は完全廃止

iOS で Python コードを書いて実行できるアプリ、Pythonista 3。3年以上の時を経て Python 3.10 対応となってアップデートされました。

Pythonista 3 ←App Storeへのリンク

詳しい変更内容は、以下のリリースノートを見てください。Google 日本語翻訳のリンクも貼っておきます。

https://omz-software.com/pythonista/docs-3.4/py3/ios/new.html

プラス要素だけでは無く、本バージョンでは Python 2.7 が無くなりました。なので、過去記事で書いた 2.x 環境用で動くスクリプトは、そのままでは実行できなくなりました。StaSh では ssh コマンドも動きません。

StaSh の話が続きますが、StaSh は有志の方々によって開発されている OSS のため、対応が追いついていません。やっとなんとかインストール・実行できるようになりましたが、エイリアスや環境変数を書き込める .stashrc ファイルや、複数のコマンドをセミコロンでつなげて一度に実行しようとしても、最初のコマンドしか実行されない状況です。

StaSh のインストール

StaSh をインストールして正しく動作させるには、一度 Pythonista 3 を削除することが推奨されています (StaSh 自体やインストール方法などは日々アップデートされているようなので、定期的に Github をチェックすることをお勧めします)。現在のところ、自分で試した感じでは dev バージョンをインストールするのが良さそうです。Console に以下をコピペして実行してください。

url = 'https://raw.githubusercontent.com/ywangd/stash/dev/getstash.py'; import requests as r; exec(r.get(url).text.replace('master', 'dev'))

その後、一度 Pythonista 3 アプリを終了後、This iPhone (Documents フォルダ) にある launch_stash.py を実行すると StaSh が立ち上がります。

Django のインストールと実行 (最新版は動かない)

Django は、試したところ version 4.0 ならインストールとテストページの表示までできました。バージョンを指定しないと 4.2.1 が入るのですが、そのバージョンでは openssl_md5 のシグナチャが見つからないというようなエラーで django-admin が動きません。

pip install django==4.0

ちなみに、StaSh に表示されるインストールログや、pip show Django を見ると 4.2.1 がインストールされているように表示されるのですが、Console で確認 ( import django してから print(django.__version__) ) すると 4.0 です。pip のバージョン表示はこれまで通り信用できないようです。

ともあれ無事インストールできたら、Pythonista 3 を終了して再度立ち上げ、プロジェクトを作ります。

django-admin startproject mysite

右にスワイプして This iPhone > mysite と進み、manage.py をタップしてコードを開きます。▷を長押しして Arguments に以下をコピペし、Run しましょう。noreload の左にあるのは、マイナス二つです。

runserver --noreload

赤文字の英語で「CommandError: You must set settings. ALLOWED_HOSTS if DEBUG is False.」と出た場合は、ここではとりあえず気にせず Pythonista 3 を終了・起動、そしてもう一度 manage.py を Run しましょう。iOS がネットワークアクセスの可否を聞いてきたら許可してください。

うまくいけば Console に諸々の注意事項と共に URL http://127.0.0.1:8000/ が表示されるはずです。こちらをタップするなり Safari にコピペするなりすると、はい、おめでとうございます、ロケットページが表示されます。 (このサイトには過去バージョンの Pythonista 3 の記事がいくつかあるので、参考に見てみてください)。

とりあえずのまとめ

最近 a-Shell という Unix/Linux ライクなシェル環境で Python 3.11 がいじれる iOS アプリを見つけていたのですが、Python がバックグラウンドで動き続けない (Django や Flask アプリは、ブラウザとアプリを行き来しないとページが更新できない) ことにがっかり (← いじっているうちになぜか解決しました)。そんな矢先に届いたのが Pythonista 3 のアップデートでした。個人的に新しめの Python ならではの機能はあまり使っていないのですが、これを機に知識のアップデートもしていこうと思っています。StaSh がキャッチアップするのにまだかかりそうではありますが、新たな発見があれば書きためていこうと思います。

Image by Stable Diffusion

ステップ数が少ないからかなり怖い画像になってますが、Mochi Diffusion の max 値である 50にすると、変にまとまってしまって自分のうれしい気持ちを表現しきれないので、最初に出力した画像をアイキャッチにしました。ゾッとした方、ごめんなさい。

Date:
2023年5月6日 14:35:09

Model:
realisticVision-v20_split-einsum

Size:
512 x 512

Include in Image:
cartoon, people happy with a new release of software

Exclude from Image:


Seed:
3343127351

Steps:
20

Guidance Scale:
11.0

Scheduler:
DPM-Solver++

ML Compute Unit:
CPU & Neural Engine

ユニバーサルコントロールがいい感じ

Mac mini (M1) と MacBook Air (Intel 2019) を macOS 12.3.1 にし、iPad mini (第 5世代) を iPadOS 15.4.1 にアップデート。ユニバーサルコントロールを有効にして、ワンセットのマウスとキーボードで操作してみました。最初の感触としてはすごくいいです。3つの Apple デバイス+1つのモニタが、シームレスに操作できています。使い切れていない機器が再び使えるようになりそうですよ。

まずやることは、OS のアップデート、そしてユニバーサルコントロールの有効化

すでに macOS 12.3 と iOS 15.4 ではユニバーサルコントロールに対応していましたが、今回それぞれバグフィックスがされたバージョンをインストールしました。計測していませんが、macOS のアップデートは1時間くらい?iOS は 30分くらい?という感じです。どちらも再起動後、設定を有効にすれば使えるようになります。

そもそも完了しているとは思いますが、全てのデバイスが同じネットワーク内にいて、同じ Apple ID でサインインしている必要があります。その他の条件は Apple のページ (特にシステム条件) を確認してください。Mac と iPad それぞれの設定場所は以下の通りです:

macOS: アップルマーク > システム環境設定… > ディスプレイ > ユニバーサルコントロール … > 全部 (もしくは上から 2つ) にチェックを入れて、完了

接続された後、それぞれの位置を移動できます。左から、MBA、Mac Mini メイン、サブ、下に iPad mini。なんと、M1 搭載 Mac に標準の機能だけで 4画面!

iPadOS: 設定 > 一般 > AirPlay と Handoff > カーソルとキーボード (ベータ版) にチェック

iPad はここにチェックを入れるだけ

最初にできるのは横のつながりだけ?

Apple のデモを見ていたときには、あたかも置いてある方のデバイスのモニタにマウスカーソルが移動できるような雰囲気ではありましたが、さすがにそれぞれのデバイス同士で位置情報を交換しているわけでは無いです。ざっと試した感じでは、モニタの端にマウスカーソルを持って行ってから、さらに画面の外に持って行こうとすると、未接続のデバイスにカーソルが移動します。そうやって接続してから、Mac のディスプレイ設定で上のスクリーンショットのように気に入った場所に移動しましょう。下にも配置できます。iPad 画面の縦横も反映されるので、Sidecar より便利ですね。

MacBook Air (Intel) を生かせそうな予感

性能がかなり控えめで、たまーにリビングで Mac を使うときにしか稼働させることの無くなってしまった Intel CPU の MacBook Air (Retina, 13-inch, 2019) ですが、ユニバーサルコントロールのおかげで生き返りそうです。Mac mini と一緒に机で使うときは、3枚目のモニタとしてメールを開きっぱなしにしておけます。また、トラックパッドでページをめくれるので、リビングでは外付けモニタ的に iPad の Kindle で技術系書籍を開き、MBA でプログラムを書くなんて便利な使い方ができます。自分の用途では Sidecar より便利です (Sidecar は iPad を縦表示にできず、フルスクリーンでは使えない)。ただし、Kindle ではダブルクリックやドラッグで文字を選択することはできないようで、おそらく amazon 側の対応が必要な感じです。

ベータ版だからか、サポート外か?

ファイルのドラッグアンドドロップもできるということで、iPad のスクリーンショットをファイルに保存し、マウスで Mac のデスクトップに持ってこようとしましたができませんでした。できないどころか、Mac mini のディスプレイ設定から iPad mini が消え、MBA では見えているけど iPad mini の画面位置を移動できず、他のことをしていたらいつの間にか復活、という動作になりました。そもそも写真のドラッグアンドドロップは対応していないのかもしれません。使い続けていると、できそうでできないことが他にも見つかりそうです。少なくともデバイス間のテキストのコピペは問題なさそうです。

これは困る。iPad mini ではキーボード配列が日本語になってしまう

Mac mini M1 にインストールはできるものの、頻繁にクラッシュして使い物にならない Pythonista3 を iPad mini で起動していじってみました。使い慣れたキーボードで操作できるなんて最高です!と報告して本投稿を終了、と思ったのですが、なんだか様子がおかしい。どういうことかというと、キーボード配列が日本語 JIS 配列になってしまっていて、HHKB Pro 2 の英語キーボードではアンダースコアが入力できないのです。ググってみても、日本語キーボードが英語キーボードと認識されてしまうという情報は多いのですが、逆はみつかりませんでした。果たしてユニバーサルコントロールの問題なのか調べるために、iPad に USB-A コネクタを追加するアダプタでキーボードをつないだところ、結果は同じでした。日本語配列キーボードとして認識されてしまいます。

キーボード配列問題のワークアラウンド

本日確認できた唯一の解決方法は、iPad の使用言語を English にすることです。

iPad: 設定 > 一般 > 言語と地域 > iPad の使用言語 > English にして続ける

iPad のメニューが全て英語になるので、英語が苦手な方は注意

同じ言語と地域の画面の、言語を追加で英語を追加してもダメで、英語の優先順位を日本語より上にすると iPad の使用言語が English になり、上と同じ事に。なので、この記事を書いている現在では iPad 自体の使用言語を変えることがキーボードのレイアウトと合わせる唯一の方法のようです。いつかキーボードのレイアウト問題が解消するといいですね。

感想

Macbook + iPad のモバイル時の利便性や、M1 搭載 Mac でも擬似的にとはいえ 3画面 (以上) 使える使えるのはすごくいいですね。Mac 間では遅延や操作のしづらさもありません。無料の OS のアップデートだけで使えるので、複数の Mac や iPad を持っている方はいろいろ試してみたら良いと思います。ボクは以前購入した、iPad を Mac の外付けモニタにできる duet という 2,000円くらいしたアプリを削除する決心が付きました。最後にひとつ。どうやらユニバーサルコントロールで接続されていると、接続元 (?) がアクティブである間は接続先デバイスもアクティブであり続けるため、その分バッテリが減ってしまいます。モバイルで使用するときには、バッテリの使用状況に注意するようにしましょう。

Pythonista3 でコードを実行するバージョン (3 or 2) を指定

Python には 2.x 系と 3.x 系のバージョンがあり、Pythonista3 は 2.7.12 と 3.6.1 をベースに作られている

ということを知っておきましょう。Pythonista3 では、どちらのバージョンの環境でコードを実行するか選ぶことができます (下図。スクリプト名の右にある ▷ を長押し)。通常はデフォルトのバージョン 3で問題ないはずですが、2系で書かれたコードを実行する際には print 文やモジュールのインポートでエラーが出る可能性が高いです。そういう場合には 2.7 でコードを実行しましょう (Run with Python 2.7)。

6DF76B93-53C3-4D19-B1AD-37FD314A1BD5.jpeg

StaSh 上の一部コマンドは Python 2 用に書かれている

Pythonista 3 に Django や py-tree といった Python のパッケージをインストールするのに本サイトでも便利に使用させてもらっている StaSh ですが、一部コマンドは Python 2 用に書かれているもののようです。なので、StaSh インストール後に普通に起動すると、デフォルトの Python 3.6 で実行されるので、警告が表示されます。

StaSh v0.7.2 on python 3.6.1
Warning: you are running StaSh in python3. Some commands may not work correctly in python3.
Please help us improving StaSh by reporting bugs on github.

Python 3 ではうまく動作しないコマンドや、Python 2 のパッケージをインストールしたり実行するには、Python 2.7 で実行する必要があります (▷アイコン長押し、Run with Python 2.7)。そうすれば上記の警告は出ません。

StaSh v0.7.2 on python 2.7.12

というわけで、Python 2.x 用に書かれたパッケージを pip でインストールしたい場合は、そもそも実行する StaSh を Python 2 で実行しなければなりません。毎回 ▷アイコンを長押しする?ちょっとスマートじゃないですね。

コードを実行するPython のバージョン (3 or 2) を指定する

コードを作成する際、実行する Python のバージョンを指定することができます。方法は簡単で、Python 2 で実行したい場合は以下のようにコードの最初の行にバージョンを明記してあげるだけです (コードを実行する言語を指定するこの方法を Shebang と言います)。パスがない分、Linux や macOS よりも簡単です。

#! python2
# coding: utf-8
# この下にコードを書いていく

StaSh の場合、Python 3 で実行したいとき (Django のインストールなど) と Python 2 で実行したい時 (StaSh 内のコマンドが Python 3 だとエラーを吐くなど) のケースがあるため、先頭の Shebang を変更した stash2.py と stash3.py の 2つのコードを書き、それぞれショートカットとして登録しておくと便利です。

Pythonista 3 に Django 2.0 をインストールする

過去の投稿のように、バージョンを指定してあげれば Django 2.0 も Pythonista 3 にインストールできます。ただ、詳細な原因は確認できていませんが、バージョン 2.0 しか今のところインストールできません。既に Django 1.x をインストール済みの場合は、削除する必要があります。

インストール済みの Django を削除 (StaSh を使用)

pip remove django

2.0 をインストール (2.0.1 以降は、2018/3/23 現在、Python 2.7 はサポート外というエラーで失敗します。もちろん Pythonista は最新の 3.6 でもです)

pip install django==2.0

StaSh で

pip list

としてバージョンを見ると 2.0.3 などと出ますがウソです。Console で確認しましょう。

import django
print(django.VERSION)

さて、 Django 1.x でプロジェクトを作っていた場合、manage.py に runserver --noreload を arg として渡してもエラーが出ます。おきまりの再起動と manage.py の実行を何度かすると、ForeignKeyon_delete がないというエラーになる場合があります。その場合は、エラーが出ている model.py を下の太字部分 (カンマ以降、閉じ括弧まで) を追加しましょう。

author = models.ForeignKey('auth.User', on_delete=models.PROTECT)

メジャーアップデートで色々と変更があるようですが、取り合えず Pythonista on iPhone として嬉しいのは admin ページがレスポンシブデザインになったというところが大きいと思います。楽しみましょう!

iOS Pythonista 3 で XServer に SSH 接続

Pythonista 3 の StaSh を使って SSH で XServer へ接続する

Pythonista 3 の StaSh を使ってホスティングサーバである XServer へ SSH 接続する方法です。ポイントは、XServer のサーバーパネルで「公開鍵認証用鍵ペアの生成」を行わず、StaSh の ssh-keygen コマンドでパスフレーズ無しのキーを作成するということ。パスフレーズを付けて作られたキーは StaSh のssh で動かないようです。おそらく他の SSH 接続を許可するホスティングサーバでも同様の方法で接続可能かと思いますのでお試しください。
XServer の SSH 設定方法 (公式) はこちら

StaSh でキーを作成

$ ssh-keygen -t rsa -b 2048

以下のパスに秘密鍵と公開鍵が作られる。

~/Documents/site-packages/stash/.ssh
$ ls
id_rsa id_rsa.pub

後は、公開鍵を XServer のサーバパネルで登録すれば、以下コマンドでサーバに SSH 接続できる。

SSH コマンド

$ ssh username@username.xsrv.jp -p 10022

(“username” は自分のアカウント名に差し替える)

初めて ssh コマンドを実行すると、どうやら自動的に pyte というターミナルエミュレータが pip でインストールされます。そのまま ssh コマンドを実行してもエラー global name 'pyte' is not defined と表示される場合は、Pythonista 3 を終了してから再度立ち上げてください。

(蛇足) SSH しているときの行数を指定

ここまできたらこっちのもの、.stashrc ファイルに alias を登録したり (こちらを参照)、他の iOS 端末や SSH アプリ、パソコン等に .ssh フォルダの中の ids_rsa を持って行ってそれらの環境で SSH 接続ができるようにすれば作業がはかどります。 ids_rsa ファイルは秘密鍵ですので、絶対に他の人に見られないよう取り扱いには注意しましょう。

一点 Pythonista 3 の StaSh で SSH 接続している際の残念な点は、入力中は画面下の [Tab] [H] [Up] などの StaSh のもつ特殊キーの列と iOS のキーボードのソフトウェアキーボードが常に出てしまうところです (Bluetooth キーボードを使用していても 3行分ほど狭くなる)。面倒ですがログインする端末に応じて、stty コマンドで、画面の行数を指定しまいましょう。一画面に収まって作業がしやすくなります。以下を参考に、自分の環境でちょうどいい行数を指定してみてください。

$ stty rows 51 # iPad mini 2 で外付けキーボードならここまでイケる
$ stty rows 27 # iPhone 8 Plus でソフトウェアキーボードならここまでイケる

Pythonista3 に py-tree をインストールする

ディレクトリ構成を一覧表示してくれる py-tree を Pythonista3 (iOS) にインストールし、使いやすくする方法、など

py-tree をインストールすると

こういうのができるようになります:

[mysite]$ tree
.
|-- db.sqlite3
|-- manage.py
|-- mysite
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
`-- polls
    |-- __init__.py
    |-- admin.py
    |-- apps.py
    |-- models.py
    |-- tests.py
    |-- urls.py
    |-- views.py
    `-- migrations
        |-- 0001_initial.py
        `-- __init__.py

Pythonista3 に限った話ではありませんが、Web アプリなど階層構造でプロジェクトを作っている時には、CLI (Pythonista3 の場合は StaSh) でディレクトリとファイルの一覧を見たくなるものです。そんな時に便利なのが py-tree コマンドです。上の例のように表示できるので、デバッグする時などにも重宝します。

インストール

インストールは簡単で、StaSh で以下のコマンド ([stash]$ プロンプトの後の部分) を実行します。

[stash]$ pip install py-tree

“tree” で実行できるようにする

実行するのはもちろん py-tree [enter] です。が、ソフトウェアキーボードでハイフンを入力するのは一手間かかって面倒なので、tree と入力すれば実行できるようにしましょう。
StaSh では Linux のシェル bash にある .bashrc のように alias を .stashrc ファイルに記載して利用することができます。具体的な手順は以下の通りです:

[stash]$ cd site-packages/stash/
[stash]$ la
.gitignore .stash_history .stash_tips .travis.yml CHANGES.md LICENSE README.md __init__.py bin docs getstash.py lib man stash.py system
[stash]$ touch .stashrc
[stash]$ echo "alias tree='py-tree'" >> .stashrc
[stash]$ cat .stashrc
alias tree='py-tree'
[stash]$ la
.gitignore .stash_history .stash_tips .stashrc .travis.yml CHANGES.md LICENSE README.md __init__.py bin docs getstash.py lib man stash.py system

StaSh を一度終了してから再度実行すると、一番上のサンプルのように tree コマンドで階層表示ができるようになります。

(蛇足) Pythonista 3 で xxx.py 以外のファイルを作成、編集する

Pythonista3 単体では .stashrc のような名前のファイルは作れません (勝手に .py が付加されてしまう)。また、一度作るとドットで始まるファイルは不可視となり、編集できません。そのため、そのようなファイルを作る場合は、上記手順にあるように StaSh の touch コマンドでファイルを作り、edit コマンドで Pythonista3 の編集画面で開いてあげます。不可視ファイルは ls -a または同コマンドのエイリアスとしてデフォルトで登録されている la で確認することができます。

まとめ

目的コマンドサンプル
不可視ファイルを作るtouchtouch .invisible
ファイルを Pythonista3 で編集editedit .invisible
不可視ファイルを含むファイルを表示ls -a
または
la
la
(la .* で、不可視ファイルのみを表示)

Pythonista3 に Django をインストール

iPhone や iPad 向け app Pythonista3 に Django をインストールする方法:

まず、ググって Pythonista3 に StaSh をインストールしてください。日本語の情報も見つかります。必要そうならそのうちここにも記事を書きます。

StaSh が入ったら、StaSh から以下を実行します:

$ pip install Django==1.11.6

バージョンの “1.11.6” は、その時に利用できる LTS (Long Term Support) version にしたら良いでしょう。djangoproject.com のサイトをご確認ください。(2021/06/12 追記) pip install django だけで バージョン 3.2.4 がインストールされました。バージョン指定は必要に応じてで良さそうです。

Pythonista3 を終了し、再度開きます。 <– これは Pythonista3 で何か変更を加えた際にほぼ必ず実行すべきアクションなので、期待した通りの動きをしていない時などはやってみてください。本手順でも何度も出てきます。

StaSh で Django のプロジェクトを作ります。

$ django-admin.py startproject mysite

Pythonista3 を終了し、再度開きます。

/mysite/manage.py を開きます。
Console (右ヘスワイプ) で以下を実行します。

import sys
sys.path

表示結果から、以下のような行を見つけ、コピーします (「…」の部分は、iOS 端末固有の情報です)。

/private/var/mobile/.../Documents/mysite

左にスワイプし、manage.py の編集画面に戻ります。
import sys” の下に以下を追加して、「ここに貼り付け」を上記でコピーした内容に置き換えます。(2021/06/12 追記) append の後に不要なイコール (=) が入っていたので削除しました。

sys.path.append(“ここに貼り付け”)

すると、こんな感じになります (端末によって AppGroup/…/Pythonista3 の間は異なります):

sys.path.append("/private/var/mobile/Containers/Shared/AppGroup/C1F57ABC-DDDD-EEEE-FFFF-B0B0E0B0B0E7/Pythonista3/Documents/mysite/")

Pythonista3 を終了し、再度開きます。

/mysite/manage.py を開き、実行 (右三角) ボタンを長押しして開いた画面の argument に、“runserver --noreload” を追加します。ハイフン 2つをうまく入力できない場合は、ダブルクォーテーションの内部をコピペしてください。

うまくいくと、以下のような内容が Console に表示されます。(改めて書きますが、何か想定外のエラーが発生した場合は Pythonista3 app を終了し、再度実行してください)

Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
June 12, 2021 - 14:29:53
Django version 3.2.4, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

ここまできたら、http://127.0.0.1:8000/ を Safari などのウェブブラウザで開きます。

URL を長押しして Copy できる


“It Worked!” ページが表示されたら Django のインストールと初期設定は完了です。Django のチュートリアルなどを参考に、ご自身のプロジェクトやアプリケーションを作りましょう。

バージョン 3.2.4 だとこんな画面

Pythonista3 では Django への変更に対する自動更新ができない (--noreload) なので、期待通りの動作をしない場合は、Pythonista3 app の再起動をしてください。

以下は StaSh で Django をインストールした際のログです:

[~/Documents]$ pip list
[~/Documents]$ 
[~/Documents]$ 
[~/Documents]$ pip install django
Querying PyPI ... 
Error: Source distribution not available for Django: 2.0b1
[~/Documents]$ pip install Django==1.11.6
Querying PyPI ... 
Downloading package ...
Opening: https://pypi.python.org/packages/13/26/f3841e00663027ba7cf7ce7ba2cabb682a83cf0629bef013d70bebefa69d/Django-1.11.6.tar.gz
Save as: /private/var/mobile/Containers/Data/Application/20C8FA54-EEEE-FFFF-88888-3BACC5555555/tmp//Django-1.11.6.tar.gz (7874450 bytes)
   7874450  [100.00%]
Extracting archive file ...
Archive extracted.
Running setup file ...
Handling commandline script: django/bin/django-admin.py
Package installed: Django
Dependency available in Pythonista bundle : pytz
[~/Documents]$ 
[~/Documents]$ 
[~/Documents]$ which django
[~/Documents]$ pip list
Django (2.0b1) - A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
[~/Documents]$ 
© Peddals.com