22 Haziran 2013 Cumartesi

Java'da TCP Haberleşmesi-Ufak Client/Server Uygulaması

Öncelikle TCP haberleşmesine bakalım.
Server(sunucu),client(istemci) olmak üzere haberleşme iki tür karakterden oluşmaktadır.Karakterlerin sayısı haberleşmenin kullanılacağı alana göre değişebilir(N server-n client,1 server-N client,1 server-1 client gibi)

TCP haberleşmesi OSI  nin transport(geçiş) katmanında gerçekleşen olaydır.Yani paketlerin tek tek değilde bir bütün halinde bir noktadan diğer noktaya gönderildiği kısımdır.

Server karakteri socket,bind,listen,acccept,read,write,close
Client karakteri socket,connect,write,read,close  
aşamalarından oluşmaktadır.Hepsini tek cümlelerle özetleyecek olursak;
Server için
socket() : socket kelimesi IPC nin bilgisayarlar arası haberleşmesinde(yani bir ağ üzerinden konuşan iki process ten bahsediyoruz) kullanılan kanaldır.Bu kanal kod üzerinde göreceğiz IP ve port numarasıyla oluşur.
bind() : Sadece server tarafında kulanılan bir metod olup,işletim sistemi üzerinde oluşuturulan socket in haberleşmeye hazırlanması diyebilinir.
listen(): Sadece server da bulunur.Bağlanacak client lar için dinleme yapılır.
accept(): Server a bağlanmak isteyen bir client la iletişim kurulur.
read() : Server,client tan veri ister.client veriyi gönderir
write(): Server,client a veri gönderir,cevap döner.
close(): Açılan haberleşme socket i kapatılır.Kaynaklar boşaltılır.
Client için sadece connect() i açıklasak yeterli olur.
connect(): client tarafında bağlantının gerçekleşmesi sağlanır.

Şimdi gelelim Java dilinde kodlanan client ve server uygulamalarına.Kodlamada 1 server-1client mimarisinde kodlanmıştır.

