2012年8月27日月曜日

Google sites に twitter ガジェットを貼り付ける

2013/6/30 追記:
twitter のなんかの仕様が変わったらしく,以下の方法はダメになったみたい.
こちらの方法でいけた.

------------
表題通りのことがしたくって,ググレカス先生に聞いてみたけど,先人たちが公開している方法は今現在使えなくなっているみたい.だけどいろいろもがいているうちにできたので,方法を公開しとく.

大筋のやり方は「Twitter の リストウィジェット を、Google サイト にガジェットとして貼り付ける」の通り.
で,ここの「3. Google Gadget Editor によるガジェットの作成」で Hello world をツイッター公式ガジェット作成ページで取得した JavaScript に置換する手順があるけど,ここで一手間加える.

twitter から取得した JavaScript が以下のものだとする.
<script charset="utf-8" src="http://widgets.twimg.com/j/2/widget.js"></script>
<script>
new TWTR.Widget({
   (...省略...)
}).render().setUser('hoge').start();
</script>
結論から言って,これの先頭に書いてある http://widgets.twimg.com/j/2/widget.js のインクルードがうまくいってないっぽいので,直接埋め込んでしまうw
まず http://widgets.twimg.com/j/2/widget.js をダウンロード.そして最初に取得した JavaScript の先頭行を消し,それの <script> の直後の行に,あとからダウンロードした widget.js の内容を全部埋め込んでしまう.
<script>
(... widget.js の内容...)
new TWTR.Widget({
   (...省略...)
}).render().setUser('hoge').start();
</script>
こうしてできた新しい JavaScript 全体を,Hello world と置き換える.
それ以外の手順は上で紹介したサイトのやり方通り.

実際になると,こんなかんじになる.

2012年8月14日火曜日

プログラマ ≠ デザイナ

VSD for GPS を更新しました.
配布ページはこちら

ぱっと見,デザイン的には大して変わっていように見えるけど,今回の目玉は「スキン機能」,つまり画面のデザインを変えられるようになった.

また,スキンの作り方は追々情報公開していく予定なので,好きなようにユーザーがデザインを作れるようになる.

←今までとガラっと雰囲気を変えてみた感じでは,こんなのも作れるようになる.
スキンの実態は JavaScript なので,暇な人は vsd_skins\*.js とか見てくれたら,だいたい雰囲気は掴んでもらえるはず.

で,TrackVision とかみたいに華やかなデザインいっぱい作って公開したかったけど,
俺にそんなデザインセンスは無かった(;´д⊂)
一番上のやつも,適当に光沢出してカーボン柄貼りつけただけだし.

というわけであとはユーザーの皆さんに期待w
デザイン作ってくれる人が現れたら,その情報を配布ページでまとめて公開とかできたらいいなぁ,とか考えてます.

-----
どうでもいいおまけ.
←最初に VSD を公開したときは 14本あったスライダバーが

今や 5本に…w
なぜかバージョンアップするたびに設定項目が削られていく謎.

2012年7月28日土曜日

冷やしデザイン,はじめました ~in 2012夏~

プロジェクト V8 の続き.

で,VSD for GPS に Google V8 を組み込んで結局何がしたかったのかというと,今 VSD の画面デザインはハードコーディングされていてユーザにはいじる余地がないので,画面描画を JavaScript で制御できるようにしておけば,ユーザが自由にデザインを作れて,要はスキン機能のようなものが実現できる.

で,あらかた動き始めたので,テストがてらめっちゃイケてるメーターつくってみたよ!!
↓
シブい…我ながらシブ過ぎちゃうぜ.

ちなみにこの時の JavaScript はこんな感じ.
今までは円とか線とかプログラムで描いてメーター画像を生成してたけど,画像ファイルを読み込めるようにしておけば,かなりデザインの自由度が広がるはず.
var vsd = new Vsd;
var img = new Image( "d:\\dds\\vsd\\vsd_filter\\meter.png" );
var font = new Font( "Impact", 50 );

function Draw(){
    // メーター画像描画
    vsd.PutImage( vsd.Width - img.Width, vsd.Height - img.Height, img );
    
    // メーター針描画
    vsd.DrawNeedle( 981, 613, 130, 150, 30, vsd.Speed / 180, 0xFF0000, 3 );
    
    // 適当に文字列描画
    vsd.DrawString( 920, 650, ~~vsd.Speed, font, 0x00FF00 );
    vsd.DrawString( 200, 300, "hoge fuga piyo", font, 0x00FF00, 0x0000FF );
}

2012年7月22日日曜日

