Arsip Tag: bash

Pemrograman Qt 9 – QProcess dan Menjalankan Perintah Linux


Bismillahirrahmanirrahim.

qt-creator-logoKita bisa mengomando Linux melalui GUI. Bagaimana caranya? Ada banyak cara. Lihat dulu contoh semisal Ubuntu Tweak. Aplikasi tersebut menggantikan ratusan perintah Terminal dengan beberapa tombol saja. Jika Anda menekan satu tombol di Ubuntu Tweak, maka itu berarti menjalankan perintah tertentu. Konsep ini (GUI front-end) sangat berguna jika kita ingin membuat aplikasi yang melakukan otomatisasi perintah Terminal yang biasa kita kerjakan. Misalnya kita ingin mengganti alamat sumber repositori Ubuntu. Apa yang kita lakukan? Ubah sources.list secara manual, ketik sendiri alamat-alamat yang banyak itu dari hafalan Anda, lakukan update. Hal yang seperti ini bisa dibuatkan GUI supaya otomatis dengan menyimpan alamat-alamat sumber repositori lalu menambahkan tombol untuk masing-masing repositori. Jadi, cukup satu klik untuk mengganti repositori kita ke server Kambing atau UGM atau yang lain. Ini contoh saja. Sekarang kita akan membuat yang lebih sederhana dari itu. Kita akan memakai QProcess (sebagai ganti method system() kemarin) untuk menjalankan perintah Linux lebih canggih lagi di dalam Qt. Mengapa kita beralih ke QProcess? Nanti kita akan tahu, insya Allah.

Spesifikasi Sistem

  1. Ubuntu 12.04
  2. Qt Creator 2.4.1
  3. Qt 4.8.0 (32 bit)

Daftar Kelas

  1. QProcess
  2. QStringList
  3. QByteArray

Daftar Method

  • start() milik QProcess.
  • waitForFinished() milik QProcess.
  • readAll() milik QProcess.
  • printf() method standar iostream dari C++.

Arah Tulisan Ini

Saya hanya ingin menunjukkan bagaimana aplikasi Qt bisa dibuat seperti contoh di atas, seperti Ubuntu Tweak yang satu tombolnya menggerakkan beberapa perintah Terminal. Dan saya bilang kali ini lebih canggih karena kita bisa menangkap keluaran dari perintah yang dijalankan. Ini penting untuk mewujudkan aplikasi-aplikasi yang dapat mengeksekusi perintah Terminal, menangkap keluarannya, memroses keluaran tersebut, lalu membuat keluaran baru. Contoh nyatanya adalah aplikasi pengganti sources.list otomatis pada paragraf pertama di atas.

Kode

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog();
    QVBoxLayout *layout;
    QPushButton *tombola;
    QPushButton *tombolb;
    QPushButton *tombolc;

public slots:
    void perintah_cat();
    void perintah_mkdir();
    void perintah_ls();

private:

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include <iostream>
#include <QtGui>
#include <mainwindow.h>

Dialog::Dialog()   //kagak usah dikasih void
{
    layout  = new QVBoxLayout;
    tombola = new QPushButton("cat");
    tombolb = new QPushButton("mkdir");
    tombolc = new QPushButton("ls");

    tombola->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    tombolb->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    tombolc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    tombola->setMinimumSize(88,55);
    tombolb->setMinimumSize(88,55);
    tombolc->setMinimumSize(88,55);

    layout->addWidget(tombola);
    layout->addWidget(tombolb);
    layout->addWidget(tombolc);

    setLayout(layout);

    connect(tombola, SIGNAL(clicked()), this, SLOT(perintah_cat()));
    connect(tombolb, SIGNAL(clicked()), this, SLOT(perintah_mkdir()));
    connect(tombolc, SIGNAL(clicked()), this, SLOT(perintah_ls()));
}

void Dialog::perintah_cat()
{
    QProcess *cat = new QProcess;
    cat->start("/bin/bash -c \"rm isifolder.txt\"");
}

void Dialog::perintah_mkdir()
{
    QProcess sh;
    sh.start("sh", QStringList() << "-c" << "ifconfig | grep inet");

    sh.waitForFinished(-1);
    QByteArray output = sh.readAll();
    printf(output);
}

