12 Eylül 2014 Cuma

Django ile proje


Son yazımda size Django’nun kullanım amacı ve mantığı hakkında genel kültür kıvamında bir giriş yaptım. Bugün Django’da bir projenin nasıl oluşturulduğunu ve bu projenin içinde gerçekleşen komut trafiğinden bahsedeceğim. Bunlardan bahsederken Django’nun web için hazırlanmış  bir framework olduğunu bildiğinizi varsayacağım.
Öncelikle yapacağımız  web sayfasının amacını belirleyelim. Bizim basit bir amacımız olacak. O da kullanıcının girdiği yazıyı aynı sayfada listelemek olsun.
Ubuntu işletim sisteminde çalışmanızı öneririm çünkü burada gerekli paketleri daha kolay ve hızlı indirebilirsiniz. Ayrıca windows’tan çok daha dinamik bir yapıya sahiptir. Terminal aracılığı ile Python 2.7 için Django 1.5 versiyonunu kurduktan sonra yeni bir proje oluşturabiliriz.

$ django-admin startproject Proj

komutu ile ‘Proj’ isimli bir proje oluşturmuş oluyoruz.



Startproject komutu ile Django otomatik olarak manage.py ve projenin yapı taşlarını içeren dosya olmak üzere 2 yapı oluşturuyor. manage.py Django ile iletişime geçmenizi sağlayan komut aracıdır. Projenin yapı taşlarını içeren ve projemizin adını taşıyan dosyanın içeriğine baktığımızda 4 farklı Python uzantılı dosya görürüz. Bu dosyalardan 2’si bizi ilgilendiriyor.  settings.py ve urls.py. __init__.py  boş bir dosyadır. Bu dosyanın tek görevi Python'a bu dizinin bir Python paketi olduğunu bildirmektir. Bu dosyayla işimiz olmayacak şimdilik. urls.py,  tarayıcıya girilen URL’den hangi uygulamanın kullanacağını  gösteren haritaları içeren dosyadır. settings.py, projenin ayar ve konfigürasyonlarının yapıldığı dosyadır.
Projemizde görev alacak uygulamayı, yeni uygulama oluşturma komutu ile projemizin içinde oluşturabiliriz. Bir projede birden fazla uygulama yer alabilir. Uygulama oluşturduğumuz anda Django tekrar bize bir taslak oluşturur.


views.py uygulamalarımızı yazacağımız dosyadır. Burada kullanıcıdan request aldığınızda sayfadan gelecek cevap belirlenir. models.py dosyasını  veri tabanını oluşturmak, verilerimizi nasıl depolayacağımızı ve verilerin birbirleriyle olan ilişkilerini tanımlamak için kullanacağız. tests.py, yazdığınız uygulamayı test etmek üzere kullanılan fonksiyonları içeren dosyadır.
Projemizi oluşturmaya başlamadan önce ilk yapmamız gereken Django’ya oluşturduğumuz uygulamamızı ve  kullanacağımız veri tabanını  tanıtmak olacaktır. Bunu Proj/settings.py dosyasında bulunan INSTALLED_APPS bölümüne uygulamamızın adını ekleyerek yapabiliriz.


INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'App1',
)

Kullanacağımız veri tabanını tanıtmak için aynı dosya içinde DATABASES alanında ENGINE olarak sqlite3’ü eklememiz gerekir. Fakat veri tabanının ismini vermek yeterli değildir. Bilgisayardaki konumunu da bildirmek gerekir ki Django bunu nerede bulacağını bilsin. Konum bildirmenin en kolay yolu ‘’os’’ (Operating System) modülünden yararlanıp dosya konumuna ulaşmaktır. Bunu dosyanın en üst satırında aşağıdaki  işlemi gerçekleştirerek yapabiliriz.

import os
BASE_DIR=os.path.dirname(os.path.abspath(__file__))
DATABASE_PATH= os.path.join(BASE_DIR, 'db.sqlite3')

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': DATABASE_PATH,
    }
}






