Medina, Saudi Arabia

Panduan Memilih Keyboard Mekanik

Jujur, saya sudah tahu keberadaan keyboard mekanik (Mechanical Keyboard) sejak lama. Namun saya selalu menghindari untuk membelinya, karena waktu itu saya belum bisa membedakan kenyamanan dari keyboard mekanik ini. Baru beberapa bulan lalu, saya ingin membeli satu keyboard, dan ternyata tidak semudah itu menentukan jenis mana yang harus dibeli. Sudah mahal, memilihnya pun sulit. Hadeuh….

Berikut saya ingin bercerita fase tentang perjalanan saya dalam membeli keyboard mekanik ini. Niatnya hanya punya satu, malah jadi beranak punya dua 😀

Dalam menentukan suatu pilihan hidup, ada baiknya selalu mempertanyakan dasar permasalahannya dengan 5W (+1H).

What is mechanical keyboard?

Untuk orang yang berkiprah di bidang teknologi, pasti sudah tahu apa keyboard mekanik. Tapi untuk orang awam, kadang tidak bisa membedakan perbedaan keyboard jenis ini dengan jenis biasa. Tahunya hanya, “keyboardnya mahal”. Mengutip dari sumber ini,

A mechanical keyboard is a keyboard built with high quality, typically spring activated, key switches.

Saya menggarisbawahi key switch. Perbedaan dengan keyboard biasa terletak di key switch. Di dalam keyboard mekanik, setiap tuts key nya memiliki switch nya masing-masing. Sedangkan keyboard biasa, semuanya menjadi satu. Terkadang kita menyebut jenis keyboard biasa dengan keyboard membrane. Karena tidak memiliki dedikasi switch masing-masing.

Ada berapa jenis Switch?

Jenis switch ada 3: Clicky, Tactile dan Linear. Perbedaannya bisa dilihat dari panduan Cherry MX berikut:

sumber: https://www.kitguru.net/peripherals/keyboards/matthew-wilson/the-kitguru-guide-to-mechanical-keyboard-switches/

Mudahnya, jenis Clicky itu berisik, karena setiap kita menekan key nya, akan ada suara klik klik kilk yang sangat mengganggu. Dulu saya tidak tertarik dengan keyboard mekanik karena berisik, saya tidak tahu kalau ada jenis lainnya, yaitu Linear, yang ringan dan tidak terlalu berisik, dan Tactile yang juga tidak terlalu berisik namun masih ada feedback dari peer nya saat menekan key nya.

Yang cukup terkenal itu switch berwarna Biru, Coklat dan Merah. Tiga swtich ini merepresentasikan masing-masing jenis switch yang ada di pasaran. Biru mewakili jenis Clicky, Coklat mewakili Tactile, dan Merah mewakili Linear.

Sejujurnya, saya tidak tahu mau beli yang mana saat itu, yang jelas saya mencoret Clicky type, karena berisik dan mengganggu sekitar. Sekarang pilihan saya antara Linear atau Tactile. Untuk memantapkan pilihan, lebih afdol kalau bisa coba langsung di tokonya. Jadi saya memutuskan untuk mencobanya terlebih dahulu.

 

sumber: https://gaminggem.com/cherry-mx-mechanical-switch-guide/

Rintangan selanjutnya adalah, akan membeli merk apa? Karena merk yang beredar di pasaran sangatlah banyak. Saya direkomendasikan merk yang terkenal, seperti Filco, Keychron, Leopold, Cougar dan Dugord. Masih banyak merk yang agak murah lagi, namun karena mahal saya memutuskan untuk memilih kualitas dulu. Saya diceritakan bahwa Filco masih awet sampai 10 tahun penggunaan. Tapi saya jatuh hati dengan Leopold. Karena dia punya variansi warna yang banyak sekali.

Saya pergi ke toko kommputer yang distribusi keyboard ini. Karena tidak sembarang toko menjual merk ini. Saya coba semua jenis switch yang ada, dan saya jatuh hati dengan Silent Red. Karena ringan dan suaranya nyaris teredam, tidak berisik. Namun, stok untuk jenis ini habis, dan akhirnya saya menjatuhkan pilihan pada Red swtich.

Sebagai referensi, berikut adalah jenis-jenis switch yang beredar di pasaran.

 

Who use mechanical keyboard?

Keyboard jenis ini sangat populer di kalangan gamer dan penggiat IT. Karena harganya yang mahal, jadi agak tersegmentasi target pasarnya. Namun, untuk orang yang hobi atau paham dengan kelebihan keyboard ini, pasti akan membeli satu.

Setelah mencoba mekanik, saya jamin akan sulit untuk kembali menggunakan keyboard biasa. Karena feel nya memang berbeda.

Where to buy mechanical keyboard?

Bisa beli secara offline dan online. Karena saya tinggal di Korea, saya beli secara offline. Karena disini sistemnya bisa testing dulu sebelum membeli. Karena membeli keyboard ini tidak bisa asal beli. Saya akan memberikan rekomendasi beberapa toko, jika anda kebetulan tinggal di Korea juga.

Leopold  | Keychron

When to buy mechanical keyboard?

Kapan saat yang tepat untuk memilikinya? Secepatnya ketika anda sudah lelah menggunakan keyboard biasa. Dan tentunya, ketika dananya sudah ada 🙂

Why buy mechanical keyboard?

Kenapa memutuskan beralih ke keyboard mekanik? Jujur, saya pribadi gara-gara melihat keycaps yang lucu-lucu untuk keyboard mekanik ini. Keunggulan dari keyboard ini selain bisa memilih jenis switchnya, keycaps nya pun bisa di custom sesuai selera. Nanti saya akan memberikan beberapa contoh custom keycaps.

Alasan selanjutnya adalah ketahanan dan kualitas.

Keycaps

Sebagai referensi untuk keycaps, bisa langsung cek di situs berikut:

Jenis-jenis profil Keycaps:

sumber: https://dev.to/codeidoscope/mech-keebs-101-customising-a-keyboard-5cbf

Yang sering saya temui adalah Cherry profile. Key nya cenderung rendah. Lebih mendekati key dari keyboard biasa.

