Versiyon yönetim sistemi olarak GiT kurulumu ve kullanımı

Uzun süredir şirket ve kişisel projelerimde Subversion'u (SVN) kullanıyorum. Genel anlamda SVN'den oldukça memnundum fakat branching ve merging işlemlerinin sıkıntılı olması ve projeler büyüdükçe önemli ölçüde yavaşlama yaşandığı için SVN'i GiT ile değiştirme ve var olan SVN repository'lerini GiT'e taşıma kararı aldım. GiT'in diğer versiyon yönetim sistemlerinden iyi olduğu noktaları http://whygitisbetterthanx.com/ adresinden detaylıca inceleyebilirsiniz. Benim açımdan önemli olanlarını şu şekilde sıralayabilirim;

  • GiT gerçekten ama gerçekten çok hızlı
  • GiT kaynak depoları disk üzerinde çok az yer kaplıyor
  • GiT ile branching ve merging işlemleri kolay ve hızlı
  • GiT offline olarak kullanılabiliyor
  • GiT distributed (dağıtık) olduğu için her bir geliştiricinin makinesinde proje bütün geçmişi ile birlikte tutulabiliyor. İlk bakışta bunun işlemleri yavaşlattığı ve disk israfı olduğu düşünülebilir fakat GiT'in oldukça etkin algoritmalar kullanması sayesinde bu sorunlar hiç yaşanmıyor. 
GiT komutlarıyla ve genel yapısı ile ilgili detaylı bigiye GiT'in resmi dokümantasyonundan veya ücretsiz Pro GiT  kitabından ulaşabilirsiniz. Bu makalede Linux Ubuntu yüklü bir sunucu üzerinde özel bir GiT repository'sini nasıl oluşturabileceğinizi ve bunu diğer geliştiricilerle nasıl paylaşabileceğinizi anlatmaya çalışacağım. Buradaki komutlar veya işlemler diğer Linux sürümlerinde veya Windows üzerinde cygwin yardımıyla ufak değişiklikler ile çalıştırılabilir.

GiT'i ve GiT üzerinde repository oluşturulması ve yönetilmesi işlemlerini kolaylaştıran gitosis programını kurmak için sırasıyla sudo apt-get install git (veya git-core) ve sudo apt-get install gitosis komutlarını çalıştırmamız gerekiyor. Kurulumlar tamamlandıktan sonra sudo add user --system --shell /bin/sh --gecos ‘git user’ --group --disabled-password --home /home/git komutunu çalıştırdığımızda gitosis'in çalışması için gerekli olan git kullanıcısı sisteme eklenecektir. 

Kendi GiT repository'imizi oluşturmaya başlamadan önce sunucu üzerinde yapmamız gereken son işlem ise gitosis'e GiT projelerini yönetecek geliştiricinin ssh public anahtarını tanıtmak.  İlk olarak GiT repository'lerini yönetecek geliştiricinin makinesi üzerinde ssh-keygen -t rsa komutunu çalıştırmamız ve oluşturulan public anahtarı sunucuya kopyalamamız (/tmp klasörünü tavsiye edilir) gerekiyor. Daha sonra ise sunucu üzerinde sudo -H -u git gitosis-init < /tmp/rsa_key.pub komutunu çalıştırdıktan sonra tanıttığımız ssh public anahtara sahip olan bilgisayar üzerinden bütün GiT repository işlemlerimizi yapabiliriz. (Sunucudan ayrılmadan önce /home/git/repositories/gitosis-admin.git/hooks/post-update dosyasının çalıştırılabilir olduğunu mutlaka kontrol edin)

Geliştirme için kullandığınız bilgisayar Linux ise GiT'i kurmak için kullandığımız komutları kullanarak, eğer Windows veya Mac os x ise http://git-scm.com/ adresinden ilgili programları kullanarak GiT'i kurabilirsiniz. 

