29-4-2011, 6 ö.s. //
//
// 570
Belki de 1 aydan uzun bir süredir hiçbir projemle ilgilenemdim, aklımdaki hiçbir şeyi uygulayamadım. Önce şu programlama yarışması çıktı. 1. sınıf olduğumuzdan ve dolayısıyla gerekli konuları bilmediğimizden (veri yapıları, algoritmalar vs.), Wikipedia'da geçen saatler sonrasında ancak bir soru hakkında fikrimiz olabiliyordu. Bir yandan finaller geldi, aynı anda hem finallere çalışıp hem bu yarışmaya hazırlandım. Finaller bitti, bu sefer aklım başka yerlere kaydı ve Lisp ile uğraşmaya başladım. Tüm dönem arası tatilimde Common Lisp ile uğraştım. Aslında amacım bir yandan da fonksiyonel programlamaya giriş yapmaktı ama henüz beceremedim, muhtemelen 1-2 denem daha yapmam gerekecek.
Derken 2 gün önce finale kaldığımızı öğrendim. Yarın sabah finalde olacağız ve muhtemelen sonuncu olup döneceğiz. Yarışmaya hazırlanırken zaten hedefimiz finale kalıp sonuncu olmaktı, sorun yok yani :) .
13-4-2011, 4:38 ö.s. //
//
vim
, pardus
// 592
~20 gün boyunca Pardus'tan başka işletim sistemi kullanmama gibi çılgın bir karar aldım ve bugün uygulamaya başladım(dün gece temiz kurulum + devel deposu güncellemelerini yapmıştım). İlk günün sonundan birkaç not düşelim:
-
Dropbox kullanmak isteyenler için, paket şu adreste: http://svn.pardus.org.tr/pardus/playground/maidis/Dropbox/dropbox/ . sudo pisi bi http://svn.pardus.org.tr/pardus/playground/maidis/Dropbox/dropbox/pspec.xml ile build eder, sudo pisi it dropbox*.pisi ile kurarsınız. Daha sonra ne işe yaradığını tam bilmesem de(ben direkt ikisini beraber kurduğumdan farkı gözlemleyemedim) http://svn.pardus.org.tr/pardus/playground/maidis/Dropbox/kde-servicemenu-dropbox/ adresinden KDE servicemenu eklentisini kursanız hoş olur. Yöntem aynı.
-
Vim ile ctags kullanmak isterseniz, package manager ile kurduğunuz ctags'ı görmüyor vim. Ctags paketini incelediğimde şöyle birşey satır gördüm: (satır 24) pisitools.rename("/usr/bin/ctags", "exuberant-ctags"). Farkedilebileceği gibi /usr/bin altındaki ctags çalıştırılabilirinin adı exuberant-ctags olarak değiştiriliyor. Bunu eski haline getirirseniz vim ile gayet düzgün çalışıyor.(ben adını değiştirmek yerine kopyaladım, iki tane oldu, heheh)
-
Hayırlısıyla bir de şöyle bir hata kaydımız oldu ilk günden: http://bugs.pardus.org.tr/show_bug.cgi?id=17765
Bu 20 gün içerisinde Emacs için SLIME pisi paketi hazırlama gibi çılgın bir hedefim var ayrıca. Başarabilirsem paket hazırlama olayını çözdüğüm anlamına gelecek.
11-4-2011, 2:54 ö.s. //
//
python
, pygame
// 543
Geçen yazıda şurdaki örnekleri Pygame'de yazmaya çalıştığımdan bahsetmiştim ve ilk örnek için mouse pozisyonuna göre yönü ayarlanabilen bir çerçeve çizmek için birkaç bilgi vermiştim(kaynaklar github'da).
Bugün çarpışma tespiti ve yansımaları da hallettim. Çarpışma tespiti için çok fazla yöntem var, ben Stack Overflow'da gördüğüm şu yazıdakilerden birinden esinlendim.
Yaptığım şey kısaca şu:
vm1, çarpacak cismimizin merkezinden, 1. yüzeyin merkezine vektör olsun.
m1b, 1. yüzeyin merkezinden düzlem merkezini gösteren birim vektör olsun
vm1'in m1b izdüşümü(projection) yeterince küçükse(örneğin cisim topsa, yarıçapından küçükse), çarpışacaklar demektir.
Kendi yazdığım Vector sınıfıyla beraber kod şöyle birşey oluyor:
if abs((m1b*vm1.dot_product(m1b)).length) < 5:
# carpisma!
Bu yöntemi başka bir yöntemden esinlenerek kendim ürettiğimden, pek sağlıklı olmayabilir. Bu uygulama için gayet güzel çalışıyor ama. Zaten çarptıracağınız yüzeye ve çarpan cisme göre farklı algoritmalar daha mantıklı oluyor.
Yansıma için de reflection vector kullandım. Şöyle birşey:
R = V - 2N(V DOT N) . Bizim şartlar altında, R yansıyan hız vektörü, V gelen hız, N de yüzeyin normal vektörü. Yine kendi yazdığım Vector sınıfımla beraber şöyle birşey yani:
ref_v = v_hiz - m1b*2*(v_hiz.dot_product(m1b))
Programdaki küçük(ya da bir daha düşündüm de, büyük) hata ise, toplar yüzeylere çarpmak üzereyken yüzeyleri hareket ettirirseniz, toplar alandan dışarı çıkıyorlar. Ekranın dışına çıktıklarında diğer taraftan tekrar girmelerini sağladığımdan, tekrardan alan içerisine alabiliyorum, ehaeuhe. Neden olduğu hakkında az da olsa fikrim var, bir şekilde çözeceğiz artık.

