2009年06月23日

プログラムを作成するときに発揮する論理(ロジカル)力について(1)

プログラムを作成する際、論理的に考えることは重要です。
論理的な思考をする場合、私は以下の3点に気をつけています。

1. 実現手順を当たり前に感じていないか?
2. スタート地点とゴールは明確か?
3. スタート地点とゴールまでの通過ポイントの通り方は最適か?

今回は1について述べます。

人間は何か作業をする時、自分の中では結構しっかりと手順を考えたりしたとしても暗黙のうちにこれは当たり前だと考え、手順から抜けてしまうことが多いです。

例えば、以下の数列があったとします。
ここで上側は左から順番に位置番号を付けているだけで、話題としている数列は下部分です。

位置 : 1 2 3 4 5 6 7
--------------------------
数列 : 9 3 8 4 2 1 5

この数列の中から数値が一番小さいものはどれでしょうか? 聞くまでもなく、6番目の位置にある1です。これを簡単だと感じた方も多いでしょう。
では、この1をどうやって見つけましたか? 多くの人は、この手順を聞くとだいたいこういうのではないのでしょうか?

「左から順に見ていき、一番小さい値が何かを見つけた」
おそらくこれに近しいことをいうのではないかと思います。

これは本当にあなたがやった手順ですか?だいたいにおいて、このように人間の能力で実施してしまうと当たり前のことが隠されてしまいます。
あなたが本当にやったことはこの手順ではないですか?

1) まず位置1を見る
2) 位置1の数列の値を見る。 9とあるので、今のところの
最小値は9だと一時的に覚える
3) 次に位置2を見る
4) 位置2の数列の値を見る。 3とあるので、今のところの
最小値は9ではなく3だと一時的に覚える
5) 次に位置3を見る
6) 位置3の数列の値を見る。 8とあるので、今のところの
最小値はまだ3のままだと一時的に覚える
(省略)
11) 次に位置6を見る
12) 位置6の数列の値を見る。 1とあるので、今のところの
最小値は2ではなく1だと一時的に覚える
13) 次に位置7を見る
14) 位置7の数列の値を見る。 5とあるので、今のところの
最小値はまだ1のままだと一時的に覚える
15) 次を見てみると、位置8はないので、一時的に
覚えていた1が最小値だと分かる

これは当然、あなたは「当たり前だよ」と言うかもしれません。もしくは、「そんな面倒なことまであえて言わないよ」と言うかもしれません。人間は作業を、特に慣れた作業を当たり前のことと思ってやってしまうので、そう考えるのは仕方ないのです。つまり、この行間ともいう内容を無意識にやってしまいます。
ですが、落とし穴はそこです。コンピュータはそのような行間を読めません。コンピュータは人間が暗黙でやっていることを想像することも、読むこともできません。
だからこそ、その当たり前な部分を明確にすることが求められます。

プログラムを組むには、人間がやりたいことの内容をまず考えます。
その次に、その内容はどうすれば実現できるのかを考えなくてはいけません。
その実現方式の行間が大きすぎるから、動かないプログラムになってしまうのです。

今やろうとしていることをもっと細かく考えるには特訓あるのみです。
それには、これとこれの間には何があるかを考えて答えを見つけるのではなく、考えるという行動をしなくてはいけません。

よくある議論としては、ではどこまで細かくすればいいの?というのがあります。
簡単に言えば、その閾値はありません。よって、細かければ細かいだけ洗い出せばよいのです。すると、細かすぎてこれは無駄だと感じる部分が出てきます。その無駄だと感じる部分もこの能力の一部です。
まずは見つけられるだけ見つけ、ある程度のタイミングで一度とめてみて、次にこれは細かい、ここはまだ足りないと検討し、繰り返し考える必要があります。
posted by Kiruahさん at 21:34| Comment(0) | TrackBack(0) | ノウハウ

2009年05月24日

Symantec AntiVirus Corporate EditionのLive Updateボタンについて

Symantec AntiVirus Corporate Editionを利用している企業は多いと思います。現在の最新バージョンではすでに製品名が変っているようですが、バージョン10を未だに利用しているケースもあるかと思います。
企業で使う場合、Live Updateを各ユーザ任意で行わせるのではなく、グループポリシーのように設定を強制しているケースも多いかと思います。

