Redis v kontejneru

Redis (zkratka z anglického „Remote Dictionary Server“) je open-source in-memory key-value úložiště (NoSQL databáze) s otevřeným zdrojovým kódem. Redis byl původně vytvořen jako rychlý a efektivní způsob ukládání a získávání dat v paměti (in-memory database) pro zlepšení výkonu webových aplikací. Často se používá pro ukládání cache.

In-Memory storage: Redis ukládá data přímo v paměti, což ho dělá extrémně rychlým. To z něj činí vhodný nástroj pro cache, rychlé ukládání a získávání dat a další aplikace, které vyžadují nízkou latenci.

Key-Value store: Redis ukládá data ve formátu klíč-hodnota, to znamená, že každý záznam má jedinečný klíč, pod kterým je uložen. Data jsou obvykle binární nebo textové, a Redis umožňuje rychlé vyhledávání a získávání dat na základě klíče.

Podpora datových struktur: Redis nepodporuje pouze jednoduché hodnoty, ale také různé datové struktury jako seznamy, množiny, hashovací mapy a další. To umožňuje složitější operace s daty a efektivní manipulaci s nimi.

Pub/Sub mechanismus: Redis umožňuje publikování a odběr zpráv, to je užitečné pro asynchronní komunikaci mezi částmi aplikace.

Perzistence dat: Redis umožňuje volitelnou perzistenci dat na disk, což zajišťuje, že data nejsou ztracena po restartu serveru.

Clustering: Redis podporuje klustering, to umožňuje škálovat databázi na více serverů a zlepšit výkon a dostupnost.

Redis je často používán pro ukládání chache, asynchronní fronty zpráv, čítačky stavů a mnoho dalších aplikací, které vyžadují rychlé ukládání a získávání dat. Jeho jednoduchý a efektivní design ho činí oblíbeným nástrojem pro vývojáře v celé řadě aplikací a scénářů.

Založíme soubor docker-compose.yml :

version: '3.8'

services:
  redis:
    image: "redis:latest"
    container_name: redis
    ports:
      - "6379:6379"

Spustíme příkazem: docker-compose up nebo na pozadí příkazem: docker-compose up -d

RabbitMQ v kontejneru

Dnes si ukážeme jak jednoduše rozject RabbitMQ v dokcer kontejneru. Pro orchestraci použijeme docker compose.

Založíme soubor docker-compose.yml :

version: '3.4'

services:

  rabbitmq:
    image: rabbitmq:3-management
    hostname: "rabbitmq"
    labels:
      NAME: "rabbitmq"
    ports:
      - "4369:4369"
      - "5671:5671"
      - "5672:5672"
      - "25672:25672"
      - "15671:15671"
      - "15672:15672"
    environment:
      RABBITMQ_DEFAULT_USER: "username"
      RABBITMQ_DEFAULT_PASS: "password"

Spustíme příkazem: docker-compose up nebo na pozadí příkazem: docker-compose up -d

RabbitMQ je message broker, který používá protokol AMQP (Advanced Message Queuing Protocol) k usnadnění komunikace mezi různými aplikacemi. RabbitMQ běží na určitých síťových portech, které jsou důležité pro jeho funkčnost a komunikaci. Zde jsou některé z portů, které RabbitMQ používá:

4369: Tento port je používán pro Erlang Port Mapper Daemon (EPMD). EPMD je procesový démon, který umožňuje komunikaci mezi různými uzly v distribuovaném Erlangu, což je jazyk, na kterém je postaven RabbitMQ.

5671: Tento port je také asociován s AMQP, ale používá zabezpečený protokol SSL/TLS pro šifrovanou komunikaci. Je vhodné použít tento port pro bezpečnou komunikaci přes AMQP.

5672: Toto je výchozí port pro běžné spojení AMQP v RabbitMQ. Pokud není specifikován jiný port, klienti budou komunikovat přes tento port.

25672: Tento port je určen pro meziserverovou komunikaci mezi uzly v clusteru RabbitMQ, pokud je váš RabbitMQ nasazen jako cluster.

15671: Stejně jako port 5671, tento port umožňuje zabezpečenou komunikaci pomocí SSL/TLS, ale je určen pro webové rozhraní RabbitMQ Management Plugin.

