YARP ile PageBar eklentilerinin uyumsuzluğunu gidermek

WordPress sitenize YARP (Yet-Another-Related-Posts) eklentisi ile PageBar eklentilerini yüklediğinizde YARP’ın yönetim sayfası aşağıdaki hatayı veriyor ve yönetemiyorsunuz.

Fatal error: Cannot redeclare checkbox() in guvenli_dizin/wp-content/plugins/yet-another-related-posts-plugin/options.php on line 134

Hata mesajından yola çıkarak options.php‘nin 134. satırındaki function checkbox() isimli foksiyonunun daha önce de tanımlanmış olduğunu anlıyoruz. WordPress’in plugins dizininde ufak bir arama yaptıktan sonra PageBar eklentisinin kodlarında aynı isimde bir başka fonksiyonun tanımlandığını gördüm. Sorunu çözmek için fonksiyonun ismini checkbox_() şeklinde değiştirip kaydettikten sonra sorun çözüldü. Tabi  options.php içinde çağrı yapılan tüm yerlere de aynı değişikliği uyguladım. Kolay olması açısından kullandığınız editörün düzen menüsündeki bul ve değiştir seçeneğini kullanarak bu işi hızlıca yapabilirsiniz. Aranacak değeri checkbox( değiştirilecek değeri de checkbox_( olarak verdim ve options.php dosyasını sunucuya tekrar yükledim. Bu şekilde yapınca sorun çözülüyor fakat YARP’ın her güncellemesinde bu işlemi yeniden yapmak gerekiyor. YARP’ın geliştiricileri ilgilenir düşüncesi ile bir hata bildiriminde de bulundum.

Aslında checkbox() ve textbox() gibi jenerik isimlerin eklentilerde fonksiyon ismi olarak kullanılmaması gerekir. Bu isimlerin yerine yarp_checkbox() gibi eklentiye özel bir isimlendirme tercih edilebilirdi.

WordPress ile 404 hatalarını tespit etmek

Benim gibi dotclear‘dan wordpress’e göç etmiş bir blogcu iseniz yeni sitenizdeki bazı URL adreslerinin 404 hatası vermemesi neredeyse mümkün değil. Arama motorlarının indekslemiş olduğu URL adresleri sitenizde karşılık bulmuyorsa başınız biraz dertte demektir. Arama motorları bu adresleri periyodik olarak ziyaret ettikleri için sürekli 404 hataları ile karşılaşacakdır. 404’lerin ele geçirdiği bir site arama motorlarının gözünde değer kaybeder.

WordPress altyapısını kullanan sitenizin derinliklerindeki geçersiz URL adresleri haberiniz olmayan birçok 404 hatasını üretmektedir. Şahsen uzunca bir süre farkında olmadığım ve aslında kolayca tespit de edilemeyecek bu durumu düzeltmek biraz zamanımı aldı doğrusu. Bu sorunu gidermek çin aşağıdaki PHP kodlarını yazdım.

Kodları wordpress temanıza ekleyerek siz de kullanabilirsiniz. Kodlar sitenizde var olmayan bir adres talep edildiğinde, ilgili adresi ve isteğin kimden geldiği gibi bilgileri eposta adresinize göndererek raporlayacaktır. Bundan sonra iş gelen raporlara göre kırık bağlantıları onarmaya geliyor. Bir hafta içerisinde posta kutumda 2000’e yakın rapor birikti. Okumaya devam et “WordPress ile 404 hatalarını tespit etmek”

WordPress’i Hızlandırma ve Performans İpuçları – I

wordpress-performans-hız

WordPress’inizin başarımından (performansından) şikayetçi iseniz bu yazı tam size göre. WordPress başarımı hakkında sürekli yazmayı düşündüğüm bu yazı dizisinin ilkinde başarım artırmaya yönelik WordPress bileşenleri üzerinde duracağım.

WordPress (WP)’in performansını artırmak için kullanılan WP-Cache, Hyper Cache, WP Super Cache ve 1 Blog Cacher gibi birçok  eklenti var. WP sunucuyu çok fazla yoran bir script değil fakat kullanılan eklentiler ve temanızın özellikleri sunucuya yük getirebilir. Bu da sayfalarınızın açılma süresine olumsuz etki eder. Hatta sunucunuzun yöneticisi bu durum hakkında sizi uyarabilir.  WP’e geçtikden sonra eklentilerin sayfa açılma/oluşturma hızını nekadar etkileyebileceğini iyi öğrendim. WordPress başarımını artırmak için önbellekleme (Caching) eklentilerini kulllanmak iyi bir çözüm olabilir.

Okumaya devam et “WordPress’i Hızlandırma ve Performans İpuçları – I”

eniXma: Online özgür ve açık kaynak yazılım dergisi

eniXma isminde yeni bir linux dergisinin varlığını büyük bir sevinç ve heyecan içinde haber veriyorum. Bazıları günaydın diyebilir, haklılar ;) IBM’in çıkarttığı Özgür Yazılım ve Haber dergilerinden sonra Türkçe olarak hazırlanan bu güzel derginin mevcut açığı kapatmada, özgür yazılım hareketinin daha geniş kitlelere yayılması ve özgür yazılımın ülkemize sağlayacağı faydaya katkıda bulunması açısından sevinç verici. Umarım daimi olur. eniXma’nın bu ayki sayısının içeriğinde şunlar varmış:

  • Basket
  • Ekran Kaydediciler
  • Katapult
  • Firefox 3.0
  • GPG Nedir?
  • OTR Şifreleme
  • Mandriva’da Disk Yönetimi
  • Size Özel Fedora
  • Linpus Linux Lite
  • OpenSUSE 11.0

eniXma isminde yeni bir linux dergisinin varlığını büyük bir sevinç ve heyecan içinde haber veriyorum. Bazıları günaydın diyebilir, haklılar ;) IBM’in çıkarttığı Özgür Yazılım ve Haber dergisinden sonra Türkçe olarak hazırlanan bu güzel derginin mevcut açığı kapatmada, özgür yazılım hareketinin daha geniş kitlelere yayılması ve özgür yazılımın ülkemize sağlayacağı faydaya katkıda bulunması açısından sevinç verici. Umarım daimi olur. eniXma’nın bu ayki sayısının içeriğinde şunlar varmış:

  • Basket
  • Ekran Kaydediciler
  • Katapult
  • Firefox 3.0
  • GPG Nedir?
  • OTR Şifreleme
  • Mandriva’da Disk Yönetimi
  • Size Özel Fedora
  • Linpus Linux Lite
  • OpenSUSE 11.0

