2015年11月28日土曜日

Dynabook S38 に Win10 クリーンインストール

Dynabook tab S38 に Win10 をクリーンインストールした.

この場合,多くのデバイスドライバは自動インストールされないんだけど,東芝のサイトに Win8.1/10 ドライバは公開されていない.なので,いろんな機種のドライバを寄せ集めてデバイスを全部認識させてみる.
# 先に書いとくけど Win8.1 のファイルを使うので,Win8.1 を消す前に作業が必要

その前に,デバイスマネージャで不明なデバイスを右クリック→ドライバーソフトウェアの更新→ドライバーソフトウェアの最新版を自動検索します をとりあえずすべての不明なデバイスでやってみる (これで認識するものあるので).

この状態で画像くらいに数が減った.デバイス名としては
ISP Camera Device (は中途半端に認識してるっぽい)
Microsoft ACPI-Compliant System
intel imaging signal processor 2400
Intel(R) Atom(TM) Processor I2C Controller driver
あたりだけど,まぁなんのデバイスのことかはわからない.動かしてみて明らかに使えないデバイスは,カメラ,GPS あたりだけど.

ここで他社タブレットのドライバを拝借してくるw ライセンス的に微妙なのと,PC が壊れても知らないので以下自己責任でどうぞ.
(1) レノボ からドライバを取ってきて実行すると,c:\DRIVERS 以下にドライバが解凍される.
(2) HP Stream 8 からドライバ検索して Broadcom GPS Driver (ファイル名: sp72184.exe) を取ってきて実行すると,c:\SWSetup 以下にドライバが解凍される.あとあと楽なので,c:\DRIVERS の下に移動させる.
(3) Win8.1 の \windows ディレクトリ以下からファイル検索で以下のファイルを探して,c:\DRIVERS 以下にコピーする.
mt9m114.sys, MT9M114_CIFDHA0.cpf, mt9m114.inf, ov5693.inf, ov5693.sys, OV5693_CJAD542.cpf
(4) デバイスマネージャで不明なデバイスを右クリック→ドライバーソフトウェアの更新→コンピュータを参照してドライバーソフトウェアを更新します→c:\DRIVERS を指定して次へ
たまに署名が云々で警告食らうけど,気にしたら負けなのでそのままインストール.
(5) 新たに不明なデバイスが生まれることがあるけど,「ドライバーソフトウェアの最新版を自動検索」か「コンピュータを参照してドライバーソフトウェアを更新」かどっちかで消えるはず

これですべてのデバイスドライバが認識できたヽ(´ー`)ノ
Win10 にして個人的に一番嬉しいのは,Bluetooth テザリングの子機としてスマフォに接続できるようになったので,外に持ち出して使えるヽ(´ー`)ノ

2015年11月24日火曜日

人柱なモノ

Win10 が無料アップグレードでもクリーンインストールできるようになったので,Dynabook S38 に Win10 をクリーンインストールしようとやってみたら,
・内蔵 MicroSD カードスロットからはブートしない→USB ドライブが必要
・セットアップ中はタッチパネルは認識しない→USB キーボード (+マウス) が必要
で一瞬で詰んだ orz

仕方がないので USB-OTG + USB Hub を探してみたら,いいのがあった.
OTG MicroUSB対応 充電ポート付 4ポートUSBハブ DN-12851
これのいいところは,AC アダプタで充電しながら USB Hub が使える可能性があること.大抵の「給電できる USB-OTG ケーブル」は USB 機器に給電はできるけど本体の充電はできない.
まぁ商品説明にもある通り,実際に充電できるかどうかは賭けだけど,切り替えスイッチがついてるから期待できるし,たとえ充電できなくても Hub としては使えるからいいや,とポチッとな.

で今日届いたので試してみた.結果は…

賭けに 月券 禾リ ヽ(´ー`)ノ

見事,本体に充電しながら,Hub に挿したマウスを認識した.
ちなみにスイッチ位置は 1 でいけた.謎なスイッチはここの記事のような抵抗値を切り替えているんだろうと予想していたが,ハブ本体からリレー音がしていたので,もうちょっと高級なことをしているみたい.
これで今週末は S38 にも Win10 入れられる.

ちなみに,Zenfone5 でも試してみたけど,こちらはどのスイッチ位置でも充電と USB Hub 機能は両立しなかった.ざんねん.

2015年11月8日日曜日

(・∀・)デムパ!! が足りない時の対応

自分ではわりと活用している Waypoint Navi,先日の奈良ニュルで問題点が発覚した.
Google ナビはルート探索が終わった後なら,電波が途切れてもそのままルート案内してくれるが (地図データもある程度キャッシュしてるみたい),WpNavi はウェイポイント (WP) 毎にルート探索が発生するので,電波がない地点を WP に設定していると,Google ナビのルート探索で止まってしまいその後ナビが続かなかった.

自力でナビするのは道路データがないと無理だし諦めたヽ(´ー`)ノ
ここのように,ルートの曲率からラリーのコ・ドライバーのような音声案内をするというのはなかなか面白い案だけど,高架の側道に降りる的な微妙な Y 字路の案内は無理なので,実用性は謎.

なので,電波がない状態の非常モードと割りきって音声案内はきっぱりと諦めて,
(1) WP に到達した時点でデータ通信が切れている場合,Google ナビは起動せす,現在地と事前設定したルートの線,それと運が良ければ地図,を表示するだけにする
(2) データ通信が復活したら,自動で Google ナビを開始する
というようにしてみた.これだけでも無いより大分マシだし,路肩に車を止めてスマフォを操作せずとも乗りきれる (はず).

2015年11月1日日曜日

Google V8 搭載 (2015年度版)

