テキストの読み書き

Apple-Style Plusさんに登録されている方のブログを拝見していると、この休みを利用してCocoaプログラミングに挑戦している方が結構いらっしゃるようですね。 こういうの始める時って、やっぱりまとまった休みでな … “テキストの読み書き” の続きを読む

Apple-Style Plusさんに登録されている方のブログを拝見していると、この休みを利用してCocoaプログラミングに挑戦している方が結構いらっしゃるようですね。

こういうの始める時って、やっぱりまとまった休みでないとなかなか・・・ね。

いったん始めてしまえば暇な時を見つけてチョイチョイできますけど。

明日あさっては、GW毎年恒例のSUPER GT第3戦富士を観戦する予定なので、今日はCocoaの日としよう。

・・・天気良いけど。

さて、この間テキストファイルの読み込部分のみ載せたコードですが、書き込みとかその周辺もできたので全部載せてみます。

何かの足しになれば良いですけど。

あ、そうそう。

メモリ管理の話がまだ理解が追いついていなくて、その辺りの処理は入っていません。


//
//  CocoaSample4.m
//  CocoaSample4
//
//  Created by D.S on 09/04/30.
//  Copyright 2009 __MyCompanyName__. All rights reserved.
//

#import "CocoaSample4.h"


@implementation CocoaSample4

/*
Openボタン押下時の処理
*/
- (IBAction)open:(id)sender;
{
// NSOpenPanelのインスタンス生成
NSOpenPanel *openPanel = [ NSOpenPanel openPanel ];

// NSOpenPanel表示
[ openPanel beginSheetForDirectory:@"~/" file:@"" types: nil
modalForWindow:[ sender window ] modalDelegate:self
didEndSelector:@selector( openPanelDidEnd: returnCode: contextInfo: ) contextInfo:nil ];
}

/*
saveボタン押下時の処理
*/
- (IBAction)save:(id)sender;
{
// NSSavePanelのインスタンスを生成
NSSavePanel *savePanel = [ NSSavePanel savePanel ];

// NSSavePanel表示
[ savePanel beginSheetForDirectory:@"~/" file:@"" modalForWindow:[ sender window ]
modalDelegate:self didEndSelector:@selector( savePanelDidEnd: returnCode: contextInfo: )
contextInfo:nil ];

}

/*
NSOpenPanel終了時の処理
*/
- (void)openPanelDidEnd:( NSOpenPanel * )panel returnCode:( NSInteger )code contextInfo:( void * )contextInfo {

NSString *string = nil;
NSError  *error;

// 押下されたボタンの判定
if( code == NSCancelButton ) {

/* Cancelボタン時 */

// 何もせず終了
return;
}

//
// とりあえず、SIJIで読み込んでだめならUTF8で読み込む。それだダメならreturn
//

// 選択されたファイル名称を取得
NSString *path = [ panel filename ];

// エンコーディングにNSShiftJISStringEncodingを指定してファイルを読み込む
string = [ NSString stringWithContentsOfFile:path encoding:NSShiftJISStringEncoding error:&error ];

// 読み込めたか判定
if( string == nil ) {

/* 読み込めなかった場合 */

// エンコーディングにNSUTF8StringEncodingを指定してファイルを読み込む
string = [ NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error ];

// 読み込めたか判定
if ( string == nil ) {

/* 読み込めなかった場合 */

// エラー出力
NSLog( [ error localizedDescription ] );

return;
}
}

// テキストエリアに読み込んだ内容を出力
[ textView setString: string ];
}

/*
NSSavePanel終了時の処理
*/
- (void)savePanelDidEnd:( NSSavePanel * )panel returnCode:( NSInteger )code contextInfo:( void * )contextInfo {

NSString *string = nil;
NSError  *error;

// 押下されたボタンの判定
if( code == NSCancelButton ) {

/* Cancelボタン時 */

// 何もせず終了
return;
}

// ファイル名称を取得
NSString *filename = [ panel filename ];

// テキストエリアから表示されているテキストを取得
string = [ textView string ];

// 取得したテキストをファイルに書き出す
BOOL result = [ string writeToFile:filename atomically:YES encoding:NSUTF8StringEncoding error:&error ];

// 書き出しが正常であったか判定
if( result != YES ) {

// エラー出力
NSLog( [ error localizedDescription ] );
}
}

