AUTO_INCREMENT memungkinkan kita untuk mendapatkan angka/nomor yang unik ketika sebuah record di insert ke dalam table. Angka/nomor hasil dari AUTO_INCREMENT biasanya di pakai sebagai nilai dari primary key suatu table.

MySQL database telah menyediakan fitur ini. Kita tinggal menetapkan sebuah field sebagai AUTO_INCREMENT, lalu mysql yang akan meng-handle untuk menggenerate nilai yang unik ketika sebuah record di insert.

Anggap, kita ingin membuat table seperti di bawah ini di mysql.

Dan kita ingin, agar user_id nilai nya selalu unik ketika ada penambahan data user baru. Maka DDL yang di butuhkan sebagai berikut:

user.sql
1
2
3
4
5
6
CREATE TABLE USER(
  USER_ID INT NOT NULL AUTO_INCREMENT,
  USERNAME VARCHAR(45) NOT NULL,
  PASSWORD VARCHAR(45) NOT NULL,
  CONSTRAINT P_USER_ID PRIMARY KEY (USER_ID)
);

Coba jalankan script berikut untuk insert data ke table

1
2
3
4
INSERT INTO USER (USERNAME, PASSWORD) VALUES('user1', password('123456789'));
INSERT INTO USER (USERNAME, PASSWORD) VALUES('user2', password('123456789'));
INSERT INTO USER (USERNAME, PASSWORD) VALUES('user3', password('123456789'));
INSERT INTO USER (USERNAME, PASSWORD) VALUES('user4', password('123456789'));

Kita tidak perlu mendefinisikan nilai dari user_id, karena mysql secara otomatis akan melakukannya.

Spring batch adalah framework untuk melakukan proses batch, mengeksekusi serangkaian job. Dimana job terdiri dari banyak step dan setiap step terdiri dari proses READ-PROCESS-WRITE atau SINGLE-OPERATION (tasklet).

Berikut beberapa istilah yang sering di gunakan di Spring Batch:

  • Job – Menggambarkan suatu pekerjaan. Misal, membaca file DPK (Dana Pihak Ketiga), lalu menyimpannya ke dalam database. Setelah itu menampilkannya ke dalam laporan Combined-Statement.
  • Step – Sebuah job terdiri dari satu atau dua step. Dalam contoh di atas, misalnya:
    • Step 1: Membaca File DPK & Meyimpan ke dalam database
    • Step 2: Menampilkan data DPK ke dalam laporan Combined-Statement
  • JobInstance – Sebuah instance yang sedang berjalan dari sebuah job yang telah di tetapkan. Anggap, job adalah sebuah class dan jobinstance adalah sebuah object dari class job. Contoh, job membaca file DPK jalan setiap awal bulan, berarti kita memiliki 1 JobInstance setiap bulannya. 1 job yang berjalan sama dengan 1 jobinstance.
  • JobParameters – Parameter-parameter yang digunakan oleh JobInstance. Contoh, secara default, laporan Combined-Statement yang di generate adalah untuk periode T-1, tapi kita ingin membuatnya lebih dinamis, jadi kita bisa generatekan laporan untuk periode T-N, jadi, kita mesti melemparkan nilai N ke dalam JobParameters, dimana JobParameters nanti akan di lemparkan sebagai baris perintah argumen.
  • JobExecution – Setiap menjalankan JobInstance akan menghasilkan JobExecution. Contoh, ketika job membaca file DPK gagal, lalu job di jalankan lagi dan berhasil. Maka kita akan memiliki 1 JobInstance dan memiliki 2 JobExecution, 1 yang berhasil & 1 lagi yang gagal.
  • StepExecution – Sama seperti JobExecution, tapi ini untuk menggambarkan hasil dari Step.
  • JobRepository – Sebuah persistent store untuk menyimpan semua informasi meta-data job. Menyimpan informasi JobInstance,JobExecution dan StepExecution. Repositori dibutuhkan untuk mengetahui apakah sebelumnya job gagal atau tidak, jika gagal maka bisa di jalankan kembali. Secara default informasi ini di simpan di memory, tapi kita bisa setting untuk menyimpannya di database.
  • JobLauncher – Seperti namanya, object ini memungkinkan kita untuk memulai sebuah job. Ia menggunakan JobRepository untuk mendapakan JobExecution yang valid.

