Pazar, Aralık 27, 2009

Staj Çilesi!!!

Başlık biraz sert olmuş olabilir aslında pek abartılacak bir çilesi yok stajın. Artı ve eksilerini ayrı kefelere koysak tabi ki artıları çok daha ağır basacaktır. Sonuç ta öğrenmenin en iyi yollarından biri tecrübe edinmektir. O yüzdendir ki staja karşı her hangi bir garezim yok. Bu yazıyı yazmamdaki sebep ise okul deneyimi hocamızın bu hafta bu konuyu uygun görmesi. Bu açıklamayı yapmaktaki amacım ise burada yayınladığım yazıyı sadece hocamızın değil şans eseri arama motorları sayesinde bu blogla karşılaşanların yazıyı okuma ihtimalleri olduğu için onların staj eğitimine karşı bakış açılarında olumsuz bir değişiklik yapmak istemememdir.

Mevzuya dönecek olursak stajda beni en çok zorlayan şey okulun uzak olması. Yürüyerek yaklaşık 30dk felan sürüyor. İşin garibi otobüs ile gitmek 30dk dan da fazla sürüyor. Bunu da bu hafta pazartesi gittiğimde tecrübe ettim. Adeta balıkesir turu attım otobüsle. Meğersem balıkesir baya büyükmüş.

Diyebilirsiniz ki "genç adamsın işin ne yürü" hatta "gece gündüz pc başında oturuyosun biraz yürü spor olur" tamam yazın yürüdüm de kışın ne yapacağım onu bilmiyorum. Neyse bakacağız artık bir çaresine.

Stajda ki diğer bir sorun "-ki bu sadece benim değil aynı zamanda okulunda sorunu" okulun lab'larında ki bilgisayarların çalışmaması. Her sınıfın 2 saat bilgisayar dersi var ama uygulama yapma imkanların yok. Sadece bilgi verebiliyoruz öğrencilere. Doğal olarak da gelecek haftaya kadar bir çok şeyi unutmuş oluyorlar. Aynı zamanda uygulama yapmadan anlatıla bilecek konuda pek yok. 2 saati sadece konu anlatarak doldurmakta zor oluyor. Hadi son 20 dk oyun oynayın veya bilgisayar başında bir şeyler yaparak vakit geçirin diyemiyoruz.

İkinci dönemi merakla bekliyorum. Staj okullarının değişeceği dedikodusu dönüyo ortalıkta. Bakalım ne olacak belki daha iyisi belkide daha kötüsü denk gelecek kısmet...

Salı, Aralık 22, 2009

Linux(Ubuntu) için Allegro kurulumu ve IDE ayarları

Allegronun Windows için kurulumunu anlattıktan sonra aklımdaki ilk şey Ubuntu için de kurulumunu anlatmaktı. Ama araya başka şeyler girince bir türlü bununla ilgili bir şeyler yazamadım nasip bugüneymiş deyip hemen adımlar halinde anlatmaya başlıyorum.

Kurulum

1- Synaptic Paket yöneticisini açıp arama bölümüne allegro yazıyoruz ve aşağıdaki resimde belirttiğim paketleri yüklüyoruz. Resimdeki paketler den liballegro4.2-dev ve liballegro4.2 paketler zorunlu olup diğerlerini kurmak isteğinize bağlı.


IDE Ayarları

1- Her zamanki gibi Code::Blocks üzerinden IDE ayarlarını anlatacağım. Settings menüsünde Compiler & Debugger bölümüne giriyoruz. Ordan da Linker Settings sekmesine geçiyoruz. Resimdeki şekilde lib dosyalarını bu bölüme ekliyoruz.


2- Şimdi de Search Directories sekmesine geçiyoruz ve aşağıda belirttiğim yerlere allegro dosyalarının yollarını ekliyoruz.

Compiler--> /usr/include/allegro
Linker--> /usr/lib/allegro/4.2.2
Resource Compiler --> /usr/include/allegro

Hepsi bu kadar aşağıdaki kodu yeni bir .cpp dosyası kopyalayıp doğru şekilde kurulumu gerçekleştirip gerçekleştirmediğinizi kontrol edebilirsiniz.


#include <allegro.h>


int main(){

allegro_init();
install_keyboard();
set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0);

readkey();

return 0;

}
END_OF_MAIN();

Salı, Aralık 15, 2009

Allegro ile ses oynatma ve sprite kullanma

Daha önceki Oyunlarda Basit AI(Yapay Zeka) Uygulamaları yazımın sonunda allegro ile sprite ve ses olaylarının nasıl yapılacağından bahsedeceğimi haber vermiştim. Yoğun geçen iki haftadan sonra nihayet verdiğim sözü biraz geçte olsa tutmanın zamanı geldi.

Ses Oynatma

Öncelikle nasıl ses oynatılacağından bahsedelim. Bunu için allegronun SAMPLE yapı türünü kullanıyoruz. Bu türden yararlanarak türettiğimiz değişkenlerle ses oynata biliyoruz. Türettiğimiz ses değişkenine oynatacağımız dosyayı yüklemek için load_sample() fonksiyonunu kullanıyoruz. Yüklediğimiz sesi oynatmak için play_sample() fonksiyonunu kullanıyoruz.

SAMPLE *ses; //Değişkeni tanımladık
ses = load_sample(dosya_yolu); // ses dosyamızı yükledik
play_sample(ses,100,0,1000,0); //ses dosyasını oynattık


play_sample() fonksiyonunun parametrelerinden bahsedelim biraz.
int play_sample(const SAMPLE *spl, int vol, int pan, int freq, int loop);


*spl => SAMPLE dan türettip ses dosyasını yüklediğimiz değişken
vol => Ses yüksekliği(volume) 0-255 arasında değer alır
pan => Sesin hangi hoparlör den çıkacağını ayarlar. İki değer alır 0 sol 255 sağ hoparlör.
*freq => Sesin frekansı
loop => Sesin tekrar sayısı 0 ise bir kez oynatıp durur. 0 dan farklı ise stop_sample() fonksiyonuna kadar durmaksızın devam eder.

Sprite Basma

Sprite basmak BITMAP yapı türü kullanılır. Karakterimizin 2 farklı yön(sağ ve sol) için 3 farklı hareket hali olduğunu var sayarsak 2x3 lük bir dizi değişkeni tanımlayabiliriz. Daha öncede kullanmış olduğumuz load_bitmap() fonksiyonu yardımı ile de her bir sprite'yi diziye aktarıyoruz. Farzı misal aşağıdaki gibi.

BITMAP *resim[2][3];
resim[0][0] = load_bitmap(resmin_yolu, NULL);
resim[0][1] = load_bitmap(resmin_yolu, NULL);
resim[0][2] = load_bitmap(resmin_yolu, NULL);

resim[1][0] = load_bitmap(resmin_yolu, NULL);
resim[1][1] = load_bitmap(resmin_yolu, NULL);
resim[1][2] = load_bitmap(resmin_yolu, NULL);


Şimdi sıra geldi bu sprite'leri oyun içinde kullanarak ekrana basmaya. Bir döngü yardımı ile karakterimiz hangi yönde (sağ veya sol) hareket edecekse dizini o boyutundaki sprite'leri ekrana basıyoruz. Aşağıdaki kod benim örneğimdeki ilgili kısım.

if (yon == RIGHT)
{
//Her bir yöne için ekrana basılacak 3 farklı sprite var
//Bu yüzden döngü 3 kez dönecek
for (int i = 0 ; i<4;i++)
{
x = ulubatli->getX();
x+=2;
ulubatli->setX(x);

//0 ve 3 karakterin hareket öncesi ve sonrası halini temsil etmekte
//yani yüzü sağa dönük ayakları bitişik halini
if (i == 0 || i == 3)
resim = ulubatli->getResim(0,1);
else if (i == 1)
resim = ulubatli->getResim(0,0); // sağa doğru sağ ayak ilerde
else
resim = ulubatli->getResim(0,2); // sağa doğru sol ayak ilerde

ciz();
rest(20);
}

yon = NONE;
}



Oyunlarda Basit AI(Yapay Zeka) Uygulamaları yazımda paylaştığım örneği bu yazıda anlattıklarımla birleştirip geliştirerek paylaşıyorum. Buyurun yeni halini buradan indirebilirsiniz. Uygulama her zamanki gibi Code::Blocks IDE'si kullanarak MinGW ile derlenmiştir.

Ekran Görüntüsü


Perşembe, Aralık 10, 2009

Nihayet Linux için Google Chrome

Biraz önce maillerime bakarken bir gün öncesinde google chrome ekibi tarafından gönderilen maili okudum. Sonunda linux için ilk chrome beta sürümü çıkartılmış. Debian,Ubuntu,Fedora ve openSuse için hem 32 hemde 64 bitlik hazır paketleri mevcut.Kendilerini tebrik ediyor ve çalışmalarının devamını diliyoruz.


Gönderilen Mesaj

Hello everybody out there using Linux -

Google Chrome is go for beta on Linux! Thanks to the many Chromium and WebKit developers who helped make Google Chrome a lean, mean browsing machine. Here are a few fun facts from us on the Google Chrome for Linux team:

60,000 lines of Linux-specific code written
23 developer builds
2,713 Linux-specific bugs fixed
12 external committers and bug editors to the Google Chrome for Linux code base, 48 external code contributors

Thanks for waiting and we hope that you enjoy using Google Chrome!


Google Chrome Team





http://www.google.com/chrome/intl/en/w00t.html

--------



(c) 2009 Google
www.google.com 1600 Amphitheatre Parkway, Mountain
View CA 94043 United States of America.

Google is a trademark of Google Inc. All other company and product
names may be trademarks of the respective companies with which they
are associated.

Bir kaç ekran görüntüsü





Salı, Aralık 01, 2009

Programlama Stilinizi Bilin

Bjarne Stroustrup ile yapılan "Know Your Programming Style" adında bir söyleşi. Yazıyı ceviz.net'in c++ bölümünde gördüm. Bizimde işimizin çoğunlukla programlama ile ilgili olduğundan Ali Çehreli tarafından Türkçeye çevrilmiş halini burada paylaşmak istedim(Kendisinede teşekkür ederiz). Benim İngilizcem yeterli diyorsanız yazının orjinal haline buradan ulaşabilirsiniz.


Programlama Stilinizi Bilin
C++'nın babası programcılığın hâlâ önemli olduğunu söylüyor

Yazar: Margo McCall

C++'nın yaratıcısı Bjarne Stroustrup, program yazmanın en verimli noktasının şu üç yöntemin ortalarında bir yerde olduğunu söylüyor: türden bağımsız programlama, nesneye yönelik programlama, ve eşzamanlı programlama. Ancak, eşzamanlı programlama iyice açıklığa kavuşana kadar programcılar diğer ikisinin arasında kalmak zorundalar.

