2008年8月アーカイブ




諸君、私はチーム活動が好きだ


諸君、私はチーム活動が好きだ


諸君、私はチーム活動が大好きだ



開発チームが好きだ


イベント運営が好きだ


勉強会が好きだ


読書会が好きだ


情報系の部活が好きだ



都内で


学校で


ホールで


オフィスで


自宅で



この地上に存在するありとあらゆるチーム活動が大好きだ



巧妙に連携するチーム活動が好きだ


一見ばらばらに動いていたかと思われていた個々人の成果が見事に結びついたときなど心がおどる



お互いを補足しあうチーム活動が好きだ


同じ期間で作られた個人製作の作品との差が圧倒的であったときなど胸がすくような気持ちだった



矮小な凡人が大作を産み出し得るチーム活動が好きだ


ひとりではどう足掻いても届かないような表彰台に登ったときなど感動すらおぼえる



チーム内で活発な意見交換が行われているときなどもうたまらない


ディスカッションの中で革新的なアイデアが生み出されるのは最高だ



古い掟にしがみつく狸どもが新チームの発足を妨害してきたのを


既存の枠組みを利用せずゲリラ的に集団を組織した時など絶頂すら覚える



和やかな雰囲気で交わされる会話が好きだ


辛辣な発言によって重苦しい空気が流れるのはとてもとても悲しいものだ



プロジェクトリーダーとなって鮮やかに製作集団を指揮のが好きだ


適切な権限が与えられず統制が取れなくなるのは屈辱の極みだ



諸君 私はチーム活動を 生命体様なチーム活動を望んでいる


諸君 私に付き従うチーム活動好きの諸君 君たちは一体何を望んでいる?



更なるチーム活動を望むか 


糞の様なチーム活動を望むか?


個々人の好みや欲望が有機的に結びついた生命体のようなチーム活動を望むか?



チーム活動!! チーム活動!! チーム活動!!



よろしい ならばチーム活動だ



だが、会社・学校・家庭などの母集団で革新的結束を阻止する古びたルールに耐え続けて来た我々には


ただのチーム活動ではもはや足りない!!



大チーム活動を!! 一心不乱の大チーム活動を!!




我々はわずかに小数


個人製作者に比べれば物の数ではない



だが諸君は一騎当千の互いに高めあえるベストパートナーだと私は信じている


ならば我らは諸君と私で総兵力100万と1人の大製作集団となる



我らを忘却の彼方へと追いやり、個人製作者を叩きのめそう


髪の毛をつかんで引きずり下ろし 眼(まなこ)をあけて思い出させよう


連中に人との関わりの喜びを思い出させてやる


連中に意思と意思のぶつかりあいを思い出させてやる



チーム活動には奴らの哲学では思いもよらない世界がある事を思い出させてやる


1000人の互いに高めあえるベストパートナーの集団で 世界を製作集団で埋め尽くしてやる


目標 社内革命


新規プロジェクト 状況を開始せよ


征くぞ 諸君


諸君、私は戦争が好きだ: wids.net



セキュリティ&プログラミングキャンプにRejectされた人の集まりに参加してきました!22-24日の三日間、千葉県、ハチロクの方々の行きつけであるところの土善旅館にて。千葉県は涼しいなーと思ってたら、帰ったら同じような感じだったのでタイミングがよかっただけのようです。


Rejectの細かい流れはid:syou6162さんのまとめを参照。写真とかはsyouさんのまとめのほかに、id:sonodamさんのまとめ感想にたくさん上がってます。僕はほとんど撮れなかった、というより撮るの忘れてた。写真があるだけでまとめがかなりにぎやかに見える(いや実際にぎやかだったのですが)ので、今度からは撮るようにしたいなー。


参加者は、



の9人。上5人は機械学習チーム、id:isocchiさんから3人はWebプログラミングチームということで、本家同様ふたつのコースに。僕はWebプログラミングチームです。機械学習チームは似たテーマでひとりひとり別の研究を、Webプログラミングチームは3人でTwitterAPIを利用したサービスの開発を行っていました。


id:syou6162さんも書かれていますが、本家と違い講義的なものはないながら、最も重要な点であるほかの開発者との交流という点では本家にも劣らないものだったと思います。今まで自分に足りてなかったものをたくさん得ることができました。その傍らで思いっきり足を引っ張ってしまって申し訳ない気持ちもありますがorz