V8 エンジン搭載完了ヽ(´ー`)ノ

Google V8 の「初期化・コンパイル」と「スクリプト実行」の関数スコープを分離する,がうまくいった.ただし正しいやり方なのかどうかは不明(;´д⊂)

まず,クラスを新規に作成し,初期化・コンパイルルーチンである Load() とスクリプト実行ルーチンである Run() に分ける.
Load() で構築されかつ保持しておかなければならないオブジェクトは,メンバ変数に保存しておく.ただし,Script::New() したハンドルは ( Local<> なハンドルなので ) メンバ変数に保持しただけでは×なので,handle_scope.Close( script ) とすることで,現在のハンドルスコープを破棄しつつ script はその上位のハンドルスコープにコピーされる.
あと Run() で Context::Scope context_scope( ... ); でコンテキストに入っているけど,コンパイル時にも何らかのコンテキストに入っておかなければならないらしいので,ダミーで Context::Scope context_scope( ... ); やっている.
一番やばそうなのは,一番最初の v8::HandleScope を関数ローカル変数としてではなくメンバ変数で (すなわち new で) 生成していること.Google のドキュメントに
Note: The handle stack is not part of the C++ call stack, but the handle scopes are embedded in the C++ stack. Handle scopes can only be stack-allocated, not allocated with new.
とあるように,HandleScope は new で作ってはいけないのだが,いわば First-new-Last-delete さえ守れば多分大丈夫と自分を信じることにする(笑)

以下はコードの断片.足りない関数とかは v8/samples/shell.cc とかから持ってきてくらさい.
class CScript {
  public:
    CScript( void );
    ~CScript( void );
    
    BOOL Load( char *szFileName );
    BOOL Run( void );
    
  private:
    v8::Persistent<v8::Context> m_context;
    v8::Handle<v8::Script> m_script;
    v8::HandleScope m_handle_scope;
};

/*** print ******************************************************************/

// 関数オブジェクト print の実体 
Handle<Value> Func_print(const Arguments& args) {
  String::AsciiValue str(args[0]);
  DebugMsgD("%s\n", *str);
  return Undefined();
}

/*** コンストラクタ *********************************************************/

CScript::CScript(){
    m_context.Clear();
    m_script.Clear();
}

/*** デストラクタ ***********************************************************/

CScript::~CScript(){
    m_context.Dispose();
}

/*** ロード・コンパイル *****************************************************/

#define SCRIPT_SIZE ( 64 * 1024 )

BOOL CScript::Load( char *szFileName ){
    // 準備
    HandleScope handle_scope;
    
    // グローバルオブジェクトの生成
    Handle<ObjectTemplate> global = ObjectTemplate::New();
    
    global->Set(
        String::New( print ),
        FunctionTemplate::New( Func_name )
    );
    
    // グローバルオブジェクトから環境を生成
    m_context = Context::New( NULL, global );
    
    TryCatch try_catch;
    
    // ダミーのスコープを生成  Script::New するときは
    // 何らかのコンテキストに Enter しておかなければならないらしい
    Context::Scope context_scope( m_context );
    
    char *szBuf = new char[ SCRIPT_SIZE ];
    
    // スクリプト ロード
    FILE *fp;
    if(( fp = fopen( szFileName, "r" )) == NULL ){
        // エラー処理
        return FALSE;
    }
    
    int iReadSize = fread( szBuf, 1, SCRIPT_SIZE, fp );
    fclose( fp );
    szBuf[ iReadSize ] = '\0';
    
    Handle<String> ScriptBody = String::New( szBuf );
    
    delete [] szBuf;
    
    Handle<Script> script = Script::New(
        ScriptBody, String::New( szFileName )
    );
    if( script.IsEmpty()){
        // Print errors that happened during compilation.
        ReportException( &try_catch );
        return false;
    }
    
    m_script = handle_scope.Close( script );
    return TRUE;
}

/*** Run ********************************************************************/

BOOL CScript::Run( void ){
    HandleScope handle_scope;
    TryCatch try_catch;
    
    // 環境からスコープを生成
    Context::Scope context_scope( m_context );
    
    Handle<Value> result = m_script->Run();
    
    if( result.IsEmpty()){
        assert( try_catch.HasCaught());
        // Print errors that happened during execution.
        ReportException( &try_catch );
        return FALSE;
    }else{
        assert( !try_catch.HasCaught());
        if( !result->IsUndefined()) {
            // If all went well and the result wasn't undefined then print
            // the returned value.
            String::Utf8Value str( result );
            const char* cstr = ToCString( str );
            DebugMsgD( "%s\n", cstr );
        }
        return TRUE;
    }
    
    return TRUE;
}

-----
以下自分用メモ
・v8 を shared library でコンパイルするには,gyp の実行時以下のコマンドラインで実行.
third_party\python_26\python build\gyp_v8 -Dcomponent=shared_library

・pdb 不要な形式で作成 (/Z7)
standalone.gypi の 'DebugInformationFormat': '3'→'1',

2012年7月21日土曜日

V8 エンジン搭載

# 以下,「できない」と書いてるのは「ぼくにはとてもできない」の意味

VSD for GPS に Google V8 を搭載することにした.
で,色々なサンプルをみてると,だいたい次のような流れになっている.
main(){
  V8初期化処理;
  スクリプトコンパイル;
  while( ... ){
    スクリプト実行;
  }
}
ここで注意しなければならないのは,V8 の作りとして,初期化・コンパイルで構築されたオブジェクトが生存していることが前提で,すなわち
init(){
  V8初期化処理;
  スクリプトコンパイル;
}

run(){
  スクリプト実行;
}

main(){
  init();
  while( ... ){
    run();
  }
}
みたいなことが単純にはできない.なぜなら,init() を抜けた時点で init() 内で構築されたオブジェクトが破棄されてしまうから.
ちょっと C に詳しい人なら (゚Д゚)ハァ? 何言ってんだコイツは,と思う人がいるかもしれない.でも俺が理解する限り V8 がそうなってるんです.特に HandleScope とかが独自のスタック構造になっていて,init() 内のオブジェクトを生かしたまま init() を抜けるとかができない.

で,ここで問題になってくるのが,VSD は AviUtl のプラグインだということ.大雑把に言ってプラグインとしてユーザが定義するのは 1フレーム分の画像を処理する関数で,1フレーム処理するごとにプラグイン関数を抜けて AviUtl に制御を返してやらなければならない.
ということは,プラグイン関数の中で毎回 初期化・スクリプトコンパイル・スクリプト実行 を行なってやらなければならない.数千フレームある動画をエンコすると数千回コンパイルが起こるわけでwww あほらしすぎる(;´д⊂)

んー,どうしたものか.

2012年7月1日日曜日

Win7 の avisynth DirectShowSource() でハマる

昔入れた WindowsServer2008R2,どうもマルチメディア系の動作が変で使いにくかったので,放置状態だった.で,ひょんなことから Win7 Ultimate を \4,600 で購入www 中国からの通販でもなんか平気になってきた自分…恐ろしい子!

んで,Win7 に本格的に乗り換えようといろいろ設定してたら,avisynth の DirectShowSource() で mp4 を読もうとすると,「Media Player Classic はグラフ中のピンのいくつかを再生できませんでした (云々かんぬん)」で怒られる.
avisynth は 1.5 倍再生とか VSD for GPS とかで多用しているので,これが動かないと痛すぎる.(;´Д⊂)
こういう時はたいてい必要なコーデックが足りてないと怒られるけど,ffdshow + MP4 splitter ちゃんと入れてるけどなぁ.

でいろいろもがいているうちに,なぜか avs 再生した時は ffdshow が使われてなさそうなことがわかった.
Win7 では OS 標準で mp4 デコーダとかを持ってるはずだけど,インストールされている DirectShowFilter のどれを使うかっていう優先度はどこで決めてるんだろ? と思ってたどり着いたのがここ.
なるほど,メリット値ってので優先度が決まるのね.で DirectShow Filter Tool で ffdshow の優先度見てみたら,ほぼ最優先じゃん orz

んーと思って,さらにググって見つけたのがここ.
ここをみると,Win7 からはメリット値を無視して (!!!) マイクロソフト謹製のデコーダしか使わず,ffdshow とかは使わないらしい.
そう聞くと,MPC で mp4 は問題なく再生できたこと (MPC はメリット値を無視しない) も,avisynth の DirectShowSource() で問題がでたことも,WinServer2008R2 ではこの問題が起こらなかったこと (2008R2 には MS 謹製コーデックは入ってない) も,全てに合点がいく.

で,Win7DSFilterTweaker というツールで Win7 でもデコーダの優先順位を設定できて,avisynth の DirectShowSource() でも無事 ffdshow が使用された.

てか,中途半端なウンコデコーダを強制的に使わせてエラー吐くとか,ヤメテクレ(;´Д⊂)

2012年6月20日水曜日

至高の PC 環境

自分的に理想の PC 環境構築.
コンセプトは,
「俺の業務中の姿勢の究極の姿」w

要は,ほとんど寝そべった姿勢で PC をいじりたかったわけよ (いわゆるゴロ寝 PC).
そのために,長さが 180cm の座椅子とモニターアームを購入.モニターは上側が手前に倒れる角度で,寝そべった姿勢でも首が疲れない.

ちょっと問題なのがキーボードで,今のとこ太ももに乗せて使うしかない.それ専用の小さいテーブルが必要かも.もしくは IS01 のキーボード・トラックボールを PC の無線キーボード・マウス代わりに使えたらいいかも.

んー,なんかどんどん廃人になっていく気がするwww

2012年6月2日土曜日

IIJmio + Fusion IP-Phone SMART は ¥945/月 運用の夢をみるか

データ通信費を削減するため,sim を b-mobile Fair から IIJmio に変えてみた.

で,IIJmio は公式では 128kbps 制限を謳っているが,実際にはそれを下回ることのほうが少ないらしいので,速度計測してみた.


sim7時台
電車内
12時台
会社
18時台
電車内
20時台
自宅
料金・通信制限
IIJmio161Kbps153Kbps187Kbps180Kbps初期費用¥3,150 + ¥945/月
128Kbps制限,転送量無制限
b-mobile Fair870Kbps179Kbps380Kbps1.3Mbps¥8,350/120日 (月換算: ¥2,116/月)
速度制限なし,転送量 0.93GiB/120日
b-mobile U300-80Kbps--¥13,409/185日 (月換算: ¥2,205/月)
300Kbps制限,転送量無制限
噂通り 128kbps 以上の速度が出ている.
嬉しいのは 12時台の落ち込みが少ないことで,体感的にも 12時台は Fair ともそんなに変わらなかった.b-mobile は電波が混んでいる時の落ち込み方がクソ (U300 とか接続タイムアウトまで起こしてたし).

というわけで,IIJmio への乗り換えは正解ヽ(´ー`)ノ
U300 は完全に要らない子だな.


