ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

Pythonista 3にシェル、Dropbox同期・ダウンロード機能などAppleが許さない機能を追加する

      2019/12/01

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00016

iOS最強の統合開発環境Pythonista 3。

開発言語はPython 3.5 / 2.7。iOSとの親和性が高く、単にPythonが書けるというだけでなく、iOSの開発環境として機能します。

2008年から始まったApp Store史上、僕が最高に興奮を覚えたアプリです。日本ではそれほど人気がない一方で、海外での絶賛っぷりが対照的です。

Pythonista 3App
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 244.4 MB)
全てのバージョンの評価: (0 件の評価)

こんなエントリを見にくる人がPythonista 3を知った時に覚える感慨に「よくAppleが許したな」、「よくAppleが審査通したな」というものがあるでしょう。

App Storeサービスイン当初にAppleが規約に盛り込んだインタプリタ禁止条項は、このようなアプリが世に出ることを許さなかったからです。

2008年のことですが、鮮烈に覚えている人が多いようで、このような文脈で語る人が後を絶ちません。

インタプリタ禁止条項は、その2年後の2010年9月に解除になっています。したがって、それ以降からiOS上のセルフ開発環境はたくさんリリースされています。

ただし、「いかなる方法でもコードのダウンロードを禁止する」という条項が残っており、それが今に至るもインタプリタを搭載したアプリの可能性を縛っています。

コミュニティと結び付くことで多くのユーザーを抱えるようになった教育用プログラミング言語Scratchが、iOS上で本来の姿を取れないのは、この条項のせい。

Scratch Kids LiteApp
カテゴリ: Education
販売元: David Phillips(サイズ: 93.8 MB)
全てのバージョンの評価: (0 件の評価)

Pythonista 3もその規約の制約下にあり、Pythonista 1.x時代はあったスクリプトのDropbox同期機能がPythonista 2へのメジャーアップデート時に削除されました。

実際、このDropbox同期機能は便利でした。PythonistaからDropbox同期機能がなくなったとき、大きな喪失感を覚えました。

喪失感っていうとなんだか悠長ですね。実際困りました。

Pythonという一般的な言語がそのままの形でiOS上で動作するということは、他環境で作った、使っていたスクリプトを、そのままiOS上に持っていけるということ。

Dropbox同期機能があれば、どれほど便利かは容易に想像が付くでしょう。

ユーザーサイドで失われた機能を補完する

Pythonistaはまがりなりにも開発環境です。

しかも、標準添付のモジュールにdropboxもある。

これはすなわち、Pythonista 2から失われたDropbox同期機能を、ユーザーサイドで後付けできるということを意味します。

そのような必要性と環境の助けで作られたDropboxSync.pyというPythonista用のスクリプトが存在します。これは、DocumentsフォルダのDropboxとの同期を可能にします。

Dropbox上の任意のファイルをPythonistaのDocumentsフォルダにダウンロードしてくるDropbox File Picker.pyというスクリプトも存在します。これは、Pythonista 3の開発者Ole Zorn氏が作られたもの。

これを導入すると、Pythonista 3の作業環境としての快適性は大幅に向上します。

そして、Pythonistaにない、シェルを追加する大技ありのスクリプトStaShというものが存在します。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00017

PythonistaにはPythonインタプリタと対話できるインタラクティブコンソールがありますが、それとは別にシェルを追加するのです。

これまたとんでもないもので、Pythonista 3のObjective-Cとのブリッジ機能を活用し、Pythonista 3自身を拡張する形で動作します。

Pythonista 3は別に仕様をオープンしているわけでもAPIを公開しているわけでもありません。Pythonista 3をリバースエンジニアリングして作られています。

Pythonista 3には、Pythonista 3の合法ドラッグのような危険な魅力を嗅ぎ付けてきた、このような黒魔術を使うユーザーが集っていてなかなか楽しいのです。

StaShは、Pythonista 3のタブ内でターミナルエミュレータとして動作する部分と、その中で動作するコマンドから成る、一つのCUI作業環境です。Windows 10における「Windows Subsystem for Linux」のようなものというと言い過ぎかもしれませんが、StaShをPythonistaにインストールすると、pip、git、ls、rm、cd、pwd、wget、curl、telnet、ssh、scpなどなど、普段我々がPC/Mac上で使っているおなじみのコマンドがPythonista 3上で使えるようになります。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00013

manもあります。「man pip」とすれば、簡単なマニュアルが表示されます。

マニアックなところでは、macOSユーザーにはおなじみのpbcopy、pbpasteなども移植されています。

前置きが大分長くなりましたが、Pythonista 3の作業環境を大幅に改善するDropbox File Picker.py、DropboxSync.py、StaShをPythonistaにインストールする方法を紹介します。

これで、Pythonista 3の真の姿が覚醒します!

StaShのインストール

まずは、DropboxSync.pyなどをインストールするときにも便利に使えるStaShからインストールします。

インストール方法は非常に簡単。Pythonista 3のインタラクティブコンソールに次の1行をコピペしてenter。

import requests as r; exec(r.get('http://bit.ly/get-stash').text)

これでStaShのzipがダウンロードされ、展開されます。macOSのHomebrewを連想した人も多いのではないでしょうか。

Pythonista 3の再起動が促されるので、iOSデバイスのHomeボタン2度押しからPythonist 3を上スワイプでいったん終了させ、再度起動します。

しかる後に、launch_stash.pyをファイルリストからタップして開きます。

コードエディタ画面右上のレンチアイコンをタップし、区切り線の右端にある「Edit」をタップして「+」アイコンをタップ。「Custom Title」を「StaSh」にして「Done」ボタンをタップ。

