4 Mayıs 2015 Pazartesi

İstanbulun insanlıktan nasibini almamış park vakaları....

Türkiye'de park sorunu malum. Bunun en kolay çözümü telefon numaranı arabanın bir yerine tutturman. 

Oradan aranırsın. Ancak sürekli apartman zillerini çalma bu araba kimin abii muhabbetleri ise zamanla, hele gece yarısına doğru ve sonrası çekilmez oluyor.

Benim zilimi çalma cesaretini acil bir vakadan dolayı değil de bu araba kimin buraya girmemesi gerekiyor gibi salak, aptal ve bencilce düşüncelerin eseri olarak yorumladığımda daha da çekilmez bir hal alıyor.

Acil bir durum yok iken hangi haklı sebep ile bir kaç apartmandaki tüm daireleri gece 00:00 da ayağa kaldırıyorsun: "Şu plakalı araba veya şu renk şu marka araba sizin mi? Tanıyor musunuz?"
Doğal olarak evdeki herkesi ayağa kaldırıyorlar. Uyuyan çocuğunuz, hastanız olup olmadığını umursamadan bu yapıyor. 

Buna biraz aksi cevap verildiğinde ise haksız olmasına ve bunu bilmesine rağmen dayılanıp kavga çıkarmak ise olmazsa olmazlardan.


Dün akşam çıkan böyle bir salak olaydan dolayı bu Ülkeden insan tiksiniyor. Evet ülke diyorum. Hepimiz bu gemideyiz. Öyle ya da böyle bunun benzeri bir takım salakça bencillikleri bir şekilde içimizde taşıyoruz ne yazık ki. Kimi zaman istemesiniz de seçeneksizlikten bunu yapmak zorunda kalıyoruz. Ama bu yine de tiksinti duyumama engel olamıyor.

22 Şubat 2014 Cumartesi

Wowza (v 3.5.2) + HLS + wowzasessionid ile alakalı bir bug...

Siz ilginç bir bug dan bahsetmek isterim. Belki duymuşsunuzdur WozaMediaServer adında bir media server ı. Wowza son zamanların popüler sunucusu. Java tabanlı ve clear bir api dokümantasyonu ile istenilen modülleri yazabilmeniz kolay. Aktif bir forumu olduğundan oradan destek veya istediğiniz modül veya ayarları bulmanız bile mümkün.

Evet bug ımız wowza server 3.5.2 sürümü ile alakalı. Wowza’ya “uçanı kaçanı yakala” modülü yazıyorsunuz. Bu modül her isteği reject ediyor olsun. Siz de müşterilerinize bu uçanı kaçanı yakala modülünü överek işi almış olun.

Bir gün müşteriniz diyor ki; “uçanı kaçanı yakalayacaktınız ancak HLS’te http://xxxxx/playlist.m3u8?wowzasessionid=xxxxxxx ile gelince yayın izleniyor”. Allah allah diyorsunuz bu olmamalı diyorsunuz ve modülünüzü tekrardan gözden geçiriyorsunuz. Bir türlü sorunu çözmiyorsunuz… :)

Size Bug ile ilgili detayları vereyim; Application.xml’de, StreamType “liverepeater-edge”, HLS üzerinden yapılan isteklerde “http://xxxxxx/playlist.m3u8?wowzasessionid=xxxx” şeklinde olunca uçanı kaçanı yakalayan modül yakalamıyor ve yayın izleniyor…

Neyse detaylı bir analiz sonucunda şu durum ortaya çıkıyor: HLS isteğinde, daha önce uçanı kaçanı yakala modülünden geçip accept olmuş , yayını izleyen clientın id si ile , uçanı kaçanı yakala modülünün yakalaması gereken yerde http://xxxx/playlist.m3u8?wowzasessionid=yayınıizleyenwowzaclientid   ile giderseniz yayınız izleyebiliyorsunuz. :)

Bunun sebebi aslında wowza da bulunun listenerlar. Session create olunca wowza onHttpSessionCreate gibi bir listenerın fonksiyonunu çağırır. Ve o listener sizin için aslında modül çalışması demektir. Bir kere create olmuş client id ile giderseniz ne yazık ki bu fonksiyon bir daha tetiklenmiyor. Yani sadece uçanı kaçanı yakala modülü değil, hiçbir sizin yazdığınız modül çalışmıyor diyebiliriz. :)

