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

Linux CPU bilgileri komutu (CPU info command)

Linux bir bilgisayarda işlemci bilgilerinize erişmek için terminalden yazacağınız aşağıdaki komut ile cpularınız ve buna bağlı olarak bu cpu ların bilgisini ekrana yazdırabilirisiniz.
  $ less /proc/cpuinfo  
grep komutu ile de sonuçları kısıtlayarak gösterebilirsiniz. bunun için de örneğin
  $ grep processor /proc/cpuinfo  
yazı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

Zend Framework Nedir? Web'i hızlandırmak ve güçlü yapmak için bir framework. PHP nin ana destekçisi tarafından Zend tarafından üretilmiştir. Web 2.0 ve Cloud (bulut) bilişim teknolojilerini destekler. Neden Zend Framework? Ücretsiz ve açık kaynak bir frameworktür. Sadelik, üreticilik, esnek yazılım mimarisi, 300 den fazla katkıda bulunanlar (IBM ve diğer büyük firmalar da dahil) Ayrıca Destek olarak sunulabilen Zend Studio, Zend Server gibi güçlü programlar.. Nereden Edinebilirim? http://framework.zend.com/ adresinden indirebilirsiniz. Burada Frameworku kullanan kişilere de ulaşabilirsiniz. Zend Framework'e ne zaman ihtiyacınız olur? Web'i yeterli miktarda kompleks olarak kullanmak istiyorsanız...   Not şu sayfanın çevirisidir. Zend Framework Basic Tutorial Step By Step Tutorial - PHPEveryDay. Devamı için : Adım Adım Zend Framework - Genel

Facebook ve Heroku

