Ruby (Ruby on Rails)

Ruby ile Başlangıç – Hata Yakalama – 2

Marhabalar,

Daha Önceki yazımızda belirttiğimiz hata yakalama sizlere yetmemiş olabilir. Bazı durumlarda tüm bu hata yakalama işlemlerinden daha sert bir şeye ihtiyacınız olabilir. İşte bu yazının yazılma nedeni bu :)

Bir Önceki yazımızda, diğer dillerde yer alan try..catch..finally kavramını tamamen destekleyen hatta fazlasını veren begin..rescue..else..ensure kavramı ile tanışmıştık. Daha fazla bilgi için.

Bu yazımızda daha Önceden de belirttiğimiz gibi daha sert bir kavramı inceleyeceğiz.
catch..throw
Hemen Örneğimizi verelim;
[ruby]
$stdout.sync = true
catch (:hata_test) do
begin
field = gets.chomp
throw :hata_test if field.index(“hata”) == 0
puts “Hata bulunamadı..”
end while 1 == 1
puts “Bu bÖlüm hiç işlenmeyecek.”
end
puts “Hata üretilmeden ‘catch’ bloğundan çıkıldı..”
[/ruby]
Ruby programınızı çalıştırırken, throw deyimine rastladığında, en yakın uyumlu* catch‘e kadar yukarı çıkar. Ve catch bloğunun işlenmesini sona erdirerek, bu bloktan sonraki kodları işlemeye başlar.

*throw deyimine parametre olarak bir deyim veya String verilebilir. Eğer bu parametre verilir ise, bu parametreye uygun olan catch yakalanmaya çalışır.

Eğer throw deyimi nedeni ile yukarıya doğru giderken herhangi bir catch bulunamaz ise, `in throw’: uncaught throw `hata_adı’ (NameError) şekilde bir hata ile programımız sonlanır.

GÖrüldüğü gibi, begin..rescue..else..ensure deyimi gibi, catch..throw deyimini çeşitlendirmek pek kolay bir yÖntem değil. Bu nedenle çok zorda kalmadığınızda kullanmayın. Ama sert ve keskin bir biçimde programın işlenmesini kesmek ve/veya yÖnünü değiştirmek istediğiniz kullanabilirsiniz.

Ruby ile Başlangıç – Hata Yakalama – 1

Merhabalar,

Ruby ile ilgili yeni yazıma başlamadan Önce, The Marmara Pera’nın üstünde bulunan dev ekrana pazar günü saat 22:00 gibi “When you see that I hope, you know I loved you” yazan, aşık arkadaşı tebrik etmek isterim. Ben gÖrdüm umarım gÖrmesini istediğin kişi de gÖrmüştür :)

Bugünkü konumuz başlıktan anlaşılacağı gibi durum kÖtü giderse yapılacak olan işlemler üzerine deyinmek olacak. Öncelikle geçmişten günümüze bu işler nasıl yapılıyordu inceleyelim. Aslında Önümüzde ik şeçenek mevcut bunlardan ilke biraz eski moda olan fakat halen kullanılan bir yÖntem olan geri dÖnüş değerini kullanmak;
Örnek vermek gerekir ise;
[ruby]
# BAD, VERY BAD CODE for Ruby
HATAYOK = 0
HATAILK = 1

def hataDon(no)
printf “İşlenen değer = %i\n”, no
if no == 0
return HATAILK
else
return HATAYOK
end
end

donenDeger = hataDon(15)
if donenDeger != HATAYOK
printf “Bir hata var numarası = %i\n”, donenDeger
end

donenDeger = hataDon(0)
if donenDeger != HATAYOK
printf “Bir hata var. Numarası = %i\n”, donenDeger
end[/ruby]
Fakat bu çok kÖtü bir yÖntemdir.. Lütfen bu şekilde kod yazmayın, yazıyorsanız hemen bırakın. Ruby programlama dilini bu şekilde kullanmak, mühendislik bilimine saygısızlık niteliğinde olabilir.
Continue reading…

Eclipse 3.3M4 Yayımlandı

Efsanevi editÖr Eclipse’in 3.3M4 versiyonu yayımlandı. Sanırım bir sonraki yayımlamada nihayi 3.3’ü duyuracaklar ama şimdilik M4 şeklinde yayımlanmış.
Yüklemek için windows sistemlerde bu, mac sistemlerde bu, linux sistemlerde de bu linki kullanabilirsiniz.

Bu habere ek olarak, eğer halen Eclipse ile tanışmadıysanız, tanışmanızı tavsiye ederim. Bu adresden 3.2 nihayi sürümüne ulaşabilirsiniz.

