Win32 APIの定数:定義は?

2017-01-30 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-29)の記事「クライアント/サーバ:イベント学習」では、
  ・・・・・
  ・・・・・
  そこで、
  プログラムを2本作って、動作確認しようとしたが、
  “EVENT_ALL_ACCESS”の値が・・・・・分からない?
  ・・・・・
  ・・・・・
で終わっていた。


何処かに解説記事が無いのか?
「Windows API 定義」と検索してみたら、・・・
<紙>にとっては、非常に参考になるページを見つけた:
Windows API関数呼び出しの心得

このページは、
  Advanced HSP
  - Win32 API Programming for HSP3 -
の中にある。

それで、このページの中ほどに、
  Windows APIへの苦難の道
なる段落?があり、

その2番目?に、
  定数名はどう調べる?
   次に問題として挙げられるのが、
  定数名の値をどのようにして知るのかということです。
   Windows APIでは、いくつかの値が定数名という形で定義されています。
  例えば、以前にも出てきましたが、定数名「NULL」は0という値で
  定義されています。そのほか、最も簡単なところでは、定数名「FALSE」は0、
  「TRUE」は1という値を持った定数名として定義されています。
  HSPスクリプト中では、
  ・・・・・
  ・・・・・
なるくだりがある。

これを見ると、
  blueleafさんのページ『青い葉っぱ』
    http://hp.vector.co.jp/authors/VA034288/
とあったので、
行ってみた。

  WIN32API定数

があった。これは、
ページ内の const.lzh 書庫ファイルへのリンクですね。

早速ダウンロードさせて頂いた。


“EVENT_ALL_ACCESS”の値については、
18,473行目に
  #define EVENT_ALL_ACCESS  $001F0003
とあった。
C言語流では、0x001F0003 ですね。

と云うことで、この“定数定義ファイル”は必携です。


これを使って イベントテストプログラムを作ってみた。

先に起動する方
----- test_event_1.gsl
-- イベントオブジェクト作成
sh = ffi.C.CreateEventA( 0, 1, 0, charA('EVENT') )
-- イベントオブジェクトを取得
h = ffi.C.OpenEventA( 0x001F0003, 0, charA('EVENT') )

-- シグナル状態チェック
flg = ffi.C.WaitForSingleObject( h, 0 )
print( flg%256 ) ----- 0:シグナル状態、2:非~(初期状態)

_=io.read(1) -- 手動同期(他方の起動待ち)

-- シグナル状態にする。
ffi.C.SetEvent( h )
-- シグナル状態チェック
flg = ffi.C.WaitForSingleObject( h, 0 )
print( flg%256 )

_=io.read(1) -- 手動同期(他方の次段階待ち)

-- シグナル状態チェック
flg = ffi.C.WaitForSingleObject( h, 0 )
print( flg%256 )
と云うもの。

後から起動する方
----- test_event_2.gsl
-- イベントオブジェクトを取得
h = ffi.C.OpenEventA( 0x001F0003, 0, charA('EVENT') )

-- シグナル状態チェック
flg = ffi.C.WaitForSingleObject( h, 0 )
print( flg%256 ) ----- 0:シグナル状態、2:非~(初期状態)

_=io.read(1) -- 手動同期(他方の次段階待ち)

-- シグナル状態チェック
flg = ffi.C.WaitForSingleObject( h, 0 )
print( flg%256 )

_=io.read(1) -- 手動同期(他方の次段階待ち)

-- 非シグナル状態にする。
ffi.C.ResetEvent( h )
-- シグナル状態チェック
flg = ffi.C.WaitForSingleObject( h, 0 )
print( flg%256 )
と云うもの。

そして実行は、“test_event_1.gsl”、“test_event_2.gsl”の順に起動し、
それぞれの窓内で、交互に [Enter]キーを押して確かめる。


なお、“シグナル状態チェック”の、
flg = ffi.C.WaitForSingleObject( h, 0 )
では、flg は、0258 だった。


最後に、
上記に対するプロトタイプ宣言?と、charA()関数の定義は、・・・
charA = |s|  ffi.cast( 'char*', s )
ffi.cdef[[
int CreateEventA(
int lpEventAttributes, // セキュリティ記述子
int bManualReset, // リセットのタイプ
int bInitialState, // 初期状態
char* lpName // イベントオブジェクトの名前
);

int OpenEventA(
int dwDesiredAccess, // アクセス権
int bInheritHandle, // 継承オプション
char* lpName // イベントオブジェクトの名前
);

int SetEvent( int hEvent );
int ResetEvent( int hEvent );

int WaitForSingleObject(
int hHandle, // オブジェクトのハンドル
int dwMilliseconds // タイムアウト時間:ミリ秒(ms)単位
);
]]
でしょうか?


テスト(=学習) はOK。


本日はここまで。


“クライアント/サーバ”学習は続く。


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


170109
スポンサーサイト

クライアント/サーバ:イベント学習

2017-01-29 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
以前(2017-01-23)の記事「クライアント/サーバ:プロセス間通信」では、

  ・・・・・
  ・・・・・
  それには、
  イベントオブジェクト の学習が必要ですね。
  ・・・・・
  ・・・・・

で終わっていた。

その後、
双方向パイプ1本で送受信を行いたくて、
イベントに関する記事を検索した。


検索の結果、
学習教材としたのは;
“プログラミング入門サイト ~bituse~”の
“WINAPI入門ページ”の中の1つ:
プロセス・スレッド間の同期(イベント)
  今回はプロセス・スレッド間の同期(イベント)について説明します。

  過去二回は排他制御についてやってきましたが、
  今回はプロセス・スレッド間で行う同期処理の仕組みを説明します。
  イベントという仕組みを使って同期処理を行うのですが、
  何かのイベントが発生したときに、シグナル・非シグナル状態を切り替える、
  というだけの単純な仕組みです。
  排他制御ではありませんので、同時に実行されてしまいます。
  何かの動作をした時にシグナル・非シグナルを切り換える、
  というだけの単純なものです。
  ただそれを、スレッドはもちろん、プロセス間でも共有できる
  というのが大きいですね。
  ・・・・・
  ・・・・・

と云うことで、学習した。


