08 Apr 2020

Histogram is also a bar type graph chart. The main different between Bar Chart and Histogram Chart are:
Bar Chart for compare numeric data among Categories.
Histogram Chart for compare numeric data in a Category which is distributed into ‘bin’ or ‘bucket’. The term of ‘bin’ in here is a group data.

For example:
you have 24 population in a town with age below:

5,6,7,5,6,4,10,15,14,13,30,35,23,36,45,49,40,51,55,53,60,65,66,70

and you want to visualize it into a graph.

Let’s try.
Open your python IDE and type the code below.

import matplotlib.pyplot as plt
age=[5,6,7,5,6,4,10,15,14,13,30,35,23,36,45,49,40,51,55,53,60,65,66,70]
plt.hist(age)
plt.show()

hist01
hist02

By default, this data will be distributed into 10 bins by matplotlib (see, there are 10 bars).
Bar 1 (0-11 years), 7 persons, 5,6,7,5,6,4,10.
Bar 2 (12-15 years), 3 persons, 15,14,13.
and so on.

You can add border to differentiate the bar.

import matplotlib.pyplot as plt
age=[5,6,7,5,6,4,10,15,14,13,30,35,23,36,45,49,40,51,55,53,60,65,66,70]
plt.hist(age,edgecolor='black')
plt.show()

hist03
hist04

And add other accessories.
import matplotlib.pyplot as plt

age=[5,6,7,5,6,4,10,15,14,13,30,35,23,36,45,49,40,51,55,53,60,65,66,70]
plt.hist(age,edgecolor='black')
plt.grid(linestyle='dotted',axis='y')
plt.xlabel('Age')
plt.ylabel('Population')
plt.title('Population Distribution by Age')
plt.show()

hist05
hist06
You specify the distribution based on your requirement.
For example, you set the bin into 5 not 10.
Then the range for the bin will be wider because it is distributed into smaller criteria.
Bar 1, the data increase from 7 to 10.

import matplotlib.pyplot as plt
age=[5,6,7,5,6,4,10,15,14,13,30,35,23,36,45,49,40,51,55,53,60,65,66,70]
plt.hist(age,bins=5,edgecolor='black')
plt.grid(linestyle='dotted',axis='y')
plt.xlabel('Age')
plt.ylabel('Population')
plt.title('Population Distribution by Age')
plt.show()

hist08

You can change the bar color.

import matplotlib.pyplot as plt
age=[5,6,7,5,6,4,10,15,14,13,30,35,23,36,45,49,40,51,55,53,60,65,66,70]
plt.hist(age,bins=5,edgecolor='black',color='#30C738')
plt.grid(linestyle='dotted',axis='y')
plt.xlabel('Age')
plt.ylabel('Population')
plt.title('Population Distribution by Age')
plt.show()

hist10
hist11

You can specify also the bin size.

import matplotlib.pyplot as plt
age=[5,6,7,5,6,4,10,15,14,13,30,35,23,36,45,49,40,51,55,53,60,65,66,70]
bindata=[0,15,30,40,50,70]
plt.hist(age,bins=bindata,edgecolor='black',color='#30C738')
plt.grid(linestyle='dotted',axis='y')
plt.xlabel('Age')
plt.ylabel('Population')
plt.title('Population Distribution by Age')
plt.show()

hist12
hist13

by Taufan Lubis on 08 Apr 2020 01:28 PM

07 Apr 2020

In this tutorial, I will show you how to create Bar graph. Many people use Bar graph because it’s easy to presenting a comparison between 1,2 or 3 value. More than that it’s not recommended because it will be difficult to show the comparison.

Bar Chart can Vertical or Horizontal, depend on what you need.

Single Bar Vertical
Let’s try with Single bar vertical. Type the code below and run in your python text editor.

import matplotlib.pyplot as plt
month=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
revenue=[100,110,120,100,90,115,70,90,140,100,110,120]
plt.bar(month,revenue) 
plt.title('Simple Bar Graph') 
plt.xlabel('Month') 
plt.ylabel('Revenue (K)USD')
plt.grid(linestyle='dotted',axis='y')
plt.legend() 
plt.show()

bar01
bar02

Grid()
You can change the grid style, display only 1 axis (x or y) or display both.
linestyle available: ‘-‘, ‘–‘, ‘-.’, ‘:’, ‘None’, ‘ ‘, ”, ‘solid’, ‘dashed’, ‘dashdot’, ‘dotted’
axis=’y’ → line from Y
axis=’x’ → line from X

Single Bar Horizontal
You can also visualize the bar by horizontal.

import matplotlib.pyplot as plt
month=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
revenue=[100,110,120,100,90,115,70,90,140,100,110,120]
plt.barh(month,revenue)
plt.title('Simple Bar Horizontal')
plt.xlabel('Month')
plt.ylabel('Revenue (K)USD')
plt.grid(linestyle='dotted',axis='x')
plt.legend()
plt.show()

bar03
bar04

Combine Bar and Plot

import matplotlib.pyplot as plt
month=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
revenue=[100,110,120,100,90,115,70,90,140,100,110,120]
forcast=[95,100,110,100,95,120,70,95,135,80,110,120]
budget=[90,80,110,90,100,120,70,100,130,100,90,100]
plt.bar(month,revenue,label='Revenue')
plt.plot(month,forcast,marker='o',color='black',label='Forcast')
plt.plot(month,budget,marker='o',color='red',label='Budget')
plt.title('Simple Bar Graph')
plt.xlabel('Month')
plt.ylabel('Revenue (K)USD')
plt.grid(linestyle='dotted',axis='y')
plt.legend()
plt.show()

bar05
bar06

Multiple Bars
If you want to do multiple bar, you can do it by manipulating the thickness and the position of the bar charts.

