19 Aralık 2008 Cuma

ASP.net AJAX Extensions

Visual Studio 2005 inizde web projesi oluştururken toolbox ınızda AJAX Extensions bölümü yoksa buradan indirip bilgisayarınıza setup ı kurun.
AJAX Extensions ScriptManager, UpdatePanel gibi önemli kontrolleri bulundurur. Örneğin internetten bulduğunuz bir Ajax tool kullanacaksınız, sayfanızda bir tane ScriptManager, ve sayfada server a gidecek yerin UpdatePanel içinde olması gerekmektedir. Yani Ajax kullanılan yerde bu extensions lar olmak zorundadır.

16 Aralık 2008 Salı

Visual Studio 2008 C# klavye kısayolları posteri

Daron Hocamızın açıklamasa hiç haberimizin olmayacağı :) Visual Studio 2008 de C# ile kod yazarken ihtiyacımız olan bütün klavye kısayolları. Görmeyenler için buradan da duyuruyorum. Artık kod yazarken mouse a son.
Kullanmadığımız ne kadar da çok kısayol varmış meğer. Posteri buradan indirebilirsiniz.

15 Aralık 2008 Pazartesi

C# Konsol Uygulamalarında Global Değişken

C# konsol uygulamalarında global değişken tanımlanamıyor. Global değişkenler tanımlandığı alandaki, fonksiyonlarda tekrar tanımlanmaya gerek duymadan kullanılabilen değişkenlerdir. Konsol uygulamalarında global değişken tanımlama yok, bunun yerine;
static int sayi = 0;
tanımlanıp global değişken gibi kullanılabilir.

11 Aralık 2008 Perşembe

Resim Üzerine Yazı Yazma

Resim üzerine yazı yazma konusu herkesin bildiği bir şey. Graphics sınıfı kulanılarak istenen yere drawSring fonksiyonuyla yazı yazılır.
Sorun şurda, birden fazla resimler üzerine reklam amacıyla bir yazı yazmaya çalışıtığınızda farklı resimlere aynı font büyüklüğü değerini kulanılmıyor, tahmini bir değer de verilmiyor. width 100px olan bir resme 10 font büyüklü olursa, 200px olan bir resme 20 font büyüklüğü olur mantığı yanlıştır ve çalışmaz. Gerçek örnekler üzerinden gidersek 1600x1200 olan bir resimde font büyüklüğü bir arttığında resim üzerinde yazılan yazının büyüklüğü 42px kadar artar, fakat 900x1250 olan bir resimde ise 10px kadar artar. O yüzden kafamızdan bir font büyüklüğü belirleyemiyoruz.
Bir zamandır bununla uğraşıyordum bunu nasıl otomatik bir hale getirebilirim diye. Kodunu paylaşmak istedim. Alınan resmin tam ortasına yazılması istenen yazıyı yazıyor.

int fontSize = 1;
bool enough = false;
SizeF f = new SizeF();
string name = ""; // buraya serverda olan resmin adını yazıyoruz mesela a.jpg
Bitmap bmp = new Bitmap(Server.MapPath("~/resim/" + name));
Graphics g = Graphics.FromImage(bmp);
StringFormat format = new StringFormat(StringFormatFlags.FitBlackBox);
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
while (enough == false)
{
f = g.MeasureString("www.xx.com.tr", new Font("Verdana", fontSize, FontStyle.Regular));
if (f.Width <= bmp.Width - 40) //40 değeri formatta verilen dikdörtgenden dışarı çıkmaması için öylesine verilmiş bir değerdir
{
fontSize++;
}
else if (f.Width > bmp.Width - 40)
{
enough = true;
}
}
g.DrawString("www.xx.com.tr", new Font("Tahoma", fontSize, FontStyle.Bold), Brushes.White, new RectangleF(10, bmp.Height / 3, bmp.Width - 20, bmp.Height / 3), format);
bmp.Save(Server.MapPath("~/yaziliResim/Written" + name)); //resmin yazılmış şeklini kaydetme

