Batuhan TOSUN
       confidentiality, integrity, availability

System.Exception Sınıfı

clock Nisan 14, 2009 11:39 author Batuhan Tosun tarafından yayınlanmıştır

Merhaba arkadaşlar bu makalemde kendi tanımlayabileceğimiz özel durumlar için kullanıulacak olan sınıflara değineceğim.
        C# ta  birçok özel durum için temel bir sınıftır system.exception .Kendi üreticeğimiz özel durum kodlarının çalışma yapısını destekler diyelibiriz aslında system.exception için.

System.Exception yapısına girecek olursak…dört farlı şekilde referans olarak gösterilebilir.

public Exception();
public Exception(string);
public Exception(SerializationInfo,StreamingContext);
public Exception(string,Exception);

Bu işleçler özel durum tipi olarak şöyle üretilir;  throw new Exception();

Yakaladığımız kod parçacığı System.Exception.Message(e.Message); yapısı ile mesaj alır.

public Exception(SerializationInfo,StreamingContext); // belirttiğimiz bu yapı .netframework te Exception sınıfından istenilen örneği serileştirilmiş veri ile başlatır. 

 

 Kendi Exception Sınıflarımızı Türetmek….

Yukarıda anlattıklarıma ek olarak devam edicek olursak.Kendi exception sınıflarımı üretip kullanabiliriz.

Nasıl mı?

using System;
public class structexception : Exception
       
{
           
public structexception()
               
:base(){}
           
public structexception(String iletim)
               
:base(iletim){}
           
public structexception (String iletim,Exception icineException)
               
:base(iletim,icineException){}
       
}
 

Bunu tekrar başka bir class ta yada public te ; throw new structexception(“string”); //şeklinde çağırabiliriz…. Saygı ve Sevgilerimle…



ILDASM ve MSIL

clock Nisan 14, 2009 11:38 author Batuhan Tosun tarafından yayınlanmıştır

Bir .net derleyici ile exe yada dll oluşturduğunuzu düşünün ,bu dosya yürütülebilir bir dosya olamaz.Bu böyle olacağı için bunu yerine tür ve sınıfları listeleyen bir bildiri ve yükleme uygulamamızda yada uygulamanın bir yerinde derleyici kullanan ve .net çalışma gurubu ile derlenip yürütülen MSIL(Microsoft İntermediate Langue) kullanılır.
            Bunun en büyük özelliği ve avantajı , bir yapı dili gibi gözükmesi ve derleyicinin kodumuza ne yaptığını örneklerle göstermesidir.
            Tabiki bunlar yapılırken Microsoft bize  .net derleyicisi tarafından oluşturulan  MSIL çıktısını görmek için exe yada dll açabilmenizi,sınıf,tür,ad alanları vb. kodları görebilmemizi sağlayan  Microsoft .NET Framework IL Disassembler (ILDASM) isimli bir yapı geliştirmiştir ve bu çözücü tüm frameworklerde içerir.

           Şimdi bunu uygulamalı olarak anlatırsam daha iyi anlaşılacağını düşünüyorum.Başlat--Çalıştır--ildasm yazın(yada IL Disassembler--vistada böyle belirtilmiş)

 

 

Şimdi burada File--Open dan karşınıza windows v. içinden bin klasörü açılacaktır.Buradan bir dosya seçersek çarpraz başvuru ile parça,bildiri ve sınıfları görebiliriz.

 

 

 

Burada ad alanları,sınıf,tür vb. ifadeleri yazılı ifadelerin solundaki simgelerle belirtilmiştir.Yukardaki resimden simgesel örneklerle ifade etmek gerekirse.

AD ALANI: mavi kalkan(örn:system)
SINIF:üç çıkışı olan mavi dikdörtgen(örn:system.tools.)
YÖNTEM:mor dikdörtgen
ENUM:e işaretli üç çıkışlı kahverengi dikdörtgen
..
...

