7 Kasım 2013 Perşembe

Versiyon Kontrol Sistemleri

Versiyon Kontrol Sistemi; bir dosya veya dosyalar üzerinde zaman içerisinde yapılmış tüm değişiklikleri tutan sistemdir.

Versiyon Kontrol Sistemi özellikleri:

  • Dosyanın veya projenin tamamının daha önceki, değişiklik yapılmış/yapılmamış herhangi bir hâline geçme imkânı sağlar
  • Zaman içerisinde yapılan değişikliklere göz atma imkânı sağlar
  • Problem oluşturan veya faydalı olan bir kısım üzerinde kimin değişiklik yaptığını öğrenme imkânı sağlar
Versiyon Kontrol Sistemleri Tipleri
  1. Yerel Versiyon Kontrol Sistemleri
  2. Merkezi Versiyon Kontrol Sistemleri
  3. Dağıtık Versiyon Kontrol Sistemleri
1. Yerel Versiyon Kontrol Sistemleri

En eski versiyon kontrol sistemi yaklaşımıdır. Üzerinde çalışılan proje ve yapılan değişiklikler, kullanıcı makinası üzerindeki veritabanında tutulur. Yerel versiyon kontrol sisteminde yalnızca bir kullanıcı etkin bir şekilde çalışabilir. Metin dosyaları dışındaki dosya türleri üzerinde versiyonlama yapmak oldukça zordur. Sunucu yönetiminde, yalnızca yönetici yapılandırma dosyaları ve script'ler üzerinde sıkça çalıştığından dolayı; bu yaklaşım tercih edilebilir.
En popüler yerel versiyon kontrol sistemi RCS(Revision Kontrol System)'dir.
Yerel Versiyon Kontrol Sistemleri Çalışma Mimarisi

2. Merkezi Versiyon Kontrol Sistemleri

İstemci-sunucu mimarisi şeklinde çalışan versiyonlama yaklaşımıdır. Yerel versiyon kontrol sistemlerinde birden fazla kişinin proje üzerinde etkin çalışabilmesi için ortaya atılmış bir versiyonlama sistemidir. Proje katkıcılarının ortak olarak kullandığı bir veri deposu vardır. Katkıcılar bu depo üzerinden checkout ve commit işlemlerini gerçekleştiriler.
İlk merkezi kontrol sistemi CVS(Concurrent Version Control System)'dir ve en popüler olan SVN(Subversion), CVS baz alınarak gerçekleştirimi yapılan bir versiyon kontrol sistemidir.
Merkezi Versiyon Kontrol Sistemleri Çalışma Mimarisi


3. Dağıtık Versiyon Kontrol Sistemleri

Merkezi versiyon sistemlerinin "katkıcıların offline çalışabilme" ve "deponun zarar görmesi durumunda geri getirilmesi" gibi durumlardaki eksikliklerinden dolayı ortaya atılmış bir versiyonlama sistemidir. Uzak depo sunucusu dışında, proje üzerinde çalışan her makina projenin tamamının kopyasını yerelinde tuttuğundan dolayı; her biri birer depo görevi görmektedir aslında. Böylelikle katkıcılar proje üzerinde değişiklik yapmak istediklerinde veya proje geçmişine göz atmak istediklerinde uzak depo ile iletişime geçmek zorunda değildir. Ayrıca katkıcılar, uzak depoyu hiç işin içine katmadan birbirleri arasında da veri alışverişi yapabilirler.
Dağıtık Versiyon Kontrol Sistemleri Çalışma Mimarisi

Dağıtık versiyonlama sistemi öncülerinden birisi BitKeeper'dır ve son dönemde en yaygın kullanılan örneği olan, Linus Torvalds'ın geliştirdiği Git'in geliştirilmesinde de ilham kaynağı olmuştur. Linux çekirdeği geliştirilmesi sırasındaki versiyonlama işi bir dönem BitKeeper'da yapılıyordu. BitKeeper'ın telif hakkı sahibi Larry McVoy'un bu ürünün artık ücretli olduğunu duyurmasının ardından, Andrew Tridgell BitKeeper protokollerini geriye mühendislik(reverse engineering) yardımıyla çözümlemiş ve Git'in önemli bir temel taşını oluşturmuştur.
Git'in tasarımında Linus 3 temel kriter belirlemiştir:
  1.  Merkezi kontrol sisteminin öncüsü olan CVS'i "ne yapmama" konusunda örnek al ve tasarımı ona göre şekillendir.
  2. BirKeeper benzeri, dağıtık çalışmayı destekleyen iş akışları oluştur.
  3. Bozulma(corruption) anında güçlü koruma önlemleri al.
Git'i denemek isterseniz; temel Git terimlerinin oldukça faydalı açıklamalarının da yer aldığı sayfaya buradan erişebilirsiniz.

Referanslar
  1. http://git-scm.com/book
  2. http://en.wikipedia.org/wiki/Git_%28software%29
  3. http://en.wikipedia.org/wiki/Apache_Subversion#cite_note-26
  4. http://www.pushok.com/software/svn-vscvs.html
  5. http://en.wikipedia.org/wiki/Revision_Control_System
  6. http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/



1 Kasım 2013 Cuma

AngularJS - Directives

Bu yazıda, AngularJS'de directive'lerin ne olduğundan ve hangi durumlarda kullanıldığından bahsedeceğim. Ayrıca directive kullanımı ile ilgili bir html kod bloğu paylaşacağım.

Directive nedir?
AngularJS'de directive'ler, özel(custom) HTML element'leri oluşturmak ve DOM işleme için kullanılmaktadır. Directive'ler, attribute, element, class ve comment gibi DOM elemanlarına özel davranışlar eklememizi sağlar.

Directive ne için kullanılır?
Mevcut bir element'e yeni davranışlar eklemek istediğimizde veya kendi özel bileşenlerimizi(component) oluşturmak için directive'ler kullanılır. Örneğin formunuzda yeni bir girdi elemanı kullanmak istiyorsanız <input> etiketin "type" attribute'u için yeni bir tip tanımlayabilirsiniz. Bu durumda directive kullanılabilir. Bunun dışında; yeni <input> tipi için yeni bir doğrulama(validation)'ı da directive olarak tanımlayabilirsiniz.

Angular ile birlikte gelen ön tanımlı pek çok kullanışlı directive vardır. Her ön tanımlı Angular directive'i ng- şeklinde başlamaktadır. Ancak bunların arka planda gerçekletirimi camelCase olarak yapılmaktadır. Örnegin; gerçekletirimi ngDisabled şeklinde yapılan directive'in HTML kodunda kullanımı ng-disabled şeklinde olmalıdır. Kendi directive'imizi yazarken de bu duruma dikkat etmemiz gerekiyor. Ön tanımlı directive'lerin bir kaçını aşağıdaki örnekte kullanacağız ancak, tüm directive listesine buradan erişebilirsiniz.

<html ng-app>
    
        
 Angular directives test sayfası
 
    
    
        

Kişi listesi

  • {{person.firstname}} {{person.lastname}}
</html>

Kişi listesi

  • {{person.firstname}} {{person.lastname}}
HTML üzerinde oynama yapmak istiyorsanız, benzer kodda Plunker üzerinde burada çalışabilirsiniz.

Kodu inceleyecek olursak; hmtl etiketindeki ng-app directive'i, bu html'in bir Angular uygulaması olduğunu ifade ediyor ve auto bootstrap sağlıyor. ng-init directive'ini kullanarak HTML üzerindeki herhangi bir bileşen'e üzerinde çalışabileceği verileri gönderebiliyoruz. ng-repeat="person in persons"; "persons" dizisindeki her bir elemanı "person" nesnesi olarak temsil edeceği anlamına geliyor(for each diyebiliriz). ng-model ile checkbox'ın model ismini belirtiyoruz. ng-disabled directive'i ise; ilgili elemanın etkin olup olmayacağını belirlemek için kullanılıyor. ng-disabled içerisindeki değeri de checkbox'daki model'in değerine göre belirleniyor.

31 Ekim 2013 Perşembe

AngularJS - Data Binding

Data binding, AngularJS'in öne çıkan özelliklerinden biridir. İki tür data binding yaklaşımı vardır:

  1. One-way data binding: Klasik template(ek markup ve directive'leri içeren, derlenmemiş HTML) sistemlerinde bu data binding türü kullanılmaktadır. Modelinizde yaptığınız bir değişikliğin sayfanızda da görünür kılınması için; gerekli senkronizasyon kodunu kendiniz yazmanız gerekir.
  2. Two-way data binding: Angular template sistemlerinde bu data binding türü kullanılmaktadır. Sayfanızda veya modelinizden herhangi birinde yaptığınız değişiklik diğerinde görünür olacaktır. Ekstra kod yazmadan Angular bu işi bizim yerimize nasıl yapıyor peki? Bunu yapmak için, modelinizin bir önceki değerini saklıyor ve modelde herhangi bir değişiklik yapıldığında, ilgili nesnenin change event'ini çağırıyor. Bu karşılaştırma basit bir "dirty-checking"dir ve bu işi Angular bizim için yürütüyor.
Data binding örneği:
Ön koşullar:
1. http://angularjs.org/'dan AngularJS'in minified sürümünü indirin.
2. İndirdiğiniz .js dosyası ile aynı dizinde bir html dosyası oluşturun ve örnekteki içeriği bu html sayfasına kopyalayıp test edin.
<html ng-app>
    
        
        Angular Test Page
        
    
    
        

Selam {{ name }}

</html>
Tabi tüm bu adımlarla uğraşmadan, html üzerinde oynama yapmak istiyorsanız, benzer kodda Plunker üzerinde burada çalışabilirsiniz.
Kodu inceleyecek olursak; hmtl etiketindeki ng-app directive'i, bu html'in bir Angular uygulaması olduğunu ifade ediyor ve auto bootstrap sağlıyor. Angular directive'leri ile ilgili daha sonra ayrıntılı yazacağım. ng-model="name" ise; ilgili input nesnesine property olarak "name" ismini veriyor. Artık bu model ismini(name) html içerisinde kullanan her nesne, bu model üzerinde yapılacak değişiklikten haberdar olacaktır. {{name}} kullanımı ile, "name" ismindeki model içeriğini html sayfamıza gömüyoruz. Angular'da data-binding {{model ismi}} şeklinde yapılır.
Aynı işi jQuery kullanarak yapmak için; html içerisinde bir script bloğu içerisinde, input nesnesine eriştikten sonra ona bir listener eklememiz gerekecekti. Angular kullanarak bu işi ne kadar kolay ve okunaklı bir şekilde yapıldığını test edebilirsiniz.

30 Ekim 2013 Çarşamba

AngularJS

AngularJS, Google tarafından sürdürülen, açık kaynak kodlu (MIT license) bir Javascript framework'üdür. AngularJS'in amacı; model–view–controller (MVC) mimarisine sahip web uygulamarının gerçekleştirim ve test sürecini daha kolay hale getirmektir. Diğer Javascript framework'lerini HTML sayfaları içerisinde kullanırken, uygulama büyüdükçe, zamanla sayfa içerisinde kullanılan JS kodlarının okunması,anlaşılması ve bakımı oldukça zorlaşır. Angular bu noktada çok ciddi bir kolaylık sağlıyor. Oldukça aktif bir topluluğu ve harika bir dökümantasyonu var. Javascript ile uğraşıyorsanız, kesinlikle bir göz atın derim.

16 Ekim 2013 Çarşamba

Plunker

Web uygulamaları geliştirme sürecinde, birlikte çalıştığın ekiple karşılaştığın bir problemi veya bir senaryoyu paylaşmak istediğinde; çoğu zaman topluluğa uzunca bir mail yazarsın, kod bloğunu vs. o mailde anlatmaya çalışırsın ve fikir alışverişi yapacak kişinin de paylaştığın o kodu alıp, senin senaryonu oluşturma zahmetine katlanmasını bekleyebilirsin. Bu tarz durumlarda en mantıklı olanı; yardım istediğin kişilere test ortamını hazır bir şekilde sunmak ve bu süreci olabildiğince kısaltmaktır. Bu durumda Plunker aracını kullanabilirsiniz, oldukça işinize yarayacağını düşünüyorum. Plunker'ın öne çıkan bazı özellikleri:

  • Özelleştirilebilir syntax editor
  • Code linting: Kod yazdığın esnada hata kontrolü
  • jquery, bootstrap, knockout, google-maps gibi pek çok paketi anında kodunuzda kullanıma hazır hale getirebilirsiniz
  • MIT lisanına sahip, açık kaynak kodlu
  • Github'a entegre bir uygulama şeklinde kullanılabiliyor

10 Ekim 2013 Perşembe

Yaşıyorum!

Çok uzun süredir bir şeyler yazmadığımın farkındayım. Bir süre ara verdikten sonra, bir şeyler yazmak daha da zorlaşıyor doğrusu.
Blog'dan uzak kaldığım sürede pek çok şey oldu aslında. Yaklaşık bir sene eğitim için Londra'daydım. Daha sonra askerlik, Huawei R&D'de işe başladım, son olarak da Haziran ayında evlendim :)
İtiraf etmek gerekirse; bu sırada herhangi bir özgür yazılım projesi veya kişisel bir proje ile ilgili bir çalışma yapmadım. Şirkette yazılım mühendisi olarak çalıştığımdan dolayı; elbette çeşitli JAVA teknolojileri, ORACLE, veritabanı vs. ile ilgili işler yapıyorum ama bunlar standart işler olduğu için; teknik olarak bahsedebileceğim özel bir şey olduğunu düşünmedim. Hele ki yanında seni teşvik edecek bir Necdet Hoca'n olmayınca, bu işi hepten boşlayabiliyorsun gerçekten :)
Bu kadar miskinlik yeter bence. Henüz ne ile ilgili bir şeyler yapacağıma karar vermedim ama ne olursa olsun, önemli, paylaşmaya değer gördüğüm tecrübelerimi buraya yazacağım.