月別アーカイブ: 2010年3月

VMware on WinXP

かなり古いアプリがWindows98以前の16ビットOS用だったので98環境が急遽必要になりました。ノートPCのHDDを入れ替えてWindows98にすればいいのですけど、VMware Playerで環境を作ってみようと思っての実験です。
まず、本体は本家からダウンロードします。ユーザー登録が必要だったので登録して届いたメールのURLからダウンロードすれば問題ないです。次にHDDイメージはQEMUでと思ったのですが、vmxファイルを編集するエディタを探していたら、http://www.easyvmx.com/ でvmxを作成しつつHDDイメージも作れることが判明。そのサイトでいろいろと設定し、Createするとvmxとvmdkが圧縮されたファイルがダウンロードできるのでそれを解凍すれば準備OKです。
設定は各自自分の環境や利用形態にあわせて作ればいいと思います。うちは物理CD-ROMを利用し、サウンドは特に不要、ネットワークアダプタはvlanceってのを使ってブリッジ設定で行いました。
VMwareを起動し、CD-ROMドライブにWin98のCDを入れてセットアップ。シリアルが本に書いてあるのをすっかり忘れて本を探すのに一番時間がかかったよ。SPとかパッチ類はぐぐれば集めたサイトとか中国のサイトにはSEの最終パッチ集もあるので使い続けたりするなら当てればいいかと。うちはちょっと動かすだけなのでパッチは当てませんでした。
P4-1.7GHzだとセットアップに2時間くらいかったかな?HDDサイズは余裕をもって8GBにしましたけど、これのチェックとフォーマットは一瞬で終わりました。問題はWin自体のインストールにオリジナルでも40分くらいかかると思いますが、処理が重たいのでそれなりにかかるという。最新鋭の環境ならオリジナルに近い時間で済むんでしょうね。
あと、VMware-Toolsですが、先のサイトで作ったときに設定(tools.remindInstall = “FALSE”、tools.syncTime = “TRUE”)があったらしくてVMware本体起動時にダウンロードしてました。ただ、インストールされなかったのですが、ide1:1.autodetect = “TRUE”を追加してIDE/CD-ROMを自動認識させるようにしたらインストールを再度聞かれたときに問題なくセットアップできました。これが入るとSVGAドライバが入るので画面の見栄えがかなりよくなります。また、マウスをウインド外へ持っていくとホスト側のマウス移動になるのでかなり便利です。そうでないとCTRL-ALTを押して抜けないと駄目ですので。まあ、慣れの問題ですけどね。
一昔前は別のOSを入れるには入れなおすかデュアルブートなどが必要でしたが、仮想PCのお陰でメイン環境に手を入れることなく新環境が作れるので便利でいいですよね。問題はCPUパワーとかメモリーサイズくらいですし。便利になるとどんどんいい環境が欲しくなる罠が待ってるけどね。

Analogの設定ツール

調べてみたら本家のページからリンクがあった。
Win、Macからできるシェアウェアが有名らしく、フリーウェアでのツールはいまいちよさそうなのが無かった。ドイツ語と英語で書かれたページでWeb上で設定してanalog.cfgを生成するページがあったけどローカルで欲しいと思った。
そういえば、リクエストレポートの各種ファイルへのリンクを張らせる方法がわかった。htmlやディレクトリは勝手にリンクされてますけど、jpgとかリンクされないので何とかリンクさせたいと思ってたら、「REQLINKINCLUDE」で指定ができた。まあ、INCLUDE、EXCLUDE関係の設定の1つだったわけだ。INCLUDE、EXCLUDE関係も突き詰めると難しくなるし面倒だけどきめ細かく設定すれば使い勝手もよくなるって事らしい。まあ、統計情報は自分で見るだけなので特に整形も詳しくなくていいけど、運営会社などはこれをうまく設定して上役を説得できる資料も設定次第で作れるって事だね。この辺りの設定ツールを作るとかなり使われそうな予感もする。

続analog6

agent_logみてたら結構いろいろなブラウザを使ってるのを見て統計を取ってみようと思ってBROWSERREPとOSREPをONにしてみた。ブラウザレポートは単にエージェントがそのまま出るのであまり面白みが無いのですけど、agent_logを眺めるより統計的にわかりやすいから満足しました。OSレポートを見たら最近増えてる携帯ゲームとかPS3などが不明に含まれてるので分けてみようと思いました。
analogのソースを展開してWindowsでgrepしてみるとtree.cで判定してるのがわかりました。Pnextname関数で判定してるらしく、wholeにagentが入ってくるので、strstr関数で拾えたらOS名とも言える文字列をnameへセットすればいいらしい。とりあえず、Atariの判定の後、Unknownの前に下記を追加。
else if (strstr(whole, “PSP”) != NULL)
*name = “PlayStationPortable”;
else if (strstr(whole, “PLAYSTATION 3”) != NULL)
*name = “PlayStation3”;
else if (strstr(whole, “Nintendo Wii”) != NULL)
*name = “Nintendo Wii”;
あとで気づいたのですが、WindowsとかUnix系はWindows:Windows2000とかで戻せば前の文字列でのサマリー、後者文字列でのサマリーが取れるっぽい。つーことは、”Sony:PSP”、”Sony:PlayStation3″、”Nintendo:Wii”とかにすればPSPとPS3をあわせたカウントを出せるって事ですね。任天堂は別に変更しなくてもいいけどね。
そういえば、コンパイルでちょっとハマった。Gentooは設定ファイルを/etc/analog/analog.cfg、言語ファイルは/usr/share/analog/langに格納してますが、ソースをそのままコンパイルすると/usr/binを参照してしまいました。emergeでパッチを適用したら停止させ、作業ディレクトリをコピーして手直しというのもいいですけど、設定を書き直しました。コンパイルはconfigureは無いので、付属のMakefileの調整とヘッダの手直しです。デフォルトのコンパイルオプションは-O2だったので特に変更なし。コンパイラもデフォルトがgccだった。src/anlghead.hのDEFAULTCONFIGFILEを/etc/analog/analog.cfgへ変更。それとLANGDIRを/usr/share/analog/lang/にしました。後ろのスラッシュが入ってないとlangを無視してしまうので要注意です。いろいろデフォルトを指定できるけど、いじったのはそれだけ。あとはanalog.cfgで上書きすればいいし。
現在調査中はリクエストレポートでアンカーが入るのと入らない差がどの設定かわからん。ソースを読むのは疲れるので設定でいけるなら何とかしたいです。どうもディレクトリへのアクセスとindex.htmlを含むアクセスはアンカーが入るみたいですけど。後日だね。

