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…

Güzel, güneşli bir pazar günü..

Merhabalar,

Bugün çok güneşli, çok güzel bir gündü. Değil mi ? Öyle idi Öyle… Özellikle Asmalı mescit bÖlgesinde biz biraz üşüsekte asmakilit ile yaptığımız sıcak sohbet bizim ısınmamıza yetti de arttı bile. Ehh bu uzun ve güzel sohbetin sonlarına doğru güneşin kaybolması ile daha sıcak kısımlara geçsek bile, sohbetimizin dozu ve sıcaklığı hiç değişmedi, memleketi kurtardık, hastalıkları iyileştirdik, astıma, kansere, beyin tümÖrüne ve ‘aynştayn’ a çağre bulduk :). Furoyd’dan da bahsetmeyi ihmal etmedik. Felsefe yaptık, felsefe yapmayı tartıştık felsefe yaparken. Unutmadan ülkenin enerji problemlerinden, siyasi çÖzümlerden bahsettik.. şimdi düşünüyorum da futboldan konuşmadık :) iyi ki de konuşmadık.

Çok hoş bir sohbetti, asmakilit‘e kuçak dolusu sevgiler.

Kendinize iyi bakın :)

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.

C# SharpZipLib Örneği

Merhabalar,

Geçtiğimiz dÖnemde, var olan Attachment’ları “zip” ile sıkıştırıp kullanıcıya download ettirme gibi bir Özellik istendi. Hani bir benzeri ‘google’ da var ya işte o :). Güzel bir Özellik ama hepsi google’ın suçu rahat rahat yaymak varken, oturduk bununla uğraştık.

Üstelik .NET 2.0’da gelen sınıfın birden fazla dosyayı aynı output dosyası içerisinde birleştirme gibi bir Özelliği olmadığını Öğrenince daha bi moralim bozuldu ama yapacak birşey yok iş iştir :). Diyerek SharpZipLib adlı ‘Open Source’ bir kütüphane buldum. Aslına bakılırsa bayağı ünlü ve kullanılan bir kütüphaneymiş, üstelik iyi bir iş çıkarmışlar. Fakat bununla beraber hafızada hali hazırda yer alan stream’leri kullanan adam gibi Örnek de bulamadım. İyice uyuz oldum kısaca :). Ben uyuz oldum siz olmayın diye de bu yazıyı yazmaya karar verdim. İyi etmiş miyim :)

[csharp]
MemoryStream outStream = null;
try
{
outStream = new MemoryStream(); // Oluşturulacak output dosya memory’e yazılacağı için MemoryStream oluşturulur.
using (ZipOutputStream s = new ZipOutputStream(outStream)) // Bu outStream’e yazılacak olan ZipOutputStream oluşturulur.
{
s.SetLevel(0); // 0..9’a kadar değer alır, 0: Sadece aynı dosyaya koyma, 9: Yüksek seviyeli sıkıştırma

for (MyFile myFile in myFiles)
{
// Yeni bir Zip dosya parçası yaratılır.
ZipEntry entry = new ZipEntry(myFile.FileName);
entry.DateTime = myFile.UploadDt;
entry.Size = myFile.Size;
s.PutNextEntry(entry); // Yaratılan bu Zip dosya parçası, ‘s’ adlı output nesnesine verilir.

byte[] content = myFile.Content; // Content’ dosyanın byte’larının yer aldığı diziyi saklayan property’dir.
s.Write(content, 0, content.Length); // Dosya’dan okunan content bilgisi zip output stream’e yazılır.
}
s.Finish(); // Her zip output stream kapatılmak zorundadır. CRC kontrollerinde hata verebilir(miş).

s.Close(); // Kendisine constructor’da parametre olarak geçilen Stream üzerindeki lock’ı kaldırması için kullanılır.
}
// outStream.ToArray(); ile byte[] elde edilebilir ve istenildiği gibi kullanıcıya download ettirilebilir.
}
finally // Her durumda memory’de yer alan outStream’i kapatması istenir.
{
if (outStream != null)
outStream.Close();
}
[/csharp]