Keyboard Layout

Tidak hanya switch, keycaps, merk saja yang harus dipikirkan saat membeli keyboard. Namun, jenius layout apa yang ingin digunakan. Secara umum, ada 3 jenis layout: Full, TKL dan Compact.

Layout ini dibagi berdasarkan jumlah key yang dipasang di keyboard.

  • Full, kira-kira ada 108 key, key nya lengkap sampai numpad. Atau biasa disebut 100% keyboard
  • TKL (Tenkeyless), sekitar 87 key. Mudahnya tidak ada numpad nya. Atau biasa disebut 80% keyboard.
  • Compact, sekitar 60an key. Tipe ini sangatlah compact. Atau biasa disebut 60% keyboard. Jenis ini sangat ringan, cocok untuk dibawa kemana-mana.

My Keyboards

Setelah mengalami kegalauan panjang, akhirnya saya memutuskan membeli Leopold Pink White FC750 OEM Red switch. Jenis TKL dengan OEM keycaps. Keyboard ini adalah keyboard primary saya. Saya gunakan untuk bekerja sehari-hari.

Lalu saya membeli Keychron K6 RGB Light Brown switch. Keyboard ini saya gunakan di rumah. Karena saya menggunakan Macbook dan beberapa produk Apple lainnya. Kelebihan Keychron adalah dia bisa terhubung ke banyak device, sangat cocok untuk layout produk Apple. Mengenai detail, mungkin akan saya tulis di lain kesempatan.

Pengalaman pertama ujian JLPT N5

Bermula dari ketidaksengajaan melihat pengumuman tes JLPT bulan Desember, saya pun menantang diri saya untuk mengikuti ujian tersebut.
Jujur saja, saya sedang tidak mengikuti kursus bahasa apapun saat ini. Hanya dilandasi kesukaan pada bahasa Jepang, saya ingin mengetahui seberapa parahnya bahasa Jepang saya 😀
Saya memang senang menonton anime Jepang dulu. Pernah punya cita-cita untuk sekolah atau hidup di Jepang juga. Tapi semua sempat tertunda karena yang Maha Kuasa berkehendak lain. Saya malah memiliki kemampuan bahasa lain, yaitu bahasa Korea. Ketika belajar bahasa Korea, saya sadar kalau saya itu memang hobi, dan ada ketertarikan untuk mempelajari banyak bahasa. Bayangkan saja, saya sudah pernah belajar bahasa Prancis sewaktu SMA, bahasa Arab dikala ikut TPA, sewaktu kecil pun saya bisa banyak bahasa daerah: sunda, minang, medan, jawa. Karena saya hidupnya memang suka berpindah-pindah.

Oke, cukup basa basinya. Intinya, saya nekat untuk ikut JLPT tanpa pengetahuan bahasanya itu sendiri. Jarak dari hari pendaftaran ke hari ujian adalah 3 bulan. Saya percaya diri bisa belajar sendiri setiap hari setelah pulang kerja. Agar tidak terlalu berat, saya memutuskan ikut ujian yang levelnya paling rendah, yaitu N5. Saya beli buku panduannya dalam bahasa Korea haha. Belajar bahasa Jepang dengan bahasa pengantar bahasa Korea itu menarik, dan lebih mudah daripada menggunakan bahasa Inggris atau Indonesia.

Minggu awal-awal, semangat masih ada. Semua berjalan lancar. Namun, tiba-tiba saja semua berubah setelah negara api menyerang. Tiba-tiba jam pulang kantor berubah menjadi pulang lebih malam. Setiap akhir pekan pun sudah tak mungkin belajar, karena ada saja kegiatan lain. Hari biasa apalagi, sudah tak bertenaga ketika sampai di rumah. Sampai akhirnya, hari ujian kurang 1 minggu lagi. Saya niat untuk mencoba mempelajarinya lagi, setidaknya latian soal saja. Wah, lagi-lagi yang Maha Kuasa berkata lain. Saya sakit tipes, dan butuh waktu seminggu untuk mengembalikan akal sehat saya. Bahkan saya nyaris tidak ikut ujian pada hari H. Tapi saya bersyukur masih ada sisa-sisa tekad dalam diri ini yang mendorong paksa badan saya ke lokasi ujian.

Saya mendapat bagian ikut ujian di SMAN 81 Jakarta. Tempatnya cukup terpencil, masuk-masuk gang. Padahal ini dulu masuk SMA favorit di Jakarta loh T.T Ga tau deh sekarang. Anyway, tanpa persiapan matang, saya berangkat. Bahkan nyaris lupa membawa alat tulis dan sebagainya. Baiklah, mari kita bahas apa yang berbeda dengan ujian bahasa Korea (TOPIK) yang sering saya ikuti.

  • Lokasi
    JLPT yang saya ikuti kebanyakan lokasinya di SMA SMA daerah sekitar. Kalau TOPIK biasanya di Universitas Korea, atau sekolah internasional Korea.
  • Harga
    Harga ujian JLPT jauh lebih terjangkau daripada harga ujian TOPIK.
  • Level
    JLPT punya 5 level (N1-N5), sedangkan TOPIK hanya ada 2 level, namun hasilnya ada 6 level. Topik I (level 1-2), Topik II (level 3-6). Menurut saya lebih fleksibel pelevelan ujian seperti TOPIK. Karena peserta tidak usah bingung mau ambil level berapa. Justru dengan ikut ujian, jadi tahu kemampuan levelnya. Jujur saja, saya sakit kepala waktu memilih ikut N5 atau N4. Dua level ini untuk pemula, tidak memiliki perbedaan berarti, mungkin ada tambahan kanji dan kosakata yang lebih banyak. Biasanya orang yang sudah menempuh pendidikan bahasa jepang lebih lama, akan langsung ambil N4.
  • Alat Tulis
    JLPT menganjurkan peserta menyiapkan peralatan tulis sendiri, seperti pensil 2B. Sedangkan TOPIK sudah menggunakan spidol komputer, dan disediakan oleh panitia. Jadi ga usah pusing. Kalau saya bunderin, tinggal tipex saja. Sewaktu ujian, saya sempat salah jawab, namun saya tidak bawa penghapus. Jadi ya sudah, ikhlaskan saja 🙂
  • Waktu Ujian
    JLPT mulai pukul 10, namun 9.30 sudah diharapkan duduk diruangan. Sedangkan TOPIK, dibagi 2 sesi, untuk TOPIK I, kalau tidak salah sesi pagi, sedangkan TOPIK II ujiannya siang. Jujur saja, kemarin agak jengkel, karena pengawas datangnya telat. Sampai ada peserta yang menyeletuk “Ini ujiannya jadi ga sih”. Ya wajar saja dia begitu, bayangkan ujian mulai pukul 10.00. 09:45 juga belum datang pengawasnya @@ Sewaktu saya ikut TOPIK, semuanya tepat waktu.
  • Tata Tertib Ujian
    Saya ga paham jujur saja. Jadi kemarin, ketika peserta ingin ke toilet, peraturan mengharuskan didampingi oleh pengawas. Lhaaa, kenapaa? takut berbuat curang? Masih jaman ya? Emang budaya kita kayak gitu, jadinya gampang dicurigai. Tas hanya diletakkan disisi kiri bangku, lalu HP hanya minta disimpan saja dalam tas. Tidak terlalu strict untuk bagian ini. Kalau TOPIK, ada tas khusus untuk nyimpan HP para peserta, sesuai nomor kursinya. Hebat lah. Tas pun dikumpul didepan kelas. Jadi selama ujian beneran ga bisa main HP.

