ページ

2013年1月28日月曜日

YAMAHA RTX1100 ルータ 初期の初期

5000円以下で手に入れたとだけあって、付属品や説明書は一切付いてなかった。

・・・が、まったく使用に問題はない。
マニュアルや設定例等は、ネットでいくらでも検索で出てくるからだ。


2013年1月23日水曜日

RTX1100 中古 を購入

仕事でネットワーク設定をしているうちに、勉強用に一つYAMAHAのルーターが欲しくなって、中古を一つ注文した。

RTX1100(中古) は、安くて高機能で良いらしい。

楽しみだ。

2012年9月6日木曜日

mac:Objective-C @autoreleasepool と仲良くなる?

@autoreleasepool という難敵がいる。
どうも、関数、メソッドの戻り値と関連が深そうなのだが、 いまいち良く分からない。

xcode4 を使い始めて ARC になってから、更に良く分からなくなった。 

以下は、NSString にカテゴリを追加して、半角文字を1、全角文字を2のサイズとして、指定サイズ分の長さに調節してくれるメソッド。


@interface NSString(substringToHansize)
- (NSString *)substringToHansize:(NSInteger)size;
@end

@implementation NSString(substringToHansize)
- (NSString *)substringToHansize:(NSInteger)size
{
    NSString *ret;
    @autoreleasepool { // <= ※1
        int i = 0, length = 0;
        do {
            unichar uc = [self characterAtIndex:i];
            if (!((uc >= 0x20 && uc <= 0x7e) || (uc >= 0xa1 && uc <= 0xdf) || (uc >= 0xff61 && uc <= 0xff9f)))
                length++;
            if (++length > size)
                break;
        } while (++i < [self length]);
        ret = [self substringToIndex:i]; // <= ※2
    }  // <= ※1
    return ret;
}
@end


※1の部分で @autoreleasepool を使っているが、これをコメント等で外すと、

objc[3419]: Object 0x100114ed0 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

のようなメッセージが出てくる。
どうやら、autoreleasepool が無いので、デバッグ用ので代用したっぽいのだが、一応デバッグモードで動作はする。

どこで @autoreleasepool を使っているかというと、※2の部分である。
NSString substringToIndex: を呼んでいるが、この戻り値(オブジェクト)の橋渡しとして @autoreleasepool が使われている。

というか、基本的に オブジェクトを戻り値にするメソッドは コンパイラが "可能" と判断しない限り、@autoreleasepool 経由になる。
もしくは、@autoreleasepool 経由だが、戻り値を呼び出し元に引き渡す際に @autoreleasepool からオーナーシップを排除するようだ。

例外として、メソッドの頭に init / copy 等が付いていたり、 NS_RETURNS_RETAINED の属性を付加していたりした場合、オーナーシップを引き渡すこと前提に動作するため、 @autoreleasepool は使用されないようだ。

NSString や NSArray のような リテラル表記出来る場合、(例えば return @"ABC"; のような書き方)データ領域をそのまま参照するため、インスタンスの消滅等の輪廻から外れているみたいだ。
また、それらのリテラル表記を使用して初期化したオブジェクト等も、コンパイラによって最終的なデータを作成されている場合もあり、これまた同じ結果になる。
(return [NSString stringWithString:@"ABC"]; 等)

なので、上記例のように、メソッド開始時に return値 の strong 変数を用意した後に @autoreleasepool を開始、return の直前に @autoreleasepool を終了させると、メソッド(関数)内で使われた @autoreleasepool が綺麗になるので、一番良いような気がする。

普通にアプリを作ると、 main関数 の始まりと終わりで @autoreleasepool があるので、これだけでイイやと思っていると、処理内で @autoreleasepool に大量にオーナーシップが溜まるので、こまめに開放処理するか、NSRunLoop等に処理を渡すかした方が良い。
(NSRunLoop に処理を渡すと、@autoreleasepool は消えてくれる)

ARC で面倒臭さで今のところNo.1な @autoreleasepool だが、果たして仲良くなれるだろうか・・・。

