このページに書いてあることは、iPhone OS 2.x で行っていたことです。
iPhone OS 3.xでは動作が異なっていたり、実行できないことがあったりしますのでご注意ください。
完全に iPod touch 保証外のことをやっています。
くれぐれも、リスクを考えた上で。何かあっても自己責任でよろしくお願いします。

要Jailbreakのコピー&ペースト対応エディタ gTxtEdit j-plusは、こちらです→

2009/02/14 Graffitiっぽいキーボードモジュール 日本語6 標準アプリでも使えるよ!

moyashiさんからの助言により、ひらめきました!謎はすべて解けた!

ついにやった!

標準アプリは、iPhoneOS 1.x..x の頃のタッチ制御APIが使われていたのだった!

2.x.x 系のタッチ制御 touchesBegan ~ touchesMoved ~ touchesEnded

これに追加して

1.x.x 系のタッチ制御 mouseDown ~ mouseDragged ~ mouseUp

これを実装してあげることにより、標準アプリでも使えるようになったのでした。

注意点:標準アプリでは、描画の軌跡が出ません。とりあえず、これは後回しで…。

ソース&辞書&実行モジュール(20090214版)

大富豪(?)辞書のJPDIC.sqlite ← 好みでモジュール同梱辞書と入れ替えて使ってください。

2009/02/13 Graffitiっぽいキーボードモジュール 日本語5 記号入力&予測変換対応&大富豪!

記号入力に対応しました。「・」(ちょんとタップ)で記号モードになります。記号モードは、1文字入力すると解除されます。

記号モードでの入力方法は、このあたりを参照して下さい。特殊記号モードには対応していません。また、TABの入力はできません。

現状、斜め線1本(「/」「\」)が、うまく認識できないみたいです。なにかいい方法ないか考えてみます。

予測変換にも対応しました。選択した変換結果から、予測して変換してくれます。

上の画面は「も」選択により「あり」「あります」…が出てきているというわけです。

これのために、テーブルのインデックスも追加になりました。(ファイルサイズもその分大きくなってます)

CREATE TABLE DICTIONARY (YOMI VARCHAR(128) COLLATE NOCASE,WORD VARCHAR(128),ASSOCIATION VARCHAR(128));
CREATE INDEX DICTIONARY_INDEX ON DICTIONARY (YOMI COLLATE NOCASE);
CREATE INDEX DICTIONARY_INDEX2 ON DICTIONARY (ASSOCIATION);

ソース&辞書&実行モジュール(20090213版)


大富豪(?)辞書をこのキーボードモジュールで使えるようにコンバートしました。辞書を入れ替えて使ってみてください。サイズが少し増えてますが、特にモタツキなく使えてると思います。

大富豪(?)辞書のJPDIC.sqlite

2009/02/10 Graffitiっぽいキーボードモジュール 日本語4 辞書のデータベース使用による高速化成功

辞書を、Sqliteデータベースにしてみました。富豪辞書で試してみたのですが、これが驚くべき効果です!起動待ちはありません。候補表示も、(ファイルのDBアクセスなので)、もたつくかと予想していたのですが、ぜんぜん大丈夫でした!

ポイントは、インデックスをちゃんとつけること。しかも前方一致検索のために、大文字小文字無視したインデックスをつけることです。→参考にしたページ

テーブルはこんな感じで作りました。

CREATE TABLE DICTIONARY (YOMI VARCHAR(128) COLLATE NOCASE,WORD VARCHAR(128),ASSOCIATION VARCHAR(128));
CREATE INDEX DICTIONARY_INDEX ON DICTIONARY (YOMI COLLATE NOCASE);

辞書の中身は、まだ単にインポートしてみただけなので、整理必要だと思いますが。

おそらくは、大富豪(?)辞書を入れてもいけそうな気がします。

ソース&辞書&実行モジュール

2009/02/09 Graffitiっぽいキーボードモジュール 日本語3

さすがに、読み込みに数分掛かっていては使うことは出来ないと思いますので、POBox on the Webの辞書を入れてみました。これなら、数秒で起動できます。

富豪辞書:10万語

POBox on the Web:5398語

というように、語彙数がぜんぜん違うので、変換されない語句は多いと思いますが、ひらがな多めのメモであれば、これで十分に使えるのではないかと。

