8月
07

[PHP][PhpStorm][remote-debug]の設定手順

PhpStormでPHPのデバッグがしたい

普段、静的型付言語+IDE使っているとどうしてもデバッガがないと不安になるのが人情。

想定環境

OSX上でPhpStormをIDEとして使う。XAMPP環境は仮想マシン上にありソースはシンボリックリンクさせてコーディングする。

このような環境ではリモートデバッグが必要となるのでPhpStormの場合はどのようにするか調べたところ、
およそ次のような流れで設定を行うと良いみたいだ。

ものすごいざっくりした手順

  1. (サーバ側)xdebugがなければ使えるようになるようゴニョゴニョする
  2. (サーバ側)php.ini(xdebug.ini)でxdebugを環境に合わせた上で有効化する
  3. (サーバ側)apacheの再起動
  4. PhpStormのプリファレンスでポートをphp.ini(xdebug.ini)の設定と同じにする
  5. PhpStormのRun/Debug Configurationsの設定にPHP Remote Debugを追加し、サーバと(php.ini(xdebug.ini)で設定した)session idを設定する
  6. プロジェクトのファイルパスとサーバ側のファイルパスを対応させる(先のコンフィグ内で設定するかエラー時にリンクが現れるのでそこから設定してもよい)
  7. debugを実行し待ち受ける

xdebugの設定例 (php.ini等で設定)

xdebug.remote_host= 192.168.x.x (PhpStorm側のIP 適宜書き換え)
xdebug.remote_port=9000 
xdebug.max_nesting_level=200
xdebug.remote_enable=On
xdebug.idekey="PHPSTORM" (なんでも良いがPhpStorm側とキーを合わせる)
xdebug.remote_autostart=On

PhpStorm側の設定

  1. Preference > PHP > Debug のXdebugの設定を確認(あるいは変更)
  2. Run > Edit Configurations… で PHP Remote Debugを追加。Servers,ide keyを設定。
  3. Serversの隣にあるボタンから use path mappings にチェックを入れてリモートとローカルのパスを対応させる

参考

Setting up Xdebug’s remote debug with PHPStorm | Swifty’s Blog http://www.irving-swift.com/2014/01/setting-up-xdebugs-remote-debug-with-phpstorm/

php5.4環境でXDebugをOSX Mountain Lionにセットアップ。 – すずけんメモ http://suzuken.hatenablog.jp/entry/2013/07/12/140409

PhpStorm+XdebugでVagrant仮想マシンのPHPをリモートデバッグ http://www.karakaram.com/phpstorm-vagrant-remote-debug

設定ファイルのパスを教えてくれる php –ini って便利ですね。

4月
18

NSTimerのコールバックをblocksで実装する

NSTimerの生成では次のようにコールバック先となるメソッドをセレクタで指定します。

 
_timer = [NSTimer scheduledTimerWithTimeInterval:1 
target:self
selector:@selector(callback)
userInfo:nil
repeats:YES];
 
...
- (void)callback {
// do something
}

これを、次のようにblocksとNSBlockOperationを利用するとコールバック用のメソッドを作らずに実装できます。

_timer = [NSTimer scheduledTimerWithTimeInterval:1
target:[NSBlockOperation blockOperationWithBlock:^{ /* do something */ }]
selector:@selector(main)
userInfo:nil
repeats:YES];

なお、@selectorで指定しているmainは、blockOperationWithBlock:メソッドで取得したNSBlockOperationオブジェクトのmain。

/dev/rand: Objective-C blocks for fun http://orion98mc.blogspot.jp/2012/08/objective-c-blocks-for-fun.html

3月
30

[xcode5][CoreData]CoreDataのSQLをデバッグ出力する

健忘録。
CoreDataが発行しているSQLを確認したい時はコマンドライン引数に次の値を与えると実現できる。

-com.apple.CoreData.SQLDebug 1

※与える数値が大きいほどverboseになる、との事。

