Thursday, December 4, 2008

Django uygulamasını deploy etmek


Django uygulamamı deploy ederken karşılaştığım sorunu ve sorunun çözümünü paylaşmak istiyorum. Bilişim Terimleri sitesi deploy teriminin Türkçe karşılığı icin yerleştirme, konuşlandırma terimlerini kullanmış. Fakat bu karşılıklar bana biraz komik geldiği için ("Abi dün gece uygulamayı yerleştirirken problem oldu" gibi), ben "deploy" terimini Türkçeye çevirmeden kullanmaya devam edeceğim.

Bu yazıda bahsettiğim Django (cango diye okunuyor) Tatlı Kaçıklar dizisinde oynayan Mehmet Ali Erbil'in köpeği değil Python ile geliştirilmiş bir Web Framework. Python ile geliştirilmiş onca web framework arasından Django'yu seçmemin nedeni çok iyi bir dokümantasyona sahip olması (gerçekten çok iyi, abartmıyorum) ve web sitesinde yapılan şu Django tanımı oldu :

Web Framework For Perfectionists With Deadlines


Kısaca Django reklamı yaptıktan sonra ana meseleye gelelim. Yazının bundan sonrası Django ile ilgilenmeyenler için sıkıcı olabilir baştan söyleyeyim.
Django, uygulama ayarlarını setting.py dosyasından okur. Genelde development ve test yaparken kullandığınız ayarlar ile production ortamında kullandığınız ayarlar aynı olmaz. En basit örneği database ayarları: url, database adı, kullanıcı adı, şifre gibi.. settings.py dosyasını production sunucusuna upload ettikten sonra her seferinde gidip settings.py'de production ayarlarını yapmak bir süre sonra insanı bayar. Uygulamayı deploy ettikten sonra sağını solunu değiştirmeden çalıştırabilmek için setting.py dosyasına aşağıdaki numarayı çekiyoruz: (Dosyanın sonuna bu satırları yazıyoruz)

try:
from settings_local import *
except ImportError:
pass

Bu sayede Django settings.py'deki ayarları yükledikten sonra settings_local.py dosyamızdaki ayarları yükler. settings_local.py dosyasında development ve test platformunda kullanmak istediğimiz ayarları yazarız. settings_local.py dosyasını production sunucusuna upload etmemize gerek yok, çünkü bu dosyada çalışma ortamımızın production ortamından farkını yazıyoruz. Örnek bir settings_local.py dosyası şu şekildedir:

DEBUG = True

DATABASE_ENGINE = 'mysql'
DATABASE_NAME = 'tututil'
DATABASE_USER = 'nikli'
DATABASE_PASSWORD = 'drowssap
DATABASE_HOST = ''
DATABASE_PORT = ''

MEDIA_ROOT = '/var/www/GOF'
MEDIA_URL = 'http://localhost/gof/'

settings_local.py dosyası settings.py ile aynı klasörde olmalıdır. Dosyalarınızı FTP ile production sunucusuna gönderirken aman dikkat edin settings_local.py dosyasını göndermeyin.

Wednesday, October 29, 2008

Sonunda evlilik telaşı bitti

22 Ekim'de balayı tatilinden dönüp, 23 Ekim'de iş başı yaptım. Daha yeni yeni tatil havasından çıkıyorum. Söz verdiğim gibi yazılara evlilik sonrası daha çok zaman ayıracağım.

Geçenlerde günlüğe yeni bir yazı yazmak için kolları sıvamıştım ki ne göreyim TELEKOMÜNİKASYON İLETİŞİM BAŞKANLIĞI yine yapacağını yapmış; Blogger servisine Türkiye'den erişimi kapatmış. Tünel servisleri aracılığı ile erişim açık olmasına rağmen içimdeki yazma hevesini kırdığı için tatil sonrası ilk yazım bugüne kadar sarktı.

Balayı tatilimiz için Nurten'le Maldivler'e gittik. Yüzlerce adadan oluşan bu ülkede kendi bütçemize göre bir ada seçtik ve çantamızı sırtlanıp Maldivler'in yolunu tuttuk. Katar aktarmalı 10 saatlik bir uçak yolculuğundan sonra Maldivler'in başkenti Male'ye ulaştık. Male'den tatilimizi geçireceğimiz Sun Island adasına transferimiz de deniz uçağı ile oldu. Yeryüzündeki cennete benzetilen Maldivler'de 6 gün geçirdikten sonra gözümüz arkada kalarak dönüş yolculuğuna başladık.

