Kategori arşivi: Ruby (Ruby on Rails)

Ruby ve RoR..

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

ÅžiÅŸirme Veri GiriÅŸi / Bulk Data Creation

Merhaba arkadaÅŸlar,

Bugün sizlerle acayip, acayip olduÄŸu kadar da zor bir konuyu paylaÅŸacaÄŸum. Son bir haftadır çalıştığım firmada ‘ÅžiÅŸirme Veri GiriÅŸi’ (Bulk Data Creation) ile uÄŸraÅŸmaktayım. Uzun bir süre deÄŸil mi ? evet uzun :) ama yapacak birÅŸey yok uzun sürüyor iÅŸte :)

Aklınızda hemen, bu konu neden önemli, üzerinde neden çalışıyoruz şeklinde sorular oluşabilir, oluşmalıdır da :) bu nedenle sizlere öncelikle müşterilerin şişirme veri girişini neden istediklerini izah etmeye çalışayım;
– Ä°lk örneÄŸimiz Microsoft’un Windows iÅŸletim sisteminden; iÅŸletim sistemine çok fazla program ekleyip kaldırdığımızda sistemin yavaÅŸladığını Registery dosyasının ÅŸiÅŸmesine baÄŸlarız. Zamanında Microsoft’da çalışan arkadaÅŸlar, bu durumu test etmemiÅŸ veya test etmiÅŸ fakat sonuçlarını dikkate almamışlar ki biz halen ‘Windows’u nasıl hızlı kurarım’ gibi iÅŸlerle uÄŸraşıyoruz.
– 3~5 yıldır kullanılan yazılımlarınızda, çok uyduruk iÅŸlemlerin bile artık çok fazla zaman aldığına ÅŸahit olabilirsiniz. Bunun nedeni baÅŸlangıç verinin çok küçük olacağını düşünüp, veri tabanında uygun indeksleri kullanmamız veya yazdığımız algoritmaların p = n^2 (buradaki ‘n’ veri adedi, ‘p’ performans) veya buna benzer bir ÅŸekilde çalışması olabilir. Örnek vermek gerekir ise; n = 1 ise, p = 1, n = 2 ise p = 4, n = 3 ise p = 9, n = 4 ise p = 16 olur… bu durumda 3~5 sene sonra n = 100 olduÄŸunda p = 10.000 olur ki… sistem artık çalışmıyor demektir. Elbetteki örnekler daha da arttırılabilir.

Akıllı yazılım müşterilerinin artık bu soruyu sormaya baÅŸlamalarının nedeni iÅŸte bunun gibi nedenler arkadaÅŸlar. Peki biz yazılımcılar bu durumda neler yapabiliriz. Aklınıza ‘Veri boyutu 2 katına çıkarsa sistemin bunu iÅŸleme süresi de 2 katına çıkar.’ gibi bir yaklaşım gelebilir. Bu yanlıştır, bu ÅŸekilde olmamalıdır. Günümüzdeki veri tabanı uygulamalarını akılcı kullanmak ve eÄŸer bu da yetmiyor ise, yazılıma arviÅŸleme yeteneÄŸi eklemek gerekir.

Veri tabanı performansı günümüzde çok büyük problemler teşkil etmemektedir. Asıl problem, programın yazıldığı algoritmanın ve yapılan dizaynın getirdiği kısıtlamalardır. İşte bu tür kısıtlamaları ve bunlara bağlı performans düşüşlerini daha rahat yakalamak için uzun vadeli çalışacak olan sistemlerde şişirme veri girişi(bulk data creation) işlemi ile beraber performans sınaması gerçekleştirilmelidir.

