Dosya Parçalayıcı (File Splitter)


İki-üç gündür uğraştığım projeyi sonunda tamamladım. Hatalar-Buglar olabilir ama test ettiğim kadarıyla bir sorun yok. Bu gerçekleştirdiğim programda dosyaları belirtilen boyutta farklı parçalara ayırıp uzantısı 000,001,002,... gibi olan dosyaları birleştirme işlemi yapılıyor. Kodun geliştirilmesinde katkısı dilin menu üzerinden değiştirilmesine ve Java IO yerine Java Native IO kullanılması oldu. (Çalıştırılabilir JAR)

İlk başta standart IO komutlarıyla aşağıdaki şekilde parçaya dosya kopyalamayı yaparken daha hızlı çalıştığı söylenen nio (Native IO) konusuyla karşılaştım. İyi dedim, ben de bu yöntemi kullanayım o zaman. Biraz uğraştan sonra parçalara ayırmayı ve parçaları birleştirmeyi başarıyla tamamladım.

Normal IO ile kopyalama:

 // Kaynak dosyayi hedef dosyaya kopyalar
// Eger hedef dosya yoksa yaratir
void copy(File kaynak, File hedef) throws IOException {
    InputStream in = new FileInputStream(kaynak);
    OutputStream out = new FileOutputStream(hedef);

    // in'den out'a transfer bytelarini tutacak olan veri yapisi
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}

Native IO ile kopyalama:
 try {
    // Kaynak uzerinde bir kanal aciyoruz
    FileChannel srcChannel = new FileInputStream("kaynakDosyaIsmi").getChannel();

    // Hedef uzerinde bir kanal aciyoruz
    FileChannel dstChannel = new FileOutputStream("hedefDosyaIsmi").getChannel();

    // Kaynaktan boyutu kadar byte'i hedefe yaziyoruz
    dstChannel.transferFrom(srcChannel, 0, srcChannel.size());

    // Kanallari kapatalim
    srcChannel.close();
    dstChannel.close();
} catch (IOException e) {
}

Gördüğünüz gibi dosya kopyalamada döngülerle değişkenlerle fazla uğraşmadan ve daha hızlı bir şekilde gerçekleştirim yapabiliyorsunuz. İşi ilerletmişler. Böylece her ortamın kendi hızlı dosya kopyalama işlemi çağrılıyor.

Projenin kodunu inceleyip daha ayrıntılı bilgi alabilirsiniz.

Eclipse'e Visual Editor kurulumu

Eclipse kurduktan sonra yaptığım ilk işlemlerden biri Visual Editor kurmak oluyor. Ben Eclipse projesi olan Visual Editor'u tercih ediyorum. Farklı GUI geliştirme araçları için şurayı inceleyebilirsiniz.

Ben daha önce Jigloo kullanmıştım. Non Commercial projelerde ücretsiz kullanılabiliyor. Ancak şu an Visual Editor kullanıyorum. Gayet memnunum. Visual Editor'un en beğendiğim yanları kod içerisine direkt müdaheleye izin vermesi, kendi yazdığınız kodlarıda onunla açabilmemiz ve fazla kod kirliliği yaratmaması. Örneğin jigloo'da kodun belli yerlerine yazdığımız kodlar siliniyordu.

Gelelim VE nasıl rahatlıkla kurulabilir konusuna, gerçekten bazıları VE kurduktan sonra çalıştıramayabiliyor, ben de kaç kere aynı sorunla karşılaştım.

Kurulum için benim tercih ve tavsiye ettigim yol VE'nin update sitesi üzerinden otomatik kurulum yapmak. İkinci yöntem indirme sitesinden indirip elle kurmak.

