Ruby

Allikas: Kuutõrvaja

Sissejuhatus

Ruby http://www.ruby-lang.org/ on populaare programmeerimikeel, millele on iseloomulikud sellised asjaolud

  • objekt-orienteeritud keel
  • skriptimskeel

2010 aastal on levinud kaks Ruby versiooni

  • 1.8 - ...
  • 1.9 - ...

Ruby paigaldamine

Debian Lenny paketihalduses on olemas kaks Ruby versiooni

  • 1.8.7 - vaikimisi
  • 1.9.0 - võimalik lisaks paigaldada

Ruby v. 1.8.7 paigaldmiseks sobib Debianis öelda (tegelik paketinimi on ruby1.8)

# apt-get install ruby

või FreeBSD puhul

# cd /usr/ports/lang/ruby18
# make install clean

Lisaks paigaldatakse pakett libruby1.8, mis sisaldab Ruby kasutamiseks vajalikke teeke, teegid kopeeritakse kataloogi

/usr/lib/ruby/1.8

Paigaldatud Ruby versiooni küsimiseks sobib öelda

$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]

Ruby paigaldamine RVMi abil

RVM on lühend mis tähendab Ruby Version Manager. RVM võimaldab käigupealt ja kergelt paigaldada, hallata ja vahetada Ruby versiooni olles seega asendamatu töömees arendajatele, kes testivad enda rakenduste tööd erinevate versioonidega. RVMi kasutamise üheks eelduseks on see, et süsteemi on paigaldatud curl.

RVMi paigalduseks tuleb anda käsk:

# bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

Misjärel tehakse kogu RVMi paigaldusprotsess automaatselt ära. RVMi kasutamiseks, näiteks Ruby 1.8 paigaldamiseks tuleb trükkida käsk:

# rvm install 1.8.7

Misjärel RVM paigaldab ja kompileerib Ruby koos kõikide sõltuvuste ja vajalike failidega, kaasaarvatud RubyGemsiga.

Peale versiooni paigaldust tuleb süsteemile öelda, et võtame uue versiooni kasutusele käsuga:

# rvm use 1.8.7

Sedamoodi võib otse "lennult" vahetada Ruby versiooni näiteks 1.8 ja 1.9 vahel. Nüüd võime paigaldada süsteemi ka teise versiooni:

# rvm install 1.9.2

Ning lülituda use võtme abil ümber hoopis sellele.

Rohkem infot leiab kodulehelt: http://beginrescueend.com/

Ruby dokumentatsioon

FreeBSDs paigaldatakse dokumentatsioon vaikimisi koos Rubyga. Debianis tuleb selle kasutamiseks paigaldada pakett ri

# apt-get install ri

ning nt Resolv teegi kohta info küsimiseks öelda

$ ri Resolv
---------------------------------------------------------- Class: Resolv
    Resolv is a thread-aware DNS resolver library written in Ruby.
    Resolv can handle multiple DNS requests concurrently without
    blocking. The ruby interpreter.

    See also resolv-replace.rb to replace the libc resolver with #
    Resolv.

    Resolv can look up various DNS resources using the DNS module
    directly.

    Examples:

      p Resolv.getaddress "www.ruby-lang.org"
      p Resolv.getname "210.251.121.214"

RubyGems

RubyGems on Ruby sisemine moodulite halduse süsteem. Gems süsteemi kasutamise kohta näeb näiteid öeldes

# gem help examples

Paigaldatud tarkvara nimekirja näeb

# gem list --local

Tarkvara paigaldamiseks sobib öelda nt

# gem install paketinimi

Tarkvara saab otsida öeldes

# gem search marksona --remote

Selle kasutamiseks on vajalik paigaldada pakett rubygems

http://docs.rubygems.org/read/chapter/2 lisalugemist

Programmeerimine Rubys

