Bir ASP.NET Sayfasının HTML Çıktısını Değiştirmek

Bir web sayfasının HTML çıktısını bazı özel durumlarda programatik olarak elde etmek veya değiştirmek isteyebiliriz. ASP.NET'in sayfa yapısı ve HTML oluşturma şekili ilk bakışta biraz karmaşık görünse de, gelişmiş özellikleri sayesinde bir web sayfasına ait HTML çıktıyı programatik olarak ele almamıza ve değiştirmemize olanak sağlamaktadır. Peki neden HTML çıktıyı değiştirmek isteyelim? Birkaç mantıklı nedeni şöyle sıralayabilirim:

- ASP.NET'in oluşturduğu bazı HTML kodlarına tasarım aşamasında veya sunucu taraflı kodlama ile fazla müdahale edemeyiz. Ancak bazı durumlarda belirli HTML elementlerinin veya bir sunucu kontrolünün oluşturduğu HTML kodunu elde etmek, değiştirmek isteyebiliriz. Örneğin ViewState nesnesinin sayfadaki yerini değiştirmek bu durum için güzel bir örnektir.
- Bir uygulamada fazla sayıda sayfa varsa, sayfaların tamamında belirli değişiklikler yapmak isteyebiliriz. Örneğin HTML standartlarına uymayan bir yazım şeklini farkedip, sonradan tüm sayfalardaki bu hatalı yazımı kolayca düzeltmek...
- Belirli ifadelerin geçtiği sayfalarda değişiklik yapmak istenebilir. Örneğin Ana Sayfa kelimelerinin geçtiği sayfalarda bu ifadeyi Anasayfa olarak değiştirmek...

Bu tip durumlarda tek tek dosyaları güncellemek yerine daha hızlı ve dinamik bir çözüm yolu aranabilir. HTML çıktıyı değiştirmenin yanında, çıktıyı belirli bir kaynağa(fiziksel olarak bir konuma veya veritabanına) kaydetmek de istenilebilir. Özellikle raporlama amaçlı oluşturulan sayfalarda, belirli zaman aralıklarıyla HTML çıktılarını kaydetmek ve ilerleyen tarihlerde incelemek gibi taleplerle karşılaşılabilir. Aslında bu tip ihtiyaçlar duruma göre, geliştirilen projeye göre çok farklı şekillerde günlük hayatımızda karşımıza çıkabiliyor.

ASP.NET uygulamalarında, bir sayfanın HTML çıktısına Response.Filter özelliği ile erişebiliriz. Bu özellik System.IO.Stream tipinden bir değer döndürmektedir. Her ne kadar Response.Filter gibi yazımı çok kolay olan bir yolla HTML çıktıya erişiyor gibi görünse de, bu çıktıya erişmek, hatta çıktıyı değiştirmek için biraz daha zahmetli bir yol izlememiz gerekecektir. Stream nesnesi ile dosya okuma tecrübesi olanlar ne demek istediğimi daha iyi anlayacaktır. Örneğimize başlamadan önce basit bir sayfa tasarlayıp oluşturacağı HTML çıktıyı inceleyelim. Aşağıda örnek sayfamızın kodları yer almaktadır.

Default.aspx
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        Mail adresim:<br>
        testmaili@nedirtv.com
    </div>
    </form>
</body>
</html>

Sayfa üzerinde dinamik olarak bir işlem yapmadığımız için <div> elementinin iç kısmı oluşacak HTML çıktıda aynen yer alacaktır. Sayfadaki amacımız <br> şeklinde yazılmış elementleri <br /> şekline getirmek ve içerisinde testmaili@nedirtv.com gibi @ işareti ile yazılmış mail adreslerini sayfamızı indeksleyen örümcek yazılımlardan koruma için testmaili (at) nedirtv.com şekline getirmek olacak.

Çıktıyı değiştirmeden önce çıktıyı nasıl elde edip, string bir değişkene atabileceğimize bakalım. Response.Filter özelliği Stream tipinden bir nesne taşımaktadır. Bu nesnenin içeriğini elde edebilmek için özel bir Stream nesnesi yazmak ve Response.Filter'ın içeriğini bu nesne üzerinden istemciye gitmesini sağlamamız gerekir. Dolayısıyla ilk olarak Filter özelliğine atayabileceğimiz tipten, yani Stream sınıfından kalıtılmış bir sınıf yazacağız. Aşağıda HtmlFilterStream adındaki özel sınıfımıza ait kodlar yer almaktadır. Kodlar kalabalık görünse de, makalenin ilerleyen kısımlarında sadece Flush ve Write metotlarının içeriklerinde değişiklikler yapacağız.

