Istanbul, Turkey

Pandora #2: Alcatraz – Freedom is an illusion

After succeed playing the first pandora game, I was ready to play another round again. Last time, I told my brothers about me experiencing Pandora Experience. Oh hoo, I received positive responses! I mean I didn’t expect they get interested into it too. My little brother asked me to play right away that day, but I refused because we cannot play unless we reserved it in advance.

In short, I booked Alcatraz in Kelapa Gading. This time, the player was my family.

The location is in front of Mall of Indonesia (MOI). It is not inside the mall, but independent small merchant complex: ruko (rumah-toko) in front of MOI. Since it is not inside the mall, the decoration is more serious. Just look from the entrance, it was like a prison entrance haha Even my parents said that the building looks scary.

I booked at 3.30PM but we arrived at 3.00PM. So we can go inside earlier that the schedule. Not like last time, this story I chose has 2 hours time limit. The price is more expensive, IDR 225.000. Even we got 10% discount, it is still expensive. Fortunately, Traveloka has promo for this escape room game. Since 5 players were playing, it costs IDR 160.000 per person. So here we go, the spoiler inside the toggle :p

Alcatraz

Unlike S.S Poseidon which has espionage genre, Alcatraz has break out genre. The main protagonist was stuck inside the Alcatraz while investigating about the Blue Eyes monster. So, what we need to do is escape from that prison within 2 hours.

We started at prison’s cell. I saw toilet, bucket, and prison’s clothes. There is a locked door we need to unlocked there. We searched the key in the room but found nothing, so we split up, some of us climbed the ladder to second floor. It was a tiny room. I only saw shelf with a lot of plates and glasses. I found nothing. I saw something weird but I did nothing to it. There is a holder you need to rotate to open the hidden chamber. We found some electric cables and locked box.

Well, we waste a lot of time here. Because the riddles was quiet hard and ridiculous to understand. We need to cracked the code, it similar like Braille, Pandora’s own braille code 🙂 Even you cracked the code, nothing come to your mind. You have no choice other than asking the game master. There is an X and O, with two colors, black and red. At first we didn’t know which color to use. Because we only think about finding 5 digits letter to open the lock. We try to cracked it and stop till the first 5 letters. This was our mistake, we should have tried till the end. haha So ignoring the color, we cracked a sentence. That was the first riddle. The second one is, only care about the color, not the shape. You will see 5 letters. Honestly, we thought that was the answer to unlock, but its not! The game master asked us to see the postcard inside the box that we found when climbed the ladder at the first time. It was just a sentence. We thought something good, and we thought that was the answer. But its not! We gave up and asked the game master. He guided us again, and the answer was related to color. We were all mad. Because it was ridiculous riddle. Who possibly think about that?! You cannot solve it without asking! And there is no need to read the postcard either! useless!

Anyway, we had the key to unlock next room. We going down, and we opened the door. It was like a hook. Based on my experience, we need to drag and split the room. I tried but I couldn’t. We asked again 😀 stupid me. It was true that we drag and split the floor. The reason why we couldn’t do it is because we all sit down haha we need to stand, everyone of us need to stand up, then using our feet, we were able to split the room.

We found another room behind the cell. we saw another ladder. We climbed. owh, We found a electricity box. We need to plug the cables we found at previous room. It was easy. The riddles was easy even my little brother could crack it haha We plugged the cable right, but nothing happened. Oh we asked again. He said if we plugged it right, the lamp will turn on. I tried to tighten the cable, well that was a pure instinct of engineer :p And yeah, we saw the lamp at room below turned on. We were going down. We found locked door. We found some tool upstair to help open the door but we didn’t know how to use it :p My other brother, the tallest one, tried to open the ceiling door. It was miraculously opened o.o It just like in the movie haha Using the tool, He pulled the door’s lock so we could go through.

Inside, we saw some poster with timestamp. We believed it was for the PIN to unlock the automatic door. The older you are, the more complex you are thinking. We, the adult, couldn’t crack the code, but my little brother could crack what the timestamp mean. :p Okay, we found another room.

We found circuit breaker. I saw the code and remember that we saw the same symbol upstair. Two of us going up and help to shout what the symbol mean. First trial. nothing happened hahaha we skipped some step. We should decode the code on the wall first. It was quiet easy. We found a paper, an instruction to activate the circuit breaker. It was not difficult, but please keep in mind, you have to read it carefully from the beginning till the end. Read it word per word. Never miss one word, don’t skip any step. Thats the key 😀

We moved to the next room. It was basement. We found a lab. I saw some chemical rack, lab coat, etc. We found some files. We need to crack the code based on periodic tables. We skipped the step haha Actually we need to activate the UV light to see the code on the paper files, but actually, we don’t need it because we can still see it haha This code was to open another locked door.

Ow yeah, we almost finished. We saw the 15m long ladder o.o I read about this in many reviews. We have to climb the 15 meters ladder! It was quiet danger, so don’t make any joke while climbing, do it carefully and slowly. You can fall down easily.  It was farther than I thought. It was so tense and tiring.

Yup, we reached the top! the last room! There is a compass-like code cracker tool. And we found letters to crack. But we don’t have the key to calibrate the compass. The game master said that it lays on the wall. The way to calibrate it. But we have no idea :))) No one understand the meaning of it. And believe me, it was so ridiculous. Anyway, we calibrated it and knew the code to open the lock. There is a switch to activate the emergency signal.

YEAAAHHH GAME OVER

WE ESCAPED FROM ALCATRAZ!!

 

