15 Nisan 2010 Perşembe

BouncyCastle Yükleme

Eminim ki birçoğunuz projelerinizde gönderilen ya da saklanan veriyi şifreleme ihtiyacı duymuşsunuzdur. Bu yazıda da bu ihtiyacın Java ortamındaki en meşhur çözümlerinden biri olan BouncyCastle kripto paketini tanıtacağım.

BouncyCastle kripto paketi C# ve Java ortamlarında çalışan ve hemen hemen bütün standart algoritmaları destekleyen oldukça başarılı bir çalışma. http://www.bouncycastle.org/ adresinden inceleyebileceğiniz çalışma tamamen Open Source ve indirmek için herhangi bir ücret talep edilmiyor. Java ortamında kurulum içinse öncelikle http://www.bouncycastle.org/latest_releases.html adresinden en son versiyon paketi indirmeniz gerekiyor. (bu yazı yazıldığı sırada 1.45)

Zip dosyasını yükledikten sonra /jars klasörüne girerek bcprov-jdk16-145.jar dosyasını bulun. Buradaki isimlendirme yöntemi bcprov-jdk(jdk versiyonu)-(paket versiyonu).jar şeklindedir. bcprov-jdk16-145.jar dosyası Java 1.6 için 1.45 versiyonlu BouncyCastle paketini belirtmektedir. Şimdi yapmamız gereken bu dosyayı C:\Program Files\Java dizini içinde jre kurulumunun olduğu klasörde \lib\ext alt klasörüne kopyalamak. Burada amacımız Java programlarında Şifreleme Servisi (Crypto Provider) olarak BouncyCastle paketini kullanabilmek.

Dosyanın kopyalanması bittikten sonra bir üst klasöre dönerek \lib\security alt klasörüne geçiyoruz. Burada java.security dosyasında Şifreleme Servislerine BouncyCastle paketini eklememiz gerekiyor. Dosyada aşağıdaki bölüme son satırı ekliyoruz;

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.mscapi.SunMSCAPI
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider

Burada dikkat edilmesi gereken BouncyCastle'a vereceğimiz numara. Sizin dosyanızda 5 servis adı varsa security.provider.6 şeklinde tanımlanması gerekiyor. Ayrıca BouncyCastle tanımlaması mutlaka en alt satırda yer almalı. Aksi takdirde JVM çalışma hatası verebiliyor.

Bu şekilde kripto servisimiz hazır. Windows kullanıcıları yukarıdaki işlemleri JDK klasörü için tekrarlamak durumunda. Klasör yapısı aynı olduğu için yukarıdaki adımları aynen uygulayabilirsiniz.

Kurulum bittikten sonra bir Java projesi açarak BouncyCastle servisinin varlığını aşağıdaki gibi kontrol edebilirsiniz.

Key key;
KeyGenerator keyGen;
Cipher encrypt;

Security.addProvider(new BouncyCastleProvider());

try
{
// "BC" is the name of the BouncyCastle provider
keyGen = KeyGenerator.getInstance("DES", "BC");
keyGen.init(new SecureRandom());

key = keyGen.generateKey();

encrypt = Cipher.getInstance("DES/CBC/PKCS5Padding", "BC");
}
catch (Exception e)
{
System.err.println(e);
System.exit(1);
}

encrypt.init(Cipher.ENCRYPT_MODE, key);

bOut = new ByteArrayOutputStream();
cOut = new CipherOutputStream(bOut, encrypt);

cOut.write("plaintext".getBytes());
cOut.close();

