Thursday, September 23, 2021

Gagal S3 karena tidak mau menyerahkan buku disertasi

Cerita berikut konyol namun menurut saya salah satu contoh idealisme terbaik. 

Dennis W. Ritchie, penemu bahasa C dan Unix gagal S3 karena tidak mau menyerahkan buku disertasinya ke perpustakaan Harvard University. Si penemu bahasa C tersebut sudah menyelesaikan semuanya tentang disertasinya, buku pun sudah, ujian juga sudah. Cuma satu, saat perpustakaan Harvard meminta buku disertasinya, dia menolaknya. Dia berujar, "Jika perpus mau disertasiku, ya beli...."


‘If the Harvard library wants a bound copy for them to keep, they should pay for the book, because I’m not going to!’


Tidak ada Ritchie artinya (mungkin) tidak ada Unix dan Bahasa C. Tidak ada Unix artinya tidak ada Linux, Windows, MacOS, dan Android, atau mungkin ada namun tidak secanggih sekarang. Di zaman yang modern ini, kita perlu menjaga idealisme hal-hal kecil seperti diatas. Logis sekali pernyataan Dennis Ritchie ini: Jika engkau menginginkan suatu barang, engkau harus membelinya.


Ketikan yang sempurna

Tambahan kecil di cerita disertasi Dennis Ritchie adalah ketikan yang mendekati sempurna. Di zaman yang belum ada komputer (dan dia sendiri yang menemukan/membangun komputer), hanya ada enam kesalahan tik dalam disertasinya. Padahal disertasinya sendiri berkaitan dengan matematika. Sangat sulit untuk membuat persamaan matematika yang sempurna dengan mesin tik. Saya mengalaminya saat SMP. Gambar di bawah adalah contoh ketikan disertasi Ritchie dari sumber [1].

Disertasi Ritchie, hanya 6 salah tik (typo) dalam 181 halaman [1]


Referensi:

[1] https://computerhistory.org/blog/discovering-dennis-ritchies-lost-dissertation/ 


Wednesday, September 22, 2021

Lebih baik mengundurkan diri daripada menginstall WA

Seorang teman berseloroh: dia lebih memilih untuk dipecat/mengundurkan diri dari pekerjaannya daripada diminta menginstall whatsapp (WA). Dan dia melakukannya. Dia mengundurkan dari posisi dosen PTN di wilayah barat Indonesia. Saya sependapat dengannya. 

Hidup ini pilihan, dan kadang tidak ada pilihan yang salah (dan selebihnya ada, salah memilih). Menjadi dosen itu pilihan baik, pekerjaan lain juga pilihan baik. Teman saya yang mundur gara-gara WA tadi juga tidak salah karena itu pilihannya. Pihak kampus yang memaksa teman saya menginstall WA tadi juga tidak salah karena itu wewenangnya. 

Ketika sudah bekerja kita harus mematuhi peraturan pekerjaan. Jika tidak bisa maka kita harus mundur, itulah konsekuensinya. Mundur juga bukan perbuatan tercela. Hal ini akan berbeda ketika kita bisa merubah kebijakan atau peraturan itu. 

Wallahua'lam bi showab.

Tulisan terkait:

Friday, September 10, 2021

Setting Up Huion WH1409 V2 on Ubuntu (20.04)

This is my second experience using a pen tablet on Ubuntu (which works wonderful). Everything works out the box using the previous Digimend v10 installation. The only change I made is to copy Huion H950p configuration to the following content.
#!/bin/sh
# huiowh1409.sh: configuration file for WH1409 on Ubuntu 20.04, run as: $ ./huionwh1409.sh

#Change DVI-I-1 to what monitor you want from running command: xrandr
MONITOR="DP-1"

# Get pad name, use "lsusb" or "xsetwacom list devices"
PAD_NAME='HUION Huion Tablet'

# get stylus ID
ID_STYLUS=$(xinput | grep "$PAD_NAME stylus" | cut -f 2 | cut -c 4-5)

# map pad to first monitor
xinput map-to-output $ID_STYLUS $MONITOR

# Pad button mapping for Xournal

xsetwacom set "$PAD_NAME Pad pad" button 1 key Ctrl z # undo
xsetwacom set "$PAD_NAME Pad pad" button 2 key Ctrl y # redo
xsetwacom set "$PAD_NAME Pad pad" button 3 key Ctrl shift d # default
xsetwacom set "$PAD_NAME Pad pad" button 8 key Ctrl shift p # pen

xsetwacom set "$PAD_NAME Pad pad" button 9 key Ctrl shift e # eraser
xsetwacom set "$PAD_NAME Pad pad" button 10 key Ctrl 1 # shape recognizer
xsetwacom set "$PAD_NAME Pad pad" button 11 key Ctrl 4 # arrow
xsetwacom set "$PAD_NAME Pad pad" button 12 key Ctrl 5 # coordinate

xsetwacom set "$PAD_NAME Pad pad" button 13 key Ctrl c # copy
xsetwacom set "$PAD_NAME Pad pad" button 14 key Ctrl v # paste
xsetwacom set "$PAD_NAME Pad pad" button 15 key Ctrl shift r # select rect 
xsetwacom set "$PAD_NAME Pad pad" button 16 key Ctrl d # new page after


