26 Feb

linuxda port bilgisi sorgulama

Bugün öğrendiğim gayet güzel bir şey. Aslında windowsda da var bu komut, ama aynı işlevi görüp görmediğini bilmiyorum.
netstat komutunu bilirsiniz, ben de biliyordum ama bu kadar işime yarayacağı hiç aklıma gelmezdi

netstat -tulpn |grep :80

netstat ı bu parametreler ile çalıştırdığımızda belirttiğimiz portta (80) çalışan, yani o portu dinleyen bir program olup olmadığını gösteriyor bize.
Şahsen benim işime çok yaradı

25 Feb

PHP ile barkod oluşturma

Evet bir yanlışlık yok, php ile barkod oluşturabilirsiniz. Üstelik bunun için phpde olmayan bir eklentiye de ihtiyaç duymuyoruz (GD kütüphanesi yeterli).
Yalnız bir kötülüğü var, o da barkodun yazdırılmasında PHP nin fonksiyonu kalmıyor ve bu da bazı sıkıntılara yol açabilir (barkodun yerleşimi vs ). Şahsen php ile barkod oluşturup okutmayı hiç denemedim, daha doğrusu deneme şansım olmadı. Önceden uğraştığım,yarım kalan bir projede C# ile barkod oluşturma işi ile uğraşmıştım.
Neyse, dönelim konumuza. PHP ile bunu yapabilmenin iki yolu var. Biri PEAR kütüphanesinde bulunan bir paket, burda buna değinmeyeceğim. Bunun birinci ve en önemli nedeni, artık bu paketin geliştirilmiyor olması. İkinci sebep ise PHP5 uyumluluğunun bulunmaması (en son böyleydi)
İkinci ve burda ele alacağımız yöntem ise ZendFramework 1.10 ile yeni gelen Zend_Barcode sınıfı aracılığı ile.
ZendFramework’un güzel özellilerinden biri, MVC (Model-View-Controller) yapısını kullanarak siteler geliştirebildiğimiz gibi, bünyesinde barındırdığı sınıfları web uygulamalarımız içerisinde de kullanabilmemizdir.
Biz de burada ZF’nin MVC özelliğini bir kenara bırakarak barkod oluşturma işlemimize geçelim. Kendi yerel web sunucumuzda test için kullanacağımız bir klasör oluşturalım.
Şurdaki linkten minimal paketi indirerek uygun bir klasöre açalım. Açtığımız dosyalar içerisindeki “library” klasöründeki “Zend” klasörünü web sunucumuzda test için oluşturduğumuz bir klasöre kopyalayalım.
Daha sonra yine aynı klasörde index.php dosyası oluşturalım ve şu kodları yazalım :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require_once 'Zend/Barcode.php';
# text parametresi barkod üzerine yazılacak
# yazıyı temsil etmektedir
$barcodeOpsiyonlari = array('text' => 'ERSIN-DOGAN');
#

#
// zoeunlu olmayan opsiyonlar
#
$rendererOpsiyonlari = array();
#
$renderer = Zend_Barcode::factory(
#
   'code39', 'image', $barcodeOpsiyonlari, $rendererOpsiyonlari
#
);
$renderer->render();

Bu kodları çalıştırdığımızda karşımıza Code39 biçiminde barkod çıktısı verecektir.

Yukarıdaki kodları açıklamaya çalışalım. Zend_Barcode sınıfı barkod oluşturmak için factory metodunu kullanır ve şu parametreleri alır
-Barkod tipi
desteklenen tipler:
Code25
Code25interleaved
Code39
Ean2
Ean5
Ean8
Ean13
….
-render tipi (image,pdf veya sizin kendi oluşturacağınız bir render metodu)
-barkod opsiyonları
-render (render için uygun bir Türkçe karşılık bulamadım) opsiyonları.

Daha ayrıntılı bilgiye ZF’nin kendi sitesinden ulaşabilirsiniz.

23 Feb

Resim üzerine yazılan yazının saydamlığını ayarlamak