import matplotlib.pyplot as plt
month=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
revenue=[100,110,120,100,90,115,70,90,140,100,110,120]
forcast=[95,100,110,100,95,120,70,95,135,80,110,120]
budget=[90,80,110,90,100,120,70,100,130,100,90,100]
plt.bar(month,revenue,label='Revenue',width=0.7)
plt.bar(month,forcast,label='Forcast',width=0.4)
plt.bar(month,budget,label='Budget',width=0.2)
plt.title('Simple Bar Graph')
plt.xlabel('Month')
plt.ylabel('Revenue (K)USD')
plt.grid(linestyle='dotted',axis='y')
plt.legend()
plt.show()

bar07
bar08

import matplotlib.pyplot as plt

import numpy as np
month=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
revenue=[100,110,120,100,90,115,70,90,140,100,110,120]
forcast=[95,100,110,100,95,120,70,95,135,80,110,120]
budget=[90,80,110,90,100,120,70,100,130,100,90,100]
fig=plt.figure()
ax=fig.add_axes([0.18,0.15,0.7,0.7])
x=np.array([0,1,2,3,4,5,6,7,8,9,10,11])
ax.bar(x+0.00,revenue,label='Revenue',width=0.25)
ax.bar(x+0.25,forcast,label='Forcast',width=0.25)
ax.bar(x+0.50,budget,label='Budget',width=0.25)
y_pos=[0.2,1.2,2.2,3.2,4.2,5.2,6.2,7.2,8.2,9.2,10.2,11.2]
plt.xticks(y_pos,month)
plt.title('Simple Bar Graph')
plt.xlabel('Month')
plt.ylabel('Revenue (K)USD')
plt.grid(linestyle='dotted',axis='y')
plt.legend()
plt.show()

bar09
bar10

The easy one, you can use python library, pandas.

import matplotlib.pyplot as plt
import pandas as pd
index=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
actual=[100,110,120,100,90,115,70,90,140,80,110,130]
forcast=[95,100,110,100,95,120,70,95,135,80,110,120]
budget=[90,80,110,90,100,120,70,100,130,100,90,100]
df=pd.DataFrame({'actual':actual,'forcast':forcast,'budget':budget},index=index)
ax=df.plot.bar()
plt.grid(linestyle='dotted',axis='y')
plt.xlabel('Month')
plt.ylabel('Revenue (K)USD')
plt.title('Bar Graph')
plt.show()

bar11
bar12

by Taufan Lubis on 07 Apr 2020 03:31 AM

27 Mar 2020

Matplotlib is a plotting library for python. Matplotlib was originally written by John D Hunter during his post-doctoral research in neurobiology to visualize electrocorticography (ECoG) data of epilepsy patients. Then Michael Droettboom lead the development project after John Hunter passed away in August 2012.
Matplotlib version 2.0.x support python version 2.7 – 3.6.
Starting 2020, Matplotlib does not support python 2 anymore.

Using Matplotlib with python is easy.

I will show you how to visualize a simple graph.
In this tutorial, I use IDLE as python editor.
If you don’t have it, you can install using command below from your Linux Terminal.
$ sudo apt-get install idle

Run the idle.
plot00

From menu, select File>New File to display the Editor.
Type the code below and press F5 to run the code.

import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[5,6,7,8]
plt.plot(x,y)
plt.show()

plot01plot02
You have your first graph with Matplotlib.
It’s easy, right?

Title, X label, Y label, Grid
Now, you can add more details like, graph title, label for X and Y and also Grid to your graph.

import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[5,6,7,8]
plt.plot(x,y)
plt.title('Simple Graph')
plt.xlabel('x series')
plt.ylabel('y series')
plt.grid()
plt.show()

plot03
plot04

Legend
Type the code below and run it.

import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[5,6,7,8]
x2=[1,2,3,4]
y2=[8,7,6,5]
plt.plot(x,y)
plt.plot(x2,y2)
plt.title('Simple Graph')
plt.xlabel('x series')
plt.ylabel('y series')
plt.grid()
plt.show()

plot05
plot06
If you have 2 plot in 1 graph, it’s difficult to justify which one represent which data.
That’s why you need ‘Legend’.

Type the code below and run.

import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[5,6,7,8]
x2=[1,2,3,4]
y2=[8,7,6,5]
plt.plot(x,y)
plt.plot(x2,y2)
plt.title('Simple Graph')
plt.xlabel('x series')
plt.ylabel('y series')
plt.grid()
plt.legend(['y=x','y2=x2'])
plt.show()

plot07
plot08
Now, the graph is easy to read.

The legend data should follow the sequence which plot that you will display first.
Since the plt.plot(x,y) is displayed first then in legend should be mentioned first, plt.legend([‘y=x’,’y2=x2′]).

How about if we change the sequence and we missed to revised the legend then the graph will be wrong.

plt.plot(x2,y2)
plt.plot(x,y)
...
...
plt.legend(['y=x','y2=x2'])

To avoid that happen, better we put the legend data directly on the plot function.
Type the code below and run.

import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[5,6,7,8]
x2=[1,2,3,4]
y2=[8,7,6,5]
plt.plot(x2,y2,label='y2=x2')
plt.plot(x,y,label='y=x')
plt.title('Simple Graph')
plt.xlabel('x series')
plt.ylabel('y series')
plt.grid()
plt.legend()
plt.show()

plot09
plot10
Now as you can see, although the y2=x2 is display first and the color is changed, but the legend is still correct.

Format String
You can change the marker, line and color of the plot using Format String.
Format = ‘[marker][line][color]’
For example, if you to change your plot to circle marker, line dash style and magenta color, the syntax will be:

o--b

Let’s try.

import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[5,6,7,8]
x2=[1,2,3,4]
y2=[8,7,6,5]
plt.plot(x,y,'o--m',label='y=x')
plt.plot(x2,y2,label='y2=x2')
plt.title('Simple Graph')
plt.xlabel('x series')
plt.ylabel('y series')
plt.grid()
plt.legend()
plt.show()

