RSS
 

Archive for the ‘Yazılım’ Category

PHP Tips&Tricks – 2 dizideki ortak elemanları silme

07 Feb

Merhaba,

Kusura bakmayın daha önce belirttiğim nedenlerden dolayı şuan çok yoğunum ama zaman buldukça sorularınızı yanıtlayacağım. Bazı cevapları direkt buradan yazıyorum ki herkese faydalı olsun hemde Tips-Tricks arşivimiz olsun diye :)

 

Elimizde 2 tane dizi var diyelim X ve Y diye.  Yapmak istediğimiz; X’teki diziden Y’de olan elemanlar varsa silmek.

$X = array(1,2,3,4,5,6,7,8,9);

$Y = array(1,3,5,7,9);

Kullanabileceğiniz methodlar; array_search() / array_diff() / array_intersect()’dir.

Kısaca açıklayayım;

-> array_diff($X, $Y) derseniz size 2,4,6,8 döner.

-> array_intersect($X, $Y) derseniz de 1,3,5,7,9 döner.

Bunlar işimi görmedi derseniz bizim kullanacağımız method array_search() olacaktır.


<?php
$X = array(1,2,3,4,5,6,7,8,9);
$Y = array(1,3,5,7,9);

if(is_array($X)){
   foreach($X as $k => $v){
    // X'in içinteki item'ları git tek tek Y dizinin içinde ara diyoruz.
    $existItem = array_search($v, $Y);

    // Eğer bulursan o elemanı sil diyoruz
    if($existItem !== FALSE){
      unset($Y[$existItem]);
    }
  }
  print_r($Y); # 2,4,6,8 dönmesi gerek
}
?>

array_search() metodunda extra dikkat etmeniz gereken nokta != veya == kullanmayın! Dizi index’i 0 veya 1 dönebilir. Bildiğiniz gibi IF kontrolü default olarak bool kontrol yapmaktadır ve IF için 0 => FALSE, 1+ => TRUE demek oluyor :) Bu nedenle algoritmanız yanlış çalışır.

Hala bitiremedim Android makalelerini, biliyorum bıktınız artık beklemekten ama :) en kısa sürede yayınlıycam.

İyi Çalışmalar.

 
No Comments

Posted in PHP

 

CodeIgniter Cookie Delete Problemi – Tips&Tricks

10 Jan

CodeIgniter Framework

 

 

 

Merhaba,

Proje döneminde olduğumuzdan uzun süredir üzerinde çalıştığım Android makalelerimi bitiremedim hala :) En kısa sürede tamamlıycam. Şimdi konumuza dönersek, CodeIgniter üzerinde Cookie’ler çalışmıyor v.s. gibi emailler alıyorum.

Dikkat etmeniz gerekenler;

  • Secure Cookie’mi oluşturdunuz? (secure = TRUE)
  • Path’ini farklı mı verdiniz? ( / şeklinde mi?)
  • domain’in başına nokta koydunuz mu? (Örn: .hakandamar.com) şeklinde.
  • expire değerini mutlaka integer(INT) vermelisiniz. (Örn: 86400 * 4 // 2 Haftalık Cookie)
  • prefix vermişseniz direkt verdiğiniz name değeri ile değil prefix+name değeri ile handle etmeniz gerekiyor.
  • delete_cookie() methodu ile silemiyorsanız diğer parametrelerinide vermeyi deneyiniz. (Örn: delete_cookie(“ck_fooBar”, “.hakandamar.com”, “/”) şeklinde)

Son olarak CI document’te pek detaylı açıklamadığından $this->input->delete_cookie() şeklinde kodlar geliyor. INPUT modelinde delete_cookie() methodu yok. Direkt delete_cookie() şeklinde kullanmanız gerekmektedir.

Nedir şu CodeIgniter’dan çektiğimiz? :)

İyi Çalışmalar.

 
No Comments

Posted in PHP

 

PHP & MySQL Tek Alanda Çoklu Veri Tutma – Tips&Tricks

06 Dec

Merhaba,

Başlıktanda anlayacağınız üzere bir data’nın birden çok özelliği olabilir ve bazı ID’ler ile eşizleştirilmeside gerekebilir. Nasıl yani?

Örneğin; Bir e-ticaret sistemi geliştirdiğinizi düşünün bir ürünün renk, boyut gibi özellikleri var ve bu özellikler her ürün için birden fazla olabilir. Örneğin;

* Product 1 -> Red,Blue,Green – XL,L,M,S (Tabii bu değerler sınırlı değil yarın bir gün Yellow ve XXL gibi yeni değerlerde gelebilir.)

Şimdi yukarıdaki Red,Blue,Green ve XL,L,M,S’i MySQL’deki tek bir row’da tutmak istersek bunları aralarına virgül koyup, REGEX gibi yollarla parçalayarak işlemek hataya açık şekilde tutmaktır. Her özellik için bir alan oluşturup bunlara 0 ve 1 gibi değerler ile tutmakta mantıklı değil. Çünkü yukarıda parantez içinde belirttiğim gibi yeni özellikler geldiğinde tabloyu düzenlemeniz gerekmektedir ve bir sınırıda yoktur. Yani 50 tane de olabilir bu özellikler.