client.java-> Client uygulaması

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class client {
public static void main(String[] args) {
String serverName ="localhost";
int port=8080;
System.out.println(serverName +" adresine ve "+port+" portuna baglaniliyor...\n");
try {
Socket socket = new Socket(serverName,port);
System.out.println(socket.getRemoteSocketAddress()+" ine baglanti basarili...\n");
OutputStream write = socket.getOutputStream();
DataOutputStream out =new DataOutputStream(write);
System.out.println("Ne istemistiniz :");
String gonderilecekMetin=metinGonder();//giris olarak yazdigimiz metin sunucuya gonderilir.
out.writeUTF(gonderilecekMetin +"\n");//istemci sunucuya veri gonderir.
InputStream read = socket.getInputStream();
DataInputStream in = new DataInputStream(read);
System.out.println("Sunucu diyor ki... "+in.readUTF()+"\n");//sunucudan veri alinir.
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String metinGonder(){
Scanner sc = new Scanner(System.in);
String metin =sc.nextLine();
sc.close();
return metin;
}

}

Kendi makinemizde çalışacağımız için server adresi "localhost" port olarakta "8080" kullanılmıştır.
Üretilen socket nesnesi yukarıda anlattığımız tcp nin socket() aşamasını gerçekleştirmektedir.
Yukarıda gördüğümüz gibi ilk write() sonra read() metodları işlemektedir.
write() metodunda client,kullanıcı tarafından girilen bir metni sunucuya göndermektedir.
read() metodunda ise server tarafında kodlanmış bilgi çekilmektedir.
Nihayetinde socket.close() satırında, close() metodu işlev görüyor.
Şimdi server uygulamasını görelim.

server.java-> Server uygulaması

//8080 portu dinlenmektedir.
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class server extends Thread {
private ServerSocket sSocket;
public server(int port){
try
{
sSocket = new ServerSocket(port);//socket() safhasi
sSocket.setSoTimeout(10000);
}
catch(Exception e){

}
}
public void run(){
while(true)
{
try{
System.out.println("Server port bekliyor..."+sSocket.getLocalPort());
Socket socket = sSocket.accept();
System.out.println("Belirtilen adrese baglanti basarilidir="+socket.getRemoteSocketAddress());
DataInputStream read = new DataInputStream(socket.getInputStream());
System.out.println(read.readUTF());//client tan veriler geliyor,read()
DataOutputStream write = new DataOutputStream(socket.getOutputStream());
write.writeUTF("Tesekkur ederiz "+socket.getRemoteSocketAddress()+" yine bekleriz\n");//client a veri gönderiliyor,write()
socket.close();//close() safhasi
}
catch(SocketTimeoutException s)
        {
           System.out.println("Socket timed out!");
           break;
        }catch(IOException e)
        {
           e.printStackTrace();
           break;
        }
}
}
public static void main(String[] args) {
Thread thread = new server(8080);
thread.start();
}
}

Server uygulamasında thread yapısı kullanılmıştır.
->ServerSocket sınıfından sSocket nesnesi oluşturuldu //socket() aşaması.
->.setSoTimeout(10000) metodunda milisaniye cinsinden server ın dinlemeye açık olacağı süreyi belirlemekteyiz.
->Client yapısındaki metodlar kullanılmıştır.Farklı olarak bir accept() safhası olduğu için .accept() metodu kullanılmıştır.
->Main metodunda oluşturduğumuz thread de kullanacağımız portu girmekteyiz.


21 Nisan 2013 Pazar

POCO Entity Framework Oluşturmak ve İşlem Yapmak

Kökenini POJO(plain old java object) ten almakla beraber , entity framework çeşididir.Geliştiricinin hızına hız katar.Az zamanda büyük işler yaptırır :) Veritabanındaki elemanları arayüzden(interface),kalıtımdan (inheritance) bağımsız kullanılabilmesini sağlar.

öncelikle POCO nesnesi nasıl oluşuracağız ona bakalım.

Entity framework için veritabanıyla bağlantı kurduktan sonra .edmx dosyasına sağ tıklanıp properties açılır ve "Custom Tool" da yazan değer silinir akabinde .edmx sayfasında boş bir yere sağ tıklanıp "Add Code Generation Item" denilir.




Açılacak "Add New Item" penceresinden "POCO Entity Generator for C#" seçilir.Eğer bu seçenek yoksa soldan online sekmesine tıklanır ve kullanığınız frameworke göre(4.x,5.x) poco entity generator seçilir.


Bu işlemlerden sonra POCO entity generator solution explorer da .edmx dosyasına alt olarak .context.tt ve .tt uzantılı dosyalar oluşturur.Buradan veritabanı işlemi için gerekebilecek ince ayarlar bu dosyalara girilerek yapılabilir fakat biz şimdilik veritabanına insert işlemini anlatacağız.

POCO nun en önemli özelliği veritabanına işlemeden önce verileri ObjectContext dediğimiz nesnede tutup daha sonra veritabanına işlemesidir.Tıpkı ilkel dillerdeki dosya okuma/yazma işleminde önce verinin tampon(buffer) dediğimiz yapıya atılıp daha sonra verinin istenilen bölgeye işlenmesi gibi.

Burada ObjectContext in connection string ini bulmamız gerekir ki işlemlerimizi bunun üzerinden yapacağız.Bunu string bizim ado.net entity data model(en başta veritabanını entity frameworke bağlarken) i oluştururken kullandığımız isimdir.


Connection string imizin adını öğrendikten sonra şimdi geldik veritabanına işlem yapmaya.İşlemi yapacağımız sayfa açılır.

 protected void Page_Load(object sender, EventArgs e)
        {
            Student ogrenci = new Student();
            ogrenci.StudentName = "Fırat";
            ogrenci.StandardId = 1;
            using(SchoolDBEntities context = new SchoolDBEntities())
            {
                context.Student.AddObject(ogrenci);
                context.SaveChanges();

            }
        }


Kendi kullandığım veritabanından örnek verecek olursak.Burada Student tablo adı olup entity framework gereği bunu sınıf gibi kullanıyoruz ve Student sınıfından ogrenci nesnesi oluşturuyoruz.
Nesneye yönelim programlama gibi sonuna nokta koydukça tablomuzdaki alanlar(StudentName,StandartID) gelmekte olup bu alanlara erişebiliyoruz.
Daha sonra yukarıda POCO kullanarak oluşturduğumuz SchoolDBEntities sınıfından oluşturduğumuz context nesnesiyle ogrenci nesnesini context nesnesine AddObject metoduyla ekliyoruz.
Son olarak .SaveChanges() metodu context te yaptığımız değişiklikleri veritabanına kaydederek başarılı bir şekilde POCO Entity Framework kullanarak veritabanında işlemimizi bitiriyoruz.


Entity Framework hakkında daha ayrıntılı bilgi için
http://www.entityframeworktutorial.net/

11 Nisan 2013 Perşembe

XSD ile XML tasarımı

XSD(XML Schema Definition) kullanarak elimizdeki xml dosyasının hangi formatlarda,standartlarda bize gönderildiğini verilerin nasıl biçimlendirildiğini görebilir.Kendimiz bir xml formatında dosya oluşturmak istediğimizde hangi kurallarla bu işi yapacağımıza bu sayede karar veririz.

Örnek bir xml dosyası


<?xml version="1.0" encoding="UTF-8"?>
<araclar>
<arac>
<marka>Hyundai</marka>
<model yil="2011">Ix20 1.4 CRDI -  77 PS</model>
<motor>
<hacim>1396</hacim>
<vites tip="Manual">6</vites>
<yakit>Dizel</yakit>
</motor>
</arac>
</araclar>

ve bu xml dosyasının hangi kurallar çerçevesinde tasarlandığını gösteren xsd dosyası


<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="araclar">
<xs:complexType>
<xs:sequence>
<xs:element name="arac" type="aracModel"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="aracModel">
<xs:sequence>
<xs:element name="marka" type="xs:string"/>
<xs:element name="model" type="modelType"/>
<xs:element name="motor" type="motorType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="modelType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="yil" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="motorType">
<xs:sequence>
<xs:element name="hacim" type="xs:integer"/>
<xs:element name="vites" type="vitesType"/>
<xs:element name="yakıt" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="vitesSimpleType">
<xs:restriction base="xs:int">
<xs:enumeration value="5"/>
<xs:enumeration value="6"/>
<xs:enumeration value="7"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="vitesType">
<xs:simpleContent>
<xs:extension base="vitesSimpleType">
<xs:attribute name="tip" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>  
UTF-8 karakter kodlaması türünde kodlandığını gösterir.İlk iki satır her xsd dosyasında sabittir fakat karakter kodlaması kimi dosyada değişebilir.
Tasarıma en tepedeki düğümden içeriye doğru kodlamaya başlıyoruz.Yani hiyerarşik bir düzende ilerleyeceğiz.


araclar içinde tanımlanan etiket arac etiketidir.

<xs:element name="araclar">
<xs:complexType>
<xs:sequence>
<xs:element name="arac" type="aracModel"/>
</xs:sequence>
</xs:complexType>
</xs:element>
yukarıdaki blok araclar etiketinin hangi kuralda kodlandığını göstermektedir.

xs:complexType : bir etikette hem attribute hem de value veya etiketin içinde etiketler(motor etiketinin altındakiler gibi) tasarlanıyorsa bu kullanılır.
xs:sequence : kodlama sırasına göre dosyaya yazılacağını ve hangi durumda olursa olsun bu sıranın bozulamayacağını gösterir.
xs:element : etiket tanımlamada kullanılır."name" alanı ile isim veririz."type" alanı ile kendi belirlediğimiz ya da dışarıdan hangi veri tipinin kullanılacağını belirtir.
Burada aracModel tipinde kendi tasarladığımız veri tipinde arac etiketi tasarlanmıştır.
<xs:complexType name="aracModel">
<xs:sequence>
<xs:element name="marka" type="xs:string"/>
<xs:element name="model" type="modelType"/>
<xs:element name="motor" type="motorType"/>
</xs:sequence>
</xs:complexType>
İşte yukarıda bahsettiğimiz aracModel kendi tanımladığımız veri tipi bu elementlerden oluşmaktadır.Gördüğümüz gibi xsd, düğümleri tasarlamakta kullanıcıya esnek bir yapı sunmaktadır.
Dikkatinizi çeken şey marka elementinin type alanı "xs:string" olacaktır.Burada marka etiketi bir string türünde olduğunu gösterir.Yukarıdaki tanımlama
arac etiketinin marka,model,motor etiketlerinden oluşacağını belirtmektedir.

Neden kendi veri tipimizi oluşturuyoruz?
Çünkü tasarlayacağımız yapıyı veritabanı tasarımı gibi düşünün.Zaten çoğu mobil uygulamalarda xml dosyaları veritabanı olarak kullanılmaktadır.Burada yaptığımız iş sadece veri tipi tanımlamak değil,bu veri tipiye çeşitli kısıtlamalar(ennumeration),özellikler(maxLength,minLength,required gibi) ekleyebiliyoruz.


<xs:complexType name="modelType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="yil" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>

Şimdi yukarıdaki modelType ın kodlamasına bakalım.xs:simpleContent etiketinin içine yazılmıştır.
xs:simpleContent : value yanında bir attribute tanımlarsa ve bunlara restriction(kısıtlama),extension(genişletme) özellikleri eklenirse xs:simpleContent tagi kullanılır.Bu tagin içine element yazılmaz.
yukarıdaki simpleContent extension özelliğiyle yazılmıştır.extension u kalıtım alma gibi düşünün bir sonraki örnekte daha rahat anlayacaksınız.Siz simpleContent te bir kısıtlama getirmeyecekseniz extension özelliğiyle kullanın.
xs:attribute : etikete bir özellik eklemek için kullanılır."use" özelliği,etiketin bu özelliği asla boş bırakılamayacağını söylemektedir.



<xs:complexType name="vitesType">
<xs:simpleContent>
<xs:extension base="vitesSimpleType">
<xs:attribute name="tip" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>

burada gördüğümüz gibi simpleContent "vitesSimpleType" tipinden kalıtım alarak "vitesType" tipini oluşturmuştur.

<xs:simpleType name="vitesSimpleType">
<xs:restriction base="xs:int">
<xs:enumeration value="5"/>
<xs:enumeration value="6"/>
<xs:enumeration value="7"/>
</xs:restriction>
</xs:simpleType>
Yukarıda kalıtımı alınan vitesSimpleType ın tasarımı bu şekildedir.
xs:simpleType etiketi altında yazılmıştır çünkü sadece etiketin alacağı value tanımlanmış ve restriction kullanılmıştır.Yukarıdakini özetleyecek olursak, <vites> </vites>etiketinin sadece 5,6,7 değerlerini alabileceğini göstermektedir




30 Mart 2013 Cumartesi

execvp kullanımı


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
void main(){
char *arg_list[] = {"ls","-l","-a",NULL};// "ls" komutu ve arkasında "-l","-a" komutu işlenecek NULL hangi komut olursa olsun girilmesi gerek
pid_t childPID;
childPID = fork();
if(childPID == 0){
printf("cocuk process%i",childPID);
execvp("ls",arg_list);
}
else{
printf("ana process\n");
}
printf("ana processID%i",getpid());
}


fork edilen bir child prosesi işlemek için kullanılan komuttur.Aslında "exec" ailesindendir.Bir sistem çağrısıdır(system call).Multithreading programlamada kullanılan komutlardan birisidir.

20 Mart 2013 Çarşamba

ulimit komutu

Unix tabanlı sistemlerde,sistemin hangi ölçülerle kullanıldığının istatistiğini veren ve kullanıma göre ince optimizasyonlar yapılarak kullanıcının kaynakları kullanımında sınırlamalar getirilebilir.Olası DOS saldırıları bu şekilde engellenebilir.
terminale
ulimit -a
yazarak sistemde kullanılan kaynaklar hakkında daha ayrıntılı bilgi edinebilirsiniz.

Görüldüğü gibi max user process dediğimiz kullanıcının bir oturumda açabileceği process sayısı unlimited olarak ayarlanmış.Bu sebeple olası bir DOS tipi saldırı olan fork bombinge ortam hazırlamaktadır.

ulimit -u <girmekIstediğinizSayi>
ornek : ulimit -u 30


Gördüğümüz gibi max process sayısı 30 ile sınırlandırıldı.
Şimdi bir fork bombing scripti olan
 :(){ :|:& };:
komutu terminale yazarak sistemin vereceği cevabı görelim.

İşte sonuç :
Resource temporarily unavailable
Yani kaynak geçici olarak uygun değil.Bu ayarlama yapılmamış olsaydı yani siz konsolu açtığınızda direk
 :(){ :|:& };:
girdiğinizde makineniz kilitlenecek ve sistemi yeniden başlatmanıza sebep olacaktı.Bir sistemin yeniden başlatılması küçük boyutlu işlerde maliyet açısından gideri elle tutulur ölçülerde olmayabilir lakin büyük ölçekli sistemlerde(banka serverları,devlet kurumlarının kullandığı sistemler) bir sistemi yeniden başlatmak demek ana haber bültenlerinde son dakika haberi olmak demektir.

19 Mart 2013 Salı

Fork Bombing ve Korunumu

İsminden de anlaşılacağı gibi,bir process in kontrol dışı çoğalması ve kaynakların hunharca tüketilip sistemi dondurup,devre dışı haline getirmesidir.
Bir DOS(denial of service) saldırısıdır.Prosesler geometrik bir şekilde(1,2,4,8,16,32....) artacağı için memoryde akıl almaz bir kaynak tüketimi ve cpu nun işlem gücünü çalarak sistem üzerinde çalışan diğer hizmetlerin,programların çalışmasını engeller.
Şematize Fork Bombing

Fork Bombing den nasıl korunuruz ?

Unix türü işletim sistemlerinde kullanıcının bir oturumda açabileceği process sayısı önceden belirlenmiştir.Kullanıcı bu process sayısını kesinlikle aşamaz.unix te ulimit shell komutuyla bu sınırlama gerçekleştirilebilir.

Windows türü işletim sistemlerinde bu işlem process sayısı olarak değil de cpu kullanımı olarak ele alınmıştır.
kullanıcıların cpu kullanımı sınırlandırılır.

Basit bir Fork Bombing
Unix tabanlı işletim sisteminize aşağıdaki kodu yazıp çalıştırarak ne kadar çaresiz kalabileceğinizi öğrenebilirsiniz :)

