Linux servers - Exercice 6
==============

*Disclaimer:*
--------------

This exercise is a part of [Linux servers (ICT4TN021, spring 2018) // Linux-palvelimet (ICT4TN021, kevät 2018)](http://www.haaga-helia.fi/fi/opinto-opas/opintojaksokuvaukset/ICT4TN021) school course organized as a part of Information Technology studies in Haaga-Helia university of Applied Sciences, Helsinki, Finland. Course lecturer [Tero Karvinen](http://terokarvinen.com/) has defined the original assignment descriptions in Finnish presented in this document in English. Answers and translations have been written by Pekka Helenius (me, ~ Fincer).

*Table of contents:*
--------------

- [a) **Hello World** Write and execute "Hello world" in three code languages of your choice. Set up a necessary development environments.](https://github.com/Fincer/linux_server_setup/blob/master/exercises/h6.md#a-write-and-execute-hello-world-in-three-code-languages-of-your-choice-set-up-a-necessary-development-environments)

    - [Perl (hello.pl)](https://github.com/Fincer/linux_server_setup/blob/master/exercises/h6.md#perl-hellopl)

    - [Python 3 (hello.py)](https://github.com/Fincer/linux_server_setup/blob/master/exercises/h6.md#python-3-hellopy)

    - [C (hello.c)](https://github.com/Fincer/linux_server_setup/blob/master/exercises/h6.md#c-helloc)

- [b) **Custom program** (optional) Write a simple program for some practical purpose with each language. Ideas: utilize the key benefits of your language of choice. Take an input value from a user, generate a calculation and print the output (input-processing-layout).](https://github.com/Fincer/linux_server_setup/blob/master/exercises/h6.md#b-optional-write-a-simple-program-for-some-practical-purpose-with-each-language-ideas-utilize-the-key-benefits-of-your-language-of-choice-take-an-input-value-from-a-user-generate-a-calculation-and-print-the-output-input-processing-layout)

--------------

**a)** Write and execute "Hello world" in three code languages of your choice. Set up a necessary development environments.
--------------

**Answer:**

Let's write "Hello World" in the following three languages: `perl`, `python 3` and `C`. We need to install required development tools:

```
sudo apt-get -y install perl python gcc
```

(GCC = [Gnu Compiler Collection](https://gcc.gnu.org/) + [Wikipedia](https://en.wikipedia.org/wiki/GNU_Compiler_Collection))

Let's write the codes into a subfolder `hello-world` in user's home dir:

```
[newuser@goauldhost: ~ ]$ mkdir ~/hello-world
[newuser@goauldhost: ~ ]$ cd hello-world/
[newuser@goauldhost: hello-world ]$ touch hello{.c,.py,.pl}
```

- `hello.py` = "Hello World" written in Python 3

- `hello.pl` = "Hello World" written in Perl

- `hello.c` = "Hello World" written in C

Hello World program written in three languages (nano editor used):

### Perl (hello.pl)

```
#!/usr/bin/env perl
# Declare runtime environment above

# Include these to find common warnings, syntax errors etc in the code
import strict;
import warnings;

# Print Hello World! with a newline
print "Hello World!\n";

```

### Python 3 (hello.py)

```
#!/usr/bin/env python3
# Declare runtime environment above

# Print Hello World!
print("Hello World!");

```

**NOTE!** Pay attention when referring to python executable. On some Linux distributions, python still refers to `python2`, and on some, python refers to `python3`. Practices differ. It can be safer to use 'python3' or 'python2' instead of just 'python' if not sure.

In a simple program like "Hello world" this python issue doesn't really matter. However, if any python libraries are imported into the code, you must know which python environment to use, Python 2 or Python 3. 

### C (hello.c)

```
// Include Standard Input Output Library
#include <stdio.h>

// Declare main function for the program. int type for returning a integer
int main()
{
   // Print Hello World! (stdout in CLI)
   printf("Hello World!");

   // Return boolean value "true" to the execution environment
   return 0;
}
```

`hello.c` requires compiling from source code to executable binary file. Therefore, we compile the source code with the following command in `hello-world` folder:

```
gcc -o hello hello.c
```

after which our `hello` binary can be executed with 

```
~/hello-world/hello
```

**NOTE:** You can check file details by issuing the following command:

```
file ~/hello-world/hello

hello: ELF 64-bit LSB pie executable x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=8e76492bc5ce6c65df8ec5ce7be42645fae2ab70, not stripped
```

All programs give output string "Hello World!" (stdout data stream) in our shell environment:

```
[newuser@goauldhost: hello-world ]$ pwd
/home/newuser/hello-world
[newuser@goauldhost: ~ ]$ python hello.py
Hello World!
[newuser@goauldhost: ~ ]$ perl hello.pl
Hello World!
[newuser@goauldhost: ~ ]$ ./hello
Hello World!
```

**b)** (optional) Write a simple program for some practical purpose with each language. Ideas: utilize the key benefits of your language of choice. Take an input value from a user, generate a calculation and print the output (input-processing-layout).
--------------

**Answer:**

This could have been very interesting assignment to work out. Unfortunately, my working laptop was broken so that I was not effectively able to write new code. I have worked with a perl program which generated random port and TCP/UDP sequences for knockd daemon. In addition, I have worked with some updates to Wine Configuration window (winecfg, part of Wine program) in C language:

![winecfg-update](https://i.imgur.com/SihmPUA.jpg)

See: [Fincer/winecfg_patch](https://github.com/Fincer/winecfg_patch)

Some Python and bash based program-related scripts and code updates are available here:

- [PlayOnLinux patches](https://github.com/Fincer/linux-patches-and-scripts/tree/master/playonlinux).

- Little CMake script targeted for compiling C++ code can be found [here](https://github.com/Fincer/linux-patches-and-scripts/tree/master/xclipshow)

- Some basic scripting to convert videos with ffmpeg in KDE DE: [ffmpeg-fileconversion-video](https://github.com/Fincer/linux-patches-and-scripts/blob/master/kde-servicemenus-multimediatools/ffmpeg-fileconversion-video.sh)

etc.
