Burak IŞIKLI :))

Web Service ile Sıcaklık Dönüşümü

Posted in Java, Web Services by Burak IŞIKLI on 29 Temmuz 2009

Daha önceden blogumdaki Axis 2 Kullanılarak Web Servis Oluşturma adlı yazımda web servisin nasıl oluşturulacağını anlatmıştım. Fakat çok iyi bir örnek vermediğim için biraz havada kaldı. Şimdi anlatacağım örnekle konu tam anlamıyla oturmuş olacak. Web servislerde internette biraz araştırma yaparsanız en sık öne çıkan örnekler sıcaklık dönüşümü, para dönüşümü, kimlik sorgulama gibi hizmetler olacaktır. Bende bunlardan biri olan sıcaklık dönüşümünü java ve jsp kullanarak anlatacağım.

Yapacağımız programı iki aşamalı olarak anlatacağım. Birinci versiyonumuz için paket adımız “edu.burakkk.webservice.tempConverter.v1”. İlk önce birinci versiyonu yapalım.

TempConverter.java


package edu.burakkk.webservice.tempConverter.v1;

/**
 * Web Service
 * Temp Converter
 *
 *@version 1.0 Release 1
 *@author burakkk
 *
 **/

public class TempConverter{
 public String FahrenheitToCelsius(String Input) {
 if (!Input.isEmpty() && isNumber(Input)) {
 double result = 0;
 result = Double.parseDouble(Input);
 result = (((result) - 32) / 9) * 5;
 Input = Double.toString(result);
 return Input;
 } else {
 return "ERROR! Please enter the input number...";
 }
 }

 public String CelsiusToFahrenheit(String Input) {
 if (!Input.isEmpty() && isNumber(Input)) {
 double result = 0;
 result = Double.parseDouble(Input);
 result = (((result) * 9) / 5) + 32;
 Input = Double.toString(result);
 return Input;
 } else {
 return "ERROR! Please enter the input number...";
 }
 }

 private boolean isNumber(String num) {
 try {
 Double.parseDouble(num);
 } catch (NumberFormatException nfe) {
 return false;
 }
 return true;
 }
}

Aslında yaptığımız programı bu şekilde kullanmak doğru olmaz. Çünkü her metodu çağırmak için ayrı bir forma gerek olur ki bu da gereksiz yer, yük ve işlem getirir. Ancak bu şekilde yaparak anlatmak istediğim bir başka konu var. Bu web servis yerine başka bir web servis düşünün. Öyle ki bu web servisin iki metodundan biri özel yani sadece üyelere açık, diğeri ise public yani herkese açıktır. İşte bu işlemi bu şekilde iki ayrı metoda bölerek rahatlıkla yapabiliriz. Özel olan metoda önce kullanıcı üye mi değil mi diye üyelik testi yaptırırız. Bu sebeple de sınıfımıza private olan ayrı bir metod daha ekleriz. Bu private metod, gelen kullanıcının üye olup olmadığını kontrol eder. Örneğin boolean türünde olursa true sonuç döndürürse istediğimiz webservisin sonucunu döndürürüz aksi takdirde üye olmadığına dair hata sonucunu döndürürüz.

Bu prosesimizi(web servisimizi) kullanacağımız zaman yani çağırmak için olan prosesimizi yapalım. Aslında bunu bir web sayfası olarak JSP ile yapacağız. Ancak daha öncedende anlattığım gibi web servis genel bir konsept olduğu için her programlama dilinde yapmak mümkündür. Ben sadece örnek olarak JSP kullanacağım.

TempConverter.v1.jsp

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Temp Converter</title>
</head>
<body>
<form
action='http://localhost:8080/WebService/services/TempConverter/FahrenheitToCelsius'
method="post" target="_blank">
<table>
<tr>
<td>Fahrenheit to Celsius:</td>
<td><input type="text" size="30" name="Input"></td>
</tr>
<tr>
<td></td>
<td align="right"><input type="submit" value="Convert"></td>
</tr>
</table>
</form>

<form
action='http://localhost:8080/WebService/services/TempConverter/CelsiusToFahrenheit'
method="post" target="_blank">
<table>
<tr>
<td>Celsius to Fahrenheit:</td>
<td><input type="text" size="30" name="Input"></td>
</tr>
<tr>
<td></td>
<td align="right"><input type="submit" value="Convert"></td>
</tr>
</table>
</form>
</body>
</html>