Güzel haber 3.6.4 de bu giderilmiş…

Kaynaklar:
————————
1- http://wowza.com
2- http://www.wowza.com/forums/showthread.php?22807-onHTTPSessionCreate-does-not-trigger 

9 Şubat 2014 Pazar

Git ve maven üzerine...

İlk başlarda, alışıncaya kadar mavenin kullanılması zor gelebilir. Ancak alışıldıktan sonra, size kazandırdıklarına alışınca git gide beğeninizi kazanmaya başlıyor. Git gide derken bunun üzerine de git kullanıldığında ise demeyin keyfinize…

Git, gerçekten kullanışlı bir kod deposu yönetimi sunuyor. Ne yazık ki ona da alışırsanız svn hele ki cvs ye dönmek istemeyeceksiniz.

Mavenin en çok standart proje yapısı ve IDE’ye bağımlı olmayışı beni etkiledi. Bir maven projesini ister netbeansde ister eclipsede isterseniz notepadde açabilir ve yazmaya devam edebilirsiniz. Debug işlemi için bir IDE kullanmanızı şiddetle tavisye etsem de, kodları yazarken güçlü bir IDE’ye ihtiyacınız yok.

Maven ayrıca tüm bağımlılıkları yönettiğinden sadece kaynak kodunuza yoğunlaşabilirsiniz… 

Şimdilerde eğer bir proje geliştiriyorsanız ve birden çok geliştirici iseniz git-flow gerçekten güzel bir mantık size sunabilir. git-flow’un arkasındaki mantığı biraz maven’in hazır proje yapısına benzettim. Hoşuma gitti. Bence repolarda da bir standart ile çalışmak ve otomatize etmek alıştıktan sonra kolaylık sağlaycaktır.



git-flow için kaynaklar:
——————————————
1- http://nvie.com/posts/a-successful-git-branching-model/

2- https://www.atlassian.com/git/workflows#!workflow-gitflow

24 Ocak 2014 Cuma

Steve Jobs, uzmanlar ve ilerleme hakkında alakasız şeyler...

Steve Jobs gerçekten ne düşünüyordu bilemiyorum. Ama şu an okuduklarım arasında bazı hoşuma giden şeyler buldum.

Eskiden, hatta ara ara hala, bir şey istendiğinde teknik zorluklar dahilinde değerlendirip, olup olmayacağına karar veriyor, karar vermesem dahi bir bilgi paylaşımında bulunuyordum. İşte buna uzmanlık, tecrübe deniyor. Ancak bunun dezavantajları ise, o zaman ki teknolojik gelişmelerden, daha doğrusu bildiğin kadarıyla, bulduğun kadarıyla olan teknolojik gelişmelerden faydandığından, teknolojik olarak buna ulaşmak zor veya uzak görünüyorsa, böyle olmaz gibi fikirler beyan edebilirdim. Hala ederim … 

Sorun şu ki; eğer bu şekilde bulunduğu zamana ve teknolojiye takılıp kalınır ve onun savunucusu konumuna geçerseniz, bir uzman olarak, ilerleme nasıl olabilir?

Tabii bu tavırların avantaj ve dezavanjları, sebepleri var. Mesela üretimi yapabilecek o kudret yoksa doğal olarak yapılan örneklere geçmek, örnekler yok ise o anki yeteneklerim ile çözebilecek çözümüm var mı diye bakınmam gayet doğal.

Fakat beni cezbedense, bir hayal, bir istek bu müşterinin istediği de olabilir, onu gerçekleştirmek, o anki teknolojik durumda çözüm örneği olmasa bile çözmeye çalışmak, sonunda para kazanılırsa gayet iyi olur, ilerlemeyi getirebilecek bir şeydir. Ve beni heyecanlandırıyor nedendir bilinmez.

Steve amcanın yaptığı bu olsa gerek. Önce müşteri ve kendisinin istediği şeyleri, o anki teknolojik imkanlar ile zor veya olanaksız görünse de yapmak… Başarının getirisi ise sonunda bundan epey bir para kazanabilmek.


Alakasız olacak ama, kendime işçi olarka ünvan ararken; veri bilimcisi ya da uygulamalı matematikçi arasından hangisini seçsem diye düşünüyordum. Aslında hangisinin olduğunun bir önemi yok. Ancak son bir kaç fanatik veri bilimci tanımları ile bu kavramdan soğuduğumu söylemeliyim, tabii biraz da eğlencenin sınırlarını çizdiklerinden olabilir belki :) . Galiba uygulamalı matematik veya combiatronics bana daha cazip gelmeye başladı. Tabii epey bi emek gerekecek… her neyse…





