Arşiv

Etiketlenen yazılar ‘static’

ASP.NET ile Mobil Kullanıcıları Mobil Sayfaya Yönlendirmek

ASP.NET 4.0 ile aşağıdaki kod yardımıyla mobil kullanıcıları algılayabilir ve uygulamanın mobil sayfasına yönlendirebilirsiniz;

private static readonly Regex MobileRegex = new Regex(@"(nokia|sonyericsson|blackberry|IPHONE|samsung|sec-|windows ce|motorola|mot-|up.b|midp-)", RegexOptions.IgnoreCase | RegexOptions.Compiled);

public bool IsMobile
{
	get
	{
		HttpRequest r = HttpContext.Current.Request;

		if (r.Browser.IsMobileDevice)
			return true;

		if (!string.IsNullOrEmpty(r.UserAgent) && MobileRegex.IsMatch(r.UserAgent))
			return true;

		return false;
	}
}

protected void Page_Load(object sender, EventArgs e)
{
	if (IsMobile)
		Response.RedirectPermanent("Mobile.aspx", true);
}

C# Partial Method Desteği

C# 3.0 ile gelen partial keyword’u sayesinde partial class tanımlayabiliyoruz.

partial keyword’unun pek bilinmeyen bir kullanım alanı ise method‘lardır.

partial class tanımlayabildiğimiz gibi partial method‘da tanımlayabiliyoruz.

partial class‘ları tanımlamamızdaki en büyük fayda, kod üreticiler olmuştur. partial method tanımlamanın güzelliği de işte burada. Bir kod üreticisi ile otomatik olarak kod ürettirirken, partial method‘lar ürettirebiliriz.

Eğer üretilmiş partial method‘u uygulamazsanız, ilgili partial method‘u çağıran kod parçaları hata vermiyor.

Basitçe, uygulanmamış partial method çağrıları derleme (compile) sırasında yok sayılıyor.

Ama partial method‘lar için bazı kısıtlamalar ve kurallar var;

  • partial method’ların geri dönüş tipi herzaman void olmalıdır
  • partial method’lar out parametreler alamazlar, ama ref parametreler alabilirler
  • partial method’lar extern olamazlar
  • partial method’lar erişim belirleyici alamazlar, çünkü herzaman private erişim belirleyicisine sahiptirler
  • partial method’lar virtual olamazlar
  • partial method’lar static olabilir
  • partial method’lar generic olabilir
  • partial method’lara delegate bağlanamaz, çünkü partial method’un çalışma zamanında (runtime) var olacağı garanti değildir

Bu bilgilerden sonra örnek bir class yazalım;

public partial class DataAccessLayer
{
	partial void ResetConnection();
}

public partial class DataAccessLayer
{
	partial void ResetConnection()
	{
		///Connection'ı resetleyen kod
	}

	public void Reset()
	{
		ResetConnection();
	}
}

Gördüğünüz gibi, Reset() isminde public bir method yazmam gerekti. Çünkü, ResetConnection() method‘u partial olduğu için private erişim belirleyicisine sahip.

Eğer yukarıdaki kodun exe/dll dosyasına ILDASM tool’u bakarsak, DataAccessLayer.ResetConnection() private method’unu ve Reset() method‘u içerisinde bu method’u çağıran kod parçasını görürüz.

Eğer ResetConnection() method’unu uyguladığımız kod parçasını sildikten sonra, ILDASM ile bakarsak, DataAccessLayer.ResetConnection() private method’unun bulunmadığını ve Reset() method’unda bu method’u çağıran kod parçası olmadığını görürüz.

Böylece çalışma zamanı hatası almayız.

C# ile isNumeric() fonksiyonu yazalım

VB.NET programcılarının kullanabildiği, ama C#‘ta bulunmayan isNumeric() fonksiyonunu kendimiz yazacağız;

public static class ExtensionManager
{
	public static bool isNumeric(this string value)
	{
		double oReturn = 0;
		return double.TryParse(value, out oReturn);
	}
}

Artık C# kodumuzun herhangi bir yerinde

