Fırat Esmer

Microsoft Yazılımları

Microsoft Visual Studio LightSwitch 2011 Çıktı

Microsoft Visual Studio LightSwitchUzun zamandır Microsoft cephesinden haberi beklenen Visual Studio LightSwitch 2011 bugün deneme sürümü olarak indirilebilir hale getirildi. Microsoft Store'dan 28 Temmuz 2011 Perşembe, Microsoft dışındaki yerlerden satışlar ise 1 Ağustos 2011 Pazartesi günü satışına başlayacak. LightSwitch'in fiyatı ise 299$ olacak. Şimdiden Visual Studio LightSwitch 2011 için DevExpress, Infragistics ve ComponentOne gibi firmalardan eklentiler çıkarıldı.

Masaüstü, web ve bulut sistem için profesyonel kalitede iş uygulamaları oluşturmak istiyorsanız buraya tıklayarak Visual Studio LightSwitch 2011 hakkında daha fazla bilgi alabilir veya 30 günlük deneme sürümünü indirebilirsiniz. Ancak indirmeden önce dikkat etmeniz gereken bir kaç nokta var. Bunlar:

  • Visual Studio 2010 Professional, Premium, Test Professional veya Ultimate sürümlerinden herhangi birisini kullanıyorsanız, Visual Studio LightSwitch 2011'i yüklemeden önce Visual Studio 2010 Service Pack 1'i yüklemeniz gerekiyor,
  • Visual Studio LightSwitch Beta kullanıyorsanız bilgisayarınızdan kaldırın, daha sonra Visual Studio LightSwitch 2011 kurun.

Tutarlılık İhlali Kontrolü

Tutarlılık ihlali kavramı (Eşzamanlılık ihlali), birden fazla kişinin aynı veri üzerinde aynı anda değişiklik yapması sonucu ortaya çıkan sorundur. Çok kullanıcılı sistemlerde ortaya çıkması zor ancak çıktığı zaman hataya sebebiyet veren bir sorundur. Aşağıdaki makalede bu soruna çözüm üretip, uygulayacağız.

Senaryo : Veritabanındaki bir kayıt üzerinde değişiklik yaparak DBConcurrencyException hatası alacağız ve bunun çözümünü uygulayacağız.

Bilinmesi Gerekenler :

  • Makaledeki örnek .NET Framework 4.0 ve Visual Studio 2010 ile hazırlandı,
  • Makale, Northwind veritabanı gerektirmektedir. Northwind veritabanını indirmek istiyorsanız buraya tıklayın. Northwind veritabanı kullanmamın sebebi çoğu yazılımcının bilgisayarında mevcut olması. (projenin boyutunu artırmamak için eklemedim)

Neler Öğreneceksiniz :

  • Aşağıdaki makalenin sonucunda Optimistic Locking ve Pessimistic Locking ifadeleri anlayacaksınız,
  • DBConcurrencyException hatası ile karşılaştığınızda ne yapacağınızı bileceksiniz.

Öncelikle yaşadığımız/yaşayacağımız sorunu anlayalım. Çoklu kullanıcının kullanıldığı bir veritabanındaki bir satırı çeken Kullanıcı1 adlı kişi ve ardından aynı satırı çeken Kullanıcı2'yi düşünün. Kullanıcı1 satırda değişiklik yapıp veritabanına güncellediği zaman bundan Kullanıcı2'nin haberi olmayacaktır ve Kullanıcı2 de satırı değiştirmek istediği zaman hangi verinin tutarlı olup olmayacağı gibi bir sıkıntı oluşuyor. Bu sıkıntıyı önlemek adına iki tane yöntem var. Bunlar:

Optimistic Locking (İyimser Kilitleme) / Optimistic Concurrency Control (İyimser Tutarlılık İhlali Kontrolü) : Aynı anda birden fazla kişinin aynı veri üzerinde değişiklik yapabilme prensibine dayalıdır. Çünkü aynı anda birden fazla kişinin aynı veri üzerinde oynama ihtimali düşüktür. İşlem sırasında kilit konmaz, kullanıcı tarafından işlem yapılırken değişiklik olup olmadığına dair kontrol edilir.

Pessimistic Locking (Kötümser Kilitleme) / Pessimistic Concurrency Control (Kötümsel Tutarlılık İhlali Kontrolü) : Bu kontrolde, ilk kullanıcı veriyi okuduğu an veri üzerine kilit konur. Böylece sonraki kullanıcıların veriye erişmesi engellenerek, verinin doğruluğu garanti altına alınmış olur.

