Merhaba!
Uzun zaman oldu buralara uğramayalı. Tahmin ettiğiniz gibi artık PHP yazmadığımdan değil tabi! :) Cumartesi günü çok güzel bir etkinlikteydik. Yeni yüzler görme  ve kaliteli bir ekibi tanıma şansım oldu. Yazılım Atölyesi‘nin her ayın 3. Cumarteis gübü düzenlediği atölyeye katılma fırsatım oldu. İlk katılımımda da konuşmacı olarak çağırılmam gurur vericiydi. Etkinlik Hasan Tayyar Beşik‘in Hadoop ve PHP sunumu ile başladı, Büyük dataları (gerçekten büyük ama :) ) işleme ihtiyacı duyarsak nasıl bir yol izlerizin dışında PHP kullanırken böyle bir ihityacınız olursa nasıl bir yol izlersiniz Hadoop size ne sağlar bunu anlattı. Daha önce ihtiyaç duyduğum işler yaptım ama ne yazık ki şuan denemek için yer arıyorum. Ben de denersem buradan deneyimlerimi aktarırım inş. Gelelim organizasyonun kendisine, kaçırmamak için elimden geleni yapacağım. Tayyar’dan sonra sıra bendeydi : ) titrektim lan! başlangıc heyecanlı olsa da katılımcıların kalitesinden olsa gerek ki, sohbete dönüşünce çok eğlenceli bir sunum oldu benim için de. Canlı izleyen arkadaşların özellikle son sorunun, sunumun tüm amacını açıkladığını düşünüyorum. Yani bitişi de güzeldi. Onu da izleyin ben söylemeyeyim : )

Etkinlik videosu : http://www.livestream.com/nbajans/video?clipId=pla_1c1004f5-2f2b-45f9-a64c-9e2971570a06

Sunumum : http://tufanbarisyildirim.com/presentations/php-birakmak-icin-50-sebep/

 

Ve sunumdan birkaç görüntü  ..

Kısaca, .apk dosyalarından ihtiyacımız olan bilgileri alabilmemize yarayan ve geliştirmeyi düşündüğüm bir kütüphane. “aXml (Android XML)” diye adlandırdıkları, biraz araştırma sonucunda “Binary Xml” olarak bulduğum bir  formatta saklanıyor Android uygulama geliştirirken oluşturduğumuz xml dosyaları. Bunun önceisnde, .apk dosyasının özünde .zip dosyası olduğunu söylemek gerekiyor, zip olarak ele alıp sıkıştırılmış dosyaları cıkardıktan sonra geriye bu xml dosyalarını okunabilir hale getirmek kalıyor. Şuan her xmli çeviremese de, AndroidManifest.xml dosyasını okunabilir hale getirip, buradaki bilgileri de yine anlaşılır halde  (Android platform adı vs.) kaydedebiliyorsunuz.  Bu işi çok iyi yapan , java ile yazılmış apk-parser  (http://code.google.com/p/apk-parser/) üzerinde de çalışıp aynı şeyi yapabilmesi için geliştireceğiz.

Phpclasses adersi : http://www.phpclasses.org/package/7432-PHP-Extract-Application-Package-files-in-APK-format.html

 

Girhub Adresi :  https://github.com/tufanbarisyildirim/php-apk-parser

.apk dosyasındaki sıkıştırılmış dosyaları cıkarmak ve binary XML  dosyalarını (AndroidManifest.xml gibi ) okunabilir hale getirmeye yarıyor.

Bu yazıyı bitirme zorunluluğu hissetmem için bu haliyle yayınlıyorum. Güncellerim söz :)
Son güncelleme :  (1 Şubat 2012 16:06) “Integrations (Tools & Scriptting) ”

Bu aslında bir inceleme yazısı değil :) yıllardır kullandığım editörü, anlatmaktan ve karşılaştırmaktan bıktım. PhpED ile yeni tanışan insanlara faydalı olabilecek bir yazı olsun istedim.
PHPed “Ergin Soysal” tarafından geliştirilmiş ve tahminen 2001 sonlarına doğru Nusphere tarafından satın alınmış  hem php standartlarını, hem  Visual Studio standartlarını yakından takip eden, hem de çok sık güncelleme yapılan bir proje. Birçok dilde dinamik kod renklendirmesi, FTP / CSV / DB / SSH bağlantıları için tek tool olabilmesinin yanında bir geliştiricinin en çok ihtiyaç duyduğu debugging ve profiling işlemleri üzerine yoğunlaşmış yapısı var. PHP’nin bütün dinamikliğini o editöre sıkıştırabilme başarılarını da kutluyorum :)
Benim eksiğini hissetiğim tek şey, plugin development şansı vermemesi. Bunu da bizzat görüştüm, ve en esnek plugin yapısını getirmek için çalıştıklarını söylediler. Hatta son zamanlarda yaptıkları yenilikleri plugin olarak geliştiriyorlar. Bu da henüz bir api vermeseler de yapıyı oluşturkları anlamına geliyor. Heyecanla bekliyorum.

Syntax Highlighting

Her editörde olması gereken güçlü ve özelleştirileiblir bir highlighting var PhpED’de. Bunun yanında “Dynamic Highlighting” diye adlandırdıkları bir yöntemleri de var, embedded kodlara gelince geri kalanı pasif eden bir yöntem, hiç ısınamadım ama kısaca şoyle ; php / html / js kodlarını iç içe yazdığımızı varsayalım, php kodların olduğu satırlara focus olduğumuzda sadece php kodlar renkleniyor geri kalan griye (ya da belirlediğiniz renk) dönüşüyor. Aynısı diğer diller için de geçerli. genel olarak php / js / html yazdığımız bir sayfada soldaki gibi bir görebiliyoruz.

 

Code Folding

Code folding de yine standart editör özelliklerinden,  güçlü bir richtext editörü olduğunu da burda belirtmiş olayım, ayarlar bölümünden dosyaları açtığı anda collapse etmesini istediğiniz blokları belirleyebiliyorsunuz, ben mesela tüm fonksiyonları collapsed görmek istiyorum, malumunuz standartlara pek uyamadığımız için fonksiyonlarımız tek ekranda görünemeycek kadar büyük olabiliyor :)

 

 

Accounts

“Tools > Account” menüsünden ulaştığımız bu pencerede FTP / Veritabanı ve SSH hesaplarımızı kaydedip daha sonra bunları yardımcı pencerelerden kullanabiliyoruz, bunları ayrı ayrı incelemek istediğim için şimdilik bu ekranı göstermek yeterli.

 

 

 

SSH Tab

DB Tab

Üzerine pek yoğunlaşmadıkları bir özellik bu . Bence “Accounts” kısmı zenginleşsin diye yapılmış :) asıl işleri PHP zaten bunlara da  ihtiyacımız yok. Ama bunların da geliştirileceğinden eminim.
Accounts menüsünde DB accounts altında açacağımız hesaplarla birçok veritabanına IDEmiz üzerinden bağlantı sağlayabiliyoruz, çok basit bir arayüzle sorgularımızı çalıştırmamıza ve tam olmasa da arayüzüyle veritabanı yönetimine imkan sağlıyor.

o pencerede alınabilecek ilk hatalardan biri : “Client does not support authentication protocol  requested by server; consider upgrading MySQL client

PHPED’in dikkat ettiğim diğer ilginc özelliği de, eskiyi desteklemek için çaba göstermeleri,PHP4, Mysql4 sürümleri için  ekstra konfigürasyonlar yapıp bunları da destekliyorlar. phpedin kurulu olduğu klasörde bulunan “libmysql.dll” dosyasının server versiyonunuza uymaması yukarıdaki hatayı almanıza sebep olur. Tam açacak olursak, uymayan protokol aslında, Mysql 4.1 den sonra auth protokolü üzerinde değişiklik yapmış. Bu da Clientlerın güncellenmesini gerektiren birşey, ya da sunucuda eski protokolü desteklemesi için  http://dev.mysql.com/doc/refman/4.1/en/password-hashing.htm adresini takip ederek hem bu farkı anlayabilir, hem de old password konfigürasyonu yapabilirsiniz. Size tavsiyem, mysql serverin kurulu olduğu klasörden  C connector klasörü içinden libmysql.dll dosyasını alıp, phped klasörüne kopyalamanız.

 