Özellikle RadRails ile RoR (Ruby on Rails) uygulamalarınıza başka bir anlam katan Eclipse’in yetenekleri RadRails eklentisi ile sınırlı değil elbetteki, SqlExplorer gibi eklentilerle veri tabanı işlemlerinizi editÖr değiştirmeden yapabilir ve Ruby’den tutun C/C++’a hatta ve hatta Action Script için bile eklentisi bulunan Eclipse ile tüm multi-lingual uygulamalarınızı tek editÖrden gerçekleştirebilirsiniz. Bence birçok bakımdan Microsoft’un Visual Studio 8.0’ından daha güçlü olan bu editÖrü denemeden diğer editÖrlere biraz mesafeli olun derim.

Kolay gelsin. :)

Ruby ile Başlangıç – Diziler

Ruby’nin en güçlü yanlarından biri dizilerdir. Dizilere erişim gerçekten çok rahat ve güçlüdür. Diziler C ve Java’da olduğu gibi ‘0’ tabanlıdır. Bazı Özelliklerine değinecek olursak;
[ruby]
# (“) isareti yerine baska bir isaret de kullanilabilir, (|) gibi.
%w”Uordek israf karsisinda deli olur”.each { |item|
p item
}
arr = Array.new # veya arr = []
newArr = [1,2,3]
15.downto(1) { |i|
arr.push(i)
}
p arr
arr.sort!
p arr
# Ortak elemanlari verir, tekrar eden elemanlari dikkate almaz.
p arr & newArr
p newArr.concat([4,5]) # newArr += [4,5]
p arr[-1] # Son elemanı verir.
p arr[-2] # Sondan bir Önceki elemanı verir.
p arr[2..5] # 2. sayi ile 5. sayi arasindaki sayilari verir. 2. ve 5. dahil.
p arr.at(2) # arr[2] ile aynidir. Fakat daha hizlidir,2..5 gibi degerleri desteklemez.
p arr.delete(10) # Degeri “10” olan elemani diziden siler.
p arr.delete_at(-3) # Sondan 3. elemani siler.
p arr.index(8) # Degeri 8 olan dizi elemanin hangi sirada oldugunu soyler.
p arr.length # arr.size, dizinin uzunlugunu verir.
p arr.push(16) # dizinin sonuna bir eleman ekler.
p arr.pop # Dizinin sonundan bir eleman cikarir.
p arr.reverse # diziyi ters cevirir
p arr.sort {|a,b| b <=> a } # dizi siralar iken, bizim kod yazmamiza izin verir.
p “Dizinin gercek hali..”
p arr
[/ruby]
Continue reading…

Ruby ile başlangıç – DÖngüler

Ruby ile Veri Tabanı serisi ve Ruby ile Resim İşlemleri yazılarının üzerine hiç yakışmıyor ama, yeni başlayanlar ve/veya Ruby ile çalışanlar için bazı ipuçlarıda barındıracak bir yazı yazmam istendi :) emir büyük yerden geldi Öyle bakmayın :)

Bu yazıdaki çerez konumuz ruby’de dÖngüler;
Standart bir dÖngü..

# 0'dan 14'e dÖngü
15.times { |index|
	p index
}

Biraz daha kompleks dÖngüler..
Continue reading…

Ruby ile Veri Tabanı – 5

Gelen yoğun istek nedeni ile :p şu veri tabanı yazılarıma devam etme gereğini duydum.. Ama bu sefer az laf çok kod şeklinde bir yazı yazacağım yoksa yazıların sonu gelmiyor :).

Önceki yazımızda “DbTool.rb” isimli çok güzel bir program parçası kullanmıştık, şimdi de onu kullanacağız.
[ruby]
require ‘DbTool.rb’
# Northwind veri tabanina baglanti kuruluyor.
NorthwindConn = DbTool.new(“Northwind”,”localhost”,”rubyuser”,”rubyuser”)

NorthwindConn.getDb() { |db|
# orderStmt içerisine select’den gelen CompanyName ve Total Amount bilgileri alinir.
# fetch_all islemi ile veri tabanindan baglanti koparilir.
orderStmt = db.run(“SELECT C.CompanyName, SUM(OD.UnitPrice * OD.Quantity) As ‘Total Amount’
FROM dbo.[Order Details] OD
JOIN Orders O ON O.OrderId = OD.OrderId
JOIN Customers C ON C.CustomerId = O.CustomerId
GROUP BY C.CompanyName”).fetch_all
# Sonuclar ekrana yazdirilir. puts, p ve ek olarak printf ‘C’ daki kullanimi ile :D
orderStmt.each { |row|
printf(“%s – %14.2f\n”, row[0], row[1])
}
}
[/ruby]
Yukarıdaki kod içerisinde Özellikle “printf” kullanımına vurgu yapmak isterim. “C” bilen arkadaşlar hemen uyum sağlayacaklardır.

