logo Unutmayayım diye yazdıklarım...

Logo Unity API'de SqlClause Kullanımı

14.01.2010 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.

Daha önce yazmış odluğum Logo API' ile ilgili yazıyı referans göstererek yazılmış bir çok e-posta alıyorum. Genelde e-posta içeriği SqlClause kullanımı ile alakalı olduğu için genel bir örnek yapıp burdan paylaşayım dedim.

Senaryomuz şöyle;

Logo üzerindeki bir carinin logo üzerindeki kodu ve ismini getiren bir sorgu yazmak istiyoruz. Bunun için de Logo api'sinde ki veritabanını bozmamak ve stabil, iyi sorgular oluşturmak için tasarlanmış SqlClause sorgu sınıfını kullanacağız. Bu sınıf'ı kullanarak yazdığınız sorgular kesinlikle logo'nun seveceği sorgular olup, sistem üzerinde herhangi bir probleme neden olmaz, kendileride zaten bu yöntemi öneriyorlar.

"Unity Object kullanıcılara query yazmak için IQuery nesnesini sağlamıştır. IQuery nesnesi ile Select tipindeki queryleri çalıştırmak hem çok kolay hemde çok hızlıdır. Querylerle veri ilişkisini bozabileceğinden insert, update veya delete tipindeki queryleri çalıştırma tavsiye edilmez, fakat IQuery nesnesi bu tür queryleri çalıştırmanızada izin verecektir.

 

IQuery nesnesini kullanarak iki şekilde SQL cümleleri oluşturabiliriz. İlk yöntem SQL cümlesini direct olarak Statement özelliğine geçip OpenDirect veya Execute metodlarıyla çalıştırmak veya SQL Clause'lar yardımıyla oluşturmak. Statement özelliğini kullanarak SQL cümlelerini oluşturursak veri tabanına bağımlı hale geliriz. MS SQL Server için yazdığımız bir sorgu ORACLE veya LBS UNITY programının desteklediği başka bir sunucuda çalışmayabilir. Veri tabanına bağımlılığı ortadan kaldırmak için SQL Clause'lar oluşturulmuştur. Clause'lar yardımıyla sorgumuzun belli kısımlarını tanımlar, sorgunun birleştirilme kısmını UnityObject'e bırakırız. UnityObject tanımlarımızı alır, UConfig programımızda belirtiğimiz veritabanı formatına kendisi çevirir. Clauseları kullanmak biraz işyükü getirmekle beraber veritabanı bağımlılığını ortadan kaldırır. Tanımladığınız sorgular LBS Unity programının desteklediği ve ilerde destekleyebileceği ortamlara ek bir işlem yapmanıza gerek kalmadan sorunsuz çevrilip çalıştırılacaktır"

Gelelim kod örneğine;

Ben .Net üzerinde C# kullanarak bir console uygulaması olarak geliştirdim.

    class Program
    {
        static void Main(string[] args)
        {
            ARP_List();
        }

        static void ARP_List()
        {
            bool eof = false;

            //COM bileşeni referansı oluşturuluyor
            UnityApplication unity = new UnityApplication();
            if (unity.Connect())
            {
                // Logo kullanıcısı ile giriş yapılıyor
                if (unity.UserLogin("LOGO_KULLANICISI", "SIFRE"))
                {
                    // Hangi firma üzerinde işlem yapılacağı "firma no" ile belirleniyor.
                    if (unity.CompanyLogin(310))
                    {
                        //Yeni bir sql sorgusu çalıştırmak istediğimizi belirtiyoruz.                       
                        Query qr = unity.NewQuery();                       

                        // Gerekli olan alanları (field) SelectClause ile belirtiyoruz.
                        qr.SQLClause.SelectClause.New("A.CODE", "code");
                        qr.SQLClause.SelectClause.New("A.DEFINITION_", "def");

                        // Hangi tablo ile veri işleyeceğimizi belirtiyoruz.
                        qr.SQLClause.FromClause.NewTable("LG_310_CLCARD", "A");

                        // Sorgumuzun kriterlerini belirtiyoruz.
                        // Burda CODE'u 100'e eşit olan firmalar listeleniyor.
                        qr.SQLClause.WhereClause.New("A.CODE", RelationalOperator.roEqual, "100", LogicalOperator.loNone);

                        //SQLClause ile oluşturulan sorgunun çıktısı Statement özelliğine atanıyor.
                        qr.Statement = qr.SQLClause.SQL;

                        // Sorguyu çalıştırıyoruz.
                        if (qr.OpenDirect())
                        {                           
                            eof = qr.First(); //İlk kayıt isteniyor. Yoksa false döner;

                            //First(); ile alınan ilk kayıt bilgisi okunuyor.
                            while (eof)
                            {
                                Console.WriteLine("{0}\t{1}", qr.QueryFields[0].Value,
                                    qr.QueryFields[1].Value);

                                eof = qr.Next(); // Sonraki kayıt isteniyor. Yoksa false döner;
                            }
                        }

                        qr.Close(); // Sorgumuzu kapatıyoruz.
                    }
                    unity.CompanyLogout();
                }
                unity.UserLogout();
            }
            unity.Disconnect();
        }       
    }

