Ubuntu 10.04 ve Pencere Düğme Konumları

Uzun bir süredir Linux işletim sistemi, Linux dağıtımı olarak da Ubuntu kullanıyorum.

Ubuntu bilindiği gibi, 6 ayda bir yeni bir sürüm çıkarıyor. Ubuntu’nun son sürümü geçtiğimiz ay sonunda yayınlanan Lucid Lynx kod adlı 10.04 sürümü. An itibarı ile dizüstü bilgisayarımı Ubuntu’nun bu sürümüne yükselttim fakat, daha yeni sürümü inceleyemeden karşıma sinir bozucu, hatta neden böyle yapıldığını bile anlayamadığım bir değişiklik çıktı. Pencere düğmeleri (Window Buttons) yıllardır kullandığımız yerinde değil de sol tarafa alınmış.

Ubuntu’yu geliştiren ekibin neden böyle bir karar aldığını anlamış değilim. Uzun süredir bilgisayar kullanan birçok kişi için, bu düğmelerin sağ tarafta bulunması artık klasikleşmiş. İnsanlar, herhangi bir uygulamayı ya da dökümanı kapatmak ya da küçültmek istediklerinde refleks olarak fareyi o tarafa yöneltiyorlar. Üstelik bu özellik, Windows gibi diğer işletim sistemlerinden Ubuntu’ya geçenler için büyük bir kullanım alışkanlığı bana göre.

Neyse, şimdi bu düğmeleri tekrar sağ tarafa almak için yapmamız gerekenleri açıklamak gerekirse.

Devam »

Java Swing Temelleri

Swing, Java Foundation Classes içerisinde bulunan ve Java uygulamalarına grafiksel arayüz (GUI) kazandırmak için Sun tarafından geliştirilmiş devasa büyüklükte bir kütüphanedir. Swing kullanılarak geliştirdiğimiz Java uygulamalarına, her türlü ihtiyaç için tasarlanmış bileşenleri doğrudan kullanarak grafiksel arayüz (GUI) kazandırabiliyoruz.

Java’nın grafiksel arayüz ihtiyaçlarını karşılayan ilk bileşen seti AWT (Abstract Window Toolkit), bazı yetersizliklerinden dolayı kullanımı terkedilmiş ve Swing geliştirilmiştir.Aslında Swing, baştan tasarlanan bir kütüphane de değildir, tamamen AWT bileşen seti üzerinde geliştirilerek, AWT nin pekçok bileşenini ve kütüphanelerini de kullanır. Mesela GUI programlarının en büyük özelliği olan olaylar, tamamen AWT nin olay yönetme mekanizmasını kullanır.

Devam »

Java I/O Temelleri

Bilgisayar programları basitçe şu şekilde çalışır. Programa bir input (girdi) verirsiniz, program o inputu, içeriğinde tanımlanan algoritmalar doğrultusunda işler ve size bir output (çıktı) verir. Yazılımlardaki asıl amaç budur.

Java platformu, bu temel üzerinde çok gelişmiş bir Input/Output (I/O) sistemi geliştirmiştir. Java ile geliştirdiğiniz yazılımlar, Java platformunun sunduğu devasa büyüklükte ve gelişmişlikte tasarlanan I/O kütüphaneleri ile her türlü girdi-çıktı işlemleri çok basit bir şekilde halledilebiliyor.

Temel I/O ile alakalı tüm sınıflar Java platformunda,  java.io paketinde toplanmıştır. Bu paket içerisinde, temel input-output kaynaklarındaki her türlü işlemleri halleden birçok sınıf tanımlanmıştır ve Java geliştiricilerinin kullanımına sunulmuştur.

Java platformunun geliştirilmesi ile java.io paketinin yerini java.nio paketi almaktadır. NIO2 adı verilen bu yeni I/O mekanizması JDK 7  ile paralel olarak geliştirilmektedir.

Devam »

Javada Diziler (Arrays)

Diziler (Arrays), yazılım geliştirme süreçlerinde, geliştiricilerin işlemlerini daha kolay ve verileri daha yönetebilir bir forma sokmak için sıkça kullandığı çok önemli ve temel bir programlama kavramıdır.

