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

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.

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.

Birinci, İkinci ve Üçüncü Dünya

Çokça duyduğumuz "Üçüncü dünya ülkeleri" sözü nerden çıkmış? Üçüncü dünya ülkesi denildiğinde, dünyadaki fakir ülkelerden söz ediliyormuş gibi bir algı oluşuyor; o halde birinci ve ikinci dünya ülkeleri de kim oluyor?

Aslında soğuk savaş döneminden kalma bu ayrım ülkelerin politik duruşları sonucu oluşmuş.

Birinci Dünya: Amerika eksenli Demokratik-Sanayileşmiş ülkeler
İkinci Dünya: Komünist-Sosyalist doğu bloğu ülkeleri
Üçüncü Dünya: Bu iki kutupta yer almayan ülkeler

Bunların yanında birde 1970 lerde ortaya alıtmış olan Dördüncü dünya ülkeleri var ki bunlar da yeteri kadar tanınmayan yerli halklar veya kültürel topluluklar olarak tanımlanıyor.




Kaynak: http://www.nationsonline.org/oneworld/third_world_countries.htm

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/

Ege Üniversitesi Java Günü

Ege Üniversitesi'nde Java günü düzenleniyor. İlgililere duyurulur.

Kaynak: http://www.ceturk.com/event/ceturk-ege-universitesi-java-gunu

Bugüne kadar çok farklı konu ve teknoloji ile ilgili yaptığı ücretsiz etkinliklerle bilişim sektörünün gelişmesine katkıda bulunan CETURK etkinliklerine devam ediyor. Ege Üniversitesi Bilgisayar Mühendisliği Bölümü’nün katkılarıyla 6 Kasım 2010 Tarihinde “CETURK – Ege Üniversitesi Java Günü” gerçekleştirilecek. Bu etkinliğin düzenlenmesinde büyük emeği geçen Ege Üniversitesi Bilgisayar Mühendisliği Bölümü Öğrencisi Nermin Canik arkadaşımıza çok teşekkür ediyoruz. Etkinliğe katılım her zamanki gibi ücretsiz olacak. Ayrıca her zaman olduğu gibi etkinliğe katılan kişilere çekiliş ile kitap hediye edilecek. Etkinliğe katılamayanlar için video kaydı alınarak CETURK.TV ‘de yayınlanacak.
Etkinliğe katılmak için lütfen Facebook Etkinlik Sayfamızda katılacağınızı belirtiniz.
CETURK Facebook Sayfası: www.facebook.com/ceturk
Etkinlik Sayfası için tıklayınız.
Etkinlik Programı
SaatKonuKonuşmacı
10:00-10:15Açılış KonuşmasıEge Üniversitesi Bilgisayar Mühendisliği
10:15-10:30CETURKMehmet ACA
10:30-11:45Veritabanı Temel Kavramları ve ORACLE Veritabanına Genel BakışTalip Hakan ÖZTÜRK
11:45-12:00Ara
12:00-13:15Java Distributed CacheTalip ÖZTÜRK
13:15-14:15Öğlen Arası
14:15-15:30Java Geliştiricileri için Kullanışlı AraçlarOkan KAHRAMAN
15:30-15:45Ara
15:45-17:00Eclipse – İhtiyacınız Olan Tek IDEMustafa DEMİR
17:15-17:30Ara
17:30-18:00Panel – Java , Oracle ve KariyerTüm Konuşmacılar
18:00-18:15Kitap Çekilişi

"Have it your way"

Bilmeyenler için Burger King'in sloganı bu. Daha önce bir şeyler karalamak istiyordum bu sloganla ilgili. "Özgür" dünyamızda size özgürlüğü sunan bu şirketle ilgili. Gurbet ellerde ürünlerini yemek zorunda kaldığım bu şirketle ilgili. Ancak geciktim yazmakta ve haber düştü ortama: Burger King ve Maret skandalı: Kapitalizm sağlığa zararlıdır
Sloganın hakkını veriyorlar. Kendi yollarını oluşturmuşlar. Yüzleri asık, yorgun, bezmiş çalışanlar, sadece vardiya doldurmaya çalışıyorlar. Arkada, mutfakta performanslarını belirleyen "D+" işareti göze çarpıyor. Herşeyin performansa göre değerlendirildiği günümüzden bir işaret. Yabancılaşma ve makineleşme haddinden çok. Çalışanlar işlerine yabancılaşmış, performanslarını arttırmak için de makineleşmiş. Bir de Avrupa'daki bu çalışanlar için etnik bir tespit yapalım. Bu tip yerlerde, özellikle büyükşehirlerde çalışanlar hep buraların ezilmişlerinden. Siyahlar, Hintliler, Türkler, Araplar,... Gerçi ezilenlerdenseniz her şirkette, her fabrikada, her çalışma ortamında yaşadıklarınız aynı...

