Aylık arşivler: Aralık 2006

Ruby ile Dosya Ä°ÅŸlemleri

Merhabalar,

Bugün ruby’de dosya iÅŸlemleri ve ‘standart input/output’ olarak bildiÄŸimiz konuyu iÅŸleyeceÄŸiz. Öncelikle çok basit bir örnek verelim, ekrandan isim ve yaÅŸ bilgilerini alarak tekrar ekrana yazalım. Ve bunu yaparken tüm bu ‘input/output’ iÅŸlemlerine örnek vermiÅŸ olalım.
[ruby]
$stdout.sync = true # İşlemleri yaparken buffer kullanmaz, verilen işlemi anında yapar.

p “Lütfen adınızı giriniz: ”
name = gets.chomp # gets ile kullanicidan herhangi bir string (get’s’) bilgisi alınır.
print “Lütfen yaşınızı giriniz: ”
age = gets.chomp.to_i # chomp işlemi ile girilen son karakter çıkarılır, böylece enter karakteri işleme alınmaz.
puts “Lütfen kendiniz hakkında birÅŸeyler yazın: ”
descr = readline.chomp # Birkaç satır bilgi almak için kullanılır(mış).

# C dilinde kullanılan bir yazım tekneği
printf “Merhaba %s, %i biraz yaÅŸlanmışsınız.\n%s\n”, name, age, descr
[/ruby]

Bir sonraki aÅŸamada Ruby’nin dosyalar üzerindeki iÅŸlemlerine deÄŸinelim. Öncelikle ruby’nin dünyasında herÅŸeyin nesne olduÄŸunu unutmayalım. EÄŸer bir dosya açacaksak, bu kesinlikle bir sınıf ile eÅŸleÅŸmeli ve iÅŸlemleri bu sınıf üzerinden yapmalıyız.
Ruby ile Dosya Ä°ÅŸlemleri yazısına devam et

Ruby’nin Çalışma Zamanı

Merhabalar,

Bugünkü konumuz biraz daha ruby on rails’e yaklaÅŸmak, ruby’nin dosyalar, çalışma ve tasarım zamanları ile ilgili bir kaç bilgi vermek olacak.

Öncelikle bir konudan bahsetmek istiyorum, diÄŸer birçok dilde çalışma zamanı ile tasarım zamanı birbirinden farklı ve ayrı kavramlardır. ÖrneÄŸin C#’da programınızın derlenmesi ve çalışması ayrı zamanlarda gerçekleÅŸir. Fakat Ruby’de bu kavram arasında herhangi bir fark yoktur. Ruby’de tasarım da, çalışma da aynı temellere dayanır, ikisi arasında hiçbir fark yoktur. Evet çok sert bir kavram ama sanırım bir örnek yaptıktan sonra daha rahat anlaşılacaktır.
Ruby’nin Çalışma Zamanı yazısına devam et

Ruby’de Modül Yapısı – 2

Merhabalar bir önceki yazımızda module kavramına değinmiş ve basit anlamda kullanımını işlemiş be bu yazımızda da çok güzel bir mudule mixin örneği olduğunu söylemiştik. Şimdiki yazımızda Module kavramını daha da derinden işleyeceğiz.

Öncelikle module ile class arasındaki farktan bahsedelim. Evet fark diyorum çünkü sadece bir-iki küçük fark var. Elbette temelde birbirinden çok farklı yapılar ama, son kullanıcı yani bizler için aralarındaki fark at ile deve değil.
– class’ların anlık kopyaları olabilir, module’lerin olamaz.
– class’ların içerisinde module’ler olamaz, module’lerin içerisinde class’lar olabilir.
– class’lar ve içlerindeki öğeler protected, private gibi eriÅŸim denetleyici özelliklere sahip olabilirler, module’ler sahip olamazlar, tüm öğeleri public’tir.
Ruby’de Modül Yapısı – 2 yazısına devam et

Ruby Modülleri (Ruby Modules)

Merhabalar,

Bugün Ruby’nin çok güçlü olduÄŸu bir konuya deÄŸineceÄŸim, modüller. Özellikle çok büyük uygulamalar yazarken, bazı durumlarda ‘Object Oriented’ tasarım yaklaşımının sınırlarını zorlamak gerekir. Günümüzdeki pek çok programlama dilinde olduÄŸu gibi Ruby’nin tasarımcıları da ‘multiple inheritance’ kavramını desteklememiÅŸtir. Fakat bu özelliÄŸin bulunmaması elbetteki bazı kısıtlamaları beraberinde getirmiÅŸtir. Bu engelleri ortandan kaldırmak için modüllerin kullanımı ve özellikleri arttırmış ve sonuçta ortaya çok güzel bir yapı ortaya çıkmıştır.

