31 Ocak 2012 Salı
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 kurulumu24 Ocak 2012 Salı
LEFT JOIN, INNER JOIN kullanımı (examples)
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...

22 Ocak 2012 Pazar
Symfony 2 - Veritabani Icin Baslangic Verileri Olusturmak - Doctrine Fixtures
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/DoctrineFixturesBundleBu 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 installEğ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
Linux CPU bilgileri komutu (CPU info command)
$ less /proc/cpuinfogrep komutu ile de sonuçları kısıtlayarak gösterebilirsiniz. bunun için de örneğin
$ grep processor /proc/cpuinfoyazıp sadece processor ile ilgili satırları ekrana yazdırabilirsiniz. Bilgi : Linux Bu işlemler için /proc/cpuinfo dosyasını kullanır. Devamı için : Linux CPU bilgileri komutu (CPU info command)
18 Ocak 2012 Çarşamba
Adım Adım Zend Framework - Genel
Facebook ve Heroku
Microsoft Windows 8 ve Yeni Dosya Sistemi ReFS
17 Ocak 2012 Salı
Mysql Replace Komutu (Command)
UPDATE tablo SET metin= REPLACE(metin, 'eski','yeni');Burada yeni veriyi bir yerden çekmek istiyorsanız da 'yeni' yazan yere select querysi yazabilirsiniz. şöyle :
UPDATE tablo SET metin= REPLACE(metin, 'eski',Select....);Devamı için : Mysql Replace Komutu (Command)
16 Ocak 2012 Pazartesi
TBMM de Özgür Yazılım ve Pardus Projesi
Hangi port kullanimda - TCPView

14 Ocak 2012 Cumartesi
trap.it
SSL Nedir?
Memcache in Telnet ile kullanımı
memcached -m 128 -l localhost -p 11211 -d -u nobodyyazarak başlatabilirsiniz. (bu kod 128 MB ram ile 11211. porttan, nobody olarak çalıştırır.) Yine konsoldan
telnet localhost 11211yazarak bağlanınız. Supported Commands Example get deneme //varsa deneme adlı memcache verisini getirir. set deneme 0 60 5 //koşulsuz olarak deneme verisini set eder add deneme 0 60 5 // deneme adlı yeni bir key oluşturur. replace deneme 0 60 5 // deneme verisinin yerine yenisini yazar. append deneme 0 60 15 // deneme key'inin sonuna veri ekler prepend deneme 0 60 15 // deneme key'inin başına veri ekler incr deneme 2 // değeri sayısal olarak verilmiş deneme değerinin değerini 2 artırır. decr deneme 5 // değeri sayısal olarak verilmiş deneme değerinin değerini 5 azaltır. delete deneme // deneme adlı key i siler. flush_all // bütün belleği boşaltır. flush_all 900 // 900 saniye içindeki tüm verileri boşaltır. stats // genel istatistikleri basar. stats slabs // bellek istatistiklerini basar. stats malloc // bellek istatistiklerini basar. stats items stats details stats sizes // daha yüksek seviyeli atama istatisiklerini basar. stats reset // istatistikleri sıfırlar. version // versiyonu basar. verbosity // loglama seviyesini artırır. quit // telnet oturumunu kapatır. Bunlardan benim telnetten en sık kullandıklarım flush_all ve stats'dır. Diğer konulardaki işlemleri ilgili yazılım dillerinde yaptığımızdan, sadece istatistikleri görmek (kaç istek var kaçı memcacheten okudu, kaçında isabet var vb.. gibi..) benim için telnetten yeterli olabiliyor. Veri set etme ve replace etme olaylarını ben deneme hariç kullanmadım diyebilirim. Yine de ihtiyaç duyulabilir ve kullanılabilir. Devamı için : Memcache in Telnet ile kullanımı
11 Ocak 2012 Çarşamba
internet explorerdan muhteşem reklam

