Mei 03, 2015

ArangoDB for Arch Linux - Binary Version Without Manual Compilation (AUR)

I was once the maintainer of ArangoDB package in AUR. While the package was fine (I think), I am quite tired of having it compiled myself. It's just I am getting older, I guess. Then I prefer binary version after leaving maintainer role. Now I can use it using RPM file of OpenSuSE Factory version - available from ArangoDB download page. Some tweaks are needed anyway. I will give you some tweaks that I successfully use to make it works. In this post, I put all of installation files under /home/bpdp/software/arangodb (a.k.a $ARANGO_HOME).

  • cd $ARANGO_HOME
  • Install rpmextract package: # pacman -S rpmextract
  • Extract RPM file: $ rmpextract.sh path/to/arangodb-2.5.3-12.1.i586.rpm
  • Move conf files into etc: $ mv etc/arangodb/*.conf etc/
  • Delete init.d dir (we don't need that): $ rm -rf etc/int.d
  • All database will reside in db, so: $ mkdir db
  • Here's the dir structure:

$ ls
total 48
drwxr-xr-x  9 bpdp bpdp  4096 May  4 10:31 .
drwxr-xr-x 91 bpdp bpdp  4096 May  4 10:16 ..
drwxr-xr-x  2 bpdp bpdp  4096 May  4 10:12 bin
drwxr-xr-x  2 bpdp bpdp  4096 May  4 10:19 db
drwxr-xr-x  2 bpdp bpdp  4096 May  4 10:30 etc
drwxr-xr-x  4 bpdp bpdp  4096 May  4 10:12 lib
drwxr-xr-x  2 bpdp bpdp  4096 May  4 10:12 sbin
drwxr-xr-x  5 bpdp bpdp  4096 May  4 10:12 share
drwxr-xr-x  4 bpdp bpdp  4096 May  4 10:12 var
$

  • Create all needed dirs: cluster and mri (ruby): $ mkdir -p share/arangodb/mr/client/modules; mkdir -p shar/arangodb/mr/common/modules.
  • $ mkdir -p var/log/arangodb/cluster; mkdir -p lib/arangodb/cluster
  • Edit etc/*.conf to reflect all of those dir location.
  • Delete unneeded dirs/files: $ rm -rf lib/systemd/; rm -rf etc/init.d/; rm -rf sbin/rcarango.
  • Set PATH and MANPATH. You may put this inside $HOME/.bashrc:

export ARANGO_HOME=$HOME/software/arangodb
export PATH=$PATH:$ARANGO_HOME/bin:$ARANGO_HOME/sbin
export MANPATH=$MANPATH:$ARANGO_HOME/share/man
Installation finish. You should source .bashrc or open another terminal and then you may active the server daemon and / or arango shell:

  • Activate arango daemon: $ arangod -c ~/software/arangodb/etc/arangod.conf
  • Enter arango shell: $ arangosh -c ~/software/arangodb/etc/arangosh.conf
That's all I guess, you may now use ArangoDB. 


Uf wiederluege! Na shledanou! Auf Wiedersehen! Bye Bye! Adiau! ¡Hasta luego! Au revoir!
Arrivederci! להתראות! Tot ziens! Adjö! Εις το επανιδείν! さようなら До свидания!

April 26, 2015

Atom for 32bit Arch Linux (or other Linux 32bit distros)

Actually, there's a package in AUR (https://aur.archlinux.org/packages/atom-editor/) but I am too lazy to compile it myself, so here it goes.

Atom is available in binary releases for 64bit only for Linux. Luckily, WebUpd8 team provides binary packages for 64bit and 32bit Ubuntu. Get the package here: https://launchpad.net/~webupd8team/+archive/ubuntu/atom/+packages. For this article, I downloaded 32bit binary for Vivid. We will convert this file using deb2targz utility. You should get it first. If you are in Arch Linux, get from AUR (yaourt -S deb2targz), if you are not from Arch fame (:p) get it here: http://www.miketaylor.org.uk/tech/deb/deb2targz. The .deb file that was just downloaded:

-rw-r-----   1 bpdp bpdp 49547144 Apr 26 17:16 atom_0.194.0-1-webupd8-1_i386.deb

Put it somewhere wherever you like. Once you get deb2targz working, follow these steps:
  1. Convert .deb to tar.xz: $ deb2targz atom_0.194.0-1-webupd8-1_i386.deb
  2. Extract .xz file: $ tar -zvf atom_0.194.0-1-webupd8-1_i386.tar.xz. You will have two dirs: usr and opt. In opt dir, extract file atom/atom-linux32.tar.xz: $  tar -xvf atom-linux32.tar.xz.
  3. Put those two dirs inside whatever dir you like, mine is /home/bpdp/software/atom. We call this $ATOM_DIR (not necessarily exist, just for this article only).
  4. This .deb package search atom binary at /tmp/atom-build/atom, which is surely doesn't exist. To make it works, we should edit usr/bin/atom file. Find the line which says [ -x "$ATOM_PATH" ] || ATOM_PATH="/tmp/atom-build/atom" and change it to [ -x "$ATOM_PATH" ] || ATOM_PATH="/home/bpdp/software/atom/opt/atom/atom" (well of course you should put your own location of atom binary (mine is /home/bpdp/software/atom/opt/atom/atom).
  5. Now you should be able to run atom from $ATOM_DIR/usr/bin: $ ./atom. If you want, you may also put that dir in your PATH env variable: export PATH=$PATH:/home/bpdp/software/atom/usr/bin inside $HOME/.bashrc.

Setting Printer Network HP LaserJet P2035n di Arch Linux

Install paket: hplip dan cups

Aktifkan CUPS dengan menjalankan daemon:

# cupsd

Install driver HP. Siapkan file ppd (hp-laserjet_p2035n-hpijs-pcl3.ppd), diperoleh di /usr/share/ppd/HP/hp-laserjet_p2035n-hpijs-pcl3.ppd.gz. Ekstrak file tersebut di suatu lokasi, setting permission access ke user. Untuk kasus ini, saya meletakkan file tersebut di /home/bpdp/ppd/hp-laserjet_p2035n-hpijs-pcl3.ppd. Ikuti langkah2 berikut:

[root@bpdp-arch ~]# hp-setup -i
HP Linux Imaging and Printing System (ver. 3.15.2)
Printer/Fax Setup Utility ver. 9.0
Copyright (c) 2001-15 Hewlett-Packard Development Company, LP
This software comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to distribute it
under certain conditions. See COPYING file for more details.
(Note: Defaults for each question are maked with a '*'. Press to accept the default.)
--------------------------------
| SELECT CONNECTION (I/O) TYPE |
--------------------------------
  Num       Connection  Description                                              
            Type                                                                
  --------  ----------  ----------------------------------------------------------
  0*        usb         Universal Serial Bus (USB)                              
  1         net         Network/Ethernet/Wireless (direct connection or JetDirect)
  2         par         Parallel Port (LPT:)                                    
Enter number 0...2 for connection type (q=quit, enter=usb*) ? 1
Using connection type: net
Using device: hp:/net/HP_LaserJet_P2035n?ip=172.17.51.109
Setting up device: hp:/net/HP_LaserJet_P2035n?ip=172.17.51.109

---------------------
| PRINT QUEUE SETUP |
---------------------
Please enter a name for this print queue (m=use model name:'HP_LaserJet_P2035n'*, q=quit) ?
Using queue name: HP_LaserJet_P2035n
Locating PPD file... Please wait.
error: No PPD found for model laserjet_p2035n using old algorithm.
error: Unable to find an appropriate PPD file.
Would you like to specify the path to the correct PPD file to use (y=yes, n=no*, q=quit) ? /home/bpdp/ppd/hp-laserjet_p2035n-hpijs-pcl3.ppd
error: Please press or enter 'y', 'n', or 'q'.
Would you like to specify the path to the correct PPD file to use (y=yes, n=no*, q=quit) ? y
Please enter the full filesystem path to the PPD file to use (q=quit) :/home/bpdp/ppd/hp-laserjet_p2035n-hpijs-pcl3.ppd
Description for the file: HP LaserJet p2035n hpijs pcl3, 3.15.2, requires proprietary plugin
Use this file (y=yes*, n=no, q=quit) ? y
Enter a location description for this printer (q=quit) ?Ruang SI Jaringan
Enter additonal information or notes for this printer (q=quit) ?
Adding print queue to CUPS:
Device URI: hp:/net/HP_LaserJet_P2035n?ip=172.17.51.109
Queue name: HP_LaserJet_P2035n
PPD file: /home/bpdp/ppd/hp-laserjet_p2035n-hpijs-pcl3.ppd
Location: Ruang SI Jaringan
Information:

---------------------
| PRINTER TEST PAGE |
---------------------
Would you like to print a test page (y=yes*, n=no, q=quit) ? n
Done.
[root@bpdp-arch ~]#

Setelah itu, setiap kali print, akan muncul printer tersebut. Enjoy!

November 15, 2014

Mengakses Engine Prolog (tuProlog) dari Scala

Prolog merupakan bahasa pemrograman komputer generasi awal, dibuat oleh Alain Colmerauer pada sekitar awal tahun 1970-an dan dikembangkan oleh Alain bersama dengan Phillipe Roussel pada tahun 1972. Prolog pada awalnya memang dikembangkan untuk aplikasi AI (Artificial Intelligence) dengan kekhususan pada formalisme linguistik. Prolog banyak digunakan pada berbagai universitas dan pendidikan tinggi dan seakan-akan jauh dari industri meskipun banyak cerita kesuksesan dari Prolog (misalnya penggunaan Sicstus Prolog atau SWI Prolog). Di Indonesia, bisa dibilang Prolog memang murni masih berada di "dunia imajinasi" karena hanya digunakan pada banyak mata kuliah di berbagai perguruan tinggi tetapi jauh dari dunia industri (as always, CMIIW).

Saat ini Prolog mulai banyak dikembangkan untuk aplikasi tingkat lanjut karena kemampuan internal dari bahasa pemrograman tersebut yang sesuai untuk pemecahan masalah kompleks yang melibatkan reasoning serta berbagai fasilitas lainnya yang sesuai untuk keperluan aplikasi terdistribusi di Intenet (DCG untuk parsing dan menghasilkan list, pemrosesan data, declarative programming untuk komunikasi dan interaksi agent, dan lain-lain). Interpreter dan compiler Prolog juga banyak dikembangkan dan tersedia untuk berbagai platform. Untuk tulisan ini kita akan menggunakan tuProlog. tuProlog merupakan sistem Prolog yang dikembangkan untuk Java (dan .NET). Hal yang menarik dari tuProlog, sistem ini menyediakan sistem Prolog yang ringan dan hanya mengkonsentrasikan diri pada fitur standar (ISO Prolog) sedangkan bagian lainnya bisa menggunakan Java. Untuk artikel ini kita akan menggunakan Scala yang merupakan bahasa obyek-fungsional untuk aplikasi yang dijalankan di atas JVM.

Untuk mengikuti artike ini, ada beberapa yang harus dipersiapkan:

  1. Install JDK (saya menggunakan versi 1.8.0_25)
  2. Install Scala (saya menggunakan versi 2.11.4)
  3. Download tuProlog (saya menggunakan versi 2..9.1)
  4. Hmm ... saya menggunakan Linux - bash, jika anda menggunakan tools selain itu silahkan buat penyesuaian sendiri.


Artikel ini hanya menjelaskan cara mengakses Prolog engine melalui Scala. Setelah memahami artikel ini, anda bisa menggunakan fitur dari sistem tuProlog, menuliskan kode Prolog yang dijalankan melalui tuProlog dan kemudian menjalankan engine Prolog melalui Scala sekaligus mengambil hasil dari hasil eksekusinya. Untuk artikel ini, kita belum menggunakan sbt sehingga setting CLASSPATH harus dilakukan secara manual. Artikel menggunakan sbt semoga bisa segera menyusul.

Copy file 2p.jar dan tuprolog.jar

$ ls
total 744
drwxr-xr-x  2 bpdp bpdp   4096 Nov 16 08:04 .
drwxr-xr-x 19 bpdp bpdp   4096 Nov 16 07:58 ..
-rw-r--r--  1 bpdp bpdp 547424 Nov 16 08:00 2p.jar
-rw-r--r--  1 bpdp bpdp    392 Nov 16 08:04 HelloProlog.scala
-rw-r--r--  1 bpdp bpdp 198340 Nov 16 08:00 tuprolog.jar
$


Setting CLASSPATH

$ export CLASSPATH=$CLASSPATH:.:2p.jar:tuprolog.jar
$


Kode Sumber

File Scala berikut ini (HelloProlog.scala) saya terjemahkan dari manual untuk kode sumber Java hal 166. Interoperabilitas Scala dan Java sangat bagus sehingga penggunaan tuProlog engine berjalan dengan baik dan kode sumber Scala relatif lebih mudah dipahami.


import alice.tuprolog._
import scala.util.control._

object HelloProlog {

  def main(args: Array[String]) {

    val pEngine = new Prolog
    var info = pEngine.solve("append(X,Y,[1,2]).")
    val loop = new Breaks

    loop.breakable {
      
      while (info.isSuccess()) {

        println("solution: " + info.getSolution() + 
          " - bindings: " + info)
        if (pEngine.hasOpenAlternatives()) {
          info = pEngine.solveNext()
        } else {
          loop.break
        }

      }

    }

  }

}


Penggunaan tuProlog engine sesederhana mendefinisikan engine Prolog (new Prolog) dan kemudian menggunakan method solve untuk mengeksekusi kode sumber Prolog.

Kompilasi

$ scalac HelloProlog.scala
$ ls -la
total 756
drwxr-xr-x  2 bpdp bpdp   4096 Nov 16 08:43 .
drwxr-xr-x 19 bpdp bpdp   4096 Nov 16 07:58 ..
-rw-r--r--  1 bpdp bpdp 547424 Nov 16 08:00 2p.jar
-rw-r--r--  1 bpdp bpdp   1930 Nov 16 08:16 HelloProlog$$anonfun$main$1.class
-rw-r--r--  1 bpdp bpdp    657 Nov 16 08:16 HelloProlog.class
-rw-r--r--  1 bpdp bpdp   1140 Nov 16 08:16 HelloProlog$.class
-rw-r--r--  1 bpdp bpdp    520 Nov 16 08:16 HelloProlog.scala
-rw-r--r--  1 bpdp bpdp 198340 Nov 16 08:00 tuprolog.jar
$


Running

$ scala HelloProlog
solution: append([],[1,2],[1,2]) - bindings: yes.
X / []  Y / [1,2]
solution: append([1],[2],[1,2]) - bindings: yes.
X / [1]  Y / [2]
solution: append([1,2],[],[1,2]) - bindings: yes.
X / [1,2]  Y / []


Menggunakan tuProlog akan memungkinkan aplikasi kita menggunakan berbagai fitur AI yang bermanfaat untuk memperbaiki kinerja software yang kita aplikasikan. Happy hacking!

Mei 23, 2014

Maven repository priority in Gradle

If you get an error like this when you execute gradle build, it means that there is something wrong with your maven repository priority (just an example):

Checksum missing at http://www.systap.com/maven/releases/org/semanticweb/yars/nxparser/1.2.3/nxparser-1.2.3.pom.sha1 due to: For input string: "<!"
Download http://www.systap.com/maven/releases/org/semanticweb/yars/nxparser/1.2.3/nxparser-1.2.3.pom
[Fatal Error] nxparser-1.2.3.pom:2:10: Already seen doctype.


Below is a snapshot of my build.gradle:


    // maven repo for BigData - as embedded RDF database
    // we are looking for BigData with Blueprints also
    // needed by BigData: nxparser
    maven { url "http://www.systap.com/maven/releases" }
    maven { url "http://nxparser.googlecode.com/svn/repository" }



My BigData repository need nxparser, but the problem is, maven repo for nxparser reside after BigData repo, so gradle doesn't know that it has to fetch nxparser from repository below. Change the order into this to fix the problem:


    // maven repo for BigData - as embedded RDF database
    // we are looking for BigData with Blueprints also
    // needed by BigData: nxparser
    maven { url "http://nxparser.googlecode.com/svn/repository" }
    maven { url "http://www.systap.com/maven/releases" }



April 13, 2014

Gradle Untuk Mengelola Repo Lokal Maven

Saat pertama kali menggunakan Gradle, saya cukup kerepotan mempelajari tool ini karena dokumentasinya lebih mirip dengan manual. Tantangan yang pertama saya peroleh adalah menggunakan repository maven di komputer saya karena kadang kala software yang saya kembangkan berupa API (Application Programming Interface). Keinginan saya sederhana:

  1. Develop pustaka (API)
  2. Kompilasi dan build API dalam format .jar
  3. Push .jar ke repositori lokal maven (API, Javadoc, dan source code)
  4. API (.jar) di repositori lokal tersebut siap digunakan untuk pengembangan software berikutnya

Membaca manual Gradle cukup merepotkan untuk hal sederhana tersebut, jadi saya akan uraikan cara sederhana untuk keperluan tersebut. Pada dasarnya ada 3 file yang akan banyak digunakan:

  1. build.gradle di proyek pustaka API
  2. gradle.properties untuk berbagai properties yang diperlukan di proyek pustaka API
  3. build.gradle di proyek yang akan menggunakan file .jar tersebut

build.gradle di proyek pustaka API

Perhatikan, plugin yang digunakan adalah 'maven'. Perhatikan juga di bagian bawah mulai dari bagian untuk mengkonfigurasi POM.


apply plugin: 'java'
apply plugin: 'maven'

sourceCompatibility = '1.8'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'


repositories {

 mavenLocal()
 mavenCentral()

 maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }

 // definisi URL utk repo lainnya ...
  
}

dependencies {

 // contoh dependency untuk compile
 compile group: 'com.bigdata', name: 'bigdata', version: '1.3.0'
 
 // dependency untuk test                     
 testCompile group: 'junit', name: 'junit', version: '4.10'

}

test {

 /* Configure which tests are included
 include 'org/foo/**'
 exclude 'org/boo/**'
 */

 maxParallelForks = 5
 maxHeapSize = '1024m'

}

