alımlı

Gelmiş Geçmiş En Büyük 10 Bilgi Teknolojisi Felaketi

2911/2007

1. Hatalı Sovyet Erken Uyarı Sistemi neredeyse III. Dünya Savaşını sebep oluyordu. (1983)

Bilgisayarların kasten III. Dünya Savaşı’nı başlatmaları hala bir bilim kurgu hikayesi olsa da geçmişte yazılım sistemlerinde aniden oluşan hatalar bizi savaşın eşiğine bir çok kez getirmiştir. Bu türden olayların birçok bahsi geçmesine rağmen, askeri sistemlerinin gizliliği şehir efsaneleriyle gerçek olayları ayırt etmemizi güçleştirmektedir.

Lakin, 1983′de gerçekleşen öyle bir örnek vardır ki, hem güzelce kayda geçirilmiş hem de Sovyet erken uyarı sistemindeki bir yazılım hatasının direkt sonucudur. Rus sistemi, A.B.D.’nin beş adet güdümlü füze ateşlediğini bildirmekteydi. Nöbetçi subay, Yarbay Stanislav Petrov, eğer gerçekten A.B.D. saldıracak olsa bunun çok daha fazla füze ile gerçekleşeceğini düşünerek ikazın yanlış olduğuna karar verdi.

Uyduların bulutların üstünden yansıyan güneş ışıklarından dolayı oluşan asılsız füze uyarılarını süzmekle görevli yazılımdaki hata, neredeyse nükleer kıyameti koparıyordu.

2. AT&T (Amerikan Telekom Şirketi) Ağ Çöküşü (1990)

1990 yılında, basit bir mekanik problemden dolayı 114 santralden birinin kendi kapatmasından dolayı 75 milyon telefon görüşmesi gerçekleştirilemedi. Santral tekrar çalışmaya başlamasıyla diğer santrallere de bir mesaj göndererek onların da kendilerini kapatıp yeniden başlamalarına sebep olmuştu.

Suçlunun bir hacker saldırısı değil, çok karmaşık bir yazılım güncellemesi sırasında eklenen tek satırlık bir kod parçası olduğu ortaya çıktı. Amerikan Havayolları bu basit hatanın 200.000 rezervasyonuna mal olduğunu tahmin etmektedir.

3. Ariane 5′in İnfilaki (1996)

1996′da, Avrupa’nın en yeni insansız uydu fırlatma roketi, Ariane 5, ilk test kalkışında saniyeler sonra kasten patlatılmıştır. Avrupa Uzay Ajansı Ariane 5′in toplam geliştirme maliyetinin 8 Milyar Amerikan Doları’ndan fazla olduğunu tahmin etmektedir. Ariane 5 fırlatıldığında, 500 Milyon Amerikan Doları değerinde dünyanın manyetik alanının güneş rüzgarlarına etkisini inceleyecek dört adet bilimsel uydu taşımaktaydı.

New York Times’a göre, infilak, kumanda yazılımının 64-bit uzunluğundaki bir sayıyı 16-bit uzunluğuna çevirmesi sonucu çökerek kendini kapatmasından kaynaklanmıştır.

“Kapanma kalkıştan tam 36.7 saniye sonra, kılavuz sistemindeki bilgisayarın roketin yanal hızını 64-bit biçiminden 16-bit biçimine çevirmesiyle gerçekleşti. Sayı 16-bit için çok büyüktü ve taşma hatası oluştu. Bunun sonucu olarak kılavuz sistemi kendini kapattı ve kontrolü hata durumlarda kullanılmak üzere bulundurulan yedek birime devretti. Fakat ikinci birimde milisaniyeler önce kendini kapatmıştı. Neden olmasın ki? O da aynı yazılımı çalıştırmaktaydı.”

Devamı yakında gelecek. Orjinal yazı : Top 10 IT Disasters of all time

Korkunç Gerçekler - Eş Zamanlı Programlama

2907/2007