Biz ise, PHP’de serialize edip bu şekilde tutacağız. Hatta bir adım ileri gidip sadece Key’leri değil bu Key’lere Value’lar verip ikisini birden işleyeceğiz.

Elimizdeki değerler;

* Product 1 Properties;

  • Red -> 20
  • Green -> 62
  • Blue -> 14
  • XL  -> 52
  • L -> 75
  • M -> 318
  • S -> 98
Şimdi bu özellikleri ve değerlerini; Özellik -> Adet şeklinde düşünelim. Hemen PHP tarafına geçiyoruz.
$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);

$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);

Şimdi array haline getirdiğimiz değerlerimizi serialize edip bir de bu haldeki çıktılarına bakalım.

  // Yukarıdaki kodların altına ekliyoruz
print(serialize($productColorArr)); 
# a:3:{s:3:"Red";i:20;s:5:"Green";i:62;s:4:"Blue";i:14;}
print("\n\r");
print(serialize($productSizeArr)); 
# a:4:{s:2:"XL";i:52;s:1:"L";i:75;s:1:"M";i:318;s:1:"S";i:98;}

Bu kodun çıktıları yanlarına eklediğim gibi olması gerekiyor. Bu işlemden sonra DB’ye insert edebiliriz. SELECT ettiğimizde UNSERIALIZE etmemiz gerekmektedir. Nasıl?


$productColorArr = array(
 "Red" => 20,
 "Green" => 62,
 "Blue" => 14
 );

$productSizeArr = array(
 "XL" => 52,
 "L" => 75,
 "M" => 318,
 "S" => 98
 );

 $srz_ProductColorArr = serialize($productColorArr);
 $srz_ProductSizeArr = serialize($productSizeArr);

 print_r(unserialize($srz_ProductColorArr));
 print("\n\r");

print_r(unserialize($srz_ProductSizeArr));

Buraya kadar güzel, peki bunları veri tabanında ne şekilde tutucaz? Bu değerleri tutacağımız color ve size adında 2 tane alanımız olsun bunların veri türü TEXT olsun. Bunların INSERT ve SELECT ettirme kısmını zaten biliyorsunuz. Peki, içlerinden bazı değerleri çıkartma veya bir key’in value’nu nasıl değiştireceğiz? İçinden çıkartmak istedikleriniz varsa aşağıdaki şekilde filtreleyebilirsiniz.


/* unserialize ettiğimiz data bize Array döndüğünden bu noktadan sonra

Array'ler üzerinde execute edebildiğimiz tüm kodları çalıştırabiliriz.

*/
<pre>$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);

$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);

$srz_ProductColorArr = serialize($productColorArr);
$srz_ProductSizeArr  = serialize($productSizeArr);

$usrz_ProductColorArr = unserialize($srz_ProductColorArr);
$usrz_ProductSizeArr = unserialize($srz_ProductSizeArr);
# Dizi içinde Red ve Blue olan key'leri filtreledik.
$filteredColor = array_diff_key($usrz_ProductColorArr, array("Red" => NULL, "Blue" => NULL));

print_r($filteredColor); # Green yazması gerek sadece.
print("\n\r");
print_r($usrz_ProductSizeArr);</pre>

Bir diğer senaryo; $productSizeArr ‘deki M key’nin değerini 18 eksiltmek istersek.

<pre>$productColorArr = array(
				"Red"   => 20,
				"Green" => 62,
				"Blue"  => 14
		);

$productSizeArr = array(
				"XL" => 52,
				"L"  => 75,
				"M"  => 318,
				"S"  => 98
		);

$srz_ProductColorArr = serialize($productColorArr);
$srz_ProductSizeArr  = serialize($productSizeArr);

$usrz_ProductColorArr = unserialize($srz_ProductColorArr);
$usrz_ProductSizeArr = unserialize($srz_ProductSizeArr);

$filteredColor = array_diff_key($usrz_ProductColorArr, array("Red" => NULL, "Blue" => NULL));

if(array_key_exists("M", $usrz_ProductSizeArr)){
	$usrz_ProductSizeArr["M"] -= 18;
	array_values($usrz_ProductSizeArr);
}

print_r($filteredColor);
print("\n\r");
print_r($usrz_ProductSizeArr);</pre>

Kodumuzun son hali yukarıdaki şekildedir. Böylece, unserialize edilmiş data üzerinde nasıl işlem yapabileceğimizide gördük.

Son bir trick olarak array_merge() methoduna bakmanızı öneririm. İki array’i birleştirerek tek bir dizi haline getirmektedir. İşinize yarabilir.

print(“İyi Çalışmalar”);

:)

 
1 Comment

Posted in MySQL, PHP

 

CodeIgniter – Memcache Object

