4 Şubat 2012 Cumartesi

Google Alerts - Güncel Arama Sonuçları Bildirimi

Bilmiyorum daha önce haberiniz var mıydı ama benim çok yakın zamanda tesadüfen haberim oldu. Google Alerts sayesinde, belirttiğiniz bir sorguyla ilgili arama sonuçlarını belirttiğiniz periyotlarda email adresinize gelmesini sağlayabiliyorsunuz. Google'ın Alerts hakkındaki açıklamasını verelim hemen;

Google Alerts'ün kullanışlı yönlerinden bazıları şunlardır:
  • gelişen bir haberi izleme
  • bir rakip veya sektör hakkında güncel bilgilere sahip olma
  • bir ünlü veya etkinlikle ilgili en son bilgileri alma
  • sevdiğiniz takımlarla ilgili gelişmeleri takip etme
google alerts örnek kullanımı Örnekte gördüğümüz üzere, dubluve.net'i arama sorgusu kısmına yazarak, dubluve.net ile ilgili google aramalarında yeni çıkan herşeyin, çıkar çıkmaz, istediğimiz email adresine gönderilmesini sağlayabiliyoruz. Daha sonra iş Google'a kalıyor zaten :) Devamı için : Google Alerts - Güncel Arama Sonuçları Bildirimi

31 Ocak 2012 Salı

Mysql Paralı Kullanım (Commercial Version) Protesto ediyorum

Bir arkadaşımın demesiyle ifade edeyim. "Oracle Mysql'i aldığında ne olacağı az çok belliydi..." Evet, dökümantasyonlarındaki aşağıdaki yazı ile mysql'den ayrılmak için bir sebebim oldu artık. "The thread pool plugin is a commercial feature. It is not included in MySQL community distributions." Gerçekten iyiydi mysql ile aramız. Bizi zorlasa da microsoft mantığından gitmiyordu. Biz kendisini pek bırakmayı düşünmedik, eski projelerimizde de bırakmayı pek düşünemeyiz şimdilik. Fakat, yeni bir şeyler yapacaksak mutlaka alternatifleri daha çok değerlendireceğim ve araştıracağım. Sen de mi Mysql diyor ve acımı sizinle paylaşıyorum.   Thread pool neymiş ne işe yararmış anlatmıyorum, protesto ediyorum! Devamı için : Mysql Paralı Kullanım (Commercial Version) Protesto ediyorum

29 Ocak 2012 Pazar

PHP için PEAR spreadsheet excel writer kurulumu

SPREADSHEET

1.SpreadSheet Nedir? • Spreadsheet, excel, gibi elektronik tablo programlama türüdür. • Program yazmaksızın hesap yapmak için kullanılan programdır. • En geniş uygulama alanları bankacılık,finans,maliyet hesabı vb. alanlarıdır. • MS-DOS ortamında tipik örnekleri,LOTUS 123,Supercalc,Excel gibi programlardır. 2.SpreadSheet Ne işe Yarar? • Finansal ve istatiksel verileri SpreadSheet kullanarak gösterebilirsiniz. • SpreadSheet Excel Writer ve SpreadSheet Excel Reader içindeki sayfalarla ; -Excel dosyalarını saklayabilir, -Excel dosyalarını okuyup yazabilir, -Excel dizininin olup olmadığını kontrol edebilir, 3.PHP için SpreadSheet Excel Writer Ve SpreadSheet Excel Reader Kurulumu • PEAR Kurulumu: PEAR kurulumu için Wamp'ın kurulduğu klasörün altındaki güncel php klasörünün içinde(C:\wamp\bin\php\php 5.2.11) yer alan go-pear.bat dosyasını çalıştırır. Bu bat dosyasının çalışması esnasında öncelikle PEAR2ın tüm sistem için mi yoksa sadece local hesap için mi kullanacağı sorulur. Hangi seçenekleri seçeceğinize karar verip, yüklemeyi tamamlayınız. Ardından gelen soruları geçtikten sonra PEAR kurulumu tamamlanmış olur. Bu arada zaman zaman PEAR'in veri transfer protokolleri değişebilmektedir. Bununla ilgili bir uyarı alındığında "pear channel-update pear.php.net" komutu verilebilir. PEAR kurulumu sonrasında oluşturulan "pear.bat" dosyasının bulunduğu klasör (C:\wamp\bin\php\php5.2.11) system PATH ine dahil edilmesi iyi olabilir. (command line dan doğrudan pear komutunu kullanmanızı sağlar ben yapmadım gerek de yok diye düşpünüyorum) Ayrıca PEAR kütüphanelerinin indirildiği klasöründeki php.ini'deki "include_path " değişkenine ekleme yapılması gerekmektedir. • SpreadSheet Excel Reader ve Writer Dosyalarının İndirilmesi: Öncelikle http://pear.php.net/package/Spreadsheet_Excel_Writer/download/, http://sourceforge.net/projects/phpexcelreader/files/Spreadsheet_Excel_Reader/ ve http://pear.php.net/package/OLE/download/ adreslerinden SpreadSheet Excel Reader,SpreadSheet Excel Writer ve OLE kütüphanesini indirmeniz gereklidir. • İndirdiğiniz klasörleri OLE ve SpreadSheet klasörleri olarak ayrı ayrı klasörleyip PEAR.php ile aynı yere koyunuz. Örneğin sayfanıza include_once("SpreadSheetWriter/Excel/Writer.php"); ekleyerek Writer.php 'yi sayfanıza eklemiş olursunuz. Bununla ilgili bir örnek exceld e vermeye çalışacağım. Devamı için : PHP için PEAR spreadsheet excel writer kurulumu