App_Code/HtmlFilterStream.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
public class HtmlFilterStream : Stream
{
    Stream _baseStream;
    long _position;
    string _html = "";
    public HtmlFilterStream(Stream stream)
    {
        _baseStream = stream;
    }
    public override bool CanRead { get { return true; } }
    public override bool CanSeek { get { return true; } }
    public override bool CanWrite { get { return true; } } 
    public override long Length { get { return 0; } }
    public override long Position
    {
        get { return _position; }
        set { _position = value; }
    }
    public override void Write(byte[] buffer, int offset, int count)
    {
        _baseStream.Write(buffer, 0, buffer.Length);
    }
    public override int Read(byte[] buffer, int offset, int count)
    {
        return _baseStream.Read(buffer, offset, count);
    }
    public override long Seek(long offset, SeekOrigin origin)
    {
        return _baseStream.Seek(offset, origin);
    }
    public override void SetLength(long value)
    {
        _baseStream.SetLength(value);
    }
    public override void Flush()
    {
        _baseStream.Flush();
    }
}

Sınıfımızı Stream sınıfından kalıttığımız için Flush, Length, Read, Write gibi abstract üyeleri ezmemiz(override) gerekiyor. Üyelerin içlerini yukarıdaki kodlarda görüldüğü şekilde dolduruyoruz. Response.Filter özelliğinden alacağımız nesnenin kendine ait üyeleri çağırabilmek içinse _baseStream adından bir field tanımlıyor ve sınıfın yapıcı metodunda(constructor) bu nesneyi parametre olarak alıyoruz. Bir de _html adında bir field tanımlamamız var, bu field az sonra okuma işlemlerinde kullanmamız için gerekli olacak.

Gelelim HTML çıktıyı yakalama işlemine. İlk olarak sadece çıktıyı okumaya çalışacağız. ASP.NET sayfalarının çıktıları oluşurken sayfa parçalar halinde render edilmekte ve Write metodu çalışma zamanı içerisinde birden fazla defa tetiklenebilmektedir. Her tetiklenmede HTML çıktının belirli bir parçası elde edildiği için bu metotta HTML kodlarının parçalarını birleştirmemiz gerekecek. Flush metodu ise açılan stream'e ait bilgilerin bellekten kaldırılmasından hemen önce tetikleneceği için bu metotta elde edilen HTML kodlarını tamamına erişebileceğiz. Write ve Flush metotlarında yapacağımız değişiklikler aşağıda görülmektedir.

public class HtmlFilterStream:Stream
{
    ...
    public override void Write(byte[] buffer, int offset, int count)
    {
        _html += Encoding.Default.GetString(buffer, offset, count);
        _baseStream.Write(buffer, 0, buffer.Length);
    }
    ... 
    public override void Flush()
    {
        string output = _html;
        _baseStream.Flush();
    }
}

Write metodunda üretilen HTML çıktıları birleştirdik ve son olarak Flush metodunda tüm çıktıyı okuduk. Eğer çıktıyı belirli bir kaynağa kaydetmek istersek Flush metodu içerisinde _html değişkeninin içeriğini kullanabiliriz. Çıktıyı yakalamak için gerekli kodları hazırladık, ancak halâ ASP.NET sayfamızın HTML çıktısını bu nesne üzerinden stream edilmesini sağlamış değiliz. Bu işlemi gerçekleştirmek için de Default.aspx dosyasının Page_Load metoduna aşağıdaki satırı eklememiz yeterli.

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Filter = new HtmlFilterStream(Response.Filter);
    }
}

Response.Filter'a ait nesne referansının yeni bir Stream nesnesi(HtmlFilterStream) olacağını belirledik. Hatırlayacağınız gibi kendi yazdığımız HtmlFilterStream nesnesini yapıcı metodunda  parametre olarak bir Stream nesnesi istiyorduk. new HtmlFilterStream(Response.Filter) ifadesiyle sayfanın HTML çıktısına ait ana stream'i yeni üretilen nesneye göndermiş olduk.

HtmlFilterStream.cs dosyasında Flush metodunun içerisindeki bir satıra breakpoint ekleyip sayfayı çalıştıracak olursak _html değişkeninde üretilen sayfanın HTML kodlarını görebiliriz.