ちなみにWebプログラミングチームが開発していたものはまだ完成していないです。キャンプ終了後も継続して開発しようぜー的な流れになったので、それはそれで楽しみにしています。この辺のソフトさもRejectならではですね!


Rejectセキュリティ&プログラミングキャンプの割には、PCとか財布とか携帯とかを鍵のかかってない部屋に放置したままみんな爆睡しちゃったりとセキュリティ的にかなり危険な(笑)合宿でしたが、とても楽しかったです。


来年Rejectされた人は、まずtwitterでRejectされたことを晒しましょう。僕もそうだったのですが、正直「通るだろこれ」とか根拠のない自信を持っているとものすごい落ち込んでしまいます。


でもあなたが落ちたのと同じように、他にも何十人も落ちた人がいる。そしてその内の何人かはきっとついったらーだ。キャンプ応募者に占めるついったらーの割合は、たぶん今年より来年のほうが増えてる。そこにはしょぼんぬしてる人が何人もいるはず。


そのときあなたの中にまだ折れてない情熱があったら、声を上げてほしい。


「@ALL キャンプ落ちた人はりぷらいよこせ!」


「Rejectされた人で集まろうよ!」


誰かがきっかけさえ作ってしまえばあとは皆で話し合って計画を練るだけ……というわけにはいかないけど、でもそういう部分での困難も楽しいもんだよね。


僕がRejectに誘われたときはこんな感じだった。



@tnzk Rejectセキュリティ&プログラミングキャンプやるんだけど、来ない?


03:19 PM July 14, 2008 from web in reply to tnzk


Twitter

シンプル。とてもシンプル。千葉県遠いなーとは思ったけど、でもこの時点で行かないなんて選択肢はなかった。来年あなたが言い出したRejectキャンプ2009も、同じように人が集まるはず。


そんなわけで、僕を含めて来年のRejectな人たちは声を上げるといいと思います!そのときは僕のエントリより、上で示したid:syou6162さんのエントリのほうが参考になります。引用。



来年Rejectセキュリティ&プログラミングキャンプを企画する人へ


* 幹事みたいな仕事あんまりやったことないんだけど?


* 講義とかそんなのどうするの?


* 宿の予約とかどうしよう?→土善があります


* 大体人とか集まるか分からないよ?→Twitterで告知すれば、どうにかなります


Rejectセキュリティ&プログラミングキャンプをやってきたよ!!! - Seeking for my unique color.

この辺のことに限らず、id:syou6162さんのブログにはRejectの計画から実行までのプロセスが詳細にまとめられています。



他にも、エントリ一覧を眺めるとRubyKaigiを参考にしたことなどがまとめられています。来年のReject幹事は参考にすると元気が出ると思います。


最後になりますが、首謀者のid:syou6162さんをはじめ、参加者のみなさんは本当にありがとうございました&お疲れさまでした!初日から遅刻したりとご迷惑をおかけしましたが、(かなり手垢のついた表現になりますが)誇張抜きであっという間の3日間でびっくりでした。


それと、今回の件で機械学習と統計に興味を持ってしまったので、来年はその辺のネタやりたいなあと思っています。キャンプにRejectされなくても(`・ω・´)




Rejectセキュリティ&プログラミングキャンプの中身をどーすんのよ、っていうお話し - Seeking for my unique color.



id:athlonzに「こういうのは継続的にあるといいよね」と脅しをかけられたアドバイスをもらいました。来年もRejectセキュリティ&プログラミングキャンプをやる人が必ずやいるだろうということで、どういう感じでやっていったかを見える形で残しておきたいと思います。



来年も開催されることを祈りつつ、今回やりたいことについてまとめますね!


普段どういうことをやっていて、どういう知識なら持っているのか



  1. Webアプリケーション

    • Ruby。Railsは使えない

    • 車輪の再発明ばかりしている



  2. 画像処理

    • 404 Not Foundの真似事とか

    • プレゼンテーションのサポートツールとか



  3. ActionScript/Flexでゲーム(最近はじめた


どれも勉強中で未熟者です(´・ω・`)


自分がどういうことをやりたいか


最初は画像処理にフォーカスして、AR的なことをやろうかなと考えていたのですが、三日間でできることとなると限られてくるので難しいかなと思ってます。


WebCam + Flashで何か面白いことできる感じのWebサービスなんかを作りたいなーとも考えてます。


というわけで



  • AR的な面白いもの

  • WebCam + FlashなWebサービス


