Tuesday, December 30, 2008

Seam ve Sayfa Navigasyonu

Seam sayesinde EJB ve xhtml sayfa kavramlari birbirine iyice yaklasti. Sayfa icinden EJB ismini kullanarak button, link tiklamalari direk metot cagrilarina eslemek mumkun. Peki bu tiklama sonrasi hangi sayfaya gidecegimizi nasil soyleyecegiz?

Aksiyon metotlarindan String tipi dondurmek ve bu parametreye "falanca.xhtml" gibi bir deger koymak bir cozumdur. Seam burada gordugu degeri sayfa ismi olarak kabul eder ve oraya yonlendirme yapar.

Daha iyi bir cozum, aksiyon metotlarinin hicbir sey dondurmemesi (yani void) ve navigasyonun tamamen disarida bir ayar dosyasinda yapilmasidir. Bu dosya pages.xml dosyasidir.

Navigasyonu bu sekilde yapinca, ayni aksiyonun (metotun) degisik sayfalarda degisik yerlere yonlendirilmesi mumkun olur. Yani bu teknik daha gucludur ve daha temizdir. Bu dosya, WEB-INF altinda web.xml ile ayni seviyede olmali.

<pages xmlns="http://jboss.com/products/seam/pages" xsi="http://www.w3.org/2001/XMLSchema-instance" schemalocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.1.xsd" id="/main.xhtml">

<page id="/burada.xhtml" required="false">
<navigation action="#{obj1.doIt}">
<redirect id="/suraya.xhtml">
</redirect>
</navigation>

</navigation>

</page></pages>

JBoss Seam ve Tarih Gostermek

Seam/JSF ile programlarken tarihleri basmak icin h:outputText ekrana bir seyler basacaktir. Fakat goruntude saat kismi da gozukecek (12:34:00 EST vs seklinde) ki bu istedigimiz bir goruntu olmayabilir. Bu goruntuyu istedigimiz gibi cevirttirmek icin Seam/JSF bir Converter tanimlamamiza izin veriyor.

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;

import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.annotations.faces.Converter;
import java.util.Date;

@Name("dateConverter")
@BypassInterceptors
@Converter
public class DateConverter implements javax.faces.convert.Converter
{

public Object getAsObject(javax.faces.context.FacesContext context,
javax.faces.component.UIComponent component,
java.lang.String str) {

return DateUtil.stringToDate(str);
}

public String getAsString(javax.faces.context.FacesContext context,
javax.faces.component.UIComponent component,
java.lang.Object object)
{
final Date date = (Date) object;

return DateUtil.dateToString(date);
}

}

DateUtil.dateToString cagrisi formatlamayi istedigimiz gibi yapmamizi saglayan yardimci metottur. Bu kadar, bu class @Convertor annotation'i kullandigi icin XML karin agrilarina girmeye gerek yok. Kullanmak icin herhangi bir xhtml sayfasinda alttaki kullanim yeterli.

<h:outputText value="#{obj.someDateColumn}"><f:converter converterId="dateConverter"/></h:outputText>

Hibernate ve Tarih Kolonlari

Eger icinde tarih olan tablolari okurken Hibernate (ve JDBC) soyle bir hata veriyorsa,

java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Date

Bunun basit bir cozumu persistence.xml deki JDBC URL'e zeroDateTimeBehavior=convertToNull ibaresini eklemektir.

<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/DB?zeroDateTimeBehavior=convertToNull">

Bunun sonucunda eger Hibernate'in map ettigi kolonda 0000-00-00 gibi bir deger var ise, bu otomatik olarak NULL'a cevirilecektir. Bu degerin oraya konulmasinin sebebi MySQL seviyesinde sema yaratilirken olagan degerin 0000-00-00 birakilmis olmasi cogunlukla, boylece tarih tanimlanmayan INSERT otomatik olarak bu garip degeri atiyor. Cozum DB seviyesinde de yapilabilir muhakkak, ama orada kontrolunuz yok ise, ustteki cozum ise yarar.

Monday, December 22, 2008

Hatali Tarih Saptamak

Eger SimpleDateFormat'i tarih bilgisini String tipinden Date tipine gecmek icin kullaniyorsaniz dikkat: Bu class, eger ozellikle belirtilmezse, herhangi bir gun ve ay bilgisini mutlu bir sekilde (kafasina gore) bir Date'e cevirebiliyor. Hicbir kontrol yapmiyor. Mesela 40-2-2008 tarihi 10 Mart 2008'e donusebiliyor!

