IP競合

ネットワーク機器がうまく通信できないときの常套手段と言えばPingですね。
最近は割と、システム系じゃない方でもPingコマンドはさっと試せる方が増えてるなぁ〜って思います。(ちょっと前は、コマンドプロンプトの真っ黒な画面を見ただけで、下手するとPCが爆発するんじゃないかと思ってた方が多かったような)

なので、最近はLAN関連の問い合わせを受ける時も、Pingまでは既に試しているという方が多いのですが、割とPingは通るのに通信できないという相談も結構受けます。なので、それだと不十分な点を以下もう少し突っ込んで。

1.「Pingが通る」→「対象の機器は正常に繋がっている」は間違い

これは、対象の機器とIPが競合している機器が他に存在する場合にも上記の結果になり得る為ですね。なので、
Pingが通る」→「対象の機器のLANを切断したらPingが通らなくなる」というプロセスも必要です。ですが

2.「Pingが通る」→「対象の機器のLANを切断したらPingが通らなくなる」→「故に対象の機器は正常に繋がっている」も間違い

これはちょっとした落とし穴ですが、対象の機器とIPが競合している機器がネットワーク上に存在し、かつその機器がファイヤーウォール等でPingをブロックしている場合にも起こり得てしまいます。なので、あと一歩踏み込んで

3.「Pingが通る」→「対象の機器のLANを切断したらPingが通らなくなる」→「続いてarp -aコマンドを叩いた際に表示されたIPとMACの組み合わせが、対象の機器である、もしくは組み合わせそのものが表示されない」→「故に対象の機器は正常に繋がっている」

・・・まで行けばかなり堅いですね。競合機器があった場合、ファイヤーウォールがかかっていようがいまいがIPとMACの紐づけだけはされるので、ここで対象機器のIPが唯一か否かが判定できます。

あとは、Pingの調査をしている時に競合機器の電源が落ちていたとか、訳の分からん設計のMACアドレスフィルターがかかっていたとかでもない限りは大丈夫でしょう。


今日は大したことないことを大したことあるように見せるために真面目モードです。

履歴テーブルというもの

ちょっとソフトの検証を手伝うことになりまして。

自分のが検証されるのは嫌ですが、人のを検証するのは大好きです(性格悪)

ソフトの内容は、まあよく有る作業の計画をインプットしてその実績をとっていくというだけのものなので、一通り業務イメージと同じ手順で作業をしてみて、実際に履歴が取れているかを確認・・・うん、取れてるね。

で、念の為ソフトの画面からだけではなく、データベースの中も確認して…


……あれぇ……?


何故だ?履歴テーブルのフィールド数が、履歴画面に表示されているフィールド数より圧倒的に「少ない」

……これは嫌な予感。とりあえず他の検証結果を見る以前にプログラマに連絡。

僕「あのー、この履歴画面って、この履歴テーブルからどーやって作ってるんです?」
プ「ああ、履歴テーブルと計画データテーブルをJOINし……」
僕「おおおおおおおおおおい!!!」

プ「何か?」
僕「いや、じゃあ計画データ消したらどうなるの?」
プ「それはデータ不整合を起こすので、やらないで下さい」
僕「いや、でも仕組み上計画データは割とすぐ消すし、システム上も計画データを先に消すことはできるんですけど」
プ「それは運用でカバーしてください」


・・・・・・えーと


ちょっと自分の常識がおかしいのかどうかが分からなくなったので以下愚痴。


まずそもそも履歴とは何か。それは業務を行った結果、システムで言えばログであって、仕様として特別に許可された場合を除き改変されてはならない物だと思ってる。それはつまり、設計時点で他の作業や動作において極力影響を受けないように考慮するということで、そう考えると必然的に履歴テーブル一つで、履歴に関する全ての情報が網羅できるように作るのが一番安全なんじゃないかなぁと思ってる。(大きいシステムでは知らないけど)
それはつまり、履歴テーブルのあるフィールドが別のテーブルに依存する形をとらないようにするということで、ましてやJOINなんてそうそうするもんじゃないのではと思ってる。(履歴テーブルを履歴以外の目的で転用する場合は別ですが)

例えば、履歴に担当者を残したいと思ったら、やっぱり担当者コードと担当者名両方を履歴テーブル内に別個のフィールドで持つ方がデータ的には安全だと思う。担当者コードだけを持ち、逐一担当者マスタを参照して担当者名を表示させた方が、データ量的には少なくて済むのは分かるんだけど、例えばその社員コードという概念には臨時社員コードという意味も含んでおり、短期間に同一コードが使いまわされるケースもあるとしたらどうだろう。これは、ある時期には入社している筈の無い社員名がその時期の履歴画面に表示されてしまう。これは「履歴」としての価値を持たないデータだと思う・・・んだけどなぁ・・・。