void Dialog::perintah_ls()
{
    QStringList options;
    options << "-c" << "ls -l | grep a | sort > isifolder.txt";

    QProcess process;
    process.start("/bin/sh", options);
    process.waitForFinished(-1);
}

Qt Creator dan Kode

ngite-kesembilan8

Panel sebelah kiri berisi mainwindow.cpp dan sebelah kanan mainwindow.h.

Hasil Kode

Tampilan program kali ini sama dengan sebelumnya. Bedanya, isi perintah untuk masing-masing tombol saya ubah. Saya akan jelaskan satu per satu hasil perintah mulai dari tombol ketiga.

Tombol ls

Isi tombol ls adalah perintah untuk mendaftar isi folder tempat si program berada, menyaring supaya hanya informasi yang memiliki huruf a saja yang ditampilkan, lalu menuliskannya ke sebuah berkas teks bernama isifolder.txt.

ngite-kesembilan1 ngite-kesembilan2

Jika tombol ls ditekan, maka perintah ls -l | grep -a > isifolder.txt dijalankan. Maka jadilah satu berkas teks bernama isifolder.txt.

ngite-kesembilan3

Demikian isi dari berkas isifolder.txt.

ngite-kesembilan9

Demikian keluaran (standard output) dari perintah yang sama tetapi dijalankan dari Terminal. Sama persis dengan isi teks. Ini berarti program valid.

Tombol mkdir

Isi tombol mkdir adalah perintah untuk mengeluarkan informasi jaringan pada baris yang memiliki teks inet saja (membuang semua baris yang lain) dan informasi itu dicetak di dalam Terminal saja. Perintahnya adalah ifconfig | grep inet.

ngite-kesembilan6

Keluaran (standard output) hanya muncul setelah program ditutup.

ngite-kesembilan7

Sama keluarannya (standard output di Terminal asli dengan Terminal di Qt Creator). Valid.

Tombol cat

Isi tombol cat adalah perintah untuk menghapus berkas isifolder.txt yang sudah ada. Karena inilah saya jelaskan dari bawah ke atas.

Pembahasan

mainwindow.h

Sama seperti tulisan sebelumnya. Jika Anda belum mengerti model deklarasi dalam header ini, silakan merujuk ke sini.

mainwindow.cpp

Pada berkas .cpp proyek ini, ada 3 fungsi buatan yang perlu diperhatikan karena inilah inti program. Kita punya 3 model eksekusi perintah Terminal di Qt, setidaknya dalam program ini. Jika Anda belum mengerti bagaimana membangun elemen-elemen GUI dengan Qt, silakan merujuk ke sini.

  • Model Eksekusi Perintah Pertama
QProcess *cat = new QProcess;
cat->start("/bin/bash -c \"rm isifolder.txt\"");

Kita membuat sebuah objek bernama cat (dari nama cat (concatenate) bukan kucing) dari kelas QProcess. Lalu, dengan objek ini, kita panggil fungsi start(). Di dalam start() ini kita masukkan string yang merupakan perintah Terminal. Perhatikanlah, kita tidak langsung menulis perintah rm isifolder.txt seperti biasa dilakukan di Terminal. Kita mesti mengawali string perintah dengan /bin/bash. Lalu gunakanlah argumen -c (artinya membaca perintah bash dari string) milik /bin/bash tersebut. Lalu barulah kita tuliskan perintah yang ingin dilakukan. Perhatikan, ada sedikit perbedaan. Di sini, ada escape character \” yakni membuat yang diapit keduanya sebagai string. Ya, argumen -c itu tadi sebabnya. Kita memasukkan string ke dalam bash tetapi ia sanggup menerimanya sebagai perintah karena argumen -c. Yang paling penting, inilah model paling ringkas menggunakan QProcess untuk mengeksekusi perintah Terminal.

  • Model Eksekusi Perintah Kedua
QProcess sh;
sh.start("sh", QStringList() << "-c" << "ifconfig | grep inet");

sh.waitForFinished(-1);
QByteArray output = sh.readAll();
printf(output);

