Panda3D

Merhaba arkadaşlar yeni bir yazı dizisiyle karşınızdayız bu kısa seride öncelikle amacımız panda3d’nin ilk bir kaç eğitselini gösterip sizlere ne işe yaradığı konusunda fikir vermek olacak. Bu ilk eğitseller temel olarak kendi sitesindeki dokümanları kullanacaklardır. Ekstradan kaynak kullanırsam yazıya ek olarak belirtirim bunun dışında genel eğitseller için www.panda3d.org adresini ziyaret etmenizi tavsiye ederim.

Panda3D ile oyun programlamaya başlamadan önce bazı noktaları belirtelim. Bu yazı dizisini anlamak için en azından Python programlama dilini bilmeniz gerekmektedir. İngilizce bilginiz temel fizik kurallarını bilmek, analitik geometri, 3 boyutlu uzay, trigonometri gibi konuları da bilmeden oyun yapabileceğinizi düşünmeyin. Elbette üç boyutlu animasyonları tasarlamak için blender gibi bir programı da kullanabiliyor olmanız gerekmekte. Benim burada yapacağım bir kaç dokümanın türkçeleştirmesiyle bir tanıtım kapsamında olduğu için(en azından şimdilik oyun yapmıyoruz) kendi tasarladığım animasyonları oynatmayacağım. Zaten düzgün bir şey tasarlayabildiğim söylenemez.

Her şeyi açıkladıysam Panda3D’nin ne olduğuna gelebilirim. Panda3D adı üstünde üç boyutlu bir oyun motorudur. C++ dilinde geliştirilmiştir ama oyun programlama konusunda Python dilini kullanır(script dili olarak). Mayıs 2008’den beri özgür BSD lisansıyla dağıtılmaktadır. Kendi tanıtımlarında da bahsedildiği üzere panda3d bir oyuncak veya yeni başlayanlar için bir araç değildir. Onunla birlikte oyun yapmak için en azından belli bir programlama yetisine sahip olmalısınız. Motorun tüm özelliklerine şu adresten bakabilirsiniz.

Panda hem windowsta hem de linux üzerinde kullanılabilmekte. Windows için sitesinde kurulum dosyası mevcut; linux için deb ve rpm paketleri mevcut ama bir pardus kullanıcısı için pek bir anlam ifade etmiyor. O zaman kaynak koddan derlemeniz gerekecek.

Django Admin Şifresi

Şifrenizi unuttunuz. Ne yapacaksınız?
Şunları
konsoldan python manage.py shell yazıp enter’a basın.

In[1]:from django.contrib.auth.models import User

In[2]:users = User.objects.all()

In[3]:users yazıp enter’a basın listeler kullanıcıları. şöyle bir şey olur:

Out[3]:[] (burada user:admin gibi bir ifade var da bloggerda çıkmıyor) 😀

In[4]:users[0].set_password(‘buraya yeni şifre gelecek’);

In[5]:users[0].save()

Çıkmak için de quit() yazarsınız shell’den çıkarsınız. Bu arada In[1] gibi ifadeler shell’de otomatik çıkıyor siz yazmıyorsunuz.

Django İle Tema


Erteliyordum şu işle uğraşmayı. Elimde yeterince kaynak ve örnek vardı ama bir türlü bitiresim gelmiyordu. Görsel tasarım konusunda kabiliyetli olduğumu düşünmüyorum. Belki bu sebeple bu işi bitirmeyi erteliyordum, bu gece bitti. 🙂 Hazır bir tema buldum ve iki dakikada Django’ya uyarladım. Önceden kodlarının bir kısmını paylaştığım sistemin kısmi ana sayfası yukarıdaki gibidir. Şimdilik tek model üzerinden siteyi tasarladım. Artık tema konusunda sıkıntı yaşamadığım için yeni modelleri eklemeye başlayabilirim.

Yazılım Patentleri

