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 :(.

5 Eylül 2008 Cuma

LINQ

LINQ (Language Integrated Query) : .net 3.0 ile gelen bir yenilik. Veri tabanında select işlemleri yapmayı sevenler için süper bir özellik. Normalde yazmamız çok zaman alacak işlemleri LINQ sayesinde çok kısa bir zamanda yapabiliyoruz. Değişik çeşitleri var LINQ, LINQ to SQL, LINQ to XML vb...
Ben şimdi genel anlamda proje içinde dizilerde yapacağımız bazı örnek sorgular yapacağım başlangıç olsun diye sizinde dikkatinizi çekecektir ne kadar kolay olduğu. Belki de buradan görüp de öğrenmeye başlayanlar olabilir diye de bir başlangıç yapayım dedim ;).
Öncelikle şunu belirteyim var değişkeni. Javascriptte bulunan var değişkeni burada da aynı mantıkla kullanılıyor içinde her türlü veri tutabilen bir nevi object nesnesi tarzında bir değişken.

int[] sayilar={3,2,5,6,1,2,8,9,0};
var bulunan = from n in sayilar
where n <= 6 orderby n
select n;
6 dan küçük sayıları bularak bunları küçükten büyüğe sıralayan kodumuz bu kadar. Tamamen anlaşılır bir şekilde ve select, from, where kalıbına çok benzer.

string[] names = { "aHmet", "uZuN", "IsTanBul", "bUrSA" ,"AHmet"};
var withLowerUpperLetters = (from n in names
orderby n
select new { Lower = n.ToLower(), Upper = n.ToUpper() }).Distinct();
string sonuc = "";
foreach (var v in withLowerUpperLetters)
{
sonuc += v.Lower + " ";
}
sonuc += "\n";
foreach (var v in withLowerUpperLetters)
{
sonuc += v.Upper + " ";
}
MessageBox.Show(sonuc);
Diziyle verilen isimleri alıp onları büyük ve küçük harflere çeviren LINQ ve devamı. Aynı olan isimleri ikinciye almaz.

son örnek olarak;
string sonuc = "";
int[] sayilar = { 0, 2, 3, 7, 8, 9, 6, 4, 1 };
var numberGroups = from n in sayilar
group n by n % 5 into g
select new { g.Key, numbers = g };
foreach (var g in numberGroups)
{
sonuc += g.Key + " kalanı verenler ";
foreach (var n in g.numbers)
{
sonuc += n+" ";
}
sonuc += "\n";
}
MessageBox.Show(sonuc);
sayilar dizisindeki elemanları 5'e bölümünden kalan sayılarına göre gruplayan LINQ.
Şimdilik bu kadar. LINQ to SQL de görüşmek üzere. Herkese kolay gelsin.

20 Ağustos 2008 Çarşamba

Popüler Programlama Dilleri

Tiobe software ın yaptığı bir araştırma. Popüler programlama dillerini araştırmışlar. Kriterleri de güzel aslında, o dille toplamda kaç satır yazıldığına bakılmamış google,yahoo gibi popüler arama motorları kullanılmış, o dilde yazılmış olan 3rd party yazılımlara ve o dili kullanan dünya çapında bulunan mühendislerin sayıları gibi kavramlar ile dilin popülerliğini artırmışlar.
Listeyi görmek için buraya tıklayın.
Ben ilk gördüğümde çok şaşırdım C ve C++ ilk 4 te fakat C# yok. Ama grafiklerine bakılınca C# yükselişte. Her ay güncelleniyormuş bu liste. İleride ne olacak göreceğiz. Yine de Javanın bu popülerliğini kaybedeceğine inanmıyorum.

19 Ağustos 2008 Salı

C#'ta Transaction işlemi