Update linkini kullanmak
  1. Eclipse'i açıyoruz, Help-->Software Updates-->Find And Install' e tıklıyoruz.
  2. Açılan pencerede Search for new features to install'ı seçip next diyoruz
  3. Bu ekranda New Remote Site seçiyoruz, Name kismina Visual Editor (ya da ne isterseniz) URL kısmına http://update.eclipse.org/tools/ve/updates/1.0 yazıyoruz
  4. Bir de EMF gerekiyor onun içinde New Remote Site Name kısmına EMF URL kısmına http://update.eclipse.org/tools/emf/updates yazıp ekliyoruz
  5. Bir de GEF gerekiyor, onun içinde New Remote Site name kısmına GEF URL kısmına http://update.eclipse.org/updates/3.0 yazıp ekleyelim.
  6. Bu eklediğimiz 3 siteyi seçelim ve Finish diyelim
  7. Mirror sorarsa seçelim
  8. Bir süre uygun sürümü arayacaktır. Bekleyelim.
  9. Aşağıdaki Filter features included in other features on the list seçeneğini seçili hale getirelim. Daha sonra Visual Editor içerisinden Visual Editor 1.1.0.1 (Sizde sürüm numarası farklı olabilir SDK olmayan en uygun sürümü)seçiyoruz. Sağ tarafta Select Required seçeneğini tıklarsak işimiz kolaylaşır ve gereken diğer tüm paketler seçilir.
  10. Next'e tıklıyoruz karşımıza lisans bilgisi gelecektir, I accept the term in the license agreement seçeneğini tıklayıp nexte tıklıyoruz.
  11. Ve gelen ekranda gereken alan bilgisini görebiliyoruz. Finish'e tıklayıp indirmeyi başlatıyoruz.
  12. Dosyaların indirilmesi tamamlanana kadar Eclipse'teki işlerimize devam etmek için Run in Background seçeneğini tıklayabiliriz.
  13. İndirme tamamlanınca açılan pencerede install all seçeneğini seçiyoruz.
  14. Eclipse yeniden başlatılınca bir sorun yoksa VE rahatlıkla çalışacaktır.
Elle Kurmak

İkinci yöntem uygun sürümleri siteden indirmektir. Bu indirmeleri yapmadan önce Eclipse sürümünüzü iyice bilmeniz gerekiyor. Eclipse 3.1 için şuradan indirmeniz gerekiyor:
Sırasıyla EMF build 2.1.0, GEF Build 3.1 ve VE-runtime-1.1.0.1.zip dosyalarını indirip kuruyorsunuz. Ve başka bir sorun yoksa VE yeniden başlattığınızda çalışacaktır.

Hangi yöntem kolayınıza gelirse onu kullanarak kurulumu gerçekleştirebilirsiniz.

Kaynak: http://www.eclipse.org/vep/WebContent/faq.html

Önemli Not: GNU/Linux ortamlarında (deneyimlerim Debian tabanlı sistemler için geçerlidir) varsayılan Java olarak GCJ tanımlı ise Visual Editor çalışmayabilir. NullPointerException vererek boş bir ekran görünmesine neden olur. Bu nedenle sistemde varsayılan olarak OpenJDK veya Sun tarafından sağlanan JDK'lar kurulu olmalıdır.

Önemli Not 2: Eclipse 3.4 için Visual Editor kurulumu ile ilgili olarak şu adresi inceleyebilirsiniz.

Ubuntu'da Sun Java Nasıl?