Evet tanımı yaptıktan sonra aklınızda oluşan bazı karışıklıkları gidermek gerekir. Öncelikle Örnek Veri Girişi ile Şişirme Veri Girişi arasındaki farkı sizlere tarif etmem gerekiyor. Örnek veri girişi; sistemin olanaklarını çok zorlamayacak şekilde, örnek teşkil edecek çoklukta veri girmektir. En fazla sistemde oluşabilecek bir aylık verinin oluşturulmasıdır. Şişirme Veri Girişi ise; Sistemde stres test yapmak ve data boyutlarının hangi sevilere doğru çıktığını, en kötü koşullarda veri tabanı üzerinde yapılacak işlemlerin veya yazılmış algoritmaların ne kadar süreceklerini görebilmek için yapılan işlemdir. Tahmini 2 veya 3 seneden daha az olmamak kaydı ile veri giriş yapılmalıdır. Diğer bir deyişle Örnek Veri Girişinin 30 veya 40 katı kadar veri girilmesi gerekir. Girilen bilgiler en az örnek veri girişinde olduğu kadar mantıklı ve kendi içerisinde tutarlı olmalıdır.

Bu aÅŸamadan sonra sizlere nasıl hızlı ve mantıklı ÅŸiÅŸirme veya örnek veri giriÅŸi nasıl yaparsınız onları tarif etmeye çalışacağım. Bu iÅŸlem için elbetteki Ruby’yi :) kullanacağız(.NET veya Java’yı da kullanabilirdik ama henüz onlarda bu iÅŸlemler kolaylaÅŸmadı.).

Bu iÅŸlemi Microsoft SQL Server için gerçekleÅŸtireceÄŸiz. Böylece Microsoft SQL Server için ActiveRecord baÄŸlantısını da incele fırsatı bulmuÅŸ oluruz. Öncelikle sizlere neden ActiveRecord kullandığımızı açıklamam gerekir, daha önceki ODBC yazılarımda (1,2,3,4) belirtiÄŸim kütüphane ile deÄŸilde, neden ActiveRecord ile gerçekleÅŸtiriyoruz. Çünkü ODBC düşük seviyeli bir baÄŸlantı prokolüdür. Fakat ActiveRecord yüksek seviyeli bir veri tabanı ile Ruby arasında bir eÅŸleme kütüphanesidir. Yani ActiveRecord’da veri tabanında bulunan tablolardan Ruby sınıfları oluÅŸturulabilir, bu sınıflar üzerinde ‘Insert’, ‘Delete’, ‘Update’ ve ‘Select’ gibi SQL iÅŸlemleri birkaç küçük hareket ile gerçekleÅŸtirilebiliriz. Fakat ODBC bize bu ÅŸekilde bir yardımda bulunmaz, aynı iÅŸlemleri ODBC kullanarak bizlerde gerçekleÅŸtirebiliriz, ama bunun için kod yazmamız gerekir ki :) tembel adamın istiyeceÄŸi en son ÅŸeydir :). Hazırı var iÅŸte ActiveRecord :). EÄŸer ActiveRecord üzerinde hoÅŸumuza gitmeyen bölümler olursa Ruby’nin esnekliÄŸinden faydalanarak bunları deÄŸiÅŸtirebiliriz. Ayrıca ActiveRecord, ODBC gibi bir baÄŸlantı kütüphanesi deÄŸildir, tek başına herhangi bir veri tabanına baÄŸlanamaz fakat ODBC, ADO, DBI, OCI gibi birçok baÄŸlantı kütüphanesini kullanabilir.
ÅžiÅŸirme Veri GiriÅŸi / Bulk Data Creation yazısına devam et

Ruby Bucak Semineri

Merhabalar,

GeçtiÄŸimiz hafta sonu çok güzel bir organizasyona katıldık. Bu güzel anı bizlerle paylaÅŸtıkları için organizasyonu düzenleyen çok deÄŸerli öğretim üyelerime ve katılımcılara çok teÅŸekkür ederim. Burdur-Bucak’ta gerçekten çok güzel, organize ve istekli insanlarla karşılaÅŸtık. Umarım bu istekleri devamlı olur, eÄŸitimlerini baÅŸarı ile tamamlar ve sektörde önemli yerlere gelirler. Tüm ihtiyaçlarının kendi ellerinde olduÄŸunu anladıklarını tahmin ediyorum.

Hüseyin GömleksizoÄŸlu ile beraber çıktığımız bu yolculukta, Hüseyin’in bazı çekinceleri ve şüpheleri vardı, ama sorunsuz bir yolculuktan sonra Bucak’a vardır.

Merak edenler olabilir hemen anlatayım; İstanbul-Bucak arası, uçak ve otobüs macerası :)
Ä°stanbul’dan 19:10’da kalkan Pegasus’a ait uçağımız saat 20:10’da Antalya havaalanına indi. Daha sonrasında HavaÅŸ’ın servisi ile Antalya’nın diÄŸer ucunda bulunan otobüs terminaline gittik, vardığımızda saat 21:15 idi. Ä°stanbul’dan yaptığımız telefon görüşmelerinde 20:00’dan sonra Bucak’a gidemeyeceÄŸimizi kesin bir dille söylemiÅŸlerdi. Ama benim gazımla beraber Hüseyin’de ikna olunca biz ÅŸansımızı denemeye karar vermiÅŸtik, terminale gittiÄŸimizde, 2. sorduÄŸumuz kiÅŸiden 18 ytl karşılığında saat 22:00 otobüsünde Bucak için bilet almıştık. Bu kadar kolay bulmamıza ÅŸaşırarak bileti hemen aldığımız için kendimize kızdık, hiç araÅŸtırmamıştık belki baÅŸka bir firmada 21:30 otobüsünde yer vardı :) neyse almıştık iÅŸte biletleri; saat 22:00’da otobüs kalktı ve saat 23:00’da Bucak’taydık.

Kısadan hisse durumuna indirecek olursak; tüm tur yetkililerinin veya otobüs iÅŸletmecilerinin o saatte gidemezsiniz dediÄŸi Ä°stanbul – Bucak arasını uçak + otobüs ile 4 saat gibi bir sürede katettik :) mutluyuz, gururluyuz :)

Ruby’nin Yeni Sürümü

Merhabalar arkadaÅŸlar,

Uzun süredir beklenen Ruby 1.8.6 sürümü nihayet duyuruldu. ruby-lang.org adresinden indirilebilir. Windows kullanıcıları için küçük bir not, bu yazı yazılırken henüz One-Click Installer güncellenmemişti, download esnasında dikkatli olunuz.

Gelen yeniliklere deyinecek olursak;

  • Artık Visual C++ 8 Sp1’de de Ruby’yi derleyebilirmiÅŸiz.
  • Date sınıfı güncellenmiÅŸ.
  • TK baÄŸlayıcısında (bindings) geliÅŸtirmeler yapılmış.
  • Kernel ve Module sınıflarına reflection’a yönelik yeni methodlar eklenmiÅŸ.
    – Kernel#instance_variable_defined?
    – Module#class_variable_defined?
  • Thread iÅŸlemleri, yeni bir yöntem kullanılarak, daha da hızlı hale getirilmiÅŸ.
  • Uzun süredir nokta bile eklenmeyen Webrick’de bazı geliÅŸtirmeler yapılmış.
  • Digest üzerine dosyalar üzerinde de iÅŸlem yapma yeteneÄŸi eklenmiÅŸ.
  • nkf de güncellenen sınıflar arasında yer almış.

DeÄŸiÅŸiklikler (Change Log) ve yenilikler ruby’nin resmi sitesinde de okunabilir.

Kolay gelsin :)

MapCache.rb – 2

Merhabalar arkadaÅŸlar,

Uzun bir aradan sonra tekrar berebariz. Aranızda hiç evlilik hazırlıkları yapan var mı ? Var ise halimden anlayacaktır, bu adam neden yazı yazmaz, bu süre içerisinde ne yapar gibi sorular soruyor olabilirsiniz. Ama bu aralar herÅŸey birbirleri ile sözleÅŸmiÅŸ gibi ardı arkasına yoÄŸunlaşıyor, yeni hareket alanları açılıyor..vs..vs. Bunların üzerine bir tutam, olmazsa olmaz, arkadaÅŸlarımın özellikle dostlarımın bu yoÄŸunluÄŸumdan ÅŸikayetçi olması eklenince, inanın tadından yenmez bir hal alıyor. Ama en çok ÅŸikayet eden benim ama duyan yok. Neyse her zamanki gibi, yoÄŸunluk can sıkıntısından iyidir. Sözleri ile bir önceki MapCache.rb – 1 (Detayları öğrenmek için lütfen tıklayın) adlı yazımızda baÅŸladığmız küçük yazı dizisini bitirelim.

Öncelikle bir önceki yazımıza yorum yapan Hüseyin GömleksizoÄŸlu’nun dediÄŸi gibi, MapCache uygulamamıza Threading ekleyelim ki, Http sunuculardan daha hızlı verileri alabilsin, çalışabilsin. Ãœstelik sizlere Threading ile ilgili gerçek hayat örneÄŸi verebilmek ise bu iÅŸin artısı olsun.

Yazımıza başlamadan önce bazı şeyleri belirtmem gerekiyor.
– Http sunucudan yaptığımız istek içerisinde yer alan v=w2.37 alanını v=w2.43 olarak deÄŸiÅŸtirmeliyiz. Muhtemelen bu bilgi version(sürüm) bilgisini taşıyor, bu nedenle bizim bu projeyi gerçekleÅŸtirdiÄŸimiz tarihlerde 2.37 olan sürüm 2.43’e çıkmış. Kodları güncellemek gerekir.
– MapCache.v3.rb uygulamasını denemek için MapCache.v3.rb’nin bulunduÄŸu klasörün içerisine sunucu_1, sunucu_2 ve sunucu_3 adlı klasörler açmalıyız. Bunun nedenini sizlere kodu verdikten sonra açıklayacağım.

$stdout.sync = true

require 'net/http'

proxy = nil
proxy_port = nil
port = 80

allThread = []

[1,2,3].each do |index|
	# Yeni bir Thread yaratılıyor, index -> ServerNo olarak
	# Thread-safe biçimde Thread içerisine aktarılıyor.
	thread = Thread.new(index) do |serverNo|
		httpObj = Net::HTTP.new("mt#{serverNo.to_s}.google.com", port, proxy, proxy_port)
		httpObj.start do |http|
			19000.upto(19125) do |x|
				12250.upto(12375) do |y|
					puts "X=#{x.to_s} Y=#{y.to_s}"
					resp = http.get("/mt?n=404&v=w2.43&x=#{x.to_s}&y=#{y.to_s}&zoom=2")
				   
					file_name = "sunucu_#{index}\\temp_#{x.to_s}_#{y.to_s}.png"
					open(file_name, "wb") { |file|
						file.write(resp.body)
					}
					puts "#{file_name} adlı dosya başarı ile yazıldı..!"
				end
			end
		end
	end
	# Yeni yaratılan Thread'in yönetilebilmesi için
	# allThread adlı diziye ekleniyor.
	allThread << thread
end
# Ana thread üzerinde, tüm Thread'lerin bitmesi için bekleniyor.
allThread.each { |thread| thread.join }

Programı çalıştırdığımızda 3 ayrı Http sunucusuna 3 farklı Thread kullanarak istek göndermeye başladığımızı göreceksiniz. Bu bizlere büyük ölçüde performans kazandıracaktır. Peki nasıl kazandıracak ? önceki MapCache sürümlerinde sadece bir Thread üzerinden 3 farklı sunucuya sırası ile erişip isteklerde bulunuyorduk, yani ben bir sunucudan veri alırken diğer sunucular işlem sırasının kendilerine gelmelerini bekliyorlardı, bu sürümde eklediğimiz Multi-Threading yapı ile artık bu bekleme sona erdi. Böylece işlem hızımızı arttırmış olduk.