Veri tabanından bildiğimiz transaction işlemlerini C# üzerinde veriTabanı bağlantılı projelerimizde de kullanabiliyoruz.
İlk önce nedir bu transaction sen neden bahsediyon kardeşim diyen olur kısaca, veri tabanı üzerinde yaptığımız değişikliklerde bir hata oluşması durumunda veya oluşmaması durumunda :) size kalmış o anda yapılan değişikleri geri alabiliyorsunuz (rollback tran) veya yapılan değişikleri artık veri tabanında gerçek yerine kaydet diyebiliyorsunuz (commit). Çünkü yapılan işlemler ram üzerinde olur commit derseniz veri tabanında ilgili yerlerde güncelleme yapılır rollback derseniz güncelleme yapılmaz eski hali kalır.

sp_calisanSil stored procedure
create proc [dbo].[sp_calisanSil]
@calisanID int

AS

delete from siparisDetaylari where siparisID IN(select siparisID from siparisler where calisanID = @calisanID)

delete from siparisler where calisanID = @calisanID

delete from calisanMemleket where calisanID = @calisanID

delete from calisanlar where calisanID = @calisanID

[C# kodu]
SqlConnection con = new SqlConnection("Data source=.; Initial Catalog=Northwind;Integrated Security=SSPI;");
SqlCommand cmd = new SqlCommand("sp_calisanSil", con);

cmd.CommandType = CommandType.StoredProcedure;

con.Open();

SqlTransaction tr = con.BeginTransaction();

cmd.Transaction = tr;
cmd.Parameters.AddWithValue("@calisanID", int.Parse(txtCalisanID.Text));
try
{
cmd.ExecuteNonQuery();

tr.Commit();
}
catch (Exception ex) {
tr.Rollback();
MessageBox.Show(ex.Message);

}

finally {
if (con.State != ConnectionState.Closed)

con.Close();
}
Burada görüldüğü gibi bir çalışanı silmek için ilk önce siparisDetaylari, siparisler, calisanMemleket ve calisanlar tablosundaki silinmek istenen calisana ait bilgiler silinmelidir. Eğer bu sırayı yanlış yaparsak örneğin siparisDetaylari, calisanMemleket, siparisler, calisanlar diye siparisDetaylari ndaki veri silinir calisanMemleket teki veri silinmez ve sp bundan ileriye gitmez hata verir bu şekilde veri bütünlüğü bozulmuş olur. Bizim örneğimizde eğer bu şekilde hata olursa yapılan işlemler geri alınır (tr.Rollback()). Eğer hata oluşmazsa değişikler veri tabanı üzerine yazılır (tr.Commit())
Normal bağlantıdan farkı SqlTransaction nesnesi. Bu nesneyi, connection nesnesi ile transaction başlatıp eşitliyoruz, command nesnesinin transaction özelliğine transaction nesnesini veriyoruz ve gereken yerlerde commit ve rollback kullanıyoruz.

11 Ağustos 2008 Pazartesi

Connection Strings

Where do you want to connect today?
.net kullanıcıları için herhangi bir bağlantı oluştururken ihtiyacı olan bağlantı string lerini buluduran bir site. Çok başarılı. www.connectionstrings.com

10 Ağustos 2008 Pazar

Bilgisayar Mühendisi çalışma alanları

Daha önce bir partını paylaşmıştım. Bilal Akçay'ın sitesinden şimdi bilgisayar Mühendisliği ne iş yapar adı altında yazdığı bütün başlıklarını burada paylaşacağım. Gayet güzel ve açıklayıcı yazılar.
Bilgisayar Mühendisi ne yapar?
1-- Yazılım
2-- VeriTabanı yönetimi
3-- Bilişim Güvenliği
4--
5-- Donanım
6-- Teknik Destek
7-- Web
8-- Multimedia
9-- Diğer

7 Ağustos 2008 Perşembe

F1 Help! C#

C# ta kod yazarken F1 in kullanımıyla ilgili bir örnek yapacağım, çok kolay ama önemli. Yapılan projelerde kullanıcıya bilgi vermek isteyebilirsiniz.
Öncelikle formun HelpButton özelliğini true olarak ayarlayıp kodumuzu da formun HelpRequested event ine yazacağız.
Örnekte mouse ile üzerinde olduğunuz kontrolü F1 tuşuna basarak o kontrolün adını öğrenebilirsiniz. Here is the sample..
Point pt = this.PointToClient(e.MousePos);
Control ctr = GetChildAtPoint(pt);
if (ctr == null) return;
MessageBox.Show("Bu kontrol: " + ctr.Name.ToString());
Bu kadar ;). Ne yapacağım kontrol adını öğrenipte :D
O zaman F1 tuşuna basıldığında program tarafından bir .html sayfası açtırın.
string file = Path.GetFullPath("xxx.html");
Help.ShowHelp(this, file);
Artık bundan sonrası hayal gücüne ve kullanım değişikliğine bakar. Değişik bir sürü şey yaplabilir.

