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

SpiderMonkey 学習:再入門

2017-03-30 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-29)の記事「js-ctypes 学習:IUP でドラッグ&ドロップ」までで、
js-ctypes 学習がそれなりに進んだ。

改めて、
MDN > 開発者向けのWeb技術 > JavaScript > JavaScript ガイド
の、文法とデータ型
  本章では JavaScript の基本構文、変数宣言、データ型と
  リテラルについて説明します。
で学習した。


1.console.log() 関数がある。

  This function is an alias of the print() function.


2.コマンド起動時引数:

  以前の Ver.1.8.5 では、arguments だったが、
  今の Ver.54.0a1 では、scriptArgs

  これは、配列もどき?
  scriptArgs.length とか、scriptArgs[0] とか


3.サブの JavaScript ファイル( SUB.js )を起動できる:

   run( 'SUB.js' );
  これは、
   load( 'SUB.js' );
  と一緒???

  でも、どんなファイルでも出来るわけではない。


4.eval() 関数がある:

   d = eval( 'a=2; b=5; c=(a+b)/2; print(c*3)' ); // print までOK
   print( a, b, c, d ); // d はundefined
  続けて、
   d = eval( 'a*5.4' );
   print( a, d ); // d は正しく 10.8

  eval() は、evaluate() でも一緒。



本日はここまで。


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


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


170226

js-ctypes 学習:IUP でドラッグ&ドロップ

2017-03-29 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-27)の記事「js-ctypes 学習:IUP - Portable User Interface」に続いて、
今度は、
IUPでのドラッグ&ドロップ・コールバック処理
に挑戦。

具体的には、
昨年3月(2016-03-19)の記事「GSL Shell 学習:IUP でドラッグ&ドロップ
に載せたコードをSpiderMonkeyに移植。


出来たコードは:
// ===== convert to '.js' =====
 var WinABI = ctypes.winapi_abi; var CBABI = ctypes.stdcall_abi;
 var VOID = ctypes.void_t; var VoidA = ctypes.voidptr_t;
 var Char = ctypes.char; var CharA = Char.ptr;
 var Uint8 = ctypes.uint8_t; var Byte = Uint8;
 var WORD = ctypes.uint16_t; var DWORD = ctypes.uint32_t;
 var Int32 = ctypes.int32_t;
 var Float = ctypes.float32_t; var Double = ctypes.float64_t;
 var HANDLE = ctypes.size_t; var HWND = HANDLE; var hWnd = HANDLE;
 var BOOL = ctypes.bool;
 var LPARAM = ctypes.size_t; var LPTSTR = ctypes.jschar.ptr;
var Cast = ctypes.cast;
var lib = ctypes.open( 'iup' );

var CB_DnD = ctypes.FunctionType( CBABI, VOID, [ HANDLE, CharA, Int32, Int32, Int32 ] );

var IupOpen = lib.declare( 'IupOpen', WinABI, VOID, Int32 );
var IupClose = lib.declare( 'IupClose', WinABI, VOID );
var IupDialog = lib.declare( 'IupDialog', WinABI, HANDLE, HANDLE );
var IupSetAttributes = lib.declare( 'IupSetAttributes', WinABI, VOID, HANDLE, CharA );
var IupSetCallback = lib.declare( 'IupSetCallback', WinABI, VOID, HANDLE, CharA, CB_DnD.ptr );
var IupPopup = lib.declare( 'IupPopup', WinABI, VOID, HANDLE, Int32, Int32 );

IupOpen( 0 ); // ----- これ必須!!!

function onDnD( Z, F, n, x, y ){
print( Z, n, x, y ); // -------- 数値, 0, x, y
fname = F.readString() // ----- 日本語含むとダメ???
IupClose()
}
var fname;
var dlg = IupDialog( 0 ) // -- 枠だけ
IupSetAttributes( dlg, '"SIZE"="160x120", "TITLE"="DnD here"' )
IupSetCallback( dlg, 'DROPFILES_CB', CB_DnD.ptr(onDnD) )
IupPopup( dlg, 100, 100 )
// -----------------
print( fname ); // -- これで フルパス:「\」セパレート
print( fname.split( '\\' ).slice( 0, -1 ).join( '\\' ) ); // folder 部分
print( fname.split( '\\' ).slice( -1 ) ); // ファイル名部分
var _ = readline();
こんな感じ?

