Showing posts with label GNU/Linux. Show all posts
Showing posts with label GNU/Linux. Show all posts

Wednesday, June 05, 2024

Rekomendasi direktori untuk penyimpanan data

Ketika bekerja dalam tim, atau dengan tim, tempat penyimpanan data menjadi masalah. Si A menyimpan data di "download", si B di "my document", dan si C di "Files". Untuk menyamakan tempat penyimpanan data di komputer, saya merekomendasikan hal berikut.

Komputer dengan satu harddisk (SSD/HDD)

Untuk komputer dengan satu hardisk, tempat penyimpanan data terbaik adalah di "home", atau "/home/$USER/data", dimana $USER adalah nama user, misal "bagus" (sehingga menjadi "/home/bagus/data"). Di Linux, kita hanya butuh mengetik "cd" untuk "pulang ke rumah". Untuk memanggil path "data", siapapun usernya, dalam python, kita bisa menggunakan Path dari pathlib berikut.

from pathlib import Path
data = Path.home() / "data"

Oya, di era sekarang ini, kita tidak perlu membuat partisi tersendiri untuk data. Beda dengan zaman saya kuliah dulu yang perlu mempartisi satu HDD menjadi beberapa drive agar ketika drive satu rusak, drive lainnya masih bisa digunakan.

Komputer dengan multi harddisk

Untuk komputer dengan multi harddisk, tempat penyimpanan data yang saya rekomendasikan adalah di root, yakni "/data". Siapapun usernya, pathnya pasti akan sama dalam hal ini.

Pro-kontra:

Kenapa satu harddisk di "home" dan multi-hardisk di "/data"? Sebetulnya "/data" lebih universal karena tidak bergantung "User", namun karena lokasinya di "/" (root), menurut saya hal ini rentan masalah. Misalnya jika sistem korup atau clash, biasanya data di bawah root akan terkena juga. Alasan kedua karena sekuriti/akses terhadap root. Home bisanya lebih terisolasi.

Thursday, December 28, 2023

Blog baru di Listed

 Akhirnya, ada platform offline dan online dalam satu portal. Dan platform itu ternyata sudah ada sejak lama. Namanya Standard Notes. Bisa diinstal via snap dengan perintah berikut di Ubuntu.

sudo snap install standard-notes
  

Saya suka menulis blog, baik itu di blogger, wordpress, medium, atau tumblr. Masalahnya, sejauh pengetahuan saya saat itu, belum ada platform digital yang bisa berlaku baik untuk offline dan online. Misalnya, saat saya punya ide, saya menuliskannya di editor, word processor, atau note taking app. Kemudian saat saya ingin mempublikasikannya, saya salin tulisan offline tadi ke platform blog yang bersangkutan, misalnya Blogger. Sampai saya menemukan platform/aplikasi Standard Notes yang menyatu dengan listed.to.

Blog baru saya di Listed beralamat di https://listed.to/@bagus.

Dengan platfom ini saya bisa menulis blog on-the-go secara luring, kemudian mempublikasikannya dari perangkat tersebut tanpa harus menyalin dan menempelnya ke internet. Cukup sekali-dua kali klik. Bagi anda yang belum tahu caranya, berikut cara publikasi blog lewat Standard Notes and Listed (www.listed.to).

1. Buka Stantard Notes app atau web app
2. Klik ikon Preferences in sisi kanan bawah
3. Buka seksi Listed
4. Pilih Create New Author

Untuk publikasi dari Standard Notes ke Listed (lihat gambar di bawah).
1. Klik kanan judul note yang akan dipublish
2. Pilih "Listed action" kemudian pilih "Publih to Blog"

Voilla, sekarang catatan datam Standard Notes tersebut telah terpublish dalam Listed.to.

Karena kemudahan itu, besar kemungkinan saya akan mengeblog di Listed. Blog di blogspot ini mungkin akan dormant, wallahua'lam. Saya belum tahu pastinya, mungkin topik-topik professional akan saya taruh disini, catatan harian di Listed, dan quotes di Tumblr.

Dengan demikian, Standard Noted menjadi otak ketiga saya setelah simplenote.

Tuesday, July 25, 2023

Live microphone visualization (waveform) with sounddevice

 *** This post was made by ChatGPT***


Are you interested in visualizing live audio data from your microphone? Do you want to see the waveform of your voice or any other sound in real time? In this blog post, we’ll explore a Python script that utilizes Matplotlib to plot live microphone signals. This script is a useful tool for understanding and analyzing audio input in real time.

Before we begin, make sure you have sounddevice, Matplotlib, and NumPy installed. If not, you can install them using the following command:

pip install matplotlib numpy sounddevice

Now, let’s dive into the code and see how it works.

The Code

#!/usr/bin/env python3
"""Plot the live microphone signal(s) with matplotlib.

Matplotlib and NumPy have to be installed.

"""
import argparse
import queue
import sys

from matplotlib.animation import FuncAnimation
import matplotlib.pyplot as plt
import numpy as np
import sounddevice as sd

