28 Mart 2013 Perşembe

Biyoinformatik Projelerinde Programlama - 4 (Bütünleştirme)

Nihayet serinin son yazısındayız :) Nicedir öğrenmek istediğim birkaç konuya eğildiğim ve tüm enerjimi de bu konulara sarfettiğim için yazmaya bir türlü odaklanamıyordum. Kaldığımız yerden devam edelim.

Önceki yazılarımda kişisel tecrübelerim doğrultusunda hangi aracın veya programlama dilinin ne tür problemler için daha uygun olduğundan bahsetmiştim. Bu yazıda da hepsini toparlayıp, nasıl tek bir uygulama çatısı altında birleştirilebileceğinden bir örnek üzerinden giderek bahsetmeye çalışacağım. Yalnız bu konuya geçmeden önce, deneyimim olmadığı için es geçtiğim Ruby'ye Yrd. Doç. Dr. +Omer Sinan Sarac'ın önerileri doğrultusunda değineceğim, kendisine katkısından ötürü çok teşekkür ediyorum :) Aşağıdaki paragrafı da tamamen verdiği bilgilerle hazırladım:

Ruby de Perl ve Python gibi bir programlama [veya scripting] dili; özellikle gelişmiş web entegrasyonu ve çok hızlı prototip geliştirmeye imkan vermesinden ötürü popüler bir dil. Ruby'nin diğer dillerden farklı olduğu noktaları basit bir Google aramasıyla bulabilirsiniz ancak Ruby'yi öğrenmek veya dile bir göz atmak için de şu iki link iyi bir başlangıç noktası olacaktır [kaynaklar İngilizce]: Ruby in Twenty Minutes ve Ruby From Other Languages.


Varolan farklı araçları bir araya uyumlu bir şekilde getirip tek parçaymış gibi düzenlemek asrımızın en büyük özelliklerin biri, ve bu denli hızlı teknolojik gelişmeyi de bu yaklaşımın yaygınlaşmasına borçluyuz diyebiliriz. Daha önce değindiğim programlama araçlarını seçmemin bir diğer nedeni de, birbirleriyle uyumlu bir şekilde kullanılabilmeleri; özellikle de gelişen web teknolojileri sayesinde. Bugün üzerinden gideceğim örnek, bir miRNA-Seq (miRNA Yeni Nesil Sekanslama) veri analizi gerçekleştirmek üzerine web tabanlı ancak sanki bir masaüstü uygulaması hissi veren bir uygulama geliştirmek. Bildiğim kadarıyla Türkiye'deki ilk miRNA-Seq veri analizini gerçekleştirdim ve bu doğrultuda edindiğim deneyimlerin bir kısmını sizinle bu örnek üzerinden paylaşacağım.

Oluşturacağımız analiz aracının platform-bağımsız (yani işletim sistemi veya donanım kısıtları olmadan) çalışabilmesi için elimizdeki en iyi seçenek, web tabanlı bir uygulama geliştirmek. Yani, arayüzü web teknolojileri kullanarak geliştirmek. Bunun için de, serinin 3. yazısında bahsettiğim JavaScript ve dolayısıyla da HTML araçlarını kullanıyoruz. Geliştirdiğim web aracı şöyle bir arayüze sahip: kullanıcının verilerini yüklemesine izin veren alan sol tarafta bir kutu içerisinde yer alıyor, hemen altında türün [species] seçilmesine yarayan bir aşağı açılan [drop down] menü var. Sağ tarafta ise çeşitli analiz araçları seçenekleri ve çıktının görüntüleneceği bir alan var. Ekran görüntüsünü koyarak çok daha güzel bir şekilde anlatabilirdim ancak bazı araklamacı-biliminsanlarımız beni tedirgin ediyor. Neyse, kullanıcı tüm bu işlemleri yaparken de sayfanın tamamının yeniden yüklenmesini istemiyoruz, sadece ilgili kısım güncellenmeli; zaten bu da bir web aracı hissindense bir masaüstü uygulaması hissini veriyor. Bu işin altından kalkan JavaScript ve AJAX kütüphanesi.

Dinamik, yani kullanıcının geliştireceğimiz web aracı ile etkileşime (bu kelime her yerde karşımıza çıkıyor) girmesine olanak veren bir uygulama geliştirmek için de, JavaScript ve HTML kodlarını o anda, kullanıcının isteğine göre şekillendirmemiz ve arkaplanda da o kullanıcıya özgü hale getirmemiz gerekiyor. Web teknolojilerinin hafızası yoktur; bu hafıza etkisini sizin oluşturmanız gerekiyor. Örneğin, web aracına ilk kez giren bir kullanıcıya bir kimlik tanımlayıp (genel olarak, o anki zaman temelli ayırt edici bir özellik) her işleminde de bu kimliği ek olarak arkaplanda sürekli taşımanız bu hafıza etkisini verebilirsiniz. Bu kodları otomatik olarak hazırlayabilmek için serinin 1. yazısında bahsettiğim Perl dilini kullanıyoruz. Böylece bir programlama dilini (HTML + JavaScript), başka bir programlama dili (Perl) vasıtasıyla kullanmış oluyoruz. Yani, arkaplanda metin tabanları işleri yapacak olan ve işin görünmeyen tarafındaki entegrasyonu Perl sağlıyor. 

