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.

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…

MapCache.rb – 1” üzerine bir yorum

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

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir