Kotlin JavaFX Hello World

Build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.4.10"
    id("org.openjfx.javafxplugin") version "0.0.9"
}

group = "cz.vitfo.redgui"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

tasks.withType() {
    kotlinOptions.jvmTarget = "11"
}

javafx {
    version = "15.0.1"
    modules = listOf("javafx.controls")
}

Třída dědící z javafx.application.Application

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

class FXApplication : Application() {
    override fun start(stage: Stage) {
        val javaVersion = System.getProperty("java.version")
        val javafxVersion = System.getProperty("javafx.version")
        val l = Label("Hello, JavaFX $javafxVersion, running on Java $javaVersion.")
        val scene = Scene(StackPane(l), 640.0, 480.0)
        stage.scene = scene
        stage.show()
    }

    fun main(args: Array) {
        launch()
    }
}

fun main(args: Array) {
    FXApplication().main(args)
}

Výsledná aplikace

Zdroj: github.com/openjfx/samples/blob/master/HelloFX/Gradle/hellofx/src/main/java/HelloFX.java

Kotlin Swing Hello World

import java.awt.EventQueue
import javax.swing.JFrame

class Application : JFrame() {

    init {
        title = "Hello world"
        defaultCloseOperation = JFrame.EXIT_ON_CLOSE
        setSize(400, 300)
        setLocationRelativeTo(null)
    }
}

fun main() {
    EventQueue.invokeLater {
        val window = Application()
        window.isVisible = true
    }
}

Přehled jednotlivých komponent Swingu: web.mit.edu/6.005/www/sp14/psets/ps4/java-6-tutorial/components.html

Node.js Hello World

