25 Mar

Nasıl bir bilgisayar almalıyım ?

Daha öncekilerin aksine bu seferki yazmaya çalışacağım konu yazılım ile ilgili değil.
Bu defa amacım, çokca maruz kaldığım bir soruya, kendi görüşlerim doğrultusunda, basite indirgeyerek bir bakış açısı oluşturabilmek.
Bilgisayar alacaksınız, çok fazla işlem gücüne ihtiyacınız yok. Ve ne tür bir cihaz alacağınızı bilmiyorsanız bu yazı sizin içn yararlı olabilir.
Nasıl bir bilgisayar almalıyım sorusuna cevap arayışım dizüstü bilgisayar çevresinde olacak. Masaüstü bilgisayar için kendinize sormanız gereken soru : “Evde sabit olarak konumlandıracak bir yerim var mı ?”. Bu sorunun cevabı sizin için evet ise Masaüstü bilgisayar seçeneğini değerlendirebilirsiniz, dizüstü bilgisayardan daha konforlu bir çalışma ortamı sunar size.

Dizüstü bilgisayarlar fiyatlarından dolayı pek tercih edilebilir durumda değildi. Fakat zamanla bu engel ortadan kalktı ve her bütçeye uygun bir seçenek bulmak kolaylaştı. Bu sefer de zorluk, kullanıcıların hangi modeli, markayı, ne tür özelliklerde bir cihazı alacaklarını bilememeleri oldu (çevremden gözlemleyebildiklerimden çıkardığım sonuçtur). Bunun içi bilinen en geleneksel yöntem, çevresindeki bilgisayar ile en çok haşır neşir olan kişiye danışmak.

“Bunca şey yazdın, daha dişe dokunur birşey yok”. Tamam, başlayayım. Konuyu örnekleyecek en iyi şeyin baklava olduğunu düşünüyorum.Ne alaka mı? Şöyle ki, baklavayı oluşturan malzemeler bellidir. Temel malzemeleri un,su,şeker,yağ olmaksızın baklava yapabilmek mümkün değildir. Bu yüzden baklavalar arasında farklılaşmalar ustaların maharetine, içerisine eklenen bazı lezzet verici şeylere göre oluyor ( baklava uzmanıymış gibi yazmayayım 🙂 sadece örnek vermeye çalışıyorum :), sürçü lisan edersem affola )
Bilgisayar da bu şekilde, bir bilgisayarı oluşturan temel malzemeler bellidir ve bu malzemelerin kullanımından kaçmak mümkün değildir.
Burdan ulaşmaya çalıştığım sonuç şu: Markaların hepsi aynı temel bileşenleri kullanarak bilgisayarları oluştururlar.
Nasılki baklavayı yapan usta suyu kendi üretmiyor ise, bilgisayarı üreten üreticilerin çoğu bilgisayar bileşenlerinden işlemciyi kendi üretmiyor.
Şimdi gelelim ayrışma kısımlarına(malzeme kalitesi kısmına hiç girmiyorum). Bilgisayar almaya karar verirken öncelikle ne kadar bütçe ayırabileceğinizi belirleyin. Birçok kullanıcı biraz fazla para vereyim en iyisi olsun, çok uzun süre kullanayım diye yaklaşıyor konuya.
Bilgisayar denilen cihaz, en çok parayı dökseniz bile belirli bir süre sonra ihtiyaçlarınızı gideremez ya da beğeninize hitap edemez hale gelecektir. Bu hem teknolojideki gelişmelerden hem de bu sektörün ürünlerini satabilmek için kullanıcılara kurduğu kurnaz tuzaklardan kaynaklanıyor. Bu yüzden en pahalısı en iyisdir fikrini bir kenara bırakın.
Bir diğer ayrım noktası, markanın teknik servis hizmetine ve müşteri hizmetlerine erişiminizin kolaylığı. Bu çok önemli bir konu, elektronik cihazlarda çıkabilecek sorunları önceden kestirebilmek mümkün değil. En iyi markanın en pahalı ürünü de arızalanabilir. Bunu göz önünde bulundurarak alacağınız cihazın teknik servis imkanlarını, bu hizmete kolay ulaşıp ulaşamadığınızı kontrol etmeye çalışın.
Bir diğer ayrım noktası cihazın görünümü. Bu konu ilk başta sizin için çok önemli görünmüyor olasa da aslında kullanımınızı etkileyen bir faktör. Çünkü sürekli bu cihaz ile çalışacaksınız ve her zaman gözünüzün önünde olacak. Göz estetiğinize hitap etmeyen cihaz olması gerekenden daha kısa sürede beğeninize hitap etmez hale gelebilir.