Symfony2 Veritabanı degisiklikler - database migrations
windows memcache kurulumu (windows 7 dahil)
- Php extensions klasörünü kontrol edin. C:\php\ext gibi bir şey olması gerekiyor. (Wamp kullanıyorsanız c:/wamp/bin/php/php5.3.4/ext gibi bir şeydir.) Bu klasörün içinde php_memcache.dll adlı dosyanın olup olmadığına bakın. Yoksa bu dosyayı bir şekilde edinin. Buradan indirebilrisiniz isterseniz : http://downloads.php.net/pierre/php_memcache-2.2.6-5.3-nts-vc9-x86.zip
- Şimdi sistemde kullanılan php.ini dosyanızı bulun. wamp için wamp klasöründe bir yerlerde oluyor. Sağ alttaki wamp simgesine tıklayıp orada php kısmında php.ini ye basınca gelen dosyadır. bu dosyanın sonuna bir yere yeni bir satırda extension=php_memcache.dll yazın kaydedin.
- Apache nizi restart edin.
- memcached.exe yi çalıştırın. Buradan edinebilirsiniz : http://www.splinedancer.com/memcached-win32/ Normalde, memcached.org adresinde de var fakat, compile edilmemiş hali var ve compile etmek için bir sürü teane gerekiyor. İsterseniz oradan kurun. Memcached.exe çalışınca bir siyah pencere açılacak ve orada kalıcak, anormal bişey yok, (servis olarak arka planda çalıştırmak ile farkı yok, birazdan onu da anlatacağım.)
- Aşağıdaki kodu çalıştırın
< ?php $memcache = new Memcache; $memcache->connect("localhost",11211); # varsayılan ayar olarak memcache 11211 protu kullanır. belki localhost yerine 127.0.0.1 yazmanız gerekebilir. echo "Memcache versiyonu: " . $memcache->getVersion() . "
\n"; $tmp_object = new stdClass; $tmp_object->str_attr = "test"; $tmp_object->int_attr = 123; $memcache->set("key",$tmp_object,false,60); echo "Veriyi cache'te sakla.(Veri 60 saniye boyunca cachete tutulacak.)
\n"; echo "cacheten okuduğum değer :
\n"; var_dump($memcache->get("key")); ?> - Ekrana hata yerine yukarıdaki şeyleri görüyorsanız, memcache'iniz çalışıyor demektir. Memcacheinizi denemenizin bir diğer yolu da telnet üzerinden bağlanmaktır. (windowsunuzda telnet hizmetini aktif etmeniz gerekiyor, eğer açık değilse, bu konuyu zorlaştırmamak için burada anlatmıyorum.) cmd'den
telnet localhost 11211
diyeceksiniz. Bağlanırsa, tamam çalışıyordur. (Telnetten memcahce kullanabilemk için de ilgili parametreler vb ile ilgili bir yazı ekleyeceğim) - Extra not : memcached.exe yi arka planda çalışan servis olarak çalıştırmak için cmd yi yönetici yetkisiyle çalıştırın. (ctrl+shift+click). Daha sonra
c:/memcachein_bulunudugu_dizin/memcached.exe -d install c:/memcachein_bulunudugu_dizin/memcached.exe -d start
10 Ocak 2012 Salı
Linux/unix sleep komutu (linux/unix sleep command), örnek (example)
sleep 1h; mail -s "Ahmeti ara!" ben@mailadresim.com1 saat sonra mailime gelen "ahmeti ara" mailiyle birden irkilip, ahmeti aramam gerektiğini hatırlayabilirim. burada 1h deki h harfi hour yanisaat manasındadır. bir şey yazmazsanız saniyedir. (s) dakika için minute yani m harfi kullanmalısınız. Programcılar sleep komutunu genelde belirli bir süre kodu duraklatmak için kullanırlar. Siz de çok yük getirici bir işlem yapıyorsanız, ara sıra diğer kullanıcıların işlemlerini aksattırmamak için sisteme bir nefes aldırmak isteyebilirsiniz, öyleyse kullanın. Devamı için : Linux/unix sleep komutu (linux/unix sleep command), örnek (example)
8 Ocak 2012 Pazar
UML nedir, UML oluşturmak
Mongodb için phpmoadmin
7 Ocak 2012 Cumartesi
Google Appengine ile Proxy(vekil) sunucu oluşturma
Google ile beleş bir proxy yapmaca
1. Adım: appengine.google.com sayfaınsa git ve Google hesabın ile giriş yap. 2. Adım: Create an Application (Uygulama oluştur) tuşuna bas. İlk defa yapıyorsanız, Google cep telefonunuza bir sms atacaktır, doğrulama yapabilmek için. Sms olarak gelen kodu da yazınca bu adım da tamamdır. 3. Adım: bir tane subdomain (altdomain) belirleyin ki, uygulamanıza erişebilin. Bu sizin aynı zamanda uygulama (Application) ID niz olacaktır. 4. Adım: Şimdi ID mizi ayırttırdık, proxy server uygulamamızı oluşturup Google a upload etmemiz gerekiyor. python.org a gidin ve , download the 2.6.4 , 2.7 gibi bir sürümü indirin. (3 lü bir sürüm olmasın). (İşletim sisteminiz ve bit desteğiniz neyse ona göre setup halinde olanını indirin. Windows için MSIInstall olanı indirin). İndirdikten sonra kurun. Klasik, ileri ileri... 5. Adım: Python yüklendiğinde, code.google.com a gidin ve "Google App Engine SDK for Python" (python uyumlu google app engine) i indirin ve yükleyin. Orada java uyumlu bilmemne uyumlu bir sürü appengine var, python uyumluyu indirip yükleyeceksiniz. 6. Adım: Bu zip dosyasını indirin ve masaüstünüze felan bir yere dosyaları çıkartın. Zipin içinde html ve python birkaç text dosyası felan var. (virüs taraması yapın yine de istiyorsanız :) ) 7. Adım: Google App Engine Launcher programını çalıştırın ve edit-> preferences menüleri altında gerekli bilgileri doğru olarak girin. 8. Adım. "File -> Add Existing Application" menüsü altından masaüstünüzdeki klasörü bulun. (6. adımda oluşturduğunuz) Edit tuşuna basın ve oradan Click File –> Add Existing Application ı seçin. Edit tuşuna basıp APP_ID yazısını kendi uygulama ID 'niz ile değiştirin (3. adımda yaptığınız). 9. Adım: Deploy tuşuna basın. Ve artık online proxy serveriniz kullanıma hazır! Buradan benim kendi yaptığım proxy server uygulamasına bakabilirsiniz : dubluve proxy server. main.html yi kendi istekleriniz ölçüsünde düzenleyebilirsiniz. (bildiğiniz html.) Hatta ve hatta kodunuza analytics ve adsense bile koyabilirsiniz. uygulama şu anki haliyle herkese açık ama dilersniez bir kademe ekleyerek sadece googledan giriş yapmış kullanıcıların kullanmasını sağlayabilirsiniz. Html dosyanda değişiklik yaptıysan tekrar deploy tuşuna basınız ki, değişiklikleriniz vuku bulusn :)
Proxy server , Mirrorr kodlarını kullanır, bu Brett Slatkin'in bir açık-kaynak web önbellek projesidir. Devamı için : Google Appengine ile Proxy(vekil) sunucu oluşturma
5 Ocak 2012 Perşembe
Java İpucu #3 – Java Konsoldan Veri Okuma
Java ile ilgili ipucu yazılarıma yine basit ama başlangıç seviyesinde (veya konsoldan çalışan programlar için) çok kullanımı olan bir konuyla devam etmek istiyorum. Bu sefer amacımız konsoldan veri okumak.
Bunun için birçok yöntem mevcut ancak ben sadece ikisinden bahsedeceğim.
İlki Scanner (JRE 1.5 ile geldi) sınıfını kullanarak basit bir kullanıcı girişi;
Scanner s = new Scanner(System.in); System.out.print("Kullanıcı Adı: "); String userName = s.nextLine(); System.out.print("Şifre: "); String password = s.nextLine(); if (checkUserNameAndPassword(userName, password)) System.out.println("Sisteme başarıyla giriş yaptınız."); // Kullanıcı adı ve şifre kontrolü yapar private static boolean checkUserNameAndPassword(String userName, String password) { // bilgileri kontrol et // return true; }
Burada nextLine metodu konsoldayken klavyeden enter tuşuna basılana kadar olan tüm girdileri alır. Scanner sınıfının nextByte, nextInt gibi başka metotları da mevcut. Her zamanki gibi inceleme kısmı size ait :)
Diğer yöntem;
Console c = System.console(); if (c == null) { System.err.println("Konsol erişimi sağlanamadı."); System.exit(1); } String userName = c.readLine("Kullanıcı Adı: "); char[] password = c.readPassword("Şifre: "); if (checkUserNameAndPassword(userName, password)) { System.out.println("Sisteme başarıyla giriş yaptınız."); }
Öncelikle bu yöntemin sadece konsoldan çalıştırılan java uygulamalarında çalışacağını söylemeliyim (örneğin, Windows'ta Komut İstemci'sinde veya Linux'ta Terminal'de). Aksi halde (örneğin, Netbeans'te çalıştırdığınızda), "Konsol erişimi sağlanamadı." uyarısı gözükecektir.
Console (JRE 1.6 ile geldi) sınıfının güzel iki metodu readLine (Scanner sınıfındaki metot ile aynı işi yapıyor) ve readPassword (girilen verinin ekranda gözükmeden girilmesini sağlıyor). Kod parçasının diğer kısmı ilk örnekle aynı. Dikkat edin readPassword metodu karakter dizisi döndürüyor.
İpucu konusu olduğu için yine çok detaya girmemeye çalıştım. Diğer Java İpucu yazılarım için sitenin arama kısmına "Java İpucu", Java makaleleri için "Java Makale" yazarak aratabilirsiniz. Site özellikleri kullanımına teşvik :)
Herkese iyi çalışmalar.
Devamı için : Java İpucu #3 – Java Konsoldan Veri Okumaresimler için dış link koruması (hotlink protection)
RewriteCond %{HTTP_REFERER} !^http://siteadresi.com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://siteadresi.com$ [NC] RewriteCond %{HTTP_REFERER} !^http://siteadresi.com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.siteadresi.com$ [NC] RewriteCond %{HTTP_REFERER} !^https://www.siteadresi.com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^https://www.siteadresi.com$ [NC] RewriteRule .*\.(jpg|jpeg|gif|png|bmp)$ - [F,NC]
Bu kod, tarayıcınızın REFERER bilgisi göndermemesi sonucu yönlendirme anasayfaya yönlendirme sağlar. Normalde güncel browserlar siz bir siteye girdiğinizde, o sitedeki tüm resimleri , cssleri, javascriptleri; ositeadresi.com referer bilgisiyle istemde bulunur Bundan sonra farklı bir önbelleği temizlenmiş browserdan resme doğrudan girmeye çalıştığınızda anasayfaya yönlendirileceksiniz. Deneyebilirsiniz. Not : Apache veya hangi web serveri kullanıyorsanız, .htaccess kullanımının açık olması gerekmektedir.Devamı için : resimler için dış link koruması (hotlink protection)