Okumaya devam et “eniXma: Online özgür ve açık kaynak yazılım dergisi”

Google Summer of Code: PHP-Based Docbook renderer

Burada PhD adındaki,  Docbook formatlı dökümanları chm ve pdf gibi daha taşınabilir ve yaygın formatlara çeviren bir proje yer alıyor. Şimdiden PHP için oldukça kapsamlı bir başvuru klavuzu chm formatına çevrilmiş ve indirilmeye hazır. PHP programcılarının mutlaka elinin altında hazır olması gereken bir klavuz. Siteden indirirken sorun olursa buradan da indirebilirsiniz.

Hertürlü projeniz için: EmbededMySQL

Projelerinizde gömülü olarak kolayca kullanabileceğiniz bir MySQL paketi hazırladım. Google’un bile kullandığı MySQL,herzaman performansı ve rahat kullanımıyla dikkat çeker. Ticari olmayan projelerdeki kullanımında herhangi bir kısıtlama olmayan MySQL veri tabanı sunucusunu, kolay bir şekilde her türlü projenizde kullanabilirsiniz.

Okumaya devam et “Hertürlü projeniz için: EmbededMySQL”

max_user_connections hatası almak için güzel bir yol söyleyebilirim

PHP kodlarken veritabanı sorgularında kolaylık sağlasın diye SQL cümlemizi alıp sorgu sonucunu döndüren execSQL, execQuery vs gibi fonksiyonlar tanımlayıp kullanırız.  Böylece her seferinde sunucu bağlantısı ve veritabanı seçimi ile uğraşmaktan kurtulmuş oluruz. Tabi kurallara uyan tertipli her programcı gibi fonksiyonun sonunda da mysql_close ile açtığımız bağlantıyı sonlandırmayı unutmayız. Aslında bazen unutmalıyız. Peki neden?

