oniki maymun

İstanbul Trafiği

Herşey, bu devirde hala Flash dayatması yapan İstanbul Büyükşehir Belediyesi (İBB) Trafik Kontrol Merkezi (TKM)'nin trafik yoğunluk haritası sayfasına ifrit olmamla başladı. Steve Jobs Adobe'a BU OYUNU BOZACAĞIZ diyeli 10 yılı geçmiş, herkes HTML5+js ikilisiyle yola devam ediyorken, TKM var olan uygulamasını yine Flash kullanarak güncellemişti.

Yeni versiyondan bahsetmeye geçmeden önce, eski uygulamanın güzelliklerinden bahsetmek istiyorum. Önceki uygulama, 15 dakika sonunda "izin verilen süre dolmuştur" mesajı veriyor ve aslında bu sayfanın bize lütuf olduğunu, sürekli bakmak istiyorsak izin almamız gerektiğini söylüyordu. İzin için neler gerektiğini sözlük'ten öğreniyoruz :

Sayın ...,

Kurumunuzun antetli kağıdında resmi talepte bulunmanız gerekmektedir. Yoğunluk haritamızı kesintisiz kullanmak istiyorsanız, hangi amaçla kesintisiz kullanım istediğinize dair bir resmi yazı ile istanbul büyükşehir belediyesi ulaşım daire başkanlığı'na başvurmanız gerekmektedir.

Talep yazınızda kaç adet bilgisayarla ve hangi ıp'ler üzerinden kesintisiz kullanım hakkı istediğinizi belirtmeniz gerekmektedir. (şirketinizin antetli kağıdı ve yetkili kişinin talebi ile kaç adet bilgisayarda kullanacağınızı bunların ip numaralarını ve ne amaçlı kullanacağınızı resmi yazı olarak ulaşım daire başkanlığı trafik müdürlüğü’ne iletmeniz gerekmektedir.) Uygun görülen talepler kabul edilerek yoğunluk haritamızın kesintisiz kullanımı mümkün olacaktır.

İlginize teşekkür eder, iyi çalışmalar dileriz.

Kendimiz dahil herkese nasıl iş çıkarabiliriz diye toplantı yapmışlar ve antetli kağıt isteyelim kararı almışlar herhalde. Uçan helikopterler, zoraki dayatılan çoluk çocuk gürültüsü, saçma sapan duyurular ve çirkin tasarımdan bahsetmiyorum bile.

Yeni sürümde böyle şeyler yok (henüz). En azından istediğimiz kadar açık kalabiliyor ve göze daha hoş gözüküyor. O açıdan bir ilerleme olduğu söylenebilir. Fakat biraz geç kalmış bir ilerleme çünkü artık tanıdığım herkes trafik durumuna Yandex'ten bakıyor. Kısacası insanları bıktırmayı başardılar. Trafik durumu icin Yandex dışında Bing, Basartrafik ve Milliyet(infotech) gibi alternatiflerin olduğunu da ekleyeyim.


Web tarafı böyle. Mobil tarafında neler oluyor diye bakınca, TKM'nin Android CepTrafik uygulaması kurulumu öncesinde şöyle bir permissions ekranı bizleri karşılıyor:

EA Ali Sami

Ortada trafik bilgisi-->ben gibi tek yönlü bir veri akışı olması gerekirken yeni doğacak çocuğum-->belediye gibi bir durum var. Tam olarak hangi konumdayım, telefon ve IMEI numaram nedir, kontak listemde kimler var, kimi aramışım vs. gibi bilgiler belediyede kim bilir kimlere gönderiliyor. Bir kamu kuruluşu olan ve vergilerimizle varolduğu rivayet edilen belediye, bu bilgiler ile ne yapıyor tam olarak? Uygulamanın ve TKM web sitesinin hiç bir yerinde bu konuyla ilgili bir bilgi yok.

Teknik olarak bir trafik uygulamasının kimseyi uniquely identify etmesine gerek yok. Amaç bu veriler ile daha doğru/kapsamlı bir hız haritası oluşturmak ise, kullanıcıları tek tek ayırt etmeden de pekala yapılabilir. Bu verileri herkes topluyor derseniz, onlar reklam veya ürün satma derdinde olan ticari oluşumlar derim. Belediye ticari kurum değil, herkesin seceresini bilmesine gerek yok.


