25 Mei 2009

General Query Log MySQL

General Query Log pada MySQL berisi semua aktivitas pada saat client melakukan koneksi ke server atau pada waktu koneksi terputus dan query dari client yang dikirim ke server. Fasilitas ini sangat berguna untuk merekam segala aktivitas tiap client yang terhubung ke server. Bisa juga untuk mengetahui kesalahan yang mungkin terjadi dari perintah atau query yang dikirim client.
Sama seperti Slow Query Log, sebelum MySQL 5.1.6 tujuan penulisan log selalu ke file. Mulai MySQL 5.1.6 terdapat pilihan untuk menulis log ke file atau tabel atau keduanya.
Tujuan penulisan log ditentukan dengan pilihan --log-output yang bisa berisi nilai TABLE, FILE atau NONE (tidak menulis log). Jika tujuan penulisan ke tabel, maka tabel tujuan adalah mysql.general_log. Misalnya:
--log-output=TABLE
--log-output=FILE
--log-output=TABLE,FILE

Sebelum MySQL 5.1.6, untuk mengaktifkan General Query Log dengan menggunakan pilihan --log[=file_name]. Mulai MySQL 5.1.6 gunakan pilihan --general_log yang bisa memiliki nilai 0 (tidak aktif) atau 1 (aktif). Sedangkan pilihan --general_log_file[=file_name] digunakan untuk menentukan direktori tempat file log, jika tujuan penyimpanan log pada file.
Mulai MySQL 5.1.12 kita dapat mengaktifkan atau non aktifkan General Query Log pada saat MySQL sedang berjalan. Cara ini bisa digunakan misalnya untuk backup file log. Setelah General Query Log non aktif, ganti nama file log dan buat file log baru, kemudian aktifkan lagi General Query Log. Set ‘ON’ untuk mengaktifkan atau ‘OFF’ untuk non aktif.
SET GLOBAL general_log = 'OFF';
SET GLOBAL general_log = 'ON';

Bisa juga mengaktifkan General Query Log dengan melakukan pengaturan file konfigurasi MySQL (my.ini).
[mysqld]
general-log=1
log-output=FILE
general-log-file="C:/Program Files/MySQL/MySQL 5.1/log.log"

Baca selengkapnya...

22 Mei 2009

Slow Query Log MySQL

Slow Query Log pada MySQL berisi semua query SQL yang dijalankan (waktu eksekusi) melebihi selang waktu tertentu. Selang waktu yang dimaksud ditentukan pada variabel sistem server MySQL (mysqld). Saat menjalankan instance MySQL (mysqld.exe), terdapat pilihan long_query_time, yang digunakan untuk pengecekan apakah akan menulis ke log atau tidak. Isi dari pilihan tersebut merupakan nilai dalam detik, jika suatu query yang dikirim dari client dijalankan selama selang waktu lebih dari yang ditentukan dari pilihan long_query_time, maka query yang bersangkutan akan ditulis ke file log. Sebelum MySQL 5.1.21 nilai minimum dari pilihan long_query_time adalah 1 dan harus tipe integer, mulai MySQL 5.1.21 nilai minimum adalah 0 dan dimungkinkan mengisi nilai mikro detik, tapi hanya nilai integer yang diambil dan ditulis ke tabel jika tujuan penulisan log adalah ke tabel.
Sebelum MySQL 5.1.6 log selalu ditulis ke sebuah file. Mulai MySQL 5.1.6 dimungkinkan untuk menulis ke file, tabel atau keduanya. Untuk mengaktifkan Slow Query Log, gunakan parameter --log-slow-queries[=file_name]. Pilihan ini digunakan sebelum MySQL 5.1.29, mulai MySQL 5.1.29 gunakan pilihan --slow-query-log. Nilai dari pilihan ini bisa 0 (tidak aktif) atau 1 (aktif). Jika tujuan penulisan file log adalah ke file, gunakan pilihan --slow-query-log-file[=file_name]. Tujuan penulisan log bisa ditentukan dengan pilihan --log-output yang bisa berisi nilai TABLE, FILE atau NONE (tidak menulis log). Jika tujuan penulisan ke tabel, maka tabel tujuan adalah mysql.slow_log. Misalnya:
--log-output=TABLE
--log-output=FILE
--log-output=TABLE,FILE
Bisa juga dengan melakukan pengaturan file konfigurasi MySQL (my.ini).
[mysqld]
slow-query-log=1
log-output=FILE
slow-query-log-file="C:/Program Files/MySQL/MySQL 5.1/slowlog.log"

Catatan: Penulisan tanda - atau _ pada yang digunakan sebagai penghubung tiap kata (pada parameter maupun file konfigurasi MySQL) dapat digunakan untuk hasil yang sama. Parameter-parameter berikut memiliki arti dan hasil yang sama.
--log-output=TABLE
--log_output=TABLE

Baca selengkapnya...

21 Mei 2009

Error Log MySQL

Error log pada MySQL berisi kesalahan yang terjadi pada saat MySQL dijalankan atau dihentikan. Log ini juga berisi kesalahan yang terjadi saat MySQL sedang berjalan. Kesalahan yang dimaksud adalah kesalahan yang sifatnya kritis, misalnya jika terjadi masalah pada tabel yang memerlukan tindakan perbaikan pada tabel tersebut, MySQL akan menulis pesan ke log. MySQL tidak akan menulis pesan ke log untuk kesalahan seperti duplikasi data pada suatu tabel karena primary key, dan lain-lain.
Menentukan file log ini dapat dilakukan dengan menambahkan entry log-error pada file konfigurasi MySQL (file “my.ini”) pada bagian mysqld. Dari sini dapat kita tentukan nama file log dan direktori tempat penyimpanan file log. Default disimpan pada direktori data MySQL.
[mysqld]
log-error="C:/Program Files/MySQL/MySQL 5.1/errlog.err"

Bisa juga dengan menambahkan parameter --log-error[=file_name] pada saat menjalankan MySQL.

Baca selengkapnya...

20 Mei 2009

MySQL Server Logs

MySQL mempunyai mekanisme untuk mengetahui apa saja yang terjadi pada saat MySQL berjalan. Pada saat terjadi kesalahan atau terjadi masalah saat menjalankan atau menghentikan MySQL, atau saat terjadi penambahan atau pengubahan atau penghapusan data pada tabel, atau pada saat menjalankan query terhadap suatu tabel. Semua kejadian itu bisa kita ketahui dan disimpan pada suatu file log. Dari file log ini bisa kita ketahui apa saja yang terjadi pada MySQL. Pada log tertentu juga bisa menyimpan data pada tabel. Tipe-tipe log yang ada pada MySQL:
  • Error Log. Informasi yang ditulis ke log merupakan masalah yang terjadi saat server MySQL dijalankan, dihentikan atau saat sedang berjalan.
  • General Query Log. Informasi yang ditulis ke log adalah saat client melakukan koneksi ke server dan saat menjalankan query dari client.
  • Binary Log. Informasi yang ditulis ke log adalah saat menjalankan query dari client yang mengubah data. Juga digunakan untuk replikasi.
  • Slow Query Log. Informasi yang ditulis ke log adalah saat menjalankan query selama selang waktu tertentu.
Secara default semua file log dibuat pada direktori data MySQL. Kita dapat memaksa MySQL untuk menutup dan membuka lagi file log (atau berganti ke file log baru) dengan melakukan “flush” terhadap log. Caranya adalah dengan menjalankan perintah FLUSH LOGS atau menjalankan salah satu dari perintah-perintah berikut dari command prompt.
mysqladmin flush-logs
mysqladmin refresh

Pada General Query Log dan Slow Query Log, log dapat disimpan pada tabel (mulai MySQL 5.1.6). Untuk General Query Log disimpan pada tabel mysql.general_log, dan untuk Slow Query Log disimpan pada tabel mysql.slow_log. Tiap file log ditentukan dengan melakukan pengaturan pada file konfigurasi MySQL. Pada sistem operasi Windows, file yang dimaksud adalah file “my.ini” dan biasanya terletak pada direktori instalasi MySQL. Pada posting berikutnya akan dibahas lebih detail mengenai log pada MySQL.

Baca selengkapnya...

19 Mei 2009

Implementasi Run-Time Type Information / RTTI (Bagian 3)

Dengan mengetahui manfaat dari RTTI, kita bisa menggunakan fungsi-fungsi yang ada untuk mengubah properti dari komponen VCL yang ada pada sebuah form. Kita bisa mengubah properti yang mempunyai tipe integer, string, boolean, atau bahkan enumerasi. Contoh skrip ini minimum membutuhkan sebuah form (nama Form1) dan sebuah TEdit (nama Edit1). Parameter yang dibutuhkan adalah nama form, nama obyek/komponen, nama properti dan nilai dari properti.
uses Forms, StrUtils, SysUtils, TypInfo;

procedure SetObjectProperty(const aFormName, aObjectName, aPropName: string; aPropValue: Variant);
var
  frm: TForm;
  obj: TObject;
  i, j: Integer;
begin
  frm := nil;
  for i := 0 to Screen.FormCount - 1 do
    if UpperCase(Screen.Forms[i].Name) = UpperCase(aFormName) then
      frm := Screen.Forms[i];
  if (Assigned(frm)) and (frm.Name = aFormName) then
  begin
    obj := frm.FindComponent(aObjectName);
    j := 1;
    i := PosEx('.', aPropName, j);
    while i > 0 do
    begin
      obj := GetObjectProp(obj, Copy(aPropName, j, i - j));
      j := i + 1;
      i := PosEx('.', aPropName, j);
    end;
    SetPropValue(obj, Copy(aPropName, j, Length(aPropName)), aPropValue);
  end;
end;

Jalankan perintah-perintah berikut dan lihat hasilnya.
SetObjectProperty('Form1', 'Edit1', 'Text', 'Tes 123');
SetObjectProperty('Form1', 'Edit1', 'Enabled', False);
SetObjectProperty('Form1', 'Edit1', 'Color', clRed);
SetObjectProperty('Form1', 'Edit1', 'Font.Size', 12);
SetObjectProperty('Form1', 'Edit1', 'Font.Style', '[fsBold,fsItalic]');

Baca selengkapnya...

18 Mei 2009

Implementasi Run-Time Type Information / RTTI (Bagian 2)

Penggunaan RTTI memungkinkan kita mendapatkan informasi dari sebuah obyek tentang properti dari obyek tersebut. Salah satu fungsi yang berguna untuk kebutuhan ini adalah GetPropList. Fungsi ini menghasilkan daftar properti (termasuk event) yang terdapat pada sebuah obyek. Properti yang dimaksud adalah properti yang di published, seperti yang kita lihat pada Object Inspector. Ada beberapa variasi sintaks fungsi GetPropList seperti yang dapat kita lihat pada unit TypInfo.
function GetPropList(TypeInfo: PTypeInfo; TypeKinds: TTypeKinds; PropList: PPropList; SortList: Boolean = True): Integer;
function GetPropList(TypeInfo: PTypeInfo; out PropList: PPropList): Integer;
function GetPropList(AObject: TObject; out PropList: PPropList): Integer;

Fungsi GetPropList mengembalikan jumlah properti yang ditemukan dan properti apa saja yang terdapat pada sebuah obyek yang disimpan pada PropList. Fungsi yang pertama membatasi hasil yang dikembalikan hanya berdasarkan TypeKinds dan mempunyai pilihan untuk mengurutkan properti yang ada. Sedangkan dua variasi lainnya menghasilkan semua properti yang ada. Contoh dibawah ini akan menampilkan tiap properti yang ada pada sebuah obyek.
uses TypInfo;

procedure GetProp(aObject: TObject);
var
  i, PropCount: Integer;
  PropInfo: PPropInfo;
  PropList: PPropList;
  PropType: PPTypeInfo;
  s: string;
begin
  PropCount := GetPropList(PTypeInfo(aObject.ClassInfo), PropList);
  for i := 0 to PropCount - 1 do
  begin
    PropInfo := PropList^[i];
    PropType := PropInfo^.PropType;
    s := GetEnumName(TypeInfo(TTypeKind), Ord(PropType^.Kind));
    ShowMessage(PropInfo^.Name + ':' + PropType^.Name + ':' + s);
  end;
end;

Fungsi lain yang juga penting adalah GetPropInfo. Fungsi ini menghasilkan informasi detail dari sebuah obyek dengan properti tertentu. Fungsi ini juga mempunyai beberapa variasi sintaks.
function GetPropInfo(Instance: TObject; const PropName: string; AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(AClass: TClass; const PropName: string; AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string): PPropInfo;
function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string; AKinds: TTypeKinds): PPropInfo;

Fungsi tersebut mengembalikan nilai berupa pointer dengan tipe PPropInfo yang berisi karakteristik mengenai properti, seperti dapat kita lihat dibawah ini.
type
  PPropInfo = ^TPropInfo;
  TPropInfo = packed record
    PropType: PPTypeInfo;
    GetProc: Pointer;
    SetProc: Pointer;
    StoredProc: Pointer;
    Index: Integer;
    Default: Longint;
    NameIndex: SmallInt;
    Name: ShortString;
  end;

Terdapat puluhan fungsi untuk mengakses properti dari obyek yang dapat dilihat pada unit TypInfo. Beberapa diantara fungsi-fungsi tersebut adalah:
  • GetObjectProp
  • SetObjectProp
  • GetStrProp
  • SetStrProp
  • GetOrdProp
  • SetOrdProp
  • GetPropValue
  • SetPropValue
Contoh dibawah ini mengganti properti dari obyek TButton dengan nama Button1.
var
  PropInfo: PPropInfo;
  Obj: TObject;
begin
  PropInfo := GetPropInfo(Button1.ClassInfo, 'Font');
  Obj := GetObjectProp(Button1, PropInfo);
  SetPropValue(Obj, 'Style', '[fsBold,fsItalic]');
  SetStrProp(Button1, 'Caption', 'Tombol');
SetOrdProp(Button1.Font, 'Size', 10);

end;

Dengan menggunakan fungsi-fungsi yang berhubungan dengan RTTI, memungkinkan kita untuk mengakses properti dari obyek. Hal ini bisa sangat berguna, misalnya untuk menyimpan layout dari sebuah form. Properti dan nilai dari obyek dapat disimpan dalam registry, file INI atau file format buatan sendiri, atau bisa pula database. Kemudian pada saat form di load, layout dari form tersebut dapat dikembalikan dengan menggunakan properti dan nilai obyek yang disimpan sebelumnya.

Baca selengkapnya...

17 Mei 2009

Implementasi Run-Time Type Information / RTTI (Bagian 1)

Dengan mengetahui teknologi RTTI, kita bisa melakukan banyak hal dalam aplikasi yang kita buat. Tiap komponen VCL yang ada pada Delphi diturunkan dari class TObject. Pada class ini terdapat fungsi ClassName yang mengembalikan nama class pada obyek yang bersangkutan. Dengan mengetahui nama class pada saat run-time kita bisa melakukan pengecekan terhadap sebuah obyek yang mempunyai tipe TObject. Misalnya jika kita tahu sebuah obyek mempunyai tipe TEdit atau turunannya maka kita tahu bahwa obyek tersebut mempunyai properti Text yang bisa kita ganti. Akses terhadap obyek dapat kita lakukan dengan menggunakan operator as dan is.
procedure SetText(aObject: TObject; const aText: string);
begin
  if aObject is TEdit then
    (aObject as TEdit).Text := aText;
end;

Operator is melakukan pengecekan tipe secara dinamik terhadap suatu obyek pada saat run-time. Hasil dari pengecekan tersebut akan menghasilkan nilai True bila obyek yang dibandingkan merupakan instance dari class yang dimaksud atau salah satu turunan dari class tersebut, atau nilai False jika sebaliknya. Jika obyek tersebut berisi nilai nil, juga menghasilkan nilai False. Sedangkan operator as digunakan untuk type casting, yang akan mengembalikan referensi dari suatu obyek dengan tipe class yang diberikan.
Contoh lain kegunaan dari RTTI adalah pada tipe enumerasi. Tipe enumerasi merupakan sekumpulan nilai yang di representasikan dengan identifier yang menggambarkan nilainya. Misalnya jika kita sering bekerja dengan form, pada Object Inspector terdapat properti WindowState yang bisa berisi wsNormal, wsMinimized, atau wsMaximized. Tiap identifier tersebut di deklarasikan pada bagian type, seperti dapat kita lihat pada unit Forms dari Delphi.
type
  TWindowState = (wsNormal, wsMinimized, wsMaximized);

Nilai pada tiap identifier tersebut diwakili oleh sebuah nilai Integer yang dimulai dari 0. Jadi nilai wsNormal = 0, wsMinimized = 1, dan wsMaximized = 2. Nilai integer dari properti obyek yang memiliki tipe enumerasi bisa kita dapatkan dengan menggunakan fungsi Ord.
ShowMessage(IntToStr(Ord(Form1.WindowState)));

Sebaliknya untuk mendapatkan identifier dari tipe enumerasi, kita bisa menggunakan fungsi GetEnumName yang disediakan pada unit TypInfo.
uses TypInfo;

var
  i: Integer;
begin
    for i := Ord(Low(TWindowState)) to Ord(High(TWindowState)) do
    ShowMessage(GetEnumName(TypeInfo(TWindowState), i));
end;

Hasil yang sama kita dapatkan dengan skrip sebagai berikut.
uses TypInfo;

var
  ws: TWindowState;
begin
  for ws in [Low(TWindowState)..High(TWindowState)] do
    ShowMessage(GetEnumName(TypeInfo(TWindowState), Integer(ws)));
end;
Fungsi GetEnumName digunakan untuk mendapatkan nama tipe enumerasi berdasarkan nilai integer dan mempunyai sintaks seperti ini.
function GetEnumName(TypeInfo: PTypeInfo; Value: Integer): string;

Parameter TypeInfo merupakan pointer ke sebuah record yang berisi informasi tentang tipe enumerasi, dan parameter Value merupakan nilai integer yang mewakili tipe enumerasi. Deskripsi record tersebut terdapat pada unit TypInfo.
type
  TTypeKind = (tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat, tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString, tkVariant, tkArray, tkRecord, tkInterface, tkDynArray);
  PTypeInfo = ^TTypeInfo;
  TTypeInfo = record
    Kind: TTypeKind;
    Name: ShortString;
  end;

Untuk mendapatkan nilai integer dari suatu tipe enumerasi, menggunakan fungsi GetEnumValue dengan sintaks sebagai berikut.
function GetEnumValue(TypeInfo: PTypeInfo; const Name: string): Integer;

Misalnya mendapatkan nilai integer dari wsMaximized:
ShowMessage(IntToStr(GetEnumValue(TypeInfo(TWindowState), 'wsMaximized')));

Baca selengkapnya...

16 Mei 2009

Run-Time Type Information (RTTI)

Run-Time Type Information (RTTI) merupakan satu fitur Delphi yang sangat menarik yang sudah ada sejak versi awal sampai versi terbaru. RTTI merupakan informasi yang disimpan pada file biner aplikasi. Informasi ini dihasilkan pada saat kompilasi program. Informasi yang disimpan ini berhubungan dengan obyek atau kontrol yang dipakai pada aplikasi yang kita buat. Dengan RTTI kita bisa mendapatkan informasi seperti properti apa saja yang dimiliki oleh sebuah komponen.
Informasi yang kita dapatkan dari RTTI merupakan properti dari komponen VCL yang di published. Contoh nyata dari RTTI ini adalah Object Inspector yang sering kita lihat jika kita memakai IDE Delphi pada saat design time. Dengan RTTI kita bisa mendapatkan informasi apa saja properti dari komponen beserta nilainya pada saat run-time. Sesuai dengan pernyataan yang dikutip dari file help Delphi dalam bahasa Inggris:
Published members have the same visibility as public members. The difference is that runtime type information (RTTI) is generated for published members. RTTI allows an application to query the fields and properties of an object dynamically and to locate its methods. RTTI is used to access the values of properties when saving and loading form files, to display properties in the Object Inspector, and to associate specific methods (called event handlers) with specific properties (called events).
Dokumentasi mengenai RTTI sangat minim, tidak bisa yang kita dapatkan dari file help Delphi. Informasi penting yang bisa kita dapatkan mengenai RTTI ada pada unit TypInfo.pas. Pada unit ini bisa kita dapatkan baris-baris kode yang berhubungan dengan RTTI yang mungkin bisa berguna.

Baca selengkapnya...

11 Mei 2009

Mengakses Registry Windows

Registry menurut definisi Microsoft merupakan informasi konfigurasi sistem operasi Windows yang disimpan di database yang berbentuk format pohon (tree). Disini tersimpan berbagai informasi yang berhubungan dengan software, hardware, akun user dan lain sebagainya. Kita bisa melihat isi dari registry dengan tool “regedit.exe”. Dari menu start Windows kemudian pilih Run dan ketikkan regedit, maka akan terbuka Registry Editor yang berisi berbagai macam pengaturan.
Pada Registry Editor, di sisi kiri akan terdapat berbagai macam pilihan dalam format tree mirip dengan susunan direktori pada explorer yang dinamakan dengan registry key. Dan pada sisi kanan terdapat data-data (jika ada) yang bisa berisi nilai yang dinamakan registry entry.
Dalam Registry Editor kita bisa menambahkan atau menghapus registry key maupun registry entry. Yang perlu diperhatikan adalah kita tidak bisa menghapus sembarangan registry key ataupun registry entry yang ada karena dapat mengakibatkan sistem operasi tidak bisa berjalan dengan normal.
Terdapat beberapa registry key yang sudah di definisikan Windows, yaitu:
  • HKEY_CURRENT_USER. Berisi informasi konfigurasi user yang saat ini sedang login, seperti warna layar, pengaturan control panel dan lain-lain.
  • HKEY_USERS. Berisi profil user pada komputer. HKEY_CURRENT_USER merupakan subkey dari HKEY_USERS.
  • HKEY_LOCAL_MACHINE. Berisi informasi konfigurasi untuk komputer (untuk semua user).
  • HKEY_CLASSES_ROOT. Berisi informasi mengenai program yang digunakan untuk membuka file menggunakan explorer. Merupakan subkey dari HKEY_LOCAL_MACHINE\Software.
  • HKEY_CURRENT_CONFIG. Berisi informasi mengenai profil hardware yang digunakan komputer pada saat startup.
Nilai pada registry entry bisa mempunyai tipe sebagai berikut.
  • REG_BINARY. Data biner mentahan. Biasanya digunakan untuk menyimpan informasi komponen hardware dan ditampilkan dalam format hexadecimal.
  • REG_DWORD. Angka dengan panjang 4 byte.
  • REG_EXPAND_SZ. Tipe string dengan panjang variabel.
  • REG_MULTI_SZ. Multi string.
  • REG_SZ. Tipe string dengan panjang tetap.
  • REG_FULL_RESOURCE_DESCRIPTOR. Merupakan sekumpulan array bersarang yang digunakan untuk menyimpan resource dari komponen hardware atau driver.
Delphi menyediakan unit yang digunakan untuk akses maupun manipulasi registry yaitu unit “Registry.pas”. Beberapa fungsi yang ada mirip dengan fungsi yang digunakan untuk mengakses file INI, seperti WriteInteger, ReadInteger, ReadString. Berikut adalah contoh program yang mengakses registry.

uses Registry;

var
  Reg: TRegistry;
  s: string;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey(‘SOFTWARE\Tes’, False) then
    begin
      ShowMessage(‘Sukses membuka key.’);
      s := Reg.ReadString(‘Teks’);
      Reg.WriteInteger(‘Angka’, 1);
    end;
    if Reg.OpenKey(‘SOFTWARE\Coba’, True) then
      ShowMessage(‘Sukses membuat key.’);
  finally
    Reg.Free;
  end;
end.

Baca selengkapnya...

08 Mei 2009

Silent Install SQL Server 2008 Express (Bagian 2)

Setelah selesai melakukan instalasi dengan software pendukung sebagai syarat untuk install SQL Server 2008 Express, kini saatnya melakukan instalasi terhadap SQL Server 2008 Express. Yang dimaksud dengan silent install ini adalah instalasi melalui command prompt tanpa melibatkan GUI. Metode ini cocok digunakan bagi developer aplikasi yang menggunakan SQL Server 2008 Express sebagai DBMS yang digunakan dan tanpa merepotkan user yang menggunakan aplikasi dengan mengharuskan user untuk melakukan instalasi program yang rumit dan susah.
Idenya didapatkan pada saat instalasi SQL Server 2008 Express secara manual yang menggunakan GUI. Jika kita melakukan instalasi secara manual, dengan berbagai pengaturan berbagai macam konfigurasi, installer akan membuat file konfigurasi dengan nama “ConfigurationFile.ini”. Kita bisa mendapatkan informasi ini pada langkah “Ready to Install” seperti gambar dibawah ini.















