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

js-ctypes 学習:画像ファイルの入力

2017-03-17 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-15)の記事「js-ctypes 学習:プロセス間通信の例」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
昨年1月(2016-01-29)の記事「Lua 学習:IM ( An Imaging Toolkit )」で書いた、
  ・・・・・
  ・・・・・
  “IM”は?・・・“3.10”が 2015-09-18 にリリースされている。
  これに決めよう。
  “Windows”の“Dynamic”の“32ビット版”と云うことで、
  「im-3.10_Win32_dllw4_lib.zip」(2015-09-18付)  1.72MB
  をダウンロードした。
  中には沢山入っているが、
  「im.dll」(1.61MB)1つあれば良さそう?

  「IM」ページの左側:
  “Storage”の“Guide”ページにある例から、( FFI 利用 )
  ・・・・・
  ・・・・・

この「im.dll」を使って画像ファイルの入力処理。

先ずは、
当該ブログ記事のコードを(ほぼそのまま)移植:
// --------------- im_sample.js ----------
var lib = ctypes.open( 'im' );

var imOpen = lib.declare( 'imFileOpen', ctypes.winapi_abi, ctypes.voidptr_t,
ctypes.char.ptr, ctypes.int32_t.ptr );

var fname = 'hogohoge.tiff'
var err = ctypes.int32_t(1);

var IN = imOpen( fname, err.address() );
print( IN, err.value ); // 確認の為

var imInfo = lib.declare( 'imFileReadImageInfo', ctypes.winapi_abi, ctypes.int32_t,
ctypes.voidptr_t, ctypes.int32_t,
ctypes.int32_t.ptr, ctypes.int32_t.ptr,
ctypes.int32_t.ptr, ctypes.int32_t.ptr );
var xx = ctypes.int32_t(1); var yy = ctypes.int32_t(1);
var col = ctypes.int32_t(1); var typ = ctypes.int32_t(1);
var Er = imInfo( IN, 0, xx.address(), yy.address(), col.address(), typ.address() );
print( xx.value, yy.value, col.value, typ.value );

var imClose = lib.declare( 'imFileClose', ctypes.winapi_abi, ctypes.int32_t,
ctypes.voidptr_t );
imClose( IN );

lib.close();
var str = readline();
これで、同じ出力結果が得られた。


それで、データ本体の取得は?・・・

ファイルクローズの前に、以下を追加。

var imRead = lib.declare( 'imFileReadImageData', ctypes.winapi_abi,  ctypes.int32_t,
ctypes.voidptr_t, ctypes.uint8_t.ptr, ctypes.int32_t, ctypes.int32_t );
var Buf = ctypes.uint8_t.array(257)();
Er =imRead( IN, Buf, 0, -1 ); // If flag is -1 the file original flags are used.
確認の為の表示:
print( Buf[0], Buf[xx.value-1], Buf[xx.value*yy.value-1] );
でしょうか?


完璧???


本日はここまで。


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


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


170214

js-ctypes 学習:プロセス間通信の例

2017-03-15 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-13)の記事「js-ctypes 学習:LuaPy 使用」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
1月(2017-01-23)の記事「クライアント/サーバ:プロセス間通信」で書いた如く、
“GSL Shell”で作った“test_Server.gsl”“test_Client.gsl”を、
“SpiderMonkey”に移植してみた。

今回も、「Win32 API でのファイルアクセス」ページ等を参考にさせて頂いた。


初めに、“test_Client.gsl”を移植して“Client.js”を作った:
// ------------------ Client.js
var libK = ctypes.open( 'kernel32' );
// ---------- 宣言して
var CreateFile = libK.declare( 'CreateFileA', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );
// ---------- 実行
var fname = '\\\\.\\pipe\\mypipe';
var hPipe = CreateFile( fname, 0xC0000000, 0, 0, 3, 0x80, 0 );
// 0xC~ : READ/WRITE、 0x80 : 通常はこれで
print( hPipe ); // 確認の為

var str = 'hogehoge';
var SZ = ctypes.int32_t(1);
var fwrite = libK.declare( 'WriteFile', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.char.ptr, ctypes.int32_t,
ctypes.int32_t.ptr, ctypes.int32_t );
var ret = fwrite( hPipe, str, str.length, SZ.address(), 0 );
print( ret, SZ.value );

var str = readline(); // 手動での動作確認の為

