Aylık arşivler: Mayıs 2007

Ruby ile Struct

Merhaba arkadaÅŸlar,

Bugünkü yazımızda Struct ve OpenStruct yapılarından bahsedeceÄŸiz. “Bu yapılara neden ihtiyacımız var ?”, “Var olan ‘class’ yapısı veya bu iÅŸlemlere benzer olan ‘Array’ ve ‘Hash’ yapılarını neden kullanmıyoruz ?”, “Bu kadar fazla öğrenmemiz gereken sınıf, yapı ve iÅŸlev varken neden bir de başımıza bu ikisi çıktı ?”, ve son olarak “Ne iÅŸimiz var kardeÅŸim Struct ile falan, bunlar boÅŸ iÅŸ.. ne yapacan öğrenip de..!?” gibi soruları cevaplamak gerekir. Ama tüm bu sorulardan önce ben neden bu yazıyı yazıyorum onu anlatmalıyım sanırım. Bu yazıyı bu linkte yer alan bir yazıyı gördükten sonra yazmaya karar verdim. Bu yazıda blog sahibi arkadaÅŸ Ruby on Rails’de ActionMailler kullanımı sırasında kullanmış, çok da güzel kullanmış. Ben de kendi kendime ‘Ben de bunu bizimkilerle paylaÅŸayım’ dedim. Ä°yi ettim di mi ? ettim ettim.. :)

Hatta ve hatta çok da güzel bir snippet’da mevcut. Bir göz atmanızı tavsiye ederim.

‘Struct’ ruby içerisinde yer alan ‘Class’ benzeri bir yapı, aslında Class’dan türemiÅŸ farklı bir yapı. Şöyleki normalde yeni bir ‘class’ yaratmak istediÄŸimiz de

class YeniSinif
attr_reader ...
attr_writer ...
attr_accessor ...

def ...
end

...
end

ÅŸeklinde ‘YeniSinif’ı yaratır ve bu sınıftan nesneler üretmeye baÅŸlayabiliriz. Struct, sadece veri taşımak için tasarlandığı için ÅŸu ÅŸekilde bir tanımlamaya ihtiyaç duyar;

# Temel Struct tanımı...
Adres = Struct.new(:posta_kodu, :sehir, :ilce, :semt, :mahalle, :apt_no, :apt_isim, :daire)

anlaşılacağı üzere, herhangi bir ÅŸekilde eriÅŸim belirleyicisi tanımlanamaz (private, protected, public gibi) tüm üyeler public’dir. Önemle belirtmem gerekirki, bu yeni oluÅŸturduÄŸum ‘Adres’ bir nesne deÄŸildir, bir sınıftır yani yeni bir türdür(type). Peki biz neden ruby içerisinde yeni bir tür(type) yaratmak istedik ? Örnekten de anlaşılacağı gibi, normal hayatta adres bilgisinde posta kodu, ÅŸehir, ilçe…vb bilgiler birbirlerinden ayrılamazlar ve mantıksal anlamda da bir birliktelikleri vardır. Elbette kullanmazsak programlarımızda çok büyük problemler çıkmaz ama bazı durumlarda bize çok büyük kolaylıklar saÄŸlayabilir; örnek vermek gerekir ise; Struct kullanmadan adres yapısının kopyalanması;

yeni_posta_kodu = posta_kodu
yeni_sehir = sehir
yeni_ilce = ilce
yeni_semt = semt
...
...

peki Adres diye bir tür kullansaydık ve işlemleri bu tür üzerinden yürütseydik;

yeni_adres = adres.clone # Bu kadar.. :)

ÅŸeklinde küçücük bir kod parçası ile bu iÅŸlemi yapabilirdik. Peki hemen aklınıza gelebilir, zaten sınıf(class) yapısı mevcut ben struct yerine class kullanamazmıyım ? Elbette kullanabilirsin, class, struct’ın yapabileceÄŸi tüm özelliklere sahip temel ve en genel yapıdır. Struct sadece verileri tutmak için yapılmış ve bu iÅŸ üzerine yönelmiÅŸ class’ın alt sınıfıdır. Yukarıda da bahsettiÄŸim snippet incelenecek olursa, bu konu daha rahat anlaşılır diye tahmin ediyorum.