PHP kodlarken veritabanı sorgularında kolaylık sağlasın diye SQL cümlemizi alıp sorgu sonucunu döndüren execSQL, execQuery vs gibi fonksiyonlar tanımlayıp kullanırız.  Böylece her seferinde sunucu bağlantısı ve veritabanı seçimi ile uğraşmaktan kurtulmuş oluruz. Tabi kurallara uyan tertipli her programcı gibi fonksiyonun sonunda da mysql_close ile açtığımız bağlantıyı sonlandırmayı unutmayız. Aslında bazen unutmalıyız. Peki neden?
Okumaya devam et “max_user_connections hatası almak için güzel bir yol söyleyebilirim”

PHP ile garantili mail göndermek

PHP’nin resmi sayfasında mail komutunun kullanımı hakkında şu bilgiler yer alıyor:

Kullanımı:

bool mail  ( string $to  , string $subject  , string $message  [, string $additional_headers  [, string $additional_parameters  ]] )

Mail komutunda kullanılması zorunlu parametreler:

  • $to: PHP ile mail göndereceğiniz kişinin adresi. Tipi string’dir.
  • $subject: Mail’in konusu. Tipi string’dir.
  • $message: Göndermek istediğiniz mail’in içeriği. Tipi string’dir.

Not: String tipine Türkçe’mizde bazen katar bazen de karakter dizgesi adı verilmektedir.

Dördüncü ve beşinci parametrelerin kullanılması zorunlu olmamakla birlikte görevlerini kısaca söyle açıklayabiliriz.

  • $additional_headers: Bu kısımda, gönderen adresi, karbon kopya (CC) adresi ve gizli karbon kopya (BCC) adresi gibi adresler belirtilebilir. CC adresi, gönderilen mailin bir kopyasının da (karbon kopya) başka bir adrese gönderilmesini sağlar. CC alıcısı gelen mail’in başlık bilgilerinden mail’in asıl alıcısının kim olduğunu görebilir.  BCC, CC ye benzemekle birlikte, tek farkı, asıl alıcı ile CC alıcısının mail’in bir kopyasının da BCC adresine gönderildiğini bilememesidir. Mail sunucusu başlık bilgilerine bu adresi dahil etmez. Bu kısımın da veri tipi String’dir.
  • $additional_parameters: SendMail yazılımına parametre yollamak için kullanılıyormuş. Ayrıntısını şimdilik bilemeyeceğim.

PHP’nin resmi sayfasında mail komutunun kullanımı hakkında şu bilgiler yer alıyor:

Kullanımı:

bool mail ( string $to  , string $subject  , string $message  [, string $additional_headers  [, string $additional_parameters  ]] )

Mail komutunda kullanılması zorunlu parametreler:

  • $to: PHP ile mail göndereceğiniz kişinin adresi. Tipi string’dir.
  • $subject: Mail’in konusu. Tipi string’dir.
  • $message: Göndermek istediğiniz mail’in içeriği. Tipi string’dir.

Not: String tipine Türkçe’mizde bazen katar bazen de karakter dizgesi adı verilmektedir.

Dördüncü ve beşinci parametrelerin kullanılması zorunlu olmamakla birlikte görevlerini kısaca söyle açıklayabiliriz.

  • $additional_headers: Bu kısımda, gönderen adresi, karbon kopya (CC) adresi ve gizli karbon kopya (BCC) adresi gibi adresler belirtilebilir. CC adresi, gönderilen mailin bir kopyasının da (karbon kopya) başka bir adrese gönderilmesini sağlar. CC alıcısı gelen mail’in başlık bilgilerinden mail’in asıl alıcısının kim olduğunu görebilir.  BCC, CC ye benzemekle birlikte, tek farkı, asıl alıcı ile CC alıcısının mail’in bir kopyasının da BCC adresine gönderildiğini bilememesidir. Mail sunucusu başlık bilgilerine bu adresi dahil etmez. Bu kısımın da veri tipi String’dir.
  • $additional_parameters: SendMail yazılımına parametre yollamak için kullanılıyormuş. Ayrıntısını şimdilik bilemeyeceğim.

