Catatan Sang Pembelajar

Share Your Thought !

Tutorial Git Sederhana — February 25, 2017

Tutorial Git Sederhana

Persiapan


Membuat repositori baru


Buatlah direktori baru pada komputer Anda, kemudian buka terminal/command prompt dan arahkan ke lokasi direktori tersebut. Selanjutnya, jalankan perintah: git init untuk membuat repositori git baru.

Memeriksa repositori


Untuk membuat salinan kerja dari repositori lokal, jalankan perintah:
git clone /jalur/ke/repositori
Namun, ketika mengakses server luar maka perintahnya sebagai berikut:
git clone namapengguna@host:/jalur/ke/repositori

Alur kerja Git


Respositori Anda terdiri dari 3 bagian utama yang disebut dengan Trees, yaitu: Direktori Kerja yang menyimpan berkas aktual, Stagging Area sebagai pengolah data dan Repositori tempat penyimpanan komit file terakhir.
git_workflow

Sumber: http://heim.ifi.uio.no/gisle/staging2/drupalprimer/drupal/gl_git.html

Tambah dan Komit File


Anda bisa menambahkan file yang sudah diubah/ditambah ke direktori menggunakan perintah:
git add <nama_berkas>
git add *
Ini adalah langkah awal alur kerja menggunakan git, kemudian lakukan komit file menggunakan perintah:
git commit -m "Pesan Komit"
Sekarang file sudah berada di repositori lokal, belum di server luar.

Mengirim Perubahan File


Saat ini semua perubahan file berada pda direktori Anda, untuk mengirimnya ke server luar maka jalankan perintah:
git push origin master
Ubah master sesuai cabang yang kamu inginkan.
Jika repositori yang ada belum dikloning dan ingin dihubungkan dengan server luar maka perlu dijalan perintah berikut:
git remote add origin <server>  
Sekarang Anda bisa mengirim perubahan file ke server luar yang dituju.

Percabangan


Percabangan atau branching digunakan untuk mengembangkan fitur-fitur secara terisolasi. Cabang utama atau master adalah cabang utama ketika Anda membuat repositori, gunakan cabang lain untuk aktifitas pengembangan, setelah selesai maka gabungkan kembali ke cabang utama (master).
git_branching

Sumber: https://betterexplained.com/articles/aha-moments-when-learning-git/

Membuat cabang baru dan masuk ke dalamnya menggunakan perintah:
git checkout feature_branch
Beralih lagi ke master menggunakan perintah:
git checkout master
Menghapus branch feature_branch yang tadi dibuat, menggunakan perintah:
git branch -d feature_branch

Perbarui & Gabung


Untuk memperbarui repositori lokal ke komit terkini, maka jalankan perintah:
git pull origin
Perintah tersebut untuk mengambil perubahan dari server luar ke direktori lokal. Jika ingin menggabungkan ke cabang lain, misalnya master maka jalankan perintah:
git merge <cabang>  
Pada kondisi tersebut, git mencoba menggabungkan hasil perubahan file dari cabang lain ke master secara otomatis, namun saat penggabungan sering terjadi konflik yang disebabkan oleh perubahan file pada baris yang sama, sehingga perlu disunting baris file mana yang mengalami konflik. Untuk memudahkan penyuntingan maka dapat menggunakan perintah:
git diff <cabang_asal> <cabang_tujuan> 

Menandai


Membuat penanda atau tags sangat dianjurkan untuk perangkat lunak yang dirilis. Anda dapat membuat penanda baru dengan nama 1.0.0 dengan menjalankan perintah:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff adalah 10 karakter pertama dari identitas komit yang ingin Anda referensikan ke penanda. Anda bisa mendapatkan identitas komit dengan melihat log.

Log


Anda dapat mempelajari riwayat repositori menggunakan:
git log
Anda juga dapat menambahkan banyak parameter untuk menampilkan log sesuai keinginan. Untuk melihat komit penulis tertentu:
git log --author=bob
Untuk melihat log dengan tampilan yang mudah dibaca yaitu satu baris per komit, maka dapat menggunakan perintah:
git log --pretty=oneline
Atau Anda mungkin ingin melihat pohon ASCII dari seluruh percabangan disertai nama dan penandanya:
git log --graph --oneline --decorate --all
Untuk melihat berkas yang berubah:
git status
Untuk mendapatkan bantuan lebih banayak, dapat menggunakan perintah –help

Mengembalikan perubahan lokal


Ketika Anda sudah terlanjur melakukan kesalahan, maka Anda dapat mengembalikannya menggunakan perintah:
git checkout -- <nama_berkas>

Perintah di atas mengembalikan perubahan di dalam area kerja Anda dengan konten terakhir dari HEAD. Perubahan dan berkas baru yang telah ditambahkan ke indeks akan tetap tersimpan.

Jika Anda ingin membatalkan perubahan dan komit lokal seutuhnya, maka dapat mengambil riwayat terakhir dari server dan arahkan ke cabang master lokal seperti ini:
git fetch origin
git reset --hard origin/master

Advertisements
E-Book — November 24, 2016

E-Book

IF5120 – Rekayasa Kebutuhan Sistem dan Perangkat Lunak

IF-113 – Fisika Instrumentasi

Membuat Aplikasi Sentiment Analysis Menggunakan NodeJS — October 29, 2015

Membuat Aplikasi Sentiment Analysis Menggunakan NodeJS

Sentiment Analysis membantu Anda untuk memahami apakah topic yang dibicarakan orang-orang penting atau tidak. Aplikasi yang akan kita bangun mengambil sebuah keyword kemudian mencocokkannya dengan tweet seseorang dalam Twitter. Aplikasi menggunakan module dari NodeJS yang bisa melakukan scoring/penilaian terhadap teks dari tweet tersebut dan menampilkan statistik nya.

Teknologi

Teknologi-teknologi yang kita gunakan dalam membangun aplikasi ini adalah :

  • Nodejs
  • Express sebagai server
  • jQuery untuk manipulasi DOM dari sisi client
  • Slush generator yaitu slush-express untuk scaffolding project
  • diskDB sebagai database untuk menyimpan hasilnya
  • module Twitter untuk menghubungkan ke Twitter
  • module Sentiment untuk melakukan analisis

Memulai Aplikasi

Buat folder dengan nama sentimentAnalysisApp dan buka terminal. Pertama kita akan menginstall Gulp, Slush, dan Express generator menggunakan perintah berikut :

npm i -g gulp slush slush-express

Kalau modulnya sudah diinstal, kita akan membuat scaffolding project Express dengan perintah:

slush express

Slush meminta Anda untuk memilih view engine dan stylesheet engine. Jawab seperti dibawah ini.
[?] Select a View Engine: HTML
[?] Select a Stylesheet Engine: CSS
Hanya menunggu beberapa menit untuk membuat scaffolding aplikasi dan menginstall dependency nya. Kira-kira hasil dari scaffolding nya terlihat seperti ini:

sentimentAnalysisApp
├── Gulpfile.js
├── app.js
├── bin
│ └── www
├── bower.json
├── package.json
├── public
│ └── stylesheets
│ └── style.css
├── routes
│ ├── index.js
│ └── users.js
└── views
├── error.html
└── index.html

Berikut penjelasan file dan foldernya :

  • bin/www – Untuk melakukan inisialisasi dan konfigurasi port.
  • app.js – Untuk konfigurasi server, routes, dan views,
  • gulpFile.js – Sebagai task runner project kita.
  • /routes – Berisi file untuk membuat route aplikasi.
  • /views – Berisi file untuk membuat tampilan aplikasi.

Anda bisa menjalankan aplikasi dengan perintah gulp. Express server akan menjalankannya pada port 3000. Buka browser http://localhost:3000 dan Anda akan melihat tampilan homepage.

Membuat Server

Pertama, kita menginstall beberapa dependency sebagai berikut :

npm install twitter sentiment –save

Selanjutnya, buat sebuah folder dengan anam logic pada root project. Buat duah buah file dengan nama twitterSearch.js dan sentimentAnalysis.js. File-file ini berisi sebuah logic untuk mengambil tweets dari twitter serta melakukan analisis terhadap tweets tersebut. Buat folder lagi dengan nama db, yang digunakan untuk menyimpan data.
Selanjutnya, buka routes/index.js menggunakan IDE/editor yang Anda sukai. Kita akan menambahkan route baru, POST /search. Teks yang dicari oleh user akan di submit ke route tersebut. Update routes/index.js as sebagai berikut :

'use strict';
var express = require('express');
var router = express.Router();
var twitterSearch = require('../logic/twitterSearch');

/* GET home page. */
router.get('/', function(req, res) {
  res.render('index');
});

router.post('/search', function(req, res) {
  twitterSearch(req.body.search, function (data) {
    res.json(data);
  });
});

module.exports = router;

Fungsi twitterSearch() untuk mencari dan mencocokkan dengan tweets dari Twitter.
Selanjutnya, open logic/twitterSearch.js tambahkan code berikut :

//includes
var util = require('util'),
    twitter = require('twitter'),
    sentimentAnalysis = require('./sentimentAnalysis'),
    db = require('diskdb');

db = db.connect('db', ['sentiments']);
//config
var config = {
  consumer_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
  consumer_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
  access_token_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxx',
  access_token_secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'
};

module.exports = function(text, callback) {
  var twitterClient = new twitter(config);
  var response = [], dbData = []; // to store the tweets and sentiment

  twitterClient.search(text, function(data) {
    for (var i = 0; i < data.statuses.length; i++) {
      var resp = {};

      resp.tweet = data.statuses[i];
      resp.sentiment = sentimentAnalysis(data.statuses[i].text);
      dbData.push({
        tweet: resp.tweet.text,
        score: resp.sentiment.score
      });
      response.push(resp);
    };
    db.sentiments.save(dbData);
    callback(response);
  });
}

Kalau kita ingin mendapatkan tweets, kita harus melakukan registrasi sebuah app baru pada Twitter pada menu Developer. Kemudian baru bisa untuk men-generate key dan token.
Arahkan ke Twitter apps dan klik Create New App. Isi form nya. Kalau app sudah dibuat, kita akan men-generate token. Klik pada API Keys tabs, dan scroll ke bawah halaman. Kemudian klik Create my access token. Kalau sudah, Anda akan melihat pesan untuk melakukan refresh halaman, lanjutkan. Sekarang kita mendapatkan API key, API secret, Access token, dan Access token secret and dan copy pada:

var config = {
  consumer_key: 'API key',
  consumer_secret: 'API secret',
  access_token_key: 'Access token',
  access_token_secret: 'Access token secret'
};

Selanjutnya, buka logic/sentimentAnalysis.js dan tambahkan code berikut :

var sentiment = require('sentiment');

module.exports = function(text) {
  return sentiment(text);
};

Sederhana bukan…,Sekarang, ayo buat client nya.

Membuat Client

Buat sebuah fodler dengan nama scripts di dalam folder public. Dalam scripts, buat sebuah file dengan anama app.js dab buka dengan editor yang Anda sukai.
Lengkapi app.js dengan code berikut.

$(document).ready(function() {
  // handle the form submit
  $('#searchText').on('keypress', function(e) {
    if (e.which == 13 || e.keyCode == 13) {
      if ($(this).val().trim().length > 0) {
        // initiate an Ajax call to send the data
        fireAJAX($(this).val().trim());
      }
    }
  });

  function fireAJAX(text) {
    $.ajax({
      type: 'POST',
      url: '/search',
      data: {
        search: text
      },
      beforeSend: function(xhr) {
        $('.tweet-results').html('');
        $('.results').show();
        enableState();
      },
      success: parseData,
      error: oops
    });
  }

  function parseData(data) {
    disableState();
    var html = '';
    for (var i = 0; i < data.length; i++) {
      var s = data[i].sentiment,
          t = data[i].tweet;

      var _o = {
        imgSrc: t.user.profile_image_url,
        tweetLink: 'http://twitter.com/' + t.user.screen_name + '/status/' + t.id_str,
        tweet: t.text,
        score: s.score ? s.score : '--',
        comparative: s.comparative ? s.comparative : '--',
        favorited: t.favorite_count ? t.favorite_count : 0,
        retweet: t.retweet_count ? t.retweet_count : 0,
        wordsMatched: s.words && s.words.length ? s.words : '--',
        positiveWords: s.positive && s.positive.length ? s.positive : '--',
        negativeWords: s.negative && s.negative.length ? s.negative : '--'
      };

      html += tmpl('tweet_tmpl', _o);
    };
    $('.tweet-results').html(html);
  }

  function oops(data) {
    $('.error').show();
    disableState();
  }

  function disableState() {
    $('.loading').hide();
    $('#searchText').prop('disabled', false);
  }

  function enableState() {
    $('.loading').show();
    $('#searchText').prop('disabled', true);
  }
});

// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
(function() {
  var cache = {};

  this.tmpl = function tmpl(str, data) {
    // Figure out if we're getting a template, or if we need to
    // load the template - and be sure to cache the result.
    var fn = !/\W/.test(str) ?
      cache[str] = cache[str] ||
      tmpl(document.getElementById(str).innerHTML) :

    // Generate a reusable function that will serve as a template
    // generator (and which will be cached).
    new Function("obj",
      "var p=[],print=function(){p.push.apply(p,arguments);};" +

      // Introduce the data as local variables using with(){}
      "with(obj){p.push('" +

      // Convert the template into pure JavaScript
      str
      .replace(/[\r\t\n]/g, " ")
      .split("{{").join("\t") // modified
      .replace(/((^|\}\})[^\t]*)'/g, "$1\r") // modified
      .replace(/\t=(.*?)}}/g, "',$1,'") // modified
      .split("\t").join("');") 
      .split("}}").join("p.push('") // modified
      .split("\r").join("\\'") + "');}return p.join('');");

    // Provide some basic currying to the user
    return data ? fn(data) : fn;
  };
})();

Selanjutnya, buka views/index.html tambahkan code berikut.
Line 1-26 :
1-26SentimentAnalysis
Line 27-55 :
27-55SentimentAnalytic
Line 56-71 :
56-71SA

Terakhir, open stylesheets/style.css tambahkan code berikut :

body {
  padding: 50px;
  font: 14px"Lucida Grande", Helvetica, Arial, sans-serif;
  background: #eee;
}
a {
  color: #00B7FF;
}
input {
  width: 98%;
  padding: 9px;
  font-size: 17px;
}
.results {
  display: none;
}
.error {
  color: red;
  display: none;
}
.tweet-results {
  width: 100%;
  overflow: hidden;
  padding-right: 18px;
}
.left {
  float: left;
  width: 39%;
}
.right {
  float: right;
  width: 55%;
  border-left: 1px dashed;
  padding-left: 21px;
}
article {
  background: #fff;
  display: block;
  padding: 18px;
  border: 1px solid #eee;
  margin-top: 21px;
  margin-bottom: 21px;
  overflow: hidden;
  box-shadow: 6px 4px 9px 1px rgba(119, 119, 119, 0.75);
  -moz-box-shadow: 6px 4px 9px 1px rgba(119, 119, 119, 0.75);
  -webkit-box-shadow: 6px 4px 9px 1px rgba(119, 119, 119, 0.75);
}
article img {
  width: 64px;
  float: left;
  margin:0 5px 0 0;
}
.right table {
  width: 100%;
}
.right table, .right table td {
  border: 1px solid;
}
.right table td {
  width: 50%;
}

Hore…!, Kita sudah selesai melakukan development. Ayo jalankan aplikasinya dan test langsung gak usa malu-malu. Balik lagi ke terminal, Jalankan perintah gulp untuk menghidupkan server. Arahkan ke http://localhost:3000/ Anda mlihat search bar. Ketikkan kata-kata positif berikut “This is Awesome” dan tekan enter, kira-kira hasilnya seperti ini :
First

2
3

10 Keuntungan Mahasiswa “Totalitas Informatika” — October 28, 2015

10 Keuntungan Mahasiswa “Totalitas Informatika”

Kali ini saya coba men-sharing ulang artikel yang saya baca sebelumnya dari Hipwee. Topik ini sifatnya umum sehingga saya masukkan ke kategori General. Atikel ini diharapkan bisa bermanfaat bagi mahasiswa yang sudah terlanjur memilih kuliah di bidang informatika.

Mahasiswa informatika merupakan mereka yang mengambil studi pada perguruan tinggi dibidang komputer dan sejenisnya. Banyak sekali fokus-fokus yang di pelajari oleh mahasiswa teknik informatika seperti pemogramanan, jaringan komputer, desain grafis, animasi, dan lain-lain sesuai kebijakan kampus dan studi fokus yang di ambil oleh mahasiswa tersebut.

Banyak sekali mahasiswa teknik informatika di tanah tercinta kita ini dari seorang ahli komputer sampai yang mengaku-ngaku mahasiswa informatika dan dari yang mendapat beasiswa sampai yang terpaksa ambil jurusan informatika. Buat kamu yang sudah terlanjur jadi mahasiswa informatika atau sedang memilih jurusan, mungkin tulisan ini bisa menjadi bahan referensi.

1. Melek Teknologi

melekit
http://www.ciputraentrepreneurship.com

Hal ini merupakan poin penting jika kamu jadi mahasiswa totalitas informatika. Jika sebelumnya kamu merasa gaptek (dibaca : gagap teknologi a.k.a gak update teknologi) mungkin sekarang kamu akan lebih terbuka dengan dunia teknologi. Hal tersebut bisa dikarenakan tugas yang di berikan oleh dosen mu atau hal yang tersebar secara “eksotis” mengenai teknologi dari teman-teman kampusmu kemudian kamu googling dan menemukan ilmu baru disana.

2. Kamu menjadi orang yang berintegrasi pada problem solving

problemsolving
fokus pada manfaat via http://www.polibatam.ac.id

Jika kamu menjadi mahasiswa yang totalitas informatika, maka kamu tentu akan mencari solusi tentang sebuah permasalahan. jika teman-teman mu pusing cara menghitung keuangan masuk dan keluar, maka kamu dengan ligat membuat sebuah aplikasi keuangan lengkap dengan database penyimpanan data.

3. Interaksi mu tidak terbatas pada manusia

interaksi
interaksi tidak biasa via http://www.womenshealthmag.com

Mungkin manfaat ini terdengar “freak” untuk kamu. namun kamu harus mengetahui apa yang dimaksud dengan interaksi itu terlebih dahulu. yang dimaksud dengan interaksi merupakan sebuah komunikasi langsung atau tidak langsung antar pemberi informasi dengan penerima informasi. jadi interaksi tidak harus berbicara, ngobrol dsb. mengetik, searching keyword juga merupakan interaksi. dengan kamu menjadi mahasiswa totalitas informatika, kamu akan lebih mengetahui cara berinteraksi dengan internet seperti Google yang optimal, seperti menambahkan google dork di samping kata kunci dan lain-lain.

4. Kamu bisa lebih pintar dari dosenmu

pintar
lebih pintar via https://www.linkedin.com