Stroustrup, SD West 2008'e katılanlara "Bu arayışın nerede sonlanacağını bilmiyorum" dedi "olayı karmaşıklaştıran, o üçüncü eksenin henüz bilinmiyor olması..."

Stroustrup, iki farklı stil üzerine düşüncelerini aktardı. Kendisine göre, algoritmalara yönelenler doğal olarak türden bağımsız programlamaya kayacaklar; daha çok nesnelerin ilişkileri ile ilgilenenler ise nesneye yönelik programlamaya...

Ancak bunlardan birisini seçmek her zaman doğru çözüm olmayabilir. "İkisini birden seçmeyi gerektiren başka kıstaslar da mevcut" diyen Stroustrup, "bu konuda profesyonel olarak kabul edilebilmek için tek bir dil bilmek yetmez" diye ekledi.

Texas A&M'de bilgisayar bilimleri profesörü olan Stroustrup, programlam stillerinin soyut olarak karşılaştırılamayacağını söyledi. Dillerin belirli bir amaç doğrultusunda nasıl işlediklerine bakmanın daha doğru olduğunu belirtti. Yazılım sektöründe önemli olanların doğruluk, üretkenlik, hız, daha büyük ölçeklere geçebilmek, genellik, ve öğretme ve öğrenme kolaylığı olduğunu belirtti.

Promcıların ihtiyaçları çoktur. Programlama dilinin; koda yeni eklemeleri, mevcut kodları değiştirmeden yaptıran, az yer tutan, hızlı çalışan, otomatik olarak doğruluk denetimi ve eşzamanlı çalışma sağlayan, küçük ama okunaklı, ve program oluşturması zaman almayan bir dil olmasını isterler.

Stroustrup, hepsinin birden edinilemeyeceğini söyledi. "Olanaksızdır. Programcılık bir mühendislik dalı olduğu için belirli koşullar ve kısıtlar arasında seçim yapmayı gerektirir. Size bir dili mükemmel olarak tanıtanlar, size bir şey satmaya çalışıyorlardır."

Diller mükemmel değildir. Stroustrup, dillerin ne yapıp yapamayacaklarını bilmek gerektiğini söyledi. Kendisi, değiştirmesi kolay ve başka kodlardan bağımsız olan [nonintrusive] yöntemleri yeğliyor. "Eğer başkasının koduna dokunmak zorunda kalmazsam, o kodu bozmamış da olurum. Eğer içini açmazsanız güvendesinizdir." dedi.

Söylentilerin tersine, Stroustrup'a göre programcılık hâlâ önemli. "Bence istediklerimizi sağlayan geleneksel programlama becerileri, yazılım sektörünün şimdiden görebildiğimiz gelecek dönemlerinde her zaman için önemli olacaklar." (Mart 2008).

Cuma, Kasım 27, 2009

Oyunlarda Basit AI(Yapay Zeka) Uygulamaları

İnternette oyun programlama ile ilgili araştırma yaparken bulduğum basit ama faydalı iki AI algoritmasından bahsedeceğim. Bunlar Dikdörtgen Çarpışma(rectangle collision)ve Dolaşan(Roaming) AI türlerinden Kovalama algoritmaları. Eğer ki -ben kod inceleyerek daha iyi anlarım diyorsanız yazının sonuda bu algoritmaları kullanarak Allegroda hazırladığım ufak bir uygulamayı bulabilirsiniz.

1-Dikdörtgen Çarpışma(Rectangle Collision) Algoritması

Olay son derece basit. İki boyutlu düşünecek olursak çarpışma ne demektir. İki farklı nesnenin sağından - solundan veya altından-üstünden acıcıkta olsa iç içe geçmeleri değil midir. Bu mantıktan yola çıkarak nesnelerin etrafında dikdörtgenden bir çerçeve varmış gibi düşünüp ayrı ayrı koordinat eksenindeki 4 noktasını öğrenip bunları bir birleri ile karşılaştırdığımızda sonuca gitmiş oluruz. Aşağıdaki kod uygulamadaki dikdörtgen çarpışma algoritmatsına ait olan kısım.

bool carpismaKontrol(Kahraman *pKahraman, Dusman *pDusman)
{
int dusmanLeft,dusmanRight,dusmanTop,dusmanBottom;
int kahramanLeft,kahramanRight,kahramanTop,kahramanBottom;
bool durum=true;

dusmanLeft = pDusman->getLeft(); // (x)
dusmanRight = pDusman->getRight(); // (x + resim->w)
dusmanTop = pDusman->getTop(); // (y)
dusmanBottom = pDusman->getBottom(); // (y + resim->h)

kahramanLeft = pKahraman->getLeft(); // (x)
kahramanRight = pKahraman->getRight(); // (x + resim->w)
kahramanTop = pKahraman->getTop(); // (y)
kahramanBottom = pKahraman->getBottom(); // (y + resim->h)

if (kahramanLeft>dusmanRight)
durum = false;
else if (kahramanRight<dusmanLeft)
durum = false;
else if (kahramanTop>dusmanBottom)
durum = false;
else if (kahramanBottom<dusmanTop)
durum = false;

return durum;
}




2- Kovalama Algoritması

Oyundaki bir nesnenin başka bir nesneyi takip etmesidir. Buradaki mantık ise kovalayanın X ve Y değerlerinin kovalananın X ve Y sine göre azaltılması veya arttırlmasına dayanır. Aşağıdaki kod benim hazırladığım uygulamadaki kovalama AI sine ait olan kısımdır.

void
Dusman::yakala(Kahraman *pKahraman)
{
int dusmanX = getX();
int dusmanY = getY();

sayac++;
if (sayac % hiz ==0)
{
if (rand() % zekaPuani == 0)
{
if (pKahraman->getX()>dusmanX)
dusmanX++;
else if (pKahraman->getX()<dusmanX)
dusmanX--;

if (pKahraman->getY()>dusmanY)
dusmanY++;
else if (pKahraman->getY()<dusmanY)
dusmanY--;

sayac = 0;
}
}
setXY(dusmanX,dusmanY);
}



Yukarıdaki kodda ilk iki if bloğu (if (sayac % hiz ==0) ve if (rand() % zekaPuani == 0)) olaya biraz rasgelelik katmak içindir. Bir nevi kovalayanın zeka seviyesi veya hızı olarak düşünülebilir.

Ekran Görüntüsü


Öncelikle çizimler için kusura bakmayın aceleye geldi yoksa o kadarda beceriksiz sayılmam :P. Uygulama Code::Blocks IDE si kullanılarak MinGW ile derlenmiştir buradan indirebilirsiniz.

Bir sonraki yazıda netten hazır olarak bulduğum spriteları kullanarak karakterimizin resmini doğrultusuna göre değişecek ve çarpışma anında müzik çalacak hale getirmeyi düşünüyorum.

Pazar, Kasım 22, 2009

C++ ile XML parse etme

Eğer ki bu blog'da bu yazıyı okuyorsanız iki ihtimal var ya bloğumu sürekli takip ediyorsunuz -kendimizi kandırmaya gerek yok bu düşük bir ihtimal :)) yada c++ ile xml de bir şeyler yapma gereği duydunuz ve google sayesinde bu blog ile karşılaştınız. Ben ikinci ihtimal daha olası olduğunu düşündüğüm için XML nedir ne işe yarar gibisinden bilgi vermeyeceğim (ki zaten buda kolayıma geliyor:D) çünkü ne olduğunu biliyorsunuz demektir. Ama yinede XML nedir diye merak ederseniz yeni eğitim sisteminin de temel dayanağı olan araştırmacı, öğrenmeyi bilen öğrenen (öğrenci değil!!!) yetiştirme politikasına hizmet açısından sizi bu adrese yönlendireceğim.

Evet sosyal mesajımızı da verdikten sonra bu laf kalabalığına son verip mevzuya giriş yapalım.

C++ da XML dosyalarını parse etmek için herşeyi bizim yapmamıza gerek yok sağolsun elin adamı bizler için vakti zamanında bir kütüphane yazmış. Bize düşen sadece kütüphanenin fonksiyonlarını doğru bir şekilde kullanmak. Bu kütüphanemizin adı libxml2. Öncelikle bağımlılıkları ile beraber bunu bilgisayarımıza kurup IDE ayarlarımızı yapacağız.

1- Bu adresten libxml2 nin Igor Zlatkovic adlı kişi tarafından windows için derlenmiş en son sürümünü indirelim(Kendisine de teşekkür ederiz). İndirdiğimiz dosyayı ileride bu yolu tekrar kullanacağımızı da göz önünde bulundurarak bir yere unzip edelim. (Ben C:\libxml2 yoluna unzip ettim anlatıma da buna göre devam edeceğim).

2- 1.adımda verdiğim linkten yine windows için derlenmiş iconv kütüphanesinin en son sürümünü indirelim -bu kütüphanenin ne işe yaradığını bende daha önceden bilmiyordum. İnternette kısa bir araştırmadan sonra karakter dönüştürme kütüphanesi olduğunu öğrendim. İleride işimize yarayabilecek bir bilgi ;). Aynı şekilde dosyaları yine bir yere unzip edin. (Ben C:\libiconv yoluna unzip ettim).

3- Şimdi sıra IDE ayarlarını yapmaya geldi. Ben her zamanki gibi Code::Blocks üzerinden anlatacağım. Diğer IDE'ler ile de yaklaşık olarak aynı mantıkla yapılan bir işlem. Codeblocksu açıp Settings menüsünden Compiler and debugger bölümüne giriyoruz. Ve aşağıda belirttiğim yerlere gerekli eklemeleri yapıyoruz.

Linker Settings->Link libraries: C:\libxml2\lib\libxml2.lib
Linker Settings->Link libraries: C:\libiconv\lib\iconv.lib

Search Directories->Compiler: C:\libxml2\include
Search Directories->Compiler: C:\libiconv\include
Search Directories->Linker: C:\libxml2\lib
Search Directories->Linker: C:\libiconv\lib
Search Directories->Resource compiler: C:\libxml2\include
Search Directories->Resource compiler: C:\libiconv\include

4- Kodu yazacağımız .cpp dosyasının yanında bazı dll'lerin bulunması gerekli. Bunları aşağıda belirttim. Biri hariç diğerlerini daha önce indirdiğimiz dosyalarda bulabilirsiniz.
  • libxml2.dll
  • iconv.dll
  • zlib1.dll (Burdan indirebilirsiniz. Tam olarak ne yaptığını bilmemekle beraber sıkıştırma işlemi için gerekli bir dll imiş.)
Kurulum bitti. Şimdi ufak bir program yardımı ile doğru bir şekilde işlemleri yapıp yapmadığımız kontrol edelim. Ben buradaki e-book tan yararlanarak aşağıdaki ufak programı yazdım.