要件定義として「こんなデータが履歴データとして表示されてほしい」というところまでは提示してあったみたいだけど、データベースの設計までは提示していない・・・ってか、そこの設計って一般的に言ってSEの仕事なのかしら、それともPGの仕事なのかしら・・・

まあ、PGは仕様通りにソフト作るのが第一だけど、自分がそもそも何をどのような目的で作っているのかを全く意識しなくていいってわけじゃないと思うんだけどなぁ・・・
てかこんな危険な設計で「運用でカバー」とかしれっと言わんで欲しいなぁ・・・ってこれって贅沢?

OSがインストールできない

Windows7をインストールして貰いたい!

と言われてしまったので、やりました。
出来ませんでした。

・・・なんでクソ忙しいときにこういうのにぶつかるかね。
以下エラーメッセージ

「このディスクにWindowsをインストールすることはできません。このコンピューターのハードウェアでは、このディスクでの起動がサポートされていない可能性があります。このコンピュータのBIOSメニューで、このディスクのコントローラーが有効になっていることを確認してください」

うーん、意味が分からない。
取り敢えずHDDをフォーマットしてみた。
出来ませんでした。

・・・え、フォーマットできないって・・・
とりあえずディスク一覧にはちゃんとHDDは表示されているので、ドライバが無いとかそういう話ではないし・・・

仕方ないので、BIOSを起動してHDDの状態を調べてみた。
ちゃんと認識されてるしなぁ・・・ちゃんとMASTERにもなってるし。
仕方ない、HDDのドライバを入れ直してみればいいのかしらと思ってやりました。
出来ませんでした。

・・・オイコラ。いい加減にせいよ。
ってか、HDDじゃなくてSSDだったのね。まあそこは特に重要ではないけど。
仕方ない、別のPCでSSDのフォーマットができるかと思って、PCを開けてみた。

ガラン

・・・はて?何か落ちた・・・うを!SSDだ!
おいおい、しっかり取り付けとけよ

・・・ってか、

ガムテープで留めとくなよ!

SSD用のブラケットが無かったからって凄い事するな。誰だこれ組み立てたの。

ん?あれ?もう1つSSDがついてるな・・・って、あ、RAIDね。

・・・こっちのSSDもガムテープで留められてた。

あー、つまりこういうことですか。
RAID1の為にSSD2基の構成にした
→けど、ブラケットが無かったのでガムテープで固定した
→そしたらPCを移動した際に片方外れてしまった
→その為、ディスクとして認識はするけど稼動させられないという状態になった
→結果、OSインストールできねぇ

SSDをちゃんと接続したら、あっさりOSインストールできました。ちゃんちゃん。

しかし、これ後で車で運ぶんだけど大丈夫かしら・・・
いちおー、ガムテープで留めなおしたけど・・・

久々にバッチVBSのお仕事

「テキストデータ内の特定の条件に合致するレコードを除去して再テキスト化して欲しい。」

・・・なんて依頼を受けてしまった。
そのテキストデータをシステムに取り込む際、余分なデータは排除したいらしい。そんなのそのシステムの開発者に言えばいいのに・・・って、はいはい予算ですね。

まあ、エクセルのVBAで取り込んで除去して吐き出し直せばいいやって思って中を見てみたんだけど

・・・固定長でやんの・・・

さて困った。可変長だとばっかり思ってたので

1:エクセルに取り込む
2:要らんレコードをフィルタリングで除外する
3:その上で再度出力する

ってのを考えてて、15分くらいで終わるだろうと思ってたんだけど……
いや、取り込むのは対したこと無いんだけど、出力がね……。ファイルレイアウト通りに各セルをスペース補填やら前ゼロやらしてあげないといけないし、1レコードの項目数が70近くあるので、そんなにソース内に項目定義作るのもやってらんない。

・・・こりゃ、テキストデータ内を直接調べて、除外したくないレコードだけを随時別のテキストファイルにまるごと書き出す方が楽だし安全だな。(コーディングミスって下手にバイトずれでもしたら目も当てられないし)
だったらいちいちエクセルも起動させないで、VBSファイルをダブルクリックする方が、使うほうも楽よねぇ(ファイルパス固定だし)

ってことで、

1:ファイル開く
2:1レコードを読む
3:除外条件となる特定のバイト目を調べる
4:除外条件でなければ、別のテキストデータに書き出し
5:次のレコードを読む(以降3〜5繰り返し)
6:最後に、元のファイルを別の場所に置き、新たに書き出したファイルを元のファイルにリネームでおk

