26 Aralık 2014 Cuma

Stack - Yığıt - Yığın

          Stack sınıfı nesnelerin LIFO (last-input-first-output) yapısıyla depolanmasını sağlayan bir veri tipidir. Yani nesnelerinizin üst üste depolandığını varsayarsanız ilk nesneniz altta , eklediğiniz yeni nesneler onun üstüne şeklinde devam eden bir yapısı vardır . Örnek vermek gerekirse android telefonlarda açılan uygulamalar yığın yapısıyla depolanır . Açık kalan uygulamalarınız geri tuşuna bastıkça yığının en üstündeki yani kullandığınız bir önceki uygulamaya geçerek devam eder .

           Stack sınıf içinde 5 tane method bulunmaktadır .


  • E peek() : Yığının en üstündeki nesneyi gönderir . 

  • E pop() : Yığının en üstündeki nesneyi gönderir . Peek den farkı burada öğe silinir , peek de silinmez göstermek amaçlı kullanılır .

  • E push(E item) : Gelen nesneyi yığının en üstüne koyar . 

  • int search(Object o) : Verilen nesnenin yığında kaçıncı sırada olduğunu söyler . Saymaya son girenden başlar . Değer yoksa -1 gönderir .

  • boolean empty() : Yığının boş olup olmadığını kontrol eder. 

Aşağıda daha açıklayıcı olması açısından basit bir örnek yapılmıştır .

import java.util.Stack;


public class Driver {

 public static void main(String[] args) {
  
  // stack sınıfından instance alındı
  Stack stack = new Stack<>();
  
  // initialize methodu çağrıldı ve push methoduyla yığın dolduruldu 
  initialize(stack);
  
  // peek = en üstteki nesneyi bul
  stack.peek();
  String peek = stack.peek();
  System.out.print("\n En Tepede "+peek);
  printStack(stack);
  
  
  stack.pop();
  printStack(stack);
  
  // search = nesnenin sırasını bul
  System.out.println(stack.search("D"));
  System.out.println(stack.search("L"));
  
  
 }

 public static void initialize(Stack stack) {
  //push = yığına nesne ekle
  stack.push("A");
  printStack(stack);
  stack.push("B");
  printStack(stack);
  stack.push("C");
  printStack(stack);
  stack.push("D");
  printStack(stack);
  stack.push("E");
  printStack(stack);
 }

 private static void printStack(Stack stack) {
  // isEmpty = yığın boş mu kontrol et
  if(!stack.isEmpty())
   System.out.printf("\n%s ",stack);
  
   
 }
 
 
}
[A] 
[A, B] 
[A, B, C] 
[A, B, C, D] 
[A, B, C, D, E] 
 En Tepede E
[A, B, C, D, E] 
[A, B, C, D] 
1
-1

12 Aralık 2014 Cuma

Final Anahtarı Kelimesi



          Birçok yazılımcının göz ardı ettiği veya gereksiz gördüğü final anahtar kelimesi ; daha dayanıklı , daha performanslı kodlar yazmada çok büyük katkısı olan bir terimdir .Genel tanımıyla methodlarınız veya değerleriniz sabit kalması değiştirilmemesi için kullanılan bir anahtardır diyebiliriz . Kullanımını tamamen yazılımcıya bağlıdır ve 4 farklı yapı için kullanılabilir .


  1. Final Sınıf
  2. Final Method
  3. Final Sınıf Değişkeni
  4. Final Method Değişkeni




1. Final Sınıf

        Eğer yazdığınız sınıfınızı başka bir sınıf tarafından kalıtılmasını istemiyorsanız sınıfınız başına final kelimesini eklemeniz yeterli . Aşağıda final class extend edilmeye çalışılmış ve hata alınmıştır .



2. Final Method

             Eğer yazdığınız methodun başka classlar tarafından kalıtılmasını istemiyorsanız methodun başına final kelimesi ekleyebilirsiniz . Bir nevi burada abstract kelimesinin tersi olarak çalışıyor diyebiliriz . -abstract methodlar alt classlarda kalıtılması zorunludur - . Aşağıda final method override edilmeye çalışılmış ve sonucunda hata alınmıştır.





