Veritabanlarında birincil anahtarlar ve float veri tipi

Veritabanlarında tablolar oluştururken birincil anahtar belirleme gereği duyarız. Bu pek çok defa işimize yarayacak, hataları azaltacak ve veriye olan erişimimizi hızlandıracaktır.

Birincil anahtar tanımlarken, veritabanı size artışsal tekil anahtarlar(incremental unique key) tanımlayabilme, böylece kod içerisinde anahtarlarla hiç uğraşmama şansı tanıyor. Bu yaklaşım işi oldukça kolaylaştırsa da; ileride yapılacak olan veritabanı yedeklemesi, veritabanının veya belli tabloların kurtarılmaya çalışılması, verilerin taşınması gibi işlemleri büyük ölçüde zorlaştırıyor.

Bu nedenle artışsal birincil anahtar tanımlarını sadece olaylar, tarihçe veya değişmez verileri içeren, çok da önemli olmayan tablolarda kullanmaya çalışıyorum. Yüksek öneme sahip tablolarımda ise, gelen verilerden bir veya birkaçını referans kabul ederek, gerekiyorsa bunlrı birleştirip, örneğin hex değerlerini alıp kendim bir tekil anahtar oluşturma yoluna gidiyorum. Böylece aynı anahtarı, tablomdaki veri tamamen silinse bile yeniden oluşturabiliyorum ve diğer tablolarla veri bütünlüğünü kaybetmemiş oluyorum. Veri yedekleme, taşıma ve kurtarma sırasında da çok işime yarıyor.

Yine bir projede bu mantıkla hareket edip, kendi tekil anahtarlarımı yaratmaya başladım, ama oluşan anahtarlar, referans aldığım verilerin uzun olması nedeniyle 15 hanelik sayılar olarak ortaya çıktı. Daha önce hiç float birincil anahtar denememiştim, bir deneyelim bakalım dedim ve float olarak tanımlarımı yaptım.

Proje bitti, iki ay kullanıldı. Sonra bir gün bilgiler yarım geliyor dediler. Kodu açtık ve hatayı bulduk: tekil anahtarlar artışsal bir referansa da bağlı olduklarından, veri artışı olunca 15 hane olarak öngördüğüm anahtar uzunluğu 16 haneye çıkmış, float veri tipi 15 haneden sonrasında bilimsel gösterim (scientific notation) e geçtiği ve "E+" şeklinde bir gösterim uyguladığı için benim sorgular çalışmaz hale gelmişti. Kod içerinde yaptığım "toString", veri tipi dönüştürme (casting) gibi işlemler de sorunu çözemedi. İşin acil bitmesi gereklili ile en son bulduğum çözüm yolu veri tipini "decimal" olarak değiştirmek oldu. Neyseki proje çok büyük değildi bir kaç saatte bitirdim.

Xj3D Kurulumu ve Projelerde kullanımı

Xj3D Web3D konsorsiyumunun X3D içeriği yaratmak için kullanılan araç kutusu projesidir. Tamamen java ile yazılmıştır. Bu araç kutusu kullanılarak X3D içeriği kendi uygulamamıza yükleyebileceğimiz gibi, tam bir tarayıcı yaratmak için de kullanabiliriz. Xj3D'nin temel kullanım alanı SAI ("Scene Access Interface" Sahne Erişim Arayüzü)'yi kullanarak programlarımızda kendimize ait bir tarayıcı kullanmak ve X3D ve VRML sahnelerimizi kullanıcıya göstermektir. Xj3D 3B özelliklerinin programlara eklenmesini kolaylaştırmak için üretilmiştir. Xj3D'yi Java'da kullanarak farklı platformlarda çalışabilen 3B uygulamaları geliştirilebilir.

