2012.02.28 iamas geeklab #037 myscripts
DESCRIPTION
http://hitoriblog.com/TRANSCRIPT
GeekLab
• 本スライドはIAMAS(情報科学芸術大学院大学 / 岐阜県立国際情報科学芸術アカデミー)で赤松正行氏(http://akamatsu.org/)が主催しているGeekLab (http://geeklab.jp/)の第37回で使われたものです。
#037 02.28 MyScripts and Jailbreak Tweaks, hitoriblog
12年3月3日土曜日
ギーク気取りなiOS使いこなしMyScriptsから
Jailbreak Tweakまで
12年3月3日土曜日
moyashiについて
• 個人ブログ「ひとりぶろぐ」を運営• 2007年末ごろから、iOS系のニッチなネタをブログに投稿開始
• 手段と目的の主客が転倒しがち
12年3月3日土曜日
アジェンダ
1.今ホットなJavaScript開発環境MyScripts紹介
2.Jailbreak TweakでMyScripts環境を強化
12年3月3日土曜日
今ホットなJavaScript開発環境
MyScripts
• 電卓が苦手なのでiOS用式入力計算機やiOS上で使えるプログラミング言語を大調査(http://hitoriblog.com/?p=4955)
• プログラミング言語はたくさんあるが、現在ある中でMyScriptsが最も実用的
12年3月3日土曜日
MyScriptsとは?• App Storeで販売中のJavaScript開発環境
• 350円 (Unit Kay)
• ユニバーサルアプリ• 外部キーボード、横画面対応
12年3月3日土曜日
どんなことが可能?
•テキスト処理•ネットワークアクセス•アプリケーション間連携
12年3月3日土曜日
12年3月3日土曜日
MyScriptsはJavaScriptの
•作成•編集
•実行•管理 (※)
機能を持っている
※: 順序入れ替え/削除
12年3月3日土曜日
スクリプトの作成
•「+」ボタンでどんどん作成• URL Scheme経由で、外部からスクリプトのインストールが可能
•スクリプトは四つの属性を持つ
12年3月3日土曜日
12年3月3日土曜日
ひとりぶろぐ内にあるMyScripts用のスクリプト集。リンクをタップするだけでインストールが完了。スクリプトの共有が非常に簡単!
http://hitoriblog.com/myscripts.html12年3月3日土曜日
スクリプトの編集• 編集補助機能豊富
• 拡張キーボード
• 予約語等のサジェスト
• TextExpanderによる略称展開
• キーワード(スニペット)挿入
• ジェスチャーによるカーソル制御
• オートインデント
12年3月3日土曜日
12年3月3日土曜日
スクリプトの実行• 通常モード時の実行• 編集モード中のテスト実行• デバッグウィンドウ• JavaScriptコンソール
• クリップボード監視中の自動実行12年3月3日土曜日
12年3月3日土曜日
スクリプトの管理
• 順序入れ替え• よく使うものを上に、ライブラリのように直接触れないものを下に
• 削除
12年3月3日土曜日
JavaScriptエンジン
•見えないUIWebViewが存在
• stringByEvaluatingJavaScriptを利用
•基本的にはJavaScriptのほぼすべての機能が使える
12年3月3日土曜日
ユーザーインターフェース
• WebViewの姿こそ見えないがJavaScriptのものが使える
• alert(string)
• prompt(string, string)
• confirm(string)
12年3月3日土曜日
MyScriptsの基本
• 超単純なスクリプト• "Test" + "Script";
• 1 + 1;
• 実行するとどうなるか?
12年3月3日土曜日
12年3月3日土曜日
アクション機能• スクリプト終了時の実行行が返す文字列を四つのアクションに引き渡す
12年3月3日土曜日
アクション詳細
• 別のアプリで開く(Open In)
• クリップボードにコピー• openURL()を呼び出す
• 画面に表示
12年3月3日土曜日
openURL
12年3月3日土曜日
入出力が充実クリップボード Open In
(text)URL (myscripts://)
Open In(text / html)URL (twitter://等)クリップボード
MyScriptsで表示
(WebView等)
12年3月3日土曜日
MyScriptsの特殊性1
• 関数、変数を全部のスクリプトで共有• アプリが完全に終了するまで各種の状態が維持される
• クロスドメイン制約のかからないXMLHttpRequest
12年3月3日土曜日
MyScriptsの特殊性2
• WebViewにドキュメントをロードできない
• document.locationを実行するとopenURLが発動
12年3月3日土曜日
MyScriptsの特殊性3
• document.body.innerHTMLにhtml
をセットすることでDOMは利用可能
• Cookie、WebDatabaseといったローカルストレージが使用不能
12年3月3日土曜日
MyScriptsの特殊性4
• 拡張関数をいくつか実装• COPY(string)
• LOGOUT(string)
• SAVE_JSON(key, obj)
• LOAD_JSON(key)
• ASYNC_DONE(string)
12年3月3日土曜日
MyScriptsの特殊性5
• 特殊な変数• TARGET(openin/copy/openurl/info)
• TEXT
• IS_HTML
• IS_ASYNC
• SONG (title/albumTitle/artist)
12年3月3日土曜日
MyScriptsの特殊性6
• 特殊なマクロ• #IMPORT
• #LIB
• 非同期処理の待ち合わせ
12年3月3日土曜日
結果として
• WebViewに加える制約と引き換えにXMLHttpRequestを制約無く使用可能
• 独自の拡張でiOS上で利用可能なアプリ間連携の手段に全対応しているため、活用範囲は広い
12年3月3日土曜日
クリップボードの利用
var a = TEXT.split(“ ”); // [“早く”, “漲ってきた!”, “寝ろ”]
// スクリプト最終行がクリップボードへ“【” + a[0] + “】” + a[1] + “【” + a[2] + “】”
早く 漲ってきた! 寝ろ
【早く】漲ってきた!【寝ろ】
12年3月3日土曜日
COPY(“てすと”);
てすと
※スクリプトの終了時に実行される
12年3月3日土曜日
openURLの利用
var mes = TEXT.split(“”).reverse().join(“”); // mes = “いうあ”
var tw = “twitter://post?message=”;// スクリプト最終行がopenURLの引数にtw + encodeURICompornent(mes);
あいう
Twitter公式クライアントが起動「いうあ」12年3月3日土曜日
URLでテキスト受取り
var mes = “hage ” + TEXT + “ fuga”;// mes → “hage hoge fuga”
myscripts://run?title=hoge&text=hoge
TEXTの中身は「hoge」に
12年3月3日土曜日
起動用URLの作成
12年3月3日土曜日
myscripts://run?title=LaunchTwitter
myscripts://run?title=LaunchTwitter&text=<TEXT>
生成したURLがクリップボードにコピーされる
12年3月3日土曜日
Touch Icon Creatorの利用
特定のスクリプトを起動するアイコンが設置可能
12年3月3日土曜日
myscripts://add?title=LaunchTwitter&script=スクリプトの内容<a href=”myscripts://add?title=LaunchTwitter&script=スクリプトの内容”
target=”_blank”>LaunchTwitter (登録)</a>
登録用URLの作成
12年3月3日土曜日
Writronとの連携Writron(リトロン)URL Schemeでの連携が強力なテキストエディター。MyScriptsとの連携にもってこい。
12年3月3日土曜日
渡されたテキストを括弧で挟んでWritronに渡すスクリプト
MyScriptsにparenというスクリプトを作成
12年3月3日土曜日
12年3月3日土曜日
12年3月3日土曜日
12年3月3日土曜日
openURLによる連携で、MyScripts
がWritronの外部テキスト処理エンジンとして機能した。
12年3月3日土曜日
Open Inの利用
最終実行行からの返り値をOpen In
で他のアプリケーションに渡せる12年3月3日土曜日
デフォルトではテキストファイルとして、IS_HTML変数をtrueにするとhtmlファイルとして渡す
12年3月3日土曜日
外部JavaScriptの利用Hogeというスクリプトを作成保存
#IMPORT で読込12年3月3日土曜日
コピペで登録、#IMPORTで読み込みという手順で各種JavaScriptライブラリを利用可能
Scripts for MyScripts
http://hitoriblog.com/myscripts.html12年3月3日土曜日
大きなライブラリを利用する上での注意点: #LIBで学習を抑止
さもないと、モッサリする!
12年3月3日土曜日
ネットワークアクセス•取りうる手段•XMLHttpRequest
•GET / POST
• JSONP
•WebSocket12年3月3日土曜日
XMLHttpRequest利用
12年3月3日土曜日
12年3月3日土曜日
document.body.innerHTMLにXHRで取得したテキストをセットすると、DOMが利用可能。jQueryの$()も使える。
12年3月3日土曜日
サイトによってはXHRの同期モードではエラーが出る場合がある(google.com等。リダイレクト?)
その場合は、XHRを非同期モードで利用する。
12年3月3日土曜日
非同期モード非同期モード指定
非同期処理終了12年3月3日土曜日
Web API利用の実際• いまさらブログ | 復活の呪文2
• http://tama-sand.blogspot.com/2012/01/2.html
• テキストをドラクエの復活の呪文ライクな暗号に/暗号から復号するWebサービス
http://coffee-club.jp/tama/jumon/jumon.py
モード: mode (p2j / j2p) テキスト: text
12年3月3日土曜日
12年3月3日土曜日
「test」というテキストをクリップボードにコピーしてから実行
クリップボードの文字をWebサービスで暗号化できた
12年3月3日土曜日
スクレイピング• Webページ上の任意のテキストを機械的に抜き出してきて利用
• XHRで取得、DOMに展開、jQuery
で検索し、取得が黄金パターン
• iOS機単体で作り込むのは無謀なので、母艦で開発
12年3月3日土曜日
• 開発にGoogle Chromeを利用
• jquery-injectorでページにjQueryを強制的にロード
• JavaScriptコンソールを起動
12年3月3日土曜日
• 都内の環境放射線量調査最新データを取得したい
• http://monitoring.tokyo-eiken.go.jp/monitoring/hourly_data.html
12年3月3日土曜日
12年3月3日土曜日
$('tr:contains("~"):first').text().split("\n").join("")
• jQueryの$()を使って要素を検索
• 要素にid、classの指定無しなのでtable中「~」を含む行を検索
• 疑似クラス:contains()を使用
• 探した行のテキストを加工
" 2012/02/25 21:01~22:00 0.0546 0.0468 0.0504"• 実行結果:
12年3月3日土曜日
MyScriptsに実装jQueryをIMPORT
12年3月3日土曜日
Mailアプリケーションが起動し、最新の環境放射線量のデータと共に新規メールが作成される
jQueryを使用
12年3月3日土曜日
JSONPの利用• JSONPとは?
• クロスドメイン制約がかかって自由に使えないXMLHttpRequestに代わるデータ通信手段
• 外部サイトからのJavaScriptの読み込みには制約がかからないことに着目
12年3月3日土曜日
MyScriptsでのJSONP
• 起動直後はドキュメントが空であるので、document.header.innerHTML
に”<head></head>”をセットしておく
• JavaScript読み込みは非同期処理なので、「IS_ASYNC」、「ASYNC_DONE」を使い非同期処理のパターンとする
12年3月3日土曜日
ドル円相場の取得
• 「りょーちの駄文と書評」で提供しているJSONP APIを利用
• 為替レートをJSONPで(無理矢理)取得
• http://ryouchi.seesaa.net/article/64139382.html
12年3月3日土曜日
非同期モード
コールバック
空のheadを足す
12年3月3日土曜日
JSONPの読み込み開始
コールバック関数名
12年3月3日土曜日
• JSONPの読み込みが終わるとコールバック関数が実行される。
• コールバック関数の引数は、APIから取得したJSON。ここから円相場を取得して、Twitter for iPhoneに投げるメッセージ「1ドルxx.x円なう」を作成し、Twitter
for iPhoneにメッセージを送るURLを組み立てる。スクリプトのアクションにはopenURLを選択したので、スクリプトの終了と共にTwitter for iPhoneが起動。
12年3月3日土曜日
HTMLビューの利用
• 渡されたテキストをコピーするだけのスクリプトを作成
• 起動URLを取得
• myscripts:run?title=Copy&text=引数
12年3月3日土曜日
起動URLをhtml埋込み
引数を合体12年3月3日土曜日
クリックCopy呼出し
引数のテキストがコピーされた
HTML Viewを一種のUIとして使える
※MyScriptsからMyScriptsを呼び出せることに気づこう12年3月3日土曜日
バックグラウンド動作
• スクリプトリスト右のチェックボックスをオンにすると、MyScriptsをバックグラウンドに回した後に10分間限定で(OS
の制約)クリップボード監視が始まる。
BG実行指定
※一つだけ選択可能
12年3月3日土曜日
BG動作中、クリップボードにテキストがコピーされると指定されたスクリプトが実行される。クリップボードのテキストがTEXTに渡る
12年3月3日土曜日
• クリップボードにコピーされたテキストが正規表現にマッチしたら、pushToArray()関数が実行される。また、通知センターの通知が表示される。
• マッチしなければ、TARGET変数にnullがセットされ、通知の表示が抑制される。
通知センターから、スクリプトを起動可能
12年3月3日土曜日
pushToArray関数では、配列にマッチした文字列を集めつつ、LOAD_JSON、SAVE_JSON関数で配列を永続的に保存している。これで10
分のタイムリミットが過ぎMyScriptsが終了しても、次回配列を復元可能。
12年3月3日土曜日
Jailbreak TweakでMyScripts環境を強化
• Jailbreakをすると、OSなどの動作を改変可能
• MyScripts自体も改造可能だが、今回はスライドが80枚を超えて精も根も尽きたのでまた今度の機会に
12年3月3日土曜日
10分の制約を外す• BGプロセスを抱いたままBGで10分経過すると、アプリケーションはOSから殺されてしまう
• クリップボード監視を永続化できるならば、また違った使い方も見えてくる
• 10分の制約を外そう!
12年3月3日土曜日
DontKillBG• バックグラウンド動作の10分の制約を外すJailbrokenな環境で動作するTweak
• iPhoneを、Xcodeを起動させたMacに接続。MyScriptsをOSが殺した瞬間XcodeのConsoleに流れてきたメッセージから制約を課している部分を特定
• 時間制限が課されているかどうかの判定メソッドを破壊し常にNOを返すように
12年3月3日土曜日
/* * DontKillBGLibrary.mm * 2012.01.29 */
#import <substrate.h>#import <Foundation/Foundation.h>#import <CoreFoundation/CoreFoundation.h>#import <UIKit/UIKit.h>#import "DontKillBGPrefs.h"
extern "C" void DontKillBGInitialize();
@class SBProcessAssertion;
static IMP original_SBProcessAssertion_timeLimited;BOOL replaced_SBProcessAssertion_timeLimited(SBProcessAssertion *self, SEL _cmd) { if ([[DontKillBGPrefs sharedInstance] enabled]) { return NO; } else { original_SBProcessAssertion_timeLimited(self, _cmd); }}
extern "C" void DontKillBGInitialize() { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; MSHookMessageEx(objc_getClass("SBProcessAssertion"), @selector(isTimeLimited), (IMP)&replaced_SBProcessAssertion_timeLimited, (IMP *)&original_SBProcessAssertion_timeLimited); [pool release];}
12年3月3日土曜日
•以下からインストール可能• [JB]iOS 5のバックグラウンド動作10分の時間制限を取り払うDontKillBG
• http://hitoriblog.com/?p=6290
12年3月3日土曜日
まとめ• MyScriptsは、iOS上の様々な問題を解決するポテンシャルを秘めている
• スクリプトの配布、インストールは、ブックマークレットよりとても簡単!使うだけの人にとっても便利
• ニッチなニーズを埋めるスクリプトをバンバン作って共有しよう!
12年3月3日土曜日
ひとりぶろぐhitoriblog.com
ご清聴ありがとうございました
http://twitter.com/hitoriblog
moyashi
12年3月3日土曜日