echo strtotime(" Tuesday, February 14, 2012 ");

/* David Zuelke : Large-Scale Data Processing With Hadoop and PHP */

Kabaca map reduce nedir sorusunu sorduysaniz once bu linkBu sunum da David Zuelke'nin son 6 aydir her konferansta sundugu ve benim de cok begendigim bir cirpida Hadoop-PHP sunumu : Large-Scale Data Processing With Hadoop and PHP (PHPBNL2012 2012-01-27)
View more presentations from David Zuelke

/* MongoDb ile Aşırı Disk Kullanımı ve Sonrasında Optimizasyon */

Senaryomuz su :
MongoDb diskiniz %88 doldu. Makineye yeni bir dik takamiyorsunuz. Gereksiz buyuk boyutlu collectionlar var ve siz bu gereksiz collection'lari sildiniz.
db.col1.drop()
db.col2.drop()
db.col3.drop()
Veri buyuklugunun neredeyse yaridan fazlasini sildiginizi dusunurken hala %88 doluluk orani sizi sasirtti zira mongodb bir takim disk ve indexleme performansi kurallari geregi sildiginiz datanin kapladigi alani diskte hala ayrilmis olarak tutar. Bunun icin collection'lari silmeden once bosaltip ardinddan db.col1.runCommand("compact") calistirmaniz gerekirdi ama artik silindi ve bunu calistirinca hata veriyor (ve tabiki ayni adda bos bir collection acip calistirmak anlamsiz olacaktir).
Bu durumda veri tabanina repair komutu vermek gerekecek ancak bu da kullanimda olan disk alanini kadar bos alana ihtiyaca ihtiyac duyacaktir ve hata verecektir. Bu durumda yapilmasi gereken sey (eger bir disk ekleyemiyorsaniz) elinizdeki var olan datasinin gercekte diskin yarisindan kucuk bir alana sigdigini dusundugunuz veritabanina :

1. db.copyDatabase("db1","db1back") 
2. use db1 
3. db.dropDatabase() 
4. db.copyDatabase("db1back","db1") 
5. use db1back 
6. db.db1() 

19G lik veri icin ortalama yarim saat surdugunu ve hakli olarak bu sirada gelen insert ve find komutlarina cevap vermedgini de ekleyim.

Ek olarak okunmalidir  ki  http://www.mongodb.org/display/DOCS/Excessive+Disk+Space

/* BOM is evil */

\ufeff olarak da kendini gosterebilir tabi. Baş gizli düşmanınızdır unutmayın derim.
Özellikle de bir çeşit api hizmeti veriyorsanız "utf8" i BOM'suz kaydedin aksi halde servisinizden faydalanacak olan istemciler size bolca invalid format hatasi bildirir (xml veya json).
Siz de çıktılarınızı doğru gönderdiginizi iddia edip hatanin kaynagini aradikca beyhude bir ugras isine girmis olursunuz.
Siz daima UT-8 kaydederken BOM'suz kaydedin

Konuyu irdeleyin
BOM : http://en.wikipedia.org/wiki/Byte_order_mark
Unicode : http://en.wikipedia.org/wiki/Unicode
UTF-8 : http://en.wikipedia.org/wiki/UTF-8

echo strtotime(" Tuesday, January 31, 2012 ");

/* memcache-top */

Memecache sunucularının genel durumuna göz atmak için ufak bir script kullanmaya başladım. Çok "handy"
Zaten kendisine şöyle diyor : "perl command-line memcached stat reporter, top-like output"

Şuradan : http://code.google.com/p/memcache-top/

Şöyle kullanıyorum

memcache-top  --sleep 1 --instances 192.168.200.151,192.168.200.152,192.168.200.153,192.168.200.154,192.168.200.157,192.168.200.158


INSTANCE                USAGE   HIT %   CONN    TIME    EVICT/s READ/s  WRITE/s
192.168.200.151:11211   89.1%   77.0%   31      1.0ms   0.0     213.3K  
192.168.200.152:11211   89.0%   70.9%   33      1.0ms   0.0     198.5K  
192.168.200.153:11211   88.7%   84.7%   24      1.0ms   0.0     171.4K  
192.168.200.154:11211   59.6%   60.6%   39      0.9ms   0.0     196.7K  
192.168.200.157:11211   87.9%   49.8%   53      0.8ms   4.0     243.7K  
192.168.200.158:11211   88.4%   57.0%   29      0.8ms   0.0     176.4K  