The script starts with the usual shebang (#!/usr/bin/env python3) and a brief docstring explaining the purpose of the code. It also imports the necessary modules: argparse, queue, sys, FuncAnimation from matplotlib.animation, plt (alias for matplotlib.pyplot), numpy, and sounddevice.

Next, the code defines two helper functions and two main functions.

def int_or_str(text):
    """Helper function for argument parsing."""
    try:
        return int(text)
    except ValueError:
        return text


def audio_callback(indata, frames, time, status):
    """This is called (from a separate thread) for each audio block."""
    if status:
        print(status, file=sys.stderr)
    # Fancy indexing with mapping creates a (necessary!) copy:
    q.put(indata[::args.downsample, mapping])

The int_or_str function is a helper used for parsing command-line arguments. It tries to convert the input text to an integer and returns it if successful; otherwise, it returns the input text as it is.

The audio_callback function is called for each audio block received from the microphone. It receives indata (the audio data), frames (the number of frames), time (the timestamp of the audio data), and status (the status of the audio stream). It prints any status messages to the standard error and puts a copy of the audio data (filtered using downsampling and channel mapping) into a queue (q) for processing later.

def update_plot(frame):
    """This is called by matplotlib for each plot update.

    Typically, audio callbacks happen more frequently than plot updates,
    therefore the queue tends to contain multiple blocks of audio data.

    """
    global plotdata
    while True:
        try:
            data = q.get_nowait()
        except queue.Empty:
            break
        shift = len(data)
        plotdata = np.roll(plotdata, -shift, axis=0)
        plotdata[-shift:, :] = data
    for column, line in enumerate(lines):
        line.set_ydata(plotdata[:, column])
    return lines

The update_plot function is called by Matplotlib for each plot update. It retrieves audio data from the queue (q) and shifts the existing data to accommodate the new audio block. The function then updates the y-data of the lines on the plot with the new audio data.

if __name__ == "__main__":
    # ... (continued in the next code block)

The script uses the standard Python if __name__ == "__main__": guard to ensure that the following code is only executed when the script is run directly, not when it’s imported as a module.

    parser = argparse.ArgumentParser(add_help=False)
    parser.add_argument(
        '-l', '--list-devices', action='store_true',
        help='show list of audio devices and exit')
    args, remaining = parser.parse_known_args()
    if args.list_devices:
        print(sd.query_devices())
        parser.exit(0)

The code sets up an argument parser with argparse to handle command-line arguments. It allows the user to list available audio devices and exit the program without running the main functionality. If the user specifies the --list-devices flag, the script will print a list of audio devices using sd.query_devices() and then exit.

    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter,
        parents=[parser])
    parser.add_argument(
        'channels', type=int, default=[1], nargs='*', metavar='CHANNEL',
        help='input channels to plot (default: the first)')
    parser.add_argument(
        '-d', '--device', type=int_or_str,
        help='input device (numeric ID or substring)')
    parser.add_argument(
        '-w', '--window', type=float, default=200, metavar='DURATION',
        help='visible time slot (default: %(default)s ms)')
    parser.add_argument(
        '-i', '--interval', type=float, default=30,
        help='minimum time between plot updates (default: %(default)s ms)')
    parser.add_argument(
        '-b', '--blocksize', type=int, help='block size (in samples)')
    parser.add_argument(
        '-sr', '--samplerate', type=float, default=16000, help='sampling rate of audio device')
    parser.add_argument(
        '-n', '--downsample', type=int, default=1, metavar='N',
        help='No downsample (default: %(default)s)')
    args = parser.parse_args(remaining)

The script creates another argument parser, this time with a description based on the script’s docstring. It defines several command-line arguments:

  • channels: The channels to plot. If not specified, it will default to the first channel.
  • device: The input audio device to use. It can be specified either by a numeric ID or a substring of the device name.
  • window: The visible time slot in milliseconds. This controls how much of the audio history is displayed on the plot.
  • interval: The minimum time between plot updates in milliseconds.
  • blocksize: The block size (number of samples) for audio processing. If not specified, the default block size of the audio stream will be used.
  • samplerate: The sampling rate of the audio device. If not specified, it will default to 16000 Hz.
  • downsample: The factor by which the audio data is downsampled. By default, no downsampling is applied.

The parse_args method is called to parse the remaining command-line arguments (remaining) after handling the --list-devices option.

    if any(c < 1 for c in args.channels):
        parser.error('argument CHANNEL: must be >= 1')
    mapping = [c - 1 for c in args.channels]  # Channel numbers start with 1
    q = queue.Queue()

The code checks if any of the specified channels are less than 1. If so, it raises an error with an appropriate message. It then creates a mapping list for the channel indices, as the channel numbers in args.channels start from 1.

Full code is listed below. Actually, it is based on an example from sounddevice documentation [1].
#!/usr/bin/env python3
"""Plot the live microphone signal(s) with matplotlib.

Matplotlib and NumPy have to be installed.

"""
import argparse
import queue
import sys

from matplotlib.animation import FuncAnimation
import matplotlib.pyplot as plt
import numpy as np
import sounddevice as sd


def int_or_str(text):
    """Helper function for argument parsing."""
    try:
        return int(text)
    except ValueError:
        return text


def audio_callback(indata, frames, time, status):
    """This is called (from a separate thread) for each audio block."""
    if status:
        print(status, file=sys.stderr)
    # Fancy indexing with mapping creates a (necessary!) copy:
    q.put(indata[::args.downsample, mapping])


def update_plot(frame):
    """This is called by matplotlib for each plot update.

    Typically, audio callbacks happen more frequently than plot updates,
    therefore the queue tends to contain multiple blocks of audio data.

    """
    global plotdata
    while True:
        try:
            data = q.get_nowait()
        except queue.Empty:
            break
        shift = len(data)
        plotdata = np.roll(plotdata, -shift, axis=0)
        plotdata[-shift:, :] = data
    for column, line in enumerate(lines):
        line.set_ydata(plotdata[:, column])
    return lines