3. Final Sınıf Değişkeni

          Final sınıf değişkenleri genellikle yazılan sınıf içinde hiç değişmemesi gereken "pisayısı , e sayısı" gibi değişkenler için kullanılır . Sonrasında herhangi bir artırım işlemi veya değiştirilme olmaması garantilenir . Aşağıda final bir değer artırılmaya çalışılmış ve hata alınmıştır .


4. Final Method Değişkeni

          Final method değişkeni ise methoda gönderilen değerin method içinde değiştirilmemesi garantisi verir . Aşağıda final method değişkeni değiştirilmeye çalışılmış ve sonucunda hata alınmıştır.




          Kısaca final anahtar kelimesi herhangi bir kullanım zorunluluğu olmayan fakat kullanıldığı zaman kodun çakılmasını engelleyebilecek hamleler yaptırabilen bir jokerdir .

21 Temmuz 2014 Pazartesi

Collecitons

          Javada koleksiyonlar birden fazla nesneyi bir arada tutmaya yarayan yapılardır . Nesne ekleme , silme gibi özelliklerin yanında sıralama , arama gibi işlemleri de yapabilmektedir yani kod yazan kişiyi bu yükten kurtarmış olurlar . 2 ana infterface altında toplanırlar "Map" ve "Collection" .

Collection


Map


          Peki bu kadar çok collection yapısı içinden hangisini kullanmalıyım ?


19 Temmuz 2014 Cumartesi

İf-Else & Switch-Case

          İf-else ve switch-case programlamlama dillerinin çoğunda kullanılan akış kontrol yapılarıdır . Aralarında çok keskin bir ayrım olmamasına rağmen kodun okunaklığı veya performans açısından kullanıldıkları yerler farklılık gösterebilir .

          Kodunuzda belirli aralıklardaki bir değere göre sonuç üretecekseniz veya kod daha okunaklı olsun diyorsanız if-else deyimini kullanabilirsiniz . Fakat elinizde 5 tane veya daha fazla  koşul varsa ve daha performanslı olsun istiyorsanız switch deyimini seçmeniz daha uygun . Bunun nedeni if-else deyimi yukarıdan aşağı tüm koşullara tek tek bakılır ve gerekiyorsa o adımda bir işlem yapar . Switch deyimi ise koşul ifadesinden sonra direk işlem yapacağı yere atlar .

Örnek


if-else deyimi tüm koşullara tek tek girer ve toplamda 6 adım sürer .


switch deyimi ise direk gerekli noktaya atladığı için toplamda 3 adım sürer .

10 Temmuz 2014 Perşembe

Adapter Desgin Pattern

           Adapter dizayn pattern en basit anlamıyla bir classı sizin kullanımınıza uygun bir class haline getirmek için kullanılan tasarım kalıbıdır . Örneğin kendiniz bir interface yazdınız ve içinde 10 tane method var . Bir başka classta bu interface in sadece 2 methodunu kullanmanız gerekiyor . İşte adapter pattern tam bu sırada imdadınıza yetişiyor  . Tek yapmanız gereken interface i bu adapter class ının içinde implement etmek ve kendi class ınızdan bu adapter classını çağırmak .

          Aşağıdaki örnekte çok basit bir buton işlemi yapılmak istenmiştir . Sadece butona tıklandığında ekrana "Tıklandı" yazısı bastırılmakta . Fakat görüldüğü üzere MouseListener interface i ile birlikte gelen 4 tane fazladan method var . Bu başka interfacelerde daha çok olabiliyor .


          Buradaki fazladan methodları kullanmamak için bu interface i dönüştürecek bir class tanımlıyoruz ve interface in methodlarını buraya ekliyoruz .




             Son olarak kendi yazdığımız adapter class ını çağırıyoruz ve sadece kullanacağımız methodu ekliyoruz .




          Görüldüğü gibi adapter pattern kullanılmadan da bu işlem yapılabilir ama daha sonra kodu okuyacak kişi için veya daha göze hoş kod yazmak istiyorsanız adapter pattern i kullanabilirsiniz .

4 Şubat 2014 Salı

Veritabanı Kısıtlamaları


            İlişkisel veritabanlarında bütünlük en önemli özelliklerden biridir . Daha basit olarak , girilen veriler doğru ve tutarlı olmalıdır yani girilen bir verinin tekrar girilmemesi , olmayan verilerin girilmeye çalışılması gibi . Bunu bir takım kısıtlamalarla yapabiliriz .



             Primary Key (Birincil Anahtar) : Primary key tabloların olmazsa olmazından biridir . Eğer tablonuz ilişkisel veritabanı tablosu ise %99 bir alanı primary key seçmek zorundasınız . Tc kimlik no , banka hesap no , sicil no , okul no  gibi  tek bir kişiye özel alanların tekrar etmemesi için primary key seçilmesi zorunludur . Primary key seçilen alan boş geçilemez , tekrarlanamaz , büyük bir olasılıkla değiştirilemez ve boş geçilemez . Genellikle bu alan veri girilmesi yerine otomatik oluşturulan alanlardır. "Oracle da sequence , sql server da identity ile yapılabilmektedir ."


           Unique Key (Tekil Anahtar) : Unique key bir tabloda tekrar etmemesi gereken başka bir alan daha varsa - primary key gibi :) - kullanılan kısıtlamadır . Primary key ile Unique key arasındaki fark ise unique key'in null geçilebilebilir olmasıdır .



            Composit Key (Birleşik Anahtar): Aslında pek karşılaşılmayan composit key iki veya daha fazla kolonun birleşip primary key gibi kullanılmasıdır . " Örneğin bir veritabanına bir öğrenci adı eklendiğinde aynısında binlerce olabilir ama okul_adı ve sınıf_adı kolonlarını key olarak işaretlerseniz veri tekrarını engellemiş olursunuz ayrıca ogrenci_id için alan açmamış kullanılan alandan kazanmış olursunuz ama ne kadar sağlıklıdır tartışılır :) ".



           Foreign Key (Referans Anahtar) : Foreign key iki tabloyu ilişkilendirmek için kullanılan anahtardır . Bir tablonun primary key i ile diğer bir tablonun kolonu ilişkilendirilir . Normalizasyonda amaç birkaç alan birbirine bağlı ve sürekli tekrar ediyorsa onu başka bir tabloya taşımak gerekir . İşte bu taşınan tablo tek bir foreign key ile taşındığı yere bağlanabilir . Anlatılması ve anlaması yeterince zor olan bu foreign key'i bir örnek açıklamak gerekirse ...


Hastaneler Tablosu



Burada dikkat ettiyseniz bölge ad , bölge  müdürü , bölge  müdür yardımcısı , bölge  aciklamasi ve bolge no kolonları sürekli tekrar ediyor . Şimdi gelin bu tekrarı engellemek için tabloyu hastane ve bolgeler olmak üzere iki tabloya bölelim


Hastane Tablosu



Bolge Tablosu



           Şimdi bir de en üstteki Hastaneler tablosunun binlerce satırdan oluştuğunun hayal edin . Gereksiz yere aynı değerler tekrar tekrar girilecek  storage  , zaman , maliyet hepsinden zarar . Kesinlikle bu tablo ikiye bölünmeli . İşte foreign key de tam bu sırada imdadımıza yetişiyor . Bu bölünme sonucu ortaya çıkan hastane tablosu ile bolge tablosunu birbirine bağlayan bolge_id  bir foreign key dir . Aynı zamanda bolge tablosundaki bolge_id bir primary key dir.


Foreign Key   : Hastane tablosu ile Bolge tablosunu birbirine bağlayan bölge_id bir foreign keydir . Hastane tablosuna olmayan bir bolgeyi girmenizi engeller .

Primary Key : Bölge tablosundaki Bölge_id ve Hastane tablosundaki Hastane_id primary key olmalıdır çünkü sadece tek bir hastaneyi ve tek bir bölgeyi işaret etmelidir .

