1 Temmuz 2008 Salı

Java toUpperCase toLowerCase

String.toLowerCase ve String.toUpperCase metotlarını direkt kullanmak bazı problemler yaratabiliyor. Mesela i harfi, sistemdeki ön seçili dile bağlı olarak büyük harfe İ veya I olarak çevrilebiliyor. Bunu çözmek için bu metodlara Locale'i argüman olarak vermek gerekiyor.


// Sistemdeki default seçili dil ne ise ona göre büyük harfe çevrilir.
"illaki".toUpperCase();

// İngilizceye göre büyük harfe çevrilir, bu durumda i->I çevrimi yapılacaktır
"illaki".toUpperCase( Locale.ENGLISH );

// Türkçeye göre çeviri yapılır, bu durumda i->İ çevrimi yapılır.
"illaki".toUpperCase( new Locale("tr","TR") );


Sistemdeki seçili dili değiştirmek için ise aşağıdaki kod satırı kullanılabilir:

Locale.setDefault(new Locale("tr","TR"));


Java Doc'ta toUppercase methodu için şöyle bir açıklama yazılmış:


Converts all of the characters in this String to upper case using the rules of the default locale. This method is equivalent to toUpperCase(Locale.getDefault()).

Note: This method is locale sensitive, and may produce unexpected results if used for strings that are intended to be interpreted locale independently. Examples are programming language identifiers, protocol keys, and HTML tags. For instance, "title".toUpperCase() in a Turkish locale returns "T?TLE", where '?' is the LATIN CAPITAL LETTER I WITH DOT ABOVE character. To obtain correct results for locale insensitive strings, use toUpperCase(Locale.ENGLISH).

6 Haziran 2008 Cuma

Css Numaraları

1. Resimlerin belirli bir genişliği-yüksekliği geçmesini engellemek ( Maksimum değer vermek ) :

/* Internet Explorer */
width: expression(this.width > 100 || this.width <50 ? 100: this.width);
height: expression(this.height > 100 || this.height <50 ? 100: this.height);
/* Firefox */
max-width:100px;
max-height:100px;

Aslında Internet Explorer için aşağıdaki gibi de bir ifade yazılabilir ama bu bazen problem yaratıyor ve imajın boyutlarını ufacık görebiliyorsunuz. Sanıyorum Imaj width ve height değerleri bazı durumlarda yanlış okunuyor. Bunun için bu değerlerin küçük olup olmadığını da kontrol etmeniz gerekir.

/* Internet Explorer */
width:expression(Math.min(this.width, 100)+'px');
height:expression(Math.min(this.height, 100)+'px');

2. Resimlere çerçeve oluşturma :
border:6px solid #F1EFE9;

27 Nisan 2008 Pazar

Modern Çağın Büyücüleri

Şu an Google Irlanda'da çalışan hocam Yaşar Safkan'ın bilişimcileri modern çağın büyücüleri olarak tanımlayan güzel bir yazısı:

Yazılımcılar. Sistem yöneticileri. Ayrıca bilgisayarın tuşlarına iyi basan bir takım başka arkadaşlar.

Bunlar modern çağın büyücüleri. İçinden "yahu amma salladın, bu adamların yaptığı gayet gerçek ve bilimsel, büyüyle hokkabazlıkla işleri olmaz" diye geçirenler varsa, haklılar elbet. Ama anlatmaya çalıştığım o değil.

Büyücü dediğiniz adam, herkesin bilmediği şeyleri bilir. Anlaşılmaz dev kitapları vardır. Garip lisanlarda, acayip şeyler konuşur. Bu anlaşılmaz lafları kullanıp "büyü"ler yapar, böylece normal insanların yapmak isteyip de yapamadığı, bazen aklına bile getiremediği şeyleri yapar. Kendisinden duruma göre az ya da çok korkulur; itiraf edilmese de böyledir.

