arşiv

‘Teknik’ kategorisi için arşiv

Sphinx’te Okunaklı URL’ler Üretmek

Çarşamba, 23 Eyl 2009

istihza.com’daki belgelerin Sphinx adlı yazılım kullanılarak üretildiğini daha önceden duyurmuştum. Ancak orada da bahsettiğim gibi Sphinx adlı yazılım, URL’leri üretirken, içinde Türkçe karakterler geçen başlık adlarını oldukça okunaksız bir hale sokuyor. Mesela “Python Nasıl Çalıştırılır?” gibi bir başlığı, http://www.istihza.com/py3/hakkinda.html#python-nas-l–al-t-r-l-r biçiminde bir URL’ye dönüştürüyor…

Bu durumun sebebi aslında doğrudan Sphinx’in kendisi değil. Bu sorun Sphinx’in yararlandığı Docutils adlı yazılımdan kaynaklanıyor. Sphinx’teki html URL’lerinin nasıl görüneceğini, Docutils içinde yer alan “nodes” adlı bir modül belirliyor. Bu işin asıl sorumlusu ise “nodes” modülü içindeki “make_id()” adlı bir fonksiyon…

“make_id()” adlı fonksiyon “string” adlı bir parametre alıyor. Bu fonksiyonun görevi, kendisine parametre olarak verilen karakter dizisini alıp bu karakter dizisinden bir “tanımlayıcı” (identifier) üretmek.

Bu “nodes” modülü içinde “_non_id_chars” adlı bir değişken belirlenmiş:

_non_id_chars = re.compile('[^a-z0-9]+')

Buradaki düzenli ifade yardımıyla, tanımlayıcı olamayacak karakterler ayıklanıyor. Buna göre eğer bir karakter, sayı veya harf değilse bir tanımlayıcı olarak adlandırılamıyor. Bu süzgeç doğal olarak Türkçe karakterleri dışarıda bırakıyor…

“make_id()” adlı fonksiyon, bu “_non_id_chars” değişkeniyle belirlenen karakterlerin yerine “-” işaretini koyuyor. Bu işi de “make_id()” içindeki şu satır hallediyor:

id = _non_id_chars.sub('-', ' '.join(string.lower().split()))

Dolayısıyla yukarıdaki düzenli ifadenin ayıkladığı karakterler çıktıda “-” işaretiyle gösteriliyor…

İşte Sphinx de bu “make_id()” fonksiyonunun ürettiği tanımlayıcıları URL adlarını belirlemede kullandığı için, Türkçe karakterler barındıran URL adları epey okunaksız bir hale geliyor.

Ben istihza.com’daki belgeleri Sphinx’le üretirken, bu sorunu çözmek amacıyla, “make_id()” fonksiyonuna ufak bir ekleme yaptım. Fonksiyona eklediğim kod parçasını şuraya yapıştırdım:

http://paste-it.net/public/ub37a24/

Eğer bu kodları yama olarak almak isterseniz şuraya bakabilirsiniz:

http://www.istihza.com/denemeler/turkish.patch

Bu kod parçası, URL’lerdeki Türkçe karakterlerin yerine ASCII-benzerlerini koyuyor. Mesela “ş” yerine “s” harfi, “ç” yerine “c” harfi, “ı” yerine “i” harfi gibi… Böylece “python-nas-l–al-t-r-l-r” yerine daha okunaklı bir ifade olan “python-nasil-calistirilir” ifadesini elde ediyoruz.

Bu durumdan ben Docutils geliştiricilerini haberdar ettim. Kodları da kendilerine gösterdim. Docutils geliştiricileri, bu sorunun farkında olduklarını ve Docutils’in svn’deki sürümünde bu sorunu giderdiklerini söyledi. Tabii svn’deki sürüm sadece Türkçe karakterleri değil, İngilizce dışındaki başka dillere ait özel karakterleri de içeriyor…

Eğer Sphinx’teki Türkçe sorununa hızlı bir çözüm arıyorsanız yukarıda verdiğim kodları kullanabilirsiniz. Bu kodları Docutils içindeki “nodes.py” adlı dosyada yer alan “make_id()” adlı fonksiyonun içine yerleştireceksiniz. Kodları “make_id()”  fonksiyonu içindeki “id” tanımlamalarından hemen önce yazıyoruz.

Python, Teknik , , ,

Ubuntu Karmic Koala Alpha 2′de Disk Bağlama Hatası

Pazar, 28 Haz 2009

