Thursday, January 29, 2009

Guessing root causes

Ketika muncul suatu masalah, sering kita hanya dapat mengenali gejala. Dan kemudian melakukan perbaikan berdasarkan gejala tadi. Dan hanya kadang-kadang kita dapat mengenalil root cause, sehingga dapat melakukan perbaikan yang lebih menyeluruh. Seperti hari ini, seorang pengembang mengalami masalah tidak dapat melakukan pembuatan web service di sistem SAP Development. Sebelumnya, di sistem lain yang mirip sandbox, pembuatan web service ini sudah pernah dilakukan. Karena dulu sempet nulis di Wiki, saya jadi bisa ingat lagi kejadian-kejadian ketika dahulu mengaktifkan Web Service di mesin yang lama. Dan jadi ketahuan ada satu langkah yang belum dilakukan. Tetapi.. knowledge milik kita sendiri hanya bisa membantu sejauh itu, tetap belum dapat diaktifkan, si web service itu. Dari transaksi SE80, membuka function group yang tepat, kemudian klik kanan, create web service.. gagal di langkah terakhir wizard.
Transaksi SU53, melihat event kegagalan authorization terakhir .. didapatlah authorization object yang diperlukan untuk melanjutkan step pembuatan web service. Namun setelah authorization object ini didapat, muncul kegagalan berikutnya.. dan lewat SU53 lagi, didapat satu authorization object yang lain, yang belum dimiliki user kita.
This is getting tiresome, mengingat proses memberikan authorization object ke user harus melewati pihak lain, dan kadang-kadang harus menunggu surat-menyurat (you know, some things must be official). Akhirnya kembali ke Google, memanfaatkan pengetahuan kolektif umat manusia (ceile..). Aku mengharapkan menemukan list authorization object yang lengkap di situ. Sayangnya mr Google hanya menemukan halaman yang publik di Internet, dan tidak ada informasi definitif mengenai daftar authorization object di situ.. tapi sebuah keyword yang ultra-important di dunia SAP menarik perhatianku di antara hasil search Google : 'according to SAP Notes 913944 ...'. SAP Notes adalah elemen dari knowledge base SAP, yang hanya bisa dibuka oleh customer terdaftar SAP. Menggunakan login Bos, ke website SAP, pilih SAP notes, masukkan 913944.. voila: muncul list of authorization objects yang diperlukan untuk membuat 'Web Services Datasource'. By interpolation, object2 di situ juga akan bermanfaat kalau kita hanya ingin membuat 'Web Services'..
Could you guess what the root cause are?
Btw, cara-cara serupa di atas juga aku lakukan ketika mencoba memanggil SAP RFC via JCo library, dan kebetulan user yg digunakan untuk RFC tidak memiliki semua authentication objects yang diperlukan..

RAID5 Failure

Yak.. itu adalah problem mengerikan yang terjadi kemarin. Sebuah server yang kuinstall Centos 4.7 dan berharddisk empat buah, dipasangi RAID5, dan sudah beberapa bulan melayani kami sebagai Server Linux SAP satu-satunya yang diinstall from scratch. Di situ cuma diinstall aplikasi SAP GRC (Governance, Risk & Compliance) dan SAP Netweaver (+Oracle) sebagai pondasinya.
Kemarin aku mulai menghandle masalah ini, karena penasaran (RAID5 kok bisa fail).
Konsep RAID5 yang kupasang adalah begini: dari 4 buah hard disk, data disebar ke 4 hard disk dengan informasi pelengkap (sejenis CRC mungkin), sehingga sistem tetap berfungsi meskipun salah satu hard disk fail. Ternyata, Software RAID5 di Linux memiliki beberapa karakter:
- ketika sedang beroperasi, dan satu dari 4 hard disk mati, sistem berubah mode operasional, dari normal mode ke degraded mode. Transisi ini terjadi otomatis, dan mungkin kita bisa lihat di log file.
- tetapi, ketika proses booting, salah satu dari 4 hard disk tidak bisa digunakan, sistem menolak melanjutkan booting. Mungkin idenya adalah supaya system admin mengganti dulu hard disk yang rusak sebelum melanjutkan operasional server.
Nah sebenarnya tidak ada satupun hard disk yang mati, tetapi sistem menolak melanjutkan booting. Aku masukkan CD Centos, masuk ke rescue mode.. Lihat log kernel pakai dmesg, ternyata ada sesuatu yang tidak konsisten dengan salah satu hard disknya. Browsing di internet, orang lain menyarankan untuk memaksa RAID hidup hanya dengan 3 hard disk yang ada dan kemudian meng-add lagi hard disk ke-4 (sda2) ke dalam sistem RAID yg ada. (OK, sebetulnya komponen Software RADI bukanlah hard disk tetapi partisi, software raid yg ini dibangun dari 4 partisi di 4 hard disk berbeda).
Langkah-langkah mdadm --assemble --run /dev/md2 /dev/sda2 /dev/sdb1 /dev/sdc1 /dev/sdd1 telah kujalankan, tetapi tetap saja si RAID tidak mau hidup. Gejalanya ialah isi /proc/mdstat yang menyatakan si-md2 ini inactive.
Akhirnya sistem mau berfungsi setelah ditambah parameter --force. Dan ternyata, bukan hanya si sda2 yang tidak konsisten, sdb1 juga, dan --force tadi memaksa sistem mengganggap dia baik-baik saja. Setelah itu, restart, dan biarkan dia rekonstruksi..
Sebetulnya, ini semua gara-gara kernel panic yang muncul sesekali. Dan setelah kernel panic, mungkin ada data yang belum terkirim ke harddisk-harddisk itu. Sebenernya sih ga terlalu parah kan, cuma beberapa sektor tidak sync, apalagi aku pakai ext3 yang secara default pakai journalling, tetapi metoda failsafe si RAID ini yang mencegah sistem berfungsi sampai semuanya beres (atau dianggap beres :) )

