Catatan Jasper Report

JasperReport adalah library reporting untuk membuat file docx, pdf, csv, xls. Berbeda dengan aspose/poi yang langsung berinteraksi dengan API microsoft office. Jasper menggunakan engine sendiri.

// TODO

HTML Tag

Jasper support html tag di textfield nya. Namun tidak semua tag di support. dan bold dan italic harus di ubah dulu tag nya.

    public static String convertHtmlTagToJasper(String text) {
        String newText = text;

        newText = newText.replace("<strong>", "<b>");
        newText = newText.replace("</strong>", "</b>");
        newText = newText.replace("<em>", "<i>");
        newText = newText.replace("</em>", "</i>");

        return newText;
    }

Print Tabel Menggunakan ArrayList (bukan datasource/database)

Menggunakan parameter dengan type ArrayList<String>

	<subDataset name="tableDataset">
		<property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
		<parameter name="tableDatasetParam" class="java.util.ArrayList" nestedType="java.lang.String"/>
	</subDataset>

				<jr:table>
					<datasetRun subDataset="tableDataset">
						<datasetParameter name="tableDatasetParam">
							<datasetParameterExpression><![CDATA[$P{kepadaArray}]]></datasetParameterExpression>
						</datasetParameter>
						<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource($P{tableArray}.size())]]></dataSourceExpression>
					</datasetRun>
					<jr:column>
						<property/>
						<jr:detailCell>
							<property/>
							<textField>
								<reportElement/>
								<textFieldExpression><![CDATA[$P{tableDatasetArray}.get($V{REPORT_COUNT} - 1)]]></textFieldExpression>

							</textField>
						</jr:detailCell>
					</jr:column>
				</jr:table>

Catchword

Mengedit Template

Hyperledger Fabric Simpan Data Privat/Konfidensial On-Chain dengan Private Data Collection

//TODO : Warning Post belum selesai

Masalah

Misal ada 5 organisasi yang bergabung dalam blockchain network. Dan ada 2 organisasi yang ingin menjalankan chaincode yang mengandung data privat. Data ini tidak boleh diketahui oleh selain 2 organisasi tersebut. Solusinya adalah membuat channel baru untuk 2 organisasi ini.

Namun ada kasus yang membutuhkan kontrak A di channel X memanggil kontrak B di channel Y. Jika ini bukan transaksi, hanya evaluasi/query, ini bisa dilakukan dengan API invokeChaincode. Sehingga untuk yang bersifat transaksi tidak bisa pakai cara ini. Cara lain adalah meng orkestrasi diluar blockchain (off chain).

Hati hati juga invokeChaincode, query State DB (couchdb/leveldb) tidak sama seperti getState. hanya getState membuat Read Set. Sehingga hanya getState yang menjadi sumber kebeneran. invokeChaincode atau Query state DB hanya digunakan untuk mengambil key/id dari state nya saja. Lalu key itu digunakan untuk mengambil isi state dari key tersebut menggunakan getState.

Solusi : Private Data Collection

// TODO

Alternatif Seblum Private Data Collection

// TODO

Dengan memanfaatkan Off-Chain data. Untuk data yang bersifat privat di buat hash nya (dilakukan diluar blockchain). Lalu hash ini yang di simpan di blockchain. Namun kekurangannya ktia tidak bisa menambah business logic pada data privat ini. Jadinya hanya simpan data dan verifikasi data saja. Solusi ini juga dipakai di blockchain selain hyperledger fabric. Terutama public permissionless blockchain seperti Ethereum.

Contoh Kode

// TODO

https://github.com/IBM/private-data-collections-on-fabric

Work In Progress

https://jira.hyperledger.org/browse/FAB-15536

Tambahan

https://youtube.com/watch?v=yWu4yr-A-f0%3Ffeature%3Doembed

https://youtube.com/watch?v=fcSXLGe9RKw%3Ffeature%3Doembed

https://youtube.com/watch?v=2lvfHpfY4to%3Ffeature%3Doembed

https://youtube.com/watch?v=Y7of9V-tq2w%3Ffeature%3Doembed

Edas Error IEEE The PDF file has not been certified by PDF eXpress

