10 Nisan 2010 Cumartesi

İlginç Bir Şey - 1

Herkese merhaba;

Aslında genelde teknik şeyler yazıyorum ancak ilginç bir şeyler gördüğümde de paylaşmaya karar verdim. :)
Hani mesela biri bana mı bakıyor acaba diyi arkanızı dönersiniz, ya da tedirgin olursunuz noluyo? tarzında arkanıza bakarsınız o olay hakkaten varmış :) İlginizi çekebilecek bir yazı var burada.

Herkese iyi günler :)

6 Nisan 2010 Salı

Jena Tutorial

Herkese merhaba;

Jena, Java için RDF ve RDF graphları oluşturabileceğimiz bu graphlar üzerinde SPARQL sorguları yapabileceğimiz ya da bütün bu hepsinin kombinasyonlarını yaratmamızı sağlayan  ve kural-tabanlı çıkarsama motoruna(rule-based inference engine) sahip bir semantic web uygulama platformudur. Şimdi bu platformu projelerimize nasıl ekleriz ona bakalım.Öncelikle bu adresten Jena'yı indiriyoruz.

Şimdi boş bir proje açalım





Şimdi projemize sağ tıklayım Build Path'ine kütüphaneyi ekleyelim





Evet projemizde Jena 'yı görüyosak aşağıdaki gibi başarıyla ekledik demektir:)


Daha sonraki yazılarımda bir model oluşturma model üzerinden sorgu yapma gibi konulara da değineceğim.

Herkese kolay gelsin:)

5 Nisan 2010 Pazartesi

Twine Sunumum

Herkese Merhabalar;

Bu dönem aldığım seçmeli derslerden çok memnun olduğumu söylemem gerekiyor :). Aldığım teknik seçmeli ders olan Ontoloji Mühendisliği 'nde vize yerine geçecek olan sunumumu bugün yapmış bulunmaktayım. Beklediğimden daha eğlenceli geçtiğini söylemeliyim. Dersi alan herkes bu adresteki 10 semantic web uygulamasından birini araştırıp teknolojisi hakkında sunum yaptı. Bana düşen ise içlerindeki tek semantic network olan Twine 'dı. Çok yararlı şeyler öğrendiğimi söylemeliyim özellikle Web 2.0 'dan Web 3.0 'a geçişi ve sosyal uygulamaların bundan nasıl etkilendiğini anlatmaya çalıştım. Ve Twine 'ın nasıl kullanıldığına ne olduğuna neler ürettiğine değinmeye çalıştım. Diğer arkadaşlarımın sunumları da çok eğlenceli ve çok bilgilendiriciydi. :) Hepsini tebrik ediyorum.

Not : Semantic web ucundan, kıyısından ya da sadece uzaktan bakan birisini bile etkileyebilecek bir konu bence araştırmadan geçmeyin :)

Herkese bol "anlamlı" günler :)

30 Mart 2010 Salı

Checking password strength with AJAX TK

Herkese merhabalar;

Bildiğiniz gibi günümüzde artık internet hesaplarımızda şifremizi kimseye söylememe çok da aşılamayan bir güvenlik tedbiri değil:). Şifrelerimizin de güçlülük derecesi çok önemli bir konu haline geldi.
Peki web uygulamalarımızda kullanıcıları daha güçlü şifreler yaratmaya nasıl zorlarız? Bunun cevabı AjaxControlToolkit içersindeki PasswordStrength kontrolünde saklı. Lafı fazla uzatmadan bu kontrolün özelliklerine bir bakalım;
  • HelpStatusLabelID : Girilen şifre için bazı kurallar belirleyeceğimiz için hangi kurallar sağlandı hangileri sağlanmadı onu görüntüleyeceğimiz label'in ID'si.
  • MinimumNumericCharacters : Şifrede en az kaç rakam olacağını belirliyoruz.
  • MinimumSymbolCharacters : Şifrede en az kaç alpha-nümerik karakter olacağını belirliyoruz.
  • MinimumUpperCaseCharacters : Şifrede en az kaç büyük harf olacağını belirliyoruz.
  • MinimumLowerCaseCharacters : Şifrede en az kaç küçük harf olacağını belirliyoruz.
  • DisplayPosition : Şifremizin gücü şifrenin neresinde gösterilsin.(RightSide | LeftSide)
  • PreferredPasswordLength : Şifremizin en kısa uzunluğu
  • RequiresUpperAndLowerCaseCharacters : Şifremiz küçük ya da büyük harf gerektiriyor mu? Eğer bu kontrolü false yaparsak MinimumUpperCaseCharacters ya da MinimumLowerCaseCharacters set etmemizin bir anlamı olmaz.
  • StrengthIndicatorType : Şifrenin gösterim şekli nasıl olsun belirler.(Text | BarIndicator)
  • TargetControlID : Şifremizin bulunduğu kontrolün ID'si.
  • TextStrengthDescriptions : Şifremiz için tanımladığımız kuvvet değerleri.
  • PrefixText : Şifremizin tanım değerleri için başlık belirleyebiliriz

Hemen bu kontrolün kullanımına bir göz atalım. Öncelikle AjaxControlToolkit.dll projemize referans edelim.

Sonra .aspx dosyamıza geçip ilgili assambly 'yi oraya da referans edelim.



4 <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>


Daha sonra kontrolümü ekleyelim ve gerekli sahaları tanımlayalım.

15 <ajaxToolkit:ToolkitScriptManager ID="script1" runat="server" />

16 <asp:Label ID="lbl" runat="server" Text="Şifrenizi Giriniz!">asp:Label>

17 <asp:TextBox ID="password" runat="server">asp:TextBox>

18 <br />

19 <asp:Label ID="strength" runat="server">asp:Label>

20 <ajaxToolkit:PasswordStrength
ID="PasswordStrength2" runat="server"

21 HelpStatusLabelID="strength"

22 MinimumNumericCharacters="1"

23 MinimumSymbolCharacters="1"

24 MinimumUpperCaseCharacters="1"

25 MinimumLowerCaseCharacters="1"

26 DisplayPosition="RightSide"

27 PreferredPasswordLength="8"

28 RequiresUpperAndLowerCaseCharacters="True"

29 StrengthIndicatorType="Text"

30 TargetControlID="password"

31 PrefixText="Şifre Gücü : "

32 TextStrengthDescriptions="Çok zayıf;Zayıf;Orta;Güçlü;Çok güçlü">

33 ajaxToolkit:PasswordStrength>



Şimdi browse edelim bakalım.


İstenilen bütün özellikleri tamamlayalım.

Görüldüğü üzere bizim istediğimiz özellikleri tamamladıkça kullanıcı şifresi de o kadar güçlü oluyor.

Herkese kolay gelsin :)

10 Mart 2010 Çarşamba

Regular Expressions in .Net Framework

Herkese merhabalar;

Regular expressions(düzenli ifadeler) bize textlerimizi üzerinde esnek ve güçlü kontroller yaratmamızı sağlıyor.Tasarladığımız desenler,string kullanan,dışardan veri alan uygulamalar için çok değerli bir tool olacaktır.Regex sınıfını kullanmak için önce kodumuza

System.Text.RegularExpressions

isim uzayını eklememiz gerekiyor.Kullanıma bir örnek şöyle;

34 public static bool checkExpression(string sentence)

35 {

36 string expression = "MyExpression";

37 Regex regex = new Regex(expression);

38 return regex.IsMatch(sentence);

39 }


Şimdi regular expression yazarken kullanacağımız karakterlere göz atalım.

"." karakteri :
Bu karakter kesinlike bir karakter yerine geçer.Örneğin;
İfademiz "a.b" olsun.Bu ifade textimizde solunda "a" ve sağında "b" olan 1 karakter arar.Yani textimiz "acb" olsaydı true döndürecekti."acnb" olsaydı false döndürcekti.

"$" karakteri :
Bu karakter textin sonunu ifade eder.Örneğin;
İfademiz "abc$" olsun.Bu ifade textimiz eğer "....abc" ile biterse true döndürür.

