Author Archives: bouze

simpleXML manners

<data>
	<elem name="A" age="10"/>
	<elem name="B" age="20"/>
	<elem name="C" age="30"/>
</data>

みたいなxmlの、nameがAのelemのage、要するに10をsimpleXMLで取得しゅる方法。

まずxmlを読み込んで、

$xml = simplexml_load_file("data.xml");

xpathでnameがAのエレメントを抽出する。

$elem = $xml->xpath('//elem[@name="A"]');

$elemがsimpleXMLElementオブジェクトなのでstring型にキャストする。

$age = (string) $elem[0]["age"];
echo $age;
//10

このstringにキャストする部分でだいぶハマった。直感的なようで直感的でないsimpleXML。

to do something syncronizing sound

Flashで曲の再生に正確に同期してごにょごにょしたい時のメモ。Soundboothを使ってマーカーを埋め込むと曲の再生時間に紐づいてイベントが発行されるのでタイミングのズレがなく同期できる。

まずSoundboothにてキューイベントを発行したい場所にマーカーを配置。

マーカーパネルで名前、パラメータを編集し、マーカーのタイプをイベントにする(←これ重要)。

マーカーの配置が完了したら別名で保存から「FLV | F4V」形式で書き出す。書き出し設定のビデオを書き出しのチェックを外して、マルチプレクサタブのFLVにチェックを入れる。オーディオタブでオーディオの設定をして「OK」で書き出し。

通常通りflvを読み込み、onCuePointにハンドラを張る。onCuePointは再生箇所がSoundboothで設定したマーカーの地点まで来た時に自動で呼び出される。引数に詳細情報を含んだObjectが渡される。

var nc:NetConnection = new NetConnection();
nc.connect(null);
ns = new NetStream(nc);
var video:Video = new Video();
video.attachNetStream(ns);

var myClient:Object = new Object();
myClient.onMetaData = function(info:Object):void
{
}

//ここでonCuePointを受け取る
myClient.onCuePoint = function(info:Object):void
{
       trace("name:"+info.name);
       trace("time:"+info.time);
       trace("parameter:"+info.parameters.tick);
};
ns.client = myClient;
ns.play("sound.flv");

詳細情報を含んだObjectのパラメータはnameにマーカーの名前が、timeにマーカーの配置された時間(ミリ秒)が、parametersにSoundboothのマーカーパネルで設定したパラメータが名前と値が対で含まれている。

このやり方だと外部flvを読み込まなくてはいけないので、サウンドデータをファイルに埋め込んでしまいたい場合はSoundboothのマーカー情報をxmlで書き出し、Flash側でイベントの発行すればいい。

xmlの書き出しはSoundboothでマーカーを設定した後、「ファイル→書き出し」からできる。このxmlにはマーカーごとに時間と名前パラメータなどonCuePointで受け取れる情報はすべて入っている。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<FLVCoreCuePoints Version="1">
	<CuePoint><Time>1566</Time><Name>0</Name></CuePoint>
	<CuePoint><Time>1813</Time><Name>1</Name></CuePoint>
	<CuePoint><Time>2255</Time><Name>2</Name></CuePoint>
</FLVCoreCuePoints>

あとはFlash側でこのxmlを読み込み、音楽の再生時間を監視し続けながら、マーカーの時間が来たらしかるべき処理をすればいい。

//ライブラリから音楽データを読み込む
music = new Music() as Sound;
//30fpsで現在の再生時間を見にいく
timer = new Timer(1000 / 30);

//マーカー情報を持ったxmlを読み込みパースする
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, function(e:Event)
{
       var xml:XML = new XML(loader.data);
       var length:int = xml.CuePoint.length();
       var setting:Vector.<Vector.<int>> = new Vector.<Vector.<int>>(length, true);

       for (var i:int = 0; i < length; i++)
       {
               setting[i] = new Vector.<int>(3, true);
               setting[i][0] = int(xml.CuePoint[i].Name);
               setting[i][1] = int(xml.CuePoint[i].Time);
               //通過済みチェックフラグ
               setting[i][2] = 0;
       }

       //音楽と監視開始
       sc = music.play();
       timer.addEventListener(TimerEvent.TIMER, function(e:TimerEvent):void
       {
               for (var i:int = 0; i < length; i++)
               {
                       //再生中の時間がキューポイントの時間を超えて、かつ通過済みでなければ
                       if ( setting[i][1] <= sc.position && !setting[i][2] )
                       {
                               trace("cue name:" + setting[i][0]);
                               trace("cue time:" + setting[i][1])
                               //通過済み
                               setting[i][2] = 0;
                               return;
                       }

                       if ( sc.position > music.length )
                       {
                               trace("再生終了")
                       }
               }
       });
       timer.start();
);
loader.load(new URLRequest("cuePoints.xml"));

