4 Temmuz 2010 Pazar

6 Şubat 2010 Cumartesi

Motivasyon üzerine...

4 Şubat 2010 Perşembe

jsf action call problemi

Sebebini bilemediğim bir şekilde bazen(her zaman değil) bir jsf sayfasındaki objeye bind edilmiş bir action çağırılmıyor. Bunun için hiç bir exception yakalıyamıyor ve hiç bir mesaj ya da stacktrace görüntüleyemiyor olmam da çok ilginç. Birtakım araştırmalarımdan sonra sorunun jsf sayfasındaki alanların managed bean e map edilememesinden kaynaklanıyor olabileceğini okudum. Oysa ki sayfadaki objelerin binding attribute ları doğru bir şekilde manage bean deki karşılıklarına set edilmişti.

Daha sonra çağırılamayan action ın bind edildiği objenin 'immadiate' property sini 'true' yapınca action call sorunu çözüldü ama bu seferde sayfadaki diğer alanlarda sorun çıkmaya başladı. Bu sefer manage edebildiğim exception lar sayesinde bulduğum sorunlu alanların 'immadiate' property lerini 'true' yaptım.

Sorun şimdilik çözüme kavuştu ama sorunsuz çalışan bir uygulamada hiçbirşey değişmeden bu sorunun ortaya çıkması çok ilginç. Ne sorunu tanımlayabildim ne de çözümü anlayabildim.

Bunun jsf de bir bug olduğu yorumlanıyor: http://jan-so.blogspot.com/2008/02/jsf-does-not-call-action-in-managed.html

7 Aralık 2009 Pazartesi

sqlserver identity kolonun degerini yenilemek

Şöyleki,
identity kolonlu tablomuzda aradan bazı satırı sildik ve aradaki değerleri kullanmak istiyoruz.

(
IDENTITY
29
30

39
40
...
gibi
30 39 arası silinmiş
ve kullanmak istiyoruz
)

dbcc checkident (mytable, reseed, 30)

not:
1.yapılacak ilk kayıt verilen sayının 1 fazlası olarak kaydedilir.
2.kolon aynı zamanda primary key se 39 a gelindiğinde çıkacak sorun için hazırlıklı olunmalıdır.

21 Ekim 2009 Çarşamba

9 Eylül 2009 Çarşamba

Dunning ve Kruger Etkisi

Justin Kruger and David Dunning isimli iki psikoloji profesörü 65 Cornell üniversite öğrencisi üzerinde bazı testler uygulamışlar. Gramer, mantık ve şaka içerikli testler yapmışlar ve öğrencilerden testlerdeki performanslarını tahmin etmelerini istemişler.

Testlerde en düşük %25 e girenler, performans ve yeteneklerini çok daha üzerinde tahmin etmişler. İlk %12 ye girenler ise kendilerini %58 lerde tahmin etmişler.

Çalışmaları ve deney sonuçları, Aralık 1999 da Journal of Personality and Social Psychology dergisi yayınlanmış. Makalede vardıkları sonuç ise:
    We propose that those with limited knowledge in a
    domain suffer a dual burden: Not only do they reach mistaken
    conclusions and make regrettable errors, but their incompetence
    robs them of the ability to realize it.
İlgilenenler için makale burada.

4 Eylül 2009 Cuma

Java client ile servlet kullanarak file upload (Bu cümleyi Türkçe yazmak mümkün mü?)

Diyelim ki java ugulamanız ile bir server'a dosya upload etmeniz gerekiyor.. Apache bunun için http client ve file upload kütüphaneleri oluşturmuş. Bu kütüphaneleri kullanarak basit bir şekilde işinizi halledebiliyorsunuz. Ben client tarafında httpclient-2.0 jar'ı, server tarafında ise fileupload-1.0 jar'ı kullandım. Bunların yeni sürümleri de var ama bunlar da işimi gördü.

Öncelikle client koda bakalım:

public static void upload(String sourceFilePath) {
String servletUrl = "http://some.url/servlet";
try {
HttpClient client = new HttpClient();
MultipartPostMethod mPost = new MultipartPostMethod(servletUrl);
// Connection timeout in milliseconds
client.setConnectionTimeout(8000);

File file = new File(sourceFilePath);
mPost.addParameter(file.getName(), file);

int statusCode = client.executeMethod(mPost);
mPost.releaseConnection();
if (statusCode == 2000) {
throw new Exception("Dosya upload edilemedi");
}
// diğer işlemler....
} catch (Exception ex) {
// hatayla ilgili kod...
}
}


Karşı tarafta da bu isteği karşılayacak bir servlet yazmak gerekiyor:

protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
String dosyaDizini="D:\\";
try {
DiskFileUpload diskFileUpload = new DiskFileUpload();
// Maksimum kabul edilebilecek dosya boyutu
diskFileUpload.setSizeMax(1000000);

List requestItems = diskFileUpload.parseRequest(request);
Iterator iterator = requestItems.iterator();

while (iterator.hasNext()) {
FileItem fileItem = (FileItem) iterator.next();
if (!fileItem.isFormField()) {
File file= new File(dosyaDizini,fileItem.getName());
fileItem.write(file);
// CLİENT'A BAŞARI MESAJI
response.sendError(1000);
}
}
} catch (Exception ioex) {
// HATA OLUŞTU MESAJI
response.sendError(2000);
}
}

Tabi ki bu api ile dosya dışında metinsel parametreler göndermek de mümkün.



3 Eylül 2009 Perşembe

Şiirler(!)






24 Ağustos 2009 Pazartesi

Oracle veritabanında belli sütunların saklanması

Oracle veritabanında sadece bazı sütünlardaki (kredi kartı no ya da TC Kimlik No gibi) bilgilerin saklanması gerekebilir. Bu alanları şifrelemeden gözlerden saklamak istersek Oracle 10g'den sonra kullanılabilen Virtual Private Database (VPD) "data masking" işimize yarıyor.

Bunun avantajı, veritabanında alanlar decyrpt - encrypt edilmediğinden performans kaybı yaşatmaması..

Önce bir fonksiyon oluşturuyoruz:

CREATE OR REPLACE
FUNCTION vpd_function (obj_owner IN VARCHAR2, obj_name IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN '1=2';
END vpd_function;
/

Bu fonksiyonun döndürdüğü değer (1=2) maskelemek istediğimiz sütunlar için bir where cümlesi vazifesi görecek. Her zaman yanlış olacağından bu alanlar boş gelmiş olacak.

Şimdi bu fonksiyonu kullanacak bir policy tanımlıyoruz:

BEGIN
DBMS_RLS.ADD_POLICY(object_schema=> 'ŞEMA_ADI',
object_name=> 'TABLO_ADI',
policy_name=> 'POLICY_ADI',
function_schema=> 'ŞEMA_ADI',
policy_function=> 'vpd_function',
sec_relevant_cols=> 'VIRGULLE_AYRILMIŞ_SÜTUN_ADLARI',
policy_type => DBMS_RLS.SHARED_STATIC,
sec_relevant_cols_opt=> dbms_rls.ALL_ROWS);

END;
/

Burada POLICY_ADI'na istediğiniz herhangi bir isim verebilirsiniz.

Son olarak bu policy'nin dışında kalacak kullanıcıya izin veriyoruz:

grant exempt access policy to KULLANICI;

Artık ister program kullansın ister yazılım içinde bağlantı kursun, ilgili tabloda select çeken kullanıcı tüm satırları görecek ama belirttiğimiz sütunlar ona boş görünecektir.

8 Temmuz 2009 Çarşamba

Halı Saha Maçı

Sevgili arkadaşlar

Maç bugün (8 Temmuz 2009) 19:00-20:00 saatleri arasında olacak şekilde ayarlandı. Halı sahanın adresi:

Tuana
4.Cad. No:24 Yıldızevler/Çankaya
Tel:441 76 75

Burası atakule'ye oldukça yakın.. Harita üzerinde gösterirsek:



Daha Büyük Haritayı Görüntüle


Akşam görüşmek üzere

26 Haziran 2009 Cuma

Michael Jackson öldü...

20 sene önce kendi çabalarımızla öğrenmeye çalışmış, bir türlü becerememiştik. Moon walk nasıl yapılır öğrenmek isteyenler için: http://www.youtube.com/watch?v=E_FzgtLVzbI

Moon walk'ı ustanın kendisinden izlemek için: http://www.youtube.com/watch?v=s7MmEMrCRfc

2 Haziran 2009 Salı

Merhaba

Geçen sene bu aralar blogda bayağı bir hareket varmış. Bu sene yazılar azaldı. Buna rağmen, ziyaretçi sayımız 5000 i geçmiş. Bence yazıları arttıralım. Ne dersiniz ?

13 Mayıs 2009 Çarşamba

SQL SERVER String Functions

SELECT [Kolon1] ,
STUFF([Kolon1],3,9,'-')
+STUFF( substring([Kolon1],3,7),3,9,'-')
+STUFF( substring([Kolon1],5,5),3,0,'-')
FROM [TABLO1]
WHERE
LEN ([Kolon1])= 9
and
CHARINDEX('-' , [Kolon1])=0
and
CHARINDEX('.' , [Kolon1])=0
and
CHARINDEX('/' , [Kolon1])=0



sonuçlar
123546789
12-34-56-789

11 Ocak 2009 Pazar

JAX-WS ile Güvenlik Bilgilerini Almak

Eğer JAX-WS kullanırken bir şekilde servisinize gönderilen mesajın içindeki kullanıcı bilgilerine ulaşmanız icab ederse, web servisinize küçük eklemeler yapmanız yetecektir:

@WebService()
public class LoginWebService {

@Resource
private WebServiceContext context;

@WebMethod(operationName = "operasyon")
public void operasyon() {
ServletContext servletContext = (ServletContext)context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
String kullaniciadi = servletContext.getInitParameter("username");
String sifre = servletContext.getInitParameter("password");
//Sonrası size kalmış! :-))
}
}

Netbeans, Glassfish ve Türkçe!

Windows üzerinde Netbeans ve Glassfish kullanırken bir takım problemler yaşıyorsanız ilk şüphelenmeniz gereken yer dil ve bölge ayarlarıdır. Eğer Glassfish'i başlatırken abuk subuk, internette aradığınızda bile bulamadığınız bir takım hatlarla karşılaşıyorsanız,

1. Netbeans'in kurulu olduğu klasörde etc diye bir klasör bulunuyor. Bunun içinde netbeans.conf dosyasını bir text editör ile açıp netbeans_default_options diye başlayan satırın en sonuna (ama tırnak işaretinin içinde kalacak şekilde

--locale tr_TR

ifadesini ekleyin.

Glassfish'in kurulu olduğu klasörde "lib" klasöründe "Launcher.xml" ve "processLauncher.xml" dosyaları var. Bunların içine

<sysproperty key="user.language" value="tr-TR"/></sysproperty>

satırını ekleyin.

Son olarak uygulama sunucumuzun ilgili domain klasöründe domain.xml diye bir
dosya var. Bunun içine de ilgili yere

<jvm-options>-Duser.language=tr-TR</jvm-options>

satırını eklemelisiniz.

3 Aralık 2008 Çarşamba

Java web uygulamasında web server data source kullanımı

Web uygulamasında web server data source kullanımı için:

1.web serverda data source oluşturuluyor.(web logic için console arayüzü kullanılabilir.)

2.Uygulama web.xml de resource-ref elmanı tanımlanıyor. Bu resource-ref elmanı dış bir kaynağa(burada data source) web uygulamasıreferansı tanımı için kullanılıyor. Buradaki res-ref-name elmanı(XXX) web server da oluşturulan data source jndi name i olacak.
Ör:
<resource-ref>
<res-ref-name>XXX</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

3.Connection ın alındığı ilgili sınıfta, connection ı döndüren metodta javax.naming.Context objesi oluşturup bu objeninlookup metoduna web server da oluşturulan data source jndi name'ini parametre olarak geçerek javax.sql.DataSource objesi elde ediliyor.
Ör:
public static synchronized Connection getConnection() throws Exception {
try
{
Context init = new InitialContext();
Context ctx = (Context) init.lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup("XXX");
Connection connection = ds.getConnection();
return (connection);
}
catch (Exception e)
{
throw new Exception(e.getMessage());
}
}

13 Kasım 2008 Perşembe

OC4J Üzerinde Netbeans ile hazırlanmış JAX-WS Webservisleri Çalıştırmak

Şimdi... Bu iş biraz karışık... JAX-WS standardı kullanmak için java versiyonu 1.5 ve üstü olmak zorunda. Bunun sebebi JAX-WS standardında annotation'ların kullanılıyor olması. Bu da biliyorsunuz 1.5'ten sonra gelen bir özellik.... Şu an resmi olarak Java 5 standardını destekleyen hangi application server'lar var bir sayalım:


  1. Glassfish
  2. Tomcat 6
  3. Oracle Weblogic
Görüldüğü gibi listede OC4J yok! Zaten Oracle BEA'yı bünyesine aldıktan sonra OC4J devam etmeyecekmiş gibi görünüyor. Neyse... Asıl konu şu: Netbeans ile webservisi oluşturulunca (Tabi özellikle axis2 ile kullanılmıyorsa) default olarak JAX-WS kullanılıyor. Bunlar zaten Glassfish üzerine rahatça deploy edilip çalıştırılabiliyor. OC4J ile çalıştırmak için build.xml scriptinin içine şu komutları eklemek gerekiyor:


<target name="-pre-dist">
<taskdef name="wsgen" classname="com.sun.tools.ws.ant.WsGen">
<classpath path="${javac.classpath}"/>
</taskdef>
<echo>running wsgen - quixotic</echo>
<wsgen
debug="true"
keep="true"
destdir="build/web/WEB-INF/classes"
resourcedestdir="build/web/WEB-INF/classes"
sei="tr.com.SINIF_ADI">
<classpath>
<pathelement path="${javac.classpath}"/>
<pathelement location="${java.home}/../lib/tools.jar"/>
<pathelement location="build/web/WEB-INF/classes"/>
</classpath>
</wsgen>
</target>


Bundan sonra derlediğimiz kod hem Glassfih hem OC4J üzerinde deploy edilebilir hale gelecektir. Tabi netbeans'de project properties'den library olarak JAX-WS kütüphanesini eklemiş olmak şartıyla!

Hâlâ birşeyleri çözebiliyor olmak ne güzel! :-))