Untuk mahaiswa yang baru nulis paper, mungkin agak asing dengan pdf express seperti saya. Beberapa conference ada yang memberikan panduan mengenai pdf express, namun ada juga yang tidak. Berikut cara nya jika conference anda tidak memberikan panduan nya.

Cari nama conference yang anda ikuti di website ini ini. Lalu klik untuk membuka detilnya.

https://conferences.ieee.org/conferences_events/conferences/search

Simpan/copy angka di URL berikut (50591). Tiap conference berbeda angka nya

Buat akun IEEE express di alamat ini. Masukan angka dari URL tadi ( 50591 ) dan di belakangnya ditambah X menjadi 50591X

https://ieee-pdf-express.org/account/signup

Setelah itu anda bisa mengupload pdf nya di situs ieee-pdf-express.org. Tunggu beberapa menit (maximal 24 jam) untuk proses nya. Setelah itu akan ada email bahwa file pdf yang sudah “ditandatangani” ieee express bisa di download. Anda bisa mendownload pdf dari email ataupun dari website ieee express. Lalu pdf yang baru di download itu anda bisa upload ke edas.

Apa Perbedaan Server Serverless Hosting IaaS Paas Saas Cloud Container VM Bare Metal Colocation dan Lain Lain

Sumber : https://onlineidealab.com/trending-buzzwords-by-2020-on-cloud-computing-trajectory/

Ada teman tanya mengenai hal ini. Saya jawabanya pusing karena terlalu banyak buzzowrd saat ini. Akhirnya saya coba tulis disini karena jawabnya harus panjang supaya gak salah paham 😀

Continue reading “Apa Perbedaan Server Serverless Hosting IaaS Paas Saas Cloud Container VM Bare Metal Colocation dan Lain Lain”

Service layer, Interface, perlu atau tidak?

Spring | Home
Sumber : https://spring.io/

Latar Belakang

(Contoh dalam kasus ini memakai Java framework spring). Namun bisa juga diteramkan di framework/bahasa lain. Umumnya pada spring terdapat beberapa layer berikut.

  1. controller/
  2. service/
  3. repository/

Namun pada beberapa kasus, terlihat overkill. Contohnya untuk fungsi CRUD data master. controller isinya satu baris saja mangil service, pas dicari declaration nya, eh ketemu interface service. Kita coba cari implementasi service nya, isinya satu baris saja manggil dao. Dan kemungkinan besar implementasi dari service dan dao nya akan hanya ada satu seumur hidup, gak akan bertambah.

Continue reading “Service layer, Interface, perlu atau tidak?”

Sejarah Web Application

Sumber: https://eursap.eu/2022/03/23/eursap-blog-sap-a-history-of-the-company-and-the-software/

Para Gen Z seperti Saya mungkin bingung J2EE/Java EE/EJB itu apa. Sebelum internet dan WWW booming pada tahun 90an, sudah ada banyak bahasa pemrograman dan aplikasi yang kompleks. Seperti SAP, Aplikasi yang mengelola semua sistem perusahaan misal kepegawaian, keuangan, dan gudang. Aplikasi ini menggunakan Relasional Database SQL, dan aplikasi native sistem operasi (misal unix) untuk olah data dan antar mukanya.

Sedangkan internet sendiri sudah ada sebelum World Wide Web (WWW). Berikut timeline nya:

TahunLayerNamaDeskripsi
1970InternetNCP (Network Control Protocol)
1970ApplicationTelnet
1970ApplicatoinFTP
1980InternetTCP/IP
1990ApplicationHTTPWorld wide web

World wide web hanya berisi situs berupa static page HTML berisi konten yang terstruktur (h1, h2, body, dll). Hyperlink (<a>) yang menyambungkan situs satu ke situslain nya. Mau mengirim pesan (CRUD) lewat web? tidak bisa karena hanya static file.

Sumber : https://networkencyclopedia.com/common-gateway-interface-cgi/

Oleh karena itu dibuatlah CGI (Common gateway interface) yang menyambungkan (gateway/jembatan) www/html dengan bahasa pemrograman.

