Ana Sayfa | English Blog | Seminer TV | Dil Cookie Sil  Blog'u Mail ile takip et!       
Daron Yöndem - LINQ
bir yazılımcının tasarıları...
 Sunday, December 27, 2009

Koca bir INETA NEXT serisi bitti! :) Bu hafta sonu gerçekleştirdiğimiz Denizli etkinliği ile beraber 2009'ın NEXT serisine son vermiş olduk. Diyarbakır, İstanbul, Kayseri ve Denizli turumuz INETA kapsamında tüm sosyal topluluklar ve editörleri ile beraber son iki yılda gerçekleştirdiğimiz en büyük hareket oldu. Tüm bu seri boyunca katkıda bulunan INETA sosyal topluluklarımıza ve sevgili konuşmacılarımıza ÇOK teşekkürler.

Muammer Benzeş (birliktegelistir.com)
Erkan Balaban (Ceviz.net)
Oğuz Yağmur (csharpnedir.com)
Uğur Umutluoğlu (nedirtv.com)
Barış Kanlıca (yazgelistir.com)
Burak Selim Şenyurt (nedirtv.com)
Selçuk Yavuz (Ceviz.net)

Tüm etkinlikler boyunca en çok merak edilenlerden birinin "Beyin" olduğunu gördüm :) Biliyorsunuz ilk etkinliği duyurduğumuzda her şehirde bir katılımcıya yeni bir beyin vereceğimizden bahsetmiştik. Bu beyin konusunda ben her ne kadar samimi olsam da :) herkes "beyin" kelimesinden yola çıkarak çok farklı şeyler düşünmüş. Oysa gerçekten de "beyin" derken "beyin" demek istemiştim :)

Yepyeni bir beynin sahibi!
Yepyeni bir beynin sahibi!

Fotoğrafta da görebileceğiniz üzere arkadaşımız yeni beynini sevinçle karşılamış durumda :D Her şehirde bu şekilde bir beyin hediye etme şansımız oldu. Beynin özelliği gerçek bir beyin "vıcıklığında" olma ile beraber her ne yaparsanız yapın esnese de şeklini kaybetmiyor olması :)

Etkinliklerimize katılan herkese tekrar defalarca çok teşekkürler. Bizi takip etmeye devam edin ;)

Sunday, December 27, 2009 10:23:48 AM (GTB Standard Time, UTC+02:00)  #    Comments [1]   .NET Framework 4.0 | ASP.NET 4.0 | C# | Expression Blend | Expression Studio | IE 8.0 | IIS 7.0 | LINQ | PLINQ | Silverlight 4 | Visual Basic 2010 | Visual Studio 2010 | WCF | Windows 7 | WPF  | 
 Wednesday, October 21, 2009

Bugün Samsun 19 Mayıs Üniversitesi'ndeydim. Bilişim günleri etkinliğinin ikinci gününde Silverligjt, WPF ve LINQ üzerine oturumlarım oldu. Uzun süredir Samsun'da bu gibi bir aktivitenin yapılmamış olduğu bilgisini öğrencilerden alırken aslında ben de çaktırmadan ilk Samsun ziyaretimi yapmış oldum. Kimse üstüne alınmazım ama :) deniz kenarı sevdam doğduğum şehir İstanbul'dan kaynaklanıyor olsa gerek.

19 Mayıs Üniversitesi Bilişim Kulübü ile hatıra fotoğrafı.
19 Mayıs Üniversitesi Bilişim Kulübü ile hatıra fotoğrafı.

Etkinliğe tahmin ettiğimin üzerinde bir katılım oldu. Sonrasında tam günlük seminer serisine dayanamayanlar da olmadı değil :) Hatta aldığım duyumlara göre ben varmadan önce "O kadar saat nasıl anlatacak" şeklinde sorular geziyormuş kulaktan kulağa :) Belli ki beni tanımıyorlar :) Şaka bir yana özellikle etkinlikte organizason için tüm Bilişim Kulübü'ne, hocalarımıza ve sevgili MSP Hacer Kübra Köse'ye çok teşekkür ediyorum. Benim için büyük bir zevkti. Umarım herkes için faydalı bir gün olmuştur.

Tuesday, October 20, 2009 11:16:07 PM (GTB Standard Time, UTC+02:00)  #    Comments [10]   LINQ | Silverlight 3.0 | WPF  | 
 Sunday, May 03, 2009

Bu hafta sonu epey yoğun bir tempo ile Ankara'da Bilkent Üniversitesi'ndeki iki etkinlik ve Çankaya Üniversitesi'ndeki bir etkinlik arasında gidip geldim :) Tüm bu tempo içerisinde XLINQ konusundan bahsettiğim her dakikada VB'nin Inline XML özelliğine hayran kalmayan kalmadı diyebilirim :) Ama gelin C#'cılar için de faydalı olabilecek bir ipucunu sizlerle paylaşiyim.

WCF Rest Starter Kit Preview 2

Aslında sizlere anlatacağım işlevsellik Rest based servislerin kullanımı için hazırlanmış. İsterseniz bu çerçevede aşağıdan download edebileceğiniz paketi bilgisayarınıa yükleyip diğer özellikleri de inceleyebilirsiniz. Fakat bizim bu yazımızda odaklanacağımız nokta C# ile XML sorgulama ve hızlıca XML yaratma konuları olacak.

http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644

Özünde bugün rahatlıkla C# ile XML sorgulayabilir veya yaratabilirsiniz fakat elinizde hazır bir XML kodu olduğunu düşünürsek bu kodu yaratacak veya okuyacak C# kodunu yazarken sürekli hedef XML'in yapısını incelemek zorunda kalıyoruz. VB'de Inline XML bu sorunu tamamen çözse de C# içerisinde ancak WCF Rest Starter Kit ile beraber gelen araçları kullanarak işimizi kolaylaştırabiliriyoruz.

WCF Rest Starter Kit ile beraber "Past XML as Types"
WCF Rest Starter Kit ile beraber "Past XML as Types"

Elimizde gelen hazır bir formatta XML yaratalım!

Elimize aşağıdaki gibi hazır bir formatta XML geldiğini varsayalım. Bir şekilde bu XML ile aynı yapıda elimizde yer alan farklı bir veriden XML oluşturmak durumunda kalırsak tek tek her tagı yaratan XElement, XAttribute vs nesnelerini yaratmamız gerekecektir. Oysa eğer bilgisayarınızda WCF Rest Starter Kit yükledi iseniz işiniz daha kolay.

[XML]

<?xml version="1.0" encoding="utf-8" ?>

<DenemeVeri>

  <Urunler>

    <Urun No="145">

      <Adi>Örnek Ürün</Adi>

      <Kodu>df234sd</Kodu>

    </Urun>

    <Urun No="146">

      <Adi>Örnek Ürün</Adi>

      <Kodu>df234sd</Kodu>

    </Urun>

  </Urunler>

</DenemeVeri>

WCF Rest Starter Kit kurulumunu tamamladıktan sonra doğrudan Visual Studio'nun Edit menüsüne giderseniz "Past XML as Types" diye bir seçenek göreceksiniz. Yukarıdaki örnek XML'i kopyaladıktan sonra Visual Studio içerisinde herhangi bir projeye yeni bir CS dosyası ekleyip içine kopyaladığımız XML'i "Past XML as Types" diyerek yapıştıralım.

[C#]

/// <remarks/>

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]

[System.Diagnostics.DebuggerStepThroughAttribute()]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]

[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]

public partial class DenemeVeri

{

 

    private DenemeVeriUrunler urunlerField;

 

    /// <remarks/>

    public DenemeVeriUrunler Urunler

    {

        get

        {

            return this.urunlerField;

        }

        set

        {

            this.urunlerField = value;

        }

    }

}

/// <remarks/>

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]

[System.Diagnostics.DebuggerStepThroughAttribute()]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]

public partial class DenemeVeriUrunler

{

 

    private DenemeVeriUrunlerUrun urunField;

 

    /// <remarks/>

    public DenemeVeriUrunlerUrun Urun

    {

        get

        {

            return this.urunField;

        }

        set

        {

            this.urunField = value;

        }

    }

}

/// <remarks/>

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]

[System.Diagnostics.DebuggerStepThroughAttribute()]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]

public partial class DenemeVeriUrunlerUrun

{

 

    private string adiField;

 

    private string koduField;

 

    private DenemeVeriUrunlerUrunFiyatlar fiyatlarField;

 

    private byte noField;

 

    /// <remarks/>

    public string Adi

    {

        get

        {

            return this.adiField;

        }

        set

        {

            this.adiField = value;

        }

    }

 

    /// <remarks/>

    public string Kodu

    {

        get

        {

            return this.koduField;

        }

        set

        {

            this.koduField = value;

        }

    }

 

    /// <remarks/>

    public DenemeVeriUrunlerUrunFiyatlar Fiyatlar

    {

        get

        {

            return this.fiyatlarField;

        }

        set

        {

            this.fiyatlarField = value;

        }

    }

 

    /// <remarks/>

    [System.Xml.Serialization.XmlAttributeAttribute()]

    public byte No

    {

        get

        {

            return this.noField;

        }

        set

        {

            this.noField = value;

        }

    }

}

/// <remarks/>

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]

[System.Diagnostics.DebuggerStepThroughAttribute()]

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]

public partial class DenemeVeriUrunlerUrunFiyatlar

{

 

    private byte[] fiyatField;

 

    private byte seviyeField;

 

    /// <remarks/>

    [System.Xml.Serialization.XmlElementAttribute("Fiyat")]

    public byte[] Fiyat

    {

        get

        {

            return this.fiyatField;

        }

        set

        {

            this.fiyatField = value;

        }

    }

 

    /// <remarks/>

    [System.Xml.Serialization.XmlAttributeAttribute()]

    public byte Seviye

    {

        get

        {

            return this.seviyeField;

        }

        set

        {

            this.seviyeField = value;

        }

    }

}

Yukarıda da gördüğünüz üzere biraz önce yapıştırdığımız tüm XML kodu bir anda Entity'ler olarak karşımıza çıkıyor. Böylece artık bu Entity'leri kullanarak aynı formatta bir XML yaratabiliriz. Gelin bir deneyelim;

[C#]

        DenemeVeri Ornek = new DenemeVeri();

        DenemeVeriUrun[] Urunler = new DenemeVeriUrun[1];

        DenemeVeriUrun YeniUrun = new DenemeVeriUrun();

        YeniUrun.Adi = "Örnek Ürün";

        YeniUrun.Kodu = "123";

        YeniUrun.No = 123;

        Urunler[0] = YeniUrun;

        Ornek.Urunler = Urunler;

 

        XmlSerializer MySerializer = new XmlSerializer(typeof(DenemeVeri));

        TextWriter TW = new StringWriter();

        MySerializer.Serialize(TW, Ornek);

        Response.Write(TW.ToString());

Yukarıdaki kod içerisinde aslında XML taglarından türetmiş olduğumuz Entity'leri kullanarak yeni bir XML kaynağı yaratabiliyoruz. Tüm bunları yaparken nesneler tanımlı olduğu için hem nested itemların yapılarını kontrol etmemize gerek kalmıyor hem de Intellisens bize yardımcı oluyor :)

Peki ya XML sorgularken?

Elimizde tanımı hazır bir XML dosyasından Entity'leri yarattığımıza göre aslında yine bildiğimiz bir XML'i okuyarak bu Entity'lere de çevirebiliyor olmamız gerek. Böylece XML sorgularken karşılaştığımız ve karşımızdaki XML'in yabancı bir yapıya sahip olmasından yola çıkan zorluklardan yine kurtulabiliriz.

[C#]

        XDocument Dok = XDocument.Load(Server.MapPath("XMLFile.xml"));

        XmlSerializer MySerializer = new XmlSerializer(typeof(DenemeVeri));

        TextReader TW = new StringReader(Dok.ToString());

        DenemeVeri Denek = MySerializer.Deserialize(TW) as DenemeVeri ;

        Response.Write(Denek.Urunler.Count());

Yukarıda gördüğünüz kod içerisinde ilk olarak makalemizin başındaki XML'in kayıtlı olduğu bir XML dosyasını okutuyoruz. Söz konusu XML dosyasının içeriğinden yarattığımız Entity'ler projemizin içerisinde yine hazır bulunuyorlar. Bu noktadan sonra tek yapmamız gereken eldeki XML'i DeSerialize ederek yine elde tanımlı Entity'lere çevirmek. Çeviri işlemini de tamamladıktan sonra artık rahat rahat istediğimiz veriye Intellisense'in de yardımı ile ulaşabiliriz. Hedef XML'in yapısı hiç bilmesek de sorgulama yapmak Entity'ler sayesinde kolaylaşıyor.

[C#]

        Response.Write((from inc in Denek.Urunler where inc.No==145 select inc.Adi).Single());

Yukarıda gördüğünüz sorgu aslında biraz önce DeSerialize ettiğimiz XML'i sorguluyor. Yine Intellisense ve LINQ yardımı ile sorgunun kodunu yazmak da çok kolaylaşıyor.

Hepinize kolay gelsin ;) C#'cılar ;)

Sunday, May 03, 2009 3:13:34 PM (GTB Standard Time, UTC+02:00)  #    Comments [11]   LINQ | C#  | 
 Tuesday, April 28, 2009

Bugün Muğla Üniversitesi'ndeydim. LINQ, WPF, Silverlight ve AJAX oturumları yaparak yine bir günde bolca bilgi paylaşımı gerçekleşti diyebilirim. Üniversitedeki gençlerin özellikle sınav sonrası olmasına rağmen seminerlerdeki enerjileri beni hayran bıraktı diyebilirim. Ne kadar şanslı olduklarını pek farkında değiller belki ama Visual Basit.NET gördükleri için bence çok ayrıcalıklılar :) Uzun süreden sonra ilk defa demolarımı rahat rahat VB ile yapabildim ve rezalet bir şekilde C# alışkanlıkları edinip VB'ye bulaştırmaya başladığımı gördüm :) Gereksiz toString'ler falan :) Her neyse...

Muğla üniversiteden mezun olan bir gencin VB.NET, ADO.NET ve SQL bilerek mezun olduğunu görmek beni çok sevindirdi. Bu üçlünün bir biri ile bağlantısını da kurduktan sonra aslında yapamayacağınız pek bir şey kalmıyor gibi. Üzerine bir de seminerlerimizdeki konuları eklerseniz süper yazılımcılar olacağınızdan emin olabilirsiniz.

Muğla Üniversitesi Seminerlerim
Muğla Üniversitesi Seminerlerim

Buradan etkinlikteki katkılarından dolayı Hasan Burak Öztürk kardeşim ve sevgili hocalarımıza çok teşekkür ediyorum. Umarım herkes için faydalı bir etkinlik olmuştur. ;)

