18 Ağustos 2011 Perşembe

Atari Salonuna Geri Dönüş



Hatırlarım, ilk okuldan kaçma maceramı ilkokul 5. sınıfta arkadaşım Murat ile atari salonuna giderek yapmıştık. Sene 1993 'tü galiba. O günden üniversiteye girene kadar da aynı salona devam ettik. Hatta ailem bu alışkanlıktan kurtarmak için beni eve commodore 64 almışlardı. Şu an bilgisayarla bu kadar içli dışlı olmamı bu eski atari makinalarına borçlu olduğumu söyleyebilirim rahatlıkla.
Ne güzel olurdu şöyle bir tanesi evde olsa diye düşünürdük. Gerçekleşmesi pek mümkün değildi tabii ozamanlar. Ama şimdi zamanı geldi.

Arcade emülatörlerini bilmeyen kalmamıştır heralde. Küçük rom dosyalarını çalıştıran fantastik programlar. Ama bilgisayar klavyesinden oynayınca okadar eğlenceli olmuyor bu oyunlar. O yüzden imkan var ise bunlardan bir tane edinilmeli.

Yaklaşık iki aydır internetten bakınıyorum. Baya meraklısı varmış bu işin, o yüzden işim biraz daha kolay. İlk başta kendi modelimi kendim çizeyim dedim ki çizdim. Ama daha sonra kabinin kesim sürecinde problem çıkacağı ortaya çıktı. Bizdeki marangozlar koltuk, sandalye, masa vs. ürettiği için bu gibi işlere pek sıcak bakmıyor, sorun çıktığı zaman çözme eğiliminde olmuyorlar. O yüzden internetten teknik çizimleri eksiksiz kabin planları buldum. Hazır modelin üstünden gitmek daha mantıklı şu durumda. Şu adresteki teknik çizimden yararlanmayı düşünüyorum. Elvis's Arcade Cabinet olarak biliniyor ve birçok kabin yapan kişi bu çizimlerden yararlanmış. Sitesine de şurandan ulaşılabilinir.

Planlar hazır olduğuna göre artık diğer bir konu olan kontrol arabirimine geçebiliriz. Kontrol arayüzü için 2 adet metod var. Aslında 3 tane var ama biri diğerinin farklı bir versiyonu. Emülatörü 2 şekilde kontrol edebiliriz. Bunlardan biri klavye bir diğeri ise joypad. Klavyeden kontrol için klavyeyi söküp içine bazı ayarlamalar yapmak gerekiyor. Ancak 100'den fazla tuşu olan bir aletten bahsediyoruz burada. Elinizde havya (lehim aleti) birsürü kablo ile uğraşırken, işerin kontrolden çıkması çok kolay olabilir. İşte bu yüzden J-Pac adında bir devre kartı geliştirilmiş. Üstünde giriş pinleri var ve direkt olarak butonları buralara bağlayabiliyorsunuz.

Tabii bu parçayı yurtdışından getirmeniz gerekiyor. Fiyatı da kargo masraflarıyla biraz pahalıya maloluyor.

Ben ise diğer yöntem olan joypad hacking yöntemini kullanmaya karar verdim. Piyasada 10-15 tl gibi bir fiyata playstation joypad'i görünümlü joypadler var. Pek kaliteli değiller ama bize içindeki kontrol devresi gerektiği için bu bir sorun teşkil etmiyor.
İşe başlamadan önce gerekli olan malzemeleri yazayım.
  • İnce uçlu havya
  • Lehim teli
  • Sıcak silikon tabancası
  • Bolca ince kablo
  • multimetre ( şu elektrik ölçmede kullanılan hesap makinasına benzeyen alet )
  • Pense, kargaburun, yankeski, maket bıçağı
