Lua & gnuplot:gnuplot モジュール改訂

2017-06-26 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
昨年末(2016-12-12)の記事「Lua & gnuplot : gnuplot モジュール初版」で、
  ・・・・・
  ・・・・・
  “gnuplot”モジュールの初版を完成させた。
  ・・・・・
  ・・・・・
と書いている。

その後、色々と活用していたが、
不都合が見つかった。

なので、
今回インターフェイスは変えずに、若干の改訂を行った。


1.生成する数値のフォーマットを変更

 次の2つの関数:
 ・gp.Data( b, n, x, y )
 ・gp.DataBlk( BN, b, n, x, y, ... )
 において、
 現状では %.3f としているが、桁数不足だった。
 かといって、%15.9f とかでは、ムダな場合をある。

 そこで、%g にした。


2.フォント指定を変更

 次の3つの関数:
 ・gp.Open( )
 ・gp.Open( 'ファイル名' )
 ・gp.Pdf( 'PDFファイル名' )
 では、現状“sans”としており、

 ・gp.Title( 'タイトル文字列' [ , <フォントサイズ> ] )
 ・gp.Xlabel( 'X軸ラベル' [ , <フォントサイズ> ] )
 ・gp.Ylabel( 'Y軸ラベル' [ , <フォントサイズ> ] )
 では、現状“serif”としていた。

 これらを、"Arial”に変更/統一した。


結果は:
local gp = {}

local SF = string.format
local SS = string.sub
local function split_path( p ) return string.match( p, "(.-)([^\\]-([^%.]+))$" ) end

function gp.Open( fn )
if fn == nil then
GP = io.popen( 'gnuplot -persistent', 'w' ) ----- ファイル名無し:画面出力
else
local Dir, FN, ext = split_path( fn )
if ext ~= 'plt' then FN = FN..'.plt' end ----- .plt 無し なら付加する
GP = io.open( FN, 'w' )
end
GP:write( 'set term wxt size 800, 600\n' ) ----- 窓サイズ
GP:write( 'set term wxt font "Arial,12"\n' ) ----- フォント
GP:write( 'set size 1.0, 0.98\n' ) ----- グラフサイズ
end

function gp.Pdf( fn )
local Dir, FN, ext = split_path( fn )
if ext ~= 'pdf' then FN = FN..'.pdf' end ----- .pdf 無し なら付加する
GP:write( 'set term pdf size 8, 6\n' ) ----- ページサイズ
GP:write( 'set term pdf font "Arial,12"\n' ) ----- フォント
GP:write( SF('set output "%s"\n', FN ) ) ----- PDFファイル名
end

function gp.Close() ----- ファイルclose
GP:close()
end

function gp.Com( c ) ----- 任意の コマンド用
GP:write( SF('%s\n', c ) ) ----- コマンド&パラメータ
end

function gp.Set( s ) ----- set コマンド用
GP:write( SF('set %s\n', s ) ) ----- パラメータ
end

function gp.UnSet( s ) ----- unset コマンド用
GP:write( SF('unset %s\n', s ) ) ----- パラメータ
end

function gp.Table( fn )
if fn == nil then
GP:write( SF('set table\n', fn ) ) ----- table コマンド用
elseif SS(fn,1,1) == '$' then
GP:write( SF('set table %s\n', fn ) )
else
GP:write( SF('set table "%s"\n', fn ) )
end
end

function gp.Title( t, s )
if s == nil then s = 36 end
GP:write( SF('set title "%s"\n', t ) ) ----- タイトル
GP:write( SF('set title font "Arial,%d"\n', s ) ) ----- フォント
end

function gp.Xlog()
GP:write( 'set logscale x\n' ) ----- 対数目盛
end

function gp.Xlabel( L, s )
if s == nil then s = 20 end
GP:write( SF('set xlabel "%s"\n', L ) ) ----- ラベル
GP:write( SF('set xlabel font "Arial,%d"\n', s ) ) ----- フォント
end

