Golang patterns for serving on-demand, generated content

ku1ik's avatarThe Gitorious Blog

We’re using Go for some parts of the Gitorious project and one of the recently open sourced sub-projects written in Go is git-archive-daemon. It’s a scalable, high-performance HTTP API for serving archives of git repositories.

While implementing this tool we noticed several apparent patterns emerge which are not specific to git archive generation and can be applied to other use cases. For example on-demand image or sound generation, or any other kind of synchronous generation where a client waits on the connection for the response can benefit from these patterns.

This tutorial will go through these patterns, starting with the simple, naive implementation, gradually making it smarter and more powerful.

Note: All the code examples below lack proper error handling. This is on purpose, to make the examples shorter and easier to understand. Feel free to browse through the source of git-archive-daemon to see how we handle errors there.

View original post 1,544 more words

Seminar Technogame di Universitas Machung

Benar-benar pengalaman yang luar biasa bisa menjadi pemateri di event ini, meski hanya menyampaikan sesuatu yang sangat sederhana yaitu tentang “Kodu Game Lab”. Tapi ternyata banyak yang tertarik dan sampai di sesi pertanyaan sampai ada peserta yang ingin bertanya tapi berhubung waktu habis ya mau bagaimana lagi. 🙂

Seminar Machung Techno Game
Bersanding dengan pemateri hebat yang lain, Pak David ( pendiri divinekids.com), mas Aditia Dwi Perdana (salah satu Founder Agate studio) tentu merasa gimana gitu. Saya serasa jadi debu di padang pasir, ga ada apa-apanya dibanding orang hebat tersebut.
Pada  saat presentasi, saya lihat peserta begitu tenang dan penuh perhatian. Saya jelaskan satu demi satu tips trik menggunakan Kodu dan pada sesi terakhir saya sedikit melakukan inovasi menggunakan speech recognition sebagai pengenal perintah didalam kodu. Hasilnya semakin bikin gaduh…haha…banyak yang penasaran sampai pemateri yang lain terheran dan sampai bertanya juga kepada saya. Seneng banget lah…:D

Continue reading “Seminar Technogame di Universitas Machung”

membuat aplikasi openGL dengan DevC++

Cara membuat aplikasi openGL pake devC
Dimulai dengan membuat empty project kemudian tambahkan file .cpp kedalam project.
kemudian untuk menambahkan parameter agar jika dicompile tidak terjadi
linker error maka klik tab project->project option. Trus didalam
“Parameters” tab tambahkan

-lglut32 -lglu32 -lopengl32 -lwinmm -lgdi32

pada linker pane. kemudian click ok.

nah sekarang tinggal menambahkan kode kedalam file cpp tadi.

tapi harus nginstall plugin dulu nih alamatnya

http://www.nigels.com/glt/devpak/freeglut.2.2.0.DevPak

http://www.nigels.com/glt/devpak/glui.2.2-1.DevPak

cara nginstallnya tools->package manager->install

#include ;
#include ;

void cube (void) {
glColor3f(1.0, 0.0, 0.0); //warna rusuk kubusnya merah
glutWireCube(2); //menggambar kubus dengan panjang 2
}

void display (void) {
glClearColor (0.0,0.0,0.0,1.0);
glClear (GL_COLOR_BUFFER_BIT);
glLoadIdentity();
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
cube();
glFlush();
}

void reshape (int w, int h) {
glViewport (0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
}

int main (int argc, char **argv) {
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_SINGLE);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow ("A basic OpenGL Window");
glutDisplayFunc (display);
glutReshapeFunc (reshape);
glutMainLoop ();
return 0;
}

contoh programnya…

outputnya seperti ini:
400

Instalasi Java OpenGL di Linux


JOGL merupakan paket Java yang menyediakan penggabungan library untuk OpenGL Java Virtual Machine. Hal itu mengijinkan programmer komputer grafik untuk menggunakan object-oriented tools pada Java dengan hardware akselerasi grafik 2D dan 3D.
Pertama-tama yang harus anda perhatikan yaitu pastikan anda sudah menginstal Java Development Kit pada sistem anda.

