PyS60 Audio Uygulamaları

Biraz zaman aldı yazının devam etmesi, farkındayım. Bunun sebebi pys60 dışında başka şeylerle uğraşmam. Bunların içinde işletme dersleri, oyunlar ve daha önce bahsettiğim çeşitli projeler var. Buraya yazı yazmıyorsam bilin ki o sıra PyS60 ile ilgilenmiyorumdur.

Eski telefonlarla yenileri ayıran başlıca özelliklerden birisi multimedya uygulamalarıdır. Eski telefonlarımızda resim görüntüleyemez ve karmaşık sesleri çalamazdık. S60 serisi telefonlar ile kavuştuğumuz bir çok özellikten bazılarını kullanmaya yarayan “audio” modülü hakkında bir kaç konuyu sizlerle paylaşacağım. Bu özelliklerden ilki “text to speach” olarak adlandırılan sizin yazdığınız yazıyı sesli olarak iletilmesidir. Yazdığınız yazı telefon tarafından okunur. Türkiye’de bize sunulan telefonlarda bu özelliğin olduğunu sanmıyorum(en azından ben karşılaşmadım) ama biz yinede not etmiş olalım, bakarsınız lazım olur. Bu özelliği kullanmak için auido modülünün say() fonksiyonunu kullanırız. Örnek olarak:

import appuifw
import audio

text = appuifw.query(u”yaz bisi:”, “text”)
audio.say(text)

İkinci özellikse mp3 ve midi dosyalarının çalınması. Mp3 türü dosyalar müzik dosyaları olarak kullanılırken, midi’ler genellikle zil sesi olarak kullanılır. Bu özelliği kullanmak için sound.open() ve sound.play() fonksiyonlarını kullanırız. Kullanım şekli play([times=1, interval=0, callback=None ])’dir times parçanın kaç kere çalınacağını gösterir. Callback’i önceki yazılarda örneklendirmiştik. Interval belirlenen süre parçaya ara verir. Örnek:

import audio

sound = audio.sound.open(“E:\xxxxx.mp3”)
def oynat():
^^^^sound.play()
^^^^print”oynatmaya basladik”

Not: “^^^^” işaretini arada dört karakter boşluk olduğunu belirtmek için kullandım.

Sound sınıfının play ve open fonksiyonlarının yanında stop, recort, max_volume, set_volume, state gibi fonksiyonları da vardır. Bu fonksiyonların listesini daha önce vermiş olduğum resmi dökümandan edinebilirsiniz. Kullanımları aynı olduğu için teker teker açıklamıyorum ama özellikle record fonksiyonu işinize yarayabiliceğinden işten kaytararak içinde çeşitli örnekler olan bir sitenin adresini veriyorum.

Kolay gelsin

Yapay Zeka Sıkıntısı

Kafam çok bozuldu çıktım tüm facebook gruplarından. Siyasi yazı yazmama kararımdan dolayı(öyle bir şey mümkünse) matrix filminin ikincisinin ardından bilim kurgudaki yapay zeka sıkıntıları üzerine birşeyler karalıyım dedim. İyi ettim ki okuyorsunuz bu yazıyı…

İnsanlığın yarattığı yapay zekaların nasıl ona karşı ayaklandığının örneklerini verelim:
Matrix, i robot, terminator, battlestar galactica ve belki blade runner vb… Hepsi belli bir noktada insandan kopyalanmış duygusal tepkiler göstererek(korku, korunma, nefret, merak) yaratıcılarına karşı ayaklanan yapay zekaları konu alıyor. Sorunun temelinde yaratıcısına benzeme arzusu yatıyor. Düşünün insanoğluda aynı çaba içersinde değil mi? Can veriyoruz, can alıyoruz, kendimizi tanrısal güçler bahşedilmiş halde hayal ediyoruz, herkesin bizi sevmesini bize saygı duymasını istiyoruz, süper kahramanlar yaratıp tüm hayallerimizi onun üzerinden gerçekleştirmeye çalışıyoruz, sanat eserlerini ortaya çıkarıyoruz(insanın bir sanat eseri olmadığını iddia edebilecek var mı?) ve son olarak tabiki yapay zeka ile uğraşıyoruz.

