*1 Aralık 2011 Perşembe

Mazeret mi ?

    Ben buradayım deme yollarından biridir blog. Hani herkes çevresi tarafından kabul görmeyi ister(*). İster ister. Ya da biz ona ister demeyelim de "İstemem yan cebime koy" olsun. Demek istediğim kimse öylesine bir şeyler karalamaz, yazmaz.  Yazdıktan sonra bekler ki ziyaretçim olsun, okusun. Bunu sadece blog diye daraltamayız. Sanat da öyledir mesela. Sen kral bir sanat eseri yapacaksın da ben egoist değilim diye kimseye göstermeyeceksin, eserin beğenilirse gururun hafiften okşanmayacak. Yok öyle bir dünya. 

Şöyle de bir söz duymuştum aklıma gelmişken söyleyeyim. 

"Mütevazi olmaması gereken yerde mütevazi olan herkesden daha kibirlidir."

Anlaşılan o ki ben buradayım deme ihtiyacı azalmış bizde. Belki sadece o da değildir nedeni. Yeterince ifade edememişizdir kendimizi, becerememişizdir, kelimeler dökülmemiştir.

*14 Ekim 2011 Cuma

Yoklama

Takip eden kaldı mı ki hala ?

*29 Mayıs 2011 Pazar

Remotesms android ile pc üzerinden sms gönderin

Bu aralar rastladığım en güzel şey olsa gerek. Yıllardır sms yazma zorluğundan nefret ederdim. Kaldı ki dokunmatik ekranla sms yazmak daha da işkence haline gelmişti. Neyse ki bu programı keşfettim. 

Program androidinize ufak bir webserver kuruyor. Gelen http requestleri belirli işlemlerden geçirilerek sms'lerinize erişim sağlıyor. Programın client ile iletişimi bu şekilde gerçekleşiyor. Siz de kendi browseriniz ile programın web 2.0 arayüzünden sms gönderebiliyorsunuz. Yeni sms geldiğinde uyarı veriyor, sms göndereceğiniz kişiyi yazarken otomatik tamamlama özelliği var. Sms geçmişini görebiliyorsunuz. Kısaca programın özellikleri bunlar. Daha detaylı bilgiyi yazılımcının sitesinden bulabilirsiniz.

Program ister wifi üzerinden kablosuz, isterseniz sitesinden indirilebilen usb connector adlı aracı yazılımı kullanarak usb üzerinden kullanılabiliyor.

Programın hem ücretli hem de ücretsiz versiyonları bulunuyor. Ücretsiz versiyonunu sitesinden indirebiliyorsunuz. Ücretlisine ben karışmıyorum ama arayan onu da bulur.

Aşağıda programın ekran görüntülerine bakabilirsiniz.



*22 Mayıs 2011 Pazar

Benim de bir Android'im var


Bugüne kadar smartphonelar bir yana Nokia 3100 gibi bir telefonu 7 yıl kullanmış biri olarak yazıyorum bu yazıyı.
Telefon dün elime geldi ve hala sevişiyoruz. Telefon hakkındaki ilk izlenimlerim göze çarpan müthiş hızı. Şarj konusunda diğerlerinden farklı bir yorum yapamayacağım ama henüz bir gün oldu telefonu elime alalı. Şarj kullanımı kullanandan kullanana değişecek bir şey zaten. Android Gingerbread 2.3.3 sürümü kullanıyorum. Daha telefonun tüm numaralarını keşfetmesemde şimdilik bir kaç program yükledim marketten.



  • Opera Browser
  • Winamp
  • Meebo IM
  • Mp3 Music Download
  • Applanet
  • Barcode Scanner
  • Astro File Manager
Android dünyasına katıldığımdan ötürü mutluyum. Bu demektir ki ileride blogda android programlamayla ilgili güzel başlıklar olabilir. Takipte kalın. Yazmadığım zamanları bir kenara atarsak android ile ilgili güzel makaleler artık burada diyebilirim.