string Deger = "5";
bool Rakamsal = isNumeric(Deger);

veya

string Deger = "5";
bool Rakamsal = Deger.isNumeric();

kullanabiliriz.

C# ile Google PageRank Bulma

23 Aralık 2009 engin.polat 1 Yorum

Google‘ın PageRank uygulaması, web sitelerinin Google tarafından önemini bulmakta kullanılan bir algoritmadır.

Wikipedia’daki şu adresten, PageRank algoritması ile ilgili ayrıntılı bilgiye erişebilirsiniz.

Siz de sitenizin PageRank değerini http://www.prchecker.info adresinden bulabilirsiniz.

Yazacağımız uygulama ile, sitenizin Google PageRank değerini programatik olarak buldurabileceğiz.

Google sitelerin PageRank değerlerini, http://toolbarqueries.google.com/search adresine gönderilen sorgulara cevap olarak verebiliyor. Fakat sonuç alabilmemiz için bu adrese doğru parametreleri vermemiz gerekiyor, aksi halde HTTP403 : Forbidden hatası alıyoruz.

Parametreler:

  • features=Rank
  • client=navclient-auto
  • q=info:{adres}
  • ch={checksum}

Checksum bilgisini hesaplamak için Google’ın yayınladığı bir algoritma var. Uygulamamızda, bu algoritmayı C# ile yazacağız.

Yukarıdaki resimde görünen arayüzü hazırladıktan sonra, projemize GooglePageRank isminde static class ekliyoruz.

GooglePageRank static class’ı üç tane static method’dan oluşuyor.

private static void Mix(ref uint a, ref uint b, ref uint c)
{
	a -= b;
	a -= c;
	a ^= c >> 13;
	b -= c;
	b -= a;
	b ^= a << 8;
	c -= a;
	c -= b;
	c ^= b >> 13;
	a -= b;
	a -= c;
	a ^= c >> 12;
	b -= c;
	b -= a;
	b ^= a << 16;
	c -= a;
	c -= b;
	c ^= b >> 5;
	a -= b;
	a -= c;
	a ^= c >> 3;
	b -= c;
	b -= a;
	b ^= a << 10;
	c -= a;
	c -= b;
	c ^= b >> 15;
}
private static string GoogleChecksum(string url)
{
	uint GoogleMagic = 0xE6359A60;

	uint a, b;
	uint c = GoogleMagic;

	a = b = 0x9E3779B9;

	int k = 0;
	int length = url.Length;

	while (length >= 12)
	{
		a += (uint)(url[k + 0] + (url[k + 1] << 8) + (url[k + 2] << 16) + (url[k + 3] << 24));
		b += (uint)(url[k + 4] + (url[k + 5] << 8) + (url[k + 6] << 16) + (url[k + 7] << 24));
		c += (uint)(url[k + 8] + (url[k + 9] << 8) + (url[k + 10] << 16) + (url[k + 11] << 24));

		Mix(ref a, ref b, ref c);

		k += 12;
		length -= 12;
	}

	c += (uint)url.Length;

	switch (length)
	{
		case 11:
			c += (uint)(url[k + 10] << 24);
			goto case 10;
		case 10:
			c += (uint)(url[k + 9] << 16);
			goto case 9;
		case 9:
			c += (uint)(url[k + 8] << 8);
			goto case 8;
		case 8:
			b += (uint)(url[k + 7] << 24);
			goto case 7;
		case 7:
			b += (uint)(url[k + 6] << 16);
			goto case 6;
		case 6:
			b += (uint)(url[k + 5] << 8);
			goto case 5;
		case 5:
			b += (uint)(url[k + 4]);
			goto case 4;
		case 4:
			a += (uint)(url[k + 3] << 24);
			goto case 3;
		case 3:
			a += (uint)(url[k + 2] << 16);
			goto case 2;
		case 2:
			a += (uint)(url[k + 1] << 8);
			goto case 1;
		case 1:
			a += (uint)(url[k + 0]);
			break;
		default:
			break;
	}

	Mix(ref a, ref b, ref c);

	return string.Format("6{0}", c);
}
public static string PageRankHesapla(string adres)
{
	string checkSum = GoogleChecksum("info:" + adres);
	string url = "http://toolbarqueries.google.com/search?client=navclient-auto&ch=" + checkSum + "&features=Rank&q=info:" + adres;

	try
	{
		WebRequest request = WebRequest.Create(url);
		WebResponse response = request.GetResponse();

		StreamReader reader = new StreamReader(response.GetResponseStream());
		string data = reader.ReadToEnd();

		reader.Close();
		response.Close();

		if (data.IndexOf(':') != -1)
			data = data.Substring(data.LastIndexOf(':') + 1);

		return data;
	}
	catch (Exception)
	{
		return "-1";
	}
}

