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.