2015/06/19

OpenDKIM の評価は、ヘッダFrom(≠ envelope-From)に対して実施される

 SendMail + OpenDKIM の構築をしていて、検証作業でハマりました。

教訓:
OpenDKIM の評価は、ヘッダFrom(≠ envelope-From)に対して実施される

 設定が終わって、検証しようと telnet でポート 25 へ接続して手作業でメール送信したのですが、何故か全く署名されない。
 ???となりつつ、散々あっちを弄りこっちを弄りした後、ふと思い立って通常のローカルメーラから送信したところ…此は如何に、あっさり署名が付加されました。

 カラクリは恐らくこうかと。
 telnet にて手作業で送信した場合、明示的に記述しない限りヘッダ From は付加されません(まぁ当然です)。その場合、次の MTA へ配送される前に、MTA により envelope-From を使ってヘッダ From が補完されます。その為、通常は意識されません。
 しかし、OpenDKIM の処理(というか SendMail INPUT_MAIL_FILTER の処理)は、このヘッダ From が補完前におこなわれるようなのです。
 結果、空のヘッダ From が評価され、「署名対象外メール」と判定されていたのだと考えています。

 その後、ヘッダ From が補完され、そのメールが届いていたので「ちゃんと対象の From だよなぁ…」と気がつくのが遅れました。
 OpenDKIM の評価はヘッダ From に対して実施される(これもまぁ当然です)、と明示的に認識していれば、もう少し早く気がつくことができたと思うのですが…。

2015/06/07

Excel データの改行コードを変換

 謎仕様なのですが、Microsoft Excel のセル内改行コードは LF(0x0A)だったりします。
 一方、Windows OS 標準の改行コードは、CR+LF(0x0D0A)です。

 この辺りの相違にはきっと歴史的な経緯があるのでしょうが、具体的な事情は寡聞にして謎のままです。一説によると、Excel は当初 Mac 用(Mac の改行コードは LF)のアプリケーションとして開発された為だそうですが、真偽の程は?
 確かなことは、この改行コードの相違が時としてトラブルの原因になることです。

 Excel でデータを一括で入力して、それを他のシステムで利用するといったシーンで、改行コードの相違を意識せずに処理してしまうと、利用先システムで改行されずにベッタリ一行で表示されてしまったりします。
 なので、そういう場合どこかで改行コードを変換する必要があります。

 いろいろな段階で、いろいろな手法があり、「真面目」なやり方としたら Excel 上で VBScript を使ったり、データベース上で SQL を使ったりとかになるかと思います。
 しかし、今回の方法はズバリ、相当にズボラな方法です。

 必要な物は、テキストエディタ。
 ただし、改行コードの自動変換をしてくれないとダメですので、「メモ帳」では NG です(ただし、これはこれで使い様が…後述)。
 動作確認したのは「秀丸エディタ」ですが、「サクラエディタ」とかも同様に処理してくれるようです。

 手順は以下のとおり。
 ちなみに、Excel は 2010 ですが、他のバージョンでも問題ないものと思います。

  1. Excel: 適宜範囲選択して Ctrl+C でコピー
  2. テキストエディタ: Ctrl+V で貼り付け
  3. テキストエディタ:  [名前を付けて保存] (選択できるようなら、改行コード CR+LF を選択)
  4. テキストエディタ: 保存したファイルを開き直す
  5. テキストエディタ: 貼り付けた範囲を選択して Ctrl+C でコピー
  6. Excel: Ctrl+V で貼り付け

 以上で、見た目は変わりませんが、Excel 上のデータの改行コードは CR+LF になっています。
 ただし、後から追加した改行については LF になりますのでご注意を。

 ちゃんと改行コードが変換されたかの確認方法ですが、これは「メモ帳」を使ってズボラします。
 「メモ帳」は LF のみの改行に対応していないので、貼り付けたデータが改行されていなければ LF ですし、改行されていれば CR+LF と判断できます。
 試しに、手順1 のデータを(複数セルだと判りにくいので 1セルだけ)貼り付ければ改行されないでしょうし、手順6 のデータを貼り付ければ改行されるはずです。

 なお、手順 3, 4 は省いても多分問題無いと思います。少なくとも、「秀丸エディタ」の場合は問題ありません。
 ただ、保存するときに機種依存文字がチェックされますので(これも「秀丸エディタ」の場合は…ですが)、自分は一手間入れるようにしています。

Windows の悪仕様 [F1] キーを無効化

 [F1] キーで「ヘルプ」が開くのは Windows の悪仕様である…というのは、衆目一致するところだと思うのですが、バージョンを重ねても代々踏襲され続けていますよね。
 多分、Windows 10 でも引継がれるんでないでしょうか。

 これ、[F2] キーを使用する際によく押し間違えるんですよ。[F2] キーは、ファイル名の変更や、Excel セル値の変更で多用するキーです。
 押し間違える都度、「ヘルプ」が開くわけです。しかも、マシンスペックによっては開くまでに相応の時間を要する上、その間操作できなくなり非常にストレスフルです。

 そこで、OS のスキャンコードマップを変更して、[F1] キーを無効にしてしまいます。
 これ、かれこれ 2、3年ほど前から設定していますが、意図せず開く「ヘルプ」に煩わされることもなくなり、非常に快適です。

 この方法の問題点としては、OS レベルで完全にキーを無効にしてしまうので、[F1] キーが全く使えなくなるということがあります。
 とはいえ幸か不幸か、ほとんどのアプリケーションで [F1] キーは「ヘルプ」に割当てられているため、今のところ困ったことはありません。ただ、一部特殊なアプリケーション(キーボードをフルに使うゲームとか)では問題が発生するかもしれません。まぁ私の場合は、ゲームをあまりしない人間なので。

 さて、設定方法ですが、レジストリを変更します。
 「『レジストリ』って何?」という方は、とんでもないところを編集してしまうとシステムに致命的なダメージを与えかねませんので、やらないほうが無難だと思います。なので、エディタの起ち上げ方等、作業の具体的手順については触れません。

 ターゲットのレジストリキーは、以下になります。

OS 全体に適用する場合:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]

ログオン中のユーザにのみ適用する場合:
[HKEY_CURRENT_USER\KeyBoard Layout]

 いずれかのキーの下へ、以下の値を追加します。

名前: Scancode Map
種類: バイナリ値(REG_BINARY)

 で、この値に入れるデータは次のとおり。

00 00 00 00 00 00 00 00 02 00 00 00 00 00 3B 00 00 00 00 00


 これの意味するところは、以下のようになります。

00 00 00 00 :ヘッダ(固定)
00 00 00 00 :ヘッダ(固定)
02 00 00 00 :設定の数(1) + 1(フッタ分)
00 00 3B 00 :無効(0x0000) ← F1(0x003B)
00 00 00 00 :フッタ(固定)

 なので、別に「無効(0x0000)」としなくても、他のキーに割り当てることも可能です。
 コードの一覧は、以下が参考になります。

Keyboard Scan Code Specification - Microsoft
http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc

 なお、レジストリ値に組込む際は、リトルエンディアンになることに留意してください。例えば、[右Alt] キーはコード 0xE038 ですが、レジストリ値へは 38 E0 となります。
 コードは左右入換て使わないといけない、と覚えておけば良いかと思います。

 ご参考まで、私の設定値を上げておきます。

00 00 00 00 :ヘッダ(固定)
00 00 00 00 :ヘッダ(固定)
04 00 00 00 :設定の数(3) + 1(フッタ分)
5C E0 38 E0 :右Windows(0xE05C) ← 右Alt(0xE038)
5D E0 1D E0 :Application(0xE05D) ← 右Ctrl(0xE01D)
00 00 3B 00 :無効(0x0000) ← F1(0x003B)
00 00 00 00 :フッタ(固定)

2015/06/05

Web Form での IME制御を無効化

 Web Form で自動的に IME(日本語変換)が on/off される、あの制御の話です。

 あれ、正直非常に迷惑です。
 多くの人がそうだと思うんですが、勝手に制御されずとも半ば無意識に左手が動いて IME の on/off を切り替えるんですよね。「あ、ここは日本語で入力しないと(無意識に IME on)」、「ここは英文字入力ね(無意識に IME off)」といった具合です(厳密に言えば、自分の場合は日本語入力が終わったら、直ちに IME を off にするんですが)。
 なので、勝手に IME の制御をされると、言わずもがなですが途端におかしな事になってしまいます。

 そこで、この IME の自動制御を、強制的に無効化します。

Internet Explorer


 Internet Explorer 8 以降であれば、以下の方法で無効化できます(それより旧い Internet Explorer でもできるかもしれませんが、手元にないもので)。

 まず、テキストエディタ(メモ帳とか)で以下のファイルを作り、拡張子「.css」(ファイル名は何でもいいです)で適当な場所へ配置します。
 自分でしたら、%APPDATA%\Microsoft\Internet Explorer 辺りに配置しますが、間違って消さないような場所であれば、どこでも結構です。

---------- .css ココから
* {
  ime-mode: auto !important;
}
---------- .css ココまで

 そして、Internet Explorer の [ツール]-[インターネット オプション]-[全般]-[ユーザー補助] と開いて、[自分のスタイル シートでドキュメントの書式を設定する] チェックボックスを on にします。[参照] ボタンが有効になるので、ボタンを押して先に作成した「.css」ファイルを指定します。
 あとは [OK] ボタンを押していって設定ダイアログを閉じれば完了です。


 念のため、OS 再起動(おまじないです)。
 これで、IME の制御を無視してくれるようになります。

Fire Fox


 現行バージョンの FireFox(Ver. 38)であれば、以下の方法で無効化できます(それより旧いバージョンに関しては…同上)。

 Internet Explorer と同じ内容で、CSS ファイルを作ります。
 ただしファイル名は「userContent.css」とします。

 そのファイルを以下のフォルダへ配置します。
 最後の「chrome」というフォルダは、最近の FireFox であれば存在していないと思いますので、その場合は自分でディレクトリを作ってください。

%APPDATA%\Mozilla\Firefox\Profiles\英数字.default\chrome\

 以上で完了です。

 念のため、OS 再起動(同上)。
 これで、IME の制御を無視してくれるようになります。

Google Chrome


 Google Chrome の場合は、設定の必要がありません。
 IME への制御を端から無視するようになっています。いえそもそも、どう頑張っても制御することができません。

 この辺り意見が分かれるかもしれませんが、IME制御反対派としては viva Google Chrome!