Peki “Struct sadece verileri tutmak için yapılmış ve bu iÅŸ üzerine yönelmiÅŸ class’ın alt sınıfıdır” dedik, bu veri tutma iÅŸinde bizlere hangi özellikleri vermektedir. Struct, class’lardan farklı olarak bizlere bir Array veya Hash nesnesine eriÅŸir gibi içerisinde yer alan özelliklere eriÅŸimimizi saÄŸlayabilir. Şöyleki;

adres = Adres.new()
# veya
# adres = Adres.new(34300, "Ä°stanbul", "Fatih", "CerrahpaÅŸa", "ZZZZ ZZZ ZZZZ ZZ", 1, "Gonca", 18)
adres.posta_kodu = 34300
adres.sehir = "Ä°stanbul"
puts adres[:posta_kodu] # 34300
puts adres["sehir"] # Ä°stanbul
puts adres[1] # Ä°stanbul
puts adres.members # üyelerin isimlerini verir.
puts adres.values # üyelerin değerlerini verir.

adres.each_pair do |key,value| 
	puts key.to_s + ":" + value.to_s
end

Bir sonraki yazımda OpenStruct’u anlatmaya çalışacağım… :)

Kolay gelsin :)

Ruby Yedekleme Sistemi Detayları

Merhabalar arkadaÅŸlar,

Bir önceki yazımda Ruby ile gerçekleştirdiğim yedekleme sisteminden bahsetmiş ve tanımlarının nasıl yapılması gerektiğini anlatmıştım. Bu yazımda ise kod bloğunu sizlerle paylaşarak bazı ipuçları vermek istiyorum. Böylece eğer isterseniz, uygulamayı kendinize göre değiştirmeniz daha kolay hale gelecektir.

Diğer tüm yazılarımda olduğu gibi hemen konumuza geçelim. Rackup.rb dosyasını parça parça işleyeceğiz.

$stdout.sync = true
require 'yaml'
begin
	require "zip/zip"
rescue Exception => err
	puts "Error: You should execute 'gem install rubyzip --include-dependencies' command, before run this program.."
	puts err.message
	exit
end

Bu bölümde, eÄŸer ‘rubyzip’ kütüphanesi yok ise, oluÅŸan hata program tarafından yakalanır ve kullanıcıya sorunu nasıl giderebileceÄŸi belirtilir.

begin
	config = YAML::load(IO.read(ARGV[0] || "rackup_config.yaml"))
rescue Exception => err
	puts "Error: Configuration file can not be found.."
	puts err.message
	exit
end

Bu bölümde ayar dosyası disk üzerinden okunmaya çalışılır.

IO.read(ARGV[0] || "rackup_config.yaml")

ARGV[0]: Gelen ilk parametre anlamındadır.
EÄŸer gelen bir parametre var ise onu, eÄŸer gelen herhangi bir parametre yok ise “rackup_config.yaml”yi yani standart ayar dosyasını kullanmasını söyler.

source_folder = config["source"]
source_include_sub_folders = (["true", "yes", "evet", "yeah", "y", "e", "1"].include?(config["include_subfolders"].to_s) ? true : false)
source_file_extension = config["file_extension"] || "*"

target_folder = config["target"]
target_prefix = config["prefix"]
target_postfix = config["postfix"]

bu bölümde ise ‘yaml’ içersinden yedekleme iÅŸlemi ile ilgili bilgiler okunur.

# Tüm evet anlamına gelen ifadeler kullanılmıştır..
(["true", "yes", "evet", "yeah", "y", "e", "1"].include?(config["include_subfolders"].to_s) ? true : false)

config[“include_subfolders”] bilgisine “true”, “yes”, “evet”, “yeah”, “y”, “e”, “1” bilgilerinden herhangi birinin yazılsının ‘true’ olacağını ifade eder.

source_files = nil
if source_file_extension.include?(",")
	source_files = File.join("**", "*.{#{source_file_extension}}")
else
	source_files = File.join("**", "*.#{source_file_extension}")
end

puts "Source dir is #{source_folder}"
puts "Target dir is #{target_folder}"
puts "File type is #{source_files.to_s}"

if File.directory?(source_folder) == false || File.directory?(target_folder) == false
	puts "Error: Source or target folder can not be found..!"
	exit
end

