Yazılım Geliştirme etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Yazılım Geliştirme etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Android Uygulamalarında Performans İyileştirme

Android için yazılım geliştirirken uygulamanın gereksiz bellek harcamaması ve hızlı olması için uygulamayı bir kaç araç ile analiz edebilirsiniz.

Lint - Uygulamadaki potansiyel sorunları tespit edebilir.
Hierarchy Viewer - Uygulamadaki "view" hiyerarşisini gösterir; katmanları yönetmenize yardımcı olur.
Eclipse Memory Analyzer - En önemli araçlardan biridir. Bellek kullanımını gösterir. Ekranların Memory Leak hatası almasının önüne geçmek için kullanılabilir.

Diğer araçlar için bu kaynağa bakabilirsiniz.

ElasticSearch, Kibana ve Logstash ile Logging

Özgür yazılım günlerindeki konulardan biri log analizleriydi, ElasticSearch uygulaması üzerinde durmuşlar.. Dağınık haldeki logları toparlayıp sistemin durumunu anlayacağımız hale getirmeye yardımcı olacak güzel araçlar. Örnek kullanım için buraya bakabilirsiniz.


http://www.elasticsearch.org

OpenGrok Kaynak Kod Arama Motoru

Büyük yazılım projelerinin kaynak kodları içinde arama yapmak ve referans listesini görebilmek için kullanabileceğiniz bir arama motoru OpenGrok.

CCDL lisansına sahip özgür yazılımı proje sitesinden indirebilirsiniz.

Yazılım Geliştirme Firmalarında Kullanılan Yöntem ve Teknolojiler



Yazılım geliştirme süreçlerinin iyileştirilmesi için yapılan araştırmalar, uygulama geliştirmede tercih edilen yöntemlerin de değişmesini sağladı. Yazılım firmalarında çoğunlukla kullanılan yöntem ve teknolojileri şöyle özetleyebiliriz:

Çevik yazılım geliştirme yöntemlerinin kullanımı (Agile Methods).
Birim testleri yazma (Unit testing).
Sürekli Tümleştirme (Continuous Integration).
Parametre, koşul (condition), kural (rule) yapısına geçiş.
İş akışlarının tanımlanabilmesi.
Ekranların, istenilen alanlar ve akışına göre dinamik oluşumu.
Yazılım Yaşam Döngüsü(Application Lifecycle Management) kullanımı.
Bilgi Yönetimi (Knowledge Management) prensipleri ile kişiye bağımlılığı azaltma.
Kaliteli yazılım geliştirme çalışmaları.

OBEB için Özyinelemeli Öklid Algoritmaları

Bilinen en eski algoritmalardan biri, iki sayının OBEB(ortak bölenlerin en büyüğü)'ini bulan Öklid(Euclid) Algoritması'dır. MÖ 300 yılında Öklid'in bir kitabında geçtiği bilinmektedir. Öklid Algoritması şifrebilimin önemli algoritmalarından RSA Algoritması'nda, Diofant denklemlerinin (Diophantine Equations) çözümünde, sayılar kuramındaki bazı kuramların kanıtlanmasında kullanılmakta.
Ayrıca Genişletilmiş(Extended) Öklid Algoritması denilen algoritma ile sadece OBEB'i değil,  OBEB(a,b) = ax + by denklemindeki x ve y tam sayıları da bulunabiliyor.

Aldığım derslerden birinde 0 ile 2^64 -1 arasındaki pozitif tam sayılar için geçerli olacak şekilde bu algoritmaların kodunun yazılması ödev olarak verilmişti. C++ ile yazdım; ancak geç gönderdiğim için benim çözümler değerlendirilmedi. Ben de yazdığım kodları burada paylaşarak değerlendireyim dedim. İki algoritmanın özyinelemeli (recursive) biçimlerini aşağıda paylaşıyorum.

Özyinelemeli Öklid Algoritması 

Wikipedia'da Özyinelemeli Öklid Algoritması için verilen sözde kod(pseudocode) şu şekilde