*25 Mart 2011 Cuma

Virtualbox dan VmWare'a Doğru (*.vdi to *.vmdk)

Uzun zamandır virtualization işlemleri için VirtualBox kullanıyordum. Hem ücretsiz hem de çok sadeydi. Yani kısacası işimi görüyordu. Ama virtualization konusunda her daim adından söz ettiren bir de VmWare vardı tabi ki. Daha önce kullanmadığımdan test etmek istedim. Ne var ki 20 gb' lik *.vdi formatındaki VirtualBox hard disk'lerini VmWare'ın açabileceği *.vmdk formatına çevirmem gerekiyordu. Uzun araştırmalar sonucu en sağlıklı yolun: Önce *.vdi hard disk imajını VBoxManage aracı ile raw formata çevirip sonra da qemu aracı ile *.vmdk formatına çevirmek olduğunu buldum ve işlemleri sırasıyla yaptım.
Not: Denemek isteyenleri şimdiden uyarmış olayım. İşlemler toplamda yaklaşık 10 saat sürdü.

Önce raw formatına çeviriyoruz:

VBoxManage internalcommands converttoraw win7.vdi win7.raw
Qemu yüklü değilse yüklüyoruz. Debian paket sistemi kullananlar için
sudo apt-get install qemu
Raw hard disk'imizi *.vmdk formatına çeviriyoruz.
qemu-img convert -O vmdk win7.raw win7.vmdk
İşlemler bittikten sonra VmWare'da yeni bir makine oluşturuyoruz. Resimde gördüğünüz gibi "I will install operating system later" ı seçiyoruz "Store virtual disk as single file" ı seçiyoruz. Bu iki seçenek dışında herşeyi isteğinize göre seçebilirsiniz. Makineyi oluşturduktan sonra makineye sağ tıklayıp "Settings" kısmını açıyoruz. Burada hardware bölümünde harddiski seçip siliyoruz. Sonra "Add" butonuna basıyoruz. Buradan hard disk i seçip "Next"'e tıklıyoruz. Aşağıdaki resimdeki gibi "Use an existing virtual disk" ile daha önceden qemu ile oluşturduğumuz *.vmdk formatlı hard disk imajını seçiyoruz. Eğer size hard disk imajını VmWare'ın yeni versiyonları ile uyumlu hale getirmek için convert etmek isteyip istemediğinizi sorarsa evet deyin. Dip Not: Bütün bu işkenceleri yapıp VmWare'a pek ısınamadığım için VirtualBox kullanmaya devam ediyorum.

*24 Mart 2011 Perşembe

Bleachbit Command Line - Bash alias ile Temizlik

Geçici, kullanılmayan, bilgisayarımda 5 kb olsa dahi işe yaramayıp yer kaplayan verilerden hep rahatsız olmuşumdur. Windowsda iken çoğunuzun bildiği ccleaner kullanıyordum. Linux dünyasında ccleaner muadili bleachbit adlı programımız var. Bleachbit hem gui hem de command line üzerinden çalışabilen bir uygulama. Sürekli gui açmaktan rahatsız olduğumdan aşağıdaki bash aliaslarını oluşturdum ve arada bir uyguluyorum. Bleachbit command line kullanımına güzel bir örnek. Siz de ~/.bashrc dosyanıza alias olarak ekleyebilirsiniz.
nano ~/.bashrc # düzenlemek için nano ile açıyoruz ve aşağıdaki aliaslarımızı ekliyoruz.
alias temizlik='bleachbit_cli -d chromium.cache chromium.vacuum easytag.logs firefox.cache firefox.download_history firefox.session_restore firefox.vacuum flash.* gnome.run java.cache nexuiz.cache openofficeorg.* opera.cache opera.download_history screenlets.* skype.chat_logs x11.debug_logs xchat.logs xine.cache'

