Successfully reported this slideshow.
Your SlideShare is downloading. ×

2012.02.28 IAMAS GeekLab #037 MyScripts

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 87 Ad

More Related Content

Slideshows for you (17)

Similar to 2012.02.28 IAMAS GeekLab #037 MyScripts (20)

Advertisement

Recently uploaded (20)

2012.02.28 IAMAS GeekLab #037 MyScripts

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

×