これで、
D&Dでファイル名を得ることが出来る。


関連して今回学習したこと:

1.SpiderMonkey の変数名では、アンダーバー1文字でも可

2.GSL Shell の時、void* で定義していた IupDialog の引数を、
  正しく(?) HANDLE で定義すると利用時がスッキリする。

3.[char*].readString() では、日本語文字がダメ???



本日はここまで。


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


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


170225

js-ctypes 学習:IUP - Portable User Interface

2017-03-27 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-26)の記事「js-ctypes 学習:OpenCV のマウスコールバック処理
に続いて、
今度は、
GSL Shell では
昨年3月(2016-03-13)の記事「GSL Shell 学習:IUP - Portable User Interface」で書いた、
 Lua で GUI アプリを作成するためのクロス プラットフォーム キットIUP
に挑戦。
つまり、
ブログ記事に載せたコードをSpiderMonkeyに移植。


出来たコードは:
// ===== convert to '.js' =====
var VOID = ctypes.void_t; var VoidA = ctypes.voidptr_t;
var Char = ctypes.char; var CharA = Char.ptr
var Int32 = ctypes.int32_t;
var WinABI = ctypes.winapi_abi;

var lib = ctypes.open( 'iup' );

var IupOpen = lib.declare( 'IupOpen', WinABI, VOID, Int32 );
var IupMessage = lib.declare( 'IupMessage', WinABI, VOID, CharA, CharA );
var IupFileDlg = lib.declare( 'IupFileDlg', WinABI, VoidA );
var IupSetAttributes = lib.declare( 'IupSetAttributes', WinABI, VOID, VoidA, CharA );
var IupPopup = lib.declare( 'IupPopup', WinABI, VOID, VoidA, Int32, Int32 );
IupOpen( 0 ); // ----- これ必須!!!

IupMessage( 'test', 'OK?' ); // -- IupMessageDlg のテスト

var filedlg = IupFileDlg(); // -- IupFileDlg のテスト
IupSetAttributes( filedlg, 'DIALOGTYPE = LOAD, TITLE = "File Load"' );
IupSetAttributes( filedlg, 'FILTER = "*.png", FILTERINFO = "PNG Files"' );

IupPopup( filedlg, 0, 0 )
こんな感じ?

なんとか動いた。


本日はここまで。


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


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


170224

js-ctypes 学習:OpenCV のマウスコールバック処理

2017-03-26 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-25)の記事「js-ctypes 学習:KWF_list 関数」で、
Win32API でのコールバック処理の実用的(?)なコードが作れた。

そこで、
先日(2017-03-19)の記事「js-ctypes 学習:cast そして OpenCV」で学習した、
画像処理の決定版(?)OpenCVに依る画像表示窓での
マウスイベントコールバック処理に挑戦。


プログラム内で指定した画像ファイルを読み込んで窓に表示。
この窓内でマウス(カーソル)を移動させたイベントを、
コールバック関数でそのカーソル位置を表示する。

と云ったもの。

出来たコードは:
// ===== mouseCB_CV.js =====
var VOID = ctypes.void_t; var Cast = ctypes.cast;
var Byte = ctypes.uint8_t; var Char = ctypes.char;
var DWORD = ctypes.uint32_t; var Int32 = ctypes.int32_t;
var CBABI = ctypes.stdcall_abi; var WinABI = ctypes.winapi_abi;

var lib = ctypes.open( 'opencv_world300' );

var CvMat = new ctypes.StructType( 'tagCvMat', [
{ 'type': DWORD }, { 'step': DWORD }, { 'refc': DWORD }, { 'hdrr': DWORD },
{ 'data': Byte.ptr }, { 'yy': Int32 }, { 'xx': Int32 } ]);