Merhabalar, bu yazımda eş zamanlı (concurrent) programlamadan bahsedeceğim. Yeni üstlendiğim bir projede Java’da bir ağ sunucusu yazmamız gerekiyor. Daha önceleri, yazılım kariyerimin ilk yıllarında, benzer işlere bulaşmış biri olarak yeni projemizi sıradan bir iş olarak gördüm. Bir haftadır proje üzerinde çalışıyorum. İlk gün, I/O için java’da kullanacağımız altyapıya karar verdik. Önümüzde temel olarak üç seçenek çıktı;

  1. Java I/O kullanarak ve kendi işcik (thread) yönetimimizle bu işi toparlamak,
  2. Java NIO (Non-Blocking) kullanarak işcik yönetimini büyük ölçüde kütüphaneye devretmek,
  3. Java NIO üzerine inşa edilmiş Apache MINA (Multi-Purpose Infrastructure for Network Applications) kullanmak.

1. seçeneği artık eskimiş ve terkedilen bir teknoloji olması, işcikleri tümüyle kendimizin yönetme zorunluluğu ve performans dezavantajları (Blocking olduğundan) yüzünden eledik.

2. seçeneğimiz java.nio’yu kullanım zorluğundan dolayı eledik.

3. seçeneğimiz java.nio üzerine inşa edilmiş olması, kullanımının daha kolay olması, çalışan sistemlerde kullanılmış bir kütüphane olması dolayısıyla tercih ettik.

Bu haftayı da mina belgelerini okumak, örnekleri incelemek ve projenin temel yapısını ortaya çıkarmakla geçirdim. Mina’da size gelen mesajları karşılamanız için IoHandlerAdapter‘dan bir sınıf türetip bunun messageReceived metodunu yazmanız gerekiyor. Mina dinlediğiniz porta mesaj geldiğinde bu metodu çağırıyor. Buraya kadar her şey iyi, güzel. Devamını okuyun »

Java Notları V - Legal Identifiers - Geçerli Adlandırmalar

101/2007

Bir değişkeni adlandırmak için java’da aşağıdaki kuralları uymalısınız.

  1. Değişken adı bir java anahtar kelimesi olamaz.
  2. İlk karakter bir harf, $ veya _ olmalıdır.
  3. Sonraki karakterler bir harf, $, _ ya da bir rakam olabilir.

Örneğin __deneme49, _$ufff, __3434_toto_$ geçerli adlandırmalardır. Öte yandan

new, _34#name, 34_name geçersiz adlandırmalardır.

Öte yandan her dilde olduğu gibi java’da da bir çok anahtar kelime bulunmaktadır. Bunlar,

abstract
assert
boolean
break
byte
case
catch
char
class
const
continue
default
do
double
else
enum
extends
false
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
null
package
private
protected
public
return
short
static
strictfp
super
switch
synchronized
this
throw
throws
transient
true
try
void
volatile
while

Java Notları IV - Access Modifiers - public, protected, default, private

101/2007

 

Bugünkü java notlarında, daha önceleri de bahsettiğim, “access modifier“ konusunu ele almak istiyorum. Nedir bu “access modifer”, ne işe yarar, nasıl kullanılır sorunlarının cevabını vermeye çalışacağım. Bu konuyu anlamak için önceden temel bir kalıtım (inheritance) ve java paketleri (package) konusunda bilgi sahibi olmanız gerekmektedir.

“Access Modifier”ları, Türkçe’siyle erişim koruma niteleyicileri, bir sınıfın bir metoduna veya bir değişkenine, diğer deyişle, bir sınfın malına kimlerin erişebileceğini belirleyen kelimelerdir. Java dört seviyede erişim koruması sağlar. İşin kafa karıştırıcı yönü ise bu dört seviyenin üç farklı isimle adlandırılmasıdır. Peki dördüncü nasıl adlandırılıyor diyorsanız, o adsız kahramandır. Diğer bir deyişle, bir sınıf öğesine erişim koruması atamazsanız o varsayılan (default) erişim korumasına sahip olur. Diğer koruma niteleyicileri public, protected ve private’tır.

Öncelikle temel bir sınıf üzerinden örnek vermeye çalışalım.

Temel.png