var fwrite = libK.declare( 'WriteFile', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.char.ptr, ctypes.int32_t,
ctypes.int32_t.ptr, ctypes.int32_t );
var ret =fwrite( hPipe, 'kamikamizzz', 11, SZ.address(), 0 );
print( ret, SZ.value );

var str = readline(); // 手動での動作確認の為


var fclose = libK.declare( 'CloseHandle', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t );
var ret =fclose( hPipe );
print( ret ); // 確認の為
これで、イイかな?

既存の“test_Server.gsl”を立ち上げた後、
“Client.js”を立ち上げて受信結果を確認。

OKだ。


次に、“test_Server.gsl”を移植して“Server.js”を作った:
// ------------------- Server.js
var libK = ctypes.open( 'kernel32' );

var CreatePIPE = libK.declare( 'CreateNamedPipeA', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );
var fname = '\\\\.\\pipe\\mypipe';
var hPipe = CreatePIPE( fname, 3, 0, 3, 0, 0, 100, 0 );
print( hPipe ); // 確認の為

var ConnectPIPE = libK.declare( 'ConnectNamedPipe', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t );
var rcd = ConnectPIPE( hPipe, 0 );
print( rcd ); // 確認の為

var Buf = ctypes.char.array(257)();
var SZ = ctypes.int32_t(1);
var fread = libK.declare( 'ReadFile', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.char.ptr, ctypes.int32_t, // この char は上記対応!
ctypes.int32_t.ptr, ctypes.int32_t );

while ( true ){
var rcd =fread( hPipe, Buf, 256, SZ.address(), 0 );
if( rcd==0 ){ break; }
print( rcd ); // 確認の為
print( SZ.value ); // 確認の為
str = Buf.readString();
print( str ); // 目的の動作確認
}

var FlushFileBuffers = libK.declare( 'FlushFileBuffers', ctypes.winapi_abi,
ctypes.int32_t, ctypes.int32_t );
var rcd = FlushFileBuffers( hPipe );
print( rcd ); // 確認の為

var DisconnectNamedPipe = libK.declare( 'DisconnectNamedPipe', ctypes.winapi_abi,
ctypes.int32_t, ctypes.int32_t );
var rcd = DisconnectNamedPipe( hPipe );
print( rcd ); // 確認の為

var fclose = libK.declare( 'CloseHandle', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t );
var ret =fclose( hPipe );
print( ret );
で良さそう。

この“Server.js”を立ち上げておいて、
“test_Client.gsl”を立ち上げての動作確認。

OK。


駄目押しで、
“Server.js”と“Client.js”での通信。

完了。


本日はここまで。


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


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


170213

js-ctypes 学習:LuaPy 使用

2017-03-13 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-12)の記事「・・・文字列データの変換とファイル入出力」に続いて、
SpiderMonkey ( JavaScript/js-ctypes ) の学習継続。

先日(2017-03-11)の記事「SpiderMonkey/js-ctypes 学習」で、
自作の(機能的にはショボイものだが)test_dll.dllを使うことが出来た。

それでは、
かなりまともな(?)ものではどうか?

昨年7月(2016-07-04)の記事「LuaPy.dll 改訂」で書いた、
LuaPy_1.dll を使うことに挑戦。

出来たなら JavaScript から Python を利用できる。

やってみた。

つまりは、test_LuaPy_1.gsl の移植:
(“LuaPy_1.dll”は勿論の事“Sub_LuaPy_1.py”も当然必要)
// ===== test_LuaPy_1.js =====
var libL = ctypes.open( 'LuaPy_1' );

// int PyIni( char* ); // Pyファイル名
var PyIni = libL.declare( 'PyIni', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr );

// int PyFun( char*, int, void* ); // 関数名、Stage、領域
var PyFun = libL.declare( 'PyFun', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.int32_t, ctypes.int32_t.ptr );

// int PyFin( ); // Pyファイナライズ
var PyFin = libL.declare( 'PyFin', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t ); // 要ダミー???

// ----- 以上、宣言部 -----

// p = ffi.new( 'int32_t[2]' )
var p = ctypes.int32_t.array(2)(); // 配列データの宣言


print( PyIni( 'Sub_LuaPy_1' ) ); // Python 初期化

p[0]=5;
print( PyFun( 'fun', 0, p ) ); // 関数指定で呼出 ステージ
print( PyFun( 'fun', 1, p ) ); // 関数指定で呼出 ステージ