Misal kita membuka abdillah.my.id/pesan?id=4 :

  1. Webserver (misal Apache) akan membuat proses baru pesan.exe yang Saya buat pakai bahasa C
  2. pesan.exe tersebut membaca path dan query string nya (/pesan?id=4). Lalu di ekstrak id pesan nya
  3. Mengambil pesan dengan id 4 dari database
  4. Data dari database di masukan ke layout HTML untuk dilihat user
  5. Output dari html nya dikirimkan dari pesan.exe ke webserver
  6. Webserver mengirim file html tersebut ke user.

CGI bisa pakai bahasa apa saja. Karena CGI hanya akal akalan saja, sehingga performanya tidak terlalu bagus. Sekarang umumnya cgi sudah tidak digunakan lagi. Kecuali bahasa stateless seperti PHP. Karena selain bahasa PHP, bisa langsung buka port http tanpa menggunakan webserver. Sehingga tidak perlu perantara, dan membuat proses baru setiap request masuk.

Walaupun umumnya kita juga tetap menggunakan Webserver. Namun komunikasinya menggunakan proxy (bukan CGI). Proxy seperti Apache, Nginx digunakan untuk:

  1. Load balancing. Karena proxy itu ringan dan cepat. Satu proxy mendistribusikan request ke banyak Aplikasi
  2. Cache

Contoh kode CGI menggunakan python :

# Contoh kode CGI menggunakan python. sumber : https://en.wikipedia.org/wiki/Common_Gateway_Interface
#!/usr/bin/env python3
import cgi, cgitb
input_data = cgi.FieldStorage()
print('Content-Type: text/html') # HTML is following
print('<h1>Addition Results</h1>')
num1 = int(input_data["num1"].value)
num2 = int(input_data["num2"].value)
print('<output>{0} + {1} = {2}</output>'.format(num1, num2, num1 + num2))

