Aylık arşivler: Mart 2007

Ä°stanbul Ãœniversitesi Ruby Semineri

Merhabalar arkadaÅŸlar,

24 Mart 2007 Cumartesi günü Ä°stanbul Ãœniversitesi Bilgisayar Programcılığı bölümünde, Hüseyin GömleksizoÄŸlu ile Ruby ve Ruby on Rails konuları hakkında seminer verdik. Her birimiz iki saatlik konuÅŸma yapacaktık, ben saat 13:00’dan baÅŸlayarak 2 saat boyunca genç yazılımcı arkadaÅŸlara Ruby ve yazılım dünyası hakkında seminer verdim. Benden sonra sözü alan Hüseyin arkadaşımız, sunumuna yeni baÅŸlamıştık ki, kısmetsizliÄŸi tuttu ve güvenlik görevlisi, bir terslik çıktığını ve 30 dakkika sonrasında bölümün kapatılacağını söyledi. Yazık oldu, çok yazık oldu. Genç arkadaÅŸların Ruby on Rails ile tanışamamaları gerçekten çok kötü oldu ama en azından varlığından, yazılımdan, yazılımcılıktan bahsetti Hüseyin arkadaşımız.

Kolay gelsin :)

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