Programlama Konusu

Çeşitli e-posta sitelerinde, hiç kullandınız mı bilmiyorum, kimi klasik klavye kısayolları kullanarak sık yapılan işleri kolaylaştırabilirsiniz. “n” ile sonraki mesaja, “p” ile önceki mesaja gitmek, “c” ile yeni e-posta yaratmak, vs… http://www.openjs.com/scripts/events/keyboard_shortcuts/ adresinde bulacağınız javascript sınıfı ile bu özellikleri kolaylıkla kendi sitenize ekleyebilirsiniz.

Basitçe nasıl kullanıldığını anlatayım. Önce javascript dosyasını şuradan indiriyorsunuz. Javascript dosyasını sayfanıza ekledikten sonra kullanabileceğiniz iki fonksiyon var: shotcut.add() ve shortcut.remove().

shortcut.add(tuslar, fonksyion, secenekler);
tuslar: string formatında tuşlar. “a”, “b”, “8″, “#” gibi tek karakterlik kısayol tanımlayabileceğiniz gibi “ctrl+s”, “alt+f”, “ctrl+shift+x” gibi kombinasyolar da kullanabilirsiniz.
fonksiyon: tanımlanan tuşlara basıldığında çağırılacak fonksyion.
secenekler: Javascript nesnesi. Varolan seçenekler:
type: “event” tipi. fonksiyonun hangi anda çağırılacağını belirler. şunlardan bir tanesi olabilir: “keydown”, “keyup”, “keypress”. Geçerli olan “keydown” yani tuşa basıldığı an.
disable_in_input: “true” ya da “false”. İmleç input, textarea gibi alanlardayken kısayolların çalışmasını engeller. Geçerli değer: false
target: DOM nesnesi. Tuşların aktif olduğu DOM nesnesi. Geçerli değer: document (her yer)
propagate: “true” ya da “false”. Taracının kendi içinde tanımlı kısayolu aktif kalsın mı?
keycode: tuşun kodu. mesela “a” için “65″.

shortcut.add()

Yeni kısayol ekleme.

Kullanımı:

shortcut.add(tuslar, fonksiyon, secenekler);

Parametreler:

  • tuslar: string formatında tuşlar. “a”, “b”, “8″, “#” gibi tek karakterlik kısayol tanımlayabileceğiniz gibi “ctrl+s”, “alt+f”, “ctrl+shift+x” gibi kombinasyolar da kullanabilirsiniz.
  • fonksiyon: tanımlanan tuşlara basıldığında çağırılacak fonksyion.
  • secenekler: Javascript nesnesi. Varolan seçenekler:
    • type: “event” tipi. fonksyionun hangi anda çağırılacağını belirler. şunlardan bir tanesi olabilir: “keydown”, “keyup”, “keypress”. Geçerli olan “keydown” yani tuşa basıldığı an.
    • disable_in_input: “true” ya da “false”. İmleç input, textarea gibi alanlardayken kısayolların çalışmasını engeller. Geçerli değer: false
    • target: DOM nesnesi. Tuşların aktif olduğu DOM nesnesi. Geçerli değer: document (her yer)
    • propagate: “true” ya da “false”. Taracının kendi içinde tanımlı kısayolu aktif kalsın mı?
    • keycode: tuşun kodu. mesela “a” için “65″.

Örnek:

shortcut.add("Ctrl+B",
		function(){alert("ctrl+b tuşlarına bastınız");}
	);
 
shortcut.add("Ctrl+B",
		function(){alert("propogate:true olduğu için bu mesajdan sonra tarayınızın kendi işlevi çalışacak");},
		{propogate:true}
	);

shortcut.remove()

Kısayol kaldırma.

Kullanımı:

shortcut.remove(tuslar);

Parametreler:

  • tuslar: kaldırılacak kısayol tuşları.

Örnek:

//kisayol ekle
shortcut.add("Ctrl+B", function(){alert("Yeni kısayol eklendi");} );
//kisayolu kaldir
shortcut.remove("Ctrl+B");

Kullanılabilecek özel tuşlar:

Tab
Space
Return
Enter
Backspace
Scroll_lock
Caps_lock
Num_lock
Pause
Insert
Home
Delete
End
Page_up
Page_down
Left
Up
Right
Down
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12

Java’da resim formatı değiştirmek, resim boyutlarını öğrenmek gibi temel işlemler kolayca yapılabilir. Yine de bu işlemleri bir genel amaçlı bir “resim işleme sınıfı” toplamak isteyebilirsiniz. Bu sayfada bulacağınız ImageUtil sınıfı böyle bir sınıf için iyi bir başlangıç olabilir. Şu anda sadece resim genişliği, yüksekliği, dosya boyutunu bulabiliyor, jpg, gif, png, bmp formatları arasında çevrim yapabiliyor. İlerleyen zamanlarda resim boyutu değiştirme, üstüne yazı yazma ve resme watermark ekleme gibi işlemleri de ekleyeceğim. ImageUtil‘i direkt olarak kullanmasanız bile kodlarını inceleyerek bu işlemlerin nasıl yapıldığını rahatlıkla öğrenebilirsiniz. Sonuçta bütün bu işlemler için Java ile gelen javax.imageio.ImageIO sınıfını kullanılmakta.