// bagian ini ke bawah yang penting untuk mengkonfigurasi POM

configure(install.repositories.mavenInstaller) {
 pom.project {
  groupId 'name.bpdp'
  artifactId 'turgo'
  inceptionYear '2014'
  packaging 'jar'
  licenses {
   license {
    name 'Eclipse Public License (Version 1.0)'
    url 'http://www.eclipse.org/legal/epl-v10.html'
    distribution 'repo'
   }
  }
 }
}

// untuk sources.jar
task sourcesJar(type: Jar, dependsOn:classes) {
 classifier = 'sources'
 from sourceSets.main.allSource
}

// untuk javadoc.jar
task javadocJar(type: Jar, dependsOn:javadoc) {
 classifier = 'javadoc'
 from javadoc.destinationDir
}

// artifacts yang di-push selain .jar API
artifacts {
 archives sourcesJar
 archives javadocJar
}

gradle.properties

Berisi properties dari proyek. Isinya adalah sebagai berikut:

version=0.0.1
group=name.bpdp.turgo

Perhatikan, tidak boleh menggunakan tanda petik string untuk value karena akan menyebabkan error di task javadoc:

Illegal package name: "0.0.1"
Illegal package name: " API"

Error ini seringkali membingungkan karena tidak jelas, jadi jika menemui error seperti itu, periksa gradle.properties.

