C#’ta Kendi Olayımızı(Custom Event) Yazmak

Bu yazımda C# dilini kullanarak nasıl kendi olaylarımızı yazdığımızdan bahsedeceğim. Öncelikle olayın(event) ne olduğunu basit birkaç örnekle anlatacak olursak;

– GUI üzerinde button a tıklanması sonucu bir olay tetiklenir ve siz ne yapmak istiyorsanız o kod içinde onu yaparsınız.
– Timer kullanmak istediniz farzedelim tick adında bir olay mevcuttur. Diyelim ki siz her bir saat vuruşunda ekrana birşey yazdırmak istiyorsunuz. O zaman ekrana yazdırma işlemini yapacağınız kodu olayın gerçekleşmesiyle(event firing) birlikte sapılacak methodun içine yazarsınız.

Sözü fazla uzatmadan kendi olayımızı kullanacağımız senaryoyu açıklamak istiyorum. MailBox adında mesajlarımızı barındıran bir sistemimiz var. Sisteme yeni bir mesaj gelme işlemi bu senaryoda bizim olayımız olacak ve yeni mesaj geldiğinde , gelen mesajı olayını dinleyen methodumuz ekrana gelen mesajı yazdıracak.

Message adında bir sınıfımız olsun ve bu sınıfımız mesajın kimden geldiğini , mesajın içeriğini ve mesajın geldiği saati tutsun.

class Message { public string body { get; set; } public DateTime timestamp { get; set; } public string from { get; set; } public Message(string body, string from) { this.body = body; this.from = from; this.timestamp = DateTime.Now; } }

Olay tanımı yaparken delegate ten yararlanıyoruz. Delegate nedir diyenler için MSDN’deki delegate tanımı: “A delegate is a type that references a method.”

public delegate void MessageHandler(object o , MessageReceivedArgs e);

Delegate imizi tanımladıktan sonra olay tanımını şu şekilde yapıyoruz:

public event MessageHandler MessageReceived;

MailBox sınıfımızın son hali aşağıdaki gibi oluyor.

class MailBox { List messages = new List(); public delegate void MessageHandler(object o , MessageReceivedArgs e); public event MessageHandler MessageReceived; public void newMessage(Message msg) { messages.Add(msg); MessageReceived(this , new MessageReceivedArgs(msg)); } }

Yukarıdaki kod kesiminde MessageReceivedArgs tipinde nesnelerin kullanıldığı birkaç yer dikkatinizi çekmiş olmalı. Bunu da kısaca açıklayacak olursak; olayın tetiklenmesinden sonra sapılacak yordamın imzası aşağıdaki gibi olmalıdır.

sapilacakYordam(object sender, EventArgs e)

Burada kullanılan 2. parametre EventArgs tipindeki parametre yerine biz kendi yarattığımız tipimizden bir parametre geçmek istersek ; EventArgs sınıfını kalıtan yeni bir sınıf yazabiliyoruz.

class MessageReceivedArgs : EventArgs { public readonly Message message; public MessageReceivedArgs(Message message) { this.message = message; } }

En son olarak ta olayımızı test edeceğimiz ana sınıfımızın kodunu yazıyoruz.

static void Main(string[] args) { MailBox mb = new MailBox(); mb.MessageReceived += new MailBox.MessageHandler(mb_MessageReceived); mb.newMessage(new Message(“May day”, “Captain Kirk”)); mb.newMessage(new Message(“Hello world” , “Alien”)); Console.ReadKey(); } static void mb_MessageReceived(object o, MessageReceivedArgs e) { Console.WriteLine(e.message.timestamp + ” yeni mesaj geldi: ” + e.message.from + ” : ” + e.message.body); }

Kodun tamamını indirmek için [tıklayınız](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/CustomEvent.zip).

508 Words

Observer Pattern

Observer tasarım örüntüsü bir objenin durumunun değişmesi halinde , onu dinleyen gözlemcilere bu durumun bildirilmesini ele alan bir tasarım örüntüsüdür. Burada objeler ve gözlemciler arasında one-to-many ilişki söz konusudur. Bu örüntünün kafamızda daha netleşebilmesi için birkaç örnek vermek gerekirse:

 

– Event handling işlemlerinde. Örneğin bir buttona bastığınızda bir methodun çağırılması işlemi arkaplanda bu tasarım örüntüsüyle kodlanmış bir kod tarafından sağlanmaktadır.

– MVC(Model – View – Controller) mimarisinde View kısmında herhangi bir değişikliğin otomatik olarak kod kısmına yansıtılması.
[![](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/800px-Observer-300×124.png “800px-Observer”)](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/800px-Observer.png)

