2009/09/30

[java][coldfusion]cf8でcfservletを使う

超久しぶりのcfネタ

ちょっとjavaサーブレットに触れたので、cfからjavaサーブレットを実行する方法についてまとめてみようかなと。
(環境は、cf8なので、7以前の場合は、若干、違うかもしれません。)

クライアントの場合、Java SDKが既にインストールされている場合は、超簡単。

まず、作ったjavaファイルをコンパイルするのですが、その際、下記のようにして、コンパイルします。

hoge>javac -classpath ".;C:\CFがインストールされている親ディレクトリ\lib\etc\servlet-api-×.×-×.×.×.jar" hoge.java

で、コンパイル完了後、cfの所定のフォルダにおきます。

置き場所は、

C:\CFがインストールされている親ディレクトリ\wwwroot\WEB-INF\classes

で、後はcfmファイルから実行するだけなのですが、ちょっとプログラムが特殊で下記のように組む必要があります。

<cfset GetPageContext().include("/servlet/hoge")>

実際には存在しない「servlet」ディレクトリと記述するところがポイントですね。

こんな方法で、jspも実行できるみたい(検証していないので、確実なことがいえないのですが。。。)

2009/09/29

[google gadget]deliciousガジェット不具合解消(version up)

google gadgetの仕様バグだったのですが、一度、選択したタブを再現しようとした際に、うまく再現できない不具合がありましたので、その不具合をなおしました。

具体的に問題となったポイントはここ↓

<Require feature="setprefs"/>
...
<UserPref name="selectedTab" datatype="hidden"/>

via:Tabs

実際に上のようにhidden項目を設けてもうまく動作しないので注意が必要です。

2009/09/28

[oracle]Number型に関する注意点

久しぶりのoracleネタ

意外と忘れがちなので備忘録として、一般的にNumber型をカラムなどに含める場合に、

Number(桁数)

としますが、これは、

Number(桁数,0)

と等価でありまして、

Number(m,n)

と定義した場合、mの中には、nの桁数も含まれていることに注意したいです。

つまり、mは整数部分だけでなく、小数点以下の部分も含まれているということです。

例)整数部:3桁、小数点以下2桁の場合

Number(5,2)

参考サイト
おらおらSQ:NUMBER

2009/09/27

[Objective-C][iPhone sdk]一つのセルに複数行を表示

したくなった場合を調べました。

まず、テキストラベルの設定。これでとりあえず複数行表示できるようになります。numberOfLines はラベルの最大行数を指定するもので、0なら制限無く改行します。
cell.textLabel.numberOfLines = 0;

via:UITableViewCell 複数行のラベルを表示する

まじで!!
こんなに簡単なんだ。

確かにプログラムに記述してみると、複数行表示できました。

なんて便利なんだ。

2009/09/26

[Objective-C][iPhone sdk]tableのcellの再設定

意外にぐぐってもすぐにみつからなかったこのトピック

UITableViewControllerを使ってテーブルを表示した場合、iPhone(iPod touch)を回転させた時、teble(表)の各セルのコンテンツを再設定(再配置)をさせたい場合があります。
(レイアウトの変更ともいう。)

この場合、まず、始めに、回転させた時に、iPhoneのコンテンツを回転させるかどうかを判断するメソッド(shouldAutorotateToInterfaceOrientation)を

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}

とすればオッケーなのですが、これだけだと、単純にコンテンツが回転するだけです。

コンテンツの再描画は、iPhoneの回転が完了した時に、呼び出されるメソッド(didRotateFromInterfaceOrientation:fromInterfaceOrientation)を

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
[self.tableView reloadData];
}

とすることにより、再度、自分自身のテーブルのセルを再設定しようとします。

こうした場合、当然、呼び出されるのは、- tableView:cellForRowAtIndexPathなのですが、その時に、view(contentView)にaddSubviewをしてしまうと既存のコンテンツの上にさらに再配置されたコンテンツが重なってしまい、2重に表示されることになってしまいます。

それを回避するために、元々貼り付いていたviewを取り除く必要があるのですが、下のようにプログラムした場合、iPhoneが固まってしまいました。

