2011年9月19日月曜日

赤ザク Get

(今は亡き) サンヨー Xacti DMX-SH11 を Get.目的は旧式化した LUMIX FZ1 と Xacti C40 の置換え.

昔 1200fps のハイスピード動画が撮れる EXILIM EX-F1 が出たときすげー欲しかったんだけど,10万近い値段と一眼レフ並みの仰々しいボディがネックになって手が出せなかった.で最近ふと EXILIM のカタログ見てたら,普通のコンデジサイズでハイスピード動画が実現されていた.型落ち品なら¥15k 位なので買いかな,と思ったけど,車載動画撮るためにはバリアングル液晶が必須 (画面をレンズ側に向ける必要がある).

というわけで EXILIM は却下.ていうかコンデジでは Xacti 以外の選択肢がなくなるわけだが,でここでふと Xacti にハイスピード動画撮影機能がないか? と思って探してみたら,あったよ…(゜ーÅ)ほろり あまり大々的には機能展開してないらしく Xacti でもこの機能がある機種は限られていたが,ちょうど DMX-SH11 が在庫処分的に安くなってたので,衝動的にポチッとな.
ってデジカメ買ったはずなのにほとんどビデオカメラだなこれ… まぁ静止画は Desire で十分だし,ほぼ車載動画専用かな.

最近のコンデジはどれ買っても同じみたいな感じになってきてるけど,こういう尖った機能を持ったカメラがもっと出てきてほしいね.
FZ1 は光学 12倍ズームと光学手ぶれ補正を当時あの価格帯で実現したのが驚異的だったし
Xacti シリーズが出始めの頃は MP4 動画撮影をメインに考えたカメラが当時そんなになかったし
今回は買わなかったけど EXILIM は高速撮影を生かした HDR 撮影とかすげえ面白そうだし
SONY Bloggie の 360°パノラマ動画も面白そうだし (カメラ本来の性能がアレなので見送ったけど).

2011年9月11日日曜日

エコ に踊らされてみるテスト

ワットチェッカー購入.

きっかけは,
・楽天で自動車保険一括見積もりをやると有効期限付きの 1,000 ポイントがもらえるキャンペーンがやってた
(余談だけど見積もりの方はエリはほぼ門前払いw)
・知らない間に 1,000 ポイントが加算されていたが,その期限も知らない間に迫っていた

なんという楽天トラップ ((((;゚д゚))))ガクガクブルブル

というわけで,ポイントを消費すべく前からちょっと欲しいと思っていたワットチェッカー購入.
ただしあまり高いのを買うと楽天の思う壺なので,楽天で一番安かった ET55D なるものを購入.
その安さ故 W 数計測精度はあまり期待していないけど,まぁこの値段ならいいかな.
しかもタイマーによる通電 ON/OFF 機能も付いているので待機電力撲滅教原理主義過激派の人々にとっては嬉しいんじゃなかろうか.
自分は,充電を自動的に終了してくれないシェーバーとかの充電にタイマーを使っているので,この機能は結構重宝している.