Umarim veri tabanı işlemlerinde sizlere yardımcı olabilmişimdir. Ayrıca, bu Örnekle beraber arkadaşlar SQL ile ilgili sorular sormaya başladılar ki :) bir sonraki yazımızda belki bu konuya deyiniriz.
Uzman konularından başladım ama sanırım biraz başlara doğru dÖnsem iyi olacak..!

Kolay gelsin..

Ruby ile Resim İşlemleri

Ruby ile resim işlemleri (Image processing with Ruby) konusunda bir yazı yazma gereği hissetmemin nedeni, bazı arkadaşlarımın bana resim işlemlerinin nasıl olacağını sorması ve bununla beraber yüksek kaliteli ve bir klasÖr altındaki birçok resmin boyutlarını değiştiren bir programa (Multiple Image Resizer) ihtiyaç duymam oldu. Bu programa ihtiyaç duymamın rengi, arkadaşımın yeni aldığı dijital fotoğraf makinasının 3200×2400 çÖzünürlükte resimler üretmesi oldu. Her çekilen resmi aç, çÖzünürlüğünü (1/2 veya 1/4 oranında) değiştir, kaydet.. falan filan.. oooooo.. yazılımcı adam tembel olur, tembel adamda yaratıcı olur sloganıyla Ruby’de resim işlemlerine hakkında bir yazı yazmaya karar verdim.. İyi etmişmiyim gÖreceğiz :)

Öncelikle RMagicK kütüphanesinden bahsedelim biraz; Bu kütüphane ImageMagick® ve GraphicsMagick adlı kütüphaneler ile Ruby arasında bir kÖprü gÖrevi gÖren bir yapıdır. Bu her iki resim kütüphaneside oldukça profesyonel kütüphanelerdir ve birçok dile ve işletim sistemine aktarılmış halleri mevcuttur. Windows tabanlı sistemler için gem paketi bu linkte bulunur, bu paket içerisinde ImageMagicK’in derlenmiş halde gelir.

Windows bir sistem için kurulumu Özetleyecek olur isek;
Continue reading…

Ruby ile Veri Tabanı – 4 (ODBC)

Bir Önceki yazımızda artık ODBC modülü ile ilgili birçok sorumuza cevap bulmuştuk. Bu cevaplarla beraber bir iki adet faydalı Örnek de vermiştik.

Bugün çalışmalarımızı Örnekler üzerine yoğunlaştıralım ve Örnekleri detaylı bir biçimde inceleyelim.
Örnek-1
[ruby]require “DbTool.rb”

myDriver = DbTool.new()

myDriver.getDb() do |db|
tableArr = db.tables().fetch_all
tableArr.each do |table|
tblType = table[3]
tblName = table[2]
if tblType != “SYSTEM TABLE” && tblType != “VIEW” && tblName!= “dtproperties” then
count = db.run(“SELECT COUNT(*) FROM dbo.[” + tblName+ “]”).fetch_all
puts “Table = ” + tblName+ “(” + count.to_s + “)”
end
end
tableArr.clear
end[/ruby]
Yukarıda verilen Örnek-1’i incelemeye başlarsak; Öncelikle
Continue reading…

Ruby ile Veri Tabanı – 3 (ODBC)

Merhabalar,

Bir Önceki yazımızda ODBC nesnelerin temellerinden sÖz etmiştik. Bununla beraber çok kullanılan nesnelerin Önemli Özelliklerini Türkçe’ye çevirmiştik. Artık geriye sadece ODBC::Statement ve ODBC::ODBCProc’dan bahsetmek ve bir kaç Örnek yapmak kaldı.

Statement: Bu sınıf, ODBC modülü içerisinde tüm sorguların sonuçlarını temsil eder. Verilerinin taşındağı her durumda bu sınıf kullanılır. İyi bir hafıza kullanımı için Özellikle bu nesnenin ‘close’ ve ‘drop’ methodlarının kullanılması gerekir.
Daha da detaylandırmak istersek; ‘Statement’ nesnesini ‘Connected’ nesne olarak tanımlayabiliriz. Yani veri tabanına bağlı bir nesnedir, veri tabanı ile bağlantı kesilir ise içeriğindeki bilgiler kaybolur. Aynı anda birden fazla bağlı nesne tavsiye edilmemekte ve hatalara neden olmaktadır. Bu nedenle ‘fetch’ methodları ile veriler, veri tabanı bağlantısından bağımsız olarak işlemlere sokulabilir.

