Category Archives: Programa Dilleri ve Çatıları

Programa Dilleri ve Çatıları

Bir Cool’unu Çok Sevdim

jQuery.coolRedirectBir Cool’unu çok sevdim, o beni hiç sevmiyor javascriptleri cachelemiş sayfa bir türlü değişmiyor… diyerekten berbat bir espiriyle konuya giriyorum…

Bu gece can sıkıntısından yazdığım basit bir jQuery eklentisini sizlerle paylaşmak istedim. Eklenti, html linkerini manipüle ederek tarayıcı yönlenme işlevini yerine getirmeden önce fade efekti ile sayfaya oturan bir katman üzerinde loading.. bla.. bla.. yazısı üstünde ziv.. ziv.. dönen bir gif görüntülenmesini sağlar.

Eklenti kodlarına aşağıdaki github reposundan ulaşabilirsiniz:
https://github.com/ibrahimgunduz34/CoolRedirect

Şöyle bir HTML linkimiz olsun.

Click to here for jQuery.

document.ready olayının callback ine aşağıdaki kodu ekleyelim.

$('a').coolRedirect();

Hepsi bu kadar…!

Olurda canınız varsayılan yükleniyor mesajını değiştirmek isterse :

$('a').coolRedirect({loadingText: 'Yükleniyor. Lütfen bekleyiniz...'});
Programa Dilleri ve Çatıları

YII ile Basit Veritabanı İşlemleri

Aslında pek üstüne blog yazısı yazmaya deyecek bir konu olduğu söylenemez. :) Hem dağılan kafamızı biraz toparlayalım, hem de konuyu arayan birilerine Türkçe kaynak olsun. Hadi bakalım…

***

YII çatısı altında veritabanı uygulamaları geliştirirken dilerseniz DAO (Data Access Object), dilerseniz ORM (Object Relation Mapping) kullanarak veritabanına erişebilirsiniz.

1. DAO (Data Access Object) Kullanarak Veritabanı İşlemleri Gerçekleştirmek :

1. 1. Veritabanı Bağlantısı Oluşturmak

YII ile veritabanı bağlantısını isterseniz dilediğiniz herhangibir anda başlatıp sonlandırabilir veya doğrudan aplikasyon başladığı anda veritabanı bağlantısını başlatabilirsiniz. DAO nesnesi PDO dan türediği için sunucunuz tarafından desteklenen tüm PDO sürücülerini kullanabilir.

Aşağıdaki örnekte anlık veritabanı bağlantısının nasıl başlatılıp sonlandırıldığını görüyoruz.

$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'myuser';
$password = 'mypass';
$connection=new CDbConnection($dsn,$username,$password);
$connection->active=true; // veritabani baglantisini aciyoruz...
......
$connection->active=false;  // veritabani baglantisini kapatiyoruz...

Veritabanı bağlantısını uygulama ayağa kalktığında başlatmak için ise veritabanı erişim bilgilerini konfigürasyona yazmanız yeterli.
protected/config/main.php:

array(
    ......
    'components'=>array(
        ......
        'db'=>array(
            'class'=>'CDbConnection',
            'connectionString'=>'mysql:host=localhost;dbname=testdb',
            'username'=>'myusername',
            'password'=>'mypassword',
            'emulatePrepare'=>true,  // YII nin sitesinde bazi SQL sorgulari icin gerekli oldugundan bahsediyor. Muhtemelen parametre iceren SQL sorgularinin dogrudan calistirilmamasi icin kullanilmasi gereken bir parametre.
        ),
    ),
)

Veritabanı bağlantısını ugulama ayağa kalktığında başlattığınızda connection nesnesine aşağıdaki şekilde ulaşabilirsiniz:

$connection = Yii::app()->db;

1. 2. SQL sorgusu çalıştırmak

SQL sorguları, veritabanı bağlantısı üzerinden bir fabrika metodu ile command nesnesinin yaratılıp bu nesnenin execute() edilmesi suretiyle gerçekleştirilir. Aslında bu kullanım şekli, PDOşinas olan arkadaşlarımıza son derece tanıdık gelecektir.