Tuesday, April 28, 2009 8:43:29 AM (GTB Standard Time, UTC+02:00)  #    Comments [1]   AJAX | LINQ | Silverlight 3.0 | WPF  | 
 Monday, March 02, 2009

Hafta sonu Eskişehir'deyiz! Osmangazi Üniversitesi Fen Edebiyat Fakültesi (F5 Blok) Konferans Salonu'nda iki günlük bir program ile zevkli bir hafta sonu geçirmek isteyen herkesi bekliyoruz. Etkinlik planını aşağıdaki görselde bulabilirsiniz.

INETA Eskişehir Hit Afişi
INETA Eskişehir Hit Afişi

Etkinlik serisi tamamen halka açık ve herhangi bir şekilde kayıt olmanız gerekmiyor. Görüşmek üzere...

Monday, March 02, 2009 10:29:32 AM (GTB Standard Time, UTC+02:00)  #    Comments [9]   AJAX | ASP.NET 3.5 | LINQ | Silverlight 2.0 | WPF  | 
 Friday, February 27, 2009

Son iki gündür Erzurum, Atatürk Üniversitesi'ndeydim. Silverlight, WPF, AJAX, LINQ konularına değindiğimiz ikin günlük bir serinin sonunda minik bir de DreamSpark dağıtımı yaptıktan sonra iki saatlik gecikme ile uçağıma binip dönüp dolaşım yine :) İstanbul'a döndüm. Oturumlarda şaşkınlık ile karışık bir tepkisizliğin hakimiyetine karşın aralarda aldığım tepkiler çok sıcaktı. Anadolu'daki üniversitelerin havası gerçekten çok farklı, Erzurum'da da bunu yaşadım. Gençlerin gözlerindeki ışıltı ve kaba tabiri ile doğu bölgelerindeki bu gibi etkinliklere yönelik ihtiyacın tam olarak giderilememesi tezatı beni gerçekten üzüyor. Olanaklar el verdikçe Anadolu üniversitelerine gidiş sevdamı ben de bu şekilde tatmin etmeye çalışıyorum :)

Erzurum, Atatürk Üniversitesi Seminerlerim
Erzurum, Atatürk Üniversitesi Seminerlerim

Tabi ki yine teşekkür etmem gereken onlarca dost var Erzurum'dan. Yüksel hocama ve afacana buradan selamlarımı gönderdikten sonra :) öğrenci kardeşlerimden de Mehmet Keklik'e etkinliğe vesile olması ve organizasyondaki katkısı için çok teşekkür ediyorum. Umarım seneye taptaze ve daha dolu bir etkinlik ile tekrar buluşuruz ;)

Friday, February 27, 2009 2:01:14 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]   AJAX | ASP.NET 3.5 | LINQ | Silverlight 2.0 | WPF  | 
 Sunday, February 22, 2009

Son iki gündür sevgili Uğur Umutluoğlu ile Ankara, Bilkent Üniversitesi'ndeyiz. Toplam iki gün süren ve 6 oturumdan oluşan bir seri ile birçok konuya değindik. WPF, WCF, LINQ, C# 3.0, Silverlight, ASP.NET 3.5 SP1 başlıklarına sahip oturumların hepsinde de muhteşem ilgili bir kitle bulunduğunu itiraf etmeliyiz.

Bilkent Üniversitesi, Ankara, Silverlight Oturumum
Bilkent Üniversitesi, Ankara, Silverlight Oturumum

Oturumlarımızdan birini de LAB çalışması olarak gerçekleştirdik ve Silverlight seminerinde öğrendiklerimizi Silverlight ile bir oyun geliştirerek pekiştirdik. LAB çalışması benim neredeyse etkinlik içerisinde en sevdiğim bölüm oldu. "Üretmenin" zevkini herkesin gözlerinde gördüm.

Silverlight Lab Çalışması
Silverlight Lab Çalışması

Buradan teşekkür etmem gereken o kadar çok kişi var ki :) Sevgili MSP'lerimiz Ali Uğur Çakmak, Alper Özçetin'a çok teşekkürler. Ayrıca BTS ve ACM'deki herkese teşekkürler. Süper bir hafta sonu geçirdim, "dayının yeri"ni hala unutamıyorum :)

Sunday, February 22, 2009 10:29:12 PM (GTB Standard Time, UTC+02:00)  #    Comments [6]   ASP.NET 3.5 | LINQ | Silverlight 2.0 | WCF | WPF  | 
 Sunday, January 11, 2009

Bu hafta sonu İzmir'deydik. Daha önce sizlere duyurmuş olduğum INETA EGE HIT etkinliğini Dokuz Eylül Üniversitesi'nde gerçekleştirdik. Katılımcı profili gerçekten muhteşemdi, hem Cumartesi hem de Pazar günü en ufak bir oturumu bile kaçırmayın daimi bir kitlemiz vardı :) Benim için çok eğlenceli ve sevindirici oldu diyebilirim. Her oturumda aldığım tepkiler çok güzeldi.

INETA Ege Hit başlangıcı.
INETA Ege Hit başlangıcı.

Her zamanki gibi iki de anekdot yarattık; birincisi benim gülen surat çizimimi görüp animasyon olarak "yağmur yağsın ve şemsiye açılsın" diyen arkadaşımızdı :) Dikkatinizi çekerim gülen suratın ne yağmur ne de şemsiye ile alakası yok ayrıca İzmir'de yağmur falan da yapmıyordu :) Her neyse... İkinci anekdot ise buradan paylaşamayacağım hatta sanırım ömür boyu hiç paylaşamayacağım bir şey :) Üzgünüm...

INETA Ege Hit sonu...
INETA Ege Hit sonu...

Organizasyondaki katkılarından dolayı sevgili İzmir MSP'lerimize buradan ÇOK teşekkür ediyorum. Sevgili Buğra, Murat, Gülşah ve Okan'a çok teşekkürler. Etkinlik boyunca çekilen resimlerin orijinal boyutlu hallerine buradan ulaşabilirsiniz. Ayrıca tüm oturumlardaki örneklere ait kodları da aşağıdaki linkten bilgisayarınıza indirebilirsiniz.

Oturumlardaki örnek projeler - 11012009.rar (5,11 MB)

Sunday, January 11, 2009 3:39:22 PM (GTB Standard Time, UTC+02:00)  #    Comments [7]   ASP.NET 3.5 | LINQ | Silverlight 2.0 | WPF  | 
 Wednesday, December 17, 2008

Bugün Abdurrahman – Nermin Bilimli Anadolu Teknik Lisesi'ndeydim. Cevher gibi VB.NET bilen gençlerin arasında 5 saat geçirdim. Tüm bu sürede Silverlight ve WPF dünyasına göz attık, sona doğru da hızlıca bir LINQ girişi yaptık. Meslek liselerinde heyecan beni de bir o kadar heyecanlandırıyor. Zaten bu konuda çok yakında bazı ek duyurular da yapacağım. Ülkemizin bilişim ve özellikle yazılım üretimi ile gelir elde eden bir ülke olabilmesi için meslek liselerinin önemi bence çok büyük. Aşağıdaki fotoğrafa baktığınızda eminim ki sizler de benimle aynı duyguları paylaşacaksınız.

Abdurrahman-Nermin Bilimli Anadolu Teknik Lisesi
Abdurrahman-Nermin Bilimli Anadolu Teknik Lisesi

Organizasyon için sevgili hocalarımıza çok teşekkür ediyorum. Normalde 3 saat olarak planladığımız etkinliği onların da desteği ile 5 saate uzattık. Her şey çok güzeldi. Tek sorun : "Meslek liselerini ziyaret ettikçe kendimi daha yaşlanmış hissetmem" :)

Seminere katılan tüm kardeşlerimi buradan öpüyorum.

Wednesday, December 17, 2008 12:44:50 AM (GTB Standard Time, UTC+02:00)  #    Comments [5]   LINQ | Seminer | Silverlight 2.0 | WPF  | 
 Monday, December 01, 2008

Son üç gündür Isparta, Süleyman Demirel Üniversitesi'ndeydim. Cumartesi günü başladığımız INETA Boot Camp Isparta etkinliğimizde LINQ ve WCF konularını işledik. Pazar günü Microsoft'un Oyun Turu'nun da Isparta ayağını kampımıza ekleyerek dün de bahsettiğim gibi SL 2.0 ile ve XNA ile Oyun Programlama konularını inceledik. Son günümüz olan Pazartesi günü de ASP.NET Dynamic Data Web Site yapılarını göz attık sonra "Silverlight 2.0 ile Data Uygulamaları" ve "WPF" oturumlarımızı tamamladık. Böylece dolu dolu bir üç gün geçirdik.

Isparta, Süleyman Demirel Üniversitesi, INETA Boot Camp
Isparta, Süleyman Demirel Üniversitesi, INETA Boot Camp

Etkinliklere katılan hem konuşmacı arkadaşlarıma hem de sevgili öğrenci kardeşlerime çok teşekkür ediyorum. Geçen öğretim yılında da Süleyman Demirel Üniversitesi'nde gittiğimde blogumda yazmıştım hatta dün de yazmışım :) SDÜ'nün yeri benim için çok ayrı. Yukarıda resimde gördüğünüz tüm öğrencilerin Silverlight ve WPF konulu ödevleri var. Hepsi giriş seviyesini çoktan geçmiş durumda. Bu duruma tabi ki öğretim görevlilerinin katkısı çok büyük.

Özellikle organizasyonun gerçekleşmesindeki katkılarından dolayı sevgili Eğitim Görevlisi dostum Mehmet Albayrak'a çok teşekkür ediyorum.

Son gün yaptığımız bazı örnekleri toparlayıp bir poşete koydum :) aşağıdaki linkten indirebilirsiniz.

Örneklere ait kaynak dosyalar - 01122008_2.rar (2,81 MB)

Monday, December 01, 2008 2:57:22 PM (GTB Standard Time, UTC+02:00)  #    Comments [3]   ASP.NET 3.5 | Expression Blend | LINQ | Silverlight 2.0 | WCF | WPF  | 
 Wednesday, November 26, 2008

Bugün YTÜ, Davutpaşa Kampüsü'ndeydim. Güne ağır bir LINQ oturumu ile başladık :) Biraz herkesi sıkıntı bastı :) Sonra yemek molası ile dinlenip WPF ve Silverlight oturumlarına geçtik. Günün sonunda aldığım tepkiler ne mutlu ki her zamanki gibi muhteşemdi. YTÜ'nün Davutpaşa Kampüsü'ndeki enerjisi Beşiktaş Kampüsü'nden açık ara önde :) Böylece mini bir gaz da vermiş olayım :)

YTÜ, Davutpaşa Kampüsü, LINQ, Silverlight ve WPF Seminerleri
YTÜ, Davutpaşa Kampüsü, LINQ, Silverlight ve WPF Seminerleri

Çok eğlendiğim, süper yorumlar almanın yanı sıra seminerler esnasında sorduğum sorulara da burada yer veremeyeceğim derecede fantastik cevaplar aldığım bir gün oldu :) Katılan tüm arkadaşlara çok teşekkürler.

Organizasyondaki katkılarından dolayı sevgili Bahar Göktepe ve Mehmet Cengiz'e çok teşekkürler.

 

Wednesday, November 26, 2008 3:04:24 AM (GTB Standard Time, UTC+02:00)  #    Comments [10]   LINQ | Seminer | Silverlight 2.0 | WPF  | 
 Saturday, November 08, 2008

Bugün Afyon Kocatepe Üniversitesi'ndeydim. Sabahtan başlayarak Silverlight 2.0, WPF, LINQ ve ASP.NET Dynamic Data konularına değinerek zevkli bir gün geçirdik. Günün sonunda tadına vardığım Afyon kaymağı ve ekmek kadayıfı süper ikilisi aslında neredeyse oturumları uzatarak Afyon'a yerleşmeme bile sebep olacaktı :)

Kocatepe Üniversitesi 2. Bilişim Günleri oturumlarımın sonundan bir kare.
Kocatepe Üniversitesi 2. Bilişim Günleri oturumlarımın sonundan bir kare.

Aktivite boyunca yardımlarından dolayı teşekkür etmem gereken o kadar çok kişi var ki kesinlikle atladığım kardeşlerim olacaktır. İster üniversite dahilinde öğretim görevlisi olsun ister öğrenci olsun aktivitede emeği geçen herkese ve tabi ki tüm katılımcılara çok teşekkürler. Muhteşem bir aktiviteydi. Organizasyondaki katkılarından dolayı sevgili Sadık Oral'a özellikle teşekkür ediyorum.

Herkese çok teşekkürler.
Rektör Yardımcısı Prof. Dr. Belkıs Özkara - Daron Yöndem

Saturday, November 08, 2008 1:26:58 PM (GTB Standard Time, UTC+02:00)  #    Comments [5]   ASP.NET 3.5 | LINQ | Silverlight 2.0 | WPF  | 
 Tuesday, October 21, 2008

.NET 3.5 SP1 ile beraber gelen Dynamic Data Web Site yapısı ile beraber doğrudan sadece veri üzerinde çalışan web uygulamaları yazmanın gerçekten kolaylaştığını itiraf edebiliriz. Fakat her yeni araç gibi Dynamic Data ile beraber de istediklerimizi yapabilmek için kendine özgü özelleştirme kurallarını bilmemiz gerek. Bu yazıda elimizde hazır bir Dynamic Data Web Site olacak ve bu web sitesinde gösterilen veritabanındaki bazı tablolardaki bazı sütunların gösterim esnasındaki özelleştirmelerine değineceğiz. Cevaplayacağımız sorulardan bazıları şunlar olacak;

  • Belirli bir tablonun sadece bir sütununun görünmemesini nasıl sağlarım?
  • İstediğim bir sütunun istediğim değerleri almasını nasıl sağlarım?

Yazımızda kullanacağımız örnek siteyi yaratmak için buradaki yazıyı inceleyebilirsiniz.

MetaData üzerinden ayarlamalar...

Dynamic Data yapısına baktığımızda olabildiğince her şeyin otomatik ilerlediğini görüyoruz. Örneğin bir tablonun içerisindeki tüm sütunlar otomatik olarak söz konusu tablo ile beraber tüm sayfalarda düzenlenebilir şekilde gözükmeye başlıyor. Sütunlarla ilgili tek tek ayar yapmanın tek yolu söz konusu sütunlara ek MetaData bilgileri vermek. Peki bizim sütunlarımızı kodumuzla kim tanımlıyor?

Biz projemizde LINQ2SQL kullanarak ilerlediğimiz için veritabanındaki her bir nesneyi tanımlayan objeler LINQ'e ait DBML'in arkasında tanımlanmış durumda. Bir DBML dosyasının arkasına baktığınızda designer.vb veya designer.cs uzantılı dosyalar görebilirsiniz. Bu dosyalar içerisinde veritabanındaki tüm nesnelerin birer kopyası .NET nesneleri olarak yaratılmıştır.

