term タグ別の記事一覧

Windows環境でのRubyのSSLエラー対策(Windowsが管理するルート証明書を使う)

 Windows環境でRubyを使う際、以下のようなエラーが出る場合がある。これはSSLアクセスに利用できる適切なルート証明書がないために発生する。

C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock': SSL_connect
returned=1 errno=0 state=error: certificate verify failed (OpenSSL::SSL::SSLErro
r)

 対策としてはルート証明書を用意すれば良いのだが、ネットから安易にダウンロードしたくないという場合、「certmgr」というツールでWindowsが管理するルート証明書をエクスポートし、opensslコマンドでRubyが扱える形に変換して利用すれば良い。

 まずスタートメニューの「プログラムとファイルの検索」に「certmgr.msc」と入力してEnterキーを押す。certmgrが起動するので、左ペイン内の「信頼されたルート証明機関」-「証明書」を選択する。

 すると証明書一覧が表示されるので、右ペインをクリックし、Ctrl-A等を入力してすべての証明書を選択する。続いて右クリックしてコンテキストメニューの「すべてのタスク」-「エクスポート」メニューを選択する。「証明書のエクスポート ウィザード」が開くので、指示に従って進める。「エクスポートファイルの形式」では「PKCS #12」を選択し、「すべての拡張プロパティをエクスポートする」にチェックを入れておく。エクスポートされたファイルは.pfxという拡張子が付く。

 続いてこのファイルを引数に指定して次のようにopensslコマンドを実行する。Windowsにはデフォルトではopensslコマンドが含まれていないので、別途インストールするか、適当なLinuxマシンにエクスポートした.pfxファイルをコピーして実行しよう。

$ openssl pkcs12 -in <エクスポートしたファイル(.pfx)> -out <適当なファイル名.pem> -nodes

 これでRubyで扱える.pemファイルが出力される(参考:@ITの「*.pfxファイルからPEM形式で証明書や秘密鍵を取り出す」)。

 このファイルを適当な場所に保存し、SSL_CERT_FILE環境変数にそのパスを指定する。たとえばC:\Users\hylom\windows.pemとして保存した場合、以下のようになる。

$ set SSL_CERT_FILE=C:\Users\hylom\windows.pem

国産のWindowsフリーソフトにオープンソースのものは少ない気はするが実はそんなことはない

 日本では無料のソフト全般を「フリーソフト」と呼んでいるが、その中にはオープンソースのものと、非オープンソースのものがある。Windows向けのフリーソフトはやまほどあるが、そのなかでオープンソースのものとなると、その数は決して多くない。

 たとえば、窓の杜の2012年9月第1週・ソフトウェアダウンロードランキングトップ30を見てみると、オープンソースソフトウェアとみられるものは「Apache OpenOffice」「FFFTP」「CrystalDiskInfo」「Tera Term」「CrystalDiskMark」「IP Messenger」「Audacity」「MP3Gain」の8つ。このうち、国産のものが5つ、海外産のものが3つだ。

 また、ランキングに上がっている30本のソフトのうち、国産のソフトは17本で海外産ソフトは13本。ということで、国産ソフトも海外産ソフトも、ランキングに入るような人気のものについてはオープンソースである割合はさほど変わらないという結果だ。

 ただし、これはランキングに入るような人気ソフトウェアに限った調査なので、ランキングには入らないけどそこそこ人気のある中堅フリーソフトなどを加えると状況は変わってくるかもしれない。

Windows Azureメモその1

最近Windows Azureを触っているので備忘録的にはまったポイントをメモ(その1)。

SDKのバージョン

Windows AzureはSDKのバージョンアップとともに機能が増えたり仕様が変わっているため、古いバージョンのドキュメントを参照していると現状では仕様が変わっていたりしてハマる。特に1.3ではIIS周りの仕様変更など大きな変更点があったので、1.3未満のドキュメントを参照している場合注意が必要。特にFull IISあたり。

参考:Windows Azure 1.3の新機能の概要 - @IT

ディレクトリ構成

Windows Azureにデプロイした際、アップロードしたファイルがどのドライブに保存されるかは不定のようだ。E:の場合もあればF:の場合もある。WebRoleの場合、これらのドライブの、「¥approot¥」以下と「¥siteroot¥0¥」以下にファイルが展開される。¥approot¥と¥siteroot¥0¥以下には同じものが展開されるが、HTTPサーバーのルートとなるのは¥siteroot¥0¥のほう。

Web配置

