22 Haziran 2009 Pazartesi

Pardus 2008.2 Üzerine Oracle 10g Kurulumu

Daha önce yayınlanan Pardus 2007.3 Üzerine Oracle 10g Kurulumu adlı dokümanda bazı değişiklikler yapmamız gerekiyor.

1 - 8. sayfadaki soft link komutlarını aşağıdaki şekilde değiştirmeniz yeterli olacaktır.

ln -s /bin/awk /usr/bin/awk
ln -s /usr/bin/basename /bin/basename
ln -s /usr/lib/libgcc_s.so.1 /lib/libgcc_s.so.1
ln -s /usr/lib/libstdc++-v3/libstdc++.so.5 /usr/lib/libstdc++.so.5


2 - dbstart dosyasının 78. satırındaki

ORACLE_HOME_LISTNER=:/ade/vikrkuma_new/oracle

satırını

ORACLE_HOME_LISTNER=$1

veya doğrudan ORACLE_HOME'un gösterdiği dizin olarak değiştirin.

18 Haziran 2009 Perşembe

Dumlupınar

Geçenlerde kardeşimin Yemin Töreni için İzmir Narlıdere'ye gittik. Dönüş yolunda acelemizde olmadığı için bol bol mola vererek, ağır ağır gidiyorduk.

Dumlupınar yol ayrımından geçerken, babam hadi bir uğrayalım dedi ve ikiletmeden yol ayrımından Dumlupınar'a döndüm. İlçeye girer girmez bir kahve gördük ve yolun verdiği yorgunlukla da hadi önce bir çay içelim dedik. Kahvede oturan ihtiyarlarla biraz sohbet ettik ve şehitliğe nereden gidebileceğimizi sorup yola koyulduk. Bu arada çay paralarımızı da ne ara ödediler bilmiyorum. Elimi cebime atacak oldum, ödendi dediler. Sağolsunlar.

İlçeden şehitliğe giderken yol biraz kötüydü. Gelir gelmez ilçe belediyesinin web sitesine baktım, bulvar çalışması varmış, bitmiş. Bu arada gezilecek daha bir sürü yer varmış. Yolum düşerse tekrar görmek isterim.

Şehitlikte mezar taşlarını okurken gözlerim doldu. Özellikle yan yana mezarlardaki memleket isimleri ve yaşların birbirine uzaklığı. O kahramanların fedakarlıklarına karşılık bugün bizim bu ülkeye yaptıklarımıza bak.

İşte gözlerimin yaşarmasına sebep olan resimlerden bazıları.





Yuva

‘Beyaz adam annesi olan toprağa ve kardeşi olan gökyüzüne, alıp satılacak, işlenecek, yağmalanacak bir şey gözüyle bakar. Onun bu ihtirasıdır ki toprakları çölleştirecek ve her şeyi yiyip bitirecektir. Beyaz adamın kurduğu kentlerde, bir çiçeğin taç yapraklarının açarken çıkardığı tatlı sesler, bir kelebeğin kanat çırpışları duyulamaz. Son ırmak kuruduğunda, son ağaç yok olduğunda, son balık öldüğünde; beyaz adam paranın yenilemeyen bir şey olduğunu anlayacak!’

Çocukluğumdan beri bildiğim bu sözleri ne kadar anladığımı (yada anlamadığımı) bu günlerde yeni yeni farkediyorum. Prof.Dr. Mikdat KADIOĞLU'nun www.agaclar.net'deki makalesini okuduğumda, yukarıdaki paragraf benim için çok daha anlamlıydı. Çünkü daha bir kaç gün önce NTV Yeşil Ekran'da Home (Yuva) adlı belgeseli izlemiştim.

Eskiden beridir balık ve kara avı konusuna meraklıyımdır. Sevgili dostum İ. Halil Karslıoğlu ile ki kendisi aynı zamanda babam olur, birlikte ava çıkmayı, sakin bir su kenarında oturup balık tutarken sohbet etmeyi çok severim. Bu sohbetlerde tüm dünyada değilse bile en azından kendi bölgemizde doğal hayatın nasıl bozulduğunu, bu sorunlara nasıl çözüm üretileceği, en azından bizim neler yapabileceğimiz konusunda beyin fırtınası yaparız. Bizim yapabileceklerimiz konusunda eylem planlarımızı hayata geçirmek için çalışmayı da sürdürüyoruz.

Av ve doğa gezilerinde, şehir yaşamında farkedemeyeceğiniz bir çok gerçekle karşılaşırsınız. Çocukluğumda ördek avına gittiğimiz bazı yerler şu anda insanların bir birine çarpmadan yürümeye çalıştığı caddeler, ve yüksek binalarla dolu. Balık avladığımız bir çok yerde şimdi Villa Siteler var. Benim 34 yaşında olduğum düşünülürse çocukluğum pek de uzak bir zaman değil.

Eskiden toroslarda her ağacın altında küçük, temiz tatlı su derelerinin aktığı, insanların evlerine bu derelerden su getirdiği Fındık pınarı yayalasında (Adından ne kadar sulak olduğunu anlayabilirsiniz.) geçen yıl su bulamadık ve marketten hazır şişe su almak zorunda kaldık.

Fakat Home (Yuva) belgeselini seyrettikten sonra, bizim gördüklerimizin aslında devasa sorunun ne kadar küçük bir parçası olduğunu anladım.

İnsanoğlunda tehlike ile bire bir kaşılaşmadıkça tehlikeyi görmezden gelme, küçümseme gibi bir sorun var. Bu bir nevi savunma mekanizması olabilir. Çünkü her sorunu sürekli olarak yaşar ve korkarsak günlük yaşamımızı devam ettirecek gücü bulamayabilir ve gerekli odaklanmayı sağlayamayabiliriz. Fakat bu bir süre sonra umursamazlık sınırlarını aşar ve korkusuz, aç gözlü bireylere dönüşürsek, ki şu andaki en büyük sorunumuz da bu gibi görünüyor, o zaman tehlike gerçek olduğunda yapabileceğimiz birşey kalmayacak.

Günlük hayatta en çok karşılaştığım ve en çok kızdığım yaklışım şudur; Yahu dünyayı ben mi kurtaracağım. yada Bir benimle olmaz, ben kendimi sıkıntıya soksam bile herkes yapıyor, ne değişecek. Sizce de gerçekten böyle mi?. Umarım değildir. Evet, dünyayı sen kurtaracaksın. Ve en önemlisi Toplumun tamamının bir şeyi yanlış yapması, sizin de aynı yanlışı bilerek yapmanız için yeterli gerekçe değildir. Her bireyin yapacak birşeyleri var ve her birey küçük de olsa fark yaratacaktır. Az dediğimiz ücretlerimizle bir ömür geçirebiliyoruz. Kelebeğin kanat çırpışları gibi, biz de zamanla büyük etkiler yaratabiliriz.

Konu hakkında bu kadar öfkeli olmamın asıl nedeni sanırım dünya tatlısı kızlarım, Gülseren ve Yağmur. Belgeseli seyrederken, özellikle verilen tahmini süreleri dinlerken aklımdan geçen ilk soru İnsanlığın sonu ne olacak? değil Kızlarım o zaman kaç yaşında olacak? oldu. Daha sonra eşimle mutfakta oturmuş sohbet ederken, onun soruduğu ilk soru da.

Sorun çok uzağımızda değil. Bizim, biz paçayı kurtarsak bile, akşam kucağımıza alıp hikayeler anlattığımız, gülüp oynadığımız, çocuklarımızın bizzat yaşayacağı, ve oldukça sıkıntı çekeceği tehlikeler.

Sanırım hepimizin artık korkmasını gerektirecek kadar yüz yüze geldik tehlikeyle.

4 Haziran 2009 Perşembe

Java'da DES Algoritması