Ekran Görüntüsü:

Result

Sayfamızı çalıştırdığımızda yukarıdaki gibi bir ekran karşımıza gelecektir. Buraya fahrenheit olarak veya celcius olarak çevirmek istediğimiz rakamı girip convert butonuna bastığımızda karşımıza sonuç gelecektir. Ancak web servis bir xml tabanlı olduğu için sonucumuz da xml formatında gelecektir.

Programımızın ikinci aşamasına gelelim. İkinci programımızın paket adı “edu.burakkk.webservice.tempConverter.v2”dır. Web servisimizi yaratalım.

TempConverter.java


package edu.burakkk.webservice.tempConverter.v2;

/**
 * Web Service
 * Temp Converter
 *
 *@version 1.1 Release 1
 *@author Burak ISIKLI
 *
 **/

public class TempConverter {
 public String Convert(String type, String Input) {
 if (Input.isEmpty() || !isNumber(Input)) {
 return "ERROR! Please enter the input number...";
 }
 // Fahrenheit To Celsius
 if (type.equals("F")) {
 double result = 0;
 result = Double.parseDouble(Input);
 result = (((result) - 32) / 9) * 5;
 Input = Double.toString(result);
 return Input;
 }
 // Celsius To Fahrenheit
 else if (type.equals("C")) {
 double result = 0;
 result = Double.parseDouble(Input);
 result = (((result) * 9) / 5) + 32;
 Input = Double.toString(result);
 return Input;
 }
 return "ERROR! Please enter the input number...";

 }

 private boolean isNumber(String num) {
 try {
 Double.parseDouble(num);
 } catch (NumberFormatException nfe) {
 return false;
 }
 return true;
 }
}

Bu prosesimiz bir öncekinden biraz daha farklı oldu. Bu prosesimizde tek fonksiyonda olayı çözdük. Ancak fahrenheit mı celcius mu olduğunu kısaca hangi tür olduğunu kullancıdan başkan bir değişken isteyerek yaptık. Bu istediğimiz değişkeni formda belirleyerek programa derdimizi anlattık. Böylelikle tek hamlede istediğimiz web servisi yapmış olduk. Aslında benim yaptığım hata döndürme olaylarını da web tarafında yapmak daha doğru olur. Basit bir örnek vermek istediğim için detaylı incelemedim. Formda javascriptle gerekli eklemeler yapılarak hatta ajax kullanılarak çok daha kullanışlı bir sayfa yapmak mümkün olabilir.

TempConverter.v1.1.jsp

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Temp Converter</title>
</head>
<body>
<form
 action='http://localhost:8080/WebService/services/TempConverter/Convert'
 method="post">
<table>
<tr>
<td>Enter the input number: <input type="text" size="30" name="Input"></td>
</tr>
<tr>
<td><input type="radio" name="type" value="F" /> Fahrenheit
 <input type="radio" name="type" value="C" checked /> Celsius</td>
</tr>
<tr>
<td align="left"><input type="submit" value="Convert"
 class="button"></td>
</tr>
</table>
</form>
</body>
</html>

Ekran Görüntüsü:

Result-245 Celcius’u Fahrenheit’e çevirmek istediğimizde karşımıza gelen ekran şu şekilde olacaktır.

Ekran Görüntüsü:

Result-3

Programların Kullanım Alanları

Posted in Miscellaneous by Burak IŞIKLI on 29 Temmuz 2009

Hayatımıza son yıllarda çok fazla çeşitte kendi alanlarında özelleşmiş programlar girdi. Ancak biz bu programların kullanım alanlarının neler olduğunu bilmeden ve bazen yanlış yerlerde yanlış amaçla kullanıyoruz.  Bu nedenle bu yazımda bazı özellikle web tasarımıyla ilgili programların nerelerde ne amaçla kullanıldığını sırayla yazıyorum.Ve başlıyorum…

Adobe Dreamweaver: Web tasarımında kullanılıyor. Daha çok kodlamaya yönelik avantajlar sağlayan bu programımızda aynı zamanda görsel olarak web sayfaları da hazırlayabiliyoruz. Hepimizin bildiği zamanında kullandığı Frontpage’in gelişmiş versiyonu olarak da düşünebiliriz.