plot11
plot12
If you want your code to be more easier to read, you can use property like below:

import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[5,6,7,8]
x2=[1,2,3,4]
y2=[8,7,6,5]
plt.plot(x,y,color='m',linestyle='--',marker='o',label='y=x')
plt.plot(x2,y2,label='y2=x2')
plt.title('Simple Graph')
plt.xlabel('x series')
plt.ylabel('y series')
plt.grid()
plt.legend()
plt.show()

The result is the same, but code it’s easier to understand.
plot13
plot14

Use ready Style
There are available styles ready that you can use for your graph.
Type the code below and run

import matplotlib.pyplot as plt
plt.style.use('dark_background')
x=[1,2,3,4]
y=[5,6,7,8]
x2=[1,2,3,4]
y2=[8,7,6,5]
plt.plot(x,y,label='y=x')
plt.plot(x2,y2,label='y2=x2')
plt.title('Simple Graph')
plt.xlabel('x series')
plt.ylabel('y series')
plt.grid()
plt.legend()
plt.show()

plot16
plot17
You list down the available styles from matplotlib, so you can try which one that is fulfill your need.

>>> import matplotlib.pyplot as plt
>>> for item in plt.style.available:
print(item)
seaborn-muted
seaborn-deep
grayscale
ggplot
seaborn-dark-palette
seaborn-white
Solarize_Light2
fivethirtyeight
_classic_test
fast
bmh
seaborn
seaborn-bright
classic
seaborn-darkgrid
seaborn-dark
seaborn-ticks
seaborn-paper
seaborn-notebook
seaborn-poster
seaborn-pastel
seaborn-talk
seaborn-whitegrid
dark_background
tableau-colorblind10
seaborn-colorblind
>>>

Markers

character description
'.' point marker
',' pixel marker
'o' circle marker
'v' triangle_down marker
'^' triangle_up marker
'<' triangle_left marker
'>' triangle_right marker
'1' tri_down marker
'2' tri_up marker
'3' tri_left marker
'4' tri_right marker
's' square marker
'p' pentagon marker
'*' star marker
'h' hexagon1 marker
'H' hexagon2 marker
'+' plus marker
'x' x marker
'D' diamond marker
'd' thin_diamond marker
'|' vline marker
'_' hline marker

Line Styles

character description
'-' solid line style
'--' dashed line style
'-.' dash-dot line style
':' dotted line style

Colors

The supported color abbreviations are the single letter codes

character color
'b' blue
'g' green
'r' red
'c' cyan
'm' magenta
'y' yellow
'k' black
'w' white

 

by Taufan Lubis on 27 Mar 2020 07:14 AM

Slicing is accessing parts of array content.

The syntax is:
start:stop:step

x[1:5]      → display 1 until 5 → 1,2,3,4,5
x[5:]        → display all after 5 → 6,7,8,9
x[:6]        → display from beginning until 6 → 1,2,3,4,5,6,7,8,9
x[:]          → display all → 1,2,3,4,5,6,7,8,9
x[1:9:2]  → display between 1 to 9, step 2 → 2,4,6,8
x[-1]        → display last item → 9
x[-2]        → display 2nd item from the last → 8
x[:-3]      → display all except the 3 items. → 1,2,3,4,5,6
x[::-1]     → display all in reversed → 9,8,7,6,5,4,3,2,1
x[2::-1]   → display first 3 items, reversed → 3,2,1
x[:-4:-1]  → display the last 3 items, reversed → 9,8,7
x[-2::-1]  → display all except the 1 item, reversed → 8,7,6,5,4,3,2,1

Open your Linux Terminal and practice it.

$ python3
Python 3.6.9 (default, Nov 7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> x=np.array([1,2,3,4,5,6,7,8,9])
>>> x
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> x[1:5]
array([2, 3, 4, 5])
>>> x[5:]
array([6, 7, 8, 9])
>>> x[:6]
array([1, 2, 3, 4, 5, 6])
>>> x[:]
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> x[1:9:2]
array([2, 4, 6, 8])
>>> x[-1]
9
>>> x[-2]
8
>>> x[:-3]
array([1, 2, 3, 4, 5, 6])
>>> x[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1])
>>> x[2::-1]
array([3, 2, 1])
>>> x[:-4:-1]
array([9, 8, 7])
>>>

slicing01

by Taufan Lubis on 27 Mar 2020 07:13 AM

In this article, I will show you how to do basic operation in array.

>>> import numpy as np
>>> x=np.array([[1,2,3,4],[5,6,7,8]])
>>> x
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
>>> x.ravel()
array([1, 2, 3, 4, 5, 6, 7, 8])

ravel() function will create all array into 1 demensional array.

>>> x
array([[1, 2, 3, 4],
[5, 6, 7, 8]])

But the operation will not change the original array value.

>>> x.min()
1

Minimum data in the array

>>> x.max()
8

Maximum data in the array

>>> x.mean()
4.5

Average data in the array

>>> x.sum()
36

Total value in the array

>>> x.sum(axis=0)
array([ 6, 8, 10, 12])
>>> x.sum(axis=1)
array([10, 26])

math02

>>> np.sqrt(x)
array([[1. , 1.41421356, 1.73205081, 2. ],
[2.23606798, 2.44948974, 2.64575131, 2.82842712]])

Square root each data value in the array.

>>> y=np.array([[1,1,1,1],[1,1,1,1]])
>>> y
array([[1, 1, 1, 1],
[1, 1, 1, 1]])
>>> x+y
array([[2, 3, 4, 5],
[6, 7, 8, 9]])
>>> x-y
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> x*y
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
>>>

math01

by Taufan Lubis on 27 Mar 2020 07:13 AM

07 Mar 2020

