C++ öğrenmek

Bölümümle alakalı olarak değil de, ilgi alanlarımla alaklı olarak günün birinde C/C++ öğrenmek zorundaymışım gibi hissediyorum kendimi(işin temeline olan merak). C++ öğrenmenin yeterince zor olması yetmiyormuş gibi, bir de Python gibi bir dilden sonra öğrenmeye çalışırsanız çok daha zor oluyor(denedim, ordan biliyorum).

Programlamaya Python ile başlamakla ne kadar doğru bir karar verdiğimi sürekli düşünüyorum. Gerçekten de yeni başlayanlar için(hatta sanırım eskiler için de?), öğrenmesi kolay ve zevkli bir dil. Kısa sürede ortaya birşeyler çıkarabilecek seviyeye gelebiliyorsunuz, syntax(türkçesi ne ki bunun?)ı kolay, yazması ve okuması kolay, çok amaçlı..

C++ ise tam tersi, ortalama öğrenme zamanının 5 yıl olduğundan bahsediliyor her yerde(herhalde bu işin üstadı olmak için gereken süredir diye düşünüyorum). Syntax’ı Python ile karşılaştırıldığında anlaşılması ve yazılması çok zor. Bir de programlamaya Python ile başlayıp, boşlukların bir anlam taşımasına alıştıktan sonra, diğer dillere alışmak daha da zor oluyor(boşlukların anlamlı olduğu başka dil var mı acaba?).

İşin bir diğer yönü de kaynaklar, C’nin bu konuda avantajlı olduğu düşünülebilir, fakat ben bu konuda sapıtmış durumdayım. Örneğin şu anda Python hakkında internetteki tüm sağlam ingilizce kaynakları biliyorum, çoğunu da okumuşumdur. Aynı şekilde birkaç Python kitabım var, birkaç tane de okulumun kütüphanesinden takip ediyorum, sağlam kaynakların hepsini sayabilirim(ve bunlar yeterli aslında). Fakat sözkonusu C gibi onyılların dili olunca, piyasada belki de yüzlerce kitap var, aynı şekilde internette de.. Python hakkında bile bir sürü gereksiz kaynakla zaman kaybettim(internetteki saçma tutoriallarla özellikle), bir programlama dili öğrenmek zaten yeterince sıkıcı bir iş, birde bu kadar kaynağın arasında boğulmak istemiyorum.

Bir yerden başlayacağım neticede, en azından türkçe bir kaynaktan başlarsam daha kolay ve hızlı ilerlerim, bu sıkıcı süreci biraz olsun kısaltırım diye bir süre araştırma yaptım ve A’dan Z’ye C Kılavuzu kitabından başladım, fakat tam bir hayal kırıklığı oldu. Sürekli muhabbeti yapılan mikroişlemci veya DOS muhabbetinden midir bilmiyorum her sayfada bu kadar ilkel bir dille nasıl uğraşılır diye kara kara düşünürken buldum kendimi.

İnsanlar akın akın C#, Java gibi dilleri öğrenirken bazen yanlış yolda mıyım acaba diye düşünmüyor değilim :) ..

Şimdi http://www.learncpp.com/ adresinden bu sefer C++’a başladım. Python’u çözdüm de buna mı sıra geldi? Hayır ama aynı anda birden fazla kitap okuyup, sıkılınca değiştirmek gibi, bir yandan başka bir işle uğraşmak iyi geliyor(bir yandan ingilizceyle uğraşmak yetmiyor da :) ).

Kafamdaki sorular