で,最近 Fusion IP-Phone SMART というサービスが始まったので試してみた.これは月額基本料無料で電話番号がもらえるので,これが使えたら ¥945/月でデータ通信し放題 & 音声通話回線保持が出来るのでメリットが大きい.

で,Fusion IP-Phone SMART 公式で案内されている AGEphone を入れてみたところ,音声が 10秒に 1秒くらい無音になって電話として使うのはかなり厳しい.WiFi だと問題なかったので,さすがに 180Kbps くらいでは厳しいっぽい.
それよりも問題なのは,着信 OK にしとくとバッテリがすごい勢いで減っていくwww 10%/h くらいの勢い.ちょっと普通の携帯電話代わりに使うのは無理な感じ.

¥945/月 運用の夢は敗れ去った(;´д⊂)

2012年5月26日土曜日

笠取山分屯基地

毎年行こうと思ってたらいつの間にか終わってて,ずっと行けなかった笠取山分屯基地の基地祭(?) に行ってきた.

←基地全貌.航空自衛隊のレーダー基地だそうで,基地の規模としては小さく,祭りの規模としても地味っちゃ地味.

軽装甲機動車.見た目がゴツい以外は普通の車かと思ったら,ボディとか全部 15mm くらいの鉄板で組まれてたw
走ってる姿も見たけど,走ってる様子は乗用車よりクレーン車とかの重機に近かった.まぁコマツ製作所製なので納得.