function gp.Xrange( s )
GP:write( SF('set xrange %s\n', s ) ) ----- 範囲
end

function gp.Ylog()
GP:write( 'set logscale y\n' ) ----- 対数目盛
end

function gp.Ylabel( L, s )
if s == nil then s = 20 end
GP:write( SF('set ylabel "%s"\n', L ) ) ----- ラベル
GP:write( SF('set ylabel font "Arial,%d"\n', s ) ) ----- フォント
end

function gp.Yrange( s )
GP:write( SF('set yrange %s\n', s ) ) ----- 範囲
end

function gp.KeyOff()
GP:write( 'set key off\n' ) ----- 凡例無し
end

function gp.Plot( p ) ----- 引数そのママ
GP:write( SF('plot %s\n', p ) ) ----- Plot コマンド
end

function gp.RePlot( p )
GP:write( SF('replot %s\n', p ) ) ----- replot
end

function gp.Data( b, n, x, y ) ----- b:origin
local px, py = x, y
if b==0 then ----- 1 or 0
px, py = ffi.cast('double*', x ), ffi.cast('double*', y )
end
for k=b,n-(1-b) do
GP:write( SF('%g %g\n', px[k], py[k] ) )
end
GP:write( 'e\n' )
end

function gp.DataBlk( BN, b, n, x, y, ... ) ----- BN:Block名
local t, pt = {...}, {} ----- 3列以上は、b==0 の場合のみ可
local px, py = x, y ----- b==1 では無視
if b==0 then
px, py = ffi.cast('double*', x ), ffi.cast('double*', y )
for i,p in ipairs(t) do pt[i]=ffi.cast('double*', t[i] ) end
end
GP:write( SF('%s << EOD\n', BN ) )
for k=b,n-(1-b) do
GP:write( SF('%g %g', px[k], py[k] ) )
for i,_ in ipairs(pt) do GP:write( SF(' %g', pt[i][k] ) ) end
GP:write( '\n' )
end
GP:write( 'EOD\n' )
end

return gp
となった。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170425,0521
スポンサーサイト

GSL Shell:非線形2変数方程式の求解モジュール自作

2017-06-24 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-06-23)の記事「GSL Shell 学習:Solve(Findroot)2変数関数版」では、
  ・・・・・
  ・・・・・
  つまり、
    求めたい方程式(2つ)と、それの偏微分関数(4つ)と、初期推定値(2つ)
  で始まり、
    漸化式を順次計算し、収束を判定して、
  終了する。
と云ったソルバーのコードが出来た。


そこで、
いろいろ改良を加えて、モジュール化してみた。


改良点は:
 解きたい方程式と、初期推定値のみを与えて、
 偏導関数は、モジュール内部で 差分による近似で置き換える。
 また、マトリックス演算を展開した四則演算に置き換える。
と云うもの。

で、
(仮称だが)NL_solve_2var.luaモジュールは:
----- NL_solve_2var.lua -----
local M = {}

function M.solve2(f,g,i)
local delta = 10^-8; local D2 = delta^2

local dfx = |x,y| (f(x+delta,y)-f(x,y))/delta --偏導関数の代わり
local dfy = |x,y| (f(x,y+delta)-f(x,y))/delta
local dgx = |x,y| (g(x+delta,y)-g(x,y))/delta
local dgy = |x,y| (g(x,y+delta)-g(x,y))/delta

local x, y = i[1], i[2]; local a, b, c, d, p, q, D, x2, y2, nn
for n=1,100 do
nn=n
a, b, c, d = dfx(x,y), dfy(x,y), dgx(x,y), dgy(x,y)
p, q = -f(x,y), -g(x,y)
D = a*d-b*c; x2 = (d*p-b*q)/D; y2 = (a*q-c*p)/D
if x2^2+y2^2 < D2 then break end -- 収束判定
x, y = x+x2, y+y2
end
return x, y, nn
end

return M
で良い?
反復回数は、最大 100 回で十分だと思う。
収束判定用の微少値は 10^-8 で十分ダ。