Uzun bir ara oldu, planlarıma göre çok önceden yazacaktım. Burada konuya giriş yapmış ve son olarak da , resim üzerine yazılan yazının saydamlığını nasıl ayarlayacağıma değineceğimi söylemiştim.
Aslına bakarsanız gerçekten çok kolay bir şekilde bunu yapmak mümkün. Böyle bir şeye ihtiyaç duyduğumda, araştırma yaparken çok farklı örnekler ile karşılaştım. Ve bunların çoğu karmaşık yollar ile anlatılmıştı. Hiçbiri isteklerime uymuyordu. Sadece resim üzerine bir yazı yazacaktım ve bu yazının saydamlığını istediğim gibi ayarlayabilmeliydim.
Ve en sonunda çözümü (aslında ilk bakmam gereken yerde) php manualde gördüm.
Önceki örneğimizden devam edelim :

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
// resmimizi oluşturuyoruz
$resim=imagecreatetruecolor(200,50);
// resmimizi boyayacağımız rengi oluşturuyoruz
$renk = imagecolorallocate($resim, 176,196,222);
// resmimizi boyuyoruz
imagefill($resim, 0,0, $renk);
// yazı rengimizi belirtiyoruz

             //$yaziRengi = imagecolorallocate($resim, 0,0,0);
// eski örneğimizdeki yazı rengi bu biçimdeydi
// sadece bu satırı aşağıdaki gibi değiştirmek bizim için yeterli
$yaziRengi = imagecolorallocatealpha($resim, 0,0,0,100);
/*
 * burada ek olarak gelen 100 parametresi saydam bir renk
 * oluşturmaya yarıyor. Bu değer küçüldükçe saydamlık azalır,
 * bu değer büyüdükçe saydamlık artar. 127 son değerdir ve
 * bu değeri girdiğinizde yazımızı veya her ne için kullanacaksak
 * o nesne tamamen saydam olacaktır
 */

// yazımızı resmin üstüne yazıyoruz
imagestring($resim, 5, 20, 50/3, 'www.ersindogan.com', $yaziRengi);

// tarayıcıya dosyamızı algılaması için direktif veriyoruz
header('Content-type: image/png');
// ve sonucu çıktılıyoruz
imagepng($resim);
imagedestroy($resim);

Evet ,işte bu kadar. Sadece farklı bir fonksiyon kullanıp bir parametre ekleyerek bu işlemi kolaylıkla gerçekleştirebiliriz. Hazır yeri gelmişken, konu ile alakalı bir fonksyiondan daha bahsederek bitireyim.

imagefttext, bu fonksiyon imagestring gibi resim üzerine yazı yazmamızı sağlar. Ama ekstra bir özelliği daha var, o da resim üzerine istediğimiz bir font (FreeType 2 tipinde) ile yazdırabilmesidir.

array imagefttext ( resource $resim , float $boyut , float $açı , int $x , int $y , int $renk , string $yazıtipi , string $metin [, array $ekbilgi ] )

Fonksiyonun aldığı parametre yukarıdaki gibi, burda dikkat etmeniz gereken yazı tipini verirken, fontun yüklü olduğu tam yolu belirtmenizdir. Fontu bulamaz ise resim üzerine yazı yazılmayacaktır.

21 Feb

Fatal error: Cannot redeclare class Zend_Loader

Bu sorunla karşılaşan arkadaşlar var ise, çözümü çok basitmiş.
Sadece config.ini dosyasındaki

includePaths.library = APPLICATION_PATH “/../library”

satırının önüne noktalı virgül ekleyerek bu sorunu çözebiliriz.

;includePaths.library = APPLICATION_PATH “/../library”

Sorunun temelinde anladığım kadarı ile, Zend Tool çalışırken Zend kütüphanelerini yüklemekte, üstüne bizim uygulamamız da Zend kütüphanelerini yüklemeye çalışınca bu hatayı veriyor.
Ben bu hata ile Zend Tool kullanırken karşılaştım. Önceden oluşturduğum bir projeye ekstra bir modül eklemek istedim bu aracı kullanarak, ama bu sefer bu hatayı verdi.
Hazır çözümü bulmuşken paylaşayım dedim, çokca karşılaşılabilecek bir problem değil ama yine de birilerinin işine yarar sanırım.

