Bugün bilgisayarıma Windows XP'yi yeniden kurdum. Visual Studio 2008 ve SQL Server 2005'in kurulumları sorunsuz bitti, fakat Management Studio ve SQL Profiler gibi araçların kurulmadığını görünce bu sorunun neden kaynaklandığını ve nasıl çözebileceğimi internetten biraz araştırdım. Sorun ve çözümü şöyle:
Sorun: Visual Studio 2008'i SQL Server 2005'ten önce kurduğunuzda SQL Server sunucu olarak bilgisayarınıza kurulmuş olsa da, beraberinde gelen bileşenlerin kurulumu gerçekleşmiyor.
Çözüm-1: Önce SQL Server 2005'i, ardından Visual Studio 2008'i kurun.
Çözüm-2: Çözüm-1'deki sıranın tersinde kurulum yaptıysanız; SQL Server kurulum CD'sinden Tools klasörünün altındaki setup.exe'yi Command Prompt'tan aşağıdaki parametreleri kullanarak çalıştırın. Açılan kurulum penceresinden de Client Components ve Documentation, Samples and... seçeneğinden gerekli bileşenleri seçerek güncelleme kurulumunu tamamlayın.
Command Prompt'ta yazılacak komut: start /wait setup.exe SKUUPGRADE=1
Gerekli bileşenler artık bilgisayarınıza kurulacaktır.
Not: Gerçekleştirdiğim kurulum Windows XP Professional işletim sistemi üzerinde Visual Studio 2008 Team System Edition ve SQL Server 20005 Developer Edition sürümleri ile yapıldı.
20 Mayıs 2008
VS 2008 ile SQL Server 2005 Kurulumunda Problem ve Çözümü
18 Mayıs 2008
Makaleler E-Kitabım
Yapımına askerde başladığım ve ancak bitirebildiğim, içerisinde bugüne kadar çeşitli sitelerde yayınlanan makalelerimin bulunduğu e-kitabı bu linkten bilgisayarınıza yükleyebilirsiniz. Başta ASP.NET ve ASP.NET AJAX konularında yazdığım makalelerden ve yaklaşık 160 sayfadan oluşan bu doküman umarım sizler için faydalı olur.
E-kitabımı zaman içerisinde yeni makalelerimle güncellemeye çalışacağım. Bu başlıktaki linkten veya www.umutluoglu.com adresinden güncel versiyonunu takip edebilirsiniz.
16 Mayıs 2008
Askerlik Görevim Sona Erdi
Askerlik maceram bugün sona erdi. Bu sabah 1.5 saatlik uçak yolculuğunun ardından Elazığ'a hoşçakal dedim ve İstanbul'a 5 ay 5 gün sonra ayak bastım. İnsanın tekrar sivil hayata dönmesi, ailesine, sevdiklerine (ve dizüstü bilgisayarına) kavuşması kelimelerle anlatalımayacak kadar güzel bir duygu!
Elazığ'da Jandarma Komando Taburu'nda başlayan askerliğimin usta birliğini 8.Kolordu Komutanlığı Askeri Mahkemesi'nde tamamladım. Oldukça güzel dostluklar edindiğim bu beş aylık maceramda sivil hayatta belki de 1-2 yılda göremeyeceğim tecrübeler edindim. 26 yaşında asker olsam da, askerliğin insanın olgunlaşma sürecinde oldukça önemli bir yeri olduğunu görmüş oldum.
Blogumdan da takip ettiğiniz üzere aslında bilgisayardan ve .NET dünyasından askerlikte de pek kopmadım. Görev yaptığım Askeri Mahkeme'ye boş zamanlarımda oldukça önemli bir uygulama geliştirme şansını buldum. .NET Framework 2.0 üzerinde çalışan Esas Defteri adındaki masaüstü bir uygulama ile artık Kolordu'daki tüm dava dosyaları bilgisayar ortamında saklanabiliyor. Gelişmiş arama, raporlama arayüzleri ve devir işlemleri arayüzleri ile hazırladığım bu uygulama uzun yıllar mahkememize hizmet edecektir diye düşünüyorum. Kullandığım Pentium-2 işlemcili makina beni biraz kısıtlasa da, birkaç makale ve birkaç blog postu askerlik günlerimde bilgi paylaşımı adına klavyemden çıkarabildiklerim oldu.
İyisi ile kötüsü ile bitti gitti askerliğim. Beş ay kadar önce yazdığım veda yazısında da dediğim gibi "kaldığımız yerden devam ediyoruz..."
11 Mayıs 2008
RenderControl Metodu ile Kontrolün HTML Çıktısını Üretmek
ASP.NET uygulamalarında kullandığımız tüm kontroller HTML çıktılara dönüştürülmekte ve sayfanın HTML kodları içerisine yerleştirilmektedir. Basit olarak bir Label kontrolü sunucuda çalıştırıldığında <span> elementine dönüştürülürken, GridView gibi karmaşık bir kontrol ise tablo (<table> elementi) ve tablo içerisindeki elementlere dönüştürülür. Web uygulamalarında kullandığımız tüm sunucu kontrolleri WebControl sınıfından, WebControl ise Control sınıftan türetilmektedir. Control sınıfında yer alan RenderControl metodu (virtual metot olduğu için türetilen sınıflarda override edilir) sunucuda oluşturulan kontrolün HTML çıktısını string olarak elde edebilmemizi sağlar. Control sınıfında yer alan bu metot dolayısıyla tüm sunucu kontrollerinin de sahip olduğu bir üyedir ve programatik olarak oluşturulacak bir sunucu kontrolünün RenderControl metodu ile HTML çıktısına ulaşılabilir.
"Neden bir kontrolün HTML çıktısını alayım ki?" gibi bir soru akla gelebilir. Nerelerde karşımıza çıkabilir bir kontrolün HTML çıktısını programatik olarak elde etmek? Aklıma gelen bir kaç noktayı hemen şöyle listeleyim:
- Substution Caching (sayfanın tümünü önbellekten okuyup sadece belirli bir alanı dinamik oluşturmak) işlemlerinde sunucuda çalışacak metodun içerisinde bir kontrolü oluşturmak ve metodun geri dönüş değeri olarak kontrolü döndürmek,
- AJAX uygulamalarında WebMethod'lar ile asenkron güncellemeler yapılacağı zaman yine sunucudaki metodun içerisinde bir kontrol oluşturmak ve metottan kontrolün HTML çıktısını geri göndermek,
- Kullanıcılara toplu mail gönderimi yapılacağı zaman veritabanından çekilen kayıtların oluşturacağı grid türevi kontrolün kodlarını mailin HTML içeriğine eklemek,
- Raporlama sistemlerinde farklı kriterlere göre oluşturulan sonuçların HTML çıktısının veritabanına kaydedilmesi ve daha sonradan tekrar takip edilebilmesi...
Biraz daha düşünüldüğünde farklı senaryolar da akla gelebilir. Zaten bu tip varsayımlar ilk başta akla gelmeyen, fakat uygulamanın geliştirme safhalarında karşımıza çıkabilen durumlardır. Bu yazım belki karşınıza çıkan bu tip bir duruma ilaç olabilir:) Gelelim RenderControl metodunun nasıl kullanılacağına. Senaryoyu karmaşık hale getirmeden basit şekilde inceleyelim. Sayfamızda bir Label kontrolü olsun ve sunucuda oluşturacağımız GridView kontrolünün HTML çıktısını alıp Label'a yazdıralım. Aşağıda sayfamızın kodları yer almaktadır.
...
using System.Collections.Generic;
using System.IO;
public partial class RenderControlKullan : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Dictionary<string, string> liste = new Dictionary<string, string>();
liste.Add("Uğur Umutluoğlu", "http://umutluoglu.blogspot.com");
liste.Add("Burak Batur", "www.burakbatur.com");
liste.Add("Burak Selim Şenyurt", "www.bsenyurt.com");
liste.Add("nedirTV?com", "www.nedirtv.com");
liste.Add("Türk Aspx", "www.turkaspx.net");
GridView gvSiteler = new GridView();
gvSiteler.DataSource = liste;
gvSiteler.DataBind();
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
gvSiteler.RenderControl(htw);
lblGrid.Text = sw.ToString();
}
}
Sayfa çalıştırıldığında lblGrid.Text = sw.ToString(); satırına bir break-point atalım ve sw'nin içerisinde neler varmış bir bakalım.
GridView nesnesi üretildikten sonra RenderControl metodu ile işlem gerçekleşiyor. RenderControl geriye herhangi bir değer dönen bir metot değildir (void); parametre olarak aldığı HtmlTextWriter tipinden nesneye kontrolün çıktısını aktarır. HtmlTextWriter'da InnerWriter özelliğindeki HTML elementlerini TextWriter ve türevi nesnelerden birine aktarır. Burada StringWriter en uygun tip. Performans açısından StringWriter'ı da bir StringBuilder'a aktarmak iyi bir yol olabilir ama işi uzatmadan kısaca sonuca gidelim. sw adındaki StringWriter nesnesinin çıktısını stringe dönüştürerek lblGrid adındaki kontrole değeri yazdırıyoruz. Aşağıdaki sayfamızın çıktısı görülmektedir.
13 Nisan 2008
SQL Sorgusuna Tablo Adını Parametre Olarak Aktarmak
Web uygulamalarında en çok saldırı alabileceğimiz yerler veritabanı üzerinde çalıştırdığımız SQL sorgularımızdır. SQL Injection adı verilen teknik ile kötü niyetli kullanıcılar arka planda çalıştırdığımız SQL sorgularına ek SQL cümleleri ekleyebilmekte ve yeri geldiğinde "DROP DATABASE ..." gibi bir sorgu ile tüm veritabanını bile silebilmektedir! Gerek SQL Server ortamında hazırladığımız stored procedure'larda, gerekse uygulama tarafında kullandığımız ADO.NET nesnelerinde parametre (parameter) kullanarak bu tip tehditlerden veritabanımızı koruyabilmekteyiz. Parametreler SQL cümlelerinde sadece sütunlarda aranacak değerleri taşıyabilmekte, tablo veya sütun isimlerini ise taşıyamamaktadır. "Select * From Haberler Where HaberID=@id" gibi bir SQL cümlesinde HaberID sütununda aranacak değer parametre olarak aktarılabilir. Peki SQL cümlesine tablo adını parametre olarak aktarmak gibi bir durumda nasıl bir yolu izleyebiliriz? Yani "Select * From @TabloIsim" gibi bir SQL cümlesi yazabilsek ve parametre olarak Haberler bilgisini yolladığımızda sorgumuz Haberler tablosundaki, Duyurular bilgisini yolladığımızda da Duyurular tablosundaki tüm verileri getirse...
Tablo adını parametre olarak aktarma şansımız sadece stored procedure kullanma durumunda bulunmaktadır. Tabi ki sp içerisinde standart bir cümle yazmak yerine ufak bir hile ile bu işlemi gerçekleştirebileceğiz. Eğer sp içinde SQL cümlemizi bir değişkende saklayıp, alınan parametre değerini cümlemize eklersek tablo adını cümlemiz içerisine aktarabiliriz. Tabi ki cümle bir değişkende saklandığı için sp içerisinde bu cümleyi çalıştırmak ta gerekecektir. Aşağıda tablo adını parametre olarak alan basit bir stored procedure görülmektedir.
@tablo_isim nvarchar(30)
AS
BEGIN
DECLARE @sql_str nvarchar(50)
SET @sql_str = 'Select * From ' + @tablo_isim
EXEC(@sql_str)
END
08 Nisan 2008
Accordion Kontrolünde Veritabanı ile Çalışmak
Bir önceki yazımda Accordion kontrolünün CSS ile kullanımından bahsetmiştim. Accordion kontrolünün içeriğini statik içerikle HTML kodları ile oluşturabileceğimiz gibi dinamik verilerle de oluşturabiliriz. Bir XML dosyasından, veritabanından veya koleksiyon gibi nesnelerden alınan veriler bu kontrole kolaylıkla yüklenebilir. Bu yazımda Accordion kontrolünü veritabanından alınan verilerle nasıl besleyebileceğimize bakıyoruz.
Accordion kontrolünde dinamik veri ile çalışmak Repeater ve DataList gibi kontrolleriyle benzerlik göstermektedir. Eğer SqlDataSource, XmlDataSource gibi veri kaynakları ile çalışırsak sayfada bağlanacak veri kaynağını belirtmek yeterli olmayacak, HTML kısmından Eval veya Bind metotlarıyla veri yükleme işlemini de gerçekleştirmemiz gerekecektir. HTML koduna istediğimiz gibi müdahale edebildiğimiz için aslında olumlu bir durum olduğunu belirtmekte fayda var. Yine programatik yollarla DataTable, DataSet veya koleksiyon nesneleri ile Accordion kontrolünün çalışmasını sağlayabiliriz. Dilerseniz iki ayrı örnekte bu iki farklı yolu nasıl uygulayabileceğimizi görelim.
DataSource Kontrolleri ile Çalışmak
Veriyi en kolay şekilde bağlayacağımız bu yolda sayfamızdaki DataSource nesnesini Accordion kontrolünün DataSourceID özelliğinde belirlememiz gerekecektir. Accordion kontrolünün ise HeaderTemplate ve ContentTemplate kısımlarında yüklenecek verilerin başlık ve içerik bilgilerini Eval metodu ile bağlıyor olacağız. Access'te oluşturulmuş bir veritabanında saklanan haberlerin listeleneceği sayfada Accordion kontrolü ile çalışmak aşağıdaki kodlardan da görüleceği gibi oldukça kolay!
<ajaxToolkit:Accordion ID="accHaberler" runat="server" HeaderCssClass="baslik" HeaderSelectedCssClass="secilenBaslik" ContentCssClass="icerik" DataSourceID="dsHaberler" Width="460">
<HeaderTemplate>
<%#Eval("Baslik") %>
</HeaderTemplate>
<ContentTemplate>
<%#Eval("Icerik") %><br />
Eklendiği tarih: <%#Eval("Tarih") %>
</ContentTemplate>
</ajaxToolkit:Accordion>
<asp:AccessDataSource ID="dsHaberler" runat="server" DataFile="~/App_Data/Site.mdb" SelectCommand="SELECT [Baslik], [Icerik], [Tarih] FROM [Haberler] ORDER BY [Tarih] DESC"> </asp:AccessDataSource>
Template alanları içerisine açılmış ASP etiketleri ile veri yükleme işlemini gerçekleştiriyoruz. HTML kodlarını istediğimiz şekilde değiştirebilme kolaylığı belki de bu yolun en önemli avantajı.
DataTable vb. Nesneler ile Çalışmak
Bazı durumlarda ise Accordion kontrolüne DataTable gibi veri nesneleri ile veri yüklemek isteyebiliriz. Programatik yollarla yapacağımız bu işlemlerde HTML tarafında müdahale şansımız daha zor olsa da programın ve verilerin akışını istediğimiz gibi değiştirebilme şansına sahip olabiliyoruz. Bu yöntemde bir döngü içerisinde AccordionPane nesneleri oluşturarak AccordionPane'in HeaderContainer ve ContentContainer'larındaki Controls koleksiyonuna kontroller ekleyebiliriz. Sunucu tarafında performans açısından Label gibi bir kontrol yerine LiteralControl kullanmak iyi bir pratik olacaktır. Aşağıda böyle bir işlemi nasıl yapabileceğimiz görülmektedir. Sayfamızın HTML kısmına eklenmiş accHaberler adında bir Accordion kontrolünü daha önceden eklediğimizi hatırlatayım.
...
using System.Data.OleDb; // Access veritabanına bağlanmak için
using AjaxControlToolkit; // AccordionPane kontrolüne erişmek için
public partial class Haberler : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string yol = Server.MapPath("App_Data/Site.mdb");
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OleDB.4.0; Data Source=" + yol);
OleDbDataAdapter daHaberler = new OleDbDataAdapter("Select Baslik, Icerik, Tarih From Haberler Order By Tarih Desc", con);
DataTable dtHaberler = new DataTable();
daHaberler.Fill(dtHaberler);
foreach (DataRow dr in dtHaberler.Rows)
{
AccordionPane paneHaber = new AccordionPane();
paneHaber.HeaderContainer.Controls.Add(new LiteralControl(dr["Baslik"].ToString()));
paneHaber.ContentContainer.Controls.Add(new LiteralControl(dr["Icerik"].ToString()));
paneHaber.ContentContainer.Controls.Add(new LiteralControl("<br>"));
paneHaber.ContentContainer.Controls.Add(new LiteralControl("Ekleme tarihi: " + dr["Tarih"].ToString()));
accHaberler.Panes.Add(paneHaber); // Oluşan AccordionPane'i Accordion kontrolüne ekliyoruz.
}
}
}
Görüldüğü gibi bir foreach döngüsü içinde DataTable'ın her satırı bir AccordionPane kontrolünün içeriğini oluşturmakta ve AccordionPane kontrolü de Accordion'un Panes koleksiyonuna eklenmektedir. Sayfayı çalıştırdığımızda her iki örnektede veritabanından getirilen verilerin Accordion kontrolüne yüklendiğini görebiliriz. Kontrolümüzü hazırladığımız imajlar ve CSS ile kullandığımızda göze hoş gelen bir tasarım elde edebiliriz. Aşağıda Accordion kontrolünün son hali görülmektedir.
05 Nisan 2008
Accordion'un CSS ile Etkin Kullanımı
AJAX Control Toolkit ile gelen en kullanışlı kontrollerden birisi Accordion kontrolüdür. Web sayfalarının genellikle Sık Sorulan Sorular veya Yardım gibi bölümlerinde sıra sıra dizilmiş başlıklar bulunur ve kullanıcı hangi başlığa tıklarsa dinamik olarak o maddenin altındaki içerik görünür hale gelir. Diğer başlıkların içerikleri ise saklı durumda bulunur. Aslında uzun içeriklerin listeleneceği web sayfalarında hem kaplayacağı az alan açısından hem de görsel olarak sayfamızı daha kullanışlı hale getirecek bir kontrol Accordion. Başlık ve içerik olarak iki ana kısımdan oluşan AccordionPane'leri taşıyan Accordion kontrolünü CSS kullanarak zengin ve göze hoş gelen tasarımlar ortaya çıkarabiliriz. Accordion'un HeaderCssClass, HeaderSelectedCssClass ve ContentCssClass özelliklerinde önceden hazırladığımız CSS sınıfları (class) tanımlayarak bu işlemleri basit halde gerçekleştirebiliriz. Hazırladığım basit bir örnekle önce CSS tanımlamalarını, ardından da sayfamızdaki Accordion kontrolünü nasıl tanımlayacağımıza bakalım.
Projemize ekleyeceğimiz style.css dosyasında başlık, seçilen maddenin başlığı ve içerik kısımlarının nasıl görüntüleneceğini belirliyorum. Göze hoş gelmesi için bir grafik programında hazırladığım gradient geçişleri olan 3 tane gif dosyasını bu alanların zeminlerinde kullanıyorum.
style.css
.baslik {
font-size: 13px; font-family: Verdana; font-weight: bold; height:18px;
text-indent: 5px; padding: 1px; margin-top: 1px; cursor: pointer;
border-right: #ffcd70 1px solid; border-top: #ffcd70 1px solid;
border-left: #ffcd70 1px solid; border-bottom: #ffcd70 1px solid;
background-image: url(images/baslik_zemin.gif);
background-position: top; background-repeat: repeat-x;
}
.secilenBaslik {
font-size: 13px; font-family: Verdana; font-weight: bold; height:18px;
text-indent: 5px; padding: 1px; margin-top: 1px;
border-right: #ffcd70 1px solid; border-top: #ffcd70 1px solid;
border-left: #ffcd70 1px solid; border-bottom: #ffcd70 1px solid;
background-image: url(images/secilen_baslik_zemin.gif);
background-position: top; background-repeat: repeat-x;
}
.icerik {
font-size: 11px; font-family: Verdana; padding: 5px;
border-right: #ffcd70 1px solid; border-top: none;
border-left: #ffcd70 1px solid; border-bottom: #ffcd70 1px solid;
background-image: url(images/icerik_zemin.gif);
background-position: left; background-repeat: repeat-y;
}
Açık olmayan başlıkların üzerine gelindiğinde farenin simgesini değiştirmek için başlık sınıfında cursor: pointer tanımlamasını yapmak daha güzel olacaktır. Gelelim sayfamızın tasarımına. CSS dosyamıza link vereceğimiz bir aspx dosyasında Accordion'un yukarıda belirttiğimiz özelliklerini CSS dosyasında tanımladığımız sınıflarla dolduruyoruz. Geriye kalan tek şey ise AccordionPane'lerin başlık ve içeriklerin doldurmak olacaktır.
Default.aspx
<head runat="server">
<title>Accordion'un CSS ile Etkin Kullanımı</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<ajaxToolkit:ToolkitScriptManager ID="ScriptManager1" runat="server" />
<ajaxToolkit:Accordion ID="Accordion1" runat="server" HeaderCssClass="baslik"
HeaderSelectedCssClass="secilenBaslik" ContentCssClass="icerik" Width="185">
<Panes>
<ajaxToolkit:AccordionPane ID="pane1" runat="server">
<Header>Başlık-1</Header>
<Content>İçerik-1</Content>
</ajaxToolkit:AccordionPane>
<ajaxToolkit:AccordionPane ID="pane2" runat="server">
<Header>Başlık-2</Header>
<Content>İçerik-2</Content>
</ajaxToolkit:AccordionPane>
<ajaxToolkit:AccordionPane ID="pane3" runat="server">
<Header>Başlık-3</Header>
<Content>İçerik-3</Content>
</ajaxToolkit:AccordionPane>
</Panes>
</ajaxToolkit:Accordion>
</form>
</body>
Sayfayı çalıştırdığımızda Accordion kontrolünün görünümü yandaki gibi olacaktır. Burada Accordion panelerinin genişlik ve yüksekliklerine göre zemin resimlerini hazırlamamız görünümün düzgün olmasındaki en önemli etkenlerden biri olacaktır.
23 Mart 2008
Session ve Cache Nesneleri Üzerine
Bir web uygulamasında Session ve Cache nesnesi arasında tercih yapacağını ve bu tercihini neye göre belirleyeceğini merak eden bir okuruma yazdığım cevap üzerine blogumda da bu iki nesne üzerine birşeyler yazmaya karar verdim. Zira geçtiğimiz günlerde yazgelistir.com'un forumunda da buna benzer bir başlık görmüştüm. Aslında karşılaştırma yapmaktan ziyade bazı programcı arkadaşların bu iki nesneyi yanlış tanıdıkları için bu yanlış anlaşılmayı biraz olsun düzeltmek niyetindeyim.
Session ve Cache kullanım amaçları bakımından birbirinden tamamen farklı nesnelerdir dersem yanlış olmaz. Zira Session tarayıcıya bağımlı olarak bir kullanıcı ile ilgili bilgiler saklayabileceğimiz bir nesne iken, Cache tüm kullanıcıların erişebileceği ve uygulamada performans kazancı sağlamak için kullanabileceğimiz bir nesnedir. Session nesnesindeki tek amaç belirli bir süreliğine bir değeri veya nesneyi saklamaktır ve performans adına herhangi bir getirisi olmayacaktır. Cache'deki en temel amaç ise performanstır. Dilerseniz şöyle madde madde bir bakalım Session ve Cache arasındaki farklılıklara:
Session
- Kullanıcı ile ilişkili verileri saklar. Her kullanıcının bilgisi bellekte farklı bir alanda saklanır. O an sitede 20 kullanıcı var ise 20 tane farklı Session nesnesi bellekte saklanır. Bir kullanıcı sitedeki diğer kullanıcının Session bilgisine ulaşamaz.
- Genellikle kullanıcı adı veya açılan oturum ile ilgili bilgiler saklanır. Bu bilgiler her kullanıcı için saklanacağı için büyük boyutta olmaması gerekir.
- Bilgiler varsayılan olarak sunucunun belleğinde (InProc modu) saklanır. Eğer istenilirse SQL Server veritabanında (SQLServer modu) veya başka bir sunucunun belleğinde (StateServer modu) saklanabilir.
- Varsayılan olarak Session nesnelerinin yaşam süreleri 20 dakikadır. Kullanıcı sistemden çıkış yapar ise veya 20 dakika boyunca aktif olmazsa Session nesneleri bellekten kaldırılır. Eğer istenilirse bu süre değiştirilebilir. (web.config dosyasında sessionState düğümünden)
- Performans açısından herhangi bir kazanç sağlamaz. Fakat durum yönetimi adına kullanıcıyı tanımamız ve buna göre işlemler yapmamız adına kolaylıklar sağlar.
Cache
- Kullanıcıya özel bilgi saklamaz. Saklanan veriye aynı anda tüm kullanıcılar erişebilir. Sitede 20 kullanıcı var ise 20 tane Cache nesnesi değil 1 tane Cache nesnesi saklanır. (En sık karıştırılan noktalardan biri burası)
- Genellikle bir sayfanın tamamının HTML kodları (output caching), bir sayfanın belirli bir kısmının HTML kodları (fragment caching) veya DataTable gibi bir nesne (data caching) Cache nesnesinde saklanır.
- Bilgiler sunucunun belleğinde saklanır. Bu veriler ASP.NET tarafından yönetilir. Hatta Cache'e eklenecek nesnelere öncelik ataması yapılarak gerektiğinde ASP.NET'in hangi Cache nesnelerini öncelikli olarak bellekten kaldıracağı belirlenebilir.
- Zamana bağımlı olarak veriler Cache'de saklanabileceği gibi nesnenin değişim durumunda göre veya dosya-klasör içeriğinin değişimine bağımlı olarakta değerler saklanabilir.
- Performans kazancı sağlamak amacıyla kullanılır. Bir nesneyi veya bir sayfayı tekrar tekrar üretmek sunucuya belirli bir yük getiriyorsa nesne veya sayfa bellekte saklanarak sayfaların daha hızlı çalıştırılması sağlanır.
Görüldüğü gibi Session ve Cache farklı amaçlar için kullanabileceğimiz nesnelerdir. Session yerine Cache, Cache yerine Session kullanmak teoride olabilse de pratikte kullanılmaz, en azından benim aklıma kullanılabileceği bir yer gelmiyor.
07 Mart 2008
Visual Studio 2008 - Ürün Karşılaştırması
Visual Studio 2008'in piyasaya sürülen bütün ücretli ve ücretsiz sürümlerinin karşılaştırmasını bulabileceğiniz faydalı bir link. Öğrencilerim genelde "Hocam Express Edition'lar ile tam sürümler arasında ne gibi farklılıklar var" diye sorardı. Artık cevabı için bu linki kullanabilirim!
"Visual Studio 2008 Product Comparison" başlıklı incelemeye bu linkten ulaşabilirsiniz.
25 Şubat 2008
ASP.NET Uygulamalarında Birden Fazla Sitemap Dosyası Kullanma
ASP.NET uygulamalarında navigasyon kontrollerini SiteMapDataSource ile birlikte kullandığımızda sadece bir tane sitemap dosyası kullanılabilmekteyiz. Bu durumun sebebi uygulamalarındaki web.config dosyasının miras alarak kullandığı .NET Framework'ün kurulu olduğu dizindeki web.config dosyasında sadece bir tane SiteMap sağlayıcısı (provider) tanımlamasının yapılmasıdır. .NET Framework 2.0 kurulu bir makinada C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG dizininde bulunan web.config dosyasındaki <siteMap> düğümüne bakacak olursanız tanımlanan tek bir provider'ın olduğunu ve bununda siteMapFile niteliğinde web.sitemap dosya isminin olduğunu görebilirsiniz. Aslında buradan yola çıkarak birden fazla sitemap dosyasını nasıl kullanabileceğimizi çözümleyebiliriz. Uygulamamıza ikinci bir sitemap dosyası eklemek ve navigasyon kontrolleri ile birlikte kullanmak istersek öncelikli olarak uygulamadaki web.config dosyasına yeni bir siteMap provider tanımlaması yapmamız gerekecektir. Aşağıda web.config dosyamızın <system.web> kısmına ekleyeceğimiz kodlar bulunmaktadır.
web.config
<system.web>
...
<siteMap>
<providers>
<add name="SiteMapProvider2" siteMapFile="web2.sitemap" type="System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</siteMap>
</system.web>
SiteMapProvider2 adında web2.sitemap isimli dosya ile çalışacak yeni bir siteMap sağlayıcısı tanımladık. Bu uygulama içerisinde artık web.sitemap dışında web2.sitemap isimli bir site haritası dosyası da kullanabiliriz. Bir ASP.NET sayfasına iki tane Menu kontrolü ve iki tane SiteMapDataSource kontrolü ekleyerek birden fazla sitemap dosyası kullanımını test ediyoruz. Burada dikkat edeceğimiz nokta web2.sitemap isimli dosyamıza bağlanacak olan SiteMapDataSource kontrolünde SiteMapProvider özelliğini web.config'de tanımladığımız SiteMapProvider2 isimli sağlayıcıya eşitlemek olacaktır.
Default.aspx
<asp:Menu ID="Menu1" runat="server" BackColor="#B5C7DE" DataSourceID="SiteMapDataSource1" Font-Names="Verdana" Font-Size="12px">
</asp:Menu>
<br />
<asp:Menu ID="Menu2" runat="server" BackColor="#E3EAEB" DataSourceID="SiteMapDataSource2" Font-Names="Verdana" Font-Size="12px">
</asp:Menu>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="False" />
<asp:SiteMapDataSource ID="SiteMapDataSource2" runat="server" ShowStartingNode="False" SiteMapProvider="SiteMapProvider2" />
17 Şubat 2008
SiteMap Dosyasında Kendi Bilgilerimizi Saklamak
Site navigasyon işlemlerinde kullanmak için oluşturduğumuz sitemap dosyaları bildiğiniz gibi site içindeki sayfaların hiyerarşik yapılarını saklamaktadır. url, title ve description gibi sayfa hakkında detaylı bilgileri içerisinde saklayan siteMapNode düğümlerinde istersek kendimize ait nitelikler tanımlayarak özel bilgileri de saklayabiliriz. Nasıl mı?
Olayı basite indirgemek için site haritamızda sadece 4 kategori bulunsun: ASP.NET, ADO.NET, C# ve SQL Server. Normal durumlarda bu sayfalar hakkında url ve title, bazen de description bilgilerini saklarız. İstiyoruz ki bu 4 bölümün editörlerini de site haritası dosyasında saklayalım. Yapılacak tek işlem ilgili düğümler içerisine Editor="Veli" gibi tanımlamalar yapmak olacaktır. Bir sonraki adımda sayfa içerisinden bu bilgileri okumakta yine bu kadar kolay olacak! Aşağıdaki örnekte web.sitemap dosyası ve bir sayfadan bu bilgiyi nasıl elde edeceğimiz görülmektedir.
Web.sitemap
<?xml version="1.0" encoding="windows-1254" ?>
<siteMap>
<siteMapNode url="Default.aspx" title="Anasayfa">
<siteMapNode url="Aspnet.aspx" title="ASP.NET" description="" Editor="Uğur UMUTLUOĞLU" />
<siteMapNode url="Adonet.aspx" title="ADO.NET" description="" Editor="Burak BATUR" />
<siteMapNode url="Cs.aspx" title="C#" description="" Editor="Emrah USLU" />
<siteMapNode url="SqlServer.aspx" title="SQL Server" description="" Editor="Bülent SÖZGE" />
</siteMapNode>
</siteMap>
Sablon.master.cs
Response.Write(SiteMap.CurrentNode["Editor"]);
12 Şubat 2008
web.config Dosyasından URL ReWriting
URL ReWriting (sayfa adresini yeniden oluşturma) işlemi özellikle sayfalarımızda QueryString'leri kullanırken sıklıkla başvurmak istediğimiz bir işlemdir. Bu işlem karmaşık olan sayfa adresleri daha okunur ve sade hale getireceği gibi arama motorlarının sitemizdeki sayfaları daha verimli şekilde yakalamasını da sağlar. URL ReWriting'i uygulamanın birçok yolu bulunmaktadır. Kullanım bakımından en kolay yollardan biri de web.config dosyası ile bu işlemi gerçekleştirmektir. web.config dosyasında <system.web> düğümü içerisinde açacağımız <urlMappings> düğümü ile bu işlemin kolay şekilde yapılmasını sağlayabiliriz. Örneğin yazarların bilgilerini görüntüleyen bir sayfada içerik QueryString'den alınan bir veriye göre oluşsun. Sayfa arka planda aslında Yazar.aspx?isim=ugur şeklinde çalışıyor fakat biz adresin Ugur.aspx şeklinde görüntülenmesini istiyoruz. web.config dosyası içerisine ekleyeceğimiz aşağıdaki kod parçaları işimizi görecektir. mappedUrl niteliği sayfanın gerçek URL'ini, url niteliği ise görüntülenmesi istenilen URL'ini belirler. Yani Ugur.aspx gibi bir sayfaya istek geldiğinde aslında böyle bir sayfa olmayacaktır fakat adres kısmında bu URL görünecek ve arka planda Default.aspx?isim=ugur URL'i çalıştırılacaktır.
<configuration>
<system.web>
<urlMappings enabled="true">
<add url="~/Ugur.aspx" mappedUrl="Default.aspx?isim=ugur" />
<add url="~/Emrah.aspx" mappedUrl="Default.aspx?isim=emrah" />
<add url="~/Burak.aspx" mappedUrl="Default.aspx?isim=burak" />
</urlMappings>
...
...
</system.web>
</configuration>
url niteliğinde relative adres belirlemek zorunludur. Yani çağrılacak URL'in tam yolunu ~/ şeklinde belirlemek gerekecektir. Bu işlemin çok az da olsa performans kaybına sebep olacağını da unutmamak lazım!
31 Ocak 2008
Katılamadığım Yazgelistir.com Toplantısı ve Ödülüm
Geçtiğimiz günlerde İstanbul'da yazgelistir.com editörleri ve yazarlarının katıldığı bir toplantı gerçekleştirildi. Malumunuz askerde olduğum için toplantıya katılamadım ama aldığım güzel bir haber ile de üzüntüm biraz olsun azaldı. Yazgelistir.com tarafından yazdığım makaleler ile site içeriğine 2007 yılında yaptığım katkılarda dolayı yanda gördüğünüz ödülü almışım. Amacımız sahip olduğumuz bilgileri insanlarla paylaşabilmek. Bunun sonucunda insanlardan aldığımız teşekkür mailleri ve bu tip ödüllerde bizleri gerçekten sevindiriyor ve motivasyonumuzu arttırıyor. Ödülüm şu anda değerli dostum Burak Batur'un evinde, yani emin ellerde!
Askerde iken ödül almakta başka bir duyguymuş onu da yaşamış olduk.
25 Ocak 2008
Elazığ'dan Sevgilerle
Farklı bir şehire gidiş sebebim genelde seminerler olurdu ve seminerlerin nasıl geçtiği ile ilgili haberlerimi blogumu takip edenlerle paylaşırdım. Ama şimdi askerdeyiz. Eee asker ocağında da .NET semineri verecek halimiz yok değil mi?
Bugün 25 Ocak 2008 ve Şafak 114. Usta birliğinde Elazığ 8. Kolordu Komutanlığı Askeri Mahkemesi'nde vatani görevime devam ediyorum. Soranlar olursa halim, vaktim, keyfim... yerinde. Burada ara sıra da olsa interneti kullanabilme şansım belki de askerliğimin en keyifli yanı. En azından yazılan bazı makaleleri ve yazılım dünyasındaki yenilikleri takip edebilme, eş-dost ile mesajlaşabilme şansı bulabiliyorum. Benden haberler şimdilik bu kadar. En yakın zamanda teknik içerikli yazılarla, makalelerle ve seminerlerle tekrar görüşmek dileğiyle..
10 Aralık 2007
Kısa Bir "Veda"
Zor bir veda yazısı ama en güzel tarafı "elveda yazısı" olmaması. Anlaşılacağı üzere askerlik görevim ile ilgili bir veda yazısı okuyorsunuz. 12 Aralık Çarşamba günü Elazığ'da birliğime teslim olacağım. Jandarma-Er olarak yapacağım kısa dönem askerlik görevim süresince (5 ay 5 gün boyunca) sizlerle olamayacağım. Allah nasip ederde sağ salim dönersek kaldığımız yerden devam edeceğiz.
Bu sabah askerliğimin nereye çıktığın heyecanla beklediğim uzun süre içerisinde geçmişte neler yapmışım diye bir bakındım ve ilginç istatistiklerle karşılaştım. Şöyleki bugüne kadar;
- En az 50'si teknik içerikli olmaz üzere 130'un üzerinde blog postuyla 25 binin üzerinde ziyaretçiyle,
- 18 seminer ve 9 webiner ile 800'ün üzerinde kişiyle,
- Yaklaşık 20 makale, 17 video ve 2 dergi yazım ile yazgelistir.com, msakademik.net, turkaspx.net, nedirtv.com gibi sitelerde ve PC Magazine dergisinde sayısı pekte az olmayan okur ve izleyenle buluştum, bilgiyi paylaşmaya, paylaştıkça arttırmaya çalıştım.
Umarım büyük haz alarak yaptığım bu işlere askerden döndüğümde de aynı şekilde devam edebilirim.
Tekrar görüşmek dileğiyle, bana ve tüm Mehmetçiklere hayırlı teskereler...
ASP.NET 3.5 Extensions CTP Preview Resmen Duyuruldu
Geçtiğimiz günlerde blogumda hem duyurusunu, hem de detaylı açıklamalarını yaptığım ASP.NET 3.5 Extensions paketinin CTP Preview sürümü bugün resmen duyuruldu. Detaylı bilgiler ve download işlemi için bu linki kullanabilirsiniz.
Bu paket ile ilgili kurulumları yapmayı ve ilk izlenimlerimi de sizlere iletmeyi çok isterdim ama yarın akşam askerim. Askerden sonra RTM sürümünün izlenimlerini sizlere iletmek dileğiyle :)
05 Aralık 2007
ASP.NET 3.5 Extensions
.NET Framework 3.5 ve beraberinde ASP.NET 3.5 geçtiğimiz günlerde resmen duyurdu. C# tarafında LinQ gibi önemli yenilikler geliyor olsa da web uygulamalarında çok büyük yeniliklerin olmadığını da söyleyebiliriz. Ama 3.5 olayı burada bitti sanmayın zira ASP.NET ekibi çok yakın bir zamanda önemli bir paket ile bombayı patlatacak gibi: ASP.NET 3.5 Extensions. Aslında Microsoft bunun bir benzerini ASP.NET 2.0'ın ardından ASP.NET AJAX Extension'ı duyurarak yapmıştı. Şimdi de benzeri bir strateji ile geliyorlar. AJAX ancak 3.5 sürümünde mimariyle bütünleşti, belki bu son yenilikler de ASP.NET 4.0 (böyle bir sürüm olur mu bilinmez) ile bütünleşik gelecektir. Nacizane yorumlarımdan sonra gelelim ASP.NET 3.5 Extension'larına. Sevgili Scott Guthrie hocamızın .NET Web Product Roadmap başlıklı yazısından da gerekli bilgileri edinebilirsiniz.
Aslında ASP.NET 3.5 Extensions içerisinde daha önceden duyurulan ASP.NET Futures paketindeki kontroller ile ASP.NET MVC Framework'ün olduğunu söylesem pek te yanlış olmaz. ASP.NET 3.5 ile ilgili geçen ay yazdığım yazıda ASP.NET Futures paketi ile gelen kontrollerin eklenmediğinden şikayetçi olmuştum hatırlayacağınız gibi. Sanırım benim ve çoğu web programcısının sesini duymuşlar :) Aşağıda bizleri bekleyen yenilikleri hakkında kısa bilgileri bulabilirsiniz.
ASP.NET MVC Framework: Bu kısmı çok uzun anlatmama gerek yoktur sanırım. Zira bir önceki yazımın içeriği tamamen bu uygulama desenini anlatıyor. MVC (Model View Controller) adı verilen uygulama deseni ile uygulamanın üç ayrı katmanda yazılması yoluna gidiliyor. Model kısmında veri ile ilgili nesneler (DataTable, DataSet ve kendi veri nesnelerimiz), View kısmında User Interface'lerimiz (aspx, ascx, master sayfalar) Controller kısmında ise kullanıcının View ve Model kısmındaki nesneler ile etkileşimini sağlayacak class'larımızın bulunmasını öngören bu model yavaş yavaş günlük hayatımıza girecek gibi.
ASP.NET AJAX Tarafındaki Geliştirmeler: Futures paketinden tanıdığımız History kontrolü bu paketin içerisinde olacak. AJAX sayfalarında tarayıcıdaki ileri-geri gitme problemini çözecek olan bu kontrol asenkron postbackler esnasında sayfanın URL kısmını değiştirerek tarayıcının değişen sayfa içeriklerini geçmişine kaydetmesini sağlıyor. Umarım bu kontrol aynı zamanda arama motorlarının asenkron postback ile değişen sayfa içeriklerini de yakalamasını sağlayabilir. Ya da ilerleyen günlerde ASP.NET ekibi bu yönde geliştirmeler yapabilir.
Dinamik Veri (Dynamic Data) Desteği: Yine Futures paketinden tanıdığımız bir özellik. DynamicAutoData, DynamicList, DynamicNavigator, DynamicRssLink ve adını hatırlayamadığım bazı veri kontrolleri ile bir veritabanında yapacağımız Select, Insert, Update, Delete gibi işlemleri neredeyse kod yazmadan gerçekleştirebilmemizi sağlıyor. .NET Framework 3.5 ile gelen Database Markup Language (dbml) dosyaları ile dinamik veri kontrollerini birlikte düşününce ve üstüne MVC Framework'ü de katınca bu yeniliklerin MVC'nin Model katmanını oluşturacağını söyleyebiliriz.
SilverLight Desteği: SilverLight artık ASP.NET ile giderek bütünleşiyor. Tahminen yine Futures paketindeki Media ve XAML kontrollerinin ekleneceği bu pakette ASP.NET ile SilverLight'ın entegrasyonunun daha da kolaylaşacak. Yani daha interaktif daha zengin içerikli sayfalar geliyor.
ADO.NET Veri Servisleri (Data Services): ADO.NET Entity Framework adı verilen bu pakette ASP.NET 3.5 Extensions ile birlikte duyurulacak. Object Relation Mapping (ORM) desteği ile daha da güçlenen .NET Framework 3.5'teki veri işlemleri aslında bu framework altında toplanıyor gibi. Artık veri ile ilgili her türlü işlemi oluşturacağımız veya SqlMetal aracı ile oluşturulacak class'lar ile gerçekleştireceğiz gibi...
Yine ASP.NET Futures'la gelen IronPhyton ve Managed JScript gibi dinamik diller ile ilgili olarak Scott Guthrie'ın postunda bir bilgi göremedim ama bir soruya yazdığı yorumda bu konuda da çalışmaların olduğunu belirtmiş. Bu konuyla ilgili de yenilikler gelecek gibi.
03 Aralık 2007
ASP.NET MVC Nedir?
Son zamanlarda yabancı kaynakları takip ediyorsanız eminim ki MVC harflerini ASP.NET'in hemen yanında sıklıkla görmüşsünüzdür. MVC yani Model View Controller. MVC mimarisi aslında daha önceden de duyulan bir tasarım deseniydi (design pattern) programlama dünyasında. Bu yaklaşımdaki temel mantık bir web projesini üç temel parçaya bölmek ve yapılacak işleri bu parçalar üzerinden yürütmektir. Hazırladığımız projelerde sıklıkla kullandığımız uygulamayı iş katmanı ile veri katmanı olarak ayrı parçalara bölmeyi buradaki yaklaşım ile benzeştirebiliriz. Aslında temel amaç uygulamayı işe yarar belirli amaçları olan parçalara bölmek ve bir parçanın değişiminden diğer parçaların etkilenmesini engellemektir.
MVC uygulamanın Model, View ve Controller olarak üçe ayrılmasını benimseyen bir tasarım desenidir.
- Model veri ve durum bilgilerini taşır. Burası DataTable, DataSet ve entity katmanımızdaki sınıfların bulunduğu bileşendir.
- View uygulamanın arayüzlerinin bulunduğu bileşendir. Master sayfalar, aspx ve ascx gibi kullanıcının görüntüleyeceği dosyalar bu kısımda yer alır.
- Controller ise arayüzler arasındaki etkileşimi sağlayan, veri nesneleri üzerinde değişiklik yapılmasını sağlayan bileşenlerdir. İşte burada benim çok ilgimi çeken bir yenilik çıkıyor karşımıza. Controller katmanındaki sınıflar aracılığıyla etkin URL Mapping işlemi yaparak artık tarayıcı üzerinden sayfalara istek yapmak yerine nesnelere istekte bulunabiliyoruz. Yani URL üzerinden tarayıcıda görüntülenecek nesnenin render edilmesi sağlanabiliyor.
Sol kısımdaki resimde bu desenin bir projeye nasıl uygulandığının basit bir örneğini görebilirsiniz. MVC tasarım deseni, önümüzdeki yıllarda bir ASP.NET programcısının hayatına girecek önemli kavramlardan biri olacak gibi. Zira Microsoft ASP.NET yazılım geliştirme grubunun önümüzdeki günlerde çıkarmayı düşündüğü ASP.NET 3.5 Extensions ile birlikte resmen web uygulamarına dahil edilecek bu desen. Üzerinden daha detaylı araştırmalar ve çalışmalar yapılması gereken konular. Ben askerde iken eminim ki ASP.NET 3.5 Extensions ve ASP.NET MVC konularında birçok teknik yazı yazılacaktır. İnşallah dönüşte keyifle okuyabilirim.
Daha detaylı bilgiler için Scott Guthrie'nin blogundaki şu başlıkları okuyabilirsiniz:
ASP.NET MVC Framework
ASP.NET MVC Framework (Part 1)
ASP.NET MVC Framework (Part 2): URL Routing
30 Kasım 2007
PC Magazine Aralık Sayısındaki Yazım
PC Magazine Aralık sayısı bayilerde!
Bu sayıda da ASP.NET AJAX ile Resim Slayt Gösterisi Hazırlamak konulu bir yazı hazırladım. UpdatePanel ve Timer kontrolünü kullanarak sıfırdan bir resim slaytının nasıl hazırlanacağı konusundaki bu yazımı ve birbirinden değerli yazıları okumak için PC Magazine'in Aralık ayını satış noktalarından temin edebilirsiniz. Bu ay ki sayıda yazı dışında küçükte bir süprizim var! Dergi ile birlikte temin edeceğiniz DVD'de ASP.NET ile ilgili hazırlamış olduğum üç tane görsel derste bulunmakta. Kaçırmayın derim :)
Aralık sayısının içeriğini görmek için buraya tıklayabilirsiniz.
21 Kasım 2007
Visual Studio 2008 ve ASP.NET 3.5 Sunumları
Dün Fatih Üniversitesi'ndeki seminer ve bugün düzenlediğimiz webinerleri başarılı bir şekilde tamamladık. Katılımların yoğun şekilde gerçekleştiği bu etkinliklerde ilk kez Visual Studio 2008 ve ASP.NET 3.5 ile birlikte gelen yenilikleri katılımcılarla paylaştık. Önümüzdeki günlerde diğer üniversitelerde de bu tip etkinlikleri düzenlemeye devam edeceğiz.
Aşağıda seminerlerde kullandığımız sunum dosyalarını bulabilirsiniz.
Aşağıda da Fatih Üniversitesi seminerinden iki kare bulunmakta.

