Skip to content

ilyaasha24/SoalShiftSISOP20_modul1_T12

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 
 
 

Repository files navigation

SoalShiftSISOP20_modul1_T12

"Repository dibuat untuk memenuhi tugas praktikum mata kuliah sistem operasi tahun 2020."

Anggota :
Muhammad Ilya Asha Soegondo [05311840000010]
Mohammad Ifaizul Hasan [05311840000029]

Asisten :
Nandha Himawan [05111740000180]

Daftar Isi

  1. Judul
  2. Daftar Isi
  3. Pendahuluan
    3.1. Prasyarat
  4. Modul 1
    4.1. Soal 1
    4.1.1. Penyelesaian
    4.2. Soal 2
    4.2.1. Penyelesaian
    4.3. Soal 3
    4.3.1. Penyelesaian

Pendahuluan

Prasyarat

  • Sebuah distribusi Linux (misal: Ubuntu, Linux Mint).
  • gawk (GNU awk).
    sudo apt-get install gawk

Modul 1

Soal 1

Whits adalah seorang mahasiswa teknik informatika. Dia mendapatkan tugas praktikum untuk membuat laporan berdasarkan data yang ada pada file “Sample-Superstore.csv”. Namun dia tidak dapat menyelesaikan tugas tersebut. Laporan yang diminta berupa :
a. Tentukan wilayah bagian (region) mana yang memiliki keuntungan (profit) paling sedikit
b. Tampilkan 2 negara bagian (state) yang memiliki keuntungan (profit) paling
sedikit berdasarkan hasil poin a
c. Tampilkan 10 produk (product name) yang memiliki keuntungan (profit) paling sedikit berdasarkan 2 negara bagian (state) hasil poin b

Whits memohon kepada kalian yang sudah jago mengolah data untuk mengerjakan
laporan tersebut.
Gunakan Awk dan Command pendukung.

Penyelesaian

a. Wilayah bagian dengan keuntungan paling sedikit

region=($(awk -F "\"*,\"*" 'FNR>1{u[$13]+=$NF}END{for(i in u)printf "%6.4f %s \n", u[i], i}' Sample-Superstore.csv | sort -g | head -n1))

  1. Mengolah Sample-Superstore.csv menggunakan awk dengan cara menentukan field separator "," -F "\"*,\"*", melewati kolom header FNR>1, menggunakan array untuk mengelompokkan keuntungan berdasarkan wilayah bagian u[$13]+=$NF, dan menampilkan setiap elemen dari array tersebut beserta value-nya for(i in u)printf "%6.4f %s \n", u[i], i.
  2. Mengurutkan keuntungan dari kecil ke besar menggunakan sort dan -g untuk mengurutkan secara general numerik.
  3. Menampilkan baris pertama menggunakan head -n1.
  4. Hasil yang berupa wilayah bagian dengan keuntungan terkecil beserta keuntungannya disimpan pada variabel region.

b. 2 negara bagian dengan keuntungan paling sedikit pada wilayah bagian dari poin a

state=($(awk -F "\"*,\"*" -v a=${region[1]} 'FNR>1{if($13~a)u[$11]+=$NF}END{for(i in u)printf "%6.4f %s \n", u[i], i}' Sample-Superstore.csv | sort -g | head -n2))

  1. Mengolah Sample-Superstore.csv menggunakan awk dengan cara menentukan field separator "," -F "\"*,\"*", menggunakan hasil dari poin a dengan mengoper variabel region ke dalam awk -v a=${region[1]}, melewati kolom header FNR>1, jika wilayah bagian adalah wilayah bagian dari poin a if($13~a) maka digunakan array untuk mengelompokkan keuntungan berdasarkan negara bagian u[$11]+=$NF, dan menampilkan setiap elemen dari array tersebut beserta value-nya for(i in u)printf "%6.4f %s \n", u[i], i.
  2. Mengurutkan keuntungan dari kecil ke besar menggunakan sort dan -g untuk mengurutkan secara general numerik.
  3. Menampilkan dua baris pertama menggunakan head -n2.
  4. Hasil yang berupa 2 negara bagian dengan keuntungan terkecil beserta keuntungannya disimpan pada variabel state.

c. 10 produk dengan keuntungan paling sedikit pada 2 negara bagian dari poin b