Inti dari model kedua ini adalah pemanfaatan method start() milik QProcess yang memiliki bentuk umum: start(command, argument);. Perintah kita taruh di command, argumen kita taruh di argument. Sekadar catatan, rm -rf ubuntu.png berarti rm itu perintah sedangkan -rf ubuntu.png itu argumen. Di sini, perintah yang digunakan adalah sh (pasti ada di /bin/ Anda) sedangkan argumen yang digunakan adalah -c dan ifconfig | grep inet. Istimewanya, di sini penggunaannya tidak sesederhana itu. Kita menggunakan kelas tambahan bernama QStringList di dalam argumen start(). QStringList ini adalah kelas yang bisa menampung beberapa string sekaligus. Oleh karena itu, ia dipakai untuk menampung string yang berisi argumen-argumen perintah. Ia sangat praktis, maka ia sering digunakan. Di sini, QStringList dipakai dengan deklarasi langsung QStringList() << “-c” << “ifconfig | grep inet”. Terlihat aneh, terlihat tidak biasa. Namun ini gunanya supaya kita tidak usah membuat satu objek baru.

Teristimewa untuk QByteArray output = sh.readAll(), ini maksudnya memanggil method readAll() milik objek QProcess, yang menghasilkan keluaran dari perintah yang dijalankan oleh QProcess, lalu keluaran itu disimpan pada objek output yang dibuat dari kelas QByteArray. Pendek kata, baris deklarasi ini mengambil standard output dari perintah di dalam objek QProcess. Oleh karena itu, ia akan mengeluarkan output dari perintah ifconfig | grep inet ke Terminal di dalam Qt Creator. Apakah ini tidak penting? Tidak, justru ini (standard output dan standard error) penting sekali untuk membangun aplikasi sebagaimana ditulis di paragraf pertama tulisan ini.

  • Model Eksekusi Perintah Ketiga
QStringList options;
options << "-c" << "ls -l | grep a | sort > isifolder.txt";

QProcess process;
process.start("/bin/sh", options);
process.waitForFinished(-1);

Model ketiga ini adalah yang paling mudah dipahami. Pertama-tama kita membuat objek QStringList dahulu yang menampung seluruh argumen yang dibutuhkan. Objek ini bernama options. Lalu kita buat objek QProcess yang menampung perintah /bin/sh (bisa diganti /bin/bash atau /bin/zsh jika Anda punya zsh). Objek ini bernama process. Lalu, kita panggil start(“/bin/sh”, options); untuk process. Maka jadilah program seperti yang saya tampilkan di bagian Hasil Kode di atas.

Inti dari ketiga jenis eksekusi perintah Terminal dari dalam Qt di atas adalah pemakaian kelas QProcess. Ada beberapa hal penting yang patut diperhatikan:

  1. Kita bisa menggunakan pipeline (|) dan redirection (>, <, >>, <<) setelah mereka dimasukkan sebagai string sekaligus argumen pada QProcess. Pipeline dan redirection adalah the ultimate power di sistem operasi Linux.
  2. Tidak seperti biasanya, di sini, yang disebut command itu malah /bin/bash (shell) kita bukan langsung pada command yang biasa kita ketik di Terminal. Justru command yang biasa kita pakai itu menjadi argument di sini.
  3. Adanya method waitForFinished(-1) di sini. Arti nilai -1 ini adalah menunggu sampai objek QProcess selesai mengerjakan tugasnya. Tanpa method ini, program tidak berjalan semestinya.
  4. Seluruh kode yang ada di sini adalah dasar kita untuk membuat aplikasi yang selain mampu mengeksekusi perintah Terminal, juga mampu membaca keluaran dari perintah yang dieksekusi bahkan mampu memrosesnya.

Unduh Kode Sumber

Program kali ini bernama Embrio-Metamorfosa juga. Saya menggunakan Git jadi tidak khawatir kode rusak. Silakan unduh dan buka di Qt Creator Anda.

Tautan: http://otodidak.freeserver.me/tarball/Embrio-Metamorfosa_Edisi_2.tar.gz
Ukuran: 3 KB