Özel Mülk Lisanslar Göründüğünden Daha Kötü

Özel mülk yazılım firmalarının yapabileceği oldukça fazla kötü şey var. Firmalar kendi karlarını kullanıcıların hak ve özgürlüklerinin üzerinde tutuyor, ve kullanıcıları kendilerine tabi kılmak için ellerinden geleni yapıyorlar.
Her ne kadar özel mülk yazılımlardan kaçınan biri olsam da, özel mülk yazılım lisanslarını okumaktan vazgeçmedim (genellikle ne kadar kötü olduklarını görmek için). Kullanıcılar üzerinde uyguladıkları korkunç engellere karşı duygusuzlaştığımı söyleyebilirim. Ama, bazen özel mülk lisanslar o kadar abartıyor ki, anlamsız vahşilikleriyle şaşkınlığım geri geliyor.
Apple'ın lisansları, mantığın ötesinde lisans şartlarına sahip özel mülk lisanslarına verilebilecek en kolay örneklerdir. Apple lisansları klasik özel mülk lisanslar gibi kullanıcıya yazılımı kopyalamayı, değiştirmeyi, paylaşmayı, ve ters mühendisliği yasaklıyor, ama daha kötüsü Apple lisansları kullanıcının yazılımlarını Apple tarafından üretilmemiş donanımlarda çalıştırmasını da yasaklıyor.
Kişisel bilgisayar devrimi diyebileceğimiz yazılımın donanımdan (marka bağımlılığından) ayıran büyük yenilikte ironik bir şekilde Apple'ın da bir rolü vardır. Bilgisayar tarihi bize gösterdi ki, yazılım firması donanımınızı da kontrol ettiğinde sizi öyle bir "bağımlı hale" getiriyor ki, bugün sıradan özel mülk yazılım lisanslarının yaptığını bir hiç haline getiriyor.
Doğrusu, Apple başarılı abartma aldatmacalarıyla bazı kullanıcılarını kısıtlayıcı politikalarının hesaplamayı daha iyi yaptığına ikna etmiştir. Bu dünya görüşünde, ataerkil satıcı özel mülk kontrollerini teknoloji üzerinde elinden geldiğince kullanarak "çocuk" kullanıcılarını "kendileri için kötü" birşey yapmaktan alıkoyacaktır. Bu noktada Tron'daki gaddar MCP ("Master Control Program" - Ana Kontrol Programı) akla gelmektedir.
Beni şaşırtan bir başka şey, bir çok özgür yazılım destekçisinin kesinlikle kabul edilemez politikalara rağmen OSX kullanmakta ve Apple ürünlerini almakta bir sakınca görmemesidir. En korkunç tarafı bu uygulamanın sadece Apple firmasıyla sınırlı olmamasıdır. Yakın bir zamanda IBM gibi firmaların da aynı şeyi yaptığı bana hatırlatıldı. Bir özgür yazılım savunucusu olarak, özel mülk yazılım lisanslarını kendi ürettikleri donanımı kullanmayı dayatmak için kullanan tüm firmalara karşı eleştirel yaklaşırım. Sıradan özel mülk yazılımları kullanmak yeterince kötüyken, Apple ve IBM gibi firmaların kullanıcılarına daha da kötü davranmak için bu lisansları kullanması en basit ifadesiyle şansızlıktır.

"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.

Bugünlerde...

Uzun bir ara verdik yazmaya. Blogumuzun yazarları aynı zaman dilimlerinde çok yoğun ve farklı dönemler yaşıyor. Her birimiz bir yana dağılmış, bir yandan çoğunlukla gereksiz, yararsız işlerle uğraşıyor; diğer yandan hayatlarımızla ilgili seçimler ve yol ayrımları yaşıyoruz.