File konfigurasi inilah yang akan digunakan pada saat instalasi. Jika kita membuka file konfigurasi ini, pilihan-pilihan yang ada di dalam file tersebut dapat kita gunakan juga sebagai parameter pada setup command prompt. Isi file tersebut kira-kira seperti ini (bisa berbeda antara instalasi satu dengan yang lain).
;SQLSERVER2008 Configuration File
[SQLSERVER2008]

; Specify the Instance ID for the SQL Server features you have specified. SQL Server directory structure, registry structure, and service names will reflect the instance ID of the SQL Server instance.

INSTANCEID=”MSSQLSERVER”

; Specifies a Setup work flow, like INSTALL, UNINSTALL, or UPGRADE. This is a required parameter.

ACTION=”Install”

; Specifies features to install, uninstall, or upgrade. The list of top-level features include SQL, AS, RS, IS, and Tools. The SQL feature will install the database engine, replication, and full-text. The Tools feature will install Management Tools, Books online, Business Intelligence Development Studio, and other shared components.

FEATURES=SQLENGINE,SSMS

Dengan memakai file konfigurasi tersebut, kita bisa menjalankan instalasi tanpa menggunakan GUI. Perintah berikut dapat dijalankan dari command prompt Windows, dengan berbagai macam pilihan yang ditentukan dari parameter, seperti nama instance MSSQLSERVER, direktori instalasi “C:\Program Files\Microsoft SQL Server”, enable protokol named pipes dan TCP/IP, dan berbagi pilihan lain.
setup.exe /INSTANCEID=”MSSQLSERVER” /ACTION=”Install” /FEATURES=SQLENGINE,REPLICATION,SSMS /INDICATEPROGRESS /QUIET /INSTALLSHAREDDIR=”C:\Program Files\Microsoft SQL Server” /INSTANCEDIR=”C:\Program Files\Microsoft SQL Server” /INSTANCENAME=”MSSQLSERVER” /AGTSVCSTARTUPTYPE=”Manual” /ISSVCSTARTUPTYPE=”Automatic” /ISSVCACCOUNT=”NT AUTHORITY\NetworkService” /ASSVCSTARTUPTYPE=”Automatic” /ASCOLLATION=”Latin1_General_CI_AS” /ASDATADIR=”Data” /ASLOGDIR=”Log” /ASBACKUPDIR=”Backup” /ASTEMPDIR=”Temp” /ASCONFIGDIR=”Config” /ASPROVIDERMSOLAP=”1” /SQLSVCSTARTUPTYPE=”Automatic” /FILESTREAMLEVEL=”0” /ENABLERANU /SQLCOLLATION=”SQL_Latin1_General_CP1_CI_AS” /SQLSVCACCOUNT=”NT AUTHORITY\SYSTEM” /SQLSYSADMINACCOUNTS=”BUILTIN\Administrators” /TCPENABLED=”1” /NPENABLED=”1” /BROWSERSVCSTARTUPTYPE=”Automatic” /RSSVCSTARTUPTYPE=”Automatic” /RSINSTALLMODE=”FilesOnlyMode”

Perintah diatas adalah contoh, bisa di modifikasi dengan menambahkan atau mengurangi parameter sesuai dengan kebutuhan. Untuk informasi lebih lanjut mengenai referensi parameter, dapat dilihat pada situs http://technet.microsoft.com/en-us/library/ms144259.aspx.

Baca selengkapnya...

07 Mei 2009

Silent Install SQL Server 2008 Express (Bagian 1)

SQL Server merupakan salah satu Database Management System paling populer saat ini, dengan versi terbaru yang sudah dirilis adalah SQL Server 2008. Dengan dipersenjatai berbagai macam teknologi terbaru yang berbasiskan .NET Framework, membuat SQL Server 2008 Express pilihan ideal terutama jika digabungkan dengan bahasa pemrograman yang berbasis .NET Framework. Apalagi pada edisi Express ini juga bersifat gratis tanpa perlu membayar. Meski begitu instalasi SQL Server 2008 Express memang cukup merepotkan pada sistem operasi yang dipakai saat ini, yaitu Windows XP atau Windows Vista.
Bagian ini akan menjelaskan tentang pra-syarat yang dibutuhkan dari sisi software, sebelum melakukan instalasi SQL Server 2008 Express. Ada setidaknya tiga edisi distribusi SQL Server 2008 Express yang ada. Ini adalah daftar ketiga distribusi tersebut beserta persyaratan minimum software yang dibutuhkan.
  • SQL Server 2008 Express (Runtime Only). Membutukan Windows Installer 4.5 dan .NET Framework 2.0 SP2. Pada Windows Vista gunakan .NET Framework 3.5 SP1.
  • SQL Server 2008 Express with Tools (termasuk SQL Server Management Studio, merupakan gabungan Query Analyzer dan Enterprise Manager pada SQL Server 2000). Membutuhkan Windows Installer 4.5, .NET Framework 3.5 SP1 dan Windows PowerShell 1.0.
  • SQL Server 2008 Express with Advanced Services. Membutuhkan Windows Installer 4.5, .NET Framework 3.5 SP1 dan Windows PowerShell 1.0.
Dari ketiga distribusi tersebut, bagiku SQL Server 2008 Express with Tools merupakan yang paling ideal. Cocok untuk berbagai keperluan standar dengan tool seperti SQL Server Management Studio yang memudahkan kita untuk administrasi database SQL Server. Dengan begitu yang kita perlukan sebelum melakukan instalasi SQL Server 2008 Express adalah instalasi software (instalasi sesuai dengan urutan):
  • Windows Installer 4.5.
  • .NET Framework 3.5 SP1.
  • Windows PowerShell 1.0.