Unique Key : Bolge_no adlı kolon bir unique keydir . Çünkü her ilin tek bir plaka numarası vardır fakat burda girmesenizde bir sıkıntı çıkarmaz .

Composit Key : Burada Bölge_ad ve Hastane_ad  key olarak işaretlenip  primary key olarak kullanılabilir fakat bir primary key koymaya üşenmek başınıza bir sürü dert açabilir bu yüzden bunu pek tavsiye etmiyorum :)

30 Ocak 2014 Perşembe

Tomcat Server Açılış Hatası


           Eclipse tomcat server ı başlattığınızda karşınıza 'çıkan bu ekranın tek bir nedeni var o da 8080 portunun zaten kullanıyolar olması .


          Yapmanız gereken oldukça basit . Aşağıdaki ekranda kırmızı dikdörtgen içine alınan "Tomcat v.0 Server at localhost" a çift tıklayıp , açılan ekranı sola doğru genişletin ta ki mavi dikdörtgen içine alınan port numaralarını görene kadar .



        Ardından aşağıdaki ekranda gördüğünüz gibi 8080 olan port numarası değiştirin ve sorununuz çözülecektir . (Genelde 8081 verilmiş :))


                                                       Kolay gelsin...

28 Ocak 2014 Salı

Eclipse Açılış Hatası


           Eclipse' in açılışında yine muhtemelen birçoğunuz karşısına çıkmış olan bir hatanının çözümün bahsedeceğim .



Çözümü oldukça basit lakin internette birçok farklı yöntem var , ben de hatayı aldığım zaman bayağı araştırmak birçok yöntemi denemek zorunda kalmıştım ama çoğu gereksiz ve sonuç vermeyen yöntemler sinsilesi :)) . Tek yapmanız gereken yüklü olan , yüklü değilse de yükleyeceğiniz  (http://www.oracle.com/technetwork/java/javaee/downloads/java-ee-sdk-6u3-jdk-7u1-downloads-523391.html)  jdk veya jre nin bin dosyasındaki "javaw.exe" yi alıp çalıştırdığınız eclipse klasörünün içine atmak .


"javaw.exe" muhtemelen "program files -> java -> jdk -> bin " veya" program files -> java -> jre -> bin " nin içindedir . Kopyalayın ve kullandığınız ide klasörün içine yapıştırın .



 Kolay gelsin ...

27 Ocak 2014 Pazartesi

Oracle Database 11g xe Installer




           Oracle database 11g xe yüklerken aldığım , muhtemelen birçoğunuzda aldığı bir hatanın çözümünden bahsedicem . Yükleme sırasında bir sorun çıkarmayan ama daha sonra veri tabanına bağlanmak istediğinizde  "listener refused the connection with the following error ora-12505" gibi hatalar çıkaran bu sorunun çözümünü anlatacağım .



             İlk olarak kurulum esnasından yukardaki ekranı gördüğünüzde bu penceyi kapatmadan start (Başlangıç) ekranına "regedit" yazıp aşağıda çıkan uygulamayı açmalısınız .



           Bu ekranda " HKEY_CLASSES_ROOT\Installer\Products\266B7A503A089BE4EAD1986A429434C1\SourceList\Media "adresine    gitmelisiniz . Sağ taraftaki ekranda aşağıdaki değerler görünüyor olacak .



    Gördüğünüz bu ekranda "1" adında bir kolon var , üzerine çift tıkladığınızda aşağıdaki ekran açılacak "Değer verisi"  label inin altında "Disk1;1" değerini silin ve
"C:\Users\hostname\AppData\Local\Temp\{Bu Alana En Üstteki Error Penceresinde Çıkan Sayı ve Karakterleri Yazın}\"     'Tamam' ı tıklayın .



          Ardından en üstte çıkan hata ekranına "OK" diyerek devam edin . Tıkladığınızda tekrar aynı hata mesajı gelecektir o önemli değil devam edin :) Eğer başka bir probleminiz daha yoksa kurulumla alakalı sorununuz çözülecektir .

                                                      Kolay Gelsin ....