Kesimpulan

  • Eksekusi perintah Linux dengan Qt bisa dilakukan dengan QProcess selain dengan method system().
  • QProcess bisa dimanfaatkan untuk membaca standard output dan standard error dari segala perintah Linux.
  • Ada beberapa model eksekusi perintah Linux di dalam Qt tetapi seluruhnya tidak keluar dari bentuk umum qprocess.start(command, argument).
  • Kita beralih ke QProcess karena ia praktis dan memiliki semua perlengkapan untuk memanggil perintah Linux serta membaca dan mengolah standard output-nya.
  • Inti dari semua ini adalah pembuatan sebuah proses baru lalu proses itu memanggil perintah Linux.

Rujukan

Catatan Ngoprek Harian Edisi 1


Bismillahirrahmanirrahim.

Ngoprek adalah bahasa slang untuk mengekspresikan tindakan mengatasi keterbatasan baik secara hardware maupun software dalam lingkup ilmu komputer. Sementara itu definisi saya. Tulisan ini tujuannya agar saya tidak membuang oprekan yang saya lakukan, sebagai rujukan jika qadarullah ada yang membutuhkan, dan sebagai bahan untuk posting blog saya. Saya ingin ini jadi catatan yang panjang dan menambah jumlah tutorial Linux berbahasa Indonesia. Semoga bermanfaat dan menginspirasi Anda untuk membuat catatan serupa.

1. Mengambil skrinsot dari lingkungan CLI murni

Tanpa X, tentu saya tidak bisa menjalankan Shutter atau KSnapshot atau GNOME Screenshot di Linux. Lalu bagaimana jika saya saat ini berada di tty1 yang notabene berada “di luar” X? Atau kalau X tidak ada sama sekali? Jawabannya mudah sekali. Instal saja program bernama fbcat. Perintahnya:

fbcat > gambar_tty.ppm

Skrinsot:

Format PPM ini walaupun berisi gambar piksel hitam putih, ukurannya besar sekali. Punya saya jadi 3 MB. Setelah dikonversi ke JPEG, jadi 42 KB.

2. Vim punya dua mode
Baru-baru ini saya terkesan sekali dengan Vim (text editor paling jos kata para hacker). Gara-gara pernyataan Pak Engkur (Kurniadi) di kanal #ubuntu-indonesia:

[17:38:08] <engkur> coba maenan consol text terus deh, pasti setuju pake vim lebih enak

Ternyata Vim betul-betul jos. Keren, andai Anda tahu. Oke, mulai. Vim atau vi itu, punya 2 modus. Yakni modus insert dan modus command. Pantas saja saya kesusahan pakai Vim lha wong saya tidak tahu adanya 2 modus ini. Vim itu tidak seperti Notepad, ia dibuat untuk penggunaan di lingkungan CLI murni. Jadi yang namanya shortcut key adalah segala-galanya di Vim. Bahkan arrow key saja tidak jalan sebagaimana di Notepad kalau pakai Vim. Shortcut key dilakukan hanya ketika Vim ada pada command mode, sedangkan memasukkan tulisan dilakukan hanya ketika Vim ada pada insert mode.

  • Command mode: tekan ‘Esc’, lalu langsung masukkan perintah
  • Insert mode: tekan ‘i’

Skrinsot:


Contoh perintah Vim: ‘:w’ untuk menyimpan (setara Ctrl+S) ‘:q’ untuk keluar (setara Ctrl+Q); Jangan masukkan tulisan apa pun ketika berada dalam modus command.

3. Vim rakus shortcut key
Masuklah dalam command mode, lalu ketik ini:

:w teks_dari_vim.txt

maka nanti tercipta sebuah berkas teks pada direktori tempat Vim dijalankan. Lihat gambar ini:

Perintah lainnya sangat banyak. Saya baru tahu perintah ini:

:h

Hasilnya adalah membuka Help milik Vim. Ini gambarnya:


Ingat, segala perintah Vim diawali dengan titik dua (:). Inilah yang membuat saya lama kebingungan dengan Vim. Selama ini saya tidak tahu kalau perintah Vim diawali dengan titik dua.