if __name__ == "__main__":

    parser = argparse.ArgumentParser(add_help=False)
    parser.add_argument(
        '-l', '--list-devices', action='store_true',
        help='show list of audio devices and exit')
    args, remaining = parser.parse_known_args()
    if args.list_devices:
        print(sd.query_devices())
        parser.exit(0)
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter,
        parents=[parser])
    parser.add_argument(
        'channels', type=int, default=[1], nargs='*', metavar='CHANNEL',
        help='input channels to plot (default: the first)')
    parser.add_argument(
        '-d', '--device', type=int_or_str,
        help='input device (numeric ID or substring)')
    parser.add_argument(
        '-w', '--window', type=float, default=200, metavar='DURATION',
        help='visible time slot (default: %(default)s ms)')
    parser.add_argument(
        '-i', '--interval', type=float, default=30,
        help='minimum time between plot updates (default: %(default)s ms)')
    parser.add_argument(
        '-b', '--blocksize', type=int, help='block size (in samples)')
    parser.add_argument(
        '-sr', '--samplerate', type=float, default=16000, help='sampling rate of audio device')
    parser.add_argument(
        '-n', '--downsample', type=int, default=1, metavar='N',
        help='No downsample (default: %(default)s)')
    args = parser.parse_args(remaining)
    if any(c < 1 for c in args.channels):
        parser.error('argument CHANNEL: must be >= 1')
    mapping = [c - 1 for c in args.channels]  # Channel numbers start with 1
    q = queue.Queue()

    try:
        if args.samplerate is None:
            device_info = sd.query_devices(args.device, 'input')
            args.samplerate = device_info['default_samplerate']

        length = int(args.window * args.samplerate / (1000 * args.downsample))
        plotdata = np.zeros((length, len(args.channels)))

        fig, ax = plt.subplots()
        lines = ax.plot(plotdata)
        if len(args.channels) > 1:
            ax.legend([f'channel {c}' for c in args.channels],
                      loc='lower left', ncol=len(args.channels))
        ax.axis((0, len(plotdata), -1, 1))
        ax.set_yticks([0])
        ax.yaxis.grid(True)
        ax.tick_params(bottom=False, top=False, labelbottom=False,
                       right=False, left=False, labelleft=False)
        ax.text(0.01, 0.99, f'Sample rate: {args.samplerate/args.downsample} Hz', transform=ax.transAxes, va='top', ha='left')

        fig.tight_layout(pad=0)

        stream = sd.InputStream(
            device=args.device, channels=max(args.channels),
            samplerate=args.samplerate, callback=audio_callback)
        ani = FuncAnimation(fig, update_plot, interval=args.interval, blit=True)
        with stream:
            plt.show()
            
    except Exception as e:
        parser.exit(type(e).__name__ + ': ' + str(e))
Save it as sd_plot_input.py (or whatever name.py) and run it with the following commands. See the video above for the sample output.
$ python3 sd_plot_input.py


Reference: 

  1. https://python-sounddevice.readthedocs.io/en/0.4.6/examples.html#plot-microphone-signal-s-in-real-time

Thursday, April 14, 2022

Menemukan dan Menghapus file (ekstensi tertentu, ukuran tertentu)

Menemukan fail

Pola: find [nama-direktori] -name [nama-file]

Contoh

pc060066:~$ find . -name tes.txt
./tes.txt

Tanda titik setelah find menunjukkan current directory (dalam hal ini /home/$USER).

Menemukan dan menghapus fail

Pola: find [nama-direktori] -name [nama-file-yang-dihapus] -delete

Contoh

pc060066:~$ cp tes.txt tes-del.txt
pc060066:~$ find . -name tes-del.txt
./tes-del.txt
pc060066:~$ find . -name tes-del.txt -delete
pc060066:~$ find . -name tes-del.txt
Terlihat file yang dihapus (tes-del.txt) tidak ada setelah perintah di atas.


Menemukan dan menghapus fail ekstensi tertentu

Pola: find [nama-direktori] -name ['*.ext'] -delete

pc060066:~$ mkdir test
pc060066:~$ cd test
pc060066:test$ ls
pc060066:test$ touch test{1..5}.txt
pc060066:test$ ls
test1.txt  test2.txt  test3.txt  test4.txt  test5.txt
pc060066:test$ touch readme.md
pc060066:test$ ls
readme.md  test1.txt  test2.txt  test3.txt  test4.txt  test5.txt
pc060066:test$ find . -name '*.txt'
./test1.txt
./test3.txt
./test2.txt
./test5.txt
./test4.txt
pc060066:test$ find . -name '*.txt' -delete
pc060066:test$ ls *.txt
ls: cannot access '*.txt': No such file or directory
Jangan lupa single quote diantara ekstensi ('*.txt'); untuk ekstensi lainnya tanda quote ini tidak perlu. Contohnya *.wav. Kita juga bisa mencari (dan menghapus) file ekstensi tertentu dengan nama tertentu. Contohnya menemukan (dan menghapus) file dengan nama berakhiran *_cd16k.wav.


Menemukan dan menghapus fail ukuran tertentu

Pola: find [nama-direktori] -name [nama-file-opsional] -size [ukuran, -, +] -delete