ポイントは:
1.CreateEvent関数を使って、イベントオブジェクトを作成
2.OpenEvent関数を使って、イベントオブジェクトハンドルを取得
3.SetEvent関数ResetEvent関数を使って、シグナルを on/off
ですね。
でも、“CreateEvent”は“CreateEventA”だった。
それから、WaitForSingleObject関数も欲しい。これについては、MSDN(英文)を参照


要約(プロトタイプ宣言形式):
ffi.cdef[[
// CreateEvent関数:イベントオブジェクト作成
HANDLE CreateEventA(
LPSECURITY_ATTRIBUTES lpEventAttributes, // セキュリティ記述子
BOOL bManualReset, // リセットのタイプ
BOOL bInitialState, // 初期状態
LPCTSTR lpName // イベントオブジェクトの名前
);
// 第一引数:NULLを指定するとデフォルト値
// 第二引数:非シグナル状態に戻す時は、手動で(TRUE)、自動で(FALSE)を指定
// 第三引数:初期シグナル状態指定:TRUEでシグナル状態、FALSEで非シグナル状態
// 第四引数:イベントオブジェクトの名前を指定
//   成功すると、イベントオブジェクトのハンドルが返ります。


// OpenEvent関数:イベントオブジェクトのハンドル取得
HANDLE OpenEventA(
DWORD dwDesiredAccess, // アクセス権
BOOL bInheritHandle, // 継承オプション
LPCTSTR lpName // イベントオブジェクトの名前
);
//   普通に使うには、
// 第一引数にEVENT_ALL_ACCESS、
// 第二引数にFALSE、
//   成功すると、イベントオブジェクトのハンドルが返ります。


// SetEvent関数:イベントをシグナル状態にする
BOOL SetEvent( HANDLE hEvent ); // イベントオブジェクトのハンドル
// ResetEvent関数:非シグナル状態にする
BOOL ResetEvent( HANDLE hEvent ); // イベントオブジェクトのハンドル


// WaitForSingleObject関数:
DWORD WaitForSingleObject(
HANDLE hHandle, // オブジェクトのハンドル
DWORD dwMilliseconds // タイムアウト時間:ミリ秒(ms)単位で指定
);
// タイムアウト時間が経過すると、非シグナル状態であっても、制御を返す。
// 0 を指定すると、指定されたオブジェクトの状態を調べ、即座に制御を返す。
// INFINITE を指定すると、シグナル状態になるまで待機し続ける。
//   関数が成功すると、
// WAIT_ABANDONED:オブジェクトは、放棄された
// WAIT_OBJECT_0 :オブジェクトがシグナル状態になった
// WAIT_TIMEOUT :タイムアウト時間が経過。非シグナル状態であった
//   関数が失敗すると、WAIT_FAILED が返る。
]]
ですね。


そこで、
プログラムを2本作って、動作確認しようとしたが、
“EVENT_ALL_ACCESS”の値が・・・・・分からない?


もっと学習が必要だ。


本日はここまで。


“クライアント/サーバ”学習は続く。


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


170109

クライアント/サーバ:Lua - Python プロセス間通信

2017-01-27 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-25)の記事「クライアント/サーバ:プロセス間通信・改」に続いて、・・・

今度は、サーバ側を“Python”で行けないか?

いろいろ探していたら、


“stackoverflow”の「createNamedPipe in python
を見つけた。

このQ&Aは、Python to Python に関するものだが、
<紙>にとっては、半分だけ?が欲しいもの。

で、前回の サーバ側 を、Python で書いてみた。

##### test_Server_Py.py
import win32pipe, win32file

P1 = win32pipe.CreateNamedPipe(r'\\.\pipe\mypipe',
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT,
1, 65536, 65536,300,None);

win32pipe.ConnectNamedPipe(P1, None);

data = win32file.ReadFile(P1, 4096);
print data[1];

data = win32file.ReadFile(P1, 4096);
print data[1];
これだけ?


そこで、
このサーバー側“test_Server_Py.py”を先に立ち上げておいて、
次に、
クライアント側 は前回の“test_Client_lua.gsl”を立ち上げると、・・・

OK 出来ました。

(定義したパイプは双方向だが)一方向のみの通信で、
イベント定義も無いものならば、
こんなに簡単に出来てしまう???


本日はここまで。


“クライアント/サーバ”学習は続く。


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


170108

クライアント/サーバ:プロセス間通信・改

2017-01-25 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-23)の記事「クライアント/サーバ:プロセス間通信」で書いた、
クライアント側 のプログラム(test_Client.gsl)では、
C の コードで、CreateFileA とか、WriteFile 関数を使っていた。
でも、このくらいなら Lua のファイルアクセス関数で出来る。
のでは無いか?


と云うことで、

作ってみた。
----- test_Client_lua.gsl
hPipe = io.open( '\\\\.\\pipe\\mypipe', 'w+' )
print( hPipe ) --------- デバッグ用

Buf='hogehoge'
hPipe:write( Buf )
hPipe:flush()

hPipe:write( 'kamihoge' )
hPipe:flush()

hPipe:close()
こうなりました。
随分行数が減った。

但し、上記コードの様に、
file:write(~) 関数の後には、file:flush() 関数が必要だった。


それで、
サーバー側 は前回の“test_Server.gsl”を先に立ち上げておいて、
次に、
クライアント側 は今回の“test_Client_lua.gsl”を立ち上げると、・・・

OK 出来ました。


本日はここまで。


“クライアント/サーバ”学習は続く。


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


170108

クライアント/サーバ:プロセス間通信

2017-01-23 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-22)の記事「GSL Shell & Rclient 学習」の如く、
クライアント/サーバ・システムについて実例( Lua - R 間 )を学習していて、

自分でも“クライアント/サーバ・システム”もどきを作ってみたくなった。


