Etiketler

Pardus 2009 İçin, Xfce ve MonoDevelop

  • 19

  • Haziran

    2009

Üç yeni haber. Birincisi, hepimizin bildiği gibi Pardus 2009 Beta sürümü bugün bir aksilik olmazsa yayınlanacak. Bununla beraber, depoda Xfce’nin son sürümünü bulabileceksiniz:

xfce

Eh farkettiğiniz gibi Pardus için özelleştirmeler şimdilik devredışı. Bu henüz devredışı olan özelleştirmeler arasında, klavye kısayollarının (alt + f2, print tuşu gibi) da olduğunu belirtmeliyim. Ama “Benim için sorun değil, ben kendim ayarlarım” derseniz, şu şekilde kurmanız mümkün (depolar henüz eşlenmemiş olabilir):

$ sudo pisi it -c desktop.xfce

Buna ek olarak, OpenOffice’in artık KDE bağımlısı olmadığını söylemekte fayda var. Eğer OpenOffice’i görsel uyum açısından GTK+ arayüzüyle kullanmak isterseniz, openoffice-kde paketini silmeniz yeterlidir. Sıklıkla kullandığınız internet tarayıcınız Firefox içinse, hm bir şey yapmanıza gerek yok. O zaten GTK+ =).

Ayrıca.. Uzun zamandır depoya girmek bilmeyen MonoDevelop, güncel Pardus 2009 deposu için hazır ve şuan review aşamasında:

monodevelop

Umarım Pardus 2009 kararlı sürümü çıkmadan depoya girer ve Mono kullanıcılarına bir sürpriz yapmış oluruz.

Microsoft, Pardus ve İlginç Gelişmeler

  • 11

  • Mayıs

    2009

Cuma günü Eskişehir Osmangazi Üniversitesi Bilişim Günleri’ne Ali Işıngör ile Akın Ömeroğlu’yu davet etmiştim. Geldikleri için kendilerini pek teşekkür ederim. İki tane güzel bir sunum verip dinleyicileri kendilerine hayran bıraktırdılar; ama sonlara doğru ilginç bir soru gelmişti. Soruyu tam olarak hatırlayamıyorum; ama duyduğumda bende yarattığı gerginliği hala hatırlıyorum. Deniyor ki, bizim sunumlarımızda Microsoft karşıtlığı sezinleniliyormuş..

Bu çok ilginç ve belki de yanlış bir önyargıdır. Esasında kendi kişisel fikrimiz sorulduğunda “Evet, ben bir Microsoft karşıtıyım.” denmesi mümkündür ve bunda anormal bir şey de yoktur. Tıpki Microsoft teknolojilerine hayran kitlelerin GNU / Linux’un gelişimine bir türlü anlam verememesi gibi bir şey bu. Ama bir iki insanın sahneye çıkıp da OOXML veya Pardus ile ilgili bir sunum yapmasının Microsoft karşıtlığı ile alakası nedir, bunu gerçekten çok merak ediyorum.

“OOXML, kusurlarıyla bilinen standart dışı bir xml standardıdır.” diyerek dinleyicileri bilinçlendirmek; onların bir belge paylaşırken, oluştururken veya açarken ne tip bir dosya biçimi kullandıklarını dikkat etmelerini sağlamak neden Microsoft karşıtlığı olarak algılanıyor ki? Microsoft kullanıcıları gerçekten bu kadar vahim bir şekilde, önlerine ne verilse kabul edilecek bir müşteri kitlesi olmamalılar. Gerektiğinde kendi hak ve özgürlüklerini arayabilmeliler ve tavrını ortaya koyabilmeliler.

Diğer taraftan, dinleyicileri Pardus kullanmaya davet etmek de Microsoft veya bilmemne karşıtlığı olarak algılanmamalı. Öyle olsaydı, Daron’un kendi günlüğünde yazdığı kişisel düşüncelerini de Pardus karşıtlığı olarak ciddiye almamız gerekecekti; ama malesef kendisinin bu ekosistem hakkında bilgisi olmadığı için, ki anladığım kadarıyla bu devasa ekosistemin varlığından da bihabermiş, yazdıkları, yaşadığı birkaç olumsuz deneyimden öteye gidememektedir.

Birileri Pardus hakkında daha doğru, yapıcı ve ciddi eleştirilerde bulunsalar keşke diye internette pek sık geziniyorum; Ozgurlukİcin Fikirler’den çıkanlar dışında başka yerde kaliteli eleştirilere pek rastlayamadım. Geçenlerde bir arkadaşım Pardus’ta C# kodlama yapamadığından şikayetçi olmuştu, bunun için neyin eksik olduğunu sorduğumda, Visual Studio benzeri bir uygulamanın olmadığını söylemişti. Oysa Mono’nun son sürümü depomuzda mevcut, kod yazmak işinin yarısını nasıl bilgisayara yaptırabilirim diye soru sorsaydı, o zaman daha tatmin edici cevap verebilirdim kendisine: Bir aksilik olmazsa MonoDevelop Pardus 2009′da yerini alacak. Bu gece 2009 katkı depolarının hazırlanmasından sonra tekrar MonoDevelop paketleme işlemine geri döneceğim.

