call_Lua 似非モジュール

2017-04-14 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
先日(2017-04-10)の記事「GSL Shell と Lua で、プロセス間通信」では、
PIPE 2本を使って、EVENT は使わない方式の
プロセス間通信方式を確立した???

でも、やはり Lua を C言語等から直接利用したい。

つまり、
Lua から Python を呼び出す「LuaPy モジュール」の様なモノ


それには、どうすれば良いか???

検索して見たら、
Qiita の「C と lua の連携方法メモ
が見つかった。
  ・・・・・
  ・・・・・
  C から lua の関数呼び出し
  下記の lua 関数を C から呼び出す.
----- func.lua
function func(arg1, arg2)
print(arg1)
print(arg2)
return arg1+1, arg2+2
end
上記を呼び出す C のコード
//=== call.cpp
lua_State* l = luaL_newstate();
luaL_openlibs(l);
luaL_loadfile(l, "func.lua");
lua_pcall(l, 0, 0, 0); // script を実行しておかないと関数を呼び出せない
lua_getglobal(l, "func"); // 呼び出す関数
lua_pushnumber(l, 4); // 第一引数
lua_pushnumber(l, 5); // 第ニ引数
if (lua_pcall(l, 2, 2, 0)) { // 引数 2 個, 戻り値 2 個
fprintf(stderr, "cannot exec add. %s\n", lua_tostring(l, -1));
return;
}
if (lua_isnumber(l, -1)) {
int ret = lua_tointeger(l, -1); // 戻り値その 1
printf("ret=%d\n", ret);
}
lua_pop(l, 1); // 戻り値を pop
if (lua_isnumber(l, -1)) {
int ret = lua_tointeger(l, -1); // 戻り値その 2
printf("ret=%d\n", ret);
}
lua_pop(l, 1); // 戻り値を pop
  ・・・・・
  ・・・・・

正に、この様なことをやりたい。


そこで、参考資料を集めた。


上記検索で見つけたサイト:第6章 C言語との連携

いつも参照している:Lua 5.2 リファレンスマニュアル

Lua5.1 教科書?:Programming in Lua (first edition)

他に検索で見つけた:Lua処理系コード読み(13) luaL_newstate


以上、合計5件を学習した。


ここで、
C言語でコーディングしてコンパイル
はしたくない。

GSL Shell なら、同等な事ができるはず?
それには、何かDLLが必要。


ふと思いついた、
GSL Shell インストール場所にあるlua51.dllでは?

中を見ると、luaL_newstateが有りそう?

そうすると、
Lua インストール場所にあるlua53.dllで行けそう。

と云うことで、上記call.cpp相当を作ってみた。
初めてなので、確認用にかなり print 文を入れている:
----- test_call_lua.gsl -----
lua = ffi.load( 'lua53' )
ffi.cdef[[ typedef void L_S;
typedef double lua_Number; typedef int32_t lua_Integer;
L_S* luaL_newstate( void );
int lua_gettop( L_S* L );
int lua_type( L_S* L, int index );
void luaL_openlibs( L_S* L );
// int luaL_loadfile( L_S* L, const char* filename); // これは無し***
int luaL_loadfilex( L_S* L, const char* filename, const char* mode);
// int lua_pcall( L_S* L, int nargs, int nresults, int msgh ); // これは無し***
int lua_pcallk( L_S* L, int nargs, int nresults, int errfunc, int ctx, void* k );
////////// 正しくは、・・・・・・・・・・・・・・・・・・ int ctx, lua_CFunc k );
void lua_getglobal( L_S* L, const char* name );
void lua_pushnumber( L_S* L, lua_Number n );
int lua_isnumber( L_S* L, int index );
// lua_Integer lua_tointeger( L_S* L, int index ); // これは無し***
lua_Integer lua_tointegerx( L_S* L, int index, void* isnum );
//// void lua_pop( L_S* L, int n ); // これはマクロ***
void lua_settop( L_S* L, int m ); // m == -(n) - 1
void lua_close( L_S* L );
]]
charA = |s| ffi.cast( 'char*', s )
voidA = |s| ffi.cast( 'void*', s ); NULL=voidA(0)
function printf( f, s, ... )
f = f or io.stdout
f:write(s:format(...))
end
----- 以下 print は、デバッグ用
L = lua.luaL_newstate(); print( L ); --
lua.luaL_openlibs(L)