var CB_mouse = ctypes.FunctionType( CBABI, VOID, [ Int32, Int32, Int32, Int32 ] );

var cvLoadImageM = lib.declare( 'cvLoadImageM', WinABI, CvMat.ptr, Char.ptr, Int32 );
var cvNamedWindow= lib.declare( 'cvNamedWindow', WinABI, Int32, Char.ptr, Int32 );
var cvShowImage = lib.declare( 'cvShowImage', WinABI, VOID, Char.ptr, CvMat.ptr );
var cvWaitKey = lib.declare( 'cvWaitKey', WinABI, Int32, Int32 );
var cvDestroyAllWindows= lib.declare( 'cvDestroyAllWindows', WinABI, VOID );
var cvSetMouseCallback= lib.declare( 'cvSetMouseCallback', WinABI, VOID, Char.ptr, CB_mouse.ptr );

// ====================================
var fname = 'hogehoge.png'
var img = Cast( cvLoadImageM( fname, 0 ), CvMat.ptr ).contents;
var xx=img.xx; var yy=img.yy; var sz = xx * yy;

var BT = Cast( img.data, Byte.array(sz).ptr).contents;

function onmouse( event, x, y, flag ){
if( event == 0 ){ // 0 == cv2.EVENT_MOUSEMOVE
print( event, x, y, flag );
}
}

cvNamedWindow( 'img', 0 );
cvSetMouseCallback( 'img', CB_mouse.ptr(onmouse) );

while( true ){
cvShowImage( 'img', img.address() )
var k = cvWaitKey(50) & 0xFF;
if( k == 27 ){ break; } // esc to exit
}

cvDestroyAllWindows();
lib.close();
こんな感じ?

出来ました。

但し、
マウスを動かす毎にコンソール窓にダラダラ表示されるが。
未だ、学習の身なのでヨシとしよう。


本日はここまで。


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


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


170221

js-ctypes 学習:KWF_list 関数

2017-03-25 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-24)の記事「js-ctypes 学習:コールバック処理」で、
コールバック処理コード
及び、
typedefに相当することや関数の別名定義
を学習した。

題材が、'EnumWindows' だったので、・・・・・

