├── .gitignore ├── Changelogs.txt ├── Makefile ├── README.md ├── cloud-computing--nodejs.tex ├── components ├── AppendixA.tex ├── AppendixB.tex ├── abstract.tex ├── bab-01.tex ├── bab-02.tex ├── bab-03.tex ├── bab-04.tex ├── bab-05.tex ├── bab-06.tex ├── bab-07.tex ├── bab-08.tex ├── bibliographies.tex ├── cover.tex ├── renew.tex └── rgb.tex ├── images ├── 662px-Cloud_computing.png ├── appendixCommitHistory.png ├── bpdp-express-hello-update06.jpg ├── bpdp-hello-express-update.jpg ├── bpdp-hello-express.jpg ├── cc-by-sa.jpg ├── cf-signup-approved.jpg ├── cf-signup-hasil.jpg ├── cf-signup.jpg ├── hello-noframework.jpg ├── logo-akakom-emas.jpg ├── logo-light.png ├── modul1-hello-ganti-runtime.jpg ├── modul1-hello-no-framework.jpg ├── modul1-hello-update.jpg ├── modul1-hello.jpg ├── mongodb-web-interface.jpg ├── mvc-result.jpg ├── mvc.dia ├── mvc.jpg ├── npm-ls-paket-terinstall.jpg ├── npmls.jpg ├── npmls.png └── socket-io-expressjs.jpg ├── notes └── latex-tips └── src ├── README.md ├── bab-01 ├── hello-no-framework │ └── app.js ├── hello-vanilla │ ├── app.js │ ├── package.json │ ├── public │ │ └── stylesheets │ │ │ └── style.css │ ├── routes │ │ ├── index.js │ │ └── user.js │ └── views │ │ ├── index.jade │ │ └── layout.jade └── hello │ ├── app.js │ ├── package.json │ ├── public │ └── stylesheets │ │ └── style.css │ ├── routes │ ├── index.js │ └── user.js │ └── views │ ├── index.jade │ └── layout.jade ├── bab-02 ├── array.js ├── breakContinue.js ├── breakWithLabel.js ├── const.js ├── doWhile.js ├── dynamic.js ├── for.js ├── forIn.js ├── fungsiAnonim.js ├── fungsiRekursif.js ├── if.js ├── json.js ├── nested.js ├── readline.js ├── switch.js ├── throw.js ├── try.js └── while.js ├── bab-03 ├── closure.js ├── currying.js ├── hof.js ├── inheritance.js ├── lambda.js └── obyek.js ├── bab-05 ├── asynchronous-callback.js ├── edp │ ├── server-on-error.js │ └── server.js ├── pegawai.json └── synchronous.js ├── bab-06 ├── README.md ├── akses-mongodb.js ├── data │ └── mongod.lock └── web │ ├── app.js │ ├── package.json │ ├── public │ └── stylesheets │ │ └── style.css │ ├── routes │ ├── employee.js │ └── index.js │ └── views │ ├── employee.jade │ ├── index.jade │ └── layout.jade ├── bab-07 ├── app.js ├── controllers │ ├── index.js │ └── user.js ├── models │ └── db.js ├── package.json ├── public │ └── stylesheets │ │ └── style.css └── views │ ├── index.jade │ └── layout.jade ├── bab-08 ├── app.js ├── package.json ├── public │ ├── javascripts │ │ ├── WebSocketMain.swf │ │ ├── WebSocketMainInsecure.swf │ │ ├── socket.io.js │ │ └── socket.io.min.js │ └── stylesheets │ │ └── style.css ├── routes │ └── index.js └── views │ ├── index.jade │ └── layout.jade └── non-nodejs ├── appendix-b └── commit.log ├── bab-01 ├── delete-aplikasi-cf.txt ├── deploy-appjs-no-framework.txt ├── deploy-express-cf.txt ├── deploy-pilih-runtime-cf.txt ├── ekstraksi-nodejs.txt ├── express-buat-app.txt ├── express-help.txt ├── gem-terinstall.txt ├── hasil-download-nodejs.txt ├── instalasi-expressjs.txt ├── instalasi-vmc.txt ├── konfigurasi-var-lingkungan-nodejs.txt ├── peringatan-setting-path-vmc.txt ├── setting-path-vmc.txt ├── update-aplikasi-cf.txt ├── vmc-help.txt ├── vmc-login-info.txt ├── vmc-target-no-conf.txt ├── vmc-target-with-conf.txt └── vmc-ubah-password.txt ├── bab-02 ├── contoh-fungsi.txt ├── nodejs-repl-load.txt ├── nodejs-repl-save.txt ├── nodejs-repl.txt ├── pemanggilan-fungsi.txt └── sintaksis-fungsi.txt ├── bab-04 ├── npm-help.txt ├── npm-install.txt ├── npm-ls-paket-blm-terinstall.txt ├── npm-ls.txt ├── npm-search.txt ├── npm-uninstall.txt ├── npm-update.txt └── npm-view.txt ├── bab-06 ├── install-node-gyp.txt ├── install-paket-mongodb.txt ├── install-paket-mongojs.txt ├── mongodb-run.txt ├── mongodb-shell-session.txt ├── mongodb-shell.txt └── mongodb-stop.txt ├── bab-07 ├── express-dir-asli.txt └── express-dir-jadi-mvc.txt └── bab-08 ├── hasil-di-server.txt └── isi-dir-socket-io-client-dist.txt /.gitignore: -------------------------------------------------------------------------------- 1 | src/modul-6/data 2 | -------------------------------------------------------------------------------- /Changelogs.txt: -------------------------------------------------------------------------------- 1 | Changelogs - Catatan Perubahan 2 | ============================== 3 | 4 | + 6 Mei 2013: 5 | - Mengupdate isi sesuai dengan rilis software pada tanggal ini: 6 | + Node.js: 0.10.5 7 | + Express: 3.2.2 8 | + MongoDB: 2.4.4-pre- 9 | + Ruby: 2.0.0p0 10 | - Memperbaiki berbagai typo 11 | - Menata bab 1 dan 2, khususnya memisahkan eksekusi di layar ke dalam 12 | src/non-nodejs/ 13 | - Bab 3 - 8: memisahkan eksekusi di layar ke src/non-modejs/bab-0{3|8} 14 | - Reformat source code dan memastikan bisa dijalankan menggunakan 15 | versi-versi di atas. 16 | + 22 Maret 2013: 17 | - Memperbaharui buku, sesuai dengan versi terakhir dari software 18 | (Node.js 0.10.0 - npm 1.2.14 - mongodb 2.2.3 - express 3.1.0). 19 | + 7 Januari 2013: 20 | - Memperbaharui buku, sesuai dengan versi terakhir dari semua software 21 | yang dipakai pada tanggal ini. File PDF versi terbaru juga sudah 22 | diupload. Jika masih versi lama pada versi PDF-nya, silahkan tunggu 23 | setidaknya sampai jam 23.30 malam hari ini karena proses di Slideshare 24 | membutuhkan sekitar 30 menit untuk mengganti file. 25 | + 26 Desember 2012: 26 | - File .pdf tersedia. Jika anda tidak mempunyai LaTeX untuk memproses 27 | kode sumber LaTeX ini, silahkan langsung download PDF-nya di 28 | http://www.slideshare.net/bpdp/pengembangan-aplikasi-cloud-computing-menggunakan-nodejs). 29 | + 23 Desember 2012: 30 | - **buku selesai lengkap**. Edit hanya dilakukan jika ada errata 31 | (termasuk rilis versi baru dari software-software yang digunakan). 32 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | pdflatex cloud-computing--nodejs.tex 3 | makeindex cloud-computing--nodejs.idx 4 | pdflatex cloud-computing--nodejs.tex 5 | 6 | clean-all: 7 | rm -rf *.aux; rm *.pdf; rm -rf *.lof; rm -rf *.log; rm -rf *.toc; rm -rf *.lol; rm -rf *.idx; rm -rf *.out; rm -rf *.lot; rm -rf *.tex~; rm -rf *.ind; rm -rf *.ilg; rm -rf components/*.tex~ 8 | 9 | clean-without-pdf: 10 | rm -rf *.aux; rm -rf *.lof; rm -rf *.log; rm -rf *.toc; rm -rf *.lol; rm -rf *.idx; rm -rf *.out; rm -rf *.lot; rm -rf *.tex~; rm -rf *.ind; rm -rf *.ilg; rm -rf components/*.tex~ 11 | 12 | view: 13 | epdfview cloud-computing--nodejs.pdf 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Selamat datang! 2 | =============== 3 | 4 | Repo ini merupakan kode sumber dari buku bebas untuk workshop **Pengambangan Aplikasi Cloud Menggunakan Node.js**. Pada awalnya saya merancang dan menulis buku ini untuk keperluan internal pelatihan Cloud Computing di [STMIK AKAKOM Yogyakarta](http://www.akakom.ac.id), tapi kemudian saya putuskan untuk memberi lisensi [CC-BY-SA](http://freedomdefined.org/Licenses/CC-BY-SA) pada buku ini untuk mempromosikan kultur kebebasan berkarya yang positif dan meningkatkan aksesibilitas informasi / pengetahuan bagi rakyat Indonesia. 5 | 6 | Buku ini saya buat dengan menggunakan [LaTeX](http://www.latex-project.org) pada platform [Linux](http://www.linux.org/). Paket yang saya gunakan untuk membuat buku ini adalah [koma-script](http://www.ctan.org/pkg/koma-script). LaTeX dan koma-script sudah terinstall secara otomatis jika anda menginstall TexLive di [Arch Linux](http://www.archlinux.org). 7 | 8 | Jika anda mempunyai LaTeX, koma-script, dan "make", ada 3 perintah yang sudah saya definisikan: 9 | * make: membuat file PDF 10 | * make clean-without-pdf: membersihkan berbagai file yang tidak diperlukan lagi (file PDF tetap tidak dihapus) 11 | * make clean-all: membersihkan semua file yang tidak diperlukan 12 | * make view: menampilkan file PDF hasil proses menggunakan "epdfview" (jika anda menggunakan PDF viewer lain, misalnya xpdf, Adobe Acrobat Reader, evince, dll, silahkan diganti isi **Makefile** sesuai dengan nama command-line executable-nya). 13 | 14 | Changelogs 15 | ========== 16 | 17 | Lihat di file [Changelogs.txt](Changelogs.txt). 18 | 19 | Versi PDF 20 | ========= 21 | 22 | Versi PDF dari buku ini bisa diperoleh di [SlideShare](http://www.slideshare.net/bpdp/pengembangan-aplikasi-cloud-computing-menggunakan-nodejs). 23 | 24 | Penulis 25 | ======= 26 | 27 | Buku ini ditulis oleh Bambang Purnomosidi D. P. Info tentang saya bisa diperoleh di [situs pribadi saya](http://bpdp.name). Saat ini saya menjadi dosen di [STMIK AKAKOM](http://www.akakom.ac.id) dan kandidat doktor di [Jurusan Teknik Elektro dan Teknologi Informasi - JTETI, UGM](http://pasca.te.ugm.ac.id). 28 | 29 | Kontributor: 30 | * [Aji Kisworo Mukti](http://adzymaniac.web.id) 31 | 32 | Saya bisa dihubungi melalui: 33 | 34 | * **Twitter:** [@bpdp](http://twitter.com/#!/bpdp) 35 | * **Facebook:** [/bambangpdp](http://www.facebook.com/bambangpdp) 36 | 37 | [](http://wiki.creativecommons.org/Licenses/by-sa/3.0LegalText_(Indonesian\)) 38 | -------------------------------------------------------------------------------- /cloud-computing--nodejs.tex: -------------------------------------------------------------------------------- 1 | %\documentclass[a4paper,11pt,twocolumn]{article} 2 | \documentclass{scrreprt} 3 | \usepackage{url} 4 | \usepackage{listings} 5 | \usepackage{appendix} 6 | \usepackage{amssymb} 7 | \usepackage{pifont} 8 | \usepackage{makeidx} 9 | \usepackage{fancybox} 10 | \makeindex 11 | 12 | \usepackage[usenames,dvipsnames]{color} 13 | \usepackage[T1]{fontenc} 14 | \usepackage{wrapfig} 15 | \usepackage[pdftex]{graphicx} 16 | \usepackage{setspace} 17 | 18 | \usepackage[Sonny]{fncychap} 19 | %\usepackage[Bjornstrup]{fncychap} 20 | 21 | \usepackage[automark]{scrpage2} 22 | 23 | \usepackage{hyperref} 24 | \usepackage{xcolor} 25 | 26 | \hypersetup{ 27 | colorlinks, linkcolor={BlueViolet}, 28 | citecolor={BrickRed}, urlcolor={NavyBlue} 29 | } 30 | 31 | 32 | \definecolor{lightgray}{rgb}{.9,.9,.9} 33 | \definecolor{darkgray}{rgb}{.4,.4,.4} 34 | \definecolor{purple}{rgb}{0.65, 0.12, 0.82} 35 | 36 | \lstdefinelanguage{JavaScript}{ 37 | keywords={typeof, new, true, false, catch, function, return, null, catch, switch, var, if, in, while, do, else, case, break}, 38 | keywordstyle=\color{blue}\bfseries, 39 | ndkeywords={class, export, boolean, throw, implements, import, this}, 40 | ndkeywordstyle=\color{darkgray}\bfseries, 41 | identifierstyle=\color{black}, 42 | sensitive=false, 43 | comment=[l]{//}, 44 | morecomment=[s]{/*}{*/}, 45 | commentstyle=\color{purple}\ttfamily, 46 | stringstyle=\color{red}\ttfamily, 47 | morestring=[b]', 48 | morestring=[b]" 49 | } 50 | 51 | 52 | \usepackage{colortbl} 53 | 54 | \input{./components/rgb.tex} 55 | \input{./components/renew.tex} 56 | 57 | \setcounter{tocdepth}{5} 58 | 59 | \begin{document} 60 | 61 | \pagenumbering{roman} 62 | 63 | \pagestyle{scrheadings} 64 | \setheadsepline{.4pt} 65 | \clearscrheadings 66 | \automark[section]{chapter} 67 | \ihead{\headmark} 68 | \ohead{\pagemark} 69 | \cfoot{} 70 | 71 | \KOMAoptions{abstract=on} 72 | % \KOMAoptions{bibliography=openstyle} 73 | 74 | \definecolor{light-gray}{gray}{0.95} 75 | \lstset{numbers=left,basicstyle=\scriptsize,numberstyle=\scriptsize,frame=tb,captionpos=b,backgroundcolor=\color{light-gray},showspaces=false,showstringspaces=false} 76 | 77 | \input{./components/cover.tex} 78 | \input{./components/abstract.tex} 79 | 80 | \tableofcontents 81 | 82 | \listoffigures 83 | \addcontentsline{toc}{chapter}{\numberline{}Daftar Gambar} 84 | 85 | \lstlistoflistings 86 | \addcontentsline{toc}{chapter}{\numberline{}Listing Program} 87 | 88 | \listoftables 89 | \addcontentsline{toc}{chapter}{\numberline{}Daftar Tabel} 90 | 91 | \newpage 92 | 93 | \pagenumbering{arabic} 94 | \setcounter{page}{1} 95 | 96 | \input{./components/bab-01.tex} 97 | \input{./components/bab-02.tex} 98 | \input{./components/bab-03.tex} 99 | \input{./components/bab-04.tex} 100 | \input{./components/bab-05.tex} 101 | \input{./components/bab-06.tex} 102 | \input{./components/bab-07.tex} 103 | \input{./components/bab-08.tex} 104 | \input{./components/bibliographies.tex} 105 | 106 | \appendix 107 | \appendixpage 108 | \addappheadtotoc 109 | 110 | \begin{appendices} 111 | 112 | \input{./components/AppendixA.tex} 113 | \input{./components/AppendixB.tex} 114 | \addcontentsline{toc}{chapter}{Indeks} 115 | \printindex 116 | \end{appendices} 117 | 118 | \end{document} 119 | -------------------------------------------------------------------------------- /components/AppendixA.tex: -------------------------------------------------------------------------------- 1 | \chapter{Gaya Penulisan Kode / \textit{Coding Style}} 2 | 3 | \section{Tentang Gaya Penulisan Kode} 4 | 5 | Pada saat seseorang berada pada proses pembuatan kode sumber (\textit{coding}), apapun gaya penulisan programnya, tidak akan bermasalah jika program itu hanya dia buat untuk si pemrogram itu sendiri. Meski demikian, hal tersebut jarang terjadi karena biasanya selalu ada kerja kelompok atau setidaknya program tersebut akan digunakan oleh pihak lain yang suatu saat perlu memahami apa yang tertulis di kode sumber tersebut. Untuk keperluan itu, biasanya diperlukan suatu gaya penulisan kode. Saat ini banyak sekali gaya penulisan kode untuk JavaScript / Node.js, biasanya tergantung pada kesepakatan anggota-anggota dalam kelompok pengembang dan berdasarkan pada pengalaman mereka tersebut. Pada lampiran ini, gaya penulisan kode dari NPM akan dituliskan secara utuh (dalam bahasa aslinya dengan harapan bisa bermanfaat untuk penyeragaman dan kemudahan membaca atau menelusuri \textit{bugs/errors}). Gaya penulisan kode ini diambil dari \url{https://npmjs.org/doc/coding-style.html}. 6 | 7 | \section{npm's Coding Style} 8 | 9 | npm's "funny" coding style 10 | 11 | \subsection{DESCRIPTION} 12 | npm's coding style is a bit unconventional. It is not different for difference's sake, but rather a carefully crafted style that is designed to reduce visual clutter and make bugs more apparent. 13 | 14 | If you want to contribute to npm (which is very encouraged), you should make your code conform to npm's style. 15 | 16 | \subsection{Line Length} 17 | Keep lines shorter than 80 characters. It's better for lines to be too short than to be too long. Break up long lists, objects, and other statements onto multiple lines. 18 | 19 | \subsection{Indentation} 20 | Two-spaces. Tabs are better, but they look like hell in web browsers (and on github), and node uses 2 spaces, so that's that. 21 | 22 | Configure your editor appropriately. 23 | 24 | \subsection{Curly braces} 25 | 26 | Curly braces belong on the same line as the thing that necessitates them. Bad: 27 | 28 | \lstset{language=Javascript,caption=Bad curly braces placement - 1} 29 | \begin{lstlisting} 30 | function () 31 | { 32 | \end{lstlisting} 33 | 34 | Good: 35 | 36 | \lstset{language=Javascript,caption=Good curly braces placement - 1} 37 | \begin{lstlisting} 38 | function () { 39 | \end{lstlisting} 40 | 41 | If a block needs to wrap to the next line, use a curly brace. Don't use it if it doesn't. Bad: 42 | 43 | \lstset{language=Javascript,caption=Bad curly braces placement - 2} 44 | \begin{lstlisting} 45 | if (foo) { bar() } 46 | while (foo) 47 | bar() 48 | \end{lstlisting} 49 | 50 | Good: 51 | 52 | \lstset{language=Javascript,caption=Good curly braces placement - 2} 53 | \begin{lstlisting} 54 | if (foo) bar() 55 | while (foo) { 56 | bar() 57 | } 58 | \end{lstlisting} 59 | 60 | \subsection{Semicolons} 61 | 62 | Don't use them except in four situations: 63 | 64 | \begin{itemize} 65 | \item \textbf{for (;;) loops}. They're actually required. 66 | \item null loops like: \textbf{while (something) ;} (But you'd better have a good reason for doing that.) 67 | \item \textbf{case "foo": doSomething(); break} 68 | \item In front of a leading \textbf{(} or \textbf{[} at the start of the line. This prevents the expression from being interpreted as a function call or property access, respectively. 69 | \end{itemize} 70 | 71 | Some examples of good semicolon usage: 72 | 73 | \lstset{language=Javascript,caption=Good semicolon usage} 74 | \begin{lstlisting} 75 | ;(x || y).doSomething() 76 | ;[a, b, c].forEach(doSomething) 77 | for (var i = 0; i < 10; i ++) { 78 | switch (state) { 79 | case "begin": start(); continue 80 | case "end": finish(); break 81 | default: throw new Error("unknown state") 82 | } 83 | end() 84 | } 85 | \end{lstlisting} 86 | 87 | Note that starting lines with - and + also should be prefixed with a semicolon, but this is much less common. 88 | 89 | \subsection{Comma First} 90 | 91 | If there is a list of things separated by commas, and it wraps across multiple lines, put the comma at the start of the next line, directly below the token that starts the list. Put the final token in the list on a line by itself. For example: 92 | 93 | \lstset{language=Javascript,caption=Comma first} 94 | \begin{lstlisting} 95 | var magicWords = [ "abracadabra" 96 | , "gesundheit" 97 | , "ventrilo" 98 | ] 99 | , spells = { "fireball" : function () { setOnFire() } 100 | , "water" : function () { putOut() } 101 | } 102 | , a = 1 103 | , b = "abc" 104 | , etc 105 | , somethingElse 106 | \end{lstlisting} 107 | 108 | \subsection{Whitespace} 109 | 110 | Put a single space in front of ( for anything other than a function call. Also use a single space wherever it makes things more readable. 111 | 112 | Don't leave trailing whitespace at the end of lines. Don't indent empty lines. Don't use more spaces than are helpful. 113 | 114 | \subsection{Functions} 115 | 116 | Use named functions. They make stack traces a lot easier to read. 117 | 118 | \subsection{Callbacks, Sync/async Style} 119 | 120 | Use the asynchronous/non-blocking versions of things as much as possible. It might make more sense for npm to use the synchronous fs APIs, but this way, the fs and http and child process stuff all uses the same callback-passing methodology. 121 | 122 | The callback should always be the last argument in the list. Its first argument is the Error or null. 123 | 124 | Be very careful never to ever ever throw anything. It's worse than useless. Just send the error message back as the first argument to the callback. 125 | 126 | \subsection{Errors} 127 | 128 | Always create a new Error object with your message. Don't just return a string message to the callback. Stack traces are handy. 129 | 130 | \subsection{Logging} 131 | 132 | Logging is done using the npmlog utility. 133 | 134 | Please clean up logs when they are no longer helpful. In particular, logging the same object over and over again is not helpful. Logs should report what's happening so that it's easier to track down where a fault occurs. 135 | 136 | Use appropriate log levels. See config(1) and search for "loglevel". 137 | 138 | \subsection{Case, naming, etc.} 139 | 140 | \begin{itemize} 141 | \item Use \textbf{lowerCamelCase} for multiword identifiers when they refer to objects, functions, methods, members, or anything not specified in this section. 142 | \item Use \textbf{UpperCamelCase} for class names (things that you'd pass to "new"). 143 | \item Use \textbf{all-lower-hyphen-css-case} for multiword filenames and config keys. 144 | \item Use named functions. They make stack traces easier to follow. 145 | \item Use \textbf{CAPS\_SNAKE\_CASE} for constants, things that should never change and are rarely used. 146 | \item Use a single uppercase letter for function names where the function would normally be anonymous, but needs to call itself recursively. It makes it clear that it's a "throwaway" function. 147 | \end{itemize} 148 | 149 | \subsection{null, undefined, false, 0} 150 | 151 | \begin{itemize} 152 | \item Boolean variables and functions should always be either \textbf{true} or \textbf{false}. Don't set it to 0 unless it's supposed to be a number. 153 | \item When something is intentionally missing or removed, set it to \textbf{null}. 154 | \item Don't set things to \textbf{undefined}. Reserve that value to mean "not yet set to anything." 155 | \item Boolean objects are verboten. 156 | \end{itemize} 157 | 158 | \vspace{10mm} 159 | \hrule 160 | \vspace{10mm} 161 | 162 | Selain gaya penulisan kode dari NPM ini, ada beberapa lagi lainnya yang bisa dilihat, antara lain: 163 | 164 | \begin{itemize} 165 | \item Spludo \url{http://spludo.com/source/coding-standards/} 166 | \item Google JavaScript Style Guide (\url{http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml}) 167 | \item Felix's Node.js Style Guide (\url{http://nodeguide.com/style.html}) 168 | \end{itemize} 169 | -------------------------------------------------------------------------------- /components/AppendixB.tex: -------------------------------------------------------------------------------- 1 | \chapter{\textit{Commit History} dari Penulis Utama dan Kontributor} 2 | 3 | Buku ini merupakan hasil karya bersama dari beberapa penulis. Peran masing-masing penulis bisa dilihat pada bagian ringkasan dari sejarah \textit{commit}. Penulis utama adalah saya (Bambang Purnomosidi D. P), sementara pada bab 5 ada kontribusi dari Aji Kisworo Mukti. Hasil log dari git menunjukkan peran masing-masing penulis (\textit{git shortlog}): 4 | 5 | \lstset{language=Bash,caption=\textit{Commit history}} 6 | \lstinputlisting{src/non-nodejs/appendix-b/commit.log} 7 | -------------------------------------------------------------------------------- /components/abstract.tex: -------------------------------------------------------------------------------- 1 | \begin{abstract} 2 | \thispagestyle{plain} 3 | \setcounter{page}{1} 4 | \addcontentsline{toc}{chapter}{\numberline{}Kata Pengantar} 5 | 6 | Buku bebas ini merupakan buku yang dirancang untuk keperluan memberikan pengetahuan mendasar pengembangan aplikasi berbasis Cloud Computing, khususnya menggunakan Node.js. Pada buku ini akan dibahas penggunaan Node.js untuk mengembangkan aplikasi SaaS (\textit{Software as a Service}). Node.js merupakan software di sisi server yang dikembangkan dari \textit{engine} JavaScript V8 dari Google serta \textbf{libuv} (\url{https://github.com/joyent/libuv})\footnote{Versi sebelum 0.9.0 menggunakan \textbf{libev} dari Mark Lechmann}. 7 | 8 | Jika selama ini kebanyakan orang mengenal JavaScript hanya di sisi klien (browser), dengan Node.js ini, pemrogram bisa menggunakan JavaScript di sisi server. Meskipun ini bukan hal baru, tetapi paradigma pemrograman yang dibawa oleh Node.js dengan \textit{evented - asynchronous I/O} menarik dalam pengembangan aplikasi Web (selain kita hanya perlu menggunakan 1 bahasa yang sama di sisi server maupun di sisi klien). 9 | 10 | Untuk mengikuti materi yang ada pada buku ini, pembaca diharapkan menyiapkan peranti komputer dengan beberapa software berikut terpasang: 11 | \begin{itemize} 12 | \item Sistem operasi Linux (distribusi apa saja) - lihat di \url{http://www.distrowatch.com}. Sistem operasi Linux ini bukan keharusan, anda bisa menggunakan Windows tetapi silahkan membuat penyesuaian-penyesuaian sendiri yang diperlukan. Kirimi saya \textit{pull request} jika anda menuliskan pengalaman anda di Windows! 13 | \item Git (untuk \textit{version control system}) - bisa diperoleh di \url{http://git-scm.com}. Saya menggunakan versi 1.8.2.2. 14 | \item Ruby (\url{http://www.ruby-lang.org/en/}) - diperlukan untuk menginstall dan mengeksekusi \textit{vmc}, perintah \textit{command line} untuk mengelola aplikasi Cloud di CloudFoundry. Versi Ruby yang digunakan adalah versi 2.0.0p0 (2013-02-24 revision 39474). 15 | \item mongoDB (basis data NOSQL) - bisa diperoleh di \url{http://www.mongodb.org}, saya menggunakan versi 2.4.4-pre- 16 | \item Vim (untuk mengedit source code) - bisa diperoleh di \url{http://www.vim.org}. Jika tidak terbiasa menggunakan Vim, bisa menggunakan editor teks lainnya (atau IDE), misalnya gedit (ada di GNOME), geany (\url{http://geany.org}), KATE (ada di KDE), dan lain-lain. 17 | \end{itemize} 18 | 19 | Software utama untuk keperluan workshop ini yaitu Node.js serta command line tools dari provider Cloud Computing (materi ini menggunakan fasilitas dari CloudFoundry), akan dibahas pada pada bab-bab tertentu. Materi akan lebih banyak berorientasi ke command line / shell sehingga para pembaca sebaiknya sudah memahami cara-cara menggunakan shell di Linux. Anda bisa menggunakan shell apa saja (bash, tcsh, zsh, ksh, dan lain-lain), saya menggunakan bash 4.2.45(2)-release. 20 | 21 | Have fun! 22 | \end{abstract} 23 | -------------------------------------------------------------------------------- /components/bab-01.tex: -------------------------------------------------------------------------------- 1 | \chapter{Pengenalan Cloud Computing dan Infrastruktur Pengembangan Aplikasi Berbasis Node.js} 2 | 3 | \section{Apa itu Cloud Computing?} 4 | 5 | Cloud Computing, \index{Cloud Computing} atau sering diterjemahkan sebagai ``Komputasi Awan'' dalam bahasa Indonesia mempunyai berbagai definisi:\index{Cloud Computing!Definisi} 6 | \begin{itemize} 7 | \item \textbf{Wikipedia}: penggunaan sumber daya komputasi (peranti keras dan peranti lunak) yang berfungsi untuk memberikan layanan melalui suatu jaringan (pada umumnya Internet)\footnote{\url{http://en.wikipedia.org/wiki/Cloud_computing}}. 8 | \item \textbf{NIST\footnote{The National Institute of Standards and Technology}}: model yang memungkinkan akses jaringan ubiquitous (dari mana saja), nyaman, on-demand (saat ada permintaan) ke sekumpulan sumber daya komputasi yang dikonfigurasi untuk berbagi (jaringan, server, penyimpanan, dan berbagai layanan lain) yang dapat dengan cepat ditetapkan dan dirilis dengan usaha yang minimal dari manajemen ataupun interaksi dengan penyedia layanan\footnote{\url{http://csrc.nist.gov/publications/PubsSPs.html\#800-145}}. 9 | \end{itemize} 10 | 11 | Jika diwujudkan secara visual, Cloud Computing bisa dilihat pada Gambar~\ref{fig:ccsam}\footnote{Gambar dibuat oleh Sam Johnston, diambil dari \url{http://en.wikipedia.org/w/index.php?title=File:Cloud_computing.svg&page=1}} 12 | 13 | \begin{figure}[t] 14 | \begin{center} 15 | \includegraphics[scale=0.5]{images/662px-Cloud_computing.png} 16 | \end{center} 17 | \caption{Model Cloud Computing} 18 | \label{fig:ccsam} 19 | \end{figure} 20 | 21 | \section{Karakteristik Cloud Computing} 22 | 23 | Menurut NIST, ada beberapa karakteristik dari Cloud Computing:\index{Cloud Computing!Karakteristik} 24 | \begin{itemize} 25 | \item \textbf{On-demand self-service}: layanan bisa diperoleh pada saat diminta, tanpa intervensi atau interaksi manusia di sisi penyedia jasa. 26 | \item \textbf{Broad network access}: tersedia melalui jaringan dengan berbagai peranti yang umum (komputer, tablet, HP, dan lain-lain) 27 | \item \textbf{Resource pooling}: sumber daya komputasi dari penyedia jasa terkumpul untuk melayani. 28 | \item \textbf{Rapid elasticity}: skalabilitas. 29 | \item \textbf{Measured service}: penggunaan sumber daya bisa diukur, di-monitor, dikendalikan, dan dilaporkan. 30 | \end{itemize} 31 | 32 | Karakteristik lain yang tidak kalah penting adalah \textit{multitenancy}. \textit{Multitenancy} merupakan suatu prinsip dalam arsitektur software. Pada arsitektur tersebut, satu instan dari software berjalan pada server, melayani banyak organisasi klien. Aplikasi dirancang untuk mempartisi data dan konfigurasinya secara virtual dan setiap organisasi klien tersebut bekerja dengan instan aplikasi virtual tersebut\footnote{\url{http://en.wikipedia.org/wiki/Multitenancy}}. \index{Multitenancy} 33 | 34 | \section{\textit{Public} dan \textit{Private} Cloud Computing} 35 | 36 | \index{Cloud Computing!Private}Cloud Computing bisa dibangun untuk keperluan pribadi suatu organisasi dan (secara legal) hanya bisa diakses oleh organisasi yang bersangkutan. Tipe tersebut dikenal dengan \textit{Private Cloud Computing}. \index{Cloud Computing!Public}Sementara itu, jika sumber daya Cloud Computing bisa diakses oleh publik (dengan hak akses yang sesuai), maka model tersebut dikenal sebagai \textit{Public Cloud Computing}. Pembahasan di buku ini adalah pembahasan tentang \textit{Public Cloud Computing} dan semua referensi tentang Cloud Computing di buku ini akan menunjuk pada \textit{Public Cloud Computing} kecuali dinyatakan lain. 37 | 38 | \section{Model Layanan Cloud Computing} 39 | 40 | \index{Cloud Computing!Model layanan}Model layanan pada Cloud Computing akan berkembang sesuai kebutuhan konsumen serta inovasi dari berbagai penyedia layanan. Saat ini, pada umumnya, ada tiga model layanan: 41 | \begin{itemize} 42 | \item \textbf{SaaS} (\textit{Software as a Service}): layanan berupa aplikasi yang ditempatkan pada infrastruktur penyedia layanan, siap digunakan oleh konsumen. 43 | \item \textbf{PaaS} (\textit{Platform as a Service}): menyediakan layanan ke konsumen berupa platform untuk men-deploy aplikasi. 44 | \item \textbf{IaaS} (\textit{Infrastructure as a Service}): menyediakan layanan ke konsumen berupa berbagai sumber daya komputasi (pemrosesam, penyimpanan, jaringan, dan sumber daya fundamental lainnya). 45 | \end{itemize} 46 | 47 | Meski sampai saat ini, umumnya terdapat tiga model tersebut, beberapa model kelihatannya sudah mulai muncul, misalnya STaaS (\textit{Storage as a Service}), SECaaS (\textit{Security as a Service}), DaaS (\textit{Data as a Service}), TEaaS (\textit{Test Environment as a Service}), \textit{Desktop Virtualization}, APIaaS (\textit{API as a Service}). 48 | 49 | \section{Pengembangan Aplikasi di Cloud Computing} 50 | 51 | Pada umumnya, para pengembang aplikasi di Cloud Computing juga menggunakan pendekatan \textit{Agile Software Development} yang berbasis pada pengembangan secara iteratif untuk setiap \textit{milestone} (dalam iterasi analisis-desain-\textit{coding-testing-debugging}) mulai dari \textit{milestone} paling awal sampai software dirilis. Perbedaan paling mendasar hanyalah pada platform yang digunakan untuk \textit{deployment}, peranti pengembangan yang digunakan, serta utilitas untuk mengelola aplikasi yang di-\textit{deploy} pada instan di cloud. 52 | 53 | Pengembangan aplikasi di Cloud Computing akan melibatkan peranti pengembang yang didukung oleh infrastruktur Cloud. Kita akan memerlukan PaaS untuk keperluan ini. Pada dasarnya pengembangan aplikasi akan meliputi siklus berikut: 54 | 55 | \begin{itemize} 56 | \item \textit{Coding} 57 | \item Test di komputer lokal 58 | \item Upload ke server (dalam Cloud Computing, proses ini diistilahkan dengan ``\textit{push}'' 59 | \item Edit - push 60 | \end{itemize} 61 | 62 | Jika pengembangan aplikasi dilakukan oleh tim, maka perlu adanya software untuk \textit{version control}, misalnya Git, mercurial, dan lain-lain. Setelah itu, aktivitas yang dilakukan biasanya terpusat pada \textit{push} (untuk mengupload instan dari aplikasi ke server) dan \textit{pull} (untuk mengambil instan aplikasi dari server). 63 | 64 | \section{Node.js dan Cloud Computing} 65 | 66 | \index{Node.js}Node.js merupakan salah satu peranti pengembang yang bisa digunakan untuk membuat aplikasi berbasis Cloud. Node.js dikembangkan dari \textit{engine} JavaScript yang dibuat oleh Google untuk browser \textit{Chrome / Chromium} (V8) ditambah dengan libUV serta beberapa pustaka internal lainnya. Dengan menggunakan Node.js, semua pengembangan akan dilakukan menggunakan JavaScript, baik pada sisi klien maupun server. Node.js dibuat pertama kali oleh Ryan Dahl (twitter.com/ryah) dan sampai saat ini dikembangkan oleh komunitas sebagai software bebas dengan pendanaan utama dari Joyent, perusahaan tempat Ryan Dahl bekerja. 67 | 68 | \section{Layanan Hosting Aplikasi: CloudFoundry} 69 | 70 | \index{CloudFoundry}Saat ini, mulai banyak penyedia layanan Cloud yang mendukung Node.js, diantaranya adalah CloudFoundry (\url{http://www.cloudfoundry.com}, selanjutnya akan kita sebut dengan CF). Buku ini akan menggunakan fasilitas dari CF. Daftar lengkap dari penyedia infrastruktur Node.js bisa dilihat pada \url{https://github.com/joyent/node/wiki/Node-Hosting}.\index{Node.js!Hosting} 71 | 72 | \subsection{Pendaftaran} 73 | 74 | Untuk menggunakan fasilitas dari CF, kita akan mendaftar lebih dahulu di URL \url{https://my.cloudfoundry.com/signup} sepert yang terlihat pada Gambar~\ref{fig:cfsignup}. 75 | 76 | \begin{figure}[t] 77 | \begin{center} 78 | \includegraphics[scale=0.5]{images/cf-signup.jpg} 79 | \end{center} 80 | \caption{Pendaftaran di CF} 81 | \label{fig:cfsignup} 82 | \end{figure} 83 | 84 | Setelah itu, CF akan mengirimkan pemberitahuan bahwa proses pendaftaran selesai seperti di Gambar~\ref{fig:cfsignuphasil}. \textit{Credentials} atau informasi tentang akun kita di CF akan dikirimkan ke e-mail kita seperti pada Gambar~\ref{fig:cfsignupapproved}. 85 | 86 | \begin{figure} 87 | \begin{center} 88 | \includegraphics[scale=0.5]{images/cf-signup-hasil.jpg} 89 | \end{center} 90 | \caption{Hasil proses pendaftaran di CF} 91 | \label{fig:cfsignuphasil} 92 | \end{figure} 93 | 94 | \begin{figure}[t] 95 | \begin{center} 96 | \includegraphics[scale=0.5]{images/cf-signup-approved.jpg} 97 | \end{center} 98 | \caption{E-mail persetujuan dan pemberitahuan \textit{credentials}} 99 | \label{fig:cfsignupapproved} 100 | \end{figure} 101 | 102 | \subsection{Instalasi \textit{Command Line Utilities}} 103 | 104 | \index{CloudFoundry!vmc}\textit{Command Line Utilities / CLU)} adalah software yang dijalankan melalui shell / \textit{command line / command prompt}. CLU untuk CF ini dibuat dengan menggunakan Ruby dan didistribusikan dalam bentuk \textit{gem} sehingga untuk instalasi ini diperlukan ruby dan rubygem. Berikut adalah perintah untuk instalasi vmc (CLU dari CF). 105 | 106 | \lstset{language=bash,caption=Instalasi vmc} 107 | \lstinputlisting{src/non-nodejs/bab-01/instalasi-vmc.txt} 108 | 109 | Pesan peringatan berikut ini: 110 | 111 | \lstset{language=bash,caption=Peringatan setting PATH untuk vmc} 112 | \lstinputlisting{src/non-nodejs/bab-01/peringatan-setting-path-vmc.txt} 113 | 114 | terjadi karena path untuk \textit{executable script} Ruby yang diinstall oleh vmc belum ditambahkan ke variabel lingkungan PATH. Edit file \$HOME/.bashrc dan tambahkan baris berikut\footnote{Catatan: "/home/bpdp/" adalah direktori \$HOME saya, silahkan sesuaikan dengan tempat anda}: 115 | \lstset{language=bash,caption=Peringatan setting PATH untuk vmc} 116 | \lstinputlisting{src/non-nodejs/bab-01/setting-path-vmc.txt} 117 | 118 | Setelah itu, ketikkan di shell prompt Bash: \textit{source \~/.bashrc}\footnote{Ini hanya untuk keperluan saat ini saja, setelah ini tidak perlu lagi karena setiap login sudah akan dibaca oleh Bash}. 119 | 120 | Hasil dari instalasi vmc adalah sebagai berikut: 121 | 122 | \lstset{language=bash,caption=Hasil gem yang terinstall} 123 | \lstinputlisting{src/non-nodejs/bab-01/gem-terinstall.txt} 124 | 125 | Periksa dengan menjalankan opsi help dari vmc: 126 | 127 | \lstset{language=bash,caption=Hasil opsi help dari vmc} 128 | \lstinputlisting{src/non-nodejs/bab-01/vmc-help.txt} 129 | 130 | \subsection{Konfigurasi di Server Cloud} 131 | 132 | Pada dasarnya, yang diperlukan hanyalah mengubah target ke server cloud dari CF dan kemudian mengubah password. 133 | 134 | \lstset{language=bash,caption=Mengubah target server - belum ada konfigurasi} 135 | \lstinputlisting{src/non-nodejs/bab-01/vmc-target-no-conf.txt} 136 | 137 | Error di atas terjadi karena file konfigurasi belum dibuat. File konfigurasi tersimpan di direktori \$HOME/.vmc. Mengubah target dilakukan dengan membuat file \textit{target} di direktori tersebut. Isi dari file target tersebut adalah server CloudFoundry, yaitu \textit{https://api.cloudfoundry.com}. Setelah itu, jika dieksekusi lagi, hasilnya adalah sebagai berikut: 138 | 139 | \lstset{language=bash,caption=Mengubah target server - setelah konfigurasi} 140 | \lstinputlisting{src/non-nodejs/bab-01/vmc-target-with-conf.txt} 141 | 142 | Setelah itu, setiap kali kita akan melakukan berbagai proses yang melibatkan server ini, kita harus melakukan proses login terlebih dahulu: 143 | 144 | \lstset{language=bash,caption=Login ke server} 145 | \lstinputlisting{src/non-nodejs/bab-01/vmc-login-info.txt} 146 | 147 | Untuk mengubah password: 148 | 149 | \lstset{language=bash,caption=Mengubah password server} 150 | \lstinputlisting{src/non-nodejs/bab-01/vmc-ubah-password.txt} 151 | 152 | \subsection{Instalasi dan Konfigurasi Node.js di Komputer Lokal} 153 | 154 | Node.js tersedia untuk Linux, Windows, Mac OS X, serta SunOS. Untuk versi Linux, kebanyakan distro sudah menyertakan paket Node.js, hanya saja ada banyak versi dari Node.js dan jika kita menggunakan manajemen paket dari distro Linux, kita hanya bisa menginstall 1 versi saja. Sebagai contoh, di Arch Linux, paket Node.js bisa diinstall dengan perintah ``pacman -S nodejs'' tetapi hanya pada versi resmi di repo Arch Linux (versi 0.10.5 pada tanggal 6 Mei 2013). 155 | 156 | Langkah instalasi berikut ini adalah langkah untuk instalasi tanpa manajemen paket dari distro Linux. 157 | \begin{itemize} 158 | \item Ambil paket \textit{binary executable} dari \url{http://nodejs/download} atau langsung ke \url{http://nodejs.org/dist/}. Versi yang digunakan disini adalah 0.10.5. Download file tersebut, kemudian simpan di direktori tertentu (terserah anda, dibuku ini diletakkan di \$HOME/master/nodejs). 159 | 160 | \lstset{language=bash,caption=Hasil dari download Node.js} 161 | \lstinputlisting{src/non-nodejs/bab-01/hasil-download-nodejs.txt} 162 | 163 | \item Ekstrak ke direktori yang diinginkan. Node.js akan diinstall di direktori \$HOME/software: 164 | 165 | \lstset{language=bash,caption=Ekstraksi Node.js} 166 | \lstinputlisting{src/non-nodejs/bab-01/ekstraksi-nodejs.txt} 167 | 168 | \item Konfigurasi variabel lingkungan. Sebaiknya disimpan pada suatu file (pada buku ini, konfigurasi akan disimpan di \textit{\$HOME/environment/nodejs}): 169 | 170 | \lstset{language=bash,caption=Konfigurasi variabel lingkungan Node.js} 171 | \lstinputlisting{src/non-nodejs/bab-01/konfigurasi-var-lingkungan-nodejs.txt} 172 | 173 | \item Setiap akan menggunakan Node.js, yang diperlukan adalah men-source file konfigurasi tersebut: \textbf{source \~/environment/nodejs}. 174 | \end{itemize} 175 | 176 | \section{Pengelolaan Aplikasi di Cloud} 177 | 178 | Aplikasi yang dibuat nantinya akan di-deploy ke server CF. Pada umumnya, developer akan melakukan proses untuk upload (\textit{push}), menghapus (\textit{delete}), serta memperbaharui (\textit{update}) aplikasi di server. Jika belum memahami sintaksis JavaScript serta penggunaan npm, jangan kuatir. Tujuan dari bab ini hanya mengenalkan pengelolaan aplikasi di Cloud. Aspek lainnya akan dibahas di bab-bab berikutnya. 179 | 180 | \subsection{\textit{Push, Delete, Update} Aplikasi} 181 | 182 | Pada pembahasan ini, akan diberikan contoh menggunakan dua kategori, yaitu dengan menggunakan \textit{framework} (ExpressJS - \url{http://expressjs.com}) serta tanpa menggunakan \textit{framework}. 183 | 184 | \subsection{Menggunakan Framework ExpressJS} 185 | 186 | \lstset{language=bash,caption=Instalasi ExpressJS menggunakan npm} 187 | \lstinputlisting{src/non-nodejs/bab-01/instalasi-expressjs.txt} 188 | 189 | Jika berhasil, maka kita bisa menggunakan perintah \textit{express} untuk membuat rerangka aplikasi. Sintaksis penggunaan ExpressJS adalah sebagai berikut: 190 | 191 | \lstset{language=bash,caption=Perintah express} 192 | \lstinputlisting{src/non-nodejs/bab-01/express-help.txt} 193 | 194 | Setelah itu, kita bisa membuat rerangka aplikasi ExpressJS dengan cara berikut: 195 | 196 | \lstset{language=bash,caption=Menggunakan express untuk membuat rerangka aplikasi} 197 | \lstinputlisting{src/non-nodejs/bab-01/express-buat-app.txt} 198 | 199 | Pada rerangka aplikasi tersebut, terdapat file \textit{package.json} untuk mendefinisikan aplikasi serta dependensi-nya dan app.js yang merupakan file utama untuk dijalankan pada server. 200 | 201 | \lstset{language=Javascript,caption=package.json untuk ExpressJS} 202 | \lstinputlisting{src/bab-01/hello-vanilla/package.json} 203 | 204 | \lstset{language=Javascript,caption=app.js untuk ExpressJS}a 205 | \lstinputlisting{src/bab-01/hello-vanilla/app.js} 206 | 207 | Edit file \textit{routes/index.js} sebagai berikut: 208 | 209 | \lstset{language=Javascript,caption=Hasil edit routes/index.js} 210 | \lstinputlisting{src/bab-01/hello-vanilla/routes/index.js} 211 | 212 | Setelah itu, install modul-modul yang diperlukan dengan perintah \textit{npm install} pada direktori tersebut. npm akan membaca file package.json kemudian menginstall modul-modul sesuai dengan deskripsi pada \textit{dependencies}. Setelah diuji pada komputer lokal dengan perintah \textit{node app.js}, dan sukses bisa diakses di browser dengan alamat \textit{http://localhost:3000}, maka aplikasi tersebut bisa di-deploy di CloudFoundry. Proses deployment digambarkan sebagai berikut (anda sudah harus login menggunakan perintah \textit{vmc login} sebelumnya) dan berada di direktori tempat aplikasi tersebut berada: 213 | 214 | \lstset{language=bash,caption=Deployment aplikasi ExpressJS ke CF} 215 | \lstinputlisting{src/non-nodejs/bab-01/deploy-express-cf.txt} 216 | 217 | Hasilnya terlihat pada tampilan browser di Gambar~\ref{fig:bab-01-hello} 218 | 219 | \begin{figure} 220 | \begin{center} 221 | \includegraphics[scale=0.5]{images/bpdp-hello-express.jpg} 222 | \end{center} 223 | \caption{Hasil push ke server} 224 | \label{fig:bab-01-hello} 225 | \end{figure} 226 | 227 | Aplikasi yang sudah dibuat seringkali diubah, oleh karena itu vmc juga menyediakan fasilitas untuk Mengupdate aplikasi. 228 | 229 | \lstset{language=Javascript,caption=Update: menambahkan versi Node.js ke routes/index.js} 230 | \lstinputlisting{src/bab-01/hello/routes/index.js} 231 | 232 | \lstset{language=bash,caption=Mengupdate aplikasi di server} 233 | \lstinputlisting{src/non-nodejs/bab-01/update-aplikasi-cf.txt} 234 | 235 | Hasilnya bisa dilihat di Gambar~\ref{fig:bab-01-hello-update} 236 | 237 | \begin{figure} 238 | \begin{center} 239 | \includegraphics[scale=0.5]{images/bpdp-hello-express-update.jpg} 240 | \end{center} 241 | \caption{Hasil update dengan menyertakan versi Node.js} 242 | \label{fig:bab-01-hello-update} 243 | \end{figure} 244 | 245 | Untuk menghapus aplikasi: 246 | 247 | \lstset{language=bash,caption=Menghapus aplikasi yang di-deploy di CF} 248 | \lstinputlisting{src/non-nodejs/bab-01/delete-aplikasi-cf.txt} 249 | 250 | Pada saat deployment, kita juga bisa memilih versi Node.js (runtime) sebagai berikut: 251 | 252 | \lstset{language=bash,caption=Deployment ke CF dengan memilih runtime Node.js} 253 | \lstinputlisting{src/non-nodejs/bab-01/deploy-pilih-runtime-cf.txt} 254 | 255 | 256 | Hasilnya bisa dilihat di Gambar~\ref{fig:bab-01-hello-ganti-runtime} 257 | 258 | \begin{figure} 259 | \begin{center} 260 | \includegraphics[scale=0.5]{images/bpdp-express-hello-update06.jpg} 261 | \end{center} 262 | \caption{Deployment menggunakan versi runtime tertentu} 263 | \label{fig:bab-01-hello-ganti-runtime} 264 | \end{figure} 265 | 266 | \subsection{Tanpa Framework} 267 | 268 | Tanpa \textit{framework}, yang kita perlukan hanyalah langsung mem-\textit{push} file yang kita buat (dalam contoh ini adalah app.js): 269 | 270 | \lstset{language=Javascript,caption=app.js tanpa framework} 271 | \lstinputlisting{src/bab-01/hello-no-framework/app.js} 272 | 273 | Proses deployement adalah sebagai berikut: 274 | 275 | \lstset{language=bash,caption=Deployment app.js tanpa framework} 276 | \lstinputlisting{src/non-nodejs/bab-01/deploy-appjs-no-framework.txt} 277 | 278 | Hasilnya bisa dilihat pada Gambar~\ref{fig:bab-01-hello-no-framework} 279 | 280 | \begin{figure} 281 | \begin{center} 282 | \includegraphics[scale=0.5]{images/hello-noframework.jpg} 283 | \end{center} 284 | \caption{Hasil deployement app.js tanpa framework} 285 | \label{fig:bab-01-hello-no-framework} 286 | \end{figure} 287 | -------------------------------------------------------------------------------- /components/bab-02.tex: -------------------------------------------------------------------------------- 1 | \chapter{REPL dan Dasar-dasar JavaScript di Node.js} 2 | 3 | \section{REPL} 4 | 5 | \index{REPL}REPL adalah lingkungan pemrograman interaktif, tempat developer bisa mengetikkan program per baris dan langsung mengeksekusi hasilnya. Biasanya ini digunakan untuk menguji perintah-perintah yang cukup dijalankan pada satu baris atau satu blok segmen kode sumber saja. Karena fungsinya itu, maka istilah yang digunakan adalah REPL (read-eval-print-loop), yaitu loop atau perulangan baca perintah - evaluasi perintah - tampilkan hasil. REPL sering juga disebut sebagai \textit{interactive top level} atau \textit{language shell}. ``Tradisi'' ini sudah dimulai sejak jaman LISP di mesin UNIX di era awal pengembangan \textit{development tools}. Saat ini hampir semua \textit{interpreter/compiler} mempunyai REPL, misalnya Python, Ruby, Scala, PHP, berbagai interpreter/compiler LISP, dan tidak ketinggalan Node.js. 6 | 7 | \subsection{Mengaktifkan REPL} 8 | 9 | Untuk mengaktifkan REPL dari Node.js, \textit{executable command line program}-nya adalah \textbf{node}. Jika \textbf{node} dipanggil dengan argumen nama file JavaScript, maka file JavaScript tersebut akan dieksekusi, sementara jika tanpa argumen, akan masuk ke REPL: 10 | 11 | \lstset{language=bash,caption=Node.js REPL} 12 | \lstinputlisting{src/non-nodejs/bab-02/nodejs-repl.txt} 13 | 14 | Tanda ``\textbf{>}'' adalah tanda bahwa REPL Node.js siap untuk menerima perintah. Untuk melihat perintah-perintah REPL, bisa digunakan \textbf{.help}. 15 | 16 | \subsection{Perintah-perintah REPL} 17 | 18 | Pada sesi REPL, kita bisa memberikan perintah internal REPL maupun perintah-perintah lain yang sesuai dan dikenali sebagai perintah JavaScript. Perintah internal REPL Node.js terdiri atas: 19 | \begin{itemize} 20 | \item \textbf{.break}: keluar dan melepaskan diri dari "keruwetan" baris perintah di REPL. 21 | \item \textbf{.clear}: alias untuk .break 22 | \item \textbf{.exit}: keluar dari sesi REPL (bisa juga dengan menggunakan Ctrl-D) 23 | \item \textbf{.help}: menampilkan pertolong perintah internal REPL 24 | \item \textbf{.load}: membaca dan mengeksekusi perintah-perintah JavaScript yang terdapat pada suatu file. 25 | \item \textbf{.save}: menyimpan sesi REPL ke dalam suatu file. 26 | \end{itemize} 27 | 28 | Contoh untuk \textbf{.load}: 29 | 30 | \lstset{language=JavaScript,caption=Contoh penggunaan .load dalam REPL} 31 | \lstinputlisting{src/non-nodejs/bab-02/nodejs-repl-load.txt} 32 | 33 | Setelah keluar dari sesi REPL, maka port akan ditutup dan hasil eksekusi di atas akan dibatalkan. 34 | 35 | Untuk menyimpan hasil sesi REPL menggunakan \textbf{.save}, jika tanpa menyebutkan direktori, maka akan disimpan di direktori aktif saat itu. Contoh: 36 | \lstset{language=bash,caption=Contoh penggunaan perintah .save di sesi REPL} 37 | \lstinputlisting{src/non-nodejs/bab-02/nodejs-repl-save.txt} 38 | 39 | \section{Dasar-dasar JavaScript di Node.js} 40 | 41 | Node.js merupakan sistem peranti lunak yang merupakan implementasi dari bahasa pemrograman JavaScript. Spesifikasi JavaScript yang diimplementasikan merupakan spesifikasi resmi dari \index{ECMAScript}ECMAScript serta \index{CommonJS}CommonJS (\url{http://commonjs.org}). Dengan demikian, jika anda sudah pernah mempelajari JavaScript sebelumnya, tata bahasa dari perintah yang dipahami oleh Node.js masih tetap sama dengan JavaScript. 42 | 43 | \subsection{Membaca \textit{Masukan} dari Stream / Masukan Standar (stdin)} 44 | 45 | Untuk lebih memahami dasar-dasar JavaScript serta penerapannya di Node.js, seringkali kita perlu melakukan simulasi pertanyaan - proses - keluaran jawaban. Proses akan kita pelajari seiring dengan materi-materi berikutnya, sementara untuk keluaran, kita bisa menggunakan \textbf{console.log}. Bagian ini akan menjelaskan sedikit tentang masukan. 46 | 47 | \index{Readline}Perintah untuk memberi masukan di Node.js sudah tersedia pada pustaka API \textit{Readline}\footnote{Lengkapnya bisa diakses di \url{http://nodejs.org/api/readline.html}}. Pola dari masukan ini adalah sebagai berikut: 48 | \begin{itemize} 49 | \item me-\textit{require} pustaka Readline 50 | \item membuat \textit{interface} untuk masukan dan keluaran 51 | \item .. gunakan interface .. 52 | \item .. gunakan interface .. 53 | \item .. gunakan interface .. 54 | \item .. gunakan interface .. 55 | \item .. 56 | \item .. 57 | \item tutup \textit{interface} 58 | \end{itemize} 59 | 60 | Implementasi dari pola diatas bisa dilihat pada kode sumber berikut ini (diambil dari manual Node.js): 61 | 62 | \lstset{language=JavaScript,caption=readline.js: penggunaan pustaka Readline untuk masukan} 63 | \lstinputlisting{src/bab-02/readline.js} 64 | 65 | \begin{Sbox} 66 | \begin{minipage}{\textwidth} 67 | \textbf{Catatan:} \textit{function(answer)} pada listing di atas merupakan \textit{anonymous function} atau fungsi anonimus (sering juga disebut \textit{lambda function} / fungsi lambda. Posisi fungsi pada listing tersebut disebut dengan fungsi \textit{callback}. Untuk keperluan pembahasan saat ini, untuk sementara yang perlu dipahami adalah hasil input akan dimasukkan ke \textit{answer} untuk diproses lebih lanjut. Fungsi dan \textit{callback} akan dibahas lebih lanjut pada pembahasan berikutnya. 68 | \end{minipage} 69 | \end{Sbox} 70 | \begin{center} 71 | \shadowbox{\TheSbox} 72 | \end{center} 73 | 74 | \subsection{Nilai/Value dan Tipe Data} 75 | 76 | \index{Tipe data}Program dalam JavaScript akan berhubungan dengan data atau nilai. Setiap nilai mempunyai tipe tertentu. JavaScript mengenali berbagai tipe berikut ini: 77 | \begin{itemize} 78 | \item Angka: bulat (misalnya 4) atau pecahan (misalnya 3.75) 79 | \item \textit{Boolean}: nilai benar (true) dan salah (false) 80 | \item String: diapit oleh tanda petik ganda ("contoh string") atau tunggal ('contoh string') 81 | \item \textit{null} 82 | \item \textit{undefined} 83 | \end{itemize} 84 | 85 | \index{Dynamically typed}JavaScript adalah bahasa pemrograman yang mengijinkan pemrogram untuk tidak mendefinisikan tipe data pada saat deklarasi, atau sering juga disebut sebagai \textit{dynamically typed language}: 86 | 87 | \lstset{language=JavaScript,caption=Fitur \textit{dynamically typed language}} 88 | \lstinputlisting{src/bab-02/dynamic.js} 89 | 90 | Pada contoh di atas, kita bisa melihat bahwa data akan dikonversi secara otomatis pada saat program dieksekusi. 91 | 92 | \begin{Sbox} 93 | \begin{minipage}{\textwidth} 94 | \textbf{Catatan:} 95 | \begin{itemize} 96 | \item Khusus untuk operator "+", JavaScript akan melakukan penggabungan string (\textit{string concatenation}), tetapi untuk operator lain, akan dilakukan operasi matematis sesuai operator tersebut (-,/,*). 97 | \item Konversi string ke tipe numerik bisa dilakukan dengan \textit{parseInt(string)} (jika bilangan bulat) dan \textit{parseFloat(string)} (jika bilangan pecahan). 98 | \end{itemize} 99 | \end{minipage} 100 | \end{Sbox} 101 | \begin{center} 102 | \shadowbox{\TheSbox} 103 | \end{center} 104 | 105 | \subsection{Variabel} 106 | 107 | \index{Variabel}Variabel adalah suatu nama yang didefinisikan untuk menampung suatu nilai. Nama ini akan digunakan sebagai referensi yang akan menunjukkan ke nilai yang ditampungnya. Nama variabel disebut \index{Identifier}dengan \textit{identifier} / pengenal. Ada beberapa syarat pemberian nama \textit{identifier} di JavaScript: 108 | \begin{itemize} 109 | \item Dimulai dengan huruf, \textit{underscore} (\_), atau tanda dollar (\$). 110 | \item Karakter berikutnya bisa berupa angka, selain ketentuan pertama di atas. 111 | \item Membedakan huruf besar - kecil. 112 | \end{itemize} 113 | Konvensi yang digunakan oleh pemrogram JavaScript terkait dengan penamaan ini adalah variasi dari metode \textit{camel case}, yaitu \textit{camelBack}. Contoh: jumlahMahasiswa, linkMenu, status. 114 | 115 | \subsection{Konstanta} 116 | 117 | \index{Konstanta}Konstanta mirip dengan variabel, hanya saja sifatnya \textit{read-only}, tidak bisa diubah-ubah setelah ditetapkan. Untuk menetapkan konstanta di JavaScript, digunakan kata kunci \textit{const}. Contoh: 118 | 119 | \lstset{language=JavaScript,caption=Contoh konstanta dalam JavaScript} 120 | \lstinputlisting{src/bab-02/const.js} 121 | 122 | Konvensi penamaan konstanta adalah menggunakan huruf besar semua. Bagian ini (sampai saat buku ini ditulis) hanya berlaku di Firefox dan Google Chrome - V8 (artinya berlaku juga untuk Node.js). 123 | 124 | \subsection{Fungsi} 125 | 126 | \subsubsection{Pengertian Fungsi} 127 | 128 | \index{Fungsi}Fungsi merupakan subprogram atau suatu bagian dari keseluruhan program yang ditujukan untuk mengerjakan suatu pekerjaan tertentu dan (biasanya) menghasilkan suatu nilai kembalian. Subprogram ini relatif independen terhadap bagian-bagian lain sehingga memenuhi kaidah "bisa-digunakan-kembali" atau \textit{reusable} pada beberapa program yang memerlukan fungsionalitasnya. Fungsi dalam ilmu komputer sering kali juga disebut dengan \textit{prcedure, routine}, atau \textit{method}. 129 | 130 | \subsubsection{Definisi Fungsi} 131 | 132 | Definisi fungsi dari JavaScript di Node.js bisa dilakukan dengan sintaksis berikut ini: 133 | 134 | \lstset{language=JavaScript,caption=Sintaksis Fungsi dalam JavaScript} 135 | \lstinputlisting{src/non-nodejs/bab-02/sintaksis-fungsi.txt} 136 | 137 | Setelah dideklarasikan, fungsi tersebut bisa dipanggil dengan cara sebagai berikut: 138 | 139 | \lstset{language=JavaScript,caption=Pemanggilan Fungsi dalam JavaScript} 140 | \lstinputlisting{src/non-nodejs/bab-02/pemanggilan-fungsi.txt} 141 | 142 | Contoh dalam program serta pemanggilannya adalah sebagai berikut: 143 | 144 | \lstset{language=bash,caption=Contoh deklarasi fungsi dan pemanggilannya} 145 | \lstinputlisting{src/non-nodejs/bab-02/contoh-fungsi.txt} 146 | 147 | \subsubsection{Fungsi Anonim} 148 | 149 | \index{Fungsi Anonim}Fungsi anonim adalah fungsi tanpa nama, pemrogram tidak perlu memberikan nama ke fungsi. Biasanya fungsi anonimus ini hanya digunakan untuk fungsi yang dikerjakan pada suatu bagian program saja dan tidak dengan maksud untuk dijadikan komponen yang bisa dipakai di bagian lain dari program (biasanya untuk menangani \textit{event} atau \textit{callback}). Untuk mendeklarasikan fungsi ini, digunakan literal \textit{function}. 150 | 151 | \lstset{language=JavaScript,caption=Fungsi anonim} 152 | \lstinputlisting{src/bab-02/fungsiAnonim.js} 153 | 154 | \subsubsection{Fungsi Rekursif} 155 | 156 | \index{Fungsi rekursif}Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri. Contoh dari aplikasi fungsi rekursif adalah pada penghitungan faktorial berikut: 157 | 158 | \lstset{language=JavaScript,caption=Fungsi rekursif untuk menghitung faktorial} 159 | \lstinputlisting{src/bab-02/fungsiRekursif.js} 160 | 161 | \subsubsection{Fungsi di dalam Fungsi / \textit{Nested Functions}} 162 | 163 | \index{Nested functions}Saat mendefinisikan fungsi, di dalam fungsi tersebut pemrogram bisa mendefinisikan fungsi lainnya. Meskipun demikian, fungsi yang terletak dalam suatu definisi fungsi tidak bisa diakses dari luar fungsi tersebut dan hanya tersedia untuk fungsi yang didefinisikan. 164 | 165 | \lstset{language=JavaScript,caption=Fungsi di dalam Fungsi} 166 | \lstinputlisting{src/bab-02/nested.js} 167 | 168 | \subsection{Literal} 169 | 170 | \index{Literal}Literal digunakan untuk merepresentasikan nilai dalam JavaScript. Ada beberapa tipe literal. 171 | 172 | \subsubsection{Literal Array} 173 | 174 | \index{Array}Array atau variabel berindeks adalah penampung untuk obyek yang menyerupai \textit{list} atau daftar. Obyek array juga menyediakan berbagai fungsi dan metode untuk mengolah anggota yang terdapat dalam daftar tersebut (terutama untuk operasi \textit{traversal} dan permutasi. Listing berikut menunjukkan beberapa operasi untuk literal array. 175 | 176 | \lstset{language=JavaScript,caption=Array di JavaScript} 177 | \lstinputlisting{src/bab-02/array.js} 178 | 179 | \subsubsection{Literal Boolean} 180 | 181 | \index{Boolean}Literal boolean menunjukkan nilai benar (true) atau salah (false). 182 | 183 | \subsubsection{Literal Integer} 184 | 185 | \index{Integer}Literal integer digunakan untuk mengekspresikan nilai bilangan bulat. Nilai bulangan bulat dalam JavaScript bisa dalam bentuk: 186 | \begin{itemize} 187 | \item decimal (basis 10): digit tanpa awalan nol. 188 | \item octal (basis 8): digit diawali dengan 1 angka nol.\footnote{pada ECMA-262, bilangan octal ini sudah tidak digunakan lagi.} 189 | \item hexadecimal (basis 16): digit diawali dengan 0x. 190 | \end{itemize} 191 | 192 | \subsubsection{Literal Floating-point} 193 | 194 | \index{Floating-point}Literal ini digunakan untuk mengekspresikan nilai bilangan pecahan, misalnya 0.4343 atau bisa juga menggunakan E/e (nilai eksponensial), misalnya 195 | -3.1E12. 196 | 197 | \subsubsection{Literal Obyek} 198 | 199 | \index{Obyek}Literal ini akan dibahas di bab yang menjelaskan tentang paradigma pemrograman berorientasi obyek di JavaScript. 200 | 201 | \subsubsection{Literal String} 202 | 203 | \index{String}Literal string mengekspresikan suatu nilai dalam bentuk sederetan karakter dan berada dalam tanda petik (ganda/``'' maupun tunggal/''). Contoh: 204 | \begin{itemize} 205 | \item ``Kembali ke halaman utama'' 206 | \item 'Lisensi' 207 | \item ``Hari ini, Jum'at, tanggal 21 November'' 208 | \item ``1234.543'' 209 | \item ``baris pertama \verb+\n+ baris kedua'' 210 | \end{itemize} 211 | 212 | Contoh terakhir di atas menggunakan karakter khusus (\verb+\n+). Beberapa karakter khusus lainnya adalah: 213 | 214 | \begin{itemize} 215 | \item \verb+\b+: Backspace 216 | \item \verb+\f+: Form feed 217 | \item \verb+\n+: New line 218 | \item \verb+\r+: Carriage return 219 | \item \verb+\t+: Tab 220 | \item \verb+\v+: Vertical tab 221 | \item \verb+\'+: Apostrophe atau single quote 222 | \item \verb+\"+: Double quote 223 | \item \verb+\\+: Backslash (\verb+\+). 224 | \item \verb+\XXX+: Karakter dengan pengkodean Latin-1 dengan tiga digit octal antara 0 and 377. (misal, \verb+\+251 adalah simbol hak cipta). 225 | \item \verb+\xXX+: seperti di atas, tetapi hexadecimal (2 digit). 226 | \item \verb+\uXXXX+: Karakter \textit{Unicode} dengan 3 digit karakter hexadecimal. 227 | \end{itemize} 228 | 229 | Backslash sendiri sering digunakan sebagai \textit{escape character}, misalnya ``NaN sering disebut juga sebagai \verb+\+''Not a Number\verb+\+``''. 230 | 231 | \subsection{Struktur Data dan Representasi JSON} 232 | 233 | \index{JSON}JSON (\textit{JavaScript Object Notation}) adalah subset dari JavaScript dan merupakan struktur data native di JavaScript. Bentuk dari representasi struktur data JSON adalah sebagai berikut\footnote{\url{http://en.wikipedia.org/wiki/JSON} dengan sedikit perubahan}: 234 | 235 | \lstset{language=JavaScript,caption=Representasi \textit{JSON}} 236 | \lstinputlisting{src/bab-02/json.js} 237 | 238 | Dari representasi di atas, kita bisa membaca: 239 | \begin{itemize} 240 | \item Nilai data ``firstname'' adalah ``John'' 241 | \item Data ``address'' terdiri atas sub data ``streetAddress'', ``city'', ``state'', dan ``postalCode'' yang masing-masing mempunyai nilai data sendiri-sendiri. 242 | \item dan seterusnya 243 | \end{itemize} 244 | 245 | \subsection{Aliran Kendali} 246 | 247 | \index{Aliran kendali}Alur program dikendalikan melalui pernyataan-pernyataan untuk aliran kendali. Ada beberapa pernyataan aliran kendali yang akan dibahas. 248 | 249 | \subsubsection{Pernyataan Kondisi \textit{if .. else if .. else}} 250 | 251 | \index{if}Pernyataan ini digunakan untuk mengerjakan atau tidak mengerjakan suatu bagian atau blok program berdasarkan hasil evaluasi kondisi tertentu. 252 | 253 | \lstset{language=JavaScript,caption=Pernyataan \textit{if .. else if .. else}} 254 | \lstinputlisting{src/bab-02/if.js} 255 | 256 | \subsubsection{Pernyataan \textit{switch}} 257 | 258 | \index{switch}Pernyataan ini digunakan untuk mengevaluasi suatu ekspresi dan membandingkan sama atau tidaknya dengan suatu label tertentu di dalam struktur pernyataan switch, serta mengeksekusi perintah-perintah sesuai dengan label yang cocok. 259 | 260 | \lstset{language=JavaScript,caption=Pernyataan \textit{Contoh penggunaan ``switch''}} 261 | \lstinputlisting{src/bab-02/switch.js} 262 | 263 | \subsubsection{\textit{Looping}} 264 | 265 | \index{Looping}Looping atau sering juga disebut ``kalang'' adalah konstruksi program yang digunakan untuk melakukan suatu blok perintah secara berulang-ulang. 266 | 267 | \textbf{for} 268 | 269 | \lstset{language=JavaScript,caption=Pernyataan \textit{for}} 270 | \lstinputlisting{src/bab-02/for.js} 271 | 272 | Pernyataan ``for'' juga bisa digunakan untuk mengakses data yang tersimpam dalam struktur data JavaScript (JSON). 273 | 274 | \lstset{language=JavaScript,caption=Pernyataan \textit{for .. in}} 275 | \lstinputlisting{src/bab-02/forIn.js} 276 | 277 | \textbf{do .. while} 278 | 279 | Pernyataan ini digunakan untuk mengerjakan suatu blok program selama suatu kondisi bernilai benar dengan jumlah minimal pengerjaan sebanyak 1 kali. 280 | 281 | \lstset{language=JavaScript,caption=Pernyataan \textit{do .. while}} 282 | \lstinputlisting{src/bab-02/doWhile.js} 283 | 284 | \textbf{while} 285 | 286 | Seperti \textit{do .. while}, pernyataan ini digunakan untuk mengerjakan suatu blok program secara berulang-ulang selama kondisi bernilai benar. Meskipun demikian, bisa saja blok program tersebut tidak pernah dikerjakan jika pada saat awal expresi dievaluasi sudah bernilai \textit{false}. 287 | 288 | \lstset{language=JavaScript,caption=Pernyataan \textit{while}} 289 | \lstinputlisting{src/bab-02/while.js} 290 | 291 | \textbf{label, break, dan continue} 292 | 293 | Bagian ini digunakan dalam \textit{looping} dan \textit{switch}. 294 | \begin{itemize} 295 | \item \textit{label} digunakan untuk memberi pengenal pada suatu lokasi program sehingga bisa direferensi oleh \textit{break} maupun \textit{continue} (jika dikehendaki). 296 | \item \textit{break} digunakan untuk menghentikan eksekusi dan meneruskan alur program ke pernyataan setelah \textit{looping} atau \textit{switch} 297 | \item \textit{continue} digunakan untuk meneruskan eksekusi ke iterasi atau ke kondisi switch berikutnya. 298 | \end{itemize} 299 | 300 | \lstset{language=JavaScript,caption=Pernyataan \textit{break} dan \textit{continue}} 301 | \lstinputlisting{src/bab-02/breakContinue.js} 302 | 303 | \lstset{language=JavaScript,caption=Pernyataan \textit{break} dengan label} 304 | \lstinputlisting{src/bab-02/breakWithLabel.js} 305 | 306 | \subsection{Penanganan Error} 307 | 308 | \index{Penanganan error}JavaScript mendukung pernyataan \textit{try .. catch .. finally} serta \textit{throw} untuk menangani error. Meskipun demikian, banyak hal yang tidak sesuai dengan konstruksi ini karena sifat JavaScript yang \textit{asynchronous}. Untuk kasus asynchrous, pemrogram lebih disarankan menggunakan \textit{function callback}. 309 | 310 | \lstset{language=JavaScript,caption=Pernyataan \textit{try catch finally}} 311 | \lstinputlisting{src/bab-02/try.js} 312 | 313 | Jika diperlukan, kita bisa mendefinisikan sendiri error dengan menggunakan pernyataan \textit{throw}. 314 | 315 | \lstset{language=JavaScript,caption=Pernyataan \textit{try catch throw}} 316 | \lstinputlisting{src/bab-02/throw.js} 317 | -------------------------------------------------------------------------------- /components/bab-03.tex: -------------------------------------------------------------------------------- 1 | \chapter{Paradigma Pemrograman di JavaScript} 2 | 3 | \section{Pemrograman Fungsional} 4 | 5 | Pemrograman fungsional, atau sering disebut \textit{functional programming}, selama ini lebih sering dibicarakan di level para akademisi. Meskipun demikian, saat ini terdapat kecenderungan paradigma ini semakin banyak digunakan di industri. Contoh nyata dari implementasi paradigma ini di industri antara lain adalah Scala (\url{http://www.scala-lang.org}), OCaml (\url{http://www.ocaml.org}), Haskell (\url{http://www.haskell.org}), Microsoft F\# (\url{http://fsharp.org}), dan lain-lain. Dalam konteks paradigma pemrograman, peranti lunak yang dibangun menggunakan pendekatan paradigma ini akan terdiri atas berbagai fungsi yang mirip dengan fungsi matematis. Fungsi matematis tersebut di-evaluasi dengan penekanan pada penghindaran \textit{state} serta \textit{mutable data}. Bandingkan dengan paradigma pemrograman prosedural yang menekankan pada \textit{immutable data} dan definisi berbagai prosedur dan fungsi untuk mengubah \textit{state} serta data. 6 | 7 | JavaScript bukan merupakan bahasa pemrograman fungsional yang murni, tetapi ada banyak fitur dari pemrograman fungsional yang terdapat dalam JavaScript. Dalam hal ini, JavaScript banyak dipengaruhi oleh bahasa pemrograman Scheme (\url{http://www.schemers.org/}). Bab ini akan membahas beberapa fitur pemrograman fungsional di JavaScript. Pembahasan ini didasari pembahasan di bab sebelumnya tentang Fungsi di JavaScript. 8 | 9 | \subsection{Ekspresi Lambda} 10 | 11 | \index{Ekspresi Lambda}Ekspresi lambda / \textit{lambda expression} merupakan hasil karya dari ALonzo Church sekitar tahun 1930-an. Aplikasi dari konsep ini di dalam pemrograman adalah penggunaan fungsi sebagai parameter untuk suatu fungsi. Dalam pemrograman, \textit{lambda function} sering juga disebut sebagai fungsi anonimus (fungsi yang dipanggil/dieksekusi tanpa ditautkan (\textit{bound}) ke suatu \textit{identifier}). Berikut adalah implementasi dari konsep ini di JavaSCript: 12 | 13 | \lstset{language=JavaScript,caption=Ekspresi Lambda di JavaScript} 14 | \lstinputlisting{src/bab-03/lambda.js} 15 | 16 | \subsection{Higher-order Function} 17 | 18 | \index{Higher-order Function}\textit{Higher-order function} (sering disebut juga sebagai \textit{functor} adalah suatu fungsi yang setidak-tidaknya menggunakan satu atau lebih fungsi lain sebagai parameter dari fungsi, atau menghasilkan fungsi sebagai nilai kembalian. 19 | 20 | \lstset{language=JavaScript,caption=Higher-order Function di JavaScript} 21 | \lstinputlisting{src/bab-03/hof.js} 22 | 23 | \subsection{Closure} 24 | 25 | \index{Closure}Suatu \textit{closure} merupakan definisi suatu fungsi bersama-sama dengan lingkungannya. Lingkungan tersebut terdiri atas fungsi internal serta berbagai variabel lokal yang masih tetap tersedia saat fungsi utama / closure tersebut selesai dieksekusi. 26 | 27 | \lstset{language=JavaScript,caption=Closure di JavaScript} 28 | \lstinputlisting{src/bab-03/closure.js} 29 | 30 | \subsection{Currying} 31 | 32 | \index{Currying}\textit{Currying} memungkinkan pemrogram untuk membuat suatu fungsi dengan cara menggunakan fungsi yang sudah tersedia secara parsial, artinya tidak perlu menggunakan semua argumen dari fungsi yang sudah tersedia tersebut. 33 | 34 | \lstset{language=JavaScript,caption=Currying di JavaScript} 35 | \lstinputlisting{src/bab-03/currying.js} 36 | 37 | \section{Pemrograman Berorientasi Obyek} 38 | 39 | \subsection{Pengertian} 40 | 41 | \index{PBO}Pemrograman Berorientasi Obyek (selanjutnya akan disingkat PBO) adalah suatu paradigma pemrograman yang memandang bahwa pemecahan masalah pemrograman akan dilakukan melalui definisi berbagai kelas kemudian membuat berbagai obyek berdasarkan kelas yng dibuat tersebut dan setelah itu mendefinisikan interaksi antar obyek tersebut dalam memecahkan masalah pemrograman. Obyek bisa saling berinteraksi karena setiap obyek mempunyai properti (sifat / karakteristik) dan \textit{method} untuk mengerjakan suatu pekerjaan tertentu. Jadi, bisa dikatakan bahwa paradigma ini menggunakan cara pandang yang manusiawi dalam penyelesaian masalah. 42 | 43 | Dengan demikian, inti dari PBO sebenarnya terletak pada kemampuan untuk mengabstraksikan berbagai obyek ke dalam kelas (yang terdiri atas properti serta method). Paradigma PBO biasanya juga mencakup \textit{inheritance} atau pewarisan (sehingga terbentuk skema yang terdiri atas \textit{superclass} dan \textit{subclass}). Ciri lainnya adalah \textit{polymorphism} dan \textit{encapsulation} / pengkapsulan. 44 | 45 | JavaScript adalah bahasa pemrograman yang mendukung PBO dan merupakan implementasi dari ECMAScript. Implementasi PBO di JavaScript adalah \textit{prototype-based programming} yang merupakan salah satu subset dari PBO. Pada \textit{prototype-based programming}, kelas / \textit{class} tidak ada. Pewarisan diimplementasikan melalui \textit{prototype}. 46 | 47 | \subsection{Definisi Obyek} 48 | 49 | \index{Obyek}Definisi obyek dilakukan dengan menggunakan definisi \textit{function}, sementara \textit{this} digunakan di dalam definisi untuk menunjukkan ke obyek tersebut. Sementara itu, Kelas.prototype.namaMethod digunakan untuk mendefinisikan method dengan nama method namaMethod pada kelas Kelas. Perhatikan contoh pada listing berikut. 50 | 51 | \lstset{language=JavaScript,caption=Definisi obyek di JavaScript} 52 | \lstinputlisting{src/bab-03/obyek.js} 53 | 54 | \subsection{\textit{Inheritance} / Pewarisan} 55 | 56 | \index{Pewarisan}Pewarisan di JavaScript bisa dicapai menggunakan \textit{prototype}. Listing program berikut memperlihatkan bagaimana pewarisan diimplementasikan di JavaScript. 57 | 58 | \lstset{language=JavaScript,caption=Pewarisan di PBO JavaScript} 59 | \lstinputlisting{src/bab-03/inheritance.js} 60 | -------------------------------------------------------------------------------- /components/bab-04.tex: -------------------------------------------------------------------------------- 1 | \chapter{Mengelola Paket Menggunakan npm} 2 | 3 | \section{Apakah npm Itu?} 4 | 5 | \index{npm}Node.js memungkinkan developer untuk mengembangkan aplikasi secara modular dengan memisahkan berbagai komponen \textit{reusable code} ke dalam pustaka (\textit{library}). Berbagai pustaka tersebut bisa diperoleh di \url{http://npmjs.org}. Node.js menyediakan perintah \textit{npm} untuk mengelola paket pustaka di repositori tersebut. Untuk menggunakan utilitas ini, pemrogram harus terkoneksi dengan Internet. 6 | 7 | \section{Menggunakan npm} 8 | 9 | Saat melakukan instalasi Node.js, secara otomatis \textit{npm} akan disertakan. Dengan perintah \textit{npm} tersebut, seorang pemrogram bisa mengelola pustaka yang tersedia di repositori. Jika pemrogram mempunya pustakan yang bisa digunakan oleh orang lain, maka pemrogram yang bersangkutan juga bisa menyimpan pustaka tersebut ke dalam repositori sehingga memungkinkan untuk diinstall oleh pemrogram-pemrogram lain di seluruh dunia. Sintaksis lengkap dari penggunaan perintah \textit{npm} ini adalah sebagai berikut\footnote{beberapa bagian tertulis spesifik lokasi direktori di komputer yang digunakan penulis}: 10 | 11 | \lstset{language=bash,caption=Sintaksis lengkap perintah \textit{npm}} 12 | \lstinputlisting{src/non-nodejs/bab-04/npm-help.txt} 13 | 14 | Pada bagian berikut, kita akan membahas lebih lanjut penggunaan perintah \textit{npm} tersebut. 15 | 16 | \subsection{Instalasi Paket} 17 | 18 | \index{npm!install paket}npm sebenarnya bukan merupakan singkatan dari \textit{Node Package Manager}, meskipun seringkali orang menterjemahkan dengan singkatan tersebut dan npm seharusnya ditulis dalam huruf kecil semua seperti yang dijelaskan pada FAQ (\textit{Frequently Asked Questions})\footnote{\url{https://npmjs.org/doc/faq.html}}. npm merupakan bilah alat berbasis baris perintah, dijalankan melalui shell atau \textit{command prompt}. Sama seperti kebanyakan bilah alat berbasis baris perintah lain, npm memiliki struktur perintah \textit{npm perintah argumen}. Installasi paket pustaka dilakukan dengan perintah berikut : 19 | 20 | \lstset{language=bash,caption=Cara install paket menggunakan npm} 21 | \lstinputlisting{src/non-nodejs/bab-04/npm-install.txt} 22 | 23 | Perintah diatas akan memasang versi terakhir dari paket ``namapaket''. Selain itu \textit{npm} juga dapat memasang paket langsung pada sebuah folder, tarball atau tautan untuk sebuah tarball. 24 | 25 | \subsection{Struktur Instalasi Paket Node.js} 26 | 27 | \index{npm!Struktur paket}Dalam installasi paket pustaka, berkas-berkas akan terletak dalam folder lokal aplikasi \textit{node\_modules}. Pada mode installasi paket pustaka global (dengan -g atau --global dibelakang baris perintah), paket pustaka akan dipasang pada \textit{/usr/lib/node\_modules} (dengan lokasi installasi Node.js standar). Mode global memungkinkan paket pustaka digunakan tanpa memasang paket pustaka pada setiap folder lokal aplikasi. Mode global ini juga membutuhkan hak administrasi lebih (sudo atau root) dari pengguna agar dapat menulis pada lokasi standar. 28 | 29 | Jika berada pada direktori \$HOME, maka paket-paket npm tersebut akan terinstall di \$HOME/.npm, sedangkan jika kita berada di luar direktori \$HOME, maka paket-paket tersebut akan terinstall di \$CWD/node\_modules (\$CWD = \textit{Current Working Directory} - direktori aktif saat ini). Daftar paket pustaka yang terpasang dapat dilihat menggunakan perintah berikut: 30 | 31 | \lstset{language=bash,caption=Argumen npm untuk melihat daftar paket terpasang} 32 | \lstinputlisting{src/non-nodejs/bab-04/npm-ls.txt} 33 | 34 | Selain melihat daftar paket pustaka yang digunakan dalam aplikasi maupun global, perintah diatas juga akan menampilkan paket dependensi dalam struktur pohon. Jika kita belum menginstall paket-paket yang diperlukan, akan muncul peringatan. Berikut ini adalah contoh peringatan dari paket-paket yang belum terinstall di aplikasi hello-express saat mengerjakan perintah ``npm ls'' di direktori tempat aplikasi tersebut berada (lihat bab 1): 35 | 36 | \lstset{language=bash,caption=npm ls pada aplikasi yang paket-paketnya belum terinstall} 37 | \lstinputlisting{src/non-nodejs/bab-04/npm-ls-paket-blm-terinstall.txt} 38 | 39 | Jika sudah terinstall, perintah ``npm ls'' akan menampilkan struktur dari paket yang telah terinstall dalam bentuk struktur pohon seperti pada Gambar~\ref{fig:npm-ls-paket-terinstall}. 40 | 41 | \begin{figure} 42 | \begin{center} 43 | \includegraphics[scale=0.5]{images/npm-ls-paket-terinstall.jpg} 44 | \end{center} 45 | \caption{Tampilan ``npm ls'' pada direktori proyek dengan paket terinstall lengkap} 46 | \label{fig:npm-ls-paket-terinstall} 47 | \end{figure} 48 | 49 | \subsection{Menghapus Paket / \textit{Uninstall}} 50 | 51 | \index{npm!Hapus paket}Menghapus paket pustaka menggunakan npm pada dasarnya hampir sama dengan saat memasang paket, namun dengan perintah \textit{uninstall}. Berikut perintah lengkapnya. 52 | 53 | \lstset{language=bash,caption=Perintah menghapus paket di npm} 54 | \lstinputlisting{src/non-nodejs/bab-04/npm-uninstall.txt} 55 | 56 | \subsection{Mencari Paket} 57 | 58 | \index{npm!Cari paket}Untuk mencari paket, gunakan argumen \textit{search} dan nama atau bagian dari nama paket yang dicari. Contoh berikut ini akan mencari paket dengan kata kunci 'sha512' (tampilan berikut merupakan tampilan yang terpotong): 59 | 60 | \lstset{language=bash,caption=Perintah menghapus paket di npm} 61 | \lstinputlisting{src/non-nodejs/bab-04/npm-search.txt} 62 | 63 | Setelah menemukan paketnya, pemrogram bisa menginstall langsung ataupun melihat informasi lebih lanjut tentang pustakan tersebut. 64 | 65 | \subsection{Menampilkan Informasi Paket} 66 | 67 | \index{npm!Info paket}Setelah mengetahui nama paket, pemrogram bisa memperoleh informasi lebih lanjut dalam format JSON menggunakan parameter \textit{view}. Contoh dibawah ini menampilkan rincian dalam format JSON dari paket \textit{arango.client}: 68 | 69 | \lstset{language=bash,caption=Menampilkan rincian suatu paket dalam format JSON} 70 | \lstinputlisting{src/non-nodejs/bab-04/npm-view.txt} 71 | 72 | \subsection{Memperbaharui Paket} 73 | 74 | \index{npm!Update paket}Jika terdapat versi baru, kita bisa memperbaharui secara otomatis menggunakan argumen \textit{update} berikut ini: 75 | 76 | \lstset{language=bash,caption=Memperbaharui paket} 77 | \lstinputlisting{src/non-nodejs/bab-04/npm-update.txt} 78 | -------------------------------------------------------------------------------- /components/bab-05.tex: -------------------------------------------------------------------------------- 1 | \chapter{Node.js dan Web: Teknik Pengembangan Aplikasi} 2 | 3 | \section{Pendahuluan} 4 | 5 | Pada saat membangun aplikasi Cloud dengan antarmuka web menggunakan Node.js, ada beberapa teknik pemrograman yang bisa digunakan. Bab ini akan membahas berbagai teknik tersebut. Untuk mengerjakan beberapa latihan di bab ini, digunakan suatu file dengan format JSON. File \textit{pegawai.json} berikut ini akan digunakan dalam pembahasan selanjutnya. 6 | 7 | \lstset{language=JavaScript,caption=pegawai.json} 8 | \lstinputlisting{src/bab-05/pegawai.json} 9 | 10 | \index{JSON!Validator}Jika ingin memeriksa validitas dari data berformat JSON, pemrogram bisa menggunakan validator di \url{http://jsonlint.com}. 11 | 12 | \section{\textit{Event-Driven Programming} dan EventEmitter} 13 | 14 | \index{Event-Driven}\textit{Event-Driven Programming} (selanjutnya akan disebut EDP) atau sering juga disebut \textit{Event-Based Programming} merupakan teknik pemrograman yang menggunakan \textit{event} atau suatu kejadian tertentu sebagai pemicu munculnya suatu aksi serta aliran program. Contoh event misalnya adalah sebagai berikut: 15 | \begin{itemize} 16 | \item Menu dipilih. 17 | \item Tombol "Submit" di klik. 18 | \item Server menerima permintaan dari klien. 19 | \end{itemize} 20 | Pada dasarnya ada beberapa bagian yang harus disiapkan dari paradigma dan teknik pemrograman ini: 21 | \begin{itemize} 22 | \item \textit{main loop} atau suatu konstruksi utama program yang menunggu dan mengirimkan sinyal event. 23 | \item definisi dari berbagai event yang mungkin muncul 24 | \item definisi \textit{event-handler} untuk menangani event yang muncul dan dikirimkan oleh \textit{main loop} 25 | \end{itemize} 26 | \index{events.EventEmitter}Node.js merupakan peranti pengembangan yang menggunakan teknik pemrograman ini. Pada Node.js, EDP ini semua dikendalikan oleh kelas \textit{events.EventEmitter}. Jika ingin menggunakan kelas ini, gunakan \textit{require('events')}. Dalam terminologi Node.js, jika suatu event terjadi, maka dikatakan sebagai \textit{emits an event}, sehingga kelas yang digunakan untuk menangani itu disebut dengan events.EventEmitter. Pada dasarnya banyak event yang digunakan oleh berbagai kelas lain di Node.js. Contoh kecil dari penggunaan itu diantaranya adalah \textit{net.Server} yang meng-\textit{emit} event "connection", "listening", "close", dan "error". 27 | 28 | Untuk memahami mekanisme ini, pahami dua kode sumber berikut: 29 | \begin{itemize} 30 | \item server.js: mengaktifkan server http (diambil dari manual Node.js) 31 | \item server-on-error.js: mencoba mengaktifkan server pada host dan port yang sama dengan server.js. Aktivasi ini akan menyebabkan Node.js meng-\textit{emit} event 'error' karena host dan port sudah digunakan di server.js. 32 | \end{itemize} 33 | File server.js dijalankan lebih dulu, setelah itu baru menjalankan server-on-error.js. 34 | 35 | \lstset{language=JavaScript,caption=server.js} 36 | \lstinputlisting{src/bab-05/edp/server.js} 37 | 38 | \lstset{language=JavaScript,caption=server-on-error.js} 39 | \lstinputlisting{src/bab-05/edp/server-on-error.js} 40 | 41 | \section{Asynchronous / Non-blocking IO dan \textit{Callback}} 42 | 43 | \index{Asynchronous}\index{Non-blocking IO}\index{Callback}\textit{Asynchronous input/output} merupakan suatu bentuk pemrosesan masukan/keluaran yang memungkinkan pemrosesan dilanjutkan tanpa menunggu proses tersebut selesai. Saat pemrosesan masukan/keluaran tersebut selesai, hasil akan diberikan ke suatu fungsi. Fungsi yang menangani hasil pemrosesan saat pemrosesan tersebut selesai disebut \textit{callback} (pemanggilan kembali). Jadi, mekanismenya adalah: proses masukan/keluaran - lanjut ke alur berikutnya - panggil kembali fungsi pemroses jika proses masukan/keluaran sudah selesai. 44 | 45 | \lstset{language=JavaScript,caption=Membaca file secara synchronous} 46 | \lstinputlisting{src/bab-05/synchronous.js} 47 | 48 | \lstset{language=JavaScript,caption=Membaca file secara asynchronous} 49 | \lstinputlisting{src/bab-05/asynchronous-callback.js} 50 | -------------------------------------------------------------------------------- /components/bab-06.tex: -------------------------------------------------------------------------------- 1 | \chapter{Mengakses Basis Data NoSQL: mongoDB} 2 | 3 | \section{Apa itu Basis Data NoSQL?} 4 | 5 | \index{NOSQL}Pada awalnya, istilah NoSQL digunakan oleh Carlo Strozzi untuk menyebut nama software basis data yang dibuat olehnya. Software basis data tersebut tidak mengikuti standar SQL, sehingga dia menyebut software tersebut dengan "NoSQL"\footnote{\url{http://www.strozzi.it/cgi-bin/CSA/tw7/I/en_US/nosql/Home\%20Page}}. Setelah itu, istilah NoSQL dipopulerkan oleh Eric Evans untuk menyebut jenis software basis data yang tidak menggunakan standar SQL. Dalam perkembangan berikutnya, NoSQL ini lebih diarahkan pada "Not Only SQL" dan digunakan untuk kategorisasi basis data \textit{non-relational} (misalnya OODBMS, Graph Database, Document-oriented, dan lain-lain). Meski ada usaha untuk menstandarkan bahasa \textit{query} untuk NoSQL (UnQL - \textit{Unstructured Query Language}), sampai saat ini usaha tersebut tidak menghasilkan sesuatu hal yang disepakati bersama karena dunia NoSQL memang kompleks sekali. Untuk melihat daftar dari basis data NoSQL, anda bisa melihat ke \url{http://nosql-databases.org}. 6 | 7 | \section{Mengenal mongoDB dan Fitur-fiturnya} 8 | 9 | \index{mongoDB}mongoDB adalah salah satu software NoSQL yang termasuk dalam kategori \textit{Document Store} / \textit{Document-Oriented Database}, yaitu data disimpan dalam bentuk dokumen. Suatu dokumen bisa diibaratkan seperti suatu \textit{record} dalam basis data relasional dan isi dari masing-masing dokumen tersebut bisa berbeda-beda dan ada pula yang sama. Hal ini berbeda dengan basis data relasional yang menetapkan keseragaman kolom serta tipe data dengan data yang NULL jika tidak terdapat data. mongoDB menyimpan data dalam bentuk dokumen dengan menggunakan format JSON. Berikut adalah fitur dari mongoDB: 10 | \begin{itemize} 11 | \item menggunakan format JSON dalam penyimpanan data 12 | \item mendukung indeks 13 | \item mendukung replikasi 14 | \item auto-sharding untuk skalabilitas horizontal 15 | \item query yang lengkap 16 | \item pembaruan data yang cepat 17 | \item mendukung Map/Reduce 18 | \item mendukung GridFS 19 | \end{itemize} 20 | 21 | \subsection{Memulai Server} 22 | Seperti halnya basis data relasional seperti MySQL, PostgreSQL, dan lain-lain, mongoDB juga memulai dengan menjalankan server yang memungkinkan server tersebut melayani permintaan akses data dokumen melalui klien. Untuk memulai server, siapkan direktori yang akan menjadi tempat menyimpan data (defaultnya adalah /data/db). Jika menginginkan lokasi lain, gunakan argumen \textit{--dbpath} saat menjalankan server sebagai berikut (buat direktorinya jika belum ada): 23 | 24 | \lstset{language=bash,caption=Menjalankan server MongoDB (mongod)} 25 | \lstinputlisting{src/non-nodejs/bab-06/mongodb-run.txt} 26 | 27 | Untuk mengakhiri server, tekan \textit{Ctrl-C}, mongoDB akan mengakhiri server sebagai berikut: 28 | 29 | \lstset{language=bash,caption=Mengakhiri server MongoDB (mongod)} 30 | \lstinputlisting{src/non-nodejs/bab-06/mongodb-stop.txt} 31 | 32 | \subsection{Klien dan Shell mongoDB} 33 | 34 | Setelah server hidup, pemrogram bisa menggunakan antarmuka administrasi web maupun menggunakan shell. \textit{Admin web console} bisa diakses menggunakan port 28017 seperti pada gambar~\ref{fig:mongowebadminconsole}. Sementara itu, untuk mengakses server menggunakan shell, bisa digunakan perintah \textit{mongo} sebagai berikut: 35 | 36 | \lstset{language=bash,caption=Shell mongoDB (mongo)} 37 | \lstinputlisting{src/non-nodejs/bab-06/mongodb-shell.txt} 38 | 39 | \begin{figure} 40 | \begin{center} 41 | \includegraphics[scale=0.5]{images/mongodb-web-interface.jpg} 42 | \end{center} 43 | \caption{Admin web console untuk mongoDB} 44 | \label{fig:mongowebadminconsole} 45 | \end{figure} 46 | 47 | 48 | \subsection{Documents dan Collections} 49 | 50 | Konsep dasar yang harus dipahami dalam mongoDB sebagai \textit{document-oriented database} adalah \textit{documents} dan \textit{collections}. Sama halnya dengan basis data relasional, mongoDB menyimpan data dalam suatu basis data. Di dalam basis data tersebut terdapat \textit{collections} yang bisa diibaratkan seperti tabel dalam basis data relasional. \textit{Collections} digunakan untuk menyimpan dokumen (\textit{documents}). Dalam istilah basis data relasional, \textit{documents} adalah \textit{records}. Kerjakan latihan berikut untuk memahami pengertian dari \textit{documents} dan \textit{collections}. 51 | 52 | \lstset{language=bash,caption=Sesi dalam shell mongoDB} 53 | \lstinputlisting{src/non-nodejs/bab-06/mongodb-shell-session.txt} 54 | 55 | Basis data mongoDB hanya akan dibuat jika sudah dilakukan perintah untuk menyisipkan atau mengisikan data \textit{documents} ke dalam \textit{collections} seperti perintah di atas. 56 | 57 | \section{Node.js dan MongoDB} 58 | 59 | \subsection{Node-gyp} 60 | 61 | \index{Node-gyp}Node-gyp merupakan \textit{native add-on build tool}, berfungsi untuk membantu proses kompilasi modul add-on native di Node.js. Node-gyp merupakan software bebas dan bisa diinstall menggunakan npm: 62 | 63 | \lstset{language=bash,caption=Instalasi node-gyp} 64 | \lstinputlisting{src/non-nodejs/bab-06/install-node-gyp.txt} 65 | 66 | Node-gyp ini diinstall pada lokasi global. Pada materi ini, Node-gyp diperlukan untuk membangun \textit{driver} dari mongoDB sehingga mongoDB bisa diakses oleh Node.js. 67 | 68 | \subsection{Driver Node.js untuk mongoDB} 69 | 70 | \index{mongoDB!Driver}Mengakses mongoDB dari Node.js bisa dilakukan dengan menggunakan driver atau berbagai \textit{wrapper} serta solusi sejenis ORM \textit{Object-Relational Mapping}. Salah satu solusi yang tersedia adalah paket \textbf{mongodb}. 71 | 72 | \lstset{language=bash,caption=Instalasi driver mongoDB} 73 | \lstinputlisting{src/non-nodejs/bab-06/install-paket-mongodb.txt} 74 | 75 | Solusi lain yang bisa digunakan antara lain adalah: 76 | \begin{itemize} 77 | \item Mongoose (\url{http://mongoosejs.com/}) 78 | \item Mongojs (\url{https://github.com/gett/mongojs}) 79 | \item Mongolia (\url{https://github.com/masylum/mongolia}) 80 | \item Mongoskin (\url{https://github.com/kissjs/node-mongoskin}) 81 | \end{itemize} 82 | 83 | \subsection{Mengakses mongoDB dari Node.js} 84 | 85 | Dengan menggunakan \textit{collections} dan \textit{documents} di atas, kita akan mengakses data tersebut menggunakan Node.js. Untuk lebih menyederhanakan, kita akan menggunakan \textit{wrapper} dari mongoDB native driver, yaitu Mongojs. Install Mongojs lebih dahulu menggunakan npm: 86 | 87 | \lstset{language=bash,caption=Instalasi wrapper mongojs} 88 | \lstinputlisting{src/non-nodejs/bab-06/install-paket-mongojs.txt} 89 | 90 | Setelah itu, buat program sesuai dengan listing program berikut. 91 | 92 | \lstset{language=bash,caption=Mengakses mongoDB dari Node.js} 93 | \lstinputlisting{src/bab-06/akses-mongodb.js} 94 | 95 | \section{Aplikasi Web Menggunakan Node.js dan mongoDB} 96 | 97 | Contoh aplikasi web berikut hanya digunakan untuk mengambil data dari mongoDB kemudian menampilkannya di web. Data diambil dari basis data mongoDB yang sudah dibuat sebelumnya (mydb). Untuk keperluan ini, kita akan menggunakan framework Express (\url{http://expressjs.com}). Install Express di level global dengan \textit{npm install -g express}. Setelah terinstall, buat subdirektori baru (lokasi bebas) yang akan digunakan untuk menyimpan aplikasi web. Setelah itu, masuk ke direktori tersebut kemudian buat kerangka aplikasi di subdirektori tersebut menggunakan perintah ``express'' (lihat bab 1). 98 | 99 | Berikut ini adalah beberapa perubahan yang dilakukan untuk rerangka aplikasi yang dihasilkan dari perintah \textit{express} tersebut. 100 | 101 | \lstset{language=JavaScript,caption=Express+MongoDB web: app.js} 102 | \lstinputlisting{src/bab-06/web/app.js} 103 | 104 | \lstset{language=JavaScript,caption=Express+MongoDB web: package.json} 105 | \lstinputlisting{src/bab-06/web/package.json} 106 | 107 | \lstset{language=JavaScript,caption=Express+MonggoDB web: routes/index.js} 108 | \lstinputlisting{src/bab-06/web/routes/index.js} 109 | 110 | Selain itu, ada beberapa tambahan file (routes/employee.js dan views/employee.jade), penghapusan file (routes/user.js), dan perubahan yang cukup signifikan pada file \textit{views/index.jade}. 111 | 112 | \lstset{language=JavaScript,caption=Express+MongoDB web: routes/employee.js} 113 | \lstinputlisting{src/bab-06/web/routes/employee.js} 114 | 115 | \lstset{language=html,caption=Express+MongoDB web: views/employee.jade} 116 | \lstinputlisting{src/bab-06/web/views/employee.jade} 117 | 118 | \lstset{language=html,caption=views/index.jade} 119 | \lstinputlisting{src/bab-06/web/views/index.jade} 120 | -------------------------------------------------------------------------------- /components/bab-07.tex: -------------------------------------------------------------------------------- 1 | \chapter{Pola Arsitektur Aplikasi Web: MVC dan ExpressJS} 2 | 3 | \section{Apa itu Pola Arsitektur?} 4 | 5 | \index{Pola arsitektur}Pola arsitektur (\textit{architectural pattern}) adalah konsep dan standar arsitektur yang membentuk suatu aplikasi. Pola disini mengacu pada \textit{best practices} atau praktik-praktik terbaik yang terutama terkait dengan arsitektur dari software aplikasi. Pola arsitektur terdiri atas elemen-elemen software, properti dari elemen-elemen tersebut, serta hubungan antar elemen-elemen tersebut. 6 | 7 | \section{Pola Arsitektur MVC} 8 | 9 | \index{MVC}MVC (Model-View-Controller) merupakan pola arsitektur aplikasi Web yang memisahkan aplikasi Web menjadi 3 komponen: 10 | \begin{itemize} 11 | \item Model: basis data 12 | \item View: tampilan antarmuka aplikasi Web, biasanya berisi semacam template dan isi-isi dinamis dari tampilan antarmuka tersebut. 13 | \item Controller: menerima \textit{requests} atau permintaan dari browser kemudian mengarahkan ke \textit{event-handler} untuk diproses. Proses tersebut bisa saja berupa langsung menghasilkan view (X)HTML atau format lainnya, atau bisa juga diproses terlebih dahulu di model dan kemudian hasilnya akan dikirimkan ke view untuk diisikan ke isi-isi dinamis serta membentuk file (X)HTML untuk ditampilkan di browser (sebenarnya tidak selalu perlu harus (X)HTML). 14 | \end{itemize} 15 | 16 | Jika digambarkan dalam suatu diagram, pola arsitektur MVC ditampilkan pada gambar~\ref{fig:mvc} 17 | 18 | \begin{figure} 19 | \begin{center} 20 | \includegraphics[scale=0.5]{images/mvc.jpg} 21 | \end{center} 22 | \caption{Pola arsitektur MVC} 23 | \label{fig:mvc} 24 | \end{figure} 25 | 26 | Pola ini dikenal juga dengan istilah Model 2 dan dipopulerkan oleh JavaEE. 27 | 28 | \section{Implementasi Pola Arsitektur MVC Menggunakan ExpressJS} 29 | 30 | \index{MVC!dan ExpressJS}Sebenarnya ExpressJS bukan merupakan \textit{framework} MVC, meskipun demikian karena framework ini sangat fleksibel, maka pemrogram bisa mengatur sendiri lokasi dari file / direktori serta berbagai konfigurasi lainnya. Contoh implementasi disini adalah aplikasi sederhana untuk menampilkan data yang tersimpan dalam basis data mongoDB ke dalam format JSON yang bisa diakses dari browser. 31 | 32 | \subsection{Struktur Aplikasi} 33 | 34 | Setelah membuat kerangka aplikasi menggunakan ExpressJS, ada beberapa perubahan yang harus dilakukan. Perubahan ini terutama dilakukan untuk mengikuti pola arsitektur MVC (terutama peletakan file dan direktori). Pola asli dari kerangka aplikasi ExpressJS adalah sebagai berikut: 35 | 36 | \lstset{language=Bash,caption=Struktur direktori asli aplikasi ExpressJS} 37 | \lstinputlisting{src/non-nodejs/bab-07/express-dir-asli.txt} 38 | 39 | Struktur direktori tersebut akan diubah sesuai dengan pola MVC: 40 | 41 | \lstset{language=Bash,caption=Struktur direktori ExpressJS sesuai pola MVC} 42 | \lstinputlisting{src/non-nodejs/bab-07/express-dir-jadi-mvc.txt} 43 | 44 | Beberapa perubahan terhadap struktur direktori: 45 | \begin{itemize} 46 | \item direktori routes diubah menjadi \textit{controllers} 47 | \item membuat direktori \textit{models} untuk mendefinisikan skema basis data 48 | \end{itemize} 49 | 50 | \subsection{File-file yang Diperlukan} 51 | 52 | Beberapa file diubah isinya dan ada juga file yang baru. 53 | 54 | \lstset{language=JavaScript,caption=app.js} 55 | \lstinputlisting{src/bab-07/app.js} 56 | 57 | \lstset{language=JavaScript,caption=controllers/user.js} 58 | \lstinputlisting{src/bab-07/controllers/user.js} 59 | 60 | \lstset{language=JavaScript,caption=models/db.js} 61 | \lstinputlisting{src/bab-07/models/db.js} 62 | 63 | \lstset{language=JavaScript,caption=package.json} 64 | \lstinputlisting{src/bab-07/package.json} 65 | 66 | \subsection{Hasil} 67 | 68 | Setelah server dieksekusi (menggunakan perintah \textit{node app.js}), maka hasilnya akan bisa diakses di \url{http://localhost:3000/users}. Hasil di browser bisa dilihat di gambar~\ref{fig:hasil-mvc} 69 | 70 | \begin{figure} 71 | \begin{center} 72 | \includegraphics[scale=0.5]{images/mvc-result.jpg} 73 | \end{center} 74 | \caption{Pola arsitektur MVC} 75 | \label{fig:hasil-mvc} 76 | \end{figure} 77 | 78 | \section{Pola Arsitektur Aplikasi Web Lain dan Implementasinya} 79 | 80 | MVC bukan satu-satu pola arsitektur aplikasi Web. Berikut ini adalah beberapa daftar pola arsitektur aplikasi Web serta implementasinya di Node.js dan/atau JavaScript di sisi klien: 81 | \begin{itemize} 82 | \item MVP (Model-View-Presenter): Google GWT. 83 | \item MVVM (Model-View-ViewModel): Batman.js (\url{http://batmanjs.org}) dan Knockout.js (\url{http://knockoutjs.com}) 84 | \item RVP (Resource-View-Presenter): Flatiron (\url{http://flatironjs.org}) 85 | \item MVA (Model-View-Adapter). 86 | \item Hierarchical MVC 87 | \item Presentation-Abstract-Control. 88 | \end{itemize} 89 | -------------------------------------------------------------------------------- /components/bab-08.tex: -------------------------------------------------------------------------------- 1 | \chapter{Real-time Web Menggunakan Socket.io} 2 | 3 | \section{Apa itu Real-time Web?} 4 | 5 | \index{Real-time Web}Real-time Web menunjukkan suatu pola interaksi aplikasi Web yang memungkinkan kedua sisi saling mengirimkan data saat terjadi perubahan, jadi tidak seperti pola interaksi yang menghendaki pemakai untuk me-\textit{refresh} browser jika menginginkan data / informasi / \textit{update} terbaru dari sisi server. Contoh dari real-time Web adalah Facebook dan Twitter. Pemakai akan mendapatkan \textit{update} secara langsung saat terjadi perubahan (komentar baru, pesan masuk, permintaan pertemanan, \textit{retweet}, dan lain-lain), tanpa perlu me-\textit{refresh} halaman. 6 | 7 | \section{Teknologi Pendukung Real-time Web} 8 | 9 | Real-time Web merupakan hal yang relatif kompleks. Terdapat beberapa teknologi yang bisa digunakan untuk mewujudkan real-time Web tersebut. Beberapa diantaranya merupakan standar (atau akan menjadi standar), sedangkan lainnya bukan merupakan standar. 10 | 11 | \subsection{\textit{Ajax Technology}} 12 | 13 | \index{AJAX}Teknologi Ajax (kadang juga ditulis AJAX, singkatan dari \textit{Asynchronous JavaScript and XML} adalah sekumpulan teknologi yang pertama kali dicetuskan oleh Jesse James Garrett. Ajax memungkinkan browser untuk mengirim data dan mengambil data dari server secara \textit{asynchronous} (di latar belakang) tanpa mengganggu keseluruhan tampilan halaman Web. Kumpulan teknologi yang digunakan adalah: 14 | \begin{itemize} 15 | \item (X)HTML dan CSS untuk presentasi halaman Web 16 | \item DOM (\textit{Document Object Model}) untuk menampilkan data secara dinamis 17 | \item XML dan XSLT untuk pertukaran data (seringkali tidak menggunakan XML tetapi JSON). 18 | \item Obyek XMLHttpRequest untuk komunikasi asynchronous 19 | \item JavaScript 20 | \end{itemize} 21 | 22 | \subsection{Comet dan \textit{Push Technology}} 23 | 24 | \index{Comet}Comet merupakan istilah payung yang merangkum berbagai teknologi \textit{push}, yaitu teknologi yang memungkinkan server untuk mengirimkan data ke browser tanpa diminta oleh browser. 25 | 26 | \subsubsection{SSE (\textit{Server-Sent Events})} 27 | 28 | \index{Server-Sent Events}SSE merupakan bagian dari spesifikasi standar HTML5 (bisa diakses di \url{http://dev.w3.org/html5/eventsource/}. Spesifikasi ini memungkinkan server untuk mem-\textit{push} data ke halaman Web menggunakan protokol HTTP. Meski masih dalam pengembangan, tetapi beberapa browser sudah mendukung (misalnya Google Chrome / Chromium) serta Safari. Beberapa peranti pengembangan di sisi server juga sudah mendukung spesifikasi ini. Pada Node.js, pemrogram bisa menggunakan paket sse, nsse, atau EventSource. 29 | 30 | \subsubsection{Bayeux Protocol} 31 | 32 | \index{Bayeux Protocol}Protokol ini dikembangkan oleh \textit{the Dojo Foundation} yang mengembangkan software Dojo Toolkit. Protokol ini digunakan sebagai transport untuk pesan-pesan asynchronous melalui HTTP dengan latensi yang rendah antara klien dengan server. Pesan-pesan tersebut di-rute-kan melalui channel-channel yang diberi nama dan bisa dikirimkan ke: 33 | \begin{itemize} 34 | \item server ke klien 35 | \item klien ke server 36 | \item klien ke klien (melalui server) 37 | \end{itemize} 38 | 39 | Spesifikasi lengkap dari protokol ini bisa dilihat di \url{http://svn.cometd.com/trunk/bayeux/bayeux.html}. 40 | 41 | \subsubsection{BOSH Protocol} 42 | 43 | \index{BOSH}BOSH (Bidirectional-streams Over Synchronous HTTP) adalah protokol transport yang mengemulasi stream dua arah antara dua entitas (misalnya antara klien dengan server) dengan menggunakan banyak HTTP req/resp yang synchronous tanpa memerlukan polling yang sering atau respon yang terpotong-potong. Spesifikasi ini dikembangkan oleh komunitas serta yayasan XMPP dan bisa dilihat secara lengkap di \url{http://xmpp.org/extensions/xep-0124.html} 44 | 45 | \subsection{WebSocket} 46 | 47 | \index{WebSocket}WebSocket merupakan teknologi Web yang menyediakan saluran komunikasi full duplex pada satu koneksi TCP. Protokol WebSocket distandarkan oleh IETF di RFC 6455 sedangkap API (\textit{Application Programming Interface}) dikembangkan dan distandarkan oleh W3C sebagai bagian dari HTML5. Komunikasi antara klien dengan server dilaksanakan menggunakan TCP dengan nomor port 80. 48 | 49 | WebSocket diimplementasikan di sisi server dan klien dan memungkinkan adanya interaksi yang lebih real-time daripada teknologi push karena protokol dan API ini diimplementasikan dan bisa digunakan di sisi klien maupun server. Browser yang sudah mendukung protokol dan API WebSocket ini adalah Chrome, Firefox, Safari, Opera, dan Internet Explorer. 50 | 51 | Perkembangan dari WebSocket bisa dilihat dan diikuti di \url{http://www.websocket.org/} 52 | 53 | \section{Socket.io} 54 | 55 | \subsection{Apa itu Socket.io?} 56 | 57 | \index{Socket.io}\textit{Socket.io} adalah pustaka JavaScript yang merupakan implementasi dari protokol WebSocket serta berbagai improvisasi lain yang diperlukan untuk real-time web (\textit{heartbeats, timeouts}, dan \textit{disconnection}). Protokol transport yang didukung adalah sebagai berikut: 58 | \begin{itemize} 59 | \item WebSocket 60 | \item Adobe Flash Socket 61 | \item AJAX long polling 62 | \item AJAX multipart streaming 63 | \item Forever Iframe 64 | \item JSONP Polling 65 | \end{itemize} 66 | Pustaka ini terdiri atas pustaka untuk sisi klien (browser) dan server (menggunakan Node.js). Browser yang didukung adalah: 67 | \begin{itemize} 68 | \item Internet Explorer 5.5+ (desktop) 69 | \item Safari 3+ (desktop) 70 | \item Google Chrome 4+ (desktop) 71 | \item Firefox 3+ (desktop) 72 | \item Opera 10.61+ (desktop) 73 | \item iPhone Safari (mobile) 74 | \item iPad Safari (mobile) 75 | \item Android WebKit (mobile) 76 | \item WebOs WebKit (mobile) 77 | \end{itemize} 78 | 79 | \subsection{Menggunakan Socket.io untuk Real-time Web} 80 | 81 | Socket.io melibatkan sisi klien dan sisi server. Pada sisi server, paket yang diperlukan adalah cocket.io, sementara untuk sisi klien (browser), diperlukan socket.io-client. Paket socket.io-client tidak diperlukan langsung pada sisi node\_modules, tetapi ada beberapa file yang harus ditempatkan pada akses publik dengan maksud supaya bisa digunakan oleh browser. 82 | 83 | \subsubsection{Tentang Aplikasi} 84 | 85 | Aplikasi ini hanya merupakan contoh kecil dari real-time Web. Aplikasi terdiri atas sisi server dan klien/browser. Pada sisi server, aplikasi ini akan mengirimkan data ke browser (push). Sementara itu, browser akan menerima hasil push tersebut dan menampilkannya kemudian mengirimkan data ke server tanpa perlu melakukan proses \textit{refresh}. Server hanya akan menampilkan data yang dikirimkan browser. 86 | 87 | \subsubsection{Membuat Kerangka Aplikasi dengan ExpressJS} 88 | 89 | Untuk membuat aplikasi ini, kita akan menggunakan ExpressJS dan Socket.io. Pada awalnya, kita akan membuat kerangka aplikasi menggunakan express (jika ExpressJS belum terinstall, install dengan menggunakan \textit{npm install -g express}. Jika sudah terinstall, buat direktori baru, kemudian buatlah kerangka aplikasi menggunakan express pada direktori tersebut: ``express''. 90 | 91 | Pada pembahasan berikutnya, kita akan mengadakan berbagai perubahan yang diperlukan. 92 | 93 | \subsubsection{Instalasi Paket yang Diperlukan} 94 | 95 | File \textit{package.json} berisi beberapa informasi tentang aplikasi ini serta beberapa paket yang diperlukan. Isi dari file ini adalah sebagai berikut: 96 | 97 | \lstset{language=JavaScript,caption=package.json} 98 | \lstinputlisting{src/bab-08/package.json} 99 | 100 | Setelah itu. install paket-paket tersebut dengan menggunakan perintah \textit{npm install} di direktori tersebut. 101 | 102 | \subsubsection{Konfigurasi JavaScript untuk Browser} 103 | 104 | Browser juga memerlukan pustaka untuk Socket.io yang diperoleh dari paket \textit{socket.io-client}. Pada paket tersebut, terdapat direktori \textit{dist}: 105 | 106 | \lstset{language=Bash,caption=Isi direktori dist di socket.io-client} 107 | \lstinputlisting{src/non-nodejs/bab-08/isi-dir-socket-io-client-dist.txt} 108 | 109 | \textit{Copy}-kan file-file tersebut ke direktori \textit{public/javascripts}. 110 | 111 | \subsubsection{Hapus File yang Tidak Diperlukan} 112 | 113 | Ada beberapa file yang tidak diperlukan dan harus dihapus: 114 | \begin{itemize} 115 | \item routes/user.js 116 | \end{itemize} 117 | 118 | \subsubsection{Ubah File-file Tertentu} 119 | 120 | Beberapa file akan diedit. Beberapa diantaranya akan diuraikan di bagian ini. 121 | 122 | \lstset{language=JavaScript,caption=app.js} 123 | \lstinputlisting{src/bab-08/app.js} 124 | 125 | \lstset{language=html,caption=views/index.jade} 126 | \lstinputlisting{src/bab-08/views/index.jade} 127 | 128 | \lstset{language=html,caption=routes/index.js} 129 | \lstinputlisting{src/bab-08/routes/index.js} 130 | 131 | \subsubsection{Menjalankan Server Socket.io} 132 | 133 | Server socket.io menggunakan port 80 sehingga harus dijalankan oleh \textit{root}. 134 | 135 | \lstset{language=Bash,caption=Menjalankan server Socket.io} 136 | \lstinputlisting{src/non-nodejs/bab-08/hasil-di-server.txt} 137 | 138 | Keluaran pada sisi server tersebut merupakan keluaran yang sudah termasuk akses dari browser. Setelah server dijalankan, buka browser kemudian akses URL \url{http://localhost}. Setelah diakses melalui browser, server akan mengirimkan kode sumber HTML sebagai berikut: 139 | 140 | \lstset{language=html,caption=Kode sumber di browser} 141 | \begin{lstlisting} 142 | 143 | 144 | 145 | Contoh Socket.io + Express 146 | 147 | 148 | 149 |

