SpiderMonkey 学習:再入門

2017-03-30 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-29)の記事「js-ctypes 学習:IUP でドラッグ&ドロップ」までで、
js-ctypes 学習がそれなりに進んだ。

改めて、
MDN > 開発者向けのWeb技術 > JavaScript > JavaScript ガイド
の、文法とデータ型
  本章では JavaScript の基本構文、変数宣言、データ型と
  リテラルについて説明します。
で学習した。


1.console.log() 関数がある。

  This function is an alias of the print() function.


2.コマンド起動時引数:

  以前の Ver.1.8.5 では、arguments だったが、
  今の Ver.54.0a1 では、scriptArgs

  これは、配列もどき?
  scriptArgs.length とか、scriptArgs[0] とか


3.サブの JavaScript ファイル( SUB.js )を起動できる:

   run( 'SUB.js' );
  これは、
   load( 'SUB.js' );
  と一緒???

  でも、どんなファイルでも出来るわけではない。


4.eval() 関数がある:

   d = eval( 'a=2; b=5; c=(a+b)/2; print(c*3)' ); // print までOK
   print( a, b, c, d ); // d はundefined
  続けて、
   d = eval( 'a*5.4' );
   print( a, d ); // d は正しく 10.8

  eval() は、evaluate() でも一緒。



本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く?


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170226
スポンサーサイト

js-ctypes 学習:IUP でドラッグ&ドロップ

2017-03-29 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-27)の記事「js-ctypes 学習:IUP - Portable User Interface」に続いて、
今度は、
IUPでのドラッグ&ドロップ・コールバック処理
に挑戦。

具体的には、
昨年3月(2016-03-19)の記事「GSL Shell 学習:IUP でドラッグ&ドロップ
に載せたコードをSpiderMonkeyに移植。


出来たコードは:
// ===== convert to '.js' =====
 var WinABI = ctypes.winapi_abi; var CBABI = ctypes.stdcall_abi;
 var VOID = ctypes.void_t; var VoidA = ctypes.voidptr_t;
 var Char = ctypes.char; var CharA = Char.ptr;
 var Uint8 = ctypes.uint8_t; var Byte = Uint8;
 var WORD = ctypes.uint16_t; var DWORD = ctypes.uint32_t;
 var Int32 = ctypes.int32_t;
 var Float = ctypes.float32_t; var Double = ctypes.float64_t;
 var HANDLE = ctypes.size_t; var HWND = HANDLE; var hWnd = HANDLE;
 var BOOL = ctypes.bool;
 var LPARAM = ctypes.size_t; var LPTSTR = ctypes.jschar.ptr;
var Cast = ctypes.cast;
var lib = ctypes.open( 'iup' );

var CB_DnD = ctypes.FunctionType( CBABI, VOID, [ HANDLE, CharA, Int32, Int32, Int32 ] );

var IupOpen = lib.declare( 'IupOpen', WinABI, VOID, Int32 );
var IupClose = lib.declare( 'IupClose', WinABI, VOID );
var IupDialog = lib.declare( 'IupDialog', WinABI, HANDLE, HANDLE );
var IupSetAttributes = lib.declare( 'IupSetAttributes', WinABI, VOID, HANDLE, CharA );
var IupSetCallback = lib.declare( 'IupSetCallback', WinABI, VOID, HANDLE, CharA, CB_DnD.ptr );
var IupPopup = lib.declare( 'IupPopup', WinABI, VOID, HANDLE, Int32, Int32 );

IupOpen( 0 ); // ----- これ必須!!!

function onDnD( Z, F, n, x, y ){
print( Z, n, x, y ); // -------- 数値, 0, x, y
fname = F.readString() // ----- 日本語含むとダメ???
IupClose()
}
var fname;
var dlg = IupDialog( 0 ) // -- 枠だけ
IupSetAttributes( dlg, '"SIZE"="160x120", "TITLE"="DnD here"' )
IupSetCallback( dlg, 'DROPFILES_CB', CB_DnD.ptr(onDnD) )
IupPopup( dlg, 100, 100 )
// -----------------
print( fname ); // -- これで フルパス:「\」セパレート
print( fname.split( '\\' ).slice( 0, -1 ).join( '\\' ) ); // folder 部分
print( fname.split( '\\' ).slice( -1 ) ); // ファイル名部分
var _ = readline();
こんな感じ?