あれこれ検索していて、
Win32 APIの名前付きパイプによるプロセス間通信・・・
 1.プロセス間通信
  複数のプロセス間でデータのやりとりをするための仕組みを
  プロセス間通信という。・・・・・
  ・・・・・
  ・・・・・
 2.Windowsの名前付きパイプによるプロセス間通信
  本ページでは、Windowsの名前付きパイプによるプロセス間通信を取り上げる。
  UNIXにも名前付きパイプがあるが、内容が異なる。
  文献[1]に分かりやすい例があるので、まず、これを実行してみよう。
  サーバー側のプログラムを下に示す。名前付きパイプを生成して、
  それに接続して、クライアントからのデータを待っている。
  クライアントからのデータを行単位で読み込んでいる。
  ・・・・・
  ・・・・・
  クライアント側のプログラムを下に示す。
  CreateFile関数により名前付きパイプに接続する。
  WriteFile関数により行単位でデータをパイプに送り込んでいる。
  全データを送り終わったら、CloseHandle関数によりパイプを閉じる。
  ・・・・・
  ・・・・・


それで、文献[1] に行ってみた。
Win32API 名前付きパイプによるプロセス間通信 CreateNamedPipe
  Win32APIで名前付きパイプを用いてプロセス間通信を行う

  使用するAPI
  ・CreateNamedPipe
  ・ConnectNamedPipe
  ・DisconnectNamedPipe

  ・・・・・
  ・・・・・

ここにある、コードを“GSL Shell”に移植?してみた。

サーバー側:
----- test_Server.gsl
charA = |s| ffi.cast( 'char*', s )
voidA = |a| ffi.cast( 'void*', a )

ffi.cdef[[
typedef unsigned int DWORD;

int CreateNamedPipeA(
char* lpName, // パイプ名
DWORD dwOpenMode, // パイプを開くモード
DWORD dwPipeMode, // パイプ固有のモード
DWORD nMaxInstances, // インスタンスの最大数
DWORD nOutBufferSize, // 出力バッファのサイズ
DWORD nInBufferSize, // 入力バッファのサイズ
DWORD nDefaultTimeOut, // タイムアウトの間隔
int lpSecurityAttributes // セキュリティ記述子
);

int ConnectNamedPipe(
int hNamedPipe,
int lpOverlapped
);

int ReadFile(
int hFile,
char* lpBuffer,
DWORD nNumberOfBytesToRead,
void* lpNumberOfBytesRead,
int lpOverlapped
);

int FlushFileBuffers( int hFile );
int DisconnectNamedPipe( int hNamedPipe );
int CloseHandle( int hObject );
]]

hPipe = ffi.C.CreateNamedPipeA( charA("\\\\.\\pipe\\mypipe"),
0x00000003, 0x00000000,
3, 0, 0, 100, 0 )
print( hPipe ) --------- デバッグ用

rcd = ffi.C.ConnectNamedPipe( hPipe, 0 )
print( rcd ) --------- デバッグ用

szBuff=ffi.new('char[256]')
B_read=ffi.new('uint32_t[1]')
while true do
rcd=ffi.C.ReadFile( hPipe, szBuff, 256, voidA(B_read), 0)
if rcd==0 then break end
str=ffi.string(szBuff,B_read[0])
print( str )
end

ffi.C.FlushFileBuffers( hPipe )
ffi.C.DisconnectNamedPipe( hPipe )
ffi.C.CloseHandle( hPipe )
こうでしょうか?
CreateNamedPipe は、CreateNamedPipeA だった。

クライアント側:
----- test_Client.gsl
charA = |s| ffi.cast( 'char*', s )
voidA = |a| ffi.cast( 'void*', a )

ffi.cdef[[
typedef unsigned int DWORD;

int CreateFileA(
char* pszFileName, // ファイル名
DWORD dwAccess, // アクセス指定
DWORD dwShare, // 共有方法
int psa, // セキュリティ属性
DWORD dwCreatDisposition, // 動作指定
DWORD dwFlagsAndAttributes, // フラグと属性
int hTemplate // テンプレートファイル
);

int WriteFile(
int hFile,
void* lpBuffer,
DWORD nNumberOfBytesToWrite,
void* lpNumberOfBytesWritten,
int lpOverlapped
);

int CloseHandle( int hObject );
]]

hPipe = ffi.C.CreateFileA(charA('\\\\.\\pipe\\mypipe'),
0x00000003, 0, 0, 3, 0x80, 0 )
print( hPipe ) --------- デバッグ用

bbb='hogehoge'
B_Wt=ffi.new('uint32_t[1]')

rcd=ffi.C.WriteFile( hPipe, voidA(bbb), 8, voidA(B_Wt), 0 )
print( rcd, B_Wt[0] ) --------- デバッグ用

rcd=ffi.C.WriteFile( hPipe, voidA('kamihoge'), 8, voidA(B_Wt), 0 )
print( rcd, B_Wt[0] ) --------- デバッグ用

ffi.C.CloseHandle( hPipe ) )
こうですね。
ここでも、
CreateFile は、CreateFileA だった。

それで、
サーバー側(test_Server.gsl)を先に立ち上げておいて、
次に、
クライアント側(test_Client.gsl)を立ち上げると、・・・

一方向の送受信が出来た。


ここで参照(学習)したサイトは、
PInvoke.net
Win32 API でのファイルアクセス
CreateNamedPipe function - MSDN


ところで、
せっかくパイプを“双方向モード”で作っているのだし、
ファイルも“READ or WRITE”モードでオープンしている。
それならば、双方向の通信もしたいが、・・・・・

こんなページを見つけた:
第248章 双方向から読み書きできる名前付パイプ
  今回は、
  サーバー・クライアントの双方向から書き込みのできる名前付きパイプを作ります。
  名前付きパイプはWin95/98では使えないので注意してください。

  使い方は、・・・・・
  ・・・・・
  ・・・・・

  クライアント側からの書き込みで、サーバー側がこれを読みとるのは
  前章のプログラムと同じ仕組みです。
  サーバー側からの書き込みに対してクライアント側で読みとる場合も
  ほぼ同様の仕組みでよいのですが いくつか 注意点があります。
  その一つはイベントオブジェクトを2つ用意しておかないと
  どちらの書き込みか判断が付かず、一方のスレッドが不用意に終了してしまう、
  という点です。
  ・・・・・
  ・・・・・

ン?
  イベントオブジェクトを2つ用意
だって。

それには、
イベントオブジェクト の学習が必要ですね。


本日はここまで。


“クライアント/サーバ”学習は続く。


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


