Ruby Extended Library

50 %
50 %
Information about Ruby Extended Library
Technology

Published on October 26, 2008

Author: artonx

Source: slideshare.net

Description

RubyKaigi 2008

Ruby Extended Library Howto arton also not so known as Akio Tajima

arton (Akio Rubyist Tajima ONline) ActiveScriptRuby (Windows Installer Package with Ruby ActiveScript Interface) http://arton.hp.infoseek.co.jp/ Rjb(Ruby Java Bridge) http://rjb.rubyforge.org diary http://arton.no-ip.info/diary

ActiveScriptRuby

(Windows Installer Package with Ruby ActiveScript Interface)

http://arton.hp.infoseek.co.jp/

Agenda Ruby 拡張ライブラリとは? 何が嬉しいの? 情報源 簡単な拡張ライブラリのデモ 特徴を生かすには? それなりの拡張ライブラリのデモ 代替案 まとめ Q&A

Ruby 拡張ライブラリとは?

何が嬉しいの?

情報源

簡単な拡張ライブラリのデモ

特徴を生かすには?

それなりの拡張ライブラリのデモ

代替案

まとめ

Q&A

拡張ライブラリ 拡張ライブラリとは C または C++ 言語で記述されていて、 Ruby に組み込むことのできるライブラリです。 オブジェクト指向スクリプト言語 Ruby   P.428

拡張ライブラリとは C または C++ 言語で記述されていて、 Ruby に組み込むことのできるライブラリです。

オブジェクト指向スクリプト言語 Ruby   P.428

何が嬉しいの? 拡張ライブラリによる部品を上手に設計し、重い処理の本質的な部分をそれらの部品に任せることができれば、コンパイラ型言語によるプログラムと大差ない実行速度と、比較にならない開発効率を両立させることも可能です。 上掲書 P.428

拡張ライブラリによる部品を上手に設計し、重い処理の本質的な部分をそれらの部品に任せることができれば、コンパイラ型言語によるプログラムと大差ない実行速度と、比較にならない開発効率を両立させることも可能です。

上掲書 P.428

高速化の例 1.upto(10) { |x| puts x } for i in 1..10; puts i; end for (i = 0; i < 10; i++) { rb_funcall(rb_stdout,    rb_intern(“puts”),    1, INT2FIX(i)); }

1.upto(10) { |x| puts x }

for i in 1..10; puts i; end

for (i = 0; i < 10; i++) {

rb_funcall(rb_stdout,

   rb_intern(“puts”),

   1, INT2FIX(i));

}

情報源 README.EXT 、 README.EXT.ja   (1995) オブジェクト指向スクリプト言語 Ruby   (1999) http :// www.loveruby.net/w/RubyExtensionProgrammingGuide.html RHG

README.EXT 、 README.EXT.ja   (1995)

オブジェクト指向スクリプト言語 Ruby   (1999)

http :// www.loveruby.net/w/RubyExtensionProgrammingGuide.html

RHG

一次情報 ruby.h intern.h 主要クラスの公開 API rubyio.h (多分) rubysig.h スレッド操作 version.h st.h ハッシュ

ruby.h

intern.h

主要クラスの公開 API

rubyio.h

(多分)

rubysig.h

スレッド操作

version.h

st.h

ハッシュ

要求される技術 ポインタ 全部ポインタ ソースコードリーディング Ruby のソースを読む セキュアコーディング

ポインタ

全部ポインタ

ソースコードリーディング

Ruby のソースを読む

セキュアコーディング

配布 setup.rb http://www.loveruby.net/archive/setup/ Gem gem & rake Binary MSI,apt,dmg

setup.rb

http://www.loveruby.net/archive/setup/

Gem

gem & rake

Binary

MSI,apt,dmg

デモ extrails http://svn.arton.no-ip.info/raa/trunk/extrails Project generation extrails HelloWorld with Rakefile for creating Gem Skeleton generation ruby script/generate scaffold Hello say_hello say_bye with sample code for defining variable, calling method

extrails

http://svn.arton.no-ip.info/raa/trunk/extrails

Project generation

extrails HelloWorld

with Rakefile for creating Gem

Skeleton generation

ruby script/generate scaffold Hello say_hello say_bye

with sample code for defining variable, calling method

拡張ライブラリの決まり void Init_ ファイル名 () モジュール、クラスの登録 定数、グローバル変数の作成

void Init_ ファイル名 ()

モジュール、クラスの登録

定数、グローバル変数の作成

定数、グローバル変数 定数 rb_define_const( モジュール , “ 名前” , VALUE); rb_define_global_const(“ 名前” , VALUE); グローバル変数 rb_define_variable(“ 名前” , VALUE*); (GC 防御の基本 : cf. rb_gc_register_address(VALUE*)) rb_define_virtual_variable(“ 名前” , getter, setter);

定数

rb_define_const( モジュール , “ 名前” , VALUE);

rb_define_global_const(“ 名前” , VALUE);

グローバル変数

rb_define_variable(“ 名前” , VALUE*);

(GC 防御の基本 :

cf. rb_gc_register_address(VALUE*))

rb_define_virtual_variable(“ 名前” , getter, setter);

モジュール、クラス、メソッド モジュール = rb_define_module(“ 名前” ); rb_define_module_function( モジュール , “ 名前” , メソッド , arity); 項数情報: 0  …… 無引数 -1  …… 可変引数 クラス = rb_define_class(“ 名前” , super); クラス = rb_define_class_under( モジュール , “ 名前” , super); rb_define_method( クラス , “ 名前” , メソッド , arity);

モジュール = rb_define_module(“ 名前” );