z = lua.luaL_loadfilex(L, 'func.lua', charA(0)); -- 呼び出すProg
print(z) -- 0
S = lua.lua_gettop(L); T = lua.lua_type(L, 1); print( S, T ) -- 1 , 6

z = lua.lua_pcallk(L, 0, 0, 0, 0, NULL); -- script を一度実行しておく
print(z) -- 0

lua.lua_getglobal(L, 'fun' ); -- 呼び出す関数
S = lua.lua_gettop(L); T = lua.lua_type(L, S); print( S, T ) -- 1, 6

lua.lua_pushnumber(L, 4); -- 第一引数
S = lua.lua_gettop(L); T = lua.lua_type(L, S); print( S, T ) -- 2, 3

lua.lua_pushnumber(L, 5); -- 第ニ引数
S = lua.lua_gettop(L); T = lua.lua_type(L, S); print( S, T ) -- 3, 3

if (lua.lua_pcallk(L, 2, 2, 0, 0, NULL) ~= 0) then -- 引数 2 個, 戻り値 2 個
printf( nil, 'cannot exec add. %s\n', tostring(L)); ----- 中で、4.0 5.0 を print
os.exit(0)
end
if( lua.lua_isnumber(L, -1)) then
ret = lua.lua_tointegerx(L, -1, NULL); -- 戻り値その 1
printf( nil, "ret=%d\n", ret); -- 7 == 5 + 2
end
S = lua.lua_gettop(L); lua.lua_settop(L, S-1); -- lua_pop(L,1); 戻り値を pop
if (lua.lua_isnumber(L, -1)) then
ret = lua.lua_tointegerx(L, -1, NULL); -- 戻り値その 2
printf( nil, "ret=%d\n", ret); -- 5 == 4 + 1
end
S = lua.lua_gettop(L); lua.lua_settop(L, S-1); -- lua.pop(L,1); 戻り値を pop

lua.lua_close(L)
これで?

一応処理結果は正しそうだが、
最終的に「libgcc_s_dw2-1.dll」が無い でアボート???


正直に C言語でコーディングしてコンパイルするのでは無いので、・・・・・

マクロであったり、関数名が異なっていたり、

かなり苦労した。

でも何とか行けそうダ。


本日はここまで。


call_Lua 似非モジュールは作れそう。


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


170312

GSL Shell 学習:見た目の前方参照?(新方式)

2017-04-12 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
見た目の前方参照を実現するには、
最初に思いつくのは、goto文があれば、それを利用する方式。

確かに、
昨年2月(2016-02-19)の記事「GSL Shell 学習:gotoで見た目の前方参照」で書いている。
だが、当該記事でも書いた通り“local”宣言がジャマをする。


Python に関しては、“Python 見た目の前方参照”の通り。

つまり、
goto文が無い言語でも、for と if を使えば出来る。


今回、変なことを考えついた。

それは、
1) 自分自身を読み込んで、
2) 後段部分を抜き出し、
3) その文字列を“eval 関数”相当で実行する。


1) については、起動時の引数テーブルで入手できる:
昨年3月(2016-03-06)の記事「GSL Shell 学習:グローバル・テーブル arg
の如く、arg[0] で。

3) については、assert( load( ~ ) )() で出来る:
昨年1月(2016-01-27)の記事「Lua 学習:eval 関数」参照


2) については、
対象範囲を、「--inis」だけの行と「--inie」だけの行の間の行と考えた。
それで、

