25 Aralık 2014 Perşembe

Binary Search Tree



Yine bir ödev ve yine bir son gün sıkışması yaşadım. Bu sefer ikili arama ağacı uygulaması yapılması istendi. Kodlara GitHub üzerinden ulaşabilirsiniz: Binary Search Tree

// In this homework we are asked to implement Binary Search Tree, it is easy to implement, just delete method is tricky. You can reach the codes via GitHub: Binary Search Tree

20 Aralık 2014 Cumartesi

Expression Evaluator



Bu ödevde gelen infix bir string ifadeyi postfix gösterimine çevirme, postfix notasyonunun değerini bulma, postfix notasyonunu ağaç yapısına çevirme ve ağaç yapısını dolaşarak postfix notasyonunun değerini bulmayı yapmamız istendi. Kodlara github üzerinden ulaşabilirsiniz: ExpressionEvaluator

//In this homework, we are asked to convert infix notation to postfix notation, also we have to evaluate and put it into tree structure. Finally traverse tree by postorder traversal. You can reach the code via github : ExpressionEvaluator






6 Kasım 2014 Perşembe

Big O Notasyonu



  Kısaca sınav öncesi bir tekrar adına yazayım dedim.

Şimdi şöyle bir metodumuzun olduğunu düşünelim;

 public void deneme(int x, int y) {

  x = 6;
  y = 4;
 }

burada her işlem birer kez yapılıyor. İki değişkeni de bir değere atamak her biri için birer atamadır. Bundan dolayı buna O(1) diyoruz.

Eğer şöyle bir metod olsaydı;


 
 public void deneme2(int x, int y, int[] dizi) {

  x = 6;
  y = 4;

  for (int i = 0; i < dizi.length; i++) {
   System.out.println(dizi[i]);
  }

 } 
burada ise metodumuzdaki println metodu dizi boyutuna kadar (bilmediğimiz için n diyelim) çalışacaktı. Buna da O(n) diyoruz.

Kısacası bir kod parçasının (metod vs.) tekrarları yoksa O(1) varsa metodun kaç kere yapılacağını belirleyen değer(x)   O(x) olur. Tabii burada hep en kötü durumdan bahsediyoruz.

Bir tane de logn'li duruma örnek verelim. Mesela binary search, her defasında diziyi ikiye bölüyoruz. Mesela dizinin boyutu N olsun.
Birinci defada N/2
İkinci defada   N/4
Üçüncü defada N/8 .... en sonunda  N/N e kadar gidecek. (Aslında aradığımız eleman dizinin ortasında olup  metodun ilk çalışmasında sayıyı bulabiliriz ama burada en kötü durum notasyonundan (Big O) bahsettiğimiz için işlemleri sonunda kadar yapmamız lazım.)

Gördüğümüz gibi bölümler hep 2'nin kuvvetleri.  O zaman N/N  de  alttaki N'in  2^k gibi bir değere eşit olması lazım.

2^k = N  ifadesinden   k yı çekersem  log 2 tabanında N olur. Yani  bu metod logN kez dönecek diyebiliriz.  O zaman Big O notasyonu da O(logn) olur.

Time Complexity'nin Big-O Gösterimi
Burada hiç formüllere girmeden basit halini anlatacağım.
T(n) 'li denklemden Big-O bulmak için ise  denklemdeki en yüksek dereceli terim alınır.

Örneğin T(n) = 4n^2 + 2n + 7 şeklinde bir denklemimiz olsun. Burada en yüksek dereceli terim n^2 dir. O zaman bu denklemin Big-O 'su  O(n^2) dir.

10 Ekim 2014 Cuma

Veri Yapıları Ve Algoritmalar-Ödev1

   Bayramdan önce gelen bu ödev derse ısınmak için ufak başlangıçtı. Genel itibariyle temel java programlamaya dayanan ödevin çözümünü paylaşmak istedim.

// Use JDK 1.7 or after
import java.util.Scanner;

public class Bag {
 static int[] bagArray = new int[100];
 static int index = 0;

 public static void main(String args[]) {
  Scanner scan = new Scanner(System.in);
  String x = null;
  String[] a = null;
  while (true) {
   try {
    System.out.print("Add(A), Delete(D), Find(F), Size(S), Min(m), Max(M), List(L), Quit(Q) >> ");
    x = scan.nextLine();
    a = new String[x.split(" ").length];
    a = x.split(" ");

    switch (a[0]) {
    case "A":
     add(Integer.parseInt(a[1]));
     break;
    case "D":
     delete(Integer.parseInt(a[1]));
     break;
    case "F":
     find(Integer.parseInt(a[1]));
     break;
    case "S":
     size();
     break;
    case "m":
     min();
     break;
    case "M":
     max();
     break;
    case "L":
     list();
     break;
    case "Q":
     quit();
    default:
     System.out.println("You entered unknown command");

    }
   } catch (Exception e) {
    System.out.println("Please enter the command properly");
   }
  }

 }

 public static void add(int number) {
  bagArray[index] = number;
  ++index;
  System.out.println(number + " is added to the Bag.");
 }

 public static void delete(int number) {
  boolean found = false;
  boolean found2 = false;
  int i;
  for (i = 0; i < bagArray.length; i++) {
   if (number == bagArray[i]) {
    found = true;
    break;
   }
  }
  if (found) {
   found2 = true;
   for (int j = i; j < bagArray.length - 1; j++) {
    bagArray[j] = bagArray[j + 1];
   }
   System.out.println(number + " is deleted from the Bag.");
  }
  if (found2)
   --index;

  if (!found) {
   System.out.println("Cannot delete " + number
     + ". It does not exist in the Bag.");
  }
 }