"dosya.xml"
<?xml version="1.0" encoding="utf-8" ?>
<ogrenci>
<bilgi>
<ad>Esat ARSLAN</ad>
<dtarih>27/10/1986</dtarih>
</bilgi>
<bilgi>
<ad>Ali Veli</ad>
<dtarih>01/01/1986</dtarih>
</bilgi>
</ogrenci>



"xmlParse.cpp"
#include <iostream>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

void xmlParse()
{
xmlDocPtr docPtr;
xmlNodePtr rootNodePtr;
xmlNodePtr childNodePtr;


docPtr = xmlParseFile("dosya.xml");
rootNodePtr = xmlDocGetRootElement(docPtr);
rootNodePtr = rootNodePtr->xmlChildrenNode;

while(rootNodePtr != NULL)
{
if ((!xmlStrcmp(rootNodePtr->name,(const xmlChar *) "bilgi")))
{
childNodePtr = rootNodePtr;
childNodePtr = rootNodePtr->xmlChildrenNode;
xmlChar *ad;
while(childNodePtr != NULL)
{

if ((!xmlStrcmp(childNodePtr->name,(const xmlChar *)"ad")))
{
ad = xmlNodeListGetString(docPtr,childNodePtr->xmlChildrenNode,1);
std::cout<<ad<<std::endl;
}
childNodePtr=childNodePtr->next;
}
}

rootNodePtr=rootNodePtr->next;
}

}

int main()
{
xmlParse();
return 0;
}

Cumartesi, Kasım 14, 2009

PHP ile Pascal Üçgeni (Binom açılımı)

PHP yi alttan alan sınıf arkadaşlarımın isteği üzerine yazdım. Biraz çarpık çurpuk oldu idare edin:)). Zaten vaktimin çoğunu binom açılımının formülünü anlamaya çalışmakla geçirdim. Matematik konusunda iyice hamlamışım :(.

<?php
function faktoriyel($sayi)
{
$fak=1;
for ($i = $sayi;$i>=1;$i--)
$fak =$fak * $i;

return $fak;
}

function kombinasyon ($a,$b )
{
return faktoriyel( $a ) / ( faktoriyel( $b ) * faktoriyel( $a - $b ) );
}

function binomHesapla($sayi)
{
for ($i =0 ;$i<$sayi;$i++)
{
$binom .= " ".kombinasyon($sayi,$i);
}
$binom .= " 1";

return $binom;
}

function binomCiz($sayi)
{
echo "<table border=1>";
echo "<tr><td align=center>1</td><tr>";
for ($i =1;$i<= $sayi;$i++)
{
echo "<tr><td align=center>".binomHesapla($i)."</td></tr>";
}
echo "<table>";
}

binomCiz(4);
?>

Perşembe, Kasım 05, 2009

Allegro Örnek Program-2

Allegro örneklerine devam ediyoruz. Bu seferki programımız ileride yapacaklarımız için bir başlangıç olması açısından son derece önem teşkil etmekte. Hemen programdan bahsetmeye başlayalım.

Bazı noktalara değinmek istiyorum önce. Allegro da "set_gfx_mode (GFX_AUTODETECT, 640,480,0,0);" kodu ekranı yatayda 640 dikeyde 480 pixel olacak şekilde böler. Bu sayede çok hassas hareketler yapma şansımız olur. Ancak çok fazla hassaslık delikanlıyı bozar :P deyip ben ekranı 20*20 lik karelere böldüm. Programı çalıştırdığınızda ekranda göreceğiniz kare bu sayede her hareketinde 20 pixellik ilerler.

24x32 lik bir dizi oluşturdum ve bunu harita olarak kullandım. Buradaki 24 ve 32 rasgele seçilmiş rakamlar değildir dikkatinizi çekerim. 480 ve 640 ın 20 ye bölümünden elde edilen sonuçlardır bunlar.

Dikkatiniz çekmek istediğim diğer noktada diziyi oluştururken 32x24 değilde 24x32 şeklinde oluşturmuş olmam. 640 yatay ekseni 480 ise dikey ekseni temsil eder. Yani 640 sutun 480 satır şeklinde aklımızda tutabiliriz bunu. Bu yüzden diziyi 24 satır 32 sutun olacak şekilde oluşturdum.

#include <allegro.h>

BITMAP *buffer;
int x=10,y=10;
int tutX=10,tutY=10;

int harita[24][32]={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};

void haritaCiz()
{
for (int i =0;i<24;i++)
{
for (int k = 0; k<32;k++)
{
if (harita[i][k] == 0)
rectfill(buffer,k*20,i*20,(k+1)*20,(i+1)*20,makecol(255,0,0));
if (harita[i][k] == 1)
rectfill(buffer,k*20,i*20,(k+1)*20,(i+1)*20,makecol(0,0,255));
}
}
}
void hareketEt()
{
tutX = x;
tutY = y;
clear_keybuf();

if (key[KEY_UP])
{
if ((y*20)>0 && harita[y-1][x]!=0)
y--;
}
else if(key[KEY_DOWN])
{
if ((y*20)<460 && harita[y+1][x]!=0)
y++;
}
else if (key[KEY_LEFT])
{
if ((x*20)>0 && harita[y][x-1]!=0)
x--;
}
else if(key[KEY_RIGHT])
{
if ((x*20)<620 && harita[y][x+1]!=0)
x++;
}

acquire_screen();
rectfill(buffer,tutX*20,tutY*20,(tutX+1)*20,(tutY+1)*20,makecol(0,0,255));
rectfill(buffer,x*20,y*20,(x+1)*20,(y+1)*20,makecol(0,255,0));
draw_sprite(screen,buffer,0,0);
release_screen();
rest(100);
}

int main()
{
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT,640,480,0,0);

buffer = create_bitmap(640,480);

haritaCiz();

while(!key[KEY_ESC])
{
hareketEt();
}
return 0;
}

END_OF_MAIN();

Çarşamba, Kasım 04, 2009

Dong dong dong!!! Zil çaldı haydi çocuklar sınıfa.


Üniversite de 4.yılımdayım, diğer bir ifade ile yolun sonundayım. Her son yeni bir başlangıçtır denir lakin yinede her son insanda bir burukluk hissi yaratıyor.Her neyse konuya dönecek olursak son sınıf olmanın gerektirdiklerinden biri olan staj eğitimime başladım. Okul deneyimi dersinde hocamız her hafta staj ile ilgili belirleyeceğimiz bir konu hakkında yazı yazıp bloğumuz da paylaşmamızı istedi. Bu haftaki konuyu tekbir başlık altında toplamak zor olsada genel olarak "İlk Gözlemlerimiz" diyebilirim. (Resim staj okulum olan Ali Hikmet Paşa İlköğretim Okulunun karlı bir havada çekilmiş güzel bir fotoğrafıdır.)

Pavlovun Köpekleri!!!

Stajda ilk farkettiğim tenefüs zili oldu. Öğrencilerle beraber derste hocaya dinliyordum birazcıkta sıkılmıştım :)). Aniden zil çaldı ve içimde garip bir sevinç belirdi. Evet tam 6 yıl aradan sonra tenefüse çıkmanın verdiği rahatlığı tekrardan hatırlamıştım. 6 yıldır sönmüş durumda olan bu duygu staj okulumdaki ilk tenefüs zili ile beraber tekrar canlandı ki aklıma ilk gelende Pavlov abimizin köpeklerinin zile karşı verdiği tepki oldu. Staj hocama çaktırmadan bir süre kendime güldüm:)).

Bu Yeni Nesil Çok Fena :)

Tenefüs den sonra dersi staj arkadaşımla beraber biz anlatmaya başladık. 4.sınıf öğrencilerine bilgisayarın temel donanım bileşenlerini anlatacaktık.Artık tribünden sahaya inmiştim. Sahada olmayı daha çok sevdim çünkü dersi anlatmak dinlemekten daha kolay gelmişti. Kontrolün bende olması açıkcası hoşuma gitmişti. Karşımda da ortalamanın üstünde bir öğrenci grubu olunca dersi anlatmak çok daha zevkli hale gelmişti. Gerçekten öğrenciler zehir gibiydiler bizden çok daha bilgili olacakları kesin lakin bunun yanında yaramazlardı da. Dersi kaynatma potansiyelleri çok yüksekti. Bu yüzden dersi anlatırken mümkün olduğunca konudan sapmamaya çalıştım. Bazı şeyler için biraz daha tecrübeye ihtiyaç var o da zamanla olur inşallah.

Birileri Bir şeyler Yapmalı

Okul iki ayrı binadan oluşmakta. Yaklaşık olarak 2300 öğrenci varmış. Bir hayli yüksek bir rakam. Ama gelin görün ki okulun 3 laboratuarından sadece 1 tanesindeki bilgisayarlar çalışabilir durumda. Bir tanesinde sadece öğretmen bilgisayarı çalışmakta (bizde dersi bu laboratuar da anlattık). Diğerinden laboratuar dan henüz haberim yok. Bizim dersi anlattığımız laboratuar projeksiyon ile duvara öğretmen bilgisayarının görüntüsü veriliyor komiktir ki görüntünün üç te biri tavana yansımakta bu yüzden ekrandakiler tam olarak görülemiyor. En azından önümüzdeki haftalarda bununla ilgili bir şeyler yapabilirim.

İlk hafta böyle geçti. Bakalım önümüzdeki haftalar neler getirecek...

Salı, Ekim 27, 2009

Blogger Teması Tarih Kısmında Undefined Hatası

Blog temamı değiştirirken bazı temaların tarih kısmında Undefined şeklinde bir hata olduğunu gördüm. Bunun ilk başta temayı hazırlayanların kodlarında yaptığı bir hatadan kaynaklandığını düşünmüştüm. Fakat çok beğendiğim bir temada aynı hatayı görünce engin, ucu bucağı olmayan internet deryasında biraz araştırma yapmaya karar verdim. 5-10 dakikalık bir aramadan sonra çözüme vakıf oldum. Ve internetin büyüklüğü karşısında bir kez daha saygıyla eğildim :)).

Bu laf kalabalığından sonra bu ufacık çözümü paylaşmanın zamanı geldi. Buyrun;

  1. Bloğumuzun Kumanda Paneline giriş yapıyoruz.
  2. Ayarlar seçeneğine tıklıyoruz.
  3. Önümüze gelen sayfadan Biçimlendirme sekmesine tıklıyoruz.
  4. Burdaki pencereden öncelikle Tarih Başlığı Biçimi kısmınıSalı,Ekim 27, 2009biçimine getiriyoruz.
  5. Şimdide Tarih Damgası Biçimi bölümünüSalı,Ekim 27, 2009olacak şekilde ayarladıktan sonra sorun çözülecektir.

Perşembe, Ekim 15, 2009

Linux için Güzel bir Müzik Çalar


