27 Aralık 2010 Pazartesi

Using diğer bir deyişle Try-Finally

Bu yazımızda using ifadesi nedir, ne değildir, ne yapar onu inceleyeceğim... Yine daha önce olduğu gibi basit bir kod yazarak konunun daha anlaşılabilir olmasını istiyorum.

using System.Data;

namespace Using_TryFinally
{
    class Deneme
    {
        static void Main()
        {
            using (DataTable dt = new DataTable())
            { 
            
            }
        }
    }
}


şeklinde hiçbir şey yapmayan bir kodumuz olsun. Bu kodu Visual Studio (VS) ile konsol uygulaması olarak derlediğiniz zaman ortaya çıkan exe'nin kodunu .NET Framework IL Disassembler (IL DASM) açıyoruz. Bu şekilde aslında arka planda neler oluyor, kodumuz ne hale geliyor onu görmüş oluyoruz. Şimdi VS'nin bizim kodumuzu dönüştürdüğü kodu bir inceleyelim:

.method private hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       29 (0x1d)
  .maxstack  2
  .locals init ([0] class [System.Data]System.Data.DataTable dt,
           [1] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  newobj     instance void [System.Data]System.Data.DataTable::.ctor()
  IL_0006:  stloc.0
  .try
  {
    IL_0007:  nop
    IL_0008:  nop
    IL_0009:  leave.s    IL_001b
  }  // end .try
  finally
  {
    IL_000b:  ldloc.0
    IL_000c:  ldnull
    IL_000d:  ceq
    IL_000f:  stloc.1
    IL_0010:  ldloc.1
    IL_0011:  brtrue.s   IL_001a
    IL_0013:  ldloc.0
    IL_0014:  callvirt   instance void [mscorlib]System.IDisposable::Dispose()
    IL_0019:  nop
    IL_001a:  endfinally
  }  // end handler
  IL_001b:  nop
  IL_001c:  ret
} // end of method Deneme::Main


kod biraz karışık görünüyor olabilirama adım adım incelersek o kadar da karışık bir şey yapmadığını görüyoruz. İlk başta IL_0001 numaralı satırda DataTable objemizin constructor'ı çağırılıyor ve bir altındaki satırda oluşan obje dt isimli değişkenimize aktarılıyor. Daha sonra ise bir try-finally bloğu açılıyor. Biz using ifadesinin içerisine hiçbir şey yazmadığımız için try bloğunun içerisinde hiçbir şey yapılmadığını görüyoruz. Finally bloğunda ise bir şeyler oluyor. Orayı incelediğimizde ise ilk başta yaratılan objemizin null olup olmadığının kontrol edildiğini görüyoruz. Eğer null değilse objemizin Dispose() methodunun çağırıldığını görüyoruz.

Peki biz bu kodu using ifadesini kullanmadan yazmaya kalkarsak ne olur? VB aynı kodunu oluşturur mu onu deneyelim şimdi de. C# kodumuz şöyle olmalı:

using System.Data;

namespace Using_TryFinally
{
    class Deneme
    {
        static void Main()
        {
            DataTable dt = new DataTable();

            try
            {

            }
            finally
            {
                if (dt != null)
                    dt.Dispose();
            }
        }
    }
}


bu kodu derledikten sonra ortaya çıkan .exe'ye IL DASM ile bakıyoruz.

.method private hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       31 (0x1f)
  .maxstack  2
  .locals init ([0] class [System.Data]System.Data.DataTable dt,
           [1] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  newobj     instance void [System.Data]System.Data.DataTable::.ctor()
  IL_0006:  stloc.0
  .try
  {
    IL_0007:  nop
    IL_0008:  nop
    IL_0009:  leave.s    IL_001d
  }  // end .try
  finally
  {
    IL_000b:  nop
    IL_000c:  ldloc.0
    IL_000d:  ldnull
    IL_000e:  ceq
    IL_0010:  stloc.1
    IL_0011:  ldloc.1
    IL_0012:  brtrue.s   IL_001b
    IL_0014:  ldloc.0
    IL_0015:  callvirt   instance void [System]System.ComponentModel.MarshalByValueComponent::Dispose()
    IL_001a:  nop
    IL_001b:  nop
    IL_001c:  endfinally
  }  // end handler
  IL_001d:  nop
  IL_001e:  ret
} // end of method Deneme::Main


iki tane fazla üretilen nop komutundan (IL_000b ve IL_001a satırlarında) başka farklılık olmadığını görüyoruz. Nop komutu da aslında bir işlem olmadığından dolayı aslında üretilen iki kodun da birbiri ile aynı olduğunu görüyoruz.

Using ifadesi ile Try-finally bloğu bu şekilde kullanıldığında birbirleriyle tam olarak aynı işlemi yaparlar. Hangisini kullanmak isterseniz kullanabilirsiniz buradan o sonuç çıkıyor. Benim tavsiyem kodun okunabilirliği açısından using kullanmak olacak...

23 Aralık 2010 Perşembe

Windows Server 2008 Cluster With Virtual PC

Merhaba,

bu yazıma başlamadan önce dün benimle birlikte yazmaya başlayan iş arkadaşım,can dostum güzel insan Ogün'e hoşgeldin demek istiyorum.Aslında bu yazıyı aceleye getirip şuan yazmamın da sebebi bu :) Bu yüzden fazla ayrıntıya girmeyeceğin zaten bu konuyla ilgili birçok güzel kaynak internette bulunmakta.Bunlardan bir kaçının linkini vereyim belki bu yazıyı okumayı çok istemiyorsunuzdur :)

ÇözümPark'tan Alper Özdemir'in yazısı ve yine ÇözümPark'tan Serhat Akıncı'nın yazıları:

http://www.cozumpark.com/blogs/windows_server/archive/2010/01/17/windows-server-2008-cluster-mimarisi.aspx

http://www.serhatakinci.com/index.php/tag/windows-server-2008-cluster

Gelelim benim bu konuda söylemek istediklerime.Bu işlerde aşırı çaylak bir eleman olarak takıldığım birçok konu oldu kurulum sırasında yada her zaman olduğu gibi ince ayrıntılar.Mesela ben sanal makinalarla 2 node'lu bir cluster yapısı kurmayı amaçlıyordum böyle örneklere vardı fakat windows 7 üzerinde virtual pc kullanarak yapılan bir örnek bulamadım ve haliyle hep sorunlar ve ince detayları bilmemekten kaynaklanan küçük problemler...

Neyse lafı çok uzatmıcam ve bu konuda cluster şudur bu budur gibi açıklamalara girmeyeceğim çünkü internette bir sürü kaynak var.Gelelim benim başarılı olduğum sistem ve kaynağa.Öncelikle Virtual PC ile 4 tane sanal makina oluşturuyoruz.İlk 2 sanal makinamız Node1 ve Node2,üçüncüsü SCSI Server, ve son olarak da bir Active Directory sanal makinası kuruyoruz.Daha sonra SCSI Server olarak kurduğumuz sanal makinaya Starwind programını kuruyoruz.Ortam şartları artık hazır.Devamını aşağıda verdiğim linkteki pdf i indirerek görsel şekilde anlayarak uygulayabilirsiniz.Kolay gelsin...

Starwind programını indirmek için  --> http://www.starwindsoftware.com/

Kaynak pdf --> www.starwindsoftware.com/images/content/StarWind_MSCluster2008.pdf

String.Empty ve "" karşılaştırması

benim için beklenmedik bir şekilde performans açısından kazanan string.empty!

bugün aşağıdaki örnekteki str1 ve str2 değişkenlerinin durumunu ve bir farkı olup olmadığını inceleyeceğiz.


class StringDeneme
{
static void Main()
{
string str1 = string.Empty;
string str2 = "";
}
}


