Arşiv

2010 için arşiv

C# Windows’un Boş Zamanını (Idle Time) Bulmak

Yazdığınız bir uygulamanın vakit alıcı bazı işlerini, Windows’un kullanılmadığı zamanlarda gerçekleştirmek isteyebilirsiniz.

Yapmamız gereken, uygulamamızın, Windows’un kullanılmadığı zamanı anlayabileceği ve sayabileceği bir yönteme sahip olmasını sağlamak.

Böylece Windows belirli bir süre boyunca kullanılmadığında, uygulamamızın çeşitli görevleri başlatmasını sağlayabiliriz.

Windows’un kullanılmadığı süreyi ölçmek için, öncelikle son kullanıldığı zamanı bulmamız gerekmektedir.

İlk olarak, kodumuzun using kısmına System , System.Runtime.InteropServices ve System.Timers namespace‘lerini ekleyelim.

System.Runtime.InteropServices namespace’i Windows API‘lerini uygulamamıza eklememize yarayan sınıfları barındırmaktadır.

DllImport sınıfını kullanarak, user32.dll Windows API‘sinde yeralan GetLastInputInfo methodunu uygulamamıza ekleyebiliriz.

GetLastInputInfo method’u sayesinde ihtiyacımız olan, Windows’un son kullanılma zamanını alabileceğiz.

[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LastInputInfo plii);

Toplam Kullanılma Zamanından, Son Kullanılma Zamanını çıkarttığımızda, Windows’un Kullanılmadığı Boş Zamanı bulmuş olacağız.

TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime)

GetLastInputInfo method’u parametre olarak LastInputInfo tipinde bir struct istemektedir.

public struct LastInputInfo
{
	public uint cbSize;
	public uint dwTime;
}

Uygulamamızın başlangıcında bir Timer oluşturuyoruz ve Elapsed olayında, Windows’un kullanılmadığı süreyi ekrana yazdırıyoruz.

Örnek uygulamanın tüm kodu;

using System;
using System.Runtime.InteropServices;
using System.Timers;

public struct LastInputInfo
{
	public uint cbSize;
	public uint dwTime;
}

public class Program
{
	[DllImport("user32.dll")]
	static extern bool GetLastInputInfo(ref LastInputInfo plii);

	static LastInputInfo info = new LastInputInfo();

	public static TimeSpan GetInactiveTime()
	{
		if (GetLastInputInfo(ref info))
			return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime);
		else
			return TimeSpan.Zero;
	}

	static void Main(string[] args)
	{
		info.cbSize = (uint)Marshal.SizeOf(info);

		Timer t = new Timer(1000);
		t.Start();
		t.Elapsed += delegate { Console.WriteLine(GetInactiveTime().ToString()); };

		Console.ReadLine();
	}
}

Bu kodda ne yanlış var? – 5

29 Temmuz 2010 Engin POLAT 1 Yorum

Bu sefer bir web uygulaması projesinde görevliyiz. Uygulamanın yönetim panelini YonetimPaneli dizini içerisinde geliştirdik.

Güvenlik açısından önlem almak için web.config dosyasına şu satırları ekledik;


	
		
			
				
				
			
		
	

Fakat, Proje Lideri bu kodu gördükten sonra yüzü asıldı.

Sizce problem nedir ve nasıl düzeltebiliriz?

C# Global Assembly Cache içine Assembly yüklemek

C# ile geliştirdiğimiz uygulamalar büyüdükçe, uygulama içerisinde ortak kullandığımız yapıları tekilleştirme eğilimi gösteririz. Örneğin; veritabanına erişim, e-posta gönderme, hata geribildirimleri, session kontrolü, vs.

Tekilleştirme yapmak için, ortak metodları, ortak bir sınıf içerisinde toplar ve projenin her yerinde ilgili sınıf üzerinden kullanırız. Örneğin;
DAL.ExecuteQuery();
DAL.ExecuteProcedure();
DAL.GetDataTable();

Ortak metodlar çoğaldıkça, ortak bir sınıf yeterli olmaz ve ortak sınıflar oluşturmamız gerekir.Örneğin;
Hata.Log(ex);
DAL.ExecuteQuery(“sorgu”, “parametreler”);
EMail.Send(“alıcı”, “konu”, “içerik”);

Eğer ortak sınıflarımızı çeşitli projeler arasında paylaşmamız gerekiyorsa, bu sınıfları dll assembly‘ler içerisinde toplarız.

Daha sonra her projede, dll assembly’yi projenin referanslarına ekleriz.

Birden fazla projede referans olarak göstereceksek, dll assembly’yi ortak bir alana yüklememiz daha doğru olacaktır.

Böylece ilgili dll’de yapacağımız bir versiyon güncellemesi aynı anda birden fazla projede etkin olacaktır.