Geçen günlerde Microsoft’un Word programının satışının durdurulma kararını hepimiz okuduk. Benzer bir haber Özgürlükiçin topluluğunda da yayınlandı. Küçük bir patent ihlali belki de bir ürünü ortadan kaldıracak, firmanın aldığı parasal cezadan bahsetmiyorum bile. Firma uzun süredir Avrupa Komisyonu rekabet kurulunca sıkıştırılıyordu. Bu kapsamda kullanıcılara tarayıcı seçim özgürlüğünü getirebileceğinden bahsedildi. Mahkemelerde genellikle rekabet kanunlarıyla alakalı davalar görüşülüyordu(benim takip ettiklerim) ama son mahkeme biraz farklıydı. Öncelikle karar bir Amerikan mahkemesi tarafından verildi ayrıca konu rekabet değil patentti.

Yazılımların patentlenmesi uzun süredir bir tartışma konusu olarak ortada. Yazılımların patentlenip patentlenmemesi karmaşık olduğu kadarda basit bir şekilde çözülebilecek bir sorun. Çözüm kullanıcılardan geçiyor ya da şöyle diyelim hangi durumda daha kazançlı? Toplum yararı mı, yoksa büyük şirketlerin kâr hedefleri mi? Bir kesim patentlerin yazılım sektörünün gelişiminde önemli bir yere sahip olduğunu savunurken başka bir kesim bunun gelişimi engellediğini söylemekte. Genel olarak büyük şirketlerin bu konuda kazançlı olduğunu görebilirsiniz, küçük işletmeler ve son kullanıcı için pek bir yararını göremedim.

Düşünün bir program yazıyorsunuz ve bu programda bir özelliği kullanıyorsunuz ama kullandığınız özellik bir Amerikan şirketi tarafından patentlenmiş. Onlardan izin almadan bu özelliği kullanamazsınız. Peki kendi yazdığınız bir özelliği daha önce başkaları tarafından kullanılıp kullanılmadığını nasıl kontrol edeceksiniz? Etmeli misiniz? Geliştirici neden bunlarla uğraşmak zorunda kalsın? Hangi patentin nerede geçeceği de ayrı bir sorun. Amerikanın kabul ettiği standartlar ile bizimkiler bir olmayabilir. Avrupa ile amerika arasında bu konuda geniş tartışmalar yapıldı. 2005 yılında yayınlanan başka bir yazıda amerika da alınmış 150000 patentten bahsediliyor. Yazılım geliştiricileri herhalde bir şeyler üretmeden önce bu patentlerin hepsine göz atmalı aksi takdirde kullandıkları geliştirdikleri bir ürünle patent ihlali yapmaları çok kolay. Özellikle Avrupa da yazılım patentlerini engellemek için oluşturulmuş büyük toplumsal hareketler var. Bunlardan bir tanesini örnek gösterelim: http://stopsoftwarepatents.eu/ okumanızı tavsiye ederim.

Yenilikçiliğin önüne geçen davalar sadece geliştiricileri değil kullanıcıları da zora sokmakta. Eğitimine kaynak akıttıkları bir ürün aniden ortadan kalkabiliyor. Ya da anlaştığı firma patent davaları yüzünden ortadan kalkıyor. Böyle durumlara düşmemek için müşteriler ürünü incelerken aynı zamanda kullandıkları ürünün patent ihlali yapmadığı konusunda %100 emin olmalı. Verdiğim örnekte de bahsedildiği üzere sadece web sitesi sahibi olduğunuz için mahkemeye verilebilirsiniz. Neden? Web geliştiriciniz bilerek veya bilmeyerek bir patent ihlali yapmıştır ve kabak size patlamıştır. Aynı sitede cep telefonları üzerinden siparişin patentlendiğini gördüm eheh tamda bu konuda bir fikrim vardı 🙁