We escaped in 1h 57m. Phew, that was closed!

I would give 4.7 of 5.0 , because of that ridiculous riddles haha I loved the story!

You should’ve tried it 🙂

Well Done Team!

 

Pandora Experience Kelapa Gading

Pandora #1: S.S. Poseidon

The first time I tried escape room genre game was in Seoul. Then when after some hangout friends have returned to Indonesia, I didn’t play any escape room for a while. One day, I contacted my good friend in Indonesia. She said that a new escape room game opened, called Pandora Experience. It is quiet new, so not many people know about it. I think the original game was coming from US, but I’m not sure either. What I know is that Pandora has a lot of game titles to play. Each title has its own genre and the story is adapted from many countries. They have one story that is adapted from Indonesia.

Okay, I’m sure I will play this escape room game when I am in Indonesia. Then, a few weeks later I got assignment for business trip to Indonesia. Without thinking much, I gathered 3 friends, so it would be getting more fun with more people playing.

For starter, We picked the shorter story with only 1 hour game play. If you check in the official website, most of the stories have 2 hour game play time limit, except the one in Ciputra Mall. Because the location is inside the mall, so it has to follow the mall operation hour I guess.

If you check, the interesting point about this Pandora is they have a lot of genre story with three different factor: Difficulty, Fear and Physical activity. The one with maximum fear factor has horror genre. You will expect some jump scares while doing the game haha For the first time player, I would recommend to not playing the horror genre, unless you are horror maniac haha We picked S.S Poseidon with 4 difficulty, 3 fear and 5 physical activity. That would be perfect for beginner.

The price is IDR 175.000, but they still in promotion time. You can buy cheaper ticket from Traveloka. Or, get 10% discount if you post picture online.

From now on, it will contain spoiler 🙂 Don’t open if you haven’t played this title yet.

“S.S.Poseidon”

In the first room, we watched background story video first. I don’t remember exactly, but we acted as spies who try to solve the mystery about the Poseidon submarine.

Btw, we can ask the game master any hints as many as we want. Sometimes it was hard to understand the instruction you know haha you have to guess. In the beginning we must open the door with 6 digits PIN number. We were only provided with world map, post card, poster and country’s flags. We found country’s code paper. Actually we almost found out how to crack the code, but we couldn’t organize our head, so we asked for a hint 😀

So, we have to connect the list of countries in the paper with our surrounding object. There are 3 countries that don’t have the object in the room. Okay, we input the code than we move to the next room.

We found a key hanging in front of another locked door. But again, we didn’t know which door the key belongs to haha We again asked the game master which door it is. He said the key is too open the box from the first room. O.o Oh okay, we accidentally closed the door, so we couldn’t go back. The staff then helped us to open the door from outside haha We closed the door because before we played, the staff told us that the hint from previous room will not be used again in the next room, so we just closed the door 😐
Anyway, we opened the box and found an adjustable wrench to open the ceiling door. After opened, we climbed up, and walk through the ceiling, and found a small room. It was like machine room inside the submarine. Small and full of iron pillars. Owh, we found a instruction book! I remember I saw this code in the second room, but I didn’t think to comeback there haha We asked the game master and He asked to go back and activate the generator.

Well, the instruction told us to connect the symbol based on instruction book. There is a generator and we have to activate 5 phases to activate the whole generator. The instruction said we have to connect using cable or hand if you don’t have any. We thought that we might push or press it with hand, but nothing happened. So, we asked what is the meaning of activating by hand to game master. He said we have to work together to connect the symbol, as if our hand were the cable. -_- oh okay, it is absurd. It worked anyway ahahaha

After the generator is active, another door was opened. It was a shelf, It was locked by iron stick. Then I tried to remove it, I opened it, and I just found wood stacks there. And I tried to remove the wood. There is a lock under the wood. We were asked to remove another key and drag the shelf open. We split the room. Yeah, I was amazed, there is a sesame room behind the shelf.

Then we went back to the boiler room at the ceiling. This time, you will like playing at the amusement park haha The game master asked us to hold tight and try to stay away from the iron pillars. But the room was very narrow, we didn’t have much space to stand either. Suddenly the room was moving as if we were sailing on the sea. I felt so dizzy. I hit the pillar so hard. It left me bruise for one week 😐

After the room stop moving, there is a new door open. Yeah the last room. The riddles in this room was not so difficult. We just have to arrange the initial name of crew from the youngest to oldest, or vice versa, I didn’t really remember. After we opened the lock, there were 4 keys and we must plug it into the central box. Then Game Over!!!

We finished it in 47 minutes haha

Despite the bruise, I enjoyed the overall game. Really hahaha The physical activity makes it more real and fun. I would give 4 of 5 for this story. 🙂

 

Pandora Experience – Ciputra Mall

 

Koja Cliff “Kandang Godzilla” Tangerang

2018 is almost end.
Long holiday begin.

To start my journey, I chose Tangerang as my first destination. My father told me that there is new nice place opened near Jakarta. Local people call the place “Kandang Godzila”. My reaction was “wait.. what? Godzila? Is it some kind of dinosaur museum or what?”
Then I tried to gather some information about it. The photos I saw were amazing. The place looks like a place where dinosaur used to live. I almost believe that there were a Godzila lives there. Haha
The name of the place is actually Koja Cliff or Tebing Koja. This place was a sand mine previously.

I was looking for the transportation to get there. I was hoping there is a way to get there without private car. A big thanks to those bloggers who wrote a review about the place >_< Yessss, I can go there with public transportation!

