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

Публікації

Bash-скрипти

Bash-скрипт — це текстовий файл, що містить послідовність команд для командної оболонки Bash , яка є стандартною для більшості Linux-дистрибутивів та macOS. Створення Bash-скрипта nano script.sh # створити файл у редакторі nano vim script.sh # або через vim touch script.sh # створити порожній файл Shebang (обов’язково на початку) Перший рядок скрипту, який вказує системі, який інтерпретатор використовувати для виконання файлу. #!/bin/bash # або більш універсально #!/usr/bin/env bash Надання прав на виконання chmod +x script.sh Запуск скрипта ./script.sh # запуск як виконуваного файлу bash script.sh # запуск через bash sh script.sh # запуск через sh (обережно: не всі фічі Bash підтримуються) Передача аргументів у скрипт ./script.sh arg1 arg2 # всередині скрипта: echo $1 # перший аргумент echo $2 # другий аргумент echo $@ # всі аргументи echo $# # кількість аргументів Обробка аргументів if [ $# -eq 0 ]; then ...

Базові команди Bash

Bash (Bourne Again SHell) — це оболонка командного рядка + мова сценаріїв, яка використовується для: виконання команд автоматизації задач написання скриптів Bash — це повноцінна мова програмування, але з важливим уточненням — це скриптова мова для автоматизації в Unix/Linux-середовищі, а не універсальна мова на рівні Java чи Python. Bash має всі базові можливості програмування: змінні умовні конструкції (if, case) цикли (for, while) функції обробку вводу/виводу роботу з файлами обробку помилок Основні команди pwd # показати поточну директорію ls # список файлів ls -la # детальний список (з прихованими) cd /path # перейти в директорію cd .. # на рівень вище clear # очистити термінал Робота з файлами та папками touch file.txt # створити файл mkdir dir # створити папку mkdir -p a/b/c # створити вкладені папки rm file.txt # видалити файл rm -r dir ...

GraalVM Native Image для прискорення Java-застосунків

GraalVM Native Image GraalVM Native Image — це технологія попередньої компіляції (ahead-of-time — AOT) Java-застосунків у самостійні нативні виконувані файли (бінарники). На відміну від звичайної Java, де код виконується у Java Virtual Machine (JVM), Native Image створює файл, який працює безпосередньо в операційній системі, значно прискорюючи запуск (за мілісекунди) та зменшуючи використання пам'яті. Ключові особливості та переваги: Миттєвий запуск . Програми запускаються практично миттєво, що критично важливо для Serverless (наприклад, AWS Lambda) та мікросервісів. Низьке споживання пам'яті . Native Image споживає значно менше оперативної пам'яті, оскільки не потребує завантаження віртуальної машини JVM, метаданих класів та JIT-компілятора. Самодостатність . Створений виконуваний файл містить лише необхідний код програми та бібліотек, що робить його меншим за розміром, ніж JAR-файл разом із JRE. Безпека та ізоляція . Нативні образи забезпечують закриту систему, в...

Apache Camel для інтеграції сервісів

Уявіть, що ваш застосунок отримує замовлення через REST API, повинен зберегти їх у базі даних, відправити підтвердження на пошту, поставити завдання у RabbitMQ і записати лог у файл. Написати це вручну — реально, але нудно та схильно до помилок. Apache Camel робить такі речі декларативно. Що таке Apache Camel Apache Camel — це open-source інтеграційний фреймворк для JVM, який реалізує класичні Enterprise Integration Patterns (EIP) з однойменної книги Гоппе та Вульфа. Перший реліз вийшов у 2007 році, і фреймворк досі активно розвивається. Головна ідея: є маршрути (routes) — трубопроводи, якими «течуть» повідомлення від джерела ( from ) до одержувача ( to ). По дорозі повідомлення можна трансформувати, фільтрувати, маршрутизувати та збагачувати даними. Коротко: Camel — це клей між різнорідними системами. Він не замінює брокери черг, БД чи HTTP-сервери, а з'єднує їх між собою. Мінімальний приклад Читаємо CSV-файли з папки та відправляємо кожен рядок у чергу Ra...

