Aşağıdaki fonksiyon çağrıldığı satırın dosya adı ve satır numarasını döndürür. Sadece debug mod’da çalışır:

[Conditional("DEBUG")]
public static string CagiranSatir()
{
            StackTrace insStackTrace = new StackTrace(true);
            StackFrame insStackFrame = insStackTrace.GetFrame(1);
            return String.Format("Dosya: {0}, Satır: {1}", insStackFrame.GetFileName(), insStackFrame.GetFileLineNumber());
}

Uygulamamızda yazdığımız bir kod bloğunun sadece debug modda çalışmasını istiyorsak aşağıdaki iki yoldan birini kullanabiliriz:

        private void Form1_Load(object sender, EventArgs e)
        {

            #if DEBUG
                MessageBox.Show("debug");
            #else
                MessageBox.Show("debug degil");
            #endif
            DebugModdaCalis();
        }

        [Conditional("DEBUG")]
        static void DebugModdaCalis()
        {
            MessageBox.Show("Debug mod");
        }

Microsoft Framework 3.0′dan itibaren IIS 7 API’si sayesinde IIS 7′deki yönetimsel işlemleri artık Microsoft.Web.Administration namespace’ini kullanarak yazdığımız uygulamalar üzerinden gerçekleştirebiliyoruz. Yazgeliştir’de IIS 7 API’si ile ilgili makalem bugün yayınlandı. İlgilenenler buradan erişebilirler.

Merhabalar,

 

Microsoft Framework 3.0′dan itibaren IIS 7 API’si sayesinde IIS 7′deki yönetimsel işlemleri artık Microsoft.Web.Administration namespace’ini kullanarak yazdığımız uygulamalar üzerinden gerçekleştirebiliyoruz. Bu işlemler site, application, application pool, application domain, virtual directory oluşturma, silme gibi işlemler olabilir. Aynı zamanda IIS üzerindeki bu nesnelerin tüm property’lerini de bu API sayesinde okuyabilir veya set edebiliriz. Bu makalemde bahsettiğim bu işlemleri C# ile nasıl yapabileceğimizi anlatacağım.

 

Bir konsol uygulaması oluşturarak başlayalım. Ardından da ilk olarak Microsoft.Web.Administration namespace’ini projeye referans ekleyelim. Bunun için bilgisayarımızdaki Windows dizinin altındaki System32\inetsrv klasöründeki Microsoft.Web.Administration.dll dosyasını seçiyoruz:

 

Ardından da koda aşağıdaki using ifadesini ekliyoruz:

 

using Microsoft.Web.Administration;

 

Artık yukarıda bahsettiğim işlemleri yapmaya hazırız. İlk olarak yeni bir site oluşturalım:

 

void createSite()
{
ServerManager insServerManager = new ServerManager();
insServerManager.Sites.Add(“TestSite”, @”C:\TestSite”, 81);
insServerManager.CommitChanges();
}

 

ServerManager nesnesi IIS üzerindeki işlemleri yapabilmemizi sağlayan metod, property ve diğer nesnelere erişmemizi sağlayan temel class’tır. Bu yüzden bütün işlemleri yaparken ilk olarak bu class’ın bir instance’ını almamız gerekir. Instance aldıktan sonra ServerManager’ın Sites collection’ına Add metodunu çağırarak yeni site’ı ekliyoruz. Add metodunun 4 overload’ı bulunuyor, biz örnekteki overload’da ilk olarak site’ın adını, yolunu ve port numarasını verdik. Ardından da bu işlemlerin tamamlanması için CommitChanges metodunu çağırdık. Kodu derleyip çalıştırdığımızda Windows 7′nın güvenlik kontrollerinden dolayı aşağıdaki hatayı alacağız:

 

 

 

Bu hatanın nedeni redirection.config dosyasının bulunduğu klasöre (Windows\System32\inetsrv\config) sadece administrator yetkilerinde bir kullanıcının erişebiliyor olması. Kodu çalıştıran kullanıcı eğer admin değilse default olarak bu klasöre erişim yetkisi bulunmamakta. Bu hatayı almamak için iki seçeneğiniz bulunuyor. Bunlardan birincisi administrator yetkilerinde bir kullanıcıyı impersonate ederek klasöre erişmek, diğeri ise bu klasöre read yetkisi olan bir kullanıcı oluşturup, bu kullanıcıyı impersonate edip klasöre onun yetkileriyle erişmek. İkinci yol daha güvenli olacaktır.

 

Gerekli düzenlemeleri yaptıktan sonra kodu çalıştırdığımızda TestSite adlı yeni site’ımızın oluştuğunu IIS Manager üzerinden görebiliriz:

 

 

