http://esiyo.net - uordek.essiyoo.each { |yazi| esiyo.net << yazi }

Archives Posts

Ruby ile Struct

May 23rd, 2007 by Tankut ŞENTÜRK

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 :)

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok » yapılmış.

Archives Posts

Ruby Yedekleme Sistemi Detayları

May 18th, 2007 by Tankut ŞENTÜRK

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.
Yazının devamı için »

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok » yapılmış.

Archives Posts

Ruby Backup (Rackup)

May 17th, 2007 by Tankut ŞENTÜRK

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 :)

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) 1 Yorum » yapılmış.

Archives Posts

Ruby ile konfigürasyon dosyaları (YAML)

May 15th, 2007 by Tankut ŞENTÜRK

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
Yazının devamı için »

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok » yapılmış.

Archives Posts

Ruby Zip Kütüphanesi (RubyZip)

May 14th, 2007 by Tankut ŞENTÜRK

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.
Yazının devamı için »

Bağlı olduğu kategoriler; Bilgisayar, Ruby (Ruby on Rails) Yorum yok » yapılmış.