その場合、各ユーザがLive Updateボタンを押下できない、定時Live Updateを変更することができないとなっていると思います。
私も会社ではそのようになっていますが、会社のある事情によってこのポリシーが変更され、各ユーザでLive Updateするようになりましたが、一部適用されないケースがありました。

そういう場合は、以下のレジストリキーを変更することで、ボタンを押下することができるかもしれません。
(もしかしたら、このキーに値が設定されていない/利用されていないかもしれません。その際はご利用できませんので注意ください。)

レジストリのキー : HKEY_LOCAL_MACHINE\SOFTWARE\Intel\LANDesk\VirusProtect6\CurrentVersion\PatternManager
(なぜか IntelのLANDeskにありました)

値名 : LockUpdatePattern を DWORD値で0にすることで、Live Updateボタンが押下できるようになります。
値名 : LockUpdatePatternScheduling をDWORD値で0にすることで、定時Live Updateの設定が変更できるようになります。


レジストリを直接変更するので、システムへの影響があるかもしれません。設定変更は各ユーザの自己責任とさせてください。
posted by Kiruahさん at 08:25| Comment(0) | TrackBack(0) | ノウハウ

2008年05月17日

Javaでbatファイルを実行すると、プログラムが止まってしまう

あまり現象の再現性が高くないため、どういうケースで発生するかは細かく調べ切れていませんが、Windows xp・JDK5・JBoss・Log4j上でbatファイルを実行すると、batファイルの実行途中でJavaプログラムが停止してしまいます。batファイルの実行は、古い方法ですが、Runtime.exec()を利用しています。また、waitForを利用している場合、batファイルが2行以上記述されている場合は、必ず停止問題が発生していました。

その時、私は以下の2点をbatファイルに入れることで対応しました。

1. 先頭に @echo off を入れる
2. 最後に exit を入れる

通常、コマンドプロンプトでbatファイルを実行すると、@echo offなどがないと、画面にbatのコマンドが表示されます。batを実行するとバックグラウンドでcmd.exeが実行されており、また画面に表示されるコマンドは標準出力に出力されているのではないかと推測しています。
また、Runtime.exec()では標準入出力を制御できます。

これらを踏まえて、おそらくですが、上記の環境ではもしかして、Javaがbatの標準出力バッファのフラッシュを待っている状態になってしまっていたのかもしれません。
標準出力にたまりすぎたバッファを抜いてあげるとうまくいったかもしれませんね。

waitForを利用すると、どうしても終了を待つため、同期してしまいます。非同期的に実行させたい場合は、waitForを入れることはできません。その場合、Webサイトを調べてみると、メモリリークが発生(ファイルディスクリプションが枯渇する)というような情報がありましたが、少なくとも私の環境ではそのようなことは発生しませんでした。
JDKによって異なるか、マシンが高速になってガベージコレクションがうまく機能しているのかは分かりませんが、waitForして、標準入出力をclose()する必要はなさそうです。

もちろん、batファイルを実行してすぐにJavaプログラムが停止する環境ですと、batを実行しきる前にJavaプログラムがbatのプロセスを停止させてしまうみたいですので、適度なウェイトは必要そうです。

今回のようなケースはレアかもしれませんが、開発中のシステムでJavaからbatファイルを実行する場合は、みなさんも注意してみてください。
posted by Kiruahさん at 17:08| Comment(0) | TrackBack(0) | ノウハウ

2008年04月30日

ウィルス対策ソフトと仮想化ソフトウェアの相性について

私はウィルス対策ソフトにNOD32を利用しています(ちなみにVistaです)。このウィルス対策ソフトウェアは他のソフトウェアよりも、利用していると軽く、他のソフトウェアに対してあまり干渉しないように感じます。
また、統合セキュリティ製品は、私にとっては使いにくいと感じさせるGUIを搭載した不要な機能がたくさん入っています。
NOD32ならば、純粋にウィルス対策と簡単なスパイウェア対策のみが実現でき、パーソナルファイアウォールは別途好きなものを影響なしに利用できます。

