3 Ocak 2016 Pazar

Geodjango tutorials by using postgreSQL, Postgis,Proj4, Geos

                                     Geodjango


Learn how to create location based applicatons like swarm, foursquare or tinder.

We can add anything onto our standard databases and then search up queries like listing them in a particular chronological order or for instance, showing people who has a name starting with the letter a. But have you ever thought about how we save a particular location, more precisely, their latitude and longitude information by using queries? What about listing these queries from the nearest to the most far, most far to the nearest and everything else like searching up within a particular kilometer?
If the subject is location, we also need to learn how to use other data types as well as customary databases like pointfield or polygonfield.
What is a PointField?
Simply put, it is a type of data that we use to save the coordinates (latitude and longitude) of the users.
What is a PolygonField?
This is the type of data that you would need to use if you want to plot a particular area instead of just plotting a point on the map. Examples include: land, patch of an area, country, city, the area of a house etc.
Where can I use PointField? Where would it benefit me?
For example, when you check-in using the swarm app, the app will receive your latitude and logitude information where you have checked in at that moment. This information will be sent to their server and will be saved into the pointfield after being transformed into a point. Then your location will be shared with everyone instantly.
What else does Swarm do?
For example, when you are checking in, it comes up with some suggestions. For example, if you are eating in London in Burger King, and you have a Starbucks nearby, it will be suggested to you.
Here is an example of what the suggestions may look like:
  1. Burger King
  2. Starbucks
  3. London
  4. Others...
... but how does swarm know that you are near these places?
Because these are actually saved into the database of Swarm as a pointfield. So it's listing these localities from the closest to the most far. After you have learnt from these lectures, you will find it's really easy make such filters.
Additionally, you will also learn how to add limitations within a chosen quantity of kilometer . So you could request to show people for instance only within 10km in distance and list those from the nearest to the farthest.
Let's talk a bit about Tinder.
What does Tinder do? It shows you the nearest opposite sex. If you are not interested in the users nearby, it will show you someone else that is farther and the distance will gradually become higher. For example, if you are not interested in the people within 0.3km away, the distance will gradually increase to like 2km, 5km, 10km but for example if you are using Tinder in Turkey, you obviously won't see people who are in Germany.
Basically, Tinder saves your location into their pointfield and lists people who are the nearest to the farthest to your location.
Tinder also shows your distance to other users.
With these lectures, you will also learn these and how to calculate the distance in between two users using km's or miles.
Congratulations, you can now create apps such as swarm, tinder or foursquare.
So what else can we do?
Find my friends: you can make an app where you can find all your friends over a map.
You can create a special app where people can follow their girlfriends over a map.
You can create an app for rent a car type of businesses to follow the location of the vehicle.
For example, you can create an app for an employer who has a business that is usually done outside by an employee like working as a taxi driver. Usually, you would need an expensive GPS device for such things but you can simply make them download an app for their mobile phone and constantly watch their current location.
Not only these.
If you have a website about selling property (real estate) and instead of writing just the km2 of the house, you can show the location of the property on the map including its area giving more details. Who wouldn't want that?
Not only all of these, after these lectures, you will also learn about all the basics of Google Maps.
You will be able to show the people you have previously saved over google maps too.
You will gain knowledge about map markers.
You will gain knowledge about complex map markers.
You will see the photos which you have taken from the database as a marker and be able to add links to them.
I have learnt everything about Geodjango, learnt about the types of data, I understand Google Maps too, yes, but you talk a lot about the latitude and logitude information. Where can I find that information?
This is a very smart question. If you want to do this on web, don't worry, I also talk about the usage of the html 5 geolocation feature.
If you have a mobile app (objective-c for iOS and java for android) it is extremely easy to receive the latitude and longitude information. What you do with mobile applications is the same as posting the latitude and longtitude information to the server.
Wow, the amount of information in the lectures are unbelievable! I think that's all we learn.
No. Lastly, let's talk about GEOIP. Basically, GEOIP works by receiving the IP adress to receive information such as the country, county, city, district, adress. And yes, with these lectures, you would be able to learn how to use the GEOIP library.

Koşullar nelerdir?

  • Python
  • Django
  • Postgresql

Bu kurstan ne alacağım?

  • 22'den fazla ders ve 3 saat içerik!
  • You will gain knowledge about apps such as swarm, tinder and foursquare.
  • If you are thinking about creating a location-based product, you will be able to do this easily.
  • For example, you will be able to find and list users who are the nearest to the farthest to the London eye.
  • If you have a website about real estates like where you sell property, you can save the limits of the land/property into your database and will be clearly shown on the map.
  • You will be able to search and match up other people who are near eachother and you will be able to show the amount of distance in between the two users. App examples: instamessage and wechat.
  • For example, if you want only the people in a particular area to chat to each other for example people who are in the beach, you can set km limits and people outside that km limit will not be able to use the chat. After this lecture, you will learn these.
  • Learn how to using geospatial databases
  • Learn how yo using postGis with postgreSQL
  • Learn why you need PROJ4 and GEOS
  • Learn how yo using geodjango

Hedef kitlesi nedir?

  • People who want to develop mobile apps that are check-in based such as Tinder, Swarm and Foursquare
  • People who have an idea about a location based idea
  • People who study about the geography knowledge system
  • Social network developers
  • Game developers
  • Real estate or location based web site developers

11 Temmuz 2015 Cumartesi

Django kullanıcıların IP adresini bulma

Djangoda ip adresini en hatasız şekilde bulmak için kullanılacak fonksiyon.


def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
    return ip

26 Mart 2014 Çarşamba

Neden Django?

Djangonun geliştirici dostu olduğunu söylemiştim. Neden mi?
Çeşitli kimlik doğrulama(authentication) yöntemleri mevcuttur. Username,emailler,Facebook, Twitter ve bu tarz kombinasyonlar ile giriş yapabilme imkanı verir.
Farklı veritabanı backendleri sunar. MySQL, PostgreSQL , hatta Non-relational veritabanları ve fazlasını kullanabilme imkanınız vardır. Bunların yanı sıra Sqlite3 denilen djangoya has kendi veritabanını ek işlem yapmadan kullanabilirsiniz.
Farklı mail gönderme stratejileri sağlar. Smtp, veritabanına kuyruklama ya da log to files ve daha fazlası ile mail gönderebilirsiniz.
Farklı dosya depolama metodları sunar.Lokal olarak saklayabileceğiniz gibi, FTP, Amazon S3 ya da kendinize has oluşturabilirsiniz.
Mesajlarınızı Sessionlar, cookieler ve diğerleri ile saklamınızı sağlar.
Cachemeleri Dosyalarda, Veritabanında , Memcache olarak yada sadece fake olarak yapabilirsiniz.

daha fazlası için http://bit.ly/djangoframework

13 Şubat 2014 Perşembe

web tasarım dersleri html css dersleri