Son olarak, Lenovo Ideapad s10 netbook’a tam Arclinux kurmak üzereydim ki, Pardus CD kalıbını usb belleğe yazmakla ilgili, Selim Tavşan tarafından yazılmış çok güzel bir wiki sayfası buldum[1]. Pardus 2009 PreAlpha3 için denedim, oldu ama biraz güncellenmesi gerekiyor, geniş bir zamanda el atacağım.

P.S. Pardus stajına kabul edilen 13 kişiden biri oldum, Pardus’a katkı sağlamakla ilgili çok müthiş bir fırsat geçti elime. Bu sene seçilemeyen arkadaşlar üzülmesinler, geçen sene ben de seçilmemiştim =)

[1]: http://tr.pardus-wiki.org/NASIL:USB_bellekten_bilgisayara_Pardus_kurmak

Gitosis ile Git Sunucusu Kurmak

  • 2

  • Mayıs

    2009

Eğer Git hiç kullanmadıysanız, mutlaka önce araştırmanız, denemeniz, fikir sahibi olmanız gerekiyor. Aksi halde aşağıdaki yazdıklarımın size bir şey kazandıracağı konusunda endişeliyim =).

Git, Linus’un, Linux kernelinin geliştirilmesinde kullanmak amacıyla yazdığı bir hızlı sürüm kontrol sistemidir veya sürüm yöneticisidir. Piyasada birçok sürüm yöneticisi bulunmaktadır. Örneğin Pardus geliştiricileri paket yapımında Subversion kullanırlar, Archlinux’ta SVN CVS karışık kullanılmaktadır[1]. Her sürüm kontrol sisteminin birbirlerine göre üstünlükleri ve dezavantajları sözkonusudur. Eğer “Neden Git kullanmalıyım?” diye kendinize soruyorsanız, buna benim vereceğim pek tatmin edici bir cevabım yok; ama şöyle bir bağlantı var, gayet hoş:
http://whygitisbetterthanx.com/

Yalnız bu bağlantıda son madde olarak “Easy to Learn” yazmışlar, o konuda biraz tereddüt ettim, hele ki bayadır SVN kullanıyorsanız, kafanızın haylice karışması mümkün. Çevrimdışı depoda çalışma olayını ilk başta fena halde garipsemiştim. Ama Git’i hızlıca öğrenmek için mutlaka bir GitHub[2] hesabı açın, kurcalayın, alıştırmalar yapın. Şimdi gelelim Gitosis’e..

Gitosis, Git sunucusu kurmanın en güzel yoludur. Bir depo oluşturuyorsunuz, bu depoda görev alacak kullanıcıları (ssh genel anahtarlarını) ekliyorsunuz ve böylece git clone ile depoyu indirip çalışma arkadaşlarınızla ortaklaşa bir yazılım geliştirme fırsatı elde etmiş oluyorsunuz. Ama..

Ama gitosis, sadece izinleri verilmiş kullanıcılar tarafından deponun klonlanmasını sağlayabiliyor. Başka türlü sizden sunucudaki gitosis kullanıcısının şifresini soruyor. Belki gitosis ile oluşturulan depoda sunucu tarafında git daemon export ok komutunu çalıştırmak bunun için işe yarayabilir, henüz deneme fırsatım olmadı. Şimdi gelelim gitosis’in nasıl kurulacağına..

Öncelikle gitosis bağımlılıkları olarak dağıtımınızın paket yöneticisinden git, python ve setuptools’u kurmalısınız. Ayrıca sunucuyla bağlantıyı sağlayabilmek ve gitosis erişim hakkına sahip olabilmek için de SSH kurmanız ve openssh servisini çalıştırmanız gerekir. Bunları kurduktan sonra, gitosis deposundan gitosis’i git’le indiriniz (Nasıl cümle ama?):

$ git clone git://eagain.net/gitosis.git

gitosis dizinine girin. O dizinde root olarak şu komutu verin:

# python setup.py install

Kurulum bu kadar. Ama gitosis için kullanıcı adı ve grup eklemeniz gerekiyor. Bu kısım Pardus kullanıcılarının canını biraz sıkabilir; çünkü her baselayout güncellemesinde bu adımı tekrar tekrar yapacaklar[3]. Sebebi, kullanıcı ve grup bilgilerini tutan dosya baselayout’tan çıkıyor ve siz güncelleme yaptıkça o dosyanın üzerine, yeni baselayout paketinden çıkan dosya yazılacak. Kullanıcı ve grup oluşturma işlemi için root olarak şöyle yapıyorsunuz (Eğer dağıtımınızda /srv dizini bulunmuyorsa /var/spool/gitosis olarak deneyin.):

# mkdir /srv/gitosis
# groupadd -r gitosis &> /dev/null
# useradd -r -m -k /dev/null -g gitosis -d /srv/gitosis -s /bin/sh gitosis &> /dev/null
# chown gitosis:gitosis /srv/gitosis

