Windows Kontrol Kullanım Standartları Kılavuzu

by Sedat Eyüboğlu3. Ocak 2012 07:30

Windows uygulamanız için kullanıcı ara yüzünü oluşturacaksınız. “Button”,”Check Box”,”Combo Box”… gibi bir çok kontrol kullanacaksınız. Standartlara uymaya karar verdiniz. Ancak standartlar nelerdir?

Bir iş için en doğru kontrolü seçtiğinizden emin misiniz? Acaba “Check Box” değil de “Radio Button” mu kullanmalısınız? Kullanacağınız kontrolün genişliği, yüksekliği ne olmalı? Etiketi nasıl olmalı? Tasarımı ile ilgili hangi standartları takip etmelisiniz?

Bu gibi standartları önemsiyorsanız Microsoft’un yayınladığı kavuza bakabilirsiniz. Doküman İngilizce ve aşağıdaki linkten ulaşılabilir.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa511482.aspx

Sol taraftaki menüden ilgilendiğiniz kontrolü seçip kılavuzu inceleyebilirsiniz.

image

Tags:

Diğer

Siverlight ‘ChildWindow’ Penceresini Kapatmak

by Sedat Eyüboğlu24. Aralık 2011 07:27

Silverlight ile gelen ‘ChildWindow’ kontrolü oldukça kullanışlı bir kontrol. Kontrol eklendiğinde önceden oluşturulmuş ‘Okay’ ve ‘Cancel’ düğmeleri ile birlikte geliyor ve bu düğmeler pencereyi kapatmak için gerekli işlevi içeriyor.

image

Pencereyi farklı bir durum karşısında kapatmak isteseniz this.DialogResult = true; ataması yapabilir veya  this.Close(); metodunu çağırabilirsiniz. İkisini birden yapmayınız. Aksi halde pencere kapanacak ancak olay yakalayıcısı ‘Closed Event Handler’ iki defa çağrılacaktır.

Tags:

Silverlight

Microsoft’tan Ücretsiz Virüs Programı

by Sedat Eyüboğlu18. Aralık 2011 07:46

Küçük ölçekli işletmenizde 10 bilgisayara kadar veya evdeki bilgisayarınız için virüs programı arıyorsanız Microsoft’un ücretsiz virüs programı mevcut.

Program, gerçek zamanlı tarama, kötü amaçlı yazılımlara karşı koruma, otomatik güncelleme gibi diğer programların sunduğu özelliklere sahip. Programı kullanabilmek için orijinal Windows lisansınızın olması gerekiyor. Ben kurmadım. Ancak görünce paylaşmak istedim. Bilgi alabileceğiniz sayfa aşağıdadır.

http://windows.microsoft.com/tr-TR/windows/products/security-essentials

Tags:

Diğer

Adobe Otomatik Uygulama Güncelleyici (Adobe Updater) Uyarılarını Kapatmak

by Sedat Eyüboğlu18. Aralık 2011 03:23

Bilgisayırınızda “Adobe Reader” yüklü ise sık sık “Güncelleme var. Yüklemek ister misiniz?“ anlamında uyarılar görebilirsiniz.

 image

Bu sizi rahatsız ediyorsa. Nasıl kapatacağınız ağaşıda yazıyor.

  • “Adobe Reader” programını açın.
  • “Edit” menüsünden “Preferences” alt menüsünü kullanarak seçenekler penceresini açın.
  • “Updater” sekmesinde “Do not download or install updates automatically.” seçeneğini seçip “OK” düğmesine basın.

image

Diğer adobe programları içinde durum aynı mıdır? Bilemiyorum. Kontrol edebilirsiniz.

Tags:

Diğer

Entity Framework ve “sp_reset_connection” Çağrımları

by Sedat Eyüboğlu9. Aralık 2011 04:34

Entity Framework kullanıp ta “SQL Trace” kayıtları arasında çok sayıda “sp_reset_connection” çağrımı görebilirsiniz.

“Connection pooling” kullanılan ortamlarda (genellikle web uygulamalarında) bir “connection” havuzdan (connection pool) alınıp tekrar kullanıldığında çeşitli konuların (set opsiyonları, “session” değişkenleri vs…) varsayılan ayarlara geri dönmesi gerekmektedir. Aksi taktide bir önceki “session” için değiştirilen ayarlar sonraki içinde kullanılacaktır ve bu varsayılmayan bir durum oluşturacaktır. Bu durumda “SQLClient” “sp_rsest_connection” prosedürünü çağırarak değerleri tekrar ayarlar.

Bunun sıkıntı yaratan bir durum olduğuna dair bir belirtiye rastlamadım. Burada dikkat edilmesi gereken durum bir önceki “session” için ayarlanan “ISOLATION LEVEL” “sp_reset_connection” tarafından varsayılan değerine ayarlanmaz. Bu durum beklenmedik durumlara yol açabilir. http://connect.microsoft.com/SQLServer/feedback/details/243527/sp-reset-connection-doesnt-reset-isolation-level

Tags:

C#

SQL Server’da “Execution Plan” ile İlgili

by Sedat Eyüboğlu8. Aralık 2011 02:37

Sql Server’da bir sorgu için plan oluşturmak, sorgunun sunucu içindeki döngüsünde en önemli yere sahip adımdır desek yanılmayız sanırım.

Bir sorgunun SQL sunucuda geçirdiği süreçler arasında sorgunun “parse” edilmesi, ağaç yapısının oluşturulması, planın oluşturulması gibi işlemler vardır. Planın oluşturulması sorgu kaynaklarının (tablo, indeks gibi) istatistik bilgilerinin incelenmesi, parametrelerin incelenmesi, indekslerin değerlendirilmesi, verinin değerlendirilmesi gibi yorucu işlemler içerir. Bundan dolayı plan hazırlamak yorucu bir iştir. Yorucu bir iş olduğu düşünülürse sunucunun hazırlanan planları bir önbellekte saklaması gayet makul bir davranıştır.

Sunucu bir sorgu ile karşılaştığında öncelikle sorgu için daha önceden hazırlanmış bir plan var mı diye bakar. Varsa ve plan hala kullanılabilir (geçerli) durumda ise tekrar oluşturmak yerine bunu kullanır. Bazı durumlarda sorgu için bir plan olsa bile geçerliliğini yitirmiş olabilir. Bunun nedenleri çeşitlidir. Örnek olarak sorgu kaynaklarının (tablo, indeks gibi) ‘ALTER’ edilmesi verilebilir. Bazı durumlarda da sorgu için kullanılan plandan memnun olmayabiliriz ve tekrar oluşturulmasını isteyebiliriz. Bu durumda tekrar derleme işlemi istenebilir. Bunun için sp_recompile, WITH RECOMPILE gibi seçenekler kullanılabilir.

Parametrik olmayan sorguların planları tekrar kullanılamaz. “select * from t where a=1”,”select * from t where a=2” bu iki sorgunun planı ayrı ayrı oluşturulur. Ancak “(@1 int) select * from t wher a=@1” parametrik bir sorguya işaret eder. Bundan dolayı ad-hoc şeklindeki sorguların “EXEC sp_executesql” kullanılarak çalıştırılması faydalıdır. Bir “Stored Procedure” doğal olarak parametriktir. SQL server ad-hoc sorguları otomatik olarak parametrik hale getirmeye çalışır. Bunu her durumda yapmaz. Faydalı olduğuna karar verdiği durumda yapar. Bu işleme “auto-parameterization” denir. SQL 2005 ile birlikte gelen özellik sayesinde her durumda sorgunun parametrik yapılması isteğinizi sunucuya iletebilirsiniz. Bunun için “PARAMETERIZATION FORCED” kullanabilirsiniz. Ancak bu durumda yeterli olmayan bir planla sorgunu işletilmesine neden olabilirsiniz.

Sorgu planların tekrar kullanılabilir olması önemli bir konudur ve sorgu ile alakalıdır. Yazılan sorgu oluşturulan planın tekrar kullanımına izin vermiyor olabilir. Bu durumda o sorgu için her çalıştırmada tekrar plan oluşturulur. Planın tekrar kullanımını engelleyen konular çeşitlidir ve sorgu yazılırken dikkate alınmasında fayda vardır. Nedenler için http://technet.microsoft.com/tr-tr/library/cc966425(en-us).aspx adresindeki “Causes of Recompilations” bölümü incelenebilir. SQL sunucunun ön bellekte tuttuğu planları ve tekrar kullanım durumlarını aşağıdaki sorgu ile görebilirsiniz.

SELECT TEXT ,cp.*
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE cacheobjtype = 'Compiled Plan'

usecounts alanı size planın kaç defa kullanıldığını gösterecektir. Eğer değeri 1 olan çok sayıda planınınız var ise bu performans kaybına yol açan bir durum olarak değerlendirilebilir. Bu durumun iki dez avantajı vardır. Birincisi sunucu bu planları hazırlamak için her seferinde kaynak harcamaktadır. Diğeri ise bu planların her biri hafızada ayrı bir yer kaplamaktadır ve plan önbelleği içindeki eleman sayısını kalabalıklaştırmaktadır.

Sonuç olarak “execution plan”, SQL sunucusunda performans kriterleri içinde önemli bir yer tutar ve önem verilmelidir.

Tags:

MS-SQL

SQL Server - Filtrelenmiş İndeksler

by Sedat Eyüboğlu9. Eylül 2011 03:42

Sql Server 2008 versiyonu ile birlikte gelen ve indeks yapıları üzerinde bir genişletme olan filtrelenmiş indeksler, (filtred index) büyük verilerin sorgulanması için kolay uygulanabilir bir yol sağlar.

Büyük tabloların yönetiminde bölümleme (partitioning) bilinen bir yoldu ve Sql 2005 ile birlikte sunulmuştu. Filtrelenmiş indeksler ise tablo bölümleme kullanımından daha pratik bir şekilde uygulanabilen bir özellik olarak uzun süren sorunlarınıza hızlıca çözüm getirebilir. Filtrelenmiş indeksleri tablo bölümleme yerine kullanabilirsiniz demek istemiyorum. Ancak filtrelenmiş indeks size gerekli sonucu sağlıyorsa bölümlenmiş bir tablonun yönetim maliyetine girmenize gerek kalmayacaktır.

Filtrelenmiş indeks, indeks tanımında, sorgularınız içindeki “where” kısmında belirteceğiniz koşulun belirtilmesi ile oluşturulur. Yani oluşturduğunuz sorgunun filtresi, tablo üzerindeki indeksin filtresini içeriyorsa filtrelenmiş indeks kullanılır. İndeks içindeki veri filtre koşuluna göre düzenlendiğinden veriye daha hızlı ulaşılmış olur. Aşağıdaki örnek daha açıklayıcı olacaktır.

CREATE NONCLUSTERED INDEX [idx_tb_Satis2010] ON [dbo].[tb_Satis]
(
    [Yil] ASC,
    [Hafta] ASC,
    [DepoID] ASC,
    [UrunID] ASC
)
WHERE ([Yil]=(2010) AND [Miktar]<>(0))

Yukarıdaki indeks “2010” yılı için Miktar değeri “0” olmayan verileri indeksler ve siz sorgularınızda “…where Yil=2010 and Miktar<>0” şekilinde bir ifade kullanırsanız “query optimizer” tarafından yukarıda oluşturduğumuz indeks kullanılır.

“Execution plan” incelenerek indeksinizin kullanılıp kullanılmadığını görebilirisniz. Eğer indeks kullanılmıyorsa (sql server kullanmayı tercih etmiyor olabilir) ancak sorgunuz indeksi kullanarak daha hızlı çalışıyorsa “index hint“ yardımı ile sorgunuzun indeksi kullanmasını sağlayabilirsiniz.

Son olarak yaptığım bir testten bahsedip konuyu kapatacağım. Yaklaşık 821.000.000 kayıt olan bir tabloda aşağıdaki sorguları çalıştırdım.

select COUNT(0) from tb_Satis where Yil=2010 and DepoID=62

select COUNT(0) from tb_Satis where Yil=2010 and Miktar<>0 and DepoID=62

İlk sorgu filtrelenmiş indeksi kullanmadı. Çünkü koşul ifadesinde “Miktar<>0” şartı yoktu. Bu sorgu 2 dakika 10 saniye gibi bir sürede sonuç verdi. İkinci sorgu 16 saniye gibi bir sürede cevap verdi. Doğal olarak değerler sistemden sisteme, kullanımdan kullanıma değişecektir.  Ancak arada kayda değer fark olduğu bellidir.

Sonuç olarak ilgilendiğiniz verinin değerleri sabit ise (yukarıdaki örnekte Yil ve Miktar değerleridir) bunu indeks içinde belirterek daha verimli bir indeks oluşturabilirsiniz. Bunun için filtrelenmiş indeks kullanabilirsiniz.

Tags:

MS-SQL

Bir .Net Kütüphanesinin Hedef Platformunu Belirlemek

by Sedat Eyüboğlu28. Haziran 2011 02:09

Zaman zaman bir kütüphanenin (assembly) 32 Bit yada 64 Bit platfordan hangisi için derlendiğini belirleme ihtiyacı duymuşsunuzdur. Bunun için CorFlags aracını kullanabilirsiniz. .Net ile birlikte gelen bu aracı aşağıdaki şekilde kullanarak bu bilgiye ulaşabilirsiniz.

image

Yukarıda gördüğünüz gibi CorFlags yazıp parametre olarak kütüphanenin yolunu vermeniz yeterli. Daha sonra kütüphane ile ilgili bilgi listelenecektir. Burada dikkat edeceğiniz satır 32BIT satırı. Eğer 1 ise kütüphane 32Bit platformu tercih eder.

Daha ayrıntılı bilgi için kütüphanenizi değişik platformlar (x86, x64, AnyCPU) için derleyip bu araç ile bilgilerini inceleyiniz.

Tags: ,

C# | Diğer

TFS 2010 ile “MSF Agile 5.0” Projesi Oluşturulurken TF30275 ve TF30267 Hataları

by Sedat Eyüboğlu7. Şubat 2011 11:37

TFS 2010 ile “MSF Agile 5.0” taslağı kullanarak bir proje oluştururken sıra Stakeholder Matrix.xltx odyasının sunucuya aktarımına geldiğinde TF30275, TF30267 hataları oluşabilir ve proje oluşturulamaz.

Bu durumda kayıt (log) dosyası içinde aşağıdaki gibi bir mesaj oluşacaktır.

2011-02-07T09:00:51 | Module: WSS | Thread: 14 | Uploading file: Samples and Templates/Vision and Planning/Document Template - Stakeholder Matrix.xltx
2011-02-07T09:00:51 | Module: WSS | Thread: 14 | TF30275: Error while uploading file source = C:\Users\XXXX\AppData\Local\Temp\TPW_tmpCCA2.tmp\Windows SharePoint Services\Samples and Templates\Vision and Planning\Document Template - Stakeholder Matrix.xltx target = Samples and Templates/Vision and Planning/Document Template - Stakeholder Matrix.xltx
2011-02-07T09:00:51 | Module: WSS | Thread: 14 | TF30267: Exception: System.Net.WebException: The remote server returned an error: (400) Bad Request.
   at System.Net.WebClient.UploadDataInternal(Uri address, String method, Byte[] data, WebRequest& request)
   at System.Net.WebClient.UploadData(Uri address, String method, Byte[] data)
   at System.Net.WebClient.UploadData(String address, String method, Byte[] data)
   at Microsoft.TeamFoundation.Client.SharePoint.WssUtilities.SendFpRpcData(TfsConnection tfs, String siteUrl, Byte[] fpRpcCall)
   at Microsoft.TeamFoundation.Client.SharePoint.WssUtilities.UploadData(Byte[] fileData, String remoteFullName, String siteUrl, TfsConnection tfs)
   at Microsoft.TeamFoundation.Client.SharePoint.WssUtilities.UploadFile(String localFile, String remoteFullName, String siteUrl, TfsConnection tfs)
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.UploadFile(WssCreationContextWrapper contextWrapper, String sourceFile, String siteUrl, String target, DocumentLibraryInfo docLibInfo, String currituckQuery)
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.HandleFileCreation(WssCreationContextWrapper contextWrapper, XmlNode taskNode)
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.Execute(ProjectCreationContext context, XmlNode taskXml)
---begin Exception entry---
Time: 2011-02-07T09:00:51
Module: Engine
Event Description: TF30162: Task "SharePointPortal" from Group "Portal" failed
Exception Type: Microsoft.TeamFoundation.Client.PcwException
Exception Message: Unable to connect to the server running SharePoint Products at the following location: XXXX.
Exception Details: The Project Creation Wizard was not able to connect to the server running SharePoint Products at the following location: XXXX. The reason for the failed connection cannot be determined at this time. Because the connection failed, the wizard was not able to complete creating the project.
Stack Trace:
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.Execute(ProjectCreationContext context, XmlNode taskXml)
   at Microsoft.VisualStudio.TeamFoundation.ProjectCreationEngine.TaskExecutor.PerformTask(IProjectComponentCreator componentCreator, ProjectCreationContext context, XmlNode taskXml)
   at Microsoft.VisualStudio.TeamFoundation.ProjectCreationEngine.RunTask(Object taskObj)
--   Inner Exception   --
Exception Message: The remote server returned an error: (400) Bad Request. (type WebException)Status: ProtocolError
Response Status Code: BadRequest
Response Status Message: Bad Request

Exception Stack Trace:    at System.Net.WebClient.UploadDataInternal(Uri address, String method, Byte[] data, WebRequest& request)
   at System.Net.WebClient.UploadData(Uri address, String method, Byte[] data)
   at System.Net.WebClient.UploadData(String address, String method, Byte[] data)
   at Microsoft.TeamFoundation.Client.SharePoint.WssUtilities.SendFpRpcData(TfsConnection tfs, String siteUrl, Byte[] fpRpcCall)
   at Microsoft.TeamFoundation.Client.SharePoint.WssUtilities.UploadData(Byte[] fileData, String remoteFullName, String siteUrl, TfsConnection tfs)
   at Microsoft.TeamFoundation.Client.SharePoint.WssUtilities.UploadFile(String localFile, String remoteFullName, String siteUrl, TfsConnection tfs)
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.UploadFile(WssCreationContextWrapper contextWrapper, String sourceFile, String siteUrl, String target, DocumentLibraryInfo docLibInfo, String currituckQuery)
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.HandleFileCreation(WssCreationContextWrapper contextWrapper, XmlNode taskNode)
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.Execute(ProjectCreationContext context, XmlNode taskXml)

--- end Exception entry ---

Bu durumun daha farkılı nedenleri olabilir. Benim karşılaştığım neden NOD32 anti virüs yazılımının aktarımı engellemesinden kaynaklanıyordu. Eğer sizin ortamınızda da NOD32 veya başka bir anti virüs yazlımı kuruluysa hem sunucuda hemde istemci (kurulumu yapan) makinede bu yazılımı durdurup tekrar denemek çözüm olabilir. Denemenizi tavsiye ederim.

Tags: ,

Diğer

“config” Dosyasında Veritabanı Bağlantı Cümlelerini (Connection String) Korumak

by Sedat Eyüboğlu3. Eylül 2010 15:36

Windows uygulamalarında "config" dosyası içinde dağıtılan veritabanı cümlelerinin korunması yani kullanıcı tarafından açık bir şekilde görüntülenememesi ihtiyacı sık karşılaşılan durumlardan biridir.

Bunun için "ProtectSection" metodu kullanılabilir. Aşağıdaki örnekte göreceğiniz gibi bölümün daha önceden korunup korunmadığı "IsProtected" özelliği ile kontrol edilmektedir.

Bu metodu uygulamanızın ilk çalıştırdığı satırlar arasında çağırmanız yerinde olacaktır. Metod "config" dosyası eğer daha önce korunmadı işe RSA algoritmasını kullanarak bölümü şifreleyecektir. Böylece dosyayı açan kişi veritabanı ulaşım bilgilerini okuyamayacaktır.

Bu senaryoda bölümün korunabilmesi için kullanıcının uygulamayı en az bir kere çalıştırması gerektiğini unutmayınız.

Aşağıdaki fonksiyona parametre değeri olarak “connectionString” vermeniz yeterli.

/// <summary>         
/// Protects the configuration section.         
/// </summary>         
/// <param name="sectionName">Name of the section.</param>         
public static void ProtectConfigurationSection(string sectionName)         
{             System.Configuration.Configuration config =                 System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);

            System.Configuration.ConfigurationSection section = config.GetSection(sectionName);

            if (!section.SectionInformation.IsProtected)                 section.SectionInformation.ProtectSection(null);

            section.SectionInformation.ForceSave = true;

            config.Save(System.Configuration.ConfigurationSaveMode.Full);         }

Tags: , , , ,

Windows Forms

About the author

Something about the author

Month List