Sejujurnya saya udah lama banget gak ngikutin perkembangan WordPress. Saya gak paham apa saja fitur-fitur barunya. Hanya sesekali (mungkin 1 atau 2 kali dalam 1 semester) saya login ke blog ini, ataupun ke Labana.ID.

Ketika login, saya melihat notifikasi di sekitar pojok kiri atas, ada beberapa update. Karena kebiasaan di Android “Update All”, di WordPress saya juga melakukan hal yang sama. Saya centang saja semua update Plugins, Themes dan WordPress nya sendiri.

Tapi saya jadi kaget sendiri ketika mau mengedit salah satu tulisan lama saya. Sekarang WordPress ternyata punya fitur semacam Medium. Anda bisa menulis langsung dalam mode “preview” dan disusun dalam mode blok-blok gitu, ala lego.

Agak janggal sih bagi saya. Karena saya termasuk rewel urusan ini. Saya harus tau persis kode HTML yang bisa dipakai kaya apa. Jadi bukan mode WYSIWYG gitu. Atau mungkin karena belum terbiasa aja kali ya.

Ya itu juga kenapa ada tulisan ini sekarang, biar nyobain nulis pake fitur baru blog ini. Pluas biar ada posting perdana di 2020 juga sih. Mudah-mudahan gak kaya kartu SIM Card ya, habis perdana terus buang.

by Okto Silaban on 07 Mar 2020 07:19 PM

19 Feb 2020

by Mahyuddin Susanto on 19 Feb 2020 09:49 AM

Hello world!




Mahyuddin Susanto

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

by Mahyuddin Susanto on 19 Feb 2020 08:42 AM

29 Jan 2020

Mau dibilang update, ya ... memang update sich. kwkwkw. Jadi, sebetulnya saya tidak ingin mencoba memasang pustaka YAZ di mesin yang saya gunakan saat ini. Malas. Namun, karena ada permintaan untuk recreate errors, jadinya, muncullah tulisan ini.

Ok, jadi kita mulai dengan mencari paket yang dibutuhkan untuk pustaka YAZ, di mesin GnU/Linux Fedora. Panduan saya, tetap dari tulisan saya sebelumnya :grin: Tulisan lama, tapi masih relevan. Adapun paket-paket aplikasi yang perlu kita pasang adalah:
  • php-pear;
  • yaz;
  • libyaz;
  • libyaz-devel;
  • libnet;
  • libnet-devel; terakhir
  • php-devel.
Untuk yang terakhir, dibutuhkan untuk mengkompilasi paket YAZ lewat perintah yang akan kita eksekusi, berikutnya, yang setelah kita pasang paket-paket tersebut di atas, pada terminal, masukkan perintah:
# pecl install yaz
Semoga tidak ada kesalahan dalam proses pemasangan, karena kalau sukses, nanti, pada akhir baris proses, muncul kalimat sebagai berikut:
Build process completed successfully
Installing '/usr/lib64/php/modules/yaz.so'
install ok: channel://pecl.php.net/yaz-1.2.3
configuration option "php_ini" is not set to php.ini location
You should add "extension=yaz.so" to php.ini
Lalu, masih sama seperti yang disebutkan dalam tulisan saya sebelumnya, tambahkan baris:
extension=yaz.so
dalam berkas php.ini. Lokasi berkas ini, kalau pada mesin saya, ada di dalam direktori /etc.

Gambar 1. Begini tampilannya kalau di mesin saya



Kalau sudah ditambahkan seperti ini, simpan hasil perubahannya, kemudian mula ulang dua layanan ini:
  1. httpd.service; dan
  2. php-fpm.service.
Setelah memula ulang, silahkan cek via php info, apakah pustaka YAZ sudah termuat oleh sistem.

Gambar 2. Pustaka YAZ yang sudah aktif
Setelah itu, layanan z3950 pada SLiMS bisa digunakan. Demikian, semoga membantu.
by Arif Syamsudin on 29 Jan 2020 08:13 AM

22 Nov 2019

Ternyata, tidak selamanya, barang baru, memberikan kepuasan yang sama, dengan barang yang lama.

Ceritanya, kantor menugaskan sebuah laptop (baru) untuk saya gunakan. Padahal, laptop yang saya gunakan sebelumnya pun tidak ada masalah dan saya senang menggunakannya. Baiklah, mari kita gunakan laptop tersebut.

Kemudian, untuk menghemat penggunaan resource (baca: RAM) pada laptop yang saya gunakan, saya mencoba menghemat segalanya. Termasuk, salah satu hal yang masuk dalam daftar, penggunaan player untuk memutar musik.

Sejak menggunakan Spotify, praktis saya sudah tidak mengunduh (secara fisik berkas) lagu-lagu yang hendak saya dengarkan. Pemutar Spotify yang saya pasang pada sistem operasi yang saya gunakan, rasa-rasanya semakin memberatkan kinerja laptop yang saya gunakan, ketika saya ingin bekerja multitasking. Membuka banyak tab pada peramban serta mendengarkan lagu. Membuka beberapa tab data pada aplikasi penyunting berkas, dan lain-lain.

Beberapa kali saya membaca tentang bagaimana pengguna sisop berbasis GnU/Linux mendengarkan musik melalui cli (command line interface). Kemudian saya mencoba mencari tahu, untuk mencari apa yang bisa saya temukan, terutama bagi saya, penikmat lagu via Spotify. Lalu saya menemukan project ini, tizonia.

Dijalankan via cli, pemasangan aplikasi ini pun cukup mudah. Dengan metode instalasi melalui Snap, Anda sudah tidak direpotkan dengan penambahan repositori. Cukup aktifkan instalasi melalui Snap pada sistem operasi yang Anda gunakan, kemudian Anda tinggal memilih aplikasi apa yang akan Anda pasang melalui repositori Snap.

Pada sistem operasi yang saya gunakan, GnU/Linux Fedora, setelah saya mengkonfigurasikan sistem operasi tersebut untuk terkoneksi ke repositori Snap, untuk memasang tizonia, jalankan perintah:

$ sudo snap install tizonia #Anda akan mendapatkan versi stabil

Setelah terpasang, Anda bisa memulai dengan membaca --help pada aplikasi tersebut.

$ tizonia --help

Apabila Anda pengguna Spotify seperti saya, masukkan perintah:

$ tizonia --help spotify

Anda akan diarahkan pada cara-cara bagaimana mengakses lagu-lagu pada akun Spotify Anda.

Catatan:
Anda harus terdaftar sebagai pengguna Spotify Premium untuk bisa memutar lagu-lagu pada akun Spotify Anda. Setidaknya informasi tersebut yang saya dapatkan pada situs tizonia.

Sebelum mengakses lagu-lagu pada akun Spotify Anda, sebelumnya Anda harus mendefinisikan username dan password yang Anda gunakan untuk mengakses akun Spotify. Konfigurasi tersebut berada dalam berkas tizonia.conf di dalam direktori ~/snap/tizonia/current/.config/tizonia.

Cari baris konfigurasi akun Spotify, kemudian masukan kredensial akun Spotify Anda.

# Spotify configuration
# -------------------------------------------------------------------------
# To avoid passing this information on the command line, uncomment
# and configure accordingly
#
spotify.user     = username
spotify.password = password

Setelah itu, simpan perubahan yang sudah dilakukan.

Mari kita mulai mengeksplorasi Spotify. Masukkan perintah:

$ tizonia --help spotify

untuk mendapatkan bantuan tentang akses Spotify pada tizonia. Sebagai contoh, saya menjalankan perintah ini untuk mendapatkan track lagu dari Selena Gomez:

$ tizonia --spotify-artist "Selena Gomez"

tizonia akan memberikan daftar lagu-lagu terkait artis Selena Gomez dan memainkannya.

Untuk mengatur posisi lagu yang diputar, informasinya dapat diakses lewat perintah:

$ tizonia --help keyboard

Sayangnya, masih belum ada opsi untuk memutar secara acak. Semoga pada pengembangan berikutnya, fitur ini bisa diadakan.

Demikian. Selamat bernyanyi dan bergoyang!
by Arif Syamsudin on 22 Nov 2019 12:58 PM

18 Nov 2019

Perubahan




Okto Silaban

Waktu berubah. Cuaca berubah. Tantangan berubah. Kehidupan berubah.
Frekuensi menulis di blog ini juga berubah. Dari ratusan tulisan setahun, ke 3 tulisan setahun. Mudah-mudahan hanya berubah, tidak mati. Sudah 15 tahun usia blog ini. Jangan layu sebelum berkembang. Menualah bersama.

by Okto Silaban on 18 Nov 2019 08:24 AM

04 Nov 2019

Lately my contribution to open source projects seems lacking. No more time to rekindle my passion on coding. Even my translation efforts suffers. Fortunately for GNOME translation into Indonesian, Kukuh Syafaat has been taking great effort to keep translation percentage 100%. Very big kudos to him! So when we have a big GNOME event in Gresik, GNOME Asia Summit 2019 on October 11th-13th, I tried
by Andika Triwidada on 04 Nov 2019 01:09 PM

29 Aug 2019

Hi. It's been a long time.

Dimulai dengan keinginan untuk men-downgrade versi MySQL. Ceritanya, saya mau gaya-gaya-an dengan selalu menggunakan versi perangkat lunak terbaru. Termasuk, MySQL ini. Namun ternyata, keterkinian tersebut menghambat saya dalam membantu pengembangan SLiMS.

Proses downgrade pun tidak selalu mulus. Mungkin karena saya memulainya dengan langkah yang tidak tepat. Jadi, semestinya langkah-langkahnya seperti ini:

  1. Non-aktifkan repo MySQL Community Server;
  2. Uninstall versi MySQL versi terkini yang terpasang.
  3. Dan seterusnya.
Oia, saya menggunakan Fedora 30. Ketika saya sudah menon-aktifkan repo, kemudian saya pasang ulang kembali MySQL-nya, via repo default Fedora, pesan galat masih saja muncul. Saya masih tetap tidak bisa menjalankan layanan MySQL.


Kemudian, hasil bacaan "journalctl -xe" begini:


Bolak balik lepas, pasang, lepas, pasang paket, hasilnya begitu aja. Sampai akhirnya saya menemukan, kurang lebih solusinya, di sini, https://tinyurl.com/yyqv28wy. Thread lama. 2014. Tapi masih relevan. Masuk akal. Karena saya sempat berfikir, mesti harus ada yang dibersihin dari pemasangan sebelumnya. Tapi saya nggak bisa menerka-nerka, apa yang harus dibersihkan. Hahaha.

Solusinya? Bersihkan pangkalan data dari pemasangan sebelumnya. Kalau memang ada, pangkalan data yang berada di dalam direktori /var/lib/mysql. Peringatan dalam thread tersebut sederhana, kalau memang pangkalan data yang ada di dalam direktori tersebut tidak dianggap penting, silahkan hapus. Jadi catatannya, backup sebelum dihapus.

Memang tokcer sich, cara yang disarankan pranala tersebut. Jadi:
  1. systemctl stop mariadb.service;
  2. dnf remove mariadb-server;
  3. cd /var/lib && rm -rfv mysql;
  4. dnf install mariadb-server.
Perintah nomor 3 sich yang petjah. Setelah semua pangkalan data dari pemasangan berikutnya dibersihkan, akhirnya layanan mariadb bisa berjalan dengan lancar lagi. Oia, perintah-perintah tersebut di atas dieksekusi dengan user root ya.

Gitu deh. Senang rasanya. Semoga bermanfaat. Kalau ada saran atau perbaikan atau metode yang lebih baik, silahkan tuliskan dalam komentar ya. Terima kasih.
by Arif Syamsudin on 29 Aug 2019 03:43 PM

