Archive for July, 2007

給料日、早めに帰ってふとビックカメラに寄り、気づいたらWiiを手にしていた

July 25th, 2007  |  Published in Uncategorized

けど、後悔はまったくない。

img185.jpg

TopCoder::SRM::360

July 25th, 2007  |  Published in Uncategorized

深夜0時スタート。 すごい眠い。

Easy

ロボットの向きを制御するコマンド列をうけとって、最終的な向きを返す問題。 角度が [0..360] の間しかないので、そこにひっかからないようにして submit。10分程度。

Medium

なんか解き方の見当がつかなかったので、あっさりスルー。

Hard

グラフのアルゴリズムをちゃんと勉強しなきゃと読んでいたチュートリアルに載ってた深さ優先探索で解けるかなー、とうんうん唸ってみたけれどけっきょく解けず。50分程度。

Challenge Phase

Mediumをsubmitしてた人のコードにおもしろいのがあって、

int function(arg) {
   return random(arg); // you can challenge if lucky :D 
}

乱数かよ! と。 でも実際、Challengeが成功するかはランダムなので、捨て身の作戦としてはなかなか乙なものがあります。

結果

Roomで2位、Div2で185位。 Ratingは 876 → 928 になって、緑色人間になれました。やった。

20070725.png

このまま上昇曲線を描いていきたいところです。

しかし眠いよ。

Tags:

USB冷え冷えクーラー on MacBook

July 20th, 2007  |  Published in Uncategorized

MacBookはかっこよくて速くてUNIXで、と申し分ないのですが、唯一我慢できないのがその熱さです。 もう夏とか我慢できない。

何もしてなくても燃えたとかいう話もありますし、この夏はちゃんと冷やすかということで を買ってみました。MacBookにもフィットするはずのタイプです。

使用感

つけてみたらこんな感じ。

ちゃんとぴったりおさまります。キーボードに傾斜もついて、ちょっとタイプしやすくなりました。

ファンで冷やすタイプで、強弱が選べます。 どれくらいの音量なのか知りたい人もいるかもしれないので、ICレコーダで録音してみました。 録音は、静かな部屋で、ファンの音以外はなにもしないところで行いました。ファンの音だけではよく分からないので、比較するためにキーボードをすこしタイプしてみました。

  • 冷え冷えクーラーの音 (弱)
  • 冷え冷えクーラーの音 (強)

さすがに夜中に何の音もしない環境にいると、強モードではいささかうるさすぎる気がします。昼間だったらあんまし気にならないのですけれど。

効果

ふつうにブラウザをひらいてあれこれと作業をしていて、CPUをさほど使っていないとき。 計測には、iStat menus を使いました。

  • ファンなし : 56℃程度
  • 弱モード : 51℃程度
  • 強モード : 49℃程度

たしかに冷やされていそうです。 実際、パームレストや本体裏をさわってみたところ、あの焼けるような感覚がありません。

まとめ

ほんとうは、ちょっと空間をつくるだけでもけっこう違うだろうし、それで十分なんじゃない? と思ってました。 でも実際つかってみると、きちんと風を送ってやることでちゃーんと冷やせるんだということが分かり、なかなか良い買い物だったと思います。MacBookの寿命伸ばしたいし。

あと、お風呂でばりばりと開発しちゃったりする方なんかにもちょうど良いかも。風呂のフタはけっこう熱くなってるので。


posted with amazlet on 07.07.20
エレコム (2006/06/01)
売り上げランキング: 55
おすすめ度の平均: 4.5
4 効いてるようです
4 確かに効果はあるかも
5 効果あり
Tags: ,

舞妓Haaaaan!!! を観た

July 18th, 2007  |  Published in Uncategorized

ものすごい散文的なんだけど、底に流れていのは 「好きを貫く」ということ。 それはもうがむしゃらに、ひたむきな情熱で。

で、破竹のごとく突き進んで道を究めてしまい、ふと虚しさを感じている阿部サダヲに、 柴崎コウがばっしーんとビンタをするところが、ものすごい切なくてよかった。

あと、随所にさしこまれている小ネタがレベル高くて参る。 スポーツ新聞に「お前は誰だ!」とかすごすぎる。テンポとウィットの絡み方がばっちりなんだな。

