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.

16 Aug

Var Olan Bir Web Servisi Kullanmak

Daha önceki konularda , genel olarak WSDL yapısını anlatmaya çalıştım. WSDL’i nasıl kullanacağımıza dair bir örnek de verdim. Gene WSDL kullanımına dair bir örnek vereceğim, yalnız bu sefer biz sadece istemci tarafı olacağız.

Mevcut bir web servis ile iletişim kurmamız gerekiyor, bize WSDL adresi verildi, gerekli dökümanın da verildiğini varsayarak örneğimize geçelim.

Örneğimizdeki WSDL , kendisine verilen alan adının kime ait olduğunu söylemekte. Yani basit bir WHOIS sorgusu yapan bir web servis. Bu web servis, WebserviceX.Net adlı bir site tarafından Asp.Net kullanılarak hazırlanmış ( http://www.webservicex.net/whois.asmx?wsdl ). Biz de WSDL aracılığı ile Asp.Net de yazılmış bu servisi kullanacağız.

Tabi öncelikle WSDL i eclipse aracılığı ile açıyoruz, böylece hangi metodların olduğunu ve ne gibi parametreler aldığını, ne sonuç döndüreceğiniz görebileceğiz.

wsdl örnek

Yukarıdaki kalabalık kafanızı karıştırmasın. Bize gerekli olan alan, renkli olarak işaretlenmiş alan. Burada GetWhoIs adında bir metodun olduğunu ve cevap olarak GetWhoIsResponse tipinde bir veri dönderdiğini görüyoruz.

GetWhoIs metodu parametre olarak GetWhoIs tipinde bir veri almakta. Aşağıda, WSDL için gerekli sınınıfı oluşturdum :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class GetWhoIS {
   public $HostName;
   public function __construct($host){
      $this->HostName=$host;
   }
}

$parametre = new GetWhoIS('ersindogan.com');
$istemci=new SoapClient('http://www.webservicex.net/whois.asmx?wsdl',array('trace'=>1));
try {    
$sonuc = $istemci->GetWhoIS($parametre);
echo '<xmp><pre>',print_r($sonuc,true),'</pre></xmp>';
}catch(Exception $e){
echo $e->getMessage();
}

Görüldüğü gibi, öyle karmaşık işlemler yapmadan, birkaç adımda, kolayca, web servisimizi kullanabilir biçimde kodumuzu oluşturabiliyoruz. Uğraşmamız greken herhangi bir XML kodu yok,web servisin hangi dil ile oluşturulmuş olduğunun önemi yok, sanki kendi oluşturduğumuz bir classmış gibi kolaylıkla kullanabiliyoruz.

Bu örnekte metod adı (GetWhoIs) ile aldığı parametrenin adı aynı, bu kafanızı karıştırmasın. Yukarıdaki oluşturduğum class , web servisde bulunan metodun aldığı parametredir.

Güzel günler dileği ile.

16 Aug

Eclipse ile WSDL Oluşturma

Web servis ile uğraşırken, en çok sıkıntı yaratan şey WSDL oluşturmak sanırım. En yalın hali ile XML den ibaret bir dosya olmasına rağmen , çok fazla ayrıntı olması bu işi zorlaştırıyor.

Ama,WSDL dosyasını HTML gibi , gerekli etiketleri kullanarak, bir yazı editörü ile oluşturabilmek de mümkün. Biz kolay yöntemi kullanarak , Eclipse yardımı ile WSDL dosyasını oluşturacağız.

Eclipse ile WSDL dosyasını oluşturabilmek için, yeni bir proje açarak veya var olan proje içerisinde
File -> New -> Other adımlarını takip ettiğimizde, karşımıza çıkan pencerede bulunan Web Services başlığı altındaki, WSDL File seçip “Next”e tıklayarak bir diğer adıma geçin.

Bu adımda WSDL dosyamıza bir ad vererek bir diğer adıma geçin.

Bu adımda bulunan “Target namespace” yazan alana, benzersiz bir url yazın (örnek için var olan kayıdı değiştirmeseniz de olur)

“Prefix” alanına da herhangi birşey yazabilirsiniz , örneğin “tns” yerine “orn” yazabilirsiniz.
Buradaki “Create WSDL skeleton” seçeneğinde bulunan işareti kaldırın, çünkü bize örnek bir WSDL oluşturmasını istemiyoruz, kendimiz sıfırdan oluşturacağız.

Bu işlemden sonra “Finish”e tıkladığımızda, bir kaç satır koddan oluşan bir sayfa gelir karşımıza. Bu sayfa “Source” ve “Design” olmak üzere iki bölüm vardır. Biz “Design” bölümünü kullanacağız, burası görsel olarak WSDL’i oluşturabileceğimiz bölümdür.

WSDL oluşturmaya geçmeden önce, web servisimizin ne olacağını ve ne görev yapacağını belirlemeliyiz. Böylece WSDL’imizi de bu yapılacak işlere göre oluşturacağız.

Web servisimiz bir stok servisi olsun, urun stok durumunu kontrol edebilen ve stoğu listeleyebilen , ürünün stok durumunu gösterebilen bir servisimiz olsun. Bu web servisde kullanılacak sınıfımız da aşağıdaki gibi olsun :

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
class StokYanit {
   public $mesaj;
   public $kod;
   public function __construct($mesaj,$kod){
      $this->mesaj=$mesaj;
      $this->kod=$kod;
   }
}
class Urun {
   public $id;
   public $ad;
   public $renk;
   
   public function __construct($id,$ad,$renk){
      $this->id=$id;
      $this->ad=$ad;
      $this->renk=$renk;
   }
}

class Stok {
   public function liste(){}
   public function kontrolEt(Urun $urun){
      return new StokYanit($urun->ad.' ürünüden x adet kalmıştır',100);
   }
}

Yukarıdaki kod sadece sistemin işleyişini anlatabilmek için oluşturuldu. Şimdi geçelim bu stok servisimizin WSDL’ini oluşturmaya.
Az önce bahsettiğim gibi , “Design” bölümünü kullanacağız. Design bölümüne tıkladığımızda karşımıza boş bir sayfa çıkacaktır. Bu sayfada bir alana sağ tıklayalım :

– Add Service
– Add Binding
– Add PortType

ve daha birkaç seçeneğin de olduğu bir menü çıkar. Bu menüden bu üç seçeneği yazdım, çünkü en çok kullanacağımız seçenekler bunlar.

Şimdi , yukarıdaki Class’ın WSDL’imizde karşılığını oluşturacağız. Böylece web servisimizi kullanarak sistemimizde stok işlemeleri yapılabilecek.

Add PortType bir port ekler, burada servisin yapısını oluşturmamızı sağlar (Bizim örneğimizde IStok, bu adlandırmayı rastgele yaptım) .

Add Service ile bir servis oluşturulur, servis çağrısının yapılacağı konumu belirtmemizi sağlar (endpointURI burada tanımlanır)

Add Binging ile de Service ve PortType arasında bağ kurulması sağlayan “Binding” nesnesi oluşturulur.

Burda en önemli ve en karmaşık olan bölüm “Add PortType”. Çünkü bu seçenek ile servisimizin yapısını oluştururuz.

Buraya kadar anlattıklarımı video olarak aşağıda bulabilirsiniz. Tek tek resim ekleyerek anlatmak uzun ve zor olacağından böyle bir yöntem seçtim. Yalnız ses problemini aşamadığım için videoda ses yok.

Videoyu izlemeye geçmeden önce yukarıda bulunan kodlardaki “Class”lara iyi bakın, çünkü WSDL de bu yapıyı kuracağız.

Eclipse ile WSDL oluşturma from Ersin DOĞAN on Vimeo.

Konu ile ilgili daha fazla bilgi vermek gerek, yalnız ayrıntı fazla olduğu için , konuyu dağıtmadan nasıl tamamlayabileceğimi bilemediğim için, yazıyı burada kesiyorum. Aklınıza takılan şeyleri burda yorum olarak yazarsanız, konun devamını yorumlardan sürdürebiliriz.

Güzel günler dileği ile.

08 Aug

Web servislerinde hata ayıklama

“looks like we got no XML document” hatasını aldığımızda , öylesine kalakalırız ilk başlarda. Çünkü web servisin çalışması için gerekli kodları yazmış ve gerekli ayarlamaları yapmıştık. Neden çalışmıyor ki bu meret, yok mu bunun neden çalışmadığını anlamanın yolu. Var tabiki.

Gönderilen her SOAP çağrısını (SOAP Request) ve cevabını (SOAP Response) izleyebiliriz. Bunun için yapmamız gereken yaptığımız çağrıyı try catch bloğu içerisine yazarak, hata olduğu zaman dönen cevabı yazdırmak.

Daha önceki yazıda verdiğim örnekten yola çıkarak anlatmaya çalışayım.

Sunucu tarafını burda vermeyeceğim, çünkü daha önceki yazıda mevcut. Şimdi istemci tarafındaki kodu yazalım :

1
2
3
4
5
6
7
8
9
10
11
$istemci=new SoapClient(null,
                  array('uri'=>'http://ersindogan-testuri',
                 'location'=>'http://localhost/test/sunucu.php',
                  'trace'=>1));
try {
var_dump($istemci->gonder('mesaj','konu','kime'));
}catch(Exception $e){
 echo '<xmp><pre>',
        print_r($istemci->__getLastResponse(),true),
        '</pre></xmp>';
}

Eski örneğe eklediğimiz iki farklı şey var :
Biri try-catch blogu içeirisine yazdık kodlarımızı.
İkinci olarak, hata olduğunda dönen cevabı yazdırarak sorunun nerde olduğunu anlamaya çalışıyoruz. Ayrıca unutmadan söyleyeyim, SOAP isteğinden dönen cevabı görebilmek için , SOAPClient nesnemizin kurucusuna parametre olarak “trace” anahtarını vererek, bunun açık olmasını sağlamalıyız. Aksi taktirde dönen cevabı ekrana bastırmaya kalktığımızda hiçbirşey göremeyiz.
Aynı durum “xmp” etiketi için de geçerli, eğer cevabımızı bu etiketler arasında yazdırmazsak , gene aynı biçimde dönen cevabı ekrana basmaya kalktığımızda hiçbirşey göremeyiz. “xmp” etiketi, w3c tarafından kullanımı önerilmeyen, kodları etkisizleştirerek salt metin biçiminde gösterilmesini sağlayan bir html etiketi. Her nekadar kullanılmaması önerilse de, bu tip hata ayıklama işlemlerinde çok yardımcı oluyor.

Web servisler üzerine birşeyler yazarken, hata ayıklamayı yazmayı unutmuşum. Bana gelen bir epostadan sonra , bu konu üzerinde birşeyler yazmak istedim. Umarım açıklayıcı yazabilmişimdir.

Güzel günler dileği ile…

04 Jul

Eposta adresi doğrulama

Genellikle eposta doğrulamak için kullanılan yöntem , bir düzenli ifade ile verile adresi doğrulamaktır :

1
2
3
if(!preg_match('/^[^@]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+$/', $email)) {
  echo  'geçersiz eposta';
}

Ama , bu sadece eposta adresinin belirli standartta yazılmasını sağlar, boyle@biradresyok.com yazdığınızda yukarıdaki kontrolü devredışı bırakır. Siz epostanın doğru olduğunu kabul edersiniz.

Eposta doğrulamanın bir başka yolu daha var . Verilen eposta adresine ait mx kaydının olup olmadığını kontrol etmek :

1
2
3
4
5
6
7
8
9
10
11
12
$email='boyle@biradresyok.com';

$sunucu= substr($email,strpos($email,'@')+1);

$sonuc= array();
getmxrr($sunucu,$sonuc);

if(count($sonuc)>0){
 echo 'adres gecerli';
}else {
 echo 'adres gecersiz';
}

Bu yöntemin bir dezavantajı, mx kaydını kontrol ederken, mx kaydı olmayan bir adres olduğu zaman bir süre bekletmesidir (birkaç saniye). Bunun haricinde mx kaydı kontrol ederek eposta doğrulaması , diğer yöntemlere göre çok daha yüsek doğruluk payı olan sonuçlar verebilir.

03 Jul

Mysql’de Tekrarlayan (Mükerrer) Kayıt Algılama

Bir tabloda , sadece bir adet aynı nitelikte bir kayıt olmasını istediğimizde , ilgili alan veya alanları “unique” yaparak bunu kolaylıkla yapabiliyoruz. Alanı unique yaptıktan sonra, aynı nitelikte kayıt girmeye çalıştığımızda bize hata döndürür. İşte bu hata ve hata kodunu izleyerek, sistemde tekrarlayan bir kayıt olup olmadığını bulabiliriz .

Örnek olarak bir testdb oluşturalım, sonrasında aşağıdaki sorguları çalıştırarak tablomuzu oluşturalım :

CREATE TABLE `kullanici` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`isim` VARCHAR( 32 ) NOT NULL ,
`nick` VARCHAR( 32 ) NOT NULL ,
`sifre` VARCHAR( 32 ) NOT NULL ,
`eposta` VARCHAR( 32 ) NOT NULL ,
`web` VARCHAR( 32 ) NOT NULL
) ENGINE = InnoDB;