Ketiga software tersebut akan diinstall melalui command prompt tanpa menggunakan GUI dan bisa di download dari situs resmi Microsoft. Yang perlu diingat adalah paket installer untuk Windows Installer 4.5 dan Windows PowerShell 1.0 berbeda antara Windows XP dan Windows Vista. Jadi pastikan download paket installer yang cocok untuk sistem operasi. Kabar baik bagi pengguna Windows, pada Windows 7 yang masih berstatus beta, kita tidak perlu melakukan instalasi ketiga software diatas. Jadi bisa langsung install SQL Server 2008 Express.
Instalasi Windows Installer 4.5 dari command prompt.
<exe-name> /quiet
Instalasi .NET Framework 3.5 SP2 dari command prompt.
<exe-name> /q /norestart
Instalasi Windows PowerShell 1.0 dari command prompt.
<exe-name> /quiet
<exe-name> merupakan file setup untuk masing-masing distribusi. Parameter yang ditunjukkan diatas adalah parameter minimum untuk instalasi ketiga software pendukung tersebut.

Baca selengkapnya...

06 Mei 2009

Menyimpan Data ke File INI

Banyak aplikasi menyimpan informasi konfigurasi pada file INI. Kita bisa menyimpan berbagai macam hal pada file INI, misalnya menyimpan posisi dan panjang atau lebar form. File INI tersebut dapat digunakan lagi untuk mengembalikan posisi dan panjang atau lebar form. File INI berisi informasi yang dibagi berdasarkan grup yang dinamakan “section”. Masing-masing section tersebut berisi nilai dari data yang disimpan berdasarkan nama key. Berikut adalah contoh isi dari file INI.
[Form1]
Left=100
Top=10
Width=500
Height=300

[Button1]
Caption=Tes

Pada Delphi kita bisa menggunakan class TIniFile untuk manipulasi file INI. Class ini di deklarasikan pada unit IniFiles. Dalam class ini disediakan method untuk mengakses data pada file INI. Data tersebut bisa mempunyai tipe:
  • String.
  • Integer.
  • Float.
  • DateTime.
  • Date.
  • Time.
  • Bool.
  • Binary.
Contoh berikut akan membaca file INI.
uses IniFiles;

var
  MyIniFile: TIniFile;
begin
  MyIniFile := TIniFile.Create(‘C:\myconfig.ini’);
  try
    Form1.Left := MyIniFile.ReadInteger('Form1', 'Left', 0);
    Form1.Top := MyIniFile.ReadInteger('Form1', 'Top', 0);
    Form1.Width := MyIniFile.ReadInteger('Form1', 'Width', 500);
    Form1.Height := MyIniFile.ReadInteger('Form1', 'Height', 300);
    Button1.Caption := MyIniFile.ReadString('Button1', 'Caption', '');
  finally
    MyIniFile.Free;
  end;
end;

Atau sebaliknya untuk menyimpan data ke dalam file INI.
uses IniFiles;

var
  MyIniFile: TIniFile;
begin
  MyIniFile := TIniFile.Create(‘C:\myconfig.ini’);
  try
    MyIniFile.WriteInteger('Form1', 'Left', Form1.Left);
    MyIniFile.WriteInteger('Form1', 'Top', Form1.Top);
    MyIniFile.WriteInteger('Form1', 'Width', Form1.Width);
    MyIniFile.WriteInteger('Form1', 'Height', Form1.Height);
    MyIniFile.WriteString('Button1', 'Caption', Button1.Caption);
  finally
    MyIniFile.Free;
  end;
end;

Baca selengkapnya...

05 Mei 2009

Kompilasi Berdasarkan Kondisi dengan Compiler Directive

Windows pada tiap rilisnya terdapat lebih dari satu edisi, misalnya Windows XP yang terdapat edisi Home maupun Professional. Begitu pula aplikasi yang kita buat, mungkin ingin dibuat dalam beberapa edisi. Dengan makin kompleks program yang kita buat, makin susah untuk memilih fitur untuk tiap edisi. Misal untuk edisi 1 ada fitur a, b, c. Untuk edisi 2 terdapat fitur-fitur pada edisi 1 ditambah dengan fitur d dan e. Di masa mendatang mungkin saja ada penambahan fitur di dua edisi tersebut, atau bahkan ada penambahan edisi baru lagi. Jelas akan mempersulit proses kompilasi.
Masalah ini bisa dipermudah dengan penggunaan compiler directive. Ada berbagai macam compiler directive dan yang kita pakai adalah compiler directive {$DEFINE}. Compiler directive {$DEFINE} diguanakan untuk mendefinisikan simbol yang nantinya bisa digunakan untuk pemilihan kondisi pada program. Misalnya dengan contoh diatas, aplikasi yang mempunyai dua edisi, edisi 1 dan edisi 2, pada edisi 1 menu yang ada pada edisi 2 di sembunyikan, dan pada edisi 2 sebaliknya. Dalam source .pas yang kita buat tinggal menambahkan baris seperti ini untuk edisi 1.
{$DEFINE EDISI1}
Atau seperti ini untuk edisi 2.
{$DEFINE EDISI2}
Kemudian untuk pemilihan kondisi bisa kita lakukan dengan cara seperti ini.
{$IF DEFINED(EDISI1)}
Menu1.Visible := False;
Menu2.Visible := False;
Menu3.Visible := False;
{$ELSE}
Menu1.Visible := True;
Menu2.Visible := True;
Menu3.Visible := True;
{$IFEND}
Jika ingin compile edisi 1, kita hapus atau remark baris yang berisi definisi edisi 2 dan begitu pula sebaliknya. Misalkan jika kita mendefinisikan edisi 1 saja, jika program di compile maka hanya baris-baris ini saja yang dijalankan.
Menu1.Visible := False;
Menu2.Visible := False;
Menu3.Visible := False;
Sebaliknya jika kita mendefinisikan edisi 2 saja, jika program di compile maka hanya baris-baris ini saja yang dijalankan.
Menu1.Visible := True;
Menu2.Visible := True;
Menu3.Visible := True;

Baca selengkapnya...

04 Mei 2009

Cara Cepat Install Komponen Delphi