170107

GSL Shell & Rclient 学習

2017-01-22 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-20)の記事「GSL Shell 学習:Rclient」の後、少々学習した。

1.現状では、“RServe”は 32-bit 版のみ。
  従って、<紙>は、RGui(64-bit) を使ってインストールしたが、
  RGui(32-bit) を使ってやっても一緒ですね。

2.“RServe”の変数は配列のみ。
  スカラーは無いので、要素が1つの配列を使う。

3.“RServe”サービスが終わらなかった件については、
  RGui で起動させると終わらなかった。


以下のような2行からなる startRserve.R ファイルを、
Rscript で実行すると、
サービスは自動で終了する。
library("Rserve")
Rserve(args="--no-save")
このファイルの名前を startRserve.R とする。

で、自作テスト・プログラム:
os.execute('startRserve.R')

R = require'rclient'
r = R.connect()

r.vec={1,2,3} -- Lua --> R
vec=r.vec -- R --> Lua:
print( vec )

-- Lua --> R:
r.x={1,2,3}
r.y={5,3,6}
-- Execute R commands:
r"plot(x,y,type='l',lwd=2,col='red')"

r'z<-x+y'
z=r.z; print(z)
こんな感じ?


今月初め(2017-01-06)の記事「Perl から Lua:関数Fitting ( By gnuplot )
で書いた関数フィッティングの例の様なものでは、・・・・・
os.execute('startRserve.R')

R = require'rclient'
r = R.connect()
----------------------------------------------------------------

r.x={ ・・・ }
r.y={ ・・・ }

r'f <- nls( y ~ a * ( x ^ (-1/b) ), start = c( a=1, b=1 ), algorithm = "port" )'
r'k <- coef(f)'
k=r.k
print( k['a'], k['b'] ) -- 解:a、b の値
の様なコードになる。


本日はここまで。


GSL Shell & Rclient 学習は続く?


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


170106

GSL Shell 学習:Rclient

2017-01-20 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
昨年初め(2016-01-04)の記事:
LuaJIT : Just-In-Time Compiler (JIT) for the Lua …
で書いた如く、
“LuaJIT”を見つけたのは、“SciLua”のサイトであった。

この“SciLua”のサイトに、“Non-Sci”メニュー?がある。
“Non-Sci”メニュー?をクリックしてみたら、
“Rclient”リンクがあった。

行ってみた:「Rclient

  Rclient: LuaJIT Client for Rserve

  A library that allows to execute arbitrary R programs within LuaJIT.
  Being the most widely used language for statistical computing,
   R features a huge number of scientific libraries.
  Of particular relevance is the possibility to leverage on
   the plotting capabilities of ggplot2 and similar libraries:
=== Google翻訳:
  LuaJIT内で任意のRプログラムを実行できるライブラリ。
  統計的計算のために最も広く使われている言語であるRは
   膨大な数の科学ライブラリを備えています。
  特に関連性があるのは、ggplot2などのライブラリの
  プロット機能を活用する可能性です。
=== 良く理解できる結果ダ。


この“Rclient”は、使えるかナ?

サンプルコードの下に、

  RServe

  RCLIENT implements a client for Rserve which is used to host a (local
   or remote) R session toward which a connection is established.
  The following R code, to be executed in a R session,
   installs Rserve and starts a local R session:
=== 同上 翻訳:
  RCLIENTは、接続が確立される(ローカルまたはリモートの)Rセッションを
   ホストするために使用されるRserve用のクライアントを実装します。
  Rセッションで実行される以下のRコードは、Rserveをインストールし、
   ローカルRセッションを開始します。
=== ???


これって、“Rclient”を使うためには、R 側に“RServe”が要るってこと?


取り敢えず、RGui(64-bit)を立ち上げ、
書かれているように
install.packages("Rserve")
library("Rserve")
Rserve(args="--no-save")
と打ち込んだ。

つまり、“RServe”のインストールと、実行。


元に戻って、“Rclient”の導入?
何処からダウンロードするの?

“Rclient”で検索すると、・・・・・
やたら、・・・ Microsoft R Client - MSDN
がヒットするが、・・・

GitHub - stepelu/lua-rclient: RClient: ・・・」に行ってみた。

  Install

  This module is included in the ULua distribution, to install it use:

    upkg add rclient

とある。
そうか、ULua のパッケージマネージャ“upkg”でインストールする。

でも<紙>は、
ULua から、GSL Shellにアップグレード?している。
なので、続く記述:
  Alternatively, manually install this module making sure that
  all dependencies listed in the require section of __meta.lua are
  installed as well (dependencies starting with clib_ are
  standard C dynamic libraries).

必要条件は?

  __meta.lua
に、
  require = {
   luajit = "2.0",
   socket = "2.0",
   xsys = "1.0",
  },
とある。

“LuaJIT 2.0”は、ゼンゼンOK。

“socket 2.0”は ?
昨年末(2016-12-23)の記事「GSL Shell で Web アクセス
で導入していた。

“xsys 1.0” は?
昨年5月(2016-05-30)の記事「GSL Shell 学習:SciLua
で導入していた。


条件は整ったので、

そこにある、4つのファイル:
“LICENSE”、“README.md”、“__meta.lua”、“init.lua”
をダウンロードして、ってメンドウなので、

右にある緑色のボタン「Clone or download」をクリックしてみると、
出てきた吹き出し?の右下に“Download ZIP”リンクがあった。
これで「lua-rclient-master.zip」をダウンロードした。
中にはフォルダが1つ。
その中に4ファイルがあった。 2016/02/13 付 8.91KB

そこで、
“GSL Shell”インストールフォルダの中の“GSL Shell”の中に、
“rclient”フォルダを作り、
格納した。

<紙>の場合は、
D:/TOOL/Lua/gsl-shell/gsl-shell/rclient/ に。


やっとのこと、

動作確認:

本家サイトの最初のコードをコピー&ペーストで、・・・・・

ダメ???

全ての“local”宣言を外したら、
正常に動作した。


★注意★

R 側で、
library("Rserve")
Rserve(args="--no-save")
とするのは
1回のみでイイ!
何度も行うと、その都度サービスが立ち上がる。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170105

