【KtaiLibrary】バージョン0.1.0公開!

icon_ktaiお待たせいたしました!
Ktai Library 0.1.0の公開を開始しました。
上記タブ「Ktai Library for CakePHP」からダウンロードできます。

繰り返しになりますが、構築済みサイトにKtai Libraryを適用する場合は、app_controllerを上書きしないように、特に気をつけてください。バックアップをとることをお薦めいたします。

今後のバージョンアップについてですが、現在 app_controllerに書いているリダイレクト対応を、将来的にはコンポーネント中で行うようにしたいと考えています。他の記事でも書いていますが、現在のCakePHPで実装されています「beforeRedirectコールバック」が想定していない実装になっているためで、チケットを投げている最中です(regenさんありがとうございます)。修正されたら、Ktai Libraryも修正を行い、さらに手間のかからない導入が出来るようにしたいと考えています。
機能的なバージョンアップは、後は細々としたものになりそうです。GPS対応とか、そういったものになりそうです。また、現在い携帯SCOについて勉強を始めたところでして(遅すぎ?)、そういったものも興味あります。もしアイデアなどありましたら是非お寄せください。

【追記】
ダウンロードページの0.1.0のファイルリンクが間違っていました。
0.0.2版がダウンロードされてしまった方は再度ダウンロードし直してください。
申し訳ございません。

【iPhone】ViewControllerの切り替えができた!

相当苦しんでいたViewControllerの切り替えですが、ようやく任意のコントローラー内のViewを表示出来るようになりました。ボタンを押して切り替え、という仕組みはまだ実装していませんが、たぶん問題ないと思います。

なんのことはないです。InterfaceBuilderで、対象ViewControllerの、読み込みたいnibの設定をしていなかったため、コントローラ内のviewアウトレットが不正になっていてエラーが出ていただけでした。プロジェクトを作る際にビューベースを指定すると、何も設定せずにビューのnibを読み込むのですが、ただ単にViewControllerのインスタンスにnibの指定があったのに「クラス名をnibファイル名を同じにするとデフォルトで読み込んでくれている」と勘違いしていたのがそもそもの原因でした。
また、appAppDelegateに見えているviewControllerはあくまでも見えているだけで、ソースコード内できちんと定義していないとエラーが出ることも分かりました。そして、必ずこれを使わなければいけない、ということでもないようです。オリジナルのViewControllerのインスタンスを好きな名前で作り、そこからビューを呼び出せます。

基本的にXcodeおよびInterfaceBuilderは「何かを自動で設定してくれる」ことはなく、結局は全部自分で記述しなければいけない、というのが基本的なルールのようです。

とりあえず面倒くさいので、全ての画面(のコントローラ)をappAppDelegateクラス内で登録し、nibでも全ての接続を済ませた状態で、内部で画面モードみたいなフラグを持たせて、そのフラグでビューを入れ替える、みたいな仕組みで実装してみようと思っています。本当は必要な画面を都度読み出してやる方がメモリに優しいと思いますが、それはおいおいということで。

入り口に立ってから2週間。やっと一歩前進したという感じです。まだまだ高いハードルが目の前にありますが、頑張っていきたいと思います。

ちなみに、Tplcutterは大きなバグが見つかってしまい対処をしているところです。Cake対応とその他対応の2種類で異なる動きをするので、バグチェックも大変です。

【iPhone】[書籍]詳解Objective-C2.0

合宿ですが、無事に終了し、日曜日に帰宅しました。
ですが残念ながら…大きな成果はありませんでした。

ビューそのものを切り替える方法は分かりましたが、将来的にViewControllerを利用したプログラミングを行うことを想定してViewControllerを切り替えるプログラムを研究していました。ところが、ViewControllerを扱うサンプルプログラムが少ない上、とりあえずデリゲータ上のアウトレットに登録してみると例外が発生して起動できなくなる始末。宿は常時ネット接続できないためインターネット上で情報を得ることも出来ず、あえなくギブアップしました。

