Thursday, December 18, 2014

Integrasi Apple Push Notification services (APNs) dengan library Javapns

Apple Push Notification services
Apple Push Notification services (APNs) merupakan layanan cloud untuk mengirimkan pesan kepada perangkat mobile yang berbasis iOS, mirip seperti Google Cloud Messaging (GCM) yang juga berfungsi untuk mengirimkan pesan kepada perangkat mobile yang berbasis Android OS.

Javapns
Javapns merupakan library yang dapat digunakan oleh programmer Java untuk mempermudah mengirimkan pesan kepada perangkat mobile yang berbasis iOS.

Integrasi Javapns
Beberapa langkah yang perlu dilakukan untuk dapat menggunakan library Javapns.
  1. Download terlebih dahulu dari sini.

  2. Masukan library tersebut kedalam CLASSPATH aplikasi, supaya class-class yang ada didalamnya dapat digunakan.

  3. Buat certificate PKCS12 dari certificate private key PKCS12 dan certificate CERT yang di-download dari Apple.
    • Misal : developer_identity.cer (di-download dari Apple)
    • Misal : mykey.p12 (private key PKCS12)
    • Jalankan perintah-perintah ini dari terminal / shell
    openssl x509 -in developer_identity.cer -inform DER -out developer_identity.pem -outform PEM
    openssl pkcs12 -nocerts -in mykey.p12 -out mykey.pem
    openssl pkcs12 -export -inkey mykey.pem -in developer_identity.pem -out iphone_dev.p12

  4. File iphone_dev.p12 akan digunakan untuk berkomunikasi dengan server APNs.
Source Code
Setelah mendapatkan certificate untuk berkomunikasi dengan server APNs, diperlukan juga device token untuk test ketika mengirimkan pesan kepada perangkat mobile tersebut. Bagaimana cara mendapatkan device token dapat dibaca di-sini.

Setelah mendapatkan device token, lalu saatnya kita code :)


//--------POTONGAN KODE-----------

import javapns.Push;
        
public class PushTest { 
   public static void main(String[] args) {       
      Push.alert("Hello World!", "iphone_dev.p12", "pass-nya", false, "device_token-nya");
   }
}

//--------POTONGAN KODE-----------


Potongan kode diatas merupakan contoh sederhana untuk mengirimkan pesan "Hello World!" kepada perangkat mobile yang memiliki device token "device_token-nya" menggunakan method alert. Argumen parameter ke-empat pada method alert berfungsi untuk membedakan message yang dikirim melalui environment production (true) atau sandbox (false).



//--------POTONGAN KODE-----------

LOGGER.info("Start push message to APN Server");

PushNotificationPayload payload = new PushNotificationPayload();
try {
      payload.addSound("default");
      payload.addAlert("Pesan berantai dari sini");
      payload.addCustomDictionary("property1", "nilai 1");
      payload.addCustomDictionary("property2", "nilai 2");
      payload.addCustomDictionary("property3", "nilai 3");
      payload.addCustomDictionary("property4", "nilai 4");
 
      PushedNotifications pushedNotifications = 
       Push.payload(payload, "iphone_dev.p12", "pass-nya", false, "device_token-nya");

      LOGGER.info("End push message to apple customer, response from apn server : " + pushedNotifications.toString());
} catch (JSONException e) {
      e.printStackTrace();
}

//--------POTONGAN KODE-----------


Sedangkan potongan kode yang diatas ini, merupakan contoh untuk mengirimkan pesan dengan custom payload yang dapat disesuaikan dengan keinginan kita.

Ok, sekian blog kali ini, semoga membantu anda. :)

Wednesday, December 17, 2014

Jasper Template with iReport

Pada kesempatan kali ini saya akan membahas sedikit mengenai Jasper. JasperReports merupakan salah satu reporting tools yang dapat di gunakan untuk membantu kegiatan pembuatan report. Dalam pembuatan sistem sering kali kita membutuhkan pembuatan report.

JasperReports template itu sendiri merupakan sebuah XML file yang disebut JRXML. Untuk mempermudah pembuatan JRXML file kita dapat menggunakan beberapa bantuan tools 3rd party seperti iReport, DynamicReport dan berbagai macam tools lainnya.