Langkah instalasi JOGL di Linux (instalation for dummy) :

  1. Download JOGL versi terbaru di jogl.dev.net atau versi jogl yang saya gunakan  jogl-1.1.1-linux-i586.zip. Saya asumsikan anda menyimpan file tersebut di home direktori.
  2. Selanjutnya anda harus menjadi superuser atau dengan cara :
    $su atau $sudo su
    Sekarang anda harus membuat direktori di /usr/lib/jogl.
  3. Nah untuk melakukannya ketik
    linux-eqjw:~ # mkdir /usr/lib/jogl
    Pindahkan file zip tersebut kedalam direktori atau folder yang baru dibuat:
    linux-eqjw:~ #mv ~/jogl-.zip /usr/lib/jogl/
  4. Ekstrak file tersebut :
    linux-eqjw:~ #cd /usr/lib/jogl
    linux-eqjw:~ #unzip jogl-

Nah sekarang saatnya konfigurasi sistem agar saat pemanggilan perintah javac bisa mengenali library yang disediakan jogl. Untuk melakukannya anda tinggal menambahkan perintah berikut di .bashrc atau .bash_profile(di openSUSE) di home direktori anda(untuk bisa mengakses file ini anda harus menjadi root).
LD_LIBARY_PATH=/usr/local/pgsql/lib:/usr/lib/jogl/jogl-1.1.1-linux-i586/lib
CLASSPATH=.:/usr/lib/jogl/jogl-1.1.1-linux-i586/lib/gluegen-rt.jar:/usr/lib/jogl/jogl-1.1.1-linux-i586/lib/jogl.jar
export LD_LIBRARY_PATH
export CLASSPATH
Jika LD_LIBARY_PATH dan CLASSPATH tinggal menambahkan dengan pemisah ‘:’ seperti diatas.
Untuk mengedit nilai di .bashrc atau .bash_profile anda bisa menggunakan perintah vi .bash_profile
Untuk mencoba apakah bisa berfungsi konfigurasi yang telah anda lakukan, berikut adalah contoh program yang saya ambil dari java.sun.com

//JOGLRotatingCube.java
 import net.java.games.jogl.GLCanvas;
import net.java.games.jogl.GLCapabilities;
import net.java.games.jogl.GLDrawableFactory;
import net.java.games.jogl.Animator;
import net.java.games.jogl.GL;
import net.java.games.jogl.GLEventListener;
import net.java.games.jogl.GLDrawable;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class JOGLRotatingCube {

private static final int SIZE = 160;

private static float angle = 0;

JOGLRotatingCube() {
GLCanvas canvas = getGLCanvas();
canvas.addGLEventListener(new RotatingCubeListener());
Animator anim = new Animator(canvas);
addCanvasToFrame(canvas, anim);
anim.start();
}

private void addCanvasToFrame(
GLCanvas canvas, final Animator anim) {
Frame f = new Frame("JOGL Rotating Half - Cube");
f.setSize(600, 400);
f.add(canvas);
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
anim.stop();
System.exit(0);
}
});
}

private GLCanvas getGLCanvas() {
GLCapabilities capabilities = new GLCapabilities();
return GLDrawableFactory.getFactory().
createGLCanvas(capabilities);
}

public static void main(String[] args) {
new JOGLRotatingCube();
}

private void drawCenteredCube(GL gl) {
gl.glColor4f(1, 0, 0, 0);
drawSquareFace(gl);
gl.glColor4f(1, 1, 0, 0);
gl.glRotatef(90, 1, 0, 0);
drawSquareFace(gl);
gl.glColor4f(0, 0, 1, 0);
gl.glRotatef(90, 0, 1, 0);
drawSquareFace(gl);
gl.glColor3f(0.0f, 0.0f, 0.0f);
}

private void drawSquareFace(GL gl) {
gl.glBegin(GL.GL_QUADS);
gl.glTexCoord2f(0, 0);
gl.glVertex3f(-SIZE / 2, -SIZE / 2, SIZE / 2);
gl.glTexCoord2f(0, 1);
gl.glVertex3f(-SIZE / 2, SIZE / 2, SIZE / 2);
gl.glTexCoord2f(1, 1);
gl.glVertex3f(SIZE / 2, SIZE / 2, SIZE / 2);
gl.glTexCoord2f(1, 0);
gl.glVertex3f(SIZE / 2, -SIZE / 2, SIZE / 2);
gl.glEnd();
}

class RotatingCubeListener implements GLEventListener {

public void init(GLDrawable drawable) {
GL gl = drawable.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //erasing color
gl.glColor3f(0.0f, 0.0f, 0.0f); // drawing color
}

public void display(GLDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);

angle++;
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glRotatef(-80, 1, 1, 0);
gl.glRotatef(angle /16, 1, -1, 1);
drawCenteredCube(gl);
}