Terlepas dari hasilnya, saya sudah pasrah, saya bersyukur bisa ikut ujian kemarin. Kemarin adalah ujian JLPT pertama saya. Jujur saja, ujian ini cukup menarik. Semoga selanjutnya bisa lebih persiapan lagi. 😀

Microservice #3: Configuring Discovery Service with Zookeeper

Reviewing previous article, the first step to configure is creating the registry/ discovery service with Zookeeper. This is how I did it,

  • Generate a new Spring Boot Project from Visual Code. Run Ctrl+Shift+P to open Command Palette.
  • Type Spring Initialzr.
  • I chose Gradle as the library.
  • Give name and choose the Spring Boot version. I chose the stable version 2.1.3.
  • Pick necessary dependencies: Actuator, Web, Hystrix, Zookeeper, Sleuth, Zipkin, Swagger, Lombok. I mentioned this dependencies in my previous articles.
  • Voila new project generated!

 

Modify build.gradle

 

// zookeeper
  
implementation ('org.springframework.cloud:spring-cloud-starter-zookeeper-discovery') {
  exclude group: 'org.apache.zookeeper', module: 'zookeeper'
}

implementation('org.apache.zookeeper:zookeeper:3.4.13') {
  	exclude group: 'org.slf4j', module: 'slf4j-log4j12'
}

Add annotation in main application class

path: ~\src\main\java\com\[packagename]\[projectname]\TroposApplication.java

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class TroposApplication {

  public static void main(String[] args) {
    SpringApplication.run(TroposApplication.class, args);
  }

}

Configure application.properties

spring.application.name=service01
server.port=8100

# Zookeeper Setting
spring.cloud.zookeeper.discovery.enabled=true
logging.level.org.apache.zookeeper.ClientCnxn=WARN

Create Services Class

I create a simple hello world program

package com.ninan.tropos.service;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class HelloTropos{
    protected String run(){
        log.info("Hello Tropos Discovery Service");
        return "Hello";
    }
}

 

Create Controller Class

package com.ninan.tropos.web;


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class TroposController{

    @GetMapping("/hello")
    public String helloTropos(){
        log.info("calling hello world success");
        return "Hello Tropos";
    }

}

You may run the service and access the http://localhost:8100 on your browser.

If you still find some unidentified error, for example log.info, or anything related to logging function. Make sure you install the Lombok extension on your Visual Code. The environment needs that.

My note:

While creating this file, I found a lot of stuff. Just in case I need for troubleshooting in the future, I want to put my finding here.

Before I wrote the Zookeeper Setting in application.properties and enabling circuit breaker in main java class, actually the web application can be run and accessed. However, it can only be accessed once. After that the server or service is dropped automatically. I am not sure why. I checked the log. A lot of error occurred regarding the zookeeper cannot connect to certain port and so on. So I thought I forgot to configure something. Then I added the zookeeper setting in application.properties and enabling the circuit breaker annotation. Yeah, that solved my problem. the error disappeared and I can load the web several times. But sometimes, the service suddenly down. I might be forget something..

I also found something new while reading the log. Port 2181… what is that? I never read anything about Zookeeper. So I didn’t know that zookeeper has default port for client, which is 2181. There is also another port used, such as 2888 for follower port, and 3888 for election port. Please read the reference below for details.

References:

Zookeeper Book – https://www.oreilly.com/library/view/zookeeper/9781449361297/

Zookeeper Fundamental – https://developer.ibm.com/tutorials/bd-zookeeper/

Source Code:

https://gitlab.com/ninankara/atmosphere

the discovery service is Tropos project.

Microservice #2: Implementing Microservice

In the introduction part, I put some note about the comparison between microservice architecture and monolithic architecture. I am sorry to write it in my mother language :p Well, nothings important, just my summary note of what I’ve read.

In this article, I want to write about step-by-step of how to build a microservice application using spring boot and its library. The architecture I want to build is as follows:

The library included is as follows:

  • User Interface Layer: React
  • Gateway: Zuul
  • Discovery Server: Zookeeper
  • Logging library: Sleuth, Zipkin
  • SVC: Gitlab
  • API Documentation: Swagger
  • Monitoring: Actuator
  • Fault Tolerance: Hystrix
  • Virtual Environment: Docker

Long way to go~~

Actually this architecture is not a really new architecture. We’ve learned it in college. Its called distributed system. In above picture, I separated the service into 5 small services (might be changed in the future haha). To let each service discovers each other, we need to implement one server called Discovery Server. Each service will register himself to the discovery server. So that other service will know how to find this service by asking the discovery server.