public interface Subject { void subscribe(Observer observer); void unsubscribe(Observer observer); void notifySubscribers(Notification notification); }

public class Center : Subject { List observers = new List(); List notifications = new List(); public void subscribe(Observer observer) { observers.Add(observer); } public void unsubscribe(Observer observer) { observers.Remove(observer); } public void notifySubscribers(Notification notification) { foreach (Observer observer in observers) observer.update(notification); } public void insertNotification(Notification notification) { notifications.Add(notification); notifySubscribers(notification); } }

public interface Observer { void update(Notification notification); }

public class Subscriber : Observer { private string name; public Subscriber(string name) { this.name = name; } public string getSubscriberName() { return name; } public void update(Notification notification) { Console.WriteLine(name + ” : New message from ” + notification.getFrom() + ” : ” + notification.getBody()); } }

Kodun tamamı için [tıklayınız](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/observe.zip).

261 Words

C#’ta XML Serialization ve Deserialization

Kısaca serileştirmeyi tanımlayacak olursak; serileştirme , elimizdeki mevcut nesne(ler)i istenilen formata getirmeye yarıyor diyebiliriz. Bunlardan en bilinenleri XML Serileştirme , JSON Serileştirme , Binary Serileştirme. (Kendinize yeni bir format geliştirirseniz o şekilde de serileştirebilirsiniz.)

Herneyse konumuza dönecek olursak XML DOM’daki gibi tek tek appendNode , insertElement tarzındaki methodları kullanmadan nesnelerimizi direk olarak nasıl XML formatına dönüştürürüz daha doğrusu bu işi C#’ta basit olarak nasıl yaparız ondan bahsedeceğim. (Not: Java’da benzer işlemi yapmak istiyorsanız JAXB sizin için yararlı olacaktır.)

Öncelikle serileştirmek istediğim nesnelerin türetileceği sınıfı yazıyorum. Kişilere ait belirli nitelikleri tutan Person adında bir sınıfım var.

public class Person { public string name { get; set; } public string cell_phone { get; set; } public string hometown { get; set; } }

Şimdi ise elimde bulunan birden çok kişi nesnesini bir listede tutacağım ve bu listeyi nasıl serileştireceğimizi göstereceğim. İlk olarak listemizin tanımını yapıp , kişileri bu listeye ekliyorum.

 

Sıra geldi serileştirme işlemini yapan kod kesimini yazmaya. Bunun için System.Xml.Serialization namespace’inden yararlanacağız ve bu namespace te yer alan XmlSerializer sınıfını kullanacağız.

Nesnelerimiz belirttiğimiz adreste bulunan XML dosyasına yazılmış bulunuyor.

