Archive for the ‘Makaleler’ Category

  • Visual Studio Box Selection

    Date: 2013.03.12 | Category: İpucları, Makaleler | Response: 0

    Box Selection visual studio da 2010 versiyonundan beri olmasına rağmen pek bilinmeyen ve pek kullanılmayan bir özellik, ancak bazı durumlarda çok büyük kolaylıklar sağlamaktadır. Bir sunum için hazırladığım ekran görüntüsünü paylaşmak istiyorum.

    boxselection

    Box selection Visual Studio kod düzenleme penceresinde metin bağımsız koordinatlara göre seçim yapılabilmesidir. Alt tuşu basılırken fare ile bir seçim yaparak kullanabilirsiniz.

    Kısaca bahsetmek gerekirse box selection kullanarak seçtiğiniz bir alan içinde yaptığınız yazı yazma veya silme gibi metin değişiklikleri seçiminizde bulunan her satıra tek tek yansıtılacaktır. Her satır sonunda yapılması gerek değişiklikler için kod yazmanızı hızlandıracak bir yöntemdir. Ayrıca seçtiğiniz box’ın içeriğini başka bir box’ın içine yapıştırabilirsiniz. Veya her satıra bir yazı yazmak istiyorsanız genişliği olmayan bir box selection oluşturarak yazı yazmaya başlayabilirsiniz.

    Detaylı Bilgi için http://msdn.microsoft.com/en-us/library/dd465268.aspx adresine bakabilirsiniz.

  • Windows 8 Uygulamalarında Localization

    Date: 2013.01.26 | Category: Makaleler, Yazılar | Response: 0

    Merhaba,

    Bu makalemde sizelere Windows 8 uygulamalarında localization’un nasıl yapılacağından ve farklı birkaç yöntemden bahsedeceğim.

    Öncelikle tutmak istediğimiz metinlerimizi aynı desktop uygulamalarında olduğu gibi resource dosyalarında tutmamız gerekiyor. Bunun için ise resw dosyalarını kullanacağız.

    Bu dosyaları uygulamamızda tutmak için Common klasörünün altı uygun olacaktır. Yapacağımız örnekte ingilizce ve türkçe olarak iki farklı dilde metinleri tutacağız. Bunun için bu dil kodlarına ait klasörleri Common klasörü altında oluşturmamız gerekiyor.

    Değişkenleri tutacağımız resource dosyalarının adına ise Strings ismini verdiğimizi düşünürsek Solution Explorer’da yapımız şu şekilde olacaktır.

    l1

    Şimdi ise resource dosyalarımıza string’lerimizi tanımlayalım.

    İngilizce dosyamıza tanımlamayı aşağıdaki gibi yapıyoruz.

    l2

    Türkçe dosyamıza ise aşağıdaki gibi yapıyoruz.

    l3

    Şimdi ise bu dosyalara kodumuz içerisinden ulaşmak gerekiyor. Bunun için Windows.ApplicationModel.Resources namespace’i altında bulunan ResourceLoader class’ını kullanacağız. Bu class’ta bulunan GetString metodu ile ise tanımlamış olduğumuz string’lere ulaşacağız. Bu işlemi nasıl yapcağımızı aşağıda bir örnek ile inceleyelim.

    Öncelikle sayfamıza bir tane textblock ekliyoruz. ve kod tarafında aşağıdaki kodu yazıyoruz.

    &lt;br /&gt;<br />
    protected override void OnNavigatedTo(NavigationEventArgs e)&lt;br /&gt;<br />
           {&lt;br /&gt;<br />
               ResourceLoader insResourceLoader = new ResourceLoader(&amp;quot;Strings&amp;quot;);&lt;br /&gt;<br />
               txtHelloWorld.Text = insResourceLoader.GetString(&amp;quot;HelloWorld&amp;quot;);&lt;br /&gt;<br />
           }&lt;br /&gt;<br />
    

    Burada ilk satırda bulunan Strings resource dosyasının adını ikinci satırdaki HelloWorld ise resource dosyasındaki değişkenin adını temsil etmektedir.

    Uygulamayı Türkçe localization’a sahip bir bilgisayarda çalıştırdığınızda Merhaba Dünya , ingilizce localization’a sahip bir bilgisayarda çalıştırdığınızda ise Hello World yazdığını göreceksiniz. Bu dillerin dışında bir bilgisayarda çalıştırdığınızda ise appxmanifest dosyasındaki Default Language değerine ait metinler gözükecektir.

    Şimdi ise dil ayarlarını uygulama içerisinden nasıl değiştirebileceğimizi inceleyelim.

    Bunun için Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride değerini değiştirmemiz gerekiyor. Bu değişikliği yaptığımız durumda burada belirlediğimiz dil ayarları uygulamamızda geçerli olacaktır. Ancak metinlerin yüklenebilmesi için bu değişiklikten sonra farkli bir sayfaya navigate edilmesi gerekmektedir.

    Tüm bunlardan farklı olarak bazı durumlarda kullanıcının diline göre farklı style dosyalarından stilleri almanız gerekebilir. Bunun için ise style dosyalarını dinamik olarak yüklmek için aşağıdaki kodu kullanabilirsiniz.

    &lt;br /&gt;<br />
    string style=&amp;quot;dilegorestyledosyasiadi&amp;quot;;&lt;br /&gt;<br />
    Uri u = new Uri(&amp;quot;ms-resource:/Files/Common/&amp;quot; + style + &amp;quot;.xaml&amp;quot;);&lt;br /&gt;<br />
    ResourceDictionary skin = new ResourceDictionary();&lt;br /&gt;<br />
    skin.Source = u;&lt;br /&gt;<br />
    Application.Current.Resources.MergedDictionaries.Clear();&lt;br /&gt;<br />
    Application.Current.Resources.MergedDictionaries.Add(skin);&lt;br /&gt;<br />
    
  • Windows 8 Uygulamalarında Custom Font Kullanımı

    Date: 2013.01.21 | Category: İpucları, Kodlar, Makaleler | Response: 0

    Merhaba,

    Bu makalemde sizlere bir Windows 8 uygulamasında dışarıdan edindiğiniz bir font’u nasıl kullanabileceğinizden bahsedeceğim. Anlatımı ise daha çok örnek üzerinden yapmaya çalışacağım.

    Bunun için öncelikle Visual Studio üzerinde bir Windows 8 uygulaması oluşturuyoruz. Uygulamamızda istediğiniz klasör altına font dosyanızı yükleyebilirsiniz. Ben Fonts adında bir klasör oluşturup buraya yükleyeceğim.

    b8056e50-30eb-4b74-a6e2-528bbf72535bfont1

    Bundan sonra yapmamız gereken font’umuzun üzerine sağ tıklayıp veya font dosyası seçiliylen F4′e basarak özellikler penceresini açmak. Açılan pencerede aşağıdaki özelliklere aşağıdaki değerleri atamamız gerekiyor.

    Build Action : Content
    Copy to Output Directory : Always

    Bu işlemi yaptıktan sonra fontumuzu tam anlamıyla projemize dahil etmiş oluyoruz. Şimdi isterseniz fontumuzu bir sayfada kullanarak test edelim.

    Öncelikle font’umuzu kullanmak üzere resource dosyamıza tanımlamamız gerekiyor. Bu tanımlama resource dosyası içerisinde aşağıdaki gibi olacaktır. Buarada font’un dosya yolunu verdikten sonra # karakteri sonrasında fontun adını vermemiz gerekiyor.

    <FontFamily x:Key="ChalkFont">/Font/aflfont.ttf#AFL Font nonmetric</FontFamily>
    
    

    Şimdi ise bir textblock üzerinde kullanabileceğimiz bir style oluşturalım ve bu style’ın font özelliğine bu font’u atayalım. Bu durumda resource dosyamıza eklediğimiz kodlar aşağıdaki gibi oluyor.

    <FontFamily x:Key="ChalkFont">/Font/aflfont.ttf#AFL Font nonmetric</FontFamily>
    <Style x:Key="ChalkTextBase" TargetType="TextBlock" >
    <Setter Property="FontFamily" Value="{StaticResource ChalkFont}"></Setter>
    <Setter Property="FontSize" Value="96"></Setter>
    </Style>
    

    Şimdi ise sayfamıza bir tane textblock ekleyelim ve style özelliğine oluşturduğumuz style’ı atayalım.

    <Page
        x:Class="CustomFontApp.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:CustomFontApp"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
    
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <TextBlock x:Name="txtHelloWorld" Style="{StaticResource ChalkTextBase}" Text="Hello World"></TextBlock>
        </Grid>
    </Page>
    

    Son olarak baktığımızda uygulamamızda font’u bilgisayara kurmadan kullanabildiğimizi görüyoruz.

    275a8f08-7f6d-435c-8da5-ccd45008f67efont2

  • Windows 8 Uygulamalarında Application Data Kullanımı

    Date: 2013.01.15 | Category: İpucları, Makaleler, Yazılar | Response: 0

    Merhabalar,

    Bu makalemde Windows 8 Metro Style uygulamalarda uygulamalarımıza ait verileri nasıl tutabileceğimizi göreceğiz. Bu sayede suspended olmuş veya terminated olmuş bir uygulamanın verilerini nasıl koruyabileceğini veya farklı makinalar arasında bilginin nasıl taşınabildiğini inceleyeceğiz. Makalenin sonunda da incelediğimiz tüm bu kombinasyonlarda Application Data yazabilen ve okuyabilen bir manager sınıfı yazacağız.

    Application data bir uygulamaya ait özel bilgilerdir. Application Data’da tutulması önerilen bilgiler kullanıcının tercihleri, ayarları, cache’lenmesi gereken ufak verilerdir. Application Data’ya uygulama çalıştığı sürece erişmek mümkün olmaktadır. Application Data olarak ne çeşit verileri, ne gibi fiziksel saklama ortamlarını ve ne gibi depolama mekanizmaları olduğundan makalemin ilerleyen kısımlarında bahsedeceğim.

    Application data ile bilinmesi gereken en önemli bilgi Application Data’ya uygulama çalıştığı sürece erişilebilmesi ve uygulama kaldırıldığında Application Data’nın tekrar erişilemez bir şekilde silindiğidir. Bundan dolayı kullanıcıların kritik bilgilerini saklamak için Application Data yerine kullanıcının fiziksel disk sürücüsü veya Skydrive tercih edilmelidir.

    Application Data temel olarak iki farklı depolama alanında veri tutmaktadır. Bunlardan biri registry(setting) diğeri ise dosya sistemi(file)dir.

    Application data kullanımında 3 çeşit depolama mekanizması vardır. Bunlar;

    Local : Veri sadece mevcut cihazın üzerinde saklanır.

    Roaming : Veriye kullanıcının uygulamayı kurduğu diğer cihazlardanda erişilebilir.

    Temporary : Veri geçici olarak saklanır ve sistem tarafından herhangi bir zamanda silinebilir.

    Uygulamamızda istersek application data bazında versiyonlama da yapabiliriz. Böylece uygulama versiyonu değiştiğinde application data’da oluşabilecek uyumluluk sorunlarının önüne geçebiliriz.

    Şimdi bahsettiğimiz 3 depolama mekanizmasını kullanabileceğimizi örneklerle inceleyelim. İlk olarak Local application data ile başlayalım:

    Local application data’yı uygulama açılıp kapandığında kaybolmaması gereken verileri tutmak için kullanabiliriz. Aynı zamanda boyut olarak roaming data’da tutmamıza olanak olmayan verileri de Local application data’da tutabiliriz. Çünkü local application data’da tutulacak verinin miktarında herhangi bir sınırlama bulunmamaktadır. Local application data’nın kullanımı ise aşağıdaki gibidir:

    Windows.Storage.ApplicationDataContainer setting = Windows.Storage.ApplicationData.Current.LocalSettings;
    
    setting.Values["deneme"] = "Windows 8";
    
    Object value = setting.Values["deneme"];
    

    Local application data’da tuttuğumuz bir veriyi silmek içinse aşağıdaki kodu yazıyoruz:

    setting.Values.Remove("deneme");
    

    Dosya API’lerini kullanarak local application data store’a dosya oluşturabilir, uygulama verisini burada saklayabilir veya dosyadaki bir veriyi güncelleyebiliriz. Bunun için Windows.Storage.StorageFolder.CreateFileAsync ve Windows.Storage.FileIO.WriteTextAsync metodlarını kullanabiliriz:

    async void Write()
    {
        Windows.Storage.StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
    
        StorageFile file = await folder.CreateFileAsync("myname.txt", CreationCollisionOption.ReplaceExisting);
    
        await FileIO.WriteTextAsync(file, "Tamer Oz");
    }
    

    Oluşturulan dosyayı AppData klasörünün içinde görebiliriz:

    Roaming application data’yı inceleyecek olursak, kullanıcının birden fazla cihazda senkron halde tutması gerekebilen veri için roaming application data kullanabilirsiniz. Kullanıcı uygulamanızı birden fazla cihaza kurmuşsa bir cihazdan diğerine aktarılması gereken verileri olabilir. Bunlar kullanıcının uygulama ayarları olabileceği gibi üzerinde çalıştığı ve başka bir cihaza kurulum yaptığında çalışmasına devam etmek istediği bir işle ilgili olan veriler olabilir. Bu gibi durumlarda veriyi roaming application data’da tutulacak şekilde kodlama yapabiliriz. Roaming data’da tutulan veri güncellendiği zaman cloud’da replike olur ve uygulamanın kurulu olduğu tüm cihazlarda senkronize edilir. Roaming application data’nın kullanımı Local Application Data ile aynıdır ancak ApplicationDataContainer tipi olarak Windows.Storage.ApplicationData.Current.RoamingSettings enum’u StorageFolder tipi olarak ise ApplicationData.Current.RoamingFolder enum’u kullanılmalıdır.

    Temporary data kullanımında ise yine kullanım aynı şekildedir. TemporaryData kullanımında sadece dosya tutulabilmekte setting tutulamamaktadır. StorageFolder tipi olarak ise ApplicationData.Current.TemporaryFolder kullanılmalıdır.

    Şimdi tüm bu bahsettiğimiz kodları içeren bir class’ı nasıl yazdığımızı inceleyelim.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Windows.Storage;
    
    namespace AppData.Common
    {
        public enum Data
        {
            Data1,
            Data2,
            Data3
        }
        public enum AppDataStorage
        {
            Local,
            Roaming,
            Temporary
        }
        public enum AppDataType
        {
            Setting,
            File
        }
        public static class AppDataManager<T>
        {
            public static async void SetAppData(Data key, AppDataStorage storage, AppDataType type, T data)
            {
                Windows.Storage.ApplicationDataContainer settings = null;
                Windows.Storage.StorageFolder folder = null;
    
                switch (storage)
                {
                    case AppDataStorage.Local:
    
                        switch (type)
                        {
                            case AppDataType.Setting:
                                settings = Windows.Storage.ApplicationData.Current.LocalSettings;
                                settings.Values[key.ToString()] = data;
                                break;
                            case AppDataType.File:
                                folder = ApplicationData.Current.LocalFolder;
                                StorageFile file = await folder.CreateFileAsync("dataFile.txt", CreationCollisionOption.ReplaceExisting);
                                await FileIO.WriteTextAsync(file, data.ToString());
                                break;
                            default:
                                throw new NotSupportedException();
                        }
                        break;
                    case AppDataStorage.Roaming:
    
                        switch (type)
                        {
                            case AppDataType.Setting:
                                settings = Windows.Storage.ApplicationData.Current.RoamingSettings;
                                settings.Values[key.ToString()] = data;
                                break;
                            case AppDataType.File:
                                folder = ApplicationData.Current.RoamingFolder;
                                StorageFile file = await folder.CreateFileAsync("dataFile.txt", CreationCollisionOption.ReplaceExisting);
                                await FileIO.WriteTextAsync(file, data.ToString());
                                break;
                            default:
                                throw new NotSupportedException();
                        }
                        break;
                    case AppDataStorage.Temporary:
                        switch (type)
                        {
                            case AppDataType.Setting:
                                throw new NotSupportedException();
                            case AppDataType.File:
                                folder = ApplicationData.Current.TemporaryFolder;
                                StorageFile file = await folder.CreateFileAsync("dataFile.txt", CreationCollisionOption.ReplaceExisting);
                                await FileIO.WriteTextAsync(file, data.ToString());
                                break;
                            default:
                                throw new NotSupportedException();
                        }
                        break;
                    default:
                        throw new NotSupportedException();
                }
            }
            public static async Task<T> GetAppData(Data key, AppDataStorage storage, AppDataType type)
            {
                Windows.Storage.ApplicationDataContainer settings = null;
                Windows.Storage.StorageFolder folder = null;
    
                switch (storage)
                {
                    case AppDataStorage.Local:
                        switch (type)
                        {
                            case AppDataType.Setting:
                                settings = Windows.Storage.ApplicationData.Current.LocalSettings;
                                bool hasSetting = false;
                                hasSetting = settings.Values.ContainsKey(key.ToString());
                                if (hasSetting)
                                {
                                    return (T)settings.Values[key.ToString()];
                                }
                                break;
                            case AppDataType.File:
                                folder = ApplicationData.Current.LocalFolder;
                                StorageFile file = await folder.GetFileAsync("dataFile.txt");
                                var x = await FileIO.ReadTextAsync(file);
                                return (T)(x as object);
                            default:
                                throw new NotSupportedException();
                        }
                        break;
                    case AppDataStorage.Roaming:
                        switch (type)
                        {
                            case AppDataType.Setting:
                                settings = Windows.Storage.ApplicationData.Current.RoamingSettings;
    
                                bool hasSetting = false;
    
                                hasSetting = settings.Values.ContainsKey(key.ToString());
                                if (hasSetting)
                                {
                                    return (T)settings.Values[key.ToString()];
                                }
    
                                break;
                            case AppDataType.File:
                                folder = ApplicationData.Current.RoamingFolder;
                                StorageFile file = await folder.GetFileAsync("dataFile.txt");
                                var x = await FileIO.ReadTextAsync(file).AsTask();
                                return (T)(x as object);
    
                            default:
                                throw new NotSupportedException();
                        }
                        break;
                    case AppDataStorage.Temporary:
                        switch (type)
                        {
                            case AppDataType.Setting:
                                throw new NotSupportedException();
                            case AppDataType.File:
                                folder = ApplicationData.Current.TemporaryFolder;
                                StorageFile file = await folder.GetFileAsync("dataFile.txt");
                                var x = await FileIO.ReadTextAsync(file).AsTask();
                                return (T)(x as object);
    
                            default:
                                throw new NotSupportedException();
                        }
                    default:
                        throw new NotSupportedException();
                }
    
                return default(T);
            }
    
        }
    
    }
    
    

    Uygulamamızda kullanmak istediğimiz data’lara ait isimleri Data enum’u içerisinde yazıyoruz. Ve diğer enum’ları kullanarak istediğimiz dataya ait bilgiyi appdata ya yazabiliyor veya buradan okuyabiliyoruz.

    Umarım faydalı olmuştur.

  • Yüksek Performans ve Kod Optimizasyonu – IV.SQL Server ve Performans

    Date: 2012.11.22 | Category: İpucları, Makaleler, Yazılar | Response: 1

    Yazının bu bölümünde SQL Server kullanan uygulamalarda performansı arttırmak için ne gibi kurallara dikkat etmemiz gerektiğini inceleyeceğiz.
    Read the rest of this entry »

  • Yüksek Performans ve Kod Optimizasyonu – III. ASP.Net ve Performans

    Date: 2012.11.21 | Category: İpucları, Makaleler, Yazılar | Response: 0

    .Net için genel performans arttırım ipuçlarını inceledikten sonra ASP.Net uygulamalarına özel durumlarda veya nesnelerin kullanımı sırasında performası nasıl arttırabileceğimizi inceleyelim.
    Read the rest of this entry »

  • Yüksek Performans ve Kod Optimizasyonu – II .Net ve Performans

    Date: 2012.11.20 | Category: İpucları, Makaleler, Yazılar | Response: 0

    Uygulamalarımızın performansını yükseltmek için.Net Framework genelinde platform bağımsız geçerli bazı ipuçları söz konusudur. Yazının bu kısmında bu ipuçlarını inceleyeceğiz.
    Read the rest of this entry »

  • Yüksek Performans ve Kod Optimizasyonu – I.Performans

    Date: 2012.11.19 | Category: İpucları, Makaleler, Yazılar | Response: 0

    Uygulamalarımızda performansı nasıl arttıracağımızı incelemeden önce performans kavramının tanımını yapmak gerekmektedir. Genellikle uygulamaların performansları ne kadar hızlı çalıştıkları ile ölçülür ancak bu tam bir performans tanımı değildir. Bir tanım yapmak gerekirse bu son kullanıcı tarafından algılanan performanstır. Tanımlamalardan birine göre performans bir işlem sonucunda yapılan işi belirten bir kavramdır. Bir diğer tanıma göre ise performans ortaya çıkan iş ile tüketilen kaynaklar arasındaki orandır. Anlatılmak istenen performans yüksek ise aynı kaynak tüketilerek daha fazla, düşük ise daha az iş yapılacağıdır. Örneğin değerlendirme kriterimizin yakıt tüketimi olduğu durumda aynı mesafeyi belirli bir miktar yakıt tüketerek giden bir araç daha fazla yakıt tüketerek giden bir araçtan daha performanslıdır. Bilgisayar sektöründen örnek vermemiz gerekirse iki tane hesap makinası uygulamamız olduğunu düşünelim. İkisi de benzer özellikleri sağlayan bu uygulamalardan bir tanesi daha az işlemci ve ram tüketirken diğeri daha fazla tüketiyor ise daha az kaynak tüketen uygulama daha performanslı çalışıyor demektir.
    Read the rest of this entry »

  • Yazılım Projelerinde Müşteri Yönetimi – V.Bakım ve Destek Safhasında Müşteri

    Date: 2012.11.16 | Category: İpucları, Makaleler, Yazılar | Response: 0

    Uygulama geliştirme başarılı bir şekilde bittikten sonra müşteri programı kullanırken çıkacak bug’larda mutlaka size geri dönüş yapacaktır. Bu bug’lar sayı olarak zamanla azalırken bug başına düşen çözüm süresi zamanla artmaktadır. Dolayısıyla uygulama geliştirme sürecinden sonra bir yazılımcıyı yarı zamanlı olarak projede dedike tutmak faydalı olacaktır.
    Read the rest of this entry »

  • Yazılım Projelerinde Müşteri Yönetimi – IV.Test Safhasında Müşteri

    Date: 2012.11.15 | Category: İpucları, Makaleler, Yazılar | Response: 0

    Uygulama geliştirmenin son süreci olan canlı test sürecinde müşteri ile iletişim halinde olunması gerekmektedir. Hatta uygulamanın çalıştığı sunucuya erişebilir olmak ve son kullanıcılara yakın bir lokasyonda çalışmak açısından bu süre müşteride geçirilmelidir. Uygulamada oluşabilecek hataları anında kullanıcı ekranında görmek hata senaryosunun net belirlenebilmesi bakımından zaman kazandırıcıdır. Bu süreçte amaç uygulamanın kullanımı sırasında ilk birkaç günde meydana gelebilecek problemleri yerinde ve anında gidermektir. Ayrıca bu süre bilgi işlem departmanı ile en çok iletişimde olunan süredir.
    Read the rest of this entry »