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! :-))

21 Eylül 2008 Pazar

Sevgili dostlarıma bir mektup

Sevgili arkadaşlarım,

Sizlerle hiç unutamayacağım iki sene geçirdim. Ardımda o kadar güzel hatıralar bırakıyorum ki... Sizlerle paylaştığım ne varsa hepsi için teşekkür ediyorum.

Sevgili Gusto,

İşini senin gibi iyi bilen, iyi yapan birisine "arka-daş" olmak harikaydı. Yapılması gereken en mühim işlerde arkamı endişe taşımadan yaslayabileceğim, emanet edebileceğim bir dostla çalışmanın rahatlığını yaşattın bana. Polemiklerimizin tadı tuzu da sendin. Bu zamanda aynı mantık zemini üzerinde durup konuşabileceğimiz insan sayısı bu kadar azken sana rastgelmiş olmak büyük şanstı.


Sevgili Elf,

İşe seninle aynı gün başladık. O günlerde birileri, senin benim için iş arkadaşlığımız neticesinde ifade edeceğin anlamdan bahsetse ona inanmazdım. Bir sürü çetrefilli iş peşinde beraber koşturduk. Bana verdiğin desteğin ve dostluğunun kıymetini kelimelerle ifade etmem mümkün değil. İnanılmaz zerâfetini ve güler yüzünü hiç unutmayacağım.


Sevgili Gelgin,

Senin dostluğun da kazanmış olmakla iftihar ettiğim dostluklardan. Bir insanın bakışlarından temizlik ve iyilik akar mı diye sorsalar "evet" derim. "İnanmıyorsanız Gelgin'le oturun iki dakika sohbet edin!" Polemiklerimizin olmazsa olmazı, sevgili dostum, bu güzel bakışlarını, mütebessim çehreni özleyeceğim.


Sevgili Edi,

Seninle nispeten daha kısa bir süre beraber çalıştık ama şimdi dönüp bakıyorum da sanki yıllarca çalışmış gibi hissediyorum. Senin zor meseleleri anlamak ve bir yerlere oturtmak için vicdan terazinde tartışını hep hatırlayacağım. Hadiselere böylesine ön yargısız yaklaşabilen az insan vardır. Polemiklerimizi daha rasyonel bir zemine çekmek için yaptığın wikipedia araştırmaları da hafızamda hoş birer hatıra olarak kalacak.


Sevgili abSoLuT,

Seni elbette polemiklere katkıların ve Gusto'ya tatlı tatlı takılmaların ile hatırlayacağım. Tabi bir de yılan hikâyesine dönen basın özetleri programıyla! Ben hâlâ basın özetleri programını opensource bir proje yapmak lazım diye düşünüyorum haberin olsun.


Sevgili Halp,

Kadim dostum, sessiz sedasız en önemli projelerden birini tek başına aldın, yüklendin, ayağa kaldırdın. Öyle önemli bir yükü kaldırdın ki, uğraştığın işle benim meşgul olmam hemen hemen hiç gerekmedi. Kıymeti bilinmesi gereken bir adamsın sen. Asansör sırasında hep en arkaya kalışın, her nasılsa ikide bir çeşitli organizasyonların düzenleyicisi oluvermen YM günlerimizin renkli hatıralarıydı.


Sevgili Grkm,

Bu blog işlerine hiç girmedin. O yüzden nick'ini ben uydurdum. Başlangıçtaki olumsuz şartlara rağmen işe başlaman ve bir sene boyunca "oyundan düşmemen" çok etkileyiciydi. Senin önünün açık olduğunu düşünüyorum. Kendini yetiştirmek yönünde biraz daha gayretle çok iyi noktalara geleceksin. Şunu da itiraf edeyim ki seni Fifa'da bir kez olsun yenememiş olmak içimde bir sızı olarak kalacaktır!...


Sevgili Uçan Teneke,

Teknolojiye, bilgisayarlara olan ilgin seni daha çok ötelere taşıyacak. Bu heyecanı kaybetmemeye dikkat etmelisin. İşimiz gereği bir sürü farklı teknolojide kendimizi geliştirmemiz gerekiyor. Bunu en iyi yapan kişi olarak takımımızın "joker" oyuncusu oldun. Çeşitli sebeplerden bu durum seni çok mutlu etmese de uzun vadede lehine olacak. Adres etiket programını devreye aldığın zaman bana haber verir misin? ;-)