NSUInteger cnt;
NSUInteger i;
cnt = = [cell.contentView.subviews count];
for (i=0; i<cnt; i++) {
[[cell.contentView.subviews objectAtIndex:i] removeFromSuperview];
}

次に下のように変更しても固まりました。

NSUInteger cnt;
NSUInteger i;
cnt = = [cell.contentView.subviews count];
for (i=0; i<cnt; i++) {
[[cell.contentView.subviews objectAtIndex:i] release];
}

さらにこんな風にしても固まりました。

[cell.contentView release];

ここまでくると泣きたくなりました。

泣きたくなったので、ぐーぐる先生に聞いてみると、同様に悩んでいる人がいました。

スレッドを読んでいくと最終的にこの人は解決されたっぽく、その時のソースが書かれていました。

Solution to problem:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"MyIdentifier"] autorelease];
}
//
// This code below fixed the problem...
//
NSArray *subviews = [[NSArray alloc] initWithArray:cell.contentView.subviews];
for (UIView *subview in subviews) {
[subview removeFromSuperview];
}
[subviews release];
//
// Now you can continue creating the cell...
//

via:Yet Another UITableViewCell Question...

一番最初に書いたプログラムとそんな差がないのに、なぜかこれで試してみるとiPhoneが固まらずに動きました。

おそらく、subviewsのカウントをとったのが失敗なのかなと思っております。

今度からこれでいきたいと思います。

2009/09/25

[google gadget]広告スペース公開

かれこれ2年以上、googleガジェットの運営を行ってきましたが、コスト的にきつくなりましたので、広告掲載を募集しようと思う。

いくつかgoogle gadgetを運営しているのだが、具体的には、goo辞書ガジェットのcanvas viewに掲載する広告を募集する。

canvas viewの説明の前に、元々、ガジェットは、同じページ上にいくつかのガジェットが数個並んでいる。

例として下に画像を掲載。
(home viewと呼ばれている。)

Photobucket

canvas viewは、一つのガジェットしか表示されないviewのことをいい、今回の場合、goo辞書しか表示しないviewのことをいう。

下にcanvas viewの画像を掲載する。

Photobucket
(実際、右側に「おすすめのガジェット」一覧があるが、これは、google側が自動的に作成したものであり、プログラムで余白に変更することが可能である。)

このcanvas viewに余白があるので、広告スペースとして解放する。

画像が小さいので、確認されたい方は、こちらからガジェットを追加していただいて、追加後、左側のナビゲーションバーに「goo辞書」とある文字をクリックしていただくと、canvas viewに切り替わる。

今年に入ってから、20万ユーザーを突破したので、一日あたりのPVは、28000人となり、一ヶ月間に80万ユーザーがこのガジェットを利用していることになる。

ユーザー数は、一週間のPVを表している。
(ユーザー数に関してgoogle側の正式定義があるので、こちらにて確認してほしい。)

募集する広告形態だが、

バナー広告とテキスト広告にしたいと思う。
(どちらもアダルトはNGとさせていただく。)

表示場所は、goo辞書ガジェットの下または、右側にしたい。

きちんと表示されないと困るので、こちらから動作環境を用意し、広告内容がきちんと表示されたことを確認した上で、本番環境に移行する。

またガジェットはキャッシュしてしまっているので、本番環境移行後、一週間ほどいただいてから表示されることを念頭においてほしい。

ただ一つ言えるのは、これからはweb osの時代がくるので、その先駆けとして、今がチャンスかもしれない。

googleが近い将来OSも投入し、iGoogleはmixi、myspace、facebookなどを意識しながら、ドンドンsocial性を高めたweb osなっていくと思うので、その先駆けとしていいと思う。

さらに具体的な納期、金額については、mai.musicfactory@gmail.comまでメールをしてほしい。

[iPhone app]colormaker version 2.0 リリース

少しアナウンスが遅くなりましたが、colormakerがバージョンアップしました。

バージョン 1.0では、RGBモードしか色を創ることができなかったのですが、今回、CMYKモードを追加しました。

CMYKモードでは、Illustratorなどを使う方、主にプロユース製品を使う方にお役に立ちます。

既にご購入くださっている方は、無料でアップデートできますので、是非、是非、ダウンロードしてください。

まだご購入されていらっしゃらない方は、こちらから購入することができます。
app store

Photobucket

Photobucket

2009/09/24

BlogPressLiteから

投稿のテスト


- Posted using BlogPress from my iPod touch

[iPhone][blogger]BlogPress Liteが公開されました

前回、blogger公式ブログのBlogger Buzz: There's an app for that!で、iPhoneからBloggerにブログを投稿することができるBlogPress Liteというアプリケーションが近々リリースされると書いてありました。

で、ついさきほどクリボウさんの

クリボウの Blogger Tips: iPhone から Blogger へ投稿できる無料アプリ「BlogPress Lite」が登場

という記事で、リリースされたことを知りました。

確かに、無料でダウンロードできました。

まだBlogPressLiteから投稿していないのですが、ちょっといじった感じラベルが全部表示されないみたいです。

後、Picasaの設定をしなくちゃーいけないのですが、普段、Picasaを使ってないので、若干、設定がうざかったです。

この部分は省いてもいいんじゃーないのかなと。

とりあえず、iPod touchからでもwifiで接続している限り投稿はできると思うので、近々チャレンジしてみたいと思います。

実際に、アプリから投稿されていらっしゃる方もいるようです。

SEVEN DEGREES: iPhoneアプリ出た

ヴィノス山崎(ワイン)に掲載

最近、ちょくちょくワインを飲みに寄らせていただいているヴィノス山崎の池袋店ですが、ブログにて、写真が掲載されました。

こちらです。

是非!!

2009/09/23

RSS2.0 pubDateのフォーマットについて

RSS2.0をパースして、時刻を表示する必要性があったので、フォーマットを調べてみることにしました。

date-time = [ day "," ] date time ; dd mm yy
; hh:mm:ss zzz

day = "Mon" / "Tue" / "Wed" / "Thu"
/ "Fri" / "Sat" / "Sun"

date = 1*2DIGIT month 2DIGIT ; day month year
; e.g. 20 Jun 82

month = "Jan" / "Feb" / "Mar" / "Apr"
/ "May" / "Jun" / "Jul" / "Aug"
/ "Sep" / "Oct" / "Nov" / "Dec"

time = hour zone ; ANSI and Military

hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT]
; 00:00:00 - 23:59:59

zone = "UT" / "GMT" ; 世界時(Universal Time)
; North American : UT
/ "EST" / "EDT" ; Eastern: - 5/ - 4
/ "CST" / "CDT" ; Central: - 6/ - 5
/ "MST" / "MDT" ; Mountain: - 7/ - 6
/ "PST" / "PDT" ; Pacific: - 8/ - 7
/ 1ALPHA ; Military: Z = UT;
; A:-1; (J not used)
; M:-12; N:+1; Y:+12
/ ( ("+" / "-") 4DIGIT ) ; ローカル差
; 時間+分 (HHMM)

via:5. 日付と時刻仕様

へーこうなっているんだー。

元の文章が消滅しても、こうして引用しておけば後で、大丈夫かなと。

2009/09/22

[Objective-C][iPhone sdk]UIImageを使ってURLの画像を表示

よくある話なのですが、url先の画像をiPhoneで表示したい場合、UIImageを使って表示できないかなーっと調べてみることにしました。

NSString* path = @"http://hogehoge.com/sample.img";

NSURL* url = [NSURL URLWithString:path];

NSData* data = [NSData dataWithContentsOfURL:url];

UIImage* img = [[UIImage alloc] initWithData:data cache:NO];

via:特定の URL から UIImage を生成する

読んだだけだと、納得できないので、実装しました。

NSString* path = @"http://www.google.co.jp/images/nav_logo7.png";
NSURL* url = [NSURL URLWithString:path];
NSData* data = [NSData dataWithContentsOfURL:url];
UIImage* img = [[UIImage alloc] initWithData:data];
UIImageView* imgview = [[UIImageView alloc] initWithImage:img];

実行結果は、このようになりました。

Photobucket
一番最初のプログラムと違うところは、cache:NOという部分がないこと。

リファレンスで探してもこの部分が見当たらないんだよなー。。。

でも、ちゃんと表示できたのでよかったのかなと。

2009/09/21

[google gadget]minigoogle version up

