29 Jul

C# ile MySql

ADO .NET in esnek ve becerikli yapısı Mysqlde işlem yaparken de bize kolaylık sağlamakta. Burada, yeni özelliklerinden dolayı (trigger,transaction,stored procedure vb) Mysql5 versiyonunu baz alarak anlatacağım. Bu arada mysql i indirip kurduğunuzu farz ederek anlatıyorum.
Mysql veritabanına bağlanabilmek ve üzerinde işlem yapabilmek için öncelikle .NET Connector ü indirip kurmanız gerekiyor.
Connectoru kurduktan sonra Visual Studioyu açarak bir Console uygulaması (MysqlTest) oluşturalım. Burada Mysql connectoru hangi klasöre kurduysanız, Visual Studio da Project>Add Reference den Browse ile o klasör içerisindeki “Mysql.Data.dll” i projeye eklemeniz gerekmekte. Daha sonra aşağıdaki kodları deneyebilirsiniz.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Collections.Generic;
using System.Text;
//mysql kütüphanelerimizi yüklüyoruz
using MySql.Data;
using MySql.Data.MySqlClient;
namespace MysqlTest
{
    class Program
    {
        MySqlConnection baglanti;   // bağlantı nesnemiz
        MySqlDataReader okuyucu; //  okuyucu nesnemiz
        MySqlCommand komut;     //    komut nesnemiz
        public Program()
        {
          baglanti = new MySqlConnection
("server=localhost;database=test;user=root;password=;");
        }

        public void basla()
        {
            Console.WriteLine("Mysql test uygulaması başlatıldı...");
            try
            {
                baglanti.Open();
                Console.WriteLine("Bağlantı açıldı...");
                Console.WriteLine("Veritabanları listeleniyor...");
                this.komutCalistir("show databases");

                Console.WriteLine("İşlem başarıyla tamamlandı...");
                Console.ReadLine();
            }
            catch (MySqlException myex)
            {
                Console.WriteLine("Veritabanına bağlanamadı.Hata sebebi:");
                Console.WriteLine(myex.Message);
                Console.ReadLine();
            }
        }

        public void komutCalistir(string komut)
        {
            this.komut = new MySqlCommand(komut, baglanti);
            okuyucu = this.komut.ExecuteReader();
            this.oku(okuyucu);
        }

        private void oku(MySqlDataReader sonuc)
        {
            try
            {
                while (sonuc.Read())
                {
                    Console.WriteLine(sonuc[0].ToString());
                }
                sonuc.Close();
            }
            catch (MySqlException me)
            {
                Console.WriteLine(me.Message);
            }
            finally
            {
                baglanti.Close();
            }
        }
        static void Main(string[] args)
        {
            Program Test = new Program();
            Test.basla();
        }
    }
}

Bu test uygulaması ile veritabanına bağlanarak veritabanlarını listelemekteyiz. Gördüğünüz gibi çok fazla çaba sarf etmeden Mysql üzerinde de rahatlıkla işlem yapabilmekteyiz. Tabi bunun en büyük rolü, başta da belirttiğim gibi ADO üstleniyor. Umarım bu kısa yazı C# ile Mysql giriş için iyi bir örnek olmuştur sizin için.

29 Jul

PHP-GTK ile ekran görüntüsünü (Screenshot) almak

Başlığa bakıp da, “hadi ya, bu nasıl olacak” diyen olmuştur sanırım. Bu tam olarak PHP-GTK işbirliği ile olabilecek birşey değil, en azından bildiğim kadarıyla 😉
Bu fikrin tamamen can sıkıntısı mahsülü olduğunu belirtmeden geçemeyeceğim.
Bu işlemi yapabilmek için şunlara ihtiyacınız var:

  • Buradan temin edebileceğiniz, php-gtk2 çalıştırılabilir dosyaları (indirin ve sadece bir klasöre açın hepsi bu kadar, ne ekstra bir ayar ne de başka birşey gerekmiyor)
  • .NET Framework hayda bu da nerden çıktı dediğinizi duyar gibiyim,az sabır 🙂 anlatacağım
  • Bu iş için hazırlanmış ve bize yardım edecek dll dosyamız

Daha önce sistem çekmecesine yerleşen uygulamamızdaki örneği kullanacağım burda. Bunu yaparken de, PHP-GTK çalışıtırılabilirlerini indirip bir klasöre açtığınızı, .NET Framework u indirip kurduğunuzu, linkini vermiş olduğum dosyayı indirdikten sonra, .NET Framework içerisinde bulunan “regasm.exe” yardımıyla “Ekran.dll” dosyamızı kayderttiğimizi (regasm /tlb:ekran.tlb ekran.dll komutuyla) farz ediyorum 😉 şimdi başlayalım:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php

