March, 2013 | Engin Polat'ın Windows, Web, Mobile ve Game içerikli programcılık sitesi

Arşiv

2013 March ayı için arşiv

INETA Türkiye Isparta Süleyman Demirel Üniversitesi Etkinliği Mart 2013

18 March 2013 Yorum yapılmamış

INETA Türkiye Üniversitenizde etkinlikleri kapsamında, Muammer Benzeş ve Fatih Boy ile birlikte 16 Mart 201317 Mart 2013 tarihlerinde Isparta Süleyman Demirel Üniversitesi‘ndeydik.

İki gün boyunca Windows Phone 8 ve Windows 8 konularında oturumlar yaptım.

Etkinliğe katılan öğrencilere beni sabırla dinledikleri için teşekkür ediyor, özverili katılımlarından dolayı da tebrik ediyorum

LINQ tarzı Replace operatorü

12 March 2013 Yorum yapılmamış

Bir dizideki elemanlardan, belli bir değere sahip olanları başka bir değerle değiştirecek bir methoda sahip olmak çok faydalıdır.

Language-Integrated Query (LINQ) bu amaç için standart bir sorgu işlecini sağlamaz ama oluşturması basittir.

Örneğin; string sınıfı Replace() isminde bir method barındırır ve değişkenin değerinde yer alan belli bir karakterin tamamını başka bir karakter ile değiştirir.

Aynı mantık ile diziler üzerinde çalışan bir method olsaydı çok kullanışlı olurdu.

Öncelikle static ExtensionMethods isimli bir sınıf oluşturalım;

public static class ExtensionMethods
{
}

Replace() methodunu yazalım;

public static IEnumerable<T> Replace<T>(this IEnumerable<T> list, T find, T replaceWith)
{
	if (list == null) throw new ArgumentNullException("sequence");

	foreach (T item in list)
	{
		yield return find.Equals(item) ? replaceWith : item;
	}
}

Örnek kullanım şekli;