柴崎コウが演じる健気さを見ていて、これには頭が上がらんなーと思うかたわら、 こんな風に好きを貫き通す男に女は惹かれるもんなんかいなー、と妻に聞いてみたら、 そうでもないよ、とのこと。いろいろだよね。

Tags:

TopCoder::SRM::358

July 17th, 2007  |  Published in Uncategorized

ひさびさに常識的な日本時間で始まるSRM358です。

いまCoding Phase が終わったんですけど、Medium/Hardともに、できそうでできない焦燥さが高いのです。むずいよ。 Easyを解くのでさえ、いつもより時間がかかってしまってもうだめです。

今日はChallenge Phase の練習としよう。

結果

Challenge Phase では、境界条件を考えているうちに時間切れに。むずかしいものです。

EasyのSystemTestはパスできました。 Room Summaryみてたら、Medium/Hard ともに正解者がいないという… なんてこった。

tc_srm_358.png

Ratingはほんの少し上がりました。いちおうここのところ上向きなのでこのまま少しずつでもキープしたいところ…

post-srm358.png


しかし、このままEasyを解けるだけではいつまでたってもただの色無し人間なので、ひとつブレイクスルーが欲しいところです。

Tags:

RubyCocoa で QuartzComposer CustomPatch (2)

July 15th, 2007  |  Published in hack

とりあえず、できました。

スクリーンショット

サンプル

input, output ともにStringのPortを1つずつもち、入力にある”Objective-C”を”Ruby”に正規表現で置換するというだけのサンプルを書きました。

RubyPatch (binary & source) rev3 (i386 Binary)

RubyCocoaをUniversal Binary でビルドしていなかったため、いまのところIntel Mac だけで動きます。

RubyCocoa の svn trunk、 MacBook Kuroで動作確認をしています。

何をしているか

  1. Patchがロードされるとき、すなわち “registerNodesWithManager” が呼ばれるときに、RBBundleInitを呼んでRubyCocoaの準備をする
  2. Patchの動作を記述するObjective-CのクラスをProxyとして、実際の動作を記述するRubyクラスのインスタンスを保持させる
  3. Rubyクラスは、Objective-CクラスからPortをもらってくる
  4. Patchを実行するイベントがきたら、Rubyクラスのインスタンスに対して処理を移譲

といったところ。

実際のコードは、RubyQC::Trac にあるのでご覧ください。

このアプローチの問題点

  • いちいち全メソッドを Objective-Cのクラス → Rubyのクラス に投げるよう書くのがめんどう
  • Portの記述がObjective-Cのクラスにしか書けない (みたい) なので、Portを加えたり減らしたりするたびにObjective-C/Rubyコードともに変更しないといけない。わすれそう。

OSX::QCPatchクラスをRubyクラスで継承できて、さらにPortの情報もRubyクラスで書けるようになれば、これらの問題は解決しそうです。

課題

QCPatch.execute は、3つの引数をとるのですが、Rubyクラスのメソッドにどうやって3引数を渡すのか分からない…

18:03 追記

MLで、LimeChatの中の人に教えてもらいました。

objc_method :execute_time_arguments, %w|char id double id|
def execute_time_arguments(fp8, fp12, fp20)
  ...
end
のようにすればいいよ、とのことで、ばっちり動きました。ありがとうございます。


とはいえ、CustomPatch がRubyで書けるようになったのは大きな進歩です。ApacheReaderPatch とかも、ずいぶんと簡単に書けそう。

Tags: , , ,

RubyCocoa で QuartzComposer CustomPatch をつくりたい

July 14th, 2007  |  Published in Uncategorized