Dunia komputer itu luas, luas sekali dan selalu update. jika dirimu fokus pada suatu bidang komputer dan benar-benar fokus serta selalu update, tidak ada kata mustahil jika kamu akan lebih pintar dari dosenmu, namun jika kamu tidak update dan fokus, jangankan mengalahkan dosen, sama juniormupun kamu akan ketinggalan

5. peluang kaya di usia muda jika menekuni internet marketing

marketing
Internet marketing via https://hendihen.wordpress.com

Internet marketing saat ini sudah sangat menjamur, khususnya di indonesia. internet marketing adalah salah satu peluang jika ingin kaya di usia muda. saat ini banyak sekali marketer-marketer di internet yang berjualan, namun hanya beberapa dari mereka yang mengerti ilmu internet marketing yang benar, jadi hanya sebagian dari mereka itulah yang mendapatkan duit banyak tanpa harus berjualan di internet. Jika kamu menjadi mahasiswa yang totalitas informatika, maka tentunya kamu akan melirik peluang ini. bisa jadi kamu akan memperdalam maupun ikut pelatihan internet marketing. sulit rasanya bagi mereka yang “hanya mengaku” mahasiswa informatika tertarik dengan hal demikian apalagi membayangkan uang puluhan bahkan jutaan rupiah masuk ke rekening mereka tanpa susah-susah jualan.

6. Tidak di bodoh-bodohi sama tukang service laptop atau smartpone

pura-pura parah via http://www.pinoytechblog.com

Dunia komputer memang luas, namun setidaknya kita tahu harga RAM, hard disk external atau harga DVD OS Windows. kebanyakan diantara kita ketika dihadapkan pada alat elektronik yang cukup “vital” seperti laptop dan smartphone maka kita membuang akal sehat kita. hanya dengan iming-iming barang elektronik kita akan kembali seperti semula. Jika kita bukan mahasiswa totalitas informatika, atau orang yang tidak ambil peduli asalkan barang kita bisa kembali bekerja seperti semula, maka berapapun harganya, pasti akan kita bayar. cukup dengan penjelasan “hoax” tukang service seperti harga DVD OS yang 300.000, biaya operasional yang mahal, kerusakan laptop yang parah, hp yang sudah bootloop dll, maka kita dengan rela mebayar ratusan ribu bahkan sampai jutaan untuk kerusakan yang tidak seberapa.

7. Mampu mengatasi kerusakan minimal pada laptop atau smartphone

bodoh
simple! via http://bimandroid.net

Jika kamu menjadi mahasiswa yang totalitas informatika, maka kamu tentu tahu cara menangani kerusakan simple pada smartphone atau laptop kesayanganmu. seperti cara flashing smartphone sampai cara install ulang dengan DVD OS maupun dengan flash disk. namun jika tidak bisa, cukup minta tolong sama teman yang ahli dibidangnya dan dipercaya, cukup dibayarin uang makan, rokok dan gorengan yang tidak lebih dari 100.000 barang kamu sudah bisa bekerja seperti semula.

8. Menjadi lebih paham pentingnya smart user dari pada smartphone

smart
smartuser via http://www.slideshare.net

Kamu akan tersadar, seberapa banyaknya orang yang mempunyai smartphone tapi tidak digunakan se optimal mungkin. kamu akan tahu seberapa orang yang hanya mementingkan “style” smartphone padahal pulsanya belum tentu ada, interentan aja cari wifi gratisan. Dengan menjadi mahasiswa yang totalitas infomatika, kamu akan sadar akan kebutuhan kamu akan smartphone yang sebenarnya seperti apa. sehingga terhindar dari pemborosan uang untuk membeli smartphone kekinian.

9. Menjadi agen software dan aplikasi

agen
agen software via http://herubest.blogspot.com

Hal ini biasanya yang melekat pada mahasiswa yang totalitas informatika. Biasanya anak informatika menjadi sarangnya software-software kampus, OS, game sampai multimedia mulai dari yang gratisan sampai hasil “crack”. biasanya mereka menyimpan software tersebut jika sewaktu-sewaktu laptopnya perlu di install ulang dan harus menginstal ulang aplikasi tersebut. antisipasi.

10. Menjadi tahu tips dan trik dalam dunia komputer

gratis
aku tahu yang “mungkin” kamu tidak ketahui via http://zona-gratis.yu.tl/

Ini adalah manfaat jika kamu menjadi mahasiswa totalitas informatika dan terlalu dalam menyelam didunia internet. kamu akan mengetahui hal-hal tabu mengenai komputer dan internet yang tidak semua orang mengetahuinya. seperti internetan murah dengan ssh, wifi hunter tanpa punya akun wifi, sampai dapat jurnal dan paper berbayar secara gratis. tidak semua tips dan trik ini legal. gunakan secara sebaik mungkin.

“If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut” –Albert Einstein

Itulah beberapa manfaat jika kamu menjadi mahasiswa yang totalitas informatika. banyak sekali manfaat lain yang tidak sanggup ditulis. hal diatas tidak hanya teruntuk untuk mahasiswa informatika saja, namun bagi mereka yang totalitas bergelut dibidang informatika.

Sumber : http://www.hipwee.com/list/10-keuntungan-jika-kamu-jadi-mahasiswa-totalitas-informatika/

Membangun Todo App dengan DiskDB —

Membangun Todo App dengan DiskDB

Jika Anda belum tahu, DiskDB adalah sebuah sistem file berbasis database. Hanya ada satu alasan kenapa menggunakan DiskDB yaitu untuk menghindari penggunaan MongoDB dalam pengelolaan Rest App dalam skala kecil.

TodoApp yang akan dibangun tampak seperti ini :

Home

CompleteTask

EditTask

Kenapa DiskDB ?

Banyak sekali aplikasi di luar sana yang memiliki beberapa collection di dalam Database dan juga beberapa REST. Aplikasi-aplikasi tersebut melakukan Create, Read, Update dan Delete yang lebih dikenal dengan CRUD terhadap beberapa record antar collection. Menggunakan MongoDB untuk aplikasi seperti ini dianggap terlalu berlebihan.

DiskDB menyimpan data dalam sebuah format JSON. Anda tidak usah khawatir dalam menggunakan DB service jika ingin memindahkan aplikasi ke public karena data akan disimpan dalam file pada folder yang sudah Anda konfigurasi.

Mari kita coba mulai menggunakan DiskDB.

Memulai DiskDB

Untuk mendapatkan pengetahuan dasar, berikut ada beberapa contoh serta penjelasannya. Buat sebuah folder dan beri nama myDiskDBApp, kemudian bukan terminal dan jalankan :