"^" karakteri :
Bu karakter textin başını ifade eder.Örneğin;
İfademiz "^abc" olsun.Bu ifade textimiz eğer "abc..." ile başlıyorsa true döndürür.

"*" karakteri :
Bu karakter bir önceki karakterden 0 ya da sonsuz tane gelebilir der.Örneğin;
İfademiz "zbc*" olsun.Bu ifade textimizde "zb" "zbc" "zbcccc" ifadesi varsa true döndürür.

"[]" karakteri :
Bu karakter bir liste içinden 1 tanesini seçer.Örneğin;
İfademiz "x[cv]b" olarak kullanılırsa textimizde "xvb" ya da "xcb" varsa true döndürür.
Eğer [a1-a2] olarak kullanılırsa. Mesela a[0-9]b olarak kullanılırsa textimizde "a0b"varsa true döndürür.Ancak "a09b" yi false döndürür.
Eğer [^a1-a2] olarak kullanılırsa.Mesela [^38a-z] olarak kullanılıtsa textimiz 3 ve 8 ile başlayamaz ama küçük harfle devam etmelidir.Textimiz "3t" ya da "8g" olsaydı false döndürecekti.

"()" karakteri :
Bu karakter ifadeleri gruplamakta kullanılır.Yukardaki ifadeleri gruplayarak kombinasyonlar elde etmemizi sağlar.Örneğin;
İfademiz "[0-9](ab)*" olsun.Textimiz şöyle olabilir."5" "5ab" "5ababab".

"|" karakteri :
Bu karakter bildiğimiz gibi "or" işareti.Örnek;
İfademiz "[Öyle | Böyle] de farketmez" olsun.Textimiz "Öyle de farketmez" ya da "Böyle de farketmez" olabilir.

"+" karakteri :
Bu karakter solundaki ifadeden 1 ya da daha fazla var demektir.Örneğin;
İfademiz [0-9](ab)+ olsun.Textimiz şöyle olabilir."5ab" "5ababab".

"?" karakteri :
Bu karakter bir karakteri ya da bir texti ifade edebilir.Solundaki karakterden ya da textten olabilir de olmayabilir de demektir.Örneğin;
İfademiz "C(ab)?D" olsun.Textimiz şöyle olabilir."CD" ya da "CabD".

"{}" karakteri :
Bu karakter kendisinden önceki ifadenin kaç kere kullanılabileceğini gösterir.Örneğin;
İfademiz A[0-9]{3} olsun.Textimiz "A056" ya da "A692" olabilir.Ya da ifademiz ba{3,4} olsun.Textimiz "baaa" ya da "baaaa" olabilir.

Hekese kolay gelsin :)

8 Mart 2010 Pazartesi

Linq to RDF

Herkese merhabalar;

Linq to RDF bize kodumuz içinde semantic query'ler yapmamızı sağlıyor.Temel olarak Linq to SQL'e benziyor.Farkı ise sorgularımızı SQL sorgularına değil SPARQL sorgularına çeviriyor.DOTNET entegrasyonu olduğu için aynı zamanda C# gibi bir güzelliğe sahip:) RDF(Resource Description Framework) dosyalarını LinqToRDF 'e eklediğimizde aynı zamanda UML notasyonu olarak da görebiliyoruz.Şu anda visual studio 2008 'e entegre çalışıyor.Buradan download edebilirsiniz.Daha geniş bilgi için de buraya bakabilirsiniz.

Herkese kolay gelsin:)

27 Şubat 2010 Cumartesi

Threads - Multithreading

Herkese merhabalar;

Bu yazımda multithreading'e değinmeye çalışacağım.Bildiğiniz gibi multithreading i destekleyen diller aynı anda birden fazla taskı çalıştırabiliyorlar ya da aynı taskı birden fazla thread e paylaşarak performans sağlayabiliyorlar.Basit bir Java uygulamasıyla da konuyu pekiştirmeye çalışalım..Benim uygulamam matrix çarpımı üzerine olacak.
Matrix çarpımıyla ilgili gerekli bilgiyi buradan alabilirsinizNormalde tahmin edebileceğiniz gibi sonuç matrixini iç içe for döngüleriyle elde edebilirdik.Ama bizim yapacağımız şey şöyle olacak. NxM 'lik matrixi MxK 'lik matrisle çarpmak istiyoruz.Soldaki matrixi satırlara böleceğiz ve her satırımızı sonuç matrixini oluşturmak için thread 'lere dağıtacağız.Lafı fazla uzatmadan uygulamaya geçeyim:)