28 Oct

Merhaba,

Memcache hakkında çok fazla detaya inmeyeceğim, zaten konumuzda direkt olarak Memcache Server değil. Özetle Memcache server, web uygulamalarında minimum seviyede I/O’ya touch etmek için, key:value şeklinde dictionary tarzın da çalışan bir caching server’dır. I/O’dan kastım HDD’dir. Peki I/O’ya touch etmiyorsa nereye yazıyor? Tahmin ettiğiniz gibi memory’ye yazmaktadır. Kurulum, konfigürasyon ve detaylı bilgi için biraz arama motorlarını kullanmanız gerekecek.

Araştırmaya buradan başlayabilirsiniz.

CodeIgniter üzerinde eğer sizde Memcached driver’nı kullanıp sinir olanlardansanız. Memcache kurup ekteki dosyayı application/libraries altına atarak kullanabilirsiniz. :)

Class’ın yapısı driver interface’i ile uyumludur, ilk driver olarak geliştirdim fakat sonra load problemi çıkarttığını gördüğümden library olarak ekledim. Siz “extends CI_Driver” diyerek Driver olarakta kullanabilirsiniz.

   Dosya yapısı: application/libraries/MEMCACHE

   Dosya adı: cacheserver.php

   Methodları ve açıklamaları;

public function __construct() - Memcache object’si create ediliyor ve başarılı bir şekilde oluşturulamazsa Exception fırlatıyor :)

public function get($id)Daha önceden cache’lediğiniz datayı geri döner.

public function save($id, $data, $ttl = 90, $flag = MEMCACHE_COMPRESSED)Yeni bir datayı cache’lemenizi sağlar.

public function delete($id)Mevcut bir data’yı cache memory’den silmenizi sağlar.

public function replace($id, $data, $ttl = 90, $flag = MEMCACHE_COMPRESSED)Mevcut bir datayı değiştirmenize yarar.

public function clean()Tüm cache memory’yi boşaltmaya yarar. *Dikkat ediniz!

public function cache_info($type = NULL)Cache’lenen datalar ile ilgili istatikleri ve bilgileri geri döner.

public function get_metadata($id)Bu method henüz kullanmadığından içini doldurmadım. Sürekli FALSE döner. :)

public function is_supported()Sisteminizde Memcache eklentisinin kurulu olup olmadığını check eder ve bool geri döner.

Basit bir örnek;

Kendi Controller’nız içerisinde $this->load->library(“MEMCACHE/CacheServer”, NULL, “CacheServer”); şeklinde object’i call edebilirsiniz.

    $fooString = "Bu cache'lenecek bir veridir!";
    if(!$this->CacheServer->get("c_fooStr")){
       $this->CacheServer->save("c_fooStr", $fooString, 5);
       print("Cache'lendi!");
    }else{
       print($this->CacheServer->get("c_fooStr");
       print("Zaten Cache'teydi!");
    }

Yukarıdaki kod 5 saniye boyunca $fooString değişkenini cache’leyecektir. Diğer methodlarıda siz deneyerek test edebilirsiniz. :)

Download Link: http://www.hakandamar.com/down/CI_MEMCACHE_DRIVER.rar

İyi Çalışmalar.

 
1 Comment

Posted in PHP

 

PHP Printing With LPR

13 Apr

Merhaba,

Son zamanlardaki yoğunluğumdan malesef pek makale yazacak zaman bulamıyorum. :) İnternette çok geyiği dönenen ve olmayacağına dair üzerinde sayfalarca tartışılan bir işlemi gerçekleştiricez şimdi. :)

Normalde sizinde bildiğiniz gibi PHP, ASP, Python v.s. gibi diller server-side çalışan ve bir interpreter’a ve/veya compiler’a bağlı olan dillerdir. Hal böyle oluncada O/S’a müdahelede kısıtlı oluyor. Sanırım PHP’yi geliştiren ekip bunuda düşünerek server üzerinde konsoldan komut çalıştırır gibi komut çalıştırabileceğimiz system(), exec() gibi bazı method’lar hazırlamışlar.

Bu makalenin konusu olan LPR(Line Printer Remote) protokolü de ismi üzerinde Line printing işlemi için hazırlanmış. Yani  komut satırından kod çalıştırarak yazıcılarımızı yönetebiliyoruz.
Madem PHP ile komut satırında kod çalıştırabiliyoruz ve LPR denen bir protokolde bize komut satırından yazıcıları yönetmemize izin veriyor. O zaman PHP ile direkt yazıcıdan çıktı alırız diyebiliriz. Hatta bir adım öteye giderek printer failover senoryalarına karşı object’ler yazıp CRON’lar ile sistemi otomatize edebiliriz, ki bu senoryayu ben daha önce gerçeklemiştim.

Windows tarafında Turn Windows features on or off(Windows Özelliklerini Aç veya Kapat) seçeneklerinden Print and Document Services(Yazdırma ve Döküman Servisleri) kısmından aşağıdaki servislerin yanındaki check işaretini checked yapmanız gerekiyor.

  • LPD Print Service
  • LPR Port Monitor

