tag:blogger.com,1999:blog-102287902024-03-13T18:03:01.614+03:00Murat HAZERrandom thoughts and notes about software developmentMurat Hazerhttp://www.blogger.com/profile/17104195636874266082noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-10228790.post-81830564322763401602010-12-04T22:59:00.000+02:002010-12-04T22:59:08.451+02:00Versiyon yönetim sistemi olarak GiT kurulumu ve kullanımı<div style="text-align: justify;">
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ı <a href="http://whygitisbetterthanx.com/">http://whygitisbetterthanx.com/</a> adresinden detaylıca inceleyebilirsiniz. Benim açımdan önemli olanlarını şu şekilde sıralayabilirim;</div>
<br />
<ul>
<li style="text-align: justify;">GiT gerçekten ama gerçekten çok hızlı</li>
<li style="text-align: justify;">GiT kaynak depoları disk üzerinde çok az yer kaplıyor</li>
<li style="text-align: justify;">GiT ile branching ve merging işlemleri kolay ve hızlı</li>
<li style="text-align: justify;">GiT offline olarak kullanılabiliyor</li>
<li style="text-align: justify;">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. </li>
</ul>
<div style="text-align: justify;">
GiT komutlarıyla ve genel yapısı ile ilgili detaylı bigiye GiT'in <a href="http://git-scm.com/documentation">resmi dokümantasyonundan</a> veya ücretsiz <a href="http://progit.org/">Pro GiT</a> 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.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
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 <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">sudo apt-get install git </span>(veya git-core) ve <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">sudo apt-get install gitosis </span>komutlarını çalıştırmamız gerekiyor. Kurulumlar tamamlandıktan sonra <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: 15px; white-space: pre-wrap;">sudo add user --system --shell /bin/sh --gecos ‘git user’ --group --disabled-password --home /home/git </span>komutunu çalıştırdığımızda gitosis'in çalışması için gerekli olan git kullanıcısı sisteme eklenecektir. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
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 <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">ssh-keygen -t rsa</span> 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 <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">sudo -H -u git gitosis-init < /tmp/rsa_key.pub</span> 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 <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">/home/git/repositories/gitosis-admin.git/hooks/post-update </span>dosyasının çalıştırılabilir olduğunu mutlaka kontrol edin)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
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 <a href="http://git-scm.com/">http://git-scm.com/</a> adresinden ilgili programları kullanarak GiT'i kurabilirsiniz. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
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.</div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br /></span></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">cd /home/mhazer</span></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: 15px; white-space: pre-wrap;">mkdir gitosis-admin</span></div>
<div>
<div style="background-color: transparent; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">git clone git@sunucu_ismi:gitosis-admin.git</span></span></div>
<div style="background-color: transparent; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: 15px; white-space: pre-wrap;"><br /></span></span></div>
<div style="text-align: justify;">
Sonraki aşamada gitosis-admin klasörü altında gitosis.conf dosyasına aşağıdaki şekilde değiştirip sunucuya göndermemiz gerekiyor.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><div style="text-align: justify;">
[gitosis]</div>
</span><div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br /></span></div>
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><div style="text-align: justify;">
[group gitosis-admin]</div>
<div style="text-align: justify;">
writable = gitosis-admin</div>
<div style="text-align: justify;">
members = mhazer@Bim247</div>
</span></div>
<div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br /></span></div>
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><div style="text-align: justify;">
[repo myRepo]</div>
<div style="text-align: justify;">
gitweb = yes</div>
<div style="text-align: justify;">
daemon = yes</div>
<div style="text-align: justify;">
description = myRepo GiT</div>
<div style="text-align: justify;">
owner = Murat HAZER</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
[group myRepo_group]</div>
<div style="text-align: justify;">
members = mhazer@Bim247</div>
<div style="text-align: justify;">
writable = myRepo</div>
</span><div style="text-align: justify;">
<br /></div>
</div>
<div style="text-align: justify;">
gitosis.conf dosyasını yukarıdaki şekilde değiştirip kaydettikten sonra gitosis-admin klasörü altında </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">git commit -am "yeni myRepo tanımları" </span></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">git push .</span></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br /></span></div>
<div style="text-align: justify;">
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;</div>
<div style="text-align: justify;">
<br /></div>
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><div style="text-align: justify;">
mkdir /home/mhazer/myRepo</div>
<div style="text-align: justify;">
cd /home/mhazer/myRepo</div>
<div style="text-align: justify;">
git init</div>
<div style="text-align: justify;">
git remote add origin git@sunucu_ismi:myRepo.git</div>
<div style="text-align: justify;">
git push origin</div>
</span><div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br /></span></div>
<div style="text-align: justify;">
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 <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">/home/mhazer/myRepo </span>klasörü altında oluşturduğunuz veya değiştirdiğiniz dosyaları <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">git commit</span> ve <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">git push</span> komutlarıyla sunucuya gönderip diğer geliştiricilerle paylaşabilirsiniz.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
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)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">copy yeniDev@Bim211.pub /home/mhazer/gitosis-admin/keydir </span></div>
<div style="text-align: justify;">
<br /></div>
<div>
<div style="font-family: 'Courier New', Courier, monospace; text-align: justify;">
[group myRepo_group]</div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">members = mhazer@Bim247 <span class="Apple-style-span" style="color: red;"><b>yeniDev@Bim211</b></span></span></div>
<div style="font-family: 'Courier New', Courier, monospace; text-align: justify;">
writable = myRepo</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">cd /home/mhazer/gitosis-admin</span></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">git commit -am "yeni geliştirici tanımı"</span></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">git push .</span></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br /></span></div>
<div style="text-align: justify;">
SVN repository'lerinin GiT'e taşınması ve online GiT repository sunucularından olan <a href="http://www.github.com/">github</a> üzerine ilerleyen günlerde ilerleyen günlerde bahsetmeye çalışacağım.</div>Murat Hazerhttp://www.blogger.com/profile/17104195636874266082noreply@blogger.com7tag:blogger.com,1999:blog-10228790.post-25796489207676301652008-11-16T20:57:00.004+02:002008-11-16T21:17:14.722+02:00Kişisel Hayatta ScrumScrum'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 <a href="http://mhazer.blogspot.com/2008/10/agile-yazlm-gelitirme-ve-scrum.html">bilgi için</a>). 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 <a href="http://www.cs.umd.edu/%7Emwh/papers/hicks08scram.html">SCRAM</a> adı altında özelleştirmişler.<br /><br />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;<br /><ul><li>İ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 (<span style="font-weight: bold;">Product Backlog</span>). 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 <a href="http://agilesoftwaredevelopment.com/scrum/simple-product-backlog">bu excel dosyasını</a> kullanabilirsiniz.)<br /></li></ul><ul><li>İ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. (<span style="font-weight: bold;">Sprint Backlog</span>). (Yine bunun için basit bir text dosyasını veya <a href="http://agilesoftwaredevelopment.com/scrum/simple-sprint-backlog">bu excel dosyasını </a>kullanabilirsiniz.)<br /></li></ul><ul><li>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.</li></ul><ul style="text-align: center;"><li>Bugün neler yaptım? </li><li>Neler yapmayı plandıklarıma engel oldu ve nelerle karşılaştım?</li><li>Yarın neler yapacağım?</li></ul>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.<br /><br />Kaynaklar:<br /> http://agilesoftwaredevelopment.com/<br /> http://www.cs.umd.edu/~mwh/papers/hicks08scram.html<br /> http://www.agileadvice.com/archives/2006/07/personal_scrum.htmlMurat Hazerhttp://www.blogger.com/profile/17104195636874266082noreply@blogger.com0tag:blogger.com,1999:blog-10228790.post-36029285809307949762008-10-16T23:45:00.018+03:002008-10-17T22:24:13.059+03:00JBoss Seam kitapları ....Bir önceki yazımda JBoss Seam'in klasik Java Enterprise Development (JEE)'a kazandırdığı çeviklikten, programlama modeline, metodolojisine getirdiği <a href="http://solutionsfit.com/blog/2008/09/29/seam-and-web-beans-not-just-evolutionary-revolutionary/">devrim</a> 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.<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfOFu4biSUNsG_KR_SXOFgoa0KOKeG_t2_-R44682iiRjPTi3mdic8XRxnLxhAILBoB_mqga4C5bJ44CUJrGESeRo1s6cw-djIRnImzThyz0boQnXW5CAiApP9UdLEQIa2x_cdeQ/s1600-h/seaminaction.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 147px; height: 147px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfOFu4biSUNsG_KR_SXOFgoa0KOKeG_t2_-R44682iiRjPTi3mdic8XRxnLxhAILBoB_mqga4C5bJ44CUJrGESeRo1s6cw-djIRnImzThyz0boQnXW5CAiApP9UdLEQIa2x_cdeQ/s200/seaminaction.jpg" alt="" id="BLOGGER_PHOTO_ID_5257856244502705570" border="0" /></a>"<a href="http://www.manning.com/dallen/">Seam in Action</a>" 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ı <a href="http://www.manning.com/about/meap.html">Early Access</a> 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)<br /><br /><br /><br /><hr /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeWCGMeZY1wtfNiKb2gA_qISOX0ZxTW6yHk4F3e29-S0U8Rv-nyeVIdOZk2TiTo5P1yyvOQzsR_MeotOSxQqbOGWULQ3GUlQRcVX_Sq7rge0wPIlnGram4N56yHHQTwf_KAF3ZGQ/s1600-h/9781590597927.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeWCGMeZY1wtfNiKb2gA_qISOX0ZxTW6yHk4F3e29-S0U8Rv-nyeVIdOZk2TiTo5P1yyvOQzsR_MeotOSxQqbOGWULQ3GUlQRcVX_Sq7rge0wPIlnGram4N56yHHQTwf_KAF3ZGQ/s200/9781590597927.gif" alt="" id="BLOGGER_PHOTO_ID_5257860882371091058" border="0" /></a>Apress yayınevinden çıkan "<a href="http://www.apress.com/book/view/1590597923">Beginning JBoss Seam</a>" ö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.<br />(4/5)<br /><p><br /></p><p><br /></p><br /><br /><hr /><p></p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdpbupq2y8XIWKEDdY3U1tYWZDOrx82GbtNDcFQPYnUKk6RcXAnUesGklg8XoN9QsOll7Avj2NezxRn6N7JxgZ6p1HsBM8eD7W5dxbPIAvExDrJqTp_Q05x2So-tzKJPSvsyrfaQ/s1600-h/seamyuan.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 157px; height: 157px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdpbupq2y8XIWKEDdY3U1tYWZDOrx82GbtNDcFQPYnUKk6RcXAnUesGklg8XoN9QsOll7Avj2NezxRn6N7JxgZ6p1HsBM8eD7W5dxbPIAvExDrJqTp_Q05x2So-tzKJPSvsyrfaQ/s200/seamyuan.jpg" alt="" id="BLOGGER_PHOTO_ID_5257861654872791154" border="0" /></a><br />Seam'in 1.x versiyonu sürecindeki geliştiricilerinden<span> Michael Juntao Yuan'ın yazarlığını yaptığı </span>"<a href="http://www.amazon.com/Seam-Framework-Experience-Evolution-JBoss/dp/0137129394/ref=pd_bbs_sr_5?ie=UTF8&s=books&qid=1224268151&sr=8-5">JBoss Seam: Simplicity and Power Beyond Java</a>" <span> 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 <a href="http://www.amazon.com/Seam-Framework-Experience-Evolution-JBoss/dp/0137129394/ref=pd_bbs_sr_5?ie=UTF8&s=books&qid=1224268151&sr=8-5">yeni sürümü</a> yayınlanacak.</span><br />(4/5)<br /><p><br /></p><p><br /></p><hr /><p></p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX5y3XZ1GIUWAqSagYGlKtYFVwlHvnfZW3UiEAVjMSwsNFYJw2Plt0Ib13vxdY6PvXC9mB7b_Sk62GJMdCCbsUi2SkRqTirVRsJO4rWvi9bsXAyAn3CXTxHTeAPeD_4tMPk3c1Sg/s1600-h/practical.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX5y3XZ1GIUWAqSagYGlKtYFVwlHvnfZW3UiEAVjMSwsNFYJw2Plt0Ib13vxdY6PvXC9mB7b_Sk62GJMdCCbsUi2SkRqTirVRsJO4rWvi9bsXAyAn3CXTxHTeAPeD_4tMPk3c1Sg/s200/practical.gif" alt="" id="BLOGGER_PHOTO_ID_5257861389591290786" border="0" /></a><br />Apress yayınevinden çıkan diğer bir kitap "<a href="http://www.apress.com/book/view/1590598636">Practical JBoss Seam Projects</a>". Henüz bu kitabı okumaya zamanım olmadı fakat okuma listemde üst sıralarda. Okuyan arkadaşlar fikirlerini paylaşabilirlerse çok sevinirim.<br />(?/5)<br /><p><br /></p><p><br /></p><p><br /></p><hr /><p></p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5kAHqmYAhtGOL3oOK2NkVLfCojALMxV7tVpddyorhwaZEU3kslWQnnf5UxbkVahPI_WzfNw8X0bBrKcm93pjQrJn_1owdI0EqjCHPDmvQ7C_RX3IVJfqzZl-p3RNIAenNKewstA/s1600-h/hibernateinaction.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5kAHqmYAhtGOL3oOK2NkVLfCojALMxV7tVpddyorhwaZEU3kslWQnnf5UxbkVahPI_WzfNw8X0bBrKcm93pjQrJn_1owdI0EqjCHPDmvQ7C_RX3IVJfqzZl-p3RNIAenNKewstA/s200/hibernateinaction.jpg" alt="" id="BLOGGER_PHOTO_ID_5257862096119924738" border="0" /></a><br />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.<br />(5/5)<br /><p></p>Murat Hazerhttp://www.blogger.com/profile/17104195636874266082noreply@blogger.com2tag:blogger.com,1999:blog-10228790.post-39450733894942659852008-10-07T23:44:00.012+03:002008-10-08T00:28:45.449+03:00Agile Enterprise JavaEnterprise 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.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkIUXzqFcdAMKoPOso8WkuxpRmhVU0K0OuloyQAHCEmw1YIWkmKoTtP7V63xIMpe4RwMKZg8gPcCmXyjpAAPJ1iI3inkkX1cYaR1XcC-mxdG4zu_tC6Ynz7oJ5jcZ44cf5f2kJYQ/s1600-h/framewokrs.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkIUXzqFcdAMKoPOso8WkuxpRmhVU0K0OuloyQAHCEmw1YIWkmKoTtP7V63xIMpe4RwMKZg8gPcCmXyjpAAPJ1iI3inkkX1cYaR1XcC-mxdG4zu_tC6Ynz7oJ5jcZ44cf5f2kJYQ/s320/framewokrs.jpg" alt="" id="BLOGGER_PHOTO_ID_5254516640638813026" border="0" /></a><br />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 <a href="http://www.jboss.org/jbosslabs/transcripts/King_JavaOne2007.html">fikirlerinden</a> oluşturulan <a href="http://www.seamframework.org/">JBoss Seam</a>, diğeri ise <a href="http://groovy.codehaus.org/">Groovy </a>& <a href="http://grails.org/">Grails</a>. 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.<br /><br />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 <a href="http://www.springframework.org/">Spring</a> ve <a href="http://www.hibernate.org/">Hibernate</a> 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.<br /><br />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;<br />+ Yüksek öğrenme eğrisi (high learning curve)<br />+ Karmaşık yaşam süreci<br />+ Bookmark eksikliği, her türlü eylemin HTTP POST üzerinden yapılması vs....<br />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)<br /><br />JSF for nonbelievers;<br /><a href="http://www.ibm.com/developerworks/java/library/j-jsf1/index.html?S_TACT=105AGX02&S_CMP=EDU">1</a>, <a href="http://www.ibm.com/developerworks/java/library/j-jsf2/index.html?S_TACT=105AGX02&S_CMP=EDU">2</a>, <a href="http://www.ibm.com/developerworks/java/library/j-jsf3/index.html?S_TACT=105AGX02&S_CMP=EDU">3</a>, <a href="http://www.ibm.com/developerworks/java/library/j-jsf4/index.html?S_TACT=105AGX02&S_CMP=EDU">4</a><br /><br />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 ....<br /><br />+ 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.<br />+ 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.<br />+ 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.<br />+ 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.<br />+ Aspect Oriented Programming desteği<br />+ Asenkron haberleşme için Events API'si ve Quartz desteği ("Observer Pattern" uygulayarak nesneleri birbirine daha az bağımlı (loosecoupled) hale getirebiliyoruz)<br />+ Servlet API'sinde bulunan application, session ve request scope'larına ek olarak Conversation, Page ve Business scopeları.<br />+ 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.<br />+ Groovy desteği; Seam component'lerini groovy ile yazabiliyoruz<br />+ Web arayüzünde sadece JSF yerine Wicket, GWT, Tapestry veya Flex kullanabiliyoruz.<br />+ 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.<br />+ Çok kolay bir şekilde normal HTML kodu yazarmış gibi PDF, RTF , grafik ve email gibi zengin içerikler oluşturabiliyoruz.<br />+ Spring ile güçlü entegrasyon; spring ile yazılmış projeler SEAM getirdiği yeniliklerden basit konfigurasyon ile yararlanmaya başlayabiliyor.<br />+ WebService ve RESTfull URL desteği<br />+ Basit veya gelişmiş güvenlik ayarları; sayfa, sınıf ve method bazında rol tabanlı güvenlik ayarlamaları yapabiliyoruz<br />+ jBPM ve Drools desteği<br />+ Javascript remoting kütüphanesi<br />+ 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.<br />+ extended persistence context, declerative transaction management, unified expression language, hibernate validations, page actions, page parameters, bookmarkable links .....<br /><br />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.<br /><br />Daha fazla bilgi için;<br /><br /><a href="http://www.seamframework.org/Documentation">Seam dökümanları</a><br />Seamless JSF Serisi;<a href="http://www.ibm.com/developerworks/java/library/j-seam1/index.html?S_TACT=105AGX02&S_CMP=EDU">1</a>, <a href="http://www.ibm.com/developerworks/java/library/j-seam2/index.html?S_TACT=105AGX02&S_CMP=EDU">2</a>, <a href="http://www.ibm.com/developerworks/java/library/j-seam3/index.html?S_TACT=105AGX02&S_CMP=EDU">3</a><br />Seam 2.0 hakkında yazılmış en yeni ve iyi kitap;<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.manning.com/dallen/"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px;" src="http://seaminaction.googlecode.com/svn/wiki/images/seaminaction.jpg" alt="" border="0" /></a><br /><br />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.Murat Hazerhttp://www.blogger.com/profile/17104195636874266082noreply@blogger.com3