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

PerlとかPHPとかMySQLとか...がんばっても8割だ。

Category: なでしこ (page 1 of 3)

なでしこ無理やり配列初期化。

なでしこには、変数を破棄する命令がありません。(ないんだよね?)
 
普通になでしこ単体でプログラムを組む分には、
なでしこは定型処理ツールに近く、何度も変数を使うということがないので、
ほとんど問題にはならないのですが、
Filemakerプラグインで使う場合は、
メモリ上に常駐させて使いまわすケースが個人的に多く、
配列やハッシュを使いまわす場合など、結構困ります。
 
ということで、どうしたらいいんだろうと思って、いろいろ考えた結果、
 

ARRAYとは文字列。
ARRAY = 「」。
ARRAYとは配列。

 
このように、一旦文字列型などにしてしまうことで、
配列を再初期化できます。(というより、多分内部的には再生成している)
 
これ使わないと、FileMakerのLoopと組み合わせる時とか、苦しい・・・。

ファイルメーカーランタイムインストーラー(Win7)


 
現在Filemakerのランタイムアプリケーションと、
なでしこプラグインのランタイム版を使ったアプリケーションを開発中だ。
そのアプリケーションをインストーラーとして固めて配布するときの注意Win7版覚書です。
 
ランタイムアプリケーションは、
Filemaker本体なしで、FMのDBアプリケーションが利用できる有用な機能だ。
(DB構造が変更できないなど制限はある)
ノンプログラマでも、スタンドアロンアプリケーションが作れる。
 
 
ランタイムアプリを作成すると、
フォルダの中に非常に多くのファイルが詰め込まれた状態で、
アプリケーションがアウトプットされる。
普通に使うには、
そのフォルダをデスクトップやマイドキュメントあたりに格納して使えば
特に問題はおきません。
 
しかし、それらをインストーラーとして固めて配布する場合に注意すべき点が多々あります。


  
1)インストール先
ファイルメーカーはデータベースソフトウェアで、
ランタイム版も同様にデータベースソフトウェアです。
データベースならば、当然、アプリケーション自体または付属のファイルに
利用する都度ファイル保存や書き換えが行われます。

通常アプリケーションの格納場所は
C:¥program files¥
だと思うのですが、
このディレクトリの下にあるファイルは、
通常ユーザーではファイルの保存や変更はアプリケーションから行うことができません。
つまり、Filemakerのランタイムアプリでは、
レコードの追加やフィールドの変更など、
データベースとして重要な機能を使えず、
ReadOnlyなデータベースアプリケーションになってしまうというわけです。
 
これでは話になりません。
 
ということで、Filemakerランタイムアプリの場合は、
ドキュメントフォルダや、ユーザーデータフォルダなどにインストールするように、
インストーラーを設計した方が吉です。
私の実験では、C:¥直下でも大丈夫だったようですが、
世間的にはあまり推奨されていないようです。
 


 
2)ファイルのコピー
多分、通常のランタイムアプリをインストーラーにする場合は、
1の対応だけで問題ないはずですが、
 

 
今回は、エクセルのテンプレートファイルを用意しておき、
エクセル表示時に表示用のファイルをコピーで新たに作成して、
表示用ファイルへ表示する内容を流し込む。
という動きを自動的に行うよう、
なでしこプラグインによって制御しているのですが、
このコピーという動作は、
たとえ、ユーザーデータフォルダや、ユーザードキュメントフォルダであっても、
UACの制限をうけ、アプリケーションから実行することができませんでした。
 
管理者権限でアプリケーションを実行している場合のみ、
コピーの制御ができるようです。
 
Vistaのときは、いつでも管理者権限でアプリを起動する手段があったようですが、
Win7はどうなんだろう…どっちにしても回り道なのであまり考えたくありません。
 
コピーがだめなら、エクセルを制御しているわけだから、
一度テンプレートのエクセルファイルを開いてしまって、
自動で別名保存するようにすればいいじゃないかと思って、
これも行ってみましたが、拒否されるようです。
(なぜかOpenOffice.orgを制御する場合はそれでいけた)
 
どうしようか…と思って試行錯誤したところ、
なでしこでテンプレートファイルの内容をバイナリとして、
なでしこの変数に保存し、
なでしこでファイルを作成して、そこへ変数に保存されたバイナリを流しこんで保存。
という回りくどい手段を使えば、擬似的にコピーを
UACの影響なしに行えることがわかりました。
 