Gitosis oldukça akıllı bir şekilde bize GiT kullanarak GiT repository'lerini yönetme imkanı sağlıyor. Bunun için gitosis-admin repository'sini aşağıdaki komutlarla kendi makinemize almamız gerekiyor.

cd /home/mhazer
mkdir gitosis-admin
git clone git@sunucu_ismi:gitosis-admin.git

Sonraki aşamada gitosis-admin klasörü altında gitosis.conf dosyasına aşağıdaki şekilde değiştirip sunucuya göndermemiz gerekiyor.

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = mhazer@Bim247

[repo myRepo]
gitweb = yes
daemon = yes
description = myRepo GiT
owner = Murat HAZER

[group myRepo_group]
members = mhazer@Bim247
writable = myRepo

gitosis.conf dosyasını yukarıdaki şekilde değiştirip kaydettikten sonra gitosis-admin klasörü altında 

git commit -am "yeni myRepo tanımları" 
git push .

komutlarını çalıştırdıktan sonra GiT sunucusu üzerindeki ilk değişikliğimizi de yapmış olacağız. Bu komutlardan sonra hâlâ yeni GiT repository'imiz sunucu üzerinde oluşturulmamış olacak.  Bunun için;

mkdir /home/mhazer/myRepo
cd /home/mhazer/myRepo
git init
git remote add origin git@sunucu_ismi:myRepo.git
git push origin

komutlarını çalıştırmamız gerekiyor. GiT push işleminden sonra sunucu üzerinde /home/git/repositories/myRepo klasöründe GiT repository'si gitosis tarafından oluşturulacak. Bundan sonra /home/mhazer/myRepo klasörü altında oluşturduğunuz veya değiştirdiğiniz dosyaları git commit ve git push komutlarıyla sunucuya gönderip diğer geliştiricilerle paylaşabilirsiniz.

Yeni geliştiricilere myRepo repository'sine erişim hakkı vermek için yeni geliştiricilerin makinelerinde ssh-keygen -t rsa komutunu çalıştırdıktan sonra oluşan ssh public anahtarlarını daha önce gitosis-admin altındaki keydir klasörüne kopyalamamız ve gitosis.conf dosyasını aşağıdaki şekilde değiştirip GiT sunucusuna göndermemiz gerekiyor. (yeni geliştiricinin ssh public anahtarının yeniDev@Bim211 olduğunu farz edersek)

copy yeniDev@Bim211.pub /home/mhazer/gitosis-admin/keydir 

[group myRepo_group]
members = mhazer@Bim247 yeniDev@Bim211
writable = myRepo

cd /home/mhazer/gitosis-admin
git commit -am "yeni geliştirici tanımı"
git push .

SVN repository'lerinin GiT'e taşınması ve online GiT repository sunucularından olan github üzerine ilerleyen günlerde ilerleyen günlerde bahsetmeye çalışacağım.

4 Aralık 2010

Posted In: Gezegen, git, linux, Versiyon Kontrol

Kişisel Hayatta Scrum

Scrum'un en faydalı yönlerinden biri de kolayca özelleştirilerek yazılım geliştirme projelerinin dışında da uygulanabilmesi. (Scrum hakkında daha fazla bilgi için). Bence bunun en önemli sebebi Scrum'un çok fazla kural ve kaidesinin olmaması ve temel prensiplerinin insanların düşünce ve çalışma yapısına uygun olması. Örneğin Maryland üniversitesinden Michael Hicks and Jeffrey S. Foster Scrum'u doktora öğrencilerinin katıldığı akademik araştırma gruplarında uygulamak üzere SCRAM adı altında özelleştirmişler.