お目当てその 1,T-4 の展示飛行.スマフォで録画したので残念画質だけど.
ちなみに 3000mm 望遠レンズとかの本気組がけっこういたw

お目当てその 2,SH-60J.
これもどっかから飛来してきて,ヘリの着陸を間近で見れた.

ローターブレードももうちょっとでさわれそう (だけどダメって言われてたのでやめといた)

駐車場から基地までピストン輸送する,コールサイン「ホーク2」
運転手の自衛官が出発時に
「バーディ,こちらホーク2,駐車場を出発する」
みたいな交信してたw 無駄にミリタリーwww


その他の展示物は震災での救助活動とかのアピールで炊事車とか給水車とか後方支援車両の展示が多かった.個人的には AH-1S とかパトリオットとか期待してたんだけど.

2012年5月14日月曜日

鈴鹿サーキット体験走行

「鈴鹿サーキット無料先導体験走行」なるものに応募して当選したので行ってきた.
先導車付きながら,鈴鹿フルコース 4周くらいをタダで走らせてもらえるというヒジョーに太っ腹なイベント.

先導車つきと言いつつ,けっこうスピードは出せて,ホームストレートとかバックストレートとかの途中までは全開加速できるので,173km/h までは出せた.

本コースは西サーキットを 1回走ったことがあるだけだけど,やっぱ本コースは楽しいヽ(´ー`)ノ
それがタダであればなおのことwww
こういうの体験しちゃうと SMSC 入りたくなってくるけど,エリの場合ロールバー付けないとダメっぽいから,金銭的に無理だなぁ(;´д⊂)

体験走行会が終わった後はいろいろ施設見学タイム.
まずは表彰台.
F1 とかでも使ってるやつ.

管制室(?)
これは楽しそうwww 一日中ここに引きこもってみたいw
HDD に全映像を録画してるそうで,直前にコースアウトした車のリプレイとか写してた.

F1マシン.
たぶんこれ,昔遊園地の方に飾ってあったやつじゃないかな.触れる程度なら OK と言われたので,コックピットの中とか撮り放題だった.

久々に社会科見学してるみたいで楽しかったっす.


帰りに遊園地のカート乗ってこようと思ったけど,舞洲のライセンス切れてた(;´д⊂)