Monday, January 26, 2009

Tidak bisa buka popup window di IE6

Hari ini revisit ke suatu masalah yang mungkin umum terjadi.. Yaitu instalasi Internet Explorer yang ngadat. Dulu waktu kami mroyek di Merpati, pernah kejadian seperti ini, dan kalau tidak salah kami solve dengan mengupdate service pack Windows di semua komputer OP (Planning). Tapi hari ini seorang temanku yang lain mengalami masalah yang agak berbeda, service pack nya sudah maximum, dan setelah mengalami trouble dengan IE 7 ia melakukan uninstall. Ternyata setelah uninstall, Internet Explorer (yang kini versi 6) masih ngadat. Ia tidak mau membuka pop up window, bahkan yang dicoding tanpa JavaScript sekalipun (just a simple A HREF="_BLANK" dst..).
Kemudian aku googling dan menemukan orang dengan masalah serupa. Meskipun masalah sebenarnya berbeda, tetapi orang ini sudah menulis semua langkah-langkah yang ia lakukan untuk meresolve masalah ini (dan gagal). Langkah terakhirnya (menginstall ulang Autodesk Trueview 2009), sama sekali tidak generik, dan tidak relevan untuk kasus ini. Untungnya, salah satu dari langkah-langkah sebelumnya berguna untuk Fino (menurutnya, langkah yang benar-benar membuat perbedaan adalah bagian regsvr32):
- membersihkan history dan temp files (http://support.microsoft.com/defaul...)

- melakukan Restore/Reset Default Settings dari IE6

- Menginstall ulang IE6 berdasarkan metoda no. 4 di artikel http://support.microsoft.com/kb/318378

- merestart print spooler

- menginstall ulang Java

- meregister ulang file-file berikut ini (lakukan di command prompt):

> cd \windows\system32

> regsvr32 Shdocvw.dll
> regsvr32 Shell32.dll
> regsvr32 Oleaut32.dll
> regsvr32 Actxprxy.dll
> regsvr32 Mshtml.dll
> regsvr32 Urlmon.dll

- menscan seluruh sistem dengan dua antivirus berbeda

Daftar langkah ini mungkin berguna jika ada orang yang perlu memperbaiki IE-nya yang ngadat.
By the way, kalau masih ngadat, saya menyarankan melihat list Add-Ons di Internet Options:Manage Add-Ons, dan mulai mendisable add-ons yang tidak penting (atau bahkan menguninstall program pembawa add-ons tsb)

Thursday, January 22, 2009

SCP Tunneling via SSH

Beberapa minggu yang lalu aku diajari trik ini oleh neni, kayaknya sih bakal berguna untuk orang lain..
Kondisi awal: sebuah server (katakan server A) hanya bisa dihubungi lewat server B. Jika kita ingin mengakses file di server A, biasanya kita terpaksa masuk via SSH ke server B, kemudian SCP file dari server A ke server B ato sebaliknya, dan mengeditnya di server B (pakai vi.. ato pico..). Cara ini terlalu ribet untuk pengeditan sederhana.
Solusi neni: Bukalah WinSCP (eh ternyata free ya..), kemudian setting koneksi langsung ke server A, tapi kali ini pilihlah Advanced options dan Connection:Tunnel. Di Tunneling via SSH, isi dengan informasi koneksi ke server B.

Kemudian, untuk lebih nyaman lagi, gunakan Notepad++ sebagai text editor, coba pilih menu 'Preferences' dan isikan seperti pada gambar dibawah ini .


Wednesday, January 21, 2009

PEAR SMTP

Hari ini aku melanjutkan apa yang dikerjakan Neni dengan PEAR::Mail di server e-recruitment (yang sebetulnya.. pekerjaan saya ya harusnya :) ). Status sebelumnya, PEAR::Mail mampu mengirim ke smtp ingoing milik telkom. Tetapi tidak dapat mengirimkan email outgoing ( ke luar telkom) karena smtp yang itu kan.. memang khusus untuk email masuk. Untuk dapat mengirimkan email keluar, kita butuh outgoing SMTP. Kalo dari dalam Telkom, tinggal pakai SMTP-nya domino, berikan authentication sesuai username & password dari account email internal yg dipakai. Nah, kalo dari luar..(servernya kan Internet-facing, technically dia ada di luar intranet Telkom) kita butuh outgoing SMTP yang bisa dipakai anonymously (atau kalau gak, username&password yg bisa dipakai untuk ngirim email). Siang ini dapat bocoran nama salah satu anonynous SMTP punya telkom yang bisa digunakan.
Tetapi percobaan2 awal gagal terus. Ga tau kenapa. Kemudian kuaktifkan error logging PHP (lihat set_error_handler di PHP manual) dengan kode seperti ini (I hate coding without frameworks) :
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
error_log("at $errfile line $errline : $errstr ($errno)\n",3,"/usr/local/apache/htdocs/erecrut/logs/log1.log");
return true;
}
$old_error_handler = set_error_handler("myErrorHandler");