これで、
D&Dでファイル名を得ることが出来る。


関連して今回学習したこと:

1.SpiderMonkey の変数名では、アンダーバー1文字でも可

2.GSL Shell の時、void* で定義していた IupDialog の引数を、
  正しく(?) HANDLE で定義すると利用時がスッキリする。

3.[char*].readString() では、日本語文字がダメ???



本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170225

js-ctypes 学習:IUP - Portable User Interface

2017-03-27 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-26)の記事「js-ctypes 学習:OpenCV のマウスコールバック処理
に続いて、
今度は、
GSL Shell では
昨年3月(2016-03-13)の記事「GSL Shell 学習:IUP - Portable User Interface」で書いた、
 Lua で GUI アプリを作成するためのクロス プラットフォーム キットIUP
に挑戦。
つまり、
ブログ記事に載せたコードをSpiderMonkeyに移植。


出来たコードは:
// ===== convert to '.js' =====
var VOID = ctypes.void_t; var VoidA = ctypes.voidptr_t;
var Char = ctypes.char; var CharA = Char.ptr
var Int32 = ctypes.int32_t;
var WinABI = ctypes.winapi_abi;

var lib = ctypes.open( 'iup' );

var IupOpen = lib.declare( 'IupOpen', WinABI, VOID, Int32 );
var IupMessage = lib.declare( 'IupMessage', WinABI, VOID, CharA, CharA );
var IupFileDlg = lib.declare( 'IupFileDlg', WinABI, VoidA );
var IupSetAttributes = lib.declare( 'IupSetAttributes', WinABI, VOID, VoidA, CharA );
var IupPopup = lib.declare( 'IupPopup', WinABI, VOID, VoidA, Int32, Int32 );
IupOpen( 0 ); // ----- これ必須!!!

IupMessage( 'test', 'OK?' ); // -- IupMessageDlg のテスト

var filedlg = IupFileDlg(); // -- IupFileDlg のテスト
IupSetAttributes( filedlg, 'DIALOGTYPE = LOAD, TITLE = "File Load"' );
IupSetAttributes( filedlg, 'FILTER = "*.png", FILTERINFO = "PNG Files"' );

IupPopup( filedlg, 0, 0 )
こんな感じ?

なんとか動いた。


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170224

js-ctypes 学習:OpenCV のマウスコールバック処理

2017-03-26 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-25)の記事「js-ctypes 学習:KWF_list 関数」で、
Win32API でのコールバック処理の実用的(?)なコードが作れた。

そこで、
先日(2017-03-19)の記事「js-ctypes 学習:cast そして OpenCV」で学習した、
画像処理の決定版(?)OpenCVに依る画像表示窓での
マウスイベントコールバック処理に挑戦。


プログラム内で指定した画像ファイルを読み込んで窓に表示。
この窓内でマウス(カーソル)を移動させたイベントを、
コールバック関数でそのカーソル位置を表示する。

と云ったもの。

出来たコードは:
// ===== mouseCB_CV.js =====
var VOID = ctypes.void_t; var Cast = ctypes.cast;
var Byte = ctypes.uint8_t; var Char = ctypes.char;
var DWORD = ctypes.uint32_t; var Int32 = ctypes.int32_t;
var CBABI = ctypes.stdcall_abi; var WinABI = ctypes.winapi_abi;

var lib = ctypes.open( 'opencv_world300' );

var CvMat = new ctypes.StructType( 'tagCvMat', [
{ 'type': DWORD }, { 'step': DWORD }, { 'refc': DWORD }, { 'hdrr': DWORD },
{ 'data': Byte.ptr }, { 'yy': Int32 }, { 'xx': Int32 } ]);