Debugging

Debugger toolboxı diğer toolların bulunduğu panele sağ tıklayarak aktif ediyoruz,
Sırayla ikonları anlatırsak,

Run (Ctrl+F9): debug modu devreye sokmadan, bulunduğumuz sayfayı direk çalıştıran butondur. Output adında bir pencere açar ve tarayıcıda göreceğimiz şekliyle bize projemizi çalıştırıp sunar.

Run in debugger (F9) :  Debug modda projeyi çalıştırır, Normal şartlarda breakpoint görene kadar çalışır, yoksa Run ile bir farkı yoktur, ama “Tools > Settings > Run & Debug > Settings”  panelinde break  “Break on start,  Break on Error  ve Break on Exceptions” ayarları açık geldiğinden, ilk satırda durur ve sizin bir işlem daha yapmanızı bekler, hatalarda ve custom exceptionlarda durur.

Run Profiler(Alt+F9) : Profilerı çalıştıran butonumuz, performans analizi yaparken sıkça kullanacağınız butondur, Profiling olayını daha da detaylandırmadan önce kısaca şunu söyleyelim, display moduna göre sizin hangi satırda, hangi fonskyionda ya da hangi dosyaya kaç defa uğradığınızı, ve orada ne kadar zaman harcadığınızı yazar, (herhangi bir expression içermeyen satırlar profilingi pek ırgalamıyor :) o da biline)

Kısaca böyle bir çıktı veren profiling toolumuzda kullanacağımız özelliklerden hemen bahsedeyim, “M/F/L” butonları. Modüle / Functions(Routine) /Line. M butonu ile Dosyaya göre gruplayıp detayda satırları görebiliyoruz (eval() bloklarını da ayırır.) F butonu ile fonksiyonlara göre gruplanmış ve yine detayda satırları veren raporu görebiliyoruz, L butonu ile de satırlara göre gruplanmış ama detayı olmayan (kendisi detay zaten) bir rapor görüyoruz. Aldığımız çıktıdaki Heat titlellardan herşey anlaşıldığı için raporu nasıl yorumlayacağınızı da  size bırakıyorum. Birşey daha eklemek gerekirse bu satırlara çift tıkladığımızda ilgili kodun bulunduğu dosyaya ve satıra gidiyor.

 

Remote Debugging

– gelecek –

CSS Önizleme

Preview Özelliği yabancı olduğumuz bir CSS dosyasını görsel bir şekilde incelemek için çok iyi kısaca ekran görüntüsü saolda. güncellenecek.

 

 

 

 

 

Tasarım önizleme

Encoding

Database

Autocomplete (phpdoc.)

PhpDOC standartları

Framworkler ve dinamik sınıflarla çalışırken autocomplete.

Integrations (Tools & Scriptting)

“Tools > Settings ” Penceresinde  “Tools > Integrations”  menüsünden ulaştığımız bu araçla, PhpED’e shell script çalıştırtabiliyoruz,
Entegre gelen CSV / Polystyle gibi araçlar için halihazırda yazılmış örnekleri ve Ortam değişkenlerini kullanarak işlerinizi kolaylaştırabilirsiniz.
SVN için Shell Menü kullanılıyor olsa da, Svn Update ve Svn Info menüleri ekledim, Update bana yeni pencere açmasın ve console çıktısını da log windowa düşsün istedim, ikinci action da  “svn info @ProjRoot@” ile  proje klasorunun svn bilgilerini (revizyon tarihi,son revizyonun sahibi vs.)  projede kullanabileceğim bir yere yazdırıyorum, hem versiyon takibini projeye entegre etmiş oldum, hem de bu işlemleri tek tıkla yapabilmiş oldum.  Tek başına  kullanışlı bir “SVN” Menüsünü hazırlayınca onu da buraya paylaşırım.

 

Build-in fonksiyonlarda Funcitons penceresini otomatik açma.

Frameworkler birer birer Namespace yapısına geçmeye başladı. Bu da konunun daha çok konuşulmasına ve soruların artmasına neden oldu. Şu adresteki soruları incelemenizi istiyeceğim ( php namespaces at stackoverflow ) 188 çok değil ama zamanım oldukça oradaki soruları da analiz etmeye çalışacağım.