うん、これならたいした時間も食わんだろう。

・・・と思ったんですけどねぇ・・・
途中に全角文字入ってるの忘れてた。3の処理をやるのに、単純にMid関数じゃダメだ。とはいえ、テキストデータがシフトJISなので、MidB関数も使えない。えーっと確か、別件でバイト数をカウントする処理を作るのに同じ問題にぶち当たったよなぁ・・・あのスクリプトどこに行ったかなぁ・・・そっからコピーして作り直せば問題ないよなぁ・・・

って、探すのに1時間かかってしまったorz
エクセルで取り込んで固定長で吐き出すやり方より時間かかっとるんじゃなかろーか・・・まあ、レコード丸写しの方が精神的には楽だからいいけど。

まあ、取り敢えず見つかったスクリプトを抜き出して、関数化して動作確認してと・・・あーできたできた。ほんと固定長嫌い。

なお、シフトJISのバイト数変換は、Left関数で左から1文字ずつ調べていき、その1文字が1バイトか2バイトかを判定し、その結果を累積していけば良い。
1バイトか2バイトかの判定は、アスキー変換したその文字に対して0xFF00で論理積をとれば、それが1バイトだったら論理積は0、2バイトだったら0以外になることで判別できる。

If Asc(その文字) And &HFF00 = 0 Then
その文字のバイト数 = 1
Else
その文字のバイト数 = 2
End If

的な(まともに書け)

WindowsCE

ちょっと仕事でWindowsCEを使ったPDAに関わった。
初めてって訳じゃないけど、ちょっとクセがあるので余り関わりたくなかったんですが・・・まあ、仕事なんでしょうがないですかね。

このWindowsCEWindowsというだけあって、それなりに普通のWindowsと似ているところも多い。
WinCEのいいとこ】
・デスクトップ、コントロールパネル、Program Filesと言った基本概念が通常のWindowsと同じ。
・アイコンやウィンドウメニュー名称等がWindowsと同じ。
Windowsのファイル共有(SMB)が使用できる。
・.NETで普通にアプリケーションを開発できる。
・OFFICE関連ファイルを扱える。
SQLServerに直接接続できる。
リモートデスクトップが使える。
Windowsターミナルサービスを利用できる

などなど

しかし、そんな見た目にだまされてはいけない。結構システム屋泣かせである。
WinCEの悪いとこ・ダメなとこ・信じらんないとこ】
1:ネット上に殆ど技術情報が落ちていない
2:共有フォルダの指定にIPアドレスが使用できない
3:トラブルシューティングツールが貧弱
4:販売メーカによって実装がバラバラ
5:充電しないまま放置すると工場出荷時状態に戻ってしまう

まず1。
そもそも、MicroSoftのサポートページが無い。組み込み式OSだからなのか、TechNetのような一般向けサイトが無い。おかげで、何かトラブッたら、大概手探りから始めなければならない。
その2。結構みんな良くやってると思う、共有フォルダ指定時の「\\192.168.xxx.xxx」のような指定の仕方ができず、全部「\\[コンピュータ名]」で行う必要がある。
DNSが無い環境では、IP直指定を信条としている人も多いと思うけど、それが出来ない。なので、ワークグループ環境で使うのが不安。すっごく不安。
Windows7では知らないけれど、WindowsXPのワークグループ環境で、ネットワーク上のPCのブラウジングがたまに失敗する(ネットワーク上のPC名の一覧を取りまとめるPCが不在になってしまう現象)を経験している人にとってみれば、勘弁して欲しい仕様である。

その3。
上の仕様を踏まえたうえで、何故かnslookupが標準でサポートされていなかったりする。何故だ。それとも俺が関わった機器の実装がたまたまそうだったのか(だとしてもアホな仕様だと思う)。
※仕方ないので、名前解決されているか否かは、DOSプロンプト起動後に Ping [コンピュータ名] で確認しているんだけど、なんかもっと正規の方法無いんかしら
その4。
これも結構困る。特に、無線LANの設定に関してはかなりバラバラで、同じものを見たことが無い(CEのバージョンにもよるのかもしれないけれど)WinCE無線LAN環境下で使われることがほぼ当たり前だと思っているので、OS内に標準設定画面を持てない物なのかしら。
普通のWindowsでも、専用設定ツールがプレインストールされていたりする場合もあるけれど、あえてソレを使わずにWindowsが持っている設定画面が使えるわけだし

