Ana Sayfa | English Blog | Seminer TV | Dil Cookie Sil  Blog'u Mail ile takip et!       
Daron Yöndem - WF
bir yazılımcının tasarıları...
 Sunday, December 13, 2009

Bugün INETA NEXT'in İstanbul ayağını gerçekleştirdik. Kişisel olarak benim için efsanevi bir hafta sonu oldu! Tüm konuşmacılarımıza tek tek milyonlarca defa teşekkür ediyorum. Ayrıca tabi ki yağmura rağmen tüm salonu dolduran herkese de onlarca teşekkürler! Umarım herkes için de bir o kadar faydalı bir aktivite olmuştur.

Katılım zirvede bir seminer! INETA NEXT!
Katılım zirvede bir seminer! INETA NEXT!

İki gün boyunca hızlı bir "geleceğe bakış" attık. SL 4, VB10, CS4, ASP.NET 4, WF4, IIS Media Services, IE Development vs derken epey bir içeriğe hızlıca göz atma şansımız oldu. Tabi hediyelerimiz de eksik olmadı :) NEXT serisine uygun şekilde Windows 7 hediyemizin yanı sıra Windows 7 T-Shirtlerimiz, Visual Studio 2010 atkılarımız, laptop stickerlarımız! havalarda uçuştu desem yeridir :)

INETA NEXT İstanbul ayağı...
INETA NEXT İstanbul ayağı...

Tekrar katılan herkese defalarca teşekkürler. Çok yakında etkinlikte konuşan tüm konuşmacılarımızın sunumlarını ve video kayıtlarını da sizlerle www.inetatr.org üzerinden paylaşacağız. İçerikler ve paylaşımlar hazır olduğunda ben de twitter ve blog üzerinden duyuracağım.

Bu arada unutmayın :) blogumu sayfanın en üstündeki linkten kayıt olarak mail ile de takip edebilirsiniz.

Haftaya hafta sonu Kayseri'de görüşmek üzere!

Not: Tüm etkinlik fotoğraflarına buradan ulaşabilirsiniz: http://skydrive.live.com/inetanext09istanbul

Sunday, December 13, 2009 11:29:09 PM (GTB Standard Time, UTC+02:00)  #    Comments [3]   .NET Framework 4.0 | ASP.NET 4.0 | C# | IE 8.0 | Seminer | Silverlight 4 | Visual Basic 2010 | Visual Studio 2010 | WCF | WF  | 
 Sunday, November 29, 2009

INETA NEXT etkinliklerimizle ilgili duyuruyu bundan yaklaşık bir hafta önce sizinle paylaşmıştım. Maalesef o zamanlarda içeriği paylaşma şansımız yoktu çünkü içeriğimizde daha Microsoft tarafından lansmanı yapılmamış ürünlere dair oturumlar olacaktı :) Eh artık zamanı geldi ve içeriğimizi paylaşmaktan gurur duyuyorum.

Diyarbakır - Dicle Üniversitesi, Tıp Fakültesi Konferans Salonu
5 Aralık
11.00-12.30 Visual Basic  10 Yenilikleri - Daron Yöndem (yazgelistir.com)
14.00-15.30 Windows 7'de neler var? - Muammer Benzeş (birliktegelistir.com)
16.00-17.00 Silverlight 4 - Daron Yöndem (yazgelistir.com)
6 Aralık
11.00-12.30 C# 4.0 Yenilikleri - Erkan Balaban (ceviz.net)
14.00-15.30 WPF 4 ile 3D Animasyon Programlama - Daron Yöndem  (yazgelistir.com)
16.00-17.30 ASP.NET 4.0 - Erkan Balaban (ceviz.net)

İstanbul - Microsoft Ofisi (Kroki)
12 Aralık
;
10.00-11.00 Silverlight 4 - Daron Yöndem (yazgelistir.com)
11.00-12.00 ASP.NET MVC 2 - Oğuz Yağmur (csharpnedir.com)
14.00-15.00 IIS Media Services - Muammer Benzeş (birliktegelistir.com)
15.15-16.15 Visual Basic 10 Yenilikleri - Daron Yöndem (yazgelistir.com)
13 Aralık
11.00-12.30 ASP.NET 4.0 Yenilikleri - Uğur Umutluoğlu (nedirtv.com)
14.30-15.45 Workflow Foundation 4.0 - Burak Selim Şenyurt (csharpnedir.com)
16.00-17.00 C# 4.0 Yenilikleri - Erkan Balaban (ceviz.net)
17.15-18.00 IE 8 Toolbar Geliştirme  - Barış Kanlıca (yazgelistir.com)

Kayseri - Erciyes Üniversitesi Mühendislik Fakültesi Konferans Salonu
19 Aralık
11.00-12.30 C# 4.0 Yenilikleri -Burak Selim Şenyurt  (csharpnedir.com)
14.00-15.30 Silverlight 4 - Daron Yöndem (yazgelistir.com)
15.45-16.45 ASP.NET 4.0 - Selçuk Yavuz (ceviz.net)

20 Aralık
11.00-12.30 ASP.NET MVC 2 - Selçuk Yavuz (ceviz.net)
14.00-15.30 Visual Basic 10 Yenilikleri - Daron Yöndem (yazgelistir.com)
15.45-16.45 Workflow Foundation 4.0 - Burak Selim Şenyurt (csharpnedir.com) 

Denizli - Pamukkale Üniversitesi Kongre Kültür Merkezi Ana Salon
26 Aralık
11.00-12.30 Silverlight 4.0 - Daron Yöndem (yazgelistir.com)
14.00-15.30 C# 4.0 Yenilikleri - Oğuz Yağmur (csharpnedir.com)
15.45-16.45 Asp.NET 4.0 Yenilikleri - Uğur Umutluoğlu (nedirtv.com)
27 Aralık
11.00-.12.30 Visual Basic 10 Yenilikleri - Daron Yöndem (yazgelistir.com)
14.00-15.30 Asp.NET MVC 2 - Oğuz Yağmur (csharpnedir.com)
15.45-16.45 ASP.NET AJAX 4.0 - Uğur Umutluoğlu (nedirtv.com)

Kayıt için www.inetatr.org adresini ziyaret etmeyi unutmayın!

Bu arada ilk etkinlik duyurumuzda da yer alan "Bir katılımcıya yeni bir beyin verilecektir" :) cümlesi biraz merak uyandırmış. Zaten amacı da buydu söz konusu cümlenin. Merak etmeye devam etmeniz gerekecek fakat emin olun bir katılımcıya çekilişle yeni bir beyin vereceğiz :) Bizde yalan yok :) Ayrıca birçok da sürpriz hediye olacak, benden söylemesi.

Sunday, November 29, 2009 2:43:22 PM (GTB Standard Time, UTC+02:00)  #    Comments [11]   .NET Framework 4.0 | ASP.NET | ASP.NET 4.0 | C# | IIS 7.0 | Seminer | Silverlight 4 | Visual Basic 2010 | Visual Studio 2010 | WCF | WF | Windows 7 | WPF  | 
 Tuesday, March 31, 2009

Uzun bir aradan sonra tekrar güzel bir etkinlik ile karşınızdayız. Bundan yaklaşık iki ay önce sizlere erken duyurusunu yaptığım NEXT HIT etkinliğimizin programını duyurmanın zamanı geldi!

11 Nisan

09.30-10.00    Açılış
10.00-10.45    Windows 7 Deep-Dive  - Mehmet Nuri Çankaya
11.00-13.00    Silverlight 3.0 - Daron Yöndem
14.00-15.30    Bulut Bilişimi ve Azure - Panel
16.00-17.00    PHP On Windows ve Hyper-V - Muammer Benzeş

12 Nisan

10.00-12.00    Sürpriz Oturum - Daron Yöndem
13.00-15.00    ASP.NET 4.0 - Uğur Umutluoğlu
15.15-17.00    WCF 4.0 ve WF 4.0 - Burak Selim Şenyurt

Programımız epey yoğun ve muhteşem yenilikler var. Konularımızın hepsi taze. Eminim ki hemen akıllarda "Süpriz Oturum nedir?" sorusu belirecek. Süpriz oturumumuzu şu anda açıklayamıyoruz. Süprizimizi ancak 11 Nisan günü açıklayabileceğiz.

Katılım için ne yapmam gerek?

Aktivitemiz Yıldız Teknik Üniversitesi, Beşiktaş Kampüsü Oditoryumu'nda gerçekleşecek. Katılım için inetatr.org adresinden kayıt yaptırmanız yeterli. Bir önceki Professional Hit'te olduğu gibi yer sıkıntımız yok, veya size tekrar kayıt olmanız için ikinci mailler atmayacağız. Bu konuda geçen sefer yaşanan sıkıntıları çok net biliyorum ve bu neden özellikle üzerinde durarak bu sıkıntıların tekrar yaşanmayacağı konusunda emin olmanızı istiyorum.

Hepinize 11-12 Nisan'da görüşmek üzere! Unutmadan, güzel hediyelerimiz var :) bu sefer "su" sıkıntımız da yok :)

Dipnot!

Bu aktivite için blogumu okuyan herkesten duyuru anlamında yardım rica ediyorum. "Haberimiz yoktu" diyerek aktivite sonrası mail atan çok kişi oluyor. O nedenle elinizden geldiğince duyuru konusunda yardımcı olabilirseniz herkesin rahatlıkla faydalanmasını sağlayabiliriz. Şimdiden hepinize çok teşekkürler.

Tuesday, March 31, 2009 12:14:45 AM (GTB Standard Time, UTC+02:00)  #    Comments [7]   Silverlight 3.0 | WCF | WF | Windows 7 | WPF | ASP.NET 4.0  | 
 Tuesday, September 23, 2008

Başlık olarak “Reflection” yazdıktan sonra ardına sayfalarca açıklama ve örnek konulabilir. Hatta bu konuda ayrı bir kitap bile yazılabilir. Reflection’ın çok farklı kullanımlar var. Özetleyerek hızlı bir şekilde tanımlamak istersek aslında Reflection bize hakkında bilgi sahibi olmadığınız programatik nesnelerle ilgili çalışma zamanında (run-time) bilgi alabilmemize olanak tanıyan bir metottur. Peki böyle bir şeye neden ihtiyacımız olsun? En basit örnek gerçek zamanlı olarak uygulamalara farklı DLL dosyalarının bağlandığı durumları gösterebiliriz. Böyle bir durumda kaynak konumdaki sınıflar veya metotlar ile ilgili herhangi bir bilgi bulunmaz. Söz konusu bu bilgilerin program çalışırken elde edilerek kullanılması gerekir. Gelin ilk olarak Reflection’ın yapısını ve sistemini tanımak adına tek bir uygulama içerisinde nasıl kullanılabileceğimize göz atalım. Örnek uygulamamızda aşağıdaki şekli ile tanımlanmış bir Urun sınıfı kullanacağız.

[VB]

Public Class Urun

 

    Private PAdi As String

    Public Property Adi() As String

        Get

            Return PAdi

        End Get

        Set(ByVal value As String)

            PAdi = value

        End Set

    End Property

 

    Sub New()

 

    End Sub

 

    Sub New(ByVal adi As String)

        Me.Adi = adi

    End Sub

 

    Function Uyari() As String

        Return "Ürünün adı: " & Me.Adi

    End Function

End Class

[C#]

public class Urun

{

 

    private string PAdi;

    public string Adi

    {

        get { return PAdi; }

        set { PAdi = value; }

    }

 

    public Urun()

    {

 

    }

 

    public Urun(string adi)

    {

        this.Adi = adi;

    }

 

    public string Uyari()

    {

        return "Ürünün adı: " + this.Adi;

    }

}

Uygulamamız içerisinde iki adet düğme yer alacak ve kullanacağımız Windows penceresinde global olarak tanımlanmış bir de Object tipinde değişkenimiz bulunacak.

[VB]

Dim BirUrun As Object   

[C#]

object BirUrun;

Uygulama içerisindeki düğmelerden birine basıldığında global BirUrun değişkenimiz yeni bir Urun değişkenine dönüştürülecek.

[VB]

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    BirUrun = New Urun

End Sub

[C#]

    private void button1_Click_1(object sender, EventArgs e)

    {

        BirUrun = new Urun();

    }

Programımız içerisinde diğer düğmeye basıldığında BirUrun adındaki değişkenimizin Adi özelliğini değiştirerek Uyari adındaki metodunu kullanmak istiyoruz. Fakat Visual Studio içerisinde maalesef ki BirUrun adındaki değişkenle beraber Urun tipine ait Intellisense desteği gelmeyecektir. Aslında bu durumun haklı bir nedeni var. İkinci düğmeye basıldığında BirUrun adındaki değişkenin tipininin Object mi yoksa Urun mü olacağı belli değil. İşte tam da istediğimiz ortamı yaratmış olduk. Kullanacağımız nesnenin tipi belirsiz ve biz ona ait bazı özellikleri kullanmak istiyoruz. Bu durumda ilk olarak ikinci düğmeye basıldığında gerçekten BirUrun değişkeninin tipi Urun mü yoksa değil mi sorusunu kontrol etmemiz lazım.

[VB]

       If TypeOf (BirUrun) Is Urun Then

 

        End If

[C#]

        if ((BirUrun) is Urun)

        {

 

        }

Buraya kadar her şey çok kolay. Bundan sonra eğer IF kontrollerimize olumlu sonuç dönüyorsa ilk olarak gidip nesnenin Adi özelliğini bulmamız ve ona bir değer aktarmamız gerekiyor.

[VB]

BirUrun.GetType.GetProperty("Adi").SetValue(BirUrun, "Daron", Nothing)

[C#]

BirUrun.GetType().GetProperty("Adi").SetValue(BirUrun, "Daron", null);   

Yukarıdaki kod ile elimizdeki nesnenin tipini bilmeden onun Adi adındaki özelliğini (property) yakalayarak değerini Daron olarak değiştiriyoruz. Kodumuzu detaylı olarak adım adım bakacak olursak ilk aşamada nesnenin tipini GetType ile alıyoruz. Sonrasında ise tipini yakaladığımız nesnenin GetProperty ile Adi adındaki özelliğini alarak SetValue ile söz konusu özelliğin değerini değiştiriyoruz. SetValue metodu toplam üç parametre alıyor; bunlardan ilki değer değişikliği yapılacak nesnenin kendisi, ikincisi yeni atanacak olan değer, üçüncüsü ise eğer değiştirilecek olan özellik (property) indeksli ise söz konusu indeks değeri. Bizim örneğimizde indeksli bir özellik olmadığı için bu parametreyi boş geçiyoruz.

Değer atamamızı tamamladığımıza göre bu sefer de sıra geldi BirUrun değişkenimize ait Uyari metodunu çalıştırmaya. Metodumuz bize bir String döndürecek biz de onu doğrudan bir mesaj kutusu ile kullanıcıya göstereceğiz.

[VB]

BirUrun.GetType.InvokeMember("Uyari", Reflection.BindingFlags.InvokeMethod, Nothing, BirUrun, Nothing)

[C#]

BirUrun.GetType().InvokeMember("Uyari", System.Reflection.BindingFlags.InvokeMethod, null, BirUrun, null).ToString();

Reflection kullanarak türü bilinmeyen bir nesnenin bir metodunu çalıştırmak için InvokeMember metodundan faydalanmamız gerekiyor. InvokeMember aslında çok geniş kullanımı olan bir metod, biz şimdilik sadece bir çeşit kullanımına değineceğiz. Örneğimizde InvokeMember bir metod çalıştıracağı için ilk parametresinde çalıştırılacak olan metodun adını ikincisinde BindingFlags.InvokeMethod ile bir Metod çalıştırılacağını belirtiyoruz. Üçüncü parametre bizim şimdilik kullanım alanımız dışında kalan Binding’lerle ilgili, aynı şekilde beşinci parametre de boş bırakılarak geçilecek. Dördüncü parametrede ise hedef nesnemiz olan BirUrun değişkenimizi atayacağız. Böylece metodumuzu da çalıştırmış olduk.

Dinamik DLL Kullanımı

Kabaca Reflection’ın nasıl kullanılabildiğine dair bir örnek yaptıktan sonra artık sıra geldi harici bir DLL dosyasının çalışma anında programımıza ekleyerek içerisindeki yapıları kullanmaya. Bu çeşit bir işlevselliği özellikle gerçek zamanlı DLL derlemesi ile birleştirdiğinizde çok farklı bir dünyaya kapı açmış olacaksınız. Hedef olarak kullanacağımız DLL dosyasını aşağıdaki kodlardan yaratacağız.

[VB]

Public Class Deneme

    Function Metin() As String

        Return "Çalışıyor"

    End Function

End Class

[C#]

    public class Deneme

    {

        string Metin()

        {

            return "Çalışıyor";

        }

Yarattığımız DLL dosyasını uygulamamız ile aynı konuma yerleştirdikten sonra aşağıdaki kod ile DLL’imizi kullanmaya başlayabiliyoruz.

[VB]

Dim BirAssembly As Reflection.Assembly = Reflection.Assembly.LoadFrom("ornek2.dll")

[C#]

System.Reflection.Assembly BirAssembly = System.Reflection.Assembly.LoadFrom("ornek2.dll");

Artık yukarıda tanımladığımız Assembly üzerinden Reflection kullanarak ilerleyebiliriz. İlk olarak Deneme adında sınıfımızdan bir instance almamız gerekecek. Bunun için Deneme tipini bulmamız lazım.

[VB / C#]

BirAssembly.GetModule("Ornek2.dll").GetType("Deneme")

Assembly üzerinden modülümüzü yakalıyor sonra da Deneme adındaki tipinizi buluyoruz. Tabi tipi bulmak yeterli değil, söz konusu tipte bir değişken yaratmamız gerekiyor. Activator sınıfını kullanarak bu tip üzerinden bir instance yaratarak Sinif adında bir değişkene aktaracağız.

[VB]

Dim Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"))   

[C#]

object Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"));

Yarattığımız sınıfın maalesef özellikleri otomatik olarak gelmeyecek. O nedenle Metin adındaki metodumuzu da elle bularak çalıştırmak zorundayız.

[VB]

BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, Nothing)

[C#]

BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, null)

Yine Assembly üzerinden yola çıkarak bu sefer daha da ileri gidiyoruz. Deneme sınıfımızı bulduktan sonra içerisinde Metin adındaki metodumuzu buluyor ve doğrudan Invoke ile söz konusu metodu çalıştırıyoruz. Invoke metodu bizden iki parametre istiyor; bunlardan ilki ana sınıfın kendisi. Bir önceki adımda yakaladığımız sınıfı buraya parametre olarak aktarıyoruz. Diğeri ise bizim kullanmayacağımız Binding parametresi.

Metin metodumuz çalıştırıldığında geriye bir String değişkeni döndürüyor. Bu değişkeni de bir mesaj kutusu ile kullanıcıya göstermek istersek uygulamamızın tam kodunun aşağıdaki şekilde sonlanması gerekiyor.

[VB]

Public Class Form2

 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim BirAssembly As Reflection.Assembly = Reflection.Assembly.LoadFrom("ornek2.dll")

 

        Dim Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"))

        MsgBox(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, Nothing))

    End Sub

End Class

[C#]

namespace CSReflection

{

    public partial class Form2 : Form

    {

        public Form2()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            System.Reflection.Assembly BirAssembly = System.Reflection.Assembly.LoadFrom("ornek2.dll");

 

            object Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"));

            MessageBox.Show(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, null).ToString());

        }

    }

}

Böylece harici bir DLL dosyasını yükleyerek istediğimiz metodu dinamik olarak kullanabildik. Farklı durumlarda isterseniz bir DLL içerisinde tüm metod, sınıf ve özelliklerin listelerini alabilir hatta bunları LINQ sorguları ile tarayabilirsiniz.

[VB]

Dim Metodlar = From Gelenler In BirAssembly.GetModule("Ornek2.dll").GetTypes Where Gelenler.GetMethod("Metin") IsNot Nothing

[C#]

var Metodlar = from Gelenler in BirAssembly.GetModule("Ornek2.dll").GetTypes() where Gelenler.GetMethod("Metin") != null select Gelenler;

Örneğin yukarıdaki LINQ sorgumuz ile harici DLL dosyası içerisinde Metin adında metodu olan tüm sınıfların bir listesini alıyoruz.

Hepinize kolay gelsin.

Tuesday, September 23, 2008 6:51:06 PM (GTB Standard Time, UTC+02:00)  #    Comments [8]   .NET Framework 3.0 | .NET Framework 3.5 | ASP.NET | ASP.NET 3.5 | LINQ | Silverlight 2.0 | Visual Basic 2005 | Visual Basic 2008 | Visual Studio 2005 | Visual Studio 2008 | WCF | WF | WPF  | 
 Saturday, April 19, 2008

.NET Framework 3.0 ile beraber gelen WPF, WCF ve WF sonrasında VS 2008 ve .NET Framework 3.5 derken aslında epey bir yenilik ile karşı karşıya kaldık. Bu konularda Microsoft'un sertifikasyonlarında şu ana kadar yeni bir sistem oluşturulmamıştı, zaten bu konularda sertifikasyon sınavları da yoktu. Oysa artık sizlere güzel haberlerim var; Visual Studio 2008 ile beraber yeni sertifikasyonlar ve sınavlar tam olarak belli oldu.

Visual Studio 2008 MCTS Sertifikasyon Sınavları
Visual Studio 2008 MCTS Sertifikasyon Sınavları

Yukarıdaki görselde de görebileceğiniz üzere toplam altı adet yeni MCTS sertifikasyonu söz konusu. Her biri özellikle .NET Framework 3.5 olarak isimlendirimiş durumda. WPF, WCF ve WF'i görmek gerçekten hoş. Diğer yandan ADO.NET'in ayrı bir sertifikasyon yolu olarak seçilmesi ise gerçekten ilginç. Yukarıdaki sınavlardan 70-502,503 ve 504 şu an açık durumda. Diğerleri önümüzdeki aylarda açılacak.

Visual Studio 2008 MCPD Sertifikasyon Sınavları
Visual Studio 2008 MCPD Sertifikasyon Sınavları

MCPD yolunda da ilginç gelişmeler var. Windows Developer ve EA Developer'ın sonuna .NET Framework'ün sürüm numarası eklenmiş. Böylece hangi sürümün yazılım geliştiricisi olduğunuz doğrudan belli olacak. Web Developer sertifikasyonu ise artık yok, onun yerine ASP.NET Developer 3.5 şeklinde yeni bir sertifikasyon var. Aslında bu çok doğru bir adım olmuş. Çünkü Web Developer adı çok daha geniş kapsamlı, oysa sınavlarda doğal olarak sadece Microsoft ürünleri soruluyor. O nedenle ASP.NET Developer adı bence çok daha uygun olmuş.

Visual Studio 2008'e Upgrade Sertifikasyon Sınavları
Visual Studio 2008'e Upgrade Sertifikasyon Sınavları

Her zamanki gibi eski sertifikalı uzmanlar için "upgrade" sınavları da olacak. Yükseltme sınavları ile ilgili detayları yukarıdan inceleyebilirsiniz. Bu sınavların da daha hiçbiri yayında değil.

Yeni sertifikasyonlar ve sınavlar gerçekten güzel organize edilmiş. Ben heyecanla Expression ürün ailesi ve Silverlight sınavlarını bekliyorum. Umarım WPF, WCF ve WF için beklediğimiz kadar beklemek zorunda kalmayız.

Hepinize kolay gelsin.

Saturday, April 19, 2008 8:19:21 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]   .NET Framework 3.0 | .NET Framework 3.5 | ASP.NET 3.5 | Visual Basic 2008 | Visual Studio 2008 | WCF | WPF | WF  | 
Copyright © 2010 Daron Yöndem. Tüm hakları saklıdır.