Setelah itu, task "install" ($ gradle install) akan mem-build API, menghasilkan .jar, menghasilkan .jar untuk javadoc dan sources, kemudian mem-push semua .jar ke repo lokal seperti berikut ini:

build.gradle di proyek yang akan menggunakan .jar

Sederhana saja, jika sudah di-push, tinggal cantumkan mavenLocal() di repositories dan deklarasikan dependency compile untuk .jar tersebut. Berikut ini adalah contohnya:

pply plugin: 'java'
apply plugin: 'application'

sourceCompatibility = 1.8
version = '1.0'

mainClassName = 'turgo.examples.hello.HelloTurgo'

repositories {

 mavenLocal()
 mavenCentral()

 maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }

}

dependencies {
 compile group: 'name.bpdp', name: 'turgo', version: '0.0.1'
 testCompile group: 'junit', name: 'junit', version: '4.11'
}

That's all there is to say. :)

Oktober 21, 2013

Awesome Window Manager (3.5.2) and Java 7 GUI Problem

Some complaints have been reported about Java GUI (AWT/Swing) that does not behave correctly under Java GUI. This problem come in the form of empty contents in Java GUI window and also some weird behaviour in Java GUI menu (wrong cursor pointer position, menu doesn't want to display its contents without click and hold mouse button).

This problem usually only happens in some exotic non-reparenting window manager such as awesome, dwm, subtle, and probably others. I use only awesome so this is my experience in awesome window manager. Even when since release 3.5.x, awesome has become a reparenting window manager, the weird behaviour above still exists (the menu problem). Uncommit source code is not an option for me.

If you experience this, there are two things that can be done:
  1. Change JDK from Oracle JDK to OpenJDK. I tested with OpenJDK 2.4.2 (IcedTea) and Awesome 3.5.2. This works very well without any extra steps.
  2. Use wmname and execute "wmname LG3D" from shell before running Java GUI application. This option is needed if we use Oracle JDK. I tested this with Oracle JDK 1.7.0_u45.
If you want to use OpenJDK and are so awfully lazy to compile it by yourself (just like myself), you may grab the latest binary for Linux in OpenJDK unofficial build. This works very well.

Oktober 01, 2013

Introspeksi Untuk Rekayasa Web: Aplikasi Web atau Sistem Web?

Selama ini kita cenderung menyebut istilah software yang ada di Internet dan menggunakan infrastruktur dari W3C untuk antarmuka dengan manusia melalui browser sebagai aplikasi Web. Istilah ini mempunyai konotasi sendirian dan hanya dimaksudkan untuk berinteraksi dengan manusia saja. Secara normal, kondisi ini seperti kondisi manusia yang egois: "ini yang saya punyai, silahkan kalau kamu mau berkomunikasi dengan saya, sesuaikan dengan kondisi saya". Tentu tidak se-ekstrim itu, tetapi secara konsep memang demikian. Perhatikan, selama ini saat kita melakukan rekayasa, yang kita pikirkan adalah software itu sendiri serta bagaimana software tersebut bisa dibaca dan mempermudah navigasi manusia saat menggunakan software tersebut. Hasil dari ini bisa ditebak:
  1. Standarisasi komponen antarmuka Web di browser: HTML, CSS, PNG, dll
  2. Masalah kesesuaian browser dengan standar tersebut (para desainer antarmuka Web pasti ingat dengan sulitnya membuat antarmuka Web mereka bisa bekerja lintas browser, dan muncullah berbagai macam kutukan terutama terhadap salah satu browser dari perusahaan besar).
  3. JavaScript overkill: merancang dan mengimplementasikan halaman Web yang dinamis tentu tidak bisa menggunakan HTML (saja), tetapi memerlukan JavaScript. Jaman dahulu (sekitar tahun 2000-an), jauh lebih parah lagi karena ada masalah standarisasi JavaScript sehingga akhirnya diserahkan ke ECMA dan dibuat spesifikasi menjadi ECMAScript. Saat itu ada JavaScript (Netscape) dan JScript (Microsoft), belum lagi setelah itu Microsoft juga membuat VBScript. Ini masa-masa gelap untuk para perancang halaman Web. Meski sekarang tidak seperti itu lagi, hanya ada JavaScript, masalah standarisasi ini juga masih menjadi masalah turunan (belum termasuk Google yang mengeluarkan Dart, meski bisa dikompilasi ke JavaScript). Buka kode sumber dari halaman Web, biasanya akan muncul banyak sekali snippet JavaScript.
Sebenarnya kita perlu berpikir lebih sederhana, bahwa software di Web adalah software yang digunakan untuk mendukung interaksi sosial manusia (silahkan baca kembali note saya sebelum ini). Dengan menggunakan pola pikir seperti itu, maka kita seharusnya mulai mencurahkan pemikiran ke bagaimana membuat software tersebut bisa membantu interaksi sosial manusia. Domain ini yang sekarang dikenal dengan istilah Pragmatic Web.

Pada domain Pragmatic Web, tidak ada lagi (hanya) aplikasi Web. Mengapa? Sederhana saja, software yang akan dikembangkan merupakan software untuk mendukung interaksi sosial manusia sehingga harus bersifat kontekstual, atau context-aware Web. Dalam konteks ini, kita harus membedakan antara web services dengan services. Web services berada pada ruang lingkup lapisan informasi sedangkan services berada pada ruang lingkup kehidupan nyata. Dalam kondisi seperti ini, rekayasa software di Web tidak mungkin hanya berada pada sisi penyedia (server), tetapi juga harus memikirkan bagaimana software agent di sisi klien bisa berkomunikasi dengan software agent di sisi penyedia.

Menggeser paradigma software di Web dari software yang egois menjadi suatu sistem adalah salah satu kunci untuk mengurai benang kusut di ranah rekayasa Web yang sudah terlalu banyak menghabiskan waktu di sisi (hanya) aplikasi Web.  Semoga.

Aplikasi Web di Masa Depan: Semakin Konvergen dengan Teknologi Agen

Agen bukan merupakan hal baru di dunia informatika. Sejak perkembangan AI (Artificial Intelligence - Kecerdasan Buatan), agen sebenarnya merupakan inti dari pembahasan. Jika dirunut sejak awal, kita bisa melihat teori agensi pada pemodelan ekonomi (principal-agents). Teori agensi pada pemodelan tersebut mendasarkan pada pemikiran bahwa principal selaku pemilik merekrut, menggaji, mempekerjakan agents untuk melakukan pekerjaan-pekerjaan tertentu. Tentu saja para agents tersebut harus mempunyai kecerdasan (keahlian) tertentu dan bisa bersikap serta mengambil keputusan (dalam ruang lingkupnya) terkait dengan tujuan kerjasama tersebut. Dalam kerjasama tersebut, dipastikan tidak akan muncul agency problems, yaitu konflik yang muncul karena perbedaan goals di antara mereka. Konsep inilah yang sebenarnya ingin dikerjakan pada AI. Sederhana dalam penggambaran, tetapi sangat sulit dalam implementasi. Agen itu sendiri bisa berupa agen tunggal serta MAS (Multi-Agent Systems). Agen tunggal tentu lebih mudah diimplementasikan. MAS merupakan topik yang sangat sulit (jaman dulu disebut sebagai DAI - Distributed Artificial Intelligence). Kompleksitas MAS disebabkan karena adanya interaksi antar agen.

Sementara itu, perkembangan teknologi jaringan yang sudah sampai tingkat konektivitas di seluruh dunia ternyata membuat perkembangan tuntutan pengguna aplikasi menjadi lebih kompleks. Ingat, semakin ringan dan semakin ingin dimanjakan, semakin sulit pekerjaan para pengembang aplikasi. Pada era ini, aplikasi pada dasarnya bisa kita bagi menjadi aplikasi yang headless serta aplikasi berbasis Web. Aplikasi headless adalah aplikasi yang tidak menggunakan user interface untuk si pemakai karena memang tidak dikhususkan untuk pemakai biasa. Pemakai menggunakan aplikasi ini, tetapi tidak menyadari jika aplikasi ini ada. Contoh sederhana aplikasi ini antara lain aplikasi crawler dari berbagai situs mesin pencari. Pemakai hanya perlu ke (misalnya) google, dan mencari kata kunci yang dikehendaki. Mekanisme dan penyediaan infrastruktur dari aplikasi tersebut kebanyakan tidak diketahui dan dipahami pemakai biasa. Aplikasi Web pada dasarnya menyediakan user interface untuk berkomunikasi dengan pemakai.

Apa keterkaitan antara kedua hal itu? Web menyedian berbagai macam sumber daya yang sangat melimpah ruah, mulai dari sumber daya yang hanya bisa dipahami oleh manusia (era Syntactic Web dengan HTML tanpa kandungan semantik) maupun sumber daya yang berupa sumber daya yang bisa "dipahami" mesin (dikenal dengan istilah sumber daya semantik - Semantic Web). Nah sekarang, kondisi seperti ini bisa memungkinkan orang untuk berpikir dalam kerangka teori agensi di atas. Pemakai menjadi pincipal, sementara agents akan berupa software: "saya ingin sesuatu dari Web, kerjakan dan berikan ke saya hasilnya" dengan seminimal mungkin intervensi ke software tersebut. Tugas para pengembang barangkali untuk memungkinkan hal-hal di atas bisa terjadi serta memungkinkan otomasi di Internet/Web seperti yang dicetuskan oleh Tim Berners-Lee pada tahun 2001:
  1. Merealisasikan software agent, dalam konteks ini sofware agent yang bisa berkomunikasi dengan si pemakai. Riset di bidang human-agent communication ini juga diperlukan, bersamaan dengan NLP (Natural Language Processing). Pemakai "berbicara" dan menyuruh agen untuk mengerjakan sesuatu on behalf of its owner. Pada konteks ini, penelitian yang dulu pernah dikembangkan oleh Terry Winograd menjadi penting (LAP - Language-Action Perspective).
  2. Merealisasikan aplikasi Web yang juga sebenarnya merupakan salah satu agen pada suatu masyarakat MAS. Agent ini mempunyai dua "muka", satu merupakan aplikasi Web dengan user interface HTML-CSS-JavaScript-etc, muka yang lain adalah agen. Agen ini merupakan wakil dari pemilik Web yang siap berkolaborasi dengan software agent dari pemakai. Komunikasi Agent-to-Agent ini juga merupakan hal yang kompleks dan merupakan salah satu standar yang dihasilkan oleh FIPA (http://www.fipa.org) berupa ACL (Agent Communication Language).
Nah, silahkan mulai bersiap-siap jika memang (berniat) terjun ke dunia pengembangan software. That should be pretty interesting. :p

Juli 21, 2013

Using Vim for Java + Gradle

Short posting. I've created a repo so that I can clone it everytime I want to create new project. See here:

https://github.com/bpdp/vim-java