manipulating svg with jquery

jqueryプラグインのjquery svgを試してみたのでメモ。このプラグインを使えばsvgの表示できるブラウザならどれでもいける(はず)。前述のインラインsvgも大丈夫。 GPL & MIT ライセンス。

1. セットアップ

まず空のdivを用意。

<div id="svg"></div>

ラッパーdivのサイズがsvgのサイズに適用されるのでdivのサイズを先に定義する。

//1000×1000px
$("#svg").width(1000).height(1000);

初期化。div中にsvgタグを作ってくれる。

$("#svg").svg();

SVGWrapperオブジェクトの参照を取得する。このSVGWrapperオブジェクトがsvg操作のルートになる。

var wrapper = $("#svg").svg('get');

あとはこの$svgの関数を実行すればsvgの描画ができる。

2. 四角形の描画

座標(10,20)に縦100、横200、塗り#ff0000、線の色#000000、線の太さ1の四角形を描画する。

var rect = wrapper.rect(10,20,100,200,
{
	fill: "#ff0000",
	stroke: "#000000",
	strokeWidth: 1
});

3. プロパティの操作

rectの座標を(100,100)に、透明度を50%に変更する。

wrapper.change(rect,
{
	x: 100,
	y: 100,
	opacity: 0.5
});

4. アニメーション

jquery.svganim.jsをロードしておけばjqueryのanimateが使えるようになる。アニメーションできるプロパティはここを参照。
3秒かけてrectを座標(200,200)に、透明度100%に変更する。

$(rect).animate(
{
	svgX: 200,
	svgY: 200,
	opacity: 1.0
},3000);

5. 外部svgのロード

svg/mountain.svgをロードして読み込み完了後loadSvgCompleteHandlerを実行する。

wrapper.load('svg/mountain.svg', 
{
	onLoad: loadSvgCompleteHandler
});

6. svgをテキストで取得

rectをテキストで取得。

alert(wrapper.toSVG(rect));

出力は、

<rect x="100" y="100" width="100" height="200" fill="#ff0000" stroke="#000000" stroke-width="1" opacity="0.5" style="opacity: 0.5; "></rect>

using simpleXML to parse xml with namespace

simpleXMLを使ったnamespase付きxmlのパースでハマったのでメモ。

パースするxmlを文字列として$strに代入。

$str = <<<XML
<html xmlns="http://www.w3.org/TR/xhtml1">
	<body>
		<p>test</p>
	</body>
</html>
XML;

$strに代入した文字列をSimpleXMLElementオブジェクト化する。

$xml = new SimpleXMLElement($string);

simpleXMLElementのregisterXPathNamespaceでnamespaceを登録する。第一引数はnamespaceプレフィックス。こういうの<prefix:html>とかこういうやつ<xml:html>。たぶんここは適当でいい。第二引数はパースするxmlのnamespace。

$xml->registerXPathNamespace("xhtml", "http://www.w3.org/TR/xhtml1");

xpathで検索する時は先のプレフィックス付きで渡す。

$p = $xml->xpath("//xhtml:p");
echo $p[0];

結果は

test

なんかnamespaceって仕様があとづけっぽくて肌が合わない。

embedding inline svg

HTMLに直接SVG埋め込んでごにょごにょしたくてハマったのでメモ。

HTML5の仕様上インラインSVGは認められているものの、現状対応してるのはIE9とFirefox4のみらしい。その他のブラウザはHTML内で以下のように記述してもSVGは描画されない。

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
	<svg width="100" height="100" viewBox="0 0 100 100">
		<rect x="0" y="0" width="50" height="50" />
	</svg>
</body>
</html>