Açıklamaları kodun içine yazdığım için tekrardan açıklamak gereği duymadım.

Umarım yardımcı olur...


absmiddle Yorum

Struct'dan haberdar olmanız yetmez, kullanmanız gerekir

11.01.2010 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.

Yazılım geliştirirken bizi sırtlayan programlama çatısının özelliklerini tek tek ve çok ayrıntılı bilmemiz her zaman mümkün olmuyor, fakat bazı özellikler var ki hem geliştirilen programın kalitesini, hem de performansını büyük ölçüde etkileyebiliyor. Bu etkiyi C# programlama dilinde yaratabilecek özelliklerden bir tanesi de Struct (Yapı) veri tipidir ve konuda budur.

Bilindiği gibi Struct ile yapılabilen her işlemi ve daha fazlasını Class ilede yapılabiliyor. Peki neden Struct kullanalım? diye sorabilirsiniz. Aşağıda bu sorunun cevabını kendi tecrübelerime dayanarak vermeye çalıştım.

  • Struct bir değer türü olduğu için oluşturulduğunda Stack bellek bölgesinde tutulur. Stack bellek bölgesinde yeni bir nesne tanımlamak ve nesneye erişmek, class'ların tutulduğu Heap bölgesinden daha hızlıdır.
  • Programın struct nesnesi ile işi bittiğinde Garbage Collector anında devreye girip lazım olmayan struct nesnelerini temizler. Böylece siz programcı olarak bu kaynağı işi bitti diye tekrar serbest bırakmak zorunda kalmazsınız.
  • Algoritmanızda Birden fazla değişkeniniz varsa bunları tek tek yönetmek yerine Struct ile bu değişkenleri tek bir veritipi haline getirebilirsiniz.
  • Ben OOP'nin tüm nimetlerinden yararlanmak istiyorum ama struct kadar performanslı da olsun diyorsanız yine struct içinde method, constructor, değişken ve indexleyici kullanabilrisiniz.
  • Struct, aynı class gibi private, public, internal, protected, protected internal değerlerini alabilir.
  • Struct'lar İçiçe tanımlanabilir (Nested Structure) hemde çok zevkli olur.

Tabi Struct'ı her zaman kullanacağız diye bir şey yok, sadece işimize geldiği zaman kullanalım. Bazı durumlarda da aşağıdaki nedenlerden dolayı hiç kullanmamalıyız.

  • Struct'lar bir birlerinden türeyemez (Inheritance) ama birden fazla Interface'den türeyebilir.
  • Struct'lar da yapıcı (Constructor) method varsayılan olarak parametresizdir ama yinede siz kendi parametrik yapıcı metodlarınızı tanımlamayabilirsiniz. Herhalükarda varsayılan yapıcı metod çalışacaktır.
  • Programınız içinde nesneler arası bağlantı, kompleks ilişkiler varsa struct kullanmamalısınız.
  • Struct'lar da statik üye tanımlayabilirsiniz ama nesneyi yarattıktan sonra erişemezsiniz.

Struct'lar neredeyse her yönü ile Class'lara benzerler yalnız class'lardan biraz daha kısıtlıdır ama daha da hızlıdır. Yukarıdaki maddeler size nerede struct kullanmanız gerektiği hakkında az çok fikir verebilir ama doğru karar vermeniz için tecrübeniz olması gerekir çünkü bu meslekte tecrübe herşeydir ;)

