23 Temmuz 2007 Pazartesi

Python dizimizde format değişikliği:))

Python çalışırken kaynak olarak kullandığım kitapta değişiklik oldu. Artık http://www.diveintopython.org/ sitesinden ücretsiz olarak temin edebileceğiniz(ahanda döküman ve ilgili kodlar) kaynak ile yolumuza devam edeceğiz. Ben bu kitaptan anladığımı bloğa yazarken ayrıca birtakım temel kavramlarla ilgili de bildiğim-araştırdığım ölçüde katkılar yapacağım. Bu noktada akla 'İzin aldın mı bakem!?' şeklinde vesvese ihtiva eden sorular gelebilir ancak burada birebir çeviri yapmayacağım sadece anladığımı ilaveler de yaparak yazacağım.

Kolay gelsin...

21 Haziran 2007 Perşembe

Python Öğreniyoruz

Herkese selamlar

Python çalışırken ani bir kararla öğrendiklerimi günlüğüme aktarma kararı almış bulunmaktayım:) Bundan böyle pythonda atmış olduğum her adımı buraya da yansıtmaya çalışacağım. Öyleyse yazı dizimizin ilk girişini python programlama dilini tanıtarak yapalım:

Python Programlama Dili
80'lerin sonlarında Guido van Rossum tarafından ABC programlama dilinin halefi olacak şekilde geliştirilmeye başlanan Python, 1991 yılında Usenet'te duyurusu yapılarak dağıtılmaya başlanmıştır(release). İlk başlarda çok dikkat çekmese de zamanla-hatta son zamanlarda muazzam bir ilgi var dile karşı- önemi daha iyi anlaşılmıştır. Peki önemi, özellikleri nelerdir?