Dizilerin tasarlanış amaçları gayet basittir. Diziler basitçe, aynı tipe sahip bir dizi elemanı, tek bir noktada gruplayarak bu verilere daha kolay bir şekilde ulaşılmasını sağlayarak, yazılım geliştirme sürecini daha basit ve yönetilebilir bir hale sokar.

Java’da bu tip işlemler için çok gelişmiş bir dizi (array) mekanizması sunar. Daha önce C/C++ kullanmış yazılımcılar, Java’daki dizileri incelerken dikkat etmesi gerekiyor. Çünkü Java’da diziler, C/C++ dillerindeki dizilerden çok farklı bir yapı üzerine inşa edilmiştir. Java’da diziler nesnedir. Bu yüzden Java’daki diziler diğer dillerde kullanılan dizilerden farklıdır ve çok güçlüdür.

Devam »

Javada Sayılar ve Number Sınıfı

Java programlama dili nesne yönelimli programlama paradigması üzerine tasarlanmıştır ve Java’da her şey nesnedir. Java’da yazılım geliştirime kabaca, nesneler arası iletişim temeline dayanır.

Ancak Java, sık kullanılan ve üzerinde sık işlem yapılan int, byte, char, long, double gibi tipleri bir istisna olarak nesne olarak değil de primitive (ilkel) tipler olarak ele alır. Bunun nedeni basittir. Bu tür tipler herhangi bir program içinde pekçok yerde sık sık kullanıldığı için Java, performansı arttırmak için bu tipleri nesne olarak ele almaz. Bu yüzden bu tipleri program içinde doğrudan oluşturabilir ve kullanmaya başlayabiliyoruz.

Ancak Java, bu tür primitive tipler için her tipe özel bir  sarmalayıcı sınıf da (wrapper class) programcıların kullanımına sunar. Bu sınıflar her primitive tip için Java dilinde, Integer, Double, Float, Byte, Short ve Long isminde tanımlanmıştır. Ayrıca tüm bu primitive tipler için geliştirilen sarmalayıcı sınıflar, Number adındaki bir sınıfdan türetilmiştir. Bu yüzden nesne yönelimli programlamanın 2 önemli prensibi olan polymorphism ( çok şekillilik) ve inheritance (kalıtım) ile bu sınıflar belirli bir standarta kavuşturulmuş, Number sınıfında tanımlanan pekçok method sarmalayıcı sınıflar tarafından da kullanılabilmektedir.

Devam »

Javada Karar Mekanizmaları – if ve switch komutları

Karar mekanizmaları, programlamada çok önemli ve en temel işlemlerden biridir. Her programlama dili bir yada daha fazla komutla, karar mekanizmasını destekleyerek programcıların hizmetine sunar.

Karar mekanizmaları basitçe, verilen bir ifadenin değerine göre programın hangi kodları çalıştırılacağını belirleyen önemli bir programlama yapısıdır. Java programlama dili de, karar mekanizmalarını sağlamak için “if-then-else” ve “switch” komutlarını programcıların kullanımına sunmuştur.

Devam »

Javada Döngüler (Loops)

Programlama dilleri ile uygulama geliştirirken, en çok kullandığımız işlemlerden biri, tekrarlanan operasyonları bilgisayarlara hızlı bir şekilde yaptırmaktır. Bu yüzden döngüler programlama konusunda çok önemli ve temel işlemlerden biridir.

Döngüler (Loops), hemen hemen her uygulamada ihtiyaç duyulur. Java’da bu tür döngü işlemlerini yapabilmek için birtakım komutlar sağlar. Bunlar while, do-while ve for döngü komutları olarak programcıların kullanımına sunulmuştur.

Döngü kullanımındaki amaç oldukça basittir. Verilen bir koşul, geçerliliğini sürdürdüğü sürece, döngü (loop) bloğu içerisindeki komutlar tekrar tekrar işleme alınır.

Devam »

Javada Paketler (Packages)

Java, uygulama geliştirirken oluşturulan ve kullanılan kaynak dosyalarını, işletim sisteminin dosya sistemini kullanan akıllı bir mekanizma ile kontrol eder.