メイン PC を Win10 にするついでに,開発ツールを Visual Studio Community 2015 (Express ではない,ほぼフルスペックの VS がタダで使える.いい時代だなぁ(゜ーÅ)ほろり) を入れたら,3年前の Google V8 ソースコードがコンパイルできなかったので,最新版を VSD for GPS に組み込むことにした.
こんだけ期間が開くと API がガラッと変わって,昔やってた AviUtl のプラグイン DLL に V8 を組み込む手法なんかも変えないといけなかったので,再び調べてみた.

サンプルとかでよく見る V8 の実行の流れは以下のようになっていて,
あるクラス::ある関数(){
  Isolate 作成
  Isolate スコープの中 {
    Handle スコープの中 {
      Context 作成
      Cotext スコープの中 {
        JavaScript 初期化 (スクリプトコンパイル等)
        // ↑ここまで初期化処理
        // ↓ここから繰り返しの処理
        JavaScript 実行
      }
    }
  }
}
AviUtl のプラグイン DLL では,初期化処理と JavaScript 実行処理は関数を分けて,それぞれの関数処理が終わるごとに AviUtl に制御を返さないといけない.かと言って単純にそれらを分けてしまうと,初期化関数を抜けた時に Handle スコープを抜ける = Context も破棄されるため,別関数で JavaScript 実行することができない.

なので以下のようにする.
あるクラス::Compile(){
  Isolate 作成→メンバ変数に保存
  Isolate スコープの中 {
    Handle スコープの中 {
      Context 作成→メンバ変数に保存
      Cotext スコープの中 {
        JavaScript 初期化 (スクリプトコンパイル等)
      }
    }
  }
}

あるクラス::Run(){
  メンバ変数に保存した Isolate スコープの中 {
    Handle スコープの中 {
      メンバ変数に保存した Cotext スコープの中 {
        JavaScript 実行
      }
    }
  }
}
要は Isolate と Context はメンバ変数に保存してやれば良い.ただし Context::New は Local<> なので (そのままでは Handle スコープを抜けると破棄されるため) Persistent<> に変換してやる必要がある.(そして Run() 内でメンバ変数の Context を参照するときは,また Local<> に変換する.)
Context 内のグローバルオブジェクトとか,HandleScope を抜けるとどうなるか心配だったが,この方法なら破棄されないみたい.

というわけで hello.cc をちょっと改造して上記のことを実現したソースは以下のとおり.Compile メソッドで生成した JavaScript function の hoge() を,Run メソッドで呼ぶことができている.昔やってた,HandleScope を new で生成するというやばい方法は使わなくて済んだ.
// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "include/libplatform/libplatform.h"
#include "include/v8.h"

using namespace v8;

class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
public:
    virtual void* Allocate(size_t length) {
        void* data = AllocateUninitialized(length);
        return data == NULL ? data : memset(data, 0, length);
    }
    virtual void* AllocateUninitialized(size_t length) { return malloc(length); }
    virtual void Free(void* data, size_t) { free(data); }
};

class CScript {
    
    Platform* m_Platform;
    ArrayBufferAllocator m_Allocator;
    Isolate::CreateParams m_CreateParams;
    Isolate* m_Isolate;
    v8::Persistent<v8::Context> *m_Context;
    
  public:
    CScript( char *path ){
        // Initialize V8.
        V8::InitializeICU();
        V8::InitializeExternalStartupData( "." );
        m_Platform = platform::CreateDefaultPlatform();
        V8::InitializePlatform(m_Platform);
        V8::Initialize();
        m_CreateParams.array_buffer_allocator = &m_Allocator;
    }
    
    ~CScript(){
        m_Isolate->Dispose();
        V8::Dispose();
        V8::ShutdownPlatform();
        delete m_Platform;
    }
    
    void Compile( void ){
        // Create a new Isolate and make it the current one.
        m_Isolate = Isolate::New(m_CreateParams);
        {
            Isolate::Scope isolate_scope(m_Isolate);
            
            // Create a stack-allocated handle scope.
            HandleScope handle_scope(m_Isolate);
            
            // Create a new context.
            Local<Context> context = Context::New(m_Isolate);
            m_Context = new Persistent<v8::Context>( m_Isolate, context );
            
            // Enter the context for compiling and running the hello world script.
            Context::Scope context_scope(context);
            
            // Create a string containing the JavaScript source code.
            Local<String> source =
                String::NewFromUtf8(m_Isolate, "function hoge(){ return 'hoge!!!'; }",
                    NewStringType::kNormal).ToLocalChecked();
            
            // Compile the source code.
            Local<Script> script = Script::Compile(context, source).ToLocalChecked();
            Local<Value> result = script->Run(context).ToLocalChecked();
        }
    }
    
    void Run( void ){
        Isolate::Scope isolate_scope(m_Isolate);
        
        // Create a stack-allocated handle scope.
        HandleScope handle_scope(m_Isolate);
        
        // Create a new context.
        Local<Context> context = Local<Context>::New( m_Isolate, *m_Context);
        
        // Enter the context for compiling and running the hello world script.
        Context::Scope context_scope(context);
        
        Local<Function> hFunction = Local<Function>::Cast( context->Global()->Get( String::NewFromUtf8( m_Isolate, "hoge" )));
        if( hFunction->IsUndefined()){
            int a=0;
        }
        
        Local<Value> result = hFunction->Call( context->Global(), 0, NULL);
        // Run the script to get the result.
        
        // Convert the result to an UTF8 string and print it.
        String::Utf8Value utf8(result);
        printf("%s\n", *utf8);
    }
};

int main(int argc, char* argv[]) {
    
    CScript *scr = new CScript( argv[ 0 ]);
    scr->Compile();
    scr->Run();
    delete scr;
    
    return 0;
}