10月 2009 のブログ記事

VBS(WSH)で、コマンドラインアプリを実行して、その標準出力を得る方法。

いろいろ調べた結果、WScript.ShellのExecメソッドを利用する方法と、同じくRunを使う方法があることが判明。

今回は私がFilemaker用に開発したVBS実行プラグインでコマンドラインアプリの出力を得たいとおもっている。

Execメソッドは標準出力から直接データを得ることができるが、Runメソッドでは実行結果をいったんテキストファイルに保存し、その内容を取得する必要がある。

「じゃぁExecで良し!」と思ったら、全然良くなかった。Execメソッドを使うと、コマンドプロンプトが必ず開いてしまう。。。Filemakerで使うことを前提としているので、あまりに不都合だ。

ということで、Runメソッドで実装。

Function KIYO_VBS( dummy )

	Dim WshShell, oExec
	Set WshShell = CreateObject("WScript.Shell")
	exCommand = "実行するコマンド"

	Dim tmpFileName
	tmpFileName = "tmptmptmp.txt"

	Dim command
	command = "cmd /S /C " & exCommand & " > " & tmpFileName

	Dim result
	result = WshShell.Run(command, 0, true)

	Dim fso
	Dim TextFile
	Dim Text

	Set fso=CreateObject("Scripting.FileSystemObject")

	Dim Path
	Path = tmpFileName

	Dim fUNICODE
	Dim BOM
	Set TextFile = fso.OpenTextFile( Path )
	If Not TextFile.AtEndOfStream Then BOM = TextFile.Read(2)
	fUNICODE=BOM=Chr(&HFF)&Chr(&HFE) Or BOM=Chr(&HFE)&Chr(&HFF)
	Set TextFile = fso.OpenTextFile(Path,,,fUNICODE)

	If Not TextFile.AtEndOfStream Then
	  Text=TextFile.ReadAll()
	Else
	  Text="(Empty)"
	End If
	TextFile.Close

	fso.DeleteFile(tmpFileName)

	KIYO_VBS = Text
End Function

WScript.Echo( KIYO_VBS("") )

KIYOVBSプラグインで使うことを前提としているので、なんだかとっても変な書き方でごめんなさい。必要に応じて書き換えて使ってください。

IEでJSからsubmit()できないことがある件。


<a href="javascript:;" onclick="doSubmit();">送信!</a>

<form action="test.php" method="POST" id="testForm" name="testForm">

<input name="testVal" type="hidden" value="テストだよ">

</form>

上記のようなHTMLがあるとして、

function doSubmit(){

	document.getElementById('testForm').submit();

}

上記のようなJS関数を実行してフォームを送信しようとすると、

Firefoxでは問題なく送信できるが、IEでは送信できない(>_<)


まず、HTMLを

<a href="javascript:void(0);" onclick="return doSubmit();">送信!</a>

<form action="test.php" method="POST" id="testForm" name="testForm">

<input name="testVal" type="hidden" value="テストだよ">

</form>

と修正して、

function doSubmit(){

	document.getElementById('testForm').submit();

	return false;

}

JSはこのように変更。

何をしたかというと、<a>のhrefをvoid(0)で無効化して、さらに、onclickはfalseを返すようにする。IEではどうやら、JS関数の中のsubmit()より、<a>の働きが優先されるようで、これらをすべて無効化する必要があるよう。

これで半日悩んだ。
ある意味正しいような、でも、なんか納得いかない(>_<)

