Python + Mencoder betiği ile altyazılı filmleri cep telefonuza uygun çevirin

Dün akşam bash kabuğundan halletiğim bazı mencoder işlemleri için küçük bir Python betiği yazdım. Bu betik belirlediğim bir divx filmin içine altyazıyı gömerek bunu MPEG-4(.mp4) formatına çeviriyor. Daha önce mencoder ile bir iki şey yazmıştım hatırlarsanız fakat onların bazı eksiklikler vardı.

  • Birinci yazımda komut için telefona codec yüklenmeli ve divx player veya smartmovie gibi programlar ile izlenmesi gerekiyordu
  • İkinci yazımda artık herhangi bir codec yüklemenizde gerek yoktu, fakat hala divx player yüklememiz gerekiyordu.

Peki nasıl telefonumuza hiç bir ek uygulama yüklemeden dahili oynatıcımızdan oynatabileceğiz ? N95′in desteklediği video formatları arasında şunlar var:

3GPP formats (H.263)
H.264/AVC
MPEG-4
RealVideo 7,8,9/10

Bizim yapmamız gereken bu formatlardan birini kullanmak. Biraz daha araştırınca web’de bu konu hakkında iki tane belge buldum. Ben de birine göre daha önce yazdığım betiklerden de faydalanarak aşağıdaki betiği yazdım. Ayrıca şöyle bir şey var, N95 ve diğer N-serisi telefonların bazı multimedya tuşları olabiliyor. Bu tuşlar da sadece içindeki dahili Realplayer oynatıcı ile çalışıyordu. Artık oluşturduğumuz bu video’lar bu tuşlarla da uyumlu olacak.

Yazdığım betik şu şekilde, neler yaptığını sonrasında anlattım:

Okumaya devam edin »

Yeni bir kitap alımı ve Amazon.com wish-list destek butonu

Geçen gün 1-2 saatlik boş zamanımda okulun kütüphanesine gitmiştim. Elektronik dersine çalışacaktım fakat sonra gözüm bilgisayar kitapların bulunduğu reyona takıldı ve o tarafa doğru yöneldim. 80′li yıllardan kalma bir sürü kitapla beraber(20′ye yakın Pascal kitabı vardı), bir kaç yeni kitap görmüştüm. Bunlardan en ilgimi çeken ise “Mastering Regular Expressions” kitabıydı. Daha önce bir çok kişi tarafından güzel şeyler duymuştum bu kitap hakkında, hatta Amazon.com‘daki wish-liste’me de eklemiştim. Kitabı merak etmiştim, ben de başladım okumaya. İlk 20 sayfayı okuduğumda zaman o kadar çabuk geçmişti ki ben bile şaşırmıştım. Kitap çok hoşuma gitti, ve elimin altında bulunması gerektiğine karar verdim. Kütüphane’den alsam 2 hafta süresi var, ayrıca uzatsam bile böyle bir kitaba sahip olmak isterdim açıkçası.

Ben de dün bu kitabı sipariş verdim. Galiba 2-3 hafta içinde elime ulaşacak. Kitabı alırken Amazon.com’daki başka kitaplar da ilgimi çekmeye başladı, oydu şuydu derken kendimi Coding Horror‘un sitesinde buldum. Turker buraya bakmamı tavsiye etmişti ayrıca, iyiki de bakmışım.Jeff Atwood kitaplar hakkında güzel bir yazı yazmış. Liste’deki kitapların bir kaçını biliyordum, aralarında Turker’in de tavsiye ettiği kitaplar vardı. Aranızda kitap almak isteyip de, tavsiye isteyen varsa kesinlikle bu liste’ye bir göz atsın. Tüm bu kitapları almam biraz zor olacağından almak istediklerimi Amazon.com’daki wish-liste’me ekledim. Bu vesileyle de sağ tarafa bir tane buton ekledim.

