Archive | Programming RSS feed for this section

Kriptografi enkripsi-dekripsi algoritma Goldreich-Goldwasser Halevi (GGH) Cryptosystem

24 May

Salah satu aspek penting dalam kriptografi adalah menjamin kerahasiaan (confidentiality) suatu pesan. Untuk menjamin bahwa suatu pesan hanya dibaca oleh pihak-pihak yang berkepentingan saja, perlu dilakukan proses enkripsi-dekripsi terhadap pesan tersebut. Enkripsi merupakan proses mengubah teks pesan menjadi teks pesan baru yang tidak mudah dikenali lagi makna aslinya (ciphertext). Dekripsi adalah proses menerjemahkan ciphertext menjadi teks pesan awal.

Teknik Enkripsi-Dekripsi
Dalam kriptografi, terdapat beberapa jenis teknik enkripsi-dekripsi yang dapat digunakan. Pada tugas ini, teknik enkripsi-dekripsi yang digunakan adalah block cipher. Dalam block cipher, teks pesan akan dipotong menjadi beberapa block sebesar n karakter. Setiap block yang terbentuk akan dienkrip dengan suatu algoritma tertentu menggunakan key yang telah dibuat. Kemudian untuk setiap block yang telah dienkrip, digabungkan secara terurut menjadi sebuah ciphertext.
Tidak jauh berbeda dengan proses enkripsi, proses dekripsi dalam block cipher juga akan memotong ciphertext ke dalam block dengan ukuran yang sama ketika proses enkripsi. Setiap block didekrip dengan suatu algoritma menggunakan sebuah key. Teks pesan awal akan terbentuk setelah hasil dekripsi dari setiap block digabung.

Algoritma Enkripsi-Dekripsi Goldreich-Goldwasser Halevi (GGH) Cryptosystem

Dalam menggunakan algoritma GGH, pesan tidak bisa langsung dienkrip. Pesan yang memiliki tipe string perlu diubah ke dalam nilai ASCII-nya (encoding) dan dienkrip dengan teknik enkripsi block cipher sebesar n, dan  pada kesempatan ini coba dijelaskan untuk n = 20. Begitu juga dengan proses dekripsi, hasil enkripsi didekrip dengan teknik yang sama, block cipher dengan n = 20. Hasil dekripsi merupakan ASCII dari teks pesan awal, sehingga perlu dilakukan proses decoding dari ASCII ke karakter.

Berikut algoritma Goldreich-Goldwasser Halevi (GGH) Cryptosystem dalam Class GGHAlgorithm:


import java.util.Random;

/**

*/
/**
 Class GGHAlgorithm
 Menyediakan method-method untuk menjalankan proses enkripsi-dekripsi
 GGH cryptosystem (yang disederhanakan). Menggunakan bantuan class
 LUDecomposition untuk menyelesaikan sistem persamaan pada proses dekripsi.
 @author Ikhsanul Habibie
*/

public class GGHAlgorithm {
/* ------------------------
 Class variables
 * ------------------------ */

