■iPod touchを、音楽プレイヤーよりもPDAよりも、PCとして使うという心意気でがんばる■

Apple iPod touch

買ってからやっていったことを、Web1.0形式でお送りいたします。

iPod touchがこうだったらいいなー

BBS(鍋とザウルス再利用)

この下のことは、完全に iPod touch 保証外のことをやっています。

くれぐれも、リスクを考えた上で。何かあっても自己責任でよろしくお願いします。

2008/10/06 エモジモジくーん

iPhoneOS2.2にはコッソリと日本の携帯電話で使用するような絵文字が入っているとのこと。まあ、Rumorなので何とも言えませんけども。

サンプルで出てる画面だと、絵文字がカラーで表示されてます。カラーなのがすごい気になった。どういうフォントなんだろう。表示してるのもUITextViewなのかな?

WebViewにタグで埋め込んでるだけかもしれないなあ、とも思ったけど、キーボードの1種として、絵文字キーボードが出てくるってことは、入力項目にはどこでも絵文字を入れることができるのが自然ですよね。

いずれにせよ、楽しみです。ということで gTxtEditjPlus の絵文字入力パッドは作んなくて良くなりそうだ。

絵文字種類がどんなやつなのかも気になりますね。ソフトバンク絵文字だけなのか、DoCoMo絵文字も入ってるのか。iPhone独自…の可能性も無いわけでは無いよなあ。

2008/10/04 Lock Screenで予定確認。

ひとりぶろぐさんところで出てた話題。WinterBoardのServer Lock Sampleを使えば、ロック画面に任意のHTMLを表示することができるって話。

ローカルWebサーバ動かせば、cgiも行けそうですよね、ということでやってみました。

lighttpdの設定については、iPodayさんのところNeoCatさんのところを参考にさせていただきました。

カレンダーの現在時刻以降の予定2件を表示させてみます。

カレンダー情報の入ってるデータベースは /private/var/mobile/Library/Calendar/Calendar.sqlitedb です。Sqliteのデータベースファイルです。

予定の情報は EVENT テーブル。その中のSUMMARY カラムと START_DATE カラムを取得します。

START_DATEには、2001年1月1日 09:00:00 起点の経過秒数が入っているとのこと。Sqliteの日付関数は通常のUNIX timeなので1970年1月1日00:00:00起点。

その差 978339600 を足したり引いたりすれば、それぞれの変換ができることになります。

SQLはこんな感じ。

SELECT strftime("%m/%d %H:%M",strftime( "%J", START_DATE + 978339600),"unixepoch"),SUMMARY
FROM EVENT
WHERE START_DATE + 978339600 > strftime("%s","now") + 32400
ORDER BY START_DATE
LIMIT 2

なんか試行錯誤してできあがったSQLなので、まだ最適化できると思います…。まあ、とりあえずこれで。

このSQLを呼び出すシェルスクリプトを書いて、Server Lock Sampleが呼び出すsrcに設定しました。

シェルスクリプト : getCalendar.cgi

出たー。

充電表示の画像をもっと下の方の小さいやつにして、予定表示行数増やすってのもいいですね。

とはいえ、Webサーバまで使って結構大げさなので、これだけのためなら素直に IntelliScreen 使うのがいいと思います。

更新されるのはロック時なので、ロックしたまま予定確認してるだけだと更新されません。気をつけてください。

うーん、予定表表示の他にもなにか出来そうなんだけど思いつかない。

2008/09/29 gTxtEdit j-plus Q & A
Q1. 横画面はできないの?
A1.挑戦はしてみましたがダメでした。どなたか、やり方教えてください。
Q2. DoCoMo/ソフトバンクの絵文字入力パッド機能は付きませんか?
A2. 付けたいです。でも画面のタッチイベントの拾い方が分かりません。どなたか、Jailbreak2.xで実績のあるやり方を教えてください。というか僕のソースを添削してください。
Q3. auの絵文字入力パッド機能は付きませんか?
A3.絵文字が入った場合、iPod/iPhoneのメーラは自動的に文字コードUTF-8で送信するようです。auは残念ながらUTF-8のメールを読むことは出来ません。
このため対応しても使いどころが無いと思います。僕の携帯電話がauなので一番に対応したいのですがザンネンです。
Q4. 何も設定しなくても、MobileFinder(Cydia版)と連携できてますよね?
A4. MobileFinderの設定がクリアされてしまう現象が多いみたいなので、最初から*.txtに関連付けされているMobileTextEditのIDを使っています。
MobileFinderの設定がクリアされないようバージョンアップされるか、MobileTextEditの2.x版が出てくるまでの暫定処理と思ってください。
Q5. Webからコピーした内容が、再起動してもクリアされません。
A5. コピー情報を保持しているCookieの保持期間を1日(= 24*60*60*1000 )に設定してあります。1日経てば消えます。
長すぎると思う方は、iCopy改ブックマークレットのexpires指定を変更してください。
Q6. Webからコピペできません。iCopyを使ったWeb内のコピペはちゃんとできてるのですが。
Q6. iCopyのWeb上のコピペは、ブラウザを閉じたら消えてしまう設定のCookieを使っています。ブラウザ開いている間は、保存されています。
iCopy改では、これとは別に、ブラウザを閉じても一定期間消えない設定のCookieを作るようにしています。しかし、サイトによっては
明示的に自分のサイトに紐付くCookieをクリアしてしまうサイトがあります。そういうサイトからはコピペできません。あきらめましょう。
Q7. 終了して再起動したら、さっき編集してた内容が表示されてるっぽいのに「New File」になってますよ?
A7. 終了時に開いていたファイルを開いているわけではありません。終了時に、そのときの内容を一時ファイルに保存して、それを開いています。
サスペンド処理ではありません。終了時に、ユーザ問い合わせなく、編集していたファイルの自動保存をするのはマズイだろうと思って、こういう動きになってます。
一時ファイルは /private/var/mobile/___gTxtEditAutoSaveTxt___.txt です。編集中の文字コードで保存されます。
Q8. 保存時に文字コード指定したいです。
A8. したいですね。文字コード選択をどうやるか考えてます。ダイアログボックス上で使える、コンボボックスコントロールみたいなのがあればいいんですが…。
→これはダイアログ使うんじゃなくて、素直に画面遷移したほうがいいような気がしてきました。
2008/09/28 gTxtEdit j-plus になりました。