Şifreleme bir bilginin gizliliğini korumak için kullanılan yöntemdir. Şifreleme algoritmaları temel olarak 3'e ayrılır; simetrik, asimetrik ve karışık şifreleme.

  - Simetrik Şifreleme; şifreleme ve çözme işlemi için aynı anahtarın kullanıldığı algoritmalardır. Şifrelenmiş bilgiyi açmak isteyen kişide şifreleme sırasında kullanılan anahtarın olması gerekir.

- Asimetrik Sifreleme; genellikle paylaşılacak ya da network üzerinde dolaşacak veriyi şifrelemek için kullanılır. Bilgi ulaşacağı kişinin açık veri anahtarına göre şifrelenir. Bilgi şifrelenmiş bir biçimde ulaşacağı kişiye ulaştığında ikinci ve gizli anahtar ile çözülür. Anahtar sadece ulaşacağı kişide bulunduğu için verinin ele geçirilip çözülmesi olanaksızdır.

- Karışık Şifreleme; asimetrik ve simetrik algoritmaları da içerisinde bulundurabilen algortimalardır.

DES (Data Encryption Standard/Veri Şifreleme Standardı), Dünyada en yaygın kullanılan şifreleme algoritmalarından birisidir. IBM tarafından geliştirilmiştir. 1975 yılında “Federal Register” tarafından yayınlanmıştır. DES 64 bitlik veriyi 56 bitlik anahtar kullanarak şifreler. DES’in en büyük dezavantajı anahtar uzunluğunun 56 bit olmasıdır. günümüzde geliştirilen modern bilgisayarlar tarafından yapılan saldırılar karşısında yetersiz kalmaktadır. Daha güvenli şifreleme ihtiyacından dolayı DES, Triple-DES olarak geliştirilmiştir. Triple-DES algoritması geriye uyumluluğu da desteklemek amacıyla 2 adet 56 bitlik anahtar kullanır. Triple-DES algoritması, DES algoritmasının şifreleme, deşifreleme, şifreleme şeklinde uygulanmasıdır.

DES ile şifrelenmiş bilgiye ulaşabilmek için şifreleme sırasında kullanılan anahtara ihtiyaç vardır. Şifrelediğiniz bilgiye daha sonra tekrar ulaşabilmek için anahtarı güvenli bir şekilde saklamanız gerekir.

Aşağıda java ile yazılmış bir örnek bulunmaktadır. Örnek ilk önce bir anahtar üretir, üretilen anahtarla örnek veriyi şifreler, anahtarı bir binary dosyaya kaydeder, sonra dosyadan geri okur ve şifrelenmiş veriyi tekrar eski haline getirir.

Burada örnek olması için çalışma dizininde bir dosyaya kaydedilmiştir fakat anahtarın saklanması konusunda daha yaratıcı ve karmaşık yöntemler bulunabilir.


package destest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;

import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;


public class DESTest {
Cipher eCipher;
Cipher dCipher;
SecretKey generatedKey;
SecretKey readedKey;

public DESTest() {
}

public boolean generateKey() {
try {
generatedKey = KeyGenerator.getInstance("DES").generateKey();
eCipher = Cipher.getInstance("DES");
dCipher = Cipher.getInstance("DES");
eCipher.init(Cipher.ENCRYPT_MODE, generatedKey);
} catch (NoSuchAlgorithmException e) {
System.err.println("NoSuchAlgorithmException: " + e.getMessage());
return false;
} catch (javax.crypto.NoSuchPaddingException e) {
System.err.println("NoSuchPaddingException: " + e.getMessage());
return false;
} catch (java.security.InvalidKeyException e) {
System.err.println("InvalidKeyException: " + e.getMessage());
return false;
}
return true;
}

public boolean saveKey() {
try {
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
Class spec = Class.forName("javax.crypto.spec.DESKeySpec");
DESKeySpec ks = (DESKeySpec)skf.getKeySpec(generatedKey, spec);
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream(".key"));
oos.writeObject(ks.getKey());
oos.close();
} catch (Exception e) {
System.err.println("Save Key: " + e.getMessage());
}
return true;
}