First time trying Jabodetabek’s KRL in Indonesia

Believe me, it was my first time taking a KRL in Jakarta hahaha KRL stands for Kereta Rel Listrik, it is a commuter line for commuting inside Jabodetabek area. You can use cash, commuter line card, or e-cash card (e-money, flazz, etc) to buy a ticket. Basically if you have card, just tap the card into the gate. haha If you only have cash, there is a ticket machine to purchase a single or round trip ticket. I just wasting money to buy a new commuter line card while having flazz card in my pocket 😐

Based on many reviews, I have to take KRL and get off at Tiga Raksa station. I took the KRL from Sudirman Station and transfer line at Tanah Abang Station. It took only IDR 6000 for a single trip. Cheap, isn’t it? 😀

It took around 1,5 hours to get there. After arrived at Tiga Raksa Station, take Ojek (motorbike) to Koja Cliff. Originally, the driver asked for IDR 35.000. I negotiated for IDR 30.000 and we departed :D. On the way, the driver offered me to visit another place after the cliff. There is a good object place near the cliff, the name is Cigaru Lake. So, the driver offered me an Ojek trip package for that two places.

We arrived at Koja cliff after 15 minutes. It was not that far as I thought it would be, so I thought IDR 35.000 was too expensive. If you have good negotiation skill, you might ask for lower price 🙂 In the front gate, each motorbike pays IDR 3.000 for the entrance fee. After the driver parked the motorbike, My friend and I went inside. But before, we were asked for IDR 5.000 each for the cliff entrance fee. Oh well, It is cheap, yeah still cheap haha I can see, it might be more expensive in the future haha

The best spot of Koja Cliff is the cliff that is surrounded by water. There is a cliff that resembles dinosaur’s head. I think the nickname was created because of that. From the entrance, go left directly when you see the first intersection. I chose to go straight first and left the best part for last. When you go straight, you will see a very very beautiful landscape from top! It was almost similar like the dinosaur habitat I saw in the dinosaur cartoon I watched when I was a child haha

If you creative enough, I think you will get a lot of good pictures here. Ah, there is also another good spot for taking picture, but you need to give extra entrance fee to get inside. It is like another block of village that is managed by another villagers. Because I did not want to spend any more money, I just left hahaha

I remember I left at 8AM from Sudirman Stn. and reached Tiga Raksa Stn at 10AM. I waited quiet long at Tanah Abang Stn though. I spent like 2 hours at Koja Cliff. It was almost 12PM when I saw my watch. Actually I could spend more time here, but the weather was very cloudy and almost raining. So, My friend and I left and heading to the next destination. Cigaru Lake.

The driver was waiting for us. It was easier that way, I saw there was not many Ojek in Koja Cliff. It is better to ask the driver waiting for you. Here is not Gojek’s area haha it was hard to find an Ojek there.

I will write about Cigaru Lake in my next post.

Expenses:

KRL one trip ticket – IDR 6.000
Ojek to Koja – IDR 35.000
Motorbike Entrance Fee – IDR 3.000
Koja Cliff Entrance Fee – IDR 5.000
Motorbike Parking Fee – IDR 3.000

SpringBoot #1: Using AdminLTE and Thymeleaf

Intro

For a developer who doesn’t possess a designer brain, it must be hard to create an interface for your web. But, don’t let that stop you from learning! You can use available design template, such as Bootstrap.

If you have already had specific admin feature in your mind, there is a good template for creating admin pages. Here it is, AdminLTE. From button, till form design are available. Honestly, there is no good documentation how to implement this design inside Spring project. I spent a lot of time to search and retest it until I can display the design on my web.

How to use AdminLTE

Download the resources from the official website. You will receive CSS, JS, sample page etc in one file. I assume you’ve generated the Spring Boot project with Thymeleaf library dependencies. If you haven’t, please check this preparation step.

  • In your project explorer, go to src > main > resources > static.
  • Now, extract AdminLTE file package that you downloaded, and copy following file to above location in project explorer:
    • bower_components
    • dist
    • plugins
  • Create home index file under src > main > resources > templates
  • Create controller file under src > main > java > …. > project_name. Create new folder named Controller and put the controller file inside for easier file organization.
  • Run localhost:portnumber in your browser. For me, I set default 8080 as port number. You can edit this configuration in application.properties

If you found error, check your build.gradle and application.properties configuration. Don’t forget to check the error log.

home.html

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="utf-8" />
    <meta http-equiv="Content-Type" content="text/html" />
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport" />
  
  <title>Welcome to MoM Analysis </title>
  <link rel="stylesheet" href="/bower_components/bootstrap/dist/css/bootstrap.min.css"/>
  
  <link rel="stylesheet" type="text/css" href="webjars/bootstrap/3.3.7/css/bootstrap.min.css" />

  <link rel="stylesheet" type="text/css" media="all" th:href="@{/css/main.css}" href="../../css/main.css" />
  
  
</head>
<body>
  <nav class="navbar navbar-inverse">
    <div class="container">
      <div class="navbar-header">
        <a class="navbar-brand" href="#">MoJacko</a>
      </div>
      <div id="navbar" class="collapse navbar-collapse">
        <ul class="nav navbar-nav">
          <li class="active"><a th:href="@{/}">Home</a></li>
          <li><a th:href="@{/login}">Login</a></li>
        </ul>
      </div>
    </div>
  </nav>
  
  <div class="container">
    <div class="starter-template">
      <h1>Select Menu: </h1>
      <h2>Manage <a th:href="@{/admin}">Admin System</a></h2>
      <h2>Analyze <a th:href="@{/user}">new MoM</a></h2>
    </div>
  </div>
  
  <div th:replace="fragments/footer :: footer"/>