アプリ内で Lexierra_ja_JP-dynamic-text.dat を書き換えても、アプリ終了時に、本物の日本語入力システムが本来のデータを上書きしちゃうことが発覚。これじゃー使えない。

ひとりぶろぐさんから、アプリ終了時に呼び出される applicationWillTerminate で登録したらどうか、とのアドバイスを頂きました。

昨日作ったヤツが、登録までの階層も深いし、操作やりにくいと思ってたんですが、アプリ終了時に登録にするなら、特に意識して操作しなくても、そのときのクリップボードの内容をそのまま登録すれば…、すごい使いやすいかも!

まず、クリップボードに、何かコピーしてください。そしてアプリ終了して別アプリ起動してください。

キーボードの左端、「p−」に、さっきコピーした内容が登録されています。それを選べば、ペースト完了!

もちろんサファリにだって貼り付けられます!


押しやすさと、他の変換とのかぶらなさを考えて「pー」にしました。(ひびきもコピーっぽいし)

また、「pー」は、追加登録じゃなくて、他の「pー」を削除した後に、1つだけ登録にしてるので、何回も上の操作しても、コピー履歴は残らないようになってます。(これがいいのかどうかは悩むところですが。)

「pー」に単語登録してる方、すいません。それ消しちゃいます。

また、サファリからのコピー操作を行った場合、起動時からクリップボード内容が入ってますが、それは登録しないようにしています。明示的に自分でコピー操作したものだけ、登録されます。

(追記)テンキー入力の場合も対応するため、「ら。」でも出てくるようにしました。


サファリへのコピー&ペーストも、これでやればいいと思うので、Launch Other App のところも整理しました。

新規メール作成と、コピーした文字列をURLとみなしてアプリ起動です。…なんか、もうこれも無くてもいい気もしてきた。


ステータスバーも出すようにして(Info.plist の UIStatusBarHiddenだったのねん…。)画面サイズが合うようにしました。

今回のコピー&ペーストは、日本語変換機能を利用してるわけなので、さすがにもう gTxtEdit そのままじゃまずい気がしてきました。

そこで、今後は

gTxtEdit j-plus ということで!


アプリ一式ひとりぶろぐさんのリポジトリに登録させていただきました。

サファリ用 Copy/Paste ブックマークレット (iCopyにCookie保存用処理を追加したもの。コピーはこれを使ってください。)

ソース


そして、今後の展開なのですが。

エディタでこれの入力パネル…。やりたいんですけど、画面タッチ(MouseDownとか)のイベントが、ぜんぜん拾えないんですよ。

かなりシンプルにしてみたソースを置いておくので、どなたか、何が不足してるのか、添削していただけないでしょうか…。

画面タッチを拾いたいソース(アプリ名称には特に深い意味は無いです)

2008/09/27 履歴辞書登録

/private/var/mobile/Library/Keyboard/Lexierra_ja_JP-dynamic-text.dat に単語追加すれば、変換履歴に追加されるということなので、ペースト先に選べるようにしてみました。

うまいことやれば、これを利用して、他アプリへのペーストもできるはず。

「Paste To Dic」てのを追加しました。

どのキーワードで追加するかを指定します。デフォルト表示は、キーボードで押しやすくて、かつ文頭に出ることがあまり無い「ーー」にしようかなあと思ってます。

でも、「ーー」じゃうまく動作してくれませんでした。Lexierra_ja_JP-dynamic-text.dat は出来てるので、もしかしてOS2.0とOS2.1の違いなのかなあとか思ってます。(僕はまだ2.0)

半角で登録すると動いてくれました。

でも「zzz」で登録したはずがなぜか「z」で変換される…。まあ、とりあえずは、サファリへの貼り付けも成功…ということで。

改行が入っているものにはまだ対応してません。現状、何が起こるかわかんないので、ここだけ対応するまでは、公開やめておこうと思います。

いまのとこ、XMLパースせずに、文字列検索&文字列操作で力ワザで追加してます。ちゃんとパースしないと、いつかまずいことが起きそうなので、これもちゃんとしないとなあ。

2008/09/26 権限問題

>なんか、終了して再起動したら、さっきMobileFinderで開いていたファイルがまた開かれるみたい。

の謎が分かりました。MobileFinder の実行ファイルが

-rwsr-xr-x 1 root wheel 202000 Sep 23 20:29 Finder_*

u+s で root 権限で実行されていました。

-rwxr-xr-x 1 root wheel 57760 Sep 25 01:05 gTxtEdit*

gTxtEdit は、普通にmobile 権限での実行なので、ModileFinderが作成した連動設定ファイルを、gTxtEditがリセットできずにいたというわけです。

まあ、使ってる分には、便利な動作でもあった気がしますが…。

でもやっぱこれは想定してた動作とは違うので、gTxtEdit も u+s します。

# chmod u+s gTxtEdit
-rwsr-xr-x 1 root wheel 57760 Sep 25 01:05 gTxtEdit*

これでよし。

ただ、自動保存一時ファイルが初期内容で表示されるから、閉じる前のファイルがそのまま表示されている、と勘違いされる可能性が高いですね…。

どうしようかなあ。

2008/09/25 MobileFinder連動

Cydiaに、1.x.x のころの MobileFinder を、2.x.x Jailbreak に移植したものがリリースされていました!これはめでたいです!

ということで、さっそく TextEditJからMobileFinder連携部分を移植。

「Modify」ボタンから、「Open With」で gTxtEdit.app を選んでください。よーし。これでファイラー作んなくてもいいや。

なんか、終了して再起動したら、さっきMobileFinderで開いていたファイルがまた開かれるみたい。連動用に書き込んでるファイルをクリアするタイミングが無いってことか。

これはこれで、続きから編集できて、まあいいかなという感じですが…。どうなるのがベストなのかなー。

拡張子関連付けはまだ試してみてないです。


実行ファイル&ソース

サファリ用 Copy/Paste ブックマークレット (iCopyにCookie保存用処理を追加したもの。コピーはこれを使ってください。)


