29 Nisan 2012 Pazar

Symfony2- FOSFacebook - Facebook needs the CURL PHP Extension Hatasi

Symfony2'de FOSFaceBookBundle yüklemesi yaptıktan sonra, herhangi bir konsol komutu çağırmaya çalıştığımda aşağıdaki hatayı alıyordum.
[Exception] Facebook needs the CURL PHP extension.
Biraz araştırdığımda, WAMP gibi 3'ü bir yerde kurulumlarda Apache tarafından kullanılan php.ini dosyası ile konsoldan aşağıdaki şekilde çağırdığımız php komutunun farklı php.ini dosyası kullandığını öğrendim.
php app/console container:debug
Yani wamp'ın menüsünü kullanarak curl uzantısını aktifleştirseniz bile aslında konsoldan çağrılan php programının kullandığı php.ini değişmiyor. WAMP için örnek vermek gerekirse, C:\wamp\bin\php\php5.3.8 klasöründeki php.ini dosyasını şu şekilde düzenlemek gerekiyor:
;extension=php_curl.dll
extension=php_curl.dll
Devamı için : Symfony2- FOSFacebook - Facebook needs the CURL PHP Extension Hatasi

winsat.exe yi kapatmak

Winsat exe, windows 7 de performans ölçen bir programdır. Bilgisayarım'a sağ tıklayıp özellikler kısmından manual olarak çalıştırabilceğiniz bu program, varsayılan olarak bir görev zamanlayıcıya bğalı olarak da çalışmaktadır. Donanımınızda bir değişiklik vb yaptıysanız da, bu otomatik çalıştırıcı devreye girer (pazar günler gece saat 1.00 a programlanmıştır) çalışır, birden bir virüs gibi tüm bilgisayarınızın kaynaklarını kullanarak sizi tedirgin edebilir. Bunun otomatik açılmasını kapatmak için de aşağıdaki işlemleri yapabilirsiniz. 1-) Denetim masasına girip , "Görüntüleme Ölçütü" 'ne basıp "Büyük Simgeler" 'i seçip " Yönetimsel Araçlar" 'a tıklayın. 2-) Gelen menüde , "Görev Zamanlayıcı" 'ya çift tıklayın. 3-) Açılan pencerede sol taraftaki "Görev Zamanlayıcı Kitaplığı" 'na çift tıklayıp "Microsoft => Windows => Maintenance" seçeneğine tıklayın. Üstte , "WinSAT" 'ı göreceksiniz. Sağ tıklayıp , devre dışı bırakın. kaynak donanimhaber. Devamı için : winsat.exe yi kapatmak

26 Nisan 2012 Perşembe

Multi Tab Putty - MtPutty

Eğer SSH ile haşır neşirseniz, windows ortamında büyük ihtimalle putty kullanıyorsunuzdur. Putty, güzel güçlü bir ssh ,telnet programıdır. Ama 1'den çok sunucuyla sürekli haşır neşirseniz veya monitör ediyorsanız, 40 tane putty ekranında çalışmanız pek de kolay değil. Benim de bu şekildeydi. Sonrasında bunları tek bir programda toplayan bir program keşfettim. MtPutty.

MtPutty Nedir?

http://www.ttyplus.com/multi-tabbed-putty/ linkinden indireceğiniz program ile birlikte, normal putty.exe nizi ilk açılışta göstererek, tıpkı filezilladaki tab mantığı gibi , sizin de artık serverlarınızı tek bir yerden yönetebileceğiniz bir programınız olmuş oluyor. Çoklu tab yapısı ile hangi serverdasınız, ne işlem yapıyorsunuz daha kolay takip ediyor, hepsine tek tek login olma olaylarını da otomatize edebiliyorsunuz. Bunun yanında server'larınızı sadece putty session'ları halinde saklamadan, programın kendi basit veritabanına da ekleyebiliyorsunuz, açılışta otomatik komut göndertebiliyorsunuz. Kısacası putty'nizi yöneten bir ana programınız olmuş oluyor. İhtiyacı olana tavsiye ederim. Devamı için : Multi Tab Putty - MtPutty

24 Nisan 2012 Salı

windows 7 de onbellege alinmis bellegi bosaltmak - virtualBox host memoryLow hatasi

Windows 7 görev yöneticisine girip baktığımızda, performans tabı altında, Ram kullanımlarını görüyoruz. burada kullanılan, önbelleğe alınan (cached), boş, ve kullanılan ram miktarları görülüyor. bende buradaki boş memor 40 MB a kadar indi. Tabi buna bir de VirtualBoxın windows 7 ile tam uyumlu olmaması ekleneince, önbellekteki rami'i de kullanamayıp, başlıkta adı geçen host memory low hatassı verip, virtual makineyi aniden durduruyordu. yaklaşık 3 saat aradım ve http://technet.microsoft.com/en-us/sysinternals/ff700229 bu linkteli microsoft lanet programını buldum. ve oradan Beklemede olan rami temizle seçeneği ile önbelleğe alınmış ramlerimi hayatıma geri kazandırdım. Trajikomik bir mutluluk içerisindeyim, benim gibi 3 saat uğraşan varsa, buyursun buradan indirsin kullansın. ara ara çalıştırın. amin. Devamı için : windows 7 de onbellege alinmis bellegi bosaltmak - virtualBox host memoryLow hatasi

23 Nisan 2012 Pazartesi

php magic methods

Php de bulunan özelliklerden biri de php magic methods. (Kendiliğinden çalışan da diyebiliriz türkçe olarak.)

Ne İşe Yarar Bu Magic Metodlar?