Merhabalar eğer web sitesi yapmak istiyorsanız , evden çalışarak kazanç elde etmek yada herhangi bir yerde front end developer yani web tasarımcısı olarak çalışmak istiyorsanız veya elinizde bulunan birşeyleri satmak istyorsanız , bildiklerinizi insanlarla paylaşmak vb bu çok fazla uzatılabilir kitlenize internetten ulaşmak istiyorsanız web sitesi tasarımı için gerekli olan iki temel teknoloji olan html ve css ‘i biliyor olmanız gerekiyor.
Bu kursta bunlar hakkında hiç bir şeybilmiyor durumdaysanız en temelden başlayarak mozillayı indirme :) daha temeli olamazdı . PSD photoshop dosyalarını html sayfasına dönüştürmeye kadar öğreneceksiniz ve tabiki HTML ve CSS hakkında’da herşeyi öğreneceksiniz.
En can alıcı noktaysa sermayeye ihtiyaç duymadan yetenekleriniz doğrultusunda binlerce tl kazanabilirsiniz.
30 DOLAR OLAN eğitim setini 20 dolara almak için indirim kuponu :20DLR



https://www.udemy.com/web-tasarim-web-sitesi-nasil-yapilir-html-css-dersleri/?couponCode=20DLR#/

web sitesi geliştirme

12 Ocak 2014 Pazar

MongoDB Kullanımı (Çekirdek)

NoSQL kavramı hakkında farkındalık oluşturup, popüler NoSQL çözümü MongoDB’yi size tanıtmayı amaçlayan makalede belirttiğim gibi, MongoDB dokümanyasyonu, kullandığınız platforma(Linux, Mac os x, Windows) MongoDB’yi nasıl kurabileceğinize dair yeterli bilgiyi sunmaktadır.
Kurulumu başarıyla tamamladıysak, artık teoriden pratiğe geçip, çekirdek MongoDB işlemlerini(CRUD operasyonları) gerçekleştirerek ilk kayıtlarımızı oluşturabiliriz.
Konsol
MongoDB, yönetimi için her türlü yeterliliğe sahip konsol uygulaması ile sisteminize kuruluyor. MongoDB yönetim için görsel bir araç barındırmamakla birlikte, bu iş için üçüncü parti çözümler bulunmaktadır.
Konsol yönetimi için öncelikle, birincil arka plan kabuğunu çalıştırmamız gerekiyor.
cs:~ hakdogan$ mongod
Bu komutla MongoDB için arka planda veri isteklerini işleyecek kabuğu çalıştırdıktan sonra, yeni bir konsol ekranında, sistem yöneticilerinin veritabanları üzerinde sorgu, crud ve diğer operasyonları gerçekleştirebilmesi adına tasarlanmış mongo JavaScript kabuğunu çalıştırmalıyız.
cs:~ cs$ mongo
Tam bu noktada, yeni başlayanlar için help komutu ile yardım almak, hangi komutla ne tür operasyonların gerçekleştirildiğini görmek faydalı olacaktır.
> help
	db.help()                    help on db methods
	db.mycoll.help()             help on collection methods
	sh.help()                    sharding helpers
	rs.help()                    replica set helpers
	help admin                   administrative help
	help connect                 connecting to a db help
	help keys                    key shortcuts
	help misc                    misc things to know
	help mr                      mapreduce

	show dbs                     show database names
	show collections             show collections in current database
	show users                   show users in current database
	show profile                 show most recent system.profile entries with time >= 1ms
	show logs                    show the accessible logger names
	show log [name]              prints out the last segment of log in memory, 'global' is default
	use db_name                  set current database
	db.foo.find()                list objects in collection foo
	db.foo.find( { a : 1 } )     list objects in foo where a == 1
	it                           result of the last line evaluated; use to further iterate
	DBQuery.shellBatchSize = x   set default number of items to display on shell
	exit                         quit the mongo shell

İlk olarak kurulumla birlikte gelen, varolan veritabanlarının listesine bakalım.
> show dbs
local   0.078125GB
Şimdi bir kullanım senaryosu belirleyelim ve ardından da, crud operasyonlarını gerçekleştireceğimiz collection’ları barındıracak veritabanımızı oluşturalım.
Senaryomuz
Kodcu.com’da yayınlanan makaleleri kategori, başlık, içerik, tarih, yazar, etiket alanlarına sahip dokümanlar(unutmayın, MongoDB’de her kayıt, aslında bir dokümandır) olarak saklamak, bu dokümanların alanları üzerinde sorgulama, güncelleme ve silme işlemlerini gerçekleştirmek.
> use kodcu
switched to db kodcu
MongoDB’de, alışageldiğimiz sql veritabanlarında var olana benzer, veritabanı oluşturmak için bir create komutu bulunmuyor. Böyle bir şeye gerek de yok, çünkü MongoDB create işlemini, tanımladığınız veritabanına kayıt eklediğiniz anda gerçekleştiriyor. Yukarıda yer alan use kodcu komutu ile biz, veritabanı tanımlama işlemini gerçekleştirmiş olduk. Çıktıdan anlaşılabileceği gibi, use komutu ile varolan veritabanları arasında seçim de yapabiliyoruz.
> article  = {
              category: ["Yazılar"], 
              title: "Lean Kanban Atölye Çalışması", 
              content: "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
              date: new Date('2013-04-11'), 
              author: "Altuğ Bilgin Altıntaş", 
              tags: [null]}
{
	"category" : ["Yazılar"],
	"title" : "Lean Kanban Atölye Çalışması",
	"content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.",
	"date" : ISODate("2013-04-11T00:00:00Z"),
	"author" : "Altuğ Bilgin Altıntaş",
	"tags" : [null]
}
> db.articles.save(article)
db.articles.save(article) komutuyla, kodcu veritabanı içinde articles collection‘ını(önceki makalede belirtildiği gibi, MongoDB’de collection‘lar, sql dünyasında tablolara tekabül etmektedir) oluşturduk ve öncesinde tanımladığımız article objesini bu collection’a ekledik. Böylelikle MongoDB’ye ilk kaydımızı(doküman) eklemiş olduk.
Aşağıdaki komutla da aynı sonucu elde ederiz.
db.articles.insert({
                   category: [“Yazılar”], 
                   title: "Lean Kanban Atölye Çalışması", 
                   content: "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
                   date: new Date('2013-04-11'), 
                   author: "Altuğ Bilgin Altıntaş", 
                   tags: [null]})
> show dbs
kodcu	0.203125GB
local	0.078125GB
> show collections
articles
system.indexes
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "category" : [ "Yazılar" ], 
  "title" : "Lean Kanban Atölye Çalışması", 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "tags" : [ null ] 
}
Görüldüğü üzre, kodcu isminde veritabanımız, bu veritabanı içinde de articles isminde bir collection oluşmuş durumda. Collection üzerinde yapılan find() çağrısıyla da, ilgili collection’ın barındırdığı kayıtları çıktılamış olduk. Bu kayıtta bizim manuel girmediğimiz bir değer dikkatinizi çekmiş olmalı, id değeri.
MongoDB’de her bir dokümanın benzersiz/unique bir kimlik alanı vardır. Bu alan _id alanıdır. _id alanına manuel olarak değer atanmadığı takdirde, MongoDB bu alana ObjectId tipinde benzersiz bir kimlik değeri atamaktadır.
Oluşturduğumuz ilk kayıtta tags alanına null değer girdik, bu alanı güncelleyelim.
> db.articles.update({_id:ObjectId("516a93d0b26184f91a8b985c")}, 
                     {$set: {"tags": ["lean","kanban","eğitim"]}})
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
Şimdi yeni kayıtlar ekleyelim ve bu kayıtlar üzerinde sorgular çalıştırmayı görelim.
>db.articles.insert({
                    category: ["Yazılar"], 
                    title: "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
                    content: "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
                    date: new Date('2013-04-10'), 
                    author: "Kodcu.Com", 
                    tags: [null]})