Bu dosyaların açık hallerinde iyi incelendiği takdirde ileri .net uygulamalarında işe yarar ve uygulamaya aktarıcağınız birçok ipucu görebilirsiniz.Yazımın sonuna gelmeden önce önemli bir şey söylemek istiyorum.Bir exe nin yada dll in yönetilen dosya olup olmadığını anlamak için açmayı deneyin.Dosya yönetilen dosya ise açılır ama "has no valid CLP header and cannot be disassembled" ifadesiyle bir hata alırsanız yönetilmeyen dosya anlamına gelir.



Parçacıkları Zamanlamak(Thread Priority)

clock Nisan 14, 2009 11:35 author Batuhan Tosun tarafından yayınlanmıştır

İleri ve kurumsal .net  uzunca bir süre uğraştıktan sonra halen daha profesyonel olarak uğraştığım bir alan.Hele birde bu  bilgileri takip ederek yazılım güvenliğine katkılarda bulunmak ayrı bir keyif.Ancak bugün sadece c# üzerinden anlatacağım.İyi çalışmalar...
             Program çalışırken işlemci biten bir parçacıklı programdan sonra rastgele bşka bir parçacıklı koda geçer.Öncelik sırası normal olduğu için böyle bir standart izlenir.Bunun sebebi parçacıklı kodların birbirleriyle ilişkisi olmamasından kaynaklanır.

            Parçacıklı programlarda zamanı ayarlamak ve değeri döndürmek için Thread.Priority özelliğini kullanırız.Highest,AboveNormal,Normal,BelowNormal,Lowest seçenekleri olan değerde normal seçeneği özgün belirtilmiş sabit bir seçenektir.Bu değerler enum türünde nitelendirilir.

           Çok kompleks ve profesyonel bir projede akıl almaz etkiler esneklikler ve hız sağlayan bu özelliğin basit bir projede bile nekadar işe yaradığını iki farklı uygulama ile şimdi size sunacağım.

İlk olarak Thread.Priority özelliğini kullanmadan console de bir sayma projesi yaratalım.Hemen ardından Thread.Priority özelliğini kullanarak aynı projeyi tekrarlayalım.

 

using System;

using System.Threading;

class ThreadSchedule1App

{

public static void WorkerThreadMethod1()

{

Console.WriteLine("Worker thread started");

 

Console.WriteLine("Worker thread - counting slowly from 1 to 10");for (int i = 1; i < 11; i++)

{

for (int j = 0; j < 100; j++)

{

Console.Write(".");

int a;

a = 15;

}

Console.Write("{0}", i);

}

Console.WriteLine("Worker thread finished");

}

public static void WorkerThreadMethod2()

{

Console.WriteLine("Worker thread started");

 

Console.WriteLine("Worker thread - counting slowly from 11 to 20");for (int i = 11; i < 20; i++)

{

for (int j = 0; j < 100; j++)

{

Console.Write(".");

int a;

a = 15;

}

Console.Write("{0}", i);

}

Console.WriteLine("Worker thread finished");

}

public static void Main()

{

ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);

ThreadStart worker2 = new ThreadStart(WorkerThreadMethod2);

Console.WriteLine("Main - Creating worker threads");

Thread t1 = new Thread(worker1);

Thread t2 = new Thread(worker2);

t1.Start();

t2.Start();

}

}

Bunu çalıştıralım ve ekran çıktısına bakalım.

 

 

Şimdi aynı uygulamayı Thread.Priority methodunu kullanarak yapalım.

class ThreadSchedule2App

{

public static void WorkerThreadMethod1()

{

Console.WriteLine("Worker thread started");

Console.WriteLine("Worker thread - counting slowly from 1 to 10");

for (int i = 1; i < 11; i++)

{

for (int j = 0; j < 100; j++)

{

Console.Write(".");int a;

a = 15;

}

Console.Write("{0}", i);

}

Console.WriteLine("Worker thread finished");

}

public static void WorkerThreadMethod2()

{

Console.WriteLine("Worker thread started");

Console.WriteLine("Worker thread - counting slowly from 11 to 20");

for (int i = 11; i < 20; i++)

{

for (int j = 0; j < 100; j++)

{

Console.Write(".");int a;

a = 15;

}

Console.Write("{0}", i);

}

Console.WriteLine("Worker thread finished");

}

public static void Main()

{

ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);

ThreadStart worker2 = new ThreadStart(WorkerThreadMethod2);

Console.WriteLine("Main - Creating worker threads");

Thread t1 = new Thread(worker1);

Thread t2 = new Thread(worker2);

t1.Priority = ThreadPriority.Highest;t2.Priority =

ThreadPriority.Lowest;

t1.Start();

t2.Start();

}

}

 Şimdi bunu çalıştırıyoruz.Ve ekran çıktısına bakıyoruz.

 

 