Kendimizi tanrılaştırmak için geliştirdiğimiz bu zekayı insana benzetmeye çalışıyoruz. Neden robotları insana benzetelim ki? Bunun altında ki sebep gerçekten sadece uyum sorununu gidermek mi? Amacımız bizimde bir insan yaratabileceğimizi göstermek, tanrı rolüne soyunmak.
Bunu yaptığımız için kendimizi eleştirme hakkını kendimde görmüyorum, sadece ne yaptığımızı belirtiyorum.

Gelelim işte hikayelerimizde yaşanan sıkıntıların kaynağına. İnsan eliyle yaratılmış ve insanı kopyalayan yapay zeka bir noktadan sonra isyan eder. Evet, çünkü insanında yaptığı ilk hata isyan etmek olmuştur. Emre itaatsizlik ve cennette bye bye! İnsan ürünü yapay zeka dışlanır belki yok edilmeye çalışılır, işte bu noktada iki tarafta korkuya kapılmıştır(insan-yapay zeka) birbirlerine saldırmaya başlar ve hikayelerde genellikle insanlık kaybeder. Peki sonra ne olur? Bize anlatılan direnişin hikayesidir ama karşı tarafa hiç bakılmaz. Yapay zekanın amacı nedir? Tüm insanlığı yok ettikten sonra ne olacaktır? Bu soruların bir cevabı var mıdır?

Yapay zeka kendine bir vücut oluşturur. Ardından insana benzemeye çalışır. İşte o yaratıcıya benzeme arzusu! Sonunda insanın şeklini kopyalar; organik yapılar üzerinde çalışır belki canlı birşeyler yaratabilecek, birşeylerin tanrısı olacaktır! İnsanlıkla olan savaşında ona benzemesi faydasını gösterir, aralarına sızar böylece daha fazla veri alarak daha iyi kopyalama yapar. Hikayeler devam etse insanlığın tamamen ortadan kalktığını görebiliriz. Peki sonra ne olur?

İnsanlık yok olmuş, yapay zeka gezegene hüküm sürmeye başlamıştır, karşısında bir düşman olmadığı için amaçsız kalmıştır. Araştırmalarına devam eder ve daha gelişmiş bir yapay zeka üretir, bu arada kendi toplumsal yapısını kurmuştur bile. Bir gün eserleri onlara ihanet eder ve savaş yeniden başlar.

PyS60 SMS Uygulamaları

Önceki yazılarımızda sms gönderme konusunda bir örnek yapmıştık. Çok basit bir uygulamayla msajımızı gönderebiliyorduk ama mobil sistemlerde iş mesaj göndermekle bitmiyor. Mesaj alıyorsunuz, bir yerde saklıyorsunuz, üzerlerinde işlem yapıyorsunuz. İşte bu yazımızda sizlerle birlikte “SMS” olayını irdelemeye çalışacağız. Wiley’nin mobile python kitabında olayı çok güzel özetlemişler: günümüz teknolojisinde binbir çeşit iletişim imkanı olsada eski telefonlarla yenileri buluşturan en temel özelliktir. Bu yüzden bizler kitleler halinde mesajlaşmaya devam ediyoruz.

Python mobile index isimli bir modüle sahip. Bu modül sayesinde telefonumuzun gelen kutusuna erişip oradaki mesajlara ulaşabiliyoruz. Örneklere geçmeden önce bu modülün objelerinin bir listesini yapalım:

sms_messages()
content(sms id)
time(sms id)
address(sms id)
delete(sms id)
unread(( )sms id)
set_unread(sms id, status)
bind(callable)

Örnekler üzerinde çalışarak bunları kullanmayı öğreneceğiz. Hemen bir örnek ile başlıyorum.

>>> import inbox
>>> i=inbox.Inbox()
>>> m=i.sms_messages()
>>> i.content(m[0])
u'foobar'
>>> i.time(m[0])
1130267365.03125
>>> i.address(m[0])
u'Ceyhun Bey'
>>> i.delete(m[0])
>>>