Bundan kısa bir süre önce, Ubuntu’nun “Jaunty Jackalope”den sonraki sürümü olan Karmic Koala’nın Alpha 2′si yayımlanmıştı… Ben de bir süredir Karmic Koala’yı kullanıyorum. Karmic Koala henüz test aşamasında olmasına rağmen bugüne kadar ciddi bir hatayla karşılaşmamıştım. Ancak bugün yayımlanan son güncellemelerde önemli sayılabilecek bir sorun ortaya çıktı. Taşınabilir diskler sisteme bağlanmaya çalışılırken DBus hatası alınıyor ve mesela USB parmak belleğiniz sisteme bağlanamıyor… Bu durum muhtemelen DBus’un son sürümündeki bir uyumsuzluktan kaynaklanıyor. Eğer siz de Ubuntu Karmic Koala’nın Alpha 2 sürümünü kullanıyorsanız ve harici disklerinizi sisteme doğrudan bağlayamıyorsanız şimdilik bu sorunu şu şekilde çözmeyi deneyebilirsiniz:

1. Bir komut satırı açıyoruz.

2. /mnt klasörü içinde “parmak” adlı bir klasör oluşturuyoruz:

sudo mkdir /mnt/parmak

3. Parmak belleği USB girişine takıyoruz ve aldığımız DBus hatasını görmezden geliyoruz.

4. Parmak belleği /mnt/parmak klasörüne bağlıyoruz:

sudo mount -t vfat /dev/sdc1 /mnt/parmak

Artık /mnt/parmak dizininin içinden, parmak belleğin içeriğine ulaşabilirsiniz. Tabii ben burada parmak belleğin “sdc1″ olduğunu varsaydım. Bu isim sizde farklı olabilir. Eğer parmak belleğin hangi adla sisteme bağlandığını bilmiyorsanız bunu

sudo fdisk -l

komutuyla öğrenebilirsiniz…

Ancak parmak belleği yukarıdaki komut yardımıyla sisteme bağladığınızda, bellekteki dosyalara yazabilmek için root olmanız gerekir. Eğer parmak belleği okuma-yazma yetkileriyle bağlamak isterseniz şöyle bir komut kullanabilirsiniz:

sudo mount -t vfat -o rw,uid=1000,gid=100,umask=0022 /dev/sdc1 /mnt/parmak

Karmic Koala’daki bu sorunun bir sonraki güncellemelerde düzeltileceğini zannediyorum.

İşinize yaraması dileğiyle…

Teknik , , ,

Kubuntu Jaunty Jackalope’de Eciş Bücüş Harfler

Pazar, 31 May 2009

Deneme sürümlerinden bu yana kullandığım Kubuntu Jaunty Jackalope’de, yine ta deneme sürümlerinden bu yana devam eden bir sorun vardı: Bütün uygulamalarda bazı harflerin, sanki bunların üzerine biri çekiçle vurmuş da o harfleri ezmiş gibi görünmesi… Jackalope’nin deneme sürümlerini kullanırken, bu sorunun kararlı sürümde düzeleceğini düşünüyordum. O yüzden de fazla üzerinde durmamıştım. Ancak Jackalope’nin kararlı sürümü çıktıktan sonra da bu sorun devam edince meseleye bir el atmaya karar verdim. Uzun süre uğraştım, internette araştırdım, ama bir türlü işe yarar bir bilgi bulamadım. Bugün yine bu sorunu çözmek üzere Yazıtipi Yumuşatma ayarlarını karıştırırken, soruna neden olan ayarı buldum… Belki benim gibi bu sorundan muzdarip kişiler vardır diye düşünerek, çözümü burada paylaşayım dedim:

1. KMenu > Sistem Ayarları > Görünüm yolunu takip ediyoruz.

2. Sol taraftaki menüden  Yazı Tipleri’ni seçiyoruz.

3. “Yumuşatma Kullan” ayarı “etkin” iken, hemen sağ taraftaki “yapılandır” düğmesine basıyoruz.

4. Açılan ekranda “Gölgeleme Biçimi” olarak “Hiçbiri”ni seçiyoruz.

5. Bilgisayarı kapatıp yeniden açtığımızda bütün uygulamalar yeni ayarları benimsemiş olacak…

Bu yol, benim yaşadığım sorunu çözdü. Umarım başkalarının da işine yarar…

İyi çalışmalar,

Fırat

Teknik , ,

KeyError: ‘ROUND_CEiLiNG’

Salı, 19 May 2009