.Net dll’lerini koyabildiğimiz ortak alana Global Assembly Cache (kısaca GAC) denmektedir.

Bir .Net assembly’sini GAC‘a eklemek için, .Net Framework ile birlikte gelen gacutil aracını kullanmalıyız. Örnek Kullanım : gacutil -i [assembly_yolu]

Komut satırından gerekli parametreleri vererek gacutil aracını kullanabiliriz.

Eğer, bir assembly’yi GAC’a programatik bir yöntemle eklemek istiyorsak, System.EnterpriseServices.Internal namespace’inde yeralan Publish sınıfının GacInstall method’unu kullanmalıyız.

İlk olarak kodumuzun using kısmına System.EnterpriseServices.Internal namespace’ini ekleyelim;

using System.EnterpriseServices.Internal;

Daha sonra yapmamız gereken, Publish sınıfından yeni bir örnek oluşturup, GacInstall method’unu çağırmak.

try
{
	Publish gac = new Publish();
	gac.GacInstall("yuklenecekassemblyyolu");
}
catch (System.Security.SecurityException se)
{
	///Muhtemelen yetki eksikliğinden dolayı uygulamamız GAC'a erişemedi
}

Özellikle, kendi kurulum uygulamamızı yazacaksak, GAC‘a programatik erişmemiz gerekecektir.

C# Event fırlatmak için yeni bir yöntem

28 Temmuz 2010 Engin POLAT 1 Yorum

C# ile geliştirdiğimiz sınıflardan event yayınlamaya genellikle ihtiyaç duyarız.

Bir sınıftan event yayınlamak için, artık ezberlediğimiz üzere, aşağıdaki yöntemi kullanırız;

public class EventTest
{
	public event EventHandler MyEvent;

	public void RaiseEvent()
	{
		if(MyEvent != null)
		{
			MyEvent(this, EventArgs.Empty);
		}
	}
}

Devlicious‘da gördüğüm makalede, Rob Eisenberg yeni bir yöntem öneriyor.

Makaleye göre, yukarıdaki event yayınlama kodunu aşağıdaki gibi de yazabiliriz;

public class EventTest
{
	public event EventHandler MyEvent = delegate {};

	public void RaiseEvent()
	{
		MyEvent(this, EventArgs.Empty);
	}
}

Sizce hangisini tercih etmeliyiz?

C# Veri Tipleri

27 Temmuz 2010 Engin POLAT 1 Yorum

Uygulamalarımızın olmazsa olmaz unsurları herhalde değişkenlerdir. Orta ölçekli bir uygulamada, kabaca bir tahminle yüzlerce değişken tanımlıyoruzdur.

Kullanım yoğunluğuna bakarak, oluşturduğumuz değişkenlerin tiplerinin doğru belirlenmesinin ne kadar önemli olduğunu anlayabiliriz.

C# ile kullanabileceğimiz değişkenlerin en önemlilerini aşağıda listeledim;

Veri Tipi Kapladığı Alan Değer Aralığı
Tam Sayı Veri Tipleri
sbyte 1 byte -128 ve +127
byte 1 byte 0 ve +255
short 2 byte -32768 ve +32767
ushort 2 byte 0 ve 65535
int 4 byte -2.147.483.648 ve +2.147.483.647
uint 4 byte 0 ve 4.294.967.295
long 8 byte -9.223.372.036.854.775.808 ve +9.223.372.036.854.775.807
ulong 8 byte 0 ve 18,446,744,073,709,551,615
Noktalı Sayı Veri Tipleri
single 4 byte -3.402823E38 ve +3.402823E38
double 8 byte -1.79769313486232E308 ve +1.79769313486232E308
decimal 16 byte -7.9E1028 ve +7.9E1028
Diğer Veri Tipleri
char 2 byte Tek Karakter
string ~ (2 byte x harf adedi) Karakter Dizisi
bool 4 byte True veya False
DateTime 8 byte 1/1/0001 12:00:00 ve 31/12/9999 23:59:59

C# siz olsanız hangisini yazardınız?

27 Temmuz 2010 Engin POLAT 3 comments

İnternette gezerken şöyle bir kod parçasına rastladım;

public void ShowPanelWindow(bool isVisible)
{
	Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
}

public void ShowBusy(bool isBusy)
{
	BusyIndicator.ShowIsBusy = isBusy;
}

Bu kodu yazan kişi, eğer yukarıdaki kodu şimdi yazsaydım şöyle yazardım demiş ve aşağıdaki kod parçasını yazmış;

public void HidePanelWindow()
{
	Visibility = Visibility.Collapsed;
}

public void ShowPanelWindow()
{
	Visibility = Visibility.Visible;
}

public void LookBusy()
{
	BusyIndicator.ShowIsBusy = true;
}

public void StopLookingBusy()
{
	BusyIndicator.ShowIsBusy = false;
}

