≡ Menu

How-to paling Cepat Memulai ClojureScript

Tutorial ini diasumsikan memakai mesin mac atau linux, windows menyusul (jika ada request).

1. Install clojure!

Mac

brew install clojure

Linux

curl -O https://download.clojure.org/install/linux-install-1.9.0.381.sh
chmod +x linux-install-1.9.0.381.sh
sudo ./linux-install-1.9.0.381.sh

2. Bikin direktori seperti:

.
├── deps.edn
└── src
    └── app
        └── main.cljs

deps.edn:

{:deps {org.clojure/clojure       {:mvn/version "1.9.0"}
        org.clojure/clojurescript {:mvn/version "1.10.238"}
        reagent                   {:mvn/version "0.8.1"}

*By the way, reagent sebenarnya gak perlu!, di sini saya cuma ingin sekaligus demo gampangnya pake React di ClojureScript

main.cljs:

(ns app.main
  (:require [cljsjs.material-ui]
            [cljsjs.material-ui-svg-icons]
            [reagent.core :as r]))
 
(enable-console-print!)
 
(println "Hello from cljs-main")

2. Run Clojure!:

clj --main cljs.main --watch src --compile app.main --repl

Perintah di atas akan meng-compile namespace app.main ke javascript dan membuka ClojureScript repl. Untuk menutupnya gunakan CMD+D atau CTRL+D. Sampai di sini, seharunya windows baru muncul. Perhatikan dev console, ada log “Hello from cljs-main”.

Tambahkan index.html dengan tag <div id="app"></div> se-level dengan deps.edn, lalu masukan kode di bawah di bagian paling bawah main.cljs.

(r/render [:h1 "Hello ClojureScript!"]
         (js/document.getElementById "app"))

Restart clojure, windows yang muncul selanjutnya akan berubah. Perhatikan, kalau kode [:h1 "Hello ClojureScript!"] adalah JSX react component, yang di wrap dalam tag <h1>.

That’s it!

{ 2 comments }

Up and Running Datomic Starter

The recipe:
1. datomic-pro. Download lewat

https://my.datomic.com/downloads/pro

2. datomic console. Download at

https://my.datomic.com/downloads/console

3. MusicBrainz sample database. Download at

http://s3.amazonaws.com/mbrainz/datomic-mbrainz-backup-20130611.tar

[click to continue…]

{ 2 comments }
Transducer

Sudah lebih dari seminggu, saya benar-benar tertarik dengan om.next. om.next adalah react wraper untuk clojurescript. Ketika saya mengikuti tutorial om.next, ada satu baris kode yang membuat saya bingung. Saya benar-benar bingung!

(defn get-people [state key]
  (let [st @state]
    (into [] (map #(get-in st %)) (get st key))))

Saya pikir kode pada baris ke-3 salah, (map #(get-in st %)), ternyata saya yang keliru. Selama ini form dari map yang saya tahu adalah (map f data ..). Ketika buka kembali dokumentasi dari map:

Usage: (map f)
       (map f coll)
       (map f c1 c2)
       (map f c1 c2 c3)
       (map f c1 c2 c3 & colls)

Kode (map #(get-in st %)) adalah kode yang valid untuk form (map f). Ketika saya invoke kode ini me-return fungsi transducer?????

The hack is transducer?! [click to continue…]

{ 0 comments }

Dive in Clojure: partial

Pertamanya agak bingung dengan fungsi partial ini, tapi setelah ketemu contoh praktikalnya jadi Ngeh kenapa fungsi partial ada.

Menurut clojuredocs:

Takes a function f and fewer than the normal arguments to f, and returns a fn that takes a variable number of additional args. When called, the returned function calls f with args + additional args.

Fungsi partial digunakan ketika kita sudah tahu fungsi apa yang harus kita gunakan, tetapi argumennya belum siap. [click to continue…]

{ 1 comment }

Operasi Dasar Java

Java logo

Arithmetic Operators

Operator Description
+ Addition operator – Adds operands on both sides of the operator
Subtraction operator – Subtracts the right hand operand from the left hand operand
* Multiplication operator – Multiplies operands on both sides of the operator
/ Division operator – Divides the left hand operand by the right hand operand
% Modulus operator – Divides the left hand operand by the right hand operand and returns remainder
++ Increment operator – Increases the value of operand by 1
Decrement operator – Decreases the value of operand by 1

Relational Operators

Operator Description
== Checks if the values of the two operands are equal or not, if yes then the condition becomes true.
!= Checks if the values of the two operands are equal or not, if values are not equal then the condition becomes true
> Checks if the value of the left operand is greater than the value of the right operand, if yes then the condition becomes true.
< Checks if the value of the left operand is less than the value of the right operand, if yes then the condition becomes true.
>= Checks if the value of the left operand is greater than or equal to the value of the right operand, if yes then the condition becomes true.
<= Checks if the value of the left operand is less than or equal to the value of the right operand, if yes then the condition becomes true.

Logical Operators

Operator Description
&& AND Operator. If both boolean operands are true, the condition becomes true
|| OR Operator. If any of the boolean operands is true, the condition becomes true
! NOT Operator. Reverses the value of a boolean operand

Assignment Operator

Operator Description
= Simple assignment operator. It assigns values from right side operands to left side operand
{ 2 comments }

Clojure ProjectEuler No. 11 – The Naive Way

Featured

Problem 11 di Euler bener-bener ngeselin, ini dia problemnya:

In the 20×20 grid below, four numbers along a diagonal line have been marked in red.

08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48

The product of these numbers is 26 × 63 × 78 × 14 = 1788696.

What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?

So gimana kita bisa nemuin 4 angka yang berdekatan, baik horizontal, vertical, diagonal kiri, atau diagonal kanan? [click to continue…]

{ 1 comment }
Keyhole

Ngelihat timeline di sosial media akhir-akhir ini, rasanya kesel, ngegemesin, dan campur aduk. Di sisi lain ada oknum yang ngemanfaatin kepolosan pengguna sosial media buat nyari duit.

Suka gemes gak si ngeliat ada temen sendiri atau orang yang kita kenal yang ngelakuin hal berikut ini di sosial media.

  1. Di sosial media isi timeline dia ngoceh nyinyir blaming sana sini.
  2. Ngeributin hal-hal yang emang sepele dan gak perlu diributin.
  3. Ke bawa isu-isu yang gak jelas atau belum jelas bener salahnya.
  4. Komentar-komentar yang nyudutin orang salah padahal dia sendiri gak tau yang dia omongin apa.
  5. Gampang marah kalo sudah bawa-bawa atribut yang bersifat agama.
  6. Yakin bahwa semua orang salah kecuali dia.
  7. And so on… (ada yang mau nambahin?)

[click to continue…]

{ 1 comment }
Haskell Logo

Pernah gak sih sewaktu ngoding dengan cara functional masih ke bawa-bawa mikir dengan cara imperative??

Saya sendiri, hal seperti itu masih kebawa-bawa, apalagi kalo nyangkut yang problemnya udah ribet dikit. Udah deh, cara mikirnya jadi auto imperative.

Functional programming itu penting, saya jelasin di bagian bawah.

Buat yang belum tau apa itu functional paradigm vs imperative paradigm, bisa baca di Wikipedia atau StackOverflow. So basically, programming paradigms itu ada empat, imperative, object, declarative, dan functional.

Imperative programming itu seperti ngeprogram di C/C++ atau Java, di bahasa itu kita dibolehin buat ngerubah-rubah variabel di alamat memori yang sama dan berpikir seperti step-by-tep, obeject you know lah everything treat as an object and its behaviours, dan declarative kita ngedeskripsiik mau apa dan komputer yang nyari jalan keluarnya (contoh SQL), sedangkan functional hampir sama dengan declarative plus kita dilarang melakukan side-effect sebisa mungkin.

So, jadi kenapa imperative sama functional itu beda (banget)? [click to continue…]

{ 0 comments }

clojure.repl: Baca Dokumentasi di REPL

clojure.repl

Pernah gak sih saat ngoding ngeblank, tau mau ngapain pake suatu method atau function, tapi lupa nama function-nya?? Atau parameternya yang bener itu kayak gimana? Saya mah sering kayak gitu.

So, Programing gak akan pernah lepas dari dokumentasi. Programer yang baik tahu bagaimana caranya membaca dokumentasi, google-fu atau stackoverflow.com kelamaan.

Semua bahasa pemrograman yang baik punya senjata ini, mereka menyediakan dokumentasinya. Bahkan saat ngoding sekalipun bisa langsung lihat dokumentasi.

Di Clojure, dokumentasi bisa dilihat di clojuredocs.org atau Clojure Cheatsheet. [click to continue…]

{ 0 comments }