Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

Cari Blog Ini

13 April 2026

Apache HOP

Apache HOP adalah bagian penting dari data warehouse. Fungsinya sebagai pengambil dan pengolah data.
Dia adalah ETL (Extract, Transfer dan Load).

Untuk percobaan pertama, saya gunakan Apache Hop untuk melakukan migrasi dari database Sql Server 2016 ke SQL server 2012. Ada beberapa jalan sih, tapi saya coba pakai ETL sekalian untuk memahami Apache HOP

Jadi ada beberapa tabel yang akan diproses. Gambarnya seperti dibawah ini



Gambar diatas adalah gambar dari Workflow.
Yang saya sudah pelajari sejauh ini, ada dua bagian besar di Apache HOP, yaitu Workflow dan Pipeline.
A pipeline is a linear, automated sequence of stages designed to process data or tasks from start to finish, often running tasks concurrently. A workflow is a broader, often non-linear, set of procedures or rules that manage the overall logic, orchestration, and human-in-the-loop steps to complete a project. 
Dalam case ini, setiap tabel secara umum dibuatkan satu pipeline. 

Tabel input, adalah proses SELECT nya. Sedang table Output adalah proses INSERT INTO nya.
Pada tabel input dan output ada setting untuk connectionnya. Maka connectoin di tabel input adalah koneksi ke SQL Server 2016 sedang output pakai koneksi ke SQL Server 2012 (berarti ada 2 koneksi yang perlu dipsersiapkan sebelumnya).

Namun ada satu tabel yang tidak menggunakan pipeline. Ada tabel yang kolom ID nya pakai identity seed. Yaitu auto incerement. Jika menggunakan pipiline seperti tabel lain, maka akan error terkait kolom identitiy ini.
Untuk itu saya buat workflow lagi terkait masalah ini.

Dari workflow ini, terlihat pertama melakukan cek apakah ada tabel_temp, jika tidak ada maka melakukan pembuatan tabel temp. Kemudian copy dari tabel asli ke tabel temp. Tabel temp ini secara struktur sama persis dengan tabel asli, namun kolom ID nya tidak di set auto identity. Setelah data tercopy ke tabel temp, maka jalan kan query: INSERT INTO tabel_asli SELECT from tabel_temp.

Dalam SQL Script ini juga ditambahkan SET IDENTITY_INSERT tabel_asli ON; agar saat insert ke tabel asli tidak error seperti sebelumnya.
Setelah proses selesai, maka tabel temp dihapus.

Setelah workflow tabel khusus tadi selesai, maka ada proses query SELECT count untuk melihat apakah DB Asal dan DB Tujuan sudah sama.

Saya puas dengan fitur-fitur yang ada di Apache HOP. Lengkap saya kira. Walau hanya mencoba beberapa fitur. 
Selanjutnya akan saya coba untuk kasus data warehouse yang ingin saya buat.



02 Agustus 2023

Dynamics AX 2012 Workflow Stopped error: The SQL database has issued an error.

 Terjadi error workflow dengan tampilan seperti ini:

Stopped (error): session 113 (Sync) UPDATE T1 SET ACCOUNTINGEVENT=5638165117,RECVERSION=786788108 FROM ACCOUNTINGDISTRIBUTION T1 WITH (INDEX(I_7452SOURCEDOCUMENTHEADERIDX)) CROSS JOIN SOURCEDOCUMENTLINE T2 WHERE (((T1.PARTITION=5637144576) AND (T1.ACCOUNTINGEVENT=0) AND (T1.ACCOUNTINGDATE={ d''})) AND (T1.SOURCEDOCUMENTHEADER=5638834650)) AND ((T2.RECID=T1.SOURCEDOCUMENTLINE) AND (T2.ACCOUNTINGSTATUS=4 OR T2.ACCOUNTINGSTATUS=6)) AND (T2.PARTITION=5637144576) [Microsoft][SQL Server Native Client 10.0][SQL Server]Conversion failed when converting date and/or 
time from character string. Object Server 01:  Cannot execute the required database operation.
The SQL database has issued an error.

Penyebabnya adalah tidak disetnya AccountingDate pada tabel PurchReqTable dan PurchReqLine. Kenapa terjadi seperti itu? Tidak tau. Karena secara default harusnya accounting date terisi dengan tanggal saat dibuat.

