Senin, 01 Maret 2010

MYSQL Fulltext Search

MYSQL Fulltext Search

Untuk sebuah website yang memiliki banyak data, menyediakan fasilitas search merupakan hal yang tepat untuk mempermudah user mencari dengan "keyword" yang spesifik. Untuk membuat search engine ini, ada beberapa metode yang bisa digunakan, dan pada pembahasan kali ini, kita akan fokuskan kepada Full-text search pada MySQL.
Sebelum memulai, ada beberapa hal yang perlu diketahui, sbb:
  1. Sebuah full-text index pada Mysql adalah index dengan tipe FULLTEXT.
  2. Full-text index hanya dapat digunakan pada table MyISAM, dan dapat di buat untuk kolom dengan tipe CHAR, VARCHAR, atau TEXT.
  3. Full-text index dapat dibuat ketika kita membuat table "CREATE TABLE", atau dibuat kemudian menggunakan statement "ALTER TABLE" atau "CREATE INDEX"
  4. Untuk table dengan data yang besar, sebaiknya insert semua data terlebih dahulu pada table tanpa "FULLTEXT" index, kemudian baru buat "FULLTEXT" index setelah itu.
Sebelum kita masuk pada pembahasan mengenai cara pembuatan FULLTEXT search, terlebih dahulu perlu diketahui bahwa FULLTEXT search mempunyai 3 tipe yaitu "Boolean" , "Natural Languange" dan "Query Expansion".

Untuk memulai, kita perlu membuat sebuah table yang akan kita gunakan terus menerus dalam pembahasan ini.
#buat table dengan nama `article`
CREATE TABLE IF NOT EXISTS `article` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `title` varchar(150) NOT NULL,
  `body` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Setelah table di buat, kita masukan data dengan statement "INSERT INTO"
#insert data ke table `article`
INSERT INTO `article` (`id`, `title`, `body`) VALUES
(1, 'PHP & Mysql : Tutorial Dasar', 'Pada tutorial kali ini, kita akan mencoba melakuka...'),
(2, 'MySQL - Pengenalan', 'Tutorial MySQL di situs ini memang buat kamu-kamu ...'),
(3, 'Mysql', 'Tutorial penggunaan database masa kini...'),
(4, 'Mysql & Oracle Database', 'Database masa kini...'),
(5, 'Implementasi Oracle', 'Bagaimana menggunakan oracle...'),
(6, 'SqlLite Database', 'Penggunaan SqlLite dan cpanel...'),
(7, 'let it be', 'by The Beatles...');

Sebenarnya, pencarian dapat menggunakan tipe yang konvensional seperti:
SELECT * FROM article WHERE title like'%mysql%';
Tetapi pencarian kata/keyword menggunakan "LIKE" sangatlah tidak baik untuk data yang besar. Untuk itulah fulltext search dapat penjadi pilihan dalam melakukan fungsinya sebagai search feature dari MYSQL.
Seperti yang telah dijelaskan di point atas, untuk menjalankan FULLTEXT Search diperlukan index dengan tipe FULLTEXT pada field field yang ingin kita search. Di sini, saya akan menambahkan 2 FULLTEXT indexing pada 2 field yaitu `title` dan `body`.
ALTER TABLE article ADD FULLTEXT(title);
ALTER TABLE article ADD FULLTEXT(body, title);

Penggunaan Fulltext Search
1. Implementasi tipe "Natural Language"
Secara default, penggunaan Fulltext Search masuk kedalam tipe ini.


mysql> SELECT * FROM article WHERE MATCH (title) AGAINST ('tutorial');
+---+----------------------------------+-------------------------------------------------------------+
| id | title                                     | body                                                                     |
+---+----------------------------------+-------------------------------------------------------------+
|  1 | PHP & Mysql : Tutorial Dasar | Pada tutorial kali ini, kita akan mencoba melakuka... |
+---+----------------------------------+-------------------------------------------------------------+
1 row in set

Query di atas akan selalu mengembalikan result id dimana pada field `title` mengandung kata 'tutorial'.


Contoh lain penggunaan (1):


mysql> SELECT * FROM article WHERE MATCH (title) AGAINST ('tutor');
Empty set

Kenapa Empty set? karena tutor tidak sama dengan tutorial.


Contoh lain penggunaan (2):
mysql> SELECT * FROM article WHERE MATCH (title, body) AGAINST ('tutorial');
+----+---------------------------------------+----------------------------------------------------------------------------+
| id  | title                                 | body                                                                     |
+----+---------------------------------------+----------------------------------------------------------------------------+
|  1 | PHP & Mysql : Tutorial Dasar | Pada tutorial kali ini, kita akan mencoba melakuka...      |
|  3 | Mysql                                | Tutorial penggunaan database masa kini...                  |
|  2 | MySQL - Pengenalan           | Tutorial MySQL di situs ini memang buat kamu-kamu ... |
+----+---------------------------------------+----------------------------------------------------------------------------+
3 rows in set