Şimdi joypadin vidalarını söküyoruz. Ve devre kartını ortaya çıkarıyoruz. Eğer joypadin dualshock özelliği varsa, kartı açtığımızda alt tarafta iki adet motor olduğunu göreceksiniz, bunları kesebilirsiniz. Ayrıca analog joysticklerin şapkalarını da çıkarırsanız daha rahat bir çalışma alanınız olur. Şöyle birşey olacak önünüzde;
Sarı ile işaretlediğim yerlere dikkat edin. Burada bir yuvarlak yüzey var ve bunlar 2'ye bölünmüş. İşaretli olmayan diğer yarısı topraklamayı sağlıyor ve bunların hepsi birbirine bağlı. Böylece lehimleme işi yarıya iniyor. Sadece işaretli olan yerlere lehimleme yapıp bir tane topraklama için lehimleme yapmamız yeterli. Yani 4 tane d-pad için, 4 tane sağ tuş takımı, 4 tane öndeki tuşlar için, 1 tane de topraklama için. Toplamda 13 tane, 24 değil. Yuppi. Bu arada lehimleme yapacağınız alan siyah iletken bir madde ile kaplı. Sivri uçlu birşeyle yavaşça kazırsanız alttaki bakır yüzeye ulaşabilirsiniz. Ama çok bastırmamak lazım, çünkü bakır yüzeyi de yerinden çözebiliriz.
Sol tarafı lehimledim. Şu şekilde gözüküyor;

Burada dikkat etmek gereken şey, kesinlikle lehimin, yuvarlağın diğer tarafına kaçmaması. Bir de daha düzgün durması için mavi ile işaretli olan yerlerdeki deliklerden geçirdim kabloları. Size de böyle yapmanızı tavsiye ederim. Ayrıca kırmızı ile işarekleriğim yerlerle lehim yapacağım yerler birbirine bağlantılı. Bu kısımlardan lehimleme işlemini doğru yapıp yapmadığımızı multimetre ile kontrol edebiliyoruz.

Son olarakta lehimlediğim yerleri ve devrenin altında kalan yerleri sıcak silikon ile silikonladım. Bölyece daha sağlam oldu. Bu arada ön kontrol devresinde bir tane lehimlenmiş yüzey görünüyor. Oraya bir tane daha kablo bağladım daha sonra. Boş olmasına aldırmayın.

18 Temmuz 2011 Pazartesi

%50

Olasılıklar üzerine konuşuyorduk arkadaşlarla. Enteresan konu. Şöyle bir düşünceye sahibim.
Örneğin; bir piyango bileti aldık. 6 haneli bir sayı var bilette. Ve en son biletin numarası 999999. Bu duruma göre, en genel bilgilerime dayanarak büyük ikramiyenin bize çıkma olasıllığı 1/999999 oluyor değil mi ?
Olmuyor işte.
İstatistik bilimi dünyanın en büyük kandırmacasıdır. Çok mekaniktir ve kuantum teoremine taban tabana zıttır.
Açıklayayım.
Bikere insan oğlu geleceği bilme yetisine sahip değildir. Ama rahat durmaz kaşınır ve geçmiş verilere, tecrübelere dayanarak bir hesaplama yapar ve buna olasılık der. Ama içinde bulunduğumuz ça olasılıkların çok ötesindedir. Kontrol meraklısı olan kişi bütün olasılıkları hesapladığını düşünür ve bunu matematiksel olarak bir alanda sınırlar.
Şöyle bir hikaye vardır.
Zamanın birinde, birbirlerini seven iki kral varmış. Birgün ters düşmüşler ve savaş kararı almışlar. Ama senelerdir dost olduklarından kan dökmeden aralarındaki husumeti çözmeye karar verirler. Zar atacaklardır.
Birinci kral zarı atar 6 gelir.
- Hadi bakalım görelim seni, der birinci kral ve ekler, 6 atma ihtimalin 6 'da bir. at da görelim.
İkinci kral zarı atar ve 6 gelir.
Tekrar zar atarlar.
Birinci kral zarı atar ve tekrar 6 gelir.
- Hah yine altı geldi, der birinci kral. Artık üst üste iki kez 6 atma ihtimalin 36 da 1, der.
İkinci kral zarı atar ve 6 gelir.
Tekrar zar atarlar.
Birinci kral yine 6 atar.
- Tamam, der. Üst üste üç kez 6 atma ihtimalin 216 'da 1.
İkinci kral zarı atar. Zar ikiye bölünür ve bir tarafı 6, diğer tarafı 1 olarak masanın üzerine düşer.