int[] values = new int[] { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
int[] replacedInts = values.Replace(3, 0).ToArray();
 
// SONUÇ
// 1, 2, 0, 4, 5, 4, 0, 2, 1

string[] strings = new string[] { "A", "B", "C", "D", "C", "B", "A" };
string[] replacedStrings = strings.Replace("B", "-").ToArray();

// SONUÇ
// "A", "-", "C", "D", "C", "-", "A"

INETA Türkiye Eskişehir Osman Gazi Üniversitesi Etkinliği Mart 2013

12 March 2013 Yorum yapılmamış

INETA Türkiye Üniversitenizde etkinlikleri kapsamında, Muammer Benzeş ile birlikte 09 Mart 201310 Mart 2013 tarihlerinde Eskişehir Osman Gazi Üniversitesi‘ndeydik.

İki gün boyunca Windows Phone 8, Windows 8, Windows Azure konulu oturumlar yaptım.

Etkinliği gerçekleştirmemizi sağlayan arkadaşlarımız Gökhan Işık, Cemile Sarıcaoğlu, Eskişehir Osmangazi Üniversitesi Bilgisayar ve Bilişim Teknolojileri Kulübü ve katılan tüm arkadaşlara çok teşekkür ederiz.

INETA - Eskişehir Osman Gazi Üniversitesi - Windows Phone 8 , Windows 8 , Windows Azure Etkinliği

Proje Yönetimi Süreç Haritası

05 March 2013 Yorum yapılmamış

PMI methodolojisine göre Proje Yönetim Süreç Haritası 5 süreç grubu‘na ve 9 bilgi alanı‘na dağıtılmış 42 süreçten oluşmaktadır.

PMBOK‘ta bu süreçler aşağıdaki gibi haritalanmıştır;

Başlangıç
Entegrasyon Yönetimi
Proje Başlatma Belgesinin Geliştirilmesi

İletişim Yönetimi
Paydaşların Belirlenmesi

Planlama
Entegrasyon Yönetimi
Proje Yönetim Planının Geliştirilmesi

Kapsam Yönetimi
Gereksinimlerin Toplanması
Kapsamın Tanımlanması
İş Kırılım Yapısının Oluşturulması

Zaman Yönetimi
Aktivitelerin Tanımlanması
Aktivitelerin Sıralanması
Aktivite Kaynaklarının Tahmin Edilmesi
Aktivite Sürelerinin Tahmin Edilmesi
Zaman Çizelgesinin Geliştirilmesi

Maliyet Yönetimi
Maliyetlerin Tahmin Edilmesi
Bütçenin Belirlenmesi

Kalite Yönetimi
Kalitenin Planlanması

İnsan Kaynakları Yönetimi
İnsan Kaynakları Planının Geliştirilmesi

İletişim Yönetimi
İletişimin Planlanması

Risk Yönetimi
Risk Yönetiminin Planlanması
Risklerin Tanımlanması
Niteliksel Risk Analizinin Yapılması
Niceliksel Risk Analizinin Yapılması
Risk Yanıtlarının Planlanması

Tedarik Yönetimi
Tedariklerin Planlanması

Yürütme
Entegrasyon Yönetimi
Projenin Yürütülmesi, Yöetilmesi ve Yönlendirilmesi

Kalite Yönetimi
Kalite Güvencesinin Sağlanması

İnsan Kaynakları Yönetimi
Proje Ekibinin Oluşturulması
Proje Ekibinin Geliştirilmesi
Proje Ekibinin Yönetilmesi

İletişim Yönetimi
Bilgilerin Dağıtılması
Paydaş Beklentilerinin Yönetilmesi

Tedarik Yönetimi
Tedariklerin Yürütülmesi

İzleme ve Kontrol
Entegrasyon Yönetimi
Proje Çalışmalarının İzlenmesi ve Kontrolü
Entegre Değişiklik Kontrolünün Gerçekleştirilmesi

Kapsam Yönetimi
Kapsamın Doğrulanması
Kapsamın Kontrolü

Zaman Yönetimi
Zaman Çizelgesinin Kontrolü

Maliyet Yönetimi
Maliyetlerin Kontrolü

Kalite Yönetimi
Kalite Kontrolünün Gerçekleştirilmesi

İletişim Yönetimi
Performansın Raporlanması

Risk Yönetimi
Risklerin İzlenmesi ve Kontrol Edilmesi

Tedarik Yönetimi
Tedarik İşlerinin İdaresi

Kapanış
Entegrasyon Yönetimi
Projenin ya da Fazın Kapatılması

Tedarik Yönetimi
Tedariklerin Kapanışı

String ve SecureString için Encrypt, Decrypt ExtensionMethod

04 March 2013 Yorum yapılmamış

Windows Data Protection API (DPAPI) encryption key’e ihtiyaç duymadan, kullanıcının oturumuna özel şifreleme yapabilen bir yapıdır.

DPAPI’yi kullanabilmek için System.Security referans’ının proje’ye eklenmesi gerekmektedir.

.Net 2.0 versiyonundan beri .Net Framework‘un bir parçası olan DPAPI sayesinde metin şifreleme ve şifre çözme çok kolaylaşmıştır.

byte[] tipinde yapıların şifrelenmesi Protect() method’u ile, şifre çözülmesi ise Unprotect() method’u ile yapılmaktadır;

public static byte[] Encrypt(byte[] data)
{
	return ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);
}

public static byte[] Decrypt(byte[] data)
{
	return ProtectedData.Unprotect(data, null, DataProtectionScope.CurrentUser);
}

Bu yapının string tipindeki değişkenler ile de kullanılabilmesi için aşağıdaki extension method‘lar kullanılabilir;

public static class ExtensionMethods
{
	private const DataProtectionScope Scope = DataProtectionScope.CurrentUser;

