08 Temmuz 2010
By Onur Özgür ÖZKAN
In Php, Programcılık
Registry tasarım şablonu bize herhangi bir objecti yalnızlık tasarım şablonuna (signletion) göre kodlanmasa bile öyleymiş gibi kullanmamızı sağlıyor. Örneğin tek bir DB sınıfınız var ancak birden fazla veritabanına bağlanacaksınız dolayısıyla bunu yalnızlık tasarım şablonu ile yapmazsınız. İki Db için iki tane nesneniz olması gerekmektedir. Aşağıda bu problemin çözümünü bulacaksınız. Ayrıca Zend_Register sınıfının kodlarınıda incelmenizi tavsiye ederim.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| <?php
class Registry
{
private static $_register;
public static function add(&$item, $name = null)
{
if (is_object($item) && is_null($name)) {
$name = get_class($item);
} else {
$msg = "You must provide a name for non-objects";
throw new Exception($msg);
} //eof ifelse
$name = strtolower($name);
self::$_register[$name] = $item;
}
public static function &get($name)
{
$name = strtolower($name);
if (array_key_exists($name, self::$_register)) {
return self::$_register[$name];
} else {
$msg = "'$name' is not registered.";
throw new Exception($msg);
} // eof ifelse
}
public static function exists($name)
{
$name = strtolower($name);
if (array_key_exists($name, self::$_register)) {
return true;
} else {
return false;
} //eof ifelse
}
} // eof class Registry
$db = new DB();
Registry::add($db);
// SOnra
if (Registry::exists('DB')) {
$db = Registry::get('DB');
} else {
die('We lost our DB connection.')
} //eof ifelse |
Continue reading
Deisgn Pattern, php, Registry Pattern, Tasarım Şablonları
04 Temmuz 2010
By Onur Özgür ÖZKAN
In Php, Programcılık
Fabrika tasarım şablonu soyut sınıflardan nesne üretmek için kullanılanır. Örnekler ile anlatırsak daha net anlaşılır.
Fabrika tasarım şablonu ne zaman kullanılır?
- Programcı, üreteceği nesnenin hangi sınıftan üretileceğini bilmiyorsa! Şimdi nasıl anlatalım bir veritabanı class’ı yapacaksınız ancak bunun MySQL ile mi yoksa MsSQL ile mi çalışacağına karar vermediniz!
- Programcı sınıf alt sınıflarından nasıl nesne üretilmesi gerektiğini bilmiyorsa! Örneğin MySQL’in connect fonksiyonu ile MsSQL’in connect fonksiyonlarının aldıkları parametreler birbirinden farklı.
- Programcı yeni nesne üretim işlemini tamamen alt sınıflara bırakmak istiyorsa! Örneğin DB sınıfındaki connect fonksiyonu veritabanına bağlanır ancak MySQL için MySQLDB sınıfı MsSQL için MySQLDB sınıfı bu işlemi yapacaktır.
3. örnek biraz horoz fıkrasına döndü horoza sormuşlar “tavuk mu yumurtadan çıkar yumurta mı tavuktan” horoz bakmış beni ilgilendirmez! Ben işimi yaparım demiş. OOP ye hoş geldiniz. DB sınıfının (Horoz) connect(); fonsiyonu veritbanına bağlanmaya yarar ancak MYSQL veya MsSQL olmasına göre işlemi MySQl veya MsSQL DB sınıflarına paslar.
Basit bir örnek ile tasarım şablonunu açıklayalım. Örnek sadeceliği ve basitliği yüzünden php|architect’in Zend Php 5 CErification Study Guide kitabından alınmıştır.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| <?php
class Configuration {
const STORE_INI = 1;
const STORE_DB = 2;
const STORE_XML = 3;
public static function getStore($type = self::STORE_XML)
{
switch ($type)
{
case self::STORE_INI:
return new Configuration_Ini();
case self::STORE_DB:
return new Configuration_Db();
case self::STORE_XML:
return new Configuration_Xml();
default
throw new Exception("Bilinmeyen veri özelliği")
}
}
}
class Configuration_Ini {
//blaa blaa
}
class Configuration_Db {
//blaa blaa
}
class Configuration_Xml {
//blaa blaa
}
$config = Configuration::getStore(Configuration::STORE_XML) |
Yukarıdaki örnekten de anlayacağınız gibi ileride yeni ayarlarınız için yeni bir tip tanımladığınızda önrğin JSON tek yapmanız gereki Configuration_Json sınıfını tanımlamanız ve Configuration sınıfındaki getStore fonksiyonuna eklemek olacaktır. İleride patronunuzun sizden ne isteyeceğini bilemezsiniz. Ben kendimin patronu olmama rağmen bilmiyorum.
O yüzden factory design patternini kullanmanız iyi bir programcı olmak yolunda önemlidir. Bugün XML, MySQL ile çalışabilirsiniz ancak ileride kodlarınızın MsSQL, JSON’uda desteklemesi için yeniden yazmak zorunda kalmayın.
Gelelim php|architect’in örneğine bu örnekte eksik olan Configuration_XXX sınıflarının bir Interface’den türetilmeyişidir. Bunları interfaceden türetmek en idealidir. İkinci olarakta getStore ismi yerine factory() ismini kullanmaları kod okunurluluğu sağlayacaktır.
Bir kaç kaynakta önerelim.
- http://www.php.net/manual/en/language.oop5.patterns.php
- http://www.bidb.itu.edu.tr/?d=893
- http://www.fluffycat.com/PHP-Design-Patterns/Factory-Method/
Continue reading
29 Haziran 2010
By Onur Özgür ÖZKAN
In Genel, Programcılık
Bugün genel olarak yaptığım projelerde changelog standartını belirledim.
1
2
3
4
5
6
7
8
9
10
11
12
13
| <!--
CHANGELOG
--------------------------------------------------------------------
LEGEND
--------------------------------------------------------------------
* -> Security Fix
# -> Bug Fix
+ -> Addition
^ -> Change
- -> Removed
! -> Note
--> |
Umarım işinize yarar.
Continue reading
changelog
29 Haziran 2010
By Onur Özgür ÖZKAN
In Php, Programcılık
Eğer bir sınıftan sadece bir tane nesne oluşturulacak ve bu nesne tüm sistem kullanılacak ise yalnızlık tasarım şablonu kullanır. Bununla ilgili verilecebilecek en iyi soyut örnek Tanrı Sınıfdır. Tanrı sınıfından sadece bir tane üretebiliriz çünkü tanrı tektir.
Daha somut bir örnek ile kodumuzu yazalım. Yalnızlık tasarım şablonu daha ziyade veritabanına bağlatılarda kullanılaiblir. Basit bir kod ile örnek verelim. Birinci örneğimiz PHP|Architect’s grubunun çıkardığı “Zend PHP 5 Certification Study Guide” kitabından alıntıdır.
Continue reading
design pattern, php, singleton pattern
26 Haziran 2010
By Onur Özgür ÖZKAN
In Genel, Programcılık
AMP – Linux, Apache, MySql ve Php’nin kısaltmalarıdır. Linux, Windows savaşlarında internette Windows’un kaybetmesinin tek nedeni bence Apache, Mysql ve Php (AMP) üçlüsünün inanılmaz bir uyum içinde Linux üzerinde çalışabilmesidir. Bu yazımızda Ubuntu Linux dağıtımı üzerinde AMP kurulumunu anlatacağım.
Root olalım
Bütün işlemleri root ile yapmayı unutmayınız! O yüzden ilk komnutumuz.
Bir işlemi sudo veya su arasında yapmak arasında fark vardır. Sudo da işlemi kendi kullanıcınız yapar ancak root yetkisinde yapılır. Zaten su gibi do yap
yani su gibi bu işi sen yap demeye gelir. Su ile yapmakta ise direk işlemi root’un kendisi yapar.
Apache2′nin kurulması
Apache2′yi bu aşağıdaki komut ile kurabilirsiniz.
Test etmek için http://localhost yazmanız yeterlidir. Ekranda “It’s work” yazısı gelirse apache2 sorunsuz kurulmuştur. Eğer bir yazı gelmez ise sırası ile http://127.0.0.1 ve http://192.168.0.100 adreslerini deneyiniz.
Bazı önemli unsurlar
- Kök dizininiz var/www olacaktır.
- Ayar dosyanız /etc/apache2/apache2.conf olacaktır.
- Diğer ayarlarınız /etc/apache2 dizinin altında olacaktır.
MySQL 5 Kurulumu
aptitude install mysql-server mysql-client
Bu işlemden sonra aşağıdaki işlemler gelecektir. Şifrenizi yazmayı unutmayınız.
New password for the MySQL "root" user: <-- şifreniz
Repeat password for the MySQL "root" user: <-- şifreniz
Php5 Kurulumu
Php5 ve apache’nin php modülünü kurmak için
aptitude install php5 libapache2-mod-php5
Tekrar başlatmayı unutmayınız.
/etc/init.d/apache2 restart
PHPINFO yu görmek için
1
2
3
| <?php
phpinfo();
?> |
Daha sonra http://localhost/info.php adresinden test edebilirsiniz.
Continue reading
23 Haziran 2010
By Onur Özgür ÖZKAN
In Programcılık
Aşağıdaki kod işinize yarayacaktır.
1
| sudo apt-get install git-core git-gui git-doc |
Continue reading
git
23 Haziran 2010
By Onur Özgür ÖZKAN
In Programcılık
Ubuntu üzerinde OpenJDK değilde Sun JDK kullanmak isterseniz. Aşağıdaki kod işinizi görecektir.
1
2
3
| sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
sudo apt-get update
sudo apt-get install sun-java6-jdk sun-java6-jre |
Kaynak
- http://www.onuratci.com/index.php/2010/05/ubuntu-10-04-java-jdk-kurulumu/
- http://www.volkantokmak.com/blog/2010/05/ubuntu-10-04-jdk-sorunsali/
Continue reading
jdk, open jdk, sun, ubuntu 10.04
13 Haziran 2010
By Onur Özgür ÖZKAN
In Genel, Programcılık
Genel bilgiler…
- Ana Safya – http://code.google.com/p/zen-coding/
- Download Linki : Zen Coding
- Demo Video – http://vimeo.com/7405114
- Örnekler http://www.smashingmagazine.com/2009/11/21/zen-coding-a-new-way-to-write-html-code/
- Özellikler http://code.google.com/p/zen-coding/wiki/Actions
Kısayollar
- Expand abbreviation with `Ctrl+E`
- Expand abbreviation as you type with `Ctrl+Alt+E`
- Wrap with abbreviation with `Ctrl+Shift+E`
- Balance tag inward or outward with `Ctrl+Alt+I` or `Ctrl+Alt+O`
- Merge lines with `Ctrl+Alt+M`
- Go to previous or next edit point with `Alt+Left` and `Alt+Right`
- Remove tag with `Ctrl+Alt+R`
- Split or join tags with `Ctrl+Alt+J`
- Toggle comment with `Ctrl+Alt+C`
Kurulum
1. Download [zip](http://github.com/mikecrittenden/zen-coding-gedit/zipball/master) or [tar](http://github.com/mikecrittenden/zen-coding-gedit/tarball/master) source and unpack it.
2. Move `zencoding.gedit-plugin` and the `zencoding` folder into `~/.gnome2/gedit/plugins/`
3. In Gedit, go to Edit → Preferences → Plugins to enable the plugin.
4. Try it out using the shortcut keys listed above.
Continue reading
12 Haziran 2010
By Onur Özgür ÖZKAN
In ExtJS, Programcılık
Ext.type() fonsiyonu size verdiğiniz parametrenin tipini döndürür. Aslınd abu çok önemli bir fonksiyondur çünkü javascript çalışma zamanında verilerin tiplerini değiştirebilme özelliğine sahip loosetyping bir dildir. Bu dili güçlü kıldığı gibi programcının çok büyük hatalar yapmasına neden olur. O yüzden javascriptte mümkün olduğunca değişkenlerin tipleri tanımlanmalı ve kontrol edilmelidir. Kullanımı aşağıdaki gibidir.
1
2
3
| Ext.type(123); // output number
Ext.type("bla bla") // string
Ext.type(new Function()); // Function |
Continue reading
ExtJS, type
12 Haziran 2010
By Onur Özgür ÖZKAN
In ExtJS, Programcılık
addBehaviors fonksiyonunu basitce özetlersek HTML elementlerinize handler ile Event atamanızı sağlıyor. Aşağıdaki örnek img html elementine yani resimlerin üzerine click eventi olunca tanımlanan fonksiyonun çalışmasını sağlıyor.
1
2
3
4
5
| Ext.addBehaviors({
"img@click" : function(e, t) {
alert("Resime tıkladınız");
}
}); |
Continue reading
addBehaviors, ExtJS