ALTER TABLE `kullanici` ADD UNIQUE(`nick`);
ALTER TABLE `kullanici` ADD UNIQUE(`eposta`);

kullanıcı tablosu oluşturarak , nick ve eposta alanlarımızı unique yapıyoruz. Böylece tablomuzda benzer nick ve eposta kaydedildiğinde bize hata döndürecektir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$pdo =new PDO('mysql:dbname=testdb;host=localhost','root','q1w2e3');
$pdo->setAttribute(Pdo::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql='insert into kullanici values(null,?,?,?,?,?)';

try {
   $stm =$pdo->prepare($sql);
   $stm->execute(array('ersin dogan','ersin','1234','deneme@ersindogan.com','http://ersindogan.com'));
   echo 'Kayıt başarılı';
}catch(PDOException $e) {
   if($e->getCode() ==23000 ) {
      echo 'Bu kullanıcı veya eposta sistemde mevcut<br/>';
   }
   echo '<b>Bir hata oluştu : </b>'. $e->getMessage();
}

Bu kodu ilk çalıştırdığımızda ,bilgiler tabloya kaydedilecek. İkinci defa çalıştırmayı denerseniz, “Bu kullanıcı veya eposta sistemde mevcut” hatasını görürsünüz.

Yukarıdaki koddan da anlaşılabileceği gibi, dönen hata kodu 23000 ise ( bu hata kodu mysql veritabanı ve pdo eklentisine özeldir, başka veritabanlarında bu hata kodu farklı olabilir) , kaydımızın tekrarlayan bir kayıt olduğunu anlayabiliyoruz.

Genelde ilk başladığımız zamanlarda , öncelikle o kaydı veritabanında arar, eğer yoksa kayıt işlemini yapardık. Ama artık daha efektif çözümler mevcut ve bu yöntemleri kullanarak daha kolay çözümler üretebiliriz.

29 Jun

PHP?nin Gizli Hazineleri?ffmpeg

Daha 0.6 sürümünde olan ve sürüm notları arasında “bu eklenti deneyseldir, kullanımdan doğabilecek risklerden siz sorumlusunuz” yazıyor olsa da, gelişitirlmeye devam ederse güzel bir eklenti olacağı kesin.

ffmpeg, Linux’da kullanılan video çevrim ve başka maharetleri de olan, konsoldan çalışan güzel bir uygulama. ffmpeg, video türleri arasında çevrim yapmak, videonun herhangi bir karesinden veya saniyesinden resim almak, ekran görüntünüsünü kaydetmek gibi daha birçok özelliğe sahiptir.

Bu php eklentisi de çalışabilmek için ffmpeg ve GD kütüphanesine ihtiyaç duymakta. Henüz ffmpegin yapabildiklerinin hepsini yapamasa da , ilerleyen zaman diliminde bu durum değişecek diye umuyorum.

Bu eklenti ile şu anda yapılabilecekler, video bilgilerini almak ( süre, boyut, frame rate vb ) ve videodan bir önizleme resmi alamaktır .

1
2
3
4
5
6
7
8
// videomuzu veriyoruz
$movie=new ffmpeg_movie("test.flv");
// resmin alınacağı kareyi veriyoruz
$frame = $movie->getFrame(1);
// GD nesnesini oluşturuyoruz
$gd = $frame->toGDImage();
// resmi kaydediyoruz
imagepng($gd,'ekran-goruntusu.png');

Bu birkaç kolay adımdan oluşan , videodan bir kare resim alma işlemi bile bu eklentiyi çekici kılmaya yeter gibi. Ama şunları unutmamak gerek : Hala deneysel bir çalışma, problem yaratması muhtemel.
Videodan alınan ekran görüntüsü pek kaliteli olmayabiliyor.

Son olarak, bu eklenti sadece Linux’da bulunmakta.

28 Jun

PHP?nin Gizli Hazineleri ? phar

Bence geleceği en parlak ve aynı zamanda çokca yararlı olabilecek bir PHP kütüphanesi. Phar eklentisinin temel amacı , yapmış olduğunuz uygulamayı, sıkıştırılmış bir dosyada toplayarak (phar – PHpARschive), projenizin kolayca dağıtılmasını ve kurulmasını sağlamak.

Hepimizin başında olan birşeydir bu, kendi oluşturduğumuz veya başka biri tarafından oluşturulmuş, class veya fonksiyonlardan oluşan php dosyalarını uygulamamız içerisine yükleriz. Bunu yaparken de en çok sıkıntısını çektiğimiz şey yüklemeye çalıştığımız dosyanın yolu olur genellikle.

Kendimize has dosya yükleme yöntemleri geliştirmiş olabiliriz, ama bir de şöyle düşünün : bütün dosyalarımızı tek bir çatı altında toplayabilseydik, hatta az yer kaplamasını sağlayabilseydik ve bunlara kolayca ulaşmanın bir yolu olsaydı.

İşte bütün bunları yapabilme olanağımız var. Phar eklentisi sayesinde bütün projemizi phar dosyası olarak , birden fazla sıkıştırma formatını destekleyen biçimde (tar,zip,gzip, bz) tek bir dosya olarak saklayabiliriz.

Phar eklentisi ile projemiz için ihtiacımız olan dosyaların hepsini bir phar arşiv dosyası olarak saklayabiliyoruz :

1
2
$phar=new Phar('test.phar');
$phar->buildFromDirectory('/var/www/test');

Yukarıdaki iki satır kod bloğu ile yapmaya çalıştığımız şey “/varr/www/test” klasörü içerisindeki dosyaları “test.phar” dosyasına atmak. Böylece tek bir arşiv dosyası içerisinden ihtiyacımız olan tüm dosyalara erişebiliriz :
( Örneğin /var/www/test klasörü içerisinde class dizini ve bu dizin içerisinde phar.php dosyamız olsun )

1
include 'phar://test.phar/class/phar.php';

Bu kod satırı ile de test.phar arşiv dosyası içerisine attığımız ,class dizini içerisindeki “phar.php” dosyasının yüklenmesini sağlıyoruz. Bunu yapan ise “phar://” akım sarmalayıcısı (stream wrapper) dır. Bu akım sarmalayıcısı sayesinde arşiv dosyasını harddiske açmadan , içerisindeki dosyaya erişebilmemizi sağlamakta.

Phar ile yapabileceklerimiz sadece bunlar değil tabiki. Daha fazla ayrıntı için phpnin dökümantasyonuna göz atabilirsiniz.

24 Jun

PHP’nin Gizli Hazineleri – inotify

Fırsat buldukça php.net den dökümantasyona yeni birşey eklenmişmi diye bakarım. Windows kullandığım zamanlar “sadece linuxda çalışır” ibareli dökümanları es geçmek zorunda kalırdım. Ama artık durum değişti, windows bağımlılığımdan kurtuldum ve şimdi temizim 🙂

Artık PECL’de bulunan yeni eklentileri rahatlıkla deneyebiliyorum. Eklentinin, kullandığım platforma uygun biçimde derlenmesini beklemeden, kaynak kodundan direkt eklentiyi yüklüyorum . Bu ne büyük bir keyif anlatamam.

Benden size bir öneri, hala Linux kullanmıyorsanız , en kısa sürede bilgisayarınızın bir bölümüne kurun. Bağımlılıklarınız olabilir, başka bir işletim sistemine geçmek sizi korkutuyor olabilir, yaşadığınız veya yaşayacağınız sıkıntılar sizi yıldırma seviyesine getirebilir. Ama ne olursa olsun, kurun ve mutlaka yenilikleri takip ederek bunları mümkün olduğunca deneyin.

inotify, çok kolay kullanımı olan ve gayet sade bir PHP eklentisi. Yaptığı şey, bir dosya veya dizin üzerindeki değişiklikleri izleyebilmenizi sağlamak.

Tabi bunu tam anlamı ile yerine getirdiğini söylemek zor. Örneğin bir klasörü izlediğinizde, klasör oluşturulduğunda bunu algılıyor. Ama klasörü, ilk oluşturulduğu zamanki isim ile algılıyor ( Örneğin yeni klasör) daha sonra bu klasör veya dosya ismini değişrtirdiğinizde bunu algılamıyor. Bunu algılayabilmesi için, yeni oluşturulan klasör için de bir izleme işlemi başlatılması gerekiyor. Bu garip durum haricinde güzel çalışıyor.

Diyelimki /var/www klasörünü izlemek istiyoruz :

1
2
3
4
5
6
7
8
#!/usr/bin/php
<?php
$inotify=inotify_init();
inotify_add_watch($inotify,'/var/www',IN_ALL_EVENTS);

while( $notify=inotify_read($inotify)){
    print_r($notify);
}

Yukarıdaki kısa kod bloğu, “/var/www” klasöründeki değişiklikleri size bildiriyor. Tabi bunu web tarayıcınızdan çalıştırmamanız gerektiğini söyleyeyim. Bu php dosyasını ancak konsoldan php-cli ile çalıştırırsanız sağlıklı sonuç alabilirsiniz.

Bu konuya dair çok ayrıntıya girmiyorum, çünkü çok kullanılacak bir yöntem değil ve aynı zamanda deneysel birşey.
Bu konu ile ilgili daha fazla ayrıntıya buradan ulaşabilirsiniz