Kullanıcı ve grubu oluşturduk, gerekli izinleri ve sahiplikleri ayarladık. Bundan sonraki adımımız gitosis’le depo kurulumuyla ilgili olacak. Burada bazı şeyleri açıklığa kavuşturmam gerek. Gitosis’in kurulu olduğu sunucu, bu sunucudaki zorunlu gitosis kullanıcı hesabı, gitosis kullanıcı hesabı dışında herhangi bir gitosis depo yöneticisi olan herhangi bir kullanıcı hesabı ve gitosis depolarına erişimi olan kullanıcılar; işte bunların hepsini birbirlerinden bağımsız olarak ele almanız gerekli. Yani tutup da ben gitosis kullanıcısı açmışım, hem gitosis kullanıcısıyla depo yöneticisi, hem kullanıcı, hem de depoları sunucudan yönetirim diye bir mantık sakın yürütmeyin. Hem güvenli olmayacaktır, hem de muhtemelen bundan sonra yazacaklarımda başarısız olacaksınız. Bu sebeple, gitosis kullanıcısını kullanmayın, hatta parolası bile olmasın, o kullanıcının.

Depo oluşturmaya başlamadan önce, bir depo yöneticisi belirleyin. Benim tavsiyem, sıklıkla kullandığınız bilgisayardaki kullanıcı hesabınız depo yöneticisi olsun. Sunucuda ayrı bir kullanıcı hesabı açmanıza gerek yok; ama zaten sunucuda da size özel bir kullanıcı hesabı varsa, onu da yönetici yapabilirsiniz. Nasıl olsa birden fazla makine veya kullanıcı hesabına da depo yöneticiliği yetkisini sonradan verebiliyorsunuz. Depo yöneticisi olarak seçtiğiniz kullanıcının ssh genel anahtarını sunucuya, “kullanıcı adı @ yerel adres . pub” adıyla gönderin. Örneğin benim bilgisayarımın adı archer, kullanıcı adım gkmngrgn, dolayısıyla ssh genel anahtar adını da gkmngrgn@archer.pub olarak kaydediyorum. Ssh genel anahtar dosyasını herhangi bir metin düzenleyicisiyle açıp satırın sonuna bakarak da nasıl kaydetmeniz gerektiğini öğrenebilirsiniz.

Eğer ssh genel anahtarı oluşturmadıysanız, depo yöneticisi olacak kullanıcı hesabıyla:

$ ssh-keygen -t dsa

komutuyla oluşturabilirsiniz. Soruları geçiş (enter) tuşuna basarak esgeçebilirsiniz. Bu komuttan sonra ~/.ssh/ içinde, id_dsa.pub adıyla bir genel anahtar oluşacaktır. Bu anahtarın ismini biraz önce anlattığım biçimde değiştirin ve sunucuya gönderin. Sonra da aşağıdaki komutla gitosis depolarını oluşturun:

$ sudo -H -u gitosis gitosis-init < /depo/yoneticisi/olacak/kullanicinin/genel/ssh/anahtari.pub
$ sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

Evet, gitosis kullanıcısının ev dizininde gitosis ve repositories adında iki alt dizin oluştu ve post-update için gerekli izinleri verdik. Şimdi depo yöneticisi olan kullanıcı hesabınızla gitosis-admin deposunu klonlayın:

$ git clone gitosis@:gitosis-admin.git

Bu işlemin ardından, komutu verdiğiniz dizinde gitosis-admin isminde bir dizin göreceksiniz. Onun içinde de bir adet gitosis.conf, bir adet de keydir dizini göreceksiniz. Yetkiler ve depolarla ilgili yapılandırmanın yapıldığı gitosis.conf dosyasının bir örneğini gösterelim:

[gitosis]
 
[group developers]
members = gkmngrgn@gacer ggorgen@ggorgen-pardus
writable = example
 
[group admins]
members = ggorgen@ggorgen-pardus gkmngrgn@gacer
 
[group gitosis-admin]
writable = gitosis-admin
members = @admins

Tek tek açıklayalım; gitosis-admin grubunda yer alan ayarlar, depo yöneticilerinin belirlenmesi ve depo ismiyle ilgili ayarlar. @admins, bir nevi admins değişkeni olarak düşünülebilir ve admins grubunda belirtilen üyeleri döndürüyor. developers grubunda yer alanlar ise, example isimli bir dizinin oluşturulması ve bu example dizinine kimlerin erişebildikleri ile ilgili ayarlar oluyor. Bir depo oluşturmak için gerekli örnek developers dizinidir. Şimdi, bu grupta depoya adını verdiğimiz example ismiyle yerel bir git deposu oluşturalım:

$ mkdir example
$ cd example
$ git init
$ echo "First file." > README # Bunu yazmasanız da olur, örnek bir dosya sadece.
$ git add README
$ git commit -m "First commit on example repository."
$ git push origin master

Son komutla yerel depomuzu gitosis sunucusuna göndermiş olduk. Bundan sonra eşleştirmeler dosyalarınızı bu example dizininde tutabilir, değişiklikleri sunucuya gönderebilir ve benzer şekilde farklı git depoları da oluşturabilirsiniz.

Peki, buraya kadar tamam. Ne güzel git daemon export ok demeden sunucuya erişebiliyoruz, değişiklikleri yapabiliyoruz vesaire. E ama hem siz başka bir makineden ve hatta aynı makinede başka bir kullanıcıdan depoyu klonlayamıyorsunuz, hem de dolayısıyla ekip arkadaşlarınızla ortaklaşa bir uygulama geliştiremiyorsunuz, bunda bir terslik var değil mi?