Python nesle yönelimli(object-oriented), yorumlamalı(interpreted), moduler ve etkileşimli(interactive) bir betik dildir. Bu terimleri tek tek açacak olursak, nesne yönelimlilik programcılıkla ilgilenen hemen hemen herkesin hakkında az buçuk bilgi sahibi olduğu ve miras(inheritance), çok biçimlilik(polimorfizm) ve depolama(encapsulation) yeteneklerini içerisinde barındıran programlama tekniğidir diyebiliriz(Bunlarla ilgili ayrıntılara girmek istemiyorum, konumuz sapmasın). Yorumlamalı diller, yazmış olduğunuz programdaki ifadelerin(statement) toptan değilde tek tek derlenmesi suretiyle çalıştırılması şeklinde açıklanabilir.Bu noktada tüm kaynak kod çalıştırılmak için derlenmez. Esasında Python'un interaktif özelliği de bir anlamda buradan gelmektedir diyebiliriz.Python dili sağladığı etkileşimli kabuğu vasıtasıyla(interactive shell) sizden almış olduğu ifadeleri tek tek çalıştırır. Yani derlenen(compiled) dillerde olduğu gibi tüm kaynak kodu yazmaya ihtiyacınız yok. Ayrıca prototip geliştirme süreçlerinde yorumlamalı diller kullanım kolaylığı açısından tercih edilmektedir. Yarumlamalı dillerin en belirgin dezavantajı derlemelil dillere nazaran daha ağır kalmalarıdır. Ancak günümüz teknolojisi donanımlarımızı bu tip dilleri çalıştırmak için yeterli seviyeye getirmiştir(Ayrıca Python başka bir yorumlamalı dil olan Java'ya göre daha hızlı çalışmaktadır). Modülarite C dilini kullananların oldukça aşina olduğu bir tabirdir. Modülarite de işler fonksiyonlara bölünür ve bu fonksiyonlar başka programlarda da kullanılabilmesi amacıyla nesne modulleri halinde hazır bekler. Son olarak Python'un betik dil olması durumunu inceleyecek olursak bildiğiniz üzere GNU/Linux dağıtımlarındaki Bash gibi kabuk programları veya Windows'taki komut satırı yorumlayıcıları bir söz dizimine(syntax) sahipler(Bash için Shell Script, Windows için Batch olarak adlandırılır). İşte bu programlar komut satırından aldıkları komutları Shell veya Batch gibi toplu komut dosyaları şeklinde de çalıştırabilirler. Aynı özellik Python programlama dili için de geçerlidir(Böyle Python dosyalarının uzantıları py'dir).

Python programlama dili ilgili bazı linkler:

Python Resmi Sitesi
Python İndirmek için

Wikipedia-TR
Wikipedia-EN

Sanırım şimdilik bu kadar yeterli. Python'un temel özelliklerini özet bir şekilde ne olduklarıyla beraber açıkladığımı düşünüyorum. Bundan sonraki yazımda Python dilinin söz dizimine giriş yaparız artık.

Herkese kolay gelsin...

14 Mayıs 2007 Pazartesi

C'de fscanf ile Hemencecik File Parsing

C ile uğraşan gönül dostları string işlemlerinin ne kadar kastırıcı olduğunu bilirler. Özellikle de stringleri parçalamak -parsing- etmek isterseniz yandınız(mı acaba). Genel programlama alışkanlıklarından birisi de dosya işlemleridir. Dosyalardan çekilen veriler özel amaçlar için uygun yerlede kullanılma adına parçalanır. İşte bu noktada hem dosyadan okuma yapmamıza imkan tanıyan hem de okuduğumuz veriyi parse etmemizi sağlayan bir fonksiyon ile yüz yüze geliyoruz: fscanf()

fscanf fonksiyonu 3 parametreye sahiptir.Prototipini verecek olursam:

int fscanf(FILE *stream,const char *format, ...)

Görüldüğü üzere bu fonksiyon ilk parametre olarak bir mantıksal dosya tutacağı(logical file handle) alıyor,ikinci parametre dosyadan yapacağımız okuma formatını belirtiyor,...(ellipsses) işareti ile gösterilen ve fonksiyonu variant function hale getiren kısım ise ikinci parametre içinde belirtilen format tipli yer tutucuların işaret ettiği verilerin atanacağı değişkenleri gösteriyor. Şimdi örnek bir programla kullanımına şahit olalım bakalım:

#include

int main(void){

char *home = "besiktas";
char *away = "fener";
char *home_2 = (char *)malloc(20);
char *away_2 = (char *)malloc(20);
FILE *file = fopen("oku.txt","w");
fprintf(file,"%s - %s :\n",home,away);
fclose(file);

file = fopen("oku.txt","r");
fscanf(file,"%s - %s :",home_2,away_2);
fclose(file);

file = fopen("oku.txt","a");
fprintf(file,"%s - %s :",home_2,away_2);
fclose(file);

printf("%s\n",home_2);
printf("%s\n",away_2);
return(0);
}

Buradaki amaç takımları formatlayıp fprintf fonksiyonu ile oku.txt adlı dosyaya yazmak sonra bu dosyaya okuma modunda bağlanıp içindeki veriyi yine takımlara ayırarak ayrı değişkenlere atamak ve bunları ekrana basmak.

Yukarıdaki programda dikkat edilmesi gereken ve ciddi baş ağrılarına-ağız bozukluklarına neden olacak önemli bir durum söz konusu.Dikkat ederseniz takımları dosyaya yazarken ve de dosyadan okurken format tipi olarak %s'yi kullandım.%s fscanf ile kullanılıyorken dosyadan whitespace görene kadar okuma yapacaktır. Dolayısıyla dosyamıza

fprintf(file,"%s-%s:");

fonksiyonu ile yazdığımız(dikkat edin whitespace YOK) satırı fscanf ile okumaya kalktığımızda takımları değil komple bir satırı almış olacağız(besiktas-fener:). Bunun nedeni whitespace lere dikkat etmemiş olmamızdır. Düzgün fonksiyon çağırımı

fprintf(file,"%s - %s :");

şeklinde olacaktır(whitespace lere dikkat).Dosyada bunun sonucunda

besiktas - fener :

gibi bir satır oluşacaktır. Daha sonra whitespace lere dikkat etme suretiyle fscanf fonksiyonumuzu şu şekilde çağırır

fscanf(file,"%s - %s :",home_2,away_2);

home_2 = "besiktas"
away_2 = "fener"

olacaktır.BINGO.

Eğer ben whitespace lere dikkat etmek istemiyorum, e peki o zaman ne yapıcam diyenlerdenseniz, size %[a-z] format tipini taktim edicez. Bu formatla fscanf çağrısı

fscanf(file,"%[a-z]-%[a-z]:");

şeklinde olacak(aralarda whitespace YOK,dikkat).

Yalnız %[a-z] format tipi ANSI C'de tanımlı olmayan bir format tipidir. Bununla birlikte bir çok kütüphanenin bu formatı desteklediği söylentileri de mevcuttur.(Söylenti değil tabi ki,latife yaptım.)

Bir başka yazıda görüşmek üzere...

13 Mayıs 2007 Pazar

Eclipse,Cygwin,GDB,CDT Üzerine Küçük Problemler ve Çözümler

Merhaba

Günlüğüme gireceğim ilk yazım bugün karşılaştığım ve baya bi boğuştuğum Eclipse'in CDT adlı eklentisi üzerine olacak. Esasında problemlerdeki baş aktör Eclipse. En iyisimi çok uzatmayalım da problemleri tanımlayalım ve çözüm yollarını anlatalım.

Amacım windowsta linux emülatörü olarak kullandığım(özellikle gcc için) Cygwin programını ve özellikle de onun paketlerinden olan ve debugging için kullanacağım GDB'ı arkama alarak yazmış olduğum c programlarındaki hataların kaynağını tespit etmekti. Bu noktada programlarımı notepad++'ta yazmak rahat ancak çıkan sinir bozucu segmentation fault hatalarını anlamak adına yeterli olmuyordu. Öncelikle CDT'yi sistemime indirip eclipse'e ekledikten sonra, eklentinin eclipse'e başarılı bir şekilde kurulup kurulmadığını saptamak adına

Menu>Help>About Eclipse SDK

Ardından karşıma gelen pencerede altta Plug-in Details'ten C/C++ ile ilgili eklentilerin yüklenmiş olduğunu görüp bir derin nefes aldım ve bir C/C++ projesi açıp bir test programı yazayım da çalıştırayım dedim. Öncelikle

File>New>Managed Make C Project

dedim ve proje adı vs. verdikten sonra projemi oluşturdum. Daha sonra yeni bir c kaynak dosyası oluşturup bir hello world programı yazdım ve akabinde programı build etmeyi denedim. Ancak bu noktada bir hata ile karşılaştım. Hata:

Exec error:Launching failed

şeklindeydi. Yaptığım kısa bir araştırmanın ardından problemin make komutu ile ilgili olduğunu anladım. Öncelikle cygwin'i yüklerken make'i paket olarak kurup-kurmadığımı anlamak için cygwin'i çalıştırıp make komutunu denedim ve komutun shell tarafından tanımlanamadığına şahit oldum, ayrıca bi de cygwin/bin dizini altına baktım orda da olmadığını görünce ilgili siteden make'i çektim. Make kurulumu tamamlandıktan sonra sıra path çevresel değişkenimi kontrol etmeye gelmişti. Bunun için iki yol mevcut:

1-) Cmd'ye echo %path% yazmak
2-)Bilgisayarım>Özellikler>Gelişmiş>Çevresel Değişkenler>Sistem Değişkenleri>Path

