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

Публікації

Показано дописи з 2026

Термінал на 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); /...