Yeni blog

Django ile yaptığım blog sayfam sonunda kullanılabilecek hale geldi. Bundan sonra oradan yazmaya devam edeceğim. http://test.osa1.net

Yazılar nasıl etiketlenir?

Django ile yazdığım bloguma otomatik etiketleme sistemi eklemeye çalışıyorum. Etiketleme sistemi arama ve alakalı yazıları tespit etme özellikleri için gerekli. Etiketleme olayını otomatiğe bağlamamın sebebi ise daha hızlı bir şekilde yazı girebilecek olmam.

Uygulayacağım yöntem sanırım şöyle birşey olacak; kendimi sitedeki içeriğe uygun büyük bir etiket bulutu oluşturacağım. Kelimleri eklentiye gireceğim ve daha sonra bir yazı girdiğimde eklenti yazılarda o kelimeleri arayacak, ve eğer varsa, o yazıyı o etiketle etiketleyecek. Daha sonra örneğin alakalı yazıları göstermek istediğimde, benzer etiketlere sahip yazıları, çok benzer etikete sahip olandan az olana doğru sıralayacak. Bu da böyle bir blog yazısıdır.

Django geliştirmenin kolay yolu?

Bir süredir Django ile uğraşıyordum ve Django ile yazdığım blog sayfamı bitirmek üzereyim fakat bazı sorunlar yaşıyorum:

  • Localhost’da çalıştıktan sonra dosyalarımı upload etmeden önce bir sürü değişiklik yapmam gerekiyor(url ayarları, veritabanı bağlantıları vs). Bunu kolaylaştırmak için LOCAL_DEVELOPMENT adlı bir değişken tanımladım, ve upload etmeden önce buna False atıyorum. Daha sonra örneğin veritabanı bağlantı sayfamda if LOCAL_DEVELOPMENT: #ayarlar şeklinde değişiklikler yapıyorum. Yine de sıkıcı bir işlem(gün içerisinde 10 kere yaptığım düşünülürse).
  • Localhost’da tamam da, internette bir türlü resim, css vb. dosyaların bağlantılarını sağlayamadım. Ayarlara bakıldığında herşey normal gözüküyor..
  • Değişiklikleri upload ettiğimde geçerli olmaları için bazen 10-15 dakika beklemem gerekiyor. -Sanırım- sunucum py dosyalarını ön bellek gibi birşeye(herneyse artık) yüklüyor, değişiklikleri de belirli aralıklarla kontrol ediyor ve değişiklik varsa yenisini okuyor. Beni çok yavaşlatan bir işlem.
  • Admin panelinden birşey eklerken veri tabanına formlarda olmayan bir değeri nasıl girebilirim?

Bunların dışında bir de etiket sistemi eklemek istiyorum fakat nasıl bir yöntem izlemeliyim karar veremedim. Yani örneğin tüm yazıyı kelime kelime tarayıp, bağlaçları vs. eleyip, geriye kalan kelimeleri etiket olarak mı kabul etmeliyim, yoksa büyük bir etiket bulutu oluşturup, yazılarda o kelimeleri mi aramalıyım(bu daha mantıklı geliyor)?

2 hafta sonra hazırlık biteceğinden ve benim ilk seneki ingilizce derslerinden muafiyet alma ihtimalim yüksek olduğundan ara sıra ders çalışıyorum, pek zaman ayıramıyorum, fakat en kötü ihtimalle 9 Temmuz’a kadar bitirmem gerekiyor bu sayfayı, yoksa hiçbir zaman bitiremeyebilirim..

django.contrib.comments nasıl çalışır?

Django yorum eklentisi(django.contrib.comments)ni çalıştırabilen var mı? Django’nun destek sitesinde de hakkında başlık açmışlar, tüm yöntemleri denememe rağmen aynı hatayı almaya devam ediyorum.

Bilmeyenler için, {% load comments %} ile yorumla için template taglarını yükledikten sonra {% render_comment_form for code %} tagı ile yorum formunu çekmem gerekiyor fakat Caught NoReverseMatch while rendering: Reverse for ‘django.contrib.comments.views.comments.post_comment’ with arguments ‘()’ and keyword arguments ‘{}’ not found. şeklinde bir hata alıyorum(ya da alıyoruz mu demeliydim?)

Python ile altyazı işlemleri 2

Daha önceden Python’da regex kullanarak altyazılar üzerinde bazı değişiklikler yapmıştım(ilk yazı burda). Bu seferki kod altyazılar srt formatlı altyazılar için birkaç fonksiyon içeriyor.

"""
subtools.py
Some subtitle tools for .srt formatted subtitles.
"""
import re