Linux (Ubuntu, Debian etc.) kısmı içinde aşağıdaki şekilde LPR’ı kurabilirsiniz.

sudo apt-get install lpr

Kurulum yaptıktan sonra ikisininde help dökümantasyonundan basitçe parametre sistemini çözebilirsiniz. Örneğin; Windows tarafı için bakarsak aşağıdaki şekilde bir ekran çıktısı olması gerekmektedir.

Windows 7 LPR CMD

Windows 7 x64 Enterprise Edition ENG kullanıyorum ve problemsiz çalışıyor.

Tabii Windows üzerinde LPR kurduğumuzda direkt çalışmıyor, virtual LPR printer oluşturup eklememiz gerekiyor. Bunun için internette bir sürü kaynak var fakat sizi uğraştırmak istemiyorum. :) Makale bütünlüğünü korumak adına aşağıda stepleri takip ederek kurabilirsiniz. Farklı bir kaynak istersenizde TechNET’teki şu link’e bakabilirsiniz: http://technet.microsoft.com/en-us/library/cc732063.aspx

Start->Control Panel->System and Security->Administrative Tools–|>Printer Management ‘a ulaştığımızda, Sol taraftaki menu list’ten Print Servers’ın altında kendi PC-Adınız’ı açın ve Ports kısmına tıklayın. Karşınıza aşağıdaki bir sayfa gelicek burada sağ tıklayıp Add Port demeniz gerekmektedir.

Windows 7 LPR Port

Bu aşamadan sonra karşınıza aşağıdaki gibi bir pencere çıkacak ve LPR Port’u seçip New Port demelisiniz. İlk alana IP’yi ikinci alana yazıcı kuyruk adını girmelisiniz.

Windows 7 LPR New Port

Bu aşamadan sonra Start->Devices and Printers kısmından yazıcılarınıza basit isimler vermelisiniz. Örneğin HP X1230 ML Express gibi bir isim varsa bunun yerine sadece HP veya HP1230 yazmanız komut satırından ulaşırken hata yapma şansınızı azaltacaktır.

Daha sonra yine sol taraftaki menüden Printers’ı seçip açılan sayfada boş bir yere sağ tıklayıp Add Printer dediğimizde karşımıza gelen pencereden Add a new printer using an existing port’u seçip sağ tarafındaki selectbox’tan daha önce oluşturduğumuz 10.70.1.99:queue1 portunu seçip Next diyelim. Daha sonra bu porttan erişeceği printer’ın driver’nı soracaktır. Bir sonraki adımda sizden yazıcı adını soracaktır, bu isme basit bir isim koymanızı öneririm. Çünkü komut satırına bu adı yazacağız.  Next/Next diyerek işlemleri bitirelim.

Şimdi Windows üzerinde Virtual LPR portu üzerinden erişilebilen bir yazıcımız oldu. Şimdi komut satırından LPR ile yazıcıya birşeyler gönderip test edelim. Yeni sanal yazıcı eklersen XEROX yazdığınızı varsayarsak komutunuz aşağıdaki şekilde olması gerekmektedir.

lpr -S 10.70.1.99 -P XEROX -d “Hello World”

Bu komut yazıcıya tahmin ettiğiniz gibi Hello World yazdırtacaktır. Bunun yerine bir hello_world.txt ‘de verebilirdik. O zamanda tahmin ettiğiniz gibi bu dosyanın içeriğini yazardı. Dosya ismi verirken o Path’te olduğunuza veya tam path yazdığınıza dikkat ediniz.

Şimdi sıra geldi sora PHP’den bu işlemi nasıl yapacağımıza;

Örnek senorya için fatura bastırmanız gerektiğini varsayalım. Eğer faturaların file şeklinde kayıtlı durmasını isterseniz ki önermiyorum, o zaman /invoice diye bir dizine pdf etc. tarzında kaydettikten sonra Fatura bastır dendiğinde tahmin ettiğiniz gibi system() veya exec() method’ları ile yukarıdaki LPR komutunu dinamik oluşturup gönderebilirsiniz. Komutun sonunda bulunan “Hello World” yerine $invoicePath gibi içerisinde faturanın full path’nin tutulduğu bir değişken gelmesi gerekmektedir.

Diğer bir durumda temp dizininde oluşturup yazdırma işlemi sonrası silmek en iyisi bence. Bunun içinde PHP’deki tempnam() methodunu kullanmamız gerekmektedir.

 <?php
        $invoice  = "Faturanın bilgileri/full path bu değişkende olacak.";
        $tmpFile = tempnam(sys_get_temp_dir(), "invoice_");
        system("lpr -S 10.70.1.99 -P XEROX -d $invoice", $returnArgs);
        unlink($tmpFile);
 ?>