Pada query diatas, pencarian dilakukan pada 2 field. Yaitu `title` dan `body`. Dan mengembalikan 3 result


Contoh lain penggunaan (3):
SELECT *, MATCH (title, body) AGAINST ('tutorial') as Score FROM article WHERE MATCH (title, body) AGAINST ('tutorial');
+----+---------------------------------------+----------------------------------------------------------------------------+----------------------------+
| id  | title                                  | body                                                                    | Score                     |
+----+---------------------------------------+----------------------------------------------------------------------------+----------------------------+
|  1 | PHP & Mysql : Tutorial Dasar | Pada tutorial kali ini, kita akan mencoba melakuka...      | 0.40983861684799 |
|  3 | Mysql                                | Tutorial penggunaan database masa kini...                  | 0.26911327242851 |
|  2 | MySQL - Pengenalan           | Tutorial MySQL di situs ini memang buat kamu-kamu ... | 0.22223679721355 |
+----+---------------------------------------+----------------------------------------------------------------------------+----------------------------+
3 rows in set

Makin besar Score makin relevant resultnya. Pada result di atas, bisa di ambil kesimpulan bahwa MySQL selalu sort by relevansi dari yang paling relevan ke yang kurang relevan.



Contoh lain penggunaan (4):
mysql> SELECT * FROM article WHERE MATCH (title) AGAINST ('mysql');
Empty set

Contoh query di atas tidak mengembalikan result. Kenapa? Padahal mysql juga terdapat pada field `title` maupun `body`? Ini dikarenakan MySql mengimplementasi "Stop Word" atau "Skip Word" untuk setiap keyword yang tampil pada 50% atau lebih dari total data.
2. Implementasi tipe Boolean
Tipe boolean mengijinkan kita untuk menambahkan operator operator pada keyword pencarian seperti + atau -.
Berikut List completenya:

Operator
Arti

Secara default, ini operator yang di pakai yang mempuyai arti "atau" / "or"
+
Tanda plus berarti keyword tersebut harus terdapat pada semua result yang didapatkan.
-
Tanda minus berarti keyword tersebut tidak boleh ada pada result yang didapatkan.
< >
Keyword yang diberikan tanda > atau < akan mempengaruhi relevansi. Pemberian tanda > pada awal kata mengakibatkan nilai relevansi/score menjadi
( )
Untuk melakukan grouping kemudian bisa menambahkan operator lain untuk menambah tingkat relevansi/score.
~
Operator ini berfungsi sebagai operator negasi. Jadi ketika sebuat keyword di berikan tanda ini, mengakibatkan relevansi/score minus (bukan 0).
*
Merupakan wildcard operator.

Operator ini digunakan pada awal dan akhir keyword yang terdiri dari 2 atau lebih kata.
Untuk mengetahui lebih jelas mengenai operator operator ini, kita akan test dengan beberapa contoh:

Contoh Boolean (1)
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+mysql -database' IN BOOLEAN MODE);
+----+-----------------------------------+---------------------------------------------------+
| id  | title                             | body                                             |
+----+-----------------------------------+----------------------------------------------------+
|  2 | How To Use MySQL Well | After you went through a ...            |
|  3 | Optimizing MySQL           | In this tutorial we will show ...          |
|  4 | 1001 MySQL Tricks         | 1. Never run mysqld as root. 2. ...     |
|  6 | MySQL Security              | When configured properly, MySQL ... |
+----+-----------------------------------+----------------------------------------------------+
4 rows in set

Result harus mengandung kata "mysql" dan tidak boleh mengandung kata "database" pada field title dan body.


Contoh Boolean (2)
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('tutor*' IN BOOLEAN MODE);
+----+-------------------------+----------------------------------------------+
| id  | title                    | body                                       |
+----+-------------------------+----------------------------------------------+
|  1 | MySQL Tutorial     | DBMS stands for DataBase ...      |
|  3 | Optimizing MySQL | In this tutorial we will show ...     |
+----+-------------------------+----------------------------------------------+
2 rows in set

Penambahan asterik pada awal ataupun akhir keyword menjadikannya seperti "LIKE 'tutor%'"