[VB]

<Table(Name:="dbo.Urunler")>  _

Partial Public Class Urunler

    Implements System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged

[C#]

[Table(Name="dbo.Urunler")]

public partial class Urunler : INotifyPropertyChanging, INotifyPropertyChanged

{

Yukarıda gördüğünüz şekilde başlayan Urunler adındaki Class DBML dosyasının arkasında duruyor ve bizim her bir ürünümüzü tanımlıyor. Maalesef bu designer dosyalarında değişiklik yapamıyoruz. Aslında değişiklik yapabilirsiniz fakat DBML dosyasında Visual Studio arayüzündeki tasarım araçları ile yaptığınız her işlem bu dosyaların sistem tarafından tekrar yaratılmasına neden olacağı için kullanıcı tarafından yapılan tüm kod değişiklikleri kaybolacaktır. Peki bu durumu nasıl çözeceğiz? Dikkat ettiyseniz tüm bu sınıflar Partial olarak tanımlanmıştır yani bir başka bir dosyada tekrar Partial birer sınıf yaratarak işlemlerimize devam edebiliriz. Bu durumda buyurun yeni bir VB/CS dosyası oluşturalım ve Partial olarak aynı sınıftan bir adet daha yaratalım.

[VB]

<ComponentModel.DataAnnotations.MetadataType(GetType(UrunlerMeta))> _

Partial Public Class Urunler

 

End Class

[C#]

[System.ComponentModel.DataAnnotations.MetadataType(typeof(UrunlerMeta))]

public partial class Urunler

{

 

}

Yukarıdaki koda baktığınızda özellikle en üstteki MedadataType işaretleri dikkatinizi çekecektir. Aslında bu da bir MetaData fakat maalesef bu şekilde Partial sınıflara doğrudan MetaData veremiyoruz. O nedenle başka bir sınıf yaratarak MetaData'ları orada tutacağız ve o sınıftan MedaData'ları bu tarafa aktaracağız. Kodumuz içerisinde UrunlerMeta olarak geçen obje aslında başka bir sınıfın adı.

[VB]

Public Class UrunlerMeta

 

    Private _Fiyati As Object

    <ComponentModel.DataAnnotations.Range(10, 20, errormessage:="Hata!")> _

    Public Property Fiyati() As Object

        Get

            Return _Fiyati

        End Get

        Set(ByVal value As Object)

            _Fiyati = value

        End Set

    End Property

 

End Class

[C#]

public class UrunlerMeta

{

    [System.ComponentModel.DataAnnotations.Range(10, 20, ErrorMessage = "Hata!")]

    public object Fiyati { get; set; }

}

UrunlerMeta sınıfı içerisinde sadece Fiyati adında bir Property var. Aslında ana Urunler sınıfındaki tüm Property'leri burada da tanımlayarak kullanabilirdik fakat şimdilik bize Fiyati Property'si yeterli. ComponentModel.DataAnnotations altından Range sınıfını kullanarak Fiyati değerinin 10 ile 20 arasında olmak zorunda olduğunu ve bu durumun sağlanmaması halinde de hata olarak "Hata!" yazısının gösterilmesi gerektiğini belirtiyoruz. Gelin bu kodun bir de web sitesindeki yansımasına göz atalım.

Range sınıfı ile yaptığımız ayarlamalar arayüzde kendini gösteriyor.
Range sınıfı ile yaptığımız ayarlamalar arayüzde kendini gösteriyor.

Başka neler yapabiliriz?

MetaData'lar üzerinden başka neler yapılabileceği ile ilgili çok sayıda farklı senaryo mevcut fakat en basit örnekleri inceleyebilmek için kabaca ComponentModel.DataAnnotations sınıfına göz atmak yeterli olacaktır. Örneğin aşağıdaki gibi bir kod istediğiniz bir kolonun web sitesinde gösterilmemesini sağlayabilir.

[VB]

<ComponentModel.DataAnnotations.ScaffoldColumn(False)> _

[C#]

[System.ComponentModel.DataAnnotations.ScaffoldColumn(false)]

Peki ya diğer seçenekler? Gelin hızlı bir tur atalım.

DisplayColumn

Bu özellik toplam en fazla üç parametre alabilir. Amacı tablolar arası ilişkilendirmelerde kullanıcının gördüğü metinleri değiştirmektir. Örneğin bizim projemizde ürünlere bağlı olan kategorilerin adları otomatik olarak her üründe gösteriliyor. Sistem aslında arka planda Kategoriler tablosunda ID(PK) kolonundan sonra karşılaştığı ilk String kolonu alarak göstermeye göre ayarlı. Oysa bazı durumlar FK'in bağlı olduğu tablodan alınması gereken ve gösterilecek olan metin çok daha ileride farklı bir sütunda olabilir. İşte DisplayColumn bunu ayarlıyor ve bir FK durumunda ana tablodan hangi sütunun bu üründe gösterilmesi gerektiğine karar veriyor. Bunun haricinde aldığı iki diğer parametrenin ilki hangi kolon üzerinden Sorting yapılabileceği ve üçüncü parametre ise Sorting işleminin ilk açılışında hangi yönde yapılacağı verisini taşıyor.

RegularExpression

Kendisine ilk parametre olarak verilen RegEx desenini hedef kolona test eden ve uyuşmaması durumunda da ikinci parametre olarak verilen hata mesajının gösterilmesini sağlayan bir Validation sisteminin entegrasyonuna yönelik olarak kullanılabilir.

Required

Sadece tek bir parametresi vardır; eşleştirildiği sütun için veri girilmez ise gösterilmesi gereken hata mesajını String olarak alır.

ScaffoldTable

Tablo sınıflarına doğrudan verilebilen bu MetaData ile bir tablonun web sitesi görselliğinde gösterilip gösterilmeyeceğini belirler.

StringLength

Bir sütuna girilebilecek maksimum metin uzunluğu ilk parametresi olarak alır. İkinci parametresinde ise söz konusu uzunluk aşıldığında gösterilecek olan hata mesajını saklar.

Sonuç

Yazı boyunda Annotation'lar içerisinde atladığım bazı seçenekler oldu. Bu seçenekleri ileriki yazılarda daha detaylı olarak incelememiz gerektiği için şimdilik yüzeysel olarak geçmek istemedim.

Hepinize kolay gelsin.

Tuesday, October 21, 2008 2:36:26 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   ASP.NET 3.5 | LINQ  | 
 Monday, October 20, 2008

Hafta sonunu Ankara'da geçirdik. Neden mi? INETA Capital Hit zamanıydı! Atladık INETA minibüsümüze :) yollara düştük. Maceralarımızla ilgili videolar ve fotoğraflar çok yakında bu blogda :)

İki kocaman gün boyunca dopdolu bir programla Çankaya Üniversitesi'nde iki yüz elli kişilik bir ekip olarak yattık kalktık diyebilirim. Yine her zamanki gibi benim için muhteşem zevkliydi.

Pazar akşamı saat yedide Capital Hit'i sonlandırdık.
Pazar akşamı saat yedide Capital Hit'i sonlandırdık.

Aktiviteye katılan tüm konuşmacı dostlarıma binlerce teşekkür. Ayrıca Çankaya Üniversitesi Bilişim Kulübü ve sevgili MSP, Çağrı Erdoğan'a da çok teşekkürler. Bir organizasyonda ancak bu kadar başarılı bir misafirperverlik sergilenebilirdi.

Tabi ki her şey bu kadarla bitmiyor! Elimde birçok fotoğraf, minibüs yolculuğumuzdan videolar ve panel kaydımız var. Hepsini büyük bir hızla hazırlamaya çalışıyorum. En kısa zamanda sizlerle buradan paylaşacağım.

Şimdilik aşağıdaki sunumlarla idare edelim :)

AdoNet Data Services / Burak Selim Şenyurt - 20102008_1.pptx (1,01 MB)
LINQ / Uğur Umutluoğlu - 20102008_2.pptx (750,29 KB)
WCF / Burak Selim Şenyurt - 20102008_3.pptx (460,14 KB)

Not: Bu sefer ben hiç sunum kullanmadım, doğrudan demolarla ilerledim. O nedenle sunum paylaşamıyorum.

Monday, October 20, 2008 6:24:54 PM (GTB Standard Time, UTC+02:00)  #    Comments [9]   .NET Framework 3.5 | ASP.NET 3.5 | Expression Blend | Haberler | IIS 7.0 | LINQ | Seminer | Silverlight 2.0 | WCF | WPF  | 
 Friday, September 26, 2008

INETA Summer Hit üzerinden uzun bir zaman geçti gibi hissettiğimiz bu günlerde yeni bir aktivite serisi ile tekrar karşınızdayız. Bu sefer İstanbul değil Anadolu'nun merkezi, Başkentimiz Ankara'da olacağız.

INETA Capital Hit Afişi

Dikkat ederseniz İstanbul'daki Summer Hit sonrası içeriğimizi de epeyce değiştirdik. Tabi bunda sizlerin doldurmuş olduğu değerlendirme formlarının etkisi çok büyük. Bu sefer çok daha sıkışık ve yoğun bir tempomuz olacak. Hediyelerimiz daha fazla (hatta çok ilginç beklenmedik şeyler var :)) ve içecek sorununu da hallettik (:))

İlk gün sabah yine SL 2.0 ile başlayıp sonra benim çok önem verdiğim IIS 7'ye geçeceğiz. IIS 7.0 üzerinde ASP.NET ve PHP tarafında çok güzel yenilikler var. Sonrasında her zamanki gibi bir sohbet panelimiz olacak. Son olarak LINQ ile ilk günümüzü kapatacağız. İkinci gün WPF ile başlayarak ADO.NET Data Services konusunu inceleyeceğiz. Heyecanlandığınızın farkındayım :) Sonrasında IE 8.0 ile gelen yazılımcı ve tasarımcıları ilgilendiren yenilikler ve yeni uygulama platformlarını inceleyerek WCF dünyasına da atılarak iki günü sonlandıracağız.

Aktiviteye üniversite girişinde güvenlik sorunları yaşamamak adına kayıt olmanız şart.

Kayıt adresi: http://daron.yondem.com/kayit/

Emeklerinden dolayı buradan sevgili MSP, Çağrı Erdoğan'a çok teşekkür ediyorum.

Aktiviteyi duyururken geçen sefer güzel bir başarı elde etmiştik. Bu sefer de yine aşağıdaki bannerı kullanabilirsiniz. Banner'a tıklandığında link olarak da kayıt adresini verebilirsiniz.

INETA Capital Hit Banner

Hepinizi bekliyorum ;)

Friday, September 26, 2008 8:59:59 AM (GTB Standard Time, UTC+02:00)  #    Comments [23]   .NET Framework 3.5 | ASP.NET 3.5 | Expression Blend | IIS 7.0 | LINQ | Seminer | Silverlight 2.0 | Visual Basic 2008 | Visual Studio 2008 | WCF | WPF  | 
 Tuesday, September 23, 2008

Başlık olarak “Reflection” yazdıktan sonra ardına sayfalarca açıklama ve örnek konulabilir. Hatta bu konuda ayrı bir kitap bile yazılabilir. Reflection’ın çok farklı kullanımlar var. Özetleyerek hızlı bir şekilde tanımlamak istersek aslında Reflection bize hakkında bilgi sahibi olmadığınız programatik nesnelerle ilgili çalışma zamanında (run-time) bilgi alabilmemize olanak tanıyan bir metottur. Peki böyle bir şeye neden ihtiyacımız olsun? En basit örnek gerçek zamanlı olarak uygulamalara farklı DLL dosyalarının bağlandığı durumları gösterebiliriz. Böyle bir durumda kaynak konumdaki sınıflar veya metotlar ile ilgili herhangi bir bilgi bulunmaz. Söz konusu bu bilgilerin program çalışırken elde edilerek kullanılması gerekir. Gelin ilk olarak Reflection’ın yapısını ve sistemini tanımak adına tek bir uygulama içerisinde nasıl kullanılabileceğimize göz atalım. Örnek uygulamamızda aşağıdaki şekli ile tanımlanmış bir Urun sınıfı kullanacağız.

[VB]

Public Class Urun

 

    Private PAdi As String

    Public Property Adi() As String

        Get

            Return PAdi

        End Get

        Set(ByVal value As String)

            PAdi = value

        End Set

    End Property

 

    Sub New()

 

    End Sub

 

    Sub New(ByVal adi As String)

        Me.Adi = adi

    End Sub

 

    Function Uyari() As String

        Return "Ürünün adı: " & Me.Adi

    End Function

End Class

[C#]

public class Urun

{

 

    private string PAdi;

    public string Adi

    {

        get { return PAdi; }

        set { PAdi = value; }

    }

 

    public Urun()

    {

 

    }

 

    public Urun(string adi)

    {

        this.Adi = adi;

    }

 

    public string Uyari()

    {

        return "Ürünün adı: " + this.Adi;

    }

}

Uygulamamız içerisinde iki adet düğme yer alacak ve kullanacağımız Windows penceresinde global olarak tanımlanmış bir de Object tipinde değişkenimiz bulunacak.

[VB]

Dim BirUrun As Object   

[C#]

object BirUrun;

Uygulama içerisindeki düğmelerden birine basıldığında global BirUrun değişkenimiz yeni bir Urun değişkenine dönüştürülecek.

[VB]

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    BirUrun = New Urun

End Sub

[C#]

    private void button1_Click_1(object sender, EventArgs e)

    {

        BirUrun = new Urun();

    }

Programımız içerisinde diğer düğmeye basıldığında BirUrun adındaki değişkenimizin Adi özelliğini değiştirerek Uyari adındaki metodunu kullanmak istiyoruz. Fakat Visual Studio içerisinde maalesef ki BirUrun adındaki değişkenle beraber Urun tipine ait Intellisense desteği gelmeyecektir. Aslında bu durumun haklı bir nedeni var. İkinci düğmeye basıldığında BirUrun adındaki değişkenin tipininin Object mi yoksa Urun mü olacağı belli değil. İşte tam da istediğimiz ortamı yaratmış olduk. Kullanacağımız nesnenin tipi belirsiz ve biz ona ait bazı özellikleri kullanmak istiyoruz. Bu durumda ilk olarak ikinci düğmeye basıldığında gerçekten BirUrun değişkeninin tipi Urun mü yoksa değil mi sorusunu kontrol etmemiz lazım.

[VB]

       If TypeOf (BirUrun) Is Urun Then

 

        End If

[C#]

        if ((BirUrun) is Urun)

        {

 

        }

Buraya kadar her şey çok kolay. Bundan sonra eğer IF kontrollerimize olumlu sonuç dönüyorsa ilk olarak gidip nesnenin Adi özelliğini bulmamız ve ona bir değer aktarmamız gerekiyor.

[VB]

BirUrun.GetType.GetProperty("Adi").SetValue(BirUrun, "Daron", Nothing)

[C#]

BirUrun.GetType().GetProperty("Adi").SetValue(BirUrun, "Daron", null);   

Yukarıdaki kod ile elimizdeki nesnenin tipini bilmeden onun Adi adındaki özelliğini (property) yakalayarak değerini Daron olarak değiştiriyoruz. Kodumuzu detaylı olarak adım adım bakacak olursak ilk aşamada nesnenin tipini GetType ile alıyoruz. Sonrasında ise tipini yakaladığımız nesnenin GetProperty ile Adi adındaki özelliğini alarak SetValue ile söz konusu özelliğin değerini değiştiriyoruz. SetValue metodu toplam üç parametre alıyor; bunlardan ilki değer değişikliği yapılacak nesnenin kendisi, ikincisi yeni atanacak olan değer, üçüncüsü ise eğer değiştirilecek olan özellik (property) indeksli ise söz konusu indeks değeri. Bizim örneğimizde indeksli bir özellik olmadığı için bu parametreyi boş geçiyoruz.

Değer atamamızı tamamladığımıza göre bu sefer de sıra geldi BirUrun değişkenimize ait Uyari metodunu çalıştırmaya. Metodumuz bize bir String döndürecek biz de onu doğrudan bir mesaj kutusu ile kullanıcıya göstereceğiz.

[VB]

BirUrun.GetType.InvokeMember("Uyari", Reflection.BindingFlags.InvokeMethod, Nothing, BirUrun, Nothing)

[C#]

BirUrun.GetType().InvokeMember("Uyari", System.Reflection.BindingFlags.InvokeMethod, null, BirUrun, null).ToString();

Reflection kullanarak türü bilinmeyen bir nesnenin bir metodunu çalıştırmak için InvokeMember metodundan faydalanmamız gerekiyor. InvokeMember aslında çok geniş kullanımı olan bir metod, biz şimdilik sadece bir çeşit kullanımına değineceğiz. Örneğimizde InvokeMember bir metod çalıştıracağı için ilk parametresinde çalıştırılacak olan metodun adını ikincisinde BindingFlags.InvokeMethod ile bir Metod çalıştırılacağını belirtiyoruz. Üçüncü parametre bizim şimdilik kullanım alanımız dışında kalan Binding’lerle ilgili, aynı şekilde beşinci parametre de boş bırakılarak geçilecek. Dördüncü parametrede ise hedef nesnemiz olan BirUrun değişkenimizi atayacağız. Böylece metodumuzu da çalıştırmış olduk.

Dinamik DLL Kullanımı

Kabaca Reflection’ın nasıl kullanılabildiğine dair bir örnek yaptıktan sonra artık sıra geldi harici bir DLL dosyasının çalışma anında programımıza ekleyerek içerisindeki yapıları kullanmaya. Bu çeşit bir işlevselliği özellikle gerçek zamanlı DLL derlemesi ile birleştirdiğinizde çok farklı bir dünyaya kapı açmış olacaksınız. Hedef olarak kullanacağımız DLL dosyasını aşağıdaki kodlardan yaratacağız.

[VB]

Public Class Deneme

    Function Metin() As String

        Return "Çalışıyor"

    End Function

End Class

[C#]

    public class Deneme

    {

        string Metin()

        {

            return "Çalışıyor";

        }

Yarattığımız DLL dosyasını uygulamamız ile aynı konuma yerleştirdikten sonra aşağıdaki kod ile DLL’imizi kullanmaya başlayabiliyoruz.

[VB]

Dim BirAssembly As Reflection.Assembly = Reflection.Assembly.LoadFrom("ornek2.dll")

[C#]

System.Reflection.Assembly BirAssembly = System.Reflection.Assembly.LoadFrom("ornek2.dll");

Artık yukarıda tanımladığımız Assembly üzerinden Reflection kullanarak ilerleyebiliriz. İlk olarak Deneme adında sınıfımızdan bir instance almamız gerekecek. Bunun için Deneme tipini bulmamız lazım.

[VB / C#]

BirAssembly.GetModule("Ornek2.dll").GetType("Deneme")

Assembly üzerinden modülümüzü yakalıyor sonra da Deneme adındaki tipinizi buluyoruz. Tabi tipi bulmak yeterli değil, söz konusu tipte bir değişken yaratmamız gerekiyor. Activator sınıfını kullanarak bu tip üzerinden bir instance yaratarak Sinif adında bir değişkene aktaracağız.

[VB]

Dim Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"))   

[C#]

object Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"));

Yarattığımız sınıfın maalesef özellikleri otomatik olarak gelmeyecek. O nedenle Metin adındaki metodumuzu da elle bularak çalıştırmak zorundayız.

[VB]

BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, Nothing)

[C#]

BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, null)

Yine Assembly üzerinden yola çıkarak bu sefer daha da ileri gidiyoruz. Deneme sınıfımızı bulduktan sonra içerisinde Metin adındaki metodumuzu buluyor ve doğrudan Invoke ile söz konusu metodu çalıştırıyoruz. Invoke metodu bizden iki parametre istiyor; bunlardan ilki ana sınıfın kendisi. Bir önceki adımda yakaladığımız sınıfı buraya parametre olarak aktarıyoruz. Diğeri ise bizim kullanmayacağımız Binding parametresi.

Metin metodumuz çalıştırıldığında geriye bir String değişkeni döndürüyor. Bu değişkeni de bir mesaj kutusu ile kullanıcıya göstermek istersek uygulamamızın tam kodunun aşağıdaki şekilde sonlanması gerekiyor.

[VB]

Public Class Form2

 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim BirAssembly As Reflection.Assembly = Reflection.Assembly.LoadFrom("ornek2.dll")

 

        Dim Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"))

        MsgBox(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, Nothing))

    End Sub

End Class

[C#]

namespace CSReflection

{

    public partial class Form2 : Form

    {

        public Form2()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            System.Reflection.Assembly BirAssembly = System.Reflection.Assembly.LoadFrom("ornek2.dll");

 

            object Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"));

            MessageBox.Show(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, null).ToString());

        }

    }

}

Böylece harici bir DLL dosyasını yükleyerek istediğimiz metodu dinamik olarak kullanabildik. Farklı durumlarda isterseniz bir DLL içerisinde tüm metod, sınıf ve özelliklerin listelerini alabilir hatta bunları LINQ sorguları ile tarayabilirsiniz.

[VB]

Dim Metodlar = From Gelenler In BirAssembly.GetModule("Ornek2.dll").GetTypes Where Gelenler.GetMethod("Metin") IsNot Nothing

[C#]

var Metodlar = from Gelenler in BirAssembly.GetModule("Ornek2.dll").GetTypes() where Gelenler.GetMethod("Metin") != null select Gelenler;

Örneğin yukarıdaki LINQ sorgumuz ile harici DLL dosyası içerisinde Metin adında metodu olan tüm sınıfların bir listesini alıyoruz.

Hepinize kolay gelsin.

Tuesday, September 23, 2008 6:51:06 PM (GTB Standard Time, UTC+02:00)  #    Comments [8]   .NET Framework 3.0 | .NET Framework 3.5 | ASP.NET | ASP.NET 3.5 | LINQ | Silverlight 2.0 | Visual Basic 2005 | Visual Basic 2008 | Visual Studio 2005 | Visual Studio 2008 | WCF | WF | WPF  | 
 Monday, August 25, 2008

INETA Summer Hit etkinliği sonrası verdiğim bir söz vardı :) Tüm konuşmacıların sunumlarını benim blogdan sizlerle paylaşacağımı söylemiştim. O kadar geç kaldım ki sonunda artık "Nerede hocam?" gibi mailler almaya başladım :) Haklısınız. İşte hepsi aşağıda;

Silverlight Sunumu - 26082008_1.pptx (3,79 MB)
TFS Sunumu - 26082008_2.pptx (10,5 MB)
IE 8.0 Sunumu - 26082008_3.pptx (1,53 MB)
LINQ Sunumu - 26082008_4.pptx (660 KB)
Web 3.0 Sunumu - 26082008_5.xps (344 KB)

Monday, August 25, 2008 5:51:30 PM (GTB Standard Time, UTC+02:00)  #    Comments [4]   IE 8.0 | LINQ | Silverlight 2.0  | 
 Monday, August 04, 2008

Bugün INETA Summer Hit 2008'in ikinci gününü de mutlu bir şekilde sonlandırdık. Yaz aylarında bir hafta sonu etkinliğinde 350 üstü katılımcıya sahip olmak benim için çok heyecan vericiydi. "Acaba gerçekten gerek var mı? Yoksa ben mi gaza geliyorum?" sorusunu artık kendi kendime sormama gerek kalmayacak sanırım. Tüm konuşmacılarımız adına bizi yalnız bırakmadığınız ve bilgi paylaşımından doğan sevinci yaşamamıza olanak tanıdığınız için çok teşekkür ediyorum.

INETA Summer Hit 2008
INETA Summer Hit 2008

Gelen maillerden cevaplarını beklediğiniz bazı sorular olduğunu bildiğim için birkaç noktaya değinmek istiyorum. Aktivitenin video kayıtlarını, tüm çekilen fotoğrafların tam çözünürlüklü halini, sunumları sizlerle paylaşacağız. Bu gibi içerikler için benim blogu takip etmenizi tavsiye edebilirim. Bahsettiğim içerikleri şu an hazırlıyoruz.

Aktiviteyle ilgili teşekkür etmem gereken bir ordu var; sevgili konuşmacılarımız Ali Rıza Babaoğlan, Ali Servet Eyüpoğlu, Eralp Erat, Kadir Çamoğlu ve Uğur Umutluoğlu'na buradan çok teşekkürler. Organizasyonda benim yardımıma koşan kardeşlerim Murat Duman, Yiğit Kıran, Görkem Güngör ve YTÜ Bilişim Kulübü'nden Oğuz Yılmaz, M. Zeki Ersen'e de ayrı ayrı teşekkürler.

Sunday, August 03, 2008 11:34:18 PM (GTB Standard Time, UTC+02:00)  #    Comments [8]   IE 8.0 | LINQ | Seminer | Silverlight 2.0  | 
 Tuesday, June 03, 2008

Bugün Edirne M.P. Anadolu Ticaret Meslek ve  Ticaret Meslek Lisesi'nin organizasyonunu üstlendiği Edirne'deki meslek liseleri'nin yer aldığı bir seminer serisindeydim. Semineri Trakya Birlik Genel Müdürlüğü Konferans Salonu'nda yaptık. Salon şu ana kadar gördüğüm en ilginç ve güzel salonlardan biriydi. Balkonuyla beraber iki katlı seminer salonunda alt kattaki ve üst kattaki dinleyiciler için ayrı projeksiyon sistemlerinin bulunması dinleyici için çok ergonomik bir ortam sağlıyor.

Edirne'ye gidip Selimiye Cami fotoğrafı çekmemek olmaz :)
Edirne'ye gidip Selimiye Cami fotoğrafı çekmemek olmaz :)

Sabah 09.00 gibi seminerlere başladığımız için bir gün önceden Edirne'ye gitmek durumunda kaldım. Dün akşam 20.00 gibi Edirne'deydim, Meriç kenarında bir yemek yeme şansına sahip olmak muhteşemdi. Aslında otobüsle iki buçuk saat gibi kısa bir sürede gidilebilen Edirne'yi (kendi adıma konuşayım) sanki biraz farkında değiliz veya unutmuşuz gibime geldi. Rahatlıkla günübirlik gidip gezilebilecek bir şehir.

Selimiye Kubbesi İç Motifler
Selimiye Kubbesi İç Motifler

09.00'da başladıktan sonra öğleden sonra 18.00'a kadar WPF, Silverlight ,AJAX ve LINQ konularına değindik. Bu benim ikinci Meslek Lisesi deneyimim oldu. Lise çağındaki gençlere hitap edebilmek adına daha çok çalışmam gerektiğini açıkça itiraf edebilirim :) Yine de aldığım tepkilere göre faydalı bir gün geçirdik, parıldayan genç gözler gördüm.

Edirne, MP (Anadolu) Ticaret Meslek Lisesi, WPF, Silverlight, AJAX, LINQ Seminerleri
Edirne, MP (Anadolu) Ticaret Meslek Lisesi, WPF, Silverlight, AJAX, LINQ Seminerleri

Aktivite boyunca Edirne TV :) de oradaydı. Hatta sitelerinde de aktiviteyi haber yyapmışlar. Özellikle sitedeki fotoğrafta biraz çok agresif çıkmışım :) Zaten herkes sahnede rahat durmadığım için fotoğraf çekememekten şikayetçi :)

Organizasyondaki emeklerinden dolayı sevgili Serdar Daloğlu'na , Aziz Bayıroğlu ve Oğuzcan Şahin'e burada bin bir teşekkür ediyorum. Beni muhteşem bir şekilde ağırlamanın yanı sıra organizasyondaki her tür detayı çok başarılı bir şekilde yürüttüler.

Tuesday, June 03, 2008 10:45:51 PM (GTB Standard Time, UTC+02:00)  #    Comments [3]   AJAX | ASP.NET | ASP.NET 3.5 | LINQ | Silverlight | WPF  | 
 Sunday, May 25, 2008

Özellikle beni microbloğum twitter.com üzerinden takip edenlerin farkında olacağı üzere hafta sonunu Ankara'da geçirdim. Cumartesi gece yarısı yola çıkarak sabahına Ankara'ya vardım ve sabah 10.00 gibi EMO (Elektrik Mühendisleri Odası) Ankara şubesinde eğitim serimize başladık. WPF, AJAX, Silverlight ve LINQ konularına değindiğimiz eğitimi Pazar akşamı 18.00'da bitirdik.

EMO Eğitim Serisi başlangıcından bir kare...
EMO Eğitim Serisi başlangıcından bir kare...

Eğitime katılan arkadaşlara özellikle Silverlight örneğindeki kodları blogumdan paylaşacağım konusunda söz vermiştim. Aşağıdan gerekli dosyaları bilgisayarınıza indirebilirsiniz.

Örnek Kodlar - 25052008_2.rar (8,57 KB)

Eğitime katılan ve kocaman bir hafta sonu boyunca yeni teknolojiye olan ilgilerini ve konsantrasyonlarını en yüksek seviyede tutan tüm arkadaşlara çok teşekkür ediyorum (Özellikle ikinci gün sınıfa pasta alan kamera fobili arkadaşımıza ek teşekkürler :))

INETA ve EMO işbirliğinizde düzenlediğimiz bu eğitime katkısından dolayı ODTÜ Bilgisayar Mühendisliği Araştırma Görevlisi Serdar Çiftçi'ye, eğitimlere laboratuar ortamı sağlamakla beraber gösterdikleri sıcak misafirperverlik için de tüm EMO ekibine teşekkürler.

Sunday, May 25, 2008 7:16:24 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   AJAX | Expression Blend | Expression Design | Expression Encoder | LINQ | Silverlight | Silverlight 2.0 | WPF  | 
 Tuesday, May 13, 2008

Bugün Konya, Selçuk Üniversitesin'deydim. Sabah 10.00'da başlayarak 19.00'a kadar WPF, AJAX, Silverlight ve LINQ konularını inceleyen bir seminer ile güzel bir gün geçirdik. Umarım "yol yorgunluğum" aktiviteye çok yansımamıştır. Bir gün öncesinde bildiğiniz üzere Çanakkale 18 Mart Üniversitesin'deydim ve akşam 23.00'da Çanakkale'den mecburen otobüs ile İstanbul'a döndüm. O saatte uçak vs yok. Sabaha karşı 05.00'de İstanbul'daydım ve 07.00 uçağı ile Konya'ya uçtum :) Durum böyle olunca hem uykusuzluk (buna alışkınım aslında) hem de sadece uçakta verilen abuk sandwich nedeniyle açlık (işte buna dayanamam!) nedeniyle performansımdan şüphe etmediğimi söylesem yalan olur.

Konya, Selçuk Üniversitesi
Konya, Selçuk Üniversitesi

Aktivitede katkılarından dolayı sevgili MSP, Okan Öztürkmenoğlu'na çok teşekkür ediyorum. Bereketine hayran kaldığım etli ekmek desteği ile tüm günü ayakta geçirebilmeme büyük katkıları oldu :)

Tekrar görüşmek üzere ;)

Tuesday, May 13, 2008 6:16:49 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   AJAX | LINQ | Seminer | Silverlight | Silverlight 2.0 | WPF  | 
 Sunday, April 13, 2008

Bugün TBD ve INETA işbirliğinde "4 Konu 4 Gün" ücretsiz eğitim serisinin son gününde de LINQ işleyerek eğitim serisini bitirmiş olduk. Artık biraz klasikleşmiş olsa da emin olun gerçekten "çok büyük zevk" aldığım günler yaşadım. Gerçekten hem pazar günlerinin hakkını vererek "eğlendik" hem de bir çok şey öğrenerek bilgiyi paylaştık.

"4 Konu 4 Gün" eğitimi LINQ günü.
"4 Konu 4 Gün" eğitimi LINQ günü.

Aktiviteye katılan herkese onlarca teşekkür ediyorum buradan. Muhteşemdiniz ;)

Sunday, April 13, 2008 8:52:31 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   LINQ  | 
 Tuesday, March 25, 2008

Son iki gündür Isparta, Süleyman Demirel Üniversitesi'ndeydim. İki gün boyunca Silverlight, WPF, ASP.NET 3.5 AJAX ve LINQ konularına değindik. SDÜ zaten daha önce de öğrencilerinden bana gelen soru mailleri ile beni şaşırtan bir üniversite olmuştu. Bu ziyaretimde de epey şaşkın anlar yaşadım. Peki neye şaşırdım? SDÜ'de şu an Silverlight ve WPF konularında bitirme projeleri hazırlayan kardeşlerimiz var. Daha çoğu üniversitede bu konuların birer mistik ütopya olarak dolaştığını düşünürsek SDÜ öğrencileri ciddi şanslı. Seminerler boyunca gelen sorular ortalamanın çok üstünde bir seviyeye sahipti.

Süleyman Demirel Üniversitesi, Isparta
Süleyman Demirel Üniversitesi, Isparta

Buradan özellikle SDÜ'den sevgili Eğitim Görevlisi dostum Mehmet Albayrak'a ilgisi, misafirperverliği ve organizasyondaki katkısı için çok teşekkür ediyorum. Ayrıca tabi ki güler yüzleri ve teknoloji aşkları ile beni hem şaşırtan hem de sevindiren katılımcılara, SDÜ öğrencilerine de çok teşekürler. Kısa zamanda yakaladığım ufak bir manzara fotoğrafı ile buradan Ispartaya tekrar selamlar.

Eğirdir Gölü Tepesi, Isparta
Eğirdir Gölü Tepesi, Isparta

Tuesday, March 25, 2008 7:59:49 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   AJAX | ASP.NET 3.5 | LINQ | Seminer | Silverlight | WPF  | 
 Monday, March 17, 2008

Ücretsiz eğitim konseptinde düzenlediğimiz INETA ve NETRON sponsorluğundaki Silverlight 1.0 eğitimine gelen ve gelmeye devam eden büyük ilgi daha önce de tahmin ettiğim bir durumdu. Bu konuda maalesef "talihli" olamayıp seçilemeyen arkadaşlar haklı olarak sitemkar mailler gönderiyorlar. Emin olun bu tarz aktivitelere devam edeceğiz, mekan sponsorları aramaya devam ediyorum.

Bundan yaklaşık bir ay kadar öncesinde sevgili Burcu Kutlu ile temellerini attığımız bir diğer etkinliği bugün sizlere duyurmak istiyorum. Bu sefer de INETA ve TBD Genç işbirliği ile birer tam günlük dört farklı konuda bilgisayar başında eğitimler açıyoruz. "Bir günlük eğitim mi olur?" derseniz aslında haklısınız ama en azından kendi adıma düşündüğümde 3 saatlik seminerlerimden sonraki adım diyebilirim. Diğer Silverlight eğitimini 3 gün olarak tasarlamıştık. Umarım yakında bu gibi ücretsiz eğitimlerin sayısını arttıracağız. Bu seferlik dört konu, dört gün ;)

23 Mart - ASP.NET 3.5 AJAX
30 Mart - Silverlight
6 Nisan - Expression Blend ve WPF
13 Nisan - ASP.NET 3.5 ve LINQ

Eğitim saatleri her gün 10.00-18.00 arasında, eğitim yeri TBD İstanbul (Ali Ruhi Sok. No:2, K.3, Hasanpaşa/ Kadıköy).

Kayıt için bu adresi kullanabilirsiniz; http://www.tbdgenc.org/index.php?page=activityjoin&lang=tr&id=29

Buradan özellikle tekrar sevgili Burcu Kutlu'ya aktivitenin organizasyonundaki yoğun emekleri için çok teşekkür ediyorum.

Monday, March 17, 2008 10:36:44 AM (GTB Standard Time, UTC+02:00)  #    Comments [5]   AJAX | ASP.NET 3.5 | Expression Blend | LINQ | Silverlight | WPF  | 
 Friday, February 29, 2008

Dün verdiğim sözü tutmanın zamanı geldi. Sizlerle kodlarını paylaştığım mini projenin içerisindeki önemli birkaç noktayı öne çekerek mini bir XLINQ ve VB şovu yapmak istiyorum :) Üzgünüm C# cılar .Element veya .Elements gibi metodlarla uğraşmak zorunda kalacaklar ve benim güzel VB'mi bırakarak ek metotlar kullanmaya niyetim yok :) Ayrıca paylaştığım proje de VB ile yazılmış durumda o nedenle bu yazı da full VB olacak. (Sektörde benim kadar agresif C#'a saldıran yok :) Allah sonumu hayır etsin:) Bu arada C#'ı severim yani ama herkes yerinde sağ olsun ;))