Okumaya devam et “PHP ile garantili mail göndermek”

Revolution OS: Linux, Gnu ve OpenSource

 GNU/Linux’un ve GNU felsefesinin nasıl çıktığını, nasıl geliştiğini ve bu gelişim süreci esnasında yaşanan olayları GNU dünyasının efsaneleri kendi ağızlarından anlatıyorlar. Pek fazla teknik bilgi gerektirmeden izlenebilecek bir film olan Revolution OS Linux, GNU ve Open Source konusunda  güzel bilgiler veriyor.

Oyuncular: Linus Torvalds, Richard M. Stallman, Eric Raymond, Bruce Perens, Larry Augustin, Michael Tiemann, Brian Behlendorf, Frank Hecker, Chris DiBona, Nick Moffitt, Rob Malda, Donnie Barnes

GNU/Linux’un ve GNU felsefesinin nasıl çıktığını, nasıl geliştiğini ve bu gelişim süreci esnasında yaşanan olayları GNU dünyasının efsaneleri kendi ağızlarından anlatıyorlar. Pek fazla teknik bilgi gerektirmeden izlenebilecek bir film olan Revolution OS Linux, GNU ve Open Source konusunda  güzel bilgiler veriyor.

Oyuncular: Linus Torvalds, Richard M. Stallman, Eric Raymond, Bruce Perens, Larry Augustin, Michael Tiemann, Brian Behlendorf, Frank Hecker, Chris DiBona, Nick Moffitt, Rob Malda, Donnie Barnes

Okumaya devam et “Revolution OS: Linux, Gnu ve OpenSource”

3B Linux çekirdek animayonu

Üstteki resimler Linux çekirdek kaynak kodlarının 3-boyutlu animasyonuna ait. Kaynak kod bağımlılıklarının hareketli bir animasyonla gösterildiği filmde çekirdeğin ne kadar kompleks olduğunu daha iyi görülebiliyor. Görüntüyü daha iyi anlamak için animayon hakkında şu açıklamaları yapmakta fayda var;

Yeşil kutular dosyaları temsil ediyor.
Yeşil ağaç, işletim sisteminin dizin yapısını temsil ediyor.
Mavi hatlar fonksiyonların bağımlılıklarını,
Kırmızı hatlar değişken bağımlılıklarını,
Sarı parlak kutular dosya boyut değişikliklerini,
Yeşil parlak kutular dizinler arasında taşınmış dosyaları,
Kırmısı parlark kutular yeni dosyaları temsil ediyor.

Animasyonlar:
http://www.pabr.org/kernel3d/245.mpg (384×288, 2000 frames)
http://www.pabr.org/kernel3d/120-241.mpg (384×288, 1400 frames)
http://www.pabr.org/kernel3d/120-241s.mpg (320×240, 1200 frames, low motion)

Kaynak: http://www.pabr.org/kernel3d/kernel3d.html

Script çalışırken çıktı vermek

Bir PHP script’inin çıktısı script’in çalışması tamamlandıktan sonra gönderilir. Scrip çalışmaya devam ederken sayfada/ekranda bir çıktı gözükmez. Script’in oluşturduğu tüm çıktılar Output Buffer (ob) adı verilen tamponda tutulur. Programcı isterse bu tamponu ob_ fonksiyonlarıyla kontrol edebilir. Tampondaki içeriği istenildiği anda çıktı vermek için için ob_flush() komutu kullanılabilir. ob_flush cağrıldığında o ana kadar çıktı tamponuna biriktirilen tüm içerik tarayıcıya bir header yardımıyla gönderilir ve görüntülenmiş olur.

Çıktının zamanlamasını ayarlayarak göze hoş gözüken sayfa yüklemeleri elde edilebilir. Yine ob_flush ile uzun bir işlemi yerine getiren script’in, kullanıcıyı  o anda yağtığı iş hakkında bilgilendirmesi için faydalıdır. Gerektiğinde bu özellik kullanılırsa ziyaretçinin sayfa izleme kalitesi artacaktır.