Bilgisayar başında bir şeyler yaparken(program yazmak hariç) müzik dinlemeyi çok severim. Bu yüzden windowsa format attıktan sonra kurduğum ilk programlar arasında bilgisayar kullanmaya ilk başladığımdan beri vazgeçilmezlerimden biri olan winamp'ı kurarım. Hatta o kadarki winampın ilk yıllarındaki klasik arayüzünü bile değiştirmedim :)).

Linuxe geçince ilk zamanlarda ubuntu ile default olarak gelen Rhythmbox media oynatıcısını kullandım. Fakat bana pek kullanışlı gelmedi. Ki winampa da oldukça alışmıştım kısa yol tuşlarına felan.Nette winampın Linux versiyonun aradım ve buldum. Ama ararken başka bir program keşfettim Audacious. Hemen ubuntunun paket depolarından bulup kurdum. Winamp'a benzer ara yüzlere sahip, kısa yol tuşları da aynı.

Özellikleri
  • Tema desteği (Winamp2 ve Xmms temalarını destekler)
  • Eklenti desteği
  • İnternet radyolarını dinleyebilme
  • Gelişmiş ve basit seçenekli ayar penceresi
Ayrıyeten ek olarak plugin desteğide var.Ben kendisinden çok memnunum sizlerede tavsiye ederim.

Pazartesi, Ekim 05, 2009

Allegro ile İlk Programımız

Daha önce allegronun derlenmesini ve IDE ayarlarının nasıl olacağından bahsetmiştim. Zaten işin zor kısmı başlangıç aşaması yani, bir şeyleri hazırlayıp kullanıma uygun hale getirmek. Artık ortamımız Allegro ile program yazmaya uygun hale geldiğine göre ilk örneğimizi yapalım

Bu programda yön tuşlarını kullanarak ekrandaki karakteri hareket ettiriyoruz. Programdan çıkmak içinde ESC tuşunu kullanıyoruz. Yine kod içerisinde mümkün olduğunca açıklama satırları kullanamaya çalıştım.

ÖNEMLİ: Sakın böyle bilmiş bilmiş konuşmama aldanmayın :)) bende daha yeni öğreniyorum Allegroyu. Öğrendikçe de burada paylaşacağım. Kaynağım burasıdır.

#include<allegro.h>

int x = 10;
int y = 10;

int main()
{
/*Allegro fonksiyonlarını kullanacağımızı
programa haber veriyoruz. Muhakka olmalı*/
allegro_init();

//Klavye kullanımını aktif hale getirir
install_keyboard();

/*Ekran çözünürlüğünü değiştirmek için kullanılır.
5 parametre alır. 1. herzaman GFX_AUTODETECT dir
Sonraki iki parametre ekran boyutu. Diğer iki parametre
daha fazla alan gerektiren programlarda kullanılır.*/
set_gfx_mode(GFX_AUTODETECT,640,480,0,0);

/*Basılan tuşlar "key" adlı bir dizi ile öğrenilir
---TUŞ LİSTESİ---

KEY_A - KEY_Z,
KEY_0 - KEY_9,
KEY_0_PAD - KEY_9_PAD,
KEY_F1 - KEY_F12,

KEY_ESC, KEY_TILDE, KEY_MINUS, KEY_EQUALS,
KEY_BACKSPACE, KEY_TAB, KEY_OPENBRACE, KEY_CLOSEBRACE,
KEY_ENTER, KEY_COLON, KEY_QUOTE, KEY_BACKSLASH,
KEY_BACKSLASH2, KEY_COMMA, KEY_STOP, KEY_SLASH,
KEY_SPACE,

KEY_INSERT, KEY_DEL, KEY_HOME, KEY_END, KEY_PGUP,
KEY_PGDN, KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN,

KEY_SLASH_PAD, KEY_ASTERISK, KEY_MINUS_PAD,
KEY_PLUS_PAD, KEY_DEL_PAD, KEY_ENTER_PAD,

KEY_PRTSCR, KEY_PAUSE,

KEY_ABNT_C1, KEY_YEN, KEY_KANA, KEY_CONVERT, KEY_NOCONVERT,
KEY_AT, KEY_CIRCUMFLEX, KEY_COLON2, KEY_KANJI,

KEY_LSHIFT, KEY_RSHIFT,
KEY_LCONTROL, KEY_RCONTROL,
KEY_ALT, KEY_ALTGR,
KEY_LWIN, KEY_RWIN, KEY_MENU,
KEY_SCRLOCK, KEY_NUMLOCK, KEY_CAPSLOCK

KEY_EQUALS_PAD, KEY_BACKQUOTE, KEY_SEMICOLON, KEY_COMMAND*/
while(!key[KEY_ESC])
{
/*Program basılan tuşların listesini arabellekte tutar.
bu fonksiyon ile arabelleği temizlemiş oluruz.*/
clear_keybuf();

/*Ekranı çizim yapmak için hazır hale getirir.
Ekranda yapacağımız her değişiklkten önce bu fonksiyonu kullanırız.*/
acquire_screen();

/*Ekrana metin yazdırmak(çizmek) için kullanılır.7 Parametresi var
1.çizdirmek istediğimiz yer. İkinci parametre fon tipi için.
Eğer özel bir fon tipi kullanmak istemezsek "font" yazmak yeterli.
Bu sayede Allegro kendi temel fontunu kullanır.3. parametre
çizdirmek istediğimiz metin. 4 ve 5. parametreler metnin çizdirileceği
koordinatlar.6.parametre metinin rengi.7.Parametre ise arka plan rengidir.
makecol() fonksiyonu 3 parametre alır sırası ile kırmızı(R),yeşil(G) ve mavi (B)
0-255 arasında sayı değeri alır. 3 parametrenin karışımı ile oluşan rengin değerini döndürür.
*/
textout_ex(screen,font," ",x,y,makecol(0,0,0),makecol(0,0,0));

if(key[KEY_UP])
y--;
else if (key[KEY_DOWN])
y++;
else if (key[KEY_RIGHT])
x++;
else if (key[KEY_LEFT])
x--;

textout_ex(screen,font,"@",x,y, makecol(255,0,0),makecol(0,0,0));

//Ekranda yapılan değişiklikleri uygular
release_screen();

//DÖngünün içinde bekleme yapar 10 milisaniye
rest(10);
}
return 0;
}
/*Allegroya main bloğunun sonlandığını bildirir
olmazsa olamazlardan dıur*/
END_OF_MAIN();

Pazar, Ekim 04, 2009

MySQL "1045 - Access denied for user..." Hatası

Geçenlerde MySQL root şifresini değiştirme ihtiyacı duydum phpmyadmin yardımı ile değiştirdim. Fakat hemen ardından sayfayı yenile yaptığımda aşağıdaki hata ile karşılaştım.

1045 Access denied for user 'root'@'localhost' (using password: NO)


İnternette kısa bir araştırmadan sonra "config.inc.php" dosyasında phpmyadminin gerekli değişiklikleri yapmadığını öğrendim. Aşağıdaki adımları izleyerek sorunu çözdüm.

1- "config.inc.php" dosyasını açın

2- Aşağıdaki satırları bulun.
[$i]['user'] = 'root'; //MySQL user
$cfg['Servers'][$i]['password'] = ' '

3- ' ' arasına yeni şifrenizi yazıp kaydedin.

Ben bu şekilde sorunu çözdüm umarım sizinde işinize yarar...

Salı, Eylül 29, 2009

4 Yıllık Maratonda Son Viraj

Evet 4 yıllık maratonun 28.09.2009 tarihinden itibaren son virajına girmiş bulunmaktayım. En fazla engelin olduğu viraj da bu viraj. Anlayacağınız bu sene çok yoğun olacak. İsmi lazım değil bir diziden alıntı yapacak olursak "Bu kış çok sert geçecek..."

Zaman nasıl oldu da bu kadar hızlı geçti anlamak mümkün değil. Zaten geçirdiğim 2,5 aylık yaz tatili hiç olmamış gibi. Birisi almış filmi ileriye sarmış. Hadi 2,5 ay bu, insana çabuk geçmiş gibi gelebilir normaldir diyebilirsiniz. Peki ya 3 yıl?İnsanın aklına iki şey geliyor.İlki "3 yıl boyunca kayda değer bir şey yapmazsan çabuk geçer tabi". Lakin hafızam bunun aksini söylüyor. Şöyle bir baktığımda, örneğin şans eseri katıldığım Gönüllü Abi Abla Torun Topluluğu (GAATT) veya kurucu üyeliğini ve 1 yıl da başkanlığını yaptığım Bilgisayar ve İnternet Topluluğu (BİT). Üniversiteye gidince yaparım deyipte yapmadığım tek şey siyasi oluşumlara daha da yoğun bir şekilde katılmamak oldu. Bunun da artı bir yanı kendi dünya görüşüm üzerine daha da yoğunlaşmam oldu. Bundan üniversitenin insanın kendini geliştirmesi ve kendi yolunu çizmesi için çok uygun bir ortam olduğu yorumunu da çıkartabiliriz. Akla gelen ikinci şeyse "güzel günlerin çabuk geçmesi". Bu biraz daha mantığıma yatıyor. Çünkü geçen 3 yıl için şöyle bir hafızamı yokladığımda iyi anılar ezici çoğunlukta. 1.sınıftan tekrar oku deseler hay hay derim. Hatta beni sonsuz döngüye sokun hep bu 4 yıl da dönüp durayım (-tamam biraz abarttım :P ) .

Okulun kapısından gerile gerile kendimle gurur duyarak girdiğim o ilk an dün gibi aklımda.(Fatihin İstanbul un fethinden sonra şehre ilk girişi gibi :D .İnsan 1 yılını ÖSS için inek gibi çalışıp, ot gibi yaşayarak geçirince normal tabi. Bizi o duruma düşürenler utansın deyip sosyal mesajımı verdikten sonra bu parantezi kapatıyorum). Herhalde insan sonu gelince başını hatırlıyor. Bu senede arkadaş ortamlarında sık sık başları hatırlamaya devam edeceğiz gibi görünüyor...

Cumartesi, Eylül 26, 2009

Gnome 2.28 duyruldu!


Linux sistemler için, en çok tercih edilen iki büyük masaüstü ortamından biri olan Gnome, 2.28 versiyonunu duyurdu! Uzun süredir merakla beklenen sürüm, bir çok yenilik içeriyor.

Linux dağıtımlarında yumuşak, göze hoş gelen, hızlı ve kararlı yapısı sebebiyle tercih edilen Gnome, güzel bir yenilikler pakedi ile karşımıza çıkmış.