yukarıdaki kodu console projesinde derleyip oluşan .exe'mizi ildasm ile incelediğimizde şu kodu görüyoruz:


.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 14 (0xe)
.maxstack 1
.locals init ([0] string str1, [1] string str2)
IL_0000: nop
IL_0001: ldsfld string [mscorlib]System.String::Empty
IL_0006: stloc.0
IL_0007: ldstr ""
IL_000c: stloc.1
IL_000d: ret
} // end of method Program::Main


str1 değişkenimize string [mscorlib]System.String::Empty değeri atanmış (ldsfld) yöntemiyle.
str2 değişkenimize "" değeri atanmış (ldstr) yöntemiyle.

msdn'nden ldsfld'nin açıklamasına baktığımızda: gelen değeri direkt olarak değişkene atadığını görüyoruz. yani str1 değişkenine direkt olarak string.empty değeri atanmış.

ldstr'nin açıklamasına baktığımızda ise: gelen değer için bir string objesi yaratılıp değişkene atandığını öğreniyoruz. yani str2 değişkenine atanmak üzere bir string objesi yaratılıyor.

.NET Reflector yardımı ile mscorlib içinden [mscorlib]System.String::Empty değerine baktığımızda ise string class'ının constructor'ında Empty değeri olarak "" atandığını görüyoruz.


static String()
{
Empty = "";
WhitespaceChars = new char[] {
'\t', '\n', '\v', '\f', '\r', ' ', '\x0085', '\x00a0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', '​', '\u2028', '\u2029', ' ', ''
};
}


kodunu görüyoruz. Yani aslında str1 = "" demiş oluyoruz. bana string.empty yöntemi çok daha maliyetli geldi... demiştim fakat performans testlerim sırasında string.empty yönteminin hep daha performanslı olduğunu gördüm. bunun üzerine ldsfld ve ldstr'yi araştırınca ldstr'de string objesinin yaratılmasından ötürü bu farkın oluştuğunu öğrenmiş oldum.

performans testi sonuçları 10.000.000 deneme için şu şekilde, str2 = ""; ifadesini oluşturmak hep daha fazla zaman almış:


/* -------- Deneme 1 -------- */
Name Time (msec)
StringDeneme.str2 4.627,05
StringDeneme.str1 4.282,18
/* -------------------------- */

/* -------- Deneme 2 -------- */
Name Time (msec)
StringDeneme.str2 4.816,66
StringDeneme.str1 3.765,69
/* -------------------------- */


kaynaklar:
OpCodes.Ldsfld Field
OpCodes.Ldstr Field
OpCodes.Stloc Field
OpCodes.Nop Field
OpCodes.Ret Field

22 Aralık 2010 Çarşamba

TC Kimlik No Algoritması

Oluşabilecek tüm kimlik numaralarını hesaplayan algoritmayı aşağıda bulabilirsiniz. Bu sayede tam hatırlayamadığınız bir kimlik numarasını bulabilirsiniz mesela. Ben bu yüzden kullanmıştım bu algoritmayı.


for (int a1 = 1; a1 < 10; a1++)
for (int a2 = 0; a2 < 10; a2++)
for (int a3 = 0; a3 < 10; a3++)
for (int a4 = 0; a4 < 10; a4++)
for (int a5 = 0; a5 < 10; a5++)
for (int a6 = 0; a6 < 10; a6++)
for (int a7 = 0; a7 < 10; a7++)
for (int a8 = 0; a8 < 10; a8++)
for (int a9 = 0; a9 < 10; a9++)
{
int tekBasamaklar = a1 + a3 + a5 + a7 + a9;
int ciftBasamaklar = a2 + a4 + a6 + a8;
int t1 = (tekBasamaklar * 3) + ciftBasamaklar;
int c1= (10 - (t1 % 10)) % 10;

int t2 = c1 + ciftBasamaklar;
int t3 = (t2 * 3) + tekBasamaklar;
int c2 = (10 - (t3 % 10)) % 10;

string tc = String.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}", a1, a2, a3, a4, a5, a6, a7, a8, a9, c1, c2);
Console.WriteLine(tc);
}

ya da bu algoritmayla biraz daha oynayıp şu şekilde işler yapabilirsiniz:


/// Girilen 9 basamaklı sayının son iki basamağını bulup TC Kimlik No oluşturur
string tc = Console.ReadLine();
int[] digit = new int[9];
for (int i = 0; i < 9; i++)
digit[i] = Convert.ToInt32(tc.Substring(i, 1));

int tekBasamaklar = digit[0] + digit[2] + digit[4] + digit[6] + digit[8];
int ciftBasamaklar = digit[1] + digit[3] + digit[5] + digit[7];
int t1 = (tekBasamaklar * 3) + ciftBasamaklar;
int c1 = (10 - (t1 % 10)) % 10;

int t2 = c1 + ciftBasamaklar;
int t3 = (t2 * 3) + tekBasamaklar;
int c2 = (10 - (t3 % 10)) % 10;

string result = String.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}", digit[0], digit[1], digit[2], digit[3], digit[4], digit[5], digit[6], digit[7], digit[8], c1, c2);
Console.WriteLine(result);

30 Ekim 2010 Cumartesi

OpenSSL

Öncelikle OpenSSL hakkında genel bir bilgi vermek gerekir. OpenSSL ile ilgili genel ve güzel bir yazı var onu paylaşıp daha sonra windows sistemi altında OpenSSL sertifikası nasıl üretilir ve diğer aşamalarını yazacağım.

OpenSSL nedir?
OpenSSL projesi güvenliği geliştirmek için çaba harcayan ticari, geniş özellikli ve açık kaynak kodlu, Güvenli Soket Katmanı (SSL v2/v3), İletim Seviyesi güvenliği (TLS v1) protokollerini uygulayan, çok güçlü genel amaçlı bir şifreleme kütüphanesidir. Bu proje bütün dünyada iletişim, plan ve OpenSSL araçlarını geliştirmek için interneti kullanan gönüllüler topluluğu tarafından yönetilir.
Bilindiği üzere SSL sertifikaları global firmalar tarafından oldukça yüklü rakamlara (Ücretlere) üretiliyorlar. Aslinda bu sertifikaları kendimiz üretmek mümkün, bunun için kendiniz sertifika sunucusu kurabilir ve işletebilirsiniz. OpenSSL organizasyonu burada devreye giriyor, ve bir kaç küçük program ile kendi sertifikalarınızı üretmenize olanak veriyor.

Neden o zaman GlobalSign , VeriSign gibi kurumlara 100 lerce dolar ödeniyor?
Bunun başlıca sebeplerinden birisi güvenlik, diğeri ise üst taraflarda dönen anlaşmalar. Browserlar belirli kurumlar dışındaki (akredite kurumlar) üretilen sertifikaları güvenli bulmayıp kullanıcıya hata mesajı vermektedir.
SSL'i örneklendirirsek biraz daha rahat anlaşılabilir. Bir işiniz var halletirmek istiyorsunuz ve halledeceğiniz yere gittiğinizde karşınıza çıkan görevliye, ben filan patronun selamıyla ve imzasıyla geliyorum diyorsunuz. Eğer karşıdaki adam patronu biliyorsa imzaya bakıp tamam bu güvenilir bir adam ve selamda geçerlidir diyecek ve sizde böylelikle rahatlıkla işinizi yaptırabileceksiniz.
Aynı şekilde, siz bir e-ticaret sitesi yapıp kullanıcıya güvenli hat gerektiren ödeme gibi bir hizmet vermek istiyorsunuz. SSL sertifikanızı GlobalSign, VeriSign gibi firmalardan aldığınızda, başkası bu sertifikayı taklit edemeyeceği için sisteminizi kullanan müşteri sertifika detaylarında hem siteniz kime aitmiş hemde yukarıda kimin tarafından akredite edilmiş bilgisine ulaşacak, hımm bu patron'un (Verisign) bilgisi ve imzası ile geldiyse bu güvenilir biridir diyecektir.
Kendi kendizine sertifika ürettiğinizde sorun burada başlıyor. Eğer OpenSSL gibi bir sistem ile ürettiyseniz sertifikanızı karşıdaki adama gösterdiğiniz imza kendi imzanız olacaktır. Yani adama diyorsunuzki, ben kendi selamım ve imzam ile geldim, patron benim. Burada inanıp inanmamak kullanıcıya kalıyor. 
Bu yüzden son kullanıcıya hizmet verecekseniz mutlak surette üst güvenlik kurumlarından imza (sertifika almalısınız). Eğer kendi kurum içinizde uygulama yapacaksanız sertifikayı kendiniz üretip kara geçebilirsiniz. Mesela kendiniz bir mesajlaşma sunucusu ve programı yazdığınızda, sunucuda programda aynı yapıda sertifikalar kullanıp ucuz ve güvenilir mesajlasma yapabilirsiniz.