npm init

yaitu untuk inisialisasi Node project. Sekarang install diskdb sebagai dependency nya dengan menjalankan :

npm install diskdb --save

Buat sebuah folder baru di dalam root project (myDiskDBApp) dengan nama mydb, kemudian buat juga file app.js yang disimpan pada root project dan tambahkan kode berikut dalam app.js:


var db = require('diskdb');
db = db.connect('mydb', ['fruits']);

Baris 1 – Require DiskDB
Baris 2 – Connect ke folder mydb untuk mencari file yang namanya fruits. Jika file tidak ditemukan, maka secara otomatis akan membuat file JSON baru untuk Anda.
Sekarang, ayo tambahkan “fruit” sebagai collection.

// add a fruit
var apple = {
	name : 'apple',
	qty : 3
};
 
db.fruits.save(apple);

Seperti MongoDB, Anda dapat mengakses collection menggunakan namanya dan memanggil method-method API.
Untuk menjalankan aplikasi, pada teriminal ketikkan:

$ node app.js

Anda juga bisa menambahkan beberapa collection bersamaan :

var fruits = [{
  name: 'pineapple',
  qty: 5
}, {
  name: 'banana',
  qty: 8
}, {
  name: 'pear',
  qty: 1
}]
 
db.fruits.save(fruits);

Sederhana bukan? Anda juga bisa melakukan query terhadap collection menggunakan find() atau findOne().

File app.js sampai tahap ini :

var db = require('diskdb');
db = db.connect('mydb', ['fruits']);
 
// add a fruit
var apple = {
  name: 'apple',
  qty: 3
};
 
db.fruits.save(apple);
 
var fruits = [{
  name: 'pineapple',
  qty: 5
}, {
  name: 'banana',
  qty: 8
}, {
  name: 'pear',
  qty: 1
}]
 
db.fruits.save(fruits);
 
console.log(db.fruits.find()); // will return all the fruits
console.log(db.fruits.find({name : 'apple'})); // will return all the fruits with name as apple
 
console.log(db.fruits.findOne()); // will return the first fruits
console.log(db.fruits.find({name : 'apple'})); // will return the first fruits with name as apple

Kira-kira outputnya seperti ini :
diskdb
Setelah melihat beberapa contoh sederhana penggunaan DiskDB diatas, mungkin sudah bisa kita coba untuk membangun TodoApp nya.

Membangun Todo App

Sekarang, Anda sudah memiliki pengetahuan dasar tentang DiskDB. Ayo bangun Todo App sederhana menggunakan DiskDB sebagai persistence layer.
Clone/Download project dari repo berikut. Buka terminal, pada direktori folder yang sudah di download jalankan :

npm install

Langkah tersebut untuk menginstall semua dependency yang di butuhkan. Selanjutnya kita akan uninstall mongojs dari dependency dengan cara :

npm uninstall mongojs --save

Selanjutnya install diskdb dengan cara :

npm install diskdb --save

Sekarang, kita akan membuat sebuat folder baru di dalam folder server dengan nama db. Folder ini adalah tempat kita akan menyimpan Todo collection.
Sekarang, buka server/routes/index.js dan update seperti ini :

(function() {
 
  'use strict';
  var express = require('express');
  var router = express.Router();
  var db = require('diskdb');
  db = db.connect('server/db', ['todos']);
 
  /* GET home page. */
  router.get('/', function(req, res) {
    res.render('index');
  });
 
  router.get('/api/todos', function(req, res) {
    res.json(db.todos.find());
  });
 
  router.post('/api/todos', function(req, res) {
    res.json(db.todos.save(req.body));
  });
 
  router.put('/api/todos', function(req, res) {
    res.json(db.todos.update({
      _id: req.body._id
    }, {
      isCompleted: req.body.isCompleted,
      todo: req.body.todo
    }));
  });
 
  router.delete('/api/todos/:_id', function(req, res) {
    res.json(db.todos.remove({
      _id: req.params._id
    }));
  });
 
  module.exports = router;
 
}());

Itu dia..!! Sekarang backend nya sudah menggunakan DiskDB.
Saat menggunakan DiskDB, response untuk fungsi update sedikit berbeda sehingga kita butuh untuk mengubah file /client/js/controllers.js.
Replace baris 34 dan baris 51 dengan :

if (data.data.updatedExisting)
if (data.data.updated > 0 || data.data.inserted > 0)

Simpan semua file dan jalankan :

gulp

dan buka browser dengan address http://localhost:3000 untuk melihat perubahan code.
Anda bisa meng-check /server/db/todos.json untuk melihat perubahan data JSON yang sedang di update.

Sederhana dan mudah bukan!!

Keep Learn and Have fun Coding !!

Iconix Process : Software Development Methodology — October 26, 2015

Iconix Process : Software Development Methodology

Salah satu masalah yang dihadapi oleh mahasiswa dalam menyusun skripsi adalah pada bagian analisa dan perancangan yang terlalu bersifat teoritis sehingga tidak mendukung untuk implementasi atau pembuatan kode program.
Sehingga muncul pertanyaan, apa saja langkah-langkah yang harus ditempuh dalam merancang sistem berbasis UML?
Hal ini menyebabkab mahasiswa lebih senang untuk membuat kode program terlebih dahulu baru melakukan reverse engineering untuk menghasilkan UML. Dengan kata lain, sistem dibuat tanpa analisa dan perancangan sementara UML hanya produk sampingan untuk menambah ketebalan skripsi tanpa fungsi yang berarti.
Gambar berikut merupakan proses analisa dan perancangan sistem informasi menggunakan Iconix Process :
fig1

1. Membuat Functional Requirement
Gunakan Ms.Word untuk menuliskan functional requirement (apa saja yang dibutuhkan oleh sistem). Tahap ini melibatkan bussines analyst, pelanggan, end-user dan project stakeholder lainnya. Functional requirement masih belum terstruktur sehingga tidak bisa dipakai secara langsung dalam perancangan.
Berikut contoh potongan functional requirement untuk sebuah sistem bengkel motor sederhana :

Sistem harus dapat memproses work order untuk motor mulai dari antri, sedang dikerjakan 
oleh seorang mekanik, selesai di-servis, dan proses pembayaran. 
Sebuah work order memiliki informasi jenis pekerjaan dan sparepart yang dijual. 
Harga ongkos servis berdasarkan jenis pekerjaan dan tipe motor.