コマンドライン引数を与える場合は schemeを編集する必要がある。

Edit Scheme… / Run / Arguments / Arguments Passed On Launch

最初はどこにあるのかわかりづらい、scheme編集

スクリーンショット 2014-03-30 0.05.47

このパンくずリストみたいのをクリックしてメニューを出すという仕様はfinderのタイトル同様winユーザにはなかなか思いつかない仕様。。。

Arguments Passed On Launch に引数を追加する

スクリーンショット 2014-03-29 23.48.19

コンソールにクエリが出力されるようになる

スクリーンショット 2014-03-29 23.51.11

参考:

Core Data Programming Guide: Core Data Performance https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdPerformance.html

日本語PDF
https://developer.apple.com/jp/devcenter/ios/library/documentation/CoreData.pdf

3月
22

[objective-c][KVC]キー値コーディングについて調べたら面白かった

キー値コーディング (KVC) とは何か?

objective-cはiPhoneが流行りだした頃に少しHowTo本を写経してみただけで全く手つかずだったのですが、必要に迫られて先月からものすごい周回遅れで勉強しています。とりあえず今のところ、サッパリ良さが分かっていない(笑)が、おそらくその印象の最大の要因はファッション的な問題でしょう。雑感として、良い所は、言語仕様が小さい。その割に動的型付け言語っぽい柔軟さがあるところでしょうか。言い換えると、動的言語っぽい柔軟さがあるから言語仕様が小さくて済んでいるのかもしれない。反面、各種フレームワークの流儀や慣習を押さえないとうまくいかない。また、objective-c自体もそうですがXcodeにしろFoundationにしろ調べれば調べるほど 数年でものすごい変わってしまう ようなので調べた情報が古かったりとキャッチアップするのがしんどい部分もあります。このあたりはしかたがないので多少の歴史的経緯を踏まえつつ一つ一つ潰していくしかありません。

で、本題はと言うと、KVCです。KVC、耳慣れない単語です。とりあえず最初はスルーしました。多分デザインパターンみたいなものだろうとは思いました。でもそういったものは抽象的なので総じて分かりづらいです。(WindowsのWPFを覚え始めた時、最初はMVVMをスルーしました。数ヶ月後に謎が解けました。)いろいろとドキュメントを見ていくと KVC やら KVO という謎の単語が頻出します。それでもスルーしました。そうしているうちに、「そういえばオブザーバーパターン的なものを実装する場合、Cocoaでは一般的にどうやるんだろうか???」と思っていたら、他でもない、それがフレームワークでサポートしているオブザーバーパターン実装、KVC + KVO + KVB なんですね。少し前進した気がします。(他にもNSNotification、デリゲート、ターゲットアクションが通知の仕組みとして考えられる)

参考)ダイナミックObjective-C (111) デザインパターンをObjective-Cで – Observer (3) | マイナビニュース http://news.mynavi.jp/column/objc/111/

今回はその1つのKVCについて掘り下げます。(掘り下げますが、オブザーバーパターンの話からは大きく脱線してしまっています。)

apple公式の キー値コーディング プログラミングガイド
https://developer.apple.com/jp/devcenter/ios/library/documentation/KeyValueCoding.pdf

によると、KVCとは、

キー値コーディングとは、オブジェクトのプロパティに間接的にアクセスするための仕組みです。アクセサメソッドを呼び出してアクセスしたり、インスタンス変数としてアクセスするのではなく、プロパティの識別に文字列を使用してアクセスします。キー値コーディングでは、アクセサメソッドの実装パターンやシグニチャ(引数並び)の規約を定めています。

と、解説されています。よくわからないがダックタイピングみたいなもの??でしょうか。
ひとまず簡単なコードに落としてみます。普通のアクセサメソッドを使ったアクセス方法から発展させると次のように名前( キー もしくは キーパス )でアクセスできることがわかります。

// 適当にこんな感じのクラスがあったとして…
@interface Hoge : NSObject
@property int amount;
@property Hoge* child;
@end
 
