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 { }</pre>
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 Üniversitenizde etkinlikleri kapsamında, Muammer Benzeş ile birlikte 09 Mart 2013 - 10 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.
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ışı
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); }</pre>
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;
</pre><pre class="brush:csharp">public static SecureString ToSecureString(this IEnumerable
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);
} }</pre>
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;
</char>
İş yaşantımızda sıklıkla duyduğumuz Proje, Benzersiz bir ürün veya hizmet oluşturmak için yürütülen geçici bir girişimdir.
Bir çalışmanın proje olması için başlangıç ve bitiş zamanları olması lazım, aksi taktirde çalışma proje olarak değil, operasyon olarak değerlendirilmelidir.
Proje ve Operasyon faaliyetlerinin özellikleri;
Operasyon
Proje
Proje Yönetimi, proje faaliyetlerinin proje hedeflerine ulaşmak için planlanması, raporlanması ve kontrolüdür. Bu faaliyetler gerçekleştirilirken performans, maliyet, zaman sınırlamaları içinde kalınması ve proje büyüklüğünün kabul edilebilir sınırlar içerisinde tutulması gerekmektedir.
Proje Yönetimi süreçlerinin şirketlerde daha fazla karşılaşılır olması özellikle aşağıdaki sebeplerden kaynaklanmaktadır;
Proje Yönetimi faaliyetlerinin şirketlere kazandırdıkları;
Dünya’nın en büyük kar-amacı-gütmeyen organizasyonlarından biri olan PMI‘ın (Project Management Institute) resmi yayını olan PMBOK‘a (Project Management Body of Knowledge) göre Proje Yönetimi Süreçleri (Processes) aşağıdaki 5 madde’de toplanmıştır;
PMBOK‘ta tanımlanan 9 adet Bilgi Alanı (Knowledge Area) vardır;
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484