Şimdi ikisini kıyaslayalım.Ve özelliklerine bakalım;

             İlk çıktıda gördüğünüz gibi her parçacık eşit sayıda işleme giriyor.Herhangibir öncelik yok.Ancak ikinci çıktıya baktığınız zaman ikinci parçacığın birinci parçacık bitene kadar hiç işleme girmediğini görürüz.Bunun sebebi en yüksek çnceliği ilk parçacığa vermemdir.Bunu daha konsept ve önemli bir projede uyguladığımızı düşünürsek çokdaha verimli ve hızlı bir program yazmış oluruz.

            Not:  Aynı öncelikte iki parçacık atadıysak eğerİki veya kaçtane parçacık ise bunlar eşit sayıya bölünür.İşlemcinin zamanlara eşit miktarda bölünür.Ancak bu işlem aynı kod düzeninde ard arda kullanılırsa yavaşlık ortaya çıkarabilir.Eşit miktarda kullandığımız bu algoritmik düzene.Birkez denemelik zamanlama yane round robin scheduling denir.

            Burda kullandığımız zamanlama algoritması ile .net platformunun iç dünyasında dynamic boost değeri devreye girer.Tüm bu işlemler ile  bir sayısal değer ortaya çıkar ve en yüksek değerli parçacık en yüksek önceliği takip eder.

            Ve  Son Söz : Bir parçacığı özel bir nedeniniz olmadıkça yüksek öncelikte tanımlamak programda dengesizlik yaratır.Zaten başındada söylediğim gibi konsept projelerde kullanılması elzemdir.Özel bir nedeniniz olmadıkça normal değer olması herzaman için en iyisidir.

Saygı ve Sevgilerimle.Sağlıcakla kalın...



Mutex Sınıfı

clock Nisan 14, 2009 11:34 author Batuhan Tosun tarafından yayınlanmıştır

Merhaba  arkadaşlar.Bu makalemde sizlere Advanced c# ın çok parçacıklı programlama yapısı içerisinde yer alan Mutex sınıfından ve mutex sınıfı ile kod eşitlemeden bahsedeceğim.

Öncelikle nedir bu mutex sınıfı?

Mutex sınıfı  thread referansları içinde tanımlanmış, win32 sistem yönetiminde  çalışma prensibi sunan bir temsilcidir.

Mutex sınıflarını monitör kilidinde ,kodu serileştirmede veya parçacıkları database kavramı içinde serileştirmede kullanabiliriz.Verdiğim örneklerden anlıyacağınız gibi mutex sınıfların rahat hareket özellikleri vardır yane esnek bir yapı içindedirler bundan ötürüde yavaş çalışırlar.

C# ta mutex kavramını üç yapıda oluşturabiliriz.

Öncelikle referanslarımıza ;

 

using System.Threading; ad alanını ekliyoruz..

ve bununla beraber aşağıdaki üç yapıdan ile mutex oluşturabiliriz.



Mutex();//adı olmayan mutex tir.geçerli parçacık tarafından kilitlenir.

Mutex(bool initiallyOwned);//parçacığın onu kilitlemek isteyip istemediğini ayarlar.

Mutex(bool initiallyOwned,string MutexName);//mutex in sahibi olup olmadığını ve adını belirlememizi sağlar.
   

 

Şimdi, mutex yapılarına bir örnek ile devam edelim…… 
   

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading; 