Bildiğiniz gibi Blog’umda herhangi bir reklam banneri yok. Zaten pek de istemiyorum, fakat düşündüm destek olmak isteyenler bana kitap alarak çok güzel bir şekilde destek olabilirler. Hem böylelikle istediğim ve okumak istediğim kitaplara sahip olabilirim, hem de okurlarım farklı bir şekilde bana destek olabilirler. Bunu neden diyorum, geçen Türk Blog Yazarlarının toplantısına katılmıştım. Orada da kişisel bir blog’a reklam konulmalı mı konulmamalı diye tartışmıştık. Bir kısmı reklam olmasından yanaydı, bir kısmı da(Mfyz, ben) reklam olmaması, onun yerine donation(bağış) gibi sistemlerden yanaydı. Ayrıca bu gibi kitapları Türkiye’den alabileceğimiz bir yer olsa ne güzel olurdu. En azından bir kitap için 2-3 hafta beklememiş olurduk.

Python ile dosya karşılaştırması yapmak

Pınar ile Jabber’den konuşurken Pardus için küçük bir iş olduğunu söylemişti. Kendisine eğer ufak tefek şeyler olursa yapmaya çalışırım demiştim zamanında. Kendisi de Fatih Aşıcı’nın küçük bir işini bana söylemişti. Fatih ile de konuştuk sonra bu işi. Gerçi sonra farklı bir yol izledik, ama ben yine de öğrendiğim ve yazdığım bu betiği paylaşayım. Bu gibi yazılar çokça görebilirsiniz şimdiden diyeyim :) Gelelim işin nasıl bir şey olduğuna.

Şimdi elimizde iki tane liste var. Bu listelerde her ekran markasının hangi frekanslarda çalışması gerektiği yazar. Bir tanesi Fedora’ya ait, diğeri de Pardus’un kendi listesi. Fedora’da yaklaşık 5200 tane Pardus’ta ise yaklaşık 4400 tane girdi var. Şimdi sorun şu, Fedora’da olup ama Pardus’ta olmayan belki yüzlerce model var. Fedora’da her model için Pardus’ta olup olmadığına bakıp eklememiz lazım. Hal öyle olunca binlerce satır’a teker teker bakmak zor oluyor. Ben de bunu bir Python betiği ile halletim. İlk önce betiğinin kendisini vereyim ve ardından betik hakkında bilgileri veririm:

Okumaya devam edin »

Python ile klasör isimlerini topluca değiştirin

2-3 haftadır Python çalışıyorum tekrardan ve bu sefer bir çok şey öğrendim. Öğrendiğim yeni bilgileri sizlerle paylaşayım dedim. Uzun zamandır aklımı meşgul eden bir konu vardı onu Python sayesinde halletim bu sayede. Şimdi kısaca bilgisayarımda fotoğraflarla dolu 20-30 tane klasör var, bunları da hep şu şekilde yazmıştım:

Almanya_ekim_2007
Bolum_temmuz_2006
Bilmemne_hede_höde_2008

Fakat sonraları baktım ki bu biçim bana uygun değil,sondaki yıl ibarelerini en başa getirirsem çok daha uygun olacağını anladım, yani şu şekilde bir şey:

2007_almanya_ekim
2006_bolum_temmuz
2008_bilmemne_hede_höde

Haliyle bir sürü klasör olunca hepsini elle teker teker yapmak yerine bir tane küçük Python betiği yazayım ve kendisi hepsini değiştirsin dedim. İlk önce yazdığım betik aşağıdaki gibi:

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import os, re
  5.  
  6. def renamer():
  7.     for filename in os.listdir(os.curdir):     
  8.         if re.search('(\w)_(\d)', filename):
  9.             m = re.compile('([a-z_]*)_([0-9]*)', re.IGNORECASE)
  10.             names  = m.search(filename)
  11.             newfilename = names.group(2) + '_' + names.group(1).lower()
  12.             print newfilename
  13.             #os.rename(filename, newfilename)
  14.  
  15. if __name__ == '__main__':
  16.     renamer()