Gelelim teknik ayrıma. Bu ayrımı bu yazıya sığdırabilmek pek mümkün değil, birkaç ayrım noktasına değinmeye çalışacağım.

İşlemci : Genelde Intel veya AMD diye görürsünüz bilgisayar bileşenlerini açıklamalarında. Bunlar üreticilerdir, bir de bu üreticilerin i3,i5,i7,A10,E,Atom,A4 vb gibi modelleri vardır. Eğer 3D modelleme, autocad,photoshop,video düzenleme vb gibi çok fazla işlem gücüne gerek duyan programlar kullanmayı düşünmüyorsanız çok fazla dikkat etmeniz gerekmez.
Bu bileşenlerin yanında ayırca 2.25MHZ, 1.75MHZ gibi ibareler görürsünüz. Bu işlemcinin çekirdek hızını gösteren ve tek başına bilgisayarın hızını etkilemeyen birşeydir. Bu yüzden size işlemci çekirdek hızı bu kadar hızlı, şu kadar hızlı diye övmelerini çok önemsemeyin. Ama eğer yukarıda belirttiğim program-işlemler üzerine çalışıyorsanız birazcık dikkate alabilirsiniz. Çünkü bu uygulamalar çok fazla matemeaitksel işlem yapar ve bu işlemleri de işlemci yapar.
RAM : RAM önemli bir konu, işlemci çalışırken bazı şeyleri aklında tutması gerekir. Bir işlemin sonucunu aklında tutarki bir daha istediğinizde, o sonucu bulabilmek için yaptığı işlemi tekrar yapmayıp size istediğiniz sonucu hızlıca verebilsin. Bu parçanın kapasitesini bilgisayar özelliklerinde GB (Gigabayt) olarak geçer ve genelde 2GB olarak görünüyor en minimum değerler. Ama ben en az 4GB RAM tavsiye ederim.
Ekran Kartı: Ekran kartı çok göreceli bir kavram. Normalde yukarıda belirttiğim şekilde, çok fazla işlem gücünde ihtyiaç duymuyor iseniz, bir iki ufak oyun oynayıp, film izleyip, ofis programları kullanıp internette geziniyorsanız bu bileşenin özelliğini çok fazla dikkat etmenize gerek yok. Ama dikkat etmek istiyorsanız “Harici” olarak belirtilen modeli tercih ediniz. Harici ekran kartı, bilgisayarın ana kartında veya işlemci içerisinde bulunmayan tek görevi ekran ile ilgili işlemleri yapan bir bilgisayar bileşenidir.
Eğer temel bilgisayar kullanımının üstüne çıkan bir kullanıcı iseniz harici bir ekran kartını ve 2GB veya üzeri değere sahip modeli tercih etmeye özen gösteriniz.
En son değinmek istediğim bileşen ise Harddisk’tir. Harddisk, bilgisayara depoladığınız fotoğraf,müzik, döküman vb birçok dosyayı saklamanızı sağlayan önemli bileşenlerden biridir. Bu bileşenin değeri GB veya TB olarak görürsünüz. TB, GB dan büyüktür. 600GB, 750GB, 1TB gibi ibareler görürsünüz. Bunlar ne kadar yüksek ise kayıt alanınız o kadar çok olur.
Eğer ciddi anlamda performanslı bir bilgisayar arıyorsanız, sadece SSD türünde bir harddisk içerip içermediğine dikkat etmeniz yeterli olur.
Çünkü SSD içeren bir cihazın bileşenleri de harddiske paralel olarak iyi seçiliyor. Ama SSD türünde harddisk içeren cihazların fiyatları yüksek olmakta. Çok fazla işlem gücüne ihtiyaç duymuyorsanız dikkate almayınız SSD olup olmamasını.