Class ve Struct'ı basitçe karşılaştırıp aradaki farkı performans açısından ele almak için basit bir test programı hazırladım bakalım sonuç nasıl çıkacak.?

    class Program
    {
        class clsHayvanlar
        {
            public string a { get; set; }
        }

        struct srtHayvanlar
        {
            public string a { get; set; }
        }

        static void Main(string[] args)
        {
            string tmp_ = string.Empty;            
            Stopwatch s1 = new Stopwatch();
            s1.Start();

            List cls_list = new List();
            for (int i = 0; i < 1000000; i++)
            {
                cls_list.Add(new clsHayvanlar() { a = "value" });// Heap bellek bölgesinde yer ayrılıyor.
                tmp_ = cls_list[i].a; // Heap bölgesinden okunuyor.
            }
            s1.Stop();

            Console.WriteLine("class\t: {0:N2}",s1.ElapsedMilliseconds);


            Stopwatch s2 = new Stopwatch();
            s2.Start();

            List str_list = new List();
            for (int i = 0; i < 1000000; i++)
            {
                str_list.Add(new srtHayvanlar() { a = "value" }); // Stack bellek bölgesinde yer ayrılıyor.
                tmp_ = str_list[i].a; // Stack bölgesinden okunuyor.
            }
            s2.Stop();

            Console.WriteLine("struct\t: {0:N2}",s2.ElapsedMilliseconds);
        }
    }


-----------------
class   : 232,00 ms
struct  : 90,00 ms

Görüldüğü gibi Struct lehine bariz fark var ama bu durumun tam tersi olduğu zamanlarda olabiliyor tabi bu ayrı bir yazı konusu.

Ben genelde Struct'ı dağınık verileri toparlamak, çoğu zamanda yeni bir veri türü oluşturmak için kullanıyorum, gerisi zaten GC'a ve Framework'e kalıyor. Genelde kullandığım yapı aşağıdaki gibi. Yeni bir veri türüne ihtiyacım varsa bu türü yaratırken Struct kullanmam işimi fazlasıyla görüyor.

    class Program
    {
        static List d_list;
        static void Main(string[] args)
        {
            d_list = new List(Directory.GetFiles(".\\").Length);

            foreach (var item in Directory.GetFiles(".\\"))
            {
                d_list.Add(new sistem_dosyasi(
                    new FileInfo(item)));
            }
        }

        struct sistem_dosyasi
        {
            public long size;
            public string name;

            public sistem_dosyasi(FileInfo fi)
            {
                this.size = fi.Length;
                this.name = fi.Name;
            }
        }
    }





absmiddle Yorum

C#'da Operator'lerin Performansı

02.01.2010 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.

Yine opensource bir uygulamanın kodlarını incelerken bazı yerleri refactor ettiğimde daha hızlı çalıştığını gördüm. Revize ettiğim yerlerde genelde operator'lerin kullanımı ile alakalıydı. Böyle bir kaç gereksiz ve performans düşürücü kod ile karşılaşınca da operatör performans'ı ile ilgli birşeyler yazmaya kadar verdim ;)

Sık sık kullandığım ve kullanmaya dikkat ettiğim karar verici operatörlerin kullanım yerleri ve karşılaştırmalarını basit olarak gösteren giriş seviyesi bir yazı oldu.

C# Condition'lar

Condition'dan kastımız if, switch, :?, ?? gibi operatörlerin yerine göre kullanı mı, karar verme mekanizmalarınızın hızlı olmasını sağlayacaktır. Örnek vermek gerekirse aşağıdaki gibi string karşılaştırması yapacaksanız switch kullanmanız en performanslı sonucu almanızı sağlayacaktır.


        static void switchCondition(string hayvan)
        {
            switch (hayvan)
            {
                case "At":
                    break;
                case "Öküz":
                    break;
                case "Eşşek":
                    break;
                case "Kedi":
                    break;
                case "Köpek":
                    break;
                case "Ejderha":
                    break;
                default:
                    break;
            }
        }

Bu kodun aynısını if blok'u ile de yapmanız mümkün fakat her ne olursa olsun switch bu durumda çok daha hızlı çalışacaktır. Gel gelelim switch'inde kötü performans verdiği yerler var. Aşağıdaki if kullanımı da switch'den daha performanslı çalışacaktır.

        static bool IfOrCondition(string hayvan)
        {
            return (hayvan == "At" || hayvan == "Öküz" || hayvan == "Eşşek" || hayvan == "Kedi" || hayvan == "Köpek" || hayvan == "Ejderha");
            
        }