Bu aralar iş dışında yaptığım tek şey doğduğum şehir, Antakya hakkında araştırma yapmak. Bulduğum bilgileri toparlayınca paylaşacağım.

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.

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.

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ı

Almanya ve Avrupa'da GPL'in Durumu

Bir çok mahkeme kararıyla GPL'in lisans şartları başarılı bir şekilde mecburi hale getirildi. Özellikle gömülü sistemler alanı bu tip uygunluk etkinlikleri için odak noktasında. GPL ihlallerine yönelik mahkemelerde de GPL'in şartlarını sağlama zorunluluğu çıkıyor. Bu nedenle Almanya ve Avrupa'da GPL uyumlu ürünlerin sayısı artıyor. Konuyla ilgili ayrıntılı bir makaleye Groklaw - Enforcement of the GNU GPL in Germany and Europe, by Till Jaeger adresinden ulaşabilirsiniz.

Cahit Arf Yazılımı

Cahir Arf ismini bilenler başlığa biraz şaşırabilir. Cahit Arf bir matematikçi, bilgisayar dünyasıyla ne ilgisi olabilir denilebilir. Başka Cahit Arf mı var? diye sorulabilir. Yok, hani 10 liraların arkasında gördüğümüz Cahit Arf'ten bahsediyorum. Yani kendi adıyla anılan matematik terimleri, kuramları olan dünyaca tanınan matematikçi Cahit Arf'ten.
Gerçekten de Cahit Arf adında bir yazılım var. Weka adlı veri madenciliği yazılımı için ilişkisel veri tabanlarından ve ARFF dosyalarından veri çıkarılmasına yardımcı oluyor bu yazılım. LGPL lisansıyla yazılan bu yazılıma neden Cahit Arf  adı verildiğini bilmiyorum; ama hoşuma gitti.

OpenOffice Writer'da Bağlantılı Dizin Oluşturma