Yukarıda temel ayrım noktalarını yazmaya çalıştım. Şimdi de seçim sürecinin nasıl olması gerektiğini maddeler halinde belirleyelim :
– Bütçeyi belirle
– Hangi markanın servisinin ve müşteri hizmetlerinin daha ulaşılabilir olduğunu bulmaya çalış
– Görsel olarak sana hitap etmesine dikkat et
– Yukarıda yazdığım temel bileşenleri, kendi ihtiyaçlarına göre kombine et ve filtrelemek için hangi bilgisayar bileşenine veya bileşenlerine önem vermen gerektiğine karar ver. Bu karara göre bir seçim listesi oluştur
– Oluşturduğun listeyi fiyat/performans oranına göre kafanda filtrele ve en az seçenek kalıncaya kadar devam et
– Kafanda en çok olgunlaşan model için fiyat araştırması yap
– Sonrası sana kalmış 🙂
Bilgisayar alımında dikkat ettiğim noktaları özetleyerek anlatmaya çalıştım. Umarım alacağın bilgisararın seçiminde katkım olur 😉

29 Mar

Sayfa Kodlaması Ne İşe Yarar Ki ?

Buraya eklediğim örnekleri mümkün olduğuca test etmeye çalışıyorum. Fakat, yine de hatanın önüne geçmek mümkün olmuyor.
Bloğumu ziyaret eden Mehmet SEVEN’den mail aldım. http://www.ersindogan.com/php-web-programlama/wsdli-nasil-okuyabiliriz adresindeki makaleyi okuduğunu, fakat ekteki örnek dosyaları çalıştıramadığını ve şöyle bir hata aldığını yazmıştı (Burdaki dosya yolları kendi bilgisayarımın yollarıdır) :

Fatal error: Uncaught SoapFault exception: [HTTP] Not Found in /home/dev/hosts/Workspace/WebServices/istemci.php:4 Stack trace: #0 [internal function]: SoapClient->__doRequest(‘__call(‘EchoTest’, Array) #2 /home/dev/hosts/Workspace/WebServices/istemci.php(4): SoapClient->EchoTest(‘Ersin’, ‘DOGAN’, ‘Merhaba Dunya’) #3 {main} thrown in /home/dev/hosts/Workspace/WebServices/istemci.php on line 4

Biraz kurcaladıktan sonra, wsdl içerisinde bulunan endpointURI (servis çağrılarının yapıldığı adresin) eksik olduğunu fark ettim :

Eksik Hali
http://localhost/Workspace/WebServices/
Doğru Hali
http://localhost/Workspace/WebServices/sunucu.php

Bu şekilde http://localhost/Workspace/WebServices/ çalışabilmesi için, sunucu.php dosyası içerisindeki kodun index.php dosyası içerisinde olması gerekirdi.Her ne kadar adı sunucu olarak da geçse, kendisi apache web suncusu olmadan çalışamayan bir php dosyasıdır. Bu yüzden adresleri bu durumu göz önünde bulundurarak oluşturmak gerekiyor.

Bunu düzelttikten sonra hatadan kurtulmak mümkün olmadı ama aldığım hata değişti :

Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in /home/dev/hosts/Workspace/WebServices/istemci.php:4 Stack trace: #0 /home/dev/hosts/Workspace/WebServices/istemci.php(4): SoapClient->__call(‘EchoTest’, Array) #1 /home/dev/hosts/Workspace/WebServices/istemci.php(4): SoapClient->EchoTest(‘Ersin’, ‘DOGAN’, ‘Merhaba Dunya’) #2 {main} thrown in /home/dev/hosts/Workspace/WebServices/istemci.php on line 4

Bu, sunucu.php dosyasında birşeylerin yanlış gittiğini gösteriyor. Normalde, sunucu.php dosyası kodu çalıştırdıktan sonra geriye cevap olarak XML dosyası göndermekte. Hatanın sebebini bulmak için kodu birazcık güncelledim :

$istemci=new SoapClient(‘test.wsdl’,array(‘trace’=>1));
try{
echo $istemci->EchoTest(‘Ersin’,’DOGAN’,’Merhaba Dunya’);
}catch(Exception $e){
echo ‘‘,$istemci->__getLastResponse(),’‘;
}

Ve asıl hatamıza ulaştık :

