Kamis, 25 Januari 2024

Creating Linux Daemon or Windows Service with Lazarus

Daemon Application in Linux or Service Application in Windows is an application that running in the background, usually automatically started when the operating system started even if user is not logged in. In Windows Service Application you cannot access Windows GUI library.

To create Daemon with Lazarus, first you need to create new project and select Daemon (service) application. After you click the OK button the IDE will create a new lazarus project with a daemon mapper unit dan a daemon class unit. Then save the project to the specified project name and folder.

Then you need to give the daemon class name. In this example the daemon class is named FirebirdRelayDaemon and the unit file saved as uFirebirdRelayDaemon.pas. 

The daemon class will never be registered to the operating system or started unless you register it in the Daemon Mapper. To register the daemon class you need to open the daemonmapperunit1.pas.

Then click the object inspector and then click the ellipsis button in the DaemonDefs property to open the daemon definitions editor. Then click Add button in the daemon definitions editor to add new daemon definition.


After you click Add button the object inspector will display the new daemon definition. You need to edit DaemonClassName, Display and Name properties. 

  • DaemonClassName: TFirebirdRelayDaemon.
  • DisplayName: Firebird Relay Server.
  • Name: firebirdrelayd.

After the daemon class is registered, you can place the code for your daemon in the daemon class. You can place objects initialization in the OnCreate event and objects finalization in the OnDestroy event. The code to start the daemon thread is placed in the OnStart event and code to terminate daemon thread is placed in the OnStop event. 


This is the example of the daemon class declaration:

  1. type

  2.   { TFirebirdRelayDaemon }

  3.   TFirebirdRelayDaemon = class(TDaemon)
  4.     procedure DataModuleCreate(Sender: TObject);
  5.     procedure DataModuleDestroy(Sender: TObject);
  6.     procedure DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
  7.     procedure DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
  8.   private
  9.     { private declarations }
  10.     FirebirdRelayServer: TFirebirdRelayServer;
  11.   public
  12.     { public declarations }
  13.   end;

This is the example of the daemon class definition:

  1. { TFirebirdRelayDaemon }

  2. procedure TFirebirdRelayDaemon.DataModuleCreate(Sender: TObject);
  3. begin
  4.   FirebirdRelayServer := TFirebirdRelayServer.Create;
  5. end;

  6. procedure TFirebirdRelayDaemon.DataModuleDestroy(Sender: TObject);
  7. begin
  8.   FirebirdRelayServer.Free;
  9. end;

  10. procedure TFirebirdRelayDaemon.DataModuleStart(Sender: TCustomDaemon;
  11.   var OK: Boolean);
  12. begin
  13.   FirebirdRelayServer.LoadFromIniFile(ExtractFilePath(ParamStr(0))+'konfig.ini',
  14.     'FirebirdRelayServer');
  15.   FirebirdRelayServer.StartThread;
  16.   OK := True;
  17. end;

  18. procedure TFirebirdRelayDaemon.DataModuleStop(Sender: TCustomDaemon;
  19.   var OK: Boolean);
  20. begin
  21.   FirebirdRelayServer.TerminateThread;
  22.   OK := True;
  23. end;

Output of the compiled daemon:

The daemon is installed in the windows services list:

You can start the service from command line using "net start firebirdrelayd" and stop the service using "net stop firebirdrelayd".

Thankyou for reading this article and I hope this article can be useful.

Compress and Decompress Text or File using ZLib in Delphi or Free Pascal Lazarus

When I was in my college I work as part time programmer in a software house. I got a task to create a software updater. The software updater work by copying new files to the already installed application in the client's computers. To make update file easier to distribute I need to compress the new files and combine them into a file.

In Delphi or Lazarus we can use TFileStream class to access files and using TCompressionStream in the zstream unit to compress data from memory buffer to output stream that can be any TStream object including TFileStream or TMemoryStream. To decompress later you can use TDecompressionStream class.

If ZLib compression is not enough you can use BZip2 library for stronger compression.