Karışık oldu belki, ama ifade etmeye çalıştığım şey, eğer ortada istatistiksel bir durum var ise, bu insanın etrafını kontrol etme çabasının bir sonucudur ve zavallı bir durumdur. Kişi geleceği bilemeyeceği için, en iyi ihtimal ile bir durumun gerçekleşme olasılığını %50 olarak öngörebilir.


6 Temmuz 2009 Pazartesi

Processing Ders Notları - Temel - Alıştırmalar

Renkli Kareler



void setup(){
size(400,400);
background(255);
frameRate(30);
}

void draw(){
rectMode(CENTER);
strokeWeight(random(1,4));
fill(mouseX,mouseX-random(1,255),mouseY);
rect(mouseX,mouseY,50,50);

}

Processing Ders Notları - Temel 3

Void
Processing, her modern programlama dili gibi obje tabanlı programlamayı destekler. Bunu kek yapımına benzetebiliriz. Önce gerekli mazemeyi temin edersiniz. Sonra yumurta ile şeker ve yağı çırparsınız. Ardından un ekleyip iyice karıştırıp kakao ilave edersiniz. Ve fırına koyup pişirirsiniz. Burada önemli olan nokta herşeyin bir sırası olmasıdır. Bütün mazemeyi aynı anda kaba koyup karıştırırsak kekimiz pek bir halta benzemez. İşin sırrı gereken mazemeyi doğru zamanda kek hamuruna karıştırmaktır.
Programlama yaparken de aynı şey söz konusudur. Önce genel olarak ihtiyacımız olan şeyleri belirleriz, ardından adım adım programa eklemeler yaparız. Void komutu burada devreye girer.
Bu derste

Void setup(){ }
Void draw(){ }

komutlarını işleyeceğiz.

Daha önce yaptığımız örnek üzerinden gidelim.

size(200,200);
background(255);
stroke(0,255,0);
strokeWeight(5);
fill(255,0,0);
rectMode(CENTER);
rect(100,100,50,50);

bu kodu parçalara bölüyoruz.

void setup(){
size(200,200);

}

void draw(){

background(255);
stroke(0,255,0);
strokeWeight(5);
fill(255,0,0);
rectMode(CENTER);
rect(100,100,50,50);

}

Programın yeni halini çalıştırdığımız zaman, değişen hiçbirşey olmamış gibi geliyor bize. Halbuki büyük değişiklikler var. Açıklayayım

void setup(){
size(200,200);

}

void setup programımızın genel ayarlarının yapıldığı yer oluyor. Burada ki kodlar bir kez okunur ve birdaha okunmazlar.


void draw(){

background(255);
stroke(0,255,0);
strokeWeight(5);
fill(255,0,0);
rectMode(CENTER);
rect(100,100,50,50);

}

void draw ile başlayan komut seti ise, şu durumda, program kapatılana kadar sürekli devam edecek komutlarımızı içeriyor. Aslında program çalıştırıldığında sürekli aynı dörtgen sürekli üst üste çiziliyor. Dörtgenin konumu değişmediği için biz onu durağan görüyoruz. Ufak bir değişiklik yaparak processing ile ilk animasyonumuzu yapalım.


void setup(){
size(200,200);


}

void draw(){

background(255);
stroke(0,255,0);
strokeWeight(5);
fill(255,0,0);
rectMode(CENTER);
rect(mouseX,mouseY,50,50);

}

Burada mouseX ve mouseY değişkenlerini kullanarak, dörtgenin mouse pointerının o andaki pozisyonunu orta nokta olarak aldık ve 50 x 50 pixellik kutu çizdirdik. Yukarda belirttiğim gibi program çalıştığı sürece bu kutu void draw() komutu sayesinde sürekli çizildiğinden biz kutuyu mouseun hareket ettirdiğini algıladık.

