Linux
14th Eki 2009 | Posted in: BT, Linux 5

Öncelikle CD’mizi takıyoruz ve CD içeriğini Dolphin’de açarak CD’nin mount edilmesini sağlıyoruz. Sonra Matlab kurulum dizinini hazırlamaya geçiyoruz ve lisans dosyamızı bu dizine kopyalıyoruz.

xhost +
sudo su
cd /usr/local
mkdir matlab74
cd matlab74
cp ~/Desktop/licence.dat .

Burada 74, elimdeki sürümün numarası. matlab74 yerine başka bir yere de kurulum yapabilirsiniz pekala. xhost + ise grafik arayüzün root olarak çalıştırılabilmesi için gerekli ayar. Sonraki aşamada Matlab’ın gerektirdiği libXp kütüphanesini kuruyoruz ve CD’nin içerisine girerek install programını çalıştırıyoruz.

pisi it libXp
cd /media/MATHWORKS*
./install

Şu aşamada bazı eksik dosyaların olduğunu söylerse o dosyaları içeren paketleri kurmalıyız. Mesela bende yukarıda bahsettiğim libXp eksikliği çıkmıştı. Başka eksiklikler varsa onları da kurup install dosyasını tekrar çalıştırmalıyız. Bundan sonra karşımıza bir kurulum sihirbazı çıkacak. Bu sihirbazı takip ediyoruz. MATLAB root directory location kısmına yukarıda oluşturduğumuz dizini yazıyoruz:

/usr/local/matlab74

Sihirbazı takip ederek kurulumu bitiriyoruz.

Matlab’ı çalıştırmak için

cd /usr/local/matlab74/etc
./lmstart
cd ../bin
./matlab

Komutlarını veriyoruz. Bu işi kolaylaştırmak için ~/.bashrc dosyasına (böyle bir dosya yoksa oluşturun) şu satırı ekleyip kısayol komut oluşturabiliriz:

alias matlabs="cd /usr/local/matlab74/etc; ./lmstart; cd ../bin; ./matlab"

Ayarları etkinleştirmek için

source ~/.bashrc

ve Matlab’ı çalıştırmak için

matlabs

komutlarını vermemiz yeterli olacaktır. Artık her oturum açışınızda bu ayarlar yüklenecektir.

28th Tem 2009 | Posted in: Linux 0

Django bize sorgu sonuçlarını sayfalandırarak sunma imkanı vermekte. Bunun için django.core.paginator modülünü kullanacağız. Detaylı bilgiye buradan ulaşabilirsiniz. Öncelikle tekrardan kaçınmak için views.py dosyasında pager adında bir fonksiyon yazdım. Bu fonksiyon kendisine verilen sonuç listesini sayfalandırmakta. Her sayfada ise per_page sonuç görüntülemekte. Aşağıda views.py ve şablon dosyasından kısa parçalar görebilirsiniz.

Django lets us paginate our query results via its django.core.paginator module. You can get detailed information here. First of all, I wrote a pager function in order to obey DRY principles. This function paginates the result set and in every page, it displays per_page result. Below you can see parts from views.py and template file.

views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from django.core.paginator import Paginator, InvalidPage, EmptyPage
 
def pager(request, entry_list, per_page=LIST_SIZE):
    """Paginates the given resultset."""
    paginator = Paginator(entry_list, per_page)
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1
    try:
        entries = paginator.page(page)
    except (EmptyPage, InvalidPage):
        entries = paginator.page(paginator.num_pages)
    return entries
 
def list_package_contents(request, version, package_name):
    entry_list = Repo.objects.filter(repo = version.replace("-", "_"), package = package_name)
    return render_to_response('pathsearch/results.html', {
							  'entries'	    : pager(request, entry_list),
							   'result_count'   :  len(entry_list),
                                              })

Görüldüğü üzere entry_list veritabanından dönen sonuç listesi. Bunu pager fonksiyonuna sokarak şablon dosyasına gönderiyoruz.

As can be seen, entry_list is the result set from the database. We are sending this data after processing with pager function so that it can be paginated.