 public static void find(int number) {
  boolean found = false;
  int i;
  for (i = 0; i < bagArray.length; i++) {
   if (number == bagArray[i]) {
    found = true;
    break;
   }
  }
  if (found) {
   if (count(bagArray[i]) == 1)
    System.out.println("There is (" + count(bagArray[i]) + ") "
      + number + " in the Bag.");
   else
    System.out.println("There are (" + count(bagArray[i]) + ") "
      + number + " in the Bag.");
  } else
   System.out.println(number + " does not exist in the Bag.");

 }

 public static void size() {
  int counter = 0;
  for (int i = 0; i < bagArray.length; i++) {
   if (bagArray[i] != 0) {
    counter++;
   }
  }
  if(counter>1) System.out.println("There are "+ counter +"numbers in the Bag.");
  else System.out.println("There is "+counter+" numbers in the Bag.");
   }

 public static void min() {
  int x = bagArray[0];
  for (int i = 0; i < bagArray.length - 1; i++) {
   if (bagArray[i + 1] != 0) {
    if (x > bagArray[i + 1])
     x = bagArray[i + 1];
   }
  }
  System.out.println("Minimum: " + x);
 }

 public static void max() {
  int x = bagArray[0];
  for (int i = 0; i < bagArray.length - 1; i++) {
   if (bagArray[i + 1] != 0) {
    if (x < bagArray[i + 1])
     x = bagArray[i + 1];
   }
  }
  System.out.println("Maximum: " + x);
 }

 public static void list() {
  //Pdfdeki gibi çizilecekse %9=0 olanlarda +
  //geri kalanlar -
  int[] reg = new int[100];
  boolean found = true;
  System.out.println("+-----------+-----------+");
  System.out.println("|   Number  |   Occurs  |");
  for (int i = 0; i < bagArray.length; i++) {

   for (int j = 0; j < i; j++) {
    if (bagArray[i] != reg[j])
     found = true;
    else {
     found = false;
     break;
    }
   }
   if (bagArray[i] != 0 & found) {
    System.out.println("+-----------+-----------+");
    System.out.format("|%11d|", bagArray[i]);
    System.out.format("%11d|", count(bagArray[i]));
    System.out.println();
    reg[i] = bagArray[i];
   }
  }
  System.out.println("+-----------+-----------+");
 }

 public static int count(int number) {
  int counter = 0;
  for (int i = 0; i < bagArray.length; i++) {
   if (bagArray[i] != 0) {
    if (number == bagArray[i])
     ++counter;
   }
  }
  return counter;
 }

 public static void quit() {
  System.out.println("Bye");
  System.exit(0);
 }
}

5 Ekim 2014 Pazar

Neden Windows 10?



Uzun zamandır anca yazmaya vakit bulabildim. Bildiğiniz gibi yakında Windows 10 çıktı fakat herkes Windows 9 olarak bekliyordu. Bunun bazı nedenleri var tabii ki. Şimdi bunları açıklayalım;


1) Gerçekçi Nedenler:
* Windows Vista'nın çekirdek sürümü 6.0 dı. Microsoft bundan sonra Windows'ta rakam adlandırması tercih etti. Şöyle ki;

Windows 7'nin çekirdek sürümü 6.1      =>  6+1=7 
Windows 8'in çekirdek sürümü 6.2        =>  6+2=8

Adlandırma böyle yapılıyor. Windows 8.1 ise aslında Windows 9 olacaktı fakat Windows 8'in üzerinden fazla zaman geçmediğinden ve büyük değişiklikler yapılmadığından Windows 9 yerine 8.1 tercih edildi.  Böylece,

Çekirdek numarası  6.3  olup,    6+3 = 9
Windows 8.1 olduğundan     => 8+1= 9

oluyordu. Bu nedenlerden dolayı Microsoft Windows 10 adlandırmasını yaptı.

* Reddit'teki bir kullanıcıdan gelen söyleme göre(kendisi Microsoft'ta çalışıyormuş) Windows 95 ve Windows 98  Microsoft çalışanları tarafından Windows 9x olarak olarak görülüyormuş bu yüzden farklı bir adlandırmaya gidilmiş
2) Batıl İnanç
 İngilizce'de seven, eight, nine(yedi, sekiz, dokuz) aslında bir kelime oyunu. Yedi, dokuzu yedi(ate) anlamına da geliyor. Şu an Windows 7 en çok kullanılan ve en başarılı Windows sürümü olduğundan sanki Windows 9 onu geçemeyecek ve Windows 7, Windows 9'u yedi gibi bir anlam çıkıyordu. Bu hem batıl inanç hem de diğer firmaların dalga geçebileceği bir neden olduğundan Microsoft Windows 10 adlandırmasını uygun gördü.

7 Eylül 2014 Pazar

Java Collections Soruları



    İş görüşmelerinde en önemli şeylerden biri de sorulan sorulara güzel ve net cevap verebilmektir. İşte bu sorulardan bazılarını bulup kendimce cevapladım. İleride mutlaka işinize yarayacaktır.

1- Koleksiyonları Nasıl Sıralarsınız? 
  Kitaplar adında bir listemiz olsun.
 List<Kitaplar>  kitaplar = new ArrayList<Kitaplar>();


 Bunu direkt olarak  Comparable arayüzünü implement ederek sıralayabiliriz. Kitaplar sınıfı şöyle olsun;

package com.cengfurkan.Collections;

public class Kitaplar implements Comparable {
 private int seriNo;

 public Kitaplar(int seriNo) {
  this.seriNo = seriNo;
 }

 @Override
 public int compareTo(Kitaplar k) {
  return new Integer(this.seriNo).compareTo(o.seriNo);
 }
}
  


Sıralamak istediğimiz zaman;
 Collections.sort(kitaplar); 



