You are on page 1of 6

SB-22

Java ile Yapay Zeka Yazılımları Geliştirme

Aybars Uğur, Erkan Binici2

Ege Üniversitesi, Mühendislik Fakültesi, Bilgisayar Mühendisliği Bölümü


35100 Bornova-İZMİR
ugur@bornova.ege.edu.tr1, erbinici@yahoo.com2

ÖZET

Bu makalede, yapay zeka konusunun önemi anlatılmış ve zeki yazılımlar geliştirmenin yazılım mühendisliğindeki
yeri belirtilmiştir. Yeni yazılım geliştirme ortamlarından biri olan Java’nın avantajları üzerinde durulmuştur.
Java platformunun, yapay zeka içeren yazılımların geliştirilmesine etkileri incelenmiş ve örnek bir program
üzerinde değerlendirilerek sonuçlara ulaşılmıştır.

Anahtar Kelimeler : Yapay Zeka, Yazılım Mühendisliği, Java

GİRİŞ zekayı “zeki davranışların otomasyonu ile ilgili


bilgisayar bilimleri dalıdır” şeklinde tanımlamıştır.
Günümüzde internet kullanıcıları için, bir kelime [2][3][4]
veya konu ilgili tüm sayfaları bulup görüntülemek
olağan bir işlemdir. Arama makineleri, tüm sayfalar Yapay zekanın önemli bazı konu ve çalışma alanları
yerine, gereksizleri ayıklayarak en uygun olanları aşağıda belirtildiği gibidir :
getirmeyi ve daha ileri birçok özelliği
desteklemektedir. Satılık daire arayan kişiler için • Problem Çözme, Arama ve Sezgisel
belirli kriterlere uyanların bulunup incelenmesi de Programlama
olasıdır. İşletim sistemleri, yazılım geliştirme • Bilgi ve Çıkarsama
ortamları, kelime işlemci ve tablolama gibi • Planlama
uygulama yazılımları, çok kullanılmayan seçenekleri • Öğrenme ve Algılama
eleyip diğerlerini görüntüleyebilmektedirler. Her tür • Oyun Oynama
yazılımda, komutlardan üç boyutlu şekillere kadar • Uzman Sistemler
zeki otomatik tamamlama özellikleri
• Robotbilim
desteklenmektedir. Bilgisayar oyunlarında
• Yapay Sinir Ağları
karakterlerin, zeki olarak hareket edebilir hale
• Genetik Algoritmalar ve Programlama
gelmesi gerçekçiliği artırmıştır. Tüm bu gelişmeler,
yapay zeka çalışma ve araştırmalarının sonucudur. • Yapay Yaşam
Bu makalede, yapay zeka unsurları içeren • Ses Tanıma
yazılımların geliştirilmesinde, en ileri platformlardan • Görüntü işleme
biri olan Java’nın önemi üzerinde durulmuş ve zeki • Yazılım Etmenleri
yazılımlar geliştirme konusunda yapılması • Veri Madenciliği
gerekenler belirlenmiştir.
Bilim kurgu filmlerinde görülen insan benzeri
YAPAY ZEKA robotlar gibi yapay zeka örnekleri gerçekleşmemiş
olsa da, günümüzde, yapay zeka araştırmalarında
D. Lenat ve E. Feigenbaum’un tanımlarına göre zeka sınırlı amaçlarla mutlu olunmaktadır :
“Karmaşık bir problemi çözmek için gerekli bilgileri
toplayıp birleştirme kabiliyetidir” veya “Karmaşık • Bilgisayarlara belirli işleri yaptırma
bir problemi, çözüm arama alanını daraltarak kısa • Sınırlı ses tanıma
yoldan çözebilme kabiliyetidir”. Zeka’nın sözlük • Evde veya diğer alanlarda “Akıllı Yardımcılar”
anlamı ise, insanın düşünme, akıl yürütme, nesnel • İnternet’teki basit Yapay Zeka örnekleri
gerçekleri algılama, kavrama, yargılama, sonuç
çıkarma yeteneklerinin tümüdür. Ayrıca : Soyutlama, Yapay Zeka ile bağlantılı en popüler örnekler ise,
öğrenme ve yeni durumlara uyma gibi yetenekler de robotlar (aibo, asimo gibi), internet üzerindeki
zeka kapsamı içindedir. Yapay zeka ise, bu sohbet robotları (eliza, alice, cybelle gibi) yani
özelliklere sahip organik olmayan sistemlerdeki chatbot’lar ve hareketli etmen sistemleridir (Mobile
zekadır. Luger ve Stubblefield, 1993 yılında yapay Agent Systems).

