Začínáme programovat v Go: 7. díl – funkce

V dneším díle tutoriálu se podíváme na funkce. Funkce je blok příkazů, které mají se mají provést po zavolání. Funkce se vytváří pomocí klíčového slova func. Už jsme se setkali s funkcí main, kterou musí mít program, pokud se má spustil a také s funkcí Println z balíčku fmt, která do konzole zobrazí předané hodnoty (argumenty). V této části tutoriálu se naučíme vytvářet si funkce vlastní.

func sayHello() {
	fmt.Println("Ahoj")
}

Tato funkce zobrazí do konzole text „Ahoj“.

func sayName(name string) {
	fmt.Println("Jmenuji se", name)
}

Tato funkce zobrazí text „Jmenuji se“ a zároveň text, který dostane jako argument. Dalo by se to zapsat též jako fmt.Println(„Jmenuji se “ + name)

func getBy() string {
	return "Měj se"
}

Tato funkce vrátí hodnotu (textový retězec). Pokud chceme, aby funkce něco vrátila, použijeme klíčové slovo return. Zde říkám vrať string „Měj se“. Zároveň musíme určit, jaký datový typ má funkce vracet. Typ návratové hodnoty se zadává za kulaté závorky (func getBy() string { … }).

A zde je celý kód.

package main

import (
	"fmt"
)

func main() {
	sayHello()
	sayName("John")
	fmt.Println(getBy())
}

func sayHello() {
	fmt.Println("Ahoj")
}

func sayName(name string) {
	fmt.Println("Jmenuji se", name)
}

func getBy() string {
	return "Měj se"
}

Ještě upozorním na příkaz fmt.Println(getBy()). Nejdříve se zavolá funkce getBy(), která vrátí string „Měj se“. Tento string se předá do funkce Println, která jej vytiskne. Je to totéž, jako bycho provedli toto:

var by string = getBy()
fmt.Println(by)

Úkol
Vytvořte program se čtyřmi funkcemi. Každá funkce bude mít dva parametry (dvě celá čísla) a bude vracet výsledek. Funkce budou pro sčítán, odčítání, násobení a dělení. Výsledky zobrazte pomocí funkce Println. Opět upozorňuji na to, že pokud počítáte s celými čísly, tak výsledek operace dělení, který vrací desetinné číslo, bude pouze celočíselná část (3 : 2 = 1,5 celočíselná část je 1, takže výsledek bude 1 a ne 1,5)

Možné řešení

package main

import (
	"fmt"
)

func main() {
	var x int = 6
	var y int = 2

	/* Hodnotu vrácenou funkcí můžeme uložit do proměnné a tu potom zobrazit */
	var addResult = add(x, y)
	fmt.Println(addResult)

	/* Nebo můžeme rovnou zobrazit hodnotu bez mezikroku s přiřazením proměnné. */
	fmt.Println(substract(x, y))
	fmt.Println(multiply(x, y))
	fmt.Println(divide(x, y))
}

func add(x int, y int) int {
	return x + y
}

func substract(x int, y int) int {
	return x - y
}

func multiply(x int, y int) int {
	return x * y
}

func divide(x int, y int) int {
	return x / y
}
Rubriky: Go | Štítky: , | Napsat komentář

Vaadin a TextChangeListener

TextChangeListener je listener pro TextChangeEvent, která vznikne, když uživatel edituje textový obsah pole (nejčastěji psaním textu z klávesnice či vložení textu do textového pole). V následujícím příkladu vytvoříme dvě textová pole a prvnímu dáme TextChangeListener s tím, že hodnota vepsaná do prvního textového pole se změní na velká písmena a zobrazí v druhém textovém poli.

final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);

TextField tf1 = new TextField("First");
TextField tf2 = new TextField("Second");

tf1.addTextChangeListener(new TextChangeListener() {
	@Override
	public void textChange(TextChangeEvent event) {
		tf2.setValue(event.getText().toUpperCase());
	}
});

layout.addComponents(tf1, tf2);

V Javě 8 je možný tento zápis:

final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);

TextField tf1 = new TextField("First");
TextField tf2 = new TextField("Second");

tf1.addTextChangeListener(event -> {
	tf2.setValue(getValue(event.getText().toUpperCase()));
});

layout.addComponents(tf1, tf2);

Výsledek

Vaadin_a_TextChangeListener

Rubriky: Java | Štítky: | Napsat komentář

Protocol Buffers

Protocol Buffres (protobuffers) je způsob serializace dat. Serializací je myšleno „převedení datové struktury nebo instance objektu uložené ve vnitřní paměti počítače na posloupnost bitů, kterou lze uložit na nějaké úložiště, případně přenést po síti … je třeba počítat s tím, že objekt budeme převádět zpět ze serializované do původní podoby pomocí tzv. deserializace“ (wiki: wiki).

Protocol Buffers je formát vyvinutý společností Google a je určen pro efektivní výměnu dat. Slovíčko efektivní je zde velmi důležité. Obvyklými formáty dat, pro výměnu, jsou XML a Json. Protofuffer je navržen tak, aby se dal rychle serializovat a deserializovat a byl co nejméně datově náročný. Dle stránky developers.google.com/…/overview je oproti XML:

  • jednodušší
  • 3 – 10 krát menší
  • 20 – 100 krát rychlejší
  • více jednoznačný
  • generuje datové třídy, které se jednodušeji používají.