function gcd(a, b)
    if b = 0
       return a
    else
       return gcd(b, a mod b)


Benim çözümüm şu şekilde:


...

typedef unsigned long long int PozitifTamSayi;

...  

//Oklid(a,b)
//Özyinelemeli Öklid Algoritması kullanarak OBEB bulma algoritması

 PozitifTamSayi Oklid(PozitifTamSayi a,PozitifTamSayi b)
{
    if (a == 0)
        return b;
    if (b == 0)
        return a;

    if (a > b)
        return Oklid(a % b, b);
    else
        return Oklid(a, b % a);

}  


Özyinelemeli Genişletilmiş Öklid Algoritması

Wikipedia'da Özyinelemeli Genişletilmiş Öklid Algoritması için verilen sözde kod(pseudocode) şu şekilde:

function extended_gcd(a, b)
    if b = 0
        return (1, 0)
    else
        (q, r) := divide (a, b)
        (s, t) := extended_gcd(b, r)
        return (t, s - q * t)

Benim çözümüm şu şekilde:


...
typedef long long int TamSayi; 
...

//GenisletilmisOklid(a,b)
//Özyinelemeli Genişletilmiş Öklid Algoritması kullanarak 
//ax + by = OBEB(a,b) şeklindeki denklemden OBEB, x ve y bulma algoritması
//işaretçi(dizi) döndürür

TamSayi* GenisletilmisOklid(TamSayi a, TamSayi b){
    TamSayi* sonuclar=new TamSayi[3];
    TamSayi q,r;
    if (b == 0)
    {
        sonuclar[0]=a;
        sonuclar[1] = 1;
        sonuclar[2]=0;
    }
    else
    {
        q = a/b;
        r = a%b;
        sonuclar= GenisletilmisOklid(b,r);
        int gecici= sonuclar[1] - sonuclar[2]*q;
        sonuclar[1] = sonuclar[2];
        sonuclar[2] = gecici;
    }

    return sonuclar;
} 



Kaynaklar
  • Wikipedia, Euclidean Algorithm, http://en.wikipedia.org/wiki/Euclidean_algorithm.
  •  Wikipedia, Extended Euclidean Algorithm,  http://en.wikipedia.org/wiki/Extended_Euclidean_algorithm.

Çevik Yazılım Geliştirme ve Scrum Deneyimleri


Altı ay kadar önce Çevik yazılım geliştirme metodolojisini, biraz kendimize uyarlayarak, uygulamaya başladık.

Scrum için, genel olarak benim düşüncelerim şöyle:


+Artıları
  • Önceki yöntemlere göre yazılım geliştirme işine daha uygun, çok şey bilmeyi beklemeden, hızlı başlayıp sadece ihtiyaç olan şeyleri geliştiriyoruz. Eskiden uzun analizlerde, sonradan kullanılmayacak özellikleri de ekliyorduk yazılıma, şimdi bu çok azaldı.
  • Ekibin işi sahiplenmesini sağlıyor, herkes kendi işinin farkında, takip etmesi gerekeni biliyor, ona göre de hesap soruluyor.
  • Herkesin her işle ilgili genel bir fikri oluyor.
  • Bir işe bitti diyebilmek takım psikolojisini olumlu etkiliyor, başarı hissi veriyor.
  • İletişimi çok arttırıyor, takım üyeleri de müşteri de sana daha yakın, daha samimi oluyor.
-Eksileri
  • Normalde herkes iş havuzundan kendi işini seçmeli, ancak kendi haline bırakınca işler zamanında bitemiyor, bu nedenle birbirine bağlı işlerde verilen süreye uyulamadığı oluyor. Böyle durumlarda önceliklendirme yapıyoruz. Gerekirse iş ataması yapıyoruz.
  • Farklı takımlar arasında scrum değerleri ölçüm metrikleri olarak kullanılırsa sorun oluyor. A takımının bir işe verdiği saat x iken B takımı 4x verebiliyor. Aynı takım içinde bu olmuyor ama takımlar arasında suistimale açık diyebiliriz.
  • Müşterinin de bu çalışma yapısına fikren hazır olması gerekiyor, aksi halde senin işini 2 hafta sonra değerlendirmeye alacağız demek anlayışla karşılanmayabiliyor.