II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 1
SB-22
işletilebilmektedir. Bu, internet üzerinde
Yazılım geliştirme alanında, daha zeki yazılımlar işletilebilen program yazımını
geliştirmeye yönelik çalışmalar yapılmaktadır. Zeki kolaylaştırmakta ve kullanıcılarının sayısını
olmayan yazılımlar, kullanıcılarını gereksiz veya otomatik olarak artırıp ve tüm dünyaya
tekrarlı işleri yapmak durumunda bırakarak verim yaygınlaştırmaktadır.
kaybına yol açmaktadırlar. Sonuçta kalite düşmekte, • “Multithreaded” yani çok iş parçacıklı Java
zaman kaybı olmakta, kullanım zorlaşmakta yani programları, İnternet ve World Wide Web
etkinlik azalmaktadır. Kullanıcılar, aynı türde uygulamaları için aynı anda birden çok işlemin
yazılımların zeki olanlarını tercih etmektedirler. yapılmasını sağlayarak, belirli bir işin bitmesini
beklemekle sınırlı kalınmasını önlemektedir [5].
YAZILIM GELİŞTİRME ORTAMLARI ve
JAVA YAPAY ZEKA YAZILIMLARI GELİŞTİRME

Günümüzde yazılım geliştirme ortamları, Ağ, Web Yapay zeka dilleri olarak adlandırılan LISP, 1958
ve Grafik tabanlı, Mobil İletişim Cihazlarını yılında John McCarthy ve Prolog ise 1972 yılında
destekleyecek şekilde ilerlemeler göstermiştir. Web Philippe Roussel tarafından geliştirilmişlerdir.
ve mobil iletişimin yaygınlaşması ile kavramlarda Günümüze kadar güncel gelişmelere paralel
meydana gelen değişmeler sonucunda bu tür özellikleri destekleyebilecek şekilde sürümleri
işlemlere destek verecek şekilde Java ve .NET ortaya çıkmıştır. Veri tabanlarını desteklemekten,
platformları ortaya çıkmıştır. .NET dilleri ve Java, diğer dillerle entegrasyonuna, görselliğinden,
Pascal, C ve C++ gibi dillerin eksikliklerini de derleme hızının artırılmalarına kadar birçok
giderecek ve verimlerini artıracak şekilde çalışmalar yapılmıştır ve yapılmaya devam
tasarlanmışlardır. Bu çalışmada, 1995 yılında edilmektedir. Örnek olarak Prolog, Çıkarsama
geliştirilen Java programlama dilinin seçilmesindeki “reasoning” ve Geri İzleme “backtracking” gibi
en büyük neden platform bağımsızlığının daha ileri güçlü mekanizmaları doğrudan sunduğu için,
derecede olmasındandır. Aynı özellikler, C# (C karmaşık olmayan yapay zeka programları
Sharp) gibi daha yakın tarihte geliştirilen .NET yazılmasını, inanılmaz derecede kolaylaştırmaktadır.
üzerindeki diller için de geçerlidir. Bu mekanizmaları öğrenmek isteyen araştırmacılar
için de, çok uygun bir deneme ortamı sunmaktadır.
Java Programlama Dili ve Platformu, aşağıda
önemlileri sayılan özellikleri sayesinde yazılım Ancak buradaki problem, C, Java gibi popüler
geliştiricilere kolaylıklar sağlayıp avantajlar programlama dillerini öğrenmiş olan programcı ve
sunmaktadır : [1] yazılım geliştiricilerin, farklı yaklaşımlar ve
özellikler içeren dilleri öğrenme zorunluluğunda
• Nesneye yönelik bir dil olması nedeniyle, kalmasıdır. İleri özellikler içeren zeki yazılımların
gerçek dünyadaki nesneler, yazılım nesnelerine geliştirilmesinde, Prolog ve Lisp gibi dillerin
birebir eşlenebilmektedir. Yazılım tasarımını sınırlarının iyi öğrenilmesi gerekmektedir. Ancak
ve anlaşılırlığını kolaylaştırmaktadır. örnek olarak Java dilinde rahatlıkla Özyineleme
Değişiklikler yerel olarak yapılabildiğinden (recursion) mekanizmasını kurabilen bir kişi,
esnek programlar yazılabilmektedir. Prolog’da hazır kodları bile anlamakta
• 1995 gibi çok uzak olmayan bir tarihte zorlanabilmektedir.
geliştirildiği ve yeni sürümleri ile sürekli
güncellendiği için web ve grafik altyapısı ve ağ Java gibi dillerin avantajları burada ortaya
özellikleri güçlüdür. Bu nedenle, her tür çıkmaktadır. Java’yı öğrenmiş olan bir kişi, “Java
özelliği içeren yazılımlar geliştirilebilmektedir. Collections Framework” içindeki hazır veri
• Platform bağımsızlığı, dünyanın her yerindeki yapılarından yani sınıf, metot ve özelliklerden
değişik donanımlı bilgisayarlar ve değişik yararlanarak kolaylıkla verileri (yapay zekada
işletim sistemleri üzerinde kodların gerçekleri ve bilinenleri) temsil edebilmekte ve
çalıştırılabilmesini sağlamaktadır. Örnek olarak üzerlerinde çıkarsama gibi işlemler yapabilmektedir.
Windows işletim sistemi üzerinde yazılan bir Gerekiyorsa veritabanı bağlantıları da rahatlıkla
Java programı, Linux veya diğer işletim kurabilmektedir. Ayrıca dünyanın herhangi bir
sistemleri üzerinde işletilebilmektedir. Tüm yerinde hazırlanmış olan özelleşmiş ve hatalardan
bunlar, herhangi bir Java kodunun yeniden arındırılmış paketler kullanılarak daha ileri
kullanım özelliklerini artırmakta ve kodun her çalışmalar da gerçekleştirilebilmektedir.
platform için değiştirilme gereksinimini
ortadan kaldırmaktadır. ÇIKARSAMA İÇEREN BİR JAVA
• Yazılan java applet’leri yerel makinelere PROGRAMI GELİŞTİRME
yüklenerek, internet üzerinden