11 Kasım 2008 Salı

C++ Dizi İşlemlerinde Dikkat Edilmesi Gerekenler

Bu yazıda C++ kullanıcıları için çok önemli bir şeye değineceğim. Bunu da edindiğim acı tecrübeden yola çıkarak yazıyorum. C++ bildiğimi zannederdim, okulda hocamızın verdiği ödevde uzun zaman sonra C++ kullanmam gerekiyordu. 2 gün boyunca boş zamanlarımda sadece char dizisini almaya ve bunu print etme işlemine çalıştım inanın. Bu ödevin önemli bir kısmını tamamlamış bulunuyorum :). Bu ödevi yaparken karşılaştığım ve yapılması yüksek ihtimal mantık hatalarından bahsedeceğim. Bu konulara hakim olup dikat etmeniz önemli. Bu sorunlarla ben karşılaştım başkaları karşılaşmasın. Bi göz atmanızı tavsiye ederim.
Aşağıda anlatacağım işlemlerde char* array = new char[20]; dizisini kullanacağım.

1 - Öncelikle 20 karakter tutabilecek bir diziye bellekten yer ayırdık. Şimdi buna array[0] = 'a'; değerini atayalım ve print edelim. a___-----_İİİ gibi anlaşılmaz şeyler print edecektir. Bunun için yer ayırdığımız dizinin her bir elemanını dolaşarak temizlemeliyiz.
for(int i=0 ; i<20;>i++)
{
array[i] ='\0'; // \0 null demektir.
}


2 - Şimdi bu diziye ilk değer olarak array[0] = 'a'; atadık. Biliyorsunuz ki dizinin son elemanından sonra null değeri vardır bu da dizinin bittiği anlamına gelir. O yüzden bu diziyi başka işlemlerde kullanacaksanız, sonunu null yapmazsanız hata alma olasılığınız çok yüksektir. Bunu önlemek için de verdiğimiz en son değerden sonraki değeri null yapmalıyız. Yani array[1] = '\0'; değerini mutlaka vermeliyiz.

3 - array[0] = '2' ile array[0] = 2 aynı şey değildir bunu çoğu kimse bilir yine de buraya ekleyip hatırlatmanın iyi olacağını düşündüm.

4 - Uzunluk ile ilgili problem. Programda int uzunluk = strlen(array); diye uzunluğu bulduk diyelim ve uzunluk = 5 olsun, dizinin de dolu olduğunu düşünelim. Dizide array[uzunluk] = 'a'; demek veya for döngüsü içinde
for(int i=0 ; i <= uzunluk; i++) {
array[i] ='a';
}
bu şekilde kullanmak programın runtime ında hataya sebep olacaktır. Çünkü diziler indis olarak 0 dan uzunluk - 1' e kadardır.

5 - Dizinin ilk 0 elemanının dolu olduğun düşünelim. 'ahmetuzun'. array[1] = '\0' yani dizinin ikinci elemanının değerini null yapıyoruz. Diziyi print ettiğiniz zaman ekrana gelen a olacaktır. strlen(array) in sonucu da 1 olacaktır. Yani dizi dolu olsa bile, null değerini koyduğumuz yerden sonraki veriler kaybolur.

6 - Şimdi yeni bir dizi tanımlıyoruz. char* temp = new char[20]; bu dizi genelde geçici bir dizi olarak tanımlanır ve işi bittiğinde silinir. temp dizisini tanımladık ve temp dizisine temp = array diyerek yukarıda tanımlamış olduğumuz diziyi atadık. Daha sonra temp dizisini kullandık ve delete[] temp; diyerek bu diziyi bellekte boşuna yer kaplamasın diye sildik.
Eğer bu şekilde yaparsanız array dizimizde silinir. Çünkü bu diziler referansa göre çağırılırlar. Yani çağırılan dizinin bellek adresine bakılır. temp = array demekle bu iki dizinin bellek adreslerini bir yapmış oluyoruz. Bu yüzden temp silinirse array de gider. Zaten görüldüğü üzere burada temp dizisiyle array dizisi bellekte aynı yeri kapladığı için silmeye gerek de yok.