MapCache uygulamasının (elbetteki bu yazı dizisi için) son sürümü olan v4 için yapacak tek bir şey kaldı. Hüseyin arkadaşımızın bir önceki yazıya yaptığı yorumda da belirttiği gibi sunuculardan verileri alırken problem yaşıyorduk, bu nedenle 3 farklı sunucudan veri almaya başladık ve bu verileri farklı klasörlere kayıt etmeyi başardık. Şimdi bize 3 farklı sunucudan gelen verileri yorumlayıp, kayıp verileri ayıklayan bir program bloğu daha gerekiyor. Ama bu programı melesef ben yazamıyorum. Umarım sizler yazıp bana gönderirsiniz. :) Elbetteki yazan kişinin adını ve notunu yayınlayacağım.

Kolay gelsin :)

MapCache.rb – 1

Merhaba arkadaÅŸlar,

Bugün sizlerle eskişehirde yaptığımız seminerde yapmayı planladığım fakat seminer saatlerinin değişmesi neticesinde tamamlayamadığım sunumun konularından birisi olan MapCache adlı küçük uygulamayı sizlerle paylaşacağım.

– MapCache nedir ?
– MapCache, Hüseyin GömleksizoÄŸlu‘nun “Nasıl yapsamda cep telefonumda varolan GPS uygulamasını internete (GPRS’e) bir dünya para vermeden (ücretsiz) kullansam ?” sorusu üzerine doÄŸmuÅŸtur. MapCache uygulamasının ilk versiyonu bu ÅŸekilde Hüseyin arkadaşımız tarafından yazıldı (Kendisinin söylediÄŸine göre kaynak olarak esiyo.net’i kullanmış :) ). Daha sonra, Hüseyin arkadaşımız uygulamayı bana ulaÅŸtırdı ve iyi olup olmadığı sordu, ben de birkaç deÄŸiÅŸiklik yapıp çok güzel olduÄŸunu belirttim ve kendisinden seminerde kullanmak için izin istedim. SaÄŸolsun izni verdi ve bu konuyu sizlerle paylaÅŸma fırsatı buldum.

MapCache uygulaması Ruby ile uygulama yazımını çok güzel ve mantıklı biçimde işlediği için anlatımı oldukça basit fakat sizlerin daha rahat anlamabilmesi ve benim belli konulara daha çok ağırlık verebilmem için uygulamayı adım adım oluşturacağız.
MapCache.rb – 1 yazısına devam et

Ruby EskiÅŸehir Semineri

Merhabalar,

Uzun süredir yazı yazmadım. Bu kadar sessiz kalmamın nedeni inanın tembellik deÄŸil. Tembel bir adam deÄŸilim (Bunu kendime uzun süredir söylüyorum, sanırım iyileÅŸme göstermeye baÅŸladım.:) ). Tam aksine çok çalışkan bir ruh hali içerisindeyim. Hatta ve hatta arada sırada çalışacağım diye kendimi paraladığımı bile düşünüyorum ama hemen bu düşünce aklımdan uzaklaşıyor.. az bile çalışıyorum… (Bunu da kendime uzun süredir söylüyorum :) )

Şimdi koltukta yer alan karpuzları sıralayalım;
– Taşındım.. Artık beylikdüzünde oturuyorum.
– Evlilik hazırlıkları içerisindeyim, inÅŸallah 5 mayısta evleneceÄŸim.
– Geçen hafta sonu EskiÅŸehir’de gerçekleÅŸen bu etkinlikte Ruby hakkında bir konuÅŸma yaptım.

Ehh tüm bunlar bu ay içerisinde başladı, bazıları bitti, bazıları devam ediyor. Durum böyle olunca pek yazı yazamadım. Sizlerden özür dilerim ama arayı kapatmaya gayret edeceğim, bilginize..

Eskişehir hakkında birşeyler yazacak olursam, gerçekleşen seminer oldukça güzeldi. Hüseyin ile beraber gerçekleştirdiğimiz bu seminerde organizasyonu yapan arkadaşlar önceden bizlere her birimizin 1,5 saatlik süresi olduğunu hatta ve hatta istersek uzatabileceğimizi belirtikten sonra, her ikimizinde 1,5 saat içerisinde bitirmesini istemek gibi gaddarca bir tutuma sahip olsa da seminer düzenleyicileri, bizler mutlu ayrıldık. Umarım seminerleri izlemeye gelen arkadaşlar da mutlu ayrılmıştır.