p[0]=20;
print( PyFun( 'fun2', 0, p ) ); // 関数指定で呼出 ステージ
print( PyFun( 'fun2', 1, p ) ); // 関数指定で呼出 ステージ

print( PyFin( 0 ) ); // Python ファイナライズ

libL.close();
var str = readline();
とした。

出来た!


ここで、学習したコト:

1.日本語コメントを含んでいる時、
   '.js' ファイルのコードが 'UTF-8' ではエラーとなる。
   いつでも、シフトJIS で行くべきダ。

2.関数呼び出し時、
   引数無しの方法が分からない?
   取り敢えず、ダミーで整数を指定した。


更に、決定版(?)
8月(2016-08-13)の記事「LuaPy 経由で使う汎用 Python サブ」で作った、
汎用の“Sub_LuaPy_Gen.py”を使う。

面倒なので、
当時の“test_Main_Sub_LuaPy_Gen.gsl”の移植じゃないもの:
// ===== test_LuaPy_Gen.js =====
var libL = ctypes.open( 'LuaPy_1' );

var PyIni = libL.declare( 'PyIni', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr );

var PyFun = libL.declare( 'PyFun', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.int32_t, ctypes.voidptr_t.ptr );
// ^^^^^^^^^^^^^^^^^^^^
var PyFin = libL.declare( 'PyFin', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t ); // 要ダミー

// ----- 以上、宣言部 -----

var IT = ctypes.voidptr_t.array(40)();

ret=PyIni( 'Sub_LuaPy_Gen' );

IT[0] = ctypes.char.array(5)('x=5;').address();
IT[1] = ctypes.char.array(11)('print x+2;').address();

ret = PyFun( 'Exec', 2, IT ); // ===== 関数指定で呼出
// x=5; print x+2; なので、 7 と表示される

ret=PyFin(0);
libL.close();
var str = readline();
となった。

本日学習したコト(続):

3.“PyFun”関数の第3引数:
   voidは JavaScript の予約語なので、voidptr_tで、
   ctypes.voidptr_t.ptrとなる。

4.配列先頭アドレス:
   hoge配列.address() で hoge配列の先頭アドレスとなる。


本日はここまで。


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


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


170212

js-ctypes 学習:文字列データの変換とファイル入出力

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

今回学習したのは、
ファイルへの出力と、ファイルからの入力。

Win32 API でのファイルアクセス」ページ等を参考にさせて頂いた。


だが、
その前にJavaScriptCの間での文字列の変換
が必要だった。

kernel32.dllにある「WriteFile」関数で出力する場合、
第2引数でバッファを指定する。
この時、
・宣言時は'ctypes.char.ptr'として、
・実行時は例えば、
 「var str = 'hohohoge\nNew Line\n';」と2行分を用意し、
 そのまま、「str」と書けば出来る。

だが、
読み込む場合は同じkernel32.dllにある
「ReadFile」関数の第2引数で指定するのは C の文字配列。
例えば
  var Buf = ctypes.char.array(257)();

これを JavaScript の文字列に変換する方法は?

ドキュメントを良く読むと、
Working with data ページの
Working with strings

に載っていた:

  var str = Buf.readString();

でした。


結果、完成したコード(書き出し):
/******** file_Wt.js ********/
var fname = 'xxx.txt';
var libK = ctypes.open( 'kernel32' );
var CreateFile = libK.declare( 'CreateFileA', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );
var fp = CreateFile( fname, 0x40000000, 0, 0, 2, 0x80, 0 );
print( fp ); // 念の為の確認

var str = 'hohohoge\nNew Line\n'; // 書き出す文字列
var SZ = ctypes.int32_t(1);
var fwrite = libK.declare( 'WriteFile', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.char.ptr, ctypes.int32_t,
ctypes.int32_t.ptr, ctypes.int32_t );
var ret =fwrite( fp, str, str.length, SZ.address(), 0 );
print( ret ); // 念の為の確認
print( SZ.value ); // 実際に書き出されたバイト数
var fclose = libK.declare( 'CloseHandle', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t );
var ret = fclose( fp );
print( ret ); // 念の為の確認
libK.close();
となった。

読み込み場合のコード:
/******** file_Rd.js ********/
var fname = 'xxx.txt';
var libK = ctypes.open( 'kernel32' );
var CreateFile = libK.declare( 'CreateFileA', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );
var fp = CreateFile( fname, 0x80000000, 0, 0, 3, 0, 0 );
print( fp ); // 念の為の確認

