Instalace Linuxu z USB

Nedávno jsem měl příležitost zkoušet instalovat různé distribuce Linuxu (Fedora, Mint, Ubuntu) z USB disku. Zde jsou mé dojmy:

Fedora má vlastní program (Fedora Media Writer), který bootovatelné USB vytvoří.

Ubuntu na svých stránkách v tutoriálu o instalaci doporučuje vytvořit USB pomocí programu rufus. Ten není třeba instalovat.

Číst dálInstalace Linuxu z USB

Nelze spustit Tomcat 9

Při spuštění Tomcatu pomocí service tomcat9 start jsem dostával následující chybu:

WARNING: Unable to load server configuration from [/opt/tomcat9/conf/server.xml]
java.io.FileNotFoundException: /opt/tomcat9/conf/server.xml (Permission denied)
...
SEVERE: Cannot start server, server instance is not configured

Ani spuštění jako root, nebo změna chmod na souboru server.xml nepomohla. Nakonec stačilo přejít do složky se spouštěcími skripty .../tomcat9/bin a spustit startup.sh.

Java 9 Flow.Subscriber and Flow.Publisher

Java 9 představila Flow API, které umožňuje reaktivní programování. V tomto příspěvku vytvořím aplikaci, která se bude skládat z jednoho publishera, který vytváří data a dvou subscriberů, kteří data zpracovávají. Jeden ze subscriberů je dostatečně rychlý a zvládá data zpracovávat rychleji, než je publisher produkuje, druhý subscriber je výrazně pomalejší.

Číst dálJava 9 Flow.Subscriber and Flow.Publisher

Java 10 a novinka var

Lokální proměnné je od Javy 10 možné deklarovat s použitím klíčového slova var. Přemýšlel jsem, k čemu tato změna je a začal jsem googlit. Narazil jsem na názor, že var má snížit ukecanost (verbosity) Javy. Pokud máte lokální proměnnou, můžete ji deklarovat takto:

var name = "John";
var age = 25;

místo

String name = "John";
int age = 25;

Nevidíte v tom žádnou výhodu? Moc psaní jste neušetřili. Souhlasím. A co teď?

List<Map<String, Set<MyClass>>> cosi;
var cosi;

Zde již nějaké to psaní ušetříme, ALE. Pokud v kódu narazím na takovouto proměnnou a budu s ní pracovat, pravděpodobně si stejně zjistím, jakého je typu. Takže místo toho, abych to rovnou viděl, musím se prokliknout někam, kde je daný typ uveden např. CosiClass.getCosi();. A pokud používáte nástroje svého IDE, pravděpodobně tam je možnost, nechat si přiřadit návratovou hodnotu volání do proměnné (v Idea IDE to je Ctrl + Alt + V), takže to stejně nepíši. Trochu mi to připomíná debaty na téma psaní getterů a setterů, kdy některé jazyky tyto metody generují automaticky na základně specifické syntaxe. V Javě je možné použít knihovnu Lombok a nebo nechat své IDE tyto metody vygenerovat. Asi teprve čas ukáže, zda se tato novinka mezi vývojáři uchytí.

Poznámka ke Kotlinu
Kotlin má var (od variable) a val (od value), kdy val je finální. Místo final String name napíšete val name.

fun main(args: Array) {
    var str1 = "Ahoj"
    val str2 = "Ahoj"

    str1 = "Nazdar"
//    str2 = "Nazdar" - Chyba: value cannot be reassigned
}

Doporučuji k přečtení tyto články:
beyondjava.net/should-you-embrace-var-in-java-10
openjdk.java.net/projects/amber/LVTIstyle.html

Chyba relation „hibernate_sequence“ does not exist

Tuto chybu jsem dostal při použití Spring Data se Spring Boot a databází PostgreSQL. Takto vypadala třída definující entity.

@Entity
@Table(name = "t_login")
@SequenceGenerator(name = "t_login_id_seq_gen", sequenceName = "t_login_id_seq", allocationSize = 1)
data class Login(
        @Id
        @GeneratedValue
        var id: Long = 0,

        @Column
        var token: UUID = UUID.randomUUID()
)

Pro id bylo třeba více specifikovat @GeneratedValue:

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "t_login_id_seq_gen")

Tím se problém vyřešil.