伊藤清徳の垂直落下式ムーンサルトプレス

PerlとかPHPとかMySQLとか…がんばっても8割だ。
7 月 29

http://www.999.co.jp/usbcid2-jp/index.html
こいつになでしこから接続して流れてくる文字列を読む必要があったので接続してみた。



まず、WIN32APIから必要な関数をロード。


●CreateFile({参照渡し}filename,dwDesiredAccess,dwShareMode,lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile) = DLL("KERNEL32.DLL",
"HANDLE CreateFileA(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile)")

●CloseHandle( hObject ) = DLL( "KERNEL32.DLL" ,
"BOOL CloseHandle(HANDLE hObject)")

●ReadFile(hFile,{参照渡し}pBuffer,nNumberOfBytesToRead,pNumberOfBytesRead,{参照渡し}pOverlapped) = DLL( "KERNEL32.DLL" ,
"BOOL ReadFile(
HANDLE hFile,
LPCVOID pBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD pNumberOfBytesRead,
LPOVERLAPPED pOverlapped
)")

●WriteFile(hFile,{参照渡し}pBuffer,nNumberOfBytesToWrite,pNumberOfBytesWritten,{参照渡し}pOverlapped) = DLL( "KERNEL32.DLL" ,
"BOOL WriteFile(
HANDLE hFile,
LPCVOID pBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD pNumberOfBytesWritten,
LPOVERLAPPED pOverlapped
)")

●SetCommTimeouts(hFile,{参照渡し}lpCommTimeouts) = DLL( "KERNEL32.DLL" ,
"BOOL SetCommTimeouts(
HANDLE hFile,
LPCOMMTIMEOUTS lpCommTimeouts
)")

●GetCommTimeouts(hFile,{参照渡し}lpCommTimeouts) = DLL( "KERNEL32.DLL" ,
"BOOL GetCommTimeouts(
HANDLE hFile,
LPCOMMTIMEOUTS lpCommTimeouts
);")

今回は読むだけなので
「CreateFile」「CloseHandle」「ReadFile」「SetCommTimeouts」
があれば問題ないのだけど一応他のも読み込んでおきました。




接続準備。

□CreateFile用のパラーメータの定数を定義します。


!GENERIC_READ = $80000000。
!GENERIC_WRITE = $40000000。
!OPEN_EXISTING = 3。

□SetCommTimeouts関数用の構造体を定義。

■COMMTIMEOUTSGROUPとは
 ・ReadIntervalTimeout
 ・ReadTotalTimeoutMultiplier
 ・ReadTotalTimeoutConstant
 ・WriteTotalTimeoutMultiplier
 ・WriteTotalTimeoutConstant

COMMTIMEOUTSとはCOMMTIMEOUTSGROUP。
COMMTIMEOUTSのReadIntervalTimeout = 0。
COMMTIMEOUTSのReadTotalTimeoutMultiplier = 1。
COMMTIMEOUTSのReadTotalTimeoutConstant = 50。
COMMTIMEOUTSのWriteTotalTimeoutConstant = 50。
COMMTIMEOUTSのWriteTotalTimeoutMultiplier = 1。
PACK( COMMTIMEOUTS , COMMTIMEOUTS2 , "LONG,LONG,LONG,LONG,LONG")。

この場合「COMMTIMEOUTS2」が作成された構造体です。
構造体の中身ついては、ここを参考にしました。




では接続してみましょう。まずはCreateFile関数を実行します。


h = CreateFile( "COM3" , GENERIC_READ + GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)。

こんな感じです。1番目の引数へCOMポートの名前を入れます。
hへハンドルが代入されます。

では読み込みましょう。ReadFile関数を利用します。


READSIZE = 20。#読み込むバッファサイズ。
BUFとは文字列。#この変数へ読み込んだ内容がセットされる。
BUFにREADSIZEを確保。#ポインタなので必要サイズを確保する。
READEXESIZEとは整数。
RESULT = ReadFile( h , BUF , BUFのバイト数 , POINTER(READEXESIZE) , 0 )。