Magic metodlar, Class seviyesinde çalışan metodlardır. Örneğin aşağıdaki örnek için $deneme = new Deneme(); yazdığımızda Deneme sınıfındaki __construct magic metodu çalışır. Tıpkı bunun gibi, classta olmayan bir metodu çağırdığınızda __call() metodu çağrılır.
  class Deneme {                  public function __construct(){                          //                       }  }   
Php 5.3 itibariyle destek verdiği magic metodları listeleyelim.

php 5.3 magic methods

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone()

__construct() :

Yukarıda da bahsettiğim gibi $deneme = new Deneme(); yazdığımızda ilk olarak çalışan metoddur. __construct metoduna parametre göndermek istiyorsak
$deneme = new Deneme($param1, $param2, ..);
şeklinde yapabiliriz. Tercihe bağlı olarak sınıf için bir nesne yarattığımızda, gerekli tanımlama (define) işlemleri, bağlantı kurma (örneğin veritabanı bağlantısı, ya da dosya açma) metodlarını çalıştırma, gibi işlemler için kullanılır. Önemli olan bir nokta, __construct metodumuzu private ya da protected olarak değil public olarak tanımlamamız gerekir.

__destruct() :

Bu metod adından da açıkca belli olduğu üzere __construct metodunun aksine sınıf için nesne yaratıldığında değil değil sınıf sonlanırken çalışır. Sınıf sonlanırkenden kastım, sınıf içinde kullandığımız nesneleri unset(); ederken, veritabanı ile bağlantıyı kapatırken, ya da kullandığımız dosyayı kapatırken, log tutarken (Deneme sınıfı çalıştı, şu şu işlemler yapıldı, şu nesneler yok edildi) vb. işlemler için kullanılabilir.

Method Aşırı yükleme (Method Overloading)

__call() :

Erişilemeyen metod (ya da olmayan metod) nesne tarzında çağırıldıysa, __call metodu çalışır.

__callStatic() :

Erişilemeyen metod (ya da olmayan metod) statik tarzında çağırıldıysa __callStatic metodu çalışır. Deneme sınıfımız üzerinden örnek verecek olursam;
class Deneme{  	public function __call($name, $arguments){  		echo "$name metodu nesne olarak, şu parametelerle çalıştırılmak istendi: ".implode(',', $arguments);  	}    	public function __callStatic($name, $arguments){  		echo "$name metodu statik olarak,şu parametelerle çalıştırılmak istendi: ".implode(',', $arguments);   	}    }
Görüldüğü gibi iki metod da 2 parametre alıyor. İlki çalıştırılmak istenen metod ismi, ikincisi metod çağırılırken gönderilen parametreler. Yani biz sınıf dışından tanımlı olmayan, ya da tanımlı olup erişemediğimiz bir yerden, exec(); metodunu $deneme->exec("admin", 5); şeklinde çalıştırmak istersek __call metodu, Deneme::exec("admin", 5); şeklinde çalıştırmak istersek __callStatic metodu çalışır.

Aşırı yükleme (Overloading)

Overloading, dinamik olarak özellik ya da metod yaratmak anlamına gelir. Bu özellikleri ya da metodları kullanırken de magic metodlar üzerinden işlem yaparız. Örnek olarak Deneme sınıfının içerisinde bu metodları kullanıp daha sonra açıklamasını yapayım.
class Deneme{    	/*Overload verileri burada topluyoruz*/  	private $_data = array();    	public $length = 25;    	private $width = 20;    	public function __set($name, $value){  		echo "$name ozelligine $value degeri ataniyor\n";  		$this->_data[$name] = $value;  	}    	public function __get($name){    		if (array_key_exists($name, $this->_data)) {  			echo "$name ozelliginin degeri istendi: ";		  			return $this->_data[$name];          	}    		echo "__get ile tanimsiz ozellik istendi";          return null;  	}    	public function __isset($name){  		echo "$name ozelliginin olup olmadigi : \n";  		return isset($this->_data[$name]);  	}    	public function __unset($name){  		echo "$name siliniyor\n";  		unset($this->_data[$name]);  	}    }
Çalıştırıldığında daha net görülebilmesi için yorum satırı olarak eklemek yerine hangi metodun ne iş yaptığını echo kullanarak göstermeyi tercih ettim.

__set() :

__set metodu, erişilebilir olmayan bir özelliğin değerini değiştirmeye çalıştığımızda ya da bir özellik oluşturmak istediğimizde iş görür. 2 parametre alır, ilki değişken ikincisi ise değer. Örneğin sınıf içerisinde olmayan bir $size özelliğini düşünelim. $deneme->size = 5; yazdığımızda, Deneme sınıfı içerisindeki önceden overload için tanımladığımız $_data arrayini kullanarak $_data[size] = 5; oluşturmuş oluruz. Sınıf içerisinde tanımlı olan private $width için $deneme->width = 10; olarak değerini değiştirmeye çalıştığımızda ise, eğer __set metodu varsa, özelliğin değerini değiştirebiliriz. Eğer __set metodu yoksa, Cannot access private property... şeklinde bir fatal error alırız.

__get() :

Sınıf içerisinde erişilebilir olmayan bir özelliğe erişmeye çalıştığımıza __get metodu çalışır. Bu metod parametre olarak kullanmak istediğimiz elemanı alır. Sınıf içerisinde tanımlı olmayan bir $size özelliğini düşünelim. echo $deneme->size; yazdığımızda bize null değer döner. __get metodunu yazmamış olsaydık Undefined property... şeklinde bir notice alırdık. Sınıf içerisinde tanımlı olan public $length = 25; özelliğine bakalım. public olduğudan dolayı, yani sınıf dışarısından erişmemizde bir problem olmadığından dolayı __get metodu çalışmaz, echo $deneme->length; yazdığımızda doğrudan değere ulaşırız. Önce __set metodunu kullanarak yeni bir özellik yaratıp ve buna değer atayıp, daha sona __get metodunu kullanarak bunu çağıralım;
$deneme->hacim = 5;  echo $deneme->hacim;
Sayfada göreceğimiz çıktı şu olur;
hacim ozelligine 4 degeri ataniyor    hacim ozelliginin degeri istendi 4

__isset() :

isset(); metodu normalde true ya da false olarak boolean tipte değer döndürür. Biz sınıf içerisinde yarattığımız bir özellik için isset(); kullanırsak, __isset(); magic metodumuz çalışır.
$deneme->hacim = 5;  // __set kullanildi    echo $deneme->hacim; //__get kullanildi    var_dump(isset($deneme->hacim)); //__isset kullanildi

__unset() :

__unset metodu da, yarattığımız bu değişkenleri yok etmeye yarar.
$deneme->hacim = 5;  // __set kullanildi    echo $deneme->hacim; //__get kullanildi    var_dump(isset($deneme->hacim)); //__isset kullanildi true döndü    unset($deneme->hacim); //__unset kullanildi    var_dump(isset($deneme->hacim)); // __isset kullanildi false döndü

Nesne saklama (Object Serialization)

__sleep() :

Sınıf için yarattığımız nesneyi serialize(); metodu ile kullandığımızda __sleep metodu devreye girer. __sleep metodu, nesnenin serialize olması istenen özelliklerini array olarak geri döndürür. Serialize etmek, kullanılabilir bir örneğini saklamak anlamındadır. Serialize edilen nesne text dosyasında ya da veritabanında vb. saklanabilir.

__wakeup() :

unserialize(); metodunu kullandığımızda çalışan metoddur. __sleep metodunun tam tersi işlevi yapar, saklanan veriyi ortaya çıkartır. Basitçe kullanımlarını örnekleyelim;
  class Deneme{  	public $name;  	public $age;    	public function __construct($name, $age){  		$this->name = $name;  		$this->age = $age;  	}    	public function __sleep(){  		echo "Serialize ediliyor: ";  		return array('name', 'age');  	}    	public function __wakeup(){  		echo "Unserialize ediliyor: ";  	}  }    $deneme = new Deneme("Gokhan", 20);    $a = serialize($deneme); // serialize ettik  var_export($a); // serialize edilmiş halini gördük    /* deneme.txt adında bir dosyaya yazalım, daha sonra da aynı dosyadan okuyalım*/  $fptr = fopen("deneme.txt", "w");  fwrite($fptr, $a);   fclose($fptr);    $s = implode('', file("deneme.txt"));     $s = unserialize($s); //unserialize ettik  var_export($s); //unserialize edilmiş halini görelim
Serialize edilmiş hal text dosyasında şu şekilde saklanır;
  O:6:"Deneme":2:{s:4:"name";s:6:"Gokhan";s:3:"age";i:20;}

Nesnelerle string işlemleri

__toString() :

Bu metod, sınıf için yarattığımız nesneyi yazdırmak istediğimizde, yani echo yapmak istediğimizde çalışan metoddur.
class Deneme{  	public $name;    	public function __construct($name){  		$this->name = $name;  	}    	public function __toString(){  		return $this->name;  	}    }    $deneme = new Deneme('Dubluve');  echo $deneme;
Ekranda Dubluve'yi görürüz. __toString metodunu kullanmadan nesneyi yazdırmaya çalışırsak Catchable fatal error: Object of class Deneme could not be converted to string... ile karşılaşırız.

__set_state() :

Bu metod, sınıfımıza oluşturduğumuz nesne için var_export(); metodu kullanıldığında çalışır. var_export metodunun ne işe yaradığını bilmiyorsanız buradan inceleyebilirsiniz. __set_state metodu parametre olarak nesnenin kendisini array olarak alır. Örnekleyecek olursak
class Deneme{  	private $_var1;  	private $_var2;    	public function __construct(){  		$this->_var1 = 100;  		$this->_var2 = 200;  	}    	public static function __set_state(array $array){  		foreach ($array as $key => $value) {  			echo "$key ==> $value";  		}  	}  }    $deneme = new Deneme();  eval(var_export($deneme, true).';');
Bize sonuç olarak şunu verir;
_var1 ==> 100   _var2 ==> 200
Eğer __set_state metodunu tanımlamadan var_export($deneme, true); kullanırsak
Deneme::__set_state(array( '_var1' => 100, '_var2' => 200, ))
sonucu ile karşılaşırız.

Nesneyi fonksiyon olarak kullanmak

__invoke() :

Bir nesneyi bir metod olarak çağırdığımızda çalışan metoddur. Şöyle ki,
class Deneme{    	public function __invoke($var){  		var_dump($var);  	}    }    $deneme = new Deneme();  $deneme(5); // $deneme->__invoke(5);
Eğer __invoke metodunu kullanmadan nesneyi metodmuş gibi kullanmaya çalışırsak, Fatal error: Function name must be a string... ile karşılaşırız.

Nesne kopyalamak (clone)

__clone() :

İsminden de belli olduğu gibi klonlamak, kopyalamak temeline dayanan magic metodumuz. Örnek üzerinden anlatmak en güzeli olacak. İlk olarak __clone kullanmadan bir nesneyi diğer nesneye nasıl kopyalarız buna bi bakalım.
class Deneme{  	public $name;  	public $age;    }    $ogrenci_1 = new Deneme();  $ogrenci_1 -> name = "Gokhan";  $ogrenci_1 -> age = 20;    $ogrenci_2 = $ogrenci_1;  $ogrenci_2 -> name = "Osman";  $ogrenci_2 -> age = 23;    var_export($ogrenci_1);  var_export($ogrenci_2);
Deneme sınıfımızda sadece 2 tane özellik tanımladım. $name ve $age. İlk nesnemiz $ogrenci_1 içine bu özellikleri yerleştirdik, daha sonra $ogrenci_1 nesnemizi $ogrenci_2 nesnesine atadım (assign) ve ona da farklı özellikleri yerleştirdik. Fakat var_export kullanıp sonuçlara baktığımızda şöyle bir tabloyla karşılaşırız;
Deneme::__set_state(array( 'name' => 'Osman', 'age' => 23, ))  Deneme::__set_state(array( 'name' => 'Osman', 'age' => 23, ))
Bunun sebebi, $ogrenci_2 nesnesi üzerinde yaptıklarımızın $ogrenci_1 nesnesini de etkilemesidir. Çünkü 2 nesne de aynı hafıza konumunu işaret ediyorlar. Şimdi gelelim __clone kullanımına. Aynı örneği __clone kullanarak yapalım.
class Deneme{  	public $name;  	public $age;    	public function __clone(){  		echo "Nesne kopyalandi\n";  	}  }    $ogrenci_1 = new Deneme();  $ogrenci_1 -> name = "Gokhan";  $ogrenci_1 -> age = 20;    $ogrenci_2 = clone $ogrenci_1;  $ogrenci_2 -> name = "Osman";  $ogrenci_2 -> age = 23;    var_export($ogrenci_1);  var_export($ogrenci_2);
Burada clone keywordunu kullandık ($ogrenci_2 = clone $ogrenci_1;), clone keywordu __clone metodunun çalışmasını sağladı. __clone metodu içinde özellikleri de clone yapabiliriz. Sonucu :
Nesne kopyalandı  Deneme::__set_state(array( 'name' => 'Gokhan', 'age' => 20, ))  Deneme::__set_state(array( 'name' => 'Osman', 'age' => 23, ))
Devamı için : php magic methods

22 Nisan 2012 Pazar

Güzel Kod Yazma Sanatı

Öncelikle belirteyim, bu alanda guru falan değilim. Ancak, şu ana kadar okuduklarım, tecrübe edindiklerim ışığında kendi "güzel kod yazma" fikirlerime sahibim. Yazıda belirteceğim konular da bunların sentezi şeklinde olacak. Ve son söyleyeceğimi baştan söyleyeyim; Robert C. Martin'in Clean Code isimli kitabını edinin ve birkaç kez okuyun. Şu ana kadar okuduğum en iyi teknik kitaplardan birisi diyebilirim.

Güzel Kod

"Güzel Kod" kavramı kişiden kişiye değişebilir, ancak sanıyorum üç aşağı beş yukarı genel olarak benzer fikirler mevcuttur. Aslında, tek başınıza kod yazıyorsanız ve yazdığınız kod sadece sizin tarafınızdan okunacaksa, sizin için anlaşılır olanı, gözünüze hoş geleni yapmak yeterli olacaktır. Ancak, aynı kod üzerinde uğraşan kişi sayısı artmaya başladıkça, yazdıklarınızın anlaşılabilirliği üzerine sürekli düşünmeniz gerekecektir. Yazdığınız kod parçası başkası tarafından okunurken anlaşılması için 10 kere okunması gerekmesin.  Ayrıca kötü yazılmış kodun hatalardan arındırılması da zorlaşabilecektir. Şimdi birkaç başlık halinde "Güzel Kod" örneklerine bakalım. Tekrar belirteyim, tüm yazdıklarım okuduğum kitapların (özellikle de Clean Code'un) ve kendi tecrübelerimin sentezi sonucu ortaya çıkan kendi düşüncelerimdir.

İsimlendirme

Kod içerisindeki herşeyin isimlendirmesi. Değişkenlerin, fonksiyon/metodların, sınıfların... İlk vereceğim tavsiye, değişken, metod, sınıf neyi temsil ediyorsa açık açık o şekilde isimlendirin.
String var1; // isim  int var2; // yaş  //...  var1 = "ali"; // 156. satır  var2 = 15;
Kodunuzu okuyan ikinci bir kişi kod parçasının 156. satırında var1 değişkenine bir string atadığınızı gördüğünde bu değişkenin ne işe yaradığını çözmesi için kafasında bir çözümleme yapması gerekir. "ali", değişkenin bir isim olduğunu az çok gösteriyor ama bu kimin ismi, kendisinin mi, babasının mı, ilkokul arkadaşının mı? Çok da belli değil.
String ownName;  int ownAge;  //...  ownName = "ali";  ownAge = 15;
Sanırım artık durum daha anlaşılır oldu. Bir değişken neyi temsil ediyorsa basit, anlaşılır şekilde onu ifade edin. Mümkün olduğunca kısa tutmaya çalışın ama kısa olması için de kısaltmalar yapmayın. Örneğin;
String doorHandCol; // çok anlaşılır değil  String doorHandleColor; // açık ve anlaşılır
Fonksiyon/Metod isimleri için de benzer kural geçerli. Açık, anlaşılır, ne yaptığını (ne azını ne çoğunu) anlatan.
public void function1(); // anlamsız isimlendirme  public void createFormVariables(); // anlamlı, örneğin, bu metodun form değişkenlerini yarattığı açıkça anlaşılıyor.
Metod içerisinde ne yapılıyorsa ismini o şekilde verin demiştim. Ya da tam tersi, metod isminde neyi berlittiyseniz metod onu yapsın.
public void createFormVariables() {      // form değişkenlerine ilk değerlerini ver      // ...      showForm(); // metod ismiyle uyumsuz fonksiyonellik  }
Eğer, metod içinde gerçekten showForm metodunu çağırmanız gerekiyorsa metodun ismini değiştirin. Örneğin;
public void createFormVariablesAndShowForm() {      // form değişkenlerine ilk değerlerini ver      // ...      showForm(); // metod ismiyle uyumsuz fonksiyonellik  }
Artık metod isminin belirttiği işi yapıyor ancak şimdi de alakasız iki işi birden yapmaya başladı (bu konuya fonksiyonlar/metodlar başlığında değineceğim). Sınıf isimleri olabildiğince somut isimlerden oluşmalı ve olabildiğince kapsamlı isimler olmalı. Örneğin; Man, Woman gibi isimlendirmeler yerine Person sınıfı yapılıp, Person sınıfına cinsiyet değişkeni verilmeli.

Fonksiyonlar/Metodlar

Bu başlıkta tek bir konudan bahsetmek istiyorum. Yazdığınız metodlar/fonksiyonlar mümkün olduğunca minimal basit işler yapmalı. Metodlar içerisinde yapılan işlerin birbiriyle ilişkili işler olmasına dikkat edin. Son verdiğim örnekteki (createFormVariablesAndShowForm) metodlardan mümkün olduğunca kaçının. createFormVariables ve showForm metodlarını ayırın ve ikisini daha genel bir metottan çağırın.

Gösterim Biçimi (Notations)

Burada en çok bilinen iki gösterim biçiminden bahsedeceğim. hungarian_notation ve CamelCase. Hungarian notation örneği;
int button_width = 200;
CamelCase örneği;
int buttonWidth = 200;
Ben CamelCase gösterimi kullanıyorum. Gözüme daha hoş ve anlaşılır geliyor. Üstelik sürekli alt tire yapma dolayısıyla fazla karakter derdinden de kurtarıyor. Genelde de CamelCase gösterim kullanılıyor diye biliyorum. Değişken ve metod/fonksiyon isimlerinde ilk harf küçük diğer her kelimenin ilk harfi büyük şekilde, sınıf isimlerinde ise tüm kelimelerin ilk harfi büyük şekilde yazmaya çalışın.
String submitButtonText;  // ...  public void onSubmitButtonClicked ();  // ...  public class SubmitForm {}
Bir de eskiden kalma bir alışkanlık var. Sınıfların elemanlarının başına m_ öneki koymak.
int m_submit_button_width;  int mSubmitButtonWidth;
Kocaman bir sınıfın içinde kullandığınız değişkenin sınıfın değişkeni olduğunu göstermek için. Ancak, günümüzdeki hemen tüm kod geliştirme araçları bu elemanları renklendirdiği için bu kullanıma da artık yok.

Açıklamalar (Comments)

Açıkçası Clean Code'u okuyana kadar düşüncem, kodlara mümkün olduğunca açıklama yazmaktı. Ancak, kitap beni bu konuda farklı yönde ikna etti; mümkün olduğunca az açıklama yazın :) Kitabın savı da şu; çok açıklama kodunuzun az anlaşılır olduğunu gösterir. Bir nevi ters orantılı yani. Açıklama yazmak kolay iş ancak bu sefer de açıklamalar arasında kod parçalarını bulmaya uğraşacaksınız :) Peki açıklama yazmazsak kodumuz nasıl anlaşılacak? Yazının başından beri anlatmaya çalıştığım şekilde. Güzel ve anlaşılır yazmaya çalışarak :) Kısa ve net.

Giriş

Bu bölüm hem giriş hem sonuç olarak düşünülebileceği için giriş ismi vermeyi tercih ettim. Kod yazarken ilk başta en güzel kodu yazmaya zorlamayın kendinizi. Zaten ilk yazdığınız kod büyük ihtimalle yanlış ve az anlaşılır olacaktır. Üzerinden tekrar tekrar geçin, üzerinde tekrar tekrar düşünün. Gereksiz kısımları başka yere taşıyın. Alakasız metodları birbirinden ayırın. Değişkenlerinizi daha düzgün isimlendirmeye çalışın. Kodu sadece kendiniz geliştiriyor olsanız bile güzel, temiz, anlaşılır yazmaya çalışın. Son olarak; mutlaka Clean Code'u okuyun :) Devamı için : Güzel Kod Yazma Sanatı

21 Nisan 2012 Cumartesi

Manager of pid-file quit without updating[FAILED] hatasi

Eğer Starting MySQL....Manager of pid-file quit without updating[FAILED] hatası alıyorsanız, muhtemelen bir sebepten ötürü mysqlinizi durdurmuşsunuz, ama sonra bir daha başlatamamışsınız demektir. Benim de hata şöyle başıma geldi. Bazı sitelerimiz yaklaşık 2 dakikadır açılmıyordu. Server a Ssh'tan giriş yapabildim, ve kontrol edebildim. Makina'da load yoktu. (2-3 civarındaydı.) ben de serviceleri yeniden başlatarak bir rahatlama sağlayabileceğimi düşündüm. Servisleri durdurdum fakat, mysqli başlatamadım. Başlıkta belirttiğim hatayı verdi. Daha sonra diskte yer kalmadığını gördük. Pid dosyasını da güncelleyemiyordu haliyle.

Çözüm

Diskte bir miktar yer açtıktan sonra mysql sıkıntısız bir şekilde başladı. Ah bu loglar yok mu... Devamı için : Manager of pid-file quit without updating[FAILED] hatasi

17 Nisan 2012 Salı

Bu html taglarını biliyor muydunuz

Web öyle bir şey ki, en çok bildiğinizi iddia ettiğiniz şey hakkında bile bazen ne kadar az bildiğinizi görebiliyorsunuz. HTML de öyle bir şey. (hele hele de sektörümüzde internet explorer gibi bir "şey" varken.. ) Ben şu aşağıda bahsedeceğim tagleri ilk defa gördüm, bakalım siz biliyor musunuz? <em>Emphasized text</em> <dfn>Definition term</dfn> <code>A piece of computer code</code> <samp>Sample output from a computer program</samp> <kbd>Keyboard input</kbd> <var>Variable</var> <cite>Citation</cite> Devamı için : Bu html taglarını biliyor muydunuz

13 Nisan 2012 Cuma

dubluve.net guncel tarayici (browser) kullanim oranlari

Dubluve.net in 5 aylık istatistiklerine dayanarak insanların hangi browser'i kullandığını merak etmiştim, yanıtı da paylaşmak istedim.

Birinci Tarayıcı Google Chrome!

Google analytics'ten edindiğim verilere göre, dubluve.net'i ziyaret eden kullanıcıların en çoğu(yarısı) google chrome kullanmakta. Aşağıdaki tabloda en çok kullanılan 4 browser ve bunların yüzdelerini vermek istiyorum.  
Browser % Ziyaret
1. Chrome
49.42%
2. Firefox
30.71%
3. Internet Explorer
16.69%
4. Opera
1.27%
Dubluve.net in yazılım ve araştırma ağırlıklı içeriğinin hitap ettiği kesime benzer kesim için bilgiye ihtiyacınız olursa faydalanılabilir diye düşündüm. Devamı için : dubluve.net guncel tarayici (browser) kullanim oranlari

12 Nisan 2012 Perşembe

C dilinde yapılar ve kullanımları (structures in C)

Struct nedir?

Struct(yapılar), birbirleriyle ilişkili olan değişkenlerin bir arada tutulması, tek bir isim altında toplanmasıdır. Kabaca bir örnek vermek gerekirse; bir öğrenci struct'ımız olsun (ismine ogrenci diyelim). Bir öğrenciye ait hangi bilgileri tutabiliriz? Öğrenci ismi, okul numarası, cinsiyet, okul ismi, vs. Peki bu structı nasıl oluştururuz?
struct ogrenci{  	char *isim[30];  	char cinsiyet;  	int okulNumarasi;  	char *okul[30];  };
Struct tanımladıktan sonra noktalı virgülü unutmak hataya yol açar. Görüldüğü gibi, bir yapının içerisinde birden fazla türde değişken tanımlayabildik. Bu yapı içerisinde isim ve okul için karakter dizisi elemanı, okul numarası için int tipinde bir eleman, cinsiyet için de E ve ya K içerebilecek bir char tanımladık. Yaptığımız işlem sadece yeni bir değişken türü tanımlamak oldu, hafızada bu işlem için bir yer ayrılmadı! Yani int ya da char nasıl bir değişken türüyse, şu an ogrenci'de bizim için yeni bir değişken türü oldu. Dolayısıyla biz oluşturduğumuz yapı türünden istediğimiz sayıda değişken bildirebiliriz. Ama nasıl? 3 adet öğrenci olsun elimizde, bunlara gokhan, emre, ahmet diyelim. Biz bunların ne olmasını istiyoruz? struct ogrenci tipinde birer değişken olmalarını istiyoruz. Öyleyse bu değişkenleri bildirmeliyiz;
struct ogrenci gokhan, emre, ahmet;
Şimdi sıra geldi bunları kullanmaya. Tanımladığımız her değişken, yani gokhan, emre ve ahmet ayrı ayrı, birbirinden bağımsız olarak, her biri, struct ogrenci içinde tanımladığımız değişkenlere sahiptir. Biraz daha açık yazmak gerekirse, gokhan için kullanacağımız char okul[30] ile ahmet için kullanacağımız char okul[30] birbirinden bağımsızdır. Bunların içlerinde aynı şeyler olabilir, ama birbirleriyle bir alakaları yoktur. Öyleyse, struct ogrenci tipinde tanımladığımız değişkenlerimiz için değer atamaya başlayalım. Burada kullanacağımız 2 adet operatör var. Biri yapı elemanı operatörü olan nokta (.), diğeri de yapı gösterici operatörü olan ok (->)[arasında boşluk olmadan eksi işareti ve büyüktür işareti]. Mesela, gokhan değişkenine okul numarası atayalım her iki yolla da. Yapı elemanı operatörü'nü yani noktayı kullanırken işimiz çok kolay.
gokhan.okulNumarasi = 5210010;
Aslında yapı gösterici operatörü kullanmak da bir o kadar kolay. gokhan için bir adet gösterici bildirelim, gPtr olsun adı. Burda önemli olan, bu göstericimizin türünün de struct ogrenci olacağı.
struct ogrenci *gPtr;  gPtr = &gokhan;
Görüldüğü gibi gokhan'ın adresini gPtr'ye atadık. Şimdi de ok (->) nasıl kullanılır ona bakalım.
gPtr->okulNumarasi = 5210010;
Mesela emre'ye isim atayalım;
struct ogrenci emre;  struct ogrenci *ePtr;  ePtr = &emre;    ePtr->isim[30] = "Emre";  
Bunların printf içerisindeki kullanımları da aynı şekildedir.
printf("%s", ePtr->isim[30]);
diyebiliriz mesela.

typedef nedir?

typedef anahtar kelimesini kullandığımızda, yapımız için yeni değişken tanımlarken struct kullanmak zorunda kalmayız.
struct ogrenci{  	char *isim[30];  	char cinsiyet;  	int okulNumarasi;  	char *okul[30];  };    struct ogrenci gokhan;  
Bunu typedef kullarak şu şekilde yaparız;
typedef struct{  	char *isim[30];  	char cinsiyet;  	int okulNumarasi;  	char *okul[30];  }Ogrenci;    Ogrenci gokhan;  
Dikkat, ogrenci ve Ogrenci birbirinden farklıdır! Görüldüğü gibi değişken tanımlarken tekrar struct yazmıyoruz, typedef sayesinde bir bakıma takma isim kullanmış oluyoruz. Ayrıca gokhan, emre, ahmet gibi struct ogrenci tipinden değişken tanımlamasını şu şekil de yapabiliriz;
  struct ogrenci{  	char *isim[30];  	char cinsiyet;  	int okulNumarasi;  	char *okul[30];  };      typedef struct ogrenci Ogrenci;  Ogrenci gokhan, emre, ahmet;  
Yapılarla kullanılan geçerli işlemler, yapı değişkenlerini aynı tipte yapı değişkenlerine atamak, bir yapı değişkeninin adresini almak, yapı değişkenlerine erişmek, ve yapı değişkeninin boyutunu belirtmek için sizeof kullanmaktır. sizeof kullanımına örnek verecek olursak;
printf("%ld", (long) sizeof(struct ogrenci));
Bunun çıktısı bize, struct ogrenci tipinden bir değişkenin hafızada kaç byte tutacağını gösterir. Devamı için : C dilinde yapılar ve kullanımları (structures in C)

10 Nisan 2012 Salı

Java Generics - Tipler Üzerinde Soyutlaşma

Generics?

Aslında konunun başlığı genel anlamda konuyu özetliyor (en azından sadece bir kısmını :)). Java 1.5 versiyonuyla gelen Generics özelliği, yazdığımız sınıfı tipler üzerinde soyutlaştırmamızı, türden bağımsız sınıflar yaratabilmemizi sağlıyor. Yani, sınıfı yazarken sınıfın metotlarının birden fazla tip için çalışabilirliğini sağlamış oluyoruz. En güzel anlatım örnekle anlatımdır diyerek (tamamen kendi görüşüm :)) bir örnek üzerinde gösterelim. Örneğin, ArrayList sınıfı. Aslında 1.2 versiyonundan beri Generics özelliğinden mahrum olarak Java'da mevcut bir sınıf. İçerisinde tüm nesneleri tutabilen bir liste. İçerisinden istenilen tipi barındırabilmek ilk bakışta çok cazip gelse de aslında çok sakat(!) bir işlem. Bu konuya daha sonra değineceğim. Burada sadece örnek veriyorum.
Apple anApple = new Apple();  Pear aPear = new Pear();           ArrayList ourBag = new ArrayList();  ourBag.add(anApple);  ourBag.add(aPear);
Görüldüğü üzere elma ile armutu bir araya koyduk. ArrayList sınıfının eski halinde add metodu Object tipinde parametreye sahip olduğu için iki nesneyi de ekleyebildik.
add (Object o);
Şimdi de kendimizi biraz kısıtlayalım. Generics özelliğini kullanalım.
ArrayList<Apple> ourAppleBag = new ArrayList<Apple>();  ourAppleBag .add(anApple);  ourAppleBag .add(aPear); // Dikkat: derleyici izin vermez.
Oops. ArrayList'in yanında Apple nesnesi var. Artık çantamıza sadece elma atabilir hale geldik (3. satıra derleyici izin vermeyecektir). Eğer, armutlarımızı tutmak istiyorsak yeni bir çanta almamız lazım.
ArrayList<Pear> ourPearBag = new ArrayList<Pear>();
Peki ne oldu? Neden birden kısıtladık kendimizi? Ayrıca türden bağımsızlık işin neresinde? Metodun parametresini Object türünde yaparsak tüm tipteki nesneleri alabilir değil mi artık?

Nimetler, Nimetler, Nimetler

Öncelikle elmayla armut aynı çantada olursa neler olur onu görelim. Parametre olarak bir ArrayList alan metodumuz olduğunu düşünelim.
getAppleJuice (ourBag);  // ...  public void getAppleJuice(ArrayList bag) {          Apple anApple = bag.get(0);  }
Bu metodu derlemek istediğinizde derleyici hata vererek sizden cast işlemi yapmanızı isteyecektir. Çünkü;
Object get (int index);
get metodu Object tipinde bir nesne döndürüyor.
getAppleJuice (ourBag);  // ...  public void getAppleJuice(ArrayList bag) {          Apple anApple = (Apple) bag.get(0);  }
Artık derleyici bize kızmıyor. Ama her zaman içinde elma olduğunu nereden bileceğiz. Şu durumu düşünelim;
getAppleJuice (ourBag);  // ...  public void getAppleJuice(ArrayList bag) {          Apple anApple = (Apple) bag.get(1);  }
Derleyici için bir sorun yok. Programı çalıştırabilirsiniz. Hatta müşterinize satabilirsiniz. Bir süre sonra müşteriniz size elma suyu yerine armut suyu içtiğini, programın bozuk olduğunu söylerse şaşırmayın. Gerçekte olan ise, programın çalışması anında Java bize kızar ve bir exception fırlatır. Buyrun size en güzelinden bir böcek. E o zaman ArrayList sınıfına müdahele edelim ve Object olan yerleri Apple'a çevirelim. Artık, getAppleJuice metodunun elma suyu döndürmesini garantilemiş olduk. Peki armutları tutmak için ne yapacağız? ArrayList sınıfını kopyalayacağız ve tüm Object olanları Pear yapacağız. Meyveler arttıkça kopya sınıflar da artmış oldu. Yeni her tip için sınıfı tekrar yazacağız. Bu dertten kurtulmak gerekir. Bir kere yazalım hepsi için program anında bile düzgün çalışsın. Üstelik sadece 1 sınıfla! Generics ile yazılmış ArrayList sınıfı ArrayList<E> şeklinde tanımlanıyor. Artık nesnesini oluştururken hangi sınıfı verirsek çantaya o nesneyi atabileceğiz. Yeni add metodu;
add (E e);
şeklinde. Artık parametre çanta yaratırken belirttiğimiz E tipinde.
ArrayList<Apple> ourAppleBag = new ArrayList<Apple>();  ourAppleBag.add(anApple);
Artık, çantamız bir elma çantası ve armut almıyor. Armut alan çanta için armut çantası yaratacağız. Şimdi elma suyu metodumuza yeniden bakalım;
getAppleJuice (ourAppleBag);  // ...  public void getAppleJuice(ArrayList<Apple> bag) {          Apple anApple = bag.get(1);  }
Biraz kısıtladık kendimizi değil mi? Ama program çalışırken ortaya çıkacak sürprizlerden kurtarmış olduk kendimizi. Artık metod aldığı çantanın bir elma çantası olduğunu biliyor. Cast işlemine de ihtiyaç duymuyor.

Sonuç?

Bu tarz her yazımda olduğu gibi yazının sonunda öneride bulunayım:
  • Halihazırdaki Java sınıflarını (özellikle ArrayList gibi Collection türündeki sınıfları) kullanırken Generics halini kullanın. Hatta diğer hali hiç kullanmayın :)
  • Eğer, kendi yazdığınız sınıf birden fazla tip için çalışacaksa tek ve doğru yolunuz Generics şeklinde yazmak.
Devamı için : Java Generics - Tipler Üzerinde Soyutlaşma

HTTP Code Response sitesi httpstat.us

Kendi yazmış olduğumuz kodlar, dış sitelerle bağplantıya geçiyorsa, hata kontrollerini yapmak kritik önem taşımaktadır. Bu site, farklı farklı HTTP kod yanıtları üreten süper basit bir site. Test ortamınızda dönen HTTP response kodlarına göre nasıl davranacağınızı ayarlayabilmeniz için size ortam sağlamış oluyor. Örneğin 200 OK yanıtı veren bir istek yapmak istiyorsam, httpstat.us/200 yazmam yeterli. Yanıtlar da şu kalıpta dönüyor ; HTTP/1.1 {status code} {status description} Content-Type: text/plain Content-Length: {something} {any custom response headers} {status code} {status description} {list of any custom response headers we added} sadece 100 ve 101 isteklerini veremeyeceğini belirten bu sistem, umarım ilgili konularda işinize yarayacaktır. Devamı için : HTTP Code Response sitesi httpstat.us

9 Nisan 2012 Pazartesi

PHP curl ile istek örnegi (php curl example)

CURL basit manada bir bot yapmak için kullanılabilir. Veyw webservis altyapısı olmayan yapılar için bir alternatif sağlayabilir. file_get_contents ile yapacağınız url isteklerinde (bunda allow_url_fopen açık olması lazım) kodunuza herhangi bir timeout koyamadığımız için sıkıntılı bir durum oluşabilir. CPU kullanımımız tehlikeye girebilir. Burada da yine curl, güçlü alternatif olarak karşımıza çıkmaktadır. Aşağıda basit bir CURL isteği yapabilmek için gerekli kodları göreceksiniz. Bunun ile örneğin www.google.com'u request ederseniz, ilgili sayfanın içeriğini alabileceksiniz. Yanlarında comment ile açıklamalarını yazdım
  $temp = array("a"=>1, "b"=>2);  $postdata = http_build_query($temp);    $ch = curl_init();  curl_setopt($ch, CURLOPT_POST, true); //POST Metodu kullanarak verileri gönder  curl_setopt($ch, CURLOPT_HEADER, false); //Serverdan gelen Header bilgilerini önemseme.  curl_setopt($ch, CURLOPT_URL, "http://www.domain.com"); //Bağlanacağı URL  curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); //POST verilerinin querystring hali. Gönderime hazır!  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //Transfer sonuçlarını return et. Onları kullanacağım!  curl_setopt($ch, CURLOPT_TIMEOUT, 20); //20 saniyede işini bitiremezsen timeout ol.  $data = curl_exec($ch);  curl_close($ch);    echo $data;  
NOT : php_curl php eklentinizin açık olması gerekiyor. php.ini'de yer alır kendisi. Wamptan sırayla Wamp simgesi -> PHP ->PHP extensions-> php_curl a tıklayarak açabilirsiniz. Ya da php.ini nize ekleyebilirsiniz. Devamı için : PHP curl ile istek örnegi (php curl example)

Bellona online satıs hizmetine basladi

Boydak Holding bünyesinde üretim ve pazarlama faaliyetlerine devam eden, sektörünün lider markalarından olan Bellona, teknolojik yenilikleri ile büyümeye devam ediyor. Yurt içi ve yurtdışı pazarlarda yaygın bayi ağı ile müşterilerine ulaşan Bellona, sanal pazardaki yerini "bellonastore.com.tr" ile alıyor. Özellikle ev tekstili, halı ve aksesuar gruplarında online alışveriş imkanı sağlayan Bellona, anlaşmalı kredi kartları ile peşin fiyatına 12 taksit ve bütün ürünlerde ücretsiz kargo seçeneği ile sanal pazarda şimdiden en çok tercih edilen marka olmaya başladı. Bellonastore projesi İDEASOFT Akıllı E-Ticaret altyapısı kullanılarak hazırlanmıştır. İDEASOFT un profesyonel ekip ve hizmet anlayışının yayında kendisini kanıtlamış yazılım altyapısı en büyük tercih sebebi olmuştur. Proje kapsamında SAP ERP ile entegre çalışabilecek bir yapıya sahip olan bellonastore için çalışmalar WEB ve ERP yazılım departmanlarımız tarafından hazırlanmıştır. Bellonastore projesi yazılım altyapısı yanında lojistik ve müşteri hizmetleri anlamında da birçok fiziki süreçleri bünyesinde barındıran bir projedir. Lojistik ve müşteri hizmetleri merkezi olarak perakende şirketlerimizden Anadolu Dörtler Mobilya A.Ş. tüketicilerimize hizmet vermektedir. Bellona online satış hizmetine "bellonastore.com.tr" ile başladı. | Boydak Bilişim Bülteni. Devamı için : Bellona online satıs hizmetine basladi

6 Nisan 2012 Cuma

SaaS (Software As A Service) nedir

SaaS (Software As A Service) Nedir?

Bir hizmet sağlayıcı tarafından merkezi olarak sunucu üzerinde barındırılan bir yazılım uygulamasının; birden fazla kişi/kurumun kullanımına sunulması işe dağıtımını sağlayan modeldir. Tamamen SaaS, Servis sağlayıcılar tarafından sunulmaktadır. Bu şu demektir: müşteri olarak işletme ve operasyonel maliyetlerden kurtulmak ve sadece ihtiyacınız kadar olanı için düşük maliyetli ama kaliteli hizmet almak. Hazır paket bir programa yapılan yatırımın toplam sahip olma maliyetini analiz edersek şu gerçeği açıklıkla görürüz; eğer bu şemsiyenin altında sabit ve esneklik açısından zayıf bir programla yola çıkmışsanız yakın gelecekte sıklıkla olası ihtiyaçların değişmesinden ötürü farklı bir paket programa yapılacak geçiş maliyetlerinin yüksek olması gibi gerçeklerle karşılaşılacağından ötürü bu yatırım modelinin çöpe gideceğini söylemek mümkündür. Rekabetin ve iş kurallarının ivmelendiği yeni ekonomik düzende çevikliğin kurumlar için vazgeçilmez bir hayatta kalma stratejisi olduğunu düşünebiliriz. SaaS modeli, şirketlerin ticari olarak lisanslama yolu ile kendi iç bünyelerinde barındırdıkları ve işlettikleri yazılımların yüksek ön maliyetli ve kompleks yapılarına alternatif olarak düşük maliyetli bir şekilde aynı avantajlara ulaşmayı sağlar. Herhangi bir web sayfasına nasıl ulaşıyorsanız bu yazılıma da web üzerinden bir istemci olarak yine aynı şekilde ulaşmamız mümkündür. Sahip olmanız gereken tek şey ise yalnızca o servisi almanızı sağlayacak bir hesap. İşte bu aşamada SaaS yazılımlarının ücretlendirilmesinin de farklı olduğunu söylemek gerekiyor. Bu teknoloji sayesinde geleneksel lisans satın alma durumu yerini kullanıcı hesaplarına bırakıyor. İşin daha cazip yanıysa şu: ücretlendirme de kullanım miktarınıza bağlı olarak yapılabiliyor. Yani uygulamaları ne kadar kullanıyorsanız, o kadar ücret ödeyebiliyorsunuz. SaaS modelinin temel özelliklerini sıralarsak;
  • Ticari olarak sunulan yazılım uygulamasının ağ tabanlı erişim ve yönetim.
  • Her müşterinin kendi lokasyonu yerine merkezi olarak yönetilen aktiviteler ile müşterilerin aktivitelere uzaktan web üzerinden her an bağlanabilme imkanı.
  • Uygulamanın one to one ilişki yerine one to many vasıtası ile (tek seferlik, çoklu kullanıcı mimarisi) sunulması ile gelen fiyatlama, ortaklık, yönetimsel avantajlar.
  • Merkezi güncelleme, merkezi güvenlik uygulamaları ile gelen kolaylık.
SaaS Teknolojileri ve Kurumlara sağladığı avantajlar;
  • Sunucu maliyetleri azaltılır.
  • Teknik bakım ve uygulama geliştirme maliyetleri azaltılır.
  • Güncelleme işlemleri ve maliyetleri sıfırlanır.
  • Lisans maliyetleri sıfırlanır.
  • Kullandığınız süre ve kullanan kullanıcı sayısı kadar ödeme.
  • Hizmeti dünyanın her yerinde alma imkânı.
  • Güvenlik maliyetleri sıfırlanır.
SaaS ve son kullanıcıya sağladığı avantajlar;
  • İnternet bağlantısının olduğu her yerden ve her zaman uygulamanıza ulaşma imkânı.
  • Kullanıcılar arasında dosya ve bilgi paylaşımı imkânı.
  • Matbu evrak maliyetlerinin ve kargaşasının sıfırlanması.
  • Tüm yazışmaların ve bilgilerin online ortamda barındırılması ve yedeklenmesi.
  • Online dokümantasyon arşivleme imkanının olması.
Hizmetin son müşteriye sunulması ve maliyeti;
  • Hizmet internet aracılığı ile sunuluyor.
  • Hizmet son müşteriye sıradan web tarayıcıları ile sunulmakta.
  • Hizmetin bedeli aylık veya yıllık kullanıcı sayısı ve alınan hizmetler bazında hesaplanır.
  • Kullanıcı sayısı azaldığında, maliyet azalır.
Bu yazı bir arkadaşımın sitesinden alıntıdır. Devamı için : SaaS (Software As A Service) nedir

4 Nisan 2012 Çarşamba

bulut (cloud) demek sanal sunucu demek degildir

Dünyada yakın geçmişte çığ gibi büyüyen bir yapıdır bulut bilişim (cloud computing). Bulut nedir, ne işe yarar bundan bahsetmeyeceğim. Bahsetmek istediğim Türkiye'de bu kavramın sıkça yanlış ifade edilmesi ve artık anlamını yitiriyor olmasıdır. Bulut yapıda bir sistemde olması gereken, büyük sistemin içindeki küçük parçaların birbirinden bağımsız yapıda çalışabilir olmasıdır. Bir web bulutunda, siz yeni bir uygulama (aplication) serveri eklediğinizde sisteme, onu ayarlamakla, onu sisteme monte etmekle uğraşmamalısınız. İçine yazılımlarınızı yüklemeyle, ayarlamayla vakit harcamamalsınız. Başka bir örnekle; bir mail serveri eklediğinizde sisteme, onun bulut sistem tarafından otomatik olarak kullanabilir hale gelmesidir asıl amaç. Türkiyede ise sanal sunucu oluşturmayı bilen , ve kendine sanal sunuucu kurmayı bilen herkesin ağzında bir bulut terimidir uçup gidiyor! Vmware, Virtualbox, vb.. gibi sanal sunucu oluşturabilen programlar ile, insanlar sanki birer bulut inşa etmiş gibi telafuzlar ediyor. "Biz bulut bilişime geçtik.." Bulutun B sini bile oluşturmaz bu, çünkü bulut dediğiniz, sanal bir sunucu oluşturma sihirbazından ibaret değildir. Bu sisteme 2 TB bir harddisk taktığınızda bütün bulutun storage kapasitesinin 2 TB artmasıdır bulut bilişim. Veya X no'lu uygulama serverinizde bulunan bir hesabı küçük bir işlemle Y no'lu uygulama serverinden sunabilmenizdir. Bulut bilişimi inşa etmek kolay bir işlem değildir. Fakat keskin avantajları vardır. Sistemleri birbirinden ayırma, her sunucunun sadece belirli bir işe odaklanmasını sağlamayı sağlar. Ki bu da, her işe has durumların , kendine has optimizasyon sonuçlarını beraberinde getirir. Örneğin bulut olmayan yani sadece tek bir web server'i düşünün. İçinde mysql ve php var. Bu ikisi birlikte çalışırken hem read hem de write oranı yüksek bir IO grafiği elde edersiniz. Fakat bunları ayrıdığınızda, yani mysql ve php ayrı serverlar olduğunda, php nin çalıştığı kısmı read gücünü optimize ederek artırabilir, mysql tarafında da write konusunda geliştirme yaparak üstel bir şekilde performans artışı gösteren bir optimizasyon yapabilir hale gelirsiniz. Bu da gerçek buluta giden yolda elde edeceğiniz yegane karlardan biridir. Herkesin ağzında bir bulut bulut, kelime eriyip gitmesin diye bu yazıyı yazma gereksinimi hissettim. Bulut demek, sanal bir sunucudan ibaret değildir! Devamı için : bulut (cloud) demek sanal sunucu demek degildir

iframe tecrübeleri

Bir web projesinde bazı durumlarda ister istemez iframe kullanılabiliyor. Iframe, mantık olarak her ne kadar geçmiş te kalan bir çözüm yöntemi olsa da, yine de web projelerinde zaman zaman çözüm olarak karşımıza çıkabiliyor. Iframe kullanırken bizim zaman zaman karşılaştığımız sorunlar mevcut, bunlardan bahsetmek isterim. Öncesinde kısaca iframein çalışma mantığını ve küçük bir kullanım örneğini verelim. Bir sayfa içinde 3rd party bir uygulama çalıştırmak istiyorsunuz fakat bunu browser aracılığıyla çağırmak istiyorsunuz. Bu noktada sayfanın ortada gözüken kısmına farklı bir URL si olan bir iframe yerleştiriyorsunuz. İşte tam bu noktada internet explorer için bir daha düşünün! Eğer iframe ile açtığınız url deki site içinde session kullanacaksanız, internet explorer bunu cookie'sine yazdmayı kabul etmeyecektir. Bu durumda her refresh için, yeni bir oturum oluşmaı durumu olacak + işinizi halledememiş olacaksınız. (Muhtemelen aynı sayfa içindeki farklı bir URL den gelen cookieleri kabul etmeyen bir yapısı var) Bu yüzden bu size bir çözüm olmayacaktır. diğer bir kullanım örneği şu olabilir; Bİr listeleme sayfanız var. Bir de sayfayı yazdırma (print etme) tuşunuz var. Print ettiğiniz şey, yazıcı dostu bir sayfa olmalı. Yani farklı bir sayfa. Buna ek olarak da, her browserin print için farklı bir politikası var. Bazısı o window.print() metoduyla birlikte ilgili sayfayı yeniden açıyor, bazısı yeni tabda açıyor, bazısı hemen printer ekranını da açıyor, bazısı önizleme yaptırıyor, bazısı yaptırmıyor, vb.. Bunları iframe ile bir standarda oturtabilrisiniz. Mevcut sayfanızın yazıcı dostu halini farklı bir URL olarak yazılımınızda ayarlayın. Daha sonra ilgili sayfa içinde bir adet gözükmez iframe oluşturun (style='visibility:hidden;') Print tuşuna basınca da , bu iframei idsinden bulup URL kısmını yazıcı dostu sayfanız olarak set edin. Yazıcı dostu sayfanızın sonunda da, < script>window.print() ekleyin. Artık tüm tarayıcılarda ortak davranan bir print metodu elde etmiş oldunuz. Umarım faydası olur. Devamı için : iframe tecrübeleri

1 Nisan 2012 Pazar

chrome eklenti (extension) siparis edin!

Chrome için bir eklentiye (extension'a) mi ihtiyacınız var? Aslında pekala kendiniz yapabilirsiniz. Fakat yine de bu şeylerle uğraşmak istemiyor olabilirsiniz. Bu sebeple isteğinizi bize iletebilirsiniz. İsteğinizi küçük bir ücret karşılığında üniversite öğrencilerine yaptırıyoruz. Böylece hem onların eğitimine bir miktar katkıda bulunmuş oluyorsunuz, hem de ihtiyacınızı karşılaşmış oluyorsunuz. Birkaç tane istek geldi bugüne kadar fakat bunları değerlendirmedik. Fakat, bu yönde bir istek oluşumu artmaya başlayınca biz de yukarıda belirttiğimiz şekilde böyle bir hizmeti verebileceğimizi düşündük. Bizimle iletişim kurmak için lütfen iletişim sayfamızı ziyaret ediniz. Devamı için : chrome eklenti (extension) siparis edin!

Git Versiyon Kontrol Sistemi Genel Komutlari

Daha önceki yazımda Git sisteminden biraz bahsetmiştim. Git'e yabancı olanlar öncelikle o yazıyı incelemek isteyebilirler. Bu yazıda Git komutlarına genelde kullanıldığı sıra ile değineceğim. Git deposunu lokalde oluşturmak Git sistemini kullanmak için önce uzak bir sunucudan Git deposunu lokalimize indirelim. Bu komut SVN'deki checkout'a denk geliyor diyebiliriz (mantık tam olarak benzemese de).
git clone [-b <branch_adi>] <depo_adresi> [<indirilecek_klasor_adi>]
Bu komutta herhangi bir Git deposunu tüm branch bilgisiyle ve ya sadece belirli bir branch'i belirttiğimiz bir klasöre indiriyoruz. Daha sonra bu klasöre geçiyoruz. Lokaldeki değişiklikleri görmek Depoyu ve dosyaları lokale indirdikten sonra bazı değişiklikler yaptık ve ne olduğu görmek istiyoruz, bu durumda aşağıdaki komuttan faydalanıyoruz.
git status
Bu kısacık komut bize çalışma klasörümüzde versiyon açısından neler olup bittiğini gösteriyor. Git ayrıca bir takım ufak yorum satırlarıyla bize yardımcı olmaya çalışıyor :)
$ git status  # On branch dev  # Untracked files:  #   (use "git add <file>..." to include in what will be committed)  #  #       README  nothing added to commit but untracked files present (use "git add" to track)
  Gönderilecek değişiklikleri işaretlemek Git'in de anlattığı üzere, README dosyası şu an sistem tarafından takip edilmiyor ve bunu takip edilecek olarak işaretlemek için aşağıdaki komutu çalıştırmak gerekiyor.
git add <dosya_yolu>
Burada dosya yolu tam olarak verilebilir ya da sadece "." verilerek tüm değişikliklerin eklenmesi sağlanabilir. Önemli bir nokta, yukarıdaki komutu sadece yeni dosyaları sisteme eklemek için değil, varolan dosyalarda  yapılan  değişiklikleri göndermek için de kullanıyoruz. Yani README dosyası daha önce sisteme eklenmiş olsaydı ve bazı güncellemeler yapıp göndermek isteseydik, yine aynı komutu kullanacaktık. Değişiklikleri göndermek (commit) Gönderilecek olan tüm değişiklikleri işaretledikten sonra Git sistemine gönderme işlemini gerçekleştiriyoruz.
$ git commit -m "added README file"  [dev b9b5954] added README file   0 files changed, 0 insertions(+), 0 deletions(-)   create mode 100644 README
Git her versiyon oluşturma aşamasında bizden yapılan değişikliklere ait bir mesaj girmemizi ister. Bunu -m parametresinden sonra belirtiyoruz. Buraya "qweqwe" yerine anlamlı bir şeyler girerseniz ileride kendinize teşekkür edersiniz :) Bu işlemden sonra bir versiyon oluşturmuş olduk. Lokaldeki versiyonu uzak bir sunucudaki Git deposuna atmak Her ne kadar Git sisteminde zorunlu olmasa da, projenizi başkaları ile geliştiriyorsanız ortak bir uzak depo kullanmak zorundasınız. Değişikliklerinizi lokal Git deposuna gönderdikten sonra paylaşılan uzak bir depoya (GitHub gibi) da gönderebilirsiniz. Bunun için şu komuttan faydalanabilirsiniz.
git push <uzak_depo_adi> <branch_adi>
Eğer değişiklik yapmazsanız uzak depo,  projeyi ilk aldığımız depoyu gösterecektir ve branch "master" olacaktır.  Eğer yetkiniz varsa en son versiyonunuzu depoya bu komutla gönderebilirsiniz. Daha detaylı komutları ilerleyen yazılarda paylaşacağım :) Devamı için : Git Versiyon Kontrol Sistemi Genel Komutlari