</body>
</html>

fragments/footer

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
</head>

<body>
  <div th:fragment="footer">
    <div class="container">
      <footer>
      <!-- this is footer -->
        	© 2018 Mojacko Planet
        	<span sec:authorize="isAuthenticated()">
        		| Logged User: <span sec:authentication="name"></span> | 
        		Roles: <span sec:authentication="principal.authorities"></span> |
        		<a th:href="@{/logout}">Sign Out</a>
        	</span>
        	
        	<script type="text/javascript"
        			src="/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
      </footer>
    </div>
  </div>
</body>
</html>

 

PageController.java

package com.ninan.mojacko.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;


@Controller
public class PageController {
  @GetMapping("/")
  public String main() {
    return "home";
  }
}

application.properties

#Server Configuration
server.port=8080

 

#Database Configuration
spring.datasource.url=jdbc:mariadb://[my_database_url]
spring.datasource.username=username
spring.datasource.password=password

 

#Thymeleaf Config
spring.thymeleaf.cache=false
spring.thymeleaf.check-template-location=true
spring.thymeleaf.prefix=file:./src/main/resources/templates/
spring.session.store-type=none

When I run on browser

Preparation #3: Synchronize Project with Gitlab

Preparation: Part 1 | Part 2

Intro

In team project, it is better to have a dedicated server to synchronize all the developer team work. A small project which has only one developer doesn’t need it because the source code management only done by one person. However, imagine if you are in a project with 10 developers? How to manage the source code? How to synchronize and integrate your code with other developers? That is why we need source code management server, sometimes called SVN or subversion. Probably you’ve heard about Github, the most popular hub for sharing open source project.

The weakness of Github is it is only supported Public project for free usage. Sometimes people want to make their project private. But in Github, you need to pay for such features. Gitlab appears as alternative. You can make private project for free. Gitlab is not bad. Only the timing is bad haha If only Gitlab released earlier than Github haha

Choose your SVN

This article will talk about Gitlab, but its up to you. If you want use something light, SVN might be a good option too. Installation instruction in here.

First of all, you have two ways of installing or using Gitlab server as code management server.

  1. Deploy Gitlab Server on your own server.
  2. Using Gitlab Server

The first deployment requires a lot of resources. Your memory server must have at least 2GB RAM. Otherwise the server would be overloaded. I’ve tried deploy it at my Google Cloud server, and it keeps time out running. Because I chose the small server where the memory is only 1.7GB. If you don’t want to spend more money, better to use the Gitlab server to manage your code.

Register Gitlab Account

First of all, create GItlab account in Gitlab website. Then create your project name. Set the visibility as Public, Private, etc. For project team, you can invite another developers to the project.

 

Eclipse IDE + SpringBoot + Git Plugin Installation

Once all set up done on Gitlab server. Next is configuring your local development environment and connect it to the your own Gitlab Project server.

  • Install the newest Eclipse IDE version.
  • Install Spring Tool Suite from Eclipse Marketplace (Help -> Eclipse Marketplace)
  • Activate Git Perspective on your Eclipse environment (Window -> Perspective -> Open Perspective -> Other -> Git)
  • Choose Clone a Git Repository if you already did the above step (creating project on Gitlab), otherwise, you also can create new project directly from Eclipse.
  • Input every information required. For URI, check in the main home page of your project, choose HTTPS or SSH. For me, I chose HTTPS because the connection was easier. Just put Gitlab username and password and it connects like magic.

 

Sync Local Project Workspace to Gitlab

You can do it two ways, develop the basic structure locally first then upload to Gitlab. Or Download from Gitlab to local if the source code is already exist. Since currently I create the program from scratch, I will generate SpringBoot project on my Eclipse and I will commit and push the code into Gitlab.

Create New Spring Boot Project
  • File -> New -> Other -> Search “Spring” -> Spring Boot -> Spring Starter Project
  • I choose Gradle as my library. But honestly Maven is more popular. If I got stuck, a lot of solution is based on Maven. But I want to challenge myself using Gradle haha I kind of used to it when learning about Android Programming
  • I choose WAR for the deployment package
  • Choose your project dependencies. Choose what necessary to you. For me, I added
    • DevTools (recommended),
    • Web (necessary),
    • Thymeleaf (my UX interface template engine)
    • JPA
    • etc (you can add more later)
  • Done
Configure Git Repository
  • From your Eclipse Project Explorer, Right click on your project -> Team -> Share Project
  • Select existing repository
  • Upload your initial code to Gitlab
    • Go to Git Perspective
    • Right click your repository
    • Click Commit
    • See Unstaged Changes windows
    • Add all files that want to be pushed to Gitlab by clicking plus sign
    • The file will be moved to Staged Changes
    • Write Commit Message to track what is changes from the previous code
    • Click Commit and Push
  • Done.
Checkout Existing Code from Gitlab to Local

Now, assume that you are supporting developer. You need to retrieve all existing and on-going project from Gitlab to your local environment. This is what you have to do:

  • In the GIT Window Perspective, choose the project and right click, then click Import Projects
  • Click this option “Show other specialized import wizards”
  • Select existing Gradle project, (or Maven if the project is used Maven build library)
  • Check your local Project Explorer to confirm the import.

 

Now, whenever you made a changes on your code. Simply commit and push to synchronize your project with your team mates. 😉