ok.. keluar errornya cuma sedikit, dan tidak meaningful (cuma notice nggak penting yang ketangkep).
Setelah diingat2, dulu Neni bermasalah dalam mencek error yang muncul (kalo ga salah, kadang tipenya boolean, kadang tipenya object). Dulu aku suruh ga usah dicek aja (karena ga tau cara yg benernya). Dan sekarang saatnya untuk mencari cara yang bener.. :)
Ternyata cara error handling PEAR::Mail yg bener itu mirip seperti ini :
$mail = $smtp->send($to, $headers, $body);
if (PEAR::isError($mail))
error_log("PEAR error: ".var_export($mail,true)."\n",3,"/usr/local/apache/htdocs/erecrut/logs/pearerror.log");
biarkan PEAR yang meriksa itu error ato bukan. Di sini aku pakai variasi error_log yang naruh pesan ke file, dan karena ngga ngerti pathnya relatif ke mana aku pake path absolut. Soalnya directory lognya harus di- chmod o+rw dulu.
Ternyata.. Ada error yang ditangkap file log ini.. Masalahnya ialah email kita ditolak oleh SMTP server gara2 mengirimkan SPAM. Pesannya kira2 seperti ini: 'localhost rejected because you sent SPAM emails'. Terpikir, mungkin ga ini ditolak gara-gara string nama servernya masih localhost ? Jangan2 dia mengenali komputer yang mengirim email cuma dari string nama servernya? String nama server ini dikirimkan di SMTP ketika memulai percakapan (HELO namaserver). Aku ganti nama servernya dan presto.. all is well.. :
$smtp = Mail::factory('smtp',
array ('host' => $host,
'port' => $port, 'localhost' => 'namaserver.di.sini.com'));

Tuesday, January 20, 2009

How to Recreate MySQL System Tables

You might wonder, why would I need to recreate MySQL system tables. Well, the case is that my WoS folder has gotten pretty big, and I lost my original WoS.zip file. And the website doesn't carry WoS anymore. (now its called MoWes, and for some reason I still trust the old' WoS than the MoWes). I need to copy this to another computer, without the 270 MB-or-so MySQL datafiles. So the solution is-> just copy them, excluding the data folder inside mysql folder. But the newly copied MySQL won't start. It created new datafiles all right, but it still won't start. Examining the log files, it said something about missing grant tables.
So I added this option when starting mysql:
bin\mysqld-nt --skip-grant-tables
This forced it to start even without grant tables. Now, the grant tables still must be created, and after browsing for a while I found out that we could initialize the grant tables using these scripts:
  • mysql_system_tables.sql
  • mysql_system_tables_data.sql
  • fill_help_tables.sql