prod12=($(awk -F "\"*,\"*" -v a=${state[1]} -v b=${state[3]} 'FNR>1{if($11~a||$11~b)u[$17]+=$NF}END{for(i in u)printf "%5.4f in %s\\n\n",u[i],i}' Sample-Superstore.csv | sort -g | head -n10 | nl -s"."))

  1. Mengolah Sample-Superstore.csv menggunakan awk dengan cara menentukan field separator "," -F "\"*,\"*", menggunakan hasil dari poin b dengan mengoper variabel state ke dalam awk -v a=${state[1]} -v b=${state[3]}, melewati kolom header FNR>1, jika negara bagian adalah negara bagian dari poin b if($11~a||$11~b) maka digunakan array untuk mengelompokkan keuntungan berdasarkan produk u[$17]+=$NF, dan menampilkan setiap elemen dari array tersebut beserta value-nya for(i in u)printf "%5.4f in %s\\n\n",u[i],i.
  2. Mengurutkan keuntungan dari kecil ke besar menggunakan sort dan -g untuk mengurutkan secara general numerik.
  3. Menampilkan sepuluh baris pertama menggunakan head -n10.
  4. Menomori per baris menggunakan nl dan menambahkan titik setelah nomor -s".".
  5. Hasil yang berupa 10 produk dengan keuntungan terkecil beserta keuntungannya disimpan pada variabel prod12.

Hasil

Central Region has the lowest profit at 41340.4137

2 States with lowest profit in Central region : 1.Texas at -20198.3212 2.Illinois at -9246.8718

10 Products with lowest profit in both states : 1.-5552.8392 in GBC DocuBind P400 Electric Binding System 2.-3431.6730 in Fellowes PB500 Electric Punch Plastic Comb Binding Machine with Manual Bind 3.-2929.4845 in Ibico EPK-21 Electric Binding System 4.-1869.9890 in Lexmark MX611dhe Monochrome Laser Printer 5.-1601.1975 in Ibico Hi-Tech Manual Binding System 6.-1480.0335 in GBC DocuBind TL300 Electric Binding System 7.-1378.8216 in 3.6 Cubic Foot Counter Height Office Refrigerator 8.-1181.2824 in Hoover Upright Vacuum With Dirt Cup 9.-1147.0074 in GBC ProClick 150 Presentation Binding System 10.-1141.4700 in GBC Ibimaster 500 Manual ProClick Binding System

Soal 2

Pada suatu siang, laptop Randolf dan Afairuzr dibajak oleh seseorang dan kehilangan data-data penting. Untuk mencegah kejadian yang sama terulang kembali mereka meminta bantuan kepada Whits karena dia adalah seorang yang punya banyak ide. Whits memikirkan sebuah ide namun dia meminta bantuan kalian kembali agar ide tersebut cepat diselesaikan. Idenya adalah kalian
a. membuat sebuah script bash yang dapat menghasilkan password secara acak sebanyak 28 karakter yang terdapat huruf besar, huruf kecil, dan angka.
b. Password acak tersebut disimpan pada file berekstensi .txt dengan nama berdasarkan argumen yang diinputkan dan HANYA berupa alphabet.
c. Kemudian supaya file .txt tersebut tidak mudah diketahui maka nama filenya akan di enkripsi dengan menggunakan konversi huruf (string manipulation) yang disesuaikan dengan jam(0-23) dibuatnya file tersebut dengan program terpisah dengan
(misal: password.txt dibuat pada jam 01.28 maka namanya berubah menjadi qbttxpse.txt dengan perintah ‘bash soal2_enkripsi.sh password.txt’. Karena p adalah huruf ke 16 dan file dibuat pada jam 1 maka 16+1=17 dan huruf ke 17 adalah q dan begitu pula seterusnya. Apabila melebihi z, akan kembali ke a, contoh: huruf w dengan jam 5.28, maka akan menjadi huruf b.) dan
d. jangan lupa untuk membuat dekripsinya supaya nama file bisa kembali.
HINT: enkripsi yang digunakan adalah caesar cipher.
Gunakan Bash Script

Penyelesaian

a. membuat sebuah script bash yang dapat menghasilkan password secara acak sebanyak 28 karakter yang terdapat huruf besar, huruf kecil, dan angka.

rand28=$(dd if=/dev/urandom | tr -dc a-zA-Z0-9 | fold -w 28 | awk '/[A-Z]/&&/[a-z]/&&/[0-9]/;a[$1]{for(i in a)print i}' | head -n1)

  1. Menampilkan /dev/urandom. Dalam sistem operasi mirip Unix, /dev/random, /dev/urandom dan /dev/arandom adalah file khusus yang berfungsi sebagai generator nomor pseudorandom. Wikipedia.
  2. Menyaring hasil generator agar memiliki format alphanumerik tr -dc 'a-zA-Z0-9'.
  3. Menyingkat menjadi 28 huruf per baris fold -w 28.
  4. Menyaring baris agar memiliki minimal 1 huruf kapital, 1 huruf kecil, dan 1 angka menggunakan awk. awk '/[A-Z]/&&/[a-z]/&&/[0-9]/;a[$1]{for(i in a)print i}'.
  5. Mengambil baris pertama head -n 1.
  6. Disimpan ke variabel rand28.

