Bilgisayar Bilimleri etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Bilgisayar Bilimleri etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

BM Dergi Yayında

Bilgisayar Mühendisleri Odası (BMO) tarafından BM Dergi tekrar yayınlanmaya başladı. Bilgisayar-Bilişim dünyasına ilişkin farklı konuları, farklı şekillerde ele alan yazılar barındırıyor.

Bitcoin, Sanal Ortam Para Birimi

Bitcoin yaratıcı ödeme ağı ve yeni bir para birimidir.

Bitcoin eşler arası teknolojiyi kullanarak ana otorite veya banka olmadan çalışır. İşlemlerin yönetimi ve bitcoinlerin dağıtımı toplu olarak ağ tarafından idare edilir. Bitcoin açık kaynaklıdır; tasarımı halka açıktır, kimse Bitcoin'e sahip değildir ve onu kontrol edemez, herkes katılabilir. Bitcoin kendine has birçok özelliği sayesinde diğer ödeme yollarıyla yapılamayacak çok farklı ödemelerin üstesinden gelebilir.

Bugün 1 bitcoin 200 USD civarında değere sahiptir. Kimileri bunun bir balon olduğunu, bu kadar değerli olmaması gerektiğini söylese de piyasalardaki olumsuz durum bitcoin in değerinin artmasına neden olmakta.

Kaynak:
http://bitcoin.org/tr/
http://en.wikipedia.org/wiki/Bitcoin

Bilgisayar Mühendisleri Odası

Ayrıntısıyla anlatmak gerekiyor mu bilmiyorum, ancak hızlıca haber vermek lazım. Belki de geç kaldı(k)m. Bilgisayar Mühendisleri Odası kuruldu. Genel kurulu da gerçekleştirildi, ilk dönemine seçilen kişilerle başlıyor. Bekleyenlere, ilgililere, meraklılara duyurulur :)

Çevrimiçi Bilgisayar Bilimleri Ders Siteleri

Son zamanlarda özellikle gözde amerikan üniversitelerinin artan bir yönelimle çevrimiçi derslere yoğunluk verdiğini gözlemliyorum. En çok bilinen MIT tarafından sunulan OpenCourseWare hizmetine doğrudan görüntülü, etkileşimli ders olanağı sunan yeni siteler de ekleniyor. Ben de özetle bunları bir paylaşayım dedim.

Bunlar gözüme çarpanlar. Ayrıca kapsamlı listeler incelenerek, sadece bilgisayar bilimleri değil bir çok alandaki çevrimiçi dersler de incelenebilir.

Güncelleme: TÜBA tarafından Açık Ders Malzemeleri de sunuluyor: http://www.acikders.org.tr/course/index.php

Bağlantılar
İngilizce
http://www.openculture.com/freeonlinecourses
http://www.openculture.com/2006/10/university_podc.html
http://oedb.org/library/beginning-online-learning/200-free-online-classes-to-learn-anything
http://education-portal.com/articles/Universities_with_the_Best_Free_Online_Courses.html
http://www.onlinecollegeclasses.com/
http://academicearth.org/
http://www.khanacademy.org/
http://ocwconsortium.org/
http://www.openscience.org/
Türkçe
http://yunusemre.anadolu.edu.tr/
http://www.megep.meb.gov.tr/mte_program_modul/
http://uzaktanegitim.meb.gov.tr:8050/
http://kursiyernet.meb.gov.tr/kursiyer/
http://internettv.meb.gov.tr/
http://www.acikders.org.tr/
Kitaplar-Kaynaklar

http://ebooksgo.org/
http://freescience.info/

Uzun Aradan Sonra

