ホーム > アーカイブ > 2010年11月のアーカイブ

2010年11月のアーカイブ

[VS]ソフトウェア発行元証明書の作成と署名

作成物に証明書を署名するための作成方法と署名方法をメモ。

自己署名証明書とか、オレオレ証明書とかいわれるものでVSTOのインストールにClickOnceを使用する場合、必要なもの。
使用するツールはWindowsSDKに含まれている。

  • 作成方法
    
    rem 1.====
    rem CA:Certificate Authority:認証局証明書
    rem  会社名 : MoonWing
    rem  組織名 : MoonWing Authority Root CA
    rem  県  名 : Tokyo
    rem  国  名 : JP
    rem 有効期限: 2012.12.31
    "%ProgramFiles%\Microsoft SDKs\Windows\v7.1\Bin\makecert" -r -n "C=JP, S=Tokyo, OU=MoonWing Authority Root CA, O=MoonWing" -e 12/31/2012 -a sha1 -cy authority -sv moonwingCA.pvk moonwingCA.cer
    rem 秘密キーのパスワードの作成:Subject Key:rootCA
    rem 秘密キーのパスワードの入力:Subject Key:rootCA
    
    rem 2.====
    rem EE:End Entity:署名用証明書
    rem コモン名: MoonWing
    rem  会社名 : MoonWing
    rem  組織名 : MoonWing Development
    rem  県  名 : Tokyo
    rem  国  名 : JP
    rem 有効期限: 2012.12.31
    "%ProgramFiles%\Microsoft SDKs\Windows\v7.1\Bin\makecert" -n "CN=MoonWing, C=JP, S=Tokyo, O=MoonWing, OU=MoonWing Development" -e 12/31/2012 -sv moonwing.pvk -ic moonwingCA.cer -iv moonwingCA.pvk -nscp -cy end moonwing.cer
    rem 秘密キーのパスワードの作成:Subject Key:endEntity
    rem 秘密キーのパスワードの入力:Subject Key:endEntity
    rem 秘密キーのパスワードの入力:Issuer Signature:rootCA
    
    rem 3.====
    rem SPC:Software Publisher's Certificate:ソフトウェア発行元証明書
    "%ProgramFiles%\Microsoft SDKs\Windows\v7.1\Bin\Cert2SPC" moonwing.cer moonwingCA.cer moonwing.spc
    
    rem 4.====
    rem PFX:Personal Information Exchange:PKCS#12
    rem  -pi(pvkpassword):endEntity
    rem  -po(pfxpassword):SPC
    "%ProgramFiles%\Microsoft SDKs\Windows\v7.1\Bin\pvk2pfx" -pvk moonwing.pvk -pi endEntity -spc moonwing.spc -pfx moonwing.pfx -po SPC
    
  • 署名方法
    
    rem 5.====
    rem target.exeへ署名
    rem  -t(time stamp server):http://timestamp.verisign.com/scripts/timstamp.dll
    rem  -p(pfxpassword):SPC
    "%ProgramFiles%\Microsoft SDKs\Windows\v7.1\Bin\signtool" sign /f moonwing.pfx /a /t http://timestamp.verisign.com/scripts/timstamp.dll /p SPC target.exe
    
ツイートツイート

[Tool]Mercurial(マーキュリアル)の導入

GoogleCodeでも使用されている分散型バージョン管理システム。
以前は、集中型バージョン管理システムのSubversionを使用していたが
個人用途なのにいちいちサーバーとして動作させるのが好きではなかったので
そそくさと、こちらに移行。

導入といっても、「TortoiseHg(with Mercurial)」をインストールし、下記のレジストリを追加

  • %ProgramFiles%\TortoiseHg\i18n\cmenu\thg-cmenu-ja.reg

この時点で、右クリックで表示されるコンテキストメニューは日本語になっていたが、
設定画面は英語だったので日本語化するためにユーザー環境変数に下記の設定を追加する。

  • 変数名:LANG
  • 変数値:ja

リポジトリをコンテキストメニューで作成して利用開始。
「$Id$」をコミット時に展開するためにコマンドプロンプトから
リポジトリ内(“.hg”があるディレクトリ)で下記のコマンドを実行

hg kwexpand


エラーが出ていないことが確認できたらコミットして展開されるか確認。

“hgrc”に下記の指定が必要だったかどうかは覚えていないがメモ。