Yapılan yenilikler kısaca şunlar;

  • Taşınabilir telefonunuz ile Gnome Bluetoth'u eşleştirdiğinizde, internet bağlantısı sağlayabiliyorsunuz.
  • Zamandan tasarruf için, kategorileri birleştiren güzel bir grafik arayüzü sunan Genel Bakış ekranı eklendi.
  • GNOME'un anında mesajlaşma iletişim uygulaması, Empathy bu sürüm ile daha da geliştirildi. Bağlantı listesi bir çok açıdan geliştirildi. Durumunuzu metin olarak girerek anında ya da daha önceden atadığınız durumdan anında ayarlayabilirsiniz. Bağlantılarınızı yeniden düzenlemek sürükleyip bırakmanın kopyalamak yerine taşımanızı sağlayarak daha kolay hale getirildi. Bir 'Görünüm' menüsü eklendi, bu bağlantıları sıralamaya, çevirim dışı bağlantıları görmeye ve bağlantı listesi boyut tercihlerini değiştirmeye hızlı bir erişim sağlıyor. Sesli ve görüntülü sohbetler artık tam ekran yapılabiliyor ve eğer bağlantının videosu yok ise onun avatarı gösteriliyor. Tekrar arama özelliği de eklendi böylelikle tekrar aramak çok daha kolaylaştı.
  • Epiphany web tarayıcısı üzerinde çeşitli iyileştirme ve yükseltmeler yapıldı.
  • GNOME'un Ortam Oynatıcısı DVD menülerini gezmek ve son konumdan oynatmayı devam etmek gibi özelliklerle geliştirildi. Ayrıca YouTube eklentisi de bazı hız gelişmelerine sahip oldu.
  • Webcam fotoğraf ve video uygulaması Peynir, bir çok gelişmeyi içeriyor. Peynir'e gelişmiş bir kullanıcı arabirimi ve "Patlama" kipini eklendi, böylelikle bir seferde birden çok resim çekebiliyor. Aynı zamanda Peynir'in ne kadar resim çekeceği ve hangi aralıklarla bunu yapacağını da seçebiliyorsunuz. Peynir webcam'lerin "Yakalama" düğmelerine basıldığında resim çekmeyi de destekliyor.
  • Evince belge görüntüleyici bir beliren pencere ile ilişkili metin notlarını düzenlemeyi ve kaydetmeyi yeteneğine kavuştu. Evince artık bir çökmeden sonra görüntülenen belgeleri de hatırlıyor. Evince ayrıca Microsoft Windows® platformlarına uyarlandı ve bu platformlarda mevcut.
  • GNOME menüleri ve düğmeleri öntanımlı olarak simgeleri göstermemek üzere tüm uygulamalarda standartlaştırıldı. Dinamik nesneleri olan menü öğeleri, uygulamalar dahil, dosyalar ya da yer imleri ve aygıtlar hariç tutuldu ve bir simge gösterebilirler. Bu değişiklik menüleri görünümlerini standartlaştıracak ve kullanıcılara daha temiz bir arayüz sağlayacak.
  • Tomboy Notları kaydedilen notların ve yapılandırma dosyalarının Freedesktop.org belirtimleri ile uyumlu olması için konumlarını değiştirdi.
  • GNOME Güç Yöneticisi artık birden daha çok pili bulunan taşınabilir bilgisayarlar için destek içeriyor, ayrıca DeviceKit diskleri için disk yavaşlatmayı destekliyor.
  • GTK+ dosya ve lpr yazdırma arka ucları tek kağıda birden fazla sayfa yazdırmayı destekliyor.
  • Erişilebilirlik yetenekleri yenilendi. Orca ekran okuyucusunda GNOME 2.28 için 140'ın üzerinde hata düzeltilerek program hatalarını gidermek ve performansını artırmak üzerine önemli çalışmalarda bulunuldu.
  • WebKit erişilebilirliğini arttırmak için belirgin bir efor harcandı, özellikle de imleç ile gezinmek ve Atk'nın erişilebilir metin arayüzü uygulamasının başlangıcı için. Erişilebilir metin arayüzü tamamen uygulandığında kullanıcılar içeriğe fare kullanmadan erişebilecekler ve içerik, Orca ekran okuyucu aracılığıyla onlara konuşma ve/veya braille olarak sunulacak.

Gnome bu büyük ve güzel yenilikleri ile kuşkusuz sabırla bekleyen sevenlerinde güzel bir tebessüm oluşturdu. Henüz geliştirilme aşamasında olan bir çok dağıtım, Gnome'un duyurulan bu yeni sürümü ile karşımızda olacak.


ALINTI

Perşembe, Eylül 24, 2009

Windows da Allegro Derleme ve IDE Ayarları

Allegro C\C++ dillerini kullanarak mario ve packman gibi 2D oyunlar yazabileceğiniz bir grafik kütüphanesidir.Bu kısacık bilgiden sonra allegronun derleme ve kurulum adımlarına geçelim.

1- Yukarıda allegronun C\C++ dilleri için olduğunu söylemiştim. Bu yüzden bu diller için olan derleyiciler den bir tanesini kuracağız. Benim seçimim MinGW.
Buradan indirip kuruyoruz.

UYARI: Burası çok önemli MinGW nin kurulacağı adresi seçerken kurulum yolundaki isimler arasında boşluk olmamasına dikkat ediyoruz. Aksi takdirde derleme esnasında hata alırız. Biz kurulumu "C:\" dizinine yapacağız. (Ör: "C:\Program Files" dizini olamaz onun yerine direk "C:\" dizinine kurulum yapabilirsiniz.)

2- Components seçimi penceresine geldiğinizde aşağıdaki gibi bileşen seçimini yapıyoruz.

3- Kurulumu bitirdikten sonra ortam değişkenlerine MinGW komutlarını çalıştırabilmemiz için gerekli olan dizin adreslerini ekliyoruz.
-MINGDIR için "C:\mingw" (mingw kurulumunu yaptığınız adresi)
-PATH için "C:\mingw\bin" (mingw kurulumunu yaptığınız adresi)

Konsolu açıp gcc -v komutunu uyguladığınızda aşağıdaki gibi bir çıktı ile karşırsanız doğru şekilde MinGW kurulumunu yaptınız demektir.

4- Şimdi bu bu adresten allegronun en son versiyonunun kaynak kodlarını bu adresten de directX paketini indiriyoruz. Allegro yu zipten kurtarıp bir dizine çıkartın. Ben "C:\" dizinine unzip ettim. İndiridğiniz directX dosyarınıda MinGW dizinin içine (C:\MinGW) unzip ediyoruz.

5- Artık derleme işlemine geçebiliriz. Bunun için konsolu açıyoruz, allegro dizinin (Ör:C:\allegro) girip aşağıdaki komutları tek tek çalıştırıyoruz
FIX.BAT mingw
MINGW32-MAKE.EXE
MINGW32-MAKE.EXE DEBUGMODE=1
MINGW32-MAKE.EXE install
MINGW32-MAKE.EXE install DEBUGMODE=1

6- Sıra geldi IDE ayarlarına. Ben favori IDE'm olan Code::Blocks a göre burdan sonraki adımları anlatacağım. Fakat diğer IDE ler içinde burdan sonraki adımlar yaklaşık olarak aynıdır. Code::Blocksu çalıştırıp Setting->Compiler and debugger yolunu izleyerek açtığımız pencereden Toolchain Executables sekmesine tıklıyoruz. Resimdeki gibi ayarları yapıyoruz.

7- 6.adımdakileri yaptıktan sonra yine aynı penceredeki Linker Settings bölümüne liballeg.a dosyasını ekliyoruz.

8- Son olarak yine aynı penceredeki Search Directories sekmesine giriyoruz ve aşağıdaki dizinlerin adreslerini ekliyoruz.
Search Directories->Compiler: C:\allegro\include\allegro
Search Directories->Linker: C:\allegro\lib
Search Directories->Resource Compiler: C:\allegro\include\allegro

8- Allegronun kurulumu ve IDE ayarıları bu kadar.Tüm adımları gerçekleştirdikten sonra allegro dizinindeki examples klasöründeki örneklerini derleyerek allegro ile neler yapabileceğimizi görebilirsiniz.

Kolay gelsin... :)

Çarşamba, Eylül 23, 2009

D Dilinde Dosya(File) İşlemlerine Örnek

D programlama dili ile ilgili ufak programlar paylaşmaya devam...

Başlangıç seviyesinde D dili ile nasıl dosya işlemi yapılabileceğine örnek teşkil etmesi açısında bir program. Temel düzeyde dosyaya yazma ve dosyadan okuma işlemleri yapılabiliyor. Eğer bu bana yetmez bana daha fazlası lazım derseniz DDili sitesinin Ali ÇEHRELİ tarafından hazırlanan D.ershane bölümünü veya Forumunu ziyaret etmenizi tavsiye ederim ;)

Program bu şekilde. Dilimin döndüğünce kod içerisinde hangi satırın ne işe yaradığını anlatmaya çalıştım.



import std.stdio;
import std.stream;
//din.readf() için
import std.cstream;
//system() için
import std.process;
//exists() için
import std.file;

/*İşletim sistemine göre
hangi fonksiyonun çalışacağına karar verir*/
version(Windows)
{
void ekranTemizle()
{
system("cls");
}
}
else version(linux)
{
void ekranTemizle()
{
system("clear");
}
}

char tusAl()
{
char tus;

do
{
din.read(tus);
} while(tus == '\n');

return tus;
}

//Kullanıcıdan alınan bilgiler dosyaya yazılır.
void dosyaYaz()
{
/*"FileMode.Append" dosya yoksa oluşturur ve açar.
Varsada sonuna eklemeye devam edecek şekilde
oluşturur ve açar.Okuma ve yazma işlemi
aynı anda yapılabilir.*/
auto dosya = new std.stream.File("ogrenciBilgi",FileMode.Append);
char[] ad;
char[] soyad;
char[] no;
char tus;

do
{
//Ekranı temizler
ekranTemizle();

write("Ad:");
din.readf(&ad);
write("Soyad:");
din.readf(&soyad);
write("No:");
din.readf(&no);

/*Kullanıcıdan alınan bilgiler
Dosyaya kaydedilir."%10.10s " ifadesi
verilerin dosyaya sabit aralıklar(boşluklar) ile
düzenli bir şekilde kaydedilmesini sağlar.*/
dosya.writef("%10.10s ",ad);
dosya.writef("%10.10s",soyad);
dosya.writefln("%10.10s",no);
writeln();
writeln("Kayıt Tamam...");
writeln("Yeni Kayıt girmek istermisiniz(E/H)?");
tus = tusAl();
}while(tus =='e' || tus=='E');
}