Gelelim gerçekleştirilen analizlere. Serinin 2. yazısında bahsettiğimiz araçları analizler için rahatlıkla kullanabiliriz ancak buradaki temel sıkıntı, bu araçların istediği şekilde verileri dönüştürmek (örneğin, tab (~8 boşluk) karakteriyle ayrılmış hücrelerden oluşan bir veriyi virgülle ayrılmış hale getirmek, bazı sütunlara rakamlar eklemek veya tüm harflerin/karakterlerin büyük harfle gösterilmesini sağlamak, gibi.). Bu tarz şeyleri hesaplama araçlarıyla gerçekleştirebiliriz ancak yine bu noktada Perl veya Python tarzı bu işler için dünyaya getirilmiş araçları kullanmak çok daha pratik. Web altyapısını geliştirirken kullandığımız Perl ile bu tarz metin işlemlerini de geliştirip, veriyi başka bir araçta kullanılabilmek üzere hazır hale getiriyoruz. Detay vermekten kaçınıyorum yukarıda bahsettiğim sebepten ötürü, ancak ufak bir işlev olarak işlenmiş verilerin normalize edilmesi (birbiriyle kıyaslanabilir hale getirilmesi) ve ardından da bir grafikle gösterilmesini ele alalım. Burada da, dönüştürdüğümüz verileri R'da daha önce yazdığımız bir fonksiyon grubuna Perl içerisinden sunuyoruz ve yine elde edilen verileri ve şekilleri de Perl'e geri alıyoruz. Perl R ile rahatlıkla iletişime geçebildiği ve R'ın çalışmasını kontrol edebildiği için böyle bir şeyi gerçekleştirebilmek mümkün ve ayrıca işimizi de fazlasıyla kolaylaştırıyor.  Bu yaklaşımı, web aracımıza basit manada bir paralel işleme kaabiliyeti kazandırmak için de kullanabiliriz. R'da hazırlayıp Perl'e entegre ettiğimiz şekilleri de JavaScript vasıtasıyla analiz biter bitmez kullanıcının ekranına kusursuz bir şekilde sunabiliriz. Böylece kullanıcı, arkaplanda çalışan bir çok teknolojiden habersiz olarak, her şeyin tek bir sistem tarafından geliştirildiğini hissedecektir.


Yukarıda anlattığım süreçler size karışık geliyorsa, bir de şöyle düşünmenizi öneririm: bir Lego seti düşünün; buradaki her bir parça grubu, bizim programlama araçlarımıza denk gelsin. İlk parça grubu, 4 tekerleğin de üzerinde takılı olduğu bir iskelet; istendiğinde de diğer oyuncak araba parçalarının üzerine bir şekilde monte edilmesine izin veriyor; bizim için Perl dili bu benzetmeye uygun. İkinci parça grubu ise motoru oluşturuyor; yani bizim durumumuzda, analizleri gerçekleştiren kısım, R. Son olarak, 3. parça grubuyla da oyuncağın kaportası, yani dışarıdan görünen kısmı elimizde mevcut; bu da HTML + JavaScript. Yaptığımız şey de yaklaşık olarak şu: iskeleti (Perl) alıp diğer parçaların da üzerine kusursuz bir şekilde eklenebilmesi için bazı parçalar ekliyoruz. Arkaplanda gerçekleşen ve kullanıcının görmediği analiz işlemleri de motora (R) benziyor; bunu da varolan iskelete uygun bir şekilde yerleştiriyoruz. Ardından, elimizdeki parçaların tam bir arabaya benzemesi için kaporta parçalarını (HTML + JavaScript) üzerine güzel bir şekilde monte ediyoruz; arada kalan boşlukları veya uyumsuzlukları da ufak tefek değişiklikler  yaparak (fonksiyonlar yazarak) düzeltiyoruz. Eğer temiz bir işçilik de yapmışsak, elimizde bir motoru olan ve gerçekçi bir görünüme sahip olan bir oyuncak araba var. Önemli olan, hangi parça grubunun ne işe yaradığını ve hangi diğer parça gruplarıyla uygun bir şekilde kullanılabileceğini bilmek ve tam uyum sağlamak için de ufak ama etkili değişiklikler yapmak.


Sözün özü:
Bir uygulamayı sadece tek bir araç kullanarak geliştirmektense, birbirinden farklı birçok programlama aracının en iyi yönlerini alarak bir araya getirmek daha hızlı, daha etkin ve daha kullanışlı araçlar geliştirebilmemizi sağlar. 



Proje:
Basit bir HTML dosyası oluşturup içerisine de R'da çizdirdiğimiz basit bir şekil koyalım. Bu HTML sayfasını da, herhangi bir sunucuya gerek olmadan tamamen Perl'de ilgili kodları yazarak oluşturalım ve R'da şekil çizdirme ve/veya bu şekli HTML dosyasında görüntüleme işini de yine Perl'de gerçekleştirelim. Toplamda en fazla 10-12 satırlık Perl ve R koduyla böyle bir HTML dosyasını oluşturabilirsiniz.

Meraklısına:
Farklı programlama araçlarının entegrasyonu üzerine çok güzel yazılmış ve örnek uygulamaların yer aldığı birçok İngilizce kitap mevcut; Ankara'daysanız ODTÜ ve Bilkent'in kütüphanelerinde geçirmek üzere birkaç saatinizi ayırmanızı şiddetle öneririm.