ImageUtil metotları resim dosyasını ‘dosya adı’ olarak değil de File sınıfı olarak almakta. Elinizde sadece dosya adı varsa File nesnesini aşağıdaki gibi oluşturabilirsiniz.

File dosya=new File("c:/dizinadi/resim.jpg");

Metotları burada tek tek açıklamayacağım, bütün açıklamalar JavaDoc formatında kodun içerisinde bulunmakta. Aşağıdaki örneğe bakarak da sınıfın nasıl kullanıldığını görebilirsiniz.

Örnekler:

Not: Bu örnek ImageUtil sınıfının main metodu içerisinde aynen bulunmakta.

	try{
		//test
		String filePath="d:/_dev/temp/"; //!!!bunu ve dosya adini degistirmeyi unutmayin!!!
		File f = new File(filePath+"test.png");
		System.out.println("test.png: "+ImageUtil.findWidth(f)+"x"+ImageUtil.findHeight(f));
 
		f=ImageUtil.convertTo(f, new File(filePath+"/test.gif"), ImageUtil.GIF);
		System.out.println("test.gif: "+ImageUtil.findWidth(f)+"x"+ImageUtil.findHeight(f));
 
		f=ImageUtil.convertTo(f, new File(filePath+"/test.bmp"), ImageUtil.BMP);
		System.out.println("test.bmp: "+ImageUtil.findWidth(f)+"x"+ImageUtil.findHeight(f));
 
		f=ImageUtil.convertToJpg(f, new File(filePath+"/test.jpg"), 0.9f);
		System.out.println("test.jpg: "+ImageUtil.findWidth(f)+"x"+ImageUtil.findHeight(f));
 
	}
	catch(Exception e){
		e.printStackTrace();
	}

(daha fazla…)

Kategoriler: Programlama
Tags: ,
devam et >

Email adresi kontrolü için pek çok fonksiyon yazılmıştır. Bunları internette kolayca bulabilirsiniz. Fakat bu fonksiyonlar ne kadar doğru çalışıyor? ‘Comparing E-mail Address Validating Regular Expressions’ isimli yazıda vakti bol saygıdeğer bir arkadaşımız ‘Regular Expression’ ile yapılan 13 adet e-posta doğrulamasını sistemli bir şekilde test etmiş, hangisinin nerede doğru, nerede yanlış çalıştığını güzel bir şekilde listelemiş. Bu testlere göre mükemmel doğrulukta çalışan bir metot bulamamış ama Kohana project‘ten Geert De Deckere tarafından geliştirilen aşağıda göreceğiniz ‘regular expression’ı en başarılı olarak seçmiş. Bu regex’te eksik olan 2 nokta bulmuş. Bu iki noktasizin için problem çıkarmayacaktır. Detayları yukarıda verdiğim adreste bulabilirsiniz. Aşağıda bu regex’in fonksiyon haline getirilmiş halini bulabilirsiniz.

/**
* Eposta adresinin gecerli olup olmadigini kontrol eder.
* @param $eposta
* @return bool eposta gecerli ise 'true', degilse 'false' dondurur.
*/
function epostaDogrumu($eposta){
	return (bool) preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', $eposta);
}

For english: Date & Time Difference in PHP

İki tarih arasındaki farkı hesaplamak için PHP’de date_diff diye bir fonksiyon bulunmakta ama ne yazık ki bu fonksiyon PHP’nin sadece 5.3 ve sonraki versiyonlarında çalışıyor. Dolayısıyla pek çok kişi için tarih-saat farkı hesaplayan bir fonksiyona ihtiyaç var. Bu sayfada bu işi yapan bir fonksiyon bulacaksınız. Aradığınız sadece Türkçe tarih & saat göstermek ise şu yazıya bakınız: PHP ile Türkçe Tarih Gösterimi-Çevrimi

Kullanım