このモジュールを使うテストメイン:
----- test_Main_NL_solve_2var.gsl -----
f = |x,y| 2*x^2 + 3*y^2 - 10 -- 対象関数
g = |x,y| y - 4*x - 1
x,y = 1,1 -- 初期推定値

----------------------------
NL = require'NL_solve_2var'

x, y, n = NL.solve2( f, g, {x,y} ) -- 根、反復回数

print( n, x, y ) -- 6, 0.20452221541786, 1.8180888616714
これで?

OKですネ。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170507,11

GSL Shell 学習:Solve(Findroot)2変数関数版

2017-06-23 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
以前(2017-06-19)の記事「GSL Shell 学習:Solve(Findroot)」では、

“講義資料”「非線型方程式の数値計算法」の、
4 ニュートン法(Newton's method)”を使った。

今回は、
“講義資料”「非線型方程式の数値計算法」の、
“8 付録”に載っている
8.2 非線形連立方程式の実数解(2元の場合)」に挑戦。


キモは、資料の 式(30) ですね。

  ・・・・・
  ・・・・・
  ・・・ つぎの連立方程式を満たせばよい.
  式(28)と (29)の左辺をゼロとおき式を整理すれば
    ・・・ 式(30)
  となる.この連立方程式を解いて,~ を求める.~ から,次の近似解は
    ・・・・・
  となる.これが,非線形連立方程式の漸化式である.
  ・・・・・
  ・・・・・


つまり、

  求めたい方程式(2つ)と、それの偏微分関数(4つ)と、初期推定値(2つ)

で始まり、

  漸化式を順次計算し、収束を判定して、

終了する。

と云うこと。


ここで、式(30) を解くには、
昨年(2016-02-02)の記事「GSL Shell 学習:matrix.solve( A, b )
で書いた方式ですね。

なお、
式(30) で求める値は、次の値ではなくて、次の値との差分ですネ。


それで、
2年前(2015-11-03)の記事「Python 学習:連立方程式を解く」で書いた、
  ・・・・・
  ・・・・・
  例えば、
    2 * x**2 + 3 * y**2 = 10
    y = 4 * x - 1
  の様な2元2次連立方程式を解くとしたら、・・・・・
  ・・・・・
  ・・・・・
この2元2次連立方程式を題材に、コード化してみた。

----- test_blog_2219.gsl

f = |x,y| 2*x^2 + 3*y^2 - 10 -- 対象関数 2つ
g = |x,y| y - 4*x - 1

dfx = |x,y| 4*x -- 偏導関数 4つ
dfy = |x,y| 6*y
dgx = |x,y| -4
dgy = |x,y| 1

x, y = 1, 1 -- 初期推定値 2つ

---------------------------------
n=0
while true do
A = matrix.def{ {dfx(x,y), dfy(x,y)}, {dgx(x,y), dgy(x,y)} }
b = matrix.vec{ -f(x,y), -g(x,y) }
xy= matrix.solve( A, b ) -- delta x,y
x2, y2 = x+xy[1], y+xy[2]

if xy[1]^2+xy[2]^2 < 10^-16 then break end -- 収束判定
x, y = x2, y2
n=n+1; if n>100 then break end
end

----- 解 と 反復回数:
print( n, x, y ) -- 5, 0.20452221541786, 1.8180888616714

-- 過去ログ では、
-- x, y == 0.204522215417857, 1.81808886167143
出来ました。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170506

GSL Shell:非線形1変数方程式の求解モジュール自作

2017-06-21 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-06-19)の記事「GSL Shell 学習:Solve(Findroot)」では、
  ・・・・・
  ・・・・・
  つまり、
    求めたい方程式と、それの導関数と、初期推定値(1つ)
  で始まり、
    漸化式を順次計算し、収束を判定して、
  終了する。
  ・・・・・
  ・・・・・
と云ったソルバーのコードが出来た。


そこで、
若干の改良を加えて、モジュール化してみた。


