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

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

2011年2月19日土曜日

WASでnet.tcpやnet.pipeを使おうとするとエラーになる

IISのWAS(Windowsプロセスアクティブ化サービス)によるhttp以外のプロトコルによる
ホスティングを試そうと、有効なプロトコルにnet.tcpとnet.pipeを追加しました。



そうしたら下記エラーが発生。

プロトコル 'net.tcp' には、登録されている HostedTransportConfiguration 型が実装されていません

相変わらず全く意味が分かりませんね・・・。
原因は、Windowsの機能が一部インストールされていないからでした。
デフォルトでは入っていないみたいなので、注意してください。

2011年2月13日日曜日

参照設定で System.ServiceModel.Web が出て来ない

Visual Studio 2010 でWCFを使ってRESTfulサービスを作る場合は、下記参照の追加が必要です。
(コントラクトでWebGetAttributeなどを指定するため)

System.ServiceModel.Web

VS2010のWCFテンプレートを使ってプロジェクトを作成した場合、そのままでは参照の追加に出てきません。
プロジェクトのプロパティから[対象のフレームワーク]を変更してやる必要があるみたいです。


デフォルトでは.NET Framework 4 Client Profileになっていますが、.NET Framework 4に変更します。
Client Profileにはサーバーアプリケーション開発に必要なコンポーネントが含まれていないため、
このような操作が必要になってきます。