Bu kodun birde switch karşılığını elealırsak aşağıdaki gibi yapı çıkıyor. Burda da if daha hızlı karar veriyor.

        static bool switchOrCondition(string hayvan)
        {
            switch (hayvan)
            {
                case "At":
                case "Öküz":
                case "Eşşek":
                case "Kedi":
                case "Köpek":
                case "Ejderha":
                    return true;
                default:
                    return false;
            }
        }

Bire bir değer karşılatırırken de == (Eşittir) operatörü yerine Equals metodunu kullanmanız performansınızı hızlandıracak bir harekettir. Bunu ufak bir test programı yazarak karşılaştırdım ve aşağıdaki gibi bir sonuç çıktı.

        static void EqualsCondition(string hayvan)
        {
            if (hayvan.Equals("At"))
            {

            }
            else if (hayvan.Equals("Öküz"))
            {

            }
            else if (hayvan.Equals("Eşşek"))
            {

            }
            else if (hayvan.Equals("Kedi"))
            {

            }
            else if (hayvan.Equals("Köpek"))
            {

            }
            else if (hayvan.Equals("Ejderha"))
            {

            }
        }

==         : 9,7233 ms
Equals    : 0,8875 ms

Özellikle string karşılaştırırken Equals kullanmanız performans açısından yararınıza olacaktır.

Bazı durumlarda da ne if, nede switch kullanmanız gerekmez, Diğer dillerde olduğu gibi C#'da da Inline kullanılabilecek operatörler vardır ve gerektiğinde kullanılırsa hem kodunuz daha kolay okunur hemde performans kazanırsınız. If kullanarak uzun uzun oluşturduğunuz bu kod bloğunu.

        static bool IfConditional(string hayvan)
        {
            if (hayvan.Equals("Ejderha"))
                return true;
            else
                return false;
        }

Inline bir conditional operatör kullanarak aşağıdaki şekilde az kod ile ve daha hızlı çalışır vaziyete getirebilirsiniz.

        static bool Conditional(string hayvan)
        {
            return hayvan.Equals("Ejderha") ? true : false;
        }

Bu iki kod arasındaki karşılaştırma sonucunda da aşağıdaki gibi bir sonuç çıktı.

If    : 0,9262ms
:?    : 0,4659ms

Inline kullanabileceğimiz diğer bir operatörde ?? operatörü'dür. Herhangi bir nesnenin null olup olmadığını kontrol eder eğer null ise belirleyeceğiniz değeri nesnenin değerine atar. Bu operatörü yine if ile karşılşatırırsak aşağıdaki gibi bir If kullanımını.

        static string IfAssigmentOp(string hayvan)
        {
            if (hayvan == null)
                return "Ejderha";
            else
                return hayvan;
        }

?? operatörü kullanarak refactor edebiliriz.

        static string AssigmentOp(string hayvan)
        {
            return hayvan ?? "Ejderha";
        }

Tahmin edeceğiniz gibi bu kod'da if bloğu kullanarak oluşturulmuş kod'dan hızlı ve kısa'dır.



absmiddle Yorum

Developer Neden Fazla Mesai Yapar?

22.12.2009 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.

Nacizane kendi tecrübelerimden ve gözlemlerimden yola çıkarak. Neden projeler planlandığı zamanda bitmez? Neden hep developer insanı daha çok çalışmak zorunda kalır? sorularına sebep olan maddeleri sıralamaya çalıştım.