解決方法は3通り、
1. objectタグで埋め込み
2. XHTMLに記述する
3. JavaScriptで記述する

今回はダイナミックに図形を書き換えたいので1はNG。拡張子がxhtmlに変わるのがキモイので2もNG。よって今回は3のjsによるアプローチを試した。

HTMLは先ほどと同じ。SVGをラップするdivタグを用意。

<html>
<body>
	<div id="svg"></div>
</body>
</html>

まずHTMLとSVGの名前空間を分離するためにSVG用の名前空間を用意。

var svgNS ="http://www.w3.org/2000/svg";

createElementNSで先ほど用意したSVG用の名前空間にsvgタグを作る。

var svg = document.createElementNS(svgNS, "svg");

各要素をセットする。

svg.setAttribute("width", 100);
svg.setAttribute("height", 100);
svg.setAttribute("viewBox", "0 0 100 100");

ラッパーdivを捕捉して先ほど作ったSVGタグを追加する。

var wrapper = document.getElementById(wrapperId);
wrapper.appendChild(svg);

これでsvgの用意はok。あとはSVGの名前空間の方に要素を追加、操作すればいい。
例:円を描画。

var circle = document.createElementNS(svgNS, 'circle');
circle.setAttribute('cx',50);
circle.setAttribute('cy',50);
circle.setAttribute('r',50);
svg.appendChild(circle);

結論、クソめんどいからSVGをまるっとラップしたショートカットクラスが欲しい。
あった。

academy awards

ここ二ヶ月ほどバイトの通勤時間を利用して歴代アカデミー作品賞をさかのぼって見てる。「アカデミー賞をさかのぼる」っていうルールがない限り見ないような作品を見まくってる。

抜けてるのは近場のレンタル屋で見つかんないやつ。これを機にオンラインレンタル試してみようかな。

※追記(2012.11.14)
全部観終わった。一番よかったのが「クラッシュ」、その次が「フォレスト・ガンプ/一期一会」、その次が「イングリッシュ・ペイシェント」。

以下各作品の個人的なスコア。

★★★★★:自分史に残る名作
★★★★☆:自信を持って他人に薦められる
★★★☆☆:おもしろい
★★☆☆☆:おもしろくない
★☆☆☆☆:時間の無駄だった
☆☆☆☆☆:他人が見るのも止める

アーティスト(2012) ★☆☆☆☆
英国王のスピーチ(2011) ★☆☆☆☆
ハート・ロッカー(2010) ★★☆☆☆
スラムドッグ・ミリオネア(2009) ★★★☆☆
ノーカントリー(2008) ★☆☆☆☆
ディパーテッド(2007) ★★★☆☆
クラッシュ(2006) ★★★★☆
ミリオンダラー・ベイビー(2005) ★★☆☆☆
ロード・オブ・ザ・リング/王の帰還(2004) ★☆☆☆☆
シカゴ(2003) ★★☆☆☆
ビューティフル・マインド(2002) ★★☆☆☆
グラディエーター(2001) ★☆☆☆☆
アメリカン・ビューティー(2000) ★★☆☆☆
恋におちたシェイクスピア(1999) ★☆☆☆☆
タイタニック(1998) ★☆☆☆☆
イングリッシュ・ペイシェント(1997) ★★★★☆
ブレイブハート(1996) ★☆☆☆☆
フォレスト・ガンプ/一期一会(1995) ★★★★☆
シンドラーのリスト(1994) ★★★☆☆
許されざる者(1993) ★☆☆☆☆
羊たちの沈黙(1992) ★★☆☆☆
ダンス・ウィズ・ウルブズ(1991) ★★★☆☆
ドライビングMissデイジー(1990) ★★☆☆☆
レインマン(1989) ★★★☆☆
ラストエンペラー(1988) ★★☆☆☆
プラトーン(1987) ★★☆☆☆
愛と哀しみの果て(1986) ☆☆☆☆☆
アマデウス(1984) ★★★☆☆
愛と追憶の日々(1984) ☆☆☆☆☆
ガンジー(1983) ★★★☆☆
普通の人々(1981) ☆☆☆☆☆
ゴッドファーザー II(1975) ★★☆☆☆
ゴッドファーザー(1973) ★★☆☆☆

recently

