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

Wget for Windows:クッキー使えた

2017-06-09 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-06-07)の記事「GNU Wget - Wget for Windows」で導入した、
wget でログインが必要なページの読込にチャレンジ。

先ずは、
「Windows wget クッキー」で検索。

やはり、“Quiita”か:
wgetでログイン認証の先のページを落とす

  BASIC認証じゃなくて、普通にphpでログインとかの場合。

  一旦クッキーを取得しておく。

  そしたら落としたいページを指定。

と云うことで、やってみた。

wget --keep-session-cookies --save-cookies cookies.txt --post-data "email=aredayo&pass=naiyo" https://secure.id.fc2.com/index.php?mode=login&switch_language=ja
wget --load-cookies cookies.txt http://panel.counter1.fc2.com/counter_select.php?login=00000000 -O FC2blogCount.html
こんな感じ?
但し、参照したページにあった
オプション「 -r -k -E 」ではダウンロードが延々と続いたので外した。

出来ました。



これで、
Wget for Windows 1本で行く。と決めた。
( wget.exe 1つで十分だし )


本日はここまで。


Wget for Windows 学習は続く。


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


170503

GNU Wget - Wget for Windows

2017-06-07 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
先日(2017-06-03)の記事「cURL 学習:クッキーの扱い(分からない)」で、
悩んでいたが、・・・・・

ハタと気が付いた:
“curl”は、Linuxのコマンドにある。
・・・「ITpro」の「Linuxコマンド集」:
   「【curl】ファイルのダウンロードやアップロードを行う
そうすると、もう1つ“Linuxコマンド”があった。
・・・「Linuxコマンド集」:
   「【 wget 】ファイルをダウンロードする

そこで、
「Windows wget」で検索してみた。

“Qiita”の「Windowsでwgetする色々な方法

“アシマネくんのほんわか日記”の「Windows版 wgetをインストールしよう

そして、本家?
“GnuWin32”の「Wget for Windows

等々が見つかる。


「Wget for Windows - GnuWin32」の、
Homepage」にある、
  Downloading GNU Wget
を見に行った、・・・・・
最新版は、「wget-1.19.tar.gz」か「wget-1.19.tar.xz」???

それで、「Wget for Windows」で検索したら、
“eternallybored.org”の
GNU Wget 1.19.1 for Windows」が見つかる。

ここでは、最新版(1.19.1)の32-bit binary は2種類:
  ・wget-1.19.1-win32.zip
  ・wget.exe

そこで、
 「wget-1.19.1-win32.zip」 2017/02/25 付 1.74MB
をダウンロードした。


実質、
 「wget.exe」 3.32MB
1つですネ。


適当な場所に「wget.exe」を取り出し、
コマンドプロンプトで、

  wget http://jn1inl.blog77.fc2.com/ -O kami.html

と打ち込むと、読み込めた!


改めて、導入した:

フォルダを作り:D:/TOOL/wget4Win/
そこに、(取り敢えず)展開結果の5つを格納。
そして、
'PATH' に登録:D:\TOOL\wget4Win


これで、
LuaSocket

cURL
もヤメテ、
Wget for Windows 1本で行く?


本日はここまで。


Wget for Windows 学習は続く。


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


170503

Lua 学習 : os.date と lfs.attributes

2017-06-05 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
昨年11月(2016-11-11)の記事「Lua 学習:ファイル存在確認」で書いている、
“LFS ( LuaFileSystem )”の、“lfs.attributes”関数で、
ファイルの更新日付等々が得られる。

-- f : 対象ファイル名
mt = lfs.attributes( f, 'modification' )
print( mt )
とやってみた。

mt は、1433217246 の様な数値!


これは、
昨年末(2016-12-19)の記事「Kinza のブックマーク・データ」で書いている、
  Firefox では、 ADD_DATE="1472162037"
に相当する。


つまり、
UNIX時間”(即ち) 秒数で表した時刻
ですね。

これは、os.date 関数で変換できたのですネ。
DT = os.date( '%Y/%m/%d %H:%M:%S', mt )
print( DT )
としたら、