Çok uzun zamandır kodveus'a bir şey yazmıyordum. Yazamamamın  nedeni olarak "özel sebepler" deyip geçeyim. Aslında Mehmet ve Emre dışında pek yazanımız olmuyor bir süredir. Emre, askerde olunca ağırlık Mehmet'in üzerine kaldı. Sağ olsun O da elinden geleni yapıyor.
Bu uzun süre boyunca bilişim alanında birçok gelişme yaşandı. Aklımda kalanlar; internette filtre-sansür konusu, dünyadaki hareketlilikler içinde sosyal paylaşım sitelerinin rolü, Wikileaks, Bilgisayar Mühendisleri Odası kurulması çalışmaları, bilgisayar bilimleri alanından ölümler... Teknik gelişmeler her dönem çok hızlı şekilde oluyor zaten. Onları saymıyorum.
Elbette bu konular üzerine bu kadar zaman geçtikten sonra sadece bir iki laf etmek çok doğru değil. Bir şeyler söylenecekse ayrıntılı yazılmalı. Ama "bilgisayar alanında ölümler" konusuna değinmeden geçmek istemiyorum. Çünkü Steve Jobs ölümü üzerine hala bir şeyler söyleniyor, ilgili kitaplar satılıyor. Ama ben bilgisayar bilimleri alanından ölümler diye bahsederken Steve Jobs'ın ölümünün gölgesinde kalan iki ustadan söz ediyorum.  Elbette bilişim dünyasını yakından takip edenler diğer ölümleri de duydu. Ama genele yönelik haberlerde çok fazla altı çizilmedi. Oysa bilgisayar bilimleri alanına -bence- kesinlikle Steve Jobs'tan daha fazla katkıları olmuştu. Evet, C programlama dilinin ve Unix işletim sisteminin geliştiricilerinden Dennis Ritchie ve yapay zeka alanındaki çalışmaların öncüsü John McCarthy'den bahsediyorum.
 Ne yazık ki "ölü"ler bile eşitsizlikten payını alıyor, "ölüm"ler bile "kullanılabilirlik" açısından sınıflandırılıyor. Steve Jobs'ın hayatını herkese örnek olarak göstermek ve onu toplumun gözünde aklamaya çalışmak, bilimsel çalışmanın veya genel olarak üretimin ne için yapıldığını görmek açısından önemli. "Steve Jobs"lar yaptıklarıyla insanlar için model olarak dayatılırken, bilgisayar biliminin mihenk taşları olan bilimciler satır aralarında bırakılıyor. Yaşamda tek yol olarak zengin olmak ve bunun için her yolun mübah olduğu gösterilirken, insanlığa katkı koymanın yolu gizleniyor. Neyse, uzun süre sonra yazdığım bu yazıyla sizi daha fazla sıkmadan bu konuyla ilgili sözü Richard Stallman'a bırakayım:
...“Öldüğüne memnun değilim; ama gittiğine memnun oldum”. Kimse ölmek zorunda olmayı  hak etmiyor- Ne Jobs, ne Bay Bill, hatta onların yaptıklarından daha fazla kötülük yapmış insanlar bile. Ama hepimiz Jobs'ın, insanların bilgisayar kullanmasına olan kötü etkilerinin sonlanmasını hak ediyoruz. 

A* için yeni bağlantılar

Daha önce A* Java gerçekleştirimiyle ilgili bir bağlantı paylaşmıştım. Bugün ise A* yol bulma temellerini ve kodta nasıl kullanıldığını gösteren iki bağlantı paylaşıyorum. Ayrıca bu bağlantıların olduğu sitede, konuyla ilgili (A* ile ilgili) başka yazılar da var.

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/

Oracle plsql de ref cursor örneği

Ref cursor kullanarak ihtiyacımı olan veri kümesi üzerinde çalışmaya bir örnek:
declare
type rec_musteri is record(
musteriNo number(20),
musteriAd varchar2(50));

rcMusteri omwb_emulation.globalpkg.RCT1;
erMusteri rec_musteri;

v_MusteriNo number(20);

begin

open rcMusteri for
select musterino, musteriAd
from tbl_musteri m
where m.tcknNo = TO_CHAR('01234567890');
exception
when others then
v_Hata := sqlerrm;