>db.articles.insert({
                    category: ["Java", "Tutorial", "Yazılar", "Yazılım"], 
                    title: "Java ile Apache Solr’a Veri İndeksleme", 
                    content: "Merhabalar, bir önceki yazımda Apache Solr kurulumundan, konfigürasyonundan, komut satırından Solr’a veri indeksleme ve bu veriler üzerinden sorgu yapabilme işlemlerinden bahsetmiştim.", 
                    date: new Date('2013-04-09'), 
                    author: "Cüneyt Yeşilkaya", 
                    tags: ["java", "java ile solr'a veri indekslemek", "solr", "solrj"]})

>db.articles.insert({
                    category: ["NoSQL", "Yazılar"], 
                    title: "Çekirdek MongoDB İşlemleri", 
                    content: "NoSQL kavramı hakkında farkındalık oluşturup...", 
                    date: new Date('2013-04-15'), 
                    author: "Hüseyin Akdoğan", 
                    tags: ["mongodb", "nosql"]})
Şimdi, mevcut kayıtlar içinde, yazarı Altuğ Bilgin Altıntaş olan makaleleri arayalım.
> db.articles.find({author: "Altuğ Bilgin Altıntaş"})
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
Burada daha önce MongoDB’yi diğer NoSQL çözümlerden ayıran ve öne çıkaran hususlardan birisi olarak bahsettiğim, istenilen alana göre sorgulama yapabilme olanağını görmüş olduk. Yine aynı başlık altında belirttiğim gibi, MongoDB kullanıcılarına, sorgularda düzenli ifadelerden(regular expression) yararlanma olanağı da sunuyor. Bu bağlamda, içeriğinde Backbone ve JavaScript ifadeleri yer alan makaleleri bulmak istediğimizde şöyle bir söz dizimi kullanıyoruz.
> db.articles.find({content: {$regex: 'Backbone.*JavaScript'}})
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
MongoDB, düzenli ifadeleri kullanırken yararlanabileceğiniz oldukça yararlı 4 seçenek sunuyor. Bunlardan biri, büyük/küçük harf duyarsız sorgular için kullanılıyor.
> db.articles.find({content: {$regex: 'backbone.*javascript', $options: 'i'}})
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
Son olarak bir kaydı nasıl silebileceğimizi de görelim.
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
{ "_id" : ObjectId("516a943bb26184f91a8b985e"), 
  "category" : [ "Java", "Tutorial", "Yazılar", "Yazılım" ], 
  "title" : "Java ile Apache Solr’a Veri İndeksleme", 
  "content" : "Merhabalar, bir önceki yazımda Apache Solr kurulumundan, konfigürasyonundan, komut satırından Solr’a veri indeksleme ve bu veriler üzerinden sorgu yapabilme işlemlerinden bahsetmiştim.", 
  "date" : ISODate("2013-04-09T00:00:00Z"), 
  "author" : "Cüneyt Yeşilkaya", 
  "tags" : [ "java", "java ile solr'a veri indekslemek", "solr", "solrj" ] 
}
{ "_id" : ObjectId("516a9444b26184f91a8b985f"), 
  "category" : [ "NoSQL", "Yazılar" ], 
  "title" : "Çekirdek MongoDB İşlemleri", 
  "content" : "NoSQL kavramı hakkında farkındalık oluşturup...", 
  "date" : ISODate("2013-04-15T00:00:00Z"), 
  "author" : "Hüseyin Akdoğan", 
  "tags" : [ "mongodb", "nosql" ] 
}

Burada ele alıp, konsol uygulaması üzerinden gerçekleştirdiğimiz işlemleri, MongoDB’nin sürücü desteğinde bulunduğu yazılım dilleriyle gerçekleştirmek de mümkün. Nasip olursa bir sonraki makalede, MongoDB’nin sağladığı native java driver ile burada gördüğümüze benzer işlemlerin nasıl gerçekleştirilebileceğini ele alacağız. twitter/@yasinaktimur

MongoDB Kullanımı (Çekirdek)

NoSQL kavramı hakkında farkındalık oluşturup, popüler NoSQL çözümü MongoDB’yi size tanıtmayı amaçlayan makalede belirttiğim gibi, MongoDB dokümanyasyonu, kullandığınız platforma(Linux, Mac os x, Windows) MongoDB’yi nasıl kurabileceğinize dair yeterli bilgiyi sunmaktadır.
Kurulumu başarıyla tamamladıysak, artık teoriden pratiğe geçip, çekirdek MongoDB işlemlerini(CRUD operasyonları) gerçekleştirerek ilk kayıtlarımızı oluşturabiliriz.
Konsol
MongoDB, yönetimi için her türlü yeterliliğe sahip konsol uygulaması ile sisteminize kuruluyor. MongoDB yönetim için görsel bir araç barındırmamakla birlikte, bu iş için üçüncü parti çözümler bulunmaktadır.
Konsol yönetimi için öncelikle, birincil arka plan kabuğunu çalıştırmamız gerekiyor.
cs:~ hakdogan$ mongod
Bu komutla MongoDB için arka planda veri isteklerini işleyecek kabuğu çalıştırdıktan sonra, yeni bir konsol ekranında, sistem yöneticilerinin veritabanları üzerinde sorgu, crud ve diğer operasyonları gerçekleştirebilmesi adına tasarlanmış mongo JavaScript kabuğunu çalıştırmalıyız.
cs:~ cs$ mongo
Tam bu noktada, yeni başlayanlar için help komutu ile yardım almak, hangi komutla ne tür operasyonların gerçekleştirildiğini görmek faydalı olacaktır.
> help
 db.help()                    help on db methods
 db.mycoll.help()             help on collection methods
 sh.help()                    sharding helpers
 rs.help()                    replica set helpers
 help admin                   administrative help
 help connect                 connecting to a db help
 help keys                    key shortcuts
 help misc                    misc things to know
 help mr                      mapreduce

 show dbs                     show database names
 show collections             show collections in current database
 show users                   show users in current database
 show profile                 show most recent system.profile entries with time >= 1ms
 show logs                    show the accessible logger names
 show log [name]              prints out the last segment of log in memory, 'global' is default
 use db_name                  set current database
 db.foo.find()                list objects in collection foo
 db.foo.find( { a : 1 } )     list objects in foo where a == 1
 it                           result of the last line evaluated; use to further iterate
 DBQuery.shellBatchSize = x   set default number of items to display on shell
 exit                         quit the mongo shell