多分ですが、Win32APIのCopyFile関数がUACの監視下にあるのだと思います。
開いて内容取得→ファイル作る→取得した内容保存
ですと、CopyFileを使うことはないのでUACの影響を受けなかったのではと思います。
 
これはおそらく他の言語とかでも役に立つはず。
 


Win7でFilemaker+なでしこのランタイムアプリをインストーラーで配布する場合は、
とりあえず、以上で今のところ問題点は見つかっていません。
 
Win7は比較的セキュリティは高いのに、仕組みはシンプルなので、
要点を押さえれば、アプリ開発はすんなりいきます。 
問題はVistaです。こっちはハマりまくったので、
また次回レポします。

Filemaker <=> MySQL

ここ数カ月FilemakerとMySQLを、
Filemaker9より実装されたESSを使って接続し、
EC向けCMSを作っていました。

そのうえで、いくつかハマってしまったことがあったので、レポ。
(というか、実際は全部不確定要素ですけど・・・。)

まず結論。ESSはそこそこ使えるけど過信はしないほうがよい。


その理由

◆LONGTEXTが使えない??(不確定要素)
LONGTEXTのカラムはFMでは「テキスト」のフィールドとしてマッピングされます。
私の環境ではなぜか、LONGTEXTがTEXTとして扱われ、
65,535バイトで切り捨てられてFM上で表示されました。
DB構築途中でTEXTからLONGTEXTへ変更したのが影響している可能性もあります。
この辺は未確認です。すみません。

 
 
◆リレーションが効かない?
MySQLのテーブルのキーでないカラムに対して、
FMのテーブルとリレーションすることは、
仕組み上できるようになっています。
見た目上一応動きます。
が、MySQL側のレコード数が増えてくるとそれなりに影響が出ます。
たとえば、FMのスクリプト内で、
FMテーブルからMySQLテーブルへ「関連レコードへ移動」をすると、
FMエラー101(レコードなし)が帰ることがあります。
おそらく、MySQL側にインデックスがないためレコードの取得に時間がかかり、
関連レコードなしと判定されるのではと思います。
 
私の場合、MySQLのテーブルにルックアップを指定しておいて、
関連レコードに移動し再ルックアップ。
関連レコードがなければ、FM側のレコードの値を利用して、
MySQL側にレコードを新規作成。
というスクリプトを作っていたのですが、
関連レコードがあるにもかかわらず、なしと判断され、
不要なレコードを作成してしまうケースに悩まされました。

対応策としては、
主キーでリレーションするか、
リレーションしたいカラムにINDEXを作っておくというのが手でしょう。
まぁ、そもそも、キーでもなくINDEXもないカラムでリレーションとか、
プログラマ的にアホすぎるだろって自分でも反省しています。

ちなみにレコードのインポートで、一致するレコードを探すときも同じことがおきます。

私の場合は、なでしこでCOUNT()関数を使って、MySQL側にSQL発行し、レコードがあるかなしかを判定させることでとりあえずその場をしのぎました。

◆MySQLのレコードをロックできない。
まぁ当たり前なんですが、必ず頭に入れておかなければならないことです。
複数人やさまざまなインターフェイスからMySQLのレコードを操作する可能性がある場合は、
FMでどうにかしようというのは考えないほうがいいでしょう。

編集中のフラグをMySQL側のテーブルに用意して、 
そこに何かあるときは編集しないようにすれば一応はいけるでしょう。
ただ、やっぱりこれもFMだけで判定するのはよくないかなと思いましたので、
私の場合は、なでしこでSQL発行して、判断しています。
 
 


 
 
いまのところ私が困ったESSのハマりどころはこんな感じです。

別になでしこ開発コミュニティの回し者ではないですが、
やはり、なでしこプラグインがあることによって、かなり幸せになれます。
Windows版FMのDB構築する上で、なでしこは必須だろうと、改めて思いました。

Filemaker なでしこプラグイン 最近の動向

いろいろ仕事があったり、足をケガしたり、なんやかんやで、最近なでしこのFilemakerプラグインを使えてなかったのですが、先月久々に大きくバージョンアップがあったようなので使ってみました。


プラグイン自体に「vnako()」と「vnakofile()」関数が追加になっていました。

・vnako
Filemakerとは別プロセスでなでしこ本体のランタイムみたいなものを起動して、そこでなでしこスクリプトを起動する。

