2 Eylül 2010 Perşembe

.NET Form Uygulamalarında Web Servis Kullanımı

Günümüzde gerek desktop uygulamalarında olsun, gerek online uygulamalar da olsun, web servis kullanımı gittikçe yaygınlaşmaktadır ve yaygınlaşmaya da devam edecektir.

En basit haliyle web servisin tanımını yapmak istersek: Web servisler farklı platformların aynı dilde konuşmasına yani haberleşmesine imkan sağlayan kullanıcı tanımlı fonksiyonlardır. Evet aslında web servisler bizim uygulamlarımızda her hangi bir işi yaptırmak için yazdığımız fonksiyon(procedure) lardan farksızdır.

.Net te webservis oluşturmak ve oluşturduğumuz bu web servisi projemize import edip kullanmak oldukça kolaydır. Ancak biz bu yazımızda buradaki adreste sunulmakta olan tc kimlik no doğrulamaya yarayan bir web servisi kullanacağız. Bu web servisi kullanmak veya kendi oluşturduğumuz bir web servisi kullanmak arasında yapılan işlemler açısından pek fark yoktur. ( Eğer kendi oluşturduğumuz bir web servisi kullanmak istersek, bu web servisi IIS ile local de yayınlamamız gerekecektir. )

Öncelike yeni bir windows form application projesi oluşturuyoruz ve tasarımını aşağıdaki gibi yapıyoruz. Bu arada .net projemizde dil olarak c# kullanacağız.( Proje dediysek bir kaç satır koddan ibaret olduğunuda belirtmekde farda var :P )




Tasarımımızı bu şekilde yaptıktan sonra, yukarıda belirttiğimiz url deki web servisi projemize import etmeiyiz. Eğer Url e tıkarsanız, web servisin TCKimlikNoDogrula adında sadece bir adet fonksiyon ihtiva ettiğini görebilirsiniz. Web servisi projeye import etmek için şekilde görüldüğü gibi, referanslar klasörüne sağ tıklayıp, "Add Service Reference" diyoruz.




Açılan pencerede adres çubuğuna http://tckimlik.nvi.gov.tr/Service/kpsPublic.asmx yazıp Go ya tıklıyoruz ve sonuçta şekildeki gibi bir ekranla karşılaşmamız gerekiyor.





Bu ekranda iken Okay butonuna tıklarsak, web servisimizi projemize referans yapmış oluruz. Bu aşamadan sonra web servisimizin tüm fonksiyonlarını kullanabileceğiz. Sorgula isimli butonumuzun click event ine aşağıdaki kodu yazarak projemizi sonlandırmış olacağız.






tüm bu adımlardan sonra, artık web servisimizi kolaylıkla kullanabileceğiz. Web servisten kullandığımız TCKimlikNoDogrula( ) isimli fonksiyon 4 parametre almaktadır. Bunlar tc no, ad, soyad ve doğum yılıdır. Bu parametreleri alan TCKimlikNoDogrula() fonksiyonumuz geriye bool tipinde bir değer döndürmektedir. (tc no mevcutsa ve bilgileri girilen kşiye aitse true, değilse false değeri döner.)

Örnek olarak kendi bilgilerimi girdiğim ve sonuç aldığım ekran görüntüsü :




1989 olan doğum tarihimi değiştirip, 1988 yaptığımda ise aldığım ekran görüntüsü:





Bu basit proje ile amacımız, internet ortamıdna yayınlanmakta olan hazır bir web servisin .net ile olan entegrasyonunu göstermek idi. Umarım birileri için faydalı olabilir :))

29 Mart 2010 Pazartesi

STEGANOGRAPHY - ( Steganografi )

  Bitirme projemi Steganografi alanında aldım. Bir yıl öncesinden başlamıştım düşünmeye aslında, uğraşırken haz duyacağım ve bana katkı sağlayabilecek bir proje almayı çok istiyordum. Aklımda yapay sinir ağları ile alakalı bir kaç proje belirlemiştim. Onlardan biri plaka tanıma sistemi idi. Çok ilgimi çeken bir konuydu ve bitirme projemi onun üzerine almak istiyordum. Sayın hocam Yrd. Do. Dr. A. Bedri ÖZER ile bitirme hakkında konuşmak için gittiğimde bana steganografi den bahsetti. Daha önce hiç duymamıştım ancak anlattığı kadarıyla ilgimi çekmişti. Bende 1 gün süre istedim ve araştırmalar yaptım. İşte budur abi, dedim biraz araştırma yaptıktan sonra . Projeye başlamak için sabırsızlanıyordum gerçekten. Sabah erkenden gidip projeyi almak istiyordum, hocamın benden önce konuyu başka birisine verecebileceğinden bile korktum :D
O derece ilgimi çekmişti çünkü....

  Projeye başlamdan önce resim formatları hakkında araştırmalar yaptım. Daha sonra oluşurduğum deneme projesi üzerinde çalışmalara başladım...

  Steganografiden bahsetmeden projeye geçilmez heralde :)
