PDFをオーバレイ合成するPlugin公開

「うぇいくのラボラトリ」の方に、2つのPDFファイルをおーばれにより合成するPluginを載せました。
良いものが多く公開されているjavaのライブラリをPluginを間に挟むことで利用できないかなぁ という実験も兼ねてます。

PDFファイルは印刷用のファイルのため、内部構造が編集(変更)に適しておらず、ほとんどのライブラリやアプリケーションでは編集ができず、新規作成のみをサポートしています。
javaのオープンソースのライブラリである、Apache PDFBoxでも、ほぼ同じなのですが、複数PDF機能として、オーバレイによる合成の機能がります。

この、オーバレイによる合成を利用することで、元のPDFのページになんらかの加工(追加書き)することが可能です。
例えば、テンプレートとなるPDFに対して記載内容のみページを作成して合成したり、文書の背景に「『社外秘』画像を合成する」とか、「書類の左上に『決済済』スタンプ(画像)を合成する」とかが可能になります。
(テンプレートへの合成は、位置合わせは大変ですが。)

なでしこでは、デラックス版であればPDF作成機能があるため、合成するためのページを動的に作成して合成することで、可能性がひろがる・・・といいなぁと思ってます。

PDF合成(オーバレイ)Plugin

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

なでしこ実行ファイルに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)

SQLite Database Browserを日本語対応してみる

 ふと、SQLiteを、任意のSQL文を発行していろいろしてみようかと思って、GUIツールを調べてたところ、SQLite Database Browserというものがソースが公開されていて、かつ、派生を作ってもよさそうだということでいじってみました(ソースのライセンスは、パブリックドメインのようです。実際、派生もいくつかあるようです)
 このツールはQtとC++できているっぽいので、Qt(今のQtは商用、GPL以外にLGPLでの利用可能)とVisual Studio C++ Express 2010で環境を作ってみました。

 QtもC++も初めてですが、QtのライブラリによってC++の煩雑さがない感じです。ライブラリのリファレンスもQtの環境と一緒にインストールされるツールから簡単に参照できるので、知らない部分を調べながらでもわりとやりやすい感じでした。継承したクラスを使っているとき、利用可能なMethodやPropertyを参照するために、継承元のクラスの説明(リンクはある)をたどってゆかないと、Mehotdがあるのかないのかわからないのが、ちょっと不便でした。

 とりあえず、Qtの文字列であるQStringの文字コードと、OSの文字コード(日本語WindowsならばShiftJIS)と、DBとやり取りするときの文字コードの、それぞれの変換があいまいな部分をだいたい切り分けました(英語圏だとでたらめでも動いてしまうのか、おかしな実装になっていて)
 あとは、Qtがローカライズの方法が結構しっかりしているようだったので、メニューやメッセージを和訳しました。
 あと、本来、SQLiteはUTF8なんですが、わりと、EUC-JPやSJISでごまかしながら作成したデータベースが存在するっぽいので、UTF8を用いる代わりにEUC-JPやSJISでデータベースを走査するオプションも付けました。
 ついでに、日本語ファイル名もちゃんと使えるようにしました。

 元のつくりの不便さはそのままなものの、日本語ファイルが扱えなかったとか、日本語データが扱えなかったという部分が対応できたので、試してみるのも良いかと思います。ソース付。
(自分で直してしまう という選択肢があるのは、プログラムを読める/書ける人からすると、重要。)

ソースと合わせて、自サイトに載せました。
うぇいくのラボラトリのSQLite Databse Browserのページ

プログラムの変更なしで、言語ファイルを特定のフォルダに置くだけで日本語以外の他の言語も対応出来るようにできたらいいなぁ というのが次の予定(でも、未定)
機能の追加改善もいじりどころがおおいんですが、国際化対応を維持するためには追加変更部分のメッセージは英語で書かなければならないので、二の足。

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

Amazonとバーコード

 バーコードについて、読み取りとか生成とかいろいろと調べたりしています。
 読み取りは生成規約と画像認識なので、まずは生成規約ということで、Code39と、EAN8/13(JAN含む)と、Code128あたりを見てみて、なでしこのライブラリ化してみたり。
 Code39とEANは良いんですが、Code128は動作モードがあるので、ちょっと複雑な感じです。最初に選択するだけなら、引数で指定させればよいだけなんですが、途中で変更したり、1文字だけシフトしたりと、結構凝った動きができるようなので、「入力した文字列に対して1番短いバーコード」とか、モード変更を禁止したりとか、いろんなオプションがありそう。名前の通り、7bits-asciiをすべてつかえるのと、数字のみの場合も非常に短くできるのも魅力。
 Code39は、「太さ」の種類が少ないので、英大文字+数字+記号数個しかないものの、誤認の低さから便利そう(工場内で屋外向き)
 EANは、JANと同じもので、見慣れているあれです。数字のみで、12桁+チェックデジットか、8桁+チェックデジットの2択で、コードの内容そのもの規約があるのと、対応機種が多いのが特徴かも。

 そこでふと、知り合いがAmazonの電子文書に出版したので、「書籍JANみたいにバーコードできるかな」と思ったら、ISBNではない商品は、ASIN(英数字)を割り振られるので、JANではだめだった・・・
 URLをQrCodeの2次元バーコードにするのが1番簡単なのかもしれない・・・・
(QrCodeは割と複雑なのでまだ調査中)

商品はこんなの。

この商品のASINは、「B00AHPTMNY」。ASINは、Amazon内でしか通用しないものの、Amazonで扱っている商品ならユニークなコードのうえ、関連情報をAmazonから取得することもできるので、意外と便利。
なお、紙の書籍の場合、ISBNコードが、そのままAmazonでの管理コードになるので、対応が楽。

| | コメント (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)

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