Contoh Boolean (3)
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+mysql +(>tutorial
+----+----------------------------+--------------------------------------------------------+
| id  | title                       | body                                                 |
+----+----------------------------+--------------------------------------------------------+
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...                |
|  3 | Optimizing MySQL    | In this tutorial we will show ...              |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+-----------------------------------------------------------------+
3 rows in set

Penggunaan seperti ini mengakibatkan data yang mengandung kata mysql dan tutorial akan lebih tinggi score relevansinya dibandingkan data yang mengandung mysql dan database. Dan semua result harus mengandung kata mysql+tutorial atau database.


Contoh Boolean (4)
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"mysql tutorial"' IN BOOLEAN MODE);
+----+---------------------+------------------------------------------+
| id  | title                | body                                  |
+----+---------------------+------------------------------------------+
|  1 | MySQL Tutorial | DBMS stands for DataBase ... |
+----+---------------------+------------------------------------------+
1 row in set

Result harus mengandung kata "mysql" yang kemudian diikuti oleh kata "tutorial"
3. Tipe Query Expansion
Query Expansion merupakan salah satu fitur yang bisa digunakan ketika pencarian pencarian hanya mengandung keyword yang sedikit. Ex: cuman satu kata.
Ketika user mencari dengan keyword "database", kemungkinan result yang diinginkan user adalah yang berkaitan dengan Mysql atau Oracle atau SqlLite dll. Dengan pengimplementasian query expansion, result yang dihasilakan diproses 2 kali dengan mempelajari result pencarian pertama kemudian digabungkan dengan result pencarian kedua dengan tambahan keyword yang paling relevant terhadap pencarian pertama.
Untuk lebih jelasnya, bisa kita coba dengan contoh.


Contoh penggunaan dengan tipe Natural Language


mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
+----+-------------------+------------------------------------------+
2 rows in set

Contoh penggunaan dengan tipe Query Expansion
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' WITH QUERY EXPANSION);
+----+----------------------------+--------------------------------------------------------+
| id  | title                       | body                                                 |
+----+----------------------------+--------------------------------------------------------+
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...                |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  3 | Optimizing MySQL    | In this tutorial we will show ...              |
+----+----------------------------+--------------------------------------------------------+
3 rows in set

Disini kita lihat bahwa pada result pertama keyword "mysql" selalu muncul, maka dianggap keyword "mysql" merupakan keyword dengan relevansi tinggi pada pencarian "database" sehingga result juga memunculkan semua data yang mengandung kata "mysql"
Note:
Penggunaan tipe ini pada keyword yang panjang mengakibatkan penambahan result yang tidak relevan.

Minggu, 28 Februari 2010

Regular Expression (Regex)

Regular expression atau sering disingkat jadi regex ato regexp, bukanlah bahasa pemrograman. regex adalah sebuah pattern atau pola dari suatu string. regex sering digunakan untuk pencarian string dengan cara menentukan pattern string tersebut.
pekerjaan system administrator, programmer dan bioinformatic tidak akan lepas dari pengunaan regular expression.
sejarah:
tahun 1950an, Stephen Cole Kleene seorang ahli matematika membuat sebuah model pattern string menggunakan notasi matematika, yang disebut regular sets. Ken Thompson mengimplementasikan notasi tersebut ke dalam text editor buatannya, QED, untuk pencarian string dengan pola tertentu. dia jg menambahkan fitur tersebut ke dalam ed, sebuah editor text dalam sistem operasi unix. untuk pencarian string dalam ed menggunakan pattern, perintahnya: /g /re /p (/g : globally, /re : regular expression, /p : print) yang maksudnya adalah pencarian global baris2 dalam sebuah file yang memiliki pola tertentu, dan ditampilkan/cetak/print. istilah grep akhirnya digunakan sebagai nama sebuah program/tool dalam sistem operasi unix untuk fungsi yang sama, pencarian string. semua sysadmin pasti tau grep :)
*jadi dasarnya adalah set theory (teori himpunan), di matakuliah matematika diskrit!! hehehe*
saat ini hampir semua bahasa pemrograman tingkat tinggi sudah
mendukung regex. kalo memang ga ada, tinggal cari library/komponennya aja, banyak tersebar di internet dan ada untuk berbagai bahasa pemrograman. Perl menggunakan library regex yang ditulis oleh Henry Spencer, yang kemudian menambahkan banyak fitur baru dalam regex Perl. PHP ikut mengadaptasi regex dari Perl. :)
dalam dunia bioinformatic (biologi & informatika), DNA2 makhluk hidup dapat dikodekan menjadi string2. kode DNA2 tersebut masing2 memiliki pola2 string tertentu. sayangnya konfersi DNA2 mengasilkan file text/string yang sangat besar, sehingga susah untuk dianalisa (dna 1 manusia lengkap bisa berukuran beberapa puluh MB, isinya text semua). penggunaan regex sangat membantu pekerjaan menganalisa DNA, protein, gen, dll dalam bidang bioinformatic. bahasa pemrograman yang populer dalam bidang ini adalah Perl dan python karena kemampuan regexnya :)
sumber:
* http://en.wikipedia.org/wiki/Regular_expression
* http://www.regular-expressions.info
* http://blindscientist.genedrift.org/2007/09/12/bioinformatic-perl-or-python
* http://arglist.com/regex
* chatting via YM dengan popollz, praktisi bioinformatic

Sabtu, 20 Februari 2010

Password Hashing

Password Hashing

by James McGlinn