Birçok kişi rapor, tez vb. hazırlarken belgenin içindekiler veya kaynaklar kısmını oluşturmak için zorlanmıştır. En azından ben birçok kere zorlandım. Ofis yazılımlarının bunu otomatik olarak yapabildiğini öğrendiğimde çok sevinmiştim. Çünkü başlıkları bulup bunları alt alta yazmaya çalışıyordum içindekiler bölümünü oluşturmak için. Bu yüzden birçok kişi bu yazılımların otomatik dizin oluşturma özelliğini zaten kullanıyordur; ama yine de en azından benim gibi bu konuda muzdarip olanlar için paylaşayım dedim.
OpenOffice Writer'da içindekiler bölümünü oluşturmak için öncelikle dikkat edilmesi gereken başlıkların biçimlendirmesinin başlık tiplerinden biri olması: Örneğin; ana başlıklar başlık 1(header 1), alt başlıklar başlık 2(header 2), ve daha küçük başlıklar başlık 3(header 3)...
Başlık düzeylerine göre başlıklar oluşturulduktan sonra dizini koymak istediğimiz yere tıklayarak Ekle menüsünün, Dizinler ve Tablolar kısmından Dizinler ve Tablolar'ı seçiyoruz. Karşımıza çıkan pencere oluşturacağımız dizinle ilgili özellikleri belirlememizi sağlıyor. Bağlantılı dizin oluşturmamız için Girişler tabında bazı değişiklikler yapmamız gerekiyor. Yapı denilen bölümde E# ile gösterilen bölüm numarasını seçip Köprü(Hyperlink)'ye tıklıyoruz. Karakter biçemini de Sayfa Numarası olarak seçiyoruz.   Ve yine Yapı denilen bölümden en sondaki Sayfa numarası(#)nı seçip yine Köprüye tıklıyoruz. Yaptıklarımızın tüm başlık düzeylerini etkilemesi için de Hepsi butonunu tıklıyoruz. Tamam dediğimizde dizin-içindekiler bölümümüz eklenecektir. Önemli bir nokta belgede herhangi bir değişiklik yapıldığında dizinin güncellenmesi gerektiği. Bunun için o bölüme gelip fareye sağ tıklayarak Dizin/Tablo Güncelle diyoruz.  Bağlantılı dizin özelliği PDF'ye çevirdiğimizde de işe yarayacaktır. Yani PDF dosyamızda da belge içindeki başlıklara bağlantı kuran bir dizinimiz olacaktır.

Yararlandığım Kaynak: How to: Create a linked index with OpenOffice

Git Başlangıç Rehberi

Eğer GNU/Linux kullanıcıysanız bir şekilde Git adını görmüş veya duymuşsunuzdur, mesela yeni bir programı indirirken veya CVS ile Subversion gibi sürüm kontrol sistemlerini incelerken. Git değişiklik kontrol sistemidir. Linux çekirdeğinin ünlü geliştiricisi Linus Torvalds tarafından var olan çözümlerle yaşadığı tatminsizlik nedeniyle geliştirilmiştir. Tasarımdaki ana odak hız veya daha belirgin söyleyeceksek, verimliliktir. Git varolan sistemlerin bir çok eksikliğini adresliyor ve hepsini kısa bir zamanda yapıyor.

Git ne yapar

Farzedelim ki bir müşteri için bir web sitesi yaratmakla uğraşıyorsunuz. Onlar ne istediklerini söylüyor, siz tasarlıyorsunuz, gözden geçiriyorlar ve değişiklikler, ayıklamalar, tekrarlar yapıyorlar. Müşteriden gelen her bir değişiklik için, site değişiyor ve büyüyor. Daha sonra müşteri “geçen eylüldeki halini daha çok sevmiştim” diyor. Normal koşullarda problem yaşarsınız. O zamana ait olan tüm dosyaları ve veriye sahip olmayabilirsiniz, ve kodunuz geri alamayacağınız kadar çok değişmiş, işinizi zorlaştıran bir durumda olabilir.

Değişiklik kontrol sisteminin amacı yukarıdaki paragraftaki neredeyse tüm problemleri çözmektir. Kodunuzdaki ve dosyalarınızdaki her değişikliği izleyebilir, istediğiniz bir tarihe, noktaya geri dönebilirsiniz.

Git nasıl çalışır?

Her bir proje dizininin kendisi bir Git deposudur. Projenizin tüm dosyalarını bu dizinde saklarsınız ve belli aralıklarla Git'e dosyaların o anki durumlarını gönderip bilgisini güncellemesini istersiniz. Bu Git'e durum saklama sürecine teslim etmek, sunmak (commit) adı verilir. Her yeni sürüm sunduğunuzda (bunu sık sık yapmanız iyidir) Git izlemekle yükümlü kılındığı dosyalara bakarak bu dosyalarla elindeki sürümleri arasındaki farkları (ve yeni dosyaları) .git dizinine saklar. Her bir sunma projenizin geliştirilmesi açısından bir yeni kayıt noktası olur.

İsteğe bağlı olarak, yerel git deponuzu dışarıdaki bir sunucuya, github.com gibi, koyabilirsiniz. Bu bir projeye birden fazla kişinin katkı vermesini sağlar. Bu kişiler yerel depoların sık, hızlı kayıtlar yapıp, daha sonra tüm bu yerel kayıtları çevrimiçi depoya tek bir güncelleme olarak sunarlar. Bu git diğer sürüm kontrol sistemlerine göre daha hızlı yapan özelliklerden biridir: her yaptığınız değişiklik için yükleme yapmak üzere band genişliğini ve zamanı boş yere kullanmadan yerel deponuza sık kayıtlar yapabilirsiniz.

Git kurulumu

Çoğu GNU/Linux kullanıcısı Git'e (paket ismi olarak git-core) kendi dağıtımlarının standart yazılım depolarından ulaşabilir. Ubuntu kullanıcıları bağlantıya tıklayarak veya uçbirimde aşağıdaki komutla kurabilirler (ayrıca yazılım paket yönetisinde git-core paketini arayıp kurarak):

sudo apt-get install git-core

Eğer başka bir platform veya dağıtım kullanıyorsanız, bu tarz yazılım depoları kullanamıyorsanız paketleri şuradan elle indirip kurabilirsiniz. Her ne kadar anlatacaklarımız GNU/Linux için olsa da, Git tarafından desteklenen tüm platformlar için aynıdır.

Git kullanımı

Yerel Git deposu yaratma işlemi hızlı ve kolaydır. Projeniz için kullanmak üzere bir dizin yaratın ve bu dizin içerisinde bir uçbirim açın. Komut satırında aşağıdaki komutu kullanarak depoyu başlatın:

git init

Bu komut depo bilgisini saklayan .git dizinini yaratacaktır. Daha sonra, bazı dosyalar eklemek isteyebilirsiniz. Basit bir OKUBENİ dosyası yaratarak başlayacağız, dosyayı izlenecek dosyalar listesine ekleyeceğiz, daha sonra dosyayı depoya sunacağız.

#Yeni bir dosya yaratalim
echo "TODO: Belgeleri hazırla" > OKUBENI.txt
#Simdi Git'e bu dosyadaki degisiklikleri izlemesini soyleyelim
#Bu her dosya icin sadece bir kere yapilmalidir
#(bu konudan ileride tekrar bahsedecegiz)
git add README.txt
#Simdi durumu git deposuna kaydedelim
git commit README.txt

Karşınıza bir metin düzenleyici çıkacaktır (hangi metin düzenleyicinin çıkacağı kullandığını dağıtım ve yapılandırmaya göre farklılık gösterecektir), bu metin düzenleyicide depoya sunma işleminiz hakkında notlar, yorumlar girmeniz gerekmektedir. Bunlar genellikle bir önceki depoya kayıt işleminden beri yapılan değişikliklerin bir özetidir. Kaydedip metin düzenleyiciden çıktığınızda depoya sunma, kayıt işlemi başarıyla tamamlanmış olacaktır.

Esas olarak ilgili dosyanın şu anki halinin bir örneğini yaratmış olduk. Daha sonra yapılacak değişikliker (depoya kaydettiğimiz) bu örneğin üzerine kaydedilecektir.

Her dosyayı yukarıdaki örnekte olduğu gibi gitin izlemesi için tek tek eklemek usandırıcı olabilir. Buna çare olarak, dizindeki tüm dosyaları aşağıdaki komutla izlemeye aldırabilirsiniz:

#sondaki "." isaretine dikkat!
git add .

Ve tüm bilinen, değiştirilen dosyaları aşağıdaki komutla depoya tek seferde sunabilirsiniz:

git commit -a

Bazı işe yarar diğer git komutları şunları içerir:

#Varolan bir deponun tam bir kopyasini olusturun (ornegin bir yazilim projesinin #websitesinden indirilebilir)
git clone (URL, örnek: git://github.com/github/linux-2.6.git)
#Bir dosyayi tasiyin/ismini degistirin. Bu sizi dosyayi depodan silme ve tekrar ekleme is #yukunden kurtarir
git mv (kaynak) (hedef)
#Bir dosyayi silip Git deposundan kaldirin
git rm (hedef)
#Depodaki dallari gormek icin
git branch
#Git agacinda yeni bir dal yaratin
git branch (yeni dal ismi, örnek: "experimental")
#Bir daldan diğerine atlayin, degistirin
git checkout (dal adı, örnek: "experimental")
#Dali guncel dalla birlestirin
git merge (dal)

Bu elbette git ile yapabileceklerinizin sadece başlangıcıdır. Eğer yararlı bulursanız size ısrarla resmi Git Topluluk Kitabını öneririm, bu kitapla bu zeki yazılım parçasını nasıl kullanabileceğinize dair daha derin bilgiler alabilirsiniz.

Not: Git Başlangıç Rehberi'nden çevrilmiştir.

Ek Bağlantılar
Introduction to Git
Top 10 Git Tutorials for Beginners

Google Python Dersi

Google tarafından programlama bilgisine sahip olup Python öğrenmek isteyenler için hazırlanmış (İngilizce) ders: http://code.google.com/edu/languages/google-python-class/

Tarihte Bilim Mühendislik

Tarihte Bilim ve Mühendislik hakkında etkinlik 10 Mart 2010 tarihinde Ege Üniversitesi Mühendislik Fakültesi Konferans Salonunda. Panel Saat 15:30'da başlayacak.

Web Eksenli Stratejik Pazarlama Planlaması

"Web Eksenli Stratejik Pazarlama Planlaması" başlıklı çalışmamın sonucunu aşağıda bulabilirsiniz.

Ankete katılarak çalışmaya katkıda bulunan herkese teşekkür ederim.

SONUÇ
Bilgi çağı ile birlikte ülkelerin ticaret sınırları ortadan kalkmış, gelişen teknoloji ve tekniklerle firmalar arası rekabet de artmış ve farklı boyutlara ulaşmıştır. Internetin oluşturduğu bu yeni ekonomide, internet ortamının koşulları eşit hale getirmesine rağmen, bir firmanın internette varolup bir marka haline gelmesi, fiziksel ortamda faaliyetini sürdüren bir firmanın, markasını sanal ortama taşımasından daha zor da olabilir. İnternette marka haline gelmek isteyen sanal bir firma yada fiziksel ortamda faaliyet gösteren bir firma, tanıtım ve pazarlama faaliyetlerini sanal ortamın kurallarına göre gerçekleşirmelidir.

Bu çalışmada, web ortamında faaliyet gösteren işletmelere, müşterilerinin dikkatini çekmek, sadakatini arttırmak ve daha iyi hizmet verebilmeleri amacıyla, yol gösterici bir rehber oluşturulmaya çalışılmıştır.
Araştırma modelinde, web eksenli pazarlama stratejilerinin geliştirilmesinde etkili olduğu düşünülen web sitesi tasarımı, güdüleme ve tanıtım faktörlerinin Internet’ teki pazarlama başarısını nasıl etkilediği gösterilmeye çalışılmıştır.

Araştırma sonucu, alışveriş kararı verirken tanıdık tavsiyesinin alışveriş kararında etkili olduğu, çoğunluğun fiyat karşılaştırma sitelerinden en uygun fiyat araştırması yaptığı ancak en düşük fiyatın tek başına yeterli bir unsur olmadığını göstermektedir. Sitelerin sağladıkları ürünler hakkında bilgi alabilmek, yorum ve şikayetleri bildirebilmek katılımcıların tamamına yakını tarafından önemli görülmüştür.

Ziyaretçilerin web sitelerinden beklediği en önemli özelliklerden birinin güncel içerik olduğu; bu içeriğin sunum şeklinin de basit, karmaşık olmayan bir şekilde yapılması gerektiğini göstermiştir. Katılımcıların neredeyse tamamı, aradığı bilgiye arama motorlarının getirdiği ilk sayfadan, yani ilk 20 kayıt içerisinden ulaşmak istemektedir, bu durumda arama motoru optimizasyonu online pazarlama başarısı için kritik bir faktördür.

Internet üzerinde üyelik algısı ücrete dayalı olamamalıdır. Araştırmamız internet kullanıcılarının çoğunluğunun web sitelerine üyelik ücreti ödeme taraftarı olmadığını göstermiştir.

Araştırmaya katılanların büyük kısmı Internetten alışveriş yapma taraftarı olmasına karşın tamamına yakını ödeme yapılması gereken durumlarda sitede alınan güvenlik önlemleri belirtilmezse o siteden alışveriş yapmayacağını belirtmiştir.

İnternet ortamında başarılı olmak isteyen bir işletme, ürün veya hizmetlerini satacağı tüketicilerin davranışlarını ve davranışlarının gerisinde yatan sebeplerin neler olabileceğini tahmin etmek zorundadır. Çağdaş pazarlama anlayışı, tüketicilerin istek ve ihtiyaçlarının en iyi şekilde karşılanabilmesi için gerekli bilgilerin toplanması, değerlendirilmesi ve tüketici davranışlarının her yönüyle anlaşılması ve buna göre pazarlama karması geliştirilmesi esasına dayanmaktadır. Teknolojinin de gelişmesiyle verilerin toplanması ve bilgi haline dönüştürülmesi süreci hızlanacak, dolayısıyla elde edilen bilgilerle strateji geliştirmek kolaylaşacak ve arzulanan sonuçlara erişilme olasılığı artacaktır.

Tüketici güdülerinin neler olduğunun bilinmesi ve tüketici güdülerinin oluşmasını etkileyen faktörlerin neler olduğunun belirlenebilmesi, işletmelere tüketicilerin istek ve ihtiyaçlarının gerisinde yatan sebepleri ortaya koyacaktır. Dolayısıyla işletme hedef pazarındaki tüketicilerin güdülerine göre pazarlama karmasını geliştirecek ve pazarlama stratejisini uygulayabilecektir.

Mehmet KIŞ, Şubat 2010, Beykent Üniversitesi, SBE.

Bilgisayar Bilimcisi Gibi Düşünmek

GÜNCELLEME: Bilgisayar Bilimcisi Gibi Düşünmek: Python ile Öğrenme 3. baskı Özhan Fenerci tarafından çevriliyor.

Bilgisayar Bilimcisi Gibi Düşünmek: Python ile Öğrenme 2. baskının Türkçe çevirisini uzun bir zamandan sonra bitirdim. 3 Ekim 2008'de başlamıştım, araya
giren bir çok iş ve nedenden dolayı 9 Şubat itibariyle bitirdim. Tam bitirdim de sayılmaz aslında, önsöz, giriş, gasp, dizin bölümleri çevrilmeden duruyor. Fırsat bulunca onları da çevireceğim. Yine de yararlı olacağına inanıyorum, Türkçe bir kaynak olarak. Çevirinin PDF haline de aynı sayfadan ve bu bağlantıdan ulaşabilirsiniz.

Çeviriyle ilgili, kitapla ilgili her türlü düşüncenizi bana iletmeyi unutmayın. Yanlışlar, anlaşılmayan yerler, kötü çeviriler gibi. Bunların çevirinin iyileştirilmesi anlamında yararı olacaktır. Kitabın Python öğrenmek isteyen ve Türkçe bir kaynaktan yararlanmak isteyen herkese yararlı olmasını diliyorum.

Ek bağlantıları paylaşıyorum:
http://www.slideshare.net/tekrei/bilgisayar-bilimcisi-gibi-dnmek-python-ile-renme
https://docs.google.com/open?id=0B6Q0hgaZhD5KMTJlNGU1MTItMDgzNS00YWM3LThkZDYtZDg5NDIyY2M3Nzgy
 

Java ve Oracle

Java geliştiricileri ilk değişikliği hissetmeye başladı. Java sitesi (java.sun.com) artık Oracle logolu. Bakalım neler değişecek, neler olacak. Sun'ın siteinin de (www.sun.com) Oracle sitesine yönlendiğini not düşelim.

İnternet

Son zamanlarda takip ettiğim siteler ve bloglarda İnternet'in sürüm 4 (IPv4) adres uzayının gittikçe küçüldüğüne dair ve bu bağlamda İnternet'in geleceğini değerlendiren yazılar yer alıyor. Kalan IPv4 adresleri %10'un altına inmiş durumda.

Konuyla ilgili yazılar:
IPv4 Free Pool Drops Below %10
Why IPv6 essential for your freedom
Internet addresses expected to run out next year
At Current Rates, Only a Few More Years' Worth of IPv4 Addresses

Uygulama Sunucusu ve Web Sunucusu

Sürekli karşılaştığım sorulardan biri uygulama sunucusunun ne olduğu sorusudur. Uygulama sunucusu google'daki ingilizce tanımlara bakarsak basitçe n katmanlı mimaride iş mantığı ve iş süreçlerini gerçekleştirmek üzere API sunan sunucudur. Özetle sunucu taraflı iş mantığını çalıştırmak için ana motordur. Örneğin Java uygulama sunucuları size Java web uygulamalarını ve hizmetlerini sunmanız için gereklidir. Web sunucusu ile arasındaki farka gelirsek, bir yazıdan yararlanarak (çevirerek) açıklamaya çalışacağım.

Soru. Bir uygulama sunucusu ile web sunucusu arasındaki fark nedir?

Yanıt. Bütüne bakacak olursak, web sunucusu bir tarayıcıda görüntülenecek sayfaları sunar, bir uygulama sunucusu ise bir istemci uygulamasının çağırabileceği metotları sunar. Daha ayrıntılı söyleyecek olursak:

Web sunucusu

Uygulama sunucu özellikle HTTP isteklerini kotarır, uygulama sunucusu ise farklı tipteki protokollerle uygulamalara iş mantığını sunar. Web sunucusu HTTP protokolünü kullanır. Web sunucusunun çalışma mantığını anlamak kolaydır. Web suncusuna bir istek geldiğinde, sunucu bu isteği basitçe bu isteği en iyi karşılayabilecek programa aktarır. Web sunucusu, sunucu taraflı programın işlediği ve ürettilen yanıtı geri döndüren bir ortamdan fazla işlevselliği sağlamaz. Sunucu taraflı program genellikle görev (transaction) işleme, veritabanı bağlantısı ve mesajlaşma gibi işlevleri kendisi sağlar.

Uygulama sunucusu

Uygulama sunucusu ise, tanımımıza göre, iş mantığını istemci uygulamalara farklı protokollerle sunan, protokollerde HTTP de muhtemelen vardır. Çoğu durumda sunucu iş mantığını bir bileşen APIsi ile sunmaktadır, örneğin EJB (Enterprise (Kurumsal) Java Bean) bileşen modeli J2EE (Java 2 Platform, Kurumsal Sürüm) uygulama sunucularında bulunur. Ayrıca uygulama sunucusu kendi kaynaklarını yönetir. Bu tip görevler arasında güvenlik, görev (transaction) işleme, kaynak havuzları, ve mesajlaşma yer alır.

Web sunucusunun işlevini özetle aktarma olarak görebiliyoruz. Gerçi yararlandığım kaynakta web sunucularında XML web servislerinin kullanılmasıyla beraber, uygulama sunucularıyla farklarının azaldığı söyleniyor. XML'i web sunucusuna göndererek, verinin işlenmesi ve buna göre yanıtlaması nedeniyle en az uygulama sunucular kadar işlem yapmasına neden oluyor. Zaten çoğu uygulama sunucusu web sunucusu görevini de yapmaktadır. Aslında web sunucusuna başka bir işleme aktarım yapan, HTTP protokolünü destekleyen basit bir uygulama sunucusu olarak da bakabiliriz.

Bağlantılar:

http://www.javaworld.com/javaqa/2002-08/01-qa-0823-appvswebserver.html

http://www.velocityreviews.com/forums/t149260-webserver-vs-application-server.html

http://faq.javaranch.com/java/WebVsApplicationServer

http://www.diffen.com/difference/Application_Server_vs_Web_Server

Anket

İşletme bölümünde yaptığım yüksek lisansımın sonuna yaklaştım. Ancak doldurmaktan hiç hoşlanmadığım anketlerden birini insanlara doldurtmak zorundayım :(

Tez konum "Web eksenli stratejik pazarlama planlaması". Anket te amacımız ise web sitelerinden beklenen özellikleri ortaya çıkarmak. 34 soruluk olan ve 4 dk süren bu anketi doldurup katkıda bulunursanız, söz veriyorum bundan sonra anket seçmeyip gelen anketlerin çok uzun olmayanlarının tümünü dolduracağım :).

Anket çalışmasının sonuçlarını kodveus ta paylaşacağım. Teşekkürler.

Aşağıdaki bağlantıdan anket sayfasına ulaşabilirsiniz:

http://qtrial.qualtrics.com/SE?SID=SV_4HEYYKZDgydJpI0&SVID=Prod

Indeks kullanılmayan tablolar için iki SQL cümlesi

Indeks kullanmadığımız tablolarda bazen tüm kolonları aynı olan ya da benzer verilere sahip kayıtlar oluşur.

Bunlardan fazla olan kayıtları silmek için ROWID den yararlanabiliriz.

/*Birden çok kaydın fazla olanlarını silip tek kayda indirmek*/
DELETE from Tablo1 t where rowid NOT IN (select min(rowid) from Tablo1 b where t.ogrenci_no = b.ogrenci_no and t.kayit_durum = b.kayit_durum group by b.ogrenci_no, b.kayit_durum);



Tablolarda Indeksleme yapmadığımız alanlar için insert cümlesine kontroller ekleyebiliriz, böylece çift kayıt atılmasını önlemiş oluruz:

/*Insert cümlesinde kayıt durumu kontrolü*/
INSERT INTO tbl_ogrenci t (tbl_ogrenci_no, tbl_ogrenci_ad, tbl_kayit_durum) select 87, 'Eray', 'A' from dual where not exists (SELECT * FROM tbl_ogrenci o WHERE o.tbl_ogrenci_no = t.tbl_ogrenci_no AND o.tbl_kayit_durum = 'A');