[![](http://www.onurbaysan.com/blog/wp-content/uploads/2011/08/serial-300×153.png “serial”)](http://www.onurbaysan.com/blog/wp-content/uploads/2011/08/serial.png)

Şimdi de bu işlemin tam tersini yani mevcut XML’den nesne elde etme işlemi de benzer şekilde birkaç satır kod ile yapılabiliyor.

 

359 Words

Can Sıkıntısında Bilgisayar Başında Yapılabilecekler – 1

class Program { static void Main(string[] args) { for (int i = 144; i < 1000; i += 100) Console.Beep(i, 100); for (int i = 2500; i >= 144; i -= 250) Console.Beep(i, 100); } }

Bu kodu C#’ta bir projeye dahil etmek ve hatta kendiniz bir sınıf yazıp notaların frekans değerlerinden , vuruşların sürelerine kadar belirli nitelikleri önceden tanımlayıp o şekilde şarkılar çalmak.  C++’da benzer işlemi yapmak için “Windows.h” headerını  koda ekleyip Beep fonksiyonunu kullanabilirsiniz.

Güzel bir paylaşım bu linkte mevcut:
[http://oguzkoroglu.net/post/2011/01/16/ConsoleBeep().aspx](http://oguzkoroglu.net/post/2011/01/16/ConsoleBeep().aspx)

100 Words

C#’ta Reflection – 2

Geçen yazımda Reflection’a dair temel bilgileri ve ismini bilmediğimiz bir metodu nasıl çağıracağımızı öğrenmiştik. Bu yazımda ise C#’ta yazılmış bir DLL dosyasının içindeki sınıflara nasıl erişiriz , bu sınıflardan nasıl nesneler oluşturabiliriz onlardan bahsedeceğim. (Tabi ki tüm bunlar çalışma zamanında olacak)

Bu DLL dosyası içinde bulunan sınıfın constructor ına  erişerek nesne yaratmam için aşağıdaki kodu kullanıyoruz.

//DLL dosyasının yüklenmesi Assembly asm = Assembly.LoadFile(@”C:\Ornek.dll”); object obj; //DLL dosyası içindeki sınıf bilgilerinin elde edilmesi foreach (Type type in asm.GetTypes()) { //Sınıflara ait constructor bilgilerinin elde edilmesi foreach (ConstructorInfo cInfo in type.GetConstructors()) { // Constructor ın aldığı parametre tipine göre // o tipten parametre kullanılarak nesne // yaratılması if (cInfo.GetParameters()[0].ParameterType == Type.GetType(“System.Int32”)) { obj = Activator.CreateInstance(type, 3); } else if (cInfo.GetParameters()[0].ParameterType == Type.GetType(“System.String”)) { obj = Activator.CreateInstance(type, “deneme”); } } }

* Dipnot=  Bu kodu yazarken varsayım olarak constructor’ın tek bir parametre aldığını varsaydık ve bu aldığı parametrenin tipi *Int32* veya *String* ise nesnenin yaratılmasını istedik.

207 Words

C#’ta Reflection

Program yazarken çoğu zaman Ctrl+Space kombinasyonu ile kullandığımız methodların dönüş değerlerine, aldıkları parametrelere , parametrelerin tipine vs gibi özelliklerine bakarız. Çoğu IDE sayesinde bunlara da erişmiş oluruz. Bu noktada birkaç senaryo üzerinden devam edelim.

1. Senaryo ) Bir sınıfın içindeki methodlara ait bilgilerin edinilmesi. (klasik senaryo)
2. Senaryo ) Başka birisinin yazmış olduğu bir sınıf var. Normal koşullarda o kod dosyasını açmadan “private”  , “protected” tipinde olan methodların , niteliklerin isimlerini öğrenemezsiniz. Bu durumda da yardıma koşuyor.
3. Senaryo ) Basit olarak JavaDOC benzeri bir aracı C# için yazmak istediniz. Burada da yorum methodlardan , niteliklerden önce yorum satırlarını okuyup onlara ayrıştırmak yerine Reflection sayesinde basit olarak buna benzer bir araç geliştirebilirsiniz.
*** 4. Senaryo ) Bayağı bir zamandır merak ettiğim ve yeni öğrendiğim birşey. İsmini bilmediğimiz bir methodun ismini çalışma zamanında öğrendik fakat biz bu methodu çalışma zamanında çağırabilir miyiz? Yani demek istediğim yaz() diye bir method var ve biz bu methodun ismini kodu yazarken bilmiyoruz ama çalışma zamanında çağırmak istiyoruz.

Bu kadar senaryodan sonra basit olarak ismini bildiğimiz bir sınıfın methodlarına ait bilgileri nasıl ediniriz diyerek kod kısmına geçelim.

Type intType = Type.GetType(“System.Int32”); foreach (MethodInfo mInfo in intType.GetMethods()) { Console.WriteLine(“————————————“); //Methodun ismi Console.WriteLine(mInfo .Name + ” “); int counter = 0; foreach (ParameterInfo pInfo in mInfo .GetParameters()) { //Methodun aldığı parametrelerin tipleri Console.WriteLine(counter + “. param tipi= ” + pInfo.ParameterType + ” “); counter++; } //Donus değerinin tipi Console.WriteLine(mInfo .ReturnType); Console.WriteLine(“————————————“); }

Yukarıdaki kod ile erişim belirleyicisi(access modifier) ne olursa olsun tüm methodlara dair bilgileri edinmek istersek GetParameters() methoduna parametre olarak BindingFlags’ler vermemiz gerekir. “BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static” şeklinde parametre verirsek tüm methodlara ait bilgilere erişebiliriz.

Geldik bana göre en can alıcı kısma. Şimdi de ismini çalışma zamanında öğrendiğimiz bir methodun yine çalışma zamanında nasıl çağrılacağını gösteren basit bir kod parçasını inceleyelim. Bu kod parçasında sınıfın ilk methodunu çağırıyorum. Buna göre kodun çıktı olarak “deneme123” vermesi gerekiyor. Gerçekten de kodu çalıştırdığımız zaman beklediğimiz sonucu ekranda görüyoruz.

class Boxer { public void test() { Console.WriteLine(“deneme123”); } }

Type unknownBoxer = typeof(Boxer); unknownBoxer.GetMethods()[0].Invoke(new Boxer() , null);

418 Words

Diffie – Hellman Key Exchange

Diffie Hellman anahtar değişimi geliştirilmiş en eski anahtar değişimi yollarından biridir. Güvenli olmayan ağda 2 kullanıcının birbirlerini tanımaları daha doğrusu birbirlerine yetki vermeleri için kullanılan bir yöntemdir. Bu yöntem basit olarak şu şekilde işler:

**1)*** P > G olacak şekilde 2 asal sayı seçilir.*
**2)***Kullanıcılar rasgele bir sayı üretirler.*
**3)***Kullanıcılar ürettikleri sayı doğrultusunda G^(Sayi) % P şeklinde anahtar elde ederler.*
**4)***Daha sonra bu anahtarları birbirlerine gönderirler.*
**5) ***Kullanıcı, diğer kullanıcıdan gelen bu anahtarı kullanarak G^(gelen anahtar) % P değerlerini hesaplar ki bu değer her iki kullanıcıda da aynı olur işte bu elde edilen değer gizli anahtarımızdır.*