In this article I'm going to cover password hashing, a subject which is often poorly understood by newer developers. Recently I've been asked to look at several web applications which all had the same security issue - user profiles stored in a database with plain text passwords. Password hashing is a way of encrypting a password before it's stored so that if your database gets into the wrong hands, the damage is limited. Hashing is nothing new - it's been in use in Unix system password files since long before my time, and quite probably in other systems long before that. In this article I'll explain what a hash is, why you want to use them instead of storing real passwords in your applications, and give you some examples of how to implement password hashing in PHP and MySQL.

Foreword

As you read on you'll see that I advocate the use of a hashing algorithm called Secure Hashing Algorithm 1 (or SHA-1). Since I wrote this article, a team of researchers - Xiaoyun Wang, Yiqun Lisa Yin, and Hongbo Yu - have shown SHA-1 to be weaker than was previously thought. This means that for certain purposes such as digital signatures, stronger algorithms like SHA-256 and SHA-512 are now being recommended. For generating password hashes, SHA-1 still provides a more than adequate level of security for most applications today. You should be aware of this issue however and begin to think about using stronger algorithms in your code as they become more readily available.
For more information please see Bruce Schneier's analysis of the issue at http://www.schneier.com/blog/archives/2005/02/cryptanalysis_o.html

What Is A Hash?

A hash (also called a hash code, digest, or message digest) can be thought of as the digital fingerprint of a piece of data. You can easily generate a fixed length hash for any text string using a one-way mathematical process. It is next to impossible to (efficiently) recover the original text from a hash alone. It is also vastly unlikely that any different text string will give you an identical hash - a 'hash collision'. These properties make hashes ideally suited for storing your application's passwords. Why? Because although an attacker may compromise a part of your system and reveal your list of password hashes, they can't determine from the hashes alone what the real passwords are.

So How Do I Authenticate Users?

We've established that it's incredibly difficult to recover the original password from a hash, so how will your application know if a user has entered the correct password or not? Quite simply - by generating a hash of the user-supplied password and comparing this 'fingerprint' with the hash stored in your user profile, you'll know whether or not the passwords match. Let's look at an example:

User Registration And Password Verification

During the registration process our new user will provide their desired password (preferably with verification and through a secure session). Using code similar to the following, we store their username and password hash in our database:
Figure 1. Our user enters their preferred access details
/* Store user details */

$passwordHash = sha1($_POST['password']);

$sql = 'INSERT INTO user (username,passwordHash) VALUES (?,?)';
$result = $db->query($sql, array($_POST['username'], $passwordHash));

?>
The next time our user logs in, we check their access credentials using similar code as follows:
Figure 2. Logging back in
/* Check user details */

$passwordHash = sha1($_POST['password']);

$sql = 'SELECT username FROM user WHERE username = ? AND passwordHash = ?';
$result = $db->query($sql, array($_POST['username'], $passwordHash));
if ($result->numRows() < 1)
{
    /* Access denied */
    echo 'Sorry, your username or password was incorrect!';
}
else
{
    /* Log user in */
    printf('Welcome back %s!', $_POST['username']);
}

?>

Types Of Hashes

There are a number of strong hashing algorithms in use, the most common of which are MD5 and SHA-1. Older systems - including many Linux variants - used Data Encryption Standard (DES) hashes. With only 56 bits this is no longer considered an acceptably strong hashing algorithm and should be avoided.

Examples

In PHP you can generate hashes using the md5() and sha1 functions. md5() returns a 128-bit hash (32 hexadecimal characters), whereas sha1() returns a 160-bit hash (40 hexadecimal characters). For example:
$string = 'PHP & Information Security';
printf("Original string: %s\n", $string);
printf("MD5 hash: %s\n", md5($string));
printf("SHA-1 hash: %s\n", sha1($string));

?>
This code will output the following:
Original string: PHP & Information Security
MD5 hash: 88dd8f282721af2c704e238e7f338c41
SHA-1 hash: b47210605096b9aa0129f88695e229ce309dd362
In MySQL you can generate hashes internally using the password(), md5(), or sha1 functions. password() is the function used for MySQL's own user authentication system. It returns a 16-byte string for MySQL versions prior to 4.1, and a 41-byte string (based on a double SHA-1 hash) for versions 4.1 and up. md5() is available from MySQL version 3.23.2 and sha1() was added later in 4.0.2.
mysql> select PASSWORD( 'PHP & Information Security' );
+------------------------------------------+
| PASSWORD( 'PHP & Information Security' ) |
+------------------------------------------+
| 379693e271cd3bd6                         |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> select MD5( 'PHP & Information Security' );
+-------------------------------------+
| MD5( 'PHP & Information Security' ) |
+-------------------------------------+
| 88dd8f282721af2c704e238e7f338c41    |
+-------------------------------------+
1 row in set (0.01 sec)
Note: Using MySQL's password() function in your own applications isn't recommended - the algorithm used has changed over time and prior to 4.1 was particularly weak.
You may decide to use MySQL to calculate your hash rather than PHP. The example of storing our user's registration details from the previous section then becomes:
/* Store user details */

