3

iPhone JavaScript Console作った

作った → https://github.com/shokai/iphone-js-console

iPhone用のJavaScript shellのようなもの。FirebugやChromeの開発パネルみたいな感じで使う。

chrome拡張やiPhoneシミュレータでiPhone用のwebページの動作は確認できるが、加速度センサやGeo Location APIなんかは実機で動かさないとデバッグできない。
しかしデバッグをしようにも、iPhone上で大量のalertを出すと気が狂ってしまう。iPhoneで実行中のwebページ上の任意のオブジェクトの中身を、Macから覗いたり値を書き換えたり関数を実行したりするツールが必要だったので作った。

なお、Androidのブラウザにはwebsocketが無いのでこのツールは動かない。Androidではlogcatで

adb logcat | grep "^./browser" --color=auto
すればconsole.log、console.errorの出力は見れるので、それで何とか我慢している。



■セットアップ
MacとiPhoneを用意する。MacとiPhoneは同じ無線LANの下に接続して、互いに通信できるようにしておく。

github.com/shokai/iphone-js-consoleからcloneしてくる。

iphone-js-console.jsをhtmlに読み込ませる。JsConsole.startで自分のMacに接続させるようにする。
<script src='iphone-js-console.js' type='text/javascript' />
<script type='text/javascript'>
JsConsole.start('ws://192.168.1.38:8088'); // Addr of Console Server
</script>
(あらかじめconsoleを起動するMacのIPアドレスは調べておこう)


Macで、iphone-js-consoleを起動する
./iphone-js-console

iphone-js-consoleの起動時に、rubygemsが足りないという警告がでたら足りないgemをインストールする。
gem install eventmachine em-websocket
多分これで足りる。
あとreadlineを使っているけど、Macの最初から入っているreadlineは腐ってた気がするので、brewかportsで入れるといい。(わからなかったら飛ばしても多分良い)



■使う
Macのiphone-js-consoleで
alert(document.title)
と打つと、


このようにiPhoneのSafari上でJavaScriptが実行される。


また、iPhoneのSafariの変数を参照することもできる。
> window.navigator.appVersion
<1> "5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5"


中身が複雑なオブジェクトは整形されて表示される。
> location
<1>
{"href"=>"http://192.168.1.38:8080/debug-sample.html",
"hash"=>"",
"port"=>"8080",
"protocol"=>"http:",
"origin"=>"http://192.168.1.38:8080",
"pathname"=>"/debug-sample.html",
"hostname"=>"192.168.1.38",
"host"=>"192.168.1.38:8080",
"search"=>""}


もちろん、エラーも出力される。
> homu
<1> "error : Can't find variable: homu"
> 1+2
<1> 3
> 1+
<1> "error : Parse error"


iPhoneのJSで、あらかじめ
console.log(foo);
とか書いておけばもちろんMacのiphone-js-consoleにfooの値が表示される。


一度入力したコマンドは、キーボード上下で履歴を呼び出したりできる。
大変便利ですね。




■技術的なこと
iPhoneとiphone-js-consoleの接続にはWebSocketを使っている。EventMachine::WebSocketが便利だった。

iphone-js-consoleからiphoneへ送信された文字列は、そのままiPhone上でevalで実行させている。
iphoneからiphone-js-consoleへのオブジェクトの送信は、iPhone上でJSON.stringifyでシリアライズして送信して、iphone-js-consoleでparseして適当に整形して表示している。

別に難しいことはしていない。

0

glitchtweet.com作った

2ヶ月ぐらい前に作った。blog書くのめんどくさくて放置してた。

http://glitchtweet.com


俺がやっているような素敵な装飾がついたツイートがだれでもできるwebサービスです。しかも気に入ったのがでるまで何度でもやりなおせる。
iPhoneやAndroidから使うことを想定している。



ライブラリ以外のコードを数えたら、286行しかなかった。
その他は以前作ったテキストに文字装飾を行うglitchtext.jsが500行ぐらい。sinatra、haml、jqueryのおかげでシンプルに書けた。

ソースはここにある
shokai/glitchtweet-web-app – GitHub



以下細かいことなどを書く

■ファイルサイズ
でかい。glitchtext.jsが辞書が巨大すぎて300kb以上ある。けどしょうがないし、まあキャッシュ効くからいいか


■サーバー
さくらVPSのdev.shokai.orgに、virtualhostでglitchtweet.com割り当てて使ってる。


■開発環境
まずglitchtext.jsはv8とRakeで単体でテストをしている。前に書いた
glitchtweet.comのwebアプリ自体はローカルでwebrickで起動して、chromeの開発パネルでjsなどのデバッグをした。あとはiPhoneとAndroidのsafariのブラウザで開いて、見た目を調整した。


■なるべく画面遷移しない
jquery mobileやjQTouchを使うとネイティブアプリ風に外見で、横にスライドして表示を切り替えるwebアプリを作れるけど
面倒だったので使わなかった。visibleをon/offしてtweetボタンを表示したりしなかったり等している。
なのでviewのテンプレートは1つしかない。


■twitterログイン
生成したglitchテキストはoAuthでログインしてtweetされるが、ユーザ情報管理にDBは使っていない。
cookieにtwitterのoauth tokenとsecretを保存している。
最初の画面でログイン済みかどうかは、haml template上でtokenとsecretがあるかどうかだけで表示を分岐しているので、実際glitchtweet.com側では誰がどんなtweetをしているかは把握していない(しようと思えばできる)


■cookieでsession
sinatraでcookieベースのsessionを使うようにしている。
Rack::Session::Cookieを使う – 橋本詳解に書いた。
glitchtweet.comでは2週間cookieで保存するようにしている。
use Rack::Sessioin::Cookieしたらsinatraのsession関数がcookieを使うようになってくれた。
(これで大丈夫ですよね?)