改良点は:
 解きたい方程式と、初期推定値のみを与えて、
 導関数は、モジュール内部で 差分による近似で置き換える。
と云うもの。
序でに、反復回数も見える化してみた。

で、
(仮称だが)NL_solve_1var.luaモジュールは:
----- NL_solve_1var.lua -----
local M = {}

function M.solve(f,i)
local delta = 10^-8
local df = |x| (f(x+delta)-f(x))/delta -- 導関数の代わり
local x = i; local x2, nn
for n=1,100 do
x2 = x - f(x) / df(x)
if math.abs(x2-x) < delta then break end -- 収束判定
x = x2; nn = n
end
return x, nn -- 戻り値は、解と反復回数?
end

return M
で良い?
反復回数は、最大 100 回で十分だと思う。
収束判定用の微少値は 10^-8 で十分ダ。

このモジュールを使うテストメイン:
----- test_Main_NL_solve_1var.gsl -----
f = |x| math.cos(x) - x -- 対象関数
x = 2 -- 初期推定値
----------------------------
NL = require'NL_solve_1var'
x, n = NL.solve( f, x ) -- 求めた根 と、反復回数

print( n, x ) -- 3, 0.73908513321985
これで?
OKですネ。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170507,10

GSL Shell 学習:Solve(Findroot)

2017-06-19 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
2年前(2015-11-27)の記事「Python 学習:scipy.optimize.fsolve」では、
機能豊富な Python の、scipy.optimize.fsolve を使って、
  2*cos(x)-exp(x)=0
なる、非線形方程式の数値解(根?)を求めるコトが出来た。

これでは、
対象とする式の定義と、根の初期推定値(1つ)を与える。


これまでで、GSL Shell ( Lua ) で出来たのは、
Lua Solve」の如く、

1.上記の Python モジュールを(LuaPy経由で)使う

2.昨年6月(2016-06-24)の記事「SciLua:Solve」方式

3.昨年7月(2016-07-06)の記事「Solve:二分法」方式


今回、GSL Shell ( Lua ) から直接、
scipy.optimize.fsolve 相当の方式が出来ないか?

探してみたがなさそう。


そこで、
ソルバーを自作するとして、アルゴリズムを検索してみた。

“Qiita”の「ニュートン法とは何か??ニュートン法で解く方程式の近似解

“講義資料”「非線型方程式の数値計算法
等々が見つかる。