Burada C:\cygwin\bin dizininin tanımlanmış oluğ-olmadığına baktım ve tanımlanmadığını saptadım. Tanımlama işinin tamamladıktan sonra sevgili eclipse'ime geri döndüm ve projemi yeniden build etmeyi denedim. Yeap, projem başarıyla derlendi ve nesne dosyalarımın debug klasörüm altında oluştuğuna şahit oldum. Sıra debugging'e gelmişti, ancak çanlar benim için yeniden çalmaya başlamaıştı.


Debugging Sorunsalı

Yazıp derlediğim programımı debug etmeye çalışırken bu sefer de

Source not found

Bu noktada yeniden araştırmaya koyuldum ve elde ettiğim sonuç tatmin ediciydi. Bu doğrultuda
Menu>Window>Preferences>C/C++>Debug>Common Source Lookup Path

ulaştım ve burada yeni bir path map tanımladım. Eclipse bunun için sizden iki girdi istiyor:

1-)Compilation path
2-)Local file system path

Compilation path'e workspace'iniz neredeyse onun yolunu unix temelli veriyorsunuz. Mesela workspace'inizin yolu

C:\workspace ise

compilation path: /cygdrive/c/workspace oluyor. Local file system path ise workspace'inizin windows dosya sistemi içerisindeki mutlak yolu yani

local file system path:
C:\workspace şeklinde oluyor.

Bu şekilde ayarlar ve programınızı yeniden debug etmeyi denerseniz debug işleminde başarıya ulaştığınızı görecek ve derin bir OHH çekeceksiniz.

Şimdilik bu kadar, bir daha ki girdi de buluşmak üzere sağlıcakla kalınız efem.