4. Vim dan HJKL sebagai panah
Ketika ada dalam modus command, HL itu untuk kiri-kanan, sedangkan JK untuk atas-bawah untuk kursor. Vim tidak menerima panah kiri-bawah-kanan-atas sebagai masukan pengatur posisi kursor.

5. ddrescue sebagai ganti dd untuk bakar ISO ke USB Flash Disk
Saya beberapa kali menggunakan dd untuk membuat liveusb untuk Linux. Namun yang saya sayangkan, tidak interaktif dia. Tidak ada progress bar ataupun sekadar keterangan sampai mana nge-burn-nya. Namun baru malam ini saya tahu ddrescue (dari akang @Yudha Priyana Hardjo) yang fungsinya serupa dd tetapi interaktif ada keterangan burning-nya cukup lengkap. Lagian, ddrescue ini sangat jauh lebih cepat daripada dd. Dan tidak mengakibatkan hang sebagaimana dd. Saya pakai ddrescue ini gara-gara saya gagal terus membuat liveusb untuk openSUSE. Walau akhirnya ddrescue ini gagal juga, sudahlah saya tulis saja sebagai hasil ngoprek.

$ ddrescue -fv openSUSE-12.3-KDE-Live-i686.iso /dev/sdc1 

Dengan bentuk umum:

$ ddrescue -fv $/path/iso/anda.iso $/path/flash/disk/anda

Cara mengetahui letak flash disk:

# fdisk -l

Catatan penting: jangan ddrescue kepada flash disk yang menancap di USB 3. Itu mengakibatkan hang Ubuntu seperti dd. Walau hang-nya tidak separah dd ketika membakar ke USB 3, tetapi sedikit mengganggu.

6. apt-get untuk trik praktis instalasi aplikasi Ubuntu offline
Mudah saja teorinya. Paksa apt-get untuk mengeluarkan lengkap daftar dependensi untuk suatu paket. Ambil daftar itu pakai grep dan cut, pasti jadi URL-URL. Lalu masukkan itu ke dalam berkas teks. Pergi ke warnet dan unduhlah semuanya pakai download manager (IDM atau uGet biar bisa semua dalam sekali klik). Perintahnya:

sudo apt-get –print-uris –yes install codeblocks | grep ^\’ | cut -d\’ -f2 > daftar_dependensi_codeblocks.txt

 

Jika sudah punya daftar_dependensi_codeblocks.txt, pergi ke warnet dan unduh semuanya. Masukkan semua .deb yang diperoleh ke dalam satu folder bernama codeblocks_Precise. Bawa pulang folder itu lalu pindahkan folder ke /home dan laksanakan perintah ini dalam folder itu:

sudo dpkg -i *.deb

atau pakai singkatan saya (buat alias dalam berkas .bashrc):

sdia

Maka aplikasi IDE canggih bernama Codeblocks terinstal dengan sempurna di Ubuntu saya dan installer-nya (folder codeblocks_Precise/) saya simpan untuk instalasi di komputer teman-teman atau instalasi di masa mendatang.

Catatan penting: Ganti nama codeblocks dengan nama paket yang dibutuhkan serta ganti Precise dengan nama versi Ubuntu.

Catatan penting 2: perhatikan /var/lib/dpkg/status karena ini sangat krusial dan bisa beda walau sama-sama Precise tapi lain komputer. Sebaiknya status milik kedua Precise di kedua komputer adalah sama agar dependensinya juga sama. Namun error dalam hal ini sangat jarang terjadi.

7. Cek versi kernel (bash)
Ternyata uname -a terlalu lengkap. Untuk spesifik langsung versi kernel, perintahnya uname -r.

8. Cek kondisi jaringan (bash)
Ternyata ada tool yang sangat bagus bernama nm-tool. Langsung terlihat kita pakai saluran mana untuk internetan. Modem saya terdeteksi berada pada ttyUSB0. Otomatis deteksi IP address kita dan IP address DNS yang kita pakai. Mudah.

9. Bagaimana cara membuat patch (edisi 1)?
Dengan diff dan patch. Dua alat ini tersedia di semua distro Linux dan sudah menjadi standar FOSS untuk membuat dan menerapkan patch. Dua alat ini hanya berlaku untuk membuat patch kode sumber, bukan biner.