Eğer HDD’e faturayı bastırmak istiyorsanızda 2. satırdaki $tmpFile’dan sonra fopen(), fwrite() ile dosyayı yazıp daha sonra dosyayı oluşturduğunuz path’ı system’deki LPR string’ne verip işlemi tamamlayabilirsiniz. Fakat bu seçenekte unlink() methodunu yorum satırına almayı veya kaldırmayı unutmayınız.

Çok fazla zamanım olmadığından fazla detaya inemedim bu makalede, ilk zaman bulduğumda güncelleyip. Cluster Printing, Failover etc kısımlarınıda nasıl gerçekleyeceğinizi açıklamaya çalışacağım.

İyi Çalışmalar.

 
1 Comment

Posted in PHP

 

Java Programlama Diline Giriş

27 Nov

Merhaba,

Bu makalede güçlü programlama dillerinden Java’ya giriş yapacağız. (Aynı zamanda bence en iyi OOP ve AOP programlama dilidir.)  Tabii ki Java dili ile uğraşmaya başlamadan, bu alana özgü bazı terimler var. Bunları öğrenerek ilerlersek ileride mantık kurmada zorlanmayız. Nedir bu terimler?

  • JDK (Java Development Kit / Java Geliştirme Kiti)
  • JRE (Java Runtime Environment / Java Çalışma Ortamı)
  • JVM (Java Virtual Machine / Java Sanal Makinesi)
  • J2SE, J2ME, J2EE

JDK Nedir?

Yazdığımız kodların derleyip, çalıştırmaya yarayan ve bir takım kütüphaneleri içeren bir program paketidir. 2002 yılında Java2′nin çıkması ile Sun Microsystems Java’yı farklı alt gruplara ayırarak dahada güçlendirmeye ve her alanda uzmanlaşarak büyümeyi hedefledi ve bunuda başardı. Bu gruplama aşağıdaki şekilde oldu;

  • J2SE (Standart Edition): Desktop, Network ve temel düzeyde Database işlemlerimizi yapmamızı sağlayan sınıfların bulunduğu sürümüdür.
  • J2ME (Mobile Edition): Bu sürüm cep telefonları ve kısıtlı kaynaklara sahip mikro mimariler üzerinde uygulama geliştirmemize yardımcı olan sınıfları içeren sürümüdür.
  • J2EE (Enterprise Edition): Multi-Layer Commercial Web Server Application geliştirmemiz için olan sürümüdür.

JRE Nedir?

Daha önce Microsoft teknolojilerini kullanarak uygulama geliştirdiyseniz JRE’yi .NET Framework gibi düşünebilirsiniz. Örneğin: .NET FW 4 ile geliştirdiğiniz bir C# uygulamasının çalışabilmesi için PC’nizde .NET FW 4.0′ın yüklü olması gerektiği gibi Java içinde JRE’nin yüklü olması gerekmektedir. JRE ana görevi olarak Java programlarını çalıştırmakla görevlidir. JRE, JDK gibi kod derleyemez veya debug yapamaz. JRE’nin tek görevi kodları çalıştırır ve runtime’da uygulamanın ihtiyaç duyduğu java class’larını sağlar. JRE ve JDK ikileminde dikkat edilmesi gereken nokta; JDK 1.4 ile geliştirilmiş bir program JRE 1.3 ile çalışmayacak ama JDK 1.5 ile yazdığınız bir program JRE 1.6 ile çalışacaktır. Buradan anlaşıldığı üzere JRE’nin geriye yönelik desteğini vardır fakat JDK’nın geriye dönük desteği bulunmamaktadır. Eğer makinenizde JDK yüklü ise ekstradan bir de JRE yüklemenize gerek yoktur. JDK tam bir kit olduğundan içerisinde uygun JRE(ler)’i barındırır.

JVM Nedir?

Java’nın en güçlü yanlarından birini JVM oluşturur. Belki internette araştırma yaparken karşılaşmışsınızdır. Java kodu 1 kez yazılır ve her ortamda çalışır. İşte Java’daki bu esnek kod taşınabilirliği sağlayan JVM’dir. JVM’in görevi Java App.’larınızı derledikten(Compile) sonra bytecode’ları yorumlayıp(Interpretation) binary code’a çevirilmesini sağlayan bileşendir. Sizinde tahmin ettiğiniz gibi gibi tabii ki bu işlemi yaparken üzerinde çalıştığı CPU mimarisine uygun şekilde dönüştürmektedir. Daha öncede bahsettiğim gibi JDK tam bir kittir bu nedenle JVM’de içerisinde gelmektedir.

Microsoft tarafında daha önce geliştirme yaptıysanız bunu C#.NET’ten örnekleyelim; .NET’te nasıl kodlar derlendiğinde bir ara dile yani IL’e çevrilip daha sonra makine diline dönüştürülüyorsa Java’da da bytecode’a dönüştürülür ve bu bytecode JVM içindir. Kısacası Java’daki ByteCode = .NET’teki IL (Intermediate Language)’dir. Bu nedenle .NET dillerinden her hangi biri ile yazılmış bir object diğer bir .NET dilinde de kullanılabilir. Neyse yeterince Microsoft hakkında konuştuk, tekrar Java dünyasına dönelim.  JVM compile edip bytecode haline çevrilmiş kodları, üzerinde çalıştırılacak OS için compile ederken JRE’ye başvurarak gerekli class’ları ister ve bu sayede o işletim sistemine özgün kodu oluşturup programı çalıştırır.