Bellow is an example of using ZLib TCompressionStream and TDecompressionStream class:

  1. program TestCompressAndDecompress;
  2. {$MODE DELPHI}
  3. uses SysUtils, Classes, zstream;
  4. var
  5.   F: TMemoryStream;
  6.   Comp: TCompressionStream;
  7.   Decomp: TDecompressionStream;
  8.   X, Y: AnsiString;
  9. begin
  10.   F := TMemoryStream.Create;
  11.   try
  12.     Comp := TCompressionStream.Create(clMax, F);
  13.    try
  14.       X := 'Compress and Decompress array of bytes or a file using ZLib in Delphi or Free Pascal Lazarus';
  15.       Comp.Write(X[1], Length(X));
  16.     finally
  17.       Comp.Free;
  18.     end;
  19.     WriteLn('Original Text: "',X,'"');
  20.     WriteLn('Original Size: ',Length(X),' bytes.');
  21.     WriteLn('Compressed Size: ',F.Size,' bytes.');
  22.     F.Position := 0;
  23.     Decomp := TDecompressionStream.Create(F);
  24.     try
  25.        SetLength(Y, Length(X));
  26.        Decomp.Read(Y[1], Length(Y));
  27.     finally
  28.       Decomp.Free;
  29.     end;
  30.     WriteLn('Decompressed Text: "',Y,'"');
  31.   finally
  32.     F.Free;
  33.   end;
  34. end.

Selasa, 14 November 2023

Creating A Thread Safe Database Connection Pool for Delphi and Free Pascal based Lazarus

One day I got a software project to create an application that need to be accessed from many computer with one data server. I decided to create a three-tier application, a client application for the client computer and a middle application that connect directly to database server that is a Firebird Database Server for this project. After a few weeks the project is finished and I realized that the response time of every client request is very slow caused by database connection time. Because every time client request arrived the middle application create new thread to handle the request and create new database connection and doing database query and then send the respond data back to the requester client and finally close database connection and free database connection, transaction and queries objects before the thread is destroyed.

Then I begin researching to reduce the database connection time in the request handler thread. I become pesimistic after I read in delphi manual book that every thread must create and use its own database connection. But I'm still not giving up because other programming like PHP and MySQL can do that. Then I try to isolate every parts of the database connection and database query in part by part, and finally I'm able to reuse database connection, transcation and query object with many threads by isolating creation and desctruction of database connection object and transaction object and also commit and rollback process, everything else is no problem with multithread.

  1. procedure TSimpleQuery.Commit;
  2. begin
  3.   if ((FQuery.Connection = nil) or not FQuery.Connection.Connected or
  4.     FQuery.Connection.AutoCommit) then exit;
  5.   EnterCriticalSection(FConnectionManager.GetCriticalSection^);
  6.   try
  7.     try
  8.       FQuery.Connection.Commit;
  9.     except
  10.       LogExceptionMessage;
  11.       raise;
  12.     end;
  13.   finally
  14.     LeaveCriticalSection(FConnectionManager.GetCriticalSection^);
  15.   end;
  16.   ConnectionManager.SetAllowFailover(FQuery, True);
  17. end;

  18. procedure TSimpleQuery.Rollback;
  19. begin
  20.   if ((FQuery.Connection = nil) or not FQuery.Connection.Connected or
  21.     FQuery.Connection.AutoCommit) then exit;
  22.   EnterCriticalSection(FConnectionManager.GetCriticalSection^);
  23.   try
  24.     try
  25.       FQuery.Connection.Rollback;
  26.     except
  27.       LogExceptionMessage;
  28.       raise;
  29.     end;
  30.   finally
  31.     LeaveCriticalSection(FConnectionManager.GetCriticalSection^);
  32.   end;
  33.   ConnectionManager.SetAllowFailover(FQuery, True);
  34. end;