Tabi ki bir terslik var. example'dan önce indirmiş olduğunuz gitosis-admin dizinine girin. İçindeki keydir dizinine, depoya erişim izni vermek istediğiniz kullanıcıların, bilgisayarların ssh genel anahtarlarını atın. Ama başta ssh oluştururken isimlere gösterdiğiniz titizliği bu anahtarlara da gösterin. Hede@hodo ise Hede@hodo.pub gibi. Daha sonra gitosis.conf dosyasında, example deposu veya herhangi bir deponun üyelerine (members) Hede@hodo (veya her neyse || kimse) olarak ekleyin. Böylece bir depoda ekip çalışması yapma işlemi için başka ek bir emek sarfetmek gerekmeyecek.

Yalnız ssh erişimi olmayan kullanıcıların da sadece depoyu indirebilmelerine izin vermek için, git daemon export ok komutunu araştırmanız, öğrenmeniz gerekecek. Son olarak, şu bağlantıları da incelemenizi tavsiye ediyorum:

http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way
http://forum.webfaction.com/viewtopic.php?id=2321
http://wiki.archlinux.org/index.php/Gitosis_Kurulumu

P.S. Gitosis denemelerimin hepsini Pardus 2009'da yaptım, Pardus'ta gayet güzel çalışıyor, gitosis ev dizini olarak /var/spool/gitosis ayarlayın..

[1]: Bu cümle hakkında yorumlarda Alper'in ek bilgisi var, yorumları okuyunuz.
[2]: http://github.com/
[3]: Bu cümle hakkında Türker'in eleştirisi var, yorumları okuyunuz.

Python’da Karakter Dizisi İşlemleri

  • 24

  • Nisan

    2009

Geçenlerde bir arkadaşım, Python 3′te gettext modülünün nasıl kullanılacağını sormuştu, ben de henüz 3.* sürümünü denemediğim için bir cevap verememiştim. Hala da verebilecek aşamada değilim; ama bu konu üzerinde biraz araştırma yaparken, ilginç bir internet sayfasıyla[1] karşılaştım. Aşağıda paylaşacağım kodların ve bilgilerin Python 2.* serisinde çalışmaması söz konusu olabilir.

Python’da karakter dizilerini iki biçimde çağırabiliyoruz:

  • Karakter dizileri için % işleyicisi[2].
  • string.Template modülü[3]

% işleyicisiyle kullanım örneği, Python belgelerinde verilmiş:

>>> print('%(language)s has %(#)03d quot types.' % {'language': "Python", "#": 2})
#Python has 002 quot types.

Bu kodda değişkenler bir sözlük içinde eşleştirilmekte ve print çıktısında tanımlanmış değerleriyle ekrana yazılmaktadır. Bunun aynısı şu şekilde de yapabilirdik:

>>> print('%s has %03d quot types.' % ("Python", 2))
#Python has 002 quot types.

Birincisine göre daha basit olsa da, birinci kodda şöyle bir avantaj söz konusudur:

>>> print('The %(first)s variable, and the %(second)s variable.' % {'second': "New", 'first': "Old"})
#The Old variable, and the New variable.

Bu şekilde kullandığımız zaman, ikinci işleyiciyi ilk olarak tanımlayıp, ikinci işleyiciyi ise sonra tanımlayabilme fırsatımız olabiliyor. Nerelerde kullanılabileceği ayrı bir merak konusu. Bu merakı gidermeden önce bir de şu şekilde kullanıma bir bakalım:

>>> print('The {1} variable, and the {0} variable.'.format("New", "Old"))
#The Old variable, and the New variable.

İlginç, değil mi? Aslında bu kadar çeşitlilik olması garibime gidiyor; ama bu son yöntemin yüksek seviye programlama diline daha yakın bir tarz olduğunu düşünmeden edemiyorum. Yanılmıyorsam bu tip kullanım, C# ve Java’da da var. Şimdi son olarak aşağıdaki kodu inceleyelim:

import sys
 
class Main:
    def __init__(self):
        print("Python version is, {0}.".format(sys.version[:5])) # print'lerin yazimina dikkat..
 
        digits_list = self.digits()
 
        print("{1} is bigger than {0} as digit.".format(digits_list[0], digits_list[1]))
 
    def digits(self):
        try:
            first_digit = int(input("Please write a digit: ")) # raw_input yerine input kullaniliyor.
            second_digit = int(input("And second digit: "))
 
        except ValueError:
            print("\nSorry, you must enter a digit.")
            exit()
 
        return self.sort(first_digit, second_digit)
 
    def sort(self, x, y):
        return sorted([x,y])
 
if __name__ == "__main__":
    Main()

Kodun yaptığı şey basit: Sizden iki sayı girmeniz isteniyor ve sayıları, büyüklüklerine göre {0} ve {1} ile eşleştirip, “X, Y’den sayıca büyüktür.” gibisinden bir cümle döndürüyor. Kod basit olduğu için bu tip karakter dizisi işleyicilerin faydası pek belli olmuyor; ama mutlaka bir yerde faydası vardır =). Son kodun çıktısı şu şekilde:

[gkmngrgn@gacer ~]$ python3 rank.py
Python version is, 3.0.1.
Please write a digit: 3
And second digit: 1
3 is bigger than 1 as digit.
[gkmngrgn@gacer ~]$

[1]: http://www.python.org/dev/peps/pep-3101/
[2]: http://docs.python.org/library/stdtypes.html#string-formatting-operations
[3]: http://docs.python.org/library/string.html#string.Template

Xfce-4.6.1 ve Pardus 2009

  • 24

  • Nisan

    2009

Uzun bir aradan sonra nihayet Eskişehir’e dönüp, biriken işleri eritmeye başladım. Güne başlarken Pardus’ta geliştirmeyle ilgili tüm işleri bitirebileceğimi umuyordum; ama şaka maka değil, yetmedi. Özellikle Pardus 2009 için yapılan çalışmalardan üzerime düşeni bitirmeye çalıştım; ama ciddi anlamda zorluk çektim. Henüz urgentpackages[1] listesindekileri bitirememiş olanlara kolaylıklar dilerim şimdiden.

Diğer taraftan, bu gece Xfce’nin 4.6.1 sürümü derlenecek ve yarından itibaren depoda yerini alacaklar. Çok fazla değişiklik olmamakla birlikte, birkaç önemli hata kapatma ve bolca çeviri güncellemeleri mevcut olacak. Pardus 2009 için katkı depolarının oluşumu da tamamlandıktan sonra, vakit kaybetmeden aynı güncellemeleri 2009 deposuna yansıtacağım.

Son olarak, an itibariyle Mono ailesinin Pardus 2009′a girmesi için uğraşıyorum, herhangi bir engelle karşılaşmazsam değişiklikleri 2008′e (mümkün olan son sürümlerini) yansıtacağım. Neden tersten gittiğimi sormayın, fena halde kafayı yemiş vaziyetteyim x’(..

Bu arada Pardus 2009 çıkmadı, bir yanlış anlaşılma olmasın. Sadece depolar oluşturuluyor ;)

[1]: http://svn.pardus.org.tr/pardus/2009/devel/urgentpackages

Sembolizm Üzerine

  • 20

  • Nisan

    2009

İnsanların yaşamı, yüzde 90 yalanlara dayanır; diğer yüzde 10′luk kısmından emin olmak için henüz yeterli bilgimiz yok. ~ Zar Adam’dan

Bu yıl üniversitemin büyük yükünden kurtulmak üzere, yeni şehirlere ve yeni olasılıklara yelken açarken, bir an durulup arkama bir göz atıyorum. Başlığa sembolizm kavramını sokuştururken peşin peşin sizi uyarasım geldi; belki terimsel anlamıyla tabiri caiz olmamıştır; ama kravattan ne denli nefret ettiğimi bilen bilir. Hiç mi takmam? Elbette takarım; ama sadece yakıştığı için. Şöyle bir konuşma olduğunu varsayın:

- Bir insan çok parası olduğu zaman, yoksullara yardım etmek yerine Bugatti marka araba veya Jeanneau yelkenli satın alırsa, sebebi ne olabilir?
+ Sanırım çoğunu, daha fazlasını da harcayabileceğimize emin olmak için harcarız.. Ve diğerlerinin, ona sahip olduklarımızdan emin olmamız için..

Eğer bir kültürü benimsemek ve altında yatan azımsanamayacak disiplin ve emek adına yelkenli satın almak sözkonusu olsaydı, buna diyeceğim birşey olmazdı; ama verilen cevaba bakılırsa, bununla uzaktan yakından alakası yok. Düşünün, ben bir işletme mezunu olacağım; ama arkama dönüp baktığım zaman kendimi eşofmanla seminer koltuklarında görüyorum. Gerçekten kendimi bir halt sandığımdan değil, tam tersi. Yaptığım şeyin (kravat takmak gibi) mantıklı bir sebebi olsa benim için yeterli olacak. Bazen takım elbiseli herhangi bir elemanı kravatından çekip, “Hey baksana, şu tam simetrik olmayan ipi neden boynuna doluyorsun?” diye sorup öğrenmek istemiyor da değilim tabi..

Diğer taraftan, bu demek değildir ki kravat takanlar sırf anlamı için veya sembol amaçlı bunu yapıyorlar. Bazıları ortama uymak için, bazıları zorunluluktan takıyor olabilirler. Zaten burada kravat da tam anlamıyla bir bahane. Esas cevabını öğrenmek istediğim şey, semboller. Hala ne için ne yaptığımızı bildiğimizden bile emin olduğumuzu söyleyebilecek kapasitede bir bilgeliğe erişemedik ve belki de erişmek bile bir saçmalık olabilir.

Ayrıca şu da gerçektir ki, çoğu zaman yaşadığı ortama uyanlar kazanacaktır. Bir sürü psikolojisi midir nedir, bu toplumu bir şey sürüklüyor. En güçlü olan, daha güçlü olmak için topluluğa yeni, makyajlı, güzel görünümlü alışkanlıklar kazandırdıkça, biz de ortama uymak adına o yöne sürükleneceğiz. Ama dikkatinizi çekerim, sürüklenmek zorunda değiliz, kazanmak zorunda değiliz! Bir kere de kaybedelim, başka şeylerde kazanırız..