Bu arada background(255); satırnın void draw(); ın içinde void setup a taşırsak bakın neler oluyor.

void setup(){
size(200,200);
background(255);

}

void draw(){

stroke(0,255,0);
strokeWeight(5);
fill(255,0,0);
rectMode(CENTER);
rect(mouseX,mouseY,50,50);

}



background(255);
satırını void setup() ın içine taşıdığımızda artık bu komut bir kez okunacağından kutunun mouse tarafından kontrol edilen pozisyonları ekranda kalıyor ve bu efekt vasıtasıyla ekrana çizim yapılıyormuş gibi bir izlenim oluşuyor.

Örnek verelim ;

void setup(){
size(200,200);
background(255);

}

void draw(){


stroke(0);
strokeWeight(2);
line(mouseX,mouseY,100,100);

}



--------------------




void setup(){
size(200,200);
background(255);

}

void draw(){


stroke(0);
strokeWeight(2);
line(pmouseX,pmouseY,mouseX,mouseY);

}

Buradaki pmouseX ve pmouseY komutu mouseun pozisyonunu sürekli güncelliyor ve bu sayede sanki çizgi çiziyormuş gibi bir izlenim ediniyoruz.

Processing Ders Notları - Temel 2


Bu noktada programımıza birkaç komut daha ekleyelim.

size(200,200);
background(255);
stroke(0,255,0);
strokeWeight(5);
fill(255,0,0);
rectMode(CENTER);
rect(100,100,50,50);





Şimdi her satırı açıklayalım.

size (200,200 ) ---------200 x 200 pixellik kadraj oluştur.
background(255) -------Kadrajı beyaza boya
stroke(0,255,0) --------Çizgi rengini saf yeşile ayarla
strokeWeight(5) --------Çizgi kalınlığını 5 pixel olarak ayarla
fill(255,0,0) -------------Dörtgenin iç rengini saf kırmızı olarak ayarla
rectMode(CENTER) ----Dörtgeni orta noktasını baz alarak,
rect(100,100,50,50) ----x ve y aksisinde 100 pixel ara vererek 50 x 50 pixellik dörtgen çiz.

Burada ilk göze çarpan renk verirken kullanılan sayılar. Neye göre veriyoruz bu sayıları. Açıklayayım.
Bu değerler aksi bir durum belirtmediğiniz sürece RGB renk sistemine göre oluşturulur.
stroke(0,255,0) ya da fill(255,0,0) de gördüğümüz sayı değerleri, RGB nin sayı olarak yazılmasından başka bir şey değildir. Biraz daha açalım.

R = Kırmızı ( Red )
G = Yeşil ( Green )
B = Mavi ( Blue )

R,G,B tek tek 0 - 255 arasında bir değer alabilir. 0 renk yok, 255 ise o renkten mümkün olduğu kadar çok var anlamına gelir. R,G,B ye ayrı ayrı 0 ila 255 arasında bir sayı verilerek 16 milyon dan biraz fazla renk oluşturulabilir. Örnek verelim ;

fill(69,54,150) -------
Bu renk mavi renge yakın bir renk olur. Çünkü B hanesindeki değer diğerlerinden daha yüksek bir değer.

fill(200,54,40) ------- Bu renk kırmızı renge yakın bir renk olur. Çünkü R hanesindeki değer diğerlerinden daha yüksek bir değer.

Bu noktada dikkat edilmesi gereken birşey var. Televizyon, monitör gibi ışık kaynaklı görüntüleme aletlerinde ana renkler kırmızı, yeşil ve mavi dir. Hepimiz televizyonun dibine girip o küçük noktacıklara yakından bakmışızdır. Bu üç nokta bir araya gelip pixel i oluşturur. Ve yukarda bahsettiğimiz herbir kanal için ( RGB ) bu üç nokta 0 dan 255 e kadar olan değerlerle aydınlatılır. Böylece ekranda renk oluşur. Ancak resim derslerinden hatırladığımız kadarı ile ana renkler kırmızı sarı ve mavidir. Boya ile örneğin turuncu elde etmek istediğim zaman, kırmızı ve sarıyı belirli bir miktarda karıştırmamız gerekir. Ama mönitörde bu rengi elde etmemiz için Kırmızı ve yeşili belirli bir miktarda karıştırmamız gerekir. RGB sisteminde hangi rengi nasıl eldeceğimiz biraz karışık gibi duruyor ama herhangi bir resim işleme programı ( örneğin Adobe Photoshop ) ile bu durumun üstesinden gelebilirsiniz.