def convert(a):
    parts = a.split(":")
    hour, minute, sec = int(parts[0]), int(parts[1]), parts[2]
    minute += hour*60
    sec = sec.split(",")
    sec = int(sec[0])*1000 + int(sec[1])
    sec += minute*60000
    return sec

def revert(a):
    a = int(a)
    sec, remainder = a/1000, a % 1000
    minute = sec/60
    sec = sec%60
    hour = minute/60
    minute = minute%60
    # kod tekrarini nasil engelleyebilirim?
    if len(str(hour)) == 1:
        hour = "0%s" % hour
    if len(str(minute)) == 1:
        minute = "0%s" % minute
    if len(str(sec)) == 1:
        sec = "0%s" % sec
    if len(str(remainder)) == 1:
        remainder = "00%s" % remainder
    elif len(str(remainder)) == 2:
        remainder = "0%s" % remainder
    return "{0}:{1}:{2},{3}".format(hour, minute, sec, remainder)

def adder(a, b):
    return revert(convert(a) + convert(b))

def subtracter(a, b):
    return revert(convert(a) - convert(b)))

def submod(sub, time):
    "Advance subtitles"
    Sub = open(sub, "r").readlines()
    format = re.compile(r"(\d{1,2}:\d{1,2}:\d{1,2},\d{1,3}) --> (\d{1,2}:\d{1,2}:\d{1,2},\d{1,3})")
    for line in Sub:
        if format.findall(line):
            parts = format.findall(line)
            parts = parts[0]
            P1, P2 = adder(parts[0], time), \
                           adder(parts[1], time)
            Sub[Sub.index(line)] = "%s --> %s" % (P1, P2)
    new = open("new_%s" % sub.split("/")[-1], "w")
    new.writelines(Sub)
    new.close()

def setsub(sub, first, last):
    submod(sub, subtracter(first, last))

Linux ortamında VLC ile birşeyler izlerken en çok sıkıntı çektiğim konu GOM Player’daki altyazının istenilen kısmının filmdeki istenilen zamana denk getirilme özelliğinin olmaması, bu fonksiyonlar kullanılarak kolayca yapılabilir aslında..

Python’da recursion

Bilgisayar Bilimcisi Gibi Düşünmek‘i okuduktan sonra recursion ve recursive fonksiyonlar diye birşeyle tanıştım, aslında garip falan değiller fakat öğrenmesi ve nasıl çalıştıklarını anlaması biraz zor(ya da bana öyle geldi). Uzun süredir yapma planları kurduğum MP3 arşiv düzenleyicimi yapmak için kullanmam gerekti(klasörleri en alt klasöre kadar taramak için).

Recursive fonksyionları “özyinelemeli” fonksiyon diye tercüme etmişler, kısaca kendini çağıran fonksiyonlar diyebiliriz. Daha detaylı bilgi için Wikipedia. En basit örnekleri faktoriyel ve fibonacci fonksiyonları. Alternatif çözümleri tabii ki vardır, bunlar recursion kullanarak çözümlerim:

def recursive_faktoriyel(x):
    if x == 1:
        return 1
    return x * recursive_faktoriyel(x-1)

def recursive_fib(n):
    if n == 1: return 0
    if n == 2: return 1
    return fib(n-1) + fib(n-2)

Kitapta alternatif çözümler vardı(sanırım). Kitabı tavsiye ediyorum bu arada, özellikle recursion ve sözlüklerle alakalı bölümlerde çok güzel teknikler öğrendim, birde GASP modülünden haberim oldu(bir işime yaramayacak gerçi, Ubuntu’da paket yöneticisinden kurulabiliyor).

Benim programımda recursion’ı kullanma amacım ise içiçe geçmiş listeleri ayırmaktı, örneğin elimde şöyle bir liste var:

  1. [1, 2, 3, [4, 5, [6, [7, [8], 9]]], 10, 11]

Bu listeyi ayırmak için bir sürü farklı fonksiyon yazabilirsiniz, benim çözümüm şu oldu:

seq2 = []
def recursive(seq):
    for element in seq:
        if type(element) == type([]):
            recursive(element)
        else:
            seq2.append(element)
    return seq2

Kod gayet güzel çalışıyor fakat eğer daha “recursive” olarak yazmak isterseniz, internetten bulduğum şu kodu kullanabilirsiniz:

def recursive2(seq):
    if not isinstance(seq, list):
        return [seq]
    elif seq == []:
        return []
    else:
        return bill_recursive2(seq[0]) + bill_recursive2(seq[1:])

Ghost Recon: Future Soldier

“The soldier of the future is an F-16 on legs.”

Yeni Ghost Recon, yine korkunç(iyi anlamda) bir Ghost Recon olacak sanırım. Advanced Warfighter 2 ile PC’ye attıkları kazığı atmasalar bari..

12»