İlk olarak kurulumla birlikte gelen, varolan veritabanlarının listesine bakalım.
> show dbs
local   0.078125GB
Şimdi bir kullanım senaryosu belirleyelim ve ardından da, crud operasyonlarını gerçekleştireceğimiz collection’ları barındıracak veritabanımızı oluşturalım.
Senaryomuz
Kodcu.com’da yayınlanan makaleleri kategori, başlık, içerik, tarih, yazar, etiket alanlarına sahip dokümanlar(unutmayın, MongoDB’de her kayıt, aslında bir dokümandır) olarak saklamak, bu dokümanların alanları üzerinde sorgulama, güncelleme ve silme işlemlerini gerçekleştirmek.
> use kodcu
switched to db kodcu
MongoDB’de, alışageldiğimiz sql veritabanlarında var olana benzer, veritabanı oluşturmak için bir create komutu bulunmuyor. Böyle bir şeye gerek de yok, çünkü MongoDB create işlemini, tanımladığınız veritabanına kayıt eklediğiniz anda gerçekleştiriyor. Yukarıda yer alan use kodcu komutu ile biz, veritabanı tanımlama işlemini gerçekleştirmiş olduk. Çıktıdan anlaşılabileceği gibi, use komutu ile varolan veritabanları arasında seçim de yapabiliyoruz.
> article  = {
              category: ["Yazılar"], 
              title: "Lean Kanban Atölye Çalışması", 
              content: "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
              date: new Date('2013-04-11'), 
              author: "Altuğ Bilgin Altıntaş", 
              tags: [null]}
{
 "category" : ["Yazılar"],
 "title" : "Lean Kanban Atölye Çalışması",
 "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.",
 "date" : ISODate("2013-04-11T00:00:00Z"),
 "author" : "Altuğ Bilgin Altıntaş",
 "tags" : [null]
}
> db.articles.save(article)
db.articles.save(article) komutuyla, kodcu veritabanı içinde articles collection‘ını(önceki makalede belirtildiği gibi, MongoDB’de collection‘lar, sql dünyasında tablolara tekabül etmektedir) oluşturduk ve öncesinde tanımladığımız article objesini bu collection’a ekledik. Böylelikle MongoDB’ye ilk kaydımızı(doküman) eklemiş olduk.
Aşağıdaki komutla da aynı sonucu elde ederiz.
db.articles.insert({
                   category: [“Yazılar”], 
                   title: "Lean Kanban Atölye Çalışması", 
                   content: "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
                   date: new Date('2013-04-11'), 
                   author: "Altuğ Bilgin Altıntaş", 
                   tags: [null]})
> show dbs
kodcu 0.203125GB
local 0.078125GB
> show collections
articles
system.indexes
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "category" : [ "Yazılar" ], 
  "title" : "Lean Kanban Atölye Çalışması", 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "tags" : [ null ] 
}
Görüldüğü üzre, kodcu isminde veritabanımız, bu veritabanı içinde de articles isminde bir collection oluşmuş durumda. Collection üzerinde yapılan find() çağrısıyla da, ilgili collection’ın barındırdığı kayıtları çıktılamış olduk. Bu kayıtta bizim manuel girmediğimiz bir değer dikkatinizi çekmiş olmalı, id değeri.
MongoDB’de her bir dokümanın benzersiz/unique bir kimlik alanı vardır. Bu alan _id alanıdır. _id alanına manuel olarak değer atanmadığı takdirde, MongoDB bu alana ObjectId tipinde benzersiz bir kimlik değeri atamaktadır.
Oluşturduğumuz ilk kayıtta tags alanına null değer girdik, bu alanı güncelleyelim.
> db.articles.update({_id:ObjectId("516a93d0b26184f91a8b985c")}, 
                     {$set: {"tags": ["lean","kanban","eğitim"]}})
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
Şimdi yeni kayıtlar ekleyelim ve bu kayıtlar üzerinde sorgular çalıştırmayı görelim.
>db.articles.insert({
                    category: ["Yazılar"], 
                    title: "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
                    content: "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
                    date: new Date('2013-04-10'), 
                    author: "Kodcu.Com", 
                    tags: [null]})

>db.articles.insert({
                    category: ["Java", "Tutorial", "Yazılar", "Yazılım"], 
                    title: "Java ile Apache Solr’a Veri İndeksleme", 
                    content: "Merhabalar, bir önceki yazımda Apache Solr kurulumundan, konfigürasyonundan, komut satırından Solr’a veri indeksleme ve bu veriler üzerinden sorgu yapabilme işlemlerinden bahsetmiştim.", 
                    date: new Date('2013-04-09'), 
                    author: "Cüneyt Yeşilkaya", 
                    tags: ["java", "java ile solr'a veri indekslemek", "solr", "solrj"]})

>db.articles.insert({
                    category: ["NoSQL", "Yazılar"], 
                    title: "Çekirdek MongoDB İşlemleri", 
                    content: "NoSQL kavramı hakkında farkındalık oluşturup...", 
                    date: new Date('2013-04-15'), 
                    author: "Hüseyin Akdoğan", 
                    tags: ["mongodb", "nosql"]})
Şimdi, mevcut kayıtlar içinde, yazarı Altuğ Bilgin Altıntaş olan makaleleri arayalım.
> db.articles.find({author: "Altuğ Bilgin Altıntaş"})
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
Burada daha önce MongoDB’yi diğer NoSQL çözümlerden ayıran ve öne çıkaran hususlardan birisi olarak bahsettiğim, istenilen alana göre sorgulama yapabilme olanağını görmüş olduk. Yine aynı başlık altında belirttiğim gibi, MongoDB kullanıcılarına, sorgularda düzenli ifadelerden(regular expression) yararlanma olanağı da sunuyor. Bu bağlamda, içeriğinde Backbone ve JavaScript ifadeleri yer alan makaleleri bulmak istediğimizde şöyle bir söz dizimi kullanıyoruz.
> db.articles.find({content: {$regex: 'Backbone.*JavaScript'}})
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
MongoDB, düzenli ifadeleri kullanırken yararlanabileceğiniz oldukça yararlı 4 seçenek sunuyor. Bunlardan biri, büyük/küçük harf duyarsız sorgular için kullanılıyor.
> db.articles.find({content: {$regex: 'backbone.*javascript', $options: 'i'}})
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
Son olarak bir kaydı nasıl silebileceğimizi de görelim.
> db.articles.find()
{ "_id" : ObjectId("516a93d0b26184f91a8b985c"), 
  "author" : "Altuğ Bilgin Altıntaş", 
  "category" : [ "Yazılar" ], 
  "content" : "Kanban sistemi son 10 yıldır yazılım yönetimi alanında etkiliyici bir yaklaşımdır.", 
  "date" : ISODate("2013-04-11T00:00:00Z"), 
  "tags" : [ "lean", "kanban", "eğitim" ], 
  "title" : "Lean Kanban Atölye Çalışması" 
}
{ "_id" : ObjectId("516a9432b26184f91a8b985d"), 
  "category" : [ "Yazılar" ], 
  "title" : "Backbone.js ile ipleri elinize alın! – Ücretsiz Webiner", 
  "content" : "Backbone.js, karmaşaya boğulmuş JavaScript kodunuzu bir yapı içerisine sokan ve geliştirimi zevkli bir ortam sunan bir JavaScript kütüphanesidir.", 
  "date" : ISODate("2013-04-10T00:00:00Z"), 
  "author" : "Kodcu.Com", 
  "tags" : [ null ] 
}
{ "_id" : ObjectId("516a943bb26184f91a8b985e"), 
  "category" : [ "Java", "Tutorial", "Yazılar", "Yazılım" ], 
  "title" : "Java ile Apache Solr’a Veri İndeksleme", 
  "content" : "Merhabalar, bir önceki yazımda Apache Solr kurulumundan, konfigürasyonundan, komut satırından Solr’a veri indeksleme ve bu veriler üzerinden sorgu yapabilme işlemlerinden bahsetmiştim.", 
  "date" : ISODate("2013-04-09T00:00:00Z"), 
  "author" : "Cüneyt Yeşilkaya", 
  "tags" : [ "java", "java ile solr'a veri indekslemek", "solr", "solrj" ] 
}
{ "_id" : ObjectId("516a9444b26184f91a8b985f"), 
  "category" : [ "NoSQL", "Yazılar" ], 
  "title" : "Çekirdek MongoDB İşlemleri", 
  "content" : "NoSQL kavramı hakkında farkındalık oluşturup...", 
  "date" : ISODate("2013-04-15T00:00:00Z"), 
  "author" : "Hüseyin Akdoğan", 
  "tags" : [ "mongodb", "nosql" ] 
}