Ayarlarımızı yaptıktan sonra projemizi oluşturmaya başlayabiliriz. Normalde bizim dakikalarca ve bazen saatlerce yazdığımız kodları bilgisayar saniyeler içinde birbirleriyle ilişki kurarak çalıştırdığı için işlem sırası diye bir şeyden bahsetmemiz zor olur. Fakat bir kullanıcının istediği sayfaya gitmek için ilk yapması gereken şeyin tarayıcıya bir URL girmesi olduğunu biliyoruz. O zaman öncelikle kullanıcının hangi URL’yi girdiğinde bizim sayfamıza yönlendirileceğini tanımlayalım. URL’den bahsediyor olmamızdan anlaşılacağı gibi bunu projemizin altında bulunan urls.py dosyasında yapacağız.  Django projemizi oluşturduğumuz anda bize bir taslak oluşturmuştur. Burada tarayıcıya girilen URL’nin bize hangi uygulamayı çağıracağını ilişkilendireceğiz.  URL yi tanımlarken ‘düzenli ifadeler’ denilen  belirli kurallara uyan  yazıları belirleyen şablondan yararlanacağız. url(r’^$’, App1.views.search_gene’)  yazarak oluşturacağımız URL modelinde r- Python’a  tırnak arasındaki string verisini olduğu gibi okuması, herhangi bir karakteri anlamlandırmaması gerektiğini belirtiyor. Tırnak içerisindeki düzenli ifade ise ‘^’ işareti ile yazının başını ; ’$’ işareti ile de yazının sonunu belirtiyor. Yani yazının başı ve sonu arasında karakter olmayacak, boş karakter tanımlanmıştır. url() fonksiyonunun aldığı ikinci parametre çağıracağı uygulamadır. Burada App1 uygulaması altında yer alan views.py dosyasında tanımlanmış search_gene adındaki fonksiyonu hedef olarak gösteriyoruz.  urls.py’de haritamızı çizdikten sonra views.py dosyasında search_gene fonksiyonunu oluşturabiliriz. Faka bundan  önce uygulamada kullanacağımız veri modellerini oluşturmamız gerekir. App1 uygulaması altında yer alan models.py dosyasında kullanıcının aramasını yapabileceği bir TextField() alanı oluşturalım. Modellerimizi oluşturduktan sonra views.py sayfasına oluşturduğumuz bu sınıfı çağırıp kullanıcıdan aldığımız request sonrasında göndermek istediğimiz cevabı oluşturalım. urls.py sayfasında belirttiğimiz gibi  search_gene adındaki fonksiyonu oluşturalım. Bu fonksiyon “post “ metoduyla gelen sayfadan “gene_code” bölümüne girilen veriyi “genes” olarak adlandırdığımız değişkene atayacak. Daha sonra bu veriyi “home.html” template’i üzerinden “items” bölümüne koyarak cevap olarak geri çevirecek. Burada daha önce Django’ya tanıtmadığımız template dikkatinizi çekmiş olmalı. Oluşturduğumuz cevabı görselleştiren html dosyalarını template adındaki bir dosya içinde tutacağız.  Bu dosyayı App1 adındaki uygulamamızın içinde oluşturduktan sonra Django’ya template dosyasının yerini söylememiz gerekir. setting.py dosyasında  yer alan TEMPLATE_DIRS bölümünde dosya konumunu girebiliriz:

TEMPLATE_DIRS = ('/home/Proj/App1/template'
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

Cevap gönderirken kullanacağımız html dosyasında “POST” metodunu kullanan bir form yerleştirmemiz gerekir. Bu form, kullanıcıdan  “gene_code” adındaki bölme aracılığı ile veri alacağı için adı ’gene_code’ olan input alanı içermelidir. Cevap aşamasında kullanıcıdan alıdğımız veriyi ekrana yansıtmak için bu veriyi öncelikle “genes” adındaki değişkene atayıp home.html'de yer alan “items” a aktaracağız.
Bütün bunları yaparak  küçük projemizi oluşturmuş oluruz. Projemizi çalıştırmak için öncelikle terminal aracılığı ile models.py dosyasında tanımladığımız veri modellerini  senkronize etmemiz gerekir.

$ python manage.py syncdb

Komutu ile database’ i senkronize edebiliriz. Burada dikkat etmeniz gereken çok önemli bir nokta var. Modelleriniz bir kere oluşturduktan sonra burada yapacağınız değişiklikleri senkronize etmek pek mümkün olmuyor. Yaptığınız değişikliklerin Django tarafından algılanmasını istiyorsanız

$ python manage.py flush App1

komutu ile bütün veri tabanınızı resetleyip tekarar senkronize etmeniz gerekir. Bu komut kaydettiğiniz bütün verilerin silinmesine sebep olacaktır. Bu yüzden proje oluşturma aşamasında veri modellerinizi güzelce düşündükten sonra tanımlamanız daha verimli olacaktır.
Veritabanını senkronize ettikten sonra

$ python manage.py runserver

Komutu ile sunucumuzu çalıştırıp terminalde belirtilen linkten sayfamızı açabiliriz.

Django'nun çalışma mantığını daha iyi oturtabilmek için oluşturduğumuz projeyi elimden geldiğince görselleştirmeye çalıştım. Umarım yararlı olmuştur. Bir sonraki yazımda tekrar görüşmek üzere:)




8 Eylül 2014 Pazartesi

Django nedir?

Küçük bir aradan sonra tekrar merhaba. Geçen hafta size D3 ile veri görselleştirmeden bahsetmiştim. Bu hafta ise D3’ten biraz daha renksiz ve sıkıcı bir konudan bahsedeceğim. Bu sevgili korkunç Djangodur. Aslında Django insanları korkutmak için geliştirilmemiştir aksine web uygulaması geliştirme adımını kolaylaştırmak için geliştirilmiştir. Fakat bilinmeyene ani dalışlar  bundan önce nefret etmenize ve daha sonra içinde boğulup pes etmenize sebep olabilir. Bu yüzden her şeyden önce  Django’nun ne işe yaradığını anlamak gerekir ve bu sırada anlamadığımız, nasıl çalıştığını hayal edemediğimiz  her  terimi aratmaktan kaçınmamalı. O zaman başlayalım: Django nedir?  Django , Python’a ait web frameworkudur. Muhtemelen bu tanımda sadece framework nedir noktasına takılacaksınız. Fakat bundan önce çok daha önemli bir soru sormak gerekir. Web nedir? Bu her gün duyduğumuz ve kullandığımız web nasıl çalışır? Genellikle basit olduğunu düşündüğümüz terimleri beynimiz sorgulamadan atlayıverir fakat üstünde düşündüğümüz anda aslında bunu tam olarak bilmediğimiz ortaya çıkabilir. Web'in bunlardan biri olduğunu düşünüyorum.  Çoğu insanın web ve internetin aynı şeyler olduğunu düşünmesi de bunun küçük bir ıspatıdır. İnternet bilgisayarları birbirine bağlayan ağ(lar) sistemi iken Web(World Wide Web) internet ortamı üzerinden veriye ulaşma şeklidir. Web bu aşamada HTTP protokolünü  kullanıp veriyi  Chrome, Firefox (ve çaresizce Internet Explorer :P ) gibi tarayıcılarda görüntüler. Web tarayıcıları HTML (Hyper Text Markup Language) dili ile yazılmış olan sayfaları görüntülemek için kullanılan bilgisayar uygulamalarıdır.  HTTP,web tarayıcı ve sunucunun veri  transferinde kullandığı protokoldür. HTTP genel olarak 2 metot kullanır. GET ve POST.  GET belli bir kaynaktan veri isteğinde bulunur, POST ise belli bir kaynağa yönlendirilecek veriyi alır. Bu metotlar hakkında daha ayrıntılı bilgi için  w3scools sitesine ve  farklarını özetleyen şu videoya  göz atabilirsiniz.Bir uygulama yapmak için gerekli olan eklentileri size bir çatı altında toplayan yapıya framework denir. Django kullanmayı öğrenmek için bütün bu anlattıklarım içinde Django'nun nerede yer aldığını anlamak gerekir. Bu mikroskop kullanmaya benzer. İnceleyeceğiniz örneğe önce en küçük büyütme seviyesinde bakarak başlarsınız daha sonra adım adım seviyeyi arttırarak yakınlaşırsınız. Şimdi biz de Django'ya uzaktan bakıp adım adım ayrıntısına inelim.





Django, veri tabanı kullanan karmaşık web sitelerinin geliştirilmesinde kullanılır. İsmini caz gitaristi olan Django Reınhardt'tan almaktadır. Bu nedenle youtube'da 'Django tutorials' arattırdığınızda karşınıza sık sık gitar dersleri çıkabilir, yadırgamayın:) Django MVC (Model-View-Control) denilen bir yapıya sahiptir. Yani veri depolama modellerini ve ilişkilendirilmiş veri tabanını içeren sistem(models), gelen istekleri işleyen sistem (views) ve 'regular expressions' tabanlı URL yi dağıtan sistem arasında bağlantı kurmaktadır. Benim kaynak olarak kullandığım ve memnun kaldığım ortamları sizinle paylaşıp şimdilik yazımı sonlandırıyorum. Görüşmek üzere...

5 Eylül 2014 Cuma

D3 ile veri görselleştirme

