Erinevus lehekülje "Ruby" redaktsioonide vahel
(→Stringitöötlus) |
(→Jadatöötlus) |
||
212. rida: | 212. rida: | ||
"following cities:", | "following cities:", | ||
cities - visited | cities - visited | ||
+ | |||
+ | |||
+ | Suurima numbri leidmine jadast | ||
+ | |||
+ | [12, 47, 35].max | ||
+ | => 47 | ||
+ | |||
+ | Jada sorteerimiseks | ||
+ | |||
+ | jadanimi.sort! | ||
===Stringitöötlus=== | ===Stringitöötlus=== |
Redaktsioon: 4. juuni 2010, kell 13:18
Sisukord
- 1 Sissejuhatus
- 2 Ruby paigaldamine
- 3 Ruby dokumentatsioon
- 4 RubyGems
- 5 Programmeerimine Rubys
- 6 Ruby interpretaator
- 7 Ruby skript
- 8 Andmestruktuurid
- 9 Meetodid
- 10 Konsoolilt sisendi lugemine
- 11 Jadatöötlus
- 12 Stringitöötlus
- 13 Shelli värvid
- 14 failioperatsioonid
- 15 Klassi kirjeldamine
- 16 SMTP
- 17 Mysql andmebaasi kasutamine
- 18 PostgreSQL andmebaasi kasutamine
- 19 DNS
- 20 Soketi kasutamine
- 21 Ruby on Rails
- 22 Railsi logid
- 23 Kasulikud lisamaterjalid
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
Kiire interaktiivse ülevaate Rubys programeerimises leiab lingilt http://tryruby.org/
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
Suurima numbri leidmine jadast
[12, 47, 35].max => 47
Jada sorteerimiseks
jadanimi.sort!
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 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
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
- http://www.ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/index.html
- http://www.elctech.com/articles/ruby-daemons-and-angels ruby ja deemonid
- http://www.phptoruby.com/ php ja ruby süntaksi teisendused
- Learning Ruby (Michael Fitzgerald)
- Ruby Cookbook (Lucas Carlson, Leonard Richardson)
- http://rubyonrails.org/
- http://wiki.rubyonrails.org/
- http://www.humblelittlerubybook.com/
- Python
- http://lipsiadmin.com/
- http://www.ioncannon.net/programming/941/using-daemon-kit-and-robustthread-to-build-ruby-daemons/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+ioncannon+%28IONCANNON%29