1 Ağustos 2008 Cuma

Biraz gülelim :)

Bilal abinin web sitesinden alıntıdır. Gerçekten hoşuma gittiler. Paylaşayım dedim :)

-















21 Temmuz 2008 Pazartesi

Silverlight nedir?

Flash öğrenme merakım vardı fakat bir türlü zaman bulamamıştım tam başlayacağım derken uzun zamandır etrafta gördüğüm flash a çok benzeyen silverlight denen bir yapı çıktı. Ben de .net geliştiricisi olarak eğer bu flash ın yerini tutuyorsa flash yerine bunu öğrenebilirim dedim kendime ne de olsa Microsoft ürünü. Ama tam olarak nedir bu Silverlight, flash mı yoksa daha da fazlası mı? Eminim bu çoğu kimsenin kafasında kalan bir soru işareti? Ben de makale falan arıyordum nedir ne değildir diye sağolsun sevgili Daron Yöndem'in tavsiye ettiği bir makale Silverlight ı çok güzel bir şekilde her yönüyle açıklamış. Buradan bu güzel makale için kendilerine çok teşekkür ediyorum. Blog tutmanın en harika yönü işte bilgilerin paylaşımı. Sizin de aklınızda ufak bir soru işareti varsa okuyun derim en fazla 15 dakika.
Bu güzel makaleye buradan ulaşabilirsiniz.
Yakın zaman içinde Silverlight yazılarıyla beni de karşınızda görürseniz şaşırmayın ;)

6 Temmuz 2008 Pazar

C# modifiers

C# modifiers değişkenlerin, classların, fonksiyonların vb. yerlerde kullanılan ve onların bazı özelliklerini belirten tanımlayıcı kelimelerdir. Her zaman karıştırılabilecek ve kullanılmadıkça unutulacak belirteçlerdir.
Başına eklendiği tip veya tip değişkenlerinin,
public: her yerden ulaşılabileceği ve değiştirilebileceği anlamına gelir.
private: sadece tanımlandığı alandan(class, form, vb) erişilip değiştirilebileceği anlamına gelir.
protected: tanımlandığı yerden miras alan alanlar tarafından erişilebilirler.
C#ta tanımlı bütün nesneler ulaşım belirteci olarak bu üçünden birini mutlaka alırlar.
abstract: Classların başına gelir ve bu sınıfın temel sınıf olduğunu belirtir. Yani bu sınıftan sadece miras alınabilir ve bu sınıfı new ile instance ını(kopyasını) alamayız.
sealed: selaed olarak tanımlanan sınıflar miras veremezler.
const: Sabit demektir. Tanımladığı nesneye en tanımladığı anda değer atar ve daha sonra bu değerin değiştirilmesine izin vermez.
virtual: Bu şekilde tanımlanan metodların daha sonra gerektiği yerde ezilecebileceği (değiştirilebileceği) anlamı taşır.
override: virtual olarak tanımlanan metodları miras alan sınıfta değiştirebilmek için override olarak tanımlamamız gerekiyor.
Sınıflarda tanımlanan bazı metodlar, o sınıftan miras alan bazı sınıflar tarafından kullanılamayabilir veya istenilen sonucu vermeyebilir. Miras alınan sınıftaki o metodu virtual tanımlarız daha sonra da miras alan sınıfta o metodu override ederek içeriğini değiştirebiliriz.

Twitter nedir?