[extensions]
hgext.keyword =

[keyword]
* =

ツイートツイート

宇宙の事典を読み終えて

[amazon asin=”4816336575″][/amazon]

無人探査機「はやぶさ」がイトカワの物質を0.01mm以下だったとしても持ち帰れた快挙を成し遂げ、
宇宙への関心が高まっている中、宇宙初心者にお勧めできる本。

写真やイラストが大きく一見子供向けな本かと思ったらなかなか難しいことも書いている。
特殊相対性理論とかひも理論とかにも触れらている。
といっても、解説はされていないため、入口として使用する必要がある。

この本には、2004年の最新情報が乗っている。
もちろん、2010年になった今、この中身とはまた違う考え方も存在しているだろう。
けれど、その時の主流の考え方を知ることは今の主流の考え方を理解する上で役に立つと思うし、
変わらないものもたくさん詰まっているので、やはり入門書しては最適だと思う。

個人的に楽しめたのはブラックホール天体についてとか、暗黒物質存在、
それに何より、水星での太陽の動きについての記述がとても新鮮だった。
天王星や海王星に触れられいているし、ほんとうに知らないことたくさん知れて楽しめた。
とても満足できる本。

ツイートツイート

[VS]Office AddinのインストーラがVSTOのインストールに失敗する

VisuatlStudio2010 + .NetFramework3.5でOffice2007のアドインを作成し、Setupを下記のサイトを参考に作成したときのメモ。

かなり役に立つので必読です。

上記の記事を参考にすることで、AddinとSetupがパッケージぽい形になるかと思います。
自分が作成した際には熟読してないがために下記の2点が抜けていました。

  • レジストリへ登録の作成
  • Inclusion Listへの登録処理作成

ちなみに起動条件の作成時にVSTOの日本語ランゲージパックを追加しようとしたのですがうまくいきませんでした。
Oracで取得したComponentIDが正しいかどうかすら確認できず、とりあえず、必須制限からはずしました。

VM上でインストーラのテストを行ったところインストールは完了するもののうまくアドインが動作しません。
ログを出すためにユーザー環境変数に以下の2つを追加しました。

  • VSTO_SUPPRESSDISPLAYALERTS:0
  • VSTO_LOGALERTS:1