Fonksiyon 3 adet değişken alıyor. Bunlardan sadece birincisi zorunlu.
dateDiff($d1[, $d2=null [, $format="*"]);

İlk iki parametre olarak farkı alınacak tarih ve/veya saatleri giriyorsunuz. Tarih formatı olarak Unix zaman damgası veya ‘strtotime‘ fonksiyonunun kabul ettiği herhangi bir değer kullanılabilir. Dolayısıyla tarih girmek için ‘time()‘ fonksiyonun ya da acayip bir format kullanmıyorsanız MySQL verilerini doğrudan kullanabilirsiniz. ‘strtotime‘ fonksiyonunu kabul ettiği değerler ile ilgili php.net strtotime sayfasına bakabilirsiniz. Girilen zamanların hangisinin büyük olduğu önemli değil. Yani tarihFarki(’12-03-2009′, ‘01-01-2010′) ve tarihFarki(’01-01-2010′, ‘12-03-2009′) size aynı sonuçları getirecektir. Son parametre olan $format sonucun hangi şekilde döndürüleceğini belirler. $format olarak “saniye”, “dakika”, “saat”, “gun”, “hafta”, “ay”, “yil” veya “*” değerlerinden birisini girebilirsiniz. “*” dışındaki seçeneklerde fonksiyon size belirtilen formatta bir sayı döndürecekir. Yani tarihFarki(’2010-01-02′, ‘2010-01-01′, ‘gun’) yazarsanız alacağınız sonuç ‘1′, tarihFarki(’2010-01-02′, ‘2010-01-01′, ‘dakika’) yazarsanız ‘86400′ (bir gündeki dakika sayısı) olur. Eğer $format olarak “*” girerseniz ya da bu alanı hiç kullanmazsanız fonksiyon yukarıda geçen tüm değerleri içeren bir dizi döndürür.

Örnekler

echo "Şu an:".date("r",time())."<br>";
echo "1: ".tarihFarki("20090401040302", time(), "ay")." ay<br>";
echo "2: ".tarihFarki(time(), "2009-07-23 04:00:00", "saat")." saat<br>";
echo "3: ".tarihFarki("-3 day", "2009-07-23 04:00:00", "gun")." gun<br>";
echo "4: ".tarihFarki("2008-06-23", "2009-07-23", "yil")." yıl<br>";
$t=tarihFarki("2008-06-23", "2009-07-23");
echo "5: ";
print_r($t);
echo "<br>";

Kod

/**
 * Iki tarih arasindaki farki bulur.<br>
 * <strong>kullanim:</strong> dateDiff($d1[, $d2=null [, $format="*"]);<br>
 * <strong>ornek:</strong><br>
 * echo "şu an:".date("r",time())."<br>";
 * echo "1: ".tarihFarki("20090401040302", time(), "ay")." ay<br>";
 * echo "2: ".tarihFarki(time(), "2009-07-23 04:00:00", "saat")." saat<br>";
 * echo "3: ".tarihFarki("-3 day", "2009-07-23 04:00:00", "gun")." gun<br>";
 * echo "4: ".tarihFarki("2008-06-23", "2009-07-23", "yil")." yıl<br>";
 * $t=tarihFarki("2008-06-23", "2009-07-23");
 * echo "5: "; print_r($t);
 *
 * @param mixed $d1     ilk tarih. unix zaman damgasi ya da strtome 
 *                      fonsksiyonunun kabul ettigi herhangi bir deger olabilir. 
 *                      ornek: '2009-05-23', '2009-05-23 12:10:04', '-2 day',
 *                      '23-05-2009 12:23', '20090523121004'
 * @param mixed $d2     ikinci tarih. ilkiyle ayni ozellikleri tasir. eger 
 *                      girilmez ya da bos bir deger olarak girilirse o anki 
 *                      tarih olarak alinir. bu iki tarih arasinda 
 *                      hangisinin buyuk hangisinin kucuk oldugu onemli degildir.
 *                      ikisi de ayni sonuc verir.
 * @param str $format   "saniye", "dakika", "saat", "gun", "hafta", "ay", 
 *                      "gun", "*".
 *                      eger girilmez ya da "*" olarak girilirse yukaridaki 
 *                      butun degerleri iceren bir dizi dondurur. belirtilen 
 *                      diger degerlerden birisi girilirse bu tipte bir sayi 
 *                      dondurur.
 * @return mixed        sayi ya da dizi tipinde tarihler arasindaki farki 
 *                      dondurur. dizinin icinde bulunan  degiskenler 
 *                      sunlardir: "saniye", "dakika", "saat", "gun", "hafta", 
 *                      "ay", "gun" olacaktir.
 */
function tarihFarki($d1, $d2=null, $format="*"){
    if($d2==null){
        $d2=$d1;
        $d1=time();
    }
 
    if(!is_int($d1)) $d1=strtotime($d1);
    if(!is_int($d2)) $d2=strtotime($d2);
    $d=abs($d1-$d2);
 
    $format=strtolower($format);
    if(empty($format)) $format="*";
 
    $result = array();
 
    if($format=="*" || $format=="gun")    $result["gun"]   = floor($d/(60*60*24));
    if($format=="*" || $format=="ay")     $result["ay"] = floor($d/(60*60*24*30));
    if($format=="*" || $format=="yil")    $result["yil"]  = floor($d/(60*60*24*365));
    if($format=="*" || $format=="hafta")  $result["hafta"]  = floor($d/(60*60*24*7));
    if($format=="*" || $format=="saat")   $result["saat"]  = floor($d/(60*60));
    if($format=="*" || $format=="dakika") $result["dakika"]= floor($d/60);
 
    if($format!="*") return $result[$format];
    else return $result;
}

Asağıdaki fonksiyon ile bir dizindeki dosyaları silebilirsiniz. Fonksiyon ihtiyacınıza göre farklı şekillerde çalışabilir. Bir dizini alt dizinleriyle birlikte silebilirsiniz, dosya silerken ‘regular expression’ kullanıp dosya adına göre silme işlemi yapabilirsiniz, dizinin sadece içeriğini silebilirsiniz. Aşağıda gerekli bilgileri ve kullanım örneklerini PHPDoc şeklinde türkçe olarak yazdım.

(Click for english: Remove a Directory and Its Content with PHP)

/**
 * bir dizin/klasör icindeki dosyalari siler.
 * kullanim sekli:
 * dizinSil(string $dizin [, bool $dizininKendisiniSil=true 
 *                      [, bool $altDizinleriSil=true 
 *                      [, string $regEx='/.* /']]]); 
 * 
 * kullanim ornekleri:
 * dizinSil('/home/gudubeth/resimler');
 *      //dizin icindeki dosyalari, alt dizinleri ve dizinin kendisi siler
 * dizinSil('/home/gudubeth/resimler', false);
 *      //sadece dizinin icerigini siler. alt dizinler silinir
 * dizinSil('/home/gudubeth/resimler', false, false);
 *      //sadece dizinin icerigini siler. alt dizinler silinMEZ
 * dizinSil('/home/gudubeth/resimler', false, true, '/.*\.jpg/');
 *      //dizin ve altdizinlerdeki jpg uzantili dosyalari siler.
 *
 * @param str $dizin
 *                      dizinin yeri. ornek: /home/guest/temp
 *                      veya c:/appserv/www/tmp
 * @param bool $dizininKendisiniSil
 *                      eger 'true' ise dizinin kendisini siler.
 *                      degil ise sadece dizin icerigi silinir.
 *                      varsayilan deger: 'true'
 * @param bool $altDizinleriSil
 *                      'true' ise yinelemeli (rekursif) calisip
 *                      alt dizinleri de siler.
 *                      varsayilan deger: 'true'
 * @param str $regEx
 *                      sadece $regEx ile secilen dosyalari siler.
 *                      regEx fonksiyonu olarak preg_match kullanilir.
 *                      varsayilan deger: '/.* /' (yani tum dosyalari sil).
 *                      ornek degerler:
 *                          mp3 uzantili dosyalari sil: '/.*\.mp3/'
 *                          adi a ile baslayan dosyalari sil: '/a.* /'
 *                          adinda 'tmp' gecen dosylari sil: '/.*tmp.* /'
 *
 * @return  bool        eger denenen her dosya silindiyse veya silinecek bir
 *                      dosya bulunamadiysa 'true' degerini dondurur.
 *                      Dosya silme islemlerinden herhnagi birisi hatali ise
 *                      'false' dondurur.
 * */
function dizinSil($dizin, $dizininKendisiniSil=true, $altDizinleriSil=true, $regEx="/.*/") {
    if(!$dh = @opendir($dizin)) return false;
    $sonuc=true;
    while (($dosya=readdir($dh))!==false) {
        if($dosya!='.' && $dosya!='..'){
            if(is_dir( $dizin.'/'.$dosya) && $altDizinleriSil)
                $sonuc = dizinSil($dizin.'/'.$dosya, true, true, $regEx) && $sonuc;
            else if(preg_match($regEx, $dosya))
                $sonuc = @unlink($dizin.'/'.$dosya) && $sonuc;
        }
    }
    closedir($dh);
    if($dizininKendisiniSil) $sonuc = @rmdir($dizin) && $sonuc;
    return $sonuc;
}

Kolaylıkların dili PHP ile tarih formatlamak gerçekten kolay bir iş ama sadece ingilizce siteler için. İngilizce bir sitede tarih göstermek için tek ihtiyacınız ‘date‘ fonksiyonu. İlk parametre olarak gireceğiniz belirli karakterlerle tarihi istediğiniz gibi gösterebilirsiniz. Mesela ‘January 12, 2009‘ yazdırmak için ‘echo date(”F j, Y”)‘ yazmanız yeterli olacaktır.

Türkçe Tarih & Saat Fonksiyonu

Tarih ve saat gösterimini en basit şekilde halledebilmeniz için aşağıdaki göreceğiniz fonksiyonu kullanabilirsiniz. Fonksiyonun çalışma prensibi çok basit: date fonksiyonunu çağırıp aldığı çıktıdaki ingilizce kelimeleri türkçeye çeviriyor. Fonksiyonun dışında kalan diziler de bu çevrimler için zaten. Doğrudan date fonksiyonu kullanıldığı için aldığı parametreler temelde date ile aynı. Sadece işleri biraz daha kolaylaştırmak için bu parametrelerin yeteneklerini arttırdım. Şöyle ki: tarih formatının belirlendiği ilk parametrede ay, gün, yıl gibi türkçe kelimeler; gösterilecek tarihin belirlendiği ikinci parametrede ise tek bir tane yerine çok daha çeşitli formatlarda tarihler kullabiliyorsunuz. Basitçe örneklersek, date(”d F Y”) fonksiyonunu tarih(”d F Y”) şeklinde yazabileceğiniz gibi tarih(”gun ay yil”) şeklinde de yazabilirsiniz (çıktısı ‘17 Mayıs 2009′ gibi birşey olacaktır).

Tanımlama:

tarih($format, [$zaman]);
$zaman ile belirtilen zamanı ilk parametrede belirtilen formatta biçimlendirir. $zaman parametresi girilmemişse çalışma zamanındaki zaman kullanılır.

Parametreler:

$format

Biçilendirilecek tarihin formatı. String içerisine yazılan format bilgilerinden oluşur (”d-F-Y” gibi). date fonksiyonunda kullanılan seçeneklerin hepsi bu değişken için de geçerlidir. php.net:date fonksiyonu adresinde detaylı seçenekleri görebilirsiniz. Bu sayfada belirtilen seçeneklerin yanı sıra aşağıda belirtilen türkçe değerler de kullanılabilir.

Biçim Açıklama Örnek sonuç
gun Ay günlerinin sıfır dolgulu iki haneli gösterimi 01′den 31′e
kisagun Ay günlerinin sıfır dolgusuz gösterimi 1′den 31′e
hgun Hafta günlerinin tam metinsel gösterimi Pazar’dan Cumartesi’ye
hgunkisa Ay günlerinin iki harfli metinsel gösterimi Pzt’den Paz’a
ay Ayın tam metinsel gösterimi, Ocak ya da Mart gibi Ocak’tan Aralık’a
kisaay Ayın üç karakterli, metinsel kısa gösterimi Oca’dan Ara’ya kadar
aysayi Ayın sıfır dolgulu sayısal gösterimi 01′den 12′ye
kisaaysayi Ayın sıfır dolgusuz sayısal gösterimi 1′den 12′ye kadar
yil Yılın 4 haneli sayısal, tam gösterimi 1999 ya da 2003 gibi
kisayil Yılın iki haneli gösterimi 99 ya da 03 gibi
saat Saatin, 24-saatlik sıfır dolgulu gösterimi 00′dan 23′e
kisasaat Saatin, 12-saatlik sıfır dolgulu gösterimi 01′den 12′ye
dakika Sıfır dolgulu dakika gösterimi 00 ile 59 arasında
saniye Sıfır dolgulu saniye gösterimi 00 ile 59 arasında
Örnek format Örnek sonuç
“ay, yil” Ocak, 2010
“kisagun ay, hgun” 7 Ocak, Pazartesi
“gun-aysayi-kisayil saat:dakika:saniye” 07-01-10 12:10:54

$zaman:

Biçimlendirilecek zamanı belirtir. Eğer girilmemişse o anki zaman kullanılır. $zaman değeri strtotime fonksiyonun kabul ettiği tüm değerler olabilir. MySQL veritabanından aldığınız değerleri doğrudan kullanabilirsiniz. Aşağıda bu parametrenin alabileceği bazı değerler örneklenmiştir:
“31-12-2009 13:23:10″
“2009-12-31 13:23:10″
“31-12-2009″
“3 gun once”
“-3 gun”
“+5 gun”
“2 yil sonra”

Kullanım Örnekleri

echo tarih("gun/ay/yil saat:dakika:saniye")."; ";
// çıktısı: 30/Aralık/2009 01:06:58;
echo tarih("gun-ay-yil, hgun saat:dakika", "3 gun once")."; ";
// çıktısı: 27-Aralık-2009, Pazar 01:06;
echo tarih("kisagun-kisaaysayi-kisayil, hgun saat:dakika", "+2 ay")."; ";
// çıktısı: 2-3-10, Salı 01:08;
echo tarih("yil.ay.gun saat:dakika:saniye", "2009-12-20 12:10:23")."; ";
// çıktısı: 2009.Aralık.20 12:10:23;
echo tarih("gun ay yil saat:dakika", "20081118100630");
// çıktısı: 18 Kasım 2008 10:06

Kod

$aylarIng=array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
$aylarKisaIng=array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
$gunlerIng=array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
$gunlerKisaIng=array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");
$aylar=array("Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık");
$aylarKisa=array("Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara");
$gunler=array("Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar");
$gunlerKisa=array("Pt", "Sa", "Ça", "Pe", "Cu", "Ct", "Pa");
 
/**
 * tarihi turkceye cevirir. tarih temelde date fonksiyonu ile olusturulur.
 * $zaman ise strtotime ile timestamp'e cevrilir. $format'in kullanımi
 * date fonksiyonunda oldugu gibidir. ayni sekilde  $zaman'in alacagi degerler
 * strtotime fonksiyonuna uygun secilebilir.
 *
 * @global array    $aylarIng, $aylar, $gunlerIng, $gunler, $aylarKisaIng,
 *                      $aylarKisa, $gunlerKisaIng, $gunlerKisa
 * @param str       $format
 * @param str/int   $zaman
 * @return str
 */
function tarih($format, $zaman=null){
    if(!$zaman) $zaman=time();
    else{
        $zaman=str_ireplace(array("once","ay", "gun", "yil","dakika","saniye","hafta"),
                           array("ago","month","day","year","minute","second","week"), $zaman);
        $zaman=strtotime($zaman);
    }
    $format=str_ireplace(
        array("kisaaysayi","kisaay","aysayi","kisagun","hgunkisa","hgun","gun","kisayil","yil","kisasaat","saat","dakika","saniye", "ay"),
        array("n",         "M",     "m",     "j",      "D",       "l",   "d",  "y",      "Y",  "h",       "H",   "i",     "s",      "F"),
        $format);
    $tarihStr=date($format, $zaman);
    if(strpos($format, "F")!==false){
        global $aylarIng, $aylar;
        $tarihStr=str_replace($aylarIng, $aylar, $tarihStr);
    }
    if(strpos($format, "l")!==false){
        global $gunlerIng, $gunler;
        $tarihStr=str_replace($gunlerIng, $gunler, $tarihStr);
    }
    if(strpos($format, "M")!==false){
        global $aylarKisaIng, $aylarKisa;
        $tarihStr=str_replace($aylarKisaIng, $aylarKisa, $tarihStr);
    }
    if(strpos($format, "D")!==false){
        global $gunlerKisaIng, $gunlerKisa;
        $tarihStr=str_replace($gunlerKisaIng, $gunlerKisa, $tarihStr);
    }
    return $tarihStr;
}

Kaynaklar:
‘date’ fonksiyonu

SetLocale ile Türkçe Tarih&Saat

Aslında strftime fonksiyonunu kullanarak da türkçe tarih gösterebiliyorsunuz. Fakat bunun için sunucunun bölgesel ayarlarının türkçe olacak şekilde değiştirilmiş olması gerekiyor. Bu ayar yapılamamış olsa bile eğer sunucunuz buna izin veriyorsa PHP kodunuzun başına bir yerlere
setlocale(LC_TIME, ‘tr_TR’);
satırını ekleyerek bölgesel ayarları türkçeye uygun hale getirebilirsiniz. Test için şu php kodunu suncunuzda çalıştırınız:

setlocale(LC_TIME, 'tr_TR');
echo strftime('%A, %d. %B %Y');

Eğer ‘Salı, 05. Ocak 2010′ gibi bir sonuç alıyorsanız bu yöntemi kullanabilirsiniz.

Kaynaklar:
’strftime’ fonksiyonu
’setlocale’ fonksiyonu

Web sitesi hazırlarken sayfalarınızın tarayıcı önbelleğine alınmasını (yani cache’lenmesini) engellemenin iki temel yolu var. Birincisi HTML içerisinde meta etiketleri yazmak, ikincisi sunucu tarafında sayfanın başlığına (header) gerekli satırları eklemek. Aşağıda bu iki yöntemi bulacaksınız.

1. HTML ile sayfanızın önbelleğe alınmasını engelleme

<meta http-equiv=”Pragma” content=”No-Cache” />
<meta http-equiv=”cache-control” content=”no-cache, no store” />
<meta name=”Expires” content=”Mon, 26 Jul 1997 05:00:00 GMT” />

Yukarıdaki kodu sayfanızda <head></head> etiketleri arasında yerleştirmelisiniz. Bu yöntemin dezavantajı XML ya da RSS gibi HTML olmayan sayfalarda kullanılamayacak olmasıdır.

2. Sunucu tarafında engelleme

Ön belleğe alma işlemini sunucu tarafında engellemek için, göndereceğimiz sayfa ile birlikte bazı başlıkları (header) göndermemiz gerekiyor. PHP, ASP.NET ve JAVA/JSP için bu başlıkların nasıl yazılacağını aşağıda bulabilirsiniz. Birinci yöntemden farklı olarak bu başlıkları resimlerde dahil olmak üzere her türlü dosyayı gönderirken kullanabilirsiniz.

PHP

 header("Expires: Mon, 01 Jul 1990 05:00:00 GMT");
 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
 header("Cache-Control: no-store, no-cache, must-revalidate");
 header("Cache-Control: post-check=0, pre-check=0", false);
 header("Pragma: no-cache");

ASP.NET

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0

Yukarıdaki ASP.NET kodunu Stackoverflow’da şu sayfada buldum: Making Sure a Web Page is not Cached Across All Browsers. Denemiş değilim ama muhtemelen doğru çalışıyordur.

Java

response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", -1); //proxy seviyesinde engelleme
Kategoriler: Programlama
Tags: , , ,
devam et >

MiniAjax Kütüphanesi

18 Aralık 2009

MiniAjax 1.4kb’lık boyutuyla gerçekten mini bir javascript kütüphanesi. MiniAjax, AJAX için gerekli tüm temel fonksiyonları barındırır. Böylece basit bir AJAX yüklemesi için Prototype gibi iri kıyım kütüphanelerle uğraşmazsınız. Üstelik aşağıda da göreceğiniz gibi kullanımı da çok basit. Projenin Google Code sayfasına buradan ulaşabilirsiniz: http://code.google.com/p/miniajax/. Aşağıda türkçe çevirisini yaptığım dökümantasyonu da yine bu sayfada bulacaksınız. Dzone’daki bu sayfada da kodla ilgili ingilizce yazışmalara ve farklı kişilerin yazdığı ek fonksiyonlar bulunmakta.

Kütüphanenin Kaynak Kodu:

 function $(e){if(typeof e=='string')e=document.getElementById(e);return e};
 function collect(a,f){var n=[];for(var i=0;i&lt;a.length;i++){var v=f(a[i]);if(v!=null)n.push(v)}return n};
 
 ajax={};
 ajax.x=function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest()}}};
 ajax.serialize=function(f){var g=function(n){return f.getElementsByTagName(n)};var nv=function(e){if(e.name)return encodeURIComponent(e.name)+'='+encodeURIComponent(e.value);else return ''};var i=collect(g('input'),function(i){if((i.type!='radio'&amp;&amp;i.type!='checkbox')||i.checked)return nv(i)});var s=collect(g('select'),nv);var t=collect(g('textarea'),nv);return i.concat(s).concat(t).join('&amp;');};
 ajax.send=function(u,f,m,a){var x=ajax.x();x.open(m,u,true);x.onreadystatechange=function(){if(x.readyState==4)f(x.responseText)};if(m=='POST')x.setRequestHeader('Content-type','application/x-www-form-urlencoded');x.send(a)};
 ajax.get=function(url,func){ajax.send(url,func,'GET')};
 ajax.gets=function(url){var x=ajax.x();x.open('GET',url,false);x.send(null);return x.responseText};
 ajax.post=function(url,func,args){ajax.send(url,func,'POST',args)};
 ajax.update=function(url,elm){var e=$(elm);var f=function(r){e.innerHTML=r};ajax.get(url,f)};
 ajax.submit=function(url,elm,frm){var e=$(elm);var f=function(r){e.innerHTML=r};ajax.post(url,f,ajax.serialize(frm))};