ダウンロード → 軽量辞書

JPDIC.dat を上書きして使ってください。また、JPDIC.dat は、単なるUTF-8/CR改行/TAB区切りのテキストファイルですので、必要な単語は、追加していってください。

■現状のまとめ

Graffiti風入力は、http://www.bytearray.org/?p=91 を参考にしてください。

エリアの左の方に書くと英文字、右の方に書くと、数字として認識します。
描画の中心が右か左かで判定しているので、真ん中をはみだしてもかまいません。

アプリ起動後、最初のキーボードモジュール読み込み時に辞書を読み込みます。
iPhoneリセット後1回ではありません。アプリ起動ごとに1回です。
辞書の大きさにより、時間が掛かります。富豪辞書で1~2分、軽量辞書で数秒です。

記号入力はまだ実装していません。(実装するかどうか未定)

アプリによって、このキーボードモジュールが使えないものがあります。

パターン1:キーボード自体が表示できない。
このページに載っているgTxtEdit j-plusもこのパターンです。
iKeyEXでの処理なこともあって、なぜか分かりません。

パターン2:入力エリアは表示されるが、なぞっても線が出ない
結構多くのアプリがこれです。標準のアプリもほとんどこれです。
なぜかわからないのですが、キーボードモジュールでtouchイベントを拾うことが出来ません。

これは、通常使用において、結構致命的だと思います…。

この現象で、なにか解決につながりそうな情報を持っている方、いらっしゃいましたら教えてください。

ToFU Editor/FuEditor/夏ライオンfor iPhone での動作は確認できました。

2009/02/08 Graffitiっぽいキーボードモジュール 日本語2

辞書読み込みのとき、あ/か/さ/た/な/… で分けてメモリに読み込むようにしました。富豪辞書レベルの語彙数であれば、ストレスなく変換できるようになったと思います。

ただ、アプリ起動後、初回の起動で辞書をメモリに読み込む処理だけは遅い。1~2分程度、かたまります。

きっと、バイナリデータで一括読み込みにするとかしないとだめだ。現状だと、もっと軽い辞書を使うのがいいかもしれないですね。

候補の最後に「ひらがな」「カタカナ」「入力そのまま」が出るようにしましたので、辞書登録されてない語句の場合も、ひらがなカタカナ変換はできます。

僕はこれでだいたい満足しました。

ソース&辞書&実行モジュール

2009/02/07 Graffitiっぽいキーボードモジュール 日本語

PalmのPOBoxの富豪辞書を組み込んでみました。今はインデックスもなく全単語検索してますので、実行速度は遅いです。

また、最初にキーボードモジュールを起動したときは、辞書読み込みのため1~2分固まると思います。しばらくまってください。

左の方で書いたらアルファベット認識、右の方だと数字認識になる仕組みも入れてみました。

この後は、辞書の50音インデックスと、変換あり/なし切り替えをつける予定です。あと記号か。

ソース&辞書&実行モジュール

解凍して deb/Library 以下を /Library/iKeyEx/Keyboards/Gesture.keyboard に入れてください。無保証です。何が起きても自己責任でお願いします。

候補表示は、iKeyEXのPathTyperを参考にしました。POBoxはPOBox on the Webを参考にしました。

辞書は、UTF-8/CR改行/TAB区切りのテキストファイルです。

※今、分かっている不具合
途中に改行入ったら変換できません。
Deleteが変な動きすることがあるかも。
候補0件で確定されてしまう。

2009/01/31 Graffitiっぽいキーボードモジュール2

文字ごとの判定処理、大文字小文字シフト、描画ライン追加。左から右でスペース/右から左でバックスペースも対応。

下から上でシフト、シフト状態でさらに下から上でシフトロックです。解除も同じ。

6が難しい。やっぱり、英字/数字エリアを分けたほうがいいかなあ。

でも、わりと普通に使えると思います。問題は、使えるアプリと使えないアプリがあること…。

標準のアプリは全部ダメかも。なんでだー。

ソース&実行モジュール

解凍して deb/Library 以下を /Library/iKeyEx/Keyboards/Gesture.keyboard に入れてください。無保証です。何が起きても自己責任でお願いします。

