2011年11月12日土曜日

NSNumberとNSValueとCGRect,CGPoint,CGSIzeについて

どうも、俺@家帰っても勉強中です。
Objective-CでNSNumberとNSValueという不思議なクラスにぶち当たりました。

NSNumberは数値を表すオブジェクト型で、プリミティブなintやNSIntegerとは少し意味合いが違います。
つまりintとNSIntegerはイコールですが、NSNumberはイコールではありません。
使い方は
int i = 10;
NSInteger i = 10;
NSNumber *i = 10;
のようになります。
使いどころですが、例えばオブジェクト型で数値を表現したい場合はNSNumberを、そうでない場合はintやNSIntegerを使いましょう!というそのままなのですが、
具体的には、NSArrayなどに格納できる要素はオブジェクト型である必要があります。
NSArrayやNSMutableArrayにどうしても数値を格納する必要があれば、NSNumberを使えばOKです。

int i =10;
NSNumber *num = [NSNumber numberWithInt: i];
としてやればintをNSNumber型に変換できます。
他にも
NSNumber *num = [NSNumber numberWithFloat: 10.0f];
のような使い方もできます。
逆にNSNumber型をint型として取り出すには
int i = [num intValue];
でOKです。

またNSValueですが、これはCGRectやCGPoint、CGSizeなど構造体を表すオブジェクト(NSObjectを継承していない)を扱う場合に利用します。
CGRectとかCGPointなどはクラスの引数の型などに設定できないんですね。あとは上の例のように、NSArrayの要素として追加したい場合など。
CGrect rect = CGRectMake(0, 0, 100, 100);
NSValue *val = [NSValue valueWIthCGRect:rct];
CGPoint point = CGPointMake(100, 100);
NSValue *val = [NSValue valueWIthCGPoint:point];
CGSize size = CGSizeMake(100, 100);
NSValue *val = [NSValue valueWIthCGSIze:size];
こんな感じです。

逆にNSValue型のオブジェクトからCGRectなどを取り出す場合は
CGRect rect = [val CGRectValue];
CGPoint point = [val CGPointValue];
CGSize size = [val CGSizeValue];
使い方はNSNumberの場合とほとんど一緒です。


以上でぇぇぇぇす。

2011年11月11日金曜日

設定されたSSL鍵にパスフレーズが設定されているかどうか

どうも、俺@アプリ開発中です。
今日は、利用しているSSLの鍵にパスフレーズが設定されているかどうかを調べる方法についてめもめも。

例えば、apacheを再起動しなければならなくなった場合
そのapacheはSSL設定がされており、https:// なWEBサーバであると、再起動かけたとき

# /usr/local/apache2/bin/apachectl restart
Enter pass phrase for /path/to/ssl.key: 
のようにパスフレーズを求められて、
apacheが停止したところで止まってしまい、起動出来なくなってしまいます。これはエライコッチャ!

こんな場合は、事前にSSL鍵にパスフレーズが設定されているかどうかチェックしておきましょう。
まず、apacheのSSL設定ファイル(通常はhttpd-ssl.confかな)にあるSSLCertificateKeyFileを見て、SSL鍵パスを確認します。

# cat /usr/local/apache2/conf/extra/httpd-ssl.conf | grep SSLCertificateKeyFile
SSLCertificateKeyFile "/usr/local/apache2/conf/ssl/ssl.key"
例えばこのように出力されて、鍵ファイルのパスがわかります。

このファイルを openssl コマンドでパスフレーズ設定されているかどうか確認します。
# openssl rsa -in /usr/local/apache2/conf/ssl/ssl.key
とコマンドを打って
・パスフレーズ設定されている場合
Enter pass phrase for /usr/local/apache2/conf/ssl/ssl.key:
これは要注意です!

・パスフレーズ設定されていない場合
Writing RSA key
----- BEGIN RSA PRIVATE KEY -----
LKDFopa99yjkfslkKgudkdf...
のように鍵ファイルを表示できれば設定されていません!


