tag:blogger.com,1999:blog-72422774456547421002024-02-20T16:39:41.232+03:00Ucundan JavaJava Enterprise ile ilgili anlatılarım, deneyimlediklerim ve paylaşmak istediklerim...Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.comBlogger56125tag:blogger.com,1999:blog-7242277445654742100.post-79739333575603569612012-10-25T09:45:00.000+03:002012-10-25T09:46:30.795+03:00PrimeFaces Datatable Column Custom Sorting<div style="text-align: left;">
Popüler JSF kütüphanesi PrimeFaces'ın geliştiriciye yetenekli JSF bileşenleri sunduğu aşikar. Bu yeteneklerinin çoğunu <a href="http://primefaces.org/showcase-labs/">showcase</a> sayfasında sergilese de gözden kaçan gizli kalmış yeteneklerini de her zaman elinizin altında bulunması gereken kapsamlı dökümanını inceleyerek yakalayabilirsiniz.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Bunlardan biri de datatable bileşeninin sıralama yeteneğinde saklı. Basitçe kullanıcılarınızı ilk isimleri ile sıralamak istediğinizde işinize yarayacak aşağıdaki örnek, kullanıcının tam ismine göre sıralama yapmak istediğinizde elinizi bağlıyor:</div>
<div style="text-align: left;">
<br /></div>
<pre class="brush:xml"><p:column width="100" sortBy="#{user.firstName}" >
<f:facet name="header">
<h:outputText value="Kullanici ismi" />
</f:facet>
<h:outputText value="#{user.firstName}" />
</p:column>
</pre>
<div style="text-align: left;">
<br />
Yukardaki örnekte <i>sortBy="<b>#{user.firstName} #{user.lastName}</b>" </i>yapmamıza izin verilmiyor. Hemen akla kullanıcı tam ismini döndüren bir getter metot yazarak <i>sortBy="<b>#{user.fullName}</b>" </i>yapmak akıllara gelebilir. Bu metot iki kolonu concat ederek bize tam ismi döndürmesi açısından kullanışlı olsa da ne var ki veri erişim katmanında Hibernate gibi bir kütüphane kullanıyorsanız buna da izin yok. Hibernate veritabanında ilişkilendirebileceği <b>fullName</b> isimli kolon bulamadığı için şikayet ediyor.<br />
<br />
Bu aşamada yardımımıza datatable bileşeninin <i style="font-weight: bold;">sortFunction</i> yeteneği yetişiyor:<br />
<br />
<pre class="brush:xml"><p:column width="100" sortBy="#{user.firstName}" sortFunction="#{userBean.fullNameSorter}" >
<f:facet name="header">
<h:outputText value="Kullanici ismi" />
</f:facet>
<h:outputText value="#{user.fullName}" />
</p:column>
</pre>
<br />
<i>userBean </i>managedbean'i içinde metodun gerçekleştirimi de şu şekilde basit bir <i>compare </i>işlemi ile halledilebilir:<br />
<br />
<pre class="brush:java">public int fullNameSorter(User user1, User user2){
Collator trCollator = Collator.getInstance(new Locale("tr","TR"));
return trCollator.compare(user1.getFullName(), user2.getFullName());
}
</pre>
<br />
Bol Javalar..</div>
Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com2tag:blogger.com,1999:blog-7242277445654742100.post-43780354953311547392012-08-06T21:44:00.001+03:002012-08-06T21:44:54.680+03:00Maven-Jetty Plugin ve EL ile Method Expression'lara Parametre Geçme<pre class="brush:xml">
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty-maven-plugin.version}</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<stopPort>8075</stopPort>
<stopKey>STOP</stopKey>
</configuration>
<dependencies>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>el-impl</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
</plugin>
</pre>
Bu kadar..Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-16999868127980101262012-07-26T00:17:00.000+03:002012-07-26T00:17:28.219+03:00JSF MyFaces ve Spring CoreUzunca bir süre projelerimizde ve JSF eğitimlerimizde JSF'in referans gerçekleştirimi olan Mojarra'yı kullandık. Referans gerçekleştirimi olmasına rağmen Mojarra'da yer alan hatalar ve MyFaces gerçekleştirimine kıyasla yavaş çalışması sonucu yeni projelerimizde MyFaces kullanmaya karar verdik.<br />
<br />
Basitçe bu geçişi Mojarra'nın <i>api </i>ve <i>impl</i> .jar'larını MyFaces'inkilerle değiştirerek yapabiliyorsunuz. Lakin MyFaces, Mojarra'ya göre bazı noktalarda farklı davranabiliyor. Bu davranışı da web.xml'de ekleyebileceğiniz çeşitli context-param'larla düzenleyebiliyorsunuz.<br />
<br />
MyFaces JSF'i Spring ile kullanırken karşılaştığımız bir farklılık da viewScope tanımlı <i>managedBean </i>niteliklerine bağımlılık aktarımı yapılan Spring bean'lerin ikinci istekte null değerler almasıydı. Bunun sebebi de MyFaces'in varsayılan olarak session'daki JSF state'ini her defasında serialize/deserialize etme çabasıydı. İkinci istek işlenirken deserialize yapılan JSF beanlerine Spring beanleri aktarılamadığı için <i>NullPointerException</i> hatası alıyorsunuz.<br />
<br />
<br />
<pre class="brush:xml"><context-param>
<param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
<param-value>false</param-value>
</context-param>
</pre>
<br />
<br />
şeklinde yazılan context-param değeri bu sıkınıtının önüne geçiyor. Buna benzer MyFaces parametrelerin listesini buradan inceleyebilirsiniz..Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-68051488274492946652012-06-04T14:10:00.000+03:002012-06-04T14:10:09.347+03:00OmniFacesJSF ile haşır neşir olup da <a href="http://balusc.blogspot.com/" target="_blank">BalusC</a>'yi duymayan yoktur herhalde. Forumlarda, özellikle <a href="http://stackoverflow.com/">stackoverflow.com</a>'da yanıtlanmayan JSF sorusu kalmayacak diye inat etmiş Balus ve bir arkadaşı (<span style="background-color: white; font-family: 'lucida sans unicode', tahoma, arial, helvetica, sans-serif; font-size: 12px; line-height: 15px; text-align: justify;">Arjan Tijms</span>) JSF'in eksikliklerini masaya yatırıp bunları nasıl yamarız diye düşünürlerken olsa gerek geçen günlerde <a href="https://showcase-omnifaces.rhcloud.com/" target="_blank">OmniFaces</a>'in ilk sürümünü yayınladılar.<br />
<br />
Showcaselerinde PrimeFaces kullanan ekibin çalışmasına göz attığımda JSF'te can sıkan, baş ağrıtan belli başlı sorunlara pratik çözümler getirmelerinin yanı sıra bizim de "Bunları bir kütüphane haline getirsek de projelerde tekrar tekrar yazmasak" dediğimiz ama bir türlü fırsat bulamadığımız, her JSF projesinin olmazsa olmaz metotlarını da OmniFaces'a eklediklerini gördüm.<br />
<br />
Session öldüğünde Ajax istemiyle geldiğinde alınan ViewExpiredException hatasına getirilen çözüm (<a class="code" href="https://showcase-omnifaces.rhcloud.com/showcase/exceptionhandlers/FullAjaxExceptionHandler.xhtml" style="background-color: white; color: #4f4f4f; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; font-weight: bold; line-height: 15px; outline: none; padding: 1px 0px;">FullAjaxExceptionHandler</a>), script ve style dosyalalarını birleştirerek HTTP requestlerini azaltmayı hedefleyen <a class="code" href="https://showcase-omnifaces.rhcloud.com/showcase/resourcehandlers/CombinedResourceHandler.xhtml" style="background-color: white; color: #4f4f4f; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; font-weight: bold; line-height: 15px; outline: none; padding: 1px 0px;">CombinedResourceHandler</a>, <a class="code" href="https://showcase-omnifaces.rhcloud.com/showcase/converters/SelectItemsConverter.xhtml" style="background-color: white; color: #4f4f4f; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; font-weight: bold; line-height: 15px; outline: none; padding: 1px 0px;">SelectItemsConverter</a>, <a class="code" href="https://showcase-omnifaces.rhcloud.com/showcase/validators/RequiredCheckboxValidator.xhtml" style="background-color: white; color: #4f4f4f; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; font-weight: bold; line-height: 15px; outline: none; padding: 1px 0px;">RequiredCheckboxValidator</a>, form validation mekanizmasına getirdikleri <a class="code" href="https://showcase-omnifaces.rhcloud.com/showcase/validators/validateAllOrNone.xhtml" style="background-color: white; color: #4f4f4f; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; font-weight: bold; line-height: 15px; outline: none; padding: 1px 0px;">validateAllOrNone</a>, <a class="code" href="https://showcase-omnifaces.rhcloud.com/showcase/validators/validateOneOrMore.xhtml" style="background-color: white; color: #4f4f4f; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; font-weight: bold; line-height: 15px; outline: none; padding: 1px 0px;">validateOneOrMore</a> vb. yapılar, sıklıkla kullanılan işlevleri util sınıfı ve EL fonksiyonu olarak toparlamaları kütüphanenin ilk dikkat çeken özellikleri.<br />
<br />
Kapattığı boşluklar ve karşıladığı küçük ihtiyaçlarla elimin altında olsun her JSF projesinde kullanırım diyeceğiniz bir çalışma olmuş. Göz atmanızda fayda var.Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-79465367363612493702012-03-22T14:21:00.000+02:002012-03-22T14:21:05.362+02:00PrimeFaces ve Security KullanımıWeb projelerinde güvenlik olmazsa olmaz özelliklerden biri. Bu özelliği basitçe web.xml içerisinden yapılan güvenlik ayarlarıyla sunucunuz yardımıyla sağlayabileceğiniz gibi Spring Security benzeri çözümler de sundukları seçeneklerle daha çok tercih edilir durumda.<br />
<br />
Her ne kadar erişim ayarları yapılırken tüm içeriğin giriş yapmayan kullanıcı için kısıtlanması tercih edilen yöntem ise de başta "giriş sayfası" olmak üzere benzer sayfalara ve bunların kullandığı kaynaklara erişim izni verilmesi gerekir. Giriş sayfasında PrimeFaces bileşeni kullanıyorsanız sayfanızın erişmeye çalışacağı ve erişim izni olmadığı için de kullanamayacağı başlıca adres "<b>/javax.faces.resource/*</b>" olacaktır.<br />
<br />
PrimeFaces ile yazılmış bu gibi sayfaların kullanıcı giriş yapmadan düzgün bir şekilde görüntülenmesi için yukardaki adresin güvenlik ayarlarınızda erişime açılmış olması gerekmektedir.<br />
<br />
web.xml içerisinde örnek bir güvenlik kısıtlaması şu şekilde yapılmalıdır:<br />
<br />
<pre class="brush:xml"> <security-constraint>
<display-name>excluded</display-name>
<web-resource-collection>
<web-resource-name>All Access</web-resource-name>
<url-pattern>/javax.faces.resource/*</url-pattern>
</web-resource-collection>
</security-constraint>
<security-constraint>
<display-name>Default Security Constraint</display-name>
<web-resource-collection>
<web-resource-name>Default</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>ROLE_ADMINISTRATOR</role-name>
</auth-constraint>
</security-constraint>
</pre>
<br />
Aynı şekilde Spring Security kullandığınız bir projede erişim ayarları şu şekilde yapılabilir:<br />
<br />
<pre class="brush:xml"> <intercept-url pattern="/javax.faces.resource/**" filters="none" />
<intercept-url pattern="/**" access="ROLE_ADMINISTRATOR" />
</pre>
<br />
Erişim kısıtlarını kendi geliştirdiğiniz bir yöntemle ele alıyorsanız PrimeFaces sayfaları için bu hususu umutmamanızda fayda var..Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-61301675803010663592012-03-21T08:25:00.001+02:002012-03-21T08:25:22.658+02:00JSF'te ActionListener / Action Çağrılma SırasıJSF'e yeni başlayan birinin gün olur aklına düşen bir sorudur: commandButton ile ilişkilendirdiğim actionListener'lar ve action hangi sırada çağırılır.<br />
<br />
Öncelikle, hatırlatma niteliğinde;<br />
<br />
- Bir command bileşenine birden fazla actionListener yazabiliyorken sadece bir action yazabileceğinizi<br />
- action ile bağlanan metotta döndürdüğünüz String ile sayfa yönlendirme işlemi yapabileceğinizi (void ya da "return null;" olursa aynı sayfada kalır) fakat actionListener metotlarında bu özelliğin olmadığını<br />
- actionListener metodunun "ActionEvent" parametresi alabileceğini, action'a bağlanan metota ise el-2.2.jar'dan itibaren <i>Expression Language</i> ile istediğiniz parametreyi geçebileceğinizi<br />
<br />
belirteyim.<br />
<br />
Çağırılma sırasını ise <a href="http://www.linkedin.com/pub/yigit-darcin/4/51/a59" target="_blank">Yiğit Darçın</a> bizim için hemencecik test etmiş ve <a href="http://yigitdarcin.wordpress.com/2012/03/21/action-and-actionlistener-orders-in-jsf/" target="_blank">blogunda</a> yayınlamış. Test edip deneyimlemekten üşenenler faydalanabilir ;)Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-15007349864556177272011-12-24T10:44:00.000+02:002011-12-24T10:44:50.167+02:00equals() Metodu Nasıl YazılmalıYeni mezun meslektaşlarımızın List, Map, Set türevi veri yapılarında nesneleri konumlandırdıkları zaman nesnelerin equals ve hashCode metotlarını hazırlamamaları yaygın bir unutkanlıktır. List bileşenine koydukları nesne nedense <i>contains()</i> kontrolünde kaybolur. Sorunun çözümünü de benzer olayları önceden yaşamış ve kaynağını az çok tahmin eden tecrübeli yazılım geliştiricen gelir. <i>equals </i>ve <i>hashCode</i> metotlarının sınıf için gerçekleştirimi unutulmuştur. List ve Set sınıfları barındırdıkları nesnelerin eşitliğini bu iki metodu kullanarak kontrol ederler<br />
<br />
Ne var ki <i>equals ve hashCode </i>metotları tecrübeli geliştiriciler tarafından bile olması gerektiği gibi hazırlanmıyor. Bu yazımda "Effective Java" kitabında yer alan "Item 8: Obey the general contract when overriding equals" bölümüne referans göstererek ideal bir <i>equals</i> metodunun nasıl olması gerektiğine değineceğim.<br />
<br />
İlk uyulması gereken kural basit. "En iyi kod yazılmamış kodtur" ilkesini benimsemiş gibi: Eğer sınıfın her bir nesnesi <i>sadece</i> kendisiyle eşit olacak ise, yani <i>sadece aynı bellek alanına referans gösteren</i> değişkenler birbirleriyle eşit olacak ise sınıfta <i>equals </i>metodu yazmayın. Her Java sınıfının türediği <i>Object</i> sınıfının <i>equals</i> metodu bu bellek kontrolünü üstlenmiş durumda zaten. Böyle bir durumu oluşturabilecek senaryolar ise şu şekilde listeleniyor:<br />
<br />
<br />
<ul>
<li><b>Sınıfın değerleri üzerinden işlevsel bir eşitlik gerektirmiyorsa:</b> Örneğin <i>java.util.Random</i> sınıfının görevi rasgele sayılar üretmektir. İki <i>Random</i> sınıfının birbirine eşit olup olmaması işlevsel bir eşitlik kontrolü gerektirmez.</li>
<li><b>Atasınıfın (<i>superclass</i>)<i> </i>ihtiyacı karşılayacak şekilde gerçekleştirilmiş halihazırda bir <i>equals </i>metodu varsa: </b>Çoğu <i>Set</i> gerçekleştirimi <i>AbstractSet</i>, <i>List </i>gerçekleştirimleri ise <i>AbstractList</i> atasınıfının <i>equals</i> metodunu kullanır.</li>
<li><b>Eğer sınıf private ve package-private ise ve sınıflar üzerinde eşitlik kontrolü yapılmayacağı kesinse</b></li>
<li><b>Sınıfın sadece yaratılmış tek bir olgusu olacak ise: </b>Singleton sınıflar</li>
</ul>
<div>
Özetle sınıfımızın eşitliği, barındırdığı değişkenlerin değerleri üzerinden anlam ifade ediyorsa ve atasınıfta bu değerler üzerinden eşitlik kontrolünü sağlayacak metot yoksa sınıfımız için bir <i>equals</i> metodu yazmalıyız.</div>
<div>
<br /></div>
<div>
Peki ideal bir <i>equals </i>nasıl olmalı? Matematik derslerinden hatırlayacağımız aşağıdaki 5 kriteri de karşılamalı:</div>
<div>
<br /></div>
<div>
<ul>
<li><b>Dönüşlü: </b><i>null </i>olmayan her x değeri için <i>x.equals(x)</i>'in sonucu <i>true</i> olmalı.</li>
<li><b>Simetrik: </b><i>null </i>olmayan her x, y değerleri için <i>x.equals(y) </i>sadece <i>y.equals(x)</i> sonucu <i>true ise </i>true olmalı.</li>
<li><b>Geçişli:</b> <i>null </i>olmayan her x, y, z değerleri için <i>x.equals(y) </i>ve<i> y.equals(z) </i>sonuçları <i>true</i> ise <i>x.equals(z)</i> sonucu da <i>true</i> olmalı.</li>
<li><b>Tutarlı: </b>eşitlik kontrolünde kullanılan değişkenlerin değerleri değişmediği sürece <i>x.equals(y)</i> sonucu her zaman ya hep <i>true </i>ya da hep <i>false </i>olmalı.</li>
<li><i>null </i>olmayan her x için <i>x.equals(null)</i> sonucu hep <i>false</i> olmalı</li>
</ul>
<div>
Bu eğlenceli matematiksel kriterleri sağlayamayan her <i>equals</i> metodu uygulamamızda sıkıntı yaratacak ve hatanın kaynağı bulmak da belki uzunca bir süre mümkün olmayacaktır. Bu kriterlere biraz yakından bakalım:</div>
<div>
<br /></div>
<div>
<b><br /></b></div>
<div>
<b>Dönüşlü</b></div>
<div>
Basitçe, her bir nesne kendisine eşit olmalı. Bu kriteri bozacak bir gerçekleştirimde, List'e eklediğimiz nesnemizi <i>contains</i> metoduyla sorguladığımızda karşılaşacağımız sonuç olumsuz olacaktır.</div>
<div>
<br /></div>
<div>
<b>Simetrik</b></div>
<div>
Simetri kriterini aşağıdaki örnek kod kırıyor. (Örnek kodlar Effective Java kitabından alınmıştır):</div>
<div>
<br /></div>
<div>
<div class="column">
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt; font-weight: 700;">// Broken - violates symmetry!
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> public final class CaseInsensitiveString {
private final String s;
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> public CaseInsensitiveString(String s) {
if (s == null)
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> throw new NullPointerException();
this.s = s;
</span></pre>
<span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">}
</span><br />
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt; font-weight: 700;"> // Broken - violates symmetry!
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> @Override public boolean equals(Object o) {
if (o instanceof CaseInsensitiveString)
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> return s.equalsIgnoreCase(
((CaseInsensitiveString) o).s);
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt; font-weight: 700;"> if (o instanceof String) // One-way interoperability!
return s.equalsIgnoreCase((String) o);
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> return false;
}
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> ... // Remainder omitted
}
</span></pre>
<pre>
</pre>
<pre> </pre>
<pre><span style="font-family: LucidaSans; font-size: 9pt;">CaseInsensitiveString cis = new CaseInsensitiveString("Polish");</span><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">String s = "polish";
</span><br />
</pre>
</div>
</div>
<div>
</div>
</div>
<div>
Burada <i>cis.equals(s)</i> kontrolü <i>true </i>dönerken <i>s.equals(cis)</i> kontrolü ise <i>false </i>değerini dönecektir. Problemin kaynağı <i>CaseInsensitiveString </i>sınıfının <i>equals</i> metodu, karşılaştırmayı büyük/küçük harf ayırtmaksızın yaparken, <i>String</i> sınıfının <i>equals</i> metodunun bu ayrımı yapmamasından kaynaklanmaktadır.</div>
<div>
<br /></div>
<div>
<pre><span style="font-family: LucidaSans; font-size: 9pt;">List<caseinsensitivestring> list = new ArrayList<caseinsensitivestring>();
</caseinsensitivestring></caseinsensitivestring></span></pre>
<pre><span style="font-family: LucidaSans; font-size: 9pt;">list.add(cis);
</span></pre>
<pre><span style="font-family: LucidaSans;"><span style="font-size: 12px;">
</span></span></pre>
</div>
<div>
Yukarıdaki gibi bir senaryoda yapılan <span style="font-family: LucidaSans; font-size: 9pt;">list.contains(s) </span>kontrolü kodun üzerinde çalıştığı Java gerçekleştirimine göre true ya da false dönebilir. "Benim bilgisayarımda çalışıyordu" dememek için hastalıklı kodu düzeltmeliyiz. Karşılaştırmada String sınıfı aradan çıkartılmalı:</div>
<div>
<br /></div>
<div>
<div class="column">
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">@Override public boolean equals(Object o) {
return o instanceof CaseInsensitiveString &&
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> ((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
</span></pre>
<span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">} </span><br />
</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<b>Geçişli</b></div>
<div>
Bu kriteri kırmak da çok zor değil. <i>Point </i>sınıfından türeyen bir <i>ColorPoint </i>sınıfında koordinatlara ek olarak getirilen renk değişkeni <i>equals </i>metoduna eklenince olanlar oluyor:</div>
<div>
<br /></div>
<div>
<div class="column">
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">public class Point {
private final int x;
private final int y;
public Point(int x, int y) {
</span></pre>
<span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">this.x = x;
</span><br />
<span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">this.y = y;
}
</span><br />
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> @Override public boolean equals(Object o) {
if (!(o instanceof Point))
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> return false;
Point p = (Point)o;
return p.x == x && p.y == y;
</span></pre>
<span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">}
</span><br />
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> ... // Remainder omitted
}
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">
</span></pre>
<pre><div class="column">
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">public class ColorPoint extends Point {
private final Color color;
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> public ColorPoint(int x, int y, Color color) {
super(x, y);
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> this.color = color;
}
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> ... // Remainder omitted
}
</span></pre>
</div>
</pre>
</div>
</div>
<div>
<div class="column">
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt; font-weight: 700;">// Broken - violates transitivity!
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> @Override public boolean equals(Object o) {
if (!(o instanceof Point))
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> return false;
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt; font-weight: 700;"> // If o is a normal Point, do a color-blind comparison
if (!(o instanceof ColorPoint))
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt; font-weight: 700;"> return o.equals(this);
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> // o is a ColorPoint; do a full comparison
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;"> return super.equals(o) && ((ColorPoint)o).color == color;
}
</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">
</span></pre>
<pre> <pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">ColorPoint p1 = new ColorPoint(1, 2, Color.RED);
Point p2 = new Point(1, 2);</span></pre>
<pre><span style="font-family: 'LucidaSans'; font-size: 9.000000pt;">ColorPoint p3 = new ColorPoint(1, 2, Color.BLUE);</span></pre>
</pre>
</div>
</div>
<div>
p1 ile p2, p2 ile p3 birbirlerine eşit iken p1 ile p3 birbirine eşit olmalıyken maalesef eşitlik kontrolü bize <i>false</i> değerini dönecektir. Java kütüphanesinde bu kriteri kıran sınıflar bulmak mümkün. Örneğin <i>Date </i>ve <i>Timestamp</i> sınıfları. Ayrıntılı değerlendirmeyi "Effective Java" kitabından edinebilirsiniz. </div>
<div>
<br /></div>
<div>
Bu sorun için çözüm ise gene bir Object Oriented tasarım ilkesini adres gösteriyor. "is-a ilişkisi yerine has-a" ilişkisi kullanmak. <i>Point </i>sınıfından <i>ColorPoint</i> sınıfı türetmek yerine <i>ColorPoint </i>sınıfı içerisinde <i>Point</i> sınıfının referansını barındırsın.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<b>Tutarlılık</b></div>
<div>
Eşitlik kontrolü yapılacak değişkenler her zaman tutarlı değerlere sahip olmalıdır. Örneğin <i>java.net.URL</i> sınıfının eşitlik kontrolü IP adresi ile ilişkilendirilen <i>host name</i> değişkeni üzerinden yapılıyor. Bu yüzden ağ erişiminin yanı sıra <i>host name</i> ile ilişkilendirilmiş IP adresi de değişebilir. Sağlıklı bir karşılaştırma her zaman yapılamayacaktır.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Equals metodu için bu olmazsa olmazların yanında sorguyu hızlandıracak ve kesirli değerler için<i> equals </i>yerine <i>Float.compare() </i>ya da <i>Double.compare() </i>kullanmanız gerektiğini söyleyen bir çok minik ipucunu "Effective Java" kitabında bulabilirsiniz. Kitabın Java ile geliştirim yaparken dikkat edilmesini önerdiği diğer konular da her Java geliştiricisi tarafından sindirilip kod yazarken uygulanmalı. Kitaptan bir tane edinin derim :)</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-89715870872113226932011-11-25T07:45:00.001+02:002011-11-26T13:56:34.138+02:00JSF ve Spring Security ile Önceden Kimlik Kontrolü Yapılmış Kullanıcı için Login Sayfasının Tekrar GösterilmemesiBaşlık biraz uzun oldu ama anlatacağım konuyu başlıkta ancak bu kadar özetleyebildim. Özetin açıklamasını yapmaya çalışırsak: web uygulamasına giriş yapmış, yani kimliğini doğrulatmış bir kullanıcı, belirli sayfalara istekte bulunduğunda (örneğin login sayfası için tekrar istek gönderirse) zaten yetkilendirildiğini belirleyip isteği başka bir sayfaya yönlendirmek (örneğin login sayfasından sonra gösterilecek index sayfasına) istiyoruz.<br />
<br />
Spring Security'de bu işin kolay yolu var mıdır diye küçük bir araştırma yaptık ama ya doğru kelimeleri yine bulamadık ki blog başlığı seçerken de yaşadım aynı sıkıntıyı ( :) ) ya da diğerler geliştiriciler böyle bir gereksinime ihtiyaç duymamışlar. İlki seçenek akla daha yatkın..<br />
<br />
Çalışma arkadaşım <a href="http://www.basrikahveci.com/" target="_blank">Basri Kahveci</a>'nin önerdiği ve bir projede uyguladığı yöntem de aklıma yatmayınca (Çalışıyor ama biraz kulağı tersten tutmak gibiydi :)) Küçük bir "Nasıl yapabiliriz?" düşünmesinin ardından aslında basit bir JSF <i>PhaseListener</i> kullanarak yapılabileceğini farkettim.<br />
<br />
Bildiğiniz üzere JSF yaşam döngüsü temel olarak 6 adımdan oluşur (Yaşam döngüsünü detayıyla incelemek isterseniz <a href="http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html" target="_blank">BalusC</a> bu konuda emek harcamış):<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-x_f3QIXkeTE/Ts8yezUM0AI/AAAAAAAABaw/UW43A2L_oHo/s1600/jsf-request-processing-lifecycle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="108" src="http://2.bp.blogspot.com/-x_f3QIXkeTE/Ts8yezUM0AI/AAAAAAAABaw/UW43A2L_oHo/s320/jsf-request-processing-lifecycle.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Kısaca hatırlamak gerekirse <i>Request parametresi</i> barındıran bir istek bu 6 adımdan geçerek kullanıcıya hedef sayfa döndürülür. Bir sayfaya yapılan ilk istek, yani parametre barındırmayan bir istek ise ilk adımdan sonra yaşam döngüsünü dolaşmak yerine <i>Render Response</i> adımına yönlendirilip kullanıcının istediği sayfa gösterilir. Her adımda gerçekleşen işlemleri isterseniz başka bir blog girdisinde bahsederiz.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
JSF bize bu adımların arasına girebilmek için <i><a href="http://docs.oracle.com/cd/E17824_01/dsc_docs/docs/jscreator/apis/jsf/javax/faces/event/PhaseListener.html" target="_blank">PhaseListener</a> </i>interface'ini kullanıma sunuyor. Görüldüğü gibi PhaseListener'da 3 metot mevcut. İkisi yaşam döngüsü adımlarının herbirine girerken ve herbirinden çıkarken işletilecek kodları barındırırken, üçüncü metot da hangi adımda bu listener'ın çalıştırılması gerektiğini belirtmemize olanak sağlıyor. Bu metotta <i>PhaseId.ANY_PHASE </i>gibi bir değer döndürerek her bir adım için listenerın tetiklenmesini sağlayabileceğimiz gibi <i>PhaseId.RENDER_RESPONSE</i> benzeri bir değerle belirli bir adımda tetiklenmesini de sağlayabiliyoruz.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Bizim senaryomuzda da login sayfamız render olmadan önce bir PhaseListenerın tetiklenmesini sağlayarak, kullanıcının önceden sisteme giriş yapıp yapmadığını belirleyip gerekiyorsa başka bir sayfaya yönlendirme işlemini yapmak mümkün:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<pre class="brush:java">public class AuthPhaseListener implements PhaseListener {
@Override
public void afterPhase(PhaseEvent event) {
}
@Override
public void beforePhase(PhaseEvent event) {
User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if(user != null){
FacesContext.getCurrentInstance().getExternalContext().redirect("main");
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}
</pre>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<i>beforePhase() </i>metodu içinde Spring Security'nin <i>SecurityContextHolder'ı</i> ile sessionda kayıtlı bir kullanıcı olup olmadığını kontrol ettik. Eğer bir kullanıcı nesnesi elde edebiliyorsak <i>FacesContext</i> ile de basitçe yönlendirme işlemini yapıyoruz.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Geriye yazdığımız bu listener sınıfını projemize entegre etmeye geldi. Eğer listener tanımını <i>faces-config.xml</i> içerisinde yaparsak her sayfa için işletilecek yaşam döngüsünde sınıfımız tetiklenecektir. Bizim istediğimiz sadece login sayfasında bunu tetiklemek. O yüzden tanımı listenerı kullanmak istediğimiz sayfa bazında yapmamız gerekli. JSF sayfamıza şu tag'i eklemek yeterli:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<pre class="brush:xml"><f:phaseListener type="com.prime.dasgin.AuthPhaseListener"/>
</pre>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
JSF kullanılmayan projelerde benzer bir mantık web.xml'de tanımlanan <i>Servlet Filter</i>'lar ile de gerçekleştirmek mümkündür. Login sayfasına yapılacak olan bir istekte devreye girecek bir <i>Filter</i> tanımlamak ve benzer bir süreci içinde işletmek sorunu çözer.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com1tag:blogger.com,1999:blog-7242277445654742100.post-19560308972949501632011-10-16T18:22:00.000+03:002011-10-16T18:22:08.309+03:00MySQL'in String karşılaştırmasıVar olan bir projeye sonradan katıldıysanız ya da proje ekibinizde veritabanı işlerini yöneten bir takım arkadaşınız varsa MySQL'in string karşılaştırmasının nasıl çalıştığı ile ilgili bilginiz olmayabilir. Ve vakit gelip de yeni bir projenin veritabanını oluşturma ihtiyacı duyduğunuzda ve iş başa düştüyse MySQL karakter encoding ve string karşılaştırmayla ilgili anlatacağım bu konu size zaman kazandıracaktır.<div>
<br /></div>
<div>
MySQL'de nonbinary string tipleri (char, varchar, text) büyük küçük harf ayırmaksızın karşılaştırılır. Örneğin <i>username like 'admin' </i>gibi bir sorgu koşulunda dönen sonuçlar içinde username'i <i>admin, ADmin, ADMIN, vb.</i> olan kayıtlar da getirilecektir.</div>
<div>
<br /></div>
<div>
Böyle bir sonucu engellemek için ya veritabanı oluşturulurken <i>schema</i> tanımının <i>collation</i> tipini ya da sorunu yaşadığınız kolonun <i>collation</i> tipini binary olacak şekilde ayarlamanız gerekiyor:</div>
<div>
<br /></div>
<div>
<span class="Apple-style-span" style="background-color: #f7f7f7; font-family: arial, FreeSans, Helvetica, sans-serif; font-size: 14px; line-height: 20px;">CREATE DATABASE mobileme CHARACTER SET utf8 COLLATE <b>utf8_bin</b>;</span></div>
<div>
<span class="Apple-style-span" style="background-color: #f7f7f7; font-family: arial, FreeSans, Helvetica, sans-serif; font-size: 14px; line-height: 20px;"><br /></span></div>
<div>
<span class="Apple-style-span" style="background-color: #f7f7f7; font-family: arial, FreeSans, Helvetica, sans-serif; font-size: 14px; line-height: 20px;">ya da</span></div>
<div>
<span class="Apple-style-span" style="background-color: #f7f7f7; font-family: arial, FreeSans, Helvetica, sans-serif; font-size: 14px; line-height: 20px;"><br /></span></div>
<div>
<span class="Apple-style-span" style="background-color: #f7f7f7; font-family: arial, FreeSans, Helvetica, sans-serif; font-size: 14px; line-height: 20px;">ALTER TABLE table_name MODIFY username VARCHAR(25) CHARACTER SET utf8 COLLATE <b>utf8_bin</b>;</span></div>
<div>
<span class="Apple-style-span" style="background-color: #f7f7f7; font-family: arial, FreeSans, Helvetica, sans-serif; font-size: 14px; line-height: 20px;"><br /></span></div>
<div>
<br /></div>
<div>
Varolan schema'da böyle bir sıkıntınız varsa tüm schema'nın <i>collate</i> tipini değiştirmek için aşağıdaki sorgunun ürettiği sorgucukları işletmeniz yeterli:</div>
<div>
<br /></div>
<div>
<span class="Apple-style-span" style="background-color: #f7f7f7; font-family: arial, FreeSans, Helvetica, sans-serif; font-size: 14px; line-height: 20px;">SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET utf8 COLLATE <b>utf8_bin</b>;') as stmt<br />FROM `information_schema`.`TABLES` t<br />WHERE 1<br />AND t.`TABLE_SCHEMA` = '<b>schema_name</b>'<br />ORDER BY 1;</span></div>
<div>
<span class="Apple-style-span" style="font-family: arial, FreeSans, Helvetica, sans-serif;"><span class="Apple-style-span" style="font-size: 14px; line-height: 20px;"><br /></span></span></div>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-20308204872707098772011-04-25T10:25:00.000+03:002011-04-25T10:25:20.654+03:00Türkçe Maven Rehberi"<a href="http://kahveninhatiri.blogspot.com/">Kahvenin Hatırı</a>" adlı blogta Sonatype'ın Maven belgelerinin Türkçe'ye çevrilmiş hallerine ulaşabilirsiniz. Son blog girdilerinde Maven ile ilgili örnekler de mevcut. Emeği geçen arkadaşa teşekkür ederiz:<br />
<br />
<a href="http://kahveninhatiri.blogspot.com/2011/04/turkce-maven-rehberi.html">http://kahveninhatiri.blogspot.com/2011/04/turkce-maven-rehberi.html</a>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-28692122062807600162011-04-17T12:39:00.002+03:002011-04-17T12:40:05.034+03:00JSF 2.0 ve Composite ComponentsJSF 1.2 ve Facelets ile halihazırdaki bileşenleri biraraya getirip yeni bir <i>tag </i>yaratarak tek bir bileşen olarak kullanabiliyorduk. Bunun için izlenen adımlar:<br />
<br />
1) Biraraya getirilecek bileşenlerin .xhtml dosyasında <ui:composition> tagi altında yazılması.<br />
<br />
<pre class="brush:xml"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<ui:composition>
<h:outputLabel value="#{label}" for="#{id}"/>
<h:inputText id="#{id}" value="#{value}"/>
</ui:composition>
</html>
</pre><br />
2) Hazırlanan bu .xhtml dosyasının <i>namespace</i>'i belirtilmiş *.taglib.xml içerisinde ismi ve dosya adresini belirten bir tag olarak tanımlanması.<br />
<br />
<pre class="brush:xml"><?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://mdasgin.blogspot.com/custom</namespace>
<tag>
<tag-name>myInput</tag-name>
<source>tags/customTag.xhtml</source>
</tag>
</facelet-taglib>
</pre><br />
3) *.taglib.xml' in web.xml'de tanımının yapılması.<br />
<br />
<pre class="brush:xml"><context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>
/WEB-INF/taglibs/custom.taglib.xml;
</param-value>
</context-param>
</pre><br />
4) Yeni yaratılan tag'in kullanılmak istendiği yerde namespace ve tag ismi belirtilerek kullanılmasını içermekteydi.<br />
<br />
<pre class="brush:xml"><html xmlns:m="http://mdasgin.blogspot.com/custom">
..
<m:myInput id="myInput" label="Username" value="#{user.name}"/>
..
</html>
</pre><br />
<br />
Ne var ki bu şekilde Facelets ile yapılan yeni bileşen yaratma işleminde yaratılan bileşene sadece <i>Value Expression</i> tanımları geçilebiliyordu. Örneğin <i>h:inputText</i>'in yanına <i>h:commandButton</i> bileşeni ekleyerek commandButton'un kullanımına <<i>m:myInput action="#{user.save}"</i>> gibi bir <i>Method Expression</i> parametresi veremiyorduk.<br />
<br />
Neyseki JSF 2.0 ile gelen <i>Composite Components</i> özelliği ile geliştiriciyi yoran gereksiz adımlardan ve yeni bileşenimize method expression aktaramama gibi kısıtlardan kurtuluyoruz. <i>WEB-INF</i>/<i>resources</i> klasörü içinde namespace görevi gören bir dizin oluşturmak ve bu dizin altında <i>bileşenIsmi.xhtml</i> dosyası hazırlamamız yeterli:<br />
<br />
<pre class="brush:xml"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui">
<composite:interface>
<composite:attribute name="id" required="true"/>
<composite:attribute name="label" required="true"/>
<composite:attribute name="value"/>
<composite:attribute name="action" method-signature="void action()"/>
</composite:interface>
<composite:implementation>
<h:outputLabel value="#{cc.attrs.label}" for="#{cc.attrs.id}"/>
<h:inputText id="#{cc.attrs.id}" value="${cc.attrs.value}"/>
<h:commandButton value="Save" action="#{cc.attrs.action}"/>
</composite:implementation>
</html>
</pre><br />
<br />
Yukarda <i>/WEB-INF/resources/components</i> dizini altına <i>myInput.xhtml</i> dosyasının içeriği mevcut. Ayrıntılara göz atarsak, JSF 2.0 ile gelen <i>composite</i> namespace'inin kullanımı hemen dikkat çekiyor. Dosya içeriği <i>composite:interface</i> ve <i>composite:implementation</i> olarak ikiye ayrılıyor. Implementation kısmında istenen yetenek gerçekleştirilirken interface kısmında yeni bileşenin ihtiyaç duyduğu değişkenler sıralanıyor. Değişkenleri detaylı incelersek <i>value expression </i>alan değişkenlerin yanında <i>method expression</i> alan <i>action </i>değişkeninin tanımlanması örneklemiştir. Ayrıca değişkenlere erişim de görüldüğü gibi <i>#{cc.attrs.degiskenIsmi} </i> şeklinde yapılıyor.<br />
<br />
Yeni bileşenimizi bu şekilde hazırladıktan sonra hiçbir ek tanım yapmadan JSF sayfalarımızda kullanabiliriz:<br />
<br />
<pre class="brush:xml"><html xmlns:m="http://java.sun.com/jsf/composite/components">
...
<m:myInput id="myInput" label="Username" value="#{user.name}" action="${user.save}"/>
...
</html>
</pre><br />
Küçük bir not: Composite Components kullanırken tanımladığınız değişkenin ismi "rendered" olursa JSF'in hata fırlattığını da hatırlatayım. İlgili bug kaydı<a href="http://java.net/jira/browse/JAVASERVERFACES-1849"> burada.</a>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-72633668818456372002011-03-17T21:49:00.001+02:002011-03-17T22:07:09.381+02:00JSF2'de Flash Scope Sorunu<i>Redirect</i> işlemlerinde sunucuya ikinci bir istem gönderildiği için <i>Request Scope</i> içindeki değişkenler kayboluyor, bu yüzden aktarılacak değişkenler <i>Session Scope'</i>ta tutuluyordu. Session scope'un gereksiz meşgul edilmemesi için JSF2 ile birlikte <i>Map</i> gerçekleştirimi olan <i>flash</i> nesnesi kullanıma sunuldu. Böylelikle redirect işlemlerinde değişken aktarımı ve kullanımı Java sınıfı içerisinde:<br />
<br />
<pre class="brush:java">ExternalContext.getFlash().put("message", "Your password is about to expire");
</pre>JSF sayfası içerisinde de:<br />
<pre class="brush:xml">#{flash.message}
</pre>şeklinde yapılabilir hale geldi. Ne var ki bu özellik Mojarra 2.0.3 impl'de (MyFaces ile denemedim) sadece aynı dizin ve altdizinlerde bulunan sayfalara redirect yapılırsa çalışıyor. Farklı dizin yapılarında bulunan sayfalar arasında yapılan redirect işleminde bir bug nedeniyle Flash scope'a konulan değişkene ulaşamıyorsunuz. Sorunun nerden kaynaklandığı ile ilgili bir bağlantı <a href="http://www.coderanch.com/t/518729/JSF/java/JSF-Flash-scope-cookie-not">şurda</a>.. Böyle bir gereksinimde gene eski usül, Session Scope'tan faydalanmak ve ilgili değişken redirect yapılan sayfada kullanıldıktan sonra Session Scope'tan değişkeni kaldırmayı unutmamak gerekiyor.Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-73740817830538219762011-02-16T14:54:00.002+02:002011-02-17T14:32:10.814+02:00JSF'de SMTPAppender ile Gmail üzerinden Exception BildirimiGeliştirdiğimiz uygulamaların kullanımı esnasında oluşabilecek kullanıcı kaynaklı ya da sistemsel hataları yakalayıp kullanıcıyı bilgilendirmek ya da yönlendirmek için yoğun çaba harcarız. Harcanan çabaya rağmen gözden kaçırılan bir hatanın oluşması durumunda ise hatanın sebebini bulmak için genelde loglar kurcalanır. Bir hata oluştuğunu anlamak için de ya kullanıcı geri bildirimi ya da rutin log kontrolleri yapılır. Bu geri bildirimin hata oluştuğu esnada bir ileti ile otomatik olarak yapılması da hataya müdahale için iyi bir yöntemdir. Bunun için popüler loglama kütüphanesi log4j'nin <i>SMTPAppender </i>sınıfı kullanılabilir. Örneğin yakalanan bir <i>Exception</i>'ın <i>error</i> seviyesinde loglanması ile log4j'nin bir ileti göndermesi sağlanabilir.<br />
<div><br />
</div><div>Bu iş için Gmail'i kullanabilir miyiz diye küçük bir arama yaptığımda <a href="http://marcelo-olivas.blogspot.com/2009/11/gmail-and-log4j-e-mail-appender-error.html">şu blog girdisine</a> rastladım. Örnek kodta Gmail ayarları barındıran bir Enum mevcut. Mail gönderimi için de Spring çatısının <a href="http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mail.html">Email</a> desteği kullanılmış. Spring Email kullanabilmek için ayrıca <i>activation.jar </i>ve <i>mail.jar</i> kütüphaneleri de gerekli. Madem Spring kullanacağız bağımlılık yönetimini Spring'e bırakalım. Enum sınıfı yerine öncelikle JavaMailSenderImpl yaratan bir bean tanımı yapalım:</div><div><br />
</div><div><br />
</div><pre class="brush:xml"><bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.googlemail.com"/>
<property name="port" value="587"/>
<property name="username" value="gmailAccount@gmail.com"/>
<property name="password" value="armut123"/>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
</props>
</property>
</bean>
</pre><div><br />
Yapmış olduğumuz bean tanımını <i>ApplicationContext</i>'ten alıp GMailAppender sınıfının kullanımına sunacak olan <i>JavaMailSenderFactory </i>sınıfını yazalım:<br />
<br />
<pre class="brush:java">@Component
public class JavaMailSenderFactory implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public static JavaMailSender createJavaMailSender(){
return applicationContext.getBean("javaMailSender", JavaMailSender.class);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
</pre><br />
JavaMailSenderFactory sınıfını da annotation yardımıyla Spring bean olarak tanımladık. Bean tanımını XML ile de yapabilirdik. Bu sınıf <i>ApplicationContextAware</i> arayüzünü gerçekleştirdiği için <i>Spring application context</i>'e<i> </i>erişerek JavaMailSender beanine ulaşabiliriz. Bunun için bean tanımını döndüren static bir metot yeterli olur. Log4j'nin <i>SMTPAppender</i> sınıfınından türetilen <i>GMailAppender</i> sınıfının bizim yaptığımız değişiklikler sonrasında aldığı hal şu şekilde:<br />
<br />
<pre class="brush:java">public class GMailAppender extends SMTPAppender {
private static final String NL = System.getProperty("line.separator");
@Override
public void append(LoggingEvent event){
SimpleMailMessage msg = new SimpleMailMessage();
StringBuilder builder = new StringBuilder();
builder.append(getLayout().format(event));
builder.append(event.getMessage().toString());
if (event.getThrowableInformation() != null) {
builder.append(NL);
String[] stackTrace = event.getThrowableInformation().getThrowableStrRep();
for(int i = 0; i < stackTrace.length; i++) {
builder.append(stackTrace[i] + NL);
}
}
String[] senders = getTo().trim().replace(" ", "").split(",");
msg.setTo(senders);
msg.setText(builder.toString());
msg.setSubject(this.getSubject());
try{
JavaMailSender javaMail = JavaMailSenderFactory.createJavaMailSender();
javaMail.send(msg);
}catch (MailException e) {
System.err.println("!!! HATA MAILI GONDERILEMEDI !!! : ");
e.printStackTrace();
}
}
}
</pre><br />
Referans aldığım sitedeki <i>append()</i>metodunu da az biraz değiştirdim. Değişikliğin nedeni <i>append() </i>metodunun <i>super.append(event) </i>ile akışı SMTPAppender sınıfına aktarmış olması. GMailAppender içinde gerekli biçimlendirme ve gönderim işlemi yapıldığı için buna gerek yok aslında. Şimdi de GMailAppender için Log4J ayarlarını yapılandıralım. Ben properties dosyası yerine log4j.xml kullanmayı tercih ettim:<br />
<br />
<pre class="brush:xml"><root>
<priority value="info" />
<appender-ref ref="GMailAppender" />
</root>
<appender name="GMailAppender" class="com.prime.mobileme.core.util.appender.GMailAppender">
<param name="BufferSize" value="1" />
<param name="SMTPDebug" value="false" />
<param name="To" value="dasgin@gmail.com" />
<param name="Subject" value="Ucundan Java ERROR" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d] [%t] %-5p %c %x" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="error" />
<param name="LevelMax" value="fatal" />
</filter>
</appender>
</pre><br />
<br />
Yukarıdaki ayarlardan da anlaşılacağı gibi yakaladığınız Exception'ları log4j ile <i>error </i>ya da <i>fatal </i>olarak loglarsanız loglanan hata mail olarak belirttiğiniz Gmail hesabı üzerinden gönderilecektir. Peki yakalayamadığımız hata durumlarında ne yapmalı? Eğer JSF 2 kullanıyorsanız <a href="http://jugojava.blogspot.com/2010/09/jsf-2-exception-handling.html">şu blog girdisinden</a> faydalanabiliriz. Gene buradaki örneği kendi ihtiyaçlarımıza göre yeniden düzenleyelim. Öncelikle oluşan hatayı ele alarak log4j'ye error olarak log düşen <i>ExceptionHandler </i>sınıfını hazırlayalım:<br />
<br />
<pre class="brush:java">public class MyExceptionHandler extends ExceptionHandlerWrapper {
private static Logger logger = LoggerFactory.getLogger(MyExceptionHandler.class);
private ExceptionHandler wrappedExceptionHandler;
public MyExceptionHandler(ExceptionHandler exceptionHandler){
this.wrappedExceptionHandler = exceptionHandler;
}
@Override
public ExceptionHandler getWrapped() {
return wrappedExceptionHandler;
}
@Override
public void handle(){
for (ExceptionQueuedEvent event : getUnhandledExceptionQueuedEvents()) {
ExceptionQueuedEventContext context = (ExceptionQueuedEventContext)event.getSource();
Throwable t = context.getException();
logger.error("Unhandled Exception: ", t);
}
getWrapped().handle();
}
}
</pre><br />
Ardından ExceptionHandler sınıfımızı JSF'in kullanabilmesi için <i>ExceptionHandlerFactory </i>sınımızı hazırlayalım:<br />
<br />
<pre class="brush:java">public class MyExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
public MyExceptionHandlerFactory(ExceptionHandlerFactory parent){
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
return new MyExceptionHandler(parent.getExceptionHandler());
}
}
</pre><br />
En son adımda da faces-config.xml'e yazdığımız factory sınıfını tanıtmak kalıyor:<br />
<br />
<pre class="brush:xml"><factory>
<exception-handler-factory>
ucundan.java.MyExceptionHandlerFactory
</exception-handler-factory>
</factory>
</pre><br />
<br />
Kaynaklar:<br />
* <span class="Apple-style-span" style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"><a href="http://marcelo-olivas.blogspot.com/2009/11/gmail-and-log4j-e-mail-appender-error.html">GMail and log4j e-mail appender - error STARTTLS</a></span><br />
* <span class="Apple-style-span" style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"><a href="http://jugojava.blogspot.com/2010/09/jsf-2-exception-handling.html">JSF 2 Exception Handling</a></span><br />
<br />
</div>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-57204199335966044492010-12-30T14:53:00.000+02:002010-12-30T14:53:47.635+02:00Spring ile Hibernate Annotation Kullanılan Entity Sınıfların Otomatik AlgılanmasıVeri erişim katmanında JPA standartını kullanırken annotation ile tanımladığımız entity sınıflarımızın algılanması, proje ayağa kalkarken otomatik gerçekleştirilir. Araya JPA standartını sokmak yerine doğrudan Hibernate çatısını kullanmak istediğimizde annotationlarla tanımlanmış bu entity sınıflarının algılanabilmesi için kullanılagelen yaygın yöntem ya <i>hibernate.cfg.xml</i> içersinde bu sınıfları algılatmak ya da her bir entity sınıfını Spring'in Hibernate entegrasonu için kullanıma sunduğu AnnotationSessionFactoryBean tanımı içinde tek tek belirtmektir:<br />
<br />
<pre class="brush:xml"><bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="${dataSourceType}" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>com.prime.ExampleClass1</value>
<value>com.prime.ExampleClass2</value>
</list>
</property>
</bean>
</pre><br />
<i>annotatedClasses</i>'ın bu şekilde kullanımı entity sınıf sayısı arttıkça sıkıntı yaratmaya başlayabilir. Bunun yerine aynı Spring bean'in <i>packagesToScan</i> değişkeni uygun paket yapısıyla kurarak uzun uzadıya sınıf tanımları yapmaktan kurtulabilirsiniz:<br />
<br />
<pre class="brush:xml"><property name="packagesToScan" value="com.prime" />
</pre><br />
ya da<br />
<br />
<pre class="brush:xml"><property name="packagesToScan">
<list>
<value>com.prime.package1.model</value>
<value>com.prime.package2.model</value>
</list>
</property>
</pre><br />
Hibernate annotation kullanan entitylerinizin otomatik algılanması için yukardaki tüm kullanımlara ek olarak proje classpath'inde javassist.jar kütüphanesi de bulunmalıdır..Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-5633815132045045192010-12-21T16:38:00.000+02:002010-12-21T16:38:37.385+02:00Spring - JSF Yeniden (JSF 2.0)<div style="text-align: justify;">Blogta ziyaret edilen girdilere göz attığımda "<a href="http://mdasgin.blogspot.com/2008/01/jsf-javaserver-faces-bilindii-gibi-java.html">Spring - JSF Bütünleştirmesi</a>" yazımın son zamanlarda tekrar ziyaret edildiğini farkettim. Hazır geçen hafta da JTPD'nin eğitim seminerlerinde bu konular üzerine eğilmişken iki çatının entegrasyonunu, değişen yeteneklerini de dikkate alarak tekrar gözden geçirelim istedim.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><a href="http://mdasgin.blogspot.com/2008/01/jsf-javaserver-faces-bilindii-gibi-java.html">Eski girdide</a> bu iki çatıyı birbirleriyle anlaşır hale getirebilmek için JSF'ye <i>variable resolver</i> olarak Spring'in bize sunduğu <span class="Apple-style-span" style="font-family: monospace; font-size: 13px; line-height: 13px; white-space: pre;">DelegatingVariableResolver</span><span class="Apple-style-span" style="color: #37483d; font-family: 'Courier New', monospace; font-size: 11px; line-height: 13px;"> </span>sınıfını tanıtmıştık. Bu sınıf iki çatı arasında bean aktarımlarını gerçekleştirmek için aktarımı yapılacak beani öncelikle JSF beanlerinde, bulamazsa Spring beanlerinde arıyordu. Benzer şekilde, önce Spring bean tanımlarına sonra da JSF bean tanımlarına bakan <span class="Apple-style-span" style="font-family: monospace; font-size: 13px; line-height: 13px; white-space: pre;">SpringBeanVariableResolver </span>Spring sınıfını da JSF 1.1 ve 1.2 sürümlerinde kullanabiliriz.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">JSF 1.2+ sürümlerinde ise variable resolver kullanımı yerini <i>ELResolver</i>'a bırakıyor:<br />
<br />
<pre class="brush:xml"><faces-config>
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
</faces-config>
</pre><br />
Spring ile JSF'i bu şekilde ilişkilendirdikten sonra eski yazıdaki örneği bu sefer JSF 2.0'ın annotationlarını kullanarak Spring beanini JSF bean tanımı içine aktarımını yapalım:<br />
<br />
<pre class="brush:java">@ManagedBean(name="member")
@RequestScoped
public class Member {
@ManagedProperty(value="#{memberService}")
private MemberService memberService;
// memberService getter/setter
}
</pre><br />
Spring bean tanımını da @Service("memberService") ya da @Component("memberService") annotationlarını kullanarak da xml'e bulaşmadan MemberService sınıfı içinde yapabiliriz:<br />
<br />
<pre class="brush:java">@Service("memberService")
public class MemberServiceImpl implements MemberService {
// ...
}
</pre><br />
Spring annotationlarının çalışması içinse Spring context xml tanımınına ya <i><context:component-scan base-package="com.prime.packname"></context:component-scan></i> satırını eklemeli ya da web.xml içerisinde Spring bean tanımlarını xml yerine annotation kullanarak yapacağımızı belirten gerekli düzenlemeleri yapmalıyız:<br />
<br />
<pre class="brush:xml"><web-app>
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.prime.packageName</param-value>
</context-param>
</web-app>
</pre><br />
<br />
Bu işlemlerin ardından annotationlarla tanımladığımız Spring ve JSF beanlerini birbirine entegre olarak kullanabiliriz. Bol Javalar..</div>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-52840818678634541782010-12-12T21:10:00.004+02:002010-12-15T10:03:39.141+02:00JTPD'de JSF, Spring ve JPA Sunumları<div class="separator" style="clear: both; text-align: justify;">Dün <a href="http://www.jtpd.org/">JTPD</a>'nin düzenlediği Java eğitimlerinin 3. haftasında katılımcılara JSF, Spring ve JPA sunumları yapma fırsatım oldu. Sunumların ardından küçük örnekler yaparak da anlatılan konuları pekiştirmeye çalıştık. Her ne kadar bahsi geçen konuları detaylı incelemek için 4-5 saat gibi çok çok kısıtlı süremiz olsa da mümkün olduğunca bu çatılar (framework) bizlere neler vaat ediyor, yetenekleri neler ve birbirleriyle nasıl entegre edebiliriz konuları üzerinden hızlıca geçtik. Anlatılan konular katılımcılar için zaman zaman detaylı ve karmaşık olsa da beni sabırla dinledikleri için kendilerine çok teşekkür ederim. Umarım faydalı olabilmişimdir. Hazırladığım eğitim sunumlarına ve örnek projelere <a href="https://bit.ly/dasgin_jtpd">buradan</a> erişebilirsiniz. Java kültürünü daha geniş kitlelere yaymaya çalışan JTPD derneğini de tebrik ediyorum..</div><div class="separator" style="clear: both; text-align: justify;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://i55.twitgoo.com/5frlo1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://i55.twitgoo.com/5frlo1.jpg" width="191" /></a></div>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-47136637005538118882010-11-06T15:10:00.000+02:002010-11-06T15:10:34.860+02:00Introduce Null Object<b></b><br />
<div style="background-color: transparent; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><div style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tasarım örüntüleri yazılımın yönetilebilirliği ve genişletilebilirliği için ulaşılmak istenen hedeftir. Sadece bu hedefi anlayıp uygulamaya çalışmak yerine, hedefe nasıl ulaşıldığını anlamak daha önemlidir. Refactoring yöntemleri, sizi ideal hedefe ulaştıran tasarımsal evrimi temsil eder</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 6.6pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">[1]</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Bu yöntemlerden bir tanesi de </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">tir.</span><br />
<div style="background-color: transparent; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Uygulama geliştirme esnasında bir metot sorgusu sonucu dönen nesnenin null olup olmadığının kontrolünü yapmak sıklıkla başvurduğumuz kontrollerden birisidir. Bu kontrolü unuttuğumuz da ise vay halimize, o ünlü </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">NullPointerException</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> hatasıyla uygulamamızın göçmesi kaçınılmaz olur. </span></div><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">İş mantığımızın gereksinimleri sebebiyle bir nesne için bu kontrolü sıklıkla tekrarlayarak null olma durumunda kodun alternatif davranışlar sergilemesi gerekebilir. Bu durum kaynak kodumuzun fazlaca tekrarlı kontrol deyimi içermesine ve Martin Fowler’ın Refactoring</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 6.6pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">[2]</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> kitabındaki deyimiyle kodun kötü kokular yaymasına sebep olacaktır. Böyle bir durumda uygulanması gereken refactoring (ben “kod adam etme” demeyi seviyorum) yöntemi </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">olmalıdır.</span></div><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Bir </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">temel olarak gerçek nesneyle aynı metot imzalarına sahiptir. Metotları ise null olma durumunda varsayılan değerleri döndürecek, alternatif davranışları sergileyecek şekilde gerçekleştirilir.</span></div><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Metot imzaları aynı olacağı için </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">ya gerçek nesneden kalıtım (inheritance) yoluyla türetilecek ya da gerçek nesneyle ortak bir interfaceden geliştirilecek (implement) şekilde tasarlanabilir.</span></div><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="text-align: center;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: medium; white-space: normal;"><img height="187px;" src="https://lh5.googleusercontent.com/PrsgdkC8YUG_UnyOdfOGMKIlTwV5N_uMKEvmVVdpGvaTpNdzcWL9QqBGHxzMJq7_Yksot5JAYEDJ1EEwnhgzZEL3E7xjcr3E52t0I1AyzwDFh196lQ" width="124px;" /></span></span></div><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Kalıtım yoluyla yaratılan </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> sınıfının, null olma durumunda alternatif davranışı sergileyecek metotları override etmesi gerekmektedir. Atasınıfa yeni eklenen metotların alternatif davranış için override edilmesinin unutulması hatalı işleyişe sebep olabilir. Interface gerçekleştirilerek yaratılan </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">sınıfında bu risk söz konusu olmaz. Ama bu sefer yaratılan yeni sınıf içeriğinde alternatif davranış sergilemek zorunda olmayan diğer metotların gövdelerinin de barındırması gerekir. </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Bir diğer sıkıntı da geliştirim aşamasında değişmeye meyilli interface tasarımlarıdır. Yeni metot eklendikçe, metot çıkartıldıkça ya da metot imzaları değiştikçe </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> sınıfını da değiştirmek gerekir. Bu soruna Kenan Sevindik, blogunda yazdığı “Mockito ile Null Object”</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 6.6pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">[3]</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> yazısında ilginç bir çözüm getiriyor. Joshua Kerievsky “</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Refactoring to Patterns</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">”[1] kitabında </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> yönteminin temel amacının kodu basitleştirmenin yanında kaynak kod satır sayısını düşürmesi gerektiğini, en azından aynı düzeyde tutması gerektiğinin altını çiziyor. Kaynak kod satır sayısı artıyorsa uygulanmamasını tavsiye ediyor.</span></div><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">örüntüsünün varlığı null kontrollerinin yapılmayacağını garanti etmez. </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> örüntüsünün kullanıldığından habersiz bir başka geliştirici null kontrolleri yapmaya devam edebilir dahası null olma durumunda işletilecek kod parçalarını iş mantığına ekleyebilir. Null Object nesnesini ve gerçek nesneyi davranış barındırmayan </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Nullable</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> gibi boş bir interfaceten gerçekleştirmek geliştiricilerin dikkatini çekerek bu gibi problemlerin önüne bir nebze de olsa geçebilir. Boş bir interfaceten gerçekleştirmek yerine </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">isNull() </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">metotu içeren bir interface de ilerde ihtiyaç duyulabilecek olası bir null kontrolü için faydalı olur:</span></div><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="background-color: transparent; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
</div><pre class="brush:java">public interface Nullable {
boolean isNull();
}
</pre><pre class="brush:java">public class Customer implements Nullable {
boolean isNull(){
return false;
}
Plan getPlan(){
doMoreThings();
}
}
</pre><pre class="brush:java">public class NullCustomer extends Customer {
boolean isNull(){
return true;
}
Plan getPlan(){
return Plan.emptyPlan();
}
}
</pre><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Kaynak koda müdahale edemediğimiz durumlarda sadece </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">davranışı olmayan bir interfaceten gerçekleştirilerek null kontrolü </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">instanceof </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">ile yapılabilir:</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><br />
<br />
<pre class="brush:java">public interface Null { }
</pre><pre class="brush:java">public class NullCustomer extends Customer implements Null{
//...
}
</pre><pre class="brush:java">//...
if(customer instanceof Null) { }
//...
</pre><br />
</div><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> davranışı ve durumu değişmeyecek bir sınıf olduğu için çok fazla Null Object nesnesi yaratılma durumunda </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Singleton</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> tasarım örüntüsü kullanılarak her yeni çağrıda yeni null sınıf yaratılmasının önüne de geçilebilir.</span></div><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Artıları/Eksileri:</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">+ Null kontrolü tekrarları yapmadan, null hatalarının önüne geçer.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">+ Null kontrollerinin sayısını en aza indirerek kodu basitleştirir.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">- Sadece bir kaç null kontrolü kullanıldığı durumlarda kodu karmaşıklaştırır.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">- Null Object gerçekleştirimi yapıldığından haberi olmayan bir geliştirici gereksiz null kontrolleri yazabilir.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">- Yönetilebilirliği zorlaştırır. Gerçek sınıfa eklenen yeni metotlar için Null Object sınıfı içinde override işlemi yapılmalıdır.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Bir örnekle konuya açıklık getirelim:</span><br />
<br />
<pre class="brush:java">class SecmenKutugu {
Vatandas vatandas;
Vatandas getVatandas(){
return vatandas;
}
}
class Vatandas{
public long getTCNo() {
//..
}
public Adres getAdres() {
//..
}
public Muhtar setMuhtar {
//..
}
}
class Adres {
public int getSokakNo() {
//..
}
// ...
}
</pre><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<br />
<pre class="brush:java">Vatandas vatandas = secmenKutugu.getVatandas();
if(vatandas != null) vatandas.setMuhtar(Muhtar.getInstance());
//...
long tcNo;
if(vatandas == null) tcNo = 0;
else tcNo = vatandas.getTCNo();
//...
int sokakNo;
if(vatandas == null) sokakNo = 0;
else sokakNo = vatandas.getAdres().getSokakNo();
//..
</pre><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br />
Yukardaki örnekteki gibi tekrarlı null kontrolleri yapan kodumuz olsun. Bu kodu adam etmeye null testi yapmaya imkan sağlayan Null Object yaratmakla başlayalım. Böylelikle bahsettiğimiz gibi diğer geliştiricilerin de Null Object kullanıldığına dair dikkatini çekebiliriz:<br />
</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<pre class="brush:java">interface Nullable {
boolean isNull();
}
class Vatandas implements Nullable{
static Vatandas newNull() {
return new NullVatandas();
}
boolean isNull(){
return false;
}
//...
}
class NullVatandas extends Vatandas {
boolean isNull(){
return true;
}
}
</pre><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null değer dönebilecek yerlerde yarattığımız yeni Null Object nesnesini döndürelim:</span><br />
<pre class="brush:java">class SecmenKutugu {
Vatandas vatandas;
Vatandas getVatandas(){
return (vatandas == null)? Vatandas.newNull(): vatandas;
}
}
</pre><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><span class="Apple-style-span" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;">Null kontrollerinin yapıldığı her bir iş mantığı için Null Object sınıfına null olma durumunda işletilecek alternatif metot kodunu ekleyelim ve null kontrollerini kaldıralım. Ayrıca her değişiklikte kodun davranışının değişmediğini test etmekte yarar var. Tüm değişikliklerin sonunda kodumuz şu şekilde olacak:</span><br />
<pre class="brush:java">class NullVatandas extends Vatandas {
public long getTCNo() {
return 0;
}
public Muhtar setMuhtar(Muhtar muhtar) { }
public Adres getAdres() {
return Adres.newNull();
}
}
class NullAdres extends Adres {
public int getSokakNo(){
return 0;
}
//..
}
</pre><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<pre class="brush:java">Vatandas vatandas = secmenKutugu.getVatandas();
vatandas.setMuhtar(Muhtar.getInstance());
//...
long tcNo = vatandas.getTCNo();
//...
int sokakNo = vatandas.getAdres().getSokakNo();
//..
</pre><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br />
Yukarıdaki örnekte Adres sınıfı için de bir </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> yazma gerekliliğimiz dikkatinizi çekmiştir. Sınıfın başka bir sınıfa delege ettiği metotlar için null sınıfın da metotu delege edeceği yeni null sınıflar yazılır.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<div style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Null Object yöntemi nesnenin null davranışını modellemek için kullanılabileceği gibi aynı zamanda nesnenin varsayılan davranış sergileyecek farklı senaryoları için de (Örk: NullVatandas, UnknownVatandas, PrivateVatandas vb.) kullanılabileceğini belirterek konumuzu sonlandıralım.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br />
</span></div><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Kaynaklar:</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">1. Joshua Kerievsky - Refactoring to Patterns</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2. Martin Fowler - Refactoring: Improving the Design of Existing Code</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3. Kenan Sevindik - </span><a href="http://ksevindik.blogspot.com/2010/01/mockito-ile-null-object.html"><span style="background-color: transparent; color: #000099; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://ksevindik.blogspot.com/2010/01/mockito-ile-null-object.html</span></a></div></div></div>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-42032916379908605862010-08-14T17:23:00.000+03:002010-08-14T17:23:35.050+03:00Popüler Programlama DilleriBu site programlama dillerini çeşitli kriterleri dikkate alarak populerliğine göre aylık olarak sıralıyor. Java uzunca bir süredir ilk sırada. Dünyadaki programlama dili akımlarını takip etmek için güzel bir kaynak. Örneğin Ağustos-2010 tarihinde son zamanların popüler programlama dili Python hafif bir düşüşe geçmişken Objective-C atakta. Google'ın geliştirdiği Go programlama dili sağlam bir çıkış yaparak ilk 20 içine girerken yılların Smalltalk dili 50. sıradan da aşağılara düşmüş:<br />
<br />
<a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html</a><br />
<br />
İyi Javalar..Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-7654546327670931232010-07-04T02:39:00.000+03:002010-07-04T02:39:45.828+03:00Eşli ProgramlamaEşli programlama (<i>Pair Programming</i>) iletişimi, eşler arasında işbirliğini ve dolayısıyla öğrenmeyi temel alan program geliştirme yöntemidir. Eşlerden biri "Sürücü (<i>Driver</i>)" rolünü diğeri ise "Yönlendirici (<i>Navigator</i>)" rolünü üstlenir. Aynı bir yarış arabasındaki pilot/yardımcı pilot yardımlaşmasındaki gibi, Sürücü kodun yazımı, yazım hatalarının denetimi, API'lerin çağırımı gibi konularla ilgilenirken Yönlendirici de yapılan işin doğruluğu, gereksinimler, alternatif yöntemler, bir sonraki adım, vb. konulara yoğunlaşır. Eşler büyük resmi, birbirlerinin eksiklerini tamamlayarak daha iyi ele alırlar. Olası hatalar büyük oranda ortaya çıkma aşamasında ele alınır ve çözülür.<br />
<br />
Niclas Nilsson ve Hans Brattberg eşli programlamayı, yapılması ve yapılmaması gerekenleri, eşli programlamanın avantajlarını küçük tiyatrolarla destekleyerek anlatmışlar. Hoş bir sunum tarzı olmuş: <a href="http://bit.ly/amzdsy">The Pair Programming Show</a>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-2350430376967513202010-06-18T23:31:00.000+03:002010-06-18T23:31:21.163+03:00Java Dergisi..<a href="http://www.javadergisi.com/">Java Dergisi</a>'nin yayın hayatına başlaması Türkiye yazılım dünyası için güzel bir gelişme oldu... Kaliteli ve doyurucu bir içeriğe sahip olmasının yanında çok kaliteli bir baskıya da sahip olan dergiye emeği geçenlere içten bir teşekkürü borç bilirim. Özellikle de bu dergi için ön ayak olan Özcan Acar'a...<br />
<br />
Gerçek bir yazılım içeriği sunması açısından Java'ya gönül verenlerin, Java'ya adım atmak isteyenlerin ellerinden düşürmeyecekleri bir dergi. Derginin önerilerimizle daha da iyi olacağını düşünüyorum. Alınası, bol bol okunası...<br />
<br />
Tekrar teşekkürler.Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-58911467131445786742010-06-18T23:21:00.001+03:002010-11-06T10:22:30.123+02:00Tekrar Yayında..Evet askerlik bitti...<br />
<br />
17 Mayıs itibari ile askerliği bitirip özlediğim sivil hayata dönüş yaptım. Askerlik ile ilgili düşünceleri dost meclisinde dile getiriyoruz. Burada sivil hayatımdaki değişiklikleri paylaşayım.<br />
<br />
Her şey değişti... İşim, evim, yaşadığım şehir... Bundan sonraki hayatımı paylaşacağım müstakbel eşimin isteği sebebiyle İstanbul'a taşındım. Bu nedenle 9 senelik arkadaşları, güzel anıları paylaştığım dostları üzülerek Ankara'da bıraktım. Ama her fırsatta bir araya geleceğimizden hiç şüpheleri olmasın. Bunun yanında bir çok şey öğrendiğim, aralarında bulunmaktan mutluluk duyduğum Innova Ankara ailesinden de ayrılmak zorunda kaldım. Prime Teknoloji ailesine katkı sağlamaya, yeni şeyler öğrenmeye, öğrendiklerimizi aktarmaya çalışacağım.<br />
<br />
Askerlik ve askerlikten sonra tüm bu değişiklikleri yönetmek, bir yandan da evlilik hazırlıkları yapmak zamanımın çoğunu götürdüğü için özlediğim mesleğime, uğraşmayı sevdiğim Java dünyasına dönmemi geciktirdi. Belirsizliklerin yavaş yavaş ortadan kalkması, işlerin planlanması sonucu tekrar kendime ve Java'ya vakit ayırmaya başlıyorum.<br />
<br />
Umarım bundan sonra da her şey güzel ve gönlümüzce olur...Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-53915742583918449132009-11-12T17:16:00.004+02:002010-02-27T15:35:41.933+02:00Kelle Koltuk Programlama<meta equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 12"><meta name="Originator" content="Microsoft Word 12"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cmdasgin%5CLOCALS%7E1%5CTemp_%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"><link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cmdasgin%5CLOCALS%7E1%5CTemp_%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"><link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cmdasgin%5CLOCALS%7E1%5CTemp_%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"><!--[if gte mso 9]><xml> <w:worddocument> <w:view>Normal</w:View> <w:zoom>0</w:Zoom> <w:trackmoves/> <w:trackformatting/> <w:hyphenationzone>21</w:HyphenationZone> <w:punctuationkerning/> <w:validateagainstschemas/> <w:saveifxmlinvalid>false</w:SaveIfXMLInvalid> <w:ignoremixedcontent>false</w:IgnoreMixedContent> <w:alwaysshowplaceholdertext>false</w:AlwaysShowPlaceholderText> <w:donotpromoteqf/> <w:lidthemeother>TR</w:LidThemeOther> <w:lidthemeasian>X-NONE</w:LidThemeAsian> <w:lidthemecomplexscript>X-NONE</w:LidThemeComplexScript> <w:compatibility> <w:breakwrappedtables/> <w:snaptogridincell/> <w:wraptextwithpunct/> <w:useasianbreakrules/> <w:dontgrowautofit/> <w:splitpgbreakandparamark/> <w:dontvertaligncellwithsp/> <w:dontbreakconstrainedforcedtables/> <w:dontvertalignintxbx/> <w:word11kerningpairs/> <w:cachedcolbalance/> </w:Compatibility> <w:browserlevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathpr> <m:mathfont val="Cambria Math"> <m:brkbin val="before"> <m:brkbinsub val="--"> <m:smallfrac val="off"> <m:dispdef/> <m:lmargin val="0"> <m:rmargin val="0"> <m:defjc val="centerGroup"> <m:wrapindent val="1440"> <m:intlim val="subSup"> <m:narylim val="undOvr"> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"> <w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"> <w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"> <w:lsdexception locked="false" priority="39" name="toc 1"> <w:lsdexception locked="false" priority="39" name="toc 2"> <w:lsdexception locked="false" priority="39" name="toc 3"> <w:lsdexception locked="false" priority="39" name="toc 4"> <w:lsdexception locked="false" priority="39" name="toc 5"> <w:lsdexception locked="false" priority="39" name="toc 6"> <w:lsdexception locked="false" priority="39" name="toc 7"> <w:lsdexception locked="false" priority="39" name="toc 8"> <w:lsdexception locked="false" priority="39" name="toc 9"> <w:lsdexception locked="false" priority="35" qformat="true" name="caption"> <w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"> <w:lsdexception locked="false" priority="1" name="Default Paragraph Font"> <w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"> <w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"> <w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"> <w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"> <w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"> <w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"> <w:lsdexception locked="false" unhidewhenused="false" name="Revision"> <w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"> <w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"> <w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"> <w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"> <w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"> <w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"> <w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"> <w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"> <w:lsdexception locked="false" priority="37" name="Bibliography"> <w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"> </w:LatentStyles> </xml><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-alt:"Calisto MT"; mso-font-charset:162; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-alt:"Century Gothic"; mso-font-charset:162; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman";} a:link, span.MsoHyperlink {mso-style-noshow:yes; mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:purple; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt;} @page Section1 {size:612.0pt 792.0pt; margin:70.85pt 70.85pt 70.85pt 70.85pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} --> </style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} </style> <![endif]-->Takip ettiğim blogların <a href="http://www.cihataltuntas.com/?p=601">birinde</a> beni "Cargo Cult Programming" terimiyle tanıştıran çok hoş bir yazı okudum. Blog yazarı <span style="font-style: italic;">Cihat Altuntaş</span>'ın "Çakma Programlama" diye çevirdiği terimi, bu tarz programlamanın olası sonuçları açısından ve de <span style="font-style: italic;">Cargo Cult</span> terimine birazcık benzer söylenişinden dolayı "<span style="font-weight: bold;">Kelle Koltuk Programlama</span>" diye dilimize çevirmeyi daha hoş buldum :)
<br />
<br />Terimin detaylı anlatımını <a href="http://en.wikipedia.org/wiki/Cargo_cult_programming">wiki</a>'den okuyabilirsiniz. Özetle neyin ne olduğunu bilmeden ezbere programlama, şu örnekte kodu şöyle yazmışlar ben de yazıp bi deneyeyim çalışacak mı programlama...
<br />
<br />:)
<br /><meta equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 12"><meta name="Originator" content="Microsoft Word 12"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cmdasgin%5CLOCALS%7E1%5CTemp_%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml> <w:worddocument> <w:view>Normal</w:View> <w:zoom>0</w:Zoom> <w:trackmoves/> <w:trackformatting/> <w:hyphenationzone>21</w:HyphenationZone> <w:punctuationkerning/> <w:validateagainstschemas/> <w:saveifxmlinvalid>false</w:SaveIfXMLInvalid> <w:ignoremixedcontent>false</w:IgnoreMixedContent> <w:alwaysshowplaceholdertext>false</w:AlwaysShowPlaceholderText> <w:donotpromoteqf/> <w:lidthemeother>TR</w:LidThemeOther> <w:lidthemeasian>X-NONE</w:LidThemeAsian> <w:lidthemecomplexscript>X-NONE</w:LidThemeComplexScript> <w:compatibility> <w:breakwrappedtables/> <w:snaptogridincell/> <w:wraptextwithpunct/> <w:useasianbreakrules/> <w:dontgrowautofit/> <w:splitpgbreakandparamark/> <w:dontvertaligncellwithsp/> <w:dontbreakconstrainedforcedtables/> <w:dontvertalignintxbx/> <w:word11kerningpairs/> <w:cachedcolbalance/> </w:Compatibility> <w:browserlevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathpr> <m:mathfont val="Cambria Math"> <m:brkbin val="before"> <m:brkbinsub val="--"> <m:smallfrac val="off"> <m:dispdef/> <m:lmargin val="0"> <m:rmargin val="0"> <m:defjc val="centerGroup"> <m:wrapindent val="1440"> <m:intlim val="subSup"> <m:narylim val="undOvr"> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"> <w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"> <w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"> <w:lsdexception locked="false" priority="39" name="toc 1"> <w:lsdexception locked="false" priority="39" name="toc 2"> <w:lsdexception locked="false" priority="39" name="toc 3"> <w:lsdexception locked="false" priority="39" name="toc 4"> <w:lsdexception locked="false" priority="39" name="toc 5"> <w:lsdexception locked="false" priority="39" name="toc 6"> <w:lsdexception locked="false" priority="39" name="toc 7"> <w:lsdexception locked="false" priority="39" name="toc 8"> <w:lsdexception locked="false" priority="39" name="toc 9"> <w:lsdexception locked="false" priority="35" qformat="true" name="caption"> <w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"> <w:lsdexception locked="false" priority="1" name="Default Paragraph Font"> <w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"> <w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"> <w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"> <w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"> <w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"> <w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"> <w:lsdexception locked="false" unhidewhenused="false" name="Revision"> <w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"> <w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"> <w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"> <w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"> <w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"> <w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"> <w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"> <w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"> <w:lsdexception locked="false" priority="37" name="Bibliography"> <w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"> </w:LatentStyles> </xml><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-alt:"Calisto MT"; mso-font-charset:162; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-alt:"Century Gothic"; mso-font-charset:162; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman";} a:link, span.MsoHyperlink {mso-style-noshow:yes; mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:purple; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt;} @page Section1 {size:612.0pt 792.0pt; margin:70.85pt 70.85pt 70.85pt 70.85pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} <meta equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 12"><meta name="Originator" content="Microsoft Word 12"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cmdasgin%5CLOCALS%7E1%5CTemp_%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"><link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cmdasgin%5CLOCALS%7E1%5CTemp_%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"><link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cmdasgin%5CLOCALS%7E1%5CTemp_%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"><!--[if gte mso 9]><xml> <w:worddocument> <w:view>Normal</w:View> <w:zoom>0</w:Zoom> <w:trackmoves/> <w:trackformatting/> <w:hyphenationzone>21</w:HyphenationZone> <w:punctuationkerning/> <w:validateagainstschemas/> <w:saveifxmlinvalid>false</w:SaveIfXMLInvalid> <w:ignoremixedcontent>false</w:IgnoreMixedContent> <w:alwaysshowplaceholdertext>false</w:AlwaysShowPlaceholderText> <w:donotpromoteqf/> <w:lidthemeother>TR</w:LidThemeOther> <w:lidthemeasian>X-NONE</w:LidThemeAsian> <w:lidthemecomplexscript>X-NONE</w:LidThemeComplexScript> <w:compatibility> <w:breakwrappedtables/> <w:snaptogridincell/> <w:wraptextwithpunct/> <w:useasianbreakrules/> <w:dontgrowautofit/> <w:splitpgbreakandparamark/> <w:dontvertaligncellwithsp/> <w:dontbreakconstrainedforcedtables/> <w:dontvertalignintxbx/> <w:word11kerningpairs/> <w:cachedcolbalance/> </w:Compatibility> <w:browserlevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathpr> <m:mathfont val="Cambria Math"> <m:brkbin val="before"> <m:brkbinsub val="--"> <m:smallfrac val="off"> <m:dispdef/> <m:lmargin val="0"> <m:rmargin val="0"> <m:defjc val="centerGroup"> <m:wrapindent val="1440"> <m:intlim val="subSup"> <m:narylim val="undOvr"> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"> <w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"> <w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"> <w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"> <w:lsdexception locked="false" priority="39" name="toc 1"> <w:lsdexception locked="false" priority="39" name="toc 2"> <w:lsdexception locked="false" priority="39" name="toc 3"> <w:lsdexception locked="false" priority="39" name="toc 4"> <w:lsdexception locked="false" priority="39" name="toc 5"> <w:lsdexception locked="false" priority="39" name="toc 6"> <w:lsdexception locked="false" priority="39" name="toc 7"> <w:lsdexception locked="false" priority="39" name="toc 8"> <w:lsdexception locked="false" priority="39" name="toc 9"> <w:lsdexception locked="false" priority="35" qformat="true" name="caption"> <w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"> <w:lsdexception locked="false" priority="1" name="Default Paragraph Font"> <w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"> <w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"> <w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"> <w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"> <w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"> <w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"> <w:lsdexception locked="false" unhidewhenused="false" name="Revision"> <w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"> <w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"> <w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"> <w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"> <w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"> <w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"> <w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"> <w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"> <w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"> <w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"> <w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"> <w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"> <w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"> <w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"> <w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"> <w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"> <w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"> <w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"> <w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"> <w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"> <w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"> <w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"> <w:lsdexception locked="false" priority="37" name="Bibliography"> <w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"> </w:LatentStyles> </xml><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-alt:"Calisto MT"; mso-font-charset:162; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-alt:"Century Gothic"; mso-font-charset:162; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman";} a:link, span.MsoHyperlink {mso-style-noshow:yes; mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:purple; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt;} @page Section1 {size:612.0pt 792.0pt; margin:70.85pt 70.85pt 70.85pt 70.85pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} --> </style>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0tag:blogger.com,1999:blog-7242277445654742100.post-18267924735599976662009-11-05T14:03:00.002+02:002009-11-05T14:17:51.041+02:00SCWCD EE5Yaklaşık 3 saat önce SCWCD EE5 sınavını da başarıyla sonuçlandırıp sertifika almaya hak kazandım, darısı çalışanların başına :)<div><br /></div><div>Önceden de belirttiğim gibi sınav için "<a href="http://www.amazon.com/Head-First-Servlets-JSP-Certified/dp/0596516681/ref=sr_1_1?ie=UTF8&qid=1250356171&sr=8-1">Head First Servlet & JSP</a>" kitabından faydalandım. Kitap sınav için tüm gerekli konu başlıklarını gayet iyi açıklıyor fakat hem konu anlatımlarında hem de kitabın sonundaki deneme sınavında küçük yanlışlıklar göze çarpıyor. Bu yüzden kitabın sitesinden kitapla ilgili düzeltmeler kısmına mutlaka bakılmalı.</div><div><br /></div><div>Ayrıca JavaRanch sitesinden SCWCD ile ilgili <a href="http://www.coderanch.com/forums/f-18/Web-Component-Certification-SCWCD">forum</a> ve sınav hakkında açıklayıcı, faydalı bilgilere de erişebilirsiniz.</div><div><br /></div><div>Sırada ne mi var? Sırada bir aksilik çıkmazsa aralık ayında askerik var ;)</div>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com2tag:blogger.com,1999:blog-7242277445654742100.post-79306336332415996812009-10-22T10:15:00.007+03:002009-10-22T10:30:43.380+03:00Bazen Mühendislik Sıradışı Çözümlerin Peşinden Gitmektir..Ya bir heyecan uğruna ya da sadece öylesine; sıradan çözümleri görmezden gelerek... :)<div><br /></div><div><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2GrRy5nvSoc/SuAIAos_2mI/AAAAAAAABSU/G_hvRkuIhi4/s1600-h/20102009020.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_2GrRy5nvSoc/SuAIAos_2mI/AAAAAAAABSU/G_hvRkuIhi4/s320/20102009020.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5395321160609028706" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_2GrRy5nvSoc/SuAIAXAnpYI/AAAAAAAABSM/p0mYFRHBH_I/s1600-h/20102009019.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_2GrRy5nvSoc/SuAIAXAnpYI/AAAAAAAABSM/p0mYFRHBH_I/s320/20102009019.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5395321155859490178" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2GrRy5nvSoc/SuAIAcV83CI/AAAAAAAABSE/WlzcIUTiPfI/s1600-h/20102009018.jpg" style="text-decoration: none;"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_2GrRy5nvSoc/SuAIAcV83CI/AAAAAAAABSE/WlzcIUTiPfI/s320/20102009018.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5395321157291138082" /></a><div style="text-align: justify;"><br /></div></div>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com1tag:blogger.com,1999:blog-7242277445654742100.post-23876819394891522212009-09-25T10:26:00.002+03:002009-09-25T10:33:43.224+03:00En Basit Tasarım Örüntüsü Singleton (mu?) -- 2<a href="http://mdasgin.blogspot.com/2008/11/en-basit-tasarm-rnts-singleton.html">Daha önceki bir blog girdimde</a> Singleton sınıfın yazımında dikkat edilesi hususları yazmıştım. Singleton örüntüsünün Java Reflection ile kırıldığını da duymama rağmen "nasılı" üzerinde pek durmamıştım. Bir kaç gün önce karşılaştığım blog girdisinde "Yohan Liyanage" bu konudan ve alınabilecek önlemlerden bahsetmiş: <a href="http://yohanliyanage.blogspot.com/2009/09/breaking-singleton.html">Breaking Singleton</a> <div><br /></div><div>Bakalım Singleton'dan daha ne numaralar çıkacak :)</div>Daşgınhttp://www.blogger.com/profile/04623308531339912528noreply@blogger.com0