Yukarıdaki kod hata verirse BouncyCastle paketi doğru kurulmamış demektir.
(Not: Deneme kodu http://www.bouncycastle.org/specifications.html#install adresinden alınmıştır)

BouncyCastle paketinde desteklenen şifreleme algoritmalarına ve anahtar uzunluklarına http://www.bouncycastle.org/specifications.html#install adresinden ulaşabilirsiniz.

4 Nisan 2010 Pazar

Android'de ses kayıt

Android'de ses kayıt

Bu yazıda Android'de basit bir ses kayıt uygulamasının nasıl yapılacağını anlatacağız. Uygulamamız Android içindeki basit ses kayıt ve daha sonrasında oynatma işlemlerini gerçekleştiriyor olacak.

İlk olarak programımız için bir arayüz hazırlıyoruz. Sade arayüzümüzde kayıt başlatma ve durdurma düğmeleriyle, yaptığımız kaydı çalmak için "Play" butonu olacak. Kullanacağımız Layout dosyamız aşağıdaki gibidir;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/startrecording"
android:text="Kayıt Baslat" />
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/stoprecording"
android:text="Kayıt Durdur" />
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/playrecording"
android:text="Son Kaydı Oynat" />
</LinearLayout>

Bu tasarımla ekranda 3 adet buton görebiliyor olmanız lazım. Şimdi yapacağımız kayıt düğmesine bastığımızda mikrofon kaynağından ses kaydına başlanması ve bunun "dur" düğmesi tıklanana kadar devam etmesi. Ardından "SOn Kaydı Oynat" dendiğinde son yapılan kaydın oynatılması.

public class IBMAudio extends Activity {

// MediaRecorder nesnesi
private MediaRecorder mrec = null;

private Button startRecording = null;
private Button stopRecording = null;
private Button playRecording = null;
// kayıt dosyası
File audiofile = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// MediaRecorder oluşturuyoruz
mrec = new MediaRecorder();
// düğme tanımlamaları
startRecording = (Button) findViewById(R.id.startrecording);
stopRecording = (Button) findViewById(R.id.stoprecording);
playRecording = (Button) findViewById(R.id.playrecording);

// audio file oluşturulmamışsa SD Card içinde rasgele bir isimle dosya yarat
if (audiofile == null) {
File sampleDir = Environment.getExternalStorageDirectory();

try {
audiofile = File.createTempFile("temp", ".3gp", sampleDir);
} catch (IOException e) {
return;
}
}

startRecording.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
startRecording.setEnabled(false);
stopRecording.setEnabled(true);
stopRecording.requestFocus();

// kaydı başlat
startRecording();
} catch (Exception ee) {
Log.e("Log", ee.getMessage());
}

}
});

stopRecording.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
startRecording.setEnabled(true);
stopRecording.setEnabled(false);
startRecording.requestFocus();
// kaydı durdur
stopRecording();
// değerleri dosyaya yaz
processaudiofile();
}
});

playRecording.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
playRecording.requestFocus();
// MediaPlayer dosyası oluştur
MediaPlayer MPX = new MediaPlayer();
try {
// dosya kaynağı olarak kayıt dosyamızı göster
MPX.setDataSource(audiofile.getAbsolutePath());
Log.d("Log", "Dosya yeri :" + audiofile.getAbsolutePath());
// oynatıcıyı hazırla
MPX.prepare();
// oynatıcıyı başlat
MPX.start();
} catch (IllegalArgumentException e) {
Log.e("Log", e.getMessage());
} catch (IllegalStateException e) {
Log.e("Log", e.getMessage());
} catch (IOException e) {
Log.e("Log", e.getMessage());
}
}
});

stopRecording.setEnabled(false);
startRecording.setEnabled(true);

}

protected void processaudiofile() {
// dosyaya yazılacak özellikleri burada belirliyoruz
ContentValues values = new ContentValues(4);
long current = System.currentTimeMillis(); // sistem tarihi

values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName()); // dosya adı
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000)); // kayıt tarihi
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); // dosya tipi
values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath()); // diskteki kayıt yeri
ContentResolver contentResolver = getContentResolver();

Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Uri newUri = contentResolver.insert(base, values); // kayıt için özellikleri veriyoruz

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri)); // kaydı gerçekletirir
}

// ses kaydı işlemleri burada yapılıyor
protected void startRecording() throws IOException {
mrec.setAudioSource(MediaRecorder.AudioSource.MIC); // ses kayıt kaynağı olarak mikrofonu seçiyoruz
mrec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // ses formatı olarak 3gp formatını seçiyoruz
mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // encoder değeri olarak AMR_NB

mrec.setOutputFile(audiofile.getAbsolutePath()); // kayıt dosyamızın yerini belirtiyoruz

mrec.prepare(); // kayıt için ortamı hazırlıyoruz
mrec.start(); // kayda başlıyoruz
}

protected void stopRecording() {
mrec.stop(); //kaydı durduruyoruz
mrec.reset(); // yeni kayıt için nesneyi ilk duruma getiriyoruz. Eğer başka kayıt yapılmayacaksa release() metodunu kullanmak gerekir.
//mrec.release();
}

}

Yapılanları kısaca özetlersek MediaRecorder nesnesi ses kaynağı ve kayıt formatı belirtildiğinde kaynaktan gelen sesi seçilen formata göre kayda başlayacaktır (örneğimizde 3gp formatı ve mikrofon). Kayda başlamadan önce prepare() metodu çağırılarak kayıt için bir ön hazırlık yapılması gerekir. start() ve stop() metodları da kaydın başlaması ve bitirilmesi için kullanılır. Kayıt bittikten sonra release() metodu çağırılırsa MediaRecorder kullandığı kaynakları serbest bırakacak ve başka bir kayıt yapmayacaktır. Eğer MediaRecorder'ı release() durumuna getirip start() metodunu çağırırsanız programınızın çöktüğünü görürsünüz. Üst üste aynı MediaRecorder nesnesiyle kayıt için nesneyi ilk duruma getirmeli yani reset() metodunu çağırmalısınız. release() metodu nesneyle yapılacak bir işlem kalmadıysa çağırılmalıdır (örneğin programdan çıkarken).