14 Feb

PHP ile web servis oluşturmak

Sanırım ilk önce web servis nedir, neden gereklidir kısaca buna değinmek gerek. İnternette çokca kaynak bulabilirsiniz bu konuda, güzel anlatılmış ,bolca teknik terimler ile desteklenmiş. Ama ben farklı bir yaklaşım tarzı ile, mümkün olduğunca sade bir biçimde ele almaya çalışacağım.

Güzel bir uygulama geliştirdik, güzel güzel çalışıyor. Ama gün geldi farklı bir platformdan,farklı fiziksel bir yerdeki bir uygulama ile iletişim kurması, veri alışverişi yapması gerekti. Ne yapacağız, o dili mi öğreneceğiz ?  İşte bu durumda web servisler devreye giriyor.

Web servis ile, internet üzerinde herhangi bir platformdaki, herhangi bir dille yazılmış bir uygulama ile veri alışverişi gerçekleştirebiliriz. Bunu sadece veri alışverişi olarak sınırlamak da pek doğru değil, ama girişte bunun böyle bilinmesi sanırım yeterli olacak.

Konumuza bir örnek ile devam edelim. Bir siteniz var ve bu sitenizden kullanıcılarınız üyelik sistemi ile yararlanabiliyor. Bu sistemde kullanıcılarınıza SMS ile bilgi vermeye yarayan bir özellik aktif etmek istiyorsunuz. Ama bu servisi kontrol etmek elimizde değil, bu yüzden farklı bir yerden satın almak zorundayız. Biz SMS servisini satın aldıktan sonra, satıcı bize SMS gönderme işlemini kendi uygulamamız içerisinde gerçekleştirebilemiz için bir API (Applcation Programing Interface Uygulama Geliştirme Arayüzü) sunar. İşte bu API lerin iletişim yöntemlerinden biri de web servislerdir.

Yukarıda da bahsettiğimiz gibi, farklı platformlarımız var, ve bunların birbiri ile anlaşması gerekiyor. İşte burda da SOAP devreye giriyor. SOAP (Simple Object Access Protocol , Basit Nesne Erişim Protokolü). Tabiki ne bu bahsettiğimiz API çağrıları için, ne de web servis işlemleri için tek protokol SOAP değildir. Ama burda vereceğim örnekteki amaç SOAP dır.

PHP ile web servis geliştirme işlemi gerçekten çok kolaydır. Bunu iki farklı yöntem ile gerçekleştirebiliriz. Birincisi WSDL yardımı ile, ikincisi WSDL olmadan direkt PHP sınıfları ile. Birinci seçenek farklı bir yazımın konusu olacağından, ikinci yönteme geçelim.

Sistemin işleyebilmesi için bir sunucu , bir de istemci olması gerekiyor. Her ikisinin farklı yerde , farklı platform/dil de olması gerekiyordu, bizim örneğimizin işlevselliğini gösterebilmek için. Ama elimizde şu anda PHP var ve bu yüzden diğer özellikleri bir kenera bırakarak salt PHP ile yolumuza devam ediyoruz.

İlk önce sunucu tarafındaki kodlarımızı oluşturalım :

1
2
3
4
5
6
7
8
9
10
11
<?php
class SMS {
   public function gonder($mesaj,$konu,$kime){
      return 'mesaj gonderildi';    
        }
}
 $sunucu=new SoapServer(null,array('uri'=>'http://ersindogan-testuri'));

$sunucu->setClass('SMS');

$sunucu->handle();

Yukarıdaki kodumuzun içeriği bir anlamda tam değil, sadece uzak yordam çağrısı yapacağız, bize bir sonuç döndürmesi yeterli. Bu yüzden SMS mesajını başarılı bir biçimde göndermiş gibi yapan bir sunucu oluşturduk. Evet birkaç satır kod ile bunu başardık. Şimdi kısaca anlatmatya çalışayım yukarıdaki kodu :

