プラグインの作成について
4 posters
Page 1 of 2 • 1, 2
プラグインの作成について
弊社技術スタッフがプラグインの作成について、ドキュメントにまとめました。
ご参考になれば幸いです。
「簡単なプラグインを作ってみましょう」
https://github.com/miyako/4d-tutorial-my-first-plugin
ご参考になれば幸いです。
「簡単なプラグインを作ってみましょう」
https://github.com/miyako/4d-tutorial-my-first-plugin
山田敏之- 投稿数 : 272
登録日 : 2016/07/26
Ota likes this post
Re: プラグインの作成について
おお。
昔と違って、4Dが標準機能で大体の事ができる様になったので
プラグインは最近作ってませんでした。
ただ、やはりIME制御とかどうしても中々上手くいかない時とか
「プラグインをつくろうかなー」と思うことも時々あるので、
こういった情報はとても嬉しいです。
できれば、バージョンが変わる毎に差分をアップデートしてもらえると
嬉しいです。
もちろん、無理のない範囲でお願いします
昔と違って、4Dが標準機能で大体の事ができる様になったので
プラグインは最近作ってませんでした。
ただ、やはりIME制御とかどうしても中々上手くいかない時とか
「プラグインをつくろうかなー」と思うことも時々あるので、
こういった情報はとても嬉しいです。
できれば、バージョンが変わる毎に差分をアップデートしてもらえると
嬉しいです。
もちろん、無理のない範囲でお願いします
内山 高志- 投稿数 : 41
登録日 : 2016/07/13
Re: プラグインの作成について
説明してくれるのはとても助かるのですが...
C#やSwiftなど最新の言語で書く方法をご教授してもらわないと新規参入は望めないのではないでしょうか。
おそらくインターネット上にあるサンプルコードを参考にするはずなのですが、新しい機能になるほど、ほとんどがC#やSwiftで説明されたものがほとんどです。
後は特殊なハードウィアなどをコントロールする為の提供されたDLLや_NET Frameworkなどのライブラリを利用する方法や画像の扱い方などが新規参入される方には参考になるのではないかと思います。
C#やSwiftなど最新の言語で書く方法をご教授してもらわないと新規参入は望めないのではないでしょうか。
おそらくインターネット上にあるサンプルコードを参考にするはずなのですが、新しい機能になるほど、ほとんどがC#やSwiftで説明されたものがほとんどです。
後は特殊なハードウィアなどをコントロールする為の提供されたDLLや_NET Frameworkなどのライブラリを利用する方法や画像の扱い方などが新規参入される方には参考になるのではないかと思います。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
PythonやPHPの様に4D側でDLLを定義できるとほとんどプラグインは必要なくなる様な気もします。
4Dでもクラスが作れる様になったのでもうそろそろかなとは思っているのですが...
4Dでもクラスが作れる様になったのでもうそろそろかなとは思っているのですが...
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
まったくお察しのとおりで,開発部は「できればプラグインは使わないで欲しい」という意見が支配的です。むしろ,4D.SystemWorkerクラスで外部プログラムを制御することを積極的に勧めています。
https://blog.4d.com/system-worker-vs-launch-external-process/
最近はGo言語で開発されたCLIプログラムが充実しています。たとえば,Rcloneでファイルのアップロードやダウンロードができるかもしれません。
Goのメリットとして,自己完結したMac/Windows/Linuxの実行ファイルが用意されており,依存ファイルやライブラリなどをインストールする必要がなく,4Dプロジェクトと一緒に配付することが容易である,という点が挙げられます。
https://blog.4d.com/system-worker-vs-launch-external-process/
最近はGo言語で開発されたCLIプログラムが充実しています。たとえば,Rcloneでファイルのアップロードやダウンロードができるかもしれません。
Goのメリットとして,自己完結したMac/Windows/Linuxの実行ファイルが用意されており,依存ファイルやライブラリなどをインストールする必要がなく,4Dプロジェクトと一緒に配付することが容易である,という点が挙げられます。
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: プラグインの作成について
CLIでできるものとどうしてもプラグインでないと作れないものを分ける必要があるのですが、何か表みたいな物はありますか。
そうでないと簡単に呼び出せるのにわざわざプラグインを作ってしまうと思います。
そうでないと簡単に呼び出せるのにわざわざプラグインを作ってしまうと思います。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
まずはCLIを試してみて,ダメならプラグイン・・・でしょうか
たとえば
https://github.com/miyako/4d-component-gs
https://github.com/miyako/4d-component-pdfcpu
上記いずれもCLIでは「NG」なのでプラグインが必要かも・・と考えています。
たとえば
https://github.com/miyako/4d-component-gs
https://github.com/miyako/4d-component-pdfcpu
上記いずれもCLIでは「NG」なのでプラグインが必要かも・・と考えています。
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: プラグインの作成について
1. バーコード関連はプラグインで大変助かっています。お世話になりました。
2. ピクチャーの操作はできればプラグインの方が良いかと思います。変数で受け渡しができるので。
3. 映像および音声の録音もなどもプラグインの方が良いかと思います。Macでは権限関係もあるのでほぼできないですが。
それ以外はCLIがあればそちらで行たいです。
紹介していただいたGOの導入の仕方からGOで利用できる便利なコマンドの紹介があればありがたいです。
2. ピクチャーの操作はできればプラグインの方が良いかと思います。変数で受け渡しができるので。
3. 映像および音声の録音もなどもプラグインの方が良いかと思います。Macでは権限関係もあるのでほぼできないですが。
それ以外はCLIがあればそちらで行たいです。
紹介していただいたGOの導入の仕方からGOで利用できる便利なコマンドの紹介があればありがたいです。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
例1:OSのAPI、またはハードウェア添付のライブラリDLLから1つの関数を呼び出す。
この場合、何が最適でしょうか。
この場合、何が最適でしょうか。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
「DLL」は,Microsoft FoundationクラスライブラリやWin 32 DLLなど,Microsoftのライブラリ全般に使われているファイル拡張子です。つまり,DLLという拡張子だけでは,どんなファイルなのかわかりません。
https://docs.microsoft.com/ja-jp/cpp/build/kinds-of-dlls?view=msvc-170
CをコンパイルしたDLLであっても,使用したコンパイラーやリンクしたランタイムライブラリ,呼び出し規約,最適化フラグの種類によってリンクの仕方が違います。またCPUアーキテクチャが呼び出す側と合致している必要があります。
ハードウェア添付のDLLの場合,特に断りがなければ,LoadLibraryEx等のAPIでエントリーポイントを取得するタイプかと思われますので,Cで呼び出すのが一番シンプルかと思われます。つまりプラグインがベストの選択肢です。Win32 APIを呼び出す場合も同様です。ただし,APIの種類によってはPowerShell等のスクリプトでも達成できることがあります。
C#で作成したDLLは,i386/x86_64のコンパイルされたバイナリファイルではなく,C#の中間言語ライブラリなので,CではなくC#から呼び出す必要があります。つまり,プラグインではなく,外部プログラムを「たたく」スタイルになります。
Mac用のC#もありますが,すみません,使ったことがないので,良くわかりません・・・
https://visualstudio.microsoft.com/ja/vs/mac/
https://docs.microsoft.com/ja-jp/cpp/build/kinds-of-dlls?view=msvc-170
CをコンパイルしたDLLであっても,使用したコンパイラーやリンクしたランタイムライブラリ,呼び出し規約,最適化フラグの種類によってリンクの仕方が違います。またCPUアーキテクチャが呼び出す側と合致している必要があります。
ハードウェア添付のDLLの場合,特に断りがなければ,LoadLibraryEx等のAPIでエントリーポイントを取得するタイプかと思われますので,Cで呼び出すのが一番シンプルかと思われます。つまりプラグインがベストの選択肢です。Win32 APIを呼び出す場合も同様です。ただし,APIの種類によってはPowerShell等のスクリプトでも達成できることがあります。
C#で作成したDLLは,i386/x86_64のコンパイルされたバイナリファイルではなく,C#の中間言語ライブラリなので,CではなくC#から呼び出す必要があります。つまり,プラグインではなく,外部プログラムを「たたく」スタイルになります。
Mac用のC#もありますが,すみません,使ったことがないので,良くわかりません・・・
https://visualstudio.microsoft.com/ja/vs/mac/
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: プラグインの作成について
Macの場合は、dylibの呼び出しになるかと思います。.framewaorkを呼び出すとかでしょうか。
pythonのライブラリ呼び出しが参考になるのではないかと思います。
C#のDLLの場合、外部プログラムを「たたく」とは具体的にどの様になりますでしょうか。
pythonのライブラリ呼び出しが参考になるのではないかと思います。
C#のDLLの場合、外部プログラムを「たたく」とは具体的にどの様になりますでしょうか。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
コマンドラインアプリを作成してLEPで呼び出す方法ですね。
例1は全てこれで良いのではないでしょうか。タイムラグなどはあるかもしれませんが、デバッグも楽ですしわざわざプラグインにする必要がないと思います。
例1は全てこれで良いのではないでしょうか。タイムラグなどはあるかもしれませんが、デバッグも楽ですしわざわざプラグインにする必要がないと思います。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
windows限定ですがこれ使えないでしょうか。
System.Management.Automation.dll
Powershellをレスポンシブに実行できる様です。4Dのメソッドで実行できる様になればほとんどのAPIの呼び出しができる様なので
コマンドラインアプリ+LEPでなくてもよくなる様に思います。
System.Management.Automation.dll
Powershellをレスポンシブに実行できる様です。4Dのメソッドで実行できる様になればほとんどのAPIの呼び出しができる様なので
コマンドラインアプリ+LEPでなくてもよくなる様に思います。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
LAUNCH EXTERNAL PROCESSで
powershell -file {ps1ファイルのパス}
または
powershell -command {スクリプトのソースコード}
とするのはどうでしょうか
https://superuser.com/questions/1080239/run-powershell-command-from-cmd
システムワーカーを使用すれば
対話形式のCLIに対するキーボード入力をシミュレートすることができます。
https://blog.4d.com/launch-an-external-process-asynchronously/
powershell -file {ps1ファイルのパス}
または
powershell -command {スクリプトのソースコード}
とするのはどうでしょうか
https://superuser.com/questions/1080239/run-powershell-command-from-cmd
システムワーカーを使用すれば
対話形式のCLIに対するキーボード入力をシミュレートすることができます。
https://blog.4d.com/launch-an-external-process-asynchronously/
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: プラグインの作成について
LAUNCH EXTERNAL PROCESSでpowershell -file {ps1ファイルのパス}だと1つの実行で完結するのだと思いますが、
System.Management.Automation.dllではpowershellのプロセスを閉じる前で前回の状態を維持してくれるみたいなのです。
4Dメソッドの裏でpowershellのプロンプトが動いている感じではないでしょうか。これを使って独自シェルウィンドウを作っているサンプルがあった様に思います。
実行状況によって次に実行するコマンドレットを4Dメソッドから変更できるところがメリットではないかと考えました。
今までだとプラグインにしないといけなかった複数の関数の組み合わせを順番に呼び出して完結させないといけないカードリーダのAPIやTWAINのAPIなども4Dメソッド内で記述できる可能性があるのかと思いました。
System.Management.Automation.dllではpowershellのプロセスを閉じる前で前回の状態を維持してくれるみたいなのです。
4Dメソッドの裏でpowershellのプロンプトが動いている感じではないでしょうか。これを使って独自シェルウィンドウを作っているサンプルがあった様に思います。
実行状況によって次に実行するコマンドレットを4Dメソッドから変更できるところがメリットではないかと考えました。
今までだとプラグインにしないといけなかった複数の関数の組み合わせを順番に呼び出して完結させないといけないカードリーダのAPIやTWAINのAPIなども4Dメソッド内で記述できる可能性があるのかと思いました。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
簡単な例題を作成してみました
https://github.com/miyako/4d-class-powershell
> 実行状況によって次に実行するコマンドレットを4Dメソッドから変更できるところがメリットでは
たしかにそうなのですが,コマンドラインから返される文字列を解析するのがけっこう面倒だということが例題から感じていただけると思います。
https://github.com/miyako/4d-class-powershell
> 実行状況によって次に実行するコマンドレットを4Dメソッドから変更できるところがメリットでは
たしかにそうなのですが,コマンドラインから返される文字列を解析するのがけっこう面倒だということが例題から感じていただけると思います。
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: プラグインの作成について
例題ありがとうございます。早速動かして見たのですがこちらでは空白が返ってくるのですが、何か注意事項はありますでしょうか。
VMware+win10の環境です。
[System.Net.IPAddress]::Any | ConvertTo-Json -Compress
が実行するコマンドレットだと思いますが、Windows Powershell SE上ではちゃんとレスポンスが返ってきています。
VMware+win10の環境です。
[System.Net.IPAddress]::Any | ConvertTo-Json -Compress
が実行するコマンドレットだと思いますが、Windows Powershell SE上ではちゃんとレスポンスが返ってきています。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
フィードバックありがとうございます。
すみません,macOSでしか検証していませんでした。
修正点
https://github.com/miyako/4d-class-powershell
* Windowsは改行コードがCRLF・macOSは改行コードがLF
* コマンドを連続実行したい場合,コマンド毎にcloseInput()してはいけない。改行コードで入力を確定する。
* closeInput()は最後の入力で送信する。これでOnResponse, OnTerminateの流れとなる。
* closeInput()の後にコマンドは送信できない。stdInがbad file descriptorになる。
* OnResponseではすべての出力がまとめて返される。コマンド毎の出力はOnDataで捕捉する。
その他
* Macは色付けのESCシーケンスが返されるがWindowsは返されない。
https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
すみません,macOSでしか検証していませんでした。
修正点
https://github.com/miyako/4d-class-powershell
* Windowsは改行コードがCRLF・macOSは改行コードがLF
* コマンドを連続実行したい場合,コマンド毎にcloseInput()してはいけない。改行コードで入力を確定する。
* closeInput()は最後の入力で送信する。これでOnResponse, OnTerminateの流れとなる。
* closeInput()の後にコマンドは送信できない。stdInがbad file descriptorになる。
* OnResponseではすべての出力がまとめて返される。コマンド毎の出力はOnDataで捕捉する。
その他
* Macは色付けのESCシーケンスが返されるがWindowsは返されない。
https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: プラグインの作成について
再度試して見たのですがやはり空白が返ってきます。宮古さんのところでは動いてるんですよね。
何か足りないんでしょうか。
何か足りないんでしょうか。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
こちらではgit cloneしてMonterey, Catalina, Windows 10で検証しました。
Rバージョンをご使用でしょうか。
Rバージョンをご使用でしょうか。
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: プラグインの作成について
v19R6 282489です。
デバッグして見たところ、Function scriptのところで
PowerShell 7.2.6\r\nCopyright (c) Microsoft Corporation.\r\n\r\nhttps://aka.ms/powershell\r\nType 'help' to get help.
\r\n\r\n
PS C:\\Program Files\\4D\\4D v19 R6\\4D> [System.Net.IPAddress]::Any | ConvertTo-Json -Compress{"AddressFamily":2,"ScopeId":null,"IsIPv6Multicast":false,"IsIPv6LinkLocal":false,"IsIPv6SiteLocal":false,"IsIPv6Teredo":false,"IsIPv6UniqueLocal":false,"IsIPv4MappedToIPv6":false,"Address":0,"IPAddressToString":"0.0.0.0"}\r\n
のデータが返ってきていました。ですがなぜか取得したデータがcs.TEST.new().run().dataに入らず、ALERTで空白になっているみたいです。
結局これはLEPとの違いとしては内部的なコマンドプロンプトからpowershellを実行してpowershellのプロンプトを表示してコマンドレットを実行して結果を受けているので前回実行時の状態を維持できているという認識であってますでしょうか。
デバッグして見たところ、Function scriptのところで
PowerShell 7.2.6\r\nCopyright (c) Microsoft Corporation.\r\n\r\nhttps://aka.ms/powershell\r\nType 'help' to get help.
\r\n\r\n
PS C:\\Program Files\\4D\\4D v19 R6\\4D> [System.Net.IPAddress]::Any | ConvertTo-Json -Compress{"AddressFamily":2,"ScopeId":null,"IsIPv6Multicast":false,"IsIPv6LinkLocal":false,"IsIPv6SiteLocal":false,"IsIPv6Teredo":false,"IsIPv6UniqueLocal":false,"IsIPv4MappedToIPv6":false,"Address":0,"IPAddressToString":"0.0.0.0"}\r\n
のデータが返ってきていました。ですがなぜか取得したデータがcs.TEST.new().run().dataに入らず、ALERTで空白になっているみたいです。
結局これはLEPとの違いとしては内部的なコマンドプロンプトからpowershellを実行してpowershellのプロンプトを表示してコマンドレットを実行して結果を受けているので前回実行時の状態を維持できているという認識であってますでしょうか。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Re: プラグインの作成について
昨日アップしたバージョンはALERTも.dataもなかったと思います。
https://github.com/miyako/4d-class-powershell/blob/main/powershell/Project/Sources/Methods/TEST.4dm
当初のバージョンをお使いではないでしょうか
https://github.com/miyako/4d-class-powershell/blob/main/powershell/Project/Sources/Methods/TEST.4dm
当初のバージョンをお使いではないでしょうか
miyako- 投稿数 : 487
登録日 : 2016/07/05
Re: プラグインの作成について
リリースのところから4d-class-powershell-0.0.1.zipをダウンロードして確認しています。
メソッドにもis Windowsの処理が追加されているので新しいバージョンだと思います。
メソッドにもis Windowsの処理が追加されているので新しいバージョンだと思います。
hosaka- 投稿数 : 245
登録日 : 2016/07/04
所在地 : 大阪
Page 1 of 2 • 1, 2
Permissions in this forum:
返信投稿: 不可