17 Aralık 2009 Perşembe

C# 4.0 - Optional Parameters

Merhabalar;
Size C# 4.0'la gelen opsiyonel parametreleri anlatmaya çalışacağım.Programımızda metotlarımızı overload etmek kaçınılmaz olabiliyor bildiğiniz gibi.Ama her method overloading işlemi de bir kod kalabalığı getiriyor.Bu durumlarda opsiyonel parametrelerin getirdiği kolaylığı görelim.
İşlem yapacak bir metodumuz olsun;
public static double Islem(int a, int b , int c )
{
return a * b + c;
}
Öyle bir durum oldu ki metodumuza aktaracağımız parametreleri duruma göre kendimiz verip duruma göre default bırakmamız gerekti.Bunu gerçekleştirmek için aynı isimde başka bir metot yazmalıydık .Ancak şimdi C# 4.0 ile gelen Opsiyonel Parametre ile bunu yeni bir metot yazmadan gerçekleştirebiliriz. Opsiyonel parametrelerin yardımını burda alıyoruz.
Örneğin;
public static double Islem(int a, int b , int c = 1 )
{
return a * b + c;
}
Metodumuzu kullanalım;
Static void Main(string[] args)
{
Console.WriteLine(Islem(
Console.ReadLine();
}
Gördüğünüz gibi opsiyonel olarak tanımladığımız parametre köşeli parantez içinde gösteriliyor.Bu metodu kullanmak istersek;

Console.WriteLine("İşlem Sonucu = " + Islem(1, 2));

İşlemimizin sonucu 3 gelecektir.Ancak biz c parametresini kendimiz de verebiliriz.

Console.WriteLine("İşlem Sonucu = " + Islem(1, 2,3));

İşlemimizin sonucu 5 gelecektir.Yeni bir metot yazmadan bir farklı metotlar elde etmiş olduk.Şimdi 2 tane opsiyonel parametre kullanımına bir göz atalım.

public static double Islem(int a, int b = 2 , int c = 1 )

İstediğimiz kadar opsiyonel parametre kullanabiliriz ancak dikkat ettiğiniz gibi opsiyonel parametreler metodumuzun parametreleri arasında hep en sonda olmak zorundadır.

Örnek olarak bir kullanım görelim;

Console.WriteLine("İşlem Sonucu = " + Islem(1,c : 2));

Gördüğünüz gibi opsiyonel parametreleri sıralı olarak vermek zorunda değiliz.Burada b parametresi bizim atadığımız default değeri alırken c parametresini 2 olarak atamış olduk

Opsiyonel parametreleri kısaca anlatmaya çalıştım.Bir çok kolaylık sağladığını ve sağlayacağına emin olabilirsiniz.Sizi kod kalabalığından kurtaracaktır.

Herkese kolay gelsin :)

12 Kasım 2009 Perşembe

LinqToXml ve RSS

Herkese merhabalar;
Bu yazımda LinqToXml'e bir giriş yaparlen günlük hayatımızda önemli bir yer etmeye başlayan RSS verilerini alarak web sayfamızda görüntülemeye çalışacağım.

Öncelikle bir web uygulamamıza bir user control ekleyelim ve bu user control'de RSS'lerin property bazda tutalım ve daha sonra ana sayfamızda bu RSS'leri görüntüleyelim.

Uygulamamıza eklediğimiz web user control'e ilgili adresteki RSS'imizi parse edicek Linq kodumuzu yazalım.

13 public string adres { get; set; }

//Öncelikle RSS'imizi alacağımız adresi tanımlayalım

14 rotected void Page_Load(object sender, EventArgs e)

15{

1if (!String.IsNullOrEmpty(adres))

//En basitinden adresin valid ya da null olup olmadığını kontrol edelim.Çok çeşitli hatalar alabiliriz ama şimdilik bu kontrol bize yeterli olacaktır.


17 {

18 try

19 {

20 XElement xelement = XElement.Load(adres);

//XElement XML elementini temsil eder.Linq ile sorgulayacağımız RSS'teki XML nesnelerini bu elemente alacağız.


21

22 var items = from i in xelement.Element("channel").Elements("item")

//Burada XML nesnemizin içine giriyoruz.

Benim bu uygulamamda kullandığım RSS http://umutluoglu.com/syndication.axd adresindeki XML nesneleri olacak.Bu adrese girip sayfaya sağ tıkladığınızda XML dosyasında XML yapısını görebilirsiniz.


23 select new

24 {

25 Title = i.Element("title").Value,

26 PubDate = Convert.ToDateTime(i.Element("pubDate").Value),

27 Description = i.Element("description").Value,

28 Link = i.Element("link").Value

29

30 };
//XML nesnesinin özelliklerine görüdüğünüz gibi i.Element("propertiadi") olarak erişebiliyorum.

Sorgumdan geri dönen XML nesnelerimi bir foreach döngüsüne sokarak istediğim işlemi yapabilirim.Ben geri dönen nesnelerimi bir hyperlink olarak göstericem böylece ilgili adresteki RSS lere link referansı vermiş olacağım.


31 foreach (var item in items)

32 {

33 HyperLink hlink = new HyperLink();

34 hlink.Text = item.Title;

35 hlink.NavigateUrl = item.Link;

36 hlink.ToolTip = item.Description;

37 Controls.Add(hlink);

38 Controls.Add(new LiteralControl("<br/>"));

39

40 }

41 }

42 catch (Exception ex)

43 {

44 Label label = new Label();

45 label.Text = ex.Message;

46 Controls.Add(label);

47 }

48 }

49 }


//User controlünü hazırlamayı bitirdik.Şimdi uygulama sayfamıza dönelim.Uygulamamıza hazırladığımız bu user controlü sürükleyip bırakalım.

//Daha sonra uygulamamıza göre isterseniz direk html içinden isterseniz code behinddan
14 WebUserControl11.adres = http://www.umutluoglu.com/syndication.axd;
//olarak atamamızı yapıp programımızı çalıştıralım.



RSS'ler geldi.:)
Herkese kolay gelsin.

2 Eylül 2009 Çarşamba

World Science Festival 2009

Merhabalar;

Biraz geç yakalamış olduğum bir festivali paylaşmak istiyorum.11-14 Haziran 2009 tarihlerinde yapılmış olan World Science Festival ilginizi çekicektir.Çok ilginç konular var.Benim en çok ilgimi çeken ise Notes&Neurons : In Search of the Common Chorus başlığı oldu.Müzik beynimizde ne etkiler yapıyor ya da beynimiz müziği nasıl etkiliyor gibi ilginç konular var izlemenizi tavsiye ederim.Özellikle Bobby McFerrin'e dikkat:)

www.worldsciencefestival.com

Herkese iyi seyirler:)