先に今の状態 : できそうな糸口がつかめたところで挫折 :(

SocketReaderPatch、ApacheLogPatch とQuartzComposerのカスタムパッチをつくってきたのですが、ここらでRubyで書くかと思い立ちました。 バベル案内ホワイの(感動的)Rubyガイド を読んで、こんなにもRubyが世界に受け入れらているのかと感動したことと、いくつかCustomPatchをつくってみて、CustomPatchj作成の概観がつかめてきたから。

どうやるか

RubyCocoaのsvn trunkを使います。 最近のリビジョンでは、QuartzComposer.frameworkが使えるようになっているのです。


require 'osx/cocoa' r=> true OSX.require_framework 'QuartzComposer' => true OSX::QCStructure => OSX::QCStructure OSX::QCPatch => OSX::QCPatch



ひゃっほう。
で、いつもどおりQuartzComposer CustomPatch の Xcode template をつかって、Xcodeプロジェクトをはじめます。
RubyCocoa.frameworkをリンクしておき、RubyPatchPrincipla.m を

のように書きました。
RubyCocoaのbundle生成用APIを用いています。


loadされるRubyスクリプトはこういうもの。
require 'osx/cocoa'
OSX.require_framework 'QuartzComposer'


class RubyPatch < OSX::QCPatch #attr_accessor :inputFoo, :o utputBar
def RubyPatch.logger=(l) @ = l end
def RubyPatch.executionMode @("executionMode") 2 end
def RubyPatch.allowsSubpatches @("allowsSubpatches") 0 # in objc.h, NO is defined as 0 end
def RubyPatch.timeMode @("timeMode") 1 end
def init @("init") = OSX::QCBooleanPort.alloc.init end
def initWithIdentifier(fp8) @("initWithIdentifier") init self end
def setup(fp8) @("setup %s, %s", fp8, fp8.class) fp8 end
def cleanup(fp8) @("cleanup") end
def enable(fp8) @("enable") end
def disable(fp8) @("disable") end
def execute(fp8, time, arg) @("execute") true; end end
OSX.init_for_bundle do |bundle, param, logger| logger.info("init bundle=%s param=%s", bundle, param) RubyPatch.logger = logger end


templateが生成するObjective-Cのコードを、Rubyに書き下したものですね。

実行



ビルドもすんなり通り、さっそく実行してみます。
qc-exception-rubycocoapatch.png
アウチ。 なんか例外が投げられてしまいます。 出しているログを眺めてみると…

正常なもの (Objective-Cで書いたカスタムパッチ)



2007-07-14 14:35:03.568 Quartz Composer[15580] RubyPatch.plugin (Quartz Composer): init bundle=NSBundle  (loaded) param=
2007-07-14 14:35:03.708 Quartz Composer[15580] initWithIdentifier
2007-07-14 14:35:03.708 Quartz Composer[15580] executionMode
2007-07-14 14:35:03.708 Quartz Composer[15580] timeMode
2007-07-14 14:35:03.710 Quartz Composer[15580] allowsSubpatches
2007-07-14 14:35:03.741 Quartz Composer[15580] allowsSubpatches
2007-07-14 14:35:03.741 Quartz Composer[15580] allowsSubpatches
2007-07-14 14:35:03.741 Quartz Composer[15580] allowsSubpatches
2007-07-14 14:35:03.785 Quartz Composer[15580] setup

だめなもの (RubyCocoaで書いた)



2007-07-14 14:36:11.300 Quartz Composer[15602] RubyPatch.plugin (Quartz Composer): init bundle=NSBundle  (loaded) param=
2007-07-14 14:36:11.301 Quartz Composer[15602] assert passed !
2007-07-14 14:36:11.342 Quartz Composer[15602] RubyPatch.plugin (Quartz Composer): initWithIdentifier
2007-07-14 14:36:11.342 Quartz Composer[15602] RubyPatch.plugin (Quartz Composer): init
2007-07-14 14:36:11.345 Quartz Composer[15602] RubyPatch.plugin (Quartz Composer): allowsSubpatches
2007-07-14 14:36:11.377 Quartz Composer[15602] RubyPatch.plugin (Quartz Composer): allowsSubpatches
2007-07-14 14:36:11.378 Quartz Composer[15602] RubyPatch.plugin (Quartz Composer): allowsSubpatches


よく見てみると、RubyCocoaで書いた方は、initWithIdentifier のあとに executionMode, timeMode が呼ばれることなく allowsSubpatches が呼ばれています。 executionMode, timeMode が分からないので、QuartzComposer としてはこのパッチをどの種類にして良いか分からず、レンダリングできませんよーという例外がきてるっぽい。

問題



ではなぜ executionMode, timeMode が呼ばれないか、考えてみます。
QCPatchのヘッダによると、executionMode, timeMode はそれぞれ int を返すメソッドのようです。 ところが、RubyCocoaで用意した executionMode, timeMode は返り値の型を指定していません。 、RubyCocoaではRubyのメソッドが整数型を返すとき、Objective-Cの世界にはNSDecimalNumberの型を返すようになっているようです。
その結果、executionMode, timeMode は別のメソッドとして認識されてしまい、QCPatchのメソッドをオーバーライドできず、呼ばれていないのではないかと推測しました。

解決案


  1. intで返すようにRubyCocoaでなんとかする
  2. QCPatchをRubyクラスで継承せずにObjective-Cのクラスで継承させ、そのメンバにRubyクラスのdelegateのオブジェクトをもたせて、実際の処理はdelegateオブジェクトに振る


2が手っ取り早そうですが、いまひとつかっこいくないなぁ。

別の問題



CustomPatchのテンプレートによると、QCPatchを継承したクラスのメンバに QCPortクラスのインスタンス (ex. inputEnable, outputString など) を書くことで、パッチのinput/outputポートを指定できるような仕組みになっています。
じゃあ、
attr_accessor :inputEnable, :o utputString
...
みたいにすればいいのか、というとどうもそうでもないみたいで…


やはり解決案2を使うしかないのかもです。

import


imporut "RubyPatchPrincipal.h"



RubyPatchPlugin + (void)registerNodesWithManager:(GFNodeManager*)fp8 { static bool loaded = false; if (!loaded) { if (RBBundleInit("/tmp/custom_patch.rb", self, nil)) { NSLog(@"[RubyPatchPlugin.registerNodesWithManager] RBBundleInit failed"); } else { loaded = true; } }
Class helperClass = NSClassFromString(@"RubyPatch"); [fp8 registerNodeWithClass:helperClass]; }
Tags: , ,

TopCoder::SRM::357

July 13th, 2007  |  Published in Uncategorized

AM 11:15 : Coding Phase 終了。ふー。

EASY

std::find_if にもう1つ引数を渡したくて、 std::bind1st の使ってみようとしたのですが、うまくいかず。調べるのに5分くらいのロス。 しかたなくべたにforループを書いてsubmit。203.38ptsでした。

MEDIUM

ナップザック問題そのままか! と、最近習いはじめたDPをつかって解いてみました。 DPの実装を思い出しながらなんとか書いたのですが、テストケースにひっかかり単純なナップザック問題ではなかったことに気づいて、ちょこちょこ修正してsubmit。235.78ptsでした。

HARD

ページランクもどきの実装でおもしろそう。方針が解りそうなところで時間切れ。


いまChallenge Phaseが始まったのですが、そろそろ出かけないといけない時間なのでここで戦線離脱です。帰ったときに、System Test で fail してなければいいのだけれど。

Tags:

google-gflags

July 13th, 2007  |  Published in Uncategorized

Google Japan BLog : Google が公開しているソフトウェアの解説 ( その 1 )という記事を読んで。

google-gflags は、getopt(1)と違って、各ライブラリが自分でコマンドライン引数を処理できる。 いちいちmainを書き換えたりしなくてよいので、疎結合が実現できてよさそうです。

僕がよくやるのは、環境変数をセットする方法で、

DEBUG_LEVEL=3
export DEBUG_LEVEL
などとしておいて、

char *dl(getenv("DEBUG_LEVEL"));
int debug_level = (NULL == dl) ?
  DEFAULT_DEBUG_LEVEL :
  atoi(dl);
みたいにします。

Boost.Testのユニットテストフレームワークで、ログのレベルを指定する方法に環境変数が使われており、これを真似しているわけです。

参考 : Boost.Test > Components > The Unit Test Framework > Parameters > Log level


いずれにせよ、他のモジュールに及ぼす影響を最小限にするような設計が心がけとして大切です。 フラグを導入したいから、mainに相当するモジュールにかけあって、Makefileを書き直して、全モジュールをフルビルドして、とかはやりたくないものです。

Tags:

集団で身体を動かす

July 11th, 2007  |  Published in Uncategorized

ひさびさに集団でやるスポーツに参加しました。 おかしいんじゃないの? というくらいの量の汗をかき、ころげまわるように走った。

ここのところ、個人でやるスポーツばかりだった (水泳、サイクリング、筋トレ、etc) ので、すごい懐しい感じがした。楽しいなー。

いろいろとイヤなことがあったり、つまんないこともあったりする日々でも、人と人とが自然と笑顔を向けあえる、そんなところがスポートのすばらしいところだとか思ったのでした。しかし身体いたい。