GÖrüldüğü gibi memory’de bu işlemleri yapmak son derece basit. Eğer bir dosyadan okuma ile bu işlemi yapacaksanız “buffer” mekanizmasını kullanmanızı yani, dosyayı küçük küçük parçalarla outputStream’e yazmanızı tavsiye ederim. Bu işlemde bu modeli kullanmamamın nedeni, zaten hafızada olan bir nesnenin küçük parçalar taşınmasının mantıksızlığından Ötürüdür.

Kolay gelsin :)

Ruby ile Veri Tabanı – 1 (ODBC)

Merhabalar,

Bir Önceki yazımda Ruby ile DB bağlantısının nasıl yapılabileceğine deyinmiş ve yollarını tarif etmiştik.

Bu yollardan en temel olanı Özellikle ‘Windows’ programcıları için ODBC bağlantısıdır. Bu kütüphane ‘One-Click Ruby Installer’ ile beraber kurulumu gerçekleşen bir kütüphanedir. Yani ekstra bir ayar gerektirmez. Fazla sÖzü uzatmadan, umarım iyi bir başlangıç olur dilekleri ile Örneğimize başlayalım.

Örneğimiz “Ms SQL Server” için olsun ve bağlantı işlemlerinden sorumlu olacak “DbTool” isimli bir sınıf kullanalım ki bağlantı işlemlerinin yorucu ve sıkıcılığından programımızı uzak tutalım. İşte bu “DbTool.rb” dosyası;
[ruby]
require “odbc”

# ‘ODBC::’ Ön ekini kullanmamak için module ‘include’ edilir.
# BÖylece ODBC::Driver.new yerine Driver.new kullanılabilir.
include ODBC

# ODBC kullanımı ile veri tabanına bağlantı.
class DbTool
attr_reader :drv

DRIVER = “SQL Server”
USERNAME = “kullanici_ismi”
PASSWORD = “kullanici_sifresi”
SERVER = “makina_adi”
DATABASE = “veri_tabani_adi”

# Veri tabanı bağlantısı için bilgiler alınır, parametreler opsiyoneldir, eğer girilmez ise hemen üstte tanımlanmış bilgiler
# kullanılır.
def initialize(database = DATABASE, server = SERVER, username = USERNAME, password = PASSWORD, driver = DRIVER)
@drv = Driver.new
@drv.name = “DbTool”
@drv.attrs[“driver”] = driver
@drv.attrs[“server”] = server
@drv.attrs[“database”] = database
@drv.attrs[“uid”] = username
@drv.attrs[“pwd”] = password
end

# Veri tabanına, sürücü kullanılarak bağlantı kurulur.
def connect()
unless @db
@db = Database.new
@db.drvconnect(@drv)
@db.ignorecase = false
@db.timeout = 3000
end
end

# İşlem bittiğinde veri tabanı kaynaklarını serbest bırakmak için kullanılır.
def disconnect()
if @db.connected?
@db.drop_all
@db.disconnect
end
end

# Eğer herhangi bir blok verilir ise ‘yield’ işlemi güvenli bir biçimde @db ile ilgili işlemler yapılır
# Eğer blok verilmez ise @db return edilir. Ve disconnect işleminin uygulanması çağıran kişiye bırakılır.
def getDb()

connect()
if block_given?
begin
yield @db
rescue Error => err
puts “Odbc error = ” + err + “\n” + err.backtrace.join(“\n”)
rescue Exception => err
puts “Standart error = ” + err + “\n” + err.backtrace.join(“\n”)
ensure
disconnect()
end
else
return @db
end
end
end
[/ruby]

Yukarıda gÖrmüş olduğunuz sınıf ile, veri tabanına güvenli bir bağlantı kurulabilir ve herhangi bir sql cümlesi çalıştırılabiliriz. Fazla lafı uzatmadan Örneğimize devam edecek olursak, ‘TestDbTool.rb’ dosyasi ise;
[ruby]
# Yukarıda yazdığımız DbTool.rb dosyası
require ‘DbTool.rb’

# DbTool sınıfında yazan varsayılan bağlantı parametreleri sürücü elde edilir.
myDriver = DbTool.new()