public boolean readKey() {
try {
ObjectInputStream ois =
new ObjectInputStream(new FileInputStream(".key"));
DESKeySpec ks = new DESKeySpec((byte[])ois.readObject());
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
readedKey = skf.generateSecret(ks);
dCipher.init(Cipher.DECRYPT_MODE, readedKey);
} catch (Exception e) {
System.err.println("Read Key: " + e.getMessage());
}
return true;
}

public String encode(String str) {
byte[] utf8;
try {
utf8 = str.getBytes("UTF8");
byte[] enc = eCipher.doFinal(utf8);

return new sun.misc.BASE64Encoder().encode(enc);
} catch (UnsupportedEncodingException e) {
System.err.println("UnsupportedEncodingException: " +
e.getMessage());
} catch (IllegalBlockSizeException e) {
System.err.println("IllegalBlockSizeException: " + e.getMessage());
} catch (BadPaddingException e) {
System.err.println("BadPaddingException: " + e.getMessage());
}
return null;
}

public String decode(String str) {
try {
byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

byte[] utf8 = dCipher.doFinal(dec);

return new String(utf8, "UTF8");
} catch (javax.crypto.BadPaddingException e) {
System.err.println("BadPaddingException: " + e.getMessage());
} catch (IllegalBlockSizeException e) {
System.err.println("IllegalBlockSizeException: " + e.getMessage());
} catch (UnsupportedEncodingException e) {
System.err.println("UnsupportedEncodingException: " +
e.getMessage());
} catch (java.io.IOException e) {
System.err.println("IOException: " + e.getMessage());
}
return null;
}

public static void main(String[] args) {
String text = "Test text.";
System.out.println("Text : " + text);
DESTest main = new DESTest();
main.generateKey();
String encoded = main.encode(text);
System.out.println("Encoded: " + encoded);
main.saveKey();
main.readKey();
String decoded = main.decode(encoded);
System.out.println("Decoded: " + decoded);
}
}

2 Haziran 2009 Salı

Pardus 2008.2 + Eclipse 3.4.0 + Visual Swing for Eclipse

Pardus 2008.2 paket deposunda Eclipse 3.4.0 gelmektedir. Eclipse çok güçlü ve kullanışlı bir ide olmasına rağmen swing için görsel düzenleme desteği ile gelmez.

Fakat Visual Swing for Eclipse eklentisi ile çok kolay bir şekilde bu desteği sağlayabilirsiniz. Bunun için:


      - http://visualswing4eclipse.googlecode.com/files/vs4e_0.9.12.I20090527-2200.zip adresinden gerekli paketi indirin.

      - zip dosyasını home dizininize açın.

      - sudo cp -R /home/<user>/<paketi_actiginiz_dizin>/plugins /opt/eclipse komutunu çalıştırın (Sorulduğunda kendi şifrenizi girin)

      - Eclipse'i kapatıp tekrar açın

      - File/New/Other altında Visual Swing Class seçeneğini görüyor olmalısınız.

Java Sınıflarını Calisma Zamanında Derleme ve Yükleme (Compile and Load Java Classes at Runtime)




Bilinen Hatalar: Sınıfı birkez derleyip çalıştırdıktan sonra tekrar değişiklik yapar ve tekrar çalıştırmak isterseniz, önceki hali ile çalışıyor. Uygulamayı kapatıp tekrar açar ve çalıştır derseniz, düzgün çalışıyor. Hatta tekrar açtığınızda çalıştırmadan önce değişiklik yapar ve tekrar derlerseniz, yeni hali ile çalıştırabilirsiniz. Bunun nedeni sanırım çalışma zamanı yüklenen sınıfın tekrar kaldırma (unload) işlemini yapamaması.

Eğer bu konuda gerekli düzeltmeyi yapan olursa, ben de sevinirim.



Çalıştırmak İçin: Derle butonuna tıkladığınızda, uygulama dizininde "test" adında bir dizin yoksa oluşacak ve ".java" ve ".class" dosyaları burada oluşacaktır. Çalıştırmak istediğinizde uygulamanın oluşan ".class" dosyasını bulabilmesi için "test" dizininin classpath'e eklenmiş olması gerekmektedir. Aşağıdaki kodu kullanabilirsiniz.

      java -classpath classes:test test.derleveyukle.DerleVeYukleSinif