SINGLE-OPERATION

  • TaskLet – Situasi dimana kita tidak memiliki input and pengolahan keluaran (SINGLE-OPERATION). Misalnya, kita ingin memanggil/menjalankan sebuah store procedure.

READ-PROCESS-WRITE

  • ItemReader – Sebuah abstract class yang digunakan untuk menggambarkan sebuah object yang memungkinkan kita untuk membaca sebuah object yang ingin kita proses. Misal, kita ingin membaca file DPK, atau kita ingin membaca data dari database.
  • ItemWritter – Sebuah abstract class yang digunakan untuk menulis hasil akhir dari proses batch. Misal, kita ingin meng-generate laporan Combined-Statement.
  • ItemProcessor – Sebuah abstract class yang digunakan untuk melakukan business logic dari data yang di hasilkan oleh ItemReader sebelum di lemparkan ke ItemWritter.

Dalam tulisan selanjutnya kita akan melihat contoh dari penggunaan masing-masing item tersebut.

Hari ini ada masalah di production. Teman melakukan restart server production, tapi yg sialnya tidak ada yg tau kalau ada proxy/web server sebelum akses user di lanjutkan ke tomcat.

Proxy/web server yg kami gunakan adalah httpd. Tapi ketika di jalankan dengan menggunakan command

1
service httpd start

muncul error

1
2
3
Starting httpd: no listening sockets available, shutting down

Unable to open logs

Ritual pertama yg saya lakukan, check apakah port 80 lagi di pakai oleh service lain dengan menggunakan command

1
netstat -npl | grep 80

hasilnya

1
2
3
4
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      2750/java
tcp        0      0 :::8009                     :::*                        LISTEN      2750/java
tcp        0      0 :::8080                     :::*                        LISTEN      2750/java
tcp        0      0 :::80                       :::*                        LISTEN      1502/httpd

dari hasil diatas, ternyata port 80 lagi digunakan oleh httpd. Ternyata httpd dalam keadaan deadlock, walaupun sudah membuka port 80, tapi kita tetap tidak bisa akses.

Ok, ritual kedua, kita stop httpd dengan menjalankan command

1
service httpd stop

hasilnya

1
FAILED

mantap. ternyata httpd benar2 dalam keadaan deadlock/hang. jalan satu2nya kita kill proses httpd tersebut.

Untuk kill proses httpd, sebelumnya kita mesti tahu dulu prosess id nya, dengan menjalankan command

1
ps ax | grep httpd

hasilnya

1
2
3
1501 ?        S      0:00 /bin/bash -c ulimit -S -c 0 >/dev/null 2>&1 ; /usr/sbin/httpd
1502 ?        S      0:00 /usr/sbin/httpd
4713 pts/0    S+     0:00 grep httpd

Bisa kita lihat, ada 3 prosess yang mengandung kata httpd. Sekarang jalankan command berikut untuk melakukan kill prosess tersebut

1
2
$ kill -9 1501
$ kill -9 1502

Lalu jalankan lagi command berikut

1
service httpd start

untuk menjalankan httpd kembali.

Sintaks untuk rename column di oracle sebagai berikut

1
alter table <table name> rename column <column name> to <new column name>;

anggap, kita memiliki table dengan struktur seperti ini

1
2
3
4
5
CREATE TABLE CS_EXCHANGE_RATE (
  EXCHANGE_RATE_DATE   DATE NOT NULL,
  CURRENCY_CODE        CHAR(3) NOT NULL,
  RATE                 NUMBER(18,10) NOT NULL
);

