C# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
C# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

5 Nisan 2013 Cuma

Returning a value from a thread - .NET

Basit bir paket gönderme programında oluşturduğum thread ler içerisindeki iş fonksiyonlarından sonuçları asekron bir şekilde okumam için yazdığım dinamik sınıf aşağıdadır.

ThreadExecuter sınıfım Thread içersinde çalıştırılacak sınıf fonsiyonu ve sonunda değer döndürecek bir fonksiyon istemektedir.
 
 
    public class ThreadExecuter where T : class
    {
        public delegate void CallBack (T returnValue);
        public delegate T Method();
        private CallBack callBack;
        private Method method;

        private Thread t;

        public ThreadExecuter(Method _method, CallBack _callBack)
        {
            this.method = _method;
            this.callBack = _callBack;

            t = new Thread(this.Process);
        }

        public void Start() 
        {
            t.Start();
        }

        public void Abort()
        {
            t.Abort();
            callBack(null);
        }

        public void Join()
        {
            t.Join();
        }

        private void Process()
        {
            callBack(method());
        }
    }

Test ordamında kodumuzu deniyelim.

 
namespace Tester
{
    class Program
    {
        static void Main(string[] args)
        {
            #region [ Paket Data]
             ...
            #endregion

            for (int i = 0; i < 20; i++)
            {
                Packet packet = new Packet() { Data = data, Host = "www.google.com.tr", Port = 80, Id = i };
                SocketManager sm = new SocketManager() { packet = packet };

                ThreadExecuter te = new ThreadExecuter(sm.Send, writeScreen);
                te.Start();
            }

            Console.WriteLine("bitti.");
            Console.ReadKey();
        }

        private static void writeScreen(Packet p)
        {
            Console.WriteLine(p.Id + " - " + p.Status.ToString());
        }
    }
}
 

Eğer ki Join kullanarak gerçekleştirdiğimizde ;

 ThreadExecuter te = new ThreadExecuter(sm.Send, writeScreen);
                te.Start();
                te.Join();



12 Ocak 2013 Cumartesi

Distinct : DataView.ToTable Vs Linq


Büyük veriler üzerinde işlem yaparken, kullandığımız yönteme çok dikkat etmeliyiz.

Projelerden birinde 350.000 satırlık veri kümesi üzerinde işlemler yapıp, düzenli bir veri modeline dönüştüreceğim. işlemler sırasında Distinct() işlemi uygulamam gerekmekteydi. 2 yöntem kullanarak işlemi gerçekleştirdim ve aralarındaki uçurum inanılmaz farklı çıktı.

Distinct -> DataView.ToTable Vs Linq

veri sayımız küçük olduğunda DataView.ToTable ile işlem yapmasında performanse çok sorun oluşturmuyor gibi. ama veri kümesi arttıkça inanılmaz bir yavaşlama söz konusu. bu yavaşlamayı en kolay linq ile kolaylıkla çözmekteyiz.

Performans test kodları ve sonuçları;


data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");
VS
data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();