Ya da Comparator da kullanabiliriz;
Comparator<Kitaplar>  comparator = new Comparator<Kitaplar>(){
   public int compare(Kitaplar k1, Kitaplar k2){
       return k2.seriNo - k1.seriNo;
     }
};

Collections.sort(kitaplar, comparator); 




2) List'i Set'e Çevirmenin En İyi Yolu 
Eğer listemizdeki elemanlardan sadece birer tane olsun istiyorsak bu durumda onu herbir elemandan birer tane bulunacağını garanti eden Set'e çevirmeliyiz.
Kitaplar sınıfından devam edelim, yine bir kitaplar listemiz olsun;



 List<Kitaplar>  kitaplar = new ArrayList<Kitaplar>();


Bunu Set'e çevirmek için;
 Set<Kitaplar>  kitaplarSeti = new HashSet<Kitaplar>(kitaplar);
kitaplarSet.addAll(kitaplar);  //Kitaplar parametresi yazmak yerine böyle de yazabiliriz. 


3) equals() ve hashCode()

Bu metodları  objeleri karşılaştırmak için kullanıyoruz. equals objelerin eşit olup olmamasına bakarken, hashCode metodu ise her örneğin içinde bulunduğu 32 bitlik işaretli bir integer değerini gösterir. Eğer equals metodunu override edersek hashCode metodunu da override etmemiz gerekir.

4) ArrayList ile Vector Farkı
       Vector(bundan sonra vektör olarak geçecek) ile ArrayList birbirine benzese de aralarında belirgin farklar vardır.
  • Vektörler senkronize iken ArrayListler asenkronizedir.
  • Haliyle vektör thread-safe iken ArrayList değildir.
  • Senkronize olduğu için vektör yavaş iken ArrayList daha hızlıdır.
  • Boyutları artarken vektör boyutunu iki katına çıkarır ArrayList ise %50 arttırır.
5) Priority Queue Nedir?
      Bana kalırsa basit bir soru, tek cümleyle cevap verebiliriz. "İstediğimiz bir şekilde sıra elemanlarını sıralamamıza yarayan sıra".  Bunu yaparken sıra(queue) örneğini oluştururken inner class olarak comparator referansı da oluşturup öyle yapabiliriz.

6) HashTable ve HashMap
      HashTable ile HashMap de birbirine çok benzeyen iki koleksiyon. Fakat vektör ve arraylistte olduğu gibi burada da birkaç fark mevcut.
  • HashTable senkronize, HashMap değil.
  • HashTable daha yavaş(senkronize olduğu için)
  • Haliyle HashTable thread-safe, HashMap değil.
  • HashMap,  HashTable'dan sonra biraz özelleşerek çıktı. (Yanlış hatırlamıyorsam HashTable JDK 1.0 ile, HashMap ise 1.2 ile gelmişti)
  • HashMap'i  de Collections.synchronizedMap(HashMap)  metoduyla senkronize edebiliyoruz.

27 Ağustos 2014 Çarşamba

Java'da Reflection Kütüphanesi



 Genelde Java'da çalışma zamanında test yapmak için kullanılan Reflection(yansıma) kütüphanesini kullanarak yapabileceğimiz bazı ilginç şeyler var. 
İşte Reflection kütüphanesini kullanarak yapabileceğimiz birkaç şey;

1-  Normalde bir sınıfta tanımlanan private alanlara erişemediğimizi biliyoruz fakat bunu reflectionlar ile rahatça yapabiliriz. Mesela PrivateClass adında bir sınıfımız olsun ve içinde iki tane private değişken bulunsun.
package com.cengfurkan;

public class PrivateClass {

    private String ad = "Furkan";
    private int yas = 19;
}
bu sınıftaki private değişkenlere oluşturduğumuz Yansıma sınıfından ulaşmaya çalışalım

package com.cengfurkan;

import java.lang.reflect.Field;

public class Yansıma {
 public static void main(String[] args) {
  try {
   Class sınıf = Class.forName("com.cengfurkan.PrivateClass");
   Object object = sınıf.newInstance();
   Field[] fields = sınıf.getDeclaredFields();
   for (int i = 0; i < fields.length; i++) {
    fields[i].setAccessible(true);
    System.out.println("Verinin adı: " + fields[i].getName() + "\t"
      + "Verinin tipi: " + fields[i].getType().getName()+ "\t" 
      + "Verinin değeri: " + fields[i].get(object));
   }
  } catch (Exception e) {
   System.out.println("Hata: " + e.getMessage());
  }
 }
}
Ve ta da, PrivateClass sınıfındaki private değişkenlerin tipine ve içeriğine eriştik.

2- Normalde private yapıcı metodu olan bir sınıftan örnek üretemeyiz(Singleton desen hariç) Şimdi PrivateClass sınıfımızın içeriğini  değiştirelim ve tekrar Yansıma sınıfından bunu mümkün hale getirelim.



package com.cengfurkan;

public class PrivateClass {

 private String ad = "Furkan";
 private int yas = 19;

 private PrivateClass() {
  System.out.println("Merhaba!");

 }
} 
 package com.cengfurkan;

import java.lang.reflect.Constructor;

public class Yansıma {
 public static void main(String[] args) {
  try {
   Class sınıf = Class.forName("com.cengfurkan.PrivateClass");
   Constructor[] yMetotlar = sınıf.getDeclaredConstructors();
   System.out.println("Yapıcı Metot Adı"
     + yMetotlar[0].getName());
   yMetotlar[0].setAccessible(true);
   System.out.println("Sınıfın örneği: "
     + yMetotlar[0].newInstance());
  } catch (Exception e) {
   System.out.println("Hata: " + e.getMessage());
  }
 }
}

3- Şimdi de bir statik değişkeni değiştirmeye bakalım. İlginç geliyor değil mi?


package com.cengfurkan;