Pada masa itu CGI cukup banyak digunakan karena mudah. Tapi bagaimana dengan aplikasi bisnis yang kompleks? Sayangnya pilihan bahasa terbatas. Java, bahasa baru pada saat itu terlihat menjanjinkan. Karena bahasa lain seperti C++ lebih sulit. Microsoft agak telat masuk ke pasar ini(ASP/J++/C#/.NET). PHP sekarang berbeda dengan dulu, Object oriented baru ada di PHP versi 3 (1998), namepsace di PHP versi 5.3(2009).

Ada perusahaan yang menambah fitur di java (anggep saja seperti membikin framework), lalu di bungkus dengan nama Application Server. sehingga programmer tidak perlu mengurus yang ribet ribet. Contoh application server pertama adalah Weblogic(Sebelum diakuisi Bea, lalu Oracle), NetDynamic/iPlanet(Sun), Websphere(IBM).

Semua application server ini tidak compatible. Kalau kita ngoding di weblogic, tidak akan bisa dijalankan di websphere dan sebaliknya. Oleh karena itu pada tahun 1999 dibuatlah standar/spesifikasi agar Application Server ini bisa kompatible. Kalau kita ngoding lalu di build menjadi file WAR, file WAR nya ini bisa kita deploy di weblogic maupun di appilcation server lain tanpa mengubah kode. Nama standar/spesifikasi ini adalah J22E dan pada tahun 2005 ganti nama menjadi Java EE dan pada tahun 2019 ganti lagi jadi Jakarta EE.

Sumber : https://tekslate.com/distributed-systems-j2ee-architecture

Apa isi spesifikasi/standar J2EE?. Ada banyak. Webcontainer yang isinya Servlet dan JSP. Dan EJB Container untuk mengurus proses bisnis. Servlet ini memudah kan kita sehingga tidak perlu mengurus CGI dan Webserver lagi, serta performanya lebih cepat. Karena servlet adalah webserver. JSP isinya adalah templating engine untuk HTML. Sehingga HTML yang tadinya statis bisa dinamis berubah isinya. Tidak perlu melakukan “print(‘<h1>’, judul_1, </h1>)” atau concat concat string untuk menjadi html seperti contoh python CGI tadi.

Examples of PHP, JSP and ASP.NET scripts with HTML | Download Table
Sumber: https://www.researchgate.net/figure/Examples-of-PHP-JSP-and-ASPNET-scripts-with-HTML_tbl2_256404467

Selain itu ada fitur seperti clustering(menjalankan aplikasi di lebih dari satu server), monitoring, connection pooling lengkap dah pokoknya. Kalau pakai CGI tadi, harus di setting lagi untuk monitoring dan clustering nya. Kalau J2EE? tinggal install app server di setiap server, sisanya semua beres diurus Application Server. Lebih mudah kan pakai J2EE?.

Tapi ada juga yang bikin pusing seperti EJB. developer merasa EJB itu overkill. Kata Rod Johnson di buku nya, 80 % fitur/teknik pada EJB sebenernya hanya untuk 20 % masalah di dunia ini. Dan kebanyakan dari kita hanya membutuhkan 20% fitur pada EJB. Sehingga lahir lah buku “Expert one to one J2EE development without EJB” yang menjadi cikal bakal lahirnya Spring Framework yang masih berjaya sampai sekarang. Komponen yang baik dari J2EE seperti webcontainer (Servlet+JSP) kita tetep pake, sedangkan yang bikin pusing seperti EJB di ganti ke alternatif yang lebih mudah, yaitu spring.

Dan sekarang application server J2EE misal Weblogic, Websphere, Glassfish, Jboss sudah jarang digunakan jika menggunakan Spring. Di Spring kita menggunakan application server Tomcat yang tidak sesuai standar J2EE karena hanya mengimplementasi spesifikasi WebContainer(Servlet+JSP), tidak ada EJB dan lain lain. Bisa dibilang lebih ringan memory dan startup nya karena tidak memuat semua kompnen J2EE yang tidak dipakai di Spring.

Misal di Spring untuk membuat Restful API kita menggunakan Spring MVC rest(alternatif dari JAX-RS di J2EE). Maka library Spring MVC Rest tersebut tidak di bundle di Application Server tomcat, melainkan akan di bundle bersama WAR/JAR aplikasi Spring nya. Untuk clustering supaya aplikasi bisa dijalankan di banyak server bagimana? Bisa memakai Autoscaling Virtual Machine dari cloud seperti AWS EC2, atau Kubernetes.

Ini spesifikasi lengkap untuk J2EE:

https://stackoverflow.com/questions/37082364/a-summary-of-all-java-ee-specifications
https://dzone.com/articles/why-its-better-to-trust-in-java-ee

Perbandingan J2EE dan Spring :

Sumber : https://www.slideshare.net/reza_rahman/java-ee-and-spring-sidebyside-34320697

Kalau anda pensaran, silahkan kotorkan tangan anda dengan dengan download, jalankan, dan bandingkan biar lebih paham :

Sun J2EE Petstorehttps://www.oracle.com/java/technologies/petstore-v1312.html
J2EE Without EJB Petsrore (Spring) (2004)https://www.wiley.com/en-us/Expert+One+on+One+J2EE+Development+without+EJB-p-9780764573903
Petsore Spring Jaman Now (2020)https://github.com/apache/juneau-petstore

OCI Container Registry API (Oracle Cloud)

Docker container registry menyediakan restful API sebagaimana yang ditulis disini

https://docs.docker.com/registry/spec/api/

Salah satu private registry, yaitu OCI Container Registry (OCIR) juga menggunakan repository docker-compatible. di dokumentasi OCIR, untuk API sama dengan API yang digunakan repository docker pada umumnya

https://docs.oracle.com/en-us/iaas/Content/Registry/Concepts/registryprerequisites.htm

Namun ketika dicoba sign in menggunakan user password untuk mendapatkan token, malah error, Errornya bukan unauthorized/bad request, tapi not found. berarti endpoint nya beda.

Continue reading “OCI Container Registry API (Oracle Cloud)”

ELK Beats/Loki Promtail Log Tidak Terbaca di Oracle Kubernetes Engine (OKE)

Konfigurasi default ELK/Loki stack adalah mengambil log dari docker container di pod yang terletak di tiap node di path /var/log/container/*.log. Namun di OKE file tersebut memang ada, tapi bukan file asli melainkan symbolic link ke file aslinya di /u01/data/docker/containers/*/.log

Sehingga pod daemonset tidak dapat mengakses file tersebut, solusinya adalah menambah volume mount /u01/data/docker/containers/*/.log ke pod daemonset Filebeats/Loki.

Continue reading “ELK Beats/Loki Promtail Log Tidak Terbaca di Oracle Kubernetes Engine (OKE)”