Developer Neden Fazla Mesai Yapar?
  • İşe projeyi planlamak ile değil, işe direkt kod yazmakla başlıyorsa. (Bknz. guerilla coding, spaghetti coding)
  • Müşterinin gazlamasıyla gelecekte gerekli olabilecek veya hiç gerekli olmayacak modüller için fazladan kodlama yapıyorsa.
  • Her zaman her isteğe cevap verebilecek, tam donanımlı, mükkemmel bir yazılım çıkarma egosu varsa.
  • Her zaman en basit, en verimli, en hızlı çözümü sunmayı düşünmüyorsa.
  • Proje'nin ihtiyacı olan hızlı ve hatasız sistemi geliştireceğine proje için çok hayati olmayan "hata loglama sistemini" yazmaya kalkıyorsa.
  • Müşteri tarafında ne istediğini doğru anlatabilen bir partner bulamıyorsa.
  • Yazdığı programı başkalarına/müşteriye test ettirmeden, kendisi test ettikten sonra "tamam oldu release ediyorum" diyorsa.
  • Geri bildirime ve müşteri testlerine önem vermiyorsa.
  • Proje'de ki bug'ları sürekli erteleme eğilimi içindeyse.
  • Bir iş için tasarlayabileceği en basit modeli tasarlamaya çalışmıyorsa.
  • Müşterinin mantıklı ve saçma isteklerini analiz edip akıl süzgeçinden geçiremiyorsa.
  • Yanılmaktan ve yanlış yapmaktan korkuyorsa.
  • Ego'sunu sürekli sırtında taşıyorsa!
  • Yeni başlayan junior developer'dan da yeni şeyler öğrenebileceğinin farkında değilse.
  • Proje'nin nasıl işleyeceğini müşterisine en baştan öğretmiyorsa.
  • Projeyi bitirmek için sürekli kod yazmak gerektiğine inanıp, gerektiğinde dinlenmeyi ve iki tek bira atmayı bilmiyorsa.
  • Müşteriyi projeden uzak tutmak gerektiğine inanıyorsa.
  • Müşteri tarafında ki partnerini iyi bir şekilde yönetemiyorsa.
  • Proje başlangıcında gereksinimleri belirlemeden hareket ediyorsa.
  • Proje'de özellikleri mümkün olduğu kadar ufak parçalara bölmekten kaçınıyorsa.
  • Artık teknik kararları da müşteri almaya başlamışsa.
  • Müşteriye "müşteriliğini bilmesi" gerekitğini açık ve net söylemeye çekiniyorsa.
  • İş planının ne kadar süreceğine kendisi değil, müşteri karar vermeye başlamışsa.

...emektar developerımızın mesaisi bitmez, aldığı projeleri batar ve hep stresli mutsuz yaşar.

Bunların hepsi benim geçmiş zamanlarda yapmış olduğum hatlar, önemli olan bu hataları sürekli tekrarlamamak ki öyle yapmaya çalışıyorum.
Aslında bütün maddelere birer örnek verip açıklamak istedim ama örnekleride okuyucu düşünsün diyerekten üşengeçliğimi haklı bir çerçeveye oturtarak yazıyı böyle bırakıyorum :)

absmiddle Yorum

Son durum ve havadisler

16.12.2009 tarihinde yazıldıktan sonra, 2 kişi yorum yazmış.

Aldığımız kıllı bir CRUD projesinin sonuna geliyoruz ve ben nihayet yapmak istediklerimin ilk adımlarını geçte olsa atmaya başladım, bakalım yeni çıkacağım bu yolda beni neler bekleyecek. Şu an kesin bir şey gerçekleşmediğinden detaylı bilgi vermek istemiyorum fakat belirli bir sektörde ihtisaslaşmış ve sadece o sektöre hizmet verecek yeni bir oluşum içindeyim.

Belirli projelerin her zamanki gibi gecikmesi, çevik yazılım geliştirme sürecinin bazı dezavantajlarını külliyen yaşamamız sebebiyle blog'a istediğim kalitede yazılar yazmak için zaman ve istek duymuyordum. Artık o dönemi yavaş yavaş atlatıp biraz içerik üretme hevesim geldiğine göre bu yazıyı, bu site için yeni bir dönemin başlangıcı sayabilirim.

C#, Perl, Phyton programlama dili konularında yeni edindiğim bilgi ve tecrübeleri derinlemesine inceleyip olumlu ve olumsuz yanlarını irdelemek ve tartışmak, gerçek projelerde ki etkili ipuçlarını paylaşmak istiyorum. Umarım bu dediklerimi sistematik bir biçimde yapabilirim.

Yeni yılın herkese hayırlı ve uğurlu olması dileği ile...


absmiddle Yorum

Windows 7, Connectify ve No Paging

20.11.2009 tarihinde yazıldıktan sonra, 10 kişi yorum yazmış.

Windows 7 dağıtılmaya başlandıktan sonra hayatımız nispeten daha kolaylaştı. Bende böyle hayatı kolaylaştıran programlar keşfettikçe beşeriyetle paylaşasım geliyor. Aslında tamamen aradığımı buraya girip bulayım diye yazıyorum.Yani sanat, sanat içindir'i blog, blogger içindir olarak sallayabiliriz.