Browser'la bakamıyorum, cepten bakmıyorum. Alternatifler de var. Eee git Yandex'ten bak değil mi? HAYIR, çünkü:

  1. Eşşeğin zkinden dolayı.
  2. Kamu kurumları benim paramla bana artizlik yapamaz gibi bir dünya görüşüm var.
  3. Sosyal medyada yoğunluk haritasının manipüle edildiğine dair komple teorileri var. Bunu araştırmam lazım zira konu komplo teorilerine geldiği vakit aya gidildiği yalanı bir, bu iki.
  4. Diğer alternatifler aynı işi yapmıyor. Araç takip sistemlerinden gelen veri (bing, basarsoft,infotech) ile oluşturulan trafik haritası ile TKM'nin fiziksel sensörlerle oluşturduğu harita aynı değil.
  5. Anlık durumdan daha çok genel durumu merak ediyorum aslında. Hangi saatler arasında trafik nerede ne kadar yoğun? gibi. Bunun için de veriyi toplayıp arşivlemem gerekiyor.

Neyse, sonuçta iyi kötü bir tanıdık bulup hala oğlu/yeğen kontenjanından oraya girmiş insanlar, ellerinden bu kadarı geliyordur ve belki de veriye erişim için Public bir API vardır diye TKM'nin sitesinde bakınırken Trafik Ölçüm Sensörleri sayfasındaki şu açıklamayı görüyorum:

Elde edilen tüm veriler depolanmakta, projelerde girdi olarak kullanılmakta ve bilimsel çalışmalar için üniversiteler ile paylaşılmaktadır.

Hmmm üniversite. Bilimsel çalışma. En sevdiğim şeyler. Bugüne kadar ne yapılmış acaba diye bakınırken iki gizli inşaat haberiyle karşılaşıyorum. Yıldız Teknik ve Boğaziçi üniversitelerinde "İstanbul'un kent içi ulaşım ve trafik problemlerine daha teknik, daha bilimsel, daha güncel, daha inovatif çözümler getirmek için" trafik kontrol lab'ları açılmış. Gelin şimdi arkamıza yaslanalım ve kurulan lab'ların açılışında çekilen fotoğraflara dikkatlice bakalım:

ve oradaki büyük ekranların niçin gerekli olduğunu, tek sıra dizilip bu ekranlara bakmakla nasıl bir bilimsel çalışma yapılabileceğini düşünelim. Beraberliğimiz aradan sonra devam edecek.

Tersine Mühendislik

En son Public API diyordum. Gördüğümüz üzere böyle bir API yok, olsaydı da çok şaşırırdım. Yazının bu kısmı da olmazdı. Makul izinlere sahip bir mobil uygulama olsaydı yazının kendisi olmazdı ya, neyse.

Öncelikle avımızı tanıyalım. TKM uygulaması, diğer trafik haritası alternatifleri gibi tile bazlı çalışıyorsa av başlamadan bitebilir. Tanışmak için çayımızı alıyor ve TKM'nin web sitesindeki Flash uygulamasını ziyaret ediyoruz.

Network tab'ında geleni gideni yeterince izledikten sonra verinin aşağıdaki adreslerden geldiği görülüyor:

http://tkm.ibb.gov.tr/data/IntensityMap/TrafficIndex.aspx?t=1233096499906
http://tkm.ibb.gov.tr/data/IntensityMap/TrafficDataNew.aspx?t=1233046699906
http://tkm.ibb.gov.tr/data/IntensityMap/ParkingLotData.aspx?t=1233096746855
http://tkm.ibb.gov.tr/data/IntensityMap/AnnouncementData.aspx?t=1233096408655
http://tkm.ibb.gov.tr/data/IntensityMap/WeatherData.aspx?t=1233096444640
http://tkm.ibb.gov.tr/data/IntensityMap/PredictionData.aspx?t=1236240085739
http://tkm.ibb.gov.tr/data/IntensityMap/IdentfyConflicts.aspx?t=1236260045739

Herhalde JSON olarak gönderiliyordur, aradığımı buldum diye saf saf sevinirken AnnouncementData.aspx verisine bakmak için tıkladığımda aşağıdaki hexadecimal karakter dizisi ile karşılaşıyorum:

Birileri hiç üşenmemiş, veriyi şifrelemek için uğraşmış. Herhalde bu şifreleme işi de antetli kağıt isteyelim diyen adamın fikridir. Veriyi herkes görürse işe yarar bir şey yapan insanlar (herşeye rağmen) çıkabilir falan, olmaz, yassah, antetli kağıt.