Diff khusus untuk membuat patch (patch = versibaru – versi lama) sedangkan patch khusus untuk menerapkan patch (versibaru = versilama + patch). Bersambung…

10. Bagaimana cara membuat patch (edisi 2)?
Dengan bsdiff dan bspatch. Dua alat ini juga tersedia di semua distro Linux dan bisa dipakai khusus patching berkas biner.

Bsdiff khusus untuk membuat patch (patchbiner = versibarubiner – versilamabiner) sedangkan bspacth khusus untuk menerapkan patch (versibarubiner = versilamabiner + patchbiner). Bersambung…

11. OpenSUSE Live USB dengan dd
Sudah beberapa hari gagal memakai Unetbootindd, dan ddrescue. Kini saya berhasil masuk livesession openSUSE dengan perintah dd berikut:

dd if=openSUSE-12.3-KDE-Live-i686.iso of=/dev/sdb bs=4M; sync

Sedangkan perintah saya yang salah (dan membuat gagal berulang kali):
dd if=openSUSE-12.3-KDE-Live-i686.iso of=/dev/sdb1 bs=4M; sync

Perhatikan angka 1 (satu), jangan pernah dipakai kalau mau membakar ISO ke flash disk. Memang dd ini tidaklah interaktif, akan tetapi setidaknya berhasil membuat openSUSE Live USB yang dikatakan di forum openSUSE maupun Linuxquestion sendiri sebagai kemustahilan.

Skrinsot openSUSE sebagai buktinya:

12. Atur nomor IP secara manual
Seringkali justru lebih mudah mengubah nomor IP komputer kita secara manual. Caranya:

sudo ifconfig eth0 192.168.1.9

Ganti eth0 dengan wlan jika ingin mengubah nomor IP pada interface wlan. Sesuaikan interface.

13. Prinsip dasar instalasi aplikasi di Linux
Tahu syarat: harus ada 3 hal terpenting yaitu eksekutabel biner, shell script, dan berkas .desktop. Inilah kebutuhan paling minimum. Hanya dengan ini kita bisa menginstal aplikasi buatan kita tanpa memaketkannya ke DEB/RPM terlebih dahulu. Dan tidak usah susah-susah.

Tahu tempat/usr/bin/usr/lib, dan /usr/share/applications yang secara berurutan untuk shell script, eksekutabel biner, dan berkas .desktop. Mungkin aneh, kok malah biner ditaruh di lib bukan di bin? Namun ini sangat logis pada penjelasan berikut.

Tahu gunanya: eksekutabel biner adalah berkas paling penting yang semestinya seluruh berkas lain tidak dibutuhkan. Jika suatu berkas biner diletakkan di /usr/bin, maka otomatis saat itu juga jika namanya dipanggil dari shell, maka ia dieksekusi. Seperti inilah caranya semua program di Linux diinstal sebenarnya. Lihatlah bahwa di dalam /usr/bin ada ls, cd, cp, mv, dan semua program.

Shell script di sini adalah seperti shortcut di Windows. Ia berisi perintah untuk memanggil eksekutabel biner yang asli. Ia harus diberi hak eksekusi (chmod +x) sebelum digunakan. Ia kurang lebih seperti ini untuk memanggil program bernama metamorfosa:

#!/bin/bash
/usr/lib/metamorfosa

Sampai sini jelas bahwa justru shell script (bukan program aslinya) yang berada di /usr/bin. Program asli malah berada di /usr/lib yang dipanggil lewat jalan shell script dari /usr/bin. Di dalam /usr/bin justru tidak ada eksekutabel yang asli. Adanya cuma shell script. Dan sesungguhnya shell script-lah yang kita panggil ketika menggunakan perintah cp, ls, nmap, mv, mkdir, dan semuanya di Linux. Baru setelah shell script ini dipanggil, ia akan memanggil program aslinya. Keuntungan prinsip ini adalah sangat mudah untuk memanggil program apa pun dari dalam folder mana pun asal pakai terminal. Bahkan bisa autocomplete nama program KARENA program tersebut ada di /usr/bin. Walaupun tanpa restart, bash bisa mengenali namanya otomatis dan menyediakan autocomplete.

