Zobrazení datového typu v Idea IDE v Kotlinu

Kotlin na rozdíl od Javy nenutí vývojáře aby psal typ proměnné, protože tuto informaci si je schopen sám odvodit. Nevýhodou může být, že v kódu není u proměnné vidět její typ. To lze ale změnit v nastavení vývojového prostředí.

File -> Settings -> Editor -> Inlay Hints Zde je možno specifikovat pro jaký jazyk se mají hinty zobrazovat.

File -> Settings -> Editor -> Inlay Hints -> Kotlin -> Parameter hints -> Types Kde se určuje jaké typy hintů chcete vidět.

Zdroj: stackoverflow.com/questions/54851861/how-do-i-activate-type-annotations-hints-in-kotlin-like-depicted

Node.js a Express Hello World

Express je framework pro práci s Node.js.

Vytvoření kostry aplikace:

  • npm init –yes
  • npm install express
  • vytvořit soubor index.js

index.js

const express = require('express');
const app = express();

app.listen(3000, () => console.log('Listening on port 3000...'));

app.get('/hello', (req, res) => {
    res.send("Hello");
});

Spuštění

node index.js
Listening on port 3000...

Výsledek bude na adrese http://localhost:3000/hello.

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)
}