/*
* Daha önce verdiğimiz örnekteki tek değişiklik
* Ekran.dll kütüphanesindeki nesneyi oluşturup kurmamızdır
**/
$NETObjem = new COM("Ekran.Ekran");
$pencere = new GtkWindow();
$pencere->set_title("Örnek Pencere başlığım");
$pencere->set_size_request(240, 120);
$pencere->set_position(Gtk::WIN_POS_CENTER_ALWAYS);
$pencere->connect_simple('destroy', array('Gtk','main_quit'));
$pencere->add($vbox = new GtkVBox());
$vbox->pack_start(
new GtkLabel("Sistem çekmecesindeki ikona tıkladınız!"));
$vbox->pack_start(
new GtkLabel("Gizlemek için birkez daha tıklayın."));
// sistem çekmecesine yerleşecek ikonu ayarlıyoruz
// işte yeni versiyondaki yenilik ve büyük kurtarıcı
$statusicon = new GtkStatusIcon();
// Sistem çekmecesinde görünecek ikonumuzu seçiyoruz
<a href=http://gtk.php.net/manual/en/gtk.enum.stockitems.php target=_blank> burdan da </a>görebileceğeniz gibi PHP-GTK2 içerisinde
// onlarca hazır ikon bulunmaktadır
$statusicon->set_from_stock(Gtk::STOCK_HOME);
// sistem çekmecesindeki ikon üzerine gelindiğinde
// görüntülenecek ipucuyu ayarlıyoruz.
$statusicon->set_tooltip(?Pencereyi gormek için sol tıklayın?);
$app_status = 0;
// sistem çekmecesindeki ikona sol tıkladığımızda bir olay
// gerçekleşir (signal) ve bu olay karşılığında çalışmasını
// istediğimiz işlevi atıyoruz (callback)
$statusicon->connect(?activate?, ?on_activate?);
$pencere->hide_all();
Gtk::main();
function on_activate($statusicon) {
global $pencere, $app_status;
 if ($app_status) {
$statusicon->set_tooltip(?Pencereyi görmek için sol tıklayın?);
$pencere->hide_all();
/*
* Penceremizi gizliyoruz ve ekran görüntümüzü
* alıyoruz, hepsi bukadar
**/
$NETObjem->Cek();
$app_status = 0;
} else {
 $statusicon->set_tooltip(?Pencereyi görmek için?);
  $pencere->show_all();
  $app_status = 1;
 }
}
?>

Biliyorum, Print+Screen tuşu ile kolayca yapabileceğimiz bu işi böyle eziyete dönüştürmek istemeyenimiz olacaktır. Fakat burda asıl amacım PHP nin yeteneklerini sergileyebilmekti. Umarım anlatabilmeyi başarmışımdır. Ayrıca bu uygulamanın windowsta (şimdilik) çalıştığını belirtsem fena olmaz sanırım.

27 Jul

Barkod belası

Barkodu herkes günlük yaşamında görüyordur sanırım, markette, işe girerken kullanılan giriş kartlarında, faturalarda,kitapların,gazetelerin,dergilerin üzerinde v.b.
Dikey olarak, belirli aralıklarla, beyaz zemin üstüne çizilmiş, değişik kalınlıktaki siyah çizgiler. Sanırım hatırladınız. Bu çizgilerin oluşması için farklı standartlar bulunmakta (araştırmalarımdan öğrenebildiğim kadarıyla 22 farklı standart bulunmakta).
Barkod yazdırmaya ihtiyaç duyduğumda, bu karmaşık işin altından kalkabilmek için biraz araştırma yapmam gerekti. Birçok arayan gibi ilk soluğu Google da aldım tabi.
İşime yarayacak barkod tipinin Code39 olduğuna karar verdikten sonra araştırmalarımı bu yöne kaydırdım. Birçok bileşen buldum, ama bulduğum bileşenler ya paralıydı ya da işime yaramadı. Ve en sonunda kolayca, bir bileşene gerek kalmaksızın Code39 formatında barkod çıktısı alabilmenin bir yolunu buldum.
Free3of9 yazı tipi ile Code39 biçiminde barkod çıktısı alınabilmekte. Matthew Welch tarafından hazırlanan bu yazı tipinde Code39 un tüm maharetlerini sergileyememesine rağmen, 0-9 arası rakamları kolaylıkla yazdırabildim.
ilk önce Free3of9 yazı tipini indirip , C:WindowsFonts klasörüne kopyalamanız gerekiyor. Ardından Visual Studioyu açıp bir WindowsApplication projesi oluşturun. Forma bir Panel (Panel genişiği 263; 68 olmalı) ve bir de Button objesi ekledikten sonra, panelin arka planını beyaz yaparak adını da barcodeIM olarak değiştirin. Sonra buttona tıklayarak gelen kod satırına şunları yazın:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Graphics g = barcodeIM.CreateGraphics();
Font LableFont=new Font("Arial",10);

