Java for Beginner
871 subscribers
1.01K photos
275 videos
14 files
1.68K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
История технологии сегодня — 22 мая

ℹ️ Кто родился в этот день

Па́вел Алексе́евич Зару́бин (10 (22) мая 1816, посад Пучеж, Костромская губерния — 31 июля (12 августа) 1886, Санкт-Петербург)русский механик-самоучка, изобретатель, землемер и писатель.
Получил известность благодаря созданию ряда оригинальных приборов для межевания (в том числе 
планиметра-самоката, за который был дважды удостоен Демидовской премии), а также литературным произведениям, реалистично описывавшим быт провинциального мещанства и оказавшим, по признанию самого писателя, влияние на раннее творчество А. М. Горького.

Уильям Стёрджен (англ. William Sturgeon, 22 мая 1783 года — 4 декабря 1850 года) — британский физик, электротехник и изобретатель, создал первые электромагниты и изобрёл первый английский работающий электродвигатель.

Джордж Хейлмейер (англ. George Harry Heilmeier; (22 мая 1936 года — 21 апреля 2014 года)) — американский инженер и менеджер.
В 1964 году исследовал электрооптические эффекты в 
жидких кристаллах, что привело к появлению плоских жидкокристаллических экранов в 1968 году.

Сю́дзи Накаму́ра (яп. 中村修二 Накамура Сю:дзи, род. 22 мая 1954) — японский и американский физик, изобретатель синего светодиода, лауреат Нобелевской премии по физике (2014), в настоящее время работает в Калифорнийском университете в Санта-Барбаре (США).


🌐 Знаковые события

1906 — братья Райт получили патент на свой летательный аппарат.

1911 — профессор Технологического института Борис Розинг получил изображения геометрических фигур на экране электронно-лучевой трубки — прообразы нынешнего телевизионного изображения.

1973 — Роберт Меткалф составил докладную записку для главы PARC о потенциале технологии Ethernet. Этот день общепринято считать днём изобретения данной технологии.

1990 - состоялся релиз программной оболочки Windows 3.0 компании Microsoft.


#Biography #Birth_Date #Events #22мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Раздел 9. Исключения, логирование, отладка

Глава 2. Логирование (Logging)

Конфигурация Logback через logback.xml (или logback-test.xml)

Logback ищет файл конфигурации в classpath в строго определенном порядке приоритетов. Первый найденный файл используется, остальные игнорируются.

Последовательность поиска:
logback-test.xml — предназначен для тестов, имеет наивысший приоритет
logback.xml — стандартная production-конфигурация
logback.groovy — альтернативный формат на языке Groovy
Автоматическая конфигурация через SPI (Service Provider Interface)
Базовая конфигурация по умолчанию — консольный вывод с уровнем DEBUG

Файл logback-test.xml размещается в src/test/resources/ и гарантирует, что тесты используют собственную конфигурацию независимо от production-настроек. Это критично для изоляции: тесты могут подавлять лишний вывод или направлять логи в память для верификации.

Структура XML-конфигурации

Корневой элемент <configuration> поддерживает атрибуты для управления поведением сканирования:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- scan="true" — автоматическая перезагрузка при изменении файла -->
<!-- scanPeriod — интервал проверки в секундах, минутах, часах -->
<!-- debug="true" — вывод внутренней диагностики Logback в консоль -->

<!-- Определение переменных свойств -->
<property name="LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<property name="LOG_DIR" value="/var/log/myapp"/>

<!-- Appenders -->
<!-- ... -->

<!-- Логгеры -->
<!-- ... -->

<!-- Корневой логгер -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>

Элемент <property> определяет переменные, доступные во всей конфигурации через синтаксис ${NAME}. Переменные могут ссылаться на системные свойства JVM (${user.home}), переменные окружения (${ENV_VAR:-default}) или внешние файлы свойств через <property file="..."/>.


ConsoleAppender: вывод в консоль

ConsoleAppender направляет логи в System.out или System.err. Это стандартный appender для development-окружений и контейнеризированных приложений, где stdout/stderr собираются Docker или Kubernetes.
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- Целевой поток: System.out (по умолчанию) или System.err -->
<target>System.out</target>

<!-- Фильтр уровня: пропускать только INFO и выше -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>

<!-- Кодировка вывода -->
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>