exit 0
All 12 pad buttons work without any further configuration! Both USB cable and bluetooth connection also work seamlessly. This WH1409 tablet has a smoother pen (PW500 pen) compared to H950P (with PW100 pen). So far, I am very satisifed by its performance, particularly on Linux-based PC.

Wednesday, September 08, 2021

Etika Komunikasi Mahasiswa Terhadap Dosen

Berdasarkan Peraturan Rektor ITS No 15 Tahun 2019, berikut adalah tangkapan layar "Etika Mahasiswa Terhadap Dosen" yang diambil dari sumber aslinya [1].

Dalam artikel ini, saya ingin menggaris bawahi etika komunikasi mahasiswa terhadap dosen seperti tercantum pada poin C. Satu kata untuk menggambarkan etika mahasiswa terhadap dosen adalah "santun".

Arti santun menurut KBBI

san.tun:

  1. (adjektiva) halus dan baik (budi bahasanya, tingkah lakunya); sabar dan tenang; sopan
  2. (adjektiva) penuh rasa belas kasihan; suka menolong

Arti santun menurut saya

Santun menurut saya harus mencakup setidaknya tiga hal berikut:

  1. Menggunakan jalur dan bahasa resmi.
  2. Jalur resmi: Telfon, email kampus, dan SMS (bukan WA, facebook)
    Bahasa resmi: Bahasa Indonesia (bukan jawa, Inggris)
  3. Mengkonfirmasi segala percakapan dan instruksi
  4. Contoh:
    Dosen: Gunakan metode A dan laporkan hasilnya minggu depan senin 30 Agustus 2021
    Mahasiswa: Baik Bapak, saya akan melakukan metode A dan melaporkan hasilnya senin 30 Agustus 2021
  5. Memperhatikan waktu komunikasi, termasuk segera membalasnya jika butuh balasan
  6. Butuh balasan ditandakan dengan: kalimat tanya, perintah, permohonan, dll.

Perkecualian untuk kasus-kasus di atas tentunya dengan seizin dosen dan kedua belah pihak. Misalnya dosen telah mengizinkan mahasiswa untuk mengontaknya via (Facebook) messenger atau (Google) chat.

Khusus saya

Cara terbaik mengontak saya adalah dengan email. Waktu tidak masalah bagi saya. Anda bisa mengirim email ke saya kapan saja. Orang terbaik menurut saya adalah orang yang paling cepat membalas email.

Penutup

Panduan ini tidak hanya berlaku untuk mahasiswa-dosen, bisa diaplikasikan pada kasus lainnya.

Referensi: 

[1] https://www.its.ac.id/ppid/wp-content/uploads/sites/68/2021/02/15.-Peraturan-Rektor-Nomor-15-Tahun-2019-ttg-Kode-Etik-Mahasiswa.pdf

Monday, September 06, 2021

Mengundurkan Diri Itu Bukan Perbuatan Tercela

Saat saya bekerja di pabrik dulu, suatu kali pernah (ibu) sekretaris perusahaan mengundurkan diri. Ceritanya begini. Saat permintaan barang sedang tinggi-tingginya, Pak Direktur (aka sachou) meminta bu sekretaris ikut bekerja di lapangan (genba a.k.a. pabrik). Besoknya si ibu sekretaris langsung minta mengundurkan diri untuk bulan depannya. Alasannya sederhana: dia melamar kerja untuk pekerjaan administrasi, bukan untuk pekerjaan lapangan (genba).

Mirip dengan cerita di atas. Suatu ketika seorang adik kelas melamar  pekerjaan dosen di suatu perguruan tinggi. Setelah diterima, dia komplain karena diminta oleh kepala jurusan (kajur) untuk mengerjakan pekerjaan administrasi. Tak lama kemudian dia mengundurkan diri. Alasannya sederhana: dia melamar pekerjaan dosen, menjadi pengajar dan peneliti, bukan menjadi staf administrasi.

Dalam dua kasus di atas, hampir tidak ada pihak yang salah. Pak direktur mempekerjakan ibu sekretaris karena kekurangan tenaga kerja di lapangan. Di kasus kedua, Pak Kajur juga kekurangan tenaga administrasi (yang terampil) sehingga mempekerjakan dosen untuk pekerjaan administrasi. Dari kedua kasus, baik bu sekretaris maupun teman dosen sama sekali tidak salah. Juga, mereka sulit menolak pekerjaan yang bukan bidangnya karena statusnya sebagai karyawan pada tempat mereka bekerja. Mundur menjadi pilihan terbaik bagi keduanya.

Mundur juga bisa menjadi alasan yang logis ketika tidak setuju dengan suatu hal, misalnya ketika diharuskan untuk menginstall whatsapp (WA) untuk urusan kerja. Sangat tidak logis dan tidak etis menggunakan WA untuk urusan pekerjaan. Seorang teman pernah berujar, hari dimana dia diminta menginstall WA oleh atasannya, hari itu juga dia akan mengundurkan diri. Penggunaan WA dan sejenisnya di kantor saya sekarang ini dilarang, dan bisa fatal akibatnya bila ketahuan menggunakan aplikasi tsb di kantor.