Sevgili fkrt,

İlk geldiğimde kursa gitmene mâni olmuş, .net'i kendin gayret ederek öğrenebileceğini söylemiştim. Ve öğrendin! Hem de iyi öğrendin. Beraber çalıştığımız müddetçe beni en çok mutlu eden olaylardan birisi buydu. Hele sen meseleyi kavrayıp yeni teknolojileri heyecanla takip etmeye başlayınca sevincim katlandı. Ne olur bu gayretini sürdür. Günlük sıkıntıların seni durdurmasına izin verme. Hedefini yüksek tut. Türkiye'nin bir numaralı LINQ uzmanı olmak hedefi nasıl?


Sevgili Fırat,

Zaman zaman yaptığın iş gereği de olsa, kurumumuzda hitap ettiğimiz kitleyi en iyi tanıyan kişi olduğunu dile getirdim. Aslında herşey olması gerektiği gibi olsa, el üstünde tutulman gerekirdi. Bizi gerçek dünyaya bağlayan hayat adamı olarak ekibin ayrılmaz bir parçasıydın. Sadece pazarlıklarımız değil, zaman zaman yeraltı dünyası ile, zaman zaman iş dünyası ile ilgili bilgi akışımız da sana emanetti. Ben senin insan ilişkileri hususundaki potansiyelini ileride çok daha güzel değerlendireceğine inanıyorum.


Sevgili Haluk Bey,

Ekibimize katılmanız bir lütuftu. Bu sayede gerçek bir mühendis nasıl olur, iş nasıl doğru yapılır görme fırsatını bulmuş olduk. Pek az insan bilse de koskoca bir projeyi yeniden ele alıp neredeyse baştan yazdınız. Kurumda kullanılan teknolojiler içinde en moderni, en yenisi bu projede kullanıldı. Keşke ekip olarak sizden daha fazla istifade edebilseydik. İstanbul'daki hayatınızda başarılar diliyorum.


Sevgili arkadaşlar,

Hepinize sonsuz teşekkürler, hepiniz çok iyi insanlarsınız ve sizinle çalışmak benim için büyük şanstı... Hepinize ömür boyu mutluluklar diliyorum... Yeniden görüşmek üzere...

22 Ağustos 2008 Cuma

Malezya 2

Kuala Lumpur`da bir cadde

Malezya Tower denilen komunikasyon kulesinin tepesinde yer alan bir restorandayiz. Yandaki arkadas Filipinlerin Ekonomi Bakani :)

Petronas Towers

Genelde teknolojik arastirma kurumlarinin bulundugu bolgede (cyberjaya) yer alan Multimedya Universitesindeki e-galery

Bizim egitimin verildigi Melaka sehrinde bir balik lokantasi (bizdeki baliklarin tadini alamadim ya neyse yine de yedik balik, karides , istakoz artik ne bulduysak )

21 Ağustos 2008 Perşembe

Malezya'dan Sevgilerle...

Petronas Towers`da Koprudeyim (Skybridge)

Petronas Towers

Eye Of Malezeya denilen buyuk donme dolabin bulundugu park. Arka planda Petronas Towers

Hukumet merkezinin bulundugu Putrajaya bolgesinde Basbakanin ofisi.