var CB_mouse = ctypes.FunctionType( CBABI, VOID, [ Int32, Int32, Int32, Int32 ] );

var cvLoadImageM = lib.declare( 'cvLoadImageM', WinABI, CvMat.ptr, Char.ptr, Int32 );
var cvNamedWindow= lib.declare( 'cvNamedWindow', WinABI, Int32, Char.ptr, Int32 );
var cvShowImage = lib.declare( 'cvShowImage', WinABI, VOID, Char.ptr, CvMat.ptr );
var cvWaitKey = lib.declare( 'cvWaitKey', WinABI, Int32, Int32 );
var cvDestroyAllWindows= lib.declare( 'cvDestroyAllWindows', WinABI, VOID );
var cvSetMouseCallback= lib.declare( 'cvSetMouseCallback', WinABI, VOID, Char.ptr, CB_mouse.ptr );

// ====================================
var fname = 'hogehoge.png'
var img = Cast( cvLoadImageM( fname, 0 ), CvMat.ptr ).contents;
var xx=img.xx; var yy=img.yy; var sz = xx * yy;

var BT = Cast( img.data, Byte.array(sz).ptr).contents;

function onmouse( event, x, y, flag ){
if( event == 0 ){ // 0 == cv2.EVENT_MOUSEMOVE
print( event, x, y, flag );
}
}

cvNamedWindow( 'img', 0 );
cvSetMouseCallback( 'img', CB_mouse.ptr(onmouse) );

while( true ){
cvShowImage( 'img', img.address() )
var k = cvWaitKey(50) & 0xFF;
if( k == 27 ){ break; } // esc to exit
}

cvDestroyAllWindows();
lib.close();
こんな感じ?

出来ました。

但し、
マウスを動かす毎にコンソール窓にダラダラ表示されるが。
未だ、学習の身なのでヨシとしよう。


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170221

js-ctypes 学習:KWF_list 関数

2017-03-25 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-24)の記事「js-ctypes 学習:コールバック処理」で、
コールバック処理コード
及び、
typedefに相当することや関数の別名定義
を学習した。

題材が、'EnumWindows' だったので、・・・・・

