31 Temmuz 2019 Çarşamba

C# DLR (Dynamic Language Runtime) Kullanımı

.NET Framework 4.0 ile birlikte hayatımıza giren DLR'ın (Dynamic Language Runtime) temel olarak amacı static ve dynamic yapıların bir arada çalışabilir olmasını sağlamaktır. Bu özellik .NET projelerinde dinamik dillerdeki kütüphanelerin kullanılmasını sağlıyor.
DLR ayrıca IronPython gibi dinamik programlama dillerinin Common Language Runtime (CLR) ile iletişim kurmasını da sağlamaktadır. Bunun için dynamic anahtar kelimesi kullanılır.



Örneğimizde python dili ile "Hesap Classı" yazılacak olup class içerisine "topla-fark-print" işlerini yapacak olan metotlar dahil edilecektir. C# Console Projesi içerisinde python tarafında yazılmış olan class kullanılacaktır. C# dünyasında "Python" kodunu kullanabilmek için projemize IronPython  kütüphanesini dahil etmemiz gerekmektedir.  

Öncelikle boş bir C# Console Projesi aşağıdaki görseldeki gibi oluşturulur.














Python kodlarını yazabilmemiz için gerekli olan IronPython kütüphanesini   projeye sağ tıklayıp gelen menüden "Manage Nuget Packages" seçeneğinden seçelim.






























static void Main(string[] args)
{
            var source = @"C:\Users\n.esendal\a\dynamicExample.py";
            var engine = Python.CreateEngine();
            var scope = engine.CreateScope();
            var oper = engine.Operations;
            engine.ExecuteFile(source,scope);
            var Hesap = scope.GetVariable("Hesap"); //classı kullandık
            dynamic ins = oper.CreateInstance(Hesap);
            Console.WriteLine(ins.topla(15,20));
            Console.ReadKey();

}

Python uzantısı .py olacak şekilde aşağıdaki kodlarla hazırlanır. Adını "dynamicExample.py" olarak düzenlenir.


class Hesap():
    def __init__(self):
        pass
  
    def topla(self,x,y):
        return (x+y)
  
    def fark(self,x,y):
         return (x-y)



Bu python dosyasını uzantısı .py olacak şekilde bilgisayarıma kaydediyoruz.

Console projesine geldik ve python yolunu işaret edeceğimiz bir değişken tanımladık. Ve IronPython kütüphanesini "using Ironpython.Hosting;" kodunu ekleyerek kullanabiliriz.


Kodumuzu çalıştırırsak 15 ve 20 değerlerinin toplamı olan 35 sonucunu ekranda görürüz. 

























Python kodumuzda değişiklik yaparsak ekrana bilgi yazdıran kodu ekleyelim. (Python ve C# kodlarının son hali)


class Hesap():

 def __init__(self):

  pass  

 def topla(self,x,y):

  return (x+y)  

 def fark(self,x,y):

  return (x-y)  

 def yazdir(self,a):

  print(a)


Main Kodlarında direkt olarak dynamic türünden tanımlanmış olan değişkeni kullanarak son eklediğimiz yazdir metodunu çağıralım.



static void Main(string[] args)

{



            var source = @"C:\Users\n.esendal\a\dynamicExample.py";

            var engine = Python.CreateEngine();

            var scope = engine.CreateScope();

            var oper = engine.Operations;

            engine.ExecuteFile(source,scope);

            var Hesap = scope.GetVariable("Hesap");

            dynamic ins = oper.CreateInstance(Hesap);

            ins.yazdir(ins.fark(5, 15));

            Console.ReadKey();

}
















12 Temmuz 2019 Cuma

.Net CAMP Etkinliği

Kadir Has Üniversitesi'nde Taze .NET Camp Etkinliğine eğitmen olarak katıldım. Öğrencilerimle birlikte aşağıdaki konular üzerine geliştirmeler yaptık.


  • Nesne Yönelimli Programlama (OOP)
  • S.O.L.I.D Yazılım Geliştirme Prensipleri
  • Tasarım Desenleri (Design Patterns)
Etkinlik 5 günlük bir kamptı. Etkinliğin detaylarına ulaşmak için tıklayınız. Eğitim workshop tadında uygulamalı olarak geçti. Öğrenciler anlatılan konuları örnekler üzerinden deneyimleme şansına sahip oldular. Katılımcılar farklı farklı üniversitelerden olup teknik üniversite öğrencilerinin de bulunduğu gayet dinamik ve enerjik bir gruptu. Çok etkileşimli ve keyifli bir eğitim gerçekleştirdik. Yine olsun yine gidelim :)