Bu iki kodu okuduktan sonra, kendi kendime sordum ve ben de ikinci tarz yaklaşımı kullanırdım.

Peki siz olsanız hangi tarz kodu tercih ederdiniz?

Kısa kod mu? Kendini anlatan kod mu?

Sql Server veritabanında en büyük 10 tablo

Sql Server‘da belli bir veritabanında en büyük tabloları bulmak için aşağıdaki sorguyu çalıştırabiliriz;

DECLARE @TabloBoyutlari TABLE (TabloAdi VARCHAR(50), SatirSayisi INT, AyrilmisAlan VARCHAR(50), KullanilanAlan VARCHAR(50), IndexBoyu VARCHAR(50), KullanilmayanAlan VARCHAR(50))

INSERT INTO @TabloBoyutlari
EXECUTE sp_MSforeachtable 'sp_spaceused [?]'

SELECT TOP 10 * FROM @TabloBoyutlari ORDER BY CONVERT(INT, REPLACE(AyrilmisAlan, ' KB', '')) DESC

Bu sorgu sayesinde ilgili veritabanındaki tabloların,

  • Tablo Adı
  • Satır Sayısı
  • MDF dosyasında ilgili tablo için ayrılmış alanın boyutu
  • MDF dosyasında ilgili tablo için ayrılmış alanın kullanılan boyutu
  • MDF dosyasında ilgili tablonun indexleri için ayrılmış alan
  • MDF dosyasında ilgili tablo için kullanılmayan alan

bilgilerine ulaşabiliriz.

İlgili tablo için aşağıdaki eşitlik her zaman doğrudur;

Kullanılan Alanı + Index Alanı + Kullanılmayan Alanı = Ayrılmış Alan

Benim bilgisayarımdaki AdventureWorks2008R2 örnek veritabanında yukarıdaki sorguyu çalıştırdığımda, şöyle bir sonuç alıyorum;

Sql Server - Veritabanında en büyük 10 tablo

Kısa Sınav – 15

Aşağıdaki kod bloğunu çalıştırdığımızda ekran çıktımız nasıl olur?

private static string Degisken = "Ilk Deger";

public static string Test()
{
	return Degisken = "Ikinci Degisken";
}

public static void Main(string[] args)
{
	Console.WriteLine(Degisken);

	Console.WriteLine(Test());

	Console.WriteLine(Degisken);

	Console.ReadLine();
}

Sorunun doğru cevabı için; Devamını Oku…

C# ile Form’a gölge efekti verelim ve titreme sorununu düzeltelim

Windows Forms uygulamalarında Form‘un gölge efektine sahip olmasını istiyorsak, öncelikle Form‘un FormBorderStyle özelliğini None yapmalıyız.

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

Form sınıfının CreateParams özelliğini override etmemiz gerekiyor. CreateParams özelliği geriye CreateParams tipinde bir nesne döndürür.

protected override CreateParams CreateParams
{
	get
	{
		CreateParams cp = base.CreateParams;

		cp.ClassStyle |= 0x20000;

		return cp;
	}
}

CreateParams sınıfının ClassStyle özelliğine 0×20000 değerini ekliyoruz. Böylece formumuz çalışmaya başladığında etrafında gölge gözüküyor.

Gölgeli Form

Form üzerine çok fazla kontrol eklediğimizde, özellikle eğer kontroller hafızada çok yer kaplayan 3.parti kontrollerden ise; formumuzda titreme diyebileceğimiz bir efekt oluşmaya başlar.

Çoğu zaman bu durum rahatsızlık oluşturma derecesine kadar varır.

Bu sorunu çözmek için, kontrollerin DoubleBuffered özelliğini true değerine ayarlamamız gerekmektedir.

Fakat DoubleBuffered özelliği Form sınıfının değil Control sınıfının bir özelliği olduğundan dolayı, Form’un titremesini gidermek için kullanamayız.

Form sınıfının CreateParams özelliğinde bu sorunu da çözebiliriz;

protected override CreateParams CreateParams
{
	get
	{
		CreateParams cp = base.CreateParams;

		cp.ExStyle |= 0x02000000;

		return cp;
	}
}

Bu sefer CreateParams sınıfının ExStyle özelliğine 0×02000000 değerini eklememiz gerekiyor.

Örnek uygulamanın tüm kodu;

protected override CreateParams CreateParams
{
	get
	{
		CreateParams cp = base.CreateParams;

		cp.ClassStyle |= 0x20000;

		cp.ExStyle |= 0x02000000;

		return cp;
	}
}

Dizide bir elemandan kaç adet olduğunu bulalım

Elimizdeki bir dizide, belli bir elemandan kaç adet olduğunu bulmamız gerekebilir.

Bunu yapmanın programatik olarak en kolay yolu LINQ sorgusu yazmaktır.