public class MyThread extends Thread {
int[][] row;
int[][] coloum;
int index;
public MyThread(int[][] _row, int[][] _coloum, int _index) {
this.row = _row;
this.coloum = _coloum;
this.index = _index;
}
@Override
public void run(){
compute(this.row, this.coloum);
}
public void compute(int[][] _row, int[][] _coloum){
for (int i = 0; i < class="Apple-style-span" color="#000099">length; i++) {
TestClass.resultMatrix[index][0] += _row[0][i] * _coloum[i][0];
}
}
}

Şimdi ne yaptığımıza bir göz atalım.Ben çarpımın sağındaki matrixini Nx1'lik seçtim.Sonuç matriximiz de doğal olarak bir sütun gelecek.Thread 'lere yolladığımız satırları sonuç matrixinin aynı indexteki satırını hesaplamasını istiyoruz.Şimdi kodumuzu test edelim.

public class TestClass {

public static int[][] resultMatrix = new int[3][1];
public static void main(String[] args) {
final int[][] A = {
{1,2,3},
{3,4,1},
{5,2,3}
};
final int[][] B = {
{4},
{3},
{2}
};
MyThread t;
for (int i = 0; i <>
int[][] localRow = new int[1][3];

for (int j = 0; j <>
localRow[0][j] = A[i][j];
}

t = new MyThread(localRow, B, i);
t.start();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < resultMatrix.length; i++) {
System.out.println(resultMatrix[i][0]);
}
}
}

Burada dikkat etmemiz gereken nokta main fonksiyonun da bir thread olduğudur.Bildiğiniz gibi join işlemi thread 'lerde schedule ve priority yönetiminde kullanılır.Burda join kullanmasaydık yarattığımız thread 'ler işlemlerini yaparken main fonksiyonu da aynı anda resultMatrix 'i ekrana basmaya çalışacaktı.Böylece ortaya yanlış bir sonuç çıkacaktı.Biz thread 'leri join 'leyerek main fonksiyonun bizim yarattığımız thread 'lerin çalışmasını beklemesini sağladık.Çalıştıralım ve sonucu görelim.


Herkese kolay gelsin :)

26 Şubat 2010 Cuma

Directing to web pages in a desktop application

Herkese merhabalar;

Size console uygulamalarında web sayfalarını nasıl açabileceğimizi göstereceğim.

Java kodu

import java.awt.Desktop;
import java.net.URI;

public abstract class TestClass {
public static void main(String[] args) {
Desktop d;
URI u;
try {
u = new URI("http://www.eclipse.org/");
d = Desktop.getDesktop();
d.browse(u);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}

C# Kodu

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Process.Start("
http://www.bing.com/");
}
}
}


Herkese kolay gelsin :)

18 Şubat 2010 Perşembe

Threads - Synchronizing Threads

Herkese merhabalar;

Bu yazımda Thread 'lerimizi nasıl senkron ederiz buna değinmeye çalışacağım.Thread 'lerin senkronlanması çok önemli bir konudur. Thread 'lerle ilgili ilk yazımı okuduysanız Thread 'lerin kendilerine ayrı bellekleri olmadığını ve ortak bir bellek sahası kullandıklarını biliyoruz.Bu ortak bellekleri kullanan Thread 'lerin senkronizasyonunu anlatmaya çalışacağım.

Shared data kullanan Thread 'ler ortak veriye erişmek için yarış halindedirler.Bu duruma race condition denir.Bu race condition 'un çözülmesi önemli bir problemdir. Java bize bu problemi çözmek için syncronized anahtar kelimesini sağlıyor.Thread 'lerin ortak kullandığı kod bölgelerine critical section da denir.Critical section 'larda bu anahtar kelimeyi kullanmak mutex lock algoritmasından başka birşey değildir.Buradan bilgi alabilirsiniz.