These files cannot be found in WoS's mysql folder. Fortunately I found them in /usr/share/mysql folder in my Ubuntu box, assuming that these files are compatible with WoS's mysql I begin running the scripts using MySQL Query Browser.
The first run spits errors. Seems that I must manually do these before those scripts:
create database mysql;
use mysql;
Then I retried running mysql_system_tables, then all the other scripts. After restarting the mysql server, all seems to be working correctly.

PHP modules' DLL hell


In Windows platform, the webserver package of my choice is MoWes (mobile webserver). In the past it is called WoS (Webserver on a stick). We just copy the folder from one computer to another, and run its exe-file, instantly we have a Apache - MySQL - PHP triad running without any installation hassles.
But recently, I copied the MoWes onto two servers, and I cant seem to load both PHP_OCI8 and PHP_LDAP modules. After a few wrong turns, finally I used Microsoft Visual Studio's Dependency Walker tool. And voila - both of the DLL's problems were shown before my eyes.

PHP_LDAP's problem was SSLEAY not installed. PHP_OCI8's problem was that the OCI.DLL is in the AMD 64-bit architecture (equivalent to Intel EM64T architecture) while the php/apache system is in 32-bit architecture. Now, where did I keep the downloaded the oracle instant client for win32..

Tuesday, January 6, 2009

Strange Oracle Problems: Oracle database won't start

One of the desktops in my office is being used as a Server. It has Quad-core AMD Phenom X4, and 4 hard drives in Linux Software RAID 5 Configuration (Ok, it is a strange beast, because I was the one who chose the components and bought the system). We installed Centos 4.7 (64-bit), Oracle 10g, and SAP Netweaver. It is very much a hassle to set up, the 64-bit Oracle. But recently a strange error pops up when starting the Oracle database. It says, the shared_pool_reserved_size is out-of-bound (too large). The current setting is about 100 MB. At first, I wonders is this related to problems occured before, because the mixups between 64-bit and 32-bit parts of the Oracle RDBMS. I thought, the valid range of shared_pool_reserved_size is determined by the architecture (that is-64 or 32 bit).
Then, after some readings and pondering, I found out that not the shared_pool_reserved_size that was incorrect, it was the shared_pool. And it has nothing to do with the 64-bit architecture. Current setting of shared_pool is at 157MB, and shared_pool_reserved_size is only allowed from min_reserved_size to 0.5*shared_pool. The correct shared_pool setting is 1570MB (1.5 GB), and some mishaps make one of the numbers truncated..
Learnt some new Oracle commands while fixing this issue.. these could be run even when the database is idle (not mounted, not started).
/home/oraac1>sqlplus /nolog
>CONNECT / AS SYSDBA;
>CREATE PFILE FROM SPFILE;
This command creates a text-based parameter file from the existing binary parameter file. Which file? The default one. This would differ between systems, but I bet the default one is the one thats being used to start the Oracle RDBMS in normal conditions. In my windows Oracle XE, this is C:\oraclexe\app\oracle\product\10.2.0\server\dbs\SPFILEXE.ORA. In the Linux Oracle, this is /oracle/AC1/102_64/dbs/spfileAC1.ora, and the created text-based parameter file would be /oracle/AC1/102_64/dbs/initAC1.ora.
After the text-based PFILE was created, I just correct the shared_pool line (add another 0 in the end). Then..
>CREATE SPFILE FROM PFILE;
This command creates a binary startup parameter file from the existing text parameter file. Similar to the previous one, this also refers to default parameter files.
ok.. that done, I just need to start the whole SAP-Oracle system using startsap, and all is well.

MySQL & Oracle back-and-forth

Do you know that Oracle database could be migrated into MySQL database, and vice-versa? Use Oracle's Schema Migration functionality in the free Oracle SQLDeveloper to migrate from MySQL to Oracle, use MySQL Migration Toolkit to migrate from Oracle to MySQL.

Hint: it is easier to migrate from Oracle to MySQL, than from MySQL to Oracle.. but it is also easier than migrating from Oracle 10g to Oracle 9.2..

If anyone interest, I could post the details..