İşte o şifreler!

Şifreli verinin Flash uygulaması içinde çözüldüğü bariz çünkü gelen veriyi kendi ekranımda açık seçik görüyorum. Ancak şifreleme t parametresine bağlı olabilir. t parametresin aldığı değer tanıdık: sonuna milisaniye eklenmiş unix timestamp değeri. Şifreleme ile bu parametrenin ilgisi var mı acaba diyerekten t'yi boş bırakıyorum. Gelen cevap aynı. Buradan, t'nin tırışkanın t'si olduğunu anlıyoruz. Bir başka deyişle sabit bir şifre var ve Flash uygulamasının içine gömülü.

Bu durumda en mantıklısı swf dosyasının içine bakmak tabi ki. Bugüne kadar hiç Flash dosyası decompile etmedim. İlk bulduğum bedava flash decompiler'ı (AS3 Sorcerer) indiriyorum. İsmi güven veriyor ancak sonuç hüsran (obfuscate edilmiş):

Farklı bir yol düşünmeliyim. Ekranda görüyorsam RAM'de bir yerlerde çözülmüş hali olmalı diyerek, Procdump(sysinternals) isimli program ile browser'ın flash plugin prosesini dump ediyor ve dump dosyasının içinde TKM kelimesini aratıyorum:

$ procdump -ma plugin-container.exe tkm.dmp
    
ProcDump v7.1 - Writes process dump files
Copyright (C) 2009-2014 Mark Russinovich
Sysinternals - www.sysinternals.com
With contributions from Andrew Richards

[00:15:01] Dump 1 writing: Estimated dump file size is 486 MB.

$ strings tkm.dmp | grep TKM

TKMDecryptV12Ops$
TKMCryptOps$
TKMDecryptV12Params$
TKMCryptParams$
TKMDecryptV12Ops
eksera.crypto:TKMDecryptV12Ops
TKMCryptOps
eksera.crypto:TKMCryptOps
TKMDecryptV12Params!eksera.crypto:TKMDecryptV12Params
TKMCryptParams
eksera.crypto:TKMCryptParams
http://80.93.214.146/TKMProxy/

Evet. "TKM" araması ile ilk atışta tam isabet. eksera.crypto namespace'inde TKMDecryptV12 diye birşeyler var. Doğru yoldayım ancak memory dump dosyası içinden kelime ayıklayarak yapılabilecekler bu kadar. Obfuscate edilmemiş swf dosyasının RAM'de açık seçik durduğundan emin oldum. Şimdi hafızadan sadece swf'yi dump etmenin bir yolunu bulmalıyım.

Benden önce kesin böyle derdi olan birileri olmuştur diyerek 'swf memory dump' diye bir arama yapıyorum. Ve tabi ki böyle bir derdi olan birileri olmuş. SWF iD isimli bu programın nasıl çalıştığını buradan okuyabilirsiniz.

SWF iD'yi çalıştırınca seçili sensitivity değerine bağlı olarak hafızada bir kaç tane swf buluyor. Boyutu büyük ve protection gözükmeyen dosyayı dump edip AS3 sorcerer ile açıyorum vee bingo. Sonunda aradığımı buldum. Ancak şimdi de kaydetmekle ilgili bir sorunum var çünkü AS3 sorcerer'ın bu sürümü dosya kaydetme veya text kopyalamaya izin vermiyor.

Eh, ben de başka bir decompiler bakarım. Nitekim JPEXS isminde opensource bir yazılım var. Bunu en başta da görmüştüm ama kesin dandiktir diyerek kaale almamıştım. Web sitesi de güven vermemişti. İşe yarıyor mu diye kurcalarken JPEXS'in memory dump işlemini de yapabildiğini farkediyorum. Yani yukarıda iki saattir anlattığım şeyler bir butona basarak halledilebiliyormuş! Neyse, bu saatten sonra üzülmenin faydası yok. Konuya dönelim.

Flash, Actionscript3 dilini kullanıyor. Decompile ettiğimiz kısım bu haliyle ancak flash uygulaması yazıyorsak işe yarar. Kullanabileceğimiz bir hale dönüştürmeliyiz. Neyse ki Actionscript3, C# ile fazlasıyla benzer. Benzer ancak C#'a geçiş tamamen ezbere yapılabilecek birşey değil, Actionscript kodunu anlamayı gerektiriyor.