Fatal error: SOAP-ERROR: Encoding: string ‘Merhaba Ersin DOGAN Mesaj\xfd…’ is not a valid utf-8 string in /home/dev/hosts/Workspace/WebServices/sunucu.php on line 10 Call Stack: 0.0002 333680 1. {main}() /home/dido/hosts/Workspace/WebServices/sunucu.php:0 0.0006 340284 2. SoapServer->handle() /home/dev/hosts/Workspace/WebServices/sunucu.php:10

sunucu.php dosyasını incelediğimde (file -i sunucu.php komutunu çalıştırarak):

1
sunucu.php: text/x-php; charset=iso-8859-1

dosyanın kodlamasının iso-8859-1 olduğunu gördüm. SoapServer varsayılan olarak utf8 ayarlı olduğu için, dosya içeriğinin ISO-8859-1 kod seti ile oluşturulmuş olması, sunucu.php dosyasının bu kod setinin desteklemediği karakterler ile karşılaşmasından dolayı hata vermesine sebep oluyormuş. Bunu çözmek için komut satırından :

1
iconv -f ISO-8859-1 -t UTF-8 sunucu.php>sunucu_utf8.php

çalıştırıp, işlem başarı ile tamamlanınca sunucu.php dosyasını silip, sunucu_utf8.php dosyasını da sunucu.php olarak yeniden adlandırmak tüm sorunlarıma çözüm oldu.

Eğer linux kullanmıyorsanız, kodlar için yeni dosyalar açıp, kodları bu yeni dosyalara yazmanız ( kopyala yapıştır yapmadan) da sorununuzu çözecektir.

Bu ilginç hata ile, hatalı dosya kodlamasının başa ne dert açabileceğini görmeme sebep olduğu için Mehmet SEVEN arkadaşa da burdan teşekkür etmek isterim 🙂

25 Mar

Flash videoların kopyalanması

Sanırım linuxda olmanın bir handikapı, bazı şeyleri daha zor yollardan yapmanız gerekiyor. Eğer firefox eklentisi kullanmıyorsanız ya da yoksa böyle bir eklenti, izlediğiniz flash videoları bilgisayarınıza indirmeniz uğraşıtırıcı.

Gerçi önceden kolaydı (ubuntu 10.10 dan önce) , izelenen tüm flash videolar /tmp klasörü içerisine kopyalanıyordu. Videonun bulunduğu sayfayı kapadığınızda da, /tmp den siliniyordu. Flash videonun penceresini kapamadan, /tmp klasöründen alıp istediğiniz yere kopyalayabiliyordunuz.

Bu kolay adımlar bazılarının canını sıkmış sanırım, bu yüzden artık izlenen flash videolar tmp dizininde bulunmuyor. Bunun yerine /proc dizini altında, çalışan eklentinin process id si altındaki fd dizini içerisinde bulunan ilgili numaradaki dosya olarak bulunabiliyor 🙂

Şunun gibi yani (“lsof -n|grep Flash” komutunun çıktısı):

1
plugin-co 2535     ersin   16u      REG                8,1  5463336   12058865 /tmp/FlashXXcGtmnF (deleted)

Bunu bir arkadaştan öğrendim, lsof (açık olan tüm uygulamaların kullandığı dosyaları listeliyormuş) ile bu bilgilere ulaştıktan sonra geriye bu dosyayı kopyalamak kalıyordu :

1
cp /proc/2535/fd/16 ~/flash_dosyasi.flv

Bu yöntemin dez avantajı hangi dosyanın hangi video olduğunu bilmemeniz. Bu yüzden birden fazla flash video izliyorsanız, bunun takibini ve ayrımını yapmak tamamen size kalıyor.

Uzun sözün kısası şu, burda izlediğim adımları otomatize etmek için küçük bir php scripti yazdım, konsoldan çalışan. Bunu da burdan paylaşmak istedim :

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
#!/usr/bin/php
<?php
/**
 * Flas dosyalarını kopyalayabilmek için oluşturulacak Ui için ortak yapı
 * @author ersin
 *
 */

abstract class  Ui {
   /**
    *
    * Fla listesini tutar
    * @var array
    */

   protected $listArray;
   /**
    *
    * Komut çıktısını tutar
    * @var string
    */

   protected $list;
   /**
    *
    * Sistemde olan açık fla dosyalarının listesini dödnüdür
    */

   protected function listOpenFlas(){
      $this->list =`lsof -n|grep Flash`;
      $this->listArray = explode("\n",$this->list);
      array_pop($this->listArray);
   }
   /**
    *
    * Komut çıktısını ayrıştırarak fla dosyasına erişebilmeyi
    * sağlayan değerleri döndürür
    *
    * @param string $data
    */

   protected function parseFla($data){
       $res = array();
       $match = array();
       preg_match_all('/\d{1,}/',$data, $match);
       if(count($match)==0) {
       return false;
       }
   
       $res['pid'] = $match[0][0];
       $res['itm'] = (int)$match[0][1];
       return $res;
    }
   /**
    *
    * Fla dosyasının kaydedilmesini sağlar
    * @param integer $index
    * @param string $savePath
    */

   protected function saveFile($index,$savePath){
      @$file = $this->listArray[$index];
     
      if(!($fla  = $this->parseFla($file))){
         echo "\nFlash dosyası ayrıştırılamadı\n";
         return false;
      }
     
      $source ='/proc/'.$fla['pid'].'/fd/'.$fla['itm'];
         $res =`cp $source $savePath>&1`;
      if(null === $res) {
         echo "\nDosya aktarım işlemi başarılı ile sonuçlandı\n";
      }else {
         echo "\n\033[01;31mHata\t:\t\033[0m".$res."\n";
      }
   }
   /**
    *
    * Ortak başlatıcı
    */

   public function start(){}
}
/**
 *
 * Consoleda çalışan Ui
 * @author ersin
 *
 */

class ConsoleUi extends Ui {
   /**
    *
    * Conseole menü çıktısını verir
    */

   private function print_menu(){
      $msg= "\n\033[35;1m Seçenekler :\033[0m \n".
      "\033[01;31m(1)\t:\033[0m Flash Dosya Listesi\n".
      "\033[01;31m(2)\t:\033[0m Flashı farklı kaydet\n".
      "\033[01;31m(3)\t:\033[0m Çıkış\n".
      "\n\033[01;31mBir Seçenek Numarası Girin :\033[0m";
      return $this->prompt($msg);
   }
   /**
    *
    * Fla dosyalarının liste çıktısını verir
    */

   private function listMenu() {
      if(count($this->listArray)>0) {
         echo "\n\t\tŞu an açık olan flash dosyaları\n",
         $this->list;
      }else {
         echo "\nAçık flash dosyası bulunamadı\n";
         return false;
      }
   }
   /**
    * (non-PHPdoc)
    * @see Ui::listOpenFlas()
    */

   public function listOpenFlas(){
      parent::listOpenFlas();
      $this->listMenu();
   }
   /**
    *
    * Console dan parametre almamızı sağlar
    * @param string $message
    * @return string
    */

   private function prompt($message,$trim=true){
      echo $message;
      $input = fopen('php://stdin','r');
      $value = fgets($input);
      fclose($input);
      if($trim) {
         return trim($value);
      }else {
         return $value;
      }
   }
   /**
    *
    * Karar mekanizması
    * @param int $choice
    */

   private function makeAction($choice){
      switch($choice){
         case 1:
            $this->listOpenFlas();
            break;
         case 2:
            if(count($this->listArray)==0){
               if($this->prompt("\nListe boş görünüyor, tekrar kontrol edilsin mi? [e/h]")=="e"){
                  if(!$this->listOpenFlas()) return false;
               }else { return false;}
            }
            $fileChoice = $this->prompt("\nDosya indeksini girin(0 dan başlayarak) :");
            $savePath   = $this->prompt("\nDosyanın kaydedileceği yolu girin :");
            $this->saveFile($fileChoice,$savePath);
            break;
         case 3:
            exit(0);
            break;
         default :
            var_dump($choice);exit;
      }
   }
   /**
    * (non-PHPdoc)
    * @see Ui::start()
    */

   public function start(){
      while(true){
         $choice = $this->print_menu();
         $this->makeAction($choice);
      }
   }
}

$console = new ConsoleUi();

$console->start();

GTK destekli sürümünü de yapmak istediğimden, bunu yapabilecek şekilde düzenledim. Belki sizin de aklınıza farklı birşeyler gelir siz de ekleme yaparsınız,basit kullanışlı bir araç çıkar ortaya 🙂

02 Oct

Ubuntuda Flash Menulere Tıklama Problemi Çözümü (64bit)

