Archive for the ‘Ruby’ Category
-
Hello, Ruby/Tk World!
Posted on 5月 14th, 2013 by cx20
Ruby/Tk
Ruby/Tk は Tcl スクリプト用の GUI ツールキット「Tk」を Ruby から呼出し可能にしたライブラリである。
以下は Ruby による Ruby/Tk の呼出し例となっている。ソースコード
require 'tk' window = TkRoot.new window.title 'Hello, World!' window.geometry '640x480' label = TkLabel.new label.text 'Hello, Ruby/Tk World!' label.pack( 'side' => 'top', 'anchor' => 'w' ) Tk.mainloop
実行方法
C:¥> ruby hello.rb
実行結果
+------------------------------------------+ |Hello, World! [_][~][X]| +------------------------------------------+ |Hello, Ruby/Tk World! | | | | | | | | | | | | | | | | | | | +------------------------------------------+
-
Hello, ODBC(Ruby) World!
Posted on 9月 23rd, 2012 by cx20
DBI
ODBC(Open Database Connectivity)は、マイクロソフト社が提唱した DBMS 接続用の API 仕様である。
DBMS の差異は ODBC ドライバによって吸収される為、ODBC の手順にしたがってプログラムを作成すれば、基本的な差異を意識せず、プログラムすることができる。ODBCドライバ ファイル Microsoft Access Driver (*.mdb) ODBCJT32.DLL Microsoft Text Driver (*.txt; *.csv) ODBCJT32.DLL Microsoft Excel Driver (*.xls) ODBCJT32.DLL Microsoft dBase Driver (*.dbf) ODBCJT32.DLL Microsoft ODBC for Oracle MSORCL32.DLL Microsoft Paradox Driver (*.db ) ODBCJT32.DLL SQL Server SQLSRV32.DLL Microsoft Access Driver (*.mdb, *.accdb) ACEODBC.DLL SQL Server Native Client 10.0 SQLNCLI10.DLL DBI は Ruby 向けの Database Interface(API)である。
DBI 用 ODBC ドライバを介することで、様々な DBMS への接続が可能となっている。ソースコード(Ruby + DBI + ODBC + SQL Server)
require 'rubygems' require "dbi" dbh = DBI.connect("DBI:ODBC:Driver={SQL Server};Server=(local);DATABASE=master", "sa", "P@ssW0rd") sth = dbh.prepare("SELECT 'Hello, DBI World' AS Message") sth.execute() while row = sth.fetch do print "Message", "n"; print "-------------------n"; print row[0] end sth.finish dbh.disconnect
ライブラリ導入方法
C:¥> gem install dbi C:¥> gem install dbd-odbc
以下のエラーが出る場合は、odbc.so と odbc_utf8.so が足りていない可能性がある為、ODBC Binding for Ruby より i386-msvcrt-ruby-odbc.zip を入手し、%RUBY_HOME%librubysite_ruby1.8i386-msvcrt にコピーする必要がある。
C:/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.5/lib/dbi.rb:300:in `load_driver': Unable to load driver 'ODBC' (underlying error: uninitialized constant DBI::DBD::ODBC) (DBI::InterfaceError) from C:/ruby-1.8/lib/ruby/1.8/monitor.rb:242:in `synchronize' from C:/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.5/lib/dbi.rb:242:in `load_driver' from C:/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.5/lib/dbi.rb:160:in `_get_full_driver' from C:/ruby-1.8/lib/ruby/gems/1.8/gems/dbi-0.4.5/lib/dbi.rb:145:in `connect' from hello.rb:3
なお、2012.09 現在、1.9 版のライブラリは提供されていない模様。
実行方法(Windows)
C:¥> ruby hello.rb
実行結果
Message ----------------- Hello, DBI World!
-
Hello, ADO(Ruby) World!
Posted on 9月 22nd, 2012 by cx20
ADO(Ruby)
ADO(ActiveX Data Objects)は、マイクロソフト社が開発した COM ベースの DBMS 接続用 API である。
OLE DB プロバイダを介することで様々な DBMS への接続が可能となっている。
OLE DB プロバイダとしては、以下のようなプロバイダがある。いくつかが OS 標準で付属している他、追加インストールが可能である。プロバイダ名 表示名 説明 MSDASQL Microsoft OLE DB Provider for ODBC ODBC データベース Microsoft.Jet.OLEDB.4.0 Microsoft OLE DB Provider for Microsoft Jet Microsoft Jet データベース Microsoft.ACE.OLEDB.12.0 Microsoft Office 12.0 Access Database Engine OLE DB Provider Microsoft Access データベース SQLOLEDB Microsoft OLE DB Provider for SQL Server Microsoft SQL Server SQLNCLI10 SQL Server Native Client 10.0 Microsoft SQL Server MSDAORA Microsoft OLE DB Provider for Oracle Oracle データベース ソースコード(Ruby + ADO + OLEDB + Jet データベース)
require 'win32ole' cn = WIN32OLE.new("ADODB.Connection") cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\Hello.mdb" rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message") while !rs.EOF print rs.Fields[0].name + "n" print "-------------------n" print rs.Fields[0].value + "n" rs.MoveNext end rs.Close cn.Close
ソースコード(Ruby + ADO + OLEDB + ACE データベース)
require 'win32ole' cn = WIN32OLE.new("ADODB.Connection") cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=.\Hello.accdb" rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message") while !rs.EOF print rs.Fields[0].name + "n" print "-------------------n" print rs.Fields[0].value + "n" rs.MoveNext end rs.Close cn.Close
ソースコード(Ruby + ADO + OLEDB + SQL Server)
require 'win32ole' cn = WIN32OLE.new("ADODB.Connection") cn.Open "Provider=SQLOLEDB;SERVER=(local);DATABASE=master", "sa", "P@ssW0rd" rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message") while !rs.EOF print rs.Fields[0].name + "n" print "-------------------n" print rs.Fields[0].value + "n" rs.MoveNext end rs.Close cn.Close
ソースコード(Ruby + ADO + OLEDB + Oracle)
require 'win32ole' cn = WIN32OLE.new("ADODB.Connection") cn.Open "Provider=MSDAORA;Data Source=ORCL", "scott", "tiger" rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message") while !rs.EOF print rs.Fields[0].name + "n" print "-------------------n" print rs.Fields[0].value + "n" rs.MoveNext end rs.Close cn.Close
実行方法(Windows)
C:¥> ruby hello.rb
実行結果
Message ----------------- Hello, ADO World!
-
Hello, DBI(Ruby) World!
Posted on 9月 21st, 2012 by cx20
DBI
DBI は Ruby 向けの Database Interface(API)である。
各データベースドライバを介することで、様々な DBMS への接続が可能となっている。ソースコード(Perl + DBI + MySQL)
require "dbi" dbh = DBI.connect("dbi:Mysql:test:localhost", "root", "P@ssW0rd") sth = dbh.prepare("SELECT 'Hello, DBI World' AS Message") sth.execute() while row = sth.fetch do print "Message", "n"; print "-------------------n"; print row[0] end sth.finish dbh.disconnect
ライブラリ導入方法
C:¥> gem install dbi C:¥> gem install dbd-mysql
実行方法(Windows)
C:¥> ruby hello.rb
実行結果
Message ----------------- Hello, DBI World!
-
Hello, Win32 GUI(Ruby) World!
Posted on 7月 14th, 2012 by cx20
Win32 GUI(Ruby)
Win32 アプリケーションは Windows 標準 API である Win32 API を使用した Windows アプリケーションである。
以下は Ruby による Win32 GUI アプリケーション の例となっている。
なお、Win32 の構造体の定義に CStruct ライブラリを使用している。ソースコード
require 'win32/api' require 'cstruct/win32struct' include Win32 WS_VISIBLE = 0x10000000 WS_CAPTION = 0x00C00000 WS_SYSMENU = 0x00080000 WS_MINIMIZEBOX = 0x00020000 WS_MAXIMIZEBOX = 0x00010000 WS_THICKFRAME = 0x00040000 WS_OVERLAPPED = 0x00000000 WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX) WM_CREATE = 0x0001 WM_DESTROY = 0x0002 WM_PAINT = 0x000F WM_CLOSE = 0x0010 WM_COMMAND = 0x0111 CS_VREDRAW = 0x0001 CS_HREDRAW = 0x0002 COLOR_WINDOW = 5 CW_USEDEFAULT = -2147483648 #0x80000000 SW_SHOW = 5 SW_SHOWDEFAULT = 10 Memset = API.new('memset', 'PLL', 'L', 'msvcrt') LocalAlloc = API.new('LocalAlloc', 'LL', 'L', 'kernel32') GetModuleHandle = API.new('GetModuleHandle', 'P', 'L', 'kernel32') RegisterClass = API.new('RegisterClass', 'P', 'L', 'user32') RegisterClassEx = API.new('RegisterClassEx', 'P', 'L', 'user32') CloseWindow = API.new('CloseWindow', 'L', 'B', 'user32') CreateWindowEx = API.new('CreateWindowEx', 'LPPLIIIILLLL', 'L', 'user32') ShowWindow = API.new('ShowWindow', 'LL', 'B', 'user32') UpdateWindow = API.new('UpdateWindow', 'L', 'B', 'user32') BeginPaint = API.new('BeginPaint', 'LP', 'L', 'user32') EndPaint = API.new('EndPaint', 'LP', 'L', 'user32') PostQuitMessage = API.new('PostQuitMessage', 'I', 'V', 'user32') DefWindowProc = API.new('DefWindowProc', 'LLLL', 'L', 'user32') GetMessage = API.new('GetMessage', 'PLII', 'L', 'user32') DispatchMessage = API.new('DispatchMessage', 'P', 'L', 'user32') TranslateMessage = API.new('TranslateMessage', 'P', 'B', 'user32') TextOut = API.new('TextOut', 'LLLPL', 'B', 'gdi32' ); class POINT < Win32Struct LONG :x LONG :y end class MSG < Win32Struct uint32 :hwnd UINT :message WPARAM :wParam LPARAM :lParam DWORD :time POINT :pt end class WNDCLASSA < Win32Struct UINT :style uint32 :lpfnWndProc int32 :cbClsExtra int32 :cbWndExtra HINSTANCE :hInstance HICON :hIcon HCURSOR :hCursor HBRUSH :hbrBackground LPCSTR :lpszMenuName LPCSTR :lpszClassName end class RECT < Win32Struct LONG :left LONG :top LONG :right LONG :bottom end class PAINTSTRUCT < Win32Struct HDC :hdc BOOL :fErase RECT :rcPaint BOOL :fRestore BOOL :fIncUpdate BYTE :rgbReserved,[32] end @window_proc = API::Callback.new('LLLL', 'I') do |hwnd, msg, wparam, lparam| ret = 0 strMessage = "Hello, Win32 GUI(Ruby) World!" case msg when WM_PAINT ps = PAINTSTRUCT.new hdc = BeginPaint.call(hwnd, ps.data) TextOut.call(hdc, 0, 0, strMessage, strMessage.length); EndPaint.call(hwnd, ps.data) when WM_DESTROY PostQuitMessage.call(0) else ret = DefWindowProc.call(hwnd, msg, wparam, lparam) end ret end def alloc_string_buffer init_string, max_length buffer_pointer = LocalAlloc.call(0, max_length) buffer_addr = buffer_pointer Memset.call(buffer_addr, 0, max_length) init_string.each_byte do |byte| Memset.call(buffer_pointer, byte, 1) buffer_pointer += 1 end buffer_addr end def WinMain instance, cmd_show msg = MSG.new wc = WNDCLASSA.new wc.style = 0 wc.lpfnWndProc = @window_proc.address wc.cbClsExtra = 0 wc.cbWndExtra = 0 wc.hInstance = instance wc.hIcon = 0 wc.hCursor = 0 wc.hbrBackground = (COLOR_WINDOW+1) wc.lpszMenuName = 0 wc.lpszClassName = alloc_string_buffer 'helloWindow', 256 RegisterClass.call(wc.data) hwnd = CreateWindowEx.call( 0, "helloWindow", "Hello, World!", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, 0, 0, wc.hInstance, 0 ) ShowWindow.call(hwnd, cmd_show) UpdateWindow.call(hwnd) while(GetMessage.call(msg.data, 0, 0, 0) > 0) TranslateMessage.call(msg.data) DispatchMessage.call(msg.data) end end def main instance = GetModuleHandle.call(0) WinMain instance, SW_SHOW end main
ライブラリ導入方法
C:¥> gem install cstruct
実行方法
C:¥> ruby hello.rb
実行結果
+------------------------------------------+ |Hello, World! [_][~][X]| +------------------------------------------+ |Hello, Win32 GUI(Ruby) World! | | | | | | | | | | | | | | | | | | | +------------------------------------------+
-
Hello, COM(Ruby) World!
Posted on 5月 24th, 2012 by cx20
Ruby
COM(Component Object Model)はマイクロソフトの提唱するプログラム部品の仕様である。
COM を用いて開発された部品であれば言語を問わず利用することができる。
以下は Ruby による COM クライアントの例となっている。ソースコード
require 'win32ole' shell = WIN32OLE.new('Shell.Application') folder = shell.BrowseForFolder( 0, "Hello, COM(Ruby) World!", 0, 36 )
実行方法
C:¥> ruby hello.rb
実行結果
+----------------------------------------+ |Browse For Folder [X]| +----------------------------------------+ | Hello, COM(Ruby) Wolrd! | | | | +------------------------------------+ | | |[Windows] | | | | +[addins] | | | | +[AppCompat] | | | | +[AppPatch] | | | | +[assembly] | | | | : | | | | : | | | | : | | | +------------------------------------+ | | [Make New Folder] [ OK ] [Cancel] | +----------------------------------------+
-
Hello, Win32 API(Ruby) World!
Posted on 4月 28th, 2012 by cx20
Win32 API(Ruby)
Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
以下は Ruby の Win32API ライブラリならびに Ruby/DL2(Ruby 1.9 より標準添付)よる呼出し例である。ソースコード(Win32API)
require 'Win32API' msgbox = Win32API.new('user32', 'MessageBox', ['i', 'p', 'p', 'i'], 'i') msgbox.call( 0, "Hello, Win32 API(Ruby) World!", "Hello, World!", 0 )
なお、上記の [‘i’, ‘p’, ‘p’, ‘i’], ‘i’ は、各引数と戻り値の型を表している。主なタイプとしては以下の種類がある。詳細は「Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > Win32APIライブラリ > Win32APIクラス」を参照のこと。
タイプ 説明 “p” ポインタ型(pointer) “l” 数値型(long) “i” 整数型(integer) “v” void 型 ソースコード(Ruby/DL2)
require 'dl/import' require 'dl/types' module User32 extend DL::Importer dlload 'user32' include DL::Win32Types extern 'int MessageBoxA(HWND, LPCSTR, LPCSTR, UINT)' end User32.MessageBoxA( 0, "Hello, Windows API(Ruby) World!", "Hello, World!", 0 )
Ruby/DL2 では、C言語のプロトタイプ宣言を記述することにより、外部ライブラリの利用が可能となっている。
実行方法
C:¥> ruby hello.rb
実行結果
--------------------------- Hello, World! --------------------------- Hello, Win32 API(Ruby) World! --------------------------- OK ---------------------------
-
Hello, eRuby World!
Posted on 2月 25th, 2012 by cx20
eRuby
eRuby は任意のテキストに Ruby スクリプトを埋め込むことのできる書式の仕様である。名前の由来は「embedded Ruby」から。
eRuby の類似技術としては、PHP、ASP、JSP 等がある。
eRuby のライブラリとしては、C言語で実装された eruby や Ruby で実装された ERB、Erubis などがある。
ERB は Ruby による Web アプリケーションフレームワーク「Ruby On Rails」のデフォルトのテンプレートエンジンとしても採用されている。
ソースコード
<html> <head> <title>Hello, World!</title> </head> <body> <p><%= "Hello, eRuby World!" %></p> </body> </html>
実行方法
1. Web 公開フォルダ に配置 2. ブラウザで表示 http://localhost/doc/hello.rhtml
実行結果
Hello, eRuby World!
-
Hello, IronRuby World!
Posted on 1月 21st, 2012 by cx20
IronRuby
IronRuby はオブジェクト指向スクリプト言語 Ruby の .NET 実装である。
Ruby の構文が使える他、.NET Framework のライブラリが利用できる。
C# 同様に、UNIX 環境向けの .NET Framework 互換プロジェクト「Mono」により他の OS でも動作させることができる。
ソースコード
ソースコード(.NET ライブラリを使用した場合)
#!/usr/bin/env ir require 'mscorlib' require 'System' System::Console.WriteLine("Hello, IronRuby World!")
実行方法(スクリプトファイルを指定して実行)
$ ir hello.rb
実行方法(実行権限を付与して実行)
$ chmod +x hello.rb $ ./hello.rb
実行結果
Hello, IronRuby World!
-
Hello, JRuby World!
Posted on 1月 8th, 2012 by cx20
JRuby
JRuby はオブジェクト指向スクリプト言語 Ruby の Java 実装である。
Ruby の構文が使える他、Java のライブラリが利用できる。
また、JRuby のスクリプトは Java クラスとしてコンパイルすることもできえる。
ソースコード
ソースコード(Java ライブラリを使用した場合)
#!/usr/bin/env jruby require 'java' import 'java.lang.System' System.out.println('Hello, JRuby World!')
実行方法(スクリプトファイルを指定して実行)
$ jruby hello.rb
実行方法(実行権限を付与して実行)
$ chmod +x hello.rb $ ./hello.rb
コンパイル&実行方法(バイトコードにコンパイルして実行)
$ jrubyc hello.rb $ jruby hello.class
コンパイル&実行方法(Java クラスとして実行)
$ jrubyc hello.rb $ java -cp $JRUBY_HOME/lib/jruby.jar:. hello
実行結果
Hello, JRuby World!