Örneğin aşağıdaki Extension Method, LINQ sorgusu ile aranan elemandan, ilgili listede kaç adet olduğu sonucunu döndürür;

public static int CountTimes< T >(this List< T > list, T item)
{
	return ((from t in list where t.Equals(item) select t).Count());
}

Örnek kullanım;

using System;
using System.Linq;
using System.Collections.Generic;

public static class Program
{
	static void Main(string[] args)
	{
		var list1 = new List< int >() { 1, 2, 3, 4, 5, 6, 7, 7, 8, 9 };
		var list2 = new List< string >() { "a", "b", "b", "b", "c", "d", "e", "f" };

		Console.WriteLine("Birinci listede 7, " + list1.CountTimes(7) + " adet var");
		Console.WriteLine("İkinci  listede b, " + list2.CountTimes("b") + " adet var");

		Console.ReadLine();
	}

	public static int CountTimes< T >(this List< T > list, T item)
	{
		return ((from t in list where t.Equals(item) select t).Count());
	}
}

Yukarıdaki örnek kodu çalıştırdığınızda, şöyle bir sonuç almanız lazım;

Birinci listede 7, 2 adet var
İkinci  listede b, 3 adet var

Bu kodda ne yanlış var? – 4

19 Temmuz 2010 Engin POLAT 3 comments

Bowling skorlarını hesaplayan bir uygulama yazıyoruz.

2 oyuncunun 3 oyunda aldığı skorları hesaplayan aşağıdaki kodu yazdık ve çalıştırdık.

Fakat rakamlarda bir terslik var sanki. Sizce problem nedir ve nasıl düzeltebiliriz?

using System;

class Program
{
	static void Main(string[] args)
	{
		int[,] PuanTablosu = { {101, 128, 143}, {123, 115, 116} };

		int OyuncuPuan = 0;

		for (int iLoop = 0; iLoop < = PuanTablosu.GetUpperBound(0); iLoop++)
		{
			for (int yLoop = 0; yLoop <= PuanTablosu.GetUpperBound(1); yLoop++)
			{
				OyuncuPuan += PuanTablosu[iLoop, yLoop];
			}

			Console.WriteLine("Oyuncu {0} skor: {1}", iLoop + 1, OyuncuPuan);
		}

		Console.ReadLine();
	}
}
Categories: C#, Programlama Tags: , , , , , ,

Uzman TV Röportajlarım – 1 (Sql Server)

Uzman TV ile yaptığımız Sql röportajlarında bana sordukları sorular ve cevaplarım;

SQL nasıl bir veritabanı dilidir? (SQL nasıl ortaya çıktı? Kim tarafında bulundu? Veritabanı nedir?)

Önce veritabanı ne demektir, ondan bahsetmek lazım. Veritabanı, bilgisayar ortamında bir düzen ile saklanan, programatik erişim imkanı bulunan, yönetilebilir, güncellenebilir, birbirleri arasında ilişkiler tanımlanabilir, bilgiler kümesidir.

SQL, ilk olarak IBM Research Center tarafından DB2 veritabanı ailesi için geliştirilmiştir. Daha sonra SQL dili, ANSI tarafından standartlaştırılmıştır.

Türkçe açılımı Yapılandırılmış Sorgu Dili anlamına gelmektedir. Verileri ve veri kümelerini modellemek ve yönetmek için kullanılır.

SQL, tanımlı anahtar kelimelerden oluşturulan sql cümleleri ile, veritabanına kayıt ekleyebilir, güncelleyebilir, silebilir veya varolan kayıtları listeleyebilir.

Microsoft Sql Server, Oracle ve hatta Access kendi SQL cümle yapısına yani diyalektiğine sahiptir.

Hangi tür şirketler SQL’den yararlanabilir? (Veritabanı uygulamalarını tercih eden firmalar nelerdir? SQL kullanması gereken uygulamalar hangileri?)

Günümüzde bilgisayar ve dolayısıyla yazılım kullanmayan, bunlara ihtiyaç olmayan iş kolu kalmadı. Ne kadar küçükte olsa, ne kadar büyükte olsa, her alandaki her firmanın mutlaka bilgisayar ve yazılım kullan birimleri vardır.

Genelde firmalar, kullandıkları bilgisayar programlarının verileri güvenli bir ortamda kaydetmesini, daha sonra aradığında bulabilmesini, gerekirse analiz edebilmesini, yaptığı analize ilişkin raporlar üretebilmesini beklemektedir.

Veritabanı uygulamaları kullanmadan böyle bir işlevselliği sağlayabilmek olanaksız olmasa da çok zor olacağından, hemen hemen tüm firmaların bir veritabanı yönetim sistemine ihtiyacı vardır diyebiliriz.

Bu açıdan bakacak olursak, ticari değer taşıyan hemen hemen tüm uygulamaların ve web sitelerinin veritabanına ihtiyacı vardır.