これで、コードエディタを使用している最中にレンチアイコンからStaShがすぐに起動できるようになりました。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00010

レンチアイコンをタップし、登録した「Stash」アイコンをタップしてStaShを起動。

Stashを起動したらdev版にアップデートします。安定版は2016年以降更新がありませんが、dev版はマメに更新されています。

selfupdate dev

「help」で使用可能なコマンド一覧が表示されます。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00012

複数起動可能で、起動するごとにStaShのタブが増えていきます。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00011

レンチメニューの「Home Screen」から、Home画面に登録することもできます。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00009

Dropbox File Picker.pyのインストール

今度はDropbox File Picker.pyをインストールします。

多少直すところがあったので僕のgistに登録したものを使います。

必要なファイルのダウンロード

以下のテキストエリア内のテキストを全選択してコピー。

Pythonista 3内でStaShを起動し、ペースト。これで、wget.pyによるダウンロードが完了するはずです。

トークンの取得

Dropbox File Picker.pyで必要なトークンを取得します。

以下のページにDropboxにログインした状態でアクセス。

「Create app」ボタンをクリック。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00005

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00004

  1. 「Dropbox API」を選択
  2. 「Full Dropbox」を選択
  3. 「db_file_picker_xxxxx」などと命名。末尾の「xxxx」は自分固有のものにします。なお名前に「dropbox」を含むことはできません

「Generate access token」のところの「Generate」ボタンを押し、トークンを生成。

生成されたトークンをコピーしてPythonistaに持っていきます。僕はEvernote経由で持っていきました。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00003

Dropbox File Picker.pyにトークンの転記

取得したトークンをDropbox File Picker.pyに転記します。

ダウンロードしたDropbox File Picker.pyをファイルリストからタップしてコードエディタで開き、スクリプト冒頭の以下の部分の「YOUR_TOKEN_HERE」を、取得したトークンに書き換え。

TOKEN = 'YOUR_TOKEN_HERE'

続いて、画面右上のレンチメニューをタップして、StaShでやったようにアイコン登録します。僕は「DBPicker」という名前で登録しました。

登録が終わったら、レンチメニューに登録したアイコンから実行してみます。

Dropbox上のファイルリストが表示されたらOKです。Dropbox File Picker.pyはまた、TableViewの使い方のいいサンプルになっています。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00015

ファイルをタップするとダウンロードが始まり、Documentsディレクトリのルートにダウンロードされます。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00014

Pythonistaで動かすPythonスクリプトのみならず、Pythonistaに処理させたいファイルをダウンロードできるところに、大いなる可能性が感じられます。

DropboxSync.pyのインストール

続いて、DocumentsディレクトリをDropboxと同期できるDropboxSync.pyのインストールです。

Dropbox File Picker.pyの解説冒頭でやったwgetで既にファイルはダウンロードしているので、ファイルリストからDropboxSyncv2.pyを選んでコードエディタで開きます。

本家はDropbox側のAPIの変更などで動かなくなっているので、Forkされたもの(DropboxSync.py → DropboxSyncv2.py)を使います。それだけでは動かない部分があったので、僕の方で修正を加えています。

DropboxSyncv2.pyは、dropboxloginv2.pyという別のスクリプトに依存しており、それも同時にダウンロードしています。

App keyとApp secretの取得

DropboxSyncv2.pyで必要なApp keyとApp secretを取得します。

以下のページにDropboxにログインした状態でアクセス。

「Create app」ボタンをクリック。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00005

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00002

  1. 「Dropbox API」を選択
  2. 「App Folder」を選択
  3. 「db_sync_xxxxx」などと命名。末尾の「xxxx」は自分固有のものにします。なお名前に「dropbox」を含むことはできません

「App key」と「App secret」をコピーしてPythonistaに持っていきます。僕はEvernote経由で持っていきました。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00001

DropboxSyncv2.pyにApp keyとApp secretを転記

取得した「App key」と「App secret」をDropboxSyncv2.pyが依存するdropboxloginv2.pyの方に転記します。

もう一度書きます。DropboxSyncv2.pyじゃなくて、dropboxloginv2.pyの方に「App key」と「App secret」を転記します。

dropboxloginv2.pyをファイルリストからタップしてコードエディタで開き、スクリプト冒頭の以下の部分の「YOUR_APP_KEY」と「YOUR_APP_SECRET」を、取得したものに書き換え。

app_key = 'YOUR_APP_KEY'
app_secret = 'YOUR_APP_SECRET'

続いて、DropboxSyncv2.pyの方をコードエディタで開き、画面右上のレンチメニューをタップして、StaShでやったようにアイコン登録します。僕は「同期」という名前で登録しました。

登録が終わったら、レンチメニューに登録したアイコンから実行してみます。

アクセストークンの取得

すると、Dropboxへのログインが促され、ログインを終えるとアクセス許可が促されます。「許可」をタップ。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00008

するとアクセストークンが発行されるので、これをコピー。アクセストークンを選択するのに結構難儀すると思います……。Dropbox File Picker.pyと同様に、Dropboxのサイト内でアクセストークンを生成して、それを使う形にしたら楽ですよね……。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00007

Webビューを左上の「×」で閉じて、インタラクティブコンソールに取得したアクセストークンをペーストし、enterキーを押します。

これで、同期が始まるはずです。

Install stash shell dropbox sync dropbox file picker to the pythonista 3 00006

これが最低限のお膳立て

StaSh、Dropbox File Picker.py、DropboxSync.pyを導入したPythonista 3は、水を得た魚のように活躍を始めるでしょう。

これがないPythonista 3など考えられないほどです。

ぜひ、お役立てください。

Pythonista 3App
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 244.4 MB)
全てのバージョンの評価: (0 件の評価)

 - iOS