Pada kesempatan kali ini kita akan bermain-main dengan iReport. Saya Menggunakan iReport 5.6.0 untuk membantu dalam pembuatan JRXML file. iReport merupakan tools yang memiliki UI designer, sehingga lebih mudah dalam pembuatannya bagi yang tidak terbiasa membuat berbaris-baris tag xml.

iReport dapat menggunakan banyak tipe datasource seperti misalnya database, xml file maupun JSON. Pada kesempatan kali ini kita akan menggunakan empty datasource. Langsung saja kita membuat new file pada iReport File-> New... -> Blank A4 -> Open this template, beri nama file TestReport.jrxml.


Setelah membuat JRXML baru akan muncul tempate awal seperti gambar d bawah. 


Pada pembuatan report, pada report properties default language yang digunakan sebagai expressionnya adalah Groovy. Kita akan menggunakan java sehingga Language dapat kita ganti menjadi java.

Sebelum kita memulai pembuatan report mari sedikit membahas mengenai tampilan yang ada. Pada awal pembuatan report akan terbagi menjadi 7 bagian yang biasa di sebut band.

7 Band pada iReport designer UI : 
  1. Title 
    • Band ini hanya akan muncul satu kali dalam sebuah laporan, yaitu padahal bagian paling atas pada halaman pertama.
  2. Page Header
    • Band ini akan muncul di setiap halaman, berposisi di bagian header setiap halaman atau pada bawah titile band pada halaman pertama.
  3. Column Header
    • Band ini juga akan muncul pada setiap halaman seperti halnya page Header, band ini lebih bertujuan untuk tempat header column yang mungkin akan muncul pada detail band.
  4. Detail
    • Pada template tertulis detail 1 karena band ini dapat ditambahkan lebih dari 1 dalam setiap halamannya. Detail band merupakan tempat untuk menaruh datasource karena memiliki karakteristik akan berulang sebanyak data tersebut. 
  5. Column Footer
    • Column Header akan berada d bawah detail band apabila data pada detail band sudah ditampilkan seluruhnya. Column header akan muncul di setiap halaman.
  6. Page Footer
    • Band ini juga akan muncul di setiap halaman laporan,seperti halnya Page Header, Column Header, maupun Column Footer. Band ini akan muncul di bawah Coulm Footer di setiap halamannya.
  7. Summary
    •  Band ini mirip seperti Title, hanya akan muncul 1x dalam sebuah laporan tetapi d halaman paling akhir sebuah laporan. Tetapi jangan terkecoh dengan design ui yang memperlihatkan dia berada di bagian paling bawah sebuah laporan. Band ini akan berposisi setelah detail atau di atas column Footer.
Setelah membahas mengenai band yang ada dalam JRXML file mari kita menengok di sebelah kiri   terdapat Report inspektor. kita akan membahas mengenai perbedaan parameter, field dan variable  yang terdapat disana untuk membantu kita menentukan pembuatan "variable" yang kita perlukan.

  1. Parameter
    • Parameter merupakan tempat mendekarasikan data yang memiliki key dan data seperti hashmap. Jasper menerima parameter yang sudah mereka siapkan maupun bisa kita buat sendiri. biasa parameter digunakan untuk menampilkan data seperti judul, tujuan pengiriman dll
  2. Field
    • Field merupakan tempat mendeklarasikan data yang memiliki banyak value dengan key yang sama. Seperti data dari table atau bisa d asumsikan tempat untuk mendeklarasikan data yang akan kita dpat dari datasource.
  3. Variable
    • Variable sendiri merupakan tipe data yang dapat diolah di dalam template, seperti melakukan calculation penjumlahan(sum), penghitungan(count) dan berbagai macam kegiatan lainnya.
Tipe Calculation pada Variable

Setelah mengetahui itu marilah kita mulai membuat contoh sebuah laporan. Mari membuat sebuah parameter bernama Title bertipe data string, 4 buah field , income , outcome dan margin yang bertipe data integer dan month yang bertipe data string. Kemudian kita juga membuat 3 buah variable bertipe integer yaitu totalIncome, totalOutcome dan totalMargin dan mengeset properties, calculation = sum dengan expresion yang akan dijumlahkan sesuai kebutuhan masing-masing.
Contoh Properties totalIncome





Kemudian mari kita susun variable,field dan parameter yang sudah kita buat dalam template hingga menjadi seperti gambar di bawah, bisa ditambah label atau image dari pallet yang terletak disebelah kanan template untuk mempercantiknya.



