Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.
Suoritan tehtävän kannettavalla tietokoneellani, jossa pyörii Kali Linux 2019.1.
$ lsb_release -a
No LSB modules are available.
Distributor ID: Kali
Description: Kali GNU/Linux Rolling
Release: 2019.1
Codename: stretch
Suoritan tehtävän yhdessä Niko Tiittasen kanssa. Hänen bloginsa löytyy tästä linkistä: https://wordpress.com/view/nikotiittanen310038974.wordpress.com
Tehtävänanto kuuluu seuraavasti:
a) Kirjoita ja suorita “Hei maailma” kolmella kielellä. Asenna tarvittavat ympäristöt.
b) (vapaaehtoinen) Kirjoita kullakin kielellä yksinkertainen ohjelma, jolla on jokin käyttötarkoitus. Ideoita: hyödynnä kielen vahvuuksia. Ota käyttäjältä syöte, tee jokin lasku ja tulosta vastaus (input-processing-output).
c) Lisäksi saimme halutessamme tehdä vanhoja tehtäviä opettajamme nettisivuilta.
A.) Hello World!
Tehtävän tarkoituksena on kirjottaa kolmella eri kielellä Hello World, jonka tarkoitusena on testata ympäristön toimivuus. Aikeena oli tehdä Hello World C:llä, C++:lla ja Go’lla. Lopussa on vielä yksi ylimääräinen huvin vuoksi.
C
Olen aiemmin leikkinyt C-kielellä, joten tämä on suhteellisen helppo tehtävä minulle.
Aluksi teemme tiedoston $ nano hello.c -komennolla. Tämän jälkeen asetamme siihen header tiedoston #include <stdio.h>, joka on Standard Input Output, eli sisältää ulostuloon liittyviä komentoja.
Sitten vain:
int main(void) {
printf(“Hello World\n”);
}
Void tulee siksi, että se kertoo compiler-ohjelmalle, että tämä funktio ei palauta mitään arvoa. Jos ei kirjoittaisi void, niin olisi pakko laittaa loppuun vielä “return 0”. Printf on komento, joka löytyy tuosta stdio.h-header-tiedostosta. “\n” laitetaan vain, koska ulostulosta tulee kauniimman näköistä. Tuo siis vaihtaa riviä.
Lopuksi hello.c-tiedosto asetetaan GCC-compiler-ohjelmaan, joka on GNU:n C Compuler. Se asettaa C-tiedoston konekielelle ja tekee siitä ajettavan tiedoston. GCC toimii, niin että kirjoitetaan $ gcc <tiedostonimi> -o <ulostulotiedostonimi>. “-o” tuossa on vain sitä, että jos halutaan ulostulotiedostolle jokin tietty nimi. Oletusnimi on a.out. Tämän jälkeen sen voi ajaa kuin normaalin ajettava ohjelman.
$ ./a.out
Hello World
Noin, Hello World on nyt suoritettu C-kielellä.
C++
Olen myös jotain pelleillyt C++:lla, joten tämänkin pitäisi sujua suhteellisen kivuttomasti.
C++ toimii todella paljon samalla tavalla kuten C, mutta on pieniä eroavaisuuksia. Tehdään siis aluksi ihan kuin aiemmin, mutta nyt muodon vuoksi laitetaan .cpp-pääte tiedostoon. $ nano hello.cpp
#include <iostream>
int main(void) {
std::cout << “Hello World\n”
}
Tuossa stdio.h-header tiedoston korvaa iostream. Sitten taas normaalisti void, että kerrotaan compilerille, että tämä ei palauta mitään arvoa. “std::cout” tuossa tarkoittaa std-kirjastosta otettavaa C-out-metodia, jolla saadaan printattua arvo konsoliin. Syntaksi on hieman erilaista, mutta ei kauheasti kumminkaan eroa. C++ ohjelman voi koota GCC:llä, joka kuuluu samaan GNU compiler-kokoelmaan.
Lopuksi vielä kootaan ohjelma G++-compiler ohjelmalla. $ g++ hello.cpp -o helloworld
Sitten voidaan vaan testata $ ./helloworld
Hello World
Noin Hello World toimii C++-kielellä.
Go
Go ei ole minulle erityisen tuttu kieli. Tiedän etäisesti siitä ja olen kuullut, että se on todella hyvä kieli. En ole silti itse ikinä koskenutkaan Go’hun. Ymmärtääkseni Go on vahva kieli, melkein yhtä vahva kuin C. Go on koottava kieli Wikipedian mukaan, joten se toimii lähes samalla tavalla kuin C.
Ensiksi pitää asentaa Go’n paketti pakettihallinnasta. $ sudo apt install -y golang-go. Tämän jälkeen voimme tehdä Hello World -tiedoston.
Helloworld.go
package main
import “fmt”
func main() {
fmt.Println(“Hello World”)
}
Tämän löysin Go’n verkkosivuilta. Siinä ilmeisesti myös importataan samalla tavalla kirjasto, josta löytyy ulostulometodit. Tässä myös annetaan pakettinimi kuten vaikka Javassa. Lopulta tehdään funktio main(), jossa kutsutaan metdia Println kirjastosta fmt.
Lopulta voimme testata kokonaisuuden komennolla $ go run helloworld.go
Hello World
Chef
Lisäksi teimme Hello Worldin Chef-kielellä. Chef on muisti-stackiin perustuva kieli ja löysimme sille tulkin netistä, ja käytimme tätä.
Löysimme esimerkin netistä, kuinka saisimme Hello World’in toimimaan, mutta se ei aluksi toiminut. Piti lisätä vielä ylös “Hello World.”, joka toimii ilmeisesti ikään kuin tiedostonimenä. Loppuun piti myös lisätä “Serves 1.”. Siihen löytyi tällainen selitys: “Serves. Prints the contents of the corresponding number of baking dishes. The elements in each dish are printed from top of the stack to the bottom. “, toisin sanottuna, se printaa muistissa olevat arvot yhtenä pätkänä.
Löysimme Chef’lle webtulkin, jolla saimme koodin tulkattua. Tässä on esimerkki koodista:

Noin, Hello World Chef-kielellä.
B.) Pienet ohjelmat
C-ohjelma
Olen sen verran paljon pelleillyt C:llä, että loin pienen ohjelman, jossa annetaan käyttäjälle viisi yritystä arvata numero. Numero generoidaan srand()-funktiolla, joka ottaa nykyisen ajan ja käyttää sitä “seedinä” pseudo randomiin. Jos käyttäjä arvaa viisi kertaa väärin, niin hän häviää. Ohjelma toistaa kysymystä kunnes käyttäjä voittaa tai yritykset loppuvat. Tässä on ohjelman lähdekoodi:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
time_t t;
srand((unsigned) time(&t));
int randomNumber = rand() % 31;
int guess;
int tries = 1;
int triesLeft = 5;
while (tries < 6) {
printf("Try number %d!\n\n", tries);
printf("You have %d tries left.\nGuess a number: ", triesLeft);
scanf("%d", &guess);
if (guess == randomNumber) {
printf("Congratulations! You won! \n");
tries++;
triesLeft--;
break;
}
else if (guess != randomNumber && guess > 0 && guess <= 30) {
if (guess < randomNumber) {
printf("\nThe number is higher.\n\n");
}
else if (guess > randomNumber) {
printf("\nThe number is lower.\n\n");
}
tries++;
triesLeft--;
}
else {
printf("False input! Try again!\n");
continue;
}
}
if (guess != randomNumber) {
printf("You lost. :( ");
}
}
C++-ohjelma
Toiseksi ohjelmaksi tein sellaisen, joka looppaa itseään niin kauan, kunnes käyttäjä antaa syötteeksi “q”. Ohjelma toistaa tietyn kirjainjonon 19 kertaa. Ohjelman lähdekoodi näyttää tältä:
#include <iostream>
using namespace std;
int main(void) {
char option;
cout << "Submit q to quit" << endl;
while(option != 'q') {
for (int i = 0; i < 20; i++) {
cout << "Kalja on hyvää." << endl;
}
cin >> option;
}
return EXIT_SUCCESS;
}
Go-ohjelma
Viimeiseksi tein vielä ohjelman Go’lla. Sillä saa muunnettua nykyisen ajan Floridan ja Vladivostokin aikaan. Tähän ohjelmaan tarvitsin jopa hieman apua internetin uumenista, joten tässä on sivut joita käytin lähteinä: https://www.timeanddate.com/worldclock/usa/florida, https://www.timeanddate.com/worldclock/russia/vladivostok, https://stackoverflow.com/questions/26285735/subtracting-time-duration-from-time-in-go ja https://tour.golang.org/welcome/4.
Tässä on ohjelman lopullinen koodi:
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println("The time in Finland is", now)
florida := now.Add(time.Duration(-7) * time.Hour)
fmt.Println("The time in Florida is", florida)
vladivostok := now.Add(time.Duration(8) * time.Hour)
fmt.Println("The time in Vladivostok is", vladivostok)
}
Nyt on tehty kaikki annetut tehtävät. Tehtäviin meni noin 4 tuntia.