28 Mar 2019

PowerPoint is the most appealing programming for introduction. In spite of the fact that there is some other programming that is likewise intended for execution, PowerPoint is as yet the most open programming to utilize. A few people are searching for web video player PowerPoint Mac. There are a few things you can think about […]
by Andrecht on 28 Mar 2019 05:53 AM

14 Mar 2019

Sebetulnya yang saya lakukan ini hanya untuk mesin percobaan/eksperimen. Beberapa bahan bacaan yang saya pernah ikuti menyarankan untuk tidak menggunakan XAMPP sebagai bagian dari mesin produksi. Cmiiw. Tapi bisa jadi, mungkin saja, ada yang tidak ingin repot-repot melakukan konfigurasi pada mesinnya dengan menggunakan XAMPP sebagai perangkat lunak peladen web.

Sebagai catatan, phpMyAdmin yang sudah diamankan dalam tulisan ini tetap tidak akan bisa diakses melalui jaringan, karena secara baku, phpMyAdmin dalam XAMPP tidak diizinkan, lewat konfigurasinya, untuk diakses dalam jaringan. Apa yang dipaparkan dalam tulisan ini hanya cara bagaimana cara menyetel password pengguna root pada akses MySQL dalam XAMPP serta korelasinya dengan phpMyAdmin.

Sebetulnya, cara untuk memasang password pada pengguna root MySQL sudah disediakan dalam HOW-TO guides yang diberikan pada laman dashboard (localhost/dashboard). Dalam tautan HOW-TO guides tadi, silahkan klik tautan dengan judul, "http://localhost/dashboard/docs/reset-mysql-password.html."

Ketika kita sudah mendefinisikan password untuk pengguna root MySQL pada XAMPP, biasanya, kejadiannya, phpMyAdmin kemudian tidak bisa diakses dan muncul pesan galat pada peramban, seperti ini:

Gambar 1. Pesan galat setelah pengguna root diberikan password

Kemudian, bagaimana caranya supaya phpMyAdmin bisa diakses kembali dalam localhost dengan kondisi pengguna root sudah diberikan password? Pernah dengar adminer? Adminer memiliki fungsi seperti phpMyAdmin. Bisa mengakses data MySQL lewat peramban. Tinggal pasang adminer, selesai. Tetapi, ada saja yang tidak nyaman menggunakan adminer. Lebih familiar menggunakan phpMyAdmin, katanya.

Kembali ke pertanyaan awal, bagaimana? Caranya, silahkan buka berkas config.inc.php yang berada di dalam direktori phpMyAdmin pada XAMPP. Cari baris ini:
$cfg['Servers'][$i]['auth_type'] = 'config';
kemudian ubah menjadi seperti ini:

$cfg['Servers'][$i]['auth_type'] = 'cookie'; 
Simpan perubahan yang dilakukan, kemudian segarkan tautan phpMyAdmin yang memberikan pesan galat tadi. Hasilnya nanti seperti ini:


Gambar 2. phpMyAdmin bisa diakses kembali dengan memasukkan password


phpMyAdmin telah dapat diakses dalam localhost menggunakan password yang telah kita setel sebelumnya.

Demikian, semoga membantu. Silakan tulis pada komentar apabila ada yang perlu ditambahkan atau diperbaiki pada tulisan ini. Terima kasih.
by Arif Syamsudin on 14 Mar 2019 11:18 AM

03 Mar 2019

SLiMS: XML Element




Arif Syamsudin

Gambar 1. Pesan galat ketika mengakses layanan Z3950 SRU

Menemukan pesan galat yang sama, ketika Anda akan menggunakan fitur salin katalog Z3950 SRU? Itu artinya, mesin yang Anda gunakan sebagai peladen SLiMS memerlukan paket:
php7.2-xml
Apabila mesin yang Anda gunakan menggunakan sistem operasi GnU/Linux Ubuntu, untuk memasang paket tersebut silahkan masukkan perintah:
$ sudo apt install php7.2-xml
Pesan galat pada gambar di atas disampaikan oleh GnU/Linux Ubuntu 18.04 dengan segala paket lamp-server yang ada di dalam repositorinya.

Semoga membantu :). 
 

by Arif Syamsudin on 03 Mar 2019 01:39 PM

22 Feb 2019

Currently I used OpenSUSE as my operating system, so to fix the issue as the title of this post is I'll modified the MySQL config at /etc/my.cnf. Open up the my.cnf config and go find the [client] section and uncomment these 2 lines below:
# port       = 3306
# socket = /run/mysql/mysql.sock
Don't forget to change mode the my.cnf config file to 600, so just only you can edit it.
# chmod 600 my.cnf
To take effect, please restart mysql service.
# service mysql start
Now you can connect to mysql client by this command
# mysql -u root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.2.15-MariaDB openSUSE package

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
Let say you haven't set the root password yet, you could reset/set a new root password with this following step below.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [mysql]> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
-----------SNIP--------------
| user |
+---------------------------+
30 rows in set (0.00 sec)
Now set a new root password
MariaDB [mysql]> update user set password=PASSWORD("YOUR_NEW_PASSWORD") where User='root';

Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
And then tells MySQL to put the new changes.
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
After all steps above done, you can now test it to connect to MySQL client with password that you've created.
# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.2.15-MariaDB openSUSE package

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
That's all.
by Darmanex on 22 Feb 2019 05:48 AM

21 Feb 2019

Dulu saya pernah mengalami bekerja belum/tidak mendapat jatah komputer bertampilan grafis. Namun, saya dapat hak akses komputer yang dijadikan server kecil yang hanya punya tampilan teks saja. Mau tidak mau mengakses apapun berbasis teks, termasuk membuka situs web.