Setelah selesai membuat JRXML file mari membuat java untuk menggenerate report berdasarkan template tersebut. Saya menggunakan new Spring Backend project untuk menaruh code yang bertugas menggenerate reportnya. Jangan lupa menambahkan dependency pada pom.xml untuk jasper : 

<dependency>     
        <groupid>net.sf.jasperreports</groupid>
        <artifactid>jasperreports</artifactid>
        <version>5.0.1</version>
</dependency>

Taruh TestReport.jrxml di folder resource. Kemudian buat class CashFlow yang akan memiliki variable dengan nama dan tipe data yang sama seperti yang kita deklarasikan ketika membuat field di iReport. 

package com.springapp.batch;
public class CashFlow { private String month; private Integer income; private Integer outcome; private Integer margin;
public String getMonth(){ return month; }
public void setMonth(String month) { this.month = month; }
public Integer getIncome() { return income; }
public void setIncome(Integer income) { this.income = income; }
public Integer getOutcome() { return outcome; }
public void setOutcome(Integer outcome) { this.outcome = outcome; }
public Integer getMargin() { return margin; }
public void setMargin() { margin = income-outcome; } }



Setelah itu kita buat class report yang bertugas untuk mengisi data dan menggenerate report.

package com.springapp.batch;
import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import net.sf.jasperreports.engine.design.JasperDesign; import net.sf.jasperreports.engine.xml.JRXmlLoader; import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List;
public class Report {
public void main(){ List<CashFlow> cashFlows = insertData(); try{ String fileName = createDirectory("Laporan_Keuangan_2014"); JRDataSource ds = new JRBeanCollectionDataSource(cashFlows); HashMap params = new HashMap(); params.put("Title","Laporan keuangan"); InputStream reportStream = this.getClass().getResourceAsStream("/TestReport.jrxml"); JasperDesign jd = JRXmlLoader.load(reportStream); JasperReport jr = JasperCompileManager.compileReport(jd); JasperPrint jp = JasperFillManager.fillReport(jr, params, ds); JasperExportManager.exportReportToPdfFile(jp, fileName); }catch (Exception e){ } }
private String createDirectory(String reportName){ String directory = "/Users/rennytanuwijaya/nostra/Test/"; File f=new File(directory); if(!f.exists()){ new File(directory).mkdirs(); } String fileName = directory+"/"+reportName+".pdf"; return fileName; }
private List<CashFlow> insertData(){ List<CashFlow> cashFlows = new ArrayList<CashFlow>(); CashFlow cashFlow1 = new CashFlow(); cashFlow1.setMonth("Januari"); cashFlow1.setIncome(10000000); cashFlow1.setOutcome(9800000); cashFlow1.setMargin(); cashFlows.add(cashFlow1); CashFlow cashFlow2 = new CashFlow(); cashFlow2.setMonth("Februari"); cashFlow2.setIncome(10000000); cashFlow2.setOutcome(9800000); cashFlow2.setMargin(); cashFlows.add(cashFlow2); CashFlow cashFlow3 = new CashFlow(); cashFlow3.setMonth("Maret"); cashFlow3.setIncome(10000000); cashFlow3.setOutcome(9800000); cashFlow3.setMargin(); cashFlows.add(cashFlow3); return cashFlows; } }

Kemudian kita jalankan method main untuk mengisi data dan menggenerate report tersebut.
Berikut adalah hasil dari report yang dihasilkan : 




Demikian saja perkenalan singkat dengan membuat template report menggunakan iReport.
Selamat mencoba..


Tuesday, December 16, 2014

Tutorial Django Administration Site

Django adalah web framework yang berbasis python dan menggunakan arsitektur MTV (Model View Template). Model adalah layer yang digunakan untuk berinteraksi dengan database, Template adalah layer presentasi untuk HTML, XML dan lainnya, sedangkan View adalah layer yang menjelaskan bagaimana data ditampilkan, data didapat dari model dan dikirimkan ke dalam template. 
Django Framework memeliki kelebihan-kelebihan sebagai berikut:
  1. Objet-Relational Mapper
  2. Automatic Admin Interface
  3. Template System
  4. Cache System
  5. Internatiolization
Pada blog kali ini saya akan menggunakan 2 kelebihan dari Django yaitu Automatic Admin Interface dan Object-Relational Mapper. 