Java programlamaya başlamadan önce bilinmesi gereken en temel kavramları yukarıda öğrendik. Şimdi biraz Java dilinden bahsedelim. Java diğer programlama dilleri gibi sizi sabit 1/2 seçeneğe zorlayarak uygulama geliştirmeye yönlendirmez. Bunun yerine farklı bir çok Framework ve Web Server kullanarak istediğiniz gibi geliştirme özgürlüğü sunar. Örneğin bir .NET programcısı iseniz web programlama yapmak isteseniz PHP veya Python kullanmak yerine ASP.NET’i tercih edeceğinizi biliyorum. :) Bu nedenlede hemen size sadece IIS üzerinde çalışabileceğinizi hatırlatmak isterim. Java’da ise ücretli veya ücretsiz isteğinize ve gerekliliğe göre seçebileceğiniz bir çok web server bulunmaktadır. Bunun yanında yine Microsoft tarafında WPF uygulamaları için mutlaka XAML kullanmanız gerekiyor JSON ile geliştireyim veya daha kolay farklı bir çözümü yok mu? gibi bir soru, eğer uzun süredir Microsoft teknolojileri ile çalışıyorsanız aklınıza gelmemesi büyük ihtimalle normaldir. :)

Hep Microsoft’tan örnek verdim beni MS düşmanı sanmayın sadece bariz gerçekleri yüksek sesle düşündüm. :) Yoksa MS’i seviyoruz tabii, teknolojinin ve bir çok sektörün gelişmesinde varlığı bile yeterli oluyor. :)

Bu aşamadan sonra size JDK kurmayı ve basic ayarları göstermem gerek fakat bunlara internet üzerinde 1001 farklı kaynaktan erişebilirsiniz hemen hemen bir çok kişi zaten giriş ve kurulum ile ilgili bir şeyler yazıyorlar önemli olanın bundan sonrası olduğunu düşünerek bu kısmı internetten farklı kaynaklardan araştırmanızı rica ediyorum. Maximum 15dk’nızı alacak bir konudu ve işlemdir.

Kurulumu yaptığınızı varsayarak devam ediyorum ve bu aşamadan sonra aklınıza gelen ilk soruyu hemen yanıtlayayım.

- Tamam temel bilgiyi öğrendik, JDK’da kurduk. Şimdi nerde yazıcaz Java kodlarını?

Bunun için ücretli ve ücretsiz bir çok seçeneğiniz var fakat piyasada en çok rabet gören ve kaliteli olarak nitelendirilen benimde incelediğim 3 adet IDE var.

  1. Eclipse
  2. JBuilder
  3. Netbeans

Ben  evde Netbeans, işte Eclipse kullanıyorum fakat size hangisi daha uygun gelirse onu tercih edebilirsiniz. Yazdıklarımın hepsi ücretsizdir.

Şimdi hemen bir Hello World uygulaması yazarak ilk programımızı hazırlayalım. IDE’lerinizden File->New Project->Java Application seçeneğini veya benzerini bularak Create derseniz aynı ekrana sizlerde ulaşabilirsiniz.

 public class helloWorld{
  public static void main(Strings[] args){
    System.out.println("Hello Java World");
 }
}

Bu programı run ettiğinizde çıktısı tahmin ettiğiniz gibi “Hello Java World” olacaktır.

Başlangıç konuları az kod çok yazı olduğundan devamını birleştirerek okumadan önce 2 kere düşüneceğiniz uzunlukta makaleler yazarak sizleri sıkmak istemiyorum. Bir sonraki makalede veri türlerinden devam edeceğiz.

System.out.println(” İyi Çalışmalar :) “);

 
1 Comment

Posted in JAVA

 

PHP Cephesindeki Son Gelişmeler

29 Jul

Merhaba,

Bildiğiniz gibi bir süredir PHP 6′nın gelmesini dört gözle bekliyorum fakat iptal edildiğine dair bilgiler aldım. Yerine PHP 5.4 sürümünü yayınlayacaklarmış ve APC gibi özellikler 5.4 ile yine sunulacakmış. Eğer 6′da ekleyeceklerini söyledikleri özelliklerin %40′nı 5.4′te sunarlarsa bence sorun yok. :) Zaten APC’nin core’un içine gömülmesi bence en güzel özelliklerden biri :)