Şimdi bir örnek üzerinde kavramları da açıklayarak konuyu anlamaya çalışalım. Örneğimiz şöyle olsun.Bir banka hesabımız olsun bu banka hesabından para çekmek isteyen Thread 'lerimiz olsun.Ve para çekme koşulumuz da tabii ki çekilmek istenen paranın banka hesabında olması olsun.

public class Account {

public float total = 0;
public Account() {}
public synchronized boolean drawCash(float amount){
if (total > amount) {
System.out.println("Aktif thread = "+Thread.currentThread().getName())
total = total- amount;
return true;
}
else
return false;
}
}

public class MyThread extends Thread {

private Account myAccount;
private float amount;
public MyThread(Account _myAccount,float _amount) {
setMyAccount(_myAccount);
this.amount = _amount;
}

@Override
public void run(){
if (getMyAccount().drawCash(this.amount)) {
System.out.println(this.getName()+"->Değişikliği yaptı. Total ="+getMyAccount().total+"Amount ="+this.amount );
}
else {
System.out.println(this.getName()+"->Değişikliği yapamadı."+"Total ="+getMyAccount().total+"Amount =" +this.amount);
}
}

public void setMyAccount(Account myAccount) {
this.myAccount = myAccount;
}

public Account getMyAccount() {
return myAccount;
}
}
Evet ne yaptığımıza bakalım.Thread 'lerimiz banka hesabımızı ortak kullanıyor olacaklar.Ve burda kritik bölgemiz threadlerimizin ortak kullandığı data olan total değişkeni üzerinde değişiklik yapan metod olan drawCash metodu kullanmak için bir yarış halinde olacaklardır.Ancak drawCash işlemi içinde bir koşul barındırıyor.Bu da çekilmek istenen paranın hesabımızda mevcut olması durumudur.İşte kritik nokta burada başlıyor.Eğer threadler aynı anda bu bölgeye ulaşırsa ve threadlerin istediği toplam para hesabımızda yoksa ne yapacağız?Bu problemimizi syncronized anahtar sözcüğü çözüyor.:) MyThread sınıfımızda ise yarattığımız threadler Account'umuzdan para düşmeye çalışcaklar.

Şimdi yazdığımız kodu test edelim.

public class TestClass {

public static void main(String[] args) {
Account myAccount = new Account();
myAccount.total = 150;
MyThread t1 = new MyThread(myAccount, 100);
t1.setName("Thread 1");
MyThread t2 = new MyThread(myAccount, 75);
t2.setName("Thread 2");
t1.start();
t2.start();
}
}

Kodu çalıştırdığımızda threadlerin hangisi critical section'a erken ulaşırsa ilk onun istediği para hesabımızdan düşecektir.Yani 2 farklı çıktı elde edeceğiz.Bunun sebebi ise aynı hiyerarşide olan ve aynı anda çalıştırılan threadlerin çalışma süresi ve sırası nondeterministic'tir.

1.Çıktı->
Aktif thread = Thread 2
Thread 2->Değişikliği yaptı. Total =75.0Amount =75.0
Thread 1->Değişikliği yapamadı.Total =75.0Amount =100.0
2.Çıktı->
Aktif thread = Thread 1
Thread 1->Değişikliği yaptı. Total =50.0Amount =100.0
Thread 2->Değişikliği yapamadı.Total =50.0Amount =75.0

Görüldüğü üzere critical section'da aynı anda sadece bir tane thread aktif olabiliyor.Böylece banka hesabımızda
yanlış bir durumdan kaçınmış oluyoruz.Ve şimdi Account sınıfımızda drawCash metodumuzdaki syncronized
anahtar kelimesini kaldıralım ve neler oluyor görelim.

Çıktı->
Aktif thread = Thread 2
Aktif thread = Thread 1
Thread 2->Değişikliği yaptı. Total =-25.0Amount =75.0
Thread 1->Değişikliği yaptı. Total =50.0Amount =100.0