“講義資料”の“3 二分法(bisection method)”じゃなくて、
4 ニュートン法(Newton's method)”を使ってみた。

キモは、資料の 式(13) ですね。

  ・・・・・
  ・・・・・
  となる。
  これで,x_i から x_{i+1} が計算できる.これをニュートン法の漸化式と言う.
  この漸化式を用いれば,次々とより精度の良い近似解を求めることができる.
  計算の終了は,
  ・・・・・
  ・・・・・


つまり、

  求めたい方程式と、それの導関数と、初期推定値(1つ)

で始まり、

  漸化式を順次計算し、収束を判定して、

終了する。

と云うこと。


それで、
昨年6月(2016-06-24)の記事で書いた式:
----- 以上省略 -----
------------------------------------------
----- おまけに、一寸複雑(?)な式

function g(x) return math.cos(x)-x end

x = root.ridders( g, 0, 1.5, stp )
print( x ) -----> 0.73908513026639
に対して、
コーディングしてみた。
----- test_blog_2355.gsl
g = |x| math.cos(x) - x -- 対象方程式
dg= |x| -math.sin(x) - 1 -- 導関数
x = 1.5 -- 初期推定値
-------------- 反復処理
while true do
x2 = x - g(x) / dg(x) -- 上記の式(13)
if math.abs(x2-x) < 10^-8 then break end -- 収束判定
x = x2
end
----- 解:
print( x ) -----> 0.73908513321516
出来ました。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170506

gnuplot 学習:PDF出力で replot したら

2017-06-17 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
昨年末(2016-12-12)の記事「Lua & gnuplot : gnuplot モジュール初版」で書いた、
自作“gnuplot”モジュールを使って、
グラフの重ね書きを行っていたら、・・・・・

例えば、
sin関数とcos関数の重ね書きで、
gp=require'gnuplot'
gp.Pdf('test.pdf')
gp.Plot('sin(x)')
gp.RePlot('cos(x)')
としたら、
1ページ目にはsin関数のみのもので、
2ページ目にsin関数とcos関数の重ね書きとなった?

これは、何故???

その場での画面表示や、('plt')ファイル出力では
重ね書きグラフ1つのみ。


暫く悩んでいた。


これは、
時間経過で、本当は2つ出ているのだが、
目には見えなかったダケ?
それが、PDF文書で見えるようになった
と云うこと???

つまり、<紙>が
replotコマンドの仕様を良く理解していなかったダケ?

gp=require'gnuplot'
gp.Pdf('test.pdf')
gp.Plot( 'sin(x) , cos(x)' )
とするべきだった。
それだけの話し!


このことは、
“Qiita”の「gnuplotのreplotの仕様と落とし穴(?)
に載っていた。

  ・・・・・
  ・・・・・
  例えば、以下のコマンドを順に実行したとします。
plot sin(x)
replot cos(x)
  この場合は次のコマンドを順に実行していることになります。
plot sin(x)
plot sin(x),cos(x)
  ・・・・・
  ・・・・・

当該記事の

  落とし穴(実体験)
  以下、自分がつまずいた問題。
  例えば、・・・・・
  ・・・・・

とは異なりますが、
<紙>の場合は、
単純に、2つの“plot”が実行されるので、
PDF出力では、次のページになる。
と云うことでした。


今後、(PDF出力の場合は)
重ね書きは、1つの“plot”コマンドで行うことにしよう。


本日はここまで。


gnuplot 学習は続く。


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


170509(0425)

Lua ( GSL Shell ) / Penlight 学習:これは頂き

2017-06-16 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-06-14)の記事「Lua ( GSL Shell ) / Penlight 学習」では、

Lua 標準及び LFS で行っていること
に対応した処理を、Penlight を使って書いてみた。

ほぼ、1対1だった。

しかし、
LFS では機能が無い(?)ファイルのコピー:
  file.copy( src, dest [, flag ] ) -- flag==true 強制的 (default)
  dir.copyfile( src, dest [, flag ] )
を除いては、
Penlight の一部(少なくとも'path')は、LFS を使っているので、
LFS は不要に成らなかった。


その後、更に“file”、“dir”、“path”を学習した。

そして、“utils”モジュールには、面白いものがいろいろあった。
例えば、・・・・・

1.「printf」 ( fmt, ... )
   print an arbitrary number of arguments using a format.

2.「fprintf」( f, fmt, ... )
   write an arbitrary number of arguments to a file using a format.

3.「readfile」( filename [, is_bin ] )
   return the contents of a file as a string

4.「readlines」( filename )
   return the contents of a file as a list of lines


結果、
4月(2017-04-07)の記事「GSL Shell 学習:サブプログラムとしたいもの
で書いた、自前関数の幾つかは不要になる。

前回の (仮)k_SUBs.lua の一部抜粋:
----- ( k_SUBs.lua ) -----

--「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)
]]
以上は、

以下に示す如く、非常にシンプルにできる:
--------------------------

-- split 関数
require'pl'
utils.split( str, sep, plain, n )


-- フルパス名の分解 ( 前記の split_path 関数は、戻り値3つ )
require'pl'
p1 , p2 = path.splitpath( path ) -- 例えば、Q:\\ と file.ext
p4 , p3 = path.splitext( p2 ) -- ------ file と、ext


-- printf 関数 ( C言語流 )
require'pl'
utils.printf( fmt, ... )

utils.fprintf( f, fmt, ... )


-- テキストファイル全体を一括で(文字列として)読み込む:
wstr = file.read( IN_F )