Bu bölümde ise birden fazla dosya uzantısı (file_extension) tanımlandı ise farklı bir takım işlemler yapar. Hedef ve kaynak dizin ile dosya uzantılarını ekrana yazar. Hedef ve kaynak dizinlerin varlığını kontrol eder.
Ruby Yedekleme Sistemi Detayları yazısına devam et

Ruby Backup (Rackup)

Merhaba arkadaÅŸlar,

Bu yazımda daha önceden de bahsetmiş olduğum ve son iki yazımda da alt yapısını oluşturduğum Ruby Backup (Rackup) uygulamasını sizlere tanıtacağım.

Öncelikle belirtmem gerekir ki; Bu uygulamayı ben kendim için geliştirdim, nedenlerini anlatayım;
– Paranoyaklığımdan ötürü (ve elbetteki kodları kaybetmenin mazereti olmayacağını bildiÄŸim için) kullandığım versiyon kontrol yazılımının yetmeyeceÄŸini, birgün bana inat çok önemli bir dönemde çökebileceÄŸini düşünerek yazdığım programların kopyasını almaya baÅŸladım.
– DiÄŸer neden ise tembelim.. evet evet tembelim, her seferinde klasörleri tek tek seçip sıkıştır daha sonra sıkıştırma iÅŸlemi ile oluÅŸturduÄŸun dosyayı nispeten daha güvenli olduÄŸuna inandığım bir aygıta kopyalamak yerine… :) oturdum bu iÅŸleri benim yerime yapacak Rackup uygulamasını geliÅŸtirdim. Ä°yi de ettim diye düşünüyorum. Hatta iÅŸ arkadaÅŸlarım kullanmaya baÅŸladılar bile. Elbette onlar için de birkaç geliÅŸtirme yapmak ve hata düzeltmek zorunda kaldım. ‘Bırak olduÄŸu gibi kalsın kardeÅŸim ne hatası ne düzeltmesi’ diyecek oldum.. ama diyemedim.. :D siz de demeyin. bulduÄŸunuz hataları bana iletin.. ben de sizlere peÅŸin peÅŸin teÅŸekkür edeyim :)

Neyse konuyu şimdiden uzattım bile. Hemen Rackup uygulamasının içeriğine başlayalım.
Öncelikle projenin dosyalarına buradan ulaşabilirsiniz.

Programı çalıştırabilmek için bazı işlemleri yerine getirmeniz gerekli, bunlar;

  • Ruby kurulu olmalı, ruby programları çalıştırabiliyor olmalısınız.
  • RubyZip kütüphanesi kurulu olmalı, eÄŸer deÄŸil ise, ‘gem install rubyzip –include-dependencies’ ile kurulabilir.
  • rackup_config.yaml dosyasının hazırlanması;
    • source: kaynak dizininin ve dosyaların bilgilerini taşır
    • include_subfolders: Kaynak dizinin yedeklenmesinde alt dizinler de dikkate alınacak mı?
    • file_extension: Kaynak dizinin altında yer alan hangi dosya uzantılı dosyaların yedekleri alınacak. EÄŸer belirtilmez ise tüm dosyaların yedeÄŸi alınır.
    • target: Hedef dizinin bilgilerini ve oluÅŸturulacak dosyanın bilgilerini taşır.
    • prefix: Sıkıştırılarak oluÅŸturulmuÅŸ dosyanın ön ekini belirtir.OluÅŸturulacak olan dosyanın yapısı [prefix][Tarihsel ayırac][postfix].zip ÅŸeklindedir. [Tarihsel ayırac] kısmı deÄŸiÅŸtirilemez, prefix ve postfix bölümleri deÄŸiÅŸtirilebilir.
    • postfix: Sıkıştırılarak oluÅŸturulmuÅŸ dosyanın son ekini belirtir.
    • Tüm özelliklerin kümesi bir örnekle example_config_file.yaml’de açıklanmıştır.
  • config dosyasında belirtilen target ve source dizinleri daha önceden yaratılmalıdır
  • Programın çalıştırılması Rackup.rb’nin çalıştırılması ile gerçekleÅŸir.
  • Rackup.rb çalıştırılırken eÄŸer parametre olarak herhangi bir ‘yaml’ dosyası verilmez ise, aynı dizindeki rackup_config.yaml dosyası config dosyası olarak alınır. EÄŸer parametre olarak herhangi bir config dosyası verilir ise örneÄŸin; “Rackup.rb example_config_file.yaml” ÅŸeklinde çalıştırılır ise ‘example_config_file.yaml’ içerisinde yer alan ayarlar ise iÅŸlemleri gerçekleÅŸtirir. Böylece birden fazla ‘cron’ veya ‘at’ veya ‘schedule job’ tanımlayarak istediÄŸimiz zaman istediÄŸimiz dizindeki, istediÄŸimiz dosyaların yedeklerini alabiliriz.