Preparation Stage End~

Preparation #2: Implementing MariaDB

Preparation: Part 1

Intro

After preparing the cloud server for hosting your web application, next work is preparing database to store data. As mentioned in Part 1, I picked MariaDB as my database platform. MariaDB is basically same as MySQL, but MariaDB has smaller scope than MySQL, especially when you plan to go for bigger project scale. But in general, the syntax and everything are same. It means that if at some point you found some difficulties, you might also search any solution for MySQL.

MariaDB Installation

Installation

[1] yum update

[2] yum install mariadb-server

[3] systemctl start mariadb

[4] systemctl enable mariadb

[5] mysql

Command [3] is to start the service and command [4] is to enable the service automatically when booting the system. Command [5] is to enter the mariaDB mode. This command is used when the user hasn’t been protected yet with password.

Optional - Upgrade to MariaDB 10.1

This step is optional. Per today (18 Nov 21st), the newest version of MariaDB is version 10.3. But in yum, the newest version is version 5.5. But I tried to upgrade it to 10.1, because at the time I upgrade I didn’t know that 10.3 was released already haha.

Btw, the reason I upgrade the version is because I had error when creating table that contains Timestamp.

Error Code : 1293

Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

As I searched, from version 5.6 up, this issue has been fixed. If you still have nothing inside your DB, then fine. But if you have worked on something, better to backup your DB before upgrading.

First of all, make sure you’ve updated YUM repo and check the newest available version. If not available, you need to add new file to locate the repository manually, like I’ve done below.

> yum -y update

> systemctl stop mysql

> vi /etc/yum.repos.d/MariaDB10.repo

Fill the new file with following content (Click Esc then letter I, to insert new text in Vi editor):

# MariaDB 10.1 CentOS repository list 
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Click Esc and :wq to save quit from Vi editor.

Remove Old Version

> yum remove mariadb-server mariadb mariadb-libs

 

> yum clean all

Installing MariaDB 10.1

> yum -y install MariaDB-server MariaDB-client

Restart the service. done~

> systemctl start mariadb

> systemctl enable mariadb

> mysql -v

Create New DB User with Password

In default, a root used is created without password. To check available user in database, use following command. Make sure you have enter the mariadb mode.

[1] use mysql;

[2] select user, host from user;

[3] show grants;

Command [3] is used to see the privilege of active user, because you’ve logged in with root user, then the command will show your root user’s privilege.

[4] CREATE USER ‘myuser’@’%’ IDENTIFIED BY ‘mypwd’;

[5] CREATE USER ‘myuser’@’localhost’ IDENTIFIED BY ‘mypwd’;

[6] SET PASSWORD FOR ‘root’@’%’ = PASSWORD (‘newpass’);

-quit from mariadb mode-

[7] mysql -u root -p

Command [6] is for changing current password of a user. Now user root is protected by password and you have to re-login to apply. Login with command [7]. Change “root” with your own username.

I want to restrict this new user for certain database only. So I will create new database for my apps and assign privilege to this new user.

[8] CREATE DATABASE ` newdb`;

[9] show databases;

[10] GRANT ALL privileges ON `newdb ` .* TO ‘newuser’@’%”;

[11] show grant for ‘newuser’@’%;

Account name is written in this format: ‘username’@’hostname’. If you don’t want to specified any hostname, you can replace it with % sign. It works like LIKE syntax in sql command. I made one more user for localhost hostname to be able enter the mariadb menu at localhost.

Create Table and Assign PK & FK

Some people might find managing database with tool is more convenience than executing through putty. For DB syntax, I prefer to edit the command from IDE. Because when you made a typo, I can edit it right away and execute the command. If you type it in SSH client, you must re-write it again from beginning. It cannot be undo haha Another reason why I prefer to edit query from DB IDE is, I can save my query as file, so I can load it anywhere.

If you choose MySql for your database, you can easily use MySql Workbench as the IDE. I heard that MariaDB was possible to be accessed from MySql Workbench, but now it is not supported anymore. So I need to find the replacement. Then I found this HeidiSQL. The tool is light and simpler than mysql workbench.

Setting Connection to Remote DB

First of all, you need to set the firewall rules for allowing remote connection in GCP.

  • Go to GCP Console
  • From Navigation Menu, choose VPC Network -> Firewall Rules
  • Create new firewall rules
  • Fill following information:
    Name: databaserule
    Source IP ranges: 0.0.0.0/0
    Check tcp checkbox at specified protocol and ports, then fill with 3306
  • Click Create button

Install Heidi SQL and create new connection.

You can find your remote server IP address from GCP console. Your DB user ID and password is the one that we made before in previous step.

Next, we can start to create the table we want. I have this .sql file I created for my project before. I just copy paste it to Heidi SQL to create my own table. So, I will only put some important note of it here. Following is the basic SQL syntax to create table.

create table if not exists table_name1 (
org_id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
org_name VARCHAR(30) NOT NULL,
reg_user VARCHAR(20),
reg_date TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
mod_user VARCHAR(20),
mod_date TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

 

describe table_name1;

Following are connecting Foreign Key to other table. In my case, I want to connect second table (table_name2) to table_name1 by org_id.

create table if not exists table_name2(
role_id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
role_name VARCHAR(30) NOT NULL,
role_type VARCHAR(20) NOT NULL,
org_id INT(11) NOT NULL,
reg_user VARCHAR(20),
reg_date TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
mod_user VARCHAR(20),
mod_date TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT `fk_role` FOREIGN KEY (org_id) REFERENCES table_name1 (org_id) ON DELETE CASCADE
);

describe table_name2;

Other notes when creating table:

#FOR MULTIPLE FOREIGN KEY CONNECTION

 

CONSTRAINT `fk_usrs`
FOREIGN KEY (user_org) REFERENCES organization (org_id) ON DELETE CASCADE,
FOREIGN KEY (user_pos) REFERENCES positions (pos_id) ON DELETE CASCADE,
FOREIGN KEY (user_auth) REFERENCES role (role_id) ON DELETE CASCADE
)

 