Lalu, kita ingin mengubah, nama kolum RATE, menjadi VALUE. Maka jalankan sintaks berikut

1
alter table CS_EXCHANGE_RATE rename column RATE to VALUE;

Saya selalu melihat di video tutorial yg menggunakan *nix, mereka selalu list file/directory dalam bentuk seperti ini

setelah google, ternyata mereka menggunakan tree. Untuk menginstall tree di crunchbang/debian, gunakan command berikut

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ sudo apt-get install tree
[sudo] password for marjinal:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  tree
0 upgraded, 1 newly installed, 0 to remove and 200 not upgraded.
Need to get 32.4 kB of archives.
After this operation, 98.3 kB of additional disk space will be used.
Get:1 http://ftp.debian.org/debian/ squeeze/main tree amd64 1.5.3-1 [32.4 kB]
Fetched 32.4 kB in 6s (5,168 B/s)
Selecting previously deselected package tree.
(Reading database ... 112215 files and directories currently installed.)
Unpacking tree (from .../tree_1.5.3-1_amd64.deb) ...
Processing triggers for man-db ...
Setting up tree (1.5.3-1) ...

Tulisan ini hanya sebagai pengingat saya, maklum sudah tua :D

Sebelum melakukan generate aplikasi yang pertama menggunakan Sencha Cmd, berikut yang mesti kita lakukan. * Direktori project saya, biasanya saya letakkan di ~/PROJECT/SENCHA_TOUCH * Direktori Sencha SDK saya ada di ~/TOOLS/sencha/touch-2.2.1 * Lalu buat direktori sesuai dengan nama projectnya, karena kita mau buat hello world, maka saya buat folder hello world di dalam folder tersebut

1
2
$ cd ~/PROJECT/SENCHA_TOUCH
$ mkdir helloworld

Generate Project

Untuk melakukan generate project, lakukan langkah-langkah berikut ini: 1) Masuk ke dalam direktori ~/TOOLS/sencha/touch-2.2.1

1
$ cd ~/TOOLS/sencha/touch-2.2.1

2) Lalu jalankan command berikut ini

1
$ sencha generate app HelloWorld ~/PROJECT/SENCHA_TOUCH/helloworld

maka akan muncul output

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Sencha Cmd v3.1.2.342
[WRN] Sencha Cmd update is available (updating is recommended)
[INF] 
[INF] init-plugin:
[INF] 
[INF] -before-generate-workspace:
[INF] 
[INF] cmd-root-plugin.init-properties:
[INF] 
[INF] init-properties:
[INF] 
[INF] init-sencha-command:
[INF] 
[INF] init:
[INF] 
[INF] generate-workspace-impl:
[INF]      [echo] generating into /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld from /home/marjinal/bin/Sencha/Cmd/3.1.2.342/templates/workspace
[INF]     [mkdir] Created dir: /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/packages
[INF] 
[INF] cmd-root-plugin.copy-framework-to-workspace-impl:
[INF] [propertyfile] Updating property file: /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/.sencha/workspace/sencha.cfg
[INF] 
[INF] copy-framework-to-workspace-impl:
[INF]      [copy] Copying 1960 files to /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/touch
[INF]      [copy] Copying 1 file to /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/touch
[INF]      [copy] Copying 1 file to /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/touch
[INF] [propertyfile] Updating property file: /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/.sencha/workspace/sencha.cfg
[INF] 
[INF] copy-framework-to-workspace:
[INF] 
[INF] generate-workspace:
[INF] 
[INF] -after-generate-workspace:
[INF] 
[INF] init-plugin:
[INF] 
[INF] cmd-root-plugin.init-properties:
[INF] 
[INF] init-properties:
[INF] 
[INF] init-sencha-command:
[INF] 
[INF] init:
[INF] 
[INF] before-upgrade:
[INF] 
[INF] generate-app-impl:
[INF] 
[INF] generate-starter-app:
[INF]     [mkdir] Created dir: /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/app/profile
[INF]     [mkdir] Created dir: /home/marjinal/TOOLS/sencha/touch-2.2.1/resources/icons
[INF] 
[INF] copy-sdk:
[INF]      [copy] Copying 1 file to /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/resources/css
[INF]      [copy] Copying 4 files to /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/resources/sass/stylesheets
[INF] [x-property-file] Updating property file: /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/.sencha/app/sencha.cfg
[INF] 
[INF] after-upgrade:
[INF] 
[INF] generate-app:
[INF] 
[INF] -after-generate-app:
[INF] [x-property-file] Updating property file: /home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/.sencha/app/sencha.cfg