fill(69,54,150);
stroke(0,255,0);
vb. renk kodları içeren komutlar ;


fill(150)
;
stroke(100);

şeklinde de kısaca da kullanılabilir
.
Bu şekilde gri değeri elde edilir. Uzun yazılımı şöyledir.


fill(150,150,150);
stroke(100,100,100);

Bunun anlamı her kanaldaki renkten ,
fill(150,150,150); komutu için, 150 birim renk kullan.
Buradan yola çıkarak;
fill(0); ----------- hiçbir kanalda ışık olmadığı için siyah,
fill(255); -------- her kanalda olabilecek en yüksek değer olduğu için beyaz dır

diyebiliriz. Doğal olarak 0 - 255 arasındaki değerler de gri değerleri olur.


RGBA

RGB nin yanında bir de Alpha kanalı vardır ki, bu kanal transparanlığı sağlar. Yine diğer kanallardaki gibi A değeri de 0 - 255 arasındadır. 0 görünmez yani tam transparan, 255 ise tamamen görünürlük için verilen değerdir. Örnek ile açıklayalım;

size(200,200);

background(255);
stroke(0,255,0);
strokeWeight(5);
fill(255,0,0);
rectMode(CENTER);
rect(100,100,100,50);

noStroke();
fill(0,0,255,100);
rectMode(CENTER);
rect(100,100,50,100);


Son paragraftaki yeni değeri açıklayalım;

fill(0,0,255,100)---- son hanedeki 100 değeri yaklaşık %35 transparanlık sağlar. (255 / 100 )


son bir not.

Eğer çizdiğiniz şeklin kenarlarında çerçeve olsun istemiyorsanız
noStroke();

Şekilin içinin boş olmasını istiyorsanız
noFill();

komutunu kullanmanız gerekir.



5 Temmuz 2009 Pazar

Processing Ders Notları - Temel

Processing de ekrana birşeyler çizmek için birçok komut vardır. Şu ana kadar olan çalışmalarımda karşılaştığım komutlardan bazıları şunlar.

rect(0,0,50,50);

ellipse(0,0,50,50);

line(10,20,60,90);

Şimdi bu komutlardan birine yakından bakalım.

rect(0,10,50,60);
Bu komut şunu söylüyor. Ekranın soldan 0. pixel i ve üstten 50 pixelinden başlayıp, genişliği 50 pixel, yüksekliği 60 pixel olan bir dikdörtgen çiz. Burada unutulmaması gereken; rect(x,y,w,h) dizilimi.
x = x eksenindeki yer.
y = y eksenindeki yer.
w = genişlik ( width ).
h = yükseklik ( height ).

x,y,w,h sabit bir sayı ( 10, 15, 17 vb. ) olabildiği gibi değişkenlerde olabilir.
Örneğin ;

rect(50,50,random(60-90),50);

Burdaki w, yani genişlik değerindeki random(60-90) komutu, program her çalıştırıldığında 60 ile 90 arasında rasgele bir sayı üretip w değerine atar. Kafanız karıştı ise burayı es geçebilirsiniz.

Ekrana birşey çizdiğinizde processing sizden neyi baz alıp çizimi gerçekleştireceği bilgisini ister. Eğer belirtmezseniz, çizilen şeyin sol üst köşesini baz alarak çizimi gerçekleştirir. ( c_1a )
Örneğin ;

size(200,200);
rect(100,100,50,50);

c_1a

Bu iki satırın anlamı şudur;
- 200 x 200 pixellik bir kadraj oluştur.
- 200 x 200 pixellik bu kadrajın, x ve y aksisinden 100 pixel ara verip, 50 x 50 pixellik bir
dörtgen çiz.

