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を直接読み込むよう指定できます。
  1. // マニフェストv1の記述  
  2. "background_page""background.html",  
  3.   
  4. // マニフェストv2の記述  
  5. "background": {  
  6.   "scripts": ["background.js"]  
  7. },  
【新しいセキュリティポリシー(CSP)への対応】
インラインのJavascriptの実行ができなくなりました。下記のような対応が必要になります。
(もともとViewとロジックを分離するようにコード書いている人は最初の2つは別段対応いらないかもしれません・・・)

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

・イベントハンドラ(onloadとかonclick)もhtml上には記述できません。例えば下記のようにjsファイルで動的に追加します。
  1. // 動的にイベントハンドラを追加  
  2. document.addEventListener('DOMContentLoaded'function () {  
  3.   // 1. bodyのonloadで行っていた初期化コードなどをここに書く  
  4.   
  5.   // 2. イベントハンドラの登録をする  
  6.   document.querySelector('button').addEventListener('click', save_options);  
  7. });  
・スクリプトやリソースは同梱しないといけなくなりました。(ネット上から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イメージのファイルハッシュを計算してテストしてみました。
  1. #include "stdafx.h"  
  2. #include "Hash.h" // OpenSSLのinclude  
  3.   
  4. #define TARGET_FILE "E:\\Windows8-ReleasePreview-32bit-Japanese.iso"  
  5. #define BUFSIZE (1024 * 16) // OpenSSLの定義と同じ  
  6.   
  7. int _tmain(int argc, _TCHAR* argv[])  
  8. {  
  9.     unsigned char sha1hash[SHA_DIGEST_LENGTH] = { 0 };  
  10.     unsigned char buf[BUFSIZE];  
  11.     DWORD dwStart = 0;  
  12.     DWORD dwEnd = 0;  
  13.   
  14.     // SHA1 using OpneSSL lib  
  15.     printf("Calculate file hash for sha1\n");  
  16.     dwStart = ::GetTickCount();  
  17.     SHA_CTX ctx;  
  18.     SHA1_Init(&ctx);  
  19.     CFile file(TARGET_FILE, CFile::modeRead);  
  20.     UINT nRead = 0;  
  21.   
  22.     do{  
  23.         nRead = file.Read(buf, BUFSIZE);  
  24.         if(nRead > 0){  
  25.             SHA1_Update(&ctx, buf, nRead);  
  26.         }  
  27.     }while(nRead == BUFSIZE);  
  28.    
  29.     SHA1_Final(sha1hash, &ctx);  
  30.     dwEnd = ::GetTickCount() - dwStart;  
  31.   
  32.     printf("SHA1(%s)= ", TARGET_FILE);  
  33.     for(int i = 0; i < SHA_DIGEST_LENGTH; i++){  
  34.         printf("%.2x",sha1hash[i]);  
  35.     }  
  36.     printf("\n");  
  37.     printf("Elapsed Time(ms) = %d\n", dwEnd);  
  38.   
  39.     return 0;  
  40. }  
※OpenSSLライブラリとは、stdafx.hで下記のように書くか、設定画面でリンクの設定をしてください。
  1. // OpenSSL lib  
  2. #pragma comment(lib, "openssl/lib/libeay32.lib")  
  3. #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以下のパスは同じです