14. Menginstal modem CE682 di Precise Pangolin
Pertama: # modprobe
Kedua: # wvdialconf
Kaidah: jangan dibalik

15. Menghapus di Vim (26 September 2013)
x           menghapus satu karakter setelah kursor
X           menghapus satu karakter sebelum kursor
dd          menghapus satu baris
3dd         menghapus tiga baris ke bawah
5dd          menghapus lima baris ke bawah

Tentu saja semuanya dilakukan dalam modus command, bukan dalam modus insert.

________

Tulisan ini aslinya adalah catatan di akun fesbuk saya yang memang saya buat untuk mengumpulkan pecahan-pecahan oprekan yang tujuan akhirnya adalah posting di blog ini. 

Pemrograman Qt 7 – Menjalankan Perintah Linux dari GUI C++ dengan Mudah Menggunakan system()


Bismillahirrahmanirrahim.

Sudah lama saya nantikan untuk membuat GUI dari perintah-perintah Terminal. Banyak sekali perintah Terminal atau kombinasi dari perintah + aplikasi lain yang lebih pantas kalau dibuatkan GUI. Apa saja? Lihat apt-id dan alldeb milik nif dari FUI. Ini aplikasi untuk backup aplikasi satu per satu dan backup-nya bisa diinstal di Ubuntu yang lain. Sangat pantas kalau dibuatkan GUI. Hanya itu? Tidak. Satu pintu ini (yakni memanggil perintah bash Linux dari dalam C++) kalau sudah terbuka, maka akan jadi sangat-sangat lebar lowongan untuk membuat aplikasi GUI dari aplikasi CLI yang sudah ada. Dalam posting 7 ini, saya hanya akan mencontohkan satu aplikasi GUI dengan 3 tombol. Setiap tombol jika diklik maka memanggil perintah “echo ‘metamorfosa’ > metamorfosa.txt“, “ls -l > metamorfosa-ls.txt“, dan “mkdir metamorfosa“. Ingat, sekali pintu ini terbuka, seluruh perintah terminal dapat dipanggil dari dalam program C++ kita. Dan tentulah bisa dipanggil hanya dengan tombol. Ini insya Allah bentuk realisasi dari posting saya sebelunya: https://malsasa.wordpress.com/2013/04/13/linux-desktop-masih-kurang-user-friendly/. Sungguh, saya jamin pembuatan program ini (yang sudah 1 tahun lebih saya cari caranya) adalah sangat mudah. Ternyata oh ternyata.

Wujud Program yang Diinginkan

ngite-ketujuh25

Kode

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog();
    QVBoxLayout     *layoututama;
    QPushButton     *tombolsatu;
    QPushButton     *tomboldua;
    QPushButton     *tomboltiga;
    QLabel          *label;

public slots:
    void echo_metamorfosa();
    void ls_metamorfosa();
    void mkdir_metamorfosa();

private:

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

Dialog::Dialog()
{
    layoututama     =   new QVBoxLayout;
    tombolsatu      =   new QPushButton("cat > metamorfosa.txt");
    tomboldua       =   new QPushButton("ls -l > metamorfosa_ls.txt");
    tomboltiga      =   new QPushButton("mkdir metamorfosa");
    label           =   new QLabel;

    tombolsatu->setFixedSize(188,55);
    tomboldua->setFixedSize(188,55);
    tomboltiga->setFixedSize(188,55);
    layoututama->addWidget(tombolsatu);
    layoututama->addWidget(tomboldua);
    layoututama->addWidget(tomboltiga);
    layoututama->addWidget(label);
    setLayout(layoututama);

    connect(tombolsatu, SIGNAL(clicked()), this, SLOT(echo_metamorfosa()));
    connect(tomboldua, SIGNAL(clicked()), this, SLOT(ls_metamorfosa()));
    connect(tomboltiga, SIGNAL(clicked()), this, SLOT(mkdir_metamorfosa()));
}

void Dialog::echo_metamorfosa()
{
    system("echo 'metamorfosa' > metamorfosa.txt");
}