public class PrivateClass {

 private static String sehir = "Zonguldak";

 public static String sehirAl() {
  return sehir;
 }
}
Şehir adında bir static string değişkenimiz  ve onu return eden bir metodumuz var.


 package com.cengfurkan;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class Yansıma {
 public static void main(String[] args) {
  try {
   Class sınıf = Class.forName("com.cengfurkan.PrivateClass");
   Field[] fields = sınıf.getDeclaredFields();
   fields[0].setAccessible( true );
   System.out.println(PrivateClass.sehirAl());
   fields[0].set( null ,"Eskişehir" );
   System.out.println(PrivateClass.sehirAl());
  } catch (Exception e) {
   System.out.println("Hata: " + e.getMessage());
  }
 }
}
Artık statick değişken olan sehir değişkeni Eskişehir olarak değişti.

4- Benzer bir yolla bu sefer private metotlara erişmeyi deneyelim

 package com.cengfurkan;

public class PrivateClass {

 private static String sehir = "Zonguldak";
 private int plakaKodu = 67;

 private String sehirAl() {
  return sehir;
 }

 private int kodAl() {
  return plakaKodu;
 }
}
görüldüğü gibi iki tane private değişken ve bunları return eden private metodlarımız var. Şimdi Yansıma sınıfından bu metodlar hakkında hangi bilgileri bulabiliyoruz bakalım
 package com.cengfurkan;

import java.lang.reflect.Method;

public class Yansıma {
 public static void main(String[] args) {
  try {
   Class sınıf = Class.forName("com.cengfurkan.PrivateClass");
   Object object = sınıf.newInstance();
   Method[] metodlar = sınıf.getDeclaredMethods();
   for (int i = 0; i < metodlar.length; i++) {
    System.out.println("//// Metot Başlangıcı");
    System.out.println("Metod Adı: " + metodlar[i].getName());
    System.out.println("Metodun Geri Dönüş Tipi: "
      + metodlar[i].getReturnType());
    metodlar[i].setAccessible(true);
    System.out.println("Metodun Return Ettiği Değer: "
      + metodlar[i].invoke(object));
    System.out.println("// Metot Bitişi");
   }
  } catch (Exception e) {
   System.out.println("Hata: " + e.getMessage());
  }
 }
}
Karşımıza metodların adları, geri dönüş tipleri ve ne döndürdüğü çıkıyor.

Yazımı burada bitiriyorum. Bir sonraki yazıda görüşmek üzere.


26 Ağustos 2014 Salı

JavaBeans


JavaBean özellikle sunucu tarafında karşımıza çokça çıkan bir yapı. Aslında normal java sınıflarından farkı yok sadece biraz daha özelleşmişler. Genel amaçları ise veri taşımak.

Bir sınıfın bean olabilmesi için bazı kurallar vardır;
1- java.io.Serializable arayüzünü implement etmelidir.
2- Tüm değişkenleri private tanımlanmalıdır.
3- Parametre almayan yapıcı metodu(default constructor) olmalıdır.
4- Private tanımlı değişkenlere erişim için get – set metotları olmalıdır.
5- İçerisinde iş yapan başka bir metot olmamalıdır.


Bu kuralların nedenini teker teker açıklayalım;
1- Serializable arayüzünü implement etmeli ki verileri kayıt edebilelim.
2- Tüm değişkenleri private olmalı ki verilerimiz güvende olsun direkt olarak çağırılıp değer atanamasın.
3- Default constructor olmalı ki parametre vermeden instance oluşturabilelim.
4- Değişkenler private olduğu için haliyle get ve set metodlarına ihtiyaç duyarız bu yüzden bu metodlar da olmalı.
5- Amacımız sadece veri taşımak olduğu için başka metoda ihtiyacımız yok.

Örnek bir bean sınıfı yazalım;


package com.cengfurkan.bean;

import java.io.Serializable;

public class Session {
 private String userLocation;
 private static long sessionID;

 // userLocation için get metodu
 public String getUseLocation() {
  return userLocation;
 }

 // userLocation için set metodu
 public void setUserLocation(String location) {
  userLocation = location;
 }

 // sessionID için get metodu
 public long getSessionID() {
  return sessionID;
 }

 // sessionID için set metodu
 public void setSessionID(long sessionID) {
  this.sessionID = sessionID;
 }

}

25 Ağustos 2014 Pazartesi

İnternette Hazır Görsel Avı



Forumlarda, bloglarda bolca, internete daha önce yüklenmiş görselleri kullanırız. Bunlara ingilizce de stock images deniyor. Genelde bedava olan bu hizmetler sadece üyelik istiyor indirme işlemi için. Bunlardan birkaçını paylaşayım;


1. Dream Site
İçeriklerini ücretsiz sunuyor ama indirmek için üyelik istiyor. Mesela intel için görsel aradım;


2. Free Digital Photos
 Zengin kategori seçenekleriyle iyi bir seçenek. Food and Drink kategorisinden bir örnek

3. Free Images
350.000'den fazla görsel barındıran siteye mutlaka göz atmak gerek. Food diye aratınca;


4. Gratisography
Kişisel veya ticari kullanım için yüksek çözünürlüklü görseller sunuyor ve haftalık olarak güncelleniyor. Örnek bir görsel;



Arayüzü oldukça hoş olan bu site size her ay fotoğraf yolluyor. İsterseniz ücret vererek premium üyelik açabilirsiniz fakat bence gerek yok. Ayrıca yol gezileri ve bu geziler sırasında çekilen fotoğrafların yayınlandığı bölüm de var. Buradan ulaşabilirsiniz. 