Bir süredir HARMAN’ın yeni sürümü üzerinde çalışıyordum. Her şey gayet güzel gidiyordu. Ta ki bugüne kadar… Bugün en son HARMAN’ın .mo dosyasını hazırladım ve bu dosyayı program dizini içinde gerekli yere yerleştirip python harman.py komutunu verdim. O da ne?? Komut satırında upuzun bir hata çıktısı ve en son kısımda şu lanetli satır:

KeyError: 'ROUND_CEiLiNG'

Hata mesajlarına baktığımda sorunun pypdf kütüphanesinden kaynaklandığı anlaşılıyordu. Hemen gidip HARMAN’ın eski sürümünü çalıştırmayı denedim. Ama eski sürüm böyle bir hata vermiyordu… Eski ve yeni sürümler arasında, kullanılan modüller açısından herhangi bir fark olmamasına rağmen eski sürüm güzel güzel çalışırken yeni sürüm beni bu hatayla baş başa bırakıyordu.

Hem bu hatayı programı Türkçe yerel ile çalıştırmayı denerken almam, hem de hata mesajındaki eciş bücüş “i” harfleri sorunun tam anlamıyla bir Türkçe problemi olduğunu düşündürüyordu bana… Bunun üzerine konsolda şu komutu vererek sistem dilini tekrar İngilizce’ye çevirdim:

LANG=en_US.UTF8

Bu arada bu komut bazı sistemlerde şöyle de olabiliyor:

LANGUAGE=en_US.UTF8

Evet… Bu şekilde program düzgün çalışıyordu, ama eğer sorunu çözemezsem, HARMAN’ın Türkçe arayüzle açılması imkansız hale gelecekti… Neyle karşı karşıya olduğumu anlamak için internette biraz araştırma yapmaya başladım ve benzer problemlerin Elisa ile Gazpacho programlarında da yaşandığını gördüm… Bu programlar kendi dillerinde düzgün çalışırken, bu programları Türkçe olarak çalıştırmaya kalkışanlar aynen benim aldığım hatayla karşılaşmışlar… Bunların dışında mysql gibi modüller de benzer hatalar verebiliyormuş…

Problem aslında Türkçe’deki “i”, “ı” ve bunların büyük harfli hallerinden kaynaklanıyor… İngilizce’de “İ” veya “ı” diye bir harf yok. “i” harfinin büyük hali “I”… Doğal olarak “I” harfi küçültüldüğünde ortaya çıkan harf “i”…. Türkçe’de ise durum biraz farklı. Bizde hem “i” var hem de “ı”. “i” harfi büyütüldüğünde “İ” harfini; “ı” harfi büyütüldüğünde ise “I” harfini elde ediyoruz. Bu durumu göz önüne aldığımızda, “round_ceiling” ifadesi, Türkçe yerelleri kullanan herhangi bir programın iç işleyişi gereğince büyütülmeye çalışılırsa “ROUND_CEİLİNG” gibi bir şey elde ediliyor. Halbuki bunun “ROUND_CEILING” olması gerek… Aynı program içinde geçen “kitap” ve “first” kelimelerini düşünelim. Bunlardan ilki Türkçe bir kelime olduğu için büyütülürken “KİTAP” şeklini almalı. Ama “first” kelimesi İngilizce bir kelime olduğu için büyütülürken “FIRST” şekline girmeli… Ne yazık ki bu şekilde “bağlama göre büyütme-küçültme” işlemi yapmak pek kolay değil… İşte bu durumdan ötürü, Türkçe yerelleri kullanan programlar bazen saçmalayabiliyor…

Gördüğüm kadarıyla bu tür problemlerin şöyle bir çözümü var: Eğer açmak istediğimiz program yukarıdaki hatayı veriyorsa komut satırında programımızı “LC_ALL=C” parametresiyle çalıştırmamız gerekiyor… Mesela diyelim ki Elisa veya Gazpacho programı böyle bir hata veriyor. O zaman şöyle yapacağız:

LC_ALL=C elisa

Ben de kendi programımın durumuna bakmak için şöyle bir komut denedim:

LC_ALL=C python harman.py

Program bu parametreyle başarılı bir şekilde çalıştı… Elbette kullanıcıların her defasında bu komutu yazarak programı çalıştırmasını bekleyemem. O yüzden HARMAN’ın kaynak dosyası içine şu satırları ekledim:

import locale
locale.setlocale(locale.LC_ALL, "C")

Bu şekilde şimdilik herhangi bir problem yaşamadan programı çalıştırabiliyorum….