package test.derleveyukle;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;


public class DerleVeYukleSinif {
private JFrame frame;
private BorderLayout layout;
private JPanel topPanel;
private JButton jbtnYeni;
private JButton jbtnDerle;
private JButton jbtnCalistir;
private JButton jbtnCikis;
private JEditorPane editorPane;

private static final String DEFAULT_TEXT = "public class TestClass{\n" +
" public TestClass(){\n" +
" //\n" +
" }\n" +
"}";

private File path;
private String SOURCE_FILE_NAME;
private static final String CLASS_NAME = "TestClass";

public DerleVeYukleSinif() {
path = new File("test");

SOURCE_FILE_NAME = path.getAbsolutePath()+
File.separator+
"TestClass.java";

frame = new JFrame("Calisma Zamani Sinif Derleme ve Yukleme Ornegi");
frame.setSize(640, 480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);

layout = new BorderLayout();
frame.setLayout(layout);

topPanel = new JPanel();

jbtnYeni = new JButton("Yeni");
jbtnYeni.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OnYeni(e);
}
});

jbtnDerle = new JButton("Derle");
jbtnDerle.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OnDerle(e);
}
});

jbtnCalistir = new JButton("Calistir");
jbtnCalistir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OnCalistir(e);
}
});

jbtnCikis = new JButton("Cikis");
jbtnCikis.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OnCikis(e);
}
});

topPanel.add(jbtnYeni);
topPanel.add(jbtnDerle);
topPanel.add(jbtnCalistir);
topPanel.add(jbtnCikis);

editorPane = new JEditorPane();
if (!oncekiKod())
OnYeni(null);

frame.getContentPane().add(topPanel, BorderLayout.NORTH);
frame.getContentPane().add(new JScrollPane(editorPane),
BorderLayout.CENTER);

path.mkdirs();

frame.setVisible(true);
}

private void OnYeni(ActionEvent e) {
editorPane.setText(DEFAULT_TEXT);
editorPane.requestFocus();
}

private void OnDerle(ActionEvent e) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
FileOutputStream fos;
try {
fos =
new FileOutputStream(new File(SOURCE_FILE_NAME));

fos.write(editorPane.getText().toString().getBytes());

int compilationResult =
compiler.run(null, null, null, SOURCE_FILE_NAME);
if (compilationResult == 0) {
System.out.println("Derleme islemi basarili.");
} else
System.err.println("Derleme islemi basarisiz!");
} catch (FileNotFoundException f) {
System.err.println("FileNotFoundException: " + f.getMessage());
} catch (IOException f) {
System.err.println("IOException: " + f.getMessage());
}
}

private void OnCalistir(ActionEvent e) {
try {
URL url = new URL("file://" + path.getAbsolutePath());
URL[] urls = new URL[] { url };

ClassLoader loader = URLClassLoader.newInstance(urls);

Class testClass = loader.loadClass("TestClass");
testClass.newInstance();
} catch (MalformedURLException f) {
System.err.println("MalformedURLException: " + f.getMessage());
} catch (ClassNotFoundException f) {
System.err.println("ClassNotFoundException: " + f.getMessage());
} catch (InstantiationException f) {
System.err.println("InstantiationException: " + f.getMessage());
} catch (IllegalAccessException f) {
System.err.println("IllegalAccessException: " + f.getMessage());
}
}

private void OnCikis(ActionEvent e) {
frame.dispose();
}

private boolean oncekiKod() {
File file =
new File(SOURCE_FILE_NAME);
int ch;
StringBuffer kod = new StringBuffer("");
FileInputStream fin = null;
try {
fin = new FileInputStream(file);
while ((ch = fin.read()) != -1)
kod.append((char)ch);
fin.close();
} catch (FileNotFoundException e) {
return false;
} catch (IOException ioe) {
return false;
}

editorPane.setText(kod.toString());

return true;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DerleVeYukleSinif();
}
});
}
}