Index.js

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((request, response) => {
    response.statusCode = 200;
    response.setHeader('Content-Type', 'text/plain');
    response.end('Hello World!');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

Chyba při instalaci electron-forge

Pokud při instalaci electron-forge

sudo npm i -g @electron-forge/cli

dostanete chybu

Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/@electron-forge/cli/node_modules/lzma-native/.node-gyp'

zkuste

sudo npm install -g electron-forge --unsafe-perm=true --allow-root

Zdroj: stackoverflow.com/questions/47247443/electron-js-install-error-error-eacces-permission-denied

Redisson master slave config

Konfigurace master slave Redis klienta (Redisson) s konfigurací pro docker-compose.

redisson.json

{
  "masterSlaveServersConfig": {
    "idleConnectionTimeout": 10000,
    "connectTimeout": 10000,
    "timeout": 3000,
    "retryAttempts": 3,
    "retryInterval": 1500,
    "failedSlaveReconnectionInterval": 3000,
    "failedSlaveCheckInterval": 60000,
    "password": null,
    "subscriptionsPerConnection": 5,
    "clientName": null,
    "subscriptionConnectionMinimumIdleSize": 1,
    "subscriptionConnectionPoolSize": 50,
    "slaveConnectionMinimumIdleSize": 24,
    "slaveConnectionPoolSize": 64,
    "masterConnectionMinimumIdleSize": 24,
    "masterConnectionPoolSize": 64,
    "readMode": "SLAVE",
    "subscriptionMode": "SLAVE",
    "slaveAddresses": [
      "redis://127.0.0.1:32781",
      "redis://127.0.0.1:32782",
      "redis://127.0.0.1:32783"
    ],
    "masterAddress": "redis://127.0.0.1:32780",
    "database": 0
  },
  "threads": 16,
  "nettyThreads": 32,
  "transportMode": "NIO"
}

docker-compose.yml

version: '2'services:
  redis-master:
    image: 'bitnami/redis:latest'
    ports:
      - '6379'
    environment:
      - REDIS_REPLICATION_MODE=master
      - ALLOW_EMPTY_PASSWORD=yes
    volumes:
      - '/home/vitfo/Redis/volume'  redis-replica:
    image: 'bitnami/redis:latest'
    ports:
      - '6379'
    depends_on:
      - redis-master
    environment:
      - REDIS_REPLICATION_MODE=slave
      - REDIS_MASTER_HOST=redis-master
      - REDIS_MASTER_PORT_NUMBER=6379
      - ALLOW_EMPTY_PASSWORD=yes

docker-compose up –scale redis-master=1 –scale redis-replica=3 vytvoří:

CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                     NAMES
dbb2a6f2bdae        bitnami/redis:latest   "/opt/bitnami/script…"   13 seconds ago      Up 11 seconds       0.0.0.0:32781->6379/tcp   redis_redis-replica_3
44adb500c854        bitnami/redis:latest   "/opt/bitnami/script…"   13 seconds ago      Up 10 seconds       0.0.0.0:32782->6379/tcp   redis_redis-replica_2
72e8bdc566b0        bitnami/redis:latest   "/opt/bitnami/script…"   13 seconds ago      Up 9 seconds        0.0.0.0:32783->6379/tcp   redis_redis-replica_1
c4b64430a2ca        bitnami/redis:latest   "/opt/bitnami/script…"   14 seconds ago      Up 12 seconds       0.0.0.0:32780->6379/tcp   redis_redis-master_1

Zdroje:

Jak vytvořit like dotazy ve Spring Data

V tomto příspěvku ukáži, jak lze vytvořit sql dotazy s LIKE ve Spring Data bez pomoci @Query anotace. Budeme mít entitu kniha

@Entity
@Table(name = "t_book")
@SequenceGenerator(initialValue = 100, name = "t_book_seq_gen", sequenceName = "t_book_seq")
class BookEntity (
        @Id
        @GeneratedValue(generator = "t_book_seq_gen", strategy = GenerationType.SEQUENCE)
        var id: Long = 0L,

        var author: String = "",

        var publisher: String = "",

        var title: String = "",

        ...
)

a vytvoříme si jpa repository

Číst dálJak vytvořit like dotazy ve Spring Data

Spring CommandLineRunner

CommandLineRunner je funkční rozhraní s metodou void run(String... args) throws Exception. V této metodě můžeme uvést vše, co chceme aby se stalo a startu aplikace. Jednou z možností jak vytvořit CommandLineRunner je vlastní třída s anotací @Configuration a následně metoda s anotací @Bean vracející CommandLineRunner

@Configuration
class AppConfig {

    @Bean
    fun init(bookRepository: BookRepository): CommandLineRunner {
        return CommandLineRunner {
            bookRepository.save(BookEntity(title = "Cyber Leviathan"))
            bookRepository.save(BookEntity(title = "Last Hunt"))
        }
    }
}

Jiný způsob je extendovat CommandLineRunner a implementovat metodu run()

@SpringBootApplication
class SpringData2Application : CommandLineRunner {
	override fun run(vararg args: String?) {
		println("Running ...")
	}
}

fun main(args: Array<String>) {
	runApplication<SpringData2Application>(*args)
}

 

ISO duration a Java (ISO 8601 duration format)

Java má metodu Duration.parse("duration-string"), která vypadá, jako by pracovala s ISO duration, ale není tomu tak. Dokáže parsovat použe tyto suffixy D (day), H (hour), M (minute), S (second).

Takže toto je správně:

Duration.parse("P1D") // jeden den

ale toto je chybně

Duration.parse("P1M") // správně by to bylo "PT1M" ale neznamená to 1 měsíc, ale 1 minutu.

Číst dálISO duration a Java (ISO 8601 duration format)

Vytvoření tabulek pro spring batch

Spring Batch obsahuje inicializační SQL skripty pro většinu populárních databází (více v tomto příspěvku). Spring Boot dokáže detekovat databázi a spustit správný skript při startu aplikace. Pokud chcete, aby Spring Batch vytvořil potřebné tabulky, přidejte do konfiguračního souboru

spring.batch.initialize-schema=always

Vypnutí této funkcionality

spring.batch.initialize-schema=never

Zdroj: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-initialize-a-spring-batch-database