$sql = 'INSERT INTO user (username, passwordHash) VALUES (?, SHA1(?))';
$result = $db->query($sql, array($_POST['username'], $_POST['password']));

?>

Weaknesses

As a security measure, storing only hashes of passwords in your database will ensure that an attacker's job is made that much more difficult. Let's look at the steps they'll now take in an effort to compromise your system. Assuming that they've managed to access your user database and list of hashes, there's no way that they can then recover the original passwords to your system. Or is there?
The attacker will be able to look at your hashes and immediately know that any accounts with the same password hash must therefore also have the same password. Not such a problem if neither of the account passwords is known - or is it? A common technique employed to recover the original plain text from a hash is cracking, otherwise known as 'brute forcing'. Using this methodology an attacker will generate hashes for numerous potential passwords (either generated randomly or from a source of potential words, for example a dictionary attack). The hashes generated are compared with those in your user database and any matches will reveal the password for the user in question.
Modern computer hardware can generate MD5 and SHA-1 hashes very quickly - in some cases at rates of thousands per second. Hashes can be generated for every word in an entire dictionary (possibly including alpha-numeric variants) well in advance of an attack. Whilst strong passwords and longer pass phrases provide a reasonable level of protection against such attacks, you cannot always guarantee that your users will be well informed about such practices. It's also less than ideal that the same password used on multiple accounts (or multiple systems for that matter) will reveal itself with an identical hash.

Making It Better

Both of these weaknesses in the hashing strategy can be overcome by making a small addition to our hashing algorithm. Before generating the hash we create a random string of characters of a predetermined length, and prepend this string to our plain text password. Provided the string (called a "salt") is of sufficient length - and of course sufficiently random - the resulting hash will almost certainly be different each time we execute the function. Of course we must also store the salt we've used in the database along with our hash but this is generally no more of an issue than extending the width of the field by a few characters.
When we validate a user's login credentials we follow the same process, only this time we use the salt from our database instead of generating a new random one. We add the user supplied password to it, run our hashing algorithm, then compare the result with the hash stored in that user's profile.
define('SALT_LENGTH', 9);

function generateHash($plainText, $salt = null)
{
    if ($salt === null)
    {
        $salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
    }
    else
    {
        $salt = substr($salt, 0, SALT_LENGTH);
    }

    return $salt . sha1($salt . $plainText);
}

?>
Note: The function above is limited in that the maximum salt length is 32 characters. You may wish to write your own salt generator to overcome this limit and increase the entropy of the string.
Calling generateHash() with a single argument (the plain text password) will cause a random string to be generated and used for the salt. The resulting string consists of the salt followed by the SHA-1 hash - this is to be stored away in your database. When you're checking a user's login, the situation is slightly different in that you already know the salt you'd like to use. The string stored in your database can be passed to generateHash() as the second argument when generating the hash of a user-supplied password for comparison.
Using a salt overcomes the issue of multiple accounts with the same password revealing themselves with identical hashes in your database. Although two passwords may be the same the salts will almost certainly be different, so the hashes will look nothing alike.
Dictionary attacks with pre-generated lists of hashes will be useless for the same reason - the attacker will now have to recalculate their entire dictionary for every individual account they're attempting to crack.

Summary

We've seen now what hashes are and why you should store them instead of the plain text passwords they represent in your database. The examples above are a starting point and will get you on the right track with using hashes in your PHP applications. A little bit of work now may well mean much less of a headache further down the track!

About The Author

James McGlinn is a developer and project manager for Nerds Inc. where he provides application design, development and auditing services for a range of clients in New Zealand and abroad. PHP has been his language of choice since 1999. He is a Zend Certified Engineer and founded and facilitates the NZ PHP Users Group.
For more information he can be reached through Nerds Inc. at http://nerdsinc.co.nz/.

Selasa, 16 Februari 2010

Inside Netmedia Solutions


The People

Netmedia Solutions is dedicated to finding and retaining people who can make a difference to our clients and our company. People are our key assets. We are a group with widely diverse professional disciplines and interests who share the experience of superior academic background, professional training, high personal standards, and creative thinking. Because we constantly rely on one another in our approach to client engagements, we have worked hard to build a group of people who respect others ideas and integrity, and who value one another as colleagues and friends. In addition, to optimize our human resource potential, we are transforming leadership structure, designing programs for professional development and building a personnel infrastructure to facilitate growth and change.

The Organization
We recognize that our success as a company depends not only on finding the best people, but also on providing them with an environment in which they can reach their highest potential. Netmedia Solutions cultures are dynamic, smart working, practical and friendly. We place a high value on individual energy, creativity, self-confidence, and willingness to learn new technology, high motivation, openness to critiques and constructive feedback, and perception to threats as opportunities. We strive to minimize hierarchy and maximize individual autonomy. Our organization is designed to encourage close working relationships and a free flow of ideas.

