IDL Tutorial
Transkript
IDL Tutorial
IDL (Interactive Data Language) Dr. Tuncay ÖZIŞIK TÜBİTAK Ulusal Gözlemevi http://www.ittvis.com IDL’e Giriş IDL (Interactive Data Language) bilimsel verinin analizi, görüntülenmesi ve işlenmesi amacıyla hazırlanmış bir yazılım paketidir. IDL kullanıcıya Basic ile Fortran benzeri bir programlama, grafik çizme ve görüntüleme imkânı sunar. Bünyesinde birçok matematiksel fonksiyon ve görüntüleme tekniklerini kullanıma hazır olarak içeren dizigüdümlü güçlü bir programlama dili içerir. Bu yüzden IDL ile programlama, Fortran veya C gibi dillerle yapılanlara nazaran çok daha kısa sürer. Komutlar doğrudan komut satırından (IDL>) girilip anında çalıştırılabildiği gibi, bir program halinde de yazılıp kaydedilerek tekrar tekrar kullanılabilir. UNIX, VMS, Windows ve Macintosh işletim sistemleri için ayrı sürümleri bulunan IDL’in bu sistemlerdeki kullanımı ve komutları birbirine çok benzer. Windows ve Macintosh versiyonu tamamen grafiksel kullanıcı arabirimine sahiptir. IDL her yönüyle anlatılmaya kalkışıldığında ciltler dolusu kitaplar yazılabilecek çok geniş bir yazılım paketidir. IDL hakkında yazılmış birçok kaynak kitap ve kullanım kılavuzları olmasına rağmen herhalde en sık başvurulan kaynak kendi içindeki yardım bölümüdür (Online Help). Ana IDL penceresinden Help/Contents... ile anında erişilen ayrıntılı hazırlanmış bu yardım sistemi ayrıca komutların örnek kullanımlarını da içermektedir. Bu yazıda Windows tabanlı IDL 5.4 temel alınarak sık kullanılan bazı komutların uygulanışı anlatılmış, çeşitli amaçlarla yazılmış programların incelenmesiyle IDL kullanımına bir giriş yapılmıştır. IDL’in Avantajları • IDL etkileşimli olarak kullanılabilecek fonksiyonlar, programlar ve uygulamalar geliştirmek için yapısal bir programlama dili içerir. • Operatörler ve fonksiyonlar, veri analizini basitleştirecek ve programlama zamanını azaltacak şekilde verilerin tanımlandığı dizilerin tamamını kullanacak şekilde çalışır. Örneğin; iki boyutlu bir dizi, yani bir görüntü, okunduğu anda tüm elemanları (tüm pikseller) hafızada tutulur. 1 • Anında komut işletme veya yazılan programların derlenmesi, oluşabilecek hataların derhal görülmesini sağlar. • 2D, 3D grafik çizimleri, her türlü görüntüleme (hacim, 2D, 3D) ve animasyon olanakları, kullanıcının yaptığı analizlerin sonucunu hızlı bir şekilde almasını sağlar. • Verinin analizi ve simulasyonu için Numerical Recipes çözümlerinin de yeraldığı birçok sayısal ve istatistikel analiz olanakları mevcuttur. • IDL’in esnek veri giriş/çıkış özelliği sayesinde herhangi bir veri formatı okutulabilir. Ayrıca birçok standart görüntü formatı (BMP, GIF, JPEG, TIFF, XWD vs.) ile bilimsel veri formatı da (FITS, CDF, HDF, NetCDF vs.) tam olarak desteklenmektedir. • Yazılan programlara kolayca grafiksel kullanıcı arabirimi eklemek için “IDL Widget” ları (butonlar, menüler, pencereler gibi) kullanılabilir. • IDL ile yazılan programlar çok az veya hiç değişiklik yapmadan desteklenen tüm işletim sistemlerinde (Unix, VMS, Windows ve Mac) çalışır. Bu özellik birçok farklı işletim sistemine sahip bilgisayar desteği demektir. • Mevcut FORTRAN, C veya Visual Basic gibi dillerde yazılmış programlar, fonksiyonellikleri arttırmak için dinamik olarak IDL’e bağlanabilir veya bu tür programlar bir alt program olarak IDL programlarını çağırıp kullanabilir. • İyi bir şekilde kategorize edilmiş yardım sistemi sayesinde IDL kullanımı ve komutlar hakkındaki her türlü açıklamaya örnekleriyle birlikte IDL ile çalışırken erişmek mümkündür. IDL ile Çalışmak Temel bazı özellikleri ile anlatılan IDL kullanımında esas olarak 5.4 uyarlaması ele alınmış ve verilen örnekler burada çalıştırılmıştır. Bu örnekler önceki ve sonraki uyarlamalarında da çok yüksek olasılıkla çalışmalıdır. IDL 5.4’ün çalışması için teorik olarak 25 MB disk boşluğu, 32 MB RAM ve bir Pentium işlemci yeterlidir. Günümüzde PC türü bilgisayarların ulaştığı donanım seviyesini düşünürsek 1-2 GB disk boşluğu, 2 GB veya üzeri RAM ve işlemcisi hızlı bir bilgisayarda IDL çok iyi bir performansla çalışacaktır. Hızlı bir grafik kartı ve 17" – 19" bir monitör ise çalışmayı en verimli hale sokacaktır. IDL ile rahat çalışabilmek için Windows’un ekran çözünürlüğü monitör büyüklüğüne göre uygun ayarlanmalıdır (14" için 800x600, 17" için 1024x768 veya üstü), renk derinliği ise 256 (8-Bit) veya 16.7 Milyon (24-Bit) olabilir. Günümüzde artık 8-Bıt 2 yerine “True Color” olarak adlandırılan 24-Bit grafik kartları ile çalışmak en verimlisidir. Ekran kartınız ile ilgili ayarlara, Windows masaüstünden sağ fare tıklamasıyla gelen menü üzerinden Properties/Settings (Özellikler/Ayarlar) ile erişilebilir. Ayrıca IDL kullanacağınız bilgisayarın donanım özelliklerini öğrenmek için IDL satırında aşağıdaki komutu kullanabilirsiniz. IDL> Help, /DEVICE Bu komut çalıştığında aşağıdakine benzer bilgiler gelecektir. Available Graphics Devices: CGM HP METAFILE NULL PCL PRINTER PS WIN Z Current graphics device: WIN Screen Resolution: 1400x1050 Simultaneously displayable colors: 16777216 Number of allowed color values: 16777216 System colors reserved by Windows: 0 IDL Color Table Entries: 256 NOTE: this is a TrueColor device Using Decomposed color Graphics Function: 3 (copy) Current Font: System, Current TrueType Font: <default> Default Backing Store: Pixmap. IDL çalıştırıldığı zaman ekrana gelen ana IDL penceresi içinde en üstte çeşitli menü butonları, komutun işlediğinin ve oluşabilecek hataların kullanıcıya bildirildiği OUTPUT LOG penceresi vb pencereler yeralır. Bu pencereleri Window menüsünden düzenleyebilirsiniz. Burada standart olarak 100 satırlık kayıt yapılır. Bu değer File/Preferences/General menüsünden erişilen number of lines to display in the log ile değiştirilebilir. IDL penceresinin en altında ise IDL komut satırı (IDL>) yeralır ve buradan girilen komutlar doğrudan işletilir. Standart olarak IDL girilen son 20 komutu hafızasında tutar ve bunlar aşağı-yukarı ok tuşları ile çağrılabilir. Bu miktarı değiştirmek için IDL, içinde “!Edit_Input=satır sayısı” komutunun yazılı olduğu bir başlangıç dosyasına (startup file) bakar. File/Preferences/Startup menüsünden erişilen Startup Program: kısmına bu dosya adı yazılıp Save Settings ile kaydedilmelidir. Örneğin 50 satırlık bir hafıza istiyorsak; !Edit_Input=50 komutunu NOTEPAD benzeri bir program ile yazıp bunu HAFIZA.TXT adıyla kaydederiz. Bu başlangıç dosyasını da diskteki yeriyle (genelde IDL ile aynı dizinde olur) Startup Program: kısmına yazıp kaydedersek IDL’i tekrar başlattığımızda artık komut satırı 50 komutu hafızasında tutacaktır. Girilen komutların toplu listesini öğrenmek için, IDL> Help, /Recall_Commands 3 komutu da kullanılabilir. O ana kadar işletilen komutların toplu listesi LOG penceresi içinde gözükecektir. IDL ile çalışırken yapılan işlerin kayıtları otomatik olarak bir dosyaya da yazdırılabilir. Bunun için çalışmaya başlamadan önce; IDL> Journal,’work.txt’ komutu verilerek IDL’in tüm aktiviteyi bu dosyaya ASCII olarak yazması sağlanır. Dosya; IDL> Journal komutu ile kapatılabilir ve herhangi bir kelime-işlem programında okunabilir. IDL komutları IDL> şeklindeki komut satırından doğrudan çalıştırılabileceği gibi herhangi bir “ASCII Text” editörü (Notepad vb) kullanarak ta yazılabilir. Fakat kolaylık olması ve birtakım kullanışlı özellikler açısından IDL içindeki editörü kullanmak tavsiye edilir. Programlarının yazıldığı IDL EDITOR penceresi normalde IDL ilk çalıştırıldığında ekrana gelmez. Bunun için File/New/Editor ile boş ve Untitled1 adı verilmiş bir yazı penceresi açılır. Burası, IDL programlarının yazıldığı, kaydedildiği ve önceden yazılan programların çağrıldığı yerdir. IDL içindeki editörün kullanıcıya yardımcı önemli bir özelliği, programlar yazılırken belirli IDL komut ve yapılarının renklerle kodlanmasıdır. Programın çalışması sırasında oluşabilecek hataların olduğu satırlar da kırmızı noktalarla belirtilir. Bu özellik yine File/Preferences/Editor menüsünden erişilen Enable colored syntax seçeneği ile eklenip çıkartılabilir. IDL, renkleri aşağıda verildiği şekilde kullanmaktadır. Mavi : IDL fonksiyonları (SIN, COS, FLTARR gibi). Koyu Kırmızı : Program kontrol komutları (IF, THEN, ELSE gibi). Yeşil : Açıklama satırları ( ; ile başlayan satırlar). Kırmızı : İki tırnak (‘…..‘) arasındaki her tür yazı. Açık Kahverengi : Sayısal sabitler. Buraya kadar anlatılanlar Şekil 1’deki ekran görüntüsünde toplu olarak verilmiştir. 4 Şekil 1. Örnek bir program yüklenmiş ve çalıştırılmış IDL ekranının görünüşü. IDL penceresi ve menüler, program kodunun olduğu IDL EDITOR penceresi, çalışma kaydının tutulduğu bir OUTPUT LOG penceresi ve en altta komutların yürütüldüğü IDL komut satırı (IDL>). IDL: İlk komutlar, ilk program… IDL ile astronomi alanında çalışmak için öncelikle NASA tarafından hazırlanan ve zaman zaman güncellenen “The IDL Astronomy User’s Library” pakedi “http://idlastro.gsfc.nasa.gov/” adresinden yüklenip “RSI/IDLxx/lib/” altında “astron” olarak adlandırılabilecek bir klasöre açılmalıdır. Bu pakette yeralan birçok program parçaları yardımıyla IDL de astronomi alanındaki programlamalar çok daha hızlı ve konforlu olacaktır. IDL’i çalıştırdıktan sonra IDL> satırına aşağıdaki komutları yazarak ilk çalışmamızı yapabiliriz. Her komutu işletmek için ENTER’a basılır ve OUTPUT LOG penceresinden de girilen her komutun IDL tarafından yürütüldüğünü veya hatalar varsa neler olduğu takip edilebilir. IDL> file=Pickfile(/READ,FILTER='*.fit; *.fts; *.fits') - Diskten “M51.fit” dosyasını alalım. 5 IDL> im=Readfits(file) IDL> Window,1,xs=512,ys=504 IDL> tvscl,im IDL> Print, minmax(im) IDL> Help,im - Görüntüyü FITS formatında okuyalım. - Görüntü formatını OUTPUT LOG penceresindeki mesajdan öğrenip uygun bir grafik penceresi açıyoruz. - Grafik penceresinde gösteriyoruz. - Görüntüdeki min ve max piksel şiddetlerini OUTPUT LOG penceresine yazdırıyoruz. - im değişkeni hakkında bilgi alıyoruz. Şimdi kısaca komutlarla neler yaptığımızı inceleyelim: İlk satırda açılan bir sorgu penceresi ile bir FITS dosyası seçip file değişkenine atadık. İkinci satırda, file değişkenini Readfits komutu ile FITS formatında bir görüntü dosyası olarak okutup im değişkenine atadık. OUTPUT LOG penceresinden görüntü büyüklüğünü öğrenerek buna uygun ve 1 numaralı bir grafik penceresi açtık. Sonra bu görüntüyü, piksellerin şiddet dağılımları en iyi gözükecek şekilde, açılan grafik penceresi içinde görüntüledik. Görüntüdeki piksel şiddetlerinin minimum ve maksimum değerlerini öğrendik ve son olarak im değişkeni hakkında bilgi aldık. IDL: Görüntüler Üzerinde Temel İşlemler IDL’in grafik penceresinde görüntülenen her türlü veri üzerinde gerçekleştirilebilecek çok sayıda işlem bulunmaktadır. Bu kısımda sıklıkla kullanılan temel işlemler ve bunları gerçekleştirmek için kullanılacak komutlar örneklerle ele alınmıştır. Örnek komutlar yukarıda kullanılan im görüntüsü üzerinde uygulanacaktır. • Görüntünün (0,0) noktası IDL> Tvscl,im IDL> Tvscl,im,Order=1 - im adlı görüntü grafik penceresinin sol alt köşesi (0,0) olur ve buradan başlayarak gösterilir. - Grafik penceresinin sol üst köşesi (0,0) olur. Bu durumda görüntü dikey olarak ters çevrilir. • Grafik penceresi içinde bir görüntünün pozisyonu IDL> Tvscl,im,x,y - im görüntüsü grafik penceresinde, sol alt köşesi (x,y) koordinatlarına (piksel) gelecek şekilde görüntülenir IDL> Window,xs=600,ys=600 - 600x600 piksellik bir grafik penceresi açıldı. IDL> Tvscl,im,100,200 - Grafik penceresi içinde im görüntüsünün sol alt köşesi (100,200) koordinatlarına gelecek şekilde yerleştirildi. 6 • Görüntü boyutlarını değiştirme IDL görüntü boyutlarını değiştirmek için iki farklı fonksiyon sunar, REBIN ve CONGRID. REBIN komutu görüntünün orijinal (x,y) boyutlarının tam katları şeklinde büyültme/küçültme yapar. Halbuki CONGRID komutu tamamen serbest oranlarda görüntüyü küçültür veya büyültür. REBIN fonksiyonunda /SAMPLE ve CONGRID fonksiyonunda da /CUBIC, /INTERP ve /MINUS_ONE parametreleri (keywords) grafik kalitesini arttırır. IDL> yeni=Rebin(im,yeniX, yeniY) - REBIN fonksiyonunun kullanımı. IDL> yeni=Rebin(im,256,252,/SAMPLE) - im görüntüsü 250x200 piksel boyutuna küçültülerek yeni değişkenine atandı. IDL> Tvscl,yeni - 256x252 piksellik küçük görüntü gösterildi. IDL> yeni=Congrid(im,yeniX, yeniY) - CONGRID fonksiyonunun kullanımı. IDL> yeni=Congrid(im,144,136,/CUBIC) - im görüntüsü 144x136 piksel boyutlarına indirildi. IDL> Tvscl,yeni - Küçültülmüş görüntü gösterildi. Dikkat edilirse x/y oranı korunmamış, geometri bozulmuştur. • Görüntülerin döndürülmesi IDL grafik penceresi içinde yeralan görüntülerin döndürülmesi için iki farklı fonksiyon sunar, ROT ve ROTATE. IDL> new=Rot(im,± ±angle, [Mag,XPivot,YPivot]) - new adlı görüntü “angle” açısı kadar saat ibresi yönünde döndürülür. Angle : Saat ibresinin tersi yönde Mag > 1.0 büyültme Mag < 1.0 küçültme (Xpivot,Ypivot) : Döndürme merkezinin koordinatları. Keywords : INTERP : Bilineer interpolasyon (En yakın komşu piksel örneklemesi) CUBIC : Cubik Convolution (Daha doğru yaklaşım) MISSING : Döndürme sonucu görüntü datası dışında kalan alanların doldurulacağı piksel değeri. PIVOT : Döndürme merkezi kullanılacaksa gerekir. IDL> new=Rotate(im,Direction) - Görüntüyü 90o nin tam katları olacak şekilde döndürür. 7 Yön 0 Dönme Miktarı * - (X,Y) X0 , Y0 1 90o -Y0 , X0 90o sola çevir. 2 3 4 5 180o 270o 90o -X0 , -Y0 Y0 , -X0 Y0 , X0 -X0 , Y0 180o sola çevir 270o sola çevir (veya 90o sağa). Yatayda ters çevir ve 90o sağa çevir. Yatay doğrultuda ters çevir. Açıklama Herhangi bir döndürme yok. 6 180o -Y0 , -X0 Yatayda ters çevir ve 90o sola çevir. 7 270o X0 , -Y0 Dikey doğrultuda ters çevir. * Dönme yönü saat ibresinin tersi istikametindedir. ÖRNEK IDL> NewImage=Rot(im,45,1,300,300,/cubic,missing=1000,/pivot) im adlı görüntü (300,300) noktası döndürme merkezi olmak üzere 45o sağa doğru büyültme/küçültme yapmadan “CUBIC” yaklaşımı ile döndürülür. Döndürme sonucu grafik penceresi içinde data noktaları dışında kalan alanı “1000” piksel değeri ile doldurulur. IDL> new=Rotate(im,1) - im adlı görüntü sola doğru 90o döner. IDL> new=Rotate(im,6) - im adlı görüntü soldan sağa doğru ters Çevrilir ve 90o sola döner. • Grafik penceresi içeriğinin okunması (Capturing) IDL, bir grafik penceresi içindeki görüntünün okunması ve gerektiğinde bir dosyaya grafik formatında kaydedilebilmesi için TVRD adlı bir fonksiyona sahiptir. IDL> capture=TVRD() - Aktif grafik penceresinin tüm içeriği capture değişkenine atanır. ÖRNEK-1 IDL> Window, xs=512,ys=504 IDL> Tvscl,im IDL> newimage=TVRD() IDL> Help,newimage IDL> erase IDL> TV,newimage - 512x504 piksellik bir grafik penceresi. - Açılan pencereye im adlı görüntü gelir. - Pencerenin tüm içeriği newimage değişkenine atanır. - newimage değişkeni hakkında bilgi alınır. - Aktif pencerenin içeriği silinir. - Pencere içine yeni görüntü aktarılır (aynı görüntü gelir). 8 ÖRNEK-2 Aşağıdaki program bir görüntü dosyasının okutulması, grafik pencere içerisine yazı yazma, şekil çizme ve tüm pencere içeriğini kopyalama işlemlerine bir örnek teşkil etmektedir. (dispdata.pro) PRO dispdata file=FilePath('people.dat',SubDir='examples/data') OpenR,lun,file,/Get_Lun ali=BytArr(192,192) ReadU,lun,ali Free_Lun,lun window,0,xs=350,ys=230 tvscl,ali strings = STRARR(1) strings(0) = ' Ali Bahrami who is a developer of IDL.' fonts = STRARR(1) fonts(0) = '*helvetica-bold*--24*|20!5' Disp_Txt,strings,fonts,10, Def_Font='12x24' plots,[200,300],[100,100],/device plots,[250,250],[50,150],/device capture=TVRd(/CHANNEL) window,1,xs=350,ys=300 tvscl,capture end ÖRNEK-3 Bir galaksi görüntüsüne çeşitli görüntü işlemleri uygulanıyor ve sonuçlar aynı bir grafik penceresi içerisine gönderiliyor. Sonra bu pencerenin tüm içeriği FITS dosyası olarak diske kaydediliyor (galaksi.pro). pro galaksi Galaxy=BytArr(256,256) ;Galaksi görüntüsünün ;depolanacağı dizi. OpenR,1,'c:\rsi\idl54\examples\data\galaxy.dat' ;Galaksi görüntüsü ;dosyasını aç. ;Görüntü datasını oku. ;Dosyayı kapat. ReadU,1,Galaxy close,1 9 help, Galaxy window,0,xs=500,ys=500,Title='Processing M51' tvscl,Galaxy tvscl,rebin(Galaxy,128,128),50,325 ;500x500 piksellik grafik ;penceresi aç. ;Sol alta koy ;Sol üste küçülterek ;koy. ;Sağ üste döndürerek ;koy. tvscl,rot(Galaxy,44),250,275 window,1,xsize=250,ysize=250 ;Kontur için yeni bir ;pencere aç. ;Aktif pencereyi seç. wset,1 contour,Galaxy ;Galaksinin kontur ;haritasını oluştur. ;Kontur penceresini ;kopyala. ;Aktif pencereyi ;(galaksiler) seç. ;Kontur görüntüsünü ;galaksi görüntülerinin ;olduğu pencerenin sağ ;altına koy. kontur=TVrd() wset,0 tvscl,kontur,220,0 FinalImage=TVrd() ;Sonuç grafik ;penceresinin tüm ;içeriğini kopyala. Newfile = PICKFILE(/WRITE, FILTER = '*.fts') ;Kayıt için bir sorgu ;penceresi aç. writefits, Newfile, FinalImage ;Görüntüyü FITS ;formatında kaydet. End • Format komutunun kullanımı (Print, Printf, String) Çok farklı hallerde kullanılan “Format” komutunun kullanımına ait örnekler aşağıda verilmiştir. ÖRNEK-1: Ekran Çıktıları IDL> x=3 IDL> print,x IDL> print,format='(i3.3)',x - x = 3 olsun. - “Output” penceresine “3” yazar. - “Output” penceresine “003” yazar. 10 ÖRNEK-2: Dosya isimlendirme IDL> i=1 - i = 1 olsun. IDL> BMP_File="Frame_" + string(i, Format='(i3.3)')+".bmp" Diske yazılacak dosya ismi “Frame_001.bmp” olur. • Klasördeki dosya sayılarını bulma (findfile) ÖRNEK: FTS uzantılı dosyaların sayısı IDL> f=findfile('c:\rsi\idl54\work\*.fts',count=NFrames) IDL> print, NFrames," frames found." “c:\rsi\idl54\work\” klasöründe “fts” uzantılı dosyaların sayısını bulur. • Diskten dosya okuma (pickfile) ÖRNEK: FIT uzantılı dosyaları göster file=PICKFILE(/READ,FILTER='*.fit') im=READFITS(file,header) - Seçilen klasördeki “FIT” uzantılı dosyalar. - Seçilen dosyayı FITS olarak oku ve im değişkenine ata. • Diskten dizin seçme (dialog_pickfile) ÖRNEK: Diskten bir dizin seçmek üzere sorgu penceresi aç file=dialog_pickfile(get_path=path,/directory) - Sorgu penceresi açılır. İstenen klasöre çift tıklandıktan sonra “OK”. - Seçilen klasör “Directory” değişkenine atanır. Directory=path • Diskteki bir dosyayı bileşenlerine ayırma (fdecomp) ÖRNEK: Diskten bir dosyanın tüm bileşenlerini göster path=’c:\temp\frames\test.fts’ - Şeklinde bir dosya yeri olsun. fdecomp, path, disk, dir, name, qual, version - Komutu verilince disk= c:, dir= \temp\frames, name= test, qual= fts - Şeklinde bileşenler elde edilir. 11 • JPG görüntü dosyası okuma ÖRNEK: JPG uzantılı dosyalardan seçilen birini göster JPEG_file=PICKFILE(/READ,FILTER='*.jpg') read_jpeg,JPEG_File,image, TRUE=1 (read_jpeg,JPEG_File,image,/GRAYSCALE) TV, image,TRUE=1 (TV, image) - Seçilen klasördeki “JPG” görüntü dosyaları. - Seçilen dosyayı “JPEG“ formatında renkli oku. - Görüntü siyah/beyaz okunmak istenirse. - Dosyayı grafik pencerede renkli olarak göster. - Siyah/beyaz göstermek için. • STRING İşlemleri ÖRNEK: Belirli bir karaktere kadar ayıklama kelime=’12345_alibaba’ ayikla=GETTOK(kelime,’_’) Print,ayikla Print,kelime - Böyle bir “string” olsun. - ‘_’ karakterine kadar ayıklar. - Ekrana 12345 yazılır. - ‘_’ karakterinden sonrası yazılır, yani “alibaba” kalır. BAZI KAYNAKLAR - http://www.astro.virginia.edu/class/oconnell/astr511/IDLresources/IDLguide.html http://idlastro.gsfc.nasa.gov/homepage.html http://www.dfanning.com/documents/programs.html http://ross.iasfbo.inaf.it/IDL/idl_bo08.html Son güncelleme: 08.11.2012 12