Adi bir select sorgusunu aşağıdaki şekilde çaılştırabilirsiniz.

/* @var $connection CDbConnection */
$connection = Yii::app()->db;
$sqlQuery = 'SELECT `id`, `name`, `amount` FROM `mytable` WHERE `id`=23';
/* @var $command CDbCommand */
$command = $connection->createCommand($sqlQuery);
/* @var $reader CDbDataReader */
$reader = $command->query();
foreach($reader as $row) {
 ...
}

YII, bize bir veritabanı sorgusunu çalıştırabilmemiz için aşağıdaki metodları sunar.

$rowCount=$command->execute();
/*
Bu kullanim, genellikle sonuc beklentisi olmayan 
INSERT, UPDATE, DELETE sorgulari icindir. Calitirildiginda 
sorgu sonucunda etkilenen satir sayisini doner.
*/

$dataReader=$command->query();   
/*
Bu kullanım şeklinde sonuc traversable bir obje olan 
CDbDataReader tipinde döner. Sorgu sonuclari döngü 
ile fetch edilir.
*/

$rows=$command->queryAll();
/*
Bu kullanim seklinde sorgu once calistirilir sonra tum 
sonuclar fetch edilir.
*/

$row=$command->queryRow();
/*
Bu kullanim seklinde sorgu once calistirilir sonra 
sonuca ait ilk satir fetch edilir.
*/

$column=$command->queryColumn(); 
/*
Bu kullanım şeklinde sorgu calistirilir ve sonucun ilk kolonu doner.
*/

$value=$command->queryScalar();  
/*
Bu kullanim sekli sorguyu calistirir ve ilk satirin ilk kolonunu doner.
*/

1. 3. Sorgu sonuçlarının fetch edilmesi

CDbCommand::query() metodu çağırıldığında CDbDataReader tipinde bir örnek üretilir. Sorgu sonuçlarını almak istediğinizde ise döngü içerisinde CDbDataReader::read() metodu tekrarlı olarak çağırılır.

$reader = $command->query();
while($row = $reader->read() ) {...}
foreach($reader as $row) {...}
//Bu kullanim sekli sorgu sonucundaki tum satirlari alir.
$rows = $reader->readAll();

1. 4. Transaction Kullanımı

Üstüne söylenecek çok fazla birşey yok. Sorguları çalıştırmaya başlamadan önce transaction ı başlatır sorguları çalıştırdıktan sonra commit edersiniz. Buyrun kod örneği :

$queries = array();
$queries[] = 'INSERT INTO `mytable` (`id`, `name`, `amount`) VALUES(1, 'zeynep', 100);';
$queries[] = 'INSERT INTO `mytable` (`id`, `name`, `amount`) VALUES(2, 'ayşe', 250);';
$queries[] = 'INSERT INTO `mytable` (`id`, `name`, `amount`) VALUES(3, 'elif', 115);';

$success = true;
$transaction = $connection->beginTransaction();
foreach($queries as $sqlQuery) {
    try {
        $connection->createCommand($sqlQuery)->execute();
    } catch(Exception $e) {
        $transaction->rollback();
        $success = false;
    }
}

if( $success ) {
    $transaction->commit();
}

Bir sonraki yazıda YII ‘nin basit, şirin ORM kütüphanesi ActiveRecord u inceleyeceğiz.
Sevgi, selam ötesi hürmet..

Programa Dilleri ve Çatıları

Hadise var dediler, geldik!

HadiseHadise, çok ilkel (basit) bir olay güdümlü programlama kütüphanesidir. Mevcut PHP aplikasyonunuza basitce implemente ederek yazılımınızın akışını tetiklediğiniz olaylar doğrultusunda yönetebilirsiniz.

Hadise kütüphanesinin en güncel sürümünü aşağıdaki github reposunda bulabilirsiniz:
https://github.com/ibrahimgunduz34/hadise

Örneğin projenizin içindeki basit bir api implementasyonuna hadise kütüphanesini uyarlayalım.

Öncelikle olay dinleyecilerimizi kodlayalım.
İlk olarak istek göndermeden önce tetikleyeceğimiz olay dinleyicimizi ile başlayalım.

use \Hadise\IEventListener;
use \Hadise\Event;
class BeforeRequestListener implements IEventListener
{
  public function invoke(Event $event)
  {
    $logData = sprintf("Source:\n" .
                       "------------------\n" .
                       "%s\n" .
                       "Request:\n" .
                       "------------\n" .
                       "%s\n", get_class($event->getSource()),
                       var_export($event->getParameters(), true);
    file_put_contents('transaction_log', $logData, FILE_APPEND);
  }
}

Şimdi de istek gönderdikten sonra tetikleyeceğimiz olay dinleyicimizi kodlayalım.

use \Hadise\IEventListener;
use \Hadise\Event;
class AfterRequestListener implements IEventListener
{
  public function invoke(Event $event)
  {
    $logData = sprintf("Source:\n" .
                       "------------------\n" .
                       "%s\n" .
                       "Response:\n" .
                       "------------\n" .
                       "%s\n", get_class($event->getSource()),
                       var_export($event->getParameters(), true);
    file_put_contents('transaction_log', $logData, FILE_APPEND);
  }
}

Mevcut api implementasyonumuzda istek öncesi ve sonrasında olay dinleyicilerimizin tetiklenmesini sağlayalım.

class MyApiImpl implements MyApiImplInterface
{
  //...
  protected function __sendRequest($url, array $data)
  {
    $requestXML = http_build_query($data);
    EventManager::getManager('MyApiImpl')->riseEvent('beforeRequest', $this, array('data' => $requestXML));
        
    $ch = curl_init();
    //...
    $responseData = curl_exec($ch);
    //...
    EventManager::getManager('MyApiImpl')->riseEvent('afterRequest', $this, array('data' => $responseData));
  }
  //...
}

Son olarak olay dinleyicilerimizi olay yöneticimize iliştirelim.

EventManager::getManager('MyApiImpl')
            ->addListener('beforeRequest', new BeforeRequestListener());
EventManager::getManager('MyApiImpl')
            ->addListener('afterRequest', new AfterRequestListener());

Hepsi bu kadar. İyi eğlenceler :)

Programa Dilleri ve Çatıları

Pratik Zend Config Kullanımı

Zend framework ile proje geliştirirken konfigürasyon dosyalarını okumak için sıklıkla kullandığım kütüphanemin kaynak kodlarını sizlerle paylaşmak istedim.

MyVendor/Config.php :

_config ) ) {
            $this->_config[$key] = $this->_getAdapter($fileName, $section);
        }

        return $this->_config[$key];
    }

    /**
     * returns file extension.
     * @param string $fileName
     * @return string
     */
    private function _getExtension($fileName)
    {
        $explodedFileName = array_reverse(explode('.', $fileName));
        $extension = reset($explodedFileName);
        return ucfirst($extension);
    }

    /**
     * returns reader adapter.
     * @param string $fileName
     * @param string $section
     * @throws MyVendor_Config_Exception
     * @return Zend_Config_Json|Zend_Config_Xml|Zend_Config_Ini|Zend_Config_Yaml
     */
    private function _getAdapter($fileName, $section = null)
    {
        $extension = $this->_getExtension($fileName);
        switch($extension) {
            case self::FILE_TYPE_JSON:
                return new Zend_Config_Json($fileName, $section);
            case self::FILE_TYPE_XML:
                return new Zend_Config_Xml($fileName, $section);
            case self::FILE_TYPE_INI:
                return new Zend_Config_Ini($fileName, $section);
            case self::FILE_TYPE_YAML:
                return new Zend_Config_Yaml($fileName, $section);
            default:
                throw new MyVendor_Config_Exception('Unknown file type:' . $extension, '');
        }
    }
}

MyVendor/Pattern/Singleton.php :

MyVendor/Config/Exception.php :

Örnek Kullanım:

loadFromFile($file, APPLICATION_ENV);
Programa Dilleri ve Çatıları