Twitter nedir bilmeyenler için Nuri Çankaya'nın blogunda yayınladığı video twitterı en güzel şekilde anlatıyor bence. Buradan izleyebilirsiniz?

4 Temmuz 2008 Cuma

Bilgisayar Mühendisi ne iş yapar?

Herkesin yanlış yorumladığı bir şey bu aslında daha doğrusu işin en başına dönersek Bilgisayar Mühendisi nedir herkesin kendi kafasındaki bilgisayar kullanıcıları ile şekillenen bir şey gibi görünüyor halk arasında, daha doğrusu bunlar mühendis kavramının ne olduğunu bilmeyen kişilerin topluma kazandırdığı bilgisayar mühendisleridir. Tabiki yanlış.
Mühendis kısaca bir soruna en kısa çözüm üreten kişidir. Her neyse aslında sadece bir link verecektim ama bunları da biraz belirteyim dedim.
Burada bilgisayar mühendisi ne iş yapar diye kısa ve öz güzel bir yazı var okumanızı tavsiye ederim.

30 Haziran 2008 Pazartesi

Sql Server Cursor

Sql server üzerinde stored procedure, trigger tarzı az kişi tarafından bilinen bir diğer T-SQL, cursor. Az kişi tarafından bilinmesi de herhalde pek tavsiye edilmiyor olması. Tavsiye edilmiyor olmasının sebebi de Sql server ı resmen sömürüyor. Sql server kurulumu ile gelen ve sql serverın çalışması için gerekli veritabanlarından biri olan tempdb yi çok fazla kullanıyor bu da serverın doğal olarak yavaşlamasına sebep oluyor. Bu yüzden tavsiye edilen eğer yapacağınız işlemi store procedure, SQL cümlecikleri vs.. ile yapabiliyorsanız kesinlikle cursor kullanmayın(tabi okulda hocalarınız özel olarak cursor oluşturmanızı istemediyse :)).
Cursorleri herhandi bir programlama dilindeki diziler üzerinde gezmek gibi düşünebiliriz, gezme işlemi yaparken üzerinde olduğumuz kaydı da değiştirebiliriz. Bu diziyi de select cümlesiyle oluşturuyoruz.
Cursorun genel yapısı şu şekilde
  DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
Open cursor_name
.....
CLOSE cursor_name
DEALLOCATE cursor_name

Burada [a|b] arasındaki tanımlamaları istersek yazabiliriz yazarsak da sadece a veya b yazabiliriz. Her ikisini de yazarsanız hata alırsınız.
Tabi yazmazsak sql server bizim yerimize default olan değerleri koyacaktır. O yüzden cursorden tam olarak faydalanamayabiliriz.
Ben burada bir kaç tanesinin ne olduğundan bahsedeceğim bunlar önemli olanlar diğerlerine buradan bakabilirsiniz
Bu arada cursorde çok önemli bir ifade FETCH vardır bu kendisinden sonra gelen ifadeyle nereye dallanılacağını belirler.
LOCAL :Cursorun local olarak tanımlanması demek sadece kullanıldığı bağlantı içinde(stored procedure de tanımlanmışsa sadece o sp de kullanılabilir) görülecek demektir.Default olan değerdir eğer global veya local yazılmamışsa bu atanır
GLOBAL: Adından da anlaşılacağı üzere bütün bağlantılar tarafından görülebilen global bir cursor oluşturmuş oluruz.
FORWARD_ONLY: Bu bize cursor içinde sadece fetch next yapılacağını söyler. Tablonun baş satırından başlar sadece bir ileriye gidebiliriz.
SCROLL: Bu tanımlamayla bütün fetch işlemleri yapılabilir.
Diğerlerine de bakmanızı tavsiye ederim. Cursor üzerinde dolaşırken update yaptığınız zaman tablonuza yansıyıp yansımayacağı veya cursor açıldıktan sonra yeni veri girişi kabul edilmeyeceği gibi önemli şeyler var.
Tanımlanan fetch ler şunlardır.
FETCH FIRST: ilk kaydı fetch eder.
FETCH NEXT: bir sonraki kaydı fetch eder.
FETCH PRIOR: bir önceki satırı fetch eder.
FETCH LAST: en son satırı fetch eder.
FETCH ABSOLUTE n: n pozitif ise n. satır, n negatif ise sondan n. satır n=0 ise hiç bir satır fetch edilmez.
FETCH RELATIVE n: n pozitif ise en son fetch edilen satırdan n satır sonraki satırı fetch eder, n negatif ise fetch edilen satırdan n satır kadar önceki satırı fetch eder, n=0 ise fetch edilmez.
Bu arada fetch demek ilgili satırı alıp işlenir hale getirmek demek.
Bir örnekle bitireyim. Elimizde yazarlarla ilgili bir veritabanımız olsun. Girilen yazarın kitaplarını listeleyen bir stored procedure içinde cursor oluşturalım.