MediaPlayer nesnesi de MediaRecorder'la benzer özellikler taşır. Oynatıcıyı başlatmadan önce dosya kaynağını ve kullanılan ses formatını belirlemeli daha sonra da prepare() metoduyla oynatmaya hazır hale getirmelisiniz. start() metodu sesi çalmaya başlayacaktır. reset() metodu ise oynatıcıyı bir sonraki oynatma için hazır hale getirir.

27 Mart 2010 Cumartesi

Android hafızasından SMS silme

Seçtiğiniz bir kısa mesajı silme için öncelikle bu mesajın _id değerini daha önceki yazıda anlattığımız gibi elde etmeniz gerekiyor. _id değeri mesaja özel olduğundan yanlışlıkla başka bir mesajı silme riski olmadan istediğiniz mesajı silmeniz için kullanabileceğiniz bir değerdir. Daha sonra bir ContentResolver yaratarak silme işlemine başlıyoruz. Burada kullanacağımız content Uri "content://sms/" şeklindedir.

final Uri SMS_CONTENT_URI = Uri.parse("content://sms");

int result = context.getContentResolver().delete(SMS_CONTENT_URI,"_id=" + messageId, null);

Bu şekilde seçtiğimiz id değerini taşıyan mesajı telefon belleğinden silmiş oluyoruz. Tabii bu işlemi yapmadan önce AndroidManifest.xml dosyasına satırını eklemeyi unutmuyoruz. Bu izin kısa mesajı hafızasını silip değiştirmenize olanak sağlayacaktır.

Android'de SMS okuma işlemleri

Bu yazımızda android cep telefonu hafızasında yer alan kısa mesajları okumayı göstereceğiz. Bunun için öncelikle uygulamamıza SMS okuma iznini vermemiz gerekiyor. AndroidManifest.xml dosyasına satırını eklediğimizde uygulamaya bu izni vermiş oluyoruz. Daha sonra kısa mesajları tutacağımız bir data modeli oluşturuyoruz. Bu nesneye aşağıdaki değişkenleri ekliyoruz.

String address; // gönderen adresi
String contactId_string; // gönderen Id
String body; // mesaj içeriği
long timestamp; // gönderilme tarihi
long threadId; // eğer aynı kişiden birden fazla mesaj alınmışsa android bu mesajlar bir dizi halinde tutar ve id olarak bu değeri verir
int count; // kaçıncı mesaj
long messageId; // mesaj Id - android her mesaja özel bir Id atar

Getter ve Setter metodlarını ekledikten sonra nesnenin adına da SMSMessage gibi bir değer verirsek işimiz tamam oluyor.

Şimdi yapmamız gereken bir Cursor objesi tanımlayıp işletim sisteminin kısa mesajları sakladığı veritabanına sorgu göndermek. Kısa mesajların gelen kutusu "content://sms/inbox" şeklinde tanımlanmıştır. Bu veri tabanında bulabileceğiniz sütunlar ise "_id", "thread_id", "address", "person", "date", "body" şeklindedir. "read" sütunu ise kısa mesajın henüz okunup okunmadığını belirtir.

Aşağıdaki fonksiyon gelen kutusundaki bütün içeriği bir ArrayList içine kayıt edecektir. unreadOnly seçeneği boolean bir değer olup sadece okunmamış mesajları görmenizi sağlar.

public List getAllSmsInbox(boolean unreadOnly) {

// mesajları tutacağımız ArrayList
List results = new ArrayList();

String SMS_READ_COLUMN = "read"; // okundu bilgisiyle ilgili sütun
String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0" : null;
String SORT_ORDER = "date DESC"; // tarihi göre azalan
int count = 0; // mesaj sayısı

// burada sorguyu oluşturup hangi sütunları seçeceğimizi söylüyoruz
Cursor cursor = context.getContentResolver().query(
Uri.parse("content://sms/inbox"),
new String[] { "_id", "thread_id", "address", "person", "date",
"body" }, WHERE_CONDITION, null, SORT_ORDER);

if (cursor != null) {
try {
while (cursor.moveToNext()) {

long messageId = cursor.getLong(0); // id sütunu saklanır
long threadId = cursor.getLong(1); // thread id saklanır
String address = cursor.getString(2); // gönderen adresi saklanır
long contactId = cursor.getLong(3); // kişi id'si saklanır (adres defteriyle ilişkili)
String contactId_string = String.valueOf(contactId);
long timestamp = cursor.getLong(4); // gönderilen zaman saklanır

String body = cursor.getString(5); // mesaj içeriği saklanır

if (!unreadOnly) {
count = 0;
}

SMSMessage smsMessage = new SMSMessage(context, address,
contactId_string, body, timestamp, threadId, count,
messageId); // nesneyi oluşturuyoruz

}
} finally {
cursor.close(); // işimiz bitince cursor kapanmalı yoksa memory leak hatası alırız
}
}
return results; // cevabı döndürüyoruz
}