・vvakofile
vnako関数は引数の中に直接スクリプトを記述してそれを起動しますが、こちらは、引数になでしこスクリプトが記述されたテキストファイルのパスを書いて、それを起動するというもの。

別プロセスなので、他の従来の関数とは違い、返り値を得ることができません。
またプロセス終了を待たないので、スクリプト中に記述した場合は、起動だけして、そのままスクリプトは順に進められます。
終了を待つ関数と待たない関数があると良かったなぁと思ったり。特にvankofile。

別プロセスなので、MS-Office操作などを行うときは、各種セキュリティのブロックに配慮がいるかもです。ランタイム配布や別の人のPCで動かすときなんかとくに。


こちらでなでしこプラグインのダイアログ各種がFMのウインドウハンドルと関連付けられていないという話をしたのですが、関連付けがされて、FMのウインドウの後ろに回ってしまうということがなくなったようです!これは個人的にかなり嬉しいです!(全部のダイアログについて調べてはいませんが)


その他、

FMプラグイン版だとブラウザ要素クリック命令があるとうまく動きません。。。。これができれば、オープンのJS製WYSIWYGライブラリを使って、Filemaker上でWYSIWYGエディタが実現できるのですが・・・。近いうちに動くといいなぁ。

前からの懸案だった、メール周りの動作はこれからチェックします。

ということでVIVA!なでしこ!!

FMのウインドウスタイル変更2

以前、こちらの記事で、なでしこプラグインを利用して、Filemaker内のウインドウの最小化ボタンや閉じるボタンを無効にするお話を書いたのですが、「FMアプリウインドウ自体はできないの?」というコメントを頂戴しました。

確かにそれも価値があるかも。ということで、作ってみました。

ここからダウンロードして下さい。

仕組みは以前と一緒で、なでしこからWin32APIを呼び出してウインドウスタイルを変更しています。

使い方は同梱のテキストファイルを読んでください。なお、以前のFM内のウインドウスタイルを変更するものを改造しているので、スクリプト名が重複しています。同時利用される際は、リネームするなど適宜変更して利用してくださいね。

なでしこでUNIXタイムスタンプ

なでしこでタイムスタンプ

なでしこには標準でUNIXタイムスタンプを取り扱う関数がないっす。
結構僕は、UNIXタイムスタンプをあちこちでつかうので、結構困ってて、今までは、Perlのスクリプトを作っておいて、その標準出力をなでしこで取得して…なんて回りくどいことしてました。

1970/1/1からの秒差で計算させてみたこともあるんですが、どういうわけだか正確じゃないんですよね。閏秒とかのせいでしょうか?

なでしこがLuaをサポートしてくれたおかげで、なでしこだけで、UNIXタイムスタンプが正確にあつかえるようになりました。

ってことで、現在のUNIXタイムスタンプと、日付と時間からUNIXタイムスタンプを取得する関数を作っておきました。

●unixtime()
	「nowtime = os.time()」をLUAする。
	LUA値(「nowtime」)で戻る。

●mktime( Y, M, D, h, m, s)
	//nako_get
	『tbl = {}』& 改行 &
	「tbl['year'] = nako_get('Y')」& 改行 &
	「tbl['month'] = nako_get('M')」& 改行 &
	「tbl['day'] = nako_get('D')」& 改行 &
	「tbl['hour'] = nako_get('h')」& 改行 &
	「tbl['min'] = nako_get('m')」& 改行 &
	「tbl['sec'] = nako_get('s')」& 改行 &
	「print(tbl['year'])」& 改行 &
	「nowtime = os.time(tbl)」をLUAする。
	LUA値(nowtime)で戻る

ご自由におつかいくださいませ。

FMでWindowsのダイアログ

Filemakerなでしこプラグイン関連連投です。


今回やってみたのは、Win32APIでメッセージボックスを出す方法です。

FMにもカスタムダイアログあるじゃねぇかって、、、確かにそうなんですけど、Windows標準のダイアログじゃないので、なんかイケてないなぁって・・・。FM使いの人の中で同じコトを思った人絶対いると思います。

じゃぁなでしこに「言う」命令があるじゃねぇかって、、、こちらも確かにそうなんですけど、なでしこプラグインの仕様では、「言う」命令で出せるダイアログはオーナーがFMのウインドウハンドルになっていなくて、ダイアログのボタンを押さずに、FMのウインドウのどこかをクリックしてしまうと、ダイアログがウインドウの後ろに隠れてしまって、気がつかないとハングアップしているように見えてしまうんですよ。