Şirketler kendilerine uygun veritabanı uygulamasını nasıl seçmeli? (Küçük ve orta ölçekli şirketler açık yazılımlar mı tercih etmeli? Veritabanı desteği veren firmalar var mı?)

Küçük ve orta şirketli firmalar genel de ücretsiz olan açık kaynak kodlu veritabanı yönetim sistemlerini tercih etmektedirler.

Daha büyük ölçekli firmalar ise, hem donanım, hem işletme, hem de personel maliyetlerini göze alabilerek, ücretli veritabanı yönetim sistemlerini tercih edebilirler.

Açık kaynak kodlu veritabanı yönetim sistemlerinin, genelde desteğini veren firma bulmak zordur. Örneğin, bugün piyasada MySql desteği veren firma bulmak hakikatten zordur.

Microsoft Sql Server, Oracle, IBM DB2 gibi veritabanı yönetim sistemlerinin ise, desteği üretici firmaların Türkiye acentelerinden edinilebilir.

Firmalar, Microsoft Sql Server’ın desteğini, Microsoft Türkiye’den, Oracle’ın desteğini Oracle Türkiye’den, IBM DB2’nun desteğini IBM Türkiye’den alabilirler.

Veritabanı uygulamaları arasında ne tür farklar var? (MySQL, Windows SQL gibi programlar nasıl karşılaştırılmalı? Eksik ve fazlaları nasıl değerlendirilmeli?)

Microsoft’un Microsoft Sql Server ve Sql Express uygulamaları, Oracle’ın Oracle uygulaması, IBM’in DB2 uygulaması, gene Microsoft’un Access uygulaması ve açık kod olan MySQL uygulaması veritabanı yönetim sistemlerine örnektir.

Bu veritabanı yönetim sistemleri içinde ücretsiz olanlar vardır; Microsoft’un Sql Express versiyonu gibi. Bu ücretsiz veritabanı yönetim sistemleri genelde bazı kısıtlara sahiptirler. Örneğin, sunucunun hafızasının ve işlemcisinin sadece belli bir miktarını kullanabilirler, belli boyuta kadar veri saklayabilirler, gibi.

Ölçeklendirecek olursak, “büyük” ölçekli diyebileceğimiz Microsoft Sql Server, Oracle, IBM DB2 gibi veritabanı yönetim sistemleri, hem satın alma anlamında, hem de çalışmak için ihtiyaç duyduğu donanım ve yönetim için için gerekli personel maliyeti anlamında pahalıdır.

Bunların yanında MySql gibi, açık kaynaklı yazılımlar sayesinde, düşük maliyetli veritabanı yönetim sistemi sahibi olunabilir.

C# ile Network Activity Monitor yazalım

Bilgisayarın network aktivitesini ölçmemiz gerektiğinde, bu görevi gerçekleştirecek bir yazılım geliştirebiliriz.

Yapmamız gereken Windows’un Performance Counter listesinden doğru sayaçları okumak. Bu yazımda böyle bir uygulama geliştireceğim.

Öncelikle bilgisayarda bulunan ağ arayüzlerinin listesini alalım;

string[] NetworkAdapter = new PerformanceCounterCategory("Network Interface").GetInstanceNames(); /// ağ arayüzlerinin listesi

Şimdi System.Diagnostics namespace’inde yeralan PerformanceCounter sınıfından yeni bir örnek çıkartıp, doğru sayaçlardan bilgi okuyabiliriz.

Bilgisayarın ağ üzerinden yaptığı download ve upload miktarını ölçmek için, Network Interface isimli Performance Counter‘ın Bytes Received ve Bytes Sent isimli sayaçlarını kullanacağız.

PerformanceCounter Download = new PerformanceCounter("Network Interface", "Bytes Received/sec", NetworkAdapter[1]);
PerformanceCounter Upload = new PerformanceCounter("Network Interface", "Bytes Sent/sec", NetworkAdapter[1]);

NetworkChange sınıfının static üyelerinden NetworkAvailabilityChanged event‘ine bir delegate method atayarak, bilgisayarın ağ bağlantı durumunda değişiklik olunca farketmesini sağlayabiliriz.

Yazdığımız uygulamada her 10 saniye’de bir bilgisayarın download ve upload miktarını ekrana yazacak olalım;

Timer t = new Timer(10000); /// 10 saniye

NetworkChange.NetworkAvailabilityChanged += delegate(object _sender, NetworkAvailabilityEventArgs _e) { /// network durumu değiştiğinde
	if (_e.IsAvailable) /// eğer network ulaşılabilir duruma geldi ise
	{
		t.Start(); ///başla
	}
	else
	{
		t.Stop(); /// dur
	}
};

Timer nesnesinin Elapsed event‘inde de ekrana download ve upload miktarı bilgilerini yazacağız;

