2010-09-11

大量ファイルのコピー時に、ネットワーク障害を引き起こすPanda Cloud Office Protectionのファイヤウォール

二、三か月前から Windows Server 2003 x32 機(以下、2003機)でネットワーク障害が続く。
障害発生のタイミングは、毎日17時のFドライブ(データが入っているドライブ)のバックアップ時。このバックアップは他機にインストールされたBunBackupというソフトを使用し、毎日17時にタスクスケジュールによりネットワーク越しに実行される。過去1年位はなんの障害もなくNASへバックアップできていたのだが、二、三か月前から急に障害が発生するようになった。
具体的な症状としては、ネットワークを利用する多くのアプリケーションで通信が切断されたり、実行不能に陥る。
例えば、2003機からLAN内のノードに対してpingを実行すると、「PING: transmit failed, error code 1450」や「ping.exe - アプリケーション エラー: アプリケーションを正しく初期化できませんでした。…」といったエラーが返ってくる。 ただ、バックアップジョブが始まって30~40分程度すると、ping が通るようになり、ネットワークは復旧する。  

調べてみると、「ネットワークカードを替えてみろ」という人がいたので、高級品?=INTEL PRO/1000 PT SERVER ADAPTER を刺してみても効果無。 いろいろ見ているうちに「このping のエラーはウィルス絡みのエラーかも」というのコメントがあり、ピンときた。 「またPandaか!」と。
例によって、Panda Clound Office Protection (以下、PCOP)が怪しい。 ただ、バックアップジョブはPCOP を搭載した他の複数のOPC/サーバ機でも実行していて問題はないので、頭に?が点滅。 Pandaの設定を確かめることにする。 PCOP ではブラウザ上でセキュリティのプロファイル(ポリシー)を複数作成し、PC/Server毎に作成したプロファイルを割り当てることができる。 


チェックしてみて、問題の2003機は他機とは異なり、ファイヤウォールが適用されるプロファイルに属していた(他機はファイヤウォールが非適用)。 そこで、2003機をファイヤウォールが適用されないプロファイルに移してみたら、数か月悩まされたネットワーク障害がピタリと治まった。 やはり、原因はPanda(PCOP) であった。 ちなみに、問題を引き起こしたプロファイルはローカル機側でファイヤウォールをOFFにできる設定にしたあり、実際、2003機のローカル設定でファイヤウォールをOFFにしてみたが、それでもネットワーク障害は解消されなかった。


つまり、管理者がブラウザでファイヤウォールをONにしているプロファイルにPC/Serverを割り当ててしまうと、ローカルのファイヤウォールの設定に関わらず、当該エラーは発生するようだ。

土屋

2010-09-10

『売上猫くん on MySQL』開発日記 - 番外11 - 外部キー ってさぁ… orz

MySQL Workbench 5.2 の外部キー作成クエリがオカシイっぽいことは 番外10 書いた通り。 今回もなかなか思ったように動いてくれない。


この Referenced Column で選択したいのは estimatedId なのだが、候補として表示されるのはなぜか[customerNo]のみ。 どうにもならないので、構わず“Apply”を実行すると、次のようなSQL文が表示される。

ALTER TABLE `neko`.`estimatedtls`
ADD CONSTRAINT `fk_purchaseId_est`
FOREIGN KEY (`purchaseId` )
REFERENCES `neko`.`estimates` (`customerNo` )
ON DELETE CASCADE
ON UPDATE NO ACTION
, ADD INDEX `fk_purchaseId_est` (`purchaseId` ASC) ;

ここで cutomerNo を強引に estimateId に書きかえて、“Apply SQL” を実行してみると

ERROR 1005: Can't create table 'neko.#sql-be8_19b' (errno: 150)

なんてエラーが出る。 そこでしばし調べてみると、

, ADD INDEX `fk_purchaseId_est` (`purchaseId` ASC) ;

が機能していないようで、仕方なく、purchaseId の索引を別途作成。 その後、上記SQL文から「,ADD ~」移行を削除して、実行するとどうにか外部キーが作成できた。
Workbench の生成するSQL文はそのままではエラーが出ることがしばしばあるようだ。

土屋

追記(10/09/10)
companies というテーブルからあるフィールド(cmnKey)を削除しようとすると、

  ERROR 1025 (HY000): Error on rename of...(errno: 150)

と表示される。 削除しようとしているフィールドが他から参照されているから削除できない、とのことだが、この cmnKey フィールドはどこからも参照されていない。 companydepts というテーブルからは外部キー制約を companies に対して設定しているが、この制約の REFERECES フィールドは cmnKeyではない。 要するにどう考えてもオカシイ。 どうもMySQLのバグらしいことがわかったので、cmnKey とは全く関係ないこの外部キー制約を一旦削除。 その後、cmnKey を削除することができた。 どうもMySQLはオカシナことが多発し過ぎる。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-09-09

SonicWALLの新製品テクニカルセミナー 2010/08/26

 ブログ記述が遅れてしまいましたが、8月26日(木)に SonicWALL ネットワークセキュリティアプライアンス テクニカルセミナーに参加してきました。

 セミナー内容はビジネスセッションとテクニカルセッションの基本的な部分は前回出席した SonicWALL セミナーとほぼ同様で特に真新しいと感じるところはなかったのですが、 SonicWALL が投資家グループ Thoma Bravo およびオンタリオ教師年金基金によって買収されたことにより SonicWALL 社が非上場企業になったことに触れていました。

 今回の買収は、プライベート・エクイティファインドである Thoma Bravo から安定した資金調達を確立することにより、製品ロードマップはそのままに製品開発に注力していくことを目的とした、前向きなものであるということでした。

参考:SonicWALL、7億1700万ドルで投資家グループが買収へ

 SonicWALL UTM 製品で前回のセミナーに追加されていた項目で目についたのは、消費電力の低さで、たとえば NSA 4500(製品情報はこちら)でも消費電力は 66W で、Fortinet の FG310B (製品情報はこちら)の 120W と比較しても約半分の消費電力となっています。

 テクニカルセッションも基本的には前回とほぼ同様の内容でしたが、SSL-VPN 機能について少々詳しい内容が盛り込まれていました。

SSL-VPN 機能の特徴
- Windows, Linux, Mac に対応(IPSec 機能では Windows のみ対応)
- 初回ログイン時に NetExtender モジュールをインストールし、NetExtender が SonicWall に対し SSL で暗号化されたトンネルを構築
- 1 要素認証のみサポート。高度な認証や同時接続ユーザ数が必要な場合は専用 SSL-VPN 装置を用意する必要あり。

参考:Introduction to the SonicWALL SSL VPN 200 (英語)

2010-09-03

Panda のせい?複数のサーバで障害多発

 最近になってやたらとサーバ機の不具合が多発するため、試しに Panda をアンインストールしてみたら突然快調に動き出したので、どうやら Panda が障害を引き起こしている可能性が高いと思い始めています。

 弊社が遭遇したトラブルを以下にまとめてみました。
 ちなみに、Windows Server 2008 で使用している Hyper-V は OS に付属のものを使用しています。

Windows Server 2008 32bit
現象:Blue Screen 障害の後、勝手にサーバ機が再起動するという現象が二ヶ月ほど前から断続的に発生。
サーバ機の診断を行うと、NIC がユーザによって無効になっているというメッセージが表示される(実際は NIC は動作しており、ネットワーク接続も可能となっている)。

Windows Server 2008 64 ビット環境の Hyper-V のゲスト OS としてインストールされている Windows Server 2000
現象:起動に 5 分以上かかり、ネットワーク関連のイベントエラーが大量に記録される。
常時起動させたままにしている FileMaker 5.5 Unlimited で開いているネットワーク共有データベースが切断されることがある。

* ちなみに、別サーバ機の Windows Server 2008 64 ビット R2 の Hyper-V のゲスト OS Windows Server 2000 の Panda は問題なく動作しているようです。

Windows Server 2003
現象:自動バックアップを実行する時間になると、ネットワークが一時的に遮断される。

 上記いずれも Panda をアンインストールした途端に快調に動き出します。

 また、以下の環境ではまだ Panda のアンインストールはしていなのですが、現象が現象だけにどうしても Panda の影響を疑いたくなってきています。

Windows Server 2008 64 ビット環境の Hyper-V のゲスト OS としてインストールされている Windows Server 2003
現象:起動が若干遅い。FileMaker Server 10 の起動に時間がかかる。また、FMS 10 の管理ツールの起動にも時間がかかるだけでなく、データベースが自動公開されない。
(仕方なくいつも手動で公開するが、すぐに公開された試しがない。)

 今まで Hyper-V 搭載機で Panda エンジンの自動更新後の不具合で散々泣かされてきていますが、今度は通常の OS インストールで使用中のサーバ機にも影響が出てきているため頭が痛いところです。

 本記事はまだ記述中ですが、今後解決策が見えてきたところで情報を更新したいと思います。

2010/09/13追記:
 Windows Server 2008 32bit のBlue Screen 障害は、NIC の再インストール、Panda の再インストールを行った後に診断ツールでのエラーが解消しました。こればかりでは Blue Screen 現象自体が解決したとは言い切れませんが、診断ツールが警告を出さなくなったという点では、Panda 絡みの問題が発生していたと考えても良いと思います。

 Windows Server 2008 64 ビット環境の Hyper-V のゲスト OS としてインストールされている Windows Server 2000 でのイベントエラー大量発生については、Windows Server 2008 を R2 にアップグレードしてから Panda を再インストールしたらエラーイベント記録が治まりました。

 結論としては、Panda 導入によるマシン環境の不具合は、どうやら OS のバージョンや構成に依るところが大きいようです。
 当方で検証したエラー発生条件については改めて投稿します。

2010-08-23

『売上猫くん on MySQL』開発日記 - 番外10 - 開発再開

4月末に入ったヘビーで超急ぎの仕事が入った。 終わってみると、風薫る5月も紫陽花の6月もとっくに過ぎて夏真っ盛りになっていた。 今年も紫陽花は見れないまま。 ということで、大中断していた『売上猫くん on MySQL』の開発をまたぁーりと再開。 一旦、開発の慣性がなくなると、再加速し走らせるのは異常に大変なのですよ。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-07-06

Panda Cloud Office Protection 保護エンジンのアップデート と Hyper-V の 問題は健在

 2009/12/08 の投稿「Panda Cloud Office Protection エンジン更新後に Hyper-V 搭載サーバ機でトラブル発生」で、Panda Cloud Office Protection エンジン更新後に NIC の挙動がおかしくなる件について述べましたが、この現象は今もなお健在です。

 当方では 2010/07/06 02:025:21 に保護エンジンのアップデートが行われた模様で、今朝出社してみたところホスト OS、ゲスト OS 共に NIC の動作が不安定な状態となっており、暫く操作すると Hyper-V 環境のすべてのゲスト OS にまともにアクセスできなくなってしまいました。

 幸い、前述の経験を活かして仮想 NIC の削除、追加を行って何とかネットワークを復旧させましたが、Hyper-V でサーバ運用をバリバリ行っている場合にはこのようなトラブルは非常に迷惑であり、業務が滞ってしまうため、Panda Software 社には是非この点を改善していただきたいところです(前回本トラブル発生時に改善を求めるメールを送ったのですが、この様子ですと残念ながら放置されたままのようですね)。

 愚痴はこの辺にしておきますが、もし Hyper-V 環境に Panda Cloud Office Protection をインストールされている方で、急にネットワークの挙動がおかしくなったという方は、前述の記事が参考になればと思います。

 また、次回の保護エンジンアップデート時にこのようなトラブルが発生しないようにするためにも、プロファイルにある[アップデートの詳細設定]の[保護エンジンのアップデート]オプションを無効にしておくことを強くお勧めします。

 手動で保護エンジンをアップデートしたあとにネットワークの挙動がおかしくなるのは恐らく避けられないでしょうから、仮想 NIC 削除、追加作業は必要になると思います。

 朝来てみたらネットワークがダウンしていて、冷や汗かきながら原因を突き止めたところ実は Panda が原因だったとわかるまでに数時間無駄にすることを考えれば、手動で保護エンジンをアップデートした方がまだマシ、と考えるべきなのかもしれません。