Konkurentem protobuffers je Apačí projekt Thrift.

Protocol Buffers potřebují schéma, což je textový soubor s příponou .proto. Zde je příklad, jak takový .proto soubor může vypadat:

syntax = "proto3";

option java_package = "cz.vitfo.protobuff";
option java_outer_classname = "PbUser";

message User {
	string username = 1;
	UserProfile userProfile = 2;
}

message UserProfile {
	enum UserStatus {
		ACTIVE = 0;
		PASSIVE = 1;
		CLOSED = 2;
	}
	
	string password = 1;
	UserStatus userStatus = 2;
}

Příště si ukážeme, jak takový soubor vytvořit, zkompilovat a vysvětlíme si, co jednotlivé části znamenají.

Rubriky: Java | Štítky: , | Napsat komentář

Začínáme programovat v Go: 6. díl – základní datové typy

V tomto díle se seznámíme s některými základními datovými typy. Nebude se jednat o komplexní výčet. S dalšími se pak postupně seznámíme v dalších dílech tutoriálu.

boolean
Hodnota může být pravda (true), nebo nepravda (false)

string
Textový řetězec. S tímto datovým typem jsme se již setkali. Cokoliv uzavřené v dvojitých uvozovkách je považováno za textový retězec (string).

int
Celé číslo.

Nejlepší je ukázat si vše na příkladu.

package main

import "fmt"

func main() {
	var x int = 12
	var y int = 7
	var a string = "12"
	var b string = "7"
	var yes bool = true
	var no bool = false

	fmt.Println(x, y, x + y)
	fmt.Println(a, b, a + b)
	fmt.Println(yes, no)
}

Výsledek

12 7 19
12 7 127
true false

Při vytváření (deklaraci) proměnných se nejdříve uvede klíčové slovo var (jako variable), následně pak název proměnné a nakonec její datový typ. Rovnítkem se proměnné přiřadí hodnota.

Vytváříme dvě proměnné typu celé číslo (x, y), dvě proměnné typu textový řetězec (a, b) a dvě proměnné typu pravda nepravda (yes, no). Všimněte si, že pokud použime operátor pro sčítání (+) na čísla, provede se matematická operace sčítání (12 + 7 = 19) a pokud stejný operátor použijeme na textové řetězce, dojde k jejich spojení („12“ + „7“ = „127“). Funkce Println zobrazí všechny argumenty (hodnoty), které dostane.

Úkol
Vytvořte program, ve kterém budete mít několik proměnných typu int (celé číslo) a proveďte s nimi operace sčítání (+), odčítání (-), násobení (*) a dělení (/). Pozor na to, že int je celé číslo. Pokud budete dělit dvě celá čísla např. 7 děleno 3, tak výsledek bude 2 (a ne 2,3333333).

Možné řešení

package main

import "fmt"

func main() {
	var x int = 16
	var y int = 8

	fmt.Println(x + y)
	fmt.Println(x - y)
	fmt.Println(x * y)
	fmt.Println(x / y)
}
Rubriky: Go | Štítky: , | Napsat komentář

Spring – Java konfigurační soubor a konfigurace anotacemi

Spring má dva hlavní způsoby konfigurace (XML a Javu), ale tři hlavní přístupy ke konfiguraci a každý z těchto přístupů má několik názvů.

  • Konfigurace využívající XML (XML based configuration)
    • XML konfigurační soubor a XML konfigurace (XML config and XML-driven/based configuration)
    • XML konfigurační soubor a konfigurace anotacemi (XML config and annotation-driven/based configuration)
  • Konfigurace využívající Javu
    • Java konfigurační soubor a konfigurace anotacemi (Java config and annotation-driven/based configuration | Java based configuration | JavaConfig)

Java konfigurační soubor a konfigurace anotacemi
V tomto příspěvku se podíváme na Java konfigurační soubor a konfigurace anotacemi. V tomto případě se používá pro konfiguraci Java třída a anotace (@Autowired, @Service, …).

Naše jednoduchá aplikace bude mít dvě rozhraní MessageService a SecurityService. Rozhraní MessageService bude mít metodu String getMessage() a SecurityService String encode(String text). Funkčnost aplikace je tato: nejdříve získá řetězec (metoda getMessage()) a ten potom zašifruje (metoda encode()). Vlastní způsob šifrování, implementovaný v SecurityServiceImpl, bude triviální. Všechny písmena e v textu změníme za € a všechna písmena s za §.
Celý příspěvek

Rubriky: Spring | Štítky: , | Napsat komentář

Hadoop, getmerge a .crc soubor

Příkaz getmerge (hdfs dfs -getmerge zdrojovy-adresar cilovy-soubor) v Hadoopu vezme všechny soubory v zadaném adresáři, sloučí je do jednoho lokálního souboru. Tento příkaz je podobný příkazu get (hdfs dfs -get zdrojovy-soubor cilovy-soubor) který provede kopii jednoho souboru. Na rozdíl od get, ale vytvoří skrytý soubor .nazev-ciloveho-souboru.crc. Soubor .crc obsahuje kontrolní součet.

Na toto chování upozorňuje issue ticket HADOOP-12643. Na tomto ticketu mě zaujalo, že vznikl 15. prosince 2015 18:23, komentář k němu přibyl ten samý den o dvě minuty později a pak nic. Tento ticket je stále ve stavu OPEN (aktuálně tedy více než dva roky).

hadoop-getmerge.crc-secret-file

Rubriky: Nezařazené | Štítky: | Napsat komentář

Nastavení velikosti teminálového okna v Ubuntu

Pokud otevíráte terminál v Ubuntu, otevře se ve standardní velikosti 80 sloupců 24 řádků. To není moc a pokud s terminálem pracujete, často si jej musíte zvětšit. Výchozí velikosti s můžete změnit takto. Otevřete si terminál a zvětšete jej na maximum (jinak se vám v horní liště nezobrazí volby) -> Upravit -> Předvolby profilu -> nastavit velikost tak, jak vám vyhovuje.

ubuntu-nastaveni-velikosti-terminalu

ubuntu-nastaveni-velikosti-terminalu_2

Rubriky: Linux | Štítky: , | Napsat komentář

Spring – XML konfigurační soubor a konfigurace anotacemi

Spring má dva hlavní způsoby konfigurace (XML a Javu), ale tři hlavní přístupy ke konfiguraci a každý z těchto přístupů má několik názvů.

  • Konfigurace využívající XML (XML based configuration)
    • XML konfigurační soubor a XML konfigurace (XML config and XML-driven/based configuration)
    • XML konfigurační soubor a konfigurace anotacemi (XML config and annotation-driven/based configuration)
  • Konfigurace využívající Javu
    • Java konfigurační soubor a konfigurace anotacemi (Java config and annotation-driven/based configuration | Java based configuration | JavaConfig)

XML konfigurační soubor a konfigurace anotacemi
V tomto příspěvku se podíváme na XML konfigurační soubor a konfigurace anotacemi. V tomto případě se používá pro konfiguraci XML soubor, ale pro injektování (vytvoření instance a dosazení do požadované proměnné) se používají anotace (@Autowired, @Service, …).

Naše jednoduchá aplikace bude mít dvě rozhraní MessageService a SecurityService. Rozhraní MessageService bude mít metodu String getMessage() a SecurityService String encode(String text). Funkčnost aplikace je tato: nejdříve získá řetězec (metoda getMessage()) a ten potom zašifruje (metoda encode()). Vlastní způsob šifrování, implementovaný v SecurityServiceImpl, bude triviální. Všechny písmena e v textu změníme za € a všechna písmena s za §.
Celý příspěvek

Rubriky: Spring | Štítky: , | Napsat komentář

Generování názvů kontejnerů v Dockeru

Když vytvoříte nový kontejner v dockeru pomocí docker run a nezadáte parametr --name, docker vytvoří kontejner a pojmenuje ho podle sebe. Vznikají tak zajímavé názvy jako: dazzling_swanson, loving_shockley, wonderful_curran či suspicious_knuth. Jedná se o jména vědců + přídavné jméno. Například Shockley se odkazuje na William Shockley co-invented the transistor – https://en.wikipedia.org/wiki/William_Shockley, Curran na Samuel Curran was an Irish physicist who worked alongside his wife during WWII and invented the proximity fuse čí Knuth na Donald Knuth – American computer scientist, author of „The Art of Computer Programming“ and creator of the TeX typesetting system. https://en.wikipedia.org/wiki/Donald_Knuth.

Nikdy ale kontejner nebude pojmenován boring_wozniak. Proč? Protože Steve Wozniak is not boring:

if name == "boring_wozniak" /* Steve Wozniak is not boring */ {
	goto begin
}

Zde je celý kód metody generující názvy:

func GetRandomName(retry int) string {
begin:
	name := fmt.Sprintf("%s_%s", left[rand.Intn(len(left))], right[rand.Intn(len(right))])
	if name == "boring_wozniak" /* Steve Wozniak is not boring */ {
		goto begin
	}

	if retry > 0 {
		name = fmt.Sprintf("%s%d", name, rand.Intn(10))
	}
	return name
}

Zdroj: frightanic.com/…-default-container-names/

Rubriky: Linux | Štítky: , | Napsat komentář

Nastavení JAVA_HOME v Ubuntu

Proměnnou JAVA_HOME nastavíme tak, že si otevřeme soubor /etc/environment a do něj vložíme záznam:

JAVA_HOME="/usr/lib/jvm/java-8-oracle"

Soubor environment znovu načteme:

source /etc/environment

To, že naše proměnná je funkční můžeme otestovat výpisem do konzole:

echo $JAVA_HOME
/usr/lib/jvm/java-8-oracle

Zdroj: askubuntu.com/…/how-to-set-java-home-for-java

Rubriky: Java, Linux | Štítky: , , | Napsat komentář