Adından da anlaşılacağı gibi bu site tarihsel görseller sunuyor. Tarihsel haritalar çeşit çeşit baskılar barındıran bu site epey geniş bir arşive sahip. Özellikle Türkiye hakkında birçok görsel bulmam beni şaşırttı. Mesela bunlardan bir tanesi İstanbul Boğazı'nın ve Ayasofya'nın 1745 yılına ait bir görseli;



7. Stock Photos.io
Bu adres ise yaklaşık 25 bin adet profesyonel görsel bulunduruyor ve Creative Commons lisansı ile korunuyor. Görselin sahibini belirterek ticari kullanımlara izin veriyor.


8. TinEye
Çok kullanışlı bir görsel arama motoru olan TinEye, yüklediğini veya linkini verdiğiniz görselin nerelerde kullanıldığını, başka çeşitlerinin olup olmadığını veya  değişik boyutlu çeşitlerinin olup olmadığına bakıyor. Ayrıca firefox eklentisi de var.

9. Wikimedia Commons
Yaklaşık 21 milyon içeriğiyle çok zengin bir görsel veritabanı. Ayrıca herkes katkı yapabiliyor böylece hızla genişliyor.
Wikimedia Commons'un seçtiği yılın fotoğrafı;

10. PicJumbo
PicJumbo ise kayıt olmayı gerektirmeyen adreslerden birisi ve oldukça güzel görseller bulabilirsiniz. Arama yapamıyorsunuz fakat kategoriler size yardımcı oluyor.



                     Devam edecek..

13 Ağustos 2014 Çarşamba

Ücretsiz Driver Genius 10



Driver Genus programını bilmeyeniniz yoktur ama yine de ufak bir şey söylemek gerekirse driver genius sürücü konusunda yardımcı programdır. Sürücü bulma, yedekleme, geri yükleme ve güncelleme işlemlerini başarılı bir şekilde yapıyor.

 Programı ücretsiz şekilde kullanmak için, buradan programı indirip kuruyoruz ve live update yapmasını sağlıyoruz. Daha sonra  bu link üzerinden kayıt yapıyoruz ve ürünün seri numarasını anında bize veriyor ve mail üzerinden de bize yolluyor.

Not: Program Windows 8 ile uyumlu değildir.

4 Ağustos 2014 Pazartesi

Wireshark İle Ağ Dinleme



Bilgi departmanlarında çalışanlar için sniffer programları vazgeçilmezdir, her daim ellerinin altında bulunurlar. Bu yazımda da uzun zamandır kullandığım Wireshark adlı ağ trafiği izleyicisini tanıtmak istedim.


Wireshark ethernet veya wi-fi ağlarındaki trafiği dinlemek için geliştirilmiş bir yazılım. Kısaca ağ trafiğini dinlemekten bahsedelim ve biraz ön bilgi verelim;

Bir ağda her bilgisayar kendi paketleriyle ilgilenir, başka bilgisayarlara giden paketlere bulaşmaz. Çünkü bu hem gizliliği korur hem de gecikmeyi azaltır. Çünkü bilgisayarımız sürekli paketleri izlemeye çalışırsa gecikme(latency) yaşanır. Ama ağ yöneticisinin her bilgisayara giden paketleri incelemesi gerekir ki ağın güvenliğini ve stabilitesini koruyabilsin. İşte burada devreye sniffer adını verdiğimiz yazılımlar giriyor. Bu yazılımla bilgisayarımıza diyoruz ki; artık sadece kendi paketlerinle değil diğer paketlerle de ilgilen. Böylece ağdaki diğer bilgisayarların ne yaptıklarından da haberdar olabiliyoruz. Tabi bunları kötü amaçlar için kullananlar da var orası ayrı.(bkz: MITM)

Neden Wireshark?
Çünkü Windows, Linux ve Unix sistemlerde çalışabiliyor olması onu popüler yapıyor. Ayrıca detaylı paket izlemesi ise ayrı bir güzelliği.

Şimdi gelelim kullanmaya, ama önce indirmemiz gerek tabii. İndir yazısına tıklayarak Wireshark'ı indirelim.
(Ubuntu kullananlar direk terminale aşağıdaki komutu yazarak indirebilir)
 sudo apt-get install wireshark 
 
 Kurarken Windows kullananlara  WinPcap yüklenilsin mi? Diye sorulacaktır, evet deyin. WinPcap ise Windows Packet Capture(Paket Yakalama) kütüphanesidir.

 Kurduktan sonra böyle bir ekran geliyor;
 

Daha sonra soldan dinlemek istediğimiz bağlantıyı seçip araç menüsünden "Start a new live capture" seçeneğini seçelim. Böyle bir ekran gelecek karşımıza.


Burada bütün ağ trafiği var, üstten istediğimiz şekilde filtreleyebiliriz. http veya icmp gibi. Şimdi icmp ile bir test yapalım. Komut satırını açıp ceng.anadolu.edu.tr adresine ping yollayacağım ve Wireshark ile gelen ve giden paketleri göreceğim. Ping sonuçları;


Ve icmp filtrelenmiş hali ile Wireshark;


Olası Problemler
Eğer npf sürücü hatası çıkarsa, komut satırını veya power shell'i yönetici olarak açın. Daha sonra aşığıdaki komutu yazın

 sc qc npf 

Normalde çıkan sonuç şöyle olmalı

 C:\Windows\system32>sc qc npf
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: npf
        TYPE               : 1  KERNEL_DRIVER
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : system32\drivers\npf.sys
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : NetGroup Packet Filter Driver
        DEPENDENCIES       :
        SERVICE_START_NAME :

Eğer böyle çıkmazsa sürücü çalışmıyor demektir. O zaman komut satırına aşağıdaki komutu yazıyoruz.
sc start npf

Daha sonra ise
 sc config npf start=auto

yazarak işlemi tamamlıyoruz. Artık sorun çözülmüş oldu.