b. Password acak tersebut disimpan pada file berekstensi .txt dengan nama berdasarkan argumen yang diinputkan dan HANYA berupa alphabet.

file=$(echo $@)
file=$(echo ${file%%.*} | tr -dc 'a-zA-Z')
echo "$rand28" > "$file.txt"
  1. Menyimpan argumen ke variabel file.
  2. Memotong ekstensinya echo ${file%%.*}.
  3. Menyaring agar tersisa hanya alphabet tr -dc 'a-zA-Z'.
  4. Menyimpan hasil dari poin a ke file dengan nama berdasarkan argumen yang telah diproses. echo "$rand28" > "$file.txt".

c. Kemudian supaya file .txt tersebut tidak mudah diketahui maka nama filenya akan di enkripsi dengan menggunakan konversi huruf (string manipulation) yang disesuaikan dengan jam(0-23) dibuatnya file tersebut dengan program terpisah.

#!/bin/bash
chr() { printf \\$(printf '%03o' $1); }
file=$(echo $@)
file=$(echo ${file%%.*} | tr -dc A-Za-z)
cr=$(sudo debugfs -R 'stat <'"$(stat -c %i $file.txt)"'>' "$(df --output=source $file.txt | tail -n1)" 2>/dev/null | grep -oP 'crtime.*--\s*\K.*' | cut -c12-13)
if [[ $cr != 00 ]]; then
  shift=$(chr $(($cr + 65)))-ZA-$(chr $(($cr + 64)))$(chr $(($cr + 97)))-za-$(chr $(($cr + 96)))
  CC=$(echo $file | tr $shift A-Za-z)
  mv "$file.txt" "$CC.txt"