昨日に引き続き、miniGoogleもバージョンアップしました。

Photobucket

googleのロゴを取り外し、アイコンにしました。

大幅に縦が短くなりました。

アイコンをクリックすれば、そのまま検索ができます。
(googleとアマゾン検索をカバー)

2009/09/20

[google gadget]delicious version up

最近、バージョンアップ多発しているのですが、deliciousガジェットをバージョンアップしました。

これといって、GUIが変わったということではないのですが、前のガジェットはブックマークがでてくるまで死ぬほど遅かったので、googleガジェットの仕様変更に伴い、ブックマークが表示されるまでの時間を短くしました。(高速化)

是非、お使いください。

Photobucket

2009/09/19

[iPhone app]version upする時の注意点

やっと昨日、バージョンアップしたcolormakerをリリースできたのですが、その時の注意点をちょっと書きたいなと思います。

バージョンアップでguiを変更した場合、当然、スクリーンショットを取り直し、再度、iTunes Connectにアップロードするかと思います。

で、その時の注意点なのですが、画像をアップロードしてから、実際にiTunesに反映されるまで、半日から一日程度かかってしまいます。

おそらく、iTunesのサーバか、クライアントに残っているキャッシュのせいだと思うのですが、画像をアップロードして、すぐに反映されないからといって焦らないこと。

正常に変更ができている可能性も十分に考えられるので、しらばく我慢してみることが必要です。

[google gadget]goo辞書不具合修正完了

昨日、goo辞書で、wikipedia検索ができないという不具合がありまして、検索項目からはずしました。

動作確認を行い、正常動作していることを確認。
(動作環境:mac os x 10.5 ブラウザ:firefox3)

2009/09/18

[google gadget]goo辞書ガジェット不具合発生

ユーザーさんからコメントで頂いたのですが、goo辞書ガジェットで不具合が発生しております。

不具合内容は、wikipedia検索ができないという内容です。

原因としては、goo辞書サイト自体が、wikipedia検索をサポートしなくなったため、検索できなくりました。

プログラム修正をして、wikipedia検索を、検索項目対象からはずすことで対応したいと思います。

ご迷惑をおかけしますが、よろしくお願いいたします。

2009/09/17

[Objective-C][iPhone sdk]昨日のajaxの続き

昨日、rssをパースして、表示するプログラムを書きました。

で、問題となっていたのは、文字は取得できるものの、きちんと表示されないことでした。
(途中で、分割されてしまう現象がありました。)

他のrssでは、同様の現象が起きないだろーっと、おもいっきり、rssのせいにしていたのですが、他のrssを使っても、同様の現象が発生したので、明らかにプログラム上のバグでした。

そんでもって、今日、なんとなーく、プログラムしていたら、きちんとコンテンツを取得できたので、備忘録をかねて書いていきたいと思います。

まず、根本的に間違っていたのが、
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
メソッドの解釈。

あるタグ内にあるコンテンツ(文字列)を一回で取得するのかなーっと認識していたのですが、どうやら、そもそもそれが間違いみたいでした。

Xcodeのドキュメントをのぞいてみると、同メソッドはこんな感じで書かれている。

parser:foundCharacters:
Sent by a parser object to provide its delegate with a string representing all or part of the characters of the current element.

via:NSXMLParser Class Reference

問題となるのは、「all or part」と書かれているところ。

partから、「部分的に」と訳すことができるのですが、昨日組んだプログラムを実行したところ、まがいなりもすべて取得できていました。

つまり、このメソッドは、同じタグ内に対して、何回か呼ばれて、文字列を取得しているということなのではないのかなーっということ。(どうして、一回ではなく、複数回にわけて、タグ内の文字列を取得しているのかは、リファレンスに記載されていないのでわかりませんが。)

最初に想定していた、一度に、いっぺんにコンテンツを取得するという勝手な解釈とは、全然、違っておりました。
(まー、リファレンスを読むとそれもできるみたいなのですが。)

以上から、メソッドの流れをまとめてみるとこんな感じ。

parser:didStartElement:namespaceURI:qualifiedName:attributes:
(ある特定のタグに到着)

parser:foundCharacters:
(タグの下にある文字列を一部取得)