19 Ağustos 2009 Çarşamba

Sayısal Türev

Merhabalar;

Türev bir fonksiyona ilişkin bir eğrinin herhangi bir X noktasındaki teğetinin eğimidir.

Sonlu fark tablolarında kullandığımız ileri,geri ve merkezi farkları kullanarak bir fonksiyonun sayısal türevini kolaylıkla hesaplaybiliriz.

ehDºEº1+Δº(1-∇)-1
*Bu bağıntıyı sonlu farklardan biliyoruz.

İleri Farklar İle Sayısal Türev Hesabı

ehD=1+Δ
hD = ln(1+Δ)=Δ-Δ2/2+Δ3/3-Δ4/4....
D = 1/h(Δ-Δ2/2+Δ3/3-Δ4/4....)
Dyi = 1/h(Δyi2yi/2+Δ3yi/3-Δ4yi/4....)
Dy = y¢
O halde 1. türevimizin değeri:
y¢=1/h(Δyi-Δ2yi/2+Δ3yi/3-Δ4yi/4....)
2.Türevi hesaplamak istersek:
h2D2= Δ23+11/12*Δ4...



y'nin k. dereceden türevine ilişkin genel formül;

yi(k) = 1/h(k)kyi-k/2(Δ(k+1)yi)+k(3k+1)/24(Δ(k+1))yi...)


Herkese Kolay gelsin=)

Ara Değer Hesabı - En Küçük Kareler Yöntemi(Least Square Method)

Merhabalar;
En küçük kareler yöntemi (Xi,Yi) i=0,1,2... noktalarının birikme gösterdiği noktalardan geçen bir fonksiyonun bulunması yöntemidir.
Bulunan fonksiyon çoğu noktayı sağlamayacaktır ancak noktaların bulunabileceği bir sonraki adımı hesaplayabilir.EKK problemi dolayısıyla aslında bir optimizasyon problemidir.
Elimizdeki her (Xi,Yi) için;

