Showing posts with label kerjaan. Show all posts
Showing posts with label kerjaan. Show all posts

Wednesday, January 18, 2017

Anomaly in "Repackaging" Jar from SpringBoot Maven Plugin

Springboot Maven Plugin by default, should automatically rewrite Manifest in packaged jar as stated in http://docs.spring.io/spring-boot/docs/current/maven-plugin/usage.html

The original (i.e. non executable) artifact is renamed to .original by default but it is also possible to keep the original artifact using a custom classifier.
The plugin rewrites your manifest, and in particular it manages the Main-Class and Start-Class entries, so if the defaults don't work you have to configure those there (not in the jar plugin).

However, I found case where when I called maven "clean install", it didn't repackage the jar and did not rewrite the Manifest either. Thus, the jar being built was not executable."

The solution is by manually called "spring-boot:repackage" right after "clean install". So instead of maven "clean install", I call maven "clean install spring-boot:repackage".

You can read more about spring-boot:repackage in http://docs.spring.io/spring-boot/docs/current/maven-plugin/repackage-mojo.html.

I haven't found the exact reason why a simple maven "clean install" didn't work but at least now I got the work around.

Tuesday, June 02, 2015

Menggunakan Rsync Sebagai Alternatif SCP

Sebenarnya saya sudah lama mendengar program rsync tetapi selama ini tak pernah menggunakan. Biasanya saya menggunakan scp untuk melakukan transfer antar server.


Karena kemarin ada kebutuhan melakukan transfer file yang cukup besar dengan jaringan lemot, tampaknya saya perlu melirik rsync sebagai alternatif karena ada kemampuan untuk melanjutkan penyalinan data.

Yang saya coba saat ini syntax-nya adalah
rsync -v --partial --append --progress --port 22 [user]@[host]:[path/from/file] [user]@[host]:[path/to/file]

Parameter partial katanya sih untuk mengecek akhir berkas yang hilang. Bila ujung berkas tersebut hilang maka penyalinan berkas dilanjutkan dari ujung yang ada.

Parameter append konon untuk membagi berkas besar menjadi berkas-berkas kecil sehingga bila terputus,ya... ujungnya hilang. Tanpa parameter, setiap ada proses pembatalan maka berkas yang disalin hilang.

Parameter progress agar kemajuan penyalinan berkas ditampilkan ke user.

Jika port SSH-nya tidak standar, maka perintahnya adalah

rsync -v --partial --append --progress -e "ssh -p [portNumber]" [user]@[host]:[path/from/file] [user]@[host]:[path/to/file]

Demikian catatan saya untuk dicontek kembali di masa depan

Wednesday, April 29, 2015

Bagaimana Membuat Clone Baru dari Project Mercurial Berukuran Besar

Terkadang suatu project mercurial sudah sangat lama, nyaris satu dekade, jumlah history-nya sangat banyak sehingga proses clone sukar dilakukan apalagi jika jaringan terbatas. Mercurial tidak memiliki pause and resume dan bahkan rollback setiap kali gagal sehingga mau tak mau proses clone harus dipecah menjadi beberapa proses pull.

Berikut adalah langkah-langkah memecah proses clone.

1. Buat folder baru tempat project mercurial tersebut akan di-clone.

2. Clone hingga revisi tertentu, baik menggunakan aplikasi seperti TortoiseHg atau menggunakan perintah hg clone.

Sebaiknya gunakan revisi yang cukup kecil namun sebagian source code-nya sudah ada misalnya revisi ke-4.
contoh:

hg clone -r 4 http://bitbucket.org/edwinang/owi

3. Selidiki ada berapa revisi yang dimiliki oleh project mercurial tersebut.

Cara paling mudah adalah menggunakan aplikasi tortoiseHg, dan coba pull semua baik lewat fitur workbench atau fitur synchronize dan lihat ada berapa changeset yang dimiliki project tersebut.

Alternatifnya, jika menggunakan perintah command-line, maka buat agar semua progress terlihat dengan syntax
hg pull --verbose --debug

Perhatikan ketika outputnya mulai menyatakan adding changeset dan perhatikan berapa changeset yang muncul.
Misal, saat menampilkan changeset terakhir layar keluaran menyatakan seperti ini:
changesets :11121 chunks
add changeset 044db2dcc931

Artinya saat ini project-nya memiliki 11121 changeset and changeset terakhir memiliki Node ID  044db2dcc931

