Monthly Archives: Aralık 2006

php include sorunu

php, bildindik “include” işlemi için bir çok güzel dil komutu barındırır: include, include_once, require, require_once.

yalnız bu komutlarla ilgili bir sorunum var. kendimce bir çözüm ürettim, ve kullanıyorum. daha iyisini bulamayanlar kullanır, daha iyisini bilenler de beni haberdar eder ümidiyle burada yayınlıyorum 🙂

sorun şu: diyelim ki şöyle bir dizin/betik yapınız var,

/dir1/a.php
/dir1/b.php
/c.php

a.php, b.php’yi include ediyor.
c.php de, a.php’yi include ediyor.

a.php’yi talep ettiğinizde, b.php aynı dizinde olduğu için sorun yok.
ama c.php’yi talep ettiğinizde, geçerli dizin o an için / olduğundan, a.php içindeki “include b.php” komutu da o dizin içinde b.php arıyor.

asp.net’teki gibi “relative to site root” (~/dir1/b.php)  gibi bir çözüm de php’de yok, path’i “/” ile başlatabilirsiniz ama bu da tüm sistem yolunu da bilmenizi gerektiriyor: /www/domainxxx/dir1/b.php.

debug_backtrace() isimli cabbar ve vakur bir metod, o an için çalıştırılan “stack trace”i bir dizi halinde döndürüyor. bu kıyağı, php’nin “interpreted” bir dil olmasına borçluyuz 🙂 tabii ki sorunun kendisini de :). neyse, sonuç olarak include ve file_get_contents() fonksiyonlarının yerine şu fonksiyonları kullanmaya başladım:

<?php
 
 /*
  Görkem PAÇACI
  19 Aralık 2006
  Çeşme
 */
 
 function get_caller_script($seed=0)
 {
  $backtrace = debug_backtrace();
  $callerscript = $backtrace[$seed+1][“file”];
  return $callerscript;
 }

 function realpath_safe($filename, $seed=0)
 {
  $caller_script_path = get_caller_script($seed+1);
  return dirname($caller_script_path) . “/” . $filename;
 }
 
 function include_safe($filename)
 {
  return include realpath_safe($filename);
 }
 
 function require_once_safe($filename)
 {
  return require_once realpath_safe($filename);
 }
 
 function get_contents_safe($filename)
 {
  return file_get_contents(realpath_safe($filename));
 }
 
?>

Reklamlar

Urla’da ilginç olaylar…

selamiUrla Egesev köyünde başgösteren ilginç olaylar, köylüler tarafından ‘doğaüstü’ olarak nitelendirildi. Deniz suyunun 3~50m çekilmesi üzerine görüştüğümüz muhtar S. K.(26)(solda), olaylarda uzaylıların parmağı olabileceğini belirtti.

görkemYörede balıkçılıkla uğraşan G. P.(21), üzerinde durduğu toprak parçasının olduğu yerde daha birkaç gün önce yüzerken bir yengeç tarafından nasıl ısırıldığını anlattı.

AA.

Niyeki doğdun görkem

doğum günü - 2006Görkem’in 21. yaş günü tüm yurtta coşkuyla kutlandı. AA.

Fotoğraftakiler soldan sağa cici ananem, dedem Fatma ve Ethem, kardeşim Aylin, kendim ben, babam Levent, kardeşim Deniz. cici annem Süheyla(kodadı sufi) ise o sırada fotoğraf çektiğinden köşeye montajla yerleştirildi.

Doğum günü hediyesi olarak ayrı ayrı iki tane parfüm aldım. Bundan bir sonuç çıkarmalı mıyım? Bir de nage’nin vücut şampuanı hediye edip “”bi yıkan be”” deyişini hatırladım… :O

Abstract Factory

yaratımsal (creational) bir tasarım desenidir (design pattern).

bir sınıf ailesinin (product1, product2, product3) oluşturulması için ortak bir arayüz (abstractfactory) belirlersiniz. daha sonra, bu sınıf ailesinin farklı alt sınıflardaki örneklerinin (product1a, product1b, product1c, product2a, product2b, product2c) yaratılmasını da abstractfactory arayüzünü geliştiren birer sınıf (factorya, factoryb, factoryc) üzerinden gerçekleştirirsiniz.

bu farklı üretici sınıflar, aslında sadece kendileriyle ilişkili ürünleri üretirler ama hepsi ‘abstractfactory’den türediği için, bu sınıfları kullanan istemci sınıflar tek bir arayüzü ve dolayısıyla tek bir kodu kullanarak her tür ürün ailesiyle çalışabilirler.

örneğin bir veritabanı sistemini ele alalım: ortak objeler database, table her veritabanı türü için (microsoft, oracle, mysql) ortaktır. dolayısıyla bunların davranışlarını birer üst sınıfta belirtebiliriz:

abstract class database {}
abstract class table {}

daha sonra bu soyut(abstract) sınıfların yaratılmasını gerçekleştiren bir soyut fabrika (abstractfactory) sınıfı yazalım:

abstract class dbmsmanager
{
public abstract database createdatabase();
public abstract table createtable();
}

yapıyı soyut olarak tanımladıktan sonra, soyut ürünlerin her birinin farklı aileleri için farklı sınıfları tanımlayalım:

class mysql_database : database {}
class oracle_database : database {}
class microsoft_database : database {}

class mysql_table : table {}
class oracle_table : table {}
class microsoft_table : table {}

ve her bir ürün ailesi için soyut fabrikadan kalıtlanan birer ayrık fabrika sınıfı yazalım:

class mysql_dbmsmanager : dbmsmanager {}
class oracle_dbmasmanager : dbmasmanager {}
class microsoft_dbmsmanager : dbmsmanager {}

örneğin mysql_dbmsmanager’ın createdatabase fonksiyonu, bir mysql_database nesnesi oluşturur ancak bu nesne database soyut sınıfından türediği için createdatabase fonksiyonunun sonucunda döndürülebilir. böylece mysql, oracle, microsoft veritabanlarının hepsini yönetmek için tanımladığımız tek bir arayüzden hepsini yönetebilecek ortak bir kod yazabiliriz:

dbmsmanager mng = new mysql_dbmsmanager();
database mydb = mng.createdatabase();

sonuçta dönen veritabanı türünün hangi firmaya ait olduğu önemli değildir. böylece kodunuzun tekrar kullanılabilirliği ve genişletilebilirliği bir hayli yükselmiş olur.

GData

google’ın internet üzerindeki veri paylaşımını standartlaştırmak amacıyla oluşturduğu teknik, metod ya da kütüphane. uzun adı google data api.

doğal olarak xml tabanlı bu yöntemle web’de bir veriyi okumak, sorgulamak veya güncellemek için bir standart ortaya koyuluyor. yöntem atom ve rss (2) standartlarını genişleterek yeni bir standart geliştirmek üzere kurulu. örneğin gdata authentication desteği sunuyor.

yaygınlaşırsa, ortaya koydukları misyonu da göz önüne alınca yaptıkları en iyi işlerden biri olur.

ilgili olarak:
(bkz: xml) (bkz: atom) (bkz: rss) (bkz: http get) (bkz: http put) (bkz: web 2.0)

http://code.google.com/apis/gdata/overview.html
http://code.google.com/apis/gdata/
http://jeremy.zawodny.com/blog/archives/006687.html
http://www.itconversations.com/shows/detail571.html

Phoenix

Phoenix, Ekonomi Üniversitesinde geliştirdiğimiz bir proje. Türkay PALANCI, Aykın CAGALOZ, Görkem PAÇACI, Kaya OĞUZ, Berkay BEYGO, Serkan BARUT, Fatih DUVAHAN, Damla DEMİRTAŞ bu projenin failleri. 🙂

Resimde projenin ilk “production release”in kullanıma geçtiğinin Agora Mandolin’de kutlandığını görebilirsiniz 🙂 Bu fotoğraf çekileli sanırım 2 ay falan oluyor, ama ben her zamanki ağırkanlılığımla ancak şimdi buraya gönderiyorum.

SOA temeline oturtulmuş yapıda İEÜ’nün web sitelerinde yer alan tüm kurumsal veriler, tek bir merkezden yönetiliyor ve küçük istemci paketleri(servis uyduları) yoluyla alt sitelerde (xxx.ieu.edu.tr) yayınlanıyor. Sunucu (phoenix), kullanıcı yönetimi, yayınlanan duyuruların yayınlayıcının üssünün onayından geçmesi, tüm metinlerin ingilizce sürümlerinin takibi gibi işleri yürütürken uydulara (alt siteler) bu bilgileri “xml web service” üzerinden sunuyor.

PHP5, MySql5 ve php_soap kütüphanesini kullandık. Hayırsever bir abinin yazdığı WSDL_Gen sınıfını da unutmamak gerek. Zira PHP, “typeless” bir yapıya sahip olduğundan wsdl konusu başlı başına bir problem.

phoenix-mandolinResimdekiler soldan sağa Berkay, Damla, Kaya, Türkay, Aykın, Serkan, Görkem, Ozan.

refactoring, refactoring, refactoring…

NWeb’in veri altyapısının (Nweb.Data.Providers ve NWeb.Data.Builders aduzayları) OracleClient da desteklemesi için ‘refactoring’ ile uğraşıyoruz.

Nacizane, öğrendim ki refactoring yaparken ilk ilk ilk önce yapılması gereken şey “neyi nereden alıp nereye koyacağınıza” çok net bir şekilde karar vermek. Hatta ciddi refactoring işlerini sarmal olarak planlamak çok iyi olur sanki. Diyebilirim ki refactoring yapmak sistemi baştan tasarlamaktan çok daha zor. (deneyimli üstadların “e, ne sandın?” dediğini duyar gibiyim.)

Üzerinde çalıştığı kodu ortalama 30sn’de bir derleyen takıntılı biri olan ben, NWeb’i öğleden beri derleyemiyorum. O kadar çok şeyi paramparça ettim ki, Harun (KUDUĞ) ve Canan (YILDIZ) şu sıra svn’den bir checkout yaparlarsa yiyeceğim fırçanın haddi hesabı yok…

Diyeceğim o ki, “refactoring ateşten gömlek…”

Bu içten yazıyı Harun’un sabah refactoring’in ana hattına karar verirken sarfettiği bir özlü sözle bitirmek istiyorum. İki seçeneğimiz var: (1)Birincisi, bir iki noktada çalışma zamanında tip kontrolü (runtime type check) yaparak çözüme ulaşmak. Bu seçenekte az kod yazıyoruz, ama tasarım içimize sinmiyor. (2)İkincisi ise, ciddi anlamda karışık soyutlamalarla(abstraction) yüzleşip şık bir nesne temelli tasarım yapmak. İşte tam bu anda Harun’dan bir itiraf geliyor:

“Kardeşim doğrusunun ne olduğunu bilince de insanın vicdanı elvermiyor kolayına kaçmaya…”