Ruby gems MeetUP @ Balabit December 9, 2010 nucc@balabit.com
Do Active what I Record mean Mysql RMagick Ruby Jabber Git
Do Active what I Record mean Mysql RMagick Ruby Jabber Git
First steps sudo apt-get install rubygems
First steps sudo apt-get install rubygems gem install git
First steps sudo apt-get install rubygems gem install git require “rubygems” require “git” repo = Git.open “/work/scb” repo.log.between ‘3.0.0’, ‘3.1.0’
http://haml-lang.com
HAML #title <div id=”title”> .left = @title <div class=”left”> <%= @title %> #content </div> .author.strong </div> %span{ :style => “float: left” } Nucc <div id=”content”> <div class=”author strong”> .body.mobile <span style=”float: left”> = @content.body Nucc </span> - if @content.footer? </div> .footer.mobile <div class=”body mobile”> = @content.footer <%= @content.body %> </div> - plain </div> <span>Copyright</span>
http://sass-lang.com
SASS HAML $blue: #3bbfce .content-navigation { $margin: 16px border-color: #3bbfce; color: #2b9eab; .content-navigation } border-color: $blue .border { color: darken($blue, 9%) padding: 8px; margin: 8px; .border border-color: #3bbfce; padding: $margin / 2 } margin: $margin / 2 border-color: $blue
SASS HAML @mixin table-base #data { th float: left; text-align: center margin-left: 10px; font-weight: bold } td, th #data th { padding: 2px text-align: center; font-weight: bold; @mixin left($dist) } float: left #data td, #data th { margin-left: $dist padding: 2px; } #data @include left(10px) @include table-base
HPricot http://hpricot.com
HPricot require ‘rubygems’ require ‘hpricot’ html = Hpricot("<p id=’test_id’>A simple <span class=’bold’>test</span> string.</p>") (html/”p”).inner_html => "A simple <span class="bold">test string.</b>" (html/:p/:span).first.inner_html => “test” (html/”#test_id”).inner_html (html/”span.bold”).remove
HPricot require ‘rubygems’ require ‘hpricot’ require ‘open-uri’ html = open("http://iosflashvideo.fw.hu/") { |f| Hpricot(f, :xhtml_strict => true) } xpath html.search("//a[@href='/donate']") css html.search("html > body > p img") css to xpath html.at("#header").xpath #=> "//div[@id='header']" xpath to css html.at("//span").css_path #=> "p > span:nth(0)"
Hpricot jQuery (html/"span.bold").set(:class => 'weight') (html/”span.bold”).remove Looping (html/:span).each do |span| span.attributes[‘class’] = “weight” end
http://rspec.info
RSPEC Behaviour Driven Development
RSPEC Behaviour Driven Development Describe a network interface! It should have a host address. It should have a network address. It should have a gateway address. The gateway and the host address must be in the same network.
RSPEC describe Interface do it “should have a host address” do end Behaviour Driven Development it “should have a network address” do end it “should have a gateway address” do end Describe a network interface! it “gateway and host address...” do It should have a host address. end It should have a network address. end It should have a gateway address. The gateway and the host address must be in the same network.
RSPEC describe Interface do before :all do @interface = Interface.new end before :each do @interface.network = “10.30.0.0” end it “should have a host address” do @interface.should respond_to :host end it “should be valid” do # Rails model validation @interface.should be_valid end after :each do #do something end end
RSPEC describe Interface do describe :network subject { @interface.network } context “when netmask is 255.255.0.0” do before { @interface.netmask = “255.255.0.0” } it { should =~ /0.0$/} end context “when netmask is 255.0.0.0” do before { @interface.netmask = “255.0.0.0” } it { should =~ /0.0.0$/} end context “when gateway and host are not in the same network” do # network address is 10.30.0.0/255.255.0.0 currently before { @interface.gateway = “10.100.255.254” } it { should =~ /^10.100/ } specify { @interface.should not.be_valid } end end end
RSPEC Interface network when netmask is 255.255.0.0 should =~ /0.0$/ when netmask is 255.0.0.0 should =~ /0.0.0$/ when gateway and host are not in the same network should =~ /^10.100/ should not be valid expected: /0.0$/,          got: "10.30.0.1" (using =~)     Diff:     @@ -1,2 +1,2 @@     -/0.0$/     +"10.30.0.1"
http://cukes.info
Cucumber Precondition Given Action When Postcondition Then
Cucumber Feature: Network Connection Managing network connections on intraweb Scenario: Interface settings Given an Interface and its address is 10.30.0.34 and its network is 10.30.0.0 When the gateway is 10.100.255.254 Then its not valid
Cucumber Feature: Network Connection Managing network connections on intraweb Scenario: Interface settings Given an Interface and its address is <IP> and its network is <NETWORK> When the gateway is <GATEWAY> Then its <RESULT> Examples: | IP | NETWORK | GATEWAY | RESULT | | 10.30.0.34 | 10.30.0.0 | 10.30.255.254 | VALID | | 10.100.30.1 | 10.100.0.0 | 10.30.255.254 | NOT VALID |
Cucumber Given an Interface and its address is <IP> and its network is <NETWORK> Given /^an Interface$/ do @interface = Interface.new end Given /address is (.*)$/ do |value| @interface.address = value end Given /network is (.*)$/ do |value| @interface.network = value end
Cucumber When the gateway is <GATEWAY> Then its <RESULT> When /^the gateway is (.*)$/ do |gw| @interface.gateway = gw end Then /its (.*)$/ do |result| @interface.validate.should == (result == “VALID”) end
Cucumber Jellemző: Összeadás Azért, hogy elkerüljem a buta hibákat amit diszkalkúliásként elkövethetek, két szám összegét szeretném kiszámoltatni. Forgatókönyv vázlat: Két szám összeadása Amennyiben beütök a számológépbe egy <be_1>-est És beütök a számológépbe egy <be_2>-est Majd megnyomom az <gomb> gombot Akkor eredményül <ki>-t kell kapnom Példák: | be_1 | be_2 | gomb | ki | | 20 | 30 | add | 50 | | 2 | 5 | add | 7 | | 0 | 40 | add | 40 | by gbence
Cucumber Before do   @calc = Calculator.new end Ha /^beütök a számológépbe egy (d+)-(?:es|as|ös|ás)t$/ do |n|   @calc.push n.to_i end Majd /^megnyomom az (w+) gombot$/ do |op|   @result = @calc.send op end Akkor /^eredményül (.*)-(?:e|a|ö|á|)t kell kapnom$/ do |result|   @result.should == result.to_f end
Cucumber OH HAI: STUFFING MISHUN: CUCUMBR I CAN HAZ IN TEH BEGINNIN 3 CUCUMBRZ WEN I EAT 2 CUCUMBRZ DEN I HAS 2 CUCUMBERZ IN MAH BELLY AN IN TEH END 1 CUCUMBRZ KTHXBAI ICANHAZ /^IN TEH BEGINNIN (d+) CUCUMBRZ$/ do |n|   @basket = Basket.new(n.to_i) end WEN /^I EAT (d+) CUCUMBRZ$/ do |n|   @belly = Belly.new   @belly.eat(@basket.take(n.to_i)) end
OmniAuth http://github.com/intridea/omniauth
OmniAuth Facebook Twitter Google LinkedIn Foursquare Meetup OpenID
OmniAuth /config/initializers/omniauth.rb Rails.application.config.middleware.use OmniAuth::Builder do provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET' end
OmniAuth /config/initializers/omniauth.rb Rails.application.config.middleware.use OmniAuth::Builder do provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET' end get /auth/twitter redirect User valid failed /auth/twitter/callback /auth/failed
OmniAuth auth_controller.rb class AuthController < Application def callback auth_hash = request.env['omniauth.auth'] # auth_hash: # { # ‘uid’ => “12345” # ‘provider’ => “twitter” # ‘user_info’ => { # ‘name’ => “User name” # ‘nickname’ => “nick”, # ... # } # } end ...
Ruby C API http://ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html
class Test   def initialize     @array = Array.new   end   def add(anObject)     @array.push(anObject)   end end
Ruby C main.c #include "ruby.h" class Test static VALUE t_init(VALUE self)   def initialize {     @array = Array.new VALUE array;   end array = rb_ary_new();   def add(anObject) rb_iv_set(self, "@array", array);     @array.push(anObject) return self;   end } end static VALUE t_add(VALUE self, VALUE anObject) { VALUE array; array = rb_iv_get(self, "@array"); rb_ary_push(array, anObject); return array; } ...
Ruby C main.c /* from the previous slide */ class Test static VALUE t_init(VALUE self); static VALUE t_add(VALUE self, VALUE anObject);   def initialize /* end */     @array = Array.new   end VALUE cTest;   def add(anObject)     @array.push(anObject) void Init_Test()   end { cTest = rb_define_class("Test", rb_cObject); end rb_define_method(cTest, "initialize", t_init, 0); rb_define_method(cTest, "add", t_add, 1); }
Ruby C extconf.rb require 'mkmf' create_makefile("Test") nucc@rubybox ~ $ ruby extconf.rb nucc@rubybox ~ $ make nucc@rubybox ~ $ make install
Ruby C my_test.rb require “Test” test = Test.new test.add("Balabit Meetup") p test => #<Test:0x100156548 @array=["Balabit Meetup"]>
require 'ftplib' ? ftp = FTP.open('ftp.netlab.co.jp') ftp.login ftp.chdir('pub/lang/ruby') puts ftp.dir ftp.quit
on yth ubyP R require 'ftplib' ? ftp = FTP.open('ftp.netlab.co.jp') ftp.login ftp.chdir('pub/lang/ruby') puts ftp.dir ftp.quit
Questions?
Thank you!

Ruby gems

  • 1.
    Ruby gems MeetUP @Balabit December 9, 2010 nucc@balabit.com
  • 3.
    Do Active what I Record mean Mysql RMagick Ruby Jabber Git
  • 4.
    Do Active what I Record mean Mysql RMagick Ruby Jabber Git
  • 5.
    First steps sudoapt-get install rubygems
  • 6.
    First steps sudoapt-get install rubygems gem install git
  • 7.
    First steps sudoapt-get install rubygems gem install git require “rubygems” require “git” repo = Git.open “/work/scb” repo.log.between ‘3.0.0’, ‘3.1.0’
  • 8.
  • 9.
    HAML #title <div id=”title”> .left = @title <div class=”left”> <%= @title %> #content </div> .author.strong </div> %span{ :style => “float: left” } Nucc <div id=”content”> <div class=”author strong”> .body.mobile <span style=”float: left”> = @content.body Nucc </span> - if @content.footer? </div> .footer.mobile <div class=”body mobile”> = @content.footer <%= @content.body %> </div> - plain </div> <span>Copyright</span>
  • 10.
  • 11.
    SASS HAML $blue: #3bbfce .content-navigation { $margin: 16px border-color: #3bbfce; color: #2b9eab; .content-navigation } border-color: $blue .border { color: darken($blue, 9%) padding: 8px; margin: 8px; .border border-color: #3bbfce; padding: $margin / 2 } margin: $margin / 2 border-color: $blue
  • 12.
    SASS HAML @mixin table-base #data { th float: left; text-align: center margin-left: 10px; font-weight: bold } td, th #data th { padding: 2px text-align: center; font-weight: bold; @mixin left($dist) } float: left #data td, #data th { margin-left: $dist padding: 2px; } #data @include left(10px) @include table-base
  • 13.
  • 14.
    HPricot require ‘rubygems’ require ‘hpricot’ html= Hpricot("<p id=’test_id’>A simple <span class=’bold’>test</span> string.</p>") (html/”p”).inner_html => "A simple <span class="bold">test string.</b>" (html/:p/:span).first.inner_html => “test” (html/”#test_id”).inner_html (html/”span.bold”).remove
  • 15.
    HPricot require‘rubygems’ require ‘hpricot’ require ‘open-uri’ html = open("http://iosflashvideo.fw.hu/") { |f| Hpricot(f, :xhtml_strict => true) } xpath html.search("//a[@href='/donate']") css html.search("html > body > p img") css to xpath html.at("#header").xpath #=> "//div[@id='header']" xpath to css html.at("//span").css_path #=> "p > span:nth(0)"
  • 16.
    Hpricot jQuery (html/"span.bold").set(:class =>'weight') (html/”span.bold”).remove Looping (html/:span).each do |span| span.attributes[‘class’] = “weight” end
  • 17.
  • 18.
  • 19.
    RSPEC Behaviour Driven Development Describea network interface! It should have a host address. It should have a network address. It should have a gateway address. The gateway and the host address must be in the same network.
  • 20.
    RSPEC describe Interface do it “should have a host address” do end Behaviour Driven Development it “should have a network address” do end it “should have a gateway address” do end Describe a network interface! it “gateway and host address...” do It should have a host address. end It should have a network address. end It should have a gateway address. The gateway and the host address must be in the same network.
  • 21.
    RSPEC describeInterface do before :all do @interface = Interface.new end before :each do @interface.network = “10.30.0.0” end it “should have a host address” do @interface.should respond_to :host end it “should be valid” do # Rails model validation @interface.should be_valid end after :each do #do something end end
  • 22.
    RSPEC describeInterface do describe :network subject { @interface.network } context “when netmask is 255.255.0.0” do before { @interface.netmask = “255.255.0.0” } it { should =~ /0.0$/} end context “when netmask is 255.0.0.0” do before { @interface.netmask = “255.0.0.0” } it { should =~ /0.0.0$/} end context “when gateway and host are not in the same network” do # network address is 10.30.0.0/255.255.0.0 currently before { @interface.gateway = “10.100.255.254” } it { should =~ /^10.100/ } specify { @interface.should not.be_valid } end end end
  • 23.
    RSPEC Interface network when netmask is 255.255.0.0 should =~ /0.0$/ when netmask is 255.0.0.0 should =~ /0.0.0$/ when gateway and host are not in the same network should =~ /^10.100/ should not be valid expected: /0.0$/,          got: "10.30.0.1" (using =~)     Diff:     @@ -1,2 +1,2 @@     -/0.0$/     +"10.30.0.1"
  • 24.
  • 25.
    Cucumber Precondition Given Action When Postcondition Then
  • 26.
    Cucumber Feature: Network Connection Managing network connections on intraweb Scenario: Interface settings Given an Interface and its address is 10.30.0.34 and its network is 10.30.0.0 When the gateway is 10.100.255.254 Then its not valid
  • 27.
    Cucumber Feature:Network Connection Managing network connections on intraweb Scenario: Interface settings Given an Interface and its address is <IP> and its network is <NETWORK> When the gateway is <GATEWAY> Then its <RESULT> Examples: | IP | NETWORK | GATEWAY | RESULT | | 10.30.0.34 | 10.30.0.0 | 10.30.255.254 | VALID | | 10.100.30.1 | 10.100.0.0 | 10.30.255.254 | NOT VALID |
  • 28.
    Cucumber Givenan Interface and its address is <IP> and its network is <NETWORK> Given /^an Interface$/ do @interface = Interface.new end Given /address is (.*)$/ do |value| @interface.address = value end Given /network is (.*)$/ do |value| @interface.network = value end
  • 29.
    Cucumber Whenthe gateway is <GATEWAY> Then its <RESULT> When /^the gateway is (.*)$/ do |gw| @interface.gateway = gw end Then /its (.*)$/ do |result| @interface.validate.should == (result == “VALID”) end
  • 30.
    Cucumber Jellemző:Összeadás Azért, hogy elkerüljem a buta hibákat amit diszkalkúliásként elkövethetek, két szám összegét szeretném kiszámoltatni. Forgatókönyv vázlat: Két szám összeadása Amennyiben beütök a számológépbe egy <be_1>-est És beütök a számológépbe egy <be_2>-est Majd megnyomom az <gomb> gombot Akkor eredményül <ki>-t kell kapnom Példák: | be_1 | be_2 | gomb | ki | | 20 | 30 | add | 50 | | 2 | 5 | add | 7 | | 0 | 40 | add | 40 | by gbence
  • 31.
    Cucumber Before do   @calc =Calculator.new end Ha /^beütök a számológépbe egy (d+)-(?:es|as|ös|ás)t$/ do |n|   @calc.push n.to_i end Majd /^megnyomom az (w+) gombot$/ do |op|   @result = @calc.send op end Akkor /^eredményül (.*)-(?:e|a|ö|á|)t kell kapnom$/ do |result|   @result.should == result.to_f end
  • 32.
    Cucumber OH HAI: STUFFING MISHUN: CUCUMBR I CAN HAZ IN TEH BEGINNIN 3 CUCUMBRZ WEN I EAT 2 CUCUMBRZ DEN I HAS 2 CUCUMBERZ IN MAH BELLY AN IN TEH END 1 CUCUMBRZ KTHXBAI ICANHAZ /^IN TEH BEGINNIN (d+) CUCUMBRZ$/ do |n|   @basket = Basket.new(n.to_i) end WEN /^I EAT (d+) CUCUMBRZ$/ do |n|   @belly = Belly.new   @belly.eat(@basket.take(n.to_i)) end
  • 33.
  • 34.
    OmniAuth Facebook Twitter Google LinkedIn Foursquare Meetup OpenID
  • 35.
  • 36.
    OmniAuth /config/initializers/omniauth.rb Rails.application.config.middleware.use OmniAuth::Builder do provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET' end get /auth/twitter redirect User valid failed /auth/twitter/callback /auth/failed
  • 37.
    OmniAuth auth_controller.rb class AuthController < Application def callback auth_hash = request.env['omniauth.auth'] # auth_hash: # { # ‘uid’ => “12345” # ‘provider’ => “twitter” # ‘user_info’ => { # ‘name’ => “User name” # ‘nickname’ => “nick”, # ... # } # } end ...
  • 38.
  • 39.
  • 40.
    Ruby C main.c #include "ruby.h" class Test static VALUE t_init(VALUE self)   def initialize {     @array = Array.new VALUE array;   end array = rb_ary_new();   def add(anObject) rb_iv_set(self, "@array", array);     @array.push(anObject) return self;   end } end static VALUE t_add(VALUE self, VALUE anObject) { VALUE array; array = rb_iv_get(self, "@array"); rb_ary_push(array, anObject); return array; } ...
  • 41.
    Ruby C main.c /* fromthe previous slide */ class Test static VALUE t_init(VALUE self); static VALUE t_add(VALUE self, VALUE anObject);   def initialize /* end */     @array = Array.new   end VALUE cTest;   def add(anObject)     @array.push(anObject) void Init_Test()   end { cTest = rb_define_class("Test", rb_cObject); end rb_define_method(cTest, "initialize", t_init, 0); rb_define_method(cTest, "add", t_add, 1); }
  • 42.
    Ruby C extconf.rb require 'mkmf' create_makefile("Test") nucc@rubybox ~ $ ruby extconf.rb nucc@rubybox ~ $ make nucc@rubybox ~ $ make install
  • 43.
    Ruby C my_test.rb require “Test” test = Test.new test.add("Balabit Meetup") p test => #<Test:0x100156548 @array=["Balabit Meetup"]>
  • 45.
    require 'ftplib' ? ftp = FTP.open('ftp.netlab.co.jp') ftp.login ftp.chdir('pub/lang/ruby') puts ftp.dir ftp.quit
  • 46.
    on yth ubyP R require 'ftplib' ? ftp = FTP.open('ftp.netlab.co.jp') ftp.login ftp.chdir('pub/lang/ruby') puts ftp.dir ftp.quit
  • 47.
  • 48.