rb_define_module_function( モジュール , “ 名前” ,

メソッド , arity);

項数情報:

0  …… 無引数

-1  …… 可変引数

クラス = rb_define_class(“ 名前” , super);

クラス = rb_define_class_under( モジュール , “ 名前” , super);

rb_define_method( クラス , “ 名前” , メソッド , arity);

特徴を生かす × テキスト処理 × ネットワーク処理 × ファイル操作

× テキスト処理

× ネットワーク処理

× ファイル操作

特徴を生かす ○ アドレス操作 ○ 割り込み処理 ○ ネイティブ API

○ アドレス操作

○ 割り込み処理

○ ネイティブ API

デモ inspired by prof. Nakanishi’s Apple Lisp from the article on the old magazin (bit) HeapShow http://svn.arton.no-ip.info/raa/trunk/HeapShow

inspired by prof. Nakanishi’s Apple Lisp

from the article on the old magazin (bit)

HeapShow

http://svn.arton.no-ip.info/raa/trunk/HeapShow

RVALUE HEAPS_SLOT VALUE VALUE RVALUE   (T_STRING) RVALUE memory block : “ abcdefg……” ……

苦労したところ=考慮点 gc.c の static 変数や static 関数 extern にするのは簡単 でも、それで OK? どうせ、依存性あるし…… なぜ拡張ライブラリにするのかを考える Do you need yet another Ruby ? or you only need some other (maybe temporary) feature ?

gc.c の static 変数や static 関数

extern にするのは簡単

でも、それで OK?

どうせ、依存性あるし……

なぜ拡張ライブラリにするのかを考える

Do you need yet another Ruby ?

or you only need some other (maybe temporary) feature ?

代替案 dl native API for any external libraries COM component win32ole Windows only Java class R jb etc JRuby

dl

native API for any external libraries

COM component

win32ole

Windows only

Java class

R jb etc

JRuby

dl sample require 'dl/win32‘ GetShortPathName = Win32API.new('Kernel32.dll', 'GetShortPathNameA', 'SSI', 'I') olen = 200 begin buff = ' ' * olen len = GetShortPathName.call(realpath.to_s, buff, buff.size) if olen < len olen = len end end while olen == len buff.rstrip.chomp(&quot;&quot;) // note: it seems bit buggy, but it’s correct.

require 'dl/win32‘

GetShortPathName = Win32API.new('Kernel32.dll',

'GetShortPathNameA', 'SSI', 'I')

olen = 200

begin

buff = ' ' * olen

len = GetShortPathName.call(realpath.to_s, buff, buff.size)

if olen < len

olen = len

end

end while olen == len

buff.rstrip.chomp(&quot;&quot;)

// note: it seems bit buggy, but it’s correct.

tips 拡張ライブラリを require する Ruby スクリプトを同時配布する 前処理 依存性の吸収(実際に require するライブラリの分岐など) 後処理(自動実行の制御など) バージョン番号を埋め込む

拡張ライブラリを require する Ruby スクリプトを同時配布する

前処理

依存性の吸収(実際に require するライブラリの分岐など)

後処理(自動実行の制御など)

バージョン番号を埋め込む

まとめ C programing is fun !

C programing is fun !

Q&A

Q&A

Add a comment

Related presentations

Presentación que realice en el Evento Nacional de Gobierno Abierto, realizado los ...

In this presentation we will describe our experience developing with a highly dyna...

Presentation to the LITA Forum 7th November 2014 Albuquerque, NM

Un recorrido por los cambios que nos generará el wearabletech en el futuro

Um paralelo entre as novidades & mercado em Wearable Computing e Tecnologias Assis...

Microsoft finally joins the smartwatch and fitness tracker game by introducing the...

Related pages

Gosu, 2D game development library

Gosu is a 2D game development library for the Ruby and C++ programming languages, available for Mac OS X, Windows, and Linux (including Raspbian).
Read more

IronRuby - Wikipedia, the free encyclopedia

The IronRuby team planned to support Ruby 1.8.6 only for 1.0 point releases, ... Extended Array Library; Extended Numerics Library; Parallel Library;
Read more

GitHub - Graylog2/gelf-rb: Ruby GELF library (Graylog2 ...

gelf-rb - Ruby GELF library (Graylog2 Extended Log Format). Download the Gem via Gemcutter. (https://rubygems.org/gems/gelf)
Read more

A-Z plugins list - Ruby Library Depot - Archi

Library of Ruby scripts to add useful commands to SketchUp. ruby library depot Plugins for ... clf extended views; clf greeble 2; clf label open faces;
Read more

Class: CSV (Ruby 1.9.2) - Ruby-Doc.org: Documenting the ...

Extended maintenance of Ruby versions 1.8.7 and 1.9.2 ended on July 31, ... This is different from the Ruby 1.8 CSV library which passed rows to the block.
Read more

arton/ennou: Windows Native HTTP Server with HTTP Server API

Ennou - Ruby Extended Library Ennou is Windows Native HTTP Server, it stands upon HTTP Server API 2.0. - How to setup ACL for Ennou Ennou runs top of HTTP ...
Read more

Include vs Extend in Ruby // RailsTips by John Nunemaker

Include vs Extend in Ruby. ... :009:2> puts “extended by class #{klass} ... An Instrumented Library in ~30 Lines;
Read more

Download Extended math library - Extended math library ...

Extended math library extends Ruby's built-in math capabilities by providing additional constants and functions that a good scientific calculator should ...
Read more

Tk (software) - Wikipedia, the free encyclopedia

Tk is a free and open-source, cross-platform widget toolkit that provides a library of basic elements of GUI widgets for building a graphical user ...
Read more