Şimdi de IIS üzerindeki tüm site’ları listeleyelim:

 

void getListOfSites()
{
ServerManager insServerManager = new ServerManager();
foreach (Site insSite in insServerManager.Sites)
{
Console.WriteLine(“——————–”);
Console.WriteLine(“Site Name: ” + insSite.Name);
Console.WriteLine(“State:” + insSite.State);
Console.WriteLine(“Application Pool:” + insSite.ApplicationDefaults.ApplicationPoolName);
}
}

 

Yine ilk iş ServerManager’ın instance’ını aldık. Microsoft.Web.Administration namespace’inin Site nesnesini taşıyan bu collection’da foreach ile dönerek Name, State, ApplicationPoolName property’lerini ekrana yazdırdık:

 

Oluşturduğumuz TestSite’ı stop etmek istersek de aşağıdaki kodu yazmamız yeterli olacaktır:

 

void stopSite()
{
ServerManager insServerManager = new ServerManager();
insServerManager.Sites["TestSite"].Stop();
//insServerManager.Sites["TestSite"].Start();
}

 

Biraz önce bahsettiğim Site nesnesinin Stop metodu ile site’ı durdurabilir, Start metodu ile tekrar başlatabilirsiniz. Şimdi de oluşturduğumuz TestSite’a TestApp adında bir application ekleyelim:

 

void addApplication()
{
ServerManager insServerManager = new ServerManager();
insServerManager.Sites["TestSite"].Applications.Add(“/TestApp”, @”C:\TestApplication”);
insServerManager.CommitChanges();
}

 

Site nesnesinin Applications collection’ınına Add metodu ile ilk parametresi adı, ikinci parametresi path’i olmak üzere yeni application’ı ekledik Uygulamayı çalıştırdığımızda IIS’de yeni application’ı görebiliriz:

 

Şimdi de yeni oluşturduğumuz TestApp application’ıına yeni bir virtual directory ekleyelim:

 

void addVirtualDirectory()
{
ServerManager insServerManager = new ServerManager();
insServerManager.Sites["TestSite"].Applications["/TestApp"].VirtualDirectories.Add(“/TestVirtualDir”, @”C:\TestVirtualDirectory”);
insServerManager.CommitChanges();
}

 

Son olarak da bir application pool’u nasıl recycle edebileceğimize bakalım:

 

void recycleApplicationPool()
{
ServerManager insServerManager = new ServerManager();
insServerManager.ApplicationPools["DefaultAppPool"].Recycle();
}

 

Işıl Orhanel
www.isilorhanel.net

Microsoft Office Document Imaging Microsoft Office 2003 ve sonraki sürümlerinde yer alan ve kısayolu Başlat menüsündeki Office program klasörü altındaki Tools klasöründe bulunan bir uygulamadır. Yazgeliştir’de yayınlanmış bu makalemde Microsoft Document Imaging uygulamasının API’sini kullanarak basit bir OCR uygulamasını nasıl yazılabileceğinden bahsettim.

Merhabalar,

 

 

Bu makalemde sizlere Microsoft Document Imaging uygulamasının API’sini kullanarak basit bir OCR uygulamasını nasıl yazabileceğinizden bahsedeceğim. Bu uygulamayı yazarken kullanacağımız API’nin çeşitli metodlarını da inceleyeceğiz.

 

 

Microsoft Office Document Imaging Microsoft Office 2003 ve sonraki sürümlerinde yer alan ve kısayolu Başlat menüsündeki Office program klasörü altındaki Tools klasöründe bulunan bir uygulamadır. Microsoft Office Document Scanning ile taranmış dökümanların editlenmesi, yeni döküman taranması, taranan dökümanların Word dosyasına çevrilmesi ve döküman içinde metin arama gibi birçok işlemi yapan bir uygulamadır.

 

 

OCR ingilizce Optical Character Recognition teriminin kısaltmasıdır. Türkçe’ye ise Optik Karakter Tanıma olarak çevirmek uygun olacaktır. OCR çalışma prensibi olarak Örüntü Tanıma (pattern recognition), yapay zeka gibi gelişmiş teknolojilerin bileşkesidir, Image Processing başlığı altında da incelenmektedir. Temelde bilgisayar ortamında bulunmayan genellikle tarayıcı veya fotoğraf makinası gibi bir cihazla resim formatına çevrilmiş yazıların (print çıktısı, el yazısı, daktilo ile yazılmış, basılı yayın organı) resimlerinin bilgisayarda düzenlenebilecek metin dosyaları haline çevrilmesi, sayısallaştırılması olarak tanımlanabilir. Bilgisayar ortamında bahsettiğimiz bu geniş alanın dışında kimi sitelerde bulunan güvenlik resimlerinin kırılması da bu yönteme dayanmaktadır. Bunun bilgisayar ortamından farklı olan örneklerini inceleyeceksek en güzel örneklerinden biri yoldan geçen araçların plakalarının tanımlanmasıdır. Bu uygulama kimi otoparklarda veya EDS gibi sistemlerde kullanılmaktadır. Bir diğer örnek ise kartvizitlerin taranarak Outlook’a aktarıldığı uygulamalar olarak gösterilebilir.

 