Eclipse PDT Auto Complete Sorunu

Eclipse PDT kullanıyorsanız, kodlama sırasında editörünüz otomatik tamamlama yapmıyorsa ve CTRL+SPACE ile zorladığınızda “No completions available” mesajını alıyorsanız:
– Projenizin üzerine sağ klik yapın ve açılan menüden “Properties” öğesine sol klik yapın.
– Açılan pencerede sol taraftaki listeden PHP Include Path öğesini seçin.
– libraries sekmesinde “Add External Source Folder” butonuna tıklayın.
– Açılan dialogdan projenizin kaynak kodunun olduğu dizini seçin ve ok butonuna basın.
– OK butonuna basarak properties penceresini kapatın.

Programa Dilleri ve Çatıları

YII Framework Modülleri Arasında Model Erişimi

Hobi için uğraştığım proje anlaşılan bu ara epey blog yazısı yazmama vesile olacak.

YII framework de modüler bir proje geliştiriyorsanız projenin herhangibir yerinden modül içerisindeki bir modüle ulaşmak için aşağıdaki yolu izleyebilirsiniz.

1- Framework ün yardımcısını kullanarak veya manuel olarak aşağıdaki klasör yapısını oluşturmak suretiyle yeni bir modül oluşturun.

protected/
  modules/
    blog/
      components/
      models/
      views/
      controllers/

2- Güzel… Şimdi konfigürasyon dosyasına (protected/config/main.php) oluşturduğumuz modülü tanımlayalım.

  array('modules' => array(
    ---
    'blog'
  ));

3- Post isimli yeni bir model oluşturun ve bu modeli yeni oluşturduğunuz modülün model klasörüne (protected/modules/blog/model/) Post.php olarak kayıt edin.

class Post
{
  public function newPost()
  {
    ...
  }
}

4- Şimdi de modül sınıfımızı oluşturalım. Bu modülün içine ekleyeceğimiz getPost metodu az önce oluşturduğumuz modele başka modüllerden erişebilme imkanını sağlayacak. Bu sınıfı yeni oluşturduğunuz modül klasörüne BlogModule.php olarak kayıt edin.

class BlogModule extends CModule
{
  public function init()
  {
    $this->setImport(array('blog.models.*',
                           'blog.components.*'));
  }
  
  public function getPost()
  {
    return new Post();
  }
}

Oluşturduğumuz blog modülü dışında, projenin herhangibir yerinde Post modeline ulaşmamız gerektiğinde aşağıdaki şekilde ulaşabiliriz.

$post = Yii::app()->getModule('blog')->getPost();

Hepsi bu. İyi eğlenceler :) .

Programa Dilleri ve Çatıları

YII Framework Autoloader Kütüphanesini Ezerek PSR-0 a Uygun Hale Getirmek

Birkaç gün önce evde zaman geçirmek için başladığım PHP projesinde hafifliği nedeniyle YII framework tercih ettim. Ancak framework ün mevcut autoloader kütüphanesinin PSR-0 standartları na uygun çalışmaması nedeniyle mevcut kütüphaneyi ezip farklı bir autoloader kütüphanesi kullanmak için farklı denemeler yaptım ve sonuçta aşağıda adım adım açıkladığım çözümü buldum. Ben autoloader kütüphanesi olarak Zend in autoloader kütüphanesini tercih ettim.

YII framework ün autoloader kütüphanesini ezerek Zend in autoloader kütüphanesini kullanmak için aşağıdaki adımları gerçekleştirmeniz gerekiyor.

1-) Projenizin protected dizini altında vendors ve vendors/Zend isimli dizinleri oluşturun.

2-) Zend framework ün aşağıdaki kütüphanelerini oluşturduğunuz dizinin altına kopyalayın.

Zend/Exception.php
Zend/Loader.php
Zend/Loader/Autoloader.php
Zend/Loader/Autoloader/Interface.php

