Edge800 購入

2011.8.30 火曜日

Edge 800

Edge705が壊れてしまったので勢いで800を購入しました。Wiggleの20%OFF利用で本体は約32,000円、消費税+通関手数料とかは2,000円くらいで合計34,000円くらい。センサー類は705で使っていたものをそのまま使います。今回は800を使ってみての感想。

まずは外観。705と比べると一回り小さく軽くなっています。500と705のちょっと705よりなサイズ。前面のタッチパネル周りはツヤありのカーボン調。側面と背面はすべりにくいようにウレタン塗装っぽくなっています。自分が買ったのはブラック×ホワイトですが、ブラック×ブルーもあって、そちらはセンサーが付いたセットのタイプだと思います。

スタイリングは側面の中央部(前後のパーツが組んでいるところ)にエッジを効かせて、あとは全体的にはダラした(ヌメっとさせた)感じ。少しスポーティな雰囲気を出しつつも、頑張りすぎず基本に忠実なGARMINデザイン、といった印象。

マウントは500と共通で、エラストマ(硬いゴムみたいな素材)の輪っかバンドでステムなどに固定するタイプ。本体を90度回転してロックさせるこの設計はよくできてると思います。

次は操作性。物理的なボタンはPOWER、LAP/RESET、START/STOPの3つだけ。あとは全てタッチパネルでの操作となりました。この3つのボタンは画面を見ないでも操作したいシーンが多いので、真面目にUIを考えた結果こうなったのでしょう。タッチパネルはiPhoneのような静電容量式ではなく感圧式ですが、かなりiPhoneなどの操作感に近づくように調整されていて、触れるだけで反応するようになっています。タッチパネルになったおかげで705のような4方向キーや、500のような2つの上下ボタンでチマチマ操作するよりは格段に使いやすくなりました。

その他、細かい部分について。
これは500からそうでしたが、POWERボタンが長押しじゃなくて押せば起動になってます。あと、電源を切る時やラップを区切るときの長押しで液晶に表示されるカウントダウンが「3…2…1…」ではなく「5.4.3.2.1.」といった感じでスピーディになりました。たぶん長押しに必要な時間はほとんど一緒ですが、UIの調整が行われてるんだと思います。GPSの測位スピードなんかはほとんど変わらない気がします。

総合すると新規購入であれば705と比べて価格差以上の魅力が800にはありますが、705からの買い増しとなるとちょっと微妙なところですね。

最後に705の話をすこし。液晶が映らなくなったので修理しようと思ったのですが、リチウムイオンバッテリを内蔵した電子機器の国外への発送が面倒そうなので挫折。液晶以外はちゃんと動作していたので勿体無いですが、ジャンク品としてヤフオクで売りました。

Posted by tmdf| |comments (0)

最近の566

2011.8.29 月曜日

Seat Cramp

Look566も少しだけ変わってます。

100kmぐらい走ると妙に背中と肩が疲れるので、LOOK 566に付いていたステムを短かくしました。もともと付いていた「FSA OS-150 WHITE」のまま、長さを110mm/6° → 80mm/6° のタイプに。新品をヤフオクで5,000円。見た目のバランスは悪くなりましたがポジションは良くなりました。ついでに同じステムの90mmの中古をヤフオクで2,000円ちょっとで手に入れたので、徐々に体を慣れさせてこっちに変えたいと思っています。

それに加え、Gaapと合わせるかたちでハンドル幅を40cmに。これももともと付いていた「FSA Wing Pro Compact White Handlebar」のサイズ違いを購入。これでロングライドも楽になるはず。

あと一つ。どうでもいいところですが、シートクランプを評判の良かった「Campagnolo」にしてみました。これもヤフオクで1,200円とかで購入。特に変わったことを実感しないので感想も何もないですけどね。

Posted by tmdf| |comments (0)

最近のGaap

2011.8.28 日曜日

Bullhorn

最近あんまり乗っていないGaapですが、もう少しで10,000kmです。少しいじったので紹介。