最近色々あってネットでの活動がおろそかになってますが元気にやってます。四年生にもなると一週間に一回しか学校に行かないもんだからネットで近況知る比重の方が大きくなってくるね。

電子書籍

技術書を裁断してスキャンしてpdfにしてiPhoneにつっこんで歩きながら本読んでる。飯食ってるときも本読んでる。トイレ入ってる時も本読んでる。iPhoneで本読むのはお世辞にも快適とは言えないけども、本を持ち運ぶコストと取り出すコストがほぼ0になって今まで以上に本を読むようになった。でもiPadでは読まない。iPadは持ち運ぶコストも取り出すコストも紙の本とあんま変わらない。全然革命起こってない。今のiPadの半分以下の重さでディスプレイのサイズも半分で網膜ディスプレイなiPad nanoが出たら読書革命起こると思う。自分の中で。

卒制

卒制が始まった。長時間かける課題は去年に一度おっきな失敗をしてるので、それを反省して他人の進捗気にしない、他人のテーマ気にしない、他人の噂気にしないの三大気にしないをテーマに掲げて擬似のんびりやろうと思う。

バイト

バイト先でお仕事のお手伝いを何度かさせてもらった。それで色々と反省することはたくさんあるんだけどとにかく遅い!他の人の半分ぐらいのスピード、下手をすると5分の1ぐらいのペースでしか動けてない。しょぼい。あと時間の管理を他人に任せすぎ催促されるのを待ったり締め切りを決めてもらうまでできないとか学生脳すぎる。

リファクタリング

色々怒られた結果、リファクタリングをちゃんと勉強すれば幸せになれる気がしたので結城先生のリファクタリング本を読みふけってる。すごい目から鱗。

テンプレート

牧野工房の本を読んでテンプレート思考が芽生えたので日頃からプロジェクト作って作業始めるまでのセッティングを事前にしておいてコピペして使えるように準備することにした。jsのプロジェクトなら空のjsを読み込むhtmlからjsやらcss、画像を入れるフォルダ構造まで作っておいて一式コピーしたら速攻でjsに取りかかれるとか、Flashならドキュメントクラスによく使うライブラリを読み込んでおいて、SingletonやらThreadクラスの空テンプレートなんかを作っておいた。下ごしらえ大事。スタートダッシュ大事。

HDDレコーダ

アナログ放送が見れなくなるのでチューナーを買うついでにレコーダも買った。噂には聞いてたけど体験してみるとすごい。タレント名を指定したらそのタレントの出演する番組をガシガシ録画してくれる。7年ぶりぐらいにテレビっ子に回帰しそう。ただレコーダーのUIがだいぶうんこ。リモコンに対するレスポンスは遅いは戻るボタンのルールは一貫してないわやたらボタンが多い割に使いたい機能が一発で呼び出せないわ散々。iOS載せて欲しい。もしかしたらPS3+torneのセットの方が買いだったかも。

0655、2355、ピタゴラスイッチミニ

レコーダを入手したおかげで佐藤雅彦監修「0655」、「2355」、「ピタゴラスイッチミニ」の三番組を永遠に見れるようになった。リアルタイムにこんな実験的な番組見れてしやわせ。そういえば今号の美術手帳が佐藤雅彦特集、マストバイ。

プロフェッショナル

再開されるらしい。二回目は松本人志。キテル。

ミニチュア作家

所用で調べたのでメモ。

YouTubeのサムネイルを抽出する

YouTubeのサムネイル画像を抽出するブックマークレットを書いた。使い方は下のリンクをブックマークツールバーにドラックして保存して、サムネイル抽出したいYouTubeのページでクリッコするだけ。

バグってたのを修正してhatena::letに置き直した

Check Thumbnails

YouTubeサムネイル一括取得 – Hatena::Let

ブレイス・アグエラ・ヤルカスが示す拡張現実地図

MicrosoftのPhotosynthやらSea Dragon等のバラバラに開発されてたゴイスーなテクノロジーがオンラインマップサービスに統合され実用化された模様。

Flickrにアップされた画像や動画のロケーションデータを3Dモデル上にマッピングしたりとソーシャルデータの扱いはGoogle Street Viewのだいぶ先行ってる。

本質的な地図の使い方を拡張するには至ってない気もするけど期待あげ。