Aslında ‘module’ kavramı Ruby dili içerisinde pek çok alanda kullanılabilir. Bir modül ‘static’ bir sınıf gibi davranabileceÄŸi gibi, bir ‘namespace’ gibi de kullanılabilir. Tüm bu kullanım alanlarına ek olarak sınıfların geniÅŸletilmesi için kullanılır ki, bu gerçekten çok güzel bir özelliktir.
Ruby Modülleri (Ruby Modules) yazısına devam et

Yazılım Alt Yapıları (Software Frameworks)

Merhabalar,

Yazdığımız programlar büyüdükçe, eÄŸer herhangi bir methodoloji kullanmıyor isek, deÄŸiÅŸiklik veya eklenti yapmak gittikçe zorlaşır. Yazılımcılar, bu tür problemleri aÅŸmak için “framework”ler üretmeye baÅŸladılar. Günümüzde, “framework” deyince çok geniÅŸ bir yelpaze karşımıza çıkmakta. Bu geniÅŸ yelpaze içerisinde istenilen özelliklere uygun bir yapı bulmak gittikçe zorlaÅŸmakta. Belki bu yelpazeyi biraz olsun daraltmak ve kategorilere ayırmaya çalışırmak bu konuda bizlere yardımcı olabilir. Bu nedenle normal dillerde olduÄŸu gibi düşük, orta ve yüksek seviyeli gibi terimler kullanmak belki bizlere yardımcı olabilir.

Düşük seviyeli “framework” lerin tanımını yapacak olursak; “Bu tipte yer alan yapıların, kendi derleyicileri ve/veya çalışma ortamları yoktur. Herhangi bir kum havuzunda deÄŸil, tüm makina üzerinde çalışırlar”. Bu yapılara örnek olarak TCL(Think Class Library), MFC(Microsoft Foundation Class veya orjinal adı ile AFX: Application Framework eXtensions), ATL (Active Template Library), WTL (Windows Template Library) ve OWL (Object Windows Library) yapıları verilebilir.

Orta seviyeli “framework” lerin tanımını yapacak olursak; “Bu tipte yer alan yapıların, kendi derleyicileri, kendi çalışma ortamları mevcuttur. Kısaca bir kendilerine ait olan bir kum havuzunda çalışırlar. Bununla beraber dış dünyaya eriÅŸmek için kum havuzunun dışına çıkan yetenekleri de olabilir.” diyebiliriz. Bunlara örnek vermek gerekir ise; Java, .NET, Ruby, Python, PHP gibi dilleri örnek verebiliriz. Hemen aranızdan bazılarının itiraz ettiÄŸini duyar gibi oldum “Java ile .NET diÄŸerlerinden farklı.. onlar derleniyor… diÄŸerleri script dilleri bir fark olmalı.”. Evet belki ‘derleyici mühendisliÄŸi’ açısından farkları olduÄŸu açık ama son kullanıcı için yani, bu yapıları kullanan yazılımcılar için bir farka sahip olduklarını söylemek çok zor.

Java ve .NET gibi yapılar bizim yazdığımız kodları ortak bir baÅŸka dile belirli optimizasyon yöntemleri kullanarak çevirir (örneÄŸin MSIL) ve daha sonra çok esnek ve profesyonel bir ‘cache’ mekanizması ile yazdığımız programlar bu framework’ler tarafından çalıştırılır. DiÄŸer taraftan script dilleri olarak yorumladığımız Ruby, Python ve PHP gibi diller baÅŸka bir dile çevrilmezler, ‘cache’ mekanizmaları da yoktur. Ama bu diller de aynı Java ve .NET gibi framework’ler tarafından çalıştırılır. Yani Ruby, Python ve PHP gibi script dilleri ile .NET ve Java gibi diller arasında baÅŸka bir dile çeviriliyor olmaları ve ‘cache’ yetenekleri dışında bir fark yoktur. Günümüz yazılım dünyasında ise, özellikle hafıza, hız gibi kısıtlamaların gittikçe kalktığı bir yazılım dünyasında bu tür farklardan dolayı ayrı kategorilerde yer almak sanırım tüm bu dillere karşı bir haksızlık olur.