 /**
 private key dengan dimensi 20 dengan range nilai -200 s/d 200
 Hadamard ratio sekitar 0.8
 */
 private double[][] privateKey = {
 {17, -6, 2, -1, -7, -2, -8, -7, 1, -3, 0, 6, -4, -3, 2, 3, -1, -7, -7, 0},
 {0, -21, 21, -7, 12, -1, -1, 10, -5, -5, 0, 7, 11, -12, -2, 7, -19, 8, -8, 2},
 {0, -13, -26, 0, 11, -25, -5, 22, -27, -5, -25, 16, 13, 12, 2, -17, -15, 5, 14, -8},
 {0, -1, -2, -9, 54, 6, 9, 6, -13, -13, -3, 0, -21, 18, -21, 21, -10, -16, 21, 22},
 {0, 9, 18, 8, 9, -54, 23, 16, -15, -32, 2, 9, 8, 22, 1, 9, -22, 11, 7, 35},
 {0, -4, -8, -28, -4, 24, 32, -6, 8, -4, 4, -7, -9, 4, -7, -1, 22, 9, 17, 10},
 {0, 0, 0, 3, 0, 0, 3, 7, -48, 36, 22, 2, -25, 0, 0, -26, 37, -16, 31, -5},
 {0, 0, 0, 17, 0, 0, 17, -3, -22, 7, 18, 52, -23, 7, -12, 31, -15, 6, -16, 11},
 {0, 0, 0, 1, 0, 0, 1, -3, -34, 19, -11, -1, 2, -6, -14, 4, 19, -31, -63, -23},
 {0, 0, 0, 13, 0, 0, 13, -35, 10, -18, -3, -13, 4, -26, -11, -4, 2, 21, 4, 2},
 {0, 0, 0, -12, 0, 0, -12, 8, 21, 1, -49, 12, 28, -4, 20, 2, 6, -8, 19, 13},
 {0, 0, 0, 12, 0, 0, 12, -18, 15, 45, 33, -12, 18, 1, -10, -15, -7, -8, 4, -25},
 {0, 0, 0, 16, 0, 0, 16, 16, 0, 0, -16, -16, 8, 24, -17, 8, 23, 17, 9, 14},
 {0, 0, 0, 12, 0, 0, 12, 12, 0, 0, -12, -12, -33, -40, 22, 23, -21, 4, 19, -1},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, 48, -17, 43, 9, 20, -12, -8},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 48, 4, -12, -6, -30, -12},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 43, -23, 22, 1, -24},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, -15, -40, -16},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, -62, -28},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195}
 };

 /* ------------------------
 Constructor
 * ------------------------ */
 public GGHAlgorithm() {

 }

 /** Mengakses privateKey
 @return private key
 */
 public double[][] getPrivateKey() {
 return this.privateKey;
 }

 /** Memberi nilai pada privateKey
 @param privateKey matriks 20x20 yang ingin dijadikan private key
 */
 public void setPrivateKey(double[][] privateKey){
 this.privateKey = privateKey;
 }

 /** Membuat <a class="zem_slink" title="Public-key cryptography" href="http://en.wikipedia.org/wiki/Public-key_cryptography" target="_blank" rel="wikipedia">public key</a>
 @param g private key
 @param imax range nilai public key (imax, berarti antara -imax s/d imax, inclusive)
 @param hrat batas atas hadamard ratio untuk public key yang ingin dibuat
 @return public key
 */
 public double[][] generatePublicKey(double[][] g, int imax, double hrat)
 {
 LUDecomposition copyarray = new LUDecomposition();
 double[][] b = copyarray.array2DCopy(g);
 int dim = b.length;
 double[][] v = new double[dim][dim];

 //CONSTRUCT StrassensAlgorithm OBJECT
 StrassensAlgorithm multiply = new StrassensAlgorithm();

 //randomunimodmatrix
 double[][] u = this.generateUnimodularMatrix(dim,imax);

 while(this.hadamardRatio(b) > hrat)
 {
 //B = G*U
 //USING STRASSENS
 b = multiply.strassenMatrixMulti(g,u);

//generate randomunimodmatrix, save to V
 v = this.generateUnimodularMatrix(dim,imax);

 //U = U*V
 //USING STRASSENS
 u = multiply.strassenMatrixMulti(u,v);
 }

 return b;
 }

 /** Mendapatkan public key, menggunakan generatePublicKey untuk membuat public key
 @param privateKey private key
 @return public key
 */
 public double[][] getPublicKey(double[][] privateKey){
 //hadamard ratio of 0.5 is already "bad"
 return this.generatePublicKey(privateKey,200,0.5);
 }

 /** Melakukan proses enkripsi sesuai langkah-langkah pada GGH cryptosystem
 @param blockAscii array yang berisi bagian pesan yang ingin di-enkripsi
 @param publicKey public key
 @return array hasil enkripsi
 */
 public double[] encryptGGH(double[] blockAscii, double[][] publicKey){
 double[] cipherMatrix = new double[blockAscii.length];

 double[] perturbationVector, multMatrix;
 perturbationVector = this.generatePerturbationVector(publicKey.length);
 multMatrix = this.matrixVectorMul(publicKey, blockAscii);

 for(int j = 0; j < multMatrix.length; j++){
 cipherMatrix[j] = multMatrix[j] + perturbationVector[j];
 }

 return cipherMatrix;
 }

/** Melakukan proses dekripsi sesuai langkah-langkah pada GGH cryptosystem
 @param privateKey private key
 @param publicKey public key
 @param cipherText array yang berisi cipher text
 @return array hasil dekripsi
 */
 public double[] decryptGGH(double[][] privateKey, double[][] publicKey, double[] cipherText) {

 //CONSTRUCTING OBJECT FROM LUDecomposition
 LUDecomposition priv = new LUDecomposition(privateKey);

 //SOLVE (privateKey)(cipherLinearCombination) = (cipherText)
 double[] cipherLinearCombination = priv.solveLSE(cipherText);

double[] closestVertex = babaiClosestVertexAlgorithm(
 cipherLinearCombination, privateKey);

//CONSTRUCTING OBJECT FROM LUDecomposition
 LUDecomposition pub = new LUDecomposition(publicKey);

 //SOLVE (publicKey)x = (privateKey*closestVertex)
 return pub.solveLSE(matrixVectorMul(privateKey, closestVertex));
 }

/** Membuat matriks dimensi dimxdim yang diisi dengan integer (random)
 @param imax nilai maksimum elemen matriks
 @param dim dimensi matriks persegi
 @return matriks dimxdim
 */
 public double[][] randomMatrix(int imax, int dim)
 {
 double m[][] = new double[dim][dim];
 Random random = new Random();

for(int i = 0; i < dim; i++) {
 for(int j = 0; j < dim; j++) {
 m[i][j] = (double)(random.nextInt(imax - 1) + 1);
 }
 }

//System.out.println("in randomMatrix");
 //this.printMatrix(m);

return m;
 }

 /** Implementasi proses derangement
 @param n ukuran array (jumlah posisi yang ingin dipermutasi)
 @return array hasil derangement
 */
 public int[] derangement(int n)
 {
 int m[] = new int[n];

for(int i = 0; i < n; i++) {
 m[i] = i;
 }

return this.randperm(m);
 }

 /** Membantu proses derangement, permutasi dimana di hasil akhir tidak ada posisi isi array yg sama dengan posisi awal, e.g 1 != 1'
 @param a array yang ingin di-derangement
 @return array hasil dekripsi
 */
 public int[] randperm(int[] a)
 {
 int m[] = new int[a.length];

for(int i = 0; i < a.length; i++) {
 m[i] = a[i];
 }

Random random = new Random();

for(int i = 0; i < m.length; i++) {
 int rand = random.nextInt(a.length - 1) + 1;

while (rand == i) {
 rand = random.nextInt(a.length - 1) + 1;
 }

int temp = m[i];
 m[i] = m[rand];
 m[rand] = temp;
 }

return m;
 }