echo strtotime(" Saturday, January 7, 2012 ");

/* #mongotips 4 - list mongo collections and data sizes */

db.getCollectionNames().forEach( function(c){   size = db[c].stats().storageSize; print(db[c] + ' ' +size/1024/1024) } )
ile tek tek collection'lari ve boyutlarini listelemis olursunuz. Ama suna dikkat cekeyim; toplam boyut  mongoDb dataninzin diskte kapladigi alani vermeyebilir. Ozellikle de cok fazla delete islemi yapmissaniz disk alani bosaltilmamis ancak ayrilmis olabilir. Bu sizi yaniltmasin. Bu kullanilmayan alanlari compact komutu ile optimize edebilirsiniz.



echo strtotime(" Friday, January 6, 2012 ");

/* mongodb c++ driver on debian etch */

sudo scons
scons: Reading SConscript files ...
NameError: name 'AddOption' is not defined:

Eğer debian etch kullanıyorsanız "scons" ile mongodb driver kurulumu hatalar verecektir.
Çözüm için

1. scons son sürümünü inidirn http://www.scons.org/ ve kurun "make install"
2. libboost tüm paketlerini kurun " sudo apt-get install libboost* "

echo strtotime(" Sunday, January 1, 2012 ");

/* Google App Engine "Error 409" Hatası Çözümü */


Su hata ile karsilastim


Error 409: --- begin server output ---
Another transaction by user xxxx is already in progress for app: xxxx, version: 1. That user can undo the transaction with "appcfg rollback".
--- end server output ---

Aslinda zaten nasil cozebileceginiz cikitda yaziyor. Sadece appcfg'yi bulmaniz ve rollback komutu ile calistirmaniz gerek. Proje dizinin bir ust konumunda su sekilde calistirabilirsiniz : 



python /usr/local/bin/appcfg.py -verbose --no_cookies --email=tayyar.besik@gmail.com --passin rollback xmpp-bot

echo strtotime(" Monday, December 26, 2011 ");

/* Mongotips #3 distinct count */

bir alana göre unique count hesaplamak için uzun fonksiyonlar yazanları gördüm. Eğer alanınız indexlenmiş ise bence şöyle yapmanız daha kolay olurdu

db.operationsCollection.distinct("username").length;




echo strtotime(" Tuesday, December 20, 2011 ");

echo strtotime(" Thursday, December 1, 2011 ");

/* Mongotips #2 - Generate Unigrams in Mongo */

Stackoverflow'daki bu başlık özellikle mongo ve kelime-kelime kökleri üzerine çalışırken dikkatimi çekti :

Most efficient way to generate a list of Unigrams from a text field in MongoDB - Stack Overflow http://bit.ly/vNcEvU

echo strtotime(" Monday, November 21, 2011 ");

/* Mongotips #1 */

Try to use a single connection. Try to fetch data in a single query.
So try to strore all dependent fields in a document.

echo strtotime(" Friday, November 18, 2011 ");

/* MongoDb : Delete from capped collections? */


MongoDb'de harika bir özellik olan "Capped Collections"[1] stream benzeri yapılar için birebir.
Capped Collections belirlenen boyutların dışına çıkıldığında otomatik olarak FIFO mantığıyla maximum boyutu koruyor, eski kayıtları atıyor.

Ancak bir sorun var; capped collection içerisinde silme ve güncellemem yapamıyorsunuz (boyut sabit kalırsa güncelleme yapılabiliyor aslında).

Silmek için ben de boyutu sabit tutarak dokumanın "flag" adında bir değirini "1" den "0" a değiştiriyorum.
Ancak dikkat etmeniz gereken değerin integer olmaması. Çünkü integer değer değişimi dokumanın boyutunu değiştiriyor. Ancak string "1" ile "0" dokumanda herhangi bir boyut değişimine neden olmaz.