ViewControllerは切り替えるものではないのでしょうか? 考え方としては、View毎に専属のコントローラを作成し、その中での処理は全部そのコントローラに任せたいのですが。それとも、1つのコントローラの中で場合分けをして、各ビューを切り替えるんでしょうか?

とまあ、まだまだ難題を抱えているのですが、その中で、やはりこの本が役に立ちました。

「詳解Objective-C2.0」という本で、おそらくObjective-Cに関するほとんどをこれで解決出来るんじゃないかと思われるほど詳細に書かれています。Xcodeを利用した例になっていないのが唯一の残念な点ですが、開発時に辞書代わりとして必ず手元に置いておきたい本です。

まあでも、とりあえず学習向けの書籍やサンプルコードはたくさんあるのですが、実用的な、例えばメニュー画面や設定画面等必要な機能をどうやって実現するのか、その一連の仕組みを解説してくれている本があると非常に助かるのですが(出来ればXcode環境に沿った形で)。洋書でも構わないので、そういった本があったら是非ご紹介いただけると(汗)。

【iPhone】Interface Builderで編集しているアレは何者?

Xcode3.1を用いてCocoaプログラミングをして疑問に思うことと言えば、Interface Builderで編集している「アレ」の存在でしょう。xib形式のファイルで書かれている中身は、いったい何者なんでしょう?

前回の記事で「Windowsでいうリソースファイル」と書いたと思うのですが、実際には少し違うようです。インターフェースの配置に関してはそのようなものなのですが、基本的にあの記述は「インスタンスの記述」のようなのです。実際にクラスオブジェクトを表現しているのはソースの方で、それを用いてInterface Builderで「実行時に必要なインスタンスをあらかじめ作っておく」もののようです。

では、xibで指定したインスタンスは、何処で作られているのでしょう。
main.mや(プロジェクト名)AppDelegate.mを見ても、xibに相当するものを読み込む仕組みが何処なのか、よく分かりません。が、おそらくこの辺で行われているのでしょう(知っている方がいらっしゃったら是非教えてください)。

ただ、Cocoaプログラミングでは、インスタンスが格納されている場所を意識する必要はなさそうです。何故なら、これらインスタンスはメッセージ形式で受け渡すため、ぶっちゃけIDが分かっていればどこからでもアクセスは出来るからでしょう。
実際に前回の記事で、FooというNSObjectの派生クラスを作り、それをInterface Builder上でインスタンスとして作りました。普通なら、FooからWindowに配置されているパーツ(UIButtonやUITextFieldなどのインスタンス)が、少なくともFoo内で定義されているインスタンスではないため、実体へのアクセスは出来ないはずですが、アウトレットの仕組みでアクセスが出来ています。アウトレットは実はID型のプロパティであり、ID型はもっと言えばただの整数です。Interface Builderでは配置したパーツにユニークなIDをあらかじめ振っているため、そのIDを使ってアクセスをするのです。
また、Interface Builderで「接続」を行うのですが、これはどういう事かというと、各インスタンス内のアウトレットに初期値として該当IDを振る作業のようです。このことからも、xib内のアイテムがインスタンスであることが分かりますね。

IDで管理する概念は実はWindowsでも普通にやっていて、リソースファイルを覗いてみると、しっかり配置したアイテムにユニークな番号が割り振られています。しかし、Windowsプログラミングとの大きな違いは、結局はWindowsではインスタンスそのもの(もしくは参照)を引数として渡している、という点です。リソースファイル上のアイテムへアクセスする場合は、リソースからインスタンスを入手するためのAPIでインスタンスを入手し、それを使ってアクセスします。この際にリソースIDを用いますが、それから先は基本的に不要です。
ところがCocoaでは、xibでアイテムを呼び出すにも、プログラム上でアイテムを作り出すにも、帰ってくるものはIDで、インスタンスの実体はどこか分からないところにひっそりと存在しているようです。つまり使い手にとってIDが全てになり、逆にどんなケースでもIDだけを扱っていればいいわけで、あれこれ考えなくても済む、というわけです。
基本的にWindowsは普通のC/C++のルール上でAPIが出来ているのと、Windwsリソースの概念は後付けで、そもそもDOSプログラミングの延長上であったため、無理矢理とってつけた感が強いのですが、CocoaはObjective-Cのメッセージ概念のもとに成り立っているというのか、最初からそれありきで作られているような点で差があるのでしょう。
実行速度の面では、メッセージ形式だとステップ数が増えそうな気がします。IDからインスタンスを特定するという部分が若干冗長だとは思います。だけど、まあそれは誤差の範囲かも知れませんね。Objective-Cの記述はまだ慣れないのですが、確かに手順の記述に関しては、C++で記述するよりは簡潔かもしれません。

ちょっと横道にそれましたが、xibに関してはおおむねこんな感じですかね。
Windowsプログラミングとはやはり全然違いますね。

【iPhone】Cocoaプログラミングの入り口に立つ!

ようやくCocoaプログラミングの入り口に立つことが出来ました。

以前の記事で「Interface Builderが使いにくい」「参考書がない」と言っておりましたが、試行錯誤して、私が使っている参考書のサンプルプログラムと同じ動作をするものをiPhone用アプリとして作ることに成功しました。

手順としてはこんな感じですかね。

1:[Xcode(以下X)]プロジェクトを作る

2:[X]NSObjectのサブクラスFooを「新規ファイル」で作成する

3:[InterfaceBuilder(以下I)]NSObject(のインスタンス)を作成し、クラスをFooとする

4:[I]Fooの中に、必要なアウトレットとアクションを作成する

例えば、テキストフィールドとボタンを設置するのであれば、text1アウトレットとdoActionアクションを追加。

5:[I]window内にパーツを配置

例えばボタンとテキストフィールドを配置する。

6:[I]controlキーを押しながらFooをクリックすると黒いウィンドウが開く。その中のアウトレットとアクションに対して、一番右端の+マークをwindow内のパーツにドラッグし、「接続」をする

この操作がどの情報にも詳しく書かれていないため、初心者にとっての第一関門かもしれない。
例えば、text1の右端の+をドラッグして配置したテキストフィールドへ、doActionをドラッグしてボタンへ(更にメニューが出るが、これはボタンの状態を表す。適切な動作を選ぶ)。

7:[I]Fooを選択した状態でFileメニュー内の「Write Class File」でFooクラスを書き直す

8:[X]アクションの中身を書く

9:[X]ビルドして動作確認・完成

iPhoneに限らず、Xcode3.1でMacアプリを作るのにはこの方法になると思います。サンプルプログラムはネット上などにもありますが、手順についての記述はなかなか無いので、参考になれば幸いです。
なお、UILabelやUITextFieldの値に相当する部分はプロパティ名が変わっているらしく、古い参考書を参考にする場合は注意が必要です。「setStringValue:」とか書かれているのは「setText:」とします。ちなみにプロパティに直接アクセスするのではなく、アクセサを呼び出すのが基本ですので、setTextはアクセサで、実際のプロパティ名は「text」です。リファレンスを読む際に注意が必要ですね。

とりあえず、Interface Builderに配置したボタンなどを操作することは出来るようになったのですが、次の目標としては、ビューを扱えるようにならないとです。ページ切り替えなどをしなければなりませんので。それから、テーブルの使い方とか、複雑なアイテムの操作と、あとファイルの扱い方。それができればようやく目標のアプリまでいけそうです。夏休み中にこれらの基礎技術がマスターできるといいな……

ちなみに私が用いている参考書は次のものです。
日本語で書かれていて、すぐに手に入る本はこれしかなかったので。
旧ツールとの操作方法の違いをのぞいては、比較的読みやすい本だと思います。
この本がなかったら、まだあれこれ悩んでいたと思いますので、とりあえず役に立っているかな?
もし行き詰まっているようでしたら、こちらも是非ご利用いただければ。

【iPhone】難解Xcode3.1(のInterfaceBuilder)

iPhoneアプリを作る勉強をしています。

正直難解です。
とりあえずInterfaceBuilderを使ってレイアウトしましたが、肝心のプログラム制御まで到達していません。