@end

Cocoaのエンコーディング

とりあえず一個題材を決めて勉強しています。 今やっているのは、テキストファイルをNSOpenPanelで選択してNSTextViewに表示し、さらにファイルへ書き出すというものです。 Cocoa-Javaでも似たようなこ … “Cocoaのエンコーディング” の続きを読む

とりあえず一個題材を決めて勉強しています。

今やっているのは、テキストファイルをNSOpenPanelで選択してNSTextViewに表示し、さらにファイルへ書き出すというものです。

Cocoa-Javaでも似たようなことを以前やっていたので、なんとなく分かるのですが、読み込むテキストのエンコーディングについて良くわからなくてウェブで色々調べてました。

Cocoa-Javaの時は意識していたかどうか定かではないのですが、読み込むファイルのエンコーディングがUTF-8だったりSJISだったEUCだったり・・・と様々な場合、ちゃんと化けずに読めるのかな?と。

たぶん英数字しか入ってないファイルであれば読めてしまうんでしょうけど、2バイト文字の日本語とかが入っているとどうなるのやら・・・。

で、結論から言うと、化けるというか読み込んでくれません。

使ったメソッドはNSStringの+ (id)stringWithContentsOfFile:(NSString *) path usedEncoding:(NSStringEncoding *) enc error:(NSError **) errorです。

※頭に+が付いてるとクラスメソッド、-だとインスタンスメソッドだそうです。

リファレンスを見ると、読み込んだファイルのエンコーディングを教えてくれるようなので、なんでも嫌わずに読み込んでくれるのかと思いましたがだめでした。

これが使えると、ブラウザで言うところの自動判別みたいなものが出来て楽だと思うのですけど、なんだかちゃんと動きません。

それでウェブで調べてみると、Cocoaのエンコーディングはどうなっておるのだ? – Nothing Upstairsという記事を見つけました。

なるほどやっぱりダメなんですね。

ということで、読み込むファイルのエンコーディングが分からない時は、トライアンドエラーするしかないのですかね。

ブラウザとかテキストエディタとかの実装ってみんなそうしているだろうか。

良くわかりませんが、とりあえず+ (id)stringWithContentsOfFile:(NSString *) path encoding:(NSStringEncoding) enc error:(NSError **) errorを使うことにして、NSStringEncodingに片っ端からエンコーディングを指定していくしかないのかな。

合ってるのかね??


/*
NSOpenPanel終了時の処理
*/
- (void)openPanelDidEnd:( NSOpenPanel * )panel returnCode:( NSInteger )code {

NSString *string = nil;
//NSStringEncoding encoding = 0;
NSError *error;

// 押下されたボタンの判定
if( code == NSCancelButton ) {

/* Cancelボタン時 */

// 何もせず終了
return;
}

//
// とりあえず、SJISで読み込んでだめならUTF8で読み込む。それだダメならreturn
//

// 選択されたファイル名称を取得
NSString *path = [ panel filename ];

// エンコーディングにNSShiftJISStringEncodingを指定してファイルを読み込む
string = [ NSString stringWithContentsOfFile:path encoding:NSShiftJISStringEncoding error:&error ];

// 読み込めたか判定
if( string == nil ) {

/* 読み込めなかった場合 */

// エンコーディングにNSUTF8StringEncodingを指定してファイルを読み込む
string = [ NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error ];

// 読み込めたか判定
if ( string == nil ) {

/* 読み込めなかった場合 */

// エラー出力
NSLog( [ error localizedDescription ] );

return;
}
}

// テキストエリアに読み込んだ内容を出力
[ textView setString: string ];
}

Cocoaリファレンス