OpenCV 学習:CvMat型の type 項目

2017-01-18 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-16)の記事「TIFF画像出力サブプログラム 自作」に続いて、
“OpenCV”の学習。

その前(2017-01-15)の記事「OpenCV 学習:cvSaveImage の制限」で、
  ・・・・・
  ・・・・・
  そして、<紙>の環境の“OpenCV”では、
  5種類全て、読み込みはOKだった。
  (手作業で作ったファイルで確認)
  ・・・・・
  ・・・・・
と書いている。

これは、入力する画像ファイルのタイプが分かっている場合。

では、
事前に分かっていない画像ファイルを読み込んだ場合、
そのタイプはどうやって判定する?


CvMat 型の構造体定義については、
昨年(2016-03-04)の記事「GSL Shell 学習:OpenCV の CvMat 型」で書いている。
  ・・・・・
  ・・・・・
ffi.cdef[[
typedef void CvArr;

typedef struct CvMat{
int type; int step; int* refcount; int hdr_refcount;
union{ unsigned char* Byte; char* Char; unsigned short* Word; int* Int; double* Dbl; };
union{ int rows; int height; int yy; };
union{ int cols; int width; int xx; };
} CvMat;

CvMat* cvCreateMat( int rows, int cols, int type );
void cvmSet( CvMat* mat, int row, int col, double value );
]]
  ・・・・・
  ・・・・・

つまり、
この定義にある type 項目で判定する?


5種類のファイルについて、調べてみた。

・8ビット整数・・・・・・・・ 0x42424000
・16ビット整数・・・・・・・ 0x42424002
・32ビット整数・・・・・・・ 0x42424005
・32ビット浮動小数点数・・・ 0x42424005
・64ビット浮動小数点数・・・ 0x42424006

なにか変だ

そう、32ビット の場合。
整数データと浮動小数点データの区別が出来ない???

これは、“ImageJ”と同じ?

つまり、
32ビットデータの場合、読み込みは正しいが
内部では、浮動小数点データに成っている?

いや、ImageJ では、変換されているのかもしれないが、
OpenCV の cvLoadImageMでは、そのまま。


これは困ったこと。


暫く思案していたが、・・・・・

値の範囲を調べることで識別できないか???

どうも、
ゼロの場合は、
int32_t でも float でも、全ビットゼロの様だが、

一旦整数型と見なして判定する。

例えば、絶対値が 500,000,000 より大きいか小さいかとかで、

大きい時は float 型データ。
小さい時は int32_t 型データ。

つまり、符号無し整数では、0~500,000,000 迄であるとし、
正の浮動小数点数では、ゼロか 10^-12 以上であるとする。

と云うのは、
実用上問題無い???


本日はここまで。


TIFF & OpenCV 学習は続く。


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


161221

TIFF画像出力サブプログラム 自作

2017-01-16 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-15)の記事「OpenCV 学習:cvSaveImage の制限」では、
OpenCV”の“cvSaveImage”では書き出せないタイプがある。

そこで、
TIFF画像出力サブ(tifGray_Wt_SUB)なるものを設計した。

その後、いろいろ試していたが、一応完成した?


perl の「tif_Wt_pkg」では、
タグとしては、以下の 14 ケで済ませていた。
0x100、0x101、0x102、0x103、0x106、0x111、0x115、0x116、0x117、0x118、
0x119、0x11A、0x11B、0x128

しかし、0x153 が必要ですネ。


だが、もっと減らせられないかとケチってみたら、
0x103、0x118、0x119、0x11A、0x11B、0x128
の 6 ヶは無くても良かった。
( PicrBear、XnView、ImageJ、OpenCV で読み込めた。)


結局、以下の9ヶで十分?
0x100、0x101、0x102、0x106、0x111、0x115、0x116、0x117、0x153


それで、出来上がったのは:
----- tifGray_Wt_SUB.lua
--------- TIFF ヘッダー : GrayScale用 ( グローバルで )

H1_ = ffi.new( 'uint16_t[5]', 0x4949, 42, 8,0, 12 ) -- 10 == 0x0A
H2_ = ffi.new( 'uint32_t[28]', -- 112 == 0x70
0x100+65536*4, 1, -1, 0x101+65536*4, 1, -1,
0x102+65536*3, 1, -1, 0x106+65536*3, 1, 1,
0x111+65536*4, 1, 0x78, 0x115+65536*3, 1, 1,
0x116+65536*3, 1, -1, 0x117+65536*4, 1, -1,
0x153+65536*3, 1, -1, 0 ) ---------------- 最後は 2Byte で可
HH_ = {{1,1},{2,1},{4,1},{4,3},{8,3}} --- 8I, 16I, 32I, 32F, 64F

--------------------------------- SUB

-------- file名, データ, cols, raws, 1~5
function tifGray_Wt( fnm_, data_, x_, y_, typ_ )
local hT = HH_[typ_]; local h1, h2 = hT[1], hT[2]

local buf = ffi.new( 'uint8_t[?]', 0x78+x_*y_*h1 )
H2_[2], H2_[5], H2_[20], H2_[23] = x_, y_, y_, x_*y_
H2_[8], H2_[26] = h1*8, h2
ffi.copy( buf, H1_, 10 )
ffi.copy( buf+10, H2_, 110 )
ffi.copy( buf+120, data_, xx*yy*h1 ) -- buf+122 で無くて可
local OT = io.open( fnm_, 'wb' )
OT:write( ffi.string( buf, 120+x_*y_*h1 ) )
OT:close()
end
と云うもの。
ナマの画像データに比べて、120 バイト多いだけ。


本日はここまで。


TIFF & OpenCV 学習は続く。


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


161231

OpenCV 学習:cvSaveImage の制限

2017-01-15 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-13)の記事「TIFF 学習 : 画像 type」では、
  ・・・・・
  ・・・・・
  そして、<紙>の環境の“OpenCV”では、
  5種類全て、読み込みはOKだった。
  (手作業で作ったファイルで確認)
  ・・・・・
  ・・・・・
で終わっていた。

では、
書き込みはどうか?