Font CodeFont = new Font("Free 3 of 9", 40);

string code = "*12345678*";

float LabelWidth = g.MeasureString(code,LableFont).Width;

float CodeWidth = g.MeasureString(code, CodeFont).Width;

g.DrawString(code, CodeFont, Brushes.Black, 0, 5);

g.DrawString(
                  code,
                  TitleFont,
                  Brushes.Black,
                  new PointF((CodeWidth-LabelWidth)/2,45));

ve işte barkodumuz karşımızda. Çok kolaymış değil mi ?
Evet barkodlar karmaşık şeyler ve çoğu zamanda can sıkıcı olabiliyorlar. Burada basitçe bir barkod oluşturmayı anlatmaya çalıştım. Bu konu böyle kısa geçilemeyecek kadar uzun ve karmaşık bir konu. Ama bu karmaşayı fazla arttırmamak için burada kısaca anlatma gereği duydum.ilerleyen zamanlarda bu konuya ilişkin yazılara devam etmeyi düşünüyorum. Görüşmek dileği ile?.

27 Jul

PHP-GTK

Bildiğiniz gibi, PHP ile web üzerinde çokca güzel işler çıkarılabilmekte. PHP geliştiricileri
PHP nin bu maharetlerini masaüstünde de sergilemek için, PHP-GTK denilen, PHP nin, masaüstünde , kendi kendine çalışabilen (bir web sunucusuna ihtiyaç duymadan) uygulamalar geliştirmemize olanak veren versiyonunu geliştirme ihtiyacı duymuşlar.
işin kavramsal yönünü çok fazla açmaya gerek varmı bilmiyorum ama kısaca değinip geçeceğim burada. Evet PHP ne biliyoruz, peki GTK?
GTK+ ise kısaca, palatformdan bağımsız Grafiksel Kullanıcı Arayüzleri oluşturmamıza
olanak sağlayan araç kitleridir. GNU projesinin bir parçası olan, LGPL lisansı ile dağıtılan bu araçlarla, küçük çaplı projelerden büyük çaplı projelere kadar geniş yelpazede uygulama geliştirilmesine olanak verir.
PHP geliştiricileride GTK+ ın bu palatformdan bağımsız ve açık kaynak kodlu yapısından dolayı Grafiksel Kullanıcı Arayüzü oluşturmaya olanak veren PHP kütüphanelerini GTK+ üzerine inşa etmişler.
Şimdi kafalar çok karışmadan aklınıza gelebilecek bir soruya cevap vereyim. ?Ne yapıcam ki ya ben bununla??
Mis gibi Java var ya da baba gibi C++ olmadı C# ne gereği varki şimdi kasmanın dimi ya.
PHP-GTK nin fazla kişi tarafından duyulmadığı için birçok kişiye angarya geleceğini tahmin edebiliyorum. Ama Php bilen biri olarak, masaüstü bir uygulama yazmak için yeni bir dil öğrenmeye gerek kalmadan, Php ile geliştirme fikri ilk duyduğumdan beri bana çok güzel gelmekte ve ayrıca Php nin esnekliği ve kod yazımındaki rahatlığınıda göz önüne alırsak, Php-Gtk nin kullanıldıkça hak ettiği yeri alacağını düşünüyorum. Bunun haricinde platformdan bağımsız oluşu( geliştirin ister windows ta ister *nix te çalıştırın ve hiçbir ekstra işleme gerek kalmadan). İşte Java, işte .NET bunu yapıyor ve tüm amaçları bu, bir kere yaz ve her yerde kullan.
POT ta önceleri PHP-GTK ile ilgili makaleler hazırlarken , PHP-GTK nin 2. versiyonun çıkacağı söylentileri gezinmeye başlandı.
Var olan mevcut sürümün bir masaüstü uygulama geliştirmeye yetmediği farkedilmiş olmalı ki ikinci versiyonu çıkarma kararı aldılar.
2. versiyonu kendini radikal değişikliklerle gösterdiğinde neye uğradığımı şaşırmıştım, neredeyse herşeye baştan başlamak gerekiyordu çünkü. PHP4 ten vazgeçildi PHP5 e geçildi, bazı widgetler (parçaçık) çıkarıldı, yeni birçok özellik eklendi, sitede bulunan tüm dökümantasyon eski sürüme ait olduğu için yeni sürüme ait dökümantasyon yoktu. Araya başka sebepler de girince iyice uzaklaştığım bu PHP-GTK serüvenine burada yeniden başlıyorum.
Elimden geldiğince ve zaman buldukça PHP-GTK üzerine örnek uygulamalarla yazılar hazırlayacağım burda. PHP-GTK meraklılarının artması dileği ile, hoşçakalın?