だんだんとObjective-Cの[やら:に慣れてきました。 さて、クラスの仕様を調べたりするのに、Appleで公開されているリファレンスを見ます。 Appleのウェブページを見たり、Xcodeの製品ドキュメントから見て … “Cocoaリファレンス” の続きを読む

だんだんとObjective-Cの[やら:に慣れてきました。

さて、クラスの仕様を調べたりするのに、Appleで公開されているリファレンスを見ます。

Appleのウェブページを見たり、Xcodeの製品ドキュメントから見ても良いのですが、Cocoa Browser Airというアプリケーションを使うと大変見やすいです。

できれば前回開いていたページを記憶しておいてくれるとうれしいのですが・・・。あと現バージョンでは検索ができないようです。

もう一つリファレンス関連でありがたいのが、Cocoa Break!さんで公開されている日本語訳です。

Mac OS X v10.5系はまだ完全ではないようですが、Foundationは揃っていますし、重宝することと思います。

これ大変な作業ですよ。素晴らしい。

Cocoa-Objective-C始めました。

さてGWに入りました。 画策していた12連休は残念ながら失敗に終わりましたが、8連休ということでまずまずです。 しかし長期連休を取得できても、現在人生最大級でお金がないため、どっちにしろたいした遊びはできずに残念。 そん … “Cocoa-Objective-C始めました。” の続きを読む

さてGWに入りました。

画策していた12連休は残念ながら失敗に終わりましたが、8連休ということでまずまずです。

しかし長期連休を取得できても、現在人生最大級でお金がないため、どっちにしろたいした遊びはできずに残念。

そんなわけで、ずっと以前からチャレンジしようと考えていたことに取り込むことにしました。

Cocoa-Objective-Cです。

遥か昔に、Cocoa Beiginnersというセクションで、Cocoa-Javaで作るMac OS Xアプリケーションについて書いていました。

書いていたと言うより、自分で勉強した内容を備忘録として載せていたようなものですが。

当時なぜCocoa-Javaを選んだかというと、Cocoa-Javaの情報があまり無かったので役立つかなと思ったのと、はっきり言ってObjective-CってMac OS Xアプリ専用のプログラミング言語と言っても過言ではない程ニッチ過ぎて、それならばメジャーな言語であるJavaを勉強しながら、Mac OS Xのアプリを作れれば幸せだなと思ったのが理由でした。

しかし時は過ぎ、Cocoa-JavaはAppleから見限られてしまいCocoa-Javaを追求する意味もなくなり、さらにiPhoneという素晴らしいデバイスが誕生し、そのアプリの開発のためにはObjective-Cが必須である昨今。

ならば本気でObjective-Cをがんばってみようじゃないか。

この不況な世の中。暇はあってもカネはない。

そんな時こそまさにうってつけの課題。

Macさえあれば、開発環境は全て無料で手に入ります。

やってやろうじゃないか!

そう意気込んでいる現在であります。

チョイチョイとコードを書いたりしてみてますけど、やっぱりこの文法慣れない。

C言語を知っていると割と簡単に習得できるとの評判ですが、文法がとにかく慣れない印象です。

[とか:とかたくさんあって、もー!みたいな。

あと、ラベルとかって概念もあったりして、どれがラベルでどれが引数なんだかパッと分からん!

ごちゃごちゃと文章のような文法です。

までも慣れなんでしょうけどね。

あ、そうそう。

ウェブだけを見てなんとかしようと思っていましたが、やっぱり紙媒体の参考書が手元にあると便利なので、下記、2つの本を買いました。

どちらも有名ですよね。著者さんはHMDTの木下さんです。



たのしいCocoaプログラミング[Leopard対応版]


自作アプリをApp Storeで世界に向けて販売できる!! iPhone SDKプログラミング大全 (MacPeople Books)

最終的にはiPhoneアプリを作りたいと思っているのですが、iPhone SDKプログラミング大全の方を見るのはまだ先ですかね。

Mac OS Xのアプリ制作にまずは慣れたいです。

さくら’09 忍野八海編

先週に引き続き、4/18に山梨県の忍野八海へさくらを見に行ってきました。 忍野八海は初めてでしたが、観光地化されていてなかなか過ごしやすいところでした。 駐車は忍野八海入り口にあるお土産屋さん「ひのでや」に停めました。 … “さくら’09 忍野八海編” の続きを読む

先週に引き続き、4/18に山梨県の忍野八海へさくらを見に行ってきました。

忍野八海は初めてでしたが、観光地化されていてなかなか過ごしやすいところでした。

駐車は忍野八海入り口にあるお土産屋さん「ひのでや」に停めました。


30秒間手を入れていられないくらい冷たい・・・はずでしたが、全然普通でしたw


至る所にとうもろこしが干されていました。昔の人は、このとうもろこしを挽いて料理に使っていたそうです。


たくさんの淡水魚が泳いでいました。


中には黄色(金色?)のも。


藁葺き屋根の家が良い感じ。


日本名水百選に選ばれている水。軟水で非常に口当たりが良かった。


御釜池。面積は24平方mと小さいのですが、深さは7.5mもあります。


忍野八海に咲くさくら。


曇りなのが残念・・・。

忍野八海を後にし、鳴沢氷穴、富岳風穴に移動しました。

どちらも初めてで楽しかったのですが、特に印象に残ったのは鳴沢氷穴でした。


鳴沢氷穴入り口。


ここは溶岩トンネルと言われるところですが、なんと高さが91mしかありません!下は滑るし高さは無いしでかなり楽しいところですね〜。


「水曜どうでしょう」かと思うくらい楽しいところです。


中は0°。冷蔵庫です。


これだけ富岳風穴です。風穴でも氷柱はあります。

昼食は足柄古道万葉うどんでうどんを食べて、東名道の海老名SAでジャージーソフトクリームを食べて解散。

※忍野八海はiPhoneの電波入りましたが、鳴沢氷穴、富岳風穴、足柄古道万葉うどんでは全く入らず・・・。

さくら’09 冨士霊園編

4/12に、毎年恒例、冨士霊園へさくらを見に行ってきました。 集合場所を中央道の談合坂SAにAM7:30〜8:00。冨士霊園にはAM9:00に設定しました。 思えば毎年冨士霊園には、昼頃からノコノコ向かって行ったため渋滞 … “さくら’09 冨士霊園編” の続きを読む

4/12に、毎年恒例、冨士霊園へさくらを見に行ってきました。

集合場所を中央道の談合坂SAにAM7:30〜8:00。冨士霊園にはAM9:00に設定しました。

思えば毎年冨士霊園には、昼頃からノコノコ向かって行ったため渋滞などは皆無でしたが・・・。

あり得ない。

AM7:00頃に家を出たら、八王子料金所付近の渋滞に加えて小仏トンネルの渋滞・・・。

下りのクセにナマイキだぞ!w

談合坂SAにはAM8:20頃に到着し、さらに冨士霊園にはAM10:00に到着してしまい(なぞ)ご迷惑をおかけ致しました。すみません・・・。

到着した冨士霊園のさくらはちょうど満開を迎えたところといった状態でとてもきれいでした。

ただ残念なことに、例年より早めに行き過ぎたか混雑がひどく、さくらを背景にクルマを撮ることができず残念・・・。

次の目的に移動途中、陸上自衛隊滝ヶ原駐屯地前に見事なさくらロードがあったので停車。

なにやら創立35周年記念行事が催されていたようで、戦車が走っていました。

実戦配備されている型ではないでしょうけどね。

最後は道の駅「どうし」に寄って、恒例のソフトクリームを頂いて解散。

※園内はちゃんとiPhoneの電波入りました。

iPhoneフォトコンテスト

Apple主催で、iPhoneで撮影した写真のコンテストを開催するそうです。 部分引用: iPhone フォトコンテスト 5月10日(日)1:00 p.m. ・WEBから登録ください。登録受付は前日までとさせていただきま … “iPhoneフォトコンテスト” の続きを読む

Apple主催で、iPhoneで撮影した写真のコンテストを開催するそうです。

部分引用:

iPhone フォトコンテスト 5月10日(日)1:00 p.m.

・WEBから登録ください。登録受付は前日までとさせていただきますが、
定員になり次第閉め切らせていだきます。
・写真はすべてiPhoneで撮影したものに限ります。
・iPhone用の写真アプリを使用していただいても構いません。
・Macによる撮影後の補正は不可です。
・写真の枚数は最大10枚とさせていただき、当日、iPhoneに入れてお持ちください。
(CDやDVDでの持ち込みも受け付けています。)
※ iPhoneの写真アルバムに入っている写真はご登録いただけません。
iPhone本体で写真ををお持ちいただく場合は必ずカメラロールの中に写真が入っている状態にしてください。

当日コンテスト会場へ来れる方、つまりApple Store銀座に来れる方というのが参加条件でもっとも敷居が高いと思われますが、それ以外はかなり気軽に参加できるような雰囲気です。

ぜひ参加してみてはいかがでしょうか。

「おっぱい2枚ください」

4/18から全国で公開される映画「おっぱいバレー」。それに関してシネマトゥデイに面白い記事が掲載されていた。 部分引用:  しかし、やはりその言葉を口にするのは恥ずかしい。映画『おっぱいバレー』のチケットを購入しようとし … “「おっぱい2枚ください」” の続きを読む

4/18から全国で公開される映画「おっぱいバレー」。それに関してシネマトゥデイに面白い記事が掲載されていた。

部分引用:

 しかし、やはりその言葉を口にするのは恥ずかしい。映画『おっぱいバレー』のチケットを購入しようとした人から、「おっぱいというタイトルをチケット売り場で口にするのは恥ずかしい」というシャイな意見が配給会社に多数寄せられているそうだ。それを受け、現在チケット売り場では、同作品のチケットを購入する際「OPV(オーピーヴィ)のチケットください」と『おっぱいバレー』の頭文字を言うだけでチケットが購入できるよう配慮されており、シャイな人でも心置きなくチケットを入手できるようだ。

・・・確かにこれは恥ずかしい。

シミュレーションしてみたが口に出すのはなんとも抵抗がある。

気にし過ぎだろうか。

いやむしろ、この記事を見たせいで気になり始めてきた。

いざ窓口でチケットを購入しようとした際、どう考えても思わず口元が緩んでいる自分がいる。

素知らぬ顔でチケットを買うなんて、きっとできない。

チケットを売る方も大変だ。

「おっぱいバレー2枚ですね?」

これをいちいち言うのだろうか・・・。

「おっぱい」という単語をなんとか口に出さずに購入する方法として、記事では「OPV」表現が紹介されているが、これは逆に恥ずかしいのではないだろうか。

しかも「OPV」表現が窓口の人たち全てに浸透しているとも思えず、なんのこっちゃ分からずに「何ですか?」と聞き返されたあげく、結局顔を真っ赤にしながら「おっぱいバレー2枚ください・・・」と頼むことになってしまいそうだ。

これは最も悪いサイアクな状況だ。絶対に避けたい。

他には例えば、マクドナルドのクーポンのように、「おっぱいバレー」のページをiPhoneでキャプチャしておいて、それを窓口で見せる、と言った手法も思いついたがやはり不自然だ。むしろキモイ。

やはりここは素直に「おっぱいバレー2枚ください」と頼むのが良さそうだ。

くれぐれも緊張のあまり「バレー」を付け忘れ、「おっぱい2枚ください」などと意味不明なことを言わないように。

Captain Jean-Luc Picard

exciteに理想の上司という記事が掲載されていた。 一部引用: 明治安田生命保険が今春の新社会人を対象に調査した「理想の上司」のトップは、男性上司がワールド・ベースボール・クラシック(WBC)連覇に貢献した米大リーグの … “Captain Jean-Luc Picard” の続きを読む

exciteに理想の上司という記事が掲載されていた。

一部引用:

明治安田生命保険が今春の新社会人を対象に調査した「理想の上司」のトップは、男性上司がワールド・ベースボール・クラシック(WBC)連覇に貢献した米大リーグのイチロー選手(マリナーズ)、女性上司が女優の真矢みきさんだった。

今まで女性の上司というのに巡り会ったことがないのでちょっと置いておいて、男性上司はイチロー選手だそうです。なるほど。分かる気もします。

僕の場合、実際、理想の上司は?と問われると正直返答に困ります。

・・・が・・・。

僕は実は居たりします・・・。

しかしその人は・・・。

存在する人物ではなく、架空の人物です。

しかしながら僕の中で、理想の上司と言えばこの人しか居ません。

そう・・・。

惑星連邦宇宙艦隊のジャン=リュック・ピカード艦長(大佐)です!(^0^ゞ


この人がジャン=リュック・ピカード艦長(大佐)です(^0^ゞ

なぜかって?

語れば長くなるので割愛です。

しかし、新スタートレック(The Next Generation)を見てもらえれば、必ず納得です!


U.S.S.エンタープライズE


ボーグキューブから攻撃を受け、防御スクリーンで持ちこたえるU.S.S.エンタープライズE


ボーグキューブへフェイザー砲で反撃するU.S.S.エンタープライズE


同じくフェイザー砲で反撃するU.S.S.エンタープライズE

・・・ところで、Apple信者はスターウォーズよりスタートレックが好きと聞くが本当だろうか。

僕はどちらも遜色無く、好きでありますよ。

PAGE TOP