Geliştirme yapabilmek için Xj3D'yi kurmak ve projemizin classpath'ine gerekli jar dosyalarını eklemek gerekmektedir. Kurulum (Windows) ve Eclipse projelerinde classpath ekleme işi aşağıdaki adımlardan oluşmaktadır:

  1. Şuradan en son sürümü indiriyoruz.
  2. Çift tıklayarak çalıştırıyoruz (Eğer jar dosyasını indirdiniz ve çift tıklayınca çalışmazsa komut satırında java -jar DosyaninIsmi.jar şeklinde çalıştırabilirsiniz)
  3. Next-Next diyerek kurulumu tamamlamasını sağlıyoruz.
  4. Eclipse'te yarattığımız projeye sağ tıklayıp Properties->Java Build Path->Libraries sekmesini açıyoruz.
  5. Bu sekmede Add External Jars diyerek j3D kurulum dizini altındaki jars dizinindeki tüm jar dosyalarını ekliyoruz. (Kurulum dizini c:\Program Files\Xj3D ise C:\Program Files\Xj3D\jars\ altındaki tüm jar dosyalarını)
  6. Artık projemizde Xj3D SAI kullanabiliriz.
Dünyayı Yüklemek
Bu örnekte basit bir dosya yükleyicisinin nasıl yazılacağını öğreneceksiniz. X3D tarayıcısının yaratılma temellerinden başlayıp dosyanın nasıl yükleneceği anlatılacaktır.
3B Penceresini Eklemek
3B Penceresini uygulamanıza eklemek kolaydır. SAI BrowserFactory sınıfını kullanarak X3D bileşenini yaratırsınız. Daha sonra bu bileşeni uygulamanıza eklersiniz. Aşağıdaki kod bu adımları göstermektedir:
import org.web3d.x3d.sai.*;
public class SimpleSAIDemo extends JFrame {
 public SimpleSAIDemo() {
 Container contentPane = getContentPane();
 // SAI bilesenini yaratalim
 X3DComponent x3dComp = BrowserFactory.createX3DComponent(null);
 // UI’ye bu bileseni ekleyelim
 JComponent x3dPanel = (JComponent)x3dComp.getImplementation();
 contentPane.add(x3dPanel, BorderLayout.CENTER);

SAI erişimi için gereken tüm sınıflar org.web3d.x3d.sai paketinde bulunmaktadır. Xj3D javadoc’u SAI kodu yazarken kullanışlı bir kaynaktır. 3B penceresini uygulamanıza eklemek için gerekenler bunlardır. Bir sonraki kısım dosya yüklemeyi gösterecektir.
Dosya Yükleme
Dosya yüklemeden önce tarayıcı kavramını anlatmak gerekiyor. SAI’de tarayıcı sistemle etkileşim için gereken basit bir arayüzdür. Dosya yükleme, düğüm yaratma ve çerçeve oranını getirme gibi işler yapmanıza olanak sağlar. Browser sınıfı dışsal ve içsel SAI programları için mevcuttur.
ExternalBrowser arayüzü dışsal SAI programlarının imgelemeyi duraklatma ve tarayıcı dinleyicisi ekleme gibi daha fazla işlevselliğe erişmelerini sağlar. Bu işlemleri sadece dışsal kodtan yapabilirsiniz. Dosya yükleyebilmek için yarattığımız X3DComponent bileşeninden tarayıcı (Browser) referansını alırız.
// Dissal tarayici alalim
ExternalBrowser x3dBrowser = x3dComp.getBrowser();
Tarayıcı referansını elde ettikten sonra bu referansı dosya yüklemek için kullanabiliriz. Bu işi yapmak için bir kaç yöntem vardır. Bu ilk örnek için en kolayını kullanacağız. Bu dosya indirilip gösterilmeye hazırlanana kadar bloklanmış createX3DFromURL çağrısıdır. Bu metod X3D sahnesini kapsayan X3DScene nesnesini döndürür. Daha sonra biz şu an için boş olan güncel sahneyi bu yeni sahne ile değiştiririz.
// Dosya yukleyerek bir X3D sahnesi olustur
X3DScene mainScene = x3dBrowser.createX3DFromURL(new String[] { "moving_box.x3dv" });
// Varolan dunyayi yenisiyle degistir
x3dBrowser.replaceWorld(mainScene); 
Bu örneğin tam kodunu şurada bulabilirsiniz : SimleSAIDemo
Eğer bu kodu başarılı bir şekilde çalıştırabilirseniz Xj3D kurulumunu tamamladınız demektir.
Daha gelişmiş örnekler için şu adresi inceleyebilirsiniz.

URL İşleme Tarzı


Bu noktada anlaşılması gereken kavram URL’lerin nasıl ele alındığıdır. createX3DFromURL girdi olarak URL katarı almaktadır. Bu katardaki URL’lerden birine ulaşıp başarıyla indirene kadar arama gerçekleşir. URL internet üzerindeki veya kendi yerel makinemizdeki nesnenin konumunu belirtme yöntemi sağlar. Eğer sadece dosya adı veya kısmi dizin ve dosya yolu (örneğin “examples/foo.xd3v”) verirsek göreceli URL sağlanmıştır. X3D belirtimi bu URL’lerin o an çalışılan dizinden başlaması gerektiğini söylemektedir. Daha ayrıntılı bilgi için X3D Java binding specification(ISO/IEC 19777-2:2005) 3.3.4.2 maddesini inceleyin.

RFID Standartları

ISO Standartları

Standart

Açıklama

Aşama

Aşama Tarihi

10536

Tanımlama kartları – İletişimsiz bütünleşik devre(ler) kartları.

10 cm ye kadar.

İnceleme

2004-12-31

11784

Hayvanların Radyo frekans tanımlama ile tanımlanması – Kod yapısı

İnceleme

2003-11-07

11785

Hayvanların Radyo frekans tanımlama ile tanımlanması – Teknik kapsam

İnceleme

2001-09-19

14443-1

Tanımlama kartları – İletişimsiz bütünleşik devre(ler) kartları – “Proximity” kartları – Bölüm 1 : Fiziksel özellikleri

İnceleme

2003-10-13

14443-2

Tanımlama kartları – İletişimsiz bütünleşik devre(ler) kartları – “Proximity” kartları – Bölüm 2 : Radyo frekans gücü ve sinyal arayüzü

Yayımlandı

2001-06-28

14443-3

Tanımlama kartları – İletişimsiz bütünleşik devre(ler) kartları – “Proximity” kartları – Bölüm 2 : İlkleme ve kalabalıklık önleme

Yayımlandı

2001-02-01

15693-1

Tanımlama kartları – İletişimsiz bütünleşik devre(ler) kartları – “Vicinity” kartları -- Bölüm 1 : Fiziksel özellikleri

1998’de, Philips ve Texas Instruments firmaları ISO 15693 ile uygulamalar geliştirdiler. Amaçları tek antenli bir okuyucu ile 50 - 70 cm ye kadar başarılı okuma yapabilmekti.

İnceleme

2003-10-14

15693-2

Tanımlama kartları – İletişimsiz bütünleşik devre(ler) kartları – “Vicinity” kartları -- Bölüm 2 : Hava arayüzü ve ilkleme

İnceleme

2003-10-14

15693-3

Tanımlama kartları – İletişimsiz bütünleşik devre(ler) kartları – “Vicinity” kartları -- Bölüm 3 : Kalabalıklık önleme ve iletim protokolü

Yayımlandı

2001-03-29

15961

Ürün yönetimi için Radyo frekans tanımlama (RFID) – Veri protokolü: uygulama arayüzü

Yayımlandı

2004-10-18

15962

Ürün yönetimi için Radyo frekans tanımlama (RFID) – Veri protokolü: Veri kodlama kuralları ve mantıksal hafıza fonksiyonları

Yayımlandı

2004-10-18

15963

Ürün yönetimi için Radyo frekans tanımlama (RFID) – RF tagları için tekil tanımlama

Yayımlandı

2004-09-08

18000-1

Ürün yönetimi için Radyo frekans tanımlama (RFID) – Bölüm 1: Referans mimarisi ve standartlaştırılacak parametrelerin tanımlanması

Yayımlandı

2004-09-13

18000-2

Ürün yönetimi için Radyo frekans tanımlama (RFID) – Bölüm 2: 135 kHz altı hava arayüzü haberleşmesi için parametreler

Yayımlandı

2004-09-13

18000-3

Ürün yönetimi için Radyo frekans tanımlama (RFID) – Bölüm 3: 13,56 MHz’de hava arayüzü haberleşmesi için parametreler

Yayımlandı

2004-09-13

18000-4

Ürün yönetimi için Radyo frekans tanımlama (RFID) – Bölüm 4: 2,45 GHz’de hava arayüzü haberleşmesi için parametreler

Yayımlandı

2004-08-31

18000-6

Ürün yönetimi için Radyo frekans tanımlama (RFID) – Bölüm 6: 860 MHz - 960 MHz arası hava arayüzü haberleşmesi için parametreler

Yayımlandı

2004-08-31

18000-7

Ürün yönetimi için Radyo frekans tanımlama (RFID) – Bölüm 7: 433 MHz’de etkin hava arayüzü haberleşmesi için parametreler

Yayımlandı

2004-08-31

ISO RFID Standartları (03.02.2005)

Standart

Açıklama

Aşama

17358

RFID için tedarik zinciri uygulaması – Uygulama gereksinimleri

20 - Hazırlık

17363

RFID için tedarik zinciri uygulaması – Taşıma konteynerleri

20 – Hazırlık

17364

RFID için tedarik zinciri uygulaması – Nakil birimleri

20 – Hazırlık

17365

RFID için tedarik zinciri uygulaması – Geri dönüşümlü nakil ürünleri

20 – Hazırlık

17366

RFID için tedarik zinciri uygulaması – Ürün paketleme

20 - Hazırlık

17367

RFID için tedarik zinciri uygulaması – Ürün etiketleme

20 - Hazırlık

18047-7

Otomatik tanımlama ve veri yakalama teknikleri – RFID cihazı uyumluluk test yöntemleri – Bölüm 7: 433 MHz’de hava arayüzü haberleşme sınama yöntemleri

30 - Komite

19762-3

Otomatik tanımlama ve veri yakalama teknikleri – Ortaklaştırılmış terimler – Bölüm 3: Radyo frekans tanımlama (RFID) (sadece Ingilizce)

50 - Onama

24710

Otomatik tanımlama ve veri yakalama teknikleri – Ürün yönetimi için Radyo frekans tanımlama

40 - Araştırma

ISO RFID Standart taslakları (03.02.2005)

EPC Standartları

EPC Global’in tanımladığı standartlar şöyle özetlenebilir:

· EPC Tags ları için mantıksal veri formatı

· Aşağıdaki tag frekans aralıkları için Tag haberleşme protokolü

· 900 MHz Sınıf 0

· 13.56 MHz Sınıf 1

· 860 MHz den 930 MHz’ye Sınıf 1

· “Savant” adlı standartlaşmış EPC ara katmanı için tanımlamalar

· How EPC middleware, including Savant, communicates with tag readers.

· Physical Markup Language (PML) Tanımlaması. Bu XML tabanlı dil, bir EPC ağındaki bileşenler arasında aktarılan bilginin formatını tanımlar.

· Object Name Service (ONS) Tanımlaması. Dünyadaki herhangi bir EPC tagına sahip ürün hakkındaki bilgiyi getiren küresel ağ tanımlaması.

EPC tagları farklı sınıflarla nitelendirilirler. Tablo bu sınıfları açıklamaktadır.

EPC Global ‘Sınıfları’

EPC Sınıfı

Açıklama

Programlama

Sınıf 0

“Yalnız okuma” pasif taglar

Yarı iletken üretim işleminin bir parçası olarak programlanır

* Sınıf 0+

EPC Sınıf 0 ‘ın “Bir defa yazma, çoklu okuma” versiyonu

Müşteri tarafından 1 defa programlanır sonra kilitlenir

Sınıf 1

“Bir defa yazma, çoklu okuma” pasif tagları

Müşteri tarafından 1 defa programlanır sonra kilitlenir

Sınıf 1 – Nesil 2

Küresel birlikte çalışabilirlik, çoklu okuma/yazma ve arttırılmış veri iletim hızı sağlar

Bir çok defa programlanabilir

Sınıf 2

Tekrar yazılabilir pasif taglar

Bir çok defa programlanabilir

Sınıf 3

Yarı pasif taglar

Sınıf 4

Aktif taglar

Sınıf 5

Okuyucular

Mümkün değil

* EPC Global tanımlı bir sınıf değil

.net C# ile Test Driven Development (TDD) nasıl uygulanır?

.net C# kullanacağım birkaç projede TDD yöntemini kullanmayı düşünüyorum. Bu yüzden .net ortamında TDD nin nasıl yapılacağıyla ilgili biraz araştırma yaptım ve işime yarayabilecek, bu alanda yaygın olarak kullanılan, iki tane açık kaynak kodlu test uygulaması buldum: csunit ve nunit.

Dokumanlar ve makaleleri karıştırınca nunit daha iyi anlatılmış gibi geldi, bu nedenle nunit ile çalışmaya karar verdim.TDD daha çok java dünyasında ve Junit egemenliğinde kullanıldığından .net için çok fazla Türkçe döküman bulunamıyor.

Nunit Test Ortamı

Nunit test ortamı .net dillerinin tümü ile kullanılabiliyor. Test sınıfında yapılan "test fixture", "test" metodları, "setup" metodu ve "teardown" metodu gibi özel tanımlar yoluyla test edilecek yapının belirlenmesi sağlanıyor.

TestFixture Tanımı

Kullanıldığı sınıfın içerisinde test metodları olduğunu belirtir.

namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]
public class SomeTests
{
}
}
TestFixture tanımı kullanan sınıfların erişilebilir(public) bir oluşturucu(constructor)
metodları olmalıdır(yada varsayılanı zaten erişilebilir olduğundan, oluşturucu metodları
olmamalıdır)