results.html

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
{% blocktrans with entries.start_index as si and entries.end_index as ei%} {{ result_count }} results
Showing results between {{ si }} and {{ ei }}{% endblocktrans %}
 
{% for entry in entries.object_list %}
 
<a href="/search/{{current_version}}/package/{{ entry.package }}/">{{ entry.package }}</a>
{{ entry.path }}
 
{% endfor %}
<div class="pagination">
    <span class="step-links">
	{% if entries.has_previous %}
	    <a href="?page=1">{% trans 'First' %}</a> |
	    <a href="?page={{ entries.previous_page_number }}">{% trans 'Previous' %}</a> |
	{% endif %}
 
	<span class="current">
	    {% blocktrans with entries.number as pn and entries.paginator.num_pages as np%}Page {{ pn }} / {{ np }}{% endblocktrans %}
	</span>
 
	{% if entries.has_next %}
	    | <a href="?page={{ entries.next_page_number }}">{% trans 'Next' %}</a> |
	    <a href="?page={{ entries.paginator.num_pages }}">{% trans 'Last' %}</a>
	{% endif %}
</span></div>

Değişkenler kendini büyük ölçüde anlatıyor. Kodla çıktıyı karşılaştırarak anlamadığınız noktaları çözebilirsiniz. Çıktıda sonuç aralığı bilgisi, sayfaya ait sonuçlar ve yönelim bağlantıları mevcut.

Variables are mostly self-explaining. So you can compare the code with the output. We have a result range information, results for the page and the navigation links.

Bu yöntemin bir eksiği ise çok sayıda sonuç veren sorguları hızlandırmamakta olması. Sebebi ise önce entry_list’i hesaplayıp sonra onu sayfalandırmamız. Her halükarda koca veriyi bir listeye atmadan sayfalandırma safhası başlamıyor. Darboğaz verinin alınmasında. Bu sebeple tembel sayfalandırma mümkün mü araştırmaktayım.

The drawback of this method is that it can’t speed up the queries with a huge result set. Reason is that we first fetch the result data and put it into entry_list and then paginate it. No matter what, pagination won’t start until the data is completely fetched. The bottleneck is in this phase. So I’m wondering if a lazy pagination is possible.

26th Tem 2009 | Posted in: Linux 0

If you were to use an unicode character in your URL that you request, you would probably face a URL matching error. Because urls.py file supports ASCII URLs by default. If you specify patterns like [a-z] or \w as regular expression content, the unicode characters like ‘ö’ won’t get matched with this regular expression. So, you have to first specify that matching will be unicode and secondly write all the letters individually in the matching range. Below is a partial urls.py file:

urlpatterns = patterns('search.pathsearch.views',
     (u'^$', 'index'),
     (u'^(?P<version>[-0-9A-Za-z]+)/$', 'index'),
     (u'^(?P<version>[-0-9A-Za-z]+)/package/(?P<package_name>[-_.0-9A-Za-zıİğĞüÜşŞöÖçÇ ]+)/$', 'list_package_contents'),
)

Instead of this hard coded solution, you can accept all the characters and then filtrate the ones you want to really accept as you can see here. But you have to be careful and filtrate carefully when using this method. Other warning will be that older versions of Python and Django can cause problems in matching unicode characters.

25th Tem 2009 | Posted in: Linux 0