#FOR BOOLEAN TYPE COLUMN

use_yn TINYINT(4) NOT NULL DEFAULT 1,

For other references, please refer to Maria DB official documentation.

Now, we have remote database in our remote server. Next is configuring Gitlab for team management synchronization.

To Be Continued

 

Preparation #1: Preparing Development Environment

Intro

I don’t know why I keep forgetting how to prepare development environment from scratch. Whenever I want to start new project, I always re-searching how to do it. So I guess it’s better to leave some trace here.

Recently, I’ve been studying about Java Web Programming with its framework. To be specific, the framework is Spring framework. Creating a web app and deploy it to the real server is always be my objective. So, I will leave a note how to prepare the development environment first before starting the web app programming.

Platform Used

You can choose any technology to used. Following platform and framework is just my preferences.

  • Cloud Server: Google Cloud Platform (cloud.google.com)
  • Web Server: Tomcat Apache 7
  • Database: MariaDB
  • IDE: Eclipse
  • SVN: Gitlab
  • Programming Language: Java
  • Spring Framework: SpringBoot, Thymeleaf

I thought preparing the environment was easy, but its not. It also needs time to implement everything. In real project, usually this job desk is dedicated to one person.

Preparing Cloud Server

You have to create account for Google Cloud Platform at the beginning. It is free for 1 year usage. In the beginning, you will be given a sort of money. If you can manage your resource usage well, then it will ended up FREE. However, if you need more resources than expected, you might need to make extra payment. If your purpose is only for self-study, don’t worry! You can use it for FREE.

  1. Register for an account
  2. Go to Console
  3. Create new project
  4. Create VM Instance
  5. Choose Machine Type, OS, etc (explained below)
  6. Done

In the VM Instance dialog page, you have to choose the server you want to use or buy. The blue highlight is the one that I recommended and I think it is enough for studying. Remember that we have limited credit for paying the server. So choose it wisely.

Machine Type:

  • Micro 0.6GB RAM $4.28
  • Small 1.7GB RAM $14.20
  • 1vCPU 3.75GB RAM $24.67
  • 2vCPU 7.5GB RAM $48.95

OS Type:

  • Debian 9
  • CentOS 6,7
    (I chose CentOS 7)
  • Ubuntu 14-18
  • Windows Server
  • etc

Note: When I planned to install Gitlab platform in the same server, the small 1.7GB RAM server is insufficient. You have to upgrade the memory at least 2GB, means you have to choose the 3.75GB one. That is why I use the Gitlab server for SVN, and create project there, OR another option was using light version SVN. Refer to this link for installation.

For Firewall option, check Allow HTTP and HTTPS traffic.

Once a server instance is created. Your server will be assigned a public IP. VOILA~ you have own server now!

Accessing through SSH Client

There is several way to access your server. Since you are the owner of GCP account, you can access it using SSH web client from GCP. However, multiple connection is not allowed. If you are working in a team, it is better to prepare SSH connection so that your team can access the server using SSH client, such as Putty. This is what you have to do:

  • Generate Private Key using PuttyGen app, must be installed separately
  • Click Generate to create your private key
  • Draw anything in the blank space to generate the key
  • After the key is generated, change the Key Comment field with any username
  • Fill Key passphrase as password of your username
  • Click “Save private key”
  • Your key will be saved as .ppk file

Register Private Key to GCP

After generated, you have to register your private key to Google Cloud Server. This is how:

  • Open GCP Console
  • In the left navigation menu, click Metadata
  • Click the SSH Key tab
  • Click Edit
  • Click Add Item
  • Copy paste the RSA code from PuttyGen. The one that start with “ssh-rsa…..”. The name will be automatically generated according to the Key comment you’ve input
  • Save

Setting up SSH Client Putty

If you work on Windows, Putty is the most common tool to use. Last time when I used Mac, I access it through GCP Web console, because I cannot find a good replacement for Putty #failed T.T

  • Upload your private key here -> Category: Connection -> SSH -> Auth
  • Check only this: Attempt Keyboard-Interactive SSH2 , Allow agent forwarding, Display pre-authentication banner. This is to prevent future issue when another person using the same key to login.
  • Back to Session menu. Fill IP address with your IP server address
  • Click Open
  • When the SSH windows prompted, fill your passphrase to enter the terminal

Changing Root Password

Just in case, giving root access a password is recommended for safety. To set or change a new password, type following:

> sudo passwd

To enter root mode, type su in the terminal.

Installing Web Server Tomcat

The newest version currently is Tomcat 9. You can install it manually, and I did it too. It took some time to install, because you have to configure everything manually. And usually, you will find a lot of error that let you keep googling for the solution haha So, in short, I chose to install Tomcat 7 instead via Yum haha. 1 minute and done.

Tomcat 7 Installation Command Line

> sudo yum install tomcat
> sudo yum install tomcat-webapps tomcat-admin-webapps
> sudo vi /usr/share/tomcat/conf/tomcat-users.xml

