改め Objective Technician

はぐれ技術者のやりたい放題

Wiiリモコンで赤外線信号を可視化

2009-10-29 00:03:23 | プログラミング
ケータイやテレビリモコンなどの赤外線信号を Wiiリモコンで拾ってパルスを可視化





実装は AS3 と WiiFlash.

上の動画は、ケータイでプロフィールを送ろうとして赤外線通信の相手を探してるときの信号列。

下の緑のラインは1秒ごとの目印。


このケータイは、8回トライして応答がなかったらあきらめる仕様らしい。



Wiiリモコン側と通信機器側の同期がとれているわけではないので、信号列全部を拾えてはいない。

全力で頑張るフリをするよ、寝ててもできるけどな

2009-10-28 01:13:23 | プログラミング


OK, I'll pretend this requires all my attention, when we both know I could do it in my sleep.


Twenty Four の SeasonⅤ でモリスが通信機器の改造を頼まれたときに言ったセリフ。


いつかどこかで使ってみたい。




以下は、バイトで作ってる物理シミュレーションの Flash 3件
(これの続き)

今回は物理エンジン Box2D を使ったもの。




画像リンクをクリックするとシミュレーションページに飛びます。


・気体の分子運動




・Newton's cradle




・クレーン車の転倒




つづく



メモ:

b2Body の衝突検出には b2ContactListener を継承したコンタクトリスナを使う。

例えば、衝突時に音を鳴らしたいときは↓みたいなクラスを作る。

普通のイベントみたいにコンタクトイベントがあるのかと思ったけど、仕様らしい。

package  
{
	import Box2D.Collision.b2ContactPoint;
	import Box2D.Dynamics.b2Body;
	import Box2D.Dynamics.b2ContactListener;
	import flash.media.Sound;
	import flash.net.URLRequest;
	
	public class ContactListener extends b2ContactListener {
				
		private var sound:Sound;
		
		public override function Add(point:b2ContactPoint):void {
			
			sound.play();
		}
				
		internal function load():void {
			sound = new Sound(new URLRequest("sample.mp3"));
		}
	}

}



徒然草 神無月のころ

2009-10-25 00:31:07 | 勉強
第十一段


神無月の頃、ScienceDirectといふサイトを過ぎて、ある文献を尋ね読む事侍りしに、数多なる引用論文のリンクを踏み分けて、かねて探したる研究見つけたり。

書類に埋もるゝ机の中ならでは、つゆおとなふものなし。

デスクトップに未読の論文など折り散らしたる、さすがに、住む人のあればなるべし。


かくてもあられけるよとあはれに見るほどに、先行研究の追試の幾つか行いたるが、それらのきびしく再現されずして、原因を探りしこそ、少しことさめて、このデータなからましかばと覚えしか


雪国

2009-10-24 00:04:58 | 勉強
先輩に連れられて廊下を抜けると修羅場であった。学生の前途が暗くなった。会議室の前で足が止まった


向側の座席から発表者が立って来て、パワポを開きプレゼンを始めた。教授の怒声と溜息が流れ込んだ。発表者は目をいっぱいに見開いて、遠くへ叫ぶように、「すみません、すみません」

レーザーポインタをさげてゆっくり前へ出てきた次の発表者はいかにも負のオーラに身を包み、目に大きなクマを作っていた。

もうそんな状況かと学生は会議室を眺めると、撃沈されたらしい院生が隅の方に寒々と散らばっているだけで、彼の心はそこまで行かぬうちに闇に呑まれていた。

「先生、あと少しなんです、あと少し時間を下さい」
「ああ、話にならんじゃないか。またやり直しかい。先週も同じことを聞いたよ」



オリジナルはこちら

相互再帰

2009-10-23 00:19:37 | プログラミング
二つ以上の関数を相互に再帰呼び出しするという手法



以下は、sin(1°) と cos(1°) の値だけ知ってれば加法定理で sin(整数°) と cos(整数°) が全部求められるというもの。


一年生のときの演習課題に出て、今でもよく思い出す例題。


モカが VisualBasic も楽しいからというので、初めて VB で書いてみた。





	
Public Class Form1

    Private Function RecursiveCos(ByVal angleDegree As Integer) As Double

        If (Math.Abs(angleDegree) = 1) Then
            Return 0.99984769515639127
        ElseIf (angleDegree = 0) Then
            Return 1

        Else
            Dim arg As Double = angleDegree / 2
            Dim a As Integer = Math.Floor(arg)
            Dim b As Integer = Math.Ceiling(arg)

            Return RecursiveCos(a) * RecursiveCos(b) - RecursiveSin(a) * RecursiveSin(b)

        End If
    End Function


    Private Function RecursiveSin(ByVal angleDegree As Integer) As Double

        If (Math.Abs(angleDegree) = 1) Then
            Return 0.017452406437283512 * Math.Sign(angleDegree)
        ElseIf (angleDegree = 0) Then
            Return 0

        Else
            Dim arg As Double = angleDegree / 2
            Dim a As Integer = Math.Floor(arg)
            Dim b As Integer = Math.Ceiling(arg)

            Return RecursiveSin(a) * RecursiveCos(b) + RecursiveCos(a) * RecursiveSin(b)

        End If
    End Function


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim var As Integer
        If (Not Integer.TryParse(TextBox1.Text, var)) Then
            MsgBox("FormatException")
            Return
        End If

        If (RadioButton1.Checked) Then
            Label1.Text = RecursiveSin(var).ToString()
        Else
            Label1.Text = RecursiveCos(var).ToString()
        End If

    End Sub

End Class