Kodlara geçmeden önce gelin projenin kullandığı XML dosyalarının yapısına bir göz atalım.

<?xml version="1.0" encoding="utf-8"?>

<Olay>

  <Tag>223257</Tag>

  <Icerik>1112567</Icerik>

  <Katilimci>0</Katilimci>

  <Katilan Adi="Ercan Altuğ Yılmaz" Mail="hebele@gubele.com" Tel="0900900900:)" />

  <Katilan Adi="İbrahim Demir" Mail="hebele@gubele.com" Tel="0900900900" />

</Olay>

Projedeki her bir aktivite için aktivitenin TAG ozelliği ile aynı isme sahip bir XML dosyası oluşturuluyor. Ayrıca TAG bilgisi neden dosyanın içerisine de kaydetmişim bilmiyorum :) Şimdi kodumu okurken saçma olduğunu gördüm. Neyse gece yarısı aceleyle herhangi bir planlama olmadan kod yazılırsa böyle olur :) Yukarıdaki gibi yaratacağımız XML dosyalarında Olay kök elementinin içerisinde Icerik kısmına söz konusu aktivite ile ilgili açıklamaları içerecek olan HTML kodları yerleştirilecek. Maksimum katılımcı sayısı Katilimci tagları arasına yazılacak. Sonrasında aktiviteye kayıt olan herkesin bilgisi Katilan taglarındaki gibi bu dosyaya eklenecek.