<紙>が使っているのは、C 言語用関数“cvSaveImage
これ、“OpenCV 2.4.12 API Reference”を見ると:
int cvSaveImage(const char* filename, const CvArr* image, const int* params=0 )
(C function, in Reading and Writing Images and Video)
  imwrite
  Saves an image to a specified file.
  ・・・・・
  ・・・・・
  The function imwrite saves the image to the specified file.
  The image format is chosen based on the filename extension
   (see imread() for the list of extensions).
  Only 8-bit (or 16-bit unsigned (CV_16U) in case of PNG,
   JPEG 2000, and TIFF) single-channel or 3-channel (with 'BGR'
   channel order) images can be saved using this function.
  If the format, depth or channel order is different, ・・・
  ・・・・・
  ・・・・・
とある。
=== Google 翻訳:
  関数imwriteは、イメージを指定されたファイルに保存します。
  イメージフォーマットは、ファイル拡張子
  (拡張子のリストについてはimread()を参照)に基づいて選択されます。
  この機能を使用して、8ビット(またはPNG、JPEG 2000、TIFFの場合は
   16ビットの符号なし(CV_16U)のみ)のシングルチャンネルまたは
   3チャンネル(BGRチャンネル)画像を保存できます。
  フォーマット、深さまたはチャネルの順序が異なる場合、・・・
=== まあまあですね。

つまり、
TIFFでGrayScaleの場合は、8-bit か、16-bit の符号無しダケ

各種タイプの画像を読み込むことが出来たのに!


仕方がないから、
以前(2017-01-04)の記事「Perl から Lua : TIFF画像ファイルの入出力」で書いた、
  ・・・・・
  ・・・・・
  4年前(2013-09-07)の記事「Perl で、TIFFファイル出力」で書いた方式。
  即ち、
  パッケージ「package tif_Wt_pkg;」を、
  「require 'tif_Wt_pkg.pl';」として使う。
  ・・・・・
  ・・・・・
の様なコードで、Lua での書き出し用サブプログラムを作るかナ?


利用法は、・・・・・
require'tifGray_Wt_SUB'

tifGray_Wt( <ファイル名>, <データ>, <横サイズ>, <縦サイズ>, <タイプ> )
の様な感じ。

引数の説明:
<ファイル名> は、Luaの文字列
<データ> は、<タイプ>に合った画像データの先頭アドレス
<横サイズ>、<縦サイズ> は、整数
<タイプ> は、
 1:8ビット符号無し整数
 2:16ビット符号無し整数
 3:32ビット符号付き整数
 4:32ビット浮動小数点数
 5:64ビット浮動小数点数


これで、(<紙>にとって)汎用なものになる。

サンプル(32-bit float の例):
require'tifGray_Wt_SUB'
-- xx, yy = <横サイズ>, <縦サイズ>
img = ffi.new( 'float[?]', xx*yy )
-- img[n] = <Pixel 値> for n=0,xx*yy-1
tifGray_Wt( 'hogehoge.tif', img, xx, yy, 4 )
で済ませたい。


それで、
当時の perl の「tif_Wt_pkg」を Luaに移植する?



本日はここまで。


TIFF & OpenCV 学習は続く。


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


161214

TIFF 学習 : 画像 type

2017-01-13 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-11)の記事「拡張子が FDF なるファイル」では、
  ・・・・・
  ・・・・・
  ところで、
  ImageJ が扱える画像ファイルのタイプは?
  GrayScale(グレースケール)に限ると、
  8-bit、16-bit、32-bit とあるが、
  より詳細には、
  8-bit int、16-bit int、32-bit float ですか?
  32-bit int や、64-bit float はダメなの?
  ・・・・・
  ・・・・・
で終わっていた。

そこで、TIFF(Tagged Image File Format) を学習した。
ドキュメントは、2007(H19)-03-05 にダウンロードした PDF 文書:
TIFF Revision 6.0 Final - June 3, 1992

実は、このドキュメントを参照して、
当時 ActiveBasic で TIFFファイル出力モジュールを作った。

そして、
2013(H25)-09-07 の記事「Perl で、TIFFファイル出力」で書いた如く、
Perl でパッケージ“package tif_Wt_pkg;”を作った。

更に、
2013(H25)-09-09 の記事「R で、TIFFファイル出力」で書いた如く、
R に移植した。

なお、Python では、
2014(H26)-03-06 の記事「Python 学習:Image処理」で書いた如く、
  ・・・・・
  ・・・・・
  8bpp TIFF の読み込み/書き出しは、
  あっけない位シンプルだった。
  ・・・・・
  ・・・・・
でしたが、・・・・・


さて、
上記の TIFF ドキュメントをしっかり学習した(?)結果、

関係する“タグ”は、

 ・258(0x102) : BitsPerSample
 ・339(0x153) : SampleFormat

の2つの様ダ。


GrayScale に限定すると、・・・・・

タグ 0x153 は Pixel 値の表現形式で、取り得る値は:
 1 : 符号無し整数
 2 : 符号付き整数
 3 : 浮動小数点数
なお、このタグを省略すると、1 と見なす。


タグ 0x102 は Pixel 値の桁数で、取り得る値は:
 1、2、4、8、16、32、64 : ビット


それで、
一般的(?)には、
 ・8ビット符号無し整数
 ・16ビット符号無し整数
 ・32ビット符号付き整数
 ・32ビット浮動小数点数
 ・64ビット浮動小数点数


この内、ImageJ が出力するのは、
 ・8ビット符号無し整数
 ・16ビット符号無し整数
 ・32ビット浮動小数点数
の様ですネ。
そして、
 ・32ビット符号付き整数
は読み込める様ダ。


なお、<紙>の環境の“OpenCV”では、
5種類全て、読み込みはOKだった。
(手作業で作ったファイルで確認)


本日はここまで。


TIFF & OpenCV 学習は続く。


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


161214

拡張子が FDF なるファイル

2017-01-11 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
ひょんなことから、拡張子が 'fdf' なるファイルを知った。
それと同時に、このファイルを読み込む ImageJ のプラグインがあった。

プラグインを追加して、ImageJ で読んでみると。
'hogehoge.fdf' は MRI 画像の様だった。

こうなると、俄然この 'hogehoge.fdf' ファイルを解析してみたくなる。

先ずは、ネット検索してみた。