Delphi menyediakan kita fasilitas untuk menambah komponen baru selain komponen standar dari Delphi. Suatu waktu mungkin kita tidak puas dengan komponen yang diberikan Delphi dan menginginkan komponen tambahan dengan kemampuan dan tampilan yang lebih baik. Komponen dalam bentuk package Delphi tersebut banyak tersedia baik yang gratis maupun komersial. Yang jadi masalah adalah sebagian komponen yang tidak memiliki installer untuk menginstall komponen tersebut, jadi kita mesti melakukannya secara manual. Apalagi jika banyak komponen yang harus diinstall, tentu akan semakin merepotkan.
Ada cara cepat untuk install komponen dalam bentuk package tersebut. Cara ini dilakukan untuk menghindari install secara manual. Cara ini berlaku untuk komponen VCL yang terdapat pada component pallete Delphi. Syaratnya adalah komponen yang bersangkutan sudah pernah diinstall secara manual, karena memerlukan file-file dan setting registry hasil dari compile dan instalasi komponen tersebut.
Satu hal yang harus dilakukan sebelum compile komponen VCL adalah menentukan path library, yaitu direktori source (.pas atau .dcu) tempat komponen berada. Ini bisa dilakukan, misalnya untuk Delphi 7, dari menu Tools->Environment Options, kemudian pada tab Library kita menambahkan direktori yang diinginkan pada Library Path. Jika kita menambahkan atau mengurangi direktori pada Library Path, akan berpengaruh pada registry. Misalnya untuk Delphi 7, registry key yang berubah terdapat pada HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Library, dan registry entry yang berubah adalah “Search Path” yang berisi kumpulan library path yang dipisahkan oleh tanda ;. Bisa dibuktikan sendiri dengan membuka Registry Editor (pada start menu Windows, pilih Run dan ketikkan regedit). Isi dari registry entry tersebut yang perlu kita simpan, misalnya kedalam file tertentu.
Langkah berikutnya jika komponen tersebut berhasil diinstall, akan membuat file-file pada suatu direktori. File-file ini biasanya mempunyai ekstensi .bpl dan .dcp. Pada Delphi 7 direktori tersebut secara default terletak di <delphi_install_dir>\Projects\Bpl. Tiap komponen yang berhasil kita compile biasanya akan membentuk file .bpl dan .dcp dengan nama sesuai nama file package. Yang perlu kita lakukan adalah menyalin file-file tersebut ke suatu direktori yang nantinya dapat kita gunakan lagi tanpa harus install secara manual.
Langkah terakhir adalah menyimpan daftar komponen yang sudah diinstall tersebut. Setelah instalasi komponen berhasil, pada registry juga akan ditambahkan nama file .bpl lengkap dengan path. Pada Delphi 7 biasanya terletak pada registry key HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Known Packages. Disitu dapat kita lihat daftar komponen apa saja yang terinstall pada Delphi. Simpan daftar tersebut ke suatu file dengan cara klik kanan pada registry key “Known Packages” dan pilih Export atau dari menu File-> Export, kemudian simpan kedalam file (.reg).
Kita sudah mendapatkan tiga hal, library path, file hasil instalasi komponen (.bol dan .dcp) dan daftar komponen dari hasil export registry. Jika suatu saat kita melakukan instalasi baru Delphi, kita tidak perlu melakukan instalasi secara manual tiap komponen VCL yang kita inginkan. Berikut adalah langkah-langkah instalasi secara cepat dengan asumsi versi Delphi yang kita pakai adalah Delphi 7. Untuk versi lain, langkahnya sama meskipun mungkin terdapat perbedaan pada direktori dan registry key.
  • Buka Registry Editor (regedit). Pada registry key HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Library, ubah nilai registry entry “Search Path” dengan library path yang kita dapatkan pada langkah pertama.
  • Salin file-file komponen (.bpl dan .dcp) ke direktori tempat komponen berada, biasanya pada <delphi_install_dir>\Projects\Bpl.
  • Jalankan file .reg yang berisi daftar komponen, yang akan secara otomatis ditambahkan pada registry.

Baca selengkapnya...

03 Mei 2009

Conficker memang menjadi pusat perhatian dunia karena penyebaran virus ini yang begitu luar biasa. Jutaan pengguna sistem operasi Windows telah terinfeksi virus ini, dan kemungkinan juga terus bertambah tiap hari. Memang hebat virus ini, aku sendiri juga pernah mengalami removable disk yang terjangkiti virus ini, walaupun tidak secara langsung merasakan efeknya karena keburu aku berantas dengan anti virus. Tiap pulang dari warung internet juga bawa “oleh-oleh”, kemungkinan removable disk yang aku bawa pulang juga terjangkiti berbagai varian virus ini. Memang sangat menyebalkan!
Mengapa virus ini bisa begitu banyak menyerang komputer, ini disebabkan kemampuan virus ini untuk memanfaatkan celah keamanan yang ada pada sistem komputer Windows. Bahkan Windows terbaru yaitu Windows 7 yang masih berstatus beta pun juga rentan terhadap penyebaran virus ini. Untuk mengatasi celah keamanan dari Windows yang dapat dimanfaatkan oleh virus Conficker, Microsoft mengeluarkan patch seperti yang diumumkan pada Microsoft Security Bulletin MS08-067, http://www.microsoft.com/technet/security/Bulletin/MS08-067.mspx.
Menurut sumber yang didapat, ciri komputer atau jaringan yang terserang virus Conficker adalah adanya pesan error Generic Host Process dan kemudian akses internet yang mati, maka kemungkinan jaringan komputer sudah terserang virus ini. Virus ini mempunyai kemampuan menyebarkan diri ke komputer lain dalam jaringan yang tidak di patch MS08-067. Banyak teknologi canggih yang dijejalkan pada virus ini, beberapa diantaranya antara lain:
  • Mematikan System Restore. Virus ini mematikan System Restore dengan cara me-reset Restore Point untuk mencegah korban yang terjangkiti virus ini mengembalikan Restore Point.
  • Dynamic Link Library. Virus ini memiliki format DLL, dengan nama file dan ekstensi yang berubah-ubah, sehingga sulit ditebak.
  • Removable Disk. Ini yang sering aku rasakan setelah pulang dari warung internet. Virus ini juga memanfaatkan kelemahan dari autorun untuk dapat menyebar.
  • Download update. Virus ini berusaha download update untuk dirinya ke beberapa website yang ada.