SMS diye bir sınıf oluşturduk, bu sınıfımız SMS göndermeye , SMS gönderme işleminin sonucunu döndürmeye yarıyor. Sunucu olarak oluşturduğumuz nesne bir SoapSever nesnesi. Bu SoapServer nesnemiz, gelen uzak yordam çağrılarının, belirlenen şartlar doğrultusunda çalıştırılmasını ve sonucunun istemciye döndürülmesini sağlamak ile görevli.
Burda SoapServer nesnemize, SMS sınıfını baz almasını ve bu nesnenin metodlarını çalıştırabileceğini söyledik. Eğer bunun dışında çalıştırılması istenenen sınıf-fonksiyon çağrısı gelirse SoapServer istemciye hata döndürecektir.

SoapSever nesnemizi burda WSDLsiz oluşturduk ,WSDLsiz oluşturduğumuz için bir URI (Uniform Resource Identifier Tekörnek Kaynak Tanımlayıcı) tanımlamamız gerekir, bu uri herhangi bir benzersiz url olabilir. Bunu değiştirip değiştirmemek size kalmış. Daha sonra sunucumuzun baz alacağı nesnemizi tanımlıyoruz, son olarak da handle metodu ile de sunucumuzun gelen isteklere cevap vermesini sağlıyoruz. Şimdi de istemci tarfımızı oluşturalım.

1
2
3
4
<?php
$istemci=new SoapClient(null,array('uri'=>'http://ersindogan-testuri','location'=>'http://localhost/test/sunucu.php'));
var_dump($istemci->gonder('mesaj','konu','kime'));
?>

İşte istemci tarafımızda bitti. Yukarıdaki kodu anlatmadan önce, web sunucunuzda test diye bir klasör oluşturup içerisine sunucu.php ve istemci.php adında iki dosya ekleyin. sunucu.php dosyasına sunucu ile ilgili kodları ekleyin, istemci.php dosyasına da istemci ile ilgili kodları kopyalayıp dosyaları kaydedin. Daha sonra adres satırından http://localhost/test/istemci.php yazdığımızda

string ‘mesaj gonderildi’ (length=16)

biçiminde bir mesaj verecektir.
Şimdi en son yazdığımız kodu anlatabiliriz. Yukarıdaki kodda, istemcimiz , belirtilen sunucudaki metodu çağırdı ve sonucu aldı.
Çoğunlukla bu tür işlemleri aynı makinada, aynı platformda, hatta aynı programlama dilinde bile yapmazsınız. Taraflar hep farlıdır, ama anlaşma metodu ortaktır. İşte bu ortak nokta yardımı ile uzak sistemden bir yordam çağrısı yaparak işlemlerimizi gerçekleştirebiliriz.
Konuyu elimden geldiğince toparlayarak anlatmaya çalıştım, eksik -anlaşılmayan yerler olursa yorum düşerseniz cevaplarım mutlaka.
Bu konunun bir sonraki adımı WSDL de görüşmek üzere, hoşça kalın.

01 Feb

WordPress’de yeni gönderi (post) ekleyince hata vermesi

Bir wordpress güncellemesinden sonra başıma gelen bir olaydı bu. WordPress’i güncelledim , herşey yolunda gibi görnüyordu. Ama bir gönderi eklemek istediğimde hata verip gönderiyi kaydetmedi. Sonrasında bunu , php etiketlerine veya hoşuna gitmeyen birşeyler ile karşılaştığında yaptığını fark ettim.
İlk zamanlar , çok fazla yazı yazmadığım için önsemedim, bu şekilde kullanmaya devam ettim. Ama bir gün bir yazı yazarken o kadar sinir etti ki bu durum. Çözüm yolları aramaya başladım, o zaman ne gibi bir problem ile karşı kaşıya olduğumu anlayamadığım için aramalarım boşa gitti.
Ama sonradan tesadüfen okuduğum bir yazıda çözümü gördüm 🙂 Olay sunucuya kurulmuş olan mod_security den kaynaklanıyormuş, bunu düzeltmenin yolu da .htaccess dosyanıza aşağıdaki satırları eklemek.