Facebook Applikasyonu (Uygulaması) yazmak günümüzde çok basite indiriliyor. Facebook, Cloud Servis veren Heroku firmasıyla anlaştı. (Birkaç firmayla daha anlaşacak) Öncelikle Heroku nedir? Heroku Bir bulut (cloud) uygulama platformudur. Java, php, python vb gibi dilleri hızlıca geliştirip Scale edebilirsiniz. Böylece server Kurmayla, çalışma ortamı yaratmayla uğraşıp durmanıza gerek kalmayacak ve doğrudan canlı ortam görmüş olacaksınız. Bilgisayarınızda geliştirin, heroku da deneyin! Facebookta da bir uygulama oluşturduğunuzda (https://developers.facebook.com/apps adresinden) artık oradan cloud services kısmından herokuyu seçebiliyorsunuz. Ve Şipşak anında facebook applikasyonunuz elinizde. Bundan sonra yapmanız gereken herokunun heroku toolbelt'ini indirip, git ile birlikte kullanmayı öğrenmek olacaktır. Git dediğimiz şey de versiyon kontrol sistemidir. Konsoldan kullanılabilecğei gibi, Mercurial, Tortoise gibi programlar üzerinden de arayüzlü bir şekilde kullanabilirsiniz. Heroku'ya üye değilseniz facebook applikasyonunuzda herokuyu seçtiğinizde otomatik olarak hesabınızı da oluşturuyor. Siz sadece mailinize gelen instructions'ı okuyun yeter! Başka bir yazıda kullanımını da anlatabilmek isterim. Devamı için : Facebook ve Heroku

Microsoft Windows 8 ve Yeni Dosya Sistemi ReFS

Microsoft Windows 8 ile birlikte gelecek yeni dosya sistemi ReFS'in detaylarını açıkladı. Microsoft, Windows 8 ile sunacağı ReFS (Resilient File System – Esnek Dosya Sistemi) dosya sistemi hakkında detayları açıkladı. Sıfırdan geliştirilmiş olan ReFS, Windows tabanlı depolama alanları ve sistemlerinin bugünkü ve gelecekteki ihtiyaçlarını karşılamak üzere tasarlandı. Büyük hacimleri işleme, bozulmalara karşı sağlamklık, makineler arasında paylaşımlı depolama havuzları gibi özellikler ReFS'in yenilikleri arasında yer alıyor. Ne yazık ki, ReFS sadece Windows Server 8 sürümünün içinde gelecek, yani Windows 8 kullanıcılarının büyük bir kısmı başlangıçta sunulacak iyileştirmelerden yararlanamayacak. Microsoft, bu yeni dosya sistemini Windows 8′in bireysel kullanıcılarına sunmadan önce tamamen test etmeyi amaçlıyor. ReFS diğer dosya sistemleri gibi depolama yığınına basit bir şekilde bağlanıyor. NTFS'in temelleri üzerine kurulmuş olan bu sistem uyumluluk için gerekli şartları koruyor. Microsoft'un detaylandırdığı ReFS ve Depolama Alanları özellikleri Windows 8′de toptan depolama sistemi yenilemesi için birbirini tamamlayacak şekilde geliştirildi. Yeni dosya sisteminin temel avantajları arasında Windows 8′e her türlü disk bozulmalarını algılama, performans için veri şeritleme desteği, copy-on-write olarak bilinen yazma için ayırma yeteneği kazandırması da bulunuyor. Microsoft, SQL Server ürünlerinde ve Hacim Gölgeli Kopyalama Servisinde copy-on-write konseptlerini kullanmış ve büyük veri kümelerinin hızlı görüntülerinin alınmasına izin vermişti. ReFS, çıkarılabilir medyalarda kullanılamayacak, onunla birlikte işletim sistemini başlatmak mümkün olmayacak. Şu an için sadece depolamayla ilgili gibi görünüyor. Microsoft bu yeni dosya sisteminin yukarıda da belirttiğimiz gibi Windows Server 8′in bir paröası olacağını söylüyor. Ancak Windows 8 istemcileri de, gelecekte bireysel Windows işletim sistemleri tamamen desteklenene kadar ReFS hacimlerine erişme ve okuma hakkına sahip olacak. Devamı için : Microsoft Windows 8 ve Yeni Dosya Sistemi ReFS

17 Ocak 2012 Salı

Mysql Replace Komutu (Command)

Mysqlde bir tablo içindeki verileri değiştirmek istediğinizde, bunu Update ile yaparız. Topluca eski olan verileri yenileriyle değiştirmek istediğimizde ise bunu yapabilmenin yönetimi mysql replace komutunu kullanmaktır. Özellikle encoding ile ilgili problem yaşayanlar Ç harflerini C ile Ğ harflerini G ile değiştirmek isteyebilirler. Bizim karşılaştığımız durum da bu idi zaten. Nitekim kullanımı çok basit, şöyle:
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

TBMM'de Özgür Yazılım ve Pardus Projesi "Türkiye'de Bilişim Sektörünün Yaşadığı Sorunlar Hakkında" gündem dışı olarak söz isteyen İzmir Milletvekili Erdal Aksünger'ün konuşması aşağıda yer almakta. Bu konuşma, meclis kürsüsünden "Özgür Yazılım" ile ilgili (benim bildiğim kadarıyla) yapılan ilk konuşma olması açısından önemli. Konuşmayı dinleyen milletvekillerinin ne kadarı bu konuşmanın içeriğini kavrayabilmiştir tam olarak bunu bilebilmek mümkün değil, ümit ediyorum ki bir farkındalık yaratılabilmiş olsun. Yazı alıntıdır. Daha da uzundur, okumanızı tavsiye ederim. http://www.madran.net/2012/01/tbmmde-ozgur-yazilim-ve-pardus-projesi/ Devamı için : TBMM de Özgür Yazılım ve Pardus Projesi

Hangi port kullanimda - TCPView

TCPView İçerisinde soket programlama barındıran program yazanlar için büyük problemdir halihazırda bağlı olan porta bağlanmak istemek. Bazen programınız ısrarla o porta bağlanmak istemez. Cevap bellidir: "x portu kullanımda!". Çoğu zaman sinir etmiştir beni bu durum. TCPView Windows için harıl harıl kullanılan portları gösteren bir program aramışımdır. Komut satırından halihazırda görülebiliyor ama görselliği çok iyi olmadığı ve kullanımı çok kolay olmadığı için sevmiyorum. Bunun üzerine yeni bir program keşfettim: TCPView. Microsoft'un küçük programcığı, halihazırda bağlantıların hangi program tarafından, hangi portlar kullanılarak yapıldığını, karşı tarafın IP'lerini gösteren şükela bir programcık. Tamam tamam hakkını yedim, gayet de program. Basit ve kullanışlı bir arayüzü de var. Tavsiye ederim... Devamı için : Hangi port kullanimda - TCPView

14 Ocak 2012 Cumartesi

trap.it

Trap.it size ilgi alanlarınıza göre kişiselleştirilmiş haber ve içerik sağlar. Nasıl? Yeni web uygulaması Trapit, haber okumada yeni bir dönem olarak nitelendiriliyor. İlgilendiğiniz alanları "traps" kısmından ekleyin. Gerisi Trapit'e kalmış. Trapit size seçmiş olduğunuz başlıklara göre filtrelenmiş haber ve içerik sağlar. Okudukça ve beğenme butonuna bastıkça da Sizi öğrenerek, Tam istediğiniz tür şeyleri önünüze getirecektir. Ayrıca? Geniş bir alanda kategori , tip ve başlık seçebilirsiniz. Bir haber okuduğunuzda onu beğenerek Trapit e kendinizi öğretebilirsiniz. Daha sonra okumak için haberlerinizi bir okuma listesine de gönderebilirsiniz. Facebookta sağda solda paylaşma zaten herkeste var. Bunda da var. Sonuç olarak Bu kişiselleştirilmiş haber okuyucusu rss lerinizi yönetirken en mantıklı uygulamanız olabilir. İlgisini çekenlere buraya alalım : trap.it Extra not : Üye olurken facebook hesabımla bağlanacağım diyelim, Her izni istiyor benden. Vermek istemiyorum arkadaşım? Devamı için : trap.it

SSL Nedir?

SSL Nedir? İnternette gezinirken veri güvenliği için SSL (Secure Socket Layer) güvenli soket katmanı ne manaya gelir? SSL  ağ üzerinde veri transferi sırasında güvenlik ve gizliliğin sağlanması amacıyla Netscape tarafından geliştirilmiş bir güvenlik protokolüdür. 1996 yılında 3.0 versiyonunun çıkarılmasıyla hemen bütün Internet tarayıcılarının (Microsoft Explorer, Netscape Navigator vb) desteklediği bir standart haline gelmiş ve çok geniş uygulama alanları bulmuştur. SSL gönderilen bilginin kesinlikle ve sadece doğru adreste deşifre edilebilmesini sağlar. Bilgi gönderilmeden önce otomatik olarak şifrelenir ve sadece doğru alıcı tarafından deşifre edilebilir. Her iki tarafta da doğrulama yapılarak işlemin ve bilginin gizliliği ve bütünlüğü korunur. Veri akışında kullanılan şifreleme yönteminin gücü kullanılan anahtar uzunluğuna bağlıdır. Anahtar uzunluğu bilginin korunması için çok önemlidir. Örneğin; 8 bit üzerinden bir iletimin çözülmesi son derece kolaydır. Bit, ikilik sayma düzeninde bir rakamı ifade eder. Bir bit, 0 veya 1 olmak üzere 2 farklı değer alabilir. 8 bit ise sadece 28=256 olası farklı anahtar içerir. Bir bilgisayar bu 256 farklı olasılığı sıra ile inceleyerek bir sonuca ulaşabilir.  Yani 1 sn den çok daha az bir sürede tüm ihtimaller hesaplanabilir ve doğru anahtar bulunarak şifre kırılabilir. SSL protokolünde 40 bit ve 128 bit şifreleme kullanılmaktadır. 128 bit şifrelemede 2128 değişik anahtar vardır ve bu şifrenin çözülebilmesi çok büyük bir maliyet ve zaman gerektirir. Kötü niyetli bir kişinin 128 bit'lik şifreyi çözebilmesi için 1 milyon dolarlık yatırım yaptıktan sonra 67 yıl gibi bir zaman harcaması gerekir. (bu süre ve maliyet teknoloji ilerledikçe azalmaktadır tabi ki..) Bu örnekten anlaşıldığı gibi SSL güvenlik sistemi tam ve kesin bir koruma sağlar. Yine de hackerlar çok güçlü şifreleri kırmak için hep basit ve alternatif yönetmleri incelerler. kimse 67 milyon dolarlık bir yatırım yapmaz tabi ki. Bunun yerine bilgisayarınıza bir virüs yüklemeyi tercih ederler. Sosyal medya ilerledikçe, sistemler insanların alışkanlıklarını tuttukça, benim hangi sitelere ne veri yazacağım da ileride tahmin edilebilir bir hale dönüşebilir. O yüzden kişinin kendine güzel prensipler belirleyip, her siteye farklı şifre vb kullanması her geçen gün daha önemli olacaktır. Devamı için : SSL Nedir?

Memcache in Telnet ile kullanımı

Memcache'in telnet üzerinden kullanımı. Linux işletim sisteminde de ps -ef komutuyla memcache'in hangi porttan çalıştığını görebilirsiniz. Memcache başlamadıysa konsoldan
  memcached -m 128 -l localhost -p 11211 -d -u nobody  
yazarak başlatabilirsiniz. (bu kod 128 MB ram ile 11211. porttan, nobody olarak çalıştırır.) Yine konsoldan
  telnet localhost 11211   
yazarak 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

Internet explorer 6 da yaşanan hadiseyi herkes biliyordur herhalde. Bilmeyenler için hatırlatayım, microsoft kendisi bir açıklama yapmıştı ve sistemlerinde açık olduğundan dolayı "geçici bir süre başka bir browser kullanın" diye bir tavsiyede bulunmuşlardı. (Buyrun hackleme videsounu buradan seyredin : http://vimeo.com/8771582 )Bu gerçekten internet explorer'ı geliştiren microsoft için utanç verici olsa gerek. Şimdi de bir sitede tepede banner reklam gördüm. Internet explorer 9 a ait. Gördüğüm muhteşem reklam da şu : 5 kat daha güvenli demek. Gülerim ancak... Birlikte gülelim istedim. Devamı için : internet explorerdan muhteşem reklam

Symfony2 Veritabanı degisiklikler - database migrations

Bir süredir PHP framework'u Symfony2 ile ilgileniyorum. Daha önceki versiyonlarında biz yazılım geliştiricilerin hayatını kurtaran özellikleri olan Symfony2, yeni versiyonuyla daha performanslı, daha basit ve daha esnek bir yapıyla karşımıza çıkıyor. Her ne kadar eski versiyonda olan admin-generator gibi muhteşem araçları henüz "resmi" olarak içermese de (bazı geliştiricilerin yüklenebilir ek paketleri var), yeni projelerimizi Dubluve olarak Symfony2'de geliştirme kararı aldık :) Daha önceden Ruby On Rails'ta kullandığım ve çok faydalı bulduğum "database migrations" özelliğinin Symfony2'nin resmi paketlerinden biri olduğunu öğrendiğimde gerçekten çok sevindim. Database migrations, veritabanında sık sık değişiklik olan projelerde, bu değişikliklerin takibini kolaylaştıran ve değişiklikleri tek tek uygulamayı ve geri almayı sağlayan bir özelliktir. Her yapılan değişiklik için bir migration kaydı (Symfony2'de bu kayıt bir PHP sınıfı, Ruby On Rails'te Ruby sınıfıdır) oluşturulur. Bu sınıfta genel olarak iki farklı fonksiyon yardımıyla yapılan değişiklik ve geri alma işlemleri tanımlanır. Kurulum Symfony2'de database migrations özelliğini kullanmak için DoctrineMigrationsBundle isimli paketi kurmak gerekiyor. Hali hazırda çalışan bir Symfony2 projemiz olduğunu varsayarak, bu paketi kurabilmek için deps dosyasına aşağıdaki satırları ekliyoruz: [doctrine-migrations] git=http://github.com/doctrine/migrations.git [DoctrineMigrationsBundle] git=http://github.com/symfony/DoctrineMigrationsBundle.git target=/bundles/Symfony/Bundle/DoctrineMigrationsBundle Daha sonra paket kurulumunun başlaması için, komut satırında proje klasörüne geçiyor ve tüm paketlerin güncellenmesi için ilgili komutu çalıştırıyoruz. Projenin D:\ diskinde olduğunu vekullandığımızı varsayıyorum: cd d:\wamp\www\{proje_klasoru} php bin/vendors install Paket kurulumu tamamlandı, fakat şu an bu paketi projemizde kullanamıyoruz. Paketi projede kullanabilmek için önce bu paketin ait olduğu namespace'i projemizin görmesini sağlamalıyız. Bunun için projemizin app klasöründe yer alan autoload.php dosyasına aşağıdaki şekilde ekleme yapıyoruz: $loader->registerNamespaces(array( //... 'Doctrine\\DBAL\\Migrations' => __DIR__.'/../vendor/doctrine-migrations/lib', 'Doctrine\\DBAL' => __DIR__.'/../vendor/doctrine-dbal/lib', )); Bu fonksiyonda başka satırlar da mutlaka olacaktır. Biz ek olarak DoctrineMigrationsBundle paketini bir namespace ile de yüklenmesini sağladık. Bu iki satırdan 'Doctrine\\DBAL' ile başlayan satırı zaten array içerisinde görebilirsiniz, eğer mevcut ise eklemenize gerek yok. Önemli bir nokta: 'Doctrine\\DBAL\\Migrations' ile başlayan satırı, 'Doctrine\\DBAL\\' ile başlayan satırdan mutlaka önce kullanmanız gerekiyor. Bu fonksiyonda namespace'ler listedeki sırayla kayıt edildiğinden, eğer 'Doctrine\\DBAL\\' satırını daha önce belirtirseniz, 'Doctrine\\DBAL\\Migrations' satırındaki namespace kayıt edilmeyecektir, Symfony bunu 'Doctrine\\DBAL\\' namespace altında kabul edecektir. Namespace kaydını tamamladık, şimdi paketi yüklenecek paketler listesine eklememiz gerekiyor. Yine app klasöründeki AppKernel.php dosyasına şu şekilde ekliyoruz: public function registerBundles() { $bundles = array( //... new Symfony\Bundle\DoctrineMigrationsBundle\DoctrineMigrationsBundle(), ); } Paket Kullanımı Paketle ilgili tüm ayarlar bitti, şimdi biraz kullanımdan bahsedelim. Öncelikle belirtelim ki, DoctrineMigrationsBundle paketi, Symfony2'yi komut satırından kullanırken bize ek komutlar sağlıyor. Bu da tabii ki migration kullanmak için büyük kolaylık sağlıyor. Windows komut satırında, projemizin klasöründeyken, aşağıdaki komutu çalıştırarak yeni migration komutlarını görebiliriz: php app\console | find "migrations" Bu komutlardan örneğin "status", bize şu anki durum hakkında bilgi verir: $ php app\console doctrine:migrations:status == Configuration >> Name: Application Migrations >> Database Driver: pdo_mysql >> Database Name: {veritabani_adi} >> Configuration Source: manually configured >> Version Table Name: migration_versions >> Migrations Namespace: Application\Migrations >> Migrations Directory: D:\wamp\www\{proje_klasoru}\app/DoctrineMigrations >> Current Version: 2012-01-10 09:00:34 (20120110090034) >> Latest Version: 2012-01-10 09:00:34 (20120110090034) >> Executed Migrations: 2 >> Available Migrations: 2 >> New Migrations: 0 DoctrineMigrationsBundle paketi, hangi değişikliklerin yapıldığını, şu an projenin hangi değişiklik versiyonunda olduğunu, veritabanında kendi tablolarında tutuyor. Yani tablo değişiklikleri için bir nevi versiyon kontrolü sistemi oluşturuyor. İlk yüklemeden sonra, paketin kendi tabloları henüz veritabanında olmadığı için, bu tabloları oluşturmak gerekiyor. Bu tabloları oluşturmak için komut satırında aşağıdaki komutları çalıştırıyoruz: php app\console doctrine:migrations:diff php app\console doctrine:migrations:migrate Yeni Migration Yaratmak Paket tabloları yaratıldı. Artık migrations kullanarak tablolarımızda değişiklikler yapabileceğiz. O zaman hemen bir migration sınıfı yaratalım ve içeriğini inceleyelim :) Yine komut satırında aşağıdaki komutu çalıştırıyoruz: php app\console doctrine:migrations:generate Yeni bir migration dosyası ve sınıfı projemizin app\DoctrineMigrations klasöründe yaratılmış oldu. Bu dosyada up() ve down() isminde iki fonksiyon bulunuyor. Bu fonksiyonlardan up() ilgili migration uygulandığında yapılacak değişikliği, down() ise bu değişiklik geri alındğında yapılması gerekenleri içeriyor. Bir migration dosyasının içeriği örneğin şu şekilde olabilir: addSql('CREATE TABLE addresses (id INT NOT NULL, street VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB'); } public function down(Schema $schema) { $this->addSql('DROP TABLE addresses'); } } Her bir veritabanı değişikliği için yeni bir sınıf üretmek ve ilgili komutları burada tutmak biraz zor gelebilir. Fakat asıl güzel nokta burada ortaya çıkıyor: Symfony2'de veritabanı değişiklikleri otomatik tespit edilerek ilgili migration dosyası otomatik yaratılıyor. Mesela yeni bir alan ekledik, bunu ilgili entity sınıfına ekliyoruz, fakat migration oluşturmuyoruz. Komut satırından php app\console doctrine:migrations:diff komutunu çalıştırdığımızda, veritabanının mevcut hali ile entity sınıfları karşılaştırılıyor ve değişiklikler migration sınıfı olarak otomatik generate ediliyor. Bize sadece php app\console doctrine:migrations:migrate komutunu çalıştırmak ve yeni değişiklikleri uygulamak kalıyor. Eski Bir Migration Anına Dönmek Projemizin ilerleyen safhalarında, yaptığımız bazı değişiklikleri geri almamız gerekirse, istediğimiz herhangi bir ana dönmek de oldukça kolay. Yaratılan migration sınıflarının özel bir isimlendirme metodu olduğun fark etmişsinizdir. Bu sınıflar Version{migration_id}.php olarak oluşturulurlar. Buradaki migration_id ilgili değişikliği tekil olarak temsil eder. Eski bir migration anına (örneğin 20120110085916) dönmek için aşağıdaki komutu komut satırında çalıştırmak yeterli: php app/console doctrine:migrations:migrate 20120110085916 İşte bu kadar kolay! Hem database migration tanımıyla yeni tanışanlar, hem de daha önceden Ruby on Rails gibi framework'lerde bu özelliği kullanmış olanlar için umarım faydalı olmuştur. Zevkle yazılım geliştireceğiniz günler dilerim! Devamı için : Symfony2 Veritabanı degisiklikler - database migrations

windows memcache kurulumu (windows 7 dahil)

Memcache modülünün Windows üzerinde çalışan php-apache üzerine kurulması :
  1. 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
  2. Ş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.
  3. Apache nizi restart edin.
  4. 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.)
  5. 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")); ?>
  6. 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)
  7. 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  
Ve windowsunuza memcache kurdunuz. Şimdi yapmanız gereken bir kaç uygulama geliştirip, memcache'in avantajlarını keşfetmek. Memcache günümüzde bir çok büyük firtma site vb tarafından stabil bir şekilde kullanılıyor. Bunlara da başka bir yazıda değinmek dileğiyle. Devamı için : windows memcache kurulumu (windows 7 dahil)

10 Ocak 2012 Salı

Linux/unix sleep komutu (linux/unix sleep command), örnek (example)

Sleep komutu, beklemek manasına geliyor. Tek yaptığı iş beklemek. Beklemenin ne gibi bir işe yaradığını ile ancak birazcık işin içine girmiş olanlar bilebilir diyorum. Bazı şeylerin yapıldığından emin olmak, bittiğinden emin olmak için, veya void metodlardan yanıt alınmayacağı durumlarda, istatistiksel olarak ne kadar sürdüğünü bilenler, bu komutu kullanabilirler. Linux gurusu olan biri, bir hatırlatıcı olarak bile kullanabilir bu komutu. Küçük bir örnek olarak
  sleep 1h; mail -s "Ahmeti ara!" ben@mailadresim.com  
1 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

Unified Modeling Language (Birleşik Modelleme Dili), belirli bir syntax kuralına sahip olmadan yapcağınız programı veya kodu görsel olarak modellemenizi sağlayan, ve bu görsel üzerinden gidilerek herhangi bir dilde o kodun yazılmasını sağlayan genel bir dildir. UML yazılımın temellerinden biridir demesem de, bilinse süper olur diyebilirim. Classlar, metodlar, değişken isimleri, ilişkiler, hangi class neyle ilgili neyi kullanıyor, neyi extend ediyor, nasıl davranıyor bu şematik modelden bakılarak rahatlıkla anlanabiliyor. Günümüzde de UML in önemi yüksek derecededir. Bir kod yazmadan önce önüne bir kağıt kalem bile almadan direkt olarak koda veya veritabanı mimarisine giren bir çok programcı-yazılımcı var. Halbuki düzgün çıkarılmış bir UML sonrasında gerisi sadece yazmak. Yani işin düşünme kısmının UML üzerinde yapılması, gerisinin sadece "yazmak" tan ibaret olduğunu belirtmek istiyorum. UML öğrenmek için Google'da bir çok kaynak bulabilirsiniz. Ben burada hızlıca UML oluşturmak için bir site önermek istiyorum. Bununla hızlı sonuç alabilirsiniz. Tabi UML'deki neyin ne manaya geldiğini de analyarak yapmanızda fayda var. UML diyagramı oluşturun, sadece saniyeler içinde. Devamı için : UML nedir, UML oluşturmak

Mongodb için phpmoadmin

Php ile mysql in yönetim toolu olan phpMyAdmin den sonra şimdi de mongo db için de bir php toolu yapmışlar. Adı phpmoadmin. PhpMyadmin kadar geniş kapsamlı ve kullanışlı olmasa da işinizi görebilecek özelliklerin hepsine sahip. Tabi ki Windows ortamında mongod.exe yi çalıştırdktan sonra girebiliyorsunuz. İşinize yarayacağını düşünüyorsanız, tek dosya. Çok pratik. http://www.phpmoadmin.com adresinden indirebilirsiniz. Devamı için : Mongodb için phpmoadmin

7 Ocak 2012 Cumartesi

Google Appengine ile Proxy(vekil) sunucu oluşturma

Aslında Google üzerinde küçük bir arama ile nasıl proxy server kurulacağına dair bir sürü kaynak bulabilirsiniz. Ben bu yazıda google'ın appengine'ini kullanarak bir proxy (vekil) sunucu yapmaktan bahsediyorum. Bu sayede çok fazla teknik bilmeden de bu işi yapabileceksiniz. (sevmem bu deyimi ama neyse.. )

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ımBu 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 Okuma

resimler için dış link koruması (hotlink protection)

Sitenizdeki resimleriniz dış bağlantılar tarafından mı kullanılıyor? İnternet sitenizin bant genişliğinizi mi sömürüyorlar? Buna engel olmanın vakti geldi diyorsanız işiniz basit. Aşağıdaki kodu ana dizininizdeki .htaccess dosyanızın içine koyun. (yoksa oluşturun)
  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)