Bunun gibi örneklerle karşılaştıkça ve Scrum hakkında daha fazla bilgi edindikçe acaba "Scrum'u kişisel hayatıma uygulayacak şekilde nasıl özelleştirebilirim?" diye düşünmeye başladım. Ufak bir araştırma sonucunda bu düşünceyi bir çok insanın hayatına uyguladığını ve olumlu sonuçlar elde ettiklerini gördüm. Ve Scrum'u aşağıdaki şekilde özelleştirip elimden geldiği kadar günlük hayatıma uygulamaya başladım;
  • İlk adım olarak kısa zamanda yapmam gereken ve 6 aylık zaman içerisinde yapmayı planladıklarımı öncelik sırasına göre yazarak bir liste oluşturdum (Product Backlog). Bu listeye zaman içerisinde yeni şeyler ekliyorum, yapmaktan vazgeçtiklerimi çıkarıyorum veya öncelik sıralarını değiştiriyorum. (Bunun için bir text dosyasını veya bir template olarak bu excel dosyasını kullanabilirsiniz.)
  • İkinci adım olarak her pazar akşamı o hafta içerisinde yapmayı planladıklarımı bu listeden alıp ve herbir iş bitirmem için gereken zamanı tahmin ederek ayrı bir liste oluşturuyorum. (Sprint Backlog). (Yine bunun için basit bir text dosyasını veya bu excel dosyasını kullanabilirsiniz.)
  • Ve her akşam yatmadan önce Sprint Backlog'u inceleyip, bitirdiğim işleri işaretleyerek Scrum'un en faydalı adımı olan Daily Sprint Meeting'i uyguluyorum.
  • Bugün neler yaptım?
  • Neler yapmayı plandıklarıma engel oldu ve nelerle karşılaştım?
  • Yarın neler yapacağım?
Yaklaşık 3-4 haftadır uyguluyorum ve gerçekten faydasını görmeye başladım. Eğer siz de zamanı iyi kullanamadığınızı, işlerin bir türlü yetişmediğini ve kendinize zaman ayıramadığınızı düşünüyorsanız Scrum'u kendize göre özelleştirip uygulayabilirsiniz, eminim ki daha ilk haftadan faydasını görmeye başlayacaksınız.

Kaynaklar:
http://agilesoftwaredevelopment.com/
http://www.cs.umd.edu/~mwh/papers/hicks08scram.html
http://www.agileadvice.com/archives/2006/07/personal_scrum.html

16 Kasım 2008

Posted In: Gezegen, life, scrum

JBoss Seam kitapları ….

Bir önceki yazımda JBoss Seam'in klasik Java Enterprise Development (JEE)'a kazandırdığı çeviklikten, programlama modeline, metodolojisine getirdiği devrim niteliğindeki özelliklerinden bahsetmeye çalıştım. Yeni bir teknoloji öğrenmenin en iyi yolunun o konu hakkında yazılmış kaliteli kitap(lar)ı okumak olduğunu düşünenlerdenim. Bu yazımda da Seam hakkında yazılmış kitapları ve bu kitaplar hakkındaki düşüncelerimi paylaşmaya çalışacağım.


"Seam in Action" Seam'i en kapsamlı şekilde anlatan, okunması rahat ve bol örnekleri olan bir kitap. Manning yayınevinin diğer kitapları gibi bu kitap da oldukça kaliteli ve çok iyi edit edilmiş. Bu kitabı Early Access seviyesinden beri takip ediyorum ve her sayfasından yeni bir şeyler öğrendim diyebilirim. Ayrıca referans kitabı olarak kullanılabilecek şekilde kapsamlı olduğu için başucu kitabı niteliğinde. Fakat kitap Seam'e ilk başlayanlar için biraz ağır gelebilir onun için biraz deneyim kazanıldıktan sonra okunmalı. (5/5)





Apress yayınevinden çıkan "Beginning JBoss Seam" özellikle yeni başlayanlar için çok yararlı diyebilirim. Özellikle Seam'in getirdiği yeniliklerden Bijection ve Web Conversation kavramının temellerini başarılı ve kolay anlaşılır bir şekilde anlatıyor.
(4/5)