Ruby on

  • dünaamilise tüübiskeemiga (ingl. k. dynamically typed) keel - programmi käivitamisel ajal (ingl. k. runtime) toimub tüüpide üle otsustamine; st praktiliselt, et nt muutujate väärtustamisel ei pea nende tüüpe kirjeldama
  • nõrga tüübiskeemiga (ingl. k. weakly typed) keel - erinevat tüüpi muutujatega saab teha teatud operatsioone, nt liita arv ja sõne

Ruby on objekt-orienteeritud keel, st kõik Rubys on objektid, sh numbrid, nt avaldis esitab arvu viis meetodid

puts 5.methods

ja avaldis esitab arvu viis klassi

puts 5.class

Kiire interaktiivse ülevaate Rubys programeerimises leiab lingilt http://tryruby.org/

Ruby interpretaator

Ruby interpretaator (tõlgendaja) annab kasutajale võimaluse ruby koodi katsetada. Puuduseks on see, et funktsioonide defineerimisel tekkivad apsakad tulevad alles lõpus välja ning nende parandamine on aeganõudev.

Ruby interpretaatori paigaldamiseks tuleb Debian operatsiooni puhul öelda

# apt-get install irb

Interpretaatorit saab kasutada nt kalkulaatorina

$ irb
irb(main):001:0> 20.0/8
=> 2.5

või ka

$ irb
irb(main):001:0> require 'date'
=> true
irb(main):002:0> t2na = Date.today
=> #<Date: 4910765/2,0,2299161>
irb(main):003:0> sada_p2eva_hiljem = t2na + 100
=> #<Date: 4910965/2,0,2299161>
irb(main):004:0> t2na.to_s
=> "2010-07-05"
irb(main):005:0> sada_p2eva_hiljem.to_s
=> "2010-10-13"

Ruby skript

Ruby skript esineb tekstifaili kujul, nt selline skript kirjutab 'Hello, world'

puts "Hello, world!"

Skripti käivitamiseks sobib öelda

 $ ruby skript.rb

Alternatiiviks on lisada faili algusse rida interpretaatori nimega

#!/usr/bin/ruby
puts "Hello, world!"

ning muuta fail käivitatavaks

$ chmod 0755 skript.rb

või

$ chmod +x skript.rb

ning käivitada

$ ./skript.rb

Andmestruktuurid

TODO

Sõne

muutuja = "Tere hommikust!"

Sõne osa 'hommikust' poole saab pöörduda selliselt

muutuja[5..13]

Arv

muutuja = 5

Massiiv

Massiiv või ka jada (ingl. k. list) on järjestatud hulk

massiivinimi = ["yks", "kaks", "kolm"]

Massiivi elemendi poole pöördumine toimub selliselt

puts massiivinimi[1]

Tänu Ruby objekt-orienteeritusele saab kasutades massiivi meetodit each öelda nii

massiivinimi = ["yks", "kaks", "kolm"]

massiivinimi.each do |massiivielement|
  puts massiivielement
end
ary = [1, 2, 3]
puts ary[0]

Või keerukam näide

cities  = %w[ London
              Oslo
              Paris
              Amsterdam
              Berlin ]
visited = %w[Berlin Oslo]

puts "I still need " +
     "to visit the " +
     "following cities:",
     cities - visited

Viimases näites defineeritakse jada kiirmeetodil, kasutades %w tähist, kusjuures jada elemente ei pea jutumärkidesse panema.

Suurima numbri leidmine jadast

[12, 47, 35].max                                                     
=> 47  

Jada sorteerimiseks

jadanimi.sort!

Sõnastik

Sõnastik (ingl. k. hash) on key-value paaridest koosnev järjestamata hulk

 sonastik = { 'priit': 167, 'mart': 196 }

Sõnastiku elemendi väärtuse esitamine toimub nii

 print sonastik["print"]

Meetodid

Meetodid võimaldavad programmi teksti loogiliselt organiseerida, nt eraldada osa korduvaks kasutamiseks.

def korrutamine(x, y)
  return x * y
end

puts korrutamine(15, 3)