2. Membuat Domain Model
Salah satu fungsi domain model adalah menyamakan istilah yang akan pakai diproses selanjutnya. Misalnya, apakah saya akan memakai istilah ‘work order’ atau ‘pekerjaan servis’? Apa saya akan memakai sebutan ‘sparepart‘ atau ‘suku cadang‘? Walau terlihat sepele, perbedaan istilah seringkali menimbulkan salah paham dalam komunikasi tim.
Pada tahap ini, domain model adalah class diagram yang hanya memakai relasi pewarisan (is-a/adalah sebuah) dan agregasi (has-a/memiliki sebuah). Class diagram ini belum memiliki atribut dan operasi. Nantinya, di proses selanjutnya, domain model akan diperbaiki dan dikembangkan menjadi lebih detail.
Gambar berikut ini memperlihatkan contoh domain model untuk functional requirement di langkah 1:
gambar1

3. Membuat Use Case
Use case mendefinisikan behavioral requirements berdasarkan functional requirement (dan sumber lainnya). Berbeda dengan anjuran dari buku analisis sisfo lain, buku ini menyarankan untuk membuat use case dengan maksimal 2 paragraf! Tidak perlu mengikuti template yang detail! Sebuah use case yang panjang & detail malah akan memperlambat kita. Tim yang membuat use case bisa jadi akhirnya hanya mengisi form yang kosong tanpa banyak berpikir panjang (misalnya sekedar copy paste) sehingga proses membuat use case hanya sekedar ritual tanpa analisa mendalam.
Kalimat yang dipakai dalam use case harus berupa kalimat aktif, misalnya “pengguna men-klik tombol Login”. Kalimat pasif seperti “Sistem menyediakan tombol Login” adalah ciri-ciri functional requirement dan bukan bagian dari use case.
Use case harus mengandung nama di domain model. Dengan demikian, saya bisa menghubungkan class-class yang akan dirancang dengan use case. Setiap halaman/layar yang direferensikan di dalam use case sebaiknya diberi nama yang konsisten, misalnya Halaman Tambah Sparepart atau Screen TambahSparepart.
Sebuah use case hampir mirip seperti dokumentasi sistem. Kita perlu menspesifikasikan seperti apa cara pakai sistem (termasuk respon sistem) sebelum sebuah sistem dibuat. Berikut ini adalah contoh use case diagram berdasarkan functional requirement di langkah 1 dan memakai domain model dari langkah 2:
gambar2
Sebuah use case selain memiliki sunny-day scenario, sebaiknya juga memiliki rainy-day scenario (apa yang akan terjadi bila sesuatu salah?) atau alternatif. Sebagai contoh, berikut ini contoh use case scenario untuk use case diagram di atas:


Membuat WorkOrder baru
Basic Scenario
 Front Desk memilih Motor di Screen ListMotor dan men-klik tombol untuk membuat WorkOrder. 
 Sistem akan membuat sebuah WorkOrder baru dengan status sedang antri.
Alternate Scenario
 Motor belum terdaftar - Front Desk terlebih dahulu menambah Motor baru dengan 
    men-klik tombol untuk menambah Motor baru sebelum mengerjakan langkah 
    yang ada di Basic Scenario.
 Motor sudah memiliki WorkOrder yang sedang antri - Sistem akan menampilkan pesan kesalahan.
[Catatan: pada saat membuat use case ini, terlihat bahwa dibutuhkan use case menambah Motor. 
Agar ringkas, use case tersebut akan diabaikan.]

Mengubah Status WorkOrder menjadi sedang dikerjakan oleh Mekanik
Basic Scenario
 Front Desk memilih sebuah WorkOrder di Screen ListWorkOrder dan memilih menu untuk 
 menandakan bahwa Workorder tersebut sedang dikerjakan. 
 Sistem akan menampilkan Screen PengerjaanWorkOrder. Front Desk memilih nama Mekanik 
 yang mengerjakan WorkOrder dan men-klik tombol untuk menyimpan perubahan. 
 Sistem akan mengubah status WorkOrder menjadi sedang dikerjakan 
 serta mencatat tanggal & jam mulai dikerjakan.
Alternate Scenario
 Status WorkOrder yang dipilih bukan sedang antri - Sistem akan menampilkan pesan kesalahan.

Menambah Sparepart yang dipakai selama pengerjaan WorkOrder
Basic Scenario
 Front Desk memilih sebuah WorkOrder di Screen ListWorkOrder dan memilih menu untuk 
 menambah Sparepart di WorkOrder. Sistem akan menampilkan Screen TambahSparepart yang 
 berisi daftar Sparepart untuk WorkOrder yang dipilih. Disini Front Desk akan mengisi 
 data ItemSparepart dengan memilih Sparepart, memasukkan jumlah Sparepart, lalu men-klik 
 tombol Tambah ItemSparepart. Sistem akan memperbaharui daftar ItemSparepart di layar.
 Front Desk men-klik tombol Simpan untuk selesai. Sistem akan menyimpan perubahan Sparepart 
 pada WorkOrder terpilih.
Alternate Scenario
 Terdapat lebih dari satu jenis Sparepart yang perlu ditambahkan - Front Desk kembali 
   menambah data ItemSparepart. Setelah semua ItemSparepart selesai dimasukkan, Front Desk 
   men-klik tombol Simpan di Screen TambahSparepart. Sistem akan menyimpan perubahan.
 Status WorkOrder yang dipilih bukan sedang dikerjakan - Sistem akan menampilkan pesan 
   kesalahan.
[Catatan: pada saat membuat use case ini, terlihat bahwa ada yang kurang pada domain model, 
  yaitu ItemSparepart. Segera update domain model! Terlihat juga bahwa dibutuhkan sebuah 
  metode untuk menghapus Sparepart dan meng-edit jumlah Sparepart terpakai. 
  Agar ringkas, use case tersebut akan diabaikan.]

Mengubah status WorkOrder menjadi selesai dikerjakan
Basic Scenario
 Front Desk memilih sebuah WorkOrder di Screen ListWorkOrder, lalu memilih menu untuk mengubah 
 status WorkOrder menjadi selesai dikerjakan. Sistem akan menampilkan dialog konfirmasi. 
 Bila kasir menkonfirmasi, Sistem akan mengubah status WorkOrder tersebut menjadi selesai 
 dikerjakan dan mencatat jam selesai dikerjakan. Front Desk kemudian mengerjakan 
 use case "Mencetak rincian WorkOrder termasuk biaya".