Sebelum kita mulai pastikan anda sudah install Django 1.6.5 di komputer anda :D. Installation guide bisa klik disini. Serta database yang digunakan secara default menggunakan SQLite.
  1. Langkah pertama buka command line, cd ke diretkori dimana anda akan menyimpan django code.
    • Jalankan command django-admin.py startproject demoBlog
    • startproject akan membuat file dan folder seperti dibawah:
      demoBlog/
          manage.py
          demoBlog/
              __init__.py
              settings.py
              urls.py
              wsgi.py
  2. Jalankan command ./manage.py runserver dan buka url http://localhost:8000/.
  3. Pada langkah sebelumnya kita berhasil membuat project django, Sekarang kita akan membuat app. App adalah web aplikasi yang melakukan tugas spesifik (contohnya : Contact System). Sedangkan project kumpulan dari konfigurasi dan app
    • Jalankan command python manage.py startapp employee
    • startapp akan membuat file dan folder seperti dibawah:
      employee/
          __init__.py
          admin.py
          models.py
          tests.py
          views.py
  4. Buka file employee/model.py dan isi seperti dibawah:
  5. Register app employee yang sudah dibuat. Buka file demoBlog/setting.py
     
  6. Jalankan command  python manage.py sql  employee. SQL berdasarkan atribut dari class Contact pada file model.py.

  7. Jalankan command  python manage.py syncdb . Dan anda diharuskan mengisi username dan password yang digunakan untuk login ke Administration Site sebagai administrator.
  8. Buka employee/admin.py dan isi seperti dibawah:
  9. Buka http://localhost:8000/admin/ dan login.
  10. Klik Contact.
  11. Untuk memperindah halaman Contact, buka kembali admin.py dan isi seperti dibawah:
  12. Tampilan halaman Contact akan berubah seperti gambar dibawah:



Sekian blog dari saya semoga bermanfaat :).

Referensi:
http://www.djangobook.com/en/2.0/index.html
https://docs.djangoproject.com/en/1.6/

Simple real-time data filtering with EmberJS

Selamat datang di blog perusahaan kami. Pada kesempatan kali ini saya akan coba sharing bagaimana cara melakukan filter data dengan menggunakan EmberJS.

The Basic

Sebelum memulai, ada baiknya anda mengetahui salah satu konsep dasar pada EmberJS yang di sebut computed property di mana fitur ini akan di pakai pada tahap selanjutnya. Sebagaimana yang telah kita ketahui property digunakan untuk mengakses atribut/sifat sebuah object dalam pemrograman ber-orientasi object. EmberJS mengembangkan lebih lanjut konsep property dengan computed property di mana sebuah property dapat bergantung pada property yang lainnya. Ini dilakukan untuk menyesuaikan dengan fitur data binding yang di miliki oleh EmberJS.

Untuk lebih jelasnya akan saya deskripsikan melalui sebuah contoh, dengan membuat aplikasi sederhana untuk menghitung luas segitiga. 

Mari kita mulai. Untuk mempermudah, kita akan menggunakan starter kit EmberJS, karena sudah menyediakan sebuah template project yang sudah di konfigurasi untuk pengembangan aplikasi EmberJS. Anda dapat mengunduh starter kit ini di homepage EmberJS.

Ubah file index.html dan app.js kurang lebih seperti di bawah:



Tujuannya adalah saat alas atau tinggi berubah maka nilai dari "luas" akan otomatis ter-update. Coba anda jalankan sekarang maka anda akan temukan bahwa kenyataannya tidak demikian. Disinilah kita akan gunakan computed property.

Tambahkan 'alas' dan 'tinggi' pada fungsi property. (contoh di bawah)

Jalankan kembali, maka sekarang anda akan temukan bahwa saat anda mengubah alas atau tinggi, maka luas akan di ter-update dengan sendirinya. Ini terjadi karena kita sudah memberitahukan EmberJS bahwa ada korelasi antara property "luas" dengan property "alas" dan "tinggi".


Preparation

Kita akan membuat aplikasi Contact sederhana dengan dua field "nama" dan "email". Untuk melanjutkan tentunya kita membutuhkan data untuk di tampilkan. Agar tetap fokus pada masalah, kita akan menggunakan data dummy saja. Kita akan menggunakan ember-data untuk membantu dalam pembuatan data dummy. Anda dapat mengunduhnya disini.

Letakkan di folder starter-kit/js/libs