Okul kütüphanesi ve Wikipedia’da geçirdiğim saatler sonunda kafamda oluşan onlarca sorudan aklıma geldiği kadarını mail yoluyla internette bu soruyu cevaplayabileceğine inandığım insanlara gönderiyorum. Sorular şunlar:

  • Bir programın(farklı programlama dillerinde yazılmış, henüz derlenmemiş, kaynak koddan) çalıştırıldığı andan işini yapıp kapandığı ana kadar olaylar nasıl gelişir? Bir süredir ilgilendiğim Python programlama dili üzerinden anlatmak gerekirse, programı çalıştırdığımda önce bytecode denilen birşeye(ne olduğunu çözemediğim) derlenir(derlemenin de ne olduğunu çözebilmiş değilim, birkaç farklı anlamı var sanırım), daha sonra bytecode çalıştırılıyor ve Python kodu yorumlar, buradan sonra ne olduğu hakkında bir fikrim yok, işlemciye giden şey(her ne gidiyorsa), herhangi bir kod mudur(makine kodu yada assembly gibi birşey? bunların da ne olduğunu çözebilmiş değilim, işlemcilerin anlayabildiği farklı farklı makine kodları var fakat assembly denen şey ortak sanırım), yoksa sadece 1010010 şeklinde binary’midir(elektronik bilgim yok fakat neticede iletim sadece sinyallerle olabileceğinden-herhalde o iletkenlerin içinden “print ‘hello world’” kodu geçmiyor :)- 101010 formatında birşeyin gitmesi lazım, belki daha sonra bir koda dönüştürülüyordur?). Eğer cevap binary değilse o zaman işlemcinin içinde bir yorumlayıcı olduğu anlamına mı gelir? Aşırı ileri seviye bir scripting dilinin kaynak kodlarının işlemciye gitmesine kadar aşamaları anlatabilir misiniz?
  • Bytecode yorumlanmaya hazır kod anlamına mı gelir?(Interpreter’a gidecek kod yani?) Ya da bu anlamı da var mıdır?
  • Burada bir başka soru daha geldi aklıma, insanlar ilk bilgisayarlara 100101010011 formatında komutlar gönderiyorlardı, daha sonra bunları gruplayıp isimlendirip assembly’nin temelini attılar(yanlış olabilir, düzeltin lütfen). Daha sonra birileri assembly ile başka diller yazdılar, sonra başkaları bu başka dillerle başka diller yazdı vs.. Soru şu, C dili başka bir dille yazıldı neticede, daha sonra C ile Python yazıldı örneğin. Bu durumda nasıl Python kodunun çalışabilmesi için Python yorumlayıcısına ihtiyaç var, tüm dillerde bunun geçerli olduğunu varsayarak(değilse neden? nasıl?) şunu merak ediyorum, Python kodu çalıştırdığımda Python yorumlayıcısı > C yorumlayıcısı > C’nin yazıldığı dil yorumlayıcısı > vs. şeklinde adımlar izlemesi gerekmez mi? Neden? Nasıl?
  • Aslında lisp ile alakalı bir sürü soru vardı kafamda ama sanırım heyecandan unuttum(fazlamesai’deki tüm lisp yazılarını okudum), maillerime cevap alabilirsem ikinci aşama olarak sormayı planlıyorum.
  • Frameworklerin yaygınlaştığı dünyamızda web güvenliğinin geleceğini nasıl görüyorsunuz? Bu sayede artık güvenliğimizi dert etmiyoruz, bizim yerimize frameworkün geliştiricilerinin işi.
  • Frameworkler varken, CGI öğrenmeye-kullanmaya- gerek var mıdır? Varsa kullanım alanları nelerdir, framework nerede yetersiz kalır?
  • Üniversite öğretmenlerinin öğrencilerine “C# öğrenin yeter” dediği günümüz Türkiye’sinde bir bilgisayar mühendisliği öğrencisine neler tavsiye edersiniz?(not: bu olay Sakarya Üniversitesi’nde bilgisayar mühendisliği 1. sınıfta okuyan bir arkadaşımın başına gelmiştir, ben TOBB ETÜ’deyim). Ayrıca bazı üniversitelerimiz ilk sınıfda bazı dersleri pascal üzerinden göstermekte(YTÜ) ve neredeyse tüm üniversiteler öğrencileri bir yerde JAVA öğrenmek zorunda bırakmakta. Bilg. müh. olup da Ruby, Lisp ne bilmeyen insanlar tanıyorum, bir keresinde de okulumda bilg. müh. son sınıfta okuyan bir grupla sohbet ederken arkalardan ödev yapmakta olan bir öğrenci Windows’da komut satırında(DOS diyorlar birde ona) bir üst klasöre nasıl çıkıldığını sormuştu, cevap verdiğimde diğer öğrenciler şaşırdı, çok ileri seviye bir bilgiymiş gibi(bir arkadaşım da bilg. müh. olup da daha mail’e dosya eklemeyi bilmeyen birinden bahsetmişti).
  • Yapay zeka’ya giriş için tavsiye ettiğiniz kaynaklar var mı?
  • Bu tip sorularımla rahatsız edebileceğim ve bana cevap atmaya üşenmeyecek olan insanlar tanıyor musunuz?(türkçe bilmesine gerek yok, ingilizce öğreniyorum)