今回、家のPCに久しぶりにVMwareを入れてみました。VMwareはPCを仮想化(昔はエミュレータと呼んでいましたね)ソフトウェアです。

VMwareを入れて、次の日PCを再起動すると、なんと、起動途中でピポッといって再起動を繰り返すではありませんか。

朝、出勤前というのもあり、あまり詳しく調べませんでしたが、仮想化ソフトウェアは独自にネットワークカードを追加し、その初期化中にNOD32のパターンファイル更新が重なると、再起動してしまうようです。どうして再起動にいたるのかまでは各ソフトウェアのログにも出ておらず、調べていませんので分かりませんが、これからネットワークカードを追加するタイプの仮想化ソフトウェアを導入する方は注意してみてください。

私が実施した対策は簡単で、セーフモードで一度起動し、VMware関連の全サービスについて、スタートアップの種類を自動(遅延開始)にして、とりあえずVMwareの全サービスの初期化を遅らせました。
どれほど遅らせるかの指定もできず、何を持って起動するのか分かりませんが、とりあえずこれで再起動はなくなりました。

根本的な原因と対策を時間の余裕があるときにでもできればと思いますが、現在動いていますので、それはまた動かなくなったときにまわしたいと思います。

posted by Kiruahさん at 23:30| Comment(0) | TrackBack(0) | ノウハウ

2008年04月06日

デグレードを予防したい

ソフトウェアを開発したり、または修正する場合、常に開発者達はソフトウェアがデグレードしていないか恐れているのではないかと思います。
私もその一人です。私は自分の作業がデグレードを起こす要因になっていないかと心配です。

デグレード(通称、デグレ)とは、ソフトウェアのバージョンアップを行った結果、これまで動作していた機能が予期せず動作しなくなってしまう不具合のことを言います。動作していた機能をバージョンアップ後でも動作してくれないと困るにもかかわらず、動かなくなってしまうという点が問題です。

分かりやすく、アップグレード、ダウングレード、デグレードの違いを簡単に説明します。
アップグレードとは、ソフトウェアのバージョンがあがり、機能が増えることになります。つまり、バージョンがあがります。Windowsが2000から2003になったようなものです。
ダウングレードとは、新しいバージョンよりも古いバージョンのほうが好ましいなどの理由により、古いバージョンに戻すことを言います。よって、Windowsの2003を入れてみたけど、使いにくいから2000に戻す状態を言います。
ここで、例えばWindows2000を使っていて、WindowsUpdateによりパッチを導入して機能強化を図ったとします。よって、この場合、導入が成功すればアップグレードといえます。ですが、導入した結果、Windowsが起動しないなどの問題が発生すると、デグレードになります。
若干説明としては間違っている・分かりにくいかもしれませんが、簡単に言えば上記のようになります。

通常は、正しく設計されたシステムで、正しく管理されている場合には、デグレードは発生しにくくなります。
デグレードの要因はいくつかあります。主な例としては、以下のものがあります。

1. 数種類のソースを同時にバージョンアップしなくてはいけなかったのに、1つバージョンアップし忘れてしまった場合
2. バグが残っているバージョンにソースを戻してしまった場合
3. テスト目的等で一時的に修正したソースを導入してしまった場合

このどれも、実は開発者、テスト実施者、確認・管理者のどれか2つ以上が同一人物の場合に発生する傾向があります。
よって、この3つの担当はそれぞれ異なる人が割り振られることが理想です。また、それぞれの担当のコンピュータを別にするべきでしょう。
ですが、要員をさけないプロジェクトも多く、全てを一人で行うケースも多いと思います。要員が多くても、開発者とテスト実施者は同一人物のケースが多いのも現実です。
そして、確実にデグレードを予防するにはどうすればよいかというのが、誰もが悩む課題です。
ですが、私の知る限り、可能な限り発生しないようにすることは出来ても、絶対に発生しないという状況を作ることは不可能だと思います。

それでも、発生しにくい状況を作る方法として、いくつか検討してみたいと思います。このどれか1つでもあれば効果はありそうですが、複数を入れることでより効果の高い予防をできるかもしれません。