The gateway will be used for distributing the accessed service from client. So gateway’s role is to direct the call to the right service.

We need to implement circuit breaker (feature included in Hystrix), to tolerance the fault. In distributed system, error is easily occurred. When error occurred, we need to solve the error as soon as possible before it affect to others and keep spreading. That is why we need circuit breaker, to break the network circuit, so that it prevents the error from spreading.

Step-by-Step:

  1. Configure Zookeeper
  2. Configure Zookeeper in Docker
  3. Configure Gateway
  4. Configure Circuit Breaker
  5. Configure Sleuth, Zipkin
  6. Create Swagger
  7. Configure Actuator

 

Project Source Code:

https://gitlab.com/ninankara/atmosphere

 

References:

https://o7planning.org/en/11733/understanding-spring-cloud-eureka-server-with-example

https://o7planning.org/en/11739/undertanding-load-balancing-in-spring-cloud-with-ribbon-and-example

https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do

Microservice #1: Arsitektur Microservice

Pendahuluan

Sebelum memasuki konsep microservice itu sendiri, ada baiknya memahami seperti apa trend daripada aplikasi web yang dikembangkan.

Perlu satu dua pertemuan tersendiri untuk membahas rinci perbagiannya. Jadi saya hanya akan membuat ringkasannya saja. Gambar diatas saya gambar langsung dari presentasi seorang pakar teknologi disebuah seminar teknologi. Saya lupa sumbernya, karena catatan ini sudah saya buat lama sekali. Saya akan update kalau sumbernya sudah ketemu.

Pada tahun 2008, tren aplikasi web adalah menggunakan arsitektur monolotik, yaitu arsitektur dasar dari aplikasi berbasis web. Klien akan terhubung ke satu server utama ketika mengakses ingin konten. Jika ingin mengakses dari handphone, maka developer akan menyiapkan website untuk mobile version-nya. Tahun 2010, teknologi mulai berkembang. Smartphone mulai bermunculan. Para pengembang mulai mengembangkan aplikasi untuk smartphone. Sejak saat itu, banyak pihak web raksasa yang mulai menyediakan API untuk para pengembang bebas menggunakan data milik mereka. Seperti Twitter, kita bisa menggunakan data-data twitter untuk aplikasi buatan kita sendiri. Sampai akhirnya teori microservice, dengan memecah service menjadi bagian-bagian kecil, mulai digunakan pada aplikasi web modern saat ini. Kalau dulu, aplikasi web biasanya memecah bagian-bagian aplikasi menggunakan kaidah MVC (Model View Controller). Sedangkan microservice memecahnya berdasarkan fungsi. Misal dalam aplikasi toko online, service untuk order akan dipisah dengan service untuk pengiriman.

Monolithic vs Microservice

Monolithic

Strength
Weakness
Faster initial development
easy testing
easy to monitor
complexity in growing code base
longer development cycle
harder to scale

 

Microservice

Strength
Weakness
Agile
Highly scalable
Better organized and easy to learn
Duplicates
More moving parts
Harder to test
Complex distributed system
Increased memory consumption

 

Why Microservice?

Kesimpulannya, arsitektur ini mudah untuk di maintain. Arsitektur yang fleksible, bisa memudahkan bila suatu saat dibuang atau ditambah resourcenya. Ketika ada bagian yang harus dirubah, tidak saling mengganggu kinerja bagian yang lain.

SpringBoot #4: Synchronize Visual Code with Gitlab

For the GUI-user like me, using full command prompt is a quiet awkward haha Because I have no idea where to start. I am not book-type person, I don’t like reading. What I like is exploring the tools, even if I don’t know anything about the tools. So in GUI, I can try the menu one by one. But in terminal. I cannot just try it and execute it right haha

However, git command give me an helpful instruction. Open the help instruction from cmd terminal.

git help

If you read it carefully, you will find what to do first.

If you want to create Git repository locally, you may execute this command. This command is to create an empty Git repository or reinitialize an existing one.

git init

Personally, since I use Gitlab as my Git server, I just need to clone the existing one. So run this command instead. Before run the command, make sure the folder path is the path where you want to save the git repository locally.

git clone [Gitlab Repo URL]

You might find the URL on your Gitlab repository homepage

Now you have connected to Gitlab repository. Now how to synchronize the project.

Push Code

Position the terminal inside the git repository path.

Config the username and email address for accessing the Gitlab using following command

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

Create a new project and generate the project folder inside this repository. Once created, lets try to push it to Gitlab. Go to the active project directory in cmd terminal. Then commit it using this command

git add .
git commit
git push [repository url]

In the terminal, you will be asked to write the push commit message. Insert your message and save it using :wq command line.

You may check the gitlab server now. 😀

Whenever you have change in your code, do the above step to commit and push into gitlab.

To see the changes between your local workspace and gitlab repository, use following command.

git diff

Pull Code

If some of your teams did some changes in the code. You can synchronize the code by pulling the code. You may check it first using the diff command first. Then you can pull it

git pull

Happy Collaborating~ 😀

 

SpringBoot #3: Working with Visual Code Tools

Move away from my main content line in Spring Boot series, I want to insert this topic between the main content. Why? Because this IDE is quite new for me to use when I code Java. I faced a lot of problem with setting up the IDE and spent a lot of time to familiarize with the tool. The IDE I’ve been talking about is Visual Code. If you’ve ever heard about Visual Studio from Microsoft, yeah Visual Code is released by Microsoft as Open Source project.

Once, I was a C# developer. I used Visual Studio for everything. I found it heavy on my laptop. Then a few months ago, I started to explore Java. I used Eclipse most of the time. Without me realizing, my laptop couldn’t handle it. Eclipse is very heavy and made my laptop stopped working.

Then a few weeks ago, my colleague introduced me to this Visual Code IDE. This IDE is a lightweight IDE. And yeah. It was light and simple. You install what you need only. The interface is very.. hollow… Not much to see.

What is the difference between VS Code and VS Community Edition