Burada ele alıp, konsol uygulaması üzerinden gerçekleştirdiğimiz işlemleri, MongoDB’nin sürücü desteğinde bulunduğu yazılım dilleriyle gerçekleştirmek de mümkün. Nasip olursa bir sonraki makalede, MongoDB’nin sağladığı native java driver ile burada gördüğümüze benzer işlemlerin nasıl gerçekleştirilebileceğini ele alacağız. twitter/@yasinaktimur

Python json verileri liste haline çevirmek

Python'da json verileri json olarak kaydetip kaydedilen verileri liste halinde çekmek...

import json

array = '{"fruits": ["apple", "banana", "orange"]}'
data  = json.loads(array)
print data['fruits']
# {u'fruits': [u'apple', u'banana', u'orange']}

Python 'da json loads nedir ?

import json

job = ‘{“sender”: “omgbbqhax”,”message” : “justin timeber ++” }’



mad = json.loads(job)
print mad[‘sender’]

print mad[‘message’]

Python pickle nedir nasıl kullanılır .

import pickle
import redis

r = redis.StrictRedis(host='localhost', port=6379, db=0)
obj = ExampleObject()
pickled_object = pickle.dumps(obj)
r.set('some_key', pickled_object)
unpacked_object = pickle.loads(r.get('some_key'))
obj == unpacked_object

MongoDB database nasıl silinir ?

> use mydb; 
> db.dropDatabase();

Pymongo Kullanımı örnekleri

#öncelikle pymongoyu import ediyorum ve pymongo clienti çekiyorum.
#3. satırda yeni bir client oluşturdum.
#4. satırda database’e bağlandım database ‘e collection a bağlanmak için kullanacağız ayrıca bazı fonksiyonlarda db işimize yarıyacak.
#collection ile koleksiyonumuzu seçtik bu sql ‘deki tablo anlamına geliyor.
#find_one() ile rastgele sanırım ilk datamızı çekiyor array değişkenlerine bakmak için kullanılabilir tabii içi boş halde istersek içini doldurabiliyor ve özel sorgular yazabiliyoruz.
import pymongo
from pymongo import MongoClient
client = MongoClient()
db = client.chatsocial
collection = db.channels
collection.find_one()
collection.find_one({“channel”: “victimia”})
#yukarıda  channeli victimia olarak kayıtlı json ‘un tüm bilgilerini getiriyor.
data = collection.find_one({“channel”: “victimia”})
#istersek gelen jsonu yukarıdaki gibi bir değişkene atayarak işlem yapabiliyoruz.
Eğer kolleksiyonda değişiklik yapmak istersek :
collection.update({“channel”:”victimia”},{“$set”: {“selfs”: [“deneme”,”dene”]}}, upsert=False)
data = {“channel”:”yasinaktimur”, “selfs”: [“one”,”two”]}
mff = collection.insert(data)
#bu şekilde veri eklenebilir (aynı veri iki kez  eklenebilir.)
print mff derseniz eklenen objenin id değerini verir siz id değeri girmesenizde #mongoDB otomatik id atar.

Django with SockJS

Few days ago Peter Bengtsson wrote an interesting blog post on SockJS:
The article is oldukça kısa, let me try to provide step-by-step instructions on how to start your first Django on SockJS project.

Python servers

First, it’s important to understand that there are many HTTP (okay, WSGI) servers for Django. SockJS requires pretty deep integration with the web server, and you will need to use a particular web server with SockJS support.
Currently there are a number of SockJS libraries that work with variety of servers (with quality and completeness varying):
I’ll focus on SockJS-tornado here. This means that the usual Django deployment instructions will not be fully applicable to our project (as we’ll be using Tornado Web HTTP server).
In the mentioned article Peter suggested starting two HTTP servers separately - one for Tornado and one for Django. In this blog post I’ll put Django behind Tornado, so a single Tornado web server will handle all the requests.

Step 0: Python requirements

We will need few Python packages - Django, Tornado and SockJS-Tornado. Let’s install them into a virtualenv environment:
$ mkdir djangosockjs
$ cd djangosockjs
$ cat > requirements.txt << EOF
tornado==2.1.1
sockjs-tornado==0.0.4
django==1.4.1
EOF
$ virtualenv venv
$ ./venv/bin/pip install -r requirements.txt 

Step 1: New project

Let’s create a normal Django project and activate the virtual environment:
$ ./venv/bin/django-admin.py startproject project
$ . ./venv/bin/activate
(venv)$ cd project/project

Step 2: Serving a static file

The Django project will be only a placeholder serving a single static file, without any logic inside. We only want to prove the usage of SockJS with Django using the same codebase and HTTP server.
We will serve a static file - index.html. You need to update TEMPLATE_DIRS in settings.py file:
TEMPLATE_DIRS = (
    'project/templates'
)
Additionally you need to expose the file from urls.py:
from django.conf.urls import patterns, include, url
from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
    url(r'^$', direct_to_template, {'template': 'index.html'}),
)
Finally, we need to create the index.html file. For simplicity we’ll borrow a very simple code from SockJS-node examples.
(venv)$ mkdir templates
(venv)$ cd templates
(venv)$ wget https://raw.github.com/sockjs/sockjs-node/master/examples/echo/index.html
(venv)$ cd ..
(venv)$ cd ..

Step 3: Tornado code

Our SockJS code will accept any incoming realtime connections and will echo all the received data. Here’s the code for the project/echosockjs.py file:
import sockjs.tornado

class EchoSockjsConnection(sockjs.tornado.SockJSConnection):
    def on_open(self, request):
        print "sockjs: open"

    def on_message(self, data):
        print "data: %r" % (data,)
        self.send(data)

    def on_close(self):
        print "sockjs: close"