最初は:
F=io.open(arg[0]); w=F:read('*a'); F:close(); fnd=string.find
_,k=fnd(w,'--inis',1,true); j=fnd(w,'--inie',k,true)
assert(load( string.sub(w,k+2,j-2) ))()
としてみたが、ダメです。
つまり、2行目の判定文にある文字列がジャマをする。

それを解消するため:
F=io.open(arg[0]); w=F:read('*a'); F:close(); fnd=string.find; k=1
for i=1,2 do _,k=fnd(w,'--inis',k,true) end j=fnd(w,'--inie',k,true)
assert(load( string.sub(w,k+2,j-2) ))()
とした。
これで、一応出来た。

しかし、イマイチ気に入らない。

そこで、2行目の判定文がジャマしない様に変えた:
F=io.open(arg[0]); w=F:read('*a'); F:close(); fnd=string.find
m='--ini'; _,k=fnd(w,m..'s',1,true); j=fnd(w,m..'e',k,true)
assert(load( string.sub(w,k+2,j-1) ))()
これで完成。

なお、“fnd=string.find”の第4パラメータは、
“-”が特別な文字とは見なさない為に必要ですネ。


この方式で作ったテストプログラム:
昨年2月(2016-02-05)の記事「GSL Shell 学習:LFS 自作始め
のコード見直しを兼ねて、自ファイルのサイズ取得の例
---- test_init_After.gsl -----
F=io.open(arg[0]); w=F:read('*a'); F:close(); fnd=string.find
m='--ini'; _,k=fnd(w,m..'s',1,true); j=fnd(w,m..'e',k,true)
assert(load( string.sub(w,k+2,j-1) ))()
----------- 以下部分が本体 --------------------
print( string.sub(w,k+2,j-1) ) -- 改行コードは1バイト分

print( f(5) ) -- 10

stat = ffi.new( 'uint32_t[64]' )
_ = ffi.C._stat( arg[0], stat )
print( stat[5] ) -- このファイルのサイズ

----------- 以下初期化部分 --------------------
os.exit(0) ----- これは必須
--inis
function f(x)
return x+5
end
ffi.cdef[[
int _stat ( const char* fname, void* buf );
]]
--inie
------- 以下は 自由領域:主にコメント用 -------

-- コメント

こんな感じ?


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170310,11

GSL Shell と Lua で、プロセス間通信

2017-04-10 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
これまでで、“Lua PIPE”の如く、
数件記事にしている。

今回、
GSL Shell(LuaJIT) と、基本Luaとの間で通信出来るか?
について学習した。

基本的には、
1月(2017-01-25)の記事「クライアント/サーバ:プロセス間通信・改
にある:
  ・・・・・
  ・・・・・
  サーバー側 は前回の“test_Server.gsl”

  クライアント側 は今回の“test_Client_lua.gsl”
  ・・・・・
  ・・・・・

の様なもの。

但し、
一方向での送受信では無く、お互いが送受信するもの。


いろいろ試してみたが、・・・・・


結論としては、

PIPE 1本での双方向はムリ。
なので、
PIPE 2本を使って、それぞれ一方向とした。
これで、
EVENT はイラナイ?


GSL Shell 側で2本の PIPE を“CreateNamedPipeA”しておく。

Lua 側は、2本とも、単なるファイルと思って処理する。
但し、読み込みは“バイト数指定”方式のみ可。