Veri kümemizi oluşturma işlemi;
private static DataTable GenerateTable(int noOfRows, int modules)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("Id", typeof(int));
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Role", typeof(string));
    dt.Columns.Add("DC1", typeof(string));
    dt.Columns.Add("DC2", typeof(string));
    dt.Columns.Add("DC3", typeof(string));
    dt.Columns.Add("DC4", typeof(string));
    dt.Columns.Add("DC5", typeof(string));
    dt.Columns.Add("DC6", typeof(string));
    dt.Columns.Add("DC7", typeof(string));

    for (int i = 0; i < noOfRows; i++)
    {
        int id = i % modules;
        dt.Rows.Add(new object[] { id, "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString(), "Test" + id.ToString() });
    }
    return dt;
}

Performans hesaplama kısmı;
 
static void Main(string[] args)
{
    Display display = null;
    for (int i = 1; i < 1000; i += 100)
    {
        DataTable data = GenerateTable(1000 * i, 10 * i);

        display = new Display();

        sw.Start();
        DataTable distictData = data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");
        display.ItemsInfo = data.Rows.Count + "/" + distictData.Rows.Count;
        display._ToTable = sw.ElapsedMilliseconds;
        sw.Stop();

        sw.Restart();
        var result = data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();
        display._Linq = sw.ElapsedMilliseconds;
        sw.Stop();

        list.Add(display);
    }

    writeConsole();

    Console.ReadKey();
}
 
private static void writeConsole()
{
    Console.WriteLine("ItemCount/DistinctItem  |  DataView ToTable   |   Linq");
    foreach (Display d in list)
    {
        Console.WriteLine(string.Format("         {0}            |         {1}         |   {2}", d.ItemsInfo, d._ToTable, d._Linq));
    }
}

Sonuçlar milliseconds olarak verilmektedir.

Bunun dışında Microsoft un yayınladığı bir makale daha var. Genel performans için dikkat edilmesi gerekenler.

Performance Tips and Tricks in .NET Applications -> http://msdn.microsoft.com/en-us/library/ms973839.aspx

25 Ekim 2012 Perşembe

Html5 - Speech Search (Web)

Merhabalar,

Web ortamında çok basit bir şekilde HTML5 ile gelen ve chrome - firefox  desteklediği webkit-speech  özelliğinden bahsedeceğim.

Alışveriş sitesindeyiz ve aramayı konuşarak yapıyoruz. çok güzel olmaz mıydı? bir önceki yazımda windows tabanlı TextToSpeech - SpeechToText (http://onerkaya.blogspot.com/2012/10/myspeech-texttospech-speechtotext.html işlemlerini destekleyen bir uygulama gerçekleştirmiştim. bu sefer Web tarafında Html5 in nimetlerinden yararlanma zamanı geldi bile ;)

İşin özü : <input type="text" x-webkit-speech="x-webkit-speech" lang="tr" />

Ufak bir aspx dosyası ve speech ile gelen değeri , iframe içersinde yahoo üzerinde aratmaktadır :) aşağıda kod örneği ve sırası ile ekranlar bulunmaktadır.





Bunun için browser desteğinin olması gerekmektedir. http://blogs.sitepointstatic.com/examples/tech/speech-input/index.html bu adresten online speech - webkit özelliğini chrome ile test edebilirsiniz. şu an benim uyarlamamda dil parametresi TR dir. Gayet başarılı sonuçlar döndürmektedir.

http://www.webkit.org/ adresinden gerekli gelişmiş bilgileri edinebilirsiniz.

Uygulamamızın kaynak kodları :  https://docs.google.com/file/d/0ByRFI3ULXVPuem1EcUlHTDlrWVE/edit?usp=sharing

Html5 ile ilgili daha detaylı, yenilikleri ile sizlerle tekrar olacağım.

Öner KAYA

MySpeech - TextToSpeech & SpeechToText ;)

Geçen ofiste muhabbeti oldu. Konuştuğumuzu kolaylıkla nasıl yazıya dökeriz, bunu WEB ortamında nasıl sağlarız şeklinde. Kolay olduğunu biliyordum ve ufak bir araştırma yapıp hemen basit bir uygulama gerçekleştirdim. Sizinle bunu paylaşıyor olacağım.

Anlatacağım uygulamanın özelliği; yazdığımız yazıyı seslendirmek, konuştuğumuzu yazıya aktarmak. Ayrıca WEB ortamı için sesli arama özelliğini nasıl kolaylıkla yeni teknoloji olan HTML5 ile yapacağımızı anlatacağım.

Öncelikle .Net in System.Speech kütüphanesini, TextToSpeech için SpeechSynthesizer, SpeechToText işlemim için SpeechRecognitionEngine sınıflarını kullanmaktayım.


TextToSpeech işlemi için;
 SpeechSynthesizer nesnesini yönetmek ve her seferinde aynı sınıfı kullanmak için SingleTon tasarım desenini kullanarak TextToSpeech sınıfı oluşturdum. Dispose işlemi ise, OnFormClosing işlemi sırasında yapmaktayım.



SpeechToText işlemi için;
SpeechRecognitionEngine sınıfını kullanmaktayım.Aynı sınıfı her seferinde ulaşmak için singleton tasarım desenini kullandım. Konuştuğumuzu algılayabilmesi için ilgili dil paketine uygun kelime (grammer) listesi ile sınıfımızı beslememiz gerekmektedir. grammer.txt dosyasını oluşturdum.2 durum var.ilk durum kelime ya da cümle olması, diğer durum ise program tanımlanmasıdır. 'running' diyerek program modunu açıyoruz. sonrasında çalışmasını istediğiniz program adını söylüyorsunuz :) Bu tarz tanımlama örneklerim grammer.txt içersinde mevcut. Daha da zenginleştirilebilir. hatta comma diyince "," ataması şeklinde tanımlamalarda yapılabilinir, desteklenebilir. artık gerisi size kalmış :)