ということで、
・FMでWindows標準のメッセージボックスを出す。
・ダイアログはFMのウインドウがオーナーとなっている。
ということを目標に作っています。



はい、いつものようにダウンロードはこちらから。

今回も説明は割愛・・・。申し訳ないです。時間がありません・・・。


なでしこのオープンファイルダイアログなんかも、FMがオーナーになっていないので同様の不都合が生じるので、Win32APIでやろうかなぁと思ってたら、構造体の定義が面倒で、今日は時間切れ。またそのうち。

その前に、なでしこプラグイン側で対応してくれないかなーーーとちょっと思ってたり・・・。

FMのウインドウスタイル変更

ひさびさにFilemakerのなでしこプラグインについてのお話。


Filemakerは、他のソフトで言うところのマクロに値するスクリプトを駆使して、アプリケーションを作り上げるデータベースソフトです。ゆえに、開発者が意図しない利用者の動作手順は、往々にして不具合に直結しがち・・・。

ウインドウ内の「閉じる」「最大化」「最小化」ボタンもその一端じゃないでしょうか?私の個人的な経験ではそういった問題は結構多いです。

そこで、なでしこプラグインで、これらのボタンを有効化|無効化できる仕組みを作ってみました。

↑これが通常状態。これを、、、

↑こんな風に変えれます。最小化と閉じるボタンを無効にしています。

どうですか?使いようによっては便利でしょ?(・・・とは言いつつ、実はすでに同様のプラグインがどっかにあったとは記憶していますが・・・)


せっかくなので、使っていただけるようサンプルを用意しました。

ここからダウンロードしてください。

使い方は同梱のテキストをお読みください。



仕組みだけ説明しますと、なでしこがWin32APIを実行できるようになっているので、これを使って、ウインドウのスタイルを変化させています。

FilemakerでWin32APIを実行できるというのは、結構強みだと思います。そういう意味でも私は、なでしこプラグインが大好きなんだなー。(バグはご愛嬌ということで・・・笑)

細かい説明は難しい話になってしまい、FMのユーザー向けじゃないのなかぁ・・・という勝手な言い訳をさせてください。(本当は書くのが面倒なだけ・・・)

サンプルをダウンロードしてもらえれば、ソースは丸分かりですから、なでしことWin32APIが少し分かる人なら、なんとなく理解ができるはずです。改変も許可していますから、ご自由にお使いください。

なでしこでJavascriptを動かす。