昨年(2016-08-01)の記事「KWF (kami's Window Functions) モジュール」で書いた、
“KWF.lua”モジュールの“KWF.List()”関数相当品を作ってみた。
ほぼ、1体1対応のコードで作れた:
/***** CB_EnumWin_KWF.js *****/
var lib = ctypes.open( 'user32.dll' );

var DWORD = ctypes.uint32_t; var Int32 = ctypes.int32_t;
var HANDLE = ctypes.size_t; var BOOL = ctypes.bool;
var LPARAM = ctypes.size_t; var LPTSTR = ctypes.jschar.ptr;
var CBABI = ctypes.stdcall_abi; var WinABI = ctypes.winapi_abi;
var ArrayT = ctypes.ArrayType; var Cast = ctypes.cast;
/// -----------------------------

var CB_EnumWin = ctypes.FunctionType( CBABI, BOOL, [ HANDLE, LPARAM ] );
var EnumWindows = lib.declare( 'EnumWindows', WinABI, BOOL, CB_EnumWin.ptr, LPARAM );

var IsWindowVisible = lib.declare( 'IsWindowVisible', WinABI, BOOL, HANDLE );
var GetWindowLongA = lib.declare( 'GetWindowLongA', WinABI, Int32, HANDLE, Int32 );
var GetWindowTextW = lib.declare( 'GetWindowTextW', WinABI, Int32, HANDLE, LPTSTR, Int32 );
var GetWindowThreadProcessId = lib.declare('GetWindowThreadProcessId', WinABI, DWORD,
HANDLE, DWORD.ptr );
// ------- 以上宣言部 、以下が関数 -----
function KWF_List(){
var Wcnt = 0; var pIDT = new Array();
var PID = new DWORD; var wnd = LPARAM(0);
var Buf = new new ArrayT( ctypes.jschar, 256 );

var CB_Proc = function( hwnd, l ){
if( IsWindowVisible( hwnd ) ){ // 先ずは、これで絞る。
var h = GetWindowLongA( hwnd, -8 ); // -8 == GWL_HWNDPARENT : 親Windowハンドル
if( h == 0 ){ // 自分が親か?
if( GetWindowTextW( hwnd, Buf, 255 ) > 0 ){
Txt = Buf.readString();
var thr = GetWindowThreadProcessId( hwnd, PID.address() );
pIDT[Wcnt] = new Array( hwnd, Txt, PID.value, thr );
Wcnt++;
}
}
}
return true; //let enum continue till nothing to enum
}

EnumWindows( CB_EnumWin.ptr( CB_Proc ), Cast( wnd.address(), LPARAM ) ); // これメイン
return pIDT;
}
/************* テスト・メイン *********/
var pIDT = KWF_List(); /* ここから開始 */
Wcnt = pIDT.length; print( Wcnt );
for( k=0; k var WinH=pIDT[k][0]; var Txt=pIDT[k][1]; var PID=pIDT[k][2]; var thrd=pIDT[k][3];
print( WinH.toString(16), PID, thrd, Txt );
}
lib.close();
var str = readline();
結果は、以上。
ここで、
テストしていて、
'GetWindowTextA' ではダメだったので 'GetWindowTextW' に代えた。
これでも、まだ日本語のテキストは正しく出ない???


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170219

js-ctypes 学習:コールバック処理

2017-03-24 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-22)の記事「SpiderMonkey:バージョンアップ」で、
SpiderMonkey 54.0a1 にバージョンアップした。

それで、js-ctypes 学習を継続。

今回は、コールバック処理のコーディング。

それには、昨年6月、7月、8月の記事で出てくる、
EnumWindows”が最適。
何か良い例が無いか? 探してみた。


Standard OS Libraries」ページには、
  ・・・・・
  ・・・・・
  Windows
  ・・・・・
  ・・・・・
  WinAPI
  ・・・・・
  ・・・・・
  Resources for WinAPI
  ・ GitHubGISTS :: Noitidart / Search・winapi
    - WinAPI js-ctypes snippets that can be copied and ・・・
  ・・・・・
  ・・・・・
とあるので、見に行った。

  We've found 46 gist results

と云うことで、この中にはどうか?


ありました:2ページ目の7番目(17/46 ですね)
  Noitidart / _ff-addon-snippet-WINAPI_GetRunningPids.js”
これが正に欲しいもの。

このコードを“View”ボタンクリックで表示して、
コピー&ペースト。
(ファイルのコードは 'UTF-8' として)
Cu.import(~) と、console.time(~) は、コメント・アウトし、
console.log(~) は、print(~) に変更した。
これで、動作した。

このコードは、“GSL Shell”での、
昨年6月(2016-06-25)の記事「ウィンドウ・ハンドルの取得」に近い???

このコードからコールバック処理以外も学習。

typedefの様な abbreviation 定義が出来る
しかも関数についても別名を定義できる。


そこで、<紙>流に分かり易く(?)書き直してみた:
// ===== sample_CB_EnumWindows.js =====
var lib = ctypes.open( 'user32.dll' );

/********* この様な abbreviation 定義が出来る ******/
var DWORD = ctypes.uint32_t; var HANDLE = ctypes.size_t;
var HWND = HANDLE; var BOOL = ctypes.bool;
var LPARAM = ctypes.size_t; var LPTSTR = ctypes.jschar.ptr;
var CBABI = ctypes.stdcall_abi; var WinABI = ctypes.winapi_abi;
var arrayT = ctypes.ArrayType; var Cast = ctypes.cast; /* 関数もOK */

var E_WinProc = ctypes.FunctionType( CBABI, BOOL, [HWND, LPARAM] ); /* CB 関数型宣言 */

var E_Win = lib.declare( 'EnumWindows', WinABI, BOOL, E_WinProc.ptr, LPARAM );
var GetClassNm = lib.declare('GetClassNameW', WinABI, ctypes.int, HWND, LPTSTR, ctypes.int);

var GetWin_Th_ProcId = lib.declare('GetWindowThreadProcessId', ctypes.winapi_abi,
DWORD, HWND, ctypes.uint32_t.ptr ); // ctypes.uint32_t.ptr == LPDWORD

// ------------------
function getRunningPids(){ //returns array of pids of running firefox instances
var ffPids = {};
var PID = new DWORD;
var buf = new new arrayT( ctypes.jschar, 255 );

var SearchPD = function( hwnd, lParam ){
GetClassNm( hwnd, buf, 255 );
var className = buf.readString();
if (className == 'MozillaWindowClass'){
var rez = GetWin_Th_ProcId( hwnd, PID.address() );
ffPids[PID.value] = 0;
};
return true; //let enum continue till nothing to enum
}
var SearchPD_ptr = E_WinProc.ptr( SearchPD );
var wnd = LPARAM(0);
E_Win( SearchPD_ptr, Cast( wnd.address(), LPARAM ) ); /* これが CB のサンプル */
return Object.keys( ffPids );
}

var pids = getRunningPids(); /*** 開始 ***/
print( 'pids:', pids , pids.length );

lib.close();
var str = readline();
Callback 処理はこの様なコードで!


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170218

SpiderMonkey:バージョンアップ

2017-03-22 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
先日(2017-03-08)の記事「JavaScript:SpiderMonkey で行く」では、
4年前(2013-12-15)の記事「SpiderMonkey:JavaScriptインタプリタ」で書いた、
SpiderMonkey Ver 1.6 から、Ver 1.8.5 にアップした。
  Ver 1.6 に比べて、約3倍速?
  WSH の JScript に比べて2.4倍速?
そうは云っても、まだまだ遅いもの。

だが、
js-ctypes なる機能があり:「SpiderMonkey 学習:js-ctypes 入門
非常に気に入っている。

本来の JavaScript の機能には<紙>的には満足している訳では無いが、
気に入っている js-ctypes について、ここまである程度学習した。

後は、処理速度の問題。

現在は、SpiderMonkey 38 ?:SpiderMonkey
いや、SpiderMonkey 45 ?:SpiderMonkey releases

Just-In-Time compiler が目に入った:Internals

どの位速くなるのか?

何とか新しいものを手に入れることが出来ないか???
或いは、自分でビルド出来ないか???


SpiderMonkey Windows binary」検索で、

Qiita の「windows上でSpiderMonkeyコマンドライン環境を構築」を見つけた。
  ソースからコンパイルするのではなく、バイナリを落とせばOK。
  の筈だったのですが、ちょっとはまったのでメモしておきます。

  基本的なやり方はここに書いてあります。
  ・・・・・
  ・・・・・
  1.<URL>(リンク)
  から
  jsshell-win32.zipまたはjsshell-win64-x86_64.zipをダウンロードする。

  2.展開してjs.exeを実行する

  でOKの筈だったのですが、・・・・・
  ・・・・・
  ・・・・・

これは、どうか?

だが、上記リンクは txt ファイル1つ:
  This directory is no longer in use. Please use
   <URL>
  instead.

ダメだ。

そこで、
jsshell-win32」検索を行った。

Directory Listing: /pub/firefox/nightly/latest-mozilla-central/」を見つけた。

ここの下から3番目に、

  File jsshell-win32.zip(リンク)

があったので、
nightlyだけど、これをダウンロードした。

展開のみでOKダ。


早速、Ver.1.8.5 を展開したフォルダ:D:/TOOL/SpiderMonkey/
の3つの代わりに、
展開した、全46ファイルを置いた。
js.exe 以外は45ヶの DLL オンパレード。
バージョンは、54.0a1 進みすぎ!