Anlama ve dönüştürme işini bir saatin sonunda tamamladıktan sonra artık test aşamasına geçebilirim. 3 farklı decryption fonksiyonu sürümü var ve farklı sayfalarda, farklı şifrelerle, farklı versiyonlar kullanılıyor. Aşağıdaki tabloda hepsini listeledim:

Bakalım duyuru verisini görebilecek miyim?

using (WebClient wc = new WebClient())
{
    string encDataStr = wc.DownloadString("http://tkm.ibb.gov.tr/data/IntensityMap/AnnouncementData.aspx");
    string announceDataStr = TKMDecrypt.Decrypt0(encDataStr, "50614732").Replace('\r',' ').Replace('\n',' ');
    Console.WriteLine(announceDataStr);
}

Sonuç:

103589|D100 Ambarlı-Parseller Yönü sol şerit Bakım-Onarım Çalışması  nedeni ile
1 şerit trafiğe kapalıdır.|17|02.09.2015 00:59:34|-|D100 Ambarlı-Parseller Yönü
sol şerit Bakım-Onarım Çalışması|40.999522,28.694234|2&103586|Tem Hasdal-Alibeyk
öy Yönü Karayolları Genel Müdürlüğü Çalışması  nedeni ile 2 şerit trafiğe kapalı
dır.|17|02.09.2015 00:27:09|-|Tem Hasdal-Alibeyköy Yönü Karayolları Genel Müdürl
üğü Çalışması|41.100136,28.963932|2&103585|Kızıltoprak-Söğütlüçeşme Yönü Bakım-O
narım Çalışması  nedeni ile 2 şerit trafiğe kapalıdır.|17|02.09.2015 00:25:05|-|
Kızıltoprak-Söğütlüçeşme Yönü Bakım-Onarım Çalışması|40.984645,29.039875|2&10358
3|D100 Kartal-Maltepe Yönü Bakım-Onarım Çalışması  nedeni ile tüm şeritler trafi
ğe kapalıdır.Ulaşım yan yoldan sağlanmaktadır.|17|02.09.2015 00:05:31|-|D100 Kar
tal-Maltepe Yönü Bakım-Onarım Çalışması|40.908734,29.205531|1&100237|Aksaray-Yen
ikapı arası Avrasya geçiş çalışması kapsamında trafiğe kapatılmıştır.|17|20.08.2

VICTORY!! (Johnny Drama tarzıyla). Diğer sayfalarda da mantıklı şeyler gördükten sonra 'konunun özüne inmemiz lazım' diyerek devam ediyorum.

Anlık veriler

Trafik yoğunluğu haritasını oluşturmak için gerekli anlık hız verileri TrafficDataNew.aspx sayfasından geliyor. Gelen veri aşağıdaki formda:

3|36|2&4|53|1&9|72|1&11|32|3&12|24|3&13|24|3&16|76|1&17|91|1&18|93|1&19|93|1&20|96|1&21|97|1&22|100|1&23|100|1&24|92|1&25|73|2 ...

& ve | karakterleriyle ayrılmış bir takım sayılar. Ev yapımı bir serialization örneği, ben de çok yaptım. Yollar & ile, yola ait bilgiler ise | ayrılmış. Yol ID | Hız | Renk şeklinde. Her Yol ID için Flash uygulamasının en başta indirdiği r[*].txt dosyalarında enlem / boylam bilgisi var. Yani çizdirmek için yol verisini hız verisi ile eşleştirmek gerekiyor.

Hız verisini harita üzerinde göstermek için leaflet.js kullanacağım. Önceki bir işte kullanmış ve memnun kalmıştım. Daha önce de söylediğim gibi leaflet'i kullanmak saçmalık derecesinde kolay. leaflet'in örnekler sayfasından amacıma en yakın bir tanesini apartıp, hız verisinden bir Feature Collection oluşturduktan sonra GeoJSON olarak serialize ediyorum. leaflet geriye kalan kısmı hallediyor. Sonuç aşağıdaki anlık yoğunluk haritası:

Bu haritanın interaktif olanına buradan erişebilirsiniz. İnteraktif haritayı biraz kurcalarsanız göreceksiniz ki:

  1. Görselliğin cilaya ihtiyacı var. Bununla uğraşacak olan varsa buyursun, minimum eforla bu kadar olabiliyor ancak. Bence gereğinden fazla bile uğraştım.

  2. Yollar haritaya tam oturmuyor. Çünkü herkesin tile'ı kendine gibi bir durum var. Aşağıda 41.04909601, 29.0305808 koordinatının farklı harita servislerindeki konumunu görebilirsiniz. Aynı koordinat hepsinde farklı yerlerde. Bu konuda yapacak birşey yok, düzeltmenin yolu tek tek bakıp gerektiği kadar kaydırmak. Tam stajyere kitlenecek iş.

  1. Ben renklendirmeyi hızlara göre yaptım ancak TKM'nin renklendirmesi daha farklı. Sanırım bazı yollardaki trafik hiç bir zaman 50-60 km/saat'in üzerine çık(a)mıyor, o yüzden ortalama hız 30km/saat olsa bile TKM uygulamasında 'yeşil' gözüküyorlar. Neye baktığını bilmeyen birisi için yanıltıcı olabilir ancak tutarlı ve tutarlı şeyleri severim.

Tarihsel veriler

Anlık trafik yoğunluğu iyi güzel ama tarihsel veri daha bir güzel. Zira bu veri ile sözelciler kimsenin dinlemeyeceği tespit ve anelizler yapabilirler. Ancak tarihsellikten bahsedebilmek için zaman geçmesi gerekiyor doğal olarak. Neyse ki tembel bir insanım ve gelen veriyi çözüp anlık yoğunluk haritasını çizdirdikten sonra uzunca bir süre yaydım. Tam bir süre vermek gerekirse 2 ay 13 gün. Elimdeki iki aylık veri ile ilk aşamada 'bariz' şeyler yapacağım. Tüm veriyi grafik olarak çizdirmek gibi.

Trafik Yoğunluğu İndeksi

Trafik yoğunluğu indeksi, tüm İstanbul için trafik yoğunluğunu gösteren bir değer. TrafficIndex.aspx sayfasından gelen bu veri TKM'nin uygulamasında sağ üst köşede görüntüleniyor. İstanbul trafiği gibi gerçekten karmaşık bir sistemin tek sayıya indirgenmesi konusundaki hislerime açıklık getirmesi adına, Interstellar filminden aşağıdaki diyaloğu sizlerle paylaşmak istiyorum:

School Principal: Tom's score simply isn't high enough.

Cooper: What's your waistline? You're what? Thirty-two, about thirty-three inseam?

School Principal: I'm not sure I see where you're getting at.

Cooper: You're telling me it takes two numbers to measure your own ass but only one to measure my son's future?

Trafik yoğunluğu indeksi nasıl hesaplanıyor bilemiyoruz. Birisi elle giriyor bile olabilir. Daha düşük değerler trafik yoğunluğu daha az demek. 15 Temmuz - 14 Ağustos tarihleri arasındaki 1 aylık veriyi aşağıdaki grafikte görebilirsiniz.

Görüldüğü gibi tüm veriyi tek grafikte çizdirince çok da birşey anlaşılmıyor. Sadece gece/gündüz geçişlerini ve pazar günlerini bir bakışta seçebiliyorum. Bu yüzden tarihsel veriyi haftalara bölüp haftanın her günü için günlük grafikler çizdirme yoluna gittim.


Bu grafiklere bakıp söylenebilecekler:
  • Hafta içi sabah trafik yoğunluğu saat 08:30 civarı zirve yapıyor. 09:30'da biraz azalıp sonra kaldığı yerden devam ediyor.
  • Pazartesi günleri daha bir yoğun. Sanırım pazartesi günleri insanlar memleket / yazlık / haftasonu kaçamağı dönüşleri oluyor. Belki de pazartesi sendromu yüzünden insanların sürüş profili değişiyordur. Sözelcilerden acil açıklama bekliyorum.
  • Hafta içi akşam trafiğinin en yoğun olduğu zamanlar 18:45 - 19:15 arası.
  • Cuma günleri 13:00-14:00 arası yollar boş! Namazımı Jack Nicholson. Resmen aydınlanma yaşadım.
  • Trafikte olmak için en kötü zaman cuma akşamları.
  • Cumartesi günleri yoğun trafik 14:30 - 18:30 saatleri arasında. Pazar günü herkes evde, bugün arabayla gezebilirsiniz.

Köprüler