2010-05-06

登記変更とか

昨年5月に事務所を狛江から調布へ移転したが、登記を変更していなかった。 税務署と社会保険事務所にも住所変更届けを出さなければならないが、本店移転登記が前提となり登記簿謄本がないと原則、住所変更ができない。
というわけで渋々いままでほったらかしてあったいくつかの登記変更(本店移転、役員変更、役員住所変更、解散事由の破棄)を同時に行うことにした。

普通の会社であれば、行政書士とか司法書士とかいう人に依頼してこの種の手続きを行うのだろうが、小社は文字通りの小社なので社員=小生が自ら行う。 もっとも法務省のサイトに各種申請フォームの雛型が用意されているので、トウシロの小生でも上記4つの申請書+株主総会議事録+取締役会議事録等というものを一日強で仕上げることができた。
申請書等の準備ができたので調布市管轄の法務局=東京法務局府中支局に行くことになる。ところがこの支局、府中駅から数キロも離れており激しく不便。 府中社会保険事務所や武蔵府中税務署は駅から近いのだが、やはり法務局などというところは普通の会社・個人はそう頻繁に訪れる場所ではないから不便なところで良い、ということか。 しょうがないので、運動も兼ね多摩川サイクリングロード(当事務所は多摩川に近接している)を通って府中支局に行くことにする。 今日は天気は素晴らしく良かったのだが風が強く激しく疲れる。約1時間半で到着。案内された3階の法人登記課(?)に作成した申請書等を提出。あっさり受理され、「書類に問題がなければ5/13に謄本が出ますよ」とのこと。
費用(印紙代)は本店移転と解散事由廃止が各3万、役員住所変更と役員変更が各1万、計8万円、解っていたけどやっぱ、「たっけぇー!」
ということで、傷心のまま、強風且つ一時間半の帰路についたのであった。
(終わり)

注:
インターネットでの申請も可能なようでちょっと調べたのだが、JAVAのバージョンが違うと動作しない(つまりネット申請を行うためにJAVAをアップデートしない申請専用PCを用意しなけらばならない)というような恐ろしいことが書いてあったので、ネット申請は止めることにした。 さすがお役所仕事と言うべきか。

2010-04-28

Hyper-V のゲスト OS として bkf アーカイブを復元してみる(2/2)

 さて、前回の ASR バックアップセットによる自動復旧の失敗を踏まえ、今回は Hyper-V のゲスト OS 環境に Windows Server 2003 をインストールした後で、手動でシステム情報を復旧する方法について記述します。

【操作方法】
1. ゲスト OS に Windows Server 2003 をインストールする。
 Hyper-V の仮想マシン設定については割愛します。
 Windows Server 2003 の仮想マシンへのインストールについては、過去記事(Hyper-V にゲスト OS をインストール(覚え書き))で紹介しているとおり、SP2 以降のインストールディスクを使用しなければブルースクリーンが出てクラッシュするので注意が必要です。

2. 1. でインストールした Windows Server 2003 をネットワークに参加させる。
 既存ドメインや既存ワークグループへ参加させるようにゲスト OS の Windows Server 2003 の設定を変更して、ネットワーク経由でバックアップアーカイブ(.bkf) にアクセスできるようにしておきます。

3. バックアップツールを起動し、復旧コマンドでシステム状態を復旧する。
 ゲスト OS より「スタート」→「すべてのプログラム」→「アクセサリ」→「システムツール」→「バックアップ」の順に選択してバックアップツールを起動し、「復元ウィザード(詳細)(R)」をクリックします。



 すると復元ウィザードが表示されますので、2. のネットワーク上に配置されているバックアップアーカイブを指定し、左ペインの[System State]項目にチェックを付けます。
(バックアップアーカイブは DVD-R に焼いたものをゲスト OS に認識させても構いません。)



 “次へ”をクリックすると、以下のような警告メッセージが出ますので、本当にシステム状態がバックアップのもので上書きされても良ければ“OK”をクリックして復元を実行します。



【システム状態復元によって発生する不具合】
 前述の操作によってシステム状態を復元すると、旧環境のシステム状態が引き継がれた形となりますので、次のような問題が起こります。

1) コンピュータ名の重複
 同一ネットワーク上に同じコンピュータ名のマシンが複数台存在すると、警告メッセージがデスクトップに表示されます。
 新環境の方のコンピュータ名を適切なものに変更するか、旧環境のコンピュータをネットワークから切り外してください。

2) IP アドレスの重複
 コンピュータ名と同様に、同一ネットワーク上に複数の同一 IP アドレスを割り当てることはできませんので、新環境または旧環境の IP アドレスを適切なものに変更してください。

3) Windows のライセンス認証の不具合(特に注意)
 上記 1)、2) を行う前に、Windows ライセンス認証を促すメッセージが表示された場合、その時点で仮想ネットワークカードが動作停止状態となるため、インターネット経由でのライセンス認証はできなくなります。
 このため、認証手続きはライセンス認証ウィザードの電話認証の手続きを選択し、音声ガイダンスに従って認証を行う必要があります。

4) アンチウィルスソフトを始めとする、システム関連ソフトウェアの再インストール
 システム状態復旧ではソフトウェアまでは復旧されないため、Windows Server 2003 起動時にソフトウェアがインストールされていないという旨のエラーメッセージが表示されることがあります。必要に応じてインストールし直してください。

5) 旧環境で発生していたイベントエラー
 旧環境のシステム状態を復旧した場合、旧環境で発生していたイベントエラーの一部がそのまま継承されることがあります。
 イベントビューアで発生しているエラーを調べ、必要に応じて修正する必要があります。

 その他の不具合や問題点などは見つけ次第こちらに記述していく予定です。

 今後の課題としては以下のものがありますが、また機会ができたときに対応したいと思います。

1. 複数ボリュームを持つ BKF の Hyper-V ゲスト OS への復旧
2. VHD の復旧

2010-04-27

Hyper-V のゲスト OS として bkf アーカイブを復元してみる(1/2)

 既存の Windows Server 2003 サーバ機の環境を Hyper-V のゲスト OS にごっそり移行してみようということになり、試してみたのですが Hyper-V では自動システム回復 (ASR) セットからの復旧はやはり無理があることがわかりました。

 今回は失敗談を踏まえて、手動によるシステム状態の復旧までをまとめることにします。

 操作にあたり、以下のMicrosoft 社の技術情報ページを参考にしました。
 ハード的に独立したマシンを準備して、ページの記載どおりに操作すれば復旧はそれほど難しくないのではないかと思います。
Windows Server 2003 のデータをバックアップおよび復元する

 今回は Hyper-V のゲスト OS 環境で復旧作業をするということで、以下の問題がネックとなりました。

A. フロッピーディスクをどうやってゲスト OS に認識させるか。
 自動システム回復 (ASR) を行う場合は、元環境のパーティション情報はフロッピーディスクに記録されているため、フロッピーディスクを読み込ませる仕組みが必要となります。
 しかし Hyper-V のゲスト OS 環境では、物理的なフロッピーディスクを認識できないため、フロッピーディスクのイメージファイルを仮想フロッピーディスクファイル(.vfd)として保存し、それを読み込ませる必要があります。

 .vfd ファイル(イメージファイル)を作成するツールは Microsoft 社では提供されていないため、適当なツールをどこからか調達する必要があります。

 今回は K.Takata さんが公開している Read/Write FD というツールを使いました。
  Read/Write FD の仕様およびダウンロードページはこちら

 使い方は仕様のページに書かれているとおりですが、フロッピードライブを丸ごとイメージファイル化するには次のように指定します(.vfd 拡張子前のファイル名は任意です)。

 rwfd a: c:\fdimageW2003.vfd

 この操作で作成した .vfd ファイルをゲスト OS に認識させるための設定を行います。
 この .vfd ファイルは Hyper-V のホスト OS の適当な場所に保存しておきます(今回は f:\に入れることにします)。
 Hyper-V マネージャを開き、Windows 2003 用の仮想ハードディスクを割り当てた後で、設定を開き、以下の図のように仮想フロッピーディスクを割り当てて適用させます。
 


 この操作を行うことによって、ゲスト OS からフロッピーディスクを仮想的に読み込ませることが可能となります。

B. バックアップアーカイブ(.bkf)をどうやってゲスト OS に認識させるか。

 ASR による自動システム回復を行うにあたり、途中で .bkf の指定を求められるわけですが、Windows 2003 のインストーラでは、このファイルの配置場所として物理的に接続されている HDD デバイスを想定しているようで、ここで躓いてしまいました。
 この時点で自動システム復旧操作は断念せざるを得なかったわけですが、操作としてはなかなか面白いものでしたので、掲載することにします。

【操作手順】
1. ASR バックアップセットを作成する。
「スタート」→「すべてのプログラム」→「アクセサリ」→「システムツール」→「バックアップ」の順に選択すると、次のような画面が表示されるので、[常にウィザードモードで開始する]のチェックボックスを外して一度“キャンセル”をクリックしてプログラムを終了させます。



 もう一度バックアップツールを開くと、今度はバックアップウィザードが開きますので、画面一番下の「自動システム回復ウィザード(A)」を選択します。



 すると自動システム回復の準備ウィザードが開きますので、図のようにバックアップアーカイブ名を指定します(.bkf 前のファイル名は任意です)。
 “次へ”をクリックすると、バックアップが始まります。



注意:この操作を行うにあたり、パーティション情報がフロッピーディスクに書き込まれます(前述の仮想フロッピーの記述参照)。このため、フォーマット済のフロッピーディスクをフロッピーディスクドライブに入れておいてください。

 フロッピーディスクを作り忘れてしまった場合は、手動でも作成できます。
 フォーマット済のフロッピーディスクを用意し、C:\WINDOWS\repair\ 配下の asr.sif および asrpnp.sif をこのフロッピーディスクにコピーしてください。

2. Hyper-V 環境を準備する。
 Hyper-V 環境にゲスト OS 用の領域を割り当てておきます。
 このとき、システムドライブとなる vhd の容量は移行元のシステムドライブの容量と同じか、それ以上になるように設定します。
 この時点で前述にあったとおり、仮想フロッピーの設定も行います。

3. Windows Server 2003 インストーラーディスクを入れてゲスト OS を起動し、途中で ASR による復旧モードに入る。

 インストーラーディスクを入れてゲスト OS を起動するとインストールが始まります。
 程なくして Press F2 to run Automated System Recovery (ASR) というメッセージが画面下に表示されますので、ここで F2 キーを押すと、次の画面に切り替わります。



 フロッピーディスクを入れてくださいというメッセージですが、すでに仮想フロッピーディスクを設定してありますので、任意のキーを押すことによって、次のような画面が表示されます。



 C キーを押してパーティションの削除、修復を行うと、システムが一旦インストールされます。

 ある程度までインストールが進むと、インストーラがシステム状態のバックアップアーカイブを読み込もうとして以下のエラーが発生します。



 ローカル環境にバックアップアーカイブが無いのでこのようなエラーが発生するのは当然と言えば当然ですが、上記 1. の手順で作成した .bkf ファイルを DVD-R に焼いて読み込ませようとしても、この段階では Windows Server 2003 のインストーラが DVD ドライブの認識を行っていないようで、このバックアップアーカイブを読み込ませることができなかったため、この時点で自動復旧操作は断念しました。

 もし、同じような方法で ASR 操作がうまく行った方がいらっしゃったら、情報をいただけると幸いです。

 次回は手動システム復旧と、復旧後の注意事項についてまとめます。