Seam'in 1.x versiyonu sürecindeki geliştiricilerinden Michael Juntao Yuan'ın yazarlığını yaptığı "JBoss Seam: Simplicity and Power Beyond Java" bu kitap yine Seam'e yeni başlayanlar için güzel bir kaynak. Şu anda satışta olan versiyon Seam 1.x sürümünü kapsıyor fakat yakın zamanda Seam 2.x'i kapsayan yeni sürümü yayınlanacak.
(4/5)






Apress yayınevinden çıkan diğer bir kitap "Practical JBoss Seam Projects". Henüz bu kitabı okumaya zamanım olmadı fakat okuma listemde üst sıralarda. Okuyan arkadaşlar fikirlerini paylaşabilirlerse çok sevinirim.
(?/5)







Seam'in ve Hibernate'in yaratıcısı olan Gavin King'in yazarlığını yaptığı "Java Persistence with Hibernate"'in son ünitesi Seam'e ayrılmış. Seam'in ortaya çıkış sürecini ve temel özelliklerini yaratıcısının kaleminden okumak isteyenler mutlaka göz atmalılar.
(5/5)

16 Ekim 2008

Posted In: Gezegen, java, seam

Agile Enterprise Java

Enterprise Java programlama ile uğraşmanın en avantajlı yanlarından biri yüksek kaliteli açık kaynak kodlu kütüphane,framework'lerin bulunması. Eminim benim gibi bir çok kişi bu kütüphanelerden yararlanıyordur, artık Hibernate, EclipseLink, iBatis, Spring, Guice, JSF, Struts, Grails, Stripes, ZK, GWT, Wicket, Maven, JUnit vs. olmadan yazılım geliştirmeyi düşününemiyorum. Fakat alternatiflerin çokluğu bazen büyük bir dezavantaja dönüşebiliyor. Bu kütüphaneler arasından geliştirilecek projeye uygun olanları belirlemek ve belirli bir bilgi seviyesine ulaşmak çok kolay bir iş değil. Uygun teknolojileri seçsek bile birbirleriyle uyumlu halde çalıştırmak için çok sayıda konfigurasyon kodu (boilerplate code) ve dosyası yazmamız gerekiyor. Örneğin basit bir Hibernate, Spring, JSF uygulaması yazmak istediğimizde sadece bu üçlüyü bir arada çalıştırmak için yazacağımız konfigurasyon kodları azımsanmayacak derecede çok, ayrıca geliştirme esnasında tekrarlanan kodlar (i.e. faces-config.xml, application-context.xml) sıkıcı olmaya başlıyor ve asıl yoğunlaşmamız gereken programın iş mantığına yeterli zaman ayıramıyoruz.

Bu dezavantajlar son zamanların belki de en popüler konularından biri olan "Agile Software Development" ile tezat oluşturuyordu. Java topluluğunun bu soruna nasıl bir çözüm getireceğini ve Java ile program geliştirenlerin başka programlama platformalarına geçmemesini nasıl engelleyeceğini çok merak ediyordum. Ruby,Rails vb. platformlar topluluktaki ünlü Java Guru'larının bile ilgisini çekiyordu, Craig McClanahan (struts'un yaratıcısı) Java'dan soğuduğunu ve artık Ruby ile ilgileneceği söylüyordu. İşte benim fikrime göre Java bu çıkmazdan iki önemli framework ile çıkış sağladı. Birincisi Hibernate'in yaratıcısı Gavin KING'in fikirlerinden oluşturulan JBoss Seam, diğeri ise Groovy & Grails. Grails ve Groovy üzerine yazmayı sonraya erteleyerek bu yazıda Seam ve getirdiklerini başlıklar halinde kısa kısa anlatmaya çalışacağım.

