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_())


PCM-4 Göstericiler

//denemelere devam
//bu sefer pointer

#include<stdio.h>

int main()
{
int a;
int*aPtr; /*pointer bu oluyor bak*/

a=8; /*8 değerini atadık*/
aPtr=&a; /*a'nın adresini atadık*/

printf("a'nın adresi %p"
"naPtr nindeğeri %pn", &a, aPtr);

printf("a'nın değeri %d"
"n*aPtr'nin değeri %dn",a,*aPtr);

return 0;
}

Bu yazıda pointer için basitçe bir örnek verdim. Daha karmaşık örneklere ileride geçerim. String konusu var bundan sonra kitapta. O da çok geniş bir konu. Pointerla ikisini birleştirip uzun ama oldukça uzun bir örnek verebiliriz. Bu arada Google Android’e bakıverdim az. Java… çok güzel site kurmuşlar ve irc’de 300 kişi falan oluyor. Moblin, Symbian odalarında 30 40 kişi olduğu düşünülürse ne kadar popüler olduğu ortaya çıkıyor. Keşke Java bilseydim 🙂 Öğrenmeye niyetim yok ama yeter artık dil öğren dil öğren kafam şişti. Uygulama zamanı artık. Java ile yapılanları elbet Python, C, C++ hatta C#’tan birisi ile yapabiliriz herhalde 😀 Bir ara öğrenme hevesi gelmişti şu C konularından önce ama beğenmedim olayını. Geliştirme araçlarını falan.

PCM-3 Diziler

/* bu dizi konusu canımı 
sıkacak */

#include<stdio.h>
#define BOYUT 10

int main()
{
int n[BOYUT]={19,3,15,7,4,2,1,33,5,8};
int a, b;

printf("%s%12s%15sn","Eleman","Değer","Grafik");

for(a=0;a<=BOYUT-1;a++){
printf("%d%13d ",a,n[a]);

for(b=1;b<=n[a];b++)
printf("%c",'*');
printf("n");
}
return 0;
}

Diziler üzerine bir örnek. Fonksiyonları anlıyoruz tamam da o yerleştirme, düzen işleri uğraştırıyor 🙂 KDevelop güzel bir uygulamaymış. Rahat rahat kodladım ve hiç hata yapmadım bu sefer. Bu konudan sonra Pointer konusuna giriş yapacağım. O bölümde diziler geniş bir şekilde kullanılmış, başta biraz garipsedim ama sonra Python’da ki diziler falan geldi aklıma. Mantık benziyor o yüzden sorun yok^^

PCM-2

#include<stdio.h>
int main()
{
int sayici,sayi,toplam;
float ortalama;

toplam=0;
sayici=0;

printf("Sayıyı giriniz(Bitirmek için -1 girin):");
scanf("%d", &sayi);

while(sayi!=-1){
toplam=toplam+sayi;
sayici=sayici+1;
printf("Sayıyı giriniz(Bitirmek için -1 girin):");
scanf("%d", &sayi);
}
if(sayici!=0){
ortalama=(float)toplam/sayici;
printf("ortalaması:%.2f",ortalama);
}
else
printf("sayı girmedinizn");

return 0;
}

Burada girilen sayıların ortalamasını alıyoruz. Güzel bir örnek kodlar uzadıkça yapılan hatalar artıyor keşke C araçlarında da visual stuido da ki gibi otomatik tamamlama olsa. Bu kadar çok hata yapıp nerede ne yapmışım diye aramak zorunda kalmam. Print yazmışım printf yerine yok ” işaretini unutmuşum falan. Zaten gözler bozuk daha da iptal olacak 😀

Pardus ile C Macerası

#include<stdio.h>

int main()
{
int x,y,z,sonuc;
printf("Çarpmak için üç sayı giriniz:");
scanf("%d,%d,%d",&x,&y,&z);
sonuc=x * y * z;
printf("Sonuc=%dn",sonuc);

return 0;
}


Pardus ta ilk C denemem oldu. Önce GCC’yi kurmam gerekti. GVim ile kodları yazdıktan sonra ./a.out yazarak programı çalıştırdım. Kitaptaki örneği birebir kopyaladığımızda farklı sonuçlar çıkıyor. Düz 123 yan yana yazıp çarptırınca büyük rakamlara dönüyor bende scanf’in arasına virgül koydum. Aralarına virgül koyarak yazdığımda düzgün sonucu verdi. Örnekleri teker teker bloga ekleyeceğim. Gittikçe karmaşık örnekler yayınlayacağım. Kitaptaki örnekleri geliştirip farklı deneyimler elde edeceğim.