kayit.aspx

Bu dosyayı herhangi bir kaydı göstermek veya düzenlemek için kullanacağız. Eğer bu dosyaya herhangi bir aktivitenin tag bilgisi adres üzerinden ?tag=aktivite şeklinde aktarılmış ise söz konusu aktivitenin bilgileri gelecek ve sonrasında değiştirilebilecek. Aksi halde yeni bir aktivite yaratılacak. Önemli olan birinci nokta yeni bir aktivite için yeni bir XML dosyası yaratarak içerisine gerekli bilgileri ekleyebilmek.

Dim Belge As New XDocument

Dim root As New XElement("Olay")

root.Add(New XElement("Tag", TextBox2.Text))

root.Add(New XElement("Icerik", TextBox1.Text))

root.Add(New XElement("Katilimci", TextBox3.Text))

Belge.Add(root)

Belge.Save(Server.MapPath("App_Data") & "\" & TextBox2.Text & ".xml")

Yukarıdaki kodda bir XDocument yaratarak içerisine XElement'ler ekliyoruz. Elementleri eklerken isterseniz değerlerini de ikinci parametre olarak verebiliyorsunuz. Son olarak da XDocument'ın Save metodu ile dosyayı kaydediyoruz. Olay aslında bu kadar basit. Kullanıcının kutulara girdiği metinleri herhangi bir kontrolden geçirmiyoruz, çünkü birincisi yönetim panelindeyiz. Yani güvenli bir yerdeyiz, ikincisi bu projede buna zamanımız yok :D Ama aklınızda olsun halka açık sitelerde böyle girişleri script injection için kontrol etmek gerek.

Peki var olan bir dosyayı okuyup ekranda nasıl gösteririz?

Dim Belge = XDocument.Load(Server.MapPath("App_Data") & "\" & Request.QueryString("tag") & ".xml")

TextBox2.Text = Belge.<Olay>.<Tag>.Value

TextBox3.Text = Belge.<Olay>.<Katilimci>.Value

TextBox1.Text = Belge.<Olay>.<Icerik>.Value

 

GridView1.DataSource = From Gelenler In Belge.<Olay>.<Katilan> Select Gelenler.@Adi, Gelenler.@Mail, Gelenler.@Tel

GridView1.DataBind()

İlk satırda gördüğünüz üzere XDocument sınıfının Load metodu ile dosyamızı okuyarak Belge değişkenine aktarıyoruz. Bu noktada özellikle VB ile ilgili late-binding olayından bahsetmek istiyorum. Dikkatinizi çektiyse Belge değişkenini tanımlarken herhangi bir değişken tipi belirtmedim. Bu durum kod çalışırken run-time esnasında değişkenin tipi belli olacak şeklinde çalışmıyor. Eğer böyle çalışsaydı yıllar önceki VB'deki performans kaybını yaşamış olurduk. Tam tersine biz bu kodumuzda Belge değişkeninin tipini belirtmesek de compiler bunu algılayarak gerekli tanımlamaları yapacaktır. Zaten yukarıdaki manzarada bile Visual Studio içerisinde Belge değişkeninin üzerine fare ile geldiğimizde değişkenin tipinin algılandığını görebiliyoruz. Buradan yola çıkıp "hiçbir değişkenin tipini tanımlamayın" diye bir şey söylemiyorum, bu büyük bir hata olur fakat tipi belli bir şey için de uğraşmaya gerek yok :) (VB'cilerdeki bu tembellik nedir ya :D)

GridView ile ilgili kısma geçerken bu Grid'in ne işe yarayacağını baştan söyliyeyim. Tüm kolonları otomatik yaratılmak üzere ayarlanmış bir Grid olarak bu arkadaşımızın görevi aktiviteye kayıt olanların bilgilerini göstermek. Bunun için doğrudan Belge değişkenimize bir LINQ sorgusu göndererek istediğimiz bilgileri kolonlar şeklinde alıyoruz. Ne kadar kolay değil mi?

default.aspx

Proje içerisinde değinmek istediğim bir diğer dosya da ana kayıt sayfası. Bu sayfada ilk olarak söz konusu aktiviteye kayıt olan kişi sayısını bularak maksimum sayının altında olup olmadığını kontrol etmemiz gerekiyor. Yani XML dosyası içerisinde Katilan taglarını saymamız gerek.

If Belge.<Olay>.<Katilimci>.Value <= Belge.<Olay>.<Katilan>.Count And Belge.<Olay>.<Katilimci>.Value <> 0 Then

Label1.Text = "Aktivite için maksimum kayıt sayısına ulaşıldı. Üzgünüz, bir dahakine."

kayittablo.Visible = False

Else

Belge değişkenimize XML dosyasını yükledikten sonra doğrudan Olay'ın Katilimci değerinden maksimum katılımcı sayısını alabiliyoruz. O ana kadar toplam kaç kişinin kayıt olduğunu, yani Katilan taglarının sayısını da doğrudan Count metodu ile alabiliyoruz. XLINQ cidden süper bir şey, eskiden ömür tüketirdi bu işler.

Dim Belge = XDocument.Load(Server.MapPath("App_Data") & "\" & Request.QueryString("event") & ".xml")

Belge.<Olay>.SingleOrDefault.Add(New XElement("Katilan", New XAttribute("Adi", TextBox1.Text), New XAttribute("Mail", TextBox2.Text), New XAttribute("Tel", TextBox3.Text)))

Belge.Save(Server.MapPath("App_Data") & "\" & Request.QueryString("event") & ".xml")

Son olarak gelelim kayıt olan ziyaretçinin bilgilerini XML dosyasına eklemeye. XML dosyasını okuyarak içerisinde Olay kök elementini buluyoruz. Normalde elementler liste olarak döndürüldüğü için bizim bu listeyi tek bir elemente çevirmemiz lazım. Olay elementinin zaten XML dosyasında bir adet olabileceğini biz biliyoruz, çünkü kök element. O nedenle Olay'ı yakaladıktan sonra .SingleOrDefault diyerek bunu tek bir element olarak alıyoruz ve içerisine Katilan elementi ekliyoruz. Katilan elementini XElement olarak yaratırken birinci parametrede elementin adını verdikten sonra istediğiniz kadar başka XElement'ler veya XAttribute'ler ekleyebilirsiniz. Bizde katılımcının adı, telefonu ve maili yeterli olacak. Son olarak dosyayı diske kaydediyoruz.

XLINQ ile XML uygulamaları "bebelere balon" kıvamında!

Eski günlerde olsak yukarıdaki işlemleri yapabilmek için XSLT, XPATH bilmenin yanı sıra bolca da XML okuma ve yazma için kod yazmanız gerekirdi. Oysa bugün iş gerçekten çocuk oyuncağı da olmanın ötesinde "bebelere balon" kıvamına gelmiş durumda. Umarım bu projeyi sizlerle paylaşmam XLINQ'nun kullanımı ile ilgili ufak da olsa bir fikir verip bu dünyaya giriş yapmanıza yardımcı olur.

Hepinize kolay gelsin.

Friday, February 29, 2008 2:14:40 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   ASP.NET 3.5 | LINQ  | 
 Thursday, February 28, 2008

Ücretsiz 24 saatlik Silverlight eğitimi ile ilgili duyuru içerisindeki kayıt formunu görmüşsünüzdür. Maalesef bu form sistemini yapmamı bekleyerek duyuruyu üç gün kadar geç yapabildik :) Bu aralarda ciddi çok yoğun.

Peki böyle bir formu yapmak ne kadar sürebilir ki? Ortalama 15 dakikamı aldı, ama sadece bir mailform değil :) Hazır yapmışken ileriki aktiviteler için de kullanabileceğim bir sistem yapmak istedim. Hedefim mini-iğrenç :) bir yönetim panelinden en azından aktivite yaratıp kapatabilmekti, tabi kayıt olan kişilerin listesini de alabilmem gerekiyordu. Neden iğrenç dediğimi de açıklıyım. Sadece ben kullanacağım için yönetim panelinin güzelliği ile vs hiç mi hiç uğraşmadım :) iş görsün yeter.