■ホーム画面アイコン

<link href='http://glitchtweet.com/img/icon.png' rel='apple-touch-icon' />
これをheadに書いておくと、iPhoneのホーム画面にブックマーク保存するとアイコンが付く。
Android2.3でもホーム画面にブックマークショートカットを作ったらアイコンが出るようになった。しかも角丸化される。apple-touch-iconって名前なのに処理してくれるAndroidえらい。


■テスト環境にwebrick使うようにした
開発中にSinatra1.2.1が出たのでupdateしたら、thinを使うとhttpリクエスト送った瞬間に問答無用で強制終了するようになった。
webrick使うようにした。
Sinatra1.2.1とthin1.2.10を同時に使うと死ぬ – 橋本詳解


■viewport
@hitoriblogさんに教えてもらった。
適当なhtml/cssを書いていてもiPhoneではそれなりに正しいサイズで表示されるんだけど、Androidではテキストエリアをクリックした瞬間にものすごいズームをされてしまう。
これはviewportをheadに指定しておくとなんとかなる。Androidはデバイスがたくさんあるので、画面サイズが微妙に違うのでwebサービス作ってる人は大変そう。
<meta content='width=device-width, user-scalable=no' name='viewport' /> 
このへんも参考になる。


■shakeイベント
ネイティブアプリではshakeのイベント、つまりiPhone本体を振ったイベントを取得して、undoに使われている。
全く、操作と実行内容の関連付けが最も意味不明な機能だと思う。

でもiOS4.2からsafariでも加速度センサーが使えるようになったので、せっかくだからshakeイベントを取れるjsライブラリを作った。
shokai/js-iphone-shake-event – GitHub

glitchtweet.comでも使っている。tweet後に、もう一度同じソースからglitchしたい時にshakeすると消えた文字が復元される。

これについてはあとで書く。


■iphone-js-console
shokai/iphone-js-console – GitHub
iphone-shake-event.jsを作っている時に、iPhone実機でのデバッグをする為に作った。
パソコンのterminal上でjsを書くと、iPhone上で実行されたり、パソコン上でiPhoneのブラウザ上のjsの値を読み出したりできて便利。

これについてもあとで書く。

0

WPtouchをインストールした

wordpress用のiPhone/iPodTouch用プラグイン WPtouchを入れた

WPtouch

ダウンロードしたアーカイブを解凍して、wp-content/plugins以下に配置して管理画面からプラグインを「使用する」にチェック入れるだけで動いた。

useragentを見て表示をiPhone/iPodTouch用に切り替えてるので、専用URLが生成されるのではないので良い。

0

iPhone買った

たしかに携帯電話としては色々問題はある気もするけど、パソコンのメールもRSSもtwitterも全部見れるので、朝家でメールチェックしてるうちにいつのまにかLDR見てて時間が経っているという事がなくなって良かった。

他の買った人はみんなiPhone買ったと言わずにi.softbank.jpのメアドだけ送ってくる。

■発見方法

先週の土曜の朝に何店か回って2時間ぐらいであきらめたんだけど、最後に電話した近所のダイクマのお姉さんが「入荷時期は言えないが予約しますか」と言う。契約に時間がかかる事は知っていたので、最近忙しくて平日にたまたま売っている店を見つけても契約する時間が無くて買い逃しそうだったので予約してみた。

3時間後に「入荷しました」と連絡が入り、すぐ取りに行った。

auからMNPした。移行した瞬間に、ケータイがつながらなくなった

DSCF2513

auに電話して、「MNP予約番号」という何週間か有効なIDをもらい、それをsoftbankに持って行って免許証などで本人確認すると番号を移転できるらしい。

softbankのシステムはダウンしていて、結局自分のPCでアクティベートした。なのでYahooボタンとかがインストールされていない。

■設定

bootcampなので、音楽とpodcastとAppStoreはWindows、メールとアドレス帳はMacとシンクロしている。その辺が細かくできるので良い。MobileMeはiTunes上で登録画面が出たのでアカウント取ったが使い方がわからない。

アドレス帳はsoftbankでもらったツールの使い方がよくわからなかったけど、W51S→メモリースティックにアドレス帳書き出し(VCF形式)→Macでアドレスブックにドラッグアンドドロップ→iTunesでsyncで移行できた。

やっぱ基本的にMacと相性が良いように出来ている気がする。

5A347にアップデートしたらちょっと日本語入力速くなった気がする→iPhone 2.0 ソフトウェア・アップデート【5A347】恐龍の卵

でもしばらく使っていると遅くなるので、たまに再起動する。

■safari

よく落ちるけど、bookmarkletも使えるし、表示している画面のURIが見えるというのがとても快適。

DSCF2527DSCF2524

DSCF2526

■SMS

Twitterやmixinやjaikuなど海外のwebサービスはSMSで使えるようになっている。これ便利。

海外からのSMS受信は無料(海外への送信は有料)なので→SMS|SoftBank

受信には便利。ただtwitterは1週間に250通の制限があるのでユーザ絞らないと制限超える。

番号は国番号から入れるので、日本は81だから090-1111-1111だったら+81-90-1111-1111にすれば良い。

DSCF2523

■ロック

iPhoneにいろいろ入っていると落とした時ヤバそう。一応、起動時のロックかけた。

■SIMロック

本体はロックがかかっていて、日本のiPhone用のSIMでなければ認識しないが

SIMロックフリーの3G対応ケータイにiPhone用のSIMを刺したら普通に使えた。

ふつう、SIM自体にPIN番号というSIMを勝手に使えなくするパスワードをかける事ができるんだけどそれができないのがちょっと怖い。