Yazılımcılar da böyle değil mi? Dev kitaplarımız var... Bizden başkası anlamaz. İş veya sosyal bir toplantıda, iki yazılımcı muhabbete başlarsa, diğerleri hemen muhabbetten kopar. Klavyelerimizin tuşlarına basarak, büyücü, pardon, yazılımcı olmayanların yapmak isteyip de yapamadıkları şeyleri yaparız. Bazen akıllarına gelmeyen şeyleri de. Tek harfinin yanlış söylenmesi felakete yol açan efsanevi büyüler gibi, bizim yazılımların da tek harfinin yanlış olması felaketlere yol açar...

Büyücüyüz yani.

Tabii, işin bir de içyüzü var. O da efsanenin büyücülerine benziyor. Yazılımcı, sistem yöneticisi falan olabilmek için, şöyle yerden başlasa adam boyunu geçecek kadar kitap okumuş olmak gerekiyor. Okumak da yetmiyor. Deneyim gerekiyor. Pek çok büyünün elde patlamış olması gerekiyor. Daha fenası, gün geçtikçe işler kolaylaşmıyor, zorlaşıyor. Bugün itibarıyla bilinmesi gereken teknoloji miktarı, on yıl öncesine göre kat kat daha fazla.

İş zor iş. Yanlış yapıldığından falan da değil. Tanım gereği zor iş. Bunu söyleyen ben değilim. (Yani ben de söylüyorum da, tek söyleyen ben değilim.) Bu işi 30 yıl, 40 yıl yapmış, halen yapan büyücü abiler. Elbette, herkes kendi işini zor sayar. Ama bu işin zor olduğunun matematiksel delilleri var!

Yazılımcıları yönetmek de zordur. Entreesan insanlardır bunlar. Pek çok insanın aksine, tipik bir yazılımcı, işten, hatta çok işten kaçmaz. Fakat, yaptığı işe inanması gerekir. Kaliteli bir şeyler üretebildiği zaman mutlu olur. Başını sallayıp maaşını almaktan hoşlanmaz, doğru yerde, doğru sebeplerden çalıştığını bilmek, gittikçe daha iyi bir "büyücü" olduğunu hissetmek çoğu zaman maaştan daha büyük ağırlık taşır. Yine para için değil! İyi büyücü olmak için.


31 Mart 2008 Pazartesi

Google Web Toolkit (GWT)

Sonunda ben de GWT ile tanıştım. Bir süredir Prabhakar Chaganti'nin Google Web Toolkit isimli kitabını okuyordum ve sonunda kitabı bitirebildim. Kitap okunması kolay ve zevkli, büyük bölümü de örneklerden oluştuğu için hemen pratik yapabiliyorsunuz.

GWT kısacası kolay bir şekilde AJAX uygulaması geliştirmeye yarayan bir araç. Siz web arayüzünüzü, tamamen Java (aslında Javanın bir alt kümesi) ile GWT kütüphanesini de kullanarak yazıyorsunuz (sanki swing vs. ile java masaüstü uygulaması yazar gibi) ve GWT onu javascript koduna çeviriyor. Böylece javascript'in dertleri ile uğraşmıyorsunuz.

Başlarda insana biraz alışılmadık gelebiliyor ama işin özünü kavrarsanız GWT çok işe yarayacağa benziyor. Özellikle daha önceden Java ile masaüstü uygulaması geliştirdiyseniz çok kolay adapte olabilirsiniz.

Benim dikkatimi çeken bazı güzel özellikleri şunlar:
  • Tamamen Java kodu yazıyorsunuz, haliyle de kolayca debug yapabiliyorsunuz.
  • Başkalarının yazdığı kodları .jar dosyası olarak kütüphanenize ekleyip kullanabiliyorsunuz. (Mesela başkasının hazırladığı bir takvim, ya da hava durumu öğesi)
  • Oluşturduğunuz arayüz elementlerine (Button,Label vs.) style atayabiliyor ve css dosyasında görünüşlerini değiştirebiliyorsunuz.
  • JavaScript Native Interface (JSNI) sayesinde diğer javascript kütüphanelerine erişip sağlayabiliyorsunuz.

