「Pythonista」iOS上で動作するPython統合開発環境がv2.0にアップデート!その物凄い内容とは
iOS上で動作するPython統合開発環境「Pythonista」
iOS用のアプリはMacを使って開発します。
しかし、プログラム好きな人ならiOSデバイス上でプログラミングをしたいと思うのではないでしょうか。
あるいは、開発アカウントを取得するほどではないが、iOSデバイス上で何か実現したいことがある、という人もいるでしょう。
そうした希望に存分にこたえることができる、iOSデバイス上で動作する統合開発環境が「Pythonista」です。
Pythonista
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 225.2 MB)
全てのバージョンの評価: (35 件の評価)
以前、紹介記事を書きました。
「Pythonista」を使えば、電車の中で片手プログラミングもできてしまいます。
「Pythonista」の開発言語はPython 2.7.5。インタプリタとしてのPython、それを取り囲むライブラリ、プログラムを編集するエディタ、そして、PythonスクリプトiOS上でさまざまな形で機能させるための各種機能を内包した統合環境……。エディタにもAPIがあり、スクリプタブルな作りになっているというと琴線に触れる人がいるでしょうか? pipのようなユーティリティで外部モジュールを簡単に取り込むことができるというとびっくりするでしょうか?
何と、UIエディターまで内蔵していて、UIを持ったスクリプトを作ることができます。
「Pythonista」の完成度、実用度は完璧と断言できます。
アプリとしての登場、あるいはアプリのアップデートに期待できない、非常にニッチな個人的ニーズを満たす手段として、最高の可能性を持っています。以下に紹介するエントリでも、問題解決のために使いました。
公式のフォーラムが非常に活発で、いろいろな知見が共有されています。
フォーラムの有志が、成果物を共有しています。
v2.0へのアップデートで大幅な進化
その「Pythonista」がv2.0にアップデート。前のバージョンがv1.6ですので、0.4飛んでいきなりv2.0になりました。App Storeには並びませんでしたが、v1.6 betaというものがあって、そちらで既に実装されていた機能がv2.0に継承されています。
iPad Pro、iPhone 6、iPhone 6 Plusの解像度に対応するなど順当な進化をはじめ、説明しても読んでもらえないほどさまざまな新機能、改善点を引っさげての登場となりましたが、最も重要な進化が、iOS標準の共有シートからのスクリプト実行が可能になったことです。
また、同じくiOS標準機能である「Open In…」からのスクリプト実行も(再度)可能になりました。
つまり、TwitterクライアントやWebブラウザからURLを受け取って、テキストエディタからテキストを受け取って、GoodReaderのようなファイラーから任意のファイルを受け取って、カメラアプリから画像を受け取って、Pythonスクリプトで処理が可能になったということです。
プログラミングで重要なのは、処理対象です。その点、「Pythonista」は、カメラロール、クリップボード、URL Scheme経由のクエリのやりとり、Open In…、共有シートとアプリケーション連携に必要なiOSの機能に幅広く対応しており、用途は無限大です。
Open In…、共有シートを使う例
Open In…、共有シートからのデータの取得をするものは「Extension」というカテゴリのスクリプトとなりますが、サンプルが付属しています。動作とスクリプトを見てみます。
純正Twitterの共有シートから「Run Pythonista Script」を選んでみます。
「Copy Photo Location」、「Image Histogram」などアイコンが並んでいますが、これがPythonista上に登録された「Extension」カテゴリのPythonスクリプトです。その上の段のScratchpadは簡易テキストエディタで、この場でスクリプトを書いて実行できます。その隣のConsoleは対話式に1行1行ワンライナーを実行できます。iOSの方々にPythonistaが出張していって、iOS全体が開発環境になったかのようです。
純正TwitterクライアントからツイートへのURLが渡されていますので、ここでは、「URL to QR Code」をタップしてみます。
PythonスクリプトでQRコードが生成されて、それが表示されました。
スクリプトの中身を見てみましょう。
qrcodeモジュールとappexモジュールをimport。
appex.get_url() メソッドでURLを取得し、 qrcode.make(url) メソッドで取得したURLからQRコードの画像を生成。それを img.show() でConsoleに表示しています。
# coding: utf-8 import qrcode import appex def main(): if not appex.is_running_extension(): print 'This script is intended to be run from the sharing extension.' return url = appex.get_url() if not url: print 'No input URL found.' return print url img = qrcode.make(url) img.show() if __name__ == '__main__': main()
これだけのコード量で、立派に機能するExtensionが作れています。
appexモジュールのドキュメントを見ると、さまざまなメソッドが用意されていることが分かります。
Open In…で受け取ったファイルは、 appex.get_attachments() や appex.get_file_path() で受け取れます。SafariやGoodReader、Dropboxなどとの連携なら、任意のファイルを処理できて、用途が広がります。
以下は、Open In…で受け取ったファイルをPythonistaの管轄ディレクトリに保存するものです。
# coding: utf-8 import appex, os, console def save(): if appex.is_running_extension(): sFp = appex.get_file_path() if sFp: console.hud_alert('Saving...') with open(sFp, 'rb') as f1: with open(os.path.basename(sFp), 'wb') as f2: f2.write(f1.read()) console.hud_alert('Saved') if __name__ == '__main__': save()
出典: [Share Code] Extension to save attachment
CoreBluetoothモジュール、Twitterモジュール、Objective-Cとのブリッジ機能など注目の新機能
CoreBluetoothにアクセスできるcbモジュールがバンドルされるようになりました。Bluetooth LE機器をPythonistaからコントロールできます。
Twitterモジュールも追加されています。これは、iOSに設定されたアカウントにアクセスできるネイティブな機能です。
コンシューマーキー、シークレットなどの準備が必要なく、お手軽に使えます。
dialogsは、UIエディターを使わずに、プログラマブルにUIを構築できるモジュールです。自由度はconsoleモジュール以上、uiモジュール以下の中庸なポジション。
そのほかの新機能として注目すべきは、Objective-Cとのブリッジ機能です。
Objective-C側で定義されている任意のクラスをPython側に手繰り寄せて使用したり、新たにオブジェクトを定義できたりします。非常に強力な機能です。
これもサンプルが用意されていますので見てみましょう。
電源の状態やバッテリ残量の取得
ObjCClass(‘UIDevice’) でUIDeviceクラスをPython側に招聘し、それを使ってバッテリ残量を取得しています。
# coding: utf-8 '''Simple demo of using UIDevice to query the current battery state''' from objc_util import * UIDevice = ObjCClass('UIDevice') device = UIDevice.currentDevice() battery_states = {1: 'unplugged', 2: 'charging', 3: 'full'} device.setBatteryMonitoringEnabled_(True) battery_percent = device.batteryLevel() * 100 state = device.batteryState() state_str = battery_states.get(state, 'unknown') print 'Battery level: %0.1f%% (%s)' % (battery_percent, state_str) device.setBatteryMonitoringEnabled_(False)
Pythonista自身のハック
Objective-Cとのブリッジ機能を使うと、Pythonista自身のインスタンスを取得してハックできます。
# coding: utf-8 from objc_util import * UIApplication = ObjCClass('UIApplication') # Pythonista自身のインスタンスを取得 app = UIApplication.sharedApplication() # Pythonistaのウインドウを取得 win = app.windows()[0] # ビュー構造を再帰的に取得 win.recursiveDescription() # ウインドウの透明度を設定 win.alpha = 0.5 # Pythonistaにしかないクラスの取得 PythonistaWindow = ObjCClass('PythonistaWindow') # インスタンス生成 pywin = PythonistaWindow.alloc()
「site-packages/pythonista_startup.py」が起動時に初期化スクリプトとして自動的に実行されるので、ここに何らかのPythonistaに対する変更を書いておくと、それを恒久的なものにできます。
バックグラウンド動作の永続化
本来は10分で終了してしまうバックグラウンド動作の永続化も実現できています。ちょっと前にFacebookアプリが批判された手法ですね。
クリップボードの変更通知が受け取れるので、iOS 8.x ならこれで永続的なクリップボード監視ユーティリティが作れるかもしれません?
Pythonista 2.0で削除されたDropbox同期機能
Pythonista 2.0は両手を挙げて歓迎できる内容になっていますが、ただ一つ前バージョンから退化した点があります。
それが、Dropbox同期機能の削除です。
前バージョンはファイルをDropboxと同期でき、母艦側で書いたスクリプトをiOS側に送り込んだり、iOSデバイス上で書いたスクリプトを自動的にバックアップしたりと非常に便利だったのですが、その機能がきれいさっぱり無くなっています。
これは、Appleの指示により削除せざるを得なかった模様です。
かなり痛い変更点ですが、致し方ありません。
しかし、dropboxモジュールが標準でバンドルされているので、手当は可能なようです。
強力すぎて言葉もない
iOSデバイス上でのプログラミングを支援する出来のいいエディタ、さまざまな実行方法を選べる自由度、プログラミングの柔軟性、そして活発なコミュニティと、楽しい要素が揃い踏みのPythonista。
v2.0へのアップデートで強力なモジュールがたくさん追加され、さらに凄みが出てきました。
このパワーを取り入れてみませんか?
Pythonista
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 225.2 MB)
全てのバージョンの評価: (35 件の評価)
Pythonistaの可能性をそのままに、エディタとして仕上げられたEditorialもかなり素晴らしいアプリです。
Editorial
カテゴリ: Productivity
販売元: Ole Zorn(サイズ: 54.7 MB)
全てのバージョンの評価: (12 件の評価)
リファレンスブラウザのDashも便利。
Dash API Docs
カテゴリ: Productivity
販売元: Bogdan Popescu(サイズ: 4.2 MB)
全てのバージョンの評価: (0 件の評価)
Pythonistaユーザが作ったPythonistaのDocsetsがあります。