if rcMusteri%isopen then
loop
v_MusteriNo := '';
fetch rcMusteri
into erMusteri;
exit when rcMusteri%notfound;
v_MusteriNo := erMusteri.musteriNo;
v_MusteriAd := erMusteri.musteriAd;
end loop;
end if;
end;

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.

Doğal Dil İşleme (Natural Language Processing) (NLP)

Amacımız "Bir web sayfasından doğal dil ile girilen soru cümlesini alarak, elimizdeki ontolojiye göre uygun yanıtı veren bir sistem" geliştirmekti. Önceden yapılmış çalışmalara örnek olarak aşağıdaki bağlantılardaki dökümanları inceleyebiliriz:

A Natural Language Query Interface to Structured Information

AquaLog An Ontology Portable Question Answering System

Ginseng projesi

Querying the Semantic Web with Ginseng

Querix A Natural Language Interface to Query Ontologies


İlk aşamada kullanıcının sorduğu soruyu içerdiği kelimelere göre işleyebilen bir algoritmaya ihtiyacımız olacak. Bu amaçla genel adıyla Natural Language Processing (NLP) olarak anılan ve dilin gramer yapısına göre değişiklik gösterebilen yöntemler kullanılabilir.

Biz basitçe cümleyi önceden belirlediğimiz anahtar kelimeleri arayarak ve geri kalan kelimeleri ontolojimiz içinde sorgulayarak sonuç döndüren bir yapı kurmaya çalışacağız. Öncelikle soru ya da cümle yapısını belirlememizi sağlayacak olan Kim, Kaç, Nerede, Ne zaman gibi anahtar kelimeleri ayırdetmemiz gerekir. Bu anahtar kelimeler, bağlaçlar v.s. dışında kalan kelimeler bizim için ontoloji içinde aranacak değerleri oluşturacaktır.


-->
if (question.toLowerCase().indexOf("what ") > -1)
questionType = "WHAT";
else if (question.toLowerCase().indexOf("which ") > -1)
questionType = "WHICH";
else if (question.toLowerCase().indexOf("who ") > -1)
questionType = "WHO";
else if (question.toLowerCase().indexOf("when ") > -1)
questionType = "WHEN";
else if (question.toLowerCase().indexOf("how many") > -1)
questionType = "HOWMANY";
//Look for max - min words
if (question.toLowerCase().indexOf(" max ") > -1)
checkMinMax = "MAX";
else if (question.toLowerCase().indexOf(" maximum ") > -1)
checkMinMax = "MAX";
else if (question.toLowerCase().indexOf(" min ") > -1)
checkMinMax = "MIN";
else if (question.toLowerCase().indexOf(" minimum ") > -1)
checkMinMax = "MIN";
//Look for has/is words
if (question.toLowerCase().indexOf(" has ") > -1 || question.toUpperCase().indexOf(" HAVE ") > -1)
checkHasIs = "HAS";
if (question.toLowerCase().indexOf(" is ") > -1)
checkHasIs = "IS";
if (question.toLowerCase().indexOf(" same ") > -1)
checkEquality = "YES";
if (question.toLowerCase().indexOf(" similar ") > -1)
checkEquality = "YES";

Örnek çalışmamızda soruların ingilizce sorulması isteniyordu. Soruyu kelime kelime incelerken anahtar olarak belirlediğimiz kelimeleri tarayıp, işimize yarayacak olanları aldıktan sonra temizleriz.


-->
temp = temp.replaceAll(" of ", " ");
temp = temp.replaceAll(" is ", " ");
temp = temp.replaceAll(" am ", " ");
temp = temp.replaceAll(" are ", " ");
temp = temp.replaceAll(" was ", " ");
temp = temp.replaceAll(" were ", " ");
temp = temp.replaceAll("who ", " ");
temp = temp.replaceAll("Who ", " ");
temp = temp.replaceAll("what ", " ");
temp = temp.replaceAll("when ", " ");
temp = temp.replaceAll("which ", " ");
temp = temp.replaceAll("how many", "");
temp = temp.replaceAll("how much", "");
temp = temp.replaceAll("many ", " ");
temp = temp.replaceAll("much ", " ");
temp = temp.replaceAll("why ", " ");
temp = temp.replaceAll("where ", " ");
temp = temp.replaceAll("has ", " ");
temp = temp.replaceAll("have ", " ");

