15-8-2010, 5:10 ö.s. //
//
python
, pygame
, django
Python ile Django'dan sonra pygame'e el attım biraz. Daha yeni başladım ve henüz pygame'in özelliklerinin çok azından yararlanarak birşeyler yapabiliyorum. Aşağıdaki kod ilk yazdığım basit bir çarpışma şeyi(neyi ben de bilmiyorum). İstediğiniz büyüklükte ekrana istediğiniz kadar top ekleyip onları rastgele hızlarda bir yerlere yolluyor ve çarpıştırıyor.
import pygame, random, math
screenx, screeny = 500, 500 #ekran buyuklugu
class Ball:
def __init__(self, surface):
self.surface = surface
self.radius = 10
self.color = (255, 255, 255)
self.x = random.randint(0+self.radius, screenx-self.radius)
self.y = random.randint(0+self.radius, screeny-self.radius)
self.vx = random.randint(1, 10)
self.vy = random.randint(1, 10)
def move(self, time_passed):
if self.x >= screenx-self.radius or self.x <= self.radius:
self.vx *= -1
if self.y >= screeny-self.radius or self.y <= self.radius:
self.vy *= -1
self.x += self.vx * time_passed
self.y += self.vy * time_passed
def draw(self):
pygame.draw.circle(self.surface, self.color, (self.x, self.y),
self.radius)
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((screenx, screeny), 0, 32)
running = True
balls = []
for i in range(1, 21): #top sayisi
balls.append(Ball(screen))
def CollisionDetect(b1):
for b2 in balls:
if b1 is not b2:
range = math.sqrt((b1.x - b2.x)**2 + (b1.y - b2.y)**2)
if range < (b1.radius + b2.radius):
b1.vx, b2.vx = b2.vx, b1.vx
b1.vy, b2.vy = b2.vy, b1.vy
#b1.move(); b2.move()
while running:
for event in pygame.event.get():
#print event
if event.type == pygame.QUIT:
running = False
time_passed = clock.tick(50)
screen.fill((0, 0, 0))
for b in balls:
b.draw()
CollisionDetect(b)
b.move(time_passed)
pygame.display.flip()
Onun dışında kendime bir okunacaklar listesi hazırladım, ilk fırsatta okuyacaklarım:
6-8-2010, 10:49 ö.s. //
//
python
, nautilus
Daha önceden burada duyurdum arşiv düzenleyiciyi biraz daha geliştirdim.
Programın amacı basitçe mp3, ogg ve flac dosyalarından oluşan müzik arşivinizi düzenlemek. Ayrı bir klasöre kopyalayabiliyor ya da aynı klasörde dosyaları taşıyarak düzenleyebiliyor. Formata uymayan dosyaları da ayrı bir klasörde topluyor.
Bu arada not, müziklerinizi id3 etiketlerine göre düzenliyor, etiketleri yoksa, ayrı bir klasöre kopyalıyor.
Yeni sürümde bir de nautilus scripti hazırladım. Bunun sayesinde düzenlemek istediğiniz klasöre sağ tıklayıp seçerek daha kolay düzenlenebiliyor.
Önce:
Sonra:
Onun dışında aynı klasörde dosyaları taşıyarak düzenleme özelliğini de yeni ekledim. İki ayrı scriptten birisi aynı klasör içerisinde taşıyarak düzenleme için, diğeri ise yeni bir klasör oluşturup düzenli halde oraya kopyalıyor.
Kurulum için arşivi açıp, klasöre gelip python setup.py install komutunu vermelisiniz. Duruma göre, başına sudo veya benzeri birşey eklemeniz gerekebilir. Scriptlerin için de python script.py komutunu vermeniz yeterli.
Aşağıdaki şekillerde kullanılabilir:
-
En basit ve kullanışlı olanı, direkt klasöre sağ tıklayıp scripti seçmek. 2 ayrı script var, birisi yeni bir klasör oluşturup(seçtiğiniz klasörün altına) düzenli halde arşivi oraya kopyalar, arşivin büyüklüğüne bağlı olarak kopyalama işlemi uzun sürebilir fakat arşivinizde hiçbir şekilde değişiklik yapılmaz. İkinci yöntem ise kopyalamadan, taşır. Bu arşivinizin düzenini bozabilir. Fakat aslında daha kullanışlıdır.
-
Nautilus scriptini kullanmadan çalıştırmak için, hiç kurulum yapmadan direkt osa1 ve mutagen klasörlerini kopyalayarak, osa1.py arsiv_yeri, duzenli_arsiv_yeri şeklinde çalıştırabilirsiniz. Onun dışında kurulum yaparak from osa1 import osa1 şeklinde import edip osa1.duzenle() fonksiyonu ile kendi programlarınızda kullanabilirsiniz. Ya da .bashrc dosyanıza alias osa1='python "/usr/local/lib/python2.6/dist-packages/osa1/osa1.py"' satırını ekledikten sonra terminalden osa1 arsiv_yeri, duzenli_arsiv_yeri şeklinde çalıştırabilirsiniz.
Windows ortamında test etmedim fakat kaynak koda baktığımda çalışmaması için bir sebep göremiyorum. Kurulum yine aynı fakat script.py dosyasını çalıştıramazsınız. Haliyle düzenlemek istediğinizde komut satırından programı çalıştırmalısınız.
EKLEME: Scripte arayüz ekledim. İşlev olarak tamamen aynı, sadece nautilus ile değil de, bir arayüz ile çalıştırmanız gerekiyor(bence bu hali daha kullanışlı). Gnome kullanmayanların işine yarayabilir. Daha detaylı bilgi için kendi sayfasına bakın.(Bu arada aşağıdaki de ekran görüntüsü)

