なでしこ実行ファイルにDirect2D向けを作り始める・・・

 またもや、pluginではなく、実行ファイルです。
 先のGUI無しWindowsアプリに似ていますが、GUI部分をpluginとして取り込むようにして、Direct2D+DirectWriteのプラグイン(の作り掛け)を取り込めるようにしています(取り込まないと、先のとほんとにいっしょな感じ)
コマンドラインに、-load d2pluginもしくは、-l d2pluginとすることで、実行ファイルと同じフォルダにあるd2plugin.dllを取り込みます(ソース中の先頭の方に「# load:d2plugin」を書くことでも可能)
※d2plugin.dllの配置はplug-ins配下ではないです。通常のpluginと構造も違うので利用できません。

 まだまだいろいろ途中なので、ついているサンプルに書いてあるぐらいのことしかできません。
 実行する場合、なでしこをインストールしたフォルダに、enako.exeとd2plugin.dllをコピーして使用します(dnako.dll等、標準的ななでしこの実行環境が必要です)

一応、以下の場所にソース含めて圧縮ファイルにしました。d2pluginで利用可能な命令は、d2plugin.cppを覗いてみるとわかると思います(cppが解らなくても、命令が日本語なのでたぶん、わかる)

http://www.weyk.jp/files/enako.zip

なお、enako単体での固有の命令というのは無いです。guiのpluginを読み込まない場合、先のnnako.exeと同じような感じです。

| | コメント (0) | トラックバック (0)

なでしこ(日本語プログラム言語)用の母艦無しWindow実行ファイルを作成

 pluginではなく、実行ファイルです。
 もともと付属しているgnakoに近いといえば近いですが、決定的な違いは「母艦も標準のメッセージループも無い」というところです。
 ついているサンプルを見ての通り、dxlib.dllを利用する場合、母艦の存在やメッセージ駆動型の標準的なメッセージループが邪魔になることあるため、単に初期化してなでしこのプログラムを実行するだけの実行ファイルです。
実行する場合、なでしこをインストールしたフォルダに、nnako.exeをコピーして使用します(dnako.dll等、標準的ななでしこの実行環境が必要です)

一応、GitHubの以下の場所においてあります。実行ファイルはzipに含まれています。

https://github.com/weyk/wnako1/tree/master/nnako

なお、nnako固有の命令というのは無いです。そのため、gnako、cnako、vnakoのそれぞれで実装されている命令は使えません。dnako本体やpluginに存在する命令のみが利用できます。
(お手軽な「表示」命令も使えない命令の1つなので注意。)

| | コメント (0) | トラックバック (0)

なでしこでWebCamからバーコード読み取り

 ZBarに付属のzbarcamをpipe付きで起動してなんとか動くようになりました。
 APIは相変わらずだめです。もしかすると、Windows版は(コンパイル環境と同じ)MinGW環境から生成した実行ファイルとじゃなと動的リンクもだめなのかも。

 いちおう、ライブラリのような感じにしたので、中身を知らずとも、取り込むで取り込んで、関数を呼び出せばそれなりに使えます。
(カスタマイズできるというメリットがあるの*.nakoで作ったものの、ソースが見えると逆に敬遠されるっぽい。不便でもPluginにしてしまったほうがよいのかも)
 細かい制御をどうするのが良いのかは使おうとしていた人が、見た目の複雑さに押されて手を引いてしまったので、不明。とりあえず起動から停止まで、イベントごとに特定の名前を関数を呼び出す感じ。
 ZBarプロジェクトのzbarcam.exeの代わりに、ZBarW(zbar for windows)のほうのzbarcam.exeを使うのも手です。zbarwは、zbarから派生してWindowsでの動作に特化して調整しているだけあって、必要ファイルが少なく動作も安定している感じです(そのかわり、zbarcam.exeの動作をターゲットにして他は削ってあります。zbarimg.exeもついてません。)

とりあえず、ここのページにおきました。

zbarとzbarwは、以下。
zbar barcode reader
zbar for windows

| | コメント (0) | トラックバック (0)

なでしこでZBar(いまだ動かず)

 掲示板でそんな使い方もあるのかぁ ということで、いろいろ試し中。

1.Pluginで単発スキャンは動く。
 コマンド1つで、Preview開いてなにか1つ認識するまで待機して、認識したらPreview閉じて認識した結果を返す というのは動いた。起動に時間がかかるので連続には向かない。

2.上の処理を分割したら動かない。
 Previewを開くのと、待機と、Preview閉じるのを非同期にしたら動かず。
 つかっているAPIで、途中の制御をなでしこに戻すかどうかの違いだけのはずなのに・・・
 (Destroyすると、クラッシュする上に、スレッドの回収に失敗してプロセスが残る)

3.zbarcamをpipeで動かす案は、ハングアップ中。
 マルチスレッドで待ち合わせないと大変そう。

4.APIをPluginではなくLuaから動かすのはまだ未試行。
 luaって、callback使えるのね・・・
 (ZBarをStreamで使うと、認識したbarcodeの通知はcallback関数になる)

| | コメント (0) | トラックバック (0)

LuaComを利用してなでしこでネットワークカードのIP取得

たぶん、WindowsXP以降。2000は微妙。それ以前だと無理。
以下のような感じで、IPが振られているネットワークについて、IPのリストの形で帰ってきます。
ネットワークカード1枚ごとに1行。
1枚に複数のアドレスがある場合は、「,」区切り(IPv4とIPv6の両方がある場合とか、仮想IPとか)

upnpで送信元IPを選ぶのに作成しました。
-----------
●ネットワークIPリスト取得
 LUA(`---
require "luacom"

firstrun=true
results=""
if firstrun then
WMI = luacom.CreateObject("WbemScripting.SWbemLocator")
Services = WMI:connectServer(".","root/cimv2")
firstrun=false
end
local items = Services:ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True")
local item,index,index2,ip
for index,item in luacom.pairs(items) do
local result=""
local iptable=item:IPAddress();
for index2,ip in ipairs(iptable) do
if not (result == "") then
result=result .. ","
end
result=result .. ip
end
if not (result == "") then
if not (results == "") then
results=results .. "\r\n"
end
results=results .. result
end
end

---`)
 それは「results」のLUA値

ネットワークIPリスト取得して表示

| | コメント (0) | トラックバック (0)

プラグインで「漢字読み取得改」作成(プログラム言語なでしこ)

 プログラム言語「なでしこ」の「漢字読み取得」の機能が、WindowsVista以降の環境で使用しているIMEに依存してうまく動かない(空文字列が返される)ため、pluginの作成練習をかねて作成。

http://weyk.la.coocan.jp/files/plugin_immhurigana.zip

解凍して、なでしこのplug-insフォルダに入れれば使えるようになります。コマンド名はちょっとあれですが。

本プラグインについて、利用・配布などに制限は設けません。プラグイン単体での配布や、なでしこで作成したプログラムの配布へのパッケージングなど、自由に使用してください。利用に関しても、有償・無償・商用利用含めて使用可能です。

| | コメント (2) | トラックバック (0)

いくつか修正版dnako(プログラム言語なでしこ)

とりあえず、目に付いたところだけ修正してみました。
(A)ワイルドカード一致にて、マルチバイト文字で「|」や「]」を含む文字(酢とかポ)が含まれていると正しく動作しない問題への対応。
(B)JSONエンコードの際、ハッシュをエンコードすると余計な{"",null}というエントリが出来てしまう問題への対応。
(C)JSONデコードの際、Unicodeシーケンスの16進数が英大文字だとエラーとなり結果が空文字列となる問題への対応。
(D)「等しい」「ない/ではない」「条件分岐」「条件分岐~ならば」の数式としてハッシュに存在しないキーを付けて渡した場合にNULLアクセスのエラーで実行が中断する問題への対応。
(E)JSONデコードの際、ハッシュのキーに非ASCII文字があると化けてしまう問題への対応。
(F)JSONデコードの際、データにnullが含まれていると失敗する問題への対応。