Test Tanımı

Test sınıfında, üzerinde tanımlandığı metodun Test Çalıştırıcısı(TestRunner) tarafından çalıştırılacağını belirtir. Metod erişilebilir olmalı(public), geriye parametre döndürmemeli(void) ve parametre almamalıdır.

namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]
public class SomeTests
{

[Test]
public void TestOne()
{
// // Do something...
}
}
}

SetUp ve Teardown Tanımları


Testler yapılırken, öncesinde ve sonrasında bazı işlemlerin yapılması gerekebilir. Bunun için özel(private) bir metod yaratılıp her metoddan önce/sonra çağrılabilir yada bunun yerine test ortamının sunduğu Setup ve Teardown tanımları kullanılır. Bu metodlar Textfixture içerisinde test edilemsi gereken her metoddan önce ve sonra çalıştırılır.En genel kullanımları bağımsız nesneler yaratılacağı zaman kullanılmalarıdır.


namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]
public class SomeTests
{
private int _someValue;

[SetUp]
public void Setup()
{
_someValue = 5;
}

[TearDown]
public void TearDown()
{
_someValue = 0;
}

[Test]
public void TestOne()
{
// Do something...
}
}
}

ExpectedException Tanımı


Testiniz çalışırken bir hata fırlatmasını bekliyorsanız bu tanımı kullanabilirsiniz.


namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]

public class SomeTests
{

[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void TestOne()
{
// Do something that throws an InvalidOperationException
}
}
}

Bu kod çalıştığında, yalnız InvalidOperationException nın fırlatılması halinde test başarılı olacaktır. Burada dikkat edilmesi gereken bir nokta bu tanımın kalıtım özelliğini desteklememesi; yani test metodunuz, InvalidOperationException sınıfından kalıtımla yaratılmış bir hata fırlatırsa testiniz çökecektir.

Ignore Tanımı

Yazdığınız testlerden herhangi birinin o an gözardı edilmesini ve çalıştırılmamasını istiyorsanız bu tanımlayıcıyı kullanabilirsiniz. Yorum satırına almaktansa bunu kullanmanız, bu testin size hatırlatılmasını ve daha sonra bunu unutmanızı engelleyecektir.

namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]
public class SomeTests
{

[Test]
[Ignore("We're skipping this one for now.")]
public void TestOne()
{
// Do something...
}
}
}

NUnit Assertion Sınıfı

Metodları test ederken kullanılacak en iyi yöntemlerden bir diğeri de nunit in "assertion" sınıfı ve bu sınıfın sağladığı kontrol metodlarıdır.

namespace UnitTestingExamples
{
using System;
using NUnit.Framework;

[TestFixture]
public class SomeTests
{

[Test]
public void TestOne()
{
int i = 4;
Assertion.AssertEquals( 4, i );
}
}
}

