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..

Firefox’u yedeklemek için tek yöntem

Yeni sisteme taşınmak için tüm Firefox’umun yedeğini almak istedim, tüm eklentiler, yer imleri, kayıtlı şifreler, vs. Biraz araştırmayla bir sürü eklenti buldum, fakat sonra farkettim ki eğer platformlar arası taşımayacaksanız(sanırım eklentiler buna yarıyor), en kısa, kolay ve etkili yöntem, kullanıcı adınızın klasöründeki gizli .mozilla klasörünü yeni sisteme kopyalamak. Hatta geçmiş bile geliyor. Duruma göre içinde Thunderbird ile alakalı dosyalar da olabilir, bu durumda içinden ayıklayabilirsiniz.

Python ile eğlenmek ve PyCon

Dün gece yorgun bir şekilde Python çalışmalarıma devam ederken, öğrendeğim birkaç şey “puhahahs” şeklinde kahkahalar atmama sebep oldu(biraz da uykusuzluğun etkisiyle). Örneğin şu koda bakalım:

>>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17

Bu kod bu çıktıyı verince nedense komik geldi ve saçmalamaya başladım(bu arada sonuç 0′a çok yakınmış, ben hesaplamadım), neyse ki kitap hemen altında sebebini ve nasıl düzeltileceğini anlatıyor(Learning Python, O’Reilly, şu ana kadar gördüğüm en güzel Python kaynağı). Çözümü için decimal kütüphanesini inceleyebilirsiniz.

Neyse, biraz dinlendim, kitabı yeniden elime aldım ve ilerlemeye devam ettim, derken bir şey daha beni kopardı; Python’da True ve False’un aslında 1 ve 0′ı ifade ettiğini biliyoruz, fakat bu kadarı da fazla:

>>> True + 4
5

:) Neyse ki durum sandığım kadar abartı değilmiş:

>>> True is 1
False

Bu arada, Python’a veya hem Python’a hem programlamaya yeni başlayanlara Learning Python kitabını kesinlikle tavsiye ediyorum. Şu ana kadar bir sürü kitap -tüm türkçe kaynaklar, en yetersizleri bunlar zaten, Beginning Python: From Novice to Professional, Python Programming for Absolute Beginner, Invite with Python, Deitel’ın meşhur serisini Python versionu olan Python How to Program ve okulumun kütüphanesinden adını hatırlayamadığım birkaç Python kitabı- okudum/inceledim ve bu kadar yeterli, işin temelini ve arkaplanını anlatan bir kitap daha görmedim. Biraz kalındır, ama hakkıyla öğrenirsiniz diye düşünüyorum. Ben artık bir sürü kaynaktan okuduktan sonra çok iyi bildiğimi düşündüğüm konularda(sayılar, stringler..) bilmediğim ne kadar çok şey olduğunu farkettim.

Bir yandan da yeni birşeyler öğrenmek için PyCon videolarını tavsiye ediyorum. Çok çeşitli konularda çok ilginç kullanımlar görebilirsiniz. 2010′daki PyCon’da Guido’nun konuşmasını güzelmiş mesela :)

Gereksiz Django proje oluşturucu

Hazırlık okumak sıkıcı iş, mid-term öncesi derslerden sıkılmış bir halde bu kodu yazdım, bu gereksiz kod Django kurulu bilgisayarınızda proje oluşturmaya yarar:

import os, re, commands

def start():
    if os.name != "posix":
        print "This app has written for Linux. Exiting now."
        exit()
    elif os.name == "posix":
        global base, pys, django, py
        base = "/usr/local/lib/"
        pys = []
        django = "/dist-packages/django/bin/"
        py = re.compile("^python2\.[0-9]{1}")
        for s in os.listdir(base):
            if py.search(s):
                pys.append(s)

def pyck(lst):
    if len(lst) == 0:
        print "There is Python installed on your comp!"
        print "Exiting."
        exit()
    elif len(lst) > 0:
        a = 0
        for s in lst:
            a += 1
            print "Select Python: [%s]%s" % (a, s)
        try:
            ver = lst[input("")-1]
        except:
            print "There is no Python like that."
            print "Exiting."
            exit()
        os.chdir(base + ver + django)