Resim: Debug modda _html değişkeni içerisindeki HTML kodları

Write metodu HTML çıktının stream'e aktarıldığı yerdir. Dolayısıyla HTML çıktıyı değiştirmek için Write metodunda değişiklikler yapmamız gerekiyor. HTML çıktının Response'a yazıldığı kısım ise şu anki Write metodunun en alt satırında yer alan _baseStream.Write metodu aracılığıyla yapılmaktadır. Bu metodun aldığı buffer parametresi çıktıyı içerisinde saklayan byte dizisidir. O halde çıktıyı değiştirmek için öncelikle _html değişkeninde değişiklikler yapmak, sonra da bu değişiklikleri buffer dizisine aktarmak gerekecek. Aşağıda Write metodunun yeni hali görülmektedir.

...
using System.Text;
using System.Text.RegularExpressions;
public class HtmlFilterStream:Stream
{
    ...
    public override void Write(byte[] buffer, int offset, int count)
    {
        _html += Encoding.Default.GetString(buffer, offset, count);
        // <br> şeklinde yazılmış elementleri <br/> biçimine dönüştürüyoruz
        _html = _html.Replace("<br>""<br/>");
        
        // E-posta adreslerini değiştirmek için gerekli metin formatını belirliyoruz
        string emailPattern = @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
        Regex objRegex = new Regex(emailPattern);
        MatchCollection objCol = objRegex.Matches(_html); // Formata uyan metinleri buluyoruz
        foreach (Match item in objCol)
        {
            //İfade içerisindeki @ karakterlerini (at) haline dönüştürüyoruz
            string newValue = item.Value.Replace("@"" (at) ");
            _html = _html.Replace(item.Value, newValue);
        }
        buffer = Encoding.Default.GetBytes(_html); // Güncel _html içeriğini byte dizisine çeviriyoruz
        _baseStream.Write(buffer, 0, buffer.Length); // Stream'i yeni içeriğiyle yazdırıyoruz
    }
}

Hatırlanacağı gibi dosyadaki amacımız <br> elementlerini <br/> şekline dönüştürmek ve e-posta adreslerinin içerisindeki @ karakterini (at) şeklinde yazdırmaktı. Bu doğrultuda iki değişiklik için gerekli düzenlemeleri yaptık. Son olarak Encoding.Default.GetBytes metodunu kulllanarak _html string değişkenindeki bilgileri buffer dizisine aktardık ve çıktıyı stream'e bastık. Sayfamızı çalıştırdığımızda değişikliklerin yapıldığını görebileceğiz.


Resim: Sağ kısımda HTML çıktının değiştiği görülmektedir

Yaptığımız HTML çıktıyı değiştirme işlemi sadece Default.aspx sayfası ile ilgiliydi. Default.aspx sayfasının Page_Load metodunda Response.Filter özelliğini yeni bir stream nesnesi üzerinden ele aldığımız için sadece bu sayfa değişiklikten etkilenecektir. Bu değişikliğin uygulamadaki tüm sayfalar için yapılmasını istiyorsak özel bir HttpModule nesnesi yazmamız veya Global.asax dosyası içerisinden ilgili Application olay metodunda(BeginRequest veya PostReleaseRequestState gibi) gerekli gerekli düzenlemeleri yapmamız gerekiyor. Aşağıda Global.asax dosyasına ekleyeceğimiz kodlar yer almaktadır.

<%@ Application Language="C#" %>
<script runat="server">
    ...
    void Application_PostReleaseRequestState(object sender, EventArgs e)
    {
        if(Response.ContentType == "text/html")
            Response.Filter = new HtmlFilterStream(Response.Filter);
    }
</script>

Bu güncellemeyi yaptıktan sonra projemize farklı .aspx dosyaları ekleyip HTML çıktının düzenlendiğini gözlemleyebiliriz. İlgili olay metodunda uzantıya yönelik değil, çıktının tipine göre(text/html kontrolü) işlem yapıldığı için .ashx gibi dosyalarında çıktıları ele alınacaktır.

Not: Yazıyı hazırlarken http://www.4guysfromrolla.com/articles/120308-1.aspx adresindeki bilgilerden faydalandım.

26 Temmuz 2010 Pazartesi 17:07

Yorum - RSSYorumlar (0)

Etiket: ,
Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