İkinci iş olarak köprülerde ne oluyor bakmak istiyorum. Köprü üzerindeki trafik genelde akıcı olduğundan fazla birşey göstermez diye köprü girişlerine odaklanacağım. Bu odaklanma işlemi için öncelikle köprü giriş yollarının ID'lerini bilmek gerekiyor. Bu ID'leri, TKM'nin uygulamasında ilgilendiğimiz yolun üzerine tıklayarak görebiliyoruz. Çıkan popup'ta Segment: XXX diye geçen şey aradığımız ID.

Bu noktada, veriyi böyle suyunun suyu bir yöntemle toplarken olabilecek bir şeyden bahsedeyim. Gelen veri ID,Hız şeklinde. Bu ID'nin ait olduğu yolun koordinatları ise başka bir dosyada ve bu dosya büyük. Her seferinde indirmek olmaz. Oturmuş bir sistemde de böyle dosyalar değişmez ya da değişikliğin eski client'ları etkilememesi hedeflenir. Ancak köprü girişlerindeki ortalamaları hesaplarken farkettim ki TKM'dekilerin böyle dertleri yok ve FSM köprüsü Avrupa-Anadolu girişinin ID'si 21 Ağustos 2015 Saat 20:57'de değişmiş. Tek client kendi Flash uygulamaları olunca geriye doğru uyumluluğu sallamamak çok da mantıksız bir hareket değil aslında. Neyse, özetle 21 ağustostan önceki hız verilerini kullanamam demek oluyor bu. Dolayısıyla aşağıdaki grafikler 21 Ağustos - 12 Eylül arasındaki veriler kullanılarak hesaplanmış ortalama hızları gösteriyor. Yaklaşık 3.5 hafta, yani her gün için 3 değerin ortalamasını görüyorsunuz. En az 10 haftalık veri olmadan böyle şeyler çok doğru değil ama yine de köprüden ne zaman geçilir onu görebiliyoruz.


Bu ortalama grafiklerine göre:

  • Haftaiçi köprülerdeki yoğunluk sabah 07:00'dan sonra başlıyor ve 08:30'da en yoğun seviyesine ulaşıyor.
  • Anadolu-Avrupa geçişinde Boğaziçi köprüsü için 16:00 - 16:30 , FSM köprüsü için 16:30 - 17:00 aralıkları optimum saatler. Avrupa-Anadolu geçişinde böyle bir optimum saat yok.
  • Boğaziçi köprüsü Avrupa-Anadolu geçişi neredeyse her zaman yoğun. Gece 02:00 - 06:30 saatleri akıcı sadece. Anadolu-Avrupa geçişi gece 23:00 civarında akıcı olmaya başlıyor.
  • FSM köprüsünde iki taraftaki geçişler gece 23:00'den sonra her zaman akıcı.
  • Cumartesi günleri Boğaziçi Anadolu-Avrupa geçişi hariç yoğunluk saat 11:30'da civarında başlıyor. Boğaziçi Anadolu-Avrupa geçişinde yoğunluk başlama saati 09:30. Yani cumartesi günleri Anadolu'dan Avrupa'ya geçecekseniz FSM köprüsünü kullanın.
  • Pazar günleri 13:00'a kadar köprülerde trafik akıcı.

Toparlıyorum

Bu şekilde 'bariz' gösterimlerin sonu yok. Belki Mahmutbey gişeleri için de köprüler için yaptığım şeyi yapsam iyi olurdu. Mahmutbey'de hala HGS/OGS gişelerini ayrı tutan gerizekalıların trafiğe etkisini görmüş olurduk. Ancak dediğim gibi 3 haftalık veri ile iş yapmak çok doğru değil, biraz zaman geçsin.

Sosyal medyada TKM'nin trafik durumunu manipüle ettiğine dair hikayeler var demiştim. Ancak yazıyı çok uzattım ve manipülasyon konusu ayrı bir yazıyı hakediyor. Bir başlangıç yaptım ama 'presentable' hale getirmek vakit alacak.

Bu yazıyı yazarken oluşturduğum yazılım kütüphanesini github'da bulabilir ve TKM'den birileri bu yazıyı okuyup fevri bir davranışta bulunana kadar indirip kurcalayabilirsiniz. Topladığım tarihsel veriyi de vakit bulduğumda github üzerinden paylaşacağım ancak beni beklemek yerine kütüphaneyi kullanarak kendiniz de toplayabilirsiniz.

Son olarak, demo uygulamasına http://www.onikimaymun.org/projects/tkm/ adresinden erişebilirsiniz.

Sevgiler.