Kaynaklar:
http://www.codeproject.com/dotnet/tdd_in_dotnet.asp
http://www.csunit.org/tutorials/tutorial7/index.html
http://www.nunit.org/




Java Web Start'ta uygulama

Java web start (JWS)’ı mutlaka duymuş olmalısınız. Evet ben de duydum ve bir projemde kullanmaya karar verdim. İşin içine girince basit bir projede bunu yapayım insanlarla aşama aşama nasıl yapıldığını paylaşayım dedim. Basit projemiz tamamen kendimin yazdığı bir Not Defteri olacak. Bu linkten kaynak kodu indirip Eclipse projesi şeklinde açabilirsiniz.

Daha sonra bu projenin çalıştırılabilir jarını oluşturuyoruz. (Jar Oluşturma)

Daha sonra bu jar dosyasını imzalıyoruz. (Jar İmzalama)

Jar dosyasını imzalamayı başardıktan sonra bu jar dosyasını web sunucumuzda JWS kullanarak yayınlamaya başlayabiliriz. Bunun için oluşan imzalı jar'ımızı ve aşağıda içeriği verilen jnlp dosyamızı hostumuza yüklüyoruz. jnlp dosyasının adresini tarayıcımızda yazıp girince eğer hostumuz jnlp dosyasının uygulama mime tipine sahip olduğunu biliyorsa o dosyayı direkt olarak JWS ile açacaktır. Eğer buraya kadar sorunsuz bir şekilde programımızı yükleyebildiysek o adresi tıklayan kişiler JWS sayesinde bizim not defterimizi kullanabilecektir. Bu projenin çalışan bir örneğine şuradan ulaşabilirsiniz.

notdefter.jnlp dosyası:
<?xml version="1.0" encoding="utf-8"?>
<!--Bu jnlp dosyasinin bulundugu host ve adi-->
<jnlp spec="1.0+"
codebase="http://localhost/notdefteri"
href="notdefteri.jnlp">
<!-- Programla ilgili bilgiler-->
<information>
<title>Not Defteri</title>
<vendor>Kod ve Us</vendor>
<homepage href="http://kodveus.blogspot.com/"/>
<description>Basit Not Defteri</description>
<description kind="short">Basit Bir Not Defteri</description>
<offline-allowed/>
</information>
<!-- Imzalamamizin sebebi bu not defterinin dosya islemleri yapmasi burada bu yuzden tam izin vermemiz-->
<security>
<all-permissions/>
</security>
<!-- Programin ana sinifi-->
<application-desc main-class="net.kodveus.jws.NotDefteri">
</application-desc>
<!-- Programin kullandigi kaynaklar (jar dosyalari)-->
<resources>
<!--Biz kodumuzu j2se 1.5 e gore gelistirdik-->
<j2se version="1.5+"/>
<jar href="notdefteri.jar" main="true"/>
</resources>
</jnlp>