parser:foundCharacters:
(タグの下にある文字列を一部取得)

parser:foundCharacters:
(タグの下にある文字列を一部取得)

parser:didEndElement:namespaceURI:qualifiedName:
(閉じタグに到着)

ここまでの流れがわかったので、後は、もう一度、リファレンスを読みながら、再度、プログラムを修正してみました。


/* TestAppDelegate.hに追加 */
NSMutableString *tempString;

/* TestAppDelegate.mを修正 */

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
/* titleタグに到着 */
if([elementName isEqualToString:@"title"]){
appendflg = YES;
/* それ以外のタグに到着した場合は、シカトします。 */
}else{
appendflg = NO;
}
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if(appendflg == YES){
if (!tempString) {
tempString = [[NSMutableString alloc] init];
}
/* 文字列の追加 */
[tempString appendString:string];
}
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

/* タイトルタグの場合 */
if([elementName isEqualToString:@"title"]){
[testviewcontroller.parsedData addObject:tempString];
[tempString release];
tempString = nil;
}

}

これで実行してみた結果、下の画像を得ることができました。

Photobucket
キタ!!

後は、タイトルを加工して、ヘッダーとして表示すればオッケー♪

tempString = [[NSMutableString alloc] init];
の部分は、
tempString = [[NSMutableString alloc] initWithCapacity:0];
でもいいみたいんだけど、ちょっとメソッドの使い方がなー。。。

さらなる改良点として、iPod touchなどでは常にネットに接続できるわけではないので、ネットに接続していない時にも、コンテンツが表示できるようにしたいなー。

おそらくキャッシュを使えば、この問題はクリアーできそうなのですが、まだ未体験ゾーンです。

2009/09/16

[Objective-C][iPhone sdk]ajaxを使って、、、

xml(rss)の取得を行い、パースする。
(タイトルが長いので本文にまたがって書きました。)

colormakerのバージョン2を申請しており、その間、次のアプリケーションの構成を練っています。

次は、いよいよ、ネットワーク通信を使ったアプリケーションを作りたいなと思っています。

ネットワーク通信だと、なんだか抽象的ですが、ようは、httpプロトコルのgetメソッドを使ってxml(rss)を取得するということです。

まずは、ポイントを書いてからプログラムをのせたいと思います。

最初のポイントですが、xml(rss)を取得する際、iPhoneのUIつまり、画面(スクリーン)を固めずに取得したいと思います。

これはいまはやりの、ajaxです。
(ajaxのjはjavascriptだが、これは作者がわかりやすいようにつけた名前であり、概念としては、UIをブロックせずに、httpプロトコル通信を行うことであります。)

また、取得するにあたって、
1:http通信を行い、xml(rss)のダウンロードを行う
2:ダウンロードしたxmlを解析し、表示を行う
の2点が重要なポイントとなってきます。

以上をふまえて、実装してみたのですが、ちょっと長いです。
(ご勘弁ください。。。)

プロジェクトの名前は、「Test」です。


/* TestAppDelegate.h */
#import "TestViewController.h"

@interface TestAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;

TestViewController *testviewcontroller;

NSURLConnection *RssConnection;
NSMutableData *RssData;
BOOL appendflg;

}

@property (nonatomic, retain) IBOutlet UIWindow *window;
- (void)parseRSS:(NSData *)data;
@end

/* TestAppDelegate.m */
- (void)applicationDidFinishLaunching:(UIApplication *)application {

testviewcontroller = [[TestViewController alloc] initWithStyle:UITableViewStylePlain];

NSString *feedURLString = @"http://dailynews.yahoo.co.jp/fc/rss.xml";

NSURLRequest *httpRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:feedURLString]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0
];

RssConnection = [[NSURLConnection alloc] initWithRequest:httpRequest delegate:self];

/* 接続がうまくいかなかった場合 */
if(RssConnection == nil){
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"エラー"
message:@"接続に失敗しました。"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil
];
[alertView show];
[alertView release];
return;
}

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

[window addSubview:[testviewcontroller view]];
[window makeKeyAndVisible];

}

/* ヘッダー返ってきたとき */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
/* データの大きさを0で初期化 */
RssData = [[NSMutableData alloc] initWithData:0];
}