3-) protected/vendors/Zend/Loader.php dosyasında require komutu ile script e dosya dahil eden satırları commentout edin.

 52     public static function loadClass($class, $dirs = null)                                                              
 53     {                                                                                                                   
 54         if (class_exists($class, false) || interface_exists($class, false)) {                                           
 55             return;                                                                                                     
 56         }                                                                                                               
 57                                                                                                                         
 58         if ((null !== $dirs) && !is_string($dirs) && !is_array($dirs)) {                                                
 59             //require_once 'Zend/Exception.php';                                                                        
 60             throw new Zend_Exception('Directory argument must be a string or an array');                                
 61         }                                                                                                               
 62                                                                                                                         
 63         // Autodiscover the path from the class name                                                                    
 64         // Implementation is PHP namespace-aware, and based on  
///
 95         }                                                                                                               
 96                                                                                                                         
 97         if (!class_exists($class, false) && !interface_exists($class, false)) {                                         
 98             //require_once 'Zend/Exception.php';                                                                        
 99             throw new Zend_Exception("File \"$file\" does not exist or class \"$class\" was not found in the file");    
100         }                  
///
264     public static function registerAutoload($class = 'Zend_Loader', $enabled = true)                                    
265     {                                                                                                                   
266         trigger_error(__CLASS__ . '::' . __METHOD__ . ' is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead', E_USER_NOTICE);
267         //require_once 'Zend/Loader/Autoloader.php';                                                                    
268         $autoloader = Zend_Loader_Autoloader::getInstance();                                                            
269         $autoloader->setFallbackAutoloader(true);    
///
272             self::loadClass($class);                                                                                    
273             $methods = get_class_methods($class);                                                                       
274             if (!in_array('autoload', (array) $methods)) {                                                              
275                 //require_once 'Zend/Exception.php';                                                                    
276                 throw new Zend_Exception("The class \"$class\" does not have an autoload() method");                    
277             }         
///
272             self::loadClass($class);                                                                                    
273             $methods = get_class_methods($class);                                                                       
274             if (!in_array('autoload', (array) $methods)) {                                                              
275                 //require_once 'Zend/Exception.php';                                                                    
276                 throw new Zend_Exception("The class \"$class\" does not have an autoload() method");                    
277             }          

4-) protected/vendors/Zend/Loader/Autoloader.php dosyasında require komutu ile script e dosya dahil eden satırları commentout edin.

 22                                                                                                                         
 23 /** Zend_Loader */                                                                                                      
 24 //require_once 'Zend/Loader.php';                                                                                       
 25                                                                                                                                        

5-) Aşağıdaki sınıf kodunu projenizin protected/components dizini altına ResourceLoader.php olarak kayıt edin.

getMessage();                                                                                      
        }                                                                                                               
    }                                                                                                                   
}                      

6-) Framework konfigürasyonunuzda components bölümüne ResourceLoader bileşenini tanımlayın.

return array(
 //
 'components' => array('resourceLoader' => array('class' => 'ResourceLoader'))
);

7-) Yine konfigürasyonda preload bölümüne bileşeninizi tanımlarken kullandığınız alias ı ekleyin.

return array(
  //
  'preload' => array(
    //
    'resourceLoader'
  )
);

Hepsi bu kadar. İyi eğlenceler :)

Programa Dilleri ve Çatıları

Son Dakika: HÖSYM İş Görüşmelerinde Çıkan Soruları Çaldırdı

HÖSYM, sonunda bu da oldu dedirtecek cinsten bir olaya daha imza atarak iş görüşmelerinde çıkan soruları da çaldırdı. Konuyla ilgili olarak HÖSYM başkanı Gani Hemir sessiliğini korurken tevekkülden sorumlu kısmi eğitim bakanı Süleyman Çekik “Allahın taktdiri, biz ne yapabiliriz ki ?.” şeklinde açıklamada bulundu. Olayla ilgili savuşturma başlatıldı.

***