# Bu sürücü üzerinden belirtilen veri tabanına bağlantı kurulur.
myDriver.GetDb() do |db|
# ‘X’ ile başlayan tablolar alınır.
db.tables(“X%”).fetch_all.each do |table|
tableOwner = table[1]
tableName = table[2]
# Eğer bu tablo’nun yapımcısı ‘dbo’ ise alanları (field) ile beraber ekrana yazdırılır.
if tableOwner == “dbo” then
columnNames = []
db.columns(tableName).each do |column|
columnName = column[3]
columnNames.push(columnName)
end
p tableName
p columnNames
end
end
end
[/ruby]
şeklinde olmalıdır.

BÖylece TestDbTool.rb dosyasını çalıştırdığımızda bizi bağlandığı veri tabanında yer alan “X” ile başlayan tabloların isimlerini tüm alanları (field) ile birlikte ekrana yazar..

Bir sonraki yazıda ‘ODBC’ kütüphanesinin detaylarına gireceğiz.

Kolay gelsin :)

Ruby ile Veri Tabanı – Başlangıç

Merhabalar,

Bir Ruby yazısı ile daha beraberiz. Bu yazımızda Ruby’nin veri tabanlarına nasıl eriştiğini neler yapabildiğini inceleyeceğiz.

Açıkca sÖylemek gerekir ise, eğer RoR (Ruby on Rails) ile ilgilendiyseniz, ActiveRecord diye bir kütüphane kesinlikle duymuşsunuzdur. Bu kütüphane gerçekten çok güçlü ve Özellikle RoR ile program yazmak için oldukça müsait. Fakat yazılımcılar bazı gerekçelerle bu yapıyı kullanmak istemeyebilirler, bu gerekçelere Örnek olarak büyüklüğü, veri tabanına yaklaşım biçimi verilebilir. Bu tür nedenler de yapılacak işlerde problemler çıkarmasına, yazılımcıyı yavaşlatmasına neden olabilir. Bu nedenle alternatifleri bilmek gerekir.

Diğer bir alternatif ‘DBI’ kütüphanesidir, bu kütüphane ise, Perl üzerinden Ruby’e geçirilmiş oldukça esnek ve hoş bir yapıya sahiptir. DBI’ın en büyük Özelliği ise, veri tabanlarına başlanmak için ayrı bağlayıcılar kullanmasıdır. Bu nedenle DBI yazılmış olan kodlar Ms SQL Server ve/veya Oracle için farklılık gÖstermez. DBI’ın amacı da budur.

DBI’ın kullandığı veri tabanı sürücüleri; (Bu sürücüler hali hazırda aktif ve kullanılabilir olan sürücülerdir.)

DBD::ADO
DBD::Db2
DBD::Frontbase
DBD::InterBase
DBD::mSQL
DBD::MySQL
DBD::ODBC
DBD::Oracle
DBD::OCI8
DBD::Pg
DBD::Proxy
DBD::SQLite
DBD::SQLRelay

Bu veri tabanı sürücülerinden ODBC başlı başına bir yapıdır. Bu nedenle bir sonraki yazıda ‘ODBC’ bahsedeceğiz.

Özetlemek gerekir ise; Ruby’de veri tabanı bağlanmak için birçok kütüphane ve yol mevcuttur. Fakat bunların Öne çıkanları ActiveRecord (Özellikle RoR tarafından kullanılır), DBI ve/veya direkt olarak ODBC sürücüleri kullanılabilir.

Bir sonraki yazıda gÖrüşmek üzere :)

Emlak çılgınlığı

Bu aralar birçok televizyon kanalında ’emlak firmalarının’ reklamlarını gÖrmekteyim. Bir de bu yetmezmiş gibi, ana haber bültenlerine reklam mahiyetinde haber olarak da çıkmaya başladılar. Ehh bu işlerin biraz içerisinde olunca neyin reklam neyin haber olduğunu anlar olduk. TV kanallarında çalışan muhabir arkadaşların aldıkları maaş yetmediği için bu şekilde bir çÖzümle onlar para kazanıyorlar işte :| yazık.. yazık onlara, kazansınlar tabii.

Fakat bu şekilde haber(reklam) yapılınca kimi insanımız bunu doğru zannedebilir, ~1.8 ile kredi alıp, 12 ay sonra satarım, süper kar ederim diye düşünen akıllılar olabilir, o akıllıların dikkatine bir yazı yazayım dedim. İyi mi ettim bilemiyorum :).