Bazı faydalı siteler:

Bazı faydalı makaleler:
Bazı Güzel Eklentiler:

Not: Şu ana kadar bir proje üzerinde denemedim, sadece kitabı okuyarak teorik bilgi edindim ve mevcut örnekleri inceledim. Kendim üç beş ufak deneme yaptım. Bir proje üzerinde çalıştıktan sonra daha ayrıntılı bilgiler verebilirim.




12 Aralık 2007 Çarşamba

JSP Sayfası İçinde Response Redirect

jsp:include tagi ile içeriğini aldığınız sayfa eğer Response redirect ile başka bir sayfaya yönlendirme içeriyorsa, browserınız o sayfaya yönlendirme yapmak yerine sayfaya aşağıdaki içeriği koyar:

URL moved here


Bunu engellemek için, bir sayfanın içeriğini almakta jsp:include tagini değil @include tagini kullanın.

Örnek:

<jsp:include page="icerik.jsp"/>
<%@include file="icerik.jsp"%>

11 Aralık 2007 Salı

Web Sayfasında Flashların En Üstte Görünmesini Engellemek

Geçenlerde içinde flash bulunan bir sayfa üzerine şeffaf bir layer koymaya çalışırken şöyle bir problem yaşadım. Sayfadaki flash objesi ne yaparsam yapayım layerın üzerine çıkıyordu.

Flashın bulunduğu yere "z-index:-1" vermem de bi işe yaramadı.

Bakınız:
You can't make a flash movie behave in the z-index - doesn't matter whether the movie is in a layer (div) or not it will always show up on top of any layers that overlap the movie.

Problemin çözümöü flashın "wmode" parametresini "transparent" yapmakmış.

Bakınız:
click on the flash file in dreamweaver... open up its parameters.. and make the

parameter: wmode
value: transparent




3 Aralık 2007 Pazartesi

Steve Jobs'tan Hayat Dersleri

Apple ve Pixar'ın kurucusu ve şimdiki CEO'su Steve Jobs'un bir üniversitenin mezuniyet töreninde yaptığı konuşması.




19 Kasım 2007 Pazartesi

Page Expire Problem When Browser's Back Button is Clicked

PROBLEM:

As a result of a search form submission, results are displayed as links. The user clicks any links and goes to that page. When back button is pressed, browser gives an error.


In detail,

1. User submits an HTML form that does a search.
2. User sees a list of search results, each hyperlinked to a details screen.
3. User clicks one of the "details" hyperlinks.
4. User sees the details screen.
5. User clicks browser's "Back" button to return to the screen in Step 2.
6. Browser gives confusing message about having to resubmit POST data. In Firefox this is a dialog box with OK/Cancel, and IE this is a white screen with the message:

"Warning: Page has Expired The page you requested was created using information you submitted in a form. This page is no longer available. As a security precaution, Internet Explorer does not automatically resubmit your information for you. To resubmit your information and view this Web page, click the Refresh button."

SOLUTION:

Handle the form inside javascript, and submit search using request parameters.

Not a Form, a text input field and a link:

SEARCH LINK
Javascript Code:function ProcessSearchSubmit() {
linkToRedirect="/search.ovt?results=allResults&searchInput=";
if ( document.getElementById('searchInputId') ) {
linkToRedirect += document.getElementById('searchInputId').value;
}
setTimeout( "window.location.href = linkToRedirect", 0 );
}

Window.location.href not working in IE for every page

There is a problem about javascript redirect in Internet Explorer. I couldn't redirect to another page in IE using

window.location.href = url;

This command gets executed (proofed with alert messages) but nothing happens. Firefox acts like expected but i couldn't get it work in IE.

I have finally found the solution after some google search.

RedirectUrl = url;
setTimeout( "window.location.href = RedirectUrl", 0 );

Another solution says that if you set this from the window.location.href in a Javascript function, is enough to return false. Check this out: IE bug.

24 Ekim 2007 Çarşamba

Bağımlılık yapan bir oyun