Namespace, bilindiği üzere birçok dilde zaten kullanılan bir yöntem, ve bana göre kütüphanelerin birleştirilmesi / farklı geliştiricilerin oyuna dahil olması anlamında çok gerekli bir özellik. Kısaca neden kullanırız? Bize ne sağlar? Ve buna PHP tarafından bakarsak, nasıl kullanırız? Nelere dikkat etmemiz gerekir bunları yazmaya çalışacağım. Sadece yazılımsal (syntactic) olarak değil, anlamsal olarak da (semantic) bize sağlayacağı kolaylık ve zorluklardan bahsetmek istiyorum.

Hiç namespaces hakkında bilginiz olmadığını düşünerek şöyle somutlaştırmak istiyorum, Tufan diye bir arkadaşınız olduğunu düşün, arkadaşlar arasında bahsederken Tufan onu tanımlar, ve yeni bir Tufan arkadaşınız olunca artık “hangi Tufan?” soruları başlar öncelikle. Problem burda başlar ve siz buna bir çözüm bulursunuz, “Yıldırım Tufan” evet. Çözdünüz. Yazılımda bu problemin çözümü de Namespace ile gelmiş oluyor. Hangi PDF sınıfı? Zend\Pdf sınıfı.

Artık teknik olarak devam edelim,

Namespace Tanımlama:

0
1
2
3
4
5
6
7
8
<?php
namespace Uygulamam
{
 /**
  * Standart olarak bu parantezler arasına yazılacak herşey  "Uygulama" içine dahil olacaktır.
  * çağırılırken bu alanda değilsek  \Uygulama\ önadını kullanacağız.
  */
}
?>

Alternatif bir yazım şekli olarak parantezleri kullanmama özgürlüğmüz de var

0
1
2
3
4
5
6
<?php
namespace Uygulamam
   /**
   * Standart olarak bu satırdan sonra yazılacak herşey  "Uygulama" içine dahil olacaktır.
   */
 
?>

İç içe namespace tanımlamak istediğimizde de “\” ters slash kullanabiliriz, kısaca ornek verelim, namespace, fonksiyonları ve classları özelleştirmemizi sağladığı gibi, namespaceleri de bir namespace dahil ederek özelleştirebiliriz gayet basit.

0
1
2
<?php
   namespace Uygulamam\Mobil\Android;
?>

Normal şartlarda, her namespace için bir dosya kullanmamız önerilir, fakat siz tek dosyada birden fazla namespace kullanmak istiyorsanız, bunların birbirilerini nasıl etkileyeceğini bilmelisiniz, “Mobil” namespace  için tek dosya kullanmak istiyorsak örnek verelim

Bir dosyada birden fazla namespace tanımlarken, parantez kullanımına dikkat etmeliyiz, parantez kullanıyorsak bu namespace içine bir namepsace tanımlanamaz yani kısaca “namespace Uygulama {   namespace Mobil {  }   }“  gibi bir yazım hata sebebedir.
ve aynı dosyada herhangi bir namespace ait kodlar da bulunamaz. Örneği vermeden önce de şunu söylemek gerekiyor ki; alt namespaceler tanımlarken sahip namespace (örn : Uygulama) nin tanımlanmış olmasına gerek yok. Yani biz Uygulama diye bir namespace tanımlamadan Uygulama\Mobil ya da Uygulama\Mobil\Android diye namespace tanımlayabiliriz.

Örnek :

0
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
<?php
//library.php olsun.
namespace Uygulamam\Mobil\Android
    {
        class View
        {
            public function view()
            {
                print 'I will include a view file for ' . __NAMESPACE__;
            }
        }
    }
 
    namespace Uygulamam\Mobil\IPhone
    {
        class View
        {
            public function view()
            {
                print 'I will include a view file for ' . __NAMESPACE__;
            }
        }
    }
 
  namespace Uygulamam\Mobil
  {
     $b = new Android\View();
     $b->view();
  }
 
?>

Örneği çalıştırmanızı rica ediyorum, ve tek dosyada incelemek istediğimiz için böyle bir yazım yaptık, şimdi analiz edelim,