Sır paylaşımı konusu hakkında


Şifreleme işlemeri bir süredir ilgimi çeksede, sır paylaşımı (secret sharing) olaylarına ilgimi çeken matamatik dünyası dergisi 2013-4 ocak sayısındaki “Sır Bölüştürmek” başlıklı bir kaç sayfalık yazı oldu.

Burada ilk önce basitçe şu soru soruluyordu: “Elimizde değerli bir nesne olsun ve bunu bir kasa içine yerleştirelim. Ancak taraflar birbirine güvenmiyor. Bu yüzden kasanın şifresini tarafların bilmemesi ve orada bulunmadıkları anda ise kasanın açılmamasının temin edilmesini istiyorlar” tabii biraz yorumlanmış hali bu diyelim.

Burada parçaların kasa şifresi hakkında bilgi vermeyecek şekilde parçalara ayrılmış olmasının temin edilmesi önemli.

Yazının devamını ve esas şeklini buradan okuyabilirsiniz. Bazı denklemleri HTML olarak yazmak, uğraşmak zor geldi...

Matematik dergisindeki orijinal yazı buradan okunabilir.

22 Ocak 2014 Çarşamba

Seçilen bir metriğin hızlı ve kolay olarak distinct count değerini alma


Elimizde bir örnek ile başlamak daha anlaşılır olacaktır. Problemimiz log dosyalarından okunan IP verilerinin distinct count işleminin yapılması, diğer bir tabir ile unique ip’lerin sayılması olsun.

Bu problem oluşturur mu diye sorabilirsiniz. Eğer onlarca sunucunuz var ve onların loglarından bu değeri olmaya kalkarsanız, burada yüz milyonlarca satır logdan bahsediyorum, her bir IP değerini tek tek elinizdeki distinct olarak tutuğunuz IP listeniz ile karşılaştıracaksınız demektir. Bu unique ip listesinin bir üst sınırı var mıdır? Varsa ne kadardır? 

Şimdi elimizde olan unique ip listesinin üst sınırını bulamasak da ne kadar hafızaya mal olabileceğini tahmin etmeye çalışalım. Örneğin 100M unique ip listesi oluşturabiliyoruz diyelim günde. Ve iki durumda bu ip değerini sakladığımı varsayalım; birincisi ip değerlerini STRING olsun, diğeri ise INTEGER olsun. Eğer STRING olarak saklayacak ise her ip değeri için “4x3 + 3” maximum karakter , “4x1 + 3” ise alabileceği minimum karakter sayısı olacaktır. Biz maximum değer üzerinden gidersek, bize her ip değeri için 15 karakter yani 15 byte değerinde hafızada yere mal olacaktır. 

100.000.000 x 15 = 1.5 x 10^9 byte edecektir. Bu da yaklaşık 1,40 GB hafıza alnına denk gelecektir.

Tabii bunların arasında bir ip değeri için 100M luk liste içinde var mıdır diye her defasında kontrol etmek ise ek olarak bir CPU maliyeti olarak karşınıza çıkacaktır.


Şimdi bir de her ip değerinin INTEGER olarak karşılığını bulduğumuzu ve onu kıyaslamak için sakladığımızı varsayalım. Burada integer 32-bit değerden oluşuyor ise 4 bytelık bir yer kaplayacaktır.
Buna göre bir ip adresi mininum veya maximumu gözetmeye gerek kalmadan 4 bytelık bir alanı kaplayacağını da söyleyebiliriz. String olarak saklamaktan daha iyi olduğu aşikar.

100.000.000 x 4 = 4 x 10^8  byte edecektir. Bu da 372 MB yer kaplayacak demek olacaktır. Şimdiden 3/4 oranında yerden kazandık. Ve CPU maliyetine de String değerine göre azalmış varsayabiliriz. 

Şimdi bunlar ilk akla gelen çözümler ve bu çözümlerin problemi üst sınırlarının kestirilememesi. Bu şu an bizim için bir problem oluşturmayabilir. Ama yinede işin içine daha zarif bir çözüm sokmak güzel olacaktır.