Tambahkan referensi ke ember-data pada index.html


Untuk membuat data dummy anda dapat menambahkan kode sebagai berikut pada file app.js

Sedikit penjelasan kode di atas:
  • Pada baris ke 7 saya set adapter dari ember-data ke FixtureAdapter untuk keperluan membuat data dummy. Secara default ember-data menggunakan RestAdapter.
  • Pada baris ke 9 saya membuat model bernama Contact yang akan menjadi domain object dari aplikasi.
  • Pada baris ke 14 saya membuat beberapa data dummy dan meng-asosiasikannya dengan model Contact.
  • Pada baris ke 28, saya mendapatkan data dummy dari interface yang disediakan oleh ember-data.
Untuk sementara kita dapat mencoba dengan melakukan penyesuaian pada index.html


Filtering

Saatnya kita menambahkan fitur filtering pada aplikasi. Tambahkan input field di atas table yang value-nya di bind ke property "filter" pada controller.


Tambahkan property "filteredContent" pada controller sebagai berikut:


Fungsi ini akan melakukan filtering terhadap data. Mungkin anda bertanya-tanya, bagaimana kita bisa mendapatkan data dari property "model", padahal pada controller kita tidak men-definisikan-nya sama sekali. 

Ingatkah anda pada statement di bawah ini:


Ya, disini dilakukan setting terhadap model, sehingga controller dapat mengambil data dengan me-referensikan nya kembali.

Fungsi "filteredContent" melakukan filter terhadap data berdasarkan value dari property "filter" maka di tambahkan referensi ke property "filter", sehingga saat filter berubah prosedur otomatis dijalankan kembali untuk dilakukan pemrosesan ulang (melakukan filtering), seperti yang sudah di jelaskan pada bagian "The Basic" di atas:


Karena sekarang kita mendapatkan data untuk tujuan filtering dari property "filteredContent" maka kita juga harus melakukan penyesuaian pada file index.html sebagai berikut:


Saat di jalankan maka kurang lebih akan tampil seperti di bawah:



Lihat betapa sedikitnya code yang harus di tulis untuk membuat fitur filtering seperti ini dengan EmberJS, tidak terbayangkan kalau anda harus melakukannya tanpa framework sama sekali. Dilihat dari sisi produktifitas dan maintainability maka framework seperti EmberJS membawa dampak yang sangat signifikan pada proses pengembangan aplikasi web.

Source code sudah saya siapkan dan bisa bisa di akses disini. Selamat mencoba!

Referensi:
http://blog.crowdint.com/2014/07/08/simple-collection-s-sorting-and-filtering-with-ember-js.html
http://emberjs.com/guides/controllers/

BPM Fault policy


Pada blog kali ini saya akan menulis fault policy pada BPM / SOA Application. Contohnya pada BPM Application ketika service dalam keadaan mati / down akan membuat state proses menjadi faulted dan tidak dapat di recover.  Jila fault policy di implementasikan maka administrator bisa melakukan recover instance. Berikut contoh error ketika service mati :

Unable to invoke endpoint URI "http://localhost:80/ApplicationProject-context-root/AppServiceSoap12HttpPort" successfully due to: javax.xml.soap.SOAPException: javax.xml.soap.SOAPException: <HTML><HEAD><TITLE>Weblogic Bridge Message</TITLE></HEAD> <BODY><H2>Failure of server APACHE bridge:</H2><P><hr>Internal processing error<hr> </BODY></HTML>




  1. Pertama - tama anda harus membuat project bpm untuk melakukan uji kasus dan tambahkan file xml document dengan nama fault-policies.xml dan fault-bindings.xml.
  2. Buka file fault-policies.xml. Dan isi seperti gambar dibawah: 
  3. Buka file composite.xml dan copy nama service seperti gambar dibawah:
  4. Buka file fault-bindings.xml dan copy nama service seperti gambar dibawah:
  5. Langkah terakhir register fault-binding.xml dan fault-policies.xml pada composite.xml.
     
Nah setelah lakukan 5 langkah diatas maka instance BPM bisa direcover oleh administrator. Dengan cara memanggil ulang service ketika aktif. Berikut contohnya:


Sekian blog dr saya semoga bermanfaat ^_^

Referensi:
https://docs.oracle.com/middleware/1213/bpm/bpm-develop/faultpolicy_bpm.htm#BPMPD87385