Yüksek seviyeli “framework” lerin tanımını yapacak olursak; “Bu tipte yer alan yapıların, kendi derleyicileri yoktur fakat bir kum havuzu üzerinde çalışırlar. Yani bir orta seviyeli framework’ün üzerinde belirli bir methodoloji ile yazılmış yapılardır” diyebiliriz. Örnek vermek gerekir ise; Ruby on Rails, Pylons, TurboGears ve hiç adını duymasam da wikipedia’da karşıma çıkan ‘ColdFusion on Wheels’ örnek olarak verilebilir.

Sonuç olarak; eÄŸer bir makina otomasyonu yapacaksak, düşük seviyeli bir “framework” seçmek, bir internet uygulaması yapacak ise, orta veya yüksek seviyeli bir framework seçmek daha doÄŸru olacaktır. Ama gerçekten az kiÅŸi ile çok büyük (özellikle internet) uygulamalar yapmak istiyor isek, yüksek seviyeli “framework”lerden baÅŸka çaremiz olmadığı bir gerçektir.

Kolay gelsin :)

Ruby ile BaÅŸlangıç – Hata Yakalama – 2

Marhabalar,

Daha önceki yazımızda belirttiğimiz hata yakalama sizlere yetmemiş olabilir. Bazı durumlarda tüm bu hata yakalama işlemlerinden daha sert bir şeye ihtiyacınız olabilir. İşte bu yazının yazılma nedeni bu :)

Bir önceki yazımızda, diğer dillerde yer alan try..catch..finally kavramını tamamen destekleyen hatta fazlasını veren begin..rescue..else..ensure kavramı ile tanışmıştık. Daha fazla bilgi için.

Bu yazımızda daha önceden de belirttiğimiz gibi daha sert bir kavramı inceleyeceğiz.
catch..throw
Hemen örneğimizi verelim;
[ruby]
$stdout.sync = true
catch (:hata_test) do
begin
field = gets.chomp
throw :hata_test if field.index(“hata”) == 0
puts “Hata bulunamadı..”
end while 1 == 1
puts “Bu bölüm hiç iÅŸlenmeyecek.”
end
puts “Hata üretilmeden ‘catch’ bloÄŸundan çıkıldı..”
[/ruby]
Ruby programınızı çalıştırırken, throw deyimine rastladığında, en yakın uyumlu* catch‘e kadar yukarı çıkar. Ve catch bloÄŸunun iÅŸlenmesini sona erdirerek, bu bloktan sonraki kodları iÅŸlemeye baÅŸlar.

*throw deyimine parametre olarak bir deyim veya String verilebilir. Eğer bu parametre verilir ise, bu parametreye uygun olan catch yakalanmaya çalışır.

EÄŸer throw deyimi nedeni ile yukarıya doÄŸru giderken herhangi bir catch bulunamaz ise, `in throw’: uncaught throw `hata_adı’ (NameError) ÅŸekilde bir hata ile programımız sonlanır.

Görüldüğü gibi, begin..rescue..else..ensure deyimi gibi, catch..throw deyimini çeşitlendirmek pek kolay bir yöntem değil. Bu nedenle çok zorda kalmadığınızda kullanmayın. Ama sert ve keskin bir biçimde programın işlenmesini kesmek ve/veya yönünü değiştirmek istediğiniz kullanabilirsiniz.

Ruby ile BaÅŸlangıç – Hata Yakalama – 1

Merhabalar,

Ruby ile ilgili yeni yazıma baÅŸlamadan önce, The Marmara Pera’nın üstünde bulunan dev ekrana pazar günü saat 22:00 gibi “When you see that I hope, you know I loved you” yazan, aşık arkadaşı tebrik etmek isterim. Ben gördüm umarım görmesini istediÄŸin kiÅŸi de görmüştür :)

Bugünkü konumuz başlıktan anlaşılacağı gibi durum kötü giderse yapılacak olan işlemler üzerine deyinmek olacak. Öncelikle geçmişten günümüze bu işler nasıl yapılıyordu inceleyelim. Aslında önümüzde ik şeçenek mevcut bunlardan ilke biraz eski moda olan fakat halen kullanılan bir yöntem olan geri dönüş değerini kullanmak;
Örnek vermek gerekir ise;
[ruby]
# BAD, VERY BAD CODE for Ruby
HATAYOK = 0
HATAILK = 1

