Selasa, April 17, 2007

Review SQuirreL SQL Client

Baru saja saya install dan coba2 aplikasi SQuirreL SQL Client, sebuah aplikasi freeware yang dapat didownload dari sourceforge.net

Aplikasi ini dibangun menggunakan Java, sehingga dapat dijalankan di berbagai OS yang telah memiliki JavaVM. Proses instalasi cukup sederhana dan mudah dilakukan.
Tampilan awal aplikasi masih menggunakan theme metal default dari Java. Aplikasi ini langsung mengenali beberapa driver JDBC yang terinstall, tidak seperti DBVisualizer (pembahasan mengenai DBVisualizer menyusul)

Ketika hendak membuat koneksi ke MySQL di localhost, saya cukup kerepotan mencari tombol untuk melakukannya. Di aplikasi ini, task untuk melakukan koneksi disebut dengan istilah Alias. Untuk membuat koneksi ke MySQL, pengguna harus menuliskan string koneksi dalam format JDBC (jdbc:mysql://localhost/). Hal ini dirasa cukup menyulitkan bagi pemula, apalagi yang belum pernah menggunakan JDBC, walaupun aplikasi telah menyediakan template di isian URLnya (jdbc:mysql://<hostname>[,<failoverhost>][<:3306>]/<dbname>[?<param1>=<value1>][&<param2>=<value2>])

Setelah koneksi terjalin, hal yang cukup merepotkan lainnya adalah ketika ingin melihat informasi tabel di sebuah database. Jika di-klik dari panel tree di kiri jendela utama, tidak tampil apapun di bagian kanannya. Ternyata harus dipilih Catalog yang hendak ditampilkan dari dropdown di bagian atas tree. Dropdown ini berisi list schema. Setelah schema dipilih, barulah tampil list tabel pada tree struktur di bagian kanan. Kenapa ga diintegrasikan aja ke dalam tree-nya, biar ga 2 kali kerja kan??

Eksplorasi aplikasi ini baru sampai pada bagian ini. Info tabel yang tampil di bagian kanan cukup lengkap, dibagi dalam tab2. Yang belum ketemu hingga saat ini adalah cara menambah data ke dalam tabel, maupun untuk mengubah struktur tabel. Aplikasi ini memiliki potensi untuk berkembang lebih baik lagi, semoga saja bisa menggantikan peran Navicat (lihat tulisan sebelumnya).

Selasa, April 10, 2007

Weird GNU C++

While programming in C++, I need to transform a string into lower case. I search how to do it, and found a STL algorithm transform:

#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
using namespace std;
int main() {
  //create a string
  string s("Some STRING with MiXed cASE");
  cout << "original: " << s << endl;
  //lowercase all characters
  transform (s.begin(), s.end(),    //source
             s.begin(),             //destination
             tolower);              //operation
  cout << "lowered: " << s << endl;
  //uppercase all characters
  transform (s.begin(), s.end(),    //source
             s.begin(),             //destination
             toupper);              //operation
  cout << "uppered: " << s << endl;
}


However, when I compile it, I got this error message:
error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*,>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*,>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*,>, std::allocator<char> > >, <unresolved>)'


After googling for it, I've found a tricky solution here. Just made a new function:
char to_lower (const char c) { return tolower(c); }


Then change the transform function calling into:
  //lowercase all characters
  transform (s.begin(), s.end(),    //source
             s.begin(),             //destination
             to_lower);             //operation
  cout << "lowered: " << s << endl;


It's now compiled with error free, and running as expected. Weird isn't it??

Update : I've found another link explaining this phenomena here.
Rewriting the transform calling into this works too.
  //lowercase all characters
  transform (s.begin(), s.end(),    //source
             s.begin(),             //destination
             (int(*)(int))std::tolower);             //operation
  cout << "lowered: " << s << endl;

Powerful non free Programming Tools

Here the list of a powerful but, unfortunately, non free programming tools. I hope I could find a free-version replacement tools for these.

  1. Power Designer.
    To design a complex database, with many relation between entities, this tools is a must. Power Designer could make a CDM, and convert it into PDM, or you could reverse engineering existing database schema into PDM and CDM.
  2. Navicat
    Browsing database scheme, make new databases, grant privileges, build query from many joined tables. These functionalities are the Navicat's killer feature that I couldn't find in another MySQL tools (yet).
  3. Macromedia Dreamweaver MX 2004 + PHAkt
    Web programming with PHP+MySQL+ADOdb will be easier with this deadly combo. But I'm not prefer using Dreamweaver now,cause it mess with the code identation. I prefer using Notepad++ to edit all of my code, it's a powerful text editor. Dreamweaver is good to test a color, cause you could choose the color from color wheel or color diagram.