15672: Toto je port pro RabbitMQ Management Plugin, což je webové rozhraní pro správu RabbitMQ. Pomocí tohoto rozhraní můžete monitorovat a spravovat své RabbitMQ instance.

Do webového rozhraní tedy můžeme nahlédnout přes URL http://localhost:15672

Defaultní uživatelské jméno: guest a heslo: guest
My jsme si změnili uživatelské jméno: user a heslo: password

C# Dynamický datový typ

Objčas potřebujeme udělat dynamicky malý objekt, kterému nastavíme parametry a pošleme ho dál. Ano, je to ošklivé, nemělo by se to dělat ale občas se to prostě hodí 🙂

dynamic flowCalculator = new
{
   Medium = inputData.HeaterEnum.ToString(),
   WaterTempIn = 80,
   WaterTempOut = 60

};

Jednoduše do toho dynamicky vygenerovaného objektu můžeme přidat další propertu:

if (inputData.MediumEnum == Medium.GLYCOL)
{
   flowCalculator.Concentration = inputData.Concentration;
}

System.Text.Json deserializace case insensitive

V C# objektu nazýváme property PascalCase s velkým písmenem na začátku.

    public class StudentDto
    {

        public long Id { get; set; }
        public string FirstName { get; set; }
        public double LastName { get; set; }
    }

Pokud na tento objekt chceme namapovat json, většinou narazíme na problém s rozdnou velikostí písmen a property se z jsonu nenamapují:

json:

{
    "id": 1,
    "firstName": "Jan",
    "lastName": "Novák"

}

Desertializace:

var student = JsonSerializer.Deserialize<Student>(jsonString);

Property v objektu zůstanou prázdné, protože nedošlo k namapování z jsonu (rozdílná velikost písmen)

Deserializace jsonu case insensitive

Serializeru můžeme nastavit propertu aby nerozlišoval velokost písmen:

var options = new JsonSerializerOptions 
{ 
    PropertyNameCaseInsensitive = true 
}; 

var student = JsonSerializer.Deserialize<Student>(jsonString, options);

Quasar

Inicializace projektu

$ npm i -g @quasar/cli 
$ npm init quasar

Spuštění projektu

cd projek-folder
quasar dev

Nová komponenta

quasar new component <name> [--format ts]

Boot soubor

quasar new boot <name> [--format ts]

Základní příkazy

$ quasar
   ...
   Commands
      init       Create a project folder
      dev       Start a dev server for your App
      build       Build your app for production
      clean       Clean all build artifacts
      new       Quickly scaffold page/layout/component/... vue file
      mode       Add/remove Quasar Modes for your App
      info       Display info about your machine and your App
      serve       Create an ad-hoc (production-ready) server on App distributables
      help       Displays this message

Vue.js 3 – Hello world

npm create vue@3

Budeme vyzváni k zadání:

  • názvu projektu
  • podpory TypeStcriptu
  • podpory JSX
  • testů, ESlintu, …

Po vytvoření kostry projektu stačí nainstalovat balíčky a projekt spustit:

cd vue-project
npm install
npm run dev

Tip

Pokud se při spuštění vyskytnou problémy (failed to load config from vite.config.js, Error: Cannot find module ‚node:url‘, …) aktualizujte node.js na najnovější LTS verzi.

Spuštění projektu

Pokud vše prošlo, uvidíte v konzoli:

VITE v4.0.4 ready in 307 ms

➜ Local: http://localhost:5173/
➜ Network: use –host to expose
➜ press h to show help

Otevřee internetový prohlížeč a zadejte do něj adresu z konzole: http://localhost:5173/

React – Hello world

Vygenerování nové aplikace:

npx create-react-app hello-world

Spustit příkazem:

cd hello-world
npm start

Komponenty

npx generate-react-cli component Box

Do app.js přidat:

import Box from './components/Box/Box';
...
  return (
    <div className="App">
      <header className="App-header">
        <Box></Box>
      ...

npm start
Starts the development server.

npm run build
Bundles the app into static files for production.

npm test
Starts the test runner.

npm run eject
Removes this tool and copies build dependencies, configuration files
and scripts into the app directory. If you do this, you can’t go back!

.Net + EF core – database first – MySql

Entity Framework je populární ORM (Object-Relational Mapping) framework pro aplikace v .NET, který vám umožňuje pracovat s databází. Při použití Entity Frameworku, si můžete vybrat mezi dvěma hlavními přístupy: Code First a Database First. V tomto případě chcete pracovat s databází MySQL pomocí přístupu Database First, což znamená, že generujete třídy entit z existující databáze. Vygenerování modelových tříd z DB tabulek se nazývá scaffolding. Dnes si ukážeme jak toho dosáhnout v .NET6 a Entity Frameworku pro MySql databázi.

Přes Package Manager Console nainstalujte Entity Framework Core a MySQL Provider

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Design
Install-Package Pomelo.EntityFrameworkCore.MySql

Vygenerujeme entity z tabulek DB

Použijte Entity Framework Core CLI k vytvoření databáze. Otevřete příkazový řádek, přejděte do adresáře vašeho projektu a použijte:

dotnet ef dbcontext scaffold "server=localhost;user=root;password=xxx;database=app_cz" "Pomelo.EntityFrameworkCore.MySql" --output-dir Models -f

Tím pro každou tabulku vygenerujeme do složky Models odpovídající modelovou třídu a DbContex soubor (v našem případě AppCzContext.cs)

Pozor: ve vygenerovaném AppCzContext.cs je automaticky doplněn server a přístupové údaje k DB. Není vhodné tyto údaje na tomto místě držet, měly by se načítat z appsettings.json. Ale o tom zase někdy příště 🙂

Jednoduché použití DbContextu

Získáme všechny uživatele:

using (var dbContext = new AppCzContext())
{
   var users = dbContext.Users.ToList();
}

Pozor: jedná se o jednoduchou ukázku. Lepší řešení je si přes DI injecntou DB context. Ale o tom zaseněkdy příště

Angular – Hello world

Instalace

  1. Nainstalovat Node.js https://nodejs.org/en/
  2. Po nainstalovaná Node.js začnou v příkazové řádce fungovat příkazy:
    node –version
    npm –v
  3. Nainstalujeme Angular CLI: npm install -g @angular/cli
    Po nainstalování začne fungovat příkaz zobrazující verzi Angular CLI:
    ng –version

První aplikace – Hello world

Skelet první aplikace vygenerujeme příkazem:

ng new hello-world

Budeme dotázání, zda chceme použít knihovnu Angular routing a jaký stylesheet chceme použít pro stylování (SCSS, Sass, Less, Stylus). Stačí potvrdit předpřipravené hodnoty, nebo vyberte to co umíte.

Pří kazové řádce vstoupíme do složky s vytvořeným projektem:

cd hello-world

Spustíme aplikaci:

ng serve

Aplikace se defaultně spustí na portu 4200. Teď jen do internetového prohlížeče zadáte adresu: http://localhost:4200/ kde rovnou vidíte výsledek.

Pokud chcete aplikaci spustit na jiném portu, provedete to příkazem:

ng serve --port 7777

Úprava kódu

Nyní se můžete vrhnout a úpravu kódu. Všechny úpravy můžete průběžně kontrolovat v internetovém prohlížeči, kde se projevují bez nutnosti ručního obnovení stránky. Skvělé.

Nová komponenta

Pro znovu použitelnost kód který využíváme na několika místech dáváme do komponent. Komponentu vygenerujeme:

ng generate component hero-detail

Node,js PM2

PM2 (Process Manager 2) je správce procesů pro Node.js, který vám pomůže spravovat a udržovat vaše aplikace v chodu. Pojďme se podívat na základy.

Instalace

npm install pm2 -g

Spuštění aplikace

pm2 start app.js

Správa aplikací

$ pm2 restart app_name
$ pm2 reload app_name
$ pm2 stop app_name
$ pm2 delete app_name

app_name nahraďte:

  • all pro všechny aplikace
  • id konkrétního procesu

Seznam spravovaných aplikací

Krásně vidíte status aplikace, přidělený výkon procesoru a paměti

pm2 [list|ls|status]

Zobrazení logu

pm2 logs

Zobrazení staršího logu:

pm2 logs --lines 200

Zobrazení řídícího panelu zobrazující realtime data z aplikace

pm2 monit