Arsip Tag: tips dan trik

Tips Cara Cepat Optimisasi Banyak File PNG di Linux

Bagi kawan-kawan yang sering bekerja untuk proyek web dan semacamnya yang menggunakan gambar, saya yakin pasti pernah melakukan optimisasi gambar agar lebih efisien, khususnya jika akan diakses lewat internet, dan salah satu tipe gambar favorit yang sangat sering dijadikan icon di website adalah tipe data PNG.

Nah tips kali ini adalah, jika kita mempunyai banyak data PNG dan capek untuk lakukan optimisasi satu persatu (apalagi kalau sampai ratusan :D) menggunakan aplikasi pengolah gambar yang umum, silahkan gunakan tools optipng di Linux yang jalan di terminal.

Pertama kali silahkan instalasi dulu aplikasinya, misal jika menggunakan keluarga debian bisa langsung;

sudo apt-get install optipng

Setelah terinstall silahkan langsung buka terminal dan arahkan ke file-file yang akan dioptimisasi. Misal, saya ingin melakukan optimisasi pada semua file PNG yang berada di folder /home/bair/pictures/web1/images maka silahkan langsung jalankan perintah berikut (dianjurkan untuk copy dulu foldernya, selain untuk backup juga untuk membandingkan :D);

optipng /home/bair/pictures/web1/images/*.png

Dan secara otomatis gambar-gambar PNG kita yang ada di folder tersebut sudah langsung teroptimisasi *benar gak bahasa Indonesianya :D*.

Nah, kalau belum puas dengan set default seperti diatas, silahkan gunakan opsi-opsi dari optipng ini, untuk infonya bisa langsung cek di;

man optipng

atau

optipng –help

Selomat menikmati ūüôā

Tips Menggabungkan String dengan Karakter Tertentu Sebagai Pemisah/Separator di Query MySQL

Bagi teman-teman yang sudah sering mengerjakan aplikasi khususnya Sistem Informasi pasti sudah sangat sering bermain dengan fungsi-fungsi string, seperti halnya fungsi implode() di PHP yang digunakan untuk menggabungkan beberapa substring (dalam bentuk array) menjadi satu menggunakan karakter tertentu sebagai pemisahnya.

Pada beberapa kasus penggabungan string ini tidak bisa dilakukan di level bahasa pemrograman tetapi harus dilakukan atau jauh lebih efisien apabila diperoleh dari masukan hasil query-nya, seperti yang saya temukan pada pekerjaan terakhir saya menggunakan MySQL.

Dan ternyata setelah bertanya ke Om Google, tugas sebagai DBA/Dev sangat dipermudah dengan fungsi-fungsi yang telah disediakan oleh MySQL. Dua fungsi yang bisa digunakan disisi query adalah fungsi group_concat() dan concat_ws().

Tentang cara penggunaan dan letak perbedaan dari kedua fungsi diatas, lebih enak langsung kita coba dalam contoh sederhana;

Ok, pertama-tama kita buat table percobaan bernama ‘perusahaan’ dan kita isi data untuk latihan;

create table perusahaan (id int unsigned not null auto_increment primary key, perusahaan_id int unsigned not null default 0, jenis enum('Terbuka', 'Tertutup') not null, direktur varchar(25) not null default '', wakil_direktur_1 varchar(25) not null default '', wakil_direktur_2 varchar(25) not null default '', wakil_direktur_3 varchar(25) not null default '');

insert into perusahaan (perusahaan_id, jenis, direktur, wakil_direktur_1, wakil_direktur_2, wakil_direktur_3) values (1, 'Tertutup', 'Direktur AAA', 'Wakil 1 AAA', '', ''), (200, 'Terbuka', 'Direktur ZZZ', 'Wakil 1 ZZZ', '', 'Wakil 3 ZZZ'), (3, 'Tertutup', 'Direktur CCC', 'Wakil 1 CCC', 'Wakil 2 CCC', 'Wakil 3 CCC');

select * from perusahaan;
+----+---------------+----------+--------------+------------------+------------------+------------------+
| id | perusahaan_id | jenis    | direktur     | wakil_direktur_1 | wakil_direktur_2 | wakil_direktur_3 |
+----+---------------+----------+--------------+------------------+------------------+------------------+
|  1 |             1 | Tertutup | Direktur AAA | Wakil 1 AAA      |                  |                  |
|  2 |           200 | Terbuka  | Direktur ZZZ | Wakil 1 ZZZ      |                  | Wakil 3 ZZZ      |
|  3 |             3 | Tertutup | Direktur CCC | Wakil 1 CCC      | Wakil 2 CCC      | Wakil 3 CCC      |
+----+---------------+----------+--------------+------------------+------------------+------------------+

Maka table-nya menjadi sebagai berikut

Untuk menggabungkan beberapa row menjadi satu bagian kita menggunakan fungsi group_concat(), misal kita ingin mengelompokkan nama-nama direktur berdasarkan jenis perusahaannya, maka kita bisa menggunakan query;

 select jenis as 'Jenis', group_concat(direktur) as 'Nama-Nama Direktur' from perusahaan group by jenis;
+----------+---------------------------+
| Jenis    | Nama-Nama Direktur        |
+----------+---------------------------+
| Terbuka  | Direktur ZZZ              |
| Tertutup | Direktur AAA,Direktur CCC |
+----------+---------------------------+

Sedangkan untuk menggabungkan beberapa kolom dalam row yang sama, kita bisa menggunakan fungsi concat_ws(), misal disini kita akan menggabungkan Nama-nama anggota dewan direktur di setiap perusahaan, maka query-nya adalah;

 select perusahaan_id as 'Kode Perusahaan', concat_ws(',', direktur, wakil_direktur_1, wakil_direktur_2, wakil_direktur_3) as 'Jajaran Direktur' from perusahaan;
+-----------------+--------------------------------------------------+
| Kode Perusahaan | Jajaran Direktur                                 |
+-----------------+--------------------------------------------------+
|               1 | Direktur AAA,Wakil 1 AAA,,                       |
|             200 | Direktur ZZZ,Wakil 1 ZZZ,,Wakil 3 ZZZ            |
|               3 | Direktur CCC,Wakil 1 CCC,Wakil 2 CCC,Wakil 3 CCC |
+-----------------+--------------------------------------------------+

Pada kasus percobaan kita hasil diatas terlihat ada sedikita kesalahan dimana ternyata concat_ws() juga menganggap string kosong ada dan dipisahkan dengan koma, padahal kita ingin jika string kosong itu diabaikan, misal pada perusahaan dengan kode 200 disitu hasilnya “Direktur ZZZ,Wakil 1 ZZZ,,Wakil 3 ZZZ”. Maka disini query-nya tinggal kita modifikasi sedikit dengan fungsi if() untuk merubah string kosong menjadi NULL, sehingga menjadi;

 select perusahaan_id as 'Kode Perusahaan', concat_ws(',', if(direktur!='',direktur, NULL), if(wakil_direktur_1!='',wakil_direktur_1, NULL),if(wakil_direktur_2!='',wakil_direktur_2, NULL), if(wakil_direktur_3!='',wakil_direktur_3, NULL)) as 'Jajaran Direktur' from perusahaan;
+-----------------+--------------------------------------------------+
| Kode Perusahaan | Jajaran Direktur                                 |
+-----------------+--------------------------------------------------+
|               1 | Direktur AAA,Wakil 1 AAA                         |
|             200 | Direktur ZZZ,Wakil 1 ZZZ,Wakil 3 ZZZ             |
|               3 | Direktur CCC,Wakil 1 CCC,Wakil 2 CCC,Wakil 3 CCC |
+-----------------+--------------------------------------------------+

Nah mudah kan, tentang karakter separatornya bisa diganti-ganti sesuai dengan kebutuhan, caranya tinggal lihat aja di link dokumentasi diatas. ūüėÄ

Meld yang suka mencari-cari perbedaan

Pernah bingung mencari tahu perubahan apa saja yang sudah kita perbuat tanpa sadar dan tidak sadar pada file aplikasi semisal pada file sql, css, php, dll? Atau bahkan stress mau melacak update yang dilakukan pada aplikasi yang dilakukan oleh orang orang lain? Nah Bair cukup sering *emang ada yang nanya Bair?*

Berdasarkan pengalaman pahit itu :D, Bair mau sharing aplikasi yang namanya Meld. Penjelasan barbarnya, Meld ini adalah aplikasi GUI di keluarga Linux, FreeBSD dan Solaris yang fitur utamanya adalah membantu untuk membandingkan isi dari 2 atau 3 lebih file text dan juga folder.

Untuk gambaran tentang aplikasinya lebih enak langsung liat aja gambar, karena gambar kadang lebih mampu menjelaskan dari beribu ungkapan kata (alasan padahal lagi malas nulis panjang-panjang *emang ada apa, orang yang tahan baca tulisan Bair yang panjang dan abstrak itu? :D*).

Nah ini misalnya contoh hasil perbandingan isi dari file text, pada contoh dibawah, saya membandingkan antara 2 file css dari aplikasi web versi terbaru dengan versi sebelumnya;

File-Meld

Nyang ini contoh hasil perbandingan isi dari 2 atau 3 buah folder utama berisi file-file aplikasi berbasis web antara versi terbaru dengan versi sebelumnya;

Folder-Meld

Nah kalau kalian perhatikan disisi kanan dan kirinya itu ada bar yang merupakan info letak ditemukannya perbedaan. Silahkan di klik aja, kemudia diamati perbedannya, dan kalau memang ada yang perlu diedit bisa diedit langsung di Meld ini.

Hmm.. kalau mau tau lebih lengkap langsung install aja (di Ubuntu sih sudah ada di repository, jadi kalau reponya sudah benar bisa tinggal sudo apt-get install meld), dan coba-coba aja, pokoknya gampang dimengerti deh.

Selamet mencoba ūüôā

Tips mudah menyetel konfigurasi MySQL menggunakan MySQLTuner di Linux

Sering kita dengar ada yang mengeluhkan performa aplikasinya baik desktop maupun web, dan buru-buru menyalahkan database MySQL. Padahal diluar sana, banyak sekali contoh-contoh aplikasi/web yang data dan traffiknya jauh lebih dasyat dengan jutaan baris dalam tabel dan request gila-gilaan, terbukti tetap bisa terhandle dengan baik, contoh saja Facebook, Yahoo, Google (katanya sih pada Adsense, cmiiw), dan lain-lain. Oh ya, aplikasi tabulasi pemilu yang dikerjakan teman-teman SERIS juga menggunakan database MySQL ini.

Berbicara tentang performa, database setidaknya tergantung akan 3 hal, yaitu ketangguhan dari Mesin Server Database MySQL, code query/aplikasi dan settingan konfigurasi server.

Untuk mesin server sih tentu saja dilakukan dengan meningkatkan performa server baik melalui scale-in maupun scale-out, memilih OS serta environment yang tepat, dan lain-lain. Sedangkan untuk code dan query, kita bisa merapikan code kita agar tidak hanya efektif tapi juga harus efisien, hmm.. untuk tahap awal saya kira mengikuti 84 tips dari komunitas (MySQL Camp 2006) sudah sangat lumayan :D.

Nah sekarang Bair mau coba perlihatkan salah satu cara sederhana untuk membantu kita melakukan konfigurasi MySQL-nya di mesin Linux kita (my.cnf) menggunakan MySQLTuner (yang saya juga sebenarnya tahu dari web Ubuntu Geek :D).

Adapun langkah-langkahnya sebagai berikut;

1. Pertama-tama siapkan mesin dengan OS Linux dan MySQL -> Warning: Ini wajib, soalnya apa yang mau dites, kalau tidak ada hehehe..

Coba kita lihat kondisi komputer server abal-abalan Bair untuk coba-coba ini;

guyub@guyub:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=8.04
DISTRIB_CODENAME=hardy
DISTRIB_DESCRIPTION=”Ubuntu 8.04″

guyub@guyub:~$ cat /proc/cpuinfo |grep “processor\|model name”
processor    : 0
model name      : AMD Athlon(tm)

guyub@guyub:~$ cat /proc/meminfo |grep Mem
MemTotal:       515608 kB
MemFree:         28408 kB

guyub@guyub:~$ mysql –version
mysql  Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2

2. Setelah itu instal, MySQLTuner, di Ubuntu bisa

sudo aptitude install mysqltuner

atau download scriptnya

wget http://mysqltuner.com/mysqltuner.pl

3. Kemudian jalankan scriptnya di terminal dan lihat hasilnya;

guyub@guyub:~$ chmod +x mysqltuner.pl

guyub@guyub:~$ sudo ./mysqltuner.pl

>>  MySQLTuner 1.0.0 РMajor Hayden <major@mhtx.net>
>>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
>>¬† Run with ‘–help’ for additional options and output filtering
[!!] Successfully authenticated with no password – SECURITY RISK!

——– General Statistics ————————————————–
[–] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.51a-3ubuntu5.4
[OK] Operating on 32-bit architecture with less than 2GB RAM

——– Storage Engine Statistics ——————————————-
[–] Status: +Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[!!] InnoDB is enabled but isn’t being used
[OK] Total fragmented tables: 0

——– Performance Metrics ————————————————-
[–] Up for: 2751d 1h 54m 58s (972 q [0.000 qps], 12 conn, TX: 239K, RX: 38K)
[–] Reads / Writes: 100% / 0%
[–] Total buffers: 58.0M global + 2.6M per thread (100 max threads)
[OK] Maximum possible memory usage: 320.5M (63% of installed RAM)
[OK] Slow queries: 0% (0/972)
[OK] Highest usage of available connections: 2% (2/100)
[!!] Cannot calculate MyISAM index size – re-run script as root user
[!!] Query cache efficiency: 0.0% (0 cached / 7 selects)
[OK] Query cache prunes per day: 0
[OK] Temporary tables created on disk: 0% (0 on disk / 33 total)
[OK] Thread cache hit rate: 83% (2 created / 12 connections)
[!!] Table cache hit rate: 7% (64 open / 905 opened)
[OK] Open file limit used: 12% (124/1K)
[OK] Table locks acquired immediately: 100% (906 immediate / 906 locks)

——– Recommendations —————————————————–
General recommendations:
Add skip-innodb to MySQL configuration to disable InnoDB
Enable the slow query log to troubleshoot bad queries
Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
query_cache_limit (> 1M, or use smaller result sets)
table_cache (> 64)

4. Nah, selanjutnya terserah kita, mau rubah settingan my.cnf sesuai dengan yang direkomendasikan (lihat bagian Recommendations), atau tidak, atau bisa juga mencari second, third ..  opinion dulu :D.

Tips Sederhana Cara Replace String Pada Banyak File Text Sekaligus di Linux- Bagian II

Lanjutan dari tips replace string di linux bagian seblumnya (ya iyyalah, masa’ bagian sesudahnya). Kali ini untuk kasus harus melakukan penelusuran dan penggantian sampai ke semua subfolder di dalamnya.

Sebagai pembuka saya ingin membatalkan anjuran untuk menggunakan RPL, soalnya gak tau kenapa kalau jumlah file yang diganti banyak selalu error dan pesan terakhir cuman killed, padahal sebelumnya di pencarian bertingkat yang filenya sedikit lancar-lancar aja (kemungkinan komputer Bair yang jangkrik :P).

Akhirnya harus mikir dan pakai gabungan sed dan find. Berikut command alakadarnya (yg penting berhasil :p) ;

find /lokasi/folder/induk/ -name *filter-nama-file* -type f -print0 | xargs -0 -n 1 sed -i -e ‘s/StringYangDiganti/StringPengganti/g’

Untuk memperjelas, kita coba contoh kasus: Misalnya kita harus me-replace semua file .php yang jumlahnya ribuan dan berada di dalam folder, subfolder-subfolder dan subsubfolder-subsubfolder web dengan lokasi /home/bair/test/web. String yang ingin  diganti adalah localhost/web/ menjadi  $hostname, maka di terminal tinggal jalankan perintah;

find /home/bair/test/web/ -name *.php* -type f -print0 | xargs -0 -n 1 sed -i -e ‘s/localhost\/web\//$hostname\//g’

Ya sudah tinggal tekan ENTER dan selesai :D.

Keterangan: untuk beberapa karakter yang ingin diganti semisal; baris baru (orang sering bilang enter :D), slash atau garis miring (/), dll, harus didahului dengan backslash (\).

Selamat mencoba.

THE END ūüėÄ

Tips Sederhana Cara Replace String Pada Banyak File Text Sekaligus di Linux- Bagian I

Bair yakin semua sudah sangat terbiasa melakukan Replace ini, khususnya untuk yang hobi Copy Paste tugas dan laporan teman, cukup replace beberapa tulisan saja *terutama nama dan nomor mahasiswa*, maka taddaa.. sebuah tugas bisa terselesaikan heheh :p.

Tapi ada kalanya di beberapa pekerjaan kita harus melakukan “replace” string yang sama pada beberapa file sekaligus. Hmm.. pengalaman saya yang menggunakan Geany untuk melakukan coding sederhana semisal untuk web development, sangatlah dimudahkan dengan fasilitas Replace In Session yang ada di Geany.

Caranya sangat mudah, tinggal buka beberapa file web yang ingin ikut di replace, setelah itu masuk ke menu Search > Replace (atau bisa juga dengan Ctrl+H), isi form “Search For” dengan string yang ingin diganti¬† dan “Replace With” dengan string pengganti, kemudian pilih button “In Session”, maka semua file yang sedang dibuka di Geany akan ikut di-replace.

Jendela Replace di Geany

Jendela Replace di Geany

Akan tetapi untuk cara ini masih enak kalau filenya masih sedikit, nah.. kalau sudah puluhan bahkan ratusan file malas dan berat juga di komputer untuk buka semua file di Geany.

Tapi jangan khawatir dan jangan bersedih :D, Bair juga selalu mencari dan membagi cara paling efisien (baca cari gampangnya,  sama seperti cara melakukan resize gambar berjamaah pada posting sebelumnya), salah satunya adalah dengan memanfaatkan perintah sed di terminal (ya.. Anda tidak salah baca.. t-e-r-m-i-n-a-l.. gak usah senang gitu dong :D).

Misalnya jika dalam satu folder ada ratusan dan beragam jenis file, yang diantaranya adalah file-file .php yang ingin isinya ingin kita replace, dari “foter” menjadi “footer” untuk semua file .php tersebut, maka di terminal kita tinggal masukkan perintah

sed -i ‘s/foter/footer/g’ /folder/lokasi/*.php

Untuk lebih jelasnya coba lihat info sed, dengan man sed atau sed –help.

Tapi belum selesai, masalahnya perintah diatas itu hanya melakukan pencarian dan penggantian pada folder tersebut saja, tidak kedalam subfolder-subfoldernya.

Jika memang harus melakukan penelusurannya sampai ke semua subfolder didalamnya silahkan kombinasikan perintah sed tersebut dengan find (sepertinya sih, soalnya belum coba juga :D). Atau kalau Bair yang pemalas sih selama ini langsung saja download, instal dan gunakan RPL.

Tentang RPL, akan Bair lanjutkan di Bagian II, biar gak kepanjangan :), dan biar keren gitu, ada  TO BE CONTINUED-nya. Oh dan jangan khawatir, RPL juga pakai terminal kok :).

TO BE CONTINUED…