4 Ocak 2012 Çarşamba

Linux / Unix Top Komutu Parametreleri (Top Command Parameters)

Linux / Unix Top komutu

hakkında bişeyler yazmak istedim. top - En yüksek işlemci (CPU) kullanan işlemleri gösterir. Komut satırındayken top yazıp enter'a basın. orada değişken bir şekilde çalışan işlemleri görebileceksiniz. Bu noktada d(delay) gecikme parametresidir. top komutu çalışırken d'ye (veya s'ye) basıp 2 ve enter'a bastığınızda, top komutundaki şlemler 1 saniyede bir yenilenir. 1 yazarsanız da her saniye yenilenir. KOMUT SATIRI SEÇENEKLERİ -d 2 Ekran yenilenmesi arasındaki gecikmeyi belirler. Bunu top çalışrıken s veya d ye basarak da değiştirebilirsiniz. -p işlem id si verilen işlemleri takip eder. 20 taneye kadar id verilebilir. -q ekranı sürekli yeniler. arasına d parametresindeki gibi süre koymaz. Super bir kullanıcıda top bu şekilde çalışabilir. -S Specifies cumulative mode, where each process is listed with the CPU time that it as well as its dead children has spent. This is like the -S flag to ps(1). See the discussion below of the S interactive command. -s top komutunu güvenli modda çalıştırır. Bazı interactive komutları kullanım dışı bırakır. -i Top komutunun zombie(dead) veya bekleyen(idle) işlemleri umursamamasını sağlar. -H tüm işlemleri (threadleri) gösterir. -n iterasyon sayısı. Bu kadar işlemden sonra top'tan çıkılır. (top -n 3 dersek, 3 yenilemeden sonra top komutu sona erer) -b yığın modu. Diğer programlara veya bir dosyaya çıktı göndereceği zaman kullanışlıdır. Bu modda, top komut satırından girdi kabul etmez. bitene kdar veya siz onu durduna kadar çalışır. Çıktı düz yazıdır. Terminalde de rahat okunabilir.

ALANLARINAÇIKLAMALARI

top komutu işlemci durumlarıyla ilgili birçok bilgi sunar. Varsayılan olarak 5 saniyede bir yenilenir fakat bu d anlık komutuyla ayarlanabilir. "uptime" Bu satır sistemin çalışır vaziyette olduğunu, ve 3 adet sistem yük ortalamasını gösterir. Bu 3 ortalama sırasıyla 1,5,15 dakikalık bilgilerdir. Bu satır aynı uptime(1) komutunda çıkan satır gibidir. Bu satır anlık komut l harfi ile açılıp kapatılaiblir. processes (işlemler) Çalışan toplam işlem sayısıdır(yenilendiği andaki). Bu alan t ile yenilenebilir. "CPU states" (işlemci durumları) İşlemcinin yüzdesel clocklarını kullanıcı modu (user mode), sistem modu (system mode), niced tasks (nasıl çevirsem bilemedim görevleri :) ), girdi çıktı bekleme (iowait) ve bekleme modu (idle) olarak gösterir. Mem (hafıza) Hafıza (ram) üzerindeki istatistikleri, toplam kullanılabilir bellek, boş bellek, kullanılan bellek, paylaşılan bellek, ve tampon için kullanılan bellek olarak gösterir. Swap Swap (ram görevi gören hard disk) üzerindeki istatistikleri gösterir. Toplam swap alanı, ve kullanışlan swap alanı bilgilerini verir. free(1) komutuyla verilen çıktının aynısıdır. PID Her görevin işlem ID 'sidir. PPID Her görevin ana (ebeveyn) işlem ID sidir. UID görevi çalıştıran kullanıcının ID 'si. USER görevi çalıştıran kullanıcının kullanıcı adı. PRI görevin önem derecesi NI yine çeviremediğim bir alan olan nice value. :) SIZE görevin kodu + veri + yığın boyutnun toplam boyutunun kilobyte cinsinden değeri. TSIZE görevin kod boyutunu verir. Kernel işlemleri için garip gurip değerler verebilir, ve ELF işlemleri için saçmalayabilir. (ELF işlem ne diye sormadım ben, sen de sorma.) DSIZE Veri ve yığın boyutu. TRS Yazı yerli boyutu. SWAP Görevin swap edilmiş kısmının boyutu. D KİRLİ(Dirty) Olarak işaretlenmiş sayfaların boyutu. LC Son kullanılan işlemci. RSS Kilobayt cinsinden toplam kullanılan fiziksel bellek. SHARE toplam paylaşılan bellek. STAT Görevin durumunu belirtir. S : uyuyor, D : uyandırılamayan uyku, R : çalışıyor, Z : zombie, T : durdurulmuş, WCHAN Bilmiyorum. TIME Süre %CPU işlemci. %MEM bellek COMMAND işlemin komutunu verir Devamı için : Linux / Unix Top Komutu Parametreleri (Top Command Parameters)

