2012年11月22日木曜日

2011年春モデルのVAIO TypeE(VPCEA4AFJ)のWindows8アップデート顛末記

2011年の夏にアウトレットで購入した14インチのVAIO Type E (ATI Mobility Radeon HD 5470搭載)
をWindows8にアップデートしたので、その時ハマったポイントなどを書き残しておきます。
全体的な印象として、Vista→7の時のアップデートのスムーズさを期待すると裏切られます。
7との互換性は高いといわれてますが、ドライバ類がちょっと問題ありでした。

【注意】
公式サイトによると、2011春モデルはWin8に更新するとサポート対象外になるみたいなので、
心配な方はやめておいたほうが良いでしょう。(アップデートは自己責任で!)

【インストールまで】
・Windows8はダウンロード版であれば2013/1/31まで3,300円で購入できます。
(http://windows.microsoft.com/ja-JP/windows/buy?ocid=GA8_O_WOL_DIS_ShopHP_FPP_Light)

・支払いはクレジットカードとかPayPalで簡単に出来ます。

・念のため有線LANで作業を行うことにしました。

・購入するとWindows7上からアップグレードツールが起動して、ダウンロードが行われます。

・ダウンロード完了後に、(1)すぐにインストール、(2)ISOとして保存、(3)USBに保存の3種類の
  オプションが選べます。今回はアプリを引き継いでアップグレードしたいので(1)を選択。

・移行アシスタントが起動して、Windows8と互換性の無いアプリを事前に教えてくれます。
  (この時点でまだキャンセルできたはず) いくつか例を。
  1. Windows8ではDVD再生機能が標準で搭載されていませんが、いまならWindows Media Centerを無料で入手できるので気にしなくて大丈夫です。(http://windows.microsoft.com/ja-JP/windows-8/feature-packs) ※プロダクトキーが届くまで1~2日かかります



  2. DEAMON ToolsはISOイメージのマウントの為だけに使っていたので削除。(Windows8ではOS標準でISOイメージを扱えます)



  3. ATIのディスプレイドライバ、これでハマりました(後述)



  4. 素直に指示に従ってPCとの関連付けを一度削除しておきました



  5. 使ってないので要らないですね。この機会に削除。(なんで有料?)



・インストール開始してから終了までは問題なく推移。(3時間くらいかかりました)

【Windows8起動後】
・Windows Updateを実行して、OSを最新の状態にします。

・ここで無線LANに切り替えましたが問題なく使えました。

・VUDesktopToast.exe(VAIO Update関係のツール?)でmfc110u.dllが無いと怒られます。
  →Visual Studio 2012 の Visual C++ 再頒布可能パッケージを入れれば良いです。
      (x86とx64両方入れておきましょう。ちなみにVUDesktopToast.exeはx86で動いてました)

・.NET Framework 3.5を入れないと動かないアプリもあるので、コントロールパネルの
  「プログラムと機能」から「Windowsの機能の有効~」を選んで入れておきます。



・HDMI接続をしていると、ディスプレイドライバが正しく認識されていないことに気付くはずです。
  Windowsの設定ではFullHDになっていても、実際には周りに黒枠が出て解像度も低い状態です。
  1. 普通こういう場合はATI(AMD)のHPに行ってWin8対応の最新のドライバを取ってきて入れてやれば解決しますが、VAIOは特殊らしくこの方法では解決できませんでした。AMDのページにもよく見るとSONYのLaptopは対応してないよって書いてあります。
  2. とりあえず、「ATI Catalyst Control Center」と「ATI Catalyst Install Manager」を一度アンインストールします。
  3. VAIO公式に行ってWin7用のATIの最新ドライバをダウンロードします。
  4. Win7互換モードかつ管理者権限で実行します。(下記手順)









  5. 「プログラムのテスト」ボタンを押すと実行されます。ファイル展開ダイアログ表示後は、画面には何も表示されませんが暫く待ちましょう。画面が何度か明滅するのが動いている証拠です。2、3分くらいで処理が終わり、HDMIでFullHD表示できるようになりました。


上記のように、いくつかトラブルはあったものの、無事解決して今は快適にWin8稼働してます。


2012年8月4日土曜日

ActiveXコントロールをOLEオートメーションで呼び出す方法


ActiveXコントロールをダイアログに張り付けず、 ダイアログなしのオートメーションサーバーとして呼び出したい
場合のやり方についてです。試したのはイベントを含んでいないケース(プロパティとメソッドのみ)なので、
イベントをサポートしている場合にどういった挙動になるかは調べてません。

これ普通のDLLでよかったんじゃ・・・。というActiveXコントロールを、マルチスレッドでの利用のために
オートメーションを使った呼び出しに変更した時のお話です。
知ってれば1分で終わる話ですが、少し調べるのに手間取ったのでメモしておきます。
ちなみに対象のActiveXコントロールのソースコードにアクセスできて、ビルド可能な事が前提です。

結論から書くと、ActiveX側のCOleControlから派生しているクラスで、IsInvokeAllowedを
オーバーライドしてTRUEを返すだけです。
--
以下は試した内容です。

①タイプライブラリの作成
タイプライブラリを使用しますので、ActiveXコントロールをビルドしてもtlbファイルが生成されていない場合、
プロジェクトのプロパティから、MIDLの出力設定へ進み、タイプライブラリを生成する設定にします。

②ラッパークラスの作成
クラスウィザードで、MFCy→「TypeLib からの MFC クラス」を選び、
タイプライブラリを選択してラッパークラスを作成します。
COleDispatchDriverから派生したクラスが自動生成されているはずです。


③ラッパークラスの調整
一番上に#import文があると思いますが、今回はCreateDispatchを呼ぶ際のGUIDを取得する以外には使いませんので、
ラッパークラスを生成しない様に下記の様なオプションを設定しておきます。

#import "xxx.tlb" no_namespace named_guids no_implementation no_smart_pointers raw_interfaces_only

ビルドすると、出力フォルダにxxx.tlhというファイルが自動生成されます。
これをエディタで開き、CLSID_から始まるGUIDを探します。

④使ってみる
ActiveXコントロールと接続するためには、下記にように書きます。
// テストコード
// (自動生成されたクラス名を仮にCMyOle、GUIDをCLSID_XXXとします)
CMyOle myObj;
if(myObj.CreateDispatch(CLSID_XXX) == TRUE){
    myObj.FuncA();
}
多分FuncAの呼び出しでCOleException (エラーコード 0x8000FFFF) が発生したと思います。
CreateDispatchに失敗する場合は、COMが登録されていない(regsvr32)か、CLSIDが
間違っている可能性があります。(ここで指定すべきはIIDではなくCLSIDです)

⑤ActiveXコントロールの変更
// COleControlから派生しているクラスでIsInvokeAllowedを
// オーバーライドしてTRUEを返す
BOOL CMyOleControl::IsInvokeAllowed (DISPID)
{
    return TRUE;
}
⑥再度試す
ビルドしなおしてテストすると、今度は④のコード呼び出しが成功しました。

【参考】
How to use an OLE control as an automation server in Visual C++
http://support.microsoft.com/kb/146120/EN-US

2012年7月23日月曜日

Chrome拡張機能のマニフェストVesrsion2対応についてのメモ


2年前くらいに作成したChrome拡張機能(Last Tab Keeper)のManifest Version 2対応を行いました。
もともと自分が欲しくて作ったものですが、いつの間にか2千人近い方に使って頂きありがとうございます。
何か機能追加を行った訳ではありませんが、これをやらないと2013年第3四半期には使えなくなってしまう との事でしたので、
アップデートを行いました。その時の内容を少しメモしておきます。

【manifest.jsonの変更】

・まず下記のプロパティの追加が必要
  "manifest_version": 2

・"background_page"プロパティが"background"に名前変更され、記述方法が変更されています
  v1はhtmlのscriptタグでjsを読み込んでいましたが、v2からjsを直接読み込むよう指定できます。
// マニフェストv1の記述
"background_page": "background.html",

// マニフェストv2の記述
"background": {
  "scripts": ["background.js"]
},
【新しいセキュリティポリシー(CSP)への対応】
インラインのJavascriptの実行ができなくなりました。下記のような対応が必要になります。
(もともとViewとロジックを分離するようにコード書いている人は最初の2つは別段対応いらないかもしれません・・・)

・htmlファイル内にjavascriptを含めることができませんので、別ファイルに分けてscriptタグで読み込む必要があります。

・イベントハンドラ(onloadとかonclick)もhtml上には記述できません。例えば下記のようにjsファイルで動的に追加します。
// 動的にイベントハンドラを追加
document.addEventListener('DOMContentLoaded', function () {
  // 1. bodyのonloadで行っていた初期化コードなどをここに書く

  // 2. イベントハンドラの登録をする
  document.querySelector('button').addEventListener('click', save_options);
});
・スクリプトやリソースは同梱しないといけなくなりました。(ネット上からjQueryなどのライブラリを読み込んではいけない)

※かなりシンプルな拡張機能ですので上記対応で済みましたが、これ以外にも影響あるかと思います。
複雑なものをお作りの方はそれなりの変更工数かかるのでは?という印象でした。
ちなみにストアの方は特に変更無いみたいで、今までと同じ方法でアップロードできました。

 【参考サイト】
[公式]
Manifest Version // 以降スケジュールや差分などについて
Formats: Manifest Files // マニフェストファイルの詳細
Content Security Policy (CSP) // 一番影響のあるセキュリティポリシーの詳細について

[その他]
Chrome Tech Talk Night #3 行ったので拡張機能の内容をまとめてみる
↑日本語情報があまり無い中、とても参考になりました

2012年7月10日火曜日

OpenSSLを使ったファイルハッシュ計算方法

openssl.exeを使った方法と、C++でライブラリを呼び出して計算してみる2パターンをメモ。

【SHA1の場合】
openssl.exe sha1 [ファイル名]

Visual Studioを使ったC++(コンソールアプリ)のサンプルは下記のような感じになります。
サンプルではWindows8 RP版のisoイメージのファイルハッシュを計算してテストしてみました。
#include "stdafx.h"
#include "Hash.h" // OpenSSLのinclude

#define TARGET_FILE "E:\\Windows8-ReleasePreview-32bit-Japanese.iso"
#define BUFSIZE (1024 * 16) // OpenSSLの定義と同じ

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned char sha1hash[SHA_DIGEST_LENGTH] = { 0 };
    unsigned char buf[BUFSIZE];
    DWORD dwStart = 0;
    DWORD dwEnd = 0;

    // SHA1 using OpneSSL lib
    printf("Calculate file hash for sha1\n");
    dwStart = ::GetTickCount();
    SHA_CTX ctx;
    SHA1_Init(&ctx);
    CFile file(TARGET_FILE, CFile::modeRead);
    UINT nRead = 0;

    do{
        nRead = file.Read(buf, BUFSIZE);
        if(nRead > 0){
            SHA1_Update(&ctx, buf, nRead);
        }
    }while(nRead == BUFSIZE);
 
    SHA1_Final(sha1hash, &ctx);
    dwEnd = ::GetTickCount() - dwStart;

    printf("SHA1(%s)= ", TARGET_FILE);
    for(int i = 0; i < SHA_DIGEST_LENGTH; i++){
        printf("%.2x",sha1hash[i]);
    }
    printf("\n");
    printf("Elapsed Time(ms) = %d\n", dwEnd);

    return 0;
}
※OpenSSLライブラリとは、stdafx.hで下記のように書くか、設定画面でリンクの設定をしてください。
// OpenSSL lib
#pragma comment(lib, "openssl/lib/libeay32.lib")
#pragma comment(lib, "openssl/lib/ssleay32.lib")

【MD5の場合】
openssl.exe md5 [ファイル名]

ソースの方はMD5_~に変わるだけで、あとは全く同じなので省略します。

Visual Studio registry capture utility のエラー解決方法

久しぶりにCOM連携アプリケーションをビルドしたら下記エラーがでました。
Visual StudioのSetupプロジェクトで、tlbファイルを依存関係に追加している場合、
Windows7(x64)環境下で発生するようです。ちなみにVisual Studioは2005です。













Google先生に聞いて、下記ブログを参考に解決できました。
[VS2010]Registry Capture Utilityが動作停止する問題 - とりあえず解決
 
すぐ忘れそうなのでメモしておきます。
解決方法としては、regcap.exeのプロパティを開いて、互換モードを
Windows Vista (Service Pack2)に変更すれば良いみたいです。

[regcap.exeの場所]
C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\Deployment\regcap.exe
※VS2008やVS2010でもCommon7以下のパスは同じです

2012年6月16日土曜日

[WinJS] CP版の Metro Style アプリをRP版に移行する時のメモ

Javascriptで作っていたメトロアプリが案の定動かなくなったので、その時の移行のメモです。
動的言語なので、オブジェクトの中身が変わっていても実行時にしかわからないのが痛いですね。
CP版のVS11で作成したアプリを、RP版のVS2012でビルドしなおす場合を想定しています。

(1) WinJSの参照をやり直す
CP版は0.6だったのですが、1.0.RCというバージョンになっています。
なので、一度参照を削除して再度追加してやる必要があります。



(2) default.htmlの参照を修正する
下記のように、WinJSへの参照の部分を、Microsoft.WinJS.0.6からMicrosoft.WinJS.1.0.RCに修正します。WinJSの参照をしなおしただけでは、自動で変わりませんので注意してください。


(3) RC版での変更に対応する
ビルドしただけでは分かりませんので、基本的には実行してみてエラーになった個所を潰していく感じになると思います。

Consumer Preview 以降のアプリ開発者向けの変更点
http://blogs.msdn.com/b/windowsappdev_ja/archive/2012/06/07/consumer-preview.aspx

移行ガイド (英語)
http://go.microsoft.com/fwlink/?LinkID=251943


(4) WinJS.xhrでHttpWebRequestを行っていた場所を見直す
前述の移行ガイドでも見当たらなかったのですが、responseXMLの型が変更になっているみたいです。CP版の場合は、MSXMLに由来するMS独自拡張のselectNodesやselectSilgleNodeでXPath式を使って操作ができたのですが、RP版では変更(削除)されたようです。なので、これらを使っているプロジェクトの場合、実行時にエラーになります。

解決方法としては、新たにSelectors APIが使えるようになっていますので、querySelectorAllとかquerySelectorを代わりに使います。こちらは引数がCSSセレクタですので、XPath式からの書き換えも忘れずに。

例えば下記のように書き換えます。


item.selectSilgleNode("title").text; // CP版

item.querySelector("title").textContent; //RP版


Release Candidate: Did responseXML change at all? selectNodes isn't a method anymore...
http://social.msdn.microsoft.com/Forums/sv-SE/winappswithhtml5/thread/2141429b-b7d3-46ef-a46b-5919e41d454f




2012年4月10日火曜日

OpenSSLでの証明書関連コマンドメモ

何回やっても覚えられないので・・・。自分用にまとめておきます。
IISで作成したCSRを署名したい場合は、CAによる署名を行った後、
DERに変換してやれば良いです。

・秘密鍵の作成
openssl genrsa -out keyfile.pem 2048

・CSRの作成
openssl req -new -key keyfile.pem -out csrfile.pem

・自己署名
openssl x509 -req -in csrfile.pem -signkey keyfile.pem -out certfile.pem

・CAによる署名
openssl ca -out certfile.pem -infiles csrfile.pem

・CAによる失効
openssl ca -revoke certfile.pem

・CRL発行
openssl ca -gencrl -out crl.pem

・CRL変換
openssl crl -in crl.pem -outform DER -out crl.der

・PEM->DER
openssl x509 -in file.pem -outform DER -out file.der

・DER->PEM
openssl x509 -inform DER -in file.der -outform PEM -out file.pem

・PKCS#12作成
openssl pkcs12 -export -in certfile.pem -inkey keyfile.pem -certfile rootca.pem -out file.p12

・PKCS#12作成(CAチェーンつき) ca.pem内に複数証明書を入れておく
openssl pkcs12 -export -in certfile.pem -inkey keyfile.pem -chain -CAfile ca.pem -out file.p12

・PKCS#12から秘密鍵のみ取り出す(暗号化の必要なければ-nodesをつける)
openssl pkcs12 -in input.pfx -nocerts -out output_key.pem

・PKCS#12からサーバー証明書のみ取り出す
openssl pkcs12 -in input.pfx -clcerts -nokeys -out output_crt.pem

・RSA秘密鍵のパスフレーズ削除
openssl rsa -in server.key -out server.key

※ファイル名は適当ですので読み替えてください