Bir yandan Python ile birşeyler yapmaya çalışıyor(Django’ya başladım), bir yandan da yukaridaki konularda araştırmalar yapıyorum. 2 haftadır da tatildeydim ve siteyi iyice boşladığımın farkındayım, tasarımda biraz oyama yaptım ama yarım kaldı ilgilenmeyince tabii..

Python’da derleme, yorumlama üzerinde

Daha önceki yazılarımda da sürekli belirttiğim, uzun süredir merak ettiğim Python’da derleme, yorumlama vs. ve hız konularını az önce Learning Python kitabında gördüm. Kitaptan alıntı yapamayacağım ama kısaca özetlemek gerekirse:

Python’da kod byte-code’a derleniyor, daha sonra byte-code yorumlanıyor. Byte-code taşınılabilir ve platform bağımsız bir format. Python kodu hiçbir zaman binary’ye derlenmiyor. Bu yüzden bazı programlar C gibi tamamen binary’ye derlenen programlama dillerinkine göre yavaş çalışıyor.

Buradan şunları da çıkarabiliriz sanırım; C ile yapılmış birkaç kblık çok amaçlı programları Python yorumlayıcısı yüklü olmayan bir bilgisayarda hiçbir zaman yapamayacağız. Programlarımız platform-bağımsız olsa da her zaman “yorumlayıcı-bağımlı” olacak.

Python ile gereksiz bir proje

Can sıkıntısından aklıma gereksiz bir proje daha geldi, bilgisayarımda saklayacağım bazı numaraları şifreleyesim geldi ve basit bir şifreleme programı yazmaya karar verdim. Mantığı aşırı basit, girdiğiniz şeyi(string aslında) bir liste olarak kaydediyor, daha sonra bu listedeki elemanların yerlerini rastgele değiştirip kaçıncı elemanın şifrelenmiş halde kaçıncı eleman olduğunu “anahtar” altında kayıt ediyor. Anahtarın mantığı şu; eğer anahtardaki ilk eleman “7″ ise, bu ilk elemanın şifrelenmiş halde 7. eleman olduğu anlamına geliyor. İkinci fonksiyon da şifreli hal ile anahtardan, orjinal şeyi(string :) ) veriyor.

10 dakikada yazılmış bu koddan beklenebileceği gibi bir sürü eksiği var, hatta sadece kısa ve numaralardan oluşmuş stringlerde düzgün çalışıyor diyebilirim. Eğer uzun olursa anahtar da uzuyor(anahtar ile şifre aynı uzunlukta olacak). Eğer ASCII’de olmayan karakterler girerseniz sapıtıyor. Henüz buna bir çözüm bulamadım, o yüzden türkçe karakterler de kullanılamıyor. Neyse ki Python3 ile UTF’e geçeceğiz ve türkçe karakterlerle uğraşmamıza gerek kalmayacak. Fonksiyonlar aşağıda:

import random

def sifrele(girdi):
    a = 0
    pos = []
    yer = {}
    for i in girdi:
        pos.append(a)
        yer[a] = i
        a += 1
    random.shuffle(pos)
    sifreli = ""
    for i in pos:
        sifreli += yer[i]
    print sifreli
    print "anahtar:", pos

def coz(girdi, anahtar):
    a = 0
    pos = []
    for i in girdi:
        pos.append(a)
        a += 1
    cozum = ""
    for i in pos:
        cozum += girdi[anahtar.index(i)]
    print cozum

Bir daha canım sıkıldığında muhtemelen Regex Cheat Sheet gibi birşey hazırlamaya başlayacağım, konu anlatımlı test kitabı formatında olmasını planlıyorum :). Onun dışında .mp3 formatlı dosyaları kurcalamayı öğrendiğimde müzik arşivimi düzenleyecek bir kod yazmayı planlıyorum. Aslında bir de frame’e göre düzenlenmiş altyazıları zamana göre dönüştürmeyi planlıyorum..

Programlamanın temelleri vs.

İngilizce aşkına bir senemi feda etmiş olmamın(?!) verdiği acı ile birkaç aydır okulumun kütüphanesinden “bilgisayar mühendisliğine giriş”, “programlamaya giriş” vs. kitapları alıp okumaya çalışıyorum. Tabii ki ders amaçlı kullanılan bu kitapları roman okur gibi okumak biraz garip oluyor ama neticede işe yaradığı kesin. Bu konularda Mutasyon’daki yazılar çok faydalı oldu. Assembly, C ve işlemciler hakkında çok güzel bir kaynak.

Bilgisayar mühendisliği ile alakalı konferanslara da katıldığımdan kafam iyice karıştı, önce işin temelini öğrenmek amacıyla işlemciler, makine dili, assembly gibi konuları kurcalamaya başladım, daha sonra derleyiciler derken şu anda aralarındaki bağlantıyı kurmakta zorlandığım bir sürü bilgi var kafamda. Özellikle derleme(compile), decompile(geri-derleme?!) ve interpret konusunda.

Sunum ödevim için konu olarak yapay zekayı seçmemin de etkisiyle yapay zeka konusuna dalış yaptım. Genel kültür seviyesinde bir sürü(umarım gereksiz değildir) bilgiyle doldurdum kafamı. Bir yandan da Python ile uğraşmaya çalışıyorum, arada nesne tabanlı programalamayı kurcalıyorum. Python’da ticari uygulama nasıl geliştirilir, kaynak kod nasıl gizlenir çözmeye uğraşıyorum, fakat hiç de kolay olmadığını farkettim. Neyse ki yüzlerce dolar değerindeki ticari uygulamalarının bile kırılıp, cracklerinin vs. yapılması bana moral veriyor. Açık kaynak kodu seviyorum :) . Aşağıda Python kodunun güvenliğini sağlamak ve decompile etmek hakkında bazı kaynaklar var:

Bir yandan da bir hafta sonra başlayacak olan 2 haftalık dönem arası tatilim için hazırlık yapıyorum(Dragon Age, Modern Warfare 2, Left 4 Dead 2 almak, arkadaşları ayarlamak vs.).

Python’da REGEX, işe yarar bir çalışma