public void reshape(GLDrawable drawable,
int x,
int y,
int width,
int height) {
GL gl = drawable.getGL();
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrtho(-width, width, -height, height, -SIZE, SIZE);
}

public void displayChanged(GLDrawable drawable,
boolean modeChanged,
boolean deviceChanged) {
}
}
}

Kompile dan jalankan JOGLRotatingCube, maka jika berhasil anda akan melihat kubus yang berotasi seperti gambar berikut.

Nah, sekian dulu semoga bermanfaat.

Algoritma Kompresi Shannon

Dalam proses penyimpanan data biasanya diperlukan optimasi besarnya file yang akan disimpan, mengingat kebanyakan user tidak selalu mempunyai ruang hardisk yang begitu besar. Kalaupun memiliki media penyimpanan yang cukup besar pastilah akan dioptimalkan penggunaannya. Salah satu caranya yaitu menggunakan kompresi data untuk menghemat ruang penyimpanan.

Untuk proses kompresi dewasa ini(zip, rar,tar.gz) menggunakan gabungan beberapa algoritma kompresi dasar seperti LZW, SHANNON-FANO, HUFFMAN, gunzip, dan lain-lain. Pada coretan blog ini saya akan sedikit memaparkan tentang ALGORITMA SHANNON. Pada prinsipnya algoritma ini menggunakan pendekatan top down dalam penyusunan binary tree.  Metode ini sangat efisien untuk mengompresi file text yang berukuran besar.

Untuk langkah-langkahnya sebagai berikut :

  1. Mengurutkan karakter berdasarkan probabilitasnya yang terbesar.
  2. Membagi menjadi 2 berdasarkan selisih paling sedikit dari nilai dua kelompok karakter yang terurut tadi.
  3. Secara rekursif dibagi menjadi 2 bagian, setiap bagian memiliki nilai yang sama atau dengan selisih paling sedikit.
  4. Mengasign nilai 1 kekanan dan 0 ke kiri pada pohon biner.

Contoh :

Source = {A, B, C, D, E }

Peluang={0.35, 0.17, 0.17, 0.16, 0.15

Membagi menjadi 2 kelompok besar:

  • kelompok 1 = A  dengan total peluang 0.35kelompok 2 = B, C, D, E dengan total peluang 0.65selisih kel 1 dan 2 = 0.30
  • kelompok 1 = A, B  dengan total peluang 0.52kelompok 2 = C, D, E dengan total peluang 0.48selisih kel 1 dan 2 = 0.04 –> paling sedikit
  • kelompok 1 = A , B, C dengan total peluang 0.69kelompok 2 = D, E dengan total peluang 0.31selisih kel 1 dan 2 = 0.38

Jadi yang digunakan AB dan CDE.
maka tree awalnya yaitu :

shstep1

Kemudian dari 2 leaf yang terbentuk dilakukan proses pembagian lagi seperti diatas sampai tidak bisa dibagi lagi. Sehingga menghasilkan tree yang lengkap seperti berikut :

shstepcmplte

Setelah Tree lengkap telah terbentuk maka dilakukan pembacaan dari root sampai ke karakter pada leaf.
Dari pembacaan dihasilkan codeword sebagai berikut :

  • A = 00 –> 2 bit
  • B = 01
  • C = 10
  • D = 110 –>3bit
  • E = 111

Dari code word diatas diperoleh panjang rata-ratanya :

Lavg = 0.35*2 + 0.17*2 + 0.17*2 + 0.16*3 + 0.15 * 3 = 2,31 bit/char

Nilai entropinya yaitu

H( S ) = H( P1,P2,P3,P4,P5)

=-P1 log P1 -P2 log P2 – P3 log P3 – P4 log P4 – P5 log P5     –> log basis 2

= 2,23 bit/char

Jadi Efisiensinya = H(s)/Lavg = 2,232/2,31=96,67%

Jadi dengan metode ini akan terasa sangat efektif jika banyak terjadi perulangan karakter pada text. Dah capek ngetik nih….semoga bermanfaat…

References :

http://www.cs.cf.ac.uk/Dave/Multimedia/node209.html#SECTION04242000000000000000

Catatan kuliah q…