上記の場合変数BUFにREADSIZEに指定したサイズ分読込みが行われます。
サイズが未確定の場合は、ループやタイマーを使って必要分読み出します。
1番目の引数は、CreateFileで取得したハンドルですね。

最後にCloseHandle関数で切断します。


CloseHandle( h )

この関数においても「h」はハンドルです。




って感じです。このご時世COMポートなぞあまり使いどころがないかもしれませんよね…(^-^;
何かの参考になれば。。。

各WIN32API関数についてはMSDNのサイトなんかを見るとわかるでしょう。
また、なでしこにおいてのWIN32APIの使い方は、
しらたまさんが詳しく説明していらっしゃいます。(非常に分かりやすいです)

なでしこは、WIN32APIを使うような高度なプログラミングも分かりやすく使うことができるので、
高度なプログラミングの学習にも最適です。
DelphiやVBやC#を使うのもいいですが、
これらは、WIN32APIをうまくラップして、
ユーザーが意識することなく利用できるように作成されているため、
根本的な学習はできませんし、
ラップされているので逆に使うのが難しかったりすることもあります。

わたしも過去VC++で挫折してました。
VBに逃げようかと思ったのですが、個人的にVBの文法が大嫌いで、
もうWindowsプログラミングをあきらめていたときに、
なでしこに出会いました。
個人的には、日本発のVBくらいの言語だと思っています。
今後も学習や業務にガンガン利用しますよ。

7 月 28

PHPはphp.iniなどの設定により同じプログラムを書いても挙動がかなり異なるのがイヤだ。
(がゆえに脆弱性のあるコードを書いちゃったりするし。)

配布プログラムやサーバー環境の条件によっては、
「Notice: Undefined index: … 」
というようなエラーが吐き出されて、そのまま続けて正常な動作の結果が表示される場合がある。

こういう場合は、php.iniだったり、.htaccessだったりで、
「error_reporting」の設定が「E_NOTICE」レベルの警告まで発するレベルの設定がされていることが多い。
PHPが利用できるほとんどの環境はそうなっていないようだが、
一部LinuxOSのデフォルトの設定をそのまま使うと、
「E_NOTICE」レベルの警告を発するようになるらしい。

ってことで、上記のようなエラーが吐き出される場合は、
php.iniなり、.htaccessなりで、
「error_reporting」の値を「E_ALL & ~E_NOTICE」に設定しましょう。

「display_errors」をオフにしちゃうとかするともっとラク?
でも、PHPの旨みであるトライ&エラーがやりにくくなるので、
そんなことするくらいなら、PerlやRubyでも使うしね。

って調べたら、各スクリプトからも「error_reporting()」関数で指定できるんだね。
▼詳しくはこの辺を
http://jp.php.net/manual/ja/function.error-reporting.php

ちなみに、「Blogn+」というブログツールでよく起きてるみたいこのエラー。
おそらく、このサイトで配布しているPHPシステムでも発生するはずですから、
設定やスクリプトを修正したうえで利用してください。

7 月 25

この記事でやろうとしていることは、なでしこプラグイン自体が対応しちゃいました(^-^;
クジラ飛行机さんのパワーには圧倒されるばかり…

なでしこはWindowハンドルを使ってメッセージ送信などができる機能をばっちりそろえているので、
Filemakerのメニューバーの「スクリプト」に配置したスクリプトを実行できるといいな。と思う

まずは、本家なでしこで挑戦。


!WM_COMMAND = $00000111。
TARGETSCRIPT = 0。
TARGETSCRIPT = 32768 + TARGETSCRIPT。
TARGETWINDOWは、「ターゲットのウィンドウ」。
HANDLEは、「FMPRO7APP」を窓ハンドル検索。
TARGETHANDLEは、HANDLEのTARGETWINDOWを窓ハンドル内検索。
//PostMessage(TARGETHANDLE,WM_COMMAND,SETCOMMAND,0)。//←間違えていました!!
PostMessage(TARGETHANDLE,WM_COMMAND,TARGETSCRIPT,0)。//←こちらが正しいです。


●1行目
WindowsAPIで使う定数を定義します。

●2行目・3行目
メニューのスクリプトに割り当てられたスクリプトは、
上から順に「32768」「32769」「32770」…と「32768」から昇順にIDが振られています。
このIDを利用して、WindowMessageをPostMessageかSendMessageで送ってやればいいわけです。

●3行目~5行目
Filemakerのスクリプトは、データベースファイルごとに設定できます。
したがって、Filemakerのメインウインドウにメッセージを送ってしまうと、
別のファイルのサブウインドウがアクティブになるなどして、
期待していないスクリプトが起動してしまう可能性があります。
そこで、まず、「FMPRO7APP」でメインウインドウのハンドルを検索し、
その中の指定したタイトルを持つウインドウのハンドルを検索します。

●6行目
あとはこれまでのデータをもとにPostMessageしてやればOK。

ってわけで、本家なでしこでは問題なく動きました。
cnakoでは、PostMessage関数をDLLから先に呼び出しておく必要があります。


●PostMessage(hWnd,Msg,wParam,lParam) = dll("USER32.DLL",
"BOOL PostMessageA(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
)")

大体こんな感じですかね。

さて、では早速これをなでしこプラグインで。。。。

と思ったら、、、、問題発生。

たとえば、これら命令をファイルメーカーのスクリプト中の計算式から呼び出すとします。
すると、スクリプトは現在起動中なのですから、
ウインドウメッセージを送ったところで、スクリプトの実行を受け付けてくれないみたいです。
「秒待つ」とかやっても、すべての命令が終わるまで、
NAKO_eval()関数は待ってくれる偉い子なので、意味がありません。
(いやイヤミではなく、本当に偉いと思う)

一番いいのは、1秒程度の間隔を設定し、1回だけ動作が行われるタイマーをつくり、
そのタイマーを起動してNAKO_eval()を抜けるのがラクそうなのですが、、、
(スクリプト終了後、タイマーが働いて指定したスクリプトを起動する。)
現在のバージョンではNAKO_eval()においてVNAKOが使えないので、
WIN32APIのSetTimer関数と、なでしこのイベント登録関数で切り抜けるしかなさそう。。。
(WM_TIMERを使うってことね。)

あれ?ちょっと待てよ。。。
もしかしたら、タイマー起動したら、Filemakerの動作がまずくなる???
そのまえにNAKO_eval()抜けられない罠とか????
しかし今日はもう時間切れ。。。(T_T)
週末にでもいじります。

タイマーが正常に動けば、
指定時間にダイアログ表示とか、スクリプト実行とかできるのになぁ。。。

ここまで書いて気づいた。
一番ラクなのは、なでしこで不可視のGUIアプリケーションを作って、
それをランタイム?ターミナル??サーバー???みたいにして、
COPYDATAとか使ってやり取りすればとりあえず切り抜けれるか。。。

7 月 24

Filemakerなでしこプラグインで、メールの送受信をできるようにした。

うん。便利。

海外製のメール受信プラグインがあるけど、
当然ながらマルチバイト文字列への考慮なんぞはなくって…
なでしこのメール送受信機能は当然日本語考慮されているし、
テストでshift-jisのメールを受信してみたら、
問題なく受信できた。

なでしこのグループ(他の言語で言うクラスみたいなもの)を作って、
インスタンス化や関数実行を、ファイルメーカーのカスタム関数として実装。
通常のFilemaker関数の感覚で使えるわ!

せっかくだからそのうちに公開しようかな。

7 月 21

なでしこFilemakerプラグインで見つけたバグを列挙していきます。
(公式サイトにFilemakerプラグイン用の窓口がないようなのでここで、、、
くじら飛行机さん見てくれるといいなぁ。。。)



・「毎行読む」命令が使えない。
一般的な言語で言うところの、readline的な命令。
ファイルハンドルは作成されるが、ファイルの内容が取得できない。
「開く」命令でいったん変数へ保存し、「区切る」命令を使って改行でスプリットして代用。
メモリ食うよぉ~~~(T_T)
▲これは治りました!!!



・改行の処理(断言はできないけど)
おそらくファイルメーカーのプラグインAPIのほうの問題だと思うけど、
BR+LFの扱いがヘンっぽい。
Filemakerのシステムの内部的にはBR+LFは改行ふたつとして処理してるみたいだけど
ユーザーの目に見える部分や、Filemakerの計算はBR+LFは改行ひとつとして処理するみたい。
なので、なでしこプラグインから取得した値を変数に入れて計算させたりすると、
すこし挙動がおかしくなる(ことがある)。
追記・・・「{改行}」を使って改行せずに、「{\13}」を使って改行すればほとんど問題なし。

7 月 19

何かと便利ななでしこFilemakerプラグイン。

しかし、どうやったらなでしこの計算した変数を
NAKO_eval()の結果としてfilemakerに
取得できるんだろうかと悩んでいろいろやっていたら
どうやらなでしこプラグインは、関数の戻り値を
NAKO_eval()の結果としてリターンしている雰囲気。。。

ということで、


●ただ返す(もも)
 ももで戻る。


という引数を受け取ってそのままリターンするだけの
ユーザー定義関数を作って、
NAKO_eval()の結果として、取得したい変数を引数に渡して関数を実行して、
NAKO_eval()を終了させてやると、結果が取得できるもよう

なお、NAKO_eval()関数で定義した、
・変数
・ユーザー定義関数
・グループ
はそのままFilemaker終了までメモリに保持されるようなので、
作成したユーザー定義関数やグループをデータベース開いたときに、
NAKO_eval()で実行しておくと便利。
グループをオブジェクトにしたものもデータベース開いたときに作っておくと良さげ。

とにもかくにも便利だ。なでしこプラグイン。

─追記─
変数の宣言をするとそれもそのままメモリに保持されるので、


HENSUは、ハッシュ。

とかすると、1回目は問題ないけど、2回目に呼び出すとエラーが起きる。
ハッシュや配列宣言用のスクリプトを作っておき、
ファイルメーカーデータベース起動時に宣言用のスクリプトを起動するようにしておくと良いかな。

7 月 19

普段からバッチ処理用言語として便利に利用させてもらっている
「なでしこ」という言語(しかも日本語でかけるプログラミング言語!)がある。

他の言語にはない自由な発想の言語で、
これを使うようになってから、よほど高度な機能を求めるものでなければ、
パッケージソフトやシェアウェアを買う必要がなくなった。

そんななでしこからFilemaker(データベースソフト)用プラグインがリリースされていた。

ので早速購入。そして、使ってみた。激しく便利!

Filemakerは平易さがウリのデータベースだけれど、
平易ゆえ、windows版は専用の操作言語を搭載していないので、
「スクリプト」と呼ばれるマクロのようなものを組み合わせて、
操作言語の代わりとして力技でしのがなければならないという、
データベースとしてはあまりにも大きな欠点を持っている。
(Mac版はAppleScriptが利用できるので全く問題なし。)

なでしこプラグインはそんな欠点をかなり補完できる。
Filemakerの計算式指定エディタ内で、
なでしこのプログラムをそのまま書ける。
Filemakerの「スクリプト」では難しかった計算をなでしこに任せられるし、
これまでわざわざ高いお金を払ってサードパーティー製プラグインを買って
追加していた機能もなでしこを使えば比較的簡単に追加できる。

ただし、なでしこ自体がバッチ処理的な利用用途のプログラミング言語ゆえ、
MS-ACCESSのVBAほど細かな制御ができるわけではない。
もしかしたらなでしこのプラグインを作成すればもっと機能追加できるのか??

「じゃあ、Filemakerのプラグインを作れよ」って突っ込まれそうだが、
FilemakerのプラグインはC++で作らなくてはいけないうえに、
作成APIの仕様が分かりづらい。
なでしこのプラグイン作成はDelphiを利用でき比較的分かりやすい。

動作は特別高速という印象は持たないけれど、
遅いという印象はまったくない。
Filemakerにもともとある機能でもなでしこに任せたほうが高速なものもある。

現在はなでしこの機能のうちのGUI関係の処理ができないが、
将来的にできるようになるらしいので、
Filemakerにはない、色選択ダイアログなんかの実装も簡単になりそう。
(ちなみにファイル選択ダイアログなんかは、
 現行版のなでしこプラグインでも利用可能。
 これだけでも利用価値あり!)

ということで、なでしこFilemakerプラグインオススメです。

ちなみに、これができる前までは、
PetaExecute」というプラグインとPerlを組み合わせて利用していました。
これはこれで非常に便利です。
指定したプログラムを起動し、その標準出力をキャッチするという仕組みでできてます。
都度プログラムを起動するので、動作が遅いのが欠点。
しかし、PerlなりDOSコマンドなりRubyなりを利用できるので、
なでしこでは実現しにくいシステムの低次元部分の制御とかもできてしまうし、
PerlなんかはCPANのような豊富なライブラリ資産も利用できます。

なでしこプラグイン + PetaExecute でFilemakerの悩ましい部分の多くが解決できますよ。

7 月 16

オススメ表示システム「mazun」
の動作実績



2008年7月15日現在有限会社カワチさま通販サイトで運用中

http://www.eyewear-kawachi.co.jp/



商品ページに「mazun」を設置し、ユーザー動向を他のユーザーにも表示することで、商品提案&ページ回遊率をアップさせている。


7 月 14

「Tokashiki」ダウンロード&ライセンス取得お問い合わせのページです。



「Tokashiki」って何??
「Tokashiki」の概要について>>



ダウンロード

「Tokashiki」の概要および当サイト配布物利用規約についてご理解・ご了承いただいた方のみご利用いただけます。
ダウンロードをされた時点で、ご了承いただけたものとします。

ダウンロード



インストールについて
インストール方法についてはダウンロード後、解凍してできたファイルreadme.txtに記述してあります。


お試し利用について
当ソフトは、有償ライセンスが必要なソフトウェアですが、ライセンスがなくともライセンス取得時と同じ機能が使えるようになっております。ただし、ライセンス取得が必要な旨の表示が各所に行われ、ライセンス管理ファイルがシステムに作成されるごとに作成されるなどされることをご了承ください。



ライセンス取得について
このソフトウェアの使用ライセンスは有料です。価格は18,000円(税込)です。ライセンス期間は発効日より365日です。ただし、当サイト発行のメールマガジンを継続購読される方は、次回以降のライセンス更新は、メジャーバージョンアップの場合を除き無料となります。

ご希望の方は下記メールフォームにてお申し込みください。お支払方法などご連絡さしあげます。


お名前
メールアドレス
電話番号
メールマガジン  メールマガジン登録 メールマガジン非登録
※未選択の場合は「登録」とみなします。

※通常1~3営業日にて返信さしあげますが、年末年始・夏季休業期間などはこの限りではありません。
※このフォームを利用したライセンス取得以外の内容についてはいかなる場合においても返信さしあげません。
※ご利用インターネットプロバイダによっては、確認メールおよび返信メールが「迷惑メールフォルダ」などに自動分類される場合がございます。これに関して、当サイトにおいては責を負いません。必ず、すべてのメールをチェックできるように設定するか、迷惑メールフォルダなどをご確認ください。

7 月 11

サイト内での回遊を解析して、

「この商品を見た人は、こんな商品も見ています」
「このページを見た人は、こっちのページも見ています」

というような、オススメ表示を可能にする
「あしあと」解析システム「mazun」を公開予定です。(有償)

amazonなどにも似た機能がありますよね。
(※amazonは回遊を解析ではなくて、過去に同時購入した商品を解析しています)



■動作環境
PHP:4.3.3以降 5.2.3以上
MySQL
Apache1/2


価格:18,000円
ライセンスは365日間。
当サイト発行のメールマガジン購読者はライセンス更新無料。

※メジャーバージョンアップが行われた場合は除く 。

販売開始予定:2008年8月中旬を予定。

« Previous Entries

 ANZXCvg