Akabinde faz bir olarak windows 7'nin çoklu wireless network desteği ile başlayalım. Güzel ve hayatı kolaylaştıran bir özellik ama benim bahsetmek istediğim bu özellik ve detayları değil buna bağlı olarak geliştirilen connectify programı.
Ürünü geliştirenler, ürünü tanımlarken Software-Based Wireless router olarak tanımlamışlar ve cuk diye oturmuş. Connectify 'ı Windows 7 üzerine kurup çalıştırdığınızda sizi bir hotspot'a çeviriyor. Daha sonra sizde başka kullanıcılara internet'iniz paylaştırabiliyorsunuz. Şimdilik belirli wireless kartlarını destekliyor bunlarda piyasada her computer'da olan kartlar. Connectify'i burdan indirebilir, video'sunu burdan seyredebilirsiniz.

Gelelim faz 2'ye Windows'un page file olayı.
Windows XP'den beri gelen bu özellik, Windows 7 ile daha da optimize edilmiş ve kullanılabilir duruma gelmiş. Önce page file'ı kapatmanın yolunu yazayım daha sonra da neden kapttığımızı nacizane anlatmaya çalışayım.

Windows Tuşu + Pause'a basarsanız karşınıza System penceresi gelir, daha sonra soldaki menüden Advanced System Settings'e, ardından Advanced tab'ına onun arkasından'da Performance butonuna bastığınızda Performance Options penceresine ulaşmış olursunuz.
Burdan Advanced sekmesine tklayıp Change butonuna basarsanız Virtual Memory penceresine ulaşırsınız ve ortalarda olan No Paging File'ı görebilirsiniz işe bunun yanındaki radiobutonunu işaretleyip tamam dediğinizde işlem gerçekleşmiş oluyor.Sonra restart edip değişikliklerin aktif olmasını sağlayacaksınız.

Gelelim böyle bir manyaklık neden yapıyoruz. Disk yüzünden! Bildiğiniz gibi windows page file'ı esasen disk üzerinde tutulan bir dosyadır. Programlar çalışma esnasında bu disk üzerinde tutulan page file'a erişirler ve değişken değerlerini buray yazarlar ve okurlar burda disk üzerinde I/O denilen olayı yaratır. Diskiniz ne kadar zamanda yapılmak istenen işleme tepki verebilirse windows'unu ve üzerinde çalışan programlar o kadar hızlı veya yavaş çalışır. Diskiniz çok yavaşsa page file kaldırmanız disk erişimini ortadan kaldıracağı için tüm değerlerin RAM üzerinde tutulmasını sağlayacaktır.Ram'e erişmeniz disk'e erişmenizden kat be kat hızlı olduğundan sizde gözle görülür bir hız kazanacaksınız.
Dez avantajı nedir derseniz de ram'iniz az ise pek tavsiye etmiyorum (2GB'nin altında). Ram'iniz dolduğunda çalışan programlar büyük ihtimal hata verir ve kendini sonlandırır. Fakat oyunlarda güzel performanslar elde edilebiliyor. Ben 4GB'ram ile C&G Generals III'de gerçekten gözle görülür performans yaşadım.

Deneyin görün, paylaşın..



absmiddle Yorum

İp ucu: Asp.Net RenderControl

14.11.2009 tarihinde yazıldıktan sonra, 1 kişi yorum yazmış.

Asp.Net sayfalarında runat="server" olarak işaretlenmiş kontrollerin HTML textlerini alma ihtiyacınız doğabilir. Bunu Web Kontrolü'nün (Control) RenderControl() metodu ile yapabiliyoruz.
RenderControl metodu HtmlTextWriter tipinde parametre alıyor, HtmlTextWriter yapıcı metodunda (Constructor) da StringWriter tipinde bir parametre alıyor. Bunlar birbirlerini yazabilme kabiliyeti ile kontrol'ün HTML çıktısını kolaylıkla erişmenizi sağlıyor. Şöyle ki;
        StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
panel.RenderControl(htw); //panel burda asp.net sayfasında herhangi bir kontrol
string control_text = sw.GetStringBuilder().ToString();
Böylece control_text değişkenimize kontrol'ün sayfada gösterilmekte olan HTML çıktısını atamış oluyoruz. Bu durum asp.net sayfasının bir bölümünün e-posta ile göndermek durumunda kaldığım zaman lazım oldu. Oldukça da kolay bir şekilde işlemi gerçekleştirdik.


absmiddle Yorum

Fikir: Renk körleri için

31.10.2009 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.