Dökümandan aldığım bu örnek üzerineden size konuyu anlatayım. Öncelikle tüm uygulamalarızda yaptığımız gibi gerekli olan modülü(inbox) yükledik. Bu şekilde gelen kutumuza erişmiş olduk ama iş burda bitmedi. Mesajımıza ulaşmak için bu mesajın “id”sini bilmek gerekiyor. sms_messages() fonksiyonu ile bu idlerin listesini “m” ile almış olduk. Ardından bu m verisini kullanarak önce content fonksiyonu ile mesajın içeriği aldık, time() fonksiyonu ile zamanını öğrendik, adress() ile gönderenin adresini aldık ve delete() ile mesajı sildik. İşte bu kadar!

PyS60 Uygulama Gelişimi – 2

Konu ile ilgili bir önceki yazımda uygulama yapısına bir göz atmıştık. Bu sefer bu yapının menü gibi bölümlerini inceleyeceğiz. Bilgisayar dünyasında yazılan çoğu uygulamada menüleri kullanmışsınızdır. Oyunları açtığınızda karşınıza çıkan bir menüdür, benim gibi firefox kullanıyorsanız sayfanızın üstünde menüler vardır. Windows kullananların “Başlat” menüsü vardır.Başlı başına bir sistem olan Symbian’da yazdığınız uygulamalarında birer menüye sahip olması kaçınılamaz bir durumdur.

PyS60 ile menüleri geliştirirken python’un tüp özelliğini kullanacağız. Her zaman dediğim gibi bu özelliği bilmeyen arkadaşlar çeşitli kaynaklardan araştırabilir ve tüpün ne olduğu öğrenebilirler, bu blogu eski versiyonundan beri takip edenler varsa onlar daha önce yazdığım veri çeşitleri konularını okumuş ve tüp bilgisine nail olmuşlardır 🙂

Şimdi bir uygulama yazalım ve içine bir menü yerleştirelim uygulamayı oldukça ufaltıcam; menüyle ilgilenelim:


import appuifw, e32

