String | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar string

AçıkAkademi C# uygulaması geliştirmek istiyorum Eğitimleri 2016

26 August 2016 Yorum yapılmamış

AçıkAkademi üzerinde yayınlanan 16 video’luk C# uygulama geliştirme eğitim seti yayına alındı.
Sevgili arkadaşım Bora Kaşmer ile hazırladığımız eğitim setini sizler de C# uygulaması geliştirmek istiyorum başlıklı AçıkAkademi sayfasından izleyebilirsiniz. Eğitim konu listesi;

  • Açılış
  • C# Hakkında
  • Visual Studio
  • İlk Proje
  • Rakamsal Veri Tipleri-1
  • Rakamsal Veri Tipleri-2
  • Tarihsel Veri Tutabilen Değişkenler-1
  • Tarihsel Veri Tutabilen Değişkenler-2
  • Liste Tipinde Değişkenler
  • For Döngüsü
  • ForEach Döngüsü
  • Switch
  • Sınıflar ve Öğeler
  • Özellikler ve Enumlar
  • Metodlar
  • C# Eğitiminden En İyi Nasıl Faydalanabilirim?

AçıkAkademi için bu eğitim setini çekmemizi sağlayan sevgili arkadaşım Ümit Batu‘ya da teşekkür ederim.

Windows 10 UWP uygulamalarında OCR kullanımı

14 March 2016 1 yorum

Microsoft, Windows 10 uygulamaları içerisinden kullanabilmemiz için Optical Character Recognition (OCR) kütüphanelerini Universal Windows Platform (UWP) içerisine ekledi.

Böylece, Windows 10 yüklü olan tüm cihazlarda çalışabilen UWP uygulamaları Optical Character Recognition (OCR) yeteneklerine sahip olabiliyor.

Windows 10 Kasım 2015 güncellemesi ile birlikte OCR desteği 25 dil için hali hazırda sağlanıyor ve Türkçe dili de bunlardan biri.

Üstelik uygulamanın kullanılabilirliğini arttıracak bu yapıyı kodlamanız son derece kolay.

Kamerayı açarak resim çeken ve çektiği resimdeki yazıları algılayan örnek bir projeyi birlikte yapalım;

Öncelikle MainPage.xaml dosyasını açalım ve resim çekme ve resim içerisindeki yazıları bulma işini başlatacak olan Button nesnesini sayfaya ekleyelim;

<Page
	x:Class="OCROrnek.MainPage"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:local="using:OCROrnek">

	<Grid Margin="20">
		<Button Content="Tara" Click="Button_Click" />
	</Grid>

</Page>

MainPage.xaml.cs dosyası içerisinde Button_Click() methodunu oluşturalım ve OCR kütüphanelerini kullanmaya başlayalım;

private async void Button_Click(object sender, RoutedEventArgs e)
{
	var ui = new CameraCaptureUI();
	var file = await ui.CaptureFileAsync(CameraCaptureUIMode.Photo);

	var stream = await file.OpenAsync(FileAccessMode.Read);
	var decoder = await BitmapDecoder.CreateAsync(stream);

	var bitmap = await decoder.GetSoftwareBitmapAsync();

	var engine = OcrEngine.TryCreateFromUserProfileLanguages();
	var result = await engine.RecognizeAsync(bitmap);

	string extracted = result.Text;
}

Yukarıdaki method içerisinde öncelikle CameraCaptureUI sınıfını ve CaptureFileAsync() methodunu kullanarak uygulamamızın kamera aracılığıyla resim çekmesini sağladık. Bunun için CaptureFileAsync() method‘una CameraCaptureUIMode enum‘ından Photo değerini verdik.

Çekilen resmi OpenAsync() methodu ile açıp BitmapDecoder sınıfının CreateAsync() methoduna parametre olarak verdik. Böylece çekilen resmin hafıza içerisinde tutulduğu yere erişim sağlamış olduk.

GetSoftwareBitmapAsync() methodunu kullanarak SoftwareBitmap sınıfından bir değişken oluşturmuş, resmi bu değişken içerisinde saklamış olduk.

Artık OcrEngine sınıfının TryCreateFromUserProfileLanguages() methodu aracılığıyla kullanıcının cihazı kullandığı dilde OCR yapabileceği değişkeni oluşturabilir, RecognizeAsync() methodu ile karakter tanıma işini yaptırabiliriz.

Son olarak, OcrResult tipindeki değişkenin Text özelliği ile taranan resmin içerisindeki yazıları string tipinde elde edebiliriz.

Ben aşağıdaki görseli kullanarak bir tarama yaptırdım ve sonucu aşağıya yazdım;

Bir mum diğerini tutuşturmakla, kendinden bir şey kaybetmez. Mevlana Celaleddin-i Rumi

C# 1 vs C# 6

21 November 2015 Yorum yapılmamış

Eğitim vermeye ilk başladığım yıllarda Console Application projeleri üzerinden uygulamaların aldığı parametreleri ve bu parametreleri nasıl kullanabileceğimizi anlatıyordum.

En basit diyebileceğimiz bu tip işlerin bile yazılım dünyasında ne kadar değiştiğini geçenlerde konuştuğum ve o zamanlar benim eğitimimi dinleyen bir tanıdığım ile tartıştık.

Aklıma hemen bir test projesi açmak ve kendi gözlerimle görmek geldi.

İlk olarak eski usül yöntemler ile Console Application projesinde parametreleri alalım;

Şimdi yeni usül yöntemler ile Console Application projesinde parametreleri alalım;

Ne dersiniz, C# yazılım geliştiriciler olarak işlerimiz kolaylaştı mı?

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"

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;