Uygulamam\Mobil\Android ve Uygulamam\Mobil\IPhone alanlarına aynı isimde, aynı medodlara sahip “View” adında bir class tanımladık,  kullanım kısmındaki ayrıntıyı da gösterebilmek için son namespacei “Uygulamam\Mobil” olarak tanımladım, böyle tanımlamak zorunda mıyız? tabi ki hayır, bu namespace içine yazacağımız ve çağıracağımız herşey Uygulamam\Mobil namespace içine dahil olacaktır. Önce kendimizi bir Namespace içine dahil ettik, sınrasında yazdığımız “new Android\View()“  terimi  başında “\” olmadığı için dahil olduğumuz namespace içindeki “Andorid” anlamına geldi yani ” \Uygulamam\Mobil\Android“  oldu çıktıyı da incelersek

“I will include a view file for  Uygulamam\Mobil\Android” Şimdi yeri gelmişken __NAMESPACE__ sabitini de inceleyelim. Tahmin edebileceğiniz gibi bulunduğumuz namespacei tespit etmemizi sağlayan bir sabit (her namespace için değişiyorsa bu nasıl sabittir ?)  sihirli sabitler diye türkçeye çevirebileceğimiz “Magic Constatns” konusunu inceleyebilirsiniz,

“Use”

Karmaşık ve iç içe çok namespace içeren projelerimizde, uzun isimler olacaktır  Örnek : “namespace Uygulamam\Mobil\Android\WebServices\NuSoap” bu alanlar içindeki sınıf ve fonksiyonlara ulaşmak istediğimizde, bu pathı tekrar tekrar yazmak elbette hoşumuza gitmeyecektir, namespace bir zorluk olaacaktır. “use” keywordu bize bu sınıflara o blok içinde kısa isimler vermemiz konusunda yardımcı olacak. Önceki dosyamızın adı “library.php” olsun ve bahsettiğimiz namespacei içine 2 sınıfla beraber tanımlayalım.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// libraray.php'nin devamı
namespace Uygulamam\Mobil\Android\WebServices\NuSoap
    {
        class Users
        {
            public function getUsers()
            {
                return array('User 1','User 2');
            }
        }
 
        class Posts
        {
            public function getPosts($userId)
            {
                return array('Post 1','Post2 2');
            }
        }
    }
 
?>
0
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
<?php
  /**
  *  Bu uzun ismi her sınıf için tekrar yazmamak için bir alias tanımadık.
  *  artık kısaca Webservice\Users gibi ulaşabiliriz
  */
  use \Uygulamam\Mobil\Android\WebServices\NuSoap as WebService;
 
  include 'library.php';
 
  $usersService = new WebService\Users();
  $postService = new WebService\Posts();
 
  $users = $usersService->getUsers();
 
  var_dump($users);
 
  //output
  /**
     I will include a view file for Uygulamam\Mobil\Android
     array(2) {
      [0]=>
      string(6) "User 1"
      [1]=>
      string(6) "User 2"
    }
  */
?>

“use ” kullanabilmek için bu namespacein tanımlanmış olmasına gerek yok, bu yüzden okunabilirlik için “use” bloklarını hep en üstte tutmaya çalışın. Sadece çağrılınca bunun varlığı kontrol edilir. biz de zaten sonrasında include “library.php” diyerek tanımlamış olduk.

yani şu iki satırın anlamı kısaca şöyledir.

0
1
  $usersService = new WebService\Users(); // new  \Uygulamam\Mobil\Android\WebServices\NuSoap\Users();
  $postService = new WebService\Posts(); // new  \Uygulamam\Mobil\Android\WebServices\NuSoap\Posts();

Örnek Dosyalar: http://www.tufyta.com/wp-content/uploads/2011/10/php-namespaces.zip

– buraya trickler, hatalara sebep olabilecek kullanımlar vs. gelecek –

Not:  Lütfen, eklemek, düzeltmek, sadeleştirmek istediğiniz şeyler varsa, yorum / mail olarak atabilirsiniz, “PHP Namespaces” için kapsamlı bir döküman oluşması konusunda yardımcı olan herkese şimdiden teşekkür ediyorum.

© 2012 Tufan Suffusion theme by Sayontan Sinha