Diğer

  • İşleri takibinin ve sorun çözümünün, ürünün sahibi sıfatında olan yöneticiden, scrum master’a ve takım liderlerine kaymasına neden oluyor.

Python ve Test Güdümlü Yazılım Geliştirme (TDD)

Python'dan bahsediyorum sürekli ya, kullanabiliyor musun derseniz o kadar aktif kullanmaya başladığımı söyleyemem. Yine de kullanmak isteyenlere yardımcı olmaya çalışıyorum bir taraftan (umarım olabiliyorumdur :) ). Bu yazıda da Python ile yazılım geliştirirken önce test yazmak sonra testlere göre kod yazmak isteyenler için ilk adımlardan söz etmek istiyorum.

(Başlamadan önce doctest ile birim test yazımı için şu adresi inceleyebilirsiniz)

Öncelikle Python'da test yazmak için kullanmanız gereken kütüphane Python ile birlikte geliyor, kütüphane unittest kütüphanesi. Oluşturacağımız test sınıflarını da unittest.TestCase sınıfını kalıtarak ("extend" ederek) yazıyoruz. Yazacağımız test_ ile başlayan metotlar da otomatik olarak çalıştırılacak test metotları olarak kabul ediliyor. setUp ve tearDown metotları da kullanamayacağınız isimlere sahip. Bu metotlar testler çalışmadan önce (setUp - kur) ayarlamayı ve testler bittikten sonra (tearDown - yık) ayarlamayı yapan metotlar. Bu metotların sadece self parametresi aldığını da belirttikten sonra ilk örneği yazalım:

import random
import unittest

class TestSequenceFunctions(unittest.TestCase):

    def setUp(self):
        self.seq = range(10)

    def test_shuffle(self):
        # make sure the shuffled sequence does not lose any elements
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, range(10))

        # should raise an exception for an immutable sequence
        self.assertRaises(TypeError, random.shuffle, (1,2,3))

    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

if __name__ == '__main__':
    unittest.main()


Sınamalarımızda kullanacağımız savlar ("assertion") JUnit kullananlara tanıdık gelecektir:

assertEqual(beklenenDeger, gercekDeger) metodu parametre olarak verdiğimiz beklediğimiz değerle, üretilen gerçek değerin eşit olup olmadığını sınar. Aynı şekilde kullanılan assertNotEqual(beklenenDeger, gercekDeger) metotu eşit olmama durumunu sınar. assertTrue(deyim) ve assertFalse(deyim) metotları parametre olarak verilen deyimin mantıksal sonucunun doğru (true) veya yanlış (false) olup olmadığını sınayan metotlardır. Bir de bir sınıfın belli bir sınıfın örneği olup olmadığını sınayan assertIsInstance(nesne,sınıf) metodu vardır.

Test durumlarını barındıran dosyaları test* kelimesiyle başlayacak şekilde kaydettiğimizde (örneğin test_tenis.py gibi)  python -m unittest discover komutuyla otomatik olarak bulunabilirler. Ayrıca python -m unittest test_tenis komutuyla dosya olarak çalıştırılabilirler. Tek bir test sınıfını veya metodunu çalıştırmak için de python -m test_tenis.DosyaIsmi, python -m test_tennis.DosyaIsmi.testSkor kullanımlarından yararlanılabilir.

Örnek olarak https://github.com/giorgiosironi/python-tdd-tutorial adresindeki kodlar incelenebilir.

Bu yazı için yararlandığım kaynak biraz daha ayrıntılı olarak kullanımı anlatmaktadır: http://css.dzone.com/articles/tdd-python-5-minutes