Peki, diyelim belirttiğimiz noktayı çizeceğimiz objenin merkezi olarak almak istiyorsak ne yapacağız. (c_1b) Şöyle;

size(200,200);
rectMode(CENTER);
rect(100,100,50,50);

c_1b

Bu satır ile x ve y de verilen değerleri merkez noktası olarak aldık ve 50 x 50 pixellik bir dörtgen oluşturmuş olduk. Hemen önemli bir detay vereyim. Processing büyük küçük harf ayrımı yapan bir programlama dili. Yani rectMode(CENTER); yerine rectmode(center) veya varyasyonlarını yazarsak programımız hata verir. Zaten kodu yazarken renkler ile uyarır. Eğer bir kod ( rect, rectMode, size gibi ( sayılar dahil değil bu duruma ) ) siyah renkli ise muhtemelen bir problem vardır. Dikkat etmekte fayda var.

Processing Ders Notları - Giriş

İlk başlarda çöp kamyonu şöförü olmak istiyordum. Her sabah kocaman bir kamyonun arkasındaki aparatı kaldırıp indiriyordu bu adam. Camdan bakarken gördüğüm kadarıyla önünde birsürü kol, tuş ve bilimum kontrol mekanizması vardı ve çöpçüler çöp konteynırını arabanın arkasına yanaştırıp şöförün mekanizmayı çalıştırmasını bekliyorlardı. Ne güzel bir iş. Çöplerle uğraşıyor ama hiç kirlenmiyor, üstelik o kocaman kamyonla da oynuyor, diye düşünmüştüm.
Biraz ayran gönüllüydüm herhalde çocukken. Star Wars çıkmıştı bir arkşam parliamen sinema kulübünde yanlış hatırlamıyorsam. Jedi olamayacağımı biliyordum zira etrafta ne Obi Van Kenobi ne Usta Yoda ne de Dart Vader vardı. Ben de astronot olmaya karar verdim. Bu da kısa sürdü ve eve alınan Commodore 64 ile bilgisayar dünyasına giriş yaptım. Artık tek hedef vardı bilgisayar mühendisliği. 64 ler dergisindeki kodları satır satır kelime kelime yazıp olmayan ingilizce ile anlamaya çalışırdım. Ufak tefek programcıklar da yapmışlığım vardır ama beklediğim o grafiklere bir türlü ulaşmak mümkün olmadı. Sonra yanlış tercihler, ergenlik vs. girdi araya ve programcılık bahsini uzun süre kapadım. Ta ki şu günlere kadar.

Processing, özellikle benim gibi, mesela, Windows 'un herhangi bir sistem dosyasını açıp " vay anasını, ne yazmış bu adam buraya, allalla " diyen sayısal zekası biraz kıt bireyler için ( tabii ki evet siz süper zekalı matematik dehaları da unutulmamış ) geliştirilmiş özellikle grafik programlama konusunda birkaç satır kod ile harikalar yaratabileceğiniz bir programlama dilidir.
Processing ile çok kısa bir zaman içinde, örneğin, winamp ın visualization ekranında ki gibi grafikler yaratabilirsiniz. Ve en güzel tarafı bu yaratılan görüntülerin interaktif olması. Yani mouse, klavye, webcam, mikrofon gibi ekstra donanımlardan aldığınız veriler ile ekrana çizilen görüntünün değişiyor olması. Tabi ki bu kısımlara ulaşmak processing e ne kadar zaman ayırdığımız ile doğru orantılı. İşte tam bu noktada, bu yazının ve olası ilerideki yazıların gidişatı ile ilgili açıklama yapmakta yarar var. Ben Processing bilmiyorum. Ama öğrenmeye çalışıyorum. Bu yazıları da kendi kendine birşeyler yapmaya çalışan birinin acı dolu çığlıkları olarak görebilirsiniz. Belki birilerin acısını bastırırım bu şekilde. Bu da birşeydir.

Kaynaklar
http://www.processing.org
http://www.learningprocessing.com