Betiği klasörleri değiştirmek istediğimiz klasörün içinde çalıştırmamız lazım. Kısaca yaptığı adımlar şunlar(satır numaralarına göre):

  • Satır 7: Klasörün içindeki klasörlerin bir listesini çıkartıyor, ve teker teker isimleri alıyor
  • Satır 8: Eğer klasörlerin sonunda sayılar varsa devam et, yoksa hiç bir şey yapma
  • Satır 9: Klasör isimlerini için bir tane regex ifadesi yazıyoruz.
  • Satır 10:Ardından bu regex ifadesi için bizim klasör’ler aranıyor ve ona göre bulunuyor
  • Satır 11:Bulunduktan sonra names.group() şeklinde bunlara ulaşabiliyoruz, bunlarla da istediğimiz şekildeki yeni dosyamızı oluşturuyoruz, ben 2008 + _ + dosya_deneme şeklinde yaptım, sizler farklı yapabilirsiniz tabi.
  • Satır 12:İstediğimi ifadeler doğru çıkıyor mu, çıktısına bakalım
  • Satır 13:Eğer doğru ise bu satırın önünde # ifadesini kaldıralım.

Öğrendiklerim bazı noktalar var, örneğin regex ifadelerini kesinlikle çok iyi bilmek lazım. Örneğin 9′uncu satırdaki ifade’yi irc’de acemi’den aldım. Ondan önce re.split ile bir yöntem denemiştim fakat tam istediğim gibi olmadı. O yüzden bu gibi işlemler için regex ile aranız ne kadar iyi olursa sizin için daha iyi olacaktır. Örneğin 8′inci satırdaki if durumunu kitaptan bakarak yaptım ve istediğim şekilde çalıştı. \w tüm alfabetik harfler demek, \d ise tüm sayılar demek. Yani eğer harfler_sayılar şeklinde bir dosya ismi var ise filename içinde o zaman devam edecek, yoksa betik hiç bir şey yapmayacak. Ayrıca büyük harfleri küçük harflere dönüştürmek için sadece .lower() ifadesini ekledim, aynı şekilde yeni bir isim oluşturmak tıpkı lego taşları ile oynamak kadar kolay. Gerçekten sevilesi bir dil Python.

Betiği düzgün bir şekilde çalıştıdıktan sonra, sonuçlar da şu şekilde olacaktır:

Python Betik

Ayrıca bu betik yazdığım ilk Python betiği özelliğini taşıyor. O yüzden ki bir sürü hata ya da gereksiz kod parçası olma olasılığı çoktur. Onun dışında Python ile cidden kısa zamanda güzel işler yapabilirsiniz, zaten kullandıkça yeni şeyler öğrenmemek elde değil. Bakalım zaman ne gösterecek inşallah zamanla çok daha farklı şeyler öğrenmiş oluruz.

Openmoko’nun bize getirdiği olağanüstü avantajlar

neo.jpgOpenmoko‘yu bilmeyenler için ilk önce tanıtayım. Openmoko tamamen açık olan, GNU/Linux alttabanına sahip bir platform. Buna da NEO adında dokunmatik ekrana sahip güzel bir telefon. En önemli özelliği ise açık olması ve geliştiriciler için çok güzel imkanlar sunmasıdır. Bu benim ne işime yarayacak diyenler var ise, ne gibi avantajı olduğunu şu şekilde anlatayım.

Bildiğiniz gibi 3 hafta önce iPhone adında bir telefon çıktı. Her ne kadar tüketici aşıkları bu telefonu yüzyılın telefonu olarak ilan etseler bile, hadinden fazla ekisklikleri vardır. Bunları şimdi saymaya başlamak istemiyorum bunun yerine Ethem Tolga’nın yazdığı “iPhone’daki eksiklikler” yazısına bakabilirsiniz. Fakat en önemli noktayı kaçırmayalım, iPhone’nun en kötü ve en berbat yani kapalı bir sistem olmasıdır. Hiç bir işe yaramayan kapalı bir sistem. Ne bir şey geliştirilebiliyor, ne de herhangi bir değişiklik yapılabiliyor. Eliniz kolunuz bağlı. Çök kötü bir duygu olsa gerek. #!/bin/blog’da bu konuya değinmişti.