http://weyk.la.coocan.jp/files/dnako_patched003.zip

(A)はnakostr.dll
(B)(C)(E)(F)はnakonet.dll
(D)はdnako.dll
です。LGPLのライセンスに従い、修正したファイルを公開しています。LGPLのライセンスの規定により、このファイルについても、LGPLが適用されます。
※LGPLの要件であるソースの提供については、2012/3/17までお待ちください。とりいそぎバイナリのみ。

17日編集:修正項目(E)を追加し、ファイルを0.02にしソースも一緒に含めました。
20日編集:修正項目(F)を追加し、ファイルを0.03にしました。

追記。
 修正が本体に吸収されたのに伴い、公開を終了しました。

| | コメント (0) | トラックバック (0)

取り込みからの終了状態の扱い(プログラム言語なでしこ)

 日本語プログラミング言語、「なでしこ」の要望に出ていたものについて調査していってみると・・・コアの部分のソースが見えなくて、結局不明に。→見つかりました。

 もうちょっとじっくりみてみまふ。

 オプション解析は、Preprocessで動作するため、実際の実行に入る前にフラグが消えてるのかなぁ という感じ。

なお、
----
●終了
 終了
終了
----
とした場合、無限に自分自身を再起呼び出しをしてしまうため、異常終了(終了じゃなくて「あ」とかでも一緒)する。関数内で呼び出している「終了」(のつもり)を明示的に「システム:終了」することで、直接書いても関数の中に書いても変わらないことが確認できる。

 もちろん、「取り込む」や「終了」の命令の仕様・・・という可能性も有るんですが、Tipsで表示されるようなレベルの説明しかないので、困っているときには役にも立たないことが多い(命令と引数の有無の確認ぐらいしか使えない)。プログラムソース読めないとかなり厳しい(動作で疑問に思ったときは、ソース頼み)。オフィシャルサイト見ても、オフィシャルな発言はミーティングの話題しか更新されて無いし。

 結局、あとはコアの開発メンバーにお願い(HiSystem.FlagEndを退避/復元しないようにしてもらうor復元前に終了ONなら終了処理に移るようにしてもらうor取り込みのときは復元を超えて伝達されるように修正してもらう。最後の案が他への影響が少ないかも)するしかなさそう。開発メンバーの活動が続いているのかは不明ですが(ソースの更新は今年は2月1回、3月1回だけっぽいし。なでしこ2に注力している?)