Fakat yiğidi öldürelim hakkını verelim. Çok çok iyi insanlarla tanışma fırsatı bulduğum için organizasyonu yapan arkadaşlara teşekkür etmem gerekir, iyi ki bu şekilde bir organizasyon yapmışlar.

Yaptığım konuşmanın tam metni yok, fakat dökümanları ve kullandığım küçük kod parçalarını ilerleyen günlerde yavaş yavaş yayınlamak istiyorum. Şimdilik sizlere Eskişehir notları başlığı altında örnekleri ve vakit darlığından sunamadığım sunumu vermek istiyorum.

İlerleyen günlerde bu döküman içerisinde yer alan bilgileri ve konuları daha direnlemesine inceleyeceğim.

Kolay gelsin :)

Ruby ile Reflection – 2

Merhabalar,

Bir önceki Ruby ile Reflection adlı yazımda anlatmaya baÅŸladığım Reflection konusunu, bu yazı ile bitiriyoruz. Önceki yazımda Reflection‘ın tanımı yapmış, yazılımcıların neden kullanmak istediklerini felsefik anlamda incelemiÅŸtik. Hatta tüm bunlar yetmemiÅŸ bir de kapsamlı bir örnek yapmıştım.

Bu yazıda biraz daha güncel hayat örnekleri ile beraber özellikle Rails’de bu iÅŸler nasıl yapılmış ona deÄŸineceÄŸim. Daha doÄŸrusu deÄŸinmeye çalışacağım.

Ä°lk olarak Ruby on Rails üzerinde Model kavramı ile çalışmaya baÅŸladığınızda ilk veya ikinci örnekte aÅŸağıda yer alan kod satırını görürsünüz. (Örnek; Agile Web Development With Rails’den alınmıştır.)
[ruby]
class Product < ActiveRecord::Base validates_presence_of :title, :description, :image_url end[/ruby] Bu örnekte validates_presence_of methodu ile title, description ve image_url bilgilerinin boÅŸ olamayacağını belirtmiÅŸ oluyoruz. Kodun yazım ÅŸekli biraz garip olabilir, ilk zamanlar (Ruby ile Reflection’ı öğrenmeden önce) bana garip gelmiÅŸti :)

Åžimdi bu yazım ÅŸekli de nereden çıktı diyeceksiniz, aslında çok basit; Ruby’de “:” iÅŸareti bir methodu veya deÄŸiÅŸkeni ifade etmek için kullanılır. Bu iÅŸaretle biz aslında o methodu veya deÄŸiÅŸkeni kullanmak istemediÄŸimizi sadece ifade etmek istediÄŸimizi belirtiyoruz. Eski dilde, tabir-i caiz ise adresini kullanıyoruz. Yani “:title” aslında “title” deÄŸiÅŸkenini ifade eder.
Ruby ile Reflection – 2 yazısına devam et

Ruby ile Reflection

Merhabalar,

Bu yazımızda Ruby üzerinde, daha önce yazmış olduğum Ruby ile Çalışma Zamanı ve nesneler aynı mı ? yazılarında az da olsa değindiğim fakat genel anlamı ile hiç ele almadığım Ruby ile Reflection konusunda yazmaya karar verdim.

Reflection tanım olarak, çalışma zamanında programda tanımlanmış nesnelere veya methodlara dinamik erişimi tarif eder.
Aşağı yukarı günümüzde tüm modern (hatta bazı klasik) programlama dilleri bu olguyu destekler. Ruby, çalışma ve tasarım zamanlarının birbirlerinden farklı olmaması nedeni ile Reflection olgusunu tüm yönleri ile destekler.