def hataDon(no)
printf “Ä°ÅŸlenen deÄŸer = %i\n”, no
if no == 0
return HATAILK
else
return HATAYOK
end
end

donenDeger = hataDon(15)
if donenDeger != HATAYOK
printf “Bir hata var numarası = %i\n”, donenDeger
end

donenDeger = hataDon(0)
if donenDeger != HATAYOK
printf “Bir hata var. Numarası = %i\n”, donenDeger
end[/ruby]
Fakat bu çok kötü bir yöntemdir.. Lütfen bu şekilde kod yazmayın, yazıyorsanız hemen bırakın. Ruby programlama dilini bu şekilde kullanmak, mühendislik bilimine saygısızlık niteliğinde olabilir.
Ruby ile BaÅŸlangıç – Hata Yakalama – 1 yazısına devam et

Eclipse 3.3M4 Yayımlandı

Efsanevi editör Eclipse’in 3.3M4 versiyonu yayımlandı. Sanırım bir sonraki yayımlamada nihayi 3.3’ü duyuracaklar ama ÅŸimdilik M4 ÅŸeklinde yayımlanmış.
Yüklemek için windows sistemlerde bu, mac sistemlerde bu, linux sistemlerde de bu linki kullanabilirsiniz.

Bu habere ek olarak, eğer halen Eclipse ile tanışmadıysanız, tanışmanızı tavsiye ederim. Bu adresden 3.2 nihayi sürümüne ulaşabilirsiniz.

Özellikle RadRails ile RoR (Ruby on Rails) uygulamalarınıza baÅŸka bir anlam katan Eclipse’in yetenekleri RadRails eklentisi ile sınırlı deÄŸil elbetteki, SqlExplorer gibi eklentilerle veri tabanı iÅŸlemlerinizi editör deÄŸiÅŸtirmeden yapabilir ve Ruby’den tutun C/C++’a hatta ve hatta Action Script için bile eklentisi bulunan Eclipse ile tüm multi-lingual uygulamalarınızı tek editörden gerçekleÅŸtirebilirsiniz. Bence birçok bakımdan Microsoft’un Visual Studio 8.0’ından daha güçlü olan bu editörü denemeden diÄŸer editörlere biraz mesafeli olun derim.

Kolay gelsin. :)

Ruby ile BaÅŸlangıç – Diziler

Ruby’nin en güçlü yanlarından biri dizilerdir. Dizilere eriÅŸim gerçekten çok rahat ve güçlüdür. Diziler C ve Java’da olduÄŸu gibi ‘0’ tabanlıdır. Bazı özelliklerine deÄŸinecek olursak;
[ruby]
# (“) isareti yerine baska bir isaret de kullanilabilir, (|) gibi.
%w”Uordek israf karsisinda deli olur”.each { |item|
p item
}
arr = Array.new # veya arr = []
newArr = [1,2,3]
15.downto(1) { |i|
arr.push(i)
}
p arr
arr.sort!
p arr
# Ortak elemanlari verir, tekrar eden elemanlari dikkate almaz.
p arr & newArr
p newArr.concat([4,5]) # newArr += [4,5]
p arr[-1] # Son elemanı verir.
p arr[-2] # Sondan bir önceki elemanı verir.
p arr[2..5] # 2. sayi ile 5. sayi arasindaki sayilari verir. 2. ve 5. dahil.
p arr.at(2) # arr[2] ile aynidir. Fakat daha hizlidir,2..5 gibi degerleri desteklemez.
p arr.delete(10) # Degeri “10” olan elemani diziden siler.
p arr.delete_at(-3) # Sondan 3. elemani siler.
p arr.index(8) # Degeri 8 olan dizi elemanin hangi sirada oldugunu soyler.
p arr.length # arr.size, dizinin uzunlugunu verir.
p arr.push(16) # dizinin sonuna bir eleman ekler.
p arr.pop # Dizinin sonundan bir eleman cikarir.
p arr.reverse # diziyi ters cevirir
p arr.sort {|a,b| b < => a } # dizi siralar iken, bizim kod yazmamiza izin verir.
p “Dizinin gercek hali..”
p arr
[/ruby]
Ruby ile BaÅŸlangıç – Diziler yazısına devam et

DirectX Aralık Sürümü