iPhoneフォント入れ替えして、携帯絵文字を出すという話題。おもしろそうです。でも僕のキャリアはau。UTF-8メールが受信できないというどうしようもない壁があります…。

2008/09/21 いろいろ機能拡張

ひとりぶろぐさんにいろいろ教えてもらいながら、機能拡張しました。

他アプリとの連動が増えて、ペーストダイアログが狭くなってきたので、他アプリ連動を1段深いダイアログにしました。

新規メール本文へのペーストが出来るようにしました。

mailto:a@a.com?subject=a&body=b でopenURLすればいいだけだった。

メールアドレスを空白にする方法がわからなかったです。CopierciNはどうやってるんだろ?


URLがクリップボードに入った状態でOpen URLを選ぶと、そのURLをOpenします。

NSString の 1行取り出しとか、こちらを参考にさせていただきました。


それと、終了時に、現在のテキストを一時ファイルに保存するようにしました。

/private/var/mobile/___gTxtEditAutoSaveTxt___.txt に UTF-8 で保存してます。(ドットファイルのほうがいいのかな…。)

次回起動時に、このファイルがあれば、最初にそれを表示した状態になります。


いまのところ、Safariからのコピー文字列に半角記号が混じってるとうまくいきません。HTMLタグもダメです。→ できるようになりました!

・Webサイトによってはコピーできないところもあるみたい。

・Safariにペーストできるのは、半角英文字だけです。(現状だと実用につかえないです)

・プログラムソースがだんだん混乱してきた…。


実行ファイル&ソース

サファリ用 Copy/Paste ブックマークレット (iCopyにCookie保存用処理を追加したもの。コピーはこれを使ってください。)


半角英文字は %XX の8バイト指定になってたので%00付けてあげないといけなかった。

%uXXXX → %XX%XX と %XX → %00%XX の2つの変換が必要だったということです。

JavaScriptのescape関数で変換されたらこうなっちゃうの?だとしたら、これ変換する関数もすでに誰かが作ってそうな気もするなあ。

HTMLタグ含んでてもオッケーになった。


あと、メール貼り付けのときメールアドレス空白できました。mailto:?body=b だけでよかった。

2008/09/20 Safari → gTxtEdit コピー できた

できました!

Safari の iCopy(改)ブックマークレットでコピーした後に、gTxtEdit を起動してください。

Webでコピーされたものがあれば、自動的にクリップボードに入った状態になってますので、貼り付けてください。

んんー、なんか変換が変なところがありますね。半角記号があやしい。

Webサイトによっては、うまいことコピーできないところもあるみたい。明示的にそのサイトのCookie消しちゃってるのかも。現状はあきらめるしかない。

あ!半角記号がダメってことは、HTMLタグ含めてコピーされる場合、ぜんぜんダメかも…。


そして、Safariへのペーストも思いつきました。iCopyのコピー時に使っているURLでSafariを起動しちゃえばいいんです。

http://www.biocow.com/c/copy.php?curUrl=&bioCopy=[コピー文字列]

こんなかんじ。

でも、このコピー文字列をうまく作ることが出来ませんでした。下の方のUTF-16苦労話に書いてますので、解決できる人がいらっしゃいましたら教えてください。

コピー内容が英文字だけなら、動作しました。


UTF-16に苦労しました。JavaScriptが変換するのが %uXXXX 形式なんですけど、NSString の

stringByAddingPercentEscapesUsingEncoding と stringByReplacingPercentEscapesUsingEncoding が

%XX%XX 形式になってるみたいです。ここの相互変換のやりかたでいいやつ知ってたら教えてください。

%uXXXX → %XX%XX は無理やりやってみたけど、まだ微妙に変になるし、逆変換はどうやっていいのかわからんです。

これが可能になったら、日本語のWebへのペーストもできるかもしれんです。

NSStringEncodingに UTF-16 はDefineされてませんでしたが、UTF-16BE = -1879047936 でいけるみたいです。

参考にしたページ→


実行ファイル&ソース

サファリ用 Copy/Paste ブックマークレット (iCopyにCookie保存用処理を追加したもの。コピーはこれを使ってください。)


Webとテキストエディタを入ったり来たりする運用を考えると、テキストエディタのサスペンド→復帰的な動作が欲しくなってきますね。

2008/09/19 Safari → gTxtEdit コピー

Jailbreak環境のiPhoneでのコピペ実装、Webサーバ経由してアプリ間コピペとかどうでしょうか。これならサファリとも連携できそう。

ってTwitterに振ってみたら、ひとりぶろぐさんから、「iCopy」がサーバ経由でコピー実現してることを教えてもらいました。「iCopy」はWebブラウザSafariのブックマークレットでコピー&ペーストを実現してるツールなんですが、てっきりローカルだけでうまいことやってるとおもってて、サーバまで経由してるとは思ってませんでした。(僕は、サファリ上でのコピー&ペーストがあんまり必要じゃなかったので動かしてみたことが無かったんです。)

しかけが気になったので、iCopyの通信を見てみたところ、Cookieにコピー内容を持ってる様子。なるほど。

そんなら、このCookieをアプリ側から取得できれば、「サファリでコピー」→「アプリでペースト」ができるんじゃないかと。


その線でいろいろ確認しているうちに、このCookieはセッションが切れたら消えてしまう設定になっていることに気が付きました…。サファリ落としたら消えちゃう…。

iCopyと同じ動きをするサーバを自分で用意するというのも考えましたが、iCopyのJavaScriptが読みきれなかったし、サーバサイドがブラックボックスなので…。

でも、まだ、あきらめません。そんならば、iCopyのスクリプトの中で、無理やりに expires が指定されている Cookie を作っちゃえばいい!

この場合、Cookie は、コピー元になってる今表示してるURLにひもづくこととなります。いろんなサイトでコピーするたびに、それぞれのサイト用Cookieが作られるわけです。

そこは、「最新のコピー=一番expiresが未来のもの」という判定で、乗り切りましょう。


ということで、前置きが長かったですが…。

この方法でサファリからgTxtEditへの文字列コピーに挑戦してみました。

まだまだ、完成には至ってませんので期待しないようにおねがいします。