Aşağıdaki kodda  ob_imlicit_flush komutunun kullanımına örnek yer alıyor. Bu komut çıktı tamponunu devre dışı bırakır ve echo gibi her çıktı komutunun ardından çıktının anında tarayıcıya gönderilmesini sağlar. Aşağıdaki kodun çalışan halini buraya tıklayarak izleyebilirsiniz.

Dikkat edilmesi gereken bir nokta, ob_flush komutundan hemen sonra flush() komutunun da kullanılması gerektiğidir.

Insan doğrulama için değişik bir yöntem

CAPTCHA insan doğrulama için ençok kullanılan yöntem. CAPTCHA resimli yöntemde (bu sene OSYM sonuçları açıklamak için de kullandı) eğri büğrü (robotik bir yazılımın okuyabilmesi çok güçtür) harfleden oluşan bir kelimeyi kutuya girmemizi istiyor. Kodu doğru olarak okumayı başarır ve gönderirseniz karşı taraftaki yazılım isteği yapanın bir program değil de gerçek bir bir insan olduğuna karar veriyor. Aksi takdirde ilgili servisi kullanmanıza izin vermiyor. Web in kirlenmesi ve haksız web servisi kullanmanın önüne geçmek adına, robot yazılımların kolaylıkla çözemeyeceği bu resim kodları kullanmak son zamanlarda çok işe yarıyor.

Resim kodu kullanmanın yanında daha basit ilginç bir çözüm ise tarayıcı tarafında javascript kullanarak insan etkileşimi teyit etmek. Örnek vermek gerekirse bir insan formu dolduruken kutuların içine tuş basımı gerçekleştirir (onkeydown-onkeyup) veya formu gönderirken submit düğmesinin tıklama (onmousedown-onmouseup-onmousemove) olayını tetikler. Ancak robotik bir yazılım bunların hiçbirini yapmayacağından fark kolaylıkla tespit edilebilir. Javascript ile onKeyDown ve onMouseMove olayları yardımıyla forma verisine bir onay kodu eklenebilir.

Kaynak: http://www.0x000000.com/?i=224

Google javascript ‘i dikkate alıyor

Burada söylendiğine göre;

“/human”+Math.round(99999*Math.random())+”.png”

gibi bir javascript kodu ile dosya ismi olusturulan bir sayfa var diyelim. Bilinenin aksine arama motorları bu sayfadaki javascript’i görmezden gelmiyor (1).  Web sunucusunun kayıtlarından google bot’unun javascript kodu bulunan sayfayı taradıktan sonra aşağıdaki gibi bir istekte bulunduğu görülüyor. Bir ölçüde de olsa javascript içeriğinin taranması güzel bir durum.

66.249.66.73 crawl-66-249-66-73.googlebot.com – -[29/Jul/2007:15:54:11 +0100]
GET /human HTTP/1.1 404 211

[1] Googlebot’unun javascript içeriği de bir ölçüde de olsa taradığını görmüş olmak güzel. [1] – Burada ve burada da geçtiği üzere javascript arama motorları tarafından tanınmayan bir öğe olarak bildirilmiş. Ayrıca javascipt li içerik varsa <noscript> tag’i ile tekrar sunulması tavsiye edilmiş.

uncaught exception: XMLHttpRequest.open methodunun çağrılması için gerekli izniniz yok.

Gece vakti aşırı korumacı bir tarayıcıyla başım dertte. Firefox yerel bir dosyadaki XMLHttpRequest kodu ile uzak bir siteden veri çekeceğinde bu hatayı verdi. Aslında uyarı demek daha doğru olacak. Bununla karşılaşana kadar Internet Explorer 6 da böyle bir durumun varlığından bile haberim yoktu. İşin aslı burada yazdığına göre yüce tarayıcı Firefox’un bir güvenlik özelliği. Kısaca Firefox çapraz-alan adı (cross-domain) sorgulamalarına izin vermiyor. Yani isteyensiten.com alan adından baskabirsite.com adresindeki bir veri kaynağından AJAX ile XML olarak veri istemek pek mümkün değil. Denerseniz şöyle bir hata mesajı alıyorsunuz, benden söylemesi ;)