Mini Dökümantasyon:

ajax.x
İletişim için kullanılan XMLHttpRequest Nesnesi (veya Microsoft karşılığı)

ajax.serialize(f)
f:Dökümü alınmak istenen (serialize) form nesnesi.
Bu fonksiyon belirtilen HTML <FORM> içinde bulunan tüm alanların isim=fani&soyad=madida&yas=32 şekline çevirilip karşı sayfalara gönderilebilir hale getirilmesini sağlar. ajax.submit fonksiyonu tarafından formu göndermek için kullanılır.

ajax.get(url, func)
url: verilerin gönderileceği adres. Adreste soru işareti (?) ve sonrası parametreler kullanabilir. (ör: save.php veya save.php?s=1)
func: verilerin gönderildiği sayfadan cevap geldikten sonra çağırılacak fonksiyon (callback).
GET metodu ile belirtilen url’ye parametreleri gönderir ve sonucu aldıktan sonra ‘func’ ile belirtilen fonksiyonu çağırır. Asenkron çalışır.

ajax.gets(url)
url: verilerin gönderileceği adres. Adreste soru işareti (?) ve sonrası parametreler kullanabilir. (ör: save.php veya save.php?s=1)
GET metodu ile belirtilen url’ye parametreleri gönderir, cevabı bekler ve sonucu geri döndürür. Asenkron değildir. Dolayısıyla karşıdaki sayfadan cevap gelene kadar işlemleri bekletir. Yani gerekmedikçe kullanmayın.