19 Kasım 2007
Visual Studio 2008 ve ASP.NET 3.5 Webineri
21 Kasım 2007 Çarşamba günü saat 10.00 - 12.00 arasında internetten canlı olarak yayınlanacak webinere (web seminerine) davetlisiniz. Türkiye'de yapılacak bu ilk Visual Studio 2008 ve ASP.NET 3.5 webineri ile bu ayın sonunda çıkacak yeni teknolojileri görme fırsatı bulabilirsiniz.
Webiner ile ilgili bilgiler aşağıdadır:
Konuşmacılar:
Burak BATUR (MS Akademik Editörü)
Uğur UMUTLUOĞLU (MS Akademik Editörü)
Tarih: 21 Kasım 2007 Çarşamba
Saat: 10.00 - 12.00
Katılım Adresi: https://www112.livemeeting.com/cc/microsoft/join?id=MSAkademik_VS2008&role=attend&pw=MSAkademik
Meeting ID: MSAkademik_VS2008
Attendee Entry Code: MSAkademik
Fatih Üniversitesi Seminerleri
20 Kasım 2007 Salı günü ben, Burak Selim Şenyurt ve Burak Batur gerçekleştireceğimiz sunumlarla Fatih Üniversitesi öğrencileriyle birlikte olacağız. Bu etkinliğin belki de en önemli yönü Türkiye'de Visual Studio 2008 ve ASP.NET 3.5 konularında yapılacak ilk seminer olması!
Saat 12.00-15.30 arasında gerçekleşecek seminerlerin programları aşağıdadır.
12.00 - 13.00: Yazılımda Kariyer (Burak Selim ŞENYURT)
13.00 - 13.50: Visual Studio 2008 (Burak BATUR)
14.00 - 15.30: ASP.NET 3.5 (Uğur UMUTLUOĞLU)
Fatih Üniversitesi İstanbul Büyükçekmece Kampüsünde Kırmızı Salon A-351'de gerçekleşecek oturumlara katılımlarınızı bekliyoruz.
14 Kasım 2007
Gençsen Geleceksin