サファリ用 Copy/Paste ブックマークレット。iCopy オリジナルのものに、下のコードを追加で埋め込んでます。iCopyと同じで、ブックマークした後に、javascript より前を削除してください。

d=new%20Date();d.setTime(d.getTime()+24*60*60*1000);expire=d.toGMTString();document.cookie='gTxtEdit='+escape(bioVal.replace(/\s+/ig,'%20'))+';expires='+expire+';'

gTxtEdit という名前のCookieを付けます。expiresは1日に設定してます。(こんなに長くなくていいか)

日本語まじるとややこしくなるので、Apple英語ページで。

iCopy(改)を使ってコピーします。上ので囲んだところをコピーしました。

gTxtEdit を起動して貼り付け。なんかテキトウにコピーして、ペーストのとこまで来てください。(このへんの調整は後回し)

「WebPaste」というのを追加しました。

ペーストできました!ちゃんとAppleのさっきのところのコピーですよね?

内容は、エンコードされてます。URL Encodeです。デコードのやり方がわかんなかったので、まずはここまで…だ!

アルファベットと記号だけならいいんだけど、日本語がたぶんUTF-8。


こんな中途半端ですが、実行ファイルとソース置いときます。どなたかURL Decode実装してください。

実行ファイル&ソース

サファリ用 Copy/Paste ブックマークレット


あ、本家のiCopyの方で expires 設定してもらえないかお願いするっていうアプローチ方法もあるなあ…。そしたらアプリ→サファリもできるかも?

2008/09/16 コッピッペ

Cydiaで、アプリ間のコピー&ペーストを実現してるアプリCopierciNが出てました。

SMS、メモ帳、Eメール、テキストファイルからのインポート/エクスポートの形でコピー&ペーストするらしい。ファイルはUTF-8(BOM付き)で読み込めました。

コピー内容の簡単な確認修正用の簡易エディタが付いてて、範囲選択してコピー&ペーストが可能。

この、範囲選択の色付け表示をどうやって実装してるかが気になりました。日本語入力モードになってると、範囲選択時に、変な文字列がINSERTされるから、なんかしらの制御文字列使ってるのかな?(まさか、ANSIエスケープシーケンス?)選択の動作はちょっと重いかも…。

あ、大きなテキストファイルは、下の方がキーボードで隠れてしまいました。あくまでもテキストエディタではなく、コピー内容の簡単な確認と修正用ってことなのでしょう。

ファイル読み込み時のファイル名入力は、gTxtEditと同じフルパス入力。これはキツイんだよーなー。

2008/08/31 横画面チャレンジ

setRotationBy を使うと、画面の回転が出来るらしいので、横画面表示が出来ないか試してみた。

[ fileView setRotationBy: 90];

UITextViewだけ回転。おー、文字が横画面表示になりました。

[window setRotationBy: 90];

UIWindowごと回転。setOriginで位置合わせもしてます。なんか期待できそうな画面。

ところがキーボードがこれだ。

もちろんファイルセーブダイアログもこのありさま。むむー。

回転角度を90度以外に指定することも出来ます。これで文章入力してると酔うー。

2008/08/26 コピペ2.0.0.1ぐらい

使ってるうちに、コピーボタン押したときに、ダイアログが「ぽんよよよ〜ん」って出てくるのが、うるさく感じてきたので、アニメーションOFFにしました。これはApple思想的には間違った対応かもしれないけど。

あと「Selection」が「Selecttion」ってなってたのを発見。かなりハズカシイ。これ直すついでに、ボタンは横並びにしました。僕としてはこっちの方が使いやすいのですが、どうでしょうか。

ソース&実行ファイル

あ。ついでに画面サイズ直せばよかった。またこんどー。

2008/08/23 コピペ2.0

結局、ジェスチャーイベントだけならず、マウスダウン/アップイベントすらぜんぜん捕らえられないままです。どうにも行き詰り。

それはそれでしょうがないので、テキストエディタのコピー&ペーストは別の方法で実装してみることにしました。

くやしいけど、ボタンによる操作です。

実装完了までには、またワナがいろいろありました。この情報が役に立つことがまたあるかもしれないので、メモとして書き残しておきます。


ボタン押下でUIAlertSheetを出すには、親オブジェクトのresignFirstResponderを呼ぶ必要があるみたい。

UITextViewの selectionRange と setSelectionRange が無くなってました。直接、プロパティselectedRange を触れば良いみたいです。

このへん、CydiaのToolchainに入ってるセルフコンパイル環境のヘッダが、本物のiPhone2.0ライブラリと合ってない部分がまだまだあるみたいです。

selectedRangeの対応のためには、UITextView.h に

@property(nonatomic) NSRange selectedRange;

を追加する必要があります。これ以外にもたくさんこういうことがあるでしょう。(NDAが解除されたならかなり解決されるでしょうけど。)

マウスイベント捕まえられないのもこの辺が原因の予感。


そして結果がこれだ!

できました!右上に輝く「Copy」ボタンを見てください!カッコわるいけど機能はバッチリです!

ちなみに、もともとその位置にあった「Save」ボタンは左下に。「New」ボタンは、「Open」の中に入れました。

コピーしたい文字列の先頭にカーソルを置いて、「Copy」ボタン押下でダイアログが出てコピー選択開始。

ダイアログ要らないかもと思ったんだけど、何も反応無いと、押したかどうかわかんなかったので付けました。

コピーしたい文字列最後にカーソルを置いて「Copy」ボタン押下で「Cut」「Copy」選択。

コピー文字列がクリップボードにある状態で、コピー先にカーソルを置いて「Copy」ボタン押下、「Paste」選択でペースト。

このとき「New Selection」を選択すれば、ペーストせずに新たにコピー先頭位置の選択になります。

ここ、前回のバージョンよりも、ひと手順、減らせるように工夫してみました。

「New」はロードファイルダイアログの中です。


いつものように実行ファイルとソース置いておきます。本家の gTxtEdit を Cydiaからインストールした後に、上書きしてください。

ソース&実行ファイル

リポジトリへの登録とかは、Info.plistの書き方とか含めて正直ぜんぜんわかってないので、ちょっとまってください。