Both are free. But one is a complete IDE, and others is a lightweight IDE. Actually community edition is not a complete version one, but at least it gives all the basic of what developers need. All the settings are there. However, VS Code needs your experience to just setup the IDE. The concept of VS Code is extension-based IDE tools. I spent a day to familiarize with this extension concept of IDE. You only install extension you need. That is why this IDE is lighter than its predecessor.

VS Code has less interface menu. Most of the menu are hidden. You can execute any instruction using terminal.

Getting Started

To grasp easily how to use VSCode, I will give an example how I create a new SpringBoot Project using VSCode

  1. Download and install the Visual Code.
  2. Install the Spring Boot Extension Pack from Extension menu

 

  1. To create new Spring Boot project, you have to run Spring Initializr from Command Palette
  2. You may open Command Palette from View -> Command Palette, or shortcut key (ctrl+shift+P)
  3. Type Spring Initializr.
  4. Choose either generate Gradle project or Maven project. I will choose Gradle
  5. Just follow the step to complete the palette wizard.
  6. Fill your group id (e.g com.example)
  7. Input your artifact ID, or the name of your project
  8. Specify Spring Boot Version. I choose 2.1.3, the recent one and stable one.
  9. Pick your dependencies by clicking it. And click enter when complete.
  10. Voila! you are ready to code!

 

GUI 101

After generate a new Spring Boot project, you will see following interface.

The most left navigation bar is the basic icon and all extension that you’ve added. From Top to Bottom: Explorer, Search, Source Control, Debug, Extensions, Test, Docker and Gitlab (see the figure above).

Explorer

If you add Spring Boot Extension, you may see the Spring Boot Dashboard at the bottom group. Here you can run the service you’ve created by right click and choose Start to start the service. Sometimes you need to wait for the server appeared. It takes time to load everything I guess.

Usually whenever you create new project, you have 2 choices: either display it in separate window or add to current working workspace.

Workspace is the term for your working space folder 😀 you can put all projects together under the same workspace, so it is easy to view it when the project is correlated each other. If you don’t save the workspace, you might lose this view. You have to save it before closing the IDE. Then load the workspace whenever you want to work again with it on the next day.

Terminal

This is important window to get familiar with. Honestly, when I was using Eclipse, everything can be executed using GUI. But not in VS Code. I need time to find the right command instruction to execute something.

VS Code has own navigation menu for Terminal. You may open the new terminal from there. You also are able to choose which terminal to use. In Windows, you have 3 options: CMD Terminal, Powershell and Git Bash. Open the command palette (shift+ctrl+P), type Terminal: Select Default Shell.

Conclusion

My verdict as per I wrote this article is I like this tools because of its light. Much lighter than my eclipse. I can use command-based terminal to execute instruction. Well, like I said, this IDE doesn’t have much interface menu. Most of the menu is executed by command prompt. That is why we need at least familiarity with terminal.

Convenience to use when developing microservice-based application. Since you need to run a lot of services at the same time, I need most of CPU allocated for my service. Not my IDE.

In next article, I will write step-by-step how to integrate Visual Code with Git. Unlike Eclipse, Git instruction is executed using terminal 😀

 

Pandora #3: King Solomon’s Mines

Akhirnya bisa main pandora lagi haha Kali ini, saya mengajak dua teman saya. Total 3 orang. Tiga orang pun sebenarnya bukan jumlah yang sedikit. Dengan kapasitas ruangan yang memang terbatas, tiga orang justru cukup memberikan ruang untuk bernapas haha Anyway, kali ini adalah game kedua saya di Kelapa Gading. Saya pilih judul ini karena saat ini di Gading hanya tersedia 3 judul. Saya sudah pernah main Alcatraz (link), saya pun ga mau main game tipe horor: Forest of the Dead. Maka jatuhlah pilihan saya ke Solomon ini.
Cerita King Solomon ini berasal dari daerah timur tengah. Kalau melihat sejarahnya, cerita Solomon ini ada dalam Alkitab, sedangkan dalam agama Islam, Solomon adalah Nabi Sulaiman. Kalau misalnya, kalian penggemar cerita Dan Brown, nama Solomon pun sering disebut dalam bukunya.
Namun, pada Pandora Experience, ceritanya adalah kita sebagai arkeolog sedang mencari harta karun yang tersimpan didalam kuburan King Solomon yang mereka sebut King Solomon’s Mine. Dalam perjalanan mencari harta karun tersebut, salah satu saudara arkeolog disekap, sehingga misi kita adalah mencari saudara yang disekap tersebut dan menyelamatkannya.
Suasana ruangannya tidak seram karena memang faktor Fear-nya hanya tiga bintang haha namun judul ini memiliki tingkat kesulitan dan aktivitas fisik yang tinggi, yaitu 5 bintang. Ada beberapa ruangan yang berpasir juga. Diantara game yang pernah saya mainkan, ruangan disini memiliki banyak tangga. Capek jujur xD Bagaimana yang terjadi didalam? Berikut ceritanya…

King Solomon Mines

