Ev Arşiv Hakkında

Pardus'da 2. haftadan notlar

14-8-2011, 5:54 ö.s. // yorum // django , pardus

Hafta başında projeler dağıtılmıştı ve bir haftadır üzerlerinde çalışıyoruz. Benim için en ilginç kısım, buraya gelirken yapma ihtimalimin en az olduğunu düşündüğüm işi yapıyor olmak. Web development :P .

Osman Başkaya ile beraber, packages.pardus'u daha güzel bir hale getirmek için çalışıyoruz. Şu andaki sayfayı, Fedora'nın, Debian'ın ve Arch'ınkilere benzer bir işlev/görünüm kazandırmaya çalışıyoruz.

Osman da ben de tasarımdan anlamadığımız için, Archweb'in tasarımı üzerinden gidiyoruz. Muhtemelen bizden sonra başkalarının tasarım ile oynaması gerekecek. Biz sadece işlev ile ilgileniyoruz.

Bir yandan birkaç farklı depodan binlerce paketin kaydını tutmak, güncellemeleri webe yansıtmak için scriptler hazırlıyoruz. Kimisi tek kullanımlık, kimisi depo her güncellendiğinde çalışacak şekilde. Sonuçta şu anki packages.pardus'dan çok daha işlevsel(istatistik ekranı, daha detaylı bilgiler) ve güzel görünümlü birşey çıkacak gibi.

Bu hafta Osman ile şu ana kadar hiç denemediğim birşey deneme fırsatımız da oldu. Pair programming. Sanırım 2 gün sadece pair-programming yaptık. Genel olarak, uzun süreler değil de, programın doğru kısımlarında doğru miktarda(süre olarak) yapılan pair programming'in gayet verimli olduğunu söyleyebilirim. Çok fazla tecrübem yok tabii ki ama güzel bir tecrübeydi, epey eğlendik. Projenin ihtiyaçlarını karşılayacak Django modellerini ve gerekli XML dosyalarını veritabanımıza aktaracak scriptlerden birini tamamen bıu şekilde yazdık.

Bu arada, şu ana kadar çalıştığım en büyük program/proje üzerinde çalıştığımdan şu ana kadar ihtiyacım olmayan şeylere ihtiyaç duydum. İyi bir Django IDE'si gibi. Projeye başladığımız ikinci günde, bazı şeyleri Vim ile yapmak artık dayanılmaz olduğundan(örneğin bir modelde yaptığım bir değişikliklik için view fonksiyonlarımdaki uyumsuzlukları tespit edip düzenleme, Django için debugging vs.) piyasadaki sağlam Django IDE'lerini test etmek istedim(WingIDE ve PyCharm). Wing ile aradığımı bulamadım(genel olarak çok güzel bir IDE ama Django için bana yukarıda bahsettiğim imkanları sunamadı), PyCharm'ı ise Linux ortamında kullanmak tam bir işkence. Swing ile yapıldığından, fontlar çok kötü gözüküyor ve render hızı çok kötü. Metin içerisinde gezinmek bile çok yavaş. Aynı problem Netbeans'de de var(yine Swing). Fontların kötü görüntüsü bir şekilde düzeltilebiliyor ama performans konusunda birşey yapılamıyor. Metin içerisinde gezmek işkence. Eclipse'de Java ile yazılmış olmasına rağmen, sanırım Swing yerine SWT kullanmasından dolayı, böyle problemler yok. Dolayısıyla Vim ile devam ediyoruz.

ha bir de kendime not: otomatik etiketleme sistemini düzelt. yazıları alakasız etiketlerle etiketleyip duruyorsun.

Yeni başlayanlar için Python IDE/editor sorunsalı

15-11-2010, 2:57 ö.s. // yorum // python , django , vim