辺りがやってみたいかなと思ってます。


誰と一緒に開発やりたいか(もしくは一人でもくもくとやりたいか)


思いっきり足引っ張っちゃいそうな感じがするのですが



のかたがたと組めると勉強になりそうだなーと思っています。




なんだかんだいって最終的に自分で書くことになると思うので、大先輩であるOpenCVのcvMatchTemplate関数を読んでおべんきょー。コードは次のURLから入手できます。



テンプレートマッチングについてもまとめたのでどうぞ。


ちゃちゃっと読んでいくよ!



323 CV_IMPL void
324 cvMatchTemplate( const CvArr* _img, const CvArr* _templ, CvArr* _result, int method )

引数がたくさん!



  • const CvArr* _img

  • const CvArr* _templ

  • CvArr* _result

  • int method


CvArrはOpenCVで用いられる配列用の型。_imgはソース画像、_templはテンプレート画像。_resultはマッチングの結果を返すための変数。各座標ごとにマッチングの結果を配置して返すので、これもグレースケール画像のような出で立ちのデータになる。


methodはマッチングアルゴリズムの指定で、以下の定数が使える。



  • CV_TM_SQDIFF

  • CV_TM_CCORR

  • CV_TM_CCOEFF

  • CV_TM_SQDIFF_NORMED

  • CV_TM_CCORR_NORMED

  • CV_TM_CCOEFF_NORMED


これらの意味するところはOpenCVのリファレンスで確認することができるのですが、とりあえずコードを読んでいきたいと思います。


以下、しばらく変数の初期化や作業用バッファの確保などが続きます。



347 int num_type = method == CV_TM_CCORR || method == CV_TM_CCORR_NORMED ? 0 :
348 method == CV_TM_CCOEFF || method == CV_TM_CCOEFF_NORMED ? 1 : 2;
349 int is_normed = method == CV_TM_CCORR_NORMED ||
350 method == CV_TM_SQDIFF_NORMED ||
351 method == CV_TM_CCOEFF_NORMED;