Aynı yöntemle sistemde saklanan diğer mesaj tiplerine de ulaşabiliriz. Aşağıda bunların bir listesini veriyorum.

SMS Gelen Kutusu = "content://sms/inbox"
Gönderilemeyen SMS = "content://sms/failed"
Bekleyen SMS = "content://sms/queued"
Gönderilmiş SMS = "content://sms/sent"
Taslak SMS = "content://sms/draft"
SMS Giden Kutusu = "content://sms/outbox"
Gönderilememiş SMS = "content://sms/undelivered"
Bütün SMS'ler = "content://sms/all"
Karşılıklı Konuşmalar = "content://sms/conversations"

14 Mart 2010 Pazar

TURKCELL TEKNOLOJİ, FARKINI FARK EDENİ ARIYOR !

Farklıyım, bunu fark ettirmeye de hazırım
Renkliyim, gökyüzü turuncu benim için
Yaratıcıyım, yeniliğin gücüne inanırım

diyorsan, Turkcell Teknoloji seni bekliyor…

Eğer merak ediyorsan; başvuru kriterlerimiz neler diye; üniversite 3.sınıf öğrencisi olman, İngilizce bilginin ileri seviyede olması ve farkını fark ettirebilmen ön kriterlerimiz
Nasıl başvurabilirim diyorsan; farkinifarkedeniariyor@turkcellteknoloji.com.tr ye özgeçmişin ile birlikte başvuru yapabilirsin.

http://www.facebook.com/#!/group.php?gid=314890018690&ref=ts

3 Mart 2010 Çarşamba

Blackberry Uygulama Geliştirme

Bu kadar değişik mobil platforma bulaşmışken Blackberry platformunu atlamak hoş olmazdı. Oldukça yoğun (ve gördüğüm kadarıyla sadık) bir kullanıcı kitlesine sahip Blackberry'ler özellikle iş dünyasında fazlaca tercih edilmekte. Ayrıca uygulamalar oldukça pahalı fiyatlara satılmasına rağmen iyi satış rakamlarına ulaşmakta. Durum böyle olunca dil olarak Java kullanan bu platform mobil uygulama geliştiriciler için oldukça cazip bir alan haline geliyor.

Uygulama geliştirmeye başlamadan önce Eclipse sitesinden aynı Android'de olduğu gibi Eclipse IDE indirmenizi öneririm. Versiyon olarak 3.4 Ganymede versiyonunu tercih ediniz, çünkü bu yazının yazıldığı tarihteki Blackberry JDE'leri bu versiyonu destekliyordu. İndirme işlemi bittikten sonra aşağıdaki dosyaları çekmeniz gerekmektedir.

1) BlackBerry_JDE_PluginFull_1.0.0.67
2) eJDE1.0.0.67_With_CP4.5.0.16
3) eJDE-4_7_0_46_Component

Bu dosyaları www.balckberry.com adresinden Developer linkine girerek indirebilirsiniz. Burada kayıt olduktan sonra Java Application Development linkine tıklayıp Development tools and downloads linkine girin ve listelenen dosyaları sırasıyla yükleyin. Eğer geçmiş platformları yüklemek isterseniz http://na.blackberry.com/eng/developers/javaappdev/javadevenv.jsp adresinde önceki JDE versiyonlarını bulabilirsiniz.

BlackBerry_JDE_PluginFull_1.0.0.67 dosyasını kurup yükledikten sonra Eclipse'de yeni proje seçenekleri arasında Blackberry seçeneğini göreceksiniz. BUrada bir proje oluşturarak programınızı geliştirmeye başlayabilirsiniz.

Bir sonraki yazımızda örnek bir Blackberry uygulaması anlatmaya çalışacağız.

28 Şubat 2010 Pazar

JasperReports ArrayList üzerinden veri göndermek

JasperReports ArrayList üzerinden veri göndermek

Daha önceki yazıda JasperReports kullanarak parametreler üzerinden HashMap yardımıyla veri göndermeyi göstermiştik. Şimdi ise ArrayLit yardımıyla nasıl veri yollayabileceğinizi göstereceğiz. Bunun için öncelikle veriyi saklayacağınız bir sınıf yaratın.

