30 Haziran 2011 Perşembe

Hayatı kolaylaştıran bazı C# kısayolları

1. ? Operatörü
Bu operatör if-then-else koşullarını, "soru ? positif cevap : negatif cevap" pattern' ı sayesinde tek satırda yazmamızı sağlıyor.
Örnek:
if (x > y)
max = x;
else
max = y;

Yukarıdaki kodun yerine aşağıdaki kod yazılabilir.
int max = (x > y) ? x : y;

2. ?? Operatörü
Hepimiz sıklıkla bir nesnenin null olup olmadığını kontrol eden kodlar yazıyoruz. ?? operatörü ile bu tip kontrollerimizi tek satırda yapabiliyoruz.
Örnek:
object cache = null;
object d = new object();
object e;
if (c != null)
e = c;
else
e = d;

Yukarıdaki kodu yerine ? operatörü ile yazarsak.
object cache = null;
object d = new object();
object e = (c != null) ? c : d;

?? ile biraz daha kısaltalım,
object cache = null;
object d = new object();
object e = c ?? d;

3. Nesne Oluşturma
Yeni bir nesne yarattıktan sonra bir çok özelliğine değer atamamız gerekir. Bunu nesneyi yaratırken de yapabiliriz.
Örnek:
Customer c = new Customer();
c.Name = "James";
c.Address = "204 Lime Street";

Yukarıdaki kodu şöyle de yazabilirdik.
Customer c = new Customer { Name="James", Address = "204 Lime Street" };

4. Using Statement
Nesne yarattık, kullandık ancak dispose komutunu çalıştırmayı unuttuk ve bellek/kaynak sorunlarına yol açtık. IDisposable interface' inden üretilen nesneleri using statement ile kullanırsak dispose işlemini .Net Framework bizim için yönetir.
Örnek:
// 1. Allocation of the object
Font font1 = new Font("Arial", 10.0f);
try
{
// 2. The bit where we use the resource
}
finally
{
// 3. Disposal of the object
if (font1 != null)
((IDisposable)font1).Dispose();
}

Yukarıdaki kod yerine,
// Allocate the resource
using (Font font1 = new Font("Arial", 10.0f))
{
// The bit where we use the resource
}
// Disposal is automatic

5. Uzun Namespace veya Tip isimleri için Alias
Uzun namespace veya tip bilgileri için alias tanımlayıp sınıfları bu alias ile çağırabiliriz. Alias tanımlamak için using anahtar kelimesi kullanılır.
Örnek:
using Word = Microsoft.Office.Interop.Word;
...
Word.Application = new Word.Application() { Visible = True; }

6. Nullable Nesneler
.Net 2.0 ile null değeri alamayan değişkenler nullable olarak tanımlanabilmekte ve null değeri alabilmektedir. Bunu aşağıdaki syntax ile sağlayabiliriz.
Örnek:
Nullable x = null;
int? x = null;

7. Otomatik Özellikler (Properties)
En sevdiğim özelliklerden birisi. .Net 3.0 ile birlikte gelmiştir. Private değişken tanımlayıp get/set property'sini uzun uzun oluşturmak yerine tek satırda yazmamıza olanak veriyor.
Örnek:
public class Person
{
private string _firstName;
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
}

public class Person
{
public string Firstname { get; set; }
}

 

Linq To Sql, Entity Framework Hangisini neden seçmeliyim?

 

Linq To Sql

Linq To Entity (ADO.Net Entity Framework)

 

DB

SQL Server

Her türlü ADO.Net data provider

Aynı anda desteklenen şema, protocol sayisi

1

N

Many To Many Relation desteği

M-M tablolar birer entitiy olarak
tanımlanmalı

Var

Relation Multiplicity Ayarı

-

Var

Map etme şekli

1 table - 1 class

N table - 1 class

Hedef Projeler

Çabuk, hızlı projeler

Kurumsal yazılımlar

Kompleks tiplerin yaratılması (örneğin
adres diye bir tip oluşturulabilmesi)

-

Var

Data Source

Veritabanı tabloları

Veritabanı tabloları, replication,
Reporting Services, BI, vbl.

Sorgulama

1. Linq to Sql

1. Linq to sql

 

 

2. Data Context

2. Entity Sql (inheritance destekliyor)

 

3. Entity Client

Veritabanı değişince senkronize
edebilme desteği

-

Var

Performans

çok yavaş

linq to sql'den daha iyi

Geliştirilme Durumu

Durduruldu

Devam Ediyor

Data Model'den veritabanı üretilmesi

-

VS2010'da mümkün olacak


Entity Framework'ün VS2008SP1 üzerinde Kısıtları (Osellus Blogs'dan alıntıdır)

1.) Contains metodu runtime'da hata verecektir. Örnek:
         from p in context.Yard_Projects
         where p_projectIDs.Contains(p.ProjectID)
         select p

2.) Entity Type tipinde dönüş yapmayan procedure'ler için metod generate edilmeyecektir.
(Stored Procedure'leri çalıştırmak için Entity Client'a ihtiyacımız var.)

3.) Tablodaki her kolon map edilmek zorundadır. Aksi takdirde compile error alacağız.

4.) Birçok tablodan veri dönen bir stored procedure'e referans kullanan bir metod yaratmak istiyorsak,
.edmx file'ı içinde yer alan "SSDL" bölümünü elle değiştirmemiz gerekmektedir.

 

XmlDocument - RAM emici vampir

Entegrasyon servisleri gibi sık kullanılan uygulamalarda XmlDocument kullanımı ciddi performans kayıplarına neden olabiliyor.

Örneğin zotrix.xml adında 10Mb büyüklüğünde bir xml dosyamız olsun, basit bir asp.net sayfası oluşturup butonun click event’ine aşağıdaki kodu yazıp arka arkaya 5-10 kez basın.

     XmlDocument x = new XmlDocument();

     x.Load(Server.MapPath("zotrix.xml"));

Bu arada Windows Task Manager’den w3wp’nin kullandığı bellek miktarını izlemeyi unutmayın.

Sonuçlar korkutucu değil mi? GarbageCollector bir süre sonra devreye giriyor ama çok geç olabilir.

Çok kullanıcılı web uygulamalarında durum daha da ciddi.

Çözüm olarak tavsiye edilen ise daha hızlı ve daha az kaynak tüketen XmlTextReader.

 

IIS compression ayarları

IIS’te iki çeşit sıkıştırma mevcut: Static ve dynamic. Static sıkıştırma css dosyası gibi değişmeyen dosyalar için default 9 olarak belirtilmiş, yani maximum sıkıştırma. Çünkü bu tür dosyalar sunucu tarafında bir kez sıkıştırılıyor ve herkese bu sıkıştırılmış hali gönderiliyor. Dinamik sıkıştırmada ise durum farklı. Default değer 0 olarak belirtilmiş, yani az sıkıştır ama en kısa sürede sıkıştır denmiş. Dinamik sayfalar için en uygun sıkıştırma seviyesinin ne olacağı konusunda internette yaptığım araştırmaya göre bu seviyenin 3,5 ile 4 arasında olması en uygun görünüyor. Küsuratlı rakamlar kabul edilmediği için dinamik sıkıştırma için en uygun seviye 4 diyebiliriz. Bu durumda web server’in cpu’suna sıkıştırmadan kaynaklanan yükün yaklaşık %10’u kadar ek bir yük gelecek fakat sayfa boyutları eskisine göre %40’lara varan oranda azalacaktır. Kendi makinemde yaptığım testlerde sıkıştırma seviyesi 0 iken 288 Kb olan bir sayfa, bu seviyenin 4’e çıkarılması ile 181 Kb’a düştü. Dinamik sıkıştırma seviyesini aşağıdaki komutla değiştirebilirsiniz:

 

C:\Windows\System32\Inetsrv\Appcmd.exe set config -section:httpCompression -[name='gzip'].staticCompressionLevel:9 -[name='gzip'].dynamicCompressionLevel:4

 

IIS 7.5 classic mode performans ayarları

IIS 7.5'de classic mod kullanımında IIS 6 için geçerli olan default değerler kullanılmaktadır. Böyle bir durumda Microsoft'un, web uygulamalarının performansını arttırmak, beklemeleri önlemek amacıyla önerdiği birkaç değişiklik gerçekleştirilebilir.

 

Default değerler

    <connectionManagement>

       <add address="*" maxconnection="2" />

   </connectionManagement>

    <httpRuntime minFreeThreads="8" minLocalRequestFreeThreads="4" ... />

    <processModel maxWorkerThreads="20" maxIoThreads="20" "  minWorkerThreads="1" minIoThreads="1"   ... />

 

Yeni değerler

    <connectionManagement>

        <add address="*" maxconnection="48" />

     </connectionManagement>

     <httpRuntime minFreeThreads="352" minLocalRequestFreeThreads="304" ... />

     <processModel maxWorkerThreads="100" maxIoThreads="100"  minWorkerThreads="10" minIoThreads="10"  ... />

 

Bu değişiklikler şu anlama geliyor:

 

•             maxconnection: Tek CPU için geçerli değer. Uygulama içinden bir web sayfasına veya web servisine aynı anda en fazla 2 istek gönderilebilir. 4 çekirdekli bir server için aynı anda en fazla 8 istek gönderilebilmesi demek. Entegrasyon ve raporlama gibi sık kullanılan servisler için kısıtlayıcı olabilir. Örneğin hastane uygulamalarında özellikle sabah saatlerinde SGK’dan hastalara provizyon ve takip numarası alırken bu ayar yapılmamışsa uzun kuyruklar oluşacaktır.

•             minworkerthreads ve miniothreads değerlerinin 1 olmasından dolayı gelen istekle birlikte yeni bir threadin oluşturulup ayağa kaldırılması gerekmekte, bu da gecikme anlamına gelmektedir.

•             maxworkerthreads ve maxiothreads'in de 20 olması çok kullanıcılı sistemlerde kuyruğa neden olabilir.

 

Default değerlerin kullanımından kaynaklanan herhangi bir bekleme, kuyruğa alma işlemi varsa bu değişiklikler sonrasında ortadan kalkacak ve CPU aynı anda daha fazla isteğe yanıt verebileceği için CPU kullanım oranı artacaktır. Bu durumda server’e bir kaç çekirdek daha eklenebilir.

 

IIS 7.5 integrated mode

Machine.config dosyasındaki processModel tag’inin önemi ortadan kalkıyor, örneğin maxworkerthread ve maxiothread gibi eskiden 20 olan varsayılan değerler cpu başına 100’e çıkarılmış durumda. Performansı etkileyebilecek yanlış bir default değer ise yine mevcut: maxConcurrentRequestsPerCPU. Bu değer default 12 olarak belirtilmiş. Microsoft’un tavsiyesi bu değerin 5000’e çıkarılması. Neden mi 5000? Okuduğum kadarıyla “büyük bir değer yapalım, ne olsun?” denmiş ve birisi 5000 demiş ve .Net Framework 4.0’da bu değer default 5000 olmuş. .Net Framework 4.0’dan eski bir versiyon kullanıyorsanız, aşağıdaki 12 olan değeri değiştirmeniz faydalı olacaktır.

 

<system.web>

   <applicationPool maxConcurrentRequestsPerCPU="12" maxConcurrentThreadsPerCPU="0" requestQueueLimit="5000"/>

</system.web>

 

 

27 Haziran 2011 Pazartesi

Blog sayfasından, Outlook hesabına RSS Almak

http://bimar-arkas.blogspot.com/ adresinden veya başka bir blog sayfasından outlook hesabınıza RSS eklemek için şu adımlar izlenmelidir.

1-) Outlook --> Inbox--> RSS Feeds : sağ tıklanır --> Add a New RSS Feed seçilir.


2.) RSS feed URL sine aşağıdaki formatta url girilir.



3.) Gelen onay ekranı "Yes " ile geçilir.  İşlem tamamlandı. Artık her yeni blog eposta adresinize otomatik olarak gelecek.