まず、ハンドルバーをブルホーンにしました。ドロップハンドルの下ハンが結局耐えれないポジションだったのと、ハンドル幅が40cmの方が自分には合っているみたいなので交換。新しく付けたのは「Profile Design T2 WING OS BULLHORN BAR / 40cm」で、EvansCyclesで6,000円くらい。ハンドルの中央部分を白く塗ってステムから「3T」の文字を見えるようしました。無駄なこだわり。スタイリング的にはGaapにブルホーンって似合ってる気がします。

これに合わせてケーブル類も全部新しくしました。ケーブル類が全てセットになっている「Jagwire Racer Brake and Gear Cable Kit for Road Bikes」をWiggleで3,000円くらいで買ったのですが、アウターはシフトもブレーキも長さが足りません。ブレーキのインナーは、私のポジションでフロント、リアともに10cmくらい短かったです。今回はフロントにリア用の長いものを使って、リア用には2mタイプを別に用意しました。ちょっとコストパフォーマンス悪かったです。なにはともあれ、いつの間にか普通に自分でケーブル交換・調整ができるようにはなっています。

ブルホーンにしたことによって、ブレーキレバーの下部分を握れるようになったので、ドロップハンドルよりはブレーキをしっかりかけれるようになりましたが、カチっとした感じまでは至ってません。バーテープの中にブレーキを通しているので少し無理な曲げ方をしているのと、単純にブレーキケーブルが長いのが原因だと思います。あとブルホーンの場合、STIのブラケットではなく常にバーの部分を握ることになるので、気持ち厚めにバーテープを巻いた方が良さそうかも。意外と手が疲れるので次はバーテープを厚めに巻きたいと思います。

あと、ペダルを両面SPDの「Shimano PD-M520」にしました。色は黒。今まで「Shimano PD-A530」を付けていましたが、一度もスニーカーで乗らなかったので、潔く両面に。両面だと向きを気にしなくていいので片面の2倍以上楽になります。CRCで買ったので2,500円くらい。1,000円くらいで売っているオプションの「SM-PD22」を付ければフラットペダルにもなるので、はじめてのSPDペダルはA530よりコレの方が安くていい気がしました。

ちなみに使っていたハンドルやペダルがヤフオクなどで思った以上に高値で売れたので、交換してもほとんど実費がかかってません。かなり満足です。

Posted by tmdf| |comments (0)

CS5でFlashPlayer10.2

2011.5.13 金曜日

数カ月ぶりの投稿。もうすぐCS5.5が出るので必要な方は限られると思いますが、Adobe Flash Professional CS5を使ってFlashPlayer10.2のAPIを使ったswfを書き出す方法です。何か不具合があっても自己責任でお願いします。

Rhuno Flash Blog > How to compile for Flash Player 10.2 with Flash CS5」を日本語訳しただけだと思ってください。簡単な英語が読める方は、上記のリンク先ページの最後の方に、必要なファイルと手順をまとめてくれているzipファイルがあるのでそれを使うと楽です。コメント欄に追記があるのでちゃんと見てください。

そうでない方は以下の手順。
元のページがWin向けだったので、ここではMac向けに書きます。

1. FlexSDKのダウンロード

ここからFlexSDK(2011.5.13時点では4.5.0.20967が最新)をダウンロード。「Adobe Flex SDK」で大丈夫です。

2. playerglobal.swcのコピー

「/アプリケーション/Adobe Flash CS5/Common/Configuration/ActionScript 3.0」に「FP10.2」フォルダを作成し、その中に先ほどダウンロードした「flex_sdk_4.5.0.20967/frameworks/libs/player/10.2/playerglobal.swc」をコピーして下さい。

3. XMLファイルを作成