Alternate Scenario
 Status WorkOrder bukan sedang dikerjakan - Sistem akan menampilkan pesan kesalahan.

Mencetak rincian WorkOrder termasuk biaya
Basic Scenario
 Front Desk memilih tombol untuk mencetak. Sistem kemudian mencetak detail WorkOrder 
 ke printer. 
 Detail WorkOrder yang dicetak meliputi tanggal, plat nomor motor, jam mulai dikerjakan, 
 jam selesai dikerjakan, nama mekanik yang mengerjakan, rincian seluruh Sparepart yang dipakai 
 (jumlah & harga eceran tertinggi Sparepart), ongkos servis dan total yang harus dibayar.
Alternate Scenario
 Status WorkOrder bukan selesai dikerjakan - Sistem akan menampilkan pesan kesalahan.
[Catatan: use case ini dipisahkan dari use case "Mengubah status WorkOrder menjadi 
 selesai dikerjakan" karena dianggap nanti akan ada use case lain yang dapat 
 mencetak rincian WorkOrder tetapi tidak ditampilkan disini.]

4. Requirements Review
Pada saat melakukan analisa dalam membuat use case, saya menemukan hal yang masih kurang. Misalnya, saya perlu menambahkan class ItemSparepart pada domain model. Selain itu, pada beberapa situasi, saya bahkan bisa menemukan ada use case yang masih kurang, misalnya use case “Tambah Motor baru“.
Pada langkah ini, saya kembali memastikan bahwa use case & domain model telah dibuat dengan baik. Pelanggan juga perlu dilibatkan untuk memastikan bahwa use case (behavioral requirement) & functional requirement sesuai dengan yang diharapkan. Ingatlah selalu bahwa bagian terpenting dari sebuah sistem bukanlah seberapa keren design pattern yang diterapkan di class diagram, tetapi sejauh mana sistem tersebut memberikan profit bagi penggunanya (memenuhi requirements).

5. Melakukan Robustness Analysis
Analisis adalah memikirkan “apa” (what), sementara perancangan adalah memikirkan “bagaimana” (how). Salah satu alasan mahasiswa sering mengabaikan UML dan langsung terjun ke coding adalah celah yang cukup jauh antara analisis dan perancangan sehingga mereka memilih merancang secara eksperimental dengan langsung coding. Umumnya mereka berakhir dalam jebakan siklus perubahan “coding” terus menerus (guna memperbaiki rancangan). Padahal, perubahan “coding” adalah sesuatu yang sangat memakan waktu dan upaya bila dibandingkan dengan mengubah diagram UML.
Robustness analysis dipakai untuk menjembatani analisis dan perancangan. Robustness analysis harus diterapkan pada setiap use case yang ada. Pada Enterprise Architect, robustness analysis dapat digambarkan dengan menggunakan Analysis Diagrams (terdapat di kategori Extended).
Berikut ini adalah contoh hasil robustness analysis untuk use case yang ada:
gambar3
gambar4 gambar4
gambar5
gambar6

Semakin detail robustness analysis, maka semakin banyak hal yang kurang dari use case dan domain model yang akan ditemukan. Yup! Pada awalnya saya ragu kenapa saya harus menambah control “mengisi jumlah”, “mengisi nama”, dsb untuk setiap field yang ada. Tapi saya cukup terkejut saat menemukan dari hal sepele tersebut, saya menemukan beberapa alternate scenario yang kurang.
Sebagai contoh, saya menemukan bahwa saya lupa menambahkan alternate scenario “jumlah Sparepart tidak mencukupi” saat melakukan analisa robustness pada use case “Menambah Sparepart yang dipakai selama pengerjaan WorkOrder”. Semakin cepat saya menyadari ada yang kurang, semakin baik! Idealnya adalah sebelum coding dilakukan. Robustness analysis adalah salah satu senjata yang ampuh untuk itu.
Saya juga menemukan bahwa pada use case “Mengubah Status WorkOrder menjadi sedang dikerjakan oleh Mekanik”, saya lupa menuliskan bahwa Front Desk officer juga perlu memilih JenisPekerjaan. Saya perlu segera mengubah teks use case tersebut.
Selain itu, terkadang saya juga dapat menemukan ada class yang kurang pada domain model. Misalnya, dari hasil robutsness analysis, terlihat bahwa saya perlu menambahkan class Mekanik di domain model.
Pada tahap ini, saya juga perlu mengisi domain model dengan atribut, seperti yang terlihat pada gambar berikut ini:
gambar8

6. Preliminary Design Review
Kembali lagi seluruh tim melakukan review dan memastikan bahwa semua yang telah dibuat sesuai dengan requirement. Ini adalah langkah terakhir dimana pelanggan (stackholder) terlibat! Hal ini karena langkah berikutnya melibatkan proses techincal. Akan berbahaya bila membiarkan pelanggan yang non-technical atau semi-technical mengambil keputusan untuk hal-hal yang bersifat teknis (misalnya framework atau database yang dipakai). Walaupun demikian, pelanggan boleh memberikan komentar mengenai tampilan.
Setelah langkah ini, tidak ada lagi perubahan requirement. Lalu bagaimana bila pelanggan ingin menambah requirement? Buat sebuah rilis atau milestone baru dengan kembali lagi ke langkah pertama di atas.

7. Menentukan Technical Architecture
Tentukan framework apa yang akan dipakai. Sebagai contoh, saya akan membuat sebuah aplikasi desktop dengan Griffon. Pola arsitektur yang dipakai menyerupai Model View ViewModel (MVVM) dimana terdapat perbedaan antara domain model dan view model. Saya juga mengasumsikan penggunaan sebuah plugin fiktif yang dirujuk sebagai simple-jpa. Gambar berikut ini memperlihatkan contoh arsitektur yang dipakai:
gambar9