Daha bu tarz yapılabilecek hatalar varsa eklerim. Sizlerin bildiğiniz bu tarz hatalar varsa onları da eklerim :D

1 Kasım 2008 Cumartesi

Traceroute

Yazmayalı uzun zaman olmuş ben bile şaşırdım kendime, yazmayınca içimde bir eksiklik hissettim. Her neyse konumuza dönelim.
İnternete herkes hayrandır şahsen ben hep şaşırırım nasıl bu kadar büyük bir ağ oluşturmuşlar ve bu ağ hiç takılmadan çalışıyor. İçinde çalışan protokoller ve application ları söylemiyorum bile.
İnternete girdiğmizde örneğin milliyet in sitesine tıkladığımızda acaba hangi router lar üzerinden geçip milliyetin server ına ulaştığımızı biliyor muyuz? Bunu öğrenmenin yolları var.
Traceroute sitesine girip bulunduğunuz ip adresini ve gitmek istediğiniz web sitesinin adını veya ip adresini yazdığınızda size nerelerden geçtiğini söylüyor. Bu nasıl çalışıyor anlatmayacağım çok uzun, fakat sonuçta bize bir şey dönüyor bu dönen verilerin ne olduğundan bahsedeceğim.
İkinci yol websitesine girmeye gerek kalmadan komut ekranından (dos) yapılabilir. Komut satırına şunu yazmamız gerekiyor [tracert www.milliyet.com.tr] Aynı işlemi yapacaktır.
Üçüncü yol program aracılığı ile PingPlotter. Bu program yardımıyla da trace işlemleriniz daha efektif bir şekilde yapabiliyorsunuz. Efektiften kastım ne yani, kaç defa trace yapacağımızı söyleyebiliyoruz, çıkan sonuçları grafiksel bir arayüzde görebiliyoruz ve bunları bilgisayarımıza kaydedebiliyoruz falan filan.
Sonuç olarak ne çıkıyor ona bakalım.
www.milliyet.com.tr [83.66.140.10]'ye izleme yolu :
1 89 ms 2 ms 1 ms 10.0.0.1
2 78 ms 76 ms 84 ms 192.168.1.1
3 56 ms 57 ms 86 ms 88.234.40.1
4 * * * istek zaman aşımına uğradı
5 85 ms 77 ms 85 ms 212.156.107.38
6 76 ms 58 ms 72 ms 81.212.25.109
7 78 ms 95 ms 93 ms 212.174.75.142
8 66 ms 61 ms 94 ms 83.66.140.10
Birinci kolon, ana server a ulaşmak için toplam kaç router dan geçtiğini belirtiyor.
İki, üç ve dördüncü kolon, yanında ip adresi bulunan routerlara geldiğinde, bu routerdan çıkabilmek için ne kadar gecikme süresi olduğunu belirtiyor. Bu izleme siz bir defa komutu yazsanız bile 3 defa yapılıyor. Sırasıyla, bu kolonlarda bulunan süreler de yapılan üç izlemenin sırasıyla gecikme süreleri.
Dördüncü kolon, geçtiği router ın ip adresi.
Eğer siz de denerseniz bu ip adreslerin yanında bir de ip adreslerine atanmış router ların isimleri vardır onları da görebilirsiniz.
Bu nerde işimize yarar diyelim bir web siteniz var ve siz ona ulaşamıyorsunuz veya çok geç ulaşıyorsunuz. Bu şekilde web sitenize ulaşıncaya kadar trace işlemi yaparsınız. Geçtiğiniz routerlarda bir problem olabilir veya router dan geçme süresi çok uzun olabilir. Sorunu saptayıp çözüme bir adım daha yaklaşırsınız.
Şunu da belirteyim. Bazı routerlarda firewall vardır ve trace işleminde bize bilgilerini vermez.

