28 Februari 2009

Testing MySQL 5.1

Baru saja dapet installer MySQL 5.1, langsung aja aku coba menggantikan MySQL 5.0 yang udah aku pake beberapa saat. Setelah dicoba rasanya boleh juga buat update yang lama. Kemudian setelah aku coba dengan program buatanku sendiri, rasanya ada yang aneh. Kalo dulu user yang tidak terdaftar (tidak ada di tabel mysql.user tidak bisa masuk/ditolak) sekarang ok aja nyelonong masuk meski belum terdaftar! User yang tidak terdaftar bisa connect ke server, tapi ga isa liat database yang ada (cuma bisa lihat database information_schema dan test).
Setelah dilihat ternyata permasalahannya ada pada usernya. Pada MySQL 5.1, user ‘’@’localhost’ dengan priviledge minimum. Dengan adanya user yang dikosongkan ini, maka semua user bisa masuk, tidak hanya user yang sudah ada saja. Aneh juga MySQL 5.1 dibuat seperti ini secara default, padahal pada MySQL 5.0 tidak.
Masalah tidak hanya sampai disitu saja, pada saat aku create user, misal ‘aku’@’%’, kalo aku akses dari komputer lokal ternyata ga dianggap sebagai user ‘aku’@’%’, tapi kalo dari komputer lain ok. Masalah beres setelah aku tambahkan lagi user ‘aku’@’localhost’. Jika aku connect dari lokal maka, usernya adalah ‘aku’@’localhost’, jika dari komputer lain, maka usernya adalah ‘aku’@’%’. Satu hal yang aneh lagi bagiku, bug atau memang dibuat gitu? Pada versi 5.0, ok aja tuh. Kalo udah ada user ‘aku’@’%’ ya udah semua user aku dari komputer manapun dianggap user ‘aku’@%’.
Selain dua masalah diatas ada satu lagi perubahan. Kalo dulu veri 5.0, server MySQL pake file “mysqld-nt.exe”, mulai rilis 5.1 dan setelahnya diganti menjadi “mysqld.exe”. Yang ini mungkin ga terlalu signifikan buatku. Dengan pergantian ini, nama file jadi sama dengan yang versi Linux, karna aku pernah nyoba. Dengan berbagai perbahan diatas, jelas hal ini merepotkan aku. Dari program dulu yang udah ok, sekarang berubah lagi. Perubahan yang cukup lumayan bagiku untuk sebuah versi minor yang berubah.

Baca selengkapnya...

27 Februari 2009

Error Program Pada SQL Server 2008 Express + Vista

Beberapa waktu yang lalu, si Bos bersama seorang anak buahnya pergi ke suatu tempat di Jakarta untuk urusan bisnis sekalian install program demo yang telah kubuat. Pada hari sebelumnya sudah begitu pede karna sebelumnya program sudah dites dan berjalan tanpa masalah pada Windows XP, bahkan pada sistem operasi yang baru install dengan bantuan software virtualisasi pun jalan tanpa masalah. Sebelumnya juga sudah aku jelaskan tentang langkah-langkah untuk menginstall program termasuk SQL Server 2008.
Kemudian besoknya si Bos pun pergi (yah itung-itung sedikit melemaskan otot dan otak, soalnya kalo ada si Bos tegang melulu, jadi jarang ada kesempatan ini) sampe beberapa hari. Besoknya ketika kembali, ternyata tidak begitu riang gembira. Ternyata pada sistem operasi client yang ternyata adalah Windows Vista, program tidak bisa berjalan mulus. Kadang-kadang terjadi error saat membuka form/menjalankan sesuatu. Gak jelas seperti apa langkahnya, kemudian bunyi error lengkapnya seperti apa juga ga tau, cuma si Bos sempat ngomong ada kata-kata “collation” pada errornya. Ya udah sama-sama ga tau. Ga bisa nyoba, soalnya ga ada Windows Vista. Proyek pun tertunda, solusi sementara client pake Windows XP untuk trial program, sementara aku cari dimana masalahnya dan apa solusinya.

Baca selengkapnya...

26 Februari 2009

Windows Management Instrumentation (WMI)