昨年(2016-08-01)の記事「KWF (kami's Window Functions) モジュール」で書いた、
“KWF.lua”モジュールの“KWF.List()”関数相当品を作ってみた。
ほぼ、1体1対応のコードで作れた:
/***** CB_EnumWin_KWF.js *****/
var lib = ctypes.open( 'user32.dll' );

var DWORD = ctypes.uint32_t; var Int32 = ctypes.int32_t;
var HANDLE = ctypes.size_t; var BOOL = ctypes.bool;
var LPARAM = ctypes.size_t; var LPTSTR = ctypes.jschar.ptr;
var CBABI = ctypes.stdcall_abi; var WinABI = ctypes.winapi_abi;
var ArrayT = ctypes.ArrayType; var Cast = ctypes.cast;
/// -----------------------------

var CB_EnumWin = ctypes.FunctionType( CBABI, BOOL, [ HANDLE, LPARAM ] );
var EnumWindows = lib.declare( 'EnumWindows', WinABI, BOOL, CB_EnumWin.ptr, LPARAM );

var IsWindowVisible = lib.declare( 'IsWindowVisible', WinABI, BOOL, HANDLE );
var GetWindowLongA = lib.declare( 'GetWindowLongA', WinABI, Int32, HANDLE, Int32 );
var GetWindowTextW = lib.declare( 'GetWindowTextW', WinABI, Int32, HANDLE, LPTSTR, Int32 );
var GetWindowThreadProcessId = lib.declare('GetWindowThreadProcessId', WinABI, DWORD,
HANDLE, DWORD.ptr );
// ------- 以上宣言部 、以下が関数 -----
function KWF_List(){
var Wcnt = 0; var pIDT = new Array();
var PID = new DWORD; var wnd = LPARAM(0);
var Buf = new new ArrayT( ctypes.jschar, 256 );

var CB_Proc = function( hwnd, l ){
if( IsWindowVisible( hwnd ) ){ // 先ずは、これで絞る。
var h = GetWindowLongA( hwnd, -8 ); // -8 == GWL_HWNDPARENT : 親Windowハンドル
if( h == 0 ){ // 自分が親か?
if( GetWindowTextW( hwnd, Buf, 255 ) > 0 ){
Txt = Buf.readString();
var thr = GetWindowThreadProcessId( hwnd, PID.address() );
pIDT[Wcnt] = new Array( hwnd, Txt, PID.value, thr );
Wcnt++;
}
}
}
return true; //let enum continue till nothing to enum
}

EnumWindows( CB_EnumWin.ptr( CB_Proc ), Cast( wnd.address(), LPARAM ) ); // これメイン
return pIDT;
}
/************* テスト・メイン *********/
var pIDT = KWF_List(); /* ここから開始 */
Wcnt = pIDT.length; print( Wcnt );
for( k=0; k var WinH=pIDT[k][0]; var Txt=pIDT[k][1]; var PID=pIDT[k][2]; var thrd=pIDT[k][3];
print( WinH.toString(16), PID, thrd, Txt );
}
lib.close();
var str = readline();
結果は、以上。
ここで、
テストしていて、
'GetWindowTextA' ではダメだったので 'GetWindowTextW' に代えた。
これでも、まだ日本語のテキストは正しく出ない???


本日はここまで。


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


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


170219

js-ctypes 学習:コールバック処理

2017-03-24 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-22)の記事「SpiderMonkey:バージョンアップ」で、
SpiderMonkey 54.0a1 にバージョンアップした。

それで、js-ctypes 学習を継続。

今回は、コールバック処理のコーディング。

それには、昨年6月、7月、8月の記事で出てくる、
EnumWindows”が最適。
何か良い例が無いか? 探してみた。


Standard OS Libraries」ページには、
  ・・・・・
  ・・・・・
  Windows
  ・・・・・
  ・・・・・
  WinAPI
  ・・・・・
  ・・・・・
  Resources for WinAPI
  ・ GitHubGISTS :: Noitidart / Search・winapi
    - WinAPI js-ctypes snippets that can be copied and ・・・
  ・・・・・
  ・・・・・
とあるので、見に行った。

  We've found 46 gist results

と云うことで、この中にはどうか?


ありました:2ページ目の7番目(17/46 ですね)
  Noitidart / _ff-addon-snippet-WINAPI_GetRunningPids.js”
これが正に欲しいもの。

このコードを“View”ボタンクリックで表示して、
コピー&ペースト。
(ファイルのコードは 'UTF-8' として)
Cu.import(~) と、console.time(~) は、コメント・アウトし、
console.log(~) は、print(~) に変更した。
これで、動作した。

このコードは、“GSL Shell”での、
昨年6月(2016-06-25)の記事「ウィンドウ・ハンドルの取得」に近い???

このコードからコールバック処理以外も学習。

typedefの様な abbreviation 定義が出来る
しかも関数についても別名を定義できる。


そこで、<紙>流に分かり易く(?)書き直してみた:
// ===== sample_CB_EnumWindows.js =====
var lib = ctypes.open( 'user32.dll' );

/********* この様な abbreviation 定義が出来る ******/
var DWORD = ctypes.uint32_t; var HANDLE = ctypes.size_t;
var HWND = HANDLE; var BOOL = ctypes.bool;
var LPARAM = ctypes.size_t; var LPTSTR = ctypes.jschar.ptr;
var CBABI = ctypes.stdcall_abi; var WinABI = ctypes.winapi_abi;
var arrayT = ctypes.ArrayType; var Cast = ctypes.cast; /* 関数もOK */