Mengundurkan diri itu bukan perbuatan tercela. Perbuatan tercela itu seperti korupsi. 

Monday, August 30, 2021

Kenapa Harus Berlari...

Saat kerja di Jepang, saya sering dipanggil oleh Pak Bos. Saat awal-awal di panggil, saya mendatanginya dengan berjalan. Pak Bos menyuruh saya berlari. Kalau berjalan saya butuh 1 menit, dengan berlari saya hanya butuh 30 detik. Kalau dalam sehari saya dipanggil 30 kali, maka saya bisa hemat 30 x 30 detik, 900 detik alias 15 menit. Dengan asumsi kerja 20 hari per bulan, saya bisa menghemat 15 x 20 menit alias 300 menit alias 5 jam per bulan. Waktu tsb bisa saya gunakan untuk pekerjaan lainnya. Kenapa harus berlari? Ya karena berlari mempercepat pekerjaan dan menunjukkan semangat kita.

Dalam tulisan saya yang lain: What we can do in 10 minutes, orang lain bisa mentransformasikan ide menjadi "produk" dalam 10 menit. Diberikan waktu 300 menit akan menghasilkan 10 ide  --> 10 produk, untuk orang tersebut.

Ayo berlari...!

Monday, August 23, 2021

How-to: Install jedi-vim in python 2.7

Rationale:

  • Although nowadays python3 becomes standard, in some servers the default python is still python2.7 (mostly RHEL servers).
  • Using vim (or emacs) in remote works is a must. You may use GUI, but the setup is more complicated than CLI.
  • Using vim without plugins is hard. We should use a minimum number of plugins. The most important plugin is code completion.
  • Humans make errors inevitably. Code completion prevents typos.

Based on those rationales, this is one line command to install jedi-vim (including jedi itself!) in python 2.7.

git clone --recursive https://github.com/davidhalter/jedi-vim.git --branch 0.9.0 ~/.vim/bundle/jedi-vim
Note: you need to install vim-pathogen first to allow plugin installation via "bundle" directory.

Thursday, August 19, 2021

Kenapa Harus Meng-CC email ke Diri Sendiri

Salah satu budaya "aneh" orang Jepang yang akhir-akhir ini mulai saya tiru adalah meng-cc email ke diri sendiri.

Saat awal datang ke Jepang, saya merasa aneh saja ada orang mengemail ditujukan (CC, carbon copy) ke diri sendiri. Professor saya melakukannya. Professor-professor lain pun ternyata juga sama. Saat itu professor saya meminta saya meng-CC email ke diri saya setiap kali mengemail beliau, namun saya jarang melakukannya. Sepuluh tahun berlalu, kini kebiasaan itu menjadi wajib bagi saya.

Kenapa harus meng-cc email ke diri sendiri?

Agar kita tahu, apakah email kita sampai atau tidak. Seseorang mungkin akan berargumen, kalau tidak sampai pasti ada notifikasi. Bisa jadi benar, tapi bisa jadi tidak semua email provider memberikan notifikasi jika ada email yang bouncing (tidak terkirim karena alasan teknis, misal alamat tidak tersedia, atau email tujuan penuh, atau alasan yang lain). Kalaupun toh pasti ada notifikasi jika tidak terkirim, tetap kita dapat mengambil manfaat, yakni lamanya waktu pengiriman. Alih-alih mengirim email dua kali (ganda), kita bisa mengecek apakah email yang kita kirim sudah diterima atau belum.

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, August 11, 2021

Kenapa Harus Email, bukan WA

TL;DR: Kalau saya jadi CE0, dan ada karyawan saya yang menggunakan WA untuk urusan kerja, akan saya pecat saat itu juga... :D

Pada tulisan ini saya berargumen bahwa komunikasi untuk urusan pekerjaan seharusnya (dan umumnya) dilakukan menggunakan email, bukan WA (WhatsApp), messenger, chat dan sejenisnya. Di tempat kerja saya kebetulan tidak ada yang memakai WA; LINE kabarnya juga sudah dilarang sejak beberapa tahun yang lalu. Sebagai tambahan, penggunaan aplikasi zoom juga dilarang karena faktor keamanan.

Sebelum membaca tulisan ini ada baiknya anda membaca tulisan berikut: WA: Pemborosan Waktu..?