(参考:アプリケーション レベルのプロジェクトのデバッグ

ログを追いかけてみてわかったことは2つありました。

  1. Setup.msiでは必須コンポーネントがインストールされない
  2. VSTO4.0ランゲージパックのダウンロードに失敗する

1つ目は、最初に示した参考サイト内にちゃんと書かれていました。

Setup.exe をダブルクリックしてソリューションをインストールする代わりに、.msi ファイルをダブルクリックしてソリューションをインストールする方法も選択できます。このモードでは、ユーザーはブートストラップを実行しません。そのため、セットアップは依存関係を検出できず、必要に応じた必須コンポーネントのインストールも行いません。

つまり、Setup.exeでインストールしないといけないということで、Setup.exeは必須コンポーネントインストール後にSetup.msiを実行すると。
といわけで、VisualStudioのSetupプロジェクトの「必須コンポーネント」プロパティはSetup.exeに作用するだけで、別途Setup.msiが必須コンポーネントの存在しない場合に起動しないようにするための起動条件は手動で作成しなければならないとのことです。しっかり読んでいたならこんなところでは引っかからなかったのでしょうが。

2つ目はインストーラのログを読んでVSTO4.0日本語ランゲージパックのダウンロードに失敗していました。
具体的には下記の2つのURLです。

  • http://go.microsoft.com/fwlink/?LinkId=158919&clcid=0x411
  • http://go.microsoft.com/fwlink/?LinkId=158920&clcid=0x411

上記のURLは確かにリダイレクト先が存在しないようで、このURLはどこで設定されているかを調べてみました。
その結果、レジストリの

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\GenericBootstrapper\3.5

に記載されているPath内(多分WindowsSDK内)にあるBootstrapperと呼ばれるものの中で定義されているようです。

実際に自分の環境のBootstrapper/VSTO4.0日本語ランゲージは

  • C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\VSTOR40\ja\package.xml

にURLが記載されていていました。

ここは、本来手を入れるべきではない場所でしたが実験でURLを下記のように書き換えてみたところ、無事インストールを成功させることができました。


--- before/package.xml
+++ after/package.xml
@@ -61,7 +61,7 @@
     Microsoft Visual Studio 2010 Tools for Office Runtime (x86 および x64) Language Pack - 日本語のインストール中にエラーが発生しました。
     http://go.microsoft.com/fwlink/?LinkId=158917
     http://go.microsoft.com/fwlink/?LinkId=158918
-    http://go.microsoft.com/fwlink/?LinkId=158919&clcid=0x411
-    http://go.microsoft.com/fwlink/?LinkId=158920&clcid=0x411
+    http://download.microsoft.com/download/8/D/1/8D139084-948F-45F7-A014-71A90E2572EC/vstor40_LP_x86_jpn.exe
+    http://download.microsoft.com/download/8/D/1/8D139084-948F-45F7-A014-71A90E2572EC/vstor40_LP_x64_jpn.exe
   
 

とりあえず、Microsoftからの修正がでるまではこの対応ではこの対応で乗り切れると思います。
たしか、VSTO3.0でも同様にv6.0A内のBootstrapperの日本語ランゲージへのURLも同じように存在しない場所を指してたような。
(参考:まなBlog)

それと、小さな注意点がありました。
Windows7で開発していたため、package.xmlを書き換えるには管理者権限が必要でした。
ふだん使っているエディタを管理者権限で起動しなおすのは手間だと思い、メモ帳を管理者権限で立ち上げ、URLを修正したのが問題となりました。
というのも、このpackage.xmlはUTF-8のBOMなし(UTF-8N)で作成されているのですが、Windows付属のメモ帳ではBOMありでUTF-8を保存してしまうようで、
Setupをリビルドした際に下記の警告が表示され、実際インストーラはランゲージパックをインストールしない挙動に変わってしまいました。


警告: カルチャ 'ja-JP' を項目 'Microsoft Visual Studio 2010 Tools for Office Runtime (x86 and x64)' に対して一致できませんでした。カルチャ 'en' を使用します。

package.xmlをUTF-8Nで保存し、BOMがないことと文字化けしていないことを確認して再ビルドしたところ警告もなくなり、ランゲージパックのインストールも主なわれるようになりました。

また、今回は必要とならなかったけれど関連のある参考サイトもメモ

ツイートツイート

[VS]PIA対応バージョンまとめ

PIAのバージョンとOfficeのバージョンと.NetFrameworkのバージョンの表をVSTO表のついでに作成。
PIAとはPrimaryInteropAssemblyことで・・・詳細はMicrosoftにお尋ねください。

PIA 対応Office 対応.NetFramework 対応Windows
XP XP 1.1 XP
2003 2003 1.1 2000 SP3,XP,Server 2003
2007 2007 1.1 2000 SP4,XP SP2,Server 2003
2010 2010 2.0 or higher 2000 SP4,XP SP2,Server 2003,Vista,7,Server 2008
ツイートツイート

[VS]VSTO対応バージョンまとめ

VSTOのバージョンとOfficeのバージョンと.NetFrameworkのバージョンの表がほしくなったので作成。
VSTOとは

  • Microsoft Visual Studio 2005 Tools for Office Second Edition Runtime
  • Microsoft Visual Studio 2005 Tools for the 2007 Microsoft Office System
  • Microsoft Visual Studio Tools for the Microsoft Office system (Version 3.0 Runtime)
  • Microsoft Visual Studio 2010 Tools for the Microsoft Office System (Version 4.0 Runtime)

と微妙に名前が変わっているOffice拡張用コンポーネントのことです。
基本的には上記の2個目を省いた以下の3つあれば問題ないはず。
(というか、3個目も省いていいかも、結局2個で2003,2007,2010に対応できることになるわけだし。)

Vsto 対応Office 対応.NetFramework 対応VisualStduio 対応Windows
2005 SE 2003,2007 2.0 2005 2000,XP,Server 2003,Vista,7,Server 2008
3.0 2007 3.5 SP1 2008 2000,XP,Server 2003,Vista,7,Server 2008
4.0 2007,2010 3.5 SP1 2010 XP,Server 2003,Vista,7,Server 2008
ツイートツイート

[C#]文字列整形関数

.Netframework 3.0 以降でなるだけ国・地域に依存しない感じで、文字の整形関数を考えてみた。
というのも、もともと用意されているPadLeftなどでは日本語の全角文字を使用するとずれてしまう。
ここでめんどくさいのが文字数と文字コードのバイト数ともに文字の表示数と一致しないこと。

全角文字はよく2バイト文字といわれていたが、Unicodeではそうならない。
表示上2バイト分(全角)でも、バイト数は3バイトとか4バイトも存在する。
もちろん、文字数でカウントしても全角文字は1文字として検出される。
つまり、3バイトの全角文字1文字をPadLeftで整形しようとしたときにめんどくささに気づくわけだ。

で、強引な方法で実装してみたのでメモ。
実際は、半角か全角かを検出できればいいから画面から取得なんて強引なことをしなくてもできそう。
でも、気がついた時にはすでに組み終わってたので、改良された方はトラックバックとかお願いします・・・。


//書式整形に使用するフォント
public Font fixedPitchFont;

public setFixedPitchFont()
{
    //書式整形に使用するフォントをユーザー環境に合わせて切り替える
    System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
    if (ci.TextInfo.LCID == 1041)
    {
   	 //日本
   	 fixedPitchFont = new Font("MS ゴシック", SystemFonts.DefaultFont.SizeInPoints);
    }
    else
    {
   	 //その他("Courier New":マルチバイト時にずれる)
   	 fixedPitchFont = new Font(FontFamily.GenericMonospace, SystemFonts.DefaultFont.SizeInPoints);
    }
}

private void GetFontPitch()
{
    //描画サイズから1文字表示分の幅を取得する
    // 1. DPIから求める
    {
   	 //解像度の取得
   	 Font font20pixel = new Font(FontFamily.GenericMonospace, 20, GraphicsUnit.Pixel);
   	 int dpi = (int)Math.Round((72 * font20pixel.Size) / font20pixel.SizeInPoints);

   	 //固定幅はWidth:Height=1:2で作成されていることを前提として
   	 fixedPitchFontHeight = (int)Math.Ceiling(fixedPitchFont.SizeInPoints * dpi / 72);
   	 fixedPitchFontWidth = fixedPitchFontHeight / 2;
    }
    // 2. 念のため、描画してみた大きさから求めたものと比較する
    {
   	 //適当な大きさで描画用Bmpを作成(メインディスプレイの大きさで作成)
   	 Bitmap bmp = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
   	 try
   	 {
   		 Graphics g = Graphics.FromImage(bmp);
   		 Size Size1word = TextRenderer.MeasureText(g, " ", fixedPitchFont);  //半角(1Word)
   		 Size Size2word = TextRenderer.MeasureText(g, "m1", fixedPitchFont); //全角(マルチバイト文字も表示上2Word)

   		 int wordWidth = Size2byte.Width - Size1byte.Width;
   		 int wordHeight = Size1byte.Height;

   		 //一致しない場合は固定幅フォントではない可能性がある。とりあえず大きい方を使う。
   		 if (fixedPitchFontWidth != wordWidth)
   		 {
   			 fixedPitchFontWidth = Math.Max(fixedPitchFontWidth, wordWidth);
   		 }
   		 if (fixedPitchFontWidth != wordWidth)
   		 {
   			 fixedPitchFontHeight = Math.Max(fixedPitchFontHeight, wordHeight);
   		 }
   	 }
   	 finally
   	 {
   		 bmp.Dispose();
   	 }
    }
}

public int Display1ByteWordCount(string text)
{
    int displayFontWidth;
    
    //適当な大きさで描画用Bmpを作成(メインディスプレイの大きさで作成)
    Bitmap bmp = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
    Graphics g = Graphics.FromImage(bmp);
    Size stringSize = TextRenderer.MeasureText(g, text, fixedPitchFont);

    //表示に使用したpixelから文字数を逆算する。
    displayFontWidth = stringSize.Width / fixedPitchFontWidth + (int)Math.Round((double)(stringSize.Width % fixedPitchFontWidth) / 10);
    return displayFontWidth;
}

public string PaddingLeft(string text, int totalWidth)
{
    int diff = Display1ByteWordCount(text) - text.Length;
    return text.PadLeft(totalWidth - diff);
}

public string PaddingRight(string text, int totalWidth)
{
    int diff = Display1ByteWordCount(text) - text.Length;
    return text.PadRight(totalWidth - diff);
}
ツイートツイート

ホーム > アーカイブ > 2010年11月のアーカイブ

検索
フィード
翻訳

ページの上部に戻る