Günümüzde Reflection özelliği üzerine kurulu Reflective Programming adlı yeni bir yazılım geliştirme felsefesi de bulunmaktadır.

En temel anlamda düşünürsek, bir yazılımcı olarak yazdığınız program üzerinde %100 kontrol sahibi olmak isteriz. Tasarım zamanında (yani programı yazarken) elimizde olan bu gücü, çalışma zamanında da kendi yazdığımız diğer yazılımlar sayesinde (veya aracılığı ile) korumak isteyebiliriz. Reflection, tam bu esnada kullanmamız gereken teknolojinin adıdır.
Ruby ile Reflection yazısına devam et

Ruby ile GUI Toolkits (Tk)

Merhabalar,

Bugünkü yazımız ‘tk’ ile ilgili olacak. Aslında bu yazı ile beraber GUI Toolkits adlı yazı dizisinin sonuna gelmiÅŸ oluyoruz. Bu yazımda Tk’dan daha fazla, tüm kullanıcı grafik arabirimleri arasında karşılaÅŸtırmalar yapmak istiyorum. Öncelikle ‘Tk‘ konusunda bazı bilgileri sizlerle paylaÅŸalım. Tüm Ruby dağıtımlarında, varsayılan olarak Ruby/Tk baÄŸlayıcısı mevcuttur. Ama sadece baÄŸlayıcı(bindings) yetmez, Windows kullanıcıları için Tk’nın binary kütüphanesi varsayılan olarak gelmez. Bu nedenle ActiveState‘e baÄŸlı standart ActiveTcl ürünü ile bu kütüphaneyi ücretsiz elde edebilirsiniz. ‘Tk’ Windows, Linux ve Mac üzerinde sorunsuz çalışan bir kütüphanedir. Kendi görüntü teması mevcuttur GNOME, Fox ve wxWidgets gibi sistemlerin görüntü temaları Tk’dan daha güzel ve çeÅŸitli olabilir. Ruby One-Click Installer ile beraber gelen Programming Ruby(The Pragmatic Programmer’s Guide) adlı kitapta pek çok güzel örneklerle açıklanmış ve anlatılmıştır. Ä°ÅŸ bu nedenle (Ha..ha sanki resmi yazışma gibi oldu.. :p) herhangi bir örnek vermeyeceÄŸim. Aslına bakarsanız pek tavsiye ettiÄŸim bir kütüphane deÄŸil kendileri, Tk yerine FxRuby, WxRuby veya Gtk’nın kullanılması çok daha verimli ve kolay olur görüşündeyim. Özellikle Windows iÅŸletim sistemi için yapılacak basit uygulamalarda VisualuRuby(VRuby)‘nin kullanılmasını ÅŸiddetle tavsiye ederim.

Bu yazı dizisinin sonuçunu merak ediyorsanız, ‘diÄŸer kütüphanelerle uÄŸraÅŸmak istemiyorum’ ve ‘bana adam gibi bir kütphane tavsiye et, iyisi ile kötüsü ile kullanmak istiyorum’ diyorsanız. Önceki yazılarımda bahsettiÄŸim gibi WxRuby’den baÅŸlayabilirsiniz ;)

Kolay gelsin…

Ruby ile GUI Toolkits (Gtk)

Merhabalar,

Bu yazımızda konumuz GTK ile görüntü arabirimleri oluÅŸturmak. Öncelikle belirtmem gerekir ki, bu konu ile yazacağım yazıdan çok daha iyisi Pinguar tarafından seminer olarak verildi. Pdf’i buradan bilgisayarınıza yükleyebilir ve güzel güzel okuyabilirsiniz.
Aklınızdan şöyle bir soru geçebilir; “be adam, Pinguar konu ile ilgili güzel bir yazı yazmış diyorsun, ee peki sen neden bu yazıyı yazıyorsun…?”.. geçti deÄŸil mi ? Benim de geçti. Bu sorunun cevabı ise aslında çok basit, Pinguar çok güzel bir seminer vermiÅŸ (öyle duydum..) Ama pdf’in uzunluÄŸu 28 sayfa kadar, eee durum böyle olunca, sizlere Gtk ile ilgili ön bilgiler vermek ve küçük de olsa bir giriÅŸ yapmak bana kaldı. Ãœstelik Gtk’nın anlatılmadığı “Ruby ile GUI Toolkits” yazı dizisi düşünemiyorum doÄŸrusu.