Untuk membuka situs web diantaranya menggunakan links, lynx dan curl. Naahh.... Curl ini juga bermanfaat saat untuk mengakses sebuah Captive Portal. Supaya tidak lupa saya catat cara mengakses internet yang menggunakan Captive Portal menggunakan Curl, curl -d "username=UserKamu&Password=PassKamu&submit=Login" --dump-header headers -k https://internet.gratis/login. Perintah ini juga bermanfaat kemarin saat pelatihan di hotel yang menggunakan Captive Portal dan mainan VirtualBox dengan jaringan mesin virtual yang ter-bridge.
by Dedy Hariyadi on 21 Feb 2019 03:26 AM

28 Dec 2018

Liburan Bakal Mengular?




Dedy Hariyadi

Yup, mengular... Sebenarnya ini hanya sekadar judul tentang keresahan setelah sekian lama tidak membuka dan/atau menulis blog. Diawali dengan permasalah pada Python. Tentu bukan ular Python, sekadar logo saja. Mungkin karena kecerobahan saya install sana-sini gak jelas maka saya menjumpai galat semacam ini.
Traceback (most recent call last):
  File "/usr/bin/pip3", line 9, in <module>
    from pip import main
ImportError: cannot import name 'main'
Buka sana-sini tidak ada solusi. Namun, akhirnya menemukan solusinya. Jika menemukan permasalahan seperti diatas maka cukup jalankan perintah sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall.

Selamat berlibur....
by Dedy Hariyadi on 28 Dec 2018 08:26 AM

11 Sep 2018

Aplikasi yang baik adalah aplikasi yang sudah diuji fungsionalitasnya secara ketat untuk memastikan semua fungsionalitasnya berjalan dengan baik. Ada berbagai jenis metode pengujian di dalam pengujian perangkat lunak: unit-testing digunakan untuk menguji ketepatan output/luaran dari suatu fungsi atau model di dalam aplikasi secara internal, integration-testing digunakan untuk menguji kepaduan antara setiap komponen aplikasi, dan masih banyak jenis pengujian lainnya.

Untuk menguji aplikasi berbasis Web, ada beberapa macam pendekatan untuk melakukan pengujian baik unit testing maupun integration testing. Untuk aplikasi yang hanya mengandalkan REST API berbasis JSON, mungkin melakukan pengujian melalui masing-masing endpoint sudah cukup. Namun, untuk aplikasi Web interaktif yang memerlukan interaksi dari pengguna (isi teks, klik tombol), maka satu-satunya cara paling efektif untuk memastikan fungsionalitas dari interaksi berjalan lancar adalah dengan menguji langsung elemen-elemen interaktif dari aplikasi Web. Pengujian interaktifitas aplikasi Web bisa dilakukan melalui medium tester oleh manusia. Namun akan lebih baik jika proses pengujian ini bisa diotomatisasi sehingga bisa dilakukan berulang-ulang dengan cepat. Salah satu kakas/tool yang bisa Anda gunakan untuk melakukan otomatisasi interaksi aplikasi Web adalah Selenium WebDriver (SWD).

SWD menyediakan fasilitas untuk mengontrol suatu peramban Web (web browser) melalui otomatisasi dengan bahasa pemrograman. Pada saat program otomatisasi dijalankan, SWD akan membuka aplikasi peramban Web pilihan pengguna dan melakukan kontrol pada peramban Web tersebut seperti misalnya:

  • Membuka suatu halaman Web di bar alamat/address bar
  • Memilih suatu elemen di halaman menggunakan id, class, name, XPath.
  • Mengisi input pada elemen
  • Melakukan klik pada elemen
  • Menjalankan kode JavaScript (JS) pada halaman Web (termasuk mendapatkan nilai dari variabel JS)
  • Menunggu suatu state (misal, apakah data yang diambil secara AJAX sudah diambil nilainya).

Bahasa pemrograman yang didukung secara resmi oleh Selenium antara lain Java, Python, C#, Perl, JavaScript, Ruby, dan PHP. Sedangkan peramban Web yang bisa digunakan untuk proses otomatisasi antara lain Chrome, Firefox, Opera, Safari dan IE.

Pemasangan SWD untuk Python

CATATAN: Saya asumsikan Anda sudah memahami Python dan seluk beluknya sebelum lanjut

Untuk memasang SWD dengan Bahasa Pemrograman Python, Anda bisa menggunakan pengelola paket PIP untuk memasang paket bernama selenium melalui perintah baris berikut :

$ pip install selenium

Jika Anda ingin menggunakan bahasa pemrograman lain, silahkan merujuk ke pranala berikut.

Pemasangan WebDriver

Sebelum Anda dapat menggunakan SWD, Anda diharuskan untuk memasang WebDriver (WD) yang berfungsi sebagai penghubung antar SWD dengan peramban Web sehingga bisa dikontrol melalui bahasa pemrograman. WD untuk masing-masing peramban Web bisa diunduh melalui pranala lini (di bagian Third Party, Bindings, and Plugins). Tempatkan berkas biner/EXE dari WD ke dalam direktori yang bisa diakses melalui environment variable PATH.

Hello World

Untuk memulai menggunakan SWD dengan Python, silahkan membuka Python Interpreter (melalui perintah python atau ipython di baris perintah) dan mengimpor modul webdriver.

from selenium import webdriver

Kemudian, untuk memulai suatu WD, gunakan perintah berikut:

browser = webdriver.Chrome() # Untuk WD berbasis Chrome
browser = webdriver.Firefox() # Untuk WD berbasis Firefox

Seketika juga, Anda akan melihat aplikasi peramban Web muncul di layar. Anda sekarang bisa mengendalikan interaksi ke peramban Web baik secara langsung melalui peramban Web tersebut ATAU melalui kode program di melalui interpreter Python yang Anda gunakan.

Untuk membuka suatu halaman Web melalui interpreter Python, gunakan kode berikut (misal, jika Anda ingin membuka situs Google):

