python uygulamalarında hata ayıklama – pdb

Program yazarken ortaya çıkan hataların sebeplerini bulmak kodun büyüklüğü, karmaşıklığı ile orantılı olarak zorlaşıyor. Çok sayıda geliştiricinin üzerinde çalıştığı projelerde ya da sonradan dahil olunan projelerde hata takibi daha da zor oluyor.

Python hata durumunda (çoğu zaman) güzel çıktılar sunuyor olsa bile işin o noktaya nasıl geldiğini ve değişkenlerin, argümanların o andaki değerlerini koda müdahale ederek öğrenmek gerekiyor. Bunun için koda print satırları ekleyip değerleri ekrana bastırmak (printf debugging) en sık tercih edilen yöntemlerden. Fakat bu basit yöntem çoğu zaman yetersiz kalıyor.

Bu noktada da `pdb` modülü imdada yetişiyor. debugger’a geçmek istediğimiz noktaya aşağıdaki satırı ekleyerek breakpoint oluşturuyoruz.

import pdb; pdb.set_trace()

Breakpoint’e gelindiğinde debugger shell’e düşüyoruz. Debugger komutlarıyla uygulamanın ilerleyişine müdahale edebiliyor, yeni breakpointler tanımlayabiliyor ve uygulamayı yeniden başlatabiliyoruz. Debugger komutlarının yanısıra tüm python ifadelerini de kullanabiliyoruz.

Sosyal medya editi: Serdar Dalgıç twitter’dan “pdb’den daha iyi bir yöntem olarak ipdb :) github.com/gotcha/ipdb” dedi. Gerçekten de python shell yerine çok daha yetenekli ipython shell’ini kullanabilmek büyük bir avantaj. pdb yerine ipdb kullanmak gayet mantıklı görünüyor.

23 Ocak 2013

Posted In: debug, Gezegen, Kendime notlar, pdb, programlama, python

nginx ve php-fpm ile moodle2 kurulumu

PHP programcıları her geçen gün sistem yöneticilerine saç baş yolduracak acayip işler yapmaya devam ediyorlar.  En son karşılaştığım acayiplik Moodle‘dan geldi. (sürüm pek yeni değil ama kurulumunu yapmak nasip olmamıştı) Programcı arkadaşlar hangi akla hizmet yaptılarsa resim dosyalarını sunmak için kullandıkları image.php dosyasının parametlerini query_string‘ten almak yerine farklı bir yol seçmişler ve ortaya şu acayip adres çıkmış.

/theme/image.php/standard/core/1349561551/moodlelogo

php ile biten istekleri php-fpm’ye gönder şeklinde yazılmış mantıklı kurallar bu adres karşısında yetersiz kalıyor.  Location tanımına göre istek bir şekilde fpm’ye yönlendirilse bile parametrler doğru şekilde alınamadığından PHP tarafından Image was not found, sorry. hatası dönüyor.

Adres satırının içindeki dosya adını ve parametreleri ayrıştırıp php-fpm’ye göndermek için şu location tanımını kullanmak gerekiyor.

location ~ ^.+\.php {
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;

fastcgi_param  PATH_INFO          $fastcgi_path_info;
fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_script_name;

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
}

7 Ekim 2012

Posted In: Gezegen, Kendime notlar, sistem yönetimi

Virtualenv içinde ‘import random’ hatası

Uzun süredir python uygulamalarının kurulumları için virtualenv kullanıyorum. Bugün bir güncelleme sırasında django uygulamasındaki kütüphanelerden gelen ekstra komutların kullanılamaz olduğunu farkettim. ./manage.py komutu herhangi bir hata vermeden sadece öntanımlı django komutlarını listeliyordu. ./manage.py runserver komutu ise aşağıdaki hatayı veriyordu.


Traceback (most recent call last):
File “./manage.py”, line 14, in
execute_manager(settings)


File “/usr/lib/python2.6/email/utils.py”, line 27, in
import random
File “/usr/lib/python2.6/random.py”, line 47, in
from os import urandom as _urandom
ImportError: cannot import name urandom

StackOverflow sayesinde bu ubuntu hata kaydını buldum. Sebebine dair bir bilgi olmasa da belirtilen hata kullandığım Pardus makine ve Debian sunuculardaki aynı. Çözümü içinse virtualenv komutunu  sorunlu virtualenv dizinleri için çalıştırmak gerekiyor.

sandbox $ virtualenv /sandbox/env/

6 Ekim 2012

Posted In: Gezegen, Kendime notlar, sistem yönetimi

scp ile dosya transferinde boşluk içeren dosya adları

Konsoldan uygulamalara argüman olarak boşluk, bölü, parantez vb. özel karakterler içeren değerler vermek bazen beklenenden daha zor olabiliyor. Bazı durumlarda bu değerleri tırnak içine almak iş görse de kimi zaman kaçış karakteri (ters bölü karakteri “\”) veya karakterleri devreye girmek zorunda kalıyor.

scp ile dosya transferi de buna örnek durumlardan biri. Uygulamaya verdiğimiz argümanlar hem bizim sistemimizde hem de uzak sistemde yorumlandığı için kaçış karakteri mevzusunda normalden iki adım öteye gitmek gerekiyor. Boşluk içeren dosya adları kullanırken dosya yolunu tırnak içine almalı ve boşluk vb. karakterler için “çift” kaçış karakteri kullanmalıyız.

scp user@10.0.0.1:”/home/user/Gutenberg\\ Project/The\\ White\\ Crystals\\ by\\ Howard\\ Roger\\ Garis.epub”

14 Ocak 2012

Posted In: bash, dosya transferi, Gezegen, ipucu, Kendime notlar, scp, sistem yönetimi, ssh

WP Twitter Auto Publish Powered By : XYZScripts.com