Temel sınıfında dört farklı seviyeden dört farklı değişken tanımladık. konsolaBasDaBirGörelim metodu da bu dört değişkeni konsola yazdırma görevini üstlendi. Görüldüğü üzere erişim seviyeleri farklı olsa da sınıfın içinden değişkenlere erişmede bir farklılık, sıkıntı yaşanmadı. Bu zaten işin doğasında olan bir durum çünkü erişim yetkilendirmesi sınıfın kendi için yaptığı bir iş değildir. Erişim niteliyecileri, bu sınıfın dışındaki sınıflardan bu sınıfa olan erişimi kısıtlar. Sınıf içi erişimi kısıtlama gibi bir durum söz konusu değildir.

 

Öyleyse yeni bir sınıf yaratalım ve bu sınıftan Temel sınıfına erişmeye çalışalım.

Dursun.png

Görüldüğü gibi dışarıdaki bir sınıf Temel sınıfının şahsi (private) malları hariç tüm malları erişebilmektedir. ŞahsiMal değişkenine erişmek istediğimizde derleyici hata vermektedir. Sizce de Temel’in korunaklı mallarına tüm sınıfların erişmesi doğal mı? Elbette doğal değil. Dursun, Temel ile aynı paketten bir sınıf olduğundan dolayı böyle bir geniş erişime sahiptir. Şimdi farklı bir pakette bir sınıf ile erişmeye çalışalım.

John

Temel ve Dursun sınıfları accessModifierTestA paketindelerdi. Yukarıdaki John sınıfını ise accessModifierTestB paketinde tanımladık. Görüldüğü üzere John, Temel’in sadece kamu yani public değişkenlerine erişebilmektedir. Dolayısıyla bir tablo yaparsak;

Tablo 1

Kalıtım (Inheritance)

Şimdi Temel sınıfıyla aynı pakette tanımlanmış bir altsınıfla (subclass) ile çalışalım.

UsakA 1

Görüldüğü üzere, aynı paketteki alt sınıf olan UşakA Temel’den kalıtımla aldığı öğelerden sadece şahsi (private) üyelere erişememektedir. Public, private ve default seviyelerine erişim serbesttir.

 

Şimdi aynı örneği accessModifierTestB paketinde tanımlayacağımız UşakB’nin Temel’in hangi üyelerine erişebileceğine bakalım.

UsakB 1

 

 

UşakB’e Temel’den devraldığı public ve protected üyelere erişimde sıkıntı yaşamamaktadır. Öte yandan default ve private erişim seviyelerine erişememektedir.

 

Dolayısıyla demin hazırladığımız tabloyu güncellersek;

Tablo 2

Dikkatli okuyucular hemen UşakA, UşakB örnekleriyle Dursun, John örnekleri arasında önemli bir farkı yakalamıştır. Dursun ve John örneklerinde Temel nesnesine yaratılıp dışarıdan erişim yapılmaktadır. Öte yandan UşakA ve UşakB ise Temel kalıtımla devraldıkları üyeleri erişmektedir. Elbette Dursun ve John, Temel’den türemediği için onlarda böyle bir kalıtım söz konusu değildir. Öte yandan, UşakA ve UşakB, aynı Dursun ve John gibi bir Temel nesnesi yaratıp herhangi bir nesneye erişir gibi Temel nesnesine erişebilir. Acaba bu durumda, erişim kısıtlamaları nasıl çalışmaktadır? Beraber bunun cevabını alalım.

UsakA 2

UşakA için görüldüğü üzere değişen bir durum yoktur. Hatırlayacak olursanız, Dursun’un erişim hakları da UşakA’nın erişim haklarıyla aynıydı. Dolayısıyla aynı paketteki sınıflar için değişen bir kural yoktur. İster temel bir sınfın alt sınıfı olsun, isterse başka bir sınıf, aynı paketteki tüm sınıfların public, protected ve default tüm üyelerine erişebilir.

UsakB 2

UşakB için ise değişen bir durum vardır. UşakB, Temel’den devraldığı korunaklı mallara (protected) erişebildiği halde, yarattığı başka bir Temel nesnesinin sadece kamu mallarına (public) erişebilmektedir. Hatırlatacak olursak, her sınıf gibi John sınıfı da sadece Temel’in kamu üyelerine erişebilmektedir. Dolayısıyla bu durum için UşakB ile John arasında bir faklılık bulunmamaktadır.

 