var Buf = ctypes.char.array(257)();
var SZ = ctypes.int32_t(1);
var fread = libK.declare( 'ReadFile', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.char.ptr, ctypes.int32_t,
ctypes.int32_t.ptr, ctypes.int32_t );
var ret =fread( fp, Buf, 256, SZ.address(), 0 );

print( ret ); // 念の為の確認
print( SZ.value ); // 実際に読み込まれたバイト数
str = Buf.readString();
print( str );

var fclose = libK.declare( 'CloseHandle', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t );
var ret =fclose( fp );
print( ret ); // 念の為の確認
libK.close();
となった。


本日はここまで。


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


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


170211

SpiderMonkey/js-ctypes 学習

2017-03-11 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-10)の記事「SpiderMonkey 学習:js-ctypes 入門」に続いて、
SpiderMonkeyの“js-ctypes”学習。


3年前(2014-05-19)の記事「Relo2 + MinGW で“.dll”作成」で書いた、
MinGW で作った自作DLL“test_dll.dll”

このDLLファイルにある“Add”関数を呼び出すコードは?
/***** use_test_dll.js *****/
// ----- 宣言
var lib = ctypes.open( 'test_dll' ); // .dll は無くても可
var ADD = lib.declare( 'Add', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t );
// ----- 利用
var ret = ADD( 5, 3 );
print( ret ); // 8 と出た。

lib.close(); // -- 後処理

var str = readline(); // -- [Enter]キー入力待ち
これで行けた。

文字列定義のコーテーションマークは、どっちでもOKですネ。


次に、配列についての学習。
/***** test_Array.js *****/
var VecType = ctypes.ArrayType(ctypes.int32_t); // 配列型を定義

var T = new VecType(5); // それを利用して、5要素の配列を作る

for( var i=0;i<5;i++ ){ T[i]=10*i+i+1; } // 適当に値を設定

print( T[1] ) // 中身を確認
var str = readline();
配列の添字はゼロオリジンですネ。
序でに、名前文字列は、大文字・小文字の区別がある。


最後に、
前回の最後に書いた、

  少しはまともな?コード:
  ファイルのサイズ取得

に関して、更に学習した結果:

1.「parseInt」関数を使わなくても良かった。
2.「getfsz」関数の第2引数で値を受け取る方法が分かった。

結果のコード:
/***** ファイルのサイズ取得(改訂版) *****/
var libK = ctypes.open( 'kernel32' );
var CreateFile = libK.declare( 'CreateFileA', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );
var fp = CreateFile( 'zyx.txt', 0x80000000, 0, 0, 3, 0x80, 0 ); // 出力mode Open
print( fp ); // 確認。     16進数を定義できる。

/***** 第2引数の指定の仕方 *****/
// 値を受け取る引数の例:( 構造体方式 )
var V = new ctypes.StructType( 'tagV', [ { 'atai': ctypes.int32_t } ] );
var v = V();
var getfsz = libK.declare( 'GetFileSize', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, V.ptr );
var ss = getfsz( fp, v.address() );
print( ss ); // ===== 下位 32bit 分
print( v.atai ); // ===== 上位 32bit 分

// 値を受け取る引数の例:( Documentに載っている方式 )
var v = ctypes.int32_t(1);
var getfsz = libK.declare( 'GetFileSize', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t.ptr );
var ss = getfsz( fp, v.address() );
print( ss ); // ===== 下位 32bit 分
print( v.value ); // ===== 上位 32bit 分

// 値を受け取る引数の例:( 配列を使う方式 )
var VecType = ctypes.ArrayType(ctypes.int32_t);
var v = new VecType(1);
var getfsz = libK.declare( 'GetFileSize', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.voidptr_t );
var ss = getfsz( fp, v.address() );
print( ss ); // ===== 下位 32bit 分
print( v[0] ); // ===== 上位 32bit 分

libK.close();
var str = readline();
以上2件(2番目は3つの方式)


本日はここまで。


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


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


170210

SpiderMonkey 学習:js-ctypes 入門

2017-03-10 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-08)の記事「JavaScript:SpiderMonkey で行く」で、
SpiderMonkey 1.8.5 が入手できた。