Örnekten önce Optimistic Locking ile ilgili bilgi vermek istiyorum. Optimistic Locking'de, değişiklik yapılacak verinin üzerine kilit konulmadığı için bir kaç kontrol yapılmalıdır. Bunlardan ilki değişiklik yapılacak verideki kolonun ilk hali kontrol edilmelidir. Örnek :

UPDATE Employees set LastName = @YeniLastName where LastName = @OrjinalLastName

İkinci yol ise satırın üzerinde bulunan timestamp kolonunun değişip değişmediği kontrol edilir. (timestamp read-only olup mevcut satırın versiyonunu üzerinde tutan veri tipidir. Satır üzerinde yapılan değişiklikte timestamp değeri de değişir.)

UPDATE Employees set LastName = @YeniLastName where TimeStampID = @OrjinalTimeStampID

Yukarıdaki yöntemler sırasında eğer hata meydana gelirse bu da DBConcurrencyException olacaktır. Şimdi hata alabileceğiniz bir uygulama yapalım. Senaryomuz : Veritabanındaki bir satırda güncelleme yapmadan önce programı bir yerde durdurup, veritabanından elle değiştirdikten sonra programımızdan güncelleme işlemine devam edeceğiz. Yani sistemde veri tutarsızlığına sebebiyet vecerek bir durum yaratacağız.

SqlDataAdapter adapter = new SqlDataAdapter();
SqlConnection connection = new SqlConnection("server=.; database=northwind; integrated security=sspi");
SqlCommand command = new SqlCommand("select * from employees", connection);

// SqlDataAdapter'e select komutumuzu veriyoruz.
adapter.SelectCommand = command;

command = new SqlCommand("update employees set LastName=@LastName where FirstName=@FirstName", connection);
command.Parameters.AddWithValue("@LastName", "Esmer");
command.Parameters.AddWithValue("@FirstName", "Firat");

// SqlDataAdapter'e update komutumuzu veriyoruz.
adapter.UpdateCommand = command;

DataSet set = new DataSet();
adapter.Fill(set, "Employees");

// SqlDataAdapter - Update işlemini yapabilmek için herhangi bir değişiklik yapıyoruz.
DataTable table = set.Tables[0];
table.Rows[0]["LastName"] = "DenemeSoyad";

/* Bu satıra breakpoint koyup veritabanınızdan, update sorgumuzda where koşulunda belirtmiş olduğumuz veriyi 
değiştirmenizi istiyorum. (yani FirstName'i Firat yerine başka bir şey yazın.)*/
int rowCount = adapter.Update(set, "Employees");

adapter.Dispose();
connection.Dispose();
set.Dispose();

DBConcurrencyException

Breakpoint'i koyduğunuz yerde veritabanınızdan veriyi değiştirip Update metodunu çalıştırdığınızda GÜM! "Concurrency violation: the UpdateCommand affected 0 of the expected 1 records." hatası alıyoruz. Türkçe : "Tutarlılık ihlali: UpdateCommand, beklenen 1 kaydın 0 kaydını etkiledi." Buradaki hatayı almamızın sebebi UpdateCommand'da belirtilen FirstName'in ilk başta Firat, daha sonra veritabanından değiştirdiğimiz şekilde değişmesi ve buna bağlı tutarsızlığın meydana gelmesi. Bu hatayı gidermek için SqlDataDapter nesnesinin RowUpdated olayını (event'ini) kullanabiliriz. Az önce hata aldığımız Update metotu satırında RowUpdated olayı tetiklenecek. RowUpdated olayı içerisinde DataRow nesnesinin HasErrors özelliğini kullanarak hatalı satır olup olmayacağını kontrol edeceğiz ve eğer satırda hata varsa satır işlenmeyecek, es geçilecek.

SqlDataAdapter adapter = new SqlDataAdapter();
SqlConnection connection = new SqlConnection("server=.; database=northwind; integrated security=sspi");
SqlCommand command = new SqlCommand("select * from employees", connection);

adapter.SelectCommand = command;

command = new SqlCommand("update employees set LastName=@LastName where FirstName=@FirstName", connection);
command.Parameters.AddWithValue("@LastName", "Esmer");
command.Parameters.AddWithValue("@FirstName", "Firat");

adapter.UpdateCommand = command;

adapter.RowUpdated += adapter_RowUpdated;

DataSet set = new DataSet();
adapter.Fill(set, "Employees");

DataTable table = set.Tables[0];
table.Rows[0]["LastName"] = "DenemeSoyad";

/* Bu satıra breakpoint koyup veritabanınızdan, update sorgumuzda where koşulunda belirtmiş olduğumuz veriyi değiştirmenizi 
istiyorum. (yani FirstName'i Firat yerine başka bir şey yazın.)*/
int rowCount = adapter.Update(set, "Employees");

string hataliSatir = string.Empty;

foreach (DataRow item in table.Rows)
{
   if (item.HasErrors)
    {
      // Değişiklik yapılacak satırın sırası ve hatasını alıyoruz.
      hataliSatir = String.Format("{0} -> {1}", item[0], item.RowError);
    }
}

adapter.Dispose();
connection.Dispose();
set.Dispose();

// İşlemin en sonunda kullanıcıyı bilgilendirecek mesajı gösteriyoruz.
MessageBox.Show(String.Format("Güncellenen kayıt sayısı : {0}\nHatalı Satır : {1}", rowCount, hataliSatir));
}

/* SqlDataAdapter satır güncelleme olayı. Hatayı burada yakalayacağız ve hata mesajını belirtip kullanıcıyı 
bilgilendireceğiz.*/
void adapter_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
{
    // 0 = Değişiklik olmadığını gösterir.
    if (e.RecordsAffected == 0)
    {
      e.Row.RowError = "Tutarlılık ihlali: UpdateCommand, beklenen 1 kaydın 0 kaydını etkiledi.";

      // Hatalı satır üzerinde işlem yapılmadan es geçiliyor.
      e.Status = UpdateStatus.SkipCurrentRow;
     }
}

Evet gördüğünüz gibi kilitleme yapmadık, ancak hata da almadık. Pessimistic Locking pek kullanmıyorum. Onun yerine Optimistic Locking ile hata kontrolü yapıyorum. Eğer kilitleme yapmak istiyorsanız (satır) aşağıdaki basit yapıya göz atın derim.

SELECT * FROM Employees  (HOLDLOCK, ROWLOCK) WHERE  EmployeeID = 10

Eğer hazırlamış olduğum örnek uygulamayı indirmek isterseniz buraya tıklayın.

ASP.NET MVC 4 Yol Haritası Hazır

ASP.NET MVCPhil Haack'in 13 Temmuz'da yayınladığı makalede ASP.NET MVC 4 yol haritasından bahsediyor olması, ben de dahil çoğu kişiyi heyecanlandırdı. Makalenin içeriğine baktığımda hiçbir şeyin henüz kesinleşmemiş olduğu, sadece yapmak istenilenden söz edildiğini gördüm. Ondan önce ASP.NET MVC 4 yol haritası ile ilgili söylediklerine bakalım.

"Öncelikle şunu anlamalıyız ASP.NET MVC 4'ün henüz en başındayız ve bu yol haritası bir sonraki sürümün planlama belgesi niteliğindedir. Yeniliklerin şartnamesi değildir. Listede bulunan yenilikleri hayata geçirmek istiyoruz ancak kesinliği yoktur. Planlar değişebilir ve siz yardım edebilirsiniz. Lütfen forumlarımızı ziyaret edin ki gelecek sürümde neler istediğinize dair daha iyi bilgiye sahip olalım."

Evet, gördüğünüz gibi listede bulunan yeniliklerin kesinliği söz konusu değil, sadece eklenmek istenen yeniliklerden bahsedilmiş. ASP.NET MVC 4 yol haritasına göz atmak için buraya tıklayın. Eğer ki "Benim de fikrim var! Bunu da eklerseniz süper olur!" diyorsanız, fikrinizi buraya belirtin ve insanların fikrinizi oylaması için yaratıcı olun :)

Microsoft SQL Server "Denali" CTP3 Hazır

Microsoft SQL Server DenaliMicrosoft SQL Server 2008'in bir sonraki versiyonu kabul edilen, kod adı Denali CTP3 (Community Technology Preview) kullanıma hazır. Açıkçası CTP2 ile ilgili yeniliklerden haberdar değilim, kaçırdım. Ancak Microsoft SQL Server Denali hakkında bilgi almak isterseniz, ÇözümPark tarafından hazırlanmış 70 dakikalık bu güzel videoyu size önerebilirim. Eğer Microsoft SQL Server Denali hakkında bilginiz varsa videoyu direkt es geçip, CTP3 ile gelen yeniliklere bakalım.

  • AlwaysOn özelliği ile verilerin gerekli çalışma süresi ve güvenliği sağlanıyor,
  • Proje Apollo ile öngörülebilir performans kazancı sağlanıyor,
  • Yeni kullanıcı tanımlı roller ve grup şemaları için güvenlik ile uyum sağlanıyor,
  • Proje Crescent ile hızlı veri keşfi sağlanıyor,
  • SSIS (SQL Server Integration Services) iyileştirmesiyle tutarlı ve güvenilir veri sunulabiliyor. Excel için yeni bir servis ve Data Quality Services adında yeni hizmet bulunuyor,
  • Bunun yanında IT çalışanları ve bulut için optimize edilmiş veri katmanı mevcut.

Microsoft SQL Server Denali CTP3'ü indirmek için buraya tıklayın (malesef Türkçe dil desteği mevcut değil), eğer TechNet tarafından CTP3 için sunulan yeniliklere bakmak isterseniz buraya tıklayın.

Microsoft Surface SDK 2.0 Çıktı

Microsoft SurfaceBu haberi yayınlarken düşündüm de acaba Türkiye'de Microsoft Surface kullanan şirket var mı? Şirketi geçtim Microsoft Surface için geliştirme yapacak yazılımcı var mı? Var veya yok ben yine de haberimi yazacağım, belki meraklı bir kaç insan yakalayabilirim.

Bir yazılımcı olarak daha önce Microsoft Surface'i duymamış olabilirsiniz, o yüzden biraz bilgi vereyim. Microsoft Surface sehba şeklinde (yaklaşık 40 inch yüzeye sahip 1920 x 1080) dokunmatik bir ekrandır. Tüm işlemler el aracılığıyla yapılıyor. Multi-touch özelliğine sahip olduğu için birden fazla el işlem görebiliyor. Şu an piyasada Samsung ile ortaklık sonucu Samsung SUR40 adlı ürün mevcut. İster oyun oynamak için (özellike RPG) isterseniz de iş amaçlı kullanabilirsiniz. Özellikle otel ve restorantlara çok sayıda satış yapılmış. Ayrıca PixelSense™ teknolojisine sahip. Yani Microsoft Surface'in yüzeyine konan cismi pikselllerine kadar ayrıştırabiliyor. Kağıda yazılan bir yazıyı Microsoft Surface'e okutabiliyorsunuz. Son olarak yanlış hatırlamıyorsam fiyatı 10.000$ civarında olması gerekiyor.

12 Temmuz'da Microsoft Surface Blog'dan yapılan açıklama ile Microsoft Surface 2.0 SDK indirilebilir (eski ismi ile Windows Touch Beta) hale gelecek açıklaması yapıldı ve şu an kullanıma açık. Yüklerken nelere dikkat etmeliyiz? Bize neler sunuyor?

Öncelikle bizden istenenlere göz atalım:

Aşağıdaki işletim sistemlerinden herhangi bir tanesi 32-bit veya 64-bit fark etmez.

  • Windows 7 Home Premium
  • Windows 7 Professional
  • Windows 7 Ultimate

Ek istekler:

  • Microsoft Visual C#® 2010 Express Edition veya Microsoft Visual Studio® 2010,
  • .NET Framework 4.0,
  • Microsoft XNA® Framework Redistributable 4.0
  • (Opsiyonel İstek) Microsoft Expression Blend® 4, XAML kodunuzu değiştirebilmeniz için.

Şimdi bize sunacağı yeniliklerden bahsedelim:

  • Visual Studio 2010 ile entegreli Windows 7 üzerine kurulu .NET 4.0 ve WPF 4.0,
  • Surface multi-touch ile Windows 7 deneyimi,
  • Kullanıcı ve müşterileri heyecanlandırmak için multi-touch, multi-user ve bensersiz nesne etkileşimi hazırlayın.

Evet, Microsoft Surface 2.0 hakkında bu kadar yazı kafanızda bazı şeyleri canlandırmıştır umarım.

Microsoft Surface Blog tarafından yayınlanan habere bakmak için buraya tıklayın. Eğer direkt olarak Microsoft Surface SDK 2.0'yi indirmek istiyorsanız buraya ve son olarak Microsoft Surface SDK 2.0 için kaynak barındıran habere gitmek için buraya tıklayın.