After succeeded creating reusable database connection object accross multiple threads then I create wrapper component for the database connection, transaction dan query object like this:
  1.   ISimpleQuery = interface
  2.     ['{1C1949E4-C472-45BA-8638-5A14545592F8}']
  3.     function GetConnection: TZConnection;
  4.     function GetConnectionManager: IConnectionManager;
  5.     function GetParentQuery: ISimpleQuery;
  6.     function GetQueryObject: TZReadOnlyQuery;
  7.     function GetPrepared: Boolean;
  8.     function GetRecordCount: Integer;
  9.     function GetRowsAffected: Integer;
  10.     function GetActive: Boolean;
  11.     procedure SetActive(AValue: Boolean);
  12.     function GetName: String;
  13.     procedure SetName(const AValue: String);
  14.     function GetFieldDefs: TFieldDefs;
  15.     function GetFields: TFields;
  16.     function GetSQL: TStrings;
  17.     function GetBOF: Boolean;
  18.     function GetEOF: Boolean;
  19.     function GetParams: TParams;
  20.     function GetParamCheck: Boolean;
  21.     procedure SetParamCheck(Value: Boolean);
  22.     function GetConnected: Boolean;
  23.     function GetAutoCommit: Boolean;
  24.     procedure SetAutoCommit(const Value: Boolean);
  25.     function GetRecordAccess: TRecordAccess;
  26.     function GetPost: ITransportVar;
  27.     function GetWhere: ITransportVar;

  28.     procedure Open;
  29.     procedure OpenQuery(const ASQL: String);
  30.     procedure ExecSQL;
  31.     procedure ExecuteQuery(const ASQL: String);
  32.     procedure Close;
  33.     procedure First;
  34.     procedure Next;
  35.     procedure Prior;
  36.     procedure Last;
  37.     procedure Commit;
  38.     procedure Rollback;
  39.     procedure Prepare;
  40.     procedure Unprepare;
  41.     function CreateQuery: ISimpleQuery;
  42.     function FieldByName(const AFieldName: String): TField;
  43.     function FindField(const AFieldName: String): TField;
  44.     function ParamByName(const AParamName: String): TParam;
  45.     procedure Select(const SelectedCols: String);
  46.     procedure Group(const GroupBy: String);
  47.     procedure Order(const OrderBy: String);
  48.     procedure Get(const Table: String);
  49.     procedure Insert(const Table: String);
  50.     procedure Update(const Table: String);
  51.     procedure Delete(const Table: String);
  52.     function GetSQLWhere(AWhere: ITransportVar): String;
  53.     procedure AllowPost(const Columns: String);

  54.     property ConnectionManager: IConnectionManager read GetConnectionManager;
  55.     property ParentQuery: ISimpleQuery read GetParentQuery;
  56.     property Active: Boolean read GetActive write SetActive;
  57.     property Connection: TZConnection read GetConnection;
  58.     property QueryObject: TZReadOnlyQuery read GetQueryObject;
  59.     property FieldDefs: TFieldDefs read GetFieldDefs;
  60.     property Fields: TFields read GetFields;
  61.     property QueryFields[const AFieldName: String]: TField read FieldByName; default;
  62.     property SQL: TStrings read GetSQL;
  63.     property BOF: Boolean read GetBOF;
  64.     property EOF: Boolean read GetEOF;
  65.     property RowsAffected: Integer read GetRowsAffected;
  66.     property RecordCount: Integer read GetRecordCount;
  67.     property Prepared: Boolean read GetPrepared;
  68.     property Params: TParams read GetParams;
  69.     property ParamCheck: Boolean read GetParamCheck write SetParamCheck;
  70.     property Connected: Boolean read GetConnected;
  71.     property AutoCommit: Boolean read GetAutoCommit write SetAutoCommit;
  72.     property Name: String read GetName write SetName;
  73.     property RecordAccess: TRecordAccess read GetRecordAccess;
  74.     property Post: ITransportVar read GetPost;
  75.     property Where: ITransportVar read GetWhere;
  76.   end;

I'm using reference counter in the Interface type to make coding faster by creating query interface object and after the interface object is unused then it's automatically freed and the database connection object, transaction object, the wrapped query object is deallocated and waiting for next use.

I develop two version one with ZeosDBO component and another one with SQLDb component  and both working and very stable.

After I upgraded my application with this database connection pool the client request handling is faster than before.

I'm sorry about my bad english this is the first time i write article in english because maybe alot programmer outside of my country require this knowledge.

Rabu, 30 Agustus 2023

Alasan menggunakan Lazarus dan Delphi di zaman sekarang

Zaman sekarang development tools yang bagus dan sangat maju dan sedang berkembang pesat banyak seperti Java, Java Script, PHP, C#, Go, Dart, Kotlin, C++, Python dan masih banyak lainnya. Diantara banyaknya development tools yang ada dalam keseharian saya masih sering menggunakan aplikasi Lazarus dan Delphi untuk mendevelop aplikasi. Lazarus sendiri merupakan IDE (Integrated Development and Environment) yang memanfaatkan compiler Free Pascal.