Alıntı : http://www.bybilgi.com/openssl-t-2115.html

Windows ile OpenSSL Sertifikası Yaratmak

Şimdi windows altında OpenSSL sertifikası nasıl yaratılır bakalım. Öncelikle aşağıdaki adres OpenSSL'in işletim sisteminiz için uygun versiyonunu indirin.

http://www.slproweb.com/products/Win32OpenSSL.html

OpenSSL'i indrip makinamıza kurduk.Kurulum sonrası OpenSSL'in nereye kurulduğundan emin olmak için C:\ altında nereye kurulduğuna bakalım.İşletim sisteminize göre "C:\OpenSSL-Win64" gibi bir uzantı olucaktır büyük ihtimalle.Dosya uzantısından emin olduktan sonra Çalıştır'a gelerek "cmd" komutu vererek komut satırını açıp işlemlere başlıyoruz.

Öncelikle komut satırında aşağıdaki komutu girerek openssl'in kurulduğu uzantıda bin klasörü içine gidiyoruz.

*cd c:\openssl-win64\bin 

Şimdi bu dosya komundaki openssl.exe'yi kullanarak Root CA için bir özel anahtar oluşturacağız.(Root CA- Yerel Bilgisayarımızdaki en üst sertifika birimidir.Açılımı CA->certification authority)Bu özel anahtarı da aşağıdaki komut ile oluşturuyoruz.Bu komutta des3 şifreleme algoritması ile 2048 bitlik bir anahtar oluşturuyoruz.İhyitaca göre algoritma ve şifreleme bit uzunluğu değiştirilebilir.

*openssl genrsa -des3 -out ca.key 2048

Şimdi ise yine Root CA için bir genel anahtar oluşturucağız.Burada "-days" ten sonraki 365 bu sertifikanın kaç gün geçerli olacağını gösterir ve ihtiyaca göre değiştirilebilir.Ayrıca bu satırdan sonra bize sertifikamız ile ilgili bilgileri sorucaktır ve doldurmamızı isteyecektir.

*openssl req -new -x509 -days 365 -key ca.key -out ca.crt

Bu aşamaya kadar başarılı bir şekilde gelebildiysek Root Ca için sertifikamızı oluşturduk demektir.Oluşan sertifikayı yine Openssl'i yüklediğimiz uzantının bin klasörü içinde bulabiliriz.(C:\OpenSSL-Win64\bin , ca.crt)

Şimdi ise sunucumuz için sunucu sertifikası olarak geçen bir ara sertifika oluşturup imzalayacağız.(Intermediate Certificate). Öncelikle sunucumuz için de yine bir özel anahtar oluşturuyoruz.

*openssl genrsa -des3 -out server.key 2048

Şimdi ise Root CA'dan gelen sertifikayı imzalamak için bir sertfika yaratıyoruz.Bu aşamadan sonra yine bize sertifika bilgilerimizi sorucak ve bu aşamada son iki soruyu (challenge password ve optional componay name) boş geçebiliriz.

*openssl req -new -key server.key -out server.csr

Bu satırda ise sunucumuz için bir genel anahtar oluşturuyoruz.Yine bu satırdaki 365 bizim sunucu sertifikamızın geçerli olacağı gün sayısını belirtmekte ve bu sayıyı değiştirebilmekteyiz.

*openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

Genel olarak Sunucu ve Root CA için anahtarlarımızı oluşturduk.Şimdi ise signtool(Cab dosyası imzalama aracı) ve IIS için kullanabileceğimiz kombine bir sertifika oluşturuyoruz.Burada sunucu özel anahtarımızı ve genel anahtarını bu sertifikaya gömüyoruz.

*openssl pkcs12 -export Certificate.pfx -inkey server.key -in server.crt

Bu son satırdan da sonra şuan "C:\OpenSSL-Win64\Bin" klasörü içinde Certificate.pfx isimli ,IIS ve dosya imzalamada kullanabileceğimiz bir sertifikamız var.

Peki bu sertifika ile nasıl cab dosyası veya dll imzalarım?

Öncelikle bu sertifikaların yerel makinamızda tanınması gerekiyor.Bunun için öncelikle istersek Internet Explorer'dan;

->Internet Options -> Content -> Certificates  .... bölümüne gelerek aşağıdaki uzantılı sertifikaları gösterdiğim birimlere ekleyebilirsiniz fakat ->Run -> MMC -> Files -> Add/Remove Snap in ... ile sertifikaları yerel makinamıza tanıtabiliriz.

ca.crt -> Trusted Root Cetification bölümüne kuruyoruz.
server.crt -> Intermediate Certification bölümüne kuruyoruz.
Certificate.pfx -> Personal bölümüne kuruyoruz.

Daha sonra yine ilk olarak komut satırına giriyoruz.Daha sonra "Platform sdk" nerede yüklü ise o konuma gidiyoruz aşağıdaki satırla.

*cd c:\Program Files\microsoft platform sdk\bin

Daha sonra aşağıdaki satırı girerek imzalama sihirbazını açıyoruz ve gerisi zaten sihirbazdan :)

*signtool signwizard

Sertifikamızı IIS'e Eklemek

Ayrıca sertifikamızı IIS'e eklemek istersek Server Certificates bölümünden .pfx uzantılı sertifikamızı import diyerek ekliyoruz.Daha sonra IIS2de sitemize gelerek sağ taraftaki toolbar'da "bindings" bölümünden "https" olarak ekliyoruz ve herşey bitiyor...

15 Ağustos 2010 Pazar

Kerberos

Kerberos Nedir?
Athena Projesinin bir parçası olarak MIT'de geliştirilen kimlik denetim sistemidir.Adını Yunan mitolojisindeki Yeraltı’nı koruyan üç başlı köpekten alır. Bu üç başlı köpeği şunlar temsil eder; istemci, servis sağlayıcılar ve kimlik doğrulama merkezi.
 

Kerberos güvensiz bir ağda güvenli hostlar için kullanılan bir kimlik doğrulama protokolüdür.Simetrik şifrelemeyi kullanılır.




Peki Kerberos'un Amacı Nedir?