Bir gariplik var gibi değil mi?..:) Bir hesabımızdaki paranın çekilmek istenen paradan büyük olması
koşulunu parayı çekmek için koyduk ama total = -25 gelmiş.Ve dikkatinizi çektiyse aynı anda
critical section'da threadlerimizin ikisi de aktif.İşte bu yüzden threadlerin senkron edilmesi
çok önemli bir konudur.

Önemli Not : Çıktıları elde etmek için bir kaç defa kodunuzu çalıştırmanız gerekebilir.
Çünkü daha önce de söylediğim gibi aynı anda çalıştırılan ve aynı hiyerarşiye sahip
threadlerin çalışması nondeterministic olduğu için bir kaç defa aynı çıktıyı elde edebilirsiniz.


Herkese kolay gelsin :)

14 Şubat 2010 Pazar

Threads - Creating Threads

Herkese merhaba ;

Size Java threadlerinin nasıl yaratıldığını, nasıl kullanıldığını anlatmaya çalışacağım.Threadleri kullanmanın 2 temel yolu vardırYa Thread sınıfından bir instance yaratarak kullanabiliriz.Ya da thread tasklarını bir başka sınıfa abstract olarak geçirerek.

Aşağıda Thread tasklarını başka sınıflara geçirerek kullanmanın 2 farklı yolu gösterilmiştir.
Neden 2 farklı şekilde task aktarımı var derseniz.Eğer programınızda GUI kullanmanız gerekirse sınıfınız Frame sınıfından türemek zorundadır ya da bir kalıtım hiyerarşisi içindeki sınıfta Thread kullanmak isteyebilirsiniz.Böyle durumlarda ilgili sınıflara Runnable interface'ini implement etmeniz gerekir.İki kullanımın tek farkı burdur.

public class MyThread extends Thread {

@Override
public void run(){
//Foo
}
public static void main(String[] args) {
new MyThread().run();
//Ya da new MyThread().start();
}
}

ya da

public class MyThread implements Runnable {

@Override
public void run(){
//Foo
}
public static void main(String[] args) {
new MyThread().run();
}
}

Bir Threadin Yaşam Döngüsü
Threadler 3 farklı durumda olabilir.
New Thread : Bu durum ilklenmeden sonra start() metodu çağırılmadan önceki durumdur.
Alive Thread : Bu durum start() metodu çağırıldıktan sonraki durumdur.Bu durum da kendi içinde 2 duruma ayrılır.
-> Runnable : Çalışma halidir.Bu durumda thread ya çalışıyordur ya da çalışmak için sırasını bekliyordur.
-> Blocked : Çalışmaya hazır olmadığı durumdur.Bu durumdan çıkılabilecek koşullar sağlandığında runnable'a geçebilir
Dead Thread : run() metodu tamamlandığındaki durumdur.Bu state e giren thread tekrar çalıştırılamaz.

Thread Sınıfının Çok Kullanılan Metotları
start() : Thread,New durumundır ve bu metot threadi Alive durumuna sokar.Threadi çalıştırır.
stop() : Thread,Runnable durumundır ve bu metot threadi Blocked durumuna sokar.Threadin çalışmasını durdurur.
join() : Thread, Runnable durumundır ve threadi Blocked durumuna sokar ve thread başka bir threadin bitmesini bekler.Diğer thread çalışmasını bitirince tekrar Runnable durumna girer.
interrupt(): Thread,Runnable durumundır ve threadi Blocked durumuna sokar.Ve threadin tekrar Runnable durumuna geçmesi için programcı tarafından resume() edilmesi gerekir.
isAlive(): Thread Alive durumunda ise bu metot true döndürür.
isInterrupt(): Interrupt flagi set edilmişse true döndürür.

Şimdi bir basit örnek çözelim. Bir counter tutalım sürekli 10'a kadar sayıp başa dönsün.

public class MyThread extends Thread{

int seconds = 1;
@Override
public void run(){
for(;;){
System.out.println("seconds : "+seconds);
if (seconds == 10) {
System.out.println("Başa dön!");
seconds = 0;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
seconds++;
}
}
public static void main(String[] args) {
new MyThread().start();
}
}

Herkese kolay gelsin :)