tag:blogger.com,1999:blog-20376091240179108042024-02-07T16:04:04.998+03:00Deniz AcayTechnology Chronicles | Teknoloji GünlükleriUnknownnoreply@blogger.comBlogger18125tag:blogger.com,1999:blog-2037609124017910804.post-7299453594286482812013-03-01T20:32:00.000+02:002013-03-01T20:32:26.115+02:00GNU Octave ile Vektör İşlemleri<h2>Niye GNU Octave?</h2>Mühendislik uygulamalarında matematiksel işlem yazılımlarından en popüler olanları; <a href="http://www.mathworks.com/products/matlab/">MATLAB</a>, <a href="http://www.maplesoft.com/products/maple/">Maple</a> ve <a href="http://www.wolfram.com/mathematica/">Mathematica</a>'dır diyebiliriz. Ancak bu üç aracın popülerlikten başka bir ortak yanı daha var: üçü de ücretli ve oldukça pahalı. Bu kadar açık kaynak yazılım varken, bu araçlara açık kaynak bir alternatif olmaması tabii ki mümkün değil. <a href="http://www.scilab.org/">Scilab</a> ve <a href="http://www.sagemath.org/">Sage</a> gibi başka alternatifler olsa da, benim favorim bir GNU altprojesi olan <a href="http://www.gnu.org/software/octave/">Octave</a> (yani 'oktav').<br />
GNU Octave'in kurulumu oldukça basit olduğu için o kısmı size bırakıyorum. Octave ile yapılabilecek pek çok şey olmakla beraber, vektörlerin Octave'de kullanımıyla ilgili ne İngilizce ne de Türkçe olarak doyurucu bir kaynak bulabildim. Bu yazıda biraz bu açığı kapatmaya çalışacağım.<br />
<h2>Vektör Değişkenleri ve Özellikleri</h2>Octave'de vektörler, bir sıra veya sütun matrisi olarak tanımlanıyor. Mesela; bir <i>V</i> vektörü,<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicSxkY5xD-47yQZRDjo25-YskOinuLDMXtXPJfEiW70a_XiO5R7JcyQIQA5YDlQBetHMO8lrAAh0r8P2otbXyVYYWXxbbOsadviXhsRs8UgLMvoTyeoqM_5g2kcE_6a1cwy9BH34wZe9Rg/s1600/vector_1.png" imageanchor="1"><img border="0" height="32" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicSxkY5xD-47yQZRDjo25-YskOinuLDMXtXPJfEiW70a_XiO5R7JcyQIQA5YDlQBetHMO8lrAAh0r8P2otbXyVYYWXxbbOsadviXhsRs8UgLMvoTyeoqM_5g2kcE_6a1cwy9BH34wZe9Rg/s320/vector_1.png" width="133" /></a><br />
aşağıdaki gibi bir satır matrisi olarak gösterilebilir:<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglA_giL3OwnPFfekgMtIdE8HemIKX2KrQlD8D7tGxF0sbqcdxzc4InrQsx4fUte4lyjqNIDIJv5RcRMyALYEIsxbZFnGwbZO6JmBImWrfqxMaK3TZfYpTb59kcfcp-F58tUh0DEcrWGA-7/s1600/vector_1_matris.png" imageanchor="1"><img border="0" height="35" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglA_giL3OwnPFfekgMtIdE8HemIKX2KrQlD8D7tGxF0sbqcdxzc4InrQsx4fUte4lyjqNIDIJv5RcRMyALYEIsxbZFnGwbZO6JmBImWrfqxMaK3TZfYpTb59kcfcp-F58tUh0DEcrWGA-7/s320/vector_1_matris.png" width="133" /></a><br />
Octave'de matrisler için aşağıdaki kurallar geçerli:<br />
<br />
<ol><li>Matris ifadesi <i>[</i> ve <i>]</i> içinde olmalı</li>
<li>Aynı satırdaki elemanlar boşluk veya virgül ile ayrılmalı</li>
<li>Satırlar noktalı virgül ile ayrılmalı</li>
</ol>Mesela, Octave interaktif konsolunu açıp aşağıdaki ifadeyi girerek bu V vektörünü tanımlayalım:<br />
<pre>V = [3 4 5]</pre><blockquote style="background-color: #ff6666; font-style: italic; font-weight: bold; padding: 10px;">Eğer ifadeleri <i>"i"</i> ile sonlandırmazsak, Octave son girilen ifadenin değerini göstererek sonraki ifadeyi beklemeye başlıyor.</blockquote>Diyelim ki bu vektörün şiddetini bulmak istiyoruz. Bunun için <i>norm</i> fonksiyonunu kullanabiliriz:<br />
<pre>norm(V)</pre>İfadeyi noktalı virgülle sonlandırmadığınız için, cevap olarak aşağıdaki çıktıyı alırız:<br />
<pre>ans = 7.0711</pre>Burada <i>ans</i>, tahmin edebilebileceği gibi İngilizce <i>answer (cevap)</i> kelimesinin kısaltmasıdır. Peki ya V vektörünün, birim vektörünü bulmak istersek? Octave'de, bir operatör önüne gelen nokta, taraflar matris ise işlemin her elemana uygulanacağı anlamına gelir. Tanım V vektörünün birim vektörünü bulmak için, vektörün her elemanını vektörün şiddetine bölmemiz gerekir:<br />
<pre>V ./ norm(V)</pre>Cevap olarak aşağıdaki vektörü alırız:<br />
<pre>ans =
0.42426 0.56569 0.70711
</pre><br />
<h2>Devam edecek...</h2>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-41457589898707546992012-10-27T14:17:00.000+03:002012-10-27T14:17:09.438+03:00Adrian Cheok ve İnternet Üzerinden Duyu İletimi<p><a href="http://www.nus.edu.sg/" target="_blank">Singapur Ulusal Üniversitesi</a>'nde Elektrik ve Bilgisayar Mühendisliği bölümünde profesörlük yapan Adrian David Cheok, 2005 yılında gerçekleştirdiği, <i>"<a href="http://www.youtube.com/watch?v=1x-8EzuMiqU&feature=relmfu" target="_blank">Poultry Internet</a>",</i> yani <i>"Kümes İnterneti"</i> şeklinde tercüme edebileceğimiz projesiyle, internet üzerinden bir tavuğa sarılan ilk insan olarak tarihe geçti. Cheok, internette sadece multimedya değil aynı zamanda hislerin de iletilebileceği fikriyle çok heyecanlanmış. İlk iş olarak, <i>"haptik"</i> yani dokunma teknolojisiyle başlayan Cheok, hayvanseverlerin internet üzerinden hayvanlarını sevmesi için bir sistem geliştirdi.</p><p>Avustralya'nın Adelaide şehrinde büyüyen Cheok, çocukken sıklıkla büyük babasının kümesindeki tavuklarla oynarmış, biraz da bu sebeple ilk iş olarak tavuklara odaklanmış. Tavuklar için, gömülü titreşim parçaları bulunan bir <i>"haptik ceket"</i> yapmış. Sistemi kurcaladıkça, insanî yumuşaklıkta bir dokunuşu taklit etmenin ne kadar zor olduğunu öğrenmiş. Cheok; "Sistem inşaa edildikçe gelişiyor. Ben araştırmayı iteratif (tekrarlı) bir süreç olarak görüyorum, çünkü yaptığın şeyden birşeyler öğreniyorsun." diyor.<br />
Tavuk ceketi, kablosuz olarak internete bağlanıyordu ve bir web kamerası içeriyordu. Cheok, ofisinden dokunmaya duyarlı sensörlerle donattığı bir tavuk oyuncağını sevince, canlı olarak hissin tavuğa aktarımını izliyordu.</p><p>Ancak dediğine göre, meslektaşları bu projeden pek etkilenmemiş. Cheok; "Fakültenin bir kısmı, bırakın araştırmayı, bunu mühendislik olarak bile görmüyordu." diyor. Ancak vazgeçmeyen Cheok, sonrasında hem uluslararası konferanslarda hem de yerel akademi dünyasında çalışmasını takdir eden bir kitleye ulaşmış. Bir tavuk sürüsüyle yapılan deneyde, tavukların %70'i kendilerine ceket giydirilen odayı, tamamen yalnız bırakıldıkları odaya tercih etmiş.<br />
Sıradan bir akademik hayatla kariyerine başlayan Cheok, 2006 yılında kendi deyimiyle Japonya "Teknolojinin Mekkesi" olduğu için Mitsubishi Electric'te çalışmaya başlamış. Mitsubishi'nin Osaka laboratuarında, hızlı trenler için kontrolör geliştirilmesi gibi projelerde çalışan Cheok, şirketin katı politikalarından rahatsız olunca, Singapur Ulusal Üniversitesi'nden gelen profesörlük teklifini kabul etmiş.</p><p>2007 yılında, tavuk araştırmasını ilerleten Cheok, <i>"<a href="http://www.youtube.com/watch?v=hQ6usrx-GPM" target="_blank">Sarılma Pijaması (Haggy Pajama)</a>"</i> projesiyle uzaktaki ailelerin çocuklarına internet üzerinden sarılmasını mümkün kılmış. Cheok, şu anda, 2013'ün başında çalışan bir prototipinin ortaya çıkacağını umduğu, uzaktan eşlerin parmağındaki yüzüğü sıkarak birbirlerini düşündüklerini belirttikleri ticari bir proje üzerinde çalışıyor.</p><p>Ancak haptik sadece bir başlangıç; Cheok, temel tatları (acı, tatlı, tuzlu ve ekşi), termal ve elektrik uyarılarla taşıyan bir <i>"<a href="http://youtu.be/-EGBI2uUKNk" target="_blank">dijital lolipop</a>"</i>a sahip. Söylediğine göre, Cheok'un en büyük hayali, bu teknolojinin Paris'ten bir arkadaşın tattığı şarabın tadını internetten başka bir arkadaşına gönderebileceği bir noktaya gelmesiymiş.</p><p><i>Kaynak: <a href="http://spectrum.ieee.org/at-work/tech-careers/adrian-cheok-making-a-huggable-internet">http://spectrum.ieee.org/at-work/tech-careers/adrian-cheok-making-a-huggable-internet</a></i></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-56581565905759438482012-07-27T08:30:00.001+03:002012-07-27T08:30:17.715+03:0020 Yıl Sonra NASA'nın İlk Uzay Tulumu<div>
Günümüzde NASA tarafından kullanılan uzay tulumu çok eski olarak görülüyor. 1992'de tasarlanan bu tulum, sadece uzay mekikleri ve Uluslararası Uzay İstasyonu'na (ISS) çıkan ekipler tarafından kullanılmak için tasarlanmıştı. Ancak teknolojinin hızla geliştiği ve insanların Ay'a, Mars'a ve hatta astroitlere yapılabilecek görevlere gittikçe daha çok ilgi göstermesiyle; bu görevlerde ihtiyacı karşılayacak yeni uzay tulumlarına ihtiyaç duyulmaya başlandı. İşte bu sebeple, NASA 20 yıldır ilk kez yeni bir uzay tulumu tasarlamaya karar verdi. NASA'nın İleri Keşif Sistemleri (Advanced Exploration Systems, AES) tarafından geliştirilen ve bir nevi son teknolojilerle donatılmış giyilebilir bir laboratuar olan <a href="http://www.gizmag.com/z-1-prototype-spacesuit/23408/" target="_blank">Z-1 prototip uzay tulumu</a>, şu anda Johnson Uzay Merkezi'nde vakum testinden geçiyor.<br /><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-9240513294915700912012-01-31T11:59:00.001+02:002012-01-31T13:06:57.730+02:00Yapay Hücre Zarı ÜretildiHücre zarı, bir hücrenin en önemli bileşenlerinden biridir. Çünkü hem hücrenin içini dışarıdaki ortamdan ayırır, hem de hücreye madde giriş çıkışını kontrol eder. <a href='http://ucsdnews.ucsd.edu/pressreleases/envelope_for_an_artificial_cell/'>Kaliforniya San Diego Üniversitesi (UCSD)</a> ve Harvard Üniversitesi'nden kimyagerler; yeni bir kimyasal reaksiyon kullanarak kendini monte edebilen <a href='http://www.gizmag.com/synthetic-cell-membrane-created/21263/'>yapay hücre zarları</a> üretti, bu sayede insanoğlunun tamamen yapay bir formu oluşturmasına bir adım daha yaklaştırdılar. Kimyagerler, bu gelişmenin yaşamın kaynağına ışık tutmasını umuyorlar. Araştırmayla ilgili yayın, <a href='http://pubs.acs.org/doi/abs/10.1021/ja2076873?prevSearch=%255BContrib%253A%2BDevaraj%255D&searchHistoryKey'>Amerikan Kimya Derneği Bülteni'nde</a> bulunabilir (ücretli üyelik gerektiriyor).<br />
<br />
<b>Kişisel Not</b>: Bu gelişme; yapay görev hücreleriyle yapılacak tedavilerin önünü açabilir. Özellikle madde giriş çıkışının kontrol edilebilmesi, hastalıklarla savaşta pek çok olanak sağlayabilir.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2037609124017910804.post-68975555529517193282012-01-24T00:10:00.000+02:002012-01-24T00:10:30.692+02:00The official Google Code blog: Let's make TCP faster<a href="http://googlecode.blogspot.com/2012/01/lets-make-tcp-faster.html?spref=bl">The official Google Code blog: Let's make TCP faster</a>: By Yuchung Cheng, Make The Web Faster Team Transmission Control Protocol (TCP), the workhorse of the Internet, is designed to deliver all...Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2037609124017910804.post-45939061250066048842011-12-30T21:51:00.003+02:002011-12-30T21:51:57.968+02:00Çin ve Rusya, Dünyanın En Büyük Li-Ion Pil Fabrikasını İnşaa Etmek İçin BirleştiRusya ve Çin, lityum-iyon pil endüstrisini tekellerine almak için <a href="http://inhabitat.com/china-and-russia-team-up-to-launch-the-worlds-largest-lithium-ion-battery-plant/" target="_blank">dünyanın en büyük Li-Ion fabrikası</a>nı yapmak için anlaştı. Rusya'nın Novobirsk şehrinde inşaa edilmesi planlanan tesis, Thunder Sky adlı Çin firması ve RUSNANO adındaki Rus devleti tarafından işletilen firmanın sağlayacağı birleşik sermaye ile kurulacak ve her yıl pek çok farklı boyda 500,000'e kadar pil üretecek.<br />
<br />
İlgili basın açıklaması için: <a href="http://evworld.com/news.cfm?rssid=27057" target="_blank">http://evworld.com/news.cfm?rssid=27057</a><br />
<br />
<i>NOT: Bu haberin Rusça'dan yanlış çevrildiğini ve tüm İngilizce basında yanlış haliyle dolaştığını söyleyenler var. Aslında rakam yılda 500,000 değil; 5,000 otobüsmüş.</i>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-66909758598233835192011-12-23T19:08:00.001+02:002011-12-26T14:01:11.443+02:00Filozof Patrick Lin, Dronların Etik Yönleri Hakkında Brifing VerdiGeçtiğimiz ay, filozof Patrick Lin, In-Q-Tel adındaki CIA'in risk sermayesi kolu tarafından düzenlenen bir etkinlikte dronların (drone) etik yönleri hakkında bir brifing verdi. Ancak anlattıkları, Asimov'un robotik kanunlarıyla büyük oranda uyuşmuyor. Kısa süre önce İran'da düşen RQ-170 Sentinel model CIA dronuna ve alandaki gelişmelere bakarsak, Asimov'un entellektüel birikimine rağmen kanunlarının günümüzdeki robotik gelişmelerine göre oldukça naif olduğu söylenebilir.<br />
<br />
Brifing ile ilgili bağlantı:<a href="http://www.theatlantic.com/technology/print/2011/12/drone-ethics-briefing-what-a-leading-robot-expert-told-the-cia/250060/" target="_blank"> http://www.theatlantic.com/technology/print/2011/12/drone-ethics-briefing-what-a-leading-robot-expert-told-the-cia/250060/</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-23091009302267154272011-12-15T21:40:00.002+02:002011-12-15T21:43:08.522+02:00Avrupa Birliği'nin Dörtte Birinden Fazlası Hiç İnternet KullanmamışReuters'ın <a href="http://www.reuters.com/article/2011/12/14/us-eu-internet-idUSTRE7BD1BM20111214">haberine</a> göre, Avrupa Birliği nüfusunun dörtte birinden fazlası hayatında hiç internet kullanmamış. Avrupa Birliği'nin istatistik kurumu Eurostat'ın <a href="http://europa.eu/rapid/pressReleasesAction.do?reference=STAT/11/188&format=HTML&aged=0&language=EN&guiLanguage=en%3C/p%3E" target="_blank">araştırmasına</a> göre; Romanya nüfusunun yarısından fazlası ve Bulgaristan, Yunanistan, Güney Kıbrıs, Portekiz gibi güney ve doğu Avrupa nüfusunun yarısından biraz azının evde internete erişimi yok. Lüksemburg, İsveç ve Danirmarka gibi ülkelerde internet kullanımı %90'ları aşarken, yine ekonomik olarak gelişmiş bir ülke olan İspanya'da evde internet erişimi %64 ile sınırlıyken istatistiğe göre İspanya nüfusunun sadece %39'u internetten alışveriş yapıyor. Romanya ve Bulgaristan, %13 ile çok düşük bir orana sahipken, Almanya ve Fransa'dan sonra Avrupa'nın en büyük ekonomisi olan İngiltere ise açıkça e-ticaret ve e-devlet servisleri alanında baskın görünüyor.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-82934378754729723742011-12-15T00:27:00.003+02:002011-12-15T14:04:06.812+02:00Çin Hükümeti, ABD&apos;nin Yenilenebilir Enerji Politikası İçinSoruşturma BaşlattıÇin Ticaret Bakanlığı; 25 Kasım 2011 tarihinde, ABD devlet politikası ve yenilenebilir (?) enerji desteği için soruşturma başlattı. Kararın muhtemel sebebinin, yine aynı ay içinde ABD hükumetinin Çin malı solar panellerin Amerika'daki satışını durdurması olduğu anlamak çok zor değil. Bakanlığın sitesinde (www.mofcom.gov.cn) yayınlanan açıklama şöyle; 'Ticaret Bakanlığı ABD'nin yenilenebilir enerji sektörüne destek politikası ve ilgili uygulamaları için ticari ambargo soruşturması başlattı.'. Açıklamaya göre Çinli şirketler; Amerikan hükümetinin politikasının, Çin menşeili yenilenebilir enerji ürünlerinin ABD'ye ithalatına karşı bir ticaret ambargosu oluşturduğunu savunuyorlar.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-22829805557655895022011-10-13T20:33:00.006+03:002012-01-01T20:08:58.642+02:00Why Instance Caching Still Drastically Matters?<span class="Apple-style-span" style="font-family: inherit;">Santiago Lema from the Google App Engine group tells about his recent experience on GAE with <a href="http://memcached.org/" target="_blank">memcache </a>and instances: <a href="https://groups.google.com/d/topic/google-appengine/4w1gcSgCFDs/discussion">here</a>. </span><br />
As you can see, although using specialized caching solutions like memcache will probably make your application more scalable; you should still use the instance caching (or instance pools if you prefer) in some critical points of your application. No matter how much your company's development methodologies are well-defined, when coding you will minor make design decisionsg that means nothing to non-technical person. And even if you are a careful developer who uses best practices and design patterns as required, you may think that an old method like instance caching is unnecessary when you use a optimized caching solution like memcache, ehcache, etc. Well, believe or not, it still has a great impact on the performance. Especially, in points where a bottleneck more likely to be encountered (like data access objects, request handlers, etc.), it can provide a substantial boost on your throughput with a little trade-off with memory footprint. Even better, with newer versions of Java, you can use ThreadLocals to fine tune your object instantation. For example, it is generally a best practice to declare a logger object as "static final" in the begining of the class declaration:<br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<code><span class="Apple-style-span" style="font-family: inherit;">public final class SomeClass {<br />
<br /> private static final Logger LOG = LoggerFactory.getLogger(SomeClass.class);<br />
<br />
...<br />
}<br /></span></code><br />
<span class="Apple-style-span" style="font-family: inherit;">With the static modifier, every instance of that class will share the same logger object which may be undesirable when there are several hundreds of instances of this class and you call logging methods frequently in your code. A better approach could be to use a logger instance per thread, which is possible by declaring it a <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html" target="_blank">ThreadLocal</a> variable:</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br />
</span><br />
<code><span class="Apple-style-span" style="font-family: inherit;">public final class SomeClass {<br />
<br />
<br />
private static final ThreadLocal<logger> LOG = new ThreadLocal<logger>();</logger></logger><br />
<br />
<br /> private static Logger getLogger() {<br />
<br />
<br /> /* Ensure that the Logger is initialized */<br /> if (LOG.get() == null)<br /> LOG.set(LoggerFactory.getLogger(SomeClass.class));<br />
<br />
<br /> /* Return the thread local instance */<br /> return LOG.get();<br /> }<br />
<br />
...<br />
}<br /></span></code><br />
<div>
<code><span class="Apple-style-span" style="font-family: inherit;"></span></code></div>
<div>
<span class="Apple-style-span" style="font-family: inherit;">Now, you can call static getLogger() method to get a thread-local Logger instance; so a new Logger instance for every thread will be created and those loggers will log with the shared class name. Although it is not necessary, we created a helper method that initializes the thread-local Logger instance if it is not already initialized; we could also create a helper static class for doing this with different classes. You can also add some thread information with the log message as a best practice or an identifier related to the performed operation, so it will be possible to see which thread was used for that operation at that time.</span></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-14704770937834002142011-03-06T17:02:00.003+02:002012-03-28T20:21:40.325+03:00Linux, FTP and iptables... Are you ready?Recently, I decided to change my primary development method using my smartphone. I was using a SSH client (<a href="http://click.linksynergy.com/fs-bin/stat?id=x*2ajLAusQY&offerid=146261&type=3&subid=0&tmpid=1826&RD_PARM1=http%253A%252F%252Fitunes.apple.com%252Fus%252Fapp%252Fissh-ssh-vnc-console%252Fid287765826%253Fmt%253D8%2526uo%253D4%2526partnerId%253D30">iSSH</a>, to be specific) to connect to my Linux server and doing all my development from that terminal. When I rediscovered <a href="http://click.linksynergy.com/fs-bin/stat?id=x*2ajLAusQY&offerid=146261&type=3&subid=0&tmpid=1826&RD_PARM1=http%253A%252F%252Fitunes.apple.com%252Fus%252Fapp%252Fnimbus-cloud-source-code-editor%252Fid365799922%253Fmt%253D8%2526uo%253D4%2526partnerId%253D30">Nimbus+ editor</a>, I noticed it's FTP support; idea of writing my code using Nimbus+ over FTP seemed to be a perfect solution. After I decided to setup an FTP server, it took a long time for me to figure out why I couldn't see my files from <a href="http://click.linksynergy.com/fs-bin/stat?id=x*2ajLAusQY&offerid=146261&type=3&subid=0&tmpid=1826&RD_PARM1=http%253A%252F%252Fitunes.apple.com%252Fus%252Fapp%252Fnimbus-cloud-source-code-editor%252Fid365799922%253Fmt%253D8%2526uo%253D4%2526partnerId%253D30">Nimbus+</a>. So, in this post I will explain how to setup a FTP server and configure iptables for FTP traffic.<br />
We have a couple of choice for FTP server; my favorites are <a href="http://vsftpd.beasts.org/">vsftpd</a> and <a href="http://www.proftpd.org/">ProFTPD</a>, and for this post I'll use the latter. First, we need to install proftpd using our Linux distro's Package manager. I'm using CentOS, so I install proftpd using yum:<br />
<pre class="prettyprint">sudo yum install proftpd</pre>
I'm not going to explain the configuration of ProFTPD, because the online documentation is sufficient for most cases. We will be using default FTP port 21 (default of ProFTPD), unlike most old-school system admins I think it's redundant to change the port to a higher one from security point of view. Instead, we should use connection tracking to statefully manage FTP traffic. But let's add a rule to accept incoming traffic on port 21:<br />
<pre class="prettyprint">iptables -A INPUT -p tcp --dport 21 -j ACCEPT</pre>
If your OUTPUT chain's default policy is DROP, then you should add a role to accept outgoing traffic from the default FTP data port 20:<br />
<pre class="prettyprint">iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT</pre>
Actually, this is enough for active FTP settings; but if we need to use passive FTP (as this is the case with Nimbus+'s FTP support), to cope with more complex rules passive mode needs we should use the <i>ip_conntrack_ftp</i> module to simplify our work. modprobe command can be used, but when iptables stop it's unloaded. So, to ensure the loading of ip_conntrack_ftp; open the file <i>/etc/sysconfig/iptables-conf</i> with your favorite text editor, then modify the IPTABLES_MODULES line like this:<br />
<pre class="prettyprint">IPTABLES_MODULES="ip_conntrack_ftp"</pre>
After saving and exiting, now you should save your iptables and restart it for our changes to take effect:<br />
<pre class="prettyprint">service iptables save
service iptables restart</pre>
And, voila! Now you can easily access your files using any FTP client.<br />
<i><b>Note: </b>Unless we configure iptables to support passive FTP; we cannot see our files (see only an empty directory listing), if our FTP client is using passive mode. </i> <br />
<b>Some useful resources: </b><br />
<iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=deni03-20&o=1&p=8&l=bpl&asins=0596006705&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="align: left; height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"></iframe><iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=deni03-20&o=1&p=8&l=bpl&asins=0596510306&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="align: left; height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"></iframe><iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=deni03-20&o=1&p=8&l=bpl&asins=0596005695&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="align: left; height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"></iframe>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-69177461888199126412010-09-24T02:31:00.007+03:002011-10-13T20:48:25.370+03:00Instance Pools and finalize() method in Java<span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: small;">Well, I'm writing this assuming you have a basic knowledge about instance pool pattern. If you don't, here is a creative description of instance pool pattern: </span><span class="Apple-style-span" style="font-size: small;"><a href="http://sourcemaking.com/design_patterns/object_pool">http://sourcemaking.com/design_patterns/object_pool</a></span></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: small;">Now, let's assume we need to use a factory class called CarFactory to create cars (</span><a href="http://en.wikipedia.org/wiki/Factory_pattern"><span class="Apple-style-span" style="font-size: small;">http://en.wikipedia.org/wiki/Factory_pattern</span></a><span class="Apple-style-span" style="font-size: small;">). CarFactory uses an internal instance pool, so it does not have any public constructors to enforce the usage of it's static getInstance method.</span></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<code><span class="Apple-style-span" style="font-family: inherit;">package com.blogspot.denizacay.pool;<br />import java.util.Stack;<br />
<span class="Apple-style-span" style="font-size: small;">public class CarFactory {</span><br />
<span class="Apple-style-span" style="font-size: small;"> // Create an empty static stack for storing instances</span><br />
<span class="Apple-style-span" style="font-size: small;"> private static Stack</span><carfactory><span class="Apple-style-span" style="font-size: small;"> instancePool = new Stack</span><carfactory><span class="Apple-style-span" style="font-size: small;">();</span></carfactory></carfactory><br />
<span class="Apple-style-span" style="font-size: small;"> // Might define custom creating logic here instead of empty constructor</span><br />
<span class="Apple-style-span" style="font-size: small;"> private CarFactory() { };</span><br />
<span class="Apple-style-span" style="font-size: small;"> public static getInstance() {</span><br />
<span class="Apple-style-span" style="font-size: small;"> // Use a synchronization block so that concurrent access is safe</span><br />
<span class="Apple-style-span" style="font-size: small;"> synchronized(instancePool) {</span><br />
<span class="Apple-style-span" style="font-size: small;"> if(instancePool.isEmpty())</span><br />
<span class="Apple-style-span" style="font-size: small;"> return new CarFactory();</span><br />
<span class="Apple-style-span" style="font-size: small;"> else</span><br />
<span class="Apple-style-span" style="font-size: small;"> return instancePool.pop();</span><br />
<span class="Apple-style-span" style="font-size: small;"> }</span><br />
<span class="Apple-style-span" style="font-size: small;">}</span><br />
<span class="Apple-style-span" style="font-size: small;"><br /></span></span></code><br />
<span class="Apple-style-span" style="font-family: inherit; font-size: small;">As you can see, we implemented "Object pool" pattern using a static field of type Stack. When a user calls getInstance() method, implementation checks for any available instances in the instancePool field; if pool is empty a new instance is returned, otherwise an available instance will be returned so we don't need to create a new object. But this code has one problem: what will happen when we are done with CarFactory instance we used? Generally, we can define a method called free() to return an instance to the pool.</span><br />
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: small;">package com.blogspot.denizacay.pool;</span><br />import java.util.Stack;<br />public class CarFactory {</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> // Create an empty static stack for storing instances</span></div>
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: small;"> private static Stack</span><carfactory><span class="Apple-style-span" style="font-size: small;"> instancePool = new Stack</span><carfactory><span class="Apple-style-span" style="font-size: small;">();</span></carfactory></carfactory></span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> // Might define custom creating logic here instead of empty constructor</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> private CarFactory() { };</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> public static getInstance() {</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> // Use a synchronization block so that concurrent access won't be a problem</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> synchronized(instancePool) {</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> if(instancePool.isEmpty())</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> return new CarFactory();</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> else</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> return instancePool.pop();</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> }</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> public void free() {</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: small;"> synchronized(instancePool)</span><span class="Apple-style-span" style="font-size: small;"> {</span></span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> // Add current instance to the pool</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> instancePool.push(this);</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"> }</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: small;"> }</span>}</span></div>
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: small;">This is the simplest solution, but this approach assumes that the developer will responsibly call free() method to send an unused instance to the pool. Well, it is always a good idea to code "defensively", which means you should write your code so that you don't expect a developer to do something, instead you force her/him. We know that when an object has no reference to itself, it will be garbage collected by the JVM. Java gives us a mechanism to free any allocated resources (like file IO, database connections, etc.) by overriding the finalize() method of the Object class. JVM ensures that before an object is deallocated finalize() method will always be called. So we can actually override finalize() method so that when an CarFactory instance is no longer used, it will be sent to the pool automatically. Here's the final code of the CarFactory class:</span><br />package com.blogspot.denizacay.pool;</span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"><br /></span></div>
<span class="Apple-style-span" style="font-family: inherit;"><br /></span><br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<code><span class="Apple-style-span" style="font-family: inherit; font-size: small;">import java.util.Stack;</span></code></div>
<code><span class="Apple-style-span" style="font-family: inherit;">
</span></code><br />
<div>
<code><span class="Apple-style-span" style="font-family: inherit; font-size: small;"><br /></span></code></div>
<code><span class="Apple-style-span" style="font-family: inherit;">
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
</div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;">public class CarFactory {</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> // Create an empty static stack for storing instances</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> private static Stack</span><carfactory><span class="Apple-style-span" style="font-size: small;"> instancePool = new Stack</span><carfactory><span class="Apple-style-span" style="font-size: small;">();</span></carfactory></carfactory></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> // Might define custom creating logic here instead of empty constructor</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> private CarFactory() { };</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"><br /></span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> public static getInstance() {</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> // Use a synchronization block so that concurrent access won't be a problem</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> synchronized(instancePool) {</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> if(instancePool.isEmpty())</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> return new CarFactory();</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> else</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> return instancePool.pop();</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> }</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> </span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> @Override</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> protected void finalize() {</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> synchronized(instancePool)</span><span class="Apple-style-span" style="font-size: small;"> {</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> // Add current instance to the pool</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> instancePool.push(this);</span></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-size: small;"> }</span></div>
</span></code><br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<code><span class="Apple-style-span" style="font-family: inherit;">
<span class="Apple-style-span" style="font-size: small;"> }</span></span></code></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: small;">}</span><br />Let's write a JUnit case to test this:</span></div>
<span class="Apple-style-span" style="font-family: inherit;"><code><br />package com.blogspot.denizacay.pool;<br />
<span class="Apple-style-span" style="font-size: small;">import static org.junit.Assert.*;</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-style-span" style="font-size: small;">import org.junit.After;</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-style-span" style="font-size: small;">import org.junit.Before;</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-style-span" style="font-size: small;">import org.junit.Test;</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-style-span" style="font-size: small;">public class CarFactoryTest {</span><span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> private </span></span><span class="Apple-style-span" style="font-size: small;">CarlFactory factory;</span><span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="white-space: normal;">
</span></span></span><br />
<span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="white-space: pre;"> </span>@Before</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">public void setUp() throws Exception {</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">factory = CarFactory.getInstance();</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">}</span><br />
<br /><br />
<span class="Apple-style-span" style="font-size: small;"><span class="Apple-style-span" style="white-space: pre;"></span> @After</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">public void tearDown() throws Exception {</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">}<span class="Apple-style-span" style="white-space: pre;"><br /></span></span><span class="Apple-style-span" style="font-size: small;"><br /> @Test</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">public final void testFinalize() {</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">// Create a local instance</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">CarFactory dummy = CarFactory.getInstance();</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">// Get pool size</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">int size1 = dummy.getPoolSize();</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">// Print initial pool size of CarFactory instance pool</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">System.out.println("Initial instance pool size of CarFactory class: " + dummy.getPoolSize());</span><span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">// Assign dummy pointer to null, so we don't have any reachable</span><br />
<span class="Apple-style-span" style="font-size: small;"> // reference to it</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">dummy = null;</span><span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">// Force garbage collection and finalization</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">System.gc();</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">System.runFinalization();</span><span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">// Get new pool size</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">int size2 = factory.getPoolSize();</span><span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">System.out.println("Later instance pool size of CarFactory class: " + factory.getPoolSize());</span><span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">// Check whether pool size is incremented by one</span><span class="Apple-style-span" style="font-size: small;"><br /></span>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">assertTrue(size2 - size1 == 1);</span><span class="Apple-style-span" style="font-size: small;"><br /></span></code>
<span class="Apple-tab-span" style="white-space: pre;"><span class="Apple-style-span" style="font-size: small;"> </span></span><span class="Apple-style-span" style="font-size: small;">}</span><span class="Apple-style-span" style="font-size: small;"></span></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><span class="Apple-style-span" style="font-size: small;">Here's the output in my environment:</span><br /><code><br />Initial instance pool size of ModelFactory class: 0</code><code><br />
<span class="Apple-style-span" style="font-size: small;">Later instance pool size of ModelFactory class: 1</span></code>
</span><br />
<span class="Apple-style-span" style="font-family: inherit;">Test was successful and we can see that finalized instance is returned to the instance pool. If we call getInstance() again in the end of the test method, an instance from the pool will be returned and pool will be empty. I think this is a good approach to object pooling. On the other hand, due to istances will never be successfully finalized until CarFactory class is unloaded by the JVM, we could have a cleaning mechanism but it's out of the scope of this text. If you want to delve more into the OO design patterns, here's a list of valuable books:</span><br />
<span class="Apple-style-span" style="font-family: inherit; font-size: small;"><br /></span><br />
<span class="Apple-style-span" style="font-family: inherit;"><a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612?ie=UTF8&tag=deni03-20&link_code=bil&camp=213689&creative=392969" imageanchor="1" target="_blank"><span class="Apple-style-span" style="font-size: small;"><img alt="Design Patterns: Elements of Reusable Object-Oriented Software" src="http://ws.amazon.com/widgets/q?MarketPlace=US&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL160_&ASIN=0201633612&tag=deni03-20" /></span></a><span class="Apple-style-span" style="font-size: small;"><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=deni03-20&l=bil&camp=213689&creative=392969&o=1&a=0201633612" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=deni03-20&l=bil&camp=213689&creative=392969&o=1&a=0596007124" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=deni03-20&l=bil&camp=213689&creative=392969&o=1&a=1598220314" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /></span><a href="http://www.amazon.com/Object-Oriented-Design-Patterns-Cay-Horstmann/dp/0471744875?ie=UTF8&tag=deni03-20&link_code=bil&camp=213689&creative=392969" imageanchor="1" target="_blank"><span class="Apple-style-span" style="font-size: small;"><img alt="Object-Oriented Design and Patterns" src="http://ws.amazon.com/widgets/q?MarketPlace=US&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL160_&ASIN=0471744875&tag=deni03-20" /></span></a><span class="Apple-style-span" style="font-size: small;"><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=deni03-20&l=bil&camp=213689&creative=392969&o=1&a=0471744875" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /></span><a href="http://www.amazon.com/Design-Patterns-Explained-Perspective-Object-Oriented/dp/0321247140?ie=UTF8&tag=deni03-20&link_code=bil&camp=213689&creative=392969" imageanchor="1" target="_blank"><span class="Apple-style-span" style="font-size: small;"><img alt="Design Patterns Explained: A New Perspective on Object-Oriented Design (2nd Edition)" src="http://ws.amazon.com/widgets/q?MarketPlace=US&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL160_&ASIN=0321247140&tag=deni03-20" /></span></a><span class="Apple-style-span" style="font-size: small;"><img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=deni03-20&l=bil&camp=213689&creative=392969&o=1&a=0321247140" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /></span></span><br />
<span class="Apple-style-span" style="font-family: Verdana, sans-serif;"><br /></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-52213066730224152742010-09-06T19:14:00.000+03:002010-09-06T19:14:02.938+03:0025 Best and Brightest Eclipse Development Projects - Application Development from eWeek<a href="http://www.eweek.com/c/a/Application-Development/25-Best-and-Brightest-Eclipse-Development-Projects-448324/">25 Best and Brightest Eclipse Development Projects - Application Development from eWeek</a><div><br /></div><div>Definetely Higgins, e4 and Virgo looks promising..</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-62325356636050493372010-09-04T01:54:00.000+03:002010-09-04T02:16:03.048+03:00For how long the generics in Java was that smart ?Ok, in the middle of the night, when I was writing code for one of my projects, I needed to use a <i>generic method;</i> which allows you to specify a generic type for arguments when calling that function. Which is a something I'm already familiar with. I had a function like this:<br />
<br />
<code>
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">private </span></span><t><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;"> void addProperty(String name, T defaultValue) {</span></span></t><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">....</span></span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;"><code></code></span></span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">}</span></span></code><br />
<br />
When I wanted to call this from another function, I wrote something like this:<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">this.addProperty("age", 12);</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><br /></span><br />
Actually I expected to see an error or at least a warning. But I was wrong. When I hovered over this call in Eclipse, an information popup appeared:<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">void </span></span><i><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;"><package hiararchy=""></package></span></span></i><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">.ModelPropertyMap.addProperty(String
name, Integer
defaultValue))</span></span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;"><br /></span></span><br />
<code></code>Looks like Java compiler is able to recognize the type of argument you pass to a generic argument, and process it like I called with Integer generic argument:<br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">this.</span></span><span class="Apple-style-span" style="font-family: monospace;"><integer><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="font-size: small;">addProperty("age", 12)</span></span>;</integer></span><br />
<span class="Apple-style-span" style="font-family: monospace;"><integer><br /></integer></span><br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
I think it is Java compiler that gives us such a flexibility, but I'm using Eclipse and maybe it's one of the IDE's features; I'm not sure, so I would appreciate if anyone could give me an insight about that.</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-2037609124017910804.post-24926713840540727792010-09-01T13:54:00.001+03:002011-04-12T17:21:38.244+03:00C++? Gerçekten mi? Kısa bir süre önce, yaz olmasının da verdiği bir rahatlıkla, C++'a bir kez daha şans vermek istedim. <a target="_blank" href="http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670?ie=UTF8&tag=deni03-20&link_code=btl&camp=213689&creative=392969">Code Complete</a><img src="http://www.assoc-amazon.com/e/ir?t=deni03-20&l=btl&camp=213689&creative=392969&o=1&a=0735619670" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" />'den öğrendiğim birşey varsa; o da doğru iş için doğru programlama dilini kullanmanın önemidir. Bugüne kadar birçok farklı dili rahatlıkla kullandım ancak C ve C++ hep bir hevesle başlayıp sonra bırakmamla sonuçlandı. Yani tamam, üniversitedeki derslerde C/C++ öğrendik, ama bunların gerçek hayattaki kullanımını hep sorgulamışımdır. Birkaç senedir takip ettiğim <a target="_blank" href="http://www.amazon.com/Programming-2nd-Matthias-Kalle-Dalheimer/dp/0596000642?ie=UTF8&tag=deni03-20&link_code=btl&camp=213689&creative=392969">Qt</a><img src="http://www.assoc-amazon.com/e/ir?t=deni03-20&l=btl&camp=213689&creative=392969&o=1&a=0596000642" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /> (Nokia'nın Trolltech'i alarak bünyesine kattığı, platformlararası bir GUI geliştirme framework'ü, <i>İngilizce "cute" sözcüğü gibi okunuyor</i>), C++ denemek için iyi bir fırsat olabilirdi. Ama Qt'un Java binding'i (<i>Qt Jambi</i>) olması ve de platformlararası çalışma konusunda Java'nın başarısı sebebiyle bu fikir beni pek sarmadı. Sonra aklıma birşey geldi, gerçekçi olalım; yazılım sektöründe çalışan ve işini bilerek seçen erkeklerin büyük bölümünün programlamayla ilk olarak ilgilenmesinin sebebi <i>bilgisayar oyunları</i>dır.<br />
3D uygulamalarda genellikle grafik verisi VRAM'de saklandığı için mümkün olduğu kadar az kaynak harcanması isteniyor. Bu genellikle düşük seviye diller ve karmaşık olarak tasarlanmamış kütüphaneler kullanmayı gerektiriyor (bkz. DirectX, OpenGL). Oyun sektöründe C++'ın çok popüler olduğunu biliyorum, ben de C++ bilgimi derinleştirmek için DirectX ile 3D programlama öğreten bir kitap aramaya başladım. <i><a target="_blank" href="http://www.amazon.com/Beginning-DirectX-10-Game-Programming/dp/1598633619?ie=UTF8&tag=deni03-20&link_code=btl&camp=213689&creative=392969">Beginning DirectX 10 Game Programming</a><img src="http://www.assoc-amazon.com/e/ir?t=deni03-20&l=btl&camp=213689&creative=392969&o=1&a=1598633619" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /></i>adlı kitap anlatım olarak hoşuma gitti. Genellikle "beginning" serilerinden pek hoşlanmam, çünkü başlığında "programcılar için" ibaresi olan kitaplarda bile çoğu zaman tekrar tekrar temel yazılım geliştirme konularına değinilinir ve çoğu zaman da o bölümleri atlarsanız sonraki bölümlerin önceki bölümlerdeki kodlar üzerine kurulduğunu görür ve kitabı takip edemezsiniz. Ama bu başlangıç kitabı, neredeyse doğrudan DirectX programlamaya giriş yapıyor ve sayfalarca gereksiz bilgi içermiyor, benim gibi hobi olarak 3D programlama denemek isteyen biri için ideal...<br />
Birkaç konu sonra neden C++'tan nefret ettiğimi tekrar hatırladım, sanırım hemen her zaman bir dilin etrafında gelişen komünite dilin genel gidişatını belirliyor. Microsoft'un .NET kütüphanelerini tasarlarken ki başarısını DirectX SDK için de gösterdiğini ummuştum ancak görünen o ki, 3D oyun veya C++ çevrelerindeki alışkanlıklar sebebiyle pek iç açıcı bir kütüphane tasarlanmamış. Günümüzde artık "<i>okunulabilirlik</i>" ve "<i>anlaşılabilirlik</i>"<i> </i>kavramının en az performans kadar önemli olduğunu konusunda her yazılımcı hem fikirdir sanardım, yanılmışım. Bir struct'a DXGI_SWAP_CHAIN_DESC gibi bir isim vermek ne kadar iyi bir fikir bilemiyorum. Sanki DirectX geliştirme takımı, okunulamaz hale getirmek için zorla uğraşmış gibi; alışık biri anlayabilir belki ama eminim bu yapının adı SwapChainDescription olsaydı kimse şikayet etmezdi. Şimdi bu yapı tek başına pek sorun değil gibi gelebilir, ama karmaşık bir uygulamanın kodunu gözden geçirirken böyle isimlerle karşılaşmak ve kodu anlamaya çalışmak ciddi derecede sabır gerektiriyor.<br />
Şöyle bir DirectX forumlarını gezip göz gezdirdim, her zaman her yerde karşılaşılan C fanatikleri tabii ki orada da vardı. Neden bilmiyorum yazılım çevrelerinde hep bir dil/teknoloji karşılaştırması vardır, genellikle de düşük seviye dillerle yazılım geliştirenler kendilerini daha üstün görmekte kararlıdır (<i>TechRepublic'in bir araştırmasına göre C# kullanan yazılımcılar, eşdeğer pozisyondaki VB.NET kullanan yazılımcılara göre belirgin bir şekilde daha fazla maaş alıyorlarmış</i>). Artık çok çekirdekli işlemciler standart haline gelirken ve bulut (<i>cloud computing</i>) hizmetleri gün geçtikçe yaygınlaşırken; bu tartışmalar pek mantıklı olmuyor. C++ kullanıp bir hata yüzünden saatlerce okunulamaz derecede korkunç bir kod yığınını okumaktansa, Java kullanıp milisaniyelik gecikmeleri göz ardı etmeyi tercih ederim.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-49958929700955741622010-06-21T01:03:00.000+03:002010-06-21T01:03:11.957+03:00OSGi Geliştirme OrtamıUzun bir aradan sonra (yazmaya pek vakit bulamadım) OSGi'ye kaldığımız devam ediyoruz. Önceki yazımda OSGi'yi kısaca anlatmış ve popüler OSGi framework'lerinden Equinox'u kurmuştuk. Bu geçen zamanda OSGi gelişmeye devam etti. Hem dökümantasyon bulmak kolaylaştı hem de OSGi'nin etrafında istekli bir komunite oluştu. Bu arada OSGi'nin yapabilecekleri konusunda heyecanım(ız) arttı. Hatta OSGi'nin Java dünyasında birçok şeyi kökten değiştirebileceğine inanıyorum diyebilirim. OSGi yazılarımı, internette OSGi hakkında fazlasıyla İngilizce kaynak bulunduğu için Türkçe yazmaya devam ediyorum. Aslında OSGi ile ilgili yazılacak çok yazı var ama herşeyden önce kendimize rahat bir IDE ortamı hazırlarsak zamanımızı daha verimli kullanırız (ant ve Maven fanatikleri kızacaktır ancak ilkel araçlarla yazılım geliştirmenin pek etkili olduğunu düşünmüyorum). PAX, bnd, Netbeans gibi bir çok geliştirme aracı aslında işimize yarayabilir; ancak her ne kadar pek Eclipse fanatiği olmasam da, konu OSGi olunca Eclipse oldukça iyi bir geliştirme ortamı sunuyor. Bu sebeple bu yazının konusu OSGi geliştirme için gereken Eclipse ortamını kurmak ve "Bundle" kavramı olacak.<br />
<div class="separator" style="clear: both; text-align: left;">
İlk işimiz <a href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a> adresine girerek gerekli Eclipse paketini indirmek olacak. Aslında önce bir Java geliştirme paketi indirip daha sonra pluginler aracılığıyla PDE özelliklerini ekleyebiliriz ama bildiğim kadarıyla PDE zaten Java geliştirme ortamıyla birlikte geliyor o sebeple PDE versiyonunu seçip indirelim.</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2TAu_RBqx6HoWHiEVReaJl2ZUsYzbz7iQZtHyfnzYzhY0YvG7-ujlSaBNFsqevP92rKlSuIt3SWXLyXYYPxFWbARENyqGzmKVOvwNANuNwrQBuD2cjY2VDmOhk8XW6Q__OiBiecTxFlBp/s1600/eclipse_PDE.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2TAu_RBqx6HoWHiEVReaJl2ZUsYzbz7iQZtHyfnzYzhY0YvG7-ujlSaBNFsqevP92rKlSuIt3SWXLyXYYPxFWbARENyqGzmKVOvwNANuNwrQBuD2cjY2VDmOhk8XW6Q__OiBiecTxFlBp/s1600/eclipse_PDE.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="89" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2TAu_RBqx6HoWHiEVReaJl2ZUsYzbz7iQZtHyfnzYzhY0YvG7-ujlSaBNFsqevP92rKlSuIt3SWXLyXYYPxFWbARENyqGzmKVOvwNANuNwrQBuD2cjY2VDmOhk8XW6Q__OiBiecTxFlBp/s640/eclipse_PDE.JPG" width="640" /></a></div>
<br />
İndirilen sıkıştırılmış dosyayı bir klasöre açtıktan sonra eclipse.exe dosyasına çift tıklayalım. Eclipse, bizden bir çalışma ortamı (workspace) belirlememizi isteyecek, istediğiniz yeri seçip onaylayın. Karşınızda Eclipse'in boş bir ekranı görünecektir. Eclipse'in en güzel yanı, OSGi'yi doğal olarak desteklemesi; yani, aslında Eclipse plugin'lerinin çoğu birer OSGi modülüdür. Aslında, OSGi dilinde modülün karşılığı "bundle", ancak Eclipse içinde "plugin" olarak geçiyor. Şimdi yeni proje açalım, açılan ekranda Plug-in Development seçeneğini seçince karşımıza birkaç tane seçenek çıkacak; burada Plug-in Project'i seçmeliyiz. Seçip onayladıktan sonra, yeni ekranda bizden bir proje ismi yazmamızı isteyecek; bir sonraki yazıda kolaylık olması için burada "HelloWorld" yazın. Burada önemli olan nokta, aşağıdaki hedef platform kısmı; "an OSGi framework"ün seçili olduğundan ve yanındaki listede "standard"ın seçili olduğundan emin olun. Burada aslında, geliştirdiğimiz plugin'in bir OSGi framework'ünde çalıştırılmak üzere yapılandırılacağını ve belli bir hedef framework'ten ziyade standard OSGi spesifikasyonlarına uygun olması gerektiğini belirttik. Böylece belli bir framework'e has gereksiz bilgileri modülümüzde görmeyeceğiz.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFJ3-0XctsFnWzWGxv6FWZw1DqrHUH3qp_vTJ8LUFl0JmBvonqlSiAguQQwclJjh0Q7y5mr2gm-Ik8H5p7VAEtSp-DU60eHu_jE2SGNOq_OnNtSK_uN5SDIg1kkOj1ZEzjh-hrQmHNGxBT/s1600/eclipse_PDE_2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFJ3-0XctsFnWzWGxv6FWZw1DqrHUH3qp_vTJ8LUFl0JmBvonqlSiAguQQwclJjh0Q7y5mr2gm-Ik8H5p7VAEtSp-DU60eHu_jE2SGNOq_OnNtSK_uN5SDIg1kkOj1ZEzjh-hrQmHNGxBT/s640/eclipse_PDE_2.JPG" width="640" /></a></div>
Bunu da onayladıktan sonra, bizden plugin'le ilgili metaverisi (veri hakkında veri) isteyecek.Burada sadece aşağıdaki "Generate an activator, ...." seçeneğini kaldırıyoruz ve "Bitiş"e tıklıyoruz. İşte bir OSGi bundle'ını, Eclipse ile oluşturmak bu kadar kolay. Ama bundan sonrasını bir sonraki yazımızda pratik olarak inceleyelim.<br />
Şimdi ise biraz teori vakti...<br />
<br />
<b>Bundle mı, yoksa modül mü?</b><br />
İlk önce kafamıza şunu yerleştirmeliyiz: bundle, plugin ve modül; bu yazı dizisinde hep aynı anlama geliyor. Orijinal OSGi spesifikasyonları; bir modülü "bundle" olarak tanımlıyor, Eclipse ise buna "plugin" diyor. Ancak ikisi de sonuç olarak bir modülü ifade etmek için kullanılıyor. Bundle'lar, işin özünde ekstra metaveri içeren standard JAR dosyaları. Onları farklı kılan ise içindeki metaveri (manifest.mf dosyası). Yani aslında var olan bir JAR dosyasını da, daha sonra göreceğimiz gibi içine metaveri ekleyerek bir OSGi bundle'ı haline getirebiliyoruz. Bir sonraki yazıda ilk bundle'ımızı yazacağız, ama bu yazıyı bitirmeden önce; OSGi bundle'ları geliştirirken de temel prensibimiz olan birkaç kural vermek istiyorum. Bu kurallara göre, bir yazılım modülü aşağıdaki özelliklere sahip olmalıdır:<br />
<ul>
<li><b>Kendi içinde bir bütün: </b>Bir modül atomik bir parça değildir, içinde birçok sınıf, kaynak vs. olabilir. Ancak bir modül, kendi içinde mantıksal olarak bir bütündür.</li>
<li><b>Son derece konsantre: </b>Bir modül, birçok alakasız işi birlikte yapmamalıdır. Sadece tek bir mantıksal amaca odaklanmalı ve bu amacı doğru şekilde gerçekleştirmelidir.</li>
<li><b>Zayıf bir şekilde bağlı: </b>Bir modül diğer modüller tarafından kullanılırken kendi iç detaylarından bağımsız olarak kullanılmalıdır. Yani bir modül, diğer modülleri değiştirmeden kendi iç çalışma prensibini değiştirebilmeli ve diğerleri bundan etkilenmemelidir. Kısaca, bir modül mümkün olduğu kadar bağımsız olmalıdır.</li>
</ul>
Bu saydıklarımızı gerçekleştirmek için, geliştirdiğimiz modüllerin ustaca tasarlanmış arayüzler aracılığıyla kullanılmasını sağlamalıyız. Sonraki yazılarda da görebileceğimiz gibi, OSGi sayesinde bir API'yi, implementasyon detaylarını bilmeden tamamen arayüzü aracılığıyla kullanabiliyoruz. OSGi'de bunu gerçekleştirmemizi sağlayan Servis Katmanı'nı, büyük ihtimalle 1-2 yazı sonra sizlere anlatacağım. Bu arada son olarak OSGi için yapılan bir benzetmeyi aktarayım; VM içi SOA sistemi... Görüşmek üzere!Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-83401412413379353872010-01-31T04:45:00.000+02:002012-03-28T20:27:39.065+03:00OSGi ile Modüler Java Programlama - 1<br />
<br />
Merhabalar, bu blogda ilk önce İngilizce olarak yazılar yazmaya başlamıştım. Genelde İngilizce olarak çok fazla alıştırması olan konulara değinmekti amacım, ancak görünen o ki bizim ülkemizdeki programcıların ve/veya programcı adaylarının İngilizce'lerinin yeterli olmaması bu tür kaynakları takip etmelerini zorlaştırıyor. Bu sebeple bundan sonra Türkçe olarak bloglamaya devam ediyorum...<br />
<br />
Gelelim bu yazının konusuna, OSGi (oscii diye değil hecelenerek okunuyor)... Her ne kadar Java EE dağıtık uygulamalar geliştirmeyi yıllar önce vaadetmiş olsa da bunu başarabildiğini söylemek zor. Classpath'lerin ağaç şeklinde yukarıya doğru delegasyon yoluyla çalışması ve üst kattaki sınıfların aynı isimdeki alt kattakileri saklaması gibi sorunlar, uygulamalar büyüdükçe onları bir bakım cehennemine çevirebiliyordu. Daha da kötüsü, modüler sistemlerin çoğu dinamik değildi yani JVM'nin yeniden başlatılmasını gerektiriyordu. Bu konular aslında başlı başına birkaç yazıyı kaplayabilir ancak kısa ve öz olarak olaylar böyle gelişti. OSGi hakkında daha detaylı kaynak için Neil Bartlett'in blogunu ziyaret edebilir ve kendi çabalarıyla yazdığı e-kitabını ücretsiz indirebilirsiniz:<br />
<a href="http://neilbartlett.name/blog/osgi-articles">http://neilbartlett.name/blog/osgi-articles</a><br />
<br />
Yakın zamanda kendi geliştirdiğim SCORE isimli sunucu sistemini modüler hale getirmek için çalışmalara başlamıştım. Daha önce OSGi'ye göz gezdirmiştim. Aslında istediğim modülarizasyon çok basitti ancak birkaç yabancı programcının önerisiyle OSGi'ye tekrar bir şans vermeye karar verdim. Ve tada!.. Tam aradığım şeydi: dinamikti, tüm modüller kapanmadan modülleri açıp kapayabiliyor ya da silebiyordu. SCORE her ne kadar bir merkezi sunucu sistemi sunuyorduysa da farklı amaçlar için farklı sunucular şeklinde bir uygulamayı planlıyordum. Yani mesela sık kullanılan grafik dosyalarının disk yerine ram'de depolanması veya başka resim işlemleri için bir grafik işleme sunucusu gibi. Ancak OSGi ile bu sunucuları servis modülleri olarak uygulamak birçok sorunumu çözecek gibi. Başta modüller arası iletişim olmak üzere birçok sorunumu çözdü. Ben Java komünitesinin bir sürü kriptografik isimli framework'ler ve API'leri kullanmasını çok yanlış buluyorum. Bağımsızlık adına benzer yapılar farklı şekillerde farklı kütüphanelerde bulunabiliyor, çünkü bu kütüphaneler tek bir kurum tarafından değil kolektif bir şekilde komünite tarafından yazılıyor. Sonuç olarak da .NET Framework gibi kendi içinde tutarlılığı yok. Ancak OSGi öyle birşey ki başlı başına çoğu şeyin çözümü olacak gibi. Her ne kadar yeni bir teknoloji olsa da geleceğinin parlak olduğunu söylemek için kahin olmaya gerek yok. Neyse bu kadar OSGi çığırtkanlığı yeter, işe koyulalım...<br />
<br />
İlk iş olarak bir OSGi implementasyonu indirmeliyiz. Bu konuda seçeneğimiz çok sayılır. Her ne kadar kesin kurallar olmasa da her implementasyonun kendi avantajları var. Ben yazılarımda Eclipse'in implementasyonu olan Equinox'u kullanacağım. Apache Felix, Knopflerfish ve Concierge (sınırlı kaynağı olan ortamlar için) gibi diğer implementasyonlar da mevcut. Ancak bu yazı serisinde gösterdiklerim OSGi R4 uyumlu olacak, Concierge R3 kullanıyor bu sebeple Concierge kullanmanızı tavsiye etmiyorum. Equinox JBoss, WebSphere gibi sistemlerde kullanılıyor ve aynı zamanda Eclipse'in modüler yapısını sağlıyor. Belki de bu sebeple olsa gerek aynı zamanda en popüler OSGi implemenyasyonu. Equinox'u <a href="http://download.eclipse.org/equinox/">buradan</a> indirebilirsiniz. Bu yazıyı yazarken kullandığım versiyonu 3.5.1 sürümü. Eğer benim gibi bir IDE kullanıyorsanız ZIP formatlı dosyayı indirmeniz daha faydalı olacaktır.<br />
<br />
<h4>
Kurulum</h4>
Eğer zip dosyasını indirdiyseniz içindekileri bir klasöre açın ve plugins altklasöründe org.eclipse.osgi_3.5.1... ile başlayan JAR uzantılı dosyayı bulun. Eğer standalone versiyonunu indirdiyseniz bu zaten indirdiğiniz jar dosyasının ta kendisidir. Bu dosyanın bulunduğu klasörde bir komut satırı açın (Windows'da Shift + Sağ Tık yapınca açılan listede yer alıyor) ve yönetici yetkiniz olduğundan emin olun. Sonrasında aşağıdaki komutu yazın:<br />
<pre class="prettyprint">java -jar org.eclipse.osgi_3.5.1*.jar -console</pre>
Benim kullandığım versiyon 3.5.1 ancak siz kullandığınız versiyonla değiştirebilirsiniz komutun o bölümünü. Dosyanın tam adı karışık olduğu için versiyondan sonra * ekleyerek işimizi kolaylaştırdık. Eğer bu komuttan sonra karşınıza aşağıdaki gibi boş bir OSGi komut satırı geldiyse OSGi'yi başarıyla başlattık demektir:<br />
<pre class="prettyprint">osgi></pre>
<h4>
İlk komutumuz</h4>
OSGi'nin bir güzel yanı da hem programatik olarak implementasyonu kolay hem de komut satırından 5 tane komutla işlerinizin çoğunu halledebiliyorsunuz. Basit ama etkili yani, EJB'lerden sonra su serpiliyor insanın içine. OSGi'de modüllere modül yerine "bundle" deniyor yani Türkçe olarak basitçe paket diyebiliriz. Ancak genel konsepti iyice netleştirmek için ben "bundle"lara modül demeye devam edeceğim, kafalar karışmasın. OSGi komut satırı önümüzde olduğuna göre OSGi ortamından bir durum özeti raporu alalım, bu iş için komutumuz "ss" yani "summary status"ün baş harfleri:<br />
<pre class="prettyprint">osgi> ss</pre>
Karşınıza sadece 1 tane modül gelmesi lazım o da zaten OSGi çalışma ortamı. "State" alanının yani durumunun "active" olduğuna dikkat edin. Sonraki yazılarımda bu durumların ne demek olduğunu anlatacağım. Şimdilik bu kadar, kolay gelsin...Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-2037609124017910804.post-83775904101210304412009-10-16T22:05:00.000+03:002009-10-16T22:11:32.759+03:00Apache Buildr - A Brief Introduction<span style="font-size: small;"><b>What is Apache Buildr?</b></span><br />
<blockquote>Apache Buildr is a build system for Java-based applications, including support for Scala, Groovy and a growing number of JVM languages and tools. We wanted something that’s simple and intuitive to use, so we only need to tell it what to do, and it takes care of the rest. But also something we can easily extend for those one-off tasks, with a language that’s a joy to use. And of course, we wanted it to be fast, reliable and have outstanding dependency management. <i>--from <a href="http://buildr.apache.org/index.html">Apache Buildr project page</a>.</i> <br />
</blockquote> As it implies in the Buildr project page, Buildr is a easy-to-use build system made by developers who were tired of some other Java build tools (hmm like Ant, Maven?) . Actually as a former C# programmer i never liked the idea of build management with writing configuration files by hand, so i used Netbeans as my primary IDE for these kind of stuff. But then i decided to give Buildr a try. Probably because of its usage of Ruby and several statements of other developers who mentioned about drastic decrease of line required to build a Java app with Buildr in contrast to Ant/Maven.<br />
<br />
<span style="font-size: small;"><b>Installation</b></span><br />
Apache Buildr's project documentation has described installation process well so i will only demonstrate the installation on Windows Vista Business (my primary OS), but if you encounter a problem with installation on other OS's, let me know so maybe i can figure it out.<br />
Let's start then, go to the <a href="http://rubyinstaller.org/">http://rubyinstaller.org/</a> and download the One-Click Installer (Windows). When download finished, run the executable and follow installation steps (be sure to check RubyGems component). I assume you already have JAVA_HOME environment variable set to JDK installation directory, if not set it. After installation finished, open command line and write:<br />
<pre class="winCmd">gem update --system</pre> This command will upgrade your Ruby Gems to the latest version if it's not already. Dependencies of upgrade process will require your permission. After upgrade process is finished we can install Buildr now:<br />
<pre>gem install buildr</pre> This will install Apache Buildr.Buildr uses a <i>Buildfile</i>, a build script for storing information about projects Buildr is building. To verify your Buildr installation and create a buildfile by running Buildr for the first time:<br />
<pre class="winCmd">buildr</pre> Command creates an app directory like "C:/Users/<i>user_name</i>/.buildr". And also ask you if you want Buildr to create a new buildfile in the current directory. You can enter 2 to cancel this so you can create a new sample folder like i did. After you're ready enter 1 to start creating a buildfile. This will create a project with the same folder name, to list all your projects type:<br />
<pre class="winCmd">buildr help:projects</pre> I hope this post will be helpful for who want to try Buildr. You can play with Buildr features or go to the <a href="http://buildr.apache.org/quick_start.html">Apache Buildr Quickstart</a> for more details. It looks like i will be using Buildr for a long time so if you liked this article let me know so i can add more. See you later ;)Unknownnoreply@blogger.com0