Running Project

Untuk menjalankan project menggunakan Sencha Cmd, lakukan langkah berikut:

1) masuk ke dalam directory project

1
$ cd ~/PROJECT/SENCHA_TOUCH/

2) lalu ketikkan

1
$ sencha fs web -port 8000 start -map helloworld

Lalu akan muncul output

1
2
3
4
5
6
7
8
9
10
11
Sencha Cmd v3.1.2.342
[INF] Starting shutdown listener socket
[INF] Listening for stop requests on: 42787
[INF] Mapping http://localhost:8000/ to helloworld...
[INF] Starting http://localhost:8000
[INF] jetty-8.1.7.v20120910
[INF] NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
[INF] started o.e.j.w.WebAppContext{/,file:/home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/}
[INF] started o.e.j.w.WebAppContext{/,file:/home/marjinal/PROJECT/SENCHA_TOUCH/helloworld/}
[INF] Started SelectChannelConnector@0.0.0.0:8000
[INF] Started http://localhost:8000

Jika tidak memiliki emulator (android, iphone, dll), kita bisa gunakan google chrome. Jalankan google chrome, lalu masukkan url http://localhost:8000.

Done.

Tulisan ini hanya sebagai pengingat saya, maklum sudah tua :D

Sebelumnya, silahkan download Sencha Touch SDK dan Sencha Cmd. Untuk Sencha Cmd, saya download yang versi linux (SenchaCmd-3.1.2.342-linux-x64.run.zip).

Install Sencha Touch SDK

Untuk meng-install Sencha Touch SDK, cukup hanya dengan melakukan extract file yang anda download.

Install Sencha Cmd

1) Extract file SenchaCmd-3.1.2.342-linux-x64.run.zip 2) Jalankan command berikut, untuk mengubah file menjadi executable

1
$ chmod +x SenchaCmd-3.1.2.342-linux-x64.run

3) Jalankan command berikut, untuk memulai instalasi

1
$ ./SenchaCmd-3.1.2.342-linux-x64.run

4) Lalu akan muncul dialog Setup – Sencha Cmd. Klik Next.

5) Lalu akan muncul dialog License Agreement. Klik I accept the agreement, lalu klik Next.

6) Lalu akan muncul dialog Installation Directory. Pada Installation Directory biarkan terisi default, lalu klik Next.

7) Lalu akan muncul dialog Ready to Install. Klik Next.

8) Lalu akan muncul dialog Installing. Proses install sedang berjalan

9) Setelah proses install selesai, akan muncul dialog Completing the Sencha Cmd Setup Wizard. Klik Finish

10) Untuk menguji, apakah proses instal Sencha Cmd telah berhasil atau belum, buka terminal lalu jalankan command berikut

1
$ sencha

jika muncul output sebagai berikut, berarti proses instal telah berhasil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Sencha Cmd v3.1.2.342
Sencha Cmd provides several categories of commands and some global switches. In
most cases, the first step is to generate an application based on a Sencha SDK
such as Ext JS or Sencha Touch:

    sencha -sdk /path/to/sdk generate app MyApp /path/to/myapp

Sencha Cmd supports Ext JS 4.1.1a and higher and Sencha Touch 2.1 and higher.

