2012.02.28 iamas geeklab #037 myscripts

87
GeekLab 本スライドはIAMAS(情報科学芸術大学院 大学 / 岐阜県立国際情報科学芸術アカデ ミー)で赤松正行氏(http://akamatsu.org/ )主催しているGeekLab (http://geeklab.jp/ )37回で使われたものです。 #037 02.28 MyScripts and Jailbreak Tweaks, hitoriblog 1233日土曜日

Upload: -

Post on 17-Jan-2015

3.674 views

Category:

Technology


2 download

DESCRIPTION

http://hitoriblog.com/

TRANSCRIPT

Page 1: 2012.02.28 IAMAS GeekLab #037 MyScripts

GeekLab

• 本スライドはIAMAS(情報科学芸術大学院大学 / 岐阜県立国際情報科学芸術アカデミー)で赤松正行氏(http://akamatsu.org/)が主催しているGeekLab (http://geeklab.jp/)の第37回で使われたものです。

#037 02.28 MyScripts and Jailbreak Tweaks, hitoriblog

12年3月3日土曜日

Page 2: 2012.02.28 IAMAS GeekLab #037 MyScripts

ギーク気取りなiOS使いこなしMyScriptsから

Jailbreak Tweakまで

12年3月3日土曜日

Page 3: 2012.02.28 IAMAS GeekLab #037 MyScripts

  moyashiについて

• 個人ブログ「ひとりぶろぐ」を運営• 2007年末ごろから、iOS系のニッチなネタをブログに投稿開始

• 手段と目的の主客が転倒しがち

12年3月3日土曜日

Page 4: 2012.02.28 IAMAS GeekLab #037 MyScripts

アジェンダ

1.今ホットなJavaScript開発環境MyScripts紹介

2.Jailbreak TweakでMyScripts環境を強化

12年3月3日土曜日

Page 5: 2012.02.28 IAMAS GeekLab #037 MyScripts

今ホットなJavaScript開発環境

MyScripts

• 電卓が苦手なのでiOS用式入力計算機やiOS上で使えるプログラミング言語を大調査(http://hitoriblog.com/?p=4955)

• プログラミング言語はたくさんあるが、現在ある中でMyScriptsが最も実用的

12年3月3日土曜日

Page 6: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsとは?• App Storeで販売中のJavaScript開発環境

• 350円 (Unit Kay)

• ユニバーサルアプリ• 外部キーボード、横画面対応

12年3月3日土曜日

Page 7: 2012.02.28 IAMAS GeekLab #037 MyScripts

どんなことが可能?

•テキスト処理•ネットワークアクセス•アプリケーション間連携

12年3月3日土曜日

Page 8: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 9: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsはJavaScriptの

•作成•編集

•実行•管理 (※)

機能を持っている

※: 順序入れ替え/削除

12年3月3日土曜日

Page 10: 2012.02.28 IAMAS GeekLab #037 MyScripts

スクリプトの作成

•「+」ボタンでどんどん作成• URL Scheme経由で、外部からスクリプトのインストールが可能

•スクリプトは四つの属性を持つ

12年3月3日土曜日

Page 11: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 12: 2012.02.28 IAMAS GeekLab #037 MyScripts

ひとりぶろぐ内にあるMyScripts用のスクリプト集。リンクをタップするだけでインストールが完了。スクリプトの共有が非常に簡単!

http://hitoriblog.com/myscripts.html12年3月3日土曜日

Page 13: 2012.02.28 IAMAS GeekLab #037 MyScripts

スクリプトの編集• 編集補助機能豊富

• 拡張キーボード

• 予約語等のサジェスト

• TextExpanderによる略称展開

• キーワード(スニペット)挿入

• ジェスチャーによるカーソル制御

• オートインデント

12年3月3日土曜日

Page 14: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 15: 2012.02.28 IAMAS GeekLab #037 MyScripts

スクリプトの実行• 通常モード時の実行• 編集モード中のテスト実行• デバッグウィンドウ• JavaScriptコンソール

• クリップボード監視中の自動実行12年3月3日土曜日

Page 16: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 17: 2012.02.28 IAMAS GeekLab #037 MyScripts

スクリプトの管理

• 順序入れ替え• よく使うものを上に、ライブラリのように直接触れないものを下に

• 削除

12年3月3日土曜日

Page 18: 2012.02.28 IAMAS GeekLab #037 MyScripts

JavaScriptエンジン

•見えないUIWebViewが存在

• stringByEvaluatingJavaScriptを利用

•基本的にはJavaScriptのほぼすべての機能が使える

12年3月3日土曜日

Page 19: 2012.02.28 IAMAS GeekLab #037 MyScripts

ユーザーインターフェース

• WebViewの姿こそ見えないがJavaScriptのものが使える

• alert(string)

• prompt(string, string)

• confirm(string)

12年3月3日土曜日

Page 20: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsの基本

• 超単純なスクリプト• "Test" + "Script";

• 1 + 1;

• 実行するとどうなるか?

12年3月3日土曜日

Page 21: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 22: 2012.02.28 IAMAS GeekLab #037 MyScripts

アクション機能• スクリプト終了時の実行行が返す文字列を四つのアクションに引き渡す

12年3月3日土曜日

Page 23: 2012.02.28 IAMAS GeekLab #037 MyScripts

アクション詳細

•    別のアプリで開く(Open In)

•    クリップボードにコピー•    openURL()を呼び出す

•    画面に表示

12年3月3日土曜日

Page 24: 2012.02.28 IAMAS GeekLab #037 MyScripts

openURL

12年3月3日土曜日

Page 25: 2012.02.28 IAMAS GeekLab #037 MyScripts

入出力が充実クリップボード Open In

(text)URL (myscripts://)

Open In(text / html)URL (twitter://等)クリップボード

MyScriptsで表示

(WebView等)

12年3月3日土曜日

Page 26: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsの特殊性1

• 関数、変数を全部のスクリプトで共有• アプリが完全に終了するまで各種の状態が維持される

• クロスドメイン制約のかからないXMLHttpRequest

12年3月3日土曜日

Page 27: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsの特殊性2

• WebViewにドキュメントをロードできない

• document.locationを実行するとopenURLが発動

12年3月3日土曜日

Page 28: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsの特殊性3

• document.body.innerHTMLにhtml

をセットすることでDOMは利用可能

• Cookie、WebDatabaseといったローカルストレージが使用不能

12年3月3日土曜日

Page 29: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsの特殊性4

• 拡張関数をいくつか実装• COPY(string)

• LOGOUT(string)

• SAVE_JSON(key, obj)

• LOAD_JSON(key)

• ASYNC_DONE(string)

12年3月3日土曜日

Page 30: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsの特殊性5

• 特殊な変数• TARGET(openin/copy/openurl/info)

• TEXT

• IS_HTML

• IS_ASYNC

• SONG (title/albumTitle/artist)

12年3月3日土曜日

Page 31: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsの特殊性6

• 特殊なマクロ• #IMPORT

• #LIB

• 非同期処理の待ち合わせ

12年3月3日土曜日

Page 32: 2012.02.28 IAMAS GeekLab #037 MyScripts

結果として

• WebViewに加える制約と引き換えにXMLHttpRequestを制約無く使用可能

• 独自の拡張でiOS上で利用可能なアプリ間連携の手段に全対応しているため、活用範囲は広い

12年3月3日土曜日

Page 33: 2012.02.28 IAMAS GeekLab #037 MyScripts

クリップボードの利用

var a = TEXT.split(“ ”); // [“早く”, “漲ってきた!”, “寝ろ”]

// スクリプト最終行がクリップボードへ“【” + a[0] + “】” + a[1] + “【” + a[2] + “】”

早く 漲ってきた! 寝ろ

【早く】漲ってきた!【寝ろ】

12年3月3日土曜日

Page 34: 2012.02.28 IAMAS GeekLab #037 MyScripts

COPY(“てすと”);

てすと

※スクリプトの終了時に実行される

12年3月3日土曜日

Page 35: 2012.02.28 IAMAS GeekLab #037 MyScripts

openURLの利用

var mes = TEXT.split(“”).reverse().join(“”); // mes = “いうあ”

var tw = “twitter://post?message=”;// スクリプト最終行がopenURLの引数にtw + encodeURICompornent(mes);

あいう

Twitter公式クライアントが起動「いうあ」12年3月3日土曜日

Page 36: 2012.02.28 IAMAS GeekLab #037 MyScripts

URLでテキスト受取り

var mes = “hage ” + TEXT + “ fuga”;// mes → “hage hoge fuga”

myscripts://run?title=hoge&text=hoge

TEXTの中身は「hoge」に

12年3月3日土曜日

Page 37: 2012.02.28 IAMAS GeekLab #037 MyScripts

起動用URLの作成

12年3月3日土曜日

Page 38: 2012.02.28 IAMAS GeekLab #037 MyScripts

myscripts://run?title=LaunchTwitter

myscripts://run?title=LaunchTwitter&text=<TEXT>

生成したURLがクリップボードにコピーされる

12年3月3日土曜日

Page 39: 2012.02.28 IAMAS GeekLab #037 MyScripts

Touch Icon Creatorの利用

特定のスクリプトを起動するアイコンが設置可能

12年3月3日土曜日

Page 40: 2012.02.28 IAMAS GeekLab #037 MyScripts

myscripts://add?title=LaunchTwitter&script=スクリプトの内容<a href=”myscripts://add?title=LaunchTwitter&script=スクリプトの内容”

target=”_blank”>LaunchTwitter (登録)</a>

登録用URLの作成

12年3月3日土曜日

Page 41: 2012.02.28 IAMAS GeekLab #037 MyScripts

Writronとの連携Writron(リトロン)URL Schemeでの連携が強力なテキストエディター。MyScriptsとの連携にもってこい。

12年3月3日土曜日

Page 42: 2012.02.28 IAMAS GeekLab #037 MyScripts

渡されたテキストを括弧で挟んでWritronに渡すスクリプト

MyScriptsにparenというスクリプトを作成

12年3月3日土曜日

Page 43: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 44: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 45: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 46: 2012.02.28 IAMAS GeekLab #037 MyScripts

openURLによる連携で、MyScripts

がWritronの外部テキスト処理エンジンとして機能した。

12年3月3日土曜日

Page 47: 2012.02.28 IAMAS GeekLab #037 MyScripts

Open Inの利用

最終実行行からの返り値をOpen In

で他のアプリケーションに渡せる12年3月3日土曜日

Page 48: 2012.02.28 IAMAS GeekLab #037 MyScripts

デフォルトではテキストファイルとして、IS_HTML変数をtrueにするとhtmlファイルとして渡す

12年3月3日土曜日

Page 49: 2012.02.28 IAMAS GeekLab #037 MyScripts

外部JavaScriptの利用Hogeというスクリプトを作成保存

#IMPORT で読込12年3月3日土曜日

Page 50: 2012.02.28 IAMAS GeekLab #037 MyScripts

コピペで登録、#IMPORTで読み込みという手順で各種JavaScriptライブラリを利用可能

Scripts for MyScripts

http://hitoriblog.com/myscripts.html12年3月3日土曜日

Page 51: 2012.02.28 IAMAS GeekLab #037 MyScripts

大きなライブラリを利用する上での注意点: #LIBで学習を抑止

さもないと、モッサリする!

12年3月3日土曜日

Page 52: 2012.02.28 IAMAS GeekLab #037 MyScripts

ネットワークアクセス•取りうる手段•XMLHttpRequest

•GET / POST

• JSONP

•WebSocket12年3月3日土曜日

Page 53: 2012.02.28 IAMAS GeekLab #037 MyScripts

XMLHttpRequest利用

12年3月3日土曜日

Page 54: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 55: 2012.02.28 IAMAS GeekLab #037 MyScripts

document.body.innerHTMLにXHRで取得したテキストをセットすると、DOMが利用可能。jQueryの$()も使える。

12年3月3日土曜日

Page 56: 2012.02.28 IAMAS GeekLab #037 MyScripts

サイトによってはXHRの同期モードではエラーが出る場合がある(google.com等。リダイレクト?)

その場合は、XHRを非同期モードで利用する。

12年3月3日土曜日

Page 57: 2012.02.28 IAMAS GeekLab #037 MyScripts

非同期モード非同期モード指定

非同期処理終了12年3月3日土曜日

Page 59: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 60: 2012.02.28 IAMAS GeekLab #037 MyScripts

「test」というテキストをクリップボードにコピーしてから実行

クリップボードの文字をWebサービスで暗号化できた

12年3月3日土曜日

Page 61: 2012.02.28 IAMAS GeekLab #037 MyScripts

スクレイピング• Webページ上の任意のテキストを機械的に抜き出してきて利用

• XHRで取得、DOMに展開、jQuery

で検索し、取得が黄金パターン

• iOS機単体で作り込むのは無謀なので、母艦で開発

12年3月3日土曜日

Page 62: 2012.02.28 IAMAS GeekLab #037 MyScripts

• 開発にGoogle Chromeを利用

• jquery-injectorでページにjQueryを強制的にロード

• JavaScriptコンソールを起動

12年3月3日土曜日

Page 63: 2012.02.28 IAMAS GeekLab #037 MyScripts

• 都内の環境放射線量調査最新データを取得したい

• http://monitoring.tokyo-eiken.go.jp/monitoring/hourly_data.html

12年3月3日土曜日

Page 64: 2012.02.28 IAMAS GeekLab #037 MyScripts

12年3月3日土曜日

Page 65: 2012.02.28 IAMAS GeekLab #037 MyScripts

$('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日土曜日

Page 66: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsに実装jQueryをIMPORT

12年3月3日土曜日

Page 67: 2012.02.28 IAMAS GeekLab #037 MyScripts

Mailアプリケーションが起動し、最新の環境放射線量のデータと共に新規メールが作成される

jQueryを使用

12年3月3日土曜日

Page 68: 2012.02.28 IAMAS GeekLab #037 MyScripts

JSONPの利用• JSONPとは?

• クロスドメイン制約がかかって自由に使えないXMLHttpRequestに代わるデータ通信手段

• 外部サイトからのJavaScriptの読み込みには制約がかからないことに着目

12年3月3日土曜日

Page 69: 2012.02.28 IAMAS GeekLab #037 MyScripts

MyScriptsでのJSONP

• 起動直後はドキュメントが空であるので、document.header.innerHTML

に”<head></head>”をセットしておく

• JavaScript読み込みは非同期処理なので、「IS_ASYNC」、「ASYNC_DONE」を使い非同期処理のパターンとする

12年3月3日土曜日

Page 70: 2012.02.28 IAMAS GeekLab #037 MyScripts

ドル円相場の取得

• 「りょーちの駄文と書評」で提供しているJSONP APIを利用

• 為替レートをJSONPで(無理矢理)取得

• http://ryouchi.seesaa.net/article/64139382.html

12年3月3日土曜日

Page 71: 2012.02.28 IAMAS GeekLab #037 MyScripts

非同期モード

コールバック

空のheadを足す

12年3月3日土曜日

Page 72: 2012.02.28 IAMAS GeekLab #037 MyScripts

JSONPの読み込み開始

コールバック関数名

12年3月3日土曜日

Page 73: 2012.02.28 IAMAS GeekLab #037 MyScripts

• JSONPの読み込みが終わるとコールバック関数が実行される。

• コールバック関数の引数は、APIから取得したJSON。ここから円相場を取得して、Twitter for iPhoneに投げるメッセージ「1ドルxx.x円なう」を作成し、Twitter

for iPhoneにメッセージを送るURLを組み立てる。スクリプトのアクションにはopenURLを選択したので、スクリプトの終了と共にTwitter for iPhoneが起動。

12年3月3日土曜日

Page 74: 2012.02.28 IAMAS GeekLab #037 MyScripts

HTMLビューの利用

• 渡されたテキストをコピーするだけのスクリプトを作成

• 起動URLを取得

• myscripts:run?title=Copy&text=引数

12年3月3日土曜日

Page 75: 2012.02.28 IAMAS GeekLab #037 MyScripts

起動URLをhtml埋込み

引数を合体12年3月3日土曜日

Page 76: 2012.02.28 IAMAS GeekLab #037 MyScripts

クリックCopy呼出し

引数のテキストがコピーされた

HTML Viewを一種のUIとして使える

※MyScriptsからMyScriptsを呼び出せることに気づこう12年3月3日土曜日

Page 77: 2012.02.28 IAMAS GeekLab #037 MyScripts

バックグラウンド動作

• スクリプトリスト右のチェックボックスをオンにすると、MyScriptsをバックグラウンドに回した後に10分間限定で(OS

の制約)クリップボード監視が始まる。

BG実行指定

※一つだけ選択可能

12年3月3日土曜日

Page 78: 2012.02.28 IAMAS GeekLab #037 MyScripts

BG動作中、クリップボードにテキストがコピーされると指定されたスクリプトが実行される。クリップボードのテキストがTEXTに渡る

12年3月3日土曜日

Page 79: 2012.02.28 IAMAS GeekLab #037 MyScripts

• クリップボードにコピーされたテキストが正規表現にマッチしたら、pushToArray()関数が実行される。また、通知センターの通知が表示される。

• マッチしなければ、TARGET変数にnullがセットされ、通知の表示が抑制される。

通知センターから、スクリプトを起動可能

12年3月3日土曜日

Page 80: 2012.02.28 IAMAS GeekLab #037 MyScripts

pushToArray関数では、配列にマッチした文字列を集めつつ、LOAD_JSON、SAVE_JSON関数で配列を永続的に保存している。これで10

分のタイムリミットが過ぎMyScriptsが終了しても、次回配列を復元可能。

12年3月3日土曜日

Page 81: 2012.02.28 IAMAS GeekLab #037 MyScripts

Jailbreak TweakでMyScripts環境を強化

• Jailbreakをすると、OSなどの動作を改変可能

• MyScripts自体も改造可能だが、今回はスライドが80枚を超えて精も根も尽きたのでまた今度の機会に

12年3月3日土曜日

Page 82: 2012.02.28 IAMAS GeekLab #037 MyScripts

10分の制約を外す• BGプロセスを抱いたままBGで10分経過すると、アプリケーションはOSから殺されてしまう

• クリップボード監視を永続化できるならば、また違った使い方も見えてくる

• 10分の制約を外そう!

12年3月3日土曜日

Page 83: 2012.02.28 IAMAS GeekLab #037 MyScripts

DontKillBG• バックグラウンド動作の10分の制約を外すJailbrokenな環境で動作するTweak

• iPhoneを、Xcodeを起動させたMacに接続。MyScriptsをOSが殺した瞬間XcodeのConsoleに流れてきたメッセージから制約を課している部分を特定

• 時間制限が課されているかどうかの判定メソッドを破壊し常にNOを返すように

12年3月3日土曜日

Page 84: 2012.02.28 IAMAS GeekLab #037 MyScripts

/* * 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日土曜日

Page 85: 2012.02.28 IAMAS GeekLab #037 MyScripts

•以下からインストール可能• [JB]iOS 5のバックグラウンド動作10分の時間制限を取り払うDontKillBG

• http://hitoriblog.com/?p=6290

12年3月3日土曜日

Page 86: 2012.02.28 IAMAS GeekLab #037 MyScripts

まとめ• MyScriptsは、iOS上の様々な問題を解決するポテンシャルを秘めている

• スクリプトの配布、インストールは、ブックマークレットよりとても簡単!使うだけの人にとっても便利

• ニッチなニーズを埋めるスクリプトをバンバン作って共有しよう!

12年3月3日土曜日

Page 87: 2012.02.28 IAMAS GeekLab #037 MyScripts

ひとりぶろぐhitoriblog.com

ご清聴ありがとうございました

http://twitter.com/hitoriblog

moyashi

12年3月3日土曜日