Erinevus lehekülje "Ruby" redaktsioonide vahel

Allikas: Kuutõrvaja
(Ruby on Rails)
P (Ruby on Rails)
427. rida: 427. rida:
 
  => #<Contact id: nil, first_name: nil, last_name: nil, \
 
  => #<Contact id: nil, first_name: nil, last_name: nil, \
 
   address: nil, city: nil, state: nil, country: nil, phone: nil, email: nil>
 
   address: nil, city: nil, state: nil, country: nil, phone: nil, email: nil>
 +
 +
>> my_contact.first_name = 'Priit'
 +
=> "Priit"
 +
>> my_contact.last_name = 'Kask'
 +
=> "Kask"
 +
>> my_contact.address = 'Loomaaia tee 1'
 +
=> "Loomaaia tee 1"
 +
>> my_contact.city = 'Tartu'           
 +
=> "Tartu"
 +
>> my_contact.state = 'TR'
 +
=> "Tartu"
 +
>> my_contact.country = 'Eesti'
 +
=> "Eesti"
 +
>> my_contact.phone = '54331' 
 +
=> "54331"
 +
>> my_contact.email = 'priit@loomaaed.tartu.ee'
 +
=> "priit@loomaaed.tartu.ee"
 +
 +
>> my_contact.save
  
 
===Kasulikud lisamaterjalid===
 
===Kasulikud lisamaterjalid===

Redaktsioon: 3. märts 2010, kell 14:02

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 öelda (tegelik paketinimi on ruby1.8)

# apt-get install ruby

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 dokumentatsioon

Ruby dokumentatsiooni kasutamiseks tuleb 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"

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

Ruby interpretaator

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

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

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 (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

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

Jadatöötlus

ary = [1, 2, 3]
puts ary[0]
cities  = %w[ London
              Oslo
              Paris
              Amsterdam
              Berlin ]
visited = %w[Berlin Oslo]

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


Stringitöötlus

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

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

#!/usr/local/bin/ruby
  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()
#!/usr/bin/env ruby
ARGV.each do|a|
  puts "Argument: #{a}"
end
./arg.sh ahaa
Argument: ahaa

failid

File.open("file", "r") do |io|
    # do something with io
end
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

PostgreSQL andmebaasi kasutamine

PostgreSQL andmebaasi saab Ruby seest kasutada moodili ruby-pg abil, 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

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

RubyGems

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

# gem help examples

Tarkvara paigaldamiseks sobib öelda nt

# gem install paketinimi

Tarkvara saab otsida öeldes

# gem search marksona --remote

Ruby on Rails

Ruby on Rails (RoR, ingl. k. Ruby reilssidel) on ...

RoR paigaldamiseks sobib öelda Debian operatsioonisüsteemis

# apt-get install rails

RoR rakenduse tekitamiseks tuleb

  • tekitada rakendusele vastav kataloogistruktuur
$ rails -D postgresql contactlist
  • tekitada andmebaas, nt PostgreSQL
create table contacts (
id serial not null,              
first_name varchar(100)  not null,
last_name  varchar(100)  not null,                     
address    varchar(255)  not null,                              
city       varchar(100)  not null,                                       
state      varchar(2)    not null,                                                
country    varchar(100)  not null,
phone      varchar(15)   not  null,
email      varchar(100) ,
CONSTRAINT pk_id PRIMARY KEY (id)
);

ning kohendada baasi ligipääs seadistusfailis

config/database.yml

Nt selliselt

development:
  adapter: postgresql
  encoding: unicode  
  database: contactlist_development
  username: contactlist
  password: parool
  host: 192.168.1.247 
  port: 5432
...
  • tekitada mudel
$ ruby script/generate model Contact
  • Veenduda, et mudelit saab Rails konsoolilt kasutada
$ ruby script/console
Loading development environment (Rails 2.1.0)
>> my_contact = Contact.new
=> #<Contact id: nil, first_name: nil, last_name: nil, \
  address: nil, city: nil, state: nil, country: nil, phone: nil, email: nil>
>> my_contact.first_name = 'Priit'
=> "Priit"
>> my_contact.last_name = 'Kask'
=> "Kask"
>> my_contact.address = 'Loomaaia tee 1'
=> "Loomaaia tee 1"
>> my_contact.city = 'Tartu'            
=> "Tartu"
>> my_contact.state = 'TR'
=> "Tartu"
>> my_contact.country = 'Eesti'
=> "Eesti"
>> my_contact.phone = '54331'  
=> "54331"
>> my_contact.email = 'priit@loomaaed.tartu.ee'
=> "priit@loomaaed.tartu.ee"

>> my_contact.save

Kasulikud lisamaterjalid