t.Elapsed += delegate(object _sender, ElapsedEventArgs _e) {
	Console.WriteLine("Download : {0} kb.\t\tUpload : {1} kb.", Download.NextValue(), Upload.NextValue()); /// ekrana download & upload miktarını yaz
};

Örnek uygulamanın tüm kodu;

using System;
using System.Net.NetworkInformation;
using System.Timers;
using System.Diagnostics;

class Program
{
	static void Main(string[] args)
	{
		string[] NetworkAdapter = new PerformanceCounterCategory("Network Interface").GetInstanceNames(); /// network kartlarının listesi

		PerformanceCounter Download = new PerformanceCounter("Network Interface", "Bytes Received/sec", NetworkAdapter[1]);
		PerformanceCounter Upload = new PerformanceCounter("Network Interface", "Bytes Sent/sec", NetworkAdapter[1]);

		Timer t = new Timer(10000); /// 10 saniye
		t.Elapsed += delegate(object _sender, ElapsedEventArgs _e) {
			Console.WriteLine("Download : {0} kb.\t\tUpload : {1} kb.", Download.NextValue(), Upload.NextValue()); /// ekrana download & upload miktarını yaz
		};

		NetworkChange.NetworkAvailabilityChanged += delegate(object _sender, NetworkAvailabilityEventArgs _e) { /// network durumu değiştiğinde
			if (_e.IsAvailable) /// eğer network ulaşılabilir duruma geldi ise
			{
				t.Start(); ///başla
			}
			else
			{
				t.Stop(); /// dur
			}
		};

		t.Start();

		Console.ReadLine();
	}
}

Ayın ilk ve son gününü bulmak için Extension Method

Özellikle raporlama uygulamalarında, aylık dönemlere ait sorgulama yapılırken ilgili ayın ilk ve son günlerinin bilinmesi gerekir.

C# uygulamamızda, yazacağımız basit iki tane extension method ile ayın ilk ve son günlerini bulan kodu basitleştirebiliriz.

public static class ExtensionMethods
{
	public static DateTime AyinIlkGunu(this DateTime dt)
	{
		return new DateTime(dt.Year, dt.Month, 1);
	}

	public static DateTime AyinSonGunu(this DateTime dt)
	{
		return dt.AyinIlkGunu().AddMonths(1).AddDays(-1);
	}
}

Extension Method‘ların kullanımı;

static void Main(string[] args)
{
	DateTime BuAy_BaslangicTarihi = DateTime.Now.AyinIlkGunu();
	DateTime BuAy_BitisTarihi = DateTime.Now.AyinSonGunu();

	DateTime GecenAy_BaslangicTarihi = DateTime.Now.AddMonths(-1).AyinIlkGunu();
	DateTime GecenAy_BitisTarihi = DateTime.Now.AddMonths(-1).AyinSonGunu();
}

Örnek kodun tamamı;

using System;

class Program
{
	static void Main(string[] args)
	{
		DateTime BuAy_BaslangicTarihi = DateTime.Now.AyinIlkGunu();
		DateTime BuAy_BitisTarihi = DateTime.Now.AyinSonGunu();

		DateTime GecenAy_BaslangicTarihi = DateTime.Now.AddMonths(-1).AyinIlkGunu();
		DateTime GecenAy_BitisTarihi = DateTime.Now.AddMonths(-1).AyinSonGunu();
  }
}

public static class ExtensionMethods
{
	public static DateTime AyinIlkGunu(this DateTime dt)
	{
		return new DateTime(dt.Year, dt.Month, 1);
	}

	public static DateTime AyinSonGunu(this DateTime dt)
	{
		return dt.AyinIlkGunu().AddMonths(1).AddDays(-1);
	}
}

C# ile GMail üzerinden e-posta gönderme

07 Temmuz 2010 Engin POLAT 3 comments

Windows uygulamalarınız üzerinden e-posta gönderebilmek güzel bir özellik.

Uygulama içerisinden e-posta gönderme konusunda ilk akla gelen sorulardan bir tanesi, “GMail üzerinden e-posta gönderebilir miyim?” oluyor.

Bu yazımda, GMail üzerinden e-posta gönderebileceğimiz bir uygulama geliştireceğim.

Öncelikle kodumuzun using kısmına System.Net ve System.Net.Mail namespace’ini eklememiz gerekiyor.

.Net Framework, System.Net.Mail namespace‘i içerisinde çeşitli class‘lar aracılığı ile uygulamanız içerisinden kolaylıkla e-posta gönderilmesini mümkün kılıyor.

using System.Net.Mail;
using System.Net;

İlk yapmamız gereken, SmtpClient sınıfından bir örnek oluşturmak ve bazı özelliklerini ayarlamak.

SmtpClient sc = new SmtpClient();
sc.Port = 587;
sc.Host = "smtp.gmail.com";
sc.EnableSsl = true;