それで、
例のフィボナッチ数計算のベンチマークでは、・・・

Ver.1.8.5 では、16.6 ~ 18.1 秒で、
GSL Shell の 0.74 秒 に比べて 22.5 ~ 24.4 倍遅い。
(因みに例のサイトには、SpiderMonkey(38.1) 0.537 秒 とある)

これが、なんと 0.408 秒となった。超超高速!!!


但し、
“.js”ファイルは“UTF-8”で保存すべし


これで、大満足? 十分満足? 可成り満足?


更なる、js-ctypes の学習に力が入る???


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170217

js-ctypes 学習:msvcrt.dll 利用( fopen、_popen )

2017-03-20 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-19)の記事「js-ctypes 学習:cast そして OpenCV」に続いて、
SpiderMonkey /js-ctypes の学習継続。

Win32API の“kernel32.dll”、“user32.dll”が使えたので、
今度は、Win32API の親戚?“msvcrt.dll”に挑戦。

msvcrt とは→CRT ライブラリの機能

このライブラリには、fopen とか、fread 関数等がある。

それで、主なもの4つを MSDN でチェックした:
FILE* fopen( const char* filename, const char* mode );
int fclose( FILE* stream );
size_t fread( void* buffer, size_t size, size_t count, FILE* stream );
size_t fwrite( const void* buffer, size_t size, size_t count, FILE* stream );
これらを使って、

先日(2017-03-12)の記事「js-ctypes 学習:文字列データの変換とファイル入出力
で書いた、“file_Wt.js”、“file_Rd.js”を書き換えてみた。

今回は1本のプログラムで、読み込みと書き出し:
// ----- file_IO_msvcrt.js -----
var libC = ctypes.open( 'msvcrt' );

var fopen = libC.declare( 'fopen', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.char.ptr );
var fclose = libC.declare( 'fclose', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.uint32_t );
var fread = libC.declare( 'fread', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.uint8_t.ptr, ctypes.int32_t, ctypes.int32_t , ctypes.uint32_t );
var fwrite = libC.declare( 'fwrite', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.int32_t, ctypes.int32_t , ctypes.uint32_t );
// ----------
var IN = fopen( 'yyy.txt', 'r' );
print( IN ); // 念の為

var Buf = ctypes.uint8_t.array(257)();
var SZ = fread( Buf, 1, 256, IN );
print( SZ ); // 確認
var str = Buf.readString();
print( str ); // JavaScript の文字列
// ----------
var OT = fopen( 'zzz.txt', 'w' );
print( OT ); // 念の為

var str = 'HOGEHOGE\nNew Line\n';
var SZ = fwrite( str, 1, str.length, OT );
print( SZ ); // 確認
// ----------
var ret = fclose( IN ); print( ret );
var ret = fclose( OT ); print( ret );

libC.close(); var str = readline();
こんな感じ


更に、msvcrt には、_popen 関数もあった。
そうすると、
昨年11月(2016-11-25)の記事「Lua から gnuplot 利用の方式」で書いた、
  ・・・・・
  ・・・・・
  即ち、
  一々「plt」ファイルを作ってからそれを実行する
  のでは無くて、
  即時に gnuplot を動かす。
  これは、
  GP = io.popen( 'gnuplot -persistent', 'w' )
  で、gnuplot をオープンして(立ち上げて)おいて、
  「plt」ファイルに書き込む様に、“GP”ファイルに書き込む。
  ・・・・・
  ・・・・・
この部分に対応して、
_popen”を使って、gnuplot が使える?

やってみた:
// ----- gnuplot_popen_msvcrt.js -----
var libC = ctypes.open( 'msvcrt' );

var popen = libC.declare( '_popen', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.char.ptr );
var fputs = libC.declare( 'fputs', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t );
var fclose = libC.declare( 'fclose', ctypes.winapi_abi, ctypes.int32_t,
ctypes.uint32_t );