SpeechRecognitionEngine sınıfının eventler yardımı ile ses sisteminden gelen ses yüksekliğini ve yakalanan kelimeleri yakalamaktayım. bu şekilde form tarafında görüntüleme ya da program çalıştırma işlemi yapmaktayım.




Programımız kullanıma hazır. İndirmek için - https://docs.google.com/file/d/0ByRFI3ULXVPuRzZRMUJLSDFRSlE/edit?usp=sharing

Dilediğiniz gibi kullanabilir, geliştirebilir, örnekliyebilirsiniz.

Html5 ile web ortamında sesli arama yapmak için ayrı bir yazı yazdım. ulaşmak için; http://onerkaya.blogspot.com/2012/10/html5-speech-search-web.html .;)

Öner KAYA

22 Ağustos 2012 Çarşamba

Levenshtein Algoritması

Levenshtein Algoritması

İki dizilim arasındaki benzerliği derecelendirmek için kullanılır. Pratikte arama sonuçlarında kelimeler arasındaki benzerliği derecelendirmek için kullanılmaktadır.

Basitçe, iki dizi, iki kelime, iki cümle gibi varlıklar arasındaki değiştirme ve ekleme işlemlerini tutar.

Örneğin;

Oyun- Ayan kelimeleri arasındaki mesafe 2 ‘dir çünkü ilk ve ikinci o harfleri a harfi ile değişmiştir.
Arap – araba kelimeleri arasındaki mesafe 2′dir çünkü p harfi b ile değişmiş ve a harfi eklenmiştir.

Konu ile ilgili detaylı bilgi için  http://en.wikipedia.org/wiki/Levenshtein_distance

Bununla  ilgili ufak bir uygulama gerçekleştirdim. arama yapacağınız kelimeyi, sözlük içersinde aramakta ve yakın olan kelimeleri karşımıza getirmektedir. Kolaylıkla yapıyı dilediğiniz arama motorlarına, kelime eşleştirme, doğru kelime girişini ölçmek için ve benzeri uyarlamalarda kullanabilir, geliştirebilirsiniz.


Örnek kelime kütüphanemiz;
source = new List<string>() {"araba","peugeot","fiat","motor","kaya öner","öner kaya", "volvo","wosvagen","mercedes","bmw","audi","dacia", "hyundai","honda","lada","lotus","alfa romeo", "land rover","renault","volkswagen","tata","nissan","opel","mazda" ,"kia","jeep","jaguar","isuzu","citroen"};


Ana yordamımız;
 public static int FindLevenshteinDistance(this string Source, string Target)
        {
            int n = Source.Length;
            int m = Target.Length;
            int[,] Matrix = new int[n + 1, m + 1]; // Hesaplama matrisi üretilir. 
            if (n == 0) // Eğer kaynak metin yoksa zaten hedef metnin tüm harflerinin değişimi söz konusu olduğundan, hedef metnin uzunluğu kadar bir yakınlık değeri mümkün olabilir 
                return m;

            if (m == 0)   
                return n;

            // Aşağıdaki iki döngü ile yatay ve düşey eksenlerdeki standart 0,1,2,3,4...n elemanları doldurulur 
            for (int i = 0; i <= n; i++)
                Matrix[i, 0] = i;

            for (int j = 0; j <= m; j++)
                Matrix[0, j] = j;

            // Kıyaslama ve derecelendirme operasyonu yapılır 
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= m; j++)
                {
                    int cost = (Target[j - 1] == Source[i - 1]) ? 0 : 1;
                    Matrix[i, j] = Math.Min(Math.Min(Matrix[i - 1, j] + 1, Matrix[i, j - 1] + 1), Matrix[i - 1, j - 1] + cost);
                }

            return Matrix[n, m]; // sağ alt taraftaki hücre değeri döndürülür 
        }
Kelimelerin benzerlik durumlarının derecesini ben dinamik olarak kelime uzunluğuna göre ayarlamaktayım. 