27 Jul

Birkaç basit adımda mail göndermek

Hiç mail gönderme ihtiyacı duydunuzmu uygulamanızın içerisinde, veya kodladığınız uygulamanın, mail gönderme işlevinin, olmazsa olmaz bir görev olduğu bir durum oldu mu hiç? Sizi bilmiyorum ama benim olmadı şimdilik Bir arkadaşım SMTP ile nasıl mail gönderebileceğimizi sordu. Php den hatırladığım kadarıyla kolay bir yöntemi olması gerekirdi. Çünkü bu bir standart ve hangi dil olursa olsun bu adımları izlemek zorundaydı.
Bir sunucu, alıcı-gönderen,konu,msj vs.
Çok karmaşık örnekler vardı, hatta örneklerden birinde Socket kullanarak bir kütüphane geliştirilmişti ve bunu kullanarak mail göndermeyi anlatan bir örneğe bile rastladım. Ama istediğim gibi kolay bir yöntem değildi.
Ama tabiki sonunda istediğim kolay yöntemi MSDN içerisinde buldum.
Bunun için iki kütüphaneyi kullanacağız System.Net ve System.Net.Mail


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.Net;
using System.Net.Mail;

/**
*
* Bir SmtpClient nesnesi oluşturuyoruz
* parametre olarak string tipinde mail hostumuzu veriyoruz
*
**/


SmtpClient sunucu=new SmtpClient("mail.sunucu.net");

/**
*
* Mail sunucumuza bağlanabilmek için
* gerekli kullanıcı adı ve şifremizle bağlantı oluşturacak
* bağlantımızı atıyoruz
*
**/


sunucu.Credentials = new NetworkCredential("kullaniciAdi", "sifre");

/**
*
* SmtpClient nesnemizin send metodu ile mailimizi gönderiyoruz
* tabi ilk önce gerekli parametreleri vermemiz gerekiyor
* send metodunun aldığı bütün parametreler string tipindedir.
*
**/


sunucu.Send(kimden, kime, konu, mesaj);

ve mailimiz gönderilmiştir (tabi eğer gerekli parametreleri düzgün bir şekilde verdiysek).
Ve bu görevde tamamlanmıştır. Hoşçakalın?

ÖRNEK UYGULAMA (KONSOL)

27 Jul

Mysql de trigger

Trigger kelime anlamıyla tetikleyiciler, bir tabloya atanan ve o tablodaki istenen olay gerçekleştiğinde (insert,update veya delete)
server tarafında kendiliğinden çalışan bizim oluşturduğumuz
SQL kodlarıdır. MySql in sitesinde verdiği örnek ile açıklamaya çalışayım.
Önce tablolarımızı oluşturalım

CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
);
bu da triggerimiz

delimiter $$
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;$$
delimiter;
verilerimizi eklyelim