	public static string Encrypt(this string plainText)
	{
		if (plainText == null) throw new ArgumentNullException("plainText");

		var data = Encoding.Unicode.GetBytes(plainText);
		byte[] encrypted = ProtectedData.Protect(data, null, Scope);

		return Convert.ToBase64String(encrypted);
	}

	public static string Decrypt(this string encryptedText)
	{
		if (encryptedText == null) throw new ArgumentNullException("encryptedText");

		byte[] data = Convert.FromBase64String(encryptedText);
		byte[] decrypted = ProtectedData.Unprotect(data, null, Scope);

		return Encoding.Unicode.GetString(decrypted);
	}
}

ProtectedData sınıfının Protect() ve Unprotect() method’larının üçüncü parametresi DataProtectionScope enum tipindedir ve CurrentUser, LocalMachine değerlerinden birini alabilir.

Artık string tipindeki değişkenleri Encrypt() ve Decrypt() method’ları ile şifreleyebilir, şifrelerini çözebiliriz. Fakat bu değişkenlerin değerleri hafızada hala okunabilir formatta tutuluyor olacak.

Eğer değişkenlerin içeriğinin hafızada daha güvenli tutulmasını istiyorsak SecureString tipini kullanmalıyız.

(MSDN’de yeralan Making Strings More Secure makalesini okumanızı tavsiye ederim.)

SecureString tipi için de Encrypt() ve Decrypt() extension method‘ları yazalım;

public static string Encrypt(this SecureString value)
{
	if (value == null) throw new ArgumentNullException("value");

	IntPtr ptr = Marshal.SecureStringToCoTaskMemUnicode(value);
	try
	{
		char[] buffer = new char[value.Length];
		Marshal.Copy(ptr, buffer, 0, value.Length);

		byte[] data = Encoding.Unicode.GetBytes(buffer);
		byte[] encrypted = ProtectedData.Protect(data, null, Scope);

		return Convert.ToBase64String(encrypted);
	}
	finally
	{
		Marshal.ZeroFreeCoTaskMemUnicode(ptr);
	}
}

public static SecureString DecryptSecure(this string encryptedText)
{
	if (encryptedText == null) throw new ArgumentNullException("encryptedText");

	byte[] data = Convert.FromBase64String(encryptedText);
	byte[] decrypted = ProtectedData.Unprotect(data, null, Scope);

	SecureString ss = new SecureString();

	int count = Encoding.Unicode.GetCharCount(decrypted);
	int bc = decrypted.Length / count;
	for (int i = 0; i < count; i++)
	{
		ss.AppendChar(Encoding.Unicode.GetChars(decrypted, i * bc, bc)[0]);
	}

	ss.MakeReadOnly();
	return ss;
}

Son olarak string tipi ile SecureString tipi arasındaki dönüşüm extension method'larını da yazalım;

public static SecureString ToSecureString(this IEnumerable value)
{
	if (value == null) throw new ArgumentNullException("value");

	var secured = new SecureString();

	var charArray = value.ToArray();
	for (int i = 0; i < charArray.Length; i++)
	{
		secured.AppendChar(charArray[i]);
	}

	secured.MakeReadOnly();
	return secured;
}

public static string UnWrap(this SecureString value)
{
	if (value == null) throw new ArgumentNullException("value");

	IntPtr ptr = Marshal.SecureStringToCoTaskMemUnicode(value);
	try
	{
		return Marshal.PtrToStringUni(ptr);
	}
	finally
	{
		Marshal.ZeroFreeCoTaskMemUnicode(ptr);
	}
}

Artık string ve SecureString tipleri için hazırladığımız extension method'ları kullanabiliriz;

bool isOk = false;

string plain = "password";

string encrypted = plain.Encrypt();

string decrypted = encrypted.Decrypt();

SecureString plainSecure = plain.ToSecureString();

string encryptedSecure = plainSecure.Encrypt();

string decryptedSecure = encryptedSecure.Decrypt();

isOk = plain == decrypted;
isOk = plain == plainSecure.UnWrap();
isOk = plain == decryptedSecure;