Solusinya:

Isi accounting date di kedua table tersebut dan pada tabel AccountingDistribution yang berhubungan. (Link melalui table SourceDocumentHeader dan SourceDocumentLine).


Referensi dan ide:

sql server - Dynamics AX 2012: Conversion failed when converting date and/or time from character string - Stack Overflow






26 Mei 2023

Dynamics AX 2012 parameter Args with record

Suatu saat terjadi hal aneh di AX. Dimana ketika user menekan tombol proses, tetapi record yang terupdate bukan record yang dipilih. Saya coba reporduksi bagaimana error tersebut terjadi, namun tidak berhasil. Apa yang saya coba sesuai dengan yang diharapkan. Hingga suatu saat secara tidak sengaja ada rekan saat mencoba fitur baru, dia menekan sebuah tombol dimana tombol tersebut menampilkan dialog terlebih dahulu. Dialog tersebut tanpa modal, setelah dialog muncul, user tetap bisa interaksi dengan form, termasuk menggeser pilihan record yang terpilih. Ternyata ketika dialog muncul dan user menggeser pilihan row maka yang terproses adalah pilihan row yang baru dipilih. Bukan row yang dipilih sebelum dialog tersebut muncul. 

Ternyata di AX jika kita memakai arg.record() sebagai data terpilih, data tersebut bersifat byref (mengambil istilah VB). Jadi ketika user mengganti pilihan record, maka data ikut berubah.

Contoh source dibawah ini:

public static void main(Args arg)
{
    Dialog dlg = new Dialog("TEST");
    
    CustTable tbl = arg.record();
    
    dlg.addText(tbl.AccountNum);
    if (dlg.run())
    {
        info("Selected: " + tbl.AccountNum );
    }
}

Code diatas adalah dialam sebuah Class yang dipanggil oleh MenuAction, dan menu Action menempel pada form yang memiliki data source tabel "CustTable"

Ketika saya pilih baris pertama (kode: 000001), maka tampilan dialog seperti dibawah ini:


Terlihat yang ditampilkan dialog adalah sesuai. Namun kemudian saya pilih row yang lain saat dialog tersebut masih muncul (karena bukan modal).

Terlihat dialog masih menampilkan record awal. Namun saat saya tekan tombol OK maka record yang dipilih ternyata sesuai pilihan terakhir.


Ternyata berbahaya sekali. Karena bisa salah update/proses data. Solusi untuk kasus ini adalah dengan menjadikan dialog menjadi modal. Lihat caranya disini: System Modal Dialog - Microsoft Dynamics AX Forum Community Forum

Cara kedua adalah membiarkan dialog tanpa modal, namun data yang diproses benar, yaitu dengan mengubah code menjadi dibawah ini:

public static void main(Args arg)
{
    Dialog dlg = new Dialog("TEST");
    
    //OLD CODE CustTable tbl = arg.record();
    CustTable tbl = CustTable::findRecId(arg.record().RecId);
    
    dlg.addText(tbl.AccountNum);
    if (dlg.run())
    {
        info("Selected: " + tbl.AccountNum );
    }
}

Pada code yang saya warna biru terlihat variabel tbl bukan dari arg.record() lagi namun query lagi dengan mengambil arg.record().recId. Hasilnya seperti gambar dibawah ini.



19 Januari 2023

Windows server upgrade muter-muter terus (infinite loading/searching)...

 Pada suatu saat saya ingin upgrade veeam yang ada di server backup windows server 2012. Untuk upgrade diharuskan mengupgrade juga powershellnya. Maka saya cari cara untuk upgrade powershellnya, dan dipatkan cukup download offline update dan menjalankannya.

Ternyata tidak berhasil, setelah dijalankan hanya terlihat progress putar-putar. Saya pikir lagi proses download lagi dan lama. Maka saya biarkan sampai 1 hari. Ternyata masih seperti itu. Hmm ada yang tidak beres ini.


Alhamdulillah masalahnya sudah terpecahkan. Server tersebut terkonek ke WSUS untuk update, dan server tersebut pernah saya clone yang mengakibatkan ID server di WSUS nya dobel. Untuk itu maka lakukan hal dibawah ini:

net stop bits
net stop wuauserv
reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v AccountDomainSid /f
reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v PingID /f
reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientId /f
reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientIDValidation /f
rd /s /q "%SystemRoot%\SoftwareDistribution"
net start bits
net start wuauserv
wuauclt /resetauthorization /detectnow
PowerShell.exe (New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow()

Fungsi command diatas adalah untuk mereset registrasi server di wsus. 

13 Desember 2022

Approve Dynamics AX 2012 Workflow by Code (X++)

Untuk membuat fungsi yang melakukan approval atas Sales Order tertentu maka bisa menggunakan kode dibawah ini:


WorkflowWorkItemTable  wfItem;

SalesTable so;

so  = SalesTable::find(<Nomor SO>);

Workflow::activateFromWorkflowType(workFlowTypeStr(<Nama workflow>),  so.RecId, "Accept by x++", false, "<nama user AX>");


select wfItem  

    where wfItem.RefTableId == so.TableId && wfItem.RefRecId == so.RecId

    && wfItem.UserId == curUserId() 

    && wfItem.Status == WorkflowWorkItemStatus::Pending;

    

    if (wfItem) {

        WorkflowWorkItemActionManager::dispatchWorkItemAction(

            wfItem, 

            "Auto Approve by system",

            curUserId(),

            WorkflowWorkItemActionType::Complete,

            menuitemActionStr(<Nama Menu Approval workflow yang digunakan>),

            false); 

    }



Berdasarkan blog: How to approve workflow by Code | Mohammad Aamir Shakil (wordpress.com)

25 Juli 2022

Another instance of CIL generation is already in progress

 Ketika melakukan CIL AX kemudian keluar error seperti dibawah ini:

Another instance of CIL generation is already in progress. Please wait for the operation to complete before retrying.


dan lakukan cek pada file log di folder: C:\Program Files\Microsoft Dynamics AX\60\Server\[SERVICE NAME]\bin\XppIL\Dynamics.Ax.Application.dll.log

Cek isi nya pastikan tidak ada error:

Finished pass 1 at 7/14/2022 4:07:06 PM

Finished pass 2 at 7/14/2022 4:07:07 PM

Finished pass 3 at 7/14/2022 4:07:09 PM

Finished creating types at 7/14/2022 4:07:09 PM

Errors: 0

Warnings: 0

Maka artinya proses CIL berhasil hanya tidak berhasil menampilkan hasil di AX GUI. Untuk itu hapus tabel SYSLASTVALUE (didatabase PROD)
 
select * from SYSLASTVALUE where ELEMENTNAME =  'CIL Generation'

delete from SYSLASTVALUE where ELEMENTNAME = 'CIL Generation'

Sumber: Dynamics AX: Another instance of CIL generation is already in progress. Please wait for the operation to complete before retrying. (kiwiaxguy.blogspot.com)

13 Juni 2022

Perang di Era Internet

Perang Ukraina - Russia mungkin termasuk perang yang fenomenal. Walau perang terus terjadi di bumi ini, tetapi perang Ukraina - Russia terlihat lebih dominan dipemberitaan. Padahal saat ini pun perang terjadi di Timur Tengah, Afrika, Asean dan tempat lain. Namun perang Russia Ukraina berbeda. Perang ini terjadi di tanah Eropa, dan antar bangsa Eropa, dan terjadi pada era informasi datang bagai air bah ke seluruh dunia. Akhirnya beberapa detail perang bisa didapatkan di internet secara bebas. 

Hari ini (13 Juni 2022) di situs liveuamap.com terlihat informasi serangan militer Ukraina atas depo amunisi Russia di Kota Polohy (daerah Ukraina yang saat ini dikuasai Russia). 

Di posting tersebut terdapat video yang menunjukkan gambaran serangan altileri dari udara (sepertinya drone). Terlihat tembakan altileri dilakukan 5 kali. Dimana tembakan 1 dan 2 merupakan tembakan test jarak dan posisi.


Dari video itu saya tergelitik untuk memperikarakan darimana tembakan tersebut dilakukan. Maka saya cek lokasi di google map. Ternyata itu adalah sebuah kantor pertanian, yang kemudian saat dikuasai Russia dijadikan gudang senjata. Dengan mengambil garis lurus dari tembakan pertama, maka gambarannya seperti dibawah ini.

Dengan asumsi senjata yang digunakan adalah altileri buatan amerika M777 yang memiliki jangkauan 40km, maka perkiraannya adalah seperti dibawah ini.



Namun, ketika saya bandingan dengan peta liveuamap.com ternyata area yang diperkirakan dekat dengan garis depan pertempuran. Rasanya tidak mungkin altilery yang berharga dekat dengan garis depan. Yah tidak tau lah. ^_^

24 September 2021

Mencoba plug-in yang sudah ada - Idempiere

Setelah berhasil mempersiapkan environtment dev untuk idempiere 5.1 maka selanjutnya saya mencoba untuk melakukan development plug-in. Namun saya tidak membuat dari nol, karena untuk konsepnya saya masih meraba-raba. Saya coba ambil dari plug-in yang telah ada. Saya pilih coba mengembangkan  Plugin: Create from requisition - iDempiere en. Plug in ini berguna untuk melakukan generate PO line dari requisition line. Default di iDempiere fungsi untuk generate PO langsung melalu menu Create PO from Requisition (Process ID-337) - iDempiere en. Namun saya rasa kurang fleksibel.

Langkahnya:

1. Download dahulu source codenya disini. Kemudian di extract ke folder yang di inginkan.
2. Buka menu File -> Open Project From File System

 

3. Pilih directory tempat folder tadi diekstrak, dan tekan finish. Maka akan muncul project baru seperti dibawah ini.
4. Terlihat JRE yang dipakai adalah Java 1.6 (Java 6). Hal ini karena plug-in tersebut dibuat di iDempiere versi 2.0 yang masih menggunakan Java 6.  Apakah bermasalah? Saya juga belum tahu, tapi amannya saya ganti versi java nya difile MANIFEST.MF (Klik 2x pada file tersebut)

5. Pada tab Overview (Manifest.fm) ubah execution environment menjadi Java 8 seperti gambar dibawah.


6. Pada tab Dependencies terlihat ada error. Hal ini terjadi karena saat ini library yang digunakan berganti nama. Maka lakukan remove kemudian add lagi dengan memilih zk (8.0.2.2)

7. Pilih ZK 8.0.2.2 dan Zul (8.0.2.2) kemudian tekan OK. Di source aslinya hanya ada zkoss library. Di versi idempeire 5.1 library tersebut dipisah menjadi ZK dan Zul.
8. Error akan hilang setelah proses refresh dan build (jika build manual) 
9. Setelah error hilang, setting Run Configurations dan pastikan plugin muncul dipilihan. Centang sehingga saat run plug-in akan terload dan bisa digunakan. 

10. Sebelumnya, kita harus melakukan setting pada Application Dictionary iDempiere yaitu dengan menambah tombol pada tabel C_Order dan window Purchase Order. Jalankan query dibawah ini untuk mudahnya:
ALTER TABLE adempiere.c_order    
ADD COLUMN createfrom CHAR(1) ;

--Columnm
INSERT INTO "ad_column" ("ad_column_id", "ad_client_id", "ad_org_id", "isactive", "created", "updated", "createdby", "updatedby", "name", "description", "help", "version", "entitytype", "columnname", "ad_table_id", "ad_reference_id", "ad_reference_value_id", "ad_val_rule_id", "fieldlength", "defaultvalue", "iskey", "isparent", "ismandatory", "isupdateable", "readonlylogic", "isidentifier", "seqno", "istranslated", "isencrypted", "callout", "vformat", "valuemin", "valuemax", "isselectioncolumn", "ad_element_id", "ad_process_id", "issyncdatabase", "isalwaysupdateable", "columnsql", "mandatorylogic", "infofactoryclass", "isautocomplete", "isallowlogging", "formatpattern", "ad_column_uu", "isallowcopy", "seqnoselection", "istoolbarbutton", "issecure", "ad_chart_id", "fkconstraintname", "fkconstrainttype", "pa_dashboardcontent_id") VALUES (912001, 0, 0, 'Y', '2021-08-14 20:52:31.914', '2021-08-14 20:52:31.914', 0, 0, 'Create lines from', 'Process which will generate a new document lines based on an existing document', 'The Create From process will create a new document based on information in an existing document selected by the user.', 0, 'U', 'CreateFrom', 259, 28, NULL, NULL, 1, NULL, 'N', 'N', 'N', 'Y', NULL, 'N', 0, 'N', 'N', NULL, NULL, NULL, NULL, 'N', 1490, NULL, 'N', 'N', NULL, NULL, NULL, 'N', 'Y', NULL, 'fc189bcf-2b48-4969-818c-2341f6d76749', 'Y', 0, 'Y', 'N', NULL, NULL, 'N', NULL);
--
--Field
INSERT INTO "ad_field" ("ad_field_id", "ad_client_id", "ad_org_id", "isactive", "created", "createdby", "updated", "updatedby", "name", "description", "help", "iscentrallymaintained", "ad_tab_id", "ad_column_id", "ad_fieldgroup_id", "isdisplayed", "displaylogic", "displaylength", "isreadonly", "seqno", "sortno", "issameline", "isheading", "isfieldonly", "isencrypted", "entitytype", "obscuretype", "ad_reference_id", "ismandatory", "included_tab_id", "defaultvalue", "ad_reference_value_id", "ad_val_rule_id", "infofactoryclass", "ad_field_uu", "isallowcopy", "seqnogrid", "isdisplayedgrid", "xposition", "numlines", "columnspan", "isquickentry", "isupdateable", "isalwaysupdateable", "mandatorylogic", "readonlylogic", "istoolbarbutton", "isadvancedfield", "isdefaultfocus", "vformat", "ad_labelstyle_id", "ad_fieldstyle_id") VALUES (912001, 0, 0, 'Y', '2021-08-14 20:55:13.451', 0, '2021-08-14 20:55:13.451', 0, 'Create lines from', 'Process which will generate a new document lines based on an existing document', 'The Create From process will create a new document based on information in an existing document selected by the user.', 'Y', 294, 912001, NULL, 'Y', NULL, 0, 'N', 510, 0, 'N', 'N', 'N', 'N', 'U', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd99471ce-72a0-418d-8809-861d1d3a8a72', NULL, 510, 'Y', 1, 1, 1, 'N', NULL, NULL, NULL, NULL, NULL, 'N', 'N', NULL, NULL, NULL);
11. Buka form PO, maka akan muncul tombol create lines.




Penjelasan:
Fungsi action button di iDempiere ada di class org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java

Di class tersebut, ketika terdapat button dengan nama columnnya "CreateForm" maka akan memanggil fungsi WCreateFromFactory.create(GridTab tab). Fungsi itu akan melist semua object yang memiliki interface ICreateFromFactory baik dicore iDempiere ataupun di plug-in nya. Di plug-in yang kita coba terdapat class  FaaCreateFromFactory yang mengimplementasikan ICreateFromFactory. Kebetulan Tab Purchase Order standartnya tidak ada kolom CreateFrom, jadi cukup menambah kolom CreateFrom akan dapat memanggil form dari plug-in.

Jika kolom sudah ada, maka pendekatannya bisa menggunakan membuat process yang memanggil form custom.

04 Agustus 2021

Setting iDempiere 5.1 Development di Windows 7 secara manual.

Sebetulnya sudah lama saya ingin mulai melakukan development di iDempiere. Namun karena tidak ada hal yang membuat saya harus melakukannya maka ya tidak saya lakukan ☺ Kemudian pada suatu ketika ada hal yang membuat saya harus segera mempersiapkan untuk melakukan development pada iDempiere (versi 5.1). Maka saya pun mulai mempelajari dengan detail apa yang perlu dipersiapkan. Ada beberapa link yang menurut saya cukup memberi gambaran setting idempiere development environtment di windows. Youtube Tutorial


Namun sayangnya ternyata itu hanya untuk idempiere versi 6.1 keatas. Ada perubahan besar di adempiere 5.1 dan 6.1


Disitu disebutkan untuk java minimal java 11 dan migrasi dari buckminster ke maven. Untuk versi dibawah 5 ada tutorial dari evenos, namun tutorial itu dibuat saat buckminster masih digunakan sebagai tools development. Saat ini buckminster sudah tidak dipakai lagi dan jika kita akan install di eclipse maka tidak ada source install nya. Harus install manual. Nah saya masih buta mengenai develop java EE dan setting di eclipsenya. 


Kemudian diantara browsing saya mengenai setting idempiere development, saya mendarat di site www.chuckboecking.com. Pemilik situs itu adalah praktisi idempeire. Dia juga membuka pelatihan ERP, termasuk idempiere, termasuk dalam development dan implementasinya. Namun saat ini saya belum ikut pelatihannya, hanya sekedar tanya melalui email mengenai development idempiere 5.1. Dia bilang untuk idempiere 5.1 sudah terlalu lama dan beberapa link repository componentnya sudah tidak ada. Terutama buckminster. Thank a lot Chuck. 


Dari beberapa kali percobaan configure, akhirnya saya berhasil. Berikut langkah-langkahnya.


1. Download Eclipse Oxigen: download. Jangan lupa download juga JDK 1.8 nya. Setelah java tersetting dengan benar, maka eclipse dapat dibuka dengan sukses.

 Eclipse Java EE IDE for Web Developers. Version: Oxygen.3a Release (4.7.3a)Build id: 20180405-1200


2. Download iDempiere source code. download kemudian di extract di lokasi yang diinginkan. Misal di D:\id-source-51


3. Buka eclipse dengan membuat workspace baru yang lokasinya di tempat extract source idempiere tadi. (D:\id-source-51). Maka tampilan eclipse akan kosong. 

Membuat workspace

Belum ada project

4. Karena kita tidak menggunakan buckminster maka kita tambahkan project dengan cara membuka menu File -> Open Project from File System... pilih folder source (id-source-51). 


Pilih folder import project

5. Maka akan tampil project-project yang ada di folder source seperti dibawah ini. Pilih project yang akan di import. Dimulai dari org.adempiere.base sampai org.slf4j.jdk14. Untuk project org.adempiere.report.jasper.fragment.test di hilangkan centangnya juga.
Tekan Finish.

Pilih project yang diimport (default tercentang semua)



6. Maka tampilan eclipse akan muncul semua project yang dibutuhkan. Namun error!! Ya error karena banyak dependensi yang belum ada. Seharusnya dependensi tersebut didownload oleh proses import dengan buckminster. Namun banyak link yang sudah hilang atau berganti. Selain itu tentu plug-in buckminster sudah tidak ada di eclipse market.
Hasil import project

Contoh masalah dependensi pada org.idempiere.base



7. Kita harus mempersiapkan folder targetPlatform sendiri. Buat folder baru targetPlatform di folder source. Jadi foldernya akan menjadi D:\id-source-51\targetPlatform
Isi target platform dengan file yang ada di folder plugins dari folder idempiere-server. Ya, kita pastinya sudah punya folder idempeire-server dimana kita bisa run idempiere-server dengan lancar. 
Jika folder idempiere server kita ada di D, maka folder pluginnya adalah D:\idempiere-server\plugins


8. Masuk menu di eclipse, Window -> Preferences
Kemudian masuk bagian Plug-in Development - > Target Platform
Target Platform default


9. Tambah taget platform dengan menekan tombol Add pada form Target Platform. Pilih Nothing: Start with empty target difinition. Next. Kemudian muncul form dibawah ini. Isikan name iDempiere. Tekan tombol Add dan pilih Directory. Next. 
Tambah target platform


Masukkan location seperti gambar dibawah. ${workspace_loc}/targetPlatform

Isi dengan target platform folder yang telah dicopy tadi

Tampilan akan seperti gambar dibawah. Tekan finsih.
Hasil dari folder targetplatform


Setelah finsih, akan muncul target platform iDempiere, centang agar menjadi aktif.
Aktivasi iDempiere



10. Setelah proses penambahan target platform, ternyata masih ada error dibeberapa project. Jika di cek maka terlihat error di file  META-INF\manifest.mf
Contoh pada project org.adempiere.base. Terlihat Export Package bsh tidak ada. Hal ini karena pada setiap project folder idempiere harusnya sudah terdapat file-file jar yang digunakan oleh project. File tersebut tergenerate melalui proses Buckminster. 

Masih ada error di manifest.mf


11. Kita akan melakukan proses download jar tersebut manual. Pada setiap folder project akan terdapat file copyjars.xml.  Pada setiap file terdapat beberapa variable, misal url.maven2.lib, yang merupakan url untuk downlad. 

Contoh file copyjars.xml pada project org.adempiere.base


Kita harus setting secara manual di Window -> Preferences -> Ant -> Runtime. Masuk tab Properties.

Tab Properties


Tambah melalui tombol Add Property... Masukkan name dan value dibawah ini (masukkan satu per satu)


Name: url.alpn.boot         
Value: https://repo1.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.12.v20180117/alpn-boot-8.1.12.v20180117.jar

Name: url.file.jp.lib         
Value:  https://sourceforge.net/projects/idempiere/files/binary.file/jarfile/jp-6.3.1

Name: url.file.srv         
Value:  https://sourceforge.net/projects/idempiere/files/binary.file

Name: url.maven.zkoss.lib
Value: https://mavensync.zkoss.org

Name: url.maven2.lib         
Value: https://repo1.maven.org

Setelah ditambah property nya.



12. Untuk setiap folder yang berisi copyjar.xml, maka lakukan: 
Klik kanan pada file tersebut dan jalankan Run As -> Ant Build.  

Contoh hasil proses bulild yang sukses akan muncul seperti dibawah ini

copy:
      [get] Getting: https://repo1.maven.org/maven2/org/slf4j/slf4j-jdk14/1.7.2/slf4j-jdk14-1.7.2.jar
      [get] To: \org.slf4j.jdk14\slf4j-jdk14-1.7.2.jar
      [get] local file date : Fri Oct 12 01:56:03 ICT 2012
      [get]  
BUILD SUCCESSFUL
Total time: 2 seconds
Setelah Ant Build, lanjutkan dengan klik kanan Build Project pada folder Project nya (jika setting autobuild tidak dicentang) 

Jika semua folder project telah di build, maka tidak ada lagi error yang muncul.


13. Lakukan initial folder jetty dengan klik kanan folder project org.adempiere.base kemudian Run As -> Run Configurations ...
Pilih Eclipse Application -> install.app Tekan tombol RUN. Makan akan muncul dialog iDempiere Server Setup. Agar kita tidak perlu mengisi ulang setup, kita bisa copy kan file idempiere.properties dan idempiereEnv.properties dari folder idempiere-server ke folder source idempiere. Kemudian jalankan lagi install.app dan lanjutkan proses setup idempierenya sampai berhasil build.

setup:
BUILD SUCCESSFUL

BUILD SUCCESSFUL
Total time: 0 seconds

*** 2021-07-30 20:08:59.434 idempiere Log (CLogConsole) ***

Pilihan configuration



14. Sekarang kita mencoba RUN iDempiere server melalui eclipse. Buka RUN Configuration, pilih server.product. Kita perlu modifikasi sedikit settingannya untuk jalan di Windows. Pertama bagian arguments. Ganti VM Arguments bagian  -Dorg.zkoss.zk.config.path=file://${workspace_loc}/zk.xml sehinggam menjadi -Dorg.zkoss.zk.config.path=file:///D:/id-source-51/zk.xml  
Sesuaikan dengan folder workspase (workspace location)




Hal ini dilakukan karena masalah backspace yang beda antara linux dan windows.

Alhamdulillah, akhirnya berhasil run idempeire 5.1 (server) via eclipse.

Nah sekarang saya bisa berkreasi di idempiere. 

13 Juli 2021

Elastic untuk Monitoring 1 - Installasi

Dengan server yang cukup banyak, maka kita memerlukan sebuah sistem monitoring untuk mengawasi server-server tersebut. Dikarenakan saat ini kebutuhan tersebut hanya kebutuhan saya secara pribadi, maka saya mencoba mencari solusi open source untuk hal ini.

Beberapa pilihan terbayang, yaitu Nagios, Shinken, dan lainnya. Namun saya tertarik pada Elastic Stack. Dengan membaca fitur-fiturnya saya rasa elastic yang paling cocok dan mudah saya implementasikan. Kebutuhan saya adalah sebuah sistem yang mampu menrecord windows event viewer, network available, dan resource load.

Server untuk Elastic bisa linux atau windows. Di sini saya menggunakan server linux Centos 7. Tutorial resmi dari Elastic untuk installasi dapat di lihat di: https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-elastic-stack.html

Saya melakukan installasi berpedoman pada tutorial tersebut. 


Pertama yang perlu di lakukan adalah install Elsatic Search. Yaitu sebuah NoSQL database. Artinya ini adalah database untuk menyimpan data monitoring. Untuk lebih detail tentang NoSQL database bisa cek di google. Untuk install cukup download di situs elastic stack kemudian eksekusi. Setelah terinstall, lakukan setting di file /etc/elasticsearch/elasticsearch.yml. Mungkin yang perlu di setting adalah bagian network.host. Isikan network host sesuai IP address untuk akses dari luar server.

Port standartnya 9200. Untuk mengetes apakah terinstall dengan sempurna, maka buka di browser http://ip_address:9200. Jika berjalan dengan baik akan mengeluarkan output json di browser.


Kedua, install Kibana. Kibana adalah web application (dan webserver) untuk mengelola monitoring. Dengan tampilan yang menarik, maka akan mempermudah monitoring. Carna installnya tinggal download bentuk tar.gz nya. Setelah ter download, tinggal extract. Bisa dibuat di folder /home atau yang lain. Kemudian run dengan ekseskusi file kibana pada folder bin. ./kibana
Sebelum dijalankan, pastikan dulu settingnya sudah sesuai. Setting bisa dilihat di folder config, file kibana.yml. Yang mungkin perlu di ubah:
server.host, isikan IP address untuk aksesnya.
elasticsearch.host, isikan IP server elasticsearch yang telah terinstall sebelumnya. Kita bisa menginstall elasticsearch dan kibana di server yang berbeda/terpisah.
Kita juga perlu setting
xpack jika ingin meng-enable fitur Alert pada Kibana.

Jika installasi dan setting benar, maka kita bisa akses kibana dengan mengakses via web browser http://ip-kibana:5601


Ketiga, setelah kibana berjalan dengan sempurna, maka kita bisa melakukan installasi beat. Beat adalah agent untuk mengumpulkan data monitoring.

https://www.elastic.co/beats/


Beat berjalan di sisi client (atau server). Terdapat versi windows, linux dan mac.

Filebeat: merupakan beat yang berfungsi mengumpulkan data yang sumbernya berasal dari file log. Pada file beat terdapat fungsi parser yang dapat memproses semua jenis file log. Ada parser bawaan yang tinggal pakai seperti parser untuk log apache.

Metricbeat: merupakan beat yang mengumpulkan data metrik target. Seperti memory usage, processor percentage, disk usage dan lainnya. Bisa berjalan di linux atau windows.

Packetbeat: untuk membaca paket network yang melalui lan card yang ada.

Auditbeat: khusus linux, digunakan membaca data audit di linux

Heartbeat: digunakan sebagai monitoring ping. Cukup di install disatu client yang yang terhubung ke semua network. Kemudian client tersebut akan melakukan ping dengan interval tertentu untuk menggambarkan kondisi target dalam kondisi online atau tidak. Tentu saja diperlukan pengaturan disisi target agar dapat menerima ping.

Winlogbat: digunakan khusus di sistem operasi Windows, berfungsi untuk membaca data eventviewer yang dibutuhkan dan kemudian di simpan di server Elasticsearch.

Untuk menginstall semua beat cukup mudah, tinggal klik-klik saja dan setting sesuai petunjuk. Peru diingat, makin banyak data yang dikumpulkan maka ukuran server elasticsearch nya.

 

Kempat, jika beats telah berjalan dengan benar, maka data akan terkirim ke server elasticsearch dan siap dipresentasikan di Kibana. Di kibana telah tersedia template-template monitoring yang dapat langsung dipakai (tentu dengan setting-setting sedikit). Bisa di explore pada tuorial Kibana. Selain itu kita perlu mempelajari cara query di ElasticSearch karena akan bermanfaat saat membuat tampilan monitoring nya. Kibana juga memiliki fitur Alert, yaitu memberikan alert berdasarkan data ElasticSearch yang kita olah. Misal alert ketika ping gagal lebih dari 5 menit. Namun diversi komunitas ini fungsi ini terbatas, maka kita perlu berkreasi lebih jauh untuk memaksimalkan. 



Implementasi:

Winlogbeat untuk monitoring login. Di setting hanya membaca eventviewer yang mencatat login masuk user.


Monitoring User Login



Metricbeat untuk monitoring kondisi server

Monitoring processor dan memory


Filebeat untuk monitoring HTTP (Apache). Jadi kita bisa melihat log apache tanpa perlu langsung lihat di web servernya
Terlihat adanya percobaan serangan

Heartbeat untuk monitoring PING
Monitoring detail untuk satu host.