http://picasaweb.google.com/ilkinulas/MaldivesEkim2008 adresinde tatilde çektiğimiz fotoğraflara göz atabilirsiniz.

Aşağıda fotoğraf makinası ile çektiğim ve benim ilginç olduğunu düşündüğüm videolar var. İlk video Sting ray denilen balığın (bu balığın türkçe ismini bilmiyorum. Bilen varsa söylesin lütfen) kendini insanlara nasıl sevdirdiğini, insanların elinden nasıl yemek yediğini görebilirsiniz.



İkinci videoda ise su altı kamerasına alternatif olarak su üstü kamerası ile yaptığım çekimleri izleyebilirsiniz :)



Maldivler bizim için unutulmaz bir deneyim oldu. İlk başta Maldivler'de bir hafta tatil için harcayacığımız para ile Türkiye'de bir ay tatil yaparız diye düşünüyordum. Fakat beyaz kumlar üzerinde güneşlenip,ılık okyanus suyunda mercanlar ve rengarenk balıklar arasında yüzdükten sonra balayımız için Maldivler'i seçmenin ne kadar iyi bir tercih olduğunu anladım.

Friday, September 26, 2008

Evleniyorum...


Selam dostlar, uzun zamandır yazamadım. Bu suskunluğumu güzel bir haberle bozayım dedim. 11 Ekim 2008'de memleketim Denizli'de evleniyorum. 8 Ekim 2008 Çarşamba günü İstanbul, Salon Palmina'da bir düğünümüz var, hemen sonrasında 11 Ekim Cumartesi Denizli'de nikah törenimiz var. Tüm dostlarım davetlidir.

Evlilik telaşı biter bitmez yazılarıma devam edeceğim.

Monday, August 11, 2008

Google Chart API artık QR Codes da destekliyor