Elbetteki bu yazıyı yaşadığım yer alan aziz :) İstanbul için yazıyorum.

Öncelikle 1-2 ay Öncesinde satışlar güzel güzel giderken çıkan haberlere gÖz atın, bu haberlerde emlak fiyatlarında bir şişiklik olduğu, yılbaşına kalmadan düşeceğini, Özellikle deprem beklenen bir dÖneme girildiğinde insanların depreme dayanıklı evlere yÖneleceğini fakat bu yÖnelmenin yatırım amaçlı olmayacağını sadece oturmak için emlak alımı yapılacağını, bu nedenle emlak fiyatlarında bir durulma ve/veya azalma beklenebileceği yazılırdı. Yada tam tersi yÖnermeler içeren yazılar olurdu ama bu yazılar reklam sayfalarının küçük sütünlarından seslenirlerdi okurlarına. Peki ne oldu da şimdi işler değişti ? Emlak sayfalarının küçük kÖşelerinde bu şekilde yazılar yazılırken, nasıl oldu da alım yÖnermeleri içeren haberler(reklamlar) yayınlanmaya başladı ?

Kış geldi ya.. ondan :)

Ruby on Rails’e başlamak..

Merhaba arkadaşlar, bir Önceki yazıma gelen bir (ve tek) yoruma dayanarak “Ruby on Rails” hakkında bir yazı yazmaya karar verdim. Öncelikle ülkemizde RoR (Ruby on Rails) ile yapılmış uygulamalara deyinmek isterim. Hazır yeri gelmişken, pilli network yÖneticilerini RoR’u fark etmeleri ve kullanmaları adına tebrik etmek gerekir. Özellikle sosyomat ve bildirgec gibi kendi takip ettiğim web sitelerin de RoR kullanılarak yapılmış olması ve Özellikle yeni mezun arkadaşların (tabii ki hepsi değil) nasıl yazılım geliştirilmelidir sorularına verdikleri içler acısı cevaplar neticesinde değinme gereği duydum. İşte Örnekler gÖzünün Önünde daha ne sorup diyorsun demekten kendimi alamıyorum :)…

Ayrıca tüm dünyada devam eden Ruby’mi Python’mı gibi saçma sapan yarışlara girecek enerjim ve vaktim olmadığından direkt olarak sade de geleceğim.. hatta çok bile uzattım.

Yazılımcı arkadaşlara tavsiyelerim;
– Yazılım geliştirirken herhangi bir framework kullanmayabilirsiniz. (Bilmiyorsanız “framework” kelimesi için wikipedia’ya bakın.) Evet, evet kullanmayabilirsiniz.. Ama sizin işiniz bu, eğer kendinize ‘ben yazılımcıyım’ diyorsanız, bu konuyu bilmeniz, hakkında fikir sahibi olmanız, en azından ‘Hello world’ dedirtmeniz gerekir. RoR framework ile yazılım geliştirme konusunda biçilmiş kaftandır.

– Bütün yazılımcılar arasında hatta, bütün dünyada insanların ağzında artık sakız olan MVC(Model-View-Controller) yazılım mimarisini Öğrenin. RoR, bu mimari ile yazılım geliştirmek için ideal bir araçtır.

– ‘Agile’, ‘Extreme’ ve ‘Test-Driven’ adlı yazılım geliştirme yÖntemlerini de Öğrenmelisin. Tüm bunlar RoR tarafından desteklenen yazılım geliştirme modelleridir.

– Bayrakçılık yapmamalısın, her sorunun çÖzümünde aynı araçı kullanmak, diş çekmek için ingiliz anahtarı kullanmak gibi olabilir, dikkatli olmalısın.

– RoR Öğrenmek için ise; “Agile Web Development With Rails” i tavsiye ederim. Fakat unutmayın RoR’un gücü Ruby’den gelir.. Eğer Ruby’i bilmiyorsanız. Önce Ruby’i Öğrenin.

Kolay gelsin.

Nesneler ayni mi ? (Ruby)