Geçen hafta size stajda yaptığımız bir kaç Python programından bahsettim. Bu hafta Python’a biraz ara verip veri görselleştirmeye odaklandık. Derlediğiniz verinin dışardan bakan biri için anlaşılabilir kılınması en az veriyi derlemek kadar önemlidir. Veri görselleştirmeyi Javascript dilinin Data Driven Documents kütüphanesini kullanarak yapacağımız için Codecadamy ‘den Javascript derslerini bitirmek  iyi bir başlangıç olabilir. Javascript Python gibi object-oriented bir programlama dilidir fakat Javascript daha çok web programlama için kullanılmaktadır. Görselleştirme aşamasına geçmeden önce elimizdeki verileri  organize etmek çok önemlidir. Neleri nasıl bir ilişki ile göstermek istediğimizi iyice planlamamız ve sonucu veri kaybına uğramadan görselleştirmemiz gerekir. Bizim görselleştirmemiz istenilen veri 6 kişinin 2li kombinasyonlarla oynadığı tavla oyunu sonuçlarıydı. Bu sonuçları değerlendirirken göstermemiz gerekenler kimin en fazla puan aldığı, kimin kime yenildiği, kimin kimi yendiği ve kimin kimi mars ettiğidir. Burada ikili ilişkilerden bahsediyor olmamız bizim matriksten yararlanmamız gerektiği ipucunu veriyor. Sıfırdan görselleştirme kodu yazabilecek kadar zamanımız olmadığı için D3’un resmi sitesinde sergilenmiş olan grafik örneklerinden verimize uygun olanı seçip verimizi ona uyarlamamız gerekiyor. Fakat bu bile kulağa geldiği kadar kolay bir iş değildir. Çünkü verinizi hazır koda uyarlayabilmek için o kodu çözmeniz , nerede ne yapıldığını çok iyi anlamanız gerekir. Bunun için yine D3’ün sitesinde listelenmiş olan anlatımlara bakabilirsiniz. Aynı zamanda epey kullanışlı olduğunu düşündüğüm bir site de paylaşmak istiyorum sizinle. Runnable! Bu sitede Python, C++, Java gibi bir çok dilde kodunuzu yazıp çalıştırabilir ve daha sonar isterseniz paylaşabilirsiniz. Başkalarının yazdığı projelerin kodlarına ulaşıp inceleyebilir hatta bu kodlar üzerinde oynayıp nerede ne yapıldığını anlayabilirsiniz. Bizim tavla sonuçlarına geri dönersek bunları görselleştirmek için en iyi grafiğin “Chord Diagram” olduğuna karar verdik. Bunun kodunu bulup baştan sona satır satır  inceledikten sonara veriyi matriks olarak hazırlayıp koda uyarladım.  Daha sonra ayrıntılarına inip aşağıdaki grafiği elde ettim.





Grafikte şeritlerin uzunlukları oyuncuların toplam puanlarıyla paralellik göstermekte. Şeritleri birbirlerine bağlayan kordonların kalın uçları kazanan, ince uçları ise kaybedeni temsil etmektedir. Aynı zamanda kordonun kalınlığından oyuncunun 1 mi yoksa 2 puan mı kazandığı da anlaşılıyor.

Bugünlük veri görselleştirme hakkında yazacaklarım bu kadar. Bir sonraki yazımda size Django'dan bahsedeceğim. Görüşmek üzere:)

31 Ağustos 2014 Pazar

Biraz Pythonlama

İlk yazımda size stajımın birinci haftasında ısınma turları olarak yaptığım oyunlardan bahsettim. Bu hafta işler biraz daha ciddileşiyor ve Python için kollarımızı sıvıyoruz.( Eğer daha önce python kullanmadıysanız codecademy’de  python dersini bitirmek yararlı olur.)  For döngüleri, liste ve sözlük oluşturma, oluşturduğumuz bu dizilerden istediğimiz veriye ulaşabilmek gibi temel yapıları anlamak için bazı fonksiyonlar oluşturmamız istendi bu adımda. Bu fonksiyonlar sırasıyla şu görevleri yerine getirmeliydi: Verilen DNA dizisini 3 bazlık kodonlara ayırmak, kodon dizisinden protein sekansının eldesi, verilen DNA dizisinin intronlarını liste olarak verme, tüm genomu verilen organizmaların intronlarının belirlenmesi ve txt dosyası olarak verilmesi, verilen intron dizisinden olası 20 bazlık miRNA ların bulunması ve liste olarak verilmesi. Olası miRNAları, intron sekansı boyunca 20 bazlık dizinin çerçeve kaydırma yöntemiyle bulunması mümkündür. Bu aşamada fonksiyonları yazarken başvurduğum bazı  kolaylıklardan bahsetmek istiyorum. Liste ve sözlükleri oluştururken istediğim veriye ulaşıp ulaşmadığımı her adımda kontrol etmek, for döngüsünün farklı adımlarında print komutuyla döngünüzün tam olarak ne çevirdiğini, aldığınız hata kodlarını aratıp sebeplerini anlamak, büyük veriler ile çalışmadan önce verinizin bir parçasıyla fonksiyonlarınızı geliştirmek, aldığınız veri çıktılarını anlayabilmek için kodun belli yerlerinde kolay ayırt edilir işaretler printlemek beni  yazdığım kodun içinde kaybolmaktan uzak tutmuştur. Bu ve bunlar gibi gerçek problemlerle paralellik gösteren  fonksiyon örneklerini Rosalind sitesinde bulabilirsiniz. Orada aldığınız puanlar ve küçük ödüller de motive edici olabiliyorJ. Aynı zamanda yazdığınız çözümü forumdaki insanlarla paylaşıp, aynı problem için oluşturulabilecek daha kısa ve dinamik kod olup olmadığını da görebilir böylece kodunuzu gereksiz satırlardan kurtarabilirsiniz.

Yeni biyoinormatiğe giriş adımları için bir sonraki yazımda görüşmek üzereJ

Hello world!

Merhaba, benim adım Hana Kamer. Ege üniversitesi Biyokimya bölümü mezunuyum. İstanbul Teknik Üniversitesi Moleküler Biyoloji bölümünde yüksek lisans yapmaktayım. Uzun zamandır biyoinformatik alanına duyduğum ilgiyi nasıl adım adım hayata geçirdiğimden bahsedeceğim  size bu yazı dizisinde. Yararlı kitap isimleri, konuları basite indirgemiş video linkleri ve dersler ile kullanışlı bir ortam yaratmayı umuyorum.
Biyoinformatik alanına atılmak için attığım ilk adım yazılım kursuna gitmek oldu. Bu kursta HTML, CSS gibi web development araçları öğrenmenin yanı sıra basit görevleri yerine getirebilecek çok uzun olmayan programlar yazabilecek kadar C# dili öğrendim. Fakat bu bilgileri kullanmamak beni yavaş yavaş köreltmeye başlamıştı. Bu yüzden her şeye en baştan bu sefer ucunu bırakmamak üzere başlamaya karar verdim. Öğrendiklerimi gerçek projede kullanabilmek için kendime bir staj yeri aramaya başladım. Aramalarımın sonunda Türkiye’nin ilk biyoinformatik şirketi AG Biyoinformatik şirketinin kurucusu olan Ahmet Raşit Öztürk ile iletişime geçtim ve kendisi beni Kayseri’de bulunan Genom ve Kök Hücre Merkezinde staj yapmak için kabul etti.
Genkök’e geldiğim zaman staja daha erken başlamış olan eski stajyerler “Tuna” isimli bir proje üzerinde çalışıyordu. Yeni stajyerler olarak bu projeye dahil olmak için belli adımlardan geçmemiz gerekiyordu. Bunlardan ilki scratch* ortamında 3 oyun yapmaktı. (1. Bildiğimiz en basit tenis mantığı, top sağdan sola gidecek, iki taraftaki engel 2 oyuncuyu temsil edercesine farklı tuş gruplarıyla aşağı yukarı gidebilecek, top engele dokunamazsa oyun bitecek 2. Yukarıdan serbest düşme hareketi gerçekleştiren (burada serbest düşme hızının sabit olmadığını göz önünde bulundurmanız gerekir) topun aşağıda sepetle yakalanması, top sepete düştüğünde topun sepetle hareket etmesi. 3. DX ball ile aynı mantıkta bir oyun.) Bu oyunları yaparken bilgisayarın komut okuma sırasını, ilerde programlamada kullanılacak olan for, while gibi loopların çalışma prensibini görselleştirmiş oluyorsunuz böylece arkada yatan mantığı özümsemiş oluyorsunuz. Oyunda hareketleri, eşitlikleri, verileri vs gruplandırdıkları gibi bunların şekillerini kendilerine özgü yaptıkları için hangi komutları kullanmanız gerektiği konusunda bu şekillerin uyumunu ipucu olarak kullanabilirsiniz.
Bu günlük yazımı burada sonlandırıyorum. Stajımın ilerleyen günlerinde tekrar görüşmek üzere...


*http://scratch.mit.edu/ sitesini ziyaret edip basit bir scratch oyunu yapmayı sakın unutmayınJ Mutlaka diğer çılgın insanların bu basit gibi görünen ortamda nasıl muhteşem oyunlar yaptığına da göz atın. Eminim bir an için scratch-pro olmak için gaza geleceksenizJ