Bitirme projesi taslağı

j2mecdc_logoMerhaba. Daha önceden de belirttiğim gibi bu siteyi açma amacım bitirme projemi ve gelişimini paylaşmaktı. Bir şeyler öğrendikçe bunu sitede anlatıp bu konuyla ilgilenen insanların da bir nebze olsun gelişimine katkıda bulunabilmekti. Bunu şu ana kadar çok iyi yaptığımı söyleyemem. Bunun sebebi de bitirme projeme tam olarak vakit ayırıp da başlayamamamdı. Zaman konusunda sıkıntı yaşadığım bir dönemin ardından bitirme projeme tam olarak başlıyorum. Buradan da şu an itibariyle yapacaklarımı içeren taslağı sizinle paylaşmak istedim. Belki de biraz da kendimi kontrol etmek adına böyle birşey yapıyorum. Taslağı sadece ben bildiğim sürece tam olarak yapılıp yapılmadığını sorgulayacak benden başka kimse olmayacaktı, sizlerle de paylaşıyorum ki bunu kontrol eden birilerinin olduğunu bilmek beni tembellikten alıkoyar diye umuyorum. Taslakta var olanların durumunu, gelişimini çekinmeden sorgulayınız :)

Öncelikle bu yazıda java logosunun ne işi var ondan bahsedeyim biraz. Bildiğiniz üzere bitirme tezimi mobil ortamlara eğitim yazılımı geliştirmek konulu seçmiştim ve bu uygulamayı Python’da yapmayı düşünüyordum. Ancak projeyi yapmaya başladığım şu günlerde Python’un halihazırda mobil ortamlar için tercih edilebilecek durumda olmadığını farkettim. Elbette ki her proje için geçerli değil bu ancak kendi projem açısından bu yeterliliği bulamadım. Nelerin yeterli olmadığı kısmına kısaca değinecek olursam, Python’un Nokia S60 bağımlılığı en büyük problem. Yaptığım uygulamanın yalnızca S60 telefonlarda çalışacak olması, harcayacağım emek için sıkıntı olacaktı. Çünkü yapmak istediğim uygulama basit bir uygulama değil ve her platformda çalışmasını istiyorum. Python’un S60 bağımlılığını daha önce de biliyordum ancak biraz daha içine girince sorun olacağını düşünmeye başladım.

Bir diğer önemli sorun ise Java’nın kütüphane,ide,emülatör kolaylığı. Bu üçlü maalesef Python için yeterli düzeye ulaşmış değil.

Tüm bunları göz önüne aldığımda tezimi Java ile geliştirmeye karar verdim. Her ne kadar sitenin adı Pythonturk’te olsa bundan sonra Java kodları da göreceksiniz. Amaç bilgi paylaşmak olduğu için bu sorun olmayacaktır.

Tabi bu söylediklerim Java ve Python’un mobil kısmıyla ilgili. Python hala sevdiğim ve öğrenmeye devam etmek istediğim/edeceğim bir dil. Python’la ilgili öğrendiklerimi, sorularınızı elimden geldiğince yanıtlamaya devam edeceğim.

Taslak şöyle:

  • Dersleri modüler olarak programlamayı düşünüyorum, başlangıç olarak bir ders olacak ama program modüler olarak tasarlanacak ve yeni bir ders eklemek için oluşturduğum form çerçevesinde bir class yazmak yeterli olacak.
  • Programa dil desteği koymayı düşünüyorum, buton isimleri, menü isimlerini bir dil dosyası oluşturup oradan çekmeyi düşünüyorum. Başlangıç olarak İngilizce ve Türkçe yeterli, ancak ihtiyaç durumunda başka bir dil desteği eklemek de sorun olmayacak.
  • Derslerin uygun yerlerinde sesli anlatım düşünüyorum (mesela ingilizce dersi için cümlelerin okunuşu olabilir). Programın her bölümüne seslendirme desteği koymayı düşündüm, görme engelliler için de çok kullanışlı olacaktı ancak daha sonra fazla konu dışına çıkmak istemediğimden vazgeçtim. Bu ayrı bir proje olarak ekleme yapılarak sağlanabilir.
  • Dersin sonunda test ve oyun tarzında ölçme yapmayı düşünüyorum.Mesela ingilizce dersi için konu testi olacak ve kelime tahmin oyunu olacak. Bulunamayan kelimelerde ipucu seçeneği ile yardım alınabilecek, yine bulunamazsa cevaba bakabilecek. Oyunda ayrıca kullanıcı adı,skor ve süre bilgilerini de tutmayı düşünüyorum.
  • Yazacağım bir web servisle siteye koyduğum videoların (konu anlatımı olabilir) telefonda izlenmesini sağlamayı düşünüyorum. Bağlantı açısından sorun çıkabilir, henüz bir deneme yapmadım ancak videoları düşük kalitede ve kısa süreli tutmayı düşünüyorum.

Benim düşündüklerim şimdilik bu kadar. Başlangıç için biraz fazla şey eklenmiş olabilir, özellikle tercih ettim bunu. Beklentiler ne kadar yüksek olursa sonuçta ona göre başarılı olur diye düşünüyorum.

Burada sizin de eklemek istediğiniz, “şu da olsa çok iyi olur” veya “yok bu olmasın şöyle şöyle sorun çıkarabilir” dediğiniz şeyleri buradan paylaşırsanız benim için çok iyi olur.

Ayrıca projeme isim bulmadım henüz, isim önerilerinize de açığım.

Kalın sağlıcakla..

Dosya ve dizin silme işlemi

Sitede bir arkadaşın sormuş olduğu soru üzerinden bu yazıyı eklemeye karar verdim, sorusuna da buradan bir cevap vermiş olurum. Vereceğimiz örnek dosya ve dizin silme işlemi ile ilgili olacak. Program fonksiyona gönderdiğimiz konumdaki (path) dosya ve dizinleri siliyor, her doysa/dizin silme işleminden sonra da bir ses dosyası çalıyor.

Kodumuz şöyle:

import os,audio,e32
sound_lock=e32.Ao_lock()

def sound_callback(onceki_durum,simdiki_durum,hata):
    if simdiki_durum==audio.EOpen:
        sound_lock.signal()

def ses_cal():
    sound=audio.Sound.open("z:\\Nokia\\Sounds\\Digital\\Alarm.mid")
    sound.play(callback=sound_callback)
    sound_lock.wait()
    sound.close()
   

def sil(path):
  for name in os.listdir(path):
     new=path+’\\’+name
     if os.path.isdir(new):
        sil(new)
        try:
            ses_cal()
            os.rmdir(new)
           
        except:
           pass
     else:
        try:
            ses_cal()
            os.remove(new)
           
        except:
           pass

sil("e:\\deneme")

Burada ses_cal() ve sound_callback() metodlarından bahsetmek istiyorum.

def ses_cal():
    sound=audio.Sound.open("z:\\Nokia\\Sounds\\Digital\\Alarm.mid")

sound değişkenine çalmak istediğimiz ses dosyasını atadık.

sound.play(callback=sound_callback)

sound nesnesini çalmaya başlattık ve sound nesnesinin play() metodun bir çağrılabilir fonksiyon (callback function – bildiğimiz fonksiyon ) atadık.

sound_lock.wait()
sound.close()

sound_lock adıyla oluşturduğumuz e32.Ao_lock() nesnesinin wait() metodunu çağırdık, bu metotla bir olay meydana gelmesini beklediğimizi belirttik. Daha sonra sound nesnemizi kapattık ve çalma işlemimiz sona ermiş oldu.

def sound_callback(onceki_durum,simdiki_durum,hata):

sound nesnesinin play() metoduna atadığımız fonksiyon 3 parametreyle çalışır. Burada onceki_durum,simdiki_durum ve hata (bunlar sadece değişken isimleri, istediğiniz ismi verebilirsiniz) değişkenleridir. Bizim bu programda ilgilendiğimiz simdiki_durum parametresine gelen değerdir.

if simdiki_durum==audio.EOpen:
    sound_lock.signal()

Bu if bloğunda simdiki_durum değişkenimize gelen değeri kontrol ediyoruz. Eğer değerimiz audio.EOpen ise, wait durumunda olan sound_lock nesnemize signal() metoduyla bir olay gerçekleştiğini belirten sinyali gönderiyoruz.

Peki değerimizin audion.EOpen olması ne demek?

Play metoduyla çaldığımız ses dosyasının çalınabilir, başlatılabilir durumda olduğunu gösterir bize. Bunun anlamı nedir? Bunun anlamı ses dosyamız bir kere çalmış ve bir daha çalmaya hazır demektir.

Şimdi toparlayacak olursak, yazdığımız metod şu işe yarıyor; ses_cal() metodunda sound_lock nesnesinin wait metodunu çağırarak bir olay beklemesini söyledik. sound.play kısmında ses dosyamız çalmaya başlar ve play metoduna atadığımız fonksiyon çalışır. Bu fonksiyonun çalışmasını anlatmıştık, eğer simdiki_durum audio.EOpen değilse sond_lock nesnesinin wait() metoduna bir sinyal gitmeyecek ve program play işlemi içerisinde kalacaktır, diğer kodlar işletilmeyecektir, taa ki ses dosyası bitene kadar. Ses dosyasının çalma işlemi bittiğinde sinyal gönderilecek ve program kaldığı yerden devam edecektir.

Yazdığımız programda her dosya/dizin silindiğinde ses dosyamızı çalıyoruz ve ses dosyamızın çalma işlemi bitene kadar diğer dosya/dinizini silmiyoruz.

Şimdilik bu kadar, kalın sağlıcakla…

05.02.08 tarihinde yapılan düzenleme:

Arkadaşın sorusu üzerine yolunu verdiğimiz konumda arama yapacak (örneğin c:\\) ve adını verdiğimiz dosyayı bulduğunda silecek, bulamadığında ise böyle bir dosya yoktur mesajı yazacak kodu ekliyorum.

import os
def ara_sil(konum,dosya):
    for root, dirs, files in os.walk(konum):
            for name in files:
                print root+" konumunda araniyor"
                if name==dosya:
                    print name+" dosyasi silindi"
                    os.remove(os.path.join(root, name))
                    return
    print dosya+ " dosyasi bulunamadi"
             
ara_sil("c:\\","yaziyazi.txt")

os.walk() fonksiyonu yolunu verdiğimiz konumdaki dosya/dizinler üzerinde gezinmemizi sağlıyor.
root: O anda içerisinde bulunduğunuz konumu tutuyor, string türünde bir değişkendir.
dirs: Bulunduğunuz konumdaki dizinleri tutuyor, liste türünde bir değişkendir.
files: Bulunduğunuz konumdaki dosyaları tutuyor, liste türünde bir değişkendir.

İşlevsel bir örnek olmakla beraber arkadaşın sorusuna yanıt olmuş değil maalesef. Örneği telefonumda denediğimde Python mobil sürümünün os.walk() fonksiyonunu desteklemediğini gördüm. Ancak diğer işletim sistemlerinde sorunsuz çalışıyor.

Mobil uygulamalarda arama yapmak için böyle bir fonksiyon var mı bilmiyorum. Sanırım bunun cevabını alabileceğiniz en iyi yer forum nokia.

Şimdilik bu kadar, kalın sağlıcakla…