Hatena::Groupiphone-dev

haoyayoi Dev Style このページをアンテナに追加 RSSフィード

2009-08-29

Snow Leopardインストールで操作が必要になるもの幾つか

| 21:34 | Snow Leopardインストールで操作が必要になるもの幾つか - haoyayoi Dev Style を含むブックマーク はてなブックマーク - Snow Leopardインストールで操作が必要になるもの幾つか - haoyayoi Dev Style Snow Leopardインストールで操作が必要になるもの幾つか - haoyayoi Dev Style のブックマークコメント

Snow Leopardをインストールして、かなり動作がきびきびしているものと思われます。が、それの代償というべきか、色々と環境調整も必要になりました。以下ログのようなものです。

XCodeのインストール

Snow Leopardのインストールディスクにアップグレード版が含まれています。ディスク不良か読み込み不良なのか、いずれの場合でもインストールに失敗した場合はXCode 3 - Snow Leopard - Apple Developers Connection(要ログイン)からダウンロードしましょう。

iPhone SDK for Snow Leopardのインストール

同じくiPhone Developer Connectionよりダウンロードします。

MacPortsのインストール

前準備なしにSnow Leopardにアップグレードしてしまうと、portコマンドを実行しただけでエラーとなります。アップグレード前に一度全て削除推奨です。

(参照:Snow Leopardにアップデートした後に気をつけること)

sudo port -f uninstall installed

うっかり削除する前にインストールしてしまったら、まずSnow Leopard対応インストーラにてインストール。その後、上記の全削除を実行。そして、必要なものを入れていきます。

なお、対応インストーラ導入後に

sudo port upgrade installed

にてまとめてアップデートという手段もありますが、ライブラリによってはアップグレードに失敗してそこから先に進まなくなるものもあるので注意が必要です。

2009-08-23

SAXパーサでRSSやHTMLを解析する

21:30 | SAXパーサでRSSやHTMLを解析する - haoyayoi Dev Style を含むブックマーク はてなブックマーク - SAXパーサでRSSやHTMLを解析する - haoyayoi Dev Style SAXパーサでRSSやHTMLを解析する - haoyayoi Dev Style のブックマークコメント

XMLHTMLを内部で解析できればアプリ作成でも幅が広くなると思い、只管パース用のクラス作成に没頭してました。マイコミジャーナルの記事にて各々の関数の説明が、allnightappsさんの記事にて大まかな流れがだいたい汲み取れると思います。

ここではSAXハンドラの定義について触れてみることにします。

参考リンク

libxmlの指定

「他のリンカフラグ」に-lxml2を指定し、「ヘッダ検索パス」にlibxml2へのパスを指定します。パスはバージョンに合わせてください。

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2

ヘッダへの追記

#import <libxml/HTMLparser.h>

SAXハンドラの定義

パースの際に必要なメソッドの定義など行います。SAXパーサのハンドラにはいくつもの要素がありますが、必要なものだけを定義でも問題ありません。今回は開始タグ、閉じタグ、タギングされたテキストの判定を行っています。

SAXパーサハンドラにて指定した関数が、クラスメソッドへ値を渡していく流れとなっています。

//クラスメソッド
@interface Parser (private)
- (void)startElementName:(const xmlChar*)name attributes:(const xmlChar**)attributes;//開始タグ用
- (void)endElementName:(const xmlChar*)name;//閉じタグ用
- (void)character:(const xmlChar*)ch length:(int)length;//タギングテキスト用
@end

//SAXパーサ用関数の定義

//開始タグ判定時に実行される関数 StartElementSAXHandle
//引数:: ctx = ハンドラ、name = タグ名、atts = 要素(配列)
static void StartElementSAXHandle(void *ctx, 	const xmlChar * name,	const xmlChar **atts) {
    [(Parser*)ctx startElementName:name attributes:atts]; //定義した開始タグ用メソッドに渡す
}

//閉じタグ判定に実行される関数 EndElementSAXHandle
//引数:: ctx = ハンドラ、name = タグ名
static void EndElementSAXHandle(	void *ctx, const xmlChar *name) {
    [(Parser*)ctx endElementName:name];//定義した閉じタグ用メソッドに渡す
}

//タギングされているテキスト判定時に実行される関数 CharacterElementSAXHandle
//引数:: ctx = ハンドラ、ch = テキスト、len = テキストの長さ
static void CharacterElementSAXHandle( void *ctx, const xmlChar *ch, int len ) {
    [(Parser*)ctx character:ch length:len];//定義したタギングテキスト用メソッドに渡す
}