<!-- Немедленный сброс буфера (для контейнеров) -->
<immediateFlush>true</immediateFlush>
</appender>

Элемент <filter> ограничивает проходящие сообщения. ThresholdFilter пропускает только сообщения с уровнем не ниже указанного. Это позволяет направлять в консоль только INFO и выше, даже если корневой уровень установлен на DEBUG — фильтр appender работает после фильтра логгера.

Для контейнеризированных приложений рекомендуется выводить логи в stdout без форматирования времени, так как Docker добавляет собственную временную метку:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
</encoder>
</appender>


#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J
👍1
FileAppender и RollingFileAppender: вывод в файл

FileAppender
записывает в единственный файл без ограничения размера. Это опасно для production, так как файл растет бесконечно. RollingFileAppender расширяет FileAppender политиками ротации, автоматически архивируя и заменяя файлы при достижении условий.


Базовый FileAppender

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_DIR}/application.log</file>
<append>true</append> <!-- Дописывать в существующий файл -->

<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>

<!-- Права доступа к создаваемым файлам (только Unix) -->
<prudent>false</prudent> <!-- true — безопасная запись из нескольких JVM -->
</appender>

Атрибут prudent="true" включает режим безопасной записи из нескольких JVM в один файл через FileChannel locks. Это снижает производительность, но предотвращает повреждение при кластерном развертывании.


RollingFileAppender с ротацией по размеру
<appender name="ROLLING_SIZE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/application.log</file>

<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<!-- Имя архивного файла с индексом -->
<fileNamePattern>${LOG_DIR}/application.%i.log.zip</fileNamePattern>
<!-- Максимальный индекс архива -->
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>

<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<!-- Максимальный размер файла перед ротацией -->
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>

<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>

FixedWindowRollingPolicy с SizeBasedTriggeringPolicy создает архивы с числовыми индексами: application.1.log.zip, application.2.log.zip и так до maxIndex. Когда достигнут maxIndex, самый старый архив удаляется. Эта политика проста, но имеет ограничение: при перезапуске приложения индексация начинается с 1, что может привести к перезаписи существующих архивов.


RollingFileAppender с ротацией по времени
<appender name="ROLLING_TIME" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/application.log</file>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- Шаблон имени архива с датой -->
<fileNamePattern>${LOG_DIR}/application.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- Хранить архивы за 30 дней -->
<maxHistory>30</maxHistory>
<!-- Общий лимит размера архивов -->
<totalSizeCap>3GB</totalSizeCap>
<!-- Очистка устаревших архивов при старте -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>

<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>

TimeBasedRollingPolicy использует дату в шаблоне fileNamePattern для определения периода ротации. Спецификатор %d{yyyy-MM-dd} означает ежедневную ротацию. %d{yyyy-MM-dd_HH} — почасовую, %d{yyyy-MM} — ежемесячную. Logback автоматически вычисляет ближайший момент ротации на основе наиболее мелкой единицы времени в шаблоне.

maxHistory удаляет архивы старше указанного количества периодов. totalSizeCap ограничивает суммарный размер всех архивов — когда лимит превышен, самые старые архивы удаляются независимо от maxHistory. cleanHistoryOnStart выполняет очистку при старте приложения, что полезно для долгоживущих сервисов, которые могут перезапускаться редко.

#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J
👍1
Комбинированная ротация: время + размер

<appender name="ROLLING_COMBINED" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/application.log</file>

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- Ежедневная ротация, но если файл превысит 100MB — дополнительная ротация -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>

<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>

SizeAndTimeBasedRollingPolicy комбинирует оба подхода. %i — индекс, который инкрементируется при достижении maxFileSize в течение одного временного периода. Таким образом, за один день может быть создано несколько архивов: application.2024-01-15.0.log, application.2024-01-15.1.log и так далее. Это решает проблему чрезмерно больших файлов при высокой нагрузке.


Практические шаблоны

Стандартный шаблон для development:
<pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>

%highlight раскрашивает уровень в цвет терминала: ERROR красный, WARN желтый, INFO зеленый, DEBUG и TRACE синий. %cyan применяет циановый цвет к имени логгера.


Production-шаблон без ANSI-цветов:
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%rEx</pattern>

%rEx (root exception) выводит сокращенный стектрейс, исключая фреймы из стандартных библиотек, что существенно уменьшает объем лога при частых исключениях.


