Периодически возникает желание получать уведомления, иметь возможность настраивать источник, фильтровать сообщения по темам, и писать как можно меньше кода. Например, присылать себе картинку/цитату/слово дня или дельту по изменениям ордеров на бирже. В результате получился универсальный инструмент - бот и персональное АПИ для отправки сообщений в Telegram. Прошу под кат.
Рубрика «java» - 27
Во что обернулась пересылка MQTT-сообщений в Telegram?
2022-08-20 в 15:43, admin, рубрики: api, automation, github actions, helm, hobby, java, telegrambot, ПрограммированиеАтака на String.hashCode: прообразы и коллизии
2022-08-13 в 18:00, admin, рубрики: collision, hash, hashCode, java, preimage, string, коллизия, ненормальное программирование, никто не читает теги, Программирование, прообраз, сезон java, хеш-код
Как-то раз мне понадобилось несколько наборов строк с коллизией по хеш-коду. То есть таких, чтобы значение String::hashCode() совпадало для всех строк в наборе.
Блуждание по интернету не дало результатов, примеров было мало и все они довольно однообразны. Поиск по словарям подарил забавную пару "javascript's".hashCode() == "monocle".hashCode(), но практической пользы не принёс. Полный перебор не рассматривался в виду скорой тепловой смерти вселенной.
Тот самый случай, когда проще сделать всё самому. Стандартная хеш-функция строки в Java считается криптографически нестойкой, так что знаний из школьного курса математики должно быть достаточно.
Ошибка в stacktrace из продакшена
2022-08-13 в 14:52, admin, рубрики: android, android development, firebase, FIrebase Crash Reporting, Google Play Console, java, kotlin, Разработка под android, сезон javaВ этой статье я расскажу про исключительную ситуацию, которая произошла с одним исключением в продакшене нашего Android приложения.

Оригинальная статья написана мной, так что это не совсем "перевод", это ее интерпретация от того же автора.
It is Wednesday, my java dudes, или насколько сложно сделать свою JVM
2022-08-10 в 14:35, admin, рубрики: java, Rust, ненормальное программирование, сезон javaЧто делать, если накануне переезда повысилась тревожность, а привычные методы не приносят успокоения?
Конечно же вырабатывать дофамин через решение упоротых инженерных задач!
Мне стало интересно - насколько тяжко было бы сделать свой интерпретатор байт-кода Java? И насколько сложно было бы научить его “новым трюкам”?
Писать я буду на Rust, поэтому и проект, не мудрствуя лукаво, назвал Rjava.
Холостые циклы в Java
2022-08-10 в 8:00, admin, рубрики: java, multithreading, многопоточность, сезон javaПривет, сегодня поговорим о тонкостях реализации холостых циклов (холостого ожидания) в Java. Эта задача встречается нечасто: за девять с небольшим лет работы я столкнулся с ней лишь пару раз. Тем не менее, тема видится интересной и по ней есть что сказать, так что добро пожаловать! Исходный код примеров доступен здесь.
Начнём с определения. На мой вкус русское "холостой цикл" (или "холостое ожидание") интуитивно понятнее и точнее передаёт суть явления, чем английское "busy waiting"Читать полностью »
Дюк, вынеси мусор! — 5. Epsilon GC
2022-08-05 в 18:35, admin, рубрики: epsilon gc, garbage collector, gc, java, jvm
Сборщики мусора из OpenJDK, которые мы успели рассмотреть к этому моменту (Serial и Parallel, CMS и G1, ZGCЧитать полностью »
Получение generic-типа в runtime
2022-07-17 в 8:17, admin, рубрики: generic types, generics, java, kotlin, spring, сезон java
В Java 5 появились generic-типы, а вместе с ним и концепция type erasure, которая буквально означает стирание информации о generic-типе после компиляции. Действительно, во многих случаях это просто синтаксический сахар, помогающий писать типо-безопасный код на уровне компиляции, и в runtime с такими типами работать нельзя. Например, невозможно получить тип T внутри ArrayList<T>, поэтому он в своей реализации создает массив Object[], а не T[] для хранения элементов.
Однако, в ряде случаев это очень даже возможно. Например, можно объявить поле
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
...
@Autowired
private Set<BeanPostProcessor> beanPostProcessors;
и spring в него заинжектит все объекты контекста, которые реализуют интерфейс BeanPostProcessor.
Можно написать и так:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
...
List<String> strings = new ObjectMapper()
.readValue("[1, 2, 3]", new TypeReference<>() {});
// все элементы strings - строки (не Integer и не Long)
List<Integer> ints = new ObjectMapper()
.readValue("[1, 2, 3]", new TypeReference<>() {});
// все элементы ints - Integer (не String и не Long)
Можно написать даже так:
Читать полностью »
«Го, я создал». Учим Java и Kotlin в команде
2022-06-18 в 19:30, admin, рубрики: community, java, kotlin, learn
Лирическое вступление
Данная инициатива - не реклама, пиар, прикол или что-либо, имеющее под собой злой умысел. Это именно инициатива, цель которой собрать под одной "крышей" таких же маслят в Java, как я, и помогать в обучении.
Подробный разбор цепочки эксплойтов Playstation 4 и 5
2022-06-13 в 10:55, admin, рубрики: bluray, java, playstation 4, PlayStation 5, Игры и игровые консоли, информационная безопасность, Компьютерное железо, пиратский софт, реверс-инжиниринг, эксплойты
В статье представлена цепочка из пяти уязвимостей, позволяющая нападающему получить возможности JIT и исполнять произвольные полезные нагрузки. Передаваемая полезная нагрузка вызывает переполнение буфера, приводящее к kernel panic.
Читать полностью »
Добавляйте единицы измерения в имена
2022-05-31 в 13:22, admin, рубрики: java, python, Блог компании Билайн Бизнес, единицы измерения, код, Программирование, Совершенный код, читаемость кода
Есть одна ловушка читаемости кода, которой легко избежать, если вы о ней знаете; тем не менее она встречается постоянно: это отсутствующие единицы измерения. Рассмотрим три фрагмента кода на Python, Java и Haskell:
time.sleep(300)
Thread.sleep(300)
threadDelay 300
Сколько «спят» эти программы? Программа на Python выполняет задержку на пять минут, программа на Java — на 0,3 секунды, а программа на Haskell — на 0,3 миллисекунды.
Как это можно понять из кода? А никак. Вам просто нужно знать, что аргументом time.sleep являются секунды, а threadDelay — микросекунды. Если вы часто ищете эту информацию, то рано или поздно её запомните, но как сохранить читаемость кода для людей, никогда не встречавшихся с time.sleep?
Читать полностью »
