From 1b8d066f93ba4155f8fd019fab24a898fc141471 Mon Sep 17 00:00:00 2001 From: Yohan Ardiansyah Date: Tue, 10 Aug 2021 22:01:54 +0700 Subject: [PATCH] modul tahun 2021 --- Modul1/README-English.md | 995 +++++++++++++++++++++++++++++++ Modul1/README.md | 158 +++-- Modul1/gambar/local-variable.png | Bin 0 -> 46090 bytes Modul1/gambar/ranger.png | Bin 0 -> 99200 bytes Modul1/gambar/soal-2.png | Bin 0 -> 141820 bytes Modul2/README - English.md | 695 +++++++++++++++++++++ Modul2/README.md | 238 +++++++- Modul2/img/file-permission.png | Bin 0 -> 20356 bytes Modul3/README - English.md | 807 +++++++++++++++++++++++++ Modul3/README.md | 130 +++- Modul3/epoll-client.c | 48 ++ Modul3/epoll-server.c | 108 ++++ Modul3/poll-client.c | 48 ++ Modul3/poll-server.c | 130 ++++ Modul3/select-client.c | 48 ++ Modul3/select-server.c | 139 +++++ Modul4/README - English.md | 571 ++++++++++++++++++ Modul4/README.md | 622 +++++++------------ 18 files changed, 4232 insertions(+), 505 deletions(-) create mode 100644 Modul1/README-English.md create mode 100644 Modul1/gambar/local-variable.png create mode 100644 Modul1/gambar/ranger.png create mode 100644 Modul1/gambar/soal-2.png create mode 100644 Modul2/README - English.md create mode 100644 Modul2/img/file-permission.png create mode 100644 Modul3/README - English.md create mode 100644 Modul3/epoll-client.c create mode 100644 Modul3/epoll-server.c create mode 100644 Modul3/poll-client.c create mode 100644 Modul3/poll-server.c create mode 100644 Modul3/select-client.c create mode 100644 Modul3/select-server.c create mode 100644 Modul4/README - English.md diff --git a/Modul1/README-English.md b/Modul1/README-English.md new file mode 100644 index 0000000..d58dcd8 --- /dev/null +++ b/Modul1/README-English.md @@ -0,0 +1,995 @@ +## Module 1 Operating System +# Shell Scripting, Cron, and AWK +## Precondition + +1. Have Linux OS Installed +2. Have basic understannding of CLI (_Command Line Interface_) [Introduction to CLI](https://github.com/AZakyH/Modul-Pelatihan-Linux-2018/tree/master/CLI) + +## List of Content + +- [Shell Scripting, Cron, dan AWK](#shell-scripting-cron-dan-awk) + - [Precondition](#precondition) + - [List of Content](#list-of-content) +- [1. Shell Scripting](#1-shell-scripting) + - [1.1 Shell](#11-shell) + - [1.2 Shell Programming](#12-shell-programming) + - [1.3 Basic Shell Command](#13-basic-shell-command) + - [1.4 Simple Shell Script](#14-simple-shell-script) + - [1.5 Variable](#15-variable) + - [1.5.1 Special Variable](#151-special-variable) + - [1.5.2 Local Variable](#152-local-variable) + - [1.6 Input Output](#16-input-output) + - [1.7 Quoting](#17-quoting) + - [1.8 Basic Operators](#18-basic-operators) + - [1.8.1 Arithmetic Operators](#181-arithmetic-operators) + - [1.8.2 Relational Operators](#182-relational-operators) + - [1.9 Conditional Statements](#19-conditional-statements) + - [1.9.1 If...Else](#191-ifelse) + - [1.9.2 Case](#192-case) + - [1.10 Loop](#110-loop) + - [1.10.1 While loop](#1101-while-loop) + - [1.10.2 For loop](#1102-for-loop) + - [1.10.3 Until loop](#1103-until-loop) + - [1.10.4 Select loop](#1104-select-loop) + - [1.10.5 Nesting Loops](#1105-nesting-loops) + - [1.11 Function](#111-function) + - [1.11.1 Nested Functions](#1111-nested-functions) +- [2. Cron](#2-cron) + - [2.1 Create or modify a cron jobs](#21-create-or-modify-a-cron-jobs) +- [3. AWK](#3-awk) + - [3.1 Running AWK program](#31-running-awk-program) + - [How the AWK works](#how-the-awk-works) + - [3.2 Special Rules](#32-special-rules) +- [Extras](#extras) + - [Ranger](#ranger) + - [How to Install](#how-to-install) + - [How to Use](#how-to-use) + - [References](#references) + - [Exercise](#exercise) + +# 1. Shell Scripting +## 1.1 Shell +Operating system have 3 major component. They are Kernel, Shell, and Program. + +![Komponen Sistem Operasi](gambar/component.png) + +- __Kernel__ is the core of the computer. This component allows communication between software and hardware. If kernel is the inner layer of an Operating System, then __shell__ is the outer layer of it. +- __Shell__ is a command translator program which connects user and kernel. Generally, shell provides __prompt__ as user interface which is how user input the commands, eiter internal command or external command. After receiving input from the user and executing it according to the inputs, shell will outputs something. Shell can be accessed from the __Terminal__. +- __Program Utility__ is software system which execute maintenence tasks. Utility Program is made spesifically to do special task on spesific computer aread, Such as formatting harddisk, or network connectifity check, etc. + +` Note : Try open a terminal on Linux, the you can find prompt shell (generally $). There, you can enter input such as commands, then execute it using "Enter" key . Output will be shown on the terminal. ` + +There are 2 types of shell in Unix/Linux, That is : + +1. Bourne Shell - Prompt for this shell is $ + - Bourne Shell (sh) + - POSIX Shell (sh) + - Korn Shell (ksh) + - Bourne Again SHell (bash) +2. C Shell - Prompt for this shell is % + - C Shell (csh) + - TENEX/TOPS C Shell (tcsh) +## 1.2 Shell Programming +Shell Programming is constructing some shell command (internal or external ) to become a series of command which does spesific task. Some advantage of linux shell is it allows user to arrange a series of command like intrepeter programming language i.e input output, decision making, looping, fucntions, etc. + +Shell programming Unix/Linux can also be called shell scripting. For ease of use, you can save shell script as a file and execute it as you wish. + +Benefit of learning shell scripting: + +- Can work effectively and efficiently because you don't have to type commands over and over, you can write it once and seave it to a file. + +- Can run multiple command as one command + +- Can run commands automatically +## 1.3 Basic Shell Command +On this module, we will use Bash as our shell (_Bourne Again SHell_) because bash is the most widely used shell in linux distros. You can check what shell you are using by typing the following command. + +```bash +$ echo $SHELL +``` + +Shell have internal command (build-in shell) and external command. +- Internal Command (built-in shell) : Command that are built-in to the shell. Executing set commands require no lookup to the PATH variable in shell. +- External Command : Commands that are not integrated to the shell. When set command is executed, shell will find set commands on the PATH variable such as `/usr/bin` and `/bin`. + +To check if a command is internal or external, use the type command. + +```bash +$ type cd +cd is a shell builtin +$ type bash +bash is /bin/bash +$ type read +read is a shell builtin +$ type chmod +chmod is /bin/chmod +``` + +- Internal Command Examples: + + cd, pwd, times, alias, umask, exit, logout, fg, bg, ls, mkdir, rmdir, mv, cp, rm, clear, ... + +- External Command Examples: + + cat, cut, paste, chmod, lpr,.... + + +Other than that, there are a few characters that are important to use in a shell: + +- __Redirection__ (Sends output to a file or read inputs from a file) uses redirect operator >, >>, <, 2>> example: + +```bash +ls /home/Documents > test.txt +#the output of ls command is /home/Documents is sent to to file test.txt. If there are no such file, then the file will be created. If such file exist, it will be overwritten + +ls /home/Documents >> test.txt +#similar to >, the difference is if the test.txt exist, the output will be appended to the end of the file. + +sort < test.txt +#file test.txt will become the input of the command sort + +bash script.sh 2>> error.log +#If there are errors when running script.sh, the error message will be written to error.log +``` + +- __Pipe__ (output of one command will become the input of the other command) uses pipe operator |, example: +```bash +ls -l | sort -s +#ouput of ls -l command became the input of sort -s command (sort descendingly) +``` +- __Wildcard__ uses wildcard characters *, ?, [ ], example: +```bash +ls a* +#output all files that begins with the letter a + +ls a?a +#output all files that begins with the character a then any character then ends with the character a + +ls [re]* +#output all files that begin with the character r or e +``` +To see detail about bash shell, please open the bash manual using the following command. + +```bash +$ man bash +``` + +## 1.4 Simple Shell Script +Create a shell script file (.sh) using any editor, for example nano, vi, or gedit. + +``` +$ nano file_name.sh +``` +For example : +`$ nano hello.sh` + +Write a few lines of command in the file, starting with shebang `#!/bin/bash`. + +Shebang is used to tell the system that the commands in the file must be executed by Bash. + +``` +#!/bin/bash +echo "Hello, world!" +``` + +Save and change the script file permissions so that it can be executed. + +``` +$ chmod +x hello +``` + +Execute the script by means of `./nama_file.sh` or simply `bash nama_file.sh`. + +![](https://raw.githubusercontent.com/arsitektur-jaringan-komputer/Modul-Sisop/master/2021/Modul1/gambar/1.4.png) + +## 1.5 Variable +- There are some things that need to be considered in defining variables: + + i. The variable name can only consist of: + - Letter (a-z and A-Z) + - Numbers (0-9) + - Underscore character ( _ ) + + ii. Variable names begin with a letter or an underscore + + iii. You cannot use any special characters like !, *, $, #, -, etc because these characters have special meaning for the shell + + iv. Is in fact case sensitive, so it distinguishes upper and lowercase letters + +- Syntax + - Defines a variable + ``` + var_name=value + ``` + + - Access variable + ``` + $var_name + ``` + +- Variable Types + - String + ``` + var_name="string" + ``` + + - Integer + ``` + var_name=value + ``` + + - Array + + If the contents of the array are strings + ``` + var_name=("string0" "string1" "string2" ... "stringN") + ``` + If the contents of the array are integers + ``` + var_name=(val0 val1 val2 ... valN) + ``` + +Example : +``` +#!/bin/bash + +course="Operating System" +semester=12 +student=("Jamal" "Taufik" "Dobleh" "Kabur") + +echo " String variable:" $course +echo "Integer variable:" $semester +echo "3rd in array:" ${student[2]} +``` + +Output: + +![](https://raw.githubusercontent.com/arsitektur-jaringan-komputer/Modul-Sisop/master/2021/Modul1/gambar/bash1-5.png) + +## 1.5.1 Special Variable +Some of the special variable that usually used: +| Variable | Description | +| --- | --- | +| $0 | Contains the name of the script file being executed | +| $n | n here is a positive decimal number that corresponds to the position of the argument (the first argument is $ 1, the second argument is $ 2, etc.) | +| $# | The number of arguments which is inputted in the script | +| $* | All $n arguments | +| $? | The exit status of the last command executed | +| $$ | Current shell process ID (PID) | + +Example: +``` +#!/bin/bash + +echo "Script name : $0" +echo "1st argument : $1" +echo "2nd argument : $2" +echo "Hello $1, welcome to $2 operating class!" +echo "Total argument : $#" +echo "All argument : $*" +echo "PID : $$" +``` + +Output: + +![](https://raw.githubusercontent.com/arsitektur-jaringan-komputer/Modul-Sisop/master/2021/Modul1/gambar/special.png) + +## 1.5.2 Local Variable +When using bash, the variable will automatically become a global variable if you assign it directly like month = 6. But we can create local variables for the function in bash using the local keyword. The created local variable will not be a global variable. + +Example: +``` +#!/bin/bash + +fac_func() { + number=2 + local tmp=10 + echo "The global var in this function : $number" + echo "The local var in this function : $tmp" +} + +fac_func + +echo "The global var outside the function : $number" +echo "The local var outside the function : $tmp" +``` + +Output: + +![](https://raw.githubusercontent.com/arsitektur-jaringan-komputer/Modul-Sisop/master/2021/Modul1/gambar/local-variable.png) + +From the picture, it can be seen that when we try to print local variables to the terminal it can't get out. + +# 1.6 Input Output +- Read is used to take input from the keyboard with the following syntax: +``` +read var_name +``` + +- Echo is used to display output with the following syntax: + - Display plain text + ``` + echo "text + ``` + + - Show the contents of a variable + ``` + echo $var_name + ``` + +Note : +If you want to use a new line character (\ n) in echo, use echo -e "text \ n text" + +Example: +``` +#!/bin/bash + +course="Operating System" + +echo "Who is your name?" +read name +echo -e "\nHi $name!\nWelcome to the class of $course ! ;)" +``` + +Output: +![](https://raw.githubusercontent.com/arsitektur-jaringan-komputer/Modul-Sisop/master/2021/Modul1/gambar/inp.png) + +Beside echo, bash also provides a builtin printf command to display output in a specific format, similar to C language. +For example: +``` +#!/bin/bash + +course="Operating System"; +number=12; + +printf "This is an enter\n\tin bash\n"; +printf "What course, again? %s\n" $course; +printf "%d decimal in float = %.2f\n" $number $number; +``` + +Output: + +![](https://raw.githubusercontent.com/arsitektur-jaringan-komputer/Modul-Sisop/master/2021/Modul1/gambar/printf.png) + +# 1.7 Quoting +The Unix/Linux shell has several special characters called metacharacters. These characters have special meaning when used in a shell script. Several kinds of metacharacters: +``` +* ? [ ] ' " \ $ ; & ( ) | ^ < > new-line space tab +``` + +There are 4 types of quoting, namely: +| No | Quoting | Description | +| --- | --- | --- | +| 1 | Single Quote (') | All metacharacters between single quotes lose their special meaning | +| 2 | Double Quote (") | Most of the metacharacters between double quotes will lose their special meaning, except `$, backquote, \ $, \ ', \ ", \\` | +| 3 | Backslash ( \ ) | Any character after the backslash will lose its special meaning | +| 4 | Backquote (`) | Anything between the back quotes will be treated as a command and will be executed | + + +Example: +``` +#!/bin/bash + +single=3 + +#Single quote +echo '$single' + +#Double quote +echo "$single" + +#Backslash +echo \<-\$1500.\*\*\>\; \(update\?\) \[y\|n\] + +#Backquote +dmn=`pwd` +echo "Where are we rn? " $dmn +``` + +Output: + +![](https://raw.githubusercontent.com/arsitektur-jaringan-komputer/Modul-Sisop/master/2021/Modul1/gambar/hasil-quote.png) + +To see more about this, do `man bash` + +## 1.8 Basic Operators + +There are several types of operators supported by the shell, namely: + + 1. Arithmetic Operators + 2. Relational Operators + 3. Boolean operators + 4. String operator + 5. File Test Operators + +However, we will focus on **arithmetic** and **relational** operators. + +### Arithmetic Operators + +| No | Operators | Description | +| --- | --- | --- | +| 1 | + | Addition | +| 2 | - | Deduction | +| 3 | * | Multiplication | +| 4 | / | Division | +| 5 | % | Modulus (remainder of division) | +| 6 | = | Assigns a value from the right to a variable on the left | +| 7 | == | Compares 2 equal values | +| 8 | != | Compares 2 unequal values | + +There are 3 ways that may be used to perform mathematical operations, namely: + +1. Using the built-in command **let** +2. Using external command **expr** +3. Using the substitution command `$((expression))` + +Example: + +```bash +#!/bin/bash + +a=15 +b=7 + +#let +let add=$a+$b +let subtract=$a-$b +let multiply=$a*$b + +#expr +divide=`expr $a / $b` + +#using a substitute command $((ekspresi)) +mod=$(($a % $b)) + +echo "a + b = $add" +echo "a - b = $subtract" +echo "a * b = $multiply" +echo "a / b = $divide" +echo "a % b = $mod" + +b=$a + +echo "a = $a" +echo "b = $b" +``` + +Output: + +![hasil-181](gambar/hasil-181.png) + +### 1.8.2 Relational Operators + +| No | Operators | Description | +| --- | --- | --- | +| 1 | -eq | Checks whether the values of both operands are equal (==) | +| 2 | -ne | Checks whether the values of both operands are not equal (! =) | +| 3 | -gt | Checks whether the value of the left operand is greater than the right operand (>) | +| 4 | -lt | Checks whether the value of the left operand is less than the right operand (<) | +| 5 | -ge | Checks whether the value of the left operand is greater than or equal to the right operand (> =) | +| 6 | -le | Checks whether the value of the left operand is less than or equal to the right operand (<=) | + +Relational operators are usually used in conjunction with conditional statements, for example: + +```bash +#!/bin/bash + +a=15 +b=7 + +if [ $a -eq $b ] +then + echo "$a -eq $b: a equals b" +else + echo "$a -eq $b: a does not equal b" +fi +``` + +Output: + +```bash +15 -eq 7: a are not equal to b +``` + +## 1.9 Conditional Statements + +**Conditional statements** are used to allow the program to make correct decisions by selecting certain actions based on certain terms/conditions. +There are 2 types of conditional statements in the Unix shell, namely: + +1. **if...else** +2. **case** + +### 1.9.1 If...Else + +Syntax: + +```bash +if [ condition1 ] +then + command1 +elif [ condition2 ] +then + command2 +else + alternative_command +fi +``` + +Example: + +```bash +#!/bin/bash + +my_love=100 +their_love=88 + +if [ $my_love == $their_love ] +then + echo "my love is equal to their love" +elif [ $my love -gt $their_love ] +then + echo "my love is greater than their love" +elif [ $a -lt $their_love ] +then + echo "my love is less than their love" +else + echo "None of the conditions returned true" +fi +``` + +Output: + +```bash +my_love is greater than their_love +``` + +### 1.9.2 Case + +Syntax: + +```bash +case var in + pattern1) + command1 + ;; + pattern2) + command2 + ;; + *) + alternative_command + ;; +esac +``` + +Example: + +```bash +#!/bin/bash + +echo "I've liked you for a long time, will you be my girlfriend?" +echo "1. Yes" +echo "2. No" +echo "3. I can't answer now" +echo -n "answer:" +read answer + +case "$answer" in + "1") + echo "Really?" + ;; + "2") + echo "Okay, sorry for taking up your time" + ;; + "3") + echo "Alexa, play comethru by Jeremy Zucker" + ;; + *) + echo "Wut?" + ;; +esac +``` + +Output: +![hasil-case](gambar/hasil-case.png) + +## 1.10 Loop + +**Loop** is used to execute a series of commands over and over. There are several types of shell loops: + + 1. While loop + 2. For loop + 3. Until loop + 4. Select loop + +### 1.10.1 While loop + +**While loop** is used to execute a series of commands repeatedly **as long as** a condition is met. **While** may be used for when we want to repeatedly manipulate a variable. +Syntax: + +```bash +while condition +do + command +done +``` + +Example: + +```bash +#!/bin/bash + +a=0 + +while [ $a -lt 10 ] +do +echo $a + a=$((a + 2)) +done +``` + +Output: + +```bash +0 +2 +4 +6 +8 +``` + +### 1.10.2 For loop + +**For loop** is used to repeat a series of commands for each item on the list. + +Syntax: + +```bash +for var in item_list +do + command +done +``` + +Example: + +```bash +#!/bin/bash + +for num in 1 2 3 4 5 +do + echo $num +done +``` + +Apart from that, it could be written like this: + +```bash +#!/bin/bash + +for ((num=1; num<=5; num=num+1)) +do + echo $num +done +``` + +Output: + +```bash +1 +2 +3 +4 +5 +``` + +### 1.10.3 Until loop + +Unlike while, **until loop** is used to execute a series of commands repeatedly **until** a condition is met. +Syntax: + +```bash +until condition +do + command +done +``` + +Example: + +```bash +#!/bin/bash + +a=0 + +until [ ! $a -lt 10 ] +do + echo $a + a=$((a + 2)) +done +``` + +Output: + +```bash +0 +2 +4 +6 +8 +``` + +### 1.10.4 Select loop + +**Select loop** is used when we want to create a program with several lists of options that can be selected by the user, for example, a menu list. +Syntax: + +```bash +select var in daftar_item +do + command +done +``` + +Example: + +```bash +#!/bin/bash + +select drinks in tea coffee water juice milk all nothing +do + case $drinks in + tea|coffee|water|all) + echo "Sorry, we're out of them" + ;; + juice|milk) + echo "Available" + ;; + nothing) + break + ;; + *) echo "Does not exist in the menu" + ;; + esac +done +``` + +Output: +![hasil-select-loop](gambar/hasil-select-loop.png) + +### 1.10.5 Nesting Loops + +All the types of loops above support the concept of nesting, meaning that we can place one loop into another, whether it is a similar loop or a different type. +Contoh: + +```bash +#!/bin/sh + +a=0 + +while [ "$a" -lt 10 ] #loop1 +do + b="$a" + while [ "$b" -ge 0 ] #loop2 + do + echo -n "$b " + b=`expr $b - 1` + done + echo "" + a=`expr $a + 1` +done +``` + +Output: + +```bash +0 +1 0 +2 1 0 +3 2 1 0 +4 3 2 1 0 +5 4 3 2 1 0 +6 5 4 3 2 1 0 +7 6 5 4 3 2 1 0 +8 7 6 5 4 3 2 1 0 +9 8 7 6 5 4 3 2 1 0 +``` + +## 1.11 Function +**Function** is used to divide the functionality of a script into a smaller subsection. These subsection can be called to do their job if needed. + +Syntax: +```bash +function_name () { + command1 + command2 + ... + commandN +} +``` +Example: +```bash +#!/bin/bash +#define functions +ask_name() { + echo "What's your name?" +} +reply() { + read name + echo "Hi $name, welcome to operating system's practice!" +} + +#call functions +ask_name +reply +``` +Output: +![hasil-fungsi](gambar/hasil-fungsi.png) + +### 1.11.1 Nested Functions +Similar to loop, the concept of nested is also applied in function, where we can call a function inside a function. +```bash +#!/bin/bash + +#define functions +ask_name() { + echo "What's your name?" + reply #call reply function inside ask_name function +} +reply() { + read name + echo "Hi $name, welcome to operating system's practice!" +} + +#call functions +ask_name +``` +Output: +![hasil-fungsi](gambar/hasil-fungsi.png) + +# 2. Cron +Cron is a daemon service which allows Linux and Unix user to run a certain command or _script_ at a any given time automatically. Commands or scripts which is executed is called cron jobs. +Crontab syntax : +`crontab [-u user] [-l | -r | -e] [-i]` +Penjelasan : +* `-l` to display the content of a crontab file +* `-r` to delete a crontab file +* `-e` to modify or create a crontab file if it does not already exist +* `-i` to give a confirmation before deleting a crontab file +## 2.1 Create or modify a cron jobs +1. Type `crontab -e` +2. Type the crontab command according to crontab's parameter rules +![parameter crontab](gambar/syntax-crontab.png "parameter crontab") +3. To see the list of cron jobs, type `crontab -l` + +Example of commands that crontab runs +![contoh crontab](gambar/contoh-crontab.png "contoh crontab") +Penjelasan : +* every 00.00, enter the result from `ls /home/tamtama` to file `/home/tamtama/list_files` +* every week, run the file `script.sh` in folder `/home/tamtama` + +To learn more about crontab's commands, you can access this website [crontab guru](https://crontab.guru/). +![web crontab guru](gambar/crontab-guru.png "web crontab guru") + +# 3. AWK +__awk__ is a program that can be used to retrive certain records in a file and perform one or several operation on those records. + +The basic function of awk is examine a file line by line (or other unit of text) that contains a certain pattern. When a line matches a pattern, awk will perform certain action on that line. Awk continues the process until it meets the end of line in the inputed file. + +FYI: the new version of awk is called gawk, but is usually still called awk. + +awk is a scripting language used to process data and generate reports. The awk language does not required compilation, and allows user to use variables, numeric function, string function, and logical operator. awk is mostly used for scanning and pattern processing. + +## 3.1 Running AWK program +Syntax: +```bash +awk options 'selection _criteria {action }' input-file > output-file +``` +### How the AWK works +- Awk read the lines in a file. + +- Awk matches patterns to lines in the file. If the patterns matches, the next action can be made, such a printing the line. + +- If no pattern matches, then no action will be made. + +- Providing pattern or action is not required. + +- If no pattern is created, then the default output is every line in the input file. + +- If no action is created, then the default output is displaying the search result on your display. + +- Curly braces without action means no decision, but it won't display the default output. + +- Every statement in an action must be separated with a semicolon `(;)`. + +For example, we have the following kingdom's data +``` +mataram sanjaya 732 760 +kutai mulawarman 400 446 +singasari ken 1222 1227 +majapahit gajahmada 1334 1364 +tarumanegara sanjaya 732 754 +sriwijaya balaputradewa 792 835 +``` +By default, awk will print all lines in the input file: +`awk '{print}' kerajaan.txt` + +Print the line containing the entered pattern: +`awk '/sanjaya/ {print}' kerajaan.txt` +The result are as follows: +``` +mataram sanjaya 732 760 +tarumanegara sanjaya 732 754 +``` +Within each line, awk will divide each word separated by a space and store it in the variable `$n`. If there exists 4 words in a line, then the first word will be stored in variable `$1`, the second will be stored in `$2`, and so on. `$0` represents all the words in a line. + +`awk '/ken/ {print $1,$2}' kerajaan.txt` +The result are as follows: +``` +singasari ken +``` +Note: In the awk program rule, it is only allowed to omit one of the action or the patters. If the pattern is omitted, the action will be applied to all rows. Meanwhile, if the action is omitted, every line containing the pattern will be displayed by default. + +## 3.2 Special Rules +awk has rules that have special behavior. Among them are `BEGIN` and `END`. The `BEGIN` rule is executed only once, that is, before the input is read. The END rule is also executed once, only after reading all the inputs. For example: +```bash +awk ' +BEGIN { print "How many \"732\" are there?" } +/732/ { ++n } +END { print "\"732\" appear", n, "time(s)." }' kerajaan.txt +``` +The result are as follows: +``` +How many "732" are there? + +"732" appear 2 time(s). +``` +In the example above, the second rule only has an action to calculate how many rows contain "732", but there is not action to display (print). + +# Extras +## Ranger +![ranger](gambar/ranger.png) + +Ranger is a file manager in the terminal that uses the keys from VI. Ranger provides a nice minimalistic user interface by displaying a hierarchy of directories. Ranger itself can automatically find the appropriate program to execute a file based on its type. + +### How to Install +Installing Ranger is quite simple: +- With the command `sudo apt-get install ranger` +- Using PyPI, use the `pip install ranger-fm` command. + +### How to Use +- Open the terminal +- Type `ranger` +- Then the interface for Ranger will open immediately +- Use the `h` key to go to the previous directory +- Use the `l` key to go to the next directory and open a file +- Use the `j` key to move the cursor down +- Use the `k` key to hover the cursor up +- Use the `q` key to exit +- Use the `!` key to execute shell commands, for example `! touch my_text.txt` + +## References +* [https://www.tutorialspoint.com/unix/shell_scripting.htm](https://www.tutorialspoint.com/unix/shell_scripting.htm) +* [https://pemula.linux.or.id/programming/bash-shell.html](https://pemula.linux.or.id/programming/bash-shell.html) +* [https://www.computerhope.com/unix/ucrontab.htm](https://www.computerhope.com/unix/ucrontab.htm) +* [https://www.codepolitan.com/memahami-perintah-perintah-crontab-paling-lengkap-59f69445130a0](https://www.codepolitan.com/memahami-perintah-perintah-crontab-paling-lengkap-59f69445130a0) +* [https://vpswp.blogspot.com/2015/06/definisi-dan-6-contoh-fungsi-perintah-awk-linux.html](https://vpswp.blogspot.com/2015/06/definisi-dan-6-contoh-fungsi-perintah-awk-linux.html) +* [https://www.codepolitan.com/belajar-bash-mencoba-bash-untuk-pertama-kali-57bbca3c28e54-17341](https://www.codepolitan.com/belajar-bash-mencoba-bash-untuk-pertama-kali-57bbca3c28e54-17341) +* [https://pemula.linux.or.id/programming/bash-shell.html](https://pemula.linux.or.id/programming/bash-shell.html) +* [https://github.com/ranger/ranger](https://github.com/ranger/ranger) +* [https://www.geeksforgeeks.org/internal-and-external-commands-in-linux/#:~:text=The%20UNIX%20system%20is%20command,are%20built%20into%20the%20shell.&text=External%20Commands%20%3A%20Commands%20which%20aren't%20built%20into%20the%20shell](https://www.geeksforgeeks.org/internal-and-external-commands-in-linux/#:~:text=The%20UNIX%20system%20is%20command,are%20built%20into%20the%20shell.&text=External%20Commands%20%3A%20Commands%20which%20aren't%20built%20into%20the%20shell) +* [https://tldp.org/LDP/abs/html/localvar.html](https://tldp.org/LDP/abs/html/localvar.html) + +## Exercise +1. Create a bash script program that can process the numbers inputted as arguments! If the number of arguments entered is odd, display the sum of these numbers. If it is even, display "You have not been lucky, try again." +Contoh : +```bash +$ bash script.sh 4 1 1 +Output: 6 +$ bash script.sh 3 3 +Output: You have not been lucky, try again. +``` +2. Make a task scheduler using crontab to create logs containing the sizes of the /home/\/Downloads directory in human readable format. The task runs every 15 minutes from 8 to 17 o'clock. The log files are stored in the /home/\/log/ directory with the name format of the `date` command. + +![soal-2](gambar/soal-2.png) + +3. Run the command `wget https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data` to download a dataset. Create an awk program that can display __multiplication result__ from the '__petal length in cm__' and '__petal width in cm__' columns with the accuracy of __2 decimal places__, only for records with column '__class__' __which contains the string 'Iris-setosa'__ and has the value of __'sepal length in cm'__ more than __5.4__ based on that dataset! Display the result in the format "Area of petals on row n is y.yy" where "n" is the row to which record is and "y.yy" is the product of the multiplication. Attribute information can be accessed at https://archive.ics.uci.edu/ml/datasets/iris/ diff --git a/Modul1/README.md b/Modul1/README.md index 1fc3a8d..52c0f39 100644 --- a/Modul1/README.md +++ b/Modul1/README.md @@ -7,36 +7,45 @@ ## Daftar Isi -1. [Shell Scripting](#1-shell-scripting) - - [1.1 Shell](#11-shell) - - [1.2 Pemrograman Shell](#12-pemrograman-shell) - - [1.3 Perintah Dasar Shell](#13-perintah-dasar-shell) - - [1.4 Simple Shell Script](#14-simple-shell-script) - - [1.5 Variabel](#15-variabel) - - [1.5.1 Special Variable](#151-special-variable) - - [1.6 Input Output](#16-input-output) - - [1.7 Quoting](#17-quoting) - - [1.8 Operator Dasar](#18-operator-dasar) - - [1.8.1 Operator Aritmatika](#181-operator-aritmatika) - - [1.8.2 Operator Relasional](#182-operator-relasional) - - [1.9 Conditional Statement](#19-conditional-statements) - - [1.9.1 If...Else](#191-ifelse) - - [1.9.2 Case](#192-case) - - [1.10 Loop](#110-loop) - - [1.10.1 While Loop](#1101-while-loop) - - [1.10.2 For Loop](#1102-for-loop) - - [1.10.3 Until Loop](#1103-until-loop) - - [1.10.4 Select Loop](#1104-select-loop) - - [1.10.5 Nesting Loop](#1105-nesting-loop) - - [1.11 Function](#111-function) - - [1.11.1 Nested Function](#1111-nested-function) -2. [Cron](#2-cron) - - [2.1 Membuat atau mengubah cron jobs](#21-membuat-atau-mengubah-cron-jobs) -3. [AWK](#3-awk) - - [3.1 Menjalankan Program AWK](#31-menjalankan-program-awk) - - [3.2 Special Rules](#32-special-rules) -4. [Referensi](#referensi) -5. [Latihan](#latihan) +- [Shell Scripting, Cron, dan AWK](#shell-scripting-cron-dan-awk) + - [Prasyarat](#prasyarat) + - [Daftar Isi](#daftar-isi) +- [1. Shell Scripting](#1-shell-scripting) + - [1.1 Shell](#11-shell) + - [1.2 Pemrograman Shell](#12-pemrograman-shell) + - [1.3 Perintah Dasar Shell](#13-perintah-dasar-shell) + - [1.4 Simple Shell Script](#14-simple-shell-script) + - [1.5 Variabel](#15-variabel) + - [1.5.1 Special Variable](#151-special-variable) + - [1.5.2 Local Variable](#152-local-variable) + - [1.6 Input Output](#16-input-output) + - [1.7 Quoting](#17-quoting) + - [1.8 Operator Dasar](#18-operator-dasar) + - [1.8.1 Operator Aritmatika](#181-operator-aritmatika) + - [1.8.2 Operator Relasional](#182-operator-relasional) + - [1.9 Conditional Statements](#19-conditional-statements) + - [1.9.1 If...Else](#191-ifelse) + - [1.9.2 Case](#192-case) + - [1.10 Loop](#110-loop) + - [1.10.1 While loop](#1101-while-loop) + - [1.10.2 For loop](#1102-for-loop) + - [1.10.3 Until loop](#1103-until-loop) + - [1.10.4 Select loop](#1104-select-loop) + - [1.10.5 Nesting Loops](#1105-nesting-loops) + - [1.11 Function](#111-function) + - [1.11.1 Nested Functions](#1111-nested-functions) +- [2. Cron](#2-cron) + - [2.1 Membuat atau mengubah cron jobs](#21-membuat-atau-mengubah-cron-jobs) +- [3. AWK](#3-awk) + - [3.1 Menjalankan Program AWK](#31-menjalankan-program-awk) + - [Cara Kerja AWK](#cara-kerja-awk) + - [3.2 Special Rules](#32-special-rules) +- [Extras](#extras) + - [Ranger](#ranger) + - [How to Install](#how-to-install) + - [How to Use](#how-to-use) + - [Referensi](#referensi) + - [Latihan](#latihan) # 1. Shell Scripting ## 1.1 Shell @@ -46,7 +55,7 @@ Sistem operasi dibagi menjadi tiga komponen penting, yaitu Kernel, Shell, dan Pr - __Kernel__ adalah inti dari komputer. Komponen ini memungkinkan terjadinya komunikasi antara software dan hardware. Jika kernel adalah bagian terdalam dari sebuah sistem operasi, maka __shell__ adalah bagian terluarnya. - __Shell__ adalah program penerjemah perintah yang menjembatani user dengan kernel. Umumnya, shell menyediakan __prompt__ sebagai user interface tempat user menginputkan perintah-perintah yang diinginkan, baik berupa perintah internal maupun eksternal. Setelah menerima input dari user dan menjalankan program/perintah berdasarkan input tersebut, shell akan mengeluarkan output. Shell dapat diakses melalui __Terminal__. -- __Program Utility__ adalah system software yang menjalankan tugas-tugas maintenance. Program utility ini dibuat secara khsus untuk melakukan fungsi tertentu pada suatu area komputasi secara spesifik, seperti memformat harddisk, atau melakukan pengecekan konektifitas jaringan dll. +- __Program Utility__ adalah system software yang menjalankan tugas-tugas maintenance. Program utility ini dibuat secara khusus untuk melakukan fungsi tertentu pada suatu area komputasi secara spesifik, seperti memformat harddisk, atau melakukan pengecekan konektivitas jaringan dll. ` Catatan: Coba buka terminal di Linux, maka kamu akan menemukan prompt shell (biasanya $). Disitu, kamu dapat mengetik input berupa perintah, kemudian mengeksekusinya dengan menekan tombol "Enter". Output akan ditampilkan di terminal. ` @@ -80,7 +89,11 @@ Pada modul ini jenis shell yang digunakan adalah Bash (_Bourne Again SHell_) kar $ echo $SHELL ``` -Shell memiliki perintah internal (built-in shell) dan perintah eksternal. Untuk mengecek apakah sebuah perintah termasuk internal atau eksternal, gunakan perintah type +Shell memiliki perintah internal (built-in shell) dan perintah eksternal. Untuk lebih jelasnya : +- Perintah internal (built-in shell) : Perintah yang dibangun di dalam shell. Eksekusi tidak harus mencari perintah dari variabel PATH yang di ada di shell +- Perintah eksternal : Perintah yang tidak ada di dalam shell. Ketika perintah dijalankan, shell akan mencari perintah tersebut dalam variable PATH seperti `/usr/bin` dan `/bin`. + +Untuk mengecek apakah sebuah perintah termasuk internal atau eksternal, gunakan perintah type ```bash $ type cd @@ -104,7 +117,7 @@ chmod is /bin/chmod Selain itu, terdapat beberapa karakter yang cukup penting untuk digunakan dalam shell: -- __Redirection__ (mengirim output ke file atau menerima input dari file) menggunakan operator redirect >, >>, <, contoh: +- __Redirection__ (mengirim output ke file atau menerima input dari file) menggunakan operator redirect >, >>, <, 2>> contoh: ```bash ls /home/Documents > test.txt @@ -115,6 +128,9 @@ ls /home/Documents >> test.txt sort < test.txt #file test.txt dijadikan input oleh perintah sort + +bash script.sh 2>> error.log +#Jika terdapat error saat menjalankan script.sh, pesan error akan masuk ke error.log ``` - __Pipe__ (output suatu perintah menjadi input perintah lain) menggunakan operator |, contoh: @@ -227,12 +243,6 @@ Output: ![variabel](gambar/bash1-5.png) -Catatan: - -Syntax array diatas hanya dapat dieksekusi oleh bash, sehingga harus dieksekusi dengan cara bash nama_file.sh atau bash ./nama_file.sh. Jika menggunakan ./nama_file.sh saja akan muncul error: - -![error](gambar/error1-5.png) - ### 1.5.1 Special Variable Beberapa special variable yang sering dipakai: @@ -262,6 +272,33 @@ Output: ![special](gambar/special.png) +### 1.5.2 Local Variable +Ketika menggunakan bash, variabel akan otomatis menjadi variabel global jika di-assign secara langsung seperti `bulan=6`. Tetapi kita bisa membuat variabel lokal untuk fungsi di bash dengan menggunakan keyword `local`. Variabel lokal yang terbuat tidak akan menjadi variabel global. + +Contoh: + +```bash +#!/bin/bash + +fac_func() { + angka=2 + local tmp=10 + echo "Global Variable di Dalam Fungsi : $angka" + echo "Local Variable di Dalam Fungsi : $tmp" +} + +fac_func + +echo "Global Variable di Luar Fungsi : $angka" +echo "Local Variable di Luar Fungsi : $tmp" +``` + +Output: + +![local-variable](gambar/local-variable.png) + +Dari gambar terlihat bahwa ketika kita mencoba melakukan print local variable ke terminal tidak bisa keluar. + ## 1.6 Input Output - read digunakan untuk mengambil input dari keyboard dengan syntax sebagai berikut: @@ -848,6 +885,28 @@ Ada berapa "732"? ``` Pada contoh di atas, rule kedua hanya memiliki action untuk melakukan perhitungan berapa jumlah baris yang mengandung "732", namun tidak ada action untuk menampilkan (print). +# Extras +## Ranger +![ranger](gambar/ranger.png) + +Ranger merupakan file manager di terminal yang menggunakan key-key dari VI. Ranger menyediakan user interface yang minimalis dan bagus dengan menampilkan hierarki dari directory. Ranger sendiri bisa secara otomatis mencari program yang sesuai untuk mengeksekusi suatu file berdasarkan tipe-nya. + +### How to Install +Cara menginstal Ranger sendiri cukup sederhana: +- Dengan perintah `sudo apt-get install ranger` +- Dengan menggunakan PyPI, menggunakan command `pip install ranger-fm`. + +### How to Use +- Buka terminal +- Ketik `ranger` +- Maka interface untuk Ranger akan langsung terbuka +- Gunakan key `h` untuk pergi ke directory sebelumnya +- Gunakan key `l` untuk pergi ke directory selanjutnya dan membuka file +- Gunakan key `j` untuk mengarahkan cursor ke bawah +- Gunakan key `k` untuk mengarahkan cursor ke atas +- Gunakan key `q` untuk keluar +- Gunakan key `!` atau `s` untuk mengeksekusi command shell, contoh `! touch my_text.txt`, lalu tambahakan `-w` sebelum command untuk melihat output dari command tersebut + ## Referensi * [https://www.tutorialspoint.com/unix/shell_scripting.htm](https://www.tutorialspoint.com/unix/shell_scripting.htm) * [https://pemula.linux.or.id/programming/bash-shell.html](https://pemula.linux.or.id/programming/bash-shell.html) @@ -856,10 +915,21 @@ Pada contoh di atas, rule kedua hanya memiliki action untuk melakukan perhitunga * [https://vpswp.blogspot.com/2015/06/definisi-dan-6-contoh-fungsi-perintah-awk-linux.html](https://vpswp.blogspot.com/2015/06/definisi-dan-6-contoh-fungsi-perintah-awk-linux.html) * [https://www.codepolitan.com/belajar-bash-mencoba-bash-untuk-pertama-kali-57bbca3c28e54-17341](https://www.codepolitan.com/belajar-bash-mencoba-bash-untuk-pertama-kali-57bbca3c28e54-17341) * [https://pemula.linux.or.id/programming/bash-shell.html](https://pemula.linux.or.id/programming/bash-shell.html) - +* [https://github.com/ranger/ranger](https://github.com/ranger/ranger) +* [https://www.geeksforgeeks.org/internal-and-external-commands-in-linux/#:~:text=The%20UNIX%20system%20is%20command,are%20built%20into%20the%20shell.&text=External%20Commands%20%3A%20Commands%20which%20aren't%20built%20into%20the%20shell](https://www.geeksforgeeks.org/internal-and-external-commands-in-linux/#:~:text=The%20UNIX%20system%20is%20command,are%20built%20into%20the%20shell.&text=External%20Commands%20%3A%20Commands%20which%20aren't%20built%20into%20the%20shell) +* [https://tldp.org/LDP/abs/html/localvar.html](https://tldp.org/LDP/abs/html/localvar.html) ## Latihan -1. Buatlah sebuah program bash script untuk menentukan apakah bilangan yang diinputkan sebagai argumen merupakan angka prima atau bukan. Input berupa integer dan jumlah input argumen bisa lebih dari satu. -2. Buatlah sebuah task scheduling menggunakan crontab untuk membuat log berisikan list dari directory /home/\/Downloads/ dengan format nama sesuai command `date` di simpan di /home/\/log setiap jam kecuali jam 15.00-18.00. -3. Lakukan download dengan command `wget https://archive.ics.uci.edu/ml/machine-learning-databases/00436/Container_Crane_Controller_Data_Set.csv` untuk mendapatkan dataset. -Buatlah sebuah program awk yang dapat menampilkan total penjumlahan dari kolom 'speed' dan 'angle' hanya untuk record data yang memiliki nilai kolom 'power' = 0,5 berdasarkan dataset tersebut! +1. Buatlah sebuah program bash script yang dapat mengolah bilangan-bilangan yang diinputkan sebagai argumen! Bila jumlah argumen yang diinputkan ganjil, tampilkan jumlah bilangan-bilangan tersebut. Bila genap, tampilkan "Anda belum beruntung, coba lagi." +Contoh : +```bash +$ bash script.sh 4 1 1 +Output: 6 +$ bash script.sh 3 3 +Output: Anda belum beruntung, coba lagi. +``` +2. Membuat task scheduling menggunakan crontab untuk membuat log yang berisi size dari direktori /home/\/Downloads dalam human readable format. Task berjalan setiap 15 menit pada pukul 8 sampai 17. File log disimpan pada direktori /home/\/log/ dengan format nama sesuai command `date`. + +![soal-2](gambar/soal-2.png) + +3. Lakukan download dengan command `wget https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data` untuk mendapatkan dataset. Buatlah sebuah program awk yang dapat menampilkan hasil __perkalian__ dari kolom '__petal length in cm__' dan '__petal width in cm__' dengan format __2 angka di belakang koma__ hanya untuk record dengan kolom '__class__' yang __mengandung string ‘Iris-setosa’__ dan memiliki nilai __‘sepal length in cm’__ lebih dari __5.4__ berdasarkan dataset tersebut! Tampilkan hasil dengan format “Luas petal pada baris n adalah y.yy” dimana “n” adalah baris ke berapa record tersebut dan “y.yy” adalah hasil perkaliannya. Informasi atribut dapat dilihat di https://archive.ics.uci.edu/ml/datasets/iris/ diff --git a/Modul1/gambar/local-variable.png b/Modul1/gambar/local-variable.png new file mode 100644 index 0000000000000000000000000000000000000000..7d03783d0b0f5d613a7d2886423a408c09d301ca GIT binary patch literal 46090 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