public class Data {

private String value1;
private String value2;

public Data(String value1,String value2){
this.value1 = value1;
this.value2 = value2;
}

public String getValue1() {
return value1;
}
public void setValue1(String value1) {
this.value1 = value1;
}
public String getValue2() {
return value2;
}
public void setValue2(String value2) {
this.value2 = value2;
}

}

Data nesnesinin içinde value1 ve value2 adında iki değişken tutuyoruz. Bunlara atayacağımız değerler oluşturacağımız raporun verisi olacak. Şimdi raporu oluşturacak koda bakalım;

final ArrayList<Data> reportRows = new ArrayList<Data>();
for(int i = 0; i < 10; i++){

reportRows.add(new Data(Integer.toString(i), Integer.toString(i * 2));

}
String jasperFileName = "design.jrxml";
String outFile = "output";

// veri kaynağını belirtiyoruz
final JRDataSource dataSource = new JRBeanCollectionDataSource(reportRows);
// jrxml dosyamızı belirtiyoruz
final JasperDesign jasperDesign = JRXmlLoader.load(jasperFileName);
final JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

// raporu oluşturuyoruz
JasperPrint print = JasperFillManager.fillReport(jasperReport, params, dataSource);
JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
// pdf çıktısını oluşturuyoruz
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outFile + ".pdf");
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.exportReport();

Raporumuzda ise ilk olarak değer tanımlamalarını yapmamız gerekiyor;

<field name="value1"/>
<field name="value2"/>

Daha sonra <detail> bandı içine rapor tasarımımızı oluşturuyoruz. <detail> bandını kullanmamızın sebebi dizi içindeki bütün değerler için bir tablo oluşturulması.

<detail>
<band height="21" splitType="Stretch">
<textField>
<reportElement x="15" y="1" width="84" height="20"/>
<box>
<pen lineWidth="0.25"/>
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{value1}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="99" y="1" width="77" height="20"/>
<box>
<pen lineWidth="0.25"/>
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{value2}]]></textFieldExpression>
</textField>
</band>
</detail>

25 Şubat 2010 Perşembe

CNTLM Kurulumu

CNTLM Kurulumu

Eğer siz de kullanıcı tanımlaması gerektiren bir vekil sunucu (proxy) üzerinden internete çıkış yapıyorsanız (örn. MS ISA Server) muhtemelen iPhone simulatörünüz internete erişim sağlayamıyordur. Bunun sebebi iPhone simulatörünün vekil sunucuyla kullanıcı tanımlaması için gereken şifreleme protokollerine sahip olmamasıdır. Bu sorunu çözebilmek için ya vekil sunucuyu pas geçerek internete çıkacaksınız (önr. iPhone tethering) ya da ctnlm adlı programı yükleyeceksiniz.

Cntlm vekil sunucu doğrulamasını kendi gerçekleştirerek bu yeteneğe sahip olmayan programları vekil sunucu üzerinden internete çıkarabilmektedir. Programı kurduktan sonra tek yapmanız gereken bilgisayarınızın vekil sunucu ayarını cntlm kurduğunuz bilgisayarın ip ve port adresine yönlendirmek olacaktır (aynı bilgisayara kurulduysa localhost şeklinde). Şimdi bu programı nasıl yükleyeceğinizi ve kuracağınızı anlatacağız.

