Kitap – Head First Object-Oriented Analysis & Design

25 Ara

Nesneye Dayalı Programlama (Object Oriented Programming) ile geliştirilen programların analizi ve tasarımı konusunda yol gösterici bir rehberdir. Yazdığınız programların kafa karıştırıcı ve sıkıcı hale dönüşmemesi için nasıl tasarımlar yapılması konusunda örnekler verir.

Kitapta bir taraftan da tasarım desenleri konusunda bilgiler verilmektedir. yazdığımız kodlarda tasarım desenlerinin kullanılması gerektiği konusu vurgulanmaktadır.

Kitaptaki örnekler Java programlama dilinde yazılmıştır. Bu nedenle kitaptan daha iyi faydalanmak için Java programlama diline aşina olmak gerekmektedir.

Kitap O’REILLY yayınlarından çıkmıştır. Orjinal sayfasına buradan ulaşabilirsiniz. Satın almak için amazon üzerinden sipariş verebilirsiniz.

Task Parallel Library TLP C#

24 Ara

İşlemci dünyasının gelişimi ve değişimi, işlemcilerin çekirdek sayısı transistör sayısını ne zaman yakalar diye düşündürüyor insana. Bilgisayarlarımızın işlemcileri geliştirkçe programlarımızın daha da hızlandığı aşikardır. Ancak programların hızlanması sadece bilgisayarların fiziksel özellikleriyle alakalı bir durum değildir. Diğer taraftan yazılımların da işlemcileri iyi kullanabilecek şekilde hazırlanmaları gerekmektedir.

İşlemci çekirdekleri arttıkça uzun sürebilecek işlemleri parçalar halinde bölüştürerek işlemcileri tam kapasitede kullanabilmek işimizi daha çok hızlandıracaka ve kolaylaştıracaktır.

Bu yazımızda da paralel işlemlerin alt yapısını oluşturan Task Parallel Library (TLP) konusunu incelemeye çalışacağız.

TPL kavramını .Net Framework 4.0 ile tanımaya başlıyoruz. Bu yapı, işlemlerin paralel bir şekilde yürütülmesini sağlamak amacıyla oluşturulmuştur. TLP’ye ait tipler System.Threading ve System.Threading.Tasks isim alanında bulunmaktadır.

TLP altyapısı aslında süreçlere, görevler olarak bakar ve tıpki insanların görevleri yütebildiği mantıkla organize edilebilmektedir.

  • Yeni görevler oluşturmak, bu görevleri başlatmak, duraklatmak ve sonlandırmak mümkündür.
  • Bir görevin bittiği yerden başka bir görevi başlatmak mümkündür.
  • Başarıyla yerine getirilen görevlerin sonucunda değerler döndürmek mümkündür.
  • Bir görev kendi içinde alt görevler başlatabilir.
  • Görevler aynı veya farklı thread’ler tarafından yerine getirilebilirler.

Task(görev), başarılı bir şeklide tamamlanmasını istediğimiz bir süreçtir. Süreç T1 zamanında başlar ve T2 zamanında sonlanır.

Bu sürecin tamamlanma süresi, işlemcimizin özelliklerine ve kod yazım biçimlerine göre değişebilir.

Thread(ler) ise görevleri yerine getiren işçilerdir. Bu işçiler bir veya birden fazla olabilir. Her görev ayrı bir thread tarafından yürütülmek zorunda değildir. Bir thread birden fazla görevi yerine getirebilir. Ya da bir görev birden fazla thread(multithread) yardımıyla yapılabilmektedir.

Paralel programlama her problemin çözümü için hızlı bir çözüm olmayabilir. Paralel işlemler ile çözüme birden fazla thread yardımıyla yaklaşmış oluyoruz. Örneğin bir apartmanın en üst katına 2 tuğla çıkarmak için bört kişi çağırıp 1 tuğlayı iki kişiye tutturup çıkartmak mantıklı değildir ve maliyetlidir. Bu işi bir kişi gayet seri bir şeklide yapabilir ve uzucdur. Ancak 100 tuğla olduğunda bir kişi  bu işte çok yorulacağından maliyet fazladır. Bu durumda 100 tuğla için dört kişi çağırmak mantıklıdır ve maliyetleri azaltır.

Yazılımsal olarak gelişmiş bir örnek üzerinden giderek sonuca bakacak olursak, paralel ve seri işlemlerin farkını daha rahat görebiliriz.

Bu örneğimizin senaryosu istatistiksel bir formül olan Standart Normal Dağılım’ın matematiksel formülünü döngü yardımıyla farklı sürelerde hesaplatmaya çalışalım. Burada seçilen formülün Standat Normal Dağılım olmasının hiç bir önemi yoktur. İsterseniz x=2y formülünü de kullanabilirsiniz. Ben işlemler uzun sürmesi açısından bu formülü seçtim.

Formülümüz şu şekildedir:

Bu formülü for döngüsünü 10, 100, 1.000, 10.000, 30.000, … şeklinde farklı değerlere kadar seri ve paralel şeklide hesaplattırıp sonucu bir tabloda incelemeye çalışalım.

İşlemi öncelikler seri işlemler mantığı ile yaparak sonuca bakacak olursak, bir işlemin bitmeden diğerinin başlamadığını göreceğiz. Döngümüz işlemi 10000’e kadar 30 kez yapacak.

For döngüsü adımsal işlem gerçekleştirmekte ve  her döngüyü aynı thread gerçekleştirmektedir. Tüm işlemler 1 numaralı thread tarafından gerçekleştirilmektedir.

Şimdi de işlemi paralel olarak gerçekleştirelim. Aynı şeklide işlemi 10000’e kadar 30 kez yapacak.

Paralel işlemlerde kullandığımız tip System.Threading.Tasks.Parallel olacaktır. Paralel for kullanımı şeklideki gibi basitçe ifade edilmektedir ancak arka planda Task tipleri hemen görevleri bölüşürler.

Paralel işlemi incelediğimizde işlemin 4 farklı thread tarafından yapıldığını ve sürenin seri işlemlerden daha uzun sürdüğünü görmekteyiz. Ancak döngü sayısını arttırdığımızda şu şeklide bir tablo karşımıza çıkacaktır.

Döngü sayısı arttıkça paralel işlemlerin adımsal işlemlerden daha kısa sürede gerçekleştiğini görmekteyiz. Örneğimizde kritik sınır 30.000 olarak görünmektedir.

Senaryonun grafiksel ifadesinden de durumu bu şeklide inceleyebiliriz. Bu sistemi test ederken kullandığım laptop biraz eski olduğundan işlemler uzun sürdü. Intel Centrino Core 2 işlemci üzerinde sonuçları bu şeklide aldım. Farklı işlemcilerde sonuçları test edebilirsiniz. Yorumlara yazabilirseniz karşılaştırma yapabiliriz. Ancak benim deneme yaptığım işlemci modelinden kimsede kalmadığından emin gibiyim. Nesli tükendi artık.

Bir sonraki yazıda görüşmek dileğiyle.

C# Action ve Action ön tanımlı delege türü

22 Ara

Delegeler ile ilgili yazımızda delegeleri tanımlamayı ve kullanmayı incelemiştik. Delegelerin metodları temsil ettiğini ve hangi tür metodların temsil edileceğini ise delegeler oluşturulurken belirlendiğini görmüştük.

Ardından Func<T> ile ilgili yazımızda önceden tanımlanmış delege türü olan Func<T> delege türlerini incelemiştik. Func<T> ile temsil edilen metodların mutlaka bir değer döndürdüğünü belirtimştik.

Bu yazımızda ise delegelerin bir başka özel ve ön tanımlı türü olan Action ve Action<T> delege türünü incelemeye çalışacağız.

Action ve Action<T> delege türleri .Net framework 3.5 ile gelen önceden tanımlanmış bir delege türüdür. Action<T> delege türleri Func<T> delegelerinin aksine hiçbir değer döndürmeyen metodları temsil etmektedir. Action delege türü hiçbir parametre almayan ve değer döndürmeyen metodları temsil eder. Adından da anlaşılacağı üzere bir fonksiyonu değil bir eylemi(action) temsil etmektedirler.

Action<T> delegeleri birden fazla parametre alabilecek metodları da temsil edebilecek şekilde tasarlanmıştır.

Action
Action <T>
Action <T1,T2 >
Action <T1,T2,T3>
Action <T1,T2,…,TN>

Her bir T, metodların alacağı parametrelerin tiplerini belirtmektedir. Func<T> gibi Action<T> kullandığımızda delege tanımlamamıza gerek kalmamaktadır.

Action delegelerinin lambda ifadeleriyle göterimini şu şekilde yapabiliriz:

Lambda ifadelerini kullanmadan metod çağırarak action metod kullanımını şu şeklide kullanabiliriz.

Action delege tipinin kullanımına genelde LINQ ifadeleri ile çalışırken rastlarız. LINQ extension metodlarından Action delege parametre alanlara, uygun metodu parametre olarak gönderebiliriz. Buna bir örnek olarak kişilerin bulunduğu bir listedeki isimlerin önüne “Mr” ön ekini getirerek yazdırmayı deneyebiliriz.

List<T> tipinin ForEach extension metodu, string bir parametre alan metodları temsil etmektedir. Listedeki isimlere tek tek “Mr” ön ekinin nasıl getirildiğini bu şekilde görebilmekteyiz.

Bir sonraki yazıda tekrar görüşmek üzere…

C# Func önceden tanımlanmış delege türü

20 Ara

Delegeler ile ilgili yazımızda delege tanımlamayı ve kullanmayı incelemiştik. Delegelerin metodları temsil ettiğini ve hangi tür metodların temsil edeceğini ise delegeler oluşturulurken belirlendiğini görmüştük.

Bu yazımızda .Net Framework 3.5 ile gelen ön tanımlı delege olan Func<T> tipini incelemeye çalışacağız.

Func<T> önceden tanımlanmış olan ve T tipinde değerler döndüren metodları temsil eden bir delegedir. Func<T> tipi birden fazla parametre ile beslenebilecek şekilde hazırlanmış bir tiptir. Yani bir veya birden fazla parametre alabilecek metodları temsil eden önceden tanımlanmış bir delege türüdür. Func<T> kullandığımızda delege tanımlamamıza gerek kalmamaktadır.

Func<T>
Func<T,Tresult>
Func<T1,T2,Tresult>
Func<T1,T2,…T3,Tresult>

Her bir T metodun alacağı parametre tipini ve TResult ise temsil edilen metodun dönüş tipipni temsil etmektedir.

Örnek: Func<int,string> delegesi int türünden parametre alan ve string türünden değer döndüren metodları temsil eder.

Yukarıdaki örnekte pageurl adında bir temsilciye, desteklediği formda, yani string dönüş tipinde olan ve int tipinde tek bir parametre alan bir metod atanmıştır.

Func<T> ifadesine, daha önceden oluşturulmuş bir metodu temsil ettrebildiğimiz gibi lambda expression ile de daha önceden tanımlanmamış bir metodu da temsil ettirebiliriz.

Yukarıdaki örneği aşağıdaki gibi lambda ifadesi ile de kısa şekilde yazabiliriz.

Func kavramına kısa bir tanımdan sonra biraz da bu kavrama neden ihtiyaç duyulduğundan bahsedelim. Nerede kolaylık sağlamaktadır.

.Net framework ortamına LINQ sorgularının kullanımı sırasında büyük kolaylık sağlamaktadır. Bir listenin içerisindeki verilerin süzülmesi veya verileriüzerinde değişik işlemler yaparken önceden belirlenmiş Func<T> tipindeki temsilcilere göre sorgular yaptırabiliriz. .Net işlerimizi kolaylaştırmak için Func<T> delegelerini oluşturmuş ve kullanımımıza sunmuştur.

Yukarıda List<int> listesi içerisindeki sayılardan 30’dan küçük olanları seçmek için listenin where extension metodunu kullanıyoruz. Where extension metodu Func<int,bool> şeklinde bir delegeyi parametre olarak almaktadır. Select adında oluşturduğumuz metod da int türünde parametre almakta ve bool türünden sonuç döndürmektedir.

Bu ifadenin lambda ifadesi şu şekilde olmaktadır.

Kendi oluşturduğumuz sınıflarımızda da Func<T> delegelerini kullanarak pratik işlemler yaptırabiliriz.

Bu yazımızda:

  • Func<T> delegesinin ne olduğunu
  • Nasıl kullanıldığını
  • Nerelerde karşımıza çıkabileceğini

Görmeye çalıştık.

Tekrar görüşmek dileğiyle…

C# events (olaylar) kavramı

18 Ara

Bir önceki yazımızda delegates (delegeler veya temsilciler) kavramından bahsetmiştik. Delegelerin amaçlarından birinin de event(olay) yakalyıcı metodları temsil eden tipler olduğunu vurgulamıştık.

Olaylar .Net platformunun ileri konularından biri olup ilk anda anlaşılması biraz karmasık gelebilir. Olayları anlamanın yolu da delegeleri anlamaktan geçer. Delegeler konusu anlaşılmışsa olayların (events) anlaşılması da çok basit bir hale gelecektir.

C# ortamında bir event tanımlamak şu şeklidedir:

<erişim belirleyici> event <delege tipi> <event adı>;

Public event QueryEventHandler QueryExecuted;

Public: erişim belirleyicisi. Public veya private olabilir.

QueryEventHandler: delege tipi.

QueryExecuted: event adı.

Event kullanımı .Net platformunda genellikle form tabanlı windows uygulamalarında, silverlight uygulamalarında, network uygulamalarında çok yaygındır. Örneğin bir windows forms uygulamasında bir butona tıklandığında Buton sınıfının Click adındaki event’ı için bir metod oluşturulur ve bu metod içerisine tıklama işlemi sonrası yürütülecek kodları yazabiliriz.

Biz bu yazımızda örnek olarak bir önceki c# delegeler yazımızdaki örneğin aynısını event kullanarak yapacağız. Bu sayede event ve delegate arasındaki bağıntıyı kurmak daha da kolaylaşacak.

Öncelikle bir önceki uygulamamızda ki büyük resme bakarak başlayabiliriz.

Client tarafında oluturduğumuz bir metodu Queryoperation tipinin ExecuteQuery metoduna parametre olarak göndermiştik. ExecuteQuery metodu da bizim gönderdiğimiz metod formunda bir delegeyi parametre aldığı için uygulamamız hiç sorunsuz çalışmıştı.

Bu sefer Queroperation sınıfımıza QueryExecuted adında bir event tanımlayarak bu event’a client tarafındaki bir metodu abone edeceğiz. Sorgu işlemi gerçekleştiğinde abone ettiğimiz metod çalışacaktır.

QueryOperation sınıfının artık QueryExecuted adında bir event’ı var. Bu event, void geri dönüş tipinde tipinde olan ve QueryEventArgs tipinde parametreler alan metodları yakalamakla sorumludur.

Client tarafında olayın nasıl gerçekleşeceğine bakacak olursak.

QueryOperation nesnesinin QueryExecuted event’ına client tarafında oluşturduğumuz, delegemize uygun olan onExecuted metodumuzu abone ediyoruz.

Bir metodun bir event’a abone edilmesi (+=) şeklinde yapılırken aboneliğin sona erdirilmesi ise (-=) şeklinde yapılır.

operation.QueryExecuted-=onExecuted;

şeklinde aboneliği sonlandırabiliriz. Bu sonlandırmadan sonra onExecuted metodu tetiklenmez.

Eğer event’a bir metod abone etmezsek QueryOperation sınıfının ExecuteQuery metodu içerisindeki if(QueryExecuted!=null) şartı false olarak değerlendirilir ve bizim client tarafındaki metodumuz çalıştırılmaz.

Bu yazımızda:

  • C# dilinde event kavramını
  • Event tanımlamasının nasıl yapıldığını
  • Event ve delegate arasındaki ilşkiyi
  • Event’a metod aboneliğini ve aboneliğin sonlandırılmasından
bahsettik.

Tekrar görüşmek dileğiyle…

C# delegate (Delege veya Temsilci) Kavramı

16 Ara

Bu yazımızda C# programlama dilini öğreneneler için bazen işkence haline dönüşen ve bir .Net kavramı olan delegeler üzerinde duracağız. Delegeler, adından da anlaşılacağı üzere temsilcidirler. Temsil ettikleri kavram ise metodlardır.

Delegelerin hangi tür değerleri dönrüren ve ne tür parametre alan metodları temsil ettiklerini tanımlanırken belirleriz.

Bir delegenin tanımlanış şekli aşağıdaki gibidir.

Örnek delege:

<erişim belirleyici> delegate <geri dönüş tipi> <delege adı>(<parametreler>)

 public delegate int Hesaplayici(int a,int b);

Örnek delegemizin tanımlanış biçimindeki ifadelerin ne anlama geldiklerini ise sırayla şu şeklide ifade edebiliriz.

Public: delegenin erişim belirleyicisi. Public veya private olabilir.

int: metodun geri dönüş tipi. Yani geri dönüş tipi int olan metodları temsil ediyor.

Hesaplayici: delegenin adı.

int a, int b: delegemiz, int tipinde iki adet parametre alan metodları temsil ediyor.

Yukarıda tanımlanan Hesaplayici adlı delege, int tipinde değerler döndüren ve int tipinde iki adet parametre alan metodları temsil etmektedir.

Burada aslında kafaları kurcalayan soru işareti, delegelerin bize sağladığı kolaylığın ne olacağı noktasında yatmaktadır.

Delegelerin temel olarak bize iki noktada büyük faydası vardır. Bunlar:

  • Event kullandığımız programlamada olayların yakalanacağı metodları belirlemek.
  • Çalışma zamanında (runtime) hangi tür metodların kullanılabileceğini belirlemek.

Delegelerin daha iyi anlaşılması açısında bu yazımızdaki örnek uygulamızda delegelerin çalışma zamanında (runtime), belirlediğimiz bir metodun temsil edilmesini canlandırmaya çalışacağız.

Senaryo şu şeklide olacaktır: Sql sorgularını icra etmekle sorumlu bir sınıfın metoduna, sorgu sonrasında bizim gönderdiğimiz bir görevi(metodu) yerine getirmesini sağlamaya .alışacağız. Yani bir metoda parametre olarak bir metod göndereceğiz. Sorgu sonrasında bizim gönderdiğimiz metod çalışacak.

Öncelikle query sonuçlarını yakalayan bir delege olan QueryResultHandler adında bir delege tanımlayacağız.

public delegate void QueryResultHandler(QueryEventArgs args);

Query sonuçlarını bildiren QueryEventArgs adında bir tipimiz mevcut. Bu tipte parametre alan ve void yani geriye birşey döndürmeyen metodların temsilcisini tanımlamış olduk.

public class QueryEventArgs
{
     public bool Executed { get; set; }
}

QueryEventArgs tipi aslında sadece sorgu sonucunda işlemin gerçekleşip gerçekleşmediğini argüman olarak bize veren bir tiptir.

Sql sorgu işlemlerini gerçekleştirecek olan tipimizi de QueryOperation adında bir tip olarak belirleyelim.


public class QueryOperation
{
     public void ExecuteQuery(string queryText, QueryResultHandler executed)
     {
        // execute query
        // ...
        // ..
        // .

        QueryEventArgs result =new QueryEventArgs();
        result.Executed = true;

        executed(result);
     }
}

Sınıfımız temsili bir sınıf olduğu için yani sql sorgusu gerçekleştirmiş gibi bir varsayım aptığımız bir sınıf olduğu için içeriğinde sadece ExecuteQuery adında bir metod tanımladık. Bu metod sorgu işlemini gerçekleştirip QueryEventArgs tipinde bir sonuç oluşturmakta ve parametre olarak gönderilen metodu çalışıtrmaktadır.

Şimdi client tarafında nasıl bir operasyon gerçekleştireceğimize gelelim.

static void Main(string[] args)
{
    QueryOperation operation = new QueryOperation();
    operation.ExecuteQuery("select * form Table", onExecuted);
}

public static void onExecuted(QueryEventArgs args)
{
    Console.WriteLine("query executed!");
}

Yaptığımız işlem sadece QueryOperation tipinde oluşturduğumuz bir nesneye sql sorgu parametresini ve sorgu sonrasında bizim client tarafında tanımladığımız bir metodun parametre olarak göndermektir. Bizim burada tanımladığımız onExecuted metodu tam da delegemizin (QueryResultHandler) formuna uyan bir yapıdadır.

Burada farkına varmamız gerekn bir nokta da delegelerin metod pointer(işaretçi) olduğudur. QueryOperation tipinin ExecuteQuery metodu bir temsilciyi parametre alırken, çalıştırılan bir metoddur. Yani temsilciler metodları işaret ederler.

Programı çalıştırdığımızda aşağıdaki gibi bir sonuç karşımıza çıkacaktır.

Bu örnekte:

  • delege tanımlamanın nasıl yapıldığını
  • çalışma zamanında (runtime) belirlenen bir metodun temsilcisinin çalıştırılmasını
  • delegelerinin birer metod pointer(işaretçi) olduğunu

anlamaya çalıştık.

Bir sonraki yazıda görüşmek dileğiyle…

Kitap – The C# Programming Language

30 Kas

C# dilini nereden ve nasıl öğrenirim diyenlere “bu kitaptan” diyebilirim. Çünkü kitabın yazarlarından biri de C# dilinin baş mimarı diyebileceğimiz Anders Hejlsberg’dir. Her işi ustasından öğrenmek gerektiğine inananlardan olduğum için bu kitabı edinerek hemen okumaya başladım. Kitapta C# dilinin bütün özellikleri derinlemesine anlatılmış ve yerinde örneklendirmeler yapılarak anlaşılırlık daha da güçlendirilmiştir. Bu anlamda tam bir başucu kitabı demek yanlış olmaz.

Kitaptaki örnek kodlara baktığınızda bile bu kitabın usta kalemlerden çıktığını anlayabiliyorsunuz. C# dilini anlatan kitapların çok azında bulabileceğiniz bir anlatım derinliği ve genişliği sunmaktadır. Kitap, özünde C# dilini kavratmakta ve dilin neden önemli olduğunu okuyucuya ikna edici bir dil ile anlatmaktadır.

Kitabın C# 4.0 versiyonunu okuma fırsatı buldum ve merak ettiğim konuları açıp okumaya devam ediyorum. Herkese tavsiye ederim. Kitabın yazarlarına da böyle bir eseri bizlerle buluşturduğu için teşekkür ederim.

Tekrar görüşmek dileğiyle.

Git Push Error – Marge the remote changes

29 Kas

Github üzerinde repository oluştururken karşılaşabileceğiniz sorunlardan biri “Push” komutu kullanılırken alacağınız  hata mesajıdır.  Benim bu sorunu yaşamama sebep olan durum, Github üzerinde repository oluştururken “Initialize this repository with a README” seçeneğini işaretleyerek README dosyasının oluşturulması neticesinde uzak depoda(repository) oluşan değişikliklerdi.

Git Initialize

Bilgisayarım üzerinden local depo(repository) dosyalarımı “Push” komutu ile göndermeye çalıştığımda aşağıdaki hata ile karşılaştım.

Git Push Error

Bu hatanın sebebinin uzak depodaki(repository) değişiklikleri local depo üzerindekilerle birleştirmemek olduğunu “Merge the remote changes (e.g. ‘git pull’)” mesajından anlayabiliyoruz. Yani uzak depoda olan bitenden local depo haberdar değildir. Yukarıda belirttiğim gibi uzak depo oluşturulurken README dosyası da oluşturulmuştu.

Aslında takım halinde çalışılan bir projede çalıştığımızı varsayacak olursak, takım arkadaşımızın uzak depoya attığı projeji biz tarafımıza alıp değişiklikleri birleştirmeden depoya gönderemeyiz.

Bu gibi durumlarda uzak depodaki değişiklikleri çekmek için “Pull” komutunu kullanmalıyız. Bu durumda değişikliklerin local tarafa çekilmesi, birleştirme işlemini de gerektirecek çünkü local tarafta da bir değişklik olmuş olacak.

Uzak depodaki değişiklikleri çekmek için şu komutu kullanmalıyız:

git pull origin master

Git Pull Command

“Pull” komutunun ardından “Push” komutunun düzgün bir şekilde çalıştığını görmekteyiz. Çünkü “Pull” komutu uzak depodaki değişiklikleri çekerek local depo ile birleştirdi. Böylece sorunumuz çözülmüş oldu.

Tekrar görüşmek dileğiyle.

GIT Nedir? ve Windows için GIT

28 Kas

GIT bir versiyon kontrol sistemidir. Yazılımcılar için geliştirme sürecinde önemli bir yeri olan versiyonlama mekanizmasını otomatikleştirebilen bir sistemdir. GIT, kökeni Linux tabanlı bir topluluk olsa da Windows tarafındaki gönüllüler sayesinde Windows dünyasına da kazandırılmıştır. Windows için GIT geliştirmek amacıyla MSys/MinGW projeleri baz alınmıştır.

Git for Windows(MinGW) projesi temel düzeyde Git kullanıcılarına hitap ederken, msysGit projesi geliştiriciler, testçiler, bakım ve dağıtım ekibi tarafına hitap etmektedir.

Hem MinGW hem de msysGit projelerinin depolama yeri Web tabanlı GitHub platformudur.

Ben kendi projelerimi versiyonlamak için msysGit uygulamasını kullanıyorum. msysGit programına buradan ulaşabilirsiniz. Programı indirip kurmak gayet basit olduğu için kurulum anlatımı yapmadım.

Programın kullanım arayüzü olarak komut ve GUI destekli olmak üzere iki seçeneği bulunmaktadır.

Git grafiksel arayüzü (Git GUI) şu şekildedir:

Git GUI

Git komut arayüz görüntüsü (Git Bash) şu şeklidedir:

Git Bash

Git Bash için bazı komutlar şu şeklidedir:

clear: Komut ekrarnını temizler.

mkdir: Bulunduğunuz dizin içerisine yeni bir dizin oluşturur.

ls: Bulunduğunuz dizindeki dosya ve dizinleri listeler.

cd: Dizin değiştirir.

git –version: Sistemde kurulu olan Git versiyonunu verir.

git init: Bulunduğu dizine “.git” adında yeni bir git deposu(repository) oluşturur.

git add: Çalıştığınız dizindeki dosyalarda oluşan değişiklikleri indekse ekler.

git status: Çalıştığınız dizindeki dosyaların indeksteki durumunu gösterir.

git commit: İndekse yazılmış tüm değişiklikleri alır ve bu değişiklikleri işaret eden yeni bir icra(commit) nesnesi oluşturur ve bu icra nesnesine şube ayarlar.

git remote: uzak depoların takma adlarını listeler.

git remote add: projenize yeni bir uzak depo ekler.

git push: Değiştirilmiş tüm yerel nesneleri uzaktaki depoda bulunan şubelere atar.

Yukarıdaki komutlar ile bir depo(repository) oluşturup uzaktaki bir depoya gönderme işlemi yapılabilmektedir. Bu komutlardan başka birçok komut vardır ancak şimdilik yeterli olacak komutlar elimizdekilerdir.

Örnek Uygulama

Geliştiriciler olarak projelerimizi versiyonlar halinde uzak bir depoda tutmak istediğimizde aklımıza ilk gelecek olan GitHub platformudur. Git de zaten bu platforma veri gönderebilmektedir.

Bu örnek uygulamamızda bir Visual Studio projemizi msysGit yardımıyla GitHub üzerinde oluşturduğumuz bir depoya(repository) göndermeye çalışalım.

Git tarafında ön bilgiye sahip olduğumuza göre bir de GitHub tarafında neler yapmamız gerektiğine göz atalım. Öncelikle GitHub web sayfasında bir hesap oluşturmamız gerekmektedir. Hesap oluşturduktan sonra GitHub web sayfasında “Create New Repository” veya “New Repository” şeklinde oluşturulmuş link yardımıyla yeni depo oluşturma sayfasına yönlendiriliriz.

GitHub New Repository

Yukarıdaki resimde de görüldüğü üzere TestConsoleApplication adında bir repository oluşturuyoruz.

Dikkat: Github üzerindeki repository içerisine veri gönderebilmek için bir güvenlik seviyesi ayarı olan SSH Key oluşturup sitedeki Account Settings bölümüne kaydetmemiz gerekmektedir. Bu işlemi Github burada bizim için anlatmış. Bu ayarı yapmadığımızda gönderdiğimiz veriyi almayacaktır.

Bu güvenlik ayarını da başarılı bir şeklide yaptıktan sonra Visual Studio ortamında oluşturulmuş “TestConsoleApplication” adında bir c# projesini Github depomuza gönderelim.

Projemizi D sürücüsü üzerinde TestConsoleApplication adında bir dizinde tutacağız ve Git üzerinden bu dizinde işlem yapacağız.

Git Commands 1,2,3

KOMUT:1 D sürücümüzde projemizin bulundupu TestConsoleApplication dizinine girer.

KOMUT:2 Dizin içerisine .git adında bir yerel depo oluşturur. Oluşturulan bu dizin (.git) gizli olabilir. Göremezsseniz klasör seçeneklerinden  “gizli dosya ve klasörleri göster” seçeneğini seçip bakabilirsiniz.

KOMUT:3 Dosya değişikliklerini indekse ekler.

Git Commands 4

KOMUT:4 Yeni bir icra(commit) nesnesi oluşturur.

Git Commands 5,6

KOMUT:5 Projeye git@github.com:bayramucuncu/TestConsoleApplication.git depo yolunu ekler.

KOMUT:6 Değiştirilmiş tüm yerel nesneleri uzak depo adersine gönderir.

Gönderdiğimiz projeye web sitesi üzerinden göz atacak olursak şu şeklide bir manzara karşımıza çıkacaktır.

Github Repository

Bu test projesi Github üzerinde oluşturulmuş genel bir projedir. Herkese açık bir şekilde düzenlenmiştir.

Tekrar görüşmek dileğiyle.

Math Operations (Matematiksel) Kata .Net

19 Kas

Matematiksel işlemler katası

Bu katanın amacı, değişkenleri ve sabitleri belli olan matematiksel formülleri çözebilen bir uygulama geliştirmek.

Örnekler / Examples
————————————————-

1 + 1 => constant + constant
x + y => variable + variable
x + y -1 => variable + variable + constant
(x+y) / 2 =>(variable + variable) / constant
(x*y)-(x/3)=>(variable + variable) – (variable/3)

Microsoft .Net ortamında geliştirilmiş ve Test Driven Development kuralları uygulanmış olan bir kod katasıdır.

Kaynak kodlara github hesabımdan ulaşabilirsiniz.

Not: Bu katada geliştirilen Math Expression örneği, “The C# Programming Language” kitabındaki bir bölümden esinlenerek yapılmıştır.

Tekrar görüşmek dileğiyle.