A. ソースコードのロック保持者を置く
通常バージョン管理システムではファイルにロックをかけることができます。そのロックを自分がかけるのではなく、まずロック管理者が全て持ちます。そして開発者は、自分が修正に必要なファイルのみロック管理者に依頼し、ロックを解除してもらいます。
これによって、たとえテストで修正したファイルが他にあっても、不正にコミットされてしまうことを回避できます。
この場合、開発者・テスト者・導入者が同一人物でも、もう一人いれば不正なソースが導入されることを回避できます。

B. 開発用、テスト・導入用にプロジェクトやワークスペースを分けてしまう
開発用は更新とコミットを行いますが、テスト・導入用は更新しかしません。テスト・導入用は設定ファイルの変更は最低限のもののみ許可します。ただし、テスト実施後は元に戻すようにします。
これによって、テスト時に不正なソースを利用してテストするという状態や、未テストのソースコードが導入されてしまうことを防ぐことが出来ます。

C. 開発用プロジェクトやワークスペースを、開発に伴う修正用とコミット用に分けてしまう
これは、Aのロック保持者を確保できない場合に検討します。
コミット用にコミットしたいファイルをコピーすることで、意図していないソースがコミットされることを防ぎます。
ただし、この方法は全部を一括コピーするような手間を惜しんでしまう方には向きません。

D. 複数のリポジトリを利用する
リポジトリに複数のステージが存在し、開発が終了した段階でコミット、テスト後に異なるリポジトリにコミットするようにします。
これによって、テスト後のリポジトリが不正に汚染されることはありません。

E. 分散型バージョン管理システムを利用する
Dの別案です。本来の使い方とは異なるかもしれませんが、リポジトリを各開発者のローカル環境に用意し、まずはそこにコミットするようにします。


どの方法もテストが足りない場合は、結局デグレが発生します。
結局は人に依存する部分を排除することは難しいかもしれません。
ただ、経験的に言えることは、デグレを頻繁に行う人はテストケースの洗い出しが苦手なことが多いように感じます。
逆にテストケースの洗い出しが上手な人は、デグレを起こしにくいように感じます。
あくまで経験則ですが。


私はといえば、私自身も簡単なミスをしたことがあります。
ですが、上記の言い分自体が危険でして、簡単なミスでもデグレードは起きますし、ミスは簡単でもその後が実は大問題になっていたかもしれません。
笑って済ませられる状況が幸せで、お客様のシステムにもしダメージを与えてしまえば始末書では済みません。
金銭的以上に、ソフトウェア開発における管理能力等を疑われてしまい、今後お仕事が来なくなるケースも想定されます。
私自身に言い聞かせますが、ただ面倒だ、昔からのやり方で今まで問題は出ていないというレベルで何も対策を採らないのではなく、積極的にいかにしてデグレードを予防していくかを、今後も検討していきたいと思います。
お金をもらって働いている以上、プロだという意識を持たなければならないと思います。プロだったらどうあるべきか、そこも踏まえて、より有効な予防策を見出せていないので、まだまだ私は未熟だと反省しています。
posted by Kiruahさん at 02:14| Comment(0) | TrackBack(0) | ノウハウ

2008年03月22日

分からなくなった時に読む変数の考え方

プログラミング言語の本を読んでいると、変数とは箱であるという説明がよく書かれます。変数とは、数学の変数と同じように値を保持する記号です。

数学で、
x = 10
とあれば、xは変数です。このxにはいろいろな数字が入り、上記の式ではxに10を代入しています。プログラムでも値をこの変数という値を格納する入れ物を利用して、計算します。

こう考えると、確かに"箱"というイメージは合っています。

ここでは、"箱"ではなく、違った面から少し説明してみたいと思います。特にC言語のポインタが分からなくなったときに、是非読み返してみて欲しいです。よって、初心者向けには書いていません。


コンピュータ上で動作するプログラムやソフトウェアは全て、コンピュータに積まれているメモリにデータを一時的に格納しています。
よって、プログラムやソフトウェアはメモリなしでは動作せず、計算するにはメモリにデータを配置します。

メモリとは、名前のとおりプログラムから見ればまさに"メモ帳"なのです。英語でメモリは、memoryです。メモはmemoということで、名前も似ています。memは元々記憶する、思い出すという意味がある語幹になります。