その5。
これも困る。なんせ、機械が壊れた場合の予備端末を用意しておくことが出来ない。壊れたときを想定した予備端末を常に充電状態には普通しない。
フラッシュディスク側にアプリケーションやデータを置くようにすればある程度被害は防げるが、それにしてもデスクトップやスタートアップ等や各種設定は平然とクリアされてしまう。
実装によっては、バックアップ・リストアツールが用意されているが、それにしたって面倒だし、すんなり予備端末と入れ替えと言う訳にはいかない。

うーん、せめて2と3はどうにかならんものなのかなぁ。

・・・まあ、WinCEがいつまで存在するのかも分からないけどさ。

USB(鬱陶しいセキュリティ撲滅して欲しいの略)

お客さんから通報。「何か機械の通信がおかしい」

・・・ってことで、現地に行ってきたわけですが。
今回の機械の通信に使用しているのは、USBケーブル。PC内部では、仮想COMポートとして認識するタイプの物で、アプリケーションとしてはMSCOMM(古いな俺)で通信するイメージのもの。

さて、これまで普通に使えてたのに、今日突然使えなくなったとのこと。とりあえず、ケーブルを自分のPCに挿してみたところ、普通に使えるのでケーブルのエラーではない。なので、コマンドプロンプトでCOMポートをオープンしてみようとしたら「指定されたデバイスが見つかりません」だって。

しかし、デバイスマネージャーにはちゃんとCOM5って書かれているので、ハードウェアとしてはちゃんと認識しているはずなんだけどなぁ。ってことで、今度はターミナルソフトでCOM5ポートを開いてみたら「指定されたポートは他のアプリケーションで使用されています」だとさ。

ためしに、通常のCOM1をポートオープンしてみたら、普通に開けた。じゃあってんで、USBのCOM番号を1番に変更した上で、再度COM1をオープンしてみたら、やっぱり「他のアプリケーションで使用されている」とのこと。

・・・コレはおかしいなぁ。COM1を何らかのアプリケーションが使用しているなら、最初のCOM1のポートオープンでも同じ反応が起きるはず。

別にこの機械自体は他のお客さんでも問題なく使っているわけで、今回この現象は初めて。

まあ、取り敢えず業務を止めるのもなんなので、別のPCで使用できるように機械を移設したのだが・・・

・・・こっちのPCでも同じ症状が出るでやんの。


あ、この感じ。


あれだ。


セキュリティポリシーだ。

確かに、最近はUSBストレージの使用許可に関するポリシーの配布も行えるので、それに巻き込まれてるんじゃないのかしらん。仮想COMの使用まで制御できるのかは知らんけど。

ってことで、その会社のIT部に問い合わせたら、確かに昨晩USBストレージに関するポリシーを配布したとのこと。

あー、ビンゴ。外してください。そのセキュリティ今すぐ外してください。外さないとヒドいぞ・・・って、現場の偉い人に代弁して貰いました。

ポリシーが変更され、PCを再起動してみたところ、普通にシステムは稼動した。あー良かった良かった。

それにしても、USBストレージに関するセキュリティーポリシーで、USBでの仮想COMポートまで制限されるのは如何なもんか・・・
まあ、確かにシリアル通信でもファイルの送受信はできちゃうけど、そんなん普通のCOMポートだって一緒やん・・・

そもそも、仮想COMポートまで制限がかかってしまうのが、正式な仕様なのかそれとも仕様外なのか・・・なぁ〜んか仕様外で想定外なだけのような気がするなぁ・・・

でかログ

某お客さんにて、ソフトのインストール作業を行ったときのこと。なーんかサーバのディスクの容量がえらい少ないなぁ〜っと思って、少し中を調べてみた。

サーバは主にDBサーバ(SQLServer)として使用していて、それ以上でもそれ以下でもないのだけど、はてそんな大量にデータを扱ってるような認識はなかったんだけどなぁ……どれどれ……


トランザクションログ……33GB


……これはいけません。まさか定時バックアップしてないのかなぁ……と思って、データベースオプションをちょっと覗いてみた。普通に単純復旧モデルなので、通常のバックアップさえすればログは空になるはずだよなぁ(見た目の容量は残るけど)ってなことで一応、ログファイルの構成を見てみたら、ああ、なんだ。再利用可能領域は90%以上あるじゃない。ってことは、バックアップは取れてるんだろうなぁ。
多分、バックアップが何かの理由(ネットワークエラーとか)で取れてなかった時期があって、その間にログファイルサイズが肥大化しちゃったとか、そんなんですかねぇ。
うちの仕組みとは関係ないDBなので、一応お客さんにログの圧縮だけオススメして終了。

……それにしても、33GBのログって、一体どれだけバックアップとってなかったんだろう……