İyi kullanımlar.

20 Temmuz 2014 Pazar

Multitasking ve Multithreading



Baktım da bu konu hakkında açıklayıcı ve anlaşılabilir yazı bulmak pek de kolay değil. Önceki bilgilerimi de katarak ufak bir araştırma yaptım ve bu yazıyı hazırladım.

Multitasking: Birden fazla işlemi(process) aynı anda yapabilmektir. Multitasking bir ihtiyaç olarak doğmuş. Çünkü bilgisayarda birden fazla programı çalıştıramamak kadar kötü ne olabilir? Yani webde gezinirken Visual Studio'yu açmak için illa internet tarayıcısını kapatmamız mı gerekir? Multitaskingden öncesinde evet kapatmamız şarttı ama multitaskinden sonra hayır. Programcılar bunu görüp işletim sistemlerini buna göre dizayn ettiler. Genel olarak birden fazla çekirdeğe sahip olan işlemciler veya birden fazla işlemciye sahip sistemlerde görülür. Peki tek çekirdekli işlemciler? Onlarda nasıl hem müzik dinleyip hem de webde gezinebiliyoruz? Bunu sağlayanda işletim sistemi. İşletim sistemi her bir işleme işlenmesi için bellir bir süre tanıyor sonra başka bir işleme süre tanıyor. Bu süre o kadar hızlıdır ki kullanıcı tarafından algılanamıyor, bir nevi sihirbazlık gibi. Kullanıcı aslında her şeyin aynı anda olduğunu zannediyor fakat aslında her zaman tek bir işlem çalışıyor. Yani aslında bilgisayar biraz müzik çalıp işlemi duraklatıyor sonra webde geziniyor sonra işlemi tekrar duraklatıp tekrar müzik çalıyor ve böylece sürüp gidiyor.  Mesela siz bu yazıyı okurken arkada Windows güncellemeleri kontrol ediyor, belki bir virüs sizin verilerinizi çalıyor.


Çok çekirdekli işlemcilerde ise gerçek anlamda multi tasking görülür. Herbir çekirdek birer mikro işlemci gibi davranır ve herbir işlem (çekirdek sayısı kadar) aynı zamanda işlenebilir. (Bir nevi çoklu işlemci gibi aslında ama çoklu işlemciye göre çekirdekler birbiriyle daha hızlı etkileşebilme avantajı var ama aynı veriyolunu kullanacağından performans düşüyor.)



Multithreading:  Thread; kelime anlamı olarak ipliktir, nasıl iplikleri birleştirince kıyafet oluşuyorsa threadleri birleştirince işlem(process) oluşur. Multithread da multitasking gibi ihtiyaçtan doğmuştur. İşletim sistemi işlemler arası geçiş yapabiliyor fakat ya bir işlem de farklı iki işi aynı anda yapmaya kalkarsa? İşte bu olunca programlarda hatalar oluşur. Bunun önüne geçmek için işlemler threadlere ayrılıyor. Örneğin oyun oynuyorsunuz ve oynamaya devam ederken oyun otomatik olarak sizin olduğunuz yeri kaydedecek. Bunun için oyun programlanırken kaydetme işi için ayrı bir thread oluşturulur böylece işlemler paralel olarak işletilebilir. 



Özetleyecek olursak multitasking birden fazla işlemin aynı anda işlenmesi, multithreading ise bir işlemdeki birden fazla iş parçacığının aynı anda işlenmesidir.


14 Temmuz 2014 Pazartesi

Butondan Yeni Bir Aktivite Oluşturmak



 Diyelim ki bir butona tıklayıp yeni bir aktivite oluşturmak istiyoruz. O zaman yapacağımız şeyler şöyle olmalı;

Öncelikle yeni bir sınıf oluşturuyoruz. Daha sonra sınıfımıza gerekli kodları yazıyoruz.



Sonra sınıfımızı manifest dosyasına activity olarak tanıtmamız lazım.

 Daha sonra ana aktivitemizin xml dosyasında tıklanınca yeni aktivite oluşturacak butonu tasarlıyoruz ve kaynak dosyasında kod olarak yazıyoruz.

 Bunu yazınca hata vermesi lazım çünkü parametre olarak ana sınıfın bir örneğini yolluyoruz ama ana sınıf bir OnClickListener sınıfı değil o yüzden ana sınıfta bu arayüzü implement ediyoruz.


 Implement ettikten sonra bizden override etmemiz gereken metodu veriyor. Biz de şu şekilde override ediyoruz;


 Hepsi bu kadar.


8 Temmuz 2014 Salı

Jar Dosyasına İçerik Ekleme


Bu yazımda jar dosyasına içerik eklemeden bahsedeceğim. Önceleri belli bir konumda bulunan içerikleri jar dosyama ekleyebiliyordum veya direk jar dosyasının yanına koyuyordum ama her dosyayı böyle taşımak zor oluyordu. Daha sonra araştırınca direk jar dosyasına gömebilmeyi öğrendim. Şu şekilde içeriklerimizi jar dosyasına gömebiliyoruz;

Öncelikle dosyalarımız için kaynak klasörü oluşturmalıyız. Resimler için ayrı ses dosyaları için ayrı dosyalar oluşturabiliriz. Ben bu örneğimde sadece resim dosyaları kullanacağım için bir tane klasör oluşturacağım. Bu açıklamalardan sonra gelelim nasıl yapılacağına;

İlk olarak projemize sağ tıklayarak yeni bir kaynak klasörü (source folder) oluşturuyoruz


 


Daha sonra klasör oluşturma penceresi çıkacak;


Ben images isimi verdim. Siz herhangi bir ad verebilirsiniz. Daha sonra finish butonuna tıklayalım.