/** Membuat perturbation vector
 @param dim ukuran vektor
 @return perturbation vector
 */
 public double[] generatePerturbationVector(int dim) {
 double[] v = new double[dim];

for(int i = 0; i < dim; i++) {
 v[i] = Math.round((Math.random() * 10) - 5);
 }

while(vectorNorm(v) == 0) {
 for(int i = 0; i < dim; i++) {
 v[i] = Math.round((Math.random() * 10) - 5);
 }
 }

 /*
 System.out.println();
 System.out.println("perturbation Vector");
 for(int i = 0; i < dim; i++) {
 System.out.println(v[i]);
 }
 */
 //System.out.println("\nPerturbation Vector");
 //this.printVector(v);
 //System.out.println();
 return v;
 }

 /** Membuat matriks unimodular
 @param dim ukuran matriks, dimxdim
 @param intMax nilai maksimum matriks
 @return matriks unimodular
 */
 public double[][] generateUnimodularMatrix(int dim, int intMax)
 {

 double u[][] = new double[dim][dim];

double A[][] = this.randomMatrix(intMax, dim);
 double Atriangular[][] = new double[dim][dim];

for(int i = 0; i < dim; i++) {
 for(int j = 0; j < dim; j++) {
 if (i>j) {
 Atriangular[i][j] = (double)0;
 }
 else if (i == j) {
 Atriangular[i][j] = (double)1;
 }
 else {
 Atriangular[i][j] = (double)A[i][j];
 }
 }
 }

//System.out.println("in generateUnimodularMatrix, Atriangular:");
 //this.printMatrix(Atriangular);
 //System.out.println();

int p[] = this.derangement(dim);

//System.out.println("in generateUnimodularMatrix, derangement:");
 //this.printVector(p);
 //System.out.println();

for(int i = 0; i < dim; i++) {
 for(int j = 0; j < dim; j++) {
 u[j][i] = Atriangular[j][p[i]];
 }
 }

 //System.out.println("in generateUnimodularMatrix, final matrix:");
 //this.printMatrix(u);

return u;
 }

/** Operasi inner product antara dua vektor
 @param u vektor
 @param v vektor
 @return hasil inner product
 */
 public double innerProduct(double[] u, double[] v) {
 double w = 0;
 for(int i = 0; i < u.length; i++) {
 w += u[i] * v[i];
 }

return w;
 }

/** Perkalian skalar dengan vektor
 @param scalar skalar
 @param v vektor
 @return hasil perkalian skalar dengan vektor
 */
 public double[] scalarVectorMul(double scalar, double[] v) {
 for(int i = 0; i < v.length; i++) {
 v[i] += scalar * v[i];
 }

return v;
 }

/** Penjumlahan antara dua vektor
 @param u vektor
 @param v vektor
 @return vektor hasil penjumlahan
 */
 public double[] vectorAddition(double[] u, double[] v) {
 double[] newVector = new double[u.length];
 for(int i = 0; i < u.length; i++) {
 newVector[i] = u[i] + v[i];
 }

return newVector;
 }

/** Perkalian antara matriks dengan vektor (matriks * vektor = vektor)
 @param a matriks
 @param b vektor
 @return hasil perkalian (vektor)
 */
 public double[] matrixVectorMul(double a[][], double b[]) {
 double c[] = new double[a.length];

for(int i = 0; i < a.length; i++) {
 for(int j = 0; j < b.length; j++) {
 c[i] += a[i][j] * b[j];
 }
 }

return c;
 }

/** Menghitung norm-2 sebuah vektor
 @param v vektor
 @return norm-2 vektor
 */
 public double vectorNorm(double[] v) {
 double norm = 0;

for(int i = 0; i < v.length; i++) {
 norm += Math.pow(v[i], 2);
 }

return Math.sqrt(norm);
 }

/** Meyelesaikan closest vertex problem (CVP) dengan algoritma Babai
 @param w vektor (jadi, solusi CVP adalah vektor terdekat dengan w)
 @param baseVectors matriks yang berisi basis
 @return solusi CVP
 */
 public double[] babaiClosestVertexAlgorithm(double[] w, double[][] baseVectors) {
 double wLinearCombination[] = new double[w.length];
 System.arraycopy(w, 0, wLinearCombination, 0, w.length);

for(int i = 0; i < w.length; i++) {
 wLinearCombination[i] = Math.round(wLinearCombination[i]);
 }

return wLinearCombination;
 }

/** Menghitung hadamard ratio dari key
 @param m matriks/key yang ingin dicari hadamard ratio-nya
 @return hadamard ratio
 */
 public double hadamardRatio(double m[][]) {
 LUDecomposition lu = new LUDecomposition(m);

double detL = Math.abs(lu.computeDeterminant());
 double[] firstVector = new double[m.length];

for(int i = 0; i < firstVector.length; i++) {
 firstVector[i] = m[i][0];
 }

double norms = vectorNorm(firstVector);

for(int i = 1; i < m.length; i++) {
 double baseVector[] = new double[m.length];

for(int j = 0; j < m.length; j++) {
 baseVector[j] = m[j][i];
 }

norms *= vectorNorm(baseVector);
 }
 return Math.pow(detL/norms, (double)1.0/m.length);
 }

/** Mencetak matriks ke output
 @param m matriks
 */
 public static void printMatrix(double m[][]) {
 for(int i = 0; i < m.length; i++) {
 for(int j = 0; j < m[0].length; j++) {
 System.out.print(m[i][j] + " |");
 }
 System.out.println();
 }
 }

 /** Mencetak vektor ke output (dengan isi elemen adalah integer)
 @param m vektor
 */
 public static void printVector(int[] m) {
 for(int i = 0; i < m.length; i++) {
 System.out.print(m[i] + " ");
 System.out.println();
 }
 }

 /** Mencetak vektor ke output (dengan isi elemen adalah double)
 @param m vektor
 */
 public static void printVector(double[] m) {
 for(int i = 0; i < m.length; i++) {
 System.out.print(m[i] + " ");
 System.out.println();
 }
 }
}