1. CREATE PROC yazarinKitaplari
2. @yazarAdi varchar(20)
3. AS
4. DECLARE @yazarKitap nvarchar(50)
5. DECLARE cursor_KitapListele CURSOR
6. LOCAL
7. SCROLL
8. FOR SELECT kitabi FROM yazar WHERE yazarAdi=@yazarAdi
9. OPEN cursor_KitapListele
10. FETCH LAST cursor_KitapListele INTO @yazarKitap
11. WHILE @@FETCH_STATUS=0
12. BEGIN
13. PRINT '@yazarAdi 'ın kitabı: @yazarKitap'
14. FETCH PRIOR cursor_KitapListele INTO @yazarKitap
15. END
16. CLOSE cursor_KitapListele
17. DEALLOCATE cursor_KitapListele

4. cursorden dönen kaydı bu parametreye geçireceğim eğer cursorde yazdığım select te 2 sütun dönseydi bana ona göre 2 değişken tanımlayıp fetch .. into dan sonra bu değişkenleri yazacaktım.
5. cursor bu şekilde tanımlanır.
8. cursorun üzerinde kayıt okuyacağı tablo bu select cümlesiyle geliyor.
9. cursor açılmalı, açılmazsa fetch işlemleri yapılmaz yani cursor bir işe yaramaz
10. son satırdan okumaya başladım kayıtları (fantazi yapıyom :)) okuduğum kaydı @yazarKitap değişkenine atıyorum.
11. @ fetch_status=0 demek fetch işleminin başarılı olması demek yani okunacak kayıt var.Okunacak kayıt varsa oku ve yazdır diyorum. fetch_status=-1 ise diğer kayda geçiş yapamamıştır yani satır sonu falan -2 ise öyle bir satır yok.
14. şu an son satırdayım bir önceki satıra gelip veriyi alıyorum bunu while ile en başa kadar yapıp kitapları yazdırıyorum.
16. açılan cursor mutlaka kapatılmalı ve
17. kullandığı kaynaklar bırakılmalı
Bu kadar yeter, bugün açıklanan veri tabanı dersinden geçmişim :D yoksa buraya küçük bir kitap yazardım valla. Bütünlemeye girecek arkadaşlara da kolay gelsin diyorum.

26 Haziran 2008 Perşembe

MCPD sınavları ve dökümanları

MCPD (Microsoft Certified Professionels Developers) Microsoft'un bazı sınavlarını geçmiş kişilere vermiş olduğu ünvan. En kısa zamanda hazırlanıp almak istediğim bir ünvan. Bu yüzden biraz baktım da hangi sınavları var nasıl ne zaman, burada onları yazacağım.
Microsoft'un bu sertifikasyon sınavları sadece bununla kısıtlı değil tabi. Mesela MCPD ye çok benzeyen MCTS(Microsoft Certified Technologist Specialist) farkı ise MCPD biraz daha karizma :) ve tabiki daha zor. Birinde sadece yazılım bilgi ile ilgili sorular gelirken diğerinde ise mimarisi hakkında sorular geliyor.
MCPD de verdiğimiz sınavlara göre 3 alanda isim alıyoruz. Bunlar
MCPD Windows Developer 3.5
MCPD ASP.net Developer 3.5
MCPD Enterprise Application Developer 3.5
Bunlar için verilen sınavlar da farklı tabi. Ben uzun uzun anlatmayacağım. Burada bu sertifikalar için gireceğimiz sınavlar yazıyor. Bunlar eski(.net 2.0 için) güncellememişler ama mantık aynı.
Bu sınavları bie de Microsoft'un ağzından dinleyin. http://www.microsoft.com/learning/mcp/mcpd/default.mspx
Burada sınavların geçmiş soruları tarzı dökümanlarını bulabilirsiniz. Buradaki sınavları görüntülemek için Visual CertExam lazım o da burada.