-- テキストファイル全体を行毎の文字列配列で読み込む:
w =utile.readlines( IN_F )

-------------------------------------
-- 入力 Dir 内ファイル一覧(リスト)
require'pl'
IN_Flist = dir.getfiles( IN_Dir [, mask ] ); zz=#IN_Flist
-- mask を省略するか、'*' で全てのファイル( Dir は除外)

----------
-- 出力 Dir クリア/作成
require'pl'
dir.rmtree( OT_Dir ) -- remove a whole directory tree
dir.makepath( OT_Dir ) -- will create subdirectories as necessary!
以上でOKかナ?


本日はここまで。


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


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


170508,12

Lua ( GSL Shell ) / Penlight 学習

2017-06-14 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-06-12)の記事「Lua 学習:ファイルのコピー」では、
  “Penlight”には有用なものが多そう。
と書いた。

そこで、
Lua 標準及び LFS との比較で学習したことをまとめて見た。


Lua 標準及び LFS で行っていること:
lfs=require'lfs'  -- これ前提で

--- ファイル対象:

-- 削除
os.remove( filename )

-- 移動(名前変更)
os.rename( oldname, newname )

-- コピー
----- 無し

-- 属性取得
lfs.attributes( filepath [, aname | atable] )


--- ディレクトリ対象:

-- cwd 取得
lfs.currentdir()

-- cwd 変更
lfs.chdir( path )

-- 作成
lfs.mkdir( dirname )

-- 削除 ( 但し空のもの )
lfs.rmdir( dirname )

これに対して、Penlight では:
require'pl'  -- これ前提で

--- ファイル対象:

-- 削除
file.delete( path )

-- 移動(名前変更)
file.move( src, dest )
dir.movefile( src, dest )

-- コピー
file.copy( src, dest [, flag ] ) -- flag==true 強制的 (default)
dir.copyfile( src, dest [, flag ] )

-- 属性取得
file.creation_time( path ) -- 作成日時
file.modified_time( path ) -- 更新日時
file.access_time( path ) -- アクセス日時


--- ディレクトリ対象:

-- cwd 取得
path,currentdir()

-- cwd 変更
path.chdir( path )

-- 作成
dir.makepath( dirname ) -- will create subdirectories as necessary!

-- 削除
dir.rmtree( fullpath ) -- remove a whole directory tree

以上、
Penlight の方が機能が多く、LFS は不要だ。 と思ったが、
Penlight の一部(少なくとも'path')は、LFS を使っている!


本日はここまで。


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


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


170506

Lua 学習:ファイルのコピー

2017-06-12 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
Lua には、os.rename ( モジュール? 関数? ) がある。

なので、ファイルの移動は、

  os.rename( 'X:hoge/a.txt' , 'Y:/hoge2/a.txt' )

で行える。

さらに、

  os.rename( 'X:hoge/a.txt' , 'Y:/hoge2/b.txt' )

だと、名前の変更も同時に行える。


さて、“ファイルのコピー”はどうする?

「Lua copy file」で検索してみた。

“GitHub”の「premake/premake-4.x/os.copyfile」が見つかる。
が、
os.copyfile は見つからない?
(少なくとも GSL Shell では)


他には、
“Penlight Documentation”の「pl.file」が見つかった。

これって、
昨年2月(2016-02-08)の記事「GSL Shell 学習:StringIO」で書いた、
Penlight」の内の1つ。

使い方は、
require'pl';   utils.import 'pl.file'
copy( 'X:hoge/a.txt' , 'Y:/hoge2/b.txt' )
で行けそう。


これは便利ダ

この際、“Penlight”を導入しよう。

stevedonovan/Penlight」ページの右の方にある、
緑色の「Clone or download」ボタンをクリックし、
「Download ZIP」をクリック。

これで、
「Penlight-master.zip」 2016/01/01 付 239KB
がダウンロードできる。

