Monthly Archives: 10月 2014

2014-10-07 ,

Windows InstallerがKB2918614で遅くなった件

InstallShieldで作ったインストーラが信じられないくらい遅いので調べたところ、どうもセキュリティ更新プログラム KB2918614 に問題があるようなのです。

作ったインストーラはDVD-ROMから4GBくらいインストールするのですが、インストールを開始してすぐ、準備段階でプログレスバーが止まったまま10分程度まったく動かなくなります。それを過ぎるとファイルのコピーが始まり、最終的には正常にインストールが完了するのですが、以前はこんなこと起きなかったのにどうなっているんだろうと思い色々調べてみました。

タスクマネージャでmsiexec.exe(.msiを実際に実行するプロセス)のI/O読み取りバイト数を見てみると、止まっている間でもガンガン何かを読み込んでいることが分かります。4GBくらい読み込んだところでプログレスバーが動き始めコピーをしていると表示があり、また4GBくらい読み込むとインストールが終了します。インストールするファイル(もちろん無圧縮、アーカイブ無し)を計2回も読み込んでいるようなのです。そりゃ遅いはずです。それもそのうち最初の1回はプログレスバーが全く動きません。DVD-ROMから4GB読み込むのに10分くらいかかりますから、その間止まっているように見えるわけです。

試しにHDDにインストーラをコピーしてから実行したり、新しくWiX Toolsetでmsiを作ってみたりしましたが、やはりWindows Installerを使う限り二回読み込むことには変わりないようです。

同じインストーラの作り方で以前はこのようなことは起きませんでした。なので以前作ったインストーラを調べてみたのですが、今実行するととてつもなく遅い! 同じ問題が起きています。これはOS側、Windows Installer側に何かあったのでは無いか、と思いました。

Webで色々調べているとKB2918614という単語を見かけました。

【至急】KB2918614適用後、アプリケーションの画像データのインストールに非常に時間がかかるようになった - マイクロソフト コミュニティ

一般コンシューマ向けパッケージソフト製品開発を行っている企業で、開発者をしております。

8/13のWindows UpdateでKB2918614適用後、以下のようなコンポーネントのインストールに非常に時間がかかるようになってしまいました。

環境によっては数時間同じ画面で停止しているという状況になりますので、エンドユーザーから見るとインストールが停止したような形になります。

おそらくは問い合わせが多数寄せられると思いますので、まずはユーザーへの対応策を検討する必要があります。

..略…

膨大なロットを市場に出荷しており、発売直後に第1の売り上げのピークを記録するというソフトウェア製品の性格上、

対応次第ではかなりの損害が出てしまいかねない状況ですので、大至急ご確認をお願いいたします。

なかなか生々しいですね……。

KB2918614MS14-049の脆弱性を解決するためのセキュリティ更新プログラムのようです。出たのは今年の8月。

筆まめやウィルスバスターなど、いくつかの製品のサポート情報では対策としてKB2918614のアンインストールを挙げています。

その他Twitterを検索してみると8月にKB2918614が出て以降、様々なアプリケーションがインストール不能に陥っているようですね。

試しにKB2918614をアンインストールして再度インストーラの動きを確認してみました。するとすぐにコピーが始まりますし、msiexec.exeは1回分(4GB)しか読み込みません。再度KB2918614を入れると遅くなります。KB2918614の有無で動作が変わるのは間違いないようです。

msiexec /L*v log.txt /i hoge.msi としてログを取ってみましたが、KB2918614が入っているときは止まって見える間に SECREPAIR: CryptAcquireContext succeeded のようにSECREPAIRという単語を含むログが出力されます。KB2918614が入っていないときは出力されません。セキュリティ上の確認処理か何かをしているのでしょうか。

結局対策としては、

  1. エラーが出ない限り待てばインストールは完了する
  2. 待てない場合はKB2918614をアンインストールするか手動でインストール
  3. エラーが出る場合もKB2918614をアンインストールするか手動でインストール

ということですね。

セキュリティ更新プログラムなのでアンインストールするとセキュリティ上の問題MS14-049が残ってしまうので注意が必要だと思います。

KB2918614で挙げられている既知の問題について、マイクロソフトは現在調査中としています。「遅い」というのは既知の問題として挙げられていませんが、近いうちに修正されることを祈るしか無いでしょう。修正されなければWindows Installerは死んだも同然でしょうね。プログレスバーが数十分も止まったままになるインストーラなんて使い物になりません。msiではない古き良きスクリプト駆動型インストーラに戻るしかありません。

2014-10-01 , ,

Org2blogの設定

Org2blogの設定をしました。

下のelispで次のようなことをします。

  • M-x blog-newで投稿用バッファを作成します。
  • 投稿用バッファでC-x C-sしたときにファイル名を自動設定します。まだファイル名が決まっていないときに限り、ブログ用ディレクトリ設定や記事中のDATE、PERMALINK、TITLEからファイル名を生成し、ファイル名を設定するか尋ねます。
  • ブログ用ディレクトリ下のorgファイルを開くとき、org2blog/wp-modeマイナーモードを有効にします。
  • .org2blog.orgの保存先をブログ用ディレクトリにします。
  • ブログのテンプレートにPERMALINKを入れます。
;; ブログorgファイルのセーブ先
(setq my-blog-directory "~/org/blog/")

;; 投稿設定
(setq org2blog/wp-blog-alist
      `(("example"
         :url "http://example.jp/xmlrpc.php"
         :username "example-user"
         :default-title "NewEntry"
         :default-categories nil ;カテゴリーはデフォルト
         :track-posts (,(concat my-blog-directory ".org2blog.org") "Posts") ;.org2blogの保存先を変える
)))

(setq org2blog/wp-default-categories '()) ;カテゴリーは使わないので空

(setq org2blog/wp-buffer-template
      "#+DATE: %s
#+OPTIONS: toc:nil num:nil todo:nil pri:nil tags:nil ^:nil
#+CATEGORY: %s
#+TAGS: 
#+PERMALINK: 
#+TITLE: %s
\n") ;必ずPERMALINKを入れる


;; セーブ時のファイル名生成

(defun my-blog-get-buffer-post-file-name ()
  "現在のバッファのファイル名を作成します。directory/YYYY-MM-DD-permalink_or_title.orgの形式です。directoryはmy-blog-directory変数を使います。"
  (let* ((date (org2blog/wp-get-option "DATE"))
         (title (org2blog/wp-get-option "TITLE"))
         (permalink (org2blog/wp-get-option "PERMALINK"))
         (filename-date (format-time-string "%Y-%m-%d"
                                            (if date (apply #'encode-time (org-parse-time-string date))
                                              (current-time)))))
    (concat my-blog-directory filename-date "-" (if (> (length permalink) 0) permalink title) ".org")))

(defun my-blog-set-buffer-file-name ()
  "デフォルトのファイル名をバッファに設定します。"
  (if (not (buffer-file-name))
      (let ((filename (my-blog-get-buffer-post-file-name)))
        (if (y-or-n-p (format "set filename to '%s'?" filename))
            (set-visited-file-name filename)))))

(defun my-blog-save ()
  "バッファをセーブします。まだバッファにファイル名が設定されていないとき、セーブする前にデフォルトのファイル名を設定するかどうかを訪ねます。"
  (interactive)
  (my-blog-set-buffer-file-name)
  (save-buffer))

(defun blog-new ()
  "ブログの新しいエントリーを作成します。"
  (interactive)
  (org2blog/wp-new-entry)
  (local-set-key "\C-x\C-s" 'my-blog-save))

;; ブログディレクトリ下のファイルを開くときはorg2blogを有効にする。
(add-hook
 'org-mode-hook
 (lambda ()
   (if (and (buffer-file-name)
            (string-prefix-p (expand-file-name my-blog-directory) (buffer-file-name)))
       (org2blog/wp-mode t))))

最初はorg2blog/wp-kill-buffer-hookをdefadviceで書き換えたりしたのですが、いくつかのケースでうまく動かなかったためやめておきました。元々少し不具合があるみたいですし、ちゃんとやるならもっと色々手を入れないとダメそう。