ソース公開してるので、だれか、これにサクっとファイラーを付けてくんないかな…とか思ってます。そのうち自分でやるかもしれないけど。


なんでキーボードなし画面のスクリーンショット、下に黒い部分が出ちゃうのかな…。

→よく見たらもともと画面でも下の方が黒かった。画面サイズ指定ミスだー。

2008/08/15 デル単、シケ単

2.0にする前は、iStudyっていう単語帳アプリを使ってたんです。(有名なこっちのiStudyではないです。)

2.0になって、動かなくなったので、ソースを元に修正をかけてコンパイルしてみたのですが、問題が表示されなかったりSWIPE操作が出来なかったりで、使えるところまでたどり着けませんでした。

そんなときAppStoreで見つけたのが「gFlash+」

以前にも、このソフトをAppStoreで見た記憶はあるのですが、その時は、「AppStoreで出てるって事は、自分で単語追加とか出来ないに違いない」って思い込んでて、あまりちゃんと見なかったんです。

あらためて見てみますと、Google Documentsのスプレッドシートで問題作成して、それを取り込めるって書いてあるじゃないですか!しかも無料!

単語帳選択。いくつか、サンプル問題が付いてます。左上のボタンで単語帳管理メニュー。ここで「Get My Google Data」すれば自分のGoogleアカウントのスプレッドシートから問題取り込めます。

「Search gWhiz Catalog」で、他の人が公開してる問題を取り込むことも出来ます。いまんとこ、英語圏の人用の問題ばっかりですけど…。

問題スプレッドシート作成には、gFlash+ の説明ページにあるテンプレートを使うのが良いでしょう。

こんな感じで入力。列単位でもコピー&ペーストできるので、すでにデータ化されてるならラクラク作成。

問題&解答画面。通常モードでは、問題を見て、考えて、解答を表示して、正解してれば「Right」、間違ってれば「Wrong」を押して進んでいきます。横の四角のとこに、正解なら緑、間違いなら赤が点いていきます。

「Multiple Choice」を選ぶことで、四択問題での表示に。この場合、正解/間違いは自動的に判断されます。このモードがかなり良い。

全問回答した後は、間違った問題だけから再度回答することができます。(…のはずと思うんだけど、なんかぜんぜん違う問題から出題される…。)

「Reverse Q & A」を選ぶと、問題と解答を逆にして表示することができます。なにげにこれが、かなりうれしい機能なんだ。

「Take the Quiz!」は…クイズモードらしいんだけどよくわからんかった。

問題文のところで、画像指定することも可能。この場合、画像は問題表示時にネットから読み込むことになるっぽい。オフラインじゃ使えないですね。

もともとはWindowsMobile(BlackBerry?)のアプリなのかな?言われてみれば、操作系はiPod touch/iPhoneっぽくなくて、ボタンプッシュのWindowsMobile的です。

データは、データベースSQLiteに格納されてるっぽい。

/private/var/mobile/Applications/XXXXXXXXXXXXXXXXXXXXXXXX/Documents/gflash.sqlite

これですね。


上でも書いたけど、AppStoreに登録されるアプリって「データはそのアプリ内ですべて完結」みたいなイメージがありました。でもMobileFinderの自前FTP取り込みとか、このgFlash+のGoogle Documents との連携とかを見ると、まだまだ結構広がる可能性があるんじゃないかと思えてきました!いい感じです!

2008/08/13 モビルフィンダー!

8/11付けでAppStoreにMobileFinderが登録されていました。埋もれてて見逃すところでした。有料230円です。

起動画面。フォルダ一覧です。サンプルとして、いくつかのファイルが付いてました。

右下の矢印アイコン押すと、ファイル転送画面。(おそらくはMobileFinder内の)FTPサーバが起動して、つなぎ先のIPアドレスが表示されるので、PCから接続してファイル転送します。

まあ、それはそれとして。普通にSFTPで繋いで実際のフォルダの位置を確認してみました。

予想通り、アプリケーションのドキュメントフォルダの下。直接ここにファイル転送してやってもOKでした。

で、そうなると、ここから上位フォルダにリンク張ったらどうなるか気になりますよね。

ムリかもしれないなあと思いつつ、 /privete フォルダをリンク。

おおおお!?普通に見れるぞ…。いいのか…?

フォルダが多いと、動作が重くなりますね。

音楽再生したり、動画再生しようとしたらたまにこのメモリ不足の画面が出てました。同じファイルでも出たり出なかったり…。バックグラウンドでなんか動いてたりしてたかな。

こういうときは孫さん直伝のホームボタン長押しでメモリ開放が効くでしょうか?

テキストエディタも付いてます。ただ、文字コードはUTF-16固定のようでした。ああー、このエディタをTextEditJと差し替えたいー!(2.0じゃTextEditJまだ動かないけど…。)

2008/08/10 いい弁当

どうやらUITextViewから、gestureEndedだけでなくmouseDownとかmouseUpも拾えていないらしい。なんでーだ。

悔しいので Quasi88をコンパイルしてみようとしてみたのですが

LayerKit/LKLayer.h: No such file or directory

ギーヤー!LayerKit使ってた!CALayerにすればいいのかな…。


ちゅうことで、Quasi88、苦労してなんとかコンパイル完了までこぎつけたのですが、実行したら画面が出てすぐにアプリ終了してしまう。PC8801のキーボード表示まで来てるから、ぜんぜん動いていないってわけでは無いみたい。うーん、やっぱSDL部分かなあ。

SSHからの実行が出来なくなっちゃったので、デバッグどうやってやればいいのかわからんです。エラーログ作るようにして、ちまちま実行情報を書いていくしかないのかな…。

2008/08/09 コピペならず

gTxtEditを僕が使いやすいように修正しました。

Load時の初期表示を"/private/var/mobile/"に。人によっては別のとこが良いかもしれないけど…。

うーん、やっぱ、ファイラーが欲しいですよねえ。

Save時に、初期値で現在編集しているファイル名を表示するようにしました。そのままSaveすれば上書きできるようになります。

Save処理の結果を出すようにしました。

ソース&実行ファイル (本物の gTxtEdit インストールした後に実行ファイルだけ入れ替えてください。)