Steganografi yi kısaca veri saklama sanatı olarak özetleyebiliriz. Steganografi için genelde resim, video ve müzik dosyaları taşıyıcı olarak kullanılıyor. Taşıyı dosya, gizli veriyi içeren dosya ya verilen isimdir. Bu dosyaya ayrıca stego dosyada denilmektedir.

  Stego dosya ya veri saklamak için birden fazla yöntem vardır. Bunlardan en yaygın kullanılanı ise LSB( Lowest Significant Bit ) yöntemidir. Projemde stago dosya olarak resim dosyalrını seçtim. Ve yöntem olarakta LSB yöntemini kullandım.

  LSB yöntemine göre , her byte ın son biti kullanılmak için tahsis edilir. Dosyaya saklanacak karakterler in binary hali elde edildikten sonra, her byte ın son biti ne sırasıyla karakterkerin binary karşılıları saklanır. Burada , bu yöntemi güzel yapan nokta şudur: Örneğin, eğer sıradaki saklancak bitimiz '0' ise ve değiştireceğimiz bitimizde aynı şekilde '0' ise , hem verimizi saklamış olacağız, hemde orjinal bitimiz değişmemiş olacaktır. Kaldı ki, bitimizin değişmesi durumuda bizim için çok önemli olmayacaktır. Çünkü son bitteki bir bitlik değişim için gözle görünecek bir renk farklılığı oluşmayacaktır. Yani kullandığımız tüm son bitler değişse bile ve hatta resimdeki tüm byte lerı kullansak dahi resim stego resmimiz ile orjinal resmimiz arasında insan gözünün algılayacağı bir frekans farklılığı meydana gelmiycektir. böylece stego resim verimizi başarıyla kamüfle edecektir...

  Bu kadar edebiyattan sonra yavaş yavaş projeye geçebilirz galiba.. Burada projenin tüm kodalrını verecek kadar paylaşımcı bir insan değilim :P

  Bu arada projemi .Net te c# kullararak yaptım ve .Net te bu iş için hazır kütüphanelr olduğunu öğrendim. Ancak bu kütüphanelere elimiz bile sürmedim :P
Yani el emeği göz nuru oldu diyebiliriz.. :) Burada sadece karşılaştığım sorunlardan bahsedeceğim ve projenin ekran görüntülerini vereceğim. Ayrıca bir orjinal resim ile stego resmide beraber vererek, az önce bahsettiğimiz bozulmaların ne denli farkedilemeyecek olduğunuda göreceğiz. Öncelikle sade görünümlü ara yüzümüzü görelim:



  Görüldüğü gibi iki adet tab page imiz var. Bunlardan biri verimizi saklamak diğeri ise tekrar elde etmek için kullanılıyor. Sağ üst köşede Dosya Aç butonu ile açtığımız resme ait bilgiler görüntülenmektedir. Karakter kapasitesi ile belirtilen kısıma seçilen resim için saklanabilecek maksimum karakter sayısı yazılmaktadır.


  Örnek bir saklma işleminden sonra ise arayüzümüz aşağıdaki bigi olmaktadır:





  Şuan form üzerinde görüntülenen resim aslında orjinal resim değildir. Yani stego resmimizdir, bu resmi Kaydet butonu ile bir dizine kaydetmeliyiz. Kayıt işleminden sonra Çıkar sekmesine gelerek kaydettiğimiz bu stego resmimizi seçtikten sonra Çıkar butonuna basmamız halinde ise görüldüğü üzere veriler okunarak metin kutusuna yazılmış olacaktır:




  Görüldüğü gibi saklanan karakter sayısı ve okunan karakter sayısı eşittir. Buda herhangi bir veri kaybımızın olmadığını gösterir. Bunu anlamak için çıkarılan metnimizide kontrol edebiliriz tabiki.. Bir başka değinilmesi geeken nokta ise, işelem süreleridir. Görüldüğü gibi saklama işlemimiz okuma işleminden daha fazla zaman almıştır. Aradaki zaman farkı saklanan karakter sayısı ile doğru orantılıdır.

  Veri saklama işleminde karşılaştığım bir sorunu paylaşmak isterim; Saklam işleminde karakterlerin binary karşlığı için ASCII standardını kullandım. Bu standartta Türkçe karakterlerin karşılığı yoktur. Aslında var.. Bir Türkçe karakteri ASCII olarak bir text box a yazdırdığım zaman 8 bitlik bir değer gördüm. Halbuki ASCII 7 bitlik bir standart tır? (!) Tüm karakterlerin binary karşılık uzunluğu eşit olmaldıır. Aksi halde saklama ve okuma işlemlerini yapmak mümkün olmaycaktır. Bu sorunu çözmek için bir kaç fonksiyon yazdım. Bilindiği gibi neredeyse hiç kullanılmayan ASCII karakterler vardır. Örneğin 'null' karakteri gibi. Bu karakterin ASCII karşılığı 10 (1010) dur. Bu ve bunun gibi 13 karakteri Türkçe karakterleri kodlamak için kullandım. Böylece Türkçe karakter sorununu adil olmayan yollardan çözmüş oldum ^_^.

  Bir başka önemli sorun ise space( boşluk) karakteri gibi karakterlerin 6 bit ile ifade edilebilmeleridir. Dediğimiz gibi tüm karakterler eşit uzunlukta binary e cevrilmelidirler. (7 - bit). Bu sorunu çözmek ise daha kolay oldu. 6 bitlik karakterlerin başına bir adet '0' biti yerleştirerek bu sorunuda halletmiş oldum. Bu ve bunu gibi ufak tefek sorunlarla boğuşara projemi bitirdim. Orjinal ve stego resim arasındaki 7 farkı bulana kodlarımı verecem :P :D




  Sol: Orjinal Resim        Sağ: 1458 adet karakter içeren taşıyıcı