Python’da REGEXP(regular expressions, düzenli ifadeler) öğrenmek uzun süredir aklımdaydı, okuduğum kaynak kodlarda sürekli karşılaşıyordum. Bir süredir Python ile uğraşmıyorum fakat aklıma geldikçe bazı küçük işlerimde kullanıyorum. Geçen gün de aklıma bir fikir geldi. Bir dizi(aslında ben anime izliyorum) izlediğinizi düşünün, izlediğiniz videonun özelliklerine göre(FPS) bir altyazı buldunuz fakat altyazıda renklendirme, italik yazdırma vs. için garip kodlar var(Linux altında bu kodları yorumlayan bir program var mı? SMPlayer ve VLC yorumlayamıyor) ve bu sizi rahatsız ediyor. İzlediğiniz dizi onlarca bölüm, her bölümde yüzlerce satır altyazı var ve dolayısıyla bu kodları elle temizlemek imkansız. Karşılaştığım durum tam olarak buydu ve bu sorunu Python ile çözebileceğimi düşündüm. Fakat önce düzenli ifadeler öğrenmem gerektiğini farkettim bunun için. Bu yüzden biraz düzenli ifadeler çalışmam gerekti.

Neticede işimi görecek kadar öğrenmem kısa sürdü ve küçük bir program yazdım. Programın yaptığı iş şu: bulunduğu klasördeki dosyaları sırayla açıyor, ve istenmeyen kodları siliyor. Altyazı aşağıdaki gibiydi:yazi_k

  1. {12830}{13134}{C:$9C8B7C}Ölüm Defteri’ni kullanan herhangi birinin…
  2. {13134}{13494}{C:$9C8B7C}Cennet’e ya da Cehennem’e gidebileceðini düþünme.
  3. {13584}{14019}{Y:i}Dünyanýn benim varlýðýmý öðrenmesini saðlayacaðým.
  4. {14019}{14379}{Y:i}En doðru yargýlarý uygulayan biri olarak!

Burada dikkat edilecek şey ilk iki {} arasını silmemek, bunlar altyazının görüneceği zamanı belirtiyor. Ondan sonraki renk ve biçim kodlarını ise silmek istedim. Bu kısmı ayırmak için yazdığım regex kodu şu şekildeydi:

  1. \{[A-Z].*\}

Kodun son hali, klasörün içindeki dosyaları(altyazılardan başka dosya olmamasına dikkat :) ) açıyor, bu satırları değiştiriyor ve dosyanın başına “yeni_” ekleyerek orjinal dosyayı değiştirmeden kaydediyor. Son kod şu(açıklamalarıyla beraber):

import os, re

dosyalar = os.listdir(os.getcwd()) #klasördeki dosyaları listeliyoruz
derle = re.compile("(\{[A-Z].*\})") #regex kodumuz, aslında derlemeden de yapılabilir
for dosya in dosyalar: #her dosya için
    file = open(dosya, "r") #aç
    liste = file.readlines() #oku, liste olarak kaydet
    file.close() #kapat
    for s in liste: #listedeki her satır(altyazı satırları oluyor)
        nesne = derle.search(s) #regex'i ara
        if nesne: #eğer bulursan(True dönecek)
            liste[liste.index(s)] = liste[liste.index(s)].replace(nesne.group(1), "") #bulduğun kısmı sil
    yeni = open("yeni_%s" % dosya, "w") #başına "yeni_" ekleyerek yeni dosya oluştur
    yeni.writelines(liste) #yeni dosyaya yaz
    yeni.close() #yeni dosyayı kaydet

Bu kodun benim için özel bir yanı var, ilk yazdığım regex kodu olmasının yanında aynı zamanda ilk yazdığım “işe yarar” kod. Sonunda öğrendiğim şeylerin bir işe yaradığını görmek güzel(Aslında bir de tüm altyazıyı 3.4sn ileri almak istemiştim ama inşallah ilerleyen günlerde yapacağım). Bir ara bu işi regex kullanmadan yapan bir kod da yazmayı düşünüyorum.regex_k

Hackers & Painters ve Lisp

Hackers & Painters okuyorum ve Lisp ilgimi çekmeye başladı. Kullanacağım falan yok ama ilginç bir dile benziyor, okunacaklar listesine eklediklerim:
http://www.fazlamesai.net/index.php?a=article&sid=2461
http://www.fazlamesai.net/index.php?a=article&sid=2511

12»