var E_WinProc = ctypes.FunctionType( CBABI, BOOL, [HWND, LPARAM] ); /* CB 関数型宣言 */

var E_Win = lib.declare( 'EnumWindows', WinABI, BOOL, E_WinProc.ptr, LPARAM );
var GetClassNm = lib.declare('GetClassNameW', WinABI, ctypes.int, HWND, LPTSTR, ctypes.int);

var GetWin_Th_ProcId = lib.declare('GetWindowThreadProcessId', ctypes.winapi_abi,
DWORD, HWND, ctypes.uint32_t.ptr ); // ctypes.uint32_t.ptr == LPDWORD

// ------------------
function getRunningPids(){ //returns array of pids of running firefox instances
var ffPids = {};
var PID = new DWORD;
var buf = new new arrayT( ctypes.jschar, 255 );

var SearchPD = function( hwnd, lParam ){
GetClassNm( hwnd, buf, 255 );
var className = buf.readString();
if (className == 'MozillaWindowClass'){
var rez = GetWin_Th_ProcId( hwnd, PID.address() );
ffPids[PID.value] = 0;
};
return true; //let enum continue till nothing to enum
}
var SearchPD_ptr = E_WinProc.ptr( SearchPD );
var wnd = LPARAM(0);
E_Win( SearchPD_ptr, Cast( wnd.address(), LPARAM ) ); /* これが CB のサンプル */
return Object.keys( ffPids );
}

var pids = getRunningPids(); /*** 開始 ***/
print( 'pids:', pids , pids.length );

lib.close();
var str = readline();
Callback 処理はこの様なコードで!


本日はここまで。


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


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


170218

SpiderMonkey:バージョンアップ

2017-03-22 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
先日(2017-03-08)の記事「JavaScript:SpiderMonkey で行く」では、
4年前(2013-12-15)の記事「SpiderMonkey:JavaScriptインタプリタ」で書いた、
SpiderMonkey Ver 1.6 から、Ver 1.8.5 にアップした。
  Ver 1.6 に比べて、約3倍速?
  WSH の JScript に比べて2.4倍速?
そうは云っても、まだまだ遅いもの。

だが、
js-ctypes なる機能があり:「SpiderMonkey 学習:js-ctypes 入門
非常に気に入っている。

本来の JavaScript の機能には<紙>的には満足している訳では無いが、
気に入っている js-ctypes について、ここまである程度学習した。

後は、処理速度の問題。

現在は、SpiderMonkey 38 ?:SpiderMonkey
いや、SpiderMonkey 45 ?:SpiderMonkey releases

Just-In-Time compiler が目に入った:Internals

どの位速くなるのか?

何とか新しいものを手に入れることが出来ないか???
或いは、自分でビルド出来ないか???


SpiderMonkey Windows binary」検索で、

Qiita の「windows上でSpiderMonkeyコマンドライン環境を構築」を見つけた。
  ソースからコンパイルするのではなく、バイナリを落とせばOK。
  の筈だったのですが、ちょっとはまったのでメモしておきます。

  基本的なやり方はここに書いてあります。
  ・・・・・
  ・・・・・
  1.<URL>(リンク)
  から
  jsshell-win32.zipまたはjsshell-win64-x86_64.zipをダウンロードする。

  2.展開してjs.exeを実行する

  でOKの筈だったのですが、・・・・・
  ・・・・・
  ・・・・・

これは、どうか?

だが、上記リンクは txt ファイル1つ:
  This directory is no longer in use. Please use
   <URL>
  instead.

ダメだ。

そこで、
jsshell-win32」検索を行った。

Directory Listing: /pub/firefox/nightly/latest-mozilla-central/」を見つけた。

ここの下から3番目に、

  File jsshell-win32.zip(リンク)

があったので、
nightlyだけど、これをダウンロードした。

展開のみでOKダ。


早速、Ver.1.8.5 を展開したフォルダ:D:/TOOL/SpiderMonkey/
の3つの代わりに、
展開した、全46ファイルを置いた。
js.exe 以外は45ヶの DLL オンパレード。
バージョンは、54.0a1 進みすぎ!