Kerberos genel olarak şu amaçları gerçekleştirmeyi hedefler.
  • Kullanıcının şifresi ağ üzerinde asla iletilmemeli

  • Kullanıcının şifresi kullanıcı tarafında asla kaydedilmemelidir, kullandıktan sonra atılmadır.

  • Kullanıcının şifresi, şifrelenmeden asla veritabanında tutulmamalıdır

  • Kullanıcı her oturum için yalnız bir kere şifre girişi yapar. Yani şifre bir kere onaylandıktan sonra oturum sonuna kadar geçerli olacaktır (Single Sign-On)

  • Kimlik doğrulama bilgileri kimlik doğrulama sunucusu üzerinde bulunur. Uygulama sunucusu kimlik doğrulama bilgileri içermez.Bu yöntem aşağıda verilen sonuçlar için gereklidir:

  1. Sistem yöneticisi bir hesabı tek noktadan tüm servisler için etkisiz hale getirebilir
  2. Kullanıcı şifresini değiştirdiğinde aynı zamanda tüm servisler için de değişecektir
  3. Bilginin tek yerde tutularak korunması,birçok yerde korunması ihtiyacını ortadan kaldırır.
  • Sadece istemci kim olduğunu ispat etmek zorunda değildir,aynı şekilde uygulama sunucuları da kim olduğu ispat etmek zorundadır(istemci tarafından istenirse).Bu ilke de karşılıklı kimlik doğrulama olarak bilinir.
  • Kimlik doğrulama ve yetkilendirmenin ardından kullanıcı ve servis sunucusu şifreli bir bağlantı kurabilmelidir. Bu nedenle Kerberos şifreleme anahtarının üretilmesini ve dağıtılmasını sağlar.

Son olarak Kerberos'un bazı bileşenlerinden ve bazı terimlerinden bahsedeyim...

Key Distribution Center (KDC)

Kimlik doğrulamayı sağlayan sunucudur. Mantıksal olarak 3 bölüme ayrılır.
1.Veritabanı

Kullanıcılar ve servislerin kayıtlarının tutulduğu birimdir. Bilgiler Master Key denilen anahtarla şifrelenmiştir Her kayıtta şu bilgiler bulunur :

  • Kayıtla ilgili principal
  • Şifreleme anahtarı ve kvno
  • Biletlerin yaşam süresi bilgileri
  • Şifrenin son geçerlilik tarihi
  • Principal’ın son geçerlilik tarihi
2.Authentication Server (AS)
Kimlik doğrulama isteklerine cevap veren birimdir Oturum boyunca tüm servislere istekte bulunabilmeyi sağlayan Ticket Granting Ticket(TGT)’ı ve TGS ile haberleşmeyi sağlayan Session Key’i üretir.
3.Ticket Granting Server(TGS)

Kullanıcının servislerle haberleşmesini sağlayan biletleri üretir. Bu biletler servislerin gizli anahtarlarıyla şifrelendiği için kimliği doğrulanmamış kimse servislere erişemez.

Session Key
  • Kullanıcılar ve sunucu servisleri gizli anahtarlarını KDC ile paylaşırlar ve bu anahtarlar uzun sürelidir.
  • Sunucu ve kullanıcıların kendi aralarında şifreli olarak haberleşmeleri için ortak bir anahtara ihtiyaçları vardır.
  • Bu anahtarlar KDC tarafından rastgele üretilir ve özel anahtarla şifrelenerek istemci ve servis sunucularına yollanır.

10 Haziran 2010 Perşembe

MATLAB ile Voice/Unvoice

Bir arkadaşa yardım için basitçe hazırladığım matlab programı. Wav uzantılı sesi alarak 2 tür işlemden geçiriyor ve Ses'te konuşma olup olmadığını tespit ediyor.Bu 2 yöntem Zero Crossing Rate ve Short-Time Energy. Bu konularla ilgili internette pek çok kaynak bulunmakta. Matlab ile amatörce geliştirdiğim kod ise şöyle:

% İlk Giriş Wav Dosyasının Alınması
fn=input('\nWav dosyası ismi girin : ','s'); 
[x,Fs]=wavread(fn);   % wav dosyası okunuyor
                         % x:giriş    fs:frekans
x=x.';
fprintf('Frekans : %g\n',Fs);
%----------------------------------------------------------------
% Zero Crossing Rate - Sınır Kesit Oranı
M = length(x) - 1;               
x1 = x(1:end-1);
x2 = x(2:end);
xp = x1 .* x2;
I = (xp < 0);
zc = sum(I) / M;
fprintf('Zero Crossing Rate : %g\n',zc);
if(zc>0.07)
    fprintf('ZCR ye göre İnsan Sesi Var(Voice)\n');
else
    fprintf('ZCR ye göre İnsan Sesi Yok(Unvoice)\n');