def EchoSockjsRouter(prefix):
    return sockjs.tornado.SockJSRouter(EchoSockjsConnection, prefix).urls

Step 4: Tornado server

The last file we need to write, is the Tornado web server wrapper. It will do two things:
  • it will expose our SockJS endpoint EchoSockjsConnection under /echo path
  • it will forward all other requests to normal Django app
The adapted snippet from bdarnell will look like:
#!/usr/bin/env python

from tornado.options import options, define
import django.core.handlers.wsgi
import tornado.httpserver, tornado.ioloop
import tornado.web, tornado.wsgi
import project.echosockjs

define('port', type=int, default=8000)

wsgi_app = tornado.wsgi.WSGIContainer(
               django.core.handlers.wsgi.WSGIHandler())

tornado_app = tornado.web.Application(
    project.echosockjs.EchoSockjsRouter('/echo') + [
        ('.*', tornado.web.FallbackHandler,
               dict(fallback=wsgi_app)),
    ])
server = tornado.httpserver.HTTPServer(tornado_app)
server.listen(options.port)
print "[*] Listening at 0.0.0.0:%i" % (options.port,)
tornado.ioloop.IOLoop.instance().start()
Put it into a tornado_main.py file.

Finito

And to start the server:
(venv)$ chmod +x tornado_main.py
(venv)$ DJANGO_SETTINGS_MODULE=project.settings ./tornado_main.py 
Finally, visit http://localhost:8000/ and see if the echo is indeed working!
The full project is available on github.
If you wish to use this setup on production, you will be able to get better performance by separating Tornado from Django. Django is blocking, Tornado is asynchronous, it makes sense to scale them separately.

16 Kasım 2013 Cumartesi

Python Metot Türleri @classmethod @staticmethod


Python sınıflarında, temel olarak 3 farklı şekilde metot tanımı yapılabilir.
  • Örnek (Instance) metotları
  • Statik (@staticmethod) metotlar
  • Sınıf (@classmethod) metotları
Bunların arasındaki başlıca fark, aldıkları argümanlardır. Örnek metotlarına, ilk argüman olarak, objenin kendisine bir referans gönderilir. Bu argümana, geleneksel olarak self adı verilir. Statik metotlar, kendisini çağıran sınıf veya örnek hakkında herhangi bir bilgiye sahip değildir. Bunlar, işlevini kaybetmeden, sınıf dışında da aynı şekilde tanımlanabilir. Sınıf metotları ise, otomatik olarak, kendisini çağıran sınıfa veya örneğin sınıfına bir referans alır. Bu argümana da geleneksel olarak cls adı verilir.

Örnek (Instance) Metotları

 

Python'da yeni bir sınıf tanımlandığınız, yazdığınız metotlar öntanımlı olarak, örnek (instance) metotlarıdır. Örnek metotları, ilk argüman olarak, kendisini çağıran örneğe bir referans alır. Böylece, geçerli örneğin niteliklerine erişim ve müdahale imkanı bulurlar. Aşağıdaki kodları inceleyelim;

 

class ikisayi(object):

    def __init__(self, a, b):
        self.a = a
        self.b = b

    def toplam(self):
        return self.a + self.b


x = ikisayi(3,5)
print(x.toplam) # 1
print(ikisayi.toplam) # 2
print(x.toplam()) # 3
print(ikisayi.toplam(x)) # 4 
 
Programın çıktısı:
#1: <bound method ikisayi.toplam of <__main__.ikisayi object at 0x021F0390>> #2: <unbound method ikisayi.toplam> #3: 8 #4: 8 Yukarıda, görmeye alışık olduğunuz türden bir sınıf tanımımız var. Bu sınıf, iki tane sayı hakkında veri tutmak için kullanılıyor. Yine, bolca karşınıza çıkacağı gibi __init__ başlangıç metodu var. toplam metodu ise, normal şekilde tanımlanmış, yani bir örnek (instance) metodu. toplam metodumuz, her örnek metodunda olduğu gibi, zorunlu bir ilk argüman alıyor. Bu argümana, çalışma anında oluşturulmuş bir ikisayı objesi geçirilecek. Böylece, toplam metodu, hangi objenin a niteliğiyle b niteliğini toplaması gerektiğini bilebilecek.
Program çıktısına dikkat edersek, x.toplam metodunun bound method olduğunu görüyoruz.Yani, ikisayi.toplam metodu belirtilen adresdeki ikisayi objesine bağlanmış. Yani, x.toplam metodu çağırıldığında, ikisayi.toplam metodu, ilk argüman olarak, o adresdeki objeyi alacak.
Diğer yandan, aynı metoda, sınıf üzerinde eriştiğimizde, bir unbound method buluyoruz.Yani, bu method, herhangi bir örneğe bağlanmamış. Dolayısıyla, otomatik bir ilk argüman almayacak. Eğer ikisayi.toplam() şeklinde çağırırsanız, aşağıdaki hatayı alırsınız:
TypeError: unbound method toplam() must be called with ikisayi instance as first argument
#3 ve #4 numaralı ifadeler aynı çıktıyı veriyor, çünkü, teknik olarak aynı şeyler. Siz, x.toplam() çağırdığınızda, Python bunu kendi içinde ikisayi.toplam(x) şekline dönüştürüyor.

Statik Metotlar

Statik Metotlar, kendisini hangi sınıf veya örneğin çağırdığını bilmez. Sadece kendine verilen argümanları bilir, örnek veya sınıf metotları gibi, gizli bir ilk argüman almazlar. Bu yönden bakıldığında, bu fonksiyonun sınıf içinde yazılmasıyla, sınıf dışında yazılması arasında, hiçbir fark yoktur. Ancak, aynı modül içerisindeki birçok fonksiyonu anlamsal bütünler içinde toplamak gerektiğinde kullanılabilir. Bunları tanımlamak için, metot tanımından önce @staticmethod dekoratörü kullanılır.

Sınıf Metotları

Diğer yandan, sınıf metotları, ilk argüman olarak, kendisini çağıran sınıfa veya kendisini çağıran örneğin sınıfına mecburi/otomatik bir referans alır. Bunu o sınıfın bir örneğini oluşturmak istediğiniz durumlarda (bkz: Factory) kullanabilirsiniz. Kendisini çağıran sınıfa bir referans aldığı için, alt sınıflarda da istenildiği gibi çalışacaktır. Örneğin, diyelim ki, bir telefon numarasını temsil eden bir sınıfınız var:
class TelNo(object):

    def __init__(self, ulkekodu, alankodu, numara):
        self.ulkekodu = ulkekodu
        self.alankodu = alankodu
        self.numara = numara
Burada, bir telefon numarasının, ülke kodu, alan kodu ve numrasını ayrı değişkenlerde tutan bir sınıf tanımladık. Muhtelemen, elimizdeki telefon numaraları, bir dosya veya veritabanında "+90 507 7997272" gibi karakter dizileri içerisinde tutuluyordur. Dolayısıyla, böyle karakter dizilerinden TelNo objesi üreten bir fonksiyona ihtiyacımız olacak.
def str_to_telno(string):
    return TelNo(*string.split(" "))