Port özelliği ile, Smtp sunucusuna erişeceğimiz port numarasını belirliyoruz

Host özelliği ile, GMail Smtp sunucusunun adresini belirliyoruz

EnableSsl özelliği ile, GMail Smtp sunucusuna bağlanacağımız protokolu belirliyoruz. Eğer true değer atarsak https, eğer false değer atarsak http protokolü kullanılır.

GMail e-posta adresimizi ve şifremizi, Credentials özelliğine NetworkCredential sınıfından bir örnek ile atamamız gerekiyor.

sc.Credentials = new NetworkCredential("eposta@gmail.com", "gmail_sifre");

SmtpClient örneği üzerinden gönderilecek posta, MailMessage tipinde olmalıdır. Bir sonraki adımda MailMessage sınıfından bir örnek oluşturuyoruz.

MailMessage mail = new MailMessage();

mail.From = new MailAddress("eposta@gmail.com", "Ekranda Görünecek İsim");

mail.To.Add("alici1@mail.com");
mail.To.Add("alici2@mail.com");

mail.CC.Add("alici3@mail.com");
mail.CC.Add("alici4@mail.com");

mail.Subject = "E-Posta Konusu";
mail.IsBodyHtml = true;
mail.Body = "E-Posta İçeriği";

mail.Attachments.Add(new Attachment(@"C:\Rapor.xlsx"));
mail.Attachments.Add(new Attachment(@"C:\Sonuc.pptx"));

Son olarak, SmtpClient sınıfının Send() method’unu kullanarak, oluşturduğumuz MailMessage örneğini gönderiyoruz.

sc.Send(mail);

Kodların toparlanmış hali;

using System;
using System.Net.Mail;
using System.Net;

class Program
{
	static void Main(string[] args)
	{
		SmtpClient sc = new SmtpClient();
		sc.Port = 587;
		sc.Host = "smtp.gmail.com";
		sc.EnableSsl = true;

		sc.Credentials = new NetworkCredential("eposta@gmail.com", "gmail_sifre");

		MailMessage mail = new MailMessage();

		mail.From = new MailAddress("eposta@gmail.com", "Ekranda Görünecek İsim");

		mail.To.Add("alici1@mail.com");
		mail.To.Add("alici2@mail.com");

		mail.CC.Add("alici3@mail.com");
		mail.CC.Add("alici4@mail.com");

		mail.Subject = "E-Posta Konusu"; mail.IsBodyHtml = true; mail.Body = "E-Posta İçeriği";

		mail.Attachments.Add(new Attachment(@"C:\Rapor.xlsx"));
		mail.Attachments.Add(new Attachment(@"C:\Sonuc.pptx"));

		sc.Send(mail);
	}
}

C# ile Hash işlemi

06 Temmuz 2010 Engin POLAT 2 comments

Sql Server ile nasıl hash yapabileceğimizi daha önce Sql Server’da Hash işlemi isimli makalemde yazmıştım. Bu sefer, .net üzerinde C# ile nasıl hash işlemi yapabileceğimizi yazacağım.

Hash, büyük boyutta girdi verisi için sabit boyutlu üretilen benzersiz değerdir. Hash algoritmalarının yapısından dolayı, girdi verisindeki küçük değişiklikler sonuç verisinde büyük farklılıklara yol açmaktadır.

.Net Framework üzerinde bulunan System.Security.Cryptography namespace’i, güvenli şifreleme ve çözme işlemleri için şifreleme servislerini barındırır.

.Net Framework şu hash algoritmalarını destekler;

MD5, girdi verisini şifrelemek için 128 bit şifreleyici kullanır
SHA1, girdi verisini şifrelemek için 160 bit şifreleyici kullanır
SHA256, girdi verisini şifrelemek için 256 bit şifreleyici kullanır
SHA384, girdi verisini şifrelemek için 384 bit şifreleyici kullanır
SHA512, girdi verisini şifrelemek için 512 bit şifreleyici kullanır

En çok kullanılan şifreleme yöntemlerinden biri SHA1‘dir.

SHA1 Hashing Algoritması Örneği

Öncelikle kod yazdığımız dosyanın using kısmına System.Secuity.Cryptography namespace’ini eklemeliyiz;

using System.Secuity.Cryptography;

SHA1 sınıfından bir örnek oluşturalım;

SHA1 sha = new SHA1CryptoServiceProvider();

SHA1 sınıfı abstract bir sınıf olduğu için kendisinden örnek oluşturamıyoruz. SHA1 sınıfından türetilen SHA1CryptoServiceProvider sınıfından bir örnek oluşturuyoruz.

Artık yapmamız gereken, sha isimli değişkenimizin ComputeHash() method’unu çağırmak. ComputeHash() method’u, şifrelenecek veriyi parametre olarak byte dizisi aldığı ve geriye şifrelenmiş veriyi byte dizisi olarak döndürdüğü için aşağıdaki örnekte olduğu gibi kullanabiliriz;