2012年6月20日水曜日

mac:Objective-C 刻々と変化するXcode

Xcode が4.3 4.4 4.5 と出るが、刻々とダイナミックに仕様が変わっているようだ。
上位互換はいちおう保っているが、両立はできないタイプの仕様変更が多いのがAppleのやり方だ。

4.4からは、@synthesize が必要なくなり、@property のみでOKとか。
最初Objective-Cを勉強してるとき、なんか冗長だなぁと思ったけど、バッサリ切っちゃった。

retain/release とかもなんか古めかしい感じがしてたけど、ARC でバッサリ。

基本的に言語って作った企業のものってイメージはなく、限りなくパブリックに近い何かってイメージだったけど、事Objective-C については「Appleのもの」「Appleの私物」って感じ。

まぁ、ついていく人は好きでついて行っているので良いんだけど。

2012年5月12日土曜日

mac:Objective-C プロトコルと非形式プロトコル


Objective-C を勉強中だが、どうもこのプロトコルというのが性に合わない。

java の方が性に合っているというせいもあり、どうもjava のInterface と比べてしまう。
java のInterface は過去の経緯からいうと、Objective-C のプロトコルを昇華させたものという見方が世間では一般的解釈なようだ。
それには異論はない。

しかし、やはり後発で優れた(とブログ主は考えている)java のInterface と比べて、このプロトコルがどうも古臭く泥臭く感じてしまう。

でも、まだプロトコルはいい。
使い方も、仕様も理解できる。
やはり一番納得のいかないのは「非形式」プロトコルだ。

非形式プロトコルには、何かこう・・・無法地帯なイメージがこびりつく。
NSObject に常に纏わりつき、プログラマーは一生純粋なNSObject のサブクラスを作ることができない。(気が付くと何かしらの非型式プロトコルがくっついている)
と言うか、どんだけNSObject に業を背負わせれば気が済むのだろう。

その点、Java のObject Class のなんと悠然としたことか。
すべてのClass の頂点に立ちながら、シンプルさを失っていない。
NSObject は非型式プロトコルによって知らないうちに汚されてしまっている・・・感じがするのだ。

以上、まだObjective-C 勉強中でその真髄に触れてもいない未熟者の戯言。

2012年4月25日水曜日

mac:Objective-C メモリ管理の重要さというか面倒臭さ

今、仕事で作成しているPGが LEOPARD以上向けなので、ARCが使えない。
なので、release / retain / autorelease を駆使して、メモリ管理をしなくてはならない。

しかし、これがまた面倒だ。

なんとなく覚えた(知った)メモリ管理の作法としては・・・

・自分で alloc init (copyも)したオブジェクトは「必ず」自分で release する。
・自分で retain したオブジェクトは「必ず」release する。
・オブジェクトの入れ替え時には、過去のものは「必ず」release する。
(release してから オブジェクトの生成。いきなりオブジェクトを生成しない)
・それ以外は release しない。
・コンビニエンスコンストラクタで作成された使い回しする予定のオブジェクトは、retain しないと、後々開放されてしまう。

java はその点簡単で良かった。
その分、メモリを大量に消費してしまうが。

2012年4月21日土曜日

mac : Objective-C のクラス(1)

当分の間、仕事のためにObjective-Cの勉強をしなければならない。
まぁ、敵を知り己を知ればなんとやら・・・と言うことで、頑張っていこう。

で、クラスの作成時の基礎的なもの。
・クラスのテンプレートとして、初期化、終了処理は以下のようにする。

#import "TemplateClass.h"

@implementation TemplateClass
- (id) init
{
    self = [super init];
    if (self != nil) {
        // ここに初期化処理を記述する
    }
    return self;
}

- (void) dealloc
{
    // ここにreleaseするobjectや、終了処理を記述する
    [super dealloc];
}
@end

ただしARCが有効な場合は、deallocの記述中でreleaseやsuper deallocをしてはならない。
(xcode に怒られる)