もう、大好きが止まらない感じがするなでしこですが(^-^;

前回のバージョンアップからなでしこには「Lua」という言語が内包され、
便利度がアップしました。

Luaがなでしこで使えるようになったおかげで、
なでしこで、windowsのCOMライブラリが使えるようになりました。

前々から、なでしこでCOMつかえたらなぁと思ってたんですが、
それは、ほとんどのWindowsに搭載されている「scriptControl」という機能を使いたかったためです。

「scriptControl」とはMS謹製のスクリプトエンジンで、
標準で「VBScript」と「JScript」が利用でき、
COM経由で呼び出せば、
自前のアプリケーションにスクリプトエンジンを組み込むことができるのです。

何の意味があるかというと、なでしこで作ったアプリケーションに、
VBSやJSを利用するユーザースクリプトのような機能を実現できるというわけですね。

もちろん、作りこみは必要で、組込みにはそれ相応の知識が必要です。

それにそもそも、なでしこ言語やLua言語でのユーザースクリプトを実現したほうが、
組込みも簡単で、安定して使えると思うのですが、
多くの人に使ってもらおうと思うと、JScriptのほうがよく知られた言語ですから、
JScriptでユーザースクリプトを実現したいわけです。
(たしか、JScriptは、javascript1.5と互換だったと記憶しています)

で、さらに突っ込むならば、なでしこの中にLuaを書いて、
Luaの中にJSを書かなければならないので、いたってめんどくさい(^-^;


余談。

mozillaが開発しているspiderMonkeyというスクリプトエンジンがあり、
(たしかFirefoxの3.0まではこのスクリプトエンジンでjavascript機能を実現しています)
こちらは、C言語で開発されていてDLLもあるので、
なでしこ用のプラグインを作れば、
簡単になでしこJSが使えるんでしょうけどね・・・。ひまなときにでもつくろうかな。



ではごく簡単なコードでやってみましょう。
以下なでしこのコードです。

//なでしこJSテスト
『require('luacom')
sc = luacom.CreateObject("ScriptControl")
sc.Language = 'JScript'
sc:AddCode('function test(v){ return v+1; }' )
js = sc.CodeObject
test = 2
val = js:test(test)
』をLUAする。
LUA値(「val」)という。

『』の中はなでしこに内包されたLua言語です。

1行目は、LuaでCOMを扱うためのライブラリをロードします。

2行目で、ScriptControlオブジェクトを作成、scに代入します。

3行目で、使用する言語の名前を指定します。標準状態なら「VBScript」か「JScript」を選択します。適切な言語環境がインストールされているなら「PerlScript」なんかも使えますが、汎用的なアプリケーションを作るなら「VBScript」か「JScript」のほうがいいでしょう。

4行目で、3行目に指定した言語にユーザー定義のソースを加えます。例示では、「test」というユーザー定義関数を作っています。この「test」関数では、引数に与えられた値に1を足して返すというだけの関数です。

5行目では、スクリプトエンジンそのものを、Luaの変数「js」に代入しています。これにより、変数「js」はJScriptの関数をまるでLuaの関数であるかのように利用できるようになるのです。※1後述

7行目で、自作の「test」関数を実行し「val」へ代入しています。

で、以上をなでしこで「LUAする」します。

で、Luaの中の変数「val」にはtest関数を実行した内容が保持されるはずですので、この値をなでしこで取得して利用するわけですね。上記の例では単純に表示だけしていて、「3」と表示されるはずです。


※1ユーザー定義関数だけじゃなくて、JSで搭載されている関数なんかもそのまま利用できます。
たとえば、

val = js:escape('!"#$%&()*+,-./')

↑このようにすると、JS標準の「escape」関数をそのまま利用して結果を「val」に代入するなんてことができちゃうわけです。


【追記】
あら、
http://nadesi.com/man/page/LUA%E3%81%99%E3%82%8B
↑こちらによると「nako_set」という命令を使うと、なでしこの変数にLuaから直接代入できるのね。不勉強でした。。。

そうそう、MSのJScriptは、いわゆるJavascriptに比べて実装がアレなので、、、その点は目を瞑りましょう(>_<)

なでしこからFMのDBへODBC接続する関数

最近、Filemakerの内容をエクセルへ書き出すということが増えてきて、
単純にエクセルファイルを出力するだけなら、FM単体でできるんですが、
罫線や計算式がすでに設定されたテンプレートファイルを用意しておいて、
そこへFMのDB内容を流し込むということはFM単体ではできません。

ということで、
ODBCでFMDBに接続

適切なSQLを発行してエクセルに出力したい内容を得る

エクセルをOLEとかで制御
という手段でエクセルファイルを出力したい。

VBAとかWSHを使えばできるんでしょうけど、
ADOでFMに接続して、エクセル起動して、
そのためにはDLLを呼び出してfasdlkdfjpaodfi:aoあうdsf…
と、まぁとてもめんどくさいわけですよ。

そこで登場するのがわれらがなでしこ
特に何かライブラリをインクルードしたりすることなく、
標準でADO接続したり、エクセル制御したりということができるようになっているので、
リファレンスどおりの命令文を使えば、
大体実現可能です。

が、ひとつ問題があります。
以前、なでしこからODBC接続で
FMのDBへ接続する方法という記事を書いたのですが、
ここを読んでもらえば分かるとおり、
FMへの接続はちょっと特殊です。

接続の下準備とか、SQL文の仕様はどうにもならないにしても、
接続するのに毎回UTFエンコードして,,ウダウダウダと接続文字列を作るのはめんどくせぇよぉ。
ってことで、FMのDBへODBC接続するための
なでしこ関数を作りました。

ここからダウンロードして下さい

使い方は、ダウンロードファイルに書いてあります。

※改変OKです。自作ソフトにバンドルの配布や販売もOKです。
 自己の全責任においてご利用ください。
※すみませんが、この関数のみの、再配布や再販は行わないで下さい。
※DB接続時、ハンドルをとらない仕組みなっているので、
 必要な人は、改造して利用してください。
※なでしこプラグインは未テストです。

Older posts