SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
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!

Weitere ähnliche Inhalte

Was ist angesagt?

Perl: Hate it for the Right Reasons
Perl: Hate it for the Right ReasonsPerl: Hate it for the Right Reasons
Perl: Hate it for the Right ReasonsMatt Follett
 
Inside Bokete: Web Application with Mojolicious and others
Inside Bokete:  Web Application with Mojolicious and othersInside Bokete:  Web Application with Mojolicious and others
Inside Bokete: Web Application with Mojolicious and othersYusuke Wada
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony AppsKris Wallsmith
 
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK -  Nicola Iarocci - Co...RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK -  Nicola Iarocci - Co...
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...Codemotion
 
The effective use of Django ORM
The effective use of Django ORMThe effective use of Django ORM
The effective use of Django ORMYaroslav Muravskyi
 
How to actually use promises - Jakob Mattsson, FishBrain
How to actually use promises - Jakob Mattsson, FishBrainHow to actually use promises - Jakob Mattsson, FishBrain
How to actually use promises - Jakob Mattsson, FishBrainCodemotion Tel Aviv
 
Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)Ryan Weaver
 
Keeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkKeeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkJeremy Kendall
 
Mojolicious - Perl Framework for the Real-Time Web (Lightning Talk)
Mojolicious - Perl Framework for the Real-Time Web (Lightning Talk)Mojolicious - Perl Framework for the Real-Time Web (Lightning Talk)
Mojolicious - Perl Framework for the Real-Time Web (Lightning Talk)Dotan Dimet
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworksdiego_k
 
A Little Backbone For Your App
A Little Backbone For Your AppA Little Backbone For Your App
A Little Backbone For Your AppLuca Mearelli
 
Plugin jQuery, Design Patterns
Plugin jQuery, Design PatternsPlugin jQuery, Design Patterns
Plugin jQuery, Design PatternsRobert Casanova
 
Mojolicious: what works and what doesn't
Mojolicious: what works and what doesn'tMojolicious: what works and what doesn't
Mojolicious: what works and what doesn'tCosimo Streppone
 
Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3makoto tsuyuki
 
PHP, RabbitMQ, and You
PHP, RabbitMQ, and YouPHP, RabbitMQ, and You
PHP, RabbitMQ, and YouJason Lotito
 
Controlling The Cloud With Python
Controlling The Cloud With PythonControlling The Cloud With Python
Controlling The Cloud With PythonLuca Mearelli
 
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017Ryan Weaver
 

Was ist angesagt? (20)

Perl: Hate it for the Right Reasons
Perl: Hate it for the Right ReasonsPerl: Hate it for the Right Reasons
Perl: Hate it for the Right Reasons
 
Inside Bokete: Web Application with Mojolicious and others
Inside Bokete:  Web Application with Mojolicious and othersInside Bokete:  Web Application with Mojolicious and others
Inside Bokete: Web Application with Mojolicious and others
 
How Kris Writes Symfony Apps
How Kris Writes Symfony AppsHow Kris Writes Symfony Apps
How Kris Writes Symfony Apps
 
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK -  Nicola Iarocci - Co...RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK -  Nicola Iarocci - Co...
RESTFUL SERVICES MADE EASY: THE EVE REST API FRAMEWORK - Nicola Iarocci - Co...
 
The effective use of Django ORM
The effective use of Django ORMThe effective use of Django ORM
The effective use of Django ORM
 
How to actually use promises - Jakob Mattsson, FishBrain
How to actually use promises - Jakob Mattsson, FishBrainHow to actually use promises - Jakob Mattsson, FishBrain
How to actually use promises - Jakob Mattsson, FishBrain
 
Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)Symfony: Your Next Microframework (SymfonyCon 2015)
Symfony: Your Next Microframework (SymfonyCon 2015)
 
RESTful web services
RESTful web servicesRESTful web services
RESTful web services
 
Keeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkKeeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro framework
 
Mojolicious - Perl Framework for the Real-Time Web (Lightning Talk)
Mojolicious - Perl Framework for the Real-Time Web (Lightning Talk)Mojolicious - Perl Framework for the Real-Time Web (Lightning Talk)
Mojolicious - Perl Framework for the Real-Time Web (Lightning Talk)
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworks
 
A Little Backbone For Your App
A Little Backbone For Your AppA Little Backbone For Your App
A Little Backbone For Your App
 
A Gentle Introduction to Event Loops
A Gentle Introduction to Event LoopsA Gentle Introduction to Event Loops
A Gentle Introduction to Event Loops
 
Plugin jQuery, Design Patterns
Plugin jQuery, Design PatternsPlugin jQuery, Design Patterns
Plugin jQuery, Design Patterns
 
