Java Ready | Программирование
8.9K subscribers
1.22K photos
60 videos
1 file
600 links
Авторский канал по разработке на Java.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_it

Реклама на бирже: https://telega.in/c/java_ready
Download Telegram
Покажись, IP!

Определяем местоположение любого IP прямо из терминала с помощью curl и jq — без сторонних библиотек, всё в консоли.

Юзаем бесплатный API от ip-api.com.
Запрос предельно прост:
curl -s http://ip-api.com/json/1.1.1.1


В ответ получаем JSON с информацией о стране, городе, провайдере и других параметрах.

Подключаем jq, чтобы аккуратно вывести нужные поля из ответа:
curl -s http://ip-api.com/json/1.1.1.1 | jq '.country, .regionName, .city, .isp'


Результат будет отображён построчно: страна, регион, город и провайдер.

Для удобства можно оформить это в виде функции:
geoip() {
curl -s "http://ip-api.com/json/$1" | jq '.query, .country, .city, .isp'
}


И вызвать:
geoip 8.8.8.8


🔥 Отличный способ быстро проверять подозрительные IP во время пентеста или анализа логов.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍4🔥4
👩‍💻 Хешируем большие файлы!

Большие файлы нельзя читать целиком в оперативной памяти, ведь она может закончиться. Вместо этого лучше читать файл чанками.

В этом посте:
Создаём MessageDigest;

Читаем файл;

Получаем результат.


Такой подход используют для проверки целостности загрузок, поиска дубликатов и контроля файловых операций.

👉 Java Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥116👍6🤝1
📂 Напоминалка по ArrayList!

ArrayList это удобная коллекция для работы с динамическими списками в Java. На картинке собраны основные методы: от инициализации списка до сортировки, удаления и итерации элементов.

Сохрани, чтобы всегда быть в курсе!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥6👍4
Система плагинов!

Когда хочешь расширить функционал приложения без перекомпиляции, хорошо использовать плагины. В Java можно динамически загружать классы, используя ClassLoader.

Создаём интерфейс плагина:
public interface Plugin {
void execute();
}


Создаём класс плагина:
public class MyPlugin implements Plugin {
@Override
public void execute() {
System.out.println("Плагин загружен!");
}
}


Реализуем кастомный ClassLoader для загрузки плагинов:
public class PluginClassLoader extends ClassLoader {
private final Path dir;

public PluginClassLoader(Path dir) {
this.dir = dir;
}

@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
Path file = dir.resolve(name.replace('.', '/') + ".class");
byte[] bytes = Files.readAllBytes(file);
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
}
}
}


Загружаем плагин динамически:
Path pluginDir = Path.of("plugins");
PluginClassLoader loader = new PluginClassLoader(pluginDir);
Class<?> pluginClass = loader.loadClass("MyPlugin");
Plugin plugin = (Plugin) pluginClass.getDeclaredConstructor().newInstance();
plugin.execute();


Таким образом, можно добавлять новые плагины без перезапуска приложения и динамически загружать новые классы.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍65🔥4
✍️ Основные паттерны микросервисной архитектуры!

Статья включает:
• Объяснения поэтапной миграция с монолита на микросервисы
Централизованное управление API запросами;
• Управление микросервисами с помощью сетевой инфраструктуры.

🔊 Читать статью на Habr!


👉 Java Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍5🔥4
Реализация простого калькулятора!

Калькулятор это классическая задача для консольных приложений.

Создаём сканер для ввода данных и основные переменные:
var sc = new java.util.Scanner(System.in);
boolean run = true;


Печатаем меню и принимаем ввод от пользователя:
while (run) {
System.out.println("Введите первое число:");
double num1 = sc.nextDouble();

System.out.println("Выберите операцию (+, -, *, /):");
String operator = sc.next();

System.out.println("Введите второе число:");
double num2 = sc.nextDouble();


Обрабатываем операцию через switch:
    double result = 0;
switch (operator) {
case "+" -> result = num1 + num2;
case "-" -> result = num1 - num2;
case "*" -> result = num1 * num2;
case "/" -> {
if (num2 != 0) {
result = num1 / num2;
} else {
System.out.println("Ошибка: деление на ноль");
continue;
}
}
default -> System.out.println("Неверная операция");
}


Выводим результат и предлагаем продолжить или выйти:
    System.out.println("Результат: " + result);
System.out.println("Хотите продолжить? (да/нет)");
String answer = sc.next();
if (answer.equalsIgnoreCase("нет")) {
run = false;
}
}
sc.close();