Geriye kalan kelimeler bizim için veri sorgulamada kullanılacak değerler olacaktır.

OWL - Web Ontoloji Dili

Web Ontology Language (OWL), ontolojileri tanımlamak ve çeşitlemek için kullanılan bir dildir. Bir ontoloji, ilgili özellikler ve örnekleri ile birlikte sınıfların açıklamalarını içerebilir. OWL, bilginin içeriğini sadece insanlara gösteren değil, bunun yanında işleyen uygulamalar tarafından kullanılmak üzere tasarlanmıştır.OWL, XML, RDF, and RDF Schema (RDF-S) tarafından desteklenen web içeriğinin makinalar tarafından daha iyi yorumlanabilmesini, biçimsel bir semantik ile birlikte ek sözcük kümeleri sunarak kolaylaştırır.OWL, OIL ve DAML+OIL gibi eski dilleri temel alır, ve şu anda W3C tavsiyesidir.

OWL, Semantic Web'in gelecekteki uygulamaları için temel teknolojilerden biridir. Sayıca çok ve çeşitli alanlardaki uygulamalarda önemli bir rol oynamaktadır, ve araştırmalarını araçlara, uslamlama tekniklerine, biçimsel temellere ve dil eklentilerine odaklamıştır. (Kaynak)

İlgili bağlantılar:
Introduction to OWL

OWL Web Ontology Language

OWL Belgesi Hazırlama

A Practical Guide To Building OWL Ontologies Using The Protégé-OWL

Jena ve SPARQL ile owl / rdf ontoloji dosyaları üzerinde çalışmak

Ontolojiler ile ilgili çalışmalar yapılıyor ve pek çok döküman bulabiliyoruz. Buna karşın bu konu üzerinde araştırırken baştan sona bir referans bulamadım.

Basit bir Doğal dil işleyici(NLP) geliştirip, oluşturacağımız ontoloji ile ilgili sorulacak olan sorulara, bu ontoloji üzerinden SPARQL kullanarak yanıt verebilecek bir yazılım Hangi adımları hangi araçlarla gerçekleştirmemiz gerektiğini bulmak uzunca vakit aldı, Türkçe kaynakların azlığı da bir başka sorun...

Benzer çalışmalar yapacak arkadaşlara yardımcı olması açısından öğrendiklerimi adım adım yazmaya çalışacağım.

Geliştirmek istediğimiz yazılım en basit hali ile; “bir web sayfasından doğal dil ile girilen soru cümlesini alarak, elimizdeki ontolojiye göre uygun yanıtı veren bir sistem” olmalı.

Bu amaçla inceleyeceğimiz konular şöyle olacak:


  • OWL
  • Natural Language Processing(NLP)
  • Generic Question Templates(GQT)
  • Ontology Mapping
  • -Protege
  • SPARQL ve ARQ
  • -WordNet
  • Inference ve Reasoner
  • -Generic Rule Reasoner
    -Rule tanımlama, .rules dosyası

Yöneylem araştırması

4. sınıfta seçmeli ders olarak verilen yöneylem araştırması'nı, o günlerde kelime anlamı itibariyle bile anlamakta zorluk çektiğimden olsa gerek, seçme gereği duymamıştım. Bugün ise kaçınılmaz şekilde karşıma çıkmış durumda :)

Günlük hayatta doğrudan kullanılacağını düşünmüyorum ama karar verme yöntemlerinin matematiksel olarak modellenmesi üzerine uğraşan bu bilim dalını genel kültür olarak bilmek, ihtiyaç olduğunda kullanabilmemizi sağlayacaktır.