Sebenarnya, untuk contoh ini, (sumber bitbucket.org/edwinang/owi di tanggal 28th April 2015) Node ID lengkapnya adalah  044db2dcc931faf11738b5d195e2507c932df058

Jika informasi changeset terakhir terlewat, ketika proses adding manifest, total changeset bisa terlihat.

Misalkan, output-nya menyatakan
manifest: 1085/11121 chunks (9.76%)

Artinya saat output tersebut, aplikasi hg sedang mengunduh manifest untuk changeset ke-1085 dari jumlah total 11121 changeset.

Sebenarnya, berarti ada 11125 revisi (karena saat clone pertama kita di revisi 4).

Setelah mengetahui jumlah total changeset, maka rencanakan berapa kali dan di revisi2 ke berapa saja akan dilakukan pull.

4. Lakukan pull untuk revisi tertentu sesuai rencana
hg pull --verbose --debug -r [nomorrevisi]

5. Lakukan update setelah pull revisi tersebut.
hg update --clean

6. Ulangi langkah keempat hingga semua changeset sukses terunduh.

Jika komponen yang sedang diunduh tampak lama sekali tanpa ada kemajuan, sebaiknya pasang sniffer seperti Wireshark untuk mengendus apakah aplikasi hg menyerah atau masih sedang berusaha mengunduh. Gunakan filter ip address server asal lokasi misalnya filter di Wireshark bisa diatur seperti berikut:
ip.addr == [no].[ip].[add].[ress]
contoh:
 ip.addr == 131.103.20.0/16

Jika karena suatu sebab, unduhan terputus dan transaksi tidak berlanjut dan tak bisa rollback, gunakan mercurial recover
hg recover --verbose --debug

Selamat mengunduh project Mercurial!

Tambahan:
kadang satu project terdiri dari beberapa cabang.

Untuk pull sebuah project, pakai parameter -b , contohnya
hg pull -r [version no] --verbose -- debug -b [branch_name]

Sementara untuk update-nya cukup dengan menambahkan nama cabang tersebut setelah hg update.
hg update [branch_name]

Perintah tadi juga bisa digunakan untuk loncat dari cabang ke cabang lain.

Tuesday, October 22, 2013

Galau Soal Framework

Hmppphh...


Begini lho, adik-adik,kakak tidak keberatan untuk belajar hal-hal baru,framework-framework baru.

Sungguh.. beneran..tanya aja bos kita tercinta. 

Tapi saya keberatan kalau permintaan saya untuk menggunakan framework tertentu, pola atau struktur file tertentu, dan kalian mengabaikan begitu saja, tahu-tahu pekerjaan kalian pakai framework lain tanpa mendiskusikan dengan saya.

Lebih kesal lagi adalah, kalian tidak membaca secara teliti mengapa kakak menginginkan pola dan struktur atau framework tertentu,dan kalian menawarkan paksa alternatif yang sama sekali tidak menyelesaikan hal yang kakak sebutkan di instruksi.

Kalau kalian pakai framework lain yang juga menyelesaikan hal yangsaya sebutkan di instruksi, saya tidak keberatan, saya malah senang.Artinya kalian paham instruksi saya dan memiliki ide lain yang lebih bagus daripada ide saya.

Yang kalian lakukan menandakan:

1. kalian tidak memahami instruksi kalian;

2. kalian juga tidak memahami framework yang kalian sarankan;


Ya,saya ingat, kalian pernah cerita sepintas lalu bahwa kalian cuma belajar sekilas tentang framework tersebut di bangku kuliah atau di masa training kalian di perusahaan sebelumnya tanpa punya pengalaman mengimplementasikannya pada project. 

Ya,saya sudah baca source code kalian, sudah baca framework kalian,dan saya punya ide untuk mengintegrasikan apa yang saya mau dengan framework kalian.

Hanya saja, saya sudah berkali-kali mencoba menjelaskan,bahkan membuat sample, lengkap dengan file test yang bisa di-running supaya kalian paham instruksi kalian

Apa harus saya buat sample baru lagi dengan framework alternatif yang kalian tawarkan?

Ngomong2,salah satu method yang saya inginkan tidak ada di kelas kalian. Tanpa satu method vital itu, program kalian akan berat bila jumlah datanya sudah sangat banyak. :)

Ngomong2 lagi, salah satu implementasi kalian juga salah.