Üniversitemi sevdim, öğretmenlerimi çok sevdim; ama malesef beni yıllıklarda ve mezuniyet fotoğraflarında göremeyeceksiniz. Çünkü o mertebeye erişemedim. Hayır hayır, bu son dediğim mertebenin simgeciliğimle bir alakası yok. Gerçekten işletme adına bir katkı sağlayabildiğime inanmıyorum. Ben kaybettim; belki başka şeylerde kazanırım, kim bilir…

P.S. Okulu bırakmıyorum yahu! Bitiyor işte =) Yazmam gereken birkaç makale yüzünden Pardus’taki işlerimi biraz aksatıyorum. Nisan’ın sonunda konserlerimin hemen ardından kokpitin başına geçip, bilgeliğin tek yolu olan deliliğe devam edeceğim ;-)

Windows’ta İlerleme Çubuğu

  • 13

  • Nisan

    2009

- Windows’ta öyle programlama yapılmıyor işte?!
- Yaa! Niye yapılmasın peki?
- İşler hep grafik ekranda fareyle tık tık yaparak gidiyor da ondan…
- Hımm.. Ben de böyle bilirdim ama bir deneyelim, neden olmasın? Bir önceki girdimde[1] dört farklı dilde (c, c++, python ve c#) ilerleme çubuğu yazmıştım; fakat bu kodların Windows’ta çalışıp çalışmayacağını da ayrıca merak etmiştim.

Herşeyden önce, yine bir önceki yazımda maddeler halinde belirttiğim kuralları, şimdi de derleyiciler (compiler) ve yöntemler için de geçerli olduğunu belirtmeliyim. Yani Visual C yerine MinGW derleyicisini; C# kodu derlemek için Visual Studio yerine Mono’yu kullanmam tamamen bir tercih ve zevk meselesidir. Diğer alternatiflerle kodları derleyip sonuçları yorum olarak bizimle paylaşabilirsiniz.

Windows’ta kodları nasıl çalıştırabileceğimizi anlatmadan önce github’dan kodları indirin:
http://github.com/gkmngrgn/gkmn-experimental/tree/ca80b9f93485fc16c5e0dc275fe502fd3569c9f7/progressbar

C kodunu derlemek için DevC++ kullandım; fakat kodlarda küçük bir değişiklik (Windows için uyarlama) yapmam gerekti:

36
37
38
        usleep(40000); /* Bunu sleep(40); yapmalıyız. */
        fflush(stdout);
    }

usleep(40000); satırını sleep(40); olarak değiştirdikten sonra sorunsuz biçimde derlenip çalıştırılabilir hale geliyor. C++’ta ise önce windows.h dosyasını içine alıp, sonra usleep(40000) yerine Sleep(40) yazarak, kodu çalıştırılabilir hale getirebiliyoruz:

1
2
3
#include <iostream>
#include <string>
#include <windows.h>
27
28
29
30
        Sleep(40); /* usleep(40000); yerine.. S harfinin büyük olmasına dikkat! */
        fflush(stdout);
    }
}

Gelelim C#’a.. Eh, pek tahmin edebileceğiniz gibi C#’ta herhangi bir değişiklik yapmıyorsunuz, Mono’yu kendi sitesinden[2] indirip kuruyorsunuz. Sonra Başlat > Programlar > Mono 2.4 for Windows > Mono-2.4 Command Prompt’u tıklayarak kabuğu çalıştırıyorsunuz. Daha sonra yazmış olduğum c# kodunu github’dan masaüstünüze indirin. Geriye derlemek ve çalıştırmak kalıyor =)

C:\Documents and Settings\Gökmen\Desktop>gmcs progressbar.cs
C:\Documents and Settings\Gökmen\Desktop>mono progressbar.exe

Geriye Python kaldı. Python betik dili olduğu için, sitesinden Python yorumlayıcısını indirip[3] kurmak yeterli. Çalıştırmak için ne mi yapıyorsunuz? progressbar.py dosyasına çift tıklamayı deneyin ;) .

[1]: http://www.gokmengorgen.net/gunluk/?p=190
[2]: http://ftp.novell.com/pub/mono/archive/2.4/windows-installer/6/mono-2.4-gtksharp-2.12.8-win32-6.exe
[3]: http://www.python.org/download/

Dört Dilde İlerleme Çubuğu

  • 10

  • Nisan

    2009