4 Temmuz 2019 Perşembe

Xamarin İlk Uygulama

Xamarin'i Nasıl entegre edilir makalesini okumak için tıklayınız.

Xamarin'de ilk projemiz oluşturmadan önce anroid ve IOS tabanlı uygulamalar geliştirebileceksiniz. Dolayısıyla her platformda çalışabilen bir uygulamanız olacaktır. IOS çıktısını alıp Mac işletim sistemli bilgisayarlarda bir derlemeniz gerekecektir. (Xcode editoru üzerinde) 

Uygulamadaki farklı ekranlara sırayla bakalım.

Resources içerisinde bulunan layout klasöründe bulunan activiy_main.axml dosyası ekran tasarımını, ekranda bulunmasını istediğimiz kontrolleri taşımaktadır. Yeni bir kontrol eklemek istersek Toolbox üzerinden sürekleyip bırakarak tasarımını yapabiliriz.


activity_main.axml kodları aşağıdaki gibidir.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="0"
android:textSize="50sp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/txtNumber" />
<Button
android:text="Increment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnIncrement" />
<Button
android:text="Decrement"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnDecrement" />
</LinearLayout>

Yukarıdaki kodların tasarımı aşağıdaki gibi olacaktır. 



















Buttonun kodlarına yani MainActivity.cs dosyası kontrollerin yapacakları işleri kodladığımız backend kodlarının barındığı yerdir.

MainActivity.cs kodları


using Android.App;

using Android.OS;

using Android.Support.V7.App;

using Android.Runtime;

using Android.Widget;


namespace App1

{

[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]

public class MainActivity : AppCompatActivity

 {

 TextView txtNumber;

 int number;

protected override void OnCreate(Bundle savedInstanceState)

{

base.OnCreate(savedInstanceState);

// Set our view from the "main" layout resource

 SetContentView(Resource.Layout.activity_main);

txtNumber = FindViewById<TextView>(Resource.Id.txtNumber);

FindViewById<Button>(Resource.Id.btnIncrement).Click += (o, e) => txtNumber.Text = (++number).ToString();

FindViewById<Button>(Resource.Id.btnDecrement).Click += (o, e) => txtNumber.Text = (--number).ToString();

}     

}

}

Uygulamamız hazır olup Increment buttonuna tıklandığında değer artarken, decrement buttonuna tıkladığında değerde azalma görünecektir. Yazmış olduğumuz bu uygulama hem android hem de IOS işletim sistemli uygulamalarda çalışacaktır.  


3 Temmuz 2019 Çarşamba

Xamarin'in Visual Studio Programına Tanımlaması

Merhabalar,

Bilgisayarımızda daha önce kullanmış olduğumuz Visual Studio varsa bunu silmeden "Programs and Features" bölümünden Visual Studio Programına tıklayıp change dememiz durumunda açılan ekranda xamarin eklentisini (Mobile Development with .Net) yükleyebiliriz.


































Yukarıdaki görselden yararlanarak Visual Studio Modify ekranına geçebilirsiniz. Seçimlerimizi yaptıktan sonra en altta yer alan Modify buttonuna tıklayıp kurulumları başlatabiliriz.


Kurulumu yaptığımıza göre artık ilk uygulamamızı oluşturalım.




















Proje template'ni aşağıdaki gibi seçelim. Blank bir uygulama oluşturalım.




















Android için gerekli olan emülatörlerin bilgisayarımıza kurulması gerekmektedir. 

Bunların ayarlamalarını aşağıdaki görselden yapabiliriz.
























Android uygulamasının geliştirilmesi için gerekli SDK, JDK vs. tanımlamalarını yaptıktan sonra artık Xamarin dünyasında projelerimizi geliştirmeye başlayabiliriz.




26 Nisan 2019 Cuma

Decorator Design Pattern Örneği

Decorator tasarım deseni(design pattern) , structural (yapısal) tasarım desenlerinden biridir. Elimizde bulunan class örneğine yani nesneye yeni özellikler eklemek için kullanılır. Nesnenin görevlerini kalıtım kullanmadan artırabileceğimizi gösteren bir yapıdır.


Çalışma zamanında (run time) nesneye eklenen özellikler bu sınıftan tanımlanmış olan başka nesneleri etkilemez.


Ne zaman kullanılır?
Nesneye çalışma anında yeni özellikler eklemek istiyorsak kullanılmaktadır.


Nasıl Kullanılır?
Decorator Tasarım Deseninde projede ihtiyacımız olan sınıflar gruplandırılır ve bu esnada Decorator Sınıflar ve Component Sınıflar kullanılır. Component sınıfları içerisinde Decorator sınıfı bulunur. 

Decorator Design Pattern'ini daha rahat anlayabilmek adına bir örnekle inceleyelim.


1. İlk olarak bir interface oluşturup içerisinde gövdesi olmayan metotlar yazalım.

Account.java classının kodları 

public interface Account
{
  void performTransaction(String transactionType,int accountNumber,int UserId);
  boolean checkAccountNumber();  //hesapno uygun mu kontrolü?
  boolean validateUserId(); //userid uygun mu?
}

2.Projede kullanılacak olan Bank ve Customer classlarını tanımlayalım.

public class Bank 
{
         public void performTransaction(String transactionType, int accountNo) 
         {
         //perform transaction, say transactionType is AccountBalance
         }

}


Concrete Class (Somut Class) interface implements edilerek (uygulanarak) oluşturulur.

public class BasicAccount implements Account
{  
        private Bank bank=new Bank();
        private int userId;
        private int accountNumber;


        public BasicAccount(int accountNumber, int userId)
        {
            this.accountNumber = accountNumber;
            this.userId = userId;
        }



        @Override
  public void performTransaction(String transactionType,int                                  accountNumber,int UserId
        {
             if (checkAccountNumber() && validateUserId()) 
             {
                     bank.performTransaction(transactionType, accountNumber);
             } 
             else 
             {
                    throw new Exception("Invalid user account.");
             }
}

        @Override
  public boolean checkAccountNumber() 
        {
               // using validation module validate the account.
               return true; 
}

        @Override
        public boolean validateUserId() 
        {        
              return false; // or return true if userId is valid

        }
}



Son olarak Customer Class'ını kodlayıp içerisinde main metodu olacak şekilde kurgulayalım ve bu class içerisinde BasicAccount classını barındıran classımızı yazalım.

public class Customer 
{
           private static int customerId = 007;
           private static BasicAccount bank;

           public static void main(String args[]) 
           {
                 bank = new BankProxy(123456,customerId);
                  try 
                  {
                          bank.performTransaction("AccountBalance");
                   } catch (Exception e) {
                           e.printStackTrace();
                   }
           }

}







27 Şubat 2019 Çarşamba

Class ile Struct Farkı


Gerçek hayattaki nesnelerin programlama ortamına taşınması için class yapıları kullanılmaktadır. Bizler class tanımlayarak aslına kendi türümüzü yazmış oluruz. 

Class Nasıl Tamınlanır?
class tanımlarken o class için ihtiyacımız olacak özellikleri ve alanları yazmamız gerekecektir. 

class classAdi
{
     //arabanın özellikleri

     //kurucu metot ya da metotlar 
  
     //metotlar
}

Araba türünden yazmış olduğumuz classın özellikleri aşağıdaki gibidir.















Sınıflar gibi tanımlanan içerisinde özellikler, veriler, yapıcılar içerebile diğer türümüz de structlardır. Struct yapı anlamına gelmektedir.

Struct Nasıl Tanımlanır? 
struct tanımlarken o struct için ihtiyacımız olacak özellikleri ve alanları yazmamız gerekecektir. 

struct structAdi
{
     //arabanın özellikleri

     //kurucu metot ya da metotlar 
  
     //metotlar
}


Zaman bilgisini tutabilmek adına Zaman türünden yazılmış olan struct aşağıdaki gibidir.




















Genel hatlarıyla class ve struct yapısını nasıl oluştururuz bundan bahsetmiş olduk.

İyi Çalışmalar,





24 Şubat 2019 Pazar

Doğum Günü Müziğini Console Projesinde Çaldırma


Happy Birthday müziğini C# üzerinde dinlemenin keyfini yaşayacağız. 

Happy Birthday Müziği Notaları

do-do-re-do-fa-mi
do-do-re-do-sol-fa
do-do-incedo-la-fa-fa-mi-re

do-do-si-sol-la-sol


Notaların harf karşılığı ise aşağıdaki gibidir.








Bu notaların frekansları ise aşağıdaki gibidir. Bir frekansta ses çaldırmak gerekir ki bu frekansları aşağıdaki siteden öğrenebiliriz.

















C harfin karşılık gelen nota Do notası olup Do notası 130.82 ile 1046.5 aralığında frekans değeri alabilmektedir.


Happy Birthday Kodları aşağıdaki gibidir.






Session Nedir? Neden İhtiyacım Var?

HTTP nedir? HTTP, yani Hypertext Transfer Protocol , web tarayıcıları ile web sunucuları arasında veri alışverişini sağlayan internetin t...