参考書は全く役に立ちません。というのは、日本語書籍のほとんどはXcode3.0以前を前提で書かれているらしく、ツールの操作方法は勿論、ツールの役割すら違うようなのです。
簡単に書きますと、参考書には、InterfaceBuilderでNSObjectのインスタンスを作り、actionとアウトレットを指定し、ファイルに書き出して使用…という流れのようですが、現在は実際にはXcodeでまずインスタンスを作り、あとからInterfaceBuilderでやるようなのです。
ちなみにInterfaceBuilderで編集するものはWindowsでいうリソースファイルなのですが、正直リソース内でオブジェクトを編集したり、さらに同じインスタンスをコードでも記述しなければならないとか、訳分かんないです。こういったものはアイテムを配置した、もしくは必要なときに勝手にソースに反映されるべきではないかと思います。VisualStudioに使い慣れているからかもしれませんが、Xcodeは現時点で無駄だと思う手続が多い印象で、大変に使いにくいです。

オライリー本のように、全部のアイテムをプログラムで生成するようなやり方なら、InterfaceBuilderの訳分かんない作法に振り回される必要もなさそうなので先に進めそうですが、でも現在作成しようとしているものはビューの切り替えを何個もしなければならないとか、ビューを沢山用意する必要があるとかで、GUIなツールでの編集もないと困るので、覚えなければおそらく躓くと思います。

というわけで、いきなり制作物を作る課程で勉強していこうと思っていたのですが、そのやり方は無理であると判断。地道にHalloWorldから始めた方が早そうだ…ということが分かったのが現在の状況です。