それで、先に起動するもの ( GSL Shell で起動 )
----- test_Server_2Ps.gsl -----
charA = |s| ffi.cast( 'char*', s )
ffi.cdef[[ typedef unsigned int DWORD;
int CreateNamedPipeA( char*, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, int );
int ConnectNamedPipe( int, int );

int ReadFile( int, char*, DWORD, void*, int );
int WriteFile( int, char*, DWORD, void*, int );

int FlushFileBuffers( int hFile );
int DisconnectNamedPipe( int hNamedPipe );
int CloseHandle( int hObject );
]]
----- パイプを作成
P2 = ffi.C.CreateNamedPipeA( charA("\\\\.\\pipe\\pipe2"), 3, 0, 1, 0, 0, 100, 0 )
P1 = ffi.C.CreateNamedPipeA( charA("\\\\.\\pipe\\pipe1"), 3, 0, 1, 0, 0, 100, 0 )
----- Client オープン待ち
rcd = ffi.C.ConnectNamedPipe( P1, 0 )

Buf=ffi.new('char[256]')
nRd=ffi.new('uint32_t[1]'); nWt=ffi.new('uint32_t[1]')

while true do
rcd=ffi.C.ReadFile( P1, Buf, 256, nRd, 0)
str = ffi.string(Buf,nRd[0])
print( str )
sss = string.format('%4d%sHOGE', nRd[0]+4, str )
rcd=ffi.C.WriteFile( P2, charA(sss), nRd[0]+8, nWt, 0 )
if( str == '_e' ) then break end
end
----- 後処理
ffi.C.FlushFileBuffers( P1 ); ffi.C.DisconnectNamedPipe( P1 ); ffi.C.CloseHandle( P1 )
ffi.C.FlushFileBuffers( P2 ); ffi.C.DisconnectNamedPipe( P2 ); ffi.C.CloseHandle( P2 )
の様なもの。
そして、後から起動するもの( 基本 Lua で起動 )
----- test_Client_2Ps.lua

P2 = io.open( '\\\\.\\pipe\\pipe2', 'w+' )
print( P2 ) --------- デバッグ用
P1 = io.open( '\\\\.\\pipe\\pipe1', 'w+' )
print( P1 ) --------- デバッグ用
-------------------------
Buf='hogehoge'
P1:write( Buf ); P1:flush()

n = P2:read( 4 ) + 0
s = P2:read( n )
print( s )
-------------------------
P1:write( 'kamizzz' ); P1:flush()

n = P2:read( 4 ) + 0
s = P2:read( n )
print( s )
-------------------------
P1:write( '_e' ); P1:flush()

P1:close(); P2:close()
となった。

ここで、
Lua 側は、読み込みバイト数を指定しての read で無いとダメ。
なので、
書き出す GSL Shell 側では、先頭4バイトでデータ長を指定している。

また、
Lua 側での書き込み後は、flush が無いとダメ。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170309,10

TIFF画像ファイル:ゴミ付着可?

2017-04-09 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
1月(2017-01-16)の記事「TIFF画像出力サブプログラム 自作」を書いた後、
書き出したTIFF画像ファイルを弄っていた。

そこで、
ファイルの最後にゴミデータを書き込んでしまった。


ところが、
このファイルは何の問題もなく(?)読み込める。

しかも、
表示等に不都合は起こらない。

つまり、
PicrBear、XnView、ImageJ で読み込め、表示できた。
ここで、
そのまま上書きで書き戻すと正常な状態に戻った。

OpenCV では、読み込み結果は問題の無いものであった。


これって、
意識的に何かの目的で使えないかナ???


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


161231

Lua 言語仕様:備忘録(忘れやすい事)4言語対比表

2017-04-08 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
最近は、GSL Shell(Lua) 以外に、SpiderMonkey ( JavaScript ) を学習していた。
更に、以前からの Python や、Perl も使うことがある。

微妙なところで、言語仕様がゴチャゴチャになるので、
備忘録として、良く忘れる事について、対比表を作ってみた。

Lua言語(忘れやすい事)  Python、    Perl、   SpiderMonkey 対比

1.配列
 定義: a={1, 2, 3}  a=[1, 2, 3]  @a=(1, 2, 3)  a=[1, 2, 3]

 添字:  a[1]~    a[0]~     a[0]~     a[0]~

 サイズ:  #a     len(a)     $#a+1     a.length