「/アプリケーション/Adobe Flash CS5/Common/Configuration/Players」の「FlashPlayer10_1.xml」をコピーして、ファイル名を「FlashPlayer10_2.xml」に変更。このXMLファイルをテキストエディタなどで開き、以下の行を変更。
3行目 playerノード ”FlashPlayer10″ を “FlashPlayer10.2″ にして、さらにversion を “11″ に変更
4行目 nameノード ”Flash Player 10.2″ に変更
8行目 playerDefinitionPath の as3= 以降を “$(AppConfig)/ActionScript 3.0/FP10.2/playerglobal.swc” に変更

4. FlashPlayerを更新

これは参考サイトに書かれていなかったのですが、ここから最新のFlashPlayerをダウンロードして「/アプリケーション/Adobe Flash CS5/Players」内の各Player(DebugやReleaseも)を最新のもので上書きした方がいいと思います。

5. 動作確認

Flashを再起動後、パブリッシュ設定に「FlashPlayer10.2」が追加されているはずです。てきとうなファイルを作り、動作確認してください。

6. 注意事項

一部のAPI(StageVideoなど?)を使うと、プレビューではエラーが出たりする場合があるようです。今のところデバッグやパブリッシュでは問題なく動きましたが、自分も今日したばっかりなのであまり検証していません。以上です。

Posted by tmdf||comments (0)

一定時間で消える線

2010.12.22 水曜日

マウスの座標をオリジナルクラスの二次元配列で保存し白線を描画、1秒後配列から削除します。

This movie requires Flash Player 9

package {
	import flash.display.Graphics;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.utils.getTimer;

	public class Main extends MovieClip {

		private var tracks:Vector.<Vector.<Track>>;

		public function Main():void {

			//初期化
			tracks = new Vector.<Vector.<Track>>();

			//リスナー登録
			this.addEventListener(Event.ENTER_FRAME, Draw);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, Begin);
		}

		//ドラッグ開始
		private function Begin(e:MouseEvent):void {

			//更新
			Update(mouseX, mouseY, getTimer(), true);

			//リスナー登録
			stage.addEventListener(Event.ENTER_FRAME, Move);
			stage.addEventListener(MouseEvent.MOUSE_UP, Finish);
		}

		//ドラッグ中
		private function Move(e:Event):void {

			//更新
			Update(mouseX, mouseY, getTimer(), false);
		}

		//ドラッグ終了
		private function Finish(e:MouseEvent):void {

			//更新
			Update(mouseX, mouseY, getTimer(), false);

			//リスナー解除
			stage.removeEventListener(Event.ENTER_FRAME, Move);
			stage.removeEventListener(MouseEvent.MOUSE_UP, Finish);
		}

		//更新
		private function Update(_x:int, _y:int, _t:int, _s:Boolean):void {

			//データ追加
			if (!_s) _s = Boolean(tracks.length == 0);
			if (_s) tracks.unshift(new Vector.<Track>());
			tracks[0].unshift(new Track(_x, _y, _t));
		}

		//描画
		private function Draw(e:Event):void {

			//変数
			var t:uint = getTimer();
			var a:int = tracks.length;
			var b:int;
			var c:Boolean;
			var i:int;
			var j:int;
			var g:Graphics = this.graphics;

			//描画
			g.clear();
			if (a > 0) {
				for (i = a - 1; i >= 0; i --) {
					b = tracks[i].length;
					c = true;
					if (b > 0) {
						for (j = b - 1; j >= 0; j --) {
							if (t - tracks[i][j].t > 1000) {
								tracks[i].splice(j, 1);
								if (j == 0) tracks.splice(i, 1);
							}
							else {
								if (c) {
									c = false;
									g.lineStyle();
									g.moveTo(tracks[i][j].x, tracks[i][j].y);
									g.beginFill(0xFFFFFF, 1.0);
									g.drawCircle(tracks[i][j].x, tracks[i][j].y, 3);
									g.endFill();
									g.lineStyle(6, 0xFFFFFF, 1.0, false);
								}
								g.lineTo(tracks[i][j].x, tracks[i][j].y);
							}
						}
					}
				}
			}
		}
	}
}