analog6.0

一応動いてるのですけど、前から日本語表示のうち、JISらしきコードが混じって正常に表示できてない問題を思い出したので対処しました。
問題は、ステータスコードレポート等で文字化け状態になるもので、JISコードの場合、シフトコードにESC$B、ESC(Bを使用しますがESCが?に置き換わっていて表示できないように見えます。また、シフトコードに囲まれた漢字コード部分のうち、大小記号やクォート、アンパーサンド等がHTML表示させようと&xx;に置き換えられてるのもわかりました。
Analog自体の設定で何かあるのか?と思ったのですが、どうやらソースにEUCやSJISなどで吐き出す機能はなく、JISっぽく出てしまうのが仕様らしいです。ソースも覗いてみたけど、処理する関数を構造体配列へセットしてC++みたいなオブジェクト指向風なコーディングなのでいまいち追いかけるのが辛い状態です。関数へのポインタとか使われると最初からどんなデータをどういう風にう処理するのか追わないとわからないので挫折です。業務じゃないので別方向でアプローチを。
で、考えたのが、吐き出されるHTMLを読み込ませて?[Bと?(B、&xx;を置き換えてしまえばという事でCでプログラムを作りました。処理自体は単純で、STDINからfgetsでテキストを取得し、シフトコードを検索して見つかったらその中身のアンパーを処理、シフトコードをまた見つけてたら処理という感じ。アンパーも調べると大量に処理すべき置き換えがあるけど、気づいたものだけ処理という限定仕様。変換漏れとか落ちたら別途対応すればいいやという投げやり仕様ですけど。
一応今の段階でレポートされる範囲では問題なく変換できてます。あとは、検索語レポートがいつの間にか落ちてるのでレポートしたいけど、ApacheのログをCommonで取ってたのでcombinedに設定しなおした後だからまだでない状態。昔AIXで設定したときは取ってたのですけど、Linuxへ移行した時に設定が漏れてたと思う。analogurldecodeを使ってる意味がぜんぜんなかった罠。

Excelのマクロをいじる

ファイルを整理するのに久々にExcelのマクロをいじってみた。見よう見まねで他人が作ったマクロをいじったりしてたけどフルスクラッチは久々です。それでも昔作った別のマクロのソースを見ながら試行錯誤ですけど何とか目的は果たせました。
大量のファイルがXMLで管理されてるのですけど、最新のExcelだとXMLパーサーがあるみたいだけどうちのはExcel2000なので当然無い状態。C言語のパーサーライブラリを持ってきてCで書こうかなとか思いましたけど、Borland Cでは駄目っぽくてMinGWを使わないとコンパイルできないのでCは諦めてExcelかなと。
XMLといっても目的のタグは限られてるのでテキストで読み取って目的のタグを拾い集めて処理するだけなので解析は自前だったり。ハマったのが文字列処理でMid関数はよかったのですけど、LeftとRight関数が使い方のイメージが違っていて予期せぬ結果になった。うちは指定した位置の左側の文字列を取るのがLeftだと思ってたら1桁目から指定文字数という使い方だった。指定文字位置から後ろを取るのにRightと。XMLファイルの先頭がTAB文字が入っていてそれでずれるのか?とか思ってマクロを何度直しても動作がおかしくて少し悩みました。まあ、よく考えれば元の仕様もうなづけるけど、StratusのPL/Iを結構長くやってたのでsubstr、before、afterのイメージで書いたのが敗因でした。Trim系関数もTABを取り除くスイッチとかあればいいのに見当たらなかったので前TAB、スペースでタグが続く場合の処理を考えるのにも時間がかかったよ。結局Forで先頭から文字を調べていく基礎的なやり方ですけど対処できました。
あとチェックするフォルダが13種類もあったので一覧をとってForで処理すれば簡素になったのでしょうけど、考えるのが面倒だったので13多重のIFが続いたとさ。ELSE IFって無いのが問題だよな。なのでTHENとかELSEの中にまたIFがって漢字になる多重だった。Forの多重よりはマシですけどね。(昔、BASICでプログラミングしてたときはForとか多重させる場合制限があったような。VBAはあるのか知らん。業務で使うなら調べるだろうけど趣味だからいいや)
それにしてもファイル処理とか親和性が高くて慣れてくるとExcelから離れられなくなる理由がよくわかった気がした。テキストを吐くような外部コマンドを実行して結果をシートに挿入してしまえれば、外部コマンドを多用して処理するのも可能だね。文字列処理がもっと関数が豊富になってForとかでロジックを組まなくても処理できるようになればもっと便利になりそうな気がする。
そういえば、以前の会社でFTP.EXEを起動させてサーバ上にあるファイルを持ってきて統計を出すようなマクロを書いてた協力会者の人が居たけどDLLとかで拡張せずにWindows標準コマンドでよく作り上げるなぁと関心したものです。そこまで使いこなせると楽しくて仕方ないよね。