DT は、2015/06/02 12:54:06

の様に ( ローカル時刻で ) 表示された。


ここで、
n を時刻じゃなく時間として、
0 ~ 60*60-1 のとき、

  os.date( '%M:%S', n )

の結果は、
キッチリ した値になる。

では、

  os.date( '%H:%M:%S', n )

では、
9時間異なる。

つまり、ローカル時間だから?


ここで、学習したこと。

  os.date( '!%H:%M:%S', n )

とすると、local timeじゃなくてUTCになる。

なので、
n が、0 ~ 60*60*24-1 まで、キッチリ した値が得られる。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170502

cURL 学習:クッキーの扱い(分からない)

2017-06-03 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-06-02)の記事「cURL : command line tool and library for ・・・」の後、

俺的備忘録 ~なんかいろいろ~
の、

  11.Cookieを用いてログイン情報を保存する

  curlで、Cookieを用いてログイン情報を保存し、
  その後認証が必要なページにアクセスする場合は、
  以下のようにログイン情報を転送する。
  ・・・・・
  ・・・・・

とか、

「curl クッキー ファイル」検索で見つけた:
curl コマンドでリダイレクト時にcookie の維持

  ・cookieを使ってコンテンツ取得

  ・サーバーから発行されたcookieを保存

  ・HTTP 302 Found のリダイレクトに対応する

などを、
頑張って学習しているが、・・・・・

目的のページを取得することが出来ない???


出直しが必要ダ。


もっと学習します。


本日はここまで。


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


170428

cURL : command line tool and library for transferring ・・・

2017-06-02 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
昨年末(2016-12-21)の記事「Lua で Web アクセス」で書いた如く、
LuaSocket を導入したが、純粋なLua の、Ver.5.1 向け?
苦労した結果、
続く記事「GSL Shell で Web アクセス」で書いた如く、
何とか、Perl における「LWP::Simple」に相当することは出来た。
しかし、ログインを必要とする様な事を行う方法が分からない。


「Lua http login」で検索してみたところ、・・・
“スタック・オーバーフロー”の
simulation login using lua」が見つかった。

そこの回答にある方法で試してみたが、・・・
クッキーの扱いが分からない?


ならば、C言語ではどうか?
「gcc Webページ 読み込み」で検索したら、・・・

“mk-mode BLOG”の
C++ & cURL で Web スクレイピング!」が見つかった。

記事の初めの部分に、
  cURL(HTTPやFTPでデータのやり取りをするライブラリ)
と云う記述がある。

cURL って???

“ウィキペディア”の記事:「cURL」には、

  対応OS : クロスプラットフォーム

とあるので、
「cURL Windows」で検索した。

“いろいろやってみるにっき”の
WindowsにcURLコマンドを入れて動作確認する
を見つけた。

「CURL.exe」、「LIBCURL.DLL」など4ファイル。
でOK?


早速、ダウンロード。
本家サイト:「curl and libcurl」の
ダウンロードページ」の下の方にある、
  Win32 - Generic
から、
  Win32 7zip 7.54.0 binary SSL SSH (Viktor Szakats) 1.67 MB
つまり、
  「curl-7.54.0-win32-mingw.7z」
をダウンロードした。
展開すると、“bin”フォルダ等4つと、11ファイル。

で、“bin”フォルダには、
「curl.exe」、「libcurl.dll」とあと1つ。
多分2つさえあれば使える?

取り敢えず、展開した全部を、「D:/TOOL/cURL/」に置き、
そして、 'PATH' に 'D:\TOOL\cURL\bin' を登録した。


そして、手始めに、
GSL Shell で Web アクセス」で書いた:
http = require'socket.http'
ltn12 = require'ltn12'
http.request{ url='http://jn1inl.blog77.fc2.com/', sink=ltn12.sink.file(io.open('kami.html','wb')) }
相当をコード化して見た ( GSL Shell で )
os.execute( 'curl http://jn1inl.blog77.fc2.com/ > kami.html' )
この1行!

これは便利ダ!


もっと学習してみよう。


本日はここまで。


cURL 学習は続く。


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


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