Minggu, 14 Februari 2010

Info istilah akuntansi ( D ) debit note

Untuk kali ini kembali, saya dapat informasi kembali seputar istilah akuntansi dengan awalan huruf ( D ) atau sering di sebut dengan ( delta ) hal ini dimaksudkan agar para pembaca yang membutuhkan informasi istilah akuntansi ini dapat dengan mudah untuk mencari dan sekaligus mengetahui arti dari istilah tersebut. atau kita dapat mengtahui istilah akuntansi yang sebelumnya dalam kumpulan istilah akuntansi .
Dan berikut ini info istilah akuntansi dengan awalan hurup ( D ) :
  • DEBIT NOTE = Nota debet
  • DEBIT BALANCE = saldo debet
  • DEDUCTION = Pengurangan
  • DEFECTIVE GOODS = Produk rusak
  • DEFERRED GROS PROFIT ON REALIZATION = Laba kotar yang belum direalisasikan
  • DELIVERY EXPENSE = Biaya pengankutan
  • DEPOSIT SLIP = Bukti setoran
  • DEPRECIATION = Penyusutan
  • DEPRECIATION EXPENSE = Biaya penusutan
  • DETERMINING DEPRECIATION = Penetapan penyusutan
  • DIRECT COSTING = Penetapan biaya langsung
  • DIRECT DEPARTMENT OVERHEAD EXPENSE = Beban/biaya overhead departemen lansung
  • DIRECT EXPENSE = Biaya langsung
  • DIRECT LABOR COST BUTGET = Biaya anggaran buruh langsung
  • DIRECT TAXES = Pajak langsung
  • DIRECT WRITE OFF = Penghapusan langsung
  • DISCOUNT = Potngan ( harga )
  • DISSOLUTION = Pembubaran
  • DIVIDEND STOCK = Deviden saham
  • DOUBLE ENTRY SYSTEM = Sistem pembukuan berpasangan
  • DRAFT ( info ) = Wesel
  • DUE DATE = Tanggal jatuh tempo
Semoga info ini dapat bermanfaat dan membnatu kita dalam memahami istilah-istilah akunansi yang kita jumpai.

Kamis, 11 Februari 2010

Lowongan CodeIgniter Programmer dan Mobile Programmer

CodeIgniter Programmer

Requirements:- Pengetahuan dasar yang baik dalam pemrograman berbasis web.
- Memiliki pengalaman mengembangkan aplikasi dengan CodeIgniter/CakePHP dan database MySQL minimal 1 tahun (memiliki pengalaman development dengan SQLServer merupakan nilai tambah).
- Menguasai javascript, css dan html (menguasai AJAX merupakan nilai tambah).
- Menguasai extjs merupakan nilai tambah.
- Mempunyai kemauan untuk mempelajari teknologi baru.
- Dapat bekerja sama dalam suatu team.

2. Mobile Application Programmer

Requirements:- Pengetahuan dasar yang baik dalam pemrograman mobile application.
- Memiliki pengalaman mengembangkan aplikasi dalam platform J2ME/BB/iPhone minimal 1 tahun.
- Mempunyai kemauan untuk mempelajari teknologi baru.
- Dapat bekerja sama dalam suatu team.


How to apply:- Kirimkan CV/resume ke julius.liman@dyvia.com dengan subject "[CI]Programmer" atau "[Mobile]Programmer", tolong cantumkan juga expected salary
- Penerimaan lamaran paling lambat pada tanggal 28 February 2010
- Hanya kandidat yang terpilih akan dihubungi untuk interview

Sabtu, 06 Februari 2010

Project Schedule

Project Schedule ( Jadwal Proyek )