INSERT INTO test3 (a3) VALUES
(NULL), (NULL), (NULL), (NULL), (NULL),
(NULL), (NULL), (NULL), (NULL), (NULL);INSERT INTO test4 (a4) VALUES
(0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
INSERT INTO test1 VALUES (1), (3), (1), (7), (1), (8), (4), (4);
ve gidip tablolarımıza bakalım

mysql> SELECT * FROM test1;
+??+
| a1 |
+??+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+??+
8 rows in set (0.00 sec)mysql> SELECT * FROM test2;
+??+
| a2 |
+??+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+??+
8 rows in set (0.00 sec)
mysql> SELECT * FROM test3;
+?-+
| a3 |
+?-+
| 2 |
| 5 |
| 6 |
| 9 |
| 10 |
+?-+
5 rows in set (0.00 sec)
mysql> SELECT * FROM test4;
+?-+??+
| a4 | b4 |
+?-+??+
| 1 | 3 |
| 2 | 0 |
| 3 | 1 |
| 4 | 2 |
| 5 | 0 |
| 6 | 0 |
| 7 | 1 |
| 8 | 1 |
| 9 | 0 |
| 10 | 0 |
+?-+??+
10 rows in set (0.00 sec)
iyide ne oldu ne yaptın şimdi diyorsunuzdur belki. Anlatayım, zaten tablo oluşturma ve tabloya veri ekleme işlemlerini
bildiğinizi varsayarak trigger a geçiyorum.
Burada biz MySql e dedikki:
(Eyyy MySql )
eğer test1 tablosuna veri eklenirse bu eklemeden önce // CREATE TRIGGER testref BEFORE INSERT ON test1
test2 tablosundaki a2 alanını yeni eklenen veriyi ekle // INSERT INTO test2 SET a2 = NEW.a1;
test3 tablosundaki a3 alanınıdan yeni eklenen veriye denk gelen sütunu sil //DELETE FROM test3 WHERE a3 = NEW.a1;
test4 tablosundaki b4 alanına a4 alanının yeni eklenen veriyle eşleşen sütununu bir arttır // UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
(o da bizi kırmadı sağolsun yapıverdi işlemleri)
Burada bahsi geçen NEW anahtarı üzerinde işlem yapılan tabloya eklenen verilerdir, OLD kullanmış olsaydık o tablo üzerindeki eski verilere
işaret ediyor olacaktık.
Triggerları BEFORE ve AFTER anahtarlarını kullanarak o tablo üzerinde işlem gerçekleşmeden önce veya işlem gerçekleştikten sonra
çalışmasını sağlayabiliriz. Biz yukarıda BEFORE anahtarını kullanarak test1 tablosuna veriler eklenmeden önce işlemlerimizin gerçekleşmesini
istedik.Triggerin syntaxı

DELIMITER $$
CREATE TRIGGER ?trigger_ismi? ?trigger_event|INSERT|UPDATE|DELETE? ON ?tablo_ismi?
FOR EACH ROW BEGINSQL işlemleri
END;$$
DELIMITER;
hepsi bundan ibaret.

27 Jul

Linuxta PHP-GTK2 kurulumu

PHP-GTK 2 yi Linuxta kurmanın en iyi yolu onu derlemektir. Henüz herhangi bir dağıtım
için ikili veya kaynak paketleri mevcut değil, bu yüzden paket yöneticinizle PHP-GTK 2 yi kuramazsınız!
Buradaki kurulum açıklamaları birçok Linux dağıtımı için geçerlidir. Yalnız FreeBSD de çalışmamaktadır.
PHP-GTK 2 yi Linux sisteminize kurmak için iki seçenek var. Ya mevcut PHP kurulumunuzun kullanabilir ya da ayrı bir kurulum yapmayı seçerek bunu PHP-GTK olarak kullanabilirsiniz. Her iki seçenekte de GTK+ 2.6 ve üstü sisteminizde kurulu olmalı.
PHP-GTK 2 yi yeni bir kurulum olarak kurmak
Sadece aşağıdaki adımları takip ederek kurulumu başarıyla tamamlayabilirsiniz. Ã?ncelikle PHP nin en yeni sürümünü kontrol etmelisiniz. 5_1 veya 5_2 sürümlerinden herhangi birini seçebilirsiniz, her ikiside çalışmaktadır:
$ cvs -d :pserver:cvsread@cvs.php.net:/repository login
$ cvs -d :pserver:cvsread@cvs.php.net:/repository co -r PHP_5_2 php-src

Şimdi bunu derlemeniz ve kurmanız gerekiyor

$ cd php-src
$ ./buildconf
$ ./configure ?prefix=/opt/php5_2 ?disable-cgi
$ make
$ su
$ make install
$ echo extension=php_gtk2.so >> /opt/php5_2/lib/php.ini
$ /opt/php5_2/bin/php-config ?extension-dir | xargs echo ?extension_dir=? /opt/php5_2/lib/php.ini

Eğer CVS den derlemeyi başaramazsanız, php nin download sayfasından kaynak kodları indrerek derleyebilirsiniz:
Şimdi işlemlerimizi bitirerek kurulumumuzu tamamlayalım:

$ cd ..
$ cvs -d :pserver:cvsread@cvs.php.net:/repository co php-gtk
$ cd php-gtk
$ ./buildconf ?with-phpize=/opt/php5_2/bin/phpize
$ ./configure ?with-php-config=/opt/php5_2/bin/php-config
$ make
$ make install

Hepsi bu, kurulumu bitirdiniz!
Mevcut Kurulumun üzerine kurmak
Php nin mevcut kurulumunun üzerine kurmaya karar verirseniz, CLI destekli en azından 5.1 versiyonunun bulunmasına dikkat edin. PHP nin bundan önceki hiçbir sürümüyle çalışmayacaktır. PHP sürümünüzü komut satırından php -v yazarak kontrol edebilirsiniz. Versiyonu kontrol ederken, çıktı da cli kelimesinin var olmasına dikkat edin.
Şimdi PHP-GTK 2 en son sürümünü CVS kaynağından kontrol edebilir veya download sayfasındaki açıklamalarda yer alan bütün kaynak kodları indirip bir klasöre açtıktan sonra cd komutuyla bu klasöre girerek aşağıdaki kodları çalıştırın:

$ ./buildconf
$ ./configure
$ make
$ make install

Bu birçok kişide çalışır. Fakat eğer PHP nin birkaç farklı sürümü kuruluysa veya PHP karmaşık bir klasör yapısına kurulmuşsa sorunlarla karşılaşabilirsiniz. Fakat bu gibi durumlardan phpize ve php-config dosyalarının yollarının tam yollarını belirterek kurtulabilirsiniz :

$ ./buildconf –with-phpize=/path/to/phpize
$ ./configure –with-php-config=/path/to/php-config

Kurulumu test etmek:
PHP-GTK2 yi kullanmadan önce, php.ini dosyanıza
extension=php_gtk2.so
satırını ekleyerek PHP-GTK yi etkinleştirdikten sonra kullanabilirsiniz.
Kaynak kodlarını indirdiğiniz klasör içerisindeki demo klasöründeki örnekleri test ederek kurulumunuzun sağlıklı olup olmadığını kontrol edebilirsiniz.
Bunun için demos klasörünüzde komut satırından
$ php phpgtk2-demo.php

şeklinde çalıştırarak test edebilirsiniz.
Kaynak: gtk.php.net

27 Jul

GZIP sıkıştırması ile sitenizi hızlandırın I

Sıkıştırma kolaydır, bant genişliğinden kazanarak hızınızı arttırmaya olanak sağlar. Gzip sıkıştırmasını önerirken, eski tarayıcıların javascriptinizdeki hızlandırmalarınızda çıkardıkları problemlerden dolayı tereddütte kaldım.2007 deyiz. Siteme gelen trafiğin çoğunluğunu modern tarayıcılar oluşturuyor, dürüst olmak gerekirse kullanıcılarımın çoğu teknoloji ustası. Bazılarının Windows 95 indeki IE4 ün teklemelerinden dolayı herkesin yavaşlamasını istemiyorum. Google ve Yahoo gzip sıkıştırmasını kullanıyor.
Modern bir tarayıcı, modern içerikle ve modern hızlarla donatılmalı- gzip sıkıştırması da bunu sağlamakta. Ve burda da bunu nasıl yapacağımız var.Bekle,bekle,bekle: Ne işimiz var burada?Başlamadan önce, içerik kodlama nedir açıklasam iyi olur sanırım.http://www.yahoo.com/index.html gibi bir sayfa çağırdığınızda, tarayıcınız web sunucunuzla iletişime geçer. Çevrim şöyle gerçekleşir:

1. Tarayıcı: Hey, index.htm dosyasını ver bana
2. Sunucu: Tamam, dur bi bakayım
3. Sunucu: Buldum. Al yanit kodum (200 OK) ve sana dosyayı gönderiyorum.
4.Tarayıcı:100 KB? Yuh?bekliyorum,bekliyorum?tamam. Yüklendi.

Tabiki, gerçek başlık ve protokolller daha resmidir (ilginizi çekiyorsa Live Http Headers i inceleyebirisiniz).
Fakat çalıştı, ve sayfanızı aldı.
Peki problem nerde?
Sistem güzel bir şekilde çalışıyor, fakat verimli bir şekilde değil. 100KB çok fazla yazı demek, açıkcası HTML lüzumsuz. Her html etiketi benzeriyle kapatılır. Kelimeler döküman boyunca tekrar edilir. Neyse html i bölebilirsiniz, HTML (ve büyük kuzeni XML) kıt değildir.
Ve sayfa çok büyük olduğunda plan nedir? Sıkıştırma!
Tarayıcıya index.html i düz bir biçimde göndermek yerine, bir .zip (index.html.zip) dosyası biçiminde gönderebilseydik, bant genişliğinden ve indirme süresinden kazanırdık. Tarayıcı sıkıştırılmış dosyaları yükleyebilir, açabilir ve kullanıcıya gösterebilir, sayfanın çabucak yüklenmesi de insanları mutlu eder. Sunucu-istemci çevrimi aşağıdaki gibi gerçekleşir::

1.Tarayıcı: Hey, index.html dosyasını alabilirmiyim? Mümkünse sıkıştırlımış halini alacağım.
2.Sunucu: izninle bakayım?evvet, işte buldum. Ve sıkıştırılmış halini alacaktın değil mi?
3.Sunucu: Tamam,index.hml i buldum (200 OK), sıkıştırıp sana gönderiyorum.
4.Tarayıcı: Harika! Sadece 10KB. Açıp kullanıcıya göstereceğim.

Formül basit: Küçük dosya=hızlı yükleme=mutlu kullanıcı
Bana inanıyor muzsunuz? Yahoo nun anasayfasının HTML bölümü sıkıştırmadan sonra 101kb tan 15kb a iniyor:

devam edecek?
Kaynak: betterexplained

27 Jul

GZIP sıkıştırması ile sitenizi hızlandırın II

Bir önceki dökümadan anlatılan gzip sıkıştırmasındaki maharet, sunucu ile tarayıcının dosyanın sıkıştırılmış bir biçimde taşınabileceğini bilmelerinden kaynaklanır. Anlaşma iki bölümden meydana gelir:
Tarayıcı sunucuya sıkıştırlımış içerik kabul ettiğini belirten bir header gönderir (gzip ve deflate olarak iki biçimlidir):
Accept-Encoding:gzip,deflate
Sunucu içerik sıkıştırılmışsa bir yanıt verir:
Content-Encoding:gzip
Şayet sunucu content-encoding yanıtını göndermezse, dosya sıkıştırılmış biçimde değildir anlamına gelir (birçok sunucuda bu sıkıştırılmamış biçimde ayarlıdır).
?Accept-Encoding? başlığı tarayıcı tarafından gönderilen, önemli olmayan bir header (başlık) dır. Sunucu geriye sıkıştırılmış bir içerik döndürmek istemiyorsa, tarayıcı sıkıştırılmamış biçimiyle uğraşmak zorunda kalır.

Sunucuyu ayarlamak

?iyi haber? tarayıcıyı kontrol edemiyoruz. Tarayıcı ister ?Accept-Encoding:gzip,deflate? başlığını göndersin, isterse göndermesin.
Görevimiz tarayıcı destekliyorsa, sunucuyu geriye sıkıştırılmış içerik döndürmesini ayarlayarak, herkesin bant genişliğinden tasarruf etmesini sağlamak (ve bize mutlu kullanıcılar vermesi).
Apache de çıktı sıkştırmasını aktif etmek, oldukça kolay ve nettir. Aşağıdaki satırları .htaccess dosyanıza ekleyin:

1
2
3
4
5
6
7
# tüm text & html i sıkıştır:
AddOutputFilterByType DEFLATE text/html text/plain text/xml

# veya belirtilen uzantıdaki dosyaları sıkıştır
<files *.html>
SetOutputFilter DEFLATE
</files>

Aslında Apache iki tür sıkıştırma sunar:
mod_deflate ayarlaması kolaydır ve standarttır
mod_gzip daha kullanışlı görünmekte- içeriğinizi ön-sıkıştırmadan geçirebilirsiniz
Deflate hızlıdır ve çalışıyor bu yüzden ben bunu kullanıyorum; kendi botunuzla yüzmek istiyorsanız mod_gzip i kullanın.
Bir başka durumda da Apache tarayıcının ?Accept-encoding? başlığını gönderip göndermediğini kontrol eder ve dosyanın sıkıştırılmış veya düzenli biçimini geri dönderir. Bu arada, bazı eski tarayıcılar sorun yaşayabilir ve bunu düzeltmek içinde, ek birkaç yönerge ekleyebilirsiniz.
.htaccess dosyanızı değiştiremiyor iseniz, sıkıştırılmış içerik elde etmek için PHP kullanabilirsiniz.
HMTL dosyanızın uzantısını .php olarak değiştirin ve aşağıdaki kodu başa ekleyin.

1
2
3
4
5
6
7
8
<?php
if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) {
ob_start("ob_gzhandler");
}
else {
ob_start();
}
?>