Bu arada PHP 5.3.3 versiyonu release edildi. OOP tarafındaki geriye dönük desteklemede bir değişiklik yapmışlar. Namespace kullanıyorsanız, eskiden object’in aynı isminde bir method create ettiğimizde class bunu kendi construction metodu gibi görüyordu fakat artık normal sıradan bir method gibi ele alarak interpreter’a sunacakmış. Eğer namespace kullanmıyorsanız yine __construct() metodu olarak call edecektir ki kullandığınızı umuyorum. :) 100′den fazla bug’u fixlemişler. XML-RPC’deki Null Pointer problemide fixlenmiş. Tüm listeyi incelemek isterseniz buraya tıklayabilirsiniz.

Türkiye’ye döndüğümde ilk fırsat bulduğum anda uzun bir makale yazmayı planlıyorum. :)

Saygılarımla.

 
2 Comments

Posted in PHP

 

Singleton Pattern

08 Apr

Merhaba Arkadaşlar,

Bu makalemde Creational desenlerden olan Singleton Pattern’ı inceleyeceğiz. Design Pattern’lar arasında en kolayı diyebiliriz.

Kısaca Tasarım Desenleri; Dünyanın farklı yerlerinde programcılar tarafından belirli bir soruna çözüm getirmek amacı ile oluşturulmuş yazılım kalıplarıdır. Dil bağımsızdır. Her hangi bir dilde yazılmış Design Pattern örneğini siz kendi kullandığınız dildede uygulayabilirsiniz.

Singleton Pattern ise object’mizin runtime da tekil olmasını sağlamaktadır. Bu da object’nin bir kere oluşturulup, istediğimiz kadar kullanmamızı sağlıyor. Böylece hem hız kazanıyoruz hem de memory alanından tasarruf etmiş oluyoruz. Data Access Layer’da uygulanabilir bir pattern’dır. Hemen bir örnek ile açıklayalım.

<?php
namespace Patterns{
	final class SingletonPattern{

		private static $object;

		private function __construct(){

		}
		public static function getObject(){
			if(!isset(self::$object)){
				$cls = __CLASS__;
				self::$object = new $cls;
				print("Oluşturdum!<br/>");
			}
			print("Zaten Vardım!<br/>");
			return self::$object;
		}
	}
}

namespace {

	$class  =& \Patterns\SingletonPattern::getObject();
	$class1 =& \Patterns\SingletonPattern::getObject();
	$class2 =& \Patterns\SingletonPattern::getObject();
	$class3 =& \Patterns\SingletonPattern::getObject();
	$class4 =& \Patterns\SingletonPattern::getObject();

	//$class = new \Patterns\SingletonPattern();
}
?>

Ben bir metoda bağlayarak çağırdım siz public static bir instance yaratıp bunun üzerindende nesneyi temsil edebilirsiniz. Nesnemiz new ile yaratılmasını önlemek içinde nesnenin construction(yapıcı metod)’nı private olarak değiştirdik. Böylece eğer yorum satırına aldığım kodu çalıştırmayı denerse biri FATAL ERROR dönecektir.

Kod çalıştığında 1 kez “Oluşturdum!” ve 4 kez “Zaten Vardım!” yazması gerekiyor. Buradanda şunu anlıyoruz 1 kere nesne oluşturulmuş ve diğer 4 nesne oluşturma girişimlerinde daha önceden oluşturulup RAM’e yüklenmiş olan object bize verildi.

Konu hakkında biraz daha bilgi isterseniz http://phpnedir.net/Page_singletonPattern.do buradaki kısa yazımı okuyabilirsiniz.

İyi Çalışmalar.

 

Google URL Kısaltma Servisi

08 Mar

Merhaba,

Google’un URL kısaltma servisini kullanmak istiyorsanız aşağıdaki şekilde gerçekleştirebilirsiniz.

<?php
namespace webServices{
	class GoogleURL{

		private static $url;

		public function __construct(){}
		public function __destruct(){}

		public function _get(){
			define("serviceURL","http://ggl-shortener.appspot.com/?url=");
			$url      = serviceURL.urlencode(self::$url);
			$request  = file_get_contents($url);
			$response = (array)json_decode($request);
			$result = "<a href='".$response["short_url"]."' target='_blank'>".$response["short_url"]."</a>";
			return $result;

		}

		public function _set($longURL){
			self::$url = $longURL;
		}
	}
}
?>

Kullanımı;

namespace {
	$shortURL = new \webServices\GoogleURL();
	$shortURL->_set("http://www.hakandamar.com");
	print($shortURL->_get());  //http://goo.gl/7aVg
}

Çıktı olarak yeni bir Tab/Pencere ‘de açılan HTML link kontrolü döner. Link’e göre orjinal URL’e ulaşmakta mümkündür.

İyi Çalışmalar.

 
4 Comments

Posted in PHP

 

Gelişmiş TC Kimlik No Algoritma Kontrolü

08 Mar

Merhaba,

Bildğiniz üzere TC kimlik no sorgulama web servisi açıldıktan bir süre sonra paralı olarak hizmet vermeye başladı. Eğer kullanıcılardan alacağımız TC kimlik no bizim için önemli ise bunun kontrolünü gerçekleştirmemiz gerekmektedir. Bu object ile girilen TC kimlik numarasının algoritmasını kontrol ederek, en azından geçerli bir TC kimlik no mu? değil mi? bunu bilebiliriz.