Ketika masuk, suasananya seperti didalam terowongan. Dinding batu, lalu ada tiang-tiang, ada banyak tali. Mungkin kalau pernah nonton film The Mummy, kira-kira atmosfernya seperti itu. Disebelah kiri ruangan ada dua buku besar berisi kode-kode yang harus dipecahkan. Di sebelah kanan, ada 4 batu yang harus dipecahkan misterinya. Lalu ada tulisan puisi yang dipajang di dinding. Lalu ada lantai 2. Pertama-tama, saya panjat tangga untuk naik ke lantai 2. Disana saya menemukan gulungan yang berbunyi kira-kira petunjuknya ada dalam sebuah puisi, The first is the first, the next is the next. Kira-kira begitu haha udah agak lupa. Lalu teman saya yang pintar, langsung paham, Jadi jawabannya ada di puisi yang tertempel di dinding. Baris pertama puisi, diambil huruf pertamanya saja. Untuk baris kedua, diambil huruf kedua, baris ketiga, huruf ketiga, dan seterusnya. Dari situ kita dapat sebuah kalimat, yaitu Buku Talmud, bab 5 pasal 10. Seperti saya bilang sebelumnya, ada 2 buku besar, salah satunya namanya Talmud.
Lalu kami buka bab 5 dan pasal 10. Kita mulai pecahkan kodenya. Ternyata kode ini mengarah ke 4 bangunan batu tadi. Jadi diatas masing-masing bangunan batu, terdapat kayu yang bisa diputar-putar. Masing-masing bangunan batu memiliki nama, lalu di tiap kayu pun tertulis kata-kata, seperti Cup, Fire, Crown dan Trumpets. Nah, didalam kitab itu semua tertulis untuk nama bangunan, pasangan kayunya apa. Setelah kita mencocokan semua, tidak terjadi apa-apa. Kita pikir ada tombol yang harus ditekan bersamaan. Sampai saya ambil tongkat kayu untuk meniban si kayu haha
Kita pun bingung. Lalu kita tanya ke Game Master. Beliau tanya, bab berapa dan pasal berapa. Kata mas game masternya benar. Terus kita disuruh menjauh dari tangga. Tiba-tiba lampu mati. Kita pun panik, karena tiba-tiba ada suara. Seperti ada yang tergeser. Sewaktu lampu kembali menyala, Tangga yang saya gunakan untuk naik ke lantai 2 tadi bergeser dan membuka ruangan baru!
Oh my god, ternyata memang harus manual lapor ke game masternya untuk lanjut ke ruangan selanjutnya -__-
Lalu kita pun lanjut ke ruangan kedua. Disitu teman saya menemukan kunci, sepertinya untuk membuka kotak di ruangan pertama. Kebetulan saya belum pindah ruangan, maka sayalah yang bertugas untuk membuka kotak tersebut. Saya menemukan saklar untuk dinyalakan. Ternyata saklar itu untuk menyalakan lampu UV untuk menyinari simbol-simbol heliografik pada dinding.
Diruangan selanjutnya, ada 6 potong kayu. Singkatnya kita harus menyusun ke 6 potongan kayu tersebut untuk memecahkan 6 buah huruf kode. Untuk menyusunnya, kita harus menggunakan kode heliograf pada dinding tadi. Selagi 2 teman saya memecahkan kode dinding tersebut, saya berusaha mencari petunjuk lain. Ada semacam kotak kayu, namun kata teman saya tidak ada apa-apa. Tapi ntah kenapa saya rasa ada sesuatu. Dengan spesialisasi saya yang suka merusak barang, saya pun menarik kotak itu berkali-kali. Dan tiba-tiba “bruk”, ada suara kayu jatuh. Hampir mengenai jari saya 😐 Ternyata ada papan yang terbuka, saya menemukan sebuah cryptex. Butuh 6 kode huruf untuk membukanya. Ah! Jadi 6 huruf dari potongan kayu itu untuk membuka cryptex ini haha
Next problem, kita bingung mengurutkan kayu tersebut. Soalnya ditiap simbol, ada segitiga kecil, jumlahnya 1, 4, 10 dan 11. Yang jumlahnya 10 dan 11, masing-masing ada 2 kayu. Kita bingung mana yang lebih dulu. Ah, yang penting kayu yang 1 dan 4 sudah jelas. Kita sudah taruh ditempat yang seharusnya. Dapat huruf W dan I. Untuk kayu ketiga adalah simbol dengan segitiga 10 buah. Hanya saja yang mana masih bingung. Teman saya yang jenius punya teori, yasudah kita coba saja. Ntah giman caranya, kita dapat huruf ketiga, yaitu S. Belum kita urutkan semua, tiba-tiba teman saya nyeletuk, WISDOM kali ini? Haha lalu saya coba masukkan huruf-huruf tersebut. Dan… terbukalah cryptex nya HAHAHAHA suatu kebetulan yang hebat. Sampai detik ini kita belum minta bantuan game master. Dari dalam cryptex kita menemukan kunci. Tapi kita blm menemukan kunci apakah ini. Kita coba membuka kunci diruangan pertama lantai 2, tapi salah. Membuka kunci di ventilasi ruangan kedua pun bukan. Lalu kita tanya, ini kunci untuk apa?
Dua teman saya saat ini berada di lantai 2 diruangan pertama. Saya dibawah. Game master memerintahkan saya untuk ke ruangan kedua. Katanya ada pintu rahasia. Saya mencari tapi tidak ketemu. Lalu game master menyuruh kita berkumpul diruangan kedua, namun teman saya tidak bisa turun, karena tangga untuk turun bergeser kedalam jika ingin keruangan kedua. Namun kalau saya kembalikan ke ruangan pertama, saya yang terjebak diruangan kedua hahaha karena saya takut, saya kembali keruangan pertama lalu menarik tangga agar teman saya bisa turun.
Lalu, kami bertiga kembali ke ruangan kedua untuk mencari pintu rahasia itu. Namun tidak ketemu. Lalu game master memberi instruksi untuk mendorong tangga tadi. Jreng-jreng!! Ada dooong itu pintunya dibalik tangga -__-
Seandainya tadi saya berani dan rela untuk terjebak, pasti tadi liat itu pintu. Hisshh saya menyesal akan ketidakberanian saya tadi. Haha
Dari pintu tadi, ada lorong menuju ruangan ketiga. Disitu ada papan bergambar kuda dan bertuliskan zodiak. Namun tidak ada apa-apa. Lalu teman saya yang didepan menemukan pintu rahasia, pintu menuju ruangan bawah. Haha ruangan bawah ini agak berpasir. Lalu kita menemukan papan lanjutan si kuda. Ternyata ini adalah pion kuda dalam catur. Diruang berpasir ini, ada lukisan besar berisi alfabet. Lalu ada kotak terkunci, dimana ada papan kayu yang berisi kode. If you choose the right path, you will stay in the grid. Kira-kira bunyinya begitu. Awalnya kita tidak ngeh ada kode dibalik papan kayu, maka teman saya mencari petunjuk ditempat lain. Saya tetap diruangan pasir tadi, dan menemukan sebuah sekrup. Saya buka sekrup tadi, dan ternyata ada ruangan yang bisa didorong haha. Tapi sebelumnya, kita harus buka kotak terkunci tadi. Kita harus memecahkan 5 digit huruf. Jadi dibalik papan kayu tadi, ada langkah-langkah, seperti langkah pion kuda. Huruf L begitu. Tapi masalahnya, kita ga tau harus mulai dari mana. Ahahaha. Kita nyerah dan tanya petunjuk. Katanya, mulainya dari huruf yang kolom pertama. Pilih 1 dari 4 huruf yang ada. Kalau benar, anda akan tetap didalam grid. OOOOhhh jadi itu maksud kata2nyaaa. Hahahaha
Terbukalah kotak tadi. Kalau ga salah kunci sih isinya. Ini untuk buka ventilasi diruangan kedua kalau ga salah. Awalnya kita kira untuk buka pintu diruangan pertama, ternyata bukan. Dari ventilasi ini, ditemukan kunci, ternyata inilah yang digunakan untuk membuka pintu. Kalau tidak salah ingat begitu ya haha jujur, kuncinya banyak banget, yang mana untuk mana juga ga inget haha
Di pintu lantai dua tadi ada lukisan 10 comandements. Kita pikir itu petunjuknya, ternyata bukan hahhaha didinding lain, ada lukisan. Katanya ada mekanisme yang harus dibuka. Lalu saya coba sentuh lukisan tadi. Saya coba geser, eh kegeser HAHAHA itu ternyata untuk membuka jalan baru. Kita kembali ke ventilasi tadi, kita merangkak disana. Dan benarlah ada jalan baru. Awalnya tidak ada jalan sama sekali.. Masih takjub dengan disain ruangan di Pandora ini memang haha
Teman saya, turun, dia menemukan kode-kode lagi, kata dia mungkin kita harus kembali ke papan pion kuda tadi. Kayaknya itu urutan alfabet disana. Karena saya selalu dibelakang, saya disuruh kembali. Namun ketika kembali, tiba-tiba game master melarang saya kembali. Seluruh pemain disuruh berkumpul diruangan terakhir. APA?? Terakhir?? Haha Kita udah nyaris melepaskan diri ternyata.
Game master bilang kalau kuncinya ada dilukisan dinding. The end is only beginning gitu buktinya. Lalu dengan reflek, ah mungkin ini alfabet urutannya dibalik. Dengan sangat lemot, kita pun coba mengurutkan dari belakang. Didapatkan kata-kata REHOB kalau ga salah. Saya pikir itu random word. Setelah selesai, saya coba cari kisah tentang Solomon. Oh tidak, ternyata REHOB adalah nama suksesor kerajaan. Dan wisdom adalah mukjizat nabi Sulaiman. Oh well, semua yang didalam ternyata bukan kebetulan ahhahahaa
Keren laaah, dengan kode tadi, kita menemukan HOLY GRAIL!!!
Lalu cawan itu kita taruh di singgasana batu. Memang, tidak ada yang terjadi secara otomatis. Kita laporan dulu sama Game Master. Dan tiba-tiba lampu padam, dan jedeeer, ada suara pintu terbuka hahaa kita kaget dan bingung. Lalu tiba-tiba layar TV menyala, dan menyatakan kalau dibalik bangunan batu tempat menaruh Holy Grail tadi ada ruangan tersembunyi. Ternyata saudara sang arkeolog disekap disana. Dan kami pun melarikan diri tanpa menemukan harta karun sang raja Solomon. Setelah mencari tau, ternyata harta Solomon yang sebenarnya ada disalah satu titik di laut Atlantis., Oh noooo We want the treasures!! Haha
Mungkin bakal ada judul lanjutannya yang lagi dirancang oleh Pandora. Kalau misal liat kotak penyimpanan barang di Gading, ada 1 kotak bertuliskan coming soon memang haha

 

