Windows Phone Add Page Transition to App.xaml

In App.xaml

<Application.Resources>
        <Style x:Key="TransitionStyle" TargetType="phone:PhoneApplicationPage">
            <Setter Property="toolkit:TransitionService.NavigationInTransition">
                <Setter.Value>
                    <toolkit:NavigationInTransition>
                        <toolkit:NavigationInTransition.Backward>
                            <toolkit:SlideTransition Mode="SlideDownFadeIn"/>
                        </toolkit:NavigationInTransition.Backward>
                        <toolkit:NavigationInTransition.Forward>
                            <toolkit:SlideTransition Mode="SlideRightFadeIn"/>
                        </toolkit:NavigationInTransition.Forward>
                    </toolkit:NavigationInTransition>
                </Setter.Value>
            </Setter>
            <Setter Property="toolkit:TransitionService.NavigationOutTransition">
                <Setter.Value>
                    <toolkit:NavigationOutTransition>
                        <toolkit:NavigationOutTransition.Backward>
                            <toolkit:SlideTransition Mode="SlideLeftFadeOut"/>
                        </toolkit:NavigationOutTransition.Backward>
                        <toolkit:NavigationOutTransition.Forward>
                            <toolkit:SlideTransition Mode="SlideUpFadeOut"/>
                        </toolkit:NavigationOutTransition.Forward>
                    </toolkit:NavigationOutTransition>
                </Setter.Value>
            </Setter>
        </Style>
</Application.Resources>

 In MainPage.xaml

<phone:PhoneApplicationPage
    Style="{StaticResource TransitionStyle}"
    x:Class="AcikOgretimDersleri.Views.Sample"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

 

 

Google AdMob, Windows Phone 8’e geldi !!

Google bir duyuru ile AdMob’u Windows Phone 8’e de taşıdığını açıkladı.

            Windows Phone'un çıkışından buyana Google'ın WP ekosistemine ne derece uzak ve isteksiz baktığı bilinen bir şeydi. Öyle ki neredeyse hiçbir servisi için Windows Phone uygulaması geliştirmeyeceğini açıklasada sonrasında başta Youtube olmak üzre bazı ürünleri hakkında geliştirmelerde bulunmuştu. Son günlerde yayınladığı bir haberle nerdeyse bütün platformlarda bulunan Google'ın reklam servisi Admob'un WinPhone ekosistemine de resmi olarak geldiğini duyurdu. Böylelikle WinPhone geliştiriciler için reklamlardan para kazanma şansı gelmiş oldu.

AdMob’un Windows sürümünün henüz beta aşamasında olduğu için Android ile iOS sürümlerindeki özelliklerin tamamını içermediğinin de altını çizmekte fayda var.

Windows Phone 8 için AdMob SDK’sını buradan bilgisayarınıza indirebilirsiniz.

 

Windows Phone, Windows 8 Converter Kullanımı

Windwos Phone yada Windows 8 app. dev.’da ItemSource ile uğraşıyorsanız emin olun muhakkak uygulamanın bir yerinde Converter’a ihtiyacınız olmuştur yada olacaktır. Peki nedir Converter, Ne işe yarar, Nasıl kullanılır ?

Converter kısaca ; ItemSource olarak verilen Data’ya Binding işleminden önce müdahale etmektir şeklinde tanımlayabiliriz.

Örneğin bir sayfa var ve o sayfada WebService’den gelen bir liste var elimizde ve içerisinde Product objesi ve objeninde ProductName ProductID ve Quantity bilgileri var diyelim. Servisten gelen bu response’u alıp bir WinPhone uygulamasında Binding ile ekrana taşımak istiyoruz. Binding le uğraşan arkadaşlar biliyorlardır buraya kadar hiçbir sorun yok direk olarak Listbox yada başka bir kontrole ItemSource verip gerekli Binding’ leri verdikten sonra ekranda kolayca göreceğizdir.

Peki ya müşteriden şöyle bir istek gelirse ; “Ben Qantity bilgisi sıfır gelen ürünlerin adet satırında sıfır değilde Not Available yazsın istiyorum” derse ne yapacağız ? Gereksiz yere Database'de ilgili tabloda alan açıp o bilgiyide orada saklayacak halimiz yok. İşte Converter bu ve benzeri durumlarda devreye giriyor ve işimizi kolaylaştırıyor. Şimdi yukarıda bahsettiğimiz case'i aşağıda olduğu gibi bir adet ConverterSample adında WinPhone projesi oluşturarak inceleyelim.

 Öncelikle aşağıda olduğu gibi Producta adında bir class tanımlıyoruz.

public class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public int Quantity { get; set; }
}

 Sornasında geriye List<Product> dönen GetAllProducts() adında metod yazıyoruz ve örnek ürünleri store ediyoruz.

public List<Product> GetAllProducts()
{
List<Product> _allProducts = new List<Product>();
_allProducts.Add(newProduct()
{
ProductID = 111,
ProductName = "Product 111",
Quantity = 124
});
_allProducts.Add(newProduct()
{
ProductID = 112,
ProductName = "Product 112",
Quantity = 75
});
_allProducts.Add(newProduct()
{
ProductID = 113,
ProductName = "Product 113",
Quantity = 47
});
_allProducts.Add(newProduct()
{
ProductID = 114,
ProductName = "Product 114",
Quantity = 32
});
_allProducts.Add(newProduct()
{
ProductID = 115,
ProductName = "Product 115",
Quantity = 0
});
_allProducts.Add(newProduct()
{
ProductID = 116,
ProductName = "Product 116",
Quantity = 4
});
return _allProducts;
}

Code behind da en son olarak Constructor içerisinde üstte yazdığımız metoddan dönen List’i alıp Xaml tarafta oluşturacağımız ListBox’a ItemSource olarak vereceğiz.

// Constructor
public MainPage()
{
InitializeComponent();
lb_products.ItemsSource = GetAllProducts();
}

Xaml tarafında ise Grid içerisinde Row, ve  ListBox’ı oluşturup gerekli Bind işlemlerini yapıp projemizi çalıştırıyoruz ve aşağıdaki gibi bir görüntü alıyoruz.

    

<!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
 
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="Converter Expample" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
            <TextBlock Text="Product List" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>
 
        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="50"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50"/>
                <ColumnDefinition Width="250"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock
                Grid.Row="0"
                Grid.Column="0"
                Text="ID"
                FontWeight="Bold"/>
            <TextBlock
                Grid.Row="0"
                Grid.Column="1"
                Text="ProductName"
                FontWeight="Bold"/>
            <TextBlock
                Grid.Row="0"
                Grid.Column="2"
                Text="Quantity"
                FontWeight="Bold"/>
            <ListBox
                x:Name="lb_products"
                Margin="0,60,0,0"
                Width="480">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="50"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="50"/>
                                <ColumnDefinition Width="250"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock
                                Grid.Row="0"
                                Grid.Column="0"
                                FontWeight="Bold"
                                Text="{Binding ProductID}"/>
                            <TextBlock
                                Grid.Row="0"
                                Grid.Column="1"
                                FontWeight="Bold"
                                Text="{Binding ProductName}"/>
                            <TextBlock
                                Grid.Row="0"
                                Grid.Column="2"
                                FontWeight="Bold"
                                Text="{Binding Quantity}"/>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>

 

Yujkarıda olduğu gibi listbox'ımıza Itemsource olarak ürünlerimizi verdik ve Quantity bölümündeki bilgileri uygulamamızda gösterdik. ID'si 115 olan ürünün Quantity değeride "0" olarak geldi. Buraya kadar herşey güzel ancak müşteri bizden Quantity bölümünde sıfır olan ürünler için Not Available yazılmasını söyledi ama biz ekrana Service’den gelen datayı yazdırdık.

Converter için ilk olarak Projemize bir adet QuantityConverter adında class ekliyoruz ve class’ımıza IvalueConverter interface’ini uyarlıyoruz ve IvalueConverter Convert ve ConvertBack adında sahip olduğu 2 adet metodu class’ımıza ekleniyor.Biz şimdilik Convert metodunu kullanacağız. ConvertBack’in ne işe yaradığını ilerki yazılarda bahsedeceğiz. Convert metodunun içerisini aşağıda olduğu gibi değiştiriyoruz.

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (int)value == 0 ? "Not Available" : value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}

Şimdi sırada yazmış olduğumuz Converter’ı Binding işlemine entegre etmek. Bunun için xaml tarafına yazmış olduğumuz Converter’ı tanıtmalıyız. İlk olarak xmlns:Converter="clr-namespace:ConverterSample" Converter adını verdiğimiz namespace’i eklemek ve en dıştaki Grid’in üstüne aşağıda olduğu gibi Converter’ı Resource olarak yazmak.

   

 <phone:PhoneApplicationPage.Resources>
        <ResourceDictionary>
            <Converter:QuantityConverter x:Key="QuantityConverter"/>
        </ResourceDictionary>
    </phone:PhoneApplicationPage.Resources>

 

Son işlem olarak Quantity bilgisini Bind ettiğimiz yere QuantityConverter’ı yazmak,

<TextBlock
Grid.Row="0"
Grid.Column="2"
FontWeight="Bold"
           Text="{Binding Quantity,Converter={StaticResource QuantityConverter}}"/>

Visual State Nedir ? Nasıl Kullanılır ?

Visual State Kavramı blend yardımı ile xaml tarafında oluşturulan arayüzler için belirlenen state’lere göre story board aracılığı ile geçiş efektleri ve animasyonlar yapmamızı sağlayan yapıdır.

Kısaca şöyle örnekleyebiliriz; üzerinde “Aç” yazan bir butonumuz var ve kullanıcı bu butona bastığı anda ekranın üstünde bulunup o an kullanıcıya görünmeyen bir pop-up’ın yukarıdan aşağıya doğru düştüğünü ve o pop-up üzerinde bulunan “Kapat” butonuna basıldığında tekrar yukarıya doğru çıkıp sayfa üzerinden kaybolduğunu düşünelim. İçimizden “Neden bunu çok rahat bir şekilde story board kullanarak yapmayalım ki ?” diye soran arkadaşlar olacaktır ve bunun cevabını ise şu şekilde verebiliriz.

  • Story Board genel olarak uygulama içerisinde animasyonların ve değişik birbirini takip eden efektlerin olduğu yapıların hazırlanması için kullanılmalıdır.
  • Visual State ise control’ün yapacağı işlevler sınırlı olduğu durumda yani control’ün stateleri belli olup daha kısıtlayıcı efektlere ihtiyaç duyulduğunda kullanılması gereken yapıdır.

 

Üstte verdiğimiz örneği düşündüğümüzde bizim 2 adet state’imiz bulunmaktadır.

               1-Pop-up’ın açılması,

               2-Pop-up’ın kapatılması.

Yani ihtiyacımız olan şey  Visual State ‘dir.

 Gelin şimdi 1 adet windows phone app oluşturarak o örneği yapalım

 Xaml kodları ve ekran görüntüsü aşağıdaki gibi olan bir arayüz oluşturduk,

  

<Grid
        x:Name="ContentPanel"
        HorizontalAlignment="Stretch">
        <StackPanel
            Margin="0,-200,0,0"
            x:Name="stackPanel"
            VerticalAlignment="Top"
            Background="#f0f0f0"
            Orientation="Vertical">
            <TextBlock
                Margin="20,40,0,0"
                Text="Visual State"
                FontSize="30"
                FontWeight="SemiBold"
                Foreground="#373938"/>
            <Button
                Width="210"
                Margin="0,0,0,0"
                BorderBrush="#F26B28"
                HorizontalAlignment="Center"
                Content="kapat"
                FontWeight="Bold"
                Foreground="#F26B28"/>
        </StackPanel>
        <Button
            Width="210"
            Height="100"
            Margin="0,-0,0,0"
            BorderBrush="#F26B28"
            HorizontalAlignment="Center"
            Content="Aç"
            FontWeight="Bold"
            Background="White"
            Foreground="#F26B28"/>
    </Grid>

 

 Şimdi ise sırada Visual State’leri oluşturma var. Bunun için SolutionExplorar’dan MainPage.xaml’e sağ tıklayıp “Open in Blend” diyoruz ve sayfamızı Blend Exp.’da açıyoruz.

 Açılan sayfada sol menüden pop-up’ımız olduğu StackPanel kontolünü seçip bir üstte bulunan State sekmesinden Add state group’a tıklayıp bir adet VisualState Group oluşturmuş oluyoruz. Gereken “Aç” ve “Kapat” statelerini ise bu gorup içerisinde tanımlayacağız

İlk olarak VisualStateGroup yazan yerin sağ tarafında bulunan Add State’e tıklayarak “Kapat” state 2imizi belirliyoruz. Aynı şekilde bir adet daha state ekleyerek onun adınada “Ac” ismini veriyoruz. 

Kapat ve Ac statelerini sağ taraflarında bulunan Add Transition’a tıklayarak Kapalı durumdan açık duruma gelirken ne gibi bir geçiş olacak onu belirliyoruz ve aynı şeyi Açık durumdan kapalı duruma geçerkende yapıyoruz. Gerekli margin ve transition değerlerini verdikten sonra iki state’in arasındaki geçişi yapacak olan story board’a geçiş süresini belirtiyoruz ve Blend’de bulunan uygulamamızı kaydedip kapatıyoruz ve Visual Studio’ya geri dönüyoruz.

 

Şimdi ise sırada oluşturmuş olduğumuz state’leri gerekli durumlarda çağırma işlemi var.Sayfanın xaml tarafına baktığımızda Visual State kodlarımızın geldiğini göreceksinizdir.

//Aç butonunun click event’ine
VisualStateManager.GoToState(this, "Ac", true);

//Pop-up üzerinde bulunan Kapat butonuna ise
VisualStateManager.GoToState(this, "Kapat", true);

 Kodlarını yazdığımızda oluştumuş olduğumuz stateleri çağırıp gerekli transitionları yapacaktır.

 

 >> catch {Foot in Mouth} 'e düşmemeniz dileğiyle.. Smile <<

Windows Phone HyperlinkButton without Underline

Windows Phone'da en çok kullanılan kontrollerden birisi hiç şüphesiz HyperlinkButton'dur. Sayfaya 1 adet HyperlinkButton ekleyip Content'ine text verip uygulamayı çalıştırdığımızda text'in altı çizili olarak geldiğini göreceksiniz. Bu durum WinPhone projelerinde pekte tercih edilen birşey değildir zira gözede hoş gelmemektedir. Altı çizgisiz HyperlinkButton kullanmak istediğimizde ise çok basit bir şekilde App.xaml içerisine Application.Resources'a style ekleyerek HyperlinkButton'un altındaki çzgiyi yok edebilirsiniz. Örnek kullanım aşağıdaki gibidir;

 

App.xaml sayfası

 

<Application.Resources>
        <Style x:Key="hlbutton_Style" TargetType="HyperlinkButton">
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="FontSize" Value="16"/>
            <Setter Property="Padding" Value="0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="HyperlinkButton">
                        <Border Background="Transparent">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="MouseOver"/>
                                    <VisualState x:Name="Pressed">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0"
Storyboard.TargetName="TextElement" Storyboard.TargetProperty="Opacity" To="0.5"/>
                                        </Storyboard>
                                        </VisualState>
                                        <VisualState x:Name="Disabled">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames
Storyboard.TargetName="TextElement" Storyboard.TargetProperty="Foreground">
                                                    <DiscreteObjectKeyFrame KeyTime="0"
Value="{StaticResource PhoneDisabledBrush}"/>
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                            </VisualState>
                                            </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Border Background="{TemplateBinding Background}"
Margin="{StaticResource PhoneHorizontalMargin}" Padding="{TemplateBinding Padding}">
                                <TextBlock x:Name="TextElement" Text="{TemplateBinding Content}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" TextWrapping="Wrap" TextDecorations="none"/>
                                </Border>
                                </Border>
                                </ControlTemplate>
                </Setter.Value>
                </Setter>
                </Style>
</Application.Resources>

App.xaml içerisine yukarıdaki eklemeleri yaptıktan sonra tek yapmanız gereken sayfaya eklediğiniz HyperlinkButton kontolüne Style olarak yukarıda oluşturduğumuz style'ı vermek,

 

<HyperlinkButton Style="{StaticResource hlbutton_Style}"/>

 

ADO.Net Entity Framework Hız Testi

Bu makalede local'de bulunan northwind database'ine bağlanarak Customers tablosunda bulunan müşterileri hem ADO.Net hem de Entity Framework kullanarak alıp array içerisine atacağız ve iki işlem arasındaki hız farkını ölçmeye çalışacağız.

 

Entity Framwork'ün developerlara ne derece kolaylık sağladığını biliyorsunuzdur.Normal şartlarda ADO.Net kullanarak ortalama 20 satır kodla yaptığınız işlemleri Entity Framework ile %60 daha az kod yazarak yapabiliyoruz. Düşünüldüğü zaman inanılmaz bir durum ve zamandan kazanç sağlamak için muhteşem bir mimari. Bende aynen böyle düşünüyordum taki aradaki hız farkının en kötü şartlarda bile 3 kattan daha fazla olduğunu öğrenen kadar. Gelin aşağıda örneğimizi inceleyerek devam edelim. 

 

Öncelikle Northwind database'inde bulunan Customers tablosunun colonlarını aşağıda olduğu gibi classlaştırıyoruz

public classCustomer
    {
        public int CustomerID { get; set; }
        public string CompanyName { get; set; }
        public string ContactName { get; set; }
        public string ContactTitle { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
        public string Phone { get; set; }
    }

 

Sonrasında ADO.Net ile database'de kayıtlı bulunan müşterilerin bilgilerini alıp Customer objesinden bir List array'in içerisine dolduruyoruz,

public List<Customer> GetCustomers_By_ADO()
{
List<Customer> AllCustomers = newList<Customer>();
 
SqlConnection conn = newSqlConnection("Server=CT;database=Northwind;trusted_connection=True");
SqlCommand cmd = newSqlCommand("select * from Customers", conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
AllCustomers.Add(newCustomer()
{
CustomerID = dr.GetString(0),
CompanyName = dr.GetString(1),
ContactName = dr.GetString(2),
ContactTitle = dr.GetString(3),
Address = dr.GetString(4),
City = dr.GetString(5),
Country = dr.GetString(8),
Phone = dr.GetString(9),
});
}
return AllCustomers;
 }

Şimdi ise aynı işlemi Entity Framework kullanarak yapıyoruz,

NorthwindEntities db = newNorthwindEntities();
public List<Customers> GetCustomersBy_EF()
{
List<Customers> AllCustomers = newList<Customers>();
AllCustomers = db.Customers.ToList();
return AllCustomers;
 }

Bakıldığı zaman ADO.Net ile yaklaşık 25 satırda yaptığımız işlemi Entity Framework ile 7 satırda hallediyoruz. Şimdi gelelim Hız testimize. Bir adet WebForm ekliyoruz ve içerisine aşağıdaki kodları yazarak testimizi yapıyoruz.

 

İlk olarak ADO.Net hızını test ediyoruz,

Stopwatch sw2 = newStopwatch();
sw2.Start();
Customer c1 = newCustomer();
c1.GetCustomers_By_ADO();
sw2.Stop();
string result2 = sw2.ElapsedMilliseconds.ToString();
Response.Write(result2 + " ms.");

 

 Şimdi Entity Framework kullanarak testimizi yapalım,

Stopwatch sw1 = newStopwatch();
sw1.Start();
Customer c = newCustomer();
c.GetCustomersBy_EF();
sw1.Stop();
string result = sw1.ElapsedMilliseconds.ToString();
Response.Write(result);

 

Sonuçlar Nasıl Mı ?

 

Ado.Net ile yapılan işlem;

Entity Framework ile yapılan işlem;

 Görüldüğü üzre aradaki fark neredeyse 7 kattan daha fazla.Bunun nedenine gelecek olursak, ADO.Net ile yapılan her bir sorguda istenilen türdeki obje 1 defa generate edilirken Entity Framework ile yapılan her bir sorgu için entity'niz sürekli generate edilir ve bu projeniz için çok yüksek oranda bir performans kaybına neden olur. Bu fark küçük çaplı projelerde belki göz ardı edilebilir ancak eğer ki proje gayet kapsamlı ve büyük bir projeyse inanılmaz derecede bir hız farkı ortaya çıkarmaktadır.

 

Son söz olarak ; ADO Candır !!

11. IEEE Türkiye Öğrenci Kolları Ve Gold Kongresi - Kıbrıs'2013

Sağdan akan trafik, devasa büyüklükte DAU kampüsü, inanılmaz sıcaklık, mercedes taksiler ve yavru vatan kıprıs :)

Yaklaşık 2 ay önce davetini aldığımız 11. IEEE Türkiye Öğrenci Kolları Ve Gold Kongresine Üniversitemizde 10 yıldır faliyet gösteren IEEE Student Branch ekibinden 4 arkadaşla birlikte ve Üniversitemizden aldığımız her türlü maddi manevi destekle katılma fırsatımız oldu. Konferans salonları, konaklama, ulaşım, yemek vs. gibi bütün ihtiyaçlar Doğu Akdeniz Üniversitesi IEEE Student Branch ekibi tarafından organize edildi ve Türkiye'de bulunan çeşitli üniversitelerden katılan yaklaşık 200'e yakın öğrencileri en iyi ve güzel şekilde ağırladılar. Kadir Has Üniversitesi olarak kongre boyunca çeşitli oturumlar, workshop'lar, ve başta IEEE Türkiye temsilcisi olmak üzre birçok seçim ve oylamalara katıldık. Farklı üniversitelerden katılan birçok kişiyle tanışma fırsatımız oldu ve belkide bir daha hiç bozulmayacak arkadaş ilişkileri kurulmuş oldu. 

 

Malum Kıbrıs'ta olduğumuzdan havanın ne derece sıcak olacağını daha gitmeden önce tahmin etmiştik ama inanın ne tahmin etmişsek 2 katı çıktı. İnanılmaz bir sıcaklık vardı ve klima gördüğümüz anda sanki define bulmuş gibi sevinmiştik :)

Üniversite Gazimağusa daydı ve bizde DAU Yurt 4'de konakladık. Kampüs inanılmaz derecede büyük ve yürüyerek bir yere gidilmesi oldukça zordu bizde herkesin yaptığı gibi taksiyle her yere gidip geldik. Ücret olarak fena değil gibi 4-5 kişi bindiğinizde kişi başı max 3 TL gibi ücret ödüyorsunuz.Yemek konusu biraz sıkıntılıydı pek bizim alışık olduğumuz gibi değildi, deniz kum & güneş 3'ü 1 arada muhteşemdi :) Son gün Girne'ye gittik ve orada bulunan savaş zamanından kalma birkaç müzeyi gezdik,

 Ve daha nicesi..

Web Service'de Güvenlik | Soap Header

Bu makalede Web Service Nasıl Yazılır ? makalesinde bahsettiğim üzre Web Service'de Soap Header Kimlik Denetimi yani Username Password ile service'i kullanabilme konusundan bahsediyor olacağım.

 

Web Service'in tanımına değinecek olursa M2M iletişimin önünü açmak ve back-end sistemlerde var olan çeşitli database yada enterprise yapıların diğer platformlarla iletişimini güvenli bir şekilde sağlamak için geliştirilmiş yapılardır, Kısacası farklı platformların haberleşmelerini sağlamak için kullanılan teknolojilere verilen isimdir. Web Service Nasıl Yazılır ? makalesinde local'de bulunan Northwind database'ine bağlanarak Employees tablosundaki çalışanların bilgilerini getiren bir .asmx servis geliştirmiştik, hatırlicak olursanız projeyi kendi bilgisayarımızda çalıştırdığımızda aşağıdaki resimlerde olduğu gibi çok rahat bir şekilde metod isimlerine tıklayıp Çağır butonuna bastığımızda servis çalışıp istenilen verileri bize getiriyordu.

 

 Yukarıda da gördüğümüz gibi her şey sorunsuz çalışıyor ancak anormal olan durum service URL'ini bulan herhangi biri gidip aynı service'i kullanarak database'de kayıtlı bulunan verilere erişebilir ve bu durum hiç bir şirket yada service sahibi tarafında istenilen bir durum değildir.Güvenlik durumunda web service'ler için kullanılabilecek çeşitli yöntemler vardır bunlardan ençok tercih edileni kuşkusuz Soap Header'dır. Soap Header kullanarak service tarafında belirleyeceğimiz UserName ve Password ile Client'ın service'e bu UserName ve Password kullanarak girişine izin vereceğiz.

1.Adım | Proje ve Class'ın Oluşturulması

  • Visual Studio'da "Northwind" isminde bir adet ASP.Net Empty Web Application oluşturuyoruz. Sonrasında proje içerisine aşağıda olduğu gibi 1 adet User adında "SoapHeader"'dan kalıtım alan class oluşturuyoruz ve içerisine service'e login esnasında kullanacağımız attributeleri yazıyoruz.

   

 public class User : SoapHeader
    {
        public string Username;
        public string Password;
    }

 

2.Adım | Service Sayfasının ve WebMethod'un Oluşturulması

  • Bu adımda projemize sağ tıklayıp 1 adet "MyService" adında Web Service sayfası ekliyoruz ve içerisine aşağıda olduğu gibi kullanacağımız WebMethod'larını yazıyoruz

 

public User User;  //Oluşturmuş olduğumuz User class'ından 1 adet User tanımlıyoruz
 
[WebMethod]        
[SoapHeader("User")]  //Güvenlik burda devreye giriyor, WebMethod'a SoapHeader içerisinde bulunan User nesnesi ile giriş yapıldığını belirtiyoruz
public string KullanıcıGirisi()
{ 
   //Client tarafında UserName ve Password bilgileri doğru girildiğinde ve girilmediğinde yapılması gerekenleri belirtiyoruz
   if (User.Username == "caner" && User.Password == "tosuner")
      return "Kullanıcı Girişi Başarılı";
   else
      return "Kullanıcı Girişi Başarısız";
 }

 

 

Bütün bu işlemler sonrasında Projemizin Solution bölmümü sağ tarafta olduğu gibidir

 

 

 3.Adım | Client Tarafından Service'e İstekte Bulunulması

  • Solution'a sağ tıklayıp 1 adet "Client" adında ConsoleApplication oluşturuyoruz ve sonrasında solution'da bulunan iki projenin haberleşebilmesi için Client ta bulunan References'a sağ tıklayıp "Add Service Reference" diyoruz ve açılan penceren Discover'a tıklayıp solution'da bulunan Northwind projesini görmesini sağlayıp Service bir isim Verdikten sonra OK butonuna basıyoruz. Client'ta bulunan Program.cs class'ını açıp Main metodunun içerisini aşağıda olduğu gibi dolduruyoruz.

 

Northwind.ServiceReference1 sc = new Northwind.ServiceReference1 ();  //Referans olarak eklediğimiz service'in ismi
Northwind.User user= new Northwind.User ();   //Servis içerisinde bulunan SoapHeader'dan kalıtım almış nesnemizi seçiyoruz.
 
user.Username = "caner";   //Servis tarafında oluşturduğumuz Username ve Password bilgilerini user nesnesinin attributlerine yazıyoruz
user.Password = "tosuner";
 
string result= sc.KullanıcıGirisi(user);  //KullnıcıGirisi WebMethod'una user nesnesini veriyoruz ve return edilen sonucu ekranda yazıdırıyoruz.
Console.WriteLine(result);
 
Console.ReadKey();

 

Projeyi çalıştırdığımızda UserName ve Password bilgilerini doğru yazdığımızdan aşağıda olduğu gibi Kullanıcı Girişi Başarılı mesajını ekranda görmüş olacağız.

Microsoft Student Partner Programına Seçildim.

Microsoft'un öğrenciler için olan "Microsoft Student Partner" programına seçildim Smile

  

       "The Begining Of a Dream.." MSP programını ilk olarak geçen yıl önce bu zamanlar duymuştum ve o zaman tam olarak nedir ne değildir bilmiyordum, kısa bir araştırmanın ardından öğrenciler için kaçınılmaz bir fırsat olduğunu öğrendim ve koyuldum yollara :) Başvuru için neler gerekli ?, nasıl başvuru yapılır ? gibi soruların cevabını bulduktan sonra başvuru tarihini beklemeye koyuldum. Geçen yaz tatilinde Amerika'daydım ve sürekli olarak her hafta yaptığım şey Microsoft Kampüs Türkiye Facebook sayfasına girip başvurular başladı mı başlamadı mı diye kontrol etmekti. Aslında gitmeden önce her şeyi hazırlamıştım *Başvuru formunu doldururken gerekli bilgiler, referans olarak göstereceğim kişi hatta başvurular sırasında istenen tanıtım videosunun metnini bile yazmıştım ve Time Square' de  başvuru videosunu çekmiştim Cool Yani tek gereken şey başvurular açıldığında başvuru yapması kalmıştı.

Gel gelelim yaz sonuna kadar bir türlü başvurulara denk gelemedim ve Eylül ayının sonunda Türkiye'ye döndüm ve dersler başladıktan yaklaşık 2,5 ay sonra bir pazar akşamı misafirliğe gittiğim bir yerde gece saat 23:30 gibi facebook'da gezinirken Microsoft Kampüs Türkiye Facebook sayfasına girdim birde ne göreyim "Yeni Dönem MSP başvuruları için son 24 saat" yazıyordu ve 24 saatin dolmasına tam 30 dkka vardı.Hemen başvuru linkine tıklayıp formda bulunan 10-12 soruyu hızlıca doldurdum ve en çok korktuğum şey video konusunda herhangi bir şey istememeleriydi ve son olarak da başvurumdan üniversitede görevli olan bir hocamızın bilgisi olması şartıydı, hemen alelacele Taner hocaya e-mail atıp konu hakkında bilgilendirdim ve o da hemen cevap verip kendisinin ismini yazabileceğimi söyledi.

Neyse başvuruyu yapmıştım ve yaklaşık 1 ay içerisinde sonuçlar açıklandı ve o dönem yeni bir sisteme gidilerek ilk başvuran öğrencileri programa "Candidate" yani Aday olarak kabul etmişlerdi haliyle bende bir Microsoft Student Partner Candidate seçildim.Sonrasında çeşitli toplantılar ve etkinlikler düzenledik, çeşitli eğitimler Microsoft Office'de şahane etkinlikler ve birde Bilgi Üniv. Santral'de bir gece sabaha kadar Code-Night yapmıştık. Şahane bir duyguydu sabahlara kadar None-Stop coding :) MSP seçilebilmek için birçok şey yapmak gerekliydi, etkinliklere katılmak, uygulama geliştirmek kısacası tam anlamıyla Microsoft'un bizden beklediği "Aktif" olmaktı.Elimden geldiğince bütün etkinlikler eğitimlere katıldım çünkü MSP seçilemediğim taktirde bir daha bu tür ortamlarda bulunma ihtimalim de oldukça az olabilirdi.Neyse ki sonunda MSP başvuruları ile ilgili e-mail geldi ve aynı form'u yeniden doldurup programa başvurmamız istendi ve tabi birde video :/ Yaklaşık 30-40 denemenin sonucunda 2,5 dkkalık bir MSP başvuru videosu çektim ve link'ini Microsoft'a gönderdim.

         Geçen hafta 13 haziran Perşembe günü Mustafa Kasap hocamızdan aldığım mail ile MSP seçilmiştim. Aslında pekte şaşırmamıştım çünkü tam anlamıyla bir Candidate'dim Laughing yani normal şartlar altında seçilmem gerekir diye düşünüyordum ve çok şükür ki öyle de oldu Laughing 

Candidate'lik süresince neler yaptım, bana neler kattı ;

  • Birçok etkinliğe ve eğitime katıldım,
  • Microsoft Ofiste Tunus'tan gelen MSP arkadaşları misafir edip onlarla tanışma fırsatım oldu,
  • Şubat ayı içerisinde Microsoft Türkiye AçıkAkademi'nin düzenlediği Windows Phone Uygulama Geliştirme Yarışmasına katıldım ve 1 adet Nokia Lumia 800 Cep Telefonu kazandım,
  • Ee tabi telefonu aldıktan sonra bi gaza gelmeler oldu ve yaklaşık 2,5 ay içerisinde 15 adet Windows Phone uygulaması geliştirdim ve markete yolladım,
  • Geliştirdiğim uygulamalar sayesinde biraz tanınmış olacam ki şu anda Türkiye'de bulunan çeşitli firmaların IT çalışanlarından e-mailler almaya başladım ve Windows Phone ile ilgili sorularını yanıtladım,
  • Ben Candidate'ken MSP programında bulunan arkadaşların üzerinde çalıştığı bir proje vardı ve bir gece yarısı gelen email'de projede bir kişi eksik olduğu ve gönüllü katılacak bir kişi aradıkları yazıyordu, bende hiç tereddüt etmeden cvp yazdım ve yaklaşık 20-25 kişiyle birlikte bir Microsoft Projesinde görev alma şansım oldu.Proje hakkında pek bilgi veremiyorum çünkü henüz duyurulmuş bir şey değil :)
  • Biz öğrencilerin baş belası Cv'lerimizi doldururken içinde bu tarz şeylerin olması inanın hayatında şimdiye kadar çok sağlam 3 şirkette mülakata girmiş birisi olarak söylüyorum birçok şirket için büyük önem taşıyor ve firmaların dikkatini çekiyor,
  • Geliştirdiğim Windows Phone uygulamaları sayesinde, geçen yıl bu zamanlar "keşke bu şirkette çalışabilsem..." dediğim o şirket başta olmak üzere birkaç üst düzey firmadan iş teklifleri alma şansım oldu ama istenilen değilde istediğim yerde çalışmayı tercih ettiğimden şimdilik o teklifleri askıya aldım,
  • ve daha nicesi...

 

Kısacası MSP olmak ve bu community'nin içerisinde bulunmak harika bir deneyim oldu benim için ve olmaya da devam ediyor..

Web Service Nasıl Yazılır ?

Web Service günümüz teknolojilerinin olmazsa olmazları arasında yer almaktadır. Bunun en büyük nedeni M2M iletişimin önünü açmak ve back-end sistemde var olan çeşitli database yada enterprise yapıların diğer platformlarla iletişimini güvenli bir şekilde sağlamaktır.  

.Net tarafında çeşitli Web Service yazma yolları vardır bunlardan bir tanesi asmx dediğimiz [WebMethod]’ lar kullanılarak yazılan servislerdir. Aşağıda ki örnekte Database’den veri çekilerek nasıl bir asmx servis yazılıp çekilen veri internet ortamında yayınlanır ona değiniyor olacağız.

1.Adım | Projenin Oluşturulması

  • Öncelikle aşağıdaki resimde de olduğu gibi ismi "WebService" olan bir adet Asp.Net Empty Web Application oluşturuyoruz

2.Adım | Projeye Web Service Sayfası Eklenmesi

  • Projeyi oluşturduğumuzda içerisinde default olarak Properties, References ve Web.config sayfalar geliyor. WebMethod yazabilmek için Proje ismine sağ tıklayıp aşağıda ki resimde de olduğu gibi bir adet ismi "WebMethods" olan WebService sayfası ekliyoruz.

  3.Adım | WebMethod 'un Anlaşılması

  • Service sayfasını ekledikten sonra kodlarını açtığımızda içerisinde default olarak gelen bir adet HelloWorld() metodu bulunmaktadır
[WebMethod] // [WebMethod] tag'i altında yazılı olan Metodun bir "Web Method" olduğunu belirten yapıdır. Aslında kabacası bizim internette yayınlayacağımız ve Client tarafında kullanılacak metod olduğunu belirtiyor.
publicstring HelloWorld()  //Herbir .asmx service sayfasında Default olarak gelen parametre almadan geriye string dönen HelloWorld() bulunmaktadır.Browser'da servici çalıştırdığınızda aşağıda resimde olduğu gibi metodları görüyor olacaksınız
DipNot - [WebMethod] tanımlaması yapılan metodlar Browser'da görünmeyecektir, Sadece [WebMethod] etiketine sahip metodlar burda görünür ve Client tarafından direkt olarak kullanılır
{
return"Hello World";
}

4.Adım | Web Service Nasıl Bir İşlem Yapıyor Olacak ?

  • Geliştireceğimiz Web Service local'de bulunan Northwind Database'ine bağlanarak Employees tablosunda bulunan Çalışanların Ad(FirstName), Soyad(LastName) ve İş Tanımı(Title) bilgilerini yayınlıyor olacak.Bunun için öncelikle pc'nizde Northwind database'i bulunuyor olması gerekli. Olmayan arkadaşlar bu Link' teki script'i indirip MS-SQL Management Studio kullanarak kurulum yapabilirler.

5.Adım | Database'den Employees Bilgilerini Çeken Metodun Yazılması

  • Database ile bağlantı kurmanın çeşitli yolları vardır.İster Entity Framework kullanırsınız istersenizde klasik Ado.Net yazarsınız.Ben Ado.Net'in Entity Framework ve yandaşlarına kıyasla 7 kat gibi bir hız farkıyla çalışmasında dolayı Ado.Net kullanıyor olacağım Smile. İlk olarak "Employees" tablosundan "FirstName" ,"LastName" ve "Title" bilgilerini almamız için bu attributelere sahip "Employees" class'ını aşağıdaki gibi oluşturuyoruz
public class Employees
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Title { get; set; }
 }
  • Şimdi ise Ado.Net kullanarak çekeceğimiz bu Employees'leri List<Employees> array'i oluşturup içerisine atıp sonrasında Web Service' imiz ile yayınlıyor olacağız. Geriye List<Employees> dönen CallEmployees() adında bir metod tanımlayalım ve kodlarımızı aşağıda olduğu içerisine yazalım.
[WebMethod]
public List<Employees> CallEmployees()
{
//Employees'leri içerisine doldurup return ettireceğimiz List<> array
List<Employees> AllEmployees = new List<Employees>();
 
//Local'de bulunan Northwind database'ine bağlanmamızı sağlayan connectionstring'i
SqlConnection conn = new SqlConnection("server=.;database=Northwind;trusted_connection=True");
 
//Hangi bilgileri çekeceğimizi belirttiğimiz sql sorgumuz
SqlCommand cmd = new SqlCommand("select FirstName,LastName,Title from Employees", conn);
conn.Open(); //Sql bağlantısını açıyoruz
SqlDataReader dr = cmd.ExecuteReader();  //DataReader kullanarak verileri alıyoruz
while (dr.Read())
{
//Çektiğimiz verileri Employee nesnesi'nin attribütlerine atayıp sonrasında AllEmployees array'inin içerisine atıyoruz
AllEmployees.Add(new Employees()
{
FirstName = dr.GetString(0),
LastName = dr.GetString(1),
Title = dr.GetString(2)
});
}
//Son olarakda doldurduğumuz array'i return ediyoruz
return AllEmployees;
}
  • Projeyi Run ettiğimizde Browser'da aşağıda olduğu gibi HelloWorld() metoduyla birlikte bizim sonradan tanımladığımız CallEmployees() metodunu görüyor olacağız. 1. resimde bulunan metodumuza tıkladığımızda 2. resimde gördüğümüz sayfa açılıyor olacak ve Çağır butonuna tıkladığımızda son resimde gördüğümüz gibi Database'den gelen veriler XML formatında görüntüleniyor olacak.

 -

 6.Adım | Web Service'in Internet'te Yayınlanması

  • Geliştirmiş olduğunuz bu gibi Web Servic'i yayınlamak için Solution'dan proje üzerine sağ tıklayıp Publish deyip sonrasında generate edilmiş dosyaları web sitenizin bulunduğu ftp' ye atmanız yeterli olacaktır.
  • Yazılmış olan bu web service'i diğer projelerde kullanmak için ise service'in bulunduğu sayfayı projelerinize Reference olarak ekleyip sonrasında içerisinde bulunan metodları kullanabilirsiniz.Biz projede sadece select işlemi yapan bir WebMethod yazdık ama ihtiyaca göre çok daha farklı inserti, update, delete gibi işlemler yapan WebMethod'larda yazılabilir.

 7.Adım | Web Service' de Güvenlik

  • Makalenin başında da bahsettiğimiz gibi Web Service'ler şirketler için büyük önem taşırlar nedeni ise veri'nin sadece istenilen kişiler tarafından kullanılması. Biz yukarıda geliştirmiş olduğumuz projede güvenlik olarak hiç birşey yapmadık yani siz bu projeyi internette publish ettikten sonra çeşitli yazılımlar kullanılarak data-sniffing ile servis'in bulunduğu URL bulunup yazmış olduğunuz metodlar diğer kişiler tarafındanda kullanılabilir.İşte bu gibi durumlarda güvenlik çok büyük öneme sahip oluyor.Konu uzun olduğu için Web Service'de Güvenlik Nasıl Sağlanır ? bir sonraki makalemizde görüyor olacağız. Umarım buraya kadar yazdıklarımız yararlı olmuştur, herhangi bir sorunuz olduğunda e-mail ile ulaşabilirsiniz,

 

Projeyi burdan indirebilirsiniz..