IEはツンデレだ・・・いやツンツンしてるだけか(爆


ちなみに、

<a href="javascript:void(0);" onclick="return doSubmit();">送信!</a>

<form action="test.php" method="POST" id="testForm" name="testForm">

<input name="testVal" type="hidden" value="テストだよ">
<input type="submit" name="submit" id="submit" value="送信" />

</form>

こんな風に<form>タグの中に「submit」という名前の要素が入ると、submit()ができなくなる。これも注意。

JSは何でもかんでもオブジェクトなので、同じ名前のものがあれば、当然そちらで上書きされる。

迂闊な名前をつけるのはやめよう。

オープンソースECシステムをメモメモ

・osCommerce
だいぶ古くからあるシステム。
今開発やコミュニティがどうなってるのか不明・・・。
選択肢には入らない・・・かな。

・ZenCart http://zen-cart.jp/
osCommerceからの派生プロジェクト
安定度は高いが、環境によってインストールにかなり苦労する。
ZenCartインストールを公式に保障している
ホスティングサービスを利用したほうがいい。
いかんせん、設計が古いので、それなりの見た目にはなってしまう。

・EC-CUBE http://www.ec-cube.net/
近頃よく使われるEC用CMS。
日本製なので、決済モジュールなどが充実しているのがいいところ。
こちらも環境によってはインストールに苦労する。
バグが多くて困る。。。
MySQLを使えるようにはなっているが、使わないほうがいい。
PHPの知識がない人は・・・使わないほうがいいかも。
それでも無難に使えるから、まぁ合格点。

・ONE/DEPO http://www.onedepo.jp/index.html
ダウンロード販売の機能やら、簡易的なショッピングモール機能など、
他にない機能満載のECシステム。
データベースがPostgreSQLを使っているので、商品数もかなりいける。
決済モジュールがないので、
独自に決済方法を組み込まなければならないのが難点。

・Magento http://www.magento-jp.com/
MySQLを使いながらかなりの商品数を扱えるというすばらしいECCMS。
実績では、10万点を越える商品を扱ったサイトもにも耐えられたとのこと。
画像処理システムなどかなり多くの機能を抱え込んだシステムなので、
環境を選ぶのが難点で、
基本的にVPSか占有利用サーバーでの利用を考えたほうが良い。
海外製で、まだ日本コミュニティは成長途中なので、資料が少ない。
決済モジュールはいくつかあります。
個人的に、日本コミュニティの中心の方とお話させてもらったことがありますが、
非常に人当たりが良かったので、
Magentoは今後何某かの形で関わっていきたいなと思っています。

他にも沢山ありますが、使えそうなのはこれくらいですかね。
私はEC-CUBEとMagentoを案件に合わせて選択という感じでいくことになりそうです。

PerlでCSVを読み込むメモ。

これまで私は、
こちらのサイトを参考に正規表現だけで処理していました。

速度が云々あるでしょうけれど、そもそもそんなに速度が気になるのならCSVじゃないデータを使うべきでしょう。ということで、これだけで十分です。

※なお、CSVデータは完全にアプリケーション依存のデータフォーマットで入出力するアプリケーションによって形式が異なります。この記事ではMS-AccessのCSVを前提に書きます。エクセルも問題ないと思います。それ以外のアプリケーションでの動作は考慮していませんので、必要に応じて書き換えて使ってください。


ですが、CPANのモジュールも活かさないとそれはそれでもったいないので、今回はそちらを使ったときのメモ。

いくつかのモジュールがあり、中には数々の文字コードのCSVの処理を考慮したものもありますが、エクセルでの出力で最も多いであろうShift-JISのデータを扱うには、Text::CSVをバイナリモードで使うのが一番トラブルが少ないようです。

じゃぁやってみよう!

use strict;
use Text::CSV;
use IO::File;


#CSVファイルを開きます。
my $file = "CSVのパス";
my $io = IO::File->new( $file, 'r' );

#解析をはじめましょう。
my $csv = Text::CSV->new({binary => 1});
while (not $io->eof and my $columns = $csv->getline($io)) {
    #ここでデータを処理する。
    #$columnsへ1レコード分のデータが配列への参照として渡されます。
    #例:$columns->[0](1列目)
}
exit();

こんな感じ。意外にベタベタと書かないといけない。
Text::CSVは標準モジュールではないので、インストールが必要なことを忘れずに。


ちなみに、Text::CSV::Simpleというモジュールもありまして、こちらを使うと、全CSVのデータを一気に二次元配列として処理してくれます。さすがにこれはデータ量を考えないとアレですが、便利は便利です。合わせて覚えておきたいです。