//軌跡クラス
class Track {
	public var x:int;
	public var y:int;
	public var t:int;
	public function Track(_x:int, _y:int, _t:int):void {
		x = _x;
		y = _y;
		t = _t;
	}
}

Posted by tmdf||comments (0)

oFで純正マルチタッチ

2010.12.13 月曜日

Mac版openFrameworksで純正マルチタッチ入力を取得する方法について。

デバイスを一つしか使わない(MacBookのトラックパッドやiMacにMagicTrackpad)場合はopenFrameworks.jp forum 「MacBookProのトラックパッドでマルチタッチ」のサンプルとかリンク先を見てください。

ここではすでにトラックパッドが搭載されているMacBookにMagicTrackpadをつないでMagicTrackpad側を認識したい場合、など複数のデバイスを混在させoFで認識させる方法について書きます。基本は上のサンプルとほとんど同じで、デバイスの取得で使う関数がObjective-Cで動作させる必要があるので少し変更が必要です。下記コードの変更は24行目と78~82行目の部分がメイン。

まず、oFのemptyExampleをコピーして、addonsの「ofxVectorMath」とフレームワークの「MultitouchSupport.framework」を読み込みます。次に「testApp.cpp」を「testApp.mm」に名称変更し、右クリック>情報を見る>ファイルタイプで「sourcecode.cpp.cpp」を「sourcecode.cpp.objcpp」に変更します。そしてtestApp.mmには以下のコード。

#include "testApp.h"
#include "ofxVectorMath.h"

extern "C" {
	typedef struct { float x,y; } mtPoint;
	typedef struct { mtPoint pos,vel; } mtReadout;
	typedef struct {
		int frame;
		double timestamp;
		int identifier, state, foo3, foo4;
		mtReadout normalized;
		float size;
		int zero1;
		float angle, majorAxis, minorAxis;
		mtReadout mm;
		int zero2[2];
		float unk2;
	}
	Finger;

	typedef void *MTDeviceRef;
	typedef int (*MTContactCallbackFunction)(int,Finger*,int,double,int);

	CFMutableArrayRef MTDeviceCreateList(void);
	void MTRegisterContactFrameCallback(MTDeviceRef, MTContactCallbackFunction);
	void MTDeviceStart(MTDeviceRef, int);
}

class TouchPoint {
public:
	ofxVec2f pos;
	float size;
	int id;
	bool enable;
	float phase;
	float freq, amp;
	float trem_phase;
};

vector<TouchPoint> touchPoints;

int mtCallback(int device, Finger *data, int nFingers, double timestamp, int frame) {
	for (int i = 0; i < touchPoints.size(); i  ++) {
		touchPoints[i].enable = false;
	}
	for (int i=0; i<nFingers; i++) {
		Finger *f = &data[i];

		/*
		 printf("Frame %7d: Angle %6.2f, ellipse %6.3f x%6.3f; "
			"position (%6.3f,%6.3f) vel (%6.3f,%6.3f) "
			"ID %d, state %d [%d %d?] size %6.3f, %6.3f?n",
			f->frame,
			f->angle * 90 / atan2(1,0),
			f->majorAxis,
			f->minorAxis,
			f->normalized.pos.x,
			f->normalized.pos.y,
			f->normalized.vel.x,
			f->normalized.vel.y,
			f->identifier, f->state, f->foo3, f->foo4,
			f->size, f->unk2);
		 */

		TouchPoint &t = touchPoints[f->identifier];
		t.pos.x = f->normalized.pos.x;
		t.pos.y = 1 - f->normalized.pos.y;
		t.size = f->size;
		t.enable = true;
		t.id = f->identifier;
	}
	return 0;
}

