Sunucunun gelen requestlere tepkisi

19 Tem

Web sunucunuza peş peşe gelen gelen requestler karşısında işlemci (CPU) ve belleğinizin (RAM) tepkisi nasıl olur diye düşündünüz mü?

Ben bunu gerçekten merak ediyordum. Sonucu görmek için test sunucumu, C# ile yazdığım bir bot yardımıyla request yağmuruna tuttum.

Acaba RAM mi daha fazla yorulur CPU mu sorusunun cevabını bulmak üzereydim. Tabi sonuç tüm sunucular için aynı olmayabilir. Çünkü istek gönderilen sayfaların veritabanını kullandığı, diskler arama yaptığı, bellek gerektirecek işlemler yaptığı göz önünde bulundurulmalıdır.

Benim aldığım sonuç şu şekildeydi.

Bellekte neredeyse hiç bir tepki olmazken CPU %80 – %90 gibi seviyelere ulaştı.

Asp.net Globalization Ayarları

18 Tem

Asp.net projelerimizi yayınladığımızda bazen türkçe karakter sorunlarıyla karşılaşabilmekteyiz. Bu yazıda anlatmak istediğim Türkçe karakter sorununda ziyade geliştirme yaptığımız bilgisayarlar ile sunucular arasındaki kültür farkından kaynaklanabilecek sorunlar hakkında olacak.

Örneğin kendi makinamız türkçe işletim sistemli ve sunucumuz da yurt dışında. Bu durumda hem türkçe karakter sorunu, hem de tarihsel farklardan dolayı oluşabilecek tarih format farklılıkları gibi sorunlarla karşılaşabilmekteyiz. Bu durumu aşmak için yapmamız gereken web.config dosyası içerisindeki system.web alanına bir globalization ayarını düzenlemektir.


<system.web>
<globalization culture="tr-TR" />

Bu durumda kültük farkından kaynaklanan sorunlardan kurtulabilmekteyiz.

Eğer ASP.NET MVC projesi ile geliştirme yapıyorsak, Default model binder, kültür farkından dolayı tarih formatlarındaki property’leri set edemiyor. Böyle bir sorunu da bu şekilde aşabilmekteyiz.

LINQ ile String Birleştirme

17 Tem

Bazen üyelerin emaillerini çekerek toplu mail göndermek durumunda kalabiliriz. Email listesini çekmek kolaydır. Fakat bir de bu emaillerin, aralarına noktalı virgül koyarak birleştirmesi işlemi vardır. Bu işlemi iki yolla yapabiliriz.

  • Email listesini SQL ortamında noktalı virgülle ayrılmış şekilde çekmek.
  • Email listesini dizi şeklinde SQL sorguyla alıp, birleştirme işlemini kod tarafında yapmak.

Biz ikinci yöntem üzerinde duracağız.

Elimizdeki email listesi şu şekilde olsun.


List<string> data = new List<string>
{
    "aaa@mail.com",
    "bbb@mail.com",
    "ccc@mail.com",
    "ddd@mail.com",
    "eee@mail.com"
};

Bu listeyi şimdi birkaç yöntemle birleştirmeyi deneyelim.

Birinci yol: LINQ Aggregate extension metodunun kullanımı.

var emails = data.Aggregate((s, e) => string.Concat(s, ";", e));

İkinci yol: String.Join extension metodunun kullanımı.

var emails = string.Join(";", data);

Her iki yönteminde çıktısı şu şeklide olacaktır:

"aaa@mail.com;bbb@mail.com;ccc@mail.com;ddd@mail.com;eee@mail.com"

LINQ / Lambda Expression

16 Tem

Bu yazımızda da LINQ sorgularının lambda ifadeleriyla nasıl yazıldığını inceleyelim. Uzun uzun yazılan LINQ sorgularını tek satırda yazmak mümkündür. Bu sayede hem temiz hemde rahat okunabilir bir kod ortayaçıkıyor.

Bir Employee sınıfı oluşturup, sorgulama yapmak için de bu tipe ait bir liste oluşturarak işe başlayabiliriz.


 public class Employee
 {
       public int id { get; set; }
       public string Name { get; set; }
       public double Salary { get; set; }

       public override string ToString()
       {
            return string.Format("Name: {0} Salary: {1}",Name, Salary);
       }
 }

Employee tipine ait liste de şu şekilde olsun.


 List<Employee> Employees = new List<Employee>
 {
      new Employee{ id=1102, Salary=1250, Name="Jim" },
      new Employee{ id=1802, Salary=2250, Name="Tim" },
      new Employee{ id=1650, Salary=3250, Name="Kim" },
      new Employee{ id=2102, Salary=1750, Name="Sim" },
      new Employee{ id=3182, Salary=1350, Name="Him" },
};