cancel: Yapılmakta olan işlemi iptal eder ve close işlemini uygular.
close: Sınıf üzerindeki değişiklikleri kapatır.
drop: close işlemini gerçekleştirir ve hafızayı boşaltır.
column(n): n. sırada yeralan alanın bilgilerini ODBC::Column tipinde verir.
columns(as_array=false): as_array false ise; Hash tipinde bir dizi dÖner. Bu Hash’ın key(anahtar) alanı alan adıdır, element(değer) alanı ODBC::Column tipindedir. as_array true ise, geriye ODBC::Column’lar ile dolu bir dizi dÖner.
ncols: Kaç adet alan olduğunu belirtir.
nrows: Kaç adet satır olduğunu belirtir.
fetch, fetch_first, fetch_scroll, fetch_many, fetch_all, fetch_hash: Bu methodların hepsi, verilerin bir dizi içerisinde Statement’ın içerisinden çıkarmaya yarar, bÖylece veri tabanı bağlantısından bağımsız olarak veriler üzerinde işlemler yapılabilir.
each{|row| block}: Dizilerde bulunan ‘each’ methodu ile aynı anlamda kullanılır, Statement’ın tüm satırlarını tek tek işlemek için kullanılır. Her satır için fetch işlemi yapılır.
execute([args…]): Geçilen parametrelerle hali hazırda bulunan Sql cümlesini birleştirir, oluşan Sql cümlesini icra eder.
run(sql[, args..]): Geçilen sql cümlesi ile, geçilen parametreleri birleştirir, oluşan Sql cümlesini icra eder.
prepapre(sql): Belirtilmiş olan Sql cümlesi ile Statement hazırlanır, Sql cümlesi icra edilmez.

Statement nesnesinide bu şekilde tanımladıktan sonra, sıra sizlere yardımcı olabileceğine inandığım ODBC::Column, ODBC::ODBCProc sınıflarından bahsetmeye geldi.

Column: Sonuçların geldiği veri tabanı alanları ile ilgili olarak detaylı bilgileri barındırır. Örneğin; name, table, length, nullable, searchable, unsigned, precision, scale, type, autoincrement alanları mevcuttur.

ODBCProc: Database::proc methodu ile yaratılabilen bu nesne bizlere büyük esneklikler vaad ediyor aslında. Bu method ile beraber herhangi bir Sql cümleri parametric olarak tanımlanabilir ve birden fazla kez istenildiği şekilde parametreler ile icra edibilir. ŞÖyleki;
Continue reading…

Ruby ile Veri Tabanı (ODBC) – 2

Merhabalar,

İlk yazımızda Ruby veri tabanı bağlantılarını incelemiş, bir Önceki yazımızda ise ODBC ile veri tabanı bağlantısı gerçekleştirmiş ve ufak tefek işlemler yapmıştık. Şimdi ise Ruby’de ODBC hakkında daha detaylı bilgiler aktaracağız. Fazla lafı uzatmadan konumuza geçelim. Ön bilgi olarak bu adresden module dÖkümantasyonuna ulaşılabileceğinizi de belirtmem gerekir.

Ruby ODBC bir modül içerisinde yer alır. Bu modülün adı ODBC’dir ve aşağıdaki kodlar ile kullanılabilir.
[ruby]
require ‘odbc’
# include’u kullandığımızda, ODBC::Driver yerine Driver kullanabiliriz.
include ODBC
[/ruby]
Bu ana modül içerisinde connection_pooling, datasources, drivers gibi methodların yanı sıra date, time alanları ile ilgili methodlar da mevcuttur. Bu methodların tanımlarını Türkçe’ye çevirmek gerekir ise;
datasources: Bilinen veri kaynaklarının isimlerini dizi olarak verir.
drivers: Bilinen veri sürücülerinin isimlerini dizi olarak verir.
error: Son hata mesajını barındırır.
info: Son uyarı mesajını barındırır.
clear_error: Son hata ve uyarı mesajlarını temizler.
raise: ODBC::Error sınıfından bir hata’yı fırlatmak için kullanılır. (throw)
newenv: Yeni bir bağlantı ortamı dÖner.
connection_pooling: Tüm işlem bazında bağlantılar havuzunun oluşturulup oluşturulmayacağını belirtir.
connect: dns, user ve password bilgileri ile veri tabanına bağlanır ve gereye bu veri tabanını gÖsteren bir ODBC::Database nesnesi dÖner.