18 Haziran 2008 Çarşamba

Firefox ile sitede arama yapma

Firefoxun yeni bir özelliğini öğrendim ve gerçekten çok hoş bir özellik bunu da burada paylaşmak istedim. Her geçen gün yeni bir şeyler çıkıyor valla
Sitede arama yapmak için siteye girer ve arama textBox ına anahtar kelimeyi yazıp ara butonuna basarız. İşte firefox bunları bizim için yapıyor. Herhangi bir sitede arama yapılan textBox üzerine sağ tıklayarak arama için anahtar kelime ekle diyoruz, sonra anahtar kelime yerine de hatırlayabileceğimiz kolay bir şey giriyoruz.
Bir örnek örneğin www.seslisozluk.com için yapacağım. Siteye girip kelimeyi yazıp arama yapmak yerine yukarıda anlattıklarımı yapıyorum anahtar kelime yerine de s yazıyorum.
ingilizce hibernate kelimesini aratacağım yapmam gereken firefox u açıp adres çubuğuna s hibernate yazıp entera basmak direkt kelimenin türkçe çevirisi gelecek.
Firefox için forumlarda özel bir bölüm açmalılar bence millet bildiklerini yazar böylece interneti kullanma hızımız artar ve firefoxun bütün fonksiyonlarından yararlanabiliriz.

4 Haziran 2008 Çarşamba

IBM staj sınavı

Evet dün IBM in bilenler vardır staja kabul etmeden önce yaptığı bir sınav vardır ona girmiş bulunuyorum. Kısaca bir açıklayayım dedim.
IBM internet üzerinden staj başvurusu yaptırıyor daha sonra da bu başvurulardan uygun gördüğü bir çok kişiyi staj için bir sınava çağırıyor bir çok kişi dedim çünkü 1000 kişi falan giriyor herhalde.
Yalnız bu sınavla stajyer alıp ne işe yarayacağını anlamış değilim. Başvuruken çalışmak istediğimiz projeleri belirtiyoruz sınavda şekille falan uğraşıyoruz acaba projelerde de bizlere paint ile şekil falan mı çizdirecekler de şekil algılama kapasitemizi yükseltiyorlar :D Tabi bilmiyoruz onların bileceği iş işe yarıyor ki her sene bu şekilde stajyer alıyorlar.
Gelelim sınava sınav 3 part halinde toplam 95 soru.
1. part tamamen alfabedeki harflerle ilgili sıradaki ne olur cinsindendi ve toplam 40 soru.
2. part şekiller var onların içinde de şekiller var böyle karmaşık bir şeyler yine bunlardan sonra ne gelir şeklinde ve toplam 30 soru.
son bölüm ise 25 soruluk matematik soruları işte ÖSS den bilinen problem tarzı sorular. Tavsiye edilen zaman kullanımı ise sırasıyla 15,15 ve 30 dk. Bu arada sorular ingilizce tabi.
İşte sınav kısaca bunlardan ibaret bu arada sınav sonrası oradaki görevlilere sordum "Elimizdeki projelere göre stajyer alıyoruz sayısı her sene değişiyor geçen sene 250 kadar kişi aldık bu sene elimizdeki projeler az o yüzden 100'e yakın kişi alacağız." dediler. Sınav sonuçları da 10 gün içerisinde açıklanacakmış. Hadi bakalım hayırlısı.
Bilginiz olsun diye ....

28 Mayıs 2008 Çarşamba

Microsoft Employee blogs

