31 Mar

(network.c.345) can’t bind to port: :: 80 Address already in use

Ubuntu 10.04 ü test ederken ligthttpd’nin yeni sürümünü kurdum, ve çalıştırmak istediğimde bu hatayı aldım.
Meğer problem lighttpd’eki bir perl scriptinin IPV6 deteği olup olmadığını kontrol etmesinden kaynaklanıyormuş

/etc/lighttpd/lighttpd.conf

içerisinde aşağıdaki satırı bulup yorum satırı haline getirmeniz halinde lighttpd’yi çalıştırabilirsiniz.

#include_shell “/usr/share/lighttpd/use-ipv6.pl”

30 Mar

PHP ile yerelleştirme (localization) işlemleri

Uygulamanız genişledi veya genişleyip yayılacak potansiyelde hazırlanması gerekiyor. Genişlemekten kastımız, yerel dilimiz haricinde başka dilleri de destekleyebilir olmasını istiyoruz.
Diğer ülke kriterlerine uygun zaman ,para ,ölçü birimleri, sitedeki mesajların / yazıların tercümeleri şu an aklıma gelmeyen, bu konu ile alakalı birçok şey, yerelleştirme işlemlerinin içerisinde yer almakta.
PHP’de bu işlemleri yapmak için birçok kütüphane mevcut :

  • Enchant
  • FriBiDi
  • Gettext
  • i18n
  • iconv
  • intl
  • Multibyte String
  • Pspell
  • Recode
  • Unicode

Gerçi bu eklentiler, PHP tarafından “İnsan Dilleri ve Karakter Kodlaması Desteği ” olarak gruplandırılmış olsa da, yerelleştirmede kullanacağımız araçlar olduklarından, bunları yerelleştirme kütüphanesi olarak kabul etmek yanlış olmaz sanırım.
Bu eklentilerin hepsini kullanma şansım olmadı, ama yeri geldikçe bunlara değinmeye çalışacağım. Gerçi iconv ile ilgili bir yazı yazmıştım.
Şu anda planda i18n ve Gettext var. İlerleyen bir iki gün içerisinde, toparlayabildiğim kadarı ile, örneklemeli olarak anlatmaya çalışacağım.
Bundan önce bilmenizde fayda var, işlemlerimde Linux (Ubuntu/Debian) işletim sistemini baz alarak anlatacağım. Eğer daha önce Linux kurmadı veya kullanmadı iseniz, en azından sanal makina üzerinde kurarak örnekleri ve sonrasında php geliştirme ortamı için kullanabilirsiniz.
Şahsen bir php geliştiricisinin mutlaka linux üzerinde geliştirme yapması gerektiğini düşünüyorum. Bunun nedenini uzun uzun anlatmak yerine, kullanmanızı ve kullandıkça faydalarını gördükçe anlamanız daha güzel olacaktır diye düşünüyorum.
Konunun devamı olan gettext’de görüşmek üzere.
Hoşça kalın.

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.

24 Mar

Mount of filesystem failed

Bugün, olmaz dediğim şey oldu. Sebebini tam olarak anlayamadığım bir sebepten dolayı bilgisayarım kilitlendi ve bilgisayarı kapatıp yeniden açmaya yeltendim. Bilgisayar güzel güzel açıldı, ubuntu logosu görüntülendi vee :

Mount of filesystem failed.
A maintenance shell will now be started.
CONTROL-D will terminate this shell and retry.
root@ersin:”#

Ubuntum “çökmüştü” . Sonra ver elini google, neyse ki bu problemi tek yaşayan ben değilmişim. Her nasıl başardıysam linux dosya sistemine zarar vermişim , bunun da çözümü :

fsck

komutu. Bu komut , dosya sistemini tarayıp, bulduğu hataları otomatik olarak çözümlüyor. Tabi bunu yaparken de size soruyor öncelikle, yapmanız gereken tek şey, sroduğu her soruya “y” (yes) deyip “enter”a basmak.
İşlem sonuçlanınca size problemi çözüp -çözemediğini ve en nihayetinde bilgisayarı yeniden başlatmanızı söylüyor.
Bilgisayarınızı da :

sudo shutdown -r now

ile yeniden başlatarak kaldığınız yerden devam edebilirsiniz.

17 Mar

WSDL nedir ?

Aslında konu başlığı çok iddalı dursa da, bu yazımda WSDL’e dair çok ayrıntıya girmeyeceğim. Bloguma yazı yazarken, hoşgeldin mesajında belirttiğim gibi, işime yarayan veya çok yaramış, paylaştığım zaman yararlı olacağını düşündüğüm konular üzerine yazmaya çalışıyorum. Birşeyleri sıfırdan öğretmek gibi bir misyonum olmadı hiç, çoğunlukla tamamlayıcı bilgi tarzında yazıyorum.

Böyle bir açıklama gereği duydum, çünkü WSDL konusu çok ayrıntılı ve burada sadece bir fikir oluşturabilme biçiminde anlatmaya çalışacağım. Ayrıca daha öncesinde yazdığım yazıların karakteristiğine dair birşeyler yazmak istedim. Arada fırça atan oluyor, “becerememişsin” diye 🙂

WSDL (Web Service Description Language – Webservis Belirtme Dili) web servis belirtimi için model sağlayan XML tabanlı bir dildir .(*)

Önceki yazımda Web Servis konusuna giriş yampıştım. Web servis oluşturma işlemi, örneğimizde görüldüğü kadar kolay yapılabiliyor olsa da, iş bukadar ile bitmiyor. Çünkü, bizim örneğimiz sadece PHP uygulamaları arasında uyumlu olarak çalışır. Yazdığınız web servisi Java,C# veya diğer bir programlama dili ile konuşturamayız.

Bunu başarabilmek için onların da anlayacağı dilden konuşuyor olmamız gerekir. SOAP XML mesajlaşma tabanlı bir sistem entegrasyon yöntemidir evet, ama bu SOAP isteklerini oluşturmak için de bir standart gerekmektedir ( farklı platform veya dillerin birbirleri ile uyumlu çalışabilmelerini sağlayabilmek için ).
İşte burada WSDL devreye girmektedir. WSDL de XML tabanlı bir sistemdir. WSDL gerçekleştirilebilecek bütün SOAP isteklerinin kayıtarını tutar :

  • Web servisin adı (örneğimizde SMS di)
  • Yapılabilecek yordam çağrıları
  • Bu yordam çağrılarının alabileceği parametreler
  • Parametrelerin tipleri
  • Döndürülecek cevap,biçimi
  • Hata zamanında döndürülecek mesaj -sonuç (Fault)
  • Web servis çağrılarının yapılacağı adres (EndpointURI)

Bunlar sayılabilecek en temel özelliler.

Şimdi örneğimizden yola çıkarak biraz ayrıntıya girelim. Örneğimizdeki SMS servisine uygun bir WSDL oluşturduğumuzu varsayıyoruz ( WSDL oluşturma işlemine dair birşeyler yazabilmeyi umuyorum, zamanım olursa).
Bunu SoapClient nesnemize parametre olarak verdiğimizde :

$istemci=new SoapClient(“sms.wsdl”);

artık istemcimiz hangi adrese ne gibi çağrılar yapabileceğini, bu çağrıları nereye yapabileceğini, ne tür cevaplar alabileceğini bilecektir. Biz istemcimizde $istemci->buMetodYok(); çalıştırmaya çalıştığımızda ,isteği daha suncuya göndermeden bize hata döndürecektir. Çünkü WSDL de tanımlanmış böyle bir metod yok.

WSDL’imizi oluşturduktan sonra bunu farklı platformlarda kullanılabilmesi için dağıtabiliriz. Örneğin servisiniz PHP’de yazılmıştır ve WSDL oluşturarak C# ile yazılmış bir uygulamanın sizin uygulamanız ile iletişim kurmasını sağlayabilirsiniz.

PHP de veri tipleri yoktur, örneğin C# da:

int sayi;

tanımlı bir değişken tanımladığınızda buna sayı haricinde birşey atamanız mümkün değildir. Atamaya kalktığınızda hata alırsınız. Ama bu PHP’de böyle değildir :

