BAŞA DÖN

Google maps IP engeline web sunucusu tabanlı reverse proxy çözümü

Ocak 2009'da yayına alınan Google Maps altyapısını kullanan "Cumhurbaşkanımız Nerede?" uygulaması Google servislerine ait bazı IP adreslerine mahkeme kararı ile erişim yasağı koyulmasının ardından hizmet veremez hale gelmişti. Aradan geçen bunca zamana rağmen Google tarafından çözüm üretilmemesi üzerine sorunu kendi yöntemlerimiz ile ortadan kaldırmak üzere durumu incelemeye koyulduk.

Google yoğun ziyaretçi trafiğini sunucular arasında dengelemek için çeşitli yöntemlere başvuruyor. Ülkemizden gelen bağlantılarda Google DNS sunucuları engellenmiş olan IP adresini içeren bir çözümleme yapıyor ve sorunda burada başlıyor. Kullanıcıların kendi bilgisayarlarında yapacakları bazı ayarlar ile bu problemi gidermek mümkün. Ziyaretçilere "Cumhurbaşkanımız Nerede?" uygulamasını kullanabilmek için bu ayarları yapmaları gerektiğini söylemek hiç mantıklı olmayacağı gibi birçok kullanıcının üstesinden gelemeyeceği teknik detayları içeren bir konu olmasıda işin cabası. Öyleyse bu işi kullanıcıların yerine uygulama sunucusunun kendisi yapmalıydı "Reverse Proxy" fikri bu gerekçe ile ortaya çıktı.

http://khm.google.com, http://khm1.google.com, http://mt0.google.com, http://mt1.google.com sunucularının IP adreslerindeki engelden dolayı haritaların yüklenemediğini tespit ettik. Öncelikle uygulama sunucusunda DNS çözümleme ayarlarında bazı değişiklikler yaparak bu servislere erişimi engel bulunmayan IP'ler üzerinden yapmasını sağladık böylece sunucu üzerinde Google Maps servisi çalışır hale geldi. Uygulamada kullandığımız "Google Map Javascript API" yi hazırladığımız Reverse Proxy üzerinden çağırdık.

<script type="text/javascript" src="webproxy.ashx?Url=http://maps.google.com/maps/api/js"></script>

