2012年5月17日木曜日

そうだ、macvimを使おう

どうも、俺@昼休みです。
今日は、Macのテキストエディタの一つであるmacvimを使ってみたら他のどのエディタより使いやすかった、という話です。

本家はこちら
香り屋パッチがあてられて日本語化を頑張ってくれているプロジェクトはこちら



これまでmacで使うフリーのエディタに
・CotEditor(http://sourceforge.jp/projects/coteditor/
・Fraise(http://www.macupdate.com/app/mac/33751/fraise
・mi(http://www.mimikaki.net/
・テキストエディット(プリインストール)
を使ってきましたが、どれも高機能すぎたり何かの機能が足りなかったりして
「WindowsのEmEditor最強!」と思ってました。

今回どこかの記事でmacvimについて紹介されているのを読み、導入してみました。
vimは開発でよく使うエディタでとても大好きなエディタなのですが、いつもターミナル上でvimを起動して、、という使い方しかしなかったので「MacのGUIエディタで使ってみてどうかな?」と思ってましたが、、
超使いやすい!さすがvimやでぇ!
これまで使ってきたエディタなんか比にならねぇぜ。

何が使いやすいって、
・当然ながらviのキーバインド
・当然ながらファイルエンコーディングの設定とかコマンド一発
・というか、自由に~/.gvimrcに設定に書いて自分好みの環境が作れる。書き方はvimrcとほぼ同じ

:lcd <パス>
 でカレントディレクトリを移動出来る
・というか、vimで使えるコマンドは大抵使える

:!<cmd>
でmacvim上からコマンド打てる。
:!uuencode ./% hoge.txt | mail you@example.com
で編集中のファイルを添付して誰かにメール送信とか出来ちゃう。
・vimscriptが使える
・もちろん背景色やシンタックスの設定、透明度の設定もできちゃう
・タブ機能も完備
・プリンタへ送って印刷もできる
・マウスでコピペもできる
・つまり最強
という事になります。
viやvimに慣れてる人で、「macで使えるオススメのフリーエディタないかなぁ」という人には間違いなくmacvimをオススメします。

.gvimrcの例
set number
set autoindent
set sw=4
set ts=4
set ignorecase
set incsearch
set hlsearch
set statusline=%<%f\ (%05l/%05L)\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P

set laststatus=2
syntax on

set encoding=utf8
set fencs=utf8,ujis,sjis
set fileformat=unix

set transparency=5 "透明度
set lines=40 columns=180 "横幅と縦幅
colorscheme default "カラースキーム 他にもいっぱいある


以上でぇぇぇぇえす。

2012年5月11日金曜日

Objective-Cで構造体をNSLogする

どうも、俺@仕事中です。
Objective-Cで構造体をNSLogしたり、NSArrayやNSDictionaryで扱いたい場合、
例えばcocos2dのccColor3Bを

ccColor3B color = {0,0,0};
NSLog(@"%@", color);

//または
[dictionary setObject:color forKey:@"colorKey"];
のようにしてもEXC_BAD_ACCESSでエラーになります。

ここはひとつNSValueを使いましょう。
NSValue *colorValue = [NSValue valueWithBytes:&color objCType:@encode(GLubyte)];
これでインスタンス化出来る。

配列へ格納したあとの取り出しは
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:colorValue, @"key", nil];
ccColor3B color;
[(NSValue *)[dictoinary objectForKey:@"key"] getValue:&color];
とします。


以上でぇえぇぇす。

Objective-Cで 'Cannot find interface declaration for 'XXXXClass', superclass of 'ZZZZClass'...'が出る

どうも、俺@昼休みです。
タイトルの通り、Xcodeでコンパイルすると
「Cannot find interface declaration for 'XXXXClass', superclass of 'ZZZZClass'...」のエラーが出て困っていた俺へのめも。
何が起こってるかというと、簡単に言うと循環参照。

Objective-Cのクラスの前方宣言がないと困ること - アールケー開発に同じような内容の詳しい解説があります。

ClassA
#import "ClassB.h"
@interface ClassA: NSObject
{
  ClassB *b;
}
@end

ClassB
#import "ClassA.h"
@interface ClassB: NSObject
{
  ClassA *a;
}
@end
ClassAとClassBがそれぞれのヘッダファイルでお互いをimportしていて、
かつどちらかでどちらかのインスタンス変数を持っている、
またはどちらかのクラスを継承している、
ような場合にタイトルのような問題が発生します。
※コンソールからgccとかで直接コンパイルした場合は、

In file included from ClassA.h:2,
                 from ClassA.m:1:
ClassB.h:6: error: expected specifier-qualifier-list before ‘ClassA'
のようなエラーが出ます。困ったもんだ。

問題の詳細はコンパイルの処理にあり、
■ClassA.hのコンパイル
ClassA.h内で#import "ClassB.h"が見つかった時点でClassB.hをインポート(解析)する。
ClassB.h内にある#import "ClassA.h"が見つかりClassA.hをインポート(解析)するはずだが、#import宣言はネストしながらインポートしないため、実際はClassA.hのインポートは行われない。
ClassB.h内のClassAインスタンス変数の定義(ClassA *a;)で、ClassAの宣言が見つからないのでエラーとなる。
、、、そうです。

こういうような場合、#import宣言をやめて@classを使い前方宣言で対処できるのであればそれで解決できます。

ClassA
@class ClassB;
@interface ClassA: NSObject
{
  ClassB *b;
}
@end

ClassB
@class ClassA;
@interface ClassB: NSObject
{
  ClassA *a;
}
@end


ただし、対象のクラスを継承していたり、処理内で対象のクラスをallocしたりしてる場合は#importを使わなければいけません。


以上でェェエェす。


macでlsしたときの@(アットマーク)

どうも、俺@今から仕事です。
Mac(Tiger以上)のターミナル上で

$ ls -l
したときにファイルやディレクトリの属性に@(アットマーク)が付いている場合があります。

$ ls -l
-rw-r--r--   1 username  staff    411 12 12 17:44 hoge.txt
-rw-r--r--   1 username  staff  26945  5 11 09:39 foo.txt
-rw-r--r--@  1 username  staff   1766  5 11 09:37 fuga.txt #←こいつ!

なんだこれは?ということで調べてみると、Mac Tigerで導入されたファイルリソース(Extended Attributes)というものらしいです。
※Tigerではデフォルトで無効化されており、実質Leopardから見られる。

拡張属性というもので、Spotlightなどの検索で利用されるらしい。
特にその存在が邪魔するというともないとは思いますが、「きもい!消したい!」という人(俺)は、
1)まず確認
$ ls -l@
-rw-r--r--   1 username  staff    411 12 12 17:44 hoge.txt
-rw-r--r--   1 username  staff  26945  5 11 09:39 foo.txt
-rw-r--r--@  1 username  staff   1766  5 11 09:37 fuga.txt
        com.apple.metadata:kMDItemWhereFroms      174
        com.apple.quarantine       70
lsに-@を付けることでその詳細が確認できます。
ここにある、com.apple.metadata:kMDItemWhereFromsとcom.apple.quarantineはダウンロードしたファイルにつく属性みたい。
$ xattr -d com.apple.metadata:kMKItemWhereFroms fuga.txt
$ xattr -d com.apple.quarantine fuga.txt
これで削除できます。

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

2012年5月10日木曜日

objective-cのクラスでプロパティをprivateに

どうも、俺@残業中です。
今日はObjective-Cのクラスで、プロパティ(@property)宣言した値をprivateのように扱う方法めもです。

MyClass.h
@interface MyClass {

  // インスタンス変数
  NSString *string;
}
@end

MyClass.m
#import "MyClass.h"
// 無名カテゴリ宣言
@interface MyClass()
@property (nonatomic, retain) NSString *string;
@end

@implementation MyClass
@synthesize string;
@end
これでオッケー。

ヘッダファイルにプロパティを書いてしまうと、外部からそのプロパティにアクセス出来てしまうことが用意に想像できてしまい、意識せずに外部からそのプロパティへアクセスしてしまいがちです。
プログラマが一人であったり、小規模なプロジェクトであれば問題ありませんが、「このインスタンス変数は外部からアクセスしちゃあかんでぇ」と意識させたい場合などにはこの方法が便利です。

ただし、Objective-Cの特性で外部からのアクセスを完全に遮断することは出来ず、やろうと思えばアクセス出来ちゃいますが、こればかりはどうしようもありません。あしからず。


以上でぇぇぇぇえぇす。