Bu hatadan kacinmak icin setLenient(false) cagrisi yapmaniz gerekli. Bizim bu isi yapan DateUtil class'imizdaki metot suna benziyor.

public static Date DMYtoDate(int day, int mon, int year) {

SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy");
String ds = day + "-" + mon + "-" + year ;
Date date = null;
try {
fmt.setLenient(false);
date = fmt.parse(ds);
} catch (java.text.ParseException e) {
log.error(e);
return null;
}

return date;
}

Bu metot, eger hatali bir tarih varsa, null dondurecektir.

Saturday, December 13, 2008

Ubuntu 8 on Toshiba Satellite u300

This post is in English hoping it can help out a wider audience on Linux compatibility issues. Also see Linux on Laptops page.

I have purchased a sweet little Toshiba Satellite u300 laptop and am running Ubuntu 8 on it; Sound, video worked out of the box.

Wireless caused problems, to get around it, you need to download and install compat-wireless package found here. Before installing this package, the network icon on the upper right corner will not detect any wireless networks, and don't fiddle with anything in the system to get wireless "working" - it won't. Until you install compat-wireless. Get the sources, then "make" "sudo make install" and "sudo make load". After this last step, driver will be loaded, and network icon in upper right corner will change, it will detect and connect to a wireless network. From now on, if you want to load the drivers, you need to run "sudo make load" (I am still looking for a way to make this part of startup without changing startup scripts).

There is a problem with the volume control on the left side of the machine. When you roll the wheel up or down, it gets stuck on changing the volume action and will not yield control to your keyboard. At this point you are screwed, the only thing you can do is rebooting the machine.

My solution is to disable the wheel volume up or down event. Go to System | Preferences | Keyboard Shortcuts and assign "any" key combination to Sound | Volume up and down events. Anything except the X86blabla event. Then you will be set. Make sure you have turned volume all the way up before you do this.

By the way; To shut off the annoying drum, tamtam sound when you login, go to System | Administration | Login Window and to Accesibility tab. There uncheck the sound option for question.wav.

Out of the box, you won't have external display capability. In order to enable TVOUT so you can watch movies, presentation on an external display, you need to enable TwinView.

From cmd prompt, sudo vi /etc/X11/xorg.conf then add the following two lines to your "Section" block in your xorg.conf.

Section "Screen"
...
Option "TwinView"
Option "TVOutFormat" "SVIDEO"
SubSection "Display"
Virtual 1280 800
EndSubSection
EndSection

You need to reboot for external display to take effect everytime you use your external display. When you reconnect, same way, reboot so you get back to your normal display. I am sure there are easier ways to do this, this was easiest way for me with least amount of trial and error.

I will update this post with any other u300 + Linux related problems and solutions.

Wednesday, December 10, 2008

Ubuntu ve Emacs

Ubuntu uzerinde Emacs kullanmak icin once en son paketi kurdurmak gerekiyor;

sudo apt-get install emacs22

Sonra bizim Java JDE ortaminda calismasi icin hazir ettigimiz ve pek cok diger ek araci iceren paketi indirip /usr/share/emacs/22.2/site-lisp/ altinda aciyoruz. Artik tek bir .emacs satiri ile bu dizin altindaki emacs-ubuntu.el dosyasini yuklettirebiliriz. Bu satir soyle olacak;

(load-file "/usr/share/emacs/22.2/site-lisp/emacs-ubuntu.el")

Tuesday, December 9, 2008

Ubuntu'da CAPS Tusunu Control Yapmak

Kabul edelim: Caps Lock tusu fazla bir halta yaramiyor. Bu tusu eger daha cok ise yarayan Control tusu ile degistirmek istiyorsak, alttaki tarif ise yarayabilir.

Once /etc/X11/xorg.conf dosyasina girelim. Bu dosyada degistirmemiz (yoksa eklememiz) gereken ibare soyle:

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us"
Option "XkbOptions" "lv3:ralt_switch, ctrl:nocaps"
EndSection

Bilgisayari tekrar baslattiktan sonra CAPS tusunun artik Control olarak isledigini goreceksiniz.