&nbsp;

Ada dua jenis key yang akan digunakan Class GGHAlgorithm melakukan proses enkripsi-dekripsi dengan implementasi algoritma GGH. Class ini juga berisi method-method yang dibutuhkan untuk melakukan proses enkripsi-dekripsi, terutama membuat private key dan public key. Berikut, yaitu private key (kunci rahasia) dan public key (kunci publik).

Ukuran dari private key (kunci rahasia) dan public key (kunci publik) adalah salah satu komponen penting dalam sistem kriptografi karena kedua key tersebut mendukung aspek kerahasiaan (confidentiality) dari suatu pesan yang ingin dikirim. Menurut teori, semakin besar ukuran key yang digunakan, maka keamanan sistem semakin meningkat.
Pembentukan public key dalam Goldreich-Goldwasser Halevi (GGH) cryptosystem menggunakan private key sebagai titik awal pembuatannya. Private key dikalikan dengan jenis matriks tertentu sedemikian sehingga terbentuklah public key yang sesuai dengan standar kriteria GGH cryptosystem. Seperti yang sudah dijelaskan sebelumnya, untuk menjamin kualitas keamanan sistem, key yang digunakan harus cukup besar. Berdasarkan sumber [1], ukuran key setidaknya mencapai ratusan. Bayangkan jika Anda menggunakan teknik perkalian matriks standar yang mempunyai kompleksitas Θ(n^3) untuk key yang mempunyai ukuran 400 ke atas, maka teknik perkalian matriks tersebut tidak layak digunakan pada implementasi GGH cryptosystem. Oleh karena itu, perlu adanya metode alternatif untuk mengalikan matriks, salah satunya adalah Strassen’s Algorithm.

Contoh solusi penggunaan Master Theorem atau Metode Master untuk rekurensi

23 May

Teorema 1 (Metode Master) Diberikan suatu rekurensi T (n) = aT (n/b) + f (n) , jika n ≥ n0, untuk suatu n0 elemen N dan T (n) konstan untuk 0 ≤  n < n0. Apabila a ≥ 1, b > 1 keduanya adalah nilai yang konstan dan f (n) adalah fungsi yang asimtotik positif, maka:

master theorem

Gunakan Teorema 1 untuk mencari solusi dari setiap rekurensi berikut dalam notasi . Jika metode master tidak dapat diterapkan, gunakan metode lain yang Anda ketahui. Asumsikan bahwa T (n) konstan untuk n yang cukup kecil.

(a).  T (n) = 3T (n/2) + n.

Solusi T (n) = 3T (n/2) + n menggunakan master theorem kasus 1.

solusi master theorem 1

(b). T (n) = 2T (n/2) + n^3.

Solusi T (n) = 2T (n/2) + n^3 menggunakan master theorem kasus 3.

solusi master theorem 2

(c). T (n) = 7T (n/3) + n^2.

Solusi T (n) =  7T (n/3) + n^2 menggunakan master theorem kasus 3.solusi master theorem 3

(d).  T (n) = 2T (n/2) + n lg n.

Solusi T (n) =  2T (n/2) + n lg n menggunakan master theorem kasus 2.

solusi master theorem 4

(e). T (n) = 4T (n/2) + n^2 √n.

Solusi T (n) = 4T (n/2) + n^2 √n menggunakan master theorem kasus 3.

solusi master theorem 5

(f). T (n) = T (√n) + 1 (petunjuk: substitusikan n = 2^m).

Solusi T (n) = T (√n) + 1 menggunakan master theorem kasus 2.

solusi master theorem 6

 

(g). T (n) = 2T (n – 1) + 1 (asumsikan T (1) = 1).

Kita tidak dapat menggunakan master theorem untuk kasus ini. Dengan evaluasi iteratif, kita memiliki

solusi master theorem 7

 

(h). T (n) = T (n – 1) + lg n (asumsikan T (1) = 1).

Dengan evaluasi iteratif, kita memiliki

solusi master theorem 8-1

Dengan sifat logaritma lg a + lg b = lg ab, diperoleh

solusi master theorem 8-2

Dengan aproksimasi Stirling,  lg (n!) = Θ(n lg n). Akibatnya T (n) = 1 +Θ (n lg n) = Θ(n lg n)

(i). T (n) = T (n – 2) + 2 lg n (asumsikan T (0) = 2).

Karena paritas (genap-ganjil) dari n tidak berpengaruh pada nilai T (n) secara asimtotik, kita boleh mengasumsikan n genap. Dengan evaluasi iteratif, kita memiliki

solusi master theorem 9-1 solusi master theorem 9-2

(j). T (n) = √n T (√n) + 2013 n (petunjuk: misalkan T (n) = nS (n) dengan S (n) adalah fungsi yang asimtotik positif).

Misalkan T (n) = nS (n), maka T (√n) = √n S (√n). Akibatnya rekurensi pada soal setara dengan

solusi master theorem 10-1 solusi master theorem 10-2Demikianlah contoh penggunaan master theorem dalam masalah rekurensi, semoga bermanfaat!

 

Growth function question and solution

23 May

Misalkan f (n) dan g (n) keduanya adalah fungsi bernilai real yang asimtotik positif dengan domain N. Buktikan atau sangkal pernyataan-pernyataan berikut:

1). Jika f (n) = O(g (n)) maka 2^f(n) = O(2^g(n))