1) http://sourceforge.net/projects/cntlm/files/ adresinden sizin için uygun versiyonu çekin. (ben şirketteki masaüstü bilgisayarım sabit ip'ye sahip olduğu için windows versiyonu tercih ettim)
2) Dosyaları çektikten sonra cntlm-install klasörünü açın ve setup.bat dosyasını çalıştırın. Bu sayede gerekli dosyalar Program Files klasörüne kopyalanır ve "Services" altında cntlm'e ait bir servis oluşturulur. Bu sayede bilgisayarınız her açıldığında hizmet otomatik başlayacaktır.
3) Kurulum ayarlarını değiştirmek için Program Files -> Cntlm altında cntlm.ini dosyasını değiştirmeniz gerekmektedir. Burada username ve domain değerlerini değiştirerek vekil sunucunuzla kullanıcı doğrulaması için gerekli bilgileri girin (eğer bilmiyorsanız windows bilgisayarlar için Ctrl+Alt+Del yapıldığında ekrana gelen bilgiler).
4) Şifrenizi açık şekilde girmek çeşitli sakıncalar doğurabilir. Bu yüzden bir DOS penceresi açın, Program Files -> Cntlm altına gelin ve ctnlm -M komutunu çalıştırın. Password: ekranına şifrenizi girin. Bu sayede cntlm şifrenizden hash değerleri yaratacaktır. Bu değerleri username ve domain altına kopyalayın.
5) Daha sonra vekil sunucunun port ve adresini girin. Eğer bilmiyorsanız IE -> Ayarlar -> Internet Seçenekleri -> Bağlantılar -> Yerel Ağ Seçenekleri yolunu takip ederek adres ve port bilgilerine ulaşabilirsiniz.
6) cntlm için dinleyici bir port belirleyin (Listen). Varsayılan değer 3128 eğer başka program tarafından kullanılıyorsa değiştirmeniz gerekebilir. Komut penceresinde netstat -a yazarak LISTENING yazan portlar arasından boş bir port bulabilirsiniz.
7) Auth değeri ise vekil sunucunun kullandığı şifreleme protokolüdür. Eğer değerden emin değilseniz komut satırında cntlm -M diyerek deneme yapabilirsiniz.
8) Bütün ayarları bitirdiğinizde servisi yeniden başlatın ve komut satırına gelerek cntlm -I -M http://google.com -v -f komutunu çalıştırın. -v -f debug modunu açacağından eğer yanlış bir ayar yapılmışsa kolaylıkla görebilirsiniz. Eğer bağlantı tamamsa HTTP 200/OK mesajını alacaksınız.

Bundan sonra yapmanız gereken diğer bilgisayarlardaki vekil sunucu ayarlarını cntlm kurduğunuz bilgisayarın ip adresi ve cntlm portu olarak değiştirmek olacaktır.

18 Şubat 2010 Perşembe

JasperReports - Parametreden grafik gönderme

JasperReport oldukça kuvvetli ve birçok özellikler sunan bir raporlama aracı olduğundan birçok firma ve kuruluş tarafından kabul görmektedir. Özellikle sunduğu geniş özellikler ve Java içinden çağırılabilmesi sayesinde geliştirdiğiniz raporlama arabirimlerinde bir numaralı tercihiniz olacaktır. Bu örnekte JChart kullanarak bir grafik çizip bunu JasperReports içinden çağırmayı göstereceğiz.

İlk olarak elimizdeki veriyle basit bir XY - grafiği çizelim;

// Eğriye gönderilecek veri dizileri - birden fazla eğri gönderebilirsiniz
XYSeriesCollection dataset = new XYSeriesCollection();
// eğri için veriler
for(int j = 1; j < 4; j++){
XYSeries xy = new XYSeries("Eğri " + j);
for(int i = 0; i < 7; i++){
xy.add(i, j * i);
}
dataset.addSeries(xy);
}

JFreeChart chart = ChartFactory.createXYLineChart(
"Eğri Serisi", // başlık
"X Değerleri", // x ekseni başlığı
"Y Değerleri", // y ekseni başlığı
dataset, // verş
PlotOrientation.VERTICAL,
true,
true,
false);
XYPlot plot = chart.getXYPlot();
SymbolAxis domainAxis = new SymbolAxis("Gunler", dates);
plot.setDomainAxis(domainAxis);
chart.setBackgroundPaint(Color.white);
plot.setOutlinePaint(Color.black);

Oluşturduğumuz grafikle ilgili veriler chart nesnesinde tutulmaktadır. Şimdi ise JasperReports'a göndereceğimiz HashMap'i oluşturalım.

HashMap parameters = new HashMap();
// 1200 x 360 ebatında grafiği çizdir
parameters.put("myChart", chart.createBufferedImage(1200, 360));
parameters.put("bigHeader", "Grafik Denemesi");

Bu şekilde grafiğimizi çizip kaydetmiş olduk. Şimdi ise jasper.jrxml dosyasını çağırıp derleme yapan kodu yazalım. jrxml dosyası oluşturacağınız raporla ilgili tasarımı içermektedir.

// tasarım dosyasını yükle
JasperDesign jasperDesign = JRXmlLoader.load("jasper.jrxml");
// tasarımı derle
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
// rapora verileri yükle
JasperPrint print = JasperFillManager.fillReport(jasperReport, parameters);
// pdf çıktısını hazırla
JRExporter exporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
// cikti dosyasının adını seç
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "cikti.pdf");
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
// pdf dosyasını oluştur
exporter.exportReport();