var gp = popen( 'gnuplot -persistent', 'w' );
print( gp ); // 念の為

var ret = fputs( 'plot sin(x)\n', gp ); // ===== グラフ表示
print( ret ); // 念の為

var ret = fclose( gp );
libC.close(); var str = readline();
これでは、“fwrite”の代わりに“fputs”を使ってみた。
出来た。


やはり、Win32API 直接より、コーディングが楽?


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170217

js-ctypes 学習:cast そして OpenCV

2017-03-19 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-18)の記事「js-ctypes 学習:外部プログラムの実行」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
Tipe casting ( 変換 )について学習。

js-ctypes のドキュメント:
MDN > Mozilla > js-ctypes > Using js-ctypes の、
Working with data」に、
  ・・・・・
  ・・・・・
  Type casting
  You can type cast data from one type to another
   by using the ctypes.cast() function:

  var newObj = ctypes.cast(origObj, newType);

  This will return a new object whose data block is shared
   with the original object, but whose type is newType.
  If the size of the new type is undefined or larger than
   the size of the original object's data block, TypeError is thrown.

  This works very much like a standard C type cast or C++ reinterpret_cast.

即ち(Google翻訳で)

  ctypes.cast()関数を使用すると、あるタイプから別のタイプへの
  キャストデータを入力できます。

  var newObj = ctypes.cast(origObj、newType);

  これは、元のオブジェクトとデータブロックが共有されているが、
  その型がnewTypeである新しいオブジェクトを返します。
  新しい型のサイズが未定義であるか、元のオブジェクトのデータブロックの
  サイズよりも大きい場合は、TypeErrorがスローされます。

  これは、標準のCタイプのキャストやC ++のreinterpret_castと
  非常によく似ています。

まあ、分かるかナ。

続けて、
  Example: Cast an array
  This example shows
  how to cast an array of a certain type to another type.
とある。

これで、学習した:
// バイト配列8要素、値格納:
var B = ctypes.uint8_t.array(8)( [8,7,6,5,4,3,2,1] );
print( B[6], B[7] ); // 念のための確認: 2, 1 最後の2要素

// 上記を、2バイト配列4要素に cast
var I = ctypes.cast( B.address(), ctypes.uint16_t.array(4).ptr).contents;
print( I[3] ); // 0x0102 == 258 で、OK
こんな風に。

更に、構造体への cast は?
// uint32_t 配列7要素、値格納:
var A = ctypes.uint32_t.array(7)( [7,6,5,4,3,2,1] );
print( B[6], B[7] ); // 念のための確認: 2, 1 最後の2要素

// 上記を、構造体に cast
var CvMat = new ctypes.StructType( 'CvMat', [
{ 'type': ctypes.int32_t }, { 'step': ctypes.int32_t },
{ 'refc': ctypes.int32_t }, { 'hdrr': ctypes.int32_t },
{ 'data': ctypes.uint8_t.ptr },
{ 'yy': ctypes.int32_t }, { 'xx': ctypes.int32_t } ]);
var K = ctypes.cast( A.address(), CvMat.ptr ).contents;
print( K.yy, K.xx ); // 2, 1 OK:これで行ける
つまり、要点は、“.contents”を付ける事?
この例は、OpenCV を使いたい為に選んだもの。


実は、今回の学習は、
昨年2月(2016-02-23)の記事「GSL Shell 学習:OpenCV 使えそうダ?」で書いた、
  「opencv_world300.dll」26.3MB 1つ。
この DLL を利用しようと、数日間悪戦苦闘していたことから始まった。

あれこれ悩み&検索していたが、
どうも、cast の問題の様なので、上記の例に至った。

