Archive for the ‘Ruby’ Category

  1. 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!                     |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  2. 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!
  3. 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!
  4. 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!
  5. 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!             |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  6. 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] |
    +----------------------------------------+
  7. 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   
    ---------------------------
  8. 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!
  9. Hello, IronRuby World!

    Posted on 1月 21st, 2012 by cx20

    IronRuby

    IronRuby はオブジェクト指向スクリプト言語 Ruby の .NET 実装である。
    Ruby の構文が使える他、.NET Framework のライブラリが利用できる。
    C# 同様に、UNIX 環境向けの .NET Framework 互換プロジェクト「Mono」により他の OS でも動作させることができる。

    ソースコード

    #!/usr/bin/env ir
    print "Hello, IronRuby World!"

    ソースコード(.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!
  10. Hello, JRuby World!

    Posted on 1月 8th, 2012 by cx20

    JRuby

    JRuby はオブジェクト指向スクリプト言語 Ruby の Java 実装である。
    Ruby の構文が使える他、Java のライブラリが利用できる。
    また、JRuby のスクリプトは Java クラスとしてコンパイルすることもできえる。

    ソースコード

    #!/usr/bin/env jruby
    puts "Hello, JRuby World!"

    ソースコード(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!