Arka planda Putrajaya bolgesi. Burasi ise buyuk Convention Center`in bulundugu bir tepe

6 Ağustos 2008 Çarşamba

Sql den takvim yapmaca...

Aşağıdaki kodla sqlde yıllık takvim elde edebilirsiniz. Sql düşündüğünüzden daha güçlü olabiliyor bazen...


SELECT LPAD (MONTH, 20 - (20 - LENGTH (MONTH)) / 2) MONTH, "Sun", "Mon",
"Tue", "Wed", "Thu", "Fri", "Sat"
FROM (SELECT TO_CHAR (dt, 'fmMonthfm YYYY') MONTH,
TO_CHAR (dt + 1, 'iw') week,
MAX (DECODE (TO_CHAR (dt, 'd'),
'1', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Sun",
MAX (DECODE (TO_CHAR (dt, 'd'),
'2', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Mon",
MAX (DECODE (TO_CHAR (dt, 'd'),
'3', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Tue",
MAX (DECODE (TO_CHAR (dt, 'd'),
'4', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Wed",
MAX (DECODE (TO_CHAR (dt, 'd'),
'5', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Thu",
MAX (DECODE (TO_CHAR (dt, 'd'),
'6', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Fri",
MAX (DECODE (TO_CHAR (dt, 'd'),
'7', LPAD (TO_CHAR (dt, 'fmdd'), 2)
)
) "Sat"
FROM (SELECT TRUNC (SYSDATE, 'y') - 1 + ROWNUM dt
FROM ALL_OBJECTS
WHERE ROWNUM <=
ADD_MONTHS (TRUNC (SYSDATE, 'y'), 12)
- TRUNC (SYSDATE, 'y'))
GROUP BY TO_CHAR (dt, 'fmMonthfm YYYY'), TO_CHAR (dt + 1, 'iw'))
ORDER BY TO_DATE (MONTH, 'Month YYYY'), TO_NUMBER (week);

4 Ağustos 2008 Pazartesi

24 Temmuz 2008 Perşembe

SICAKLIK BAŞIMIZA VURDU





















Son günlerdeki halimizi anlatmak için bu resme bakmak yetmez... Yaşamak lazım buyruuun...

23 Temmuz 2008 Çarşamba

Sıcak!

Sıcaklarla birlikte yazarlarımız yazılarına ara vermişlerdir. Şu an içerinin sıcaklığı 35.6 ve yükselmeye devam ediyor....

12 Haziran 2008 Perşembe

DynaFaces - Tablo içerisinde kullanılan button gibi ögeler

Tablo içerisinde "button", "checkbox" vb. kontollar kullanıldığında bu kontrollardan DynaFaces eylemlerini başlatmak mümkün değildir. Aynı zamanda tabloda kullanılan tüm kontrollarda dinamik olarak rowId atanır.
Örneğin :
form1:table1:tableRowGroup1:tableColumn1:button1 kontrolunu kullanmamız yanlış olur, bunun yerine:
1nci satır için form1:table1:tableRowGroup1:0:tableColumn1:button1
2nci satır için form1:table1:tableRowGroup1:1:tableColumn1:button1
...

olarak kullanmamız gerekir. Dinamik olarak satır numarasını almak için (satır numaraları 0'dan başlar, 0 ilk satırdır, en son satır satır miktarı-1'dir):

(Tablo'nun button OnClick JavaScript kısmına aşağıdaki komutları yazabiliriz.)
DynaFaces.Tx.fire('ajaxTransaction1', 'form1:table1:tableRowGroup1:'+'#{currentRow.tableRow.rowId}'+':tableColumn1:button1');
return false;

Ancak DynaFaces için bu çalışmayacaktır. Burada bir "bug" söz konusu. Ancak "bug" giderilmiş durumda ise kullanabilirsiniz. Ancak eğer kullanamıyorsanız problemin çözümü şu şekilde:

1. tablonun dışında form üzerinde kullanmadığınız bir yere bir textField koyunuz. Button'un action event'i yerine artık textField'in valueChange event'ini kullanacağız. Button için yazdığınız Java kodunu TextField valueChange event Java koduna yerleştiriniz. TextField alanına Button JavaScript'i ile rowId'yi atamak suretiyle değerinin değişmesini ve rowId'nin Java kodumuz içerisinde kullanılmasını sağlayacağız.

2. DynaFaces transaction'ını Button'da kullanmayıp TextField için tanımlayınız (Send input "yes" olacak).

3. Button onClick JavaScript kodu :

document.getElementById('form1:textField1').setProps({value:'#{currentRow.tableRow.rowId}'});

document.getElementById('ajaxTransaction1', 'form1:table1:tableRowGroup1:'+'#{currentRow.tableRow.rowId}'+':tableColumn1:button1').refresh('form1:textField1');

DynaFaces.Tx.fire("ajaxTransaction1", "textField1");
return false;

(Burada dikkatinizi DynaFaces.Tx.fire("ajaxTransaction1", "textField1") komutuna çekmek istiyorum. DynaFaces eylemini button kontrolu içerisinde ve textField1 için başlatıyoruz-ateşliyoruz. Bu sayede TextField onChange JavaScript eventi içerisine bu komutu yazmamız gerekmiyor, zaten TextField onchange eventini çalıştırmamız da gerekmiyor ).

4. TextField kontrolunuzun visible özelliğini "false" yapınız.