Bu arada HARMAN’ın yeni sürümü (bence) gayet güzel oldu!… :) Kodlarda önemli değişiklikler ve eklemeler yaptım. Artık PDF kesme biçme işlemleri bir kontrol paneli üzerinden yapılacak.

HARMAN’ın yeni sürümünde bir PDF dosyasının art arda gelmeyen sayfalarını da silebileceğiz ve kesip alabileceğiz… Yani mesela önceki sürümde sadece tek bir sayfa veya 30, 31, 32, 33, 34, 35 gibi art arda gelen sayfaları silebiliyorduk. Yeni sürümde ise sayfaları tek tek silebilmenin yanısıra, 30, 35, 40, 43, 45 gibi sayılar vererek aynı anda birden fazla sayfa da silebileceğiz… Ayrıca bu sürümde şifreli pdf dosyaları da program tarafından tanınabilecek. Henüz PDF’lerin şifresini çözmüyoruz. Ama bir sonraki sürümde muhtemelen programa şifre çözme desteği de ekleyeceğim… Tabii burada kastettiğim şey şifresini bilmediğimiz PDF dosyalarını çözmek değil. Bazı PDF oluşturucu programlar PDF’yi oluştururken belgeye otomatik olarak boş bir şifre veriyor. Kastettiğim, bu boş şifreli PDF’leri ve şifresini bildiğimiz başka PDF’leri çözmek…

Şu anda HARMAN’ı test etmeye devam ediyorum. Eğer herhangi bir gecikme olmazsa üç-beş gün içinde programı yayımlayacağım…

Herkese iyi çalışmalar,

Fırat

Teknik , , ,

Python 3.0′da bir sürpriz yumurta…

Perşembe, 07 May 2009

Python 3.0 yeni özelliklerin yanısıra birkaç sürpriz yumurta da getiriyor beraberinde… Ben de bu yazıda bu “hoşluk”lardan birini sizinle paylaşayım istedim.

Şimdi Python 3.0′ın etkileşimli kabuğunu açıyoruz ve şu komutu veriyoruz:

import antigravity

Bu komutun çalışması için elbette bir internet bağlantınızın olması gerekiyor…

İyi eğlenceler… :)

Bu arada bu modülü aynı etkileşimli kabuk oturumu içinde tekrar içe aktarmak isterseniz şu komutları kullanmanız gerekiyor:

import imp
imp.reload(antigravity)

Buradan anladığınız gibi, artık Python 3.0′da “reload()” diye bir fonksiyon yok!… Daha önce içe aktardığımız bir modülü tekrar içe aktarmak istediğimizde reload() yerine imp.reload() diyeceğiz… Tabii aynı oturum içinde bir kez “import imp” demek yeterli olacaktır. “imp” modülünü bir kez içe aktardıktan sonra, yeniden yüklemek istediğimiz modüller için yalnızca “imp.reload(modül_adı)” kalıbını kullanmamız yeterli olacaktır.

Teknik , , , , ,

Kubuntu Jaunty Jackalope ve virtualbox-ose-guest-utils

Cumartesi, 14 Mar 2009

Kubuntu’nun “Jaunty Jackalope” sürümünü kullanan arkadaşlar, açık kaynaklı VirtualBox paketini kurarken dikkatli olsunlar… xorg-server ve virtualbox-ose-guest-utils paketleri arasındaki uyumsuzluk nedeniyle, virtualbox-ose-guest-utils paketini kurarken xorg-server ve buna bağlı paketler otomatik olarak sistemden kaldırılıyor. Eğer virtualbox-ose-guest-utils paketini kurmaya çalışırsanız, xorg-server paketleri sistemden kaldırılacağı için bilgisayarınızı yeniden başlattığınızda komut satırında kalırsınız. Masaüstü açılmaz. Eğer bu sorunla karşılaştıysanız, bilgisayar açılışında, komut ekranına geldiğinizde kullanıcı adı ve parolanızla sisteme giriş yapın. Daha sonra şu komutu vererek xorg-server’i yeniden yükleyin:

sudo apt-get install xserver-xorg

Paketler kurulduktan sonra şu komutla masaüstüne ulaşabilirsiniz:

startx

Geliştirici ekibin durumdan haberi var. Yakın zamanda bu sorunun düzeleceğini zannediyorum.

Gelişmeleri şuradan takip edebilirsiniz: https://bugs.launchpad.net/ubuntu/+source/virtualbox-ose/+bug/313510

İyi çalışmalar

Teknik , , , ,