Kenapa harus menggunakan Email: 

  1. Terekam, recorded
  2. Salah satu fitur email yang paling powerful adalah "terekam". Apa isi email, kapan terkirim, dari siapa, ke siapa, semua ada. Bahkan email pertama yang saya buat waktu SMP masih bisa saya baca sampai sekarang. WA? Bisa! Tapi saya tidak tahu apa isi WA pertama saya. Anda tentu paham maksud saya, dua-duanya memiliki fitur terekam, tapi bak langit dan bumi.
  3. Searchable, ketercarian
  4. Fitur kedua yang amat saya sukai dari email: ketercarian. Data teks adalah data yang sangat kompleks tapi fleksibel. Kita bisa mencari apa saja yang pernah masuk ke email kita. WA? Bisa juga, selama belum dihapus, belum ganti hape, dan belum ganti nomor.
  5. Per topik
  6. Pentingnya menggunakan email adalah bisa berdiskusi per topik. Ada yang  mengirim email dengan subjek tertentu dan kita balas (Re:XXX). Berapapun panjang dan lama diskusi tersebut tidak masalah. Ini akan menjadi masalah dengan WA dengan layar kecil, ketercarian dan rekaman yang terbatas.
  7. Universal
  8. Email itu universal dan cross-platform, tidak di monopoli oleh perusahaan tertentu. Anda pakai yahoo, saya pakai gmail, tidak menjadi masalah, masih bisa berkirim email. Beda dengan WA, LINE, messenger, dan sejenisnya yang hanya berjalan pada platform yang sama.
  9. Email menempel pada akun, bukan nomor HP
  10. Kelebihan email selanjutnya adalah bahwa dia adalah akun independen, tidak menempel pada nomor HP. Nomor HP bisa digunakan untuk pengamanan ganda. Berbeda dengan WA yang menempel pada nomer HP. Jika ganti nomor kita harus mentransfer akun WA ke nomor baru. Jika tidak, by default, prinsipnya, ganti nomor ganti WA.

Itulah beberapa alasan kenapa harus menggunakan email untuk komunikasi tulisan dalam urusan pekerjaan. Lebih khusus lagi, kita seharusnya menggunakan email kerja (kantor) untuk urusan pekerjaan, bukan email personal atau individu. Tempat kita bekerja menyediakan email kantor untuk urusan pekerjaan (tidak berlaku jika kantor tidak menyediakan). Sampai sekarang pun saya tidak tahu email lain atasan saya selain email kantor (dan Slack!).

Semoga semakin banyak orang yang "hijrah" dan "bertobat" setelah membaca tulisan ini: tidak memakai WA lagi.

Jika tidak setuju dengan argumen saya ini, tulis alasan anda dan beritahu saya (setidaknya URLnya) melalui komen di bawah ini.

Wednesday, August 04, 2021

Extracting Emobase Feature Using Python-Opensmile under Windows (WSL)

This article documents my steps to extract acoustic features with "emobase" configuration on opensmile-python under Windows. I used WSL (Window Sub-System for Linux) with Ubuntu Latest (20.04). Click each image for larger size and clarity.

0. Windows Version

Here is my Windows version in which I experimented with. Other versions may give errors. To show your version, simply press the Windows button and type "about PC".
Edition	        Windows 10 Pro
Version	        20H2
Installed on	‎4/‎2/‎2021
OS build        19042.1083
Experience      Windows Feature Experience Pack 120.2212.3530.0

1. Activate WSL2

Here are the steps to activate WSL2 on Windows 10. WSL2 only works on Windows 10 version 1903 or higher, with Build 18362 or higher. For the older version, you can use WSL instead of WSL2.
a. Activate WSL using PowerShell. Press the Windows key, and enter the following.
 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 
b. Install Linux kernel update package. Download from here.
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
Double click and install that .msi package.
Select WSL2 as default.
 wsl --set-default-version 2 

You need to ensure the wsl version after installing Ubuntu distro below.

2. Install Ubuntu

Press windows key and type "Microsoft Store". I choose Ubuntu (latest) instead of Ubuntu 20.04 or other versions. See image below; I already installed it.


Ensure that Ubuntu uses WSL2 as default. Check-in PowerShell with the following command (wsl -l -v).

Then click launch Ubuntu from the previous image/step, or you can type "Ubuntu" di search dash.
When launching Ubuntu for the first time, you will be prompted for the user name and password. Remember this credential. See the image below for example.

3. Install Python and pip

In Ubuntu do/type
 sudo apt update && sudo apt -y upgrade 
Enter your password. Type "y" when it is prompted.
Install Python using apt. I chose python3.7 as follows.
 sudo apt install python3.7-full 
Type "y" when it asked. See the image below for reference.

Test if the installation is successful. Type "python3.7" in Ubuntu to enter python3.7 console.

Next, we need pip to install python packages. Hence, we need to install pip first as follows.
 python3.7 -m ensurepip --upgrade 

4. Install Python-Opensmile

Since this version of python in Ubuntu is already equipped with pip, we can directly use it to install opensmile.
 python3.7 -m pip install opensmile 
See the image below for a reference.

Same as previous step, I installed IPython for my convenience. You may also need to install numpy, scipy, and matplotlib.
 python3.7 -m pip install ipython numpy scipy audb

We also need to install sox since it is required by opensmile
 sudo apt install sox 

5. Extract Emobase Feature

Now is the time to use opensmile. First, open IPython console for this python3.7.
 python3.7 -m IPython 
Import Opensmile and download emodb dataset with a specific configuration.
See the image below for your reference. Skip the parts with red cross since they contain errors (I forgot to add a comma between arguments).