2009/01/30 Graffitiっぽいキーボードモジュール

http://www.bytearray.org/?p=91 のマウスジェスチャー判定ロジックを、iPhoneキーボードモジュールに実装してみました。

ほんと、実装してみましたってレベルなので、まだまだ実用には遠いです。

アプリによって、動くものと動かないものがあります。touchイベントが拾えないものがあるみたい。標準のメモ帳もダメでした。


ソースはクリップボードモジュールベースです。コメントにそのあたりのロジックが残りまくってます。

ソース&実行モジュール

解凍して deb/Library 以下を /Library/iKeyEx/Keyboards/Gesture.keyboard に入れてください。無保証です。何が起きても自己責任でお願いします。

各文字ごとの特別判定ロジックはまだ入れてないので、「D」と「P」、「O」と「6」が区別できてません。英数大文字しか対応してません。

ジェスチャー判定ロジックの元のフラッシュプログラムのライセンスはRPLですのでお気をつけください。

2009/01/24 こりゃたまらんね

Clippyがコピー&ペースト決定版とおもっていたら!それ以上のが出てきた!「?Clipboard!うおお!

なんと、キーボードモジュールです!履歴つきコピー。

そして恐るべきことに、ソースが公開されてるのですよ!もー!

2009/01/21 Clippy!

JailbreakのCopy&Paste決定版が出ました!Clippy!これはすごいですよ。

えええー?どうやってんだこれはー。想像もできないです。

CopierciN作者の人も、感動しているみたいでした

でもなぜか、gTxtEdit j-plus上だと、うまく動かないです…。うーん。なんでだろう。

2008/11/24 絵文字きた!

iPhoneOSの絵文字、キーボードモジュールとして作られているわけなので、そのうち、普通に使えるようになるに違いないとは思ってましたけれど。

iPodayさんのところで早くもやり方が紹介されていました!うおお、早すぎる!

さっそく、ためしてみました。gTxtEdit j-plusで挑戦!

なにこれー。普通に使えるー!

いやもう、UITextViewコントーロールの懐の深さに恐れ入りました。

フォントとしてOSに入ってるわけだから、アプリの画面ラベルとかでも使って問題なさそうな気がします。

(AppStoreだと拒否されそうな予感がありますけど)

切り替えキーの横位置が、微妙にずれてて、同じ位置連打でキーボードくるくる入れ替えできないのが残念。

テンキーと同じだけの横幅が取ってあばよかったのにな。

そんで、テンキーの「。」「、」の順が入れ替わってしまったみたいです。よく分からん変更…。

gTxtEdit j-plusのコピー用キーワード「ら。」も変更した方がいいのかな。

2008/10/16 次回。MacBook、買うや買わざるや。

iPhone SDKに触れる機会がありました。最初、Interface Builderとソースとの連携が全く分かりませんでした。

31日間にわたってサンプルとソースを公開しているApps Amuckのチュートリアルにしたがっていくことで、なんとなく分かってきたような。そんな気がするような。

EricaサマのCookBookもPDFで買いました。この中のサンプルコードは Google Code で公開されてます。


Google Codeで、「iphone」や「UIKIT.h」で検索したら、iPod touch/iPhone用のソースがいろいろ見つかるかと思いますが、これらの大部分は、OS 1.*.* 用です。

NDAどころか、Appleから開発用SDKが出るという話すらなかった頃のものだと思います。

JailbreakしてOpen Toolchain2.0を使うなら、少しの変更でコンパイル通ると思います。が、正常に動作させるにはそれなりの修正が必要になると思います。

Apple製SDKでは、ヘッダもかなり変わってて、さらに使えなくなったフレームワークもあるため、コンパイル通すだけでもかなりの修正、もしくは作り直しが必要になるとおもいます。

ロジックの参考にはなると思いますが…。

でも、Open Toolchain2.0用や、Apple製SDK用のものがあるかもしれませんので、ソースの更新日付をチェックしてみると良いと思います。

それで、Open Toolchain2.0用や、Apple製SDK用のが登録してあったらぜひ教えてください。

僕の知ってるのでは、MobileTerrminalgTxtEditがOpen Toolchain2.0用でした。

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日作成
2009年02月14日更新

ひとつ戻る