で届いたので早速使ってみたら,W数計測表示はおろか通電すらしない (汗 いきなり壊れてんのかと思ったら,
・ET55D にはバッテリーが内蔵されている
・タイマー通電 ON/OFF 制御や消費電力表示はバッテリーの電力を使って行われる.コンセントに差してもバッテリーが空なら動かない
・購入直後はタイマー通電 OFF 状態
というわけで,まず内蔵バッテリーの充電からする必要があった.

で色々使ってみた感想.
○W数表示のみならず,積算電力・電気代・CO2 など表示が充実している
○液晶が大きくて見やすい
△カタログ通り 5W 以下の計測は 0W と表示されてしまうので待機電力の計測には向かないけど,5W 以上であれば 1W単位で (少なくとも表示は) 変化するので,他の機器との合算で待機電力も測れそう.
△バッテリーのヘタリが心配.バッテリーが死んでもコンセントに挿しさえすれば動く,なら良かったんだけど,上に書いたとおり基本的にバッテリーの電力で動作するので,バッテリーが死んだら動かないかも.
×横幅が広いのでテーブルタップには向かない

まぁ,だいたい満足 ヽ(´ー`)ノ
いろいろ PhenomII の省電力化とかやってるけど,実際に数値に現れると面白いので,しばらくはいろいろ遊べそう.

2011年9月3日土曜日

WiMAX の切断がひどい

WiMAX 使ってると,たまに通信が切断されてその後全く通信できなくなることがある.
ググッてみると,一番多いのは無線 LAN が切断される現象らしいが,うちの場合は PC ⇔ WM3500R の通信は生きているので,どうも WM3500R ⇔ 基地局 の通信が切れているらしい.

じゃあ WiMAX の電波状態が悪いのかというとそうでもなくて,アンテナは常に 2本立ちだし,不思議なのが WM3500R を再起動させれば通信が回復する.いちいち WM3500R を再起動させるのはストレスが溜まるんだけど,こんなのをユーザーサポートに問い合わせてもどうせ電波状態で片付けられるんだろうなぁ.

というわけで,一定時間通信できなかったら WM3500R の再起動ページを kick する perl スクリプト書いてみた.
#!/usr/bin/perl -w

use strict 'vars';
use strict 'refs';
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);

my $TimeoutCnt;

while( 1 ){
    $_ = `ping -n 1 www.yahoo.co.jp -w 1000`;
    if( !/Reply from/ ){
        ++$TimeoutCnt;
    }else{
        $TimeoutCnt = 0;
    }
    
    print( "Timeout = $TimeoutCnt\n" );
    if( $TimeoutCnt >= 15 ){
        RebootWM3500R();
        
        print( "restarting WR3500...\n" );
        
        sleep( 10 );
        while( 1 ){
            $_ = `ping -n 1 192.168.0.1 -w 1000`;  # WM3500R が再起動するまで待つ
            last if( /Reply from/ );
        }
        print( "done\n" );
        $TimeoutCnt = 0;
    }
    
    sleep( 1 );
}

sub RebootWM3500R {
    # リクエストの生成
    my $url      = 'http://web.setup/index.cgi/reboot_main_set';
    my %formdata = (
        'UPDATE_BUTTON' => '%BA%C6%B5%AF%C6%B0',
        'DUMMY' => '',
        'DISABLED_CHECKBOX' => '',
        'CHECK_ACTION_MODE' => '1',
    );
    my $request  = POST( $url, [%formdata] );
    
    # UserAgentを生成して処理
    my $ua  = LWP::UserAgent->new;
    my $res = $ua->request( $request );
    
    #print $res->as_string;
}

# WR3500 の admin 認証
package LWP::UserAgent;
sub get_basic_credentials {
    return ( 'admin', 'hogehoge' );
}

←でこれを走らせている時のネットワークのモニタ結果.
縦の目盛りが 5分だから,大体 5分毎に再起動を繰り返してるのがわかると思う.
なんぢゃこりゃwwww


余談だけど,このスクリプトを書くときに,再起動ページの POST メソッドの送信データを調べる必要があって,最初はパケットモニタソフトでも入れようかと思ってたんだけど,すげー簡単な方法があった.
計算機と戯れる日々
この方法はなかなか目からウロコだ.

2011年8月20日土曜日

黒部ダム

大雨警報が発令され黒部川で孤立者の救助が行われる中,黒部ダムまで突撃!
その甲斐あって自分的にはノープランの旅久々の Hit(笑)

いつものように GPS ログだけ.

大きな地図で見る

2011年8月8日月曜日

MediaPlayerClassic + AviSynth で 1.5 倍再生

PS3 には 1.5倍再生機能があって便利なので,PC でもやってみた.

でも x倍再生機能がある動画プレイヤーは他の機能がしょぼかったりしたので,普段使っている MediaPlayerClassic (MPC) + AviSynth でやってみた.MPC には最初から avs スクリプト再生機能があるので,1.5倍再生スクリプトを書いて MPC に読ませるだけで ok.スクリプトはこんな感じ.
Scale1 = 3
Scale2 = 2
DirectShowSource( "hoge.ts", pixel_type="YUY2", convertfps=true )
AssumeScaledFPS( Scale1, Scale2 )
TimeStretch( tempo = Scale1 * 100.0 / Scale2 )
convertfps=true は VFR を CFR に変換するために必須.
AssumeScaledFPS で映像の再生速度を 1.5倍にして,TimeStretch で (音程は変えずに) 音声の再生速度を変える.

これで完璧ヘ(^∇^ヘ)ヘ(^∇^ヘ) ウヒョヒョ と思っていたら,なんか映像と音声がずれる.どうも convertfps=true をつけると映像の冒頭がなぜか切り捨てられることがあって,その分の音声がずれるらしい.DirectShowSource はいろんなフォーマットの動画が読み込めて便利なんだけど,ちょっと変わったことをしようとするととたんに音声がずれて使い勝手が悪い.

というわけで他の方法を模索.FFmpegSource というプラグインがあったので,それを使ってみた.
Scale1 = 3
Scale2 = 2
FFmpegSource2( "hoge.ts", atrack=-1, cachefile="hoge.ts.ffindex", fpsnum=30000, fpsden=1001 ).ConvertToYUY2
AssumeScaledFPS( Scale1, Scale2 )
TimeStretch( tempo = Scale1 * 100.0 / Scale2 )
FFmpegSource は ffmpeg という知ってる人は知ってる有名な動画エンコーダの動画リード部分を流用しているだけあって,安定性は抜群.これで音ズレなくまともに 1.5倍再生ができるようになった.
ただし問題がひとつあって,FFmpegSource は動画ファイル毎にインデックスファイルを作成してからでないと再生が始まらない.1時間の番組で 30秒ほどかかることもあるので,この間待ちぼうけを食らうのも辛い.

なので,まず通常速度で再生する MPC を起動しつつ裏でインデックスを作成して,作成が終わったら改めて 1.5倍再生する MPC を起動するバッチファイルを組んだ.FFmpegSource のパッケージにインデックスを作成するコマンドラインプログラムが付属しているので,それを使う.
バッチファイル (正確には WinBatchEh のスクリプトだけど) はこんな感じ.
: 変数セット
set TmpDir=%temp%\mpc_playlist
set Player="C:\Program Files\MediaPlayerClassic\mplayerc.exe" /fixedsize 860,550
set FileName=%1

: tmp ファイルフォルダ作成
if Exist %TmpDir%\ del /y %TmpDir%\*
mkdir %TmpDir%

: .avs 作成
set FileNameOrg=%FileName%
StrTokFile=STF_NAME FileName "%FileName%"
set FileName=%TmpDir%\%FileName%.avs

echo Scale1 = 3> "%FileName%"
echo Scale2 = 2>> "%FileName%"
echo FFmpegSource2( "%FileNameOrg%", atrack=-1, cachefile="%FileName%.ffindex", fpsnum=30000, fpsden=1001 ).ConvertToYUY2>> "%FileName%"
echo AssumeScaledFPS( Scale1, Scale2 )>> "%FileName%"
echo TimeStretch( tempo = Scale1 * 100.0 / Scale2 )>> "%FileName%"

: とりあえず普通再生の画面を起動
start %Player% "%FileNameOrg%"

: index を作成,1個出来たら mpc 起動
exec=SW_HIDE "C:\Program Files\AviSynth 2.5\plugins\ffmsindex.exe" -p "%%a" "%FileName%.ffindex"
start %Player% "%FileName%"
途中まで再生された後,また MPC が立ち上がって最初から再生されちゃうけど,まぁ手でシークすればいいし許容範囲内かな.
-----
WSH の javascript で書いたものを置いときます.
SFC mini も入れといてください.

2011年8月4日木曜日

PhenomII X6 ゲット

AMD PhenomII X6 1065T を購入.

そろそろ AMD のソケットが変更されて,今の AM3 ソケット CPU は生産中止になるらしいので.いま買い換えとけば後 3年は持つかなぁ? というわけで 6コア CPU ゲット.

今のマシンは 3年前に組んだものだけど,最新の CPU がマザボの変更無しでそのまま使えるって凄いことだなあ.しかもメモリの主流が DDR2→DDR3 に変わってるにもかかわらず.AMD はこういうところでもコストパフォーマンスが高いからインテルより気に入っている.

というわけで恒例のクロック & 電圧いじり.1065T は倍率変更でのオーバークロックはできない (倍率を下げる事しかできない) ので,やっぱ時代はエコだよねー,というわけでひたすら省電力方向に振ってみた.

で K10Stat の設定はこんな感じ.
Athlon64 の時は 1GHz/0.800V が下限だったけど,今度のは 100MHz まで下げられるwww 流石にそこまで下げちゃうとモッサリ感が半端ないので,下限は 400MHz にした.あと,各 PState 毎のクロック割り振りを低めにして,なるべく低い周波数で動くようにしてみた.

で,6コアをしばらく使ってみたけど,今までの 2コアと体感は全く変わらねー(笑) 今までですでにオーバースペックだったってことね.唯一実感できたのは動画のエンコが 3倍速くなったことだけだな.

2011年7月16日土曜日

WiMAX (・∀・)デムパ!! 強化実験

こことかここらへんの記事を見て,自分も WiMAX アンテナ (というかリフレクタ) を試してみようと思った.
無線 LAN で電波波長とか? を考慮した本気のアンテナ自作は見たことあるけど,上記サイトのような割といい加減な (ほとんど鉄板でも) 効果はあるっぽい.

というわけで,家に転がっていたアルミ鍋の蓋を三脚に付けてトライ.

金色の見た目といい,どっからどう見ても別の意味で (・∀・)デムパ!! を受信しているようにしか見えないが,やってる本人は割と真剣なのですよ.

で,結果は…

ジャマになるというデメリット以上の効果は認められなかった(汗 いろいろ方角とか蓋⇔WiMax ルータの距離とか変えてみたけど,やっぱり効果なかった.方角を変えるとある方角から外れたときにガクッと速度が落ちるので,電波遮断の効果はあるらしい(汗

というわけで,今回のネタは失敗┐('~`;)┌

いろいろ試しているときに,いつもの置き場所,写真のように障子の桟に乗っけているのだが,この位置から升目 1個分上下・左右にずれただけで速度が半分に落ちることがわかった.なんかここにピンポイントに電波が来てるらしい(笑)

2011年6月29日水曜日

Conditional execution 再び

ノッポさんに「やるんだよ」と言われてはや半年.
ふと思い立って,frv なる CPU の conditional execution をまねて *.md 書いてみた.
まずは,条件実行つき mov 命令.
(define_insn "*cond_exec_mov"
  [(cond_exec
    (match_operator 0 "comparison_operator"
			[(match_operand 1 "int_mode_flags" "")
			 (const_int 0)])        ←ここら辺までが条件実行
    (set (match_operand:INT 2 "register_operand" "=r") ←ここら辺が mov 命令
	 (match_operand:INT 3 "liw_signed"       "")))]
  "TARGET_COND_EXEC"
  "mov_%b0 %3,%2"
  [(set_attr "timings" "11")]
)

でコンパイル結果は,
int hoge( int a, int b, int c, int d ){
    if( a > b ) a = c;
    else        a = d;
    return a;
}
  ↓↓↓↓↓↓
_hoge:
	cmp d1,d0
	mov_gt a0,d0
	mov_le a1,d0
	retf [],0
うっしゃあ.意外とあっさりと成功 ヘ(^∇^ヘ)ヘ(^∇^ヘ) ウヒョヒョ

よーし,パパ全命令に条件実行つけちゃうぞー.
てな訳でまずは add に足してみた.
(define_insn "*cond_exec_addsi"
  [(cond_exec
    (match_operator 0 "comparison_operator"
			[(match_operand 1 "int_mode_flags" "")
			 (const_int 0)])
      (set (match_operand:SI          2 "register_operand"  "=r") ←add命令
	   (plus:SI (match_operand:SI 3 "register_operand"  "%r")
		    (match_operand:SI 4 "nonmemory_operand" "")))
  )]
  "TARGET_COND_EXEC"
  "add_%b0 %4,%3,%2"
  [(set_attr "timings" "11")]
)

そのコンパイル結果は,
int hoge( int a, int b, int c, int d ){
    if( a > b ) a = b + c;
    else        a = c + d;
    return a;
}
  ↓↓↓↓↓↓
_hoge:
	cmp d1,d0
	bgt .L5
	add a1,a0,d0
	retf [],0
.L5:
	add a0,d1,d0
	retf [],0

ぐはぁっ
全然効いてないよ~(゜ーÅ)ほろり

理由がよくわからなかったので,gcc に -fdump-rtl-all オプションをつけて,最適化過程の全 RTL をダンプさせてみた.
if-then-else のブランチ命令から conditional-execution への変換は,ce3 なるステージで行われているらしいので,その直前の peephole2 ステージの RTL の,当該 add 命令の RTL を見てみる.
(insn 11 10 41 3 (parallel [
            (set (reg/v:SI 0 d0 [orig:58 a ] [58])
                (plus:SI (reg/v:SI 1 d1 [orig:61 b ] [61])
                    (reg/v:SI 4 a0 [orig:62 c ] [62])))
            (clobber (reg:CC 51 EPSW))
        ]) z.c:11 11 {addsi3}
大雑把に言って,(define_insn "*cond_exec_addsi"... のところに書いた (set ...) のパターンがここの (set ...) のパターンにマッチすれば,条件実行つき add に変換されるはずなんだけど,(clobber (reg:CC 51 EPSW)) ってのがあるせいでマッチできない.
(clobber (reg:CC 51 EPSW)) ってのは「add 命令実行したらフラグレジスタが更新されるよ」って意味なのであって当たり前なのだが,一方条件実行つき add にはフラグ更新機能はつけてはいけない.
しかし,パターンをマッチさせるには,通常 add 命令のフラグ更新をやめるか,条件付実行の add にフラグ更新をさせるか,のどちらかしかない (実際にはどっちも実 CPU の動作からウソを付くことになるので,おかしなコードを吐く可能性がある)

ARM とかどうやってんのかと思って見たら,元々通常 add 命令でフラグ更新する・しないが選択できるので,何の問題もないのね.

んー,困った.

2011年6月13日月曜日

gcc クロスコンパイラ ビルドコマンド

gcc のクロスコンパイル環境構築の一連のコマンド,何度メモをとってもどっかいってしまうので blog に貼り付けてしまう(笑)
# binutils
./configure --target=mn10300-unknown-elf \
--prefix=/home/yoshi/mcu/amgcc; \
make; make install

# gmp
./configure --prefix=/home/yoshi/mcu/amgcc ; make ; make install
# mpfr
./configure --prefix=/home/yoshi/mcu/amgcc \
--with-gmp=/home/yoshi/mcu/amgcc; \
make ; make install
# mpc
./configure --prefix=/home/yoshi/mcu/amgcc \
--with-gmp=/home/yoshi/mcu/amgcc \
--with-mpfr=/home/yoshi/mcu/amgcc; \
make ; make install

# newlib
cd gcc-4.6.0
ln -s ../newlib-1.19.0/newlib .
ln -s ../newlib-1.19.0/libgloss .

# gcc
set path = ( $path /home/yoshi/mcu/amgcc/bin )
setenv LD_LIBRARY_PATH /home/yoshi/mcu/amgcc/lib:$LD_LIBRARY_PATH

mkdir build
cd build
../configure --target=mn10300-unknown-elf \
--disable-libssp \
--prefix=/home/yoshi/mcu/amgcc \
--with-gmp=/home/yoshi/mcu/amgcc \
--with-mpfr=/home/yoshi/mcu/amgcc \
--with-mpc=/home/yoshi/mcu/amgcc; \
make
make install
以下ハマりポイント
・newlib 使わないとなんか失敗する
・--disable-libssp 指定しないと libssp のビルドに失敗する
・gcc で build とか適当に dir 掘って configure 等を実行しないとダメ

# gcc 4.5.3 あたりから gmp だの mpfr だの mpc だの,lib が要るようになってめんどくさい…

2011年6月4日土曜日

テンソン ワイマックス!

b-mobileSIM の有効期限が切れそうだったので,端末 0円キャンペーンをやっていた WiMAX に加入してみた.
# 5/31 まで! という言葉につられて入ったら,6月もしれっとキャンペーン続いてたけど

しばらくは b-mobile 買わずに WiMAX で運用してみるつもり.あわよくば eo 光をやめて WiMAX に統一するかもしれない (まぁ無理だろうけど).

というわけで今日届いたので,Desire とか IS01 とかつないでテンソン上がってきたwww
実質 100kbps 位しか出ていない b-mobile とはスピードが全然違うし,IS01 も外でも使えるようになった.さすが 40Mbps は伊達じゃないぜ!

で,最後にデスクトップ PC に USB 無線 LAN アダプタ挿してスピードテストしてみたら,

ゼロが2個くらい足りないような… (´・ω・`) ショボーン
一気にテンソンが下がった.

いや,38度くらい熱出してる状態で遊んでたから,単にナチュラルハイ状態だったのか?

----
1週間使ってみた感想.

○アンテナ1本でも,5Mbps でた.
×かさばる(笑) 会社の休憩時間に Desire で遊ぼうと思っても WM3500R も持って行かないといけない.
Desire と IS01 と WM3500R と 3台かばんに入れていくとかもう意味わかんない.
×WM3500R の電源 ON してから通信可能になるまで 1分近くかかるので,ぱっとメールチェックしたくてもできない.
△通信エリアの狭さが災いして,主な使用時間である電車通勤中は (自宅に近づくにつれw) けっこう通信が切れる.
△自分の使い方だと,モバイル端末では Web とかメールとか,テキストデータ中心の通信なので WiMAX の通信速度はオーバースペック.

と,自分の使い方においては,モバイル通信環境としてはメリットよりデメリットのほうが目立った.

では自宅の固定回線の置き換えは可能か? と言われると,速度は全然光より遅いけど,GB 単位のファイル転送とかしない限り速度は 5Mbps も出りゃ十分なので,コスト優先なら自宅の固定回線 + モバイル通信回線を WiMAX に置き換えるのは非常にありだと思う.

でもウチの場合固定電話回線も eo に乗り換えちゃったらから,eo 止めようがないんだよね.
というわけで,3ヶ月経ったら WiMAX 解約するつもり.まぁ端末代もタダだったしいいや.