y = A0 + A1 X1 + ... + An Xin geçerlidir.
y'yi karşıya atarsak;

0£(Ya da ³) A0 + A1 X1 + ... + An Xin - Yi haline gelir
Her tarafın karesini alırsak;

0£(A0 + A1X1 + ... + AnXin - Yi)2 haline gelir.

Noktalar bütün fonksiyonu sağlamayacağı için 0'dan farklı değerler gelecektir.Bizim amacımız bu farkın en küçük olmasını sağlamak.

Her nokta için aynı işlem yapılır ve bu farklar toplanırsa elimizde şöyle bir fonksiyon olur;

H(A0,A1,A2..An) = Σ (A0+A1X1+..+AnXin)2
Toplamını 0'a eşitleyip her katsayı için ayrı ayrı türevler alınırsa elimize katsayıların çözümü için bir lineer sistem gelir.
dH / dA0 = 0
dH / dA1 = 0
.
.
dH / dAn = 0
Son olarak lineer sistemimizi kurar ve katsayıları bulur yerine koyarız.Böylece fonksiyonumuzu elde ederiz.
Bir örnek çözelim.

Örnek:(1,3.0),(2,5.2),(3,8.0) noktalarından geçen en uygun doğruyu bulun.
Soruda noktaların bir doğru etrafında toplandığı verilmiş.
En uygun doğrumuz y = Ax + b olsun
H(A,B) = (A*X0 + B - Y0)2 +(A*X1 + B - Y1)2 +(A*X2 + B - Y2)2
H(A,B) = (A+B -3)2 + (2A+B-5.2)2 + (3A+B-8)2

dH / dA = 28A+12B - 74.8 = 0
dH/dB=12A+6B-32.4=0
Bu denklem sistemini çözdüğümüzde A=2.5 B=0.4 geliyor.
En uygun doğrumuz y = Ax + B idi.
Yerine koyarsak y = 2.5A + 0.4 sorumuzun cevabı olur.
Herkese kolay gelsin =)

17 Ağustos 2009 Pazartesi

Sayısal Çözüm Yöntemleri - Sabit Kesen Yöntemi (Regula-Falsi)

Merhabalar;

Sabit kesen yöntemi(False position method - Regula Falsi) bisection method ve secant methodun kombinasyonu şeklindedir.y=f(x) verilen [a,b] aralığında sürekli ve f(a)*f(b)<0 (yani verilen aralıkta fonksiyonun bir kökü bulunması gerekiyor.)Aralığı bisectiondan farklı olarak ağırlıklı ortalamaya bölerek adımlarımızı ilerlettiğimizde k.adımın limit durumunda bulduğumuz ağırlıklı ortalama fonksiyonun köküne eşittir.Hangi aralıkta devam etmemiz gerektiğine ise;

f(a)*f(w)<0>f(w)*f(b)<0 ise yeni aralık [w,b]

w = ( a*f(b) - b*f(a) ) / (f(b) - f(a))


Bir örnek çözelim.

Örn:f(x) = x3 - x -1 = 0 fonksiyonunun [1,2] aralığındaki kökünü bu sefer regula falsi ile bulalım.
1.Adım

f(1) = -1
f(2) = 5
w = ( 1*5 - 2*(-1) ) / ( 5 - (-1)) = 1.16667
f(w) = (1.16667)3 - 1.16667 - 1 = -0.57869
f(1.16667)*f(2)<0 yeni aralık [1.16667,2]

2.Adım

f(1.16667) = -0.57869
f(2) = 5
w = (1.16667*5 - 2*(-0.57869)) / (5-(-0.57869)) = 1.25311
f(w) = f(1.25311) = -0.28537
f(1.25311)*f(2)<0 yeni aralık [1.25311,2]

SolSınır SağSınır

1.00000 2.00000
1.16667 2.00000
1.25311 2.00000
**
**
**
1.32572 2.00000

16.adımda gelen sonuç.Fark ettiyseniz sabit kesen yöntemi kökün uzak olduğu sınır değerini sabit kalıyor. Regula-Falsi bisection methoddan daha iyi yakınsar.


Herkese kolay gelsin=)


16 Ağustos 2009 Pazar

Sayısal Çözüm Yöntemleri - İkiye Bölme Yöntemi(Bisection Method)