Ntah karena judul ini gampang atau engga, tapi dikatakan kalau tingkat kesulitannya 5 bintang. Soalnya, kita bisa kabur dalam waktu 1 jam 36 menit! Itungannya cepat loh. Pas kita keluar, mas nya bilang, “gampang ya” haha
Karena kita pun nyaris tidak bertanya untuk memecahkan petunjuk didalam. Hanya beberapa pertanyaan, karena kita bingung dengan kunci gembok. Dan pintu yang terlalu banyak haha
Tapi ini keren sih. Tangganya banyak banget. Ruangannya rumit. Dibanding alcatraz, mekanisme ruangannya lebih banyak sih. Tapi kalau dari teka-tekinya, lebih susah Solomon. Tapi sejauh ini memang bagus lah Pandora ini haha Ga mengecewakan. Masalah gampang atau tidaknya, rasanya kalau sudah sering main, secara tidak sadar, pola untuk memecahkan teka-tekinya semakin mudah. Karena ada beberapa yang memiliki pola yang sama.
Can’t wait for the next game!!

Fixing Monitor out of Range Samsung Pen Notebook

The problem started when I tried to connect my Samsung Pen notebook to 2nd monitor (HP Compaq LE1711). Quiet old monitor, isn’t it? 😀 My Samsung is equipped with HDMI port and the monitor only has VGA port. So I need to buy the HDMI-VGA cable, or adapter for my notebook. At first, I didn’t think much, I just bought the HDMI-VGA cable at Gramedia near my office.

I tried to connect, no result. The monitor couldn’t detect the signal. Owh, probably the cable was broken. Then I went to exchange the cable. As long as I hold the receipt, I can change the product anytime. Luckily there was one left for the same product. The seller said if this cable is broken too, then I need to wait for month to get the new one. I prayed hoping the cable would be working.

I tried again…. nothing change 🙁

I came back and refund the cable and buy the adapter instead. I really hope it would work. Otherwise I would give up.

I tried to connect… at first nothing happened. And my colleague was trying to help by trying the adapter on their pc and monitor. It works! So, these whole time, the problem was in my notebook and monitor! not in the cable or the adapter!

Why I never think that the notebook could be the problem was because I had another 2nd monitor in my room, and it works. Of course, the monitor was newer and I bought the adapter in Korea. So I thought the problem might be on the cable. I was wrong haha

I tried again, I tried to strengthen the screw… this time different result came out. This time the monitor could detect the signal, but it said “monitor is out of range. change your setting to 1280×1024 60Hz”