Teatud mõttes võib öelda, et tänu Ruby objekt-orienteeritusele on need asjad mis nö tavaliselt on funktsioonid Rubys meetodid.

Konsoolilt sisendi lugemine

print "Enter your name: "
name = gets

Stringitöötlus

herb = "parsley"
puts herb[0,1]
puts herb[0..3]

tulemuseks

p
pars


Mitu märki on stringis ?

"Jimmy".length

Stringi kordus

"Jimmy" * 5

Random funktsioon

puts rand(10)

saame suvalise numbri 0-10

for num in (0..100)
    print num,"\n"
end

Lihtne tsükkel nullist sajani

topelt tsükkel mis väljastab number ühtedest koosneva tabeli

  1.upto(10) do |fg|
    1.upto(10) do |bg|
      print "1"
    end
  puts
  end

Shelli värvid

puts " \e[32mROHELINE\e[0m"

värvitabel, asjalik-vajalik

[0, 1, 4, 5, 7].each do |attr|
  puts '----------------------------------------------------------------'
  puts "ESC[#{attr};Foreground;Background"
  30.upto(37) do |fg|
    40.upto(47) do |bg|
      print "\033[#{attr};#{fg};#{bg}m #{fg};#{bg}  "
    end
  puts "\033[0m"
  end
end
#!/usr/bin/env ruby
require 'pathname'
 Pathname.new($0).realpath()

Shellis parameetrina antavad argumendid

ARGV.each do|a|
  puts "Argument: #{a}"
end

Kasutamine

./arg.sh ahaa
Argument: ahaa

failioperatsioonid

Üldpõhimõte oleks

File.open("file", "r") do |io|
    # do something with io
end

Lihtne faili lugemine

print File.read("/comics.txt")

Avame faili ja loeme sealt infot

File.open("/location/of/my/file.txt", "r") do |f|
 while ! f.eof do
  line = f.gets
  puts line #Print the line to the screen
 end
end

Klassi kirjeldamine

class Arvutaja
  def meelespea
    puts "Monede tehete tulemus soltub jarjekorrast"
  end
end

class Liitja < Arvutaja
  def liitja
    puts "Liitmine ei soltu jarjekorrast"
  end
end

arvuta = Liitja.new
arvuta.meelespea
arvuta.liitja

kus

  • kirjeldatakse kaks klassi, Arvutaja ja Liitja
  • Liitja.new tekitab uue objekti 'arvuta'
  • arvuti.meelespea ja arvuta.liitja kutsuvad täitmiseks välja klassi meetodid meelespea ning liitja
  • klass Liitja pärib klassi Arvutaja meetodid, seetõttu on võimalik kasutada arvuta.meelespea'd mida otseselt ei ole kirjeldatud Liitja klassis
  • klasside nimesid on oluline alustada suure algustähega

SMTP

require 'net/smtp'

msgstr = <<END_OF_MESSAGE
From: Priit Kask <priit@loomaaed.tartu.ee>
To: Mart Kask <mart@loomaaed.tartu.ee>
Subject: kevad saabub, puurid puhtaks

Kirja sisu
END_OF_MESSAGE

smtp = Net::SMTP.start('192.168.1.250', 25, 'loomaaed.tartu.ee')
smtp.send_message msgstr, 'priit@loomaaed.tartu.ee', 'mart@loomaaed.tartu.ee'
smtp.finish

Mysql andmebaasi kasutamine

Ühendumine ja query päring

require 'mysql'

mysql = Mysql.init()
mysql.connect('localhost')

results = mysql.query("SELECT now();")

results.each{|row|; puts row;}

mysql.close()

Tabeli kustutamine, tekitamine ja sinna info lisamine

require 'mysql'

mysql = Mysql.init()
mysql.connect('localhost')
mysql.select_db('test')

mysql.query("DROP TABLE IF EXISTS rocks")

mysql.query("CREATE TABLE rocks (id INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), rockname CHAR(20) NOT  NULL);")