Flash Element TD
Warcraft'tan esinlenerek yapılmış bir oyun. Oyunun amacı basit. Bir labirentten her turda farklı özelliklerde ve sayılarda yaratıklar çıkıyor ve siz bunları labirentin kenarlarına kurduğunuz farklı özelliklerdeki kulelerinizden ateşlenen silahlarla durdurmaya çalışıyorsunuz. Kuleleri nereye kurduğunuz çok önemli. Aman dikkat.

Ben 34. turda 2054 puanda kalabildim. Zaten 39. turdan sonrasına gelen yok sanırım.



19 Ekim 2007 Cuma

Web 2.0 biziz



Web'in (özellikle de 2.0'ın) düşünce tarzımızda, kendimizi ifade edişimizde ne gibi değişikliklere sebep olduğuna dair bir video... Kansas State Üniversitesi'nden Michael Wesch tarafından hazırlanan video hem sunum tekniği hem anlattıkları açısından oldukça takdire şayan.

İzlerken beni çok gülümseten ve hoşuma giden bir sunum. Tavsiye ederim.

16 Ekim 2007 Salı

Firefoxu Hızlandırmak

Normal olarak Firefox bir web sayfasını açmak için o sayfaya bir istek gönderir. Eğer Firefox da Pipeling özelliğini aktif hale getirirseniz, sayfaya istek gönderilmez, aksine direkt olarak sayfa açılmaya çalışılır. Buda sayfanın daha çabuk tarayıcı ekranında gösterilmesini sağlar.

Firefox'da Pipeling özelliğini aşağıdaki şekilde aktif hale getirebilirsiniz:

1. İlk önce URL adres çubuğunda "about:config" yazın ve enter yapın.

2. Açılan menüdeki arama çubuğunda "pipelining" yazarak arama kriterlerini kısaltın. (Daha az sonuç ekrana yansır)

3. Aşağıdaki değerlerin TRUE olmasını sağlayın

* network.http.pipelining
* network.http.proxy.pipelining

Tips: Bu parametreler üstüne 2 kere çift tıklayarak TRUE olmasını sağlayabilirsiniz.

4. En fazla sorgulama için 30 değerini atayın. Bunun için,

* network.http.pipelining.maxrequests

değiskenin olduğu satırı bulun ve değişgen üstünde fare ile Sağ tıklayın, açılan menüden "Değiştir" seçerek, açılan kutuya 30 yazıp enter yapın.

5. Aynı menude fare ile boş bir yere sağ tıklayın.
Yeni -> Integer kısayolunu takip edin. Açılan menuye

* nglayout.initialpaint.delay

yazın. Değer olarak 0 (sıfır) atayın.

Bu yeni değer sayesinde istenen bilgiler için bekleme süresi 0(sıfır) olarak tanımlanır.

Pipeling özelliği aktif edilmiş Firefox tarayıcınız ile artık daha hızlı internette gezebileceksiniz, saygılar ..

5 Ekim 2007 Cuma

ZK Framework

Overteam'deki son projemiz diyalogo'da javascript ve ajax olayı biraz canımızı sıkınca, MIT mezunu dahi patronumuz Dr. Yaşar imdadımıza yetişti ve bizi ZK Framework isimli "javascript kullanmadan ajax" uygulayabileceğimiz bir framework ile tanıştırdı.

ZK framework, javascript bilgisi gerektirmeden birazcık programlama bilgisiyle zengin kullanıcı arabirimli web uygulamaları gerçekleştirmeyi sağlayan açık kaynak kodlu bir ajax web kütüphanesi. (1)

Ön yüz server tarafında XML ile oluşturuluyor, bir java web server’ına ve MySQL database’ine ihtiyaç duyuyor. En ilginç özelliği ön yüz için oluşturduğunuz XML içerisinde hem javascript hem de serverda çalışacak java kodları yazabiliyor olmanız. Mesela bir düğme tıklandığında validation’ı javascript ile yaparken tıklama sonrasında serverda yapılacak işleri java ile aynı XML’in içinde yazabiliyorsunuz. Dökümantasyon konusunda da çok zengin. (2)