end
%----------------------------------------------------------------
% Shortime-Energy - Kısa Süreli Enerji Hesabı
N=length(x);
s=cos(2*pi*N/N-1*[0:N-1]');
h=0.54-0.46*s;
E=x*h.^2;
fprintf('Short-Time Energy : %g\n',E);
if E>3
    fprintf('STE ye göre İnsan Sesi Var(Voice)\n');
else
    fprintf('STE ye göre İnsan Sesi Yok(Unvoice)\n');
end
%----------------------------------------------------------------
% Giriş Sesi, Zero Crossing Rate ve Short-time Energy Grafikleri
t=(0:length(x)-1)/Fs;
subplot(3,1,1);
plot(t,x);
title('Kontrol Edilecek Olan Ses Dalgasının Genlik-Zaman Grafiği')
legend('Dalga Şekli');
xlabel('Zaman (s)');
ylabel('Genlik');
subplot(3,1,2);
plot(t,zc);
title('Zero Crossing Rate Grafiği');
legend('ZCR');
xlabel('Zaman (s)');
subplot(3,1,3);
plot(t,E);
title('Short-time Energy Grafiği');
legend('STE');
xlabel('Zaman (s)');

29 Mayıs 2010 Cumartesi

C# ile Yüz Bulma ve Tanıma

Aylardır uğraştığım yüz tanıma sistemi tezimi nihayet bitirdim.Lafı uzatmadan hemen yaptığım uygulamadan bahsedeyim.


Öncelikle yaptığım yüz tanıma sistemini gerçekleştirmek için donanımsal ve yazılımsal olarak en düşük sistem gereksinimleri şunlar. 
—Donanımsal Gereklilikler
İşlemci:        Pentium III veya üstü
Bellek:         128 MB
Hard Disk:   4GB veya üstü
Monitör:       14”SVGA         

—Yazılımsal Gereklilikler
İşletim Sistemi:                             Microsoft Windows NT/2000 veya üstü
Paket:                                            Microsoft Visual Studio 2008 veya 2010
Kullanılan Programlama Dili:       C#.Net

Proje iki bölümden oluşuyor. Yüz Bulma(Face Detection) ve Yüz Tanıma(Face Recognition).

Yüz Bulma 
Kameradan görüntü alındıktan sonra yüz kesitini bulmak için iki farklı yöntem kullandım. Birincisi yüz temsili siyah-beyaz tonda resim kullanımı. Yani elimizde bulunan bir yüz temsili siyah beyaz resim ile görüntünün siyah beyaza çevrilmiş hali karşılaştırılır ve görüntü içinde yüz temsiline uyan noktalar aranır. Aslında sadece bu metot ile belli bir başarım yakalayabildim. Fakat kesin bir başarım olmadı. Çünkü yüz temsiline yakın şekiller kamera görüntüsüne girdiğinde bu şekilleri yüz olarak nitelendirmektedir.Bu yüzden ikinci bir metot ten rengi metodu kullandım.Ten rengi metodunda ise insan ten rengine yakın renkler bulunmaya çalışılmaktadır. Yani kamera görüntüsünde ten rengi yakalamaya çalışılmaktadır. Bu yöntem de ilk zamanlar tek başına kullanılmış fakat görüntüde sadece yüz kısmı olmayacağı, ya da siyahi veya beyaz ten renkleri olması gibi sebeplerden dolayı yine kesin sonuç verememiştir. Sonuç olarak en etkili yöntem olarak bu iki yöntemi bir arada kullandım. Bu sayede çok daha kesin sonuçlar elde ettim.


Yüz Tanıma
Yüz tanıma kısmını Yapay Sinir Ağları(YSA) ile gerçekleştirdim. YSA' yı C# ile uygulayabimek için "neuralnetwork" hazır kütüphanesini kullandım.


C# için neural network kütüphanesine aşağıdaki adresten ulaşabilirsiniz:


http://franck.fleurey.free.fr/NeuralNetwork/ 


Sistemin Mantıksal Tasarımı


Uygulmanın mantıksal tasarım akışı :
  • Giriş resminin sisteme alıması
  • Resmin hazır hale getirilmesi
  • Resme önişleme uygulanması
  • Eğitim ve sinir ağlarına yükleme
  • Resim tanıma




Kullanılan YSA' nın Ağ Mimarisi

Bu çalışmada kullanılan ağ mimarisinde, katmanlar ve nöronlar olarak bakıldığında bileşen ve sayıları aşağıda verilmiştir.

Gizli Katman Sayısı: 2
Giriş Katmanı Nöron Sayısı: 25*25=625
Gizli Katman 1’deki Nöron Sayısı: 96
Gizli Katman 2’deki Nöron Sayısı: 144
Çıkış Katmanı Nöron Sayısı: 5

            Burada giriş nöron sayısı eğitime girecek resimler için tasarlandığından dolayı ve eğitime girecek resimler 25*25 piksel olduğundan her piksel için bir giriş olarak tasarlanmıştır.


C# Programlama Dili ile Arayüz Tasarımı

Programın arayüzü Visual Studio 2010 paketi ile hazır araçlar kullanılarak yapılmıştır. Program arayüzü dört bölümden oluşmaktadır. Birinci bölümde kamera görüntüsü ve yüz kesiti bulma işlemi gerçekleştirilmektedir. İkinci bölümde veritabanından resim yüklemesi yapılmaktadır. Üçüncü bölümde resimler eğitime girdirilmektedir. Son bölümde ise yüz tanıma işlemi gerçekleştirilmektedir. Ayrıca program akışını izleyebilmek için bir akış listesi en alt bölümde bulunmaktadır.



Yapay Sinir Ağları ile ilgili bilgi almak isterseniz türkçe kaynak olarak özellikle başlangıç olarak muhakkak Ahmet Kakıcı' nın kişisel sitesini ziyaret etmelisiniz. YSA' yı anladıktan sonra neuralnetork kütüphanesinin bulunduğu sitede uygulanması içeriği hakkında yeterli bilgi mevcut.Ben ışık değişimleri için herhangi filtreler kullanmadım bu yüzden ışıktan çok etkileniyor ve başarım oranı düşüyor. Fakat aynı kütüphane kullanılarak ve ışık değişimleri için fitreler kullanılarak başarım oranı çok daha yüksek bir sistem gerçekleştirilebilir.... 

Proje çalıştırılabilir dosyası indirmek için :  İNDİRMEK İÇİN TIKLAYIN

8 Mayıs 2010 Cumartesi

Metinler İşaret Diline Dönüşüyor


GANAS Projesi kapsamında metinleri anında işaret diline dönüştüren bir görsel çevirmen geliştiriliyor.

Proje, işitme engellilerin halka açık olan yerlerde paylaşılan bilgileri anlayarak hayatlarını kolaylaştımak üzere tasarlandı. Proje ile hava alanları, okullar, sinemalar, televizyon ve internet sitelerinde çeviri servisleri sağlanmaya başlanabilecek. 


NDRA,  Castilla-La Mancha Üniversitesi ve Adecco Vakfı ile ortaklaşa yürüttüğü GANAS Projesi (İşaret Dili için Otomatik Animasyon Üretimi Projesi) kapsamında işitme engelliler için metinleri işaret diline dönüştüren bir çevirmen geliştiriyor. Proje ile işitme engellilerin sosyal yaşama dahil olması ve çevrelerindeki bilgilere erişebilmeleri hedefleniyor. Sonuç olarak metinler bir bilgisayar yardımı ile üç boyutlu karakterler kullanılarak işaret diline dönüştürülüyor.

Proje 3 modülden oluşuyor.

Gerçek çevirmenin videosu yol gösterici olarak kabul edildiğinde, düzenleme modülü üç boyutlu karakterin vücut hareketlerini ve yüz mimiklerini yeniden üretebilmek için çevirmenin tüm kemiklerinin pozisyonunu ve rotasyonunu hesaplamak zorundadır.
Bu hareketler ve mimikler işaret dilinde bir cümle yaratmak için sonradan birleştiriliyor ve bu şekilde farklı görsel karakterler yoluyla diğer cümlelerde yeniden kullanılabiliyorlar.

Projenin bir diğer avantajlarından biri de; hava alanları, istasyonlar, okullar, iş ve işçi bulma ofislerinde veya turizm alanında kullanılan bilgi ekranlarından paylaşılanların işitme engelliler tarafından da anlaşılır olmasına yardımcı olmasıdır. Ayrıca televizyon kanalları, sinemalar ve internet siteleri için de çeviri hizmetleri sunmaktadır. Bu hizmetler  sayesinde işaret dilini de öğrenmek mümkündür.



DNSSEC


İlk uyarı için birkaç gün geç kaldım fakat haberin içeriği önemli paylaşmak istedim...


5 Mayıs'ta internet bağlantınızla ilgili büyük problemler yaşaya bilirsiniz..

Bütün internet kullanıcılarını etkilemesi beklenen DNSSEC sisteminin ilk aşamasına 5 Mayıs'taICAN, ABD Hükümeti ve Verisgn yönetiminde geçilecek. İnternet kullanıcıların güvenli sitelere kavuşturmayı amaçlayan bu proje kapsamında Çarşamba günü Dünya genelinde internet ulaşımında çeşitli sorunlar yaşanabilir. İşte ayrıntılar...

Domain Name System Security Extensions yani DNSSEC
; birçok internet kullanıcısının yakından ilğilendiği Domain Name System (DNS) ve Internet Protocol (IP) sistemleri tarafından sunulan bilgilerin daha güvenli hale getirilmesini amaçlayan ve bu yönde yenilenen sistem için kullanılan bir terim.

DNSSEC'i biraz daha açarsak ne demek istediğimiz çok daha net anlaşılacaktır. Bu yeni sistemle DNSSEC tüm DNS sunucularından gelen yanıtlara dijital bir imza ekleyecek ve böylece internet kullanıcıları ziyaret etmekte oldukları sitenin alan adının herhangi bir aldatmaca için kullanılmadığını ve güvenli olduğunu kolaylıkla tespit edebilecekler. 

DNSSEC'in güvenlik açısından sağladığı faydalarDNSSEC'i yeni bir IP sistemi olarak algılamamak gerekiyor. Çünkü DNSSEC'in amacı DNS'ye birden fazla yeni özellik katarak geliştirmek. Bu yeni özelliklerin amacı ne derseniz? Hemen açıklayalım; internet kullanıcıları ve wep siteleri arasındaki haberleşmeyi hedef alan "man in the middle" saldırısına karşı sıkı tedbirler almak.

Güvenli SSL sertifikası kullanılmadığı durumlarda tehlike yaratabilen bu saldırı tanımlamak gerekirse ise;
İstemci yani internet kullanıcısı ve sunucu birnevi ulaşılmak istenen wep sitesi ile haberleşirken araya giren hacker'lar iletişime sızarak, istemci ve sunucuya kendi istedikleri bilgileri gönderiyor ve iletişimin kendi istedikleri şekilde yönlendiriyorlar. İşte bu yeni IP sistemiyle bu durumun önüne geçilecek.

Peki, DNSSEC bu sızmaları nasıl mı engelleyecek? İşte bu sorunun cevabı; İstemci ve sunucu arasında dijital imza transferi ile sorunu çözmeyi hedefleyen DNSSEC bu yöntem ile araya girebilecek art niyetli kişilerin iletişimi kendi istedikleri gibi değiştirmesini engelleyecek.

İşte bu dijital imzalar sorun yaratabilir. Nasıl mı?
Güvenliği hat safaya çıkaracak bu sistemin getirisi kadar götürüsüde olabilir. Hacker'ları iletişime sızmasını engelleyen dijital imza istemci ve sunucu arasında küçük bir dosya transferiyle gerçekleşecek. Bazı durumlarda 2 KB'a kadar bir büyüklüğe ulaşabilmesi beklenen bu transfer dünya genelinde yaşancağı için internette genel anlamda bir yavaşlamaya neden olabilir..
Diğer bir sorun ise tüm büyük internet servis sağlayıcılarının (İSS) hazır bulundukları bu değişim için küçük İSS'lerin ne derece hazır olduğunun bilinmemesi. Bu bağlamda da uzmanlar bu yüzden5 Mayıs'ta bazı ciddi bağlantı sorunları yaşanabileceğini belirtiyorlar.

Yine küçük bir ayrınıtıyı bilmekte fayda var. Her bilgisayarın ayarları ve özellikleri farklı olduğu için yan yana duran iki makineden biri sağlıklı bir şekilde çalışırken, diğerinin sorun yaşayabileceği gibi anlaşılması zor bir durumunla karşı karşıya kalabilirsiniz.

Bu noktada da kullanıcılar yeterince bilgilendirilmediği için genel bir karmaşıklığın çıkması mümkün. 5 Mayıs'ta buna benzer bir sorun yaşarsanız ve bir çözüm yolu bulamassanız tavsiyemiz internet servis sağlayıcınızı arıyarak konuyla ilgili bilgi alıp ona göre hareket etmeniz.

25 Mart 2010 Perşembe

Yüz Tanıma Sistemi - 6

C# Kameradan Görüntü Alma

Kameradan görüntüyü almak için "webcam_capture" kütüphanesini kullanıyoruz.Referanslardan dll'i ekledikten sonra. Önce forum kısmına bir picturebox ve bir buton ekleyelim.Daha sonra "Kamera" adında bir sınıf oluşturuyoruz.Bu sınıf kod içeriği şöyle ;

using System.Data;
class Kamera

{
 private WebCamCapture kameraa;
 private Anaform p;
 PictureBox ilkresim;


public void Kamera_Etkin(Anaform form, int W, int H, PictureBox ilkres)
{
  p = form;
 ilkresim = ilkres;
 kameraa = new WebCamCapture();
 kameraa.CaptureHeight = H;
 kameraa.CaptureWidth = W;
 kameraa.TimeToCapture_milliseconds = 1;
 kameraa.ImageCaptured += new WebCamCapture.WebCamEventHandler(kamera_resim);
} 
public void Start()
{
  kameraa.Start(0);
}
public void kamera_resim(object source, WebcamEventArgs e)
{
  ilkresim.Image = e.WebCamImage;
}
}

Kamera sınıfımızı oluşturduk şimdi anaform'da bir kamera nesnesi tanımlıyoruz ;

using System.Data;
      private Kamera k;

Daha sonra buton tıklama kısmında kamera nesnemize picturbox'ın özelliklerini yollayarak kamera görüntüsünü başlatıyoruz.

using System.Data;
    k = new Kamera();

    k.Kamera_Etkin(this, KameraResim.Width, KameraResim.Height, KameraResim);
    k.Start();

13 Mart 2010 Cumartesi

Yüz Tanıma Sistemi - 5

Sayısal Resim

Sayısal resim bir matrise benzetilebilir. Resmin en küçük elemanına piksel adı verilir. Alttaki resimde görüldüğü gibi M x N boyutunda matris olarak düşünürsek her bir pikselin değeri bir dizinin i ve j' inci terimi olarak ifade edilebilir. En basit durumda pikseller 0 veya 1 değerini alırlar. Bu piksellerden oluşan resimlere binary (ikili)
resim denir.

Monokrom, yani tek renkli resimlerde ise her eleman 0 ile 255 arasında değerler alır. Böylece her pikselin parlaklık değerinin farklı olması ile gri tonda bir resim elde edilir. En parlak nokta 255 beyaz, en karanlık nokta 0 siyah bunların arasındakiler ise gri renk değerlerini alırlar. Renkli resimler ise üç ana rengin karışımı ile oluşurlar. Bunlar kırmızı (Red) ,yeşil (Green) ve mavidir (Blue). Renkli resimler hakkında daha ayrıntılı bilgileri www.goruntuisleme.org adresinde diğer makalelerde bulabilirsiniz..

Kaynak :  http://www.goruntuisleme.org/

11 Mart 2010 Perşembe

Yüz Tanıma Sistemi - 4

Kullanılan Kütüphaneler

Yüz tanıma sistemi geliştirirken kullanabileceğimiz birçok kütüphane var. Genel olarak en yaygını OpenCV kütüphanesi. OpenCV hem açık kaynak olması hem de performans olarak da iyi olduğundan biraz daha önde. Ayrıca Aforge,EmguCv,SharperCV,OpenCVDotNet gibi seçenekler mevcut.

OpenCV ana sayfası : http://opencv.willowgarage.com/wiki/

OpenCV kütüphanesini indirmek için (2.0 Sürümü)  : http://sourceforge.net/projects/opencvlibrary/

Ayrıca OpenCV konusunda BlueKid hocamızın sitesinden çok ayrıntılı bilgi edinebilir ve birçok örnek bulabilirsiniz.(http://derindelimavi.blogspot.com/)

OpenCvSharp C# ile kullanımı gayet kolay olan ve başarımı yüksek bir diğer kütüphane.

Başlangıç olarak kamera görüntüsünde yüz bulma işleminde ben Aforge framework'unu kullandım.Aforge framework'u de gayet kullanışlı ve birçok kütüphaneye sahip. Daha çok bilgi almak ve indirmek için sitesine bir göz atabilirsiniz : http://code.google.com/p/aforge/ .

Diğer kütüphanelere ulaşmak için;

SharperCV : http://www.cs.ru.ac.za/research/groups/SharperCV/

OpenCVDotNet : http://code.google.com/p/opencvdotnet/

The OpenCV Wrapper Project Page  :  http://www.iib-chemnitz.de/cvwrapper/index.php

EmguCV : http://www.emgu.com/wiki/index.php/Main_Page

7 Mart 2010 Pazar

Java Dilinde Küçük Bir Alıştırma

Yüz tanıma sistemine kısa bir ara.Bu aralar yeni yeni uğraşmaya başladığım java dilinde küçük bir örnek program.

Örneğimiz şöyle ;

1'den 100'e kadar sayıları ekrana yazacak bir program yazıyorsunuz. Fakat 3'ün katları için "Noqo", 5'in katları için "Nisqo" ve 3'e ve 5'e tam bölünen sayılar için de "NoqoNisqo" yazacaksınız. Örnek ekran çıktısı:

1
2
Noqo
4
Nisqo
Noqo
7
8
Noqo
Nisqo
11
Noqo
13
14
NoqoNisqo
16
……..
98
Noqo
Nisqo

Kodlarımız da şöyle ;


  public class NoqoNisqo {
    public static void main(String args[]) {

        for (int i = 1; i <= 100; i++)
        {
         if(i%15==0) System.out.print("NoqoNisqo\n");
         else
         if(i%3==0) System.out.print("Noqo\n");
         else
         if(i%5==0) System.out.print("Nisqo\n");
         else
         System.out.print(i+"\n");
        }
        
        System.out.println("Program Kapatiliyor...");
    }
}

Zamanla yine bu tür küçük java alıştırmalarına devam edeceğim. Belki yeni başlayan birilerine daha sonra yardımı olur...

5 Mart 2010 Cuma

Yüz Tanıma Sistemi - 3

Yüz Bulma ( Face Detection)

Yüz tanımaya geçmeden önce en önemli husus bir kamera görüntüsünde yada resim içinde yüz kısmının ayrıştırılması gerekmektedir.

İnsan yüzü kendine özgü rengi ile renk uzayında belli bir aralıkta temsil edilebilmektedir. Bu durum imgeler üzerinde de sadece ışıktan kaynaklanan bir yoğunluk değişimi göstermektedir. Ayrıca, insan teni ayırt edilebilir bir dokusal doygunluğa sahiptir.


Yüz bulma işlemi, öncelikle renk tonu ve doygunluk değerlerinden faydalanılarak ten süzgeci gerçeklenmesi ile başlamaktadır. Özgün imgeden elde edilen değerler bu konuda yetersiz kalmasına karşın negatif imgeden de elde edilen renk tonu ve doygunluk değerleri ile daha kararlı bir süzgeç yapısı oluşturmak gerekir
.
 0 ≤ H ≤ 0.942 , 0.1 ≤ S ≤ 0.69 , 0.25 ≤ Sn

Sn : Negatif imgeye ait doygunluk değeri

Ten süzgeci sonucunda elde edilen siyah-beyaz imge üzerinde iyileştirme amaçlı olarak önce morfolojik işlemler, daha sonra da bağlantısallığa bağlı olarak düzeltme işlemleri uygulanmaktadır. Bu işlemler sonucunda elde edilen imge üzerinde bağlı bileşenler etiketleme metodu uygulanmaktadır. Böylece imge içerisinde olası tüm ten bölgeleri birbirinden ayrıştırılmaktadır. Bu aşamada elde edilmiş imgelerin bir kısmında yüzde yoğunlaşmış ışık ve yansımalardan dolayı bir takım boşluklar oluşabilmektedir. Bunların giderilmesi amacı ile yüz olmaya aday ten bölgelerinin her biri için geliştirilen bir boşluk doldurma algoritması kullanılmaktadır. Bu algoritma basitçe örtülü bir ten bölgesi içerisinde kalan boşlukların ten bölgesine dahil edilmesi işlemidir. Bütün bu işlemlerden sonra ten bölgeleri içerisinden yüze ait olanları ayrıştırmak amacı ile bu bölgelerin her birinde yüz öğeleri aranmaktadır. Bu işlem için imgeye ait şiddet değerlerinden faydalanılmaktadır. Bu gri düzeyi imge üzerinde yatay ve dikey yönde kabartma metodundan faydalanılarak her bir yüz nesnesi tesbit edilebilmektedir. Kabartma metodu uygulanırken gürültüden meydana gelebilecek küçük değişimlerden etkilenmemek için imge üzerinde bazı iyileştirme teknikleri kullanılmaktadır.

İşin mantığını ODTÜ'den Kaan ÖZTEKİN,Mehmet BULUT ve Volkan ATALAY böyle açık ve güzel bir şekilde anlatmışlar.

Bu konuda elimde C# kodu mevcuttur kendi yazdığım isteyenlere yollayabilirim...

4 Mart 2010 Perşembe

Yüz Tanıma Sistemi - 2

PCA Algoritması ve Özyüzler Metodu

PCA algoritması ve Özyüzler metodunun kısaca bir tarihçesine bakalım;

Öz yüzler yaklaşımı ilk olarak Sirovich ve Kirby (Eigenfaces, Principal Component Analysis, PCA, 1987) tarafından kullanılarak yüzü etkin bir şekilde göstermek için uygulanmıştır. Temel bileşen analizi olarak da bilinen Karhunen-Louve genişlemesine dayanmaktadır. Bu, bilgi teorisinde veriyi kodlama ve kodunu çözmede iyi bilinen bir tekniktir. Bu kişiler yüz resimleri gruplarından başlayarak bu resimlerin temel bileşenlerini hesaplamışlardır. Daha sonra da öz vektörün sadece küçük parçalarının ağırlıklı birleşimini kullanılarak yüz resmini yeniden oluşturmuşlardır. (Kirby ve Sirovich, 1990) bu metotlarını 115 yüz resmi veri tabanında test ettiler ve yaklaşık olarak %3 yanılma (hata) payıyla bir yüzü yeniden oluşturmak için sadece 40 öz vektörün yeterli olduğunu göstermişlerdir. Bundan kısa bir süre sonra yüzün simetrisini dikkate alarak (örneğin bütün yüzlerde gözler, burun v.s. aynı bölgede) orijinal metotlarını geliştirdiler. Algoritmayı 87 kişilik bir veritabanında test etmişlerdir.
(Turk ve Pentland, 1991) bu fikri daha da geliştirdi ve ilk tam otomatik sistemlerden birini üretmişlerdir. Kendi sistemlerini 16 kişinin 2500 resmi bulunan bir veri tabanında denemişlerdir. Resimler farklı bas uyumlarını, boyutları, ışıklandırma koşullarından seçilmiştir. Sistemleri, farklı ışıklandırmaya sahip resimler üzerinde %96, farklı bas uyumlarının da %85, farklı görüntü ölçeklerinde %64 doğru sınıflandırma sonuçları elde edilmiştir.

Geçmişte yapılan çalışmalar böyle.Şimdi bu metodu biraz açıklamaya çalışayım.

Görüntü tanıma uygulamalarında kullanılan klasik yöntemlerden temel bilesen analizi (PCA) yöntemini temel alan yöntemlerde yüksek dereceden özniteliklerle ilgilenilmez. PCA, veriyi düşük bir boyuta, verideki değişmeyi koruyacak şekilde eşleyen dikgen bir doğrusal dönüşümdür. İlk temel bilesen verideki en büyük değişme yönündedir ve ikinci bilesen bir sonraki en buyuk değişme yönündedir. PCA ile boyut indirme işleminde, ilk bir kaç temel bilesen kullanılarak verinin değişmesini en çok etkiyen özellikler alınır. Böylelikle daha az miktarda veri kullanılarak, taşınan bilginin büyük kısmı korunur. Sağladığı avantajlar, hızlı ve hesaplama acısından kolay olması. Fakat sınıf bilgisini kullanmadığını göz önüne alırsak, en fazla değişmenin olduğu bileşenlerin sınıflandırma problemi için doğru öznitelikleri içerdiğini garanti edemeyiz.
PCA algoritmasının 3 temel amacı vardır;
  • Verilerin boyutunu azaltmak
  • Tahminlerde bulunmak
  • Veri setini, bazı analizlerde görüntülemek
Özyüz elde ederken ise , öncelikle veritabanı içerisindeki n x m boyutundaki yüz resimleri tek boyutlu bir satır vektörüne çevrilir. n xm= N olduğunu düşünürsek, elimizde m tane n boyutlu yüz vektörü olur.Özyüzler elde etmenin matematiği ve pca algoritmasının matematiği hakkında elimde türkçeye çevirdiğim kaynak bulumaktadır. İsteyen olursa maille yollayabilirim. 

İşin algoritması ise şöyle ; 
Yüz tanımada özyüz yönteminin kullanım algoritması Şekil-1’de gösterilmiştir. İlk olarak orijinal resim eğitilecek resimler arasına eklenir ve bu E dizisi içinde tanımlanır. Daha sonra eğitim setindeki her resim için ağırlık hesabı yapılır ve W dizisine eklenir. X bilinmeyen resmi gözlemlenir, belirlenen görüntü için ağırlık hesabı yapılır ve Wx vektörü bulunur. Daha sonra Wx vektörü ağırlıkları bilinen diğer görüntülerle karşılaştırılır. Son olarak da doğru yüz görüntüsü olup olmadığının cevabının verilmesiyle algoritma sonlanır.


 
Şekil 1. PCA ve Özyüzler Yönteminin Algoritması

  Daha önce de söylediğim gibi PCA ve özyüzler metodunun matematiği ile ilgili elimde daha geniş türkçe kaynak bulunmaktadır. Formülleri yazmak biraz işkenceli olduğu için buraya yazamadım fakat isteyen olursa yollayabilirim...

Yüz Tanıma Sistemi - 1

Türkçe kaynağın bulunmasının oldukça zor olduğu bir konu. Bitirme tezi konum olduğu için bu konuda araştırmalarımı sürdürmekteyim. Elimden geldiğince çalışmalarımı ve araştırma sonuçlarını burada paylaşacağım.
Yüz tanıma sistemine geçmeden önce temel olması açısından biyometriyi açıklamak gerekir.Aslında Ahmet Kakıcı bu konuyu çok iyi açıklamış ve başlangıç olarak bana rehber olan bir yazı yazmış.
Peki yüz tanıma sistemi nedir? 

Yüz tanıma sistemi, yüzün karakteristik özelliklerini analiz ederek, farklı noktalar ve bölgeler arası biyometrik ölçümler yaparak veritabanı ile karşılaştırma yapar ve kişiyi tanımlar. Yüzün bu karakteristik özelliklerine düğüm noktaları da denir. Bu düğüm noktalarından bazıları şöyledir;
  • Burunun genişliği,
  • Göz çukurunun derinliği,
  • Elmacık kemiğinin şekli,
  • Çene kemiğinin uzunluğu
Bu düğüm noktaları rakamsal bir değerle kodlanır ve bu kodlara faceprint adı denir.

Tabiki bu sadece genel bir probleme bakış. Bu problemin birçok çözüm yolu var ve çıkacak da zamanla. Şimdi biz bugüne kadar gelen bazı yüz tanıma sistemi yöntemlerine kısaca bakalım.
Yüz Tanıma Sistemi Yöntemleri

Yüz tanıma yönteminde kişilerden örnek almak diğer yöntemlere göre çok daha zordur. Sıradan bir kamera ile çevreden birçok yüz görüntüsü alınabilir. Ancak burada başka bir sorun ortaya çıkmaktadır. Kamera tarafından alınan görüntüde tamamen yüze ait bölge bulunmalıdır. Bunun için yüz bulma algoritmaları kullanılmaktadır. Yüz bölgesi bulunduktan sonra işlemeler burada devam etmektedir.

Bu adımdan sonra değişik yollar izlenerek yüz tanıma işlemi yapılabilir. Bazı yöntemler yüzde bulunan oranları karşılaştırırken bazıları yapay sinir ağları(YSA) ile öğreterek tanıma yapmaktadır.
 Bu yöntemlerden bazıları ;
  • Doğrusal Diskriminant Analizi (LDA)
  • Evrimsel Arama Modeli (EP)
  • Bağımsız Bileşen Analizi (ICA) 

 ve daha birçok yöntem bulunmaktadır. Bunlar hakkında ayrıntılı bilgiyi zamanla ayrı ayrı paylaşacağım. Fakat genel bir bilgi edinilmek istenirse  yine Ahmet Kakıcı'nın bloguna bakılabilir.
    Genel Algoritma






          

    24 Şubat 2010 Çarşamba

    Java Programında String Tersi Alan Program

    İşine yarayan olursa uğraşmasın diye paylaşmak istedim.

    import java.io.*;

    public class StringTersi {
      
        public static void main(String args[]) throws IOException {
          
            String[] Gecici;
            String cumle;
            char karar='e';
            BufferedReader klavye = new BufferedReader
                                    (new InputStreamReader(System.in));
            do{
                System.out.print("Lütfen bir cumle giriniz : ");
                cumle = klavye.readLine().toString();
                
                 Gecici=cumle.split("");
                 for (int i = Gecici.length; i > 0; i--)
    System.out.print(Gecici[i-1] + " " );
              
                System.out.print("\nDevam etmek istiyormusunuz (e/h)? ");
                karar=klavye.readLine().charAt(0);
            }while(karar=='e'||karar=='E');
            
            System.out.println("Program Kapatiliyor...");
        }
    }

    10 Ocak 2010 Pazar

    Windows 7 : GodMode

    Öncelikle bu modu nasıl açacağınızdan bahsedelim ;

    Masaüstünde yeni bir klasör oluşturun ve adını 
    GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}
     olarak değiştirin. Klasör farklı bir simge alacak ve adı "GodMode" olarak değişecek. İşte bu kadar basit.

    Şimdi bu simgeye çift tıklayın : Her birine ulaşmak için farklı yolları takip etmeniz gereken onlarca Windows 7 ayar seçeneği tek bir pencerede karşınızda! Bu seçenekler arasında İnternet seçeneklerinden, Donanım ve anti-virüs ayarlarına kadar hemen her şeyi bulabilirsiniz.

    7 Ocak 2010 Perşembe

    TOR : Kendinizi Koruyun



    Tor , kendinizi tarfik analizine karşı koruyabilmenize yardımcı olan bir yazılım projesidir. Trafik analizi kişisel özgürlüğü ve gizliliği, gizli ticari eylemleri ve ilişkileri ve devlet güvenliğini tehdit eden bir çeşit ağ denetimidir. Tor iletişiminizi dünyanın her tarafından gönüllüler tarafından işletilen dağıtılmış bir ağ üzerinden sağlayarak sizi korur: birilerinin sizin Internet bağlantınızı izleyerek hangi siteleri gezdiğinizi öğrenmesini engeller, ayrıca girdiğiniz sitelerin sizin fiziksel yerinizi öğrenmesini de engeller. Tor, Internet tarayıcıları, anında mesajlaşma istemcileri, uzaktan erişim ve TCP protokolünü kullanan diğer uygulamalar dahil mevcut uygulamalarınızın bir çoğu ile çalışır.

    Kaynak : http://www.torproject.org                                                                   
    Tor Download


    Bu konuda tabiki endeşesi olanlar da var. İyi yada kötü yanlarını okuyup kullanıp kullanmamak bizim elimizde tabiki. Tor'un güvenli olmadığını savunan ve bu konuda güzel bir yazı yazan bir arkadaşımızın blogunu ziyaret etmenizi de tavsiye ederim.

    4 Ocak 2010 Pazartesi

    Youtube'da 3D Video Özelliği

    Henüz yaygınlaşmamış olan 3D monitörler olmadan da 3D video izleyebilirsiniz. Bunun için sadece YouTube üzerinde bulunan 3D özellikli videoları bulmanız gerekiyor.


    Peki bu 3D nasıl çalışır ve nasıl teknolojiyle ilintilendirilir? Birbirinden biraz mesafeli olan lensler yerleştirildikten sonra video çekimi gerçekleştirilir. Rengi farklı olan bu iki görüntünün birleştirilmesi sonucu açık mavi ve kırmızı olan klasik renkler, kullanılan renkli 3D gözlükleri ile bu yansıma oluşturulur.

    YouTube’a ekleyeceğiniz videolara siz de 3D özelliği katabilirsiniz. Bunun için, ‘yt3d:enable=true’ etiketini ekleyebilir, yayınladığınız videonun YouTube 3D özelliği ile izlenmesini sağlayabilirsiniz. Bu videoya tıklayan ziyaretcilerin karşısına ise, 3D izleme seçeneği çıkar.

    Henüz YouTube kategorileri arasında ayrıca 3D destekli videolar kategorilendirilmedikleri için, YouTube arama kutusuna 3D yazıp arama yaparsaniz bu özelliğe sahip videolara ulaşmış olursunuz.

    Kaynak : Bilişim Haber