Erinevus lehekülje "Ruby" redaktsioonide vahel

Allikas: Kuutõrvaja
(Jadatöötlus)
(Stringitöötlus)
216. rida: 216. rida:
 
  puts herb[0,1]
 
  puts herb[0,1]
 
  puts herb[0..3]
 
  puts herb[0..3]
 +
 +
tulemuseks
 +
 +
p
 +
pars
  
 
'''Random funktsioon'''
 
'''Random funktsioon'''
238. rida: 243. rida:
 
   puts
 
   puts
 
   end
 
   end
 
  
 
===Shelli värvid===
 
===Shelli värvid===

Redaktsioon: 4. juuni 2010, kell 12:54

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

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]

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

Stringitöötlus

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

tulemuseks

p
pars

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

Argumendid

#!/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

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

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

Ruby on Rails

Ruby on Rails on veebiarenduse raamistik ehk framework, mis kasutab programmeerimiskeelt Ruby.

http://kuutorvaja.eenet.ee/wiki/Ruby_on_rails

http://kuutorvaja.eenet.ee/wiki/Mod_rails

Paigaldamine

RoR paigaldamiseks sobib öelda Debian operatsioonisüsteemis

# apt-get install rails

Railsi gemist paigaldamiseks tuleb esiteks installida arvutiss ruby gems pakett ning seejärel vaadata mis versioon railsist on hetkel kõige viimane. Selleks tuleb anda käsk

# gem search rails --remote

Mis tekitab nimekirja railsi aktiivsetest versioonidest mida annab paigadada. Viimane versioon selle teksti kirjutamise hetkel on 2.0.2 nii ,et installime selle andes käsu

# gem install rails --version 2.0.2

Rakenduse tekitamine

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

Mudeli tekitamine

$ 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
=> true

>> result = Contact.find(:first)
=> #<Contact id: 3, first_name: "Priit", last_name: "Kask", address: "Loomaaia tee 1", \
  city: "Tartu", state: "TR", country: "Eesti", phone: "54331", email: "priit@loomaaed.tartu.ee">

>> puts result.first_name
Priit
=> nil

Lisaks annab kinnitust õnnestumisest, kui PostgreSQL andmebaasi vastavasse tabelisse on toimunud sissekanne.


Rakenduse startimine

seejärel stardime arenduseks vajaliku webrick serveri

# cd contactlist
# script/server -d -p 3000
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
[2008-01-08 18:27:50] INFO  WEBrick 1.3.1
[2008-01-08 18:27:50] INFO  ruby 1.8.6 (2007-09-24) [i386-freebsd7]

võti -p 3000 stardib veebiserveri pordile 3000 ning -d paneb tööle taustal, kasutades debumiseks on soovitatav see ärajätta

Nb! kui muudate database.yml faili tuleb veebiserverit taaskäivitada

nüüd peaksime enda projekti nägema aadressil http://www.nimi.ee:3000

Railsiveb.jpg

Kontrolleri tekitamine

Kontrolleri tekitamiseks sobib öelda

$ ruby script/generate controller Contact

Railsis on mudelid (model) ja controllerid (controller ) See kõik asub siis stiilis aadress/kontroller. Näiteks www.nimi.ee kuhu lõime hetk tagasi kontrolleri nimega katsetus. Kohe peale loomist oli www.nimi.ee/katsetus kättesaadav. Models on kasutusel kui sql andmete hoidjad, meil on kasutuses mudel nimega test. Raisi controlleri failis defineeritakse asju, mida sinna www.nimi.ee/test/? kohta panna äsjaloodud kontrolleril on seal näiteks index, aee on avaleht. Lisame näiteks indexile väikese teksti:

avame faili test/app/controllers/katsetus_controller kus asub class KatsetusControllerning tekitame sinna järgneva sisu

class KatsetusController < ApplicationController 

 def index
   render :text => "Hello world"
 end

end

ja liikudes urlile http://www.nimi.ee:8000/katsetus

peaksime nägema kirja "Hello world"

Railsi logid

Logid võivad railsil kasvada päris suureks seetõttu oleks mõistlik need roteerima panna

näiteks sobiks logrotate jaoks selline blokk

/www/projekt/rails/log/production.log {
   daily
   rotate 14
   size 5M
   compress
   create 640
   missingok
   # vaja ka teha railsile restart, kui see kasutuses Apache passenger moodulina siis näiteks selliselt
   touch /www/projektinimi/rails/tmp/restart.txt
 }

Kasulikud lisamaterjalid