で、ソース見てもらったらわかるんですが、コピー&ペーストも入れてみようと挑戦しています。

でもジェスチャーの検出ができなくて、動作してません。誰か 2.0 でのジェスチャーの検出のやり方を教えてくれないかな…。。


前のときに

>注意点:mobile権限で動作してるので、/privete/var/mobile/ 以下にしか書けないと思います。

て書いたけど、そんなことないかも?むむ。


むむ!エリカさんもファイルブラウザーをAppStoreから出すみたいですね。

自分のアプリ配下にファイルを置いて、テキスト・PDF・イメージ・オーディオ・ムービーなどなどをサポート。MobileFinderと同じアプローチだなあ。

Explore your file systemのとこの画面が、ぱっと見で、「ルート以下のシステムフォルダとかも全部、見えますよー」って風に見えちゃうんですけど、やっぱり

Q: Why can't I see the .sb sandbox files?

A: Because Apple says no. It's not my call. iPocket does not go around Apple's sandbox. You can see and share only those files that Apple allows you to.

だよねえ。

もしや、Jailbreakしてる環境なら、アプリ配下のフォルダから、ルートあたりへのシンボリックリンク貼っとけばいい?そんな甘くない?

2008/08/06 PC9801とかX68000のファイラーを思い出す

まもなくAppStoreに登録になるらしい、MobileFinderのページができてました。

>自分のアプリフォルダ以外、操作できないファイラーになるの?

この点について、ものすごいアプローチをとってきています。

MobileFinder features:
* Intuitive file browser
* File transfers to and from a Mac or PC
* Compatible with Mac OS X"! 10.4 & 10.5
* Compatible with Windows XP"! & Vista"!
* Compatible with all flavors of Linux"!
* Standard file operations
* Text file creation and editing
* Image file viewing
* Sound file playback
* Movie file playback
* PDF viewer
* Web viewer
* Zip archive compression
* MS Office"! and iWork"! documents

これ、自分のアプリフォルダ配下に全てのデータファイルを集めようとしているってことじゃないですか?!

まるで、MobileFinderがOSであるかのようです!この心意気はすごい!

でもこんだけやりたい放題にしちゃって、AppStoreに素直に登録させてくれるのかどうかが不安。

あとはAppStore登録ってことはソース見れないのが残念です。

そんで、これは言ってもしょうがないけど、これだけパワフルそうなアプリが、アプリの壁を越えて自由に連携できないことがとても悲しいです。

2008/08/04 いまさらAppStoreデビュー!

Jailbreak2.0に対応したアプリが、GoogleCodeに少しずつ出てきたので、ソース眺めています。

gTxtEdit

シンプルなソースで、最初に見てみるにはわかりやすいです。Jay.* が謎なんですが、システム系Include羅列を使いたいだけってことかな?

mobileTerminal

なぜか、一気に4つシェルが立ち上がるようになったmobileTerminal…。
システムのジェスチャ動作がOS2.0でなんとなく変わってる予感なので、そのへんを参考にさせてもらいたいです。

MobileFinder

「iPhone OS 2.0ではMobileFinderが必要とする多くの機能が削除されてしまった。移植はとても難しい」
「オフィシャルSDK用のMobileFinderは完全に2.0に合わせて作り直した。」
「Hack SDK用のバージョンは、残念ながらしばらくはありません。」

ガガーン!なんということ…。gTxtEditとMobileFinderの連携を期待していた僕にはあまりにもショックです。
公式SDKのMobileFinderって、何が出来るんだろう…。自分のアプリフォルダ以外、操作できないファイラーになるの?


MobileFinderのショックをごまかすため、gTxtEditに、TextEditJの文字コード判定ロジックを入れてみた。

日本語交じりもセーブできます。それにしてもファイル名フルパス入力はきびしすぎる。

注意点:mobile権限で動作してるので、/privete/var/mobile/ 以下にしか書けないと思います。

ソース&実行ファイル


OSが2.0になったので、やっと僕もAppStoreデビューです。無料のは気になるのから順にドンドコ落としていきました。

Advent

テキスト入力型
アドベンチャーゲームです。
画面は切り替わらずに
文字だけ。しかも英語。
何していいか
ぜんぜんわからない…。

Apache Lander

iPodの傾きで
ヘリを操作して
ヘリポートに
無事着陸させる。
コツがつかめず
墜落ばかり…。

AuroraFeint

成長型パズルゲームです。
隣り合ったブロックを
入れ替えて、縦か横に
3つ並んだら消えます。
入れ替えは横列のみ。
上のブロックを下に
落とすことも出来ます。
消えたブロック種類によって
プレイヤーが成長します。
ちょっと動作重いかな…。
将来的に有料になりそうな
予感がするほど出来は良いです。

BubbleWrap

プチプチです。
つぶしても復活して
くるので、時間内に
どれだけつぶせるか
チャレンジ。

Calc

カッコも使える
計算機。
ヒストリが残るのが
僕好みです。

関数も使えまっす。
fnキーでキーボード切り替え。

あとは、
16進が使えたらいいのにな。

Gengou Free

西暦と明治/大正/昭和/
平成の関連がすぐわかる。

でも昭和が続いていたら
今は昭和何年?
みたいなのはできなかった。

iPint

本体を傾けて
お客さんまで
ビールを届ける
ゲーム。

ビールを届けた後は
飲むモード。

傾けるとビールが減っていきます。

KakeidoLite

万華鏡。くるくる回すと
模様が替わります。

LabyrinthLE

Jailbreak1.0の
ころからおなじみ
穴に落とさず
ボールをゴール
まで運ぶゲーム。

無料ライト版は
面数が少ないです。

でも十分遊べる。

PangeaVR

パノラマで街などを
見渡せます。
データはネット接続して
持ってきてるみたいです。

DOOMとかで酔う人には
厳しいかも。

僕もちょっとニガテ…。

Remote

ネット接続してるPCの
iTunesをコントロール
できます。
ジャケットも出るし、
なんかiPodを操作してるのと
勘違いするぐらいに
よくできてます。

なんでこれができるのに
無線LAN経由で
iTunesとシンクロさせて
くれないのか…。

