Cuma, Mart 10, 2006

...Ruby

Sayın A.Murat EREN Ruby e ısınamadığından bahsetmiş. Olabilir... Ben Python'a çok hakim değilim ama birkaç Python denememin bana fazla tat vermediğini söyleyebilirim. Ruby de hergün biraz gelişiyorum ve temiz kodlamasından zevk alıyorum. O for ların sonuna end leri benim kodu daha rahat okumamı sağlıyor. Matz in Ruby i tasarlamadan önce Pythonu Perl ü Lisp i ve Smalltalk ı oldukça iyi incelediğini düşünürsek tasarım amacınında bu olduğunu tahmin ediyorum. Ama tabi ki kendisine de sorulabilir bu soru...

Ara ara burada yazdığım Ruby kodlarını yayınlayacağım. Daha önce yayınladığım bu küçük programa ek olarak 2 program daha geliyor... İlk programımız Ruby de thread lerin kullanımını gösteriyor.
=begin
Bir bankadaki müşteri ve memurların çalışma düzenleri simüle edilmistir. Bankadaki memur sayısı sabit tutulmus her thread in bir memuru temsil ettiği var sayılmıstır. Musteriler ise rastgele aralıklarla olusturulup musteri kuyruguna eklenmektedir.
=end
require "thread"
$global = 0 #global degisken

trap "SIGINT" , proc { # Programdan ctrl+c ile cikilması icin yordam düzenleniyor

puts "Su ana kadar " + $global.to_s + " musteriye hizmet verildi..."
exit

}

class Memurlar

def hizmet_ver (i)
sleep i # Musteriye Gore Degisen Hizmet Zamani
end
end

class Musteri

def zaman
return rand(5) # Musteri icin gereken islem zamani
end
end



def anaProgram
puts "Programdan çıkmak icin Ctrl ve C tuslarına birlikte basin"
sleep (5)

srand Time.now.to_i # Rastgele sayi üreteci baslatiliyor

memurlar = Memurlar.new #Yeni Memur nesnesi olusturuluyor
threads = [] #threadler dizisi hazırlanıyor

kuyruk = Queue.new # Musterilerin bekleme kuyrugunu temsil eder

musteriOlusturucu = Thread.new{ loop{

sleep rand(4) # Yeni musteri gelmeden gecen rastgele bekleme suresi
# Bu deger degistirilerek kuyruktaki musteri sayısı kontrol edilebilir

musteri = Musteri.new # Yeni musteri olusturuluyor
puts "Yeni Musteri Geldi Musteri No" + musteri.object_id.to_s
kuyruk << musteri # Musteri kuyruga ekleniyor
puts "Kuyrukta Bekleyen " + kuyruk.size.to_s + " Musteri Var"

}
}


3.times { |s| s += 1 # Memurları temsil eden 3 thread olusturuluyor

threads << Thread.new { loop{

musteriX = kuyruk.pop #kuyruktan yeni musteri cagiriliyor
i = musteriX.zaman # Musterinin hizmet zamanı alınıyor
puts "Memur" + s.to_s + " Hizmete Basladi Musteri Kodu" + musteriX.object_id.to_s
memurlar.hizmet_ver(i)
puts "Memur" + s.to_s + " in isi Bitti"
sleep rand(3) #Musteriler arasındaki bekleme suresi
$global += 1
}
}
}

threads.each { |aThread| aThread.join } # Threads dizisinde var olan threadler sırayla
# cagirilip aktive ediliyor

end


anaProgram # anaProgram calistiriliyor.

1 yorum:

Nightwalker dedi ki...

Eğer web programlama ile uğraşmak istiyorsanız öncelikle temel programlama bilgisini edinmenizde fayda var. Ruby bunun için iyi bir başlangıç olabilir. Yazımı temizdir. Öğrenmesi kolaydır. eğer ingilizcenizi yeterli görmüyorsanız programlama öğrenmeye java ile de başlayabilirsiniz. (Bora güngörenin java kitaplarını tavsiye ederim).

Yazdığım kodlara gelince Ruby de yazdığınız kodları RoR ile kullanabilirsiniz tabiki ancak bir iki ufak değişiklik gerekebilir. Örneğin programın başındaki ctrl+c kesmesini yakalayan kısım ve puts ile ekrana yazı yazan kısmı değiştirmeniz lazım.