1
2
$sayi=0;
$sayi="bu artık bir sayı değil";

Dedikki, PHP’de yazdığımız servisi C# ile kullandırabileceğiz. İyide veri tipleri aynı değil ki, nasıl anlaşacak bunlar ?
WSDL ile anlaşacaklar. WSDL’de standart veri tipleri vardır ve bunların dışına çıkılmaz, istemciler bu veri tiplerini kendi platform/programlama diline göre bir karşılığını bularak eşleştirir. Böylece platform/dil bağımsız iletişim mümkün olur.

Son olarak işin en can alıcı ve en üzücü kısmına geldi. PHP WSDL’in otomatik oluşturulması için bir araç sunmuyor şimdilik. Bunu elle oluşturmalısınız, ya da üçüncü parti bir uygulama-framework bulup bunun ile oluşturmalısınız.
Diğer birçok programlama dili WSDL’i direkt olarak koddan oluşturabilmekte, ayrıca var olan bir WSDL den istemci konudunu otomatik oluşturabilmektedir. Biz de bunu eclipse ile yapacağız ilerleyen zamanlarda.

Anlaşılmayan, hatalı yazılmış yerler olursa, yorum düşerek uyarır iseniz düzeltirim.

Hoşça kalın.

04 Mar

Linux’da bir komutun yolunu bulma

Aklıma geldiçe, hoşuma giden, kullanışlı olduğunu düşündüğüm linux shell komutlarını elimden geldiğince buradan paylaşmaya çalışıyorum.
Bu yazacağım komut da gerçekten çok işe yarayan, bilinmesi gereken bir shell komutu.

“which komutu, kendisine parametre olarak verilen, geçerli ortamda çalıştırılabilen POSIX uyumlu kabuk dosyalarının yolunu döndürür. Bunu PATH değişkeninde belirtilen yollarda, arguman olarak verilen çalıştırılabilir dosyaların isimlerini arayıp eşleştirerek yapar.”

Man dosyasında yazan ve benim çevirebildiğim kadarı ile tanımı bu. Biraz karmaşık veya yanlış çevirmiş olabilirim, o yüzden kısaca özetlemek gerekirse çalıştırılabilir bir dosyanın yolunu döndürür. Örneğin

which grep

yazdığımızda bize şöyle bir çıktı verir (linux dağıtımlarına göre değişebilir) :

/bin/grep

Bu da grep komutunun çalıştırılabilir dosyasının /bin klasöründe olduğunu temsil eder.

01 Mar

Linux’da bir dosyanın içeriğini boşaltmak

Büyük dosyalar ile uğraşıyorsunuz, dosyayı silmek yerine sadece içeriğini silmek istiyorsunuz. Ama herhangi bir editör ile açtığınızda takılmalar yaşıyorsunuz ve beklerken saç baş yoluyorsunuz. Buunun daha kolay bir yolu olmalı, böyle eziyete can dayanmaz 🙂
Evet kolay bir yolu var, bir değil iki yolu var (en azından benim bildiğim) :
Birincisi truncate diye bir komut var , ve bununla

truncate dosyaadi

demeniz yeterli. Fakat truncate her linux sürümünde ön tanımlı gelmiyor. Bunu kullandığınız linux dağıtımının paket yöneticisinde yükleyebilirsiniz. Ama onun yerine çok daha kolay ikinci yöntemi kullanarak dosyamızın içeriğini boşaltabiliriz :

:>dosyaadi

Evet hepsi bundan ibaret, dosyanızın içeriğine baktığınızda bomboş olduğunu göreceksiniz. Yalnız şunu unutmayın, bu komutları kullandığınızda size sileyim mi diye sormayacaktır, direkt olarak dosyanın içeriğini boşaltacaktır.

Yeri gelmişken bu konuya bir ekleme daha yapayım. Harddiskde kalan alan miktarını da şu komut ile öğrenebiliriz :

df -h

Gerçi kalan alan miktarını gösteren güzel araçlar mevcut, ama gün olur ssh ile erişmeniz gerekir ve grafiksel bir arayüz bulamazsanız, mutlaka aklınızda bulunması gereken bir komuttur kendisi.