2.不等比較:~=     !=       !=       !=


3.複数代入: x,y=a,b  x,y=a,b  ($x,$y)=($a,$b)  [x,y]=[a,b]

        --    x=y=c    $x=$y=$c     x=y=c


4.文字列
 定義:  a = 'xyz'   a = 'xyz'   a = "xyz"     a = 'xyz'

 連結:   ..      +        .        +

 サイズ:  #a     len(a)    length(a)     a.length


5.文字列←→数値変換

 文字列→数値:'5'+0  int(float('5.'))  "5"+0    '5'-0

 数値→文字列: 5..''    str(5)     5.""     5+''

  演算子によって         演算子によって   演算子によって
  両方の型を揃える        両方の型を揃える  両方の型を揃える
こんな処かな?


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170304,22

GSL Shell 学習:サブプログラムとしたいもの

2017-04-07 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
これまで、GSL Shell ( Lua ) についてあれこれ学習してきた。

これまでで学習した、有用な関数定義やコードスニペット等々をまとめて
サブプログラムを作りたい。


そこで、
思いつくまま1本の Lua プログラムにしてみた。

このまま、require しても使えるように、
或いは、中身を見てみる。
と云うことで、
仮に k_SUBs.lua と云う名前で纏めた。
----- k_SUBs.lua -----
charA = |x| ffi.cast( 'char*', x )
voidA = |x| ffi.cast( 'void*', x )
DblA = |x| ffi.cast( 'double*', x )
Int = |x| ffi.cast( 'int32_t', x )

---------------------------
ffi.cdef[[
typedef unsigned char Byte; typedef Byte Uint8;
typedef unsigned short Word; typedef Word WORD;
typedef unsigned int DWord; typedef DWord DWORD;
]]

--「GSL Shell 学習:split 関数(再)」で書いた関数
function split( str, sep )
if sep == nil then sep = '%s' end
local t={} ; i=1
for str in string.gmatch( str, "([^"..sep.."]+)") do
t[i] = str i=i+1
end
return t
end

--「GSL Shell 学習:フルパス名の分解」で書いた関数
function split_path( p )
return string.match( p, "(.-)([^\\]-([^%.]+))$" )
end

--「Lua 学習:fprintf 関数」で書いた関数の改訂版
function printf( f, s, ... ) --- 定義済み:stdin / stdout / stderr
f = f or io.stdout -- これを入れると、nil でもOK
f:write(s:format(...))
end

-- テキストファイル全体を一括で読み込む:
-- IN = io.open( IN_F ); wstr = IN:read('*a'); IN:close()

-- 上記を行毎の配列に分解 & 行数
-- w = split( wstr, '\n' ); nw = #w

-- 尚、1行分を要素毎の配列に分解 & 要素数( TAB 区切りの例 )
-- v = split( w[n], '\t' ); mv = #v

-------------------------------------
--[[ 入力 Dir 内ファイル一覧(リスト)
local lfs = require'lfs'
IN_Flist={}; zz=0
for f in lfs.dir(IN_Dir) do
-- f:sub(1,1) ~= '.' は特に必要無し
if f:find('.ext') then zz=zz+1; IN_Flist[zz]=f end
end
]]

----------
--[[ 出力 Dir クリア/作成
local lfs = require'lfs'
if lfs.chdir(OT_Dir) then
for f in lfs.dir('.') do
if f:sub(1,1) ~= '.' then os.remove(f) end
end
lfs.chdir('..'); lfs.rmdir(OT_Dir)
end
lfs.mkdir(OT_Dir)
]]

-------------------------------------
--[[
 クイックソート“qsort”
ブログ「Lua で、クイックソート“qsort”」で書いたコード

 interp2d ( spline 補間 )
ブログ「GSL Shell:2次元補間(interp2d)」で書いたコード

 solve ( bisect )
ブログ「Solve:二分法」で書いたコード
]]
先ずは、こんなところ。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170303