それで、
例のフィボナッチ数計算のベンチマークでは、・・・

Ver.1.8.5 では、16.6 ~ 18.1 秒で、
GSL Shell の 0.74 秒 に比べて 22.5 ~ 24.4 倍遅い。
(因みに例のサイトには、SpiderMonkey(38.1) 0.537 秒 とある)

これが、なんと 0.408 秒となった。超超高速!!!


但し、
“.js”ファイルは“UTF-8”で保存すべし


これで、大満足? 十分満足? 可成り満足?


更なる、js-ctypes の学習に力が入る???


本日はここまで。


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


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


170217

js-ctypes 学習:msvcrt.dll 利用( fopen、_popen )

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

Win32API の“kernel32.dll”、“user32.dll”が使えたので、
今度は、Win32API の親戚?“msvcrt.dll”に挑戦。

msvcrt とは→CRT ライブラリの機能

このライブラリには、fopen とか、fread 関数等がある。

それで、主なもの4つを MSDN でチェックした:
FILE* fopen( const char* filename, const char* mode );
int fclose( FILE* stream );
size_t fread( void* buffer, size_t size, size_t count, FILE* stream );
size_t fwrite( const void* buffer, size_t size, size_t count, FILE* stream );
これらを使って、

先日(2017-03-12)の記事「js-ctypes 学習:文字列データの変換とファイル入出力
で書いた、“file_Wt.js”、“file_Rd.js”を書き換えてみた。

今回は1本のプログラムで、読み込みと書き出し:
// ----- file_IO_msvcrt.js -----
var libC = ctypes.open( 'msvcrt' );

var fopen = libC.declare( 'fopen', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.char.ptr );
var fclose = libC.declare( 'fclose', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.uint32_t );
var fread = libC.declare( 'fread', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.uint8_t.ptr, ctypes.int32_t, ctypes.int32_t , ctypes.uint32_t );
var fwrite = libC.declare( 'fwrite', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.int32_t, ctypes.int32_t , ctypes.uint32_t );
// ----------
var IN = fopen( 'yyy.txt', 'r' );
print( IN ); // 念の為

var Buf = ctypes.uint8_t.array(257)();
var SZ = fread( Buf, 1, 256, IN );
print( SZ ); // 確認
var str = Buf.readString();
print( str ); // JavaScript の文字列
// ----------
var OT = fopen( 'zzz.txt', 'w' );
print( OT ); // 念の為

var str = 'HOGEHOGE\nNew Line\n';
var SZ = fwrite( str, 1, str.length, OT );
print( SZ ); // 確認
// ----------
var ret = fclose( IN ); print( ret );
var ret = fclose( OT ); print( ret );

libC.close(); var str = readline();
こんな感じ


更に、msvcrt には、_popen 関数もあった。
そうすると、
昨年11月(2016-11-25)の記事「Lua から gnuplot 利用の方式」で書いた、
  ・・・・・
  ・・・・・
  即ち、
  一々「plt」ファイルを作ってからそれを実行する
  のでは無くて、
  即時に gnuplot を動かす。
  これは、
  GP = io.popen( 'gnuplot -persistent', 'w' )
  で、gnuplot をオープンして(立ち上げて)おいて、
  「plt」ファイルに書き込む様に、“GP”ファイルに書き込む。
  ・・・・・
  ・・・・・
この部分に対応して、
_popen”を使って、gnuplot が使える?

やってみた:
// ----- gnuplot_popen_msvcrt.js -----
var libC = ctypes.open( 'msvcrt' );

var popen = libC.declare( '_popen', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.char.ptr );
var fputs = libC.declare( 'fputs', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t );
var fclose = libC.declare( 'fclose', ctypes.winapi_abi, ctypes.int32_t,
ctypes.uint32_t );

var gp = popen( 'gnuplot -persistent', 'w' );
print( gp ); // 念の為