Web配置では¥siteroot¥0¥以下が更新され、¥approot¥側は更新されない。

スタートアップタスクとその実行フォルダ

IISの設定を変更したい場合、スタートアップタスクとしてバッチファイルを実行するよう指定して処理するのが定石。スタートアップタスク実行時のカレントディレクトリは明言されていないが、Windows Azure環境では¥approot¥bin¥以下になる模様(エミュレータ上ではまた別のディレクトリになるので注意)。スタートアップタスクとして実行したいファイルのプロパティで「出力ディレクトリにコピー」を「常にコピーする」などに設定すると、そのファイルがこのディレクトリに配置される。サブディレクトリ以下にあるファイルはbin以下にそのサブディレクトリが作成されて配置される。

「ビルドアクション」の設定

ビルドアクションが「なし」のファイルはapprootおよびsiteroot以下に配置されず無視される。必要なファイルは「コンテンツ」に設定しておけばよい。

バッチファイル

Visual Studioでテキストファイルを作成するとBOM付きUTF-8エンコードのファイルができるのだが、これをバッチファイルとして実行しようとするとBOMが認識されずにエラーとなる。

エミュレータと実環境の違い

ディレクトリ配置が異なる。本番環境で¥approot¥bin¥に配置されるディレクトリは別の場所に配置される。

リモートデスクトップ

Azure SDK 1.6以降では発行時のウィザードでロールへのリモートデスクトップ接続の設定を行えるが、ここで「自動」を選択しないと、なぜかリモートデスクトップ接続もWeb配置もできなくなることがある(体験談)。前者はロールの再起動でなぜかできるようになったが、後者はリモートデスクトップが可能になった状態でもなぜかできなかった……。

あと、リモートデスクトップについてはWindows以外のクライアントもあるが、接続にウィザードで作成した証明書が必要なので、発行に用いたWindows環境以外から接続したい場合は証明書関係の設定が必要。ということでMacやLinuxから接続できるかは不明。

Emacs 23.2導入

 今までWindows環境での物書きにはNTEmacs JPプロジェクトがリリースしている<a href=https://sourceforge.jp/projects/ntemacsjp/releases/“>Emacs 22ベースのWindows向けバイナリを使っていたわけですが、最新安定版であるEmacs 23系ではマルチバイト文字の扱いを含めた色々な改善が加わっているとのことで、移行してみることに。

 NTEmacs JPプロジェクトではEmacs 23ベースのWindows向けバイナリをリリースしていないのですが、Gnupackというプロジェクトで日本語関連(というかIME)のパッチが適用されたEmacs 23.2のバイナリが公開されているので、そちらを利用。プロジェクトページはこちらNTEmacs 23.2はこちらからダウンロード可能。

 フォントなどの基本的な設定方法はEmacs 22系と同じ模様で、たとえばMSゴシックを使うには下記のような設定を.emacsに記述すればOK。

; 「msgochic」という名前で新たなフォントセットを定義
; 英字フォントとしてMS ゴシック、14ポイントを使用
(create-fontset-from-ascii-font
 "-outline-MS ゴシック-normal-r-normal-normal-14-*-*-*-*-*-iso8859-1"
 nil "msgochic")