string SifrelenecekVeri = "http://www.enginpolat.com/";

string SifrelenmisVeri = Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(SifrelenecekVeri)));

Uygulamanın kodlarının toparlanmış hali;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

class Program
{
  static void Main(string[] args)
  {
    SHA1 sha = new SHA1CryptoServiceProvider();

    string SifrelenecekVeri = "http://www.enginpolat.com/";

    string SifrelenmisVeri = Convert.ToBase64String(sha.ComputeHash(Encoding.UTF8.GetBytes(SifrelenecekVeri)));

    Console.WriteLine(SifrelenmisVeri);

    Console.ReadLine();
  }
}

Yukarıdaki örneği çalıştırırsanız şifrelenmiş çıktı şöyle olacaktır;

8hocM3G7QhUoN7Nm3bWMSr0/SsM=

Not Responding durumundaki Process’leri bulmak

05 Temmuz 2010 Engin POLAT 1 Yorum

O anda çalışmakta olan uygulamaların durumlarını gözleyen bir service yazmamız gerektiğinde, gözlediğimiz uygulamanın kullanıcıya yanıt verip-vermediğini bulabilmemiz gerekir.

Bunu .Net Framework‘teki Process sınıfının üyeleri ile kolaylıkla yapabiliriz.

Process Sınıfı

Process sınıfı System.Diagnostics namespace‘i içerisinde yeralır. Process sınıfı birçok static ve instance üyeye sahiptir. Bu üyeler sayesinde, lokal bilgisayardaki veya uzak bilgisayardaki herhangi bir uygulamaya müdahele edebilirsiniz. Ayrıca Process sınıfı ilgili uygulamanın “çalıştığını” veya “yanıt vermiyor” durumuna düştüğünü de belirleyebilir.

Bu özellik, uygulamaları monitör eden bir service geliştirecekseniz çok kullanışlıdır.

Bu yazıda, basit bir console uygulaması ile bilgisayardaki “yanıt veren” ve “yanıt vermeyen” uygulamaları listeleyeceğiz.

Öncelikle System.Diagnostics namespace‘ini kod’umuzun using kısmına ekleyelim;

using System.Diagnostics;

Bilgisayarda o anda çalışan uygulamaları Process sınıfının GetProcesses() method’undan Process dizisi olarak alabiliriz;

Process[] p = Process.GetProcesses();

Basit bir döngü ile o anda çalışmakta olan process‘ler arasında dönebiliriz. Sonra tek yapmamız gereken, Process sınıfının statik Responding property’sine bakmak;

if (p.Responding)
	Console.WriteLine(" yanıt veriyor.");
else
	Console.WriteLine(" yanıt VERMİYOR!");

Uygulamanın kodlarını toparlarsak;

Process[] processes = Process.GetProcesses();
foreach (Process p in processes)
{
	Console.Write(p.ProcessName);

	if (p.Responding)
		Console.WriteLine(" yanıt veriyor.");
	else
		Console.WriteLine(" yanıt VERMİYOR!");
}

BilgeAdam – XNA Seminerleri (Nisan 2010)

14 Nisan 2010 Engin POLAT 2 comments

Nisan 2010 içinde BilgeAdam Beşiktaş şubesinde XNA Seminerleri veriyor olacağım.

Seminerlerin saatleri aynı; 13:30 – 15:00

BilgeAdam - XNA Seminerleri (Nisan 2010)

Bahçeşehir Üniversitesi – XNA Semineri – 09 Nisan 2010

08 Nisan 2010 Engin POLAT 1 Yorum

09 Nisan 2010 tarihinde Bahçeşehir Üniversitesinde XNA Semineri veriyor olacağım.

Bahçeşehir Üniversitesi XNA Semineri

Dizi oluşturma ve sıralama

12 Mart 2010 Engin POLAT 5 comments

C# ile en basit dizi tanımlama yöntemi, değişken tipinin sonuna [] karakterlerini eklemektir.

Örnek :

int[] TekSayilar = { 3, 1, 9, 5, 7 };

string[] Ogrenciler = { "Engin", "Ahmet", "Mehmet", "Ali", "Veli" };

Dizileri sıralamak için, Array sınıfının static Sort() methodunu kullanabiliriz;

Array.Sort(TekSayilar);

Array.Sort(Ogrenciler);

Şimdi TekSayilar ve Ogrenciler dizilerindeki elemanları ekrana yazdırırsak;

foreach (int Sayi in TekSayilar)
	Console.WriteLine(Sayi);

foreach (string Ogrenci in Ogrenciler)
	Console.WriteLine(Ogrenci);

Dizilerdeki elemanların sıralanmış olduklarını görürüz.

Categories: C#, Programlama Tags: , , , , , ,