Bir önceki yazımda[1], C’de çark ile ilgili bir kod yayınlamıştım ve şimdi biraz daha ilerleterek dört farklı dilde (C, C++, C#, Python) aynı işi yapan ilerleme çubuğu (çark ile beraber) yazdım. Elbette herhangi bir arayüz kütüphanesi kullanmadım. Kodları açıklamadan önce birkaç uyarıda bulunmam gerek:

  • Herşeyden önce bu yazımın bir kıyaslama yazısı olmadığını belirtmem gerek. Zaten bu iş bir ilerleme çubuğu yazmakla olacak cinsten değil. Sadece bir nebze diğer dillerde aynı işin nasıl yapılacağını ve kodun nasıl optimize edilebileceğini görebilmek için böyle bir şey yazdım.
  • Kodu optimize ederken bazı şeylerden taviz vermiyorum. Mesela Python’da bu basit işlem için sınıf veya fonksiyonlar yazmaya çok gerek yoktu belki; ama bunlar olmalı. Temiz, okunaklı ve kullanışlı kod yazımı için bunlar olmazsa olmazlarımız.
  • Kodlar github’da kendi alanımda[2] sizin yorumlarınızla, paylaşımlarınızla güncellenecek. Diff çıktılarına bakarak ne gibi değişiklikler yaptığımı görebileceksiniz. Örneğin C# kodunda yaptığım bir sadeleştirme[3]..)

Şimdi gelelim neler yaptığıma.. Belli bir genişlikte (benim örneklerimde 50 karakter), uçbirimde bir ilerleme çubuğu oluşturuluyor ve belli zaman aralığında (0.04 saniye) ilerleme çubuğu doluyor ve bu sırada da ilerleme çubuğunun yanındaki çark dönüyor. İlerleme çubuğu dolunca da “Done.” diyerek işlemi bitiriyor. Amacımız ise, dilin kütüphanelerini, avantajlarını -kodun okunurluğunu bozmadan veya iyileştirerek- en iyi şekilde kullanmak.

C, C++, Python ve C# kodlarımı buraya[4] tıklayıp progressbar dizininin içinde bulabilirsiniz.

Kodları yazarken bazı şeyler dikkatimi çekti. İlk olarak C’de string kavramının olmadığını görünce kısa bir süreliğine şoke olmuştum, itiraf etmeliyim; ama bir dizi içinde çark elemanlarını (\, |, /, -) yazıp sonra kaçıncı turdaysa, onun 4′e bölümünden kalanıyla elde edilen sonuca ait çark elemanını ekrana basıyor.

static void fwheel(int j) {
    char wheel[5] = "\\|/-";
 
    printf("%c ", wheel[j%4]);
}

Bunu C++’ta da aynı şekilde kullanmışım. Python’da da aynı; fakat wheel listesini fonksiyonun dışında bir yerde tanımlamışım:

    def fWheel(self, wheel, digit):
        return wheel[digit%4]

wheel __init__ fonksiyonunda tanımlı:

    def __init__(self):
        wheel = ("\\", "|", "/", "-")

C#’ta da Python’a benzerlik söz konusu:

    public static void fWheel(int digit) {
        ArrayList wheel = new ArrayList() {"\\", "|", "/", "-"};
        Console.Write("\b{0} ", wheel[digit%4]);
    }

Bir diğer ilgi çekici nokta, her dilde boşlukların farklı mantıklarla oluşturulup döngüye sokulduğu. Bu kodlarda optimize edilmesi gereken bir kısım varsa, ilerleme çubuğunu oluşturan boşlukların kodlandığı kısım. Bana göre en pratiği Python’daki çözümüm:

    def fSpaces(self, tour, digit):
        return "[" + digit * "=" + (tour - digit - 1) * " " + "]"

Son dikkati çekmek istediğim şey kod satırı sayıları. Boşlukları saymazsak en uzun kod C#’inki görünüyor; en kısasıysa tahmin edilebileceği gibi Python. Tabi C# bilgim sadece 1 günlük, o yüzden bu kadar uzun olmuş olabilir; ama sadeleştirebilirseniz ben de bir şeyler öğrenebilmiş olacağım =) Yorumlarınızı bekliyorum.

[1]: http://www.gokmengorgen.net/gunluk/?p=172
[2]: http://github.com/gkmngrgn/gkmn-experimental/tree/6e4c0b0b3bd451280c8ba74446b5da3a070bbdcb/progressbar
[3]: http://github.com/gkmngrgn/gkmn-experimental/commit/6e4c0b0b3bd451280c8ba74446b5da3a070bbdcb
[4]: http://github.com/gkmngrgn/gkmn-experimental/tree/master

Yeni Yıla C ile Giriş

  • 2

  • Nisan

    2009

Ah evet, dün lanet olsun ki Nisan’ın 1′iydi ve iki farklı şakaya maruz kaldım. Bunlardan birincisi Aaron Griffin’den:
http://www.archlinux.org/pipermail/arch-dev-public/2009-March/010971.html

Bir Archlinux kullanıcısı için fazlasıyla anlamsız bir epostaydı. Yerel eposta listemizde de benzeri şaka Alper Kanat tarafından yapıldı:
http://liste.archlinuxtr.org/pipermail/archlinux/2009-April/000652.html

Bunun üstüne bir de Xfce geliştiricisi Jannis Pohlman’den şaka geldi:
http://foo-projects.org/pipermail/xfce4-dev/2009-April/026509.html

Halbuki geçen sene böyle miydi, Pardus’un önemli geliştiricilerinden Çağlar Onur bana geliştiriciliği geçen yılın 1 Nisan’ında müjdelemişti ve başlangıçların en güzelini yaşamıştım. Evet, bu bir başlangıçtı; çünkü ben Pardus’un gelişimine katkıda bulundukça, karşılığında eğitim, öğrenim, tecrübe ve gerçekten de keyif alacaktım. Aldım da…

Bu geçen süre zarfında bazı kararlar vermem gerekti. Öncelikle Xfce kullanıcısıydım ve Xfce paketlerinden sorumlu olmaya başlamıştım. Şimdi benim yerime geçebilecek potansiyel arkadaşlar arıyorum ve onlara elimden geldiğince destek olmaya çalışıyorum. Diğer taraftan, her ne kadar C# bildiğimi söyleyemesem de, Mono projesi ile ilgili uygulamaları paketlemek, bunların depoya girmesini sağlamak ve güncellemekle uğraşıyorum.

Son olarak, uzun zamandır Python’un yanında ikinci bir dil öğrenme gibi çabalarım vardı ve hobi amaçlı olarak işlevsiz ama eğlenceli kodlar yazmaya başladım. Geçen gün bir arkadaşımdan c dersi alırken şöyle eğlenceli bir kod yazdık:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <unistd.h>
#define x 100
 
static void fcark (const int repeat) {
    int i = 0;
    const char cark[5] = "\\|/-";
 
    printf("cursor =>  \t");
 
    for (; i < repeat; i++) {
        printf("\b\b%c\t", cark[i % 4]);
 
        usleep(30000);
        fflush(stdout);
    }
}
 
int main() {
    fcark(x);
 
    printf("\b\bDone.\n");
    return 0;
}

Pek sağlıklı bir yazımım olmayabilir; ama kod çalışıyor. Ne mi yapıyor? İmleci 100/4 (x değişkenine göre) defa kendi etrafında belli aralıklarla (usleep içindeki değerle) döndürüyor. Deneyin, elleşin, hatta biraz daha geliştirin, sonra bana da gösterin! =)

