SlideShare a Scribd company logo
1 of 58
Download to read offline
4. Метапрограмиране

class << self
  speaker quot;Стефан Къневquot;
  speaker quot;Николай Бачийскиquot;
  on_date quot;20‐10‐2008quot;
end
lectures.last.recap
class Vector
  def initialize(x, y, z)
    @x, @y, @z = x, y, z
  end

 def length
   (@x * @x + @y * @y + @z * @z) ** 0.5
 end

  def to_s() “(#@x, #@y, #@z)” end
end

orientation = Vector.new 1.0, 0.0, 1.0
puts orientation.length
class Vector
  attr_accessor :x, :y, :z

  def initialize(x, y, z)
    @x, @y, @z = x, y, z
  end
end
class Vector

 def +(other)
   Vector.new self.x + other.x,
       self.y + other.y,
       self.z + other.z
 end

 def *(n)
   Vector.new @x * n, @y * n, @z * n
 end

end
class Fixnum
  alias broken_equal? ==

  def ==(other)
    if (self.equal?(0) and other.equal?(1)) or
         (self.equal?(1) and other.equal?(0))
      true
    else
      self.broken_equal?(other)
    end
  end
end
pesho = Coin.new 0.50

def pesho.pick_up(person)
  person.get_hopes_high
  person.humiliate
  person.make_sad
end
metaprogramming.inspect
class Student < ActiveRecord::Base
  validates_presence_of :name, :fn, :email
  validates_numericality_of :fn
  validates_email :email

 belongs_to :university
 has_many :grades
 has_many :courses, :through => :courses
 has_and_belongs_to_many :groups

  before_destroy do |student|
    InformationMailer.deliver_destroyed(student)
  end
end
html :xmlns => quot;http://www.w3.org/1999/xhtmlquot; do
  head do
    title quot;Registered studentsquot;
    style :type => quot;text/cssquot; do
      content quot;* { font‐family: Verdana; }quot;
    end
  end
  body do
    h1 quot;Registered students
    ul do
      @students.each do |student|
        li do
          p student.name
          unless student.url.nil?
            a quot;Personal websitequot;, :href => student.url
          end
        end
      end
    end
  end
end
class Person; end
class Programmer < Person; end
class Rubyist < Programmer; end

>> chunky = Rubyist.new
>> chunky.class
Rubyist
>> chunky.class.superclass
Programmer
>> chunky.class.ancestors
[Rubyist, Programmer, Person, Object, Kernel]
>> chunky.instance_of?(Rubyist), chunky.instance_of? Programmer
[true, false]
>> chunky.kind_of?(Rubyist), chunky.kind_of?(Programmer)
[true, true]
>> Rubyist < Person, Rubyist < Programmer, Person < Rubyist
[true, true, false]
respond_to?
class Vector
  def initialize(x, y, z) @x, @y, @z = x, y, z end
  def length() (@x * @x + @y * @y + @z * @z) ** 0.5 end
  def method_missing(name, *args)
    return Vector.new(‐@x, ‐@y, ‐@z) if name.to_sym == :invert
    super
  end
  private
    def sum() @x + @y + @z end 
end

>> vector = Vector.new 1.0, 2.0, 3.0
>> vector.respond_to? :length
true
>> vector.respond_to? :invert
false
>> vector.respond_to? :sum
false
>> vector.respond_to?(:sum, true)
false
class Vector
  attr_accessor :x, :y, :z
  def initialize(x, y, z) @x, @y, @z = x, y, z end
end

>> vector = Vector.new 1.0, 2.0, 3.0
>> vector.instance_variable_get :@y
2.0
>> vector.instance_variable_set :@y, 5.0
5.0
>> vector.instance_variable_get :@y
5.0
>> vector.y
5.0
>> vector.instance_variables
[quot;@zquot;, quot;@yquot;, quot;@xquot;]
public_methods(all=true)
protected_methods(all=true)
 private_methods(all=true)
         methods
>> vector = Vector.new 1.0, 2.0, 3.0
>> vector.methods
[quot;inspectquot;, quot;taguriquot;, quot;clonequot;, quot;public_methodsquot;, quot;taguri=quot;, 
quot;displayquot;, quot;method_missingquot;, quot;instance_variable_defined?quot;, 
quot;equal?quot;, quot;freezequot;, quot;methodsquot;, quot;respond_to?quot;, quot;dupquot;, 
quot;instance_variablesquot;, quot;__id__quot;, quot;methodquot;, quot;eql?quot;, quot;idquot;, 
quot;singleton_methodsquot;, quot;sendquot;, quot;lengthquot;, quot;taintquot;, quot;frozen?quot;, 
quot;instance_variable_getquot;, quot;__send__quot;, quot;instance_of?quot;, quot;to_aquot;, 
quot;to_yaml_stylequot;, quot;typequot;, quot;protected_methodsquot;, quot;instance_evalquot;, 
quot;object_idquot;, quot;require_gemquot;, quot;==quot;, quot;requirequot;, quot;===quot;, 
quot;instance_variable_setquot;, quot;kind_of?quot;, quot;extendquot;, 
quot;to_yaml_propertiesquot;, quot;gemquot;, quot;to_squot;, quot;to_yamlquot;, quot;hashquot;, 
quot;classquot;, quot;private_methodsquot;, quot;=~quot;, quot;tainted?quot;, quot;untaintquot;, 
quot;nil?quot;, quot;is_a?“]
>> vector.public_methods(false)
[quot;method_missingquot;, quot;lengthquot;]
method(:length)
>> v1 = Vector.new 1.0, 0.0, 0.0
>> v2 = Vector.new 0.0, 3.0, 4.0
>> length = v1.method(:length)
>> puts length[]
1.0
>> unbinded = length.unbind
>> unbinded.bind(v2)[]
5.0
Vector.instance_method(:length)
class Coin

 def initialize(value)
   @value = value
 end

  def pick_up(person)
    person.enrich self.value
  end

  def put_on_train_rail!
    self.flatten
  end
end

pesho = Coin.new 0.50
gosho = Coin.new 1.00
gosho
@value = 1.00         Coin
                 pick_up(person)
                put_on_train_rails()




   pesho
@value = 0.50
def pesho.pick_up(person)
  person.get_hopes_high
  person.humiliate
  person.make_sad
end

def pesho.flip
  :heads
end
singleton_methods
>> pesho.singleton_methods
[quot;pick_upquot;, quot;flip“]
gosho
@value = 1.00                       Coin
                               pick_up(person)
                              put_on_train_rails()




                 pesho` < Coin
                pick_up(person)
   pesho             flip()
@value = 0.50
def pesho.pick_up(person)
  person.get_hopes_high
  person.humiliate
  person.make_sad
end

class << pesho
  def pick_up(person)
    person.get_hopes_high
    person.humiliate
    person.make_sad
  end
end
class << pesho
  attr_accessor :value
  alias take_from_ground pick_up
end

>> pesho.value
0.50
>> pesho.take_from_ground(stefan)
:(
>> singleton_class = class << pesho
                       self
                     end
>> p pesho
#<Coin:0x3ec5cf4 @value=0.50>
>> p singleton_class
#<Class:#<Coin:0x3ec5cf4>>
>> p singleton_class != pesho.class
true
class Object
  def singleton_class
    class << self
      self
    end
  end
end

>> pesho.singleton_class
eval
>> x, y = 5, 10
>> code = quot;x + yquot;
>> sum = eval(code)
>> puts sum
15
>> eval quot;def square(x) x ** 2 endquot;
>> puts square(10)
100
instance_eval
>> v = Vector.new 1.0, 2.0, 3.0
>> v.instance_eval quot;@x + @y + @zquot;
6.0
>> v.instance_eval { @x + @y + @z }
6.0
class_eval
>> v = Vector.new 1.0, 2.0, 3.0
>> Vector.class_eval quot;def sum() @x + @y + @z endquot;
>> p v.sum
6.0
>> Vector.class_eval do
      def sum()
        @x + @y + @z
      end
    end
>> p v.sum
6.0
def add_name_method(klass, given_name)
  klass.class_eval do
    def name
      given_name
    end
  end
end

>> add_name_method(Vector, quot;I, Vectorquot;)
>> v = Vector.new 1.0, 2.0, 3.0
>> p v.name
undefined method `given_name' for Vector
define_method
def add_name_method(klass, given_name)
  klass.send(:define_method, :name) do
    given_name
  end
end

>> add_name_method(Vector, quot;I, Vectorquot;)
>> v = Vector.new 1.0, 2.0, 3.0
>> p v.name
quot;I, Vectorquot;
Module
namespace
  mix‐in
namespace
module PseudoMath
  class Vector
    def initalize(x, y) @x, @y = x, y end
  end

  def PseudoMath.square_root(number)
    number ** 0.5
  end

  PI = 3.0
end

puts PseudoMath::PI
height = PseudoMath::Vector.new 3.0, 4.0
puts PseudoMath::square_root(5)
puts PseudoMath.square_root(5)
mix‐in
module Debug
  def who_am_i?
    quot;#{self.class.name} (##{self.object_id})quot; +
       quot; #{self.to_s}quot;
  end
end

class Coin
  include Debug
end

>> coin = Coin.new
>> puts coin.who_am_i?
Coin (#33139900) #<Coin:0x3f35978>
>> pesho = Coin.new
>> pesho.extend(Debug)
>> puts Coin.who_am_i?
Coin (#33139900) #<Coin:0x3f35978>
Умни константи
module Unicode
  def self.const_missing(name)
        if name.to_s =~ /^U([0‐9a‐fA‐F]{4,6})$/
                utf8 = [$1.to_i(16)].pack('U')
                const_set(name, utf8)
        else
                raise NameError, quot;Unitinitialized constant: #{name}quot;
        end
  end
end


puts Unicode::U00A9
puts Unicode::U221E
puts Unicode::X
Генериране на XML
XML.new(STDOUT) do
 html do
     head do
          title { quot;Extrapolate mequot; }
     end
     body(:class => 'ruby')
 end
end
class XML
  def initialize(out, indent='  ', &block)
        @res = out
        @indent = indent
        @depth = 0
        self.instance_eval(&block)
        @res << quot;nquot;
  end

 def tag(name, attributes={})




 end
    ?
  alias method_missing tag
end
def tag(name, attributes={})
      @res << quot;<#{name}quot;
      attributes.each { |attr, value| @res << quot; #{attr}='#{value}'quot;}
      if block_given?
              @res << quot;>quot;
              inside = yield
              @res << inside.to_s
              @res << quot;</#{name}>quot;
      else
              @res << ' />'
      end
      nil
end
DSL RPG Иху‐аху
Game.new do
 pencho = Singlerich.new('Pencho')
 kuncho = Eigendiel.new('Kuncho')

 kuncho.knife pencho
 kuncho.bow pencho
 kuncho.sword kuncho
pencho.kick kuncho
puts kuncho.health pencho.health
end
class Eigendiel < Monster

 weapons :bow, :knife

 def after_bow(other)
     # special poison, doesn’t work on me
     other.hurt 2 if !other.equal?(self)
 end
end
class Singlerich < Monster

 weapons :knife, :sword, :kick

 def before_knife(other)
     # kicks at the same time
     kick other
 end
end
class Monster
  attr_reader :health, :name

  BASIC_DAMAGE = 11

  def initialize(name)
          @name = name
          @health = 100
  end

  def self.weapons(*weapons_list)




  end
      ?
  def hurt(amount)
          @health ‐= amount
          puts quot;#{@name} is a loser!nquot; if @health < 0
  end

end
def self.weapons(*weapons_list)
  weapons_list.each do |weapon|
    weapon = weapon.to_s
    define_method weapon do |whom|
      send quot;before_#{weapon}quot;, whom if self.class.method_def...
      whom.hurt BASIC_DAMAGE
      send quot;after_#{weapon}quot;, whom if self.class.method_def...
    end
  end
end
Game.new do
  pencho = Singlerich.new('Pencho')
  kuncho = Eigendiel.new('Kuncho')

 kuncho.knife pencho
 kuncho.bow pencho
 kuncho.bow kuncho

 chuck = Singlerich.new(quot;Chuckquot;)
 def chuck.explode(whom)
       whom.hurt 100
 end

  chuck.explode pencho
  chuck.explode kuncho
end

More Related Content

What's hot

Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
Remy Sharp
 
Basic articles of incorporation template free basic articles of incorporatio...
Basic articles of incorporation template  free basic articles of incorporatio...Basic articles of incorporation template  free basic articles of incorporatio...
Basic articles of incorporation template free basic articles of incorporatio...
Lloyd Peace
 
Vidéo approche en immobilier
Vidéo approche en immobilierVidéo approche en immobilier
Vidéo approche en immobilier
hervepouliot
 
Gaspard tutorial
Gaspard tutorialGaspard tutorial
Gaspard tutorial
pboulet
 

What's hot (20)

Javascript & jQuery: A pragmatic introduction
Javascript & jQuery: A pragmatic introductionJavascript & jQuery: A pragmatic introduction
Javascript & jQuery: A pragmatic introduction
 
PyCon Siberia 2016. Не доверяйте тестам!
PyCon Siberia 2016. Не доверяйте тестам!PyCon Siberia 2016. Не доверяйте тестам!
PyCon Siberia 2016. Не доверяйте тестам!
 
Testing and Testable Code
Testing and Testable CodeTesting and Testable Code
Testing and Testable Code
 
Theme verdadeiro
Theme verdadeiroTheme verdadeiro
Theme verdadeiro
 
Make your own wp cli command in 10min
Make your own wp cli command in 10minMake your own wp cli command in 10min
Make your own wp cli command in 10min
 
Hexadite Real Life Django ORM
Hexadite Real Life Django ORMHexadite Real Life Django ORM
Hexadite Real Life Django ORM
 
Shortcodes In-Depth
Shortcodes In-DepthShortcodes In-Depth
Shortcodes In-Depth
 
Web Security Mistakes: Trusting The Client
Web Security Mistakes: Trusting The ClientWeb Security Mistakes: Trusting The Client
Web Security Mistakes: Trusting The Client
 
What your testtool doesn't tell you
What your testtool doesn't tell youWhat your testtool doesn't tell you
What your testtool doesn't tell you
 
Worth the hype - styled components
Worth the hype - styled componentsWorth the hype - styled components
Worth the hype - styled components
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
 
Serverless Functions and Vue.js
Serverless Functions and Vue.jsServerless Functions and Vue.js
Serverless Functions and Vue.js
 
Basic articles of incorporation template free basic articles of incorporatio...
Basic articles of incorporation template  free basic articles of incorporatio...Basic articles of incorporation template  free basic articles of incorporatio...
Basic articles of incorporation template free basic articles of incorporatio...
 
[ HackFest.pl 2012] Testing - what for and how
[ HackFest.pl 2012] Testing - what for and how[ HackFest.pl 2012] Testing - what for and how
[ HackFest.pl 2012] Testing - what for and how
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
 
Vidéo approche en immobilier
Vidéo approche en immobilierVidéo approche en immobilier
Vidéo approche en immobilier
 
Writing DSLs with Parslet - Wicked Good Ruby Conf
Writing DSLs with Parslet - Wicked Good Ruby ConfWriting DSLs with Parslet - Wicked Good Ruby Conf
Writing DSLs with Parslet - Wicked Good Ruby Conf
 
Headless Js Testing
Headless Js TestingHeadless Js Testing
Headless Js Testing
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascript
 
Gaspard tutorial
Gaspard tutorialGaspard tutorial
Gaspard tutorial
 

Viewers also liked

Ecophon - Akusto - FR
Ecophon - Akusto - FREcophon - Akusto - FR
Ecophon - Akusto - FR
Architectura
 
Prueba
PruebaPrueba
Prueba
Itsaso
 

Viewers also liked (11)

Ciclo Sup. Mantenimiento de Instalaciones térmicas y de fluidos
Ciclo Sup. Mantenimiento de Instalaciones térmicas y de fluidosCiclo Sup. Mantenimiento de Instalaciones térmicas y de fluidos
Ciclo Sup. Mantenimiento de Instalaciones térmicas y de fluidos
 
Developing Data Analytics Skills in Japan: Status and Challenge
Developing Data Analytics Skills in Japan: Status and ChallengeDeveloping Data Analytics Skills in Japan: Status and Challenge
Developing Data Analytics Skills in Japan: Status and Challenge
 
Presentación estructura
Presentación estructuraPresentación estructura
Presentación estructura
 
Ecophon - Akusto - FR
Ecophon - Akusto - FREcophon - Akusto - FR
Ecophon - Akusto - FR
 
Guia argentina de tratamiento de la EPOC
Guia argentina de tratamiento de la EPOCGuia argentina de tratamiento de la EPOC
Guia argentina de tratamiento de la EPOC
 
Esencia y Estirpe de Bolívar y Sucre
Esencia y Estirpe de Bolívar y SucreEsencia y Estirpe de Bolívar y Sucre
Esencia y Estirpe de Bolívar y Sucre
 
Shiv Dhara Fabricators & Engineering, Ahmedabad, Conveyor Roller
Shiv Dhara Fabricators & Engineering, Ahmedabad, Conveyor RollerShiv Dhara Fabricators & Engineering, Ahmedabad, Conveyor Roller
Shiv Dhara Fabricators & Engineering, Ahmedabad, Conveyor Roller
 
Prueba
PruebaPrueba
Prueba
 
Milieu
MilieuMilieu
Milieu
 
Football Dbq
Football DbqFootball Dbq
Football Dbq
 
Ravi Demo
Ravi DemoRavi Demo
Ravi Demo
 

Similar to 4. Метапрограмиране

Building Web Interface On Rails
Building Web Interface On RailsBuilding Web Interface On Rails
Building Web Interface On Rails
Wen-Tien Chang
 
Rails 3 And The Real Secret To High Productivity Presentation
Rails 3 And The Real Secret To High Productivity PresentationRails 3 And The Real Secret To High Productivity Presentation
Rails 3 And The Real Secret To High Productivity Presentation
railsconf
 
Ruby 程式語言簡介
Ruby 程式語言簡介Ruby 程式語言簡介
Ruby 程式語言簡介
Wen-Tien Chang
 
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
Carles Farré
 
Solr and symfony in Harmony with SolrJs
Solr and symfony in Harmony with SolrJsSolr and symfony in Harmony with SolrJs
Solr and symfony in Harmony with SolrJs
Wildan Maulana
 
Система рендеринга в Magento
Система рендеринга в MagentoСистема рендеринга в Magento
Система рендеринга в Magento
Magecom Ukraine
 

Similar to 4. Метапрограмиране (20)

Merb jQuery
Merb jQueryMerb jQuery
Merb jQuery
 
Building Web Interface On Rails
Building Web Interface On RailsBuilding Web Interface On Rails
Building Web Interface On Rails
 
Secure Coding With Wordpress (BarCamp Orlando 2009)
Secure Coding With Wordpress (BarCamp Orlando 2009)Secure Coding With Wordpress (BarCamp Orlando 2009)
Secure Coding With Wordpress (BarCamp Orlando 2009)
 
Rails 3 And The Real Secret To High Productivity Presentation
Rails 3 And The Real Secret To High Productivity PresentationRails 3 And The Real Secret To High Productivity Presentation
Rails 3 And The Real Secret To High Productivity Presentation
 
Django - Framework web para perfeccionistas com prazos
Django - Framework web para perfeccionistas com prazosDjango - Framework web para perfeccionistas com prazos
Django - Framework web para perfeccionistas com prazos
 
Ruby 程式語言簡介
Ruby 程式語言簡介Ruby 程式語言簡介
Ruby 程式語言簡介
 
Impacta - Show Day de Rails
Impacta - Show Day de RailsImpacta - Show Day de Rails
Impacta - Show Day de Rails
 
What's new in Rails 2?
What's new in Rails 2?What's new in Rails 2?
What's new in Rails 2?
 
And the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportAnd the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack Support
 
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
[DSBW Spring 2009] Unit 07: WebApp Design Patterns & Frameworks (3/3)
 
Solr and symfony in Harmony with SolrJs
Solr and symfony in Harmony with SolrJsSolr and symfony in Harmony with SolrJs
Solr and symfony in Harmony with SolrJs
 
Ajax
AjaxAjax
Ajax
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Javascript Basic
Javascript BasicJavascript Basic
Javascript Basic
 
Exploiting Php With Php
Exploiting Php With PhpExploiting Php With Php
Exploiting Php With Php
 
Ajax On S2 Odp
Ajax On S2 OdpAjax On S2 Odp
Ajax On S2 Odp
 
Front End on Rails
Front End on RailsFront End on Rails
Front End on Rails
 
Couch Db.0.9.0.Pub
Couch Db.0.9.0.PubCouch Db.0.9.0.Pub
Couch Db.0.9.0.Pub
 
My First Rails Plugin - Usertext
My First Rails Plugin - UsertextMy First Rails Plugin - Usertext
My First Rails Plugin - Usertext
 
Система рендеринга в Magento
Система рендеринга в MagentoСистема рендеринга в Magento
Система рендеринга в Magento
 

More from Stefan Kanev

Behavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и CucumberBehavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и Cucumber
Stefan Kanev
 
5. HTTP и приятели
5. HTTP и приятели5. HTTP и приятели
5. HTTP и приятели
Stefan Kanev
 
3. Обекти и класове
3. Обекти и класове3. Обекти и класове
3. Обекти и класове
Stefan Kanev
 
1. Въведение в Ruby
1. Въведение в Ruby1. Въведение в Ruby
1. Въведение в Ruby
Stefan Kanev
 

More from Stefan Kanev (18)

Ruby 0 2012
Ruby 0 2012Ruby 0 2012
Ruby 0 2012
 
Ruby 0
Ruby 0Ruby 0
Ruby 0
 
Debugging Habits
Debugging HabitsDebugging Habits
Debugging Habits
 
Защо MongoDB?
Защо MongoDB?Защо MongoDB?
Защо MongoDB?
 
Как блогът ми ме направи по-добър професионалист
Как блогът ми ме направи по-добър професионалистКак блогът ми ме направи по-добър професионалист
Как блогът ми ме направи по-добър професионалист
 
Щастливият програмист 2.0
Щастливият програмист 2.0Щастливият програмист 2.0
Щастливият програмист 2.0
 
Пак ли този Rails?
Пак ли този Rails?Пак ли този Rails?
Пак ли този Rails?
 
The Happy Programmer
The Happy ProgrammerThe Happy Programmer
The Happy Programmer
 
ФМИ Python: Agile & Friends
ФМИ Python: Agile & FriendsФМИ Python: Agile & Friends
ФМИ Python: Agile & Friends
 
Behavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и CucumberBehavior-Driven Development с RSpec и Cucumber
Behavior-Driven Development с RSpec и Cucumber
 
Test-Driven Development + Refactoring
Test-Driven Development + RefactoringTest-Driven Development + Refactoring
Test-Driven Development + Refactoring
 
за Ruby
за Rubyза Ruby
за Ruby
 
Защо Ruby on Rails
Защо Ruby on RailsЗащо Ruby on Rails
Защо Ruby on Rails
 
5. HTTP и приятели
5. HTTP и приятели5. HTTP и приятели
5. HTTP и приятели
 
3. Обекти и класове
3. Обекти и класове3. Обекти и класове
3. Обекти и класове
 
2. Функционални Закачки
2. Функционални Закачки2. Функционални Закачки
2. Функционални Закачки
 
1. Въведение в Ruby
1. Въведение в Ruby1. Въведение в Ruby
1. Въведение в Ruby
 
0. За курса, Ruby и Rails
0. За курса, Ruby и Rails0. За курса, Ruby и Rails
0. За курса, Ruby и Rails
 

Recently uploaded

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
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
panagenda
 

Recently uploaded (20)

ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
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
 
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
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
"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 ...
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
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
 
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
 
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 ...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
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
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
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...
 
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
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 

4. Метапрограмиране