JSON-формат для систем агрегации:
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>

LogstashEncoder из библиотеки logstash-logback-encoder формирует структурированный JSON с полями timestamp, level, logger, message, thread, stack_trace и MDC-значениями. Это устраняет необходимость парсинга регулярными выражениями в ELK или Splunk.


Установка уровней: корневой и пакетные логгеры

Корневой логгер

Корневой логгер (root) является предком всех остальных логгеров. Его уровень применяется, когда для конкретного логгера уровень не задан явно.
<root level="WARN">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ROLLING_TIME"/>
</root>

Здесь корневой уровень WARN означает, что по умолчанию выводятся только WARN и ERROR. Любой логгер без явного уровня наследует эту настройку.

Логгеры для пакетов и классов
Элемент <logger> позволяет переопределить уровень для конкретного имени логгера, формируя иерархию:
<!-- Уровень DEBUG для всего пакета сервисов -->
<logger name="com.example.service" level="DEBUG"/>

<!-- Уровень TRACE для конкретного класса при расследовании -->
<logger name="com.example.service.PaymentGateway" level="TRACE"/>

<!-- Отключение additivity для изоляции аудита -->
<logger name="com.example.audit" level="INFO" additivity="false">
<appender-ref ref="AUDIT_FILE"/>
</logger>


#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J
👍1
Свойство additivity управляет наследованием appenders. По умолчанию true: сообщение, обработанное логгером com.example.service, передается также в appenders предков (com.example, com, root). При additivity="false" сообщение обрабатывается только указанными appenders и не поднимается выше.

Это критично для разделения потоков. Логгер аудита направляет сообщения только в файл аудита, не дублируя их в общий консольный вывод:
<appender name="AUDIT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/audit.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/audit.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %msg%n</pattern>
</encoder>
</appender>

<logger name="com.example.audit" level="INFO" additivity="false">
<appender-ref ref="AUDIT_FILE"/>
</logger>


Полный пример конфигурации
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">

<property name="LOG_DIR" value="/var/log/myapp"/>
<property name="LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%rEx"/>

<!-- Консоль: только INFO и выше, с цветами -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern>
</encoder>
</appender>

<!-- Основной файл: DEBUG и выше -->
<appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>

<!-- Файл ошибок: только ERROR -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/error.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>

<!-- Аудит: изолированный поток -->
<appender name="AUDIT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/audit.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/audit.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>365</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %msg%n</pattern>
</encoder>
</appender>

<!-- Логгеры пакетов -->
<logger name="com.example.service" level="DEBUG"/>
<logger name="org.springframework.web" level="WARN"/>
<logger name="org.hibernate.SQL" level="DEBUG"/>

<!-- Изолированный аудит -->
<logger name="com.example.audit" level="INFO" additivity="false">
<appender-ref ref="AUDIT_FILE"/>
</logger>

<!-- Корневой логгер -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="APPLICATION"/>
<appender-ref ref="ERROR_FILE"/>
</root>

</configuration>


#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J
👍5
Что выведет код?

public class Task220526 {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("Java");
StringBuilder sb2 = sb1.append("Script");

System.out.println(sb1 == sb2);
System.out.println(sb1.toString() == sb2.toString());
System.out.println(sb1.toString().equals(sb2.toString()));
}
}


#Tasks
👍3
👍2
Что такое Phaser? 🤓

Ответ:

Phaser — это более гибкая замена CyclicBarrier и CountDownLatch, появившаяся в Java 7.

Он поддерживает многофазную синхронизацию потоков, которые могут динамически регистрироваться и дерегистрироваться. Каждая фаза имеет номер.

Потоки вызывают arriveAndAwaitAdvance() — прибытие и ожидание перехода к следующей фазе. Phaser может использоваться для организации синхронизации в алгоритмах с несколькими итерациями (фазами), где количество участников меняется.