nedirtv?com Yeni Sürümüyle Karşınızda!

nedirtv v3

2006 yılından beri yayın hayatına devam eden nedirtv?com’un tasarımını ve bazı işlevlerini geliştirerek yeni haliyle geçtiğimiz günlerde yayına aldık. Henüz beta aşamasında olduğu için bazı aksaklıklar ve hatalar bulunabilir.

Bu sürümde etiketlerin daha ön planda, kategorilerin ise biraz arka planda kaldığı dikkatinizi çekecektir. Ayrıca izleyicilerin beğendiği ve daha fazla izlediği videoları anasayfada listeleyerek popüler videolara ulaşılmasını biraz daha kolaylaştırdık.

nedirtv’nin yeni özelliği olan beğenme seçeneği bizler için önemli. İzleyicilerimizden beğendikleri videoların alt kısmında yer alan Beğen linkine tıklayarak geri bildirimde bulunmalarını ve içeriklerimizi değerlendirmelerini bekliyoruz. Bir diğer yeni özellikde Yaklaşan Webinerler bölümü. Şu an yaklaşan bir webiner bulunmadığı için sitede görünmese de, Eylül ayında başlayacağımız webinerleri sitenin sol kısmında tarihi yaklaştıkça görebileceksiniz.

Aslında bu yazıyı yazmamdaki en önemli sebep sitenin yeni haline kavuşmasını sağlayan arkadaşlarımıza teşekkürlerimizi sunmak. Alper Özçetin ve Alp Çoker’e buradan sonsuz teşekkürlerimizi iletiyoruz. Okul, dersler, özel işler derken değerli zamanlarını ayırıp, bizden gelen geri bildirimlere göre siteyi şekillendirdiler ve bu haliyle bizlere sundular. Emeğinize sağlık.

23 Temmuz 2010 Cuma 11:07

Yorum - RSSYorumlar (0)

Etiket:
Kategori: Duyuru-Haber

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Türkiye'nin Açık Kaynak Topluluğu Birliktegeliştir Yeni Versiyonu İle Yayında

birliktegelistir logo Açık kaynak kodlu proje geliştirme yaklaşımının giderek yaygınlaştığı günümüz yazılım dünyasında Microsoft platform ve araçları kullanılarak birçok açık kaynak kodlu uygulama geliştirilmekte ve Microsoft’un kendisi de bu konuda çalışmalar yapmaktadır.

Açık kaynak kodlu bir içerik yönetim sistemi olan Umbraco üzerine kurulan Birliktegeliştir, Türkiye’de de Microsoft platformlarında açık kaynaklı projeler geliştirilmesi ve mevcut açık kaynak kodlu projelerin kullanımının yaygınlaştırılmasını amaçlamaktadır. Zaman içinde yaygınlaşan açık kaynak kod topluluğuna daha iyi içerik sağlamak amacıyla Birliktegeliştir yeni arayüzü ve yeni özellikleriyle yayında.

Sizlerin de kendi projelerinizi ve kendi içeriğinizi rahatlıkla paylaşabileceğiniz Birliktegeliştir’de ayrıca Türkiye'de geliştirilmiş açık kaynak kodlu projelere, bugüne kadar dünyada yapılmış açık kaynak kodlu uygulamaların kullanımı ile ilgili makale, video gibi Türkçe kaynaklara ulaşabilirsiniz.

Bunun yanısıra uygulama geliştiricilerin kodlama sırasında çoğunlukla kullandığı kod bloklarına Kod Parçaları kısmından ulaşabilirsiniz.

Birliktegeliştir topluluğuna www.birliktegelistir.com adresinden ulaşabilirsiniz.

E-Mail: birliktegelistir@birliktegelistir.com

Twitter: www.twitter.com/bgelistir

17 Haziran 2010 Perşembe 09:03

Yorum - RSSYorumlar (0)

Kategori: Duyuru-Haber

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

C# 4.0 Dynamic Type - Reflection Hız Testi

C# 4.0 ile gelen Dynamic type’ların ilk bakışta sadece .NET ortamı dışında yazılmış bir tipi, .NET ortamında kullanmak amacıyla getirildiğini düşünebilirsiniz. Ancak Dynamic tipleri, halihazırda Reflection tiplerini kullanarak kod geliştirdiğimiz durumlarda Reflection tipleri yerine kullandığımızda ciddi performans kazançları elde edebiliyoruz. Dolayısıyla C# 4.0 ile geliştirilen uygulamalarda reflection tipleri yerine dynamic tipleri kullanmak oldukça mantıklı hale geliyor.