Php ile güncelleme yapıyorsanız (string) ile cast edin.Eğer konsoldan deniyorsanız da tırnaklara dikkat edin. Tırnak ile güncelleyin.

db.stream.update({"_id" : ObjectId("4ec62adfc469885f7e000026")},{$set : {flag: "1"}})

Capped collectionlarda silme özelliğinin gelecek versiyonlar olabileceğini düşünüyorum aslında. Issue listte kabul edilmiş bir madde var ve duruyor [2].


1. Capped Collections : http://www.mongodb.org/display/DOCS/Capped+Collections
2. Issue : https://jira.mongodb.org/browse/SERVER-751

echo strtotime(" Thursday, November 17, 2011 ");

/* mongo statistics tool : mongostat */

Şunu da not edeyim mongodb /bin dizininde "mongostat" aracını kullanarak anlık olarak mongo istatistiklerini takip edebilirsiniz. 


Size şu değerleri verecektir.

   insert       - # of inserts per second (* means replicated op)
   query        - # of queries per second
   update       - # of updates per second
   delete       - # of deletes per second
   getmore      - # of get mores (cursor batch) per second
   command      - # of commands per second (on a slave, it's local|replicated)
   flushes      - # of fsync flushes per second
   mapped       - amount of data mmaped (total data size) megabytes
   vsize        - virtual size of process in megabytes
   res          - resident size of process in megabytes
   faults       - # of pages faults/sec (linux only)
   locked       - percent of time in global write lock
   idx miss     - percent of btree page misses (sampled)
   qr | qw      - queue lengths for clients waiting (read|write)
   ar | aw      - active clients (read|write)
   netIn        - network traffic in - bits 
   netOut       - network traffic out - bits
   conn         - number of open connections
   set          - replica set name 
   repl         - replication type 
                    M    - master
                    SEC  - secondary 
                    REC  - recovering
                    UNK  - unknown
                    SLV  - slave
                    RTR  - router


http://www.mongodb.org/display/DOCS/mongostat

echo strtotime(" Saturday, November 5, 2011 ");

/* sphinx get's dirty */

Sphinx özellike main+delta seklinde calismalarda bazen indexlemeyi durdurabiliyor. Sonra baktığınızda index data dosyalarınız yerine sonuna '.new ve '.tmp'' eklenmiş hallerini gorebilirsiniz.
Tekrar indekslediğinizde başarılı bitebilir ama buyuk ihtimal ./search e query atayamayacaksiniz atsanizda eski gelecek.

Burada konuyla ilgili bug girilmiş
http://sphinxsearch.com/bugs/view.php?id=302

Bu durumla sık karsılasir oldum, ve karsilastigim zaman once searchd'yi kapatiyorum.
./searchd --stop
/opt/sphinx/var/log/searchd.pid dosyasini siliyorum. Bu sizde baska bir yerde olabilir veya olmayabilir, zira searcd kapanınca bu da silinmeli.

Ardından '.new' ve '.tmp' dosyalarini silip searchd yi tekrar baslatiyorum. Hepsi bu ancak can sıkıcı.

echo strtotime(" Thursday, November 3, 2011 ");

/* bazen olur 'pecl.php.net is using a unsupported protocol error' */

mongo pecl eklentisi kurarken aldım bu hatayı
“pecl.php.net is using a unsupported protocol” .
Aklıma ilk gelen pecl update-channels yapmak oldu ama işe yaramadı.

Fakat sonra biraz arayınca /usr/lib/php/.channels daki dosyaları silip tekrar  pecl update-channels  yapınca düzeldi. 

echo strtotime(" Monday, October 31, 2011 ");

/* Term Extraction with Yahoo Api */


Aslında bir kaç kez kapatıldı ve açıldı bu proje [1]. Şimdi günde ip başına  5.000 request sınırlama ile gayet güzel çalışıyor. Yahoo Term Extractor aslında temel amacı verdiğiniz bir metini etiketlemek.

Bir test yaptım 1000 karakterlik bir Türkçe metni 5000 defa gönderdim ve ortalama cevap süresi genellikle 0.5 sn ile 0.4 sn arasındaydı.