2010-04-13

『売上猫くん on MySQL』開発日記 - 番外9 - 外部キー制約設定でのたうちまわる

システム開発、運用に様々なトラブルは付き物で、ストレスの元。 特に「マニュアル通りにやってるはずなのにできない、直らない」というのは凹む。 それでも最近は「トラブルも経験のうち」、「(自社の)ナレッジベースに入れてノウハウにしよう」、「ブログに書いて世の中に貢献しよう(笑)」とか、達観しはじめた。が、あまり長い時間、しょんもないことで時間を浪費すると、凄まじく凹む。

さて、今回は外部キー制約の設定について。ここでも凹んだというか、疲弊した。FileMakerのリレーションのところでそれらしきことは簡単にできる。 ただ、このシステムは折角MySQLをデータベースとして使うのだから、PHPやフレームワーク等の多言語、他環境での開発も視野に入れている(というより、実は、当初はFileMaker よりもCakePHPでのWeb開発が先行していたが、大人の事情で優先順位を変更した)。 であれば、MySQL側でできることはできるかぎりMySQLに任せた方が、開発効率が(システムのパフォーマンスも)上がる。 閑話休題。


データが入力されているテーブルに外部キーを設定しようと以下を実行。

alter table neko.estimatedtls
add foreign key estimatedtls(estimateId) references estimates(ID)
ON DELETE cascade ON UPDATE NO ACTION
,add index estimateId (estimateId);


いろいろシンタクスを弄ってみたが駄目。 そこでデータが無い同様のテーブルを作ってやってみると旨くいく。どうやら既存のデータに問題があるらしいことがわかったので、テーブルを一旦空にして外部キー制約を設定、データを取り込み直そうとするとエラーが出る。 MySQL有名某サイトにそれらしい記事を発見。 苦節2日、どうにか原因は分かった。親テーブルの参照キー(ID)にない外部キー(estimateID)が子テーブルにあることが原因らしい。 そこで、そのはぐれ者の子レコードを削除しようと以下を実行。

delete from estimatedtls where
(select ID from estimatedtls where estimateId not in
(select ID from estimates))

と、「Error Code : 1093 You can't specify target table 'estimatedtls' for update in FROM clause」と出る。 どうもこういうサブクエリはUpdataやDeleteでは使用できないらしい。しかたなく、サブクエリの結果をテンポラリテーブルに一旦納めて、それをwhere句に使用することにした。

create temporary table temp(id int);
insert into temp select ID from estimatedtls
where estimateId not in (select ID from estimates);
delete from estimatedtls where Id in (select id from temp);

結果、成功。 親テーブルに属さないはぐれ者の子レコードを削除できた。 そこで、上記の Alter table以下を再実行すると、めでたく外部キー制約を設定できた。 これにより、FileMakerのリレーションでの設定に関わりなく、見積を削除すると見積明細も自動的に削除されるようになった。
以上、めでたし。

追記(10/08/23)
MySQL Workbench 5.2.16 Beta のGUIを利用して外部キー制約を設定しようとすると、[Column]でフィールドのチェックボックスをチェックできないことがある。 どうもWorkbenchのバグのようだ。 この場合はしょうがないので、外部キーのSQL文を書いて実行すること。 尚、Workbenchの最新版では解消している可能性も。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-04-02

『売上猫くん on MySQL』開発日記 - 3 - FMからストアド、トリガ

単純な操作であってもFileMaker(以下、FM)からMySQLには実に多くのクエリが発せられてしまう。 これはシステムのパフォーマンスの低下を招く。 また、複数テーブルにまたがる処理とそれに伴う冗長なFMスクリプトはさらにパフォーマンスを低下させる。 よって、FMの組み込みのSQL発行機能に頼らず、ビュー、ストアドプロシージャ(以下、SP)、ストアドファンクション、トリガを用いて高速化を図ることが開発者には要求される。 (尚、高速化の手段としてい一時テーブル(Create temparary table)は、残念ながらFileMakerからは認識できない。痛い!)

◇SP(ストアドプロシージャ)を実行し、FM側で戻り値を取得する
FMには「SQLを実行」スクリプトステップがあるので、DB側で作成したSPを利用するには、クライアントPCにODBCを入れて、

   Call procedure(param1,param2...) 

と書いて、実行すればよい。 ところが問題がある。 FMはエラーを除き、実行した結果を返さない(MySQLの場合はエラーメッセージそのもので、SQLSTATEの番号は拾わないようだ)。 SQLに限らず、FM(特にWindows版)の外部アプリケーションとの連携の悪さは定評がある。実際、「メッセージ送信」を利用してVBSやコマンドプロンプトを実行しても送信しっぱなし、戻り値無し、で困った人も多いと思う。面倒な回避方法はないこともないが…
さて、今回は「SQLを実行」ステップの話である。この場合は比較的楽ちんな対策がある。SP側で結果をテーブルに書き込み、FMアプリ側から読み込めばいい。 以下、実装方法例。
  1. session(primary_key,return) テーブルを用意し、FMアプリ起動時にsession に行を追加し、FMアプリ上でそのprimary_key の値(pVal)を記憶する
  2. SPのコードの終りには、 update session set return=戻り値 where primary_key=pVal を追記する。
  3. 「SQLを実行」で、Call SP(pVal,......)  を実行。
  4. sessionテーブルレイアウトのpValのレコードに移動し、returnを取得。
かくして、FMアプリでも、SQLの戻り値を無理矢理取得できる。


◇SPをトリガから起動する
以前に書いたように上記の「SQLを実行」ステップを利用するにはクライアントPCにODBCがインストールされていなければならならい。 FMクライアント(ODBC無)→FMServer(ODBC有)→MySQL の場合、SPは使用できないのか?  答はNo、トリガからSPを起動すればよい。
具体的にはMySQL で トリガ実行専用の「trigs」テーブルを用意。FM側にもtrigsのレイアウトを作成する。trigsへのInsert発生時に上記SPが起動するように、 「CREATE TRIGGER trig_name after insert ON trigs」を書く。 最後にFM側で、上記で作成したtrigsレイアウトに移動し、レコードを新規作成(確定させた瞬間にSPが実行される)するように、スクリプトを書く。 尚、トリガでは、NEW.field を利用し、上述の pValやその他の必要情報をSPに渡す。


◇まとめ
一連の動きをまとめると以下のようになる。

FMアプリ起動→スタートアップスクリプトで、sessionテーブルにレコードを追加→sessionのユニークなpVal を取得しアプリ終了まで保持→trigsレイアウトに移動し新規レコード作成→SPが実行される→SPにより、pVal を持つ session レコードの return フィールドに戻り値が返る→その戻り値により、必要な処理を行う。

10/4/7 追記&修正

以上

2010-03-31

『売上猫くん on MySQL』開発日記 - 番外8 - insert...select構文とODBC

以下、ODBC 5.1.5だと×、5.1.6だとOK

INSERT INTO estimates(customerNo) SELECT customerNo FROM estimates WHERE ID=5

これ、痛い。 この構文使えずに困っている人、結構いるんじゃなかろうか? 回避方法も見つからないし。


参考サイト:Bug #42905


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-29

『売上猫くん on MySQL』開発日記 - 番外7 - FileMaker内にMySQLの一般ログを表示する

MySQL の一般ログをFileMakerで表示する方法。