12 Kasım 2007
Static Metotlarla AJAX Sayfalarını Daha da Hızlandırın!
ASP.NET AJAX istemci ve sunucu merkezli çalıştığı için mimarisi gereği sayfada asenkron postback işlemi başlatsak dahi sunucu tarafında sayfamızın yaşam döngüsü tam olarak çalışmakta ve sayfa baştan itibaren üretilmekte, fakat istemciye sadece UpdatePanel'in içeriği gönderilmektedir. Bu işleyiş aslında kötü bir durum gibi gözükse de ASP.NET sayfa mimarisi açısında gerekli bir işlemdir ki; çoğu noktada faydalarını da görebiliriz. Olayın diğer tarafına bakacak olursak sayfanın sunucu tarafında baştan üretilmesi biraz da olsa yavaşlığa sebep olacaktır. Eğer sayfanızda bir kontrolün içeriğini asenkron olarak güncellemek ve bu işlemi hızlı bir şekilde yapmak istiyorsanız sunucu tarafında çalışacak static metotlar oluşturarak istemci tarafında hazırlayacağınız basit JavaScript fonksiyonlarıyla da asenkron güncelleme işlemini gerçekleştirebilirsiniz. Metot static olduğu için sunucuda sayfanın nesne örneği üretilmeden de çağrılabilir bir metot olacaktır. Metot ile ilgili en önemli husus ise System.Web.Services isim alanı altındaki WebMethod niteleyici (attribute) sınıfını uygulaması gerekeceğidir. Böylece istemcide hazırlanan JavaScript fonksiyonu bu metodu asenkron olarak çağırabilecektir. Metot HTML içeriği güncelleyeceği için string değer döndürmelidir. Aşağıda sayfamızın code-behind kısmına yazabileceğimiz örnek metot bulunmaktadır.
[System.Web.Services.WebMethod]
public static string KareKok(int sayi)
{
return Math.Sqrt(sayi).ToString();
}
Gelelim istemci tarafında yapacaklarımıza. Burada en ilgi çekici durumlarımızdan birisi UpdatePanel'e ihtiyaç duymadan da bu işlemi yapabilmemiz. Bir diğer ayrıntımız ise ScriptManager ile ilgili. Sunucu tarafında yazılmış WebMethod attribute'unu uygulayan static metodu çağırabilmemizi sağlayan PageMethods isimli JavaScript fonksiyonunu kullanabilmek için ScriptManager'ın EnablePageMethods özelliğini true olarak ayarlamamız gerecektir. Yine istemci tarafında çalışacağımız için sunucu kontrolleri yerine HTML kontrolleri kullanmamız da herhangi bir sakınca yok. İstemci tarafında hazırladığım kodları aşağıda görebilirsiniz.
<head runat="server">
<title>Untitled Page</title>
<script language="javascript">
function AsenkronMetotCagir()
{
// Sunucudaki static metodu çağırıyoruz. Sonucu IslemBitti metoduna iletiyoruz
PageMethods.KareKok(form1.txtSayi.value, IslemBitti);
}
function IslemBitti(deger)
{
// İşlemin sonucunu sonuc adındaki span etiketine yazdırıyoruz
document.getElementById('sonuc').innerHTML = deger;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<input type="text" id="txtSayi" />
<input type="button" value="Karekök Bul" onclick="AsenkronMetotCagir();" /> <br />
<span id="sonuc"></span>
</form>
</body>
Bu şekilde sunucu tarafında sayfanın baştan üretilmesine gerek kalmadan çok daha hızlı bir şekilde asenkron güncelleme işlemleri yapabilmekteyiz. Buradaki en büyük sıkıntılarımızdan birisi ise HTML kodunu kendimizin oluşturması gerekeceğidir. Eğer gridview, detailsview gibi kompleks bir kontrolün çıktısını elde etmek istiyorsak ilgili kontrolleri programatik olarak oluşturup RenderControl metodu ile de HTML çıktılarını istemciye yine static metot aracılığıyla gönderebiliriz.
09 Kasım 2007
Yazılım Dünyasında Yeni Bir Soluk: turkaspx.net
Geçtiğimiz günlerde değerli iş arkadaşlarım ve hocalarım Burak Selim Şenyurt, Emrah Uslu, Burak Batur ve ben www.turkaspx.net adresinde yeni bir günlük açtık. Yoğun bir çalışma sonucunda blogumuz yeterli içeriğe kavuştu ve artık buradan da sizlere duyurusunu yapmak istedim.
turkaspx.net olarak amacımız başta ASP.NET olmak üzere Microsoft teknolojileri hakkında teknik konularda bilgi birikimimizi ve deneyimlerimizi sizlerle paylaşmaktır. Blog sitemizde paylaşacağımız konularla kısa bir süre içerisinde Türkçe içerikli dev bir arşiv oluşturmayı, bir .NET yazılımcısının ihtiyacı olabilecek bir çok konuyu bu çatı altında toplamayı hedefliyoruz.
Yazılım geliştiriciler için faydalı bir kaynak olması dileğiyle, www.turkaspx.net hayırlı uğurlu olsun diyorum.
06 Kasım 2007
Visual Studio 2008 ve .NET Framework 3.5 Bu Ay Resmen Duyruluyor
Ve beklenen haber resmen duyruldu. Microsoft, kasım ayı içerisinde Barcelona'da gerçekleşecek olan Microsoft TechEd Developers 2007 etkinliğinde kod adı Orcas olarak bilinen Visual Studio 2008 ve .NET Framework 3.5 sürümlerini resmen duyuracağını ve release edeceğini duyurdu. Ayrıntıları bu linkteki haberden okuyabilirsiniz.
ASP.NET 3.5 ile Gelen Yenilikler
ASP.NET AJAX Entegrasyonu
ASP.NET AJAX, ASP.NET ortamında hızlı ve kolay bir şekilde AJAX uygulamaları geliştirmemizi sağlayan ücretsiz bir AJAX framework'üdür. ASP.NET 2.0'ın ardından duyrulan ve bu yılın başında resmi sürümü çıkarılan AJAX Extension'ları ASP.NET 3.5 ile mimariyle bütünleşik şekilde geliyor. Visual Studio 2008'de açılan ASP.NET 3.5 web uygulamasında AJAX Extension kontrollerini kullanarak hızlı şekilde AJAX uygulamaları geliştirebiliyoruz. Bu sürümü ile birlikte bazı eksiklikler ve sorunlar giderilerek artık ASP.NET AJAX'ın sunucu kontrolleriyle tam uyumlu şekilde çalışması da sağlanıyor. Visual Studio 2008 ile birlikte Control Toolkit'te yer alan kontrollerin varolan sunucu kontrollerine çok kolay şekilde entegre edilebilmesi de işimizi kolaylaştıracak bir yenilik olarak göze çarpıyor.
LINQ (Language Integrated Query)
.NET Framewrok 3.5 ile birlikte artık web uygulamalarında da Linq hayatımıza girecek. Linq dil ile bütünleşik olarak sorgulamalar yapmamızı sağlayan bir query şeklidir diyebilirim. Veritabanında SQL query'leri kullanarak nasıl sorgulamalar yapıyor ve sorgu sonucunu elde edebiliyorsak, artık C# veya VB.NET gibi bir dil ile de uygulama içerisindeki bir nesnenin içeriği ile ilgili SQL sorgu cümlelerine benzer şekilde sorgulamalar gerçekleştirebileceğiz. ASP.NET 3.5 ile gelen kontrollerden biri olan LinqDataSource kontrolü de bu tip sorgulamaların sonucunu bir veri kontrolüne (GridView, DataList gibi) bağlayabilmemizi sağlıyor.
ListView ve DataPager Kontrolleri
LinqDataSource kontrolü dışında ListView ve DataPager adında iki yeni kontrol daha geliyor. ListView veri ekleme, güncelleme, silme, sayfalama gibi işlemleri yapabilen ve GridView kontrolüne oldukça benzer bir kontrol. GridView'daki en büyük sıkıntılarımızdan biri görüntülenecek olan verilerin HTML arayüzlerini tasarlamakta karşılaştığımız sorunlardı. ListView kontrolü ise yapısındaki template'ler aracılığıyla verilerin görüntüleneceği arayüzün HTML kodlarını dilediğimiz gibi oluşturabilmemizi sağlıyor. DataPager kontrolü ise ListView ile yapılan işlemlerde kayıtların esnek şekilde sayfalandırılması işleminde kullanılıyor. Bu kontrolün yaptığın temel işlemin sayfalama kısmının ne şekilde görüntüleneceği ve çalışağını belirlemek olduğunu söyleyebilirim. Örneğin sayfa numaralarının görüntüleneceği kısma bir TextBox kontrolü ekleyip yazılan numaradaki sayfaya gidilmesi işlemini DataPager kontrolü ile oldukça kolay şekilde gerçekleştirebiliyoruz.
Web Servislerinde WCF Desteği
Web servisleri artık .NET Framework 3.0 ile gelen WCF (Windows Communication Foundation) desteği ile geliştirilebiliyor. JSON kullanılan AJAX uygulamalarında ve RSS kaynaklarından veri sağlanması gibi işlemler artık WCF ile daha da kolay şekilde gerçekleştirilebilecek.
05 Kasım 2007
.NET Framework 3.5 ile Gelen Yeni Namespace ve Class'lar
02 Kasım 2007
Sakarya Üniversitesi Seminerinin Ardından
Dün Sakarya Üniversitesi'nde ASP.NET 2.0 seminerini gerçekleştirdik. ASP.NET 2.0 ile birlikte gelen birçok yeniliği örnek çalışmalarla birlikte seminere katılan yaklaşık yüz kişiyle paylaşma şansım oldu.
Sakarya'yı ilk ziyaretimdi ve Sakarya ile ilgili oldukça güzel izlenimlerim oldu. Sakarya Üniversitesi'ndeki öğrenci arkadaşların özellikle misafirperverliği beni onlara karşı mahçup bıraktı diyebilirim. Başta Halime ÖZSOY ve Mustafa EKİCİM olmak üzere tüm Sakarya Üniversitesi Bilgisayar Kulübü


