Перейти до основного вмісту

Публікації

Callbacks, Promises, async/await в Node.js

Node.js однопотоковий і використовує неблокуючий I/O. Замість створення нових потоків, Node.js реєструє callback-функції, які викликаються, коли операція завершується. Це схоже на CompletableFuture у Java, але є основним способом роботи. 1. Callbacks: Перший підхід до асинхронності Callback — це функція, яку ви передаєте як аргумент і яка викликається після завершення операції. У Java це можна порівняти з передачею Consumer або Function як параметра. // Node.js - callback pattern import fs from 'fs'; // Error-first callback convention fs.readFile('user.json', 'utf8', (err, data) => { if (err) { console.error('Помилка читання файлу:', err); return; } console.log('Дані:', data); }); console.log('Цей рядок виведеться ПЕРШИМ!'); Конвенція Error-First Callback: Перший параметр завжди помилка (або null), другий — результат. Це стандарт у Node.js. Приклад: HTTP-запит з call...

Event Loop в Node.js

Event Loop в Node.js: архітектура, фази, черги Event Loop — це серце асинхронності в Node.js. Якщо ви знайомі з Java, то знаєте про багатопотоковість та Thread Pool. Node.js працює інакше: замість створення окремих потоків для кожного запиту, він використовує єдиний потік і Event Loop для обробки всіх операцій. Порівняння з Java/Spring Boot Java/Spring Boot (традиційна модель): Кожен HTTP-запит обробляється окремим потоком з Thread Pool Якщо потік блокується на I/O операції (база даних, файл), він чекає Обмежена кількість потоків (наприклад, 200) = максимум 200 одночасних запитів Node.js (асинхронна модель): Один основний потік (Event Loop) I/O операції делегуються системі (libuv), потік не блокується Може обробляти тисячі одночасних підключень на одному потоці // Java - блокуючий виклик String data = readFile("file.txt"); // потік чекає System.out.println(data); /...

Рекурсія в Elixir

Рекурсія — це коли функція викликає саму себе. В Elixir, де немає циклів, рекурсія є основним способом обробки колекцій та повторюваних операцій. Проста рекурсія Базова рекурсивна функція складається з двох частин: базового випадку та рекурсивного виклику: # Факторіал defmodule Math do def factorial(0), do: 1 def factorial(n) when n > 0 do n * factorial(n - 1) end end Math.factorial(5) # 120 (5 * 4 * 3 * 2 * 1) # Сума списку defmodule ListHelper do def sum([]), do: 0 def sum([head | tail]) do head + sum(tail) end end ListHelper.sum([1, 2, 3, 4, 5]) # 15 Примітка: Базовий випадок (наприклад, порожній список або 0) запобігає нескінченній рекурсії. Проблема простої рекурсії Проста рекурсія створює стек викликів, що може призвести до переповнення пам'яті: # Неефективна рекурсія def factorial(5) 5 * factorial(4) 4 * factorial(3) 3 * factorial(2) 2 * facto...

Модулі в Elixir

Модулі — це основний спосіб організації коду в Elixir. Вони групують пов'язані функції разом і створюють простори імен, що дозволяє уникнути конфліктів імен та структурувати програму. Базове визначення модуля Модулі визначаються за допомогою ключового слова defmodule : # Простий модуль defmodule Greeting do def hello do "Привіт, світ!" end def hello(name) do "Привіт, #{name}!" end end # Виклик функцій модуля Greeting.hello() # "Привіт, світ!" Greeting.hello("Олексій") # "Привіт, Олексій!" Публічні та приватні функції Функції можуть бути публічними ( def ) або приватними ( defp ): defmodule Calculator do # Публічна функція - доступна ззовні def calculate(a, b, operation) do case operation do :add -> add(a, b) :subtract -> subtract(a, b) :multiply -> multiply(a, b) :divide -> divide(a, b) end ...

Анонімні функції в Elixir

Анонімні функції (lambda-функції) — це функції без імені, які можуть бути присвоєні змінним, передані як аргументи або повернуті з інших функцій. Вони є основою функціонального програмування в Elixir. Базовий синтаксис Анонімні функції створюються за допомогою ключових слів fn та end : # Проста анонімна функція add = fn a, b -> a + b end # Виклик анонімної функції (з крапкою!) result = add.(5, 3) # result = 8 # Функція без параметрів greet = fn -> "Привіт!" end greet.() # "Привіт!" # Багаторядкова функція calculate = fn x, y -> sum = x + y product = x * y {sum, product} end calculate.(4, 5) # {9, 20} Важливо: Для виклику анонімних функцій використовується крапка . перед дужками: func.(args) . Це відрізняє їх від іменованих функцій. Скорочений синтаксис (&) Elixir пропонує скорочений синтаксис для простих анонімних функцій за допомогою оператора & : ...

Шпаргалка по Docker та Docker Compose

Docker - Робота з образами Завантаження образу docker pull nginx docker pull nginx:latest docker pull nginx:1.21 Список локальних образів docker images docker image ls Видалення образу docker rmi nginx docker rmi nginx:1.21 docker image rm nginx Видалення всіх невикористовуваних образів docker image prune docker image prune -a Побудова образу з Dockerfile docker build -t myapp:1.0 . docker build -t myapp:latest -f Dockerfile.prod . Тегування образу docker tag myapp:1.0 myapp:latest docker tag myapp:1.0 myregistry.com/myapp:1.0 Відправлення образу в registry docker push myregistry.com/myapp:1.0 Docker - Робота з контейнерами Запуск контейнера docker run nginx docker run -d nginx docker run -d --name mynginx nginx docker run -d -p 8080:80 nginx docker run -d -p 8080:80 -v /host/path:/container/path nginx docker run -d -e MY_VAR=value ...

Встановлення Visual Studio Code на Ubuntu

Visual Studio Code (VS Code) — це потужний, легкий та кросплатформний редактор коду, який став стандартом для розробників завдяки універсальності та швидкості роботи. Він підтримує Windows, Linux і macOS, запускається швидше за повноцінні IDE, але водночас може перетворюватися на повнофункціональне середовище розробки завдяки тисячам розширень. VS Code має продуману архітектуру, інтуїтивний інтерфейс, вбудований термінал та інтелектуальну систему автодоповнення на базі Language Server Protocol, що забезпечує високоякісну підтримку синтаксису для багатьох мов програмування. Серед ключових можливостей — розумне автодоповнення коду (IntelliSense), навігація між класами, символами та файлами, рефакторинг, форматування коду, інтеграція з Git, підтримка віддаленої розробки через SSH або контейнерні середовища (Dev Containers). Завдяки відлагоджувачу (debugger), який налаштовується під будь-яку мову, розробник може запускати код у контрольованому середовищі, ставити брейкпоїнти, переглядат...

Керуючі конструкції в Elixir

Elixir пропонує різноманітні керуючі конструкції для управління потоком виконання програми. На відміну від імперативних мов, всі конструкції в Elixir повертають значення, що робить код більш виразним. if та else Конструкція if перевіряє умову і виконує код відповідно до результату: # Базовий синтаксис if true do "Це буде виконано" else "Це не буде виконано" end # Однорядковий варіант if connected?, do: "Підключено", else: "Відключено" # Присвоєння результату message = if age >= 18 do "Ви повнолітній" else "Ви неповнолітній" end # Без else (повертає nil) if user_logged_in? do show_dashboard() end Примітка: В Elixir тільки false і nil вважаються хибними. Всі інші значення (включаючи 0, "", []) вважаються істинними. unless Конструкція unless — це протилежність if, виконується коли умова хибна: # ...

Pull Request на GitHub

Ця інструкція показує, як зробити pull request у приватному репозиторії GitHub у цільову гілку dev . Наведено два сценарії: коли у тебе є права write (можна пушити напряму) і коли є лише read (потрібен fork). 1. Підготовка — клонування репозиторію Якщо ще не клоновано репозиторій на локальну машину: git clone git@github.com:OWNER/REPO.git cd REPO 2. Перевірити і оновити гілку dev Переконайся, що працюєш від актуальної бази: git checkout dev git pull origin dev 3. Створити нову гілку для змін Назви гілку зрозуміло (наприклад feature/add-search або bugfix/login-fix ): git checkout -b my-feature-branch 4. Внести зміни і закомітити # Редагуєш файли в редакторі... git add . git commit -m "Опис змін: додано ... / виправлено ..." 5. Сценарій A — У тебе є права запису (write access) Якщо власник репозиторію дав тобі права write , ти можеш пушити прямо в оригінальний репозиторій: git push origin my-feature-branch Потім на GitHub:...

Зіставлення по зразку в Elixir

Зіставлення по зразку (pattern matching) — це одна з найпотужніших можливостей мови Elixir. Це не просто присвоєння значень змінним, а механізм для деструктуризації даних та перевірки їхньої структури. Основи зіставлення В Elixir оператор = — це не оператор присвоєння, а оператор зіставлення. Він намагається зробити ліву частину рівною правій. # Проста змінна x = 1 # x тепер дорівнює 1 # Зіставлення зі значенням 1 = x # Це працює, тому що x = 1 # Помилка зіставлення 2 = x # ** (MatchError) no match of right hand side value: 1 Зіставлення зі списками Зіставлення дозволяє витягувати елементи зі списків: # Зіставлення всього списку [a, b, c] = [1, 2, 3] # a = 1, b = 2, c = 3 # Виділення голови та хвоста [head | tail] = [1, 2, 3, 4] # head = 1, tail = [2, 3, 4] # Ігнорування елементів [_, second, _] = [10, 20, 30] # second = 20 Зіставлення з кортежами Кортежі часто використовуються для зістав...