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