iA@? 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 E&f4ES+RFIt zHjDUlS2R=o39clz;nCUZ5X^SAk`s6RfJhK8H2#xr{;|FJlb{VPe~ZJ5h@1HEu^}d| za3^B_FU~|O!Lg_t2vk@LR_yxc^s3LRMsR@*??ZcK^YJ(sE z)`EdxNib4|jd`=JjYvEe~^4hlHx%4-TX*?n@pL&LYk@^Ty zMDE;k+-3tFKdLVuQ1b*%?ad)0QbPCb@6pqfnXrIFx`EO$kd_?vSZ{1T^=KH64U~S0 zCcHPj{f7&n+%P-2;dD|uskZ!%S?Ntc>>F8LV@voH7w4`wh2c;_7VRVq3rJU+!US-x zI>MYss5&Kt1nLI0eV>MffDFzqOeQJ{8?(KRBMWevF3MK?3=t5vOG;@EaC`VQaCa6x zu;+g@Iwt90?QCtp#UE)@)7=9YZdeT z(lg{t+|1}9&}ftF4?m%l?Soj(U_OL%YvwEJpi^2fdZe-9rT#b59$f70UR|NM90!I3 zG)GGx`Cl8qQarH;KbQ@hLJ3UUAR!1sWPWW&&Wow5oVI2A_9OT7myG}k)V(OOc#yQH z8hLjf&IV2>{+{P+uhri0y56)F#Ip+iO;i|M`9(9?m1M@+z(@ReKIH*6bK4OR1G-cp zVFi_u(t|<-43(5L=f*P>2jA2hUgcRr9jwW?9yZ48%S^_?&K1GD2p|OTcZvL^2%cs{#w|SQlAPBGFPt`)Ct7vv#6}Q}Q`<+uaK*Q#0 zNM|DjZ}zTI{CZKjxFRUSF4!mHP%(8+s~y8AgrlaJX{9YzZftGMmwbjs)fs#c-?oxZFkv2BH}1jQ-+UR2oQv& z!6^Rg#}Zivz-oh->eGjz#)MWhOPB@6p@DA9E0N83*^&>MZ~l4ak>nP)n0w=y3P+xI z$!JL70Fs_ebzDo)ZI4`jUL8Xq7ap3|2%&NV zfTay_ApqbcZn{Z|)?!y<>l{5rjnGt9WF`q#)Py8sEE+|Ds-hu&0}!X_lsw^3f>mf# z5TCQL?-3K+Cpjjz6RLa^RmMSB1c$RUQ4rFO67d^tWq}~E9i{l=UQn9F4uUD1FbxfA z50^pT_;N}N_eW+1+u(9b7kue#HwG785M?m{wJ?g!W-=%@_lcyi0TZWOub*iP6<=~n z4Ks*55gnZPyY`=v*m_FXxh^Sc0t9KbMUR`j^^o(ZvO6>mxN}npN-T|B4|-|ZLdJO~r86rz_gZawryevXAZS@S zKZ-&4#6L011q#jzFBx1Ug2@|EV?izCnSyeG6y@fxiCo)&Fra0Nr+0&R2UZf?_7D#d zfIbaw^Ii5N@4{1^3&L1CveQ}bS@}#CWm~y+kC)>L-IDKHnriEriwV2-a+fyz_B0m& zNNz(J60IqEPJ?EM`~yvLAPuugjl1wA>wEQG%r_XuTtzl3)%?=3fGn#}fRDPnsl1Mi zCCbQ#dqQ7@14S?72(|XUsnK{ZOz9hR25+XBf%^=YUg<23JjA?n`^9_Sue5YWwueoI zmjGd7VPh}_@k)#|=saIr^tlpYA@A^0_!;`%vQ(=rH%Q-5GjMb|Nk2BGr4(^*Nd z06o*GjT`xH?hIJDwBY+WtxJBRrm@V4qL+Sk?bK?YZ|BdEORGqeKMym^nUsonmL*QT zr6h7j6E|tb#tU#u7iD0n9fhAqp>oOaaIP=|OQ%Ox)N^yJ1@3TciuD(yol9`#X-y+< za|*Ihdz|_OQP8O6=o~0vD;r5^@d7D#nPpHA@8XvL`%)Vtu&0DWV5j&rr8BEX@%}*a z073JyBm;xKb5|WoY*YX>7z5%rg*zl{(r;hC3FY!dG9U^rX6tC{mMikSYB-@lCIKBy z0|$KPH?;|p8QTrH($GmPXt7WgJ_f$Q0={bFG-3rTYQ%+pf&(z7oMTeLc=A)>9MSSD^DTQe{`A`_Jn!Ib=o0ZAfCk(a^KX9f;HRrH5b z64HXV?Gojp4P^11*tN^gLr`R({Z*NPP>BS7wS(Q1g4U{HYxq2Z&w~l@=?S9&e2F8l zg>{SIJTVum!Gwh6{)kJ=WH`u#pzv~l@r6hvJ{p`U(tHOiQLB1(GNEEVbOYTS!1G2l zjm2kZvXt3S9sIQ_{`OFR!VsMT^Dc&i00YA6H9Kc6wp*M{XtnU5z#I&C_7)ll{OdR3(x<7tdYKfKjvy49^}ys80L`;www$HoF;Uj*v`4LAUa zdh_d+{-Zt!_#KmnwrOga0B800zoDM?a-FRHV43tS&2G4_Ty70~s7xdwO+^LdM7y=g zQ11(t=fn?}lP|;kl{O*33~7+3a&#uisn4wi)FFF-G2u`SE)1=u+Xa55vgC{Q^s098f zI;taI0XOnmfvr0I7f)!jFA5v>EzMg$QRH6G7Y8F#=BqxZgX6%dT3wB2wu=qTQQ*J< zup$`TkN{$Xihzza?p6`T&5!OZDJXJ2xfnR%l$V*G#tf>k0PMx_4cC@N1oMMZzRy-~ z>*6mpp<;;R-rYe{}Y()SlW*@Otxtc1RTLxvc*h)9bt#=yx~Bt`bQ zyQV?O(g2?hTjL0w263Xe@0EltL(P9^@0nAy}SYdFKZzOzBj&*pxbw1z{CJR_VL&x zndH?Azl<*wZe5r80P&q^?#mms5usS1gOcgRGp@Vn0F2E^!FUTbKw;}gAl2G&dCn`t z(HItsIHy8X=hx#Nb`y2@#D%IuCZjWoJVTgSe0hE_vqCJvixmb~LE;*_Hi$oiawCIB zhq&q_Icq{wELIyre2ye4()LJ);j3;MpRg2Ue2~Q8Kl|{5We2E2f7$>9O?gmJdkB2| z+lL3O+iWan<-{dnefFk@pj0OU$nJSFQqz9KtilC9godS7)y28BB`yjROCAII*7NEh z{$@Y`PKqYk6<87--~>PA-!p3=HKh9#k#-cF7Yna1*~<54?OIJYuKZP~8x(DgMQ1)H z8>b!~AnWYBp3m&dirAJXIW#rf2xuhuG_yZaK;ZP?(NGn&g;I_70zuyPpP-*6@E$0r9|?av1^n{hfFAMwg>u%HC4;gQi#fe zA+>!=D5gk_#gf<-3rkC?hoHeaCEx!llj;#pNOxpHjG6^| z&d-2D<`nCRQm8JpU9c+?-dP3ltrddtydrSAawj4ns(=&28F9L{$u^CS;zEb|^}~{- zZNQ|iY4MQ5NfO|@MImb@tlpYu^5Yl9kx=O03cTv@az>3pKnW(Qt3XUkWxlew2^&S8 z9{busb!r0udm^Td5a8yChY~gVsDEl-Dy+ae6eU5Iil~P!I6^}EfdK#~&6=MoN-^J$ zKoG(gi!coAXaxp7HlzlBtbEu>P}ey{G6<45LAOWpSWQ_)^56i0_h_Y9O@T!?yb@O{w7ttu=@hhy6}UVuK|x@manbDcD^@9`75dk`2^T} zYK4><7T=rF0NN@M=^x}`$y^Dalw$W3Ipm_TaJm^6*1=bM*P&`OU?&yzRyh(@< zbz^Y=i~cBgSXmeqjJ7K5-ydig6OY3!sY#4mH`<&U@X7<*Ae{*+I7Jj1`g)Wa?TD>E z!G468+YO;#l;T9Ak|5$b_}KFFh?}gWa&ZY|V;SQhzY42#C}aoED$D(A|0h6jUm2-#&iqH-KWWbzYt=57a>M|Cq z!y_F?sm*6tmp9G!k|R67rwJ)B(Q86MfFP#$9zH5(oV$L1=BOHGfv|Tg_pb1X z_lV^RqR+Aolx+4d(&u}%kWo~W>RQeG4JhCSF45;Kt;-F}=e2O~>~}syNx)yb-&SA% z)o&e7{)z6J%jhPUh4FGcmPs3*>TA=^J*m?V%S~Pn)C^nt!P{JqwC! zjae4iNL6c@zJ$twsCqU%!uYiqY`drost8q_6h*Bq=6;!%MBvk?t}QlV*|1L-g8c2& zJ$BPIP?1norqBkPZ41d0xouH|3Bs7YwJCUgm1w$rtC+*PildVOM&(X+xn4*fOPXg6 zF7H8Lq>6C705AAEnWq~QbNW9T7IKAZ=}u|D=twX;N1Y?v?A}>Gn^GGAsc?F`yx<=S z{vb@Rx*%kSXW1%thn9o-{?k2k148rCmmj9Jx-#Z_yxGDxRABJqp!Ix@6+A5MZ(q`r z4KN{!#Z1}A@K6ntSF+{o)Wqdorz%kuxT?8xPoLFzz*qChp27N>B4|LaLzlU_WW4bg zFS$^S3#|6Vu^PnFFM_U6h!#Or{jn~kQNxL&KZ!%!9uQ~iErRCWr#BIEeP&1gLfl*S z$vg_h0eqB^lGp_EAOV6ZN)mUMF>X#$YViA!#4shEpxV(Lvc_fhKw*e|OgMVDN;3Ztd?D5$u6H7ZvU1G{P1iYWYyQvqTY=}} z{hj-*t!}Gf33uQkx3MrlJp60HNbH54xDJnbCPE}s?yf}qz~z*t${>(GKKRpvhr^{R zT)C^7;zzf^Bt8z>fGdj^E0xZ-ozh2C6h9-Y*d1yaJLEjLzpY;gR?KiQ?Qk>-M{vd1 zS&pCj$n5 z)ayZ!wh&`+V`g3EBJ@wAOIAYq#vJt#H;4ovB!(J56ksnGfMd|N#3^J?6&icCGht~^ zf6I`6?y?j5{>iEi`hp@pJo$W=?B5JVXh*(=52`#l6Sx_>@?7D%^eC*&Lx%4w1&Tod zH@r~nut*?F2|O3`x+nk2gJ7!u>+A+Dw!4CBSKgB~W>$5qj|Hv93^AWB331>^j}R{y zXLpwWrtdmIFH@8kjIS-GnvaPu27GA(5W7ei=GSN$o~-8~h|UQW6(YaCc6hY*a#n!z17AOkdRe9gKMzU=;0^LTD^Hork^ATTiRIQ;+Q%QM?cJEzLP8^)u7NB zo()F;3o5!No~q-`xp$7g9sWhd--MJTPf;TePH}M`Q#H0Mj(*+cSffE4!){4EFGhpT zx7M-MoW`Dr#zJGpjlTgODz<)m+GC97Pi~{zQDH_$Smp3--}V`Zx8vmH6ltfwO{1ih(I`uOZfe}u)4~MH zhXO#InJe3hFauRnF%%|ixbc9qU4*}DxM79#WlL(9&#HM|+>NO2+^c|~ufy;eMx%8& zmix)fhd_T%0xv?xTbd{nXxI-(P|Zr#@gyw5_WEgnAIe#d@Ws`H<_lX3JGhS{>cU{( zj0>m_yp@GxGQB@{3shIh@Cu~2EAZC%T|}h`FF;PGVn9emD3xsXm&|M3R?p^NR^H;HbkvW^L!uScAsByx*^spZkCjQFxJ|@Uuy=NT}D==foue{ zDSsDwy~f2%So9YbZ$kEZjY8t2Zlk>atIfCx0eoG*Z)v{pA@o9uX54yyXb#VyA3Gdk zG5EVtGbLc3mookSgb4kDg6O@(Nz#}dx*!JT{YbbrLt~Tvu@$=L3!<~&Qc<==3sfyL z0V@j*X?$GVB{nBRak>5xCf5Lu*e^{@=~j{T51(k$8(902uW14bMu7s$?N|@jpeG^= zvp&((KP?y-|DQIXDT>pC5ipMZ`*C+PAs~=EhUf0z9^}eLt^e0x^i!^b+b{qB?bgln zf6W6Jnqbe+7%0ZgH2z2Ar?FfE@<09Pj}SNk(%Ezf<$CJU`2qljaql!Nvtofa4OE4w zu>W{gF#>W6^G1&2zB8uX{q_6s%{iL5^pXd;vS=XTBkW>AG8z|CrrRD{Y(e5MA|Df@ z#rB`Ok~ovZj7VeUxmZADW#)B4F-HtXJ2*1&%7CeiV(ZgrI(?6OF%oGZA&PLN4NdyA zSokuk5sKOQ(2l01R6T(Z5Hy69zi@t&-gu>|MVFvcP=wZUxuC8-&LL-IG_Ej|%Xe|G zr&8f7o9)@t7wX0hJ6-`NxelpMXBAF>q1A&~*!i=@_^6Vdx@H3XOqXh#9Pcirc~2cI zLV~opV%M%>rE^~EfuKI21H`oz(V?~jG4;0G%QUXh|N#dLnXM%i+IJd*$2RXbArJ2WW$uGch?T1p(0 zDH{Loi?Mp!h#4Zdmx1J`yeI)*-9T;@-IC)?3_N$2l=M~L?F}f+cm~YU(a*pF{`P(N z5|fcd`9c7em36;ECQ?rv+vH0olpd`LZlZFTRn9rLGjXBrv73Zg(54muNzI^h?;4mC zj@-5GMh+4s9*V`?vWkJ+)zUF6+&;66GQeM?wLjmbr1B4NQVqRl^JEiVRvrSTDU7(2 zbUo~#Kx*I~@hGD<2o3Q*l0e`u_2v6Upd;lHOblMUKMY`)H<-E;7+So8YY`$`1|*HO zEscryllL+WEuLM?i5Znjz<-Sek3H9mhx7A5L%@bi{S8OURz<78u9t%m3Y^FBa}fsS zkyBOwL)Yu=(0#cE8t9Nw1Amim=H9$zcoiV|6Z3{0?@>1}LV|WZSQ>-J$l1ABNRgKW zVOPHlIAJO3#3+K&=`74~Td)_&P8YP4Gur zOyMPTyvAYv@Ifj-nlj!1`5InG-;UVnaF#LBy^#7g@|q_eU;HNkU{En84I?iJErJI* zKyv!+H{Vw-bA%}ax#~CwP;&84bff)T9HS+-fR`8Aw0>+Y8V+e85$3HS1*VbiYEKuE#l{IhwV}~0IzptYGMBF6^1xjo&gsvnnw7~ z?~Ip+P{g95^GReWZ>M&541!$h)&-(1s3Y=!EdKt18bDh!gcNpW=yrG`jf?~1X;TxE zu^quXhPQkQ3iQ`R6M-@8?*7S%z0B~Ac0}4R5o9jG&b&2tYSVO*(7A{g!}#qZRDZ1C z>Pkffdv3&@U`sjfusftegny@A^)6PSkB@1C6Zg-Cb4dj12z24)E8Ldclb0J^M@6*A zzR|-FhDPyg!z5vHrBc8w7hbcWvuVD=4Og#u>_$IQAwyU1Sxv0fccB#R_blp>3s)FG z$gG^T55|_e;j)3&olq){{4`_SYS1S zkQ092wRYEmk||1lblDvp2X>cE|41SdK->|hXiC5D7P}sG$}D;W1Q!9he={vDIO8|f z7Jr@+pPa#GiVLD@ph}uUC2+W8eyF&0{Xj@aWW~fQ0FQOr6Mm)`4L^L_uc&|kU{l&R zh2dFy%0Gt&Fb&4WtbFOAQEwx}Rkufz!Qff$lh@#PT~tiX@0>M9y>i`r~o6M_q?<3N&$k2KQusTAWNV z(t+$OV9^;Y`er!-Y-Jm2QSj;b;?R_fKEo?aY)q(oPJAN;aU&IRdleEC@j{D^`?AU` zrOFTE&ZHdc{MHQ8NOvd&!UozGtiZzxI3bW+T2d%P>VlL}vyT4w%{~VUm%F9C_1qPj<0iOTWAf2EH4;wPfU7kRC z_)U)g*FW3cBR}mbIsGbsfQu{WSb%?h?Zc@26Z)s%#a)R?1MZ&}C`a4Qw9ePP|B;1w zn-w&)`!CP=S0DesNQRQ~?Ei5?UV<_Z5>!Azuw#Va-!39TqH%@2aa-FB{fl~nU9x%1 zU4wc41^CaX|Ics#zxzhFyU;cTde+yEAN!yO01(3+ zdqqxYJ^}4NEA^Dc+Z7rGBm4@dOK`Z(?S)B`oFNtXeOo)0i_8lOTH%NuXQ+9Xv)jbr z2@}LyQVWI)tk*XIA+enRvIg(Ijk$I_V-cl}yco9J+966ukii+fQ5?MG7dpjUC5#a| z!ycRJ%(i#N{PL|kS&#(4Nfah%7+g+0R70DK3hNLN0MQL~2@&Opl_n0_(6IlPkSsWC zX(FaDF)Ej_w8>lmF%5B;|GU zQlNnigZwEE1qh0{BImDtg^DCbiP-GoxG*Iia&1iHrG2V5XMXVW*i?Jxoz zbpA+w(^y`Rg@<(T5a=4eSrIGoXsr>;;LqLB!4k6N*`)(>{s}J|v5=zw6J1`N5y|DF zA1M%)YBdwjoJNI~HKRcF&47alSAYWttsZu~fLRTAV1PsGY|S7t?dY_Gu1E@^MXlTS zuZe(wn*>a7-we=<0c#~uRpy0Nq+hdYN)vKPU-Iuf_xn%_lEC$C(7UR&Qs8&VK_+h= zv1!014J3e(M7yZ$U@=>`8USCoa~8=k`0V~?4aR@dPgwlie7ldj`lhQ=_&KX!U2Akt z^A1~*z_`tx9Z^Qh78+YCfh?c3m+-!rcvkNC2?14;?QJbNy$Y`KikG#tXBy4Ph|aLU zLr+0eZ3OFu6EykgzhZs}yMq{1wB}@HTgeRKU&pJd%5qg;0~IADfr7+`8E_(EGd!7e zJhbu{kO%Mcym~|eRyhfMsl+c2aB}8Cl!(GG)QO84B5!O8pa5il54xyz$)z%e!XHb`cx+C4{3dEJ7oL{t4bd21E!k>Vm~pe_{g#F9R6tLPZUd zKZVK#SrO_K0AOJNTP_Jm$U~3OSLysbd404T<gQ7LaNla)c}bP zn9EEJKv3*<-*oildcD~il0++)m!8H75z9?8v#}r{!NhXaRSJy3K>?k*v4Ij+dQXaP zUojUVVRg>W0tbgQf+Z7t*F>2T|GgMc_`o`d)YZa|{Q6)t+h{9GET|8!Xn`)K!VysClO<9fGp|udAF0D9BcvCiWl~Yy zSm$dSpeW&R@V@`ocWC#PG~kL)AXfY-i_xawXTV=jY*p0SN6dv6Jx}NedCY7cM_Ud3sslR3wTKqklXTqwD#uVY(-!HXv{Gurc!gv zic+n4Zp=Cui)hVS4T)CGMM@B*=Ao)+4W&qnnhA=URZ%fV4Mj~chnjBsec$`ud!PH< z=ef`C-u$zk?6c1~d#|(4TA%gV`|PCxdFo-cn5uL=0f>6*M=c2g^kfO8zhoDC`0CYy zdjs&Jrmi@q)xJX`;+I#Ux+;A1Pkc&qX;-eRsO%f^L9+50eygas^63jBC`BKZ_ZwT0 zLH|eUNqLOv5IXwq$Ld=&@%#>H?<-N0qKspy$)y}(8)i;#eV;_>33u=JUAiLkRQ&IV zrTyT7v75$8GL6*|rx0(Uh3=yQrphihOnFuVa&EiJ2+KL~Os05y+61oxx@L(<-s^2f zx>36Jsy=*Gi6-Zt(M+Sixq|6wkgrBt#13c4v*b|2f^54(A~SdUh)%+V)dXxaIa1;wreCWL98rsLp8BUaWk#B;oZ*6R74Y+D=f+7V7 zG`7C@x$|%WVWCygH1k~nC^@=S@6QkJ%1v&ro78Z50_NXR%dIE&ug|a=K1?iYJqA^8 z`NhbBjS|1F3dK?ic|9cY)}8VQl?kE34LGz?w)`8<#I@dRgyna_&z7kE;4bYh#-8@c z$g#Yr^vIONMZCKxBKohmM)EUzzCboAe-gPy#atMI}@B zkr7zSU0Nt7fy_l?e~*9b&-)?V@tE1!*_;+#(egGNsCda;ug*E^Xu^ZHhJzMflTbvF zSzr;9O{e(Ru|9^*h(A07Gx52aI4kg0oWi+Sy#oVq631Y7nD2OGn+hg;9laxAk&s1m zm9S%;^tz2T*@am97;c*ztMHNPi;%-QpTA7 z^LpT&+cXpa0$e?zG#*1&95M7KX=@gaL_uYwi{b;(KD>u1I(irHUP_2F&Bf5RvNPFn z&rs?2O#9wEC1>^8EIX&Rhu^F*gu*u$>Feo)T%bq0tP4&lb8>r^?(hR-@XL`Mm+M*@ znO$EaPN#|yJ2zdj9e2bl{ah=>eTYt)n6vLImz|aPA_}FS4at%`j+06ZrM!sh_dU@8 ztngWLD}h+xMDb$BTzzdIwa$zWt6`@+=hYvzQdbXCSu39mvKH*$7g)d3yI_?4>ppEI z{HBxOD`0`5rj4+(QoAL~W~g5^i&&z}z_Y5>nG8&{r*_*cRUJV}bcVNzDA&Gcsf(tI zUlgBa2`cl4IJw4aemDs%H!0^2c$8Uhuy`OW?QzQpCxkT13# zL+Z$e+)b){N&vMGShje=rL{$8VNaLd8Ou|()^TT@v2II}{MaziQg`XPj2kWJo9x1D zAGgD}T1M_@QKv8^W2}L<1M>5}9?P_gBz0v;Kr==^z%H*I_4nUw3#B$-7fLQcoy72Y zc0-ADvf=L434*L*cZg}MRiBtePj0mY2#TOUNk#`gzt17h+pT`#`7?aDp)OKIX)tNT zQkmX$X_r)j#4{r{*^n2QEFbpx1rOc!RZ_r@BF0x>IWwS<1NAKFiYNzom*6#UtF82o z%u=hw$Hi9k_S73Hc-DuHk_C0&9xvk?sWQo#v~D7C0fH?C)I_XmQksQT?=*%XcwEf& zG@-^Um0?OH^MpV<`-bAr^;`PGb?+OL4yQ*Eb=hcxi8X8j5qqE`HENYsP>1*G3Dt0e z7zkA|5JLK`1;Cs$1CiAw*YpD6v{wF2vsTns`EH^r@O(x@W;2ac_~#lrWL*GX)J+RNT%>04%rXI2%zsTNYR}zB8iuXw=DVVR z0(6ayL2ZW-829qvzi1dYG_0Z{&K%?Q@bgm*K@((*Zd-R$Fb)+-s^&-_G`=dP)LKh0YeA0D>e=NO@6A4u2Pt#VKsYnB8rZg5pE}ch zs_-r?_KAk?A(2~+0H@-VUHns@UA!5_FIpszCbf3n-7Pcbzi330lt^>3`cL`mY&Ktf z;SHyDKG=*J+#g=9BTijUWW$%8jo5WuwA-JjyA9k=5j9R}7XP@IN|sAEjQR7(QuMR& z+R;B5bjzY!f-HOCDQa3|Y5XAd=gvR5`=&7A&c9Q~Mg2~R5znS>ky;ElrIPv)(nLp7 zpFbxt>aM7A2^g^0$=`7u69XEaWjj^-69o=8{E|Xay1tTv) zsaGF@JgK`O!vofv; zMd`b`DGflZwYBRfS{?hew%|hRw9(GkqtUHONzy<%#BLa6*k zK18opy1#HamDR>nZXLtjs9qkxC8k%QYVStl5kI}ZtKeoy|5 zk`uBrc+f%e@E3?>0kD?U6|hVF$#M)uds7Co_MtC!}?3VUU*$BsZjD;g~Y!x*P8ruCoiI|p%H`G z?INQJW_069j$~n> z|6YTlrQ@SJfaKSYO8S9ycuf%fS4~QAhwBBaOM%oA93vnJ4MAo*D zsku8jyM~K%`}gE3!tjbDS3>Vb{jRhNOvtS(?Z zsGGSxCo+)wM-s|5-L>IQhMGRxZ{b=7-PfvsdcT-&xI`nFqBIC8AY(PO;CGCS2n&UA z-5(}iYT0!zHd&JfN~09fW4;la3wksO54DX;NJR9TD{tFmmpn>7cpKzhI|m9u8pMgm zpNS!{Wky+|?bsR?y(qu85`v7-o-pdPy%Njwvsl~n3aByv_c$`Q|JmW0?r>#W34J0K21o%$l3<3v z{teq!vgw**gfm;$b5NkThgxrO{xfxNMf^^cMViN_!s|H5_vlp?T3q{IH-+SJ_W#wI z{x4smhsgEIPe-S1PPTI$3<9;nFyyu%jkgxHW309v_3>Wh-W8DTho}W}D8F4DxwEXv z|83OS!5JudMabooB7jeT-tP9C%zxa1Xrdk%u4Ab~4b?GFIqMa=b3r1ey-)e4rdvRI z3LRSwK5%jp=C!KwfB6J#@-_hNrz{BI2J`&h=lQWer2Ug{Io%itZazO9<^$N7NSOfu z&e-pR2Ak}eAA5YV0zdn1y5>X`juys)<~@A+M)a&W<$e^uR?c@relzzy`@#4G7$^F-pac8HVFG`xi zKS+hO8~~E8Nmb`*zoAN>)h>FCvjZgEjtV_jAOWPC_#^K3`}aoeY;G3Q?CujkJvyNbSaA1lh43L$7^0ze2CG9b8S)cM&JLt_uuj zQ}j;|4v)JN>y{}%2my@gBFNHKuyky?=G8v!zZxDaDhpB_|E^d4_D!xId6QSa{h)G?# zig~7bZ+$jB-G{|I`s|Zntf_fdXl%k$e^VOrtG0U#1fW?9{(Ke7qX=*`Q~^{AhU6VE z^j+uNKq9|<+jhIEJ_`hNRx$ws7d|3;+@-yc9g3*mbK%Eb%;eTbkUZ?uf`K6y4F;Ff zJX2nWpKq|Bs!m#;K82P3!zx2D1EKZvgM%{zvjYpKa`HjB+k_mqSS>2KQH1?DZM-}q zKoqQ{(J?ldoK6o&iqqJ7piAvj2LN#JtIpWUJAnQ$5Sl39&eeqRSv5+%BOocT6!>qb zpDpRGJKhS+zLN1L?}9ha%kM1-@Al^WtQZ=ItQjsGm0Pac^8R!^J^VrzOlXYKs!e5u z5BmQlYA=8uz!!~+r3h=^c;(`r$z~JEH>k;9%ZGbl{pFf27Pq$v_Ic0#7IzN4VR=vP z!DlLKzn$(c038{dV7~J}z5SEJeejDqrKqa|a}I}&!Q_pael&@aJmC;<6KUA z<3MX%{PcUWAbvUHWS4vmZMw<4*dd+2O9JiF)3B3S3v!ugUGHk~KN)ljk(Vf;HnBN7 zy8iq{&-mMLo&md{?y^K?ejl=&RY*{R@Uj^@-@nZj9ye;vMuqf=u7yaiiF=pmeza{mb@i%S};qlG<*Ngub*mNeLY{>TSzsko6 zOaFTV|L?%{f0`G5sc;mLGE^R3ST)V5DtcZPDP|YY)IKK%WpCK{(B2A*|GfA^u4EKp zL3zYz63QvnbicQk*njNDK0G&@_c?j?RE&NdyV4Y4{z1RsY^=Tpe->c+gni_XonPBu z{!3Yoy>p7xGxis>xYKdplMRPmX8O9H+bAgTcw`AV!kYyArK%bW6e>Pu4j%$xDu_S& z!>K+lYBRc-JL^#c>j+Ij%}pFzco?apL`165p^EV4)fFR1A9|6i&iiq9Rw)Bm4-Hcv zKonXEXRinVbjqdU0bqRgUf~ZyDaG#f*t!PUn^f*^$l%ydM=ljwrrW3S@+S=DHj(j6 z_6N_Tt%Mk|#?GNR>Y4OJ+54Uo6BX$dee-`1SuIvx7!^V!Lk=^25TGvsH#p}0re~$$ zTkXrW=hEs=vpCA}{?DB`)7`A(#u!Cl?Wyb@j&62R{SORvb8IdoI~Y zL_Nr{!sp`c6K!|DDUFj3f?Iy_9vkM_*)NrzcK0S@;&Z9M9#~dmxmuA`D{cz6so0tZ z%d8$a9r%Hv)jAgd75tvRaw83(Q=DU)bLR~)kYisY>&eeE`vcsZC1LZ&`d|sihVSMR zLrcQiW&sU))d(_T(NjlrGe`XJFMj9r(YI7#rzejx6)N}f8h~w4@05=|`}T?J^ht*_ zk(f;@fA>QwfXlpj)O;w?vQcP2ykK|^#wx{jfIUucO6nK=vHa%cIhu@3sXWao*K0zA zVol7sQ>9b5idM0~fS0Ax<&kuD--65dll1Mrk)6gzE;5y+E>u|}ZGa_;Tc#A4>3`pF zNwP|RU-y_rGCu-{<(kE=)#LyTEz%0c$99ib}Yik~4t4 za)>Iw46qm;CJa&pd2WZset#Kk$T{1m3;V%X~BNDmNXDxxtvZJZ(C23BcIf^IHdG9VT+gyBLx@xKonrfMdURu$XM8L9swsDL$BBujjHQ_9{cXYQLsJ*Z{YKXO96J){&9C0~AH590$LjC7;^nG6a>&d$0%iHCe* zkSO=t^C5Y#EK;V(N7Z6)tMLz*)K^}m7>NPWhRg_Y)bxZVEnkrk&tu$gUP|e1KzUa-4-!sKqc49 zFn!(zzeL+Aifw{s#$R1gO2ASP&M=CE=gYcd8X~=hm2S)-rW`$1+$P8*9VdJbu~^%F zuo9H4J=4e>N%T8TWOt)pcO{4Mczz>9L+?0V?YfPvU=a&(*0AcHr7bdaF1Wkk9kNEc z5=4#?L?B(c*~%livP9?AV;9@W>akHAKUjER#?=T0{{r;+qBEr|HC(ztA@>ST9`@Mp zeo`M{#Dr=k?14vHA4bMx_=LyxvT$@Zwr;#}qv!KLm}&BfTE8Eo?MokXZa4AxVF($$ zBbUps=o@`cJvmY=S>=Wpm6ZDCAZK*Y+*>hcX0~k=R&tq#R9zwDb&@DR1r7wR@L&M* zhVpMwm;og^5Zql#Qh{xr4pJ<U&bZE=Ydl7;Xny15U8j`mfq&WBy%^Z^zI4xP}g^aG|jT!8H zr0)2j(_IovdX20#9Xj+6pc~6~^Vr%dTS6?$n9X(>1Q#q^O~j|Z0a-&j&&CGNa3RAM zl+EM5ggSXv57{52^+f0TdW{ooiuY5yCOroZkDa?)SCj`_zu4j&&`UBO7l%;UFJb~p z_{f-9uF3T`4`y+MPU6G-W-w`!NA-5Q=T_e`;npTiQVlQ&`6Z}xp>g`bB~H}D1{^`y zl|YF$USAqDrs%6y7qAU0xb)nfGiR#g^Q9GskFoy=a_g;(1y$YrJ+7S1i*8+}6f`34 zN{o0G8)k0WJh*f~ed1J`>Qnj8%QWA&q`E+I_)QOZMlr=O{lJ=6b$#wHb}q z!$TYM6aXi5&3{GMnGah@vqI$9I=Dq<;G}W3*tY=K%VW`I7;Y zP#NerbsE;CyEavvEjQyGKfk^3iH%XdN#znT@t5Yd#7&|vooxO>KjPQ2Y&hjS&hICr zZ+y0;&N8ARc)|4*@0GGUwU^0jo&fC5#!y|Wvi#I8T+O=>$H$`L+c!^tiR7}^tKHI0 z?zHT;)Hti=wgI$-cy}vB!MyrBWJDuox?B?K! zM1(M7WXL<GrR8viBu&+M-_nN=!_^X!_sI%W)@u0Zw5DqQZdzf+{mh>8!Y!t=1cQ257M8!L@ z=jr&KVLLx23Iw)e>{bc!t(uJ^u-c!uzz|D+Q6*HO5PR{R&>61E+*>Z_Qg0gxLGkjC z3Q2ZhNXnzEmowM!VS1btZQE(_P-wzz&G7!$fsk5O*vIdL zr4b~qi^XQ(bUMwZr8)*9(8EMH40Q(LmX*>dtp+v{mFXoROSs8Z=C)E|G@y#ZnsASU zoy9NI{Sb!W>v&;=2G2a7?0tJld`1J~zS(PXqPlJmPGKy>p8NiX2;ngteXcr70jO;4 z1d5FO#T&CCvC$=Io~o-3>yxj8h}icpIRqHjqlsR?dMTu&E|l++7MUgk+@k-{V!z?=Ko#dm%EBf9k5HFD+7-f5oboJ)$r3ts@v& z7w51jFbz#uLhKc#%Uw>`Cj>>BYd^Hxa|lD)r#}iGy)7KN2L_;T7~XGubzhAlaJj|% zBWzutOvuDZ#-|z$*Pkps*~jZZO?YmLtN(0E_kX4+F`Q3;MY{J(tI5)}khT)9Y_87c zS7ap%T2Vl??Ul^CgHteKl@N0%g; zYiJ?%)J{P*->(n>DNC1r;goFoeBuf=`fEVOQX1v6S3hl+->{mupmx%@a`YiwvB7BV zXuKP1-L&{jXE&$v@KEi}T7pvR8G;7^TI86#+BtoCn8~!b{Xm-|HpM~w{}<9pn`XpQ zIrNwNqZQ}b&90LhcZ+8WCsoK%P%nGo<>N^1JDtz>5hH(&-3|T|cL5zjS+;Yo=0xs% zc-KlwZYL15<|nhAYg;0|3~CD|Ifp%nCWlZF3 z(}J!8K{2!4gHyX%;z=Y18u-O#s6{*1&n2(y45#qSc=t?5ioyGE&rtEM$ycqq7*@n{ zwoZr{fPw-AMBt_~8NR6*S0C?)Tp1UZjR)B@uT#gRB}%g?9Rlh1EnV7vK@`K%M&gjMiNnBl6+64ynOiw6GS0q7;-EG za|}07lM(^wK=~LVuW?q{pS*XIEUFkk-sbGHnt*wq?D}R+ByI)!C0UOfkA=V;)$?-M zQC4K5)*c*Ej!eDXnDrsKAF31}!=5MOiv4a-VMNlzTm{Q@CYT9 zL=4Uv?j#A7BW?Z|9w%eo)l5b}4-|hlr2GjLN6VK|9`hB$% zJ6m)4SV&TjkU$#;Tel*E6l^_|C$mVQvJ^xa2x!ZcQ5KoewOS}lHbNH+#R)m%C~rf& zvaLgO(7fE2#II9PZv&?;G1*CK)b@LNP{IxR;tw-}1){|szSdfBx-6xK!GKznvwk&# z`R8738RvJ@v*91_xigvpwy-x?0ZTjVKqB@{s@Y3kI5YY{>HM0nd1uVeIU1MKt3vWF zV}Snr3q2(a_c99rA#nO}*I{5^3k23sx^gdNOo$GI64mDcw~zD78iU0tfyh1G_Z1n= zaZIAt?h)py>*T1t9RoyQm043Peslqru2sI`XZ<5;UUoJ5b!Gb2X1?{d!5`bUHw9b| zxN=aErEE1Y4g>WEUSv#DS97Jy!(J=>BDkwO6`GSHF}of!ma81Bvhd~3J2jnr4jhb$ zSIgG>YrK=|OEDmE*2PxRV2*J;w0gOBViI9s{L&>a`zrgv6W_N?9V!8fwu)d%>Z5w! zhSM!mfP=-%v)Z#}3MX%Wz(|!PKv4R~>=q<;ElE0;&x3*jf!piEz^0v$z5xziz947s z);#xF1wdd3+(*>Ar|?Jg9K-n94D2A`<#CCoV9-ZqKAal(Oj?l*obZPMEYcX&_nH^OgY}b%G0x6v zFNLAyQ*jCD8zN}+k`m&|jCdED7x9MhZe)PQB2KJ7_ z`qS85bpDt!E8oc=FhHes4g%SpBQR|VLpEm3xrdlC=S%{XEj)a9`|*UgnNjBTHB;o- zSxnLmLnvjLFRKoKkI{jRlMfr6uU4+oVa5Ugz`rQbxml;%H-*S#frN#GZ2@dA>JD0c z8HMDePv8Bf0=GxLZug+W>k(i?^VjdxS9|sW3ekC4d_%qAi5gohdO!gHlzYpR3<+qN zvcLPPlkrqUq^=ehZ%g*KBP2|Qp{M<3nJwTc_|W5t`v%|d-4@kVH}2e=R&cV5%-mfo z>jI@1Uq{*`j<1Aeu1;y!mlH$0{kcBtNqTtFjowlw+@L@Vfn;_7p--&QV0%vjQ&gIn z{h0RBwYLf#9>BBI{uLojI!hSkM-a+XpYqsfsz@)pCP`k+_D-`%(;ob&fcGc1Cfe3f z7GtQ`BG}oFY`xJzlG-WindI*|T_3nm1Ez`JNmaJ%R#uO`Yy!}h^Dd+2;3BhTE~M9! zE`AU3sE+||2@f;_9q+n**cJdG5w53i-BIVW~vgaqjvGn1S@j1_;wVG=Cpj;;?4HB|Tdud+zz60TT^JNqu3Y4p z2xNg|FrXQ}k52n*EC8JP=PM{f9XIfH*mweSR(tUFs;o1uiIczQM)Qi9FCS|MJitJw z+QZU00{rfH%hZFVY?;Cd$9`qhzTyi{{B1vnR9z?>GB3a?_|qV*O5=n2fc>7n@#mCZ zHuj3<`61cK7=>tIMFaN*myJg2L}k$r6^%bLvlzh?43U0L!tsuO)Kks~TTZ>9Y1=mI zM_1Zrx(JJ*`OY{?^T|ukxK$Fzg{Ijlz_=TXY55hbF5JTE&YCZM01Y*jS$10wySC3Z z#AT?*YrRMe7tHkQgKBL3K#$e#dm_=4#y)O(<$xM;!WYdrK6}9slIAsxP915T_1&0h1T*y3E0}x~20M zaUScP4q!^mZ8#1(CZ@JU(GQM~#R=taeYior7W?s1vJ_X`xMr)sY>K{TLx0n($0vm@gtFmQsI zO0y)C!x`amJ$Bzl+t;!3cf?L;O&+wIwoyXG{^o-{v*?5G?gs|4Ca-I?e3xCnAfV9w zWqtHxlEPs8$4^Zh6mVksUzDvlt*t+(TFyR?<2;)UF z?ymP>k~Ib(Szaq3Ni(PZWaehz#7^RDSOTOg2KxIme%4YNI@`UOM?sbHA-Jt}CT z$OStabEG8Hpko)EA1Na{3yMaXt}Z$SG?XO_{S*}t+vQWHwLwkyIwNN;=48tSKJRLG z+}XtKS$)9h6p95qPpIT+;?aR&LE%BdwcqCvw4x>$)DdIuZ7@D~gS19yde7lb4i+;Y z9QZp;;eo`qcEiC-2oFTe8T*3#&!(~Tpe>exkf^9Djt{=iv0PJ}FR}5^n5e^mz@F5P zkGd$UBxWe}$EPV~_yXUmO^*w(3Ab0l1gt+x8=6wN2*ZcIy>2`v!;Dz#N0r0R-);k3 z+A9z8znz|eP9E%&cj5C3eBB^O+olw$DC|my)NicpFU`+WEW6KuxUG(Tzkg-p!o?uNrtJVme_Q)V<5?}d*1J* zimW;HHQD>?4!7iDfy2&?M{Mmg-B6mC1U9g4C%jub<%LI`;F z)n7sX(F*)s{kU@7V(h_hMReViOp?2T;K}P^`dA;h3@>{RA;rIo&4+auPGv2tQp>bC z?7>K$&hKMUXy2TFMxM3|nO`2NX!V}8^v5{ZzQQ9k-T2>+?-PMRJS!G!QxQOL%k}l6 zr)=>Rc&<^?dYT@i@!1zUUyqKjpvP$2sh3%*gU7KstVS>0ZGJ#1-jx2ZcYMr06dELdeg!=}nL3VG7InAR(;XUHDz)-2IBt=v z?KN0VmHYA*h9Yg1TH1M(ig>aX?GPGEIUdAaoa)-UajLw{XI2bgvkrcmMH<+3yxX)Lxa;SS zb6!fL=YpN|*N$3~D%4gErH*rK`{jpB`T!qo_*fw=B+#I za_l!X(dmX?7bUg|C3q)}M&7GWuB2MxS>Wklyjo8`PT@endvQ?GvEm`+OYNF_G2lut zoJc>~Y`oe)BNl-{A$^_$fI>QJy14%sw`ij5`tTupSOVLmPolNdBV z3FX4&Z}3u|fDz0oYX1K3yXVnpZIq>{x!nD@(p0Q7s=XLfLY6elAw@OT(4eD8QEisb zlY0&^Br=WP!Nu0XC?FB&Vth7+mVa9!cvYsfr5Q1WiVg-cWI&Ya%h4HaQrWDyRyY*A z7MV48BevN|GmHC`7Azt{LrJej22jD~&WI8mAc4Y(3T!Zj@KXrDP}ZR?!4Ee=2~&&*4&TJmG+9ox=WpLW z0xnCi6J9hB9^1@3uq?y&~PG> zy21r9GTC?gIl^+Xi6EAt_~?2v2uhiT$2E;+XVJq@={ zR{NUUv1^e6_II$mJ{cy-#3kzQfe2WD+oG)|&r2FBjd{f8i+THRmSI|RNJB(9LPLEL zG=I8s|A4u&kx?V2^joV?BPKd|5_HEChup^VWoLX2GdHV(SEX zMpON1s+8^_o81k)b8m`M>NhB|y_pQvm16d2bCd3s3tMsBW6A_sja@YG6O#~T%F$>e z>GK2ja?%30njeE;#iyqeLykqrWzav!N3y46dH8oce#y{mS}oU;5zdZR{KZP6M+E$h z29sy>s| z`Y^j7L~dWbdz`A-2*m&N+|r9X7$L4noN&I(7WxR8K?C2949xoYZ~kZmcEmI!!04v~ zKkEGAfZ0+qSjL1Pj@5bgFBX7_fti7o0iC6v36>j-m60?l-T^R-UZ<()dh9}Kp&RQ2 zU#l3TfI_9Ep;52arif{WAHCma>x_maU8F?=nQ#>;F_NyCMsyI4F$t9oe#EYqx4~b$Q*34PX81GH0rVj=eeO@wzT&l%nxM*__1S&#xmtrHz zN?`~L7S}bBWi?+ZD+orkJauuaFr~dD!7cw3n{}2>G-YB-XeT;S4Isl;Dq6v{T1SK+ zLBr$5zFmV(xPXXIT6Wr9(1HX6={%Fw(&9Keo?K0?)U&%tcr-68eu5An7^8}Y!GLoF ztwF~huY$(n+l)U??vlBwNJWPxq*!knhAXiIw^NS-*H)y{H6NX)oL2Vtof_=L52jX% zt?{k|-jGueNg$7*W3*9mNQ<$ILENY~uZRFRwVDUgnUnW7xV^PM1s@{zVPSGXb#&OZ zv_JLsCmahnaIAe=-%WKKh7L*)50^OGY|NO6^V&xKs=WT>Edq`RIq=5kjO3bt$UyO zgoWcQ76q!s_*pl+MJ0Yl?@LOH@?WiJ)W6!ze~20=zIx*!;*XDEBlZa1Y|tGpD*iyu zJ|QoORokF3&Y2PL2bR7C5y+J`lb*nd>ln*6 z)ia$wA%r9K%AYo?MU(hkC0K$KVvbT+364QnnA5{|oEhb$XZ+cSf-cN(u;s0+791fC z8)FQ{W=0WeaYxg!EF!ct0{;cIuqd#@qgXEULlhDhI>}T%6Xnlzc~xM|QNIH?N5x${ z^S2K*RMh+d&9Qz*XtjuqA#Qm3Zv|jQ(<)kGIi(x8`?vtN1_mFph#jRkRtocXFPSgu zC>i822HjLbAPX-n{%nJhyPk3*njiZHYE5hyetuzJU_aWW)94bLJ~R!=;yXFw!oXms zFrh*!tcO-^aygG)zrqCpSt0 zMs@F<*~p+rTu_?IFv7xG$S(tN0i5CPVQAPxU(B1Lg(ngCL=QcJSE4UyS+8niaY}p0 zU&#~6%#M_s?`RszXP)7ka>M{fI^z^t&^Q8GktnCLEf!&p$%}OA@Sz`gNA{W@wY(cE z>wD35h>+oJ7yPr5!_zAY_yi5)DfVz)5Uk+yReghv^J=TSW}Ws5y7QsM!V{c%m`=sV03TVU1&F5BiXB6hLl(+g`c+RIe-kV}5-Y@WO~QEzlQmvk!b{ zU#R5nby0^fJ}Sd=9gBs?K<;*M`@f6Bfr8UEgmHT@1KbfoE8t}twVEClKI;=Eo|Ak{ zp6OFLzOe8NiN^;Itj7o4S`!WcL~{ht=?SIWhz<)w6og%ge>DrwqBV_UtjS6|fUVR& znbXyP;g>yWoo|Wr>+Q+T35M%RdFm$QpK}Wa87uznU>Vs(5t;(p{Gjz9i*YNWZ@U2x zhImwCQ4yW*pE?t+5Q~fi2F7^BCIST+wI@cnmHJ;pd6+A403dh{oXobO!N>&Ccxur;>N*c zCAN63>{xv-crP2GJ+ES?u(orlf9Tzu4l6q7S|@tw`H1E8!w-NGYvJEta&@)!)iZMm zY2o8=?0k9%Ye46nvhyX&lof7P<5Sh*)R>!weC(d#M1e7sKFR5-uxh8xG7(13Bj9=P zwDbP~>^_3nP zfeT)(P5azG%+(<43#4>=nwiyPbKSon=We1?zGkbnY}UK_8vW{0T)&uP(PuU+Zi3$plP=W90K>wC*D-FnZt<Bc+j{O z_OkH9h`#`T6^dNgusuZYe%R&!J+!t5cN^V3^A3j5t-^VWq1uFt5u4XB-6Es`-wxAQ0)~C}xR_2nXP9{_~x` zAv)egm+Ia3_uzX(u{tIHx3=q0L^4!PNZ>aURh%g2oim#I?9{!e>@wol-ytcg32UMk zuZEI?RUJ*zBSwRmY(EGPk!f2IZZQC$I;ZVH8I+zXA%YVu3l0bptFs9!q$MWhqOohs6w=JllH!PJUx z>KI7^fF(%+lWceRwIPx96PfEh@t?k|9`4apK>#Sgg-d}I^jC6*xZZPa!=3Mrxj*Z# zFBWOc)tw$y>?gx!6N%wHr?~a_j15rClpwC0pmDIShg_@NV2?6`>>-%GQFxM$)Oxd_ zqZto5^Fc_>{FeGNd96TWuVl-^iG&N#lHv2kH_UZApz@~p21^)q2LpPf`8>U^VHO*o zs?i>Kb%P8Ya-QN*^GvIDlkzF(oPNBQK);4lF$p{&#MCmAH;W}wV3KgTe4~H|2U?!7 z*M4%Yb@9&3BIFKkh5j0qLlXt^uh#-o&h(TGeoWuy=qa%qr4wbEh$SQ(D;dZGH(m3?tcgJl|Al76gJc=0br%V{&S(|>=65AWOXSvyr`pqG7bz% z;bODi#K2k;5L^3lxl(U3e3=vk4m4tKzyE1#tD2d;xVqrms5wk|`WD<0J9r?vhR0g? zNi^}G{5kGiVHTZ==P*cQk%?s*zR!@`bQaj=OQsF;{KhDx&#>AP4iDP}*KPu8jh87t ztcygu`%O)dDSqi5?x|mPF41EU$pOHt)I~vpxCG7ped%D8e?n}QX!;_H`vz-?;qZfN zqw2WFgkR(zlBhd4t-)_k9LUGyU#5wVA$);$fC#jY+=Me9H)=r4OdC7WeY*KT0p|gL z8&zC5(F&MUX%d~l9R}Dl5LQu{tTTa-q2)B#jFDj(*LoN*FsJtgk>{266m~v7XS#au z4UKswu%41<5faMo@ILzG5I@r}*?WIt`X|{x=t1m>8!RE$9w@*Tgc|D#V6QR{Q4{~e zm80|83D@FGSD&+NnShLSgGlm*@A+>aHvbp5*f%EEg=jla5M&xvAZuDnI~b?bV<&A!M*+BkzJn5k*x)L_Po_bnDFh@d5|qQ1A8m z?Jb4qu?qw!x*d;**EbCfBi|E7Vs3c1n@$TqCT8>D-+dgO=l07QSG^#ZEh6cE>h$NF zsyZ@HH=g^p(-N$H+9=p#3?)@X;Z~i5K|Zm6aoh*bc6+`!5{x-SoZwbpPJUeim>%{;YwL{I57JNK@!Vu zYvH?nZ{caI{kYS({K?^?gOFNPiV^9XOwYEx7E{Q_L4p*8cdOL*w?}H z)``&@#WDMr-}}ys2g2BMJ$m_JVczOp-e;%nzaU}~{c5kRW*fHUmiyehPN?dpgrTrwMjlS z_(c~-p{@TOmuExF2IP2nd=%!38KFKYbs^nuq`?GQr(oXBC|wWMP|!PmY7>_NNvIzJ7P_1!FkAP?k=}^C zvNwUi1r0X-9Fl}jqm|nlWPnEXi4GmE#y>H3g(V^ooc|mzZ;@LR%k)h2$A$g)9^EM( zkFo^vf_e7l8zkiFVPj&H_LeHPBl8$7I3cVn$LAx-a<&+5;j`BaArvq|10j!bLaJBx zThNWWjtm3|rJ!_TMfb_CzW~#VUT8vv7&k&xDhUY~{>K0L1yf;2HW4MX7w`wiK#bLe z%thvauF9-_X`IcnB@zXA%Dn$!hj-fbhh1ID&IU}~ja~E`tgyH;&+G~{tJ1c8^d$}o z%3DNe3{%r~kdz+pUIw{Y~nW+!+n9gf$xC_%m^lhC0(-@G^x&79kyL;~!AI zZ=6d8BMG@6Y03hX+{NxFO}S6p^SyHAPi>9T{=$zm0$oZ;>O<;-(mm%T-K)c4PmXR5 zQI{@u{F~HGl=Zi^Rg6)~i_bq9z3KCvr?g@pr*z2pU&5uv#~p7wCHpPpT~0v4W%BpR zE+haz`<2cRO!}j?cxjL`)X!xV_EFgYTJe7^g&g!%82Xgw{p~RCe>aW zbVNhhL|qO@Qn^JF2S+Z-sK|RG5;e@9BU1>dg5+>x98#GX6;k6+N>5CZ2z5{5=g-^& z-zKC7S9Um4>(;D$Ym~2eQ4ocetklnCWPA=C8&|TS^T`%?{UHlqF>dL_;xr)13<1Hw z!hQgl^)1AUw=r~G4j1Hs1qZRrE$=bp-M}XtZhCwiOu~vN-~z_iSB_5a7}CsHLXv_{ zgbsE1?@qHS&|SaiI2F!);1W{?5?N*TS!?i2Y~(;7|1B|o3-O~yZH>bn$wO~S63Og> zT-U=I!ImuHfYBr{fIrofR5ZZ%kY0FDC|}N(^{_|<+7+gz6GB$(pfiiHA*%oAsLn*^ zIL9Q4aFe$e|NCK=UXq#PfG`Rl!6`x+8mjnLwFOy6YCQh+F&Qj(Y&vAy?UGpRyz;zs zcOUN$W;eZ^4Q;I}c;ZdM7`*08q}JS~GINIIW>5=V+?oM`m@%Y8U?*qm_&5OrLF_Oj zVEG;a2{y1$K=OBebwqh2_=dE!@CTUp)5RRw`U6+i9|`;DD3ZWE88*2&K(M|M=CLWZ zYxsvmc2CCJvTS2bj>m17z_DhljgYO2+F;^YrPZzP#|3t*!uOotRSDz^Y6UB-6Y8jD zS>(oT6}K6(Jkz+~9ISp)1y)MN9H1Qk@N~M>q!;yp(2)H<`KJ{CsUkr`AK<_6y9N#f zZYPt)j6YNdAITRH-gEjeeKczCl~u0RRpTcX^biBQZpbg2CW=f`B85dHZYI-Y7}nq1QSU3C10X< zia*Bj*>`O-XXw2|sVcFO!bl1#rxD>`;pi(!r@q+6;DEo^EK$GHltr-FDz&lscqjuS zSU`f%I5@ymw@QKv1qgB;?xR{Jhnv;peGOSpI$NN_Z{W*ER-_X?nprFzRUcDty(7!H z5SibSPS}E^uRBs(U(LY5_>C&6$b-Jht^;_LO6UR3-`4r`3HV&uru*7{>= zPpiDAvR%4%haO^$fFMYJ8xvT=aVh*hi?(mv$73ld`Sv;rPDO%#`kT*V2k@i~Rp4+s zY$MHPykLQ*z;WmG&mY|IHXH=8+{x!Q{{FcO{YlBouwO!9JIzv_-<)eJ8)yWm1@BxQ zBSOSd*u|8sd7mn1o#J0SUrH_iL0r0;mde+h)3NfJDT&Ciz}aXd$=;LB%7H6>==!)xBN=3mJxwH{O?C-=TqgdV6_!HfhLCAD)90I?eb-FAG6{ z$I(g4&@dgCnB@f#vufX?rRKEYp~;hzUEM(4qnZP+U<3KcRO+6m^-5#`h5q zLaA{KFO`@6QsYrhP?OJ!1uy|hpGtIEQ3r8BZm^9ql6T4mj4SO0#c0Kw3v1yn$hX2l zY)FG1Bb}sU>v{Dh(g*Q_AXh~KA7r>54uUy^pm*T>eB0KyWd{6r0|c{a5Y)F`;~V)4 zUC%e2^RpV#e0LElqm!yPNfx!#&cJ6;VfEm?t(x4S6KiQe3zkZX%a$bD-;jgA!*B7~ z6rgbXfC)ZOI$$wc55_Wu*w5rbO$spCWwn+QDrML_2V&~%J}y){zO0%Wa$YX-$r>OHy>qeV~DJlFV4VM+b# z<=;6eFzzrCTtnqQ@Is*=PGu35=w-5JYL@FC+N> z$qXB$oiRvlr2?ILD>V^7ZiaX`F|W(@4}axKuD`Gtql%m9k($BbdN+iCCq|874B&Q1 z>^Qy&*aQPWao$T`o$*4@8zKXSEe*3A_6hmAwFdT2EFe8b@me;}xaN6_E)xO^e5UW4 z-4cr?P8QGz?VGPwS$p@heEkdzm#00~*AR8I)Rn3?3(9j~!uD8`csts=>0zf1x-x}} ze;hw8?cj`kc(!&sxI2GM-SI3v4{mm0Cz3OC`G^dIcl0Ff9nJhByB|5#tJnSI4hmE` zmx82y)m*c=jt&Wk@9s0UYs-IEPGB7-d2w^T`T)sij9WL^zaLnKwW(P+lvi3GZOKcw zl_(otAxw98=8N1XYaE_zhUxnq9<@W4-ntgebaA#oW$U+pb9X%ZwBh4e{q}u|3pn=N z-onoHy%&_|Q_)YbF70mAz!o2CK^gvzI{Vn$sLczJS|i zQfu##&KC}Y1*>*dM@CHC@u-GL%85-w0PaH+)tOtpW8#t z)G*H3%qA~5Vsw6+*jbOfX$mvw+X~ZdCOuVaqrI%Vfv@h*uGL-nxM(=Q~ zlUd|+D$VXT!2{ZiT!h;o1ah85%4giV;_CVkyHd*X9$3e=3Os;N-1G*YP z(=cTBY|;PS3vj%)F~8+lzx`B_=v6+Vsju#OmPSm2;CzQ{;_H$Fvv^pVIvUFb0RRl^ z$x`N$#nW#;XhLkw3<&3#lBHj+9;6}?bOut3?D%GaQ*IMHplVbOVf{VR$GqO zgPmsF*9G510ZlUHcak{wnnHtu85A=wPA)KO(7;*C@XSeV)yVp}z{eA0vEvI)~zB@N{v}e7vx0EIY6)D6YpYb8s5K z@n$fy~dnWb5C88#|2GZ7B4 zu;gsEc#{#j^`oPQr0cDSfUt%dYkOpLs8uKdG$k!OdPN07@`bdc4dwbd3lLvJ={$bw zI`~)V{astro51~9M?tQ`eK4zGIx0e2OWjnwt<(x~ghDI9XyP2Tb-+b#5fWq~)nW%Z z$F7C~uxO=XO39^91q&+-xH!dlRH=%xIP1ZJnnD9yf1Dj159vY0Tn#A~E(AXm*%OyoYUV1V^+a@TD%pCA^AmK<-sjHfTNbLl!$ zzJmW%S0`yQHu~Fg>oaHDt{HBvioRC_slDd}28ECHddwg=*_F(A8!uxj{=hk%- z)htv=qN%B?@BL;zA*+s}Oa)|tO#FXFuVTul`!a#cH4u_aeq?u8;EjgsCQ_vGA>sie zl4F8HW?Iq+?`gievlAv9-v;UaxmHK&QuHS^J4 zS-OxVTo7#o9h@4m3oaRbLi(H}-{rP!su@ORCdwiA<5*L#etPkUtYxNEZXKu9i8uo- z8lHBaZi#uKoD`?&L`R-@TuX!S>}wEVXJX3)>(y3eW2k}OOH30h@K4<|MP$t`H(`F2 zJSd4eqS+kg)?*Aa@HtR)94LnB4i|qH7^7!U$RT@O#M zx9sKL=6>7S`l-zM*;PwN;|7M)3n8%DefIZ{p&%xQ#m<~Z3m!*_+%eGJPiBG5dBDh51 z$&<`B?~-l2kQP!N$5qR*DZ@rXL6r1&xYres|$NvaKYBQ%aoRlV>hHnyKM~I zUq(&}+TTnzVX|afclUd*{H_5o7O`vH##5)f+`X}SlIXAILuMHzLlnB22xHiA7b5}0 zA4cv>(m=Z36}`f@KlE8wMqw{mO$a2)I(rOP{?0et$m_f}K7#+Ph{HPoSAz zI6h`e34I`e34u?Q&yK2O2q66Mefu@5=$~-7{FRV5ZotOnessG$BxF#`Oq?es6#4S~ zz)4SA>LSR%{;P}pXHPLsj9k0dIZ+sqoz2FZT`7=ntOumYA)BLx3dyEY45~Epq^)_y+Hfzf#ELD`bw1|4B}6dQGS zHnjkMW*ofe*ryw2ARJPBgG%#5kMnahj`*XtS^&eANFnXqjA_vgjC>2_n;zSetlj3 z(P%3%@&ykD1|_IKFqG9ZvA84ItiTEyPHs^$wYVp>djluN!2(M{g6*glD{bn&Rcj_2 zB8rvD;Nv=B#?fo@D(z^}0iJ$rzvu9?lNsyCHO=%^oZoLvk!AVF{2lBlTW#6Aapljt z-|NEz1EJ#e3ohJdXItsq;ETcP$Ncu)S;=kgQ)S2jr^a&&!TI9E-L%b{mWgFV=cNp$ z$KWbrsEo$MDCx1c!|gny#0|0LXNFhjsJ`-{9Blrwd|Guc?WZa zOtts7^4jo7F_{-(96>|Cg&(>5V`x^3!$M`YWBYl?`18+o*{Ac>s*lBb6ZbF2r8gLj ziMYIvK`*@mxW~qZ)<KD5{3LcbTLJ= zh5bpH1y_?QL1I&EUvNP$cwS+b*X9{^MyuT8-#8<50U+}HO`vS`J+-UJGzSq<;qJBprxQ3!?Mid)mg1&XndYq=fZ`|#H4H*JZJf5iisN=?>01oy1 zE-ZY@+-L8_?1^o&)Fz{~ZsFfq>b(8TNSa-c!bpKFYT}V`M^;05Eu!Zf?SGJ{YHm0- zM7KT1PGrT~^?jV&wOY17pR#o-Ug*ULukfOTQ0EazNo!Fqul=x>af1HPM0j{Yv*r)x zecb!}KXtdrOW-~u^X-Sl-bcZ?_2J}nUYF(GjfUs+=^2)V(E7=wz}Ckua#kCpV4JO5 zhlOkCD=OHerXVX4eIAKVV>anY3A>~EWYaSwh~4ugM#Tc@ZUO7J1wCKP;B(Mrp-z{t zi^$TS_Rp6~nCfz{_=2HCN;_1(nN10hN6yr$zN{pB3@)RJ<{2&)R$BVMpVmX}eljmL zX77sd<33<$(Hh$mARh`qW1a*e?<6D^rT$5SMKGSm;985Dw9EPwv#SNRM^xB^x0f}X z0;$`-JKly4SQ+2B0`$8f0<;ab-g_AcW%QP_m)~WTlMTtgf@;?ca@K#hAOo1SaZp}p z?-u>WDJ|XwX~e|-+#ivA7<#=QvbSV&BJVWJY26FZ7Q0go1f23o3a{C^!-hS&T}>%o zov_8HD%ttw4hbVSdY`|n)%T&dUXQA;*yC~&dKz*b+}SF?fLk_4C)?bISV!qMl(0>=;`Rpb22>4Ow>o)+Hd0c*PEXQFV_^XX+mW}@mq_oyrw0KZIA0;v0(jLOMe*id#;B_ z!1F&+x8KIQM5^1`r;Zi_C49T?2PZ{Tj^*zE6r}mCW2$x_sJHWO+sVa~U6Vmh!v*T9=nTr2HBRqSJa0N#z%BJUt2g`9vU$riBY)-k zJg)0-5a->S`8pfS*RgQ&pomZRy&%O+){|LUOkeu$Jx$5wfI)oaS^0haG{u>zfUHSB z*tg39hI>T32zpW>GBz^0M%^iTdHq%Q#P#>4B{$Q(E%^Y~)abwAfP1Z^K9Q6X;~@3& zHEp%;-`IseDyk|r{l4p=5EwohS(5edyQ8CH;14yD?Ff&KyDsS4H#lkndsGgTRU$7a zM<*j;l1fn0U>DlUi^t4px8G5Fd70A5uqfe>AQ>yOMjgUu zn+lI1)M#3ZL{nz3Xe)I{(a_RMxo$EKHJs8du~a)^N~U4QJqhRJHc5ZtxFl3fwSE-= zkMrqnbu)phzOh!?Z@*5b!p0n_WQ?%pTIv7*P;Y#SQqZye-fSodJAlGPHic_qPAp}v zAcY7UfP*5kJHjQ*@*9tISk*$tzXt~`!3fsqgI;nO5=hTuG=rmO;4v|uIQ(f_g(oNP zJ()nDD6J63$1>_}S7lCxSHGr<`Zts6%EPppu*jCt`{2EF+|kPR8a1F5|68l+U?I3) zK;MhP$K9FNTGh;g1_+iMKn(_g07w$c;&J@TlLhYukRdO~gEhOTbY|5DC7)opKm+FtP(9^$> zm$jlLs`eBijF#6X#v+AB7odK7I>dPz8kapk{_GFE<8wX?!ulW8eja6M9FYKu_Ve?84Yiw9 zBhe>1-sCf{&2NKIwV}6HZ&NNv*dPzHi(h_s``HDy60t{W^tDQ%S@K;E??Kf&cRKDL z)yuv&*TTN1$G4x(Klz7lYYpmm3U2tw+}%z5c0`;IbiTX|bH+hcd3aOSWam!qMjF5P zh?KLN3kfTZB_jccY#ILl+QrG~mzZw!9CvX4L~5J3PTn3BZMAm(^1*RDdTpF{oH`q? z>?5S&9qs(li?nP`;=eKTkZVH~ztL#9Oa}>?cchSc{ zXGxI)iTyDY#%)5Y~Fc*g+`$ zp(QLFmRuP=9VnY?G?^lTBz4-{ADf+U)bhzC56mfh;hl!n-=TGj^`)B1_I@6IHF&oT zgOBH=$^xU+Q%Z~}yd9hrc*%;H?nKSil-%1dDC@4j_?36*d!2Q4c^cYbZB?l|^LV;M z{QjQ$`7%tlNuIW?dtd<=A3xPTbX|K}U!`w9-<{}a%0@X9UZ-tuzmBy$un*4usw!qP zBNy>o3@x*Ags^4&9M4q|0sNsV$9%Fq4SXJl{T>hJKj%3|FQxyn%_y)vI_@Gd!O-aX z{aETDO7WxgT-uEWvLm$xsRe-*TuJ9&;=#&_N~~6A*g*+(K%^B7Ng7xF`KU&Gp#@$T zBGW&0v+cHleCEs*Lx$g8NF-q1qKl)DmuCYm<{B+vPoFy%j}Jq=`py`!%+m; zRyL_-E+?c2Uq|3?qp~Gu3j!1!sp48@2ET5(lIKH&;J3q6o%~^w%w{#EI|-iz{2QBS z$^07kTZkd5R{PIEaCie8{MCIdKc z>P2iL?+E!S=(O3d4$pM*e5}JKwoga?tl>e)$Dv4Vuc!*Z3d4%Zx)wpgKGj!9N@ZS< zeSWK9!rPSML_-Rm3koE6n_|t~$VoeV3o(qvNLrpxR&<=RwK_n+Gc?5#n)dc%C@NT* zLVx9vC&0l$JFawl-%Ej@9-_zTRxk#3lO(o*Rz4+)_ujq%PA_%>{i5LU>! zl6L}ZImvJL8IvAo>g*>4U}C60CG5^Bl0S!VE#5rLhsB0!K8Ft8+W{yATR#PLPINgT zCNhu4-_vDprie|YZb?y@hq#Wiorcm+;zY<|Imic6Sh(wd^QCXm;*iC z=fn2@r%zyxa+5CB8_^c8ID*agi&UwL_}c3_653PrK2fxY6V<<8k&iH?9h)I$)LoZ3 zZ(Mu~&jc>*BBx3*XsUe9@u3o`bn`?LATBKC5g9Q~+^_CGJmOMyy9@sAvu^UYuR+`C zDY{>|C@dgyAHHBzc1}W)f)C-KfbC+kz|{ZVsD~aTTY;ys;tF|POE;=KDB?I>^|pRsAxa))~9#hKhiPS;1dNLzmJaT z9M-gzuZ#nPTQB!c8k^dBxlu=%U4xjRrsMRtFVYPJusyb|CHe;CXx$UzVYoL*Von6J%t-yntbVgS$g!F6(|xSl#UensRRbh^1Q6`6Lk?we5=L}br_8yAt7*sukyo{N6$w*8AOO2?}sz^ zS6WBea=j_X(k2dKh8Ye2k)|mat;7(Na&!kUR73|jQWTxibK0DUQk(JT@&9<1H&aV^ zBr_GWj^+e7F{27c+69XxoGsRrlTghHSNUleG6_rIetCNr6D`XRZ;S5lf}*45NfSH2 zb0v?lUp1y1X=|@N&=5Th=ceY0^>0INCRBB-19qdn)j9Uq-`tz4ad$o^#Av1T;C&=7R4; z`G^#bMH>@8l4TRSvfFo6Dlff%(wT&(IQ7izUc2jNB?KYf%;~6aJ)eZOZjE;n=AsMh zj*)#>E)6&hnkNYuUmbQZ-7~{Mhzs+?1Egrs6e51iw{6dPxam&h48hNzcPnJ(;Z!0x zhe8l!0esB3Ite%|)_SjdJ;%|wlRcSICDF!g6|k}T#7>tiEU7gx!`ZMIp7A8|9p7Y7 zQ1=jn!Frymerf36?(@f0{W58~2&wJZc4l^qM49B`Lz&i_|8W)?$&zOi9Of0*a^-!k zs8Y*4?ppP9>t$DoWcwTybLFOAoX2F)@HB4lvw;kNbFut=^|XrY>rq_(nAldXAL%&) z>%{5pI2tJi^#LAopZ9jM{Mb~Y-=wPQJ70!}wa5kHT6x;NJTvO`jO{NnDW|eQp#gsun_D`%Q~QY&3_#N=gcE6uU6v{55~S zK2EexGIkwDMn|Tg37FfPq)ms%^Xf$rW*X{2iFQH*cXz~?{wJ(QX9RSH6nuXfNC0Dz zQsVkvVTA&e<_cbx*R=c}-ltM74Y?mF$Fdh&I`lPMHOynEGnnmVPEGwO{;o6NZB;%^Ku{=6$)f#Q_pT zz4@|hoQRh9(@};9G8$KW6x=ors~~a8aTW`J{LU0J!tk$6+U3`WDJ?a>ZUfK5ED28} zx%o1DYtUZe!0#>2a!${S76JG8cf2;z%TK`uWlhp4sZot zo(ba|5k;%&Y-A}rs<)xnj8N$|X-e~uY2-tIWcp;56vv=08tNL3%EQV_0wyk!+9Fg& zsIwZo+=gs3bv_kakodAXVB>06ilZ^_0tGIA4*y@2h%h}e6K_>8IF%%lWkzGd?;#ka zh_jI26vg!mHXn8{n%oTqWjH|&Nm>TRaix>N>di;M#>+I2&i}r&tWxL51L>(i?PR|x zGeSSO;mAaepYfl&3j%eSg9`6von`g^w{p%uR{$aT5V@|g;TR=g?fzqWy&!oNPUv_l z%ijHT_HBz3xj99ZbD?ctbGo$K=TT76aY=RK@65&;3ruLxr2VDWUQ8DbSY7tn$H(EK z2Q09#es`C5ZmmFLqw~yPdG)*VtJiP)*DSK(Z-r%BdE@zKX;#@a5IVPc?&%Q)`3jz{h64$L?u7+S->F?D4{^tvvVoMP0 z{PHUbN1$g{49_xJ{8mLfGI(q~ow{Eo>yjMG zQ%G`hC@fN`W)Z4-DCGBLrIe6{HznkAsXGZ$X#XuKI5gAgeSLwfo`Ow-5(OjgX7|36 zTM7d5j~=qRo;3BZvclG+EAXru_g8vSKih5X-Gq;7T9Fy_+^Pkp!TJe1|EI_Tah)(A z^{>VV)U1$8W7*PurRIQhW@o-|KPL-_q43HMW+E5OkrajmZiD1aEjB=;AX(S?e0U?1 z36QYh?aN3DWU-D29s(d~V8YRE=2R2SRp^~GTt<$x!DYu4J;G&@z4M!u6cu$YdJ7w| zA2dWUWhpyB_+Nc67=$Lg3>CxMhc;|&2F$TGV{o|I3(? zv!UYj-9BShVS!|>_KW>ox3(Y?87fY;4X@8^zAU2H6%9Vklq7Ghn(%g2)B08#@*e?;O-Dyf(1x$w;+QAhu{nrAh^2|BtUQt?he6%%Runp z?r>&*`_#GT*1cU_^JA)eq`Ir$_1Ief2lZWBR>w1RKb1drHdPd`YU9LJblm!o;3gE{ zP&%$P-)kL8vA!>`3j<6i!m9cIkeJ=(@=bJT3^>?P`!*=T0r70qZ7)G>N`9{GTX)^g zI{pxdU_2_N?b4-=onc_$Un_CSx8ww^CE&F68%s!|@7-e7hsWC+rl*#B4@BB`3rKiq zu;-|h=`teqw%h1IBkSg23VP&|%p|?8mQv#Y~s0qd%D|?4O*ZPJ8saNWMnsQw2 zuFM3Wjt6M=$qY@Md#VcECWMr87Fj}+BB}@w`tsb~|FI`ce(XmEDRWH#va^{B%;n@ZPxBj9&SbGb>^x?$zX{7h6) z>Yv2M#lbePWjoiWY@ikk6D||2~zytg*RheQwOK{9o?nV`2IF%(G8IMdjS}vzNEA`)TFlzYb5;9A81R)NFPF zGbtI3f`pdtPwc(-b#bz!MCs^)wUZ-!^*r|a{kcqu&>lIB)MA$E3X+eZ>=bZb(H0iJ z#7k2vatgh-?_T_GX-${cr!rTsA8h!Cd&DK5Pi~S<71(H?fYETkD+7v8D* zzfNDZKRP`OQ#In77_SHdw5My&U%Qsp@+Ml5!$1A*P$p(5yG_{ZdR61%I=UOqt90xD zyKHH$#9p3N(Ksw=&wD^0O8x~43z*i{;I|wWn7*uRebqkgJg_*e#M;gFaTzLccRx(? zT)j;@{@RA);B9%^)T|+)2)#5EYFG0B+u6CvSxxpC3g%43hEgkkp-BddCd2ZVe-MAs zQofFyzJ4isfi%BZ@k=0HzHji~$hrIsqsnDv0I7dfcBV$y;*yY?M@h25`(v7i*}2MQ zc1J%S-!n0@N`vQ~$!g{--C4Du-R|z%1_uTFz9aAF$AA{QZe}*Kqy%A44&(nhe|H7v zMtZC~&fnYpkb`PsvTK@y`|jz6DK}}yjhLexDR6@YH*22D;l1LXXWsp-^+$4nz1`|n zpW|!g)Tgt>toh)dj-^Fc5m*5aSG$hL4Trl-QcHBzM}8MXk2AaTspVIOI8NSGQ57M@ z4LSDZ<;wZOQ}sIuLcVmyJyb2iA31& zmPMQ50d9p4OS#d2&Ra0**8&RlpcLi{I*=^=F+F-fvk|kX+=cdfY039NxPaGbl7RL? zQDqT*E0RakEOF6*vukk#Oy<9jm_!_#&rdTL)wkYN3IZ`-l>UOW%B-=JB2eL3aiOG@ z?lpVih@gDb;IE|QG3ru;fjr3SNOcr&eincf8wV&7kmY6$3ql13N#zQ-ngi1}SSblN zLoZVh`FHL41dWt>V@QTm+Ocn|gqzv%Ldu<`={ryZ(f@4Q5Ij+E9& z$B>C7W@3$tG-}cWMw{3t9E(ol!TQ6wV~rTZwg<=J9y8ZBac83~4#yAI4x37S&vfrF z6EBRU4cVlAevXYv6!~Sb2wa~Wk+l>yQL5P*PTf%h>77*H9#x#_LiHyyOyv?Kesw_O zzvr&^A&MO|g+nwbpn0Crs{y55n~_$0f4BZUlj>ls85> zy^QzHpGw@*OoqiWz})Ag+p#><7>IG~;lz=rR&Y|Xe)7iJd07GHcW{LJZJm2oyvR~Z zZp1nXme`#j*r6iw&HZW6i4w{bX}z!93;6YH6E@<}E82W{mmgs@ zqy?pn=KBPk$xbFn+kRHmaoJTP9^t&W#bR%8%Nj$o85ufxcpCanz^JborKK)D1b?}^ zDdbBENUgpUa?;`@%#`vI&N~R12+n$6Ra#Ijczk(!STOLt$z8nu^P8lpDE~`v&OTcL z7!M7UqtxW8OplI`e z(Jw4j(~gfpAsB*Kkku@!`VFbTLH(e7H82!jq^E@(LEGGCD^^g8?Hsg_7N41W4>`JP+46_Z zH&a8~AJfu|@3R7GEYD*q8?%sof{BBcKPn|SPa~HT+KcWj#LR4=eCU;<_p)d?h(uNE z@nrByS!*~rgdV;*uQSuq>Ws)xi$|;qMG8pmWJ3K*KpGN_UESN`^t#ed^^JR`ggI7*uBE>^P!FJ-l(_R%guRS$H|+}EY<=M%=>EDy95&E z9#C*H-!-9^k;)=iMuSctPVp^W_0w|{Z@>U6BH2jE<%|3MPgz5?UXUWXnUBu*@3$+h zjyq4nFLaVV!cKgGoKZDq#FI=b=yVeZn+XI%;S5Mp1wY>RsEehk?(9)u_U5VKswJRD zso;h73=P^8_c{FtfnTxKQF@af{>hTUEKe?kzm_M2o^)N(LXVB3H+;CawpGlRmdGao zxs?~U05sZSna2uG+nca6fQo`L-ttt2j&iLI2d|s1@iVgKl#h7~eY_VGD67@+y*BpK zcK11CCH8n}S!i6ZvCgHJ+2s7&gHgf7pcM*`I3bWSt(WkD0uG~^^LZ$Ybj(0^&KBgm zxw>nxebTcYVXoINxpau0BE;SRl+{(1urBv8n|4?pC+3UgTly;0W5!Q;{P{o%s2duf zeZxVOppY`Q(wEhCOGFIMR~uJz>UlDB-P&WMy@%;f#rdbhxE9~twFMq33^SK^X+3dn zlz$JhAURR1$8=qfV;0q%Dmv4ACPJNF-240N9!lN0^%JL~3q?YtfdfIe)06*cj_ zzKg)yAb1CnC}qG9{rC0p_zzbp>gx9d00~fM0dOrana7mgq6KVBD46=*1xUPjzW#7S zJlc&Vhu1PdG3-wrJQHSkQbO!YoWCDZ5ga$e0V$J6RwbYCPNRtVI6KSMIC{SmHuqMr z5P$#gtlRk|?R!HpE?!FU`(E#RiM`dA1V#OXw;Z8O_SFG(}#8lzPX>~zJ09%uoaZ%x4Oz@ops#~Gbt(dZHps)L$0#9H*V=b>-JqS}D9DlKfkq5pZ4md-Le{s|{T0Vq6IS33tnzaw%P1 zCFnC9Wb$+^U?oL)9kMl)hVASILGXGM^2q(W`oAB&TguXLr`M&m#T8Cc>Ug48>iEK zqbKAj(PE9vc#ZeR$lBu?S9>m*aGm$8;^T)8%>n0CM7|0&1yw#nY|s}^(>K7`h>32h zw#m)3-IxfU#d$!6evB-j*o5Osbe>uxtM#Q_i+Tq-b5lRiAmwQ;93y)W?Uf#Fs&rXyMrp*^K zanH95GkO*oo4SJ6+YPj47E&wN!KiyO1O2}^^$ZM~ut8m3e;bVTI`$Dv?S)o+ACXm- zBE7-DkZ(+qVtD%bcTGPijY!jVaRP%7|JsXnbJe0yIr$+g)N6;ve<~#oX?zXN!mz2( z%Yksw1(FI`3{sBBEA)FU1t3?a?KH6_-wRTV!3}8L|1i)5a{WwYmj-koN8EolbS8%;WgIuEkMKL)&VQc zh+#$W#PdYo2!YnTo!#0P_yh-qeE_G}?qVm+Yf9_!JF2m?`K_sqo4ig~BG?R0?ZYK! zo2|*O&NOYVt}=3Z2SF!jmeB=&;$5QhR*Pq8Pzpi$@mc3>NocfZd8Rh!lhZ0;m+2NnBMvocx zopZGqG>O+rx=j8h2VlexiHWzNzXX+#?$;vk%R^DmId5 z`l)>N>7{rqmFo!CslnHIuY{lvo_75u!26+K9DG>qWUsH8D?H!f;A<+_y6GEG=Wf{d zFLpkaZFw3}u$QrivfA^~Av*h0l$f)kjweavVLWvx_h=Fk`Nf4(*<5Ua@W^VLLa~Qs z=Hthxj2euns$5fXp}R8XHjf}I|8f<$q6ZH zHAL4y?qzX54iYVV*gscnC9?HXd7=tLTn~VSiGyk+5klo^LaToM(`|~!#G*cJ;fBI} zpIIK=!_D#*64@P(uNLbGk{oOqUULrGvXZe1B91@$) z*103MZ+9`jr$o96$=2!1CM0sd2gTyJr!$aFTKrTDj*#rY7bGDaRiY34c#5}qjEk|G zjuG}pQ#D|x>{2`;J^i5felew+kL#i^CcAoaW&Af=DIq!3x=o5V>Xbs`^WfZuRPkg~ zbTpEiii*nkLHy4}y=@sb-j%`(HM>#b_g3eScgutD)pF{~I?|f4cOv>qZCx+|yG@g&RxQM*q#pqLJ zR!+L}_t!akj5hfBp3^v!j3YfES*Msf12=^_j|2_~OqLKmz_B^cRP{d%nhdaV0SVFk zJc)$<`gelUppyQbo{`ZCxiCeeh%f;pC(Wt{0*0UUuS`L`WF70d@Rs_K9mC~fCY%WR z;GG>b1%fw;Fv#^cj^#b0KjU%aZ`-!n{X~T&G-Vish%I(~Ka-rpuF7anglV?Y5+XB> zSsEN%ThySLsd!{2slC22HLWcwt}CbP2r59B zbb#I^(S0Q;9WxyFxL;6*$6(4_*#) zR(w*AF1Iy20iu#8j2pr|PJJl!J$O-Qo)&v%PpRE%zs@yAE!%f_p6#P)&uYw`uOG6? z2fV;aTI&-W*CuIJ6=ZWUdZLOtMD%_D;A7Jmx6)b8zDy*8$6waqirqur{Q;<2(Q|%vJB2)X2a1q$UL$UVfU{h7~!3~78BY+16ar2zfBsl zOX)<+Z)(W8j81 z?@;nqbfPd$^1AueFL>IvWA9(viA_1_vHvCs-FW!X^tDhI*087B z*3{z>MKrZBb#tma7pvM~aVjY{RB{>C(`rL}rSrP1vS-h<=_CyL*dKgBj`D_hoG*+S zO%NGh>;Y{#Y-;L_`O%z!ksg*Ma@KHaG}lNz1rI z-VYk6^fproD`?a;c_*;ue9c}kslYPBoxB9)j{&&86VKcn_IQGZD2bp8%Wfj`_T^tN z>+h>#DeYN)7=Oqanyz&-8YH#&M4x4J%_ zpgeP_=+`3lp_}Juv$s?|nE4zz6JEJY-y<>S7`VjYwDe?3uO0!^Jj_CP7P;6h>CcNA zEKN*e?r;{371@Q}HFl;>3(`6cSd}C1$u%#DFxX%%4}C6H0-82WX((80LNQMtrc;Of zYr5KOQU-(X_3;iYzh)+*ctE(+BGx3&bpI+ZgD&*TA z!Y9DB>?hup61U>SZPr^vM#oSf5@>rX4Q4rqP@D2&zsDnm@_~B&1-A-xXvJ>A;!~WH ze=SvHc%;4Gdl&LaY%)9?whqJ*A_;T`cG!#LTw_I{)}Q)d{<})jW*d{)@<|NXN-}EY z*VKu@s;g1Z)^b+iu#(k~jT|Hv$Nu-8^?PaQ_IP*ZY?F$zQ^11M&EgAQ(_T}f>Jim9 z9rup^5=emuOVi>hyUN!S+VmM;oiIrOx2ygjiGr|9pF_;9i1dt*==Q4tnwR?_nwP!2 zxIZRt2i2>hLLZGKXK8`ZB3v}7gkZ&eP(I8{ApV)py zLvlr=sTN!wU>U9)=LWBX>1nM&1h&n^RQaS2*6loo%R0U4f5CO~B`aY3t#p?wu)8G zx3(!M3Ume^Gj_W5&`T<^S7jMn5MlMHQ%EFRv8u-b{#0__ThN<8M4TY}7g*yx^%Q4Z zJmQ{JM$dDXAhPfL7T1x3B8i*N#!ekRSCy5JzG!VWibLFPYlPA z@la{CZ|bsoda~g%NNJ&XEQ*;iftx39!UTJyqVRBI=jT6#Y|sG19h_pMZb5Y8gJVVF z(>DiXrSGn^R4u~8yVbL65VLj&mScucOp$(L^T9P3>dxciI6eQapQOak|3}g3H}rrM z;~)SN1OJ0IjTtD{buh3j_qhegvGpq_ne6HFBI0xW?W%>-KSLE1}FKnj*F zWd9;%P_)72@nrAj%ess9W7|SNJ0viRf_!?VtM*d%$v3O`(}eqi-_h^7&D@0PXxMU; zLI2vlTeUbU#)pT8{skJ$4Kt&8r<$#PSw@)AL^k|@6p{Tt@8uj}0=Enk_`TZX!SGJ} zTQGUIm>&%Gd@){eRerdYyv`d!F8h2yMD)!>Bw?k_qq*bdOf?p3xiQVic<#FYB^WJAzD>;X#w~QK*P4fiheW&=p3oj0USmB%#N@?% zotlqJkdu*-aaTqvBou-t50Zu}*3)AN4L3MwPAC9bH4(rHW!Tm%ZCRPr{Zkplbd;Vx z3zkoVWHXeG$}I?KS*vzlyE?JHG!FF}>3ymi)S^w4CN$glh6M;}?4x4P0=e7(bEw&0 zd#Pw6aEw{y5MwGT_V3`Q93Hv;;QQX8^0vQ1RR;52ZJuuI=@#ak{NIh1%tB?Xf@o_= z0DwEB7^BapBRpt$ko$*uvQ!pEqOF@A{#U}_4D|tI^WV6&pQsU*KL}N|95jVuP}q}E zOWZAv;fT-geJyXZnmE2~YUJ0mvT5*LNJyjhfp|7gMUDmRb#YX4hU;zpUU)rG7Jc}& z{q}jsbN#6dWtY{AD}{P7z;A_aMd(zewp{-editwiv%fIU|6ijS(6HdYyM9}tB>7sb zkb4vzkVqn+)woNSW>V|pxMh^(bNe)FZ7Tfb#lp$_V@iGnAqW&n8-a>sE-;nFk~kh1 zCAFGIiDE-K{fg7$#|$>vGjU90ij)Z2I6tKsqB>n$X(DNqN^1xUCLaPX!(Av zgn{1(ihr90r=`!$wH3_czVM~O$Nll-gqvDMqp$iRZuG~+9d|IvnU7ZHy&jrO$9#M6WQ zGFa55a}VEb8S>bSIn%%{{<&WdgJGA?*qj?KP~>}i`?^0zHw`8jONDy8)`2VEr%(%DJ;e^aZgqcp6!pJ-)pxzi z!Vzx}&Wvi@=zzAHjVMpPRG)h2Z!O=pz}T?=Uh6NCF9z1LGh@11dItnucQbs3ty@Tc zvo~(Vu7_~MMYIBLh32b;p>7ev?!jK*Ej}Q96+Y?pe7kWSSJRnW#IdBFcVL`%FvTw0 zEWe2WZOEH~s1-ebH*8mFn=U8Igpvn{r&@mg+$B8{`wO`S)_&jymKVqm;b|`f(p=^`HGzX+kA$!9>>~A z-t{z<%YsJhKE?={df4s^8+M7+G-qAh;=k8#I;PK-?RBA4CV}Wqxl$U!#qSXA=DpKO z-Ff>Fv`J6-=)hFcHjL*~G#PWtV$EHv5+lrJLm$k79}H_c6>mpxikKZ)0w};1z5mV# zPzoVtLV717)y;jsuw>w;hF51sFSpTk9QEl#9ez+;-Vql$x`OHI%Tc5IsX^`E&MqU7 zUyoC%3Lf_U5c(gWL$>Nir&lj302mHBecd+ARs6vHk*Dm>NV3#S88d?LwC{Eif5V@- zS-e?;t-!X&$|Oucto=~I(1XE1(z&laGx(mr(sVg-0|H&YbDAuXo@}{iYc}zHP8^V2 zo)ryYqZrdxzC@91Q=tynMft{B-UIdJpCxU4-7MkXZ_RrBn`&3(VD}hTxWcy?ZZ%2q zdMD|5&6n6jSxM9?55yBjo{QtbX&9^!|2iS`Bujxm7uN;e8!pd`&o2KAkI3*gLcM=$ z!KuVAwLYwlj~V^OzSn3;7O9QT?4f$YJwZ!8us-h%MTDZte0*U9?JJvf9lJ7KpmPDO zw1xp2NEW~o%oP$h`}lH}TK)QWV>z{Pp}9h@@osmL-R9*R7LKD*g1l_JR%yy{k1ULG6Gv= zcz6IH|A&D9!U3KSlayAR@WOkg;j0>r?WKTpSq=I@0%ZA|G_q0-??_&m3qvQFr?3!<%g)Pm$OWAooQs^Hy4H-hN5|<9XDN1Cx36UR(9Ll zJ+f$&hFZefB$V# zF^vbeg2jo_PY$W#FL;g<2(98`)AwhQwp_eqW@Txp!rYtOgxLJ3=GUngC>wQ#{g2ei z-KM{%n5P=C6JoGwNV5}en-}#G5&r$I!85B6r|&p~SJcOe8pdT1iuXQrrsPu;g%n~q zcXMVQ!$bxl^2*+LaO9K_tU)hfkPE~LID-@(G4th;LZcqYp}M1>5cr<)ZyzbiPf87c zd94ZL1kKLZ&4Cq~aF*E&bc^p9F7R zyNB7KyY8ts?1^1CmR33UXhOy9@AXcubaQZEg1kLvZ3r_ktUw$>rzYfd46lh&=78`{ z_S4&J=eH0G(s0~p=!yWV-PlABL{(C790=4o{%+|bTT$3|@%tf`L1$r7bOJ?}-7q!T z;_)FmkMnb!B@+cP!$)kAbtMNTd}(rjC`aS1ia~;Nkhm7eec7{q%Yg3l*!(9YY$5`; zglFYb6wy@dzD2 zt>0JVL>AsD9OL2J)|dzBr!vY!Q(Lqw3bXkB4OM6pJ#jL+A88|bHIQc=s}M4IUJ*jR z>K*W0^BkBEf7b!=_a4g@Nla?)9#S9}+p}71psMy`&c= zL3mT;Z&q2FI;_R@7H)D?J^5{a)?rTBdf%oULb^^fx>nmo-8-#``8eWn5%H$2C5NM_ zD%d;G#MSoD#2pp`O_2Pu-tfy00FW@FMu>*i{0<&_lujkbf ztbmCU1+h6coesZgvDAlGfhK(9@-lH=CN^@pY(INW`L8Nr@gG&7>U&fGdwT~ga3d({n)yo3xm`?rU(#Xc{U+j@RF>;jPr5xuCIv>!rr}qiP9GQj=I$B3(Zm6&EjDDmjIZ zan~W(zz~-qnQbXB9K9k|QI>(kST+=wK8p^-tX7eLIw@143l=556RwO-b|}bmkBRrN zA4S9e(^NPx=7T)!QL&*t)l=K(rSCb@T4pIMNG3#qwfi=*USCyB|9Ai9G;2F!oanw) zhjUzyD~#AZbU8Dq%|csFaapiLdM4nHXUR4iwgZdi2n!hx&x}<53Hz@r3lKbUp4pw9mA^ zwR=ri#cN*gniQIx)-xiht+gMSPFkFd;WfWeKRxexSi{vEMNUH96co;LzaA`|DR6Z& zK_QPCDw53y0nclAUPA(1ucjm^F0TZ60Z+w|0(nopqpj_2b=iJTWnIsEx%V`!j|)!K z&du$26R#bTSVX$7U7k>lj?+Ae$I*gBY%K!gTQ^nv6C$a$gFykIwI*k?uN-}SC^WwJ z1w#)?%RLsqMHd%+9;>VMW;FD*W7oTKi=uE`p_ag4tk6&Q{(X!(0uw(Z-->S zgJ@jQUYFDJx6?9HU(dsm9AA0FnzC94?5i%1WG=(0*1Aj&tQyPprxUJqM71=N>jOzW z8N=omXqTip03_+c51;KjyPkaC{XDygd0WC}2M64pozVE3c`m-pEp!qz#8Iv+eb$3$ z-`mBh3iL!&VF3RZP{eeFaCONJ8Jd!?w_C3?OEe02#j+WC_MJk^rM+Xma#K>^S)(#8 zRwKWW!k!qDBK4ITXg40EM&TP%4Jw%C1=5a zot^!(kajHT=ePd%a9L$*YIET#lC7lmJDEt$*yon2%999$AL4eO9c`*)C1zR<2JjGo zrGmBU+?!7@B>ewJd_Ub{1}Ebu(88tjNXbg;e1ww=4DUSskEAdC;?FLU&NhV%gl|)r z+T~DiT@4A!C!p8yzxl+8;W<9=p?!xJ??3P*@K`GuE^w~SHFmeB3esVWqTeXc!1&|e z?}I{L1qvqvk${?8#n&&n`4a_u*tzzO#vNx@x4gBC`Vrkjsy9PFAESd3V+61+M+yGM z++gQX#-vn|A!4|x4KtCf^{bne89{=&??rS)@;7LeNv#;}Ifb1ZMsO%n)^i+pJJK_7 z-t_0)Bqd$896~khY4@>NRhm>xS$xn*5_WKtCP1e4sU|Rs4tUT$9s>^u2jQF<#hX z7m_!X88DVejJ4i*VuAcqmw!G1^Yql`aIVnF;h4gz!eB{HXh;6tgXJCu$_=&4kLMHc z*#LsVD8({yZb?uOPR?6?_6FzkRy$Tg;H~x;XLXc74Mu8zaO-m2nca57{5&Z9(3kII zh}RcQfEe=?28c=pIpG0Pt4f&^a;b1dHX^NRq4A&*Vdic7Xr6I&BGf=y)bH`~4vVB# zAVkEX8kcdoxLhS?`5UajZmKuQv(pEOIT#mCbZ>g2HPXsnep3XTe*94C~c5eWB;ZpLG%euGelRVr`}|D#Z4uI_T5oT;F8Z zRi6Ti8&=Wl6on|41FUep^arc9pV@d0J;$&~df)yv9a98nTn{P-Jbw;2N{2`X3oIC4 z){2gW`O3@l>3mQICq5x$wVAVBju&+MvW?e~*@H=bj*+G(q4E5IpwTJwabw75#>%8n z2;$y{#mIpBL;8>+-N)GjOIQtvi!%H63uq`POY^IR*2Y@*h3`P)qz`<7lmNXmKBXCmJEl(TL^d0N-sX_s-27;&4uzxOTld zeRTlkKJm4m?ecS)eBn$hrz96%YO!NpC+_$}w&c5Ai9l9f<@ou%jMLTk~Yqr6~CN&h%)uM{Ji`)ap4 z2A=-gFNhd+8{f?e!vQrZ+=Pq>X4KHc>^6bm8bq#pt#SbGFaN@S$>Ir5(T?-U^$ijp zyM-z&lM2ITPA{J85?f1)-3=UB^qdC_NhCag$bO5^eE{CHHeK_b?FvgR-kZ+T)>?8( z0=IQ_C7${~M0v|ft$dO~G$R)^MBL)D)nyGP0YAhc(-uiIb-t@0~=Nx%tPggc!Eb9K`_;&Jv;nQ6$9ada9qbypz6{D$TC@N{!=S4#)uu~^G8WVlWNE_T5iLNtmI=D6t8HZ{8SuU! zeETC3Ya@?5-p-5{*={~$fAK@U)J|q-)_RCNX&`P;c*xH8;U|V%Hl5xJahxw37IglM zIRdb{|8k|qgz=bM3inN0#ds#Wj$FHn$k=$W2gsHU0B&Z;bOE`*BiY3@<(NC2;PwhG zU^^M5jwkE)Lm)G}&fC%RvDZYbP#|E%u6XRi@iUH(v>vl+7S^Q=Row`DiYRPR9I3iFhqL zBKK1C^oVN~@O0%|Ma3+dF@?HO99G{c5aBa{ToG9We>O{}KdEFe?6_Pk+foR0PexlB z!gLg8~eGmeTn8gV%Ry-5aH0@-6T}``jnC(rG^{$Xx8x>xTh;*<7H)8HT_e2zhET(Hf zc#Q^Y-l8)6B&Ae;cf%0{!JVJ9^apTX@rQv~d%<@+RVX_6a2yyK)P{m+_3_yB5i{t$ zAK+wu7in^W(EGM)-xYBXc`)6Ov4j2k5vnyDeqx>TBVeo>SM)Sh!+`2PULsAyNq)L6>By_B_C9D=M(8_tvr{3 zK5Lvmoi|CQdiu`~$^n-PIT=g76tIfiF@y|VWw?OaDF0NxWXB6{c(YBS{(Veq(C
k(joL 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

>)|+~UY1a`>X;dWM)W+64uxlZ-Hq7dm^PfQ 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 Ve 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

N?OA~=9RV??^$%C=))IU?>psYoustj{2L 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 ``. Usually to force stop a process you can use the command `` kill -9 ``. The number _9_ is the Signal code to terminate a process. + +### Types of Signal + +| Signal name | Signal value | Effect | +| ------------|:-------------:| -------------| +| SIGHUP | 1 | Hangup | +| SIGINT | 2 | Interrupt from keyboard | +| SIGKILL | 9 | Kill signal | +| SIGTERM | 15 | Termination signal +| SIGSTOP | 17,19,23 | Stop the process + +By default when using the `` kill `` shell command, it will use ``SIGSTOP`` which will terminate the process but still can be resumed. + +## 5. Making a Process + +[List of Content](#list-of-content) + +### **fork** +`fork` is a _system call_ function in C to perform _spawning process_. After calling the function, there will be a new process which is the _child process_, the function will return a value of 0 in the _child process_ but return the _PID_ of the newly spawned _child process_ in the _parent process_ + +Try the program below by compiling it with `gcc try.c -o try` and executing it with `./try` + +```c +#include +#include +#include + +int main(){ + pid_t child_id; + + child_id = fork(); + + printf("This will be called twice\n"); + + if(child_id != 0){ + printf("\nParent process.\nPID: %d, Child's PID: %d\n", (int)getpid(), (int)child_id); + }else { + printf("\nChild process.\nPID: %d, Parent's PID: %d\n", (int)getpid(), (int)getppid()); + } + + return 0; +} +``` + +Result: +```c +This will be called twice + +Parent process. +PID: 13101, Child's PID: 13102 +This will be called twice + +Child process. +PID: 13102, Parent's PID: 1 +``` + + +Visualization: + +```c ++-------------------------+ +| Parent Process | ++-------------------------+ +| int main() { | +| pid_t child_id; | +| | +| pid = getpid(); | +| ppid = getppid(); | +| | +|--> child_id = fork(); | ++-------------------------+ +| pid = 20 | +| child_id = undefined | +| ppid = 10 | ++-------------------------+ + |\ + | \----------------------------------\ + | | + V V ++-------------------------+ +-------------------------+ +| Parent Process | | Child Process | ++-------------------------+ +-------------------------+ +|--> | |--> | +| pid = getpid(); | | pid = getpid(); | +| ppid = getppid(); | | ppid = getppid(); | +| } | | } | ++-------------------------+ +-------------------------+ +| pid = 20 | | pid = 23 | +| child_id = 23 | | child_id = 0 | +| ppid = 10 | | ppid = 20 | ++-------------------------+ +-------------------------+ +``` + +### **exec** + +`exec` is a function to run a new program and replaces the currently running program. There are variations of the `exec` function such as `execvp`, `execlp`, dan `execv`. + +The example below will use `execv` + +```c +#include +#include + +int main () { + + // argv[n] = { {your-program-name}, {argument[1]}, {argument[2]},.....,{argument[n-2]}, NULL } + char *argv[4] = {"list", "-l", "/home/", NULL}; + + execv("/bin/ls", argv); + + printf("This line will not be executed\n"); + + return 0; + +} +``` + +### **Running programs concurrently** + +By combining ```fork``` and ```exec``, we can run 2 or more _tasks_ concurrently. An example is backing up different logs at the same time. + + +```c +#include +#include +#include + +int main() { + pid_t child_id; + + child_id = fork(); + + if (child_id < 0) { + exit(EXIT_FAILURE); // If it fails to create a new process, the program will stop + } + + if (child_id == 0) { + // this is child + + char *argv[] = {"cp", "/var/log/apt/history.log", "/home/[user]/", NULL}; + execv("/bin/cp", argv); + } else { + // this is parent + + char *argv[] = {"cp", "/var/log/dpkg.log", "/home/[user]/", NULL}; + execv("/bin/cp", argv); + } +} +``` + +Visualization: +```c ++--------+ +| pid=7 | +| ppid=4 | +| bash | ++--------+ + | + | calls fork + V ++--------+ +--------+ +| pid=7 | forks | pid=22 | +| ppid=4 | ------------------> | ppid=7 | +| bash | | bash | ++--------+ +--------+ + | | + | calls exec to run touch | calls exec to run mkdir + | | + V V +``` + +If you want to do multiple tasks simultaneously disregarding the order, you can use `fork` and `exec`. + + +### **wait** x **fork** x **exec** + +We can run two processes in one program. An example of its use is to create a folder and fill the folder with a file. First, create a folder. Then, create a file with the shell command `touch` in that folder. However, in reality, to do two things simultaneously requires a moment's pause. + +To create files that are in a folder, the folder itself must first exist. To _delay_ a process can use the `wait` _system call_. + + +```c +#include +#include +#include +#include + +int main() { + pid_t child_id; + int status; + + child_id = fork(); + + if (child_id < 0) { + exit(EXIT_FAILURE); // If it fails to create a new process, the program will stop + } + + if (child_id == 0) { + // this is child + + char *argv[] = {"mkdir", "-p", "folderku", NULL}; + execv("/bin/mkdir", argv); + } else { + // this is parent + while ((wait(&status)) > 0); + char *argv[] = {"touch", "folderku/fileku.txt", NULL}; + execv("/usr/bin/touch", argv); + } +} +``` +In the example above, the `wait` function is to wait for _child process_ to finish doing its job, which is to create a folder. After _terminated_, the _parent process_ will resume running the process of creating `my files` in the` my folders` folder. + +### **system** + +`system` is a function to call shell commands directly from a C program. For example, when you want to call a script in a C program.` system (ls)` will produce the same output when calling it in a shell script with `ls`. + +File examplebash.sh: +```sh +#!/bin/bash + +echo "Shell script ran" +``` + +File system.c: +```c +#include + +int main() { + int return_value; + return_value = system("bash examplebash.sh"); + return return_value; +} + +``` + +Output: +``` +Shell script ran +``` + + +## 6. Types of Processes + +[List of Content](#list-of-content) + +### **Zombie Process** + +The Zombie process occurs because there is a child process that is exited but the parent process does not know that the child process has ended, for example due to a network break. So that the parent process does not releases processes that are still used by the child processes even though the process is dead. + +### **Orphan Process** + +Orphan Process is a process on the computer where the parent process has finished or has stopped working, but the child process itself is still running. + +### **Daemon Process** + +Daemon Process is a process that runs in the background because it does not have a controlling terminal. In the Windows operating system it is usually better known as a service. Daemon is a process that is designed so that the process does not get intervention from a user. + +--- + +# Daemon + +[List of Content](#list-of-content) + +## 1. Definition of Daemon +Daemon is a program that runs in the background continuously without direct interaction with an active user. + + +## 2. Daemon Creation Steps +There are several steps to creating a daemon: +### 2.1 Fork the Parent Process and turn off the Parent Process +The first step is to create a parent process and generate the child process by `fork()`, then kill the parent process so that the operating system thinks the process is complete. + +```c +pid_t pid; // Variable to store pid + +pid = fork(); // Store the pid of the child process + +/* Exit when fork failed + * (pid value < 0) */ +if (pid < 0) { + exit(EXIT_FAILURE); +} + +/* Exit when fork succeed + * (the value of pid is the child process's pid) */ +if (pid > 0) { + exit(EXIT_SUCCESS); +} +``` + +### 2.2 Changing File Mode with `umask` +Each file and directory has a _permissions_ that regulate who can read, write, and delete on the file or the directory. + +Using `umask` we can set a _permission_ from a file when it is created. Here we use `umask(0)` so that we get full access of a file when a daemon created it. + +```c +umask(0); +``` + +### 2.3 Creating Unique Session ID (SID) +A Child Process must have an SID in order to run. Without an SID, the Child Process whose Parent has been `kill`-ed will become an Orphan Process. + +To get an SID we can use the command `setsid()`. This command has the same _return type_ as `fork()`. + +```c +sid = setsid(); +if (sid < 0) { + exit(EXIT_FAILURE); +} +``` + +### 2.4 Changing Working Directory +A working directory must be changed to a directory that is sure to exist. To be safe, we will change it to the root (/) directory because it is a guaranteed directory on all Linux distributions. + +To change the Working Directory, we can use the command `chdir()`. + +```c +if ((chdir("/")) < 0) { + exit(EXIT_FAILURE); +} +``` + +### 2.5 Closing the Standard File Descriptor +A daemon cannot use the terminal. Therefore we must close the standard file descriptors (STDIN, STDOUT, STDERR). + +```c +close(STDIN_FILENO); +close(STDOUT_FILENO); +close(STDERR_FILENO); +``` + +### 2.6 Creating the Main Loop +This is the main loop where we write the gist of our program. Don't forget to give the command `sleep()` so that the loop runs at an interval. + +```c +while (1) { + // Write your program here + + sleep(30); +} +``` + + +## 3. Daemon Implementation +The code below is the result of following the steps of making daemon process (Daemon Template) + +```c +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main() { + pid_t pid, sid; // Variables to store PID + + pid = fork(); // Storing PID of child process + + /* Exit the program if fork failed + * (nilai variabel pid < 0) */ + if (pid < 0) { + exit(EXIT_FAILURE); + } + + /* Exit the program if fork succeeded + * (the value of pid is equal to the child process) */ + if (pid > 0) { + exit(EXIT_SUCCESS); + } + + umask(0); + + sid = setsid(); + if (sid < 0) { + exit(EXIT_FAILURE); + } + + if ((chdir("/")) < 0) { + exit(EXIT_FAILURE); + } + + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); + + while (1) { + // Write your program here + + sleep(30); + } +} +``` +### 3.1 Compiling daemon program +To the daemon process, first we need to compile the C file that we have made with the command `gcc [program_name.c] -o [output_file_name]`. + +### 3.2 Running daemon program +After completing the last step, the executable file will appear. It can be run by exectuting `./output_file_name` + +### 3.3 Check if the daemon process is running +To check what processes are running, we can use the `ps -aux` command. To find the daemon process that we ran, we can use the `grep` command. We can combine both command to be `ps -aux | grep "output_file_name"`. If there is an output, that means the daemon process is running. + +### 3.4 Terminating daemon process +To terminate daemon processes, we can use the `kill` command. First we need to fild the pid of the daemon process that we want to terminate. We can find the pid by using the last step. Then we can run `sudo kill -9 pid` to shut the process down. The "pid" is replaced by the pid of your daemon process. + +# Extras + +## Directory Listing in C +With C, we can check what are the contents of a directory. To achieve this, we need to use a spesific library called `dirent.h`. +Here are the example of directory listing in C: +```c +#include +#include +#include + + +int main (void) +{ + DIR *dp; + struct dirent *ep; + char path[100]; + + printf("Enter path to list files: "); + scanf("%s", path); + + dp = opendir(path); + + if (dp != NULL) + { + while ((ep = readdir (dp))) { + puts (ep->d_name); + } + + (void) closedir (dp); + } else perror ("Couldn't open the directory"); + + return 0; +} +``` + +We can also traverse recursively to a directory. For example : +```c +#include +#include +#include + +void listFilesRecursively(char *path); + + +int main() +{ + char path[100]; + + printf("Enter path to list files: "); + scanf("%s", path); + + listFilesRecursively(path); + + return 0; +} + +void listFilesRecursively(char *basePath) +{ + char path[1000]; + struct dirent *dp; + DIR *dir = opendir(basePath); + + if (!dir) + return; + + while ((dp = readdir(dir)) != NULL) + { + if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0) + { + printf("%s\n", dp->d_name); + + // Construct new path from our base path + strcpy(path, basePath); + strcat(path, "/"); + strcat(path, dp->d_name); + + listFilesRecursively(path); + } + } + + closedir(dir); +} +``` + +## File Permission in C +We can see permissions of a file or directory in C language with a library called `sys/stat.h`. Here are some example of file permission checking with C : +```c +#include +#include +#include + +int main() +{ + struct stat fs; + char filename[100]; + int r; + + printf("Enter path to list files: "); + scanf("%s", filename); + + r = stat(filename,&fs); + if( r==-1 ) + { + fprintf(stderr,"File error\n"); + exit(1); + } + + printf("Obtaining permission mode for '%s':\n",filename); + + /* file permissions are kept in the st_mode member */ + /* The S_ISREG() macro tests for regular files */ + if( S_ISREG(fs.st_mode) ) + puts("Regular file"); + else + puts("Not a regular file"); + + printf("Owner permissions: "); + if( fs.st_mode & S_IRUSR ) + printf("read "); + if( fs.st_mode & S_IWUSR ) + printf("write "); + if( fs.st_mode & S_IXUSR ) + printf("execute"); + putchar('\n'); + + printf("Group permissions: "); + if( fs.st_mode & S_IRGRP ) + printf("read "); + if( fs.st_mode & S_IWGRP ) + printf("write "); + if( fs.st_mode & S_IXGRP ) + printf("execute"); + putchar('\n'); + + printf("Others permissions: "); + if( fs.st_mode & S_IROTH ) + printf("read "); + if( fs.st_mode & S_IWOTH ) + printf("write "); + if( fs.st_mode & S_IXOTH ) + printf("execute"); + putchar('\n'); + + return(0); +} +``` +Variables that use the prefix `S_...` has some sort of a rule like file permission in linux. Here is an image showing how to use them : + +![file-permission](img/file-permission.png) + +## File Ownership in C +We can also see the owner and group of a file in C. This thing can be done with the library `sys/stat.h`, `pwd.h`, and `grp.h`. To get that information, 2 steps are needed, which is UID and GID of a file. Then we can find the name of the user and group from the user database or group database. Here is how to use it : +```c +#include +#include +#include +#include +#include + +int main() +{ + struct stat info; + char path[100]; + int r; + + printf("Enter path to list files: "); + scanf("%s", path); + + r = stat(path, &info); + if( r==-1 ) + { + fprintf(stderr,"File error\n"); + exit(1); + } + + struct passwd *pw = getpwuid(info.st_uid); + struct group *gr = getgrgid(info.st_gid); + + if (pw != 0) puts(pw->pw_name); + if (gr != 0) puts(gr->gr_name); +} +``` + +# Exercise + +[List Of Content](#list-of-content) +1. Modify the code [soal1.c](soal1.c) such that the output can be sorted from 0 to 100, without deleting existing function and using **wait**. +2. Make a program that copies a folder and all its content in */home/{USER}/Downloads* to a folder with this name format *tanggal-bulan-tahun_jam:menit:detik* (contoh: 26-03-2021_16:22:09). **Use fork, exec, dan wait**. +3. Make a daemon that runs every 10 seconds to backup the content of *error.txt* file that is saved in a file named *error.log.{no}* (example: error.log.1 , error.log.2, … ) then delete the content of *error.txt* such that the file is empty again. **You cannot use exec and system** + +## References +* https://notes.shichao.io/apue/ch8/ +* https://www.geeksforgeeks.org/exec-family-of-functions-in-c/ +* http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html +* https://www.computerhope.com/unix/uumask.htm +* http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Simple-Directory-Lister.html +* https://codeforwin.org/2018/03/c-program-to-list-all-files-in-a-directory-recursively.html +* https://c-for-dummies.com/blog/?p=4101 +* https://pubs.opengroup.org/onlinepubs/009695399/functions/getgrgid.html +* https://pubs.opengroup.org/onlinepubs/009695399/functions/getgrgid.html +* https://pubs.opengroup.org/onlinepubs/009695399/functions/getpwuid.html diff --git a/Modul2/README.md b/Modul2/README.md index 7d504bf..043a696 100644 --- a/Modul2/README.md +++ b/Modul2/README.md @@ -32,6 +32,10 @@ Menggunakan: * [1. Pengertian Daemon](#1-pengertian-daemon) * [2. Langkah Pembuatan Daemon](#2-langkah-pembuatan-daemon) * [3. Implementasi Daemon](#3-implementasi-daemon) + * [Extras](#extras) + * [Directory Listing](#directory-listing-in-c) + * [File Permission](#file-permission-in-c) + * [File Ownership](#file-ownership-in-c) * [Soal Latihan](#soal-latihan) # Proses @@ -55,8 +59,7 @@ Merupakan identifier dari suatu proses yang menampilkan user yang menjalankan su Angka unik dari suatu proses yang sedang berjalan untuk mengidentifikasi suatu proses. Pada program C, dapat memanggil fungsi ```pid_t getpid(void);``` ### 2.3 Parent PID (PPID) -Setiap proses memiliki identifier tersendiri dan juga setelah proses tersebut membuat proses lainnya. Proses yang terbentuk ini memiliki identifier berupa ID dari pembuatnya (parent). Pada program C, dapat memanggil fungsi ``` -pid_t getppid(void);```. +Setiap proses memiliki identifier tersendiri dan juga setelah proses tersebut membuat proses lainnya. Proses yang terbentuk ini memiliki identifier berupa ID dari pembuatnya (parent). Pada program C, dapat memanggil fungsi ```pid_t getppid(void); ```. ## 3. Melihat Proses Berjalan @@ -99,16 +102,16 @@ Secara default ketika menggunakan perintah shell ```kill ```, akan mengguna [Daftar Isi](#daftar-isi) ### **fork** -```fork``` adalah fungsi _system call_ di C untuk melakukan _spawning process_. Setelah memanggil fungsi itu, akan terdapat proses baru yang merupakan _child process_ dan mengembalikan nilai 0 untuk _child process_ dan nilai _PID_ untuk _parent process_. +`fork` adalah fungsi _system call_ di C untuk melakukan _spawning process_. Setelah memanggil fungsi itu, akan terdapat proses baru yang merupakan _child process_, fungsi akan mengembalikan nilai 0 di dalam _child process_, dan akan mengembalikan nilai _PID_ dari _child process_ di dalam _parent process_ -Coba program dibawah ini dan compile terlebih dahulu dengan ```gcc coba.c -o coba``` +Coba program dibawah ini dan compile terlebih dahulu dengan `gcc coba.c -o coba` -Kemudian execute program dengan ```./coba``` +Kemudian execute program dengan `./coba` ```c -#include -#include -#include +#include +#include +#include int main(){ pid_t child_id; @@ -116,7 +119,7 @@ int main(){ child_id = fork(); printf("Ini akan kepanggil 2 kali\n"); - + if(child_id != 0){ printf("\nParent process.\nPID: %d, Child's PID: %d\n", (int)getpid(), (int)child_id); }else { @@ -176,7 +179,7 @@ Visualisasi: ### **exec** -```exec``` adalah fungsi untuk menjalankan program baru dan menggantikan program yang sedang berjalan. Fungsi ```exec``` memiliki banyak variasi seperti ```execvp```, ```execlp```, dan ```execv```. +`exec` adalah fungsi untuk menjalankan program baru dan menggantikan program yang sedang berjalan. Fungsi `exec` memiliki banyak variasi seperti `execvp`, `execlp`, dan `execv`. Contoh yang akan digunakan adalah ```execv```. @@ -185,10 +188,10 @@ Contoh yang akan digunakan adalah ```execv```. #include int main () { - + // argv[n] = { {your-program-name}, {argument[1]}, {argument[2]},.....,{argument[n-2]}, NULL } char *argv[4] = {"list", "-l", "/home/", NULL}; - + execv("/bin/ls", argv); printf("This line will not be executed\n"); @@ -211,19 +214,19 @@ int main() { pid_t child_id; child_id = fork(); - + if (child_id < 0) { exit(EXIT_FAILURE); // Jika gagal membuat proses baru, program akan berhenti } if (child_id == 0) { // this is child - + char *argv[] = {"cp", "/var/log/apt/history.log", "/home/[user]/", NULL}; execv("/bin/cp", argv); } else { // this is parent - + char *argv[] = {"cp", "/var/log/dpkg.log", "/home/[user]/", NULL}; execv("/bin/cp", argv); } @@ -256,7 +259,7 @@ Jika ingin melakukan banyak task secara bersamaan tanpa mementingkan urutan kerj ### **wait** x **fork** x **exec** -Kita dapat menjalankan dua proses dalam satu program. Contoh penggunaannya adalah membuat folder dan mengisi folder tersebut dengan suatu file. Pertama, buat folder terlebih dahulu. Kemudian, buat file dengan perintah shell ```touch``` pada folder tersebut. Namun, pada kenyataannya untuk melakukan dua hal bersamaan perlu adanya jeda beberapa saat. +Kita dapat menjalankan dua proses dalam satu program. Contoh penggunaannya adalah membuat folder dan mengisi folder tersebut dengan suatu file. Pertama, buat folder terlebih dahulu. Kemudian, buat file dengan perintah shell ```touch``` pada folder tersebut. Namun, pada kenyataannya untuk melakukan dua hal bersamaan perlu adanya jeda beberapa saat. Untuk membuat file yang berada dalam suatu folder, pertama-tama folder harus ada terlebih dahulu. Untuk _delay_ suatu proses dapat menggunakan _system call_ ```wait```. @@ -271,14 +274,14 @@ int main() { int status; child_id = fork(); - + if (child_id < 0) { exit(EXIT_FAILURE); // Jika gagal membuat proses baru, program akan berhenti } if (child_id == 0) { // this is child - + char *argv[] = {"mkdir", "-p", "folderku", NULL}; execv("/bin/mkdir", argv); } else { @@ -412,6 +415,8 @@ close(STDOUT_FILENO); close(STDERR_FILENO); ``` +File descriptor sendiri merupakan sebuah angka yang merepresentasikan sabuah file yang dibuka di sebuah sistem operasi. File descriptor mendeskripsikan sumber data dan bagaimana data itu diakses. + ### 2.6 Membuat Loop Utama Di loop utama ini lah tempat kita menuliskan inti dari program kita. Jangan lupa beri perintah `sleep()` agar loop berjalan pada suatu interval. @@ -488,22 +493,203 @@ Untuk memeriksa process apa saja yang sedang berlangsung kita dapat menggunakan ### 3.4 Mematikan Daemon process yang sedang berjalan Untuk mematikan daemon process kita akan menggunakan perintah `kill`. Pertama kita harus menemukan PID dari Daemon process yang akan dimatikan. Kita dapat menemukan PID tersebut pada langkah sebelumnya. Lalu jalankan `sudo kill -9 pid` untuk mematikan process-nya. -# Soal Latihan +# Extras -[Daftar Isi](#daftar-isi) +## Directory Listing in C +Dengan bahasa C, kita bisa melihat ada file apa saja yang terdapat dalam suatu directory. Tentu saja hal ini membutuhkan suatu library khusus bernama `dirent.h`. Berikut contoh directory listing di bahasa C : +```c +#include +#include +#include + + +int main (void) +{ + DIR *dp; + struct dirent *ep; + char path[100]; + + printf("Enter path to list files: "); + scanf("%s", path); + + dp = opendir(path); + + if (dp != NULL) + { + while ((ep = readdir (dp))) { + puts (ep->d_name); + } + + (void) closedir (dp); + } else perror ("Couldn't open the directory"); + + return 0; +} +``` + +Kita juga bisa melakukan traverse secara rekursif terhadap suatu directory. Contoh : +```c +#include +#include +#include + +void listFilesRecursively(char *path); -### Latihan 1 -Modifikasi code [soal1](https://github.com/AZakyH/sisop-modul-2/blob/master/soal1.c) agar output nya menjadi angka urut dari 0 sampai 100, tanpa menghapus fungsi yang sudah ada dan menggunakan **wait**. -### Latihan 2 -Buatlah sebuah program yang dapat mengcopy folder beserta semua isi dari folder di */home/{USER}/Music* ke dalam sebuah folder dengan format nama *tanggal-bulan-tahun_jam:menit:detik* (contoh: 25-02-2020_16:37:53). **Gunakan fork, exec, dan wait.** +int main() +{ + char path[100]; -### Latihan 3 -Buatlah sebuah daemon yang berjalan setiap 10 detik yang dapat melakukan backup isi dari file *diary.txt* yang disimpan dalam file *diary.log.{no}* (contoh: diary.log.1 , diary.log.2, … ) lalu menghapus isi *diary.txt* tersebut sehingga file tersebut kosong kembali. **Tidak diperbolehkan menggunakan exec dan system.** + printf("Enter path to list files: "); + scanf("%s", path); + listFilesRecursively(path); + + return 0; +} + +void listFilesRecursively(char *basePath) +{ + char path[1000]; + struct dirent *dp; + DIR *dir = opendir(basePath); + + if (!dir) + return; + + while ((dp = readdir(dir)) != NULL) + { + if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0) + { + printf("%s\n", dp->d_name); + + // Construct new path from our base path + strcpy(path, basePath); + strcat(path, "/"); + strcat(path, dp->d_name); + + listFilesRecursively(path); + } + } + + closedir(dir); +} +``` + +## File Permission in C +Kita bisa melihat permission dari suatu file atau directory di bahasa C dengan library yang bernama `sys/stat.h`. Berikut adalah contoh dari checking permission file dengan bahasa C : +```c +#include +#include +#include + +int main() +{ + struct stat fs; + char filename[100]; + int r; + + printf("Enter path to list files: "); + scanf("%s", filename); + + r = stat(filename,&fs); + if( r==-1 ) + { + fprintf(stderr,"File error\n"); + exit(1); + } + + printf("Obtaining permission mode for '%s':\n",filename); + + /* file permissions are kept in the st_mode member */ + /* The S_ISREG() macro tests for regular files */ + if( S_ISREG(fs.st_mode) ) + puts("Regular file"); + else + puts("Not a regular file"); + + printf("Owner permissions: "); + if( fs.st_mode & S_IRUSR ) + printf("read "); + if( fs.st_mode & S_IWUSR ) + printf("write "); + if( fs.st_mode & S_IXUSR ) + printf("execute"); + putchar('\n'); + + printf("Group permissions: "); + if( fs.st_mode & S_IRGRP ) + printf("read "); + if( fs.st_mode & S_IWGRP ) + printf("write "); + if( fs.st_mode & S_IXGRP ) + printf("execute"); + putchar('\n'); + + printf("Others permissions: "); + if( fs.st_mode & S_IROTH ) + printf("read "); + if( fs.st_mode & S_IWOTH ) + printf("write "); + if( fs.st_mode & S_IXOTH ) + printf("execute"); + putchar('\n'); + + return(0); +} +``` +Untuk variabel dengan prefix `S_...` memiliki suatu aturan seperti file permission di dalam linux. Berikut adalah gambar yang menunjukkan cara penggunaannya : + +![file-permission](img/file-permission.png) + +## File Ownership in C +Kita juga bisa melihat owner dan group dari suatu file dengan bahasa C. Hal ini bisa dilakukan dengan bantuan library `sys/stat.h`, `pwd.h`, dan `grp.h`. Untuk mendapatkan informasi itu, perlu dilakukan 2 langkah yaitu mencari UID dan GID dari suatu file lalu mencari nama dari user dan group dalam user database atau group database. Berikut adalah contoh cara melakukan hal tersebut : +```c +#include +#include +#include +#include +#include + +int main() +{ + struct stat info; + char path[100]; + int r; + + printf("Enter path to list files: "); + scanf("%s", path); + + r = stat(path, &info); + if( r==-1 ) + { + fprintf(stderr,"File error\n"); + exit(1); + } + + struct passwd *pw = getpwuid(info.st_uid); + struct group *gr = getgrgid(info.st_gid); + + if (pw != 0) puts(pw->pw_name); + if (gr != 0) puts(gr->gr_name); +} +``` + +# Soal Latihan + +[Daftar Isi](#daftar-isi) +1. Modifikasi code [soal1.c](soal1.c) agar output nya menjadi angka urut dari 0 sampai 100, tanpa menghapus fungsi yang sudah ada dan menggunakan **wait**. +2. Buatlah sebuah program yang dapat mengcopy folder beserta semua isi dari folder di */home/{USER}/Downloads* ke dalam sebuah folder dengan format nama *tanggal-bulan-tahun_jam:menit:detik* (contoh: 26-03-2021_16:22:09). **Gunakan fork, exec, dan wait**. +3. Buatlah sebuah daemon yang berjalan setiap 10 detik yang dapat melakukan backup isi dari file *error.txt* yang disimpan dalam file *error.log.{no}* (contoh: error.log.1 , error.log.2, … ) lalu menghapus isi *error.txt* tersebut sehingga file tersebut kosong kembali. **Tidak diperbolehkan menggunakan exec dan system.** ## Referensi * https://notes.shichao.io/apue/ch8/ * https://www.geeksforgeeks.org/exec-family-of-functions-in-c/ * http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html * https://www.computerhope.com/unix/uumask.htm +* http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Simple-Directory-Lister.html +* https://codeforwin.org/2018/03/c-program-to-list-all-files-in-a-directory-recursively.html +* https://c-for-dummies.com/blog/?p=4101 +* https://pubs.opengroup.org/onlinepubs/009695399/functions/getgrgid.html +* https://pubs.opengroup.org/onlinepubs/009695399/functions/getgrgid.html +* https://pubs.opengroup.org/onlinepubs/009695399/functions/getpwuid.html \ No newline at end of file diff --git a/Modul2/img/file-permission.png b/Modul2/img/file-permission.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc9cce70f45cba6c26cc096af404a4f9fba8af9 GIT binary patch literal 20356 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 literal 0 HcmV?d00001 diff --git a/Modul3/README - English.md b/Modul3/README - English.md new file mode 100644 index 0000000..90daa85 --- /dev/null +++ b/Modul3/README - English.md @@ -0,0 +1,807 @@ +# Thread and IPC + +## Objectives +1. To develop knowledge about thread +2. To understand how thread works +3. To understand how to make thread + +- [Thread dan IPC](#thread-dan-ipc) + - [Objectives](#objectives) + - [1. Thread](#1-thread) + - [1.1 Thread](#11-thread) + - [1.2 Multiprocess Vs Multithread](#12-multiprocess-vs-multithread) + - [1.3 Join Thread](#13-join-thread) + - [1.4 Mutual Exclusion](#14-mutual-exclusion) + - [2. IPC (Interprocess Communication)](#2-ipc-interprocess-communication) + - [2.1 IPC](#21-ipc) + - [2.2 Pipes](#22-pipes) + - [2.3 Sockets](#23-sockets) + - [2.4 Message Queues](#24-message-queues) + - [2.5 Semaphores](#25-semaphores) + - [2.6 Shared Memory](#26-shared-memory) + - [Appendix](#appendix) + - [Libraries documentation (and functions)](#libraries-documentation-and-functions) + - [Soal Latihan](#soal-latihan) + - [References](#references) + + +## 1. Thread +### 1.1 Thread +Thread is smallest unit in a process that are scheduled by the operating system. Thread are usually made by `fork` that runs in a script or program. There is at least 1 thread running for each process, but you can also have multiple thread run for one process. Thread will share their memory and use information (value) of variables in that process. You can picture thread as follows. + +![thread](img/thread2.png) + +To see running thread, we can use the command : +```bash +top -H +``` + +Thread can be made by calling a function in C Language : +```c +#include //library thread + +int pthread_create(pthread_t *restrict tidp, + const pthread_attr_t *restrict attr, + void *(*start_rtn)(void *), + void *restrict arg); + +/* If thread creation succeeds it will return 0, otherwise it will return 1 */ +``` +Syntax: +- Pointer `tidp` points to memory address with thread id of the new thread. +- Argumen `attr` is used to pass attributes of the thread. the value `attr` is set to `NULL` when the thread uses the *default* attribute . +- The new thread will start on the `start_rtn` function. +- Pointer `arg` is used to pass any argument to the `start_rtn` function, if no argument is needed, then `arg` is set to `NULL`. + +Example of a program not using thread [playtanpathread.c](playtanpathread.c): + +```c +#include +#include +#include +#include +#include + +int main() +{ + pid_t child; + int i, stat; + char *argv1[] = {"clear", NULL}; + char *argv2[] = {"xlogo", NULL}; + child = fork(); + if (child==0) { + execv("/usr/bin/clear", argv1); + } + else + { + for(i=0;i<6;i++) + { + printf("%d\n",i); + fflush(stdout); + sleep(1); + } + execv("/usr/bin/xlogo", argv2); + } + +} + +``` + +Example f a program using thread [playthread.c](playthread.c) : +> use this command to compile : `gcc -pthread -o [output] input.c` + +```c +#include +#include +#include +#include +#include +#include +#include + +pthread_t tid[3]; //array initialization to save the threads, there are 2 in this case +pid_t child; + +int length=5; //Loop length initialization +void* playandcount(void *arg) +{ + char *argv1[] = {"clear", NULL}; + char *argv2[] = {"xlogo", NULL}; + unsigned long i=0; + pthread_t id=pthread_self(); + int iter; + if(pthread_equal(id,tid[0])) //Thread to clear the screen + { + child = fork(); + if (child==0) { + execv("/usr/bin/clear", argv1); + } + } + else if(pthread_equal(id,tid[1])) // Thread to show a counter + { + for(iter=0;iter<6;iter++) + { + printf("%d\n",iter); + fflush(stdout); + sleep(1); + } + } + else if(pthread_equal(id,tid[2])) // Thread to show an image + { + child = fork(); + if (child==0) { + execv("/usr/bin/xlogo", argv2); + } + } + + return NULL; +} + +int main(void) +{ + int i=0; + int err; + while(i<3) // loop all threads + { + err=pthread_create(&(tid[i]),NULL,&playandcount,NULL); //making a thread + if(err!=0) //error check + { + printf("\n can't create thread : [%s]",strerror(err)); + } + else + { + printf("\n create thread success\n"); + } + i++; + } + pthread_join(tid[0],NULL); + pthread_join(tid[1],NULL); + exit(0); + return 0; +} + + +``` + +**Conclusion** : +It is shown that the use of thread allows two task to run simultaneously (image task and counter task). + + +### 1.2 Multiprocess Vs Multithread + +![multivsmulti](multiprocessing_multithreading.gif) + +The differences between multiprocess and multithread +No | Multiprocess | Multithread +--- | --- | --- +1 | multiple process executed concurently | multiple thread in 1 process executed concurently +2 | using more CPU to improve computation power | making multiple thread in a process to improve computation power +3 | the creation process used a lot of time and resources | the thread creation used less time and resources +4 | dependency on other object in the memory to send data to other process| no dependency to other object +5 | most child process is interruptible / killable | multithreading is not interruptible / killable + + + + +### 1.3 Join Thread +Join thread is a function to join other threads that have stopped (*terminated*). If the thread that you want to join has not been stopped, this function will wait until the desired thread has a status of **`Terminated`**. The `pthread_join ()` function can be said to be the `wait ()` function of the process, because the main program (*task*) will wait for the thread to be joined in the main program. We do not know wether the main program or thread that completed the work first. + +Example C program Join_Thread [thread_join.c](thread_join.c): + +```c +#include +#include +#include //library thread + +void *print_message_function( void *ptr ); + +int main() +{ + pthread_t thread1, thread2;//initial initialization + + const char *message1 = "Thread 1"; + const char *message2 = "Thread 2"; + int iret1, iret2; + + iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1); //making the first thread + if(iret1) //if error + { + fprintf(stderr,"Error - pthread_create() return code: %d\n",iret1); + exit(EXIT_FAILURE); + } + + + iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);//making the second thread + if(iret2)//if it fails + { + fprintf(stderr,"Error - pthread_create() return code: %d\n",iret2); + exit(EXIT_FAILURE); + } + + printf("pthread_create() for thread 1 returns: %d\n",iret1); + printf("pthread_create() for thread 2 returns: %d\n",iret2); + + // pthread_join( thread1, NULL); + // pthread_join( thread2, NULL); + + exit(EXIT_SUCCESS); +} + +void *print_message_function( void *ptr ) +{ + char *message; + message = (char *) ptr; + printf("%s \n", message); + + for(int i=0;i<10;i++){ + printf("%s %d \n", message, i); + } +} + +``` + +Explanation : +- In the above program, if we *comment* the line `pthread_join`, the result will not show the words **Thread 1** and **Thread 2**. +- If the `pthread_join` function call is uncommented, then the program we create will display the words **Thread 1** and **Thread 2**. + +**Conclusion** : +The first program does not run the `print_message_function` function because before the second thread is scheduled, the main program (possibly) has finished executing so it doesn't run the default function on the thread. In the second experiment, the `pthread_join ()` function is used to make the main program wait for the thread to *join* until the target thread has finished executing, with this function the main program is suspended until the target thread has finished executing. +- Function for thread termination + + ```c + #include + void pthread_exit(void *rval_ptr); + ``` + The `rval_ptr` argument is a pointer that can be accessed by the `pthread_join ()` function in order to know the status of the thread + +- Function to join thread + ```c + int pthread_join(pthread_t thread, void **rval_ptr); + /* If successful returns value 0, if error returns value 1 */ + ``` + The function will pause the job until the `rval_ptr` pointer state of the` pthread_exit () `function returns its value. + +### 1.4 Mutual Exclusion +Also known as ** Mutex **, which is a way to ensure that if a job that uses variables or files is also used by another job, the other job will output the value of the previous job. + +Example of Simple Mutual_Exclusion program [threadmutex.c](threadmutex.c): + +```c +#include +#include +#include +#include +#include + +pthread_t tid1, tid2; +int status; + +int number; + +void* write(void *arg) +{ + status = 0; + + printf("Input number : "); + scanf("%d", &number); + + status = 1; + + return NULL; +} + +void* read(void *arg) +{ + while(status != 1) + { + + } + + printf("Number %d\n", number); + +} + +int main(void) +{ + pthread_create(&(tid1), NULL, write, NULL); + pthread_create(&(tid2), NULL, read, NULL); + + pthread_join(tid1, NULL); + pthread_join(tid2, NULL); + + return 0; +} + +``` + + +Explanation : +- There are 2 threads running with different functions. +- The resources (variables) that both threads use to execute their jobs **are the same**. +- The `status` variable is a simple example of controlling the running of a thread. + +**Conclusion** : +Since we don't know which *thread* executes a variable or resource in the program first, the purpose of **Mutex** is to keep the resources of a thread from being used by other threads before it finishes its work. + +## 2. IPC (Interprocess Communication) +### 2.1 IPC +IPC (*Interprocess Communication*) is a method to exchange data between one process and another, either on the same computer or remote computers connected through a network. + +### 2.2 Pipes +Pipes are a sequential method of communication between interrelated processes. The weakness of pipes is that they are only for interconnected, sequential processes. +There are two types of pipes: +- unnamed pipe: Communication between parent and child processes. +- named pipes: Commonly referred to as FIFO, used for communication that runs independently. **Can only be used if both processes are using the same *filesystem*** + +``` +$ ls | less +``` +Diagram : + +![alt](img/pipe.png "Diagram Pipe") + +Syntax in C languange : +``` +int pipe(int fds[2]); + +Parameters : +fd[0] will be the fd(file descriptor) for the +read end of pipe. +fd[1] will be the fd for the write end of pipe. +Returns : 0 on Success. +-1 on error. +``` +Example : +[pipe1.c](pipe1.c) + +```c +// C program to illustrate +// pipe system call in C +#include +#include +#include + +#define MSGSIZE 16 +char* msg1 = "hello, world #1"; +char* msg2 = "hello, world #2"; +char* msg3 = "hello, world #3"; + +int main() +{ + char inbuf[MSGSIZE]; + int p[2], i; + + if (pipe(p) < 0) + exit(1); + + /* continued */ + /* write pipe */ + + write(p[1], msg1, MSGSIZE); + write(p[1], msg2, MSGSIZE); + write(p[1], msg3, MSGSIZE); + + for (i = 0; i < 3; i++) { + /* read pipe */ + read(p[0], inbuf, MSGSIZE); + printf("%s\n", inbuf); + } + return 0; +} + +``` +Output : +``` +hello, world #1 +hello, world #2 +hello, world #3 +``` + +Pipe with fork + +Diagram : +![alt](img/pipe-fork.png) + +Example : +[pipe-fork](pipe-fork.c) +```c +// C program to demonstrate use of fork() and pipe() +#include +#include +#include +#include +#include +#include + +int main() +{ + // We use two pipes + // First pipe to send input string from parent + // Second pipe to send concatenated string from child + + int fd1[2]; // Used to store two ends of first pipe + int fd2[2]; // Used to store two ends of second pipe + + char fixed_str[] = "forgeeks.org"; + char input_str[100]; + pid_t p; + + if (pipe(fd1)==-1) + { + fprintf(stderr, "Pipe Failed" ); + return 1; + } + if (pipe(fd2)==-1) + { + fprintf(stderr, "Pipe Failed" ); + return 1; + } + + scanf("%s", input_str); + p = fork(); + + if (p < 0) + { + fprintf(stderr, "fork Failed" ); + return 1; + } + + // Parent process + else if (p > 0) + { + char concat_str[100]; + + close(fd1[0]); // Close reading end of first pipe + + // Write input string and close writing end of first + // pipe. + write(fd1[1], input_str, strlen(input_str)+1); + close(fd1[1]); + + // Wait for child to send a string + wait(NULL); + + close(fd2[1]); // Close writing end of second pipe + + // Read string from child, print it and close + // reading end. + read(fd2[0], concat_str, 100); + printf("Concatenated string %s\n", concat_str); + close(fd2[0]); + } + + // child process + else + { + close(fd1[1]); // Close writing end of first pipe + + // Read a string using first pipe + char concat_str[100]; + read(fd1[0], concat_str, 100); + + // Concatenate a fixed string with it + int k = strlen(concat_str); + int i; + for (i=0; i +#include +#include +#include +#include +#include +#define PORT 8080 + +int main(int argc, char const *argv[]) { + int server_fd, new_socket, valread; + struct sockaddr_in address; + int opt = 1; + int addrlen = sizeof(address); + char buffer[1024] = {0}; + char *hello = "Hello from server"; + + if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + + if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { + perror("setsockopt"); + exit(EXIT_FAILURE); + } + + address.sin_family = AF_INET; + address.sin_addr.s_addr = INADDR_ANY; + address.sin_port = htons( PORT ); + + if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { + perror("bind failed"); + exit(EXIT_FAILURE); + } + + if (listen(server_fd, 3) < 0) { + perror("listen"); + exit(EXIT_FAILURE); + } + + if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) { + perror("accept"); + exit(EXIT_FAILURE); + } + + valread = read( new_socket , buffer, 1024); + printf("%s\n",buffer ); + send(new_socket , hello , strlen(hello) , 0 ); + printf("Hello message sent\n"); + return 0; +} +``` +Client +```c +#include +#include +#include +#include +#include +#include +#include +#define PORT 8080 + +int main(int argc, char const *argv[]) { + struct sockaddr_in address; + int sock = 0, valread; + struct sockaddr_in serv_addr; + char *hello = "Hello from client"; + char buffer[1024] = {0}; + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + printf("\n Socket creation error \n"); + return -1; + } + + memset(&serv_addr, '0', sizeof(serv_addr)); + + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(PORT); + + if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) { + printf("\nInvalid address/ Address not supported \n"); + return -1; + } + + if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { + printf("\nConnection Failed \n"); + return -1; + } + + send(sock , hello , strlen(hello) , 0 ); + printf("Hello message sent\n"); + valread = read( sock , buffer, 1024); + printf("%s\n",buffer ); + return 0; +} +``` + +Run the server process then run the client. Observe. + +### 2.4 Message Queues +Is a communication between processes where the process creates an internal linked-list at the address of the Operating System kernel. The message is referred to as *queue* while the identifier is called *queue* ID. *Queue* ID is used as a *key* to indicate which message will be sent and the destination of the message. + +### 2.5 Semaphores +Semaphores are different from other types of IPC. In its application, semaphore is a counter that is used for controlling resources by several processes simultaneously. +- If a memory block counter has a positive value, the semaphore can consume resources for the process, and reduce the counter block value by 1 to indicate that a memory block is being used. +- Conversely, if the semaphore is 0, the process will go into sleep mode until the semaphore is greater than 0. + +### 2.6 Shared Memory +A mechanism for mapping the area (segments) of a block of memory to be shared by several processes. A process will create a memory segment, then other permitted processes can access that memory. Shared memory is an effective way to exchange data between programs. + +Example: [Proses 1](proses1.c) [Proses 2](proses2.c) + +Process 1 +```c +#include +#include +#include +#include + +void main() +{ + key_t key = 1234; + int *value; + + int shmid = shmget(key, sizeof(int), IPC_CREAT | 0666); + value = shmat(shmid, NULL, 0); + + *value = 10; + + printf("Program 1 : %d\n", *value); + + sleep(5); + + printf("Program 1: %d\n", *value); + shmdt(value); + shmctl(shmid, IPC_RMID, NULL); +} +``` +Process 2 +```c +#include +#include +#include +#include + +void main() +{ + key_t key = 1234; + int *value; + + int shmid = shmget(key, sizeof(int), IPC_CREAT | 0666); + value = shmat(shmid, NULL, 0); + + printf("Program 1 : %d\n", *value); + *value = 30; + + sleep(5); + + printf("Program 1: %d\n", *value); + shmdt(value); + shmctl(shmid, IPC_RMID, NULL); +} +``` +Run process 1 first, then process 2. +The result +Process 1 +``` +Program 1 : 10 +Program 1 : 30 +``` +Process 2 +``` +Program 1 : 10 +Program 1 : 30 +``` + +## 3. Asynchronous Programming +We already know how to use thread and process commands separately and simultaneously. Next, we will learn how a process receives a command without being blocked by another process. This is where we will learn about Asynchronous Programming where we don't have to wait for something too long and we let other tasks be done by other processor cores. Here are some commands that can be used to implement Asynchronous Programming in C. + +### 3.1 select +Select gives us the ability to monitor a large number of sockets, and each socket is not blocked by any other sockets. Maybe we can use threads, but if the number of sockets is very large like 1024, having 1024 threads is not the right solution and using select will make the job easier. + +`select()` function +```c +int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); + +struct timeval { + long int tv_sec; /* Value in seconds */ + long int tv_usec; /* Value in milli-seconds */ +}; +``` + +Explanation of the parameters used : +- nfds : The highest number of file descriptors + 1, we can use `FD_SETSIZE` which contains the number 1024 +- readfds : File descriptor for reading +- writefds : File descriptor for writing +- exceptfds : File descriptor for exception +- timeout : Time until timeout + +Examples of use can be seen at [server File](select-server.c) and [client file](select-client.c) in the module. Do as in [Section 2.3 Sockets](#23-sockets) for testing. + +### 3.2 poll +`poll ()` does the same thing as `select ()` which waits for one of the file descriptors to be ready to perform the operation. But `poll ()` was created to solve the pending problems that `select ()` has + +`poll()` function +```c +#include + +int poll(struct pollfd *fds, int nfds, int timeout); + +struct pollfd { + int fd; /* file descriptor */ + short events; /* requested events */ + short revents; /* returned events */ +}; +``` + +Explanation of the parameters used : +- fds : Array dari file descriptor +- nfds : Jumlah file descriptor +- timeout : Timeout untuk program +- events & revents : Bisa membaca sumber yang ada di referensi karena cukup banyak dan beragam +- fds: An array of file descriptors +- nfds: Number of file descriptors +- timeout: Time until timeout +- events & revents: For a more complete explanation, you can read the reference source because it is quite diverse + +Examples of usage can be seen in the [server file](poll-server.c) and [client file](poll-client.c) in the module. Do as in [Section 2.3 Sockets](#23-sockets) for testing. + +### 3.3 epoll +`epoll` is a variant of` poll() `which scales well for a large number of file descriptors. Three system calls are provided to set up and control epoll set: `epoll_create()`, `epoll_ctl()`, `epoll_wait()`. + +Functions for `epoll` +```c +int epoll_create(int size); // creates an epoll() instance + +int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); // performs control operations on the epoll() instance referred to by the file descriptor epfd. + +int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); // waits for events on the epoll() instance referred to by the file descriptor epfd + +typedef union epoll_data { + void *ptr; + int fd; + uint32_t u32; + uint64_t u64; +} epoll_data_t; + +struct epoll_event { + uint32_t events; /* Epoll events */ + epoll_data_t data; /* User data variable */ +}; +``` + +Examples of usage can be seen in the [server file](epoll-server.c) and [client file](epoll-client.c) in the module. Do as in [Section 2.3 Sockets](#23-sockets) for testing. + +## Appendix +### Libraries documentation (and functions) +``` +$ man {anything-you-want-to-know} +$ man mkfifo +$ man fcntl +``` + +## Exercise +1. Create a C program that can calculate factorials in parallel and then display the results sequentially. +Contoh: +```bash +## input +./faktorial 5 3 4 +``` +```bash +### output +3! = 6 +4! = 24 +5! = 120 +``` + +2. Create a program to display files in the third order of a directory, using the pipe and the command ls, head, and tail. + +3. Create a program using a socket which consists of the client and server. When the client types "add" then the number on the server increases by 1 and the server automatically sends a message to the client that says "The addition was successful" and when typing the command "subtract" then the number on the server decreases by 1 and the server automatically sends a message to client containing "Subtraction was successful". Another command on the client is "check", then the server will send a message containing the most recent number, other than that command the server will send a message "command does not match". This program can run without stopping. (The initial value of the number on the server is 5). + +### References +- https://notes.shichao.io/apue/ +- https://www.gta.ufrj.br/ensino/eel878/sockets/index.html +- http://advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdf +- https://www.geeksforgeeks.org/socket-programming-cc/ +- https://www.geeksforgeeks.org/pipe-system-call/ +- https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Concepts +- http://codingbison.com/c/c-sockets-select.html +- https://www.tutorialspoint.com/unix_system_calls/poll.htm +- https://pubs.opengroup.org/onlinepubs/009696799/functions/poll.html +- https://linux.die.net/man/4/epoll +- https://programmer.ink/think/epoll-for-linux-programming.html diff --git a/Modul3/README.md b/Modul3/README.md index 3ebaaad..dba3184 100644 --- a/Modul3/README.md +++ b/Modul3/README.md @@ -9,7 +9,7 @@ - [Objectives](#objectives) - [1. Thread](#1-thread) - [1.1 Thread](#11-thread) - - [1.2 Multiprocess vs Multithread](#12-multiprocess-vs-multithread) + - [1.2 Multiprocess Vs Multithread](#12-multiprocess-vs-multithread) - [1.3 Join Thread](#13-join-thread) - [1.4 Mutual Exclusion](#14-mutual-exclusion) - [2. IPC (Interprocess Communication)](#2-ipc-interprocess-communication) @@ -19,18 +19,19 @@ - [2.4 Message Queues](#24-message-queues) - [2.5 Semaphores](#25-semaphores) - [2.6 Shared Memory](#26-shared-memory) + - [3. Asynchronous Programming](#3-asynchronous-programming) + - [3.1 select](#31-select) + - [3.2 poll](#32-poll) + - [3.3 epoll](#33-epoll) - [Appendix](#appendix) - [Libraries documentation (and functions)](#libraries-documentation-and-functions) - [Soal Latihan](#soal-latihan) - - [Latihan 1](#latihan-1) - - [Latihan 2](#latihan-2) - - [Latihan 3](#latihan-3) - [References](#references) ## 1. Thread ### 1.1 Thread -Thread merupakan unit terkecil dalam suatu proses yang dapat dijadwalkan oleh sistem operasi. Thread biasanya terbentuk oleh `fork` yang berjalan pada suatu script atau program untuk sebuah proses. Minimal terdapat sebuah thread yang berjalan dalam suatu proses, walau biasanya terdapat lebih dari satu thread dalam proses tersebut. Thread akan berbagi memori dan menggunakan informasi (nilai) dari variabel-variabel pada suatu proses tersebut. Penggambaran thread pada sebuah proses dapat dilihat sebagai berikut. +Thread merupakan unit terkecil dalam suatu proses yang dapat dijadwalkan oleh sistem operasi. Thread juga sering disebut sebagai Lightweight Processes. Thread biasanya terbentuk oleh `fork` yang berjalan pada suatu script atau program untuk sebuah proses. Minimal terdapat sebuah thread yang berjalan dalam suatu proses, walau biasanya terdapat lebih dari satu thread dalam proses tersebut. Thread akan berbagi memori dan menggunakan informasi (nilai) dari variabel-variabel pada suatu proses tersebut. Penggambaran thread pada sebuah proses dapat dilihat sebagai berikut. ![thread](img/thread2.png) @@ -682,6 +683,83 @@ Program 1 : 10 Program 1 : 30 ``` +## 3. Asynchronous Programming + +Kita sudah mengenal bagaimana cara menggunakan thread dan memproses perintah secara terpisah-pisah dan bersamaan. Di tingkatan selanjutnya, kita akan belajar bagaimana suatu proses menerima suatu perintah tanpa terblok oleh proses yang lain. Disinilah kita akan belajar tentang Asynchronous Programming dimana kita tidak perlu menunggu sesuatu terlalu lama dan kita membiarkan tugas lainnya dikerjakan oleh core processor yang lain. Berikut adalah beberapa perintah yang bisa digunakan untuk menerapkan Asynchronous Programming di C. + +### 3.1 select + +Select memberikan kita kemampuan untuk memonitor jumlah socket yang cukup besar, dan tiap socket tidak terblok oleh socket yang lain. Mungkin kita bisa mengakali menggunakan thread, hanya saja jika jumlah socket sangat besar seperti 1024, memiliki 1024 thread bukanlah solusi yang tepat dan penggunaan select akan lebih memudahkan pekerjaan. + +Fungsi select() +```c +int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); + +struct timeval { + long int tv_sec; /* Value in seconds */ + long int tv_usec; /* Value in milli-seconds */ +}; +``` + +Penjelasan untuk parameter yang digunakan : +- nfds : Jumlah file descriptor tertinggi + 1, bisa menggunakan `FD_SETSIZE` yang berisi angka 1024 +- readfds : File descriptor untuk pembacaan +- writefds : File descriptor untuk penulisan +- exceptfds : File descriptor untuk exception +- timeout : Timeout jika aplikasi menginginkan ada timeout + +Contoh penggunaan dapat dilihat pada [file server](select-server.c) dan [file client](select-client.c) yang ada pada modul. Lakukan seperti di [Subbab 2.3 Sockets](#23-sockets) untuk testing. + +### 3.2 poll +`poll()` sendiri melakukan sesuatu yang sama dengan `select()` yaitu menunggu salah satu dari file descriptor untuk siap melakukan operasi. Tetapi `poll()` sendiri diciptakan untuk mengatasi permasalahan pending yang dimiliki oleh `select()` + +Fungsi `poll()` +```c +#include + +int poll(struct pollfd *fds, int nfds, int timeout); + +struct pollfd { + int fd; /* file descriptor */ + short events; /* requested events */ + short revents; /* returned events */ +}; +``` + +Penjelasan Parameter : +- fds : Array dari file descriptor +- nfds : Jumlah file descriptor +- timeout : Timeout untuk program +- events & revents : Bisa membaca sumber yang ada di referensi karena cukup banyak dan beragam + +Contoh penggunaan dapat dilihat pada [file server](poll-server.c) dan [file client](poll-client.c) yang ada pada modul. Lakukan seperti di [Subbab 2.3 Sockets](#23-sockets) untuk testing. + +### 3.3 epoll +`epoll` adalah varian dari `poll()` yang bisa memperbesar skala dengan baik untuk jumlah file descriptor yang besar. 3 system call disediakan untuk set up dan mengkontrol epoll set : `epoll_create()`, `epoll_ctl()`, `epoll_wait()`. + +Fungsi-fungsi untuk `epoll` +```c +int epoll_create(int size); // creates an epoll() instance + +int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); // performs control operations on the epoll() instance referred to by the file descriptor epfd. + +int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout); // waits for events on the epoll() instance referred to by the file descriptor epfd + +typedef union epoll_data { + void *ptr; + int fd; + uint32_t u32; + uint64_t u64; +} epoll_data_t; + +struct epoll_event { + uint32_t events; /* Epoll events */ + epoll_data_t data; /* User data variable */ +}; +``` + +Contoh penggunaan dapat dilihat pada [file server](epoll-server.c) dan [file client](epoll-client.c) yang ada pada modul. Lakukan seperti di [Subbab 2.3 Sockets](#23-sockets) untuk testing. + ## Appendix ### Libraries documentation (and functions) ``` @@ -691,24 +769,32 @@ $ man fcntl ``` ## Soal Latihan +1. Buatlah program C yang bisa menghitung faktorial secara parallel lalu menampilkan hasilnya secara berurutan. +Contoh: +```bash +## input +./faktorial 5 3 4 +``` +```bash +### output +3! = 6 +4! = 24 +5! = 120 +``` -#### Latihan 1 -Buatlah sebuah program multithreading untuk menghitung perkalian matriks (isi dari matriks-nya didefinisikan di dalam kodingan). -(Contoh : matriks A dengan dimensi 3x2 dan matriks B dengan dimensi 2x3, outputnya adalah hasil dari perkalian matriks A * B) - -#### Latihan 2 -Buatlah sebuah program menggunakan socket dimana terdiri dari client dan server. Saat client mengetikkan "tambah" maka suatu angka yang ada pada server bertambah 1 dan server otomatis mengirimkan pesan ke client yang berisi "Penambahan berhasil". Perintah yang lainnya pada client adalah "cek", maka server akan mengirimkan pesan yang berisi jumlah terkini angka tersebut. Program ini dapat berjalan tanpa henti. +2. Buatlah sebuah program untuk menampilkan file pada urutan ketiga dari sebuah direktori, dengan menggunakan pipe dan command ls, head, tail. -#### Latihan 3 -Buatlah sebuah program untuk menampilkan file diurutan ketiga dari sebuah direktori. Dengan ketentuan : -- menggunakan pipe. -- menggunakan command ls, head, tail. - +3. Buatlah sebuah program menggunakan socket dimana terdiri dari client dan server. Saat client mengetikkan "tambah" maka suatu angka yang ada pada server bertambah 1 dan server otomatis mengirimkan pesan ke client yang berisi "Penambahan berhasil" dan ketika mengetikan perintah “kurang” maka suatu angka yang ada pada server berkurang 1 dan server otomatis mengirimkan pesan ke client yang berisi "Pengurangan berhasil". Perintah yang lainnya pada client adalah "cek", maka server akan mengirimkan pesan yang berisi jumlah terkini angka tersebut, selain perintah tersebut server akan mengirimkan pesan “command tidak sesuai”. Program ini dapat berjalan tanpa henti. (Nilai awal angka pada server adalah 5). ### References -https://notes.shichao.io/apue/ -https://www.gta.ufrj.br/ensino/eel878/sockets/index.html -http://advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdf -https://www.geeksforgeeks.org/socket-programming-cc/ -https://www.geeksforgeeks.org/pipe-system-call/ - +- https://notes.shichao.io/apue/ +- https://www.gta.ufrj.br/ensino/eel878/sockets/index.html +- http://advancedlinuxprogramming.com/alp-folder/alp-ch05-ipc.pdf +- https://www.geeksforgeeks.org/socket-programming-cc/ +- https://www.geeksforgeeks.org/pipe-system-call/ +- https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Concepts +- http://codingbison.com/c/c-sockets-select.html +- https://www.tutorialspoint.com/unix_system_calls/poll.htm +- https://pubs.opengroup.org/onlinepubs/009696799/functions/poll.html +- https://linux.die.net/man/4/epoll +- https://programmer.ink/think/epoll-for-linux-programming.html diff --git a/Modul3/epoll-client.c b/Modul3/epoll-client.c new file mode 100644 index 0000000..11eabad --- /dev/null +++ b/Modul3/epoll-client.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +int main () { + struct sockaddr_in saddr; + int fd, ret_val; + struct hostent *local_host; /* need netdb.h for this */ + char message[50]; + + /* Step1: create a TCP socket */ + fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (fd == -1) { + fprintf(stderr, "socket failed [%s]\n", strerror(errno)); + return -1; + } + printf("Created a socket with fd: %d\n", fd); + + /* Let us initialize the server address structure */ + saddr.sin_family = AF_INET; + saddr.sin_port = htons(7000); + local_host = gethostbyname("127.0.0.1"); + saddr.sin_addr = *((struct in_addr *)local_host->h_addr); + + /* Step2: connect to the TCP server socket */ + ret_val = connect(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); + if (ret_val == -1) { + fprintf(stderr, "connect failed [%s]\n", strerror(errno)); + close(fd); + return -1; + } + + while (1) + { + /* Next step: send some data */ + gets(message); + ret_val = send(fd,message, sizeof(message), 0); + printf("Successfully sent data (len %d bytes): %s\n", + ret_val, message); + ret_val = recv(fd, message, sizeof(message), 0); + puts(message); + } + + /* Last step: close the socket */ + close(fd); + return 0; +} \ No newline at end of file diff --git a/Modul3/epoll-server.c b/Modul3/epoll-server.c new file mode 100644 index 0000000..251ad32 --- /dev/null +++ b/Modul3/epoll-server.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include +#include + +#define DATA_BUFFER 5000 +#define MAX_CONNECTIONS 10 +#define SUCCESS_MESSAGE "Your message delivered successfully" + +int create_tcp_server_socket() { + struct sockaddr_in saddr; + int fd, ret_val; + + /* Step1: create a TCP socket */ + fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (fd == -1) { + fprintf(stderr, "socket failed [%s]\n", strerror(errno)); + return -1; + } + printf("Created a socket with fd: %d\n", fd); + + /* Initialize the socket address structure */ + saddr.sin_family = AF_INET; + saddr.sin_port = htons(7000); + saddr.sin_addr.s_addr = INADDR_ANY; + + /* Step2: bind the socket to port 7000 on the local host */ + ret_val = bind(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); + if (ret_val != 0) { + fprintf(stderr, "bind failed [%s]\n", strerror(errno)); + close(fd); + return -1; + } + + /* Step3: listen for incoming connections */ + ret_val = listen(fd, 5); + if (ret_val != 0) { + fprintf(stderr, "listen failed [%s]\n", strerror(errno)); + close(fd); + return -1; + } + + return fd; +} + +void setup_epoll_connection(int epfd, int fd, struct epoll_event * event) { + event->events = EPOLLIN; + event->data.fd = fd; + + epoll_ctl(epfd, EPOLL_CTL_ADD, fd, event); +} + +int main () { + struct sockaddr_in new_addr; + int server_fd, new_fd, ret_val, temp_fd, i, timeout_msecs = 100; + socklen_t addrlen; + char buf[DATA_BUFFER]; + struct epoll_event all_connections[MAX_CONNECTIONS], epoll_temp; + int epfd = epoll_create(1); + + /* Get the socket server fd */ + server_fd = create_tcp_server_socket(); + + if (server_fd == -1) { + fprintf(stderr, "Failed to create a server\n"); + return -1; + } + + setup_epoll_connection(epfd, server_fd, &epoll_temp); + + while (1) { + ret_val = epoll_wait(epfd, all_connections, MAX_CONNECTIONS, timeout_msecs /*timeout*/ ); + + for (int i = 0; i < ret_val; i++) + { + if (all_connections[i].data.fd == server_fd) { + new_fd = accept(server_fd, (struct sockaddr*)&new_addr, &addrlen); + + if (new_fd >= 0) { + setup_epoll_connection(epfd, new_fd, &epoll_temp); + printf("Accepted a new connection with fd: %d\n", new_fd); + } else { + fprintf(stderr, "accept failed [%s]\n", strerror(errno)); + } + } else if (all_connections[i].events & EPOLLIN) { + if ( (temp_fd = all_connections[i].data.fd) < 0) continue; + + ret_val = recv(all_connections[i].data.fd, buf, DATA_BUFFER, 0); + + if (ret_val > 0) { + printf("Returned fd is %d [index, i: %d]\n", all_connections[i].data.fd, i); + printf("Received data (len %d bytes, fd: %d): %s\n", ret_val, all_connections[i].data.fd, buf); + ret_val = send(all_connections[i].data.fd, SUCCESS_MESSAGE, sizeof(SUCCESS_MESSAGE), 0); + } + } + } + } /* while(1) */ + + /* Last step: Close all the sockets */ + for (i=0;i < MAX_CONNECTIONS;i++) { + if (all_connections[i].data.fd > 0) { + close(all_connections[i].data.fd); + } + } + return 0; +} \ No newline at end of file diff --git a/Modul3/poll-client.c b/Modul3/poll-client.c new file mode 100644 index 0000000..11eabad --- /dev/null +++ b/Modul3/poll-client.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +int main () { + struct sockaddr_in saddr; + int fd, ret_val; + struct hostent *local_host; /* need netdb.h for this */ + char message[50]; + + /* Step1: create a TCP socket */ + fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (fd == -1) { + fprintf(stderr, "socket failed [%s]\n", strerror(errno)); + return -1; + } + printf("Created a socket with fd: %d\n", fd); + + /* Let us initialize the server address structure */ + saddr.sin_family = AF_INET; + saddr.sin_port = htons(7000); + local_host = gethostbyname("127.0.0.1"); + saddr.sin_addr = *((struct in_addr *)local_host->h_addr); + + /* Step2: connect to the TCP server socket */ + ret_val = connect(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); + if (ret_val == -1) { + fprintf(stderr, "connect failed [%s]\n", strerror(errno)); + close(fd); + return -1; + } + + while (1) + { + /* Next step: send some data */ + gets(message); + ret_val = send(fd,message, sizeof(message), 0); + printf("Successfully sent data (len %d bytes): %s\n", + ret_val, message); + ret_val = recv(fd, message, sizeof(message), 0); + puts(message); + } + + /* Last step: close the socket */ + close(fd); + return 0; +} \ No newline at end of file diff --git a/Modul3/poll-server.c b/Modul3/poll-server.c new file mode 100644 index 0000000..37ab4ac --- /dev/null +++ b/Modul3/poll-server.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include +#include + +#define DATA_BUFFER 5000 +#define MAX_CONNECTIONS 10 +#define SUCCESS_MESSAGE "Your message delivered successfully" + +int create_tcp_server_socket() { + struct sockaddr_in saddr; + int fd, ret_val; + + /* Step1: create a TCP socket */ + fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (fd == -1) { + fprintf(stderr, "socket failed [%s]\n", strerror(errno)); + return -1; + } + printf("Created a socket with fd: %d\n", fd); + + /* Initialize the socket address structure */ + saddr.sin_family = AF_INET; + saddr.sin_port = htons(7000); + saddr.sin_addr.s_addr = INADDR_ANY; + + /* Step2: bind the socket to port 7000 on the local host */ + ret_val = bind(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); + if (ret_val != 0) { + fprintf(stderr, "bind failed [%s]\n", strerror(errno)); + close(fd); + return -1; + } + + /* Step3: listen for incoming connections */ + ret_val = listen(fd, 5); + if (ret_val != 0) { + fprintf(stderr, "listen failed [%s]\n", strerror(errno)); + close(fd); + return -1; + } + return fd; +} + +int main () { + fd_set read_fd_set; + struct sockaddr_in new_addr; + int server_fd, new_fd, ret_val, i, timeout_msecs = 500; + socklen_t addrlen; + char buf[DATA_BUFFER]; + struct pollfd all_connections[MAX_CONNECTIONS]; + + /* Get the socket server fd */ + server_fd = create_tcp_server_socket(); + if (server_fd == -1) { + fprintf(stderr, "Failed to create a server\n"); + return -1; + } + + /* Initialize all_connections and set the first entry to server fd */ + for (i=0;i < MAX_CONNECTIONS;i++) { + all_connections[i].fd = -1; + all_connections[0].events = POLLIN; + } + all_connections[0].fd = server_fd; + + while (1) { + /* Invoke poll() and then wait! */ + ret_val = poll(all_connections, MAX_CONNECTIONS, timeout_msecs); + + /* poll() woke up. Identify the fd that has events */ + if (ret_val > 0 ) { + /* Check if new events is input */ + if (all_connections[0].revents & POLLIN) { + /* accept the new connection */ + printf("Returned fd is %d (server's fd)\n", server_fd); + new_fd = accept(server_fd, (struct sockaddr*)&new_addr, &addrlen); + if (new_fd >= 0) { + printf("Accepted a new connection with fd: %d\n", new_fd); + for (i=0;i < MAX_CONNECTIONS;i++) { + if (all_connections[i].fd < 0) { + all_connections[i].fd = new_fd; + break; + } + } + } else { + fprintf(stderr, "accept failed [%s]\n", strerror(errno)); + } + ret_val--; + if (!ret_val) continue; + } + + /* Check if the fd with event is a non-server fd */ + for (i=1;i < MAX_CONNECTIONS;i++) { + if (all_connections[i].revents & POLLIN) { + /* read incoming data */ + printf("Returned fd is %d [index, i: %d]\n", all_connections[i].fd, i); + ret_val = recv(all_connections[i].fd, buf, DATA_BUFFER, 0); + if (ret_val == 0) { + printf("Closing connection for fd:%d\n", all_connections[i].fd); + close(all_connections[i].fd); + all_connections[i].fd = -1; /* Connection is now closed */ + } + if (ret_val > 0) { + printf("Received data (len %d bytes, fd: %d): %s\n", + ret_val, all_connections[i].fd, buf); + ret_val = send(all_connections[i].fd, SUCCESS_MESSAGE, sizeof(SUCCESS_MESSAGE), 0); + } + if (ret_val == -1) { + printf("recv() failed for fd: %d [%s]\n", + all_connections[i].fd, strerror(errno)); + break; + } + } + ret_val--; + if (!ret_val) continue; + } /* for-loop */ + } /* (ret_val >= 0) */ + } /* while(1) */ + + /* Last step: Close all the sockets */ + for (i=0;i < MAX_CONNECTIONS;i++) { + if (all_connections[i].fd > 0) { + close(all_connections[i].fd); + } + } + return 0; +} \ No newline at end of file diff --git a/Modul3/select-client.c b/Modul3/select-client.c new file mode 100644 index 0000000..11eabad --- /dev/null +++ b/Modul3/select-client.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +int main () { + struct sockaddr_in saddr; + int fd, ret_val; + struct hostent *local_host; /* need netdb.h for this */ + char message[50]; + + /* Step1: create a TCP socket */ + fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (fd == -1) { + fprintf(stderr, "socket failed [%s]\n", strerror(errno)); + return -1; + } + printf("Created a socket with fd: %d\n", fd); + + /* Let us initialize the server address structure */ + saddr.sin_family = AF_INET; + saddr.sin_port = htons(7000); + local_host = gethostbyname("127.0.0.1"); + saddr.sin_addr = *((struct in_addr *)local_host->h_addr); + + /* Step2: connect to the TCP server socket */ + ret_val = connect(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); + if (ret_val == -1) { + fprintf(stderr, "connect failed [%s]\n", strerror(errno)); + close(fd); + return -1; + } + + while (1) + { + /* Next step: send some data */ + gets(message); + ret_val = send(fd,message, sizeof(message), 0); + printf("Successfully sent data (len %d bytes): %s\n", + ret_val, message); + ret_val = recv(fd, message, sizeof(message), 0); + puts(message); + } + + /* Last step: close the socket */ + close(fd); + return 0; +} \ No newline at end of file diff --git a/Modul3/select-server.c b/Modul3/select-server.c new file mode 100644 index 0000000..f9272fa --- /dev/null +++ b/Modul3/select-server.c @@ -0,0 +1,139 @@ +#include +#include +#include +#include +#include + +#define DATA_BUFFER 5000 +#define MAX_CONNECTIONS 10 +#define SUCCESS_MESSAGE "Your message delivered successfully" + +int create_tcp_server_socket() { + struct sockaddr_in saddr; + int fd, ret_val; + + /* Step1: create a TCP socket */ + fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (fd == -1) { + fprintf(stderr, "socket failed [%s]\n", strerror(errno)); + return -1; + } + printf("Created a socket with fd: %d\n", fd); + + /* Initialize the socket address structure */ + saddr.sin_family = AF_INET; + saddr.sin_port = htons(7000); + saddr.sin_addr.s_addr = INADDR_ANY; + + /* Step2: bind the socket to port 7000 on the local host */ + ret_val = bind(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)); + if (ret_val != 0) { + fprintf(stderr, "bind failed [%s]\n", strerror(errno)); + close(fd); + return -1; + } + + /* Step3: listen for incoming connections */ + ret_val = listen(fd, 5); + if (ret_val != 0) { + fprintf(stderr, "listen failed [%s]\n", strerror(errno)); + close(fd); + return -1; + } + return fd; +} + +int main () { + fd_set read_fd_set; + struct sockaddr_in new_addr; + int server_fd, new_fd, ret_val, i; + socklen_t addrlen; + char buf[DATA_BUFFER]; + int all_connections[MAX_CONNECTIONS]; + + /* Get the socket server fd */ + server_fd = create_tcp_server_socket(); + if (server_fd == -1) { + fprintf(stderr, "Failed to create a server\n"); + return -1; + } + + /* Initialize all_connections and set the first entry to server fd */ + for (i=0;i < MAX_CONNECTIONS;i++) { + all_connections[i] = -1; + } + all_connections[0] = server_fd; + + while (1) { + FD_ZERO(&read_fd_set); + /* Set the fd_set before passing it to the select call */ + for (i=0;i < MAX_CONNECTIONS;i++) { + if (all_connections[i] >= 0) { + FD_SET(all_connections[i], &read_fd_set); + } + } + + /* Invoke select() and then wait! */ + printf("\nUsing select() to listen for incoming events\n"); + ret_val = select(FD_SETSIZE, &read_fd_set, NULL, NULL, NULL); + + /* select() woke up. Identify the fd that has events */ + if (ret_val >= 0 ) { + printf("Select returned with %d\n", ret_val); + /* Check if the fd with event is the server fd */ + if (FD_ISSET(server_fd, &read_fd_set)) { + /* accept the new connection */ + printf("Returned fd is %d (server's fd)\n", server_fd); + new_fd = accept(server_fd, (struct sockaddr*)&new_addr, &addrlen); + if (new_fd >= 0) { + printf("Accepted a new connection with fd: %d\n", new_fd); + for (i=0;i < MAX_CONNECTIONS;i++) { + if (all_connections[i] < 0) { + all_connections[i] = new_fd; + break; + } + } + } else { + fprintf(stderr, "accept failed [%s]\n", strerror(errno)); + } + ret_val--; + if (!ret_val) continue; + } + + /* Check if the fd with event is a non-server fd */ + for (i=1;i < MAX_CONNECTIONS;i++) { + if ((all_connections[i] > 0) && + (FD_ISSET(all_connections[i], &read_fd_set))) { + /* read incoming data */ + printf("Returned fd is %d [index, i: %d]\n", all_connections[i], i); + ret_val = recv(all_connections[i], buf, DATA_BUFFER, 0); + if (ret_val == 0) { + printf("Closing connection for fd:%d\n", all_connections[i]); + close(all_connections[i]); + all_connections[i] = -1; /* Connection is now closed */ + } + if (ret_val > 0) { + printf("Received data (len %d bytes, fd: %d): %s\n", + ret_val, all_connections[i], buf); + ret_val = send(all_connections[i], SUCCESS_MESSAGE, sizeof(SUCCESS_MESSAGE), 0); + } + if (ret_val == -1) { + printf("recv() failed for fd: %d [%s]\n", + all_connections[i], strerror(errno)); + break; + } + } + ret_val--; + if (!ret_val) continue; + } /* for-loop */ + } /* (ret_val >= 0) */ + } /* while(1) */ + + /* Last step: Close all the sockets */ + for (i=0;i < MAX_CONNECTIONS;i++) { + if (all_connections[i] > 0) { + close(all_connections[i]); + } + } + return 0; +} \ No newline at end of file diff --git a/Modul4/README - English.md b/Modul4/README - English.md new file mode 100644 index 0000000..1f447dd --- /dev/null +++ b/Modul4/README - English.md @@ -0,0 +1,571 @@ + +# File System and FUSE + + + +## Objectives + +1. Participants obtains knowledge of _file system_ + +2. Participants obtains knowledge and is able to implement FUSE + + +## List of Content + +- [File System and FUSE](#file-system-and-fuse) + - [Objectives](#objectives) + - [List of Content](#list-of-content) +- [File System](#file-system) + - [1. Types of File System](#1-types-of-file-system) + - [2. Virtual File System](#2-virtual-file-system) + - [3. Dentry](#3-dentry) + - [4. Superblock](#4-superblock) + - [5. Inode](#5-inode) +- [File System in Userspace (FUSE)](#file-system-in-userspace-fuse) + - [1. FUSE Installation](#1-fuse-installation) + - [2. How FUSE Works](#2-how-fuse-works) + - [3. Making a FUSE Program](#3-making-a-fuse-program) + - [Tips](#tips) + - [4. Unmount FUSE](#4-unmount-fuse) +- [Excercises](#Excercises) +- [References](#references) + +# File System + +_File system_ is a logical structure used to control data access such as how it is stored or retrieved. _File system_ itself has many types with the use of different algorithms. Each Operating System (OS) has a different file system support. The file system is used to organize and store files on a storage device. + +The _File system_ provides a way to separate the data on the drive into a single shape, namely files. _File system_ also provides a way to store data on files, for example **filename**, **permissions**, and other attributes. In a File System, there also exists an **index** which contains a list of files that exists in a storage location, so that the Operating System can see what is in the storage location. + + + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/linux-filesystem.png?raw=true) + + +## 1. Types of File System + +**1. File System Disk** + +_File system disk_ is a _file system_ designed to store data in a data storage media. Example: FAT (FAT 12, FAT 16, FAT 320), NTFS, HFS, HFS+, ext2, ext3, ext4, ISO 9660, ODS-5 dan UDF. + + - FAT32 and NTFS is a File System di Windows. + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/xformat-file-system-in-windows-disk-utility.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic._Lfdba02dY.png?raw=true) + + - Ext2, Ext3, Ext4 is a File Sytem in Linux. + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/648x463xgparted-showing-primary-extended-and-logical-partitions.png.pagespeed.ic.foZUIWymSb.png?raw=true) + +- APFS, HFS dan HFS+ is a File System from MacOS + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/xformat-drive.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.GnI_H55kwh.png?raw=true) + + + +**2. File System Flash** + + +_File system flash_ is a _file system_ yang didesain untuk menyimpan data pada media _flash memory_. Hal ini menjadi lazim ketika jumlah perangkat mobile semakin banyak dan kapasitas _memory flash_ yang semakin besar. Contohnya pada linux flash filesystems yaitu JFFS, JFFS2, YAFFS, UBIFS, LogFS, F2FS. + + +**3. File System Database** + +A new concept for file management is the concept of database-based file system. As an improvement to hierarchical management structure, files are identified by their characteristics, such as _file_ type, topic, author, or the same metadata. + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/GUID-5E2B22F9-F87A-4A95-BD1B-AAC76C9F8462-default.gif?raw=true) + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/kdbfs.png?raw=true) + + +**4. File System Transaksional** + +Some programs sometimes require changes to multiple files. If a process fails, changes will be reverted. An example is when installing a software which runs the writing process of several files. If an error occurs during the writing process, and the software is left **half installed**, then the **half installed** software will be damaged or unstable. + +Transactional File System won't let that happen. This file system guarantees that if an error occurs, the process will be canceled, and the files that have been created during the process will be rolled back to normal. Examples of this File System on UNIX are the Valor File System, Amino, LFS and TFFS, + + +**5. Network File System** + + + +Network _File system_ is a _file system_ which acts as a client for the remote file access protocol, granting access to _files_ on a _server_. Examples of these network _file system_ are NFS, AFS, SMB protocol clients, and FTP and WebDAV clients. + + +**6. Journaling File System** + +_File system_ that records every change that occurs on the storage device into a journal (usually a circular log in a certain area) before making changes to the _file system_. Such system files are less likely to be damaged when a power failure or system crash occurs. + + +## 2. Virtual File System + +A virtual file system (VFS) is a layer of software in the kernel that provides a _file system interface_ for the program's _user space_. _Virtual file system_ functions so that various types of _file system_ can be accessed by computer applications in a uniform manner. VFS provides an interface between the _system call_ and the real system. + + +## 3. Dentry + + +Dentry or **Directory Entry** is a data structure that translates filenames into their inodes. Examples of information stored in dentry are _name_, _pointer to inode_, _pointer to parent dentry_, _use count_, and others. There are also commands in VFS dentry are D_compare, D_delete, D_release. + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/figure5.gif?raw=true) + + + +## 4. Superblock + +Every file system that is mounted will be represented by a VFS Superblock. _Superblock_ is used to store information about the partition. _Superblock_ stores the following information: + +- _Device_: Is the _device identifier_, for example **/ dev / hda1** is the first _harddisk_ on the system having device identifier **0 × 300**. + +- _Inode Pointer_: Is a _pointer_ which points to the first inode of the filesystem. + +- _Blocksize_: Indicates the size of a _block_ file system, for example **1024** **bytes**. + +- _Superblock Operation_: Is a pointer to a set of superblock routines (functions) from the _file system_, for example **read**, **write**, and so on. + +- _File System Type_: Shows the type of _file system_, for example: EXT2, FAT, NTFS. + +- _File System Specific_: It is a pointer to the information required by the _file system. + + ![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/figure3.gif?raw=true) + + + +## 5. Inode + + +An inode is a VFS abstraction for files. Each file, directory, and other data on VFS is represented by one and only one VFS inode. VFS inodes exist only in kernel memory and are stored in the inode cache as long as they are needed by the system. The information stored by the VFS Inode includes: + +- _Device_: Shows the device identifier of a device that stores files or a _directory_. + +- _Inode Number_: Is a unique inode number in the _file system_. + +- Mode: Describes what the VFS inode represents. + +- _User_ ID: Is an identifier for the owner of the file. + +- _Time_: Indicate when the creation, modification, and writing of a file. + +- _Blocksize_: Shows the size of the _block_ used by the file. + +- _Inode Operations_: Is _pointer_ to a _routine_ who perform various operations on inode. + +- _Count_: Shows the number of times a system has used an inode. + +- _Lock_: Used to lock the VFS inode. + +- _File System Specific Information_: Indicates specific information required by an inode. + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/figure4.gif?raw=true) + +Following is the relationship between dentry, superblock, and inode on a Virtual File System. + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/daHCZ.gif?raw=true) + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/dentry.JPG?raw=true) + + +# File System in Userspace (FUSE) + +FUSE (Filesystem in Userspace) is an interface where we could make our own file system inside a userspace on linux. + +The advantage of using FUSE is that we can use any available library to create your own file system without having to deeply understand what the file system is actually doing in the kernel space. This is done because the FUSE module can bridge the file system code in the userspace with the file system in the kernel space. Some of the other benefits of FUSE are as follows: + +- Can be loaded and installed by ordinary users, for network access, to get archived files, for removable media, etc. +- If the FUSE system driver crashes, it will not affect the kernel. +- FUSE can be deployed quickly, both because it does not require administrator intervention to install and because it can be easily accessed by any supported OS. +- No license issues related to static connection with the kernel. + +![Fuse Illustration](https://github.com/Armunz/sisop-modul-4/blob/master/img/fuse.png?raw=true) + + +One interesting example of FUSE is [GDFS][7bb7b7cc](Google Drive File System), where this GDFS allows us to mount our Google Drive to a linux system and use it like a regular linux file. + +[7bb7b7cc]: https://github.com/robin-thomas/GDFS "GDFS" + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/google-drive-2.png?raw=true) + +To implement FUSE, we must create a program that is linked to the library `libfuse`. The purpose of this program is to specify how the file system responds to read/write/stat of a request and to mount the original file system (kernel space) to the file system new (userspace). So when a user deals with read/write/stat requests in the file system (userspace), the kernel will forward the input and output of the request to the FUSE program and the program will respond back to the user. + +For more details, let's try to create a FUSE program. +## 1. FUSE installation + +First of all we have to make sure that FUSE is installed on your device. + +``` +$ sudo apt update +$ sudo apt install libfuse* +``` + +## 2. How FUSE Works + +- ```fuse_main()``` (lib/helper.c) = as the main (userspace) function, the user program calls the fuse_main() function then the fuse_mount() function is called. +- ```fuse_mount()``` (lib/mount.c) = creates a UNIX domain socket, then forks and creates a child process that runs fusermount +- ```fusermount()``` (util/fusermount.c) = to check whether the FUSE module has been loaded. Then open /dev/fuse and send the handling file via the UNIX domain socket back to the fuse_mount() function. +- ```fuse_new()``` (lib/fuse.c) = creates a data structure containing the space used to store the file system data +- ```fuse_loop()``` (lib/fuse.c) = read file system calls from /dev/fuse + +These are some of the functions provided by **FUSE**: + +```c +int (*getattr) (const char *, struct stat *); + +//Get file attributes. + +int (*readlink) (const char *, char *, size_t); + +//Read the target of a symbolic link + +int (*mknod) (const char *, mode_t, dev_t); + +//Create a file node. + +int (*mkdir) (const char *, mode_t); + +//Create a directory. + +int (*unlink) (const char *); + +//Remove a file + +int (*rmdir) (const char *); + +//Remove a directory + +int (*rename) (const char *, const char *); + +//Rename a file + +int (*chmod) (const char *, mode_t); + +//Change the permission bits of a file + +int (*chown) (const char *, uid_t, gid_t); + +//Change the owner and group of a file + +int (*truncate) (const char *, off_t); + +//Change the size of a file + +int (*open) (const char *, struct fuse_file_info *); + +//File open operation. + +int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *); + +//Read directory + +int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *); + +//Read data from an open file + +int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *); + +//Write data to an open file +``` + +## 3. Making a FUSE Program + +Fuse has a ```struct``` named ```fuse_operations``` which is defined as follows: + +```c +static struct fuse_operations xmp_oper = { + .getattr = xmp_getattr, + .access = xmp_access, + .readlink = xmp_readlink, + .readdir = xmp_readdir, + .mknod = xmp_mknod, + .mkdir = xmp_mkdir, + .symlink = xmp_symlink, + .unlink = xmp_unlink, + .rmdir = xmp_rmdir, + .rename = xmp_rename, + .link = xmp_link, + .chmod = xmp_chmod, + .chown = xmp_chown, + .truncate = xmp_truncate, + .utimens = xmp_utimens, + .open = xmp_open, + .read = xmp_read, + .write = xmp_write, + .statfs = xmp_statfs, + .create = xmp_create, + .release = xmp_release, + .fsync = xmp_fsync, + .setxattr = xmp_setxattr, + .getxattr = xmp_getxattr, + .listxattr = xmp_listxattr, + .removexattr = xmp_removexattr, +}; +``` + +Every attribute on the ```struct``` is a _pointer_ that points to a function. Every function is called by FUSE when an event occurred on the *file system*. For example when _user_ write on a file, a function that is referenced by the attribute "write" on the struct ```struct``` will be called. + + + +Moreover, the attribute on the ```struct``` is written like the command that is normally used on linux. For example when we make _directory_ in FUSE then mkdir function is called. + + + +**To implement FUSE**, we need to use this ```struct``` and define the function that is refrenced in the ```struct``` tersebut. After, we reference every ```struct``` attribute to a pointer of a function which we have implement. + + + +Most functions that are available is **optional**, we dont need to implement every function. Some functions are essentials to implement on the _file system_. Those functions are: + +- ```getattr``` function is called whe the sistem needs to get attribute of a file. + +- ```readdir``` function is called when the user try to list all files and directory inside a spesific directory. + +- ```read``` function is called when the system try to read a file part by part. + +To see all available function on **FUSE**, you can open the following link: [https://libfuse.github.io/doxygen/structfuse__operations.html](https://libfuse.github.io/doxygen/structfuse__operations.html) + +Here is an example program, by only implementing those 3 functions. + +```c +#define FUSE_USE_VERSION 28 +#include +#include +#include +#include +#include +#include +#include +#include + + +static int xmp_getattr(const char *path, struct stat *stbuf) +{ + int res; + res = lstat(path, stbuf); + + if (res == -1) return -errno; + return 0; +} + +static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) +{ + DIR *dp; + struct dirent *de; + (void) offset; + (void) fi; + + + dp = opendir(path); + + if (dp == NULL) return -errno; + + while ((de = readdir(dp)) != NULL) { + struct stat st; + + memset(&st, 0, sizeof(st)); + + st.st_ino = de->d_ino; + st.st_mode = de->d_type << 12; + + if(filler(buf, de->d_name, &st, 0)) break; + } + closedir(dp); + return 0; +} + +static int xmp_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) +{ + int fd; + int res; + (void) fi; + + + fd = open(path, O_RDONLY); + + if (fd == -1) return -errno; + + res = pread(fd, buf, size, offset); + + if (res == -1) res = -errno; + + close(fd); + + return res; +} + +static struct fuse_operations xmp_oper = { + .getattr = xmp_getattr, + .readdir = xmp_readdir, + .read = xmp_read, +}; + +int main(int argc, char *argv[]) +{ + umask(0); + return fuse_main(argc, argv, &xmp_oper, NULL); +} +``` + + + +We can _compile_ the code by using the following command + + + +``` +gcc -Wall `pkg-config fuse --cflags` [file.c] -o [output] `pkg-config fuse --libs` +``` + + + +We then make the directory for the destination of our FUSE file system and execute FUSE on that directory. + +``` +$ mkdir [destination directory] +$ ./[output] [destination directory] +``` + +After you execute the program, enter the destination directory. The content of that directory is similar to what is listed on the ```root``` or ```/``` directory. + + +### Tips +One way of how to debug when programming fuse is using `printf` dan running the program by using the following command : `./[output] -f [destination directory]`. Where `-f` will keep the program running in the foreground so you can see what the `printf` output. + + +In accordance to the explanation in the beggining where FUSE can modify the _file system_ in _userspace_ without modifying anything on the kernel code base, here we can modify the FUSE code such that we show the content of ```/home/[user]/Documents```. + +Change your FUSE code to the following code: +**NOTE : change [user] to your user account** + + +```c +#define FUSE_USE_VERSION 28 +#include +#include +#include +#include +#include +#include +#include +#include + +static const char *dirpath = "/home/[user]/Documents"; + +static int xmp_getattr(const char *path, struct stat *stbuf) +{ + int res; + char fpath[1000]; + + + sprintf(fpath,"%s%s",dirpath,path); + + res = lstat(fpath, stbuf); + + if (res == -1) return -errno; + + return 0; +} + + + +static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) +{ + char fpath[1000]; + + if(strcmp(path,"/") == 0) + { + path=dirpath; + sprintf(fpath,"%s",path); + } else sprintf(fpath, "%s%s",dirpath,path); + + int res = 0; + DIR *dp; + struct dirent *de; + (void) offset; + (void) fi; + + dp = opendir(fpath); + + if (dp == NULL) return -errno; + + while ((de = readdir(dp)) != NULL) { + struct stat st; + + memset(&st, 0, sizeof(st)); + + st.st_ino = de->d_ino; + st.st_mode = de->d_type << 12; + res = (filler(buf, de->d_name, &st, 0)); + + if(res!=0) break; + } + + closedir(dp); + + return 0; +} + +static int xmp_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) +{ + char fpath[1000]; + if(strcmp(path,"/") == 0) + { + path=dirpath; + + + sprintf(fpath,"%s",path); + } + else sprintf(fpath, "%s%s",dirpath,path); + + int res = 0; + int fd = 0 ; + + (void) fi; + + fd = open(fpath, O_RDONLY); + + if (fd == -1) return -errno; + + res = pread(fd, buf, size, offset); + + if (res == -1) res = -errno; + + close(fd); + + return res; +} + +static struct fuse_operations xmp_oper = { + .getattr = xmp_getattr, + .readdir = xmp_readdir, + .read = xmp_read, +}; + +int main(int argc, char *argv[]) +{ + umask(0); + return fuse_main(argc, argv, &xmp_oper, NULL); +} +``` + +## 4. Unmount FUSE +Unmount command is used to "unmount" a file system that has been mounted, also inform any delayed read or write operation so that the file system can be detached safely. + +To **unmount** FUSE, run the following command: +``` +sudo umount [destination directory] +or +fusermount -u [destination directory] +``` + + +# Excercises + +1. Make a file system that points to /home/[user]/Downloads, the file system is called JagoFS, such that every file name on the file system have Jago_ as a prefix like Jago_[nama_file]. For example examplefile.txt is shown as Jago_examplefile.txt. The file system only have read access. Another example is Jago_exampletwo.txt is shown as Jago_Jago_exampletwo.txt. +2. Make a file system that leads to /home/[user]/Documents. This file system has a logging feature, where when any file on the folder is modified, the change event is recorded on a lof file with the following format ... If the log file doesn't exist then the system will automatically make the log file. + +# References + +1. https://www.cs.hmc.edu/~geoff/classes/hmc.cs135.201109/homework/fuse/fuse_doc.html +2. http://www.maastaar.net/fuse/linux/filesystem/c/2016/05/21/writing-a-simple-filesystem-using-fuse/ +3. https://github.com/asayler/CU-CS3753-PA5 +4. http://amazingharry.blogspot.co.id/2015/01/filesystem-in-userspace-fuse-in-linux_5.html +5. [https://docs.oracle.com/database/121/ADLOB/adlob_fs.htm#ADLOB45989](https://docs.oracle.com/database/121/ADLOB/adlob_fs.htm#ADLOB45989) +6. [http://www.fieldses.org/~bfields/kernel/vfs.txt](http://www.fieldses.org/~bfields/kernel/vfs.txt) +7. [https://developer.ibm.com/technologies/linux/tutorials/l-virtual-filesystem-switch/](https://developer.ibm.com/technologies/linux/tutorials/l-virtual-filesystem-switch/) diff --git a/Modul4/README.md b/Modul4/README.md index 99b0bb5..13a279e 100644 --- a/Modul4/README.md +++ b/Modul4/README.md @@ -1,7 +1,7 @@ # File System dan FUSE - + ## Objectives @@ -9,47 +9,40 @@ 2. Peserta mengetahui dan mampu mengimplementasikan FUSE - ## Daftar Isi -- [1. File System](https://github.com/Armunz/sisop-modul-4#1-file-system) - -- [1.1 Tipe File System](https://github.com/Armunz/sisop-modul-4#11-tipe-file-system) - -- [1.2 Virtual File System](https://github.com/Armunz/sisop-modul-4#12-virtual-file-system) - -- [1.3 Dentry](https://github.com/Armunz/sisop-modul-4#13-dentry) - -- [1.4 Superblock](https://github.com/Armunz/sisop-modul-4#14-superblock) - -- [1.5 Inode](https://github.com/Armunz/sisop-modul-4#15-inode) - -- [2. File System in Userspace (FUSE)](https://github.com/Armunz/sisop-modul-4#2-file-system-in-userspace-fuse) - -- [2.1 Instalasi FUSE](https://github.com/Armunz/sisop-modul-4#21-instalasi-fuse) - -- [2.2 Cara Kerja FUSE](https://github.com/Armunz/sisop-modul-4#22-cara-kerja-fuse) - -- [2.3 Membuat Program FUSE](https://github.com/Armunz/sisop-modul-4#23-membuat-program-fuse) - -- [2.4 Unmount FUSE](https://github.com/Armunz/sisop-modul-4#24-unmount-fuse) - - - -# 1. File System - -_File system_ adalah struktur logika yang digunakan untuk mengendalikan akses data seperti bagaimana dia disimpan maupun diambil. _File system_ sendiri memiliki banyak jenis dengan penggunaan algoritma yang tentu berbeda. Setiap Sistem Operasi (OS) memiliki support file system yang berbeda-beda. File system digunakan untuk mengorganisir dan menyimpan file pada storage device. +- [File System dan FUSE](#file-system-dan-fuse) + - [Objectives](#objectives) + - [Daftar Isi](#daftar-isi) +- [File System](#file-system) + - [1. Tipe File System](#1-tipe-file-system) + - [2. Virtual File System](#2-virtual-file-system) + - [3. Dentry](#3-dentry) + - [4. Superblock](#4-superblock) + - [5. Inode](#5-inode) +- [File System in Userspace (FUSE)](#file-system-in-userspace-fuse) + - [1. Instalasi FUSE](#1-instalasi-fuse) + - [2. Cara Kerja FUSE](#2-cara-kerja-fuse) + - [3. Membuat Program FUSE](#3-membuat-program-fuse) + - [Tips](#tips) + - [4. Unmount FUSE](#4-unmount-fuse) +- [Soal Latihan](#soal-latihan) +- [References](#references) + +# File System + +_File system_ adalah struktur logika yang digunakan untuk mengendalikan akses data seperti bagaimana dia disimpan maupun diambil. _File system_ sendiri memiliki banyak jenis dengan penggunaan algoritma yang tentu berbeda. Setiap Sistem Operasi (OS) memiliki support file system yang berbeda-beda. File system digunakan untuk mengorganisir dan menyimpan file pada storage device. _File system_ menyediakan cara untuk memisah-misahkan data pada drive menjadi bentuk tunggal yaitu file. _File system_ juga menyediakan cara untuk menyimpan data pada file, contohnya **filename**, **permission**, dan atribut lainnya. Pada File System, disediakan juga sebuah **index** yang berisi daftar file yang terletak pada suatu lokasi penyimpanan, sehingga Sistem Operasi dapat melihat ada apa saja pada lokasi penyimpanan tersebut. -![enter image description here](img/linux-filesystem.png?raw=true) - +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/linux-filesystem.png?raw=true) -### 1.1 Tipe File System + +## 1. Tipe File System **1. File System Disk** @@ -57,43 +50,43 @@ _File system disk_ adalah _file system_ yang didesain untuk menyimpan data pada - FAT32 dan NTFS adalah File System di Windows. -![enter image description here](img/xformat-file-system-in-windows-disk-utility.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic._Lfdba02dY.png?raw=true) +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/xformat-file-system-in-windows-disk-utility.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic._Lfdba02dY.png?raw=true) - Ext2, Ext3, Ext4 adalah File Sytem di Linux. -![enter image description here](img/648x463xgparted-showing-primary-extended-and-logical-partitions.png.pagespeed.ic.foZUIWymSb.png?raw=true) +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/648x463xgparted-showing-primary-extended-and-logical-partitions.png.pagespeed.ic.foZUIWymSb.png?raw=true) - APFS, HFS dan HFS+ adalah File System dari MacOS -![enter image description here](img/xformat-drive.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.GnI_H55kwh.png?raw=true) +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/xformat-drive.png.pagespeed.gp+jp+jw+pj+ws+js+rj+rp+rw+ri+cp+md.ic.GnI_H55kwh.png?raw=true) + - **2. File System Flash** - + _File system flash_ adalah _file system_ yang didesain untuk menyimpan data pada media _flash memory_. Hal ini menjadi lazim ketika jumlah perangkat mobile semakin banyak dan kapasitas _memory flash_ yang semakin besar. Contohnya pada linux flash filesystems yaitu JFFS, JFFS2, YAFFS, UBIFS, LogFS, F2FS. - + **3. File System Database** Konsep baru untuk manajemen _file_ adalah konsep _file system_ berbasis _database_. Sebagai perbaikan bagi Manajemen terstruktur hirarkis, file diidentifikasi oleh karakteristiknya, seperti tipe _file_, topik, pembuat, atau metadata yang sama. -![enter image description here](img/GUID-5E2B22F9-F87A-4A95-BD1B-AAC76C9F8462-default.gif?raw=true) +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/GUID-5E2B22F9-F87A-4A95-BD1B-AAC76C9F8462-default.gif?raw=true) -![enter image description here](img/kdbfs.png?raw=true) +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/kdbfs.png?raw=true) **4. File System Transaksional** -Beberapa program terkadang membutuhkan perubahan pada beberapa file. Jika pada proses perubahan tadi mengalami kegagalan, maka file akan kembali seperti semula (tidak ada perubahan). Contohnya adalah saat menginstall sebuah software, dimana menjalankan proses writing beberapa file, jika terjadi error selama proses writing, dan software tersebut dibiarkan menjadi **setengah terinstall**, maka software tersebut akan rusak atau tidak stabil. +Beberapa program terkadang membutuhkan perubahan pada beberapa file. Jika pada proses perubahan tadi mengalami kegagalan, maka file akan kembali seperti semula (tidak ada perubahan). Contohnya adalah saat menginstall sebuah software, dimana menjalankan proses writing beberapa file, jika terjadi error selama proses writing, dan software tersebut dibiarkan menjadi **setengah terinstall**, maka software tersebut akan rusak atau tidak stabil. + +Pada File System Transaksional, tidak akan membiarkan hal tersebut terjadi. File System ini menjamin bahwa jika ada suatu proses yang error, maka proses tersebut akan dibatalkan, dan file-file yang telah terbentuk selama proses tadi akan di roll back seperti semula. Contoh dari File System ini pada UNIX adalah Valor File System, Amino, LFS dan TFFS, -Pada File System Transaksional, tidak akan membiarkan hal tersebut terjadi. File System ini menjamin bahwa jika ada suatu proses yang error, maka proses tersebut akan dibatalkan, dan file-file yang telah terbentuk selama proses tadi akan di roll back seperti semula. Contoh dari File System ini pada UNIX adalah Valor File System, Amino, LFS dan TFFS, - **5. File System Jaringan** - + _File system_ jaringan adalah _file system_ yang bertindak sebagai klien untuk protokol akses file jarak jauh, memberikan akses ke _file_ pada sebuah _server_. Contoh dari _file system_ jaringan ini adalah klien protokol NFS, AFS, SMB, dan klien FTP dan WebDAV. @@ -102,22 +95,22 @@ _File system_ jaringan adalah _file system_ yang bertindak sebagai klien untuk p _File system_ yang mencatat setiap perubahan yang terjadi pada storage device ke dalam jurnal (biasanya berupa log sirkular dalam area tertentu) sebelum melakukan perubahan ke _file system_. File sistem seperti ini memiliki kemungkinan yang lebih kecil mengalami kerusakan saat terjadi _power failure_ atau _system crash_. - -### 1.2 Virtual File System + +## 2. Virtual File System Virtual file system (VFS) adalah suatu lapisan perangkat lunak dalam kernel yang menyediakan _interface file system_ untuk program _user space_. _Virtual file system_ berfungsi agar berbagai jenis _file system_ dapat diakses oleh aplikasi komputer dengan cara yang seragam. VFS menyediakan antarmuka antara _system call_ dengan sistem yang sesungguhnya. - -### 1.3 Dentry + +## 3. Dentry Dentry atau **Directory Entry** merupakan sebuah struktur data yang memiliki tugas sebagai penerjemah nama berkas ke inode-nya. Contoh informasi yang disimpan dalam dentry adalah _name_, _pointer to inode_, _pointer to parent dentry_, _use count_, dan lainnya. Adapula command dalam VFS dentry adalah D_compare, D_delete, D_release. -![enter image description here](img/figure5.gif?raw=true) +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/figure5.gif?raw=true) + - -### 1.4 Superblock +## 4. Superblock Setiap _file system_ yang di-_mount_ akan direpresentasikan oleh sebuah VFS Superblock. _Superblock_ digunakan untuk menyimpan informasi mengenai partisi tersebut. _Superblock_ menyimpan informasi sebagai berikut: @@ -133,11 +126,11 @@ Setiap _file system_ yang di-_mount_ akan direpresentasikan oleh sebuah VFS Supe - _File System Specific_: Merupakan suatu pointer ke informasi yang dibutuhkan oleh _file system. - ![enter image description here](img/figure3.gif?raw=true) + ![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/figure3.gif?raw=true) -### 1.5 Inode +## 5. Inode Inode adalah abstraksi VFS untuk berkas. Setiap berkas, directory, dan data lainnya pada VFS direpresentasikan oleh satu dan hanya satu VFS inode. VFS inode hanya terdapat di memori kernel dan disimpan di inode chace selama masih dibutuhkan oleh sistem. Informasi yang disimpan oleh VFS Inode diantaranya: @@ -161,20 +154,20 @@ Inode adalah abstraksi VFS untuk berkas. Setiap berkas, directory, dan data lain - _File System Specific Information_: Menunjukkan informasi khusus yang dibutuhkan oleh suatu inode. -![enter image description here](img/figure4.gif?raw=true) +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/figure4.gif?raw=true) Berikut adalah hubungan antara dentry, superblock, dan inode pada Virtual File System. -![enter image description here](img/daHCZ.gif?raw=true) +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/daHCZ.gif?raw=true) + +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/dentry.JPG?raw=true) -![enter image description here](img/dentry.JPG?raw=true) - -# 2. File System in Userspace (FUSE) +# File System in Userspace (FUSE) FUSE (Filesystem in Userspace) adalah sebuah _interface_ dimana kita dapat membuat _file system_ sendiri pada _userspace_ pada linux. - + Keuntungan menggunakan FUSE ialah kita dapat menggunakan _library_ apapun yang tersedia untuk membuat _file system_ sendiri tanpa perlu mengenali secara mendalam apa yang _file system_ sebenarnya lakukan di _kernel space_. Hal ini dilakukan karena modul FUSE yang dapat menjembatani antara kode _file system_ yang berada pada _userspace_ dengan _file system_ yang berada pada _kernel space_. Beberapa manfaat yang lain dari FUSE adalah sebagai berikut: @@ -185,30 +178,28 @@ Keuntungan menggunakan FUSE ialah kita dapat menggunakan _library_ apapun yang t -![enter image description here](img/fuse.png?raw=true) - +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/fuse.png?raw=true) -# Salah satu contoh yang menarik dari FUSE adalah [GDFS][7bb7b7cc] (Google Drive File System), dimana GDFS ini memungkinkan kita untuk me-_mount Google Drive_ kita ke sistem linux dan menggunakannya seperti file linux biasa. - + [7bb7b7cc]: https://github.com/robin-thomas/GDFS "GDFS" -![enter image description here](img/google-drive-2.png?raw=true) +![enter image description here](https://github.com/Armunz/sisop-modul-4/blob/master/img/google-drive-2.png?raw=true) Untuk mengimplementasikan FUSE ini, kita harus membuat sebuah program yang terhubung dengan *library* ```libfuse```. Tujuan dari program yang dibuat ini adalah menspesifikkan bagaimana *file system* merespon *read/write/stat* dari sebuah *request* dan untuk me-*(mount)* *file system* asli *(kernel space)* ke *file system* yang baru *(userspace)*. Jadi di saat *user* berurusan dengan *read/write/stat request* di *file system (userspace)*, kernel akan meneruskan *input output request* tersebut ke program FUSE dan program tersebut akan merespon kembali ke *user*. - + Untuk lebih jelasnya mari kita coba membuat program FUSE. - -### 2.1 Instalasi FUSE + +## 1. Instalasi FUSE Pertama-tama kita harus memstikan bahwa FUSE sudah ter-install di perangkat anda @@ -220,11 +211,11 @@ $ sudo apt install libfuse* ``` - -### 2.2 Cara Kerja FUSE - +## 2. Cara Kerja FUSE + + - ```fuse_main()``` (lib/helper.c) = sebagai fungsi main (userspace), program user memanggil fungsi fuse_main() kemudian fungsi fuse_mount() dipanggil. @@ -236,7 +227,7 @@ $ sudo apt install libfuse* - ```fuse_loop()``` (lib/fuse.c) = membaca file system calls dari /dev/fuse - + Ini adalah beberapa fungsi yang disediakan oleh **FUSE**: @@ -246,7 +237,7 @@ int (*getattr) (const char *, struct stat *); //Get file attributes. - + int (*readlink) (const char *, char *, size_t); @@ -256,67 +247,67 @@ int (*mknod) (const char *, mode_t, dev_t); //Create a file node. - + int (*mkdir) (const char *, mode_t); //Create a directory. - + int (*unlink) (const char *); //Remove a file - + int (*rmdir) (const char *); //Remove a directory - + int (*rename) (const char *, const char *); //Rename a file - + int (*chmod) (const char *, mode_t); //Change the permission bits of a file - + int (*chown) (const char *, uid_t, gid_t); //Change the owner and group of a file - + int (*truncate) (const char *, off_t); //Change the size of a file - + int (*open) (const char *, struct fuse_file_info *); //File open operation. - + int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *); //Read directory - + int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *); //Read data from an open file - + int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info *); @@ -324,85 +315,56 @@ int (*write) (const char *, const char *, size_t, off_t, struct fuse_file_info * ``` - -### 2.3 Membuat Program FUSE + +## 3. Membuat Program FUSE Fuse memiliki ```struct``` yang dinamakan ```fuse_operations``` yang didefinisikan seperti dibawah ini: ```c static struct fuse_operations xmp_oper = { - -.getattr = xmp_getattr, - -.access = xmp_access, - -.readlink = xmp_readlink, - -.readdir = xmp_readdir, - -.mknod = xmp_mknod, - -.mkdir = xmp_mkdir, - -.symlink = xmp_symlink, - -.unlink = xmp_unlink, - -.rmdir = xmp_rmdir, - -.rename = xmp_rename, - -.link = xmp_link, - -.chmod = xmp_chmod, - -.chown = xmp_chown, - -.truncate = xmp_truncate, - -.utimens = xmp_utimens, - -.open = xmp_open, - -.read = xmp_read, - -.write = xmp_write, - -.statfs = xmp_statfs, - -.create = xmp_create, - -.release = xmp_release, - -.fsync = xmp_fsync, - -.setxattr = xmp_setxattr, - -.getxattr = xmp_getxattr, - -.listxattr = xmp_listxattr, - -.removexattr = xmp_removexattr, - -#endif - + .getattr = xmp_getattr, + .access = xmp_access, + .readlink = xmp_readlink, + .readdir = xmp_readdir, + .mknod = xmp_mknod, + .mkdir = xmp_mkdir, + .symlink = xmp_symlink, + .unlink = xmp_unlink, + .rmdir = xmp_rmdir, + .rename = xmp_rename, + .link = xmp_link, + .chmod = xmp_chmod, + .chown = xmp_chown, + .truncate = xmp_truncate, + .utimens = xmp_utimens, + .open = xmp_open, + .read = xmp_read, + .write = xmp_write, + .statfs = xmp_statfs, + .create = xmp_create, + .release = xmp_release, + .fsync = xmp_fsync, + .setxattr = xmp_setxattr, + .getxattr = xmp_getxattr, + .listxattr = xmp_listxattr, + .removexattr = xmp_removexattr, }; ``` Semua atribut pada ```struct``` tersebut adalah _pointer_ yang menuju ke fungsi. Setiap fungsi tersebut disebut FUSE saat suatu kejadian yang spesifik terjadi di *file system*. Sebagai contoh saat _user_ menulis di sebuah file, sebuah fungsi yang ditunjuk oleh atribut "write" di ```struct``` akan terpanggil. - + Selain itu, atribut pada ```struct``` tersebut tertulis seperti fungsi yang biasa digunakan di linux. Contohnya ialah saat kita membuat _directory_ di FUSE maka fungsi mkdir akan dipanggil. - + **Untuk mengimplementasikan FUSE**, kita harus menggunakan ```struct``` ini dan harus mendefinisikan fungsi yang ada di dalam ```struct``` tersebut. Setelahnya, kita mengisi ```struct``` tersebut dengan pointer dari fungsi yang ingin diimplementasikan. - + Kebanyakan fungsi-fungsi yang tersedia adalah **opsional**, kita tidak perlu mengimplementasikan semuanya. Beberapa fungsi memang harus diimplementasikan dalam _file system_. Fungsi-fungsi tersebut antara lain: @@ -414,175 +376,98 @@ Kebanyakan fungsi-fungsi yang tersedia adalah **opsional**, kita tidak perlu men Untuk melihat fungsi-fungsi yang tersedia pada **FUSE** yang lain, buka link berikut: [https://libfuse.github.io/doxygen/structfuse__operations.html](https://libfuse.github.io/doxygen/structfuse__operations.html) -# - Contoh program FUSE sederhana yang hanya menggunakan 3 fungsi tersebut. ```c - #define FUSE_USE_VERSION 28 - #include - #include - #include - #include - #include - #include - #include - #include - - static int xmp_getattr(const char *path, struct stat *stbuf) - { + int res; + res = lstat(path, stbuf); -int res; - - - -res = lstat(path, stbuf); - -if (res == -1) - -return -errno; - - - -return 0; - + if (res == -1) return -errno; + return 0; } - -static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler, - -off_t offset, struct fuse_file_info *fi) +static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) { + DIR *dp; + struct dirent *de; + (void) offset; + (void) fi; -DIR *dp; - -struct dirent *de; - - - -(void) offset; - -(void) fi; - - - -dp = opendir(path); - -if (dp == NULL) - -return -errno; - - - -while ((de = readdir(dp)) != NULL) { - -struct stat st; - -memset(&st, 0, sizeof(st)); + dp = opendir(path); -st.st_ino = de->d_ino; + if (dp == NULL) return -errno; -st.st_mode = de->d_type << 12; + while ((de = readdir(dp)) != NULL) { + struct stat st; -if (filler(buf, de->d_name, &st, 0)) + memset(&st, 0, sizeof(st)); -break; + st.st_ino = de->d_ino; + st.st_mode = de->d_type << 12; + if(filler(buf, de->d_name, &st, 0)) break; + } + closedir(dp); + return 0; } - -closedir(dp); - -return 0; - -} - - - -static int xmp_read(const char *path, char *buf, size_t size, off_t offset, - -struct fuse_file_info *fi) +static int xmp_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { + int fd; + int res; + (void) fi; -int fd; - -int res; - - - -(void) fi; - -fd = open(path, O_RDONLY); - -if (fd == -1) - -return -errno; - - - -res = pread(fd, buf, size, offset); + fd = open(path, O_RDONLY); -if (res == -1) + if (fd == -1) return -errno; -res = -errno; + res = pread(fd, buf, size, offset); - + if (res == -1) res = -errno; -close(fd); - -return res; + close(fd); + return res; } - - -static struct fuse_operations xmp_oper = { - -.getattr = xmp_getattr, -.readdir = xmp_readdir, - -.read = xmp_read, +static struct fuse_operations xmp_oper = { + .getattr = xmp_getattr, + .readdir = xmp_readdir, + .read = xmp_read, }; - -int main(int argc, char *argv[]) +int main(int argc, char *argv[]) { - -umask(0); - -return fuse_main(argc, argv, &xmp_oper, NULL); - + umask(0); + return fuse_main(argc, argv, &xmp_oper, NULL); } - - - ``` - + Setelah itu kode dapat di-_compile_ dengan cara - + ``` @@ -590,7 +475,7 @@ gcc -Wall `pkg-config fuse --cflags` [file.c] -o [output] `pkg-config fuse --lib ``` - + Lalu buat sebuah direktori sebagai tujuan pembuatan FUSE dan menjalankan FUSE pada direktori tersebut. @@ -604,213 +489,134 @@ $ ./[output] [direktori tujuan] Setelah program dijalankan, masuklah kedalam direktori tujuan tersebut. Isi dari direktori tersebut adalah list folder yang sama seperti yang ada di dalam ```root``` atau ```/```. - + +### Tips +Salah satu cara debugging yang bisa dilakukan saat memprogram fuse adalah dengan menggunakan `printf` dan menjalankan program dengan cara `./[output] -f [direktori tujuan]`. Dimana `-f` disini berarti menjaga program agar tetap berjalan di foreground sehingga bisa menggunakan `printf`. + Sesuai dengan penjelasan di awal di mana FUSE dapat memodifikasi _file system_ di _userspace_ tanpa perlu mengubah kode yang ada pada kernel, di sini kita coba memodifikasi kode FUSE tadi agar FUSE tersebut menampilkan apa yang ada di dalam folder ```/home/[user]/Documents```. Ubah kode FUSE tadi seperti yang ada dibawah ini: - -```c +```c #define FUSE_USE_VERSION 28 - #include - #include - #include - #include - #include - #include - #include - #include - - static const char *dirpath = "/home/[user]/Documents"; - - static int xmp_getattr(const char *path, struct stat *stbuf) - { + int res; + char fpath[1000]; -int res; - -char fpath[1000]; - -sprintf(fpath,"%s%s",dirpath,path); - -res = lstat(fpath, stbuf); + sprintf(fpath,"%s%s",dirpath,path); - + res = lstat(fpath, stbuf); -if (res == -1) - -return -errno; - - - -return 0; + if (res == -1) return -errno; + return 0; } - - -static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler, - -off_t offset, struct fuse_file_info *fi) - -{ - -char fpath[1000]; -if(strcmp(path,"/") == 0) +static int xmp_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi) { + char fpath[1000]; -path=dirpath; - -sprintf(fpath,"%s",path); - -} - -else sprintf(fpath, "%s%s",dirpath,path); - -int res = 0; - - - -DIR *dp; - -struct dirent *de; - - - -(void) offset; - -(void) fi; - - + if(strcmp(path,"/") == 0) + { + path=dirpath; + sprintf(fpath,"%s",path); + } else sprintf(fpath, "%s%s",dirpath,path); -dp = opendir(fpath); + int res = 0; -if (dp == NULL) + DIR *dp; + struct dirent *de; + (void) offset; + (void) fi; -return -errno; + dp = opendir(fpath); - + if (dp == NULL) return -errno; -while ((de = readdir(dp)) != NULL) { + while ((de = readdir(dp)) != NULL) { + struct stat st; -struct stat st; + memset(&st, 0, sizeof(st)); -memset(&st, 0, sizeof(st)); + st.st_ino = de->d_ino; + st.st_mode = de->d_type << 12; + res = (filler(buf, de->d_name, &st, 0)); -st.st_ino = de->d_ino; + if(res!=0) break; + } -st.st_mode = de->d_type << 12; - -res = (filler(buf, de->d_name, &st, 0)); - -if(res!=0) break; - -} - - - -closedir(dp); - -return 0; + closedir(dp); + return 0; } - -static int xmp_read(const char *path, char *buf, size_t size, off_t offset, - -struct fuse_file_info *fi) - -{ - -char fpath[1000]; - -if(strcmp(path,"/") == 0) +static int xmp_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { + char fpath[1000]; + if(strcmp(path,"/") == 0) + { + path=dirpath; -path=dirpath; - -sprintf(fpath,"%s",path); + sprintf(fpath,"%s",path); + } + else sprintf(fpath, "%s%s",dirpath,path); -} - -else sprintf(fpath, "%s%s",dirpath,path); - -int res = 0; - -int fd = 0 ; - - - -(void) fi; - -fd = open(fpath, O_RDONLY); + int res = 0; + int fd = 0 ; -if (fd == -1) + (void) fi; -return -errno; + fd = open(fpath, O_RDONLY); - + if (fd == -1) return -errno; -res = pread(fd, buf, size, offset); + res = pread(fd, buf, size, offset); -if (res == -1) + if (res == -1) res = -errno; -res = -errno; - - - -close(fd); - -return res; + close(fd); + return res; } - - -static struct fuse_operations xmp_oper = { - -.getattr = xmp_getattr, - -.readdir = xmp_readdir, -.read = xmp_read, +static struct fuse_operations xmp_oper = { + .getattr = xmp_getattr, + .readdir = xmp_readdir, + .read = xmp_read, }; - -int main(int argc, char *argv[]) +int main(int argc, char *argv[]) { + umask(0); -umask(0); - -return fuse_main(argc, argv, &xmp_oper, NULL); - + return fuse_main(argc, argv, &xmp_oper, NULL); } - ``` -### 2.4 Unmount FUSE +## 4. Unmount FUSE Unmount command digunakan untuk "unmount" sebuah filesystem yang telah ter-mount, lalu juga menginformasikan ke sistem untuk menyelesaikan semua operasi read dan write yang masih tertunda agar bisa di-detach (dilepaskan) dengan aman. Untuk melakukan **unmount** FUSE, jalankan command di bawah ini: @@ -819,29 +625,19 @@ sudo umount [direktori tujuan] atau fusermount -u [direktori tujuan] ``` - - -## Soal Latihan -1. Buat sebuah file system yang mengarah ke /home/[user]/Downloads, file sistem tersebut memiliki sifat mirroring, sehingga nama file yang ada pada folder tersebut akan ditampilkan terbalik. Sebagai contoh ```contohfile.txt``` menjadi ```txt.elifhotnoc```. File system ini hanya memiliki akses read. -2. Buat sebuah file system yang mengarah ke /home/[user]/Documents. File system ini memiliki fitur auto backup, dimana ketika file pada folder tersebut dimodifikasi, file tersebut dengan versi sebelum mengalami perubahan akan disimpan dengan nama ```..``` di dalam direktori ```backup```. Jika folder backup belum ada, maka secara otomatis akan membuat direktori ```backup``` sebelum dipindahkan dan file tidak bisa di read-write-execute selama berada di direktori ```backup```. +# Soal Latihan - - +1. Buat sebuah file system yang mengarah ke /home/[user]/Downloads, file sistem bernama JagoFS, sehingga nama file yang ada pada folder tersebut akan ditampilkan Jago_[nama_file]. Sebagai contoh contohfile.txt menjadi Jago_contohfile.txt. File system ini hanya memiliki akses read. Contoh lainnya Jago_contohkedua.txt menjadi Jago_Jago_contohkedua.txt. +2. Buat sebuah file system yang mengarah ke /home/[user]/Documents. File system ini memiliki fitur pencatatan, dimana ketika file pada folder tersebut dimodifikasi, kejadian perubahan tersebut akan dicatat pada suatu file log dengan format ... Jika file log belum ada, maka secara otomatis akan membuat file log sebelum dicatat. -### References +# References 1. https://www.cs.hmc.edu/~geoff/classes/hmc.cs135.201109/homework/fuse/fuse_doc.html - 2. http://www.maastaar.net/fuse/linux/filesystem/c/2016/05/21/writing-a-simple-filesystem-using-fuse/ - 3. https://github.com/asayler/CU-CS3753-PA5 - 4. http://amazingharry.blogspot.co.id/2015/01/filesystem-in-userspace-fuse-in-linux_5.html - 5. [https://docs.oracle.com/database/121/ADLOB/adlob_fs.htm#ADLOB45989](https://docs.oracle.com/database/121/ADLOB/adlob_fs.htm#ADLOB45989) - 6. [http://www.fieldses.org/~bfields/kernel/vfs.txt](http://www.fieldses.org/~bfields/kernel/vfs.txt) - 7. [https://developer.ibm.com/technologies/linux/tutorials/l-virtual-filesystem-switch/](https://developer.ibm.com/technologies/linux/tutorials/l-virtual-filesystem-switch/)