Bu tarz sorunlardan kurtulmak için yapmamız gereken yazılım patentlerine karşı gelmektir. Bilgi evrensel olmalı ve özgürce paylaşılmalıdır. Patentler ile gelişimin önüne engel olmaktansa telif hakkı ile üretilen ürünü(fikri) korumak daha sağlıklı. Şu yazıya bakın! Kanserin belki bir tedavisi var ama ilaç şirketleri patentini alamadıkları için bu konuda araştırma yapmıyorlarmış. Eczacı bir arkadaşım vardı. İlaç sektöründe de bu tarz çalışmalar yapılıyor, “yeni ilaç üretemiyoruz ki” diyordu. Her şey patentlenmiş. Yeni bir ilaç yapmak için illa birinin patentlediği bir tekniği kullanmak zorundasınız. Bu şeye benziyor siteler üzerinde ilk video oynatan birisi olun, sonra bunun patentini alın bundan böyle sitelerde sizden izinsiz kimse video oynatamasın! Okudukça insan hayret ediyor, ne hale gelmişiz. Her şey para olmuş, yazık.

Django Template Sistemi

Kendimize not etmiş olalım. Djangobook ve Djangoproject sitelerinden esinlenilmiştir. Yazı tema sistemini anlatmaktan çok kişisel bir not olacaktır, anlamak için python ve giriş seviyesinde django bilmek iyi olur.

Değişkenler {{ degisken_ismi }} şeklinde belirtiliyor.
Tema etiketleri {% etiket %} şeklinde kullanılıyor. Bu etiketlerin içinde for ve if ifadelerini kullanabiliriz. Python da kullanılan for ve if ifadelerinin benzerleridirler.
Bir diğer ifade filtredir. Buda şöyle olur {{ bilmemne_gunu|date:”F j, Y” }} burada | karakteri ile filtre kısmına geçiş yapıyoruz.

Templatelerin yüklenmesi için:
TEMPLATE_DIRS = (
‘/home/django/mysite/templates’,
)
Tabi bu adres üzerine yüklediğimiz templateleri view dosyasına çağırmamız gerekecek.

Bir birlerinin nesnelerini yüklemek için include etiketini kullanabiliyoruz. Şöyle:

{% include “includes/ust.html” %}

Şimdilik bu kadar arada güncelleyeceğim bu girdiyi, hatırlamam gereken şeyler oldu mu buradan bakarım.

Django İle Hayat Güzel – 2


Uyumadım daha haberler uygulamasını hallettim gibi. Şimdi anketle ilgilenicem. Ardından statik sayfaları halledeceğim bunlar yan bölümler hep. En son ana sayfa tasarımına yükleyeceğim tüm bu verileri. Pinax isimli bir CMS buldum üyelik sistemi var, onun dışında pek bir numarasını göremedim url ve tema işini halletmişler sıfırdan uğraşmak istemeyenler onun üzerinde çalışabilir. Ben hem öğrenip hem bir şeyler yapayım istediğim için sıfırdan yapmaya çalışıyorum yoksa çekilecek çile değil. Url dosyasını ayarlarken yanlış bir şey koymuştum sayıları kabul ediyordu sadece Django’nun irc odasında ki arkadaşlar sağolsunlar uyandırdılar beni kısa bir süreliğine halletim. Uykusuz çalışmak iyi bir fikir değil her zaman aynı şey başıma geliyor bir yerde bir şeyi unutuyorum arkadaşlara falan soruyorum sorduğum gibi dikkatimi çekiyor ve onlar cevap vermeden kendime küfredip işime bakıyorum. Siz siz olun uykusuz çalışmayın.

Django İle Hayat Güzel


Girdik bir kere uğraşıp duracağız. Yarım saat önce tasarladığım sistemi test edeyim dedim, patladı. Bundan böyle kendime not edeyim Web sitesi falan programlarken aşama aşama uygulamaları test edeceğim sonra vallahi bulunmuyor neyin hataya sebep olduğu. Neyse yarım saat modelleri falan oluşturduktan sonra halletim gibi. Şimdilik uygulamamızın haberler kısmı, anketi ve statik sayfaları mevcut ve bunları ekleyebileceğimiz bir admin panelimiz var(onu ben yapmadım kendisi oluşturdu). Uygulamayı denerken bir şey dikkatimi çekti. Ben modelleri falan hep İngilizce hazırlıyorum ama admin panelinin geri kalan kısmı Türkçe’ydi. 😀 settings.py dosyasında ayarlar ülkemize göre olduğu için Türkçe çıkıyordur, unutmuşum onu ama kalsın öyle. Şimdi bir yerden tema araklamam lazım. O temanın üzerine monte edeceğim ne olacak çok merak ediyorum. Memlekete gitmeden bitirmeye çalışacağım, kitaba orada devam ederimde şunu bitireyim bari. Zor bir şey yok mantığını kaptıktan sonra şakır şakır yapılıyor. Buradan belki anlatırım, ya da başka bir platform üzerinden…(Özgürlükiçin)

Django ile çalışınca bu uygulamayı barındıracak sunucu konusunda sıkıntı çekebiliyorsunuz. Ülkemizde maşallah hosting işlemleri çok uygun. Süper hizmet veriyorlar, her şey sınırsız! Ahh pardon o burada değildi! Bir kaç arkadaşı kafalayıp yurt dışından sunucu kiralamayı düşünüyorum. Şimdilik üç kişiyiz bir kişi daha bulduk mu tamamdır. Sürekli sunucuları denemekten bahsediyordum böylelikte tecrübede kazanmış olacağız. Evde kullandığım bilgisayarı sunucuya dönüştürüp denemeye çalışabilirdim ama yer yok! Yer olsa da diğer sistemlerde İnternet’e nasıl bağlanırım bilmiyorum Pardus ile USB modemler için gerekli paketler hazır geliyor. Diğerlerinde geliyor mu bilmiyorum… En azından Ubuntu da yoktu. Sunucuyu kiralayınca üstünde Ubuntu kuracağım. Dokümanları iyi ve az da olsa tecrübem var.

Pardus 2009 Beta çıktı. Kitap okurken uyuya kalmışım, kalktığım gibi haberi gördüm çok sevindim. Daha deneme imkanım yok kararlı sürüm çıktığında tüm bilgisayarı ona ayıracağım o zamana kadar Pınar Yanardağ ve Gazanya gibi başka kullanıcıların blogları üzerinden takip edeceğim. Lâl teması çok hoş! Zaten 2008’in rengini hiç sevmemiştim 😛 Ben daha çok böyle mavi, yeşil, mor(ve tabi ki siyah!) gibi renkleri severim. Kaptan’ın yeni görüntüsünden çok etkilendim tüm sistem böyle olacaksa sonunda beni tatmin edecek bir sisteme sahip olabilirim. “Never, Not Ever!” demiş cadının birisi en güzeli o söz üzerinden asla daha iyisini aramaktan vazgeçmeyelim.

Aranızda tagged kullanıcısı olan var mı bilmiyorum. Aslında o isimde bir başlık açıp duyura da bilirim de madem günlük yazıyoruz burada belirteyim. Cinsiyet bölümünü hangi tür istiyorsunuz anlayıp bayan işaretleyen ne kadar çok Türk erkeği var! İstanbul da ki bilmem ne isimli kızları aratıyorsunuz karşınızda sakallı adamlar ahahahaha Kocaeli de şu ilçede olan kızlara bakıyorsunuz karşınızda başka başka erkekler! 😀 Zaten takip etmiyorum siteyi de bazen arkadaşlara falan bakıyorum var mıdır tanıdık diye ama böyle tipleri görünce soğuyorum. Bildiğiniz sapık dolu site. Tagged’ı da bundan böyle ziyaret etmeyeceğim.

Kardeşimin okulu bitti. Bugün gelecekler inşallah bir aksilik olmazsa. Annem de geliyor 🙂 Canım annem benim, çok özledim. Sonunda yine birlikte olacağız. Şimdi sabaha kadar evi temizlerim yoksa ne hale getirdin böyle diye kızıyorlar, komşulara falan da anlatıyorlar evi batırmış ayy bu oğlan ama hallettik gibisinden. 😀 Nefret ediyorum şu ev işlerinden. İnsan yalnız kalınca uğraşası gelmiyor hiç. Bulaşık mı? Koy makinaya beklesin. Çamaşır mı? Koy makinaya beklesin! Ya iki tane düğmeyi çevireceğim kalkıp ta halletmiyorum. Koşuya başladıktan sonra şart oldu çamaşır falan kalmıyor başka türlü. Evet, kirli çamaşırlarımız dökelim ortaya ahahah gece dörtte günlük yazarsan böyle olur. Yanda da metal müzik çalıyor psikolojimi tahmin edebilirsiniz. Neyse bu girdi burada bitsin ben de eğlenceye(temizlik) devam edeyim!