GSL Shell 学習:Fitting サブ(改)

2017-04-05 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
1月(2017-01-09)の記事「GSL Shell 学習:Fitting サブ」では、
  ・・・・・
  ・・・・・
  'Fit_GSL'関数のみを定義している、
  'Fit_SUB' サブプログラムを作る。
  ・・・・・
  ・・・・・
と云うことで、
'Fit_GSL'関数を作った。

しかし、この関数を使う時、
求めたい係数は k[1]、k[2]、・・・
の様に記述しなければならない。

もっとひとに易しく(?)と云うことで、
任意の名前を付けられる様に改訂した。

サブルーチン名は SUB_GSL_Fitとした。
その仕様は、
2番目と3番目の間に新3番目リストを追加し、
新5番目(元4番目)の指定をリストに変更。

結果、
引数は6つ以上で、
第1、2は、観測点データベクトル X、Y
第3は、係数名リスト(文字列)(変数は x)
第4は、近似関数(文字列)
第5は、初期推定値リスト(文字列)
第6以降は、ヤコビアン(文字列)

出来上がったのは:
-------------- SUB_GSL_Fit.lua
fmt = string.format
function GSL_Fit( x_, y_, k_, f_, p_, ... )
X__, Y__ = x_, y_ ----- これは local ではダメ
local pj = {...}
local n, jj = #x_, #pj
local st = 'function fdf( k, f, J )\n'
.. fmt( ' for i=1,%d do\n', n )

st = st .. fmt( ' local %s = k[1]', k_ )
for j=2,jj do st = st..fmt( ', k[%d]', j ) end
st = st .. '\n local x, y = X__[i], Y__[i]\n'
st = st .. fmt( ' if f then f[i] = ( %s - y ) end\n', f_ )
st = st .. ' if J then\n'
for j=1,jj do st=st..fmt( ' J:set( i, %d, %s )\n', j, pj[j] ) end
st = st .. 'end; end; end\n'
st = st .. fmt( 's_ = num.nlinfit{ n=%d, p=%d }\n', n,jj )
st = st .. fmt( 's_:set( fdf, matrix.vec{%s} )\n', p_ )

assert( load( st ) )() ----- function fdf 定義

for i=1, 100 do
s_:iterate()
if s_:test( 0, 1e-8 ) then break end
end
return s_
end
でしょうか?


これを使うと、
前回記事での利用例のコードは、
X = matrix.vec{ ・・・・・ }
Y = matrix.vec{ ・・・・・ }
------- Y ~ exp( -b * log(X) + c ) で近似
-------------------------------------------------
exp=math.exp; log=math.log
require'SUB_GSL_Fit'
s = Fit_GSL( X, Y, 'b,c', 'exp(-b*log(x)+c)', '1,0', '-log(x)*exp(-b*log(x)+c)', 'exp(-b*log(x)+c)')
-------------------------------------------------
b, c = s.x[1], s.x[2] -- 求めた係数
の様なものになる。


本日はここまで。


GSL Shell ( Lua ) 学習は続く。


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


170204

OpenCV 学習:任意のタイプの画像表示+alpha

2017-04-03 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
1月(2017-01-18)の記事「OpenCV 学習:CvMat型の type 項目」で書いた、

  入力する画像ファイルのタイプ判別方法

を使って、・・・・・

1.グレースケール限定だが、任意のタイプの画像を対象に、

2.対象画像は、ドラッグ&ドロップで読み込み、

3.256階調で表示し、

4.マウスカーソル位置の画素値を表示する。

と云ったプログラムを作った。

ここで、表示する値は、画像ファイル内の真の値。
但し、表示先はコンソール。


対象とする画像の type 項目値は、
 ・ 0x42424000:8ビット整数
 ・ 0x42424002:16ビット整数
 ・ 0x42424004:32ビット整数
 ・ 0x42424005:32ビット浮動小数点数
 ・ 0x42424006:64ビット浮動小数点数