Bağlantılar:
http://powertwenty.com/kpd/downloads/TestDrivenDevelopmentInPython.pdf
http://onlamp.com/pub/a/python/2004/12/02/tdd_pyunit.html
http://www.blog.pythonlibrary.org/2011/03/09/python-102-an-intro-to-tdd-and-unittest/
http://www.slideshare.net/Siddhi/test-driven-development-with-python
http://dirtsimple.org/2005/02/making-it-from-scratch-with-tdd-and.html
http://www.givp.org/blog/2010/07/22/test-driven-development-how-do-i-start/

Sistem Kullanılabilirlik Ölçeği (System Usability Scale)

Bir sistemin kullanılabilirliği ISO 9241’in 11. bölümünde belirtildiği gibi; sistemi kimin, ne için ve hangi ortamda kullandığı gibi şartlar ve çevresel koşullar dikkate alınarak ölçülebilir.

Kullanılabilirlik üç başlıkta incelenir:

  • Etkililik : Kullanıcılar hedeflerine başarıyla ulaşabiliyorlar mı? 
  • Etkinlik : Hedeflere ulaşabilmek için ne kadar kaynak ve emek harcanıyor? 
  • Tatmin : Kullanıcı bu deneyimden tatminkar mı?


SUS, 10 soru ve bunlara verilecek 5 yanıt seçeneği ile gerçekleştirilir.

  • Bu sistemi sıklıkla kullanacağımı düşünüyorum. 
  • Sistemi gereksiz derecede karmaşık buluyorum. 
  • Sistemin kullanımının kolay olduğunu düşünüyorum. 
  • Sistemi kullanabilmem için teknik birinin desteğine ihtiyaç duyacağımı düşünüyorum. 
  • Sistemin gereksinimlerin birçoğunu çok iyi gerçekleştirdiğini düşünüyorum. 
  • Çok fazla tutarsızlık olduğunu düşünüyorum. 
  • Birçok kişinin bu sistemi kullanmayı kolayca öğreneceğini düşünüyorum. 
  • Sistemi çok hantal, ağır buldum. 
  • Sistemi kullanırken çok güvende hissettim. 
  • Bu sistemi kullanmaya başlamadan önce öğrenmem gereken çok şey var.

Yazılım Geliştirme Anahtar Performans Göstergeleri (KPIs)


Yazılım geliştirmede anahtar performans göstergeleri (KPIs - Key Performance Indicators)
1. Halstead Karmaşıklık ölçümleri ile kaynak kodun karmaşıklığının belirlenmesi.
2. Cyclomatic yazılım kodu karmaşıklığı.
3. Sistem Kullanılabilirlik Ölçeği (System Usability Scale).
4. Yazılım geliştirme kalitesi(Quality Assurance)
5. Gerçek ortam yazılım hata sayısı.
6. Kaynak kodun kaybolması (okunamama, karmaşıklaşma) sonucu uygulamayı yeniden tasarlama ve yazma zamanı yüzdesi (%).
7. Hata sayısının toplam kod satırı sayısına oranı.
8. Yazılım gereksinimlerinin yüzde (%) olarak gecikme oranı, zamanında belirlenememe.
9. Dış kaynak yazılım geliştirme yüzdesi (%).
10. Kritik hatanın toplam hataya oranı(%).
11. Sürüm için planlanan özellik sayısına karşın gerçekleşen özellik sayısı.
12. Yorumsuz checkin sayısı yüzdesi (%).
13. Hata düzeltme için harcanan zaman yüzdesi (%).
14. Testlerde bulunan hata sayısı.
15. Tekrar ortaya çıkan hata sayısı oranı (%)
16. Bir günde yazılan kod satır sayısı.
17. Tasarım süresinin geliştirme süresine oranı.
18. Yeni özellik eklenme oranı
19. En çok katkıda bulunan, en aktif takım üyesi

Yazılımda Kalite Güvencesi (Quality Assurance)