Configure opensmile to extract EMOBASE feature.
smile = opensmile.Smile(
    feature_set=opensmile.FeatureSet.emobase,
    feature_level=opensmile.FeatureLevel.Functionals,
)
smile.feature_names
See image below for your reference. You can change feature_level value to "opensmile.FeatureLevel.LowLevelDescriptors" if you want LLD (LowLevelDescriptors, extracted per frame) instead of functionals (statistics of LLD). The number of emobase functional is 988 features [len(smile.features_names)].

Finally, we extract acoustic features based on these configuration.
smile.process_signal(
    signal,
    sampling_rate
)
See below image for your reference.


That's all. Usually, I save the extracted acoustic features in other format like numpy .npy files or .csv files. From my experience, this is my first extraction of emobase feature set. Previously I used gemaps, egemaps, compare2016, and emo_large configuration. Let see if this kind of feature set has advantages over others. Although intended for Windows 10, this configuration may also works for other distribution. Still, I prefer to use Ubuntu since the process is simple and straightforward. No need to set WSL2 and other things just pip and pip.

The full script to extract emobase functional features from all utterances in emodb dataset is given below. Please note that it takes a long time to process since it will download all utterances in emodb dataset according to "audb" format and extract acoustic features from them.

Example 1: Extract emobase feature from an excerpt of emodb dataset and save it as an .npy file.

import os
import time

import numpy as np
import pandas as pd

import audb
import audiofile
import opensmile

sr = 16000

# if you change code below, it will download the dataset again 
db = audb.load(
    'emodb',
    version='1.1.1',
    format='wav',
    mixdown=True,
    sampling_rate=sr,
    full_path=False,
    verbose=True,
)

smile = opensmile.Smile(
    feature_set=opensmile.FeatureSet.emobase,
    feature_level=opensmile.FeatureLevel.Functionals,
)

# If you run this program for the second time
# comment the whole db above and change db.root and db.files to (uncomment)
# db_root = audb.cached().index[0]
# db_files = pd.read_csv('/home/bagus/audb/emodb/1.1.1/fe182b91/db.files.csv')['file']

feats = []
for i in db.files:
    file = os.path.join(db.root, db.files[i])
    signal, _ = audiofile.read(
            file,
            always_2d=True,
            )
    feat = smile.process_signal(
            signal,
            sr
            )
    feats.append(feat.to_numpy().reshape(-1))

# this will save all emodb emobase feature in a single npy file
# make sure you have 'data' dir first
np.save('data/emodb_emobase.npy', feats)
  

Example 2: Extract emobase features from files under a directory ("ang") and save it in a csv file.
import os
import opensmile
import numpy as np
import glob
#from scipy.io import wavfile

# jtes angry path, 50 files
data_path ="/data/jtes_v1.1/wav/f01/ang/"
files = glob.glob(os.path.join(data_path, "*.wav"))
files.sort()

# initiate opensmile with emobase feature set
smile = opensmile.Smile(
    feature_set=opensmile.FeatureSet.emobase,
    feature_level=opensmile.FeatureLevel.Functionals,
)
smile.feature_names

# read wav files and extract emobase features on that file
feat = []

for file in files:
    print("processing file ... ", file)
    #sr, data = wavfile.read(file)
    #feat_i = smile.process_signal(data, sr)
    feat_i = smile.process_file(file)
    feat.append(feat_i.to_numpy().flatten())

# save feature as a csv file, per line, with comma
np.savetxt("jtes_f01_ang.csv", feat, delimiter=",")

  


If you face problems during following this article, let me see in comments below.

Reference:
[1] https://docs.microsoft.com/en-us/windows/wsl/install-win10
[2] https://audeering.github.io/opensmile-python/usage.html

Monday, August 02, 2021

Python: memanggil nama variabel secara dinamis dalam loop for

Misalkan kita punya data seperti ini:
a_1 = 1
a_2 = 2
a_3 = 3
Kemudian kita ingin memanggi variabel tersebut secara berurutan dalam loop for. Karena nama-nama variabel tersebut mirip dan hanya berbeda karakter terakhir saj, maka pemanggilan variabel tersebut bisa kita permudah, misalnya dengan cara "a_[i}", dimana "i" adalah indeks mulai dari i. Saya menggunakan kurung kurawal karena implementasi pada teknik yang dipakai juga seperti itu. Pemanggilan nama variabel secara dinamis seperti ini dalam Python bisa menggunakan fungsi "globals()" seperti berikut.
for i in range(1,4):
    print(globals()[f"a_{i}"])
Outputnya adalah nilai a_1, a_2, dan a_3 secara berurutan.
1
2
3

Perbedaan dengan list biasa 

Untuk menampilkan output di atas bisa saja dengan teknik berikut.
for i in [a_1, a_2, a_3]:
    print(i)
Namun tujuan saya bukan output, tapi proses pemanggilannya. Dalam banyak hal, kita butuh memanggil nama variabelnya saja dan mengakses anggota kelasnya. Misal jika variabel "a_" memiliki child (anak) .panjang, .lebar, .tinggi, maka metode tsb (methods dalam pengertian pemrograman) bisa dipanggil dengan teknik nama variabel dinamis di atas. Akan sulit jika memakai list biasa.

Thursday, July 08, 2021