Konuyu uzatmadan, bütün bunları neden size anlattığımı da söylemekte fayda var. Hazırlamış olduğum sistemi tüm kodları ile sizlerle paylaşmaya karar verdim. Evet, birazdan indirebileceksiniz :)

Sistem aslında çok basit bir mantıkla çalışıyor. Yönetim panelinden bir aktivite yaratıyorsunuz aktiviteye verdiğiniz TAG özelliği o aktivitenin kodu oluyor. Bu kod üzerinden default.aspx?event=kod gibi adreslerle insanlar bu aktivitelere kayıt olabiliyorlar. Her bir aktivitenin kodu, aciklamasi ve maksimum katılımcı sınırı var. Aciklama kısmı aktivite ile ilgili sayfadaki kayıt formunun üzerindeki HTML kısmı içeriyor. Makimum katılımcıyı isterseniz 0 vererek sınırsız hale getirebiliyorsunuz. Her bir aktivite ile ilgili tüm bilgiler ayrı ayrı XML dosyalarında App_data klasöründe saklanıyor.

Uyarılar

Arkadaşlar birazdan projenin kodlarını indirip incelerken bu projeyi bir gece yarısı saat 01.00 ile 01.15 arasında yaptığımı aklınızın bir köşesinde bulundurun :) Hatta bu projeyi paylaşıyorum diye içerisinde herhangi bir değişiklik vs de yapmadım. Yalan olmasın login.aspx deki şifreyi değiştirdim. O nedenle aşağıda bahsettiğim noktalarla ilgili bu projeyi örnek almayın!

Bunları örnek almayın!

-Authentication yapısı rezalet. Zaten login.aspx de kullanıcı adı bile yok, sadece şifre soruyor :) Şifreyi sorduğu metin kutusunun tipi bile Password değil :) Bir ara düzeltmek lazım. Forms Authentication kurmaya üşendim.

-XML dosyalarının okunması ve yazılması arasında aslında application.lock kullanmak lazım. Aynı salisede 2 kişi formu göndermeye kalkarsa biri karambole gidecektir. Allahtan bizde pek böyle bir ihtimal yok gibi :) (Umarım)

İncelenmesi gereken kısımlar (Projenin kodunu paylaşmaktaki amacım)

XLINQ ile yazılmış kısımlara özellikle dikkat etmenizde fayda var. XML dosyalarının yaratılmasındaki kolaylık, okunmasındaki rahatlık özellikle dikkat çekici. Bu kodu sizlerle paylaşmanın birinci nedeni XLINQ örneği olarak incelemeniz ikincisi ise böyle bir mini sisteme ihtiyacı olan varsa alsın rahat rahat kullansın :)

LINQ'den bahsettiğimize göre unutmamak gerek ki bu site ASP.NET 3.5 ile hazırlanmıştır. Projedeki bazı kodlarla ilgili yarın bazı açıklamalar da yayınlayacağım.

Hepinize kolay gelsin.

Aktivite Kayıt Sistemi Kaynak Kodları - 28022008_1.zip (7.5 KB)

Thursday, February 28, 2008 1:29:56 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   ASP.NET 3.5 | LINQ  | 
 Monday, February 04, 2008

PCnet'in Şubat sayısındaki yazılarımı her ay olduğu gibi yine buradan sizlere duyurmak istiyorum :) Derginin OKUL bölümünde AJAX, ASP.NET 3.5, Expression Blend ve Silverlight ile ilgili yazılarım yer alıyor.

AJAX : Zaman doluyor, AJAX istekleri yolda.
Expression Blend : WPF Uygulamalarında internette
Silverlight: Silverlight ve JavaScript
ASP.NET 3.5 : ASp.NET 3.5 ve LINQ2SQL

Tüm bu yazılara ek olarak Şubat sayısına özel ".NET Framework 3.5'in Yıldızı: LINQ" makalem de OKUL bölümünde yer alıyor :)

Hepinize kolay gelsin.

Monday, February 04, 2008 12:41:34 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   AJAX | ASP.NET 3.5 | Expression Blend | LINQ | Silverlight  | 
 Sunday, January 20, 2008

Daha önceki yazılarımda sadece VB'de çalışan ve benim "inline XML" diyebileceğim VB kodları içerisinde doğrudan XML yazımının kullanılmasından bahsetmiştim. İşin kötü tarafında bu noktada Visual Studio'nun Intellisense desteği maalesef bizim hedef XML'in içeriğini inceleyerek otomatik bir Intellisense oluşturamıyor. "Çok şey istiyorsunuz!" dediğinizi duyar gibiyim ama benim gibi çok isteyen olmuş ki Visual Basic 2008 için özel "XML to Schema Tool for Visual Basic 2008" üretilmiş. Aşağıdaki adresten aracı bilgisayarınıza indirerek hemen yükleyebilirsiniz. (LINQ2XML kullanacaklara ŞİDDETLE tavsiye ediyorum :))

http://www.microsoft.com/downloads/details.aspx?FamilyID=9ac5a653-563a-4204-a4eb-dddcae80b244&displaylang=en

LINQ2XML ile XML dosyaları üzerinde çalışmak gerçekten kolaylaştı. Üzerine bir de VB'nin kolaylıkları ve yukarıdaki araç eklenince iş gerçekten çocuk oyuncağına dönüşüyor.

Nasıl kullanacağız?

Herhangi bir proje yarattıktan sonra doğrudan "Solution Explorer" içerisinde projeye sağ tuş ile tıkladıktan sonra "Add / New Item" diyerek karşınıza gelen menüden "XML to Schema" seçeneğini seçebilirsiniz.

XML to Schema dosyası.
XML to Schema dosyası.

Dosyası eklediğiniz anda karşınıza bir seçenek daha gelecek. Bu seçenekler arasında hedeflediğiniz, yani kullanacağınız esas XML dosyasının konumu soruluyor. İsterseniz "Add from File" ile sisteminizdeki bir dosyayı veya "Add from Web" ile doğrudan internetteki bir dosyayı veya "Add as XML" ile kullanacağınız XML verisini Visual Studio içerisinde yazabilirsiniz. Biz örneğimizde her zamanki gibi TCMB döviz kurlarını alalım.

TCMB döviz kurlarını alıyoruz.
TCMB döviz kurlarını alıyoruz.

XSD dosyasını bu şekliyle projemize ekledikten sonra artık sıra geldi kodumuzu yazmaya. Artık bir önceki adımda eklediğimiz XML dosyasının içeriğinden oluşturulan Intellisense'i kullanabiliriz.

LINQ2XML Intellisense desteği.
LINQ2XML Intellisense desteği.

Hepinize kolay gelsin ;)

Sunday, January 20, 2008 4:20:33 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   LINQ | Visual Basic 2008  | 
 Wednesday, January 16, 2008

Özellikle uzun metinleri hazırladığımız kodun içerisine gömmek istediğimizde satır atlamaları vs epey can sıkıcı bir hal alıyor. Bu nedenle çoğu zaman bu metinleri harici bir TXT dosyasına koyarak oradan çekmeyi tercih ediyorum. Oysa yeri geldiğinde bir ASP.NET web sayfasında minik bir HTML kodunu veya Winforms uygulamasında çok satırlı bir uyarı mesajını rahatlıkla kodun içerisine koyabilsek ne kadar hoş olurdu değil mi?

"Koyarız zaten" dediğinizi duyar gibiyim. Gelin eskiden nasıl koyduğumuza ufak bir örnek ile bakalım.

Dim UyarıMesaji As String = "Bu ""ÖZEL"" bir uyarı" & vbCrLf & "mesajıdır."

Eğer içeri alacağınız metin çok uzunsa aslında bir de kodun okunabilirliği adına kod içerisinde de satır atlayarak yazmak isteyebilirsiniz. Bu durumda da takriben aşağıdaki gibi bir manzara ortaya çıkacaktır.

        Dim UyarıMesaji As String = "Bu ""ÖZEL"" bir uyarı" _

                                    & vbCrLf & "mesajıdır."

Peki bu kadar sorunlardan bahsettik de çözümü nedir? Çözüm .NET Framework 3.5 ile beraber gelen XLINQ sınıflarında yatıyor :)

        Dim UyarıMesaji As XElement = <Mesaj>Bu "Özel" bir uyarı

mesajıdır.</Mesaj>

 

        Console.Write(UyarıMesaji.Value)

İşte artık istediğiniz gibi metinlerinizi bir XElement olarak kod içerisine yerleştirebilir sonra da söz konusu XElement'in value metodu ile metni alabilirsiniz. Hatta daha da güzel kullanım şekilleri var.

        Dim UyarıNo As Integer = 7893

        Dim UyarıMesaji As XElement = <Mesaj>Bu "Özel" bir uyarı

mesajıdır.

Uyarı numarası:<%= UyarıNo %></Mesaj>

Yukarıdaki kod içerisinde yarattığımız metne bir değişkeni de metin olarak ekliyoruz. Bu teknik özellikle bir metnin içerisine çok sayıda farklı parametre eklenecek işimizi epey kolaylaştıracaktır. Gelin bir de birden çok uyarı numarasının bulunabileceği bir örnek yapalım.

        Dim UyarıNo() As Integer = {7893, 7777}

        Dim UyarıMesaji As XElement = <Mesaj>Bu "Özel" bir uyarı

mesajıdır.

<%= From Uyarilar In UyarıNo Select <Uyari>

Uyarı numarası:<%= Uyarilar %></Uyari>.Value %></Mesaj>

Yukarıdaki kod kafanızı karıştırabilir. Belki biraz eski ASP günlerine dönmek anlamanıza yardımcı olabilir. İlk olarak UyarıNo adında bir diziye toplam iki adet uyarı numarası ekledim. Uyarı mesajımı yaratırken bu dizinin içerisinde her bir uyarı numarasını mesajın sonuna yazdırmak istiyorum. Mesajı XElement olarak oluştururken içine bir LINQ sorgusu yerleştiriyorum. LINQ sorgusu geriye yine bir XElement yaratarak söz konusu elementin Value'sunu döndürüyor. LINQ sorgusu dizi içerisinde gezerek her bir kayıt için gerekli metni yaratarak toplu olarak döndürecektir.

Gördüğünüz gibi VB 9.0 ile beraber çok ilginç yenilikler geliyor. Daha da güzeli :) bunlar maalesef C# tarafında yok :)

Hepinize kolay gelsin.

Wednesday, January 16, 2008 12:06:11 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   LINQ | Visual Basic 2008  | 
 Wednesday, January 02, 2008

2008'in ilk aktivitesini CETURK.com organizasyonunda Microsoft, İstanbul / Dikilitaş binasında gerçekleştiriyoruz. "2008 Microsoft Vizyonu ve Yeni Teknolojileri Semineri" olarak adlandırdığımız güne hepiniz davetlisiniz :) 12 Ocak, Cumartesi günü sabah 10'dan başlayarak 17.30'a kadar sürecek olan seminerlerin konuları arasında Expression Web, Design, Blend, Silverlight, Visual Studio 2008, LINQ bulunuyor. Expression Blend ile WPF Animasyonları ve Silverlight 1.0, 2.0 Uygulamaları bölümünü 12.30-14.30 arasında ben sunuyor olacağım.

Programın detayları ve seminere kayıt için aşağıdaki linki kullanabilirsiniz.

http://www.ceturk.com/etkinlikkayit.asp?id=35

Wednesday, January 02, 2008 11:46:06 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   .NET Framework 3.5 | ASP.NET 3.5 | Expression Blend | Expression Design | Expression Encoder | Expression Web | LINQ | Seminer | Silverlight | Visual Studio 2008 | WPF  | 
 Tuesday, January 01, 2008

LINQ ile veritabanına sorgu göndererek istediğimiz verileri alabileceğimiz örneklere blogumda eski yazılarımda bolca yer verdim. Fakat aslında LINQ sadece veritabanından veri çekmek için değil yeri geldiğinde veritabanına veri göndermek, yani INSERT, UPDATE ve DELETE işlemleri için de rahatlıkla kullanılabilir.

Aşağıdaki şekliyle bir DBML dosyamız ve tabi ki bir de buna bağlı veritabanımız olduğunu varsayalım.

Örneğimizdeki DBML dosyamızın yapısı.
Örneğimizdeki DBML dosyamızın yapısı.

Şimdi gelin bu veritabanından bir satırı LINQ ile veritabanından çekerek içerisinde bir UPDATE işlemi yapalım.

Partial Class _Default

    Inherits System.Web.UI.Page

    Dim MyData As New DataClassesDataContext

 

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim x As AnaBolumler = (From MyTable In MyData.AnaBolumlers Select MyTable Take 1).SingleOrDefault

        x.AnaName = "Ahmet"

        MyData.SubmitChanges()

    End Sub

 

End Class