Aşağıdaki örnekte IMedia arayüzünü(interface) uygulayan Music ve Video adında iki sınıfımız(class) var. Hazırladığım basit bir konsol uygulamasında birer tane Music ve Video nesnesi oluşturarak bu nesnelerin Play işlemlerini gerçekleştirecek generic PlayMedia<T> metodunu çağırıyorum. Senaryo icabı reflection veya dynamic type kullanmayı zorunlu kılmak için, PlayMedia metoduna Play metodu içeren herhangi bir nesnenin gelebileceği şekilde tasarladım. PlayMedia metodunun 20 ve 21 numaralı satırlarında dynamic tip kullanılarak metoda gönderilen ve tipi derleme zamanında belirli olmayan media nesnesinin Play metodu çağrılmış. Eğer Reflection tiplerinin kullanılmasını test etmek isterseniz 20 ve 21 numaralı satırları yorum satırı haline getirip, 19 numaralı satırın yorumlarını kaldırabilirsiniz. İlk olarak sadece 19 numaralı satırı çalıştırarak test sonuçlarını alıyorum. Sonrasında 20 ve 21 numaralı satırları çalıştırarak test sonuçlarını aldığımda aradaki fark gerçekten oldukça cezbedici :)

Reflection bir tipin yapısını çözümleyerek içerisindeki metot, field gibi üyelere erişmeye çalışmaktadır. Ancak dynamic tip içerdiği tipi çözümlemeden, doğrudan istenilen üyeye erişeceği için sonuca daha hızlı ulaşabilecektir. Zaten aşağıdaki gibi bir test çalışması yapacak olursanız sonucun bu doğrultuda çıkacağını göreceksiniz.

Örnekte kullandığımız tiplerin sınıf diyagramı aşağıdaki gibidir.

    1 class Program

    2 {

    3     static void Main(string[] args)

    4     {

    5         Music m = new Music { FileName = "amazing.mp3" };

    6         Video v = new Video { FileName = "avatar_fragman.wmv" };

    7 

    8         PlayMedia<Music>(m);

    9         PlayMedia<Video>(v);

   10         Console.ReadLine();

   11     }

   12 

   13     static void PlayMedia<T>(T media)

   14     {

   15         DateTime d1, d2;

   16         d1 = DateTime.Now;

   17         for (int i = 0; i < 1000000; i++)

   18         {

   19             //media.GetType().GetMethod("Play").Invoke(media, null);

   20             dynamic d = media;

   21             d.Play();

   22         }

   23 

   24         d2 = DateTime.Now;

   25         TimeSpan t = d2 - d1;

   26 

   27         Console.WriteLine(t.TotalSeconds);

   28     }

   29 }

Test sonuçlarından da görüleceği gibi, reflection kullanılarak 1.000.000 kayıt üzerinde yapılan işlem ortalama 1.85 saniye sürerken, dynamic tip kullandığımda ortalama 0.17 saniye gibi bir süre alıyor. Yani dynamic tip kullanıldığında 10 kat hız sağlanmış görünüyor. Tabi ki farklı senaryolarda daha farklı sonuçlar elde edilebilir, ama dynamic tipin reflectiona göre açık şekilde daha hızlı çalıştığını söybu tarz işlemlerde performans adına daha iyi bir seçim olacağı ortada.

12 Mayıs 2010 Çarşamba 21:32

Yorum - RSSYorumlar (3)

Kategori: .NET Framework | C#

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Microsoft Yazılım Geliştiriciler Teknoloji Günleri'ndeki Sunumum

Bu aralar gerek iş yoğunluğu, gerekse sık sık şehir dışına çıkmam nedeniyle bloguma pek yazı yazamaz oldum, farkındayım. Bu bir süre daha böyle devam edecek diye tahmin ediyorum. Tabi her ne kadar bloguma teknik içerikli yazı yazamasam da, seminerlerin ardı arkası gelmiyor. Son olarak geçtiğimiz Pazartesi günü Microsoft tarafından gerçekleştirilen Microsoft Yazılım Geliştiriciler Teknoloji Günleri etkinliğinin İstanbul ayağında konuşmacı olarak yer aldım. "ASP.NET AJAX ile Zengin Internet Uygulamaları Geliştirme" isimli oturumda katılımcılarla birlikte keyifli bir saat geçirdik. ASP.NET AJAX 4 ile gelen yenilikler ve bunlarla ilgili demoların gerçekleştiği sunum sonrasında, katılımcıların yenilikler konusunda oldukça olumlu geri bildirimler aldım. Sanırım web programcıları JavaScript ile çalışmayı artık benimsemiş durumda :)