8. Membuat Sequence Diagram
Object oriented pada dasarnya adalah menggabungkan antara data dan operasi ke dalam sebuah entitas. Saat ini, domain model baru berisi data. Oleh sebab itu, dibutuhkan sebuah upaya untuk menemukan operasi untuk domain model. Caranya adalah dengan memakai sequence diagram.
Saat membuat sequence diagram, sertakan juga elemen dalam arsitektur teknis/framework. Misalnya penggunaan MVC akan menyebabkan ada class baru seperti controller. Yup! Penggunaan MVC akan membuat operasi tersebar ke controller. Hal ini sering dikritik karena bukan pendekatan OOP melainkan kembali ke zaman prosedural. Baca buku Object Design: Roles, Responsibilities, and Collaborations untuk pendekatan yang OOP, akan tetapi jangan lupa kalau kita dibatasi oleh framework yang dipakai (ehem, seharusnya bukan framework yang membatasi kita, melainkan kita yang tegas dalam memilih framework).
Selama membuat sequence diagram, ingatlah selalu bahwa tujuannya adalah menemukan operasi (behavior) untuk setiap class yang ada, bukan menunjukkan step-by-step operasi secara detail! Untuk menjaga agar tidak tersesat menjadi membuat flow-chart yang detail, jangan memikirkan focus of control (matikan saja fitur tersebut!).
Sequence diagram dibuat untuk setiap use case yang ada, berdasarkan hasil robustness anaylsis. Gambar berikut ini memperlihat contoh sequence diagram yang dihasilkan (agar sederhana, operasi penyimpanan data oleh simple-jpa tidak ditampilkan):
gambar10
gambar11
gambar12gambar13
gambar14

Proses analisa yang berulang kali lagi-lagi membantu saya menemukan kekurangan. Saya selama ini ternyata lupa bahwa pada use case “Menambah Sparepart yang dipakai selaman pengerjaan WorkOrder”, sistem harus mengurangi jumlah stok Sparepart bila pengguna men-klik tombol simpan. Oleh sebab itu, saya segera memperbaharui teks use case.
Selain itu, saya juga menemukan sebuah kesalahan yang saya buat dari awal dan tidak terdeteksi hingga sekarang, yang berhubungan dengan class OngkosServis. Gambar berikut ini memperlihatkan perancangan awal class tersebut:
gambarx0

Bila membuat ERD atau design tabel, ini adalah sesuatu yang dapat diterima (ongkos disimpan dalam tabel yang mewakili hubungan one-to-many dari JenisPekerjaan ke TipeMotor). Tetapi, bila diterapkan ke dalam domain model, maka akan terjadi kejanggalan saat saya memakai domain model tersebut di sequence diagram. Untuk memperoleh ongkos servis, apa saya harus membuat instance objek OngkosServis baru? Bila diterapkan ke coding, maka ini berarti untuk memperoleh ongkos servis, saya harus selalu melakukan query JPQL yang kira-kira terlihat seperti berikut ini:
TipeMotor tipeMotor = model.selectedTipeMotor
JenisPekerjaan jenisPekerjaan = model.selectedJenisPekerjaan
Query query =
em.createQuery(“SELECT o.harga FROM OngkosServis o WHERE ” +
“o.tipeMotor = :tipeMotor AND o.jenisPekerjaan = :jenisPekerjaan”)
query.setParameter(“tipeMotor”, tipeMotor)
query.setParameter(“jenisPekerjaan”, jenisPekerjaan)
Long ongkos = query.getSingleResult()
Terlihat ada yang tidak beres! Bukankah OOP harus intuitive & bisa dipakai dengan mudah? Kenapa tiba2 harus melakukan query secara eksplisit untuk memperoleh sebuah ongkos servis? Selain itu, class OngkosServis tidak pernah dipakai secara langsung di kode program, hanya dipakai di query saja!
Oleh sebab itu, saya memperbaikinya dengan membuang class OngkosServis, dan menambahkan atribut ongkosServis di class JenisPekerjaan dengan tipe data berupa Map. Dengan demikian, saya bisa memakainya seperti berikut ini:
TipeMotor tipeMotor = model.selectedTipeMotor
JenisPekerjaan jenisPekerjaan = model.selectedJenisPekerjaan
Long ongkos = jenisPekerjaan.getOngkosServis(tipeMotor)
Cara di-atas jauh lebih intuitive dan mudah dipahami. Query database tetap terjadi, tetapi kali ini secara implisit (secara otomatis) oleh Hibernate tanpa campur tangan developer.
Ini adalah alasan kenapa saya selalu memberikan pesan pada mahasiswa agar tidak memikirkan proses penyimpanan data saat membuat domain model. Jangan menyamakan domain model dan ERD. Pada saat merancang domain model, pikirkan bagaimana class-class yang ada akan saling berinteraksi dan dipakai oleh developer. Bahkan bila tidak memakai ORM seperti Hibernate, tetap jangan memikirkan bagaimana penyimpanan data di domain model, melainkan buat ERD terpisah untuk dipakai oleh persistence layer (DAO).

9. Critical Design Review
Kembali melakukan review untuk memastikan bahwa tidak ada yang kurang pada sequence diagram. Pastikan bahwa setiap class yang ada telah memiliki atribut dan operasi yang didefinisikan secara lengkap (memiliki nama, tipe data, parameter, dsb).
Berikut ini adalah contoh hasil domain model yang telah dilengkapi dengan operasi dan multiplicity:
gambar15
Getter dan setter tidak perlu ditampilkan karena hanya akan membuat class diagram terlihat ‘penuh’.
Versi bidirectional-nya akan terlihat seperti pada gambar berikut ini:
gambar
Selain domain model, saya juga menemukan terdapat class-class lain yang dihasilkan yang berkaitan dengan penggunaan framework, yang terlihat seperti pada gambar berikut ini:
gambar16

10. Coding
Disini developer berperan mengubah rancangan (design) menjadi kode program. Karena semua telah direncanakan dan dipikirkan sebelumnya, maka proses coding dapat dianggap sebagai sebuah pembuktian (test) bahwa rancangan yang dibuat sudah benar. Terkadang terdapat beberapa hal yang lolos dari perancangan dan baru terungkap saat coding; pada kasus tersebut, perubahan pada rancangan harus segera dilakukan sehingga kode program dan rancangan bisa tetap sinkron.
Bila pembuatan kode program tiba-tiba menjadi tidak terkendali (pada kasus skripsi, mahasiswa tiba-tiba merasa seolah otaknya hendak meledak dan jadi malas coding), maka ada beberapa kemungkinan:
Hasil rancangan tidak bagus.
Programmer tidak mengikuti hasil rancangan yang bagus dan mengerjakannya sesuka hatinya.
Programmer tidak diikutsertakan dalam proses perancangan
Mahasiswa tidak mau pikir panjang/hanya copy paste di bab analisa & perancangan, dalam pikirannya mau segera fokus ke bab implementasi dan kode program;
Mahasiswa hanya memikirkan bab analisa & perancangan, tidak mau peduli dampaknya pada saat membuat kode program nanti.

Node Webkit – Membangun Dekstop App menggunakan NodeJS. —