#include <stdio.h>
#include <unistd.h>
void main(){
while(1){
fork();}
}
NOT:Derleyip çalıştırmadan önce açık kalan kayıt edilmemiş programlarınızı kapatın.

Attack Tree ve Yazılım Güvenliği

Güvenlik konusunda saldırı ağacı dediğimiz Attack Tree,bir güvenlik sisteminde gerçekleşecek saldırı türlerini ve bu saldırı türlerinin hangi yollarla gerçekleştirilebileceğini bir ağaç formunda gösterilmesidir.
[1] Attack Tree Örneği

Yukarıdaki ağaçtan bahsedecek olursak.Dosyaya bulaşan bir virüsün sistem üzerinde yapabileceklerini simgelemektedir.Ağaç,yapraklarına ayrıldıkça durum sayısı artar.Bu durumuların herhangi birisi gerçekleşebileceği gibi aynı anda aynı seviyede bütün durumlarda gerçekleşir.
Örnekleyecek olursak
1.Senaryo
Virüs dosyaya bulaşır -> Virüs kod gereği kendisini Administrator yetkisinde olarak çalıştırır ->Virüs üreteceği kötü niyetli kodla(exploit) dosya sisteminin köküne ulaşabilir ve istediğini yapabilir.
2.Senaryo
Virüs dosyaya bulaşır -> Virüs kendini normal kullanıcı yetkisinde çalışır ->Virüs kendisi gibi zararlı programları internetten indirir ve makineye zarar verir.