Fonksiyonel olmayan gereksinimler genellikle bir sistemin kalitesi olarak adlandırılır ve ikiye ayrılır:
  • Güvenlik ve kullanılabilirlik gibi çalışma zamanı göstergeleri.
  • Test edilebilirlik, bakım kolaylığı, genişleyebilirlik ve ölçeklenebilirlik gibi yapısal göstergeler. 
Fonksiyonel olmayan gereksinimlere örnekler:
  • Performans
  • Yanıt süresi
  • Kesintisiz çalışma 
  • Geri alınabilme
  • Güvenlik
  • Güvenilirlik
  • Yönetilebilirlik
  • Kullanılabilirlik
  • Birlikte çalışılabilirlik
Fonksiyonel Olmayan Gereksinim Testleri
  • Performans testi
  • Yanıt süresi testi
  • Kesintisiz çalışma testi
  • Geri alınabilme testi
  • Güvenlik testi
  • Kullanılabilirlik testi

Web üzerinde C#, PHP, Javascript geliştirme ve derleme

Web tarayıcısı üzerinde çalışabilen bir yazılım geliştirme ortamına ihtiyacınız olursa CodeRun 'ı kullanabilirsiniz. C#, JavaScript ve PHP desteği veriyor.

Tasarım Desenleri Hızlı Referans Kartı

Nesne yönelimli yazılım geliştirme dersini alan öğrenciler sık sık tasarım desenleriyle ilgili soru soruyor, daha önceden bulduğum hızlı referans kartını öneriyorum ama bağlantısın bulmakta zorlanıyorum. Burada da paylaşmak iyi olacaktır diye düşündüm. Dileyenler kartın PDF biçimini şuradan indirebilir. İsteyenler kaynak sayfasından farklı biçimlerini de inceleyebilirler.

Kaynak: http://www.mcdonaldland.info/?p=20

Sürüm kontrol sistemlerinin tarihçesi

Sürüm kontrolünün tarihini anlatan yazıda bulduğum aşağıdaki resim, sürüm kontrol sistemlerinin gelişimini özetliyor.

ProjectEuler.net

Yazılımseverlere; az biraz farklı kod yazayım dediğiniz zamanlar oluyorsa, projecteuler.net sitesini tavsiye ediyorum.

Çeşitlik zorluk derecesinde 300 den fazla soru içeren sitede matematik ile yazılımı birleştirip çözümler üreterek keyifli vakit geçirebilirsiniz.

Bilimsel Araştırma için Python - 10 Neden

Python'un önemli bir özelliği bir çok alanda rahatlıkla kullanılıyor olmasıdır. Python; GNU/Linux işletim sistemlerinde sistem ve betik kodlamada kullanıldığı gibi Matlab'ın yerine bilimsel araştırmalarda, deneylerde de kullanılabilen geniş bir uygulama alanı yelpazesine sahiptir.

Yeni gördüğüm bir yazıda, Python deneyimini bilimsel araştırmada 10 neden şeklinde yazıldığını görünce, bir Python "avukatı" olarak (belirteyim ki Oracle'ın Sun'ı satın alması, Google'a karşı Oracle hamleleri beni Java yerine alternatif olarak Python'u daha sık düşünmeye itiyor) yazıyı paylaşmam farz oldu. Yazıda aşağıda özetle verdiğim başlıkların ayrıntısına ulaşabilirsiniz.