Yöneylem araştırması; belirli kısıtların olduğu bir durumda, belirli bir amaca yönelik en uygun çözümün bulunması için geliştirilmiş bir yöntemdir.

'Yöneylem Araştırması' deyimi ilk kez İkinci Dünya Savaşı'nda İngilizler tarafından kullanılmışsa da, temellerini oluşturan ilkel matematik programlama modelleri 1759'da Quesnay tarafından, 1874'de Walras tarafından geliştirilmiştir. Daha karmaşık ekonomik modeller 1937 de Von Neumann ve 1939'da Kantoravich tarafından ortaya atılmıştır.
Doğrusal modellerin matematiksel temelleri ise 1873'de Jordan, 1896'da Minkowski ve 1903'de Farkas tarafından atılmıştır. Dinamik modellerin ilk geliştirilmesi 1856-1922 arasında yaşamış olan Markov, Kuyruk kuramının ilk çalışmaları ise 1878-1929 arasında yaşayan Erlang tarafından yapılmıştır.

Sanayi devriminin gerçekleşmesinden sonra bu devrimi gerçekleştiren ülkelerdeki organizasyonların hacimlerinin büyüdüğü ve işlemlerin karmaşıklıklarının arttığı
gözlenmiştir. Artan karmaşıklık kaynakların organizasyonun yararına en etkin şekilde kullanımını güçleştirmiştir.Bu tür problemler ve bunlara çözüm arayışı Yöneylem araştırması gibi yeni bilim dallarının doğurmuştur. YA nın ilk uygulamaları yönetimde bilimsel yaklaşımların
kullanılması olarak gösterilmektedir; yönetim bilimi ve YA ile ilgili çalışmalar M.Ö. 212 yılına kadar uzanmaktadır.


YA nın Konusu : İnsan - Makina sistemlerinin tasarım , kuruluş ve işletiminde karşılaşılan problemleri belirlemek ve karar problemlerine optimum çözüm aramaktır.

YA nın yaklaşımı : Sistemi bütünüyle ele alarak farklı disiplinlerden oluşan ekiple bilimsel yöntemi izlemektir.

YA nın amacı : Yönetimin politika ve uygulamalarını bilmsel olarak belirlemesine yardımcı olmak, böylece yönetimle ilgili kararların tutarlılık ve uygulanabilirliğini
arttırmaktır.

YA Model Yaklaşımı

Bir YA çalışmasında kullanılan aşamaları aşağıdaki gibi verebiliriz:

1. Problemin formüle edilmesi.
2. Çalışılan sisteme ait matematik modelin kurulması.
3. Modelin çözümünün yapılması.
4. Modelin ve çıkarılan çözümün test edilmesi.
5. Çözüm üzerinde kontrollerin yapılması.
6. Çözümün gerçek hayata geçirilmesi.(uygulanması)


Kaynaklar:
[1] http://tr.wikipedia.org/wiki/Y%C3%B6neylem_ara%C5%9Ft%C4%B1rmas%C4%B1
[2] Yöneylem araştırması ders notları

Yazılım Mühendislerinin Bilmesi Gereken 10 Kavram

Yazılım mühendislerinin bilmesi gereken 10 kavram başlıklı bir yazı. Aşağıda yazdığım 10 kavramın yazılım mühendisleri tarafından bilinmesi gerektiği söyleniyor yazıda. Ayrıca yazıya yapılmış yorumlarda farklı kavramların da eklenmesi gerektiği önerilmiş. Yazının İngilizce olduğunu hatırlatırım.
  1. Arabirimler (Interface)
  2. Kurallar ve şablonlar
  3. Katmanlama
  4. Algoritma karmaşıklığı
  5. Hashing
  6. Önbellekleme
  7. Koşut zamanlılık (Concurrency)
  8. Bulut Hesaplama (Cloud Computing)
  9. Güvenlik
  10. İlişkisel Veritabanları

Bilişim Teknolojileri