namespace DeveloperMania
{  
 
public class veri
  
 
{
       
Mutex mutexname = new Mutex(false);//mutex işlemimiz bukadar devamı konsept yapı,mutex in işlerliği ve mutexe katılan şeylerle alakalı…
 
        
public void aktarımıyönlendir(string text)
   
    
{
  
         
mutexname.WaitOne();// * aşağıda açıklaması vardır….
           
Console.WriteLine("veri.aktarımıyönlendir * baslat");
           
Console.WriteLine("veri.aktarımıyönlendir * calisma_agi");
   
        
for (int i = 0; i < 100; i++)
           
{
               
Console.WriteLine(text);
           
}
       

    
Console.WriteLine("\nveri.aktarımıyönlendir * aktarım_sonbuldu");
           
mutexname.Close();
  
      
    }
   
   }
   

class MutexWorker
   

{
       

public static veri dm = new veri();
     
  
public static void calisma_agiThreadPrensibi1()
   
    
{
     
      
Console.WriteLine("calisma_agi thread  * basla");
    
       
Console.WriteLine("calisma_agi thread  * Calling veri.aktarımıyönlendir");
           
dm.aktarımıyönlendir("a");
 
          
Console.WriteLine("calisma_agi thread  * aktarım için geri dön");
 
      
   }
   

  }
}   



*WaitOne();  Yukarıda tanımladığımız waitone ı burda açıklamak istedim çünkü mutex yapısı için önemli bir yapı.WaitOne mutex in daha fazla esneklik kazanmasını sağlayan yüklemelerdir.



Sınıdlandırmayı anlamak ve kapsülleme

clock Nisan 14, 2009 11:29 author Batuhan Tosun tarafından yayınlanmıştır

Merhaba bu yazımda size c# ta çok önemli bir yer olan sınıflandırma ve sınıflandırmada önemli bir etken olan kapsüllendirmeyi anlatacağım.  

                  Sınıflandırma class sözcüğüne dayanır.Sınıf oluşturmak bilgiyi sistematik bir unsur olarak düzenleme amaçlıdır.Sınıflandırmayı insanlar üzerinden örnek vermek gerekirse düşünce ve iletişim sözcüleri akla gelir.Sınıflandırma iletişim kurma ve yapıyı ekrana aktarma konusunda köklü bir etkisi vardır.

 

 Kapsülleme(Encapsulation)

                  Sınıfları tanımlarken en önemli ilkelerden biri kapsüllemedir.Kapsülleme bir kelime ve akla girebilcek en kolay yolla anlatılmak istenirse;”sınıfı kullanıcak program sadece yapıyı ve etkinliğini bilmek ister,iç durum bilgisine ihtiyaç duymaz.İşte bu noktada kapsülleme devreye girer.” şeklinde anlatılır.

 

Sınıf Tanımlama

          C# ta sınıf tanımlamanın anahtar sözcüğü class tır.Aşağıda tanımlanmış basit bir class örneği verdim incelersek daha iyi anlarız.

Class daire

{

    Double Alan()

{

Return 3.14*yaricap*yaricap;

}

Double yaricap;

}

 

Eğer bu class uygulamasını bir web forms veya win forms üzerinde tanımlayıp uygulamak istersek;

Daire d;//daire tanımlaması için bir değişken yarattık
d=new daire();//atadık ve başlattık.

Umarım yeni başlayanlar için güzel bir makale olmuştur.İyi çalışmalar.

 



Uygulamaları "is" kullanarak sorgulamak

clock Nisan 14, 2009 11:28 author Batuhan Tosun tarafından yayınlanmıştır

"is" işlemci türü bir türün başka bir tür ile uyumlu olup olmadığını program çalışırken denetlemenizi sağlar. 
       "deyim is tür" şeklinde yane örnek olarak "class ISOperatorApp" şeklinde tanımlanır.


 using System;

public class FancyControl
{
    protected string Data;
    public string data
    {
        get
        {
            return this.Data;
        }
        set
        {
            this.Data = value;
        }
    }
}

interface ISerializable
{
    bool Save();
}

interface IValidate
{
    bool Validate();
}


class MyControl : FancyControl, IValidate
{
    public MyControl()
    {
        data = "my grid data";
    }