Ortaca kardeşim kırmızı-yeşil renk körü. Esasen yaşantısına çok etki etmiyor ama ağ kablosu çakarken, lambalara bakarken zorlanıyor. Bu durumu düşünürken aklıma sorunu kısmen çözebilecek, medikal olmayan pratik bir fikir geldi.
İnsanın her zaman yanında taşıyabileceği bir cihaz'a (cep telefonu, anahtarlık v.b.) yerleştirilen renk pigmentlerini algılayan ve yazı olarak çıktı veren bir sensör olsa renk körlerinin hayatı daha da çok kolaylaşır.
Kendi açımdan sorunu şu şekilde çözebilrim:

Cep telefonu kamerasını kullanarak belirli bir hedefi capture eden ve hedefteki noktanın rengini algılayıp ekrana yazı olarak çıktı veren bir uygulama yazabilirim, hatta yazayım.

Diğer taraftan sensör olarak nasıl çözülür? veya bunu uzak mesafeler için lazer'li yapabilirmiyiz? sorularını da merak etmeye başladım şimdi.



absmiddle Yorum

C# DataRow Field Extension Method

17.10.2009 tarihinde yazıldıktan sonra, 0 kişi yorum yazmış.

Alper hoca'ya bugün veri katmanımızdan kendi class'ımıza verileri aktarırken null kontrolünü generic yapan bir fonksiyonu nasıl yazarız diye sordum. "Yine başımıza iş çıkartıyorsun" diye bana takılırken, başka bir yerdende kodu hemen yazmaya girişti.
Olay burda Type olduğu için C#'ın Generic Type Parameters'lardan yararlandık. Böylelikle geri dönüş değerini istediğimiz bir tip verip metod içinde de null value kontrolü rahatlıkla yapar olduk.

Metodu yazarken Alper hoca'nın DataRow.Field<> isminde bir extensions metod dikkatini çekti esasen bizim yazmak istediğimiz metodun aynısıydı adamlar yazmış diyip Reflector ile incelemeye başladık. İnceleyip biraz kopya çektiktan sonra DataRow'dan gelen verinin null kontrolünü yapan bu seksi örneği çıkardık.
        public static T GetValue(DataRow dr, string field)
{
if (typeof(T).IsValueType)
{
if (dr[field] == DBNull.Value)
{
return default(T);
}
else
{
return (T)dr[field];
}
}

return (dr.IsNull(field)) ? default(T) : (T)dr[field];
}
Biraz daha detaylandırıp fazla uzatmaden kullanımını örneklersek:
            DataTable DataTablom = new DataTable();
DataTablom = VerileriYukle();

foreach (DataRow row in DataTablom.Rows)
{
int tablo_id = GetValue<int>(row,"id");
DateTime tablo_tarih = GetValue<DateTime>(row, "tarih");
bool durum = GetValue<bool>(row, "durum");
}
şeklinde metodu kullanabilirsiniz. Esasen .Net takımı bizim yerimize Field<> metodunu zaten yazmış. Bu metodu kullanmak bazı durumlarda tam emin olmamakla birlikte daha stabil bir kontrol sağlar düşüncesindeyim. Metodu kullanmak içn System.Data.DataSetExtensions.dll'ini projenize referans vermeniz gerekir. Reflector ile inceleyeceksenizde yine bu dll dosyasını disassembly etmeniz gerekir.

Field<> Extension'una örnek vermek gerekirse:
            DataTable DataTablom = new DataTable();
DataTablom = VerileriYukle();

foreach (DataRow row in DataTablom.Rows)
{
int tablo_id = row.Field<int>("id");
DateTime tablo_tarih = row.Field<DateTime>("tarih");
bool durum = row.Field<bool>("durum");
}
şeklinde kulllanımı var. Metodun mantığını kavradıktan sonra tabiki DataRow.Field Extension Metodunu kullanıyorum. Ufak bir detay ama bu kontrolleri yapmazsanız data access katmanındaki tutarsız veriler size bug, sorun, bir sürü hata ekranı ve mutsuz kullanıcılar olarak geri dönecektir...

Bu arada twitteramesaj.com olarak açtığımız ufak porjemizde bizi destekleyen bir sponsor bulduk. Bize sağlayacakları gms modem ile daha stabil ve hızlı bir alt yapımız olacak yoksa benim telefon'a kalsak 10 sms den sonra hararet yapıyor, kullanıcılar'da sms gönderdik yazmadı diye kızıyorlar :)


absmiddle Yorum

twitter'a sms (txtr)

15.10.2009 tarihinde yazıldıktan sonra, 9 kişi yorum yazmış.

Özkan'ın fikir vermesiyle ufak bir Twitter uygulaması yazdım. Twitter'ın Türkiye'ye SMS hizmeti vermemesinden yola çıkarak insanların işine yarayacak bir uygulama/servis oldu. Tabi kullanılır mı bilmem?
Uygulamaya twitter hesabınızı kullanarak izin verip, telefon numaranızı tanıtıyorsunuz daha sonra +90 554 993 2429 numarasına durumunuz ile ilgil kısa mesaj atıyorsunuz ve twitter durumunuz güncelleniyor.

Servisi kullanabilmek için http://www.oguzhan.info/txtr adresinden (Şimdilik. Beta testlerinden sonra twitteramesaj.com adresine alacağız) "Hemen Kullanmak İstiyorum" butonuna basmanız daha sonra twitter.com üzerinden oturum açmanız ve cep telefonunuzu servise tanıtmanız gerekiyor. İnsanlar bu yeni servise güvenmez ve şifrelerini vermek istemezler diye Twitter'ın oAuth API'sini kullanarak kullanıcıların güvenli oturum açmalarını ve kendilerini tanıtmalarını sağladık.

Sms gateway olarak MessagingToolkit kütüphanesini kullandım. Her ne kadar COM' portları ile ilgili sorun çıkarsada open source olduğu için bir kaç patch yazdıktan sonra adam ettik. Sms notification olayının çalışması içinde "AT+CNMI" modem komutunu destekler nitelikte bir telefon olması lazım yoksa bu olay tetiklenmiyor ve kendiniz bir watchdog yazmanız gerekiyor. Benim kullandığım Motorola telefonda AT+CNMI destekler nitelikteydi (Nokia'lar bu komutu külliyen desteklemiyor).

Veritabanı olarak SQLite kullandım hızlı, basit, iş gören bir şey. Twitter'a oAuth haberleşmesi için daha önce Shannon Whitley'in yazmış olduğu Twitter oAuth sınıfını kullandım. Farklı örneklerine http://apiwiki.twitter.com/OAuth-Examples adresinden erişebilirsiniz.

Telefon numarasını daha önce atıl durumdaki avea hattın numarası olarak belirledim  +90 554 993 2429 tabi daha seksi bir numarada belirleyebilirdim ama eldeki malzeme bu.

Şimdi telefonu şarj'a taktım bir taraftanda bilgisayara bağlı sms bekliyor.

Son olarak sitenin projeler bölümünü güncelledim ve blog'larda ki modaya uyarak sosyal iletişim antenlerimi sağ üst köşeye menemen testtisi gibi dizdim. Şimdi trendy bir blog oldu diye kendimi kandırıyorum oh oh ne güzel.


absmiddle Yorum

Sosyal Ağ Antenleri
Blog RSSLinkedinFacebookFlickrTwitterFriendfeedGoogle ReaderYoutubegit
  • Açılış
  • Projelerim
  • Arşiv
  • İletişim
  • Paylaştım
  • En çok ilgi görenler...

    Red Alert 2 Multiplayer
    NETSH'dan faydalanmak
    Mikrotik
    Twitter Şeyi
    MsnAdd-in : MsnDurumu Eklentisi
    Mikrotik ADSL Bridge.
    Netsis SQL Raporları.
    SQL Server Optimizasyonu.
    VBScript.Encode - Encode
    Msn Add-in MsnKi
    ReportViewer'ı dağıtmak
    Netsis SQL Server Değişikliği.
    Windows Sunucularda SYN Atakları.
    MSN Robotu

    Rastgele birşeyler...

    Sözün Bittiği Yer!...
    Proje: MSN Translate...
    WMI kullanarak C# il...
    İçkili Entryler :)...
    Ve Tabikidee Ahmet A...
    TCMB Kurlarının Xml ...
    Parti İçin Ev....
    WINHM - Hosting Cont...
    SharpOs...
    Huh! WiiMote...
    VBScript.Encode - De...
    Siteye yeni özellik....
    Terhis Töreni...
    localdedicated.com...
    Fikirim Geldi....
    Busa'dan ilk entry...

    Şebeke

    Dükkan, Fıroİş, Denizİş, Serkan, Semih, Sewgi, Beşir, Vosvos, Erkan, Emre, Aliİş, WHT, Lütfü, Alper

    [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

    2003 - Oğuzhan YILMAZ
    Bir şey alıntıladığınız zaman kaynak göstermeniz yeterli.


    Web Hosting Sponsor Vargonen Technologiies