Java’ya yeni başlayan pekçok kimse için paket sistemi biraz kafa karıştırıcı olabilir. Eğer Java’da yeni iseniz ve paketler ile ilgili kafanız biraz karışıksa paniğe gerek yok. Java’da paketler, benzer işlevselliğe sahip sınıf (class) ve interfacelerin aynı klasörde tutulmasından başka birşey değildir. Basit ama etkili bir isim uzayı (namespace) yapısıdır. Nasıl ki bir web projesinde, resimleri “resimler” adında bir klasörde, javascript dosyalarını “javascript” adında başka bir klasörde tutuyorsak, Java’da da durum bundan farklı değildir.

Devam »

Programlama Dilleri ve Type Systems – Type Checking

Geçtiğimiz 15 (özellikle son 10 yıl) yıllık süre içerisinde, birçok programlama dili geliştirildi. Yazılım dünyasından kimileri, bu dönemi “Programlama Dilleri Çağı” olarak tanımlıyor. Bir nebze haklıklarda, çünkü inanılmaz sayıda programlama dili tasarlanıp yeni özellikler ekleniyor.

Teknoloji de diğer tarafdan baş döndürücü bir hızda ilerliyor ve günümüz ihtiyaçları sürekli değişiyor. Bunun yansımaları, elbet yazılım sektöründe de çokça görülmeye başlandı. Bu yüzden, yazılım geliştirme süreçleri ve özellikle kullanılan ortamlar dinamik bir yapıya dönüştü. Artık projeler, kimi zaman bir platformda, kimi zaman başka bir platformda ilerliyor. Kullanılan araçlarda, ihtiyaçlar doğrultusunda değişkenlik göstermeye başladı kuşkusuz.

Yazılım geliştirme süreçlerinde kullanılan araçlardan birisi de programlama dilleri. Her yazılım geliştiricisi, her programlama dilini doğal olarak bilemeyeceği için, projelerde kullanılan değişik dillere adaptasyon biraz sancılı oluyor. Programlama dilleri açısından olaya bakarsak amaç hiç bir zaman değişmez, bilgisayarlara derdimizi anlatabilmek. Tek farklılık gösteren nokta, bu amacı gerçekleştirebilmek için izlenen yollar kulanılan methodlar. Bu yüzden, programlama dilleri, bazı noktalarda birbirlerinden ayrışırlar. Bu konulardan birisi de “Type Systems (Tip Sistemleri)”. Geliştiriciler programlama dillerinin kullandığı farklı özellikler ve methodlar hakkında bilgi sahibi olurlar ise, bir dilden diğerine geçiş çok daha kolay bir şekilde yapılabilir.

Yeni bir programlama dilini incelemeye başladığımızda, hemen karşımıza type konularında birtakım bilgiler verilir. Örneğin Java static type checking yapan veya Python dynamic type checking yapan bir dildir şeklinde bir açıklamayla karşılaşırız. Bunlar bazı programcılar tarafından önemsenmese de aslında dili öğrenme aşamasında oldukça önemlidir. Dilin mantığını kavrama da bize oldukça fayda sağlarlar.
Devam »

Tasarım Şablonları – Design Patterns

Yazılım geliştirme, kesinlikle basit bir iş değildir.

Günümüzde (özellikle ülkemizde), birkaç programlama dilinin sözdizimini (syntax) öğrenen birçok kimse paldır küldür uygulama geliştirmeye çalışıyor (Amacım mektepli-alaylı çatışmasını alevlendirmek kesinlikle değil, konu da zaten bununla alakalı değil). Küçük bir uygulama geliştiriliyor ise pek bir problem yaşanmayacağı muhakkak. Ancak, onbinlerce ve daha fazla satır koddan oluşan orta ölçekli yazılımların, gereksinimler belirlenmeden, analiz ve planlama yapılmadan geliştirilmeye başlanması gereksiz işlerden arındırılmamış, bakım ve güncelleme süreçleri programcılar için bir kabus haline gelen ve uygulamayı geliştiren yazılım ekibinin birbirileri ile olan iletişiminin kopmasına yol açan projelere dönüşmesi kaçınılmazdır. Üstelik bir süre sonra yazılımınıza yeni özellikler eklemeye kalkıştığınızda ortaya çıkabilecek sorunlar zaman kaybı yanında maliyeti de etkilemektedir. “Spaghetti code (arapsaçı kod)” adı verilen kodlama tekniği(!) buna en güzel örnektir Devam »