1. Özgürlük: Python özgür yazılımdır. Açık kaynak koda sahiptir (özgür yazılım olmanın gereği). Windows, GNU/Linux, Mac OS vb. işletim sistemlerinde rahatça çalıştırılabilir.
2. Okunabilirlik: Python kodları yapısı gereği oldukça rahat okunabilen kodlardır. Söz dizimi tasarlanırken okunabilirlik ana amaçlardan biri olarak düşünülmüştür.
3. Belgelendirme sistemi: epydoc gibi araçlar ve doc string'ler sayesinde kodunuzu yazarken bir taraftan o kodun belgelendirmesi de yapılabilir.
4. Yüksek seviye - düşük seviye: Python'da yüksek seviyeli programlama ile düşük seviye programlama arasında bir denge kurulabilir. Farklı makine kodu üreten araçların yardımıyla neredeyse C kodu kadar hızlı çalışan Python kodu yazmak mümkün.
5. Standart kütüphane: Düzinelerce modül içeren oldukça kapsamlı standart kütüphanesi size gereken neredeyse çoğu şeyi sunmaktadır. Python'un bu konudaki felsefesi "piller dahildir" şeklindedir.
6. Bilimsel çalışma için üçüncü parti açık kaynak kütüphaneler: NumPy, SciPy (birlikte Matlab'ın çoğu işlevselliğini gerçekleştirirler), iPython (geliştirilmiş Python kabuğu - hata ayıklama, kod kesitlendirme vb. şeyleri sağlıyor), Cython - kütüphanelerle ilgili ayrıntılı bilgi için bağlantıyı ziyaret edebilirsiniz.
7. Veri yapıları: Python listeleri, tupleları, kümeleri, sözlükleri, karakter dizilerini, iş parçacığı güvenli kuyrukları, ve bir çok veri tipini destekliyor. NumPy ve SciPy'nin eklenmesiyle n-boyutlu dizi nesnesi (Matlab'ın matrislerinden daha fazla işlevselliğe sahip) desteği de kazandırılabiliyor.
8. Modül sistemi: Python kullandığı modüler programlama sayesinde kodun hiyerarşik bir yapıya kavuşmasını sağlıyor ve kodun tekrar kullanımı da artmış oluyor.
9. Proje ölçeklenebilirliği: Python hem küçük betikler hem de oldukça büyük projeler üretilmesine olanak sağlıyor. Pythonla 20 satırlık bir kod yazabileceğiniz gibi bir çok modülden oluşan ve bir çok modülü kullanan bir büyük proje de yazabilirsiniz.
10. Farklı paradigmaları destekleme: Python fonksiyonel, prosedürel, ve nesne yönelimli programlama paradigmaları arasında rahatlıkla geçiş yapmanızı sağlar.

Kaynak: http://www.stat.washington.edu/~hoytak/blog/whypython.html
Python öğrenmeye başlamak için: http://yzgrafik.ege.edu.tr/~tekrei/dersler/bbgd_p/

"Getting Started with UML" Referans Kartı

Öncelikle yazı seyrekliği için kusura bakmayın. İş, güç, yaşam, doktora, tez, makaleler. Zaman sıkıntısı var. Bir çok taslak bağlantı bekliyor paylaşılmak için, ama zaman yok. Yine de hızlıca bir paylaşımda bulunayım. DZone referans kartı olarak "Getting Started with UML" yayınlandı. İlgililere, başlamak isteyenlere, hatırlamak isteyenlere, referans kartı isteyenlere duyurulur.

SPARQL ve ARQ ile sorgu çalıştırma

Çalışmamızda bir Java uygulaması ile hazır bir ontoloji üzerinde sorgu çalıştırma yoluyla sonuca ulaşmayı hedefliyorduk. Çalıştıracağımız sorgu bir SPARQL sorgusu olacak ve Jena yardımı ile ontolojimiz içinden istediğimiz veriyi getirmeye çalışacaktı.

Bu amaçla öncelikle Jena SPARQL dökümanına bakmak yararlı olacaktır.

Jena SPARQL sorgularını işlemek üzere ARQ isimli bir kütüphane kullanıyor: ARQ dökümanı.


ARQ yardımı ile SPARQL sorgularına örnek olarak şu adreslere bakılabilir:
http://jena.sourceforge.net/ARQ/Tutorial/query1.html
http://www.ibm.com/developerworks/xml/library/j-sparql/

SPARQL ile sorgulama yapmak için örnek olarak aşağıdaki sorgu gibi bir sorgu hazırlayıp, yine aşağıda metodu çağırarak bu sorgunun sonucunu alabiliriz:

Q: which persons has same surname with "Ayder"

SPARQL:
PREFIX rdf: http://localhost/TestDocumentOntology.owl#
SELECT ?Result
WHERE { ?Person rdf:Surname ?Result .
FILTER regex(?Result, \"ayder\", \"i\" )}


import com.hp.hpl.jena.ontology.*;
import com.hp.hpl.jena.vocabulary.RDF;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.shared.ConfigException;
import com.hp.hpl.jena.shared.JenaException;

import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.shared.PrefixMapping;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import com.hp.hpl.jena.util.iterator.Filter;


static OntModel ontModel = null;
static final String inputFileName = "MyOntology.owl";

public static OntModel loadOntology(){
try{

ontModel = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM, null );

InputStream in = FileManager.get().open( inputFileName );
if (in == null) {
throw new IllegalArgumentException( "File: " + inputFileName + " not found");
}

// read the RDF/XML file
ontModel.read(in, "");

}
catch (JenaException jx) {
if (jx.getCause() instanceof NoRouteToHostException
|| jx.getCause() instanceof UnknownHostException
|| jx.getCause() instanceof ConnectException
|| jx.getCause() instanceof IOException) {
System.out.println("Cannot access public internet - content negotiation test not executed");
} else
throw jx;
}

catch(Exception e){
System.out.println(e.getMessage());
}

return ontModel;
}

public static ArrayList executeQuery( ArrayList queryList ){
ArrayList resultList = new ArrayList();
String key = null;

System.out.println("------------------------------------");

// Execute the query and obtain results
QueryExecution qe = null;//QueryExecutionFactory.create(query[0], model);
ResultSet results = null;//qe.execSelect();

//use alternative queries
for(int i= 0; i < queryList.size() ; i++)
{
qe = QueryExecutionFactory.create(queryList.get(i).toString(), ontModel);
results = qe.execSelect();

System.out.println("**********************");
System.out.println("query : " + queryList.get(i) );
System.out.println("**********************");

if(results.hasNext())
{
resultList.add(ResultSetFormatter.asText(results));
// Output query results
//ResultSetFormatter.out(System.out, results);
for (int k=0;k
System.out.println(resultList.get(k));
break;
}else
{
System.out.println("NO RESULT for the query " + i);
}
}


// Important - free up resources used running the query
qe.close();

return resultList;
}

Ontology Mapping

Yaptığımız çalışmada bir Java uygulaması ile hazır bir ontoloji üzerinde sorgu çalıştırma yoluyla sonuca ulaşmayı hedefleliyorduk. Üzerinde çalışabileceğimiz hazır bir ontolojimiz yoksa, bu projede yaptığımız gibi, Protege uygulamasını kullanarak kendi ontolojimizi oluşturabiliriz.

Ontolojimizi oluşturduktan sonra aşağıda örneği görülen kod parçası yardımı ile, java içinden bu ontolojiye ulaşabilir, içerdiği class, property ve individual değerlerini alabiliriz.

import com.hp.hpl.jena.ontology.*;

import com.hp.hpl.jena.vocabulary.RDF;

import com.hp.hpl.jena.rdf.model.*;

import com.hp.hpl.jena.util.FileManager;

import com.hp.hpl.jena.shared.ConfigException;

import com.hp.hpl.jena.shared.JenaException;

import com.hp.hpl.jena.query.*;

import com.hp.hpl.jena.shared.PrefixMapping;

import com.hp.hpl.jena.util.iterator.ExtendedIterator;

import com.hp.hpl.jena.util.iterator.Filter;

public class OntoMapper {

static OntModel ontModel = null;

static final String inputFileName = "MyOntology.owl";

static ArrayList classList = null;

static ArrayList propertyList = null;

static ArrayList rootClassesList = null;

static ArrayList individualList = null;

public static OntModel loadOntology(){

try{

ontModel = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM, null );

InputStream in = FileManager.get().open( inputFileName );

if (in == null) {

throw new IllegalArgumentException( "File: " + inputFileName + " not found");

}

// read the RDF/XML file

ontModel.read(in, "");

}

catch (JenaException jx) {

if (jx.getCause() instanceof NoRouteToHostException

|| jx.getCause() instanceof UnknownHostException

|| jx.getCause() instanceof ConnectException

|| jx.getCause() instanceof IOException) {

System.out.println("Cannot access public internet - content negotiation test not executed");

} else

throw jx;

}

catch(Exception e){

System.out.println(e.getMessage());

}

if(classList == null)

classList = new ArrayList();

if(propertyList == null)

propertyList = new ArrayList();

if(rootClassesList == null)

rootClassesList = new ArrayList();

if(individualList == null)

individualList = new ArrayList();

OntClass superCls = null;

OntClass cls = null;

Property prty = null;

for (Iterator i = ontModel.listClasses(); i.hasNext(); ) {

cls = (OntClass) i.next();

System.out.println( "Class " + cls.getURI() );

classList.add(cls.getURI());

for (Iterator k = cls.listSubClasses( true ); k.hasNext(); )

{

rootClassesList.add(cls.getURI());

break;

}

Iterator iter = ontModel.listIndividuals();

while(iter.hasNext()){

Individual c = (Individual)iter.next();

System.out.println( "Individual " + c.getLocalName() );

individualList.add(c.getLocalName());

cls = (OntClass) c.getOntClass();

superCls = cls.getSuperClass();

Iterator iterTables = c.listProperties();

while (iterTables.hasNext()){

Statement stmt = (Statement)iterTables.next();

//Resource r = (Resource)stmt.getObject();

prty = (Property)stmt.getPredicate();

if (superCls != null)

{

System.out.println( "Property getLocalName::: " + prty.getLocalName());

propertyList.add(prty.getLocalName());

}

else

{

System.out.println( "Property getLocalName::: " + prty.getLocalName());

propertyList.add(prty.getLocalName());

}

}

}

}



İlgili Kaynaklar:
http://protege.stanford.edu/

Generic Question Templates(GQT)

SPARQL dili ontoloji üzerinde arama yaparken “SPARQL triple” olarak bilinen üç anahtara dayalı olarak çalışır. Bu üç anahtarı {class}, {property} ve {value} olarak adlandırabiliriz. Value yerine {object} ve ya {criteria} da gelebilir.

Kullanıcı tarafından girilen soruları işlerken, öncelikle soru yapısını anlamaya çalışmalı; soru içinde bulunan kelimeleri, “SPARQL triple” oluşturacak şekilde ayıklamalıyız. Bir başka deyişle, sorunun içindeki class, property ve value değerlerini bulmalıyız.

Geliştirdiğimiz doğal dil işleme algoritması sonucu elde ettiğimiz veriyi, elimizdeki ontolojiyi dikkate alarak, önceden belirleyeceğimiz soru şablonlarına (Generic Question Template) uydurmaya çalışırız.

Soru şablonlarının öncelikle anahtar kelimelerimize göre belirleneceğini kabul ederek aşağıdaki gibi yapılar belirleriz:


/*** Question Templates
-Which {class} has the {property} with {value}
-Which {class} has the {property} with {criteria}
-Which {class} has the {property}
-Who is the {property} of {value}
-How many {class} are/has {property} by {value}
-When did {value} {property}
-What is the {property} of {value} {class}
-What is the {property} of {class} which has the {value}
*/

Buna göre herbir soru tipini karşılayabilecek ortak bir algortima ile girilen soruyu önceden belirlediğimiz bu soru şablonlarına uygun şekilde işlemek; şablonda varsa class, property ve value değerlerini bulmamız gerekir. Bu değerleri elde etmek için ontolojimiz içinde arama yapmak gerekecektir ki, bir sonraki başlıkta bunu göreceğiz.

Python öğrenme aracı: Acire

Python öğrenmek isteyenler için karşılaştığım bir yazıdaki aracı duyurmak isterim. İngilizce bir araç, ama belki de gönüllü biri Türkçe sürümünü de yapabilir. Acire için karşıma çıkaran yazıyı ve Jono Bacon'un ilgili duyurusunu okuyabilirsiniz.