Scribble

これもJailBreak1.0の
ころからあったのと
同じかな?

簡単な絵を書くソフトです。

消すときは本体シェイクで。

駅探エクスプレス

路線案内ですね。
ネット接続して無いと
使えないので、
iPhoneだとかなり便利そう。

9の1

ステージ9−1とのこと。

iPod touch持ったまま
ジャンプすると…

AQUA FOREST

有料です。(900円)

物理演算使ったパズル的な
ゲームです。

もう一息、動作が
軽かったらなー。

2.0にしたなら、やっておくべき
ゲームだと思う。

ディジー・ビー

有料です。(350円)

Labyrinthをさらにゲーム風に
したような感じ。

ミツバチを転がして、花を取ったり
仲間を助けたり。

ステージの少ない無料版も
あるので、おためしできます。

ということでいろいろと遊んでおります。iPod touch/iPhoneならではの、本体傾けゲームが多いのですが、このタイプは、電車内じゃ、遊べないことに気がつきました…。

2008/08/03 その2

Cydiaに Porting Apps from 1.x to 2.x って項目があって、かなり役立ちそうだったのですが、そこでしか見れないと困るので

書き出してみました。訳にもチャレンジしてみた…が…。

LayerKit->CoreAnimalion
Pretty much everything in LayerKlt
has been moved to QuanzCore.
LayerKlt was really just the older
name of CoreAnimatlon, and now
most anything that was LK* maps to
somethlng simllar in CA* The
names,however,aren't always the
same.For example,LKCurrentTlme
has become CACurrentMedlaTlme.
LayerKit->CoreAnimalion
LayerKltのほとんどがQuanzCoreに移動になりました。
LayerKltはCoreAnimatlonの古い名前です。
LK*という名称だったものは、今は CA*の似た名称のものになりました。
でもぜんぶこれと同じというわけではないです。
例えばLKCurrentTlmeはCACurrentMedlaTlmeになりました。
UIFont/UIColor vs.CG/GS* Ref
Fonts and colors are handled by
GraphlcsServices and CoreGraphics,
respectively.This used to be
exposed directly in UIKit for 1.x
(setColor:for example would
normally take a CGColorRef).The
new UIKlt,however,has wrapped
these primitives in Objective-C
guises. Convening back/forth
between the types is typlcally easy.
UIFont/UIColor vs.CG/GS* Ref
フォントと色はそれぞれGraphlcsServices と CoreGraphicsで扱われます。
これは1.xのUIKitでよく出てました。
(例えば、SetColorは、普通はCGColorRedを用いるでしょう)

しかし、新しいUIKitはこれらの基関数をラップしました。

新旧の型の変換をするのは、通常は簡単です。

Using PrivateFrameworks
In order to keep application
developers from using backend APls
of other applications(i.e.,APls that
are golng to change often and lead
to unstable. brittle applications),
Apple has moved most of their
internal-use-only librarles into
/System/Libray/PrlvateFrameworks,
which is not normally on the link
path.To add this back you need to
pass this directory to gcc with -F.
Using PrivateFrameworks
アプリケーション開発者が、他のアプリケーションのバックエンドAPIを使用できなように、
アップルは内部でだけ使用するライブラリーの大部分を
/System/Libray/PrlvateFrameworks/に移動しました。
これは、通常のリンクパスには入っていません。

バックエンドAPIを使いたいときは、このディレクトリをgccに-Fを使って加えてください。

Using undocumenled UIKit
The #1 thing to understand about
UIKit is that Apple mostly did't
change it.For some unknown
backward compatlbllity reason they
left in most of the 1.x classes,whlch
means that most code for l.x can be
compiled wlth only minor naming
dlfferences for the new platform.
(Thanks goes to JonathanZdziarski
(NerveGas)for flguring this out.)

UIAlertSheet - UIActionSheet
UIButtonBar - UITooIbar
UINavBarButton -???
UISliderControl - UIOldSliderControl
UISwitchControl - _UISwitchSlider
UIWebview - UIWebDocumentview

Using undocumenled UIKit
まず、アップルは、ほどんどUIKitの変更をしていません。

何らかの互換性の理由で、1.x のクラスの大部分を残しています。

1.xのコードは、新プラットフォームでのちょっとしたネーミングの差をなんとかするだけで、
コンパイルことができるようになるということです。

(これを考えたJonathan Zdziarski(NerveGas)に感謝しましょう)

UIAlertSheet - UIActionSheet
UIButtonBar - UITooIbar
UINavBarButton -???
UISliderControl - UIOldSliderControl
UISwitchControl - _UISwitchSlider
UIWebview - UIWebDocumentview

Alert/Action Sheet Dismissal
Pretty much all usages of dialog
boxes involved dismlsslng the dlalog
box during a buttonClicked:event.
Apple has renamed this to
didDismissWlthButtonlndex: and
does the call to -(void)dismiss

Double vs. Single Precision
A few places in the original UIKlt
librarles Apple was using double's,
even though pretty much everywhere
they use floats.These places have
been changed.One such example is
[UIProgressBar setProgress:(float)].
 
Automatic Keyboard Suppot
Apple has declded that manually
havlng t omanage the keyboards that
go with text input flelds is stupid,and
l must say l agree with them
Unfortunately,this means that code
that used to manually bring up
keyboards is now dangerously out of
date:you end up wlth two keyboards,
only one of which normally works.
 
CoreGraphics vs.lmageIO
Most programs that need to draw
thlngs to the screen do not need to
have complex data input/output from
said graphics buffers.All of this file
format and color munging code was
probably taklng up too much
memory,so it got forked out to a
different library:lmagelO.Examples:
CGImageDestiation/Source
 
UIApplicationMain(Class)
Previous,UIApplicationMaino was
passed the metaclass object of a
type that derived from the class
UIApplicationMain,which it would
then instantiated. Now it optionally
takes the names of two separate
classes that take on different aspects
of UIApplication's functionality.lf you
pass the name of your old class for
both these arguments you will get
seemingly identical behavior.
 
