Java Day 2009’dan haber veren yok mu?

Bugün bunu yaptım ama şunu yapmayı unuttum tarzı yazılarla dolu olan blogküre gerçekten blog yazarlığından habersiz görünüyor.

Sun Microsystems 25 Haziran günü İstanbul’da Java Day 2009 organizasyonunu düzenledi. Blog yazarlarımız bu etkinliği günler öncesinden haber verdiler fakat kendileri etkinliğe katılmayı unuttular. Yukarıda alıntıladığım, Bildirgeç’te yayımlanan şu yazının giriş cümlesinin ne kadar doğru olduğunu bir kere daha anımsadım.

Blogküre‘de Java Day aramasında çıkan sonuçlardan sadece ikisi etkinlik sonrasında yazılmış. Onlar da blog değil portal tarzı sitelerden geliyor. Bir tanesi kaliteli içeriğe sahip. 3 tane röportaj yayımlamışlar; [1], [2], [3].

Bir tane de FriendFeed canlı yayını bulabildim.

WordPress “Piwik Analytics” eklentisi için “Dashboard widget” yaması

Piwik Analytics eklentisi WordPress ile Piwik kurulumları arasındaki iletişimi kolaylaştırıyor.

Şimdilik bu eklenti sadece Piwik’in ihtiyaç duyduğu kodu WordPress sayfalarına yerleştirmeyi sağlıyor.

Piwik’in Widgetize eklentisinin sağladığı widgetları WordPress yönetim panelinden görebilmenin yararlı olacağını düşündüm. Bu düşünceyle aşağıdaki yamayı hazırladım.

Index: piwikanalytics.php
===================================================================
--- piwikanalytics.php	(revision 112809)
+++ piwikanalytics.php	(working copy)
@@ -267,6 +267,31 @@
 	} // class PA_Filter
 } // endif
 