Microsoft, DirectX’in Aralık sürümünü duyurdu.

Bu sürümün diğer sürümlerden bir farkı var, bu sürüm içerisinde DirectX 10 mevcut.
Elbette D3DX methodlarını gene deÄŸiÅŸtirmiÅŸler! Bu nedenle sizlere ufak da olsa bir örnek sunamıyorum. Ama SDK’nın download iÅŸlemini bitirir bitirmez bir “Hello World..!” tadında bir örneÄŸi buraya eklemeyi düşünüyorum.
XACT haricinde diÄŸer modülleri %100 Vista uyumlu olan bu sürümün, yeniliklerine ek olarak PIX’ın geliÅŸtirildiÄŸini ve deÄŸiÅŸen D3DX için yeni örnekler ve teknik dökümanlar da hazırlanmış..mış..

Aslına bakarsanız, oyun programlama konusunda yeniyseniz ve baÅŸlangıç için ideal noktaların peÅŸinden koÅŸuyorsanız, takıldığınız yerlerde öncelikle bana yorum yazabilir veya mail atabilirsiniz :), atmazsanız da olur ama bloÄŸu açış amacım buydu…
Diğer bir alternatifiniz :) başlangıç seviyesinden profesyonel seviyelere kadar uygulamaları güvenli ve nistepen daha rahat ortamlarda hazırlamanıza olanak sağlayan ogre3d ve/veya irrlicht kullanarak yolunuza devam edebilirsiniz.

Unutmayın öncelikle emekleme döneminizi geçirin ki, koşabilesiniz.
Irrlicht ve Ogre3d’den sonra kendi kütüphanenizi oluÅŸturabilir :) ve kendi güzel oyunlarınızı yazabilirsiniz… Bu iÅŸlere baÅŸlarken kendinize çalışkan (çalışkan olması ÅŸart, yetenekli olmasa da olur) bir grafiker arkadaÅŸ edinmeyi unutmayın. Oyun yazımı ciddi bir iÅŸ olduÄŸu gibi bir takım iÅŸidir.

Kolay gelsin…

Ruby ile baÅŸlangıç – Döngüler

Ruby ile Veri Tabanı serisi ve Ruby ile Resim İşlemleri yazılarının üzerine hiç yakışmıyor ama, yeni başlayanlar ve/veya Ruby ile çalışanlar için bazı ipuçlarıda barındıracak bir yazı yazmam istendi :) emir büyük yerden geldi öyle bakmayın :)

Bu yazıdaki çerez konumuz ruby’de döngüler;
Standart bir döngü..

# 0'dan 14'e döngü
15.times { |index|
	p index
}

Biraz daha kompleks döngüler..
Ruby ile baÅŸlangıç – Döngüler yazısına devam et

“Reflection” kullanırken “ref” parametreler kullanmak

Önceki bloğumda yazdığım bir yazıyı gelen sorular üzerine buraya da yazdım. Daha önceden okumuş arkadaşlara verdiğim rahatsızlıktan ötürü özür dilerim.. :)

Bugün bir arkadaşımdan email aldım, kendisi “reflection” kullanırken nasıl parametrelerden birini veya birkaçını “ref” olarak nasıl geçebileceÄŸini soruyordu. Ä°nternet üzerinden araÅŸtırdığı söyledi fakat bulamamış, kendisine emaille yardımcı oldum.

Zamanım da var enerjim de bir yazı da buraya yazayım dedim.. iyi demiş miyim ? :)

Elimizde Deneme2 adlı bir namespace mevcut olsun, hatta bu ayrı bir proje olsun; (hedef namespace)
[csharp]
namespace Deneme2
{
public class Aha
{
public Aha(int a)
{
Console.WriteLine(“Aha.Const = ” + a.ToString());
}
public void ToString(ref int sayi)
{
Console.WriteLine(“Aha.ToString” + sayi.ToString());
sayi = 10;
}
}
}
[/csharp]
“Reflection” kullanırken “ref” parametreler kullanmak yazısına devam et

Ruby ile Veri Tabanı – 5

Gelen yoğun istek nedeni ile :p şu veri tabanı yazılarıma devam etme gereğini duydum.. Ama bu sefer az laf çok kod şeklinde bir yazı yazacağım yoksa yazıların sonu gelmiyor :).

