<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2525263810515615938</id><updated>2011-09-26T09:28:36.211+03:00</updated><category term='PHP'/><category term='JPA'/><category term='MovieClub'/><category term='GWT'/><category term='MVC'/><category term='Posix'/><category term='Database'/><category term='Linux'/><category term='ORM'/><category term='Mysql'/><category term='Hibernate'/><category term='MVP'/><category term='Crontab'/><category term='GMVC'/><category term='Ubuntu'/><category term='Oracle'/><category term='Log4j'/><category term='Java'/><category term='GXT'/><category term='Genel'/><category term='Quartz'/><category term='Algoritma'/><title type='text'>Dumlupınar Günlükleri</title><subtitle type='html'>Geleceğe düştüğüm notlar...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-1562862989205370740</id><published>2011-02-25T13:01:00.003+02:00</published><updated>2011-02-25T13:43:03.005+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Log4j'/><title type='text'>Log4j ve standart out</title><content type='html'>Log4j, konfigurasyonlarında çıktı seviyesinin belirtilebilmesine izin veriyor. Buna rağmen;&lt;br /&gt;&lt;br /&gt;isDebugEnabled()&lt;br /&gt;isInfoEnabled()&lt;br /&gt;isWarnEnabled()&lt;br /&gt;isErrorEnabled()&lt;br /&gt;isFatalEnabled()&lt;br /&gt;&lt;br /&gt;metodlarının kullanımına da izin veriliyor. Burda aklımıza şu soru gelebilir "Seviye belirleyebilmemize rağmen bu metodlara ne gerek var?"&lt;br /&gt;&lt;br /&gt;Bildiğimiz gibi, Unix/Linux sunucularda çalışan projelerimizin standart çıktılarını herhangi bir hedefe yönledirebiliyoruz. Bu durumda, bütün log satırları aynı anda hem log4j hedeflerine hem de standart çıktıya akmış oluyor. Normalde Log4j, ayar dosyamıza göre süzme işlemi yapacaktır fakat standart çıktıda süzme gerçekleşmeyecektir, çünkü standart çıktı, işletim sisteminin denetimindedir. Standart çıktıyı dinlediğimizde, almak istemediğimiz tüm logları da almak zorunda kalıyoruz. Bu da diskimizde kapasite sorununa yol açabilir.&lt;br /&gt;&lt;br /&gt;Daha net anlaşılması açısından iki örnek vermek istiyorum;&lt;br /&gt;&lt;br /&gt;Hibernate is..Enabled() metodlarına bakmaksızın log basar. Diyelim ki;&lt;br /&gt;Modelin bir alanı imaj ve 10mb büyüklüğünde bir imajı bu alana yükleyip modeli kaydettiğimizde/okuduğumuzda, hibernate bu 10mb büyüklüğündeki imajı binary olarak loglar. Oysa hibernate, is..Enabled() metodlarını dikkate alarak loglama yapsaydı bu sorunu yaşamayacaktık.&lt;br /&gt;&lt;br /&gt;pseudo kod olarak (log seviyemizi debug'un üstüne varsayarsak)&lt;br /&gt;&lt;br /&gt;//bu değişkenin kapasitesi 10mb diyelim&lt;br /&gt;byte[] stream = ...&lt;br /&gt;&lt;br /&gt;//loglarda bu satır atlanacaktır ama standart çıktıya akacaktır&lt;br /&gt;log.debug(stream)&lt;br /&gt;&lt;br /&gt;//loglarda ve standart çıktıda bu satır atlanacaktır&lt;br /&gt;if (log.isDebugEnabled()) log.debug(stream)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-1562862989205370740?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/1562862989205370740/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2011/02/log4j-ve-standart-out.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/1562862989205370740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/1562862989205370740'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2011/02/log4j-ve-standart-out.html' title='Log4j ve standart out'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-1144845865376579048</id><published>2011-02-24T10:40:00.005+02:00</published><updated>2011-02-26T10:17:51.499+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Algoritma'/><title type='text'>Java dizilerin kartezyen çarpımı</title><content type='html'>Arkadaşımın ihtiyacı üzerine geliştirdiğim algoritmanın java kodları;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class Hadi {&lt;br /&gt;&lt;br /&gt;    private static String[] oldies;&lt;br /&gt;    private static List&lt;String[]&gt; perList = new ArrayList&lt;String[]&gt;();&lt;br /&gt;   &lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        perList.add(new String[] {"ist,","ank,","adn,"});&lt;br /&gt;        perList.add(new String[] {"ali,","veli,","maria,","nursel,"});&lt;br /&gt;        perList.add(new String[] {"elma","armut"});&lt;br /&gt;       &lt;br /&gt;        oldies = new String[perList.size()];&lt;br /&gt;       &lt;br /&gt;        printIt(0);&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    private static void printIt(int level) {&lt;br /&gt;        for (int i = 0; i &lt; perList.get(level).length; i++) {&lt;br /&gt;            oldies[level] = perList.get(level)[i];&lt;br /&gt;           &lt;br /&gt;            if (level &lt; perList.size() - 1) {&lt;br /&gt;                printIt(level + 1);&lt;br /&gt;            }&lt;br /&gt;           &lt;br /&gt;            if (level == perList.size() - 1) {&lt;br /&gt;                for (int j = 0; j &lt; oldies.length; j++) {&lt;br /&gt;                    System.out.print(oldies[j]);&lt;br /&gt;                }&lt;br /&gt;                System.out.println();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Çıktısı ise;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ist,ali,elma&lt;br /&gt;ist,ali,armut&lt;br /&gt;ist,veli,elma&lt;br /&gt;ist,veli,armut&lt;br /&gt;ist,maria,elma&lt;br /&gt;ist,maria,armut&lt;br /&gt;ist,nursel,elma&lt;br /&gt;ist,nursel,armut&lt;br /&gt;ank,ali,elma&lt;br /&gt;ank,ali,armut&lt;br /&gt;ank,veli,elma&lt;br /&gt;ank,veli,armut&lt;br /&gt;ank,maria,elma&lt;br /&gt;ank,maria,armut&lt;br /&gt;ank,nursel,elma&lt;br /&gt;ank,nursel,armut&lt;br /&gt;adn,ali,elma&lt;br /&gt;adn,ali,armut&lt;br /&gt;adn,veli,elma&lt;br /&gt;adn,veli,armut&lt;br /&gt;adn,maria,elma&lt;br /&gt;adn,maria,armut&lt;br /&gt;adn,nursel,elma&lt;br /&gt;adn,nursel,armut&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-1144845865376579048?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/1144845865376579048/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2011/02/javada-dizilerin-kartezyen-carpm.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/1144845865376579048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/1144845865376579048'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2011/02/javada-dizilerin-kartezyen-carpm.html' title='Java dizilerin kartezyen çarpımı'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-8199235071216768215</id><published>2010-10-07T13:30:00.003+03:00</published><updated>2010-10-07T13:55:19.437+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ubuntu üzerine Oracle Client kurulumu ve SQL*Plus kullanımı</title><content type='html'>Bu yazımda sizlerle Oracle Client ve SQL*Plus arabiriminin Ubuntu 10 Server üzerine nasıl kurulduğunu/düzenlendiğini anlatacağım. Burdaki kurulum işlemi Oracle 10.2 sürümü içindir.&lt;br /&gt;&lt;br /&gt;Paket yüklemeleri&lt;br /&gt;&lt;br /&gt;1) Ubuntunun depolarında OLMAYAN kurulum paketini &lt;a href="http://www.oracle.com/technetwork/database/express-edition/downloads/102xelinsoft-102048.html"&gt;buradan indiriyoruz.&lt;/a&gt;&lt;br /&gt;2) dpkg -i oracle-xe-client_10.2.0.1-1.0_i386.deb ile indirdiğimiz paketi kaynak listesine ekliyoruz.&lt;br /&gt;3) sudo apt-get update ile paketleri güncellemiş oluyoruz (yeni eklediğimiz paket için zorunlu olarak yapmamız gerekiyor)&lt;br /&gt;4) sudo aptitude search oracle komutunu çalıştırdığımızda dönecek olan listede oracle-xe-client olacak.&lt;br /&gt;5) sudo apt-get install oracle-xe-client komutu ile programı kurabiliriz artık.&lt;br /&gt;&lt;br /&gt;~/.profile dosyasının içerisine aşağıdaki satırları ekleyelim&lt;pre&gt;&lt;br /&gt; export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/client&lt;br /&gt; export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`&lt;br /&gt; export SQLPATH=$ORACLE_HOME/sqlplus&lt;br /&gt; export PATH=$ORACLE_HOME/bin:$PATH&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bağlantı ayarlarının yapılması&lt;br /&gt;&lt;br /&gt;/etc/tnsnames.ora dosyasını oluşturup içine tns ayarlarını girelim.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Örn.:&lt;br /&gt;10GTEST =&lt;br /&gt; (DESCRIPTION =&lt;br /&gt;   (ADDRESS =&lt;br /&gt;     (PROTOCOL = TCP)&lt;br /&gt;     (HOST = 192.168.91.171)&lt;br /&gt;     (PORT = 1521)&lt;br /&gt;   )&lt;br /&gt;   (CONNECT_DATA =&lt;br /&gt;     (SERVER = DEDICATED)&lt;br /&gt;     (SERVICE_NAME = 10GTEST)&lt;br /&gt;   )&lt;br /&gt; )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;şimdi bilgisayarı kapatıp açalım.&lt;br /&gt;&lt;br /&gt;SQL*Plus arabiriminin konsoldan çalıştırılması&lt;br /&gt;&lt;br /&gt;     &lt;code&gt;sqlplus 10GTEST&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;artık konsoldan veritabanı işlemleri yapabiliriz.&lt;br /&gt;&lt;br /&gt;Bazı düzenlemeler&lt;br /&gt;&lt;br /&gt;1)&lt;br /&gt;&lt;br /&gt;SQL*Plus komut satırında oldukça KULLANIŞSIZ bir arabirim. Bunu kullanışlı hale getirmek için rlwrap gibi bir programa ihtiyacımız var. rlwrap komut satır için kod tamamlama, history tutma, yön tuşları ile komutlar arasında geçiş işlemleri gibi işimize yarayacak pekçok şeyi sunuyor.&lt;br /&gt;&lt;br /&gt;hemen sudo apt-get rlwrap ile yüklüyoruz.&lt;br /&gt;&lt;pre&gt;&lt;code&gt; rlwrap sqlplus&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;şeklinde çağırıyoruz ve konsoldaki tuş kullanım rahatlığına kavuşuyoruz.&lt;br /&gt;&lt;br /&gt;Ayrıca rlwrap ın sözlük desteği de bulunuyor. Sözlük desteği ile, daha önceden girdiğiniz keywordleri 1-2 karakter yazpı TAB tuşuna bastığınızda elde edebiliyorsunuz.&lt;br /&gt;&lt;br /&gt;Diyelim $~/sql.dic diye bir dosyanız olsun ve bunun içerisi de şu şekilde olsun&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; select&lt;br /&gt; from&lt;br /&gt; where&lt;br /&gt; recyclebin&lt;br /&gt; purge&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;sqlplus komut satırında iken re yazıp TAB tuşuna basarsanız komut satırı sözlükteki recyclebin keywordunu getirecektir. rlwrap a sözlük kullanımını bildirmek içinse&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt; rlwrap -f sql.dic sqlplus&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; dememiz yetecektir. &lt;br /&gt;&lt;br /&gt;Ben daha kolay olsun diye sistemimi aşağıdaki şekilde ayarladım.&lt;br /&gt;&lt;br /&gt;1) $ORACLE_HOME/bin dizinindeki sqlplus u sqlpuls_asil olarak değiştirdim&lt;br /&gt;2) /usr/bin dizini altına sqlplus adında bir dosya oluşturdum (x+ özellikli), içeriği ise;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;case "$1" in&lt;br /&gt;       db1)&lt;br /&gt;           info="db1/passdb1@10GTEST"&lt;br /&gt;           ;;&lt;br /&gt;       &lt;br /&gt;       db2)&lt;br /&gt;           info="db2/passdb2@10GTEST"&lt;br /&gt;           ;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;if [[ -z "${info}" ]] ; then&lt;br /&gt; echo $"Usage: sqlplus {db1|db2}"&lt;br /&gt;else&lt;br /&gt;  cd $ORACLE_HOME/bin/&lt;br /&gt;  rlwrap -b "" -f $HOME/.sql.dic sqlplus_asil $info&lt;br /&gt;  cd -&lt;br /&gt;fi&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;kullanımı ise;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; sqlplus db1 //db1 e bağlanıyor&lt;br /&gt;ya da&lt;br /&gt; sqlplus db2 //db2 ye bağlanıyor&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2)&lt;br /&gt;&lt;br /&gt;SQL*Plus hazır halde çalıştırıldığında gerek prompt olsun gerek kolon genişliği gibi ayarlar olsun oldukça kullanışsız, bunları düzenlemek için normalde promptan set komutları girilebilir (bu her oturumda tekrar edilmeli). Her oturumda tekrar edecek olan set komutlarının önüne geçebilmek için  bir yol var. $ORACLE_HOME/bin dizini altına login.sql adında bir dosya oluşturup içine de gerekli set komutlarını koyarsak, bu her oturum açıldığında işletilecektir.&lt;br /&gt;&lt;br /&gt;Benim kullandığım login.sql in içeriği ise;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;/* SQL Plus parameters required for each session */&lt;br /&gt;set timing on;&lt;br /&gt;set linesize 150;&lt;br /&gt;set pagesize 500;&lt;br /&gt;set space 1;&lt;br /&gt;set termout off&lt;br /&gt;set sqlprompt "&amp;amp;&amp;amp;_CONNECT_IDENTIFIER'.'&amp;amp;&amp;amp;_USER &gt; "&lt;br /&gt;set pages 500 lines 150&lt;br /&gt;set null empty;&lt;br /&gt;set time on;&lt;br /&gt;set trim on;&lt;br /&gt;set wrap off;&lt;br /&gt;set sqlnumber on;&lt;br /&gt;set describe line on;&lt;br /&gt;set termout on&lt;br /&gt;def _editor=vim&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;artık sqlplus ı çalıştırdığımızda konsolda &lt;br /&gt;SQL&gt; yerine 13:24:33 10GTEST.db1 &gt; ibaresini göreceğiz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-8199235071216768215?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/8199235071216768215/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2010/10/ubuntu-uzerine-oracle-client-kurulumu.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/8199235071216768215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/8199235071216768215'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2010/10/ubuntu-uzerine-oracle-client-kurulumu.html' title='Ubuntu üzerine Oracle Client kurulumu ve SQL*Plus kullanımı'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-1061774466532872435</id><published>2010-07-29T09:07:00.003+03:00</published><updated>2010-07-29T09:27:48.247+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='MovieClub'/><category scheme='http://www.blogger.com/atom/ns#' term='GMVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='GXT'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>GWT ve Ext (GXT) kullanarak geliştirdiğim GMVC kullanıma hazır</title><content type='html'>Java platformunda, Google Web Toolkit (GWT) mimarisi uzerine Ext bileşenleri kullanarak geliştirdigim Model-View-Controller (MVC) çatısı ve bu çatıyı gerçekleyen, örnek MovieClub projesini sizlere sunuyorum. Bu projede, GWT ile uygulama geliştirirken (ya da başlarken diyeyim) karşılaşılan bazı sıkıntıların çözümünü bulabilirsiniz. MovieClub projesi, adından da anlaşılacağı üzere DVD/VCD kiralama/satma işi yapan firmaların iş takibini yapıyor. Yukarıda da belirttiğim gibi GMVC çatısını gerçekliyor.&lt;br /&gt;&lt;br /&gt;GWT ile ilgili forumlarda ağırlıklı olarak aşagidaki başlıklara dair sorular bulunuyor, projede bu soruların yanıtını veren çözumler gelistirdim. Ayrıca, projenin javadoc larını tamamen Türkçe hazırladım ki framework ü inceleyen arkadaşlar sıkıntı çekmesin.&lt;br /&gt;&lt;br /&gt;Genel olarak yaşanan sıkıntılar;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Hibernate implementasyonu,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Login formu ve kullanıcı hak denetimlerinin yapılması,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;RPC ile SuggestionBox bileşeni geliştirilmesi,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;MVC çatısı ve cok katmanlı programlama,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Jasper Report kullanımı/entegrasyonu,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GWT de Modül yazimi/kullanımının örneği,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;RPC servislerin kalıtımla elde edilebilmesi,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Olay temelli programlama/haberleşme,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Projenin Ant Script ile WAR dosyasının hazırlanması&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;strong&gt;Bağlantılar&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/g-mvc"&gt;Projenin Hostu için burayı&lt;/a&gt;&lt;br /&gt;&lt;a href="http://g-mvc.googlecode.com/svn/trunk/MovieClub"&gt;SVN adresi için burayı&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/g-mvc/downloads/detail?name=screenshots.zip"&gt;Projeden goruntuler için burayı&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/g-mvc/downloads/detail?name=movieclub.war"&gt;WAR dosyasi için de burayı kullanabilirsiniz&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-1061774466532872435?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/1061774466532872435/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2010/07/gmvc-ckt.html#comment-form' title='3 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/1061774466532872435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/1061774466532872435'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2010/07/gmvc-ckt.html' title='GWT ve Ext (GXT) kullanarak geliştirdiğim GMVC kullanıma hazır'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-5469813413158756575</id><published>2010-05-10T14:16:00.006+03:00</published><updated>2010-05-10T14:45:06.236+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Algoritma'/><title type='text'>Ortalama vade bulma</title><content type='html'>Toplu çek alış/verişlerde, birden fazla çek vermek yerine tek çek verildiğini görmüşsünüzdür. Bu yazıda sizlere java kodları ile ortalama vade nasıl bulunur bunu anlatacağım. Kodlamaya geçmeden önce, anlatımı somutlaştırmak adına üç ayrı senaryo oluşturarak hesaplamaları bunlar üzerinden yapacağım. Tüm senaryolar için, içinde bulunduğumuz tarihi : 04/03/2010 alalım ve bu tarihe BAZ TARİH diyelim.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;Senaryo 1:&lt;br /&gt;---------- --------&lt;br /&gt;Vade       Tutar&lt;br /&gt;---------- --------&lt;br /&gt;04/04/2010   100 TL&lt;br /&gt;04/05/2010   100 TL&lt;br /&gt;04/06/2010   100 TL&lt;br /&gt;---------- --------&lt;br /&gt;toplam  : 300 TL&lt;br /&gt;vadeler : 30 gün&lt;br /&gt;&lt;br /&gt;Senaryo 2:&lt;br /&gt;-------------------&lt;br /&gt;Vade       Tutar&lt;br /&gt;---------- --------&lt;br /&gt;04/04/2010   300 TL&lt;br /&gt;04/05/2010   500 TL&lt;br /&gt;04/06/2010  1000 TL&lt;br /&gt;---------- --------&lt;br /&gt;toplam  : 1800 TL&lt;br /&gt;vadeler : 30 gün&lt;br /&gt;&lt;br /&gt;Senaryo 3:&lt;br /&gt;-------------------&lt;br /&gt;Vade       Tutar&lt;br /&gt;---------- --------&lt;br /&gt;01/04/2010   600 TL&lt;br /&gt;22/05/2010   300 TL&lt;br /&gt;13/06/2010   500 TL&lt;br /&gt;---------- --------&lt;br /&gt;toplam  : 1400 TL&lt;br /&gt;vadeler : düzensiz&lt;br /&gt;-------------------------------------------------------------------&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;İlk etapta ortalama vadenin nasıl bulunduğunu formül bazında görelim. (İsimlendirmeler terminolojiye uygun olmayabilir. Buradaki amacım, bir programcının ortalama vade hesabını nasıl yapacağını izah etmek. Bu yüzden isimlendirmelere çok özenmedim.)&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;1 - Çek tutarları toplanarak toplam tutar bulunur (TT)&lt;br /&gt;2 - Her bir çekin vadesinin baz tarihe olan uzaklığı gün cinsinden bulunur (VG)&lt;br /&gt;3 - Bu gün farklarının tamamı toplanır ve vade günlerinin toplamı bulunur (TVG)&lt;br /&gt;4 - Toplam Vade Günleri, Toplam Tutara bölünerek Ortak Çarpan bulunur (TVG/TT=OÇ)&lt;br /&gt;5 - Herbir çek için; Ortak Çarpan, vade günü ve çekin tutarı çarpılarak Derece bulunur (D)&lt;br /&gt;6 - Derece, Toplam Vade Gününe bölünerek Etki Mesafesi bulunur (D/OÇ=EM)&lt;br /&gt;7 - Etki Mesafeleri toplanarak Baz Tarihe eklenir ve ortlama vade bulunmuş olur&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Senaryo-1 çeklerini yukarıdaki formüle göre hesaplarsak,&lt;br /&gt;&lt;code&gt;&lt;br /&gt;1 - TT=300&lt;br /&gt;2 - VG1=31, VG2=61, VG3=92&lt;br /&gt;3 - TVG=184&lt;br /&gt;4 - OÇ=0.61&lt;br /&gt;5 - D1=1901.33, D2=3741.33, D3=5642.67&lt;br /&gt;6 - EM1=10.33, EM2=20.33, EM3=30.67 (Toplam=61.33 gün eder)&lt;br /&gt;7 - 04/03/2010 + 61.33 = 04/05/2010&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Bu durumda:&lt;br /&gt;Senaryo-1 in ortalama vadesi  : 04/05/2010&lt;br /&gt;Senaryo-2 nin ortalama vadesi : 16/05/2010&lt;br /&gt;Senaryo-3 ün ortalama vadesi  : 08/05/2010 olur&lt;br /&gt;&lt;br /&gt;Java'da nasıl yapıldığına gelince de;&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint lang-java"&gt;&lt;br /&gt;import java.text.SimpleDateFormat;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Calendar;&lt;br /&gt;import java.util.Date;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;public class Valor {&lt;br /&gt;  &lt;br /&gt;   /*&lt;br /&gt;    * Girisi noktasi ve ornekleme&lt;br /&gt;    */&lt;br /&gt;   public static void main(String[] args) {&lt;br /&gt;       Date base = new Date("2010/03/04");&lt;br /&gt;       List&amp;lt;Cheque&amp;gt; chequeList = new ArrayList&amp;lt;Cheque&amp;gt;();&lt;br /&gt;      &lt;br /&gt;       chequeList.add(new Cheque( new Date("2010/04/01"), 600));&lt;br /&gt;       chequeList.add(new Cheque(new Date("2010/05/22    "), 300));&lt;br /&gt;       chequeList.add(new Cheque(new Date("2010/06/13"), 500));&lt;br /&gt;      &lt;br /&gt;       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");&lt;br /&gt;       System.out.println(sdf.format(getAvgDate(base, chequeList)));&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /*&lt;br /&gt;    * Asil hesaplarin yapildigi kisim burasi&lt;br /&gt;    */&lt;br /&gt;   private static Date getAvgDate(Date base, List&amp;lt;Cheque&amp;gt; chequeList) {&lt;br /&gt;       double totalAmount = 0;&lt;br /&gt;       double totalDays = 0;&lt;br /&gt;       int index = 0;&lt;br /&gt;       double totalEffects = 0;&lt;br /&gt;       List&amp;lt;Integer&amp;gt; dayDitanceList = new ArrayList&amp;lt;Integer&amp;gt;();&lt;br /&gt;      &lt;br /&gt;       for (Cheque c: chequeList) {&lt;br /&gt;           int days = getDateDiff(c.maturity, base);&lt;br /&gt;          &lt;br /&gt;           dayDitanceList.add(days);&lt;br /&gt;           totalDays += days;&lt;br /&gt;           totalAmount += c.amount;&lt;br /&gt;       }&lt;br /&gt;       double factor = totalDays / totalAmount;&lt;br /&gt;      &lt;br /&gt;       for (Cheque c: chequeList) {&lt;br /&gt;           double degree = factor * c.amount * dayDitanceList.get(index);&lt;br /&gt;           double effect = degree / totalDays;&lt;br /&gt;           totalEffects += effect;&lt;br /&gt;           index++;&lt;br /&gt;       }&lt;br /&gt;      &lt;br /&gt;       return addDate(base, new Double(totalEffects).intValue());&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   /*&lt;br /&gt;    * Iki tarih arasindaki gun farkini bulur&lt;br /&gt;    */&lt;br /&gt;   private static int getDateDiff(Date big, Date little) {&lt;br /&gt;       long diff = big.getTime() - little.getTime();&lt;br /&gt;       return (int) (diff / (1000 * 60 * 60 * 24) + 1);       &lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   /*&lt;br /&gt;    * Verilen tarihe gun ekler&lt;br /&gt;    */&lt;br /&gt;   private static Date addDate(Date date, int day) {&lt;br /&gt;       Calendar cal = Calendar.getInstance();&lt;br /&gt;       cal.setTime(date);&lt;br /&gt;       cal.add(Calendar.DAY_OF_MONTH, day);&lt;br /&gt;       return cal.getTime();       &lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   /*&lt;br /&gt;    * Orneklemenin daha net okunabilmesi icin, cek bilgilerini tasiyan pojo&lt;br /&gt;    */&lt;br /&gt;   private static class Cheque {&lt;br /&gt;      &lt;br /&gt;       private Date maturity;&lt;br /&gt;       private double amount;&lt;br /&gt;      &lt;br /&gt;       Cheque(Date maturity, double amount) {&lt;br /&gt;           this.maturity = maturity;&lt;br /&gt;           this.amount = amount;&lt;br /&gt;       }&lt;br /&gt;      &lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-5469813413158756575?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/5469813413158756575/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2010/05/ortalama-vade-bulma.html#comment-form' title='1 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/5469813413158756575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/5469813413158756575'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2010/05/ortalama-vade-bulma.html' title='Ortalama vade bulma'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-674184243088205222</id><published>2010-02-12T09:27:00.008+02:00</published><updated>2010-05-10T14:16:13.329+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mysql'/><title type='text'>Mysql'de çok satırlı sorgular</title><content type='html'>Mysql konsolunda çok satırlı sorgular hazırlarken, uzun sorguların yazımı sıkıntı verebilir, ne de olsa tüm sorguyu tek satırda yazmanız gerekecektir. Bu sıkıntıdan kurtulmanın yolu, sorguyu bir editörde hazırladıktan sonra Mysql konsolunda yürütmek olabilir. Benzer şekilde Mysql çok satırlı sorgular için dahili vi editörünü sunuyor. Konsol kısmında iken \e; yazıp enter' a basarsanız size vi editörü açılacaktır. Aşağıda nasıl yapıldığının resmi var;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_eumjEueO0Ow/S3UF1ZUZaMI/AAAAAAAAABA/n6QbCeEsb8A/s1600-h/mysqlkonsol.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 279px;" src="http://2.bp.blogspot.com/_eumjEueO0Ow/S3UF1ZUZaMI/AAAAAAAAABA/n6QbCeEsb8A/s400/mysqlkonsol.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5437258540007385282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Burda da basit bir sorgu örneği;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_eumjEueO0Ow/S3UFQalBsII/AAAAAAAAAA4/L-Nr5xIX1qg/s1600-h/mysqlkonsolvi.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 229px;" src="http://2.bp.blogspot.com/_eumjEueO0Ow/S3UFQalBsII/AAAAAAAAAA4/L-Nr5xIX1qg/s400/mysqlkonsolvi.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5437257904690409602" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vi editöründen çıkarken:&lt;br /&gt;&lt;br /&gt;Yazdığınız sorgunun yürütülmesini istiyorsanız;&lt;br /&gt;:wq {enter}&lt;br /&gt;&lt;br /&gt;Yazdığınız sorgunun yürütülmesini istemiyorsanız;&lt;br /&gt;:q! {enter}&lt;br /&gt;&lt;br /&gt;tuşlamanız yeterli.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-674184243088205222?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/674184243088205222/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2010/02/mysqlde-cok-satrl-query.html#comment-form' title='1 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/674184243088205222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/674184243088205222'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2010/02/mysqlde-cok-satrl-query.html' title='Mysql&apos;de çok satırlı sorgular'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_eumjEueO0Ow/S3UF1ZUZaMI/AAAAAAAAABA/n6QbCeEsb8A/s72-c/mysqlkonsol.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-3944335604921886204</id><published>2010-02-09T15:02:00.005+02:00</published><updated>2010-02-09T15:13:25.337+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>PHP sayıyı yazıya çevirme</title><content type='html'>PHP kullanmaya başladım, yazdığım ilk ciddi kod parçasını sizlerle paylaşmak istiyorum. Bu kod parçası, verilen sayıyı yazıya çeviriyor. Fatura ve makbuzların alt kısımında gördüğümüz &lt;span style="font-weight:bold;font-style:italic;"&gt;yalnız ikiyüzaltmışüç liradır&lt;/span&gt;. şeklindeki ifadeleri elde etmek için kullanılabilir.&lt;br /&gt;&lt;br /&gt;Kod:&lt;pre&gt;&lt;code class="prettyprint lang-bsh"&gt;&lt;br /&gt;&amp;lt;?&lt;br /&gt;function sayi2yazi($sayi) {&lt;br /&gt;  $birler = array("","bir","iki","üç","dört","beş","altı","yedi","sekiz",&lt;br /&gt;                     "dokuz");&lt;br /&gt;  $onlar = array("","on","yirmi","otuz","kırk","elli","altmış","yetmiş",&lt;br /&gt;                     "seksen","doksan");&lt;br /&gt;  $ustler= array("","bin","milyon","milyar","trilyon");&lt;br /&gt;&lt;br /&gt;  echo $sayi . " -&amp;gt; ";&lt;br /&gt;  &lt;br /&gt;  $kalan = strlen($sayi) % 3; &lt;br /&gt;  if ($kalan != 0) $sayi = str_repeat("0", 3-$kalan) . $sayi;&lt;br /&gt;  $parcalar = str_split($sayi, 3);&lt;br /&gt;  $parca_adedi = sizeof($parcalar);&lt;br /&gt;&lt;br /&gt;  $sonuc= "";&lt;br /&gt;  for ($i = $parca_adedi; $i &amp;gt; 0; $i--) {&lt;br /&gt;&lt;br /&gt;      $p_yazi = "";&lt;br /&gt;      $parca = $parcalar[$i-1];&lt;br /&gt;&lt;br /&gt;      for ($j = 0; $j &amp;lt; strlen($parca); $j++) {&lt;br /&gt;       $bit = $parca[$j];&lt;br /&gt;       if ($bit != 0) {&lt;br /&gt;        switch ($j)  {&lt;br /&gt;            case 0: {&lt;br /&gt;            if ($bit != 1) $p_yazi .= $birler[$bit];&lt;br /&gt;            $p_yazi .= "yüz";&lt;br /&gt;            break;&lt;br /&gt;            }&lt;br /&gt;            case 1: {&lt;br /&gt;            $p_yazi .= $onlar[$bit];&lt;br /&gt;            break;&lt;br /&gt;            }&lt;br /&gt;            case 2: {&lt;br /&gt;            $p_yazi .= $birler[$bit];&lt;br /&gt;            break;&lt;br /&gt;           }&lt;br /&gt;        }&lt;br /&gt;       }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      if ($p_yazi=="bir" &amp;amp;&amp;amp; $ustler[$parca_adedi-$i]=="bin") &lt;br /&gt;        $sonuc = $ustler[$parca_adedi - $i] . $sonuc; &lt;br /&gt;      else &lt;br /&gt;        $sonuc = $p_yazi . $ustler[$parca_adedi - $i] . $sonuc;&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;  return $sonuc . "\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;echo sayi2yazi(1);&lt;br /&gt;echo sayi2yazi(101);&lt;br /&gt;echo sayi2yazi(101101);&lt;br /&gt;echo sayi2yazi(1001);&lt;br /&gt;echo sayi2yazi(10010);&lt;br /&gt;echo sayi2yazi(120230123);&lt;br /&gt;echo sayi2yazi(712328);&lt;br /&gt;echo sayi2yazi(42340738);&lt;br /&gt;echo sayi2yazi(10101078);&lt;br /&gt;echo sayi2yazi(23474854234234);&lt;br /&gt;echo sayi2yazi(2347485423423);&lt;br /&gt;echo sayi2yazi(72238);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Ekran çıktısı:&lt;pre&gt;&lt;br /&gt;   mdpinar@mdpinar-desktop:~/php$ php sayi2yazi.php&lt;br /&gt;   1 -&gt; bir&lt;br /&gt;   101 -&gt; yüzbir&lt;br /&gt;   101101 -&gt; yüzbirbinyüzbir&lt;br /&gt;   1001 -&gt; binbir&lt;br /&gt;   10010 -&gt; onbinon&lt;br /&gt;   120230123 -&gt; yüzyirmimilyonikiyüzotuzbinyüzyirmiüç&lt;br /&gt;   712328 -&gt; yediyüzonikibinüçyüzyirmisekiz&lt;br /&gt;   42340738 -&gt; kırkikimilyonüçyüzkırkbinyediyüzotuzsekiz&lt;br /&gt;   10101078 -&gt; onmilyonyüzbirbinyetmişsekiz&lt;br /&gt;   23474854234200 -&gt; yirmiüçtrilyondörtyüzyetmişdörtmilyarsekizyüzellidörtmilyonikiyüzotuzdörtbinikiyüz&lt;br /&gt;   2347485423420 -&gt; ikitrilyonüçyüzkırkyedimilyardörtyüzseksenbeşmilyondörtyüzyirmiüçbindörtyüzyirmi&lt;br /&gt;   72238 -&gt; yetmişikibinikiyüzotuzsekiz&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-3944335604921886204?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/3944335604921886204/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2010/02/php-sayy-yazya-cevirme.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/3944335604921886204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/3944335604921886204'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2010/02/php-sayy-yazya-cevirme.html' title='PHP sayıyı yazıya çevirme'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-8300896589636718968</id><published>2010-01-26T11:55:00.005+02:00</published><updated>2010-01-26T13:56:11.616+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>Hibernate konfigurasyonu</title><content type='html'>Yeni geliştirmek istediğiniz projede Seam, Spring... gibi genel kabül görmüş framework'lerden birisini kullanmak yerine kendi araç setinizi seçmek isterseniz ve projenizde veritabanı işlemleri için ORM (Object Relation Mapping) araçlarını kullanmak isterseniz neler yapmalısınız?&lt;br /&gt;&lt;br /&gt;Bu yazımda, kısaca Java'da kalıcılık API'sini tanıtmak ve ORM araçlarından en popüler olanı Hibernate ile ilgili giriş düzeyinde bir örnek paylaşmak istiyorum. &lt;br /&gt;&lt;br /&gt;JPA (Java Persistence API), JCP (Java Community Process - Java teknolojileri için spesifikasyon belirleyen gurup) tarafından spec'leri belirlenmiş, kalıcılık/ORM araçlarının manifestosu olan bir API'dir. Her JCP spec'inin bir RI (Reference Implementation) vardır, JPA' nın da refrence implementation' u Oracle' ın Toplink' idir. Fakat yaygın kullanım olarak Hibernate tercih ediliyor.&lt;blockquote&gt;&lt;br /&gt;Normalde JCP de işler şu sırayla işler;&lt;br /&gt; - Community'nin ihtiyaçlarına göre spec'ler hazırlanır (JPA, JMS, JSF, JTA ...)&lt;br /&gt; - Bu spec'lere uygun referans gerçekleştirimleri -RI- yapılır (JPA için Oracle Toplink'tir)&lt;br /&gt; - Daha özel ihtiyaçlara göre farklı gerçekleştirimler yapılır (Hibernate, OpenJPA, IBatis ...)&lt;/blockquote&gt;&lt;br /&gt;Fakat ORM araçları için bu adımlar biraz ters işledi, şöyle ki; JPA spec'leri yokken Hibernate yoğun olarak kullanılıyordu. Bir anlamda işin bürokrasisi için JPA spec'leri Hibernate'den sonra hazırlandı.&lt;br /&gt;&lt;br /&gt;Tüm spec'lerde olduğu gibi JPA'da tek başına kullanılamaz. Verilerinizi işlemek için gerçekleştirim API' lerine ihtiyaç duyarsınız. Aşağıda hibernate özelinde bunları görebilirsiniz.&lt;br /&gt;&lt;br /&gt;Geliştireceğiniz projeye başlamadan önce classpath de bulunması gereken bazı jar dosyaları var.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Zorunlu olanlar:&lt;br /&gt; hibernate3.jar&lt;br /&gt; antlr-2.7.6.jar&lt;br /&gt; common-collections-3.1.jar&lt;br /&gt; dom4j-1.6.1.jar&lt;br /&gt; javasist-3.9.0.GA.jar&lt;br /&gt; jta-1.1.jar&lt;br /&gt; cglib.jar&lt;br /&gt; &lt;br /&gt;Seçeneğe bağlı zorunlu olanlar:&lt;br /&gt; ejb3-persistence.jar (EJB kullanacaksanız)&lt;br /&gt; javax.persistence-1.xx.x.xxxxxxxxxx.jar&lt;br /&gt;&lt;br /&gt;Seçeneğe göre zorunlu olanlar:&lt;br /&gt; mysql,&lt;br /&gt; hsql,&lt;br /&gt; oracle,&lt;br /&gt; mssql driver larından birisinin jar dosyası&lt;br /&gt;&lt;br /&gt;Annotation'lar ile setup yapılacaksa, seçimlik:&lt;br /&gt; hibernate-annototaions.jar&lt;br /&gt;&lt;br /&gt;Kolon geçerlilik denetimleri yapılacaksa, seçimlik:&lt;br /&gt; hibernate-validator.jar&lt;br /&gt;&lt;br /&gt;Gelişmiş arama yapısı kullanılacaksa, seçimlik:&lt;br /&gt; hibernate-search.jar&lt;br /&gt; lucene-core-x.y.z.jar&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Hibernate ORM ayarları için iki seçenek sunar, xml ile ve annotation' lar ile. Ben, daha yeni olduğu için annotation' ları kullanacağım.&lt;br /&gt;&lt;br /&gt;İlk önce, projemizin root klasöründe hibernate.cfg.xml isimli master setup dosyamız olmalı. Bu dosya içerisinde, veritabanı ve Hibernate için üst düzey seçenekler ve değerleri yer alır.&lt;br /&gt;Kullanıcı adı, şifre, veritabanı bağlantı url'i,  db sürücüsü, kullanılacak dialect, vs... gibi. Mysql e bağlanmak için basit olarak aşağıdaki gibi bir konfigurasyon dosyası kullanılabilir.&lt;br /&gt;&lt;blockquote&gt;&lt;code class="prettyprint lang-xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;hibernate-configuration&amp;gt;&lt;br /&gt;    &amp;lt;session-factory&amp;gt;&lt;br /&gt;        &amp;lt;property name="hibernate.dialect"&amp;gt;org.hibernate.dialect.MySQLInnoDBDialect&amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="hibernate.connection.driver_class"&amp;gt;com.mysql.jdbc.Driver&amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="hibernate.connection.url"&amp;gt;jdbc:mysql://localhost/deneme&amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="hibernate.connection.username"&amp;gt;root&amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="hibernate.connection.password"&amp;gt;12345&amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="hibernate.show_sql"&amp;gt;false&amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="hibernate.hbm2ddl.auto"&amp;gt;update&amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/session-factory&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-configuration&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Bu xml konfigurasyonunda kullanılan seçenekler ve değerleri ile ilgili daha ayrıntılı bilgiler başka bir yazının konusu. Unutmadan, konfigurasyonu sadece xml dosyası ile yapmak zorunda değilsiniz,&lt;br /&gt;properties dosyası kullanılabilir veya kodlama yolunu da seçebilirsiniz ki bu müdaheleleri zorlaştırdığı için pek tercih edilmiyor.&lt;br /&gt;&lt;br /&gt;Modellerin eşlenmesi, kolonların ve ilişkilerin belirlenmesi için annotation kullanacağız. Aşağıda iki model sınıfımız ve bu iki sınıfın nasıl ORM yapıldığını göreceğiz.&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint lang-java"&gt;&lt;br /&gt;User modeli&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;@Table(name="USER")&lt;br /&gt;public class User implements Serializable {&lt;br /&gt;&lt;br /&gt;    private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;    @Id @GeneratedValue(strategy=GenerationType.AUTO)&lt;br /&gt;    @Column(name="ID")&lt;br /&gt;    private Long id;&lt;br /&gt;    &lt;br /&gt;    @Column(name="NAME", length=30, nullable=false, unique=true)&lt;br /&gt;    private String name;&lt;br /&gt;&lt;br /&gt;    @Column(name="PASSWORD", length=32, nullable=false)&lt;br /&gt;    private String password;&lt;br /&gt;    &lt;br /&gt;    @Column(name="REG_DATE")&lt;br /&gt;    @Temporal(TemporalType.TIMESTAMP)&lt;br /&gt;    private Date registrationDate = new Date();&lt;br /&gt;    &lt;br /&gt;    @Column(name="IS_ADMIN")&lt;br /&gt;    private Boolean isAdmin = Boolean.FALSE;&lt;br /&gt;&lt;br /&gt;    public Long getId() {&lt;br /&gt;        return id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setId(Long id) {&lt;br /&gt;        this.id = id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getName() {&lt;br /&gt;        return name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setName(String name) {&lt;br /&gt;        this.name = name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getPassword() {&lt;br /&gt;        return password;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setPassword(String password) {&lt;br /&gt;        this.password = password;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Boolean getIsAdmin() {&lt;br /&gt;        return isAdmin;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setIsAdmin(Boolean isAdmin) {&lt;br /&gt;        this.isAdmin = isAdmin;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Date getRegistrationDate() {&lt;br /&gt;        return registrationDate;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setRegistrationDate(Date registrationDate) {&lt;br /&gt;        this.registrationDate = registrationDate;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UserRole modeli&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;@Table(name="USER_ROLE")&lt;br /&gt;public class UserRole implements Serializable {&lt;br /&gt;&lt;br /&gt;    private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;    @Id @GeneratedValue(strategy=GenerationType.AUTO)&lt;br /&gt;    @Column(name="ID")&lt;br /&gt;    private Long id;&lt;br /&gt;&lt;br /&gt;    @Column(name="INDEX_COL")&lt;br /&gt;    private Integer indexCol;&lt;br /&gt;    &lt;br /&gt;    @ManyToOne&lt;br /&gt;    @JoinColumn(name="USER_ID")&lt;br /&gt;    private User user;&lt;br /&gt;    &lt;br /&gt;    @ManyToOne&lt;br /&gt;    @JoinColumn(name="ROLE_ID")&lt;br /&gt;    private Role role;&lt;br /&gt;&lt;br /&gt;    public Long getId() {&lt;br /&gt;        return id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setId(Long id) {&lt;br /&gt;        this.id = id;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public User getUser() {&lt;br /&gt;        return user;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setUser(User user) {&lt;br /&gt;        this.user = user;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Role getRole() {&lt;br /&gt;        return role;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setRole(Role role) {&lt;br /&gt;        this.role = role;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Integer getIndexCol() {&lt;br /&gt;        return indexCol;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Model tanıtımlarımızda kullandığımız annotation' ları kısaca açıklayalım.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;@Entity  -&gt; Model sınıf olduğunu belirtir (3 tane olan EJB lerden birisi budur, dğerleri ise Oturum ve Mesaj Güdümlü Bean'lardır)&lt;br /&gt;@Table  -&gt; Tablo ve parentezlerden sonra da özelliklerini belirtir&lt;br /&gt;@Id   -&gt; Modelin ID alanını belirtir&lt;br /&gt;@GeneratedValue -&gt; ID alanının farklılaştırılma seçeneğini belirtir, strategy=GenerationType.AUTO kullanarak otomatik artan bir ID alanına sahip oluruz&lt;br /&gt;@Column  -&gt; Kolon ve parentezlerden sonra da özelliklerini belirtir&lt;br /&gt;@Temporal -&gt; Tarihin şeklini belirtir&lt;br /&gt;@ManyToOne -&gt; Tablolar arası ilişkilerden ÇokaBir'i belirtir, LookUp table yapısı &lt;br /&gt;@JoinColumn -&gt; İlişkinin hangi kolon üzerinden olacağını ve yapısını belirtir&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Bu ve diğer annotation'lar başka bir yazının konusu. Burda dikkatinizi çekmek istediğim önemli bir nokta var. Kolon türleri hep Wrapper Class olarak belirlenmiş, primitif olarak belirlenemez miydi? Evet belirlenebilirdi fakat veritabanından dönen değerler her zaman dolu olmayabilir bazen NULL değeri elde ederiz. Bu durumda primitif değişkene NULL atamaya kalkmış oluruz ki bu hataya sebep olur. Bu yüzden kolon türlerini her zaman Wrapper sınıflardan seçin.&lt;br /&gt;&lt;br /&gt;Tanımladığımız bu modellerin Hibernate bildirim için yine yaygın olarak aşağıdaki gibi bir yol izleyeceğiz.&lt;br /&gt;&lt;br /&gt;Genel tercih olarak projemize DBUtils isimli bir sınıf ve içine de şu satırları ekleyelim.&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint lang-xml"&gt;&lt;br /&gt;    //database oturum yöneticisi&lt;br /&gt;    private static SessionFactory sessionFactory = null;&lt;br /&gt;    &lt;br /&gt;    //singleton patterni yapısında tasarlayalım ki, fazladan instance ın önüne geçelim,&lt;br /&gt;    //bu metodu projeniz startup olurken bir kere çağırmalısınız&lt;br /&gt;    public static void init() {&lt;br /&gt;     &lt;br /&gt;     if (sessionFactory == null) {&lt;br /&gt;      try {&lt;br /&gt;       //oturum yöneticisine kullanacağımız model sınıflarımızı bildirerek konfigure ediyoruz&lt;br /&gt;       sessionFactory = new AnnotationConfiguration()&lt;br /&gt;        .addAnnotatedClass(User.class)&lt;br /&gt;        .addAnnotatedClass(UserRole.class)&lt;br /&gt;        .configure()&lt;br /&gt;        .buildSessionFactory(); //root klasördeki xml/properties dosyamıza otomatik olarak bakacak&lt;br /&gt;    &lt;br /&gt;    //bağlantı işlemi başarılı olmuş mu, kontrol ediyoruz&lt;br /&gt;    try {&lt;br /&gt;        Transaction tx = getSession().beginTransaction();&lt;br /&gt;        if (tx.isActive()) tx.rollback();&lt;br /&gt;        System.out.println("Database connection successful.");&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;     e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;   } catch (Exception e) {&lt;br /&gt;    e.printStackTrace();&lt;br /&gt;   }&lt;br /&gt;     } else {&lt;br /&gt;      System.out.println("Factory not null!");&lt;br /&gt;     }&lt;br /&gt;     &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    //oturum taleplerini tek bir noktadan idare edebilmek için bu sınıf içerisinde talepleri karşılıyoruz    &lt;br /&gt;    public static Session getSession() {&lt;br /&gt;     Session session = null;&lt;br /&gt;     try {&lt;br /&gt;  //her talepte yeni bir oturum açılır, oturum ile connection u karıştırmamalıyız&lt;br /&gt;      session = sessionFactory.openSession();&lt;br /&gt;     } catch(Exception e) {&lt;br /&gt;      System.out.println("Session getting error!");&lt;br /&gt;     }&lt;br /&gt;     return session;&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Bu işlemlerden sonra artık projemizin herhangi bir yerinden istediğimiz gibi CRUD (Create, Read, Update, Delete) işlemleri yapabiliriz.&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint lang-xml"&gt;&lt;br /&gt;Ekleme/Güncelleme&lt;br /&gt; Session session = DBUtils.getSession();&lt;br /&gt; User user = new User("Mustafa", "12345", false);&lt;br /&gt; session.saveOrUpdate(user);&lt;br /&gt; session.close();&lt;br /&gt;&lt;br /&gt;Tekli Okuma&lt;br /&gt; Session session = DBUtils.getSession();&lt;br /&gt; User user = (User) session.load(User.class, 3L);&lt;br /&gt; session.close();&lt;br /&gt;&lt;br /&gt;Liste şeklinde okuma&lt;br /&gt; Session session = DBUtils.getSession();&lt;br /&gt; List&lt;User&gt; userList = (List&lt;User&gt;) session.createQuery("from User u").list();&lt;br /&gt; session.close();&lt;br /&gt;&lt;br /&gt;Silme&lt;br /&gt; Session session = DBUtils.getSession();&lt;br /&gt; User user = (User) session.load(User.class, 3L);&lt;br /&gt; session.remove(user); //veya session.remove(session.load(User.class, 3L));&lt;br /&gt; session.close();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Son olarak;&lt;br /&gt;Hibernate'in hedefi sadece CRUD işlemleridir, daha fazlası için uygun değildir, örneğin büyük mitarda verileri transfer etme ve işleme gibi.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-8300896589636718968?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/8300896589636718968/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2010/01/hibernate-konfigurasyonu.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/8300896589636718968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/8300896589636718968'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2010/01/hibernate-konfigurasyonu.html' title='Hibernate konfigurasyonu'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-4179367530978218086</id><published>2010-01-20T10:35:00.005+02:00</published><updated>2010-01-25T15:59:54.358+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Hibernate'de equals metodu</title><content type='html'>Hibernate entity lerinde class ların equals metodlarını ezmeleri neden önemli? Kısaca; "equals metodu ezmezseniz, List ve Map yapıları üzerindeki entitylerden var olduğunu bildiklerinize ulaşamazsınız!" denilebilir.&lt;br /&gt;&lt;br /&gt;Örneklersek; Arac isimli bir modelimiz olsun.&lt;br /&gt;&lt;br /&gt;Arac sınıfımız&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint lang-java"&gt;public class Arac implements Serializable {&lt;br /&gt;&lt;br /&gt; private Long id;&lt;br /&gt; private String plaka;&lt;br /&gt;&lt;br /&gt; public Arac() {&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Arac(Long id, String plaka) {&lt;br /&gt;     super();&lt;br /&gt;     this.id = id;&lt;br /&gt;     this.plaka = plaka;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Long getId() {&lt;br /&gt;     return id;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setId(Long id) {&lt;br /&gt;     this.id = id;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getPlaka() {&lt;br /&gt;     return plaka;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setPlaka(String plaka) {&lt;br /&gt;     this.plaka = plaka;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Arac tablosu verileri&lt;br /&gt;&lt;pre&gt;ID  PLAKA&lt;br /&gt;--- -----------&lt;br /&gt; 1  34-AB-034&lt;br /&gt; 2  34-BC-035&lt;br /&gt; 3  34-CD-036&lt;br /&gt; 4  34-DE-037&lt;br /&gt; 5  34-EF-038&lt;br /&gt; 6  34-FG-039&lt;br /&gt; 7  34-GH-040&lt;/pre&gt;&lt;br /&gt;Projemizde, tüm araçları içeren bir List/Map kullandığımızı düşünelim.&lt;br /&gt;     &lt;pre&gt;&lt;code class="prettyprint lang-java"&gt;&lt;br /&gt;     List&amp;lt;Arac&amp;gt; aracList = new ArrayList&amp;lt;Arac&amp;gt;();&lt;br /&gt;&lt;br /&gt;     //hibernate ile çektiğimiz araçları listeye dolduralım&lt;br /&gt;&lt;br /&gt;     //listeden aradığımız (ve var olduğunu kesin olarak bildiğimiz) aracı istiyoruz&lt;br /&gt;     Arac bulunan = aracList.get(new Arac(1L, "34-AB-034"));&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Normalde üst kısımda aradığımız aracı bulurduk fakat hibernate kanalı ile elde ettiğimiz modeller için hashcode, her talepte yeniden oluşturuluyor! Tüm nesnelerin temeli olan Object sınıfındaki equals metodu eşitlik karşılaştırmasında hashcode değerine baktığı için equals değeri bu durumda false dönüyor. List ve Map yapılarında bir nesne aranırken equals metodundan faydalanılıyor. Eğer aranan ile bakılanın equals metodları true dönerse aranılan bulunmuş oluyor ve döngü sonlandırılıyor aksi halde aranılan bulunamıyor.&lt;br /&gt;&lt;br /&gt;Özetlersek; List ve Map gibi veri yapıları içerisine hibernate kanalı ile doldurduğumuz nesnelerin equals metodunu uygun bir biçimde ezmezsek, List/Map üzerinde yapacağımız aramalarda aradığımızı bulamayabiliriz. En uygun ezme yolunun, List/Map e dolduracağımız entity nin ID alanı kıyaslaması olduğunu düşünüyorum.&lt;br /&gt;&lt;br /&gt;Örnek:&lt;pre&gt; public boolean equals(Object obj) {&lt;br /&gt;  if (obj != null &amp;amp;&amp;amp; obj instanceof Arac) {&lt;br /&gt;   if (((Arac) obj).getId().equals(this.id)) {&lt;br /&gt;    return true;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  return super.equals(obj);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Equals metodunu ezmek yerine hashcode metodu da ezilebilirdi. Hash algoritmaları yazmak equals metodunu ezmekten daha zahmetlidir. hashcode metodunu ezme seçeneğine, gerçekten daha verimli ve lazım olduğunu düşündüğünüz durumlarda bakın derim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-4179367530978218086?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/4179367530978218086/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2010/01/hibernatede-equals-metodu.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/4179367530978218086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/4179367530978218086'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2010/01/hibernatede-equals-metodu.html' title='Hibernate&apos;de equals metodu'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-4289535082881771144</id><published>2010-01-15T09:22:00.002+02:00</published><updated>2010-01-15T10:03:02.780+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Crontab'/><category scheme='http://www.blogger.com/atom/ns#' term='Posix'/><category scheme='http://www.blogger.com/atom/ns#' term='Quartz'/><title type='text'>Crontab periyod eşitsizliği</title><content type='html'>Posix sistemlerde yaygın olarak kullanılan ve oldukça da başarılı olan Crontab hizmeti, belirlenen (ya da beklenen) periyodlar için tam da beklendiği gibi davranmayabiliyor. Vereceğimiz periyod bölünmeye dayalı olacaksa bölmek istediğimiz hanenin üst limiti önemli oluyor. Bildiğimiz gibi bu değerler; saniye ve dakika haneleri için 60, saat hanesi için 24 gibi (aslında bu değerler yerine 0 kabul ediyoruz), aynı şekilde hafta ve ay değerlerinin de üst limitlerine göre bölümleme yapmamız önemli oluyor.&lt;br /&gt;&lt;br /&gt;Atlamadan eklemek isterim ki, posix sistem crontablarında saniye hanesi yok! Java' da geliştirilmiş olan Quartz projesinde saniye eklenmiş durumda. Bu yüzden 5 haneli crontablar yerine 6 haneli olanlarını örnekleyeceğim.&lt;br /&gt;&lt;br /&gt;Üst limitler neden önemli? Bunun için bir iki örneğe bakmamız daha iyi olacaktır.&lt;br /&gt;&lt;br /&gt;Aşağıda verilen örneklerde periyodların tamamı eşit zaman aralıkları ile &lt;span style="font-weight: bold;"&gt;TETİKLENECEKTİR&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Her 10 dakikada bir:&lt;br /&gt;* 0/10 * * * ?&lt;br /&gt;&lt;br /&gt;Her 3 saatte bir:&lt;br /&gt;* * 0/3 * * ?&lt;br /&gt;&lt;br /&gt;Aşağıda verilen örneklerde ise periyodların tamamı eşit zaman aralıkları ile &lt;span style="font-weight: bold;"&gt;TETİKLENMEYECEKTİR&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Her 7 dakikada bir:&lt;br /&gt;* 0/7 * * * ?&lt;br /&gt;&lt;br /&gt;Her 40 saniyede bir: (bu 40. ve 0. saniyelerde yani 20 ve 40 sn aralıklarla tetiklenecek)&lt;br /&gt;0/40 * * * * ?&lt;br /&gt;&lt;br /&gt;Crontab hanelerini bölmek istediğimiz değer, ilgili hanenin makisimum değerini kalansız böldüğünde aralıklar eşit oluyor. Yine örnek verecek olursak; Dakika/Saniye hanesini 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30 gibi sayılar maksimum değeri olan 60 ı tam bölecek ve bu şekilde verilen bir periyod eşit zamanlarda tetiklenecektir.&lt;br /&gt;&lt;br /&gt;Üst limitlerde saniye ve dakika için 60, saat içinse 24 olmadığını biliyorum, fakat crontab davranışında son tetikleme 0 içinde yapılıyor bu yüzden saniye ve dakika için 60 ve saat içinde 24 olarak değerlendirebiliriz.&lt;br /&gt;&lt;br /&gt;Yukarıda belirttiğim gibi; Java için geliştirilmiş olan Quartz API, posix lerdeki crontab mantığını gerçeklediği için benzer durumla karşılaşacaksınız, şaşırmayın.&lt;br /&gt;&lt;br /&gt;Son bir küçük uyarı; bölümleme yaparken&lt;br /&gt;0/10 -&gt; her 10. da bir demek (10. da bir kez tetiklenir)&lt;br /&gt;*/10 -&gt; 10. nun her birinde demek oluyor (10. da defalarca kez tetiklenir)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-4289535082881771144?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/4289535082881771144/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2010/01/crontab-periyod-esitsizligi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/4289535082881771144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/4289535082881771144'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2010/01/crontab-periyod-esitsizligi.html' title='Crontab periyod eşitsizliği'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-6146698070580652600</id><published>2010-01-14T10:11:00.003+02:00</published><updated>2010-01-14T11:23:29.976+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='MVP'/><title type='text'>MVC vs MVP</title><content type='html'>Uzun zamandır kullanımda olup ve birçok projenin de anaçatısı durumunda olan MVC (Model-View-Controller) desenine rakip olarak sahneye çıkan ve Google tarafından da ateşli bir biçimde savunulan MVP (Model-View-Presenter) deseni ile ilgili bir mücadele yaşanıyor forumlarda.&lt;br /&gt;&lt;br /&gt;Google tarafından hazırlanan sunumlara baktığımızda MVP için;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GWT dünyasında testleri kolaylaştırdığını&lt;/li&gt;&lt;li&gt;View ile Controller bağlantısının olmadığını&lt;/li&gt;&lt;li&gt;Daha rahat kod geliştirildiğini&lt;/li&gt;&lt;/ul&gt;Yine aynı sunumlarda MVC için ise;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GWT dünyasında testleri zorlaştırdığını&lt;/li&gt;&lt;li&gt;View ile Controller bağlantısının olduğunu (Katı Bağ oluşturuyor diye)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;1980 lerden kalma olduğunu&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;söylüyorlar.&lt;br /&gt;&lt;br /&gt;Google'ın değerlendirmeleri pek insaflıymış gibi gelmedi bana. Evet GWT framework'ünde testleri kolaylaştırdığı doğru olabilir fakat MVC' de View ile Controller' un doğrudan bağlantısı olmak zorunda değil, bu tarz bir kullanım sadece programcının tercihi olabilir. Ayrıca bir teknolojinin eski olması onun kötü olduğu anlamına gelseydi bugün kullandığımız ilişkisel veritabanlarının en berbat teknolojiler olaması gerekirdi zira 1970 li yıllarda geliştirilmişti. Benzer şekilde C dili ve HTML de çok eski zamanlara ait olmalarına rağmen günümüzde yaygın olarak kullanılmakta.&lt;br /&gt;&lt;br /&gt;MVP desenindeki Presenter, Controller ile hemen hemen aynı yapıya sahip, tek fark; MVP'de bulunan EventBus sınıfı. Bu sınıf MVP katmanları arasında haberleşmeden sorumlu. Model, View'i, View'de Presenter'ı tanımıyor. Soyutlama açısından hoş bir yaklaşım. MVP sınıflarındaki tüm olaylar EventBus tarafından handle edilidiği için dispatch da bu sınıfın denetiminde oluyor. Özetle, kimse kimseyi tanımıyor ama EventBus herkesi tanıyor ve haberleştiriyor. Bunun tek dezavantajı ise fazladan bir sınıfımızın olması.&lt;br /&gt;&lt;br /&gt;MVP'deki EventBus işlevini MVC' deki Controller sınıfı pekala yapabilir. MVC'nin gerçekleştirimine göre, View ve Model sınıfları birbirlerini tanımayabilir ve bütün denetim Controller' da olabilir. Zaten adından da anlaşıldığı gibi Controller sınıfı herşeyi kontrol eden ve iş mantıklarının yer aldığı sınıflar olmalıdır.&lt;br /&gt;&lt;br /&gt;Bence, kullanılan dilin imkanları ve programcının tercihlerine göre MVP olsun MVC olsun çok işe yarayabilecekleri gibi bir çok sıkıntının kaynağı da olabilirler. MVC nin en büyük avantajı, genel kabul görmüş olması ve defalarca kendisini ispat etmiş olmasıdır. MVP henüz yeni olduğu için kabul zamanına ihtiyacı var. Ayrıca MVP'nin tercih edilebilmesi için daha net kazanımlar sunması lazım. Controller'a ait bir kısım görevleri ayrı bir sınıfta ele almak ve Model ile View arası iletişim için olay temelli haberleşme yapmak çok cazip bir kazanım gibi durmuyor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-6146698070580652600?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/6146698070580652600/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2010/01/uzun-zamandr-kullanmda-olup-ve-bircok.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/6146698070580652600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/6146698070580652600'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2010/01/uzun-zamandr-kullanmda-olup-ve-bircok.html' title='MVC vs MVP'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2525263810515615938.post-3414651880985361</id><published>2010-01-13T16:33:00.010+02:00</published><updated>2010-01-14T09:30:44.316+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Genel'/><title type='text'>Selam Dünya!</title><content type='html'>Herhangi bir dile başlayan bir programcının ilk denediği, HelloWorld örneği ile blog yayınıma başlamak istiyorum.&lt;br /&gt;&lt;pre&gt;&lt;code class="prettyprint lang-java"&gt;public class HelloWorld {&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt; System.out.println("Selam dünya...");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;Ciddi anlamda zaman darlığı yaşamadığım sürece, bu blogda java, java teknolojileri ve kendime dair bilgileri paylaşacağım. Şimdiden belirtmek isterim ki; burada yazacağım içerikler iddia değildir, sadece ben öyle bildiğim için öyle yazdığım şeylerdir.&lt;br /&gt;&lt;br /&gt;Yazdıklarımın birilerinin işine yaraması ve yapılacak eleştirilerin yapıcı olması umuduyla &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;Selam Dünya...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2525263810515615938-3414651880985361?l=mdpinar.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mdpinar.blogspot.com/feeds/3414651880985361/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://mdpinar.blogspot.com/2010/01/selam-dunya.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/3414651880985361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2525263810515615938/posts/default/3414651880985361'/><link rel='alternate' type='text/html' href='http://mdpinar.blogspot.com/2010/01/selam-dunya.html' title='Selam Dünya!'/><author><name>Mustafa DUMLUPINAR</name><uri>http://www.blogger.com/profile/02201413318683642836</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_eumjEueO0Ow/S03eo38ZGHI/AAAAAAAAAAM/Dg7sJwW8wMU/S220/n623459394_9808.jpg'/></author><thr:total>0</thr:total></entry></feed>