Oluşturulan pdf dosyasına baktığınızda grafiğinizi göreceksiniz. Aşağıda jrxml dosyasının içeriği verilmiştir. Parametre tanımlarına dikkat ediniz.

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="StreamingDurationperChannels" language="groovy" pageWidth="1220" pageHeight="1200" orientation="Landscape" columnWidth="834" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<style name="Crosstab Data Text" isDefault="false" hAlign="Center"/>
<parameter name="myChart" isForPrompting="false"/>
<parameter name="bigHeader" isForPrompting="false"/>
<background>
<band splitType="Stretch"/>
</background>
<pageHeader>
<band height="418" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="1748" height="30"/>
<textElement>
<font size="16"/>
</textElement>
<textFieldExpression><![CDATA[$P{bigHeader}]]></textFieldExpression>
</textField>
<image scaleImage="RetainShape" hAlign="Center" vAlign="Middle" isUsingCache="false">
<reportElement key="element-41" mode="Opaque" x="0" y="58" width="1214" height="360" forecolor="#000000" backcolor="#FFFFFF"/>
<graphicElement fill="Solid">
<pen lineWidth="0.0" lineStyle="Solid"/>
</graphicElement>
<imageExpression><![CDATA[$P{myChart}]]></imageExpression>
</image>
</band>
</pageHeader>
</jasperReport>

17 Şubat 2010 Çarşamba

Google Maps ve MarkerManager kullanımı

Eğer Google Maps'le uğraşıyorsanız, harita üzerine birden çok imleç koymak ve bunları yönetmek bir noktadan sonra büyük problem olabilmektedir. Çok sayıda imleci kolayca yönetmek için Google'ın yazdığı MarkerManager isimli nesneyi kullanmanızı tavsiye ediyoruz. Dosyaya bu adresten ulaşabilirsiniz. Js dosyasını yükledikten sonra web sayfanızın head kısmına <script type="text/javascript" src="markermanager.js"></script> ekleyerek markermanager.js dosyasını projenize dahil edin.

Şimdi diyelim yüzlerce nokta içeren bir xml dosyamız var. Örneğimizde bu dosyadan noktaları çekip harita üzerinde MarkerManager kullanarak göstereceğiz. xml dosyamız aşağıdaki şekilde tanımlanmış olsun;

<markers>
<marker lat="41" lon="29" name="Imlec 1" />
<marker lat="40" lon="29" name="Imlec 2" />
<marker lat="41" lon="30" name="Imlec 3" />
</markers>

Burada sırasıyla lat ve lon değerleri koordinatları belirlerken name değeri ise imlece verdiğimiz bir isimdir. Öncelikle imleci yaratacak bir fonksiyon tanımlayalım;

function createMarker(point, icon) {
var marker = new GMarker(point, icon);
return marker;
}

Burada point değişkenini xml'den alacağımız koordinatlar olarak belirleyeceğiz. icon ise vereceğimiz ikon dosyasını belirtecek. Aşağıdaki fonksiyonda ise imleçleri çekip MarkerManager içine koyma işlemini tamamlıyoruz.

var map = new GMap2(document.getElementById("map_goster"));
map.addControl(new GLargeMapControl());
//Istanbul'un koordinatına ortala - zoom seviyesi 11
map.setCenter(new GLatLng(41,29), 11);
map.enableDoubleClickZoom();
mgr = new MarkerManager(map);
var testMarkers = [];
GDownloadUrl("marker.xml",function(doc) {
// xml parse işlemi
var xmlDoc = GXml.parse(doc);
// marker dizisi oluşturma
var markers = xmlDoc.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
// koordinatları çekme
var lat = parseFloat(markers[i].getAttribute("lat"));
var lng = parseFloat(markers[i].getAttribute("lan"));
// koordinatları koordinat objesine dönüştürme
var point = new GLatLng(lat,lng);
var name = markers[i].getAttribute("name");
var icon = new GIcon();
icon.image = "images/1_kirmizi.png";
testMarkers.push(createMarker(point,icon));
}
mgr.addMarkers(testMarkers, 9);
mgr.refresh();
});

Burada ilk olarak haritamızla ilgili tanımlamaları yaptık ve MarkerManager'ı haritayla ilişkilendirdik. Daha sonra var testMarkers = []; komutuyla bir dizi yarattık. Daha sonra GDownloadUrl komutuyla xml dosyamızı çağırıp GXml nesnesiyle parse işlemini gerçekleştirdik. Son olarakta createMarker fonksiyonuyla yarattığımız imleçleri testMarkers dizisi içine gömdük. mgr.addMarkers(testMarkers, 9); komutu ise dizi içindeki tüm imleçleri 9 zoom seviyesinden itibaren gösterilmek üzere harita üzerine koyar.