このコンピュータのメモ帳は、お店で売っているような小さなメモ帳です。1ページにたったの1バイト、つまり2進数で8桁の数値しか書き込むことができません。10進数では0から255までの値しか書き込めません。 ※ 書き込むときは鉛筆を利用してくださいね。
つまり、1ページのサイズが1バイトになります。

メモ帳は何ページも書き込めるように売られています。ページ数が多いほうがたくさん値を書き込めます。10億ページあれば、10億個1バイトの値を書き込めることになります。
お店で1GBのメモリとありますが、1Gとはおおよそ10億を意味します。つまり10億バイト分値を記憶できます。つまり、1GBのようにメモリの大きさとメモ帳のページ数は同じ考え方ができます。
10億ページとは分厚いメモ帳ですね。ここではそれでは大きすぎるので500ページが最大ということにしましょう。

500ページもあるのですから、つまり1ページ目、2ページ目と先頭からページ番号を振ることができます。メモ帳でいうページ番号とは、メモリでいう番地(アドレス)にあたります。メモリにも500Bが最大容量であれば、500個分ページ番号に当たる番地があります。

普通はメモ帳は先頭から使いますが、コンピュータは空いていれば好き勝手にいろいろなページから使い始めます。電話応対で急いでいると、先頭からページを探せず、適当に開けたページが何も書かれていなければそこに書き込んでしまうのと同じですね。
そのページ番号が30だったとします。これから30ページに書き込むためにメモ帳を開いて、30ページ目に書き込む準備をすることが、プログラムでの変数宣言になります。ですが、一度30ページ目に書き込むと、次にメモ帳を開いたときに、目印がないので分からなくなってしまいます。特に、このメモ帳は数値でしかも1バイトしか書き込めません。名前を付けないと分からなくなります。メモ帳に付箋をつけて、名前を書いてあげると、変数宣言でそのページに変数名をつけたことになります。例えば30ページ目には、xという名前をつけましょう。

そこに値を書き込みます。例えば30ページ目に10という値を書き込んだとします。その行動はプログラムでは、30ページ目に10という値を代入したことになります。

さて、ここで50ページ目に付箋でyと付けられたとします。これはつまり、変数yがメモリ上の50番地を利用しますよと変数宣言されたことになります。
ここで、変数xの値を変数yに代入することを考えましょう。このとき、あなたはまず付箋xを探して30ページを開きます。そこに10と書いてあるのでそれを覚えます。次に付箋yを探して50ページを開きます。そこに10と書き込みます。

このとき、30ページの内容は消えますか?消しゴムで消していませんから消えませんよね。よって、変数xから変数yへの代入では、代入元の変数xの値は消えません。
これが箱という説明では、中身が移動するので消えてしまいそうですね。

※ 実際には、何ページ目に書くかというのは、コンピュータが勝手に決めてしまいます。プログラマが変数xを作るとコンピュータが例えば30ページ目を勝手に用意し、そこに付箋xを貼ってくれるのです。なので、プログラムではメモリの番地はあまり意識しなくても変数xの値を利用できます。

メモ帳では1ページしか使えないかというと、足りなくなったら次のページに連続して書き込みます。1ページに書ける値は255までです。256以上はどうするかというと、2ページ目を利用します。
1ページと2ページを連続して並べると、2進数の桁が16桁になったように見えます。2進数で16桁は、10進数で0から65535まで書き込めます。こうして何ページ使えば値を記憶するのに足りるのかを考えなくてはいけません。そして、何ページを使うかを決定するのが変数の型になります。
C言語では、char xとすれば変数xは1バイト、short xとすれば2バイト、long xとすれば4バイト使います。これはつまりメモ帳では、char xとはメモ帳で1ページあれば事足りる、short xとは2ページあれば事足りる、long xとは4ページあれば事足りるという事です。
よって、2ページで足りると思っていたのに、65535を超えるとオーバーフローとなってしまいます。
また、メモ帳は1ページ単位で使われてしまうため、2ページ目の1桁しか使わなくても、1ページまるまる確保されてしまいます。

プログラムの配列も同じ考え方です。2ページを利用する型で10要素の配列を作れば、2ページを10個、つまり2×10ページ利用することになります。