Hoge* hoge = Hoge.alloc.init;
hoge.child = Hoge.alloc.init;
 
// 1. 普通のアクセサメソッドを利用した値の設定・取得
hoge.amount = 1;
NSLog(@"%d", hoge.amount);
 
// 2. KVC ( NSKeyValueCodingプロトコル ) を利用した値の設定・取得
 
// i. キーを使った値の設定・取得
[hoge setValue:@2 forKey:@"amount"];
NSLog(@"%@", [hoge valueForKey:@"amount"]);
 
// ii. キーパスを使った値の設定・取得 (obj-cのドット記法を使って辿る)
[hoge setValue:@50 forKeyPath:@"child.amount"];
NSLog(@"%@", [hoge valueForKeyPath:@"child.amount"]);
 
// note) forKeyPathは キーパスだけでなくキーでも取得可能
[hoge setValue:@20 forKeyPath:@"amount"];
NSLog(@"%@", [hoge valueForKeyPath:@"amount"]);

これだけであればかえって冗長になりメリットが感じられないが、「きっとそのうち有り難くなるにちがいない。」と考えることにします。 キーキーパス の定義が曖昧になる時は先のオフィシャルのドキュメントを確認すること。

コレクション演算子

コレクション演算子は valueForKeyPath: メソッドに与えるキーパス内で使える特別な演算子で記法は次のとおりになります。

keypathToCollection.@collectionOperator.keypathToProperty

このうち、演算子より左にあるものを Left KeyPath 、右にあるものを Right KeyPath と言います。左に配列や集合などのコレクションを置き、右に演算につかうプロパティを指定する。というのが基本的な使い方で、なんとなくイテレータとブロック、クロージャとかそういう類を彷彿とさせる、このコレクション演算子というのは直感的にかなり野心的な使い方ができそうな気がプンプンしますが、

現状では、独自のコレクション演算子を定義することはできません。

と、記載されています。

念のため、こちらも…

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html

やっぱり、

Note: It is not currently possible to define your own collection operators.

ダメです。ダメなんですかね〜。だとしたら少し中途半端なんじゃないだろうか。。。

単純型コレクション演算子

単純型コレクション演算子は、右キーパスで指定したプロパティに対して作用します。次の例のように、@count以外は全て右キーパスが必要です。(次の例ではリテラルを使って生成した簡単なNSNumberの配列のため、selfとしていますが、実際はプロパティがいくつかある複合的なオブジェクトを扱うと思いますので、selfではなくなんらかのプロパティ名を与えることが多いはすです。)

NSArray* arr = @[ @1, @50, @13, @42, @98, @4 ];
NSLog(@"サンプル数 %@", [arr valueForKey:@"@count"]);
NSLog(@"合計 %@", [arr valueForKeyPath:@"@sum.self"]);
NSLog(@"平均 %@", [arr valueForKeyPath:@"@avg.self"]);
NSLog(@"Max %@", [arr valueForKeyPath:@"@max.self"]);
NSLog(@"Min %@", [arr valueForKeyPath:@"@min.self"]);

と、このように簡単な集計関数として使えます。( 最初は@sum.intValueなどとしていましたが、selfでもできるようです。)

オブジェクト演算子

オブジェクト演算子は、右キーパスが単一のコレクションに作用して、配列として結果を返します。

//オブジェクト演算子
{
    NSArray* arr = @[ @"apple", @"orange", @"strawberry" ];
    NSLog(@"右キーパスの値を連結して配列化 %@",
    [arr valueForKeyPath:@"@unionOfObjects.self.length"]);
}
{
    NSArray* arr = @[ @"apple", @"orange", @"strawberry", @"apple" ];
    NSLog(@"右キーパスの値を連結して重複なしで配列化 %@",
    [arr valueForKeyPath:@"@distinctUnionOfObjects.self"]);
}
 
// 配列演算子、集合演算子
{
    NSArray* arr = @[ @[@"c",@"c++",@"obj-c",@"java",@"c#"], @[@"ruby",@"python",@"javascript"], @[@"lisp",@"haskell"] ];
    NSLog(@"右キーパスの配列を連結して配列化 %@",
    [arr valueForKeyPath:@"@unionOfArrays.self"]);
}
{
    NSArray* arr = @[ @[@"foo"], @[@"foo",@"bar"], @[@"bar",@"baz"] ];
    NSLog(@"右キーパスの配列を連結して重複なしで配列化 %@",
    [arr valueForKeyPath:@"@distinctUnionOfArrays.self"]);
}
#define $(...)  [NSSet setWithArray:@[__VA_ARGS__]]
{
    NSArray* arr = @[ $(@"foo"), $(@"foo",@"bar"), $(@"bar",@"baz") ];
    NSLog(@"右キーパスの集合を連結して配列化 %@",
    [arr valueForKeyPath:@"@unionOfSets.self"]);
    NSLog(@"右キーパスの集合を連結して重複なしで配列化 %@",
    [arr valueForKeyPath:@"@distinctUnionOfSets.self"]);
}

※一般に禁則のマクロを使っているのは、集合には現在のところ配列や辞書のようなリテラルがないためで、実際にはあまり使わないほうが行儀が良いと思いますが、ここではそのほうが他との類似性が分かりやすいので使っています。

なお、先ほどのコレクション演算子の独自な定義については、

KBInitializeCollectionExtensions(); // おまじないが必要
NSArray* arr = @[ @"iPhone5s", @"iPhone3gs", @"pipin@" ];
NSLog(@"%@" , [arr valueForKeyPath:@"[collect].{ self contains[c] 'iphone' }.self"] );

このような形で抽出条件を与えられるよう拡張してしまったものもあります。

Collection Extensions | kickingbear
http://kickingbear.com/blog/archives/9

紹介記事
KVC Collection Operators : NSHipster
http://nshipster.com/kvc-collection-operators/

議論
Fun with KVC — Noodlings
http://www.noodlesoft.com/blog/2009/06/30/fun-with-kvc/

この拡張はかなり面白いと思うのですが、紹介記事やソースコメントにswizzleという単語が使われていて、
Pointer swizzling – Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/Pointer_swizzling
なんとなくこれは業務として使ってはアカンやつやという気がしています。

一方で、appleがC標準として提案しているブロックを使ってコレクション操作を行う
underscore.jsのobjective-c実装といった感じの

Underscore.m http://underscorem.org/

はとても魅力的です。これ、かなり良さ気ですね。
やっぱりKVCの方は割り切って使うべきなんでしょうか。

ということでかなりお腹いっぱいになってしまったため、KVOに結びつかない話で終わります。

追記 本来使うべき局面はこちら(Cocoa bindings)

3月
15

[wordpress]マークアップでweb上に簡単なシーケンス図を書く

UMLのシーケンス図

sequence図例

シーケンス図とはUML(統一モデリング言語)の1つで、時系列上でオブジェクト間の相互作用を可視化したものですが、考えを整理するときや設計を開発者間で共有する時などに(たまに?)使います。自分で考えを整理するだけであれば手書きででも(むしろそのほうが)いいのですが、簡単にtextileやmarkdownのようにマークアップできればそれも利用してみたいと思うのが人情ではないでしょうか??という事で調べてみました。

シーケンス図の描けるjsライブラリやウェブサービスなど

js-sequence-diagrams by bramp
http://bramp.github.io/js-sequence-diagrams/
最初に見つけたのがこちら。日本語の紹介記事が多いので参考になります。 websequencediagrams を参考にして作られているとの事。

KangaModeling – The agile modeling markup language
http://kangamodeling.org/
指定のjsをインクルードしてサーバサイド側のapiを叩く感じのようですが、使い勝手は js-sequence-diagrams と似ています。こちらの方が表現力が上です。

websequencediagrams
https://www.websequencediagrams.com/
こちらはウェブサービス。機能によっては有償のようですが、この中では一番本格的な表現ができそうです。

マークアップの方法は3つとも似たような感じで、出力のスタイルも手描きっぽい感じや活字っぽい感じなどいくつかから選択できるようになっています。

wordpressで簡単にマークアップできるように

先に挙げた候補だと、 js-sequence-diagrams が一番自由な形で利用できますので、これを使ってみることにします。また、とりあえずこのブログはwordpressなのでwordpressで簡単に使えるようにしてみることにします。

js-sequence-diagrams自体の使い方は
https://github.com/bramp/js-sequence-diagrams#usage
のとおりで、これによるといくつか依存するjavascriptのライブラリの読み込みと、レンダリングのため数ステップの処理が必要となっています。

記事ごとにjsやcssを管理できるプラグイン

定形のscriptをその都度書くのは面倒なのでjavascriptを管理できるプラグインを導入します。

CSS Javascript Toolbox
WordPress › CSS & JavaScript Toolbox « WordPress Plugins http://wordpress.org/plugins/css-javascript-toolbox/

CSS Javascript Toolbox では記事ごとにjavascriptやcssの管理ができます。私は js-sequence-diagramsusage を参考にしつつ、ロード時に勝手にパースされるように次のようなスクリプトにしてみました。

手順

wordpressの 投稿編集 画面を開き、次のようなシーケンス図用のマークアップのある記事を作成します。

<pre class="diagram">
Title: Here is a title
A->B: Normal line
B-->C: Dashed line
C->>D: Open arrow
D-->>A: Dashed open arrow
</ pre>

記事をポストします。この時、記事は 公開済みパスワード保護 の状態でないと CSS Javascript Toolbox 側の posts にリストアップされないので注意( 非公開 だとリストアップされないのはなんでだろう?)。

CSS Javascript Toolbox でシーケンス図表示用のjavascriptと記事をひもづけます。

完成

以上の結果が次のとおりです。Oh! メリケン。。ちなみに日本語に対応させる場合は手書き風の ‘hand’ ではうまくいかないので ‘simple’ にする必要があります。( sequenceDiagram もしくは drawSVG に与える引数 theme の値 )

Title: Here is a title
A->B: Normal line
B-->C: Dashed line
C->>D: Open arrow
D-->>A: Dashed open arrow

なお、 js-sequence-diagramsusage では、 div 内にマークアップしているようですが、wordpressの場合、フィルターの挙動(具体的には wptexturize )で、連続するハイフンが他の文字に変換されてしまいパースに失敗してしまうようです。これを回避する為にはwordpress本体のソースを変更する必要があるため、 div タグではなく pre タグ内にマークアップしています。

参考(UML関連):

UML
http://www.omg.org/spec/UML/

UML 2.0 Superstructure Specification
http://www.sparxsystems.com.au/bin/UML2SuperStructure.pdf

UML basics: The sequence diagram http://www.ibm.com/developerworks/rational/library/3101.html

参考(wordpress関連):

WordPressをカスタマイズするなら覚えておきたいアクションフックとフィルターフック http://webdesignrecipes.com/wordpress-action-hook-and-filter-hook/

はだかの隊長日記 » WordPress:連続するハイフンを自動変換をさせない http://blog.r-unit.co.jp/archives/351

WordPressで連続したハイフンを表示させる方法 http://wazan2.com/4.html

3月
06

[c++]VisualC++のcrtdbg.hに相当するメモリリーク検知方法について

VisualC++で重宝したcrtdbg.h。Xcodeでは…?

メモリ リーク検出の有効化 http://msdn.microsoft.com/ja-jp/library/e5ewb1h3(v=vs.90).aspx

これはデバッグ終了時にメモリリークが検出された場合、コンソールに発生箇所などが表示されるもので大変便利なのですが、Xcodeではどうやらそれに相当するものはない模様。

そしていつものようにStackOverflowなどを探っていたらクロスプラットフォーム版crtdbg.hと言えそうなソースコードが見つかりました。これはかなりそれっぽい。というかVC以外で開発される方はどうされるのが一般的なんでしょう??

A Cross-Platform Memory Leak Detector http://wyw.dcweb.cn/leakage.htm

既存のオブジェクトをこれのdebug_newとリンクしてしまえば(XcodeなどIDEならば次のファイルをプロジェクトに追加すれば)それだけで一応機能します。

debug_new.h
debug_new.cpp
c+11.h
_nvwa.h
fast_mutex.h
static_assert.h

ただし行番号まで表示させる場合は、明示的に debug_new.h をインクルードさせる必要があるようです。

注意点は、検知のタイミングによっては正常に開放されているものもリークとして表示されてしまう場合があるので工夫が必要と思われます。

追記:これだとC実装部分は検知できない。ということで Valgrind が気になる。でも最近のOSXだと無理っぽいですね。

3月
05

[c++][JSON]picojson

ヘッダファイルのみのC++用JSONライブラリ picojson

「C++で手軽なJSONパーサがないだろうか?」と思っていたところ、
なんとヘッダファイルだけで記載された素晴らしいライブラリがありました(いまさらですみません。)
ソースは今はgithubで管理されていて、こちらに最新版があるようです。

kazuho/picojson https://github.com/kazuho/picojson

使い方

こんな感じの、ユーサーIDとパスワードを管理するオブジェクトが2つあるというデータだとすると、

[
	{
	 	"userID":"foo",
		"userPW":"bar"
	},
	{	
		"userID":"hoge",
		"userPW":"hogehoge"
	} 
]
void read(const char* filepath) {
   std::ifstream ifs(filepath);
    picojson::value v;
    ifs >> v;
    std::string err = picojson::get_last_error();
    if(!err.empty()) {
        std::cerr << err << std::endl;
        return;
    }
    if(v.is<picojson::array>()) {
        picojson::array& a = v.get<picojson::array>();
        for (picojson::array::iterator i = a.begin(); i != a.end(); ++i) {
            picojson::object& o = (*i).get<picojson::object>();
            std::cout << o["userID"].get<std::string>() << std::endl;
            std::cout << o["userPW"].get<std::string>() << std::endl;
        }
    }
}

と、こんな感じで取得できる。

2月
28

[xcode]ビルドセッティングの確認

最近VisualStudioではなくXcode(5)を触っています。IDEを乗り換えると色々と面食らいますが、不可解だった挙動の1つがこれ。

build settingsに表示されるセクションが、プロジェクト管理下にあるファイルに依存して変化する。

例えば、Objective-CやC++などC系のソースが1つもないプロジェクトだとApple LLVM 5.0系のセクションが表示されなくなり、代わりにUser-Definedセクションに大量の項目が表示される。「C系のソースファイルが無いからLLVM系のセクションが表示されなくなるのは何となく分かるけどもUser-Definedはどこからやってきた?」とりあえず気持ち悪いのでコンパイラオプションがどんな状態なのか調べたい。

少し 調べた 所、Xcodeのプロジェクトやワークスペースをコマンドラインからビルドできる xcodebuild というコマンドがあり、これのオプションに -showBuildSettings というのがあることが分かった。

$ xcodebuild -project myProj.xcodeproj -target "myTarg" -showBuildSettings
 
Build settings for action build and target Hoge:
    ACTION = build
    ALTERNATE_GROUP = staff
    ALTERNATE_MODE = u+w,go-w,a+rX
    ALTERNATE_OWNER = foo
    ALWAYS_SEARCH_USER_PATHS = NO
(略)

とりあえず、これでc++のソースが含まれる場合とそうでない場合とでdiffをとると、

$ diff /tmp/dump1.txt /tmp/dump2.txt 
196a197
>     PFE_FILE_C_DIALECTS = c++