PyQt ile Toplama İşlemi

Anam ağladı şu saate kadar uyumadım. Sonra gittim yürüyüş falan yaptım, hala ayaktayım blog’a yazı yazıyorum. Sonunda Qt ile bir şey yazabildim. Kendi hatalarım yüzünden çok uğraştım ama sonunda başardım. Efendim şimdi kısaca ne yaptık anlatalım. Öncelikle Qt Designer ile tasarımı yaptık. MainWindow penceresine(adı ana pencere zzz) iki lineEdit nesnesi, iki pushButton nesnesi bir de label ekledim. Qt Designer de iken F4 tuşuna basarak sinyal çıkardım sonra dosyayı kaydettim. Ui uzantısıyla kaydediyor tabi bu işimize yaramıyor pyuic4 dosyaadı.ui -o(osmaniyenin o su sıfır değil) dosyadı.py komutuyla dosyamızı py uzantılı bir şekle soktuk. Sonra herhangi bir metin editörüyle açıp düzenlemeye başladık. Öncelike sinyalleri ayarlamak gerek. Sinyal mantığı şu:
obje, sinyal, slot. Slot dediği uygulanacak fonksiyon callback gibi bir şey. self.add ve self.close düzenlemesinin ardından close ve add fonksiyonlarını tanımladım. lineEdit nesnesinden girilen veriyi lineEdit.text() fonksiyonuyla alıyoruz. Bu aldığımız veriyi num1’e aktarmışım göründüğü üzere. Sonra bu num1’i int yani sayı değişkeni olarak alıp int(num1) diğer değişkenle topluyor ardından label nesnesine yazdırmak üzere yolluyoruz. label’a bir şey yazdırmak için label.setText() fonksiyonunu kullanıyoruz. Normalde burda bir “text” yazıldığı için sayı yazmaya çalıştığınızda sorun çıkarıyor, onu da str(result) şeklinde sonucumuzu string’e çevirerek hallediyoruz. Diğer close fonksiyonu sys.exit() ile programı kapıyor anlatılacak bir şey yok. Son olarak app = … diye giden satırları eklememiz gerekiyor ui dosyasını python dosyasına çevirdiğimizde sadece arayüzü çevirmiş oluyoruz, son kodlarla uygulama çalışabilir bir hale geliyor. Uğraştırdı ama hallettik sırada ne var büyüklerimize soracağız.





# -*- coding: utf-8 -*-
#!usr/bin/env python
# -*- coding: utf-8 -*-
#Developed by Ceyhun Alyeşil([email protected])
#http://devador.blogspot.com

from PyQt4 import QtCore, QtGui
import sys

class Ui_MainWindow():
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(267, 236)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.lineEdit = QtGui.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(10, 30, 113, 20))
self.lineEdit.setObjectName("lineEdit")
self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(140, 30, 113, 20))
self.lineEdit_2.setObjectName("lineEdit_2")
self.label = QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(110, 140, 46, 14))
self.label.setObjectName("label")
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(50, 80, 75, 24))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(150, 80, 75, 24))
self.pushButton_2.setObjectName("pushButton_2")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 267, 19))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.add)
QtCore.QObject.connect(self.pushButton_2, QtCore.SIGNAL("clicked()"), self.close)

QtCore.QMetaObject.connectSlotsByName(MainWindow)

def close(self):
sys.exit()
def add(self):
num1=self.lineEdit.text()
num2=self.lineEdit_2.text()
result=int(num1)+int(num2)
self.label.setText(str(result))
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "topla", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton_2.setText(QtGui.QApplication.translate("MainWindow", "cikis", None, QtGui.QApplication.UnicodeUTF8))

app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(window)

window.show()
sys.exit(app.exec_())