browser.get("https://google.com")

Maka peramban Web akan diarahkan ke situs yang dituju. Interpreter akan menunggu sampai halaman benar-benar dimuat secara penuh (document ready) sehingga Anda tidak perlu membuat kode untuk menunggu secara eksplisit.

Memilih suatu elemen

Untuk melakukan interaksi pada suatu elemen halaman Web, SWD menyediakan fungsi pencarian elemen (dan elemen jamak) menggunakan beberapa kueri: id dari elemen, class dari elemen, name dari elemen dan masih banyak lagi. Anda dapat menggunakan bantuan fitur Inspect Element (dengan menekan tombol F12 pada peramban Web) di Google Chrome atau Developer Tools di Mozilla Firefox untuk melakukan pengecekan nama id, class, name dari suatu elemen halaman Web.

Untuk melakukan pencarian sebuah elemen, Anda dapat menggunakan contoh perintah kode berikut:

kotak_cari = browser.find_element_by_name("q")  # Kotak pencarian
tombol_cari = browser.find_element_by_name("btnK") # Tombol "Penelusuran Google"
semua_input = browser.find_elements_by_tag_name("input") # Semua elemen dengan tag <input>
bahasa_google = browser.find_element_by_class_name("Q8LRLc") # Penunjuk nama bahasa di pojok kiri bawah

PERHATIAN: Jika Anda menggunakan fungsi dengan awalan find_element_* (element tanpa akhiran s), Anda harus memastikan bahwa id, class, atau properti elemen yang dicari memang ADA di halaman yang dibuka. Jika tidak, SWD akan melempar sebuah Exception.

Anda kemudian bisa menggunakan variabel luaran dari masing-masing fungsi find_element* (kita sebut variabel ini sebagai variabel elemen) untuk melihat properti DOM elemennya dengan menggunakan contoh kode berikut:

tombol_cari.get_attribute("value") # Hasil: "Penelusuran Google"

Anda juga bisa melakukan pencarian elemen kembali secara rekursif melalui suatu variabel elemen jika memang dibutuhkan:

body = browser.find_element_by_id("main").find_element_by_name("body")

Hanya saja, Anda tidak bisa melakukan manipulasi nilai DOM melalui fungsi bawaan SWD. Anda hanya bisa melakukan manipulasi nilai DOM dengan mengeksekusi suatu kode Javascript. Penjelasan mengenai eksekusi kode Javascript dijelaskan pada sub-bagian bawah.

Interaksi pada elemen

Anda dapat melakukan entri input dengan mensimulasikan entri tombol papan ketik ke suatu variabel elemen melalui perintah .send_keys seperti contoh penggunaan berikut:

kotak_cari.send_keys("Selenium Web Driver xx")

Anda juga bisa mensimulasikan tombol papan ketik khusus seperti berikut:

from selenium.webdriver.common.keys import Keys
kotak_cari.send_keys(Keys.BACKSPACE + Keys.BACKSPACE)

Untuk melakukan klik tombol, gunakan perintah .click atau .submit pada suatu variabel elemen seperti berikut:

tombol_cari.click() # Simulasi klik tombol "Penelusuran Google"
kotak_cari.submit() # Simulasi proses Submit

JavaScript

SWD menyediakan suatu fitur untuk mengeksekusi suatu JavaScript pada halaman yang sedang dibuka. Untuk melakukan hal ini, Anda dapat memanggil fungsi .execute_script melalui Web Driver dan mencantumkan snippet kode Javascript yang Anda ingin eksekusi. Anda dapat memasukkan lebih dari satu baris perintah JavaScript dengan membatasi tiap baris dengan tanda ;. Anda juga dapat mengambil nilai variabel dari Javascript ke dalam Python dengan menambahkan penanda return di sebelah kiri perintah/nama variabel.

Berikut adalah contoh penggunaan eksekusi skrip:

browser.execute_script("alert(0)")  # Menampilkan alert
browser.execute_script("document.getElementsByName('q')[0].setAttribute('value','Selenium Web Driver'") # Set value dari kotak pencarian
isi_pencarian = browser.execute_script("return document.getElementsByName('q')[0].getAttribute('value')") # Ambil value dari kotak pencarian

Agar proses pengujian bisa dilakukan secara terprediksi, Anda dapat melakukan proses penungguan suatu state (bisa berupa state di DOM atau Javascript) melalui fitur Explicit Wait yang ada di SWD. Untuk membuat suatu Explicit Wait, Anda bisa membuat sebuah fungsi lambda di Python yang menghasilkan nilai true jika keadaan yang diharapkan tercapai, dan nilai false jika keadaan yang diharapkan belum tercapai dan program harus melakukan penungguan. Berikut adalah contoh kode-nya (untuk timeout 10 detik):

from selenium.webdriver.support.ui import WebDriverWait

## Tunggu sampai kotak pencarian berisi tulisan "Sesuatu"
## Jika lebih dari 10 detik tidak tercapai, lembar Exception
WebDriverWait(browser, 10).until(lambda x: return browser.execute_script("return document.getElementsByName('q')[0].getAttribute('value')") == "Sesuatu")

Penutup

Di atas sudah dibahas mengenai cara dan contoh penggunaan Selenium Web Driver (SWD) untuk melakukan otomatisasi pengujian dan interaksi aplikasi Web menggunakan Python. Sebenarnya ada beberapa fitur Selenium yang sangat mumpuni namun belum dibahas di artikel ini.

Selain menawarkan otomatisasi melalui skrip, Anda juga bisa menggunakan Selenium IDE untuk membuat skrip otomatisasi langsung melalui peramban Web tanpa melalui coding. Selenium IDE mungkin akan saya di artikel blog saya selanjutnya.

Akhir kata, semoga artikel ini bermanfaat bagi Anda semua.

by Putu Wiramaswara Widya on 11 Sep 2018 12:25 PM