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.
Birinci adımda MapCache emekleme aşamasında;
MapCache emekleme aşamasında, bazı bilgilere ulaşılmış ve bu bilgiler kullanılmaya başlanmıştır. Öncelikle bizlere haritaları indirebileceğimiz, ücretsiz yayın yapan bir firma gerekiyor. Hüseyin arkadaşımız bu konuda Google’ı tercih etmiş, eh ben de bu tercihe sadık kaldım. İsterseniz sizler bu tercihi değiştirebilirsiniz elbetteki.
[ruby]# Ekrana yazı yazma işlemin buffer kullanmaması için
$stdout.sync = true
# Kullanılacak olan kütüphane,
# Google haritalarını Http protokolü ile ücretsiz açıyor.
require ‘net/http’
# Eğer internete Proxy üzerinden çıkıyor isek
# bu ayarların değiştirilmesi gerekir.
proxy = nil
proxy_port = nil
port = 80
# mt1, mt2, mt3 google’ın harita sunucuları
[“mt1.google.com”,”mt2.google.com”,”mt2.google.com”].each do |serverUrl|
# harita sunucularına bağlanıyoruz.
httpObj = Net::HTTP.new(serverUrl, port, proxy, proxy_port)
# Http bağlantı başlatılıyor.
httpObj.start do |http|
# 19000 ile 19125 arası istanbul’un düşey koordinatları
19000.upto(19125) do |x|
# 12250 ile 12375 arası istanbul’un dikey koordinatları
12250.upto(12375) do |y|
# İstek yapılacak Url hazırlanıyor.
url = “/mt?n=404&v=w2.37&x=#{x.to_s}&y=#{y.to_s}&zoom=2”
# İstek yapılıyor….
resp = http.get(serverUrl + url)
# İstek yapılan koordinatlar ve alınan bilginin büyüklüğü yazılıyor.
puts “X=#{x.to_s} Y=#{y.to_s} koordinatları için,”
puts “#{serverUrl + url} adresinden, ”
puts “#{resp.body.to_s.length} uzunluğunda veri alındı.”
end
end
end
end[/ruby]
Yukarıda yer alan Örnekte sadece Google’ın sunucularına bağlandık, İstanbul’un düşey ve dikey koordinatları kullanılarak belirli bir veri aldık, bu verinin büyüklüğünü ve nereden alındığını ekrana yazdırdık.
İkinci adımda MapCache artık yürümeye başlıyor;
MapCache’in ilk sürümünde elde ettiğimiz bilgiler ile ikinci sürüme dosyaya kayıt Özelliği ekleyelim.
[ruby]$stdout.sync = true
require ‘net/http’
proxy = nil
proxy_port = nil
port = 80
[1,2,3].each do |index|
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.37&x=#{x.to_s}&y=#{y.to_s}&zoom=2”)
# Alınan verinin kayıt edileceği dosya adı hazırlanıyor…
file_name = “map\\temp_#{x.to_s}_#{y.to_s}_#{index}.png”
# Dosya açılıyor ve kayıt ediliyor.
open(file_name, “wb”) { |file|
file.write(resp.body)
}
puts “#{file_name} adlı dosya başarı ile yazıldı..!”
end
end
end
end[/ruby]
GÖrüldüğü gibi MapCache’in ikinci sürümünde sadece aşağıda yer alan kısım değiştirildi. İşte sizlere Ruby’de Http nesnesinden alınan image yani byte[] cinsinden bir veriyi dosyaya yazma işlemi..! Diğer programlama dillerde bu işlemi yapıyor olsaydık, etrafta bir sürü Stream nesnesi havada uçuşur, veri tipi dÖnüşümü yapmaktan canımız çıkardı. Üstelik test etmesi de ayrı bir dert olurdu, bilginize.
[ruby]
file_name = “map\\temp_#{x.to_s}_#{y.to_s}_#{index}.png”
open(file_name, “wb”) { |file|
file.write(resp.body)
}
[/ruby]
Sizlere dosya açma amacı ile kullanılan modlardan bahsetmem gerekir (şu “wb” parametresinden). Bu parametre pek çok değer alabilir, bu değerler;
– “r”: Sadece okuma için dosyayı açar. Dosyanın başından başlar.
– “r+”: Okuma ve yazma için açar. Dosyanın başından başlar.
– “w”: Sadece yazma için dosyayı açar. Eğer dosya var ise, içindekileri siler.
– “w+”: Okuma ve yazma için açar. Eğer dosya var ise, içindekileri siler.
– “a”: (Append Only) Sadece yazma için dosyayı açar. Dosya var ise, dosyanın sonundan başlar, yok ise yeni bir tane oluşturur.
– “a+”: (Append Or Read) “a” dan tek farklı okuma da yapılabilir.
– “b”: Sadece Windows ve Dos’da geçerlidir. Binary dosya türünde dosyalar için kullanılır.
Yukarıdan da anlaşılacağı gibi Örnek, windows sistemler için yapılmıştır. (Yapacak birşey yok çoğunluk windows kullanıyor.) Linux üzerinden programı deneyen arkadaşlar “wb” -> “w” yaparlarsa MapCache uygulaması daha sorunsuz çalışacaktır.
MapCache.v3.rb ile MapCache.v4.rb uygulamarı bir soraki yazımızın konusu oldu :)
Kolay gelsin…
ArkadaÅŸlar neden 3 farklı server’dan çekiyorsunuz diyebilirler. Programı ilk yazdığımda bazı serverlardan dosya almakta sorun yaÅŸamıştım. Onun için aynı iÅŸlemi 3 farklı server üzerinde çalıştırdım. Zaten bir sonraki versiyonlarda farklı bir serverdan daha büyük bir dosya geliyorsa onu daha önce çekilen dosyanın üzerine yazıyor. Eh bir de bunu Thread içinde yaparsa tadından yenmez :)