/soal-shift-sisop-modul-1-A06-2021

Jawaban soal praktikum Sistem Operasi modul 1

Primary LanguageShell

Soal-shift-sisop-modul-1-A06-2021

Jawaban soal praktikum Sistem Operasi modul 1.

Anggota kelompok:

  • Richard Asmarakandi - 05111940000017
  • Muhammad Rafki Mardi - 0511194000054
  • Husin Muhammad Assegaff - 05111940000127

Tabel Konten

Soal 1

Source Code Soal 1

Deskripsi:
Membuat laporan aplikasi ticky dengan harus melakukan beberapa hal berikut,

Soal 1.a

Deskripsi:
Mengumpulkan informasi jenis log (ERROR/INFO), pesan log, dan username dari log aplikasi pada file syslog.log.

Pembahasan:

grep -oP "(INFO.*)|(ERROR.*)" syslog.log 
  • Menggunakan grep -oP untuk mencari pola karakter yang diinginkan
  • Pada (INFO.*)|(ERROR.*) bermakna bahwa mencari baris yang terdapat kata "INFO" atau "ERROR" dan ditampilkan karakternya mulai dari "INFO" atau "ERROR" sampai akhir baris masing-masing.
  • Untuk syslog.log merupakan file yang digunakan untuk mengeksekusi perintah yang diinginkan. Sehingga hasilnya sebagai berikut:
Jan 31 00:09:39 ubuntu.local ticky: INFO Created ticket [#4217] (mdouglas)
Jan 31 00:16:25 ubuntu.local ticky: INFO Closed ticket [#1754] (noel)
Jan 31 00:21:30 ubuntu.local ticky: ERROR The ticket was modified while updating (breee)
Jan 31 00:44:34 ubuntu.local ticky: ERROR Permission denied while closing ticket (ac)
Jan 31 01:00:50 ubuntu.local ticky: INFO Commented on ticket [#4709] (blossom)
Jan 31 01:29:16 ubuntu.local ticky: INFO Commented on ticket [#6518] (rr.robinson)
Jan 31 01:33:12 ubuntu.local ticky: ERROR Tried to add information to closed ticket (mcintosh)
Jan 31 01:43:10 ubuntu.local ticky: ERROR Tried to add information to closed ticket (jackowens)
Jan 31 01:49:29 ubuntu.local ticky: ERROR Tried to add information to closed ticket (mdouglas)
Jan 31 02:30:04 ubuntu.local ticky: ERROR Timeout while retrieving information (oren)
Jan 31 02:55:31 ubuntu.local ticky: ERROR Ticket doesn't exist (xlg)
Jan 31 03:05:35 ubuntu.local ticky: ERROR Timeout while retrieving information (ahmed.miller)
Jan 31 03:08:55 ubuntu.local ticky: ERROR Ticket doesn't exist (blossom)
Jan 31 03:39:27 ubuntu.local ticky: ERROR The ticket was modified while updating (bpacheco)
Jan 31 03:47:24 ubuntu.local ticky: ERROR Ticket doesn't exist (enim.non)
Jan 31 04:30:04 ubuntu.local ticky: ERROR Permission denied while closing ticket (rr.robinson)
Jan 31 04:31:49 ubuntu.local ticky: ERROR Tried to add information to closed ticket (oren)
Jan 31 04:32:49 ubuntu.local ticky: ERROR Timeout while retrieving information (mcintosh)
Jan 31 04:44:23 ubuntu.local ticky: ERROR Timeout while retrieving information (ahmed.miller)
Jan 31 04:44:46 ubuntu.local ticky: ERROR Connection to DB failed (jackowens)
Jan 31 04:49:28 ubuntu.local ticky: ERROR Permission denied while closing ticket (flavia)
Jan 31 05:12:39 ubuntu.local ticky: ERROR Tried to add information to closed ticket (oren)
Jan 31 05:18:45 ubuntu.local ticky: ERROR Tried to add information to closed ticket (sri)
Jan 31 05:23:14 ubuntu.local ticky: INFO Commented on ticket [#1097] (breee)
Jan 31 05:35:00 ubuntu.local ticky: ERROR Connection to DB failed (nonummy)
Jan 31 05:45:30 ubuntu.local ticky: INFO Created ticket [#7115] (noel)
Jan 31 05:51:30 ubuntu.local ticky: ERROR The ticket was modified while updating (flavia)
Jan 31 05:57:46 ubuntu.local ticky: INFO Commented on ticket [#2253] (nonummy)
Jan 31 06:12:02 ubuntu.local ticky: ERROR Connection to DB failed (oren)
Jan 31 06:26:38 ubuntu.local ticky: ERROR Timeout while retrieving information (xlg)
Jan 31 06:32:26 ubuntu.local ticky: INFO Created ticket [#7298] (ahmed.miller)
Jan 31 06:36:25 ubuntu.local ticky: ERROR Timeout while retrieving information (flavia)
Jan 31 06:57:00 ubuntu.local ticky: ERROR Connection to DB failed (jackowens)
Jan 31 06:59:57 ubuntu.local ticky: INFO Commented on ticket [#7255] (oren)
Jan 31 07:59:56 ubuntu.local ticky: ERROR Ticket doesn't exist (flavia)
Jan 31 08:01:40 ubuntu.local ticky: ERROR Tried to add information to closed ticket (jackowens)
Jan 31 08:03:19 ubuntu.local ticky: INFO Closed ticket [#1712] (britanni)
Jan 31 08:22:37 ubuntu.local ticky: INFO Created ticket [#2860] (mcintosh)
Jan 31 08:28:07 ubuntu.local ticky: ERROR Timeout while retrieving information (montanap)
Jan 31 08:49:15 ubuntu.local ticky: ERROR Permission denied while closing ticket (britanni)
Jan 31 08:50:50 ubuntu.local ticky: ERROR Permission denied while closing ticket (montanap)
Jan 31 09:04:27 ubuntu.local ticky: ERROR Tried to add information to closed ticket (noel)
Jan 31 09:15:41 ubuntu.local ticky: ERROR Timeout while retrieving information (oren)
Jan 31 09:18:47 ubuntu.local ticky: INFO Commented on ticket [#8385] (mdouglas)
Jan 31 09:28:18 ubuntu.local ticky: INFO Closed ticket [#2452] (jackowens)
Jan 31 09:41:16 ubuntu.local ticky: ERROR Connection to DB failed (ac)
Jan 31 10:11:35 ubuntu.local ticky: ERROR Timeout while retrieving information (blossom)
Jan 31 10:21:36 ubuntu.local ticky: ERROR Permission denied while closing ticket (montanap)
Jan 31 11:04:02 ubuntu.local ticky: ERROR Tried to add information to closed ticket (breee)
Jan 31 11:19:37 ubuntu.local ticky: ERROR Connection to DB failed (sri)
Jan 31 11:22:06 ubuntu.local ticky: ERROR Timeout while retrieving information (montanap)
Jan 31 11:31:34 ubuntu.local ticky: ERROR Permission denied while closing ticket (ahmed.miller)
Jan 31 11:40:25 ubuntu.local ticky: ERROR Connection to DB failed (mai.hendrix)
Jan 31 11:47:07 ubuntu.local ticky: INFO Commented on ticket [#4562] (ac)
Jan 31 11:58:33 ubuntu.local ticky: ERROR Tried to add information to closed ticket (ahmed.miller)
Jan 31 12:00:17 ubuntu.local ticky: INFO Created ticket [#7897] (kirknixon)
Jan 31 12:02:49 ubuntu.local ticky: ERROR Permission denied while closing ticket (mai.hendrix)
Jan 31 12:20:23 ubuntu.local ticky: ERROR Connection to DB failed (kirknixon)
Jan 31 12:20:40 ubuntu.local ticky: ERROR Ticket doesn't exist (flavia)
Jan 31 12:24:32 ubuntu.local ticky: INFO Created ticket [#5784] (sri)
Jan 31 12:50:10 ubuntu.local ticky: ERROR Permission denied while closing ticket (blossom)
Jan 31 12:58:16 ubuntu.local ticky: ERROR Tried to add information to closed ticket (nonummy)
Jan 31 13:08:10 ubuntu.local ticky: INFO Closed ticket [#8685] (rr.robinson)
Jan 31 13:48:45 ubuntu.local ticky: ERROR The ticket was modified while updating (breee)
Jan 31 14:13:00 ubuntu.local ticky: INFO Commented on ticket [#4225] (noel)
Jan 31 14:38:50 ubuntu.local ticky: ERROR The ticket was modified while updating (enim.non)
Jan 31 14:41:18 ubuntu.local ticky: ERROR Timeout while retrieving information (xlg)
Jan 31 14:45:55 ubuntu.local ticky: INFO Closed ticket [#7948] (noel)
Jan 31 14:50:41 ubuntu.local ticky: INFO Commented on ticket [#8628] (noel)
Jan 31 14:56:35 ubuntu.local ticky: ERROR Tried to add information to closed ticket (noel)
Jan 31 15:27:53 ubuntu.local ticky: ERROR Ticket doesn't exist (blossom)
Jan 31 15:28:15 ubuntu.local ticky: ERROR Permission denied while closing ticket (enim.non)
Jan 31 15:44:25 ubuntu.local ticky: INFO Closed ticket [#7333] (enim.non)
Jan 31 16:17:20 ubuntu.local ticky: INFO Commented on ticket [#1653] (noel)
Jan 31 16:19:40 ubuntu.local ticky: ERROR The ticket was modified while updating (mdouglas)
Jan 31 16:24:31 ubuntu.local ticky: INFO Created ticket [#5455] (ac)
Jan 31 16:35:46 ubuntu.local ticky: ERROR Timeout while retrieving information (oren)
Jan 31 16:53:54 ubuntu.local ticky: INFO Commented on ticket [#3813] (mcintosh)
Jan 31 16:54:18 ubuntu.local ticky: ERROR Connection to DB failed (bpacheco)
Jan 31 17:15:47 ubuntu.local ticky: ERROR The ticket was modified while updating (mcintosh)
Jan 31 17:29:11 ubuntu.local ticky: ERROR Connection to DB failed (oren)
Jan 31 17:51:52 ubuntu.local ticky: INFO Closed ticket [#8604] (mcintosh)
Jan 31 18:09:17 ubuntu.local ticky: ERROR The ticket was modified while updating (noel)
Jan 31 18:43:01 ubuntu.local ticky: ERROR Ticket doesn't exist (nonummy)
Jan 31 19:00:23 ubuntu.local ticky: ERROR Timeout while retrieving information (blossom)
Jan 31 19:20:22 ubuntu.local ticky: ERROR Timeout while retrieving information (mai.hendrix)
Jan 31 19:59:06 ubuntu.local ticky: INFO Created ticket [#6361] (enim.non)
Jan 31 20:02:41 ubuntu.local ticky: ERROR Timeout while retrieving information (xlg)
Jan 31 20:21:55 ubuntu.local ticky: INFO Commented on ticket [#7159] (ahmed.miller)
Jan 31 20:28:26 ubuntu.local ticky: ERROR Connection to DB failed (breee)
Jan 31 20:35:17 ubuntu.local ticky: INFO Created ticket [#7737] (nonummy)
Jan 31 20:48:02 ubuntu.local ticky: ERROR Connection to DB failed (mdouglas)
Jan 31 20:56:58 ubuntu.local ticky: INFO Closed ticket [#4372] (oren)
Jan 31 21:00:23 ubuntu.local ticky: INFO Commented on ticket [#2389] (sri)
Jan 31 21:02:06 ubuntu.local ticky: ERROR Connection to DB failed (breee)
Jan 31 21:20:33 ubuntu.local ticky: INFO Closed ticket [#3297] (kirknixon)
Jan 31 21:29:24 ubuntu.local ticky: ERROR The ticket was modified while updating (blossom)
Jan 31 22:58:55 ubuntu.local ticky: INFO Created ticket [#2461] (jackowens)
Jan 31 23:25:18 ubuntu.local ticky: INFO Closed ticket [#9876] (blossom)
Jan 31 23:35:40 ubuntu.local ticky: INFO Created ticket [#5896] (mcintosh)

Bukti : Bukti1A

Kendala :
Kendala awal (secara umum) masih belum paham regex beserta penggunaan grep. Sehingga harus mencari dan mempelajari dokumentasinya, karena di modul tidak ada.

Soal 1.b

Deskripsi:
Menampilkan semua pesan berjenis 'ERROR' beserta jumlah kemunculannya

Pembahasan:

grep -oP '(?<=ERROR).*(?=\ \()' syslog.log | sort |  uniq -c | cut -b 6-99 | sort -nr | cut -b 1-2 > temps1b1.txt
grep -oP '(?<=ERROR).*(?=\ \()' syslog.log | sort |  uniq -c | cut -b 6-99 | sort -nr | cut -b 4-99 > temps1b2.txt
paste -d '\t\t' temps1b2.txt temps1b1.txt
  • Menggunakan grep -oP untuk mencari pola karakter yang diinginkan
  • Pada ?<=ERROR berarti melakukan lookbehind dengan mencari kata ERROR tanpa memasukkan kata ERROR sebagai input
  • Pada .* berarti melakukan pencarian dengan karakter sembarang setelah kata ERROR (pada konteks kali ini)
  • Pada ?= berarti melakukan lookahead agar output tidak menampilkan username
  • Untuk syslog.log merupakan file yang digunakan untuk mengeksekusi perintah yang diinginkan. Sehingga hasilnya sebagai berikut:
  • Dilakukan sorting agar pesan error yang sama (duplikat) terletak berjajar
  • Uniq -c dilakukan untuk mengeliminasi pesan yang sama (duplikat) dengan option -c untuk menampilkan jumlah muncul pesan error
  • cut -b 6-99 dilakukan untuk memotong spasi yang muncul pada awal string
  • sort -nr dilakukan untuk sorting kembali dari angka kemunculan paling banyak
  • Lalu bash baris pertama digunakan untuk memotong angka kemunculannya, sedangkan bash baris kedua digunakan untuk memotong pesan errornya
  • Setelah itu digabung kan pada perintah paste
  • Hasilnya akan seperti ini :
Timeout while retrieving information	15
Connection to DB failed	13
Tried to add information to closed ticket	12
Permission denied while closing ticket	10
The ticket was modified while updating	 9
Ticket doesn't exist	 7

Bukti : Bukti1B

Kendala :
Kendala hampir sama dengan 1a, masih belum mengenal grep dan regex dan baru tahu mengenai lookahead lookbehind dan sebagian besar waktu berkurang karena mencoba-coba dan mempelajari regex melalui regex101.com. Lalu sedikit bingung menemukan perintah yang cocok digunakan agar dapat menyelesaikan soal sesuai dengan perintah, dan akhirnya menemukan perintah paste.

Soal 1.c

Deskripsi:
Menampilkan jumlah kemunculan log ERROR dan INFO untuk setiap user.

Pembahasan:

printf "Username,INFO,ERROR\n"
user=$(grep -oP "(?<=\().*(?=\))" syslog.log | sort | uniq)

for i in $user
do
     printf "%s,%d,%d\n" $i $(grep -cP "INFO.*(?<=\()$i" syslog.log) $(grep -cP "ERROR.*(?<=\()$i" syslog.log);
done
  • Pertama mencetak "Username,INFO,ERROR" di header file menggunakan printf
  • kemudian membuat variabel user yang diisi nama-nama user dari syslog.log dengan menggunakan grep -oP "(?<=\().*(?=\))" syslog.log.
  • -o berguna untuk menampilkan karakter berdasarkan pola atau pattern dan P sebagai Perl Regular Expression yakni untuk menjalankan pattern yang digunakan dan berbentuk regex
  • Maksud dari "(?<=\().*(?=\))" adalah menggunakan look behind "(?<=\() untuk melihat karakter selanjutnya, setelah karakter '(' dengan menghilangkan makna khususnya menggunakan ''
  • Lalu, .* untuk melakukan pencarian karakter sebarang setelah '('. Dan juga menggunakan look ahead (?=\))" untuk hanya melihat karakter sebelum ')' dengan '' berfungsi untuk menghilangkan makna khusus kurung tersebut
  • Kemudian disorting dan diseleksi / dipilih cukup 1 dari setiap nama-nama user yang sama menggunakan sort dan uniq
  • Selanjutnya, setelah mendapat nama username dan dimasukkan ke variabel user. Maka dilakukan looping untuk mencetak jumlah kemunculan log ERROR dan INFO pada setiap user dengan perintah printf "%s,%d,%d\n" $i $(grep -cP "INFO.*(?<=\()$i" syslog.log) $(grep -cP "ERROR.*(?<=\()$i" syslog.log)
  • Pada perintah di atas, untuk %d pertama berasal dari pencarian menggunakan $(grep -cP "INFO.*(?<=\()$i" syslog.log) untuk menghitung berapa kali muncul kata INFO dengan menggunakan look behind pada karakter'(' untuk memastikan bahwa langsung menunjuk pada $i atau nama user
  • Adapun untuk %d yang kedua $(grep -cP "ERROR.*(?<=\()$i" syslog.log), perbedaannya hanya pada kata yang dicari dan dihitung kemunculannya adalah ERROR
  • Sehingga outputnya sebagai berikut,
Username,INFO,ERROR
ac,2,2
ahmed.miller,2,4
blossom,2,6
bpacheco,0,2
breee,1,5
britanni,1,1
enim.non,2,3
flavia,0,5
jackowens,2,4
kirknixon,2,1
mai.hendrix,0,3
mcintosh,4,3
mdouglas,2,3
montanap,0,4
noel,6,3
nonummy,2,3
oren,2,7
rr.robinson,2,1
sri,2,2
xlg,0,4

Bukti : Bukti1C

Kendala :
Sebelumnya masih salah pada log info dan error user "ac", karena regex-nya hanya INFO.*$i dan ERROR.*$i, sehingga terdapat nama user yang lain mengundang kata "ac" yang juga terhitung.

Soal 1.d

Deskripsi:
Menuliskan semua informasi dari soal 1.b dan dimasukkan ke dalam file error_message.csv

Pembahasan:

grep -oP '(?<=ERROR\ ).*?(?=\ \()' syslog.log | sort | uniq -c | sort -nr | cut -b 6-7 > temp1.txt
grep -oP '(?<=ERROR\ ).*?(?=\ \()' syslog.log | sort | uniq -c | sort -nr | cut -b 9-50 > temp2.txt
sed 's/$/ ,/' temp2.txt > temp3.txt
printf "Error,Count\n" > error_message.csv
paste temp3.txt temp1.txt >> error_message.csv
  • Baris satu dan dua sama dengan Soal 1.b
  • Perintah pada baris ketiga digunakan untuk menambahkan koma pada setiap baris di file temp2.txt dan dioutputkan ke file temp3.txt
  • Baris 4 memerintahkan untuk menulis Error,Count pada file error_message.csv dan menambah newline pada akhir baris
  • Baris 5 menempel hasil potongan ke error_message.csv dengan urutan pesan error, lalu banyak errornya
  • Hasilnya akan seperti ini :
Error,Count
Timeout while retrieving information    15
Connection to DB failed 13
Tried to add information to closed ticket       12
Permission denied while closing ticket  10
The ticket was modified while updating   9
Ticket doesn't exist     7

Bukti : Bukti1D

Kendala :
Hampir tidak ada kendala, namun mungkin sedikit sulit ketika mencoba menambahkan koma pada akhir kalimat di setiap barisnya yang kemudian setelah sekian lama menemukan perintah sed beserta cara penulisannya. selebihnya hampir sama dengan nomor sebelumnya, hanya mengubah output dari yang sebelumnya di terminal, sekarang ke file.

Soal 1.e

Deskripsi:
Menampilkan jumlah kemunculan log ERROR dan INFO untuk setiap user, kemudian disimpan pada file user_statistic.csv dengan nama user diurutkan secara ascending.

Pembahasan:

printf "Username,INFO,ERROR\n" > user_statistic.csv
user=$(grep -oP "(?<=\().*(?=\))" syslog.log | sort | uniq)

for i in $user
do
    printf "%s,%d,%d\n" $i $(grep -cP "INFO.*(?<=\()($i)" syslog.log) $(grep -cP "ERROR.*(?<=\()($i)" syslog.log);
done | sort >> user_statistic.csv;
  • Berhubung penjelasannya sama seperti nomor 1c, maka bisa dilihat disini pembahasan lengkapnya
  • Perbedaannya pada saat setelah melakukan looping, dilakukan sort secara ascending untuk mengurutkan hasilnya berdasarkan nama user
  • Kemudian, hasilnya disimpan pada file user_statistic.csv dengan menggunakan operator redirect >> yang berfungsi untuk memasukkan hasilnya ke file tersebut

Bukti : Bukti1E

Kendala :
Tidak ada kendala dalam soal ini.


Soal 2

Source Code Soal 2

Deskripsi:
Membuat laporan untuk rapat tahunan sebuah startup bernama “TokoShiSop” berupa kesimpulan-kesimpulan, yakni:

Soal 2.a

Deskripsi:
Mengetahui ID karyawan dengan Profit Percentage terbesar.

Note:
Profit Percentage = (Profit ÷ Cost Price) × 100

Pembahasan:

awk '
BEGIN {FS = "\t";} 
{
    if(NR != 1){
        profitPercentage = ($21 / ($18 - $21)) * 100;
        if(maxProfitPercentage <= profitPercentage){
            maxProfitPercentage = profitPercentage;
            orderId = $2;
            row = $1;
        }
    }
}
END {
    	printf ("Transaksi terakhir dengan profit percentage terbesar yaitu %s \ndengan persentase %.2f%%\n\n", orderId, maxProfitPercentage);
 }' Laporan-TokoShiSop.tsv >> hasil.txt
  • Data dari Laporan-TokoShiSop.tsv berbentuk tabel yang dipisahkan oleh TAB.
  • AWK akan dimulai dari statement BEGIN.
  • Bagian BEGIN {FS = "\t";}, mengindikasi kan bahwa ekstraksi data menggunakan filed separator (FS) berupa \t alias TAB, sehingga tiap kolom ke-n akan menempati $n.
  • Karna data memiliki header digunakan if(NR != 1) agar ekstraksi data sesuai dengan kolom tanpa mengambil nama kolom.
  • Seluruh baris nantinya akan dicari profit percentage-nya dengan profitPercentage = ($21 / ($18 - $21)) * 100; dan di kembalikan ke variabel profitPercentage.
  • Kemudian nanti setiap baris akan dilakukan pengecekan melalui conditional dibawah. Variabel maxProfitPercentage berisi NULL sehingga otomatis saat pertama kali akan terganti kan oleh profitPercentage, hal ini berjalan terus hingga baris akhir data.
        profitPercentage = ($21 / ($18 - $21)) * 100;
        if(maxProfitPercentage <= profitPercentage){
            maxProfitPercentage = profitPercentage;
            orderId = $2;
            row = $1;
        }
  • Kemudian akan terjadi pengoperan operand ke maxProfitPercentage, dan ID karyawana serta urutan barisnya akan disimpan ke orderID dan row secara berturut-turun.
  • Setelah BEGIN selesai, awk akan mengeksekusi END, disini hasil printf(...) berupa float dua angka dibelakang koma akan di outputkan ke hasil.txt menghasilkan:
Transaksi terakhir dengan profit percentage terbesar yaitu CA-2017-121559 
dengan persentase 100.00%

Bukti :

Bukti2A

Kendala :
Tidak ada kendala dalam soal ini.

Soal 2.b

Deskripsi:
Mencari daftar nama pelanggan yang berasal dari Albuquerque yang pernah bertransaksi pada tahun 2017.

Pembahasan:

(echo "Daftar nama customer di Alburquerque pada tahun 2017 antara lain:" ;
awk -F "\t" '/Albuquerque/&&/.....-17/&&$3 ~ /.....-17/ NR > 1  {print$7}' Laporan-TokoShiSop.tsv | uniq) >> hasil.txt
  • Script echo "..." untuk memenuhi syarat format jawaban
  • Standar opsi awk -F "\t" menyatakan filed separator (FS) berupa \t alias TAB, sehingga tiap kolom ke-n akan menempati $n.
  • Bagian /Albuquerque/&&/.....-17/&&$3 ~ /.....-17/ merupakan regular expression yang mensyaratkan bahwa dalam baris data harus terdapat nilai Albuquerque dan . berupa wildcard berupa karakter bebas.
  • Ekspresi .....-17 untuk menghimpun semua rekaman dengan tahun 2017 dan Albuquerque.
  • Ekspresi$3 ~ /.....-17/ untuk filter terhadap Tanggal Transaksi dengan tahun transkasi 2017.
  • Perintah {print$7} akan mencetak bagian kolom ke 7 dari file Laporan-TokoShiSop.tsv dan disaring dengan script bash | uniq lalu masuk ke hasil.txt menghasilkan:
  • Tanda kurung di awal dan di akhiran agar dimasukan sekaligus ke hasil.txt
Daftar nama customer di Alburquerque pada tahun 2017 antara lain:
Michelle Lonsdale
Benjamin Farhat
David Wiener
Susan Vittorini

Bukti :

Bukti2B

Kendala : Masalah saat memilih spesifik kolom tahun transaksi 2017.

Soal 2.c

Deskripsi:
Mencari segment customer dan jumlah transaksinya yang paling sedikit.

Pembahasan:

  • Menggunakan struktur awk yang sama dengan soal 2.a dimulai dengan BEGIN.
  • memasukan prasyarat berupa Home Office, Consumer, 'Corporate' ke sebuah array kat.
  • Kemudian dengan conditional if setiap kali melewati baris yang memenuhi syarat akan dihitung per-array tr.
  • Di akhiran akan dilakukan looping for( value in array ) mencari indeks array dengan nilai minimum yakni indeks ke.
  • Bagian END kemudian mencetak serta hasil indeks ke melalui printf(...) akan di outputkan ke hasil.txt menghasilkan:
Tipe segmen customer yang penjualannya paling sedikit adalah Home Office 
dengan total transaksi 1783.

Bukti :

Bukti2C

Kendala :
Tidak ada kendala dalam soal ini.

Soal 2.d

Deskripsi:
Mencari wilayah bagian (region) yang memiliki total keuntungan (profit) paling sedikit dan total keuntungan wilayah tersebut.

Pembahasan:

  • Menggunakan struktur awk yang sama dengan soal 2.a dimulai dengan BEGIN.
  • memasukan prasyarat berupa Central, West, North dan South ke sebuah array ar.
  • Kemudian dengan conditional if setiap kali melewati baris yang memenuhi syarat akan dihitung per-array par.
  • Di akhiran akan dilakukan looping for( value in array ) mencari indeks array dengan nilai minimum yakni indeks kep.
  • Bagian END kemudian mencetak serta hasil indeks kep melalui printf(...) akan di outputkan ke hasil.txt menghasilkan:
Wilayah bagain (region) yang memiliki total keuntungan (profit) yang 
paling sedikit adalah Central dengan total keuntungan 39706 (Profit).

Bukti :

Bukti2D

Kendala :
Tidak ada kendala dalam soal ini.


Soal 3

Soal 3.a

Source Code Soal 3.a

Deskripsi:
Mengunduh 23 gambar dari link https://loremflickr.com/320/240/kitten dengan menyimpannya ke file Foto.log. Juga memastikan tidak ada gambar yang sama serta menyimpan gambar dengan penamaan Koleksi_XX, contoh Koleksi_01, Koleksi_02

Pembahasan:

#!/bin/bash

number=1
while [ $number -le 23 ]
 do
	wget -a Foto.log -nv https://loremflickr.com/320/240/kitten
	number=$((number+1))
 done

md5sum * | sort | awk 'BEGIN{hash = ""} $1 == hash {print $2} {hash = $1}' | xargs rm

s=1
for file in *
do
	if [[ $file == *"kitten"* ]]
	then
		namafile=`printf "Koleksi_%02d.jpg" $s`
		mv $file $namafile
		s=$((s+1))
	fi
done
  • inisiasi variabel number dengan diisi nilai 1 untuk digunakan sebagai indeks dalam perulangan ketika mengunduh gambar
  • Kemudian menggunakan while dengan kondisi $number -le 23 atau nilai number <= 23, maka akan mengeksekusi unutk mengunduh gambar dan memasukkannya ke Foto.log
  • Lalu, setelah 23 foto selesai diunduh, maka dihitung hash dari setiap file foto menggunakan md5sum dan disorting menggunakan sort
  • Setelah itu, menggunakan awk dengan inisialisasi awal hash = "" atau hash diisi dengan string kosong yang tidak akan sesuai dengan hash apapun.
  • Kemudian, memeriksa setiap baris apabila hash bernilai sama dengan $1, yaitu hash file pada kolom pertama dari file sekarang (kolom kedua). Maka, akan diprint jika benar
  • Kemudian, pada akhir setiap langkah hash akan menyimpan hash dari file sekarang
  • Kemudian xargs berfungsi untuk menjadikan input dari awk yang ada sebagai argumen untuk rm atau remove file yang duplikat
  • Setelah itu, melakukan perulangan kembali dengan inisiasi variabel s untuk indeksnya
  • Perulangan ini berfungsi untuk mengubah nama file yang terdapat kata kitten menjadi Koleksi_%02d.jpg yang mana %d merupakan $s
  • Berikut untuk bukti eksekusinya,

Bukti : Bukti3A-1 Bukti3A-2

Kendala :
Sebelumnya masih belum memahami soal 3a ini, terutama bagian penggunaan hash

Soal 3.b

Deskripsi: Sama seperti nomor 3a, hanya saja script dijalankan secara otomatis sehari sekali pada jam 8 malam dengan format tanggal,

  • Dari tanggal 1 dijalankan 7 hari sekali
  • Dari tanggal 2 dijalankan 4 hari sekali Agar lebih rapi, gambar yang telah diunduh beserta log, dipindahkan ke folder yang format penamaannya mengikuti tanggalnya, DD-MM-YYY

Pembahasan:

A. Bash

Source Code Soal 3.b

bash ./soal3a.sh

current_date=$(date +"%d-%m-%Y")
mkdir "$current_date"
mv ./Koleksi_* "./$current_date/"
mv ./Foto.log "./$current_date/"

echo "Moved to $current_date"
  • Berhubung yang diminta sama seperti nomor 3a, maka melakukan eksekusi jawaban nomor tersebut dengan menggunakan bash ./soal3a.sh
  • Kemudian, current_date=$(date +"%d-%m-%Y") berfungsi untuk membuat variabel current_date yang menyimpan tanggal pada saat eksekusi dengan format DD-MM-YY
  • Setelah itu, membuat directory atau folder dari variabel tersebut menggunakan mkdir "$current_date"
  • Lalu, mv ./Koleksi_* "./$current_date/" berfungsi untuk memindahkan seluruh file foto ke folder yang telah dibuat sebelumnya
  • Begitu juga dengan file Foto.log juga dipindahkan ke folder tersebut dengan cara mv ./Foto.log "./$current_date/"

B. Crontab

Crontab Soal 3.b

0 20 1-31/7,2-31/4 * * bash ~/soal-shift-sisop-modul-1-A06-2021/soal3/soal3b.sh
  • Sesuai permintaan soal,script ini akan mengeksekusi script soal3b.sh dengan rincian 0 20 yang menunjukkan waktu jam 8 malam
  • Kemudian, 1-31/7,2-31/4 bermakna dijalankan pada tanggal 1 sampai tanggal 31 dengan aturan 7 hari sekali. Juga dari tanggal 2 sampai tanggal 31 dengan aturan 4 hari sekali.
  • Dan yang terakhir, * * yang mana bintang pertama menunjukkan dilakukan di semua bulan dan bintang kedua menunjukkan dieksekusi pada semua hari tanpa terkecuali.

Bukti : Bukti3B-1

Bukti3B-1

Kendala :
Tidak ada kendala

Soal 3.c

Source Code Soal 3.c

Deskripsi:
Selain mengunduh gambar kucing, juga mengunduh gambar kelinci pada link https://loremflickr.com/320/240/bunny dengan cara bergantian (bebas gambar mana yang didahulukan). Adapun untuk membedakan gambar kucing dan kelinci, maka dibuatkan folder dengan nama awalan Kucing_DD-MM-YYYY dan Kelinci_DD-MM-YY

Pembahasan:

PWD=`pwd`;

folder_kucing=`ls -d Kucing_* | wc -l`
folder_kelinci=`ls -d Kelinci_* | wc -l`
  • Membuat script yang secara bergantian mengunduh gambar kucing atau kelinci.
  • Acuan berdasarkan perbandingan jumlah folder kucing dengan kelinci, dimulai dengan kucing.
  • Dilakukan perhitungan jumlah masing masing folder dengan wc (word count) melalui ls degnan filter -d, -d digunakan untuk hanya directory, menghitung jumlah masing - masing directory kelinci dan kucing. Jika sama jumlahnya atau tidak ada maka dimulai dari kucing.
  • variabel $PWD digunakan untuk memindahkan file yang sudah di download ke folder tujuan relatif terhadap root.
if [ $folder_kucing -le $folder_kelinci ]
then	
	newdir="Kucing_$(date +"%d-%m-%Y")"
	mkdir $newdir
  ...
elif [ $folder_kucing -gt $folder_kelinci ]
then
	newdir="Kelinci_$(date +"%d-%m-%Y")"
	mkdir $newdir
  ...
fi
  • Jika salah satu kondisi tercapai maka akan dibuat folder dengan nama sesuai dengan format diminta.
  • Digunakan $(date +"%d-%m-%Y") untuk menarik tanggal saat itu sebagai nilai variabel lalu disematkan ke string nama folder. Bagian %d untuk day, %m untuk month dan %Y untuk year.
  • Skema pengunduhan dan filter sama dengan soal 3.a
	  	for ((num=1 ; num<=23; num=num+1))
	do
		wget -a Foto.log -nv  https://loremflickr.com/320/240/kitten
	done
  mv Foto.log $newdir
	...
	ke=1
	for file in *
	do
		if [[ $file == *"kitten"* ]]
		then
			namafile=`printf "Kucing_%02d.jpg" $ke`
			mv $file $namafile
			ke=$((ke+1))
			mv *.jpg $PWD/$newdir
		fi
	done
  ...
  • Hanya berbeda saat pemindahan .log file setelah pengunduhan ke folder tujuan [nama]_DD-MM-YYYY.
  • Dilakukan renaming dengan melakukan traverse seluruh file di folder sekarang, dan jika file memenuhi syarat dilakukan renaming sesuai format dengan bantuan counter nilai $ke, dan $ke increment.

Bukti :

Bukti3C-1

Bukti3C-2

Bukti3C-3

Bukti3C-4

Bukti3C-5

Bukti3C-6

Kendala :
Cukup lama untuk menemukan metode filter 3a sehingga bisa dijalankan ke soal 3c, cukup bingung apakah menggunakan crontab atau hanya berdasarkan jalan mulai script.

Soal 3.d

Source Code Soal 3.d

Deskripsi:
Membuat script yang dapat memindahkan seluruh folder ke bentuk zip dengan nama Koleksi.zip dan menguncinya dengan password berupa tanggal saat itu, yakni MMDDYYYY

Pembahasan:

#Mendapatkan tanggal hari ini untuk digunakan sebagai password zip dengan format bulan,tanggal,dan tahun 4 digit
now=$(date +'%m%d%Y')
#Mengzip file
zip -rem Koleksi.zip Kucing_* Kelinci_* -P "$now"
  • Mendapatkan tanggal sekarang dengan format "MMDDYYYY" dapat dilakukan dengan $(date +'%m%d%Y') yang lalu dioper dalam variabel "now".
  • Menggunakan perintah zip dengan opsi sebagai berikut :
  • -r digunakan untuk meng-zip file secara rekursi
  • -e diperlukan agar zip dapat ter-Encrypt
  • -m digunakan untuk memindahkan spesifik file ke zip dan menghapus file yang telah dipindahkan
  • -P "$now" digunakan untuk menambahkan password dengan nilai password adalah isi dari variabel "now"

Bukti :

Bukti3D-1

Bukti3D-2

Kendala :
Untuk mendapatkan tanggal hari ini sebagai password, sangat mudah ditemukan di internet. Namun mungkin untuk perintah zip perlu mencari beberapa option yang diperlukan agar dapat menyelesaikan sesuai dengan perintah soal

Soal 3.e

Source Code Soal 3.e

Deskripsi: Lanjutan dari nomor 3d, yaitu dilakukan perintah zip setiap hari kecuali sabtu dan minggu, dari jam 7 pagi sampai 6 sore. Selain waktu tersebut, tidak dilakukan zip dan filenya di-unzip

Pembahasan:

#di-zip
0 7 * * 1-5 bash ~/soal-shift-sisop-modul-1-A06-2021/soal3/soal3d.sh

#tidak di-zip & di-unzip
0 18 * * 1-5 unzip -P "$(date +"%d%m%Y")" ~/soal-shift-sisop-modul-1-A06-2021/soal3/Koleksi.zip -d ~/soal-shift-sisop-modul-1-A06-2021/soal3/ && rm ~/soal-shift-sisop-modul-1-A06-2021/soal3/Koleksi.zip
  • Diminta untuk membuat crontab untuk meng-zip dan meng-unzip folder foto.
  • Dengan crontab yang kedua menjalankan pertintah unzip, karna file dipasangkan enkripsi berupa tanggal terbuatnya file zip, digunakan modifiers -P dengan nilai berupa tanggal pada saat itu juga.
  • Opsi -d untuk lokasi tujuan unzip, kemudiam menghapus file Koleksi.zip dengan rm.

Bukti :

Bukti3E-1

Bukti3E-2

Kendala :
Tidak ada kendala