1. http://developer.yahoo.com/search/content/V1/termExtraction.html

echo strtotime(" Sunday, October 30, 2011 ");

/* ZendCon 2011 Notları I, Learning CouchDB - Bradley Holt */

İlgi çekici bir sunumdu. MongoDb varken CocuhDB kullanmaya başlayacağımı pek sanmıyorum [1] ancak yine de tanışmış olduk CouchDB ile.
Bradley Holt 1 saatlik sunumda [2] hem CouchDb'yi bizimle tanıştırdı hem de örnekler yaptı. Zaman kısa olduğundan kendi makinelerimize couchdb kurmaktansa http://www.iriscouch.com/ [3] üzerinden ücretsiz bir hesap açıp denemelerimizi oradan yaptık. Sunumdan aldığım notlar ile derlediğim ama henüz bitmemiş olan :) Türkçe sunumum aşağıda [4] :




1. Comparing MongoDB and CouchDB : http://www.mongodb.org/display/DOCS/Comparing+Mongo+DB+and+Couch+DB

2. Learning CouchDB - http://www.slideshare.net/bradley.holt/zendcon-2011-learning-couchdb

3. Iris Couch provides easy hosted CouchDB - http://www.iriscouch.com/

4. Sunuma doğrudan link : https://docs.google.com/presentation/pub?id=1xXQk0Jc8XqPHzO0sdb418U8OUgugFjYD0fhq-tTCbuQ&start=false&loop=false&delayms=15000

echo strtotime(" Thursday, October 20, 2011 ");

/* CouchDb'ye Hızlıca Bakın */

CouchDb merak edip şöyle bir bakmak ve denemek isterseniz hiç bir şey kurmadan iriscouch'dan [1] ücretsiz ve tatmin edici bir couchdb hizmeti alabileceğinizi unutmayin.

Tabi php+couchdb hızlı giriş klavuzu da faydalı olacaktır [2]
Ve bu geçen seneki ZendCon'dan alınan podcast de önerdiğim bir giriş klavuzu  niteliğinde [3]  

1. http://www.iriscouch.com/ 
2. http://www.slideshare.net/david.coallier/an-introduction-to-couchdb
3. http://devzone.zend.com/article/11583-The-ZendCon-Sessions-Episode-30-Introduction-to-CouchDB-with-PHP

Ancak şunu da belirteyim MongoDb varkan CouchDb'yi kullanacağımı hiç sanmıyorum.
Bu 'MongoDb vs CouchDb' en sevdiğim karşılaştırma
http://www.mongodb.org/display/DOCS/Comparing+Mongo+DB+and+Couch+DB




echo strtotime(" Wednesday, October 19, 2011 ");

/* ZenCon 2011'de en sevdiğim sunum */


Az önce hadoop sunumundan çıktık. David Z. harika bir sunum hazırlamış.

Large-Scale Data Processing with Hadoop and PHP


Güzel bir demo ile noktalanan sunumun aynısı (ancak başka konferans için hazırlanmış olanı) şurada

http://t.co/w2HPgTMm

echo strtotime(" Thursday, October 6, 2011 ");

/* Neo4j auto-indexing */

Unutmayım diye not düşüyorum : 

Neo4j kullanalı bir aç gün oluyor ve rest api ile eklediğim her node için indexleme işlemini gerçekleştirmem gerektiğini sanıyordum ki lucene tabanlı indexer'ına auto_index atmak mümkün olabiliyormuş.
Şöyleki conf/neo4j.properties configürasyon dosyasına şu tarılar eklenmeli ve neo4j tekrar çalıştırılmalı

node_keys_indexable=name,phone
relationship_keys_indexable=since
node_auto_indexing=true
relationship_auto_indexing=true

Ardından node_auto_index üzerinden search atılarbilir ama exact match olmalı. Ben bunu "select by property" amacıyla kullanıyorum.

Örneğin
http://localhost:7474/db/data/index/node/node_auto_index/fbid/999761223232

fbid bir propery ve exact match halinde ilgili node'u getirecektir.

Auto-indexing konusunda Rest api dokumantasyonu