Tuesday, March 26, 2013

Redis Transactions ve Rollback

Azizim transaction denildiğinde iki ana başlık temeldir "Rollback" ve "Rollforward" [1]. Hatta bana sorarsan en önemli olay rollbak olayıdır. Bir şeyler fena halde sarpa sararsa bir şeyler kötü giderse rollback eylersin. 
Lakin benim de pek sevdiğim Redis'de işler böyle yürümüyor. 
Redis özelliklerinni listelendiği sayfada "Transaction" da yer alıyor : 

Fakat redis transaction ile şunu kastediyor :
  1. Failsafe query
  2. Sorgularınızın ya tamamı çalışır ya da hiç biri çalışmaz.
Aklınızda olsun her transaction özelliği rollback özelliği var demek olmuyor. Redis'de kendiniz rollback yapacaksınız. 
Redisin bu duruma mantıklı bir açıklaması var tabi 

Why Redis does not support roll backs?
If you have a relational databases background, the fact that Redis commands can fail during a transaction, but still Redis will execute the rest of the transaction instead of rolling back, may look odd to you.
However there are good opinions for this behavior:
  • Redis commands can fail only if called with a wrong syntax (and the problem is not detectable during the command queueing), or against keys holding the wrong data type: this means that in practical terms a failing command is the result of a programming errors, and a kind of error that is very likely to be detected during development, and not in production.
  • Redis is internally simplified and faster because it does not need the ability to roll back.
An argument against Redis point of view is that bugs happen, however it should be noted that in general the roll back does not save you from programming errors. For instance if a query increments a key by 2 instead of 1, or increments the wrong key, there is no way for a rollback mechanism to help. Given that no one can save the programmer from his errors, and that the kind of errors required for a Redis command to fail are unlikely to enter in production, we selected the simpler and faster approach of not supporting roll backs on errors.


Konuyla ilgili diğer bağlantılar






[1] Transaction processing : http://en.wikipedia.org/wiki/Transaction_processing

Thursday, March 14, 2013

Google Reader'ın kapanması

Bir çok uygulamanın beslendiği ve en sevdiğim araçlardan olan google reader'ın kapanacak olması fena azizim.

Official Blog: A second spring of cleaning

Monday, March 11, 2013

MongoDB 2.4 ve GeoJSON desteği

Geospatial sorgulari MongoDb ile zaten keyifle yapabilmekteydiniz. Haberin yoksa hemen incele : http://docs.mongodb.org/manual/applications/geospatial-indexes/

MongoDb 2.4 versiyonunda ise GeoJSON desteği gelmiş oldu [docs]. 2.4 versiyonunda baska guzel seyler de var tabiki.


GeoJSON geometrik sekilleri json formatinda daha rahat tanimlamayi sagliyor.
Ornek bir cizgi

{ type: "LineString", coordinates: [ [0.0, 10.0], [10.0, 20.0] ] }
Bir polygon
{
  "type": "Polygon",
  "coordinates": [ [ [ 40, 5 ], [ 40, 6 ], [ 41, 6 ], [ 41, 5 ], [ 40, 5 ] ] ]
}

GeoJSON tanimlamarinin bir standarti var. Hepsi burda : http://www.geojson.org/geojson-spec.html

Daha cok ornek icin : http://www.geojson.org/geojson-spec.html#examples


Linkler

Monday, March 4, 2013

PyMongo ile çalışmak eğlenceli

http://blog.pythonisito.com/2012/01/moving-along-with-pymongo.html

Pymongo ile çalışmak inanılmaz eğlenceli.

pip install pymongo
veya
easy_install pymongo

Zaten yüklüyse güncellemek için
pip install --upgrade pymongo
veya
easy_install -U pymongo 

Yüklemede başka sorunlar yaşarsanız http://api.mongodb.org/python/current/ sayfasını inceleyin.

Hello world :

Tıpkı mongo konsolunda kullandığımız şekilde objeleri gönderebilmek harika. Nodejs dahil diğer hiç bir mongo driver'ı ile bu kadar rahat olmamıştı mongo sorguları.

import pymongo
con = pymongo.Connection()
# veya 
#from pymongo import Mongoclient
#con = MongoClient('localhost', 27017)
#bazı bağlantı parametreleri var. Şuradan görebilirsiniz : 
# http://api.mongodb.org/python/current/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient

db = con.mytestdb
#veya 
#db = con['mytestdb']

db.testcollection.insert({"name":"hello"})
#Toplu insert işlemelrinde de objeleri array oalrak geçebilirsiniz
db.testcollection.insert([{"name":"hello"},{"name":"world"}])

#Şimdi eklediklerimizi listeleyelim
db.testcollection.find()
#Aslında bu sorgu tüm kayıtları getirmez ancak tüm kayıtları çekmeniz için size bir cursor objesi verir. 

list(db.testcollection.find())
#[{u'_id': ObjectId('51343ccd3a8c4a30eb2e01fe'), u'name': u'xyz'}, {u'_id': ObjectId('513448f73a8c4a366ad506d4'), u'name': u'hello'}, {u'_id': ObjectId('513448f73a8c4a366ad506d5'), u'name': u'world'}]

db.testcollecion.ensure_index('name')
#index oluşturma

db.testcollection.find({"name":"Hello"})

db.testcollection.find({"name":"Hello"}).explain()
#sorguyu çalıştırma mysql'deki "explain extended" gibi size sorguda indexin kullanılma durumunu verir.

db.testcollection.find({"name":"Hello"}).sort([ ('name', 1), ('otherfield', 1)])

# $set, $unset, $push, $pushAll, $addToSet, $pop,$pull, $pullAll, $rename, $bit gibi update operatorlerini rahatlıkla kullanabilirsiziniz. Bu operatorlerle ilgili detaylı bilgi http://docs.mongodb.org/manual/applications/update/#update-operators
db.testq.update({"name": "Hello"}, {"$set": {"name": "Updated"}})



pymongo tutorials : http://api.mongodb.org/python/current/tutorial.html
pymongo examples : http://api.mongodb.org/python/current/examples/index.html

Image publishing checklist

  1. Don't embed important text inside images
  2. Describe your image. Give a good description. Beware of long "alt" attibute values. Or google rank you as a spam because of "keyword stuffing".
  3. License your images. Add a small "Terms of Use". You will like Creative Commons.
  4. Generate your images different size formats for your needs.
  5. Specify your image dimensions in html.

future reading https://www.magic-picture.com/5-best-ways-to-optimize-images-for-seo/

Friday, March 1, 2013

MongoDb $in vs $or

Bir değer için $in ve $or arasında hangisinin daha performanslı olacağına karar veremdiyseniz rahatlıkla $in'i tercih edebilrisiniz.
$or birden farklı alanların sorgulanması sırasında tavsiye ediliyor.

http://docs.mongodb.org/manual/reference/operator/or/:

When using $or with <expressions> that are equality checks for the value of the same field, choose the $in operator over the $or operator.