Solusi: Karena f (n) dan g (n) keduanya asimtotik positif, maka f (n), g (n) ≥ 0

Pernyataan salah. Karena jika kita pilih f (n) = 2n dan g (n) = n. Jelas bahwa 2n = O(n).
Akan tetapi tinjau bahwa

2^(2n) =(2^2)^n = 4^n ≠ O(2^n) .

Andaikan 4^n = O(2^n), maka kita memiliki

growth function

2). f (n) = θ(f (n/2))

Solusi: Karena f (n) dan g (n) keduanya asimtotik positif, maka f (n), g (n) ≥ 0

Pernyataan salah. Jika f (n) = θ(f (n/2)) maka haruslah f (n) = O(f (n/2)).  Jika kita pilih f (n) = 2^n. Akan dibuktikan bahwa 2^n ≠ O (2^(n/2))


Andaikan 2^n = O (2^(n/2)), maka kita memiliki

growth function2

 

Fungsi untuk menghitung bilangan faktorial di C

21 May

Pada kesempatan kali ini, saya mau sharing bagaimana cara kita membuat sebuah fungsi di bahasa pemrograman C yang berguna untuk mendapatkan hasil dari faktorial suatu bilangan. Tahukah kamu bilangan faktorial? Jadi bilangan faktorial itu seperti ini,contohnya jika kita nyatakan 5! itu sama dengan 5x4x3x2x1 = 120, untuk 4! = 4x3x2x1 = 24, dan lain sebagainya. Oke langsung saja:


#include <stdio.h>

int Faktorial (int N)
{
 if ( N==0){
 return 1;
 } else {
 return N * Faktorial (N-1);
 }
}

int main ()
{
 int bilangan;
 printf ("Masukkan bilangan yang akan dihitung : ");
 scanf ("%d", &bilangan);
 printf ("%d! = %d\n\n\n", bilangan, Faktorial (bilangan));
 return main ();
}

 

Fungsi di atas adalah fungsi rekursif yang berguna untuk mendapatkan hasil faktorial dari suatu bilangan. Selamat mencoba juga!

Update Repository pada Ubuntu 12.04 (Aka Precise Pangolin)

20 May

Repository Ubuntu adalah sebuah tempat yang berisikan ribuan software untuk operating system Ubuntu. Setiap software yang berada di repository telah di uji kompetibilitasnya untuk setiap versi Operating System Ubuntu. Dengan hadirnya repository membuat proses instalasi software menjadi lebih mudah didapatkan dan bisa dilakukan melalui koneksi internet.

Software yang barada di repository Ubuntu dibagi dalam empat area.

  1. Main, Software yang di support secara resmi oleh ubuntu.
  2. Restricted, Software yang di support oleh Ubuntu tetapi tidak sepenuhnya berlisensi gratis.
  3. Universe, Software yang dikembangkan dan dirawat oleh komunitas ubuntu
  4. Multiverse, Software yang tidak gratis

Banyak Server di internet yang menyedikan repository ubuntu, antara lain yang berada di Indonesia adalah di kambing.ui.ac.id yang beralamat server di Pusat Ilmu Komputer Universitas Indonesia Depok, 16424, INDONESIA – 152.118.24.30

Apabila komputer kita berada di Indonesia maka pilihan yang tepat adalah memilih repository ubuntu yang berada di Indonesia dengan alasan jarak yang lebih dekat sehingga akan semakin cepat downloadnya.

Secara default repository yang terpasang bukanlah repository lokal, oleh karena itu disini saya akan membahas bagaimana cara update ke repository lokal Indonesia. Berikut ini adalah langkah-langkahnya :

  1. Pertama buka Terminal/Console. Klik Menu => system => pilih konsole (terminal)
  2. Masuk ke root. ketik sudo su pada terminal, masukkan username dan password
  3. Ketik sudo kate /etc/apt/sources.list  maka akan muncul window seperti gambar inirepository lokal ubuntu
  4. Untuk pemula, diharapkan backup isi file sources.list ini ke notepad. Setelah itu, copy semua text dan ganti dengan repository lokal dibawah ini :
    Ubuntu Repository 12.04 di Kambing :
    deb http://kambing.ui.ac.id/ubuntu/ precise-proposed main restricted universe multiverse
    deb http://kambing.ui.ac.id/ubuntu/ precise-security main restricted universe multiverse
    deb http://kambing.ui.ac.id/ubuntu/ precise-updates main restricted universe multiverse
    deb http://kambing.ui.ac.id/ubuntu/ precise main restricted universe multiverse
    
    Ubuntu Repository 12.04 di UKDW :
    deb http://repo.ukdw.ac.id/ubuntu precise main restricted universe multiverse
    deb http://repo.ukdw.ac.id/ubuntu precise-updates main restricted universe multiverse
    deb http://repo.ukdw.ac.id/ubuntu precise-security main restricted universe multiverse
    deb http://repo.ukdw.ac.id/ubuntu precise-backports main restricted universe multiverse
    deb http://repo.ukdw.ac.id/ubuntu precise-proposed main restricted universe multiverse
    
    Ubuntu Repository 12.04 di Komo :
    deb http://komo.padinet.com/ubuntu/ precise-proposed main restricted universe multiverse
    deb http://komo.padinet.com/ubuntu/ precise-security main restricted universe multiverse
    deb http://komo.padinet.com/ubuntu/ precise-updates main restricted universe multiverse
    deb http://komo.padinet.com/ubuntu/ precise main restricted universe multiverse
    
    Ubuntu Repository 12.04 di ITB :
    deb ftp://ftp.itb.ac.id/pub/ubuntu/ precise-proposed main restricted universe multiverse
    deb ftp://ftp.itb.ac.id/pub/ubuntu/ precise-security main restricted universe multiverse
    deb ftp://ftp.itb.ac.id/pub/ubuntu/ precise-updates main restricted universe multiverse
    deb ftp://ftp.itb.ac.id/pub/ubuntu/ precise main restricted universe multiverse
  5. Langkah selanjutnya save file (Ctrl+S)
  6. Terakhir ketik pada terminal : sudo apt-get update untuk update repository.