Enterprise Java programlamayla uğraşan çoğu insanın EJB 2 ve Servlet zamanlarından pek güzel anıları yoktur. Çok sayıda XML konfigurasyon dosyası, EJB 2.0'ları öğrenmenin ve kullanmanın zorluğu, code-compile-deploy-test süresinin uzun ve sıkıcı olması gibi bir sürü sıkıntı. Bu sıkıntıların had safhaya vardığı süreçte ortaya çıkan Spring ve Hibernate vaad ettikleriyle ve başarılarıyla ben de dahil olmak üzere Java ile uğraşanların dikkatini çekti ve çoğu geliştirici kısa sürede Spring,Hibernate ile program geliştirmeye başladı. Spring uzun zamandan beri bilinen Dependency Injection ve Aspet Oriented Programming'e yeni bir bakış açısı getirdi ve Java topluluğunda büyük bir devrim yaptı. Öyle ki Spring ve Hibernate'in bu başarısı örnek alınarak EJB 3.0 standartı çıkartıldı ve EJB ile programlama modeli Plain Old Java Objects (POJO) seviyesine indirgenip EJB ile program geliştirme Spring,Hibernate kadar kolay hale getirildi. Spring 1.x sürümü ve Hibernate çok başarılıydı fakat EJB2.0'da olan sorun burada da vardı; XML karmaşası ve katmanları birbirine bağlamak için yazılan ektra kodlar ve konfigurasyonlar. Bu sorunlar Java 5 ile gelen annotations yardımıyla büyük bir oranda çözüme kavuştu fakat XML dosyaları ve konfigurasyon kodları hala çok fazla emek ve zaman gerektiriyordu.

Spring,Hibernate, EJB3 iş (business) ve veritabanı (database) katmanına kısmi bir çözüm getirdi fakat web arayüzündeki sorunlara uygun çözüm ise hala tam olarak bulunamadı (struts, struts2, Spring MVC, Tapestry, GWT, Grails, Wicket vs.) diyebiliriz. Bu sorunlar için son zamanlardaki en iyi çözümlerden birinin Java Server Faces (JSF) olduğunu düşünüyorum. JSF'nin sorunları ise sadece XML konfigurasyonları ile bitmiyor;
+ Yüksek öğrenme eğrisi (high learning curve)
+ Karmaşık yaşam süreci
+ Bookmark eksikliği, her türlü eylemin HTTP POST üzerinden yapılması vs....
Ama bunların yanında JSF'nin çok iyi düşünülmüş bir yaşam sürecinin olması, toplulukta standart olarak kabul edilmiş olması ve açık kaynak kodlu AJAX kütüphanelerinin olması gibi (icefaces,richfaces) büyük avantajları mevcut.(Açıkcası SEAM olmadan JSF geliştirmek çok can sıkıcı olabiliyor)

JSF for nonbelievers;
1, 2, 3, 4

Enterprise Java'daki Agile Development sorununa çare olmak, JSF ile web geliştirmenin sorunlarını gidermek, Web arayüzü ile İş/Veri katmanı arasındaki sorunları gidermek ve diğer platformlarda olan "Convention over Configuration (Configuration by Exception)" mantığını Java'ya taşımak, Java EE'yi (EJB/POJO/Spring,JSF/GWT/Wicket...,JPA/Hibernate) tek bir çatı altında birleştirmek (unification) üzere geliştirilen JBoss SEAM bence amacını hakkıyla yapıyor. Bütün özelliklerini burada uzun uzun tek bir başlık altında anlatmam imkansız, sadece maddeler halinde SEAM ile neler yapabilabileceğini anlatmaya ve daha detaylı bilgiler alabileceğiniz kaynakları vermeye çalışacağım. Fakat şundan emin olabilirsiniz ki JBoss SEAM ile uğraşmaya başladığınız andan itibaren Enterprise Java ve programlama hakkında bildiklerinizin çoğu şey değişmeye başlayacak ve hiç birşey eskisi gibi olmayacak ....