İşte tam bu anda Openmoko devreye giriyor. Neo adındaki bu telefon açık kaynak kodlu bir sistem. Hem de tam alasından. Nasıl mı. Birincisi alet açık bir şekilde satılıyor. Öyle herhangi bir servis sağlayıcısına bağlılık yok. Aylık ödeme yok. Serbestsiniz yani. Openmoko’nun tüm parçalara ayrılmış belgesi bile var. Güzel bir dökümana sahip. Hangi parça ne anlama geliyor, ne ne içindir gibi sorular aklınızı karıştırmasın. Çünkü resmi dökümanlar var. Resimlerle beraber herşeyi görebilirsiniz. Bu kadar açık yani. Onun dışında açık bir sistemin de açık bir arayüzü vardır. Openmoko için yeni programlar geliştirilmesi için gerekli tüm yazılım bileşenleri mevcut. Yeni başlayanlar için oluşturulan belgesindeSim kartı nasıl takılır” gibi ibareler yerine, doğrudan nasıl shell bağlantısı oluşturulacağı yazılır.

neo1.jpgGördüğünüz gibi olanaklar o kadar geniş ki. Sınır tanımıyor. Devkit adında bir paket varki, içinde yok yok. Bilgisayar ile Openmoko arasından binbir türlü bağlantı kurabiliyorsunuz. İçindeki işletim sistem de tabi ki yukarıda bahsettiğim gibi GNU/Linux.

Gördüğünüz gibi bu kadar güzel, bu kadar kullanışlı, bu kadar bize avantaj sağlayan başka bir telefon yoktur. Openmoko platformu bu sene çığır atacak bir adımdır. Eminim çok muhteşem işler yapılabilecek bu telefon ile. Programlama becerilerim iyice artıktan sonra böyle bir cihaz almayı düşünüyorum. Hem okuduğum mesleğim’e uygun(Elektrik-Elektronik Müh.), hem de ilgi alanıma uyuyor. İleride edindiğim bilgiler ile de daha değişik şeyler yapmam mümkün olacaktır. Tek dejavantajı henüz alpha aşamasında olup, tüm şeyler rayına oturmamış olmasıdır. En az 1 sene daha geçmesi lazım tahminen.

Vim içinden Python kodu çalıştırmak

Kitabı yavaş yavaş okumaya başladım. Örnekleri daha önce C kodlarını yazdığım Vim ile başladım, fakat C’deki gibi F9′a basınca derlemiyor(yorumlamıyor). Vim içinde Python için bir çok destek mevcut, bunları okumak için

:help python

yazmanız yeterlidir. Burada bir çok örnek verilmiş de zaten(çok ayrıntılı şeyler mevcut ileriki zamanlarda tekrar gözden geçirmem gerekecek). Ben bunların bir çoğunu denedim ama hiç biri istediğim gibi olmadı. :pyfile komutu var fakat bu da sadece çıktının son satırını gösteriyor. :!terminal -e ‘python %’ denedim fakat bu da terminalı açtıktan sonra hemen kapatıyordu.

Arch forumlarını biraz gezindim ve en sonunda birinin kullandığı komutu gördüm, çok basit fakat istediğim gibiydi. Vim içerisinden Python’u çalıştırıyor, ve kullandığım dosyayı yorumluyor. Komut ise şu :

:!python %

Burada % bizim dosyamız olur. Ben bunu daha da kolaylaştırmak için, .vimrc‘ye şu ibareyi ekledim

map :!python %

Evet hepsi bu kadar, artık F8 basınca anında vim içinde dosyam yorumlanıyor. Hata varsa düzeltiyorum yoksa yazmaya devam ediyorum. Vim ile daha çok şey öğreneceğiz gibi.

Ekleme: myavuzselim enter tuşuna çare buldu, onu da yukarıda ekledim teşekkürler

Next Page »