mysql.query("INSERT INTO rocks (rockname) values('Granite');")
mysql.query("INSERT INTO rocks (rockname) values('Coal');")
mysql.query("INSERT INTO rocks (rockname) values('Quartz');")

mysql.close()

PostgreSQL andmebaasi kasutamine

PostgreSQL andmebaasi saab Ruby seest kasutada mooduli ruby-pg abil.

Gemist installiks tuleb öelda

# gem install postgres

Debian Lenny keskkonnas sobib selleks paigaldada pakett

# apt-get install libpgsql-ruby

Skript küsib andmebaasist public.kasutajad tabelist kahte väärtust

require 'pg'
conn = PGconn.connect("192.168.1.247", 5432, , , "andmebaasinimi", "kasutajanimi", "parool")
res = conn.exec("SELECT nimi, vanus FROM kasutajad where nimi = 'Priit Kask';")

res.each do |rida|
  puts "Nimi: #{rida['nimi']}, vanus: #{rida['vanus']}"
end

res.clear
conn.close

Oracle andmebaasi kasutamine

Oracle andmebaasi saab Ruby seest kasutada mooduli ruby-oci8 abil. Paigaldamise ettevalmistamiseks tuleb

  • tekitada nö tavapärasel viisil Oracle_Instant_Client /opt/instantclient kataloog ning moodustada seal link
# ln -s libclntsh.so.11.1 libclntsh.so
  • paigaldada kompileerimiseks vajalikud paketid
# apt-get install build-essential python-dev libaio-dev
  • seadistada keskkonnamuutujad
# export LD_LIBRARY_PATH=/opt/instantclient
# export ORACLE_HOME=/opt/instantclient
# export TNS_ADMIN=/opt/instantclient

Gemist installiks tuleb öelda

# LD_LIBRARY_PATH=/opt/instantclient gem install ruby-oci8
Building native extensions.  This could take a while...
Successfully installed ruby-oci8-2.1.5
1 gem installed
Installing ri documentation for ruby-oci8-2.1.5...

Enclosing class/module 'cOCI8' for module Metadata not known
Installing RDoc documentation for ruby-oci8-2.1.5...

Enclosing class/module 'cOCI8' for module Metadata not known

Tulemuse küsimiseks sobib öelda

# gem list --local

*** LOCAL GEMS ***

ruby-oci8 (2.1.5)

Nt selline skript kirjutab tabelist t1 välja nö tulpade A ja B väärtused arvestades UTF-8 kodeeringut

$ cat skript.rb
require 'rubygems'
ENV['NLS_LANG'] = 'ESTONIAN_ESTONIA.AL32UTF8'
require 'oci8'
conn = OCI8.new('KASUTAJANIMI','PAROOL', 'SIDNIMI')
cursor = conn.exec('select A, B from t1')
while r = cursor.fetch()
puts r.join(',')
end
cursor.close
conn.logoff

Käivitamiseks öelda

$ ruby skript.rb > /tmp/valjund.txt

Kasulikud lisamaterjalid

DNS

Skript esitab domeeninimele vastavad ip aadressid

require 'resolv'

Resolv::DNS.new.each_address("www.loomaaed.tartu.ee") do |addr|
  puts "www.loomaaed.tartu.ee A kirje: " + addr.to_s
end

Soketi kasutamine

Server

require "socket"

ajaserver = TCPServer.new('192.168.10.35', 20000)
loop do
  Thread.start(ajaserver.accept) do |s|
    print(s, " on vastuvoetud\n")
    s.write(Time.now)
    print(s, " on teenindatud\n")
    s.close
   end
 end

kus

  • kasutatakse socket teeki
  • moodustatakse ajaserver nimeline objekt
  • käivitatakse loop korduse see uue lõime alustamine sissetuleva ühenduse tekkimsiele

Klient

require 'socket'
streamSock = TCPSocket.new( "192.168.10.35", 20000 )
str = streamSock.recv( 100 )
print str + "\n"
streamSock.close

Kasulikud lisamaterjalid