Sorgu: Maaşı 1900’den küçük olan çalışanları ada göre sıralayarak göster.

Linq Sorgusu

    var linqResult = from c in Employees
                     where c.Salary < 1900
                     orderby c.Name
                     select c;

Lambda Expression Sorgusu

var lambdaResult = Employees.Where(i => i.Salary < 1900).OrderBy(i => i.Name);

Sorguları çeşitlendirmek mümkündür. Sonuçta bu örnek göldeki bir damla gibidir.

Sql Server Error Code 2337

14 Tem

Sanal  makinede oluşturulmuş Windows Server 2003 üzerinde SQL Server 2008 R2 yükleme işlemi sırasında karşılaşılan bir sorundan bahsetemk istiyorum. Sanal makineye SQL Server 2008 R2 sürümünü de Volume olarak ekleyip, bu sanal disk üzerinden kurulum yapmaya çalıştığımda, kurulum sonuna doğru bir hata ile karşılaştım.

Hata şu şekildeydi:

Microsoft SQL Server 2008 Setup
The following error has occurred:
The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2337.

Hemen ardından gelen pencerede ise, yükleme durumu hakkınad şu şekilde olumsuz bir rapor verilmiştir.

Tam da belayı bulduk dediğim kısım işte burasıdır. Kurulum hatayla sonuçlanmıştır.

Kurulum log dosyasını incelediğimde şu şekilde bir rapor vardı karşımda.

Overall summary:
Final result: SQL Server installation failed. To continue, investigate the reason for the failure, correct the problem, uninstall SQL Server, and then rerun SQL Server Setup.
Exit code (Decimal): -2068643839
Exit facility code: 1203
Exit error code: 1
Exit message: SQL Server installation failed. To continue, investigate the reason for the failure, correct the problem, uninstall SQL Server, and then rerun SQL Server Setup.
Start time: 2011-06-07 11:16:15
End time: 2011-06-07 12:03:35

Sorunun çözümüyle alakalı olarak uzmanların görüşlerinden biri, Sanal sürücü üzerinden değil, fiziksel sürücü üzerinden kurulumun yapılması yönündedir.

Ancak ben sorunun çözümü olarak SQL Server 2008 R2 yerine SQL Server 2008 (R2 olmayan) sürümünü yine sanal sürücü üzerinden kurmayı denedim ve sonuç alabildim.

Web Chart Aracı Visifire

13 Tem

Verilerin grafiksel gösterimi konusunda piyasada birçok araç mevcuttur. İşte bunlarda bir tanesi de Visfire Chart. Buradan aracı inceleyebilmek mümkün. Web ortamında online demolar sayesinde canlı görüntüleri izleyebiliyorsunuz.

Desteklenen platformlar :

  • Silverlight
  • SharePoint
  • WPF
  • Windows Phone

Özellikle silverlight ortamında çalışan chart tool bulmak biraz zordur. Bu açıdan visifire aracı ilgimi çekmiştir.

Visual Studio code coverage özelliğini açmak

12 Tem

Visual Studio 2010 üzerinde geliştirdiğimiz Test Driven uygulamalrın ne kadarının test kapsamında olduğunu anlamak için code coverage aracından faydalanırız. Tabi bu özellik Visual Studio default test aracıyla çalışırken geçerli. Piyasadaki diğer test araçlarını kullanıyorsanız onlara göre ayar yapmalısınız.

Code coverage özelliğini açmak için şu adımları izlemeliyiz:

  1. Solutution Explorer penceresindeki [Local].testsettings dosyasına çift tıklayın.
  2. Açılan “Test Settings” dialog penceresinde, “Data and Diagnostics”  menüsünü seçin.
  3. Açılan listede, “Code Coverage” [Resim 1] seçerek ‘”Configure” butonuna tıklayın.
  4. “Code Coverage Detail” [Resim2] penceresinden kod kapsamını merak ettiğiniz assembly yi seçin.
  5. Testinizi çalıştırın ve “Test Tools” toolbar içerisindeki “Code Coverage Results” seçeneğinden sonucu inceleyin.
Resim-1
Resim-2

Login failed for user ‘IIS APPPOOL\DefaultAppPool Hatasi

12 Tem

Uygulamalarınızı hazırlayıp IIS üzerinde çalıştırmaya hazırlanırken birden bir hatayla karşılaşırsınız.

Hata : Login failed for user ‘IIS APPPOOL\DefaultAppPool’. şeklindeyse çözüm gayet basit. Aslında çözümün nasıl olduğunu öğrendikten sonra “gayet basit” diyebiliyorum. Normalde benim de canımı sıkmıştı bu hata.

Neyse, çözüm için IIS’i çalıştırıp aşağıdaki resimde görüldüğü gibi DefaultAppPool ayarlarını LocalSystem olarak ayarladığımızda olay tamamdır.

Dictionary Key Value değerlerinin birleştirlmesi

11 Tem

Dictionary tarzı, Key – Value çiftlerinden oluşmuş tiplerin elemanlarını birleştirerek göstermek istediğimiz durumlar oluşatuğunda ne yapmalıyız? Ben genelde bu tarz işlemlerde LINQ nimetlerinden faydalanmayı uygun buluyorum. Aksi taktirde diziler ve indexleriyle uğraşmak zorunda kalıyorum.

Web uygulamalarında URL oluştururken parametre değerlerini girmek istediğimizde, parametre adları ve değerlerini Key Value çiftleri olarak değerlendirebiliriz.

Örneğin şu şeklide bir URL oluturmak istiyoruz. www.bayramucuncu.com/urunler?id=5&categoryId=9&color=blue

Bu URL’in Querystring bölümünü (id=5&categoryId=9&color=blue) kısmını bu şekilde oluşturmaya çalışalım.

Öncelikle query string oluşturacak metodu yazmalıyız. Bu metodumuz da anahtar ve değer ikililerini tutan bir Dictionry<string,string> parametresi almalı.


private string queryString(Dictionary<string, string> parameters)
 {
      if (parameters == null)
          throw new ArgumentNullException("Parametreler boş gönderilemez");

      var pairs = parameters.Select(i => string.Format("{0}{1}{2}", i.Key, "=", i.Value));
      var values = string.Join("&", pairs);

      return string.Join("&", pairs);
 }

Bu şekilde, amaçladığımız query string  oluşturma işlemini yapacak metodu hazırladık. Şimdi de sonuca bakalım.

queryString(new Dictionary<string, string> { { “id”, “5” }, { “categoryId”, “9” }, { “color”, “blue” } });

şeklinde gönderilen bir dictionary sonucunda karşımıza şu şeklide bir resim çıkıyor.

ve işlem başarılı!

Tekrar görüşmek dileğiyle.

Asp.net mvc meta description türkçe karakter sorunu

11 Tem

Asp.net mvc ile geliştirdiğim uygulamalarda seo konusuna geldiğimde karşılaştığım bir sorunu da meta etiketlerinin açıklamalarının dinamik olarak oluşturmaya çalıştığımda karşıma çıkar karakter sorunuydu. Bu sorunu, HTML encoding yüzünden yaşadığımı düşünüyorum.

<!DOCTYPE html>
<html lang="tr">
<head>

<title>@ViewBag.Title</title>

<meta name="description" content="@(MvcHtmlString.Create(ViewBag.Description))"/>

Normalde meta description içerisinde “sürü” yazmalıydı ama yazmıyor işte.

Bu sorunu düzeltmek için meta description kısmında küçük bir değişiklik yaparak şu şekle getirdiğimde sorun ortadan kalkıyor.

<meta name="description" content="@(Html.Raw(ViewBag.Description))"/>
[code]

ve sonuç aşağıdaki gibidir.
[code language="xml"]<meta name="description" content="sürü" />

Aslında burada karşılaştığımız sorun razor view engine tarafından alınmış bir güvenlik önlemi. Yani bir kullanıcı, sayfamınız yorum kısmına sürekli alert veren bir javascript kodu yazdığında, bu yorum Html tarafında direk render edilirse, sayfa her açıldığında kullanıcıların karşısına alert veren bir pencere çıkacaktır.

Bu tarz javascript ataklarını önleyebilmek için, helper sınıfları ve metodları kullanılır genelde. Örneğin yukarda kullanılan Html.Raw metodu yardımı ile bu içeriğin ne olduğunu bildiğimizi belirtiyor ve html olarak render edilmesini istiyoruz.

Aslında kıllanabileceğimiz bir kaç tane yöntem  var. Şu şeklide sıralayabiliz.

1- <meta name="description" content="@(ViewBag.Description)"/>
2- <meta name="description" content="@(MvcHtmlString.Create(ViewBag.Description))"/>
3- <meta name="description" content="@(new MvcHtmlString(ViewBag.Description))"/>

Bu yöntemlerin hepsinin temelinde yatan IHtmlString arayüzünün ToHtmlString() metodudur.

Tekrar görüşmek ümidiyle.