SpiderMonkey 1.8.5」には、
  ・・・・・
  ・・・・・
  New JavaScript language features
  ・・・・・
  SpiderMonkey 1.8.5 also ships with js-ctypes,
   a foreign-function interface for privileged JavaScript.
  ・・・・・
  ・・・・・
とある。
即ち、Google 翻訳 で、
  SpiderMonkey 1.8.5には、特権付きJavaScript用の
  外部関数インターフェイスであるjs-ctypesも付属しています。

これは、
3年前(2014-05-12)の記事「Python 学習:インタプリタの拡張?」で書いている、
Python の“ctypes”モジュール
や、
昨年(2016-01-12)の記事「Lua 学習:FFI Library」で書いている、
LuaJIT の“FFI”ライブラリ
に相当するもの?


早速、
Standard OS Libraries」ページにある、
最初のサンプルコード:
  This example was created on Windows XP SP2.
  It is a full working example; just copy & paste it to try it out.
この27行をコピー&ペーストして起動してみた。


エラー発生

1行目の:
  Components.utils.import("resource://gre/modules/ctypes.jsm");
24、25行目:
  Components.utils.reportError(ret);
  Components.utils.reportError(point);


どうする?

1行目はコメントアウト(=削除)

24、25行目は、
  print( ret )
  print( point )
に変更した。

これで、正常に動作した。

本家から入手したものじゃないので、こうなるのか???

でも、<紙>にとっては、こっちの方が使い勝手が良い。


---------------

ランダムに動作確認

1.コマンド起動時の引数は?
   arguments 配列で受ける

2.インポートは?
   load( 'hoge.js' ); とかで読み込まれる

2.スリープ関数は?
   sleep(5) とか、秒単位で指定する

3.現在時刻は?
   dateNow() 13桁+小数点以下3桁

4.キーボード入力待ちは?
   var s = readline(); とかで

5.プログラム終了は?
   quit();

※ thisFilename() はエラーとなった。


最後に、
少しはまともな?コード:
// ---------- ファイルのサイズ取得 -----
var c_Rd = parseInt( "80000000", 16 );
var libK = ctypes.open( "KERNEL32.dll" );
var CreateFile = libK.declare( 'CreateFileA', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );

var fp = CreateFile( 'zzz.txt', c_Rd, 0, 0, 3, 128, 0 );
print( fp ); // 確認の為

var getfsz = libK.declare( 'GetFileSize', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t );
var ss = getfsz( fp, 0 ); // 第2引数は学習不足
print( ss ); // 正しく得られた(サイズが4GB未満のファイル)

libK.close();
var str = readline();
こんな感じで行ける?


本日はここまで。


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


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


170209

JavaScript:SpiderMonkey で行く

2017-03-08 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-06)の記事「WSH / JScript - Win32API」では、

  ・・・・・
  ・・・・・
  どうしようかな?

  このまま突っ走るか?
  或いは他をあたるか?
  ・・・・・
  ・・・・・

で終わっていた。


やはり、SpiderMonkey で行くか?

と云うことで、・・・・・

4年前(2013-12-15)の記事「SpiderMonkey:JavaScriptインタプリタ」で、
  ・・・・・
  ・・・・・
  改めて「JavaScript」について調べてみた。
  ・・・・・
  ・・・・・
  で、「js.exe」「cygwin1.dll」の2つを同一ディレクトリに格納。
  どっちも、1.78MB だった。
  早速、そのまま、「js.exe」をダブルクリック。
  DOS窓がでて、
  “js> ”と表示された。
  マウスは働かないが???
  上下矢印キーは働く。
  「Example Usage:」にある最初の2行分を打ち込んでみた。
  
  js> function f(x){return x+5}
  js> f(7)
  ( ; を付けずに、Enter キー押下 )
  12
  と表示された。
  少し、弄ってみようかナ?????
  ・・・・・
  ・・・・・
と書いた格納場所を探したが、見つからない。
(マシンが代わっているから)

ダウンロードしたモノを探し出し、
2つを持ってきた。
当時の通り動いた。(当たり前か)

だが、これは Ver 1.6 と古い(?)

最新のモノを探してみた。

本家サイト:SpiderMonkey < MDN - Mozilla Developer Network
に依ると、
最新版は“SpiderMonkey 38”のようですネ。

しかし、ビルド済みの Winodws 版を見つけることが出来ない?

少し古いものでも無いのか?


さんざん探した挙げ句
かなり(?)古いものだが、
SpiderMonkey 1.8.5 for Windows
を見つけた。