Contoh:
pc060066:test$ find . -size 4c
./test8.txt
pc060066:test$ find . -size 4c -delete
pc060066:test$ ls
1001_DFA_ANG_XX.wav  test1.txt  test3.txt  test5.txt  test7.txt
readme.md            test2.txt  test4.txt  test6.txt
pc060066:test$ find . -size -10c # find below 10 bytes
./test6.txt
./test1.txt
./test3.txt
./readme.md
./test2.txt
./test5.txt
./test4.txt
pc060066:test$ find . -size -10c -delete # delete below 10 bytes
pc060066:test$ ls
1001_DFA_ANG_XX.wav  test7.txt
pc060066:test$ find . -size +10c -delete # delete above 10 bytes
pc060066:test$ ls
Jadi tanda "-" untuk kurang dari dan "+" untuk lebih dari ukuran file yang dikehendaki. Tidak ada tanda maka hasilnya pada rentang nilai tersebut. Misal 10c untuk 10 bytes, 10k untuk 10 kilobytes, termasuk 10001 bytes sampai dengan 10999 bytes. 

Menghapus file kosong

Pola: find [nama-direktori] -empy -delete
Contoh:
pc060066:test$ find . -empty
./test10.txt
./test6.txt
./test1.txt
./test3.txt
./test2.txt
./test8.txt
./test5.txt
./test9.txt
./test4.txt
./test7.txt
pc060066:test$ find . -empty -delete
pc060066:test$ ls

Menghapus direktori kosong

Pola: find [nama-direktori] -d -empty -delete 

Contoh:
pc060066:test$ ls -ltr
total 20
drwxrwxr-x 2 bagus bagus 4096  4月 14 15:33 test_dir_5
drwxrwxr-x 2 bagus bagus 4096  4月 14 15:33 test_dir_4
drwxrwxr-x 2 bagus bagus 4096  4月 14 15:33 test_dir_3
drwxrwxr-x 2 bagus bagus 4096  4月 14 15:33 test_dir_2
drwxrwxr-x 2 bagus bagus 4096  4月 14 15:33 test_dir_1
pc060066:test$ find . -type d
.
./test_dir_5
./test_dir_4
./test_dir_2
./test_dir_1
./test_dir_3
pc060066:test$ find . -type d -empty
./test_dir_5
./test_dir_4
./test_dir_2
./test_dir_1
./test_dir_3
pc060066:test$ find . -type d -empty -delete
pc060066:test$ ls
Bedakan dengan perintah sebelumnya untuk file, untuk direktori kita perlu argumen "-type d".

Menemukan dan menghapus kecuali


Pola: find [nama-direktori] not -name [kecuali] -delete

Contoh:
find . not -name "*_mono.wav" -delete
Argumen "not" bisa diganti dengan tanda seru "!" agar lebih singkat. Untuk folder yangt tidak kosong (directory is not empty), kita perlu menggunakan "rm -fr" sebagai pengganti argumen "-delete".
find . -mindepth 1 ! -name "kecuali-direktori1" ! -name "*.py" ! -name "KECUALI.md" ! -name "kecuali-direktori2" -exec rm -rf {} +

Monday, August 16, 2021

Install sox locally in cluster without root

This time, I can't install homebrew in (AIST) cluster as I previously did in JAIST cluster. Here are steps to documents how to install SoX, one of the most important library in sound processing, locally in cluster. I tried these steps in abci.ai.

# download sox package, in this case
wget https://nchc.dl.sourceforge.net/project/sox/sox/14.4.2/sox-14.4.2.tar.gz

# extract sox package
tar xvfz sox-14.4.2.tar.gz

# change to extracted sox directory
cd sox-14.4.2

# configure in local directory, I used $HOME
./configure --prefix=$HOME

# make
make

# make install
make install
Then check it by its version
[user13432@es2 ~]$ sox --version
sox:      SoX v14.4.2
You may also need to update $PATH to make it works in your enviroment.

Wednesday, March 06, 2019

Mencoba Kaldi di Ubuntu 18.04, cuda9.0

Ini adalah catatan saya saat mencoba Kaldi (speech recognition toolkit) pada Ubuntu 18.04. Spesifikasi PC yang saya gunakan adalah CPU i9-7900X dan GPU GTX 1060. Hasil percobaan ini membuahkan satu paper yang saya submit pada ASJ spring meeting 2019.

Instalasi

Instalasi kaldi adalah proses pertama, dan bisa jadi, tersulit. Jika anda "SUCCESS" menginstall Kaldi, proses selanjutnya akan mudah. Jika tidak, akan terhenti. Berikut adalah dasar alur kerja setelah meng-clone Kaldi.

Pertama clone Kaldi ke direktori PC kita.

Friday, December 14, 2018

Bermain (virtual) Piano di Ubuntu

Di zaman serba canggih ini, kita tidak harus memiliki piano untuk bisa bermain piano. Cukup dengan menggunakan laptop dan keyboard laptop-pun bisa dijadikan tuts piano. Begini caranya.

Instalasi
Saya menggunakan Ubuntu 16.04 untuk instalasi aplikasi piano ini. Anda bisa juga menggunakan OS lainnya. Aplikasi yang akan kita gunakan/install adalah vmpk (virtual midi piano keyboard). Untuk menginstallnya cukup mudah,

sudo apt install vmpk

Perintah tersebut juga akan menginstall qsynth, yang akan menginterface (menghubungkan) vmpk dengn sound output Ubuntu  (vmpk tidak menghasilkan suara, sehingga perlu interface untuk menghasilkan suara).