Klasörümüz geldi. Şimdi resimlerimizi sürükleyerek images klasörünün üstüne getiriyoruz.


Böyle bir pencere geliyor bir şeyi değiştirmeden tamam diyoruz ve dosyalarımız eklenmiş oluyor. Artık sıra geldi dosyaları nasıl kullanacağımıza.

Resimlerimizi direkt olarak kullanamıyoruz. Kullanmak için ClassLoader objesine ihtiyacımız var.  


Buradan sonra istediğiniz yerde direkt image/icon vs.  obje adı vererek kullanabilirsiniz.

3 Temmuz 2014 Perşembe

Gözleriniz Artık Yorulmasın



    Uzun zamandır kullandığım bir uygulamayı tanıtmak istiyorum, özellikle de sahura kadar bilgisayar başında kaldığımız ramazan günlerinde hepimize iyi gelecek.

    Uzun süre bilgisayar karşısında oturunca gözlerimiz ağrıyor özellikle de geceleri çok yoruyor gözlerimizi. Hatta uyku düzenimiz bile şaşıyor, fazladan uyumak istiyoruz çok yorulmuşuz gibi. Bilim insanları araştırıp nedeninin mavi ışık olduğunu bulmuşlar. Mavi ışık gözü rahatsız edip uyumayı zorlaştırıyormuş.(İlgili kaynağa buradan ulaşabilirsiniz)

   Burada imdada f.lux yetişiyor. Uygulama ekranın renk sıcaklığını ayarlayarak mavi rengi azaltıyor ve ekran daha sarımsı-turuncumsu bir hâl alıyor.  

   Kendi sitelerindeki açıklama şöyle;
Geceleri cep telefonu ile mesaj yazan kişilerin yüzlerindeki hafif ürkütücü mavimsi parlaklığı fark ettiniz mi?
Ya da sabah kalktığınızda aklınıza gelen parlak fikri yazmak için bilgisayarınızı açtığınızda ekranınızdan dolayı rahatsız olduğunuz mu?
Gün içerisinde bilgisayarınızın ekranı iyi görünür. Çünkü ekranlar “güneş gibi” görülebilmesi için tasarlanmıştır. Ancak geceleri ise “güneş gibi” görünen bir şeye bakmamalısınız.                                                                                                          
 Peki renk sıcaklığı nedir?
      Fazla detaya inmeden açıklayacak olursak; renk sıcaklığı, kaynağına yakın bir renk tonu üreten    kara cismin sıcaklığıdır ve birimi Kelvindir.



  Daha fazla bilgi için buraya bakabilirsiniz. Ya da Türkçe kaynak için buraya bakabilirsiniz.

 F.lux öncesinde;




  F.lux sonrasında;

 


    Bana kalırsa uygulama çok iyi. Özellikle lens kullananlar kullanırsa aradaki farkı daha iyi anlar. Geceleri ekrana bakmak artık o kadar yormuyor ve zorlamıyor beni.


Programın sitesi: https://justgetflux.com/

24 Haziran 2014 Salı

İlişkisel Veri Tabanı Yönetim Sistemi(RDBMS)




     Öncelikle veri tabanı yönetim sistemi nedir onu açıklayalım. Veri Tabanı Yönetim Sistemi (VTYS),
veri tabanlarının kurulmasında, tanımlanmasında ve işletilmesinde kullanılan yazılımların genel adıdır. 


     İlişkisel veri tabanı yönetim sistemine (Relational Database Management System kısaca RDBMS)  gelirsek; veri tabanımızı oluştururken aradaki ilişkiyi belirlememiz gerekir ve bunun için RDBMS kullanırız.  
RDBMS; verilerin tablolarda satır ve sütunlar hâlinde tutulduğu ve yüksek bir veri tutarlılığına sahip veri depolama sistemidir.  RDBMS ile veri tabanı içindeki nesnelerin birbiri ile olan ilişkilerini programlanabilir biçimde düzenleyerek saklar. Birbirleriyle ilişkisi demişken tıpkı OOP mantığında olduğu gibi eğer ilişkisi olan tablolardan birinde değişiklik yaparsak diğer tablonun da etkilenmesini RDBMS ile sağlayabiliriz. İlişkileri olan tablolar arasındaki veriler, çeşitli anahtarlar vasıtası ile birbirlerine bağlanırlar. İlgili tablolarda, sütunlar arasında bir anahtar sütun yer alır. Bu anahtar sütun aracılığı ile birden çok tablo verileri birbiriyle bağlantı sağlayabilir ve herhangi bir sorgulamada birlikte görüntülenebilir. Bu tür veri tabanları arasında PostgreSQL, MySQL, Oracle, dBase, Informix, Ingres, başta gelmektedir. 

RDBMS'nin genel faydaları şunladır;

• Verilerin doğru ve etkin biçimde saklanmasını sağlar.
• İlişkisel bütünlük kuralı (database integrity) sağlanır.
• Değişiklik kayıtları sayesinde, sistem çöktüğünde verileri kurtarmayı sağlar.

İlişkisel veri tabanlarında 3 tip ilişki vardır:
  • Bire Bir
  • Bire Çok
  • Çoka Çok
Birincil Anahtar (Primary Key): Tablolarda benzersiz kayıtlar elde etmemizi sağlayan sütuna verilen addır.
İkincil Anahtar (Foreign Key): Bir tabloda benzersiz kayıt oluşturmayı sağlayan sütunun diğer tabloda bir sütun olarak bulunmasına denir.
1- Bire Bir İlişki: İki tablo arasındaki ilişkiyi sağlayacak olan ortak alanların ikisi de birincil anahtar (primary key) ise birebir ilişki olur. Örneğin vatandaşlar ile T.C kimlik numaralarının olduğu bir veri tabanı gibi.