加法定理と言えば、うちの高校は男子校だけあって、とんでもなく下品な語呂合(ry










再帰といえば、関数型言語の ML(meta language) を思い出す。


うちの研究所の敷地内にも ML の開発をしているチームがいる。



ML では、リストの生成からループ処理まで、なんでもかんでも再帰で書く(というイメージを持っている)。




再帰の考え方は美しいが、でも、ここまでひたすらに再帰を使いまくる言語を愛してしまう人たちは変態なんじゃないのと思う。






「変態」は称賛の言葉である。

念のため。

引数の省略と関数オーバーロード

2009-10-22 00:45:33 | プログラミング
Java から ActionScript3.0 に乗り換える際に不便だと思ってたことに、AS3 は関数オーバーロードができないという点があった。


しかし、その代わりに AS3 では引数のデフォルト値を明示することで、引数を省略することができる。


引数省略は狭い意味での関数オーバーロードだと言える。


ただ、その書き方が


function hoge(argv0:int, argv1:int, argv2:int = -1, argv3:int = 0, argv4:int = 2, argv5:int = 9):void {

}

みたいに、引数にいわゆる優先順位みたいなものをつけて、使用頻度の高いパラメータは前に、まれにしか活用しないパラメータは後ろへ追いやるといったことになっているため、この例だと「argv4 を活用したいけど、argv2 と argv3 はデフォルトのままでいい」といった場合に結局 argv2 も argv3 を引数を指定する必要がある。




というケースは起こり得るのだけど、実際に使っていてこうなったことは思い出す限りないので、これで事実上不便ではないのかもしれない。



むしろ AS3 を使い込んでいくと、パラメータを省略できる形で引数に指定するという書き方が結構なじんでくる。


確かに、関数オーバーロードを使うときれいにコーディングできたような気がするけど、よく考えたら混乱の元になりかねないし、実装の中身が違うんだったら関数名も分かりやすく変えたほうがいいような気がしてくるもの。




関数名とその実装が一対一に対応して、関数を呼び出す際に必要なときだけパラメータを渡す。

というのが、AS3の設計者が導き出した、自由と制約との絶妙なバランス点なのだろう。


やろうと思えばオーバーロードの方法はいくつかあるけど。




実によく考えられた言語仕様だと思う

坊ちゃん

2009-10-21 00:05:29 | 勉強
親譲りの無鉄砲で子供の時から損ばかりしている。

大学院一年目の時分勝手に実験を計画して教授には事後報告でデータを取り、それを学会に出した事がある。

なぜそんな無闇をしたと聞く人があるかもしれぬ。

別段深い理由でもない。

本業の研究とは関係ないプログラムを趣味で組んでいたら、先輩の一人が偉そうに、いくら自分の好きなことをやっているといっても、研究ではそう上手くいくものじゃない。キミもあと何年かすれば分かるさ。と囃し立てたからである。

何週間か研究室に泊まり込んで文献を読み研究ストーリーを作り実験をまとめ資料を作成していた時、スタッフの一人が大きな眼をして一か月ちょっとでゼロから結果を出そうとするなんてバカじゃないのと言ったので、この次は一週間で結果を出して見せますと答えた。


枕草子

2009-10-20 00:12:36 | 勉強
春は構想。
まことに白紙のままの、研究テーマの僅かも具体化せずとて、脈絡のない予備実験データの細くたなびきたる。


夏は実験。
徹夜はさらなり。深夜実験もなほ、被験者の多く犠牲になりたる、また、ただ一つ二つなど、成り行きに研究テーマの脱線して行くもをかし。研究の方向性など発散するもをかし。


秋は論文。
夕 日のさしてやうやく論文を書かんとする気分になりたるに、すこし教授室へ確認へ行くとて、二時間三時間、三時間四時間など議論の発展するさへあはれなり。 まいて、現実逃避などの連ねたるが、ぷろぐらみんぐと云う遊びに興じるは、いとをかし。日入り果てて、なほぷろぐらみんぐに熱中しきぃぼぉどを叩く音、ま して堂々と仕事をなす振りとなるなど、はた言ふべきにあらず。


冬は学会。
原稿締切に追われるは言ふべきにもあらず、実験データの不整合も、またさらでも、いと矛盾ありきに、追加実験など急ぎ行いて、研究ストーリーを練り直し回るも、いとつきづきし。昼になりて、追試データを持ていけば、教授の顔色も白き灰がちになりてわろし。




PV3D(AS3):Flashでマウスインタラクティブなルービックキューブ

2009-10-19 00:25:36 | プログラミング
またルービックキューブの話




前に作ったルービックキューブFlash を、マウスで操作できるようにした。


画像クリックで動きます↓(重いかも)





Papervision3D のプリミティブに対してマウスイベントを送るには、org.papervision3d.events.InteractiveScene3DEvent を使う。

まず Viewport3D で
viewport.interactive = true;
としておいて、必要なら
viewport.buttonMode = true;
にして、

次にプリミティブのマテリアルで
mat.interactive = true;
とする。

あとは org.papervision3d.objects.primitives.* のインスタンスで
addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onClick);
みたいにすれば、特定の対象だけにマウスイベントを送れる。


背景領域のドラッグは Papervision3D とは関係なく、いつも通りに
stage.addEventListener(MouseEvent.MOUSE_MOVE, onDrag);
みたいにするだけ。



AS3ソースはこちら











関係ないけど、なんとセンターキューブがないボイドキューブというものをつい最近知った。

中心がくり抜かれていてキューブの向こう側が見える。


真ん中がないのに回るとは、どんな仕組みなんだ!

と思って、すぐに買った。


この構造はもはや手品の領域だ。


考えた人すごい。




パズルとしては、普通に解くとノーマルのルービックキューブでは有り得ない状態になることがあるのがさらに面白い。