alias rtemizlik='sudo bleachbit_cli -d apt.* system.desktop_entry system.clipboard system.localizations system.tmp system.trash'
Bleachbit command line daha fazla seçenek için: http://bleachbit.sourceforge.net/documentation/command-line

*15 Mart 2011 Salı

python multi threading ve lock'un önemi

        Başlığı python üzerine attım ama multi threding ve lock işlemleri hemen hemen her dilde vardır ve aynı derecede önemlidir.
Multi threading yapılan işlemleri paralelize hale getirip işlem süresini mümkün olduğunca aza indirgemede kullanılır.
Ama bazen her threadin üzerinde işlem yapması gereken global bir obje bulunabilir. Kısa bir örnekle açıklayayım isterseniz.

İnşaatda çalışan 5 işçi düşünün. Bu işçilerin inşaata çıkarması gereken tuğlaları bir kasa içerisinde düşünün. Toplamdaki tuğlalar bitinceye kadar işçiler sürekli tuğlaları inşaata çıkarıyorlar.

Şimdi bu örnekteki işçilerimiz threadlerimiz. Taşınması gereken tuğlalar ise global bir obje. Kasadan aynı anda birden fazla işçi tuğla almak için giremiyor. İşin kod kısmında lock işlemi burada devreye giriyor.

lock = threading.Lock() #lock değişkenimiz
lock.acquire() # karışmayın ben tuğla kaldırırken.
tugla.Kaldir()
lock.release() # benim tuğlalarla işim bitti, artık diğerleri erişebilir.
En açık haliyle lock işlemi bu şekilde kullanılır. Şimdide gerçek bir örnek verip durumu biraz daha açığa kavuşturalım.
Lock kullanmadan
import Queue
import threading
import time

class test (threading.Thread):

        def __init__(self,queue):
                threading.Thread.__init__(self)
                self.queue=queue


        def run(self):
                while True:
                        sayi=self.queue.get()
                        print "%s\n" % sayi
                        self.queue.task_done()


def print_timing(func):
        def wrapper(*args,**kwargs):
                t1 = time.time()
                res = func(*args,**kwargs)
                t2 = time.time()
                print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
                return res
        return wrapper

@print_timing
def main():
        rakamlar=range(1000)
        queue=Queue.Queue()
        thrlist=[]
        for i in range(5):
                t=test(queue)
                t.setDaemon(True)
                thrlist.append(t)
                t.start()


        for asdf in rakamlar:
                queue.put(asdf)
        queue.join()


main()
Lock kullanarak
import Queue
import threading
import time

class test (threading.Thread):

        def __init__(self,queue,lock):
                threading.Thread.__init__(self)
                self.queue=queue
                self.lock       = lock

        def run(self):
                while True:
                        sayi=self.queue.get()
                        with self.lock:
                                print "%s" % sayi
                        #self.lock.acquire()
                        #print "%s" % sayi
                        #self.lock.release()
                        self.queue.task_done()


def print_timing(func):
        def wrapper(*args,**kwargs):
                t1 = time.time()
                res = func(*args,**kwargs)
                t2 = time.time()
                print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
                return res
        return wrapper

@print_timing
def main():
        rakamlar=range(1000)
        queue=Queue.Queue()
        thrlist=[]
        lock    = threading.Lock()
        for i in range(5):
                t=test(queue,lock)
                t.setDaemon(True)
                thrlist.append(t)
                t.start()


        for asdf in rakamlar:
                queue.put(asdf)
        queue.join()


main()
Ekrana yazılan sayılar sırasız olabilir. Bunun nedeni threadlerin queue'den asenkron şekilde eleman çekmesidir. ilk örneği çalıştırırsanız stdout'a erişimin senkron bir şekilde olmadığını farkedeceksiniz. Ama ikinci örnekte print fonksiyonumuzu "with self.lock:" bölgesi içerisinde kullandığımızdan stdout'a erişim senkron bir şekilde olmaktadır.