mytel = str_to_telno("+90 507 7997272")
str_to_telno fonksiyonu, verilen karakter dizisini boşluklarından bölüp, bunlardan yeni bir TelNo objesi oluşturuyor. Telefon numarası tutabilmek güzel ama, bu numarayı arayabilmemiz daha da güzel olurdu. Bunun için, TelNo'nun aranabilen bir alt sınıfını oluşturalım.
class AranabilenTelNo(TelNo):

    def ara(self):
        "bu numaraya VOIP üzerinden bağlantı kur"
        pass # gerçekten bu fonksiyonu kodlamamı beklemiyordunuz umarım :)

def str_to_aranabilentelno(string):
    return AranabilenTelNo(*string.split(" "))
Aynı TelNo'da yaptığımız gibi, bir karakter dizisinden AranabilenTelNo oluşturan bir fonksiyon da tanımladık.
Bu yöntemin şöyle bir sıkıntısı var. Diyelim ki, ileride, mesaj atılabilen telno, mms gönderilebilen tel no vs. gibi bir çok alt sınıf tanımlayacaksınız. Her seferinde tek tek bu dönüşüm işlemini yapmak hem yorucu olacak, hem de kodlar çorba olacak.
Buna alternatif olarak, TelNo objesinde, from_string isminde bir @classmethod tanımladığımızda, ne olduğuna bakalım;
class TelNo(object):
    def __init__(self, ulkekodu, alankodu, numara):
        self.ulkekodu = ulkekodu
        self.alankodu = alankodu
        self.numara = numara

    @classmethod
    def from_string(cls, string):
        return cls(*string.split(" "))

class AranabilenTelNo(TelNo):
    def ara(self):
        pass

mytel = TelNo.from_string("+90 507 7997272")
print(type(mytel)) # 1
myaranabilentel = AranabilenTelNo.from_string("+90 507 7997272")
print(type(myaranabilentel)) # 2
Program Çıktısı:
#1: <class '__main__.TelNo'> #2: <class '__main__.AranabilenTelNo'> Program çıktısından görebileceğiniz gibi, iki sınıfın from_string metotları, doğru sınıfa ait objeler oluşturuyor. Böylece, hem alt sınıf için tekrar ayrı fonksiyon yazmak zorunda kalmadık, hem de, doğru sınıfa ait bir örnek oluşturabildik.
Dikkat ettiyseniz, @classmethod ile tanımladığımız metotları, doğrudan sınıf üzerinden çağırdık. Halbuki, Örnek (Instance) metotlarını, sınıfın bir örneği üzerinden çağırıyorduk. Özetle, sınıfın kendisi ile ilgili işlem yapılacak durumlarda, @classmethod kullanabiliriz.s
 

 

 

 

10 Kasım 2013 Pazar

Tornado websocket client

Tornado'nun sunucu hizmetleri ile ilgili bir sürü örnek var ama istemci olarak hele hele WebSocket için neredeyse hiçbir örnek bulamadım internette, onun için buraya yazalım dursun, bir gün birine lazım olur.

from tornado import websocket, ioloop, gen, escape

class SocketClient():
    def __init__(self):
        self.headers = httputil.HTTPHeaders()
        self.headers['Content-Type'] = 'application/json'
        self.request = httpclient.HTTPRequest(
            url = "wss://some.url",
            validate_cert = False,
            client_key = "client-key.pem",
            client_cert = "client-cert.pem",
            connect_timeout = 60,
            request_timeout = 60)


    def connect(self, connCallback, msgCallback):
        self.request.headers = self.headers
        self.__msgcallback = msgCallback
        self.__conncallback = connCallback
        wssConn = websocket.WebSocketClientConnection(ioloop.IOLoop.current(), self.request)
        wssConn.connect_future.add_done_callback(self.__on_connResult)




    def __on_connResult(self, conn):
        if conn.exception() == None:
            self.__wssConn = conn.result()
            self.__conncallback(True)
            self.__read()
        else:
            print(conn.exception().args)
            self.__conncallback(False)




    def send(self, data):
        self.__wssConn.write_message(escape.utf8(json.dumps(data)))




    @gen.coroutine
    def __read(self):
        while True:
            msg = yield self.__wssConn.read_message()
            if msg is None:
                self.__conncallback(False)
                break
            self.__msgcallback(msg)

Python ile socket programlamaya giriş.

Merhabalar,
Bu yazıda, Python programlama diliyle soketlerin kullanılışı konusuna kısaca giriş yapmaya çalışacağım. Okuyucuda soketler hakkında temel bilgilerin olduğunu varsayıyorum. Bunların ne olduğu veya ne için kullanıldığı konusunda hiçbir bilgisi olmayanlar için şöyle özetleyebiliriz; soketler iletişim kanallarıdır. Bunlar aynı bilgisayarda iki işlem arası iletişim sağlayabilse de (örn: unix soketleri) bunları en çok ağ üzerinde iletişim için kullanırız. İnternetten bilgisayarınıza gelip giden tüm veriler için, mutlaka birer soket kullanılır.
Anlatıma geçmeden önce şunu da söylemek istiyorum ki, Python'daki socket modülünü lazım olmadıkça kullanmayınız. Demek istediğim şu ki, bir internet sayfası indirmek için socket açmak, HTTP başlıklarını göndermek, gerekirse yönlendirilen sayfaya yeniden soket açmak gibi bir uğraşa girmeyin. Python bu tip yaygın kullanımlar için zaten daha üst seviye modüllere sahip bir dil. Amerika'yı yeniden keşfetmeye gerek yok.
Öyleyse, Python'daki socket modülünü alternatif bulamadığımız durumlarda kullanalım. Ağ bakımı/programcılığı konusunda bu modülün kullanım alanı kendisini belli edecektir.
Bir örnekle başlayalım;
s = socket.socket(
  socket.AF_INET, socket.SOCK_STREAM)

s.connect(("www.google.com.tr", 80))
Bu örnekte bir client (ingilizcede müşteri demek) soket oluşturduk. Bunun anlamı, bu soket kendisi veri sunmayacak, bir sunucuya bağlanacak demek. Sunucu programlara ileriki yazılarda göz atmaya çalışacağım.
Soket oluşturma fonksiyonuna ilk verdiğimiz argüman, bu soketin adresleme şeklini gösteriyor diyebiliriz. Bunun socket.AF_INET olması, bunun bildiğimiz IP adresi soketi olduğunu gösteriyor. Bunun yerine, socket.AF_INET6 ile IPv6 kullanabiliriz. Bir de socket.AF_UNIX var ki, bu UNIX soketleri için kullanılıyor. Dolayısıyla her sistemde bu sabit tanımlı olmayabilir.
İkinci argüman ise bu soketin iletişim tipini gösteriyor. socket.SOCK_STREAM, en yaygın kullanılan TCP iletişim tipidir. Bundan sonra en yaygın kullanılan iletişim tipi UDP için socket.SOCK_DGRAM sabiti kullanılır.
Daha sonra, elimizdeki s isimli soket objesinin connect isimli metoduyla, soketimizi internetteki bir diğer sokete (yani sunucuya) bağlayabiliriz. Bu metot adres türüne göre farklı argümanlar alabilir. socket.AF_INET için, adres ve porttan oluşan bir tuple veri tipi alır.
Eğer internetle veya işletim sistemiyle ilgili bir hata oluşmadı ise, şu andan sonra soketimiz yazmak ve okumak için hazır. Bu işlemler için sırasıyla send ve recv metotları kullanılır. Aynı örnekten devam ederek, şunu deneyebiliriz;
s.send("GET / HTTP/1.1\r\nHost: www.google.com.tr\r\nConnection: Close\r\n")
while True:
    msg = s.recv(512) # 512 byte veri okumaya çalış
    if not msg: # Eğer boş döndüyse,
        break
    print msg