/* コンテンツのダウンロードしたとき(完了ではない。連続的にコールされる) */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
/* データを追加する */
[RssData appendData:data];
}

/* コンテンツのダウンロードエラー */
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

[RssConnection release];
[RssData release];

UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"エラー"
message:@"接続に失敗しました。"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil
];
[alertView show];
[alertView release];

}

/* コンテンツのダウンロードが完了した時 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[self parseRSS:RssData];
[RssConnection release];
[RssData release];
}

- (void)parseRSS:(NSData *)data {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

testviewcontroller.parsedData = [NSMutableArray array];

[parser setDelegate:self];
[parser parse];
[pool release];

[testviewcontroller.tableView reloadData];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if([elementName isEqualToString:@"title"]){
appendflg = YES;
return;
}
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if(appendflg == YES){
[testviewcontroller.parsedData addObject:[string stringByReplacingOccurrencesOfString:@"\n" withString:@" "]];
return;
}
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
appendflg = NO;
return;
}


- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {

}

- (void)dealloc {
[RssConnection release];
[RssData release];
[window release];
[super dealloc];
}

/* TestViewController.h */
#import <UIKit/UIKit.h>
@interface TestViewController : UITableViewController {
NSMutableArray *parsedData;
}
@property (nonatomic, retain) NSMutableArray *parsedData;
@end

/* TestViewController.m */
・・・省略・・・
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [[[NSNumber alloc] initWithUnsignedInteger:[parsedData count]] integerValue];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Set up the cell...
cell.textLabel.text = [parsedData objectAtIndex:indexPath.row];
return cell;
}
・・・省略・・・

Event-Driven XML Programming Guide for Cocoa
URL Loading System
及び、サンプルコードのSeismicXMLを参考にしながら作ってみました。

SeismicXMLは、マルチスレッドを使って実装されていたのですが、シングルスレッドの方が好きなので、ならべくマルチスレッドを使わずに、実装した結果、上のようになりました。

取得先となったのは、Yahoo.co.jpで公開されているYahoo!ニュース・トピックス - トップなのですが、いざ、実行してみた結果、このような感じになりました。

Photobucket

今回は、時間の都合上、タイトルだけ表示するプログラムなのですが、「Yahoo!ニュース・トピックス - トップ」が、「!」を境に改行を起こしてしまっています。

xmlでは表示されない改行があるのかなーっと思い、配列に追加する時に、置換をかけているのですが、それでも解消されません。

なぜなんだろうなー?

2009/09/15

[Objective-C][iPhone sdk]改行を表示する

NSStringで改行を表示したい場合、どうすればいいのかなーっとちょっと調べてみました。

すぐに発見できなかったので、C言語で探してみると、下記のリンクを発見。

・・・省略・・・
printf("count %d\n", i);
・・・省略・・・

via:簡単なC言語のプログラム

上のプログラムで改行されるので、\nを使えばいいのかなと思い、iPhoneで実装してみました。

UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"動作確認"
message:@"改行の\n動作確認です。"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil
];
[alertView show];
[alertView release];

実行結果は、下のようになります。

Photobucket
確かに、メッセージの部分が改行されました。

2009/09/14

[mac]バッククオートの入力

ついでに、バッククオートの入力方法について。

alt+ろ→「`」

おー、これでgaucheの準クオートも一回、一回、webからコピペしなくてすむ。

かなり便利

[mac]バックスラッシュを入力

ちょっとかゆいネタですが、ちょっと今、必要になったので、調べてみることにしました。

optionキー(alt) + \ で、バックスラッシュになります。

via:バックスラッシュを素早く入力

本当だ、入力できた

2009/09/13

[Objective-C][iPhone sdk]アラートを表示

次のアプリケーションには、アラートが必要だと思い、実装方法を調べてみることに。

UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"エラー画面です。"
message:@"エラーが発生しました!!" delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil
];
[alertView show];
[alertView release];

実行結果は、下のようになります。

Photobucket
ちょっと気になるのが、UIViewを継承しているのにも関わらず、表示する際に、addSubviewメソッドを使っていないところ。

まー仕様書にも、showでアニメーションを効かせて表示させると書かれているんだから、素直に使えば何も問題ないかなと。