Beberapa alasan saya untuk menggunakan Lazarus dan Delphi antara lain sebagai berikut:

  1. Karena sudah sangat nyaman karena terbiasa jadi begitu ada kebutuhan untuk mendevelop aplikasi pakenya ya itu-itu saja.
  2. Menggunakan resource processor dan memori yang kecil sehingga orang-orang seperti saya yang tidak memiliki hardware komputer highend terbaru dengan processor terbaru dan ram yang besar tetap bisa menjalankan aplikasi ini. Zaman saya kuliah dulu cuma menggunakan komputer AMD Sempron 2,1 GHz dengan RAM 1 GB saja masih bisa menjalankan program Delphi 2007 dengan lancar jaya.
  3. Menghasilkan file executable native code dengan optimalisasi yang bagus sehingga bisa berjalan dengan cepat dengan hardware seadanya. Khusus untuk Lazarus dan Delphi yang baru sudah mendukung prosesor 64-bit dengan optimal, sedangkan Delphi 2010 ke bawah masih terbatas pada processor 32-bit.
  4. File executable yang dihasilkan tidak bergantung pada file library yang lain sehingga cukup mendistribusikan satu file executable saja, kecuali memang menggunakan library khusus misal untuk modulasi program atau driver untuk koneksi ke database sehingga memerlukan file library lain tapi terbatas pada library yang dibutuhkan saja. Karena cukup mendistribusikan satu file executable saja sehingga mempermudah deployment dan meminimalkan penggunaan space hard disk maupun ram.
  5. Mungkin karena masih turunan Delphi 1.0 yang dulunya didesain untuk Windows 3.1 yang masih mendukung komputer dengan RAM sekecil 4 MB sehingga standar library bawaan Lazarus dan Delphi didesain agar sangat efisien dalam menggunakan RAM.
  6. Sangat mudah untuk membuat daemon atau windows service sehingga cocok untuk membuat sebuah aplikasi server kecil-kecilan.
  7. Bisa mengakses hardware yang bisa digunakan misalnya untuk membuat SMS Gateway dengan modem GSM.
  8. Khusus untuk Free Pascal, Lazarus dan Delphi terbaru bisa untuk mendevelop multiplatform misal bisa jalan di Windows dan Linux sehingga sangat membantu sekali misalnya ketika harus mendevelop aplikasi server yang dijalankan di VPS Linux yang lebih murah. 

Bagaimanapun juga sebagai development tool tetaplah hanya sebuah tool saja yang membutuhkan programmer untuk memanfaatkannya sehingga menghasilkan produk yang bagus dan bermanfaat. Saya percaya sebuah tool yang bisa memberikan manfaat bagi penggunanya tidak akan pernah punah dan menghilang.

Sekian artikel ini semoga bermanfaat.

Minggu, 08 Januari 2023

Komputer Gaming Jadul Core i5 670 3,46 GHz dan Geforce GT 1030

Zaman dulu ketika saya masih kuliah dan tinggal di rumah orang tua saya ada beberapa komputer gaming yang biasa saya pake kalau ada waktu luang atau dipake beberapa keponakan untuk bermain game sepulang sekolah. Karena ada renovasi dan jarang dipake akhirnya komputer itu rusak semua dan saya juga tidak ada waktu untuk mengembalikan lagi. Sehingga para ponakan yang biasanya pada ke rumah ibu saya jadi tidak ada dan kalau malam minggu ibu saya jadi tidak ada keponakan yang jagain.

Sehingga setelah saya punya waktu luang pada November 2022 kemarin saya sempatkan untuk merakit lagi sebuah komputer gaming untuk dipakai ketika butuh refresing. Karena pemakaiannya bukan untuk kompetisi tapi sebagai sarana refreshing dan saya juga masih hobi main game-game lama maka untuk spesifikasinya cenderung ke low end atau entry level dan bahkan menggunakan komponen-komponen seken yang terpenting hemat listrik.

A. Instalasi Hardware

Setelah mengubek-ubek beberapa marketplace dan juga barang-barang lama yg sudah dibeli tapi belum dipake, akhirnya susunan komponen terpilihnya (yang masuk budget) adalah sebagai berikut:

1. Casing: Deep Cool Matrexx 30

 Casing ini bekas pakai dari komputer lama yang masih sangat bagus dan masih sangat bisa dipakai.

2. Power Supply: Power Station II 500 Watt 80+