    public bool Validate()
    {
        Console.WriteLine("Validating...{0}", data);
        return true;
    }
}

class AsOperatorApp
{
    public static void Main()
    {
        MyControl myControl = new MyControl();

        ISerializable ser = myControl as ISerializable;
        if (null != ser)
        {
            bool success = ser.Save();


            Console.WriteLine("The saving of '{0}' was {1}successful",
myControl.data,
(true == success ? "" : "not "));
        }
        else
        {
          Console.WriteLine("The ISerializable interface is not implemented.");
        }
    }
}

 --------------------------------------------------------------------------

Kalın işaretli olan bölüm aşağıdaki gibide kullanılabilir;

if (mycontrol is ISeriaizable)
{
    ISerializable ser = (ISerializable)mycontrol;
    bool success = ser.Save();

...
.......
..........

 "if" kod akışına veya isteğe bağlı olarak yukarıdaki gibide kullanılabilir.

Örnek uygulamamızda SYN. Tom Archer ın örnekler kütüphanesinden bulduğum MyControl ve ISerializable yönetimi arasındaki uyumluluğu deneyen örneği inceledik.



Sealed Sınıfları

clock Nisan 14, 2009 11:27 author Batuhan Tosun tarafından yayınlanmıştır

C# ta kalıtımı kullanmak her zaman kolay olmaz.Eğer ki  geniş ve konsept bir uygulama planlıyorsak çok dikkatli düşünmemiz gerekir.Eğerki tasarladığımız sınıfı temel sınıf olarak planlıyorsak bu temel sınıf her zaman çok verimli bir şekilde çalışmaz.c# sınıfın temel sınıf olarak kullanılmasını önlemek için bize sealed  anahtar sözcüğünü sunar.  sealed class literatur : DefaultLitBas1, IBas{   .. .. ..}

          

           Herhangibir sınıf literatur u temel bir sınıf olarak kullanmaya çalışırsa derleme zamanı hatası ile karşılaşacaktır.Buna ek olarak birde virtual anahtar sözcüğü vardır.Bunun amacı ise çalıştığımız bir yöntemin ilk kullanımı olduğunu bildirmektir.Ancak asla kapalı bir sınıf türetmez.
          Yane kısaca anlatmak gerekirse sealed kişisel bir yönetim kapalı olduğunu bildirmek için kullanılır.



AttributeUsage

clock Nisan 14, 2009 11:26 author Batuhan Tosun tarafından yayınlanmıştır

C# ta kullanılan normal türleri bilgilendirmek için kullandığımız özniteliklerin dışında parametlerle kendi isteğimiz doğrultusunda tanımlayabileceğimiz öznitelikleri AttributeUsage özniteliği ile tanımlarız.

AttribueUsage yapısı aşağıdaki gibidir.

[AttributeUsage
(
validon,
AllowMultiple=allowmultiple,
Inherited=inherited
)
]


          Bu kod yapısındada görebileceğiniz gibi konumsal ve adlandırılmış parametreleri ayırt etmek oldukça kolay.
          Öznitelikleri bu şekilde tanımlarsak özniteliklerin kullanıcıları okuma,yazma,adlandırma öznitelik özelliklerini bulmak için kaynak kodun yapısına bakmasına gerek kalmaz.Böylelikle daha hızlı ve güvenli çalışan bir kod yapımız olur.



SQL Server da Operatörleri Yönetmek

clock Nisan 14, 2009 11:24 author Batuhan Tosun tarafından yayınlanmıştır

Merhaba arkadaşlar bu makalemde size sql server da kullandığımız ve önemli olan operatörlerin yönetimi hakkında detaylı bilgi vereceğim.Öncelikle operatör kavramına giriş yapmak istiyorum….

         Operatör sql server  uyarı gerektiği zaman,başarılı işler gerçekleştiği zaman veya gerçekleşmediği zaman  bizi bilgilendiren özel tanımlama hesaplarıdır.

Operatörlerimizi kullanabilmemiz için isteğimize ve uygunluğuyma bağlı olarak operatör tanımlamamız gerekmektedir.

Bir operatör nasıl tanımlanır ve nasıl kaydedilir önce buna bakalım.

Bunları sırasıyla şema üzerinde anlatıyorum…

Öncelikle Sql Server amangemet içindeki sql server agent ı açıyoruz ve içerisindeki operators üzerine sağ clicleyip new operators diyoruz..

 

 

   

Buradaki name bölümüz operatorumuzun adı olacak.Oradaki notification optionsları doldurmamız gerektmektedir.

Duty Schedule bölümünde hangi günler içinde kullanılacağını ve hangi saatler içinde server ın çalışacağını bildirmelisiniz.

   

Sol bölümdeki notification bölümümüzden operatörümüzün alması gerekn uyarıyı belirtmeniz gerekmektedir.

  Emniyet operatörlerini tanımlamak!!! 

Operatör kısımında sorunlar çıkabilir ,server kendi içerisinide hata verebilir,uyarılar gelmez veya iletilmeye bilir işte böyle durumlarda emniyet operatör sorunumuzu çözüyor.Herhangibir aksaklığa neden olmaması için bir emniyet operatör tanımlamamız gerekiyor.

Şimdi bunları şemayla anlamaya devam edelim.

Öncelikle sql server agent ın üstüne geliyoruz ve sağ click diyip properties a giriyoruz.


Orada seçiceğimiz emniyet türünü alert veya job olarak operatörü hangi notification da tanımladık ona göre belirtiyoruz.
 

Bir emniyet operatörünü tanımlamak için alt taraftaki enable fail-safe operators u click ediyoruz.Ve operatörümüzü seçiyoruz.   Emniyet operatörünün bize nasıl bilgi vereceğini notify using bölümünden clickleyip seçiyoruz.   

 

 Ok liyip çıktığımızda hem server ımızın motoru hem bizim kafamız rahat oluyor;)….Başka bir makale görüşmek ümidi ile Saygı ve Sevgilerimler…… 