🔥 Мы создали простой калькулятор с выбором операции и обработкой ошибок.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥6👍5
Многопоточная загрузка!

Когда нужно быстро скачать много файлов один поток превращает всё в очередь. Решение простое, грузить параллельно через пул потоков.

Создаём пул потоков:
ExecutorService pool = Executors.newFixedThreadPool(4);


Кидаем задачи на скачивание:
pool.submit(() -> download(url1));
pool.submit(() -> download(url2));
pool.submit(() -> download(url3));


Дожидаемся завершения и закрываем пул:
pool.shutdown();
pool.awaitTermination(1, TimeUnit.MINUTES);


Итог такой, что несколько загрузок идут одновременно.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍106🔥5
Делаем игру “Угадай число”

Компьютер загадывает число, а игрок пытается угадать, получая подсказки “больше/меньше”.

Задаём случайное число и готовим ввод с консоли:
var rnd = new java.util.Random();
int secret = rnd.nextInt(100) + 1; // 1..100
var sc = new java.util.Scanner(System.in);
int tries = 0;


Запускаем цикл попыток и читаем ответ игрока:
while (true) {
System.out.print("Введите число 1..100: ");
int guess = sc.nextInt();
tries++;


Сравниваем и даём подсказку “выше/ниже”:
    if (guess < secret) System.out.println("Больше!");
else if (guess > secret) System.out.println("Меньше!");
else break;
}


Выводим победу и число попыток:
System.out.println("Угадал! Число: " + secret);
System.out.println("Попыток: " + tries);
sc.close();


Получилась полноценная мини-игра, у нас выбирается случайное число и выводятся подсказки.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍7🔥4🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
😎 SQL-101 — руководство, помогающее освоить язык и укрепить базу тем, кто уже работает с БД.

В этом ресурсе собраны ключевые темы, которые нужны в работе: базовые запросы, фильтрация, JOIN, группировки, подзапросы, индексы, транзакции и основы оптимизации. Всё объяснено простым языком и дополнено примерами с упражнениями.

Оставляю ссылочку: Github 📱


👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍5🔥5
Защита от зависаний!

Иногда код может зависнуть, сеть не отвечает, поток завис, задача не заканчивается. Чтобы приложение не висело вечно нужно ставить таймауты и принудительно обрывать долгие задачи.

Запускаем задачу в отдельном потоке:
ExecutorService pool = Executors.newSingleThreadExecutor();
Future<String> task = pool.submit(() -> longWork());


Ждём ограниченное время:
String result = task.get(3, TimeUnit.SECONDS);


Если не успело, отменяем задачу:
task.cancel(true); // пытается прервать поток
pool.shutdownNow();


Так мы защищаемся от вечных зависаний процессов и вечных циклов.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥5👍4
This media is not supported in your browser
VIEW IN TELEGRAM
📂 Напоминалка по IPv4 vs IPv6!

Например, IPv4 использует 32-битные адреса, а IPv6 — 128-битные и поддерживает автоконфигурацию. Также на схеме показано, как работает Dual Stack и чем отличаются заголовки пакетов.

На картинке — ключевые различия IPv4 и IPv6, которые стоит держать под рукой.

Сохрани, чтобы не забыть!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍8🔥5
Система учёта задач!

To-Do это идеальная практика для списков, ввода и работы с файлами. Задачи будем хранить в ArrayList, а между запусками сохранять в tasks.txt.

Задаём файл и загружаем задачи, если он уже существует:
var path = java.nio.file.Path.of("tasks.txt");
var tasks = new java.util.ArrayList<String>();

if (java.nio.file.Files.exists(path))
tasks.addAll(java.nio.file.Files.readAllLines(path));