Evet bizlere bu kadar yenilikleri çıkartıp her geçen gün kod yazmayı daha kolay , anlaşılır ve zevkli hale getiriyorlar. Her zaman merak etmişimdir bunlar kimler diye msdn sitesinden bulduğum bazı developer lar ve bunların blog adreslerini paylaşmak istedim.
Bu arada .net ile proje geliştiren arkadaşlar msdn sitesini kullanın gerçekten bence microsoftun yapmış olduğu en iyi site. Her türlü kodların kullanımı ile ilgili bir sürü örnek kodlar mevcut.
Öncelikle Microsoft un developer bölümünün başı olan S. Somasegar ile başlamak istiyorum. Microsoftta nelerden sorumlu diye bakarsanız neredeyse kullandığımız microsoft ürünlerinden sorumlu. Adam hiç uyumuyordur herhalde Bill Gates den fazla işi varmış :D
S. Somasegar ile ilgili bilgilere buradan kendisiyle yapılan bir röportaja buradan
kendisinin bloğuna da S. Somasegar ulaşabilirisiniz
Scott Guthrie. Benim diğerlerine göre biraz daha tanıdığım ve çoğu kimsenin bildiği ve takip ettiği ASP.net developer larından bir isim.
Sara Ford. Adventures in sharing Microsoft source code.
Raymond Chen. Raymond Chen's blog focuses on practical development throughout the evolution of Windows.
Jensen Harris. An Office User Interface Blog by the Group Program Manager of the Microsoft Office User Experience Team.
Rob Mauceri. Learn about what's coming in Microsoft Office SharePoint Designer 2007 and Expression Web Designer.
Brad Adams. Design Guidelines, Managed code and the .NET Framework.
Michael Howard. A Simple Software Security Guy at Microsoft!
J.D. Meier. Software Engineering. Project Management. Effectiveness.
Ayrıca bir kaç blogu daha ekleyeyim.
Outlook Internet Explorer ve Windows Mobile

25 Mayıs 2008 Pazar

C# harddiske veri kaydetme

C# ta listView , listBox veya bunlara benzer kontrollerdeki veriler kolayca harddiske kaydedilir böylece uygulamanın tekrar açılışında veri kaybını önlemiş oluruz. İlk önce kaydedeceğimiz veriler bir class içinden alınıyorsa bu class a bi attribute eklememiz gerekiyor. class tanımlamadan önce namespace tanımlamasından sonra [Serializable] ekliyoruz.
Kullancağım değişkeni önce beilirteyim kisiler diye bir class tipinde dizi değişkenimiz var ve kaydetmek istediğimiz veriler bunun içinde olsun.
System.IO namespace altında tanımlanan özellikleri kullanacağız bu yüzden projenize bunu eklemeyi unutmayın.
Bir buton sayesinde kaydetme işlemi yapacağız. Buton click event ine aşağıdaki kodları yazmamız gerekiyor.
FileStream fs = new FileStream("Fihrist.bak", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, kisiler);
fs.Close();
MessageBox.Show("Kaydedildi");