Yukarıdaki kod örneğinizde AnaBolumler adında bir değişken yaratarak veritabanından tek bir kayıt almak için de LINQ deyiminde Take 1 kısmını kullanıyoruz. Siz kendi örneklerinizde isterseniz PK üzerinden sorgular da düzenleyebilirsiniz. Yukarıdaki gibi bir LINQ sorgusu geriye bir dizi döndüreceği için tek bir nesneye eşitleme şansımız olmaz. O nedenle sorgunun geriye sadece tek bir nesne döndürebilmesi için ayrıca SingleOrDefault deyimini de kullanmamız gerekiyor. Aldığımız nesnenin herhangi bir özelliğini istediğimiz gibi değiştirdikten sonra artık geriye kalan DataContext üzerinden SubmitChanges metodunu çağırarak değişikliklerin veritabanına yansıtılmasını sağlamak.

Şimdi bir de INSERT işlemi yapalım.

    Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim x As New AnaBolumler

        x.AnaName = "Ahmet2"

        MyData.AnaBolumlers.InsertOnSubmit(x)

        MyData.SubmitChanges()

    End Sub

Kod içerisinde veritabanına gönderilmek üzere yeni bir AnaBolumler nesnesi yaratarak nesnenin tüm özelliklerini belirliyoruz. Sonrasında DataContext nesnemiz olan MyData üzerinden AnaBolumlers tablosunun INSERT edilecek satırlar listesine InsertOnSubmit metodu ile satırımızı ekliyoruz. Tüm bu işlemleri tamamladıktan sonra DataContext'in SubmitChanges metodu ile değişikliklerin, yani bu örnekte yeni eklenen satırların veritabanına aktarılmasını sağlıyoruz.

Son olarak bir DELETE yapmanın yoluna göz atalım.

    Protected Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click

        Dim x As AnaBolumler = (From MyTable In MyData.AnaBolumlers Select MyTable Take 1).SingleOrDefault

        MyData.AnaBolumlers.DeleteOnSubmit(x)

        MyData.SubmitChanges()

    End Sub

Yukarıdaki kod içerisinde yarattığımız X adındaki AnaBolumler nesnesine veritabanından silmek istediğimiz nesneyi bir LINQ sorgusu ile aktarıyoruz. Sonraki satırda DataContext içerisinde AnaBolumler tablosunun silinecek kayırlar listesine elimizdeki X değişkenini DeleteOnSubmit metodu ile ekliyoruz. En sonunda da yine DataContext'in SubmitChanges metodu ile değişikliklerin veritabanına yansımasını sağlıyoruz.

İşte LINQ ile veritabanında kayıtlar üzerinde değişiklik yapmak bu kadar kolay.

Yeni yılın bu ilk yazısında hepinize tekrar sağlıklı ve mutlu bir yıl diliyorum.

Tuesday, January 01, 2008 2:45:32 PM (GTB Standard Time, UTC+02:00)  #    Comments [5]   LINQ  | 
 Monday, December 31, 2007

Dün mail ile WPF ve LINQ'nun beraber kullanılıp kullanılamayacağı ile ilgili güzel bir soru geldi. Ben bu soruyu hemen ufak bir blog yazısına çevirerek bilgiyi buradan sizlerle de paylaşmak istiyorum. WPF ile LINQ'nun beraber kullanılabilmesi aslında WPF'in .NET Framework 3.5 ile kullanılabilmesine bağlı. WPF esasen .NET Framework 3.0'ın bir parçasıdır fakat tabi ki .NET Framework 3.5 ile beraber de kullanılabiliyor hatta 3.5'in 3.0 üzerine geldiğini düşünürsek aslında WPF 3.5'in de bir parçası. Peki nasıl olacak da bir WPF uygulamasını .NET Framework 3.5 ile çalışır hale yaratacağız. Aslında cevap pek zor değil, doğrudan Visual Studio 2008 kullanabilirsiniz. Tek yapmanız gereken Visual Studio 2008'in Multi-Targeting özelliğinden faydalanarak .NET Framework 3.5'i seçmek.

Visual Studio 2008 içerisinde .NET Framework 3.5 ile WPF Projesi
Visual Studio 2008 içerisinde .NET Framework 3.5 ile WPF Projesi

Aslında esas sorun Expression Blend tarafında. Expression Blend içerisinde yeni bir WPF projesi oluşturmak isterseniz projeniz otomatik olarak .NET Framework 3.0'ı hedefleyecektir. Bunun nedeni Expression Blend'in .NET Framework 3.5'ten önce yayınlanmış olması. Bu sorunu şimdilik çözmek için Expression Blend 2 December Preview kullanabilirsiniz.

Expression Blend 2 December Preview içerisinde .NET Framework 3.5 desteği.
Expression Blend 2 December Preview içerisinde .NET Framework 3.5 desteği.

Yukarıda Expression Blend 2'nin proje yaratma penceresinde farklı Framework sürümlerini seçebiliyorsunuz. Tabi tüm bunlara ek olarak unutmamak gerek ki projenizi .NET Framework 3.5 desteği ile Visual Studio 2008 içerisinde yarattıktan sonra Expression Blend'in yayında olan sürümüyle de söz konusu projeyi açarak düzenleyebilirsiniz. Sorun sadece yeni proje yaratırken karşımıza çıkıyor.

.NET Framework 3.5 ile bir WPF uygulaması yaratırken tüm .NET Framework 3.5 projelerinde olduğu gibi WPF ile de LINQ'yu rahatlıkla kullanabilirsiniz.

Hepinize mutlu yıllar :)

Monday, December 31, 2007 3:04:43 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   Expression Blend | LINQ | WPF  | 
 Wednesday, December 26, 2007

LINQ'nun güzellikleri serime devam etmek istiyorum :) .NET Framework3.5 ile gerçek hayat projeleri yapabileceğimiz bu dönemde LINQ'nun proje süreçlerini ciddi şekilde hızlandırdığı kesin. Daha önceki yazılarımda kabaca LINQ2XML'den bahsetmiştim. XML verilerini LINQ ile sorgulayarak istediğimiz verileri alabiliyor olmak önceki muadilleri olan XMLReader'a ve XPATH'e kıyasla çok daha kolay kullanılabilir bir arayüz sağlıyor.

Konuya hemen çok popüler bir örnek ile giriş yapmak istiyorum. TCMB web sitesinden güncel döviz kurlarını çekmek neredeyse her yazılım geliştiricinin deneyim ettiği bir işlemdir. Bu işlem için için eskiden en kolay yol olarak bir dataset yaratıp dataset'e ait ReadXML metodunu kullanıyorduk. Aslında sadece bir döviz kuru okumak için DataSet iki complex bir nesne yaratıyor olmak ciddi anlamda sistem kaynaklarının boşa harcanması demektir ama kimin umrunda? :) Profesyonel yol ise XMLReader ile XPATH kullanarak uygun veriyi almak.

Peki artık LINQ varsa ve biz LINQ ile XML verilerini de sorgulayabileceksek aşağıdaki kod yeterli olmak mı?

        Dim doc = XDocument.Load("http://www.tcmb.gov.tr/kurlar/today.xml")

        Response.Write(doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<CurrencyName>.Value = "US DOLLAR").<ForexBuying>.Value)

Yukarıdaki kod içerisinde ilk olarak bir System.XML.Linq.XDocument nesnesi yaratıyoruz. Dokümanımız direk web sitesinden XML belgesini okuyor. Bir sonraki satırda ise direk LINQ2XML kullanarak verimizi buluyoruz. Son satırı biraz parçalayarak inceleyelim.

doc.<Tarih_Date>.<Currency>

Bu kod ile hedef doküman içerisindeki XML taglarını gezerek Tarih_Date tagları içerisinde bulunan tüm Currency taglarının bir listesini alıyoruz. Bu listeyi aldıktan sonra LINQ Extension Method'larından Where'i kullanarak bir sorgu çalıştırıyoruz.

doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<CurrencyName>.Value = "US DOLLAR")

Buradaki Where methodu bizden bir karşılaştırma fonksiyonu istiyor. Söz konusu fonksiyon karşılaştırmak için gelen veriyi parametre olarak alıyor. Biz Currency tagını listelediğimizde göre her bir Currency içerisinde CurrencyName üzerinden verimizi filtreliyoruz ve sadece CurrencyName'i "US DOLLAR" olan satırı Currency'i istiyoruz.

Filtreleme işlemini yaptıktan sonra hala elimizde filtremize uyan bir Currency elementi listesi var. Bize tek bir Currency döneceğini bildiğimiz için direk söz konusu Currency'nin bu sefer de ForexBuying elementini yakalayarak içerisinde değeri almak için de Value metodunu kullanıyoruz.

doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<CurrencyName>.Value = "US DOLLAR").<ForexBuying>.Value

Böylece artık elimizde dolar kuru var. Bu şekilde herhangi bir XML dokümanı içerisinde gezmek gerçekten çok kolay. Gelin aynı XML dokümanı içerisinde farklı bir sorgu çalıştıralım. Curreny listesi içerisinde Isim değerinde "I" harfi bulunan kayıtların CurrencyName'lerini listeletelim.

        Dim doc = XDocument.Load("http://www.tcmb.gov.tr/kurlar/today.xml")

 

        For Each kur In doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<Isim>.Value.Contains("I"))

            Response.Write(kur.<CurrencyName>.Value)

        Next

Yukarıda da gördüğünüz gibi XDocument üzerinden sorgumu oluşturduktan sonra direk bir For Each döngüsüne kaynak olarak veriyorum. Döngü içerisinde de bir Currency elementi olan kur değişkeninin CurrencyName değerini alarak ekrana yazdırıyorum.

Anlayacağınız artık XPath bilgisi olmadan rahatlıkla XML kaynaklarını sorgulamanız mümkün.

Hepinize kolay gelsin.

Wednesday, December 26, 2007 3:35:25 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   LINQ  | 
 Tuesday, December 25, 2007

Bir süredir okuduğum yazılarda ve konuştuğum kişilerde LINQ denildiğinde akla sadece veritabanına kolay yoldan sorgu yollama gibi bir kavramın geldiğini gördüm. O nedenle bu yazımda birkaç örnek ile aslında LINQ'nun çok daha farklı durumlarda kullanılabileceğini ve işimizi veritabanından bağımsız olarak da kolaylaştırabileceğini göstermek istiyorum.

Birinci örneğimizde içerisinde birden çok TextBox ve birçok farklı control bulunan bir web sayfamız bulunsun. Varsayalım ki biz bu sayfadaki tüm TextBox'ların bir anda Enabled özelliklerinin False olmasını istiyoruz. Bu durumda yazacağımız kod aşağıdaki gibi olacaktır.

        For Each kontrol In Me.Form.Controls

            If TypeOf kontrol Is TextBox Then

                CType(kontrol, TextBox).Enabled = False

            End If

        Next

Oysa LINQ kullanarak bu işi çok daha hoş bir hale getirebiliriz. Yukarıdaki döngüde sayfadaki tüm kontrolleri dönmemiz gerekirken LINQ ile sayfadaki kontrolleri filtreleterek döngümüzün kaynağına sadece TextBox listesinin gelmesini sağlayabiliriz.

For Each kontrol As TextBox In From Gelenler In Me.Form.Controls Where TypeOf Gelenler Is TextBox Select Gelenler

     kontrol.Enabled = False

Next

Gördüğünüz gibi hayat aslında çok daha kolay ve LINQ yeri geldiğinde çok farklı kaynakları sorgulamaya bile yarıyabiliyor. Gelin bir örnek daha yapalım.

Çoğu zaman hazırladığımız web sitelerine kullanıcıların dosya yükleme veya resim yükleme gibi işlemler yapabilecekler kısımlar ekleriz. Tabi ki bu dosyalar yüklendikten sonra bir yerlerde de gösterilmek üzere seçilmelidir. Hikayeyi daha fazla uzatmadan esas konuya geleyim. Varsayalım ki bir klasör içerisinde tüm dosyaları bir DropDownList kontrolüne bağlayacağız. Dosyaların isimlerinin kullanıcıya gösterilmesini tam yol bilgisinin ise DropDownList'e ait Value özelliklerinde saklanmasını istiyoruz. Yazacağımız kod aşağıdaki gibi olacaktır.

Partial Class _Default

    Inherits System.Web.UI.Page

 

    Class DropSatir

        Private P_Dosya As String

        Private P_Path As String

        Property Dosya() As String

            Get

                Return P_Dosya

            End Get

            Set(ByVal value As String)

                P_Dosya = value

            End Set

        End Property

        Property Path() As String

            Get

                Return P_Path

            End Get

            Set(ByVal value As String)

                P_Path = value

            End Set

        End Property

        Sub New()

 

        End Sub

        Sub New(ByVal Dosya As String, ByVal Path As String)

            P_Dosya = Dosya

            P_Path = Path

        End Sub

    End Class

 

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim DosyaListesi As New System.Collections.Generic.List(Of DropSatir)

        For Each dosya As String In System.IO.Directory.GetFiles(Server.MapPath("."))

            DosyaListesi.Add(New DropSatir(System.IO.Path.GetFileName(dosya), dosya))

        Next

 

        DropDownList1.DataSource = DosyaListesi

        DropDownList1.DataTextField = "Dosya"

        DropDownList1.DataValueField = "Path"

        DropDownList1.DataBind()

    End Sub

End Class

Bir DropDownList doldurmak için bu kadar kod çok değil mi? diyorsanız aslında yapacak pek de bir şey yok :) Tek tek direk döngü içerisinde ListItem'lar yaratarak DropDownList'e ekleyebilirdik. O zaman da kodumuz aşağıdaki şekilde olurdu.

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        For Each dosya As String In System.IO.Directory.GetFiles(Server.MapPath("."))

            DropDownList1.Items.Add(New ListItem(System.IO.Path.GetFileName(dosya), dosya))

        Next

    End Sub

Çok daha kısa değil mi? :) Ama bu durumda DropDownList'in DataBound event'ı çalışmayacaktır. Biz dönelim bir de bu işlemi LINQ kullanarak nasıl yapabiliriz ona bakalım.

DropDownList1.DataSource = From Dosyalar In System.IO.Directory.GetFiles(Server.MapPath(".")) Select Dosya = System.IO.Path.GetFileName(Dosyalar), Dosyalar

DropDownList1.DataTextField = "Dosya"

DropDownList1.DataValueField = "Dosyalar"

DropDownList1.DataBind()

Gördüğünüz gibi olay çok daha basit bir hal alıyor. LINQ içerisinde System.IO.Directory.GetFiles'dan gelen veriye bir sorgu gönderiyoruz. Sorgumuzu alırken Dosya adında bir kolon tanımlayarak onu da System.IO.Path.GetFileName metodundan gelen veriye eşitliyoruz. Böylece istediğimiz veriler ayrı ayrı kolonlar olarak bize döndürülüyor ve doğrudan DropDownList kontrolümüze bağlayabiliyoruz.