Üçüncü olarak ise BITMAP çözümüyle yapmaya çalışalım. Önce bunu nasıl yapacağız açıklayayım; elimizde hafıza alanı olsun ve bu hafıza alanına yalnızca 0 veya 1 değerleri yazabilelim. Yani sadece bir bit yazma hakkımız olsun. Ve bu hafıza alanını istediğimiz gibi genişletebilelim de. Şimdi ip lerin integer değerlerini hafıza alanındaki dizide sıra numarası gibi kullanalım. Ve o sıranumarasına denk gelen alanı 1 yapalım. Hepsi bu kadar. Elimizde her unique ip değeri için 1 bit artan bir şey olacaktır artık. 





Şimdi eğer aynı ip adresi elimizde var mı diye kontrol etmek de basitleşecektir. Eğer ip nin integer değeri sıra noyu (offset) gösteriyorsa, o sıra nodaki bit 1 ise var demektir. Yok ise 1 yapmamız yeterlidir. Ancak bunu kontrol etmemize bile gerek yok. Direk ve her seferinde 1 yapmak yeterli olacaktır. Bu CPU maliyetini de en aza indirecektir. 




Sonrasında ise unique ip sayısı elimizde 1 olan bitlerin sayısı kadar olacaktır. Hepsi bu kadar.

Burada sınır integer değeri olacaktır. en büyük ip değeri “255.255.255.255” olacaktır. Onun integer değeri ise 4294967295 dir ve 4294967295 adet bit demektir. Bu yaklaşık 500 MB hafıza demektir. Bundan daha fazla hafıza alanına ihtiyacınız olmayacaktır. 

Yani sitenizin trafiğinden bağımsız olarak, distinct count almak için 500MB bir ortak hafıza alanından 
daha büyük bir yere ihtiyaç olmadan böyle bir sayımı gerçekleştirebileceğiz.



Detaylar yine kullanıma göre değişecektir. Mesela bu değeri günlük tutarsanız, 500 MB / gün  şeklinde bir yere ihtiyacınız olacaktır. Bu öngörülebilir bir değerdir.


Java’da bu konuda yardım edebilecek bir sınıf ise mevcut. Adı ise Bitset . Burada bitset nesnesinde bir offset değerini yani sıranolu alanı 1 ya da 0 yapabilirsiniz. Sonrasonda ise cardinality() fonsiyonunu çağırdığınızda ise size 1 olan alanların sayısını yani istediğiniz sayıyı verecektir.


Burada ip değeri değilde herhangi bir metriği ölçebilirdik. Peki nasıl yapabilirdik bunu? Bir nesneye atadığımız bu değerin unique hashcode üretmesini ve her aynı değer için aynı hashcode değerini vermesini sağlayabilirsek, herhangi bir metriği distinct count yapabiliriz en az zahmet ve maliyetle…


NOT:
-------
Ayrıca doküman olarak da buradan görüntüleyebilir veya indirebilirsiniz.

Kaynaklar:
———————
1- http://highscalability.com/blog/2012/4/5/big-data-counting-how-to-count-a-billion-distinct-objects-us.html 
2- http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/ 
3- http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

30 Mayıs 2013 Perşembe

Herkesin ağzında sakız: Girişimci olmak!

Evet son zamanlarda çok sık duymaya başladığımız girişimci olmak, girişimcilik...

Şu anki ortam, gerekli şarlar müsait olduğundan ve geneleksel üretim metodları haricinde yeni üretimlerinde pazarda değer oluşturabilmesiyle revaçta olsa gerek...

Doğal olarak ben de girişimci olmak istiyorum. Ancak kendi işimin kölesi durumunda kalmak istemediğim aşikar.

Hayatta kalmak için bir şeyler yapmak lazım. Şu anki düzende bunun için değişim araçlarına ya da aracına ihtiyaç duyduğum ise su götürmez. Ama bunu kazanırken hep ince bir çizgiyi kaçırıyorum galiba. Ne mi bu çizgi bilmiyorum. Belki de herkesin ayrı çizgileri vardır :P

Kodcu.com'dan Altuğ'un dediği gibi : "Ne kanban ne scrum; önemli olan disiplin ve tutkudur" ( biraz değiştirdim orijinali aşağıdadır. :) )


"Hiç bir metodoloji, tutku ve disiplinden daha etkili değildir" 
Altuğ Altıntaş