Kemarin saat mencari power supply 80+ dengan kapasitas sekitar 500 watt menemukan produk ini dengan harga cukup murah Rp 275.000 dan setelah saya cek kondisi fisik masih sangat mulus  dan tidak ada bekas solderan penggantian komponen.

Kenapa harus 80+ ? Jawabannya karena lebih efisien karena memiliki automatic voltage regulator yang bisa menyesuaikan diri kalau tegangan input naik-turun. Sehingga biaya listrik lebih rendah dan tegangan listrik outputnya lebih stabil membuat komponen komputer yang lain menjadi lebih awet. 

3. Motherboard: ASUS H55 M-LX

Memilih komponen ini karena dulu kepingin memakai seri intel core i generasi pertama tapi belum kesampaian. Dapat motherboard ini seken dengan harga Rp 380.000 dan setelah saya perhatikan dengan seksama tidak ada bekas solderan penggantian komponen yang berarti masih ori semua dan dari penjualnya juga sudah ditest normal.

Saya agak menghindari membeli komponen seken yang ada bekas penggantian komponen karena biasanya komponen pengganti tidak sama kualitasnya dengan komponen asli dari pabrik apalagi ini merknya Asus yang terkenal kualitas produk motherboardnya bahkan biasanya usia 5 tahun masih seperti baru.

4. CPU: Intel Core i5 670 3,46 GHz (3,73 GHz di mode turbo)

Saat ini komponen Intel Core i5 generasi pertama ini sudah sangat murah. Kemarin di marketplace menemukan komponen Intel Core i5 670 dengan harga Rp 105.000 (belum termasuk ongkir). Khusus untuk komponen prosesor sangat jarang sekali rusak khususnya yang rendah daya.

5. RAM: 2 x DDR3 4 GB 1333MHz

Awalnya saya bingung karena di rumah ada beberapa persediaan RAM 1600 MHz yang kalau dipasang di atas 2 GB komputer selalu reset dan gagal booting. Setelah searching sana-sini ternyata penyebabnya karena controller memory pada prosesor Intel Clarkdale (Intel Core i3 500 series dan Core i5 600 series) ini memang tidak sebagus pada Intel Lynfield (Intel Core i5 700 series dan Intel Core i7 800 series). Pada memory controller bawaan Intel Clarkdale ini kesulitan untuk mendukung RAM dengan frekuensi di atas 1.333 MHz. 

Akhirnya setelah dicoba dengan RAM 1.333 MHz berfungsi dengan sangat normal dan lancar.

6. Hard Disk: SSD 120 GB Midas Force + Seagate Barracuda 1 TB

Karena komputer ini fungsinya untuk gaming dan kadang-kadang buat buka browser dan aplikasi office maka untuk penyimpanan saya pasang hard disk 1 TB saja. Hal ini dirasa cukup karena untuk file-file ebook dan movies sudah disimpan di komputer server 16 watt yang selalu tersedia.

7. VGA : Asus Geforce GT 1030 2 GB GDDR5 fan less

Untuk komponen VGA ini lumayan sulit mencari yang harga terjangkau tetapi setelah badai kripto berlalu sudah mulai banyak yang jual seken dengan harga terjangkau. VGA ASUS GT 1030 2 GB GDDR5 ini saya peroleh di tokopedia dengan harga Rp 725.000 (belum termask ongkir).

Kenapa tidak membeli harga yang lebih mahal? Jawabannya karena bukan untuk kebutuhan produktif dan sudah mencukupi untuk menjalankan game-game yang akan dimainkan.

8. Monitor: Lenovo 22" (1680x1050)

Untuk monitor masih menggunakan bawaan monitor dari komputer lama.

9. Sound System: Gamen GS10

 Speaker aktif ini disupply langsung dari port USB komputer.

B. Instalasi Software

Setelah perakitan hardware selesai saatnya dilanjutkan dengan instalasi software. Instalasi software dilakukan dengan urutan:

1. Sistem Operasi Menggunakan Windows 7 64-bit

Alasan menggunakan sistem operasi ini adalah karena beberapa game yang bakal sering dimainkan adalah game lama yang berjalan lancari pada Windows 7 dan akan sangat sulit untuk diinstal di windows yang lebih baru. Meskipun menggunakan Windows 7 memiliki beberapa resiko utamanya resiko keamanan terhadap virus dan hacker yang jauh lebih tinggi, tetapi hal ini masih bisa ditoleransi karena komputer gaming tidak akan menyimpan data-data penting dan dengan antivirus pihak ketiga meningkatkan keamanan komputer.