Поддерживает иерархию (родительские Phaser'ы).


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
История технологии сегодня — 23 мая

Сегодня Java исполнился 31 год! 🎉

Изначально язык назывался Oak («Дуб»), разрабатывался Джеймсом Гослингом для программирования бытовых электронных устройств. Из-за того, что язык с таким названием уже существовал, Oak был переименован в Java. Назван в честь марки кофе Java, которая, в свою очередь, получила наименование одноимённого острова (Ява), поэтому на официальной эмблеме языка изображена чашка с горячим кофе. Существует и другая версия происхождения названия языка, связанная с аллюзией на кофемашину как пример бытового устройства, для программирования которого изначально язык создавался. В соответствии с этимологией в русскоязычной литературе с конца двадцатого и до первых лет двадцать первого века название языка нередко переводилось как Ява, а не транскрибировалось.

С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и серверного программного обеспечения. Тогда же определённое распространение получила технология Java-апплетов — графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей динамических веб-страниц в 2000-е годы технология стала применяться редко.


ℹ️ Кто родился в этот день

Роберт Артур Муг (Моуг; англ. Robert A. Moog, Bob Moog /ˈmoʊɡ/; 23 мая 1934 — 21 августа 2005) — американский изобретатель, предприниматель, пионер электронной музыки, известен как создатель синтезатора Муга.

Джон Ба́рди́н (англ. John Bardeen; 23 мая 1908, Мадисон, Висконсин, США — 30 января 1991, Бостон, Массачусетс, США) — американский физик, один из пяти человек, получивших за свою жизнь по две Нобелевские премии: в 1956 году за транзистор совместно с Уильямом Брэдфордом Шокли и Уолтером Браттейном и в 1972 году за основополагающую теорию обычных сверхпроводников совместно с Леоном Нилом Купером и Джоном Робертом Шриффером. Сейчас эта теория называется теорией Бардина — Купера — Шриффера, или просто БКШ-теория.


🌐 Знаковые события

1934 — первый полёт экспериментальной крылатой ракеты, спроектированной под руководством С. П. Королёва в ГИРД, оснащённой ГРД.

1995 — компания Sun официально представила Java и HotJava на выставке SunWorld '95.


#Biography #Birth_Date #Events #23мая
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5🍾3
С 09.05 по 22.05
Предыдущий пост(с 02.05 по 08.05)

Запись встреч/видео:
13. Kafka: переход от очереди задач к журналу событий
Keycloak с нуля: от первого токена до современной auth-архитектуры

Обучающие статьи:
[Совет по Java #035]
Тема: java.util.Timer создает один поток для всех задач.

[Совет по Java #037]
Тема: File.delete() не бросает исключение при неудаче.

[Совет по Java #038]
Тема: SimpleDateFormat не потокобезопасен.

[Совет по Java #039]
Тема: String.split() принимает регулярное выражение.

[Совет по Java #040]
Тема: Переменные в catch и finally не видны снаружи.

Раздел 9. Исключения, логирование, отладка

Глава 2. Логирование (Logging)
Подключение SLF4J + Logback в проект (Maven/Gradle). Базовый пример получения логгера
Уровни логирования: TRACE, DEBUG, INFO, WARN, ERROR. Когда что использовать. Иерархия и фильтрация
Параметризованные сообщения SLF4J: почему это лучше конкатенации строк
Логирование исключений — правильная передача throwable последним параметром
Конфигурация Logback через logback.xml (или logback-test.xml)

Полезные статьи и видео:
Java нас обманывает: скрытая цена чистого кода

Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
👍1🔥1
История технологии сегодня — 24 мая

ℹ️ Кто родился в этот день

Алекса́ндр Алексе́евич Лема́нский (24 мая 1935, Москва — 27 сентября 2007, Капустин Яр, Ахтубинский район, Астраханская область) советский и российский учёный, генеральный конструктор НПО «Алмаз», заведующий кафедрой «Радиолокация, радиоуправление и информатика» Факультета радиотехники и кибернетики МФТИдоктор технических наукпрофессор, руководитель работ по созданию системы С-400.

Даниель Габриель Фаренгейт (Фаренхайт; нем. Daniel Gabriel Fahrenheit; 24 мая 1686, Данциг (ныне — Гданьск, Польша) — 16 сентября 1736Гаага) — немецкий физик, родившийся в Польше. В Нидерландах он впервые изготовил термометр и барометр. Вначале термоскопической жидкостью ему служил спирт, но затем около 1715 года он заменил спирт ртутью, чем достиг гораздо большей точности измерений. Фаренгейтом изготовлены также первый весовой ареометр и термобарометр. В 1721 году он открыл, что вода может быть охлаждена ниже точки замерзания и оставаться в жидком состоянии; работал также над устройством машины для осушения местностей, подвергшихся наводнениям. Единица измерения температуры градус Фаренгейта (°F) была названа в его честь.


🌐 Знаковые события

1949 — пуск первой советской геофизической ракеты В-1А. Начало регулярных научных исследований верхних слоёв атмосферы.

2001 — в русской Википедии появилась первая статья.

2006 — запущен проект Wikimapia.


#Biography #Birth_Date #Events #24мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Почему все-таки программирование?

Мне, 40-летнему человеку, по теории, должно было быть сложно менять профессию.
Тем более, я уже успел получить несколько других и добиться в них немалого успеха.


Так почему же я решился на такую авантюру? (а по другому, мои родные это не называли 😂)

Вот некоторые из тех принципов, которые определили пройденный путь:

1. Успех в определенной профессии != достойной зарплате и условиям труда 🫰.

Поработав в разных сферах и в разных условиях, посмотрев как трудятся люди разных профессий, начинаешь понимать ценность спокойной, "удаленной" работы и достойного, денежного эквивалента этого труда. ☝️

2. Развитие и перспективы в обозримом будущем 🏝.

По моему скромному мнению, пределов развития и так называемого "потолка", у человека выбравшего программирование - нет. Вот нет и все. Кто готов поспорить - жду в комментариях 🤓

А есть лишь естественные причины - физические ограничения и ЛЕНЬ.
😵

А это значит, что пока руки поднимаются - опускать их мимо клавиатуры, противоестественно! 💪

3. Неугасаемый интерес к процессу созидания (написанию кода) 🧑‍💻.

Один из мощнейших, мотивационных принципов для меня.

Ведь, что может быть прекраснее, чем наблюдать как созданный тобой корабль (условно, конечно же), держится и продолжает плыть в самом современном море, которое еще не исследовано до конца? ⛵️


Все это, в совокупности, перевесило мое нежелание (или инерцию мышления и жизни) изучать программирование.

И даже когда (очень часто, столкнувшись с нерешаемой задачей 😭) мне казалось, что я сделал опрометчиво-глупый выбор - эти принципы помогали преодолеть сомнения (и конечно же задачу, потому что нерешаемых задач НЕТ 💪).

😎

#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍2
История технологии сегодня — 25 мая

ℹ️ Кто родился в этот день

Джек Стейнбергер (англ. Jack Steinberger; 25 мая 1921, Бад-Киссинген, Германия — 12 декабря 2020, Женева, Швейцария) — американский физик, известный работами по физике элементарных частицнобелевский лауреат (1988) за открытие и исследование мюонного нейтрино и антинейтрино.

Пи́тер Зе́еман (нид. Pieter Zeeman; 25 мая 1865, Зоннемайре, Нидерланды — 9 октября 1943, Амстердам) — нидерландский физик, лауреат Нобелевской премии по физике 1902 года (совместно с Хендриком Лоренцем) за открытие и теоретическое объяснение расщепления спектральных линий в магнитном поле (эффекта Зеемана).

Аугу́сто Ульдери́ко Сикаре́ (исп. Augusto Ulderico Cicaré, 25 мая 1937 — 26 января 2022) — аргентинский изобретательинженер и авиаконструктор, основатель и первый президент компании Cicaré Helicópteros S.A. Сикаре создал свой первый вертолёт Cicaré CH-1 в 1958 году. CH-1 был первым вертолётом, разработанным в Южной Америке. В 1972 году был представлен третий летательный аппарат — Cicaré CH-3. В конце 1960-х изобретатель разработал 4-тактный V-образный двигатель для автомобилей DKW, протестированный аргентинским гонщиком Хуаном Мануэлем Фанхио. Также была разработана спортивная версия, но банкротство DKW привело к закрытию проекта. Сикаре разработал прототипы вертолётов итальянской фирмы «Heli-Sport» CH-7 Angel и 2-местный CH-7 Kompress, совместно с Деннисом Феттерсом Mini-500Voyager-500.


🌐 Знаковые события

1939 — первые в стране испытания системы автоматического взлёта и посадки тяжёлого самолёта ТБ-1.


#Biography #Birth_Date #Events #25мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Напоминаю, что продолжаю набор, желающих изучить Java. 🤓

Пишите в лс, все обсудим. 😉

@oleborn
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
[Совет по Java #041]

Тема: Integer кэширует значения от -128 до 127.

Проблема: JVM кэширует объекты Integer для небольшого диапазона значений (по умолчанию от -128 до 127). При автоупаковке (autoboxing) или вызове Integer.valueOf() для числа в этом диапазоне возвращается один и тот же объект из кэша. Для чисел вне диапазона каждый раз создается новый объект. Использование оператора == для сравнения Integer проверяет равенство ссылок, а не значений.

Решение: Всегда сравнивайте объекты IntegerLongShortByteCharacter через метод equals() или используйте примитивные типы (int). Для безопасного сравнения с возможным null применяйте Objects.equals(a, b). Кэш можно расширить параметром -XX:AutoBoxCacheMax=size, но это не решает концептуальной проблемы. Для Long кэш работает только для значений от -128 до 127, для Character — от 0 до 127.
public class IntegerCache {

public static void main(String[] args) {
//В пределах кэша (-128..127)
Integer a1 = 100;
Integer b1 = 100;
System.out.println("100 == 100: " + (a1 == b1)); // true (один объект)
System.out.println("100 equals 100: " + a1.equals(b1)); // true

//Вне кэша
Integer a2 = 200;
Integer b2 = 200;
System.out.println("200 == 200: " + (a2 == b2)); // false (разные объекты!)
System.out.println("200 equals 200: " + a2.equals(b2)); // true

//Разные способы создания
Integer a3 = Integer.valueOf(127); // из кэша
Integer b3 = new Integer(127); // новый объект (deprecated)
System.out.println("valueOf(127) == new Integer(127): " + (a3 == b3)); // false

//Опасность в коллекциях
var map = new java.util.HashMap<Integer, String>();
map.put(200, "value");
System.out.println("map.get(200): " + map.get(200)); // работает, т.к. внутри equals

//Правильное сравнение
Integer x = 300;
Integer y = 300;
if (x.equals(y)) {
System.out.println("300 equals 300 — корректно");
}

//null-safe сравнение
Integer nullable = null;
System.out.println("Objects.equals: " + Objects.equals(nullable, 300));
}
}


Объяснение:
 Кэш Integer реализован в методе Integer.valueOf() и используется при автоупаковке. Его размер можно настроить, но полагаться на кэш — плохая практика.

Оператор == для объектов сравнивает ссылки, и для чисел вне диапазона кэша они гарантированно разные. Проблема усугубляется тем, что код работает в разработке (где числа обычно маленькие) и ломается в production (где диапазон шире). equals() сравнивает значения и всегда работает корректно.

Для смешанного сравнения Integer и int происходит распаковка (unboxing), и == работает правильно: Integer a = 200; int b = 200; a == b будет true, потому что a распаковывается в int. Но для единообразия всегда используйте equals().

#Java #советы
👍5
Что выведет код?

public class Task250526 {
public static void main(String[] args) {
Short a = 100;
Short b = 100;
Short c = 200;
Short d = 200;

System.out.println(a == b);
System.out.println(c == d);
System.out.println(c.equals(d));
}
}


#Tasks
👍3
👍4
Что такое ThreadFactory? 🤓

Ответ:

ThreadFactory — это интерфейс для создания новых потоков с возможностью кастомизации.

Единственный метод: Thread newThread(Runnable r). Используется в ExecutorService (например, Executors.newFixedThreadPool(10, myThreadFactory)).

Позволяет задавать: имена потоков (для упрощения отладки), приоритеты, демонический статус, UncaughtExceptionHandler.

Хорошая практика — создавать потоки с понятными именами (например, "db-pool-%d"). Утилита Executors.defaultThreadFactory() возвращает стандартную фабрику.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 26 мая

ℹ️ Кто родился в этот день

Бори́с Серге́евич Петропа́вловский (14 (26) мая 1898, Курск — 6 ноября 1933, Ленинград) — российский и советский военный инженер-артиллерист, участник Первой мировой и Гражданской войн, один из организаторов разработок ракетной техники в СССР, руководитель Газодинамической лаборатории, главный инженер Ленинградского отделения Реактивного научно-исследовательского института (РНИИ). Именем Б. С. Петропавловского был назван кратер на обратной стороне Луны.


🌐 Знаковые события

1868 — Альфред Нобель подал заявку на американский патент на изобретение динамита.



#Biography #Birth_Date #Events #26мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4