2-8-2010, 1:33 ö.ö. //
//
python
, django
, markdown, pygments
Bir süredir blog sayfam için yazı girmemi kolaylaştıracak bazı düzenlemeler yapıyorum. Öncelikle Beginning Python: From Novice to Professional kitabındaki "instant markup" örneğini uygulamaya çalıştım, düz yazı yazacaksanız gayet kullanışlı, fakat eğer kod yayınlayacaksanız sapıtıyor. Daha sonrdan BBCode tarzı birşeyler oluşturmayı denedim, fakat o sırada Markdown'ı keşfettim.
Markdown is a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML).
Python modülünü http://pypi.python.org/pypi/Markdown/2.0.3 adresinden indirebilirsiniz.
Henüz isteğim doğrultusunda nasıl geliştirebileceğimi bulamasam da ilk haliyle bile çok yardımcı oluyor. Django'yla kullanmak için iki farklı yol izleyebilirsiniz. Birincisi, hangi modelinizde uygulamak istiyorsanız, onun save metodunu override edersiniz. Örneğin modelimdeki "post" alanına uygulamak istiyorsam, markdown modülünü import ettikten sonra şöyle yapıyorum:
def save(self, *args, **kargs):
self.post = markdown.markdown(self.post)
super(Post, self).save()
Bu yöntemin kötü yanı, eğer o yazıyı bir daha düzenlemek isterseniz, size markdown'ın eklediği html taglarıyla beraber gelecek. Yani yazıyı bir kere eklediniz mi, düzenlemek için yine html ile uğraşmanız gerekir. Kötü bir yöntem yani.
İkinci yöntem de, markdown fonksiyonu için bir template tag'ı oluşturup, istediğiniz yere uygulamanız. Bu yöntem her yönden çok daha mantıklı gözüküyor, hem istediğiniz şeye uygulayabilirsiniz. Bunun için markdown'u proje klasörüne kopyaladıktan sonra ayar dosyanızdan markdown'u ISTALLED_APPS altında eklemeniz gerekiyor. Daha sonra şu belgedeki adımları izlemelisiniz. Ya da:
- markdown klasörünün altında templatetags klasörü oluşturursunuz.
-
markdown.py diye bir dosya açarsınız. İçine şu kodu yapıştırırsınız:
from django import template
from ..markdown import markdown as Markdown
from django.template.defaultfilters import stringfilter
register = template.Library()
@register.filter # detayli bilgi icin http://docs.djangoproject.com/en/dev/howto/custom-template-tags/
@stringfilter # sadece stringlerle calissin
def markdown(value):
"String'i Markdown'dan gecirir."
return Markdown(value)
-
Daha sonra template tagımızı kullanmak istediğimiz templateimize {% load markdown %} satırını ekleyip, hangi string'de kullanmak istiyorsak ona markdown filter'ını uygularsınız. Örneğin {{ post|markdown|safe|escape }}.
Daha sonra http://daringfireball.net/projects/markdown/syntax adresindeki gibi yazarsınız. Eklenti desteği sayesinden markdown'a tablo bile çizdirebilirsiniz(eklenti klasörüne bakın).
25-7-2010, 9:18 ö.s. //
//
python
, django
Kendime Python'da öğreneceklerim veya öğrenmem gerekenlerle alakalı bir liste oluşturdum ve Django ile aklımdaki birkaç şeyi daha uygulamaya sokar sokmaz bunlarla ilgileneceğim:
- map, reduce, filter, iter, xrange fonksiyonlarını kullanmayı öğrenmek. Aslında hepsini bir ara öğrenmiştim fakat neredeyse bir kere bile kullanmadım ve unuttum tabii ki.
- Decorator ve metaclass. Gözümü korkutan iki konu. Kitaplarda genelde ileri seviye olduklarından ve bir müddet öğrenilmese de olur olduğundan(yok böyle cümle) bahsedilir.
- itertools.
- Ve tabii ki OOP. Bildiğimi zannediyorum ama uygulamaya gelince kalıyorum açıkçası. Ne zaman bir sınıf yazsam sanki sözlüklerle çok daha kolay bir şekilde yapabilecekmişim gibi geliyor.
5-7-2010, 5:55 ö.s. //
//
python
Blogumda kullanmak için basit bir fonksiyon yazmıştım. Şu anda sağda gördüğünüz gibi, FriendFeed'den yazdığınız mesajlarınızı çekiyor. Fakat sadece kendi feedinize yazdıklarınızı.
import urllib2, datetime
def FriendFeed():
try:
friendfeed = urllib2.urlopen("http://friendfeed-api.com/v2/feed/hesap_adiniz").read()
except:
friendfeed = open("/home/kullanici/Desktop/friendfeed.txt").read()
#url, date, body, id, from
true = True
entries = eval(friendfeed)["entries"][:5]
for entry in entries:
entrydate = entry["date"]
#format 2010-06-01T06:09:14Z
entrydate = entrydate.split("T")
tarih = entrydate[0].split("-")
saat = entrydate[1][:-1].split(":")
entryDate = datetime.datetime(int(tarih[0]), int(tarih[1]), int(tarih[2]),
int(saat[0]), int(saat[1]), int(saat[2]))
entries[entries.index(entry)]["date"] = (datetime.datetime.now()-entryDate).days
return entries
- satırın olayı şu, localhost'dan ara sıra offline olarak çalıştığımdan, bir kere kendi feedimi kaydettim ve internet bağlantım yoksa o dosyadan alıyordum, o kısmı kaldırabilirsiniz.