書庫内の /Penlight-master/lua/pl フォルダ以下丸ごと 39 ファイルを、
GSL Shell に格納した:D:/TOOL/Lua/gsl-shell/gsl-shell/pl/ ここに 39 こ

これで、以前の“stringio.lua”はイラナイ(消した)。


それで、使い方としては、
require'pl';   utils.import 'pl.file'
copy( 'X:hoge/a.txt' , 'Y:/hoge2/b.txt' )
file=require'pl.file'
file.copy( 'X:hoge/a.txt' , 'Y:/hoge2/b.txt' )
require'pl'
file.copy( 'X:hoge/a.txt' , 'Y:/hoge2/b.txt' )
等々で行ける。

<紙>としては、
3番目の方法が、記述文字数が少なく且つ理解し易い。


他にも、“Penlight”には有用なものが多そう。

因みに、
ドキュメントのPurposeの書き出しは、

  It is often said of Lua that it does not include batteries.
  That is because the goal of Lua is to produce a lean expressive language
  that will be used on all sorts of machines,
   (some of which don't even have hierarchical filesystems).
  The Lua language is the equivalent of an operating system kernel;
  the creators of Lua do not see it as their responsibility to create
   a full software ecosystem around the language.
  That is the role of the community.

=== ( Google 翻訳 )

  Luaには電池が含まれていないことがよくあります。
  これは、Luaの目的は、すべての種類のマシン
   (階層的ファイルシステムを持たないものもあります)で使用される、
   細身の表現言語を生成することにあります。
  Lua言語は、オペレーティングシステムのカーネルに相当します。
  Luaのクリエイターは、言語の周りに完全なソフトウェアエコシステムを
   構築する責任としては見ません。
  それがコミュニティの役割です。

=== 余計分からない???

これではどうか?

(ダウンロードしたページのはじめににある説明)

  A set of pure Lua libraries focusing on input data handling
   (such as reading configuration files),
  functional programming
   (such as map, reduce, placeholder expressions,etc),
  and OS path management.
  Much of the functionality is inspired by the Python standard libraries.

=== ( Google 翻訳 )

  入力データ処理(構成ファイルの読み込みなど)、
  関数プログラミング(マップ、縮小、プレースホルダー式など)、
  およびOSパス管理に焦点を当てた純粋なLuaライブラリのセット。
  この機能の多くは、Pythonの標準ライブラリに触発されています。

=== かなり分かり易いカナ?


本日はここまで。


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


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


170506(160611)

Lua 学習:wget & nkf

2017-06-10 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-06-09)の記事「Wget for Windows:クッキー使えた」で書いた如く、
今後の、Web アクセスは wget だ。


それで、Lua ( GSL Shell ) で使うには、
---- test.gsl
os.execute( 'wget http://jn1inl.blog77.fc2.com/ -O kami.html' )
-----

IN=io.open('kami.html'); wstr=IN:read('*a'); IN:close()

----- wstr に対して、処理

と云った感じ。


だが、1つ問題がある。

つまり、'kami.html' ファイルの文字コードが 'UTF-8' である事ダ!
なので、
Lua では、英数字に対してはOKだが、日本語がダメ。

例えば、
  string.find( wstr, '<紙>' )
では、見つからない


・・・・・


2年前(2015-11-15)の記事「Python 学習:nkf 利用」を思い出した。

nkf.exe1つで使える。

なので、
上記コードを書き換えた:
---- test.gsl
os.execute( 'wget http://jn1inl.blog77.fc2.com/ -O kami.html' )
-----
os.execute( 'nkf -s kami.html > kami.txt' )

IN=io.open('kami.txt'); wstr=IN:read('*a'); IN:close()

----- wstr に対して、処理

これで、日本語文字でも扱える。


但し、
string.find()、や string.sub() などを使うとき、
日本語文字は2バイトである ことに留意する必要がある。

これで、完璧???


本日はここまで。


GSL Shell で、Wget for Windows 学習は続く。


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


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



おきてがみ

最新記事
カレンダー
05 | 2017/06 | 07
- - - - 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
ブックマーク