Not: Kodlar içerisindeki adres html tagları içinde görünüyorsa, onları kaldırın. Galiba Tumblr otomatik olarak onu linke çevirmeye çalışıyor :/
Burada, muhtemelen yapılabilecek en kısa HTTP isteğini gerçekleştirdik. Daha sonra da, 512 byte'lar halinde okuyabildiğimiz kadar veri okuduk. İnternetten gelecek verinin tümünün ne kadar olduğunu bilmediğimiz için, boş veri okuyana kadar okumaya devam etmemiz gerekiyor. Bir yandan okudukça, bir yandan da ekrana yazmaya devam ettik.
Ekleme: Connection: Close header'ını eklemek önemli. Bu header olmazsa, server yeni bir istek almak için bağlantıyı açık tutabilir. Bu durumda, program bağlantının kapanacağını varsaydığından, bağlantının iki ucu da diğerinden veri beklerken program donabilir. (bkz: HTTP persistent connection)
Artık s isimli soketimizle işimiz bitti. HTTP protokolünde, bir kez veri okuduktan sonra bağlantı kapanır. Yeni bir sayfa okumak istersek, sıfırdan bir soket bağlantısı gerçekleştirmemiz gerekir.
Bu yazıda konuya genel bir giriş yaptım. Bir sonraki yazıda sunucu programlarda soketlerin nasıl kullanılacağına değinmeyi planlıyorum.

Python Modüllerinde __name__ Özelliğinin Kullanımı

Modüller yenilir mi, içilir mi?

Öncelikle python’da modüllerden ufak bi’ bahsedeyim. Bildiğiniz gibi bir betik içersinde kodlarımızı tekrar tekrar yazmamak için bir kez fonksiyon tanımlamamız yeterli. O fonksiyonu kullanarak kodları tekrar kullanabiliyoruz. Peki ya aynı fonksiyona başka bir Python programında da ihtiyacımız olursa ne yapacağız? Cevap tabii ki modül kullanmak.
Python’da modül yazmak için birçok metod var ama bunlardan en basit ve en yaygın olanı fonksiyonlar ve değişkenler için .py uzantılı dosyaları kullanmak. Yani evet, şimdiye kadar yazdığınız her python betiği aynı zamanda birer modül. Diğer bir modül oluşturma yöntemi de C veya C++ programlama dilleri ile yazmaktır.
Yani sonuç olarak python’da modül dediğimiz şey aslında bizim yazdığımız betiklerdir. Yani yazdığımız her python betiği bir modül olarak başka bir betikte içe aktarılabilir(import). Modüller için ayrıca buraya bakabilirsiniz.

Bir modül’ün ismi

Yavaş yavaş asıl değinmek istediğim konuya geleyim. Python’da her modülün bir ismi vardır. Python yorumlayıcısı bir modülü yorumlarken o modüldeki tüm kodları çalıştırmadan önce bazı değişkenler tanımlar. Bunlardan birisi __name__ değişkenidir. Bu değişken, o modül’ün çalıştırılma şekline göre başka değerler alır.
Eğer python yorumlayıcısı bizim yazdığımız modülü ana program olarak çalıştırıyorsa __name__ değişkeni '__main__' değerini alır. Ancak yazmış olduğumuz modül başka bir modül içinden çağırılıyorsa bu sefer __name__ değişkeni kendi modül’ünün adını alır.
Anlaşılması için bunları bir örnekle açıklayayım;
Örneğin ornek_modul.py isminde bir dosyaya kaydedeceğimiz şöyle bir betik yazalım:
__name__ özelliğinin kullanımı
1
2
3
4
if __name__ == '__main__':
    print('Kendi dosyam tarafından çalıştırıldım.')
else:
    print('Başka bir modül tarafından içe aktarılarak çalıştırıldım.')
Şimdi bu betikle ilgili çıktılara bakalım:
çıktı testleri
1
2
3
4
5
6
$ python3 ornek_modul.py
Kendi dosyam tarafından çalıştırıldım.
$ python3
>>> import ornek_modul
Başka bir modül tarafından içe aktarılarak çalıştırıldım.
>>>
Görüldüğü gibi ornek_modul.py doyasını kendi başına çalıştırısak __name__ değişkeni '__main__' değerini alıyor. Fakat python’un etkileşimli kabuğuna girip ornek_modul modülünü içeri aktarırsak 1. koddaki else bloğuna düşeriz çünkü __name__ değişkeni bu defa modülün ismi olan ornek_modul değerini almış olur.

7 Kasım 2013 Perşembe

django web framework kullanmak için rasyonel nedenler .


Merhaba arkadaşlar ben yasin aktimur, ortalama 6 senedir internet üzerinde farklı projeler geliştiriyorum ve gelirimin tamamını  bu projelerindeki ürünleri satarak elde ediyorum.
ilk projelerimi herkes gibi php ile yazıp shared hosting üzerinde paylaşıyordum.
Geliştirdiğim projelerin kullanıcı sayısı olması gerektiğinden çok daha fazla sayılara eriştiriğinde profesyonel bir tercih yapmam gerekti ve şimdi o tercihi yaparken neden django’yu seçtiğimi sizlerle paylaşacağım.
Php ile geliştirilen büyük web siteleri : Wikipedia ve facebook
Wikipedia : 2001 senesinde yazılmış bir internet projesi ve şu anda var olan teknolojilerin hiç birisini kullanmıyor o yüzden 2013 yılında php için  referans gösterilmesi aslında gereksiz.
Facebook : 2004 senesinde kurulduğunda markın farklı bir seçeneği yoktu fakat sonradan friendfeed’e 15 milyon $ nakit ve 32.5  milyon dolar facebook hissesini babasının hayrına vermedi bu kadar para bayılmasının nedeni aslında Python ile yazılmış alt yapısını facebook’a adapte etmekti ve ettide zaten o alt yapıyıda açık kaynak olarak paylaştı. Bu arada yazılımın ismi : tornado web server . Django gibi geniş çaplı değil sadece c10k problemine çözüm getiriyor realtime sistemler için ayrıca django ile adaptasyon sağlayabiliyor yani tek başına tornado bi işe yaramıyor denebilir.
Ruby ile geliştirilen servisler : Twitter , Hulu
Ruby tercih etmeme nedenimde tornadonun python  ile yazılmış olup django ile senkrinizasyonunun yapılabilmesi realtime bir sistem kuracaksanız node.js şart lakin twitter.com ‘un mesajlaşma sistemindeki rezaleti ruby’deyki realtime eksikliğini açıkça gözler önünede seriyor.