Talep ettiğiniz URL’ler içerisinde unicode bir karakter kullanmaya kalktığınızda muhtemelen bir URL eşleştirme hatasıyla karşılaşırsınız. Çünkü urls.py dosyası öntanımlı olarak URL’lerin ASCII olmasını bekler. Eğer [a-z] veya \w örüntüsü belirtirseniz ö gibi unicode karakterler bu düzenli ifadeyle eşleşmeyecektir. Bu sebeple öncelikle eşleşmenin unicode olacağını (r’ yerine (u’ yazarak belirtmeli, ek olarak da kullanacağınız tüm unicode karakterleri aralığa yazmalısınız. Aşağıda örnek bir urls.py dosyası görebilirsiniz:

urlpatterns = patterns('search.pathsearch.views',
    (u'^$', 'index'),
    (u'^(?P&lt;version&gt;[-0-9A-Za-z]+)/$', 'index'),
    (u'^(?P&lt;version&gt;[-0-9A-Za-z]+)/package/(?P&lt;package_name&gt;[-_.0-9A-Za-zıİğĞüÜşŞöÖçÇ ]+)/$', 'list_package_contents'),
)

Bu çözüm yerine şurada görebileceğiniz gibi tüm karakterleri kabul et deyip sonra filtreleme işine gidebilirsiniz. Ancak bu yöntemi kullanırken dikkatli olmalı, filtrelemeyi iyi yapmalısınız. Diğer bir husus ise eski Python ve Django sürümlerinde sorun çıkabildiği.

22nd Tem 2009 | Posted in: Linux 1

Kanada dönüşü yarım kalan işlerden Paket Arama sitesini tamamlamam gerekiyordu. Sistem düzgün bir şekilde çalışmasına rağmen eklemeyi düşündüğüm veya başkalarının aklına gelen bir takım ek özellikler vardı. Birçoğu ilk okunduğunda anlaşılabilir durumda ancak bazılarını açıklayacağım.

  • Arama yapılınca arama kutusunda arama metninin kalması.

  • Sayfa açılınca imlecin arama kutusunda yanıp sönmesi

  • Sonuç sayısı gösterme

  • Pardus 2009 desteği

  • Verilerin tek tabloda tutulması

  • Lâl teması

  • Önbellekleme kullanımı

  • Hoşgeldiniz yazısı, tanıtım

    • Geri bildirimlere göre Paket Arama, paket listesinde ve açıklamalarında arama yapıyor gibi bir izlenim veriyormuş. Bu sebeple paket içeriklerini taradığımızı ifade ettim.

  • Arama sonuçlarında paket sayfalarına bağlantı

    • Paket içeriği görüntülenirken sonuç sayfasında paket hakkında daha fazla bilgi alabileceğiniz bağlantılar mevcut olacak.

  • POST sonrasında URL güncelleme

    • Şimdiye kadar arama terimini POST metodu ile gönderdiğimizde URL değişmiyordu. Dolayısıyla o anki sonuçların adresini bir başkasına göndermek mümkün değildi. Bu sebeple arama terimini alan, inceleyen ve ona göre gerekli URL’e yönlendiren; böylelikle URL devamlılığını sağlayan bir sistem çözümü getirdim.

  • Türkçe karakter ile arama desteği

    • Türkçe karakter ile arama yapıldığında Django hata veriyordu çünkü URL eşleştirmeleri ascii düzenli ifadeler üzerinden yapılıyordu. Bu sebeple Unicode karşılaştırmaya izin vermenin bir yolunu bulmam gerekti. Bunu diğer bir yazıda anlatacağım.

  • Sonuçları sayfalandırma özelliği

    • Sonuçlar çok sayıda olduğunda sisteme yük bindirmekteydi. Bu yüzden onları 100′er sayfalandırma yoluna gittim. Bunun için Django’nun hazır pagination modülünü kullandım. Onu da farklı bir yazıda anlatabilirim.

Hala çözmem gereken sorunlar mevcut. Bunların en başında tembel sayfalandırma geliyor. Öyle ki 10000 sonucu sayfalamaya kalktığımda önce 10000 sonucun hepsini bir listeye atıp ondan sonra sayfalandırıyor. Bu da darboğaza sebebiyet veriyor. Diğer bir sorun settings.py ayarlarının üzerine yüklenen local_settings.py dosyasına yazdığım DOCUMENT_ROOT ve WEB_URL’in TEMPLATE_DIR değişkenini etkilememesi. Çünkü bu değişken settings.py’de statik olarak tanımlanıyor. Çözüm önerilerinizi beklerim.

Sistemin eski hali burada, son hali şurada, kodları orada yayında. Son halinde Türkçe karakter sorunu devam ediyor olabilir. Sebebinin ise Python sürümünün eski olması olduğunu tahmin ediyorum.