24 Ocak 2012 Salı

LEFT JOIN, INNER JOIN kullanımı (examples)

Join kavramı, birden çok tablo ile işlem yaparken, tek query ile çekme, sıralama, filtreleme işlemleri yapabilmemizi sağlar. Örneğimizde 3 adet tablomuz olacak. İlk tablomuzda oyuncu isimleri, ikinci tablomuzda maç isimleri, üçüncü tablomuzda ise kaydedilen goller olacak. (Gol atmayan futbolcu için üçüncü tabloda kayıt tutulmamakta.) Sırasıyla tablolarımızı oluşturup içlerine verileri yerleştirelim. İlki, futbolcu isimlerinin olduğu, 'player' isimli tablo.
  CREATE TABLE IF NOT EXISTS `player` (    `player_id` int(11) NOT NULL AUTO_INCREMENT,    `fullname` text COLLATE utf8_unicode_ci NOT NULL,    PRIMARY KEY (`player_id`)  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=23 ;    INSERT INTO `player` (`player_id`, `fullname`) VALUES  (1, 'messi'),  (2, 'xavi'),  (3, 'iniesta'),  (4, 'abidal'),  (5, 'puyol'),  (6, 'yaya toure'),  (7, 'david silva'),  (8, 'balotelli'),  (9, 'aguero'),  (10, 'quaresma'),  (11, 'fernandes'),  (12, 'simao'),  (13, 'almeida'),  (14, 'pektemek'),  (15, 'hamit'),  (16, 'alanzinho'),  (17, 'altıntop'),  (18, 'henry'),  (19, 'van persie'),  (20, 'drogba'),  (21, 'lampard'),  (22, 'torres');  
  +-----------+---------+------+-----+---------+----------------+  | Field     | Type    | Null | Key | Default | Extra          |  +-----------+---------+------+-----+---------+----------------+  | player_id | int(11) | NO   | PRI | NULL    | auto_increment |  | fullname  | text    | NO   |     | NULL    |                |  +-----------+---------+------+-----+---------+----------------+    mysql> SELECT *      -> FROM player    +-----------+-------------+  | player_id | fullname    |  +-----------+-------------+  |         1 | messi       |  |         2 | xavi        |  |         3 | iniesta     |  |         4 | abidal      |  |         5 | puyol       |  |         6 | yaya toure  |  |         7 | david silva |  |         8 | balotelli   |  |         9 | aguero      |  |        10 | quaresma    |  |        11 | fernandes   |  |        12 | simao       |  |        13 | almeida     |  |        14 | pektemek    |  |        15 | hamit       |  |        16 | alanzinho   |  |        17 | altıntop    |  |        18 | henry       |  |        19 | van persie  |  |        20 | drogba      |  |        21 | lampard     |  |        22 | torres      |  +-----------+-------------+  
İkincisi, maçların olduğu 'matches' tablosu;
    CREATE TABLE IF NOT EXISTS `matches` (    `match_id` int(11) NOT NULL AUTO_INCREMENT,    `match_name` text COLLATE utf8_unicode_ci NOT NULL,    `match_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,    PRIMARY KEY (`match_id`)  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=13 ;    INSERT INTO `matches` (`match_id`, `match_name`, `match_date`) VALUES  (1, 'barcelona - city', '2012-01-18 21:37:04'),  (2, 'barcelona - arsenal', '2012-01-18 21:37:11'),  (3, 'barcelona - chelsea', '2012-01-18 21:37:19'),  (4, 'barcelona - beşiktaş', '2012-01-18 21:37:25'),  (5, 'barcelona - trabzon', '2012-01-18 21:37:32'),  (6, 'arsenal - chelsea', '2012-01-18 21:37:45'),  (7, 'arsenal - beşiktaş', '2012-01-18 21:37:51'),  (8, 'arsenal - trabzon', '2012-01-18 21:37:57'),  (9, 'chelsea - beşiktaş', '2012-01-18 21:38:09'),  (10, 'chelsea - trabzon', '2012-01-18 21:38:15'),  (11, 'beşiktaş - trabzon', '2012-01-18 21:38:25');      
  +------------+-----------+------+-----+-------------------+----------------+  | Field      | Type      | Null | Key | Default           | Extra          |  +------------+-----------+------+-----+-------------------+----------------+  | match_id   | int(11)   | NO   | PRI | NULL              | auto_increment |  | match_name | text      | NO   |     | NULL              |                |  | match_date | timestamp | NO   |     | CURRENT_TIMESTAMP |                |  +------------+-----------+------+-----+-------------------+----------------+      mysql> SELECT *      -> FROM matches    +----------+----------------------+---------------------+  | match_id | match_name           | match_date          |  +----------+----------------------+---------------------+  |        1 | barcelona - city     | 2012-01-18 21:37:04 |  |        2 | barcelona - arsenal  | 2012-01-18 21:37:11 |  |        3 | barcelona - chelsea  | 2012-01-18 21:37:19 |  |        4 | barcelona - beşiktaş | 2012-01-18 21:37:25 |  |        5 | barcelona - trabzon  | 2012-01-18 21:37:32 |  |        6 | arsenal - chelsea    | 2012-01-18 21:37:45 |  |        7 | arsenal - beşiktaş   | 2012-01-18 21:37:51 |  |        8 | arsenal - trabzon    | 2012-01-18 21:37:57 |  |        9 | chelsea - beşiktaş   | 2012-01-18 21:38:09 |  |       10 | chelsea - trabzon    | 2012-01-18 21:38:15 |  |       11 | beşiktaş - trabzon   | 2012-01-18 21:38:25 |  +----------+----------------------+---------------------+  
Son tablomuz, 'score' tablosu, yani 'player' ve 'matches' tabloları arasında bağlantı kuracağımız tablo. (p2m)
    CREATE TABLE IF NOT EXISTS `score` (    `id` int(11) NOT NULL AUTO_INCREMENT,    `player_id` int(11) NOT NULL,    `match_id` int(11) NOT NULL,    `goals` int(11) NOT NULL,    PRIMARY KEY (`id`)  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=17 ;    INSERT INTO `score` (`id`, `player_id`, `match_id`, `goals`) VALUES  (1, 1, 1, 2),  (2, 1, 2, 3),  (3, 2, 1, 1),  (4, 2, 5, 5),  (5, 5, 4, 1),  (6, 7, 1, 2),  (7, 10, 4, 2),  (8, 10, 11, 3),  (9, 12, 7, 1),  (10, 18, 2, 1),  (11, 18, 7, 2),  (12, 18, 8, 1),  (13, 20, 3, 1),  (14, 20, 6, 1),  (15, 21, 6, 1),  (16, 22, 10, 2);    
    +-----------+---------+------+-----+---------+----------------+  | Field     | Type    | Null | Key | Default | Extra          |  +-----------+---------+------+-----+---------+----------------+  | id        | int(11) | NO   | PRI | NULL    | auto_increment |  | player_id | int(11) | NO   |     | NULL    |                |  | match_id  | int(11) | NO   |     | NULL    |                |  | goals     | int(11) | NO   |     | NULL    |                |  +-----------+---------+------+-----+---------+----------------+      +----+-----------+----------+-------+  | id | player_id | match_id | goals |  +----+-----------+----------+-------+  |  1 |         1 |        1 |     2 |  |  2 |         1 |        2 |     3 |  |  3 |         2 |        1 |     1 |  |  4 |         2 |        5 |     5 |  |  5 |         5 |        4 |     1 |  |  6 |         7 |        1 |     2 |  |  7 |        10 |        4 |     2 |  |  8 |        10 |       11 |     3 |  |  9 |        12 |        7 |     1 |  | 10 |        18 |        2 |     1 |  | 11 |        18 |        7 |     2 |  | 12 |        18 |        8 |     1 |  | 13 |        20 |        3 |     1 |  | 14 |        20 |        6 |     1 |  | 15 |        21 |        6 |     1 |  | 16 |        22 |       10 |     2 |  +----+-----------+----------+-------+  
Dikkat ederseniz, player tablosu ve score tablosunda ortak 'player_id' alanı, matches tablosu ve score tablosunda ortak 'match_id' alanı mevcuttur. Ortak tabloyu kullanarak maçlar ve futbolcularla ilgili çeşitli senaryolar kurup örnek sorgular verelim. Öncelikle LEFT JOIN ve INNER JOIN arasındaki farkı ortaya koyan bir sorgu yapalım
  mysql> SELECT *      -> FROM player p      -> LEFT JOIN score p2m      -> ON (p2m.player_id = p.player_id);  
Bu sorguyu yaptığımızda, açıkca görüldüğü üzere player tablosu ile score tablosu arasında, player_id kullanılarak left join yapılmıştır. Ve sonucu şu şekildedir;
  +-----------+-------------+------+-----------+----------+-------+  | player_id | fullname    | id   | player_id | match_id | goals |  +-----------+-------------+------+-----------+----------+-------+  |         1 | messi       |    1 |         1 |        1 |     2 |  |         1 | messi       |    2 |         1 |        2 |     3 |  |         2 | xavi        |    3 |         2 |        1 |     1 |  |         2 | xavi        |    4 |         2 |        5 |     5 |  |         3 | iniesta     | NULL |      NULL |     NULL |  NULL |  |         4 | abidal      | NULL |      NULL |     NULL |  NULL |  |         5 | puyol       |    5 |         5 |        4 |     1 |  |         6 | yaya toure  | NULL |      NULL |     NULL |  NULL |  |         7 | david silva |    6 |         7 |        1 |     2 |  |         8 | balotelli   | NULL |      NULL |     NULL |  NULL |  |         9 | aguero      | NULL |      NULL |     NULL |  NULL |  |        10 | quaresma    |    7 |        10 |        4 |     2 |  |        10 | quaresma    |    8 |        10 |       11 |     3 |  |        11 | fernandes   | NULL |      NULL |     NULL |  NULL |  |        12 | simao       |    9 |        12 |        7 |     1 |  |        13 | almeida     | NULL |      NULL |     NULL |  NULL |  |        14 | pektemek    | NULL |      NULL |     NULL |  NULL |  |        15 | hamit       | NULL |      NULL |     NULL |  NULL |  |        16 | alanzinho   | NULL |      NULL |     NULL |  NULL |  |        17 | altıntop    | NULL |      NULL |     NULL |  NULL |  |        18 | henry       |   10 |        18 |        2 |     1 |  |        18 | henry       |   11 |        18 |        7 |     2 |  |        18 | henry       |   12 |        18 |        8 |     1 |  |        19 | van persie  | NULL |      NULL |     NULL |  NULL |  |        20 | drogba      |   13 |        20 |        3 |     1 |  |        20 | drogba      |   14 |        20 |        6 |     1 |  |        21 | lampard     |   15 |        21 |        6 |     1 |  |        22 | torres      |   16 |        22 |       10 |     2 |  +-----------+-------------+------+-----------+----------+-------+  
Bazı futbolcuların ismi 2 kez geçmiştir (bunlar birden fazla maçta gol atanlar), bazı futbolcuların isimlerinin bulunduğu satırlarda ise diğer değerler NULL olarak gözükmektedir. Inner join yaptığımızda ise sonuç şöyledir;
  mysql> SELECT *      -> FROM player p      -> INNER JOIN score p2m      -> ON (p2m.player_id = p.player_id);      +-----------+-------------+----+-----------+----------+-------+  | player_id | fullname    | id | player_id | match_id | goals |  +-----------+-------------+----+-----------+----------+-------+  |         1 | messi       |  1 |         1 |        1 |     2 |  |         1 | messi       |  2 |         1 |        2 |     3 |  |         2 | xavi        |  3 |         2 |        1 |     1 |  |         2 | xavi        |  4 |         2 |        5 |     5 |  |         5 | puyol       |  5 |         5 |        4 |     1 |  |         7 | david silva |  6 |         7 |        1 |     2 |  |        10 | quaresma    |  7 |        10 |        4 |     2 |  |        10 | quaresma    |  8 |        10 |       11 |     3 |  |        12 | simao       |  9 |        12 |        7 |     1 |  |        18 | henry       | 10 |        18 |        2 |     1 |  |        18 | henry       | 11 |        18 |        7 |     2 |  |        18 | henry       | 12 |        18 |        8 |     1 |  |        20 | drogba      | 13 |        20 |        3 |     1 |  |        20 | drogba      | 14 |        20 |        6 |     1 |  |        21 | lampard     | 15 |        21 |        6 |     1 |  |        22 | torres      | 16 |        22 |       10 |     2 |  +-----------+-------------+----+-----------+----------+-------+  
Açıkca görüldüğü gibi, INNER JOIN kullandığımızda NULL olan rowlar gelmemiştir. Dikkat etmemiz gereken şey şudur. Yaptığımız örnekte, gol atmayan futbolcuya hiç bir değer girmedik. Böylece LEFT JOIN yaptığımızda; player tablosundaki player_id, score tablosunda kendi karşılığı olan player_id bulamadığı için row komple NULL olarak döndü. Biz gol atmayan futbolcular için kayıt tutuyor olsaydık, goals sütunu bize 0 (sıfır) olarak dönerdi. Inner Join kullandığımızda da 0 (sıfır) olan satırlar bize dönerdi. Çünkü NULL değil, sıfır değeri mevcut. Mesela, henry'nin hangi maçlar gol attığını bulalım. Öncelikle player tablosundan henry'i alıp, score tablosuna taşımalıyız (player_id), oradaki değerle de (match_id) matches tablosundan maça ulaşmalıyız. Yani yapmamız gereken sorgu;
  mysql> SELECT *      -> FROM player p      -> LEFT JOIN score p2m      -> ON (p.player_id = p2m.player_id)      -> LEFT JOIN matches m      -> ON (m.match_id = p2m.match_id)      -> WHERE p.fullname='henry';      +-----------+----------+------+-----------+----------+-------+----------+---------------------+---------------------+  | player_id | fullname | id   | player_id | match_id | goals | match_id | match_name          | match_date          |  +-----------+----------+------+-----------+----------+-------+----------+---------------------+---------------------+  |        18 | henry    |   10 |        18 |        2 |     1 |        2 | barcelona - arsenal | 2012-01-18 21:37:11 |  |        18 | henry    |   11 |        18 |        7 |     2 |        7 | arsenal - beşiktaş  | 2012-01-18 21:37:51 |  |        18 | henry    |   12 |        18 |        8 |     1 |        8 | arsenal - trabzon   | 2012-01-18 21:37:57 |  +-----------+----------+------+-----------+----------+-------+----------+---------------------+---------------------+  
Hiç gol atılmayan maçları bulalım;
  mysql> SELECT * FROM matches m      -> LEFT JOIN score p2m      -> ON (m.match_id = p2m.match_id)      -> WHERE p2m.goals IS NULL;      +----------+--------------------+---------------------+------+-----------+----------+-------+  | match_id | match_name         | match_date          | id   | player_id | match_id | goals |  +----------+--------------------+---------------------+------+-----------+----------+-------+  |        9 | chelsea - beşiktaş | 2012-01-18 21:38:09 | NULL |      NULL |     NULL |  NULL |  +----------+--------------------+---------------------+------+-----------+----------+-------+
(Inner Join kullansaydık NULL olan satıra ulaşamazdık!) barcelona - arsenal maçında 1'den fazla gol atan oyuncuları bulalım;
  mysql> SELECT * FROM player p      -> LEFT JOIN score p2m ON (p.player_id = p2m.player_id)      -> LEFT JOIN matches m ON (m.match_id = p2m.match_id)      -> WHERE m.match_name='barcelona - arsenal' AND p2m.goals>1;      +-----------+----------+------+-----------+----------+-------+----------+---------------------+---------------------+  | player_id | fullname | id   | player_id | match_id | goals | match_id | match_name          | match_date          |  +-----------+----------+------+-----------+----------+-------+----------+---------------------+---------------------+  |         1 | messi    |    2 |         1 |        2 |     3 |        2 | barcelona - arsenal | 2012-01-18 21:37:11 |  +-----------+----------+------+-----------+----------+-------+----------+---------------------+---------------------+  
Devamı için : LEFT JOIN, INNER JOIN kullanımı (examples)

23 Ocak 2012 Pazartesi

Türkiyenin en çok kullanılan falan filan...

Türkiye'nin en çok tercih edilen, ilk, ultra feci, e-ticaret altyapısı olduğunu iddia bir firmanın sitesinin anasayfasına girdim :) Sınırsız "bandwitch" terimiyle yaklaşık 10 dakikadır gülüyorum. Hep birlikte buyrun : Devamı için : Türkiyenin en çok kullanılan falan filan...

22 Ocak 2012 Pazar

Symfony 2 - Veritabani Icin Baslangic Verileri Olusturmak - Doctrine Fixtures

Daha önceki yazımda Symfony2'de veritabanı değişikliklerini yönetmek için database migrations kullanımını anlatmıştım. Bu yazıda yine veritabanında bize çok yardımcı olacak bir özellikten bahsedeceğim. Geliştirme sırasında veritabanı sıklıkla değişir, özellikle database migration yapısı kullanmıyorsanız tabloları tekrar yaratmak zorunda kalırsınız. Benzer şekilde veritabanı yapınıza yeni tablolar eklenebilir, sistemin düzgün işlemesi için gerekli veriler (örneğin parametre tabloları) olabilir ya da ekibinize yeni yazılımcılar katılabilir. Bu gibi durumlarda tabloları kullanan ekranlar için tekrar test verileri girmek gerekir. İşte bu test verisi girme işlemini otomatik olarak gerçekleştirmek istediğimiz zaman, Doctrine ORM'de yer alan database fixtures özelliğini kullanabiliriz.

Kurulum

Symfony 2'de database fixtures özelliğini kullanmak için DoctrineFixturesBundle paketini yüklemek gerekiyor. Bunun için proje klasörümüzde yer alan deps dosyasına aşağıdaki bilgileri ekliyoruz:
[doctrine-fixtures]  git=http://github.com/doctrine/data-fixtures.git    [DoctrineFixturesBundle]  git=http://github.com/symfony/DoctrineFixturesBundle.git  target=/bundles/Symfony/Bundle/DoctrineFixturesBundle
Bu eklemeleri yaptıktan sonra komut satırından ilgili proje klasörüne gelip ek kütüphanelerin kurulumunu sağlayan ilgili komutu çalıştırıyoruz:
php bin\vendors install
Eğer kurulum sorunsuz tamamlandıysa {proje_klasoru}/vendor/doctrine-fixtures klasörünü olmalı. Şu aşamada paketin kaynak kodunu projeye ekledik ama uygulamamız bu paketi henüz kullanmıyor. Bu nedenle paketi yüklemek için gerekli kodları ilgili sayfalara eklemek gerekiyor. Önce ilgili isim alanının (namespace) uygulama tarafından tanınması için {proje_klasoru}\app\autoload.php dosyasına aşağıdaki kodları ekliyoruz:
  $loader->registerNamespaces(         array( // ...                'Doctrine\\Common\\DataFixtures' => __DIR__.'/../vendor/doctrine-fixtures/lib',                'Doctrine\\Common' => __DIR__.'/../vendor/doctrine-common/lib',                // ... ));  
Burada dikkat edilmesi gereken nokta, Doctrine\\Common\\DataFixtures satırının Doctrine\\Common satırından önce gelmesi gerektiğidir. Symfony'de kullanılan isim alanları, yukarıdaki registerNamespaces() metodundaki sırasıyla kontrol edilir, bu nedenle ilk olarak Doctrine\\Common satırı gelirse, bir alt isim alanını gösteren satır dikkate alınmayacak ve Doctrine\\Common\\DataFixtures isim alanı kayıt edilemeyecektir. Yani her zaman daha özel, yani daha alt seviye isim alanlarını gösteren satırlar daha önce gelmelidir.

Fixture Yaratalım!

Test verilerini otomatik olarak oluşturacak dosyalar, Symfony'de PHP sınıflarından oluşmaktadır. Bu dosyalar, yani fixture dosyaları, ilgili paketin {paket_klasoru}/DataFixtures/ORM klasörü altında yer almalıdır (örneğin Dubluve/TestBundle/DataFixtures/ORM). Eğer MongoDB kullanmayı düşünüyorsanız  {paket_klasoru}/DataFixtures/MongoDB altında dosyaları tutmalısınız. Yükleyeceğiniz dosyanın adı önemli değil, fakat anlamlı olması açısından, örneğin User nesnesi için LoadUserData.php  olarak isimlendirebilirsiniz. Peki dosyayı yarattık, içeriği nasıl oluşturacağız? Birçok uygulamada temel ihtiyaç olan kullanıcı nesnesine, geçerli bir kullanıcı için test verisi oluşturalım. Nesnemiz User, sahip olduğu özellikler username ve password ve daha önceden {paket_klasoru}/Entity altında ilgili sınıfı yaratmış olalım. Örnek kod aşağıdaki gibi olmalı:
// src/Dubluve/TestBundle/DataFixtures/ORM/LoadUserData.php   namespace Dubluve\TestBundle\DataFixtures\ORM;   use Doctrine\Common\DataFixtures\FixtureInterface;   use Dubluve\TestBundle\Entity\User;   class LoadUserData implements FixtureInterface {     public function load($manager) {       $userAdmin = new User();       $userAdmin->setUsername('admin');       $userAdmin->setPassword('test');       $manager->persist($userAdmin);       $manager->flush();     }   }
User nesnesi ve benzer nesneler için fixture sınıfları oluşturduktan sonra tüm bu değişiklikleri veritabanına uygulamak için aşağıdaki komutlardan, mongodb kullanıyorsanız 2. komutu, yoksa sadece ilkini çalıştırıyoruz:
php app/console doctrine:fixtures:load  php app/console doctrine:mongodb:fixtures:load

Meraklısına Detaylar

Yukarıdaki örnek basit anlamda fixture kullanımını anlatıyor. Fakat veritabanınızda muhtemelen birbiriyle ilişkili birçok nesne olacak ve bunları birbiriyle ilişkilendirerek veritabana girmek isteyeceksiniz. Bunun için DoctrineFixtures paketine ilişki kurma ve ard arda fixture çalıştırma özellikler bulunuyor. Aşağıdaki örnekte ilk olarak kullanıcı tablosuna ve kullanıcı grubu tablosuna birer kayıt ekleyip, ara tabloda ilişkilendireğiz.
  // src/Dubluve/TestBundle/DataFixtures/ORM/LoadUserData.php  namespace Dubluve\TestBundle\DataFixtures\ORM;    use Doctrine\Common\DataFixtures\AbstractFixture;  use Doctrine\Common\DataFixtures\OrderedFixtureInterface;  use Dubluve\TestBundle\Entity\User;    class LoadUserData extends AbstractFixture implements OrderedFixtureInterface  {      public function load($manager)      {          $userAdmin = new User();          $userAdmin->setUsername('admin');          $userAdmin->setPassword('test');            $manager->persist($userAdmin);          $manager->flush();            $this->addReference('admin-user', $userAdmin);      }        public function getOrder()      {          return 1; // the order in which fixtures will be loaded      }  }
Yukarıdaki sınıfta, daha önceki fixture sınıfından farklı olarak getOrder() fonksiyonunu görüyoruz. Bu fonksiyon, yeni kullanıdığımız  AbstractFixture sınıfından miras geliyor ve fixture sınıfının hangi sıralamada çalıştırılacağını ifade ediyor. Fonksiyondan 1 değerinin dönmesi, ilk olarak bu fixture sınıfının çalıştırılacağını belirtiyor. Yine farklı bir satır olan $this->addReference('admin-user', $userAdmin) satırı bu fixture sınıfında $userAdmin nesnesini kullanarak veritabanına kaydettiğimiz kayıt için bir referans oluşturuyor. Bu referansı daha sonra başka bir fixture sınıfında kullanacağız. Kullanıcı grubu için yaratacağımız fixture sınıfı da şu şekilde:
// src/Dubluve/TestBundle/ORM/LoadGroupData.php  namespace Dubluve\TestBundle\DataFixtures\ORM;    use Doctrine\Common\DataFixtures\AbstractFixture;  use Doctrine\Common\DataFixtures\OrderedFixtureInterface;  use Dubluve\TestBundle\Entity\Group;    class LoadGroupData extends AbstractFixture implements OrderedFixtureInterface  {      public function load($manager)      {          $groupAdmin = new Group();          $groupAdmin->setGroupName('admin');            $manager->persist($groupAdmin);          $manager->flush();            $this->addReference('admin-group', $groupAdmin);      }        public function getOrder()      {          return 2;      }  }
Son olarak da referans oluşturduğumuz bu iki kayıt için ara tabloya kayıt yaratacak fixture sınıfını oluşturuyoruz:
// src/Dubluve/TestBundle/DataFixtures/ORM/LoadUserGroupData.php  namespace Dubluve\TestBundle\DataFixtures\ORM;    use Doctrine\Common\DataFixtures\AbstractFixture;  use Doctrine\Common\DataFixtures\OrderedFixtureInterface;  use Dubluve\TestBundle\Entity\UserGroup;    class LoadUserGroupData extends AbstractFixture implements OrderedFixtureInterface  {      public function load($manager)      {          $userGroupAdmin = new UserGroup();          $userGroupAdmin->setUser($manager->merge($this->getReference('admin-user')));          $userGroupAdmin->setGroup($manager->merge($this->getReference('admin-group')));            $manager->persist($userGroupAdmin);          $manager->flush();      }        public function getOrder()      {          return 3;      }  }
Bu sınıfları yarattıktan sonra yukarıda yaptığımız gibi ilgili konsol komutunu çalıştırıp, bu kayıtları veritabanına kaydedebiliriz. Zevkle yazılım geliştireceğiniz günler dilerim! Devamı için : Symfony 2 - Veritabani Icin Baslangic Verileri Olusturmak - Doctrine Fixtures

19 Ocak 2012 Perşembe

E-ticaret Yazılımı ve Turkiye

E-ticaret Dünya çapında çok büyük geliştime gösteren sektörlerden biri. İnternetin yayılmasıyla birlikte de Türkiye'de de geçtiğimiz 10 yıl boyunca çok büyük bir gelişme dönemi söz konusuydu. Bu 10 yılın ilk kısımlarında şu an bilinen büyük eticaret siteleri (markaları) ortaya çıktı. Son kısımlarında ise (yaklaşık 5 yıllık yani 2006 - 2012 arası) altyapılar için önemli bir gelişim periyodu idi. Dünya genelinde şu anda kullanılan açık kaynak eticaret yazılımları mevcut. Bunları alıp kullanmak için para ödemenize gerek yok. (Yazılımsal bir lisans ücreti yok.) Sistem ve kod bilginiz belirli bir düzeye kadar var ise, kendiniz bu işi becerebiliyorsunuz. Tasarım konusunda da hazır şablonlardan kullanıp, ihtiyacınızı karşılayabiliyorsunuz. Dünyada bir çok firma da kendi eticaret yazılımlarını kendi çalışanlarına yazdırıyor. Bu da onlara tamamen özel olan bir altyapı sunmuş oluyor. İhtiyaçlarını tam olarak karşılayabiliyorlar. Tabi ki doğru kişlerle çalışıyorlar ise.. Ayrıca bunun maliyeti de (hem süre olarak hem para olarak) çok çok yüksek oluyor. Yine dünya genelinde e-ticaret altyapı hizmeti anlayışı mevcut. Eğer kod curcunası ile kendiniz uğraşmak istemeyip de bu hizmeti satın almak isityorsanız bunun da bir çok örneği mevcut. Burada bir parantez açarak belirtmek istiyorum, bu açık kaynak kodlar %95 yabancı kökenli insanlar tarafından yazıldığından, Türkiye şartlarındaki kredi kartı altyapılarıyla alakasız olduklarından, bu desteği veremiyor, bunu kendiniz yazmanız veya yazdırmanız lazım eğer kredi kartı altyapısı kullanmak istiyorsanız. Ayrıca yabancı zihniyeti Türk halkının zihniyetinden çok farklı. Yabancı bir E-ticaret programında amacınız 50-100 ürünü hızlıca satışa sunmak, ve bunları güzel bir şekilde sergilemek iken, Türk halkı bu noktada farklı isteklerde bulunabiliyor. Bunlardan bazıları şunlar : Ürün entegrasyonu : Tedarikçisinden edindiği ürün bilgileri dosyasını bir kerede sistemlerine yükleyebilmek. Topluca işlem yapmak : Yabancı bir eticaret programında yapamayacağı türden, her türlü işlemi topluca yapmak. Topluca fiyat değiştirmek, topluca işlemleri vb.. Bu topluca işlemler her ne kadar hız kazandırsa da hakimiyeti azaltan faktörler arasında. Bazı ilginç ek ayarlar Bu ayarlar içinde bir adet bloğun içinde hiç alakasız sistematik bir "-" karakterinin "_" ile değiştirilmesini istemek dahi olabiliyor. Bunun ayar olup ileride değiştirmek istediğinde değişterbilmek istediğini de ayrıca belirtiyor. Benim düşüncem yabancı e-ticaret yazılımları türkiye'dekilerin eline su bile dökemez. (Yazılım kalitesi konusunda değil çünkü halen ASP kullanan yazılımlar mevcut, yazılımın işlevselliği ve kapsamı konusundan bahsediyorum) Paket yazılımlarda müşterilerin isteklerinin bir çoğu yapılmasına karşın yine bu isteklerin ardı arkası kesilmiyor. Yabancı paketler ise bir standart belirleyip, bunun üzerinden gitmek konusunda çok kararlılar. Bu konuda çok esnek olmayan bir altyapıları, esnek gözüken (ama yine bir çok şeyi yapamadeığınız) tasarım altyapıları mevcut. Türkiye'de hali hazırda kullanılan paketler mevcuttur, fakat yeni paket yazılım üreticileri de sektöre bir yerden girebilmek için fiyatları kırarak, hizmet kalitesini düşük tutup bunu standartmış gibi sunarak, piyasaya girmeye çalışıyor. Yine de almadan önce son kararı verecek kişinin, müşteri sayısı, hizmet kalitesi, referanslar ve piyasadaki duyulmuşluğa göre hareket etmesini tavsiye ederim. Ayrı bir konu olarak da halkımıza Türk malı ürünleri tercih etmesini rica ederim. %100 TÜrk firması olan Ve çok kaliteli hizmet veren firmalar mevcut. Çok büyük referansları var. Bunları tercih etmelerini öneririm. Hele de yurtdışından gelip, Türk halkının dilinden anlamayan, İhtiyaçlarını kaşılamayan, "Çok basit çok kolay" diye aslında eksik özellikli olan ürünleri tercih etmeyiniz. Benim görüşüm, bakkallar dahi e-ticaret yapana kadar bu sektör büyümeye devam edecek. Umarım halkımız için güzel gelişmeler olur ve yine kazanan Türkiye olur deyiyor ve yazımı noktalıyorum. Ek bilgi : Eğer bu yazıya denk gelip de e-ticaret neymiş, e-ticaret yapalım mı? diye sorular oluşuyorsa aklınızda, piyasayı biraz araştırınız. Google'da eticaret kelimesinde güzel bir rekabet mevcut. Bazı büyük Türk eticaret hizmeti altyapı firmaları ise şöyle : IdeaSoft - http://www.eticaret.com Neticaret - http://www.neticaret.com/ Kobimaster - http://www.kobimaster.com/ HemenAl - http://www.hemenal.com/ Devamı için : E-ticaret Yazılımı ve Turkiye