としているが、
OpenCV では、
本来 0x42424004 とすべきものも0x42424005となる???


なお、画素値の表示には、
afxLua / cio モジュールを使った。
(常に同じ位置に表示する為)


それで、
出来上がったのは、・・・・・
----- DnD_img_mouse_CV.gsl -----
require 'cio'
local cv2 = require'cv2'
local lfs = require'lfs'
function split_path( p ) return string.match( p, "(.-)([^\\]-([^%.]+))$" ) end
function CHK_IF( pt )
local t, n = 5, 0; while pt[n]==0 do n=n+1 end --- 必ず終わるハズ!!!
if math.abs(pt[n])<2^29 then t=4 end
return t
end
fmt = string.format
---------------------------------------
Dir, Fname, Fext = split_path( arg[1] ) -- D&D でファイル名取得
lfs.chdir( Dir ) -- これがないとダメ
-- =========================================
local onmouse = ffi.cast( 'CvMouseCallback', function(event,x,y,flags)
if event == 0 then -- cv2.EVENT_MOUSEMOVE:

cio.gotoxy(0,3)
print( fmt('Pos:(%d,%d)=%g ', x, y, IMG[y*xx+x] ) )

end
end )
-- =========================================
img = cv2.cvLoadImageM( Fname, -1 ) -- ファイル内のママ
yy, xx, typ = img.yy, img.xx, img.type%256
if typ == 0 then IMG=img.Byte
elseif typ==2 then IMG=img.Word
elseif typ==4 then IMG=img.Int ----- これ存在し得ない???
elseif typ==5 then IMG=img.Int
typ=CHK_IF(IMG)
if typ==5 then IMG=ffi.cast('float*',IMG) end
elseif typ==6 then IMG=img.Dbl
else IMG=img.Byte -- typ==16:BGR --今後に
end
Mx, Mn = -1e+100, 1e+100
for n=0,xx*yy-1 do
if IMG[n]>Mx then Mx=IMG[n] end
if IMG[n]end

dsp = cv2.cvCreateMat( yy, xx, 0 )
for n=0,xx*yy-1 do dsp.Byte[n]=(IMG[n]-Mn)/(Mx-Mn)*255+0.5 end

cv2.cvNamedWindow( charA('img'), 0 )
cv2.cvSetMouseCallback( charA('img'), onmouse )

FT={ '8I', '', '16I', '', '32I', '32F', '64F' }; FT[16+1]='BGR_B'
cio.gotoxy(0,0) --- 左上に位置づけ
print( 'ESC key <=== Exit' )
print( fmt('File Type: %s. Size: %dx%d', FT[typ+1], xx, yy) )
print( fmt('Value : Max=%g, Min=%g', Mx, Mn) )
while true do
cv2.cvShowImage( charA('img'), dsp )
k = bit.band( 0xFF, cv2.cvWaitKey(50) ) -- key bindings
if k == 27 then break end --「esc」to exit
end

cv2.cvDestroyAllWindows() -- 後処理
OK


本日はここまで。


GSL Shell ( Lua ) / OpenCV 学習は続く。


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


161223

GSL Shell に pre3d がある?

2017-04-02 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
GSL Shell について整理をしていたら、・・・・・

インストールフォルダ: ~/gsl-shell/gsl-shell/
pre3dなるフォルダを見つけた。

これって、3年前(2014-07-11)の記事:
Pre3d:JavaScript 3d rendering engine
で書いたもの???

そのフォルダには、
「pre3d.lua」「pre3d_shape_utils.lua」の2本がある。


「pre3d.lua」を開いてみると、
-- Pre3d, a JavaScript software 3d renderer.
-- (c) Dean McNamee , Dec 2008.
--
-- Code adapted for GSL shell (Lua) by Francesco Abbate
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
で始まっていた。