9 Eylül 2008 Salı

LINQ to SQL

Veritabanını sorgulamak için linq to sql kullanacağız.
Herhangi bir veritabanına ait bir tabloyu sorgulamak için projenizin içerisine Add->New Item->LINQ To SQL Classes eklemeniz gerekiyor. Bu bize projemizde .dbml uzantılı bir sayfa daha oluşmasını sağlıyor. Sonra sorgulamak istediğimiz tabloları Server Explorer dan bu sayfa üzerine sürükleyip bırakmalıyız. Biraz sonraki örneklerde Northwind veritabanı ve içinde calisanlar ve siparisler veritabanı kullanılmıştır.
Şimdi öncelikle kod kısmında yeni oluşturduğumuz sayfayı kullanabilmek için bir kopyasını alalım
NorthwindDataContext db = new NorthwindDataContext();

Ex1: Calisanlar tablosundan unvanı Mr. olanları çekelim. Bunu ilk önce bildiğimiz yöntemle yapalım aradaki fark anlaşılsın diye.
string baglanti = "Server=.; Database=Northwind; Integrated Security=SSPI;";
SqlConnection con = new SqlConnection(baglanti);
DataTable calisanlar = new DataTable();
SqlDataAdapter da = new SqlDataAdapter("Select * from calisanlar where unvan='Mr.'", con);
da.Fill(calisanlar);
dataGridView1.DataSource = calisanlar;
Şimdi de eşdeğer LINQ sorgusu
var calisanlar = from n in db.Calisanlars
where n.Unvan == "Mr."
select n;
dataGridView1.DataSource = calisanlar;

Ex2: Calisanlar ve siparisler tablosunu birleştirerek calisanID, adSoyad, ulke, unvan ve nakliyeUcretleri alanlarından ilk 10 tanesini alan LINQ
var calisanlar = (from c in db.Calisanlars
from s in db.Siparislers
where c.CalisanID == s.CalisanID
select new { s.CalisanID, adSoyad = c.Ad + " " + c.Soyad, c.Ulke, c.Unvan, s.NakliyeUcreti }).Take(10);

Ex3: Veri tabanına yeni bir kayıt ekleyelim.
Calisanlar calisan = new Calisanlar();
calisan.Ad = "Ahmet";
calisan.Soyad = "Kısa";
calisan.Unvan = "Mr.";
calisan.DogumTarihi = DateTime.Now;
db.Calisanlars.InsertOnSubmit(calisan);
db.SubmitChanges(); //Veri tabanına değişikleri kaydediyor. Adapter nesnesinin Update metodu gibi.

Ex4: Soyadımı yanlış yazmışım onu UPDATE edelim.
Calisanlar calisan = db.Calisanlars.First(c => c.Ad == "Ahmet");
calisan.Soyad = "UZUN";
db.SubmitChanges();

Ex5: Birden çok kayıt olursa UPDATE etmek istediğimiz. Calisanlar tablosunda bolge alanları boş bırakılmış en azından o alanlara boş yazalım.
var calisanlar = from c in db.Calisanlars
select c;
foreach (var calisan in calisanlar)
{
calisan.Bolge = "yok";
}
db.SubmitChanges();

Ex6: Yabancıların yanında benim adım iyi durmadı onu SİLelim.
var silinecek = from c in db.Calisanlars
where c.Ad == "Ahmet" && c.Soyad == "UZUN"
select c;
db.Calisanlars.DeleteAllOnSubmit(silinecek);
db.SubmitChanges();

Her türlü örnekten bir tane yapmaya çalıştım. Fazlasını herkes kendisi yapsın.
İşte size baka baka ömrünüzün yetmeyeceği LINQ örnekleri (37Kb) Microsoft çalışanı bir abimizin bloğundan almıştım ismini hatırlayamadım :(.