Thursday, November 16, 2017

Tutorial python virtualenv

Bahasa pemrograman python sedang boooming, menurut IEEE programming language rank, python menempati urutan pertama. Setelah membuat tutorial singkat, learning python: the hardway, saya jarang membukanya dan menggunakannya. Untuk memaksa hal tersebut, saya membuat tutorial lagi, yang saya sadur dari software carpentry. Kali ini saya akan mencatat tentang penggunaan `virtualenv`, module python yang digunakan untuk mengisolasi environment, seperti menggunakan modul versi tertentu dan setup tertentu. Hal ini sangat penting karena beberapa kode yang dibuat hanya berjalan pada versi yang sama, bukan versi di atasnya atau di bawahnya, misalnya deep learning untuk klasifikasi genre musik ini. Virtualenv ini sangat mirip dengan `modulefile` pada HPC (high performance computing).

Instalasi
Ada dua cara yang saya rekomendasikan untuk menginstall virtualenv, cara pertama dengan apt(-get), cara kedua dengan pip. Saya lebih merekomendasikan cara kedua.

Jika memakai cara pertama (apt untuk ubuntu, apt-get untuk debian-based)
sudo apt install virtualenv

Cara kedua (lebih direkomendasikan),
sudo -H pip install virtualenv

Pip adalah `python installing packages`, karena kita sedang menggunakan python, karena itulah saya lebih merekomendasikan cara kedua. Argument -H artinya agar installasi di-set ke user dari Home (alaiu, as long as i understood). Kemudian untuk mengecek apakah sudah terinstal, seperti biasa, cek dengan argumen --version.
virtualenv --version

Membuat virtualev
Untuk membuat python virtualennv, caranya cukup mudah sbb:
virtualenv nama_virtual_python
source nama_virtual_python/bin/activate

Denga perintah itu virtualenv dengan nama `nama_vitual_python` telah dibuat dan diaktivas dengan perintah berikutnya yakni `source activate`. Setelah perintah itu dijalankan, maka kita sudah berada pada python virtual environment dimana kita bisa menginstall dan menggunakan modul/package python dengan versi selain versi modul yang terinstall di komputer. Contohnya sebagai berikut,
pip install tensorflow==1.0.0 sugartensor==1.0.0.2 pandas>=0.19.2 librosa==0.5.0 sckits.audiolab==0.11.0 numpy==1.13.3

Menon-aktifkan virtualenv

Sebagai kebalikan perintah `source activate`, kita bisa menggunakan perintah `deactivate` saja tanpa argumen untuk menon-aktifkan virtualenv python dan kembali ke environment python secara umum di PC kita.
deactivate

Integrasi dengan Jupyter notebook

Dengan Jupyter notebook, pemorgraman python menjadi lebih interaktif seperti Matlab. Kita bisa melihat variabel, mengganti parameter, dan megedit baris tertentu saja tanpa menjalankan keseluruhan program. Seperti halnya alasan kenapa kita menggunakan virtualenv: yakni kita hanya ingin menggunakan paket python versi tertentu saja pada project/direktori tertentu saja, begitu juga pada Jupyter notebook. Alih-alih menggunakan python2 atau python3 sebagai kernel jupyter, kita bisa membuat custom kernel python sendiri dengan menginstall ipykernel dalam virtualenv.

Langkah-langkahnya adalah sebagai berikut,
$ source nama_virtual_python/bin/activate
(nama_virtual_python)$ pip2 install ipykernel
(nama_virtual_python)$ ipython kernel install --user --name=nama_virtual_python
installed kernelspec nama_virtual_python in /home/user/.local/share/jupyter/kernels/nama_virtual_python
(nama_virtual_python)$ jupyter-notebook

Perhatikan bahwa string sebelum tanda dolar $ bukan merupakan perintah. Singkatnya, baris kedua diatas akan menginstall paket ipykernel pada environment python saat ini, kemudian baris ketiga mengaktifkan paket (kernel) tersebut pada jupyter. Terakhir kita buka jupyter, dan disitu terdapat kernel baru: nama_virtual_python. Selamat mencoba!

Update:

Pada Ubuntu 16.04, by default perintah `pip` akan mengeksekusi pip3 (python3), bukan pip2 (python2), jika virtualenv sudah terinstall dan ada ketika di jalankan keluar "using base prefix '/usr' ", maka tambahkan opsi `--python=python2" saat menjakankan virtualenv sebagai berikut:
virtualenv --python=python2 nama_virtual_python

Update 2018/11/12
Untuk python3, gunakan venv daripada virtualenv. Lebih lengkapnya silahkan ikuti panduannya disini.

TL;DR untuk python 3:
1. python3 -m venv .env
2. source .env/bin/activate
3. pip3 install namapaket

Update untuk python3.6 (2020/07/31)
1. sudo apt install python3.6-venv
2. ... (step 1-3 di atas)

Referensi:
  1. http://www.pythonforbeginners.com/basics/how-to-use-python-virtualenv
  2. https://anbasile.github.io/programming/2017/06/25/jupyter-venv/

Wednesday, September 27, 2017

Git Undo

Tulisan ini adalah kelanjutan dari tulisan sebelumnya tentang bekerja dalam tim dengan Git disini. By default, git tidak memiliki fitur git undo karena sebenarnya fitur utama dari git adalah kemampuannya untuk meng-undo secara tak terbatas. Cara meng-undo-nya bergantung pada treatment apa yang sudah anda lakukan: mengundo commit, atau kembali pada versi sebelumnya (misal: karena anda tidak puas pada versi sekarang). Berikut caranya.

A post shared by Bagus Tris Atmaja (@bagustris) on

Tuesday, July 11, 2017

20 Perintah Dasar Linux (Shell)

Mampu menggunakan perintah dasar pada shell Linux merupakan suatu skill dasar yang harus dimiliki bagi mereka yang ingin menjadi programmer, sysAdmin dan, bahkan, (data) scientist. Shell merupakan jendela ke bahasa pemrograman lainnya seperti python, perl, awk, c/c++. Menguasai shell artinya anda bisa memadukan antara bahasa pemrograman karena shell saat ini dijadikan glue (perekat) antar bahasa pemrograman yang saat ini tidak bisa berdiri sendiri-sendiri. Contoh nyata penggunaan shell adalah pada riset speech synthesis, speech recognition dan data science. Dan hampir semua bidang yang menggunakan komputasi memakai shell pada systemnya. Shell pada Linux dapat digunakan melalui (gnome) terminal, buka dengan Ctrl + Alt + T, dan perintah dasarnya adalah sebagai berikut:
nama-perintah argumen
nama-perintah adalah nama perintah yang digunakan, misal perintah yang akan dibahas dibawah: ls, cp, mkdir dan mv. Sedangkan argumen adalah parameter, argumen atau input dari nama-perintah. Misal perintah "mkdir bagus" akan membuat direktori (mkdir, make directory) dengan nama "bagus" dalam direktori saat ini (current directory).

A post shared by Bagus Tris Atmaja (@bagustris) on


0. <tab>
Tab adalah temanmu, teman terbaikmu! Tombol tab berfungsi sebagai code completion atau pun path dan filename completion. Mulailah dengan mengetik perintah nomor satu (ls), ketik l den tekan tab. Ketil ls (spasi) dan tekan (tab). Ketil " ls Do (tab) ". Dan seterusnya. Tombol (tab) akan menghemat waktu anda, ton of times.

1. ls
ls digunakan untuk me-list file. Berikut contohnya:

ls /usr/bin

# melist secara detail
ls -l

# menampilkan dalam format "human readable" ukuran file
ls -lh

# menampilkan dalam urutan waktu secara detail
ls -lt

# menampilkan dalam urutan waktu secara detail list terbalik (reverse)
ls -ltr

# menghitung total file dalam direktori,wc word count/untuk menghitung kata, 
# wc -l untuk menghitung jumlah baris, "|" adalah pipe
ls /usr/bin | wc -l

# menampilkan argumen apa saja yang dimiliki ls
ls --help

Saturday, April 15, 2017

Memahami pointer pada bahasa C

Pointer pada bahasa pemrograman C merupakan object yang menunjuk alamat dari sesuatu yang ditunjuk. Berbeda dengan variabel biasa, jika variabel biasa memuat nilai dari variabel tersebut (misal int a=5), maka pointer memuat nilai yang ditunjuk dari variabel berupa pointer tersebut.

Pointer merupakan kekuatan utama dari bahasa pemrograman C/C++ yang jarang dimiliki bahasa pemrograman lainnya. Dengan pointer kita bisa mengalokasikan memory secara dinamik dan meningkatkan performansi program khususnya untuk operasi yang berulang seperti akses nilai dari tabel, data string, dll. Pointer juga menghemat beban komputasi, yakni dengan me-reference/dereference (menginisiasi dan menghancurkan) suatu pointer daripada mengcopy/paste nilai suatu variabel.

Pointer dituliskan dengan menambahkan tanda bintang sebelum nama variabel dan setelah tipe variabel, misal: int * a; int* a; atau int *a. Referensi (address of, alamat dari) ditunjukkan dengan tanda ampersand (&), misal: &a. Penulisan pointer yang lebih disukai adalah int* a (bintang menyatu dengan tipe pointer).

Contoh 1: Pointer yang salah
Contoh pointer yang salah namun sangat berguna untuk memahami pointer adalah sebagai berikut.

Friday, April 07, 2017

Tutorial wget

Definisi
Saya sangat menyukai wget. Ketika saya stuck dengan firefox dan chromium karena keduanya semakin lama semakin berat, biasanya saya berpindah ke konsole dan mendownload semua yang saya inginkan dengan wget. Wget merupakan no-interactive network downloader yang berjalan di terminal Unix. Wget mengambil file dari web (web-get, maybe) dengan protokol http, https dan ftp. Dinamakan non-interaktif karena bisa berjalan dalam proses 'background', artinya user tidak perlu terus menerus login, proses download tetap berjalan, dan bisa mem-pause atau men-start proses download. Berikut adalah tampilan wget ketika saya mendownload suatu file dari internet.

tampilan wget ketika mendownload file

Saturday, April 01, 2017

Memperbesar ukuran disk di VirtualBox

Ada dua jenis tipe disk ketika kita menginstall OS melalui virtualiasasi, yakni dinamik dan fix. Jika kita menggunakan tipe pertama, ukuran file dalam OS di VirtualBox bisa fleksibel. Kekurangannya, tipe ini akan menyebabkan kinerja OS menjadi lambat (ditambah 'lambat' karena berjalan di virtualiasasi). Sedangkat tipe kedua, tipe fix, ukuran disk ditentukan dari awal. Kekurangannya, ketika data bertambah dan ternyata ukuran disk tersebut tidak cukup, kita tidak bisa memperbesarnya (secara manual). Kelebihannya, tipe ini menghasilkan kinerja OS yang cepat meski berjalan lewat virtualisasi.

Gambar 1. Setting VirtualBox (Storage) dimana file ISO gparted live akan di-attach.

Disk tipe dinamik bukan berarti bisa 'shrink' atau membesar otomatis begitu saja, namun tetap diperlukan 'cara' untuk memperbesar ukuran disknya.

Jika anda memilih tipe pertama saat membuat OS virtual di Virtual Box, maka tipe disk anda akan berekstensi .vdi. Jika tipe yang dipilih adalah tipe fix kedua, ekstensinya adalah .vmdk. Keduanya bisa diperbesar (resize) ukuran disknya, berikut adalah caranya.

CAUTION: back-up file .vdi (copy-paste) sebelum memperbesar ukuran disk dengan cara dibawah ini agar jika terjadi hal-hal yang tidak diinginkan dapat di-recovery lagi dengan mudah.

Sunday, March 12, 2017

Menghemat daya, mereduksi panas dan meningkatkan performansi Laptop Ubuntu

Ketika saya membeli laptop, biasanya hanya dua parameter yang saya perhatikan: processor dan battery. Keduanya menyangkut produktivitas saya dalam bekerja. Setelah membeli biasanya saya tidak begitu saja percaya pada default setting Laptop tersebut, baik yang ber-OS Windows, Linux atau MacOS. Namun optimasi hanya bisa saya lakukan pada laptop berbasis Linux, khususnya Ubuntu karena dua lainnya sangat susah untuk dioprek (Closed source). Langkah-langkah berikut adalah cara untuk menghemat daya, mereduksi panas dan meningkatkan perfomansi Laptop berbasis Ubuntu.
  1. Install Thermald
  2. sudo apt install thermald
  3. Install lm-sensors
  4. sudo apt install lm-sensors
  5. Install fancontrol (atau macfanctld)
  6. # Untuk fancontrol
    $ sudo apt install fancontrol
    # untuk macfanctld
    $ sudo apt install macfanctld
    
  7. Download and Install Intel Graphic Tool
  8. $ wget https://download.01.org/gfx/ubuntu/16.04/main/pool/main/i/intel-graphics-update-tool/intel-graphics-update-tool_2.0.2_amd64.deb
    $ sudo dpkg -i intel-graphics-update-tool_2.0.2_amd64.deb
    
  9. Set governor: powersafe atau performance (sudo apt install linux-tools-common)
  10. sudo cpupower frequency-set -g performance
    
  11. Cek Laptop speed
  12. sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
    
  13. Do powertop,
  14. sudo powertop --auto-tune 
  15. Enjoy
Penjelasan:

Tuesday, February 28, 2017

Ubuntu audio: konfigurasi dasar untuk perekaman

Sistem operasi Ubuntu mendukung sistem tata suara bawaan dari laptop. By default, perangkat lunak preinstalled Ubuntu mampu menjalankan suara output dan input (recording). Output dari laptop speaker (stereo) dan recording (mono) dari built-in microphone. Secara umum sistem audio pada sistem operasi berbasis Linux terdiri atas beberapa komponen di bawah ini.
Layer-layer Audio pada OS berbasis Linux, Sumber: tuxradar.com [1]

Default sound setting

Setelah menginstall Ubuntu, beberapa setting, apps dan konfigurasi dasar telah tersedia. Di pojok kanan atas, akan ada icon speaker yang bila di-klik menampilkan menu volume speaker, volume microphone, default music apps (Rhythmbox), dan sound setting. Jika ada diantara menu tersebut tidak muncul, artinya ada masalah dalam sound computer/laptop anda. Masalah yang biasanya muncul adalah, internal microphone tidak dikenali, sehingga tidak ada menu volume microphone.
Menu sound pada Ubuntu

Jika menu microphone tidak tersedia, langkah paling awal yang bisa dilakukan adalah menginsall pavucontrol (PulseAudio Volume Control). Caranya,
$ sudo apt install pavucontrol
Pada jendela pavu, anda bisa mengkonfigurasi sound/hardware yang terkoneksi dengan laptop, minimal built-in hardware dari laptop. Untuk masalah microphone, cek konfigurasi, pilih analog stereo duplex. Artinya, laptop kita bisa menerima input (mic) dan mengeluarkan output (speaker). Jika hanya ingin memfungsikan output saja, pilih analog stereo ouput. Dalam hal ini, built-in mic tidak akan bekerja.

Thursday, January 12, 2017

Membuat Buku/Laporan dengan LibreOffice

Meski kampus saya berlangganan secara resmi Office365 versi profesional, tidak ada salahnya saya tetap menggunakan Libreoffice. Alasannya sederhana: simple, powerful dan opensource. Akan lebih mudah dan powerful bagi saya untuk menggunakan Libreoffice daripada menggunakan Ms Office 2016. Bagaimana bisa? Berikut contoh penggunaan Libreoffice untuk pembuatan laporan/buku serta manajemen sitasi dengan Mendeley plugin.

Templating

Saat membuat buku/laporan/dokumen, biasanya membiarkan setting-nya adalah default. Kemudian saya buat judul dengan style title dan bab-babnya dengan section 1, 2, dst. Jadi dalam satu menit saya sudah punya template dokumen. Untuk memudahkan, saya selalu mengaktifkan sidebar (View >> Sidebar). Contohnya adalah sbb.

Sidebar Libreoffice dengan menu navigation untuk memudahkan mapping halaman
Beberapa perbedaan untuk daftar isi, daftar table, daftar gambar dan daftar Index, adalah pada menu Insert >> Table of Contents or Index >> Table of Content, Index or Bibliography >> Pilih menu yang akan ditampilkan seperti gambar di bawah.


Membuat daftar isi
Untuk membuat daftar isi caranya sangat mudah seperti di atas. Namun terlebih dahulu, anda harus mengatur HEADING 1, HEADING 2 dan HEADING 3 (biasanya saya hanya sampai heading 3 saja), sebagai Bab, Sub-Bab, dan Sub Sub-Bab. Jika anda belum mengetahui cara men-set heading, caranya sangat mudah: Letakkan kursor pada frase yang anda ingin jadikan sebagai heading; pada drop down style pilih heading yang anda inginkan (Lihat gambar dibawah). Setelah itu anda dapat membuat menu daftar isi secara otomatis, Insert >> Table of Contents or Index >> Table of Content, Index or Bibliography.


Tuesday, July 26, 2016

Tutorial Rsync

Rsync adalah tool sinkronisasi terbaik. Dengan rsync anda tidak perlu copy-paste, tidak perlu tool back-up lain, hanya rsync saja. Begitu anda menguasainya, manajemen file terasa mudah.

Perintah dasar:

rsync fileSumber FolderTujuan
rsync -avz FolderSumber/ FolderTujuan/   
Perintah pertama akan mengcopy file 'fileSumber' kedalam 'FolderTujuan', sedang perintah kedua akan mensinkronkan file-file didalam 'FolderSumber' kedalam 'FolderTujuan'. Jika tidak ada slash di argumen pertama ('FolderSumber') maka 'FolderSumber' akan dicopy (bukan hanya file-filenya, tapi foldernya) didalam 'FolderTujuan'. Jika ada slash ('FolderSumber/') maka yang dicopy hanya file-filenya saja (bukan foldernya). Opsi -avz adalah archieve, verbose dan compress artinya rsync dilakukan secara rekursif (isi folder), menampilkan informasi sinkronisasi dan mengkompress saat pengiriman.

Skenario 1: Anda punya dua direktori/folder/drive yang akan anda sinkron-kan, misal namanya adalah tes1 dan tes2. Di dalam tes1 ada beberapa file, sedang tes2 masih kosong. Simply speaking, anda ingin memback-up atau mengcopy paste isi file didalam folder tes1 ke dalam folder tes2.

Kondisi 0:
tes1
+--- file1
+--- file2
+--- file3
tes2
Perintah:
Buat folder dan file1..3 dalam folder tes1
$ cd /tmp
$ mkdir -p tes1 && cd $_
$ touch file{1..3}
$ mkdir ../tes2
Dengan perintah diatas skenario kondisi 0 tercapai, kita mempunyai tiga file dalam folder tes1 dan nol file dalam tes2. Sekarang saatnya memback-up atau copy paste dengan rsync,
$ pwd
tes1
$ rsync -avz --update ./ ../tes2

Saturday, October 10, 2015

Running job with proper software version via modulefiles in supercomputer

Motivation

On HPC cluster (high performance computing/supercomputer), it is often to have multiple version of the same software installed. When the user want to use the specific software which the certain library, changing environment variable like $PATH manually is tedious and sometime difficult, the is the common errors during running job in HPC. To solve the problem, corresponding shell script would have to be written for multiple languages. All of these explicit steps are error prone and difficult to maintain. It is also no simple upgrade path. One exist solution is by using modulefiles, a (Unix) tool for dynamic modification of a user's environment.

Module Commands

Here are some module commands:
  • module avail: to check available modulefiles
  • module list: view current active modules
  • module purge: delete currently loaded modules
  • module load <package>: to load default module <package>
  • module load <package/version>: to load module <package> on specific version.
  • module unload <package>: unload the package
  • module show <package>: display command triggered by module load
  • module whatis <package>: display 1-line info about the module
  • module help <package>: need a help?

Thursday, October 08, 2015

Installing Octave 4.0 in Ubuntu 14.04

So I already have Octave 3.8.1 in my machine, Ubuntu 14.04, with signal, control and audio package. I want to upgrade it to the newest one, Octave 4.0.0 which has GUI as default and some improvements. How to install Octave 4.0 on Trusty? Here is how, the defaults didn't works for me (actually it works but has some errors).

Octave 4.0.0 on Ubuntu 14.04 Trusty with GUI as default

Step-by-step:

Wednesday, October 07, 2015

Membangun komputer cluster di VirtualBox dengan Rocks kit, Part 2: Testing

Setelah berhasil membangun dan menginstall kluster komputer di VirtualBox, saatnya untuk mengetes kluster tersebut dengan komputasi parallel. Goal yang ingin kita tuju adalah membagi job komputasi (berupa command/script) pada masing-masing node yang sudah kita tambahkan pada master node agar komputar tersebut lebih cepat.

Pertama kita tambahkan user agar bisa login ke kluster dengan perintah useradd (login as root in master),
useradd bagus1
useradd bagus2
passwd bagus1
passwd bagus2
rocks sync users
Perintah-perintah diatas akan menambahkan user (bagus2 dan bagus2), mengeset masing-masing password untuk user dan mensinkronkan user dari master ke nodes.

Sinkroniasi user antar compute nodes

Related Posts Plugin for WordPress, Blogger...