def go():
    projectlist = []
    for s in os.listdir(os.getcwd()):
        if not "." in s: #proje adi . iceremez, sorun yok yani
            projectlist.append(s)
    if len(projectlist) != 0:
        print "Projects:"
        for s in projectlist:
            print s
    name = raw_input("Project name?")
    print commands.getoutput("python django-admin.py startproject %s" % name)

if __name__ == "__main__":
    start()
    pyck(pys)
    go()

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..

..ve beklenen an

Bugün okulumun öğrenci işlerinden gelen bir maili aynen yapıştırıyorum:

Sevgili Öğrencilerimiz;
2009-2010 yılında Üniversitemize kayıt yaptıran lisans öğrencilerine dizüstü bilgisayarları, 27.10.2009 Salı günü saat 11:00′den itibaren TOBB ETÜ Tanıtım Ofisinde (Tepav binası altı) dağıtılacaktır. Öğrencilerimizin bilgisayarlarını almaya öğrenci kimlikleri ile birlikte gelmeleri zorunludur.

Bilgilerinizi rica ederiz.

2 aydan uzun sürdü, beklediğimize değsin bari. Bir de ben o gün okulda olmayacağım, cuma günü almam gerekiyor, sorun yaşamam inşallah. Elime geçtiğinde bir inceleme yazacağım bilgisayarla ilgili.

Ankara-TOBB ETÜ

4 gündür Ankaradayım ve bugün pazar günü dönmek üzere eve geldim. Henüz dizüstü bilgisayarları dağıtmadıklarından yapacak birşeyim bulamadım ve eve geldim. Değişik bir 4 gün geçirdim. TOBB ETÜ ve kaldığım yer arasında gidip geldim, iftar vakti de kızılay civarında takıldım. Structure, reading, listening, writing ve speaking sınavlarına girdim, şimdilik belli olan öneleme sınavını(structure, reading ve listening) geçmişim. Şu 4 günde şunları öğrendim:

  • TOBB ETÜ güzel üniversite, yeri de güzel. Dil hocaları çok genç ve beklediğimin aksine öğrenciyi geçirmek için çaba sarfediyorlar. Bugün girdiğim speaking sınavından önce korkuyordum çünki daha önce girdiğim KET sınavından kötü bir tecrübem vardı, fakat hocalar konuşmaya çabalarken çok yardımcı oldular, neticede güzel bir muhabbet oldu, büyük ihtimalle speaking sınavını geçmişimdir. Ayrıca sınava da yaklaşık 2 saat geç girdim(uyudum), yinede sınava soktular ve hiçbir sorun yaşamadım.
  • Yurt alanında 4 tane yaklaşık 10 katlı bina yapılıyor, kaç kişi kalacak merak ettim görünce.
  • Üni öğrencileri hazırlık öğrencilerini üniversiteliden saymıyorlarmış, neyse ki TOBB ETÜde yabancı dil binası ayrı.
  • Kayıt günü saat 10.30 gibi kayıt alanındaydım ve ben geldiğimde mühendislik fakültesi kayıt sırası 60lardaydı, ben ise 120.ydim. Aynı gün saat 3 gibi geldiğimde kayıt süresi dolmamıştı ve alanda 1-2 kişi vardı sadece, demek ki acele etmeye gerek yok, herkesin kaydolabileceği kadar zaman var.
  • Dizüstü bilgisayarların çantasında küçük, kapağında ise dev gibi TOBB ETÜ amblemi var. VESTEL yazısından çok daha büyük.
  • VESTEL dizüstü bilgisayarlar sandığımdan çok daha iyi.
  • Ankara güzel şehir, merak ettiğim HAVELSAN, MKE, Tübitak binalarını gördüm, birtek ASELSAN kaldı yakında onu da görürüm herhalde.
  • Ankara-Sapanca arası 3 saat.

Şimdilik aklıma gelenler bunlar..

12»