***not =**Aşağıdaki resim en.wikipedia.org adresinden alınmıştır*.

![wikipedia.org dan alıntıdır](http://upload.wikimedia.org/wikipedia/en/c/c8/DiffieHellman.png “wikipedia.org dan alıntıdır”)

Diffie Hellman Anahtar Değişiminin Python dilinde gerçekleştirimi

import random def calcSecret(G , p , randomNum): secret = G ** randomNum secret = secret % p return secret def randomGenerator(): num = random.randrange(15) return num alice = randomGenerator() print “Alice’s number ” , alice bob = randomGenerator() print “Bob’s number ” , bob alicesecret = calcSecret(11 ,29 , alice) bobsecret = calcSecret(11 , 29 , bob) print “Alice’s secret ” , alicesecret print “Bob’s secret ” , bobsecret lastsecret1 = calcSecret(bobsecret , 29 , alice) lastsecret2 = calcSecret(alicesecret , 29 , bob) print lastsecret1 , ” ” , lastsecret2

236 Words

Huffman Sıkıştırma Algoritması

İyi günler.

Bu yazımda sizlere [Huffman Sıkıştırma Algoritması](http://tr.wikipedia.org/wiki/Huffman_kodu)ndan bahsedeceğim.

İlk olarak Huffman algoritmasından bahsetmek istiyorum. Huffman algoritması temel olarak bir metinde yer alan karakterlerin frekanslarını bularak belli bir düzende Huffman ağacına yerleştirilmesine ve buradan erişilmesine dayanıyor. Biraz daha açıklayıcı konuşalım. Bilgisayarda karakterler 8bit(1 byte) olarak saklanır. Huffman algoritmasındaki asıl amaç karakterlerin kapladığı alanı azaltarak sıkıştırma yapmak.

Mesela bir örnek vermek gerekirse diyelim “AAAABBBCC” diye bir metnimiz var. Normalde bu metin herbir karakter 8bit kaplayacak şekilde yani toplamda 8*9 bitte saklanır. Huffman algoritmasına göre ise şu şekilde saklıyoruz:

**1-**Öncelikle karakterlerin metinde bulunma sıklığı(frekans) larını buluyoruz.
A karakteri metinde 4 kere geçmiş yani frekansı 4
A:  4   ,   B:  3   , C:   2
**2-**Bundan sonra yapılacak işlem en düşük frekansa sahip iki elemanı seçerek onlardan ağaç oluşturma işlemi

[![](http://www.onurbaysan.com/blog/wp-content/uploads/2010/09/tree1.jpg “tree1”)](http://www.onurbaysan.com/blog/wp-content/uploads/2010/09/tree1.jpg)

[![](http://www.onurbaysan.com/blog/wp-content/uploads/2010/09/tree2.jpg “tree2”)](http://www.onurbaysan.com/blog/wp-content/uploads/2010/09/tree2.jpg)

**3-** Şimdide bu karakterlerin yeni hallerinin ne olacağına. Ağaçta kökten itibaren eğer karakterimiz sol alt ağaçta bulunuyorsa koda 0 ekliyoruz , eğer karakter sağ alt ağaçta ise 1 ekliyoruz. Buna göre:

A: 0 oluyor
B: 11
C: 10

**Sonuç:** Normalde “AAAABBBCC” metinini 8*9 bit ile saklıyorduk. Şimdi ise bu metni şu şekilde saklıyoruz.

AAAA  = 0000
BBB = 111111
CC = 1010

“AAAABBBCC” = 00001111111010 yani 14 bit.

Sıkıştırma oranı ((72- 14) / 72) * 100 = %80 oranında sıkıştırdık.

283 Words

Java’da Comparable Arayüzü

İyi akşamlar.

Diyelim ki Java’da Integer tipinde değişken tutan bir kolleksiyonum var. Aşağıdaki gibi yazmışım kodunu da

ArrayList test = new ArrayList(); test.add(9); test.add(4); test.add(1); test.add(30); test.add(25); test.add(100); for(Integer i : test) System.out.print(i + ” “);

Yukarıdaki kodu; yazmış olduğumuz sınıfta ilgili methodun içinde kullanınca , çıktı olarak *ArrayList *e eklenme sırasına göre bir çıktı görürüz. *ArrayList *i belli bir sıraya sokmak istediğimizde *Collections.sort()* methodunu kullanırız. Örneğin yukarıdaki kodda 9. satırdan sonra aşağıdaki kodu yazdığımız varsayalım.

Collections.sort(test);

Kodu tekrar çalıştırdığımızda çıktının sıralı olacağını göreceğiz. *Collections.sort() *methodu birden çok overload u bulunan (String , Integer , …) bir methodtur. Ve Java’da kolaksiyonlar içindeki verileri sıralamada kullanılır.

Şimdi gelelim bizim asıl senaryomuza. Senaryomuz şöyle diyelim benim Insan diye bir sınıfım var. Ve bu sınıfın içinde *ad* ve *yas* diye iki değişkenim olsun. Ben bu niteliklerle oluşturduğum Insan nesnelerini *ArrayList*‘te tutmak istiyorum ve yine rasgele sırada bir dağılım olduğunu düşünelim. Ben bu listemi Insan tipi nesnelerin yas bilgisini kullanarak nasıl sıralarım? İşte senaryom bu.

Bunun için *Comparable* arayüzünü Insan sınıfıma implement ederek *Comparable *arayüzünün içinde bulunan *compareTo* methodunu override edeceğim.

public class Insan implements Comparable { public int yas; public String ad; public Insan(int yas , String ad) { this.yas = yas; this.ad = ad; } public int compareTo(Object o1) { if (this.yas == ((Insan) o1).yas) return 0; else if ((this.yas) > ((Insan) o1).yas) return 1; else return -1; } }

Aşağıdaki kodla denememizi yapalım bakalım çalışıyor mu?

ArrayList test = new ArrayList(); test.add(new Insan(18, “Chuck Bass”)); test.add(new Insan(17, “Blair Waldorf”)); test.add(new Insan(27, “Behlul”)); test.add(new Insan(22, “Bihter”)); test.add(new Insan(55, “Adnan”)); test.add(new Insan(70, “Ramiz Karaeski”)); test.add(new Insan(65, “Kenan Birkan”)); test.add(new Insan(30, “Ezel”)); Collections.sort(test); for(Insan i : test) System.out.println(i.yas + ” ” + i.ad);

Şimdi biraz daha fantastik birşey yapalım. Mesela diyelim ki yaşları aynı olan insanları da ad sıralamasına sokmak istiyorum. Bu örnekte fantastik oldu ama kullanılır bir yerlerde. Neyse bakalım bunu yapabilmek için de compareTo methodumuzu nasıl eziyoruz.

public int compareTo(Object o1) { if (this.yas == ((Insan) o1).yas) { if (this.ad.compareTo(((Insan)o1).ad)>0) return 1; else return -1; } else if ((this.yas) > ((Insan) o1).yas) return 1; else return -1; }

Yukarıdaki koda da dikkatli bakarsanız birşeyin dikkatinizi çekmesi lazım. O da ya adları da aynı olursa öle bir durumda ilk olarak hangi nesneyi eklediysek onu yazacak ![:)](http://www.onurbaysan.com/blog/wp-includes/images/smilies/icon_smile.gif)

499 Words

CSS ile Seçilen Metin Renginin Değiştirilmesi

Blogumda dikkat ettiyseniz herhangi bir metni seçtiğinizde ; seçilen metnin arkaplan rengi varsayılan renk olan mavi değil yeşil oluyor. (Tarayıcınız IE haricinde birşeyse !)

Bunu CSS yardımıyla aşağıdaki kodu kullanarak yapabiliyoruz.  Fakat burdaki tek sorun bu stil Internet Explorer’da çalışmıyor.

::-moz-selection { background:#009900; color:#fff; } ::selection { background:#009900; color:#fff; }

63 Words