1
2
3
4
<ifmodule mod_security.c>
SecFilterEngine Off
SecFilterScanPOST Off
</ifmodule>

Hepsi bu kadar, bundan sonra yine sinirsiz , stressiz gönderileri eklemeye devam edebilirsiniz

01 Feb

Ubuntuda bilgisayarı TV ye bağlamak

Aslına bakarsanız bu konu yazdığım yazıların profiline uymasada, bu konuyu burda paylaşmak istedim. Çünkü ( bilgisayarınız destekliyor ise ) çok kolay ve gerçekten işe yarayan bir şey.
Malzemeler :
S-video kablosu
svideo-kablosu
Sesi aktarabilmek için ses kablosu
ses-kablosu
Eğer TV de s-video ve ses girişi için gerekli yerler yoksa aşağıdaki gibi bir scart adaptörü
scart-girisi
Kabloları gerekli yerlere bağladıktan sonra scart-kablosuna-baglanmis-composit-ve-svideo-kablolariscartin-tvye-baglanmis-halisvideo-kablosu-ve-bilgisayar-cikisises-cikisi
Bilgisayarda gerekli ayarları yapmaya geldi. Yalnız benim kullandığım sistem ile sizin kullandığınız sistem arasında farklılıklar olabilir. Ama eğer temel mantığına dikkat ederseniz kendi sisteminize uyarlayabilirsiniz diye tahmin ediyorum.
Ben Ubuntu 9.10 ingilizce kullanıyorum ve ekran kartım NVIDIA Geforce 700M.
Ayarları System >Administration>Nvidia X Server Settings
Türkçe karşılığı Sitem > Yönetim >Nvidia X Sunucu Ayarları
bölümünden yapacağız. Bu ekrana geldiğinizde aşağıdaki gibi bir ekran ile karşılaşacaksınız
ubuntuda-bilgisayarin-tvye-baglanmasi
“Dedect Displays” (Ekranları algıla) dedikten sonra TV yi bulacaktır ( eğer bağlantıları yaptıysanız ) .  TV ekranını seçip  configure ( ayarlar) dedikten sonra gelecek olan ekrandan
tv-ayaralri
twinview ( ikiz görüntü ,bilgisayar ekranında işlerinizi yapmaya devam ederken TV ekranında film izlemenize olanak verir) seçip OK dedikten sonra yola devam edeceğiz.
Bu aslında bizim için yeterli, ayarları uygula (Apply) deyip , ayarların uygulanıp uygulanmamasını soran bir onaydan sonra işlem tamamlanacak. Sonra TV de AV tuşu ile uygun AV kanalını seçince ( ben AV2 ye takmıştım , bu yüzden AV2- S i seçtim) görüntüyü TV den görebileceğiz.
Bundan sonrasında birkaç ipucu vereceğim. Birincisi bağlantıyı S-video kablosu ile yaptığımız için AV kanalı seçerken mutlaka S kanalı olan bir AV seçmeliyiz.
Denemelerimde gördüğüm şey, eğer S kanalı olmayan bir AV kanalı seçersem görüntüde inanılmaz titreşimler ve renk kaymaları olduğu idi. TV de iki adet SCART girişi vardı. AV1 de S kanalı olmadığı için AV2 yuvasına takarak kullanıyorum.
İkinci dikkat edilmesi gereken şey, bilgisayarın görüntüsü TV ye aktarılınca kenarda boşluklar kalıyor bunuda nvidia ayar ekranından TV-0 bölümünden “TV OverScan” değerini arttırarak aşabiliriz. Bu değeri kendi ekranınıza göre yapabilirsiniz.
Son olarak TV-0 ekranından Tv ekranınızdaki görüntüler için gerekli ayarları yapabilirsiniz ( renk ayarları, ekran titreşim ayarları)
Aslında konu burada şimdiye kadar yazdığımdan daha uzun olacaktı , ama gereksiz ayrıntılardan kaçınıp biraz sadeleştirmek istedim, umarım işinize yarar.
Hoşça kalın.