やはり、pre3d とは、3年前の記事のものですネ。
そして、pre3d.lua は、それを GSL shell (Lua) に移植したもの。

だが、
この「pre3d.lua」は何処で使っているのか? 分からない。


ところで、
何かしらの情報が得られないか?
「Lua Pre3d」と検索してみた。


Lua Scripting - Prepar3D
 In addition to the legacy Reverse Polish Notation (RPN) script,
  Prepar3D offers the capability to embed Lua scripts into xml gauges.
 Prepar3D currently uses Lua 5.1.
 For specific information on Lua 5.1 visit their documentation
  found here.
 In addition to embedding Lua scripts into XML gauges,
  scenarios can now use Script Actions and Script Triggers
  which can be scripted in Lua.

===Google翻訳
 Legacy Reverse Polish Notation(RPN)スクリプトに加えて、
  Prepar3DはLuaスクリプトをxmlゲージに埋め込む機能を提供しています。
 Prepar3Dは現在、Lua 5.1を使用しています。
 Lua 5.1に関する具体的な情報については、こちらのドキュメントを
  参照してください。
 LuaスクリプトをXMLゲージに埋め込むことに加えて、
  シナリオではスクリプトアクションとスクリプトトリガを使用できるように
  なりました。これはLuaでスクリプト化できます。
(翻訳精度はよろしいような)


ン? これって何か違うようなもの???


他も、この「Prepar3D」しか見つからない? 様ダ。


でも、試してみる?

しかし、
Prepar3Dについていくつか質問です。①このPrepar3D・・・
  Prepar3Dについていくつか質問です。
  ①このPrepar3Dと言うのはFSXの追加アドオン的なものなのでしょうか?
   それともまったく別のソフトなのでしょうか?
  ②Prepar3Dは日本語に対応していますか?
  ③今自分はFSXのSteam版を使っているのですがそれでも・・・
=>
  1)マイクロソフトのFSXをベースにロッキードマーチンが開発している
   別のソフトです。
  2)していません。英語版のみです。
   PCのOSも英語モードで起動させる必要があります。
  3)FSXを入れたままでもP3Dをインストールして動かすことは可能です。
   しかし、・・・


やはり、(<紙>にとっては、)ダメ/イラナイ。



本日はここまで。


GSL Shell ( LuaJIT ) 学習は続く。


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


170228

js-ctypes 学習:Webブラウザでは使えない?

2017-04-01 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-30の記事「SpiderMonkey 学習:再入門」迄で、
js-ctypes 学習がかなり進んだ。

これ、SpiderMonkeyじゃなくて、FirefoxとかSeaMonkeyとか、
願わくばKinzaといった、Webブラウザで使えないか???


あれこれ、サンプル・コードを見ると、
先月(2017-03-10)の記事「SpiderMonkey 学習:js-ctypes 入門
でも書いている、
Components.utils.import("resource://gre/modules/ctypes.jsm");
と云った記述がある。


改めて、
MDN ( MOZILLA DEVELOPER NETWORK ) の、
JavaScript code modules」ページの、
最初のGeneral topics
の、
  Using JavaScript code modules
を見ても、

サンプル・コードには、
Components.utils.import("resource://app/my_module.jsm");
と云った記述がある。


この様な記述を追加してみると、・・・・・

SpiderMonkey では、Components が無い! エラー

Firefox や SeaMonkey では、無反応?!?!?!


では、Componentsはどうなっているの???


いろいると漁ってみたが、

 何かしらのインストールが必要。
 それも、コンパイルが必要?


なので、Webブラウザで、js-ctypes を使うのは
<紙>にとってはムリ/出来ないことですネ。


本日はここまで。


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


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


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



おきてがみ

最新記事
カレンダー
03 | 2017/04 | 05
- - - - - - 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 - - - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

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

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


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

Google Analytics
ブックマーク