Sonuç

 

  1. Bir sınıfın private (şahsi) üyelerine sadece sınfın kendisi erişebilir.

  2. Aynı paketteki sınıflar birbirlerinin private (şahsi) üyeleri dışında tüm üyelerine erişebilir.

  3. Farklı paketteki bir sınıfın sadece public (kamu) üyelerine erişilebilir. Buna tek istisna, farklı paketteki bir sınıftan türeyen sınıflar içindir. Alt sınıflar, kalıtımla geçen protected (korunaklı) üyelere de erişebilir.

Tablo 3

* : Farklı pakette yaratılan alt sınıflar, temel sınıfın protected üyelerine erişebilirler.

 

 

 

Java Notları III - Enumlar

3012/2006

Enumerationı, Türkçesiyle numaralandırmayı, bir değişkenin alabileceği değerlerin kısıtlı olması durumunda kullanırız. Şu ana kadar öğrendiğim tüm C ve türevi dillerde enumlara yer verilmiştir. Enumlar kullanışlıdır, kodu gereksiz literal değerlerden kurtararak daha okunur kılarlar. Herşeyden önemlisi tip güvenliğini (type-safety) sağlarlar. Diğer bir deyişle sisteminizdeki değişkenin sizin belirdiğiniz kısıtlı kümeden değer aldığını garantilersiniz.

Enum için bu kadar laf yeter. Java 1.5 versiyonuna kadar enumlar mevcut değilmiş. Enumsız bir dilin nayısıl bu kadar popüler olabildiğini bir yana bırakırsak, 1.5′le gelen enumlar bir gelmiş pir gelmiş. Java enumları şu ana kadar hiç bir dilde karşılaşmadığım kadar yetenekli. Önce standart bir enum ile başlayalım.

KrediKartiEnum.png
Bu çok tipik enum tanımıyla kredi kartlarına özel bir liste hazırlamış olduk. Buraya kadar her şey aynı. Ama java’da dahası var..

KrediKartiEnum2.png

Böylelikle sadece enum sadece basit bir liste olmaktan çıkıyor. Her elemanın kendi ait özellikleri olan bir sınıf halini alıyor. Aslında burada görüldüğü enumların bir sınıftan pek farkı yok. Bir kaç ayrıntı dışında

  1. Enumlar’ın bir kurucusu olsa dahi bu kurucu enum dışından çağırılamaz.
  2. Enum değişkenleri diğer sınıf değişkenleri gibi new ile yaratılmaz. Basit tipler gibi direkt atama kullanılır. Esasında birinci kural bu kuralı da gerektiyor. Çünkü new demek kurucu çağırmak demek halbuki siz sadece enum kendi yarattığı nesneleri kullanabilirsiniz.
  3. vs…vs..vs..

Ubuntu 6.10

411/2006

Evet Fedora Core 5 (belki de 4′tü), Suse 10.1, Pardus 1.1 Alpha 3 kurduktan sonra taşınabilir bilgisayarım için en uygun linux dağıtımının ubuntu olduğuna karar verdim. Nedeni mi? Oldukça basit kablosuz ağ kartımı hiç bir konfigürasyona ihtiyaç duymadan tanıdı. Zaten eski versiyonlarının da takipçisi olduğum ubuntu, şeker mi şeker gnome pencere yöneticisiyle geliyor. Türkçe çevirilerinde eksiklikler mevcut. Umarım kısa süre içinde bu eksiklikler giderilir. Bir fırsatını bulur çevirilere benim de katkım olursa ne mutlu. Öte yandan gnome’u - kde’ye kıyasla - neden bu kadar sevdiğime gelince; gnome’un sadelik, kolay kullanılabilirlik ve fonksiyonalite bakımından müthiş bir denge oluşturduğunu düşünüyorum. Ayrıca sade ve basit olması ona çok ciddi performans kazancı da sağlıyor.