Eğer web servisi hizmeti alıyorsanız bile geçersiz sorgu istekleri ile ekstra ücret ödemek istemiyorsanız, sorguyu web servisine göndermeden önce bu object ile algoritmasını kontrol etmenizi tavsiye ederim.

TC Kimlik No Controller Object v0.1;

<?php
/**
 * Tc Kimlik No Algoritma Kontrolü
 * @author Hakan DAMAR
 * @link http://www.hakandamar.com
 */
namespace Securty{

	class Controller{

		private static $tcNo;
		protected $errCount;

		public function __construct(){
			// maybe use later...
		}

		protected function _tcNoCheck(){
			//Default Error Counter
			$this->errCount = 0;

			// For Controller
			$isDouble = is_double(self::$tcNo);
			$size     = strlen(self::$tcNo);
			$type     = gettype(self::$tcNo);

			// First Controller
			if(self::$tcNo == "" || self::$tcNo == null || self::$tcNo == 0){
				$this->errCount = 5;
			}else if($size != 11 && $type != "integer"){
				// Data Type Size Controller
				$this->errCount = 1;
			}else if($type == "integer"){
				// Type convert controller
				$this->errCount = 3;
			}else if($isDouble != true) {
				// Data Type Controller
				$this->errCount = 2;
			}else{
				// TC NO's
				$tc1;$tc2;$tc3;$tc4;$tc5;$tc6;
				$tc7;$tc8;$tc9;$tc10;$tc11;

				$tc1 = substr(self::$tcNo,0,1);
				$tc2 = substr(self::$tcNo,1,1);
				$tc3 = substr(self::$tcNo,2,1);
				$tc4 = substr(self::$tcNo,3,1);
				$tc5 = substr(self::$tcNo,4,1);
				$tc6 = substr(self::$tcNo,5,1);
				$tc7 = substr(self::$tcNo,6,1);
				$tc8 = substr(self::$tcNo,7,1);
				$tc9 = substr(self::$tcNo,8,1);
				$tc10 = substr(self::$tcNo,9,1);
				$tc11 = substr(self::$tcNo,10,1);

				//First Algo. Checks
				$algoCheck1 = (($tc1 + $tc3 + $tc5 + $tc7 + $tc9) * 7);
				$algoCheck2 = abs(((($tc2 + $tc4 + $tc6 + $tc8) - $algoCheck1) % 10));
				$algoCheck3 = (($tc1 + $tc2 + $tc3 + $tc4 + $tc5 + $tc6 + $tc7 + $tc8 + $tc9 + $tc10) % 10); 

				if($algoCheck2 != $tc10){
					$this->errCount = 4;
				}

				if($algoCheck3 != $tc11){
					$this->errCount = 4;
				}
			}

			// Error Controller
			$errControl = self::errorHandler($this->errCount);
			if($errControl != 200){ // 200 HTTP OK!
				print($errControl);
				exit;
			}else{
				$result = "<font color='green' size='+2'><b>GEÇERLİ T.C. Kimlik No.</b></font>";
				//$result = true;
				return $result;
			}

		}

		protected function errorHandler(){
			$errID = $this->errCount;
			switch ($errID) {
				case 0:
					$err = 200;
					break;
				case 1:
					$err = "<font color='red' size='+3'><b>T.C. kimlik no 11 haneli olmak zorundadır!</b></font>";
					break;
				case 2:
					$err = "<font color='red' size='+3'><b>T.C. kimlik no sadece sayısal girilmelidir!</b></font>";
					break;
				case 3:
					$err = "<font color='red' size='+3'><b>T.C. kimlik no 0(sıfır) ile başlayamaz ve 11 hane olmak zorundadır!</b></font>";
					break;
				case 4:
					$err = "<font color='red' size='+3'><b>Geçersiz T.C. kimlik no!!!</b></font>";
					break;
				case 5:
					$err = "<font color='red' size='+3'><b>Bu alan boş bırakılamaz!</b></font>";
					break;
				default:
					throw new Exception("<font color='red' size='+3'><b>Beklenmedik bir hata meydana geldi!</b></font>");
				break;
			}
			return $err;
		}

		public function _get(){
			return self::_tcNoCheck();
		}

		public function _set($tcNo){
			self::$tcNo = $tcNo;
		}
	}
}
?>

Kullanımı;

namespace {

	$tcController = new \Securty\Controller();
	$tcController->_set(92108806946);
	print($tcController->_get());

}

Bir kontrol için bu kadar çok kod olması gözünüzü korkutmasın.
1 kontrolü benim pc’im de 0.2ms’de gerçekleştiriyor.
Söz konusu bir server olunca bu süre dahada kısalacaktır.

İyi Çalışmalar.

 
8 Comments

Posted in PHP