II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 2
SB-22
Yapay zeka programlarını normal programlardan Örneğimizde ileri besleme ve geri yayılım
ayıran özellikler; öğrenme, çıkarsama, karar verme “backpropagation” algoritması kullanarak
ve algılama gibi yeteneklere sahip olmalarıdır. Bu değerlendirme yapan 3 katmanlı bir ağ
yetenekleri programlara katabilmek için; geri izleme, bulunmaktadır (Şekil 2).
karar ağaçları, arama mekanizmaları gibi çeşitli Yapay Sinir Ağının gerçekleştiriminde Java’nın
teknikler kullanılmaktadır. nesne tabanlı bir dil olması, ortam nesnelerinin
program içinde birebir modellenebilmesini
Bu çalışmada, yapay zekanın başlangıç uygulaması sağlandığı için tasarımı ve programlamayı oldukça
denilebilecek XOR işlemi (Şekil 1), Java ile basitleştirmiş ve esnek hale getirmiştir. Model
gerçekleştirilmiştir. üzerinde görülen hücre, bağlantı, çekirdek, giriş ve
çıkış gibi yapıları kendimiz yeniden
gerçekleştirebileceğimiz gibi bu konuda uzun
X Y Z = X XOR Y
çalışmalar sonucunda oluşturulmuş ve denenmiş
0 0 0 hazır Sinir Ağı Kütüphanelerindeki mevcut sınıfları
kullanarak da yapay zeka uygulamamızı
0 1 1
geliştirebiliriz. Örneğimizde tümü java ile
1 0 1 gerçekleştirilmiş açık kaynak kodlu bir kütüphane ve
motoru olan JOONE (http://joone.sourceforge.net/)
1 1 0
[6] kullanılmıştır.

Şekil 1 : XOR işlemi JOONE kütüphanesi içerisinde yapay zeka


uygulamamızı geliştirebilmemiz için;
Program, temel olarak yapay zeka alanının alt - İleri beslemeli veya yinelemeli şekilde
dallarından biri olan Yapay Sinir Ağları (Artificial çalışacak Sinir Ağı elamanlarının
Neural Networks) ile tasarlanmıştır. Yapay sinir bileşenleri,
ağları, insan beyninin tahmin edilen çalışma - “Back Propagation” algoritmasının çeşitli
yönteminin bilgisayarlar üzerinde modellenmesi uygulamalarını sunan bileşenler,
sonucu ortaya çıkmıştır. İnsan beyninde olduğu gibi - Temelde moduler bir ağ yapısı
sinirlerin birbirine bağlı olduğu bir sinir ağı oluşturmamızı sağlayacak ilişkisel
üzerinde; öğrenme işlemi, öğrenilen bilgilerin bileşenler,
saklanması ve bu bilgiler sayesinde çıkarsama - Ağ sisteminin bir bilgisayar ağı üzerinden
yapılması sağlanmaktadır. Bu sayede programlara, aktarılmasını, dosya sistemine
yani bilgisayarlara zeka katılmaktadır. kaydedilmesini sağlayacak “serialization”
mekanizması,
- Çeşitli kaynaklarla ilişkili I/O birimi,
- Denetlemeli ve denetlemesiz öğrenmeyi
uygulayabilecek bileşenler,
X Y Giriş katmanı
- Sinir ağının kontrolünün sağlayan
(başlatma / durdurma / öğrenme / yenileme)
denetim bileşenleri,
N N N Saklı katman - Girdi bilgisinin ön işlemesini sağlayacak ve
öğrenme parametrelerini dinamik olarak
değiştirebilmeyi sağlayacak bileşenler,
- Sinir ağı üzerinde değişik kontrol
Z Çıkış katmanı
işlemlerini yapabilmek için “script”
arabirimi.
gibi hazır özellikler bulunmaktadır.

Şekil 2 : XOR çözümü için tasarlanan Ağ Yapısı. Paketler aşağıdaki gibidir :


- org.joone.engine : Çekirdek ağ
İnsan beyni, sinir hücreleri “neuron”, bağlantılardan elementlerini içeren paket.
“synapse” oluşmaktadır. Bu sinir hücreleri birer - org.joone.engine.learning : Sinir ağının
çekirdek içermektedir. Kendisine bağlı olan diğer eğitimi için kullanılacak paket.
hücrelerden gelen bilgileri bu çekirdek içerisinde - org.joone.io : Dosya gibi girdi çıktı
değerlendirerek gerekli olan çıktıyı üretip kendisinin kaynaklarıyla sinir ağının iletişimini
bağlı olduğu diğer hücrelere çıktı olarak ürettiği sağlayacak paket.
bilinmektedir. Bu bilgiler ışığında bulunmuş çeşitli - org.joone.util : Çeşitli hizmet sınıflarını
sinir ağı modelleri ve algoritmaları mevcuttur. içeren paket.

II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 3
SB-22
- org.joone.script : Script uygulamalarını output.addInputSynapse(synapse_HO);
sağlayan paket.
Sinir ağını yönetecek olan “monitor” sınıfının
XOR problemini çözümü için uygulanacak senaryo oluşturulması :
şu şekilde olacaktır.
1- Ağın konu üzerinde eğitilmesini Monitor monitor = new Monitor();
sağlayacak örnek verilerin ilgili monitor.setLearningRate(0.8);
kaynaktan okunması. monitor.setMomentum(0.3);
2- Ağa girilen veriler öğrenme
algoritmasından geçirilerek (training) “Monitör” ile katmanlar arasındaki ilişkinin
ağın problem deseni üzerinde, yeni kurulması :
veriler için çıkarsama yaparak karar
vermesinin sağlanması. input.setMonitor(monitor);
3- Eğitim verilerinden sonra test verileri hidden.setMonitor(monitor);
ile sinir ağı sisteminin çalışmasının test output.setMonitor(monitor);
edilmesi.
Uygulamanın, “monitor” nesnesinden gelen
1. adım için örnek XOR girdileri ve çıktılarını içeren mesajları yakalayabilmesi için “monitor” nesnesinin
“;” işareti ile ayrılmış şekilde bir girdi dosyası Listener’ının eklenmesi :
oluşturulmuştur. Örnek veriler ;
monitor.addNeuralNetListener(this);
• 0.0;0.0;0.0
• 0.0;1.0;1.0 Sinir ağının ana elemanlarının kodlamasının
• 1.0;0.0;1.0 gerçekleştiriminden sonra, girdi bilgilerinin
• 1.0;1.0;0.0 dosyadan okunması ve bunları girdi hücrelerine
bağlanmasını sağlayan bölüm :
“Joone” paketi içerisindeki sınıflar yardımıyla ağ
üzerindeki katmanların oluşturulması (Katmanlar FileInputSynapse inputStream = new
arasındaki iletişim “Sigmoid” aktarım yöntemi ile FileInputSynapse();
olacağından SigmoidLayer sınıfı kullanılmaktadır) : /* Örnek eğitim dosyamiz içerisindeki ilk iki
kolonda giriş bilgileri bulunuyor.*/
SigmoidLayer input = new SigmoidLayer(); // Giriş katmanı inputStream.setFirstCol(1);
SigmoidLayer hidden = new SigmoidLayer(); // Saklı katman inputStream.setLastCol(2);
SigmoidLayer output = new SygmoidLayer(); // Çıkış katmanı inputStream.setFileName("c:\\joone\\XOR.txt");
/* Dosya yerini ve ismini belirliyoruz.*/
Katmanlardaki sinir hücresi sayılarının belirlenmesi:
input.setRows(2); // XOR problemi için iki giriş verisi var
hidden.setRows(3); // saklı katmanda 3 adet sinir hucresi Oluşturulan “inputStream’in”, girdi hücrelerinin
oluşturuluyor bulunduğu katmana atanması :
output.setRows(1); // Çıkış değeri tek sayı olduğundan tek sinir
hücresi ekleniyor input.addInputSynapse(inputStream);
Katmanlar arası bağlantılar için, 3 katman arasına
tam bağlantı sağlayan 2 tane FullSynapse Girdi bilgilerinin alınmasından sonra, sinir ağında
kullanılmaktadır : öğrenme işleminin yapılması (Girdi bilgileri bir
eğitmen sınıftan geçirilerek, girdiler ve çıktılar
FullSynapse synapse_IH = new FullSynapse(); /* arasında beklenen çıktı ile karşılaştırılmaktadır) :
Input -> Hidden bağlantısı. */
FullSynapse synapse_HO = new FullSynapse(); /* TeachingSynapse trainer = new
Hidden -> Output bağlantısı*/ TeachingSynapse();
/* Örnek girdiler sonucu oluşması beklenen çıktı
Girdi ve saklı katman arası ilişkinin kurulması : bilgisini eğitmen sınıfa belirtiyoruz.*/
FileInputSynapse samples = new
input.addOutputSynapse(synapse_IH); FileInputSynapse();
hidden.addInputSynapse(synapse_IH); samples.setFileName("c:\\joone\\XOR.txt");
trainer.setDesired(samples);
Saklı katman ve çıktı katmanı arası ilişkinin /* Çıktı bilgisi örnekleri içeren dosyadaki 3.
kurulması : kolonda yeralmaktaydı.*/
samples.setFirstCol(3);
hidden.addOutputSynapse(synapse_HO); samples.setLastCol(3);

II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 4
SB-22
/* Eğitmen ve monitor objesi arasindaki ilişkiyi metodu” 1 dongu sayısı ile çağırılmaktadır ve bu
sağlıyoruz.*/ sefer sinir ağının örnek bir girdi deseni için ağ
trainer.setMonitor(monitor); üzerindeki öğrenilmiş bilgilere göre elde edilen bir
çıktı bilgisi çıktı dosyasına yazılmaktadır.
Çıktı katmanı ile eğitmenin ilişkisinin sağlanması:
output.addOutputSynapse(trainer); SONUÇLAR

Girdi, saklı, çıktı katmanlarının ve eğitmenin Bu çalışmada, java “Joone” paketi ile yapay sinir ağı
çalıştırılması : gerçekleştiriminde, temel elemanların nasıl
oluşturulduğu ve bunlar arasındaki ilişkilerin nasıl
input.start(); sağlandığı gösterilmektedir. Hazır “Joone” yapay
hidden.start(); sinir ağları kütüphanesi sayesinde, öğrenme,
output.start(); çıkarsama ve etkinlikte bulunma işlemlerinde
trainer.start(); kullanılması gereken geri besleme mekanizmaları,
karar ağaçları, arama algoritmaları gibi ayrıntılarla
Sinir ağının diğer parametrelerinin belirlenip ilgilenmeden yapay zeka uygulamaları
çalıştırılması : geliştirilebilmektedir. Açık kaynak kodlu
“org.joone.engine” paketi içerisindeki ilgili sınıfların
monitor.setPatterns(4); /* # girdi dosyasi deseni. incelenmesi ile temel yapay zeka mekanizmalarının
Kolon sayisi.*/ öğrenilmesi ve paketin geliştirilmesi de olasıdır.
monitor.setTotCicles(20000); /* Girdi Görüldüğü gibi, yapay zeka dillerini bilmeyen ve
dosyalarindaki bilgi ile Sinir ağının üzerinde zeki yazılımlar geliştirmek isteyen kişilerin, yapay
yapılacak eğitim sayısı.*/ zeka dillerini kullanmaları zorunlu değildir. Java
monitor.setLearning(true); /* Sinir ağının eğitim gibi programlama dilleri içerisinden de hazır
modunda olduğunun belirlenmesi.*/ paketler yardımıyla, hazır veri yapıları
monitor.Go(); /* Sinir ağının çalışmaya kullanılabilmekte, arama ve çıkarsama
başlaması.*/ yapılabilmektedir. Paketlerin kullanımının
öğrenilebilmesi için Java altyapısının iyi düzeyde
“Monitor” nesnesinin çalışarak sinir ağına girdi olması yeterlidir.
bilgileri girip “20000 döngü ile” eğitiminden sonra
örnek girdi deseni için alınabilecek örnek bir çıktı, Prolog ve LISP gibi yapay zeka dillerinin
şu şekilde olacaktır : öğrenilmesi de yapay zeka mekanizmalarının
anlaşılması bakımından oldukça önemlidir. Bu diller
0.02592995527027603 de, donanım ve yazılım dünyasındaki gelişmelere
0.9664584492704527 paralel olarak, yeni sürümleri ile
0.9648193164739925 güncellenmektedirler. Java gibi diller ile güçlü
0.03994103766843536 yapay zeka dillerinin karşılıklı olarak birbirine
benzer hale getirilmesi, zeki yazılımlar geliştirme
Sinir ağının, girdileri alacağı dosyayı ve sonuç yönündeki eksikliklerin kapanmasını sağlayacaktır.
bilgilerini yazacağı dosyayı belirtebileceğimiz, sinir Böylece zeki yazılımların kullanım oranı ve
ağını eğitip, çalıştırmayı sağlayabileceğimiz bir yazılımlardaki verim artacaktır.
arayüzün ekran görüntüsü Şekil 3’te verilmektedir.
LİTERATÜR LİSTESİ

[1] Deitel, H. M. and Deitel, P. J., 1999, Java :


How to Program, Third Edition, Prentice-
Hall.
[2] Luger, G.F., 2002, Artificial Intelligence :
Structures and Strategies for Complex
Problem Solving, 4th edition, Addison-
Wesley.
Şekil 3 : Yapay Sinir Ağları programının penceresi [3] Nilsson, N. J., 1998, Artificial Intelligence :
A New Synthesis, Morgan Kaufmann
“Egit” düğmesine basıldığında, “Monitor.go” Publishers.
metodu, “Monitor.setLearning(true)” modunda [4] Russell, S., J., and Norvig, P., 1995, Artificial
20000 döngü sayısı ile çalıştırılarak sinir ağının Intelligence : A Modern Approach, Prentice-
eğitilmesi sağlanmaktadır. “Calistir” düğmesi Hall.
“Monitor.setLearning(False)” şeklinde “Monitor.go

II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 5
SB-22
[5] Tarau, P., 1999, Jinni: Intelligent Mobile
Agent Programming at the Intersection of
Java and Prolog. Proceedings of PAAM'99,
London.
[6] http://www.jooneworld.com

II. Ulusal Meslek Yüksek okulları Sempozyumu, 15-17 Ekim 2003, İzmir 6

You might also like