mprotect(),NX,and max_pro
While thls information doesn't apply
to applications developed for
JallBroken devices,it is still useful to
understand that Apple has started
taking measures to protect against
arbitrary code execution.ln additlon
to code sigining.pages that were
once writable can never be marked
executable,whlch means no JIT
oompilers or dynamic trampolines(in
other words,bye bye performance)
This particular issue has been
patched out of the kenel by Pwnage.
 
"Mouse" vs. "Touch"
Somewhere in the 2.x timeframe,
Apple realized that using the term
"Mouse" made no sense and
switched to "Touchl".Recoding these
can get diffcult(and I've so far failed),
but luckily we can call the(utterly
undocumented,of course)
UIApplicationUseLegacyEvents(YES).
 
Lack of Legacy Suppot
ln general,when the iPhone is
missing an interface,Apple didn't
really want you to use it anyway.An
example of thls is that UNIX'03 and
64-bit inode support is now
mandatory. This means that code
that may have used to work with
dirents(or some of the more crazy
areas of Mach threading)tend to get
messed up if compiled poorly on the
new system.lf you are using the
complete."Upgraded"Toolchain
instructions then this is likely to be
 taken care of, but otherwise you
 might have #define these features
 manually to make them work.
 (Actually,even #defines may not
help you,as Apple has also changed
the symbol mangling.lt's still useful
to list the types of changes,though.
_DARWIN_USE_64_BIT_INODE
_DARWIN_UNIX03
 

英文は画面キャプチャをOCRで読み込んだので、まだ読み取り時のミスが混在しております( i → l とか…。)


TextEditJコンパイルしてみました。コンパイルは通ったけど、起動してすぐアプリ落ちてしまう。

上のAutomatic Keyboard Suppotのせいかなあ…。落ちたときに何が起きてるかぜんぜん確認できないので、なんともしがたい。


Cydiaにあったテキストエディタ gTxtEdit入れてみました。

日本語入力もOK。日中韓2バイト文字も混在OKでした。

SAVE/LOADが、フルパス直打ちなのがきびしい。これはきっと、そのうちファイラーと連携してくれると思います。

あれ?なんかSAVE/LOAD動いてくれない…。2バイト文字入ってるとだめっぽい?テキストエディタ自体の動作はいい感じなので、このままバージョンアップしていってくれたらうれしいです。

ソースも公開して欲しいなー。…おっと、公開されてました!

2008/08/03 Hello World 2.0!新しい始まりなのだ!

iComicの作者のYamaさんが、Windows(&Ubuntu)でのiPhone2.0対応をされ始めているのを見て、僕も待ってられなくなりました!

実のところ、ひょっとしたら単純に今のコンパイラのヘッダとライブラリだけ入れ替えれば、ある程度コンパイル通るんじゃない?って甘い考えがありました…。

思い立ったが吉日なので、アップデート&Jailbreak!

もう戻れない。

Cydiaはインストール時に何やってるかを表示してくれるので、前のInstallerより好みかも。


iPhone用のコンパイル環境構築方法 を見ながら挑戦。ヘッダとライブラリ入れ替えてみたけどコンパイル通らず。甘くなかった。

指示に従ってLLVMのコンパイルもやってみようとしたのですが、configureがエラーで動いてくれなかった。僕の知識じゃ修正方法わからなくて、今はあきらめ。


ん?Cydiaのインストーラ一覧のDevelopのところに…iPhone2.0toolchainってのがある…!よくよく見るとGCCもある!これはもしかして、iPod touch上でコンパイルできる環境ということでは…?!

さっそく、GCCとiPhone2.0toolchainをインストール。先にGCC入れないとダメみたいです。

われらがBigBossによれば、1.0→2.0の対応をするには…

■ソースの変更

1.main() 関数の戻り値取得に使う関数、UIApplicationMain の引数を変更

Old: return UIApplicationMain(argc, argv, [Viewer class]);

New: return UIApplicationMain(argc, argv, @"Viewer", @"Viewer")

Viewerってのがアプリケーションクラス名ですね。

■Makefileの変更

1.CFLAGSに -I/var/include を追加

2.LDFLAG に -L"/usr/lib" -F"/System/Library/Frameworks" -F"/System/Library/PrivateFrameworks" -bind_at_load を追加

3.コードにサイン(?)を付けるために最後に ldidを呼ぶ。

Poof: main.o EditTableCell.o ListingTable.o common.o
$(LD) $(LDFLAGS) -o $@ $^
/usr/bin/ldid -S Poof

Poof がアプリ名、*.o がリンクするオブジェクトですね。

4.コンパイラを変更。CC=arm-apple-darwin9-gcc

あと、注意点として、UIWebKitの変更には対応してないから使えないってことと、LayerKitは無くなっちゃいました、ってことらしいです。

いつもの、ワールドさんへの挨拶をコンパイルしてみました。SSHで接続して、iPod touch 上でコンパイル。PCでやるのと比べてコンパイル速度遅いのはしょうがない。

そして無事コンパイル完了!コンパイル時に/System/Library/Frameworks/Foundation.frameworkがSSLとかセキュリティのメッセージを出しまくるけどエラーじゃないみたい。必要ないライブラリをリンクしてるからかも。

SSHから起動したところ、エラー出ずに起動はしてるっぽいのですが、iPod touchの画面は変わらず。むむ。

そういえば、2.0になってからはコンソールからのアプリ起動ができなくなった…って聞いたことあったので、ちゃんとアプリフォルダ作ってiPod touch から起動してみたところ…

うお!出た!

参考のため、ソース一式置いておきますね。とりあえずは、これでいろいろとやってみます。

いつかは、PCでのコンパイル環境もなんとかしたいところ。


インストール一覧見てたら、テキストWebブラウザLynxがあった。喜んで入れてみたのですが

しまった、カーソルキーが使えない。あと、コンソールじゃ日本語表示できなかったのでした…。

HP電卓もありました。

今回のバージョンは、アプリは1つで機種切り替えできる方式でした。


iPod touch 1.1.* の時代

LOG 2008

LOG 2007

iQuasi88


スクリーンショットは後日に撮影してますので、日付とか状況とかはそのときのものとは限りません。

感想・質問は→のちな(nochina@hamkumas.net)までどうぞ。


2007年10月21日作成
2008年10月12日更新

ひとつ戻る