若い世代のC使いは三項演算子が苦手です(ホントか?


まあそれはそれとして、まずはnum_typeの確定から。コードを見れば一目瞭然ですが、num_typeは_NORMEDの有無に関係なくSQDIFFか、CCORRか、CCOEFFかを表すようになります。CCORRなら0、CCORFFなら1、そうでなければ(つまりSQDIFFなら)2。


逆にis_normedは末尾に_NORMEDがついた定数かどうかをチェックします。_NORMEDのつく定数の場合はis_normedが真になる(Cでは真は0以外だけどC++でもそうなのかな?)。


続く3行。



353 CV_CALL( img = cvGetMat( img, &stub, &coi1 ));
354 CV_CALL( templ = cvGetMat( templ, &tstub, &coi2 ));
355 CV_CALL( result = cvGetMat( result, &rstub ));

CV_CALL?


たぶんプリプロセッサマクロっぽいけど、見慣れない記法なのでちょっと不安。


ググってみたら先達の足跡が。



CV_CALLってなによ?[後で調べる]

わかんねーきっとプリプロセッサで処理されるのだろうが・・・


MEMO - OpenGL/Cudaツホクウオュ

あとで調べたけど追記するの忘れたパターンですね!!(ごめんなさいじょうだんです


もうちょいググってみるとこんなのが。OpenCV開発者向けのコーディング規約みたいなものかなー。



Instead of above functions one can use macros, which are more convenient to use:



  • CV_ERROR and OPENCV_ERROR instead of cvError.

  • CV_CALL and OPENCV_CALL instead of calling function and checking the status.



いくつかの関数は、それ自体をコールする代わりにマクロを利用すると便利で、推奨されているみたい。


CV_CALLの場合は、関数呼び出しとその値のチェックの代わりに利用するとエラー処理とかをライブラリにおまかせできてイイカンジっぽい。


とりあえず突っ込んだことは必要ないので、とりあえず今は普通にコールしていると考えることにします。


エラー処理


357行目からしばらくエラー処理が続く。



357 if( CV_MAT_DEPTH( img->type ) != CV_8U &&
358 CV_MAT_DEPTH( img->type ) != CV_32F )
359 CV_ERROR( CV_StsUnsupportedFormat,
360 "The function supports only 8u and 32f data types" );

入力画像のデータ単位が8bit符号なし整数か32bit浮動小数点のときのみ許容され、それ以外の場合はエラー。



362 if( !CV_ARE_TYPES_EQ( img, templ ))
363 CV_ERROR( CV_StsUnmatchedSizes, "image and template should have the same type" );

入力画像とテンプレート画像のデータ単位が同じでなければエラー。



365 if( CV_MAT_TYPE( result->type ) != CV_32FC1 )
366 CV_ERROR( CV_StsUnsupportedFormat, "output image should have 32f type" );

結果を受け取るためのデータ単位は32bit浮動小数点でなければエラー。



368 if( img->rows < templ->rows || img->cols < templ->cols )
369 {
370 CvMat* t;
371 CV_SWAP( img, templ, t );
372 }

条件は入力画像よりテンプレートのほうが行・列どちらかでも大きい場合。


CV_SWAPに違和感があるなーと思ったのは、普通Swapと名のつく関数は二引数のものが多いからかなー。もうひとつはなんだろ。ワーキングバッファかな。


ググると先ほどの先達のページが。



CV_SWAP( a, b, t )

aとbを入れ替える関数.


どうやらOpenCVで対応しているCvPointやIplImageなどでも可能なようだ.


tは入れ替えの際に必要になる一時データ保存用変数.当然aとbと同じ型.


関数について - OpenCV Memo

お、当たり。


ってことは入力画像よりテンプレート画像のほうが大きいときは入力とテンプレートを入れ替えちゃうのかな。cvMatchTemplateには「入力>テンプレートでなければならない」って制約があったような気がするんだけど、これで対応されてるってことは大丈夫なのかな?(もっともテンプレートのほうが大きい状況もなかなかないと思うけど)



374 if( result->rows != img->rows - templ->rows + 1 ||
375 result->cols != img->cols - templ->cols + 1 )
376 CV_ERROR( CV_StsUnmatchedSizes, "output image should be (W - w + 1)x(H - h + 1)" );

結果格納用のバッファは幅・高さともに(入力 - テンプレート + 1)でなければならない。これはテンプレートマッチングの性質上自明な制約だったはずなんだけど、その理由をド忘れ中。書いてたら思い出すかなー。



378 if( method < CV_TM_SQDIFF || method > CV_TM_CCOEFF_NORMED )
379 CV_ERROR( CV_StsBadArg, "unknown comparison method" );

アルゴリズムの指定が定数として準備されているものかどうかの確認。ここでこういう記述をするなら347行目あたりのフラグの処理ももっと高速かつ簡潔に記述できるのに!わかりやすさを優先してるならそれで統一したらいいじゃない!



381 depth = CV_MAT_DEPTH(img->type);
382 cn = CV_MAT_CN(img->type);

depthは入力画像の色深度。cnは何かよくわからないけどとりあえずスルー。



384 if( is_normed && cn == 1 && templ->rows > 8 && templ->cols > 8 &&
385 img->rows > templ->cols && img->cols > templ->cols )
386 {

条件。is_normedが立ってて、cnが1で、テンプレートが8x8より大きく、入力画像がテンプレートより大きくなければならない。該当する場合、以下の処理。



387 CvTemplMatchIPPFunc ipp_func =
388 depth == CV_8U ?
389 (method == CV_TM_SQDIFF_NORMED ? (CvTemplMatchIPPFunc)icvSqrDistanceValid_Norm_8u32f_C1R_p :
390 method == CV_TM_CCORR_NORMED ? (CvTemplMatchIPPFunc)icvCrossCorrValid_Norm_8u32f_C1R_p :
391 (CvTemplMatchIPPFunc)icvCrossCorrValid_NormLevel_8u32f_C1R_p) :
392 (method == CV_TM_SQDIFF_NORMED ? (CvTemplMatchIPPFunc)icvSqrDistanceValid_Norm_32f_C1R_p :
393 method == CV_TM_CCORR_NORMED ? (CvTemplMatchIPPFunc)icvCrossCorrValid_Norm_32f_C1R_p :
394 (CvTemplMatchIPPFunc)icvCrossCorrValid_NormLevel_32f_C1R_p);

これはとんでもなく長い三項演算子の連続ですね!アクロバティックだけどifを書き連ねるよりはきれいかなー。


この長い三項演算子をスルーしつつ今日はおひらき。続きはまた明日。


このアーカイブについて

このページには、2008年8月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年7月です。

次のアーカイブは2008年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 4.32-ja