ajax.post(url, func, args)
url: verilerin gönderileceği adres.
func: verilerin gönderildiği sayfadan cevap geldikten sonra çağırılacak fonksiyon (callback).
args: POST metodu ile gönderilecek parametreler.  param1=deger1&param2=deger2 formatında kullanılmalıdır.
POST metodu ile belirtilen url’ye parametreleri gönderir ve sonucu aldıktan sonra ‘func’ ile belirtilen fonksiyonu çağırır. Asenkron çalışır.

ajax.update(url, elm)
url: verilerin gönderileceği adres. Adreste soru işareti (?) ve sonrası parametreler kullanabilir. (ör: save.php veya save.php?s=1)
elm: güncellenecek html elemanı (id ya da nesnenin kendisi verilmelidir).
GET metodu ile belirtilen adrese istekte bulunur. karşıdan gelen cevabı olduğu gibi belirtilen elemanın içerisine yazar.

ajax.submit(url, elm, frm)
url: verilerin gönderileceği adres.
elm: güncellenecek HTML elemanı (id ya da nesnenin kendisi verilmelidir).
frm: gönderilecek form nesnesi
Çoğunlukla <FORM> etiketinin onsubmit olayında çalıştırılacak fonksiyon. Formu sunucuya gönderir ve gelen cevabı belirtilen elemana yazar.