Susah banget yah dapetin MAC address atau info prosesor atau mungkin info tentang hardware yang lain. Kalo ga mau susah, ada cara lain lagi. Pada sistem operasi Windows ada sebuah service yaitu Windows Management Instrumentation (WMI). Dengan WMI, kita bisa mendapatkan info tentang hardware dari komputer kita. Tidak hanya itu kita bisa juga memperoleh info tentang siapa saja user/group, service yang ada, info sistem operasi yang dipakai, dan lain-lain seperti yang ada pada System Information-nya windows. Dengan WMI, mendapatkan info tentang berbagai macam hardware di komputer kita akan lebih mudah dan simpel. Penjelasan detail tentang apa itu WMI dan apa saja fungsinya bisa dilihat di http://msdn.microsoft.com.
Sedikit gambaran tentang WMI, jika sistem operasinya adalah Windows XP maka jalankan perintah wmic pada command prompt, maka akan muncul prompt seperti: “wmic: root\cli>”. Setelah muncul prompt tersebut, kita bisa mendapatkan info apa saja tentang komputer. Misal untuk mendapatkan info tentang prosesor ketikkan perintah “cpu” (tanpa tanda petik) pada prompt. Untuk mendapatkan list perintah apa saja yang didukung, ketikkan perintah “/?” pada prompt (tanpa tanda petik). Sedangkan untuk keluar ketik “exit”.
Supaya dapat menjalankan fungsi ini dibutuhkan WMI core yang sudah terinstall pada PC. Sistem operasi mulai Windows 2000 dan XP sudah ada secara default, sedangkan yang Windows 98 musti download dulu dari websitenya Microsoft. Langkah pertama adalah mengimport WMI scripting library. Setelah diimport, akan muncul file yang bernama “WbemScripting_TLB.pas”. Kemudian tinggal pakai saja pada program yang mengakses WMI. Dibawah ini adalah sebuah contoh pemakain WMI pada program.
uses WbemScripting_TLB, ActiveX, Variants;

function GetWMIstring(wmiHost, wmiClass, wmiProperty: string): string;
var
  Locator: ISWbemLocator;
  Services: ISWbemServices;
  SObject: ISWbemObject;
  ObjSet: ISWbemObjectSet;
  SProp: ISWbemProperty;
  Enum: IEnumVariant;
  Value: Cardinal;
  TempObj: OleVariant;
  s: string;