Günlüğe ilk yazılarımı eklemeye başladığımda QRCode'lar ile ilgili bir yazı yayınlamıştım. QRCode'un ne olduğundan, nerelerde kullanılabileceğinden bahsetmiştim. Geçenlerde Google Code Blog'ta 'QR Codes now available on the Google Chart API' yazısını görünce bunu siz sevgili blog okuyucularımla paylaşayım istedim.
Google Chart API ile nasıl QR code oluşturulacağı bu sayfada detaylı bir şekilde anlatılmış. Ben olayı bir tane örnek vererek özetlemek istiyorum.
Google'a size bir QR code üretmesi için aşağıdaki bilgileri vermeniz gerekiyor:

  • chs : QR Code olarak çizilecek resmin boyutu (chart size)
  • cht : Chart tipi
  • chl : Encode edilecek text. (örneğin bir URL)
  • choe : output encoding (örneğin UF-8)
    QR Code grafiğini çizdirmek için http://chart.apis.google.com/chart adresine, yukarıda sıralanan parametrelerin gönderilmesi gerekiyor. Bunu HTTP GET ile yapabilirsiniz. http://www.oksijen.com URL'ini QR Code içine gömmek için aşağıdaki resim URL'ini kullanabiliriz.

    <img src="http://chart.apis.google.com/chart?cht=qr&chs=200x200&chl=http://www.oksijen.com"/>



    Yukarıdaki resmin içerisinde http://www.oksijen.com URL'inin gömülü olduğuna inanmayanlar
    herhangi bir J2ME QR Code okuyucusunu cep telefonlarına kurup resmin içinde ne kodlandığını görebilirler.

  • Saturday, June 28, 2008

    TechCrunch & Webrazzi MeetUp Notları

    Bugün TechCrunch & Webrazzi MeetUp'a katıldım. Conrad/Istanbul Otel'de gerçekleşen etkinlik ile ilgili notlarımı paylaşmak istiyorum. Arda Kutsal'ı böyle bir etkinlik düzenlediği için tebrik ediyorum. Titizlikle seçilmiş panel konuları ve konuşmacılar bu güneşli cumartesi gününü bir konferans salonunda sıkılmadan geçirmeme yetti. Yaklaşık 400 kişinin katıldığı MeetUp'ta 7 ana panel vardı:
    1. Sosyal platformlar ve sosyal medyada pazarlama
    2. Kullanıcı içeriğinin yarattığı Web 2.0 hukuku
    3. Online reklam pazarı ve geleceği
    4. Türkiye’de web girişimciliği, yatırım imkanları ve çıkış stratejileri
    5. StartupPad
    6. Grou.ps Global Announcement
    7. European Startup Scene

    Sosyal platformlar ve sosyal medyada pazarlama:


  • Kariyer.net'i temsilen gelen Pazarlama Direktörü Ayça Arsan, Kariyer.net'in reklam harcamalarının 40%'ının internet reklamcılığına ayrıldığını söyledi. Internet reklamcılığının Türkiye'deki reklam piyasasının 2%'sini oluşturduğunu duyduğumda çok şaşırdım.
  • Can Karatoprak, meşhur facebook uygulması Rakı Sofrası'nın yazarı, Rakı Sofrası'nın 1 milyon 50 bin üyesi olduğunu söyledi. Rakı Sofrası gibi basit bir uygulamanın bir şirketi çekip çevirecek paralar kazandırdığını duymak, dikkatimi yeniden facebook platformuna çevirmeme sebep oldu. Can Karatoprak'ın dediğine göre şirketi BizBilişim Çözümleri, Mey İçki ile sağlam bir reklam anlaşması yapmış.

    Kullanıcı içeriğinin yarattığı Web 2.0 hukuku


  • Ekşisözlük'ünde avukatlığını yapan Av. Başak Purut, Türkiye'de bazı savcıların Internet'in ne olduğundan haberlerinin olmadığını, bu savcılar yüzünden youtube ve wordpress'in uzun süreler kapalı kaldığını söyledi.
  • TBD İstanbul Yönetim Kurulu Üyesi Av. Ceyda Cimilli Akaydın, Türkiye'deki bilişim davalarında bilirkişi sıkıntısının yaşandığını söyledi. Ceyda Hanım, isteyenlerin mahkemelere bilişim alanında bilirkişi olmak için başvurabileceklerini ve bilirkişi olarak görev yapmaları durumunda dava başına 300-400 YTL gibi paralar alabileceklerini söyledi. Bu sözün üzerinde salondakilerin bir anda gözleri parladı :)
  • Günün en eğlenceli konuşması Radikal Gazetesi Teknoloji Editörü Serdar Kuzuloğlu'nun konuşmasıydı. Internetin Türkiye'ye gelişinden günümüze kadar geçen sürede kendisinin bilişim adına yaptıklarını anlattı. Radikal Gazetesindeki bir habere yapılan yorum yüzünden kapama davası açılması üzerine, veritabanından elle ilgili yorumu silip davadan yırttığını anlattığında salon kahkahalara boğuldu.

    Online reklam pazarı ve geleceği


  • Bu panel'de, yayın yapanlarla reklam verenleri buluşturan şirket sahipleri Okyar Özlüpınar - Yönetici Ortak, ReklamZ ve Sarper Danış – Ortak, ZapMedya konuşmalar yaptı. Türkiye'de, reklam verenlerin Internet'in gücünden habersiz olduklarından basettiler. Reklam alanında geridönüşün en fazla olduğu ortamın Internet ortamı olduğunu söylediler.
  • Google Türkiye Ülke Müdürü Bülent Hiçsönmez'in, Google AdWords hakkında konuşmaması ilgi çekiciydi. Herkesin bildiği klasik "Internet gelecektir" sözleriyle konuşmasını geçiştirdi.

    Türkiye’de web girişimciliği, yatırım imkanları ve çıkış stratejileri


  • Panelin bu bölümünde Türkiye'deki başarılı girişimcilere ve bu girişimcilerin deneyimlerine yer verildi.
  • Cember.net kurucusu Çağlar Erol, Çember.net'i eşi ile beraber yazdığını 2 sene gibi kısa bir sürede 4 milyon dolara XING'e sattığını anlattı.
  • Startup şirketlerinin ömürlerinin çok uzun olmadığından, sektörde palazlandıktan sonra devler tarafından satın alınmadıklarında web'in karanlık sayfalarında kaldıkları söylendi. Girişimcilere para yatıran LeVenture'nin kurucu ortaklarından Cem Dalgıç, startup'ların mutlaka bir çıkış planının olması gerektiği söyledi.
  • Devrim Demirel Blogcu.com'u Nokta A.Ş. nasıl sattığını, Ersan Özer de itiraf.com'u GittiGidiyor'a nasıl sattığını anlattı. Milyon dolarla ifade edilen rakamlar inanın başımı döndürmeye yetti.

    StartupPad


  • Kindo.com, Mekanist.net, Mülakat.Net ,TakasMerkezi.com, Wridea tanıtımları yapıldı.
  • Benim için günün en şok edici anı, Mekanist.net'in, yaklaşık bir sene önce karşılaştığım ve bunun yerli versiyonunu yapabilir miyim acaba diye düşündüğüm yelp.com'un yerli versiyonu olduğunu gördüğüm andı.
  • Sunday, June 1, 2008

    Barış Manço ve Cacık


    Çocukluğumdan beri severek dinlerim Barış Manço'yu. "Barış Manço ile 7'den 77'ye" programını her pazar izlerdik ailecek. Daha sonra "Adam Olacak Çocuk" ile çıktı karşımıza Barış Abi. Çok iyi hatırlıyorum, üniversitede hazırlık okuduğum zamanlarda, "Barış Manço Taksim Marmara Cafe'de cam kenarında oturuyor" diye bir haber geldi biz üniversite kantininde otururken. Yarım saatte Ortaköy'den Taksim'e uçtuk resmen. Baktik ki harbiden Barış Manço Marmara Cafe'de üst katta cam kenarında oturmuş birileriyle konuşuyor. Yarım saat boyunca The Marmara'nın karşısından izlemiştik Barış Abi'yi.

    Bu sabah "Sözüm Meclisten Dışarı" albümünden bir parçasını dinledim. Kendisini zaman zaman hıyar gibi hissedenler için bu parçanın sözlerini buradan paylaşmak istedim.

    Sözüm meclisten dışarı dostlar Söz-Müzik: Barış Manço
    CACIK 
    
    Bugünlerde kendimi hıyar gibi hissediyorum
    Hani dilim dilim doğrasalar beni
    Marmara Ege Karadeniz ve hatta Akdeniz cacık olur diyorum
    
    Derdim öylesine büyük ki dostlar
    Kırka yarıp yine kırka bölseler
    Ve kırk bostana gübre diye serpseler
    Kırkbin tane ot biter de kırkbin derde deva olur diyorum
    
    Ne oldu bana böyle durup dururken
    
    Oğlan aldı başını gitti kız zaten lafımı dinlemezdi
    Düğmem kopuk paçam sökük oramda buramda çengelli iğneler
    Bir de çengelli iğne nazar bozar derler
    
    Hanımın çorabı kaçık başında bigudiler
    Karabaş bile, karabaş bile suratıma bakıp bakıp havlıyor
    Öğünmek gibi olmasın ama dostlar
    Kendimi hıyar gibi hissediyorum
    
    Hani ince kıyım doğrasalar beni Akdeniz cacık olur diyorum
    
    Ve hatta Atlas okyanusu ve hatta Hint okyanusu
    Ve hatta hatta Büyük okyanus bile cacık olur diyorum
    Böyle cacığa rakı mı dayanır
    
    Çivi çiviyi söker derler soğuktan donanı buzla ovarlar
    Ben zaten yanmışım dostlar peki beni fırına mı koysalar
    Zeytin suyuna kuru ekmek böyle gelmiş böyle gidecek
    

    Saturday, May 31, 2008

    Python Sinema API'si

    Vizyondaki filmleri, şehirdeki salonları , filmlerin hangi salonda saat kaçta gösterildiğini bulmaya yarayan bir API yazmaya karar verdim. (Kardeşim ne derdin var durduk yere insan API yazmaya karar verir mi diyenleriniz olabilir. Neden böyle bir API'ye ihtiyaç duyduğumu ilerleyen yazılarda anlatacağım.) Filmler ile ilgili bilgileri, seçeceğim bir sinema sitesinden HTML ayıklama yöntemi (screen scraping) ile almaya karar verdim. Daha doğrusu bu şekilde yapmak zorunda kaldım çünkü delicious, flickr, digg gibi kullanıcılarına API desteği veren türkçe sinema sitesi bulamadım.

    Sinema sitelerini teker teker gezerken MyNet'in satın aldığı Beyazperde sitesi dikkatimi cekti.
    Beyazperde sitesi anlaşılabilir, temiz URL'ler kullanan ender türkçe sitelerden birisi. Ne demek istediğimi aşağıdaki URL'lere bakınca anlayabilirsiniz.
  • http://beyazperde.mynet.com/salon/10
  • http://beyazperde.mynet.com/film/3945
  • http://beyazperde.mynet.com/seanslar/3945/sehir/462
    Genelde sinemaya Mecidiyekö-Profilo AFM'de gidiyorum. Profilo AFM'nin Beyazperde'deki salon numarası 10 olduğu için gösterimdeki filmleri görmek için uzun uzun ana sayfaya git, şehir seç, salon seç işlemleri yapmıyorum. Firefox'ta adres çubuğuna http://beyazperde.mynet.com/salon/10 yazman AFM Profilo'da gösterimdeki filmlere erişmeme yetiyor.

    Beyazperde sitesindeki filmleri, salonları, seanslari html içerisinden ayıklayabilmek için BeautifulSoup html-xml parser'ını kullandım. BeautifulSoup'tan bu yazımda da bahsetmiştim. Ve ortaya sinema.py adresinden indirebileceğiniz basit bir sinema sever API'si çıktı.

    Örneklerle API'nin nasıl kullanıldığına bakalım.
    Vizyondaki filmleri listelemek için aşağıdaki örnekteki gibi vizyondakiFilmler fonksiyonu kullanılıyor.

    >>> import sinema
    >>> filmler=sinema.vizyondakiFilmler()
    >>> len(filmler)
    75
    >>> filmler.keys()
    [u'3922', u'3949', u'3920', u'3711', u'3808', u'3902', u'3835', u'3869', u'3941', u'3634',
    u'3867', u'3800', u'3946', u'3947', u'3916', u'3958', u'3956', u'3926', u'3734', u'2601',
    u'3910', u'3305', u'3911', u'3934', u'3948', u'2812', u'3964', u'3793', u'3845', u'1694',
    u'3855', u'3898', u'3918', u'3862', u'3978', u'3897', u'3805', u'3844', u'3780', u'3915',
    u'3873', u'3816', u'3847', u'3809', u'3833', u'3953', u'3952', u'3872', u'3950', u'3957',
    u'3930', u'3919', u'3945', u'3870', u'3936', u'3876', u'3932', u'3959', u'3885', u'3887',
    u'3837', u'3931', u'3883', u'3882', u'3612', u'3888', u'3871', u'3758', u'1683', u'3143',
    u'3962', u'3963', u'3960', u'3961', u'3825']
    >>> filmler['1694']
    u'Indiana Jones ve Kristal Kafatas\u0131 Krall\u0131'

    Seçilen filmin gösterimde olduğuşehirlerin listesi için filminGosterildigiSehirler fonksiyonu çağırılır.

    >>> sehirler=sinema.filminGosterildigiSehirler('1694')
    >>> sehirler
    {u'216': u'\u0130stanbul Anadolu', u'318': u'K\u0131r\u0131kkale', u'212': u'\u0130stanbul
    Avrupa', u'312': u'Ankara', u'452': u'Ordu', u'242': u'Antalya', u'454': u'Giresun', u'332':
    u'Konya', u'392': u'K\u0131br\u0131s', u'258': u'Denizli', u'252': u'Mu\u011fla', u'236':
    u'Manisa', u'256': u'Ayd\u0131n', u'232': u'\u0130zmir', u'248': u'Burdur', u'322': u'Adana',
    u'288': u'K\u0131rklareli', u'346': u'Sivas', u'326': u'Hatay', u'342': u'Gaziantep', u'422':
    u'Malatya', u'362': u'Samsun', u'284': u'Edirne', u'286': u'\xc7anakkale', u'324': u'Mersin',
    u'442': u'Erzurum', u'462': u'Trabzon', u'262': u'\u0130zmit', u'246': u'Isparta', u'266':
    u'Bal\u0131kesir', u'386': u'K\u0131r\u015fehir', u'264': u'Adapazar\u0131', u'226': u'Yalova',
    u'224': u'Bursa', u'222': u'Eski\u015fehir', u'282': u'Tekirda\u011f', u'272': u'Afyon', u'352':
    u'Kayseri', u'412': u'Diyarbak\u0131r', u'372': u'Zonguldak', u'374': u'Bolu'}
    >>> sehirler['212']
    u'\u0130stanbul Avrupa'

    Seçilen filmin şehirde hangi salonlarda gösterildiğini bulmak için sehirdekiSalonlar fonksiyonu kullanılıyor.

    >>> salonlar = sinema.sehirdekiSalonlar('1694','212')
    >>> salonlar
    [(u'1120', u'Adapazar\u0131 Cinebonus (Ada)', [u'11:00', u'12:15', u'13:30', u'15:00', u'16:15',
    u'17:45', u'19:00', u'20:30', u'21:45', u'23:15']), (u'1000', u'Akatlar Finansbank AFM
    Mayadrom', [u'11:15', u'13:45', u'16:15', u'18:45', u'21:15']), (u'1081', u'Bak\u0131rk\xf6y
    Cinebonus (Capacity)', [u'11:00', u'11:00', u'12:00', u'13:30', u'13:45', u'16:15', u'16:30',
    u'19:00', u'19:15', u'21:45', u'22:00', u'24:30', u'(Cuma, Cmts 24:45']), (u'1118',
    u'Beylikd\xfcz\xfc Cine Marka', [u'11:00', u'12:15', u'13:30', u'14:45', u'16:00', u'17:15',
    u'18:30', u'19:45', u'21:00', u'22:15']), (u'1082', u'Beylikd\xfcz\xfc Fox City', [u'11:30',
    u'14:00', u'16:30', u'19:00', u'21:30']), (u'1117', u'Esentepe Cinebonus (Astoria)', [u'11:00',
    u'12:15', u'13:30', u'14:45', u'16:15', u'17:30', u'19:00', u'20:15', u'21:45', u'(Cuma, Cmts
    23:0............

    >>> salonlar[11]
    (u'1067', u'\u0130stinye AFM Park', [u'10:50', u'11:30', u'12:25', u'13:55', u'14:15', u'15:30',
    u'17:00', u'17:15', u'18:30', u'19:00', u'20:00', u'21:30', u'21:50'])
    >>> salonlar[11][2]
    [u'10:50', u'11:30', u'12:25', u'13:55', u'14:15', u'15:30', u'17:00', u'17:15', u'18:30',
    u'19:00', u'20:00', u'21:30', u'21:50']

    Ve son olarak seçilen salonda gösterilen filmleri bulmak için salondakiFilmler fonksiyonu kullanılıyor.

    >>> filmler=sinema.salondakiFilmler('10')
    >>> filmler
    [(u'3945', u'88 Dakika', [u'11:50', u'14:20', u'16:50', u'19:30', u'21:50']), (u'1694', u'Indiana
    Jones ve Kristal Kafatas\u0131 Krall\u0131\u011f\u0131', [u'10:50', u'11:10', u'13:30', u'13:50',
    u'16:20', u'16:30', u'19:00', u'19:10', u'21:30', u'21:45']), (u'3964', u'O... \xc7ocuklar
    \u0131', [u'11:20', u'14:00', u'16:45', u'19:15', u'21:55']), (u'3949', u'\xd6l\xfcmc\xfcl
    Oyunlar', [u'11:30', u'14:10', u'16:40', u'19:20', u'22:00']), (u'3800', u'Sex and the City',
    [u'10:40', u'12:15', u'13:50', u'15:30', u'17:10', u'18:50', u'21:30', u'22:10', u'(Cuma, Cmts
    23:50'])]
    >>> filmler[0][1]
    u'88 Dakika'


    Söylemeden geçemeyeceğim python ile yazılan bu API dokumantasyonu ile beraber 100 satırı geçmiyor. Beyazperde sitesi gününbirinde html arayüzünde bir değişiklik yaparsa bu API'nin de güncellenmesi gerekiyor.

  •