Hemen küçük ön bilgiler ile konumuza bir giriÅŸ yapmaya çalışalım. Yazının yazıldığı sıralarda Ruby-Gtk2‘nin ‘0.16.0‘ sürümü duyrulmuÅŸtu. Bu proje isminden de anlaşılacağı gibi Ruby’nin yeni nesil GNOME 2.0 baÄŸlayıcısıdır. Proje içerisinde iki farklı paket bulunmaktadır;

  • Bunlardan ilki ‘ruby-gtk2‘ paketi. Bu paket içerisinde sadece standart grafik arabirim iÅŸlemleri destekleyici sınıflar içeren bileÅŸenler bulunur.
  • DiÄŸer ise ‘ruby-gnome2-all‘ paketidir. Bu paket, standart olarak kullanılan ‘ruby-gtk2‘ paketi üzerine çok yönlü ve birçok durumu destekleyen büyük bir mimari içerir.

Kurulum konusuna gelirsek, Gtk+, sadece Linux, FreeBSD ve Microsoft Windows işletim sistemleri üzerinde çalışır. Linux ve FreeBSD kurulumları oldukça basittir. Bu adreste yer alan bilgilerden faydalanılarak rahatlıkla kurulumu gerçekleştirilebilir.
Ruby ile GUI Toolkits (Gtk) yazısına devam et

Ruby ile GUI Toolkits (wxRuby)

Merhabalar,

Bu yazımızda Ruby ile GUI Toolkits baÅŸlattığımız yazı dizisine devam ediyoruz. Bugün WxRuby kütüphanesini inceleyeceÄŸiz. WxRuby kütüphanesi oldukça geliÅŸmiÅŸ olan wxWidgets kütüphanesi üzerine kurulu bir yapıdır. WxRuby Microsoft Windows, Mac OS X, Linux ve BSD üzerinde sorunsuzca çalışır. Kendisinin herhangi bir görüntü teması yoktur. Hangi iÅŸletim sistemine yüklenirse, o iÅŸletim sisteminin görüntü temasını kullanır. Hemen hemen tüm Ruby uygulamalarında olduÄŸu gibi gem ile kurulumu oldukça basit ve kolaydır. Aynı zamanda Python baÄŸlayıcısı da (wxPython) bulunan bu yapı, C++‘da yazılmış olan wxWidgets kütüphanesinden güçünü alır.
Windows, Linux ve Mac OS X için kurulumu; gem install wxruby2-preview ile gerçekleÅŸir… Linux ve Mac OS X’de ‘Super User(sudo)‘ ile bu iÅŸlem yapılmalıdır.

Öncelikle wxWidgets kütüphanesinin gerçekten çok güçlü olduÄŸu tekrar vurgulamakta fayda var. Bu bilgi ışığında WxRuby’nin önceki sürümlerinin çok kötü olduÄŸunu duymuÅŸ olabilirsiniz.. duymadıysanız ÅŸimdi duydunuz, gerçekten çok kötü idi. Bunun farkına varan sevgili yazılımcı kardeÅŸlerimiz, wxRuby2’yi ortaya çıkardılar ve geliÅŸtirmelerini bu yapı üzerinde yapmaya baÅŸladılar. WxRuby2, ÅŸu anda oldukça iyi durumda, yazılım geliÅŸtirme, biraz sonra örnekte de göreceÄŸiniz gibi, VRuby’den zor :) fakat FxRuby’den kolay. WxRuby‘nin genel aÄŸ adresinden daha fazla bilgiye ulaÅŸabilirsiniz.
Ruby ile GUI Toolkits (wxRuby) yazısına devam et