2. Instalasi Antivirus AVG

Setelah instalasi sistem operasi selesai yang berikutnya diinstal adalah anti virus. Hal ini untuk mencegah virus masuk dan terinstal ke dalam sistem operasi termasuk dari hardware driver yang akan diinstal.

3. Instalasi Hardware Driver

Hardware seperti LAN card, sound card, VGA membutuhkan software driver supaya berfungsi dengan optimal. Untuk mendapatkan software driver hardware biasanya disediakan dalam bentuk DVD tapi kalau belum bisa didownload dari website vendor hardwarenya.

4. Instalasi Software Aplikasi

  • Internet Browser: Firefox, karena firefox masih mendukung Windows 7.
  • Office: Open Office.
  • Image Editing: GIMP.

C. Pengujian Sistem

Setelah instalasi hardware dan software selesai saatnya menguji komputer. Komputer diuji dengan menjalankan game-game seperti Dirt 2, Dota 2 dan Bionic Commando selama beberapa bulan ini khususnya di hari sabtu s.d minggu kadang dari jam 8 pagi sampe jam 12 malam. Alhamdulillaah komputer telah berjalan selama 2 bulan dan tidak ada kendala setiap dinyalakan langsung nyala tanpa drama apapun.

D. Performa Sistem

  1. Windows Performace Index

    Berdasarkan hasil pengukuran Windows Performance Index skor keseluruhan adalah 7,1 yang berasal dari faktor processor Intel Core i5 670 dan kecepatan akses SSDnya yang masih menggunakan koneksi SATA II. Sedangkan untuk desktop graphics dan 3D business graphics mendapatkan skor 7,7 yang disumbangkan dari VGA ASUS GT 1030.

    Pada saat komputer nganggur atau idle tanpa monitor konsumsi listrik terukur 50,5 Watt.


    Sedangkan ketika monitor dinyalakan dan komputer idle terukur daya listrik 67,2 Watt.

    Pada saat dipakai untuk membuka browser atau aplikasi office terukur penggunaan daya listrik 73,6 Watt.

  2. Dirt 2

    Komputer berhasil menjalankan game Dirt 2 dengan lancar.

    Hasil pengujian performa game Dirt 2 dengan setting detail high dan resolusi 1280x800 mendapatkan skor average FPS 78,8 dan minimum FPS 65,1 yang masih sangat bagus. 


     Angka FPS ini diperoleh dengan konsumsi daya listrik 128,1 Watt.

  3. Dota 2

    Komputer ini berhasil menjalankan game Dota 2 dengan lancar tetapi performanya tidak maksimal. Ketika game sangat intens FPS bisa ngedrop di bawah 30.

    Hasil pengujian performa game Dota 2 mendapatkan angka FPS 51 - 24 dengan setting game di atas ini. Dari konsumsi daya listrik terlihat bahwa VGA tidak digunakan secara maksimal sehingga performa game kurang maksimal. Kesimpulan sementara bottleneck berada di sisi processornya.
    Angka FPS ini diperoleh dengan konsumsi daya listrik 121 Watt.

Sekian catatan tentang komputer gaming jadul ini, semoga bermanfaat.

Senin, 12 Desember 2022

Merakit Komputer Server Rumah Rendah Daya Dengan AMD A6-5200 2 GHz Quad Core

Kemarin internet rumah tiba-tiba terputus sehingga langganan internet hp sampai kehabisan kuota sehingga sering ada yang marah-marah karena tidak balas pesan wa atau angkat telepon wa padahal karena hp benar-benar sampai tidak bisa menerima dan mengirim data sama sekali. Sempat memanggil penyedia jasa internet semacam RT/RW Net di sini tapi malah tidak datang-datang.

Kemudian diputuskan untuk bikin server rumah untuk sharing koneksi internet dari hp lenovo Vibe K5 yang sudah hampir rusak dijadikan internet tethering dengan koneksi 4G LTE indosat im3 yang saat itu harganya paling terjangkau.

