Velitelství kybernetických a informačních operací

Česká armáda buduje Velitelství kybernetických a informačních operací, které by mělo mít čtyři prvky: CIRC, kybernetickou obranu, informační operace a podporu. Nové velitelství už má přes půl roku i svůj profil na Facebooku. Zatím tam jsou dva příspěvky. Mě zaujal ten první, známý každému, kdo zkoušel programovat: Hello world! Jen doufám, že kvalita prezentace na sociální síti nemá nic společného s kvalitou činnosti velitelství.

Co je to socket

Pokud jste četli něco o internetu, nebo o linuxu, pravděpodobně jste narazili na slovo socket. Víte ale co tento termín znamená?

TCP socket je koncový bod (endpoint) spojení. Je definován IP adresou a portem. Port je identifikátor konkrétní služby (programu). Cílem portu je rozlišit mezi více koncovými body na stejné IP adrese. Ve stejný čas může existovat pouze jeden socket pro IP a port, ale může existovat více spojení. TCP spojení je definováno dvěma koncovými body (endpointy, sockety)

It is the socket pair (the 4-tuple consisting of the client IP address, client port number, server IP address, and server port number) that specifies the two endpoints that uniquely identifies each TCP connection in an internet. (TCP-IP Illustrated Volume 1, W. Richard Stevens)

In most C-derived languages, TCP connections are established and manipulated using methods on an instance of a Socket class.
https://stackoverflow.com/…/what-is-the-difference-between-a-port-and-a-socket

Unix domain socket (IPC socket – inter-process communication socket) je koncový bod pro datovou komunikaci mezi procesy na stejném operačním systému. Je to způsob, jak procesy na stejném stroji mohou mezi sebou komunikovat. A jelikož v linuxu je vše buď adresář nebo soubor, socket je soubor (speciální soubor).

When Unix programs do any sort of I/O, they do it by reading or writing to a file descriptor. A file descriptor is simply an integer associated with an open file. But (and here’s the catch), that file can be a network connection, a FIFO, a pipe, a terminal, a real on-the-disk file, or just about anything else. Everything in Unix is a file! So when you want to communicate with another program over the Internet you’re gonna do it through a file descriptor, you’d better believe it.
http://beej.us/guide/bgnet/html/#what-is-a-socket

Obecně řečeno je tedy socket endpoint sloužící pro komunikaci. Mohli jste ale ještě narazit na slovo WebSocket. To je jiný příběh. WebSocket je komunikační protokol, umožnující obousměrnou full-duplex komunikaci, který je umístěn v 7 vrstvě OSI modelu (podobně jako HTTP protokol).

Další zdroje: Unix domain socket, WebSocket

Změna velikosti okna v Ubuntu na polovinu

Potřebujete aktuální okno v Ubuntu (Mint) zmenšit na polovinu a umístit jej na levou (pravou stranu). Nebo dokonce do horní (spodní) poloviny obrazovky? K tomu vám poslouží super key a šipky. Super key (SK) je klávesa s logem Windows hned vedle klávesy Alt. Experimentováním s SK a šipkami můžete docílit změnšení okna na polovinu a jeho umístnění na stranu a dokonce pak následující zmenšení o další polovinu (ukázku můžete vidět zde). Maximalizovat okno můžete klávesovou zkratkou Alt + F10.

Spring, Kotlin a JSON decoding errors

Nedávno jsem narazil na zajímavý problém. Měl jsem dvě služby, kdy se přes REST rozhraní zavolá jedna, ta provolá druhou a vrátí výsledek. Původní odpověď vypadala takto:

data class GetAchievementsResponse(
        achievements: List<AchievementInfo>
)

Jakmile jsem ale objekt změnil takto:

data class GetAchievementsResponse(
        val aAchievements: List<AchievementInfo>,
        val rAchievements: List<AchievementInfo>
)

Začal jsem dostávat tyto chyby:

JSON decoding error: Instantiation of [simple type, class cz.vitfo.client.GetAchievementsResponse] value failed for JSON property aAchievements due to missing (therefore NULL) value for creator parameter aAchievements which is a non-nullable type
JSON decoding error: Cannot deserialize instance of `java.util.ArrayList` out of FIELD_NAME token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of FIELD_NAME token

Nakonec jsem přišel na to, že z nějakého důvodu com.fasterxml.jackson v tomto případě nezvládá camel case názvy proměnných. Řešením bylo toto pojmenování:

data class GetAchievementsResponse(
        val a_achievements: List<AchievementInfo>,
        val r_achievements: List<AchievementInfo>
)