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.