Belki daha sonra diğer dillerde de yapmaya çalışırım ama şimdilik sadece Ruby’de… Eğer sizlerden istek gelirse diğer dillerde de yazabilirim… Elbette eksikleri olabilir, yorumlarınız ile katkıda bulunursanız çok sevinirim.. :)Aslında yazıyı bitirdikten sonra kontrol ederken, bu yazının Ruby’nin çok güzel bir Özelliği olan “Module Mixin” yeteneği için de çok iyi bir yazı olduğunu fark ettim.. umarım bu açıdan da sizlere faydalı olur.
Öncelikle module mixin ile birçok yerde kullanmak üzere “ObjectDiffModule” adında bir modül içerisinde tüm kodlarımızı yazalım.. :) belki daha sonra bu modulü diğer sınıflar içerisinde kullanırız.
[ruby]
module ObjectDiffModule
attr_reader :objectDiffArray
# Standart hata cümlesi oluşturuluyor.
OBJECTDIFF_ERRORSTR = “Objects are not have same class type.”

def isPropertiesEqual(firstObject, secondObject)
# Yeni işlem için objectDiffArray bilgisi temizleniyor…
@objectDiffArray = Array.new()

# Her iki nesnenin property’leri alınıyor. Varsa @objectDiffArray değerleri temizleniyor.
firstVarList = firstObject.instance_variables
firstVarList.delete(“@objectDiffArray”)
secondVarList = secondObject.instance_variables
secondVarList.delete(“@objectDiffArray”)

# Performans amacı ile property dizilerinin eşit olup olması el ile kontrol ediliyor.
raise RuntimeError, OBJECTDIFF_ERRORSTR if firstVarList.size != secondVarList.size
firstVarList.size.times {
variable = firstVarList.pop
raise RuntimeError, OBJECTDIFF_ERRORSTR if variable != secondVarList.pop
firstValue = firstObject.instance_eval(variable)
secondValue = secondObject.instance_eval(variable)
@objectDiffArray.push( [variable, firstValue, secondValue] ) if firstValue != secondValue
}
return @objectDiffArray
end

def ===(secondObject)
return true if self == secondObject
isPropertiesEqual(self, secondObject).empty?
end
end[/ruby]
Daha sonra bu modülü kullanacak olan static bir sınıf yapmalıyız ki, modulü kullanmayan nesneleri birbirleri ile karşılaştırabilelim :)
[ruby]class ObjectDiff
include ObjectDiffModule
@@objectDiff = nil

private_class_method :new

def initialize() end

def ObjectDiff.isEqual(firstObject, secondObject)
return true if firstObject == secondObject
@@objectDiff = new unless @@objectDiff
@@objectDiff.isPropertiesEqual(firstObject, secondObject).empty?
end

def ObjectDiff.objectDiffArray
@@objectDiff.objectDiffArray if @@objectDiff
end
end[/ruby]
Bu yazdığımız modülü kendi sınıflarımız içerisinde de kullanabiliriz bÖylece yeni oluşturduğumuz sınıflar ObjectDiff Özelliklerini desteklerler :)
Örnek vermek gerekir ise;
[ruby]class SimpleClass
include ObjectDiffModule

attr_reader :myname, :address, :den1, :den2
attr_writer :myname, :address

def initialize()
@myname = “Tankut”
@address = “http://www.blogcu.com/uordek
@den1 = “aaaa”
@den2 = “bbbb”
@den3 = “aaaa”
end

public
def publicDene1() end
def publicDene2() end
def to_s()
super.to_s
end
private
def privateDene1() end
def privateDene2() end
def privateDene3() end
end[/ruby]
Bu kodları denemek için ise;
[ruby]fSimple = SimpleClass.new()
sSimple = SimpleClass.new()
sSimple.myname = “Sykai”
sSimple.address = “http://www.blogcu.com/Sykai
begin
p fSimple === sSimple
p fSimple.objectDiffArray
p sSimple === fSimple
p sSimple.objectDiffArray
p ObjectDiff.isEqual(fSimple, sSimple)
p ObjectDiff.objectDiffArray
rescue RuntimeError => err
p “Bunlar farklı… ” + err
end[/ruby]
Kolay gelsin..