webproxy.ashx dosyası "Url" parametresi ile kendisine gönderilen adrese ziyaretçinin gönderdiği bazı temel üstbilgileri ekleyerek sunucu tarafında bir istekte bulunur (http://msdn.microsoft.com/en-us/library/debx8sh9.aspx). Google sunucusundan alınan yanıt "text/javascript" tipinde ise kullanıcıya bu dosya transfer edilmeden (http://msdn.microsoft.com/en-us/library/system.net.webresponse.aspx) önce IP adreslerine erişim engeli bulunan sunucu adreslerine müdahale edilir. Yerleşik String.Replace metodu kullanılarak örneğin "http://khm.google.com/" adresi "webproxy.ashx?Url=http://khm.google.com/" şeklinde değiştirilir. Böylece kullanıcının internet tarayıcısına ulaşan "Google Map Javascript API" dosyasında erişim engeli bulunan diğer sunuculara yapılacak isteklerin "Reverse Proxy" üzerinden geçmesi gerektiği belirtilmiş olur. Ayrıca Google tarafından kullanıcı oturumunu takip etmek için gönderilen çerez bilgileri kullanıcıya özel bir "Session" değişkeninde saklanır (http://msdn.microsoft.com/tr-tr/library/system.net.httpwebrequest.cookiecontainer.aspx) aksi taktirde daha sonra yapılacak bir dizi isteği Google Map sunucusu ilişkilendiremeyerek yanıt vermeyi kesecektir.

O anda ekranda görülen bölgenin harita fotoğrafları "Google Map Javascript API" dosyasında dinamik olarak yaptığımız değişiklik sayesinde "webproxy.ashx?Url=...." adresi üzerinden talep edilir. Yeni hedefi "Url" parametresinden alan "webproxy.ashx" dosyası kullanıcıya özel olarak saklanan çerez bilgilerini ve kullanıcının tarayıcısından gönderilen bazı temel üstbilgileri ekleyerek sunucu tarafında yeni bir istekte bulunur. Google Maps sunucusu tarafından gönderilen içerik tipinin (MIME) "image/png" olduğu teyit edildiği taktirde istemciye aktarılırken sunucu performansı için istemci tarafı önbellekleme komutları eklenir (http://msdn.microsoft.com/en-us/library/system.web.httpresponse.cache(v=VS.90).aspx). Tüm bu işlemler ziyaretçi farketmeden ve kullandığı internet tarayıcısında yada işletim sisteminde hiçbir ayar değiştirmeyi gerekli kılmadan arka planda kendiliğinden gerçekleşmiş olur.

Yeterli teknik ve kodlama bilgisine sahip değilseniz kendi "Reverse Proxy" uygulamanızı baştan yazmak yerine http://www.codeproject.com/KB/IP/reverseproxy.aspx ve http://www.codeproject.com/KB/web-security/HTTPReverseProxy.aspx adresindeki gibi açık kaynak kodlu projelerden yararlanmayı tercih edebilirsiniz. Eğer PHP tabanlı bir sistem kullanıyorsanız http://www.glype.com/ adresindeki açık kaynak kodlu uygulamaya eklenti yazmayı deneyebilirsiniz.


Usta olabilmek

Bir süredir arabam yolda giderken birden bire gazı kesiyor ve "usta tabiri ile" yığılma yapıyordu. Şöyle düşünebilirsiniz; 120 ile giderken birden ayağınızı gazdan çekiyorsunuz ve araç anında 80'e iniyor. Arkadan gelen araçlar ise birden dibinizde bitiveriyorlar. Özellikle otoyol ve ışık sonrası kalkışlarda oldukça sıkıntılı anlar yaşanmasına sebep oluyor. Demedi demeyin.

Yakıt almadaki bu problemi karbüratörlü araçlarda pislik gelmesi gibi birşey diye yorumlayıp geçer belki diye boşuna ümit etmişim. Geçen gün Mustafa ile sanayiye gittik, aklımdaki ilk şey LPG sistemi ile alakalı olduğu idi, 2 yere sorunca 3. yerde bizim marka LPG ustasını bulduk. Bilgisayarda kontrol etti, beraber tur attık, "abi" dedi, "bunun sorunu elektrik ile alakalı, LPG sistemi iyi çalışyıor. Endüksiyon bobininden olabilir, sen bunu şuradaki Toyota'cı Adil ustaya göster"

Kalktık, Adil ustaya gittik, beraber bir tur attık, "bunun sorunu bobinden" dedi. Elektrik sisteminde kesinti olduğu için araba yığılıyor ama bunu gidip serviste yaptırırsan bobini garantili takarlar daha iyi olur dedi. Tahmini rakam ise yalan olmasın 300 civarı olurmuş.

İyi dedik, ayrıldık. Mustafa "abi servisten önce başka bir ustaya da göstermekde fayda var, benim ustalara bir gidelim mi?" diye teklif edince, kabul ettim. Tek başıma olsam sormam ama söz dinleyesim geldi.

Ustaya uğradık, beraber tur attık, "bu Endüksiyon bobinden olabilir" dedi :)  Bir ihtimal buji kablolarından da olabilirmiş. Toyota parçacısına uğradık, parçacı "ben hiç görmedim bu modellerde bobin arızası" diyerek ortaya yeni bir tez koyuverdi. Onu biraz kınasa da denemek için bir set kablo aldık. Usta araçla biz yayan dükkana döndüğümüzde, ileri geri manevra yapıyorlardı. "Bu" dedi, "geri giderken kesilme yapmıyor, sadece ileri giderken yapıyor, kesin LPG takılırken bir kablo açık kalmıştır, öne gidince kablo sıkışıyor ve şase yapıyor, bak gör!"

Aracı aldılar dükkana, abi kardeş kabloları çekip bırakmaya başladılar, 1-2 dk geçti geçmedi "bak işte!" sesi geldi. Hakikaten bir kablo sıyrılmış, onu bantladılar ve tüm sorun düzeldi.

Diğer ustalar da usta idi ama geri gitmeyi hiç düşünmemiş yahut geri gitseler de farkedememişlerdi. Yaşadıkları bu tür sorunlarda genel problem bobindi ve onu öne çıkarmışlar, gerisini  öngörememişlerdi.  Son usta ise, sorunun genel tespitini yapmış, elektrik kesintisi olduğundan hareketle, ihtimalleri değerlendirmiş, sonrasında tecrübesini konuşturarak hedefi 12'den vurmuştu.  Aklıma "çekici nereye vuracağını bilen usta hikayesi" geldi. Neyseki bizim çekiç bedeli 20 TL imiş.

Profesyonel olmak kolay, lakin bizler işimize ne kadar hakimiz? Ve ne kadar ustayız? Zor olan ise bu sorulardaki olması gereken cevabı verip, çekici yerine vuran usta olabilmek.

Not : Bu yazı, aynı zamanda kişisel bloğum olan http://www.kendimenotlar.com'da da yayınlanmıştır.


Yazılım sürecinde test etme ve kullanılabilirlik.

Geçtiğimiz perşembe akşamı (12 Kasım 2009UserSpots.com'un düzenlediği Dünya Kullanılabilirlik Günü etkinliğine katılma fırsatım oldu. Rahatlıkla "Son zamanlarda katıldığım en iyi etkinlikti" diyebilirim, yalan da olmaz. Etkinlik sahibi Mustafa Dalcı'ya ve mekan sponsoru BİE'ye teşekkürler.

Yazıyı o gece yazacaktım ama sunumların yayınlanmasını bekledim. (Geçen gün yayınlanmış Dünya Kullanılabilirlik Günü sunumları.) Ürün geliştiricilerin ve kendi açımdan yazılımcıların özellikle incelemeleri gerektiğini düşünüyorum.

Yazılımcılar uygulamalarda birim test (unit test, basitce : yazılan fonksiyonların test edilmesi) yaptığı gibi, arabirimleri de daha yolun başında test etmeli, kolları sıvayıp koda dalmadan önce ekran görüntülerini (eğer başka birimden gelmiyorsa) kağıda dökmeli, "en basit şekli ile bu ekranı nasıl tamamlarım ve işi çözerim?" sorusuna cevap aramalı ve cevabını da kağıda dökmeliler. Başka bir birimden çizimler geliyorsa bile üzerinde kafa yorup varsa çekincelerini bildirmeliler. 

Geliştirme sürecince ise, geliştiriciler/yazılımcılar, başka birini beklemeden ilk testlerini kendileri tam olarak yapabilirlerse;

  1. Ürün süreci hızlanacak (test sürecinde ve sonrasında geri dönüşler azalacak)
  2. Ürünler daha kaliteli olacak (az sorunlu ve dönüşü yüksek)
  3. Kullanıcılar bir kaç kat daha mutlu olacak (istediğine ulaşabilecek)
  4. Firma hedeflere daha yüksek oranlarda varmış olacaktır. (kârlılık artacak)
Bir fırsatı ürüne çevirmek için : 
  1. Hayal edin,
  2. Basit düşünün (KISS : Keep it simple stupid),
  3. Hayal edin,
  4. Basit düşünün,
  5. Çizin,
  6. Tartışın,
  7. Basit düşünün,
  8. Çizin
  9. Tartışın
  10. Çizin
  11. Yazın,
  12. Test edin,
  13. Yazın,
  14. Test edin,
  15. Yazın,
  16. Test edin,
  17. Yazın,
  18. Test ettirin,
  19. Yazın,
  20. Test edin,
  21. Test ettirin,
  22. Yayınlayın,
  23. Test edin,
  24. İzleyin (dönüşleri takip edin).
  25. goto 1: (yeni özellik geliştirme için)

 


Elvedâ emektar...

İlk ne kullanıyorduk sunucu olarak hatırlamıyorum ama sonrasında Gandalf(*) isimli bir sunucu kurduğumu biliyorum. 1 küsür yıl kadar Gandalf ile merkezi işlerimizi hallettikten sonra "Bu sefer Türk kökenli bir bilge olsa?" diye düşünerek, Akşemsettin'de karar kılıp, ismi -network ortamında daha rahat kullanılabilmesi için- "ŞEMS/SEMS" olsun diyerek SBS 2003 kurmuştuk.

Geçtiğimiz haftalarda başladığımız günceli yakalama ve yaz temizliği operasyonunda sıra Şems'e geldi. Yeni Active Directory + Exchange sunucu donanım ayarlamasından sonra isim olarak ELBEY seçtik(*).

Şems'i yayından kaldırmadan önce kurulum zamanına bir bakayım dedim, 10 Aralık 2004'de kurmuşuz.  4.5 yıldır durmaksızın bize hizmet vermeye çalışmış. Yeri geldi çok kızdığımız, neden takılıp kalıyor dediğimiz olsa da, çok cefamızı çektiği de aşikâr. Biraz da o yüzden eski bir dosta, güle güle diyeyim istedim. Elvedâ, tekrar gelmemek üzere(*)...

*Neden mi Gandalf? : Yüzüklerin Efendisi serisi sinemaları kasıp kavuruyordu o  zamanlar.
*Neden mi Elbey? : Memleket özlemi yahut öze dönüş :) www.elbeyli.org
*Şimdi Şems'in efsanesini Gelgit(*) (CVS/SVN sunucusu) devam ettiriyor sistem odasında
*Neden mi Gelgit? : Önceden ismi ARGE idi. Yeni sisteme taşınınca kodlar geliyor gidiyordan yola çıktık.


Neden yazılım uzmanı olmazsınız?

Bir süredir aklımda ve notlarımda olan, "Kodlarken Maestro Olmak" yahut "Koddaki huzur , mutluluk budur :)" başlıklarına yakın bir yazı için kolları sıvamışken, Gürkan Yeniçeri'nin bloğunda "Yazılım Uzmanı Olamayacağınızın 10 Kanıtı" isimli yazıyı gördüm.  Yazının ilk orjinalini yazan Justin James dışında Gürkan Yeniçerinin de çeviriyi yaparken çok güzel yorumları ve eklemeleri olmuş. Aklımdaki yazıyı biraz daha düşünürken, önce 10 kanıtı iyi bir okumak, konuya ısınmak lazım.

Neden yazılım uzmanı olmazsınız?

  1. Kendi kendine öğrenmek yerine kursları tercih ediyorsunuz
  2. Normal çalışma saatlerini seviyorsunuz
  3. Küçük maaş artışlarını kıdem yükselmesine tercih ediyorsunuz
  4. Ekip çalışmasında insan ilişkileriniz pek iyi değil
  5. Kolayca sinirleniyorsunuz
  6. Ekip elemanlarının fikirlerine kapalı iseniz
  7. Detay adamı değilsiniz
  8. Yaptığınız işten onur duymuyorsunuz
  9. Önce ateş edip sonra soru soran tiplerden misiniz?
  10. “Geek” tipini sevmiyorsunuz

Sayfadaki yorumlarda katılımcılar birkaç ekleme daha yapmışlar. Liste elbet daha da uzatılabilir ama  bu haliyle bile tabiri yerinde ise "cuk" diye oturmuş ve en temel tespitleri içinde barındırıyor. Sizce de öyle değil mi?