Benzerliğin liste olarak döndürülmesi;
public IEnumerable GetSimilarWords(string sourceWord)
        {
            IEnumerable tmp;
            tmp = source.Where(s => sourceWord.FindLevenshteinDistance(s) <= dynamicLimit(s.Length));
            return tmp;
        }
şimdi asıl işlemi yapan, benzerliği hesaplıyan algoritmamıza gelelim. bunun için ufak bir extention yazarak gerçekleştirdim.
   public static int FindLevenshteinDistance(this string Source, string Target)
        {
            int n = Source.Length;
            int m = Target.Length;
            int[,] Matrix = new int[n + 1, m + 1]; // Hesaplama matrisi üretilir.
            if (n == 0) // Eğer kaynak metin yoksa zaten hedef metnin tüm harflerinin değişimi söz konusu                            olduğundan, hedef metnin uzunluğu kadar bir yakınlık değeri mümkün olabilir
                return m; 

            if (m == 0) 
                return n; 

            // Aşağıdaki iki döngü ile yatay ve düşey eksenlerdeki standart 0,1,2,3,4...n elemanları doldurulur
            for (int i = 0; i <= n; i++)
                Matrix[i, 0] = i; 

            for (int j = 0; j <= m; j++)
                Matrix[0, j] = j; 
            // Kıyaslama ve derecelendirme operasyonu yapılır
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= m; j++)
                {
                    int cost = (Target[j - 1] == Source[i - 1]) ? 0 : 1;
                    Matrix[i, j] = Math.Min(Math.Min(Matrix[i - 1, j] + 1, Matrix[i, j - 1] + 1), Matrix[i - 1, j - 1] + cost);
                } 
            return Matrix[n, m]; // sağ alt taraftaki hücre değeri döndürülür
        }

Projeyi indirmek için ;  https://docs.google.com/file/d/0ByRFI3ULXVPuRkJNTXBXQjk4LW8/edit?usp=sharing

İyi günler ;)

Öner KAYA

7 Ağustos 2012 Salı

IIS Site Checker :)

Konumuzda bir kaç kavramdan bahsedeceğim. Bunlardan bahsederken de ufak bir uygulama ile bunu şekillendirelim.
  • IIS de tanımlı olan sitelerin okunması
  • IIS deki sitelere recycle işlemi uygulama
  • Site & Servis 'lerin kontrol edilmesi, html i, mevcut hatayı okuma işlemleri
Ufak bir uygulama yazdım. IIS deki siteleri okuyup, tek tek kontrol etmektedir. Hata veren site olursa, recycle etmektedir.

static void Main(string[] args)
        {
            var iisSiteList = IISManager.GetIISSiteList();
            HttpOp ho = null;
            foreach (SiteInfo si in iisSiteList)
            {
                ho = new HttpOp("http://" + (si.SiteUrl != string.Empty ? si.SiteUrl : "localhost:" + si.Port));
                ho.DownloadSite();
                if (ho.IsSiteDownloaded)
                    Console.WriteLine(si.SiteUrl + " sorunsuz çalışmaktadır");
                else
                {
                    Console.WriteLine((si.SiteUrl != string.Empty ? si.SiteUrl : "localhost:" + si.Port) + " hata çıktı.");
                    IISManager.RecycleSite(si.ApplicationPoolName);
                }
            }
            Console.ReadKey();
        }

IIS üzerindeki sitelere ulaşabilmek için, Microsoft.Web.Administration.dll dosyasını referans olarak eklememiz gerekmektedir. (C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll) ServerManager nesnesi ile sitelere ulaşmak çok kolay. Okuduğum site bilgilerini, kendim oluşturduğum SiteInfo nesneme aktarmaktayım.
    public static List GetIISSiteList()
        {
            List tmpList = new List();
            using (ServerManager manager = new ServerManager())
            {
                var sites = manager.Sites;

                foreach (Site s in sites)
                {
                    SiteInfo a = new SiteInfo();
                    a.SiteName = s.Name;
                    if (s.Bindings.Count > 0)
                    {
                        a.SiteUrl = s.Bindings[0].Host;
                        a.Protocol = s.Bindings[0].Protocol;
                        a.Port = s.Bindings[0].EndPoint.Port;
                    }
                    if (s.Applications.Count > 0)
                      {  a.ApplicationPoolName = s.Applications[0].ApplicationPoolName;
}

                    tmpList.Add(a);
                }
            }
            return tmpList;
        }
Yukardaki kod blogunda siteye atanmış ApplicationPoolName değerinide yakalamaktayız. aşağıdaki kod blogunda ilgili pool değerinin durumuna göre , yeniden başlatma ya da recycle işlemleri yapmaktadır. 
public static void RecycleSite(string poolName)
        {
            using (ServerManager manager = new ServerManager())
            {
                ApplicationPoolCollection applicationPools = manager.ApplicationPools;
                foreach (ApplicationPool pool in applicationPools)
                {
                    if (pool.Name == poolName)
                    {
                        if (pool.State == ObjectState.Stopped)
                        {
                            pool.Start();
                            Console.WriteLine(pool.Name + " sitesi durmus. Yeniden Start edildi.");
                        }
                        else
                        {
                            pool.Recycle();
                            Console.WriteLine(pool.Name + " sitesi recycle edildi.");
                        }
                        manager.CommitChanges();
                        continue;
                    }
                }
                applicationPools.Clear();
                return;
            }
        }
Site , servis gibi http tabanlı web uygulamalarını HttpWebRequest nesnesi ile kolayca GET edebiliriz. Aşağıdaki kod blog u içerisnde nasıl GET edip, kaynak kodlarını, hata kodlarını ayıklandığını gösterilmekte.
 public void DownloadSite()
        {
            StringBuilder sb = new StringBuilder();
            byte[] buf = new byte[8192];

            //try-catch => url yanlis olma durumu, site nin hata verme durumunu kontrol edebilmek icin
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(siteUrl);
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (Stream resStream = response.GetResponseStream())
                    {
                        int count = 0;
                        do
                        {
                            count = resStream.Read(buf, 0, buf.Length);
                            if (count != 0)
                            {
                                sb.Append(Encoding.GetEncoding(65001).GetString(buf, 0, count));
                            }
                        }
                        while (count > 0);
                        resStream.Close();
                        response.Close();
                        isSiteDownloaded = true;
                    }
                }
            }
            catch (WebException e)
            {
                isSiteDownloaded = false;
                htmlError = e;
                try
                {
                    using (StreamReader hataoku = new StreamReader(e.Response.GetResponseStream()))
                    {
                        sb.Append(hataoku.ReadToEnd().ToString());
                    }
                }
                catch (Exception ex) { htmlError = new WebException(ex.Message, ex.InnerException); }
            }
        }



Bu örnekler ile bir çok uygulama türetilebilinir. Özetle IIS e kolayca hükmedebiliyoruz. Hatta bu uygulamayı biraz daha geliştirip, asp.net üzerine taşıyıp, dilediğiniz zaman akıllı telefonla, internet olan her yerden sunucunuzdaki siteleri web (http) üzerinden kontrol edebilir, hükmedebilirsiniz. Kimileri için vazgeçilmez olabilir bu tür sistem :D kendimden biliyorum ...

İnternetteki http protokolundeki herşeyi kontrol edebilir, kaynak kodunu , hatasını elde edebilirsiniz. Kötü niyetli de kullanabilirsiniz aslında :) düşünün threading ile binlerce kez bir siteyi GET etmenizi sağlıyan bir uygulama düşünün :) . Evet hedef site de çok inanılmaz trafik oluşur ve zamanla IIS cevap veremez olur :) tabi sizin network genişliğinize bağlı :) sevmediğiniz sitelere erişimi engelliyebilirsiniz. 



26 Temmuz 2012 Perşembe

Object Serialize - Deserialize

Nesnemizi  JSON olarak serialize- deserialize işlemini tek resimde anlatım ;)

              using System.Runtime.Serialization.Json;



Nesnemizi XML olarak serialize - deserialize etmek için ;)





Google Charts - GeoMap

Etiketler; işlevsel, başarılı, kullanışlı, akıllı, zengin,esnek ...

özetle :) hayran kaldım. .Net web projelerimde kullanmak için hemen kütüphanesini oluşturup ajax- postback de sorunsuz çalışacak bir mimari oluşturunca yeme yanında yat :) 

Tek olumuz yanı sistemin online olması. intranet kullanımlar için "http://www.google.com/jsapi" adresine erişim için izin verilmesi gerekmektedir. aksi halde Google 'un script kütüphanesi yüklenememiş ve grafik çizilmemiş olur.

Kaynak;