Add following:

   <tomcat-users>

        <user username=”username” password=”passwd”  roles=”manager-gui, admin-gui”/

   </tomcat-users>

> sudo systemctl start tomcat
> sudo systemctl enable tomcat

Go to your browser and type your server IP address like this: http://xxx.xxx.xxx.xxx:8080

You should see Tomcat homepage right now~

To Be Continued…

Kenangan ini sangat menganggu

Jakarta, 28 Oktober 2018

Setelah beberapa tahun hiatus, akhirnya hari ini menginjakkan kaki kembali didalam ruang kecil di pojokan F4. Tempat yang kalau bisa dihindari, ya dihindari sebisa mungkin.

Semuanya memang tampak asing.

Ntah dari sistemnya,
komposisi letak panggungnya yang tiba-tiba ada sayap panggungnya di kanan dan kiri,
atau dari kursinya yang lebih empuk namun tetap sempit -_-

Foto member yang sekarang terpampang di depan lobi, dahulu diletakkan di dalam, dahulu terkesan eksklusif memang.
Ticketing yang sekarang pasti dapatnya, dahulu harus analisis pattern agar menang undian. Sistem bingo saat ini menggunakan layar, dahulu pake sistem aduk-aduk macam arisan. Jadi bisa titip-titip bapak security nya biar masuk pertama.

Terlepas dari semua perbedaan itu, bingo luck nya tetap sama 😀 alias tengah-tengah menuju akhir-akhir masuk theaternya.

Setlist theater yang sekarang jujur… asing semua… kalau bukan karena mau nyapa Via, mana mau ku masuk lagi kesana. Judul setlistnya tim J adalah “sekarang ku sedang jatuh cinta” kalau tidak salah haha panjang memang.

10 menit sebelum show utama dimulai ada show dari akademi gitu. Ada 5~6 member akademi yang tampil. Ada 1 orang yg posturnya seperti teman koreaku haha lalu kata teman, “dia udah 2 thn tapi ga promote2”. Lalu temanku menunjuk member disebelahnya “kalau yg itu mantan atlet skating” wah.. itu calon girlcrush memang.. pikirku. Semoga cepat promote ya dek~

Saatnya show utama dimulai.

Takjub sama overture yang baru. animasinya boleh lah. awalnya ga mau merinding. berkat dukungan visualisasinya, mau ga mau runtuhlah dinding hati ini.. masih terplongo sama visualisasinya, eeh layarnya ditutupin member yang baru masuk stage -_-

Kostumnya heboh banget ya~ tapi terbantu sih sama propertinya. ada yang pake topi, sunglass, atau just plain glasses *ini bahaya* megane itu ada charmnya sendiri memang. nah saat itu lah mulai muncul curiousity. lupa tujuan awal nonton tu apa, akhrnya malah scouting berasa talent agency.

A: “yg kacamata itu siapa?”

B: “cinhap”

A: “blasteran ya? kok cakep”

B: “kaga”

A: “sinka msh lucu ya pk kacamata gt ”

B: “dr duluuu”

A: “ikha jg tambah cakep ya pk kscamata”

B: …. *mngkn udh lelah nanggepinnya haha*

A: “eh eh itu siapaaa? lucu bgt cakep”

B: “oh itu Juleha”

 

OK..

Karena sudah lama ga theateran, saya butuh seorang guide, alias temen veteran saya. Kutipan percakapan diatas adalah percakapan antara saya dan teman veteran saya ini :p

Balik ke setlist.. lagunya gada yang masuk sampe denger Only Today haha paling ear catching. apalagi lagu unitnya.. gada yg paham dah. cuma notice dek Juleha tadi itu muncul 2x di unit. kalau kata teman sih karena hari ini cuma 15 yang perform. ada unit yang pake baju sawah-sawah gitu juga -.-”

lagu selepas unit sih better.. kostumnya jg bagus sih. sampai saat aku mendengar lagu yg familiar 😐 kenapa disini ada Bingo?? kena panah. ga bawa tameng.. nancep lah~

makin kebelakang, kok… ada lagi itu si Seifuku jama suru???  itu lagu menyimpan kenangan antara ku dan dia

sepanjang lagu itu, sedikit terganggu, bukn karena seragamnya, tp bayang2 tim J yang lama saat kaptennya masih si dia. 🙁 ya udah lanjutannya tau sendiri lah ya. sepanjang lagu hanya jadi keinget ex-kapten J itu. btw gue jg keganggu bgt dah ama orang sblh gue tadi -.- kaki kaga bs diem apeuuu. udh tau sempit.

hitouch time~

pangling kalau hitouchnya member berada disebelah kiri. ingatanmu bilang biasanya disebelah kanan haha jaman kapan itu dah nonton 😀

Member yang pertama menyambut adalah Shanju. dan diikuti oleh Via. Wah, oke nih susunannya anaknya di depan, jadi gue bisa cepet2 nge clear-in misi absen. Gue berharap dia bilang apa kek ya, jadi gue diem aja 😐 Padahal gue bakal ngmong dluan niatnya seandainya dia diem doang. Tapi problemnya adalah, mata kita tak bertemu! Alias dia even ga liatin orang yang ada d depannya. Y udah deh, aku pun decide diem aja dan skip.

Tapi tenang~ ku tak marah. Karena kita kan sudah masa lalu :v

