Sabtu, Juni 30, 2007

Networking di Solaris 10

Untuk melakukan setting network di Solaris 10, berikut ini beberapa perintah (command line) yang diperlukan.

  1. Melihat tabel routing di solaris:
    # netstat -r
    # netstat -rn


  2. Mensetting ethernet dan virtual ethernet:
    # ifconfig <device-ethernet> <ip-address> netmask <netmask> up
    Untuk mengaktifkan virtual ethernet:
    # ifconfig <device-ethernet>:1 plumb
    # ifconfig <device-ethernet>:1 <ip-address-2> netmask <netmask-2> up


  3. File yang perlu diubah agar setting ip-address diset saat sistem booting:
    File: /etc/netmasks
    Isi file:
    <network-number> <netmask>
    File: /etc/hostname.<device-name>
    Isi file:
    <hostname1>
    atau
    <ip-address1>
    File: /etc/hostname.<device-name>
    Isi file:
    <hostname2>
    atau
    <ip-address2>

    File: /etc/hosts
    Isi file:
    <ip-address1> <hostname1>
    <ip-address2> <hostname2>


  4. Mensetting DNS client:
    Buat file /etc/resolv.conf
    Isi file:
    domain <nama-komputer>
    nameserver <ip-dns-server-1>
    nameserver <ip-dns-server-2>
    search <search-domain>


    Edit file cat /etc/nsswitch.conf:
    Ubah sehingga baris yang dimulai dengan hosts: menjadi sbb:
    hosts: files dns

    Restart service nscd dengan perintah:
    # /etc/init.d/nscd stop
    # /etc/init.d/nscd start


  5. File lain yang terkait:
    /etc/net/ticlts/hosts
    /etc/net/ticolts/hosts
    /etc/net/ticotsord/hosts
    /etc/nodename


Jumat, Juni 29, 2007

Mencari dan menghapus paket yang tidak diperlukan di debian

Jika kita melakukan instalasi paket di debian menggunakan apt-get, maka paket lain yang dibutuhkan akan otomatis ikut diinstall. Paket2 ini biasa berupa paket library, maupun paket aplikasi lain. Sayangnya paket dependency tadi tidak otomatis ikut di-uninstall ketika kita meng-uninstall paket yang sudah tidak dibutuhkan.

Untuk mengetahui paket mana saja yang sudah tidak dibutuhkan, terdapat sebuah paket aplikasi powerful di debian yang bernama deborphan. Jalankan program ini melalui prompt, tidak perlu sebagai root, sebagai user biasa juga bisa. Program ini akan menghasilkan list paket yang orphan, artinya tidak ada paket lain yang membutuhkannya. Secara default paket yang ditampilkan adalah paket pada section library dan oldlibs. deborphan juga dapat menampilkan list semua paket orphan yang ada, tapi harap berhati2 menggunakannya, karena paket aplikasi yang kita butuhkan mungkin akan ikut ditampilkan, karena memang jarang paket aplikasi yang saling dependency.

Dengan deborphan, space harddisk bisa dihemat, dengan meng-uninstall paket2 library yang sudah tidak dibutuhkan lagi. Selamat hunting ;)

Kamis, Juni 28, 2007

Menjalankan debian dalam modus text

Debian secara default berjalan pada runlevel 2. Runlevel 3,4, dan 5 memiliki perilaku yang hampir sama, namun tidak digunakan secara default. Jika pada debin diinstall XWindow dan window manager, seperti kde atau gnome, maka setiap kali sistem dijalankan, Xserver akan dijalankan. Ketika sistem ingin hanya boot dalam modus text, saya cukup kebingungan untuk melakukannya. Pada sistem linux lain yang pernah saya gunakan, seperti RedHat dan SuSe, runlevel 3 adalah modus text, sedangkan runlevel 5 adalah modus grafis Xwindow. Pada debian hal ini tidak berlaku.

Setelah mencari2 hal ini di google, saya akhirnya menemukan artikel yang membahas permasalahan yang sama di forum ini dan artikel yang menjelaskan tentang mekanisme runlevel di debian di artikel ini.

Pada sistem debian saya, saya tetap menggunakan runlevel 2, sehingga file /etc/inittab tidak saya ubah. Yang saya ubah adalah menghapus symbolic link S99kdm dari direktori /etc/rc2.d Hal ini karena saya menggunakan KDE sebagai default window manager dan kdm sebagai login managernya. Jika menggunakan gnome, hapuslah symboic link S99gdm (saya tidak begitu yakin urutannya adalah 99, yang penting adalah namanya mengandung kata gdm). Jika menggunakan login manager lain, seperti xdm, sama saja caranya, yaitu menghapus symbolic link ke script startup yang ada pada direktori /etc/rc2.d Dengan cara ini, login manager tidak akan dipanggil ketika sistem dijalankan setelah booting, sehingga tetap berada di modus text, tidak masuk ke modus grafis.

Setelah sistem direstart, sistem berhenti pada login prompt dan tidak masuk ke modus grafis. Voila, mission accomplished :)

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...