Uygulamaları "is" kullanarak sorgulamak

clock Ekim 28, 2008 21:22 author Batuhan Tosun tarafından yayınlanmıştır

       "is" işlemci türü bir türün başka bir tür ile uyumlu olup olmadığını program çalışırken denetlemenizi sağlar. 
       "deyim is tür" şeklinde yane örnek olarak "class ISOperatorApp" şeklinde tanımlanır.


 using System;

public class FancyControl
{
    protected string Data;
    public string data
    {
        get
        {
            return this.Data;
        }
        set
        {
            this.Data = value;
        }
    }
}

interface ISerializable
{
    bool Save();
}

interface IValidate
{
    bool Validate();
}


class MyControl : FancyControl, IValidate
{
    public MyControl()
    {
        data = "my grid data";
    }

    public bool Validate()
    {
        Console.WriteLine("Validating...{0}", data);
        return true;
    }
}

class AsOperatorApp
{
    public static void Main()
    {
        MyControl myControl = new MyControl();

        ISerializable ser = myControl as ISerializable;
        if (null != ser)
        {
            bool success = ser.Save();


            Console.WriteLine("The saving of '{0}' was {1}successful",
myControl.data,
(true == success ? "" : "not "));
        }
        else
        {
          Console.WriteLine("The ISerializable interface is not implemented.");
        }
    }
}

 --------------------------------------------------------------------------

Kalın işaretli olan bölüm aşağıdaki gibide kullanılabilir;

if (mycontrol is ISeriaizable)
{
    ISerializable ser = (ISerializable)mycontrol;
    bool success = ser.Save();

...
.......
..........

 "if" kod akışına veya isteğe bağlı olarak yukarıdaki gibide kullanılabilir.

Örnek uygulamamızda SYN. Tom Archer ın örnekler kütüphanesinden bulduğum MyControl ve ISerializable yönetimi arasındaki uyumluluğu deneyen örneği inceledik.

 



the captain's logbook

Batuhan TOSUN
 

ISSA Turkey Chapter President
Senior Security Consultant, CISO

batuhantosun@zaferhan.net
btosun@batuhantosun.com
batuhan.tosun@issatr.org