?Accept-encoding? başlığını kontrol ediyoruz ve dosyanın gziplenmiş versiyonunu dönderiyoruz( desteklemiyorsa normal biçimini).
Bu iş kendi web sunucunuzu inşa etmeye benziyor (Ne eğlenceli!). Fakat normalde, yapabiliyor iseniz Apache çıktı sıkıştırmasını kullanmayı deneyin. Dosyalarınızla maymun olmayı ietemezsiniz.
Sıkıştırmanızı doğrulayın.
Öncelikle sunucunuzu ayarlamış olmalısınız,sıkıştırımış içerik sunduğunuzu kontrol ederek emin olmalısınız.
Online: Sayfanızın sıkıştırılmış olup olmadığını burdan kontrol edebilirsiniz
Tarayıcınızda: (Firefox eklentisi) Web Developer Toolbar>Information>View Document Size (önceki yahoo örneindeki gibi) sayfanızın sıkıştırılmış olup olmadığını kontrol edin
Kısıtlamalar
HTTP sıkıştırması göründüğü kadar eğlenceli değildir. Aşağıda dikkat etmeniz gereken noktalar bulunmakta:
Eski tarayıcılar: Evet, bazı tarayıcılar hala sıkıştırılmış içerikle sorun yaşamaktalar (Sıkıştırılmış içerik kabul edemeyeceklerini söylerler, fakat kabul edebilirler). Siteniz
kesinlikle Windows95 üzerinde Netscape 1.0 da çalışmak zorundaysa, HTTP sıkıştırmasını kullanmak istemeyebilirsiniz. Apache mod_deflate  eski tarayıcılar için sıkıştırılma yapılmamsı için bazı roller tanımlayabilir
Önceden sıkıştırılmış içerik: Birçok resim,müzik ve video önceden sıkıştırılmıştır. Onları tekrar sıkıştırarak zaman kaybetmeyin. Aslında sadece HTML,CSS,Javascript üçlüsünü sıkıştırmanız gerekmektedir.
işlemci-yükü: Sıkıştırma paratikte işlemciyi meşgul eder ve bant genişliğinden kazandırır. Genellikle bu da sıkıştırma hızı için ödün vermek demektir.
Statik içeriği ön-sıkıştırmadan geçirmenin ve sıkıştırılmış haliyle göndermenin iki yolu vardır. Bu daha fazla ayar gerektirmektedir; şayet bu mümkün değilse bile,içeriği sıkıştırma yinede bir ağ kazanımı olur.
Sıkıştırmayı aktif etmek, site performansınızı arttırmanızın en hızlı yollarından biridir. Bir adım atın, ayarlarınızı yapın, ve kullanıcılarınızın bu avantajlı durumdan yararlanmasını sağlayın.