Bu güzel etkinlik için başta Buket Şerefli olmak üzere emeği geçen tüm Microsoft Türkiye çalışanlarına teşekkürlerimi sunuyorum.

Sunumumdan bir kare...

8 Mayıs 2010 Cumartesi 19:35

Yorum - RSSYorumlar (0)

Kategori: Kişisel

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Visual Studio 2010 RTM Oldu

Aylardır yolunu gözlediğimiz yeni IDE'miz Visual Studio 2010 dün nihayetinde RTM sürümüne kavuştu ve resmi olarak duyuruldu. Beta 1 sürümünden beri beğeniyle kullandığım Visual Studio'nun bu yeni versiyonuyla ilgili detaylı bilgilere www.microsoft.com/turkiye/net adresinden ulaşabilirsiniz. İş yoğunluğum nedeniyle henüz VS 2010'u bilgisayarıma henüz kuramadım ama yarın akşam ajandamda yarım saatlik bir yer açtım kurulum için:) Kurulum sonrasında fikir ve izlenimlerimi friendfeed'den paylaşmayı düşünüyorum.

13 Nisan 2010 Salı 20:53

Yorum - RSSYorumlar (4)


facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Yazgeliştir Webinerleri Başlıyor!

C# bölüm editörü olduğum ve uzun zamandır yazarlık yaptığım Yazgeliştir sitesi, Nisan ve Mayıs ayları içerisinde gerçekleşecek 4 farklı webinerle yazılım geliştiricilerle buluşuyor. Webinerlerde Microsoft CRM Dynamics and Extendibility, WCF Ria Services, Windows Mobile 6.5 ile Web Widgets Geliştirmek, Windows Embedded CE 6.0 R3 - Silverlight Uygulaması Geliştirmek konular ele alınacak. Çarşamba akşamları iki haftada bir düzenlenecek şekilde planlanan webinerlerin bilgilerine www.yazgelistir.com adresinden ulaşabilir, ayrıca etkinliği Facebook ajandanıza buradan kaydedebilirsiniz. 

 

13 Nisan 2010 Salı 20:44

Yorum - RSSYorumlar (0)

Etiket: ,
Kategori: Duyuru-Haber

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

nedirtv?com - 4. Yıl Etkinliği Ardından

Geçtiğimiz Cumartesi günü Microsoft Türkiye İstanbul ofisinde gün boyu süren seminerlerle nedirtv'nin 4. yılını kutladık. 5 farklı oturumda değerli arkadaşlarım Selçuk Yavuz, Burak Selim Şenyurt ve Daron Yöndem ile birlikte katılımcılarla yeni teknolojileri paylaştık, onlardan gelen soruları cevapladık. Bu güzel günü bizler ve nedirtv için farklı kılan tüm katılımcılara ve konuşmacı arkadaşlarıma sonsuz teşekkürlerimi buradan da sunuyorum. Darısı 5. ve sonrasındaki senelere de :)

Bu arada ASP.NET MVC hariç seminerdeki sunumların tamamına yakında www.nedirtv.com adresi üzerinden erişebilirsiniz. Çok değil birkaç gün içinde :)

Ve günün sonunda çekilen hatıra fotoğrafı :)

13 Nisan 2010 Salı 20:32

Yorum - RSSYorumlar (0)

Etiket: ,
Kategori: Duyuru-Haber

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Bağlantılar



Takip Et

RSS Feed twitter friendfeed

Seminer/Webiner Programım

  • Seminer-WebinerASP.NET 4.0 WebForms Yenilikleri (Microsoft İstanbul Ofisi)
    29 Mayıs 2010

  • Seminer-WebinerVisual Studio 2010 Yenilikleri (Osmangazi Üniversitesi)
    15 Mayıs 2010

  • Seminer-WebinerASP.NET AJAX ile Zengin Internet Uygulamaları Geliştirme (Microsoft İstanbul Ofisi)
    3 Mayıs 2010

>> Etkinlik Takvimi