Bir sonraki yazımda Rackup.rb’yi daha detaylı bir ÅŸekilde açıklamaya çalışacağım.

Kolay gelsin :)

Ruby ile konfigürasyon dosyaları (YAML)

Merhabalar arkadaÅŸlar,

Bugünkü yazımızda ‘.yaml’ (YAML A’int Markup Language) uzantılı dosyalar nasıl okunur, nasıl iÅŸlenir gibi konuları ele alacağız. Bir önceki Ruby Zip Kütüphanesi adlı yazıda belirttiÄŸim Ruby Backup (Rackup) uygulaması için gerekli bir konu olduÄŸu için öncelikle bu konuyu inceleyeceÄŸiz.

Peki YAML dosyalarına neden ihtiyacımız var. XML ile bu iÅŸlem yapılamaz mı ? Elbette yapılabilir. Ama Ruby on Rails’de (RoR) veri tabanı baÄŸlantılarını kontrol eden dosya bir yaml dosyası ‘database.yaml‘. Neden ? Cevap; Okunabilirlik.

XML dosyalarına göre YAML dosyalarını deÄŸiÅŸtirmek, bazı durumlarda, çok daha kolay ve hızlı olabiliyor. Elbetteki bunun tersi durumlarda söz konusu fakat önemli olan alternatif olması ve bazı durumlarda da avantajının olduÄŸunun bilincine vararak kullanmak. Özellikle bir sonraki yazımda yazmayı planladığım Ruby Backup projesinde kullanıcıların fazladan herhangi bir bilgiye ihtiyaç duymadan bazı ayarları deÄŸiÅŸtirmeleri ve/veya eklemeleri gerektiÄŸinde kullanılabilirliÄŸi XML’den fazla olduÄŸu bir gerçek. Neyse lafı fazla uzatmadan hemen konumuza geçelim;

Kuruluma ihtiyacı yoktur. Ruby’nin çekirdek sınıfı içerisinde yer alır. Öncelikle YAML dosyaları neye benzer bir örneÄŸini verelim;

# Standart yorum satırı
kaynak:
  dizin: c:\Document And Settings
  alt_dizinler: yes
  dosya_uzantılari: doc,xls,txt,msg,html

hedef:
  dizin: c:\Backup
  ön_ek: Document
  son_ek: Office

Görüldüğü gibi türkçe karakterleri kullandık.. :) Yukarıda belirtiÄŸimiz dosyayı ‘config.yaml’ olarak bir dizine kayıt ettikten sonra, aynı dizinde
Ruby ile konfigürasyon dosyaları (YAML) yazısına devam et

Ruby Zip Kütüphanesi (RubyZip)

Merhabalar arkadaÅŸlar,

Uzun ama çok uzun bir aradan sonra tekrar merhaba :). Evlilik hazırlıkları, nikah sonrası dinlenme derken nihayet bugün ilk blog yazımı yazma fırsatı buldum. Öncelikle nikah törenimde beni yanlız bırakmayan tüm arkadaÅŸlara teÅŸekkürlerimi tekrar iletmek isterim. Gerçekten insan bu gibi günlerde etrafında arkadaÅŸlarını görmek istiyor. Åžimdi ben bu ÅŸekilde yazı yazdım ya.. gelemeyenleri hemen bir telaÅŸ almış olabilir :) merak etmesinler, korkacak birÅŸey yok hiç birini öldürmeyeceÄŸim… yani ÅŸimdilik :)

Lafı uzatmadan bu yazımızın konusu olan RubyZip’i (Ruby için sıkıştırma kütüphanesi) incelemeye baÅŸlayım. Kullanımı diÄŸer tüm Ruby kütüphaneleri gibi oldukça kolay olan bu sıkıştırma kütüphanesinin kurulumuda oldukça basit….
gem install rubyzip –include-dependencies
şeklinde kurulumu gerçekleştirililyor.
Ruby Zip Kütüphanesi (RubyZip) yazısına devam et