//ハンドラの定義(4つしか定義してませんが、これ以外にも複数存在します)
static xmlSAXHandler gSAXHandler = {
.initialized    = XML_SAX2_MAGIC,
.startElement   = StartElementSAXHandle, //要素開始時に実行される関数を指定
.endElement     = EndElementSAXHandle, //要素終了時に実行される関数を指定
.characters     = CharacterElementSAXHandle //テキスト判定時に実行される関数を指定
};

パースの流れ方

<data>test</data>

上記のようなxmlの場合、dataの開始タグが判定された際にStartElementSAXHandleが実行されます。その後、タギングされているテキストである「test」が判定されて、CharacterElementSAXHandleが実行されます。最後に閉じタグにてEndElementSAXHandleが実行となります。

f:id:hao_yayoi:20090823213036p:image

データ保持

SAXパーサでは、データを取得しつつパースが走るため、逐一パースされる度にデータを保存する必要があります。よって、テキストを保持する場合にはNSMutableStringなどによって追加する形になります。以下はタギングされたテキストを保持する例です。

- (void)character:(const xmlChar*)ch length:(int)length {
	NSString* _strpar = [[NSString alloc] initWithBytes:ch length:length encoding:NSUTF8StringEncoding];
	[_mutableStr appendString:_strpar];
	[_strpar release];
}

2009-08-14

perl製Apple Push Notification Service

| 07:03 | perl製Apple Push Notification Service - haoyayoi Dev Style を含むブックマーク はてなブックマーク - perl製Apple Push Notification Service - haoyayoi Dev Style perl製Apple Push Notification Service - haoyayoi Dev Style のブックマークコメント

以前Push用フレームワークについて取り上げた際に述べていた書き下ろしモジュールですが、CPANへの申請が完了しています。

Net::APNS

小さいバージョンアップが入っていますが、これはパッケージングミスの修正です。

なお、丁度時期前後して同じperl製のフレームワークが幾つか登場しています。

結果的にやってることは全く同じなんですが、利用している他のモジュールや、それまでに存在するアプローチが違っています。名前空間が同じモジュールを既に使っていればその名前空間に合わせたりと、最適なやりかたで行うことをお薦めします。

2009-08-01

iPhone OS 3.0.1への実機ビルド対応について

| 10:54 | iPhone OS 3.0.1への実機ビルド対応について - haoyayoi Dev Style を含むブックマーク はてなブックマーク - iPhone OS 3.0.1への実機ビルド対応について - haoyayoi Dev Style iPhone OS 3.0.1への実機ビルド対応について - haoyayoi Dev Style のブックマークコメント

SMS脆弱性に対応するためにiPhone OS 3.0.1のアップデートがきていますが、Xcode自体は3.0までしかバージョン対応なされていません。

これについて何もアナウンスが無い訳でもなく、ADCにOS3.0.1への対処方法がドキュメント化されています。

iPhone OS 3.0.1 Advisory(要ログイン)

対処といってもやることは本当にシンプルです。

なるほどなるほど2009/08/03 20:55たすかりました!(^^)

kimadakimada2009/08/05 22:40先ほどハマりかけたところで、この情報を見て対処できました。ありがとうございます。
ただ、Appleのドキュメントがよくなくて、コピペしろと言っている文字列に改行が含まれているので、一旦、テキストエディタなどにペーストして改行を削除してから、ターミナルにコピペし直した方がいいですね。

2009-07-31

Push Notification 用フレームワーク

| 22:53 | Push Notification 用フレームワーク - haoyayoi Dev Style を含むブックマーク はてなブックマーク - Push Notification 用フレームワーク - haoyayoi Dev Style Push Notification 用フレームワーク - haoyayoi Dev Style のブックマークコメント

iPhoneへのPushに用いるサーバサイド用フレームワークについて色々と検索してました。ssl通信のためにopensslをラップする感覚です。既に開発されたものが転がっていたので並べてみます。

どれを使っても基本的な動きは同じ。好きな言語を使ってみることをお薦めします。


くまなく探してみたんですが、perlだけ見当たりません。perl脳なため、仕方なく自力で書き下ろし。現状、pushの仕様と言語の相性が悪いのか、あるいは利用しているモジュールの動きがそもそもpushの仕様に沿っていないのかもしれませんが、ssl上で書込み出来ているのにiPhone側にpushが届いていない感じです。でも頑張れるだけ頑張ってみようと思います。

ちなみにNet::SSLeayを使って書いてます。