def selamlar():
appuifw.note(u"Selamlar size!")
def gitburdan():
appuifw.note(u"sevmiyorum seni git burdan!)
def quit():
print "Çıkış bu tarafta, defol!"
app_lock.signal()

appuifw.app.exit_key_handler = quit
appuifw.app.title = "Garipbirdurum"
appuifw.app.menu = [(u"bu bir tüp", selamlar),(u"başlık ve fonksiyon", gitburdan)]

app_lock = e32.Ao_lock()
app_lock.wait()

Bir önceki yazımızda benzer bir uygulama yazmıştık burada ekstradan menü seçeneği kullandık. Gördüğünüz gibi mesaj-fonksiyon şeklinde menülerimizi oluşturuyoruz. Daha önce bahsetmediğim sekmeler(tabs) bölümüde buna benzer bir gelişim sürecinde kullanılmakta orada yapmanız gereken appuifw.app.set tabs() fonksiyonunu kullanmak. Bu arada menü için bir kaç not belirteyim.
(başlık, callback) Bu normal menü
(başlık, ((title, callback)[… ])) Bu alt menü oluştururken kullanılıyor. (Kendiniz deneyin bakalım yapabilecekmisiniz)
Ekranın ayarlarınıda uygulamanız içersinde değiştirebilirsiniz bunun için aşağıdaki seçeneklerden birini uygulamanıza yerleştirmeniz gerekir. Daha fazla yapı öğesi için PyS60 dökümanına bakınız sonraki konularda belki başka yapı özelliklerini kullanırım.
appuifw.app.screen=’normal’ # (normal ekran, başlık, tuşlar…)
appuifw.app.screen=’large’ # (tuşlar gözükür)
appuifw.app.screen=’full’ # (full ekran)

Görüşmek dileğiyle, iyi bayramlar.

Python 3.0

Python 3.0 diğer adıyla Python 3000 çıkmadan çok önce kullanıcıları ikiye bölmüştü. Bir kısım kullanıcılar değişikliklerin artık bir zorunluluk olduğunu savunurken diğer kesim geri uyumlu olmamasından dolayı büyük sorunlar getireceğini düşünmekte. İki kesiminde haklı olduğu noktalar var; 3.0 ile birlikte bir çok geliştirici kodlarını yeniden düzenlemek ve 3.0’a uymak için daha çok çalışmak zorunda kalacak. Düşünün bir uygulama yazıyorsunuz ve bu uygulama bir çok farklı kütüphane kullanıyor ve 3.0 ile birlikte bu kütüphanelerin büyük kısmı artık işinize yaramıyor yaramasa bile yeniden düzenlenmeleri gerekiyor ve haliyle bu büyük bir zaman kaybına neden oluyor.

Diğer tarafta Guido van Rossum’un önderliğinde bir grup geliştirici dilin gelişimine devam etmesi açısından bu versiyonun büyük bir stratejik hamle olduğu görüşünde. Onları destekleyen argümanların başında Python 2.x’in hala kullanımda olması ve 3.0’ın nimetlerinden yararlanmak istemezseniz var olan uygulamarda bir değişikliğe gerek olmadığı geliyor.

Benim açımdan olaya bakarsak, unicode sorunun çözümü işlerimi çok kolaylaştıracak. Gelişimin önünde ki engeller kaldırılmalıdır. Bir çok gereksiz şeyin kaldırılması Python’u daha tutarlı bir dil haline getirmiştir. Uzun dönemli performans kısa dönemli uyuma tercih edilmiştir ve bu çok doğru bir karardır! Kütüphanelerin dönüşümü zaman alabilir ama fazla sorun çıkmadan bu işlemin tamamlanacağını ve herkesin 3.0’a geçeceğini göreceğiz.

Evet, ben geçtim…

Python 3.0 Çıktı!


Uzun süreden beri bekliyorduk çıkmasını. Eski versiyonları geriden desteklemesi yok bir çok değişiklikle birlikte geldi bu yüzden yeni bir python ile karşı karşıyayız. Gözüme ilk çarpan artık print ifadesinin tamamen bir fonksiyon olması. print şeklinde değil print() şeklinde kullanacaz.
PyS60 yazı dizisinde kullandığımız u”….” şeklinde unicode ifadeleri artık kullanamıyoruz(standart olarak utf-8 oldu) bir çok eski modül silindi, bazılarının ismi değişti. Kütüphanelerin bir kısmı paketler olarak birleştirildi…

Python 3.0 ile gelen yeniliklerin tam listesini resmi siteden öğrenebilirsiniz.
Python 3.0’ı indirmek için bu adresi kullanabilirsiniz.

Hayırlı Olsun!

PyS60 Uygulama Gelişimi – 1

Başlamadan önce python ile fonksiyon kullanımı konusunda bilgi edinmenizi öneririm. Modüler programcılığın getirdiği kolaylıkları sonuna kadar kullanacağız.

Önceki yazılarımda aslında yaptığımız her bir örnek sonuçta bir uygulamaydı. Burada bu uygulamaları telefonun yapısına adapte etmeye başlayacaz ve yavaş yavaş telefonun özelliklerini kullanacaz. S60 serisi telefon kullanan arkadaşlar telefondaki uygulama yapısı ile sürekli karşılaşmaktalar gelin gözümüzde canlandıralım.(yada yukarı bakın :D)

Başlık – appuifw.app.title
Bildiğiniz uygulamanın başlık alanıdır, hemen altında sekmeler vardır.
Gövde – appuifw.app.body
Uygulamanın ortasındaki geniş alan gövdedir. İçersinde kullanıcı arayüzünde kullandığımız çeşitli uygulamalar olabilir örneğin query(), note() fonksiyonlarındaki örnekler.
Menü – appuifw.app.menu
Sol alt köşede menü öğesi vardır
Çıkış – appuifw.app.exit_key_handler
çıkış değişkeni

Şimdi bir örnek yazalım ve bu özelliklerden bazılarını kullanalım.


import appuifw, e32

def quit():
print"Çıkış tuşuna basıldı"
app_lock.signal()

appuifw.app.exit_key_handler = quit
appuifw.app.title = u"ilk uygulama"
appuifw.note(u"uygulama şuan çalışıyor")

app_lock = e32.Ao_lock()
app_lock.wait()
print "uygulamadan çıkıldı"

Bu sefer appuifw’nin yanında e32 modülünüde import ettik. Bu modül düşük seviyeli telefon fonksiyonlarını içerir. quit isimli bir çıkış fonksiyonu tanımladık ardından başlığı ve uygulamada görüntülenecek yolu yazdık. İlk önce fonksiyonları incelemenizi bu yüzden istemiştim çünkü burada çıkış işini bir fonksiyon tanımlayarak yaptık. Pythona hangi fonksiyonun çıkış işini yaptığını exit_key_handler değişkenini quit fonksiyonunun ismiyle eşitleyerek gösterdik. PyS60 da böyle spesifik işleri yapan fonksiyonlara geri çağırma fonksiyonları deniyor(callback) ben ingilizce ifadesini kullanacam. Şimdi neden e32 modülünü yükledik onu açıklıyayım. Normalde bir kod yazdığınızda python satır satır ilerler ve sonunda hepsini işleyip uygulamayı kapatır. Buradaki örnekte biz kullanıcı istediğinde çıkmasını istiyoruz o zamana kadar program beklemede kalmalı. İşte bu yüzden wait() fonksiyonu ile uygulamayı beklemeye almış oluyoruz. signal() fonksiyonu gelene kadar bu şekilde beklemede kalır biz basit bir uygulama yazdığımızdan bu signal fonksiyonunu quit fonksiyonun içine yerleştirdik. wait() kullanılmadan neler olacağını silip görebilirsiniz 🙂 Bir sonraki yazıda menü fonksiyonlarından devam edecez.

Proje Gelişiminde İletişimin Rolü

Sevgili Birol ile ben geçen gece çeşitli projeler hakkında konuşma fırsatı bulduk. Önceki yazılarımda bahsettiğim planlarımın bir kısmı bu sohbetin konusuydu. Sohbetimizi önce görüntülü konuşma şeklinde yaptık, ooVoo programının kaydetme seçeneğini denedik, sonra benim internet bağlantımın kotalı olmasından dolayı sohbetimize sesli olarak Google Talk üzerinden devam etmeye karar verdik. Başka işlerle meşgul olmalıydık ki sohbetimizde kopukluklar meydana geliyordu ve sonuçta klasik mesajlaşma seviyesine geri döndük 🙂

Bu olay bana Keramet garajda mı? konusunu hatırlattı. Bir çok büyük web projesinin garajda başlaması elbette bir rastlantı değildi. Zamanında bu yazıya yaptığım yorum ile geliştirilen projelere garaj sahiplerinin imkanları üzerinden bakmıştım. Bu yazımda ise konuya geliştiriciler arasında ki iletişim olanakları üzerinden değineceğim.

Çeşitli projeler üzerinde çalışırken yüz yüze yapılan fikir alışverişleri ile günümüz teknolojisinin sunduğu imkanlar eş değerde olabilir mi? Yüz yüze yapılan görüşmelerde tüm dikkatiniz karşınızdaki kişide yoğunlaşırken bunun dışındaki iletişim türevleri sınırlı sayıdaki duyularınızı uyarmakta. Konuşmanız sırasında siz her ne kadar dikkat etsenizde, bilinciniz başka yerlere kayma eğilimi göstermekte ve muhatabınızın çevrenizi etkileyememesinin(o ne biçim kelime?) getirdiği eksiklik sonucu bu iletişime direnç gösterilmektedir.

İşte garajın mucizesi bu noktada ortaya çıkıyor. İletişimin gücü insanları birbirine bağlıyor ve sanki tek bir kişilermiş gibi düşünüp, yaratıcılıklarını ortaya dökme fırsatı buluyorlar. Fikirlerini, tüm hisleriyle paylaşıp, yanlış anlaşılma olasılıklarını en aza indiriyorlar. Birlikte geçirdikleri vakitler daha çok olduğundan, daha fazla iletişime geçiyorlar ve bunun sonucunda daha sağlıklı bir paylaşım ortamı oluşturuyorlar.

Bunları yazarken “Acaba “Independence Day” filminde yer altındaki askeri merkezlere kapatılan bilim adamları gibi bende arkadaşlarımı bir merkeze kapatsam, nasıl olur?” diye düşünmeden edemiyorum. Medeniyetten uzak, sadece fikir ve teknoloji üretecek bir merkez. Yeride hazır, ne dersiniz? 😀