64 bit nimetlerinden yararlanırken, böyle ufak tefek problemler ile de uğraşmak zorunda kalabiliyoruz.

Adobe firmasının 64 bitlik linuxlara desteğini minimum seviyede tutması asıl sebep, neyse. Geçelim konumuza.

Birçoğumuzun başına gelmiştir sanırım, bazı sitelerdeki flash menülere tıklamaya kalktığımızda hiçbir tepki alamayız, menu çalışmaz.

Bu problem ile 32 bitlik sürümlerde karşılaşmadım ve ayrıca bu problem sadece firefoxda oluyor.

Sorunun çok basit bir çözümü varmış. Bu problemden sıkılınca, yokmu bunun çözümü diyerek google amcaya sordum. O da sağolsun istediğim çözüme ulaştırdı beni.

Problemi çözmek için izlemeniz gereken adımlar şunlar:

ALT+F2 ye basın ve şunu girin
gksudo gedit /usr/lib/nspluginwrapper/i386/linux/npviewer
Sondan bir önceki satıra şunu ekleyin :
export GDK_NATIVE_WINDOWS=1
Kaydedip çıkın.
Uygulamayı yeniden başlatın.

Bu birkaç basit adımdan sonra bu sorundan kurtulmuş olmanız gerekiyor. Umarım sizde de işe yarar.

19 Jun

PHP ile Sayfa Yenilenmesini Algılama

Aslında garip bir yöntem, çokca ihtiyaç duyulabilecek birşey değil diye tahmin ediyorum.
Ama işte, yeri gelince ihtiyaç da olabiliyor.

Aşağıda vereceğim yöntem tek başına sağlıklı bir kontrol-ölçme biçimi değil. Eğer sayfa yenilemesinin algılanması çok önemli ise, mutlaka ekstra yöntemler de gelişitirilmeli.

1
echo '<pre>',print_r($_SERVER,true);

Bu kod ile, PHP tarafından oluşturulan, sunucuya ve ortama dair bazı bilgileri tutan, $_SERVER dizesindeki verileri ekrana yazdırıyoruz. Bunu yapmamızın sebebi, sayfaya direkt olarak girilmesi ile sayfa yenilendiği zaman ortaya çıkan farklılığı orataya koyabilmek. Bu kodun bendeki çıktısı aşağıdaki gibi :

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
Array
(
    [HTTP_HOST] => localhost
    [HTTP_USER_AGENT] => Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 FirePHP/0.4
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => en-us,en;q=0.5
    [HTTP_ACCEPT_ENCODING] => gzip,deflate
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
    [HTTP_KEEP_ALIVE] => 115
    [HTTP_CONNECTION] => keep-alive
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] =>
Apache/2.2.14 (Ubuntu) Server at localhost Port 80


    [SERVER_SOFTWARE] => Apache/2.2.14 (Ubuntu)
    [SERVER_NAME] => localhost
    [SERVER_ADDR] => 127.0.0.1
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 127.0.0.1
    [DOCUMENT_ROOT] => /var/www
    [SERVER_ADMIN] => webmaster@localhost
    [SCRIPT_FILENAME] => /var/www/i.php
    [REMOTE_PORT] => 50699
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] =>
    [REQUEST_URI] => /i.php
    [SCRIPT_NAME] => /i.php
    [PHP_SELF] => /i.php
    [REQUEST_TIME] => 1276953783
)

Bu kodu denerken, sayfayı yenilediğinizde ek olarak şu çıktıyı görürsünüz :

1
 [HTTP_CACHE_CONTROL] => max-age=0

Bu farklılığın sebebi, tarayıcının ikinci isteği yaptığında, karşılığında önbellekten gelen bilgileri değil, sayfayı asıl kaynaktan direkt olarak almak istediğini belirtmesidir.

İşte bizde bu değişkeni takip ederek, sayfanın yenilendiğinin ya da sayfaya direkt olarak erişildiğini anlamaya çalışıyoruz :

1
2
3
if(!empty($_SERVER['HTTP_CACHE_CONTROL'])) {
  echo 'sayfa yenilendi';
}

Bu kontrol ile, sadece işi kuralına göre yapan tarayıcılar ile başarı oranımız yüksek olur. Ama bot dediğimiz siteleri gezen programcıklar için farklı yöntemler de gerekli.

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”

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.