とにかく参考になる資料が少ないのが問題です。Windowsプログラムがどれだけ楽なことか。
MacBookのタッチバッドの反応もイマイチでそっち方向でもストレスが溜まっているので、現在の状況がかなり苦痛で心が折れそうです。AppStoreの日本語アプリがまだまだ少ないのですが、皆さん私と同じ様な状況なんでしょうかね? ネタはたくさんあるのに形にならない状況なので、ホント辛いです。誰か作ってくれるとホントに嬉しいんですけど(^^;;;

もうじき会社も夏休みに入り、まとまった時間がとれそうなのですが、その間になんとか解決したいところです。夏休み中に目処が立ったら、最終日は温泉につかってのんびりと癒されることにしよう、うん。

【iPhone】オライリー本買いました

いやー、Amazonって凄いですね。
朝4時頃に注文した本が夕方に届くんですから!
「お急ぎ便」の威力は凄まじいです。

というわけで、オライリーのiPhone本(洋書)を買ってみました。

ざっと読んでみましたが…う~ん、これは難しいです。

まず、硬派なことにスナップショット等一切無く、オール活字! 英語嫌いには全く優しくないです。オライリー本であることを忘れていました。
それから、Xcodeに沿った記述ではなく、いきなりgccを叩くようなやり方なので、今風な作り方には全く役に立ちません。必要なところをコピペして作っているような応用力のない方には全く向いていませんのでご注意!

良いところもあって、マルチメディア系の操作の仕方や画面エフェクトのやり方等が載っていて、要所要所で役に立ちそう。とはいえ、私は英語が苦手なので難解であることには変わりないのですが。
また、全く平らなソースなので、フレームワークの仕組みが分かりやすいというのもありますね。そういった意味ではこちらの方が初心者向けかもしれません。現状日本語版のiPhone開発本が無いので、日本語Cocoa本と組み合わせて読むのがよいかもしれませんね。

読み手を選びますが、良い本であることは間違いなさそう。
これ1冊で済むとは思いませんが、あって損はないと思います。

【iPhone】Safariやメールが落ちる件

現在、iPhoneで最も極悪な不具合は「ブラウザやメールがハングアップし、メインメニューに戻されてしまう」点でしょう。よりによって長文のメールを書いているときとか、重要なサイトを開いているときとかに発生したりとかして、これによってストレスがたまっている人は多いのではないかと思います。

私も当然ながらこのような境遇に見舞われたことがあり、それによってブログの文章を失ったりしました。まあ、本体を投げつけるほど憤慨はしませんでしたが、確かになんとかしてもらうに越したことはない不具合です。
OSが近々バージョンアップされる予定があるようで、その際に直ってくれるのが一番良いのですが、私が経験した範囲で、実際に起きたケースと、その時の状況に一定の法則がありそうですので、もしお役に立てればと思い書いておくことにしました。確定的でなく、あくまでも事例ですので、参考程度にお読みいただけますと幸いです。

【iPodを動かしているときは危ない!】
基本的に、バックグラウンドでiPodが動いているときはほかの動作がかなり重くなるため、それがかなり影響しているのではないかと。最近は一旦iPodを止めてからするように心がけたところ、頻度は下がったように思います。

【電波の入りが悪いところはかなり危ない!!】
地下鉄に乗り込んでサイトを閲覧していて、電車が発車した場合、新しいページを見に行った瞬間にかなりの高確率でSafariが落ちます。つまり、電波が遮断されてしまい探している状態の時にネットアクセスが発生した際の処理で、何らかの不具合があるんじゃないかと推測します。

【ページを複数開いた状態でページ遷移させると危ない!】
新しいページを開くとメモリがかなり消費されるようで(まあ当たり前かもしれませんが)、だんだんとページを開くのが重くなり、ついにその瞬間がくる…みたいな場合が多いです。キャッシュやページの履歴管理に問題がある可能性も?

【JavaScriptのあるページを開くと危ない!】
Ajax等、かなり高機能なJavaScriptアプリの存在するページを開くと、かなり不安定な動きをし、最後に落ちる…ような挙動をするようなので、この辺も注意点になると思います。

【日本語キーボードが複数あると危ない!】
これは発売当初から言われているものですが、日本語の入力がテンキー式とフルキー式の2種類、それから半角英字入力として英字キーボードと計3つが存在しているため、そのままでは文字入力がかなり重いです。この状態で複数ページを開いたりすると、かなり不安定になり、最後に逝きます。テンキーかフルキーボードのどちらかお気に入りな方を残し、1つ外した方が格段に安定します。

また、別の方法として、OSのバージョンを上げるとキー入力が軽くなるという報告もあります。やり方は、iTunes上で「復元」をすると若干OSのバージョンが上がる、というものです。ここでは詳しく紹介しませんので、興味ありましたら別のサイトをご覧になってください。ちなみに、自分も試してはいますが、確かに少し軽くなったような気がします、が、それほど違いはないようにも思います。もう少し待って正式な新バージョンの方を期待された方が良いかも?

以上が、当方で要注意と考えている点です。

技術的な話をしますと、アプリを作る上でメモリ管理とCPUパワーについてかなりナーバスにならないといけない、みたいな情報がネット内で書かれているようですので、その辺が影響しているかもしれません。また、メモリリークやデブリが蓄積しやすいのかもしれません。そういった意味で、こまめな再起動は今のところ有効かもしれません。

【iPhone】アプリ開発の研究

まだ試用段階ですけど、開発ツールを触り、アプリ開発の研究をしています。

私はMacアプリの開発はしたことがないのですが、まず「Objective-C」という言語を覚えなければならず、ソースコードの読み方に苦戦しています。基本的には「記述方法の異なったC++」なのですが、C++を使っていた者としては、便利な部分も不可解な部分もある、という感じですかね。まあでもやっていることは一緒のようですので、一からがっつり勉強しなくてもなんとかなりそうな感じです。

問題はどちらかというとAPIのほうで、主要技術である「Cocoa touch」に関する日本語文献が全くないところです。これはApple側で開発者に対して守秘義務を課しているのが原因で、私も実際に多くを語ることは出来ません。基本的にはMacアプリと作り方は同じようで、もっとぶっちゃけて言えばWindowsアプリをVisualStudioで作るのとあまり変わらないようです。ただ、Viewのリソースをどうやって切り替えるとか、どこに書いたら配置したオブジェクトを操作できるとか、そういったAPI作法の取っかかりが欲しいところです。オライリーからiPhoneのデベロッパー本が出ているみたいで、購入した方が良いかなとは思っているんですが、英語版のみで日本語ではない点がネック。まじめに英語を勉強しておけば良かった…と毎回思っていますが、今回も例に漏れず、という感じです(大汗)。

それよりはMacアプリ向けの本を買った方が参考になるのかもしれません。どちらにせよ、私に今足りないのは、OSX向けアプリの開発ノウハウが全くない点で、作りたいもののアウトラインは出来ているものの、それをどうやって実現するか、という部分が全く考えることが出来ないです。この辺を早急に解決して、8月中には第一弾のアプリを発表したい、かな。

話は変わりますが、Tplcutterはもちろん開発中で、今日もいろいろやっていましたが、ちょっと遅れています。
複数appの実行は実際に動いていて、良い感じですが、テンプレートをサブディレクトリに置いたときの処理を入れた方が良いか、現在悩んでいるところです。この辺の処理は前バージョンから流用してお手軽にいこうと思っていたのですが、ここを直すとなると書き直しになりそうなので。cake以外で使う場合を想定しているので、対応しないとやっぱりまずいかなーと思っています。
本業の方でも使いたいと思っているので、早急にやっつけたいんですが…前述のiPhoneアプリの研究との両立が難しいです。

【iPhone】異なるiTunesへ移行する方法

それとないことを書いていたと思いますが、iPhone用アプリを研究・制作するために、MacBookを買いました。今までほとんどMacを使ったことがないため、分からないことだらけです。とりあえず買って1日目で2回OS再インストールをしました(大汗)。まさか、個人フォルダ名がデフォルトでメールアドレス名になって、それが後から変更不可能だとは思っていなかったので……

Macの話はまた後日するとして、とりあえずiPhone関連の事象は全てMacBookで行いたいと思い、手始めとしてWindows内にあるiTunesの情報全てをMac側のiTunesに移す方法を考えることに。そのままMacBookにiPhoneを繋ぐと、iPhoneの情報が全て失われるのです(正確に言うと、現状何も入っていないMacBookの情報とiPhoneを同期してしまうため、結果としてまっさらになってしまう)。せっかく作った音楽ファイルを全て失ってしまいかねませんので、慎重にやらなければなりません。

まず、現状使っていたWindows版iTunesでiPhoneと同期をします。同期を完了させ、最新の情報になったことを確認します。
次に、「ファイル→ディスクへバックアップ」を選び、iTunes全体をバックアップします。全容量分のCD-RもしくはDVD-Rが必要になります。
バックアップが完了したら、今度はそのディスクをMacのiTunes上で読み込ませます。すると「バックアップを復元するか」というようなダイアログが出るので、それを実行させると、バックアップの復元が始まり、全てのデータがMac内に移行できます。
最後にiPhoneをMac側で同期して完了。最初全て消去されてしまいますが、その後に復元が始まりますので大丈夫です。

気をつけなければならないことは、iTunesStoreやAppStore等で購入したものの復元で、場合によっては各Storeから復元しなければなりません。「インストールできる回数」が1減りますので気をつけてください。この辺の作業はちょっと複雑で、購入した端末(PC/iPhone)で挙動も異なるようなので、マニュアル化が難しいです。まずは購入履歴リストを見て、そこからいろいろ試してください。

以上の方法は、購入したコンテンツの復元以外に関しては(というかどの方法でもこの問題には突き当たると思いますが)おそらく音楽データを直接吸い出してインポートするよりも遙かに楽に作業できますし、曲リストは壊れないし、その他の情報も問題なく移行できるのでおすすめです。
また実践したとおり、異なるOS間でも問題ないです。同OSなら、なお問題ないでしょう。
DVD-Rの消費なしに出来る方法が一番良いのですが、副産物としてバックアップディスクが出来るので、もしもの時のために保存しておいても良いかもしれません。

とりあえずiTunesの移行は終わりましたし、開発ツールもインストールして動作確認もしましたので、いよいよアプリを作り始める研究に取りかかりたいと思います。