Bundan sonra 3. örnek, zıplayan toplar var. Önce topların alandan dışarı çıkmasını engellemeye çalışacağım sanırım.
Bu arada tüm kodlar github'da.
10-4-2011, 3:58 ö.s. //
//
python
, pygame
// 681
Hazırlıktayken Pygame ile bir süre uğraşmıştım, hiçbir zaman oynanabilir bir oyun üretemedim ama birkaç deneme ile bu işlerin zorluğunu az da olsa tecrübe etmiştim.
Bugün şu sayfayı gördüm. Basit bir fizik motoru yapımından bahsediyor. Ordaki ilk örneği zaten yapmıştım(yöntemim biraz farklı ama olsun). Diğerleri de çok zor gözükmedi gözüme. Sonuçta, adım adım ilerleyerek zor gibi gözüken en son örnek bile halledilebilir.
Beklenmedik bir şekilde zor oldu :) . Öncelikle, genel olarak bu iş böyle mi yürüyor bilmiyorum ama, Pygame'de koordinat düzlemi biraz farklı. Aşağıdaki gibi.

Yani ekranın üst sol köşesi (0, 0) noktası, Y ekseni aşağı indikçe artıyor. Bilgiğimiz kartezyen düzlemin X eksenine göre döndürülmüş hali gibi yani. Bu tüm işleri zorlaştırıyor.
Topları falan eklemeden önce, 2. örnekteki siyah çerçeveyi yapmaya başladım. Aklımdaki fikir şuydu, ekranın ortasından(orijin) mouse'u gösteren bir birim vektör yardımıyla, ona paralel ve dik doğrular çizip kaydıracaktım. Tabii ekranın ortası, üstteki şekildeki düzene göre, (150, 150) oluyor.
Bu şu ana kadar alıştığımız düzenden çok farklı ve üzerinde hesap yapmak çok zor. Bunun yerine benim yapmaya çalıştığım, ekranın ortasını (0, 0) noktası alıp, işlemleri yapıp, daha sonra bir fonksiyondan geçirerek koordinatları ve vektörleri Pygame'deki düzleme uyarlamaktı. Şöyle bir fonksiyonla örneğin:
def _(v):
return v[0]+SCREENX/2, SCREENY/2-v[1]
Ekranın ortasını (0, 0) alarak hesapladığınız vektörü veya koordinat çiftini Pygame düzenine getiriyor. Bundan sonrası biraz daha kolay.
3 adımda tamamladım, ilk başta ekranın ortasından, mouse'u gösteren birim vektörle aynı ve zıt yönlerde doğrular çizdirdim. Daha sonra birim vektöre dik yönlerde. Fakat burda dikkat edilmesi gereken şey, Pygame mouse koordinatlarını verirken kendi düzenine göre veriyor, yani kullanabilmek için önce ekranın ortasının (0, 0) olduğu düzene dönüştürmemiz gerekiyor. Şu şekilde:
posx = ekran_genisligi / 2
posy = ekran_yuksekligi / 2
for event in pygame.event.get():
if event.type == pygame.MOUSEMOTION:
r = [event.pos[0]-posx, -event.pos[1]+posy]
Bunu şöyle bir fonksiyondan geçirerek birim vektör haline getiriyorum:
def birim_vektor(n1, n2):
"""
n1, n2 noktalar ([x, y])
iki vektor nokta arasindaki birim vektoru verir.
baslangic n1, bitis n2 seklinde
"""
v = [n2[0]-n1[0], n2[1]-n1[1]]
uzaklik = sqrt(v[0]**2 + v[1]**2)
v[0] /= uzaklik
v[1] /= uzaklik
return v
Daha sonra bu vektöre dik ve zıt yönlü vektörler elde edip(koordinatlarını değiştirerek, - ile çarparak), ne uzunlukta istiyorsam koordinatlarını çarparak çizeceğim doğrunun diğer ucunu elde ediyorum(ilk ucu ekranın ortası zaten). Şöyle birşey:

Bundan sonra yapmam gereken, merkezden başlayarak, çizgilerin uç kısımlarına kalan olan kısmı vektör haline getirip, toplamam. Toplam vektörü bana oluşturmaya çalıştığım karenin köşelerini verecek:

Sonrası da zaten noktaları silip, bulundukları yere pygame.draw.aaline() ile çizgiler çizdirmek:

Kolay gibi gözükebilir, ama saatlerimi aldı. Koordinat düzlemi çok kafa karıştırıcı, ilk yazdığım fonksiyonu en başta yazıp, direkt normal, bildiğimiz kartezyen düzlemde çalışmaya başlamalıydım. İkinci olarak, vektörlerin bu kadar kullanışlı olacağını hiç bilmezdim, daha önce de hiç kullanmamıştım zaten. Onu öğrendim. Kapsamlı bir vektör sınıfı yazılabilir(vektörel/skaler çarpım, toplama, çıkarma, vb. işlemler için). Çarpışma için de sürekli kullanılacaklar zaten.
Başta verdiğim kaynaktaki tüm örnekleri yapmaya çalışacağım. Olduğu kadarını github'a koyacağım muhtemelen. Şu anda kod kötü durumda, düzenledikten sonra bu halini de koyabilirim.
Bu arada şunu farkettim, Pygame çok kolay bir kütüphane, öğrenme diye birşey yok, dökümantasyonu açıyorsunuz, ne gerekirsa 10 saniyede bakıp çiziyorsunuz. Programlamaya başlangıç veya başka testler için eğlenceli işler yapılabilir. Geçen seneden kalma Pygame kod arşivim var, font işlemler, çizgiler, resimler vs, ne işim olsa ordan bakarak yazıyorum. Mesela aklıma geldi, networking ile uğraşıyorum, Pygame yardımıyla basit bir pong yapılabilir. Pygame kısmı zaten 100 satırı bile geçmeyecektir.
9-4-2011, 7:04 ö.s. //
//
python
, nautilus
// 444
Şöyle birşey farkettim: Natuilus-Python.
Bu sayede yazdığımız scriptler sağ tık -> scripts altında değil, direkt sağ tık menüsünde gözükebilir. Fakat asıl olayı bu değil. Bize seçili dosyalar hakkında çok daha fazla seçenek sunuyor, örneğin script seçeneğinin sadece istenilen formatlarda gözükmesini sağlayabiliyoruz. Scriptimizin icon'u oluyor vs.
Kullandığım nautilus scriptlerini güncellemeye başladım. Hepsini bu hale getireceğim. Şimdilik osa1.net/media'ya upload etmek için kullandığım scripti uyarladım.

Dikkat edilmesi gereken nokta, scriptin işini bitirene kadar natuilus cevap veremiyor, herhangi bir klasör açamıyorsunuz örneğin. Ben subprocess.Popen() ile gerekli scriptleri çalıştıyorum. Scriptin son halini github alanıma koydum.