Ubuntu 6.10′un iso kalıbını cd’ye yazdırıp bilgisayarımızı bu cd’den açarsak bir öğle arası vermenin zamanı gelmiştir. Ne yazık ki bu açılış çift çekirdekli bilgisayarımda bile çok ciddi süre almaktadır. Bunun diğer bir sebebi sistemin açılışta cd’den çalıştırılmasıdır. Karşınıza gelen grafik ekrandan ubuntu’yu hiç kurmadan kullanmaya deneyimini yaşabiliyoruz. Elbette istediğimiz şey değil ve hemen masaüstünde Install linkine tıklıyoruz. Bir yandan ubuntu kurulsun, bir yandan firefox ile internette gezin. Şu ana kadar yaşadığım en keyifli işletim sistemi kurma deneyimi diyebilirim. Ubuntu kurma detayları çok girmeyeceğim çünkü bunu anlatan bir çok site var. Sistem kuruluyor ve ne yazık ki çok yavaş açılıyor. Bu noktada Pardus’umun kulaklarını çınlatmakta fayda var. Gerçekten Pardus 1.1 Alpha 3 çok hızlı açılıyor. Ubuntu bu konuda çok zayıf. Sistemi kurduktan sonra karşılaştığım tek sorun kablosuz ağ kartımın ayarlarını yapmak ve ATI ekran kartımı sisteme tanıtmakta yaşadım. Kablosuz ağ kartını elle ip vererek yapılandırdım. Bir şekilde DHCP çalışmadı henüz nedenini bilmiyorum. Ayrıca sistemi ilk kurduğunuzda kablosuz ağları bulup bunlara otomatik bağlanacak bir araç gelmiyor. Bununla ilgili birkaç paketi sonradan kurdum ama henüz denemedim. Öte yandan ATI Mobility Radeon X1400 ekran kartımı bu sayfadaki açıklamaları takip ederek kolayca tanıttım. Uzun süre boyunca bilgisayarımım sektörlerini işgal edecek bir dağıtım kurduğumu hissediyorum. Umarım hislerim beni yanıltmaz.

Acer ve NTI DVD Fit

1507/2006

Daha önce bu sayfadan Acer 5672 aldığımı duyurmuştum. Bu dizüstü ile beraber ücretsiz gelen NTI cd yazıcı programının süper hoşuma giden bir özelliği var, DVD FIT. Çift katmanlı orjinal DVD’lerin içinden istemediğiniz altyazı ve ses dosyalarını çıkarıp bir güzel görüntüyü de sıkıştırarak piyasada rahatlıkla bulunan 4.7 GB’lık DVD’lere yazmanızı sağlıyor. Şu anda Karşı Pencere’yi bir DVD’ye yazımı bitmek üzere. Gelişmelerden sizi haberdar edeceğim.

Aferin Acer, aferin NTI.

apropos hayat kurtarır!

1507/2006

apropos linux’unuzda yüklü man sayfaları içinde arama yapabilmenizi sağlayan komutun adıdır. Komutun adı aklınıza gelmediğinde hayat kurtarır.
Örnek kullanım :

> apropos bisküvi

kremini - adını unutulabilirsin ama tadını asla.

Yukarıda bahsi geçen komut Görkem Çetin’in Linux Doktoru adlı kitabından öğrenilmiştir. Bu kitabı bana veren Linux gönüllüsü Hüseyin Gömleksizoğlu’na teşekkür ederim.

Java Notları II

2606/2006

Assert

Java 1.4 ile gelen assert özelliği oldukça güzel tasarlanmış. C#’ın aksine assert dil içinde bir anahtar olarak tasarlanmış. Kullanımı sıradan

assert booleanExpression;
assert booleanExpression : errorMessage;

Java assertlerinin en güzel yanı package bazında enable disable edilebilmesidir. Zaten varsayılan olarak kapalı geliyor. Assert’leri devreye almak için JVM’e -ea ve -enableassertions paratmetresi geçmeniz gerekiyor. Ayrıca -da veya -disableassertions ile istediğiniz paketler için assert’leri kapatabilirsiniz. Sistem assertlerini açmak için -esa kullanmanız gerekiyor. Paket adı vermek için -ea:tr.com.sesam.turkuaz şeklinde kullanmanız gerekiyor.

Daha detaylı bilgi için Using Assertions in Java ve Programming with Assertions.