Bunun gibi tepeden tırnağa bir kötü yazılımın,açığın sisteme hangi zararları vereceğini bu yapıyı kullanarak optimum bir şekilde gösterebiliriz.

Bu ağaç çeşitli yazılım güvenliği modelleme araçlarıyla dizayn edilir ve kurumların kullandıkları,ürettikleri sistemlerin olabilecek güvenlik açıklarını,bu açıklara karşı davranışları simüle edilebilir ve iş devamlılığı bu sayede sağlanabilir.

Kaynaklar
[1] http://en.wikipedia.org/wiki/Attack_tree#Attack_tree_modeling_software


7 Mart 2013 Perşembe

XMPP Protokolüyle Mesajlaşma

Çoğu messenger yazılımının kullandığı bir protokol olan XMPP(eXtensible Messaging and Presence Protocol) her protokol gibi donanımdan bağımsız cihazların birbirleriyle mesajlaşmasını(ses yada video),dosya aktarmasını sağlar.
Donanımdan bağımsız demek;mesela iki kişi biri cep telefonunda diğeri bilgisayar başında,bunlar kendi aralarında anlık mesajlaşabilirler.
Client/Server mimarisinde çalışmakta olup,bütün uç birimler bir server aracılığıyla haberleşmektedir.Yani siz karşı tarafa mesaj gönderirken ilk önce o mesaj server a daha sonra server dan göndermek istediğiniz kişiye iletilmektedir.