Kebutuhan komputer server rumah ini adalah:

  1. Rendah daya se-rendah-rendahnya tapi kemampuan pemrosesan masih mencukupi.
  2. Bisa menjadi internet gateway dan bisa membatasi bandwidth karena maklum internet 4G masih sangat mahal jadi paket internet 100 GB harus bisa bertahan sampe akhir bulan.
  3. Storage yang cukup besar dalam hal ini SSD 120 GB dan Hard Disk 4 TB digunakan untuk menyimpan aplikasi dan server FTP yang menyimpan hasil download, perpustakaan ebook, movies, dan backup file dari laptop dan perangkat yang dimiliki.
  4. RAM cukup untuk sistem operasi dan program-program server yang berjalan minimal 4 GB tapi karena ram yang ada di rumah cuma 8 GB ya dipake saja.

Setelah mengumpulkan hardware yang dulu pernah dibeli tapi tidak terpakai akhirnya spesifikasi komputer server rumah adalah sebagai berikut:

  • CPU: AMD A6-5200 2 GHz Quad Core.
  • Motherboard: Biostar A68N-5200.
  • RAM: DDR3 8 GB PC-12800.
  • Hard Disk 1: SSD 120 GB Midasforce.
  • Hard Disk 2: Seagate BarraCuda 4 TB.
  • Casing: Xigmatek Asgard. 
  • Power Supply: Gigabyte 500 Watt 80+.
  • Wifi : USB TP-Link.
  • OS : Windows 7 64-bit.

Awalnya saya kepingin komputer server ini memakai OS Linux tetapi karena linux zaman sekarang sudah beda jauh dengan linux yang saya pakai waktu kuliah dulu dan waktu mendesak akhirnya dengan terpaksa menggunakan Windows 7 64-bit yang meskipun sudah tidak disupport lagi oleh Microsoft tapi masih ada beberapa anti-virus yang mendukungnya sehingga semoga asal tidak sembarangan colok flashdisk dan klik link di internet tidak sampai terkena virus terutama ransomeware. Jangan lupa juga untuk menginstal update service pack 1 dan update sha di windows 7 karena diperlukan oleh beberapa aplikasi yang baru misalnya Whatsapp desktop.

Setelah komputer terakit dengan sempurna kemudian diinstal beberapa aplikasi untuk server maupun utilitas antara lain:

  1. Softperfect Bandwidth Manager untuk membatasi kecepatan akses internet pada host-host tertentu.
  2. FileZilla FTP Server untuk server FTP.
  3. Chrome untuk web browser.

 

Karena komputer ini bakalan menyala 24-jam maka harus hemat daya supaya bisa tahan lama. Dengan menggunakan alat watt meter terukur konsumsi daya ketika komputer sedang tidak diakses adalah 14,9 watt dan saat aktif melakukan pemrosesan bisa naik hingga 27 watt yang berarti cukup hemat listrik mengingat menggunakan prosesor quad core 2,5 GHz, ditambah RAM 8 GB, SSD 120 GB dan  hard disk 4 TB. Untuk menghemat penggunaan daya listrik termasuk dengan meminimalkan penggunaan fan atau kipas yaitu cuma menggunakan fan processor dan fan power supply untuk sirkulasi udara dalam casing komputer. Karena listrik di negara kita tidak bisa dibilang murah maka perlu dihitung biaya listrik bulanannya jika untuk rata-rata daya listrik (14,9 + 27 ) / 2 = 20,95 Watt. Sehingga pemakaian listrik dalam sebulan = 20,95 x 24 x 30 x 1,45 = 21.117,60 rupiah.

FTP server untuk ebook.

FTP server untuk movies bisa diputer dengan aplikasi Kodi di TV.

FTP Server berhasil diakses dengan lancar dari laptop windows 10 sehingga bermanfaat untuk menata file-file ebook yang didownload dari masa-masa kuliah dan juga file-file movie yang bisa langsung dimainkan di TV dengan aplikasi Kodi.

Saat sedang suntuk menggunakan laptop maka komputer server rumah bisa disambungkan ke layar monitor, dan usb hub untuk memainkan game-game emulator klasik Sega dan SNES dengan fps yang cukup optimal.

Kalau kepepet komputer ini juga mampu digunakan untuk coding dengan Free Pascal atau Delphi. 

Jika dilihat dari Windows 7 Performance Index hasilnya ternyata masih lumayan. Skor untuk akses hard disk dan SSD lumayan tinggi yang berarti kontroller SATA3 onchipnya bagus. 

Ketika perlu download yang tidak mendesak misalnya ebook atau movie bisa diremote untuk memulai download dan bisa dicopy hasil download beberapa saat atau beberapa hari kemudian.