Kategoriler: Programlama
Tags: ,
devam et >

Etkileşimli ve çok dilli bir siteyle uğraştıysanız kullanıcı girişlerindeki aksanlı karakterleri, aksansız hale getirme ihtiyacı duymuş olabilirsiniz. Aksanlı karakterlerden kasıt ingiliz alfabesinde olmayan ğ, ş, ä gibi karakterler, aksansızlardan kasıt da bunların g, s, a gibi ingiliz alfabesinde bulunan aksansız biçimleri… Dün Wordpress’in kodlarına bakarken tam da bu işi yapan ‘remove_accents’  isimli bir fonksiyon buldum. UTF8 harici değişimler yapılan kısmını aşağıda bulabilirsiniz. Orjinal hali için: Wordpress’te wp-inlcludes/formatting.php içindeki remove_accents isimli fonksiyona bakabilirsiniz. Kod elinizde yoksa da formatting.php dosyasını online olarak görmek için buraya tıklayın.

Örnek kullanım:

echo remove_accents("ğüşıöç ĞÜŞİÖÇ äëïã ÄËÏÃ");
//çıktısı 'gusioc GUSIOC aeia AEIA' şeklinde olacaktır.

(daha fazla…)

Java ile programlama yaparken ‘String’ değerleri çeşitli sayı tiplerine çevirmek pek zor bir iş sayılmaz. Çevirmek istediğiniz sayı tipinin ‘parseXXX’ metodunu kullanarak tek satırda bu işi yapabilirsiniz (int i=Integer.parseInt(”123″)). Tabii dönüştüme yapacağınız değerin geçerli bir sayı olmama ihtimaline karşı bu işlemi ‘try…catch’ içerisine almak gerekir ve işlem birdenbire 5 satıra (ya da 3, ya da uzun tek bir satıra) çıkar (try{ i=Integer.parseInt(”123″)); }catch(Exception e){}). Bunu defalarca yapacaksanız bu iş iyice sinir bozucu hale gelir.