1 Ocak 2012 Pazar

PHP: preg_match desen(pattern) anlamları

Php de vazgeçilmez karakter - desen filtreleme fonksiyonu olan preg_match ile ilgili yapabileceğiniz bir kaç örnek burada. Ne zaman kullanacak olsam, birden neyin ne manaya geldiğini unutuveriyorum. Ben de buraya yazarak kendime not alayım ve faydalanacaklar da faydalansın istedim. [abc] tek bir karakter: a, b veya c [^abc] a, b, veya c dışında herhangi tek bir karakter. [a-z]  a-z arasındaki herhangi bir karakter. (sadece küçük harf ve ingilizce harfler) [a-zA-Z] a-z veya A-Z arasındaki herhangi bir karakter. (küçük büyük ingilizce harfler) ^ satır başlangıcı $ Satır bitişi \A string  başlangıcı \z string bitişi .  Herhangi bir karakter. \s herhangi bir boşluk karakteri. \S herhangi boşluk olmayan bir karakter \d herhangi bir rakam \D herhangi bir rakam olmayan karakter \w herhangi bir kelime karakteri. harf, sayı veya alt çizgi \W herhangi bir kelime dışı karakter \b kelime sınırlayıcı karakter. (...) içerideki herşeyi yakala! (a|b) a veya b karakteri a? sıfır veya 1 tane a karakteri a* 0 veya 1 veya birkaç tane a karakteri a+ 1 veya daha fazla a karakteri a{3} tam olarak 3 tane a karakteri a{3,} 3 veya daha fazla a karakteri a{3,6} 3 ve 6 tane arasında a karakteri   tabi ki akılda tutmak zor oluyor, burada ben de +1 kaynak olarak, arandığında bulunma ihtimalini artırmak istedim. Tüm desenleri preg_match("/BU KISIMA YAZARAK DENEYEBİLİRSİNİZ/",$string);   Devamı için : PHP: preg_match desen(pattern) anlamları