Error: uncaught exception: 
Permission denied to call method XMLHttpRequest.open

Gece vakti aşırı korumacı bir tarayıcıyla başım dertte. Firefox yerel bir dosyadaki XMLHttpRequest kodu ile uzak bir siteden veri çekeceğinde bu hatayı verdi. Aslında uyarı demek daha doğru olacak. Bununla karşılaşana kadar Internet Explorer 6 da böyle bir durumun varlığından bile haberim yoktu. İşin aslı burada yazdığına göre yüce tarayıcı Firefox’un bir güvenlik özelliği. Kısaca Firefox çapraz-alan adı (cross-domain) sorgulamalarına izin vermiyor. Yani isteyensiten.com alan adından baskabirsite.com adresindeki bir veri kaynağından AJAX ile XML olarak veri istemek pek mümkün değil. Denerseniz şöyle bir hata mesajı alıyorsunuz, benden söylemesi ;)

Okumaya devam et “uncaught exception: XMLHttpRequest.open methodunun çağrılması için gerekli izniniz yok.”

The CoDeeN Content Distribution Network

CoDeeN yüksek performanslı içerik saklama ve dağıtmak amacıyla geliştirilmekte olan bir proje. Asıl Princeton üniversitesi bünyesinde geliştirilen proje birçok üniversitenin de desteğiyle test edilmekte ve geliştirilmekte. Amacı bir proxy network’ü oluşturarak kullanıcılarına içeriği en kısa zamanda en etkin ağ kaynağı kullanarak sunmak olan proje diğer yandan da önbellekleme yaparak içerik kaynaklarının yükünü hafifletme amacını taşıyor. Proje network’ündeki bir proxy’i kullanan bir kullanıcı sıradan web proxy’lerinden farklı olarak istediği içeriğe ulaşabilmek için uygulamaya dahil proxy’ler arasında en uygun CoDeeN proxy’sine yönlendirilebiliyor. CoDeeN hakkında daha fazla bilgi için bu sunuyu izleyebilirsiniz.

CoDeeN yüksek performanslı içerik saklama ve dağıtmak amacıyla geliştirilmekte olan bir proje. Asıl Princeton üniversitesi bünyesinde geliştirilen proje birçok üniversitenin de desteğiyle test edilmekte ve geliştirilmekte. Amacı bir proxy network’ü oluşturarak kullanıcılarına içeriği en kısa zamanda en etkin ağ kaynağı kullanarak sunmak olan proje diğer yandan da önbellekleme yaparak içerik kaynaklarının yükünü hafifletme amacını taşıyor. Proje network’ündeki bir proxy’i kullanan bir kullanıcı sıradan web proxy’lerinden farklı olarak istediği içeriğe ulaşabilmek için uygulamaya dahil proxy’ler arasında en uygun CoDeeN proxy’sine yönlendirilebiliyor. CoDeeN hakkında daha fazla bilgi için bu sunuyu izleyebilirsiniz.
Okumaya devam et “The CoDeeN Content Distribution Network”

Echo ve Print arasındaki farklar

Echo, Print’e göre işlemciyi daha verimli kullanır. Aşağıda örnek echo ve print‘in 100.000 kez parametresiz çalıştırılması sırasında geçen sürelerin ölçümünü gösteriyor.

 Echoing 100000 of nothing
 Execution time is 0.037015199661255 seconds.

 Printing 100000 of nothing
 Execution time is 0.040477991104126 seconds.

Echo, Print’e göre işlemciyi daha verimli kullanır. Aşağıda örnek echo ve print‘in 100.000 kez parametresiz çalıştırılması sırasında geçen sürelerin ölçümünü gösteriyor.

Echoing 100000 of nothing
Execution time is 0.037015199661255 seconds.

Printing 100000 of nothing
Execution time is 0.040477991104126 seconds.

Okumaya devam et “Echo ve Print arasındaki farklar”