; myfont-msgochicの日本語フォントとしてメイリオを使用
(set-fontset-font "fontset-msgochic"
                  'japanese-jisx0208
				  '("MS ゴシック" . "jisx0208-sjis"))

; myfont-msgochicのカタカナフォントとしてメイリオを使用
(set-fontset-font "fontset-msgochic"
                  'katakana-jisx0201
                  '("MS ゴシック" . "jisx0201-katakana"))

; 定義したフォントセットを登録
(add-to-list 'default-frame-alist
			 '(font . "fontset-msgochic"))

 あと、とりえあず様子見とのことでmule-ucs関係はすべて外してみましたが、今のところ問題は見られません。コピペで全角チルダ(~)が波ダッシュ(〜)になってしまう問題も解決されている模様。NTEmacs 22とは別のフォルダにインストールすることで共存も可能なので、ひとまずこれで様子見。

システムファイルの所有権問題でハマる on Windows Vista

 テスト用にVistaのhostsファイル(C:\Windows\System32\drivers\etc\hosts)を書き換えようとしたんだけど、このファイルはシステムファイルなので、当然一般ユーザー権限では書き換えられない。そこで、管理者権限でコマンドプロンプトを実行し、vimで編集したわけなんだが、このときvimは「編集後のファイルを別のファイルに保存→オリジナルのファイルに置き換え」というステップを踏んでくれていたためにファイルのパーミッションが変わってしまうという問題発生。

 編集後のファイルは、自分のみ「フルコントロール」、「Everyone」と「None」にファイル属性の読み取りのみ許可、というパーミッションになっていて、そのためシステムがhostsファイルにアクセスできなくなり、hostsに何を書いてもそれが適用されない状況に。結局、問題がパーミッションにあることに気付いたのは10数分後……。

 公式には「hostsファイルの編集には管理者権限で起動したメモ帳を使え」と言われているのですが、他のエディタを使うとこういうトラブルになるよ、ということで。しかし、「SYSTEM」のパーミッションがないと本当にシステムもアクセスできないのね>NTFSのパーミッション仕様。

MSys&MinGWをインストール

  MinGW でのビルドを前提とされたツールをCygwin上でビルドするのが面倒だったので全力で MSys とMinGWをインストールした。MSysGitも入っているので環境汚れまくり。

  SourceForge.JP のミラーからMinGW 5.1.4.exeとMSYS-1.0.11-rc-1.exeをダウンロードしてそれぞれインストール。MSYSは結構下の方(MSYS Base Systemの中)にあるので探す。

 それぞれインストール後、「C:\msys\1.0\etc\fstab.sample」を同じディレクトリに「fstab」という名前にコピー、下記のようにMinGWとActivePerlをインストールしているディレクトリに対応付ける。

c:/MinGW		/mingw
c:/Perl	/perl

 あとはスタートメニューの「MinGW」?「MSYS」?「MSYS」などからシェルを起動。gccがエラーを日本語で吐いてくれるのだがWindowsのコマンドプロンプトだと化けるのでexport LANG=Cを適宜設定。

GCC 4.4系を使う

 GCC 4.4系を使うには別途インストールが必要。「gcc-4.4.0-mingw32-notes.txt」に解説があるが、下記をMinGWのインストールディレクトリで展開すればよい。

GMP Runtime [REQUIRED]
gmp-4.2.4-mingw32-dll.tar.gz
MPFR Runtime [REQUIRED]
mpfr-2.4.1-mingw32-dll.tar.gz
POSIX Threads for Win32 Runtime [REQUIRED]
pthreads-w32-2.8.0-mingw32-dll.tar.gz
Core (C) [REQUIRED]
gcc-core-4.4.0-mingw32-bin.tar.gz、gcc-core-4.4.0-mingw32-dll.tar.gz
C++ [OPTIONAL]
gcc-c++-4.4.0-mingw32-bin.tar.gz、gcc-c++-4.4.0-mingw32-dll.tar.gz

 なお、ドキュメントにはgcc-full-4.4.0-mingw32-bin.tar.lzmaに全部入っていると書いてあるが、GMPとMPFRとPOSIX Threadは入っていなかった……(汗)。

cl.exeの主要コマンドラインオプションメモ

 最近、Visual C++をいじっているのでメモ。昔はVisual StudioでGUIでビルド設定してましたが、最近はもうmakeを使う方になれちゃったんだよね……。

  <th>
    意味
  </th>
</tr>

<tr>
  <th colspan="2">
    最適化
  </th>
</tr>

<tr>
  <td>
    /O1
  </td>
  
  <td>
    コードを最小化
  </td>
</tr>

<tr>
  <td>
    /O2
  </td>
  
  <td>
    コードを最速化
  </td>
</tr>

<tr>
  <td>
    /Ob{0|1|2}
  </td>
  
  <td>
    インライン展開方法を指定
  </td>
</tr>

<tr>
  <td>
    /Od
  </td>
  
  <td>
    最適化を禁止
  </td>
</tr>

<tr>
  <td>
    /Oi
  </td>
  
  <td>
    組み込み関数を使用
  </td>
</tr>

<tr>
  <td>
    /Ox
  </td>
  
  <td>
    最大限の最適化
  </td>
</tr>

<tr>
  <td>
    /GL
  </td>
  
  <td>
    プログラム全体の最適化を使用
  </td>
</tr>

<tr>
  <td>
    /arch:{SSE|SSE2}
  </td>
  
  <td>
    SSE/SSE2を使用
  </td>
</tr>

<tr>
  <th colspan="2">
    作成するコード
  </th>
</tr>

<tr>
  <td>
    /MD
  </td>
  
  <td>
    DLL版ランタイムライブラリを使用。/MDdとするとデバッグバージョンを作成
  </td>
</tr>

<tr>
  <td>
    /MT
  </td>
  
  <td>
    スタティック版ランタイムライブラリを使用。/MTdとするとデバッグバージョンを作成
  </td>
</tr>

<tr>
  <td>
    /LD
  </td>
  
  <td>
    DLLを作成。/LDdとするとデバッグバージョンを作成
  </td>
</tr>

<tr>
  <td>
    /Fe<ファイル名>
  </td>
  
  <td>
    出力するEXEファイル名を指定
  </td>
</tr>

<tr>
  <td>
    /Fo<ファイル名>
  </td>
  
  <td>
    objファイルを出力する
  </td>
</tr>

<tr>
  <td>
    /Zi
  </td>
  
  <td>
    デバッグ情報を生成
  </td>
</tr>

<tr>
  <th colspan="2">
    そのほか
  </th>
</tr>

<tr>
  <td>
    /D<シンボル>
  </td>
  
  <td>
    シンボルを定義(#defineと同等)。値を指定する場合は/D<シンボル>=<値>とする
  </td>
</tr>

<tr>
  <td>
    /I<パス>
  </td>
  
  <td>
    追加インクルードディレクトリを指定
  </td>
</tr>

<tr>
  <td>
    /X
  </td>
  
  <td>
    標準インクルードパスを無視
  </td>
</tr>

<tr>
  <td>
    /w
  </td>
  
  <td>
    ワーニング出力を無効にする
  </td>
</tr>

<tr>
  <td>
    /Wall
  </td>
  
  <td>
    すべてのワーニング出力を有効にする
  </td>
</tr>

<tr>
  <td>
    /link
  </td>
  
  <td>
    リンカにオプションを渡す
  </td>
</tr>
cl.exeのコマンドラインスイッチ
スイッチ
  <th>
    意味
  </th>
</tr>

<tr>
  <td>
    /DEBUG
  </td>
  
  <td>
    デバッグ情報(PDBファイル)を作成
  </td>
</tr>

<tr>
  <td>
    /DEF:<ファイル名>
  </td>
  
  <td>
    モジュール定義ファイルを指定
  </td>
</tr>

<tr>
  <td>
    /DLL
  </td>
  
  <td>
    DLLを作成
  </td>
</tr>

<tr>
  <td>
    /EXPORT:entryname[&#44;@ordinal[&#44;NONAME]][&#44;DATA]
  </td>
  
  <td>
    エクスポートする関数を指定
  </td>
</tr>

<tr>
  <td>
    /LIBPATH:<パス>
  </td>
  
  <td>
    追加のライブラリパスを指定
  </td>
</tr>

<tr>
  <td>
    /LTCG
  </td>
  
  <td>
    リンク時のコード生成を有効化。/GLを指定してコンパイルしたオブジェクトファイルのリンクに必要
  </td>
</tr>
link.exeのコマンドラインスイッチ
スイッチ

IE8のテキストエリア内テキストを外部エディタで編集

 Internet Explorer 8がかなり軽快なので、最近はFirefoxと併用している。Firefoxの場合、Google Readerを使って大量のタブを開くと結構な確率でブラウザが落ちるのだが、IE8はそれがないので、最近はGoogle ReaderはIE8で見るようにしているのが大きい。

 ただ、問題なのがテキスト編集。テキストエリアでそこそこの長さのテキストを入力/編集するのはしんどいので、Firefoxでは「 It’s all text 」という拡張を使っている。これをインストールするとテキストエリアの周辺に「編集」ボタンが表示され、これをクリックするとテキストエディタが起動してそこでテキスト編集ができて非常に便利である。

 これに相当するものがIEにもないかと探したところ、 AreaEditor というものがそれに当たるようだ。ということで早速インストールしたところ、IE8でも利用できた。ただ、AreaEditorではテキストをエディタで開いたあと、1回目に保存したものしか反映されず、2回、3回と変更→上書き保存を繰り返した場合は変更内容がブラウザ側に反映されないようだ。自分は1パラグラフを入力したら手癖により勝手にファイルを上書き保存するため、この仕様だととても使いづらい。結局、最後にコピー&ペーストでテキストを流し込んだりしている(汗)。そのほかにもAreaEditorはIt’s all textと比べると劣っているところが多々見られるのが残念。自分で作れということか?

図:AreaEditorの設定画面。Webブラウザからは起動できず、スタートメニューから起動しなければいけないのも面倒くさい