Selesai, selamat download aplikasi (^_^)

Program Sederhana Membuat Segitiga Sama Sisi pada Java

19 May

Cara membuat program segitiga sama sisi berikut ini menggunakan perulangan (loop) for, dengan sedikit modifikasi pada source code seperti dibawah ini

public class samasisi {

public static void main (String[] args) {
 int n = 10;
 for(int i=1; i<=n; i++) {
 for(int j=n; j>i; j--) {
 System.out.print(" ");
 }
 for(int k=1; k<=i; k++) {
 System.out.print("* ");
 }
 System.out.println();
 }
 System.out.println();
 System.out.print("baris = " + n);
 }
}

Output

segitiga samasisi

Dasar-Dasar Penggunaan Editor VI [LINUX]

19 May

Editor VI merupakan editor berbasis layar yang digunakan oleh banyak pemakai UNIX. Berbasis layar berarti teks yang akan disunting ditampilkan dalam sebuah layar dan pemakai dapat menggerakkan kursor pada bagian layar yang ingin diperbaiki.

Jika kita menggunakan editor VI untuk pertama kalinya, mungkin kita akan mengalami kesulitan. Hal ini disebabkan karena perintah-perintah pada editor VI harus dihafalkan. Pada editor VI tidak terdapat menu-menu seperti pada editor PICO, sehingga ada kesan bahwa editor VI tidak user-friendly. Akan tetapi editor VI merupakan editor teks standar yang ada pada setiap sistem operasi UNIX. Jadi kita harus mengetahui dasar-dasar penggunaan editor VI untuk berjaga-jaga seandainya editor teks yang biasa kita gunakan tidak tersedia pada sistem operasi UNIX yang kita gunakan.

Dua Modus yang ada dalam editor VI

Hal pertama yang perlu diketahui oleh pemakai adalah bahwa editor VI memiliki dua modus, yaitu modus perintah (command mode) dan modus penyisipan (insert mode) Modus perintah dapat digunakan untuk memasukkan perintah-perintah untuk memanipulasi teks dan file. Perintah-perintah ini biasanya terdiri dari satu atau dua buah karakter. Modus penyisipan digunakan untuk melakukan pengetikan teks.

Pada saat kita memulai editor VI, kita langsung berada pada modus perintah. Ada beberapa perintah untuk memasuki mode penyisipan. Perintah-perintah yang paling sering digunakan adalah perintah a dan i. Bila kita menekan tombol [Escape], maka kita akan kembali ke modus perintah. Penekanan [Escape] pada modus perintah tidak akan mangakibatkan kita keluar dari modus perintah.

Memulai Editor VI

Dengan menggunakan editor VI, kita dapat membuat file baru atau menyunting file yang sudah ada. Perintah untuk memulai editor VI adalah “vi nama_file”. Bila nama_file merupakan file yang sudah ada, pada bagian bawah layar akan ditampilkan jumlah baris dan jumlah karakter pada file tersebut. Bila nama_file merupakan file baru, pada bagian bawah layar akan ditampilkan keterangan bahwa file tersebut adalah file baru.

Pada layar akan tampak baris-baris yang diawali dengan tanda tilde (~). Baris yang diawali dengan tanda ini menunjukkan baris tersebut belum pernah digunakan oleh pemakai. Editor VI juga dapat dimulai tanpa menyertakan nama_file. Akan tetapi nama_file ini harus diberikan pada saat kita ingin menyimpan pekerjaan ke file. Pada bagian kiri atas dari layar akan tampak kursor yang berkedip yang menunjukkan bahwa editor siap menerima perintah dari pemakai.

Keluar dari Editor VI

Untuk keluar dari editor VI, ada beberapa perintah yang dapat digunakan. Semua perintah ini harus dimasukkan dari modus perintah.

 Tabel 1. Perintah-perintah untuk keluar dari editor VI.

Perintah

Keterangan

:q [Enter] Keluar dari editor VI, hanya jika tidak ada modifikasi pada file.
ZZ Menyimpan ke file dan keluar dari editor VI
:wq [Enter] Sama seperti ZZ
:q! [Enter] Keluar dari editor VI tanpa harus menyimpan ke file

Untuk menyimpan ke file tanpa keluar dari editor VI, gunakan perintah :w [Enter].

Beberapa perintah pada modus perintah 

Penjelasan tentang perintah-perintah pada modus perintah akan dibagi dalam beberapa bagian. Perintah-perintah yang akan dijelaskan antara lain : menggerakkan kursor, menghapus teks, faktor pengulang, membatalkan perubahan atau penghapusan, mencari string, dan berpindah layar.

Menggerakkan kursor

Di bawah ini adalah perintah-perintah yang dapat digunakan untuk menggerakkan kursor pada modus perintah.

Tabel 2. Perintah-perintah untuk mengerakkan kursor.

Perintah Keterangan
l panah kanan atau spasi ke kanan 1 karakter
h atau panah kiri ke kiri 1 karakter
j atau panah bawah ke bawah 1 baris
k atau panah atas ke atas 1 baris

Menghapus Teks