Woohoo, lightbulb came out. Simply I opened the Display Setting to change the resolution. Voila.. didn’t work xD

I tried to search the solution in Internet. But mostly the solution was for old version of Windows, probably. Because the setting was different to mine. Anyway, I tried to understand the concept and apply it for Windows 10.

I started to give up. Why? Because even I changed the resolution to lower one. It keep rolling back to original one when I connect it to the 2nd monitor. I tried to change it from BIOS, safe mode or anything like that. But it didn’t work. Even I almost tried to change the display driver, and almost remove it T.T

After several week, I had enough time to think and solve this problem. I read and read again all the solution I found on Internet. Voila~~ another lightbulb came. I found the setting to change the freshrate of the monitor. I change the rate of 2nd monitor, from 59Hz to 60Hz haha I knew, at first I thought, “would it really matter? its only 1Hz different. and the problem was the resolution?”

I tried… and it works 😐 magic!

What a good day

Solution:

  1. Open Display Setting
  2. Go to Advanced Setting Configuration
  3. Open the “Option” configuration for the 2nd monitor
  4. In Monitor tab, change the rate into 60Hz
  5. Apply

After the display come out on 2nd monitor, you can revert back your notebook resolution to its original resolution.

 

Jakarta, 2019 Feb 7th

SpringBoot #2: Deploying WAR file to Google Cloud Server

Intro

Developing an application without deploy it in real server is like making a car without wheel… Useless.. haha

You don’t have to buy a physical server in order to deploy your apps. For learning purpose, there are a lot of free cloud server to use, such as AWS, Google Cloud Platform (GCP), Heroku, Digital Ocean, etc.

Personally, I am using GCP as my server. You can check how to configure GCP here.

Create WAR file

For java, there are two types of deployment packages: JAR and WAR. When you decide to use Springboot, at the beginning we can choose either JAR or WAR in the option. Easy explanation about JAR and WAR.

Since I use Eclipse as IDE and Gradle as library tool, I cannot find a good tutorial to create WAR file that match my requirement. Most of the tutorial show me how to create WAR with Maven, or create WAR using STS, etc. Some of them also use command prompt to generate WAR file. But I have no idea where to run the command 😐 Yeah, I am amateur. So, I tried to find the menu to generate WAR file from eclipse using Gradle.

  1. Open the Gradle Tasks View

  • Find the project name you want to generate the WAR file. Expand the project folder
  • Right click on the build option, then choose Run Gradle Task
  • You may check the WAR file in the libs folder –> [project folder]\build\libs

Deploy to GCP

This part is simpler than I thought. When I tried to find tutorial for this, a lot of articles showed me the luxurious method which is using their Kubernetes feature. Or deploying using SSH. I’ve tried both of them but failed. Then I tried to do it manually. I tried to upload the generated WAR file using tomcat manager gui. Well, it is more complex than I thought. Because you need to reconfigure the size file in the config file. If I’m not mistaken, the default allowed size was 50MB. While my WAR file has 60MB size. So I need to increase the upload size in webapps/manager/WEB-INF/web.xml .

Another way is using File Transfer, such as Filezilla to upload the WAR file into webapps folder. Once it is uploaded, the WAR file is automatically extracted inside the folder. If you have permission issue when uploading, just change the permission file itu 755 or 777 using chmod command.

Once uploaded, you may access it from browser [your website ip]/name_of_war_file

If you want to open it as home root, then rename the WAR file into ROOT.WAR

SpringBoot WAR filed cannot be deployed to Tomcat

Above method is the normal method, after I successfully removed all the error I found when deploying. Actually I spent like 1 month thinking how to solve my problem. I cannot deploy my WAR file to Tomcat. This error was reappearing again and again.

FAIL - Application at context path /myWebApp could not be started
FAIL - Encountered exception org.apache.catalina.LifecycleException:
Failed to start component
[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/myWebApp]]

Copy pasting the error to googling lead me to many wrong solution. However, I’ve all of them, and still not working. Then, I got this idea. In one of the solution said that maybe it is caused by the embedded tomcat inside the Springboot, so I have to configure it as providedRuntime, instead of compile. I’m sure I have configured it like that. But still not working. So I had another idea to check the tomcat version. Yeah!!! FINALLY I found it! The reason I cannot deploy my SpringBoot apps to Tomcat is because the version of both tomcat is different!

SpringBoot used the newest tomcat version, tomcat 9, while my remote server was using Tomcat 7! Why I didn’t realize it sooner!

Then the solution is upgrading the tomcat version at the remote server to 9. I will put extra content below about how I upgrade my tomcat to 9 manually. Yeah, manually, because yum doesn’t have 9 yet.

Honestly, I don’t remember how I upgraded the version in detail. But I will try to write what I remember.

Upgrading Tomcat Version

  • Access remote server using putty
  • Shutdown the current tomcat version service
  • Download the newest version installer from official tomcat website and install the package
  • cd /opt
    wget http://mirror.apache-kr.org/tomcat/tomcat-9/v9.0.10/bin/apache-tomcat-9.0.10.tar.gz
    tar -xzvf apache-tomcat-9.0.10.tar.gz
    rm -rf apache-tomcat-9.0.10.tar.gz
    mv apache-tomcat-9.0.10 tomcat9
    cd tomcat9
    export CATALINA_HOME=/opt/tomcat9/
    
  • Add profile file to configure the default tomcat configuration
  • vi /etc/profile
    
    
  • Fill the profile file with following content
  • CATALINA_BASE=/opt/tomcat9
    CATALINE_HOME=/opt/tomcat9
  • Set user group
  • useradd tomcat
    groupadd apache
    usermod -G apache tomcat
    cd /opt
    chown tomcat:apache /opt/tomcat9/ -R
    
  • Try to start the service
  • /opt/tomcat9/bin/catalina.sh start

     

I am afraid I didn’t write it in detail, but approximately I did the above steps. If the tomcat cannot be run, you may google it. There are a lot of solution about this.

After installed tomcat 9, you may remove the old version of tomcat.