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.

Nastavení verze Javy v Idea IDE

Několikrát se mi již stalo, že nově vytvořený, nebo nějak modifikovaný projekt, nešlo sbuildovat z důvodu, že Idea hlásila, že verze Javy je nastavena na 1.5 a daná konstrukce požaduje verzi 7, nebo 8, nebo vyšší. Pozor, existuje více míst, kde je nutné verzi pro projekt (nebo modul) nastavit.

File -> Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler
File -> Project Structure -> Project
File -> Project Structure -> Modules -> Sources
File -> Project Structure -> SDKs

Rozdíl mezi rozhraním a statickou třídou v Javě

Java 8 zavedla defaultní metody v rozhraní, čímž trochu smyla rozdíl mezi rozhraním a abstraktní třídou. V tomto příspěvku se tedy podíváme blíže na rozhraní, jejich defaultní metody, abstraktní třídy a rozdíly mezi rozhraními a abstraktními třídami. Defaultním metodám se věnoval i tento dřívější příspěvek.

Rozhraní:
Může obsahovat statické metody.
Může obsahovat metody, které jsou implementovány (mají tělo).
Pro implementaci rozhraní se používá klíčové slovo implements.
Rozhraní nemůže mít instanční proměnné.
Rozhraní může mít pouze proměnné typu public static final (konstanty).
Metody v rozhraní jsou defaultně public abstract.

Číst dálRozdíl mezi rozhraním a statickou třídou v Javě

Přidání jiné webové stránky do Vaadin view

Do Vaadin view lze jinou webovou stránku přidat velmi jednoduše. Pro vložení jiného webu do aktuální stránky se v HTML používá element <iframe>. IFrame (Inline Frame, do češtiny se překládá jako plovoucí rám) vymezuje plochu v aktuální stránce pro vložení jiné webové stránky. Do Vaadin view lze <iframe> vložit pomocí objektu BrowserFrame.

final BrowserFrame browserFrame = new BrowserFrame("Stránka inITjobs.cz", new ExternalResource("https://www.initjobs.cz"));
browserFrame.setWidth("100%");
browserFrame.setHeight("600px");
addComponent(browserFrame);

Pro zvýraznění jsem přidal elementu <iframe> ohraničení.

.v-browserframe iframe {
  padding: 10px;
  border: 1px solid black;
}

Nedaří se nainstalovat default-jdk na Ubuntu

Řešil jsem problém, že na serveru je oracle Java 8 a po zadání apt-get install default-jdk se nic nestalo. Chtěl jsem nainstalovat open jdk 11. Řešením je přidat open jdk do PPA (Personal Package Archiver). Pro instalaci open jdk 11 můžete použít následující příkaz:

sudo add-apt-repository ppa:openjdk-r/ppa \
&& sudo apt-get update -q \
&& sudo apt install -y openjdk-11-jdk

Následně je možné použít příkazy update-java-alternatives --list a update-alternatives --config java pro nastavení výchozí Javy.

Zdroje: