Log4j, konfigurasyonlarında çıktı seviyesinin belirtilebilmesine izin veriyor. Buna rağmen;
isDebugEnabled()
isInfoEnabled()
isWarnEnabled()
isErrorEnabled()
isFatalEnabled()
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?"
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.
Daha net anlaşılması açısından iki örnek vermek istiyorum;
Hibernate is..Enabled() metodlarına bakmaksızın log basar. Diyelim ki;
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.
pseudo kod olarak (log seviyemizi debug'un üstüne varsayarsak)
//bu değişkenin kapasitesi 10mb diyelim
byte[] stream = ...
//loglarda bu satır atlanacaktır ama standart çıktıya akacaktır
log.debug(stream)
//loglarda ve standart çıktıda bu satır atlanacaktır
if (log.isDebugEnabled()) log.debug(stream)
Dumlupınar Günlükleri
Geleceğe düştüğüm notlar...
25 Şubat 2011 Cuma
24 Şubat 2011 Perşembe
Java dizilerin kartezyen çarpımı
Arkadaşımın ihtiyacı üzerine geliştirdiğim algoritmanın java kodları;
Çıktısı ise;
public class Hadi {
private static String[] oldies;
private static List perList = new ArrayList();
public static void main(String[] args) {
perList.add(new String[] {"ist,","ank,","adn,"});
perList.add(new String[] {"ali,","veli,","maria,","nursel,"});
perList.add(new String[] {"elma","armut"});
oldies = new String[perList.size()];
printIt(0);
}
private static void printIt(int level) {
for (int i = 0; i < perList.get(level).length; i++) {
oldies[level] = perList.get(level)[i];
if (level < perList.size() - 1) {
printIt(level + 1);
}
if (level == perList.size() - 1) {
for (int j = 0; j < oldies.length; j++) {
System.out.print(oldies[j]);
}
System.out.println();
}
}
}
}
Çıktısı ise;
ist,ali,elma
ist,ali,armut
ist,veli,elma
ist,veli,armut
ist,maria,elma
ist,maria,armut
ist,nursel,elma
ist,nursel,armut
ank,ali,elma
ank,ali,armut
ank,veli,elma
ank,veli,armut
ank,maria,elma
ank,maria,armut
ank,nursel,elma
ank,nursel,armut
adn,ali,elma
adn,ali,armut
adn,veli,elma
adn,veli,armut
adn,maria,elma
adn,maria,armut
adn,nursel,elma
adn,nursel,armut
7 Ekim 2010 Perşembe
Ubuntu üzerine Oracle Client kurulumu ve SQL*Plus kullanımı
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.
Paket yüklemeleri
1) Ubuntunun depolarında OLMAYAN kurulum paketini buradan indiriyoruz.
2) dpkg -i oracle-xe-client_10.2.0.1-1.0_i386.deb ile indirdiğimiz paketi kaynak listesine ekliyoruz.
3) sudo apt-get update ile paketleri güncellemiş oluyoruz (yeni eklediğimiz paket için zorunlu olarak yapmamız gerekiyor)
4) sudo aptitude search oracle komutunu çalıştırdığımızda dönecek olan listede oracle-xe-client olacak.
5) sudo apt-get install oracle-xe-client komutu ile programı kurabiliriz artık.
~/.profile dosyasının içerisine aşağıdaki satırları ekleyelim
Bağlantı ayarlarının yapılması
/etc/tnsnames.ora dosyasını oluşturup içine tns ayarlarını girelim.
şimdi bilgisayarı kapatıp açalım.
SQL*Plus arabiriminin konsoldan çalıştırılması
artık konsoldan veritabanı işlemleri yapabiliriz.
Bazı düzenlemeler
1)
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.
hemen sudo apt-get rlwrap ile yüklüyoruz.
şeklinde çağırıyoruz ve konsoldaki tuş kullanım rahatlığına kavuşuyoruz.
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.
Diyelim $~/sql.dic diye bir dosyanız olsun ve bunun içerisi de şu şekilde olsun
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
Ben daha kolay olsun diye sistemimi aşağıdaki şekilde ayarladım.
1) $ORACLE_HOME/bin dizinindeki sqlplus u sqlpuls_asil olarak değiştirdim
2) /usr/bin dizini altına sqlplus adında bir dosya oluşturdum (x+ özellikli), içeriği ise;
kullanımı ise;
2)
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.
Benim kullandığım login.sql in içeriği ise;
artık sqlplus ı çalıştırdığımızda konsolda
SQL> yerine 13:24:33 10GTEST.db1 > ibaresini göreceğiz.
Paket yüklemeleri
1) Ubuntunun depolarında OLMAYAN kurulum paketini buradan indiriyoruz.
2) dpkg -i oracle-xe-client_10.2.0.1-1.0_i386.deb ile indirdiğimiz paketi kaynak listesine ekliyoruz.
3) sudo apt-get update ile paketleri güncellemiş oluyoruz (yeni eklediğimiz paket için zorunlu olarak yapmamız gerekiyor)
4) sudo aptitude search oracle komutunu çalıştırdığımızda dönecek olan listede oracle-xe-client olacak.
5) sudo apt-get install oracle-xe-client komutu ile programı kurabiliriz artık.
~/.profile dosyasının içerisine aşağıdaki satırları ekleyelim
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/client
export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`
export SQLPATH=$ORACLE_HOME/sqlplus
export PATH=$ORACLE_HOME/bin:$PATH
Bağlantı ayarlarının yapılması
/etc/tnsnames.ora dosyasını oluşturup içine tns ayarlarını girelim.
Örn.:
10GTEST =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = 192.168.91.171)
(PORT = 1521)
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = 10GTEST)
)
)
şimdi bilgisayarı kapatıp açalım.
SQL*Plus arabiriminin konsoldan çalıştırılması
sqlplus 10GTEST
artık konsoldan veritabanı işlemleri yapabiliriz.
Bazı düzenlemeler
1)
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.
hemen sudo apt-get rlwrap ile yüklüyoruz.
rlwrap sqlplus
şeklinde çağırıyoruz ve konsoldaki tuş kullanım rahatlığına kavuşuyoruz.
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.
Diyelim $~/sql.dic diye bir dosyanız olsun ve bunun içerisi de şu şekilde olsun
select
from
where
recyclebin
purge
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
rlwrap -f sql.dic sqlplus
dememiz yetecektir. Ben daha kolay olsun diye sistemimi aşağıdaki şekilde ayarladım.
1) $ORACLE_HOME/bin dizinindeki sqlplus u sqlpuls_asil olarak değiştirdim
2) /usr/bin dizini altına sqlplus adında bir dosya oluşturdum (x+ özellikli), içeriği ise;
#!/bin/bash
case "$1" in
db1)
info="db1/passdb1@10GTEST"
;;
db2)
info="db2/passdb2@10GTEST"
;;
esac
if [[ -z "${info}" ]] ; then
echo $"Usage: sqlplus {db1|db2}"
else
cd $ORACLE_HOME/bin/
rlwrap -b "" -f $HOME/.sql.dic sqlplus_asil $info
cd -
fi
kullanımı ise;
sqlplus db1 //db1 e bağlanıyor
ya da
sqlplus db2 //db2 ye bağlanıyor
2)
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.
Benim kullandığım login.sql in içeriği ise;
/* SQL Plus parameters required for each session */
set timing on;
set linesize 150;
set pagesize 500;
set space 1;
set termout off
set sqlprompt "&&_CONNECT_IDENTIFIER'.'&&_USER > "
set pages 500 lines 150
set null empty;
set time on;
set trim on;
set wrap off;
set sqlnumber on;
set describe line on;
set termout on
def _editor=vim
artık sqlplus ı çalıştırdığımızda konsolda
SQL> yerine 13:24:33 10GTEST.db1 > ibaresini göreceğiz.
29 Temmuz 2010 Perşembe
GWT ve Ext (GXT) kullanarak geliştirdiğim GMVC kullanıma hazır
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.
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.
Genel olarak yaşanan sıkıntılar;
Bağlantılar
Projenin Hostu için burayı
SVN adresi için burayı
Projeden goruntuler için burayı
WAR dosyasi için de burayı kullanabilirsiniz
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.
Genel olarak yaşanan sıkıntılar;
- Hibernate implementasyonu,
- Login formu ve kullanıcı hak denetimlerinin yapılması,
- RPC ile SuggestionBox bileşeni geliştirilmesi,
- MVC çatısı ve cok katmanlı programlama,
- Jasper Report kullanımı/entegrasyonu,
- GWT de Modül yazimi/kullanımının örneği,
- RPC servislerin kalıtımla elde edilebilmesi,
- Olay temelli programlama/haberleşme,
- Projenin Ant Script ile WAR dosyasının hazırlanması
Bağlantılar
Projenin Hostu için burayı
SVN adresi için burayı
Projeden goruntuler için burayı
WAR dosyasi için de burayı kullanabilirsiniz
10 Mayıs 2010 Pazartesi
Ortalama vade bulma
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.
İ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.)
Senaryo-1 çeklerini yukarıdaki formüle göre hesaplarsak,
Bu durumda:
Senaryo-1 in ortalama vadesi : 04/05/2010
Senaryo-2 nin ortalama vadesi : 16/05/2010
Senaryo-3 ün ortalama vadesi : 08/05/2010 olur
Java'da nasıl yapıldığına gelince de;
Senaryo 1:
---------- --------
Vade Tutar
---------- --------
04/04/2010 100 TL
04/05/2010 100 TL
04/06/2010 100 TL
---------- --------
toplam : 300 TL
vadeler : 30 gün
Senaryo 2:
-------------------
Vade Tutar
---------- --------
04/04/2010 300 TL
04/05/2010 500 TL
04/06/2010 1000 TL
---------- --------
toplam : 1800 TL
vadeler : 30 gün
Senaryo 3:
-------------------
Vade Tutar
---------- --------
01/04/2010 600 TL
22/05/2010 300 TL
13/06/2010 500 TL
---------- --------
toplam : 1400 TL
vadeler : düzensiz
-------------------------------------------------------------------
İ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.)
1 - Çek tutarları toplanarak toplam tutar bulunur (TT)
2 - Her bir çekin vadesinin baz tarihe olan uzaklığı gün cinsinden bulunur (VG)
3 - Bu gün farklarının tamamı toplanır ve vade günlerinin toplamı bulunur (TVG)
4 - Toplam Vade Günleri, Toplam Tutara bölünerek Ortak Çarpan bulunur (TVG/TT=OÇ)
5 - Herbir çek için; Ortak Çarpan, vade günü ve çekin tutarı çarpılarak Derece bulunur (D)
6 - Derece, Toplam Vade Gününe bölünerek Etki Mesafesi bulunur (D/OÇ=EM)
7 - Etki Mesafeleri toplanarak Baz Tarihe eklenir ve ortlama vade bulunmuş olur
Senaryo-1 çeklerini yukarıdaki formüle göre hesaplarsak,
1 - TT=300
2 - VG1=31, VG2=61, VG3=92
3 - TVG=184
4 - OÇ=0.61
5 - D1=1901.33, D2=3741.33, D3=5642.67
6 - EM1=10.33, EM2=20.33, EM3=30.67 (Toplam=61.33 gün eder)
7 - 04/03/2010 + 61.33 = 04/05/2010
Bu durumda:
Senaryo-1 in ortalama vadesi : 04/05/2010
Senaryo-2 nin ortalama vadesi : 16/05/2010
Senaryo-3 ün ortalama vadesi : 08/05/2010 olur
Java'da nasıl yapıldığına gelince de;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class Valor {
/*
* Girisi noktasi ve ornekleme
*/
public static void main(String[] args) {
Date base = new Date("2010/03/04");
List<Cheque> chequeList = new ArrayList<Cheque>();
chequeList.add(new Cheque( new Date("2010/04/01"), 600));
chequeList.add(new Cheque(new Date("2010/05/22 "), 300));
chequeList.add(new Cheque(new Date("2010/06/13"), 500));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(getAvgDate(base, chequeList)));
}
/*
* Asil hesaplarin yapildigi kisim burasi
*/
private static Date getAvgDate(Date base, List<Cheque> chequeList) {
double totalAmount = 0;
double totalDays = 0;
int index = 0;
double totalEffects = 0;
List<Integer> dayDitanceList = new ArrayList<Integer>();
for (Cheque c: chequeList) {
int days = getDateDiff(c.maturity, base);
dayDitanceList.add(days);
totalDays += days;
totalAmount += c.amount;
}
double factor = totalDays / totalAmount;
for (Cheque c: chequeList) {
double degree = factor * c.amount * dayDitanceList.get(index);
double effect = degree / totalDays;
totalEffects += effect;
index++;
}
return addDate(base, new Double(totalEffects).intValue());
}
/*
* Iki tarih arasindaki gun farkini bulur
*/
private static int getDateDiff(Date big, Date little) {
long diff = big.getTime() - little.getTime();
return (int) (diff / (1000 * 60 * 60 * 24) + 1);
}
/*
* Verilen tarihe gun ekler
*/
private static Date addDate(Date date, int day) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DAY_OF_MONTH, day);
return cal.getTime();
}
/*
* Orneklemenin daha net okunabilmesi icin, cek bilgilerini tasiyan pojo
*/
private static class Cheque {
private Date maturity;
private double amount;
Cheque(Date maturity, double amount) {
this.maturity = maturity;
this.amount = amount;
}
}
}
12 Şubat 2010 Cuma
Mysql'de çok satırlı sorgular
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;

Burda da basit bir sorgu örneği;

Vi editöründen çıkarken:
Yazdığınız sorgunun yürütülmesini istiyorsanız;
:wq {enter}
Yazdığınız sorgunun yürütülmesini istemiyorsanız;
:q! {enter}
tuşlamanız yeterli.

Burda da basit bir sorgu örneği;

Vi editöründen çıkarken:
Yazdığınız sorgunun yürütülmesini istiyorsanız;
:wq {enter}
Yazdığınız sorgunun yürütülmesini istemiyorsanız;
:q! {enter}
tuşlamanız yeterli.
9 Şubat 2010 Salı
PHP sayıyı yazıya çevirme
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 yalnız ikiyüzaltmışüç liradır. şeklindeki ifadeleri elde etmek için kullanılabilir.
Kod:
Ekran çıktısı:
Kod:
<?
function sayi2yazi($sayi) {
$birler = array("","bir","iki","üç","dört","beş","altı","yedi","sekiz",
"dokuz");
$onlar = array("","on","yirmi","otuz","kırk","elli","altmış","yetmiş",
"seksen","doksan");
$ustler= array("","bin","milyon","milyar","trilyon");
echo $sayi . " -> ";
$kalan = strlen($sayi) % 3;
if ($kalan != 0) $sayi = str_repeat("0", 3-$kalan) . $sayi;
$parcalar = str_split($sayi, 3);
$parca_adedi = sizeof($parcalar);
$sonuc= "";
for ($i = $parca_adedi; $i > 0; $i--) {
$p_yazi = "";
$parca = $parcalar[$i-1];
for ($j = 0; $j < strlen($parca); $j++) {
$bit = $parca[$j];
if ($bit != 0) {
switch ($j) {
case 0: {
if ($bit != 1) $p_yazi .= $birler[$bit];
$p_yazi .= "yüz";
break;
}
case 1: {
$p_yazi .= $onlar[$bit];
break;
}
case 2: {
$p_yazi .= $birler[$bit];
break;
}
}
}
}
if ($p_yazi=="bir" && $ustler[$parca_adedi-$i]=="bin")
$sonuc = $ustler[$parca_adedi - $i] . $sonuc;
else
$sonuc = $p_yazi . $ustler[$parca_adedi - $i] . $sonuc;
}
return $sonuc . "\n";
}
echo sayi2yazi(1);
echo sayi2yazi(101);
echo sayi2yazi(101101);
echo sayi2yazi(1001);
echo sayi2yazi(10010);
echo sayi2yazi(120230123);
echo sayi2yazi(712328);
echo sayi2yazi(42340738);
echo sayi2yazi(10101078);
echo sayi2yazi(23474854234234);
echo sayi2yazi(2347485423423);
echo sayi2yazi(72238);
?>
Ekran çıktısı:
mdpinar@mdpinar-desktop:~/php$ php sayi2yazi.php
1 -> bir
101 -> yüzbir
101101 -> yüzbirbinyüzbir
1001 -> binbir
10010 -> onbinon
120230123 -> yüzyirmimilyonikiyüzotuzbinyüzyirmiüç
712328 -> yediyüzonikibinüçyüzyirmisekiz
42340738 -> kırkikimilyonüçyüzkırkbinyediyüzotuzsekiz
10101078 -> onmilyonyüzbirbinyetmişsekiz
23474854234200 -> yirmiüçtrilyondörtyüzyetmişdörtmilyarsekizyüzellidörtmilyonikiyüzotuzdörtbinikiyüz
2347485423420 -> ikitrilyonüçyüzkırkyedimilyardörtyüzseksenbeşmilyondörtyüzyirmiüçbindörtyüzyirmi
72238 -> yetmişikibinikiyüzotuzsekiz
Kaydol:
Kayıtlar (Atom)