KAYNAK: betterexplained

27 Jul

PHP-GTK2 ile sistem çekmecesine yerleşelim

Ve PHP-GTK2 Beta yayında. Evet yeni değil 17 Hazirandan beridir yayında. Şimdi PHP-GTK2 ile gelen yeniliklerden biri olan, birçok kişinin ilgisini çekeceğinden şüphem olmadığı bir konuya örnek vereyim.
Sistem çekmecesine yerleşen ikonları bilirsiniz. Bir program başlatırsınız ve penceresini kapadığınızda hemen sistem çekmecesine kendi ikonunu yerleştirir ve bu ikon yardımıyla o programa ait, program yazarı tarafından hazırlanmış olan nimetlerden faydalanabiliyoruz bu ikon üzerinden.
Şimdi bu ikonu PHP-GTK ile nasıl oluşturup kullanacağımızı görelim.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php

/**

*

* Standart bir PHP-GTK uygulamasındaki gibi

*penceremizi oluşturalım

*

**/

$pencere = new GtkWindow();

$pencere->set_title("Örnek Pencere başlığım");

$pencere->set_size_request(240, 120);

$pencere->set_position(Gtk::WIN_POS_CENTER_ALWAYS);

$pencere->connect_simple('destroy', array('Gtk','main_quit'));