Di bawah ini adalah perintah-perintah yang dapat digunakan untuk menghapus teks dari modus perintah.

 Tabel 3. Perintah-perintah untuk menghapus teks.

Perintah

Keterangan

x menghapus karakter pada posisi kursor
X menghapus karakter disebelah kiri kursor
dd menghapus satu baris pada posisi kursor
d [Enter] menghapus dua baris, baris pada posisi kursor dan baris berikutnya
d0 menghapus dari awal baris sampai tepat sebelum posisi kursor
d$ menghapus dari posisi kursor sampai akhir baris

Faktor Pengulang

Beberapa perintah dapat diulang beberapa kali dengan menambahkan jumlah pengulangan di depan perintah. Sebagai contoh, dd adalah perintah untuk menghapus satu baris. Untuk menghapus 3 buah baris tanpa harus memasukkan perintah dd sebanyak 3 kali dapat digunakan : 3dd.

Membatalkan Perubahan atau Penghapusan

Jika kita melakukan kesalahan menghapus tanpa sengaja, kita dapat memperbaikinya dengan menggunakan perintah u atau U. Perintah u digunakan untuk membatalkan perubahan terakhir yang dilakukan oleh pemakai, sedangkan perintah U digunakan untuk membatalkan seluruh perubahan pada satu baris.

Mencari String

Editor VI memiliki dua jenis pencarian, yaitu : string dan karakter. Untuk pencarian string, perintah yang digunakan adalah perintah / dan ?. Pada saat kedua perintah ini digunakan, perintah yang diketikkan akan muncul dibagian bawah layar, tempat kita mengetikkan string yang ingin dicari. Kedua perintah ini berbeda hanya pada arah pencarian yang akan dilakukan. Perintah / mencari ke arah bawah, sedangkan perintah ? mencari ke arah atas dari file. Perintah n dan N digunakan untuk melanjutkan proses pencarian yang sebelumnya. Perintah n akan mencari dalam arah yang sama, sedangkan perintah N akan mencari dalam arah yang berlawanan

Berpindah Layar

Editor VI juga menyediakan perintah-perintah untuk berpindah layar dengan cepat tanpa harus menggerakkan kursor perbaris. Perintah-perintah tersebut adalah :

Tabel 4. Perintah-perintah untuk berpindah perlayar.

Perintah

Keterangan

ctrl-b berpindah satu layar sebelumnya
ctrl-d turun setengah bagian layar
ctrl-f turun satu bagian layar
G turun ke bagian akhir dari file
line no. G memindahkan kursor ke line tertentu
ctrl-j naik setengah bagian layar

Perintah-perintah yang telah dijelaskan merupakan perintah-perintah dasar pada editor VI. Dengan mengetahui perintah-perintah tersebut, kita sudah dapat melakukan manipulasi pada suatu file teks dan menyimpannya kembali.

Sebenarnya masih banyak perintah-perintah pada editor VI yang memiliki banyak kegunaan antara lain : perintah untuk mengkonversi huruf besar kecil dan huruf kapital, menyisipkan isi dari suatu file, menyimpan sebagian teks ke suatu file, dan perintah-perintah map.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML

19 May

Desain tombol menggunakan Photoshop

Langkah 1 : Memulai dengan membuat lembar kerja baru

Tahap pertama sebelum kita ngoding html, kita harus membuat desain tombol yang kita inginkan menggunakan Photoshop. Okey langsung saja, kita buka aplikasi Adobe Photoshop. Buatlah sebuah lembar kerja baru dengan klik file > new. Pada kotak dialog yang muncul, isikan Name dengan nama “tombol” dengan widht dan height sebesar 120 pixels dan Resolution 72 pixels/inch.

Langkah 2 : Memulai mendesain tombol

Pilih Rounded rectangle tool pada toolbox, kemudian atur seperti berikut ini :

  1. Pilih fixed size
  2. isikan W : 120px, dan
  3. H:60px.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML

Langkah berikutnya, buatlah sebuah tombol kecil dengan warna biru (#08a6f0) dengan Rounded rectangle tool yang telah kita setting sebelumnya dan posisikan pada bagian atas.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML_2

Beri layer style pada tombol, seperti gambar berikut ini :

Gradient overlay.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML_8

Stroke.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML_4

Selanjutnya, tambahkan teks pada kotak berwarna biru dengan font Rockwell (/terserah kalian), sehingga menghasilkan tombol seperti contoh dibawah ini

Membuat Tombol Rollover Menggunakan Photoshop dan HTML_5

Agar layer-layer lebih tersruktur, kita buat group layer-layer tombol yang telah kita buat, dengan klik create a new group, lalu isikan nama grup ini dengan “atas”, sehingga akan mempermudah dalam pembuatan tombol rellovernya.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML_6

Langkah 3 : Membuat tombol rellover

Sebelumnya kita telah membuat group pada layer, selanjutnya adalah membuat tombol rellovernya. Klik kanan pada group layer dan pilih duplicate group, rename groupnya menjadi “bawah”. Pindahkan tombolnya kebawah sehingga menghasilkan gambar seperti berikut.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML

Pada group “bawah”, ganti layer style pada shape 1 dengan double klik pada layer shape tersebut, lalu ganti gradient overlaynya seperti berikut ini.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML_8

Berikut hasil yang telah kita desain.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML_7

Langkah 4 : Menghilangkan background

Hilangkan layer Background dengan menghilangkan tanda mata pada layer Background.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML_10

Langkah 5 : Menyimpan dalam bentuk png

Beralih kemenu file > Save for web & devices. Ubah preset ke PNG-24 untuk menyimpan tombol dengan background transparent.

Membuat Tombol Rollover Menggunakan Photoshop dan HTML_11

Klik Save dan tempatkan ke folder tertentu, pada contoh ini kita akan menempatkannya di folder “tombol-rellover” dengan nama file gambar “tombol”.

Membuat tombol dalam bentuk HTML dan CSS

Langkah 1 : Membuat dasar HTML

Disini, saya anggap kalian sudah mengerti dasar-dasar HTML dan CSS. Pertama siapkan alat pendukung, notepad/ code editor lainnya dan simpan ke dalam folder yang sama dengan gambar tombol yang tadi kita buat, simpan dengan anam index.html

Ketik code dasar, seperti dibawah ini

</pre>
<html>

<head>

<title>Membuat tombol rellover dari Photoshop hingga HTML</title>

</head>

<body>

</body>

</html>
<pre>

Langkah 2 : Menambahkan Link untuk gambar

Kita akan membuat metode link sebagai gambar rellover, diantara tag <body> hingga </body> tambahkan link berikut ini

</pre>
<a href="<a href="https://sciencebooth.wordpress.com/">https://sciencebooth.wordpress.com</a>/" class="tombol"></a>
<pre>

Langkah 3 : Menambahkan CSS

Kita akan membuat css langsung di dalam kode HTML, sehingga kita tidak harus membuat banyak file. Selanjutnya, tambahkan tag style CSS dan kita letakkan CSS ini di bawah sebelum tag </head>.

</pre>
<style type="text/css">

a{

margin:0 auto; /*Untuk membuat tombol ditengah*/

}

a.tombol{

border:0; /*Untuk menghilangkan garis pinggir*/

display:block;

width:120px; /*Panjang gambar*/

height:60px; /*Tinggi gambar 1*/

background:url(Tombol.png); /*Meload gambar*/

text-decoration:none; /*Menghilangkan garis bawah teks*/

}

a.tombol:hover{

background-position:0 -60px; /*Mengubah posisi background gambar dengan x=0 dan y=-60*/

}

</style>
<pre>

Simpan file html tersebut dan buka menggunakan browser anda seperti mozilla atau chrome.

Selamat mencoba (^_^)

 

Terima kasih kepada psdesain.com

Animasi Kincir Angin dengan Expression Blend 2

19 May

Saat ini orang sudah mulai bosan dengan sesuatu yang bersifat statis. Contoh hal yang bersifat statis adalah gambar. Nah, untuk itulah dibuat animasi yang akan menjadi solusi hal tersebut karena animasi bersifat dinamis.

Pada kesempatan kali ini kita akan mencoba membuat suatu aplikasi animasi dengan menggunakan tools bernama Expression Blend 2. Silakan menyiapkan secangkir teh dan sepiring biscuit untuk menemani Anda dalam membuat animasi.

Pertama buka aplikasi Expression Blend 2, kemudian klik file pada menu bar dan pilih new project (Ctrl + Shift + N). Kemudian pilih WPF Application (.exe).

expression blend animasi kincir angin

Beri nama project sesuka Anda. Klik OK dan Anda akan dihadapkan pada workspace project Anda. Add canvas pada workspace dengan cara klik kanan pada toolbox dan pilih canvas, set ukuran canvas pada properties dengan Widht 400 dan Heigth 400.

expression blend animasi kincir angin 2

 

Rename layer canvas menjadi standcanvas

expression blend animasi kincir angin 3

Buat vertical stand dan horizontal stand (Width 210 dan Height 10) menggunakan rectangle. Kemudian beri warna stand tersebut dengan menggunakan brush resources –> ControlDarkDarkBrushKey.

expression blend animasi kincir angin 4

Buat canvas lagi untuk menggambar baling-baling dengan Width 300 dan Height 250. Ubah nama layer menjadi wingscanvas.Kemudian buat baling-baling menggunakan ellipse. Atur Width menjadi 15 dan Height menjadi 100. Beri warna sesukan Anda dan duplikasikan menjadi 3 baling-baling. Kemudian buat satu lingkarang yang menyatukan ketiga baling-baling tersebut. Atur ketiga baling-baling tersebut sedemikian rupa sehingga berbentuk baling-baling kincir seperti yang terlihat pada gambar.

expression blend animasi kincir angin 5

expression blend animasi kincir angin 6 expression blend animasi kincir angin 7 expression blend animasi kincir angin 8

Demikianlah pembuatan animasi kincir angin dengan Expression Blend. Semoga bermanfaat!

Program untuk menghitung nilai y dari suatu persamaan garis lurus y = mx+c

18 May

Buatlah program untuk menghitung nilai y dari suatu persamaan garis lurus y = mx+c. Program menerima masukan nilai m, c, dan x dari user. Untuk saat ini, program hanya menerima masukan m, c,  dan x yang merupakan bilangan bulat.

Output haruslah memiliki format tampilan sebagai berikut:
Masukkan nilai m: 3
Masukkan nilai c: 5
Masukkan nilai x: 2

Nilai y untuk x=2 pada persamaan y=3x+5 adalah 11


#include <stdio.h>

int main()
{
int m, c, x, y;

 printf("masukkan nilai m:");
 scanf("%d", &m);
 printf("masukkan nilai c:");
 scanf("%d", &c);
 printf("masukkan nilai x:");
 scanf("%d", &x);

 y=m*x+c;

 printf("Nilai y untuk x=%d pada persamaan y = %dx + %d adalah %d", x, m, c, y);
 return 0;
}

Begitulah cara untuk membuat program penghitung nilai y dari suatu persamaan garis lurus y = mx+c. Semoga bermanfaat!