Python'da IDE/editor olayı çok sıkıntılı geliyor bana. Aslında bir sürü alternatif var ama hepsi bazı sebeplerden dolayı çok kötü geliyor bana. Örneğin Eclipse/Pydev çok ağır geliyor, sahip olduğu özelliklerinin çoğunu en azından şimdilik kullanmıyorum. NetBeans aynı şekilde, üstelik Python için neredeyse hiçbir şey sağlamıyor. Sadece Aptana Studio işime yarıyor, o da HTML/CSS desteği ile PyDev'i buluşturduğu için, Django'da çok yardımcı oluyor.

Editor deyince, Gedit, Kate gibi araçlar için bir sürü eklentiler var, fakat emin olabilirsiniz, neredeyse tüm eklentileri denedim, hiçbir türlü işe yarar hale gelmiyorlar.. Aradığım özelliker: syntax renklendirme, otomatik indentation(düzgün çalışacak, return'den sonra diğer bloka geçmeli mesela), açtığım [ ( { " gibi karakterleri nerde kapatığımı görmeliyim, tek tuşla programımı çalıştırabilmeliyim, hatta gerekirse parametreler ekleyip onları başka kısayollara atayabilmeliyim, mümkünse file browser..

Vim, Emacs gibi araçlar en baştan beri aklımdaydı fakat öğrenmesi/kurulumları çok zaman aldığından bir türlü başlayamıyordum, Emacs öğreneceğim vakitle Common Lisp öğrenmek daha mantıklı geliyor örneğin. Üstelik bu araçlar için tüm detayların olduğu, tek bir tutorial gibi birşey yok. Araştırıp öğrenmek gerekiyor.

Common Lisp ve Haskell ile ilgilenmeye başlayınca farkettim ki, belki de dünyadaki tüm diller için ortak 2 tane editor var, Vim ve Emacs. Haskell yazacaksınız, IDE/editor arıyorsunuz, ama Eclipse gibi devasa araçlara ihtiyacınız yok, hızlı, pratik bir çözüm arıyorsunuz. 2 alternatifiniz var: Vim ve Emacs. Common Lisp için aynısını isteseniz, bu sefer tek alternatif, Emacs. Ki yeterince öğrendikten sonra Java için bile kullanılabiliyorlar(Java için bile diyorum, çünkü Java'da gerçekten gelişmiş IDE özelliklerinize ihtiyacınız oluyor, yeni başlayan ben bile Eclipse'in özelliklerini kullanıyorum).

Python'da da basit, hızlı, kullanışlı bir editor ararken Komodo Edit'i keşfettmiştim. Aslında bayaa kullanışlı bir araç, kendi çalıştırma komutlarınızı kolayca tanımlayabilir, çalıştırırkenki çevre değişkenlerinizi belirleyebiliyorsunuz falan. Kullanışlı ve küçük bir araç, ama çok büyük bir sorunu var; çok yavaş. Birkaç yüz satırlık kodda bile rahatlıkla gezinemiyorum, her nedense çok yavaş çalışıyor.

Dolayısıyla bu sabah yine Vim'e bir şans vermeye karar verdim. Emacs bana hep Vim'den daha karışık gibi gelmiştir. Ayarlarıyla, kısayollarıyla falan. GVim kurulumu yaptım, sıfırdan başlamak yerine birkaç farklı kaynaktan vim ayar dosyalarını incelemeye başladım(.vimrc). Neticede birkaç yerden derlediğim ve kendi kattığım birkaç satırla kendi Vim'imi oluşturdum(bu arada resimdeki arşiv düzenleyinin arayüzünün son hali):

http://www.osa1.net/media/vim.png

Henüz Vim'in çoğu özelliğinden faydalanamıyorum ve metin düzenlerken sıkıntılar yaşıyorum(hatta bu yazıyı yazdığım sırada nasıl tüm kelimeyi sileceğimi, ve kopyaladığım bir metini nasıl yapıştıracağımı bile bilmiyordum), ama en azından tam istediğim özelliklere sahip bir Python editorum oldu.

Oturup vimtutor çalışarak öğrenmek yerine, işimi yaparken öğreneceğim artık. .vimrc dosyamı buradan indirebilirsiniz. Çoğu satırda açıklama var zaten, kısayollar genelde bana ait. Eski alışkanlıklarımdan kurtulamadığımdan, alt+w, alt+s, tab değiştirmek için alt+oklar gibi kısayollar ekledim.

Bu arada, Google ile kolaylıkla binlerce kaynak bulunabilir tabii ki, ama ben yine de kendi faydalandığım kaynakları vereyim:

Python, Java, okunacaklar falan

3-10-2010, 11:07 ö.s. // yorum // python , django , java

Okul başladığından beri ne Python ile ne Django ile uğraşamıyorum, tek satır Python kodu yazmadım neredeyse. Java'ya hala ısınamadım. An itibariyle Java'da canımı sıkan birkaç şey var:

  • İğrenç syntax. Uzun sınıf ve method adları.
  • Uzunluğu değiştirilemeyen, içine sadece tek tip alabilen array denen salak şey ile uğraşmak zorunda olmam.
  • String için bir method test etmek için bile, yeni bir sınıf oluşturup, içine bir method oluşturmak zorunda kalmam. Üşendiğim için istediğim testleri yapamamam.
  • Public, private, default, protected muhabbetleri. Neden böyle şeylere ihtiyaç duyulduğunu anlayamıyorum.
  • Haliyle getter ve setter olayları.
  • Operator overloading diye bir olayın olmaması. Tüm işin methodlara kalması.
  • Derslerim gereği(programlamaya giriş, veri yapıları, nesnesel tasarım, ve belki de fazlası) öğrenmek zorunda olmam(?!).

Aklıma gelenler şimdilik bunlar. Onun dışında, sürekli yaptığım gibi yine bir okuma listesi yaptım kendime. Bir kısmını bastıracağım sanırm, Türkçe derslerinde falan okumak güzel oluyor.

Django ile Wordpress'e bağlanmak

28-8-2010, 5:23 ö.s. // yorum // python , django , wordpress

Birkaç gün önce bir arkadaş sormuştu Django ile Wordpress'e nasıl bağlandığımı(bkz arşiv sayfam. Yaptığım şey, wordpress için bir model oluşturup, mümkün olduğunca wordpress veritabanını kopyaladım.

Kendi sitem için sadece wp_posts tablosunu aktardım, fakat tüm wordpress'de aktarılabilir biraz daha uğraşılarak. Bu yöntemle wordpress'e yazı bile girebilirsiniz aslında. Ben sadece yazıları çekiyorum.

wp_posts tablosu(wordpress 2.9.1 için) şu alanları içeriyor:

field           type
----------------------------
id              int(11)
post_date       datetime
post_title      varchar(100)
post_content    longtext
post_excerpt    varchar(100)
post_status     varchar(100)
guid            varchar(100)
comment_count   int(11)
post_type       varchar(20)

Bunu Django ORM'ine şu şekilde çevirdim(tam olarak aynısı olmasa da, eğer sadece yazıları okuyacaksanız gayet güzel çalışıyor, yazı eklemek için denemedim):

# models.py
from django.db import models

class Posts(models.Model):
    post_date = models.DateTimeField()
    post_content = models.TextField()
    post_title = models.CharField(max_length=100)
    post_content = models.TextField()
    post_excerpt = models.CharField(max_length=100)
    post_status = models.CharField(max_length=20)
    guid = models.CharField(max_length=100)
    comment_count = models.IntegerField()
    post_type = models.CharField(max_length=20)

Daha sonra views.py dosyamdan şu şekilde çekiyorum:

from wp.models import Posts

def wp():
    return [post for post in Posts.objects.order_by("-post_date") if post.post_type == "post" and post.post_status == "publish"]

Bundan sonrası normal Django işlemleri. wp() fonksiyonunu istediğim sayfaya gönderdikten sonra(render_to_response ile mesela) aşağıdaki template kodları ile wordpress yazılarıma ait verileri çekiyorum:

{% for yazi in wp %}
        {{ yazi.post_title }} *baslik*
        {{ yazi.post_date }} *tarih*
        {{ yazi.post_content }} *icerik*
        {{ yazi.coment_count }} *yorum sayisi*
{% endfor %}

Tabii bunları çekerken bazı builtin template taglardan yararlanıyorum. Bu arada, Django, 1.2 sürümüyle beraber artık birden fazla veritabanına bağlanabiliyor, wordpress yazılarınızı çekmek istiyorsanız bunu kullanabilirsiniz(ben aynı veritabanını kullanıyorum.

Django'ya Pygments desteği

26-8-2010, 6:13 ö.s. // yorum // python , django , markdown, pygments

Daha önceden burada Django'ya Markdown desteği eklenmesinden bahsetmiştim(Django'nun Markdown eklentisi olduğunu farkettim çok sonradan). Bu sefer de syntax renklendirme için Pygments desteği ekledim. Pygments'den önce syntaxhighlighter kullanıyordum benim amacım için biraz fazla gelişmiş ve kompleks kaçıyordu.

Öncelikle django'ya pygments desteği için 2 tane çok iyi kaynak var(1, 2), fakat bu kaynaklardaki yöntemlerden ilki, veritabanına gerekli html tagları eklenmiş bir şekilde yazıyor, dolayısıyla bir daha düzenlemek istediğinizde kodunuz okunmaz bir halde oluyor. Benim yapmak istediğim şey, daha önceden markdown için de yaptığım gibi, bir template filter oluşturup istediğim yerde kullanabilmek. Hem bu şekilde daha esnek olabilirim. İkinci yöntem ise, açıkçası ne yaptığını anlamaya çalışmadım, markdown ve pygments'i beraber uyguluyor. Bu da benim istediğim şey değil. Benim amacım, istediğim yere markdown, istediğim yere pygments, istediğim yere de ikisini beraber uygulamak.

Bunun için verdiğim ilk kaynaktaki kodu kullandım aslında. Tek farkı, sonucu veritabanına yazdırmak yerine, fonksiyonu template filter haline getirdim.

# pygmentsf.py
from django import template
from BeautifulSoup.BeautifulSoup import BeautifulSoup #saka gibi
from pygments import lexers, highlight, formatters
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter
@stringfilter
def pygmentsf(html):
    "String'i Pygments'den gecirir. BeautifulSoup ile pre taglarini ayristirir."
    soup = BeautifulSoup(html)
    preblocks = soup.findAll('pre')
    for pre in preblocks:
        if pre.has_key('class'):
            try:
                code = ''.join([unicode(item) for item in pre.contents])
                code = unescape_html(code)
                preclass = pre['class']
                # syntaxhighlighter icin yazilmis kodlar icin
                if preclass == 'brush: python' or preclass == 'brush; python':
                    preclass = 'python'
                lexer = lexers.get_lexer_by_name(preclass)
                formatter = formatters.HtmlFormatter()
                code_hl = highlight(code, lexer, formatter)
                pre.replaceWith(BeautifulSoup(code_hl))
            except:
                pass
    return unicode(soup)

def unescape_html(html):
    html = html.replace('&lt;', '<')
    html = html.replace('&gt;', '>')
    html = html.replace('&amp;', '&')
    return html

Ayrıca küçük bir düzenlemeyle daha önceden syntaxhighlighter için yazdığım yazılarla da uyumlu olmasını sağladım. Bu dosyayı uygulamanız altında eğer templatetags klasörüne attıktan sonra template dosyanızdan {% load pygmentsf %} dedikten sonra, istediğiniz değişkene uygulayabilirsiniz. {{ blog.body|pygmentsf|safe|escape }} gibi. Ya da isterseniz markdown yazımdaki template filter ile beraber {{ blog.body|markdown|pygmentsf|safe|escape }} şeklinde kullanabilirsiniz.

Unutmadan, HTML'i ayrıştırmak için BeautifulSoup kullanılıyor. Mükemmel bir kütüphane.

Eğer markdown ile beraber kullanacaksanız, bu yöntem pek de iyi değil. Şuraya bakın.
0 , 1