これで、apache再起動時に焦ることもなくなりますね。
僕は、開発環境でパスフレーズ設定されたapacheを再起動してしまい、「あれぇ」となった事があります。

ちなみにパスフレーズ設定されたSSL証明書鍵のパスフレーズを解除してしまう方法ですが、(セキュリティ的に危ないので本番サーバとかでは要検討!)

// バックアップを取る
# cp ssl.key ssl.key.bak

// パスフレーズ解除
# openssl rsa -in ssl.key -out new_ssl.key
Enter pass phrase for ssl.key: // ここでパスフレーズを入力
です。
new_ssl.keyというパスフレーズの設定されていないSSL証明書鍵が出来ました。


以上でぇぇぇぇす。

2011年11月10日木曜日

UIView UILayout UITextViewを角丸にする

どうも、俺@アプリ開発中です。
今日はタイトル通り「UIView」「UILayout」「UITextView」の角を丸く描画する方法についてめもめもです。

まず、ヘッダファイルで

#import <QuartzCore/QuartzCore.h>
とQuartzCore.frameworkをインポートします。
別のサイトとかではQuartzCore.frameworkを追加して、とかあるのですが僕の環境ではそんなことしなくても普通に使えました。
なぜだ。(XCode4.2)
次に対象のオブジェクトに対し

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(100, 100, 50, 50);
[btn setTitle:@"test" forState:UIControlStateNormal];

// 角丸の処理
[[btn layer] setCornerRadius:5.0f];

// または
// btn.layer.cornerRadius = 5.0f;
こんな感じです。
UILayoutやUITextViewでも同様に作れます。


以上でぇぇぇえす。

2011年11月9日水曜日

Objective-Cでprivateメソッドを定義したい

どうも、俺です。
ようやくobjective-c(cocoa)な話題です。

objective-cで自作クラスを作り、javaやphpのようにprivateなメソッドを定義したい!という時のめもめもです。
objective-cは基本的には定義されたメソッドはpublicになってしまいます。
面倒なのであえてprivateなメソッドにする必要もなさそうですが。

ちなみにprivateなプロパティは

// MyClass.h
@interface MyClass: NSObject
{
 @private
   id hoge;
}
-(void)methodA;
@end
のような形で定義できちゃいます。

privateなメソッドを定義するには、カテゴリを使って何とか実装できます。、、なので面倒です。

// MyClass.m
@interface MyClass () // ←が無名カテゴリの定義
-(void) privateMethod;
@end

@implemention MyClass
// ここにクラスの実装を行う。
// privateMethodもここに作成する。
-(void) prrivateMethod
{
  // メソッドの内容
}
@end
こんな感じです。
MyClasss.hに変更を食わえる必要はありません。

Objective-Cにprivateメソッドの仕組みが組み込まれてないんでしょうね。
なんか冗長な気がするので、どうしてもprivateじゃないとアカン!という場合でなければ使わなくても良いかなと思いました。
アプリ開発とかでもあまり大規模開発になることもなさそうですし。

以上でぇぇぇぇぇぇぇす。

2011年11月2日水曜日

macのターミナルでvimのdeleteがおかしい時

どうも、俺です。
お久しぶりです。ブログに書くようなネタがなかったのでしばらく更新できませんでした。。

今日はmacを使っててターミナルからvimを開いてdeleteキーを押すと「^?」が出る人へ、対処法メモです。


$ vim ~/.vimrc
-------------------
" 以下を追加
noremap! ^? ^H
とりあえず、.vimrcをこのようにすれば直ります!直るはずです。
^?はCtrl+vを押したあとdeleteキー。
^HはCtrl+vを押した後Ctrl+hキー。

最近はmacで仕事しております。iphoneアプリ開発とかしてるので、そのうちObjective-C関連のネタも書くようになれればいいなー。

以上でぇぇえぇす。