FileStream bize dosyayı istediğimiz yerde oluşturup onu ne yapacağımızı bildirdiğimiz kısımdır. Burada
FileStream("Fihrist.bak", FileMode.Create); FileStream e verilen ilk parametre dosyayı kaydedeceğimiz yerdir. C:/Fihrist.bak şeklinde yazarsak C'nin altına kaydedecektir sadece ismini yazarsak bizim projemizde bulunan bin dosyasının altındaki Debug klasörünün altına kaydedecektir. İstediğimiz ismi ve uzantıyı verebiliriz. Burada FileMode ile ise bu yeni bir dosya oluşturacağımızı söylüyoruz. İstersek var olan dosyayı da açabiliriz.
Dosyayı kullandıktan sonra kapatmayı unutmayın yoksa açık kalır :D
BinaryFormatter asıl işi yapar verimizi Serialize metodu sayesinde dosyaya binary halinde kaydeder. İşte bu kadar...
Daha sonra diyelim bu dosyadaki verileri açıp gereken yere koymak istiyoruz. O zaman şunları da Formun Load event ine yazın
FileInfo fInfo = new FileInfo("Fihrist.bak");
if (fInfo.Exists)
{
FileStream fs = new FileStream("Fihrist.bak", FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();
kisiler = bf.Deserialize(fs) as List;
fs.Close();
Listele();
}

Buradaki Listele() metodu benim verilerimi ListView e yazmaya yarıyor. Fazla uzatmayayım en kısa bu kadar oldu.

22 Mayıs 2008 Perşembe

Stored Procedure tanımlamaları

Örnek olarak basit stored procedure tanımlamaları:

->En genel stored procedure
CREATE PROCEDURE procedure
AS
SELECT * FROM tablo_adi
GO çalıştırmak için (EXEC procedure)

->Parametre alan store procedure tanımlamaları
CREATE PROCEDURE procedure
@yas int
AS
SELECT * FROM tablo_adi WHERE yas>@yas
GO (EXEC procedure 20)

->Kendi içerisinde değer kullanan stored procedure
CREATE procedure [dbo].[ilkStoredProcedure]
@name varchar(10)
AS
DECLARE @name2 nchar(10)
SET @name2=(SELECT ad FROM genel WHERE ad=@name)
IF @name2 is null
BEGIN
insert into genel(ad) values(@name)
END
ELSE
PRINT 'Bu isimde database de kullanıcı adı var'
GO (EXEC procedure ahmet)

21 Mayıs 2008 Çarşamba

Sql Server 2005 te sql server authentication ile oturum açma sorunu

Sql server 2005 te sql server authentication olarak oturum açarken eğer bir sorunla karşılaşırsanız bu anlattıklarımı yapmanız gerekir. Benim başıma geldi. Bi hocam anlattı faydalı olur diye burda paylaşmak istedim.
Sql server authentication olarak oturum açmayı hiç bilmiyorsanız management studio yu açtıktan sonra authentication da sql server authentication seçili olması gerekiyor. Login yerine sa, password yerine de programı kurarken oluşturmuş olduğunuz şifrenizi yazıp bağlanabilirsiniz. Aşağıda anlatacaklarım bu şekilde bağlanabilenler için değilidir.

İlk önce server ınızın uzaktan erişime açık olması gerekiyor. Bunun için;
1- Management Studio yu acin.
2- Object explorer uzerinde en ust dugum olan server adınıza sag tıklayıp properties e girin.
3- connections sekmesini secin ve buradaki Allow remote connections to this server seceneginin tikli olmasını saglayın. Tamam deyin. Management studio yu kapatın.
4- gecen sevfer gibi baslat-> calistir a services.msc yazarak acilan servislerden Sql Server(MSSQL) i durdurup yeniden baslatin ve baglanmayi deneyin.

Şimdi de sa ile yani Sql server authentication ile oturum açmak için de şunları yapın.
1- Gene management Studio yu kullanarak windows authentication ile management studio yu acin.
2- Soldaki object explorer agacinda(gorunmuyorsa view sekmesi altinda object explorer i acin) en ust dugum olan server adiniz uzerine gelin. Sag tusla properties i ne girin.
3- Properties icinde soldan security sekmesini secin.
4- Security icinde Authentication Mode olarak Sql Server and Windows Authentication radio buttonu secili hale getirin.
5- Tamam diyerek properties penceresini kapatin.
6- Gene object explorer icinde goruntulenen (database,security, Serer objects.. seklindeki) listeden securitynin + sina basarak genisletin logins in + si ile genisletin acilan kullanici listesinde sa yi secin sag tusla properties ine girin.
7- Properties icinde en altta bulunan status kismana girip enabled olup olmadigina bakin, degilse enabled yapin.
8- Tamam diyerek pencereyi kapatin.
9- Management studio yu kosesinden kapatin.
10- Baslat calistira services.msc yazarak servislere girin. Sql server(MSSQL) ini bulun durdurun ve yeniden baslatin.
Bunlardan sonra en baştan tekrar bağlanmayı deneyin. Sorununuz çözülmüş olacak.
Kolay Gelsin...