Sepertinya langit berpihak padaku hari itu. Member yang ku incar, sebut saja Juleha, berada di urutan paling akhir~ jadi aku punya waktu untuk pemulihan shock dari Via tadi. Aku penasaran jujur, namanya apakah beneran Juleha? Kenapa semua menyebut Juleha? aku coba cek profil, namanya Julie. Sewaktu ku berhadapan dengan si J, ku langsung bertanya

A: Namanya siapa? *nada halus seorang kakak kpd adiknya*

J: Namaaanyaa Juu~~Liiiiee

A: ………

Well, aku ga expect dia bakal seceria itu. Kalau liat wajahnya, kekaleman terpancar dari dirinya. Aku pun terdiam… Tak kusangka dia menjawab seperti itu. Diwaktu yang sangat singkat, dia bisa memberikan interaksi yang panjang dari yang lainnya. Rasanya itu seperti sedang berpindah ke dimensi lain lewat mesin waktu!

jadi kl mau di recap:

berasa newcomer dgn semua perubahan yg ada.

lagu memang bisa merangsang munculnya suatu memori dlm otak manusia.

dilain sisi, bukti kl ingatan manusia itu terbatas juga, bs lupa.

tersadar, ternyata masih ada bibit unggul.

makasih kakak guide karena udh d guide^^

–end–

side story:

seminggu sebelumnya, aku sempat mampir FX untuk ketemu dengan teman-teman lama.. Tentu si veteran ini ada juga 😀 Pas udah bubaran, dia nawarin mampir Food Hall. Ya itung-itung nyari snack lah ya, disitu banyak snack impor juga soalnya. Pas di pintu Food Hall, tiba2 ada dua bocah manggil teman veteranku “Mamaaaaaaa”. Aku shock dan kabur sendiri langsung masuk. Itu tadi pasti member generasi baru, karena aku tidak kenal. Daripada aku kena sihir, mending aku kabur saja.

Seminggu kemudian,, setelah aku mengenal anak bernama Juleha ini. Si teman veteranku bilang kalau aku sudah pernah ketemu anaknya dluan di Food Hall 😐

Oh noo, inikah yang namanya jodoh? haha udah dikasih teaser dluan seminggu sebelum. Tapi aku skip agar tidak merusak keindahan show utamanya haha

Hari itu memang lucu. Jiwa lamaku menguap-nguap lagi

ninankara.com is launching!

Due to some irresponsible hosting company, I lost my old domain (ninankara.net) T.T

I have been maintaining that domain for more than 7 years and I have to lost it just because that stupid hosting and domain company escaped until my domain was expired. I tried to contact them through a lot of media, but null. Well, I paid already to extend the domain for this year, but luck was not with me.

Anyway I tried to let my signature domain go and start to accept my new one.

Here is it.

Before expiration, I backed up my wordpress content and cpanel from my old hosting. I just import the back up to the new one. However, some picture and file are gone. I need to check one by one the content post, and replace the image, especially the header. I made good decision not to upload the content picture to the hosting haha I always use external URL to attach a image.

After organizing some contents, applying themes, customizing it, well, for now I just use the old theme and old layout. I plan to apply new one later when I had time hehe For now I focuses on making the website readable for visitor 🙂

I declared that today, ninankara.com , is launching!!!

Keeping writing and hope no issue occur in the future

 

Seoul, 2018 March 4th

Configuring OpenCV 3.1 and Visual Studio 2015

This is not a new thing actually, and as far as I remember this is my second time configuring this. However, I found problem on myself 😐 I keep forgeting how to configure and connect openCV library with VS2015, especially in C++ language. As we know the environment is different than C# environment. So I decided to create one post for my own documentation. Because everytime I tried new installation, I keep facing the similar error but I forgot how to solve it and ended up with googling over the same problem so many time.

Configuring OpenCV 3.1 with VS2015

  1. Assume that you’ve installed VS2015
  2. Download the newest OpenCV library from here. In my case version 3.1 in .exe format.
  3. Extract the .exe file by clicking it.
  4. Copy the extracted file into C:// drive
  5. Configure the windows environment variable (System Properties -> Advances system settings -> Environment Variable…):
    1. Add new variable OPENCV_DIR with Value the directory of VC14 bin (C:\opencv\build\x64\vc14\bin)
    2. Add value to “Path” variable with C:\opencv\build\x64\vc14\bin

 

Calling the openCV library from VS2015 IDE

If you decide to use C++, you have to setting the properties everytime you create new project. To make it easy, create property sheet so that you can import it for other project.

  1. Create Property Sheet for OpenCV 3.1
    1. Click View -> Other Windows -> Property Manager
    2. Right Click in the Project Name -> Add New Project Property Sheet
    3. Give it name, for me OpenCV3.1
  2. Setting VC++ Directories
    1. Include Directories : C:\opencv\build\include
    2. Library Directories: C:\opencv\build\x64\vc14\lib
  3. Setting Linker
    1. Click Input -> Additional Dependencies -> Add opencv_world310d.lib (for Debug)

 

Testing OpenCV Hello World

Write following code to test whether it has been linked or not. Put your tested image into your project folder to make it easy, or change the imread directory as per your image location.

#include "stdafx.h"
#include <opencv2\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include 

int main(int argc, char** argv)
{
	cv::Mat image;
	image = cv::imread("takanyan.jpg");
	cv::imshow("testing",image);
	cvWaitKey(0);
	return 0;
}

Voila~ done.

TroubleShooting

  • Cannot find or open the PDB file

Change the Setting of Microsoft Symbol. Tools -> Options -> Debugging -> Symbols and check “Microsoft Symbol Servers”

  • Target Platform related error

Change the target platform into x64