To get help on commands use the help command:

    sencha help generate app

For more information on using Sencha Cmd, consult the guides found here:

http://docs.sencha.com/ext-js/4-2/#!/guide/command
http://docs.sencha.com/ext-js/4-1/#!/guide/command

http://docs.sencha.com/touch/2-2/#!/guide/command
http://docs.sencha.com/touch/2-1/#!/guide/command


Options
  * --cwd, -cw - Sets the directory from which commands should execute
  * --debug, -d - Sets log level to higher verbosity
  * --nologo, -n - Suppress the initial Sencha Cmd version display
  * --plain, -pl - enables plain logging output (no highlighting)
  * --quiet, -q - Sets log level to warnings and errors only
  * --sdk-path, -s - The location of the SDK to use for non-app commands
  * --time, -ti - Display the execution time after executing all commands

Categories
  * app - Perform various application build processes
  * compass - Wraps execution of compass for sass compilation
  * compile - Compile sources to produce concatenated output and metadata
  * fs - Utility commands to work with files
  * generate - Generates models, controllers, etc. or an entire application
  * io - Create, deploy and manage applications on the Sencha.io cloud platform
  * iofs - Manage Files stored in the Sencha.io cloud platform
  * manifest - Extract class metadata
  * package - Manages local and remote packages
  * repository - Manage local repository and remote repository connections
  * theme - Commands for low-level operations on themes

Commands
  * ant - Invoke Ant with helpful properties back to Sencha Cmd
  * build - Builds a project from a legacy JSB3 file.
  * config - Load a properties file or sets a configuration property
  * help - Displays help for commands
  * js - Executes arbitrary JavaScript file(s)
  * upgrade - Upgrades Sencha Cmd
  * which - Displays the path to the current version of Sencha Cmd

Tulisan ini hanya sebagai pengingat saya, maklum sudah tua :D

Anggap, sekarang tanggal 15 oktober 2013. Untuk menambahkan/mengurangi bulan, kita bisa menggunakan sintaks

1
add_months(date, inc/dec)

dimana:

  • date adalah data tipe date yang di jadikan patokan
  • inc adalah total penambahan bulan, dalam positif. Contoh, select add_months(sysdate, 5) from dual, akan menghasilkan tanggal sekarang + 5 bulan , dec adalah total pengurangan bulan, dalam negatif. Contoh select add_months(sysdate, -5) from dual, akan menghasilkan tanggal sekarang – 5 bulan

Bulan Sebelumnya

Untuk mendapatkan tanggal awal & akhir untuk bulan september-2013, gunakan script berikut:

1
2
3
4
SELECT
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1),
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 0) -1
FROM DUAL;

Untuk mendapatkan tanggal awal & akhir untuk bulan agustus-2013, gunakan script berikut:

1
2
3
4
SELECT
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -2),
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1) -1
FROM DUAL;

Untuk mendapatkan tanggal awal & akhir untuk bulan juli-2013, gunakan script berikut:

1
2
3
4
SELECT
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3),
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 2) -1
FROM DUAL;

Dan seterusnya

Bulan Sekarang

untuk mendapatkan tanggal awal & akhir untuk bulan oktober, gunakan script berikut:

1
2
3
4
SELECT
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 0),
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1) -1
FROM DUAL;

Bulan Selanjutnya

Untuk mendapatkan tanggal awal & akhir untuk bulan november-2013, gunakan script berikut:

1
2
3
4
SELECT
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1),
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 2) -1
FROM DUAL;

Untuk mendapatkan tanggal awal & akhir untuk bulan desember-2013, gunakan script berikut:

1
2
3
4
SELECT
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 2),
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 3) -1
FROM DUAL;

Untuk mendapatkan tanggal awal & akhir untuk bulan januari-2014, gunakan script berikut:

1
2
3
4
SELECT
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 3),
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 4) -1
FROM DUAL;

Dan seterusnya.