//Dosyadan veriler okunarak ekrana yazdırılır.
void dosyadanOku()
{
/*"FileMode.In" dosyayı sadece okuma işlemi
yapılabilecek şekilde açar.*/
auto dosya = new std.stream.File("ogrenciBilgi",FileMode.In);
char tus;

ekranTemizle();

/*Dosya sonuna gelene kadar veriler
satır satır okunarak ekran yazdırılır.*/
while(!dosya.eof())
{
char[] bilgi = dosya.readLine();
dout.writefln(bilgi);
}
writeln();
write("Ana menü icin Enter'a basin...");
din.readf(&tus);
}

char menu()
{
char tus;

ekranTemizle();

writeln("1-Ogrenci Kaydet");
writeln("2-Listele");
writeln("3-Cik");
writeln();
write("Birini seçin:");
tus = tusAl();

return tus;
}

int main()
{
char tus;

/*exist() fonksiyonu ile dosyanın daha önceden
oluşturulup oluşturulmadığını kontrol ediyorum.
Bu sayede program her çalıştırıldığında ogrenCiBilgi
adında dosya oluşturmayacak*/
if (!exists("ogrenciBilgi"))
{
auto dosya = new std.stream.File("ogrenciBilgi",FileMode.Append);
dosya.writef("%10.10s ","Ad");
dosya.writef("%10.10s","Soyad");
dosya.writefln("%10.10s","No");
dosya.writef("%10.10s","-------");
dosya.writef("%10.10s ","-------");
dosya.writefln("%10.10s","-------");
}

do
{
tus = menu();
switch(tus)
{
case '1':dosyaYaz();break;
case '2':dosyadanOku();break;
default:break;
}
}while(tus != '3');

return 0;
}

Pazar, Eylül 06, 2009

Bjarne Stroustrup’dan Dillerin Evrimi

Nisan 2008 de Bjarne Stroustrup ile yapılmış bir röportaj .Yazını Türkçe çevrimi pek iyi değil. İsteyenler buradan orjinalini okuyabilir.

Bjarne Stroustrup’dan Dillerin Evrimi

Her biri bir anda, mühendislik alanında biranda değişen, çabucak tekrar şekillenen ve ilerleyen bir bölüm oldular. Sanki yazılım geliştiriciliğinde C++ programlama diline giriş yaptıktan sonra bir ilerleme meydana gelmişti. Bu ilerleyiş , C++’tan önceki Simula67 ve Smaltalk’ta gibi nesneye yönelik programlama dillerinin kendi içinde bir gelişim yoktu. Her şeye rağmen C++dili C dilinin üzerine inşa edildi(geliştirildi) (ve C programları gibi derlenebilir) soyutlamaları nesneye yönelik düşünüm sayesinde ana görüşe yerleştirebilme olanağı sağladı.

C++ ‘ın gelişiminde “meta-programcılığı”dan güzel örnekler ve yazılım geliştirme ve dizaynında bulunan tüm güzel işlemler kullanıldı. Bunun nedeni, donanım platformları arasında daha taşınabilir olması ve daha düşük seviyelerde daha etkili olması. C++ etkleyici bir şekilde dünyada, daha hızlı olabilme ve daha az donanım geresinimi açısından bir esas olacak.

C++ dilinin geliştiricisi olan Bjarne Stroustrupile konuşurken gerçekten heyecanlandım. Kendi başlıkları hakkında ve programlama dillerinin endüstrisi hakkında ki görüşlerini öğrendim, ayrıca kendi kişisel okuma listesini öğrendim. Benim blog’uma okuyucular tarafından yazılıp , tavsiye edilen bir çok soruyu sordum. Sorularıyla katkıda bulunan herkese ve tabiî ki Bjarne’ye teşekkür ederim.

Dil Hakkında Düşündükleri:

Howard Dierking: Neden programlama dilleri insanlarla bu kadar alt seviyede bağlanıyorlar? -ki topluluğun dili direniyorken niçin böyle bir alt seviye bağlantısı gerekli?

Bjarne Strustrup: Bunu bir bilgisayar bilimciden çok psikoloğa, sosyoloğa yada ne bilieyim bir economiste sormalısın. Benim düşüncem eğer bir dil biliyorsanız, kendimizi ve kendi fikirlerimizi açmamız, açıklamamız için bizim bir parçamız haline geliyor. Diğer dillerinde taraftarı olmak kişisel bir korkuya neden olabiliyor. Bu noktada çözüm daha çok dili daha iyi bilmek gibi görünüyor. Yazılım alanında tek bir dil bilmekle bu alanda profesyonel olabileceğinize inanmıyorum. Bunun ekonomik nedenleri olabilir örneğin bir programlama dilinin sınırlarını zorlamaya başlayabilirsiniz ama bazı pratik becerileri edinemezsiniz. Şimdi ben X dilini biliyor ve sadece onun hakkında onun araçlarıyla ilgili bilgim varsa ve ben Y dili hakkında bir şey bilmiyor ama konuşuyorsam eğer bu benim geçimimi tehdit eder. Çözüm yine çok dil ve bu dillerin kullanım araçlarını bilmekten geçiyor. Maalesef ki önerilerim bazıları tarafından sadece belli bir süre kullanılırken, bazıları hesaba bile almadan sadece kendi düşünceleriyle yürüttükleri işlerine devam ediyorlar.

HD: Yazılım geliştiriminde IDE nin rolü ne olmalıdır? IDE dili nasıl desteklemelidir?

BS: Ben öyle çok IDE kullanan biri değilim. Benim dilimi IDE ile destekleyen tüm editörleri tebrik ederim ama ben IDE’ler olmadan çalışmak isterim. Eğer gerçekten tümsel olarak kullanılabilen bir IDE sahibi olsaydım farklı düşüncelere sahip olabilirdim. –gerçekten bir yazılım parçası olmuş bir önek için şekil 1 e bakın. Benim isteğim burada portatif kodların rol alması. C++ ile sistemimdeki kaynak dosyanın içinden kaynak kodlarını anlayabilmeği istiyorum. Ben hali hazırda dönüşüm ve kuşak içeren IDE mekanizmalarını sevmiyorum, bu kodları insanın tüketimine uygulanmış, kalıplaştırılmış gibi gösteriyor.

(Bir Dilde IDE Tasarımı)

HD: BU günlerde dillerin(programlama) genel amaçları hakkında problem duyuyor yada okuyor musunuz? Eğer böyle şeyler varsa çözüm nedir peki ?

BS: Daha basit bir söz dizimi daha güzel olabilir, çoğu kişinin okunabilirlik hakkında konuştukları zaman doğruluk derecesi olan bir dokümanın umdukları karmaşıklıkta ortaya çıkmadığı hakkında etrafta yakındıklarından şüpheleniyorum. Çoğu insan herhangi bir dille yazılmış herhangi bir programa ulaşmayı ve onu anlamayı bekler, online yardım desteğinin sunduğu olanaklar dahilinde tabi ki, aslında tek sorun programın yayınlamasında ki tüm yapıları anlamak ve programın kendi mantığını kapmaktır. Bizim doğal dillere karşı olan bakışımızı ve onları kullanışımızı kıyasla. Mesela Shakespear’in şiirlerini herhangi bir alt yapın olmadan tam anlamıyla anlayabilirmisin? Yada “Beowulf” ( 8. Yüzyıla ait epik bir şiir türü) eski orijinal İngilizcede nasıldı? Beklide biz programlama dillerinden çok şey bekliyoruz. Hiçbir dil tüm alanlarda, tüm gereksinimleri karşılayabilecek kadar sorunsuz ve bir hayli gereksiz karmaşıklığı olmayan bir sistem değildir ama uygulamaları geliştirebilmek amacıyla temelleri bulundururlar. Her dilin özelliği o dilin tanımladığı bir sisteme hitap eder ama biz şimdiki zamanımızda bu karmaşıklığın bedeli olarak bir çok dili ve onların getirdiği bir çok yapıyı öğrenmek zorundayız.

HD: Genel amaçlı programlama dilleri, uygulama geliştirimi sırasında bileşen programlama yada hizmet programlaması, nasıl olmalıdır?

BS: Genel programlama dilleri, genel yada uygulamaya özel kütüphanelerin tarifinin tasarımını desteklemeli, araç tasarımını desteklemeli, farklı uygulamalarla kontak kurabilmeyi desteklemelidir. Bunun için bir dil esnekliğe, anlamlı bir sisteme, güzel ve temel bir performansa ve uzun gelecekte karalılığa ihtiyacı vardır.

HD: Çoklu dispatch sizce iyi bir şeymi?

