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;




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

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.

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

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

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ı.

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. 

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

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

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




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

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





Friday, September 30, 2011

The IMDB Api

IMDB gibi bir data cevherinin api'sinin olmaması tam anlamıyla bir facia. Datalarını kullanmamız için sunduğu metot ise daha da çileden çıkarıcı http://www.imdb.com/interfaces#plain

Third party bir api olarak bunu [http://www.deanclatworthy.com/imdb/] buldum.
Şimdilik işe yarıyor ama ben şu an sadece api görevi görecek ve old school tekniklerle imdb search, movie, artist sayfalarından regexle data alacak bir class yapıp kendi üst apimi yapmayı düşünüyorum.

Tuesday, August 23, 2011

delicious apisi ile link tagliyorum

delicious'un son durumunu bilmiyorum, kapanacak mı ne zaman kapanacak emin değilim ama elimdeki bazı linkleri onunla tagliyorum
Aşağıdaki official apisi bana bunu sağlıyor
http://feeds.delicious.com/v2/json/urlinfo/data?url=http://www.webrazzi.com

[
{
"hash":"b41ae64e2e80ba1806245c61179ad903",
"title":"Webrazzi",
"url":"http:\/\/www.webrazzi.com\/",
"total_posts":209,
"top_tags":
   {"blog":77,"web2.0":54,"internet":36,"web":33,"technology":29,"webrazzi":23,"news":19,"haber":17,"blogs":14,"webdesign":13}
}
]

Thursday, August 18, 2011

Google Profanity ile istenmeyen kelime filtreleme meselesi

wdyl.com açılalı epey oldu. wdyl altında bir basit servis ve google'ın resmi bir apisi olan profanity api ile bir kelimenin istenmeyen ifade olup olmadığını anlayabilirsiniz.
"xxx"
"porno"
gibi ifadeler

Kullanımı basit
http://www.wdyl.com/profanity?q=ankara
"q" parametresine kelimenizi verin "true" veya "false" alacaksınız. "true" olması istenmeyen bir kelime olması demektir.
örnek çıktı (json formatında veriyor)

http://www.wdyl.com/profanity?q=ankara
{"response": "false"}


http://www.wdyl.com/profanity?q=porno
{"response": "true"}


As Wade notes, a simple snippet of PHP code can be used with apps via a JSON call to query whether or not Google thinks any given text contains rude words.
meseleyi irdeleyin http://labs.phurix.net/posts/googles-official-profanity-api


Tuesday, August 16, 2011

ElasticSearch Geo Location Search

Daha önce ElasticSearch kullanmaya başladığımdan ve gelişmiş bir kaç özelliğinden bahsetmiştim.

ElasticSearch gelişmiş filtrelemesi ile son derece performanslı olarak polygonal geo search ve distance calculation yapabildim. Aşağıdaki örnekte ayrıca "distance" parametresi verilerek ilgili uzaklıktaki nokta kayıtları da getirilebiliyor. Test için oluşturduğum ElasticSearch indexinde 300.000 rasgele nokta vardı. Sorgu hızını raporlamadım ancak genellikle 0.01 - 0.03 sn civarında cevap aldım. ElasticSearch kurlu makineye ram'i az ayırdığımdan cevap süresi biraz uzamış oldu. Genel oalrak performansını sevdim ancak. Location bazlı aramalar için de ideal bir search engine.

{
    "filtered" : {
        "query" : {
            "match_all" : {}
        },
        "filter" : {
            "geo_polygon" : {
                "place.location" : {
                    "points" : [
                        {"lat" : 40, "lon" : -70},
                        {"lat" : 30, "lon" : -80},
                        {"lat" : 20, "lon" : -90}
                    ]
                }
            }
        }
    }
}


Meseleyi irdeleyin
http://www.elasticsearch.org/guide/
http://www.elasticsearch.org/blog/2010/08/16/geo_location_and_search.html

Friday, August 12, 2011

ElasticSearch advanced search

ElasticSearch search engine olarak hala gözümde son derece esnek ve hızlı. Benzer içerikleri veya duplicate içerikleri bulmak için de gayet hızlı bir tool olarak kullanıyorum.

ElasticSearch ileri düzey filtreme teknikleri var bunlardan birisi de FLT (Fuzzy Like This Query) . İleri düzey çünkü zaten var olan More Like This filtresinin Levenstain ile geliştirilmiş hali gibi.

Text verileriniz içinde benzer olanları veya duplicate olanları bulmak için oldukça ideal.

Örnek bir sorgu

{
"fuzzy_like_this" : 

  {
    "fields" : ["blog.title", "blog.tags"],
    "like_text" : "futbol ve sinema hakkında",
    "max_query_terms" : 20, "min_similarity" : 0.5
  }
}







Meseleyi irdeleyin : 


Thursday, August 11, 2011

error: Setup script exited with error: command 'gcc' failed with exit status 1

python modülleri kurarken, derlerken bu hata sıkça çıkabilir

error: Setup script exited with error: command 'gcc' failed with exit status 1

Bu durumda 
sudo apt-get install python-dev

python-dev kurmanız gerekmekte.

Wednesday, August 10, 2011

TOR force renew ip

TOR kullanırken ip adresimi tekrar yenileme ihtiyacım oldu.
İlk önce terminalden tor'un bendeki portu olan 9500 portuna bağlanıp burada bahsedildiği gibi  newnym komutu gönderdim. Bu ip adresimi yenilemeye yetmedi. Tek yapmam gereken toru yeniden başlatacak bir bash script dosyası yazmaktı aslında :

sudo /etc/init.d/tor restart

Yeniden başlatmanız yeni ip almanız için yeterli.

Telnet ile bağlanıp yenile komutu göndermek için önce torrc dosyanızı düzenlemelisiniz.

sudo vi /etc/tor/torrc

dosyada bu satırı bulun ve başındaki "#" işaretini kaldırın

#ControlPort 9051

Artık telnet ile bağlanabilir ve yenile diyebilirsiniz.


telnet 127.0.0.1 9051
AUTHENTICATE
signal NEWNYM
quit


veya bunu bir sh dosyasına yazar ve öyle çalıştırısınız şöyleki


#!/usr/bin/expect -f
# telnet into tor and get clean path using expect

spawn telnet 127.0.0.1 9051
expect "Escape character is '^]'."
send "AUTHENTICATE\r"
expect "250 OK"
send "signal NEWNYM\r"
expect "250 OK"
send "quit\r"



Konuyu irdeleyin https://trac.torproject.org/projects/tor/wiki