+/** Dashboard Stuff: WP >= 2.5 */
+
+function piwikanalytics_register_dashboard_widget() {
+	if (!current_user_can('manage_options'))
+		return;
+	wp_register_sidebar_widget('dashboard_piwikanalytics', __('Stats'), 'piwikanalytics_dashboard_widget_content', array(
+		'width' => 'full'
+	));
+}
+
+function piwikanalytics_add_dashboard_widget($widgets) {
+	global $wp_registered_widgets;
+	if (!isset($wp_registered_widgets['dashboard_piwikanalytics']) || !current_user_can('manage_options'))
+		return $widgets;
+
+	array_splice($widgets, 2, 0, 'dashboard_piwikanalytics');
+	return $widgets;
+}
+
+function piwikanalytics_dashboard_widget_content() { ?>
+<!-- Put embedded iframe code here. -->
+< ?php
+	exit;
+}
+
 if (function_exists("get_option")) {
 	if ($wp_siteid_takes_precedence) {
 		$options  = get_option('PiwikAnalyticsPP');
@@ -276,7 +301,7 @@
 
 $gaf = new PA_Filter();
 
-$options  = get_option('PiwikAnalyticsPP',"");
+$options = get_option('PiwikAnalyticsPP', "");
 
 if ($options == "") {
 	$options&#91;'phpurl'&#93; = '/piwik/piwik.php';
@@ -284,14 +309,16 @@
 	$options&#91;'dltracking'&#93; = true;
 	$options&#91;'dlextensions'&#93; = '7z|aac|avi|csv|doc|exe|flv|gif|gz|jpe?g|js|mp(3|4|e?g)|mov|pdf|phps|png|ppt|rar|sit|tar|torrent|txt|wma|wmv|xls|xml|zip';
 	//$options&#91;'position'&#93; = 'footer';
-	update_option('PiwikAnalyticsPP',$options);
+	update_option('PiwikAnalyticsPP', $options);
 }
 
 // adds the menu item to the admin interface
 add_action('admin_menu', array('PA_Admin','add_config_page'));
 
-
 // adds the footer so the javascript is loaded
 add_action('wp_footer', array('PA_Filter','spool_analytics'));	
 
-?>
+add_action('wp_dashboard_setup', 'piwikanalytics_register_dashboard_widget');
+add_filter('wp_dashboard_widgets', 'piwikanalytics_add_dashboard_widget');
+
+?>
\ No newline at end of file

Drupal 7 kullanıcı parolalarını veritabanında nasıl tutuyor

Drupal 7 kullanıcı parolalarını saklamak için yeni bir yöntem kullanıyor. Bu yöntem önceki Drupal sürümlerine göre daha güvenli olan ve yazılımlar arası kullanıcı taşınabilirliği sağlayan phpass algoritmasına dayanıyor.

Artık aynı algoritmayı uygulayan Drupal, WordPress, bbPress, phpBB ve Gallery yazılımları arasında kullanıcı hesapları parola yenilemeye gerek kalmadan taşınabilecek.

phpass algoritmasının uygulaması Drupal dağıtımındaki password.inc dosyasından alıp aşağıya eklediğim 5 satır kod içerisinde kolaylıkla anlaşılabilir.


$hash = md5($salt . $password, TRUE);
do {
  $hash = md5($hash . $password, TRUE);
} while (--$count);
$output =  $setting . _password_base64_encode($hash, 16);

Uygulama bildiğimiz “parola” + “rastgele karakterler öbeği” yöntemini temel alıyor. Parola’ya önce rastgele karakterlerden oluşan bir kelime ekleniyor. Oluşan karakter dizisi bilinen algoritmalardan biriyle (MD5, SHA1) karmaşıklaştırılıyor (hash). Daha sonra bu işlem belirli bir miktar tekrarlanıyor. En sonunda ortaya çıkan karmaşıklaştırılmış ürüne ilk belirlenen rastgele karakterler ve işlemin tekrarlanma değeri ekleniyor. Böylece kullanılan rastgele karakterler ve tekrarlanma sayısının ileride tekrar kullanılabilmesi sağlanıyor. Bilgisayarların ileride daha hızlı olacağı ve bu yöntemi aşabileceği göz önünde bulundurularak tekrarlanma miktarının her yeni Drupal sürümünde arttırılması öngörülüyor.

Pardus’ta PDO_PGSQL ve PDO_MYSQL kurulumu

Drupal’ın geliştirilmekte olan 7.x sürümünün veritabanı sistemi PHP’nin PDO eklentisi kullanılarak yeniden yazıldı. Yeni sürümü denemek veya yama hazırlamak için PHP’nin PDO eklentisi ve PDO_PGSQL ve/veya PDO_MYSQL sürücüleri ile derlenmiş olması gerekiyor.

Pardus depolarındaki PHP paketleri bize bu desteği sağlamıyor. Bir süre önce Pardus’un hata takip sistemine durumu anlatan bir kayıt girmiştim. Umarım kısa zamanda ilgi görür.

Drupal 7.x sürümünü Pardus’a kurabilmek için PHP’yi kaynak kodlarından derlemek gerekiyor. Derlemeye hazırlanırken phpinfo() fonksiyonunun çıktısından Pardus’a özgü “configure” ayarlarını alıp bu ayarların en sonuna aşağıdaki iki ayarı ekleyin:

--with-pdo-pgsql=shared
--with-pdo-mysql=shared

Kurulum sırasında PHP “/etc/apache2/apache2.conf” dosyasının var olmasını gerektiriyor. Bu sorunu çözmek için aşağıdaki komut yeterli oluyor:

sudo ln /etc/apache2/httpd.conf /etc/apache2/apache2.conf

PHP derleme ve kurulum işlemi bittikten sonra “/etc/php/php.ini” dosyasını açıp “Dynamic Extensions” bölümünün altına aşağıdaki satırları ekleyin:

extension=pdo.so
extension=pdo_pgsql.so
extension=pdo_mysql.so

Hepsi bu kadar. Apache’yi yeniden başlattıktan sonra Drupal kurulumuna geçebilirsiniz.

Bir Drupal form’unu bütün yönleriyle test etmek

Bu yazıyı okumadan önce Lullabot.com’un Drupal için “Unit Test” yazımına başlangıç makalesini okumanızı öneririm.

Aşağıda anlatacağım yöntemler Drupal 7 sürümü için geçerlidir. Drupal 6 için bazı değişiklikler yapılması gerekebilir.

Geçen hafta Drupal’ın geliştirilmekte olan 7.x sürümü için bir yama hazırladım. Aggregator eklentisine OPML içe aktarım özelliğini getiren bu yama için bazı testler yazmam gerekti. Drupal, 7.x sürümü ile birlikte kendi test eklentisine kavuştuğu için artık testleri ile birlikte gönderilmeyen yamalar çekirdek dağıtıma kabul edilmiyor.

OPML içe aktarım özelliği için Aggregator menüsüne yeni bir form sayfası eklenmesi gerekiyordu. Kendi halinde bir sayfaya yerleştirilmiş bu form için yazdığım testler başka formlar için tam bir test kalıbı oluşturacak nitelikte oldu.

Bir Drupal formunu 3 adımda test edebiliriz. Birinci adımda önce formu oluşturur sonra beklediğimiz form alanlarının basılıp basılmadığını test ederiz.

/**
 * OPML içe aktarım formunu oluştur.
 */
function testOPMLImportForm() {
  $this->drupalGet('admin/content/aggregator/add/opml');
  $this->assertText('A single OPML document may contain a collection of many feeds.', t('Yardım metninin görüntülenmesi test ediliyor.'));
  $this->assertFieldByName('files[upload]', '', t('Dosya yükleme alanının görüntülenmesi test ediliyor.'));
  $this->assertFieldByName('remote', '', t('OPML dosyası adresi alanının görüntülenmesi test ediliyor.'));
  $this->assertFieldByName('refresh', '', t('Güncelleme alanının görüntülenmesi test ediliyor.'));
  $this->assertFieldByName('category[1]', '1', t('Dizin listesi alanının görüntülenmesi test ediliyor.'));
}

İkinci adımda form alanlarına aklımıza gelen bütün geçersiz bilgileri gireriz. Daha sonra formu gönderip ne gibi hata mesajları verdiğini test ederiz.

/**
 * OPML içe aktarım formunu geçersiz bilgiler ile gönder.
 */
function testOPMLImportFormValidate() {
  $form = array();
  $this->drupalPost('admin/content/aggregator/add/opml', $form, t('Import'));
  $this->assertRaw(t('You must <em>either</em> upload a file or enter a URL.'), t('Bilgi alanları boş bırakılmamalı hatası test ediliyor.'));
  $path = $this->getEmptyOpml();
  $form = array(
    'files[upload]' => $path,
    'remote' => file_create_url($path),
  );
  $this->drupalPost('admin/content/aggregator/add/opml', $form, t('Import'));
  $this->assertRaw(t('You must <em>either</em> upload a file or enter a URL.'), t('Dosya yükleme ve adres alanlarından yalnızca biri doldurulmalı hatası test ediliyor.'));
  $form = array('remote' => 'invalidUrl://empty');
  $this->drupalPost('admin/content/aggregator/add/opml', $form, t('Import'));
  $this->assertText(t('This URL is not valid.'), t('Girilen adres geçersiz hatası test ediliyor.'));
}

Üçüncü ve son adımda form alanlarına geçerli bilgiler gireriz. Formu gönderdiğimizde girdiğimiz bilgilerin beklediğimiz gibi işleyip işlemediğini test ederiz.

/**
 * OPML içe aktarım formunu geçerli bilgiler ile gönder.
 */
function testOPMLImportFormSubmit() {
  $feeds[0] = $this->getFeedEditArray();
  $form = array(
    'files[upload]' => $this->getValidOpml($feeds),
    'refresh'       => '900',
    'category[1]'   => 'gezegen',
  );
  $this->drupalPost('admin/content/aggregator/add/opml', $form, t('Import'));
  $feeds_from_db = db_query("SELECT f.title, f.url, f.refresh, cf.cid FROM {aggregator_feed} f LEFT JOIN {aggregator_category_feed} cf ON f.fid = cf.fid");
  $refresh = $category = TRUE;
  while ($feed = db_fetch_array($feeds_from_db)) {
    $title[$feed['url']] = $feed['title'];
    $url[$feed['title']] = $feed['url'];
    $category = $category &amp;&amp; $feed['cid'] == 1;
    $refresh = $refresh &amp;&amp; $feed['refresh'] == 900;
  }
  $this->assertEqual($title[$feeds[0]['url']], $feeds[0]['title'], t('Veritabanı kaydı tespit edildi.'));
  $this->assertTrue($refresh, t('Güncelleme bilgisi doğrulandı.'));
  $this->assertTrue($category, t('Dizin bilgisi doğrulandı.'));
}

Drupal için Zend Framework eklentisine geliştirici yetkisi aldım

Zend_Feed eklentisi Zend Framework ile Drupal arasında köprü işlevi gören Zend eklentisine bağımlı olarak tasarlandı. İlk zamanlar bu bağımlılığı kuvvetlendirmek için Zend eklentisine bazı yamalar hazırlamıştım. Hazırladığım yamalar eklentiye kabul edilmişti.

Geçen gün Zend eklentisinin geliştiricisi yeterli zaman ayıramadığı için bana da CVS’ye yazma yetkisi verdi. Aslında haftalar önce bana bunu teklif etmişti fakat ben yanaşmamıştım. Geçen gün tekrar bazı yamalar hazırlayıp gönderdikten sonra bana sormadan yazma yetkisini vermiş. Artık bana da kabul etmek kalıyor.

Zend Framework eklentisi ile birlikte Drupal.org’da 6 eklentinin geliştiricisi konumundayım.