1.MySQLのMySQLデータベースをDSN登録する。
2.my.ini に log-output=TABLE,FILE を指定。
3.以下をMySQLコマンドラインで実行。
mysql> SET @old_log_state = @@global.slow_query_log;
mysql> SET GLOBAL general_log = 'OFF';
mysql> ALTER TABLE mysql.general_log ENGINE = MyISAM;
mysql>ALTER TABLE `mysql`.`general_log` ADD COLUMN `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`id`);
mysql> SET GLOBAL general_log = @old_log_state;
4.MySQL を再起動。
5.FileMaker のリレーションシップで、上記1で作成したDSNのmysql.general_logテーブル選択。このとき、上記で作成した id を指定。(以下、略)

するとこんな感じでログを表示できる。


FMの自動発行SQLクエリで「?」が頭に点灯したら、ログをチェックするのがよろしいかと。

尚、FM標準コマンドでは general_log テーブルのログは削除できないので、truncate(テーブル内の全行削除) を使用する。以下はFMの「SQLを実行」ステップを使用して、truncate を実行。

参考サイト:一般クエリとスロー クエリのログ出力先の選択

2010/9/24 追記
ログが出力されない場合、mysqlコマンドで
SET GLOBAL general_log = 'ON';
を実行してみる。

2010/10/25 追記
id の属性に AUTO_INCREMENT を追加。

2010/10/15 追記
slow_query についても、上記の要領でFileMaker上に表示可能だが、ログ対象となるクエリ時間の閾値がデフォルトでは10(秒)になっている。この為、ログ書き込みされないと思いこんでしまう。このデフォ値は、my.ini で long_query_time = 1 とするか、set global long_query_time = 1 を実行することにより変更できる。



関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-27

『売上猫くん on MySQL』開発日記 - 2 - 開発環境

『売上猫くん on MySQL』の開発環境は以下の通り。


アプリケーションファイル(NekoApp.fp7)は、FileMaker Server Advanced 10(以下、FMServerAdv)上に置き、開発PC1、2、3及び開発Mac 10.6 の FileMaker Pro Advanced 10(以下、FMPA)からそのファイルにアクセスして開発を行う。FMServerAdv を使用する理由には、複数人が開発を安定して行えること、オンラインバックアップがスケジュールできる、という2点が挙げられる。 
サーバ側にODBCをインストールしておけば、クライアント(開発PC)にはODBCは不要である(例外は後述)。
アプリケーション/ODBCの配布・アップグレードの容易さを考えれば、この構成は運用においても一考の価値はあると思う。 
なお、図の「開発PC3 Win2008/TS」は Terminal Service を載せたWindows Server 2008機で、各クライアントがリモートデスクトップ接続によりFMPAを起動し、FMServerAdv にアクセスできるようにしている。(もともと、FileMaker は Terminal Service との相性が良く、Ver5位より常用しているが、近年のTerminal Service はローカルプリンタへの印刷、ローカルディスクの利用も格段に簡単にできるようになり、加えて接続遮断時にも接続を自動で復旧してくれたりする)。

前述のように FMSA (FileMaker Server無印も同様)にODBCをインストールすればクライアントにODBCを入れる必要はないが、例外がある。それは「SQLを実行」スクリプトステップを使用する場合である。 FileMaker は通常、開発者自らSQLを記述する必要はないが、FileMaker が用意していないコマンドを実行する場合は「SQLを実行」を使用する。また、FileMaker の外部DBに対する処理の中には非常に遅いものがあり(激遅処理)、その典型的なものに多数のレコードに及ぶ一括処理がある。CSV等のファイル取込、全置換、ループ等がそれである。 その回避策として 「SQLを実行」スクリプトステップにSQL文を埋め込み実行すると直接外部データベースに素のSQLが送られるので、FileMakerのレコード取込やループ処理を使うのに比べれて、桁違いにパフォーマンスが向上する。尚、FileMaker の外部DB使用時の激遅処理については、機会を改めて書きたい。

さて、開発PC1、ここには予備用のMySQLを入れ、リストアやリカバリをテストを行うので、データベースを全部削除したりとか無茶をやる。無茶をやると「あー、なるほど」と新たな発見もあったりする。また、ローカルにアプリケーションファイル(NekoApp.fp7)を置いても、FMSAサーバの環境と同様に諸機能が動作するかのチェックも行う。


以上

『売上猫くん on MySQL』開発日記 - 番外6 - リモートのログを mysqlbinlog できない

市販のソフトウェアでログ(MySQLではバイナリログ)からのリカバリ機能を実装しているものはあまり無いような気がする。 以前、某有名財務ソフトのSEに、「ログからのリカバリはできるんですか?」と聞いたことがある。 答えは「そういうのが必要なときは、うちのSEがやりますよ」とのこと。 確かに、下手にユーザがリカバリを行うと大変なことになるので、こういう機能は組み込まないのが正解なのかもしれない。 また、小中規模のデータベースシステムなら、フルバックアップを日に何回か取って、障害発生時には最新のフルバックアップでリストアまでし、最終フルバックアップ以降の更新は、ユーザがせっせと入れる、というが実態なのかとも思う。 また、“ユーザがせってと”できないようなクリティカルなシステムは、自社のシステム管理者や外部のSI業者がしっかりリカバリする体制ができているのだろう。 

さて、『売上猫くん on MySQL』には、一応、バックアップ、フルバックアップからのリストア、バイナリログからのリカバリ機能を実装する予定で、バイナリログからのリカバリをテストしている。 MySQLが載っているサーバ機を使用し、そのサーバ上のログによりリカバリ(mysqlbinlog)を実行するのは、マニュアル通りに動く。 
ところが、ローカルPCからリモートサーバ上のログをリモートサーバに対してリカバリすべく下記を実行すると失敗する。

> mysqlbinlog --disable-log-bin --read-from-remote-server //remote-server/***/log-bin mysql --user=root --password=passord --host=remote-server --database=neko"

例によってググりながら、疑わしきところを弄りながら、異なる2台のサーバに対して試すこと数時間。 どうしても「Misconfigured master - server id was not set」 とか、「error reading packet from server: binary log is not open」みたいなエラーが出力される(この2つのエラーはレプリケーション絡みで出力されるようだが…)。

諦めかけたところ、いきなりプロンプト画面に正常な出力が行われる。データを見ると、確かに更新分が反映されている。そこで実行文を見直してみると、--read-from-remote-server を入れ忘れて実行していた。結果、成功。
--read-from-remote-server はマニュアルによると、「バイナリログをローカルファイルから読み取らずにMySQLサーバから読み取ります」とあるので、このオプションは必要と思ったのだが…

結局、半日以上を費やして、--read-from-remote-server の正しい使用方法は分からずじまいだが、目的は達したので良しとしよう。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-26

『売上猫くん on MySQL』開発日記 - 番外5 - ポータルで検索できない

MySQL等の外部DBを使用し、複数のリレーションを設定したポータル内では、検索を実行できません。 たとえば、売上と売上明細のテーブルを[売上No]と[区分]という二つのフィールドでリレートし、ポータルに売上明細のフィールドを置き、これらで検索しても失敗します。
FMのバグでしょう。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-23

『売上猫くん on MySQL』開発日記 - 番外4 - mysqldump で文字化け?

mysqldumpで作成したテキスト(sql)ファイルを WordPad で開いてみる。 文字化けだらけ。
MySQLクライアントを使用しても、phpMyAdmin を使用しても結果は変わらず。ただ、phpMyAdminで実行結果を画面に出力するとちゃんと表示される奇怪。
「mysqldump 文字化け」でググってみるといろいろと記事があり、それを見ながら --default-character-set やら、my.ini やらでいろいろ試してみるが解決には至らず。 
半日ほど頑張ってみたが埒があかないので、念のため、隣の人に聞いてみた。すると「WordPadを使ってませんか?」 。 「はぁ?」 、固まる小生。 WordPadって、NotePadの上位エディタじゃないの? NotePadで 確かに、NotePadは UTF-8とUnicodeの保存オプションがあるのに、 WordPadにはUnicodeのみ。 読み込みできるキャラクタセットが違うらしい。 WordPad のUnicodeはUTF-16LE対応.
Notepadはこれに加えてUTF-8対応。 あー、とんんだ恥さらし記事だけど、小生の同類がいるかもしれないので、恥を忍んで上げておこう。


関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-22

『売上猫くん on MySQL』開発日記 - 番外3 - 0を書き込みできない

売上明細テーブル( vw_salesdtls)のInt型のフィールド(balanceFlg)に値を書き込もうとする。他の値は書き込みできるのだが、“0”の書き込みが実行できない。 ログで何が起こっているのか確認する。

Commitに失敗している場合はバイナリログには記録されないので、mysqlbinlog は使えない。 そこで、一般ログというものを、

mysql> set global general_log="ON";

で作成してみる。 以下、1を立てて成功したログと、0で失敗したログ(一部抜粋)。

【1立てで成功】
9 Query SELECT ID,`売上番号`,balanceFlg, ~略~ FROM vw_salesdtls WHERE ID=8340 FOR UPDATE
9 Query UPDATE vw_salesdtls SET balanceFlg=1 WHERE ID=8340

【0立てで失敗】
8 Query SELECT ID,`売上番号`,balanceFlg, ~略~ FROM vw_salesdtls WHERE ID=8341

失敗したほうでは、なぜか FOR UPDATE 以下が発行されず、当然これでは更新できない。 当初はInnoDB側に何か問題があるのかと疑ったが、FileMakerが適切なクエリを発行していないことがわかった。 ちなみに、類似した他のテーブルでは、1、0の値に関係なく、更新(Update)は成功する。

いろいろとやってみた。FMのファイルを修復したり、レイアウトモードにして数字の書式を変更してみたり、フィールド定義を眺めてみたり。 そして、これが FileMaker のバグだと判明。 なんと、FileMaker は 空欄(null)→0 への変更は変更と認識しない、null=0 と認識するのである。 更新と認識しないので、 Update が発行されない。 恐ろしい。

結論
ということで、null と 0 を区別して扱う必要がある場合は、非常に注意が必要だ。 0 を参照キーするのは極力避けるべきた。 MySQL側で初期値を0に設定しておく、というのは一案かもしれない。
ちなみに、上述のように「null=0 と認識」するので、0→空欄lに変更を行っても、コミットすると 0 のままである。



関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-16

『売上猫くん on MySQL』開発日記 - 番外2 - MySQLミラーサイト

MySQL サイトが今朝から落ちてる。 レファレンスマニュアルが見れない、つまり開発できない。Googleのキャッシュは遅すぎる。 MySQLの全機能を網羅し、信頼の置けるドキュメントはここにしかない(と思う)。「MySQLの開発者はこういうときどうしているのだろう?」等と思いつつ、、、ミラーサイトをみつけた。これタイの大学のサイト。Googleキャッシュよりはずっと早い。 この大学のトップページにはなぜか秋篠宮殿下が…



関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-15

『売上猫くん on MySQL』開発日記 - 番外1 - 全データベース削除→リストア

あるサーバにあるデータベースダンプを別のサーバに移動。その後、MySQLのすべてのデータベースを削除し、リストアのテストを行おう思い、まず、

> drop database information_schema
(だったと思う)

を実行してみた。 すると、「information_schemaは削除できない」旨のメッセージが表示される。
その後、mysqlを再起動しようとするとエラーが出て起動しない。 データフォルダをみると、mysqlを含むすべてのデータベースは削除されている。エラーログをチェック(←これ大事)すると、 mysql データベースは起動に必須らしい。そこで、元のサーバから無理やりこのmysql フォルダをコピーし(サーバ停止無、こんなことやっていいいのか?)、丸ごと、起動しなくなった別サーバ内にコピー。 その後は再起動できた(ここまで半日潰れる)。

そこで、

> show databases

を実行すると、やはり表示されるのは、mysql データベースのみ。 そこで、コマンドプロンプトからリストアを実行すると、以下のようなエラーが出る。

InnoDB: Error: table test/parent already exists in InnoDB internal
InnoDB: data dictionary. Have you deleted the .frm file
InnoDB: and not used DROP TABLE? Have you used DROP DATABASE
InnoDB: for InnoDB tables in MySQL version <= 3.23.43? InnoDB: See the Restrictions section of the InnoDB manual. InnoDB: You can drop the orphaned table inside InnoDB by InnoDB: creating an InnoDB table with the same name in another
InnoDB: database and moving the .frm file to the current database.
InnoDB: Then MySQL thinks the table exists, and DROP TABLE will
InnoDB: succeed.

InnoDB内部の記録と不整合があるらしいので、一旦、同名の空のデータベースを作成し、それを削除したあとにもう一度リストアをやってみるとやっと成功。 めでたし、めでたし

参考サイト:トラブルシューティング InnoDB データ ディクショナリ操作



関連リンク:『売上猫くん on MySQL』開発日記の記事一覧

2010-03-03

SonicWALLの新製品テクニカルセミナー

先日、SonicWALLの新しいTotalSecure TZシリーズ(TZ100/TZ200/TZ210のセミナーに行ってきた。

セミナーは2時間で最初の一時間がマーケ、後の一時間がテクニカルな内容であった。以下、その備忘録。

マーケ
2008年、UTM製品の国内の出荷台数シェアは、Juniper(NetScreen)、SonicWALL、Fortinet、Cisco、Checkpointの順。 同年の金額によるシェアは、Fortinet、Juniper、Cisco、SonicWALL、Checkpointの順。 Sonicは台数は出てるのに金額が低い、つまり、Sonicは中小向けの安いUTM製品に強みを持っている。

あと、営業さんが資料等で強調していたのは、「他社製品に比べ、コストパフォーマンスがいいですよ」ということ。


テクニカル---新製品の特徴
  1. TZ180以前の機種で標準付属していたSonicOS Standardが無くなり、全機種がEnhanced(5.x) に統合された
  2. TZ180に比しUTMパフォーマンスが2.5~5倍Up(10Mbps→25Mbps~50Mbs)
  3. GAVシグネチャーが上位機種(NSA?)と同等に。 TZ100も?
  4. アプリケーションファイヤウォール(TZ210のみ)
  5. SSL-VPN(ユーザ数:1~10、機種/オプションにより異なる)
  6. 冗長構成 --- 予備機(同機種)を一台用意し、障害発生時に切り替えて運用
アプリケーションファイヤウォールは近頃流行らしく、WinnyやSkypeといった企業にとって都合の悪いアプリの通信を遮断、またはユーザ毎に管理できる。 また、企業がブラウザをFirefoxに統一しようとする場合、IEによる通信を遮断してしまい、間接的にFirefoxのインストールを強制する、という使いかたもあるらしい。 社員が一杯いたらGoogle Chrome をインストールしてシークレットモードで使おうとする不心得者もいる筈だが、どこまでのアプリケーションに対応可能なのか、アプリケーションのシグネチャはカスタマイズできるのかは、次回聞くことにしよう。 確か、カスタマイズはできると記憶している。

エンジニアは、TZより上位のシリーズはマルチコアCPUによりDPI(パケットのIPヘッダ部分だけではなく、データ部分を検査する機能)が高速化されていることを強調していた(が、今回のTZとは関係ないので、"マルチコアアーキテクチャ"と言いたかっただけと違うんかと)。
また、RFDPI(Reassembly Free Deep Packet Inspection)も強調。本機能は、他メーカー機と異なり、パケットをメモリ上に展開すること無く直接検査するため、非常に高速だとか。 こちらはTZシリーズでも採用している。
この2つの機能はSonicWALLの"売り"であるらしく、昨年のハイエンドのE-Class(ベンツかいな)のセミナーでも濃い説明があった。


尚、今回配布された「かんたんUTM導入ガイド」という小冊子(非売品)には、UTMのことがとてもよくまとめられている。 巻末の 文言によるとこの小冊子は、アスキーの「NETWORK MAGAZINE」の08/9月~09/2月号でSonicWALLのエンジニアが書いた記事を再編集したもの、とのこと。



以上

見つけモノ
SonicWALLのYouTube動画サイト(英語)

2010-02-19

サイト証明書の更新方法

 SSL で Web サイト証明書を使っている企業は多いと思いますが、事務所移転やサーバ移転等の理由から、内容を一部変更してサイト証明書の更新を行いたい場合があると思います。
 Windows Server 環境の場合は、もう一つ仮想 Web サイトを用意すれば、比較的容易にサイト証明書の更新申請を行うことができます。

 手順は次のとおりです。

1. 仮想 Web サイトの準備
 IIS の場合は、「規定の Webサイト」の他に「管理者のWebサイト」が用意されていますので、「管理者のWebサイト」を使うだけで問題はありませんが、必要に応じて Web サイトを追加してください。
 以下の図のように、仮想 Web サイトは停止中のままでかまいません。


2. CSR(証明書発行要求書)の発行と証明書申請
 仮想 Web サイトの「ディレクトリのセキュリティ」タブより CSR の発行を行います。

 途中、証明書の名前や組織名といった情報を求められますが、ここで最新のものを入力していきます。
 この画面より発行した CSR を、証明書発行サービスサイト(Global Sign 等)の証明書更新申請画面の CSR 欄に貼り付けて申請を行うと、更新済のサイト情報で証明書の発行が可能となります。

 Global Sign 社のマニュアルに詳しく発行方法が記載されていますので、それに倣って CSR を作成し、証明書更新申請画面の SCR 貼り付け欄に貼り付けて申請を行うと便利でしょう。

(参考)[CSR生成] Microsoft Internet Information Services 6.0(新規)の CSR 発行方法

『売上猫くん on MySQL』開発日記 ― 1 始めに

昨年1月にFileMakerの新バージョンがリリースされ、ややモチベーションがアップ。 大人の事情によりMySQL 版の「FlexSql売管」は取り止め、暇をみつけて「売上猫くん 4.5」の MySQL版を作ろう、と思い立ったのが去年3月。 今後、当Blogではこの開発工程を綴ります。

概要
「売上猫くん4.5」の後継バージョン『売上猫くん on MySQL』、を、FileMaker Pro 10/MySQL 5.1 を使用し開発する。 完成後、『売上猫くん on MySQL』を流用し、データベースにFileMakerを使用した『売上猫くん5.0』、MS SQL-Server を使用した『売上猫くんon MSSQL』を開発する。可能であれば、最終的に3つのシステムが同一のFileMakerファイル上で動作するようにし、アップグレードを含む開発効率のアップを図る。

システム要件
  • 基本機能は「売上猫くん 4.5」に準じる
  • 見積/売上登録時の取引先/商品の入力方法改善
  • マルチウインドウ対応
  • データベースバックアップ/リカバリ機能(MySQL/MSSQLのみ)
  • ユーザ管理/ログイン機能
  • ユーザインターフェイスの改善

開発環境
データベース:MySQL Community Server 5.1.30
開発ツール
 FileMaker Pro Advanced 10 (Windows/Macintosh)
 MySQL Administrator (→開発終了!)
 phpMyAdmin
 MySQL Workbench
ドキュメント作成
 A5:SQL Mk-2
サーバ(MySQL用)
 CPU: Dual-Core AMD Opteron 1212 2GHz/8GB RAM
 OS: Windows Server 2008 Enterprise
ODBC: MySQL ODBC 5.1 ドライバ




2010/12/16 開発ツール加筆、記事一部削除

2010-01-26

The Same Trouble Again in FMS10 Installation

I mentioned how to "forcibly" fix incompatibilities between FileMaker Server 9 Advanced, IIS, and Java in the article on June 16, 2008, and once again, the same trouble took place with FileMaker Server 10 Advanced!
Being a little smarter this time around, I fortunately found a way to handle this trouble without reinstalling Java, IIS, and FMS10.

The followings are what have happened and how I fixed the problem:

- What I did and what happened -
1. Uninstalled FMS9 first, since FMS9 had already been installed on this Windows Server 2003 to prevent incompatibility between FMS9 and FMS10.
2. Installed FMS10 and added php to IIS via FileMaker Server 10 Admin Console, however, the previously installed ASP.NET's behaviour became odd enough that my web browser would not load .aspx files any more.

* This trouble did not take place when I clean installed FMS10 on a 32-bit version Windows Server 2008, so the symptom could be caused if you uninstall an older version of FMS before installing FMS10 or try to reinstall FMS10.

- How I fixed it -
If you install FMS9/10 when the IIS has alreay ASP.NET installed, some parts of ASP.NET would stop functioning properly. So, you can fix this by reinstalling ASP.NET.

1. Just in case, take a backup of wwwroot and the subsidiary directories.
2. Install FMS10 and check out if your browser is able to load .aspx files from the web server. If not, go on to the next step.
3. Choose [Control Panel] -> [Add and delete programs] in Windows Server 2003, and highlight [Application Servers] from [Add and delete Windows components]. Click "Details...", deselect [ASP.NET] from the list shown, and click "OK."
4. Click "Next" to uninstall ASP.NET.
5. Restart IIS Admin Service and World Wide Web Publishing Service. Make sure ASP.NET is not listed on [Web Service Expansion] in the IIS.
6. Choose [Control Panel] -> [Add and delete programs] in Windows Server 2003, and highlight [Application Servers] from [Add and delete Windows components]. Click "Details...", tick off [ASP.NET] from the list shown, and click "OK."
7. Restart IIS Admin Service and World Wide Web Publishing Service. Make sure ASP.NET is listed with the version number on [Web Service Expansion] in the IIS.
8. Make sure that your web browser loads .aspx files properly. Also check out if php works accordingly.

2010-01-25

FMS10 のインストールでもトラブル発生

 2008/06/16 の記事で FileMaker Server 9 Advanced のインストールトラブルと無理矢理とも言えるトラブル回避策について書きましたが、今回 FileMaker Server 10 Advanced のインストール時にも同様の現象が発生したので、アプリケーションの再インストールをしない方向で対応してみました。

 以下、現象と対応方法です。

【現象】
 Windows Server 2003 に FMS9 がすでに入っていたため、FMS9 をまずアンインストール。
 その後、FMS10 をインストールしてから、FileMaker Server 10 Admin Console から php 機能を IIS に追加すると、IIS にインストールされていた ASP.NET 環境の挙動がおかしくなる。
 Web ブラウザから .aspx ファイルが読み込まれなくなる。

 Windows Server 2008 (32bit バージョン)にクリーンインストールした FMS10 ではこの現象は発生しなかったため、旧バージョンの FMS アンインストールや、FMS10 の再インストールを行うと発生する現象の可能性がある。

【対応】
 IIS に ASP.NET がすでに稼働中の状態で、FMS9/10 をインストールすると、ASP.NET の機能の一部が正常に動作しなくなるようです。このため、ASP.NET を再インストールすることで解決します。

1. 念のため、wwwroot 以下の環境をバックアップしておきます。
2. FMS10 をインストールし、.aspx ファイルが読み込めるかどうか確認します。読み込めなかった場合は次のステップに進みます。
3. Windows Server 2003 の「コントロールパネル」→「プログラムの追加と削除」を選択し、「Windows コンポーネントの追加と削除」より[アプリケーションサーバー]を反転させ、“詳細”ボタンをクリックして[ASP.NET]のチェックを外し、“OK”をクリックします。
4. “次へ”ボタンをクリックすると ASP.NET がアンインストールされます。
5. IIS Admin Service、World Wide Web Publishing Service を再起動し、IIS マネージャーの「Web サービス拡張」にASP.NET が登録されていないことを確認します。
6. Windows Server 2003 の「コントロールパネル」→「プログラムの追加と削除」を選択し、「Windows コンポーネントの追加と削除」より[アプリケーションサーバー]を反転させ、“詳細”ボタンをクリックして[ASP.NET]のチェックを付け、“OK”をクリックします。
7. IIS Admin Service、World Wide Web Publishing Service を再起動し、IIS マネージャーの「Web サービス拡張」にASP.NET がバージョン入りで登録されていることを確認します。
8. Web ブラウザを使って .aspx ファイルが読み込めたら成功です。php 環境も動作するか併せて確認してみてください。

2010-01-19

Dell のファン交換でハマる

 個人で使用している Dell600SC を起動すると BIOS から以下のメッセージが表示されるようになりました。

Alert! Back system fan was not detected.
Strike the F1 key to continue, F2 to run the setup utility.

 ケースカバーを外して電源を入れてみると、確かにケースファン(FAN2)が回転しなかったため、ファンを交換することにしました。マザーボードに挿さっていたファンは JMC/DATECH の 1238-12HBTA-4 というモデルです(写真左)。



 今回購入したのは KAZE-JYUNI SY1225SL12SH という 12cm, 1900RPM というタイプのファンです(上記写真右)。

 ファンをセットし、コネクタを挿そうとしましたが、コネクタの形状がマザーボードのコネクタスロットに合わず、挿せませんでした。以下の写真のように、DELL で提供されているファンは平型のコネクタで、市販のファンは多少厚みのあるコネクタになっています。

 暫定策として、コネクタを 4 ピン電源ケーブルに変換し、HDD の電源ケーブルとつないでファンを回していますが、これですと BIOS の FAN2 コネクタの接続状態が検出できないため、上記の BIOS エラーが解消しません。


 そこでこのコネクタを変換するためのケーブルをネット検索しましたが見つかりませんでした。
 量販店で聞いてみたところ、DELL の部品コネクタは特殊な形状をしており、市販されていない場合があるということで、このファンのコネクタもそれに該当してしまったようです。

 ここで考えられる対策は次のとおりです。

1. ダメ元でコネクタ変換ケーブルを扱っている業者のページをもう少し頑張って検索する。
2. コネクタのプラスチック部分を削って挿せるようにする。
3. DELL のコネクタ部分を新しいファンのコネクタ部分に半田付けする。
4. 正規品の DELL ケースファンを取り寄せる。

 2. と 3. の方法はケーブルコネクタそのものを加工してしまうので、失敗するとその時点でアウトですが、どっちみちダメなら最終手段として試してみる価値はあるかもしれません。

2010-01-14

通信環境の常識はもはや変わった! 海外出張装備2010

http://ascii.jp/elem/000/000/489/489323/

Mac Mini を使ってみる

 弊社の Mac OS X 環境を最新のものにするため、Mac OS X 10.6 Snow Leopard がプリインストールされている Mac Mini を購入して動かしてみました。
 以下、Mac Mini の接続とセットアップについて書いてみることにします。

さっそく接続

 Mac Mini には モニタ、マウス、キーボード等の周辺機器が付属していないため、Windows 環境で利用している 2 台切替用の KVM スイッチにこの Mac Mini を接続しました。


(Mac Mini を KVM スイッチに接続したときの様子)

 現在使っている KVM スイッチは、ELECOM 社の KVM-KP2N というモデルです(Shift + Scroll Lock キーでマシン切替)。 上の完成写真をご覧頂くとわかるように、PS/2 マウスおよび PS/2 キーボードのコネクタと、VGA 端子による構成ですので、Mac Mini 本体に接続するには、USB 変換、VGA 変換が必要となります。

 PS/2→USB 変換は ELECOM 社の USB-P2KM という変換パーツを使い、キーボード・マウスの 2 つのPS/2 端子を 1 本の USB 端子に纏めました。

 Mac Mini に付属のビデオケーブルは DVI なので、これを VGA に変換する必要があるのですが、変換パーツがネットショップで見つからなかったので、Apple 社純正品の Apple Mini DVI-VGAアダプタを別途購入して繋げてみました。 
 Mac Mini に電源を投入すると、モニタ、マウス、キーボードが無事認識されましたので、私と同じように、既存の VGA モニタ、PS/2マウス・キーボードを Mac Mini で共有してみたい方は参考になるかもしれません。

ここまでは良かったが...キーボードで日本語が打てない

 Windows 用の JIS 配列キーボードを Mac 環境に接続した直後は、英数字は打てても日本語が打てません。これはキーボード配列が Mac OS 環境に登録されていないことと、Windows 環境で使っている JIS キーボードの配列が Mac 環境では異なる理由からのようです。
 当然、コマンドキーに相当するキーが認識されない関係で、ことえり切り替えのショートカットキーも利きません。
 いろいろ探し回った結果、以下の有難いサイトに辿り着きました。

Windows用USBキーボードをMacで使う

 このサイトでは、Windows キーボードが Mac で認識されない理由だけでなく、Windows 用のキーボード配列を Mac OS に認識させるファイルのインストーラーまで配布されています。詳細は上記ページをご覧頂くとして、早速インストールと設定を行ったところ、ことえりで日本語入力ができるようになりました。
 ただし、前述したように、コマンドキーに相当するキーは認識されないため、コマンドキー + スペースバーによることえり/英数字切り替えはできません。
 この代わりとして、以下のように [Caps Lock キーの機能]を以下のように設定することで CapsLock キーを押すたびに英字と日本語入力が切り替わるようになります。


その他試した設定

ここまで準備できたら、今後の運用のために必須のマシン環境を整えていきます。
1.ClamXav のインストール
Mac OS 向けに無償で配布されているアンチウィルスソフトウェアです。以下のサイトからダウンロードしてインストールしました。
ClamXav
 常駐監視機能はないようですが(ざっと読んだだけでは見当たらなかった)、定義もまめに更新されているようですので、手動ウィルススキャンツールとしてインストールしておくと良いと思います。
 なお、Server 版の Mac OS X 10.6 Snow Leopard には ClamXav がバンドルされているようです。

2. VNC
 Mac OS 環境を VNC クライアントから閲覧できるようにするには、「システム環境設定」→「共有」を選択し、「画面共有」メニュー項目を選択して“編集...”ボタンを押し、以下のように「VNC 使用者が画面を操作することを許可」という項目にチェックを付けます。


これで VNC クライアントからこの MAC OS の画面を参照できるようになります。接続時が確立された直後に "WriteExact: Socket Error while writing." というエラーメッセージが表示されることがあります。

 接続時の Quick Option が AUTO (auto select best settings) になっていることが原因ですので、他のオプションを選択して接続してみてください。


3.Windows Active Directory への参加
 Windows Active Directory 環境からこの Mac Mini にアクセスさせるには、「システム管理設定」の「共有」から設定を行います。
 左ペインに表示される共有項目より、「ファイル共有」にチェックを付け、右ペインの“詳細設定”ボタンをクリックするとダイアログが表示されますので、この中から「SMB(Windows) を使用してファイルやフォルダを共有」にチェックをつけて、Mac Mini のデフォルト認証アカウントを選択しておきます。


 このダイアログを閉じ、共有するフォルダやディスクを登録し、アクセス権限を付与します。


 次に Active Directory への参加権限を Mac Mini のアカウントに付与します。
 「システム管理設定」の「アカウント」を選択し、表示されるダイアログの左ペインより、「ログインオプション」を選択し、右ペインの一番下に表示されている「ネットワークアカウントサーバ」の“接続...”ボタンを押して Active Directory ドメイン名を入力します。


 すると、次のように[クライアントコンピュータ ID](デフォルトで入力されているので変更不要)、[AD 管理ユーザ]、[AD 管理パスワード]入力欄が表示されますので、Windows Active Directory で使用しているドメイン管理者名およびパスワードを入力し、“ディレクトリユーティリティを開く...”ボタンを押します。


 すると「ディレクトリユーティリティ」ダイアログが開きますので、この一覧に表示されている「Active Directory」にチェックを付けてダブルクリックすると、以下のような画面が開きますので、内容を確認して“バインド...”ボタンを押すと、MacMini が Active Directory 環境で認識されるようになります。

 これで、Windows のエクスプローラからこのマシンおよび共有フォルダにアクセスできるようになります。

がしかし、Mac Mini から Active Directory が参照できず...。

 上記のように設定を行い、Active Directory から Mac Mini 環境にアクセスできるようになったのは良いのですが、未だ Mac Mini 環境から Active Directory を参照できていません。
 Finder から共有(ネットワーク)を見ようとすると、という寂しいアイコンが一つ表示されたままです。
 因みに、Mac OS X 10.3 Panther の頃はここでドメインの一覧が表示されるようになっていたのですが、同じように閲覧できるようにするには、この他にどのような設定を行えばよいのでしょうか...。

 この解決方法をご存じの方がいらっしゃいましたら、情報をいただけると幸いです。

2009-12-25

FileMaker V10による在庫管理、一考 その3

前回作成した在庫アプリ(ZaikoTestV0.fp7)の課題メモ

0.在庫と商品のテーブル分離
複数ユーザによる同時アクセス競合をできるだけ回避するため、在庫と商品のテーブルは分離し、在庫以外の商品情報はもっぱら商品テーブルに持たせる。 在庫テーブルは在庫データ専用とする。

1.競合発生時の処理
1-1 書き込みループ 
ZaikoTestV0.fp7では在庫更新時に競合エラーが発生すると、最終保存時点までRevert(ロールバック)してしまうので、競合するユーザの在庫書き込み処理が終了し、自身の在庫書き込みが成功するまで、書き込みをループさせる(最大ループ数有)。

1-2 遅延オプション
FileMaker Server 10 Advanced を使用すると、スペック的には999ユーザまでが同時アクセス可能となる。 つまり、最大999ユーザが特定の商品の在庫数を同時更新する可能性がある。
人気の新商品のリリース時に膨大な数の受注が想定される場合は、逐次処理を行うのではなく、一定間隔で明細レコードを集計して、在庫を更新するようなオプションを考慮する。 もちろん、在庫の算出は、“一定間隔”の分、遅延する。

2.在庫算出時点
特定の日付を指定して、その日付時点の在庫数を算出する場合は、「商品別末日時点在庫テーブル」を作成して月次処理を行い、この際に各商品の末日時点の在庫数をこのテーブルに書き込む。
これにより、日付指定により在庫を算出する場合でも、クエリの対象となるデータを最大1~2カ月程度に限定できる(高速化)。

以上


【関連リンク】


2012/8/1追記:
当社の在庫管理の講習で使用してるサンプルシステム「FMEasy在庫」を公開しました。フリー版/開発版のダウンロードは→こちら

【FMEasy在庫 の画面】

2009-12-24

FileMaker V10による在庫管理、一考 その2

前回作成した在庫アプリは新規出庫しか在庫と連動していなかったので、出庫伝票の更新/削除時も在庫が変更するように、修正してみた。 どんなものか見てみたい方は下記からどーぞ(パスワードはかかってませんよ)




【関連リンク】

2012/8/1追記:
当社の在庫管理の講習で使用してるサンプルシステム「FMEasy在庫」を公開しました。フリー版/開発版のダウンロードは→こちら

【FMEasy在庫 の画面】

ODBC ドライバ DataDirect SequeLink を使って FileMaker Pro にアクセスしたときの問題点

 FileMaker Pro 対応の ODBC ドライバは DataDirect SequeLink となっていますが、今回はこのドライバを使って FileMaker Pro にアクセスした場合の問題点について書いていきます。

備考:
1. php から ODBC 接続する方法として PDO を使っています。PDO を有効にするには、php.ini の以下の行を追加し、Web サーバを再起動しておく必要があります。

  extension=php_pdo.dll
  extension=php_pdo_odbc.dll

2. PDO ではシステム DSN を指定する必要があるため、SequeLink ドライバを指定して適当な名前のシステム DSN を事前に登録しておく必要があります。
php ソースの記述例は次のとおりです。
//$dbh = new PDO ("odbc:DSN=データソース名;UID=ユーザー名;PWD=パスワード");

try {
     $pdo = new PDO("odbc:dsn=test;host=127.0.0.1", "Admin", "somePWD");
 $sql = "select * from testdb where recno=1";
 $rec = $pdo->query($sql);
               //レコードセットから特定の列を取りだすときは bindColum を使用
 $rec->bindColumn("ID", $ID);
     $rec->fetch();

 echo $ID;

} catch(PDOException $e){
    var_dump($e->getMessage());
}

 上記のような php スクプトを連続操作を実行すると、ODBC ドライバの動作が不安定になることがわかりました。
 
 返されたエラーは次のとおりです。

1) Session refused by service, connection closed.

 このエラーはサーバプロセスが接続要求を受理できなかったときに発生します。
 このエラー発生後、FileMaker Pro ファイルを閉じたり、一度 Windows をログオフしたりしたのですが、それでも現象が改善せず、マシンを再起動することによってようやく復旧しました。

2) Maximum number of sessions reached.

 このエラーは設定済のアクティブセッション数を超過した場合に発生し、その後のクライアント接続要求は拒否されてしまうようです。
 このエラー発生後、ファイルメーカー Pro ファイルを一度閉じることによって復旧しました。

 以下のサイトにエラーコードの一覧が用意されていますので、その他のエラー内容と原因も参照できます。
SequeLink のエラーメッセージ一覧

 ただ、これだけ動作が不安定だと、ODBC 接続実験としては面白いですが、とても運用レベルには耐えられないという印象です。また、CD に付属の SequeLink は 64bit 対応ではないため、別途購入する必要がある(しかも金額不明)というのも利用者を遠ざける原因になってしまうかもしれません。
SequeLink® 5.5 Client for ODBC 製品紹介ページ


ODBC 接続に関する続きの記事はこちら:
API 別/サーバ別FileMaker カスタムWebパフォーマンス比較

2009-12-22

IIS の php から FileMaker Pro ファイルをオープンするのに四苦八苦

 Windows Server 2003 の IIS で php ファイルから FileMaker Pro ファイルを開くという操作を試しているのですが、どうもうまくいきません。

【目標】
 IIS で公開されている test.php というファイルからサーバディスクに配置した dbopen.vbs を起動し、vbs から FileMaker Pro ファイル test.fp7 を開く。

dbopen.vbs の中身は次のとおりです。ここでは、FileMaker Pro アプリケーションのインスタンスを作成し、それからローカルコンピュータの test.fp7 を開いて showMSG というスクリプトを実行するという流れになっています。このファイルを作って単独で実行すると正常に動作することは確認済みです。


Dim FMApp
Dim FMDocs, myOpenFile

Set FMApp = CreateObject("FMPRO.Application")
FMApp.Visible = True
Set FMDocs = FMApp.Documents
Set myOpenFile = FMDocs.Open("c:\hoge\test.fp7" ,"Admin","somePwd")
myOpenFile.DoFMScript ("showMSG")

Set myOpenFile = Nothing
Set FMDocs = Nothing
Set FMApp = Nothing



【試した操作】
1. IIS 経由で php を実行すると、その実行者は IUSR もしくは NETWORK SERVICE になるため、実行権限を必要なファイル群に与える必要があります。dbopen.vbs は WScript.exe から起動させるため、System32 ディレクトリの中にある WScript.exe に IUSR の実行権限を付与しました。
2. これだと dbopen.vbs で CreateObject を使って FileMaker のインスタンスを作成する時に書き込みエラーが発生するため、IUSR ではなく、ログイン中のユーザアカウントで実行できるよう、PsTools の psexec.exe を使って vbs のみログインユーザ権限で実行するようにしました。

PsTools の紹介とダウンロードはこちら

以下のように test.php のソースに指定しました。


$retval = `C:\hoge\PsTools\psexec.exe -u Administrator -p somePassword1234 -d WScript.exe C:\hoge\dbopen.vbs`;


備考:
1. psexec.exe に IUSR アカウントを割り当て、実行権限を付与しておく必要があります。
2. ``で囲ったコマンドラインがシェルコマンドとして解釈されるため、ここでは exec()関数を使用していません。
3. -d はスクリプトの終了を待たずに psexec を終了させるためのスイッチです(異常終了時のプロセス残留回避)。
4. vbs ファイルは単体では認識されないため、WScript.exe を明示的に指定する必要があります。

 このように設定してから Web ブラウザより test.php を実行すると、ブラウザが読み込み中状態となってしまいます。そこでタスクマネージャを起動して確認してみると、実行者 NETWORK SERVICE のプロセスとして psexec.exe が残っていることがわかりました。

【現象】
 psexec の実行ユーザが NETWORK SERVICE になっていると、デスクトップにそのアプリケーションが表示されず、バックグランドプロセスとして残留してしまいます。
 二台の Windows Server 2003 環境で実行したところ、一台は test.fp7 がデスクトップに表示され、showMSG スクリプトまで表示されたのですが、もう一台のマシンがどうもうまくいきません。

 psexec に NETWORK SERVICE を割り当てて実行権限を付与したり、IIS マネージャのアプリケーションプールのセキュリティアカウントを NETWORK SERVICE 以外に設定するなど試したのですが、やはりプロセスがバックグランドで残留したままの状態となります。


 IIS で運用中の php スクリプトからシェルコマンドでアプリケーションを起動し、そのアプリケーションをデスクトップに表示させる方法をご存じの方は、情報をお待ちしております。

2009-12-11

FileMaker V10による在庫管理、一考

久々のFileMaker(以下、FM)の話題。
V9以前のFMでは、在庫を算出する場合は、在庫テーブルで以下のようにやっていたのではないだろうか?

在庫::在庫(計算) = 在庫::前月分在庫 - Sum(出庫明細::出庫数) + Sum(入庫明細::入庫数)


このやり方は簡単でいいのだけれど、出庫明細や入庫明細のレコード数が多いと、1つの商品の在庫の算出にさえ、数十秒から数分の時間がかかってしまう可能性がある。 よって、商品数と伝票枚数(商品取引)が多く、リアルタイムの在庫を即時把握したいような業種では、FMは使えなかった。
言い換えると、在庫や各種残高算等、あるテーブル(上例では、出庫明細、入庫明細)のフィールド値に基づき計算を行いその結果を他テーブルの(計算フィールドではない)フィールドに精度を確保しながら保存する、ということができないということは、1995年のV3リリース以来、FMの長年の弱点の一つであった。

そんなところにFM V10が現れたのは一年程前だったか。 このバージョンでFMはイベント発生時のスクリプト起動(以下、スクリプトトリガ)に対応した。 スクリプトトリガ、特に、レコード保存時にスクリプトを実行する「OnRecordCommit」により、上記の弱点が解消される可能性がでてきたように思われる。
以下、その原案。

1. 想定(目標)
以下のような簡単な在庫管理データベースがあり、出庫伝票作成時に各商品の出庫数を在庫数から差し引くことを目的とし、その実装(スクリプト)を考えてみる。
尚、出庫伝票は新規作成のみであり、明細の更新は不可(ホンナ無茶な)とする。

【図1】


【図2】

図1の出庫伝票で、[出庫数]に入力をしレコードを保存する動作を行った時に、在庫リストの[在庫数]の値が[出庫数]を差し引いた値に更新されればいい。 但し、このとき在庫リストの[在庫数]は計算ではなく、数値フィールドである、というのが今回の肝である。


2.実装
まずレコードを保存(Commit)時に在庫テーブルの[在庫数]フィールドから[出庫数]を差し引くスクリプトが必要である。

【図3】


という具合に、出庫明細を1行づつ移動して、関連する在庫レコードの[在庫数]から[出庫数]を差し引き、[在庫数]にセットする。 途中あるエラー処理は、[出庫数]更新時にエラーが発生した場合、このスクリプトで行ったすべての処理を取り消し、レコードを最後に保存した状態に戻すためのものである。

では、ユーザの操作(クリック)に依存せず、レコード保存(Commit)時に必ずこのスクリプトを実行するにはどうしたらよいか? ここでFM V10の新機能、スクリプトトリガの「OnRecordCommit」を使用する。 詳細はマニュアルを見ていただくとして、下図のように上記で作成したスクリプトを登録すればよい。

【図4】

以上で完了。


3.テスト
テストをしてみると、一応、機能する。
図1の出庫伝票入力後に保存を行うと、商品1~3の[在庫数]は正しく「9」に更新される。

また、[在庫数]更新時にエラーが発生すると、その出庫伝票が最後に更新されたときの状態に戻り、在庫レコードも元の状態に戻る。
たとえば、商品1と2の[在庫数]の更新には成功したが、商品3の[在庫数]の更新に失敗すると、すべての処理が取り消され、最後の保存状態に戻る。 このとき、出庫レコード自体が一度も保存されていなければ、明細レコードだけではなく、出庫レコードも保存されない(作成されない)筈である。 


4.課題
さて、上記のように当初の思惑は達成されたが、いくつかの課題と懸念がある。
  1. 今回は出庫伝票は新規のみである、ことを前提としているが、当然、これでは実用には耐ええない。出庫明細の更新、削除にも対応する必要がある。
  2. 在庫テーブルで極力競合が発生しないようにテーブル設計する必要がある。
  3. 十分なテスト --- マルチユーザで競合が発生しないこと、また競合発生時も整合性が確保されること。
  4. 上記実装が正しく機能しているか、検証する仕組みの構築

1.は面倒だか、明細の主キー、商品ID、更新前の[出庫数]と更新後の[出庫数]の差分を変数に記憶しておき、Commit時に個々の商品の[在庫数]からその差分を減算すれば、解決可能である。

クリティカルな環境で上記のような在庫ロジックを実装し、実際の運用まで持ち込むのはなかなか大変だと思われるが、在庫や残高の算出遅延が運用上のネックとなっているシステムでは、一考の価値があるのではなかろうかと。

以上

土屋


【関連リンク】

2012/8/1追記:
当社の在庫管理の講習で使用してるサンプルシステム「FMEasy在庫」を公開しました。フリー版/開発版のダウンロードは→こちら

【FMEasy在庫 の画面】


2009-12-08

Panda Cloud Office Protection エンジン更新後に Hyper-V 搭載サーバ機でトラブル発生

 Panda Managed Office Protection(以降MOP)がクラウド型エンドポイントセキュリティサービスの Panda Could Office Protection(以降COP) として 2009年12月1日より新サービスとして提供が始まったことに伴い、11月下旬から順次既存ユーザへのエンジンアップデートが行われました。

 今月に入ってから弊社環境でも COP エンジンの自動アップデートが行われ、つい昨日アップデート後のサーバ機の再起動を行ったわけですが、Hyper-V 搭載サーバ機では再起動時にネットワークカード(以降NIC)の挙動がおかしくなることを確認したため、今回はその現象と対応方法をまとめます。

【現象】
 COP エンジンの自動アップデート後にサーバ機の再起動を促すメッセージが出るが、ここで再起動をかけると、Hyper-V を運用中のサーバ機の NIC が正常に動作しなくなる。
 Ping チェックを行うと、実体 NIC、仮想 NIC 共に Ping 応答が断続的になったり、まったく応答がなくなったりする。

【対応方法】
 この現象は前回のMOPエンジン更新時にも発生し、当方で試したかぎりでは以下に示す方法以外では成功したことがありません。

1. Hyper-V マネージャの右ペインのメニュー項目より「仮想ネットワーク マネージャ」を選択し、稼働中の仮想ネットワークカードをすべて削除します。(削除前に設定情報はメモしておいてください)

2. Ping テストやインターネットブラウジングなどを行い、実体 NIC が正常に動作するようになっていることを確認します。
 仮想ネットワーク マネージャに戻り、左ペインより「新しい仮想ネットワーク」を選択して、右ペインで“追加”ボタンを押して新しい仮想 NIC を追加します。

3. Hyper-V マネージャの仮想マシンリストにある仮想マシンを右クリックし、表示されるサブメニューより「設定...」を選択します。
 当該仮想マシンの設定画面が表示されるので、左ペインより「レガシ ネットワークアダプタ」を選択し、上記で追加した仮想 NIC を割り当て直します。

この操作をすべての仮想マシンについて行います。
4. 仮想マシンを再起動し、Ping テストやネットブラウジングを行い、仮想 NIC が正常に動作するようになっていることを確認します。

この件については Panda にも現象を報告済みですが、もし上記の方法以外で有効な対応方法をご存じの方は情報提供していただけると大変有難いです。

2009-12-07

Microsoft Forefront Threat Management Gateway

Panda Managed Office Protection は Proxy Server が使えるらしので、 Microsoft の Proxy Server 製品を探してみた。 かつては文字どおりの Microsoft Proxy Server という製品があったが、その後継が Microsoft Internet Security & Acceleration Server となり、最新版はこの11月に Microsoft Forefront Threat Management Gateway(TMG) として、リリースされた。

ところが、このTMG、日本語ではβ版のレビューとかの記事がほとんど見当たらない。 MSのサイトからは評価版のダウンロードはできるけど、説明はほんの少しあるだけ。 しかも、 Proxy の説明は全然なし。(以下、MSサイトから引用)

【主要な利点】

多様な種類の脅威から保護
  • ネットワーク レイヤーに対する攻撃保護
  • 統合されたマルウェア対策およびウイルス対策
  • アプリケーション レイヤーへの侵入の防止
高度にセキュリティで保護された接続
  • Web アプリケーションのよる攻撃からの Web ユーザーの保護
  • リモート ユーザー向け、高度にセキュリティで保護されたアプリケーションの公開
  • サイト間およびリモート ユーザーに対する VPN 管理
シンプルな管理
  • 一元化されたネットワークのセキュリティ管理
  • 使いやすいウィザード
  • 統合された電子メールのセキュリティ管理
--------------------------- 以上、引用終わり ---------------------------

Proxy のことは一言も書いてない(もしかして、Proxy機能は無いの?)し、MSを含む業界はあんまやる気無いっぽい。

2009-11-30

SonicWALL NSA E-Class セミナー(2009/11/27)

 SonicWALL NSA E-Class テクニカルセミナーに参加してきました。
 NSA E-Class は SonicWALL 製品でも上位クラスに属する製品群で、搭載されている CPU コア数が最大 16 というだけあって、ファイアウォール と UTM を同時に有効にしても平均 1 Gbps 以上のスピードを保持できるという優れものです(ちなみに CPU が 1 個の廉価版 TZ シリーズで出せるパフォーマンスはせいぜい 50Mbps なので、その差は歴然です)。

 NSA E-Class と TZ シリーズとの大きな違いといえば、上記で述べたマルチコア構成の他に RFDPI (Reassembly Free Deep Packet Inspection) があります。
 SonicWALL に送られてきたパケットを SonicWALL 内部で一度開梱して、それをもう一度再構築して LAN に送るというのが従来の方式ですが、この再構築プロセスによって処理速度が低下してしまうのがネックとなっています。これを解決させたのが RFDPI で、パケットを開梱せずにスキャンを行う分、速度低下が発生しないようになっています。また、従来の方法では開梱したパケットを一時的にメモリに蓄えられるため、ファイルサイズが大きければそれだけメモリを消費することになり、大量のデータを一度に扱う場合はそれだけ処理速度の低下が発生したり、ファイルサイズが大きすぎるために処理不能と判断されドロップされる可能性がありますが、RFDPI なら開梱を行わずにスキャンを行うため、ファイルサイズによって処理速度が左右されることがありません。

参考:SonicWALL NSA E-Classシリーズ概要と構成例

SonicOS 5.0 以降の基本機能について

  1. Layer 2 ブリッジモード
     ネットワーク構成を変えずに、ゲートウェイアンチウィルスやIPS機能を提供

  2. アプリケーションファイアウォール
     アプリケーション別にアクセス制限をかける

  3. Active-Passive ステートシンク フェイルオーバー
     セッション情報の常時同期を行い、ハードウェア障害時にセッション情報を予備のハードウェアに引き継ぐ。

  4. パケットキャプチャ
     パケットダンプ、HTML/CAP 形式でのパケット情報出力

  5. シングルサインオン
     Microsoft Active Directory にログインするだけで SonicWALL 環境へのアクセスログインを可能に


参考:SonicWALL NSA E-Class シリーズ

SonicWALL による HA (High Availability 高可用性)構成
 現用系と予備系の SonicWALL ユニットを配置し、障害時に予備系の SonicWALL にパケット送信が切り替わるようにする構成方法です。E-Class では障害復旧時にどちらの機器に優先的にパケットを流すかも設定可能です。

構成例:Tokyo FM における HA 構成

Global Management System
 Global Management System をインストールすることにより、セキュリティポリシー一括適応、全ユニットの集中管理/監視、ライセンスの集中管理、リモート管理を可能にし、管理コスト削減を実現します。

参考リンク:
SonicWALL NSAシリーズ 価格体系
Macnica Networks

SonicWALL E-Class シリーズ紹介ビデオ(英語)
(今回の東京での講習内容がほぼ網羅されています。)

04:34 Re-Assenbly Free Inspection 解説
05:06 マルチコアデザイン解説
06:15 Active-Passive ステートシンク フェイルオーバー解説
07:10 Layer 2 ブリッジモード解説
07:19 Wireless スイッチモード解説

2009-11-02

FileMaker Pro 5/5.5/6 でファイル名を指定して PDF 形式で印刷を実行する方法

 FileMaker Pro 7 以降では、「レコードの保存/送信」を使うことによってレコードを PDF 形式で保存できるようになっていますが、それより前のバージョンでは別途 PDF ドライバを入手して印刷コマンドから PDF 保存をする必要があります。

 今回は、FileMaker Pro 5/5.5/6 を使って PDF 形式ファイルを自動作成し、そのファイルに独自の名前を付ける方法について説明します。

【用意するもの】
1. PDF ドライバ
 プリンタドライバと同様、PDF ドライバと FileMaker Pro の相性が合わないことも考えられますので、デモ版や無料版が利用可能であれば、それを利用することをお勧めします。

 実験で FileMaker との相性がいまいち合わなかったドライバ
 Primo PDF --- 自動化の際にユーザダイアログが必ず表示されてしまうので、連続実行には不向き。
 瞬簡PDF3 --- 処理の連続実行、大量処理時に FileMaker Pro がクラッシュする。

 当方のテストで比較的安定したパフォーマンスを記録したのは、PDFCreator だったので、今回は PDFCreator を使います。
PDF Creator の詳細とダウンロードはこちら

 ただし、FileMaker 側でループによるバッチ処理で PDF 作成を行うと、サイズの比較的大きいファイルを処理中に次のループが回ってしまうという現象が起こり、それによってデータの一部が欠けた PDF ファイルが作成されてしまうことがあります。
 FileMaker 側でループ待ち時間を調整することでこういったデータ欠損のあるファイルが発生することを回避することはある程度できますが、それでも FileMaker Pro とプログラム連携をさせる時点で 100% 安定したパフォーマンスが得られるわけではないことは念頭に入れておくと良いでしょう。

2. PetaExecute プラグイン
 MS-DOS コマンドを実行したときの戻り値をこのプラグインで取得します。
 PetaExecute の情報およびダウンロードはこちら

【操作手順】
1. PDFCreator をインストールし、Options 画面の Auto-save 画面で次のように設定を行います。



1) [Use Auto-save]にチェックを付けます。
2) [Filename]に任意の一時ファイル名を英字で入力します。この名前は FileMaker 側でも同じものを指定する必要がありますので、分かりやすいものがよいでしょう。
3) [Use this directory for auto-save]にチェックを付け、その下のボックスにファイルの保存先を指定します。この保存先のパス名も FileMaker 側で指定する必要があります。

2. PetaExecute プラグインを FileMaker Pro のインストールディレクトリ配下の System フォルダにコピーし、FileMaker Pro を起動してこのプラグインが有効になっていることを確認します。


 処理の流れはざっとこんな感じです。
1) 印刷実行。
2) 1) で PDF ドライバを選択した場合は、一時ファイルを所定の名前に変更(この例では PDF_本日の年月日.pdf)。

 特に留意していただきたいのは、一時ファイルが作成されるのに多少の時間がかかるため、一時ファイルがディスクに書き込まれていない段階でファイル名変更コマンド(ren コマンド)が実行されるとファイル名変更が失敗する可能性があります。
 このため、一時ファイルが作成されるまで、ファイルメーカー内で待ち時間ループを設ける必要があります。

 本操作を確認、実行するためのファイル群を用意しましたので、興味のある方はここからダウンロードしてお試しください。
PDFサンプル

【MS-DOS コマンドによる実行方法】
 PetaExecute と MS-DOS コマンドの組み合わせにより、PDF ファイルを任意の名前で変更します。
 当方で動作検証を行った結果、大量バッチ処理で安定した運用が可能であることを確認したため、基本的にはこちらの方法をお勧めします。

1. サンプルファイル PDFtest.fp5 を開き、FileMaker 環境設定のプラグインで PetaExecute にチェックが付いていることを確認します。

2. PDFCreator の一時ファイル名とファイルの保存先を FileMaker 側にも指定します。
(画面下部の[VBSファイルパス]はここでは使いません。)


3. “日記へ”ボタンをクリックして日記内容を入力し、“印刷”ボタンを押し、プリンタとして PDFCreator ドライバを選択して印刷します。
4. 1. で指定したファイルの保存先ディレクトリに PDF ファイルが作成されていれば成功です。

 このスクリプトの仕組みは、スクリプトメニューより「日記印刷_DOS」を開いて参照してください。

【VBScript による実行方法】
 前述の MS-DOS コマンドによる実行方法と比べるとバッチ処理の安定性が低下する可能性がありますが、VBScript の方が MS-DOS コマンドより細やかなファイル操作が可能ですので、ファイルシステムの詳細設定を兼ねながらファイル操作を行いたい場合にはこちらの方法が適していると言えます。
 今回のサンプルスクリプトでは、実行結果が MS-DOS コマンドによる方法と同様になるように VBScript を組んであります。ただ一箇所異なる点は、既存ファイルのバックアップ機能が用意されている点です。

1. サンプルファイル PDFtest.fp5 を開き、FileMaker 環境設定のプラグインで Local Data Access コンパニオンと PetaExecute にチェックが付いていることを確認します。
(VBScript でエラーが発生した場合に、FileMaker にエラーを返すために Local Data Access コンパニオンを有効にしておく必要があります。)

2. PDFCreator の一時ファイル名とファイルの保存先を FileMaker 側にも指定します。
[VBSファイルパス]には、今回の記事で配布しているサンプルアーカイブに用意されている PDFrename.vbs ファイルを格納するディレクトリを指定します。


3. “日記へ”ボタンをクリックして日記内容を入力し、“印刷VBS”ボタンを押し、プリンタとして PDFCreator ドライバを選択して印刷します。
4. 1. で指定したファイルの保存先ディレクトリに PDF ファイルが作成されていれば成功です

 このスクリプトの仕組みは、スクリプトメニューより「日記印刷_VBS」を開いて参照してください。

2009-07-07

Windows Server 2003 で Windows ファイアウォールを開こうとすると、Ipnat.sys 関連のエラーメッセージが表示される

 Windows Server 2003 で Windows ファイアウォールを開こうとすると、以下のようなメッセージが表示されてファイアウォール管理画面を開けないことがあります。

「ネットワークアドレス変換コンポーネント(Ipnat.sys)を使用している可能性がある、別のプログラムまたはサービスが実行中であるため、Windowsファイアウォールを実行できません。」

 これは環境に「ルーティングとリモートアクセス(RRAS)」サービスがインストールされている場合にプロセスの一部(Ipnat.sys)が Windows ファイアウォールのプロセスと競合を起こすために発生するエラーのようです。

同現象でお困りの方は、以下の手順で RRAS を完全に無効化することで対応できる可能性があります。

1. 「管理ツール」→「サービス」より、Routing and Remote Access を停止させ、無効にします。
2. 「管理ツール」→「コンピュータの管理」を選択し、左ペインより「サービスとアプリケーション」を選択します。
 右ペインで、「ルーティングとリモートアクセス」を右クリックし、そこに表示されるサブメニューより、「ルーティングとリモートアクセスの無効化」を選択します。

 上記 2. の手順は「サービス」からは無効化できないので、注意が必要です。

2009-03-11

EdMax のデータを Outlook Express に移行する方法

EdMax のデータを Outlook Express に移行するには少々コツが要ります。

【概要】
 EdMax のメールデータは、本文テキストと添付で保存場所が分かれている。添付ファイルについては専用のフォルダに添付データがそのまま格納されている。
 これに対し、Outlook Express のメールデータはすべて .mdb という一つのデータベースに格納されており、個々のメールは .eml という形式のファイルで取り出すことができる。また、添付ファイルもこの .eml に一緒に保存されている。

 つまり、EdMax メールの本文と添付ファイルを一つにマージさせて、それを .eml 形式に変換する操作によって移行作業を行う。

【操作方法】
1. EdMax のメールを UNIX MBOX 形式でエクスポートします。
 移行対象のメールを選択した状態で、「ファイル」→「エクスポート」の順に選択するとエクスポート用のダイアログが開きますので、次のように指定します。ファイル名には適当なものを付けてください。



(重要)[形式]には「再構成して保存(添付ファイル付き)」を選択してください。これによって、添付ファイルが本文にマージされて書き出されます。

 .mbx という拡張子を付けて“保存”をクリックします。(上記の例では exportmail.mbxと指定する)。このファイルには、選択したすべてのメールが格納されています。

 メールの添付ファイルが大きすぎたり、指定したメールの総容量が大きすぎる場合(最大サイズは 200MB の模様)、エクスポートに失敗しますので、適度なところで区切りながらエクスポートすることをお勧めします。

2. メール変換ツールを使って .mbx 形式のファイルを .eml 形式に分割変換します。
ここでは MailExp というツールを使います。今回は以下のサイトで配布されているものを使用しました。

http://www2.lint.ne.jp/~lrc/in_mailutl.htm

使い方は、入力側に .mbx ファイル(変換前のエクスポート済ファイル)を指定し、出力側に出力先のフォルダとファイル形式を指定します。ファイル形式は .eml にしてください。
“変換+分割 開始”ボタンをクリックすると、メールが連番で分割されます。

3. 2. で分割された .eml ファイル群を、Outlook Express の適切な場所(受信フォルダ、送信済フォルダなど)にドラッグします。

この操作を行うと、.eml ファイルが Outloox Express に追加され、Outlook Express で読み取りできるようになります。