Eğer herhangi bir zamanda imleçleri silmek ve harita üzerindeki imleçleri yeni baştan yaratmak isterseniz yapmanız gereken;
mgr.clear();
mgr.addMarkers(testMarkers, 12);
mgr.refresh();
komutlarını çalıştırmaktır. Bu şekilde harita üzerindeki tüm imleçler silinecek, yerine yeni koyduğunuz imleçler gelecektir. MarkerManager'ın özellikle Ajax çağrılarıyla gelen dinamik imleç verilerinde kullanımı programcıya büyük kolaylıklar sağlamaktadır. MarkerManager'la ilgili dökümantasyona bu adresten ulaşabilirsiniz.

14 Şubat 2010 Pazar

Eclipse Android Kurulumu

Android için yazılım geliştirmek istiyorsanız öncelik IDE tercihiniz Eclipse olmalıdır. Google şu anda resmi olarak sadece Eclipse ortamına destek verdiğinden diğer IDE'lerle ilgili Android eklentileri olmasına rağmen bunları kullanmanızı tavsiye etmiyoruz.

Android ADT eklentisini kurmadan önce bir önceki yazımızda anlattığımız platform kurulumu işlemini gerçekleştirmenizi isteriz. SDK Kurulumundan sonra aşağıdaki adımları izleyerek yazılım geliştirmeye başlayabilirsiniz;

İlk olarak halen kurmadıysanız Eclipse kurulumuna ihtiyacınız olacaktır. Eclipse IDE http://www.eclipse.org/downloads/ adresinden indirilebilir.

Eclipse'i açtıktan sonra Help -> Install New Software diyerek eklenti yükleme ekranına gelin.

Add... diyerek https://dl-ssl.google.com/android/eclipse/ adresini paket yükleme adresi olarak belirtin. Karşınıza Developer Tools altında Android DDMS ve Android Developer Tools paketleri gelecektir. Next diyerek kurulumu bitirin.

Bu aşamadan sonra Window -> Preferences diyerek Android seçeneğine gelin. Burada SDK'yı yüklediğiniz dizini belirtmeniz gerekecektir. Dizini seçtikten sonra SDK kurulumunda seçtiğiniz bütün platformları görebileceksiniz.

Bu aşamadan sonra File -> New -> Other seçeneğinden Android Project seçeneğiyle Android için yazılım geliştirmeye başlayabilirsiniz.

Android SDK Kurulumu

Bu yazımızda Mac kullanıcıları için Android SDK platformunu bilgisayara kurulmasını anlatacağız. Aşağıdaki adımları sırasıyla takip ettiğinizde siz de bilgisayarınızda Anroid için program geliştirmeye ilk adımı atmış olacaksınız.

  • İlk olarak http://developer.android.com/sdk/index.html adresine giderek Mac OS için Android SDK dosyasını bilgisayarınıza indirin. Dosya aşağı yukarı 20 MB ebatlarında olduğundan kurulum kısa sürecektir.

  • Kurulum tamamlandıktan sonra android-sdk-mac_86 klasörü içinde kurulum dosyalarını göreceksiniz. Burada platforms klasörü kurduğunuz Android platformlarını, add-ons klasörü ise platformlara ek olarak gelen API'leri gösterir (örn. Google servisleriyle ilgili API'ler). İlk yüklendiğinde bu klasörler boş gelecektir. Hangilerini yükleyeceğinizi seçmek için Terminal programını çalıştırarak /android-sdk-mac_os/tools klasörüne gelin ve ./android komutuyla Android SDK Manager programını çalıştırın.

  • Karşınıza gelen ekranda Virtual Devices kurulumunu yaptığınız Android sanal makinalarını temsil eder. Platform eklemek için Avaible Packages bölümüne girin ve https://dl-ssl.google.com/android/repository/repository.xml adresini ekleyin (eklenmemişse). Eğer https adreslere girmekte sorun yaşıyorsanız https://dl-ssl.google.com/android/repository/repository.xml adresini deneyebilirsiniz.

  • Seçimlerinizi yaptıktan sonra kullanıcı sözleşmesini kabul ederek yükleme işlemine başlayabilirsiniz.


Yükleme bittikten sonra Installed Packages ekranında kurduğunuz platformları görebilirsiniz. Şu anda piyasa 1.5 versiyon adresler çoğunlukta olduğundan (örn. Samsung i7500 Galaxy) Android Market'te yer alacak bir uygulama hedefliyorsanız tercihinizi bu versiyondan yana kullanabilirsiniz. 2010 yılında gelecek cihazların büyük çoğunluğu ise Android 2.0 olarak duyurulduğunu da bilmenizde fayda var.

Bu aşamadan sonra Eclipse IDE'de yapmanız gereken adımlar olacaktır. Bunları da tamamladıktan sonra Android geliştirme ortamında çalışmaya başlayabilirsiniz. Eclipse'le ilgili kurulumlar platform bağımsız olduğundan bunu bir başka yazıda anlatacağız.