Nice yıllara, yeni geliştiricilerin ve yeni -gerçek- programcıların şerefine..

Neden Günlük Yazıyorum?

  • 26

  • Mart

    2009

Sevgili Archer’imiz ras0ir, yani Samed Beyribey günlüğünden bana bir mim sallamış. Ben de hem “Neden günlük (blog) yazıyorum?” sorusuna cevap vermek, hem de uzun zamandır neden günlüğüme bir şeyler karalamadığım üzerine bilgi vermek amacıyla mimi kabul ettim.

Önceleri neden günlük yazdığımı esasında ben de bilmiyorum. Biraz komik gelebilir; ama gerçekten hatırlamıyorum. Belki bir sosyalleşme aracı olarak düşünmüş olabilirim; ama daha sonra hatırladığım kadarıyla eskiden bilgisayarla aram şimdi olduğu gibi içli dışlı değildi, hatta tam bilgisayar sahibi olabildim derken ben üniversiteye başladığım için yine internet odalarına muhtaç kalmıştım. Belki adamakıllı bir bilgisayar (ve de internet) sahibi olamadığım için, kendime internette yer edinmek amacıyla böyle bir günlük yazma girişiminde bulunmuş olabilirim. Ama ilk zamanlar edebiyata fena halde ilgim olduğumu ve benim de küçük küçük hikayeler yazarak bu edebiyata sanal ortamda katkıda bulunmak gibi bir hevesim olduğunu (idealım değil) itiraf etmeliyim.

Sonra başımdan katlanılması çok güç bir olay geçti ve ciddi bir bunalımın etkisiyle değişmeye başladım. Bu olayın ne olduğunu hatırlayamıyorum pek, katlanılmasının güç olduğunu sadece ciddi olarak değişmiş olmama dayanarak söylüyorum. Bir diğer hatırladığım şeyse, bundan sonraki hayatımda ne yapacaksam, tavizsiz bir biçimde sadece kendim için yapacağıma, kendi kendime söz vermiş olmam.

Eskiden sadece yaşantımı şekillendirmek amacıyla, edebiyat ve bu günlük yoluyla sorularıma cevap aramak için bir şeyler yazmaya heveslenmiştim. Şimdiyse günlük yazma amacımda ciddi bir değişiklik var. Neden mi yazıyorum? Elbette sadece kendim için! Bir nevi sesli yazışma yapıyorum, kendimle dedikodu yapıyorum ve siz de bu şizofrenik monologlarımdan faydalanarak, gerek yazılım, gerek müzik yaşantım, gerekse de gönüllü olduğum projeler hakkında fikir sahibi oluyorsunuz. Hiçbir ticari ve çıkar amacı gütmediğimdem emin olabileceğiniz gibi, yazdıklarımın sizinle tamamen ilgisiz olmadığını da söyleyebilirim. Zaten buraya gelen ya Xfce için geliyordur, ya da Pardus, Archlinux veya benzeri konularda bilgi sahibi olabilmek için uğruyordur. Kitle de belli yani =)..

Son aralar neden pek yazmadığıma gelecek olursak.. Müzik işleri, ziyaretler falan derken haftanın üç günü yollarda, kalan dört günü de dinlenme, okul, freelance işler derken bitiveriyor. Bir de okuldaki kariyer günleri stresini üzerimden atabilsem..

Neyse, benden bu kadar =) Mirat Can Bayrak’a selamlar ;)