と、これだけが違う。ので、C系のソースの有無でコンパイラオプションなどが大幅に変わってしまうのではなく、Xcodeのbuild settingの表示がそのような挙動になっているということが分かった。うーむ。

2月
26

[Dash][doxygen]doxygenで生成したドキュメントをDashで読む

Dashは速くて便利なドキュメントブラウザ兼スニペット管理ソフト

Dashはosx用のドキュメントブラウザ兼スニペット管理ソフトで、検索速度が抜群に速いです。
Dash – Documentation Browser, Snippet Manager – Kapeli http://kapeli.com/dash

自前のdocsetを生成する方法

代表的な言語やライブラリのドキュメント(docset)はDash上から直接ダウンロードして認識させることができますが、提供されていないものは自前でdocsetを作る必要があります。docsetの作り方は次のサイトに設定や手順が詳しく記載されています。

Generating Dash Docsets – Kapeli http://kapeli.com/docsets

doxygenの場合docsetが簡単に作れる

今回、私はC++で作成されたライブラリのソースコードからドキュメントを生成したかったので、doxygenからdocsetを作ってみることにしました。幸いにもdoxygenの場合はオプションを変更すればさほど手を煩わす必要もなくdocsetを作ってくれるようです。

 GENERATE_DOCSET   = YES
 DISABLE_INDEX     = YES 
 SEARCHENGINE      = NO
 GENERATE_TREEVIEW = NO

なお、osx用にはdoxygenのGUIフロントエンドのDoxywizardがあるので、今回はこれを利用して見ようかと思います。

Doxygen: Downloads http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc

Doxywizardでdocsetを生成

通常、Step1とStep2のWizardタブとRunタブに従えばhtmlやtexのドキュメントを簡単に作成できますが、今回はゴールがdocsetを生成する事にあるので、さらにExpertタブを開き、先のオプションを変更します。

※同様に、DISABLE_INDEX, SEARCHENGINE, GENERATE_TREEVIEWを設定

設定が完了したらRunタブに切り替えて、 Run Doxygen ボタンをクリックして実行します。

なお、この操作ではまだ docsetが生成されてない 状態なので、コンソールからhtmlディレクトリに移動して、そこでmakeします。

$ cd html
$ make

すると org.doxygen.Project.docset というファイルが生成されますので、適当な名前にリネームして適当な場所に移動します。

$ mv org.doxgen.Project.docset ~/path/to/file.docset

Dashに生成したdocsetを認識させる

Dashのプリファレンスから Docset タブを開き、先ほど生成したdocsetを追加します。

Dashで検索してみる

表示されました。快適。

追記:
option + click でDash上のドキュメントを表示するプラグインを入れるとさらに快適です。

Dash Plugin for Xcode
https://github.com/Kapeli/Dash-Plugin-for-Xcode

Alcatraz
http://alcatraz.io/
パッケージマネージャ。VisualStudioのNuGetやvimのvundleやxyzzyのnetinstaller..(ry のように手軽にプラグインを管理できる。

2月
23

[pry]pryでソースコードを編集

irbより強力なpryを使ってインタラクティブにソースを作成

pryを起動

$ pry
[1] pry(main)>

pry上でメソッドを定義

[5] pry(main)> def foobar
[5] pry(main)*   :hoge
[5] pry(main)* end
=> nil

※インデントも色付けもしてくれる。

気に入らないのでコードを変更(エディタが起動する)

[6] pry(main)> edit foobar

エディタ上でソースを編集し保存する

(:hogeを:hogehogeに修正して保存)ちなみにエディタは Pry.config.editor=”vim” などとして設定できる。

pryに戻ってくるので動作を確認

[8] pry(main)> foobar
=> :hogehoge

気に入ったので、ファイルに保存

(先ほど編集したファイルはテンポラリファイル)

[15] pry(main)> save-file foobar --to test.rb

古い記事へ «