BS: Evet, basmakalıp nesneye yönelimli programlama dilleri ( Simula, C++,Smalltalk,Java,C# gibi) basit işlemleri hassa bir şekilde tanımlayamıyorlar. Çoklu olanların ise arakesiti bulmalarının iki şekli var, bunların mecburiyet çeşitleri çalışma zamanına kadar bilinemiyor. Böyle bir kodlamanın sonucu umduğumuz gibi bir yürütebilirlik vermiyor. Geçen sene öğrencilerimle birlikte bu konu üzerine araştırdığımız makaleyi yayınladık, sonuç olarak içinde bulunulan durumu yada olayı daha az hafızayla, daha kısa zamanda, daha basit ve daha hızlı bir çalışmayla halledebildiğimizi gördük. Bu konuyu aşağıda ki şekilde (şekil 2) görebilirsiniz. Bu çalışma C++ için çok geç geldi diye düşünüldü. Ayrıca isterseniz makaleyi
http://research.att.com/~bs/multimethods.pdf adresinden bulabilirsiniz.


(Şekil 2)

HD: C++ ‘ın eşdeğerliliği hakkındaki düşünceleriniz neler? Gelecekte son çıkan biçimleri ekleyerek dilin versiyonunu yenileyecek misiniz?

BS: Aslında hayır, bu alanda C++ ne yapması gerekiyorsa yapıyor. Hiçbir
vektörünün, bir vektörüne dönüşmesini gibi bir örnek düşünebiliyor musunuz? Bu korkunç bir şekilde güvenliksiz olurdu ancak vektörü sabittir (ya da siz onun yerine bir ekleyebilirsiniz). Çalışma süresi gerçekten bir sorun teşkil eder seviyeye gelinceye kadar böyle bir şey yapmayı düşünmüyorum.

HD: Bir anahtar dil özelliği ile ilgili mesaj geçimi yapımı hakkında ki düşüncelerin neler? Bir metod lüzumuna karşı çıkan özellikler?

BS: Net olan mesaj geçimlerini seviyorum ama onları çok uzun zaman önce kullandım ve ayrık sistemlerin içeriğinde yer alıyorlar. Gerçekçi olursak, büyük ölçekli işlerde mesaj geçimi için çok ciddi bir çalışma ve araç desteği sağlamamız gerekiyor. Bunun tam anlamıyla tamamlandığını sanmıyorum, tabi yanılıyor da olabilirim. Çoğu hata paylaşım ve kilitleyip devam etmeyle bağdaşıyor eğer ki gerçekten mesajlar ve mesaj kuyrukları üstünde çalışıyorsanız. Bunun için C++ ta standart kütüphaneleri görmeyi seviyorum.

HD: Genel amaçlı dillerde içsel olarak eş uyumlu bir yerde herhangi bir çakışma duyuyor musunuz? Yani sizi takip edenler tarafından herhangi bir hata bildirisi alıyor musunuz?

BS: Şimdi eğer küçük bir kitleye hitap ediyor olsanız onları takip edebielir ve nasıl bir hata yaptığınızı göz önüne alarak daha güzel şeyler ortaya çıkarabilirsiniz (örneğin onlara şu teorik bilgiyi öğrenin diyebilirsiniz.) ama genel amaçlı dillerde böyle bir işlem yapmanız çok zor zaten. Genel amaçlı bir dilin bir parçası olmak bazen çok vahşice gelebilir düşünsenize yazığınız dökümanlar milyonlar tarafından okunuyor, uygulanıyor vs. . C++ özel bir dil değil fakat hassas işte bu konudaki düşüncelerim bunlar.

HD: Mimarideki anlamı çok mu öne çıkardık?

BS: Hayır, en azından benim tanımladığım manasıyla. Ters şekilde anlaşılan çok az bir ön plana çıkarma var, yapıların prensiplerini çok az anlayıp kodlama çok zayıfça bir iş çıkarır. Benim mimari hakkında şüphelendiğim ana konu şu : programcıların iyi kod kodlama ile ilgili belirsiz düşüncelerinin olması. Ne yapmanız gerektiği hakkında yada yapmamanız gerektiği hakkında yeterli bilginiz yok bu yüzden bizim iyi mimari edilmiş sıkı kurallara ihtiyacımız var.

HD: Açık kaynaklı kod birliği size yardım etti mi? Size zarar verdi mi? Yada dizayn da her hangi bir kalite değişikliği yapmadı mı?

BS: Bu gerçekten zor bir soru. Çoğu yerde yardımlarını gördüm(insanlara sunacağımız kodların profesyonellik derecesinde kalitesini ayarlarken), tabi bana zarar verdikleri yerlerde oldu (gerçekten kötü bir şekilde düşündükleri alışkanlıkları ve vaziyetleri) ve daha söyleyemeyeceğim bir çok durum var.Uzun zamanda topluluğun etkisi ne olur tahmin edemem, topluluk daha iyi mi destek verir yoksa daha az mı bunu bilemem çünkü topluluk tahmin edebileceğimden daha kalabalık.

Dil Eğitimleri:

HD: Yakın gelecekte Dinamik Dillere aday olacak bir şey görebiliyor musunuz?

BS: Aslında hayır, insanlar elma ile armut u çok sık kıyaslıyorlar. Genel olarak Statik ve Dinamik diller arasında bir seçimimizin olduğuna inanmıyorum. Fillerin bu iki kalıpla biçimlenebileceğine inanmıyorum : çoğu eğer dinamik değilse, statik olarak sınırlandırılıyor. Bir moda var tabiî ki ama bu konu yani bu moda hakkında bir tahminim yok çoğu gerçek-dünya dillerinin seçimi yönlü olarak bir uygulamanın ihtiyacını karşılayacak, geliştiricinin becerisine yönelik olarak tasarlanıyor. Örneğin ben hiçbir zaman bir RUBY ‘ yi java ile gerçekleştirmedim yada gerçek bir interaktif simülasyonu C++ gibi bir dille yapmadım.

HD: En sonunda void/variant/object ve benzerlerinin tamamen kaldırılması sizce iyi bir şey mi? (aşağıda ki kodlama örneği bunun için iyi bir örnek)

STDMETHODIMP
CoCalc::QueryInterface(REFIID riid, void** ppv)
{
if (riid == IID_IFirst || riid == IID_IUnknown)
*ppv = static_cast>(this);
else if (riid == IID_ISecond)
*ppv = static_cast
(this);
else
{
*ppv = 0;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}

BS: Tahmin ediyorum ki prensip olarak kapsamlı(geniş) şeylerden kurtulmak iyi bir durum ama reel olarak biz kendi tanımlamak istediğimiz şeyleri tam manasıyla sınıflandırarak daha özel olabilir ve başarabiliriz. Örneğin ben hiçbir zaman her obje için bir şeyler yapabilen bir fonksiyon görmedim; ne üzerinde oynama yapıyorsanız sürekli bir varsayım yapıyorsunuzdur. (saf bir ilerleme fonksiyonu, sayaç örneği için en yakın düşünebileceğim şeydir). C++ dünyasında ki şu anki konsept çalışması (genetik algoritmalarda ki baskılar/gereksinimler) bu konuda bir yardımı olacaktır ama kendimizi genel mekanizmalar olmaksızın böyle bir açıklamayı yapabilecek derecede görmüyorum; “bilmek istemediğim bir şey” gibi beklenmedik bir yaklaşım olabilir.

HD: Gevşek yazılmış dillerin arkada kalması gibi bir eğilim var. Acaba tekrar Macar Rotasyonu üzerine mi düşünmeliyiz?

BS: Öyle bir eğilim olduğunu sanmıyorum. Gittikçe kaybolan dillere uygun düşen görevler artmakta. Diğer yandan bu tür diller hala gelişiyor olabilir (ben böyle düşünüyorum) çünkü geride kalmış kaybolan dillerin kullanımı arttıkça gelişimi de paralel olarak artmakta. Ayrıca kesinlikle Macar Rotasyonunu kullanmayınız, bu çok kötü bir düşüncedir. Yazdığınız programın kaynak kodu programının simüle yazımını değil anlamını yansıtmalıdır. Eğer gerçekten Macar Rotasyonuna ihtiyaç duyuyorsanız emin olun ki uygulamanız için uygun olmayan bir dil kullanıyorsunuz demektir.

HD: 2000 yılında “ C++,yeni milenyum için yeni bir dil” isminde bir sunum yaptınız ve “Wrap
” konseptine değindiniz. Bu basit olarak söyleyecek olursak “ aspect- oritnted programming(AOP)” tir. Genel olarak soracak olursak “AOP” ve onun şablonu olan “Wrap” hakkında ne düşünüyornusuz?

BS: “AOP” hakkında tam bir cevap verebilmek için çok fazla zaman harcamadım aslında. Aslında oluşumları seviyorum ( özellikle yayılımcı olmayanlarını) . Ben esasen ekstra-dil ile alakalı olan araçları ve onların standartlaşmamış araç zincirini merak ediyorum. C++ örnek şablonları yayımlıcılık göstermeyen, ilgi çeken ve başarılı oluşumlardır –Örnekler için Standford Üniversitesi Kütüphanesi ne bakın, gömülü sistem programlaması bölümüne. Bunun, katı bir şekil almaya ve hiyerarşik şekilde ön dizayna gerek kalmadan ve zorlanmaksızın olması kombine bir fikir için gerçekten de güçlü bir şekil. Fakat bu durum bazı geliştiriciler için yönetimi zorlarlaştırır ve kavramsal olarak ağırlaştırır. C++0x biçimsellik veya performans olmaksızın bir sürü örnek şablon içerir.

HD: C++’ın kesin söz malum karakteristiğinde istenmeden yapılanan, kötü amaçlı ve önemli potansiyelleri var ( örneğin makrolar ). Bu yapıları yani belirsizlikleri C++’ta yada genel anlamlı modern dillerde nasıl gömeliyiz?

BS: Aslında makroların kötü amaçlı olduğunu “C” dilini kullanmaya başladığımda gördüm ama diğer bu işi yapan tüm insanlar gibi bunların kötü amaçlı oluşunu veya olumsuz yönlerini tam olarak tahmin edemedim. İşte C++ ın neden 10 yıl gibi bir sürede mükemmel derecede geliştiremediğimizin nedenidir yani “C” dilinde ki makroların her yana yayılmasından dolayı. C++ ta objeleri sıfırlanın bir çok yanıltıcı yöntemi var. Umarım C++0x te adreslerin tek şekilli mekanizmalrı olur. Diğer soruda örnek şablonlardan bahsetmiştim. İşte sonraki C++ ın (1985 te yayınlanan) başarısının temel nedeni budur. Uyumluluk sorunları nedeniyle C++ ta adreslenemeyen irili ufaklı hatalar keşfedildi. Örneğin söz diziminin sahipliliği gereksiz bir yanlışlıktı, sadece lineer bir gösterim daha iyi olabilirdi. Benzer biçimde bir çok varsayım yanlıştı; yapılar öntanımlı olarak geri dönüşümlü olmamalıydı. İsimler öntanımlı olarak başka kaynak kodlardan erişilebilir olmamalıydı ve dahası… Bağdatırıcıların kontrol edilememesi sabit bir problem olmamıştır; özel olarak uygulayıcılar birbirine zıt şekillerde sunulması memnuniyet sağlamıştır. Tüm bunlara rağmen olumlu süprizlerde oldu.. En güzel olanı ise çöp toplama işleminin kaynak yönetime olanak sağlayabilmesi ve hata yönetimini kontrol edebilmesidir. Tüm bunlardan sonra çöp toplama fikrinin güzel bir olay olduğunu biliyorum.

HD: Sitenizde ki bir söyleminizde: “Dilin içindeki özelliklerinden çok yaptığınız uygulamanın zerafetine dikkat etmelisiniz” demiştiniz. Bu söylem Alansal Özelleştirilmiş Diller’e (DLS=Domain Specific Languages) yönelik bir hareket mi oluyor?

BS: Evet, aşağı yukarı kesinlikle. Bu alana sıklıkla bir girişim, teşebbüs olmuştur. Bazen yapmak gerek.

HD: Genel olarak DLS hakkında ki düşünceleriniz neler? DLS ve genel amaçlı diller arasında ki ilişki hakkında kafanızda ne canlandırıyorsunuz?

BS: Kaç dilin geliştirilmeye başlandığını, geliştirildiğini ve çok abartılı bir şekilde sunulduğunu ve sonradan beklenmedik bir şekilde anlamını yitirip kaybolduğunu gerçekten merak ediyorum. Bir çok yıl gelişim için uğraşılır tüm bunlar boyunca çok emek harcanır ama birden fark edilir ki geri dönüşü olmayan bir kaybolma yoluna girilmiştir. Bu konu hakkında “Anlamsal Geliştirilmiş Kütüphane Dillerine Mantıksal Bir Bakış” adlı bir makale yazmıştım (
http://research.att.com/~bs/SELLrationale.pdf ). Kütüphanelerin kullanılmasını, olasılıkla desteklenen araçlar ve genel destekli diller hakkında eleştiride bulunmuştum.
Bence DLS başvurulacak son nokta olmalı, ilk değil. Eğer mümkünsel genel amaçlı dillere ve onların araç zincirlerine sağlam bir şekilde tutturulmalıdır. DLS bir genel amaçlı programlama diline ihtiyaç duyar( en azından bir sistem programlama dili ) dili ve dilin genel çalışma zamanını tanımlamak için. Eğer DLS genel amaçlı bir dilde sağlam ve bilinçli olarak eşleştirilirse, yeni özellikler kazandırmak ve yeni kütüphaneler eklemek için çok güzel olur. Açıkçası bir profesyonel bir çok dilde usta olmalıdır

HD: C++ dilinde bir çok yapının bilinçli olarak belirsiz yapının değerin farklı donanımlarda çeşitli değerler aldığını ifade ettiniz . Bu belirsiz yapıların işbiliğinden bir ilerleme gördünüz mü?

BS: “ Belirsizlik” yanlış kelime. Tanımlanmamış bir çok şeyden ve tamamlamaktan uzak bir ifade. Ben şundan şüphe ediyorum; eğer tekrar C++’ı karama işinden başlayarak tekrar dizayn etsem hiçbir tanımlanmamış veya tamamlanmamış kısmı kalmazdı fakat bir zaman makinem yok ayrıca milyonlarca kodlanmış satır arasından iyi olmayanlarını toplayıp tekrar değerlendirebilecek durumum yok.

Yöntembilimi ve En İyi Egzersiz:

HD: Bu dili örenmek isteyenlere ne gibi süreçler tavsiye edersiniz?

BS: Anahtar uygulama konseptini tespit edin, yararlı kütüphaneleri tespit edin, uygulama konseptine uygun olacak kütüphaneler oluşturun, fikirleri hemen deneyin, hemen tümleştirin, erkenden ve sık sık test edin, eğitimsel dökümanlar kullanın ve küçük programlardan çok büyük çaplı programlar geliştirin (gerçi bu çok uzun zaman alabilir). Açık olmak gerekirse ben şu an için küçük çaplı projelere odaklanmış durumdayım.

HD: Hiç programlama dilleri veya geliştirme metoduyla ilgili bir kesişim yada ortaklık görüyor musunuz?

BS: Tabiki, kütüphane geliştiriminde özellikle. Gittikçe yüksek seviyeli ihtiyaçlar doğuyor ve bunun sonucu olarak kütüphane dizaynı kaçınılmaz bir şekilde dildeki yerini alıyor. Bu noktayı her ne kadar böyle söylesemde abartmamam gerekli çünkü tüm dillerde bu işlem için tek bir yol izlenilebilir diyemem mesela COBOL, C, JAVA, C++ ve PYTHON için her dilden minimum destekle kazanç ummak gerekir.

HD: Bir yazılım geliştirirken sizin kişisel kurallarınız nelerdir?

BS: Ana konsepte odaklanmak, ara yüzlere odaklanmak, kaynak yönetimine odaklanmak ( hafıza, dosyalar, kilit ve diğerleri… ), hata yönetimine odaklanmak, sınıflar için değişmezlikler ve kaynak edinim sınıflanması (Resource Acquisiton Is Inialization = RAII ), işte bunlar anahtar teknikler.

HD: Atik olduğunuza dair bir çok söylenti var. Sizin için ”atiklik” ne ifade ediyor? C++ atikliği destekliyor mu?

BS: Ben böyle bir kelime kullanmadım. Bu çok muallak bir şey. Evet C++ bunu destekler, o ne demekse…

Geleceğe Bakış:

HD: Nasıl olurda bir dil ileri derecede özelliklerini örneğin örnek şablonlarını, dinamik olaylarını, kendi kendine kod yazımını(tamamlamayı), aynı zamanda yeni girişler için olduğu gibi kalan erişilebilirliğini kendi kendine geliştirebilir?

BS: Bilmiyorum. Bunun genel bir cevabının olduğunu düşünmüyorum. Yeni özellikler dilin içeriğinin daha kullanışlı yardımı için önemlidir fakat istikrar temeldir; C veya C++’ı zorlamaya devam eden tek bir sebep girilen yeni değerin eskiye döndürülmesine neden olur. Bu kolay değil, en azından bunu söylemek ve yeni bir giriş her zaman başarılı olamayabiliyor. Çoğu zaman kullanıcılar tarafından yoksayıldığını duyuyoruz. Bazı ana özellikler C++0x için tasarlanmıştı örneğin tekdüze yükleme, otomatik kelime tamamlama ve örnek şablon kontrolü gibi işlemler daha iyi hizmet verebilmesi açısından eksper kullanıcılara sunulmuştu.

HD: “ÜSTVERİ(MetaData)” yı gelecekte ki programlama dilleri için önemli bir özellik olarak görüyor musunuz?

BS: Hayır, ben kişisel olarak üstveri’nin saçma sapan kullanılışını rahatsız edici buluyorum.

HD: İleride CPU’ların çekirdek sayısının artmasıyla birlikte uyumluluk için temel bir değişim görüyor musunuz? C++0x teki adreslemeye ne kadar uyumluluk sağlanabilir ?

BS: C++0x size temel olanı sunar. Bir makine modeli çok kullanımlılık için uygun olabilir. Düşük seviyede kuyruğa bağlı olanlar kütüphane oluşturumu için bir iş parçacığıdır ve API kütüphanesini kilitler. Daha fazlasını görmek isterim özellikle daha basitini. Yüksek seviyeli olanları iş havuzları, örnekler ve mesaj kuruları baz alınarak uyumluluk sağlattırılır. Bizim ihtiyacımız olan otomatik yada otomatiğe yakın , bir hesaplamayı diğer işlemlerden ayırıp yerini belirleyen yollar bulmamız. Bu alanda bir çok çalıma var özellikle C++ ta ama halen baskın bir model oluşmuş durumda değil. Örneğin Texas A&M üniversitesinin STAPL içeren çalışması ve INTEL in çalışması olan TBB.

HD: GPGPU hakkında ne düşünüyorsunuz? (GPGPU=bakınız
http://tr.wikipedia.org/wiki/GPGPU )

HS: Ümit verici ama henüz bu konuda konuşabilecek bir deneyimim olmadı ama açıkçası bunu kullanabilmek için bir özel amaçlı yeteneğe sahip olan bir işlemciye sahip olmak gerekir.

HD: Yüksek performanslı işlem yapmanın çabucak bir şekilde programcılar için şefaflaşacağını öngörüyor musunuz? Dahası bu amaç bir programlama dili için mi? Bir kütüphane için mi? Yoksa bir framework(yapı) için mi olacak?

HS: Sadece bir yere kadar şeffaflık. Uyumluluğun olabileceğini yada tamamen şeffaflığın olabileceğini düşünmüyorum. Başlangıçtakiler için hata yönetimi işlemcilerin kullanılabilirliğine bağlı olarak çok değişik olabilir, paylaşılmış(yada paylaşılmamış) hafıza, ayrılmışlık(yada ayrılmamışlık) ve gecikme süresi. Öngördüğüm kadarıyla şeffaflık yeni bir dil için, yeni dil özellikleri için ve (benim favorim) yeni kütüphaneler için yerini alacak bir amaç. Son bahsettiğimiz mümkün eğer ki altında yatan dil temel ihtiyaçlara bir makine modeli olarak cevap verebilir ve çok düşük seviyede kurala bağlı olmaksızın sabitlenebilirse. C++0x bunu yapacak.

HD: C++0x’in dizaynı nasıl? Ne zaman bitiyor?

BS: En sonunda finale yaklaştık. En azından umarım, oylama bitene kadar hiçbir şey söyleyemem ve adaylar sonlanana kadar her şet gergin ve duygusal olabilir. Bizim şuan ki planımız oylamayı kazanmak ve Haziran da yeni bir standart duyurusu yapmak. Açıkçası bu bir başlık hakkında bir kitap yazabilirdim nasıl bir standart yapabilirsiniz? Yol gösterim prensiplerinin ne olduğu sanılıyordu? Ve kesinlikle bunun içinde ki nedir? Bunu neredeyse yaptım benim HOPL makalemi görün “Gerçek Bir Dünya İçin Dil Geliştirimi : C++ 1996-2006” (
http://research.att.com/~bs/hopl-almost-final.pdfadresinden erişebilirsiniz) ama C++0x ilgili bir şey bulamazsınız. Eğer obur bir cezalandırıcıysanız sitemde ki “WG21” e bakın ve tüm ISO C++ Standartlarıyla ilgili makaleleri bulun eğer hiç biri sizi ikna etmediyse bu çok çalışma demek. Genişçe kullanılmış bir programlama dilini geliştirmek zordur özellikle de bir çok katmanı, bir çok aracı , dilleri ve uygulamaları tamamlanmışsa. Benim C++ sayfamda ve başka online ders veren sitelerde azda olsa video bulabilirsiniz bu konu hakkında.

Kitaplar ve Telefonlar:

HD: Son zamanlarda ne okuyorsunuz?

BS: Teknik metaryeller. Hennessy ve Paterson un makine mimarisi üzerine hatırlatıcı dökümanlarına geri döndüm. İnsanların iyi kod yazabilmeleri için makaleler ve dökümanlar biriktiriyorum( bu arada bende öğreniyorum tabi ki ). Bazen umduğumdan daha zor makaleler buluyorum öyleki akademik makalelerin çok özel eğilimleri oluyor ve akademik olmayan makaleler ispattan yoksun yüksek şeylerden bahsediyor(öneriler hoş karşılanıyor). Daha sonra bu dökümanlar elbette C++’ın standartlaştırılması sağlam bir akım olacak. Knuth serisini tekrar okuyorum ama biri 3.cildi çalmış, sanırım beklemem gerekecek. Heyecan için biraz O’Brain’s Aubrey ve Maturin okuyorum. Bilime olan bakışımı yenilemeye çalışıyorum ve Rodger Command ın “Okyanus : İngiliz Deniz Kuvvetlerinin Tarihi 1645-1815” (bu nedenle O’Brain i ziyaret ettim)

HD: “ Her zaman bilgisayarımı kullanmam telefonumu kullanmam kadar kolay olsa, dileğim gerçekleşti çünkü artık telefonumun nasıl kullanıldığını anlayamıyorum” demiştiniz peki bir SmartPhone’nunuz var mı? Bu bir şekilde faha mı kolay oldu?

BS: Ben iyi bir telefon takipçisi değilim. Yüz yüze görüşmeyi tercih ederim bunu yapamadığım zamanlarda ise kelimeleri yazmayı tercih ederim. En iyi telefon bile güzel bir mailin yerini tutamaz. Ben cebime sığması açısından ince bir telefon kullanıyorum ve özelliklerinin hiç birini de kullanmıyorum. Ses kalitesi ve güvenlik için hemen hemen tüm özelliklerini bıraktım. Adaletli olmak gerekirse kullanıcı ara yüzleri bu gün daha iyiye gidiyor.