İş görüşmelerinde, görüşme yaptığınız teknik insanlar sizi koklayarak tanıyamayacağından mütevellit stres altında neler yapabildiğinizi görebilmek adına çeşitli matematik teorilerini programatik ortamda modellemenizi isteyebilirler. Burada genel olarak ilk bakılan şey yazdığınız kodun neye benzediği, sonrasında ise kullandığınız metodolojidir. Eğer yapmanız gereken iş iteratif bir davranış içinde olacaksa ve siz bunun için iç içe döngüler yazmayı düşünüyorsanız derhal ellerinizi klavyeden kaldırın! Bunu yazmak yerine “Bu böyle yapılabilir ama, daha performanslı bir metod şu an heyecandan aklıma gelmiyor.” gibi bir cümle belki tarihi bir fırsatı kaçırmanızın önüne geçebilir. :)

Bugün sizlerle twitterda bir arkadaşımın gönderisi üzerine aklıma gelen fibonacci, faktöryel ve mükemmel sayılar teorileriyle ilgili olarak bir iki küçük örnek paylaşmak istiyorum.

Mükemmel Sayılar (Perfect Numbers) Nedir ?

Mükemmel sayılar kendisi hariç pozitif tam sayı bölenlerinin toplamına yada tüm pozitif tam sayı bölenlerinin toplamının yarısına eşit olan sayılardır.

Örnek:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

Bir Sayının Mükemmel Sayı Olduğunu Nasıl Doğrularız ?

function isPerfectNumber($value)
{
  $total = 0;
  for( $i = 1; $i < $value; $i++ ) {
    if($value % $i == 0) {
      $total += $i;
    }
    echo sprintf('Value: %s, Loop: %s, Total: %s', $value, $i, $total) . PHP_EOL;
  }
  return $value == $total;
}

if( isPerfectNumber(8128) ) {
  echo 'This is a perfect number' https://twitter.com/i/connect. PHP_EOL;
 } else {
  echo 'This is not a perfect number.' . PHP_EOL;
 }

Sonuç:

Value: 8128, Loop: 1, Total: 1
Value: 8128, Loop: 2, Total: 3
Value: 8128, Loop: 3, Total: 3
Value: 8128, Loop: 4, Total: 7
Value: 8128, Loop: 5, Total: 7
...
alue: 8128, Loop: 8123, Total: 8128
Value: 8128, Loop: 8124, Total: 8128
Value: 8128, Loop: 8125, Total: 8128
Value: 8128, Loop: 8126, Total: 8128
Value: 8128, Loop: 8127, Total: 8128
This is a perfect number

real	0m0.629s
user	0m0.124s
sys	0m0.060s

Bu değil, daha farklı birşey olmalı. Bunu herkes yapıyor... Daha az kaynak tüketmeli, cpu/memory mutlu olmalı.

Peki, o zaman gelin bir de tail call optimizasyonu ile recursive olarak yapmayı deneylim.

function isPerfectNumber($value, $divisor = 1, $acumulator = 0)
{
  echo sprintf('Value: %s, Recursion: %s, Acumulator: %s',
              $value, $divisor, $acumulator) . PHP_EOL;

  if( $divisor < ($value -1) &&  $acumulator != $value / 2) {
    $acumulator = ($value % $divisor == 0) ? $acumulator + $divisor : $acumulator;
    return isPerfectNumber($value, $divisor+1, $acumulator);
  } else {
    return $acumulator == $value / 2;
  }
}

if( isPerfectNumber(8128) ) {
  echo 'This is a perfect number' . PHP_EOL;
 } else {
  echo 'This is not a perfect number.' . PHP_EOL;
 }

Sonuç:

Value: 8128, Recursion: 1, Acumulator: 0
Value: 8128, Recursion: 2, Acumulator: 1
Value: 8128, Recursion: 3, Acumulator: 3
Value: 8128, Recursion: 4, Acumulator: 3
Value: 8128, Recursion: 5, Acumulator: 7
...
alue: 8128, Recursion: 2029, Acumulator: 2032
Value: 8128, Recursion: 2030, Acumulator: 2032
Value: 8128, Recursion: 2031, Acumulator: 2032
Value: 8128, Recursion: 2032, Acumulator: 2032
Value: 8128, Recursion: 2033, Acumulator: 4064
This is a perfect number

