26 Aralık 2013 Perşembe
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ı
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
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(" "))
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
#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.s10 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;
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
İkinci argüman ise bu soketin iletişim tipini gösteriyor.
Daha sonra, elimizdeki
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
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:
Artık
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.
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))
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
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)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:1 2 3 4 |
|
1 2 3 4 5 6 |
|
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.
4 Kasım 2013 Pazartesi
Paypal ipn with django
Is this your first time integrating Paypal with Django? Can't get the
signals to work? Don't know how to test django-paypal on your local
machine? Hopefully, this step-by-step blog post will address all the
above mentioned problems and more. This tutorial will cover only Paypal
Standard IPN although most of the initial steps are applicable for the
other payments methods as well.
1. Install django-paypal
There are a couple of version floating around namely:
Cramer's
is a fork from Boxall's version so it's more update. For this tutorial,
we will be using Boxall because we found Boxall's first.
- git clone git://github.com/johnboxall/django-paypal.git paypal
2. Create a PayPal developer account
- Goto https://developer.paypal.com and sign up.
- Once you're in, create a preconfigured account.
- Do this twice, one for account type Buyer and one for account type Seller
- Your dashboard should then look like this:
3. Modify settings.py file
- For the PAYPAL_RECEIVER_EMAIL, set this to the business account email you created in step 2. In this example, it is naiyun_1311845021_biz@od-eon.com
- After you have entered this, run syncdb to create the paypal tables
-
# settings.py
-
...
-
INSTALLED_APPS = (... 'paypal.standard.ipn', ...)
-
...
-
PAYPAL_RECEIVER_EMAIL = "naiyun_1311845021_biz@od-eon.com" #change this to yours
4. Create a url
# urls.py
-
from django.conf.urls.defaults import patterns, include, url
-
-
urlpatterns = patterns('',
-
# Examples:
-
url(r'^$', 'cat.homepage.views.home', name='home'),
-
url(r'^paypal/$', 'cat.homepage.views.paypal', name='paypal'),
-
-
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
-
url(r'^admin/', include(admin.site.urls)),
-
)
-
-
urlpatterns += patterns('',
-
(r'^something/hard/to/guess/', include('paypal.standard.ipn.urls')),
-
)
- Replace cat.homepage with your project.appname
5. Create a view and template
-
# views.py
-
...
-
from paypal.standard.forms import PayPalPaymentsForm
-
from django.conf import settings
-
from django.core.urlresolvers import reverse
-
-
def paypal(request):
-
-
# What you want the button to do.
-
-
paypal_dict = {
-
"business": settings.PAYPAL_RECEIVER_EMAIL,
-
"amount": "1.00",
-
"item_name": "name of the item",
-
"invoice": "unique-invoice-id",
-
"notify_url": "%s%s" % (settings.SITE_NAME, reverse('paypal-ipn')),
-
"return_url": "http://www.example.com/your-return-location/"
-
"cancel_return": "http://www.example.com/your-cancel-location/",
-
}
-
-
# Create the instance.
-
form = PayPalPaymentsForm(initial=paypal_dict)
-
context = {"form": form.sandbox()}
-
return render_to_response("paypal.html", context)
-
-
# paypal.html
-
-
{{ form }}
- Don't worry about what to put for settings.SITE_NAME first, we'll get to that in a bit
- The notify_url is the url that PayPal will try to send a POST request
- return_url is the page that Paypal redirects you to when the transaction is complete
- The form key in context renders a PayPal button. Right now we're using form.sandbox() to initiate the test process. Change this to form.render() to send the user to the real PayPal site
- You can add a "custom" key and value to the paypal_dict if you want to add a custom field later on
- If you're doing this test multiple times, you might run into an error message given by Paypal that says something like: This invoice has already been paid. For more information, please contact the merchant. To get around this, just change the invoice value everytime you try to make a purchase.
6. Now we fix the SITE_NAME
Sign up for an account at www.dyndns.com
- Add a new hostname. For service type, choose Host with IP address. Next, click on the link to populate the IP Address
- You should have something that looks like this:
- Add the Hostname to your settings.py file as SITE_NAME like so
-
# settings.py
-
...
-
SITE_NAME = 'http://nai.dyndns-free.com'
-
...
7. Run Django development server on your local IP
- For this to work, you need to configure your router to open port 80. The normal process is roughly like this:
- Goto your router IP e.g. 192.168.1.1
- Look for firewall or port forwarding
- Create an exception called 'django' or whatever with port 80 open
- Add this exception to the list of allowed applications that is tied to your computer
- Save
- Now, run Django's development server using sudo /etc/init.d/apache2 stop; sudo ./manage.py runserver 192.168.2.102:80
- Change 192.168.2.102:80 to your own IP address which you can locate by running ifconfig in bash. Retain port 80
- If all goes well, you should be able to open up in your browser the hostname you created at dyndns. In my case, nai.dyndns-free.com/paypal looks like this:
8. What goes on under the hood?
When
someone uses this button to buy something PayPal makes a HTTP POST to
your "notify_url" which comes as part of the Paypal package. PayPal
calls this Instant Payment Notification (IPN). The view
paypal.standard.ipn.views.ipn handles IPN processing. We have already
set the notify_url in step 4 as: urlpatterns += patterns('',(r'^something/hard/to/guess/', include('paypal.standard.ipn.urls')),)
When the notify_url is called, the ipn view is executed as shown below. You will need to include @csrf_exempt in the view as well
-
@require_POST
-
@csrf_exempt
-
def ipn(request, item_check_callable=None):
-
-
"""
-
PayPal IPN endpoint (notify_url).
-
Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
-
http://tinyurl.com/d9vu9d
-
-
PayPal IPN Simulator:
-
https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
-
"""
-
-
flag = None
-
ipn_obj = None
-
form = PayPalIPNForm(request.POST)
-
if form.is_valid():
-
try:
-
ipn_obj = form.save(commit=False)
-
except Exception, e:
-
flag = "Exception while processing. (%s)" % e
-
else:
-
flag = "Invalid form. (%s)" % form.errors
-
-
if ipn_obj is None:
-
ipn_obj = PayPalIPN()
-
-
ipn_obj.initialize(request)
-
-
if flag is not None:
-
ipn_obj.set_flag(flag)
-
else:
-
# Secrets should only be used over SSL.
-
if request.is_secure() and 'secret' in request.GET:
-
ipn_obj.verify_secret(form, request.GET['secret'])
-
else:
-
try:
-
ipn_obj.verify(item_check_callable)
-
except Exception, e:
-
flag = "Exception while processing. (%s)" % e
-
ipn_obj.save()
-
-
return HttpResponse("OKAY")
Just to elaborate a bit on the view, this line here ipn_obj.verify(item_check_callable) is the part that will invoke the sending of the signals. The verify() method can be found in paypal/models/standard/models.py which in turn calls the send_signals() method which can be found in paypal/models/standard/ipn/models.py
9. Final Stretch
So
now we need to set up something to receive these signals. This can live
anywhere in the project. The examples use models, so lets go with that.
-
# models.py
-
...
-
from paypal.standard.ipn.signals import payment_was_successful
-
-
def show_me_the_money(sender, **kwargs):
-
ipn_obj = sender
-
# Undertake some action depending upon `ipn_obj`.
-
if ipn_obj.custom == "Upgrade all users!":
-
Users.objects.update(paid=True)
-
print __file__,1, 'This works'
-
payment_was_successful.connect(show_me_the_money)
- If everything works ok when we click the buy now button, console should print the line 'This works'
- So, go back to your domain/paypal page. Click on the buy button link, it should re-direct you to the Paypal sandbox page. Log in using the personal account you created in step 2. Mine is naiyun_1311850509_per@od-eon.com
- Go through the buying process and if everything works, you should see something like this in your console
-
[05/Aug/2011 03:06:50] "GET /paypal/ HTTP/1.1" 200 1075
-
/home/nai/GitProjects/cat/homepage/models.pyc 1 This works
-
[05/Aug/2011 03:08:02] "POST /something/hard/to/guess/ HTTP/1.0" 200 4
Hope this tutorial has been helpful. If you
have any questions, do leave them in the comments and I 'll do my best
to answer them.
UPDATE
Just in case anyone is running into DB related problems, django-paypal uses South to handle it's model creation. So running ./manage.py syncdb will *not* create the Paypal related tables.
2 Kasım 2013 Cumartesi
Django şablon örnekleri..
Projemize template ve render to response ekliyoruz
Views.py
from django import template
from django.shortcuts import render_to_response
def fonksiyon(request):
return render_to_response('htmldosyasi.html', locas())
Şeklinde çekilir.
Views.py
from django import template
from django.shortcuts import render_to_response
def fonksiyon(request):
return render_to_response('htmldosyasi.html', locas())
Şeklinde çekilir.
Django örnek view dosyası oluşturma.
views.py
#-*- coding: utf-8 -*-
from django.http import *
def merhaba_dunya(request):
return HttpResponse(u'Merhaba Dünya')
url.py
ikinci satıra ekleyin
import views
urlpatternsin içine ekleyin
url(r'^merhaba/', views.merhaba_dunya)
/////
import random
def rastgele_sayi(request):
return HttpResponse('Rastgele sayi : , %f'% random.random())
url.py
url(r'^rastgele/', views.rastgele_sayilar),
#-*- coding: utf-8 -*-
from django.http import *
def merhaba_dunya(request):
return HttpResponse(u'Merhaba Dünya')
url.py
ikinci satıra ekleyin
import views
urlpatternsin içine ekleyin
url(r'^merhaba/', views.merhaba_dunya)
/////
import random
def rastgele_sayi(request):
return HttpResponse('Rastgele sayi : , %f'% random.random())
url.py
url(r'^rastgele/', views.rastgele_sayilar),
vsftpd FTP server nedir nasıl kurulur ?
vsftpd very secury ftp server bilmem ne anlamına geliyor ve mesela filezilla programı ile vps serverinıza yada linux herhangi bir serverınıza bağlanacaksınız normalde bağlanamıyorsunuz uzaktan bu programı kurmanız gerekiyor yada cyberduck tarzı programlar..
vsftpd kurlumu
Redhat/fedora/centos dağatımları için
Debian/ubuntu dağatımları için
komutlarını kullanarak, komut satırından vsftpd programını rahatça indirebilir ve sisteminize kurabilirsiniz.
Bu işlemleri yapıp programı kurduktan sonra ilk yapmanız gereken vsftpd’ nin configuration yani yapılandırma dosyasını ayarlamaktır.
Çoğu dağatımda bu dosyaya
Bu dosya içinde ise kullanıcı isimleri bulunmaktadır. Eğer bu dosya içindeki kullanıcı isimlerinin FTP sunucusunu kullanmalarına izin vermek istiyorsanız o zaman
Tüm bu uygulamaları yerine getirdikten sonra ise, artık vsftpd sunucusunu çalıştırabiliriz ve userlist dosyasını ayarladığımız için zaten sistemde kayıtlı bulunan kullanıcıların kullancı adları ve şifrelerini kullanarak sisteme girebiliriz. Bunun için aşağıdaki komutları girmeniz yeterli olacaktır.
/etc/init.d/vsftpd start –> Sunucuyu başlatır
/etc/init.d/vsftpd stop –> Sunucuyu durdurur
/etc/init.d/vsftpd restart –> Sunucuyu yeniden başlatır
Evet artık sunucunuzda çalışan bir FTP server sahibisiniz.
vsftpd kurlumu
Redhat/fedora/centos dağatımları için
yum install vsftpd
Debian/ubuntu dağatımları için
apt-get install vsftpd
komutlarını kullanarak, komut satırından vsftpd programını rahatça indirebilir ve sisteminize kurabilirsiniz.
Bu işlemleri yapıp programı kurduktan sonra ilk yapmanız gereken vsftpd’ nin configuration yani yapılandırma dosyasını ayarlamaktır.
Çoğu dağatımda bu dosyaya
/etc/vsftpd/
Bu dosyaya şu gisti yapıştırın : vspd raw
Fark ettiyseniz userlist_deny=NO
şeklinde yeni bir ayar girdim. vsftpd klasöründe userlist adında bir dosya daha bulunmaktadır.Bu dosya içinde ise kullanıcı isimleri bulunmaktadır. Eğer bu dosya içindeki kullanıcı isimlerinin FTP sunucusunu kullanmalarına izin vermek istiyorsanız o zaman
userlist_deny=NO
şeklinde ayarı
vsftpd yapılandırma dosyasına girmelisiniz, eğer bu listedeki
kullanıcıların FTP sunucusunu kullanmalarını engellemek istiyorsanız userlist_deny=YES
şeklinde ayarlamalısınız. Bu nedenle vsftpd sunucusunu başlatmadan önce bu dosyaya gözatmanızda yarar vardır.Tüm bu uygulamaları yerine getirdikten sonra ise, artık vsftpd sunucusunu çalıştırabiliriz ve userlist dosyasını ayarladığımız için zaten sistemde kayıtlı bulunan kullanıcıların kullancı adları ve şifrelerini kullanarak sisteme girebiliriz. Bunun için aşağıdaki komutları girmeniz yeterli olacaktır.
/etc/init.d/vsftpd start –> Sunucuyu başlatır
/etc/init.d/vsftpd stop –> Sunucuyu durdurur
/etc/init.d/vsftpd restart –> Sunucuyu yeniden başlatır
Evet artık sunucunuzda çalışan bir FTP server sahibisiniz.
1 Kasım 2013 Cuma
Linux ana dizindeki bin boot dev etc lib media mnt opt sbin srv tmp usr var nedir ne işe yararlar ?
Microsoft Windows gibi bir başka işletim sisteminden, Linux'a
geçen son kullanıcıların en büyük sıkıntılarından biri, dosya
sistemleri arasındaki farklardır. Windows konusunda biraz tecrübeli kime
sorsanız, Program Files, Windows, System32, Documents and Settings
klasörleri hakkında bilgi verebilir. Ancak Unix dünyası
farklıdır ve geçiş yapan kullanıcılar, hangi klasörün ne işe
yaradığını, hangisinin neyle alakalı olduğunu ilk bakışta çözemez. İşin
kötü tarafı, farklı dağıtımlar için, dosya sistem hiyerarşisi
değişebilir. Bu yazımızda, Linux Dokümantasyon Projesi (The Linux
Documentation Project) tarafından yayımlanmış Linux Dosya Sistemi Hiyerarşisini baz alarak, sizlere Linux dosya sistemi hakkında bilgi vereceğiz. Eğer daha çok bilgi almak isterseniz The Linux Documentation Project web sitesini ziyaret etmenizi tavsiye ederim.
Dosya Sistemi Nedir?
Dosya
sistemi, işletim sisteminin bir disk veya bölüm (partition) üzerindeki
dosyaları takip edebilmesi için oluşturulmuş yöntem ve veri yapıları
bütünüdür. Dosya sistemi farklı anlamlar için de kullanılıyor. Örneğin
iki diski olan bir kullanıcının "İki dosya sistemim var." dediğini
duymuşsunuzdur. Buna şimdilik girmeyelim. Bizi ilgilendiren Linux'taki
dosya yapısı.
Linux, bir Unix klonudur. Bu yüzden "Tekil Hiyerarşik Klasör Yapısı"nı benimsemiştir. Her şey / (slash) simgesiyle ifade edilen root klasöründen
başlar, aşağıya doğru iner. Windows'taki gibi C: D: şeklinde sözde
sürücüler (drivers) bulunmaz. Windows ortamında, dosyalarınızı C
sürücüsü, D veya E sürücüsü gibi her yere koyabilirsiniz. Bu tarz dosya
sistemlerine, "Hiyerarşik Yapı"lı denmektedir.
Linux,
/ (root) klasöründen başlayarak, boot işlemindeki önem sırasına göre
klasörleri dizer. Windows'taki gibi \ (ters slash) işareti değil de /
(slash) işareti kullanılmasının nedenini merak edebilirsiniz. Bu
Linux'un Unix geleneğini takip etmesindendir. Ayrıca bu geleneğe uygun
olarak küçük büyük harf duyarlılığı önemli bir konudur. Örneğin;
Windows'ta KLASOR_ADI ve klasor_adi aynı şeydir; fark etmez. Ama
Linux'ta iki ayrı klasörden bahsediyor oluruz.
Windows'ta
bir program yüklediğinizde, programa ait dosyaların büyük çoğunluğu
kendi klasörüne yüklenir. Örneğin Matlab'i, C:\Program Files\Matlab
adresine kurduğunuzda, ona ait yardım dosyaları, bu klasör altındadır.
Fakat Linux farklı çalışır; program dokümanlarını
/usr/share/doc/program_adi/ altına koyarken, man(ual) dosyaları,
/usr/share/man/man[1-9] altına koyar. Eğer varsa info dosyaları da,
/usr/share/info altına atılır. Kısacası, sistem hiyerarşisine gömülen
bir yapı söz konusudur. Yüklenen herhangi bir program, işletim
sisteminin muhtelif yerlerine yerleşmektedir.
Linux'un
popülerleşmeye başladığı 90'ların ortalarında, dağıtım geliştiriciler,
dosyaları yerleştirmek için kendilerine en uygun şekilde çalıştılar;
belirli bir standart yoktu. Bu birçok soruna neden oldu. Bu anarşiyi
durdurmak için daha sonraları Linux Dosya Sistem Hiyerarşisi (kısaca
FSSTND) belirlendi. Bizim anlatacağımız yapı da bu standart dahilinde.
Linux
ve dosya sistemiyle ilgili söylenecek çok şey var; ama özet geçip son
kullanıcının ihtiyacına cevap vermek daha doğru olur: "Linux'ta hangi
klasör ne işe yarar?"
/ (root) :
Yukarda belirttiğimiz gibi, / (root) işletim sisteminin başlangıç
noktasıdır. Bütün diğer klasörler, dosyalar, root'un 'çocuklarıdır'.
Bilgisayar başlarken, ilk önce buraya bakılır ve bulunmazsa sistem
başlamaz. / (root) ve /root (root kullanıcısına ait klasör) birbirinden
ayrıdır. İleriki bölümde farkını açıklayacağız.
FSSTND'a Göre root Altındaki Temel Klasörler
/bin: Olması şart komut dosyalarını içerir.
/boot: Başlangıç için gerekli dosyaları bulundurur.
/dev: Donanım dosyaları vardır.
/etc: Sistem ayarlarını barındırır.
/lib: Kütüphane dosyaları ve çekirdek modülleri bulunur.
/media: Kaldırılabilir aygıtların (CD-ROM, flash bellek vs...) sisteme eklendiği klasördür.
/mnt: Bir dosya sistemini geçici olarak eklemek için kullanılır.
/opt: Ekstra programların kurulması içindir.
/sbin: Sistemi yöneticisiyle ilgili çalıştırabilir dosyaları tutar.
/srv: Sistemin sunduğu hizmetlerle alakalıdır.
/tmp: Geçici dosyaları tutmak içindir.
/usr: İkincil bir hiyerarşi.
/var: Değişken verileri saklar.
/boot: Başlangıç için gerekli dosyaları bulundurur.
/dev: Donanım dosyaları vardır.
/etc: Sistem ayarlarını barındırır.
/lib: Kütüphane dosyaları ve çekirdek modülleri bulunur.
/media: Kaldırılabilir aygıtların (CD-ROM, flash bellek vs...) sisteme eklendiği klasördür.
/mnt: Bir dosya sistemini geçici olarak eklemek için kullanılır.
/opt: Ekstra programların kurulması içindir.
/sbin: Sistemi yöneticisiyle ilgili çalıştırabilir dosyaları tutar.
/srv: Sistemin sunduğu hizmetlerle alakalıdır.
/tmp: Geçici dosyaları tutmak içindir.
/usr: İkincil bir hiyerarşi.
/var: Değişken verileri saklar.
Günümüzde Linux dağıtımlarının
büyük çoğunluğu, zaman zaman FSSTND tarafından belirlenmiş klasörlerin
dışına çıkabiliyor. Bu tanıma bazen bir iki klasör eklendiğini ya da
nadiren bu yapıdan bir klasörün çıkarıldığını görüyoruz. Biz gerek
güncel dağıtımları, gerekse FSSTND'yi baz alarak incelememizi yapacağız.
Ancak yazımızda FSSTND tarafından belirlenen bütün klasörler
olmayacak. Linuxdosya
sistemi oldukça derin bir konu ve her şeyi anlatmaya kalkarsak, ayrı
bir kitapçık yayımlamamız gerekir. Bunun yerine, son kullanıcının daha
çok ilgisini çekecek ve genellikle haşır neşir olabileceği klasörleri
ele alacağız.
/bin
İşletim
sisteminizi kullanmak için gereken birçok yararlı komut /bin klasörü
altındadır. cat, mkdir, cp, ls, mv, rm vb. temel komutların hepsini
burada bulabilirsiniz. Sistem boot ettiğinde, ilk olarak /bin klasörü
çalışır hâle getirilir. Network bağlantınız olmasa ya da önemli
klasörlere bir nedenden dolayı erişemeseniz bile, /bin klasöründeki
komutlar ne olursa olsun çalışır. Bir sorun çıktığında, /bin klasörü
altındaki komutları kullanarak sistemi onarırız.
/boot
Boot,
işletim sisteminin yüklenme evresidir. /boot klasörü, boot işlemi için
gereken her şeyi içerir. Bilgisayarın başlangıç (boot) aşamasında
gerekmeyen ayar ve yapılandırma dosyaları burada bulunmaz; başka
klasörlerden gerektiği zamanlarda yüklenir.
/dev
Linux'ta
her şey bir dosyadır; donanım aygıtları da öyle. USB girişleri, seri ve
paralel portlar, diskleriniz, CD-ROM'larınız vb... Bütün aygıtlar /dev
klasörü altında tutulan dosyalardan ibarettir. Örneğin /dev altında
bulunan hda1 dosyası, sabit diskinizi temsil eder. Ya da /dev/dsp, ses
aygıtınızdır. Bunları programlar vasıtasıyla kullanırız; ancak direkt
müdahale etmek mümkündür. Mesela "cat /boot/vmlinuz > /dev/dsp"
yazarak Kernel'in sesini duyabilirsiniz.
Bazı Önemli Aygıt Dosyaları
/dev/ttyS0
Fare, modem gibi aygıtların bağlandığı seri port. (COM 1)
/dev/psaux
PS/2 girişi; fare ve klavyeler içindir.
/dev/lp0
Paralel port (LPT 1); yazıcı, tarayıcı vs...
/dev/dsp
Birincil ses aygıtı
/dev/usb
USB aygıtları
/dev/sda
SCSI aygıtlar, Flash Bellekler, harici CD-ROM'lar vs...
/dev/scd
SCSI CD-ROM'lar
/dev/js0
Joystick (Microsoft Türkçesiyle Eğlence Çubuğu)
/etc
İşletim
sistemini bir vücuda benzetirsek, /etc klasörünü sinir sisteminin
merkezi olarak görebiliriz. Sisteme dair bütün yapılandırma, bu klasör
veya bu klasörün alt klasörlerinde bulunur. Yapılandırma dosyası, bir
programın işlemlerini kontrol etmek için kullanılan lokal bir dosyadır;
durağandır ve çalıştırılmak için değildir.
/etc
klasörü içerisinde bulunan bütün klasör ve yapılandırma dosyalarını tek
tek incelememiz mümkün değil. Ancak son kullanıcının işine yarayacak
bir ipucu verebiliriz.
Sürekli DNS problemleri yaşayanlar, /etc/resolv.conf dosyasını root olarak
açıp yeni DNS adresleri ekleyebilir. Siz de bu sorunlardan
muzdaripseniz, root olarak bu dosyayı açıp aşağıdaki satırları dosyanın
en başına ekleyin:
nameserver 208.67.222.222
nameserver 208.67.220.220
nameserver 208.67.222.222
nameserver 208.67.220.220
Verilen
adresler OpenDNS adında bir firmaya ait. Telekom'un adresleri yerine
bunları kullanırsanız; adres çözümleme problemleriniz geride kalacaktır.
Üstelik erişimi engellenen sitelere de girebilirsiniz.
/home
Zamanında
home klasörüyle ilgili hoş bir tanım duymuştum; /home klasörünü
kullanıcıların kalesi olarak açıklıyordu. Bu gayet yerinde bir açıklama.
/home klasörü içerisinde her kullanıcının kendi adında bir alt klasörü
bulunur. Örneğin kullanıcı adınız "ali" ise, /home/ali size aittir ve
altında istediğiniz her şeyi yapabilirsiniz; ama yapabilecekleriniz bu
klasörle sınırlıdır. /home klasörünü, Windows'taki Documents and
Settings'e benzetebiliriz. Ama daha güvenli bir yapıdır. Çünkü Linux'ta bir başkasının ev klasörüne müdahale edemezken, Windows'ta çok zorlanmadan istediğinizi yapabilirsiniz.
/initrd
initrd,
"initial ramdisk" kısaltmasıdır. Aşağı yukarı anlamı "Başlangıç Bellek
Diski" oluyor. Boot aşamasında ilk önce çekirdek (kernel) yüklenir.
Bundan sonra bilgisayarınızın belleğinde bir Bellek Diski oluşturulur.
Oluşturulan Bellek Disk üzerinde / (root) yansısı açılır ve kök dizin
olarak monte edilir. /initrd bu işlemlerin yapılması ve Linux'un
yüklenmesi için gereklidir.
/lib
Çekirdek
modülleri ve paylaşılan kütüphane dosyaları bu klasörde bulunur. Var
olan çekirdek modüllerini /lib/modules/[versiyon_numarasi] içerisinde
bulabilirsiniz. Bahsedilen kütüphane dosyalarıysa, sistemi başlatmak ve
/bin ile /sbin içerisindeki komutları çalıştırmak için gereklidir.
Paylaşılan kütüphane dosyalarını, Windows'ta DLL (Dynamically Linked
Library) ile eş tutabiliriz. Linux'ta kütüphane dosyalarının sonu ".so" ile biter.
/lost+found
İngilizce
bir terim olan Lost and Found, "kayıp eşya bürosu" demektir.
/lost+found klasörünün yaptığı işi düşününce, bundan uygun bir isim
herhâlde olamazdı.
Bazen
sistemimizde bir problem olur; yanlış kapatırız, elektrik gider, durup
dururken bilgisayar yeniden başlar vs... Bu gibi durumlarda Linux'ta
fsck (File System Check) komutu devreye sokulur. fsck, Windows'taki
Scandisk programına benzetilebilir. Düzeltilemeyen bir sorun varsa,
bağlantıları kopmuş kayıp dosyalar ortaya çıkmışsa, bunlar /lost+found
altına atılır. Bağlantı kopması, inode gibi konulara girmek istemiyorum;
biraz karmaşık. Kısaca özetlersek; kötü bir sistem kapanmasından sonra,
olması gereken bazı dosyaları bulamıyorsanız, kayıp eşya bürosuna
bakmanızda yarar var.
/media
CD-ROM,
disket sürücü, flash bellek gibi çıkarılabilir aygıtlar buraya
bağlanır. En basit tanımla, çıkarılabilir aygıtların, bağlantı noktası
(mount point) olarak düşünebilirsiniz.
/mnt
/media
klasörüne benzer. Temel farkı; çıkarılabilir aygıtlar yerine, dosya
sistemleri veya donanım aygıtları için kullanılıyor oluşudur. Bağlama (mount)
işlemi, herhangi bir dosya sistemini, işletim sisteminin kullanmasını
sağlar. Nereye bağladığınız sizin tercihinizdir. Yani bir diski, /media
veya /mnt klasörüne ya da bir başka yere bağlamanız fark etmeyecektir.
Sadece genel kabul görmüş bazı bağlantı noktaları bulunuyor; /mnt
klasörü de onlardan bir tanesi.
/opt
Dağıtımdan
bağımsız ekstra yüklenen paketler için /opt klasörü kullanılmaktadır.
Örneğin; Google Earth programını indirip kurmak istediğinizde, 'default'
olarak kurulacağı nokta, /opt/google-earth adresidir.
Elbette
ki bunu değiştirebilir ve size uygun gelen bir başka konuma
yükleyebilirsiniz. Ancak daha önce söylediğimiz gibi bazı şeyler genel
kabule dayanır. Ekstra yüklenen yazılımların, /opt adresine atanması da
buna bir örnektir. Windows'taki C:\Program Files'i hatırlayalım;.
programları buraya kurmak zorunlu değil; ama hemen hepsi buraya
kuruluyor. Aynı mantık burada da geçerli.
/proc
/proc
oldukça özel sanal bir dosya sistemidir. Bizim bildiğimiz anlamda
fiziksel dosyalar bulundurmaz; sistem durumuna dair bilgi içeren sanal
dosyaları vardır. Örneğin "cat /proc/swaps" yazarak sisteminizdeki takas
dosyalarına dair bilgi alabilir ya da "cat /proc/cpuinfo" komutuyla
işlemcinizin özelliklerini görebilirsiniz.
/proc klasörü içersindeki dosyalar, sadece sistem durumunu
görüntülemek için kullanılmaz, gerektiğinde sistemde ayarlama yapmak
için de kullanılabilir. Fakat son kullanıcılara hitap eden bir konu
değildir./root
Unix'in
ilk versiyonlarında root kullanıcısının kendine ait bir ev klasörü
yoktu. Direkt olarak / (root klasörü) altında çalışırdı. Fakat zamanla
bunun iyi bir yöntem olmadığı anlaşıldı ve root kullanıcısının ayrı bir
klasöre sahip olması gerektiğine karar verildi. Diğer kullanıcılardan
farklı olduğu için root, ev klasörü /home altında tutulmaz; /root
klasörü olarak ayrılmıştır.
/sbin
Linux'ta
normal kullanıcının kullanabileceği komutlarla, sistem kullanıcısının
kullanabileceği komutlar ayrılmıştır. root tarafından kullanılacak bakım
ve yönetim için kullanılan önemli programlar, /sbin altında tutulur.
Daha az öneme sahip yönetim komutlarıysa, /usr/sbin klasöründedir. Eğer
lokalde, yani kullandığınız makineye özgü yönetici (root) komutları
bulunuyorsa, bunları da /usr/local/sbin altında bulabilirsiniz.
/usr
/root kullanıcısına
benzer bir hikâye /usr için de söz konusudur. Unix ilk çıktığında,
kullanıcılara ait ev klasörleri, /usr altında tutulurdu. Örneğin;
"cagatay" isimli bir kullanıcının ev klasörü /usr/cagatay şeklindeydi.
Bu yöntem zamanla değişti ve /home klasörü doğmuş oldu. /usr klasörü
hâlâ çok önemli bir yapıdır ve işletim sisteminizde kullandığınız her
şeyle ilişkisi bulunur.
/usr
klasörünün önemi, yüklediğiniz programların buraya atılmasından
kaynaklanır. /opt adresi işletim sistemi dışında gelen 3.parti
programlar içindir. Fakat işletim sistemi aracılığıyla ya da paket
yönetim sistemlerini kullanarak yüklediğiniz her şey, /usr altına
aktarılır. Aynı zamanda yüklediğiniz programların çalışmak için ihtiyaç
duyacağı kütüphane dosyaları, /usr/lib altındadır.
/usr
ile ilgili söylenebilecek bir başka nokta da "local" klasörüdür. Linux,
sunucu olarak birçok istemciye hizmet verebilecek bir işletim
sistemidir. Bir Linux sunucu (server) kurarsanız, ona bağlanan yüzlerce
istemci (client) olabilir. Her istemci bilgisayara, /usr altındaki
programların ayrı ayrı yüklenmesi gerekmez; bir başka konumdan bu
komutları çalıştırabilirsiniz. Ancak /usr altında bulunan "local"
klasörü sadece kullandığınız makineye özeldir. Örneğin /usr/local/bin
klasörü içinde bulunan bütün komutlar, direkt olarak kullandığınız
makineye yüklenmiştir. /usr/bin komutları ise geneldir ve bir ağ
üstündeki bütün makinelerden erişilebilir. "local" gördüğünüzde, bunun
sadece sizin makinenize özel olduğunu bilin.
/var
Log
dosyaları, e-posta ve yazıcı kuyrukları gibi değişken sistem
bilgilerini barındırır. Sisteminize dair tutulan log'ları buradan
görebilir; güvenlik durumunu buradan kontrol edebilirsiniz.
/tmp
Geçici
dosyalar içindir. Birçok program, burayı geçici depolama alanı olarak
kullanır. /tmp klasörünün içeriği genellikle KB'lar mertebesinde kalır
ve genellikle işletim sistemi yeniden başlarken içindeki dosyalar
silinir. /tmp klasörü altında bulunan dosyaları, ne yaptığınızdan emin
değilseniz, kesinlikle silmemelisiniz! Sistem genelinde olmasa bile,
program bazında problemler çıkabilir. Örneğin açık bir soket dosyasını
sildiğinizde, onu kullanan programa ve kendinize sorun
çıkartabilirsiniz.
24 Ekim 2013 Perşembe
Uinstall any program with linux command line.
1. dpkg --list // listed all program names.
2.sudo apt-get --purge remove <programname>
3.sudo apt-get remove <programname>
2.sudo apt-get --purge remove <programname>
3.sudo apt-get remove <programname>
22 Ekim 2013 Salı
Paypal button
<form method="post" action="https://www.paypal.com/cgi-bin/webscr">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="followzilla@hotmail.com.tr">
<input type="hidden" name="item_name" value="Twitter 1000 Retweet">
<input type="hidden" name="custom" value="<? echo $tid ; ?>">
<input type="hidden" name="item_number" value="1000">
<input type="hidden" name="amount" value="8">
<input type="hidden" name="currency_code" value="TRY">
<input type="hidden" name="return" value="http://retweetkazanv2.info/">
<input type="hidden" name="undefined_quantity" value="1">
<input type="hidden" name="lc" value="TR">
<input type="image" src="http://www.paypalobjects.com/tr_TR/i/btn/x-click-but23.gif" border="0" name="submit" width="68" height="23" alt="Ödemelerinizi PayPal ile hızlı, ücretsiz ve güvenli şekilde yapın.">
</form>
live
https://www.paypal.com/cgi-bin/webscr
sandbox
https://www.sandbox.paypal.com/cgi-bin/webscr
Bişiler yazmaya gerek yok bu gayet yeterli bir kaynak.
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="followzilla@hotmail.com.tr">
<input type="hidden" name="item_name" value="Twitter 1000 Retweet">
<input type="hidden" name="custom" value="<? echo $tid ; ?>">
<input type="hidden" name="item_number" value="1000">
<input type="hidden" name="amount" value="8">
<input type="hidden" name="currency_code" value="TRY">
<input type="hidden" name="return" value="http://retweetkazanv2.info/">
<input type="hidden" name="undefined_quantity" value="1">
<input type="hidden" name="lc" value="TR">
<input type="image" src="http://www.paypalobjects.com/tr_TR/i/btn/x-click-but23.gif" border="0" name="submit" width="68" height="23" alt="Ödemelerinizi PayPal ile hızlı, ücretsiz ve güvenli şekilde yapın.">
</form>
live
https://www.paypal.com/cgi-bin/webscr
sandbox
https://www.sandbox.paypal.com/cgi-bin/webscr
Bişiler yazmaya gerek yok bu gayet yeterli bir kaynak.
2 Ekim 2013 Çarşamba
How to fix tweepy reauth "Unable to get username, invalid oauth token" problem.
access_key = #user access token
access_secret = #user access secret
oauth = tweepy.OAuthHandler(#consumer_key, #consumer_secret)
oauth.set_access_token(access_key, access_secret)
api = tweepy.API(oauth)
try:
user = api.me()
except tweepy.TweepError:
#token problem here
Yasin aktimur
29 Eylül 2013 Pazar
Django’da signals kullanımı
Django’da signals kullanımı
Django’nun admin paneli çoğu durum için yeterli olsa da biraz değişik bir şey yapmak istediğinizde tutorial’da bahsedilenden farklı bir işlem yapmanız gerekiyor. Sinyaller (signals), Django’nun bu durumda yardımcı olabilecek bir özelliği.
Sinyaller, uygulamada belirlenen alıcıların göndericilerin yaptığı işlemlerden haberdar olmasını sağlar. Bu ne demek biraz açalım; mesela bir modeliniz var ve bu model save edildiği zaman başka bir fonksiyon çağırmak istiyorsunuz. Modelinizi gönderici (sender) olarak belirleyip olurturduğunuz diğer bir fonksiyonu da alıcı (receiver) olarak gösterebilirsiniz.
Django’da kendiniz sinyal fonksiyonlarınızı oluşturabileceğiniz gibi hazırda bulunan sinyaller de mevcut. Modellerin kaydedilme esnasında (öncesinde ve sonrasında) tetiklenen sinyaller ve http isteği başlarken ve biterken tetiklenen sinyaller gibi.
Bir örnek vermek gerekirse:
Ekipman isimli bir modelimiz olsun. Bu modelde her değişiklik yapıldığında bunu ayrı bir tabloda tutmak istiyoruz. Böylelikle ekipmanda yapılan her değişikliği kayıt altında tutabileceğiz.
Gecmis isimli bir de tablomuz var. Buna da yapılan değişiklikleri kaydedeceğiz.
Şimdi de kayıt işlemini gerçekleştirecek fonksiyonumuzu oluşturalım.
Alıcı fonksiyonu her zaman sender ve kwargs parametrelerini almalıdır. sender parametresi göndericinin sınıfını (instance’ını değil) tutar. Oluşturduğumuz modelin kendisini (instance’ını) almak için kwargs içindeki instance anahtarını kullanmamız gerekir.
Bu fonksiyonu iki şekilde gönderici ile bağlayabiliriz. Model kaydedildikten sonra alıcının çağırılmasını istediğimize göre:
Veya fonksiyonu bir decorator ile kullanalım:
şeklinde kullanabiliriz.
Yasin Aktimur
Django’nun admin paneli çoğu durum için yeterli olsa da biraz değişik bir şey yapmak istediğinizde tutorial’da bahsedilenden farklı bir işlem yapmanız gerekiyor. Sinyaller (signals), Django’nun bu durumda yardımcı olabilecek bir özelliği.
Sinyaller, uygulamada belirlenen alıcıların göndericilerin yaptığı işlemlerden haberdar olmasını sağlar. Bu ne demek biraz açalım; mesela bir modeliniz var ve bu model save edildiği zaman başka bir fonksiyon çağırmak istiyorsunuz. Modelinizi gönderici (sender) olarak belirleyip olurturduğunuz diğer bir fonksiyonu da alıcı (receiver) olarak gösterebilirsiniz.
Django’da kendiniz sinyal fonksiyonlarınızı oluşturabileceğiniz gibi hazırda bulunan sinyaller de mevcut. Modellerin kaydedilme esnasında (öncesinde ve sonrasında) tetiklenen sinyaller ve http isteği başlarken ve biterken tetiklenen sinyaller gibi.
Bir örnek vermek gerekirse:
Ekipman isimli bir modelimiz olsun. Bu modelde her değişiklik yapıldığında bunu ayrı bir tabloda tutmak istiyoruz. Böylelikle ekipmanda yapılan her değişikliği kayıt altında tutabileceğiz.
class Ekipman(models.Model):
seri_no = models.CharField(max_length=20)
bulundugu_yer = models.CharField(max_length=20)
tamirde = models.BooleanField()
notlar = models.TextField(blank=True)
Gecmis isimli bir de tablomuz var. Buna da yapılan değişiklikleri kaydedeceğiz.
class Gecmis(models.Model):
ekipman = models.ForeignKey(Ekipman)
seri_no = models.CharField(max_length=20)
bulundugu_yer = models.CharField(max_length=20)
tamirde = models.BooleanField()
notlar = models.TextField(blank=True)
Şimdi de kayıt işlemini gerçekleştirecek fonksiyonumuzu oluşturalım.
def GecmisTut(sender, **kwargs):
ekipman = kwargs['instance']
gecmis = Gecmis(ekipman = ekipman, \
seri_no = ekipman.seri_no, \
bulundugu_yer = ekipman.bulundugu_yer, \
tamirde = ekipman.tamirde, \
notlar = ekipman.notlar)
ekipman.save()
Alıcı fonksiyonu her zaman sender ve kwargs parametrelerini almalıdır. sender parametresi göndericinin sınıfını (instance’ını değil) tutar. Oluşturduğumuz modelin kendisini (instance’ını) almak için kwargs içindeki instance anahtarını kullanmamız gerekir.
Bu fonksiyonu iki şekilde gönderici ile bağlayabiliriz. Model kaydedildikten sonra alıcının çağırılmasını istediğimize göre:
from django.models.signals import post_save
def GecmisTut(sender, **kwargs):
ekipman = kwargs['instance']
gecmis = Gecmis(ekipman = ekipman, \
seri_no = ekipman.seri_no, \
bulundugu_yer = ekipman.bulundugu_yer, \
tamirde = ekipman.tamirde, \
notlar = ekipman.notlar)
ekipman.save()
post_save.connect(GecmisTut, sender=Gecmis)
Veya fonksiyonu bir decorator ile kullanalım:
from django.models.signals import post_save
@receiver(post_save, sender=Ekipman)
def GecmisTut(sender, **kwargs):
ekipman = kwargs['instance']
gecmis = Gecmis(ekipman = ekipman, \
seri_no = ekipman.seri_no, \
bulundugu_yer = ekipman.bulundugu_yer, \
tamirde = ekipman.tamirde, \
notlar = ekipman.notlar)
ekipman.save()
şeklinde kullanabiliriz.
Yasin Aktimur
24 Eylül 2013 Salı
Django Projesini virtualenv wsgi gunicorn supervisor ve nginx kullanarak VPS server'a Deploy etmek.
Vps server için ben digitalocean kullanıyorum linkten kaydolursanız banada sakal atıyor.
Django'yu mod_wsgi ve apache ile deploy edebilirsiniz bunun için ortalıkta bir çok tutorial var hatta türklerin django öğrenmek için başvuracağı kaynak olan mustafa başer 'in yazdığı django kitabındada mod_wsgi + apache anlatılmış fakat en mükkemmel sonucu Green Unicorn (Gunicorn) [wsgi] + Nginx verdiği için ki zaten wsgi 'yi dahil etmesek bile Nginx 'in apacheden daha iyi bir web server olduğuda kanıtlanmış .
Önce size worker'ın ne olduğundan bahsedeyim diyelim ki 1 cpu 'ya sahip bir VPS 'e sahipsiniz.
1*2+1 = 3 adet worker kullanma hakkınız var. . 2 cpu 'nuz varsada 2*2+1 den 5 worker eder.
Eğer verdiğim linkten 1 aylık 5 dolara vps alırsanız 1 cpu nuz olacak ve 3 worker ile çalışacaksınız.
Yukarıdaki grafikte uwsgi 10 çalışan'la 2500 request işleyebiliyormuş saniyede.
Diğer grafikte 2100 5 workerla neredeyse yarım worker ama sonuç neredeyse eşit .
Bu güç nereden geliyor derseniz cevap : gunicorn
Django'yu mod_wsgi ve apache ile deploy edebilirsiniz bunun için ortalıkta bir çok tutorial var hatta türklerin django öğrenmek için başvuracağı kaynak olan mustafa başer 'in yazdığı django kitabındada mod_wsgi + apache anlatılmış fakat en mükkemmel sonucu Green Unicorn (Gunicorn) [wsgi] + Nginx verdiği için ki zaten wsgi 'yi dahil etmesek bile Nginx 'in apacheden daha iyi bir web server olduğuda kanıtlanmış .
Önce size worker'ın ne olduğundan bahsedeyim diyelim ki 1 cpu 'ya sahip bir VPS 'e sahipsiniz.
1*2+1 = 3 adet worker kullanma hakkınız var. . 2 cpu 'nuz varsada 2*2+1 den 5 worker eder.
Eğer verdiğim linkten 1 aylık 5 dolara vps alırsanız 1 cpu nuz olacak ve 3 worker ile çalışacaksınız.
Yukarıdaki grafikte uwsgi 10 çalışan'la 2500 request işleyebiliyormuş saniyede.
Diğer grafikte 2100 5 workerla neredeyse yarım worker ama sonuç neredeyse eşit .
Bu güç nereden geliyor derseniz cevap : gunicorn
Sistemimizi upgrate ediyoruz.
$ sudo apt-get update
$ sudo apt-get upgrade
Gerekli şeyleri indirelim.
$ sudo apt-get install vim
$ apt-get install git
Vim : Komut listesinde dosya editlemeyi sağlar 4 reslik bir eğitimi var youtube 'Da
isteyen 15 dakikasını ayırıp dinleyebilir olmazsa olmazlardan : Vim dersleri
2. Git : Git Github'ın kullandığı versiyon Kontrol sistemidir.
değil odtü, boun falan; harvard ya da stanford mezunu bile olsa,
eğer ki adam github'dan bihaberse, yazılımcıyım falan dememelidir.
o derece mühimdir. o derece vazgeçilmezdir kanaat-i acizanemce.
Github ve git hakkında ekşisözlük
virtualenv
sudo apt-get install python-virtualenv
$ cd /opt
$ virtualenv venv
New python executable in venv/bin/python
Installing distribute..............done.
Installing pip.....................done.
$cd venv
$. bin/activate
Yakın zamanda udemy'de ücretsiz venv kullanımını anlatan ders yapıp buraya ekleyeceğim.
şimdilik virtualenv hakkında bilgi için şu yazıyı okuyun : Virtualenv nedir ?
virtualenv'i aktif ettik .
(venv)$ şeklinde olması gerekiyor komut satırının venv aktif olunca !
$ pip install django
$ django-admin.py startproject hello
$ cd hello
$ python manage.py syncdb
Gunicorn
$ pip install gunicorn
sitenizin settings.py 'de
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.admindocs',
'gunicorn'
)
Eklemeyi unutmayın !
$ gunicorn_django --bind siteniz.com:8001
http://siteniz.com:8001
Yaptığınızda sitenizi başarılı bir şekilde görüntülüyor olacaksınız !
Şimdi venvin içindeki
bin klasörü içine girelim..
vi gunicorn_start
diyerek boş bi sayfa oluşturun ve buraya vim 'de bişiler eklemek
için i tuşuna basın artık buraya istediğinizi yazabilirsiniz ..
Şimdi gunicorn_starta buradakileri yapıştırın. gunicorn_start rawı
gunicorn_start'ı executable yapalım şu an bin klasöründeyiz..
$ chmod u+x gunicorn_start
Gunicorn startı başlatalım..
$. gunicorn_start (arada boşluk olmayada bilir onuda deneyin olmazsa)
Şu ekran çıkacak ..
Starting hello_app
2013-06-09 21:14:07 [2792] [INFO] Starting gunicorn 0.17.4
2013-06-09 21:14:07 [2792] [DEBUG] Arbiter booted
2013-06-09 21:14:07 [2792] [INFO] Listening at: unix:/webapps/hello_django/run/gunicorn.sock (2792)
2013-06-09 21:14:07 [2792] [INFO] Using worker: sync
2013-06-09 21:14:07 [2798] [INFO] Booting worker with pid: 2798
2013-06-09 21:14:07 [2799] [INFO] Booting worker with pid: 2799
2013-06-09 21:14:07 [2800] [INFO] Booting worker with pid: 2800
$ sudo apt-get install python-dev
Supervisiord ...
$ sudo apt-get install supervisor
$ cd
/etc/supervisor/conf.d
hello.conf diye bi dosya oluşturalım .
$vi hello.conf
ve bu raw'ı yapıştırın . hello raw
Supervisor ayarları ile ilgili daha fazla bilgi için şuraya bakın bize bu kadarı yeterli.
$ mkdir -p /opt/venv/logs/
$ touch /opt/venv/logs/gunicorn_supervisor.log
Supervisord aktif etme.
$ sudo supervisorctl reread
hello: available
$ sudo supervisorctl update
hello: added process group
Supervisord durumlarını kontrol etme durdurma başlatma vs işlemler
$ sudo supervisorctl status hello
hello RUNNING pid 18020, uptime 0:00:50
$ sudo supervisorctl stop hello
hello: stopped
$ sudo supervisorctl start hello
hello: started
$ sudo supervisorctl restart hello
hello: stopped
hello: started
Nginx
$ sudo apt-get install nginx
$ sudo service nginx start
$ cd /etc/nginx/sites-available
$ vi hello
Hello'yada buradakileri kendinize göre değiştirip atıyorsunuz. nginx raw
sites-enabled klasörüne sembolik link vermeniz gerekiyor .
$ ln -s /etc/nginx/sites-available/hello /etc/nginx/sites-enabled/hello
Nginx'i restart ediyoruz ve sistemimiz hazır.
$ sudo service nginx restart
Yasin Aktimur Twitter
Kaydol:
Kayıtlar (Atom)