Aşağıda sayı çevrim işini basitçe halleden bir sınıf var. İsteğiniz sayı formatına göre ‘toInteger’, ‘toDouble’, ‘toLong’, ‘toFloat’ metotlarından birisini çağırarak dönüştürme işini yapabiliyorsunuz. Eğer isterseniz, ‘String’in uygun bir sayı olmaması durumunda (yani sayı olmayan herhangi bir metin), geçerli (default) olacak bir değeri de ikinci parametre olarak verebilirsiniz. Bu anlatımdan birşey anlamadıysanız -ki anlaşılmaması için tüm yeteneklerimi sergiledim- aşağıdaki örneklere bakıp olayı çözebilirsiniz.

Kullanım Örnekleri:

int intval=-1;
intval = NumberUtil.toInteger("123,456"); //sonuç: intval=0
intval = NumberUtil.toInteger("ahmet1", 5); //sonuç: intval=5
intval = NumberUtil.toInteger("123456", 5); //sonuç: intval=123456

Bu da sınıfımız:

public class NumberUtil {
 
	public static int toInteger(String str){
		return toInteger(str, 0);
	}
 
	public static int toInteger(String str, int defaultValue){
		int retValue = defaultValue;
		try {
			retValue=Integer.parseInt(str);
		} catch (Exception e) {	}
		return retValue;
	}
 
	public static long toLong(String str, long defaultValue){
		long retValue = defaultValue;
		try {
			retValue=Long.parseLong(str);
		} catch (Exception e) {	}
		return retValue;
	}	
 
	public static float toFloat(String str, float defaultValue){
		float retValue = defaultValue;
		try {
			retValue=Float.parseFloat(str);
		} catch (Exception e) {	}
		return retValue;
	}	
 
	public static double toDouble(String str, double defaultValue){
		double retValue = defaultValue;
		try {
			retValue=Double.parseDouble(str);
		} catch (Exception e) {	}
		return retValue;
	}
}
Kategoriler: Programlama
Tags: , ,
devam et >