void testApp::setup() {
	touchPoints.resize(20);

	NSMutableArray* deviceList = (NSMutableArray*)MTDeviceCreateList();
	for(int i = 0; i < [deviceList count]; i ++) {
		MTRegisterContactFrameCallback([deviceList objectAtIndex:i], mtCallback);
		MTDeviceStart([deviceList objectAtIndex:i], 0);
	}

	ofEnableSmoothing();
	ofEnableAlphaBlending();
	ofSetVerticalSync(true);
	ofSetFrameRate(60);

	ofHideCursor();

	ofBackground(0, 0, 0);

	ofSetColor(255, 255, 255);
	ofNoFill();
}

void testApp::update() {
}

void testApp::draw() {
	for (int i = 0; i < touchPoints.size(); i++)
	{
		TouchPoint &t = touchPoints[i];

		if (t.enable == false) continue;

		float xx = t.pos.x * ofGetWidth();
		float yy = t.pos.y * ofGetHeight();
		ofCircle(xx, yy, t.size * 50);

		ofDrawBitmapString(ofToString(t.freq, 1), xx, yy);
	}
}

void testApp::keyPressed(int key) {
}

void testApp::keyReleased(int key) {
}

void testApp::mouseMoved(int x, int y){
}

void testApp::mouseDragged(int x, int y, int button) {
}

void testApp::mousePressed(int x, int y, int button) {
}

void testApp::mouseReleased(int x, int y, int button) {
}

void testApp::windowResized(int w, int h) {
}

Posted by tmdf||comments (0)

addCaller 注意点

2010.12.9 木曜日

Tweener ver.1.33.74(それ以外は未確認)でaddCallerを使う時の注意点。addCallerでtransitionを無指定のままにしておくとなぜか遅延されます。下記swfはキーボードの「1」を押した時がtransition指定無し、「2」「3」を押したときは指定有りでaddCallerを呼び、イベントが発生するたびに円を右に動かします。

This movie requires Flash Player 9

//Main.as

package {
	import caurina.transitions.Tweener;
	import flash.display.Graphics;
	import flash.display.MovieClip;
	import flash.events.KeyboardEvent;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;

	public class Main extends MovieClip {

		private var Circle_mc:MovieClip;

		public function Main():void {

			//円
			Circle_mc = new MovieClip();
			Circle_mc.graphics.beginFill(0x999999, 1);
			Circle_mc.graphics.drawCircle(0, 0, 50);
			Circle_mc.x = 170;
			Circle_mc.y = stage.stageHeight / 2;
			this.addChild(Circle_mc);

			//説明文
			var Text_tf:TextField = new TextField();
			Text_tf.textColor = 0xFFFFFF;
			Text_tf.text = "KeyDown (ON/OFF)n1 : nonen2 : linearn3 : easeInOutCubic";
			Text_tf.x = Text_tf.y = 10;
			Text_tf.autoSize = TextFieldAutoSize.LEFT;
			this.addChild(Text_tf);

			//リスナー登録
			stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDown);
		}

		//キーボードが押された場合
		private function KeyDown(e:KeyboardEvent):void {

			//移動
			if (e.keyCode == 49 || e.keyCode == 97) Move("");
			else if (e.keyCode == 50 || e.keyCode == 98) Move("linear");
			else if (e.keyCode == 51 || e.keyCode == 99) Move("easeInOutCubic");
		}

		//移動
		private function Move(_type:String):void {

			//初期化
			Tweener.removeTweens(this);
			Circle_mc.x = 170;

			//トランジションが指定されている場合
			if (_type != "") {
				Tweener.addCaller(this, {
					count		:30,
					time		:3.0,
					transition	:_type,
					onUpdate	:Update
				});
			}

			//トランジションが無指定の場合
			else {
				Tweener.addCaller(this, {
					count		:30,
					time		:3.0,
					onUpdate	:Update
				});
			}

			//トゥイーン中
			function Update():void {
				Circle_mc.x += 10;
			}
		}
	}
}

Posted by tmdf||comments (0)

rep2 カスタム

2010.12.8 水曜日

rep2の自分用カスタムメモ。
使用している画像とかスキンは「rep2_tmdf.zip」からダウンロードできます。

1. iPhone用Webクリップを変更