では、ここで新しい考え方を入れましょう。
メモ帳にはページ番号があります。このページ番号はというと、これも数値ですよね。本でも目次があって、1ページ目に、"30ページ目にこういう内容が書かれていますよ"と教えてくれます。また、お客様との会議をメモを書いていて、前回こういうことを言っていたという時、それを引用するときはメモ帳のページ番号をメモします。
このように、メモ帳に"どのページ番号か?"を書いても良いとおもいませんか?
例えば、100ページ目にメモの用意をして、付箋zを貼り付けます。この付箋zのページに、付箋xのページ番号を書き込み、付箋zには"ページ番号が書かれていますよ"というマークを付けましょう。
付箋にマークを付けるのは、メモ帳には数値しかなくて、何を目的に書かれているか分からなくなってしまうからです。マークが付いているページは、別のページのページ番号が書かれていることとしましょう。
次の日、メモ帳を見たあなたはまず、付箋zの100ページ目を見ます。付箋には特別なマーク、そして30とあります。あなたは「あぁ、これは30ページ目を見ればいいのか」と思います。次にあなたは30ページ目を開きます。その中に10と書いてあって、あなたが見たかったものは10だと分かります。

このような付箋zのようなページ番号を書き込むページを、プログラム(C言語)ではポインタ(ポインタ変数)と読んでいます。付箋zのマークを付ける行動が、C言語では変数宣言時の*にあたります。つまり、char*等はページ番号を持ちますよという意味です。

この付箋zには、付箋yのページ番号も書き込めます。また、付箋yは当然自分自身のページ番号が分かります。このとき、C言語では付箋yのページ番号を取得するには、&yと書きます。


非常に長くなったようなので、今回はここまでとします。うーん、長いですね。
とはいえ、ここまで来ると、後は論理的に他のことも分かってくるかもしれません。例えば、ポインタ変数の格納できる値の大きさはは、なぜ全て同じになるのかなど。
一応、ネットで簡単に調べたけど、このような説明をする方はいなかったのですが、他の方も同じような考え方をしているかもしれませんね。
私としては箱で説明するよりも、よっぽどしっくりきますし、ポインタで挫折した方にこの説明をすると、「そうだったのか」と言って貰えますので、うれしいですね。実際にはもっと説明はたくさんあるのですけどね。

続きはまた今度、書けたら書きますね。
posted by Kiruahさん at 12:25| Comment(0) | TrackBack(0) | ノウハウ

2008年02月11日

設計書をExcelで書く場合

IT業界では、当然ソフトウェアを開発する際に事前に設計書を作成します。
設計書のようなドキュメントを作成する場合に通常利用するソフトウェアといえば、Microsoft Wordのようなワープロソフトのように思われます。ですが、実際にはWordを利用したことがないという方が多く、設計書にはExcelが利用されています。

Excelはご存知の方も多いと思いますが、ワープロではなくて表計算ソフトウェアと呼ばれるものです。表形式にデータを入力し、一般的には計算を行うソフトウェアです。
いくつかの建造物はもしかしたら、Excel上で計算されているのかもしれませんね。
その表計算ソフトExcelを利用して、ドキュメントを作成するのです。
Wordを利用するのではなく、Excelを利用してドキュメントを作成するというアイディアは、私が知る限り10年前からありますので、思ったよりも昔から使われています。
ただし、どちらも一長一短です。両方を組み合わせたいところですが、それはそれはソフトウェアを複数立ち上げなくてはならず、つらいところです。

Wordの使いにくい点は、
1. 表をWord上で作成しにくい
2. 図がどこかに飛んでいく
3. レイアウトを整えても、勝手にレイアウトが変ったり増えていく
などのように、レイアウト上の使い勝手がよく目に付きます。

Excelの使いにくい点は、
1. 図表番号やブックマーク機能がない(関数を使い倒せば可能だけども、なんともいえない苦労があります)
2. こちらも若干印刷がドライバによってずれます
3. 目次機能がない
こちらはドキュメントを作成する上での機能の欠落といえます。