早速ダウンロードさせて頂いた。
「spidermonkey-1.8.5.zip」 2010/11/24 858KB

書庫の中身は「js.exe」「nspr4.dll」「js-help.txt」の3つダケ。

これら3つを、
例によって D:/TOOL ディレクトリに、
SpiderMonkey ディレクトリを作って格納した。
旧版の「js.exe」は 1.78MB だったが、今度は 1.72MB だ。

尚、旧版は「cygwin1.dll」だったが、今度は「nspr4.dll」ですネ。


先日(2017-03-05)の記事「WSH / JScript 学習初め」で書いたコードを
それぞれで実行してみた。
3,235mS だったものが、727mS と大幅にスピードアップした。
つまり、Ver 1.6 に比べて、約4.5倍速?

また、WSH の JScript に比べて2.4倍速?


それで、もろもろ導入手順を実行。
1.上記の通り、システムを格納:D:/TOO/SpiderMonkey/ に。
2.レジストリへ登録:参照記事(2016-04-02):
   ファイルD&DでAP起動(レジストリ版)
   注)これで、WSH は使えなくなる。
3.パス( Path ) に登録:D:\TOO\SpiderMonkey


序でに、
今後のテストで作成するコード(プログラム)の格納場所として、
  E:/_SpiderMonkey/ ディレクトリを作成した。


本日はここまで。


SpiderMonkey ( JavaScript ) 学習の始まり?


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


170209

WSH / JScript - Win32API

2017-03-06 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-05)の記事「WSH / JScript 学習初め」で、
度肝を抜かれたが、・・・・・

めげずに、
JScript win32API
と検索して、

“CX's Hello, World!”サイトの記事:
Hello, Win32 API(JScript) World!
を見つけた。
  Win32 API(JScript)
   Win32 API は、Windows の機能にアクセスする為の
  API(Application Programming Interface)である。
   JScript には Win32 API を直接呼び出す機能は存在しないが、
  他のコンポーネントを経由することで、呼び出すことが可能である。
   Win32 API を呼び出すことが可能なコンポーネントとしては
  「DynamicWrapper」「SFC mini」「Excel」等がある。
  ・・・・・
  ・・・・・
と云うことで、
3通りのコードが載っている。

順番に試してみた。

 ・ DynamicWrapper を経由した Win32 API 呼出し例

 ・ SFC mini を経由した Win32 API 呼出し例

 ・ Excel を経由した Win32 API 呼出し例


“DynamicWrapper”も、“SFC mini”も、見つからないエラー

Excel 経由は動いた。


あれこれ、調べてみたら、

原因は単純だった。
“DynamicWrapper”“SFC mini”いずれも、
追加インストールが必要だった。



“電子ブロック工房”サイトの、
JavascriptでWin32APIが利用しやすくなる『win32api.js』
この記事は、2008年10月9日 付の記事で、
  ・・・・・
  ・・・・・
  Javascript(JScript)からSFC mini経由でWin32APIを簡単に
  利用できるようにするwin32api.jsを作ったので公開します。
  ・・・・・
  ・・・・・

どうしようかな?

このまま突っ走るか?
或いは他をあたるか?


本日はここまで。


JavaScript ( WSH / JScript ) 学習は続く?


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


170208

WSH / JScript 学習初め

2017-03-05 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-04)の記事「JavaScript はどうか?」で、
  ・・・・・
  ・・・・・
  今度こそは、
  WSH(Windows Script Host)でJScriptの学習を本格化(?)
  でしょうか?

  Windows 7 マシンなので、
  何処かで“コマンド窓”を出せば“cscript hoge.js”で行ける。
  ・・・・・
  ・・・・・
と書いた。


WSH Jscript」と検索して、

WSH JScriptを使いこなそう ~目次~」を見つけた。


ここの、
 2.結果の出力方法
  ・テキストファイルへの書き込み

にあるコードを頂いて実行してみた。

コードは以下:
// ------------- Wt_File.js
// 関数を追加:
function print( str ){
WScript.Echo( str );
}

// ファイル関連の操作を提供するオブジェクトを取得
var fs = new ActiveXObject( "Scripting.FileSystemObject" );

// ファイルを開く
var file = fs.OpenTextFile( "result.txt", 2, true );

file.WriteLine( "正常終了" );
file.WriteLine( "処理件数は100件" );