Piyasada çeşitli açık kaynak kodlu yazılımlarla sizde bir mesajlaşma servisi yazabilirsiniz.Bunlardan önce server ınızın bulunması gerekiyor(linux ya da ms server olabilir)

Server yazılımı için Openfire(kurulum ve ayarlama konusunda çok rahat),ve clientler için de openfire bünyesindeki client apilerini kullanabilirsiniz.

Bilgisayarınızda çalıştırmak istiyorsanız Spark'ı yükleyebilirsiniz.Açık kaynaklı olmasıyla Smack API leri indirerek kodlama bilgilerinizle kendi uygulamanızı bilgisayar platformunda yazabilirsiniz.

Mobil platformda client düşünüyorsanız aSMACK API lerini kullanarak Android ortamında çalışabilirsiniz.

WEKA ile Veri Madenciliği

Veri madenciliği,enformasyon alanında yapay zeka tekniğiyle beraber kullanılan akıllı öğrenme sistemlerinde kullanılan bir bilgi keşif tekniğidir.
Mesela bir deniz kabuğunun yaşını onun muhtelif özelliklerinden istatistiksel çıkarımlar yaparak kesin olmamakla beraber kuvvetli tahminler yapabiliriz.İşte bu istatistiksel çıkarımların bütünü veri madenciliğine girmektedir.
Weka bir veri madenciliği uygulaması olup açık kaynak kodlu geliştiricilerin kullanımına açık bir uygulamadır.