I hope this list is not get longer than the above item, and I hope I could find the replaement tools for the first 2 item. If you know, tell me, okay ;)

Kamis, April 05, 2007

OCCI Programming

Untuk mengakses database Oracle dari program yang dibuat dengan bahasa C++, Oracle telah menyediakan interface yang disebut OCCI. Pedoman pemrograman OCCI tersedia di website Oracle dan dapat didownload secara gratis di link ini.

Berikut ini sharing pengalaman saya menggunakan OCCI ini di pekerjaan yang sedang saya kerjakan.

Pola umum program:

Environment *env = Environment::createEnvironment(Environment::OBJECT);
try {
  Connection *con = env->createConnection(userName, password, connectString);
  Statement *stmt = con->createStatement(query);
  ResultSet *rs = stmt->executeQuery();
  ...
  stmt->closeResultSet(rs);
  con->terminateStatement(stmt);
  env->terminateConnection(con);
}
catch (SQLException &e) {
    cerr << "ERROR" << endl;
    cerr << e.getErrorCode() << endl;
    cerr << e.getMessage() << endl;
}


Potongan kode diatas merupakan pola umum untuk melakukan query ke database Oracle. userName, password, connectString merupakan variabel bertipe string yang isinya disesuaikan dengan informasi akses pengguna ke database yang hendak diakses. query merupakan variabel string yang berisi query yang hendak dijalankan terhadap database yang sedang diakses.

Untuk mempermudah penggunaan, saya membuat class sendiri untuk membungkus pemanggilan fungsi2 OCCI. Pola class yang saya gunakan :

class myocciclass
{
  private:
    Environment *env;
    Connection *conn;
    Statement *stmt;
    //properties lain
    ...
    //copy konstruktor
    myocciclass(const myocciclass&);
    //assignment
    myocciclass& operator= (const myocciclass&);

  public:
    //konstruktor
    inline myocciclass(const string& user, const string& passwd, const string& db);
    //destruktor
    inline ~myocciclass();
    //method lain
    ...
};

//konstruktor
inline myocciclass::myocciclass(const string& user, const string& passwd, const string& db) {
  this->env = Environment::createEnvironment (Environment::DEFAULT);
  this->conn = env->createConnection (user, passwd, db);
  this->stmt = conn->createStatement();
}
//destruktor
inline myocciclass::~myocciclass() {
  this->conn->terminateStatement (this->stmt);
  this->env->terminateConnection (this->conn);
  Environment::terminateEnvironment (this->env);
}


Class diatas dapat ditambahkan dengan properties dan method lain yang dibutuhkan. Dengan menggunakan class seperti ini, pengaksesan database akan lebih mudah, karena di program utama, cukup melakukan instantiasi object dari class myocciclass :

myocciclass *moc = new myocciclass (userName, password, db);


Selanjutnya tinggal memanggil mothod2 pada object moc yang telah didefinisikan. Program utama tidak perlu melakukan inisialisasi maupun menutup koneksi ke database Oracle, karena hal itu telah ditangani oleh class myocciclass.

Selamat memprogram menggunakan OCCI...

Selasa, April 03, 2007

Use your Brain

Think twice before u light and take your smoke dose ;)


Quit Smoking - More amazing video clips are a click away

Stop smoking

To all smokers in the world :)


Stop Smoking - Celebrity bloopers here

Minggu, April 01, 2007

Database access from PHP

When building application that need coonections to databases, there are two common options. First, to use a programming language's build in feature to access the database. Second, using a wrapper class / library to provide an easy way to connect to the database.

In PHP, a build in feature to connect to databases is available. Take a look at PHP connection to MySQL. In PHP 5, there are two way to connect to MySQL, either using mysql_ command set, or using mysqli_ command set. Both of those command are incompatible. Example, to escape a string, mysql command set had the command and parameter like this format:

string mysql_real_escape_string ( string unescaped_string [, resource link_identifier] );

But, mysqli had the parameter position swapped:
string mysqli_real_escape_string ( mysqli link, string escapestr )


See, you can't savely replace each mysql_ with mysqli_, both command is not compatible. To connect to other database?? Every database build in command had it's own parameter sets, and it's non compatible with the other's command.

The second way to access database was created to overcome those issues. One of the library that has multiple database connection support is ADODB. When using ADODB, the command to execute query in the MySQL and in the MSSQL is the same command. The parameter are in the same order. ADODB's version to above escape_string functions is
$conn->qstr(string);


ADODB wil take care resource identifier passing to actual command. ADODB wraps all needed variables into a single object. ADODB make PHP Programming easier.