real	0m0.229s
user	0m0.044s
sys	0m0.016s

Euclid çalışmış, didinmiş şöyle birşey bulmuş:
2p−1(2p−1).

function isPerfectNumber($value,$power = 2)
{
  echo sprintf('Value: %s, Recursion: %s', $value, $power-1) . PHP_EOL;
  if( pow(2, $power-1) * (pow(2, $power) -1) == $value && $power < $value) {
    return true;
  } else {
    return isPerfectNumber($value, $power + 1);
  }
}

if( isPerfectNumber(8128) ) {
  echo 'This is a perfect number' . PHP_EOL;
 } else {
  echo 'This is not a perfect number.' . PHP_EOL;
 }

Sonuç:

Value: 8128, Recursion: 1
Value: 8128, Recursion: 2
Value: 8128, Recursion: 3
Value: 8128, Recursion: 4
Value: 8128, Recursion: 5
Value: 8128, Recursion: 6
This is a perfect number

real	0m0.062s
user	0m0.048s
sys	0m0.016s

Gördüğünüz üzere ilk denememizde 8127, ikincide 2033 ve son denememizde 6 iterasyonda bu işi tamamldık.

Bir sonraki yazıda fibonacci ve factorial konularını ele alacağız.

Kaynaklar:
http://en.wikipedia.org/wiki/Perfect_number
http://www.bilgisayarkavramlari.com/2008/08/12/kuyruk-ozyinelemesi-tail-recursion-birikimsel-tarz-accumulation-style/
http://c2.com/cgi/wiki?TailRecursion

Programa Dilleri ve Çatıları

Html Formları Ajax Form’a Dönüştürmek

Evde kod yazmayı özlemişim. Arada işi gücü bırakıp birşeyler yazmak keyif verici.
***
AjaxForm, dilediğiniz html form objesinin basitce ajax form olarak çalışmasını sağlar.
Kütüphaneyi aşağıdaki github reposundan temin edebilirsiniz :
https://github.com/ibrahimgunduz34/ajaxForm

Örnek Kullanım :
Sayfamıza bir adet form ve içine birkaç alan ve submit butonu ekliyoruz.

Formumuzu ajax form a dönüştürüyoruz.

$('.ajax-form').ajaxForm();

Olaylar:
Formun submit edilmesi öncesi ve sonrası olaylarını aşağıdaki gibi yakalayabilirsiniz :

$('.ajax-form').ajaxForm({
  beforeSend : function() {
    //formun gonderilmesi oncesinde yapmak 
    // istediklerinizi bu metoda yazin.
  },
  /**
  * form verisinin iletimi sonlandiginda cagirilir.
  * @param string data 
  * @param string status [success|fail]
  */
  afterSend : function(data, status) {
    //form verisi iletildiginde yapilmasini 
    //istediklerinizi bu metoda yazin.
  }
});
Programa Dilleri ve Çatıları

Kredi Kartı Hareketlerini Sorgulamak İçin Basit Bir Kütüphane

Yakın geçmişte iade konusuyla ilgili başımızdan geçen bir olay nedeniyle iade öncesinde bankayla aramızda mütabakat yapma kararı aldık. Bu işle uğraşırken aşağıdan temin edebileceğiniz PHP kütüphanesini geliştirdim. Umarım birilerinin işine yarar.

Aşağıdaki github deposundan kütüphanenin kaynak kodlarına ulaşabilirsiniz :
https://github.com/ibrahimgunduz34/CcQueryTool

Kütüphane özetle, belirli bir siparişin history datasını banakadan isteyerek dönen veriyi işler ve size bu siparişle ilgili toplam ödenen, iade edilen ve balans verilerini döner.

Kütüphanem Türkiye’deki bankalara sanal pos servisi veren Est, Posnet ve Gvp altyapılarını destekliyor. Sizler de bu kütüphaneyi para iadesi öncesinde mütabakat amacıyla veya banka posunu uygulama katmanında test etmek için kullanabilirsiniz.