fi
  1. Fungsi “chr” digunakan untuk mengkonversi angka menjadi huruf sesuai dengan standar ASCII.
  2. Menyimpan argumen ke variabel file.
  3. Menghapus ekstensi dan karakter selain alfabet pada variabel file.
  4. Mencari tahu kapan file dengan nama file.txt dibuat dengan menggunakan perintah debugfs untuk menemukan waktu pembuatan file, dengan -R yang menginstruksikan debugfs untuk mengeksekusi perintah eksternal tunggal lalu keluar yaitu stat dengan argumen inode dan filesystem. Nomor inode didapatkan dari hasil perintah stat -c %i terhadap file tersebut atau bisa juga dengan menggunakan perintah ls -i terhadap file tersebut. Kemudian untuk menemukan filesystem tempat file tersebut berada, cukup jalankan perintah df --output=source terhadap file tersebut untuk mengidentifikasi sistem filenya. Lalu kita ambil baris terakhir dari hasil perintah sebelumnya dengan tail -n1. Gunakan 2>/dev/null untuk menghilangkan error apa pun, . Hasil tersebut akan diambil tanggal dan waktu pembuatan filenya saja crtime menggunakan grep -oP 'crtime.*--\s*\K.*' Lalu dipotong jamnya saja cut -c12-13 dan disimpan di variabel cr
    d. Mengambil jam pembuatan dari file crtime, disimpan di variabel crhour.
  5. Mengecek apakah file dibuat diluar jam 0.
    a. Apabila file dibuat diluar jam 0, maka menggeser huruf A(65), @(64), a(97), `(96) dengan offset cr, disimpan sesuai format (65+cr)-ZA-(64+cr)(97+cr)-za-(96+cr) di variabel shift.
    b. Mentranslasi teks dari variabel file berdasarkan set pertama A-Za-z menjadi set kedua shift, dan hasilnya disimpan di variabel CC.
    c. Mengganti nama file dengan nama file.txt menjadi CC.txt .

d. jangan lupa untuk membuat dekripsinya supaya nama file bisa kembali.

  1. Mirip seperti poin c dengan pengecualian pada 5b dan 5c yaitu : 5b. menukar set pertama A-Za-z dan set kedua shift, dan hasilnya disimpan di variabel dCC.
    5c. Mengganti nama file dengan nama file.txt menjadi dCC.txt .

Soal 3

1 tahun telah berlalu sejak pencampakan hati Kusuma. Akankah sang pujaan hati kembali ke naungan Kusuma? Memang tiada maaf bagi Elen. Tapi apa daya hati yang sudah hancur, Kusuma masih terguncang akan sikap Elen. Melihat kesedihan Kusuma, kalian mencoba menghibur Kusuma dengan mengirimkan gambar kucing. [a] Maka dari itu, kalian mencoba membuat script untuk mendownload 28 gambar dari https://loremflickr.com/320/240/cat" menggunakan command wget dan menyimpan file dengan nama “pdkt_kusuma_NO” (contoh: pdkt_kusuma_1, pdkt_kusuma_2, pdkt_kusuma_3) serta jangan lupa untuk menyimpan log messages wget kedalam sebuah file “wget.log”. Karena kalian gak suka ribet, kalian membuat penjadwalan untuk menjalankan script download gambar tersebut. Namun, script download tersebut hanya berjalan[b] setiap 8 jam dimulai dari jam 6.05 setiap hari kecuali hari Sabtu Karena gambar yang didownload dari link tersebut bersifat random, maka ada kemungkinan gambar yang terdownload itu identik. Supaya gambar yang identik tidak dikira Kusuma sebagai spam, maka diperlukan sebuah script untuk memindahkan salah satu gambar identik. Setelah memilah gambar yang identik, maka dihasilkan gambar yang berbeda antara satu dengan yang lain. Gambar yang berbeda tersebut, akan kalian kirim ke Kusuma supaya hatinya kembali ceria. Setelah semua gambar telah dikirim, kalian akan
selalu menghibur Kusuma, jadi gambar yang telah terkirim tadi akan kalian simpan kedalam folder /kenangan dan kalian bisa mendownload gambar baru lagi. [c] Maka dari itu buatlah sebuah script untuk mengidentifikasi gambar yang identik dari keseluruhan gambar yang terdownload tadi. Bila terindikasi sebagai gambar yang identik, maka sisakan 1 gambar dan pindahkan sisa file identik tersebut ke dalam folder ./duplicate
dengan format filename “duplicate_nomor” (contoh : duplicate_200, duplicate_201). Setelah itu lakukan pemindahan semua gambar yang tersisa kedalam folder ./kenangan
dengan format filename “kenangan_nomor” (contoh: kenangan_252, kenangan_253). Setelah tidak ada gambar di current directory, maka lakukan backup seluruh log menjadi
ekstensi “.log.bak”.

Hint : Gunakan wget.log untuk membuat location.log yang isinya
merupakan hasil dari grep “Location”. Gunakan Bash, Awk dan Crontab

Penyelesaian

Cat

a. Maka dari itu, kalian mencoba membuat script untuk mendownload 28 gambar dari https://loremflickr.com/320/240/cat" menggunakan command wget dan menyimpan file dengan nama “pdkt_kusuma_NO” (contoh: pdkt_kusuma_1, pdkt_kusuma_2, pdkt_kusuma_3) serta jangan lupa untuk menyimpan log messages wget kedalam sebuah file “wget.log”.

#!/bin/bash
rm wget.log 2>/dev/null
for i in `seq 1 28`; do
  wget https://loremflickr.com/320/240/cat -O pdkt_kusuma_$i -a wget.log
done
  1. Menghapus wget.log bila ada.
  2. Melakukan perulangan 28 kali for i in `seq 1 28` pada link yang telah disediakan untuk mengunduh gambar secara random wget https://loremflickr.com/320/240/cat.
  3. Tidak lupa untuk mengganti namanya sesuai dengan urutan pengunduhan -O pdkt_kusuma_$i dan memasukkannya kedalam log -a wget.log.

b. Menjalankan script download gambar tersebut. Namun, script download tersebut hanya berjalan setiap 8 jam dimulai dari jam 6.05 setiap hari kecuali hari Sabtu

crontab -e :

5 6-23/8 * * 0-5 /<path>/soal3.sh
  1. Cron diatas 5 6-23/8 * * 0-5 dapat diartikan bahwa setiap 8 jam sekali yang dimulai pada pukul 6.05 akan dijalankan program soal3.sh /<path>/soal3.sh. Namun pada hari Sabtu tidak dijalankan pengunduhan sama sekali.
  2. Jangan lupa mengganti permission agar bisa dieksekusi langsung chmod +x atau menambahkan /bin/bash sebelum file pada crontab.

c. Maka dari itu buatlah sebuah script untuk mengidentifikasi gambar yang identik dari keseluruhan gambar yang terdownload tadi. Bila terindikasi sebagai gambar yang identik, maka sisakan 1 gambar dan pindahkan sisa file identik tersebut ke dalam folder ./duplicate
dengan format filename “duplicate_nomor” (contoh : duplicate_200, duplicate_201). Setelah itu lakukan pemindahan semua gambar yang tersisa kedalam folder ./kenangan
dengan format filename “kenangan_nomor” (contoh: kenangan_252, kenangan_253). Setelah tidak ada gambar di current directory, maka lakukan backup seluruh log menjadi
ekstensi “.log.bak”.

#!/bin/bash
fix() {
  n=$(ls 2>/dev/null -1 -- ./"$1"/"$1"_* | wc -l)
  for i in $2; do
    let n+=1
    mv $i "./$1/$1_$n"
  done
}
grep 'Location:' wget.log | cut -c32-53 | tr -d "_" > location.log
a=($(paste "./location.log" <(echo -e "pdkt_kusuma_"{1..28}"\n" | tr -d " ") | awk -F \\t '{a[$1]=$2}END{for(i in a)if(i)print a[i]}' | sort -k2))
b=($(ls pdkt_kusuma_* | sort))
c=()
for i in "${b[@]}"; do
    skip=
    for j in "${a[@]}"; do
        [[ $i == $j ]] && { skip=1; break; }
    done
    [[ -n $skip ]] || c+=("$i")
done
mkdir -p duplicate kenangan
fix duplicate "${c[*]}"
fix kenangan "${a[*]}"
mv ./wget.log{,.bak}
  1. Fungsi fix :
    a. Menghitung jumlah file dengan nama yang berawalan dengan argumen pertama pada direktori memiliki nama yang sama dengan argumen pertama digabung garis bawah dengan cara ls -1 untuk menampilkan isi direktori secara baris demi baris, 2>/dev/null untuk mengalihkan error, -- sebagai pemisah antara opsi dan argumen, wc -l untuk menghitung jumlah baris, hasil hitungan disimpan di variabel n.
    b. Mengulang sejumlah elemen direpresentasikan oleh variabel i pada argumen kedua untuk menambah 1 pada variabel n dan memindah file dengan nama yang sama dengan variabel i ke direktori dengan nama yang sama dengan argumen pertama serta mengganti nama file tersebut menjadi sama seperti argumen pertama digabung garis bawah dan variabel n.
  2. Mencari baris yang memiliki tulisan awal Location: pada wget.log grep 'Location:' wget.log kemudian dipotong pada karakter ke-32 hingga karakter ke-53 cut -c32-53 yang mana merupakan nomor seri pada nama file di URL file tersebut dan menghilangkan garis bawah tr -d "_" untuk mempermudah pengurutan lalu disimpan sebagai location.log.
  3. Menampilkan isi location.log lalu menempelkan pdkt_kusuma_NOdengan nomor 1 - 28 di setiap baris di belakangnya. Menghilangkan baris dengan nomor seri yang sama menggunakan awk a[$1]=$2 dan menghilangkan baris kosong if(i) dan mengurutkan hasilnya sort -k2 disimpan di variabel a.
  4. Melakukan pengurutan file dengan nama yang dimulai dengan pdkt_kusuma_ pada direktori ls pdkt_kusuma_* kemudian diurutkan sort dan disimpan sebagai variabel b yang akan berfungsi sebagai referensi.
  5. Membuat array kosong bernama c. c=().
  6. Membandingkan a dengan b dan menyimpan elemen yang ada di b namun tidak ada di a ke c dengan cara membuat perulangan untuk setiap elemen dalam b, for i in "${b[@]}" membuat variabel skip dengan nilai 0, skip= dan membuat perulangan untuk setiap elemen dalam a, for j in "${a[@]}"for j in "${a[@]}", apabila elemen dalam a dan b sama, maka mengganti nilai skip menjadi 1, [[ $i == $j ]] skip=1 dan keluar dari perulangan elemen a, break. Apabila nilai skip masih 0 ketika perulangan elemen a selesai, [[ -n $skip ]] maka elemen tersebut dimasukkan ke c, c+=("$i").
  7. Membuat direktori “duplicate” dan “kenangan” apabila tidak ada, mkdir -p duplicate kenangan.
  8. Memanggil fungsi fix dengan argumen duplicate dan "${c[*]}".
  9. Memanggil fungsi fix dengan argumen kenangan dan "${a[*]}".
  10. Terakhir mencadangkan log, mv ./wget.log{,.bak}.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages