Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

ゾンビ狩り

よくよく、EXC_BAD_ACCESSが起きて頭を抱えることが多いiOS開発では、開発中はゾンビを検出するオプションをつけておくと作業がはかどる。

Product->Edit Schema->Enviroment Variables
で以下の環境変数をYESに設定しておくと、クラッシュ時にどのクラスが原因か、わかるようになる。

NSZombieEnabled : 解放済みのオブジェクト:"ゾンビオブジェクト"※1にメッセージを送出した場合に例外で通知する

参考:深淵へ - ゾンビオブジェクトを検出する (Xcode編) - Kazzzの日記


今回は使わなかったが、Instrumentsを使ってゾンビ探しを簡単にできるようだ。

シュミレーターの場合はInstrumentsにZombieプロファイルがあるのでそれを使う

実機の場合はここを参考に

C++のテストフレームワークを調べてみる

無難にgoogle testを使うか、cspecで新しいことを始めるかといった選択でしょうか・・・。

google test framework

cppunitよりもスマートな印象。基本機能に大きな違いはないですが、google testの悪いところが今のところ見つからないので、cppunitの代わりに使うのはありな気がする。

ここにアサート文についてはここに一覧がまとまっていた。

簡単に気になる機能をgoogle testの翻訳ドキュメント
から引っ張ってきました。

値をパラメータ化したテスト

こんな値をちょっと変えたテストを行いたいときの構文が用意されています。

void TestFooHelper(bool flag_value) {
  flag = flag_value;
  // foo() をテストするコード.
}

TEST(MyCodeTest, TestFooo) {
  TestFooHelper(false);
  TestFooHelper(true);
}

定義がこれ。

class FooTest : public ::testing::TestWithParam<const char*> {

TEST_P(FooTest, DoesBlah) {
  EXPECT_TRUE(foo.Blah(GetParam()));
}

};

テストの宣言はこれ。

INSTANTIATE_TEST_CASE_P(InstantiationName,
                        FooTest,
                        ::testing::Values("meeny", "miny", "moe"));

外から渡されるパラメータは、TEST_Pマクロの中でGetParam()関数から取得できる。
こういうことをしたいときは多々あるので便利ですね。

また、型違いのものを実行したい場合は、下のようにテストを定義して

TYPED_TEST(FooTest, DoesBlah) {
  // テスト内部で型パラメータを取得するには,特別な名前 TypeParam を参照します.
  // 派生クラステンプレート内部なので,FooTest のメンバにアクセスするには
  // 'this' を使う必要があります.
  TypeParam n = this->value_;

  // フィクスチャの static なメンバにアクセスするには,
  // 'TestFixutre::' プリフィックスを追加します.
  n += TestFixture::shared_;

  // フィクスチャ内で typedef されたメンバにアクセスするには,'typename TestFixture::' プリフィックスを追加します.
  // 'typename' は,コンパイラに型名であることを知らせるためにあります.
  typename TestFixture::List values;
  values.push_back(n);
  ...
}

こんな感じで、型をパラメータとして渡します。

typedef ::testing::Types<char, int, unsigned int> MyTypes;
TYPED_TEST_CASE(FooTest, MyTypes);


上級ガイド — Google Test ドキュメント日本語訳より

CSpec

RSpecのような書き方のできるテストフレームワークもありました。
テストを読みやすくするという点で、 とても気に入っています。Cでも同じ書き方が出来るのはポイントが高い。

まだ、詳しい仕組みを確認していないので採用できないかもしれないですが・・・。

#include <stdio.h>
#include <string.h>
#include "cspec.h"
#include "cspec_output_verbose.h"

DESCRIBE(strcmp, "int strcmp ( const char * str1, const char * str2 )")

	IT( "returns 0 only when strings are equal" )
		SHOULD_EQUAL( strcmp("hello", "hello"), 0)
		SHOULD_NOT_EQUAL( strcmp("hello", "world"), 0)
	END_IT

	IT( "returns a negative integer when str1 is less than str2"  )
		SHOULD_BE_TRUE( strcmp("hello", "world") < 0 )
		SHOULD_BE_TRUE( strcmp("0123", "1321431") < 0 )
	END_IT

	IT( "returns a positive integer if str1 is greater than str2"  )
		SHOULD_BE_TRUE( strcmp("yellow", "world") > 0 )
		SHOULD_BE_TRUE( strcmp("9", "789") > 0 )
	END_IT

END_DESCRIBE

void main()
{
	CSpec_Run( DESCRIPTION( strcmp ), CSpec_NewOutputVerbose() );
}