Mojolicious: what works and what doesn't
Mojolicious: what works and what doesn'tMojolicious: what works and what doesn't
Mojolicious: what works and what doesn't
 
Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3Django - 次の一歩 gumiStudy#3
Django - 次の一歩 gumiStudy#3
 
PHP, RabbitMQ, and You
PHP, RabbitMQ, and YouPHP, RabbitMQ, and You
PHP, RabbitMQ, and You
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Controlling The Cloud With Python
Controlling The Cloud With PythonControlling The Cloud With Python
Controlling The Cloud With Python
 
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
 

Andere mochten auch

Resource and view
Resource and viewResource and view
Resource and viewPapp Laszlo
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven DevelopmentPapp Laszlo
 
Open Academy - Ruby
Open Academy - RubyOpen Academy - Ruby
Open Academy - RubyPapp Laszlo
 
Munkafolyamatok modellezése OPM segítségével
Munkafolyamatok modellezése OPM segítségévelMunkafolyamatok modellezése OPM segítségével
Munkafolyamatok modellezése OPM segítségévelPapp Laszlo
 

Andere mochten auch (8)

Resource and view
Resource and viewResource and view
Resource and view
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
Open Academy - Ruby
Open Academy - RubyOpen Academy - Ruby
Open Academy - Ruby
 
Git thinking
Git thinkingGit thinking
Git thinking
 
Have2do.it
Have2do.itHave2do.it
Have2do.it
 
Shade műhely
Shade műhelyShade műhely
Shade műhely
 
Munkafolyamatok modellezése OPM segítségével
Munkafolyamatok modellezése OPM segítségévelMunkafolyamatok modellezése OPM segítségével
Munkafolyamatok modellezése OPM segítségével
 
Rails Models
Rails ModelsRails Models
Rails Models
 

Ähnlich wie Ruby gems

Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the FinishYehuda Katz
 
Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)bryanbibat
 
SINATRA + HAML + TWITTER
SINATRA + HAML + TWITTERSINATRA + HAML + TWITTER
SINATRA + HAML + TWITTERElber Ribeiro
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and PythonPiXeL16
 
RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”apostlion
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryTatsuhiko Miyagawa
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVCAlive Kuo
 
Ruby on Rails testing with Rspec
Ruby on Rails testing with RspecRuby on Rails testing with Rspec
Ruby on Rails testing with RspecBunlong Van
 
Building Cloud Castles
Building Cloud CastlesBuilding Cloud Castles
Building Cloud CastlesBen Scofield
 
Ruby/Rails
Ruby/RailsRuby/Rails
Ruby/Railsrstankov
 
Rails 2010 Workshop
Rails 2010 WorkshopRails 2010 Workshop
Rails 2010 Workshopdtsadok
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareAlona Mekhovova
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasminePaulo Ragonha
 

Ähnlich wie Ruby gems (20)

Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 
Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)
 
SINATRA + HAML + TWITTER
SINATRA + HAML + TWITTERSINATRA + HAML + TWITTER
SINATRA + HAML + TWITTER
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and Python
 
Play!ng with scala
Play!ng with scalaPlay!ng with scala
Play!ng with scala
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
JSON and the APInauts
JSON and the APInautsJSON and the APInauts
JSON and the APInauts
 
Rack Middleware
Rack MiddlewareRack Middleware
Rack Middleware
 
RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 
Ruby on Rails testing with Rspec
Ruby on Rails testing with RspecRuby on Rails testing with Rspec
Ruby on Rails testing with Rspec
 
Building Cloud Castles
Building Cloud CastlesBuilding Cloud Castles
Building Cloud Castles
 
Ruby/Rails
Ruby/RailsRuby/Rails
Ruby/Rails
 
Rails 2010 Workshop
Rails 2010 WorkshopRails 2010 Workshop
Rails 2010 Workshop
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Blog Hacks 2011
Blog Hacks 2011Blog Hacks 2011
Blog Hacks 2011
 
Laravel 101
Laravel 101Laravel 101
Laravel 101
 

Kürzlich hochgeladen

FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Bhuvaneswari Subramani
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 

Kürzlich hochgeladen (20)

FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 

Ruby gems

  • 1. Ruby gems MeetUP @ Balabit December 9, 2010 nucc@balabit.com
  • 2.
  • 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 sudo apt-get install rubygems
  • 6. First steps sudo apt-get install rubygems gem install git
  • 7. 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’
  • 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>
  • 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
  • 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
  • 19. 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.
  • 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 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
  • 22. 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
  • 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"
  • 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 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
  • 29. 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
  • 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
  • 34. OmniAuth Facebook Twitter Google LinkedIn Foursquare Meetup OpenID
  • 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 ...
  • 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 /* 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); }
  • 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"]>
  • 44.
  • 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