Şimdi yapmamız gereken, Butonun Click olayında, GooglePageRank static class’ının PageRankHesapla method’unu çağırmak ve dönen değeri Label’da göstermek.

Uygulamanın çalışır halini bu adresten indirebilirsiniz.

ClickOnce ve ApplicationDeployment class’ı

Kısa Sınav – 3 yazımda belirttiğim gibi, ClickOnce ile deploy ettiğiniz uygulamalarda, güncellemeleri programatik olarak kontrol etmek için ApplicationDeployment class’ını kullanırız.

Bu yazımda, ApplicationDeployment class’ının kullanımını anlatmaya çalışacağım.

Öncelikle bilinmesi gereken, ApplicationDeployment class’ından yeni bir instance oluşturamazsınız. Çünkü public bir constructor’ı yoktur.

KisaSinav3_1

ApplicationDeployment class’ından yeni bir örnek oluşturmak için, gene ApplicationDeployment class’ının static ve singleton CurrentDeployment property’sini kullanırız.

KisaSinav3_2

Artık elimizde bir değişken olduğuna göre, bu değişkeni kullanarak uygulamamızda güncelleme olup-olmadığını sorgulayabiliriz.

Bunun için kullanabileceğimiz fonksiyonlar;

KisaSinav3_3

CheckForUpdate()

Uygulamanın yeni versiyonu olup-olmadığını kontrol eder, geriye bool tipinde değer döner.

CheckForUpdateAsync()

CheckForUpdate() fonksiyonu ile aynı işi yapar, fakat asenkron çalışabilir.

Versiyon kontrolü tamamlandığında CheckForUpdateCompleted event’i otomatik olarak çağırılır.

CheckForDetailedUpdate()

Uygulamanın yeni versiyonu olup-olmadığını kontrol eder, geriye UpdateCheckInfo tipinde değer döner.

KisaSinav3_4

Genelde CheckForDetailedUpdate() fonksiyonunu çağırmakta fayda vardır. Çünkü, daha güncel versiyonun çıktığını bulduğumuzda, kullanıcıya mesaj vermek isteyeceğiz. Mesaja yazacağımız detaylı bilgiye UpdateCheckInfo class’ı aracılığıyla ulaşabiliriz. Bu bilgiyi bize CheckForDetailedUpdate() fonksiyonu döndürüyor.

UpdateCheckInfo class’ının member’ları;

AvailableVersion

Uygulamanın güncellenebilir son versiyonunun versiyon bilgisi. (Version tipinde değer döner)

IsUpdateRequired

Uygulamanın ClickOnce ile deploy’u sırasında “UpdateRequired” seçeneğinin seçilip seçilmediğinin bilgisi. (bool tipinde değer döner) Eğer true değer içeriyorsa, kullanıcıya mesaj verilmeli, çalışan uygulaman kapatılmalı ve güncelleme yapılmalıdır.

MinimumRequiredVersion

Kullanıcıda bulunması gerekli minimum versiyon bilgisi. (Version tipinde değer döner)

UpdateAvailable

Kullanıcıda çalışan uygulamadan daha güncel bir versiyonun bulunup bulunmadığı bilgisi. (bool tipinde değer döner)

UpdateSizeBytes

Güncellenecek dosyaların toplam boyutu bilgisi. (long tipinde değer döner)