Önceki yazımızda “DbTool.rb” isimli çok güzel bir program parçası kullanmıştık, ÅŸimdi de onu kullanacağız.
[ruby]
require ‘DbTool.rb’
# Northwind veri tabanina baglanti kuruluyor.
NorthwindConn = DbTool.new(“Northwind”,”localhost”,”rubyuser”,”rubyuser”)

NorthwindConn.getDb() { |db|
# orderStmt içerisine select’den gelen CompanyName ve Total Amount bilgileri alinir.
# fetch_all islemi ile veri tabanindan baglanti koparilir.
orderStmt = db.run(“SELECT C.CompanyName, SUM(OD.UnitPrice * OD.Quantity) As ‘Total Amount’
FROM dbo.[Order Details] OD
JOIN Orders O ON O.OrderId = OD.OrderId
JOIN Customers C ON C.CustomerId = O.CustomerId
GROUP BY C.CompanyName”).fetch_all
# Sonuclar ekrana yazdirilir. puts, p ve ek olarak printf ‘C’ daki kullanimi ile :D
orderStmt.each { |row|
printf(“%s – %14.2f\n”, row[0], row[1])
}
}
[/ruby]
Yukarıdaki kod içerisinde özellikle “printf” kullanımına vurgu yapmak isterim. “C” bilen arkadaÅŸlar hemen uyum saÄŸlayacaklardır.

Umarim veri tabanı işlemlerinde sizlere yardımcı olabilmişimdir. Ayrıca, bu örnekle beraber arkadaşlar SQL ile ilgili sorular sormaya başladılar ki :) bir sonraki yazımızda belki bu konuya deyiniriz.
Uzman konularından başladım ama sanırım biraz başlara doğru dönsem iyi olacak..!

Kolay gelsin..

Ruby ile Resim Ä°ÅŸlemleri

Ruby ile resim iÅŸlemleri (Image processing with Ruby) konusunda bir yazı yazma gereÄŸi hissetmemin nedeni, bazı arkadaÅŸlarımın bana resim iÅŸlemlerinin nasıl olacağını sorması ve bununla beraber yüksek kaliteli ve bir klasör altındaki birçok resmin boyutlarını deÄŸiÅŸtiren bir programa (Multiple Image Resizer) ihtiyaç duymam oldu. Bu programa ihtiyaç duymamın rengi, arkadaşımın yeni aldığı dijital fotoÄŸraf makinasının 3200×2400 çözünürlükte resimler üretmesi oldu. Her çekilen resmi aç, çözünürlüğünü (1/2 veya 1/4 oranında) deÄŸiÅŸtir, kaydet.. falan filan.. oooooo.. yazılımcı adam tembel olur, tembel adamda yaratıcı olur sloganıyla Ruby’de resim iÅŸlemlerine hakkında bir yazı yazmaya karar verdim.. Ä°yi etmiÅŸmiyim göreceÄŸiz :)

Öncelikle RMagicK kütüphanesinden bahsedelim biraz; Bu kütüphane ImageMagick® ve GraphicsMagick adlı kütüphaneler ile Ruby arasında bir köprü görevi gören bir yapıdır. Bu her iki resim kütüphaneside oldukça profesyonel kütüphanelerdir ve birçok dile ve iÅŸletim sistemine aktarılmış halleri mevcuttur. Windows tabanlı sistemler için gem paketi bu linkte bulunur, bu paket içerisinde ImageMagicK’in derlenmiÅŸ halde gelir.

Windows bir sistem için kurulumu özetleyecek olur isek;
Ruby ile Resim Ä°ÅŸlemleri yazısına devam et

Ruby kodlarının renklendirilmesi

Geçen geçe internette gezerken yolum ruby corner‘a denk geldi.. Türkçe iki adet blog olduÄŸunu görmek açıkcası biraz beni sevindirdi ve diÄŸer bloÄŸun kim olduÄŸunu merak ettim ve inceledim.
Bu arkadaşımız son yazısında Ruby kodlarını renklendirmekten bahsetmiÅŸ, çok da güzel bir örnek vermiÅŸ, ben de benimkisini nasıl yaptığımı açıklıyayım dedim. Standart ve güzel bir eklenti olan “iG:Syntax Hiliter” ile ama eÄŸer kendi sitenizi kendiniz yayınlamıyorsanız bu eklentiyi kullanmanız zor. Bu nedenle PINguAR‘ın ÅŸu yazısına bakmanızı tavsiye ederim.

Kolay gelsin :)