Project  Schedule  atau  jadwal  proyek  dibuat  oleh  project  manager  untuk  mengatur  manusia  di
dalam  proyek  dan  menunjukkan  kepada  organisasi  bagaimana  pekerjaan  (proyek)  akan
dilaksanakan.  Ini  adalah  alat  untuk  memantau  (bagi  project  manager)  apakah  proyek  dan  tim
masih terkendali atau tidak.
Project schedule berbentuk kalender yang dihubungkan dengan pekerjaan yang harus dikerjakan
dan daftar resource yang dibutuhkan. Sebelum jadwal dibuat, WBS harus terlebih dahulu ada, jika
tidak maka jadwal tersebut akan terkesan mengada-ada.
Untuk  membuat  project  schedule,  ada  beberapa  software  yang  bisa  dijadikan  pilihan.  Pilihan
software  yang  gratis  dan  open  source  antara  lain: Open Workbench,  dotProject,  netOffice  dan
Tutos. Beberapa hal perlu diperhatikan ketika membuat project schedule, seperti:
1.  Alokasi resource pada tiap pekerjaan,
Resource  bisa  berupa  berbagai  hal  seperti  manusia,  barang,  peralatan  (komputer,
proyektor,  dll),  tempat  (ruang  rapat,  misalnya)  atau  layanan  (seperti  training  atau  tim
pendukung  out  source)  yang  dibutuhkan  dan  mungkin  ketersediaannya  terbatas.
Bagaimanapun juga resource yang utama adalah manusia.
Pertama,  project  manager  akan  mengalokasikan  orang(-orang)  tertentu  untuk  suatu
pekerjaan.  Kemudian,  selama  pekerjaan  tersebut  berlangsung,  orang  tersebut  mungkin
menjadi terlalu sibuk sehingga tidak bisa dialokasikan untuk pekerjaan lainnya. Perhatikan
bahwa  pemilihan  pelaku  perlu  disesuaikan  dengan  kemampuan  dan  berbagai  hal  lain
karena ada pekerjaan  yang dapat dilakukan oleh  siapa  saja,  tetapi umumnya pekerjaan
hanya dapat dikerjakan oleh satu atau beberapa orang saja.
2.  Identifikasikan setiap ketergantungan,
Sebuah pekerjaan disebut memiliki ketergantungan jika melibatkan aktivitas, resource atau
work  product  yang  dihasilkan  pekerjaan/aktivitas  lain.  Contoh:  test  plan  tidak  mungkin
dilaksanakan selama software belum diimplementasikan/ditulis, program baru dapat ditulis
setelah class atau modul dibuat dan dideskripsikan pada tahapan desain.
Tiap  pekerjaan  pada WBS  perlu  diberi  nomor,  dengan  angka  tersebut  bergantung  pada
nomor pekerjaan syaratnya. Berikut ini adalah sedikit gambaran tentang bagaimana suatu
pekerjaan menjadi tergantung pada pekerjaan lainnya.
Gambar 1
Gambar 1
3.  Buat jadwalnya
Tiap  pekerjaan  juga  memiliki  jangka  waktu  pekerjaan.  Dengan  demikian  jadwal  bisa
dibuat, contoh:
Gambar 2
Gambar 2
Tiap  pekerjaan  ditunjukkan  dengan  kotak,  sedangkan  ketergantungan  antar  pekerjaan
ditunjukkan  dengan  gambar  panah. Kotak  hitam  berbentuk wajik  antara D  dan E  (pada
gambar di atas) disebut milestone atau pekerjaan tanpa durasi. Milestone digunakan untuk
menunjukkan kejadian penting pada jadwal. Sedangkan kotak hitam panjang antara C dan
D  yang  juga  mengandung  potongan  wajik  menunjukkan  summary  task  atau  dua  sub
pekerjaan yang memiliki induk yang sama.
Jadwal bisa dibuat dalam bentuk Gantt Chart, PERT atau diagram semacamnya.
Contoh Gantt Chart yang dibuat dengan sebuah tool manajemen proyek:
Gambar 3
Gambar 3
Risk Plan
Risk  plan  adalah  daftar  resiko/masalah  yang  mungkin  terjadi  selama  proyek  berlangsung  dan
bagaimana  menangani  terjadinya  resiko  tersebut.  Bagaimanapun  juga  ketidakpastian  adalah
musuh  semua  rencana,  termasuk  rencana  proyek.  Terkadang  ada  saja  waktu-waktu  yang  tidak
menyenangkan  bagi  proyek,  banyak  kesulitan  terjadi  misalnya  suatu  resource  tiba-tiba  tidak
tersedia. Oleh karenanya risk plan adalah persiapan terbaik menghadapi ketidakpastian.
Langkah-langkah berikut dapat menjadi acuan untuk mendapatkan Risk Plan:
1.  Pembahasan resiko potensial
Project manager akan memimpin  sebuah  sesi/rapat  untuk mengidentifikasikan masalah-
masalah yang mungkin akan muncul. Anggota  tim akan dipancing untuk mengemukakan
resiko-resiko yang  terpikirkan. Project manager akan menuliskannya di papan  tulis setiap
ada yang mengemukakan pendapat yang relevan. Sedikit pendapat mungkin akan muncul
pada  awalnya,  kemudian  berlanjut  dengan  tanggapan  yang  susul-menyusul  hingga
akhirnya suasana mendingin sampai akhirnya pendapat terakhir diutarakan.
Resiko  yang  dimaksud  di  sini  adalah  resiko  spesifik.  Jika  suatu  resiko  dirasa  belum
spesifik maka project manager akan memancing agar permasalahan disampaikan secara
lebih spesifik. Sumber masalah yang baik lainnya adah asumsi-asumsi yang muncul ketika
membuat Vision and Scope dan melakukan estimasi dengan metode Wideband Dephi.
2.  Estimasi dampat tiap resiko/masalah
Tim akan memberikan rating untuk setiap resiko. Nilainya berkisar dari 1 (masalah dengan
resiko  kecil)  hingga  5  (masalah  dengan  resiko  besar,  kemungkinan  munculnya  besar,
mungkin menghabiskan biaya besar dan sulit untuk membereskannya).
3.  Buat sebuah risk plan
Tim akan mengidentifikasi langkah-langkah yang akan di ambil untuk mengatasi masalah-
masalah yang akan muncul tersebut, dimulai dari resiko bernilai 5.
Penjadwalan Proyek
PERT  adalah  suatu  alat  manajemen  proyek  yang  digunakan  untuk  melakukan  penjadwalan,
mengatur  dan mengkoordinasi  bagian-bagian  pekerjaan  yang  ada  didalam  suatu  proyek. PERT
yang memiliki kepanjangan Program Evalution Review Technique adalah suatu metodologi yang
dikembangkan  oleh  Angkatan  Laut  Amerika  Serikat  pada  tahun  1950  untuk mengatur  program
misil.  Sedangkan  terdapat  metodologi  yang  sama  pada  waktu  bersamaan  yang  dikembangkan
oleh sektor swasta yang dinamakan CPM atau Critical Path Method.
Metodologi PERT divisualisasikan dengan suatu grafik atau bagan yang melambangkan  ilustrasi
dari sebuah proyek. Diagram jaringan ini terdiri dari beberapa titik (nodes) yang merepresentasikan
kejadian  (event)  atau  suatu  titik  tempuh  (milestone).  Titik-titik  tersebut  dihubungkan  oleh  suatu
vektor  (garis  yang memiliki arah)  yang merepresentasikan  suatu pekerjaan  (task) dalam  sebuah
proyek. Arah dari vektor atau garis menunjukan suatu urutan pekerjaan.
Gambar 4
Gambar 4
Dari gambar 1 dapat diamati bahwa setiap arah panah akan menunjukan suatu urutan pengerjaan.
Seperti pekerjaan 1 dilakukan  terlebih dahulu  (start), kemudian bisa dilanjutkan oleh pekerjaan 2,
3, 4, setelah  itu pekerjaan 5,6. Titik 7 adalah  titik  finish dimana pekerjaan  terakhir dilakukan dan
merupakan akhir dari sebuah proyek. Selain menunjukkan suatu urutan pengerjaan diagram PERT
juga menunjukan  suatu  keterikatan antar pekerjaan yang  tidak dapat dipisahkan. Keterikatan  itu
dapat  dilihat  dengan  contoh  pekerjaan  2,  3,  4  hanya  dapat  dilakukan  jika  pekerjaan  1  sudah
selesai dilakukan.
Sebuah pekerjaan yang dapat dilakukan bersamaan dengan pekerjaan  lain disebut  juga sebagai
pekerjaan  pararel  (pararel  task  atau  concurrent  task).  Selain  itu  terdapat  juga  sebuah  aktivitas
yang diwakili oleh garis putus-putus yang disebut dengan dummy activities. Dari sebuah diagram
PERT  dapat  digunakan  untuk mengetahui  suatu  urutan  aktivitas  kritis  atau  aktivitas  yang  harus
dilakukan  sebagai  prioritas  utama  (critical  path),  penjadwalan  dengan  aktivitas  lain,  dan  jumlah
pekerja yang dibutuhkan.
KARAKTERISTIK PERT
Dari langkah-langkah penjelasan metode PERT maka bisa dilihat suatu karakteristik dasar PERT,
yaitu sebuah jalur kritis. Dengan diketahuinya jalur kritis ini maka suatu proyek dalam jangka waktu
penyelesaian yang lama dapat diminimalisasi.
Ciri-ciri jalur kritis adalah:
  Jalur yang biasanya memakan waktu terpanjang dalam suatu proses.
  Jalur yang tidak memiliki tenggang waktu antara selesainya suatu tahap kegiatan dengan
mulainya suatu tahap kegiatan berikutnya.
  Tidak adanya tenggang waktu tersebut yang merupakan sifat kritis dari jalur kritis.
KARAKTERISTIK PROYEK
  Kegiatannya  dibatasi  oleh  waktu;  sifatnya  sementara,  diketahui  kapan  mulai  dan
berakhirnya.
  Dibatasi oleh biaya.
  Dibatasi oleh kualitas.
  Biasanya tidak berulang-ulang.
MANFAAT PERT
1.  Mengetahui ketergantungan dan keterhubungan tiap pekerjaan dalam suatu proyek.
2.  Dapat mengetahui implikasi dan waktu jika terjadi keterlambatan suatu pekerjaan.
3.  Dapat mengetahui  kemungkinan untuk mencari  jalur alternatif  lain  yang  lebih baik untuk
kelancaran proyek.
4.  Dapat mengetahui kemungkinan percepatan dari salah satu atau beberapa jalur kegiatan.
5.  Dapat mengetahui batas waktu penyelesaian proyek.