void Dialog::ls_metamorfosa()
{
    system("ls -l > metamorfosa_ls.txt");
}

void Dialog::mkdir_metamorfosa()
{
    system("mkdir metamorfosa");
}

Pembahasan

Bagian paling penting yang menjadikan sebuah C++ bisa memanggil perintah terminal adalah kode

system("echo 'metamorfosa' > metamorfosa.txt");
system("ls -l > metamorfosa_ls.txt");
system("mkdir metamorfosa");

Di dalam parameter, kita menuliskan string yang isinya perintah bash (Terminal) kita. Amat sangat mudah, bukan? Kalau sudah bisa ini, kita gabungkan dengan tutorial 5 kemarin sehingga perintah tersebut berada dalam tombol. Jadi kalau tombol diklik, perintah itu jalan. Sangat mudah, bukan?

Hasil Tombol Pertama

Tombol cat > metamorfosa.txt akan menciptakan sebuah berkas metamorfosa.txt yang isinya tulisan metamorfosa. Sebelumnya saya minta maaf karena ada perbedaan. Tombol bertuliskan cat > metamorfosa tetapi perintahnya di dalamnya malah echo ‘metamorfosa’ > metamorfosa.txt. Yah, yang penting intinya bikin berkas teks yang isinya tulisan metamorfosa-lah. Jika belum mengerti perintah-perintah bash yang saya pakai dalam program ini, silakan merujuk ke Tutorial Shell Dasar 5 Menit.

ngite-ketujuh20bIsinya metamorfosa.txt ketika dibuka dengan Kate:

ngite-ketujuh24

Kesimpulan tombol pertama: perintah bash sukses dieksekusi dari satu klik GUI.

Hasil Tombol Kedua

ngite-ketujuh21b

Ini isi dari berkas metamorfosa_ls.txt setelah dibuka dengan Kate:resized_ngite-ketujuh23

Hasil Tombol Ketiga

Ini hasil dari tombol ketiga yaitu mkdir metamorfosa:

ngite-ketujuh22bHasilnya? Tentu saja membuat folder yang bernama metamorfosa.

Perbandingan dengan C/C++ Tanpa Qt

Tentu sebelum saya menyentuh Qt, saya tes dulu Rujukan 1 dengan C murni. Saya ketik dengan nano lalu saya kompilasi dengan gcc (yang C++ tentu saya kompilasi dengan g++). Saya jalankan dan alhamdulillah, bisa! Perintah yang saya sertakan dalam program itu benar-benar dipanggil dan jalan. Ini buktinya.

Kode C

ngite-ketujuh33

Perhatikan, cuma perintah echo dan pwd yang dipanggil.

Hasil Kompilasi

ngite-ketujuh34

Dan benarlah bahwa echo dan pwd itu berjalan sebagaimana mereka jalan di Terminal. Alhamdulillah.

Unduh Kode Sumber

Program Qt kali ini bernama Embrio-Metamorfosa.

Tautan: http://www.mediafire.com/download/guqrb3blh5tosuz/Embrio-Metamorfosa.tar.gz (3 KB)

Kode sumber C dan C++ untuk program CLI saya juga sertakan. Di dalamnya sudah ada petunjuk kompilasi.

Tautan: http://www.mediafire.com/download/tk0tzbl889o7v29/Embrio-Metamorfosa_Murni_C-C%2B.tar.gz (3 KB)

Kesimpulan

  1. Seluruh perintah Terminal (bash) bisa dipanggil dari GUI alias bisa dibuatkan GUI-nya melalui C++ dengan fungsi system().
  2. Saya ada kesempatan untuk membuat GUI untuk repository changer bagi Ubuntu dan IGOS Nusantara.
  3. Saya ada kesempatan untuk membuat GUI untuk alldeb dan apt-id ( salah satu inovasi terbaik yang pernah saya lihat dari hacker Indonesia)
  4. Saya bisa membuat GUI untuk perintah Terminal apa pun walau lebih dari satu perintah digabung jadi satu.
  5. Walau belum tentu saya bisa lakukan semua itu.

Rujukan