26 Mar

PHP-GTK örnek uygulama

Kodlarda yeteri kadar açıklama mevcut diye düşünerekten ayrıca bir açıklama yazmayacağım.
Bu kodların sadece linuxda çalışabileceğini de ekleyeyim.

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/**
 * @author Ersin DOĞAN http ://www.ersindogan.com
 * Gmail posta kontrolü yapan basit bir servis
 */

class GmailServis {
   /**
    * gmail kullanıcı adı
    *
    * @var string
    */

   protected $_kullanici = null;
   /**
    * gmail şifre
    *
    * @var string
    */

   protected $_sifre = null;
   /**
    * gmail feed adresi , öntanımlı olan yeterli şimdilik
    *
    * @var string
    */

   protected $_servis_url = null;
   /**
    * Objenin kurucu metodu
    *
    * @param string $kullanici
    * @param string $sifre
    * @param string $servis_url
    */

   public function __construct($kullanici, $sifre, $servis_url = 'https://mail.google.com/mail/feed/atom') {
      $this->_kullanici = $kullanici;
      $this->_sifre = $sifre;
      $this->_servis_url = $servis_url;
      if (empty ( $this->_kullanici ) || empty ( $this->_sifre ) || empty ( $this->_servis_url )) {
         throw new Exception ( "Kullanıcı adı , şifre veya servis adreslerinden birini eksik girdiniz" );
      }
   }
   /**
    * Posta kutusunu kontrol eder
    *
    * @return SimplXMLElement
    */

   public function kontrol_et() {
      $_c = curl_init ( $this->_servis_url );
     
      curl_setopt ( $_c, CURLOPT_USERPWD, $this->_kullanici . ':' . $this->_sifre );
      curl_setopt ( $_c, CURLOPT_HTTPAUTH, CURLAUTH_ANY );
      curl_setopt ( $_c, CURLOPT_SSL_VERIFYPEER, 0 );
      curl_setopt ( $_c, CURLOPT_RETURNTRANSFER, 1 );
     
      return simplexml_load_string ( curl_exec ( $_c ) );
   
   }
}


class GmailKontrol extends GtkWindow
{
   /**
    *
    *
    * @var GtkVBox
    */

   protected $kutu;
   /**
    *
    *
    * @var integer
    */

   protected $durum;
   /**
    *
    *
    * @var GtkLabel
    */

   protected $eposta_durum;
   /**
    *
    * @var GtkStatusIcon
    */

   protected $status_icon;
   /**
    *
    * @var GmailServis
    */

   protected $servis;
   
    function __construct()
    {
        parent::__construct();

        $this->set_default_size(200,200);
        $this->set_position(Gtk::WIN_POS_CENTER_ALWAYS);
        $this->set_title('.::Gmail E-Posta Kontrol::.');
        $this->connect_simple('destroy', array('gtk', 'main_quit'));
        $this->add($this->__create_box());
        $this->hide_all();
    }
   /**
    * arayüzü oluşturuyoruz
    *
    * @return GtkVBox
    */

    protected function __create_box()
    {
      $this->kutu = new GtkVBox ( );
      $this->eposta_durum = new GtkLabel ( "GKontrol - Gmail Eposta Kontrol Aracı" );
      $this->kutu->pack_start ( $this->eposta_durum );
      $this->status_icon = new GtkStatusIcon ( );
      $this->status_icon->set_from_stock ( Gtk::STOCK_NO );
      $this->status_icon->set_tooltip_text ( 'Gmail E-Posta Kontrol' );
      $this->status_icon->connect ( 'activate', array ($this, 'on_activate' ) );
      $this->durum = 0;
      return $this->kutu;
    }
   
    /**
     * mailleri kontrol ederek
     * mail geldiğinde bizi uyarıyor.
     *
     */

   public function mail_kontrol(){
      $durum=$this->servis->kontrol_et();
      if($durum->fullcount>0){
         $this->bildirim('GPosta','Okunmammış '.$durum->fullcount.' epostanız mevcut');
         $this->status_icon->set_from_stock(Gtk::STOCK_YES);
         $this->status_icon->set_blinking(true);
      }else {
         $this->bildirim('GPosta','yeni eposta yok');
      }
   }
   /**
    * notification iconuna tıklandığında
    * çalışan metotdur
    *
    * @param  $statusicon
    */

   public function on_activate($statusicon) {
      if ($this->durum) {
         
         $this->hide_all ();
         
         $this->durum = 0;
     
      } else {
         
         $this->show_all ();
         $this->status_icon->set_from_stock(Gtk::STOCK_NO);
         $this->status_icon->set_blinking(false);
         $this->durum = 1;
     
      }
   
   }
   /**
    * bildirim başlığı
    *
    * @param string $baslik
    * @param string $bildirim
    */

   public function bildirim($baslik,$bildirim){
         // notify-send bir linux aracıdır ve bunu sisteminizde yoksa kurmalısınız
         // sudo apt-get install libnotify-bin
         // komutu ile
      $komut=sprintf('notify-send "%s" "%s" -t 1',$baslik,$bildirim);
      system($komut);
   }
   
   public function servisAyarla(GmailServis $servis){
      $this->servis=$servis;
   }
}

$gKontrol=new GmailKontrol();

$gServis=new GmailServis ( 'kullanıcı-adı', 'şifre' );

$gKontrol->servisAyarla($gServis);
/**
 * Gtk::timeout_add metodu, zamanlayıcı özelliği ile
 * bize, belirli aralıklarda gmail
 * posta kutusunu yoklama şansını veriyor
 */

Gtk::timeout_add(2000, array($gKontrol,'mail_kontrol'));
Gtk::main();
25 Mar

PHP-GTK2 Karakter Problemi

PHP-GTK nin birinci versiyonunda ingilizce haricinde karakterler kullanıldığında ( yerine göre ) sistem çalışmayı bile durdurabiliyordu.
II. sürüm ile daha fazla destek ve yeni özellik gelmek ile birlikte , karakter problemini gidermek de kolaylaştı.
php.ini dosyanızın içerisine :

php-gtk.codepage = utf8

yazmanız karakter problemini çözecektir.

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

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

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

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.