img/touch-icon/p2-serif.png を好きな画像に変更
解像度はiPhoneやiPadが勝手にリサイズするので大きめでOK。
同じフォルダ内に他にも画像がいっぱいあるけど何のためだろう?

2. faviconを変更

./favicon.ico を好きな画像に変更

3. スタイルシートを変更

skin/○○○.php を追加(※自分の場合はtmdf.php)
設定管理の「スキン」でそれを指定

4. 2カラムに変更 & 新規タブで開く

設定管理 > ユーザ設定編集 > ETC の
frame_subject_width と frame_read_width を空白に。
このままだとスレ一覧のリンクをクリックした際に見えなくしている
カラムに表示されてしまうので target=”_blank” を下記に追加
lin/sb_print.inc.php の443行目(※各スレッド)
lib/sb_toolbar.inc.php の127行目(※板の新着まとめ読み)

Posted by tmdf||comments (0)

keyCode 一覧リスト

2010.11.10 水曜日

Keycode

自分が好きな感じのタイプがなかったのでキーボードのグラフィック上にkeyCodeをマッピングしたグラフィックを作りました。ActionScript(Flash)でKeyboardEventを大量に使う時に便利なはず。編集可能なPDFなので好きなようにいじって使ってください。間違えてないはずだけど、間違えてたら直すのでコメントで教えてください。

Download Keycode.pdf

Posted by tmdf||comments (0)

トレイナー(固定ローラー台) 購入

2010.11.9 火曜日

Elite SuperCrono Fluid Digital Wireless

「Elite SuperCrono Fluid Digital Wireless」を買いました。ついでに「Cycleops Training Mat」「Cycleops Bike Thong」と、「Cycleops Riser Block」を2つ購入。有線コンピュータのモデルが在庫切れになっていたので、送料が無料だったこちらに。EvansCyclesで全て揃えて£356.5(約47,000円)と消費税が500円、金曜日の夜に発注して翌週の木曜日に着。

気になっていた音と振動は満足のいくレベル。マットを敷いて使えば振動は感じられないので階下を気にせず(家は軽量鉄骨アパートの3F/3F)使ってます。動作音はiPhoneの「Decibel」というアプリで、ローラー台から1mくらい離して計測したところ70dbくらい。漕ぐたびに「ヒュン ヒュン」鳴っています。

また、付属コンピュータのワット数表示は負荷の目安になっていいです。ただ、ワット数計測で使用する重量が1つしか保存できないのが残念。毎回変更するのも面倒なので妻の体重でセットしています。獲得標高は負荷に合っている気がしますが、仮想傾斜度は思ったより実感がわきません。

あと、メーカーは推奨していないので壊れても自己責任ですが、ローラ部分を26インチ(最小)の位置にセットし、「Cycleops Riser Block」を2つ重ねて前輪を持ち上げると20インチ(451)のTarutaruga Type SPORT でも使えます。こちらのブログ「ぴちゃと☆ぶろぐ「ローラー台到着!」」の方が18インチのBD-1で使ってたので、そのままオプション品も参考にさせてもらいました。試していませんがGaapでも使えると思います。

最後に不満点ですが、ローラー台本体が入ったダンボールの梱包が酷かったです。ELITEのせいかEveansCyclesのせいか分かりませんが、かなり重量のあるローラー台のフレーム部分とローラー部分がそのまま剥き出しで入れられていて、輸送中に中でぶつかり合って傷だらけ、説明書や電池も何故か濡れている、といった状況。問題なく動いたのでいいですが、たぶん返品する人のほうが多いと思います。もう一つのCycleOpsのマットなどがまとめて入れられてた方は、緩衝材などは入ってなかったですが無事でした。これからEvansCyclesで壊れそうなものを買うのは控えます。

Posted by tmdf||comments (0)

Photo

PROFILE

森田 考陽 [Takaaki Morita]
Twitter: @tmdf
Other: mtdf.net

Designer / Programmer

RECENT POSTS

MONTHLY ARCHIVES