$pencere->add($vbox = new GtkVBox());

$vbox->pack_start(
                          new GtkLabel("Sistem çekmecesindeki ikona tıkladınız!"));

$vbox->pack_start(
                        new GtkLabel("Gizlemek için birkez daha tıklayın."));

// sistem çekmecesine yerleşecek ikonu ayarlıyoruz

// işte yeni versiyondaki yenilik ve büyük kurtarıcı  

$statusicon = new GtkStatusIcon();

// Sistem çekmecesinde görünecek ikonumuzu seçiyoruz

<a rel="nofollow" href=http://gtk.php.net/manual/en/gtk.enum.stockitems.php target=_blank> burdan da </a>görebileceğeniz gibi PHP-GTK2 içerisinde

// onlarca hazır ikon bulunmaktadır

$statusicon->set_from_stock(Gtk::STOCK_HOME);

// sistem çekmecesindeki ikon üzerine gelindiğinde

// görüntülenecek ipucuyu ayarlıyoruz.

$statusicon->set_tooltip(?Pencereyi gormek için sol tıklayın?);

$app_status = 0;

// sistem çekmecesindeki ikona sol tıkladığımızda bir olay

// gerçekleşir (signal) ve bu olay karşılığında çalışmasını

// istediğimiz işlevi atıyoruz (callback)

$statusicon->connect(?activate?, ?on_activate?);

$pencere->hide_all();

Gtk::main();

function on_activate($statusicon) {

global $pencere, $app_status;

 if ($app_status) {

$statusicon->set_tooltip(?Pencereyi görmek için sol tıklayın?);

$pencere->hide_all();

$app_status = 0;

} else {

 $statusicon->set_tooltip(?Pencereyi görmek için?);

  $pencere->show_all();

  $app_status = 1;

 }

}

?>

Evvet işte oldu, nur topu gibi, sistem çekmecesinde yerleşke bir uygulamacık sahibiyiz
Kodların sade ve açık olduğunu düşündüğümden fazla açıklama yaparak kafa karıştırmak istemedim.
Eğer daha önce PHP-GTK1 ile uğraştı iseniz, burdaki Türkçe karakter desteğini fark etmişsinizdir. Evet
artık Türkçe karakter kullanmaktan korkmanıza gerek yok, uygulamanız abuk subuk tavırlar sergilemeyecek, sonlanmayacak.