Japanese sentiment analysis

Make virtual environment:
 python3.6 -m venv hf-venv # hf-venv: huggingface-virtualenv 
Activate virtualenv:
 source hf-ven/bin/activate 
Install Huggingface's Transformer with torch:
 python3.6 -m pip install transormer[torch] 
Install other dependencies (required if you don't have them)
 python3.6 -m pip install --user -U fugashi ipadic pillow 
Try to make Japanese sentiment analysis as follows.
>>> from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline
>>> model = "daigo/bert-base-japanese-sentiment"
>>> tokenizer = "daigo/bert-base-japanese-sentiment"
Run it! Output:
>>> print(pipeline("sentiment-analysis", model=model, tokenizer=tokenizer, return_all_scores=True)("家で見守ってます")) 
[[{'label': 'ポジティブ', 'score': 0.9886383414268494},
  {'label': 'ネガティブ', 'score': 0.01136170607060194}]]
List of installed packages
(hf-venv) bagus@qc2gtr3:~$ pip freeze
certifi==2021.5.30
chardet==4.0.0
click==8.0.1
dataclasses==0.8
filelock==3.0.12
fugashi==1.1.0
huggingface-hub==0.0.12
idna==2.10
importlib-metadata==4.6.1
ipadic==1.0.0
joblib==1.0.1
numpy==1.19.5
packaging==21.0
Pillow==8.3.1
pyparsing==2.4.7
PyYAML==5.4.1
regex==2021.7.6
requests==2.25.1
sacremoses==0.0.45
six==1.16.0
tokenizers==0.10.3
torch==1.9.0
tqdm==4.61.2
transformers==4.8.2
typing-extensions==3.10.0.0
urllib3==1.26.6
zipp==3.5.0

Troubleshooting when there is not enough (ram) memory to install torch

Since torch is big enough (831 MB for v1.9) there is not enough memory in my home directory to install. As an alternative, I made another temporary directory for the cache and pointed it out to that directory when installing torch.
$ pip cache dir # works on pip==21.1.3
/home/bagustris/.cache/pip
$ mkdir -p /media/bagustris/atmaja/tmp
$ TMPDIR=/media/bagustris/atmaja/tmp/ pip install --cache-dir=/media/bagustris/atmaja/tmp/ transformers[torch]

Monday, June 28, 2021

Resources for academic writing: word concordance

When I am writing an academic paper, for a journal, or a conference, I used several tools to find the most precise words. Among these, the following are the most I used ones.
Among those resources, the Mendeley is the most I used since it used the words in my field and can be used offline on my local PC. This technique is also intended to avoid the creation of jargon or our own words. Instead of creating "new words", it is better to follow the words already used by other researchers. Below is my search for the word "splitting" that leads to concord with "into".



Abstract Generated by Transformer
I tried Huggingface's Transformer once. Instead of generating word concordance, they complete my abstract given only one sentence.


Saturday, June 26, 2021

Ubuntu on Mac: Home, End, PgUp, PgDn

Here the equivalent keyboard shorctus for Ubuntu on Macbook (it also works for OSX).
Home: Fn + Left Arrow
End: Fn + Right Arrow
Page Up: Fn + Up Arrow
Page Down: Fn + Down Arrow
That's all. Tested on: MBP Mid 2012, Ubuntu 16.04.07.

Tuesday, June 22, 2021

Sympy: Menyelesaikan Persamaan Matrik

Sympy melakukan proses komputasi yang tidak bisa dilakukan oleh Numpy: simbolik. Misal kita punya persamaan berikut

$$2.10^{6}\left[\begin{array}{crr} 1 & -1 & 0 \\ -1 & 2 & -1 \\ 0 & -1 & 1 \end{array}\right]\left\{\begin{array}{l} 0 \\ u_{2} \\ u_{3} \end{array}\right\}=\left[\begin{array}{c} F_{1}+1500 \\ 9000 \\ 7500 \end{array}\right] $$
Dalam bentuk gambar, persamaan di atas dapat ditampilkan di bawah ini (rendering kode Latex/mathjax di atas kadang Luama....).
Untuk menyelesaikan persamaan di atas (u1=0), maka solusi dengan Sympy adalah seperti kode di bawah ini:
from sympy import *

# buat symbol
u2, u3, F1 = symbols('u2 u3 F1')

# matrik sebelah kiri (left-hand)
K = Matrix([[ 1, -1, 0], [-1, 2, -1], [0, -1, 1]]) 
Ke1 = 2e6*K
U = Matrix([0, u2, u3]).reshape(3,1)

# matrik sebelah kanan
F = Matrix([F1+1500, 9000, 7500])

# selesaikan: cari u2, u3, dan F1
sol = solve(Ke1*U-F, (u2, u3, F1))


Jika dijalankan, hasilnya adalah sebagai berikut.
print(sol)
{u2: 0.00825000000000000, u3: 0.0120000000000000, F1: -18000.0000000000}

Monday, June 21, 2021

Numpy: Broadcasting

Konsep python yang agak susah dipahami adalah operasi broadcasting. Operasi broadcasting merupakan "menyebar" pesan ke seluruh elemen matrik. Contoh sederhana, matrik c saya tambahkan dengan '5', maka semua elemen dalam matrik c akan ditambah dengan nilai 5. Operasi ini, sesuai konsep vektorisasi Numpy, akan jauh lebih cepat dari loop `for'. Syarat operasi broadcasting ini adalah setidaknya harus ada kompatibilitas antar aksisnya, bisa kolomnya, bisa barisnya, atau skalar. Misalnya matrik c  dengan ukuran (3, 3) bisa kita tambah dengan [1, 2, 3] tapi tidak dengan [1, 2, 3, 4].
>>> c = np.array([[ 5,  8, 11],
      [ 6,  9, 12],
      [ 7, 10, 13]])
>>> c +  [1, 2, 3]  # bisa juga dengan list langsung
array([[1,  5,  9],
      [ 2,  6, 10],
      [ 3,  7, 11]])
>>> c + np.array([1, 2, 3, 4])                
------------------------------------------
ValueError   Traceback (most recent call last)
< ipython-input-42-d334d3cf449e> in < module >
----> 1 c + np.array([1, 2, 3, 4])

ValueError: operands could not be broadcast together
with shapes (3,3) (4,)
Contoh lain adalah penjumlahan vektor kolom [1, 2, 3] dengan vektor baris [1, 2, 3]. Contoh ini menunjukkan betapa menariknya operasi broadcasting, kolom dijumlah dengan baris. Pada kolom pertama hasilnya menjadi [2, 3, 4], tiap elemen vektor kolom ditambah 1. Pada kolom 2 tiap elemen vektor kolom ditambah 2, dan pada elemen 3 tiap elemen vektor kolom ditambah dengan 3.
>>> np.array([1, 2, 3])[:, np.newaxis]+np.array([1, 2, 3])                                                                            
array([[2, 3, 4],
       [3, 4, 5],
       [4, 5, 6]])
Tulisan ini melengkapi tulisan ini.

Thursday, June 10, 2021

Membatasi Pen Tablet pada Satu Monitor

Skenario

Menggunakan dua atau lebih monitor menjadikan kita produktif, namun dengan menggunakan pen tablet (misal saya menggunakan Huion 950P) pada dua monitor sangat mengganggu. Pen tablet akan lari kesana kesini karena perbedaan ruang di pad yang kecil dan di dua monitor yang cukup besar. Hal ini berakibat kepada ketidaknyamanan ketika menulis dengan menggunakan aplikasi whitboard seperti xournal. Berikut adalah solusi membatasi pen tablet (khususnya gerakan stylus) hanya pada satu monitor saja di Ubuntu 20.04. 


Pilih monitor mana 

Perintah di terminal adalah
bagus@m049:tmp$ xrandr
Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 16384 x 16384
HDMI-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 698mm x 393mm
   1920x1080     60.00*+  50.00    59.94  
   1920x1080i    60.00    50.00    59.94  
   1680x1050     59.88  
   1280x1024     75.02    60.02  
   1440x900      74.98    59.90  
   1280x960      60.00  
   1152x864      75.00  
   1280x720      60.00    50.00    59.94  
   1440x576      50.00  
   1024x768      75.03    70.07    60.00  
   832x624       74.55  
   800x600       75.00    60.32    56.25  
   720x576       50.00  
   720x480       60.00    59.94  
   640x480       75.00    66.67    60.00    59.94  
   720x400       70.08  
DP-1 connected primary 1920x1080+1920+0 (normal left inverted right x axis y axis) 598mm x 336mm
   1920x1080     60.00*+  74.97    50.00    59.94  
   1920x1080i    60.00    50.00    59.94  
   1600x1200     60.00  
   1680x1050     59.95  
   1280x1024     75.02    60.02  
   1440x900      74.98    59.89  
   1280x960      60.00  
   1152x864      75.00  
   1280x720      60.00    50.00    59.94  
   1024x768      75.03    60.00  
   832x624       74.55  
   800x600       75.00    60.32  
   720x576       50.00  
   720x480       60.00    59.94  
   640x480       75.00    60.00    59.94  
   720x400       70.08  
HDMI-2 disconnected (normal left inverted right x axis y axis)
Pada kasus di atas, saya memilih DP-1 sebagai monitor untuk pen stylus. Monitor ini menggunakan koneksi display port sehingga namanya DP-1. 

Pilih divais mana 

Perintah di terminal adalah
bagus@m049:tmp$ xinput
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ Lite-On Technology Corp. USB Multimedia Keyboard Consumer Control	id=11	[slave  pointer  (2)]
⎜   ↳ USB Optical Mouse                       	id=13	[slave  pointer  (2)]
⎜   ↳ Tablet Monitor stylus                   	id=15	[slave  pointer  (2)]
⎜   ↳ Tablet Monitor Dial pad                 	id=16	[slave  pointer  (2)]
⎜   ↳ Tablet Monitor Touch Strip pad          	id=17	[slave  pointer  (2)]
⎜   ↳ Tablet Monitor Pad pad                  	id=18	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Power Button                            	id=8	[slave  keyboard (3)]
    ↳ Sleep Button                            	id=9	[slave  keyboard (3)]
    ↳ Lite-On Technology Corp. USB Multimedia Keyboard	id=10	[slave  keyboard (3)]
    ↳ Lite-On Technology Corp. USB Multimedia Keyboard System Control	id=12	[slave  keyboard (3)]
    ↳ Lite-On Technology Corp. USB Multimedia Keyboard Consumer Control	id=14	[slave  keyboard (3)]
Output yang penting dari output perintah di atas adalah "id". Saya memilih id 15-18 karena itu adalah id pen tablet saya. 

Map ke satu monitor 

Langkah terakhir adalah mapping. Perintahnya adalah berikut
bagus@m049:ptxconf$ xinput map-to-output 15 DP-1
bagus@m049:ptxconf$ xinput map-to-output 16 DP-1
bagus@m049:ptxconf$ xinput map-to-output 17 DP-1
bagus@m049:ptxconf$ xinput map-to-output 18 DP-1
Selesai! Sekarang saya bisa dengan leluasa menggunakan stylus di satu monitor untuk keperluan kuliah online. Berikut contohnya!




Konfigurasi Tambahan dan Menambahkan pada start up application

Agar setting di atas tetap alias tidak berubah pada setiap kali reboot, peintah mapping perlu kita tambahkan pada start up application. Dari empat perintah mapping di atas, perintah mapping stylus merupakan yang utama dan itu saja yang sebenarnya perlu ditambahkan.
 
Buat file 950p.sh di direktori /home/namamu dan isi dengan teks berikut.
MONITOR="DP-1"
PAD_NAME='Tablet Monitor'
ID_STYLUS=$(xinput | grep "Tablet Monitor stylus" | cut -f 2 | cut -c 4-5)
xinput map-to-output $ID_STYLUS $MONITOR

# konfigurasi tambahan untuk Krita, Xournalpp
xsetwacom set "$PAD_NAME Pad pad" button 1 key Ctrl z # undo
xsetwacom set "$PAD_NAME Pad pad" button 2 key Ctrl y # redo
xsetwacom set "$PAD_NAME Pad pad" button 3 key Ctrl shift p # pen
xsetwacom set "$PAD_NAME Pad pad" button 8 key Ctrl shift e # eraser
xsetwacom set "$PAD_NAME Pad pad" button 9 key Ctrl shift h # highlight
xsetwacom set "$PAD_NAME Pad pad" button 10 key Ctrl 1 # shape recognizer
xsetwacom set "$PAD_NAME Pad pad" button 11 key Ctrl shift r # select rect.
xsetwacom set "$PAD_NAME Pad pad" button 12 key Ctrl d # new page after

 
Kemudian, tambahkan perintah pada startup application seperti berikut.
Startup application > Add > Command > huion950p.sh

Bonus

Agar ukuran papan tulis bisa penuh satu monitor, saya membuat 'page' custom di aplikasi whiteboard sesuai ukuran monitor saya yakni 27 inchi (598mm x 336mm). Ukuran tsb juga didapatkan dari output perintah xrandr. Untuk tingginya saya kurangi sedikit karena ada toolbar milik xournal. Sehingga,
width = 59 cm, dan
height = 26 cm.

Wednesday, June 09, 2021

Eight Steps to Structuring an Academic Paper

The following tips are my version of "11 steps to structuring a science paper". I revised it from 11 to 8 because of the following reasons.
  1. It makes sense to draft the topic (concretely a title) before starting to structuring the paper.
  2. After drafting a title, it is necessary to draft an abstract along with the keywords to plan what we want to write. These abstract and keywords will guide and give an overview of the overall content of the paper.
  3. I dropped the writing reference. It should be done automatically via BibTeX. Acknowledgment is not necessary unless your research receive funding or important helps from other researchers/agencies.
Here you are.


Note after finishing writing a compelling introduction, you didn't finish your paper yet. You need to revise it many times, mine usually about ten times. In revising, you should follow the order of your paper, from Title to Reference.


Reference: 
 [1] https://www.elsevier.com/connect/11-steps-to-structuring-a-science-paper-editors-will-take-seriously

Friday, June 04, 2021

Python: List Comprehension

Salah satu fitur di pemrograman Python yang saya suka dan sering pakai adalah list comprehension. Fitur ini menyederhanakan "for" loop dalam satu baris. Berikut contohnya.

Saya punya dua vektor A dan B. Saya ingin mencari dimana kemunculan vektor B dalam vektor A. 

a = np.array([1, 2, 3, 4, 5, 6])
b = np.array([2, 3, 4])
Dengan contoh di atas, jawaban atas pertanyaan saya adalah [1, 2, 3]; posisi/indeks dimana vektor B muncul di vektor A. Solusi pertama dengan "for" loop sebagai berikut:
import numpy as np
for i in b: 
    print(np.where(a == i)) 
Solusi kedua dengan List comprehension seperti berikut (baris kedua merupakan output).
In [26]: [np.where(a==x) for x in b]                                            
Out[26]: [(array([1]),), (array([2]),), (array([3]),)]
Cukup simpel dan intuitif.