Weka indirmek için tıklayınız

Öncelikle WEKA kullanmak için wekanın desteklediği dosya formatları CSV,ARFF dir.ARFF,CSV ye göre daha erişilebilir bir dosya uzantısı olup CSV nin aksine dosya üzerinde yapacağınız değişimleri kaydedebilirsiniz.CSV de bu özelliği bulamayabilirsiniz.

Yükleme işlemi bittikten sonra uygulamamız açılır ve Explorer sekmesine gelinir

Daha sonra Open File butonuna tıklayarak .arff uzantılı dosyamız seçilir.


Preprocess sekmesi, bize dosya hakkında bilgiler vermektedir.Bu dosyadaki sınıfları(class),özellikleri(attribute) bilgileri ve bu bilgiler üzerinde yapılabilecek işlemler burada gerçekleşmektedir.Biraz detaya inecek olursak;
Filter kısmı,veriler üzerinde çeşitli hesaplamalar,uygulamalar(kayıp verilerin doldurulması,veriyi daha küçük parçalara ayırma(cross validation) ) gibi işlemler yapılabilmektedir.
Örneğin uğraştığımız datasette eğer kayıp veriler(missing value) mevcut ise
Choose -> filters ->unsupervised-> attributes->ReplaceMissingValue 
yaparak üzerinde bulundurduğu algoritmalarla Weka kayıp verilere değerler atayacaktır.