Artık sanırım LINQ ile ilgili çok daha farklı düşünceleriniz vardır :)

Hepinize kolay gelsin.

Tuesday, December 25, 2007 12:58:58 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   LINQ  | 
 Friday, December 07, 2007

Blogumu sürekli takip edenler hatırlayacaklardır, bundan yaklaşık bir ay kadar önce LINQ'den ufak bir yazıyla bahsetmiştim ve daha VS 2008 çıkmadığı için biraz daha sabretmemiz gerektiğini belirtmiştim. Artık elimizde VS 2008 bulunduğuna göre LINQ'yu yavaş yavaş biraz daha incelemekte fayda var. Emin olun çok şaşıracaksınız.

Bu yazım boyunca Visual Web Developer 2008 Express kullanacağım. Yeni bir ASP.NET 3.5 web sitesi yaratarak başlayalım. Örnek boyunca ben kendi makinemde kurulu SQL2005 üzerindeki "forum" adındaki bir veritabanından faydalanacağım. Veritabanımın yapısını aşağıdaki şema içerisinde inceleyebilirsiniz.

Örnek veritabanı tasarımı.
Örnek veritabanı tasarımı.

Bu veritabanı üzerinden yola çıkarak ASP.NET 3.5 sitemde LINQ2SQL kullanarak veriye ulaşmaya çalışacağım. İlk olarak projemize bir "LINQ2SQL Class" dosyası eklememiz gerekiyor. Bunun için hemen "Solution Explorer" içerisinde projeye sağ tuş tıklayarak "New Item" demeniz yeterli.

Yeni bir DBML dosyası yaratıyoruz.
Yeni bir DBML dosyası yaratıyoruz.

Dosyayı projenize eklediğiniz gibi karşınıza farklı bir arayüz gelecektir. Bir sonraki adımda Visual Studio içerisinde "Database Explorer" panelinden SQL sunucunuza ve veritabanınıza bağlanmanız gerekiyor. Aslında işin bu bölümü Visual Studio 2005'den pek farklı değil. Bağlantıyı sağladıktan sonra veritabanınızdaki istediğiniz tabloları sürükle&bırak tekniği ile orta pencereye, yani DBML dosyasına aktarabilirsiniz.

Veritabanından DBML dosyasına yolculuk.
Veritabanından DBML dosyasına yolculuk.

Artık DBML dosyası kaydederek çıkabiliriz. Eğer isterseniz tabloların yanı sıra Store Procedure'lerinizi de DBML dosyalarına ekleme şansınız var. Peki "ekledik de ne oldu?" diyenlerdenseniz buyurun devam edelin.

Projemize ait default.aspx dosyasının Code-Behind sayfasına geçerek kodumuzu yazmaya başlayalım.

Dim datalarim As New DataClassesDataContext

Yukarıdaki satır ile tanımladığımız değişkenimizin bizim DBML dosyamızdaki LINQ nesnelerine ulaşmamızı sağlayacak böylelikle kolayca veritabanından istekte bulunabileceğiniz. Gelin hemen aşağıdaki kodumuz ile bakalım nasıl veri çekeceğiz.

Dim SeciliMesajlar = From Secililer In datalarim.Mesajlars Where Secililer.MesajText.Contains("DARON")

LINQ'yu ilk olarak görenler için yukarıdaki kodun ne kadar garip gözüktüğünün farkındayım :) İlk olarak yarattığımız değişkene bir bakalım. SeciliMesajlar adında bir değişken yaratarak LINQ sorguma eşitliyorum. Aslında yarattığım SeciliMesajlar değişkeninin tipi System.LINQ.IQueryable(of Mesajlar) şeklinde. Yani özetle bana Mesajlar nesnesinin bir listesinden oluşan ve LINQ ile sorgu gönderebileceğim bir yapı döndürülecek. From dedikten sonra tamamen "kafadan sallama" bir tablo adı tanımlıyorum. Bunu SQL sorgularındaki tablolar gibi düşünebilirsiniz. Geçici bir süre için sadece sorgumda kullanılmak üzere bir tablo adı yaratıyorum. Bu tablonun bir önceki satırda yarattığım datalarim veri katmanından Mesajlar tablosundan veri alacağını belirtmek için In deyimini kullanıyorum. Bundan sonrası aslında artık SQL sorguların çok benziyor. Where deyimini kullanarak "kafadan sallama" olarak yarattığım tablonun MesajText kolonunda "DARON" metni geçenlerin geri döndürülmesini sağlamak üzere LINQ sorgumu düzenliyorum.

Bu sorgudan geri dönen SeciliMesajlar değişkenini direk DataSource olarak kullanabilirsiniz. Eğer sayfanıza bir GridView eklerseniz aşağıdaki gibi DataBind yapma şansınız olacaktır.

      GridView1.DataSource = SeciliMesajlar

      GridView1.DataBind()

Gördüğünüz gibi veritabanına erişim bu kadar kolaylaşmış durumda. Aslında eski günlere döndüğümüzde LINQ2SQL'in yaptığı işi yapan harici araçlar kullanarak veritabanlarına göre otomatik şablonlar hazırlayarak şablonlar üzerinden veri katmanı kodları yaratıyorduk. Tabi hiçbiri LINQ'nun getirdiği esnekliğe sahip olmuyordu ama konsept olarak aynı amaca hitap ettiklerini söyleyebiliriz.

Peki arkaplanda neler oluyor?

İş bu kadar kolaylaşmışken hemen akla "Performans???" sorusu geliyor :) Acaba bu sorgular direk SQL'de mi çalışıyor yoksa GridView'ın Paging özelliği gibi :) ASP.NET tüm veriyi SQL'den IIS'e alıp orada mı sorguluyor? Bu soruya cevap bulmak için SQL Management Studio'yu açarak Activity Monitor üzerinden sunucuya gönderilen sorgulardan birini yakaladım.

(@p0 nvarchar(7))

SELECT [t0].[MesajID], [t0].[MesajText], [t0].[MesajDate],

[t0].[LoginID], [t0].[KonuID], [t0].[IsHTML]

FROM [dbo].[Mesajlar] AS [t0]

WHERE [t0].[MesajText] LIKE @p0

Yazdığımız LINQ kodu yukarıdaki SQL koduna çevrilerek SQL sunucusuna gönderilmiş. Gerçekten muhteşem :) Gerekli parametre tanımlanmış doğru sorgu oluşturulmuş ve birleştirilmiş. Bunun üstüne söyleyecek söz yok.

Sanırım artık SQL tarafında sorguları hazırlayıp projelerimi kopyala-yapıştır yapmaktan kurtulacağız :) Tabi daha LINQ ile ilgili anlatacak çok şey var. İleriki yazılarda daha derinlere dalmak ümidiyle.

Hepinize kolay gelsin.

Friday, December 07, 2007 1:05:08 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   LINQ | SQL Server 2005 | Visual Basic 2008  | 
 Monday, November 05, 2007

.NET Framework sürümleri arasında farklar zaten hali hazırda karıştırılırken bir de üzerinde .NET Framework 3.5 gelecekken aşağıdaki görseli birazdan bahsedeceğim bir Microsoft posterinde yakaladım. Bence herşeyi açıklıyor.

.NET Framework sürümleriyle gelen yeni özellikler.
.NET Framework sürümleriyle gelen yeni özellikler.

.NET Framework 3.0 ile beraber zaten tanıdığımız 2.0 sürümüne WPF, WCF, WF ve CardSpace eklendi. Önümüzde bizi bekleyen 3.5 sürümü de tüm bunların üzerinde LINQ, AJAX ve REST ile beraber geliyor. Bu konularda zaten daha önce makaleler yazmıştım.

Son olarak yukarıdaki görseli bulduğum Microsoft posterini de sizlerle paylaşmak istiyorum. Aşağıdaki adresten indirebileceğiniz posterde .NET Framework 3.5 ile beraber sıkça kullanılması olası NameSpace'lerin bir listesi ve hangi NameSpace'in hangi platformda desteklendiğine dair bilgiler bulunuyor. Eğer olanağınız varsa bir dijital baskı merkezinden 50*70cm bastırarak duvarınızı süsleyebilirsiniz :)

http://download.microsoft.com/download/4/a/3/4a3c7c55-84ab-4588-84a4-f96424a7d82d/NET35_Namespaces_Poster_LORES.pdf

Monday, November 05, 2007 12:10:33 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]   AJAX | LINQ | Visual Studio 2008 | .NET Framework 3.5  | 
 Friday, October 19, 2007

Son zamanlarda özellikle Silverlight, WPF ve Expression Studio ürün ailesi ile ilgili sizleri blogum ve webinerler aracılığı ile bilgi bombardımanına tuttuğumun farkındayım :) Ama aslında her şey bu kadarla bitmiyor. Visual Studio 2008, Windows Server 2008, SQL 2008, ASP.NET 3.5 gibi daha bir sürü yeni ürün ve teknolojiye her gün biraz daha yaklaşıyoruz. Ben bu yazımda özellikle LINQ'dan bahsetmek istiyorum. Bunun nedeni bence Visual Studio 2008 ile beraber gelen en önemli ve bize bir o kadar da yabancı olacak konulardan biri olması.

LINQ (Language Integrated Query)

Query dediğimizde aklımıza hemen SQL gelir, yani veritabanı sistemleri. Kullandığımız hangi veritabanı sistemi olursa olsun bir sorgu (quary) hazırlar ve veritabanı sunucusuna göndeririz. Geriye dönen veriye göre programımız gerekli işlemleri yapmaya devam eder. LINQ dediğimiz sistem ise herhangi bir veritabanı teknolojisi ile bire bir bağlantılı değil. Daha açık dile getirmek gerekirse, LINQ SQL2008 ile veya başka bir veritabanı sistemi ile beraber geliyor olmayacak. LINQ tamamen Visual Basic veya C# kodlarımızda kullanacağımız "sorguları" tanımlıyor. Ve günün sorusu geliyor; "Veritabanını sorgulamayacaksak VB veya C# içinde neyi sorgulayacağız?" Biraz düşünelim, bizim elimizde program kodlarını yazarken hangi veriler oluyor? Tabi ki .NET objeleri. Sizi daha çok meraka ve sıkıntıya sokmadan hemen bir örnek görelim.

    Dim Sayilar() As Integer = {5, 7, 1, 4, 9, 3, 2, 6, 8}


Yukarıdaki gibi bir dizimizin olduğunu varsayalım. Bu dizi içerisindeki değerlerden sadece 5'ten ufak olanları küçükten büyüğe sıralayarak almak için nasıl bir kod yazardınız? Aşağıdaki gibi bir kod yazamayacağımız kesin.

    Dim Bulunanlar = From n In Sayilar Select n Where n <= 5 Order By n

    For Each n As Integer In Bulunanlar

        Response.Write(n)

    Next


Muhteşem değil mi? LINQ ile ilk olarak sanırım bir yıl kadar önce karşılaştım ve ilk tepkim "Bu işin cılkı çıktı" şeklindeydi :) Haklı olarak bir an için yukarıdaki gibi SQL yazımına yakın bir kodu VB ile yazabiliyor olmanın artık işimizi gereğinden fazla kolaylaştırdığını düşündüm. Tabiri caiz ise artık .NET tarafında da verilerle oynamak çocuk oyuncağı haline geliyor.

Aşağıdaki örnekte veritabanından veri çekmek yerine VB kodu ile bir DataTable oluşturarak içerisinde üç satır bilgi yerleştirdim. Bakın DataTable üzerine sorgu göndermek ne kadar kolay.

    Dim tablom As New Data.DataTable

    tablom.Columns.Add(New Data.DataColumn("Kolon1"))

    Dim satir As Data.DataRow = tablom.NewRow

    satir.Item(0) = "Deneme"

    tablom.Rows.Add(satir)

    satir = tablom.NewRow

    satir.Item(0) = "Denek"

    tablom.Rows.Add(satir)

    satir = tablom.NewRow

    satir.Item(0) = "Daron"

    tablom.Rows.Add(satir)

 

    Dim Bulunanlar = From n In tablom.Rows Where n.item(0) Like "*D*" Order By n.item(0)

    For Each n As Data.DataRow In Bulunanlar

        Response.Write(n.Item(0))

    Next


Muhteşem. Ama bu kadarla kalmıyor gelişmeler. LINQ'nin birçok uygulanma şekli var. LINQ2XML, LINQ2SQL, LINQ2Entity vs... Maalesef bunların hepsinden bahsetmeyeceğim. Yukarıda incelediğimiz kısım LINQ2Entity veya LINQ2Objects olarak adlandırılabilir. Şimdi bir de LINQ2XML ile ilgili ufak bir örnek yapalım.

        Dim Adam As XElement = _

            <Adam>

                <Adi>Daron</Adi>

                <Soyadi>Yöndem</Soyadi>

            </Adam>

 

        Response.Write(Adam.<Adi>.Value)


Hayatımızın çok kolaylaşacağı ortada. Yukarda gördüğümüz kodlar bize en uzak seçenekte 6 ay mesafede. Peki şimdiden LINQ ile denemeler yapmak için nelere ihtiyacınız var? Özet olarak Visual Studio 2008 diyebilirim. Visual Studio 2008'e ait Beta2 sürümünü Microsoft web sitesinden indirebilirsiniz. Hatta direk sanal makine imajları da mevcut, bilgisayarınıza kurmadan direk sanal makineyi Virtual PC ile çalıştırarak var olan sisteminizi etkilemeden denemeler yapabilirsiniz. Tüm bu yazılımları ücretsiz indirmek için aşağıdaki linkleri kullanabilirsiniz.

Visual Studio 2008 Beta 2 Download

Virtual PC 2007 Download

Beta 2 aşamasında olan bir ürünün parçası olarak şu an LINQ'yu üretim amacıyla kullanmak pek mümkün değil. O nedenle önümüzdeki dönemde LINQ ile ilgili detaylı yazılar yazmayacağım. Yazılarımı takip edenler bilirler, her yeni çıkan teknoloji veya ürün bende küçük bir çocuğa verilen oyuncaktan farksız etki yaratır.Yazımın başında da bahsettiğim gibi zaten hali hazırda yeni "programcı oyuncakları" olarak elimizde yepyeni Silverlight, Expression Studio duruyor. LINQ biraz bekleyebilir :) 

Bu yazımda amacım sizlere geleceğe yönelik ufak bir öngörü aktarmaktı. Hepinize kolay gelsin.

Friday, October 19, 2007 9:23:31 PM (GTB Standard Time, UTC+02:00)  #    Comments [3]   LINQ | Visual Studio 2008  | 
Copyright © 2010 Daron Yöndem. Tüm hakları saklıdır.