// ファイルを閉じる
file.Close();

// オブジェクトを解放
fs = null;

print( "終了" );
ですネ。
これを、DOS窓で、
  cscript //nologo Wt_File.js
で実行。
カレントに「result.txt」の名前のファイルが作成され、
内容もOK。


上記検索で、更に
“zakuroishikuro - Qiita”の、
Node.jsと比べるとWSH(JScript)は170倍ぐらい遅い?(適当)
もあった。

ギョッとしたが、
試してみた。

コードは:
// ---------------- bench_wsh.js
function print(str){
WScript.Echo(str);
}
// -----------------------------
var a = 0, MAX = 10000000;
var start = new Date();

for (var i = 0; i < MAX; i++) {
a += (i + 1 * 10 / 5) ;
}

var end = new Date();
//出力
start_time = start.getTime();
end_time = end.getTime()

print(end_time - start_time + '\nend: ' + end_time + '\nstart: ' + start_time);
です。

実行結果は、
やはり、1,750 (mS) ほどだった。

聞きしにまさる遅さダ。

どうしようか???


本日はここまで。


JavaScript ( WSH / JScript ) 学習は続く?


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


170207

JavaScript はどうか?

2017-03-04 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
JavaScriptどうか
とは云っても、プログラミング言語は道具=手段ですネ。

本来は、
目的=何をやりたいかがあって、その手段として何を選ぶか?
と云うことですが、
<紙>はプロじゃ無くアマ=趣味の世界なので、
単純に何が出来るかが問題。

何はともあれ、温故知新と云うことで、
過去のブログ記事を確認してみた。

JavaScript 検索結果・・・75件ほどあった。

中でも、
6年前(2011-03-10)の記事「改めて、Jmol の勉強:Java と JavaScript」で、
  ・・・・・
  ・・・・・
  HTML の勉強(?)の延長線上で、
  「JavaScript」も一緒に勉強しよう。
  化学部活動では、いろんな言語を勉強しないとやっていけない(?)
  ・・・・・
  ・・・・・
と書き、
翌日の記事「JavaScript 入門 の入門」で、
  「改めて、Jmol の勉強:Java と JavaScript」から、
  「JavaScript」に(?)入門します。
  ・・・・・
  ・・・・・
だったが、
三日坊主だったような。

それから2年後(2013-12-15)の記事「SpiderMonkey:JavaScriptインタプリタ」で、
  ・・・・・
  ・・・・・
  改めて「JavaScript」について調べてみた。
  ・・・・・
  ・・・・・
  で、「js.exe」「cygwin1.dll」の2つを同一ディレクトリに格納。
  どっちも、1.78MB だった。
  早速、そのまま、「js.exe」をダブルクリック。
  DOS窓がでて、
  “js> ”と表示された。
  マウスは働かないが???
  上下矢印キーは働く。
  「Example Usage:」にある最初の2行分を打ち込んでみた。
  
  js> function f(x){return x+5}
  js> f(7)
  ( ; を付けずに、Enter キー押下 )
  12
  と表示された。
  少し、弄ってみようかナ?????
  ・・・・・
  ・・・・・
と云った状況です。

その後、
JavaScriptでファイル入出力
JavaScript:プログラム起動
等を書いていた。

昨年になって、
10月(2016-10-07)の記事:ImageJ で、JavaScript
同(2016-10-09)の記事:ImageJ + JavaScript 試し
同(2016-10-10)の記事:ImageJ + JavaScript では問題大
を書いていた。

さらに、
11月(2016-11-04)の記事:Emscripten の性能(一例)
でも“JavaScript”が出てくる。


以上の中では、
4年前(2013-12-20)の記事「JavaScript:プログラム起動
  ・・・・・
  ・・・・・
  結論:
  頑張って、MDNから「nsIProcess インターフェース」を学習し、活用する。
  あるいは、
  何も考えないで「WSH」を使う。
  もしくは、
  Firefoxに「JSActions」を導入して、「JavaScript」を学習する。
  と云うことでしょうか?????
  ・・・・・
  ・・・・・
に辿り着く。

今度こそは、
WSH(Windows Script Host)でJScriptの学習を本格化(?)
でしょうか?

Windows 7 マシンなので、
何処かで“コマンド窓”を出せば“cscript hoge.js”で行ける。


本日はここまで。


JavaScript 学習は続く。


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


170204-06
おきてがみ/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
ブックマーク