少しでもExcelで設計書を書くときの負担を軽減したくて、今回少し調査と時間をかけて、図表番号機能をマクロで作成してみました。
とはいえ、まだ実験的ですので、とても使い物にならないかもしれません。もしかしたら、どこかの方が同じものやもっと良いものを作ってくれているかもしれません。
実験的ですので、しかもなんともいえないぐらい機能がまだそろっていません。

もしよろしければ、興味がある方がいらっしゃいましたら使ってみていただけたらと思います。
私のメインサイトのソフトウェアページからダウンロードできます。
以下の直リンクからもダウンロードできます。設計者向けマクロ

今日から彼女が海外旅行でさびしい限りです。
ガンダム00を観てから、旅行が心配になってしまいました。楽しんできて欲しいですが、それ以上に無事で帰ってきて欲しいです。
posted by Kiruahさん at 12:33| Comment(1) | TrackBack(0) | ノウハウ

2008年01月12日

Windows Vista用の更新プログラム(KB943411)の更新に失敗する

つい先日、Microsoftより、Windows Vista 用の更新プログラムがリリースされましたので、我が家のVistaマシンも更新してみました。
が、何度やっても他の更新は問題ないのに、KB943411だけ失敗してしまう現象に悩まされてしまいました。
ちなみに、この更新はWindows Vistaに新しく搭載されたサイドバーという機能に関する更新でした。

この更新表示されたエラーコードは、80070643でした。
このエラーコードに関するヘルプを見ると、「Microsoft Office 2003 の更新プログラムのインストール中に Windows Update エラー 80070643 が発生した場合は、Office Source Engine (OSE) サービスを再起動しなければならない場合があります。」と出ました。
うーん、サイドバーの更新ですのでOfficeではなく、しかも我が家のVistaマシンには、Office2003はインストールされておりません。我が家の唯一気になる点は、サイドバーを完全オフにしていること。

よって、コントロールパネルから「Windows サイドバーのプロパティ」を開き、「Windows起動時にサイドバーを開始します」にチェックし、現在開いていないので「サイドバーを常に他のウィンドウより上にします」にチェックをつけて、強制的にサイドバーを表示させました。ちなみに、画面に出ていない状態では更新に失敗してしまいました。
その後、そのままの状態でWindows Updateを実施し、OFFにせずに再起動すると、問題なく更新できました。


と思ったのは、束の間でした。
お次は、エラーコード 80004005により更新に失敗していました。
さすがにGoogleで検索してみると、どうやらCOMODO Firewallが悪いみたいです。日本語では出てきませんでしたので、日本ではあまり症例がないのかもしれませんね。
よって、こちらをまず 1. 全てOffにしてみる。 2. 起動・常駐させないようにしてみる。 をやってみました。
そして、だめでした。アンインストールが必要みたいです。
アンインストールすると、更新プログラムを正しくインストールできました。
おそらく、ファイヤウォールについているコンピュータの変更を監視して変更を拒否するプログラムがだめだったのかもしれません。
Spybot Search&Destroyは常駐していても問題ありませんでしたが、それはSpybotが大丈夫なのか、起動プロセスの起動順序やレイヤーに影響するのかは不明ですね。


今回のまとめ
Windows Vista用の更新プログラム(KB943411)に失敗する場合
エラーコード:80070643の場合
サイドバーを起動、画面に表示させた状態で更新してください。

エラーコード:80004005の場合
Windows以外のファイヤウォールの影響によりインストールに失敗している可能性がある。
COMODO Firewallはアンインストールしてください(事前に設定をExportできますが、必ずしも元通りにImportできそうにない感じです)。
他のファイヤウォールや設定変更を監視するソフトウェアがインストールされている場合には、いったん全ての機能をOFFにしてチャレンジ、だめなら次に常駐を止めてみてからチャレンジ、最終的にアンインストールしてからチャレンジとしてみてください。

Windows Updateを実施後、再起動してから元の状態に戻さないといけないようです。状況によって再起動時に何か設定をしているようで、その処理に失敗してしまいます。

両方ともインストールが完了した後は、元に戻して問題ないようです。我が家もがんばって、COMODO Firewallを元の設定にしました。

このノウハウ、結局最後だけで良い気がしますが、気にしないでおきます。
posted by Kiruahさん at 10:04| Comment(1) | TrackBack(0) | ノウハウ