Fitur-fitur diatas hanyalah sebagian dari teknologi pada virus tersebut. Mengetahui betapa bahaya virus ini, disarankan bagi pengguna komputer yang menggunakan sistem operasi Windows, sering melakukan patch dengan tujuan untuk menutup celah keamanan yang mungkin digunakan oleh pihak yang tidak bertanggung jawab. Dan untuk anti virus yang berkompeten untuk menghancurkan virus ini, bisa dengan menggunakan anti virus dari majalah komputer PCMEDIA, PCMAV. Anti virus ini terbukti mampu membasmi virus Conficker. Anti virus buatan Indonesia ini cukup mampu membunuh virus yang sering hinggap di removable disk punyaku, termasuk virus Conficker.
Anti virus ini juga menyediakan PCMAV Express for Conficker yang dibuat khusus untuk membasmi secara tuntan virus ini. Sebelum menggunakan anti virus ini, pastikan komputer tidak terhubung dengan jaringan maupun internet. Kemudian lakukan scan komputer sampai selesai dan dibersihkan jika ada, dan kemudian segera restart komputer. Lakukan scan ulang jika perlu, dan untuk mengingatkan lagi, sering lakukan patch atau update komputer anda.

Baca selengkapnya...

02 Mei 2009

Mengaktifkan Protokol TCP/IP dan Named Pipes pada SQL Server 2008

Instalasi SQL Server 2008 melalui GUI secara default tidak akan mengaktifkan protokol TCP/IP dan Named Pipes, hanya protokol Shared Memory yang aktif. Supaya dapat mengakses SQL Server secara remote, salah satu dari dua protokol tersebut harus diaktifkan. Kita bisa mengaktifkan dua protokol tersebut melalui tool SQL Server Configuration Manager dan mengaktifkan protokol tersebut secara manual. Tapi bukan itu yang dimaksud disini. Kita akan mengaktifkan protokol tersebut dengan memakai Windows PowerShell.
Ide ini diilhami dari cerita sederhana, mengenai user yang agak “rewel”. User tersebut tidak mau dipusingkan dengan banyak setting yang kadang memang membingungkan bagi banyak orang awam. Daripada mengharuskan user untuk melakukan setting tersebut, kita sendiri yang melakukan hal tersebut dengan bantuan Windows PowerShell. Sehingga user merasa diberikan kemudahan dalam pemakaian aplikasi yang kita kembangkan, apalagi dengan instalasi SQL Server 2008 yang begitu ruwet.
Setelah instalasi SQL Server 2008 berhasil, kita akan mendapatkan sebuah tool dengan nama “sqlps.exe” pada direktori instalasi SQL Server. Kita bisa mengakses tool ini dari direktori manapun, karena path yang sudah ditambahkan ke variabel environment. Tool ini akan kita perlukan untuk menjalankan file skrip yang akan kita buat. Tool ini sama dengan Windows PowerShell dengan tambahan cmdlet yang di load dan di register dari SQL Server.
Yang kita butuhkan adalah file skrip yang berisi kumpulan perintah untuk mengaktifkan protokol TCP/IP dan Named Pipes. Skrip ini dibuat dengan asumsi nama instance SQL Server adalah MSSQLSERVER. Berikut adalah isi dari file skrip “skrip.ps1”.
$smo = 'Microsoft.SqlServer.Management.Smo.'
$wmi = new-object ($smo + 'Wmi.ManagedComputer').

# List the object properties, including the instance names.
$wmi

# Enable the TCP protocol on the default instance.
$uri = "ManagedComputer[@Name='" + (get-item env:\computername).Value + "']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']"
$Tcp = $wmi.GetSmoObject($uri)
$Tcp.IsEnabled = $true
$Tcp.Alter()
$Tcp

# Enable the named pipes protocol for the default instance.
$uri = "ManagedComputer[@Name='" + (get-item env:\computername).Value + "']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Np']"
$Np = $wmi.GetSmoObject($uri)
$Np.IsEnabled = $true
$Np.Alter()
$Np


Sebelum menjalankan file skrip ini, kita perlu tahu bahwa secara default kita tidak dapat menjalankan file skrip. Ada sebuah istilah yang dinamakan ExecutionPolicy yang mengatur eksekusi skrip. Secara default nilainya adalah Restricted, yang perlu kita ubah ke RemoteSigned.
sqlps.exe -Command “Set-ExecutionPolicy RemoteSigned”
Kemudian file skrip dapat dijalankan dengan perintah seperti ini.
sqlps.exe -Command “C:\skrip.ps1”

Baca selengkapnya...

01 Mei 2009

Bahasa Scripting Windows PowerShell (Kesimpulan)

Windows PowerShell merupakan suatu program yang amat berguna bagi pengguna Windows, khususnya bagi administrator. Bahasan-bahasan yang di posting sebelumnya tentang Windows PowerShell adalah nyata berdasarkan pengalaman. Meski begitu masih banyak sekali fitur, kemampuan, dan lain sebagainya mengenai Windows PowerShell yang belum dibahas. Bahasan-bahasan sebelumnya adalah sebagian kecil dari begitu banyak hal yang ditawarkan oleh Windows PowerShell.
Tidak hanya menerima input berupa perintah, Windows PowerShell juga menerima input file skrip yang berisi perintah-perintah yang valid untuk Windows PowerShell. File ini bisa juga berisi logika-logika pemrograman, seperti perulangan atau pengecekan kondisi (if then else). File skrip yang mempunyai ekstensi .ps1 ini nantinya bisa dijalankan pada command shell Windows PowerShell. Untuk referensi mengenai pembuatan skrip dengan Windows PowerShell tergolong minim, setidaknya bagiku secara pribadi. Di manualnya tidak ada referensi untuk kebutuhan ini. Hanya dari berbagai sumber di internet yang bisa dijadikan referensi.
Di masa yang akan datang pengetahuan dan penguasaan tentang bahasa skrip pada Windows PowerShell bisa menjadi aset yang berharga bagi siapa saja yang mengembangkan aplikasi atau dalam administrasi Windows, terutama untuk teknologi Windows yang berbasis .NET. Pada masa sekarang, kebanyakan teknologi Windows berhubungan erat dengan .NET, seperti Microsoft Office atau SQL Server. Seperti pengalamanku sendiri yang tahu dan tertarik dengan Windows PowerShell karena suatu pekerjaan pada SQL Server 2008 yang menggunakan Windows PowerShell sebagai solusi untuk pemecahan masalah.

Baca selengkapnya...