begin
  Result := '';
  try
    Locator := CoSWbemLocator.Create; // Create the Location object
    // Connect to the WMI service, with the root\cimv2 namespace
    Services := Locator.ConnectServer(wmiHost, 'root\cimv2', '', '', '', '', 0, nil);
    ObjSet := Services.ExecQuery('SELECT * FROM ' + wmiClass, 'WQL',
      wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
    Enum := (ObjSet._NewEnum) as IEnumVariant;
    while Enum.Next(1, TempObj, Value) = S_OK do
    begin
      try
        SObject := IUnknown(TempObj) as ISWBemObject;
      except
        SObject := nil;
      end;
      TempObj := Unassigned; // Always need to free interface in TempObj
      if SObject <> nil then
      begin
        SProp := SObject.Properties_.Item(wmiProperty, 0);
        s := SProp.Get_Value;
        if not VarIsNull(s) then
        begin
          Result := s;
          Break;
        end;
      end;
    end;
  except
    // Trap any exceptions (Not having WMI installed will cause one!)
  end;
end;
Cara memanggilnya adalah seperti berikut:
GetWMIstring('', 'Win32_Processor', 'ProcessorId')
Parameter wmiHost diisi kosong untuk akses ke PC lokal, “Win32_Processor” adalah class yang kita akses, dan “ProcessorId” adalah properti yang ingin kita dapatkan. Pada websitenya, Microsoft mempunyai referensi lengkap tentang class dan properti, juga event dan method yang dapat dilihat di http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/r_wmicls_6r6t.asp.

Baca selengkapnya...

25 Februari 2009

Mendapatkan ID Unik Dari Suatu Komputer (Lanjutan)

Setelah dapet cara untuk mendapatkan MAC address yang bisa digunakan untuk proteksi program, si Bos pun senang. Tapi selang beberapa waktu sang Bos pun datang lagi. Kali ini minta supaya proteksinya lebih diperkuat lagi. Dia minta agar yang tadinya cuma ngambil dari MAC address saja, kali ini ditambah lagi dari hardware yang lain. Biar lebih sip katanya, lagian kalo komputernya kebetulan ga ada NIC-nya bisa tetap jalan. Ada-ada saja si Bos ini, suka banget sih nyusahin orang. Sambil menggerutu dan mengomel (tentunya dalam hati) aku kerjain juga tuh permintaannya.
Saat itu aku berpikir apa ya yang pasti ada dari komputer yang ga mungkin tidak ada. Akhirnya aku putusin prosesorlah yang jadi pilihan. Komputer masih bisa jalan tanpa NIC, tapi kalo tanpa prosesor? Komputer ghoib kali. Tapi untuk mendapatkan id dari prosesor prosesor ini ga gampang, bahkan susah bagi kebanyakan orang, soalnya ada bagian dari code-nya yang musti pake bahasa asembly. Jadi inget waktu kuliah dulu, waktu ngikuti mata kuliah mikroprosesor. Susah tapi keren tu, untuk sekarang walau udah jadi bahasa kuno, tapi masih ampuh untuk beberapa solusi masalah, bahkan ada yang musti pake bahasa kuno ini supaya bisa jalan atau lebih cepat karna kemampuannya yang bisa akses register prosesor (mungkin cuma bahasa inilah yang bisa, setidaknya setahuku).
Ya udah, kita balik lagi buat dapetin id dari prosesor. Sebenarnya sebagian besar prosesor tidak punya sesuatu yang unik yang bisa didapat dari program seperti MAC address, yang ada adalah info seperti vendor, tipe prosesor, jumlah core, clock speed, dll. Jadi dari sinilah bisa kita mainin. Dari info tersebut digabung, trus dengan suatu algoritma jadilah sebuah “id” buat prosesor.
uses Classes, SysUtils;

implementation

function GetCPUInfos: TStringList;
var
  _eax, _ebx, _ecx, _edx: Longword;
  i: Integer;
  b: Byte;
  s, s1, s2, s3, s_all: string;
begin
  Result := TStringList.Create;
  asm // asm call to the CPUID inst.
    mov eax, 0 // sub. func call
    db $0F, $A2 // db $0F,$A2 = CPUID instruction
    mov _ebx, ebx
    mov _ecx, ecx
    mov _edx, edx
  end;
  for i := 0 to 3 do // extract vendor id
  begin
    b := Lo(_ebx);
    s := s + chr(b);
    b := Lo(_ecx);
    s1:= s1 + chr(b);
    b := Lo(_edx);
    s2:= s2 + chr(b);
    _ebx := _ebx shr 8;
    _ecx := _ecx shr 8;
    _edx := _edx shr 8;
  end;
  Result.Add('CPU' + '');
  Result.Add(' - ' + 'Vendor ID: ' + s + s2 + s1);
  asm
    mov eax, 1
    db $0F, $A2
    mov _eax, eax
    mov _ebx, ebx
    mov _ecx, ecx
    mov _edx, edx
  end;
  b := Lo(_eax) and 15;
  Result.Add(' - ' + 'Stepping ID: ' + IntToStr(b));
  b := Lo(_eax) shr 4;
  Result.Add(' - ' + 'Model Number: ' + IntToHex(b, 1));
  b := Hi(_eax) and 15;
  Result.Add(' - ' + 'Family Code: ' + IntToStr(b));
  b := Hi(_eax) shr 4;
  Result.Add(' - ' + 'Processor Type: ' + IntToStr(b));
  b := Lo((_eax shr 16)) and 15;
  Result.Add(' - ' + 'Extended Model: ' + IntToStr(b));
  b := Lo((_eax shr 20));
  Result.Add(' - ' + 'Extended Family: ' + IntToStr(b));
  b := Lo(_ebx);
  Result.Add(' - ' + 'Brand ID: ' + IntToStr(b));
  b := Hi(_ebx);
  Result.Add(' - ' + 'Chunks: ' + IntToStr(b));
  b := Lo(_ebx shr 16);
  Result.Add(' - ' + 'Count: ' + IntToStr(b));
  b := Hi(_ebx shr 16);
  Result.Add(' - ' + 'APIC ID: ' + IntToStr(b));
  if (_edx and $40000) = $40000 then // is serial number enabled?
    Result.Add(' - ' + 'Serial Number ' + 'Enabled')
  else
    Result.Add(' - ' + 'Serial Number ' + 'Disabled');
  s := IntToHex(_eax, 8);
  asm // determine the serial number
    mov eax, 3
    db $0F, $A2
    mov _ecx, ecx
    mov _edx, edx
  end;
  s1 := IntToHex(_edx, 8);
  s2 := IntToHex(_ecx, 8);
  Insert('-', s, 5);
  Insert('-', s1, 5);
  Insert('-', s2, 5);
  Result.Add(' - ' + 'Serial Number: ' + s + '-' + s1 + '-' + s2);
  asm
    mov eax, 1
    db $0F, $A2
    mov _edx, edx
  end;
  if (_edx and $800000) = $800000 then
    Result.Add('MMX ' + 'Supported')
  else
    Result.Add('MMX ' + 'Not Supported');
  if (_edx and $01000000) = $01000000 then
    Result.Add('FXSAVE & FXRSTOR Instructions ' + 'Supported')
  else
    Result.Add('FXSAVE & FXRSTOR Instructions Not ' + 'Supported');
  if (_edx and $02000000) = $02000000 then
    Result.Add('SSE ' + 'Supported')
  else
    Result.Add('SSE ' + 'Not Supported');
  if (_edx and $04000000) = $04000000 then
    Result.Add('SSE2 ' + 'Supported')
  else
    Result.Add('SSE2 ' + 'Not Supported');
  asm // execute the extended CPUID inst.
    mov eax, $80000000 // sub. func call
    db $0F, $A2
    mov _eax, eax
  end;
  if _eax > $80000000 then // any other sub. funct avail. ?
  begin
    Result.Add('Extended CPUID: ' + 'Supported');
    Result.Add(' - Largest Function Supported: ' + IntToStr(_eax - $80000000));
    asm // get brand ID
      mov eax, $80000002
      db $0F
      db $A2
      mov _eax, eax
      mov _ebx, ebx
      mov _ecx, ecx
      mov _edx, edx
    end;
    s := '';
    s1 := '';
    s2 := '';
    s3 := '';
    for i := 0 to 3 do
    begin
      b := Lo(_eax);
      s3:= s3 + chr(b);
      b := Lo(_ebx);
      s := s + chr(b);
      b := Lo(_ecx);
      s1 := s1 + chr(b);
      b := Lo(_edx);
      s2 := s2 + chr(b);
      eax := _eax shr 8;
      _ebx := _ebx shr 8;
      _ecx := _ecx shr 8;
      _edx := _edx shr 8;
    end;
    s_all := s3 + s + s1 + s2;
    asm
      mov eax, $80000003
      db $0F
      db $A2
      mov _eax, eax
      mov _ebx, ebx
      mov _ecx, ecx
      mov _edx, edx
    end;
    s := '';
    s1 := '';
    s2 := '';
    s3 := '';
    for i := 0 to 3 do
    begin
      b := Lo(_eax);
      s3 := s3 + chr(b);
      b := Lo(_ebx);
      s := s + chr(b);
      b := Lo(_ecx);
      s1 := s1 + chr(b);
      b := Lo(_edx);
      s2 := s2 + chr(b);
      _eax := _eax shr 8;
      _ebx := _ebx shr 8;
      _ecx := _ecx shr 8;
      _edx := _edx shr 8;
    end;
    s_all := s_all + s3 + s + s1 + s2;
    asm
      mov eax, $80000004
      db $0F
      db $A2
      mov _eax, eax
      mov _ebx, ebx
      mov _ecx, ecx
      mov _edx, edx
    end;
    s := '';
    s1 := '';
    s2 := '';
    s3 := '';
    for i := 0 to 3 do
    begin
      b := Lo(_eax);
      s3 := s3 + chr(b);
      b := Lo(_ebx);
      s := s + chr(b);
      b := Lo(_ecx);
      s1 := s1 + chr(b);
      b := Lo(_edx);
      s2 := s2 + chr(b);
      _eax := _eax shr 8;
      _ebx := _ebx shr 8;
      _ecx := _ecx shr 8;
      _edx := _edx shr 8;
    end;
    Result.Add('Brand String: ' + '');
    if s2[Length(s2)] = #0 then setlength(s2, Length(s2) - 1);
    Result.Add('' + ' - ' + s_all + s3 + s + s1 + s2);
  end
  else
    Result.Add(' - Extended CPUID ' + 'Not Supported.');
end;

Baca selengkapnya...

24 Februari 2009

Mendapatkan ID Unik Dari Suatu Komputer

Pada suatu waktu si Bos minta aku bikinin fitur proteksi pada program untuk PC yang sedang dibuat. Proteksi itu dibuat supaya ga sembarang orang bisa menjalankan program tersebut. Dia juga minta untuk satu komputer, hanya bisa menjalankan satu copy program yang didasarkan seperti punya Windows terbaru yang ada serial number/activation code. Dengan melihat komponen-komponen komputer yang umum dipakai seperti prosesor, motherboard, harddisk, dll, yang paling memungkinkan adalah MAC (Media Access Control) address dari sebuah NIC (Network Interface Card). MAC address adalah alamat fisik dari sebuah kartu jaringan/ethernet yang kebanyakan ada di komputer sekarang.
Dengan mendapatkan MAC address maka dimungkinkan untuk membuat fitur seperti yang sudah disebutkan sebelumnya. Jadi setelah program dijalankan pada sebuah komputer, program tersebut mendapatkan MAC address komputer, dan dengan sebuah algoritma tertentu meminta user memasukkan activation code supaya program bisa dijalankan dengan sempurna tentunya. Weleh ngerepoti aja si Bos ini, tapi gimana lagi, Bos tu, permintaannya adalah sebuah titah (kayak raja aja…). Ya setelah itu dimulailah sebuah perburuan untuk sebuah cara gimana supaya permintaan si Bos dapat terealisasi. Setelah cari-cari dan coba-coba akhirnya aku dapat cara yang cocok buat aku. Source code ini didapat dari sebuah sumber di internet.
uses Classes, SysUtils;

const
  ERROR_SUCCESS = 0;
  MAX_INTERFACE_NAME_LEN = $100;
  MAXLEN_IFDESCR = $100;
  MAXLEN_PHYSADDR = 8;
  MIB_IF_TYPE_ETHERNET = 6;

type
  MIB_IFROW = record
    wszName: array [0..(MAX_INTERFACE_NAME_LEN * 2 - 1)] of Char;
    dwIndex: LongInt;
    dwType: LongInt;
    dwMtu: LongInt;
    dwSpeed: LongInt;
    dwPhysAddrLen: LongInt;
    bPhysAddr: array [0..(MAXLEN_PHYSADDR - 1)] of Byte;
    dwAdminStatus: LongInt;
    dwOperStatus: LongInt;
    dwLastChange: LongInt;
    dwInOctets: LongInt;
    dwInUcastPkts: LongInt;
    dwInNUcastPkts: LongInt;
    dwInDiscards: LongInt;
    dwInErrors: LongInt;
    dwInUnknownProtos: LongInt;
    dwOutOctets: LongInt;
    dwOutUcastPkts: LongInt;
    dwOutNUcastPkts: LongInt;
    dwOutDiscards: LongInt;
    dwOutErrors: LongInt;
    dwOutQLen: LongInt;
    dwDescrLen: LongInt;
    bDescr: array [0..(MAXLEN_IFDESCR - 1)] of Char;
  end;

function GetIfTable(pIfTable: Pointer; var pdwSize: LongInt; bOrder: LongInt): LongInt; stdcall; external 'IPHLPAPI.DLL';

implementation

function GetEthernetAddresses: TStringList;
const
  MAX_ROWS = 20;
type
  IfTable = record
    nRows: LongInt;
    ifRow: array [1..MAX_ROWS] of MIB_IFROW;
  end;
var
  pIfTable: ^IfTable;
  TableSize: LongInt;
  tmp: string;
  i, j: Integer;
  ErrCode: LongInt;
begin
  pIfTable := nil;
  Result := TStringList.Create;
  try
    TableSize := 0;
    GetIfTable(pIfTable, TableSize, 1);
    if (TableSize <>
    GetMem(pIfTable, TableSize);
    ErrCode := GetIfTable(pIfTable, TableSize, 1);
    if ErrCode <> ERROR_SUCCESS then Exit;
    for i := 1 to pIfTable^.nRows do
    begin
      if pIfTable^.ifRow[i].dwType = MIB_IF_TYPE_ETHERNET then
      begin
        tmp := '';
        for j := 0 to pIfTable^.ifRow[i].dwPhysAddrLen - 1 do
          tmp := tmp + Format('%.2x', [pIfTable^.ifRow[i].bPhysAddr[j]]);
        if tmp <> '' then Result.Add(tmp);
      end;
    end;
  finally
    if Assigned(pIfTable) then FreeMem(pIfTable, TableSize);
  end;
end;
Output yang didapat dari script diatas adalah daftar MAC address dari sebuah komputer yang berupa format hexa. Hasil alamat yang sama didapat jika kita menjalankan perintah ipconfig /all dari command prompt.

Baca selengkapnya...

23 Februari 2009

Akuntansi, Jurnal, Debet, Kredit, Nomor Perkiraan, bla bla bla…

Meski aku ni bikin program akuntansi tapi sebetulnya aku ga suka dan ga seberapa ngerti. Aneh kan, tapi nyata. Gairahku terhadap segala hal yang berhubungan dengan akuntansi begitu rendah. Kalo diajari paling cuma bertahan beberapa saat, besoknya atau beberapa hari lagi paling lupa. Parah nih, mending kalo suka tapi gak ngerti atau ngerti tapi ga suka. Benernya aku trauma dengan akuntansi ini, sejak SMA nilai selalu pas-pasan. Lebih parah lagi waktu kuliah, waktu pengambilan pertama dapat nilai E dari skala A sampai E, akibatnya ya gitu gak lulus, musti ngulang lagi. Akhinya pengambilan kedua baru lulus itupun nilai C. Yah udahlah ga ada nafsu buat dapetin A, ntar kalo ngambil lagi ga lulus lagi.
Ya beginilah keadaanku sekarang, soalnya yang banyak dibutuhkan disini ya program seputar keuangan. Kalo aku bikin mesti ada orang lain yang ngurus bagian yang satu itu. Untungnya aku kenal orang yang amat sangat membantu aku soal yang satu ini. Dia udah berkecimpung didunia ini mungkin udah belasan taon. Bahkan dia juga punya blog sendiri. Kalo mau tahu ato belajar dari dia silahkan liat blognya di: http://mamikcs.blogspot.com.
Tapi yang patut disyukuri di negara ini dimana-mana sama peraturannya tentang pajak dan keuangan yang menentukan ya pemerintah pusat, jadi bikin satu program bisa dipakai dimana-mana diseluruh penjuru negeri ini, kalo ada perubahan itupun tidak signifikan. Bandingkan dengan di Amerika yang peraturannya ditentukan oleh gubernurnya masing-masing. Jadi tiap negara bagian di Amerika yang jumlahnya 50an bisa berlainan, akibatnya program bisa jadi beda banyak. Yah diambil enaknya aja di negara tercinta kita ini…

Baca selengkapnya...

19 Februari 2009

Microsoft SQL Server 2008 Express

Besar, lambat, ruwet, repot. Itulah kesan setelah mencoba terhadap produk Microsoft yang satu ini. Dari proses instalasinya aja udah ruwet. Pertama mesti install Windows Installer 4.5 dulu. Kemudian install .Net Framework 3.5, ya ini yang lama. Trus install Windows PowerShell 1.0. Terakhir baru install SQL Server 2008 yang juga lama banget. Untuk install dari langkah pertama sampai selesai install SQL Server 2008 beserta setting macem-macem butuh waktu setengah jam lebih, padahal komputer udah pake prosesor dual core Intell, memori 2 GB.
Entah napa installnya ruwet gitu, disengaja kali sama Microsoft. Yah kalo ga kepaksa ya ga pake, yang SQL Server 2000 aja bagiku udah cukup. Tapi dalam rangka mendukung HaKI, okelah pindah. Lagian yang SQL Server 2000 udah ga dijual lagi. Cepat atau lambat pasti perpindahan ke versi baru pasti terjadi. Sebelumnya yang SQL Server 2005 udah nyoba sih, ga serumit dan selambat yang 2008 tapi tetap aja lambat. Dibanding yang 2005 yang dulu saya coba ada perkembangan.
Pada waktu pertama nyoba, payah ga ada enterprise manager/management studio, musti pake command prompt. Trus setelah beberapa lama ada update yang jadi satu dengan management studio, tapi tetap aja repot soalnya ga bisa export/import, padahal di versi 2000 cukup sering aku pake. Setelah lama ga nyoba, akhirnya yang pada versi 2008 yang kucoba ini ternyata ada fungsi export/import.
Memang untuk teknologi .Net ini aku kurang sreg, selain eksekusi program lambat, juga butuh resource besar. Dulunya aku pernah nyoba. Dari Delphi aku memutuskan tekad bulat pindah ke .Net. Waktu itu aku pake bahasa pemrograman C#, memang aku pilih demikian karna aku kurang suka dengan bahasa Basic dan lagi aku juga membuat tugas akhirku dengan bahasa C++, jadi ada kedekatan bahasa walaupun tidak sama semuanya.
Memang dari segi fitur aku salut, banyak tambahan, kemudahan juga tampilan. Membuat tampilan yang bagus lebih mudah dari Delphi. Tapi beberapa masalah buat aku jadi balik lagi ke Delphi. Pertama adalah karna di lingkungan .Net, apapun bahasanya pasti full object. Delphi mendukung penuh OOP tapi tidak full object, jadi mirip dengan C++. Semuanya jadi sulit karena semua dalam bahasa yang full object selalu “dipaksa” untuk memikirkan semuanya itu adalah object. Itulah yang tidak aku suka karna menurutku pemrograman itu bebas, artinya benar-benar bebas berpikir dan berekspresi. Tetapi bukan itu yang bikin aku geram, yang bikin aku balik kucing adalah, biasa, lambat. Lama-lama bosen juga waktu dihabiskan untuk nunggu proses compile dari pada mikir. Walaupun dengan berbagai teknik optimasi, tetap saja tidak mampu mengalahkan program yang tidak dibuat dalam lingkungan .Net, karna tetap saja .Net seperti mesin virtual yang berjalan diatas sistem operasi, selain itu juga menghabiskan banyak resource, biasa, teknologi baru Microsoft, lebih baru, lebih hebat, lebih cantik, lebih mudah, lebih banyak uang terbuang untuk ugrade komputer. Supaya bisa lebih cepat, ada solusinya, beli komputer baru yang lebih bertenaga, tapi ya tau sendiri kan, penghasilan pas-pasan.
Ya udah cukup, kita kembali lagi ke masalah SQL Server 2008. Aku sih tidak pusing-pusing dengan teknologi baru yang dijejalkan ke versi baru ini, karna dari yang versi 2000 aja sudah cukup dan semuanya juga didukung pada versi baru ini. Cuma satu yang aku tau, kalo di versi yang 2000, aku pernah pake yang namanya Extended Stored Procedure yang rumit bikinnya itu, sekarang dengan teknologi baru ini yang sudah terintegrasi dengan .Net, maka tidak perlu serepot dulu lagi bila butuh fungsi/fitur yang tidak bisa dilakukan dengan fungsi dari SQL Server, seperti misalnya baca file tertentu, enkripsi, dan lain sebagainya. Untuk penjelasan cara install SQL Server 2008 dan persyaratan yang dibutuhkan, liat di situs http://juice.altiris.com/article/5920/install-and-configure-sql-server-2008-express.

Baca selengkapnya...

18 Februari 2009

Buat Program Dengan Alat Fingerprint USB Dengan Delphi

Setelah object COM diimport dari Delphi, baru bisa bikin programnya. Setelah diimport, Delphi membuat file yang bernama “DpSdkEngLib_TLB.pas” dan ini yang harus ditambahkan pada unit yang dipake untuk akses alat fingerprint. Pertama kali untuk inisialisasi alatnya, ada beberapa class/interface yang dipake yaitu TFPDevices, TFPDevice dan FPDevice. Contoh:
uses DpSdkEngLib_TLB;

procedure InisialisasiAlat;
var
  ListDevices: TFPDevices; // menyimpan daftar alat-alat yang ada
  MyDevice: TFPDevice; // alat yang digunakan
  IMyDevice: FPDevice; // interface ke TFPDevice
begin
  // alat fingerprint bisa lebih dari 1
  ListDevices := TFPDevices.Create(nil);
  MyDevice := TFPDevice.Create(nil);
  // jika alatnya ada maka pakai alat yang pertama
  if ListDevices.Count > 0 then
    IMyDevice := FPDevice(ListDevices.Item[1]);
  // event saat image fingerprint sudah didapat
  MyDevice.OnSampleAcquired := OnSampleAcquired;
  if Assigned(IMyDevice) then
  begin
    MyDevice.ConnectTo(IMyDevice);
    // method ini mesti dipanggil biar event-eventnya juga diterima
    IMyDevice.SubScribe(Dp_StdPriority, Self.Handle);
  end;
end;
Alat fingerprint bisa lebih dari satu dan dibedakan dari serial numbernya, jadi tiap alat punya id yang unik. Setelah inisialisasi, yang perlu kita lakukan adalah memroses event OnSampleAcquired yang kita terima setelah user menekan alat fingerprint. Ada 4 tahap yang diperlukan untuk proses pengenalan fingerprint, yaitu:
  1. Mendapatkan image fingerprint. Ketika user menyentuh sensor, image fingerprint dalam bentuk “mentah” dikompres dan dienkripsi oleh sensor, kemudian dikirim ke PC.
  2. Proses dekripsi dan dekompresi sample. Sample “mentah” yang didapat dari sensor didekripsi dan didekompres menjadi sample, dimana dari sample tersebut dapat dibuat template.
  3. Buat template. Template disini adalah deskripsi secara matematik dari karakteristik fingerprint. Ada 2 tipe, template pre-registrasi atau template verifikasi.
  4. Proses registrasi atau verifikasi.
    • Registrasi. Jika registrasi fingerprint baru, 4 template pre-registrasi harus didapat guna membuat satu template registrasi. Template registrasi ini dapat disimpan untuk digunakan pada saat proses verifikasi.
    • Verifikasi. Pada proses ini template verifikasi didapatkan dan dibandingkan dengan template registrasi yang ada.
procedure OnSampleAcquired(Sender: TObject;
const aRawSample: IDispatch);
var
  samplepro: TFPRawSamplePro; // menyimpan object sample
  ftrex: TFPFtrEx; // untuk membuat template
  reg: TFPRegister; // template registrasi
  sample: IDispatch; // sample mentah
  regtemplate: IDispatch; // template pre-registrasi
  vertemplate: IDispatch; // template verifikasi
  quality: AISampleQuality;
  done: WordBool;
  i: Integer;
begin
  samplepro := TFPRawSamplePro.Create(nil);
  ftrex := TFPFtrEx.Create(nil);
  reg := TFPRegister.Create(nil);
  try
    // Proses dekripsi dan dekompresi sample
    samplepro.Convert(aRawSample, sample);
    // Buat template pre-registrasi
    ftrex.Process(sample, Tt_PreRegistration, regtemplate, quality);
    if quality = Sq_Good then
    begin
      // Buat template verifikasi
      ftrex.Process(sample, Tt_Verification, vertemplate, quality);
      if quality = Sq_Good then
      begin
        // Proses registrasi
        reg.NewRegistration(Rt_Verify);
        for i := 1 to 4 do
          reg.Add(regtemplate, done);
        if done then
        begin
          // proses fingerprint
        end;
      end;
    end
    else
    begin
      ShowMessage(‘Kualitas sidik jari kurang bagus.’);
    end;
  finally
    samplepro.Free;
    ftrex.Free;
    reg.Free;
  end;
end;
Contoh scipt diatas adalah untuk registrasi fingerprint. Tiap kali user menekan alat fingerprint, jika sukses maka akan dianggap registrasi fingerprint baru.

Baca selengkapnya...

Alat Fingerprint USB Dengan Sensor Dari Digital Persona

Baru beli alat fingerprint dari Interactive buat tes program. Ada dua tipe offline dan online. Yang offline tidak perlu komputer, standalone didalamnya udah ada programnya. Kalo mau diproses musti ditarik dulu datanya dari alatnya. Harganya bervariasi mulai dari Rp 3.600.000,- sampai yang paling mahal hampir Rp 13.000.000,-, garansi 2 tahun. Yang online musti ditancapin ke komputer, yang ada disini pake USB. Yang online ada dua macam satu yang sensornya buatan Singapura, satu lagi buatan USA (Digital Persona), garansi 1 tahun. Masing-masing punya kelebihan dan kekurangan.
Waktu aku tanya alat yang online, katanya sih bagusan yang sensornya USA, harganya lebih mahal lagi. Tapi emang waktu aku coba yang buatan USA lebih sensitif, yang buatan Singapura mesti lebih ditekan supaya bisa sukses dikenali. Yah lumayan lah buat investasi, aku beli keluar duit sekitar 1,5 jutaan, dapetnya alat fingerprint, cd berisi driver, contoh program (pake VB), manual, SDK dan dikasih bonus akrilik (supaya nekan sensornya ga kebablasan, nanti cepet rusak lagi). Kalo mau program absensinya ada tapi mesti keluar duit lagi. Dengan SDK, alat ini bisa diprogram sesuai dengan keinginan kita, misal setelah verifikasi fingerprint berhasil disimpan di database, dan lain sebagainya.
Sebelum membeli alat ini, sempat ragu juga, karna contohnya pake VB dan C++, lagian yang jual juga ga bisa memastikan bisa ga diakses pake Delphi, tapi setelah aku baca manualnya, katanya bahasa pemrograman yang bisa mengakses object COM bisa dipake, aku putuskan beli alatnya. Waktu pertama kali coba bikin program dengan ini agak susah, karna contohnya cuma pake VB dan C, tapi akhirnya bisa juga. Kalo dari Delphi mesti import type librarynya dulu, baru bisa pake. Yah dengan alat ini bisa buat modal untuk berpetualang bikin program absensi.

Baca selengkapnya...

17 Februari 2009

Kenapa Delphi?

Delphi bukan bahasa yang pertama kupelajari tapi aku pilih jadi bahasa utamaku karna mudah, bisa OOP, dokumentasi bagus, banyak tutorial, contoh program, bla bla bla. Meskipun mungkin bukan yang paling mudah atau sempurna, tapi terbukti sudah bisa menyelesaikan banyak masalah dan cocok buatku. Di blog ini sebagian besar source code yang ada pake Delphi, meski tidak selalu. Selain Delphi aku juga banyak berhubungan dengan database. Waktu kuliah aku pake Oracle, setelah kerja pake MS SQL Server dan sekarang plus MySQL. Sudah berbagai macam program kubuat dari program yang ecek sampe program untuk accounting dan absensi dengan fingerprint dan penggajian yang sekarang sedang kubuat.
Baca selengkapnya...

Unek-unek

Bikin program memang berat, bagi seorang programmer sejati kerja berjam-jam didepan komputer, lupa maem, sampe lembur kurang tidur, udah gitu sering ditekan, diomeli bos/client juga kerjaan harus selesai sebelum deadline. Udah gitu penghasilannya juga pas-pasan. Semua itu sudah pernah kualami tapi meski gitu juga sulit meninggalkannya, udah jodoh kali.
Baca selengkapnya...

Salam Kenal

Hai, namaku Rudy, aku adalah seorang programmer lulusan S1-Informatika di salah satu PTS di Surabaya. Blog ini berisi tentang pengalamanku berkelana di dunia pemrograman yang penuh dengan liku-liku kehidupan. Bahasa yang paling aku kuasai untuk bikin software adalah Delphi, tapi aku juga tahu bahasa yang lain meski ga sebaik Delphi. Yah, aku bukan seorang pemula tapi aku juga ga bilang expert beneran, soalnya aku juga sering copy/paste dari berbagai sumber. Bagi yang tertarik silahkan datang dan menikmati sajiannya mumpung gratis…
Baca selengkapnya...