Contoh Socket.io + Express

150 |

Contoh Socket.io + Express

151 | 152 | 161 |
162 |

Contoh Socket.io + Express

163 |
164 | 165 | 166 | \end{lstlisting} 167 | 168 | Tampilan di browser bisa dilihat pada gambar~\ref{fig:socket-io-express} 169 | 170 | \begin{figure} 171 | \begin{center} 172 | \includegraphics[scale=0.5]{images/socket-io-expressjs.jpg} 173 | \end{center} 174 | \caption{Hasil di browser dari ExpressJS + Socket.io} 175 | \label{fig:socket-io-express} 176 | \end{figure} 177 | 178 | Contoh pada materi ini merupakan contoh sederhana, tetapi diharapkan bisa dengan mudah dipahami untuk membuat aplikasi Web real-time. 179 | -------------------------------------------------------------------------------- /components/bibliographies.tex: -------------------------------------------------------------------------------- 1 | \begin{thebibliography}{99} 2 | \addcontentsline{toc}{chapter}{\numberline{}Daftar Pustaka} 3 | 4 | \bibitem{mdn}Anonim, \textit{Mozilla Developer Network - JavaScript}, \url{https://developer.mozilla.org/en-US/docs/JavaScript}. 5 | \bibitem{jsenlightenment}Cody Lindley, \textit{JavaScript Enlightenment}, \url{http://javascriptenlightenment.com}, 2012. 6 | \bibitem{jsdefguide}David Flanagan, \textit{JavaScript: The Definitive Guide}, 4th Edition, O'Reilly, 2001. 7 | \bibitem{jumpstartnodejs}Don Nguyen, \textit{Jump Start Node.js}, SitePoint, 2012. 8 | \bibitem{jsgoodparts}Douglas Crockford, \textit{JavaScript: The Good Parts}, O'Reilly, 2008. 9 | \bibitem{eloquentjs}Marijn Haverbeke, \textit{Eloquent JavaScript: A Modern Introduction to Programming}, No Starch Press, 2011. 10 | \bibitem{learningnode}Shelley Powers, \textit{Learning Node}, O'Reilly, 2012. 11 | \bibitem{nodeuprunning}Tom Hughes-Croucher, Mike Wilson, \textit{Node: Up and Running}, O'Reilly, 2012. 12 | \end{thebibliography} 13 | -------------------------------------------------------------------------------- /components/cover.tex: -------------------------------------------------------------------------------- 1 | \begin{titlepage} 2 | %\begin{titlingpage} 3 | 4 | \begin{center} 5 | 6 | % Upper part of the page 7 | \includegraphics[scale=1]{images/logo-light.png}\\[1cm] 8 | 9 | %\textsc{\Large Sekolah Tinggi Manajemen Informatika dan Komputer 10 | %}\\[0.3cm] 11 | %\textsc{\LARGE AKAKOM}\\[1.5cm] 12 | % 13 | %\textsc{\Large Workshop}\\[0.5cm] 14 | 15 | % Title 16 | \hrule\vspace{5mm} 17 | \noindent 18 | { \huge \bfseries Pengembangan Aplikasi Cloud Computing Menggunakan Node.js}\\[0.4cm] 19 | \hrule\vspace{15mm} 20 | 21 | % Author and supervisor 22 | %\begin{minipage}{0.4\textwidth} 23 | \begin{center} \small 24 | \emph{Oleh:}\\ 25 | \vspace{20mm} 26 | \textsc{Bambang Purnomosidi D. P. (\url{http://bpdp.name})}\\ 27 | \emph{Kontributor:}\\ 28 | \textsc{Aji Kisworo Mukti (\url{http://adzymaniac.web.id})} 29 | \end{center} 30 | 31 | 32 | \includegraphics[scale=1]{images/cc-by-sa.jpg}\\[1cm] 33 | 34 | Buku bebas dengan lisensi Creative Common BY-SA. Silahkan membaca isi selengkapnya serta penjelasannya di \url{http://wiki.creativecommons.org/Licenses/by-sa/3.0LegalText_(Indonesian)} 35 | 36 | \vfill 37 | 38 | % Bottom of the page 39 | {\large \today} 40 | 41 | \end{center} 42 | 43 | \end{titlepage} 44 | %\end{titlingpage} 45 | -------------------------------------------------------------------------------- /components/renew.tex: -------------------------------------------------------------------------------- 1 | \renewcommand{\abstractname}{Kata Pengantar} 2 | \renewcommand{\alsoname}{lihat juga} 3 | \renewcommand{\appendixname}{Lampiran} 4 | \renewcommand{\appendixpagename}{Lampiran} 5 | \renewcommand{\appendixtocname}{Lampiran} 6 | \renewcommand{\bibname}{Daftar Pustaka} 7 | %\renewcommand{\ccname}{tembusan} 8 | \renewcommand{\chaptername}{Bab} 9 | \renewcommand{\contentsname}{Daftar Isi} 10 | %\renewcommand{\enclname}{Terlampir} 11 | \renewcommand{\figurename}{Gambar} 12 | %\renewcommand{\headtoname}{Kepada} 13 | \renewcommand{\indexname}{Indeks} 14 | \renewcommand{\listfigurename}{Daftar Gambar} 15 | \renewcommand{\listtablename}{Daftar Tabel} 16 | %\renewcommand{\pagename}{Halaman} 17 | \renewcommand{\partname}{Bagian} 18 | %\renewcommand{\refname}{Rujukan} 19 | \renewcommand{\seename}{lihat} 20 | \renewcommand{\tablename}{Tabel} 21 | \renewcommand{\lstlistlistingname}{Listing Program} 22 | 23 | \renewcommand{\labelitemi}{$\checkmark$} 24 | \renewcommand{\labelitemii}{$\cdot$} 25 | \renewcommand{\labelitemiii}{$\diamond$} 26 | \renewcommand{\labelitemiv}{$\ast$} 27 | -------------------------------------------------------------------------------- /images/662px-Cloud_computing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/662px-Cloud_computing.png -------------------------------------------------------------------------------- /images/appendixCommitHistory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/appendixCommitHistory.png -------------------------------------------------------------------------------- /images/bpdp-express-hello-update06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/bpdp-express-hello-update06.jpg -------------------------------------------------------------------------------- /images/bpdp-hello-express-update.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/bpdp-hello-express-update.jpg -------------------------------------------------------------------------------- /images/bpdp-hello-express.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/bpdp-hello-express.jpg -------------------------------------------------------------------------------- /images/cc-by-sa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/cc-by-sa.jpg -------------------------------------------------------------------------------- /images/cf-signup-approved.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/cf-signup-approved.jpg -------------------------------------------------------------------------------- /images/cf-signup-hasil.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/cf-signup-hasil.jpg -------------------------------------------------------------------------------- /images/cf-signup.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/cf-signup.jpg -------------------------------------------------------------------------------- /images/hello-noframework.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/hello-noframework.jpg -------------------------------------------------------------------------------- /images/logo-akakom-emas.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/logo-akakom-emas.jpg -------------------------------------------------------------------------------- /images/logo-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/logo-light.png -------------------------------------------------------------------------------- /images/modul1-hello-ganti-runtime.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/modul1-hello-ganti-runtime.jpg -------------------------------------------------------------------------------- /images/modul1-hello-no-framework.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/modul1-hello-no-framework.jpg -------------------------------------------------------------------------------- /images/modul1-hello-update.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/modul1-hello-update.jpg -------------------------------------------------------------------------------- /images/modul1-hello.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/modul1-hello.jpg -------------------------------------------------------------------------------- /images/mongodb-web-interface.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/mongodb-web-interface.jpg -------------------------------------------------------------------------------- /images/mvc-result.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/mvc-result.jpg -------------------------------------------------------------------------------- /images/mvc.dia: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/mvc.dia -------------------------------------------------------------------------------- /images/mvc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/mvc.jpg -------------------------------------------------------------------------------- /images/npm-ls-paket-terinstall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/npm-ls-paket-terinstall.jpg -------------------------------------------------------------------------------- /images/npmls.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/npmls.jpg -------------------------------------------------------------------------------- /images/npmls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/npmls.png -------------------------------------------------------------------------------- /images/socket-io-expressjs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/images/socket-io-expressjs.jpg -------------------------------------------------------------------------------- /notes/latex-tips: -------------------------------------------------------------------------------- 1 | Gambar 2 | ====== 3 | 4 | Di awal: 5 | 6 | \usepackage{graphicx} 7 | 8 | Menggunakan di text: 9 | 10 | ... cake can be seen in Figure~\ref{fig:swtechstack} 11 | 12 | \begin{figure} 13 | \begin{center} 14 | \includegraphics[scale=0.5]{images/layerCake.png} 15 | \end{center} 16 | \caption{Semantic Web technology stack} 17 | \label{fig:swtechstack} 18 | \end{figure} 19 | 20 | Listing program 21 | =============== 22 | 23 | Di awal: 24 | 25 | \usepackage{listings} 26 | ... 27 | ... 28 | \lstset{numbers=left,basicstyle=\scriptsize,numberstyle=\scriptsize,frame=tb,captionpos=b,backgroundcolor=\color{light-gray},showspaces=false,showstringspaces=false} 29 | 30 | Contoh pemakaian: 31 | 32 | \lstset{language=XML,caption=XML declaration for XHTML document} 33 | \begin{lstlisting} 34 | 35 | \end{lstlisting} 36 | 37 | Footnote 38 | ======== 39 | 40 | text\footnote{asdasda} 41 | 42 | Citation 43 | ======== 44 | 45 | di bibliografi: 46 | 47 | \bibitem{infomaproposal}Tim Berners-Lee, \textit{Information Management: A Proposal}, \url{http://www.w3.org/History/1989/proposal.html}, accessed on January 23rd, 2009, 10:21AM. 48 | 49 | di text: 50 | 51 | asdasda~\cite{infomaproposal} 52 | 53 | Index 54 | ===== 55 | 56 | di teks: 57 | 58 | Cloud Computing adalah \index{Cloud Computing} suatu ... 59 | 60 | bagian dari suatu indeks: 61 | 62 | PaaS adalah \index{Cloud Computing!PaaS} suatu ... 63 | 64 | Catatan - box 65 | ============= 66 | \begin{Sbox} 67 | \begin{minipage}{\textwidth} 68 | \textbf{Catatan:} \textit{function(answer)} pada listing di atas merupakan \textit{anonymous function} atau fungsi anonimus (sering juga disebut \textit{lambda function} / fungsi lambda. Posisi fungsi pada listing tersebut disebut dengan fungsi \textit{callback}. Untuk keperluan pembahasan saat ini, untuk sementara yang perlu dipahami adalah hasil input akan dimasukkan ke \textit{answer} untuk diproses lebih lanjut. Fungsi dan \textit{callback} akan dibahas lebih lanjut pada pembahasan berikutnya. 69 | \end{minipage} 70 | \end{Sbox} 71 | \begin{center} 72 | \shadowbox{\TheSbox} 73 | \end{center} 74 | 75 | -------------------------------------------------------------------------------- /src/README.md: -------------------------------------------------------------------------------- 1 | Tentang 2 | ------- 3 | 4 | Bagian ini berisi kode sumber untuk semua pembahasan di buku ini. Direktori non-nodejs adalah direktori untuk menyimpan tampilan-tampilan teks yang diperlukan dalam buku ini. Beberapa bagian mungkin perlu mengupdate dan menginstall modul sebelum bisa dijalankan. Jika perlu, masuk ke direktori yang diinginkan kemudian: 5 | 6 | $ npm update 7 | 8 | Modul-modul yg diperlukan utk modul ini tidak disertakan karena akan memboroskan media penyimpan di repo. 9 | -------------------------------------------------------------------------------- /src/bab-01/hello-no-framework/app.js: -------------------------------------------------------------------------------- 1 | var http = require('http'); 2 | var url = require("url"); 3 | 4 | http.createServer(function (req, res) { 5 | 6 | var pathname = url.parse(req.url).pathname; 7 | 8 | res.writeHead(200, {'Content-Type': 'text/html'}); 9 | res.write("Hello NodeJS " + process.version + ""); 10 | res.write("
Request for " + pathname + " received."); 11 | res.end(); 12 | 13 | }).listen(1337); 14 | -------------------------------------------------------------------------------- /src/bab-01/hello-vanilla/app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Module dependencies. 4 | */ 5 | 6 | var express = require('express') 7 | , routes = require('./routes') 8 | , user = require('./routes/user') 9 | , http = require('http') 10 | , path = require('path'); 11 | 12 | var app = express(); 13 | 14 | // all environments 15 | app.set('port', process.env.PORT || 3000); 16 | app.set('views', __dirname + '/views'); 17 | app.set('view engine', 'jade'); 18 | app.use(express.favicon()); 19 | app.use(express.logger('dev')); 20 | app.use(express.bodyParser()); 21 | app.use(express.methodOverride()); 22 | app.use(app.router); 23 | app.use(express.static(path.join(__dirname, 'public'))); 24 | 25 | // development only 26 | if ('development' == app.get('env')) { 27 | app.use(express.errorHandler()); 28 | } 29 | 30 | app.get('/', routes.index); 31 | app.get('/users', user.list); 32 | 33 | http.createServer(app).listen(app.get('port'), function(){ 34 | console.log('Express server listening on port ' + app.get('port')); 35 | }); 36 | -------------------------------------------------------------------------------- /src/bab-01/hello-vanilla/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hello-node", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node app.js" 7 | }, 8 | "dependencies": { 9 | "express": "3.2.2", 10 | "jade": "*" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/bab-01/hello-vanilla/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } -------------------------------------------------------------------------------- /src/bab-01/hello-vanilla/routes/index.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GET home page. 4 | */ 5 | 6 | exports.index = function(req, res){ 7 | res.render('index', { title: 'Express app at CloudFoundry'}); 8 | }; 9 | -------------------------------------------------------------------------------- /src/bab-01/hello-vanilla/routes/user.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GET users listing. 4 | */ 5 | 6 | exports.list = function(req, res){ 7 | res.send("respond with a resource"); 8 | }; -------------------------------------------------------------------------------- /src/bab-01/hello-vanilla/views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p Welcome to #{title} -------------------------------------------------------------------------------- /src/bab-01/hello-vanilla/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype 5 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content -------------------------------------------------------------------------------- /src/bab-01/hello/app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Module dependencies. 4 | */ 5 | 6 | var express = require('express') 7 | , routes = require('./routes') 8 | , user = require('./routes/user') 9 | , http = require('http') 10 | , path = require('path'); 11 | 12 | var app = express(); 13 | 14 | // all environments 15 | app.set('port', process.env.PORT || 3000); 16 | app.set('views', __dirname + '/views'); 17 | app.set('view engine', 'jade'); 18 | app.use(express.favicon()); 19 | app.use(express.logger('dev')); 20 | app.use(express.bodyParser()); 21 | app.use(express.methodOverride()); 22 | app.use(app.router); 23 | app.use(express.static(path.join(__dirname, 'public'))); 24 | 25 | // development only 26 | if ('development' == app.get('env')) { 27 | app.use(express.errorHandler()); 28 | } 29 | 30 | app.get('/', routes.index); 31 | app.get('/users', user.list); 32 | 33 | http.createServer(app).listen(app.get('port'), function(){ 34 | console.log('Express server listening on port ' + app.get('port')); 35 | }); 36 | -------------------------------------------------------------------------------- /src/bab-01/hello/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hello", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node app.js" 7 | }, 8 | "dependencies": { 9 | "express": "3.2.2", 10 | "jade": "*" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/bab-01/hello/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } -------------------------------------------------------------------------------- /src/bab-01/hello/routes/index.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GET home page. 4 | */ 5 | 6 | exports.index = function(req, res){ 7 | var nv = process.version; 8 | res.render('index', { title: 'Express app at CloudFoundry with Node.js ' + nv}); 9 | }; 10 | -------------------------------------------------------------------------------- /src/bab-01/hello/routes/user.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GET users listing. 4 | */ 5 | 6 | exports.list = function(req, res){ 7 | res.send("respond with a resource"); 8 | }; -------------------------------------------------------------------------------- /src/bab-01/hello/views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p Welcome to #{title} -------------------------------------------------------------------------------- /src/bab-01/hello/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype 5 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content -------------------------------------------------------------------------------- /src/bab-02/array.js: -------------------------------------------------------------------------------- 1 | var arrMembers = ['one','two',,'three',]; 2 | // sengaja ada koma di bagian akhir 3 | console.log(arrMembers[0]); 4 | // hasil: one 5 | console.log(arrMembers[2]); 6 | // hasil: undefined 7 | console.log(arrMembers[3]); 8 | // hasil: three 9 | console.log(arrMembers[4]); 10 | // hasil: undefined - karena tidak ada 11 | console.log(arrMembers.length); 12 | // hasil: 4 13 | var multiArray = [ 14 | ['0-0','0-1','0-2'], 15 | ['1-0','1-1','1-2'], 16 | ['2-0','2-1','2-2']]; 17 | console.log(multiArray[0][2]); 18 | // hasil: 0-2 19 | console.log(multiArray[1][2]); 20 | // hasil: 1-2 21 | -------------------------------------------------------------------------------- /src/bab-02/breakContinue.js: -------------------------------------------------------------------------------- 1 | var n = 0; 2 | var x = 0; 3 | 4 | while (n < 5) { 5 | n ++; 6 | x += n; 7 | 8 | if (x%2 == 0) { 9 | continue; 10 | }; 11 | 12 | if (x>10) { 13 | break; 14 | }; 15 | 16 | console.log("Nilai n = " + n); 17 | console.log("Nilai x = " + x); 18 | 19 | }; 20 | // hasil: 21 | //Nilai n = 1 22 | //Nilai x = 1 23 | //Nilai n = 2 24 | //Nilai x = 3 25 | -------------------------------------------------------------------------------- /src/bab-02/breakWithLabel.js: -------------------------------------------------------------------------------- 1 | topLabel: 2 | for(var k = 0; k < 10; k++){ 3 | for(var m = 0; m < 20; m++){ 4 | if(m == 5){ 5 | console.log("Nilai k = " + k); 6 | console.log("Nilai m = " + m); 7 | break topLabel; 8 | } 9 | } 10 | } 11 | // hasil: 12 | //Nilai k = 0 13 | //Nilai m = 5 14 | -------------------------------------------------------------------------------- /src/bab-02/const.js: -------------------------------------------------------------------------------- 1 | const MENU = "Home"; 2 | 3 | console.log("Posisi menu = " + MENU); 4 | 5 | // mencoba mengisi MENU. berhasil? 6 | 7 | MENU = "About"; 8 | 9 | console.log("Posisi menu = " + MENU); 10 | 11 | // Posisi menu = Home 12 | // Posisi menu = Home 13 | -------------------------------------------------------------------------------- /src/bab-02/doWhile.js: -------------------------------------------------------------------------------- 1 | var i = 0; 2 | do { 3 | i += 2; 4 | console.log(i); 5 | } while (i < 20); 6 | 7 | // hasil: 8 | // 2 9 | // 4 10 | // 6 11 | // 8 12 | // 10 13 | // 12 14 | // 14 15 | // 16 16 | // 18 17 | // 20 18 | -------------------------------------------------------------------------------- /src/bab-02/dynamic.js: -------------------------------------------------------------------------------- 1 | var jumlahMahasiswa = 30 2 | console.log('Jumlah mahasiswa dalam satu kelas = ' + jumlahMahasiswa); 3 | // Jumlah mahasiswa dalam satu kelas = 30 4 | -------------------------------------------------------------------------------- /src/bab-02/for.js: -------------------------------------------------------------------------------- 1 | for (var i = 0; i < 9; i++) { 2 | console.log(i); 3 | } 4 | 5 | // hasil: 6 | // 0 7 | // 1 8 | // 2 9 | // 3 10 | // 4 11 | // 5 12 | // 6 13 | // 7 14 | // 8 15 | -------------------------------------------------------------------------------- /src/bab-02/forIn.js: -------------------------------------------------------------------------------- 1 | var data = {a:1, b:2, c:3}; 2 | 3 | for (var iterasi in data) { 4 | console.log("Nilai dari iterasi " + iterasi + " adalah: " + data[iterasi]); 5 | } 6 | 7 | // hasil: 8 | // Nilai dari iterasi a adalah: 1 9 | // Nilai dari iterasi b adalah: 2 10 | // Nilai dari iterasi c adalah: 3 11 | -------------------------------------------------------------------------------- /src/bab-02/fungsiAnonim.js: -------------------------------------------------------------------------------- 1 | var pangkat = function(angka) {return angka * angka}; 2 | console.log(pangkat(10)); 3 | // output: 100 4 | -------------------------------------------------------------------------------- /src/bab-02/fungsiRekursif.js: -------------------------------------------------------------------------------- 1 | function factorial(n) { 2 | 3 | if ((n == 0) || (n == 1)) 4 | return 1; 5 | else 6 | return (n * factorial(n - 1)); 7 | 8 | } 9 | 10 | console.log("factorial(6) = " + factorial(6)); 11 | 12 | // hasil: 13 | // factorial(6) = 720 14 | -------------------------------------------------------------------------------- /src/bab-02/if.js: -------------------------------------------------------------------------------- 1 | var kondisi = false; 2 | if (kondisi) { 3 | console.log('hanya dikerjakan jika kondisi bernilai benar/true'); 4 | }; 5 | // hasil: n/a, tidak ada hasilnya 6 | var kondisi = true; 7 | if (kondisi) { 8 | console.log('hanya dikerjakan jika kondisi bernilai benar/true'); 9 | }; 10 | // hasil: hanya dikerjakan jika kondisi bernilai benar/true 11 | // Contoh berikut lebih kompleks, melibatkan input 12 | 13 | var readline = require('readline'); 14 | 15 | var rl = readline.createInterface({ 16 | input: process.stdin, 17 | output: process.stdout 18 | }); 19 | 20 | rl.question("Masukkan angka nilai: ", function(answer) { 21 | if (answer > 80) { 22 | console.log("Nilai: A"); 23 | } else if (answer > 70) { 24 | console.log("Nilai: B"); 25 | } else if (answer > 40) { 26 | console.log("Nilai: C"); 27 | } else if (answer > 30) { 28 | console.log("Nilai: D"); 29 | } else { 30 | console.log("Tidak lulus"); 31 | } 32 | rl.close(); 33 | }); 34 | 35 | // hasil: 36 | // hanya dikerjakan jika kondisi bernilai benar/true 37 | // Masukkan angka nilai: 50 38 | // Nilai: C 39 | -------------------------------------------------------------------------------- /src/bab-02/json.js: -------------------------------------------------------------------------------- 1 | var data = { 2 | "firstName": "John", 3 | "lastName": "Smith", 4 | "age": 25, 5 | "address": { 6 | "streetAddress": "21 2nd Street", 7 | "city": "New York", 8 | "state": "NY", 9 | "postalCode": "10021" 10 | }, 11 | "phoneNumber": 12 | { 13 | "home": "212 555-1234", 14 | "fax": "646 555-4567" 15 | } 16 | } 17 | 18 | console.log(data.firstName + " " + data.lastName + 19 | " has this phone number = " 20 | + data.phoneNumber.home ); 21 | 22 | // hasil: 23 | // John Smith has this phone number = 212 555-1234 24 | -------------------------------------------------------------------------------- /src/bab-02/nested.js: -------------------------------------------------------------------------------- 1 | function induk() { 2 | 3 | var awal = 0; 4 | function tambahkan() { 5 | awal++; 6 | } 7 | 8 | tambahkan(); 9 | tambahkan(); 10 | 11 | console.log('Nilai = ' + awal); 12 | 13 | } 14 | 15 | induk(); 16 | tambahkan(); 17 | 18 | // hasil: 19 | // Nilai = 2 20 | // 21 | // /home/bpdp/kerjaan/git-repos/buku-cloud-nodejs/ 22 | // src/bab-02/nested.js:12 23 | // tambahkan(); 24 | // ^ 25 | // ReferenceError: tambahkan is not defined 26 | // at Object. (/home/bpdp/kerjaan/git-repos/ 27 | // buku-cloud-nodejs/src/bab-02/nested.js:12:1) 28 | // at Module._compile (module.js:456:26) 29 | // at Object.Module._extensions..js (module.js:474:10) 30 | // at Module.load (module.js:356:32) 31 | // at Function.Module._load (module.js:312:12) 32 | // at Function.Module.runMain (module.js:497:10) 33 | // at startup (node.js:119:16) 34 | // at node.js:901:3 35 | -------------------------------------------------------------------------------- /src/bab-02/readline.js: -------------------------------------------------------------------------------- 1 | var readline = require('readline'); 2 | 3 | var rl = readline.createInterface({ 4 | input: process.stdin, 5 | output: process.stdout 6 | }); 7 | 8 | rl.question("What do you think of node.js? ", function(answer) { 9 | console.log("Thank you for your valuable feedback:", answer); 10 | rl.close(); 11 | }); 12 | 13 | // hasil: 14 | // $ node readline.js 15 | // What do you think of node.js? awesome! 16 | // Thank you for your valuable feedback: awesome! 17 | // $ 18 | -------------------------------------------------------------------------------- /src/bab-02/switch.js: -------------------------------------------------------------------------------- 1 | var readline = require('readline'); 2 | 3 | var rl = readline.createInterface({ 4 | input: process.stdin, 5 | output: process.stdout 6 | }); 7 | 8 | console.log("Menu"); 9 | console.log("===="); 10 | console.log("1. Mengisi data"); 11 | console.log("2. Mengedit data"); 12 | console.log("3. Menghapus data"); 13 | console.log("4. Mencari data"); 14 | rl.question("Masukkan angka pilihan anda: ", function(answer) { 15 | console.log("Pilihan anda: " + answer); 16 | switch (answer) { 17 | case "1": 18 | console.log("Anda memilih menu pengisian data"); 19 | break; 20 | case "2": 21 | console.log("Anda memilih menu pengeditan data"); 22 | break; 23 | case "3": 24 | console.log("Anda memilih menu penghapusan data"); 25 | break; 26 | case "4": 27 | console.log("Anda memilih menu pencarian data"); 28 | break; 29 | default: 30 | console.log("Anda tidak memilih salah satu dari menu di atas"); 31 | break; 32 | } 33 | rl.close(); 34 | }); 35 | 36 | // hasil: 37 | // $ node switch.js 38 | // Menu 39 | // ==== 40 | // 1. Mengisi data 41 | // 2. Mengedit data 42 | // 3. Menghapus data 43 | // 4. Mencari data 44 | // Masukkan angka pilihan anda: 10 45 | // Pilihan anda: 10 46 | // Anda tidak memilih salah satu dari menu di atas 47 | // $ node switch.js 48 | // Menu 49 | // ==== 50 | // 1. Mengisi data 51 | // 2. Mengedit data 52 | // 3. Menghapus data 53 | // 4. Mencari data 54 | // Masukkan angka pilihan anda: 2 55 | // Pilihan anda: 2 56 | // Anda memilih menu pengeditan data 57 | -------------------------------------------------------------------------------- /src/bab-02/throw.js: -------------------------------------------------------------------------------- 1 | try { 2 | var a = 1/0; 3 | throw "Pembagian oleh angka 0"; 4 | } catch (e) { 5 | console.log ("Error: " + e); 6 | }; 7 | 8 | // hasil: 9 | // Error: Pembagian oleh angka 0 10 | -------------------------------------------------------------------------------- /src/bab-02/try.js: -------------------------------------------------------------------------------- 1 | try { 2 | gakAdaFungsiIni(); 3 | } catch (e) { 4 | console.log ("Error: " + e.message); 5 | } finally { 6 | console.log ("Bagian 'pembersihan', akan dikerjakan, apapun yang terjadi"); 7 | }; 8 | 9 | // hasil: 10 | // Error: gakAdaFungsiIni is not defined 11 | // Bagian 'pembersihan', akan dikerjakan, apapun yang terjadi 12 | -------------------------------------------------------------------------------- /src/bab-02/while.js: -------------------------------------------------------------------------------- 1 | var n = 0; 2 | var x = 0; 3 | 4 | while (n < 5) { 5 | n ++; 6 | x += n; 7 | console.log("Nilai n = " + n); 8 | console.log("Nilai x = " + x); 9 | } 10 | 11 | // hasil: 12 | // Nilai n = 1 13 | // Nilai x = 1 14 | // Nilai n = 2 15 | // Nilai x = 3 16 | // Nilai n = 3 17 | // Nilai x = 6 18 | // Nilai n = 4 19 | // Nilai x = 10 20 | // Nilai n = 5 21 | // Nilai x = 15 22 | -------------------------------------------------------------------------------- /src/bab-03/closure.js: -------------------------------------------------------------------------------- 1 | // Diambil dengan sedikit perubahan dari: 2 | // https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures 3 | function makeAdder(x) { 4 | return function(y) { 5 | return x + y; 6 | }; 7 | } 8 | 9 | var add5 = makeAdder(5); 10 | var add10 = makeAdder(10); 11 | 12 | console.log(add5(2)); // 7 13 | console.log(add10(2)); // 12 14 | -------------------------------------------------------------------------------- /src/bab-03/currying.js: -------------------------------------------------------------------------------- 1 | // Diambil dari: 2 | // http://javascriptweblog.wordpress.com/2010/04/05/ 3 | // curry-cooking-up-tastier-functions/ 4 | // dengan sedikit perubahan 5 | 6 | function toArray(fromEnum) { 7 | return Array.prototype.slice.call(fromEnum); 8 | } 9 | 10 | Function.prototype.curry = function() { 11 | if (arguments.length<1) { 12 | return this; //nothing to curry with - return function 13 | } 14 | var __method = this; 15 | var args = toArray(arguments); 16 | return function() { 17 | return __method.apply(this, args.concat(toArray(arguments))); 18 | } 19 | } 20 | 21 | var add = function(a,b) { 22 | return a + b; 23 | } 24 | 25 | //create function that returns 10 + argument 26 | var addTen = add.curry(10); 27 | console.log(addTen(20)); //30 28 | -------------------------------------------------------------------------------- /src/bab-03/hof.js: -------------------------------------------------------------------------------- 1 | function forEach(array, action) { 2 | for (var i = 0; i < array.length; i++ ) 3 | action(array[i]); 4 | } 5 | 6 | function print(word) { 7 | console.log(word); 8 | } 9 | 10 | function makeUpperCase(word) { 11 | console.log(word.toUpperCase()); 12 | } 13 | 14 | forEach(["satu", "dua", "tiga"], print); 15 | forEach(["satu", "dua", "tiga"], makeUpperCase); 16 | 17 | // hasil: 18 | //satu 19 | //dua 20 | //tiga 21 | //SATU 22 | //DUA 23 | //TIGA 24 | -------------------------------------------------------------------------------- /src/bab-03/inheritance.js: -------------------------------------------------------------------------------- 1 | // Definisi obyek 2 | function Kelas(param) { 3 | this.property1 = new String(param); 4 | } 5 | 6 | Kelas.prototype.methodSatu = function() { 7 | return this.property1; 8 | } 9 | 10 | var kelasSatu = new Kelas("ini parameter 1 dari kelas 1"); 11 | 12 | console.log("Property 1 dari kelasSatu = " + kelasSatu.property1); 13 | console.log("Property 1 dari kelasSatu, diambil dari method = " + kelasSatu.methodSatu()); 14 | 15 | // Definisi inheritance: 16 | // SubKelas merupakan anak dari Kelas yang didefinisikan 17 | // di atas. 18 | 19 | SubKelas.prototype = new Kelas(); 20 | SubKelas.prototype.constructor = SubKelas; 21 | 22 | function SubKelas(param) { 23 | this.property1 = new String(param); 24 | } 25 | 26 | // method overriding 27 | SubKelas.prototype.methodSatu = function(keHurufBesar) { 28 | console.log("Ubah ke huruf besar? = " + keHurufBesar); 29 | if (keHurufBesar) { 30 | return this.property1.toUpperCase(); 31 | } else { 32 | return this.property1.toLowerCase(); 33 | } 34 | } 35 | 36 | SubKelas.prototype.methodDua = function() { 37 | console.log("Berada di method dua dari SubKelas"); 38 | } 39 | 40 | // mari diuji 41 | var subKelasSatu = new SubKelas("Parameter 1 Dari Sub Kelas 1"); 42 | 43 | console.log("Property 1 dari sub kelas 1 = " + subKelasSatu.property1); 44 | console.log("Property 1 dari sub kelas 1, dr method+param = " + subKelasSatu.methodSatu(true)); 45 | console.log("Property 1 dari sub kelas 1, dr method+param = " + subKelasSatu.methodSatu(false)); 46 | 47 | console.log(subKelasSatu.methodDua()); 48 | // hasil: 49 | // 50 | //Property 1 dari kelasSatu = ini parameter 1 dari kelas 1 51 | //Property 1 dari kelasSatu, diambil dari method = ini 52 | //parameter 1 dari kelas 1 53 | //Property 1 dari sub kelas 1 = Parameter 1 Dari Sub Kelas 1 54 | //Ubah ke huruf besar? = true 55 | //Property 1 dari sub kelas 1, dr method+param = 56 | //PARAMETER 1 DARI SUB KELAS 1 57 | //Ubah ke huruf besar? = false 58 | //Property 1 dari sub kelas 1, dr method+param = 59 | //parameter 1 dari sub kelas 1 60 | //Berada di method dua dari SubKelas 61 | -------------------------------------------------------------------------------- /src/bab-03/lambda.js: -------------------------------------------------------------------------------- 1 | // Diambil dari 2 | // http://stackoverflow.com/questions/3865335/what-is-a-lambda-language 3 | // dengan beberapa perubahan 4 | 5 | function applyOperation(a, b, operation) { 6 | return operation(a, b); 7 | } 8 | 9 | function add(a, b) { 10 | return a+b; 11 | } 12 | 13 | function subtract(a, b) { 14 | return a-b; 15 | } 16 | 17 | console.log('1,2, add: ' + applyOperation(1,2, add)); 18 | console.log('43,21, subtract: ' + applyOperation(43,21, subtract)); 19 | 20 | console.log('4^3: ' + applyOperation(4, 3, function(a,b) {return Math.pow(a, b)})) 21 | 22 | // hasil: 23 | // 1,2, add: 3 24 | // 43,21, subtract: 22 25 | // 4^3: 64 26 | -------------------------------------------------------------------------------- /src/bab-03/obyek.js: -------------------------------------------------------------------------------- 1 | var url = require('url'); 2 | 3 | // Definisi obyek 4 | function Halaman(alamatUrl) { 5 | this.url = alamatUrl; 6 | console.log("Mengakses alamat " + alamatUrl); 7 | } 8 | 9 | Halaman.prototype.getDomainName = function() { 10 | return url.parse(this.url, true).host; 11 | } 12 | // sampai disini definisi obyek 13 | // Halaman.prototype.getDomainName => menetapkan method getDomainName 14 | // untuk obyek 15 | 16 | var halSatu = new Halaman("http://nodejs.org/api/http.html"); 17 | var halDua = new Halaman("http://bpdp.name/login?fromHome"); 18 | 19 | console.log("Alamat URL yang diakses oleh halSatu = " + halSatu.url); 20 | console.log("Alamat URL yang diakses oleh halDua = " + halDua.url); 21 | 22 | console.log("Nama domain halDua = " + halDua.getDomainName()); 23 | 24 | // hasil: 25 | // Mengakses alamat http://nodejs.org/api/http.html 26 | // Mengakses alamat http://bpdp.name/login?fromHome 27 | // Alamat URL yang diakses oleh halSatu = http://nodejs.org/api/http.html 28 | // Alamat URL yang diakses oleh halDua = http://bpdp.name/login?fromHome 29 | // Nama domain halDua = bpdp.name 30 | -------------------------------------------------------------------------------- /src/bab-05/asynchronous-callback.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var sys = require('sys'); 3 | 4 | sys.puts('Mulai baca file'); 5 | fs.readFile('./pegawai.json', "utf-8", function(err, data) { 6 | if (err) throw err; 7 | console.log(data); 8 | }) 9 | sys.puts('Baris setelah membaca file'); 10 | 11 | // hasil: 12 | //Mulai baca file 13 | //Baris setelah membaca file 14 | //{ 15 | // "pegawai": [ 16 | // { 17 | // "id": "1", 18 | // "nama": "Zaky", 19 | // "alamat": "Purwomartani" 20 | // }, 21 | // { 22 | // "id": "2", 23 | // "nama": "Ahmad", 24 | // "alamat": "Kalasan" 25 | // }, 26 | // { 27 | // "id": "3", 28 | // "name": "Aditya", 29 | // "alamat": "Sleman" 30 | // } 31 | // ] 32 | //} 33 | -------------------------------------------------------------------------------- /src/bab-05/edp/server-on-error.js: -------------------------------------------------------------------------------- 1 | var net = require('net'); 2 | 3 | var server = net.createServer(function(sock) { 4 | 5 | // Event dan event-handler 6 | // 'data' => jika ada data yang dikirimkan dari klien 7 | sock.on('data', function(data) { 8 | console.log('data ' + sock.remoteAddress + ': ' + data); 9 | }); 10 | 11 | // 'close' => jika koneksi ditutup 12 | sock.on('close', function(data) { 13 | console.log('koneksi ditutup'); 14 | }); 15 | 16 | }); 17 | 18 | server.listen(1337, function() { 19 | console.log('Server aktif di 127.0.0.1:1337'); 20 | }); 21 | 22 | server.on('error', function (e) { 23 | 24 | if (e.code == 'EADDRINUSE') { 25 | console.log('Error: host dan port sudah digunakan.'); 26 | } 27 | 28 | }); 29 | -------------------------------------------------------------------------------- /src/bab-05/edp/server.js: -------------------------------------------------------------------------------- 1 | var http = require('http'); 2 | 3 | http.createServer(function (req, res) { 4 | 5 | res.writeHead(200, {'Content-Type': 'text/plain'}); 6 | res.end('Hello World\n'); 7 | 8 | }).listen(1337, '127.0.0.1'); 9 | 10 | console.log('Server running at http://127.0.0.1:1337/'); 11 | -------------------------------------------------------------------------------- /src/bab-05/pegawai.json: -------------------------------------------------------------------------------- 1 | { 2 | "pegawai": [ 3 | { 4 | "id": "1", 5 | "nama": "Zaky", 6 | "alamat": "Purwomartani" 7 | }, 8 | { 9 | "id": "2", 10 | "nama": "Ahmad", 11 | "alamat": "Kalasan" 12 | }, 13 | { 14 | "id": "3", 15 | "name": "Aditya", 16 | "alamat": "Sleman" 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /src/bab-05/synchronous.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var sys = require('sys'); 3 | 4 | sys.puts('Mulai baca file'); 5 | data = fs.readFileSync('./pegawai.json', "utf-8"); 6 | console.log(data); 7 | sys.puts('Baris setelah membaca file'); 8 | 9 | // hasil: 10 | //Mulai baca file 11 | //{ 12 | // "pegawai": [ 13 | // { 14 | // "id": "1", 15 | // "nama": "Zaky", 16 | // "alamat": "Purwomartani" 17 | // }, 18 | // { 19 | // "id": "2", 20 | // "nama": "Ahmad", 21 | // "alamat": "Kalasan" 22 | // }, 23 | // { 24 | // "id": "3", 25 | // "name": "Aditya", 26 | // "alamat": "Sleman" 27 | // } 28 | // ] 29 | //} 30 | // 31 | //Baris setelah membaca file 32 | -------------------------------------------------------------------------------- /src/bab-06/README.md: -------------------------------------------------------------------------------- 1 | Penjelasan 2 | ========== 3 | 4 | Direktori ini berisi source code dan berbagai file-file lain yang diperlukan. Direktori **data** adalah direktori tempat basis data mongoDB meletakkan datanya (pada implementasinya, ini sebenarnya bebas diletakkan dimana saja). Lihat pada bab 6, kemudian aktifkan server mongoDB dan akses menggunakan client. 5 | 6 | Mengaktifkan server 7 | ------------------- 8 | 9 | ~~~ 10 | $ mkdir data 11 | $ ls -la 12 | total .. 13 | drwxr-xr-x 4 bpdp users 4096 Dec 15 11:00 . 14 | drwxr-xr-x 8 bpdp users 4096 Dec 13 21:31 .. 15 | ... 16 | ... 17 | ... 18 | drwxr-xr-x 2 bpdp users 4096 Dec 12 08:05 data 19 | ... 20 | ... 21 | ... 22 | $ mongod --dbpath ./data --rest 23 | ~~~ 24 | 25 | Mengaktifkan client 26 | ------------------- 27 | 28 | Dari direktori mana saja: 29 | 30 | > $ mongo 31 | 32 | Setelah itu, silahkan kerjakan sesuai dengan bab 6. Setelah selesai mengerjakan, jangan dihapus karena masih digunakan pada pembahasan ExpressJS + mongoDB. 33 | 34 | Penutup 35 | ------- 36 | 37 | Basis data tidak dimasukkan ke repo karena ukurannya yang cukup besar: 38 | 39 | ~~~ 40 | $ ls data/ 41 | total 65548 42 | drwxr-xr-x 2 bpdp users 4096 Dec 12 08:05 . 43 | drwxr-xr-x 4 bpdp users 4096 Dec 15 11:00 .. 44 | -rwxr-xr-x 1 bpdp users 0 Dec 12 12:41 mongod.lock 45 | -rw------- 1 bpdp users 16777216 Dec 11 23:20 mydb.0 46 | -rw------- 1 bpdp users 33554432 Dec 11 22:04 mydb.1 47 | -rw------- 1 bpdp users 16777216 Dec 11 23:20 mydb.ns 48 | ~~~ 49 | 50 | -------------------------------------------------------------------------------- /src/bab-06/akses-mongodb.js: -------------------------------------------------------------------------------- 1 | var databaseUrl = "localhost/mydb"; 2 | var collections = ["employees"]; 3 | var db = require("mongojs").connect(databaseUrl, collections); 4 | 5 | // mencari pegawai bernama Aditya 6 | db.employees.find({name: "Aditya"}, function(err, employees) { 7 | if( err || !employees) console.log("Tidak ada pegawai dengan nama Aditya"); 8 | else employees.forEach( function(emps) { 9 | console.log(emps); 10 | }); 11 | }); 12 | 13 | // menyimpan data pegawai baru: Bambang 14 | db.employees.save({name : "Bambang", address : "Yogyakarta", password: "ealhadalah", 15 | sex: "male"}, function(err, saved) { 16 | if( err || !saved ) console.log("Pegawai 'Bambang' gagal disimpan"); 17 | else console.log("Data pegawai 'Bambang' tersimpan"); 18 | }); 19 | 20 | // mengupdate data pegawai: Ahmad 21 | db.employees.update({name : "Ahmad"}, {$set: {address: "Finlandia"}}, 22 | function(err, updated) { 23 | if( err || !updated ) console.log("Data 'Ahmad' gagal diperbaharui"); 24 | else console.log("Data 'Ahmad' berhasil diperbaharui"); 25 | }); 26 | 27 | // Hasil: 28 | //{ _id: 50c74b79a7f83cba11e6b220, 29 | // name: 'Aditya', 30 | // address: 'Kalasan', 31 | // phone: '08787878787' } 32 | //Data pegawai 'Bambang' tersimpan 33 | //Data 'Ahmad' berhasil diperbaharui 34 | // 35 | // Hasil di db: 36 | //> db.employees.find() 37 | //{ "_id" : ObjectId("50c74b63a7f83cba11e6b21e"), "name" : 38 | //"Zaky", "address" : "Griya Purwa Asri" } 39 | //{ "_id" : ObjectId("50c74b6da7f83cba11e6b21f"), "address" : 40 | //"Finlandia", "email" : "zakyahmadaditya@gmail.com", "name" : "Ahmad" } 41 | //{ "_id" : ObjectId("50c74b79a7f83cba11e6b220"), "name" : 42 | //"Aditya", "address" : "Kalasan", "phone" : "08787878787" } 43 | //{ "name" : "Bambang", "address" : "Yogyakarta", "password" : 44 | //"ealhadalah", "sex" : "male", "_id" : 45 | //ObjectId("50c75d43c111384846000001") } 46 | //> 47 | // 48 | -------------------------------------------------------------------------------- /src/bab-06/data/mongod.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/src/bab-06/data/mongod.lock -------------------------------------------------------------------------------- /src/bab-06/web/app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Module dependencies. 4 | */ 5 | 6 | var express = require('express') 7 | , routes = require('./routes') 8 | , user = require('./routes/employee') 9 | , http = require('http') 10 | , path = require('path'); 11 | 12 | var app = express(); 13 | 14 | // all environments 15 | app.set('port', process.env.PORT || 3000); 16 | app.set('views', __dirname + '/views'); 17 | app.set('view engine', 'jade'); 18 | app.use(express.favicon()); 19 | app.use(express.logger('dev')); 20 | app.use(express.bodyParser()); 21 | app.use(express.methodOverride()); 22 | app.use(app.router); 23 | app.use(express.static(path.join(__dirname, 'public'))); 24 | 25 | // development only 26 | if ('development' == app.get('env')) { 27 | app.use(express.errorHandler()); 28 | } 29 | 30 | app.get('/', routes.index); 31 | app.get('/employees', employee.list); 32 | 33 | http.createServer(app).listen(app.get('port'), function(){ 34 | console.log('Express server listening on port ' + app.get('port')); 35 | }); 36 | -------------------------------------------------------------------------------- /src/bab-06/web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "show-employees", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node app.js" 7 | }, 8 | "dependencies": { 9 | "express": "3.2.2", 10 | "jade": "*", 11 | "mongojs": "latest" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/bab-06/web/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } -------------------------------------------------------------------------------- /src/bab-06/web/routes/employee.js: -------------------------------------------------------------------------------- 1 | i/* 2 | * GET employees listing. 3 | */ 4 | 5 | var databaseUrl = "localhost/mydb"; 6 | var collections = ["employees"]; 7 | var db = require("mongojs").connect(databaseUrl, collections); 8 | 9 | exports.list = function(req, res){ 10 | 11 | // mencari dan menampilkan semua pegawai 12 | db.employees.find(function(err, employees) { 13 | res.render('employee', {listOfEmployee: employees, title: 'Daftar pegawai'}); 14 | }); 15 | 16 | }; 17 | -------------------------------------------------------------------------------- /src/bab-06/web/routes/index.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GET home page. 4 | */ 5 | 6 | exports.index = function(req, res){ 7 | res.render('index', { title: 'Contoh Express+mongoDB' }); 8 | }; 9 | -------------------------------------------------------------------------------- /src/bab-06/web/views/employee.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p #{title} 6 | 7 | each employee in listOfEmployee 8 | p #{employee.name} 9 | -------------------------------------------------------------------------------- /src/bab-06/web/views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p 6 | | Selamat datang di #{title}. Aplikasi ini hanya sekedar contoh 7 | aplikasi web dengan mongoDB sebagai backend. Untuk saat ini hanya 8 | tersedia fasilitas untuk melihat 9 | a(href="/employees") daftar pegawai. 10 | -------------------------------------------------------------------------------- /src/bab-06/web/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype 5 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content -------------------------------------------------------------------------------- /src/bab-07/app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Module dependencies. 4 | */ 5 | 6 | var express = require('express') 7 | , routes = require('./controllers') 8 | , user = require('./controllers/user') 9 | , http = require('http') 10 | , path = require('path'); 11 | 12 | var mongoose = require('mongoose'); 13 | 14 | var app = express(); 15 | 16 | // all environments 17 | app.set('port', process.env.PORT || 3000); 18 | app.set('views', __dirname + '/views'); 19 | app.set('view engine', 'jade'); 20 | app.use(express.favicon()); 21 | app.use(express.logger('dev')); 22 | app.use(express.bodyParser()); 23 | app.use(express.methodOverride()); 24 | app.use(app.router); 25 | app.use(express.static(path.join(__dirname, 'public'))); 26 | 27 | // development only 28 | if ('development' == app.get('env')) { 29 | app.use(express.errorHandler()); 30 | } 31 | 32 | app.get('/', controllers.index); 33 | app.get('/users', user.list); 34 | 35 | http.createServer(app).listen(app.get('port'), function(){ 36 | console.log('Express server listening on port ' + app.get('port')); 37 | }); 38 | -------------------------------------------------------------------------------- /src/bab-07/controllers/index.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * GET home page. 4 | */ 5 | 6 | exports.index = function(req, res){ 7 | res.render('index', { title: 'Express' }); 8 | }; -------------------------------------------------------------------------------- /src/bab-07/controllers/user.js: -------------------------------------------------------------------------------- 1 | /* 2 | * GET employees listing. 3 | */ 4 | 5 | var Employee = require('../models/db.js'); 6 | 7 | exports.list = function(req, res){ 8 | Employee.find(function(err, employees) { 9 | res.send(employees); 10 | }); 11 | }; 12 | -------------------------------------------------------------------------------- /src/bab-07/models/db.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose') 2 | ,Schema = mongoose.Schema; 3 | 4 | var employeeSchema = new Schema({ 5 | name: String, 6 | address: String, 7 | phone: String, 8 | email: String 9 | }); 10 | 11 | module.exports = mongoose.model('Employee', employeeSchema); 12 | -------------------------------------------------------------------------------- /src/bab-07/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-mvc", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node app.js" 7 | }, 8 | "dependencies": { 9 | "express": "latest", 10 | "jade": "*", 11 | "mongoose": "latest" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/bab-07/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } -------------------------------------------------------------------------------- /src/bab-07/views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p Welcome to #{title} -------------------------------------------------------------------------------- /src/bab-07/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype 5 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content -------------------------------------------------------------------------------- /src/bab-08/app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Module dependencies. 4 | */ 5 | 6 | var express = require('express') 7 | , app = express() 8 | , routes = require('./routes') 9 | , http = require('http') 10 | , path = require('path') 11 | , server = http.createServer(app) 12 | , io = require('socket.io').listen(server); 13 | 14 | server.listen(80); 15 | 16 | // all environments 17 | app.set('views', __dirname + '/views'); 18 | app.set('view engine', 'jade'); 19 | app.use(express.favicon()); 20 | app.use(express.logger('dev')); 21 | app.use(express.bodyParser()); 22 | app.use(express.methodOverride()); 23 | app.use(app.router); 24 | app.use(express.static(path.join(__dirname, 'public'))); 25 | 26 | app.get('/', routes.index); 27 | 28 | io.sockets.on('connection', function (socket) { 29 | socket.emit('kirim ke browser', { 30 | kalimatDariServer: 'Kalimat ini dikirim dari server' }); 31 | socket.on('dari browser', function (data) { 32 | console.log(data.kalimatDariBrowser); 33 | }); 34 | }); 35 | -------------------------------------------------------------------------------- /src/bab-08/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "socket.io-expressjs", 3 | "version": "0.0.1", 4 | "author": "Bambang Purnomosidi D. P.", 5 | "private": true, 6 | "scripts": { 7 | "start": "node app" 8 | }, 9 | "dependencies": { 10 | "express": "latest", 11 | "jade": "*", 12 | "socket.io": "latest", 13 | "socket.io-client": "latest" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/bab-08/public/javascripts/WebSocketMain.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/src/bab-08/public/javascripts/WebSocketMain.swf -------------------------------------------------------------------------------- /src/bab-08/public/javascripts/WebSocketMainInsecure.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bpdp/buku-cloud-nodejs/a945b18153450f23fa85b30f2065acb4589320c3/src/bab-08/public/javascripts/WebSocketMainInsecure.swf -------------------------------------------------------------------------------- /src/bab-08/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } -------------------------------------------------------------------------------- /src/bab-08/routes/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * GET home page. 3 | */ 4 | 5 | exports.index = function(req, res){ 6 | res.render('index', { title: 'Contoh Socket.io + Express' }); 7 | }; 8 | -------------------------------------------------------------------------------- /src/bab-08/views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p #{title} 6 | script(src="/javascripts/socket.io.js") 7 | script 8 | var socket = io.connect('http://localhost'); 9 | socket.on('kirim ke browser', function (data) { 10 | document.getElementById("container").innerHTML= 11 | "

" + data.kalimatDariServer + "

"; 12 | socket.emit('dari browser', { 13 | kalimatDariBrowser: 'Kalimat ini dikirim dari browser' }); 14 | }); 15 | #container 16 | p #{title} 17 | -------------------------------------------------------------------------------- /src/bab-08/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype 5 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content -------------------------------------------------------------------------------- /src/non-nodejs/appendix-b/commit.log: -------------------------------------------------------------------------------- 1 | Aji Kisworo Mukti (3): 2 | Bab 5 - Struktur Installasi Paket Node.js 3 | Bab 5 - Installasi Paket 4 | Bab 5 - Menghapus Paket 5 | 6 | Bambang Purnomosidi D. P (77): 7 | Initial commit 8 | First commit - initializing empty repo 9 | Merge branch 'master' of https://github.com/bpdp/buku-cloud-nodejs 10 | Menambahkan link ke teks bahasa Indonesia untuk lisensi CC-BY-SA 11 | Menambahkan link ke teks bahasa Indonesia untuk lisensi CC-BY-SA 12 | Menambahkan link ke teks bahasa Indonesia untuk lisensi CC-BY-SA 13 | Menambahkan tips untuk indeks 14 | Melengkapi bab 1, terutama tentang teori Cloud Computing 15 | kesalahan kecil, tidak menutup textit dengan { tapi | 16 | Menambahkan indeks dari Bab 1 17 | Bab 1 selesai 18 | Bab 2 - bagian REPL selesai 19 | Edit bagian instalasi Flatiron - hasil direktori 20 | Menambahkan tentang penulis buku 21 | Bab 1 - sedikit keterangan ttg Node.js, Bab 2 - awal dasar2 JavaScript 22 | Penambahan isi di bab 2 dan 7 23 | Update bab 5 -> mengubah NPM mjd npm dan menambahkan 'Apakah npm itu?' 24 | Makefile => buat clean-all dan clean-without-pdf, bab 2 selesai Readline 25 | trivial changes 26 | Penambahan di bab 2, menetapkan shadowbox untuk 'catatan' 27 | Bab 2: nilai, tipe data, dan variabel. Menambahkan utk catatan ke tips 28 | Penambahan tentang Literal dan reorganisasi sub bab (fungsi) 29 | Bab 2: Pembahasan 'Fungsi' selesai. 30 | Bab 2 - Literal, selesai 31 | Bab 2 - Pernyataan kondisi if .. else if .. else: selesai 32 | Bab 2 - JSON, switch, dan looping for -- selesai 33 | Memperbaiki sedikit typo, kurang satu { di footnote wikipedia utk JSON 34 | Bab 2 selesai 35 | Bab 3 - pengertian PBO dan definisi obyek -> selesai 36 | Menambahkan Aji Kisworo Mukti ke kontributor di README.md 37 | Minor revision di bab 5, menambahkan gambar npmls (soalnya kode ASCII 38 | keluarannya kacau di LaTex dan saya blm tau workaround-nya 39 | Mengubah cover -> lebih umum, ganti dg logo NodeJS, menambahkan Aji ke 40 | kontributor, appendix B -> commit hist dari kontributor 41 | Menambahkan materi PBO => melengkapi definisi obyek serta inheritance. 42 | Contoh inheritance.js ditambahkan 43 | Bab 3 - Pemrograman fungsional di JS => pengertia + beberapa point yg 44 | akan dibahas 45 | Menambahkan info tentang koma-script di README.md dan Makefile versi 46 | terakhir 47 | Menambahkan nested functions di bab 2 48 | Menambahkan source code nested.js (bab 2) 49 | Bab 3 - beberapa penambahan di pemrograman fungsional 50 | Bab 3 - Lambda Expression + contoh 51 | Higher-order function - Bab 3 52 | Menyelesaikan Closure dan Currying di Bab 3. Bab 3 sudah selesai. 53 | Mengganti struktur - bab 4 -> 5 dan sebaliknya. Bab 4 selesai, Bab 3 54 | minor rev 55 | Bab 5 -> (A)Synchronous programming 56 | Bab 5 -> reorganisasi, minor revision 57 | Bab 5: Event-Driven Programming menggunakan events.EventEmitter. 58 | => Bab 5 selesai 59 | Bab 6: Sedikit penjelasan tentang db NoSQL 60 | Bab 6 - menambahkan penjelasan ttg mongoDB: fitur, server, client web 61 | Bab 6: node-gyp dan instalasi driver mongodb 62 | Bab 6: menambahkan instalasi npm untuk mongodb 63 | Bab 6: install mongojs, akses mongojs dari Node.js. Kurang aplikasi web 64 | Bab 4: menambahkan info ttg install ke homedir (jika berada dlm home) 65 | dan node_modules (jika di luar home) 66 | Bab 6: memulai aplikasi web dengan nodejs+expressjs+mongodb 67 | Bab 6: src code utk aplikasi web nodejs+express+mongoDB selesai 68 | Bab 6 selesai 69 | Reorganisasi bab 7 dan 8, menghapus db mongoDB, menambahkan README.md 70 | utk latihan2 di bab 6 71 | Edit README.md bab 6 72 | Menambah isi bab 7 dan 8 73 | Bab 8: source code utk socket.io 74 | Bab 8 selesai, menambahkan contoh aplikasi Socket.io 75 | Selesai. sedikit pembenahan. hari ini bab 7 dan 8 selesai 76 | Revisi minor bab 6 dan 8 77 | Menambahkan daftar pustaka yang digunakan 78 | Revisi minor di bbrp bab, terutama terkait margin kanan yg terlalu 79 | bablas 80 | Menambahkan indeks 81 | Edit Appendiks B (history commit) dan README.md (menambah status - 82 | buku sudah selesai) 83 | Menambahkan link ke file PDF di README.md 84 | Memperbaharui sesuai dengan versi software terbaru (7 Jan 2013)+kata 85 | pengantar 86 | update README.md untuk merefleksikan kondisi terbaru 87 | Cover: menambah lisensi dan lambang, Bab 1 diubah menyesauikan dgn 88 | Node 0.10.0 dan vmc 0.5.0 89 | Menyesuaikan dengan semua versi software tgl 22 Maret 2013 90 | Menambahkan status di README.md (as of March 22, 2013), memasukkan 91 | commit history 92 | Edit README.md - minor rev 93 | listing dan tampilan2 teks layar skrg diambil dengan \lstinputlisting - 94 | bab 1 selesai 95 | Bab 2 selesai di-migrasi lstinputlisting, rename dir utk konsistensi 96 | di src/ 97 | Mengedit src/README.md agar sesuai kondisi saat ini 98 | Memperbarui semua versi software as of May 6, 2013. Clean up junkies, 99 | typos. Semua source code dan tampilan.txt dipisahkan dari file2 100 | LaTeX utk modularitas 101 | Lihat Changelogs.txt - tanggal 6 Mei 2013 102 | 103 | Bambang Purnomosidi D. P. (1): 104 | Merge pull request #1 from adzymaniac/master 105 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/delete-aplikasi-cf.txt: -------------------------------------------------------------------------------- 1 | $ vmc delete bpdp-m1-hellonoframework 2 | Really delete bpdp-m1-hellonoframework?> y 3 | 4 | Deleting bpdp-m1-hellonoframework... OK 5 | 6 | $ 7 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/deploy-appjs-no-framework.txt: -------------------------------------------------------------------------------- 1 | $ vmc push 2 | Name> hello-noframework 3 | 4 | Instances> 1 5 | 6 | 1: node 7 | 2: other 8 | Framework> node 9 | 10 | 1: node 11 | 2: node06 12 | 3: node08 13 | 4: other 14 | Runtime> 3 15 | 16 | 1: 64M 17 | 2: 128M 18 | 3: 256M 19 | 4: 512M 20 | 5: 1G 21 | Memory Limit> 64M 22 | 23 | Creating hello-noframework... OK 24 | 25 | 1: hello-noframework.cloudfoundry.com 26 | 2: none 27 | URL> hello-noframework.cloudfoundry.com 28 | 29 | Updating hello-noframework... OK 30 | 31 | Create services for application?> n 32 | 33 | Save configuration?> n 34 | 35 | Uploading hello-noframework... OK 36 | Starting hello-noframework... OK 37 | Checking hello-noframework... OK 38 | $ 39 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/deploy-express-cf.txt: -------------------------------------------------------------------------------- 1 | $ vmc push 2 | Name> bpdp-hello-express 3 | 4 | Instances> 1 5 | 6 | 1: node 7 | 2: other 8 | Framework> node 9 | 10 | 1: node 11 | 2: node06 12 | 3: node08 13 | 4: other 14 | Runtime> 3 15 | 16 | 1: 64M 17 | 2: 128M 18 | 3: 256M 19 | 4: 512M 20 | 5: 1G 21 | 6: 2G 22 | Memory Limit> 64M 23 | 24 | Creating bpdp-hello-express... OK 25 | 26 | 1: bpdp-hello-express.cloudfoundry.com 27 | 2: none 28 | Domain> bpdp-hello-express.cloudfoundry.com 29 | 30 | Updating bpdp-hello-express... OK 31 | 32 | Create services for application?> n 33 | 34 | Save configuration?> n 35 | 36 | Uploading bpdp-hello-express... OK 37 | Starting bpdp-hello-express... OK 38 | Checking bpdp-hello-express... 39 | 1/1 instances: 1 running 40 | OK 41 | $ 42 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/deploy-pilih-runtime-cf.txt: -------------------------------------------------------------------------------- 1 | $ vmc push --runtime=node08 2 | Name> bpdp-hello-express06 3 | 4 | Instances> 1 5 | 6 | 1: node 7 | 2: other 8 | Framework> node 9 | 10 | 1: 64M 11 | 2: 128M 12 | 3: 256M 13 | 4: 512M 14 | 5: 1G 15 | Memory Limit> 64M 16 | 17 | Creating bpdp-hello-express06... OK 18 | 19 | 1: bpdp-hello-express06.cloudfoundry.com 20 | 2: none 21 | URL> bpdp-hello-express06.cloudfoundry.com 22 | 23 | Updating bpdp-hello-express06... OK 24 | 25 | Create services for application?> n 26 | 27 | Save configuration?> n 28 | 29 | Uploading bpdp-hello-express06... OK 30 | Starting bpdp-hello-express06... OK 31 | Checking bpdp-hello-express06... OK 32 | $ 33 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/ekstraksi-nodejs.txt: -------------------------------------------------------------------------------- 1 | $ cd 2 | $ cd software 3 | $ tar -xzvf ~/master/nodejs/node-v0.10.5-linux-x86.tar.gz 4 | $ ln -s node-v0.10.5-linux-x86 nodejs 5 | $ ls -la 6 | .... 7 | .... 8 | lrwxrwxrwx 1 bpdp bpdp 22 May 1 07:58 nodejs -> node-v0.10.5-linux-x86 9 | drwxr-xr-x 5 bpdp bpdp 4096 Apr 24 03:31 node-v0.10.5-linux-x86 10 | .... 11 | .... 12 | $ 13 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/express-buat-app.txt: -------------------------------------------------------------------------------- 1 | $ mkdir hello 2 | $ cd hello 3 | $ express 4 | 5 | create : . 6 | create : ./package.json 7 | create : ./app.js 8 | create : ./public 9 | create : ./public/javascripts 10 | create : ./routes 11 | create : ./routes/index.js 12 | create : ./routes/user.js 13 | create : ./public/stylesheets 14 | create : ./public/stylesheets/style.css 15 | create : ./views 16 | create : ./views/layout.jade 17 | create : ./views/index.jade 18 | create : ./public/images 19 | 20 | install dependencies: 21 | $ cd . && npm install 22 | 23 | run the app: 24 | $ node app 25 | 26 | $ 27 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/express-help.txt: -------------------------------------------------------------------------------- 1 | $ express --help 2 | 3 | Usage: express [options] 4 | 5 | Options: 6 | 7 | -h, --help output usage information 8 | -V, --version output the version number 9 | -s, --sessions add session support 10 | -e, --ejs add ejs engine support (defaults to jade) 11 | -J, --jshtml add jshtml engine support (defaults to jade) 12 | -H, --hogan add hogan.js engine support 13 | -c, --css add stylesheet support (less|stylus) (defaults to plain css) 14 | -f, --force force on non-empty directory 15 | 16 | $ 17 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/gem-terinstall.txt: -------------------------------------------------------------------------------- 1 | $ gem list 2 | 3 | *** LOCAL GEMS *** 4 | 5 | addressable (2.3.4) 6 | bigdecimal (1.2.0) 7 | caldecott-client (0.0.2) 8 | cf-uaa-lib (1.3.10) 9 | cfoundry (0.5.2) 10 | clouseau (0.0.2) 11 | interact (0.5.2) 12 | io-console (0.4.2) 13 | json (1.7.7) 14 | json_pure (1.7.7) 15 | manifests-vmc-plugin (0.6.2) 16 | mime-types (1.23) 17 | minitest (4.3.2) 18 | mothership (0.5.1) 19 | multi_json (1.7.2) 20 | multipart-post (1.2.0) 21 | psych (2.0.0) 22 | rake (0.9.6) 23 | rdoc (4.0.0) 24 | rest-client (1.6.7) 25 | rubyzip (0.9.9) 26 | test-unit (2.0.0.0) 27 | tunnel-vmc-plugin (0.2.2) 28 | uuidtools (2.1.4) 29 | vmc (0.5.0) 30 | $ 31 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/hasil-download-nodejs.txt: -------------------------------------------------------------------------------- 1 | 20:30:31-bpdp@bpdp-arch:~/master/nodejs$ ls 2 | total 4672 3 | drwxr-xr-x 2 bpdp bpdp 4096 Apr 26 20:37 . 4 | drwxr-xr-x 46 bpdp bpdp 4096 May 4 23:33 .. 5 | -rw-r--r-- 1 bpdp bpdp 4770726 Apr 24 03:34 node-v0.10.5-linux-x86.tar.gz 6 | 20:30:31-bpdp@bpdp-arch:~/master/nodejs$ 7 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/instalasi-expressjs.txt: -------------------------------------------------------------------------------- 1 | $ npm install -g express 2 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/instalasi-vmc.txt: -------------------------------------------------------------------------------- 1 | $ gem search vmc --remote | grep "\bvmc\s" 2 | vmc (0.5.0) 3 | $ gem install vmc 4 | Fetching: json_pure-1.7.7.gem (100%) 5 | WARNING: You don't have /home/bpdp/.gem/ruby/2.0.0/bin in your PATH, 6 | gem executables will not run. 7 | Successfully installed json_pure-1.7.7 8 | Fetching: multi_json-1.7.2.gem (100%) 9 | Successfully installed multi_json-1.7.2 10 | Fetching: interact-0.5.2.gem (100%) 11 | Successfully installed interact-0.5.2 12 | Fetching: multipart-post-1.2.0.gem (100%) 13 | Successfully installed multipart-post-1.2.0 14 | Fetching: rubyzip-0.9.9.gem (100%) 15 | Successfully installed rubyzip-0.9.9 16 | Fetching: cf-uaa-lib-1.3.10.gem (100%) 17 | Successfully installed cf-uaa-lib-1.3.10 18 | Fetching: cfoundry-0.5.2.gem (100%) 19 | Successfully installed cfoundry-0.5.2 20 | Fetching: clouseau-0.0.2.gem (100%) 21 | Successfully installed clouseau-0.0.2 22 | Fetching: mothership-0.5.1.gem (100%) 23 | Successfully installed mothership-0.5.1 24 | Fetching: manifests-vmc-plugin-0.6.2.gem (100%) 25 | Successfully installed manifests-vmc-plugin-0.6.2 26 | Fetching: addressable-2.3.4.gem (100%) 27 | Successfully installed addressable-2.3.4 28 | Fetching: caldecott-client-0.0.2.gem (100%) 29 | Successfully installed caldecott-client-0.0.2 30 | Fetching: mime-types-1.23.gem (100%) 31 | Successfully installed mime-types-1.23 32 | Fetching: rest-client-1.6.7.gem (100%) 33 | Successfully installed rest-client-1.6.7 34 | Fetching: uuidtools-2.1.4.gem (100%) 35 | Successfully installed uuidtools-2.1.4 36 | Fetching: tunnel-vmc-plugin-0.2.2.gem (100%) 37 | Successfully installed tunnel-vmc-plugin-0.2.2 38 | Fetching: vmc-0.5.0.gem (100%) 39 | Successfully installed vmc-0.5.0 40 | Parsing documentation for json_pure-1.7.7 41 | Installing ri documentation for json_pure-1.7.7 42 | Parsing documentation for multi_json-1.7.2 43 | Installing ri documentation for multi_json-1.7.2 44 | Parsing documentation for interact-0.5.2 45 | Installing ri documentation for interact-0.5.2 46 | Parsing documentation for multipart-post-1.2.0 47 | Installing ri documentation for multipart-post-1.2.0 48 | Parsing documentation for rubyzip-0.9.9 49 | Installing ri documentation for rubyzip-0.9.9 50 | Parsing documentation for cf-uaa-lib-1.3.10 51 | Installing ri documentation for cf-uaa-lib-1.3.10 52 | Parsing documentation for cfoundry-0.5.2 53 | Installing ri documentation for cfoundry-0.5.2 54 | Parsing documentation for clouseau-0.0.2 55 | Installing ri documentation for clouseau-0.0.2 56 | Parsing documentation for mothership-0.5.1 57 | Installing ri documentation for mothership-0.5.1 58 | Parsing documentation for manifests-vmc-plugin-0.6.2 59 | Installing ri documentation for manifests-vmc-plugin-0.6.2 60 | Parsing documentation for addressable-2.3.4 61 | Installing ri documentation for addressable-2.3.4 62 | Parsing documentation for caldecott-client-0.0.2 63 | Installing ri documentation for caldecott-client-0.0.2 64 | Parsing documentation for mime-types-1.23 65 | Installing ri documentation for mime-types-1.23 66 | Parsing documentation for rest-client-1.6.7 67 | Installing ri documentation for rest-client-1.6.7 68 | Parsing documentation for uuidtools-2.1.4 69 | Installing ri documentation for uuidtools-2.1.4 70 | Parsing documentation for tunnel-vmc-plugin-0.2.2 71 | Installing ri documentation for tunnel-vmc-plugin-0.2.2 72 | Parsing documentation for vmc-0.5.0 73 | Installing ri documentation for vmc-0.5.0 74 | Done installing documentation for json_pure, multi_json, 75 | interact, multipart-post, rubyzip, cf-uaa-lib, cfoundry, 76 | clouseau, mothership, manifests-vmc-plugin, addressable, 77 | caldecott-client, mime-types, rest-client, uuidtools, 78 | tunnel-vmc-plugin, vmc (13 sec). 79 | 17 gems installed 80 | $ 81 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/konfigurasi-var-lingkungan-nodejs.txt: -------------------------------------------------------------------------------- 1 | NODEJS_HOME=/home/bpdp/software/nodejs 2 | 3 | PATH=$PATH:$NODEJS_HOME/bin 4 | MANPATH=$MANPATH:$NODEJS_HOME/share/man 5 | LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NODEJS_HOME/lib 6 | C_INCLUDE_PATH=$C_INCLUDE_PATH:$NODEJS_HOME/include 7 | CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$NODEJS_HOME/include 8 | 9 | export PATH 10 | export MANPATH 11 | export LD_LIBRARY_PATH 12 | export C_INCLUDE_PATH 13 | export CPLUS_INCLUDE_PATH 14 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/peringatan-setting-path-vmc.txt: -------------------------------------------------------------------------------- 1 | WARNING: You don't have /home/bpdp/.gem/ruby/2.0.0/bin in your PATH, 2 | gem executables will not run. 3 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/setting-path-vmc.txt: -------------------------------------------------------------------------------- 1 | export PATH=$PATH:/home/bpdp/.gem/ruby/2.0.0/bin 2 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/update-aplikasi-cf.txt: -------------------------------------------------------------------------------- 1 | $ vmc apps 2 | Getting applications... OK 3 | 4 | name status usage runtime url 5 | hello-express running 1 x 64M node08 bpdp-hello-express.cloudfoundry.com 6 | $ vmc push hello-express 7 | Uploading hello-express... OK 8 | Stopping hello-express... OK 9 | 10 | Starting hello-express... OK 11 | Checking hello-express... OK 12 | $ 13 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/vmc-help.txt: -------------------------------------------------------------------------------- 1 | $ vmc help 2 | Showing basic command set. Run with 'help --all' to list all commands. 3 | 4 | Getting Started 5 | target [URL] Set or display the target cloud, organization, and space 6 | logout Log out from the target 7 | login [EMAIL] Authenticate with the target 8 | info Display information on the current target, user, etc. 9 | 10 | Applications 11 | app [APP] Show app information 12 | apps List your applications 13 | 14 | Management 15 | start APPS... Start an application 16 | delete APPS... Delete an application 17 | push [NAME] Push an application, syncing changes if it exists 18 | restart APPS... Stop and start an application 19 | stop APPS... Stop an application 20 | 21 | Services 22 | service SERVICE Show service information 23 | services List your service 24 | 25 | Management 26 | delete-service [SERVICE] Delete a service 27 | bind-service [SERVICE] [APP] Bind a service to an application 28 | create-service [OFFERING] [NAME] Create a service 29 | unbind-service [SERVICE] [APP] Unbind a service from an application 30 | tunnel [INSTANCE] [CLIENT] Create a local tunnel to a service. 31 | 32 | Organizations 33 | org [ORGANIZATION] Show organization information 34 | delete-org [ORGANIZATION] Delete an organization 35 | orgs List available organizations 36 | create-org [NAME] Create an organization 37 | 38 | Spaces 39 | delete-space SPACES... Delete a space and its contents 40 | spaces [ORGANIZATION] List spaces in an organization 41 | create-space [NAME] [ORGANIZATION] Create a space in an organization 42 | space [SPACE] Show space information 43 | 44 | Routes 45 | routes List routes in a space 46 | 47 | Domains 48 | domains [SPACE] List domains in a space 49 | map-domain NAME Map a domain to an organization or space 50 | unmap-domain DOMAIN Unmap a domain from an organization or space 51 | 52 | Options: 53 | --[no-]color Use colorful output 54 | --[no-]script Shortcut for --quiet and --force 55 | --debug Print full stack trace (instead of crash log) 56 | -V, --verbose Print extra information 57 | -f, --[no-]force Skip interaction when possible 58 | -h, --help Show command usage 59 | -m, --manifest FILE Path to manifest file to use 60 | -q, --[no-]quiet Simplify output format 61 | -t, --trace Show API traffic 62 | -u, --proxy EMAIL Run this command as another user (admin) 63 | -v, --version Print version number 64 | $ 65 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/vmc-login-info.txt: -------------------------------------------------------------------------------- 1 | $ vmc login 2 | target: https://api.cloudfoundry.com 3 | 4 | Email> bambangpdp@yahoo.com 5 | 6 | Password> *************** 7 | 8 | Authenticating... OK 9 | $ vmc info --all 10 | Getting runtimes... OK 11 | Getting frameworks... OK 12 | Getting services... OK 13 | 14 | VMware's Cloud Application Platform 15 | 16 | target: https://api.cloudfoundry.com 17 | version: 0.999 18 | support: http://support.cloudfoundry.com 19 | 20 | user: bambangpdp@yahoo.com 21 | 22 | runtime description 23 | java 1.6.0_24 24 | java7 1.7.0_04 25 | node 0.4.12 26 | node06 0.6.8 27 | node08 0.8.2 28 | ruby18 1.8.7p357 29 | ruby19 1.9.2p180 30 | 31 | framework description 32 | grails 33 | java_web 34 | lift 35 | node 36 | play 37 | rack 38 | rails3 39 | sinatra 40 | spring 41 | standalone 42 | 43 | service version provider description 44 | mongodb 2.0 core MongoDB NoSQL database 45 | mysql 5.1 core MySQL database 46 | postgresql 9.0 core PostgreSQL database (vFabric) 47 | rabbitmq 2.4 core RabbitMQ message queue 48 | redis 2.4 core Redis key-value store 49 | redis 2.2 core Redis key-value store 50 | redis 2.6 core Redis key-value store 51 | $ 52 | 53 | 54 | $ vmc login 55 | target: https://api.cloudfoundry.com 56 | 57 | Email> bambangpdp@yahoo.com 58 | 59 | Password> *************** 60 | 61 | Authenticating... OK 62 | 63 | $ vmc info --all 64 | Getting runtimes... OK 65 | Getting frameworks... OK 66 | Getting services... OK 67 | 68 | VMware's Cloud Application Platform 69 | 70 | target: https://api.cloudfoundry.com 71 | version: 0.999 72 | support: http://support.cloudfoundry.com 73 | 74 | user: bambangpdp@yahoo.com 75 | 76 | runtime description 77 | java 1.6.0_24 78 | java7 1.7.0_04 79 | node 0.4.12 80 | node06 0.6.8 81 | node08 0.8.2 82 | ruby18 1.8.7p357 83 | ruby19 1.9.2p180 84 | 85 | framework description 86 | grails 87 | java_web 88 | lift 89 | node 90 | play 91 | rack 92 | rails3 93 | sinatra 94 | spring 95 | standalone 96 | 97 | service version provider description 98 | mongodb 2.0 core MongoDB NoSQL database 99 | mysql 5.1 core MySQL database 100 | postgresql 9.0 core PostgreSQL database (vFabric) 101 | rabbitmq 2.4 core RabbitMQ message queue 102 | redis 2.4 core Redis key-value store 103 | redis 2.6 core Redis key-value store 104 | redis 2.2 core Redis key-value store 105 | $ 106 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/vmc-target-no-conf.txt: -------------------------------------------------------------------------------- 1 | $ vmc target 2 | NoMethodError: undefined method `target' for nil:NilClass 3 | For more information, see ~/.vmc/crash 4 | $ 5 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/vmc-target-with-conf.txt: -------------------------------------------------------------------------------- 1 | $ vmc target 2 | target: https://api.cloudfoundry.com 3 | $ 4 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-01/vmc-ubah-password.txt: -------------------------------------------------------------------------------- 1 | $ vmc passwd 2 | New Password> ************** 3 | 4 | Verify Password> ************** 5 | 6 | Your password strength is: good 7 | Changing password... OK 8 | $ 9 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-02/contoh-fungsi.txt: -------------------------------------------------------------------------------- 1 | $ node 2 | > function addX(angka) { 3 | ... console.log(angka + 10); 4 | ... } 5 | undefined 6 | > addX(20); 7 | 30 8 | undefined 9 | > 10 | > function add2Numbers(angka1, angka2) { 11 | ... return angka1 + angka2; 12 | ... } 13 | undefined 14 | > console.log("232 + 432 = " + add2Numbers(232, 432)); 15 | 232 + 432 = 664 16 | undefined 17 | > 18 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-02/nodejs-repl-load.txt: -------------------------------------------------------------------------------- 1 | $ node 2 | > .load /home/bpdp/kerjaan/src/javascript/nodejs/hello.js 3 | > var http = require('http'); 4 | undefined 5 | > http.createServer(function (req, res) { 6 | ... res.writeHead(200, {'Content-Type': 'text/plain'}); 7 | ... res.end('Hello World\n'); 8 | ... }).listen(1337, '127.0.0.1'); 9 | { domain: null, 10 | _events: 11 | { request: [Function], 12 | connection: [Function: connectionListener], 13 | clientError: [Function] }, 14 | _maxListeners: 10, 15 | _connections: 0, 16 | connections: [Getter/Setter], 17 | _handle: null, 18 | _usingSlaves: false, 19 | _slaves: [], 20 | allowHalfOpen: true, 21 | httpAllowHalfOpen: false, 22 | timeout: 120000 } 23 | > console.log('Server running at http://127.0.0.1:1337/'); 24 | Server running at http://127.0.0.1:1337/ 25 | undefined 26 | > 27 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-02/nodejs-repl-save.txt: -------------------------------------------------------------------------------- 1 | $ node 2 | > console.log("Selamat datang di Node.js") 3 | Selamat datang di Node.js 4 | undefined 5 | > .save /home/bpdp/kerjaan/src/javascript/nodejs/welcome.js 6 | Session saved to:/home/bpdp/kerjaan/src/javascript/nodejs/welcome.js 7 | > $ cat /home/bpdp/kerjaan/src/javascript/nodejs/welcome.js 8 | console.log("Selamat datang di Node.js") 9 | $ 10 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-02/nodejs-repl.txt: -------------------------------------------------------------------------------- 1 | $ node 2 | > .help 3 | .break Sometimes you get stuck, this gets you out 4 | .clear Alias for .break 5 | .exit Exit the repl 6 | .help Show repl options 7 | .load Load JS from a file into the REPL session 8 | .save Save all evaluated commands in this REPL session to a file 9 | > 10 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-02/pemanggilan-fungsi.txt: -------------------------------------------------------------------------------- 1 | .. 2 | .. 3 | namaFungsi(argumen1, argumen2, ..., argumenN); 4 | .. 5 | .. 6 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-02/sintaksis-fungsi.txt: -------------------------------------------------------------------------------- 1 | function namaFungsi(argumen1, argumen2, ... , argumentN) { 2 | .. 3 | JavaScript code .. 4 | JavaScript code .. 5 | JavaScript code .. 6 | JavaScript code .. 7 | .. 8 | } 9 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-04/npm-help.txt: -------------------------------------------------------------------------------- 1 | $ npm --help 2 | 3 | Usage: npm 4 | 5 | where is one of: 6 | add-user, adduser, apihelp, author, bin, bugs, c, cache, 7 | completion, config, ddp, dedupe, deprecate, docs, edit, 8 | explore, faq, find, find-dupes, get, help, help-search, 9 | home, i, info, init, install, isntall, issues, la, link, 10 | list, ll, ln, login, ls, outdated, owner, pack, prefix, 11 | prune, publish, r, rb, rebuild, remove, restart, rm, root, 12 | run-script, s, se, search, set, show, shrinkwrap, star, 13 | stars, start, stop, submodule, tag, test, tst, un, 14 | uninstall, unlink, unpublish, unstar, up, update, version, 15 | view, whoami 16 | 17 | npm -h quick help on 18 | npm -l display full usage info 19 | npm faq commonly asked questions 20 | npm help search for help on 21 | npm help npm involved overview 22 | 23 | Specify configs in the ini-formatted file: 24 | /home/bpdp/.npmrc 25 | or on the command line via: npm --key value 26 | Config info can be viewed via: npm help config 27 | 28 | npm@1.2.18 /home/bpdp/software/node-v0.10.5-linux-x86/lib/node_modules/npm 29 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-04/npm-install.txt: -------------------------------------------------------------------------------- 1 | $ npm install namapaket 2 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-04/npm-ls-paket-blm-terinstall.txt: -------------------------------------------------------------------------------- 1 | $ npm ls 2 | npm WARN package.json hello@0.0.1 No README.md file found! 3 | hello@0.0.1 /home/bpdp/kerjaan/git-repos/buku-cloud-nodejs/src/bab-01/hello 4 | +-- UNMET DEPENDENCY express 3.2.2 5 | +-- UNMET DEPENDENCY jade * 6 | 7 | npm ERR! missing: express@3.2.2, required by hello@0.0.1 8 | npm ERR! missing: jade@*, required by hello@0.0.1 9 | npm ERR! not ok code 0 10 | $ 11 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-04/npm-ls.txt: -------------------------------------------------------------------------------- 1 | $ npm ls 2 | --> untuk melihat pada $CWD 3 | atau 4 | $ npm ls -g 5 | --> untuk melihat pada direktori global 6 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-04/npm-search.txt: -------------------------------------------------------------------------------- 1 | $ npm search sha512 2 | npm http GET https://registry.npmjs.org/-/all/s... 3 | npm http 200 https://registry.npmjs.org/-/all/s... 4 | NAME DESCRIPTION ... 5 | jshashes A fast and independent hashing librar... 6 | krypto High-level crypto library, making the... 7 | passhash Easily and securely hash passwords wi... 8 | pwhash Generate password hashes from the com... 9 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-04/npm-uninstall.txt: -------------------------------------------------------------------------------- 1 | $ npm uninstall namapaket 2 | --> uninstall namapaket di $CWD/node_modules 3 | atau 4 | $ npm uninstall namapaket -g 5 | --> uninstall paket di dir global 6 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-04/npm-update.txt: -------------------------------------------------------------------------------- 1 | $ npm update 2 | --> update paket di $CWD/node_modules 3 | $ npm update -g 4 | --> update paket global 5 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-04/npm-view.txt: -------------------------------------------------------------------------------- 1 | $ npm view arango.client 2 | npm http GET https://registry.npmjs.org/arango.client 3 | npm http 200 https://registry.npmjs.org/arango.client 4 | 5 | { name: 'arango.client', 6 | description: 'ArangoDB javascript client', 7 | 'dist-tags': { latest: '0.5.6' }, 8 | versions: 9 | [ '0.3.1', 10 | '0.3.2', 11 | '0.4.0', 12 | '0.5.0', 13 | '0.5.1', 14 | '0.5.4', 15 | '0.5.6' ], 16 | maintainers: 'kaerus ', 17 | time: 18 | { '0.3.1': '2012-08-09T12:04:34.594Z', 19 | '0.3.2': '2012-08-09T12:49:02.322Z', 20 | '0.4.0': '2012-09-17T10:44:43.187Z', 21 | '0.5.0': '2012-10-01T14:51:32.668Z', 22 | '0.5.1': '2012-10-03T22:11:58.376Z', 23 | '0.5.4': '2012-10-16T09:45:37.477Z', 24 | '0.5.6': '2012-10-26T17:34:28.491Z' }, 25 | author: 'Kaerus (http://kaerus.com)', 26 | repository: 27 | { type: 'git', 28 | url: 'git://github.com/kaerus/arango-client.git' }, 29 | version: '0.5.6', 30 | keywords: 31 | [ 'arangodb', 32 | 'nosql', 33 | 'qunit', 34 | 'amd' ], 35 | contributors: 'anders elo ', 36 | dependencies: { amdefine: '>=0.0.2' }, 37 | devDependencies: { requirejs: '>=2.0.6' }, 38 | bugs: { url: 'https://github.com/kaerus/arango-client/issues' }, 39 | main: 'index.js', 40 | license: 'MIT', 41 | dist: 42 | { shasum: '48279e7cf9ea0b4b6766f09671224c46d6e716b0', 43 | tarball: 'http://registry.npmjs.org/arango.client/-/arango.client-0.5.6.tgz' }, 44 | directories: {} } 45 | 46 | $ 47 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-06/install-node-gyp.txt: -------------------------------------------------------------------------------- 1 | $ npm install -g node-gyp 2 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-06/install-paket-mongodb.txt: -------------------------------------------------------------------------------- 1 | $ npm install mongodb 2 | npm http GET https://registry.npmjs.org/mongodb 3 | npm http 200 https://registry.npmjs.org/mongodb 4 | npm http GET https://registry.npmjs.org/mongodb/-/mongodb-1.3.0.tgz 5 | npm http 200 https://registry.npmjs.org/mongodb/-/mongodb-1.3.0.tgz 6 | npm http GET https://registry.npmjs.org/kerberos 7 | npm http GET https://registry.npmjs.org/bson/0.1.8 8 | npm http 200 https://registry.npmjs.org/kerberos 9 | npm http GET https://registry.npmjs.org/kerberos/-/kerberos-0.0.2.tgz 10 | npm http 200 https://registry.npmjs.org/bson/0.1.8 11 | npm http GET https://registry.npmjs.org/bson/-/bson-0.1.8.tgz 12 | npm http 200 https://registry.npmjs.org/kerberos/-/kerberos-0.0.2.tgz 13 | npm http 200 https://registry.npmjs.org/bson/-/bson-0.1.8.tgz 14 | 15 | > kerberos@0.0.2 install /home/bpdp/kerjaan/git-repos/buku-cloud-nodejs/ 16 | src/bab-06/node_modules/mongodb/node_modules/kerberos 17 | > (node-gyp rebuild 2> builderror.log) || (exit 0) 18 | 19 | 20 | > bson@0.1.8 install /home/bpdp/kerjaan/git-repos/buku-cloud-nodejs/src/ 21 | bab-06/node_modules/mongodb/node_modules/bson 22 | > (node-gyp rebuild 2> builderror.log) || (exit 0) 23 | 24 | mongodb@1.3.0 node_modules/mongodb 25 | +-- bson@0.1.8 26 | +-- kerberos@0.0.2 27 | $ 28 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-06/install-paket-mongojs.txt: -------------------------------------------------------------------------------- 1 | $ npm install mongojs 2 | npm http GET https://registry.npmjs.org/mongojs 3 | npm http 200 https://registry.npmjs.org/mongojs 4 | npm http GET https://registry.npmjs.org/mongojs/-/mongojs-0.7.4.tgz 5 | npm http 200 https://registry.npmjs.org/mongojs/-/mongojs-0.7.4.tgz 6 | npm http GET https://registry.npmjs.org/readable-stream 7 | npm http GET https://registry.npmjs.org/thunky 8 | npm http 200 https://registry.npmjs.org/readable-stream 9 | npm http 200 https://registry.npmjs.org/thunky 10 | mongojs@0.7.4 node_modules/mongojs 11 | +-- thunky@0.1.0 12 | +-- readable-stream@1.0.2 13 | $ 14 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-06/mongodb-run.txt: -------------------------------------------------------------------------------- 1 | $ mkdir data 2 | $ mongod --rest --dbpath ./data 3 | Sun May 5 22:47:05.495 4 | Sun May 5 22:47:05.495 warning: 32-bit servers don't have journaling 5 | enabled by default. Please use --journal if you want durability. 6 | Sun May 5 22:47:05.495 7 | Sun May 5 22:47:05.581 [initandlisten] MongoDB starting : pid=2994 8 | port=27017 dbpath=./data 32-bit host=bpdp-arch 9 | Sun May 5 22:47:05.581 [initandlisten] 10 | Sun May 5 22:47:05.581 [initandlisten] ** NOTE: This is a 32 bit 11 | MongoDB binary. 12 | Sun May 5 22:47:05.581 [initandlisten] ** 32 bit builds are 13 | limited to less than 2GB of data (or less with --journal). 14 | Sun May 5 22:47:05.581 [initandlisten] ** Note that journaling 15 | defaults to off for 32 bit and is currently off. 16 | Sun May 5 22:47:05.581 [initandlisten] ** See 17 | http://dochub.mongodb.org/core/32bit 18 | Sun May 5 22:47:05.581 [initandlisten] 19 | Sun May 5 22:47:05.581 [initandlisten] db version v2.4.4-pre- 20 | Sun May 5 22:47:05.581 [initandlisten] git version: nogitversion 21 | Sun May 5 22:47:05.581 [initandlisten] build info: Linux fyan 22 | 3.8.3-2-ARCH #1 SMP PREEMPT Sun Mar 17 13:04:22 CET 2013 23 | i686 BOOST_LIB_VERSION=1_53 24 | Sun May 5 22:47:05.581 [initandlisten] allocator: system 25 | Sun May 5 22:47:05.581 [initandlisten] options: { dbpath: 26 | "./data", rest: true } 27 | Sun May 5 22:47:05.789 [FileAllocator] allocating new datafile 28 | ./data/local.ns, filling with zeroes... 29 | Sun May 5 22:47:05.790 [FileAllocator] creating directory 30 | ./data/_tmp 31 | Sun May 5 22:47:05.997 [FileAllocator] done allocating datafile 32 | ./data/local.ns, size: 16MB, took 0.088 secs 33 | Sun May 5 22:47:05.998 [FileAllocator] allocating new datafile 34 | ./data/local.0, filling with zeroes... 35 | Sun May 5 22:47:06.086 [FileAllocator] done allocating datafile 36 | ./data/local.0, size: 16MB, took 0.088 secs 37 | Sun May 5 22:47:06.091 [initandlisten] command local.$cmd command: 38 | { create: "startup_log", size: 10485760, capped: true } 39 | ntoreturn:1 keyUpdates:0 reslen:37 301ms 40 | Sun May 5 22:47:06.093 [initandlisten] waiting for connections 41 | on port 27017 42 | Sun May 5 22:47:06.093 [websvr] admin web console waiting for 43 | connections on port 28017 44 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-06/mongodb-shell-session.txt: -------------------------------------------------------------------------------- 1 | $ mongo 2 | MongoDB shell version: 2.4.4-pre 3 | connecting to: test 4 | ... 5 | ... [ jgn pedulikan warning ini ] 6 | ... 7 | ... 8 | > db 9 | test 10 | > use mydb 11 | switched to db mydb 12 | > show dbs 13 | local (empty) 14 | > emp1 = { name : "Zaky", address : "Griya Purwa Asri" } 15 | { "name" : "Zaky", "address" : "Griya Purwa Asri" } 16 | > emp2 = { name : "Ahmad", address : "Purwomartani", email : "zakyahmadaditya@gmail.com" } 17 | { 18 | "name" : "Ahmad", 19 | "address" : "Purwomartani", 20 | "email" : "zakyahmadaditya@gmail.com" 21 | } 22 | > emp3 = { name : "Aditya", address : "Kalasan", phone: "08787878787" } 23 | { "name" : "Aditya", "address" : "Kalasan", "phone" : "08787878787" } 24 | > db.employees.insert( emp1 ) 25 | > db.employees.insert( emp2 ) 26 | > db.employees.insert( emp3 ) 27 | > show dbs 28 | local (empty) 29 | mydb 0.0625GB 30 | > db 31 | mydb 32 | > show collections 33 | employees 34 | system.indexes 35 | > db.employees.find() 36 | { "_id" : ObjectId("50c74b63a7f83cba11e6b21e"), "name" : "Zaky", "address" : 37 | "Griya Purwa Asri" } 38 | { "_id" : ObjectId("50c74b6da7f83cba11e6b21f"), "name" : "Ahmad", "address" : 39 | "Purwomartani", "email" : "zakyahmadaditya@gmail.com" } 40 | { "_id" : ObjectId("50c74b79a7f83cba11e6b220"), "name" : "Aditya", "address" : 41 | "Kalasan", "phone" : "08787878787" } 42 | > db.employees.find( {name : "Ahmad"} ) 43 | { "_id" : ObjectId("50c74b6da7f83cba11e6b21f"), "name" : "Ahmad", "address" : 44 | "Purwomartani", "email" : "zakyahmadaditya@gmail.com" } 45 | > db.employees.findOne() 46 | { 47 | "_id" : ObjectId("50c74b63a7f83cba11e6b21e"), 48 | "name" : "Zaky", 49 | "address" : "Griya Purwa Asri" 50 | } 51 | > db.employees.find().limit(2) 52 | { "_id" : ObjectId("50c74b63a7f83cba11e6b21e"), "name" : "Zaky", "address" : 53 | "Griya Purwa Asri" } 54 | { "_id" : ObjectId("50c74b6da7f83cba11e6b21f"), "name" : "Ahmad", "address" : 55 | "Purwomartani", "email" : "zakyahmadaditya@gmail.com" } 56 | > 57 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-06/mongodb-shell.txt: -------------------------------------------------------------------------------- 1 | mongo 2 | MongoDB shell version: 2.4.4-pre- 3 | connecting to: test 4 | Server has startup warnings: 5 | Sun May 5 22:56:00.015 [initandlisten] 6 | Sun May 5 22:56:00.015 [initandlisten] ** NOTE: This is 7 | a 32 bit MongoDB binary. 8 | Sun May 5 22:56:00.015 [initandlisten] ** 32 bit 9 | builds are limited to less than 2GB of data (or less 10 | with --journal). 11 | Sun May 5 22:56:00.015 [initandlisten] ** Note that 12 | journaling defaults to off for 32 bit and is currently off. 13 | Sun May 5 22:56:00.015 [initandlisten] ** See 14 | http://dochub.mongodb.org/core/32bit 15 | Sun May 5 22:56:00.015 [initandlisten] 16 | > 17 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-06/mongodb-stop.txt: -------------------------------------------------------------------------------- 1 | ^CSun May 5 22:52:52.344 [signalProcessingThread] got 2 | signal 2 (Interrupt), will terminate after current cmd ends 3 | Sun May 5 22:52:52.345 [signalProcessingThread] now exiting 4 | Sun May 5 22:52:52.345 dbexit: 5 | Sun May 5 22:52:52.345 [signalProcessingThread] shutdown: 6 | going to close listening sockets... 7 | Sun May 5 22:52:52.345 [signalProcessingThread] closing 8 | listening socket: 7 9 | Sun May 5 22:52:52.345 [signalProcessingThread] closing 10 | listening socket: 8 11 | Sun May 5 22:52:52.345 [signalProcessingThread] closing 12 | listening socket: 9 13 | Sun May 5 22:52:52.345 [signalProcessingThread] removing 14 | socket file: /tmp/mongodb-27017.sock 15 | Sun May 5 22:52:52.345 [signalProcessingThread] shutdown: 16 | going to flush diaglog... 17 | Sun May 5 22:52:52.345 [signalProcessingThread] shutdown: 18 | going to close sockets... 19 | Sun May 5 22:52:52.345 [signalProcessingThread] shutdown: 20 | waiting for fs preallocator... 21 | Sun May 5 22:52:52.345 [signalProcessingThread] shutdown: 22 | closing all files... 23 | Sun May 5 22:52:52.345 [signalProcessingThread] closeAllFiles() 24 | finished 25 | Sun May 5 22:52:52.346 [signalProcessingThread] shutdown: 26 | removing fs lock... 27 | Sun May 5 22:52:52.346 dbexit: really exiting now 28 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-07/express-dir-asli.txt: -------------------------------------------------------------------------------- 1 | $ tree . 2 | . 3 | |-- app.js 4 | |-- package.json 5 | |-- public 6 | | |-- images 7 | | |-- javascripts 8 | | `-- stylesheets 9 | | `-- style.css 10 | |-- routes 11 | | |-- index.js 12 | | `-- user.js 13 | `-- views 14 | |-- index.jade 15 | `-- layout.jade 16 | 17 | 6 directories, 7 files 18 | $ 19 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-07/express-dir-jadi-mvc.txt: -------------------------------------------------------------------------------- 1 | $ tree . 2 | . 3 | +-- app.js 4 | |-- controllers 5 | | +-- index.js 6 | | +-- user.js 7 | |-- models 8 | | +-- db.js 9 | |-- package.json 10 | |-- public 11 | | +-- images 12 | | |-- javascripts 13 | | +-- stylesheets 14 | | +-- style.css 15 | +-- views 16 | +-- index.jade 17 | +-- layout.jade 18 | 19 | 7 directories, 8 files 20 | $ 21 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-08/hasil-di-server.txt: -------------------------------------------------------------------------------- 1 | info - socket.io started 2 | GET / 200 141ms - 628b 3 | GET /stylesheets/style.css 304 3ms 4 | GET /javascripts/socket.io.js 200 9ms - 98.85kb 5 | debug - client authorized 6 | info - handshake authorized LOoIlHJJjOl1g34JtLnP 7 | debug - setting request GET /socket.io/1/websocket/LOoIlHJJjOl1g34JtLnP 8 | debug - set heartbeat interval for client LOoIlHJJjOl1g34JtLnP 9 | debug - client authorized for 10 | debug - websocket writing 1:: 11 | debug - websocket writing 5:::{"name":"kirim ke browser","args": 12 | [{"kalimatDariServer":"Kalimat ini dikirim dari server"}]} 13 | Kalimat ini dikirim dari browser 14 | GET / 200 4ms - 628b 15 | info - transport end (socket end) 16 | debug - set close timeout for client LOoIlHJJjOl1g34JtLnP 17 | debug - cleared close timeout for client LOoIlHJJjOl1g34JtLnP 18 | debug - cleared heartbeat interval for client LOoIlHJJjOl1g34JtLnP 19 | debug - discarding transport 20 | GET /stylesheets/style.css 304 1ms 21 | GET /javascripts/socket.io.js 304 1ms 22 | debug - client authorized 23 | info - handshake authorized ijvgksAoa-BWm7uytLnQ 24 | debug - setting request GET /socket.io/1/websocket/ijvgksAoa-BWm7uytLnQ 25 | debug - set heartbeat interval for client ijvgksAoa-BWm7uytLnQ 26 | debug - client authorized for 27 | debug - websocket writing 1:: 28 | debug - websocket writing 5:::{"name":"kirim ke browser","args": 29 | [{"kalimatDariServer":"Kalimat ini dikirim dari server"}]} 30 | Kalimat ini dikirim dari browser 31 | debug - emitting heartbeat for client ijvgksAoa-BWm7uytLnQ 32 | debug - websocket writing 2:: 33 | debug - set heartbeat timeout for client ijvgksAoa-BWm7uytLnQ 34 | debug - got heartbeat packet 35 | debug - cleared heartbeat timeout for client ijvgksAoa-BWm7uytLnQ 36 | debug - set heartbeat interval for client ijvgksAoa-BWm7uytLnQ 37 | 38 | -------------------------------------------------------------------------------- /src/non-nodejs/bab-08/isi-dir-socket-io-client-dist.txt: -------------------------------------------------------------------------------- 1 | $ ls -la node_modules/socket.io-client/dist/ 2 | total 496 3 | drwxr-xr-x 2 bpdp bpdp 4096 May 6 00:00 . 4 | drwxr-xr-x 7 bpdp bpdp 4096 May 6 00:01 .. 5 | -rw-r--r-- 1 bpdp bpdp 101222 Nov 2 2012 socket.io.js 6 | -rw-r--r-- 1 bpdp bpdp 44789 Nov 2 2012 socket.io.min.js 7 | -rw-r--r-- 1 bpdp bpdp 175953 Mar 28 2012 WebSocketMainInsecure.swf 8 | -rw-r--r-- 1 bpdp bpdp 175830 Mar 28 2012 WebSocketMain.swf 9 | $ 10 | --------------------------------------------------------------------------------