Sekian sharing tentang pembuatan server rumah minimalis dan semoga bermanfaat.

Kamis, 06 Januari 2022

Mengikuti Vaksinasi Covid-19

Setelah covid-19 masuk ke tanah air selama beberapa bulan, dan saya pun sering bepergian ke tempat yang kemungkinan besar terkontaminasi covid-19. Saya selalu disiplin cuci tangan dan pake masker dan bermodal niat baik buat bekerja. Kemudian ada salah satu teman yang mengajak untuk vaksinasi dan dari pengetahuan saya vaksin itu untuk memperkenalkan virus covid-19 ke sistem imun tubuh sehingga kalau terifeksi virus covid-19 bisa sembuh lebih cepat sehingga saya antusias untuk ikut. Sialnya saat hari vaksinasi bareng teman saya itu ada miskomunikasi yang hasilnya saya tidak tahu kalau hari itu vaksinasi dan gagal ikut vaksinasi covid-19 hari itu. 

Akhirnya saya cari di website yukvaksin dan tinggal menunggu jadwal vaksinasinya. Setelah menunggu beberapa hari dapat pemberitahuan untuk vaksinasi pada tanggal 27 Juli 2021 di Pasar Seni Gabusan Bantul. Pagi hari sebelum vaksin aku sarapan dulu dan jam 8 berangkat ke tempat vaksinasi dan sampai sana antrian panjang banget, ditambah ada salah satu laptop yang tidak berfungsi di bagian pendaftaran. Vaksinasi selesai sekitar jam 1 siang, kemudian saya makan siang dan terus pulang.

Sesampainya di rumah mulai terasa badan lemes dan meriang, sehingga secara instinc aku mulai banyak minum air putih dan mengurangi makan. Selama tiga harian badan terasa kacau banget dan di hari ketiga demam sudah mulai mereda dan memutuskan untuk pergi ke Kebumen untuk mengambil barang tertentu, dan paginya balek lagi ke jogja karena ada kerjaan. Dalam suasana hujan rintik-rintik dan badan terasa lemes akhirnya berhasil sampai Bantul lagi dan otomatis telah menempuh perjalanan 2 x 100 km dengan motor shogun. Sesampainya di Bantul langsung tidur dan badan terasa demam tinggi banget dan mulai tidak bisa mencium bau. Sempat posting di facebook kenapa kok dampak vaksinnya tidak hilang setelah 5 hari lebih padahal seharusnya tidak lebih dari 3 hari. Ada teman yang komentar mungkin terinfeksi covid-19 dan ada pula yang komentar memang dampak vaksin seperti itu. Pada hari ke enam sempat mau periksa ke puskesmas tapi karena badan terasa agak aneh instinc aku memutuskan untuk menunda dan balek ke rumah di bantul untuk bed-rest supaya imun tubuh lebih efektif melawan infeksi.

Demam berlangsung selama 2 mingguan setelah itu demam berangsur hilang tapi tubuh masih terasa dingin dan belum bisa mencium bau apa-apa. Dan setelah minggu ke-3 baru badan terasa agak pulih dan mulai bisa mencium bau. Selama 3 minggu itu saya benar-benar bed rest, tidak ngurusin kerjaan coding dan tetap rajin sholat 5 waktu, berdoa semoga diberikan kesembuhan  dan selalu pake masker ganda di luar maupun di dalam rumah kecuali pas sendirian di dalam kamar.

Sekitar sebulan kemudian saya dapat jadwal vaksinasi tahap ke dua. Di situ saya menanyakan ke dokter penanggung jawabnya kenapa kok vaksinasi pertama saya lama banget dan gejalanya agak parah dan jawabannya mengagetkan karena saya dianggap telah terpapar covid-19 tetapi tidak sempat dites, dan kemudian dokternya tetap memperbolehkan saya untuk vaksinasi tahap kedua hari itu.

Andai saja saya kemarin memaksakan diri untuk periksa ke puskesmas mungkin akan jelas apakah saya benar-benar telah terpapar covid-19 atau tidak, dan menurut saya memang benar dan kemungkinan terpapar covid-19 pada saat berada di rumah di Kebumen.

Creating Linux Daemon or Windows Service with Lazarus

Daemon Application in Linux or Service Application in Windows is an application that running in the background, usually automatically starte...