ZK ile neler yapabileceğinizi görmek istiyorsanız, bu linkten canlı örneklere bakabilirsiniz: ZK Live Demo

ZK framework'ü hakkında daha ayrıntılı bilgi sahibi olmak için: http://www.zkoss.org/




1-) http://en.wikipedia.org/wiki/ZK_Framework
2-) http://www.yesiltas.net/sezer/2006/10/ajax.html

31 Temmuz 2007 Salı

Java ve .Net Yarışı Kızışıyor

Görünen o ki Java kullanıcı arabirimi (User Interface) pazarında liderliği .Net'e kaptırmış.

27 Mayıs 2007 Pazar

Execute Queries on a Database

A class that makes connection to database and run queries.
----------------------------------------------

/*
* FlightDB.java
*
* Created on 24 Dec 2006 Sunday, 06:00
*
*/

package com.myairline.db;

import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Date;
import java.sql.PreparedStatement;

import com.myairline.type.Flight;
import com.myairline.type.Route;
import com.myairline.type.Plane;
import com.myairline.type.Airport;
import com.myairline.common.MyConstants;

/**
*
* @author ozkansari
*/
public class FlightDB {

Connection connection;

/** Creates a new instance of UserDB */
public FlightDB() {
DatabaseConn dbConn = new DatabaseConn();
connection = dbConn.getConnection();
}

public ArrayList searchFlight() {
return null;
}

public boolean insertNewFlight() {
return false;
}

public boolean deleteFlight() {
return false;
}

public void scheduleFlight() {
}

/**
*
*
* @param fromAirportId
* @param toAirportId
* @param flightDate
* @param returnDate
* @param passengerCount
*/
public ArrayList getFlightList( int fromAirportId, int toAirportId, Date flightDate, int passengerCount ) {

ArrayList flightList = new ArrayList();

try {
Statement statement = connection.createStatement();
String q = "SELECT * FROM `flight` f , `route` r, `plane` p WHERE " +
"f.idRoute = r.idRoute AND " +
"f.idPlane = p.idPlane AND " +
"f.passenger_count + " + passengerCount + "<= p.capacity " + " AND " +
"r.start_airport =" + fromAirportId + " AND " +
"r.end_airport =" + toAirportId + " AND " +
"flightDate LIKE \"" + flightDate +"%\"" ;

ResultSet rs = statement.executeQuery(q);

AirportDB airportcheck = new AirportDB();
Airport fromAirport = airportcheck.getAirport(fromAirportId );
Airport toAirport = airportcheck.getAirport(toAirportId );

while (rs.next()) {

Flight flight = new Flight();
Route route = new Route();
Plane plane = new Plane();

flight.setFlightNo(rs.getInt("f.flight_no"));
flight.setIdPlane(rs.getInt("f.idPlane")) ;
flight.setIdRoute(rs.getInt("f.idRoute")) ;
flight.setFlightDate(rs.getDate("f.flightDate"));
flight.setPassengerCount(rs.getInt("f.passenger_count")) ;
flight.setTicketFare(rs.getInt("f.ticket_fare")) ;
flight.setFlightStatus(rs.getString("f.status")) ;

route.setIdRoute(rs.getInt("r.IdRoute"));
route.setStartAirportId(rs.getInt("r.start_airport"));
route.setEndAirportId(rs.getInt("r.end_airport"));
route.setMiles(rs.getInt("r.miles"));
route.setStartAirport( fromAirport );
route.setEndAirport( toAirport );

plane.setIdPlane(rs.getInt("p.IdPlane"));
plane.setPlaneType(rs.getString("p.planeType"));
plane.setCapacity(rs.getShort("p.capacity"));

flight.setFlightPlane( plane ) ;
flight.setFlightRoute( route ) ;

flightList.add(flight);
}

} catch (SQLException e) {
e.printStackTrace();
}

return flightList;
}

}