Термінал на Android

Часто є необхідність користуватися теміналом на ОС Android. Наприклад, для підключення по SSH до сервера. Для цього є кілька можливостей. Розглянемо досить популярну із них - Termux Для початку потрібно встановити F-Droid: зайти на сайт f-droid.org/ , завантажити apk-файл та встановити його на свій смартфон. Власне після цього можна встановити Termux , скориставшись пошуком у F-Droid (F-Droid - це альтернатива Google Play Market). Після цього можна запускати програму і користуватися терміналом. Важливо розуміти, що у Termux не можна напряму використовувати apt-репозиторії Debian/Ubuntu. Але є власний репозиторій пакетів, адаптований під Android (ARM, sandbox, відсутність root тощо). Наприклад, оновлення пакетів: pkg upgrade Встановити git pkg install git Встановити JDK25 pkg install openjdk-25 У репозиторії Termux є кілька тисяч пакетів, зокрема: gcc / clang python nodejs rust go php nginx redis postgres openssh neovim tmux Налаштування, як сервера З допом...

Запуск Java-проєкту з вказаною JDK через maven

Інколи виникає потреба запустити java-проєкт з використанням іншої JDK/JRE, ніж встановлена по замовчуванню і налаштована в Maven. Якщо це разовий запуск (або інша дія), то змінювати налаштування може зайняти більше часу, ніж хотілося б. В такому випадку можна використати, наприклад, наступні команди (для JDK 17). Всі приклади - для операційної системи Ubuntu. Замість mvn clean install JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH mvn clean install Запуск Spring Boot-проєкту: JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH mvn spring-boot:run -Dspring-boot.run.profiles=local Як подивитися, які версії JDK встановлені, описано тут . Варто зауважити, що важливою є не лише дефолтна версія JDK, а й налаштування Maven. Подивитися поточне значення JAVA_HOME можна командою: echo $JAVA_HOME Змінити налаштування: nano ~/.bashrc Потрібно додати/змінити рядки на зразок: M2_HOME="/...

Робота з кількома аккаунтами GitHub

Інколи потрібно з однієї машини працювати з різними GitHub-аккаунтами, використовуючи різні облікові дані та ключі. Можна використати локальну конфігурацію на рівні репозиторію. Заходимо в репозиторій і вводимо: git config user.name "Company Dev" git config user.email "your.corp.email@company.com" або відповідно git config user.name "Your Name" git config user.email "your.personal.email@gmail.com" Перевірити налаштування: git config --show-origin user.name git config --show-origin user.email Використання двох SSH-ключів (для GitHub/GitLab/Bitbucket). Всі наступні команди для Linux (Ubuntu). ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_personal ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_corporate Отримати публічний ключ: cat ~/.ssh/id_ed25519_personal.pub Цей код потрібно додати у відповідний аккаунт у GitHub (GitLab/Bitbucket). Для цього перейти в https://github.com/settings/keys Налаштовуємо конфігурацію: nano ~/.ssh/config І д...

Error Handling в Node.js

Error Handling у Node.js vs Java У Java ми звикли до checked та unchecked exceptions, блоків try-catch-finally, та Spring'івських @ExceptionHandler. JavaScript має інший підхід до обробки помилок, особливо в асинхронному коді. // Java - знайомий підхід try { User user = userService.getUser(id); processUser(user); } catch (UserNotFoundException e) { logger.error("User not found", e); } catch (Exception e) { logger.error("Unexpected error", e); } finally { cleanup(); } // JavaScript/TypeScript - схожий синтаксис, різна семантика try { const user = await userService.getUser(id); await processUser(user); } catch (err) { if (err instanceof UserNotFoundError) { logger.error('User not found', err); } else { logger.error('Unexpected error', err); } } finally { cleanup(); } Ключова відмінність: У JavaScript немає checked exceptions. Всі помилки unchecked, компіл...

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); /...