ウィキペディア:「FDF
  ・フィンランド国防軍( ・・・ )
  ・英国食品・飲料連盟( ・・・ )
  ・ジブチサッカー連盟( ・・・ )
  ・Forms Data Format、PDFドキュメント内部のフォームを処理するフォーマット
  ・押込ファン( ・・・ )
  ・光ケーブル配分架( ・・・ )
  ・フライ,ダディ,フライ
  ・フォール・ド・フランス空港のIATA空港コード

  このページは曖昧さ回避のためのページです。
  ・・・・・
  ・・・・・

そうすると、
4番目の「Forms Data Format (FDF)
  Forms Data Format (FDF) はPDFを基盤にしており、
  同じ文法と基本的に類似したファイル構造をしているが
  PDFよりはbodyに必要なオブジェクトが1個だけである分単純である。
  FDFはPDF仕様書に記載されている。
  ・・・・・
  ・・・・・

がメジャーな世界。

でも、<紙>が目にしたのは全く別物で、マイナーな独自仕様。


なので、
エディタ&バイナリエディタでファイルを開いてみた。

初めの40行程度は ASCII テキストで、
以降はバイナリデータと成っている?
これ、ImageMagick が出力する PGM ファイルと同じ様なファイル形式。

それで、
ImageJ で読めると云うことは?
4バイト浮動小数点数。所謂 'float' 型?

だが、(<紙>の既定である) little endian(リトルエンディアン)では無かった。
つまり、big endian(ビッグエンディアン)だった。


ここまで判れば、
あとは、モードの切り替え点の判別。

そうしたら、
自前の Lua ( GSL Shell ) コードで読み込むことができる。

これで、一件落着?????


ところで、
ImageJ が扱える画像ファイルのタイプは?

GrayScale(グレースケール)に限ると、
8-bit、16-bit、32-bit とあるが、
より詳細には、
8-bit int、16-bit int、32-bit float ですか?

32-bit int や、64-bit float はダメなの?


本日はここまで。


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


161213

GSL Shell 学習:Fitting サブ

2017-01-09 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-08)の記事「Perl から Lua : 関数Fitting ( By GSL )」では、
  ・・・・・
  ・・・・・
  はやり、関数フィッティングは GSL Shell
  と云うことですネ。
  ・・・・・
  ・・・・・

そうすると、もう gnuplot でのフィッティングは忘れる?


それで、
前回の様にたくさんの行をコーディングしたくない。


なので、
例えば、昨年2月(2016-02-24)の記事:
GSL Shell 学習:Nonlinear Least Squares Fit」のコード例なら、
X = matrix.vec{ 5, 7, 8, 9, 10, 13, 15, 17, 18 }
Y = matrix.vec{ 0.67, 0.84, 1.29, 1.25, 0.69, 0.35, 0.18, 0.09, 0.02 }
------- Y ~ a * X^3 + b * X^2 + c * X + d で近似
-------------------------------------------------
require'Fit_SUB'
s = Fit_GSL( X, Y, 'k[1]*x^3+k[2]*x^2+k[3]*x+k[4]', '{ 1, 0, 0, 0 }', 'x^3', 'x^2', 'x', '1')
-------------------------------------------------
print( s.x, s.chisq ) -- 求めた係数、カイ二乗
の様な、実質1行で済ませたい!

つまり、
 'Fit_GSL'関数のみを定義している、
 'Fit_SUB' サブプログラムを作る。

'Fit_GSL'関数の仕様
引数は、5つ以上で、
第1、2は、観測点データベクトル X、Y
第3は、近似関数(文字列)
第4は、初期推定値テーブル
第5以降は、ヤコビアン(文字列)

但し、ベクトル X、Y は、matrix.vec で確保。
近似関数とヤコビアンでの、係数は k[] で表記。
初期推定値テーブルの要素数とヤコビアンの数は、ちょうど係数の数で。


なお、ヤコビアンを求めたいときは、
Maxima」か「Euler」を使う。


結果、出来上がった'Fit_SUB' サブプログラム:
function Fit_GSL( x_, y_, pp1, pp2, ... )
local pj = {...}
local n, k = #x_, #pj
local X, Y = x_, y_
local v = {}
v[1]='function fdf( k, f, J )\n'
v[2]=' for i=1, %d do\n local x, y = X[i], Y[i]\n' -- n
v[3]=' if f then f[i] = ( %s - y ) end\n' -- pp1
v[4]=' if J then\n'
local vj=' J:set( i, %d, %s )\n' -- (pj)
v[5]=' end; end; end\n'
v[6]='s_ = num.nlinfit{ n=%d, p=%d }\n' -- n, k
v[7]='s_:set( fdf, matrix.vec%s )\n' -- pp2

local vv = v[1]..string.format( v[2], n )
vv = vv..string.format( v[3], pp1 )..v[4]
for q,pjq in ipairs(pj) do
vv = vv..string.format( vj, q, pjq )
end
vv = vv..v[5]..string.format( v[6], n, k )
vv = vv..string.format( v[7], pp2 )

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

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


なお、前の記事「Perl から Lua : 関数Fitting ( By GSL )」のコードなら、
X = matrix.vec{ ・・・・・ }
Y = matrix.vec{ ・・・・・ }
------- Y ~ exp( -b * log(X) + c ) で近似
-------------------------------------------------
exp=math.exp; log=math.log
require'Fit_SUB'
s = Fit_GSL( X, Y, 'exp(-k[1]*log(x)+k[2])', '{ 1, 0 }', '-log(x)*exp(-k[1]*log(x)+k[2])', 'exp(-k[1]*log(x)+k[2])')
-------------------------------------------------
b, c = s.x[1], s.x[2] -- 求めた係数
の様なものになる。


本日はここまで。


“Perl から Lua ( GSL Shell ) への移植”準備その2は終了?


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


161210

Perl から Lua : 関数Fitting ( By GSL )

2017-01-08 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-06)の記事「Perl から Lua : 関数Fitting ( By gnuplot )」では、

  ・・・・・
  ・・・・・
  だが、別のプログラムで
  もう一つ Fitting 関数があった。
    f(x)=exp(-b*log(x)+c)
  gnuplot では、この様な関数に対しては手が出ない???
  エラーで停止

  はやり、gnuplot での 関数フィッティングには、限界がある?
  出直して来ます。
  ・・・・・
  ・・・・・