Makaledeki örnek uygulamada bir resim dosyasından resimdeki yazıyı okuyup, form üzerindeki RichTextBox’a yazdıracağız. İlk olarak yapmamız gereken yeni bir proje oluşturup, referans ekleme ekranının COM sekmesindeki Microsoft Office Document Imaging 12.0 Type Library’i projemize referans olarak ekleyelim:

 

 

Ardından da uygulama formunu aşağıdaki gibi dizayn edelim:

 

 

“…” butonuna tıklayıp, yazısını almak istediğimiz resmi seçeceğiz. Ardından da “Get Text” butonuna tıklayarak dosya yolunu formdaki textbox’a yazdırdığımız resimdeki yazıyı richtextbox’a aktaracağız. Uygulamanın kodu aşağıdaki gibi:

 

public partial class Form1 : Form
{
MODI.Document insDocument;
public Form1()
{
InitializeComponent();
insDocument = new MODI.Document();
}

 

private void btnGetImage_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
if (openFileDialog1.FileName != “”)
{
txtImagePath.Text = openFileDialog1.FileName;
}
}

 

private void btnGetText_Click(object sender, EventArgs e)
{
insDocument.Create(txtImagePath.Text);
insDocument.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
foreach (MODI.Image insImage in insDocument.Images)
{
MODI.Layout insLayout = insImage.Layout;
txtImageText.Text = insLayout.Text;
}
insDocument.Close(false);
}
}

 

İlk olarak formun constructor’ında MODI.Document nesnesinin bir instance’ını aldık. btnGetText butonunun click event’inde ise ilk önce instance’ını aldığımız MODI.Document nesnesinin (insDocument) Create metodunu yazısını okuyacağımız resmin yolunu vererek çağırdık. Ardından da resimdeki karakter tanıma işlemini yapacak olan OCR metodunu aşağıdaki parametrelerini vererek çağırıyoruz:

 

LangId: Karakter tanıma işleminin yapılacağı dilin id’si. MODI.MiLANGUAGES enum’unun değerlerinden biri olabilir.
OCROrientImage: Karakter tanıma işlemi yapılırken sayfanın yatay veya düşey yönelimde olduğunun otomatik olarak algılanıp algılanmayacağı. Default değeri true’dır.
OCRStraightenImage: Karakter tanıma işlemi yapılırken sayfadaki ufak dikey yamuklukların düzeltilip düzeltilmeyeceği. Default değeri true’dır.

 

Ardından dökümanın içindeki image’lar içinde foreach ile dönerek Image nesnesinin Layout property’sindeki nesneyi yeni oluşturduğumuz MODI.Layout nesnesine atıyoruz. Sonra da formdaki richtextbox’ın Text’ine MODI.Layout nesnesinin Text property’sini atıyoruz. İşimiz bittikten sonra da MODI.Document nesnesinin Close metodunu çağırıyoruz. Şimdi kodu aşağıdaki resim için çalıştırıp deneyelim:

 

 

 

Görüldüğü gibi resimdeki yazıları alma işlemi oldukça başarılı bir şekilde tamamlandı.

 

Son olarak MODI.Layout nesnesinin iki property’sinden bahsetmek istiyorum. Words property’si taranan resimdeki her kelimenin taşındığı bir array’dir. Yani resimdeki tüm yazıya örnek uygulamada da yaptığımız gibi Layout nesnesinin Text property’si ile erişebilirsiniz. Text içindeki her bir kelimeye erişmeniz gerektiği durumlarda ise Words property’sini kullanabilirsiniz. Words array’i Word tipinde nesneleri taşır. Bahsetmek istediğim ikinci property de Word nesnesinin RecognitionConfidence property’si. Adından da anlaşılabileceği gibi RecognitionConfidence taranan bir kelimenin hatasız taranmış olma olasılığını verir. 0 ile 999 arası integer değer alır.

 

Umarım faydalı olmuştur.

 

Işıl Orhanel
www.isilorhanel.net