CSpec : Behavior-driven development in C · arnaudbrejeon/cspec Wiki · GitHub

iOSアプリでSVGを描画してみたいのですが

iOSでアプリを書いたことがなく、Objective-Cも未経験。とりあえず入門サイトを見つつ進んだところまでメモ。

SVGKitというライブラリのサンプルプロジェクトを実行して、自分のプロジェクトのライブラリを組み込むところまで出来た。実際に手元のデータで描画していないので、どんなSVGでも描画できるのか?など調べられてないので完成まで、もう少し時間がかかりそうだ。

iOSのアプリの書き方を調べてた

のまとめがよさげです。最初からここを見ておけばよかった。

C++なら書けるので

を見ながらざっくりコードが読めるようになった。


ARCという仕組みによってメモリ管理が楽になるそうなので

を見ながら、ちょっと理解が進んだ。

SVGKitというライブラリ

のURLは既に無効になっている。プロジェクトを作り直しているようで探しづらい。

が正解のURL。(ライセンスは商用でもOKって書いてあるよね?)

にSVGKitを使う方法がまとめられていた。

簡単にまとめると、プロジェクトの設定を開いて以下の二カ所を設定する

  • [Build Settings]->[Search Paths]->[Header Search Paths]に$SDK_DIR/usr/include/libxml2を設定する。
  • [Build Phases]->[Link Binary With Libraries]にQuartz 2Dとlibxmlを追加する

さらに

  • ダウンロードしたSVGKitのCore、iOSフォルダを自分のプロジェクトにコピーする

これで自分のプロジェクトでSVGKitが使えるようになる。


ヘッダーパスの設定。

ライブラリパスの設定。

せっかくなので、ARCを使いたいのでiOS5.1対応のアプリにしようと思ったのだが・・・

SVGKitはARC対応していないので、ビルドが通らない。
これを参考にしながら、ライブラリのコード全部に対して、-fno-objc-arcオプションをつけたところ、いくつかの警告が残るもののビルドが通った。

おまけ

失敗しない iOS In-App Purchase プログラミング - A Day In The Life
アイテム課金ダウンロードコンテンツ)はIn-App Purchaseというらしい。APIの使い方のページを調べるところまではやってみた。

ちょっとやり方がわからなかったところをメモ

最近MongoDBをいじって遊んでいるんだけども、資料が意外と多くて勉強しやすくていいですね。

勉強の仕方はそのうちまとめるとして、ハマったところをメモ。

MongoDBのシェル上でプロパティを削除(カラム?)したい

mongoコマンドでDBとやり取りするためのシェルが起動します。

その上で出来る事はチュートリアルを見て勉強するとして、既に登録しているデータのプロパティを削除するには以下のようなコマンドを入れると出来ます。

db.hoge.save({a:100,b:200})
var data = db.hoge.findOnce()
delete(data.a)
db.hoge.save(data)

新規にhogeコレクションを作ったとして、まずデータを登録します。aとbのプロパティがあります。登録がされていれば、findOnce()で登録したデータが取得出来るはずです。

取得したデータのプロパティをdelete関数で削除して、save関数を呼ぶと削除された状態で保存されます。

シェル上で、ちょっとデータを直したいときはこんな感じでやってみてね。

Ruby+Sinatra+MongoMapperでコードを書いて試していて位置情報を扱いたかった

地理空間インデックスを使って二次元座標を検索できるようにしたかったので、調べていました。
mongoシェル上では出来たので、MongoMapperでのやり方を調べていたところ

Model.ensure_index([[:pos, ‘2d’]])

こんなコードを書く事でインデックスを貼れることがわかりました。残念ながら、今回扱いたい座標は緯度経度ではないので、範囲が-180〜180ではありません。デフォルトの値では困るので、オプションを設定する必要があります。


以下のようなコードで最大値、最小値が設定出来ます。

Model.ensure_index([[:pos, ‘2d’]],:max => 1000, :min => -1000

ヒントはここにあったのですが、Rubyにも慣れてない上にMongoMapperの中身も知らないので自信がないですが、中でこのライブラリでも使ってるんだろうか・・・。


知らなかったですが、MySQLでもこんな感じで扱えるんですねぇ

ベースラインという言葉がわからなかったので調べてみた

用語がよくわからないことありますよねぇ

SubversionSCM.java
で出てくるbaselineという言葉がSVNの用語なのか、一般に使われる言葉なのかがまず判断できなくて困った。

あまり使われていない用語?のようだけど

複数のアジャイルチームでのバージョン管理
の説明が適切っぽい。

上の例についてまとめるとこうなります。

トランクはメインラインで、親はありません(そうですよね?)
他の全てのコードライン(リリース1.0ブランチ、チームA作業ブランチ、チームB作業ブランチ)はトランクをベースラインとしている。

下のはもう少し複雑な例を表しています。

と書かれているので

単に
"あるブランチの親ブランチのこと"
ってことのようです。

そんなに難しいことでなかったのに悩んでいて損した気分になった。

SCMのプラグインを書きたいのでメモ

プラグインが見つからないバージョン管理システムをJenkinsで扱えるようにしたいので、調べ中。

SCM plugin architecture - Jenkins - Jenkins Wiki
に作り方がまとまっているが、古いのでSVNプラグインのコード読めってなっている。
SVNプラグインSVNリポジトリ
ここです。


コードを読んでみて、進展があればまたまとめる予定

おまけ

plot pluginのように汎用の集計プラグインが欲しいのだけども、複数カラムのデータ扱いたいので、何か簡単なものを自作しようと考えているところ。

plot plugin
こんな感じでCSVでデータを保存して持っている模様。
少しずつJenkinsのプラグインのコードが読めてきた。


何かしたいときは、近いプラグインのコードを読むのが近道のようだ。

追記(20120415)

勘違いをしていたところがあったので追記
SCM plugin architecture - Jenkins - Jenkins Wikiの内容は有効なものと無効なものが混じってるだけのようだ。全部の内容が古いわけでもない。
"The Descriptor class"の項目はそのまま実装ができた。Plugin Implクラスは作らなくてもSVNの下に自作のSCMプラグインが表示されたので、いらないっぽい。

円形のぼかし処理をcssでいれる

色のついた●にぼかし処理を入れたいと思ったのでCSS3でフィルターを探していたところ。フィルターというとIEの拡張のフィルタぐらいしか見つからなかったのでそれっぽい処理を検討しました。

1. box-shadowを使う

HugeDomains.com - MonodEz.com is for Sale (Monod Ez)
を見ながら、box-shadowを使って実験しました。

結果としてはこんな感じ。イメージ通りのぼやっとした円が描けました。

ボックスを小さくして、box-shadowのパラメータを大きくしていくと、円形に表示されるようになりました。
元となるボックスが表示されるので、背景の色を透明などにしておけばいいかもしれません。

コードは以下の通りです。

<p class="blur-effect title">box-shadow sample</p>
<div class="blur-effect-back">
  <div class="blur-effect box-shadow">
  </div>
</div>
.blur-effect.box-shadow{
    -webkit-box-shadow: 3px 3px 5px 0px #777; /* Safari, Chrome用 */
    -moz-box-shadow: 3px 3px 5px 0px #777; /* Firefox用 */
    box-shadow: 3px 3px 5px 0px #777; /* CSS3 */
	
    background-color: #777777;
    box-shadow: 100px 90px 25px 0 #FF0000;
    height: 30px;
    width: 30px;
}

2. text-shadowを使う

css3のtext-shadowによるテキスト装飾のサンプル集 - かちびと.net
を見ながら、テキストにブラー効果を書けられることがわかったので、それを使ってみました。

結果としてはこんな感じです。

●のテキストにエフェクトをかけて対応しました。テキストなので、●の部分が選択可能なので
見た目以外の部分に影響が出ているのが困ることがあるかもしれません。
また、Firefox5.0.1とOpera11.61で見た目が異なっているのでブラーのサイズが大きすぎると
見た目の誤差が大きく使いづらそうです。

<p class="blur-effect title">text-shadow sample</p>
<div class="blur-effect-back">
  <div class="blur-effect text-shadow"></div>
</div>
.blur-effect.text-shadow{
    color: rgba(255, 0, 0, 0.01);
    font-size: 100px;
    padding-top: 80px;
    text-align: center;
    text-shadow: 0 0 35px rgba(255, 0, 0, 0.5), 0 0 30px rgba(255, 0, 0, 0.5);
}

まとめ

cssを使ってぼかしをすることは可能。
イメージ通りの表現が確認できたので満足した。
ブラウザ間(特にモバイル)で見た目がどのぐらい違うか確認出来ていないので追試が必要。


あとcanvasを使っても出来るかもしれないが、それはまだ調べていない(この辺りが参考になるかも)


実験に使ったデモ用もページを用意しました。
http://nilfs.github.com/samples.html