質問者(要望の提案者)にこれを伝えても意味がなさそうなので、自分のサイトに残して終わり。
明確原因が特定できたら、回答つけるかも。

2011/12/21に修正。修正前の記事ではフラグの退避/復帰の制御と推測していた。

| | コメント (0) | トラックバック (0)

愚かなプラグインを考える(プログラム言語なでしこ)

 「なでしこ」は日常業務の簡単なことを、簡単に実行するための日本語で記述するスクリプトっぽいプログラム言語です。構文も日本語の文章っぽく書けるのも特徴です(この辺が、ぴゅう太と違う・・・)
 プログラミングできる人からすれば、大抵の簡単な操作は、VBAなりWSHなりの目的にあった言語でさくさくと記述すれば無駄も無く簡単なわけですが・・・それも難しいという人、時に、アルファベットの羅列に耐えられないという人には「なでしこ」がむいていると思います。きっと。
 スクリプトっぽい言語なんですが、(いくつかのDLLは必要ですが)EXEファイルの生成が可能です。バイナリな中間コードに変換されるかんじ。また、生成の際に暗号化(難読化)もできるので、「バイナリエディッタで見たらソースがわかる」というのは避けられます(※)し、アプリケーションとして第三者に提供することもやりやすいです。
 足し算を行う命令として、「足す」が以下のように定義されてます。
「{=?}AにBを|Aへ|Aと」
最初の、「{=?}」は、前に「=」を付けて結果を変数に代入することもできる(省略も
可能)ので、こんな感じの定義に。これを実際に使うと、
「3と5を足して、表示。」という感じ。なお、「表示」も命令です。

 そこで、せっかく日本語の文章っぽくなるなら、以下のような命令のPluginとかも作れる・・・・かもしれません。
「自滅する。」で、プログラム終了後に自ファイルを削除 とか。
「堕ちる。」で、コンピュータシャットダウン とか。
夢が広がります。


※「実行できる」以上は、実行に必要な情報が必ず含まれます。これは、どんな環境でも絶対に避けられません。中間コードを用いている場合は、実際の命令と中間コードの差が小さくなり、解読しやすくなるので、その点は十分に注意が必要です。実行できる=実行内容を順に解析できる=解析できる順にソースも生成できる
 と、なります(元のソースではなく、中間コード用オペランドソースどまり という可能性はあります。Javaがこのタイプですね。大抵は、OPコードから逆コンパイル までしてくるツールが多いですが)
 元の言語とオペコードの機能差が開くほど、逆コンパイルが困難になりますが、無限に複雑化(と巨大化)してゆくことは出来ますが、不可能にはまりません。結局、いたちごっこになるだけで、どこかで見切りを付けることになります。
 (Nativeコンパイラだと、元のソースとNativeな実行コードがものすごーくかけ離れているので、ものすごく難解ということになる。)

| | コメント (0) | トラックバック (0)