と云うことで、
やってみた:
// ---------- test_OpenCV.js ----------
var lib = ctypes.open( 'opencv_world300' );
var CvMat = new ctypes.StructType( 'CvMat', [
{ 'type': ctypes.uint32_t }, { 'step': ctypes.uint32_t },
{ 'refc': ctypes.uint32_t }, { 'hdrr': ctypes.uint32_t },
{ 'data': ctypes.uint8_t.ptr },
{ 'yy': ctypes.int32_t }, { 'xx': ctypes.int32_t } ]);
var cvCreateMat = lib.declare('cvCreateMat' ctypes.winapi_abi,CvMat.ptr,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );

var M = cvCreateMat( 5, 4, 0 ); // rows, cols, type(CV_8U)
var C = ctypes.cast( M, CvMat.ptr ).contents; // これが必要
print( C.type.toString(16), C.yy, C.xx ); // 0x42424000 5 4 OK
ss = C.xx * C.yy
var D = ctypes.cast( C.data, ctypes.uint8_t.array(ss).ptr ).contents;
print( D[0], D[ss-1] ); // 0 0 初期状態なので。エラーじゃ無いからOK?
で使えそう。


結論:
戻り値が構造体の場合は、
直接 CvMat で参照してもダメ?
1度 cast するコト!
それも“.contents”を付ける!


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170216

js-ctypes 学習:外部プログラムの実行

2017-03-18 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-17)の記事「js-ctypes 学習:画像ファイルの入力」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
外部プログラムの実行について。

Luaでは、
昨年3月(2016-03-01)の記事「GSL Shell 学習:外部プログラムの実行」で書いた、
  os.execute

Pythonでは、
3年前(2014-03-10)の記事「Python 学習:system関数?」で書いた、
  subprocess モジュール

Perlでは、
4年前(2013-08-03)の記事「PerlからRを使ってグラフ出力」で書いた、
  system( ) 関数


「Win32API open exe」で検索してみた。
例の“Stack Overflow”の、
winapi - win32 API for running other exe」が真っ先に見つかる。

回答の[2] に、
  The windows CreateProcess API call is what you're looking for: ~~~


「CreateProcess 使い方」で検索したら、
外部プロセスの起動」が見つかる。

  ・・・・・
  ・・・・・
  2.CreateProcess関数
  外部プロセス起動Windows APIとしては WinExec関数がある。

UINT WinExec(
LPCSTR lpCmdLine, // コマンドラインへのポインタ
UINT uCmdShow // ウィンドウの表示状態
);
  第二引数を SW_SHOW とすればコマンドプロンプト画面が表示され、
  SW_HIDE とすれば表示されない。
  しかし、この関数は Windows の以前のバージョンとの互換性のために
  残されているものであり、Win32 アプリケーションでは、
  CreateProcess 関数を使うことが推奨されている。
  下に使用例を示す。CreateProcess関数はWinExec関数より高い機能を持つ
  代わりに、使い方が少々面倒である。
  ・・・・・
  ・・・・・

まあ、
もし使っていいものなら、これで十分ダ。

MSDN:WinExec

内容は、上記参照記事と一緒。

気になるのは、“SW_SHOW”“SW_HIDE”の値。
でも、“SW_SHOW”ダケ知りたい。(“SW_HIDE”は要らない)
これについては、
1月(2017-01-30)の記事「Win32 APIの定数:定義は?」で書いた、
ダウンロードした const.lzh 書庫ファイル にある。
  $00000005
とありました。
つまり、
  0x00000005 == 5
ですネ。

なお、“WinExec”がどの DLL に含まれるのかは、
1月(2017-01-23)の記事「クライアント/サーバ:プロセス間通信」を
書いたときに参照(学習)したサイトの内の
 ・PInvoke.net

これで調べる(検索する)と、“kernel32”とあった。


と云うことで、

1本作った:
// ---------- test_WinExec.js -----
var lib = ctypes.open( 'kernel32' );

var WinExec = lib.declare( 'WinExec', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.uint32_t );
var ret = WinExec( 'notepad a.txt', 5 );
print( ret ); // 確認の為

lib.close();
var str = readline();
これで、“メモ帳”が立ち上がって、'a.txt' を開いている。


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170215
おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
02 | 2017/03 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク