Monthly Archives: Eylül 2013

Sürüm Yönetimi

Yararlı Git Numaraları

Belki günlük hayatta sıkca kullanmayabilirsiniz, ancak yarın birgün ufak tefek git hookları yazmak isterseniz bu küçük numaralar işinize yarayacaktır.

Indekslenen eklenen(A)/kopyalanan(C)/değiştirilen(M) dosyaların listesini almak için:

$ git diff --name-only --cached --diff-filter=ACM

Kafadaki commit kimliğini almak için:

$ git rev-parse HEAD

Geçerli branch ismini almak için:

$ git rev-parse --abbrev-ref HEAD

Belirli bir dosyanın, belirli bir commitdeki içeriğini görüntülemek için:

$ git show --source 7e112e7728f7af8727ce2aaa29ee027474dcca91:file.php

Indekse eklenen dosyanın, indeksdeki içeriğini görüntülemek için:

$ git show --source :file.php
Sürüm Yönetimi

Git Farklarını Yan Yana Karşılaştırmak

Geliştirme yaptığınız projede değişiklik yaptığınız program blokları belirli bir büyüklüğün üstünde olduğunda git diff, zaman zaman değişimi alakasız bir bloğun içinde yapılmışcasına gösterir.

Pek çok IDE side by side karşılaştırmayı destekler. Ancak sizde benim gibi vim veya türevi text editörlerini kullanıyorsanız vimdiff ile yanyana karşılaştırma işlemini rahatlıkla yapabilirsiniz.

Kullanım:

 $ git difftool --tool=vimdiff 

Ekran Görüntüsü :
Screenshot from 2013-09-19 15:05:34

Programa Dilleri ve Çatıları

Python Decoratorleri ve Observer Uygulaması

Bugün bir python projesi için yazdığım kütüphanenin uzak sunucuyla yaptığı hareketleri loglaması için yeni bir geliştirme yapmam gerekti. Malum, henüz dilin acemisi olduğum için ilk olarak observer tasarım deseninin pythondaki uygulama şekillerini incelemeye koyuldum. Yapmak istediğim şey, tam olarak djangodaki signal modülünün benzeri küçük basit bir kütüphane bulup implemente etmek veya hızlıca yazmaktı.

Okuyup uyguladıkca python a hayranlığım bir kat daha artmaya başladı. Daha önce PHPİst etkinliğine gelen arkadaşlar hatırlayacaktır. Orada da observer tasarım desenini anlatırken loglama örneği üzeirnden gitmiştik. Observer tasarım deseninin PHP uyarlamasını kısaca hatırlayalım.

ObservableAbstract :

ObserverInterface :

LoggerObserver:

...ve tabi ObserverInterface den türeyen yeni observer sınıfları, bu sınıfları ObservableAbstract ailesine bağlayan kodlar...

Peki pythonda ne yaptık ? Aynı işi yapmak için yine php tarafında olduğu gibi bir observable sınıfı ve gözlemcilerimizi atamak için kullanacğımız bir adet dekoratör yazdık.

eventmanager/__init__.py:

class ObservableAbstract(object):
	def __init__(self):
		self._observers = {}

	def attach(event_name, listener):
		self._observers.setdefault(event_name, []).append(listener)

	def _trigger_event(event_name, context):
		if event_name in self._observers:
			context.update({'event_name': event_name})
			for observer in self._observers.get(event_name):
				observer(context)

eventmanager/decorators.py:

from eventmanager import ObservableAbstract

def listener(instance, event_name):
	def wrap_func(func):
		if isinstance(isinstance, ObservableAbstract):
			instance.attach(event_name, func)

Observable ailesinden gelen olay tetiklemelerini dinlemek için, gözlemci olarak kullanacağınız fonksiyonların başına listener() dekoratörünü eklemeniz yeterli.

@listener(instance=MyApiInstance, event_name=AFTER_REQUEST)
def log_handler(context):
	with open('transaction.log', 'w+') as file:
		file.write(str(context))	
Sürüm Yönetimi

Git Kullanımında Geliştirme Yapılan Dalların Doğru Güncellenmesi ve Önemi

Kalabalık geliştirici gruplarının çalıştığı projelerde sürüm paketlerinin düzgün oluşturulabilmesi için çıkılan dalların doğru güncellenmesi oldukca önemlidir. Genellikle böyle yapılarda geliştiricilerin bu konuyla ilgili en çok yaşadığı ikilem, pull ve rebase komutlarının kullanımıdır. Cevabı aslında çok net olan bu ikilemi ortadan kaldırmak için öneclikle pull ve rebase komutlarını yakından tanıyalım.

1. Git Pull ve Rebase Komutlarını Tanıyalım:

pull ve rebase komutları, genel olarak uzak depoda gerçekleşen değişikliklerin yerel depodaki değişikliklerle geçerli yerel dalda farklı metodolojilerle birleştirilmesi için kullanılırlar.

1.1. Git Pull:

Git pull, uzak depoda gerçekleşen değişiklikleri yerel depoda ilgili dalda birleştirmek için kullanılır. Birleştirme işlemi, commit sırasına göre gerçekleştirileceğinden birleştirme sonrasında sürüm günlüğünde iki commit arasında uzak depodan gelen farklı geliştiricilerin yaptığı commitleri görmeniz olasıdır.

Pull işleminden önce sürüm günlüğü

commit e572de2efb567fc71c4b1514c7187f5d07eac6c2
Author: Ali Veli <ali.veli@gmail.com>
Date:   Wed Jul 17 02:13:50 2013 -0430

    ISSUE-1 - Soap adapter'ı için son committe eksik kalan fonksiyonlar eklendi.

    Change-Id: Iee83313671916bfb1e13fbc8f5b71408be202749

commit 89cc1c898ff01ff945c3423d22ed143dda52e475
Author: Ali Veli <ali.veli@gmail.com>
Date:   Tue Jul 16 09:38:35 2013 -0430

    ISSUE-1 - required function sendRequest implemented for Soap Adapter

    Change-Id: Id4f7ffdaef1f905b029d4818e1e07d1d5bc60bf1

Pull işleminden sonra sürüm günlüğü

commit e572de2efb567fc71c4b1514c7187f5d07eac6c2
Author: Ali Veli <ali.veli@gmail.com>
Date:   Wed Jul 17 02:13:50 2013 -0430

    ISSUE-1 - Soap adapter'ı için son committe eksik kalan fonksiyonlar eklendi.

    Change-Id: Iee83313671916bfb1e13fbc8f5b71408be202749

commit 70c6059f32b5569ef32875d38da564d7a6d128ed
Author: Ibrahim Gunduz <ibrahim.gunduz@markafoni.com>
Date:   Tue Jul 16 16:54:20 2013 +0300

    ISSUE-2 - Event listener communication kutuphanesiyle iliskilendirilmesi-devam ediyor.

commit 87f166fa0460db40a240200dd093196f2195bb88
Author: Ibrahim Gunduz <ibrahim.gunduz@markafoni.com>
Date:   Tue Jul 16 13:13:26 2013 +0300

    ISSUE-2 - EventManager soyutlamasiyle ilgili gelistirme yapildi.

commit 89cc1c898ff01ff945c3423d22ed143dda52e475
Author: Ali Veli <ali.veli@gmail.com>
Date:   Tue Jul 16 09:38:35 2013 -0430

    ISSUE-1 - required function sendRequest implemented for Soap Adapter

    Change-Id: Id4f7ffdaef1f905b029d4818e1e07d1d5bc60bf1

Git pull, aynı zamanda git fetch + git merge komutlarının birlikte kullanımıyla gerçekleşen işlem için bir kısayol komutudur.

git fetch+git merge ile uzakdaki değişikliklerin alınması :

$ git fetch origin
...
$ git merge origin/master

git pull ile uzakdaki değişikliklerin alınması :

$ git pull origin master

1.2. Git Rebase:

Git rebase komutu, uzak depodaki daldan ayrıldığınız noktadan itibaren yaptığınız tüm değişiklikleri daha sonra kullanmak üzere kenara alır, uzak depodaki değişiklikleri yerel depodaki dalda birleştirir ve sizin yaptığınız değişiklikleri dalın en üstüne taşır.

Biraz önce git pull komutunda kullandığımız örneği git rebase ile gerçekleştirelim.

Yerel depomuzdaki dalda gerçekleştirdiğimiz değişiklikler :

commit e572de2efb567fc71c4b1514c7187f5d07eac6c2
Author: Ali Veli <ali.veli@gmail.com>
Date:   Wed Jul 17 02:13:50 2013 -0430

    ISSUE-1 - Soap adapter'ı için son committe eksik kalan fonksiyonlar eklendi.

    Change-Id: Iee83313671916bfb1e13fbc8f5b71408be202749

commit 89cc1c898ff01ff945c3423d22ed143dda52e475
Author: Ali Veli <ali.veli@gmail.com>
Date:   Tue Jul 16 09:38:35 2013 -0430

    ISSUE-1 - required function sendRequest implemented for Soap Adapter

    Change-Id: Id4f7ffdaef1f905b029d4818e1e07d1d5bc60bf1

Rebase işleminden sonra gelen değişikliklerle yerel deponun son durumu:

commit e572de2efb567fc71c4b1514c7187f5d07eac6c2
Author: Ali Veli <ali.veli@gmail.com>
Date:   Wed Jul 17 02:13:50 2013 -0430

    ISSUE-1 - Soap adapter'ı için son committe eksik kalan fonksiyonlar eklendi.

    Change-Id: Iee83313671916bfb1e13fbc8f5b71408be202749

commit 89cc1c898ff01ff945c3423d22ed143dda52e475
Author: Ali Veli <ali.veli@gmail.com>
Date:   Tue Jul 16 09:38:35 2013 -0430

    ISSUE-1 - required function sendRequest implemented for Soap Adapter

    Change-Id: Id4f7ffdaef1f905b029d4818e1e07d1d5bc60bf1

commit 70c6059f32b5569ef32875d38da564d7a6d128ed
Author: Ibrahim Gunduz <ibrahim.gunduz@markafoni.com>
Date:   Tue Jul 16 16:54:20 2013 +0300

    ISSUE-2 - Event listener communication kutuphanesiyle iliskilendirilmesi-devam ediyor.

commit 87f166fa0460db40a240200dd093196f2195bb88
Author: Ibrahim Gunduz <ibrahim.gunduz@markafoni.com>
Date:   Tue Jul 16 13:13:26 2013 +0300

    ISSUE-2 - EventManager soyutlamasiyle ilgili gelistirme yapildi.

Rebase işleminden sonra yerel depoda Ali Veli kullanıcısının değişikliklerinin bazı commitlerin tarihi daha eski olduğu halde en üst sıraya taşınması dikkatinizi çekti mi ?

2. Pull ve Rebase Hangi Durumlarda Kullanılmalı ?

pull komutu uzaktan gelen değişiklikleri, zamana bağlı olarak yerel dalla birleştirir. Dolayısıyla geliştirme yaptığınız dalları pull ile güncellemek, birden fazla commit e sahip olan işlerde araya giren farklı işlerin commitleri nedeniyle sürüm günlüğünün okunmasını güçleştirecektir. Bu nedenle git pull (veya fetch+merge) komutunu yalnızca ana dalı güncellemek için kullanmak daha doğru bir yaklaşım olacaktır.

git pull ile gerçekleşen güncelleme :

commit e572de2efb567fc71c4b1514c7187f5d07eac6c2
Author: Ali Veli <ali.veli@gmail.com>
Date:   Wed Jul 17 02:13:50 2013 -0430

    ISSUE-1 - Soap adapter'ı için son committe eksik kalan fonksiyonlar eklendi.

    Change-Id: Iee83313671916bfb1e13fbc8f5b71408be202749

commit 70c6059f32b5569ef32875d38da564d7a6d128ed
Author: Ibrahim Gunduz <ibrahim.gunduz@markafoni.com>
Date:   Tue Jul 16 16:54:20 2013 +0300

    ISSUE-2 - Event listener communication kutuphanesiyle iliskilendirilmesi-devam ediyor.

commit 87f166fa0460db40a240200dd093196f2195bb88
Author: Ibrahim Gunduz <ibrahim.gunduz@markafoni.com>
Date:   Tue Jul 16 13:13:26 2013 +0300

    ISSUE-2 - EventManager soyutlamasiyle ilgili gelistirme yapildi.

commit 89cc1c898ff01ff945c3423d22ed143dda52e475
Author: Ali Veli <ali.veli@gmail.com>
Date:   Tue Jul 16 09:38:35 2013 -0430

    ISSUE-1 - required function sendRequest implemented for Soap Adapter

    Change-Id: Id4f7ffdaef1f905b029d4818e1e07d1d5bc60bf1

Geliştirme yaptığınız dalları güncel tutmak içinse rebase komutu kullanmak, geliştirme yaptığınız commitleri bir arada tutabilmek adına çok daha doğru bir yaklaşım olacaktır. Böylelikle sürüm günlüğünde belirli bir işle ilgili tüm değişiklikleri bir arada tutarak günlüğün okunmasını kolaylaştırmış olursunuz.

rebase komutu ile geliştirme dalının güncellenmesi :

commit e572de2efb567fc71c4b1514c7187f5d07eac6c2
Author: Ali Veli <ali.veli@gmail.com>
Date:   Wed Jul 17 02:13:50 2013 -0430

    ISSUE-1 - Soap adapter'ı için son committe eksik kalan fonksiyonlar eklendi.

    Change-Id: Iee83313671916bfb1e13fbc8f5b71408be202749

commit 89cc1c898ff01ff945c3423d22ed143dda52e475
Author: Ali Veli <ali.veli@gmail.com>
Date:   Tue Jul 16 09:38:35 2013 -0430

    ISSUE-1 - required function sendRequest implemented for Soap Adapter

    Change-Id: Id4f7ffdaef1f905b029d4818e1e07d1d5bc60bf1

commit 70c6059f32b5569ef32875d38da564d7a6d128ed
Author: Ibrahim Gunduz <ibrahim.gunduz@markafoni.com>
Date:   Tue Jul 16 16:54:20 2013 +0300

    ISSUE-2 - Event listener communication kutuphanesiyle iliskilendirilmesi-devam ediyor.

commit 87f166fa0460db40a240200dd093196f2195bb88
Author: Ibrahim Gunduz <ibrahim.gunduz@markafoni.com>
Date:   Tue Jul 16 13:13:26 2013 +0300

    ISSUE-2 - EventManager soyutlamasiyle ilgili gelistirme yapildi.