var ret = fputs( 'plot sin(x)\n', gp ); // ===== グラフ表示
print( ret ); // 念の為

var ret = fclose( gp );
libC.close(); var str = readline();
これでは、“fwrite”の代わりに“fputs”を使ってみた。
出来た。


やはり、Win32API 直接より、コーディングが楽?


本日はここまで。


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


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


170217

js-ctypes 学習:cast そして OpenCV

2017-03-19 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-18)の記事「js-ctypes 学習:外部プログラムの実行」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
Tipe casting ( 変換 )について学習。

js-ctypes のドキュメント:
MDN > Mozilla > js-ctypes > Using js-ctypes の、
Working with data」に、
  ・・・・・
  ・・・・・
  Type casting
  You can type cast data from one type to another
   by using the ctypes.cast() function:

  var newObj = ctypes.cast(origObj, newType);

  This will return a new object whose data block is shared
   with the original object, but whose type is newType.
  If the size of the new type is undefined or larger than
   the size of the original object's data block, TypeError is thrown.

  This works very much like a standard C type cast or C++ reinterpret_cast.

即ち(Google翻訳で)

  ctypes.cast()関数を使用すると、あるタイプから別のタイプへの
  キャストデータを入力できます。

  var newObj = ctypes.cast(origObj、newType);

  これは、元のオブジェクトとデータブロックが共有されているが、
  その型がnewTypeである新しいオブジェクトを返します。
  新しい型のサイズが未定義であるか、元のオブジェクトのデータブロックの
  サイズよりも大きい場合は、TypeErrorがスローされます。

  これは、標準のCタイプのキャストやC ++のreinterpret_castと
  非常によく似ています。

まあ、分かるかナ。

続けて、
  Example: Cast an array
  This example shows
  how to cast an array of a certain type to another type.
とある。

これで、学習した:
// バイト配列8要素、値格納:
var B = ctypes.uint8_t.array(8)( [8,7,6,5,4,3,2,1] );
print( B[6], B[7] ); // 念のための確認: 2, 1 最後の2要素

// 上記を、2バイト配列4要素に cast
var I = ctypes.cast( B.address(), ctypes.uint16_t.array(4).ptr).contents;
print( I[3] ); // 0x0102 == 258 で、OK
こんな風に。

更に、構造体への cast は?
// uint32_t 配列7要素、値格納:
var A = ctypes.uint32_t.array(7)( [7,6,5,4,3,2,1] );
print( B[6], B[7] ); // 念のための確認: 2, 1 最後の2要素

// 上記を、構造体に cast
var CvMat = new ctypes.StructType( 'CvMat', [
{ 'type': ctypes.int32_t }, { 'step': ctypes.int32_t },
{ 'refc': ctypes.int32_t }, { 'hdrr': ctypes.int32_t },
{ 'data': ctypes.uint8_t.ptr },
{ 'yy': ctypes.int32_t }, { 'xx': ctypes.int32_t } ]);
var K = ctypes.cast( A.address(), CvMat.ptr ).contents;
print( K.yy, K.xx ); // 2, 1 OK:これで行ける
つまり、要点は、“.contents”を付ける事?
この例は、OpenCV を使いたい為に選んだもの。


実は、今回の学習は、
昨年2月(2016-02-23)の記事「GSL Shell 学習:OpenCV 使えそうダ?」で書いた、
  「opencv_world300.dll」26.3MB 1つ。
この DLL を利用しようと、数日間悪戦苦闘していたことから始まった。

あれこれ悩み&検索していたが、
どうも、cast の問題の様なので、上記の例に至った。

と云うことで、
やってみた:
// ---------- test_OpenCV.js ----------
var lib = ctypes.open( 'opencv_world300' );
var CvMat = new ctypes.StructType( 'CvMat', [
{ 'type': ctypes.uint32_t }, { 'step': ctypes.uint32_t },
{ 'refc': ctypes.uint32_t }, { 'hdrr': ctypes.uint32_t },
{ 'data': ctypes.uint8_t.ptr },
{ 'yy': ctypes.int32_t }, { 'xx': ctypes.int32_t } ]);
var cvCreateMat = lib.declare('cvCreateMat' ctypes.winapi_abi,CvMat.ptr,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );

var M = cvCreateMat( 5, 4, 0 ); // rows, cols, type(CV_8U)
var C = ctypes.cast( M, CvMat.ptr ).contents; // これが必要
print( C.type.toString(16), C.yy, C.xx ); // 0x42424000 5 4 OK
ss = C.xx * C.yy
var D = ctypes.cast( C.data, ctypes.uint8_t.array(ss).ptr ).contents;
print( D[0], D[ss-1] ); // 0 0 初期状態なので。エラーじゃ無いからOK?
で使えそう。


結論:
戻り値が構造体の場合は、
直接 CvMat で参照してもダメ?
1度 cast するコト!
それも“.contents”を付ける!


本日はここまで。


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


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


170216

js-ctypes 学習:外部プログラムの実行

2017-03-18 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-17)の記事「js-ctypes 学習:画像ファイルの入力」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
外部プログラムの実行について。

Luaでは、
昨年3月(2016-03-01)の記事「GSL Shell 学習:外部プログラムの実行」で書いた、
  os.execute

Pythonでは、
3年前(2014-03-10)の記事「Python 学習:system関数?」で書いた、
  subprocess モジュール

Perlでは、
4年前(2013-08-03)の記事「PerlからRを使ってグラフ出力」で書いた、
  system( ) 関数


「Win32API open exe」で検索してみた。
例の“Stack Overflow”の、
winapi - win32 API for running other exe」が真っ先に見つかる。

回答の[2] に、
  The windows CreateProcess API call is what you're looking for: ~~~


「CreateProcess 使い方」で検索したら、
外部プロセスの起動」が見つかる。

  ・・・・・
  ・・・・・
  2.CreateProcess関数
  外部プロセス起動Windows APIとしては WinExec関数がある。

UINT WinExec(
LPCSTR lpCmdLine, // コマンドラインへのポインタ
UINT uCmdShow // ウィンドウの表示状態
);
  第二引数を SW_SHOW とすればコマンドプロンプト画面が表示され、
  SW_HIDE とすれば表示されない。
  しかし、この関数は Windows の以前のバージョンとの互換性のために
  残されているものであり、Win32 アプリケーションでは、
  CreateProcess 関数を使うことが推奨されている。
  下に使用例を示す。CreateProcess関数はWinExec関数より高い機能を持つ
  代わりに、使い方が少々面倒である。
  ・・・・・
  ・・・・・

まあ、
もし使っていいものなら、これで十分ダ。

MSDN:WinExec

内容は、上記参照記事と一緒。

気になるのは、“SW_SHOW”“SW_HIDE”の値。
でも、“SW_SHOW”ダケ知りたい。(“SW_HIDE”は要らない)
これについては、
1月(2017-01-30)の記事「Win32 APIの定数:定義は?」で書いた、
ダウンロードした const.lzh 書庫ファイル にある。
  $00000005
とありました。
つまり、
  0x00000005 == 5
ですネ。

なお、“WinExec”がどの DLL に含まれるのかは、
1月(2017-01-23)の記事「クライアント/サーバ:プロセス間通信」を
書いたときに参照(学習)したサイトの内の
 ・PInvoke.net

これで調べる(検索する)と、“kernel32”とあった。


と云うことで、

1本作った:
// ---------- test_WinExec.js -----
var lib = ctypes.open( 'kernel32' );

var WinExec = lib.declare( 'WinExec', ctypes.winapi_abi, ctypes.uint32_t,
ctypes.char.ptr, ctypes.uint32_t );
var ret = WinExec( 'notepad a.txt', 5 );
print( ret ); // 確認の為

lib.close();
var str = readline();
これで、“メモ帳”が立ち上がって、'a.txt' を開いている。


本日はここまで。


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


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


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