İncelemekte olduğumuz ODBC modülü içerisindeki sınıf yapısı şu şekildedir.
Ruby ODBC Sınıf yapısı
Şekilden de anlaşılacağı gibi, ‘Object’ sınıfı ODBC modülünde temel sınıf olarak gÖrev yapmaktadır. Error ve ODBCProc’u bu yapının dışında tutulmuştur. Environment, Database ve Statement arasında bir miras alma ilişkisi mevcuttur.

Temel sınıflara deyinecek olursak;
Environment: Veri tabanına bağlanılacak olan ortamı temsil eder. Kısaca ODBC::Database nesnelerini gruplamak için kullanılır. Buna ek olarak Transaction işlemlerini yÖnetmek gibi bir gÖrevi de vardır. Methodlarını Türkçe’ye çevirmek gerekir ise;
commit: Başlatılmış olan işlem kümesini olumlu sonuçlandırır ve kayıt işlemi yapar.
rollback: Başlatılmış olan işlem kümesini olumsuz sonuçlandırır ve kayıt işlemlerini iptal eder, yapmaz.
transaction: İşlem kümesini başlatır. Herhangi bir kod bloğu alarak çalışır, kod bloğunda bir hata olursa rollback işlemini gerçekleştirir, kod bloğu içerisinde herhangi bir hata oluşmaz ise, commit işlemi gerçekleştirilir.

Database: Veri tabanını temsil eder. Tüm veri tabanı işlemleri bu sınıf üzerinde yapılabilir. Tüm veri geri dÖnen methodları ODBC::Statement geri dÖner. Üzerinde bir çok method bulunur, bu methodlardan Önemli olanları Türkçe’leştirmek gerekir ise;
connected?: Bağlı olup olmadığı bilgisi.
drvconnect(drv): Bağlantı esnasında kullanılanılacak Driver(sürücü) bilgisi.
disconnect(no_drop=false): Bağlantıyı sonlandırır, eğer no_drop true verilir ise, bu nesne kullanılarak yaratılmış olan tüm ODBC::Statement‘lar drop edilmeden bağlantı kesilir. Diğer durumda tüm aktif ODBC::Statement‘lar drop edilir.
newstmt: Herhangi bir SQL hazırlamadan veya çalıştırmadan yeni bir ODBC::Statement verir. Bu işlem ile ODBC:Statement.set_option kullanarak Özel opsiyonlarla herhangi bir SQL cümlesini çalıştırmanıza olanak verir. Bu method’un dışında boş ve veri tabanına bağlı ODBC::Statement elde etmenin herhangi bir yolu yoktur.
tables([pattern]), columns, indexes, primary_keys, foreign_keys, table_privileges, procudures, special_columns, get_info: Bu method’lar isimlerinden de anlaşılacağı gibi, veri tabanında verinin saklanması ile ilgili bir takım Özel alanları bize verirler. Tüm method’lar geriye bir ODBC::Statement dÖner.
run(sql[,args…]): Verilen sql cümlesini, ‘args’ parametreleri ile hazırlar ve çalıştırır, dÖnüş değerini bir ODBC::Statement ile bize verir. ‘Select’ cümleleri için idealdir.
do(sql[,args…]): Sql cümle hazırlanması ‘run’ ile aynıdır, fakat geriye sadece kaç adet kayıtın etkilendiğini belirten bir sayı dÖner. Özellikle ‘Insert’, ‘Update’, ‘Delete’ cümleleri için tasarlanmıştır.
prepare(sql): Sql cümlesini içeren bir ODBC::Statement geri dÖner.
get_option(option), set_option(option, intval): Veri tabanın opsiyonlarına, ayarlana erişim sağlar. Tüm optiyonların listesi şu şekildedir; SQL_AUTOCOMMIT, SQL_CONCURRENCY, SQL_QUERY_TIMEOUT, SQL_MAX_ROWS, SQL_MAX_LENGTH, SQL_NOSCAN, SQL_ROWSET_SIZE, SQL_CURSOR_TYPE.
autocommit[=option]: İşlem kümelerinin otomatik doğrulanıp ve kayıt edilmesine olanak verir. Destekleyen veri tabanlarında.
drop_all: Kendisinden alınmış olan tüm açık ODBC::Statement’ları düşürür.

Bir sonraki yazımızda, bu tanımları Örneklerle beraber açıklayacağım.

Kolay gelsin.