+ seam-gen; rails ve grails'de bulunan proje oluşturma, nesne ekleme vb. işler için kullanılan komut satırı tabanlı (eclipse entegrasyonu bulunuyor) ant betiği.
+ Configuration by Exception; proje oluşturduğunuz zaman yapmamız gereken konfigurasyonlar yok denecek kadar az. Sadece olağandan farklı bir davranışa ihtiyaç duyduğunuz zaman konfigurasyon yapmamız yeterli oluyor.
+ Bijection; Inversion of Control (IoC) veya Dependency Injection olarak bilinen yöntemin bir üst seviyesi veya dinamik IoC diye adlandırabiliriz. Böylece SEAM nesnelerine sadece bağlı oldukları nesneler verilmekle kalmıyor aynı zamanda SEAM nesneleriyle dinamik olarak SEAM container'ına Seam nesneleri gönderebiliyoruz.
+ Annotations desteği; bu sayede XML kullanımı minimum'a iniyor, tabii ki Seam annotations kullanmayı zorunlu kılmıyor eğer istersek annotations yardımıyla yaptığınız herşeyi XML ile yapabiliyoruz.
+ Aspect Oriented Programming desteği
+ Asenkron haberleşme için Events API'si ve Quartz desteği ("Observer Pattern" uygulayarak nesneleri birbirine daha az bağımlı (loosecoupled) hale getirebiliyoruz)
+ Servlet API'sinde bulunan application, session ve request scope'larına ek olarak Conversation, Page ve Business scopeları.
+ POJO programla modeli; EJB3 veya POJO arasındaki tercih bize kalıyor ayrıca bunlar arasında geçişler çok kolay yapılabiliyor ve EJB3'den POJO programlama modeline geçtiğimizde fonksiyonalite kaybı yaşamıyoruz.
+ Groovy desteği; Seam component'lerini groovy ile yazabiliyoruz
+ Web arayüzünde sadece JSF yerine Wicket, GWT, Tapestry veya Flex kullanabiliyoruz.
+ Rails ve Grails'de kullanılan Active Record'a benzeyen fakat biraz daha farklı olan Home Pattern yardımıyla veri tabanı objelerini yönetebiliyoruz.
+ Çok kolay bir şekilde normal HTML kodu yazarmış gibi PDF, RTF , grafik ve email gibi zengin içerikler oluşturabiliyoruz.
+ Spring ile güçlü entegrasyon; spring ile yazılmış projeler SEAM getirdiği yeniliklerden basit konfigurasyon ile yararlanmaya başlayabiliyor.
+ WebService ve RESTfull URL desteği
+ Basit veya gelişmiş güvenlik ayarları; sayfa, sınıf ve method bazında rol tabanlı güvenlik ayarlamaları yapabiliyoruz
+ jBPM ve Drools desteği
+ Javascript remoting kütüphanesi
+ Sanılanın aksine Seam ile geliştirilen programlar sadece Jboss AS'de çalışmıyor. Piyasada bulunan BEA WebLogic, IBM WebSphere, Oracle Containers for Java EE (OC4J), Apache Tomcat, ve GlassFish gibi sunucularda da sorunsuz şekilde çalışıyor.
+ extended persistence context, declerative transaction management, unified expression language, hibernate validations, page actions, page parameters, bookmarkable links .....

Bunlar Seam'in getirdiği yeniliklerden sadece birkaçı. Bence Seam uzun zamandır Java geliştiricilerinin beklediği bir kütüphane. Seam'i deneyince sizin de bana katılacağınıza ve Seam ile program yazmaktan keyif alacağınıza eminim.

Daha fazla bilgi için;

Seam dökümanları
Seamless JSF Serisi;1, 2, 3
Seam 2.0 hakkında yazılmış en yeni ve iyi kitap;



PS: Bazı teknik terimleri Türkçeye çevirmekten özellikle kaçındım çünkü Türkçe tercümelerin kavramları tam olarak anlatamadığını düşünüyorum.

7 Ekim 2008

Posted In: Gezegen, seam

WP Twitter Auto Publish Powered By : XYZScripts.com