Adobe Flash: Özellikle animasyon yapanların vazgeçemeyeceği bir program. Animasyonlara çok güzel ve kolaylıkla hareket verebilen action script denilen kendine özgü bir de programlama diliyle de geliştirilebilen bir programdır. Zamanında çok tutan “Karete Kamil”, “Karşı takım taraftarını yumruklama” gibi projelerin yapıldığı bu programda aynı zamanda şu anda hayatımızda olan grafi2000 ve atv’de halen yayımlanmakta olan “harbi tivi” adlı programın animasyonları da bu programla yapılmaktadır.

Adobe Illustrator: Broşür, kapak türü tasarım yapanlar için ideal bir program. Amacı kapsamlı vektör grafiği geliştirmektir.

Adobe Photoshop: Namı çok duyulmuş “fotoşop” programı. Resimleri değiştirmek hatta modifiye edip olmayan bir durum yaratmada kullanıldığını düşündüğümüz ve bunu düşündüren filmlerin aslında yanıldığını biliyor musunuz? Bu programın aslında 3D grafik tasarımı için dizayn edilmiştir 🙂

Adobe Fireworks: Özellikle web sitelerinde kullanılan bu program grafik dizayn ve web sitesi için prototip tasarlamada kullanılıyor.

Device Control: Mobil aygıtlarda veya mobil içerikte tasarım yapmak ve ön görünüm almak için bu program kullanılıyor.

Bridge: Medya yönetimi veya diğer bi deyişle dosya yönetimini sağlıyor.

Version Cue: Özellikle web sitelerindeki versiyon kontrolünde kullanılıyor. Bir tür versiyon kontrol sistemidir.

Asal Sayı(Prime Number) Algoritması:

Posted in Algorithm, C/C++ by Burak IŞIKLI on 24 Temmuz 2009

Bir forumda gördüğüm konu üzerine ufak bir araştırma yaptım. Konuda asal sayıların bulma algoritmasının nasıl olacağı soruluyordu. Bu soru iki şekilde anlaşılabilir. Birincisi verilen sayının asal sayı olup olmadığı, ikincisi ise verilen sayı aralığındaki bütün asal sayıların bulunmasıdır. Öncelikle asal sayının ne olduğunu hatırlayalım.

Asal sayılar’, yalnız ve yalnız iki böleni olan doğal sayılardır. Kendisinden ve 1 sayısından başka böleni olmayan, 1’den büyük pozitif tam sayılar biçiminde de tanımlanmaktadır.(kendisinden küçük asal sayıların hiçbirine tam bölünmeyen sayılardır) Yüzden küçük asal sayılar 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89 ve 97 dir. Tam listesi için burayı tıklayın.

Şimdi birinci algoritmamızı yapalım. Bu algoritmada tanımdan gidiyoruz. “Sayı kendisinden ve 1’den başka sayıya bölünemez”. Boolean fonksiyonu ve for döngüsü yardımıyla herhangi bir sayıyı bölündüğünü yakaladığımız takdirde false döndürerek asal sayı olmadığına karar veriyoruz. Bu algoritmanın çözüm karmaşıklığı O(n)’dir.

Prime.cpp

/*
 * Process:  Prime Number
 * Programmer: Burak ISIKLI
 *
 */

#include<iostream.h>

bool isPrimeNumber(long int num);

int main() {
 long int number;
 cout << "Find primes: ";
 cin >> number;

 if (isPrimeNumber(number))
 cout << endl << number << ", is a prime number" << endl;
 else
 cout << endl << number << ", isn't a prime number" << endl;

 return 0;
}

bool isPrimeNumber(long int num) {
 for (long int i = 2; i < num; i++) {
 if (num % i == 0)
 return false;
 }
 return true;
}

Bu prosesimiz bize Çözmek istediğimiz sayıyı soruyor. Öğrenmek istediğimiz sayıyı girdiğimizde sayının asal olup olmadığını söylüyor.

Peki ama bu algoritmayı daha verimli yapamaz mıyız? Elbette yapabiliriz. Eğer n sayımızın şu şekilde bir fonksiyon aralığında olduğunu düşünürsek d (1 < d < n) ve bu fonksiyonun tamamının karekökünü alırsak d0 (1 < d0 < √n) şeklinde bir fonksiyon elde ederiz. Eğer n sayımızın tamamen karekökü alınabiliyorsa mükemmel karedir ancak asal değildir. Aksi halde farzedelimki ilk bulduğumuz bölüm d1,  √n < d1 < n olsun. Ama n, √n’den az olan d2 = n / d1 tarafından tamamen bölünüyor. Bu nedenle tahmin yanlıştır ve eğer √n’den daha büyük bir bölen varsa o zaman çifti √n’den azdır. Böylelikle ifademiz kanıtlanmış oldu.