Diğer Ufak Konular

  • Daha önce bildiğim kadarıyla her .java dosyası bir java sınıfına denk gelirdi. Bunun daha doğrusu her .java dosyası public bir sınıfa denk gelir. Yani ben bir dosya içinde birden fazla sınıf yaratabilirim ama bunlardan en fazla biri public olacak. sf. 364
  • Java da bildiğiniz üzere C#’daki gibi property desteği yoktur. Propertyler set ve get metodları ile çözülür. Java jargonunda set metodlarına mutator methods, get metodlarına accessor veya query methods denmekteymiş. sf.372
  • Gene jargon ile ilgili bir konu. Örneğin isEmpty gibi boolean dönen bir metodunuz var. Bu tür metodlara predicate methods deniyor. sf.373
  • Java’da destructor metodunun adı finalize ve protected oluyor. Doğal olarak finalize paratmere alamıyor. sf.380
  • Java’da static import diye bir özellik var. Bu özelliği kullanarak bir sınıfın statik üyelerini (metod veya değişken) tek tek ya da topluca ithal edebiliyorsunuz. Bunun faydası bu tür metodlar veya değişkenlerin sınıf adını kullanmadan direk kullanamabilmeniz. sf. 385
  • Sınıftaki değişkenlerinizi final diye markalarsanız bütün constructorlarda atamalısınız ve bir daha da değiştiremezsiniz. sf. 386
  • Java’dan ilginç ve bence kötü ifade edilen bir özelliği var package access. Yani bir sınıf üyeniz var ne private, ne public ne de protected. Bu üye java’nın sihirli elleriye birden package niteliği kazanıyor ve sadece paket içindeki sınıflardan erişilebiliyor. C#’daki internal’a karşılık geliyor hatırladığım kadarıyla. Bu bence oldukça kötü üretilmiş bir özellik. Nedenini yazmaya vaktim yok.. :(

Not : Sayfa numaraları Deitel, Java : How To Program, 6th edition kitabının sayfa numaralarıdır.

Java Notları I

2406/2006

Uzun süredir boşladığım blog’uma teknik bir yazı ile hız verelim diye düşündüm. Kendi teknik geçmişinden bahsetmek gerekirse .net ile beta 1′den bu yana haşır neşirim. Java ile ara sıra ilgilenmiştim. RMI ile bir kaç ufak uygulama yazmıştım ama ne IDE ile bir şeyler yaptım ne de bir kitap okudum. Turkuaz Framework’ün J2EE taşınma çalışmalarıyla beraber son gaz Java öğrenmekteyiz.

Java ile ilgili detaylara geçmeden dil hakkında aldığım izlenimi anlatayayım. Öncelikle Java’nın çıkışına bakacak olursak C++’ın eksikliklerini, bozukluklarını kapatmayı hedefleyen, en küçük elektronik cihazdan bilgisayarlara her kadar her türlü cihazda çalışabilecek bir dil hedefleniyor. C++’ın en büyük sorunu ne : bellek yönetimi, çözüm garbage collector. Ama hedef tek başına bu değil bir devrim yapmak. Dolayısıyla anladığım kadarıyla Java’yı ilk tasarlayanlar bunun minimal bir dil olması çok özen göstermişler. Örneğin structure yok, programcının tanımladığı bütün tipler object olmak zorunda, enumeration J2SE 5.0 ile geldi, switch’ler string ile çalışmıyor, hatta switch’ler longlarla bile çalışmıyor. Devam, operator overloading yok, variable-argument list gene J2SE 5.0 ile geldi. Ayrıca Java multiple inheritance’ı desteklemiyor; bence çok da iyi yapıyor. Yani minimal bir dil, öğrenmesi daha kolay bir dildir demiş olabilirler. C++’a hakim olmak yıllar alıyor.

Her neyse geçelim detaylara.

Aşağıdaki java kodları J2EE 1.4‘de derlenmiştir.

Dizi Tanımlamaları

java1.JPG

Yukarıdaki koddan anlaşılacağı üzere a, c, d birer dizi, b ise standart bir tam sayı olmaktadır. Dikkat edileceği üzere counter değişkeni for bloğu dışında geçerli değildir. Buradan şöyle bir soru türetebiliriz, for’dan önce counter diye bir değişken tanımlasaydık ne olacaktı? Java buna izin vermiyor ve eclipse hemen duplicate local variable hatası veriyor. Fakat counter metod dışında tanımlı bir sınıf alanı veya statik bir değişken olsaydı.

java2.JPG

Şimdilik bu kadar. Umarım devamını getireceğim.