Печатаем меню и читаем команду пользователя:
var sc = new java.util.Scanner(System.in);
boolean run = true;

while (run) {
System.out.println("1) Список 2) Добавить 3) Удалить 0) Выход");
System.out.print("Выбор: ");
var cmd = sc.nextLine().trim();


Выводим текущие задачи с нумерацией:
    if (cmd.equals("1")) {
if (tasks.isEmpty()) System.out.println("Задач нет.");
for (int i = 0; i < tasks.size(); i++)
System.out.println((i + 1) + ") " + tasks.get(i));
}


Добавляем задачу и сразу сохраняем в файл:
    else if (cmd.equals("2")) {
System.out.print("Текст задачи: ");
var t = sc.nextLine();
tasks.add(t);
java.nio.file.Files.write(path, tasks);
System.out.println("Добавлено.");
}


Удаляем задачу по номеру и сохраняем обновлённый список:
    else if (cmd.equals("3")) {
System.out.print("Номер: ");
int n = Integer.parseInt(sc.nextLine());
if (n >= 1 && n <= tasks.size()) {
tasks.remove(n - 1);
java.nio.file.Files.write(path, tasks);
System.out.println("Удалено.");
} else System.out.println("Неверный номер.");
}


Выходим из программы и закрываем ввод:
    else if (cmd.equals("0")) run = false;
else System.out.println("Неизвестная команда.");

System.out.println();
}
sc.close();


В итоге получилась To-Do утилита с сохранением задач в tasks.txt.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍5🔥4
📂 Напоминалка про Modem vs Router!

Модем отвечает за подключение к провайдеру и получение публичного IP, а роутер управляет локальной сетью: маршрутизирует трафик, выполняет NAT и раздаёт адреса устройствам.

На картинке — ключевые отличия и базовая схема работы.

Сохрани, чтобы не забыть!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍86🔥6
Защита от повторного запуска!

Иногда нельзя, чтобы приложение запускалось дважды. Решение простое, нужен lock-файл. Если он уже занят, значит экземпляр уже работает.

Путь к lock-файлу:
Path lockPath = Path.of("app.lock");


Открываем файл и пытаемся поставить блокировку:
FileChannel channel = FileChannel.open(lockPath,
StandardOpenOption.CREATE, StandardOpenOption.WRITE);

FileLock lock = channel.tryLock();


Если lock не получен выходим:
if (lock == null) {
System.out.println("Экземпляр уже запущен — выходим");
System.exit(1);
}


🔥 Теперь второй запуск не пройдёт, пока первый держит блокировку.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍5🔥4
🎄 Джависты, всех с наступающим!

Желаю каждому провести новый 2026 год намного лучше и выполнить все планы. Моя цель: набрать более 15 тысяч подписчиков.
Please open Telegram to view this post
VIEW IN TELEGRAM
132🔥7👍5🤝1
Разделение PDF на страницы!

Когда PDF большой, удобнее разрезать его на отдельные страницы.

Подключаем библиотеку:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.31</version>
</dependency>


Открываем исходный PDF:
PDDocument doc = PDDocument.load(new File("input.pdf"));


Режем на страницы и сохраняем:
Splitter splitter = new Splitter();
List<PDDocument> pages = splitter.split(doc);


Сохраняем каждую страницу отдельным файлом:
int i = 1;
for (PDDocument page : pages) {
page.save("page-" + i + ".pdf");
page.close();
i++;
}
doc.close();


🔥 В итоге получаем page-1.pdf, page-2.pdf, page-3.pdf и так далее. Удобно, когда нужно быстро раздать страницы.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍5🤝5
📂 Напоминалка по DNS!

Например, когда домен вводится в браузере, он сначала проверяет кеш, если IP не найден — запускается цепочка DNS-запросов: Root - TLD - Authoritative сервер. В итоге браузер получает IP и только после этого отправляет HTTP-запрос на сервер.

На картинке — наглядная схема того, как именно работает DNS-резолв шаг за шагом.

Сохрани, чтобы не забыть!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍106🔥6🤝1