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

Telegram – chat bot

Přeskočíme kecy o botech a rovnou se pustíme do práce. Největší platformou pro chatovací boty s otevřeným API nabízí Telegram. Dnes si ukážeme, jak si vytvořit bota, který bude interagovat na uživatelovo požadavky.

Vytvoření bota

Všechny boty vytváříme u toce botů – BotFather. Uděláme to tak, že v seznamu konverzací vyhledáme BotFather. V detailu konverzace vytvoříme nového bota příkazem /newbot a postupujeme podle pokynů.

Budete vyzváni na jméno bota (libovolné znaky včetně diakritiky) a následně na uživatelské jméno bota: slovo bez diakritiky, mezer s příponou bot nebo _bot. Uživatelské jméno musí být v celém Telegramu jedinečné.

Po vytvoření bota bude zobrazeno jeho API access token – dále jen token. Ten si pečlivě uchovejte a nikomu ho nesdělujte – slouží k ovládání bota.

Ovládání bota

V Telegramu existují dva způsoby, jak získat zprávy poslané botovi: long polling a webhooks

Long pooling

Při tomto přístupu se periodicky doptáváte API Telegramu na nové zprávy. Musíte vhodně nastavit periodu doptávání se na nové zprávy.

Webhooks

Při tomto přístupu je při každé interakci s botem zpráva odeslaná i na náš server. Tento přístup mám raději, protože vypadá jako komunikace v reálném čase.

V tomto článku si popíšeme použití webhooks. Pro použití webhooks potřebujeme php script, který běží na veřejné adrese s HTTPS certifikátem. Pro naši ukázku například: https://www.venca-x.cz/bot/pocasi.php

Teď trochu přeskočíme obsah souboru pocasi.php a rovnou tento script zaregistrujeme aby byl zavolán a přijal zprávu od našeho bota. To provedeme příkazem:

https://api.telegram.org:443/bot[token]/setwebhook?url=https://www.venca-x.cz/bot/pocasi.php 

Příkaz zadáme do URL v prohlížeči. Měli bychom obdržet hlášku s úspěšným nastavením webhooku:

 {"ok":true,"result":true,"description":"Webhook was set"}

Vytvoření bota

Zahájíme chat s uživatele BotFather, kterému pošleme následující požadavky

/newbot

Budete vyzváni pro přesdívku bota a následně budete vyzváni pro zadání uživatelského jména bota. Uživatelské jmeno musí končit na slovo „bot“.

Po vytvoření bota získáte token pro přístup k API Telegramu. Token si pečlivě uložte, budeme ho potřebovat.

Nastavení webooks botovi

Nyní botovi musíme nastavit URL adresu, na kterou bude přeposílat požadavky. Do vašeho prohlížeče zadáme následující URL adresu:

https://api.telegram.org/bot*TOKEN*/setwebhook?url=*https:/ /example.domain/path/to/bothook.php*

Slovo *TOKEN* nahraďte API tokenem, získaným při vytvoření bota.
*https:/ /example.domain/path/to/bothook.php* nahraďte vaší adresou, kde jsme zprovoznili jednoduchou ukázku vracející JSON.

Oživení bota

Bota máme vytvořeného, zaregistrovaný webhook, který nám přeposílá zprávy poslané botovi. Pojďme bota oživit aby zprávy zpracovával a reagoval na ně.

Pro práci s bot API se mi zalíbila knihovna telegram-bot/api nainstalujeme ji:

composer require telegram-bot/api

Super, konečně jsme se dostali na příjem zpráv a reagování na ně. Na zprávu /ping odpoví bot zprávou pong:

<?php

require_once "vendor/autoload.php";

try {
$bot = new \TelegramBot\Api\Client('YOUR_BOT_API_TOKEN');
$bot->command('ping', function ($message) use ($bot) {
$bot->sendMessage($message->getChat()->getId(), 'pong!');
}); $bot->run();
} catch (\TelegramBot\Api\Exception $e) {
$e->getMessage();
}

Nezapomeňte místo YOUR_BOT_API_TOKEN nastavit váš token z vytváření bota.

Klávesnice pro ovládání bota

Bota můžeme ovládát i přes speciální klávesnici pro rychlé volby. Po zadání příkazu /start přivítáme návštěvníka a zobrazíme mu klávesnici s rychlou volbou:

$bot->command('start', function ($message) use ($bot) {

$keyboard = new \TelegramBot\Api\Types\ReplyKeyboardMarkup(array(array("/pocasi", "/ping")), true);

$bot->sendMessage($message->getChat()->getId(), 'Vítejte počasí', null, false, null, $keyboard);

});