Milli Eğitim Bakanlığı Mesleki Eğitim ve Öğretim Sisteminin Güçlendirilmesi Projesi kapsamında paylaşılan bilişim teknolojileri notlarına dileyenler bu adresten erişebilir. Hatta buradan ilginç konulara yönelik notlara da erişebilirsiniz :) Boş zaman bulduğumda ilgilendiğim bazı konuları inceleyebilirim.

Rastgele Sayı Üretme

Bir çok uygulaması olan rastgelelik için, programlarda rastgele sayı üreteçleri kullanılır. Rastgele sayı üreteçleri fiziksel veya yazılımsal bir cihaz olabilir. Fiziksel cihazlara örnek olarak para atma, rulet tekeri (diğer şans oyunları için), Zener diodlarındaki termal gürültü verilebilir. Gerçek anlamda rastgelelilik için özellikle Entropi kaynakları (radyoaktif bozulma, atmosferdeki radyo dalgaları gürültüsü)kullanılabiliyor.

Bilgisayarlara baktığımızda rastgelelik için Yalancı (Pseudo) Rastgele Sayı Üreteçleri dediğimiz algoritmalar kullanılıyor. Bu algoritmalar (PRNG) rastgelelik özelliği olan uzun sayılar oluşturur. En sık karşılaşılan bir PRNG Doğrusal Congruential üreticidir. Bu üretici sayıları üretmek için aşağıdaki tekrarı kullanır:

X_{n+1} = (a X_n + b)\, \textrm{mod}\, m


Kaynak:
Random Number Generation
Bir cevap

Tellico: Kolleksiyon Yönetimi Aracı

Bilgisayarımda Ubuntu'yu tek başına kullanmaya başladığımdan beri; bir çok sorunla karşılaşsam da(lafı gelmişken bu sorunlarının çoğunu çözmeme yardımcı olan Emre'ye teşekkürler :) ) neden GNU-Linux'a geçiş için bu kadar geç kaldığıma hayıflanır oldum. Çünkü daha önce Windows'ta bulamadığım veya crack, seri numarası ve benzer bir çok şeyle uğraştığım yazılımları özgür yazılım felsefesiyle daha kolay buluyor ve kullanabiliyorum.

Bunlardan biri de: Tellico. Kullanımı rahat ve gereksinimleri karşılayacak bir kütüphane programı yıllarca bulunacak veya kodlanacak listemdeydi. Paket yöneticisinde kısa bir aramadan sonra bulduğum Tellico'yu hemen yükleyebildim.

Bu sadece bir kitaplık programı değil; video, müzik, pul, bozuk para, kart, şarap koleksiyonlarının da oluşturulabildiği hatta kendi özel koleksiyonlarınızı yapabileceğiniz bir program.

Yeni girdi yaratın(Ctrl+N) diyerek seçilen kolleksiyon türüne özgü bilgi alanlarını doldurarak kayıt ekleyebiliyoruz.

Güzel bir tarafı Koleksiyon menüsünden koleksiyon alanları(Ctrl+U) kısmına giderek bu alanları düzenleyebilmek ve gerekirse yeni bir alan girmek. Bu alanların tipini; metin, paragraf, sayı, URL veya tablo olarak belirtebiliyor ve bu alanları gruplandırabiliyoruz.

Menünün altında sağ taraftaki kısım ile var olan kayıtlar arasında alan veya metin bazında filtreleme de yapabiliyoruz.


Çok hoşuma giden bir özellik de internet üzerinden veri kaynaklarına bağlanarak internet araması(Ctrl+M) ile arama yapmak ve bulunan girdiyi koleksiyonumuza ekleyebilmemiz. Ayarlar menüsü Tellico'yu yapılandır biriminden yeni veri kaynaklarını ekleyebilmeye de olanak sağlıyor. Örneğin imdb.com'a bağlanarak aradığımız bir filmi bulabiliyor ve koleksiyonumuza ekleyebiliriz.(Bakın; aşağıdaki resim)



Bütün bunlar özelliklerin bir kısmı; geniş bilgi için: Tellico Rehberi(İngilizce)