Diz üstü bilgisayara ubuntu kurmaya karar verdim. Elbette sürekli java ile çalıştığımdan ve Eclipse kurmadan önce Javanın kurulmuş olması gerektiğinden ilk önce Sun'ın son sürüm JDK paketini kurmam gerekti. Bu iş aslında kolay bir iş. Ancak en azından bu işle uğraşanlara kolaylık olsun diye başarıyla tamamladığım bu işi aşama aşama yazmak istedim.

  1. İlk önce şuradan son sürüm Linux JDK sürümünü indirelim. İndirdiğiniz JDK makinenize özgü olmalı. Ve mutlaka bin uzantılı çalıştırılabilir sürümü indirin. Benim makinem 32 bit olduğu için standart Linux self-extracting file (jdk-1_5_0_06-linux-i586.bin) adlı sürümü indirdim.
  2. Daha sonra fakeroot, java-package ve java-common paketlerine ihtiyacımız olacağı için kuruyoruz.

    sudo apt-get install fakeroot java-package java-common
    Bu komut java-package paketini bulamayabilir. Bunun nedeni bu paketin normal kaynaklarda değilde Ubuntu'nun multiverse adı verilen kaynaklarında olmasındandır. Bu kaynağı /etc/apt/sources.list dosyasının en altına aşağıdaki şekilde ekliyoruz:

    deb http://archive.ubuntu.com/ubuntu hoary multiverse
    deb-src http://archive.ubuntu.com/ubuntu hoary multiverse


    Ve önce kaynakları güncellemek için apt-get update ve daha sonra apt-get install java-package komutunu çalıştırdığımız zaman eğer paket kurulu değilse başarılı bir şekilde kuracaktır.
  3. Daha sonra debian paketi oluşturmak için aşağıdaki komutu çalıştırıyoruz:
    fakeroot make-jpkg jdk-1_5_0_06-linux-i586.bin (Buraya indirdiğiniz dosyanın adını yazmayı unutmayın) (Not: Eğer kurulumda " No matching plugin was found." veya "dpkg-architecture: warning: Couldn't determine gcc system type, falling back to default (native compilation)" şeklinde hatalar oluşuyorsa yukarıdaki komutun başına "DEB_BUILD_GNU_TYPE=i386-linux" eklemeniz gerekecektir. Komut: DEB_BUILD_GNU_TYPE=i386-linux fakeroot make-jpkg jdk-1_5_0_06-linux-i586.bin olacaktır. Elbette burada i386-linux yerine sizin mimariye uygun olanı yapmanız gerekiyor. )
  4. Oluşturduğumuz debian paketini kurmak için aşağıdaki komutu yazarak kurulumu tamamlıyoruz:
    dpkg -i sun-j2re1.5_1.5.0+update05_i386.deb (oluşan paket ismini yazmayı unutmayın)
  5. Ve son olarak kurulum başarısını kontrol etmek için java -version yazıp çalıştırıyoruz. Eğer kurmak istediğimiz sürüm ekranda listeleniyorsa kurulum başarılı olmuş demektir. Rahatça java geliştirebiliriz.
  6. Ancak kurduğumuzdan farklı bir java sürüm bilgisiyle karşılaştık, bu durumda aşağıdaki komutu kullanarak java'nın farklı kurulu sürümlerini inceleyip default olarak hangisini kullanmak istiyorsak seçeriz:

    update-alternatives --config java
    Bu komut ekrandan bizden bir girdi bekleyecektir. O girdi bizim varsayılan java'mız olacaktır. Bu komutu javac için de kullanabilirsiniz. Orada da birden fazla alternatif varsa kullanmak istediğinizi seçebilirsiniz.
  7. Eğer yukarıda kaldırmak istediğiniz java sürümleri ile karşılaşırsanız onları kaldırmak için apt-get remove sun-jre1.4 (Burada kaldırmak istediğiniz paket adı gelecek) komutunu kullanabilirsiniz.
  8. Unutmadan bunları yapmak için root olmalısınız. 
Evet java kurulumu başarıyla tamamlandı. Şimdi geliştirme ortamının diğer elemanlarını kurmaya. Benim ilk işim Eclipse indirip kurmak olacak.

Ubuntu Debian üzerine geliştirilmiş bir dağıtım olduğundan bu komutlar Debian'da da çalışabilir.

Kaynak:http://wiki.serios.net/wiki/Ubuntu_Java_JRE/JDK_installation_with_java-package
http://ubuntuforums.org/showthread.php?t=76702
Daha kolay bir yöntem ve faklı alternatifler için:
https://help.ubuntu.com/community/Java

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.