2- Bire Çok İlişki: İki tablo arasındaki ilişkiyi sağlayacak olan ortak alanlardan birisi birincil anahtar (primary key) diğeri yabancı anahtar (foreign key) ise bire çok ilişki olur.
Örneğin kişiler ve mal varlıklarının tutulduğu sistem veya bir öğrenci ve aldığı derslerin tutulduğu sistem.

3- Çoka Çok İlişki: İki tablo arasındaki ilişkinin bunların dışında ayrı bir tabloda tutulması ile oluşturulan ilişkidir. Bu ilişki tipi veri tabanında karmaşıklığa yol açar. Bu yüzden bunu önlemek için ilişkili olan iki tablo arasına bir tablo daha koyarak bire çok ilişki oluşturulup karmaşıklık önlenir.
Örneğin bir yazarın birden çok kitabı olması, bir kitabın birden fazla yazarı olması gibi.

Nesneye Yönelik Programlama(OOP) Mantığı



Nesneye yönelik programlama bilgisayar programlama yöntemidir ve işlerin kolaylaşıp harcanan sürenin kısalması için doğmuştur.
OOP mantığı doğmadan önce (prosedürel programlama dilleri vs.) programlar büyüdükçe ve karmaşıklaştıkça harcanan süreler ve emekler artıyor ve bu hem üretimi kısıtlıyor hem de maaliyeti arttırıyordu. Ayrıca kodun başkaları tarafından okunması ve düzenlenmesi çok zorlaşıyordu. Daha sonraları 1960'lı yıllarda Ole-Johan Dahl ve Kristen Nygaard ortaya OOP mantığıyla Oslo'daki Norveç Bilgi İşlem Merkezi'nde geliştirdikleri Simula I ve Simula 67 dillerini çıkardılar.

Bir dilin OOP olabilmesi için belli bazı özellikleri olması gerekir. Bunlar;

Encapsulation(Kapsülleme):
Bazı nesnelerin ve metodların diğerlerinden saklanabilmesi, erişiminin sınırlandırılabilmesidir.  Bir hocamın dediği üzere encapsulation'ı bir kapaklı bir kumandaya benzetebiliriz.  Kumandanın  normal ayar tuşları ortada (public) iken ileri seviye ayar tuşları kapağın altındadır(private). Böylece nesnelerin ve metodların ilgili kişiler tarafından kullanımı sağlanarak bilinçsiz kullanım önlenmiş olur.

Inheritance(Kalıtım): Bir sınıfın başka bir sınıftaki özellik ve metodlara sahip olmasına inheritance denir. Belli bir sınıf, daha genel bir kavramı ifade eden sınıfın üyelerine sahip olarak, onları tekrar tanımlamak zorunda kalmaz. Bir sınıfın üst sınıfın özelliklerini miras olarak alması için kullanılan anahtar kelime 'extends' dir.
  
Polymorphism(Çok Biçimlilik): Bir metodun birçok nesne tarafından kullanılabilmesidir. Bunun için overload özelliğinden faydalanılır.

17 Haziran 2014 Salı

ActionListener mı MouseListener mı?



Bazı şeyler için ikisi de aynı görevi yapıyor gibi görünen bu iki arayüzün farklarını ve ne zaman hangisini kullanmamız gerektiğini açıklamaya çalışacağım.

Öncelikle Java'da eventsler Low level events ve semantic events olarak ikiye ayrılır. Low level evenstler daha çok alt seviyelerde(işletim sistemi bazında) olan olaylardır. Kullanıcıdan gelen inputlar sonucu oluşur.  Geri kalan her şeye semantic events diyebiliriz ve bunlar ise itemEvent'lar sonucu oluşur.

Bunları öğrendikten sonra ActionListener ile MouseListener arayüzlerinin temel özelliklerine bakalım.

ActionListener arayüzü sadece semantic eventslere bakar. Buton tıklanması, klavye kısayolu olan tuşa basılması gibi. Yani bunların actionEvent e sahip olup olmamasıyla ilgilenir. Eğer bir butona tıklanırsa ActonEvent ateşlenir ve bunu ActionListener ile handle edebiliriz. Ayrıca ActionListener arayüzünü uygularken sadece tıklandığında/basıldığında  ne yapılacağı metodu yazılması yeterlidir. Çünkü spesifik bir şeyler yapmıyoruz, sadece actionEvent ateşlenince yapılacak şeyi yazıyoruz.

Diğer yönden MouseListener ise low level eventlere bakar. Farenin nereye tıklandığını(koordinatsal olarak) handle edebilir, rastgele tıklanmaları handle edebilir, ayrıca beş tane override edilmesi gereken metodu vardır. Bunlar mousePressed(), mouseClicked(), mouseExited(), mouseEntered(), mouseReleased()

Şimdi asıl soruna geçelim. Örneğin bir tane butonumuz var ve butonun tıklanıp tıklanmadığını kontrol etmek istiyoruz. Hangi arayüzü kullanmalıyız?
Aslında mantık basit. Mümkün olduğunca semantic eventleri(actionEvent gibi) tercih etmeliyiz ki böylece kodumuz güçlü ve taşınabilir olsun.  Eğer spesifik bir şeyler yapmak istiyorsak ise low eventleri kullanmalıyız(mouseEvent gibi).
 


18 Mayıs 2014 Pazar

(Yenilendi) Pencereye(JFrame) Resim Ekleme



 
 
Bu yazıda JFrame içine nasıl resim/fotoğraf ekleriz onu göstereceğim.
 
 
Görüldüğü gibi çok basit. Sadece ImageIcon ve paint metodunu kullandık.
 
2. Yöntem ise çok daha kolay ve benim tercih ettiğim yöntem. Bu yöntemde
bir tane JLabel oluşturuyoruz ve pencereye ekliyoruz.