Son olarak kodumuzu vermeden bir iyileştirmeden daha bahsetmeliyim. Farz edelimki n tek bir sayı(2 bölen olamaz) olsun. Eğer n 2’ye kalansız bölünemiyorsa başka hiçbir çift sayıya tamamen bölünemez. İşte bu iyileştirmeden sonra değişen algoritmamız ve prosesimiz şu şekilde oluyor:

Prime.v2.cpp

/*
 * Process:  Prime Number
 * Programmer: Burak ISIKLI
 *
 */

#include<iostream.h>
#include<math.h>

bool isPrimeNumber(long int num);

int main() {
 long int number;
 cout << "Find primes: ";
 cin >> number;

 if (isPrimeNumber(number))
 cout << endl << number << ", is a prime number" << endl;
 else
 cout << endl << number << ", isn't a prime number" << endl;

 return 0;
}

bool isPrimeNumber(long int num) {
 if (number == 2)
 return true;
 if (number % 2 == 0)
 return false;
 for (long int i = 3; i <= (long int) sqrt((double) num); i++) {
 if (num % i == 0)
 return false;
 }
 return true;
}

Bu algoritmamızın iyileştirmelerden sonraki çözüm karmaşıklığı O(√n / ln(n)) oldu.

İkinci algoritma girilen sayı aralığına kadar asal sayıları listeleme. Aslında bunun için özelleşmiş spesifik bir algoritma mevcut. “Sieve Algoritması” adı verilen algoritmanın çözüm karmaşıklığı O(n1 / 2loglogn / logn)’dir.

Sieve.cpp


/*
 * Process:  Prime Number - Sieve Algorithm
 * Programmer: Burak ISIKLI
 *
 */

#include <iostream.h>
#include <math.h>
#include <assert.h>
#include <time.h>

int main() {
 int i;
 clock_t start, stop;
 double t = 0.0;
 cout << "Find primes up to: ";
 cin >> i;

 assert((start = clock())!=-1);

 //create prime list
 int prime[i];
 int c1, c2, c3;

 //fill list with 0 - prime
 for (c1 = 2; c1 <= i; c1++) {
 prime[c1] = 0;
 }

 //set 0 and 1 as not prime
 prime[0] = 1;
 prime[1] = 1;

 //find primes then eliminate their multiples (0 = prime, 1 = composite)
 for (c2 = 2; c2 <= (int) sqrt(i) + 1; c2++) {
 if (prime[c2] == 0) {
 c1 = c2;
 for (c3 = 2 * c1; c3 <= i + 1; c3 = c3 + c1) {
 prime[c3] = 1;
 }
 }
 }

 stop = clock();
 t = stop - start;

 //print primes
 for (c1 = 0; c1 < i + 1; c1++) {
 if (prime[c1] == 0)
 cout << c1 << "\t";
 }
 cout << endl << "Run time: " << t << endl; //print time to find primes

 return 0;
}

Bu prosesimiz bize hangi sayıya kadar bulmak istediğimizi soruyor. Sayıyı girdiğimiz takdirde asal sayıları listeleyip çalışma süresini yazıyor.

Asal sayılar özellikle şifreleme(cryptography) alanında sıkça kullanılan bir konudur. Örneğin bizden 100 basamaklı asal sayı üretilmesi istense, görünüş olarak algoritmamız iyi bir zamanda sayıları kontrol edemez. İşte bu nedenle bizim algoritmamız pratikte kullanılmak amacıyla uygulanmıştır. Ancak büyük sayıların asal olup olmadığını test etmek istediğimizde olasılıksal algoritma(probabilistic algorithm) kullanılır.

Kaynaklar:

http://tr.wikipedia.org/wiki/Asal_say%C4%B1

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

http://www.dreamincode.net/code/snippet3315.htm

http://mathworld.wolfram.com/PrimeNumber.html

http://www.algolist.net/Algorithms/Number_theoretic_algorithms/Sieve_of_Eratosthenes