でした。

そこで、
昨年2月(2016-02-24)の記事「GSL Shell 学習:Nonlinear Least Squares Fit
に戻ってみた。

フィッティング関数は、
 f(x)=exp(-b*log(x)+c)
なので、
2つの係数 b、c について、先ずはヤコビアンを求める。

ここは、
Maxima」か「Euler」を使って、・・・

b では、-log(x)*exp(-b*log(x)+c)
c では、exp(-b*log(x)+c)

ですね。


そうすると、コードは:
X = matrix.vec{ ・・・・・ }
Y = matrix.vec{ ・・・・・ }
------- Y ~ exp( -b * log(X) + c ) で近似

n = #X
function fdf( k, f, J ) -- ( 係数、関数、ヤコビアン )
for i=1, n do
local b, c = k[1], k[2]
local x, y = X[i], Y[i]
if f then f[i] = (math.exp(-b*math.log(x)+c) - y) end -- (近似関数 - 観測値)
if J then
J:set( i, 1, -math.log(x)*math.exp(-b*math.log(x)+c) )
J:set( i, 2, math.exp(-b*math.log(x)+c) )
end
end
end

s = num.nlinfit{ n=n, p=2 } -- 観測値の数、係数の数
s:set( fdf, matrix.vec{ 1, 0 } ) -- 係数の初期推定値
for i=1, 100 do
s:iterate() -- 繰り返し計算
if s:test( 0, 1e-8 ) then break end
end

b, c = s.x[1], s.x[2] -- 求めた係数
で、行ける?

OKそう


はやり、関数フィッティングは GSL Shell
と云うことですネ。


本日はここまで。


“Perl から Lua ( GSL Shell ) への移植”準備その2は続く?


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


161210

Perl から Lua : 関数Fitting ( By gnuplot )

2017-01-06 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-04)の記事「Perl から Lua : TIFF画像ファイルの入出力
に続いて、・・・・・

かれこれ3年ほど前に “Perl”で書いていたものを、
Lua”と云っても “GSL Shell”に移植するための準備その2。

関数フィッティング処理があった。
当時は、Perl だけではムリだと思い、R 言語の力を借りた。

当時の Perl では、以下の様なコード:
# ・・・・・
# ・・・・・
$yfx = 'nls( y ~ exp( -x / a ), start = c( a=1 ), algorithm = "port" )';
@coef = &FittingByR( $yfx, \@x, \@y ); # 関数形、X値、Y値 を入力、係数:a を返す
$a=$coef[1]; # 求めたいもの。
#
# ======================================================================
sub FittingByR{ # 関数形、 X値、 Y値、 要素数
$YFX=$_[0]; $X=$_[1]; $Y=$_[2]; $nn=$#{$X};
open ( OT , ">tmp.R" );
print OT "x <- c(\n";
for( $n=0; $n<$nn; $n++ ){ print OT $$X[$n], ",\n"; }
print OT $$X[$nn], "\n";
print OT ")\n";
print OT "y <- c(\n";
for( $n=0; $n<$nn; $n++ ){ print OT $$Y[$n], ",\n"; }
print OT $$Y[$nn], "\n";
print OT ")\n";
print OT "fx <- ", $YFX, "\n"; # Fitting Function
print OT 'writeLines( paste(coef(fx),collapse=" ") )', "\n"; # to STDOUT
close( OT );

my $ppp = "Rscript tmp.R |"; # Fitting By 'R'
open( IN , $ppp ); my $w=; close( IN );
unlink( "tmp.R" );
return split(/\s+/ , " ".$w); # a, ... を返す
}
# ・・・・・
# ・・・・・
の様にコーディングしていた。
ここで、@x、@y は、事前に定義済。

つまり、R言語で云えば、
x <- c( ・・・ )   # 元の @x
y <- c( ・・・ ) # 元の @y
fx <- nls( y ~ exp( -x / a ), start = c( a=1 ), algorithm = "port" )
writeLines( paste(coef(fx),collapse=" ") )
の様なソースを実行する
ことになる。


この部分を、Lua では、どの様に書く???

関数フィッティングについては、

昨年11月(2016-11-30)の記事「gnuplot で Fitting
において、
  ・・・・・
  ・・・・・
  Luaからgnuplotを呼び出して、
  fitの実行結果から係数を受け取る。
  ・・・・・
  ・・・・・
  Luaからの利用では、
  「fit.log」を読み込んで、
  求まった係数の部分を、先頭30文字分ほど抜き出し、
  1月の記事「Lua 学習:eval 関数」で書いた
assert( load( <文字列> ) )()
を使えば取り込めますネ。
  ・・・・・
  ・・・・・

そこで、
昨年12月(2016-12-12)の記事「Lua & gnuplot : gnuplot モジュール初版
で書いた、自作モジュールを使ってみた。

gp = require'gnuplot'

gp.Open()
gp.Set( 'fit quiet' )

-- x = matrix.vec{ ・・・ }
-- y = matrix.vec{ ・・・ }

gp.DataBlk( '$D', 1, #x, x, y )

gp.Com( 'f(x)=exp(-x/a)' ) -- Fitting 関数

gp.Com( 'fit f(x) $D via a' ) -- フィッティング実行
gp.Close()

IN=io.open('fit.log')
for w in IN:lines() do if string.sub(w,1,1) == '=' then break end end
w = IN:read('*l'); assert(load(string.sub(w,1,30)))(); print( 'a='..a )
IN:close()
os.remove( 'fit.log' )
で、行ける?

OKそう


だが、別のプログラムで
もう一つ Fitting 関数があった。

f(x)=exp(-b*log(x)+c)

gnuplot では、この様な関数に対しては手が出ない???
エラーで停止!


はやり、gnuplot での 関数フィッティングには、限界がある?

出直して来ます。


本日はここまで。


“Perl から Lua ( GSL Shell ) への移植”準備その2は続く。


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


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



おきてがみ

最新記事
カレンダー
12 | 2017/01 | 02
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
ブックマーク