Herkese Merhaba ;

y=f(X) verilen bir [a,b] aralığında sürekli ve f(a)*f(b)<0>

f(a)*f(c)<0>f(c)*f(b)<0>
Bir örnek çözelim.

Örn: y = f(x) = x3 - x -1 = 0 fonksiyonunun [1,2] aralığındaki kökünü bisection method ile bulunuz.

1.Adım:
f(1) = 13 -1 -1 = -1
f(2) = 23 -2 - 1 = 5
c =( 1 + 2 ) /2 = 1.5
f(c) = 1.53 - 1.5 - 1 = 0.875000
f(1)*f(1.5) ters işaretli.Yeni aralık [1,1.5]

2.Adım:
f(1) = -1

f(1.5) = 0.87500
c = (1 + 1.5)/2 = 1.25
f(c) = f(1.25) = 1.253 - 1.25 - 1 =-0.29688
f(1.25) ve f(1.5) ters işaretli.Yeni aralık [1.25,1.5]

SagSınır SolSınır
1.00000 2.00000
1.00000 1.50000
1.25000 1.50000
* * *
* * *
1.324717 1.324718
20. adımda karşımıza gelen sonuç. Bisection method çok zor yakınsayan bir yöntemdir.


Herkese kolay gelsin=)



28 Haziran 2009 Pazar

GridView Kullanımı3-Sahalara Button,Hyperlink..vs tarzı kontroller atamak

Herkese Merhaba;

GridView'a bağladığımız verilerin sahalarını sadece text olarak görüntülememiz gerekmiyor.Herhangi bir sahasını button,hyperlink,image gibi tanımlayıp tasarımımızı güçlendirebiliriz.
Bir GridView tanımladığımızda default olarak içindeki sahaların tümü text olarak oluşturulur.Ancak biz bunların hangilerini görüntüleyip görüntülemeyeceğimize karar verip istediğimize button kontrolleri atayabiliriz.Bunun için öncelikle Source kodumuzda GridView'a AutoGeneratedColoums="false" eklememiz gerekir.Böylece bütün sahalar otomatik olarak gösterilmez programcının kontrolüne bırakılır.
Görüldüğü gibi GridView'daki sahaları ne türde kullanabileceğimiz otomatik olarak geldi

AutoGenerateColoums="False" yaptığımız için artık satırları kendimiz oluşturmamız gerekiyor.Bunu da colums bloğu içine GridView'un sahalarını ekleyerek yapabiliriz.
Şimdi bir ButtonField ekleyelim.





Şimdi ButtonField'ın içindeki sahalara göz atalım.

DataTextField: Button olarak tanımlanan saha veri tabanından çektiğimiz verinin hangi sahası olacak.(Tablodaki isimle aynı olmak zorunda!)

HeaderText: Bu sahanın başlığının adı.
Şimdi bu ButtonField'a bir event bağlayalım.

Şimdi GridView'a bu buttonlara tıklandığı zaman ne yapılacağını belirtmek için
OnRowCommand özelliği ekliyoruz ve eventin adını veriyoruz.Artık GridView'umuz bu buttonlara gelen eventleri karşılamaya hazır!.

protected void Tiklama(object sender, EventArgs e)
{
//doSomething()
}


Kolay gelsin:)

GridView Kullanımı2-Database'den Veri Çekmek

Herkese Merhaba;
Daha önceki yazımda hiç koda girmeden sihirbaz yardımıyla verileri GridView'a bağlayabilmiştik.Ama fark ettiğiniz gibi tasarımın içinde sorgular,bağlantı cümlecikleri vs..Karmakarışık bir kod üretti hemde tasarım kodlarının içine!. Şimdi asp.net'in nimetlerinden code-behind programming i kullanarak verilerimizi tasarıma hiç kod yazmadan projemizin .cs uzantılı dosyası vasıtasıyla verilerimizi GridView'a bağlayalım.
Bir GridView sürükleyelim ve .cs uzantılı dosyamıza şunları ekleyelim:

21 SqlConnection conn = new SqlConnection();
22 conn.ConnectionString = "Data Source=CAGDAS;Initial Catalog=Deneme;Integrated Security=True";
23 SqlCommand cmd = new SqlCommand();
24 cmd.CommandText = "select * from Urunler";
25 cmd.Connection = conn;
SqlConnection : Bir bağlantı nesnesi tanımlar.
Conneciton String: Bağlantı cümleciğidir.Bağlantıyı seçtiğimiz veritabanıyla ilişkilendirir.
SqlCommand : Veri tabanı üzerinde sorgulama yapmamızı sağlayan nesnedir.
Command Text : Sorgu cümlesidir.
Connection : Sorgu nesnesini veri tabanıyla ilişkilendirir.
Bu arada sorgu nesnemiz sadece sorgu cümlesi olmak zorunda değil.Eğer veri tabanına daha önceden bir store procedure kaydettiysek onu da kullanabiliriz.Komut textine spnin adını verip cmd.CommandType = CommandType.StoreProcedure
ifadesini koymamız yetecektir.

28 DataSet ds = new DataSet();
29 SqlDataAdapter adapter = new SqlDataAdapter();
30 adapter.SelectCommand = cmd;
31
32
33 adapter.Fill(ds);
DataSet: Veri temsil eder.
SqlDataAdapter: Veri tabanından gelen veriyi dataset'e doldurur.
SelectCommand :Veri tabanından gelicek veriler hangi komut vasıtasıyla çekilcek.
Fill : Adapter nesnesindeki veriyi data sete doldurur.
Evet herşey hazır.Şimdi bağlantımızı açalım ve GridView'a veriyi bağlayalım.
37 conn.Open();
38 GridView1.DataSource = ds;
39 GridView1.DataBind();
40 conn.Close();
Burda unutmamamız gerek nokta GridView'un veri kaynağına bir kaynak gösterdikten sonra DataBind() metodunu kullanmamızdır.this.DataBind() da kullanılabilir.Eğer bu metodu kullanmazsak görüntü elde edemeyiz.
Herkese kolay gelsin:)

GridView Kullanımı1-Verileri Sihirbazla GridView'a Aktarma

Asp.Net 2.0 ile gelen veri kontrollerinden rutin işlerimizi çok kolaylaştıran GridView kontrolüne bir göz atalım.Öncelikle Visual Studiomuzun toolboxından açtığımız website'ye bir GridView sürükleyelim.Sürükleyip bıraktığımızda Default.aspx'in source'una ,bu kontrole dışardan erişeceğimiz bir identifier(ID) ve bu kontrolün server tarafından çalışan bir kontrol olduğunu belirten runat="server" ifadesi geliyor.Design tarafında ise şöyle bir görüntü oluşuyor.

Şimdi bu oluşturduğumuz kontrole veri tabanından çektiğimiz verileri bağlamaya çalışalım.Bu veri bağlama işini bir kaç şekilde yapabiliriz.Bunlardan en basiti hiç koda girmeden GridView'un sihirbazını kullanıp veritabanı kaynağını ve veritabanında istediğimiz tabloyu istediğimiz sorguyla GridView'umuza bağlayabiliriz.

GridView'u bir sihirbaz gibi kullanıp verilerimizi bağlamaya çalışalım.GridView'un sağ üst köşesindeki ok dikkatinizi çekmiştir.Ona tıkladığımızda hiç koda girmeden GridView üzerinde yapabileceğimiz işlemleri görebiliriz.

Choose Data Source seçeneğinde default olarak none gelir.Biz GridView'a şimdi bir veri kaynağı verelim.Verimizi nerden alacağımızı seçelim.Herkes verilerini tuttuğu veri tabanına göre seçim yapabilir.Alt tarafta gördüğümüz sahaya da bu kaynağa koddan erişebileceğimiz bir ID veriyoruz.Sıra hangi veritabanı üzerinde işlem yapacağımızı seçmeye geldi.Veritabanımızı da seçtikten sonra artık tablolarımız sorgulamaya hazır bir hale geldi.İstedğimiz tabloyu seçip bir sorgu hazırlayalım.Tabloyu seçtiğimizde alt tarafta bilgilerini getirebileceğimiz sahalar otomatik olarak çıkıyor.SELECT * FROM [Urunler] sorgusunu yaratalım ve test edelim.





Gördüğümüz gibi sorgularımızı GridView'a yansıtmadan önce sihirbaz yardımıyla sonuçlarımızı test edebiliyoruz.
İşlemimizi tamamlayalım. Kodumuzu çalıştırdığımızda sorguladığımız veriler sayfamızda görüntülendi:)