Classify(sınıflama)

Sınıflandırma veri madenciliğinde belirli özelliklere sahip olan örneklerin hangi sınıfa ait olduğunu göstermek için kullanılır.Günlük hayatta özellikle e-ticaret sitelerinde bolca kullanılmaktadır.Örnek verirsek "bunu satın alan kullanıcılar aşağıdaki şu ürünleri de incelemiştir,satın almıştır" veya bilgisayar oyunlarında özellikle iki oyunucunun özelliklerini karşılaştırarak hangi oyuncunun daha kuvvetli olduğuna karar veren mesela PES'te bir maçı simulate ederken iki takımın özelliklerini karşılaştırıp,çeşitli dış şartları(home&away,maçın önemi(lig veya final maçı gibi) ) da dahil ederek hangi takımın galip geleceği bu sınıflama tekniğiyle yapılmaktadır.

Wekada Classify sekmesine geldiğimizde karşımıza çıkan pencereyi inceleyelim.
Choose: sekmesi hangi sınıflama algoritmasını kullanacağız onu belirliyoruz.Örnekte J48(decision tree) algoritması gösterilmiştir.
Test Options: kısmına geldiğimizde burada verimizi nasıl parçalayacağız kaçını test kaçını training olarak kullanacağız onu belirliyoruz.Tek tek baktığımızda
Use Training set : Burada üzerinde Preprocess sekmesinde yüklediğimiz veri setinin tamamı kullanarak sınıflandırma yapılır
Supplied test set: Dışarıdan elle oluşturulmuş veri setini test olarak mevcut veri setimizi training olmak şartıyla kullanabiliriz
Cross Validation: K - Cross Validation tekniğiyle veri seçme
Percentage Split:Mevcut verimizin yüzde kaçını training olarak kullanacağımıza karar verir.

More Options un hemen altındaki sekmede hangi özelliğe göre sınıflama yapacağımız o seçilir.Buraya tıkladığımız vakit veri setimizdeki özellik değerlerini gösterir.

Start butonuna basılarak işlem başlatılır.

Sonuç kısmına baktığımızda burada bizi ilgilendirecek en önemli kısım Confusion Matrix tir.Confusion Matrix verilerimizin doğru bir şekilde sınıflandırılıp sınıflandırılamadığını bize söyler.Örneğe bakacak olursak yanlış bir sınıflandırma olmamıştır.9 kişi gerçekte republican sınıfında olup,sınıflama algoritması sonucunda da republican sınıfında olduğu tespit edilmiştir.Aynısı democrat sınıfındaki 6 örnek içinde geçerlidir.