Часть 3. MDC для контекста операций
MDC (Mapped Diagnostic Context) — потоколокальное хранилище ключ-значение. Данные доступны в layout через
Обёртка для автоматической очистки
Использование:
Часть 4. Маркер SECURITY для критических операций
Удаление всех книг
Конфигурация обработки маркера
Добавьте в
Часть 5. Защита паролей и чувствительных данных
Проблема
Решение 1: маскирование в toString()
Решение 2: специальный метод для логирования
#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
MDC (Mapped Diagnostic Context) — потоколокальное хранилище ключ-значение. Данные доступны в layout через
%X{key}.Обёртка для автоматической очистки
public class MdcOperation implements AutoCloseable {
private final String operation;
public MdcOperation(String operation, String userId) {
this.operation = operation;
MDC.put("operation", operation);
MDC.put("userId", userId);
MDC.put("timestamp", Instant.now().toString());
}
@Override
public void close() {
MDC.remove("operation");
MDC.remove("userId");
MDC.remove("timestamp");
}
}Использование:
public void processBatch(List<<Book> newBooks, String userId) {
try (MdcOperation op = new MdcOperation("batchImport", userId)) {
log.info("Начало пакетного импорта: {} книг", newBooks.size());
for (Book book : newBooks) {
try {
addBook(book);
} catch (DuplicateBookException e) {
log.warn("Пропущен дубликат в пакете: {}", book.getId());
}
}
log.info("Завершён пакетный импорт: добавлено {} из {}",
newBooks.size(), newBooks.size());
}
}Часть 4. Маркер SECURITY для критических операций
Удаление всех книг
public void clearAllBooks(String userId, String reason) {
try (MdcOperation op = new MdcOperation("clearAll", userId)) {
int count = books.size();
log.info(SECURITY, "Запрос на удаление всех книг: причина='{}', пользователь={}",
reason, userId);
if (count == 0) {
log.warn("Попытка очистить пустую библиотеку");
return;
}
// Дополнительное подтверждение для критической операции
log.warn(SECURITY, "ВНИМАНИЕ: Удаление {} книг. Требуется подтверждение.", count);
books.clear();
log.error(SECURITY, "Библиотека полностью очищена: {} книг удалено пользователем {}",
count, userId);
}
}Конфигурация обработки маркера
Добавьте в
logback.xml отдельный appender для SECURITY:<<appender name="SECURITY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/security.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [SECURITY] %X{userId} %X{operation} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boo.JaninoEventEvaluator">
<expression>return marker != null && marker.contains("SECURITY");</expression>
</evaluator>
<OnMatch>ACCEPT</OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
</appender>
<<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="SECURITY_FILE"/>
</root>
Часть 5. Защита паролей и чувствительных данных
Проблема
// Опасно: пароль попадёт в лог
log.info("Авторизация: user={}, password={}", username, password);
Решение 1: маскирование в toString()
public class User {
private String login;
private String passwordHash; // храним хэш, не пароль
private String plainPassword; // только при создании, не логируем
@Override
public String toString() {
return "User[login=" + login + ", password=***]";
}
}Решение 2: специальный метод для логирования
public String toLogString() {
return "User[login=" + login + ", roles=" + roles + "]";
}#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
👍3
Решение 3: фильтр Logback для маскирования
Применение в
Решение 4: структурный подход — никогда не передавать пароль в лог
Практические задания
Задача 1: настройка окружений
Создайте три конфигурации:
Переключение через системное свойство:
Задача 2: метрики через логи
Добавьте логирование времени выполнения операций:
Соберите статистику по лог-файлу: среднее время, 95-й перцентиль.
Задача 3: аудит изменений
Реализуйте
Все операции
Задача 4: защита от случайного логирования пароля (звёздочка)
Напишите unit-test, который:
- перехватывает лог-вывод через
- проверяет, что при передаче
- падает, если пароль попал в лог чистым текстом
#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
public class PasswordMaskingFilter extends Filter<<ILoggingEvent> {
private static final Pattern PASSWORD_PATTERN =
Pattern.compile("(?i)(password|passwd|pwd)\\s*=\\s*[^\\s,}]+");
@Override
public FilterReply decide(ILoggingEvent event) {
String message = event.getFormattedMessage();
if (PASSWORD_PATTERN.matcher(message).find()) {
// Можно: заменить, отклонить, или передать с предупреждением
return FilterReply.DENY; // Полностью блокируем сообщение с паролем
}
return FilterReply.NEUTRAL;
}
}
Применение в
logback.xml:<<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="library.logging.PasswordMaskingFilter"/>
<!-- ... -->
</appender>
Решение 4: структурный подход — никогда не передавать пароль в лог
public void authenticate(String login, char[] password) {
// password — массив символов, не строка
log.info("Попытка авторизации: login={}", login);
boolean success = checkPassword(login, password);
if (success) {
log.info("Успешная авторизация: login={}", login);
} else {
log.warn("Неудачная авторизация: login={}", login);
}
// Очистка массива
Arrays.fill(password, '\0');
}Практические задания
Задача 1: настройка окружений
Создайте три конфигурации:
logback.xml — production (INFO в консоль, ERROR в файл, без DEBUG)logback-dev.xml — development (DEBUG в файл, подробный вывод)logback-test.xml — тесты (WARN и выше, минимальный вывод)Переключение через системное свойство:
-Dlogback.configurationFile=logback-dev.xmlЗадача 2: метрики через логи
Добавьте логирование времени выполнения операций:
public void addBookWithMetrics(Book book) {
long start = System.currentTimeMillis();
// ... операция ...
long duration = System.currentTimeMillis() - start;
log.info("Метрика: operation=addBook, durationMs={}", duration);
}Соберите статистику по лог-файлу: среднее время, 95-й перцентиль.
Задача 3: аудит изменений
Реализуйте
AuditLogger — отдельный логгер, записывающий все изменения в неизменяемый лог:<<appender name="AUDIT" class="ch.qos.logback.core.FileAppender">
<file>logs/audit.log</file>
<append>true</append>
<encoder>
<pattern>%d{ISO8601} %X{userId} %X{operation} %msg%n</pattern>
</encoder>
</appender>
Все операции
add, remove, clearAll должны дублироваться в audit-лог.Задача 4: защита от случайного логирования пароля (звёздочка)
Напишите unit-test, который:
- перехватывает лог-вывод через
ListAppender- проверяет, что при передаче
User с паролем в log.info пароль заменён на ***- падает, если пароль попал в лог чистым текстом
#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
👍4
Что выведет код?
#Tasks
import java.util.Arrays;
import java.util.List;
public class Task280526 {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(-5, -3, -1);
int max = numbers.stream().reduce(0, Integer::max);
System.out.println(max);
}
}
#Tasks
👍2
👍2🆒1
Как объявить константу в Java?🤓
Ответ:
Константа в Java — это переменная, значение которой нельзя изменить.
Объявляется с ключевыми словами static final. Принято имя писать заглавными буквами с подчеркиваниями: public static final double PI = 3.14159;. final означает, что ссылку нельзя переназначить (для примитивов — значение, для объектов — ссылку, но сам объект может быть изменяем).
Для неизменяемых объектов (например, String, LocalDate) final вместе с неизменяемостью даёт полную константу.
#собеседование
Ответ:
Константа в Java
Объявляется с ключевыми словами static final. Принято имя писать заглавными буквами с подчеркиваниями: public static final double PI = 3.14159;. final означает, что ссылку нельзя переназначить (для примитивов — значение, для объектов — ссылку, но сам объект может быть изменяем).
Для неизменяемых объектов (например, String, LocalDate) final вместе с неизменяемостью даёт полную константу.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 29 мая
ℹ️ Кто родился в этот день
Никола́й Серге́евич Бахва́лов (29 мая 1934, Москва — 29 августа 2005, Москва) — советский и российский математик, специалист по вычислительной математике. Академик РАН (1991), заслуженный деятель науки Российской Федерации (1994). Вычислительная и прикладная математика, численные методы, оптимизация алгоритмов, теория функций, математические проблемы механики неоднородных сред, в частности композитных материалов, задачи волновой физики, теория осреднения процессов в периодических средах (Государственная премия 1985 г.), многосеточные методы решения уравнений эллиптического типа (Государственная премия 2003 г.).
Пи́тер Уэр Хиггс (англ. Peter Ware Higgs; 29 мая 1929, Ньюкасл-апон-Тайн, Нортамберленд — 8 апреля 2024, Эдинбург) — британский физик-теоретик, профессор Эдинбургского университета. Лауреат Нобелевской премии по физике (2013) за предсказание бозона Хиггса. Прославился благодаря предложенному им в 1960-х годах механизму спонтанного нарушения электрослабой симметрии, объясняющему происхождение массы элементарных частиц и, в частности, масс векторных W- и Z-бозонов. Это открытие он сделал во время горной прогулки в районе Эдинбурга; вернувшись после неё в лабораторию, Хиггс заявил, что у него возникла «грандиозная идея». Механизм, носящий его фамилию, предсказывает существование новой частицы, хиггсовского бозона. Об открытии частицы было объявлено 4 июля 2012 года на пресс-конференции ЦЕРНа (сам Хиггс заявил по этому поводу, что не ожидал экспериментального подтверждения собственной теории при своей жизни). Открытие бозона Хиггса признано научным прорывом 2012 года. Ныне механизм Хиггса считается одним из основных компонентов Стандартной модели.
Алексе́й Миха́йлович Черёмухин (1895—1958) — советский авиационный конструктор, создатель первого советского вертолёта. Доктор технических наук (1937), профессор (1934). Заслуженный деятель науки и техники РСФСР. Лауреат Ленинской премии.
🌐 Знаковые события
1802 — физик и основоположник электрометаллургии академик В. В. Петров открыл явление электрической дуги.
1975 — на Белорусском автозаводе начато производство крупнейшего в СССР грузовика — «БелАЗ-7520».
#Biography #Birth_Date #Events #29мая
Никола́й Серге́евич Бахва́лов (29 мая 1934, Москва — 29 августа 2005, Москва) — советский и российский математик, специалист по вычислительной математике. Академик РАН (1991), заслуженный деятель науки Российской Федерации (1994). Вычислительная и прикладная математика, численные методы, оптимизация алгоритмов, теория функций, математические проблемы механики неоднородных сред, в частности композитных материалов, задачи волновой физики, теория осреднения процессов в периодических средах (Государственная премия 1985 г.), многосеточные методы решения уравнений эллиптического типа (Государственная премия 2003 г.).
Пи́тер Уэр Хиггс (англ. Peter Ware Higgs; 29 мая 1929, Ньюкасл-апон-Тайн, Нортамберленд — 8 апреля 2024, Эдинбург) — британский физик-теоретик, профессор Эдинбургского университета. Лауреат Нобелевской премии по физике (2013) за предсказание бозона Хиггса. Прославился благодаря предложенному им в 1960-х годах механизму спонтанного нарушения электрослабой симметрии, объясняющему происхождение массы элементарных частиц и, в частности, масс векторных W- и Z-бозонов. Это открытие он сделал во время горной прогулки в районе Эдинбурга; вернувшись после неё в лабораторию, Хиггс заявил, что у него возникла «грандиозная идея». Механизм, носящий его фамилию, предсказывает существование новой частицы, хиггсовского бозона. Об открытии частицы было объявлено 4 июля 2012 года на пресс-конференции ЦЕРНа (сам Хиггс заявил по этому поводу, что не ожидал экспериментального подтверждения собственной теории при своей жизни). Открытие бозона Хиггса признано научным прорывом 2012 года. Ныне механизм Хиггса считается одним из основных компонентов Стандартной модели.
Алексе́й Миха́йлович Черёмухин (1895—1958) — советский авиационный конструктор, создатель первого советского вертолёта. Доктор технических наук (1937), профессор (1934). Заслуженный деятель науки и техники РСФСР. Лауреат Ленинской премии.
1802 — физик и основоположник электрометаллургии академик В. В. Петров открыл явление электрической дуги.
1975 — на Белорусском автозаводе начато производство крупнейшего в СССР грузовика — «БелАЗ-7520».
#Biography #Birth_Date #Events #29мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
[Совет по Java #043]
Тема:
Проблема: Некоторые разработчики ошибочно полагают, что раз
Другие, наоборот, пытаются создать экземпляр
Решение: Используйте
Для работы с неизвестным числовым типом используйте
Объяснение:
Он объявляет абстрактные методы
#Java #советы
Тема:
java.lang.Number — абстрактный класс, нельзя создать экземпляр.Проблема: Некоторые разработчики ошибочно полагают, что раз
Number является абстрактным, то нельзя использовать его в полиморфном контексте или что методы вроде doubleValue() не будут работать для конкретных типов. Другие, наоборот, пытаются создать экземпляр
new Number() (что приводит к ошибке компиляции) или ожидают, что Number можно использовать как универсальный контейнер для любых чисел без потери точности. Также существует непонимание того, что Number не является супертипом для примитивов (int не является Number), а только для их оберток.Решение: Используйте
Number как полиморфный тип для методов, которые должны принимать любые числовые обертки (Integer, Double, Long, Float, Short, Byte, BigInteger, BigDecimal). Для получения числового значения вызывайте соответствующий метод: doubleValue(), intValue(), longValue() и т.д. Помните, что эти методы могут привести к потере точности (например, Double -> intValue()). Для работы с неизвестным числовым типом используйте
doubleValue() как наиболее универсальный (самый широкий диапазон). Если нужна точность, проверяйте тип через instanceof. Не создавайте Number напрямую.public class NumberPolymorphism {
//Полиморфный метод, принимающий любой числовой тип
public static double square(Number num) {
double d = num.doubleValue();
return d * d;
}
//С проверкой типа для сохранения точности
public static Number add(Number a, Number b) {
// Для точных вычислений нужно знать тип
if (a instanceof Integer && b instanceof Integer) {
return a.intValue() + b.intValue();
}
if (a instanceof Double || b instanceof Double) {
return a.doubleValue() + b.doubleValue();
}
if (a instanceof BigDecimal || b instanceof BigDecimal) {
return toBigDecimal(a).add(toBigDecimal(b));
}
return a.doubleValue() + b.doubleValue();
}
private static BigDecimal toBigDecimal(Number n) {
if (n instanceof BigDecimal) return (BigDecimal) n;
return BigDecimal.valueOf(n.doubleValue());
}
//Ошибка: Number абстрактный
// Number n = new Number(); // не компилируется
//Правильно: создаем конкретные типы
Number intNum = 42; // autoboxing -> Integer
Number doubleNum = 3.14; // autoboxing -> Double
Number longNum = 100L; // autoboxing -> Long
Number bigDec = new BigDecimal("123.45");
//Демонстрация полиморфизма
public static void main(String[] args) {
List<Number> numbers = Arrays.asList(10, 3.14, 100L, new BigDecimal("99.99"));
// Полиморфная обработка
for (Number n : numbers) {
System.out.println("Value: " + n);
System.out.println(" int: " + n.intValue());
System.out.println(" double: " + n.doubleValue());
System.out.println(" square: " + square(n));
}
//Потеря точности при преобразовании
Double precise = 123.456;
Number asNumber = precise;
int truncated = asNumber.intValue(); // 123 — потеряна дробная часть
System.out.println("Truncated: " + truncated);
}
}Объяснение:
Number — абстрактный класс, являющийся супертипом для всех числовых оберток в Java. Он объявляет абстрактные методы
intValue(), longValue(), floatValue(), doubleValue(), которые реализуются в каждом конкретном классе-наследнике. Полиморфизм работает стандартным образом: переменная типа Number может ссылаться на любой объект подкласса. При вызове, например, doubleValue() JVM динамически выбирает реализацию в соответствии с фактическим типом объекта. Важно помнить, что примитивные типы (int, double) не являются подтипами Number, но при автоупаковке они преобразуются в соответствующие обертки (Integer, Double).#Java #советы
👍5
Что выведет код?
#Tasks
import java.util.ArrayList;
import java.util.List;
public class Task290526 {
public static void main(String[] args) {
List<Number> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(5.5);
numbers.add(3);
numbers.add(2L);
Number sum = numbers.get(0).intValue() + numbers.get(1).doubleValue();
System.out.println(sum.getClass().getSimpleName());
Number product = numbers.get(2).longValue() * numbers.get(3).longValue();
System.out.println(product.getClass().getSimpleName());
}
}
#Tasks
👍4
Варианты ответа:
Anonymous Quiz
20%
Integer / Long
67%
Double / Long
7%
Integer / Integer
7%
Double / Double
👍4
Что такое transient? Где применяется?🤓
Ответ:
transient — модификатор поля, указывающий, что это поле не должно участвовать в сериализации.
При десериализации такое поле получает значение по умолчанию (для объектов — null, для примитивов — 0, false, '\u0000').
Применяется для полей, которые:
1) являются производными (можно вычислить из других полей).
2) содержат конфиденциальную информацию (пароли, ключи).
3) не сериализуемы (например, Thread, Socket, FileInputStream).
Используется для уменьшения размера сериализованных данных и повышения безопасности.
#собеседование
Ответ:
transient
При десериализации такое поле получает значение по умолчанию (для объектов — null, для примитивов — 0, false, '\u0000').
Применяется для полей, которые:
1) являются производными (можно вычислить из других полей).
2) содержат конфиденциальную информацию (пароли, ключи).
3) не сериализуемы (например, Thread, Socket, FileInputStream).
Используется для уменьшения размера сериализованных данных и повышения безопасности.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
История технологии сегодня — 30 мая
ℹ️ Кто родился в этот день
Алексе́й Архи́пович Лео́нов (30 мая 1934, Листвянка, Западно-Сибирский край — 11 октября 2019, Басманный район, Москва) — лётчик-космонавт СССР № 11, первый человек в мире, вышедший в открытый космос. 18—19 марта 1965 года совместно с Павлом Беляевым совершил полёт в космос в качестве второго пилота на космическом корабле «Восход-2». В ходе полёта осуществил первый в истории космонавтики выход в открытый космос, проявив при этом исключительное мужество, особенно в нештатной ситуации, когда раздувшийся космический скафандр препятствовал его возвращению в космический корабль.
(от меня - великий человек, я встречался с ним лично, здоровался за руку).
Ха́ннес У́лоф Йёста Альве́н (Альфвен) (швед. Hannes Olof Gösta Alfvén; 30 мая 1908, Норрчёпинг — 2 апреля 1995, Юрсхольм) — шведский физик, специалист по физике плазмы, лауреат Нобелевской премии по физике в 1970 году за работы в области теории магнитогидродинамики. Внёс существенный вклад в физику плазмы, включая такие направления, как теории северного сияния, радиационных поясов Ван Аллена, эффект геомагнитных бурь на магнитное поле Земли, магнитосферы, в проблемы формирования хвостов комет и солнечной системы, динамики плазмы в галактике (плазменная космология).
🌐 Знаковые события
1900 — на Всемирной выставке в Париже датский инженер Вальдемар Поульсен представил изобретённый им прибор — телеграфон. По сути, это была магнитная лента для звукозаписи.
#Biography #Birth_Date #Events #30мая
Алексе́й Архи́пович Лео́нов (30 мая 1934, Листвянка, Западно-Сибирский край — 11 октября 2019, Басманный район, Москва) — лётчик-космонавт СССР № 11, первый человек в мире, вышедший в открытый космос. 18—19 марта 1965 года совместно с Павлом Беляевым совершил полёт в космос в качестве второго пилота на космическом корабле «Восход-2». В ходе полёта осуществил первый в истории космонавтики выход в открытый космос, проявив при этом исключительное мужество, особенно в нештатной ситуации, когда раздувшийся космический скафандр препятствовал его возвращению в космический корабль.
(от меня - великий человек, я встречался с ним лично, здоровался за руку).
Ха́ннес У́лоф Йёста Альве́н (Альфвен) (швед. Hannes Olof Gösta Alfvén; 30 мая 1908, Норрчёпинг — 2 апреля 1995, Юрсхольм) — шведский физик, специалист по физике плазмы, лауреат Нобелевской премии по физике в 1970 году за работы в области теории магнитогидродинамики. Внёс существенный вклад в физику плазмы, включая такие направления, как теории северного сияния, радиационных поясов Ван Аллена, эффект геомагнитных бурь на магнитное поле Земли, магнитосферы, в проблемы формирования хвостов комет и солнечной системы, динамики плазмы в галактике (плазменная космология).
1900 — на Всемирной выставке в Париже датский инженер Вальдемар Поульсен представил изобретённый им прибор — телеграфон. По сути, это была магнитная лента для звукозаписи.
#Biography #Birth_Date #Events #30мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
С 23.05 по 29.05
Предыдущий пост(с 09.05 по 22.05)
Запись встреч/видео:
В разработке
Обучающие статьи:
[Совет по Java #041]
Тема: Integer кэширует значения от -128 до 127.
[Совет по Java #042]
Тема: Comparator.comparing(Function) требует, чтобы ключ сравнения был Comparable.
[Совет по Java #043]
Тема: java.lang.Number — абстрактный класс, нельзя создать экземпляр.
Раздел 9. Исключения, логирование, отладка
Глава 2. Логирование (Logging)
MDC (Mapped Diagnostic Context) – привязка контекстной информации к логам
Логирование в «Библиотеке»
Полезные статьи и видео:
Как мы ускорили расчёт факторов ранжирования в поиске Ozon с помощью динамической компиляции
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
Предыдущий пост(с 09.05 по 22.05)
Запись встреч/видео:
В разработке
Обучающие статьи:
[Совет по Java #041]
Тема: Integer кэширует значения от -128 до 127.
[Совет по Java #042]
Тема: Comparator.comparing(Function) требует, чтобы ключ сравнения был Comparable.
[Совет по Java #043]
Тема: java.lang.Number — абстрактный класс, нельзя создать экземпляр.
Раздел 9. Исключения, логирование, отладка
Глава 2. Логирование (Logging)
MDC (Mapped Diagnostic Context) – привязка контекстной информации к логам
Логирование в «Библиотеке»
Полезные статьи и видео:
Как мы ускорили расчёт факторов ранжирования в поиске Ozon с помощью динамической компиляции
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
👍3
История технологии сегодня — 31 мая
ℹ️ Кто родился в этот день
Евгений Павлович Тверитинов (19 [31] мая 1850, Кронштадт, Санкт-Петербургская губерния — 3 апреля 1920, Кронштадт, Петроградская губерния) — офицер Российского императорского флота, первый русский флотский электрик, специалист по минной и корабельной электротехнике, изобретатель и создатель нового типа электрического аккумулятора. Впервые в России оборудовал боевые корабли установками электрического освещения, организовал электрическую иллюминацию Кремля и колокольни Ивана Великого при коронации императора Александра III и его супруги.
Джей Глен Майнер (англ. Jay Glenn Miner, также Джей Майнер; 31 мая 1932 года — 20 июня 1994 года) — знаменитый разработчик микросхем, известный прежде всего как человек, благодаря которому стало возможным воплощение концепций, позднее получивших название мультимедиа. Основной разработчик первого в мире мультимедийного персонального компьютера Amiga 1000 (1985 год). Взгляды Джея Майнера настолько опережали время, что сегодня он воспринимается многими как провидец, который, прежде всего, сам внёс посильную лепту в осуществление своей мечты.
Джон Роберт Шри́ффер (англ. John Robert Schrieffer; 31 мая 1931, Ок-Парк, Иллинойс, США — 27 июля 2019) — американский физик, лауреат Нобелевской премии по физике (1972, совместно с Джоном Бардином и Леоном Н. Купером) за создание БКШ-теории, названной по их инициалам. В 1956 году Шриффер, Бардин и Купер разработали теорию сверхпроводимости кристаллических твёрдых тел, основанную на представлении о сверхтекучести куперовских пар электронов.
🌐 Знаковые события
1946 — образовано самолётостроительное ОКБ О. К. Антонова.
#Biography #Birth_Date #Events #31мая
Евгений Павлович Тверитинов (19 [31] мая 1850, Кронштадт, Санкт-Петербургская губерния — 3 апреля 1920, Кронштадт, Петроградская губерния) — офицер Российского императорского флота, первый русский флотский электрик, специалист по минной и корабельной электротехнике, изобретатель и создатель нового типа электрического аккумулятора. Впервые в России оборудовал боевые корабли установками электрического освещения, организовал электрическую иллюминацию Кремля и колокольни Ивана Великого при коронации императора Александра III и его супруги.
Джей Глен Майнер (англ. Jay Glenn Miner, также Джей Майнер; 31 мая 1932 года — 20 июня 1994 года) — знаменитый разработчик микросхем, известный прежде всего как человек, благодаря которому стало возможным воплощение концепций, позднее получивших название мультимедиа. Основной разработчик первого в мире мультимедийного персонального компьютера Amiga 1000 (1985 год). Взгляды Джея Майнера настолько опережали время, что сегодня он воспринимается многими как провидец, который, прежде всего, сам внёс посильную лепту в осуществление своей мечты.
Джон Роберт Шри́ффер (англ. John Robert Schrieffer; 31 мая 1931, Ок-Парк, Иллинойс, США — 27 июля 2019) — американский физик, лауреат Нобелевской премии по физике (1972, совместно с Джоном Бардином и Леоном Н. Купером) за создание БКШ-теории, названной по их инициалам. В 1956 году Шриффер, Бардин и Купер разработали теорию сверхпроводимости кристаллических твёрдых тел, основанную на представлении о сверхтекучести куперовских пар электронов.
1946 — образовано самолётостроительное ОКБ О. К. Антонова.
#Biography #Birth_Date #Events #31мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
История технологии сегодня — 1 июня
ℹ️ Кто родился в этот день
Ма́ркус Алексе́й Пе́рссон (швед. Markus Alexej Persson [ˈmǎrkɵs ˈpæ̌ːʂɔn] о файле, также известный под никнеймом Notch; род. 1 июня 1979, Стокгольм, Швеция) — шведский программист и геймдизайнер, бывший владелец компании Mojang Studios. Является создателем популярной компьютерной игры Minecraft. Самый популярный проект Перссона — компьютерная игра в жанре песочницы с элементами симулятора выживания и открытым миром Minecraft, выпущенная 18 ноября 2011 года. Ради работы над игрой Перссон уволился с поста гейм-дизайнера. В начале 2011 года Mojang AB продала первый миллион копий игры, через несколько месяцев — второй и через ещё несколько месяцев — третий. Mojang наняла нескольких разработчиков в команду Minecraft после того, как Перссон передал пост главного разработчика Йенсу Бергенстену (jeb_). Игра была адаптирована под iOS и Android. Версия для Xbox появилась 9 мая 2012 года и включает несколько нововведений, например, возможность обучения и несколько текстур-паков и скинов. После продажи Mojang Microsoft за 2,5 миллиарда долларов Перссон прекратил работу над проектом, а его место занял программист Йенс Бергенстен.
Эдвард Чарльз Титчмарш (англ. Edward Charles Titchmarsh, 1 июня 1899, Ньюбери, Беркшир, Англия, Великобритания — 18 января 1963, Оксфорд, Оксфордшир, Англия, Великобритания) — английский математик, специалист по математическому анализу и аналитической теории чисел. Написал около 130 статей по математике, а также пять монографий, один учебник («Теория функций») и одну популярную книгу. Его работы были посвящены рядам Фурье, интегралам Фурье, целым функциям, интегральным уравнениям, дифференциальным уравнениям второго порядка, исследованию свойств дзета-функции Римана, а также другим математическим проблемам.
🌐 Знаковые события
1936 — открылась первая в СССР трансконтинентальная авиалиния из Москвы во Владивосток. В те времена перелёты совершались с промежуточными посадками — за 4 суток.
#Biography #Birth_Date #Events #01июня
Ма́ркус Алексе́й Пе́рссон (швед. Markus Alexej Persson [ˈmǎrkɵs ˈpæ̌ːʂɔn] о файле, также известный под никнеймом Notch; род. 1 июня 1979, Стокгольм, Швеция) — шведский программист и геймдизайнер, бывший владелец компании Mojang Studios. Является создателем популярной компьютерной игры Minecraft. Самый популярный проект Перссона — компьютерная игра в жанре песочницы с элементами симулятора выживания и открытым миром Minecraft, выпущенная 18 ноября 2011 года. Ради работы над игрой Перссон уволился с поста гейм-дизайнера. В начале 2011 года Mojang AB продала первый миллион копий игры, через несколько месяцев — второй и через ещё несколько месяцев — третий. Mojang наняла нескольких разработчиков в команду Minecraft после того, как Перссон передал пост главного разработчика Йенсу Бергенстену (jeb_). Игра была адаптирована под iOS и Android. Версия для Xbox появилась 9 мая 2012 года и включает несколько нововведений, например, возможность обучения и несколько текстур-паков и скинов. После продажи Mojang Microsoft за 2,5 миллиарда долларов Перссон прекратил работу над проектом, а его место занял программист Йенс Бергенстен.
Эдвард Чарльз Титчмарш (англ. Edward Charles Titchmarsh, 1 июня 1899, Ньюбери, Беркшир, Англия, Великобритания — 18 января 1963, Оксфорд, Оксфордшир, Англия, Великобритания) — английский математик, специалист по математическому анализу и аналитической теории чисел. Написал около 130 статей по математике, а также пять монографий, один учебник («Теория функций») и одну популярную книгу. Его работы были посвящены рядам Фурье, интегралам Фурье, целым функциям, интегральным уравнениям, дифференциальным уравнениям второго порядка, исследованию свойств дзета-функции Римана, а также другим математическим проблемам.
1936 — открылась первая в СССР трансконтинентальная авиалиния из Москвы во Владивосток. В те времена перелёты совершались с промежуточными посадками — за 4 суток.
#Biography #Birth_Date #Events #01июня
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😱1
Раздел 11. Работа с файлами, I/O и сетью (NIO.2)
Глава 1. Классический Java I/O (java.io)
Байтовые потоки: абстрактные классы InputStream и OutputStream
Байтовые потоки в Java представляют собой фундаментальный слой абстракции для работы с данными в их сыром, двоичном виде. Классы
Это разделение ответственности — транспорт без интерпретации — является ключевым архитектурным решением Java I/O. Байтовые потоки отвечают только за перемещение сырых данных между источником и назначением. Интерпретация этих данных — декодирование текста, парсинг изображений, десериализация объектов — возлагается на более высокие уровни абстракции, которые строятся поверх байтовых потоков через паттерн декоратора.
Использование байтовых потоков обязательно для любых бинарных форматов, где побитовая точность критична. Попытка чтения бинарного файла через символьные потоки (
Путь данных в памяти JVM: от диска до heap
Когда
Уровень 1: Диск и страничный кэш ОС. Файловая система читает данные с блочного устройства в страничный кэш ядра (page cache). Это память ядра операционной системы, недоступная напрямую из Java. Размер страницы обычно 4KB, и чтение меньшего объема все равно загружает целую страницу.
Уровень 2: Нативный буфер и системный вызов. JVM выполняет системный вызов
Уровень 3: Копирование в heap JVM. Данные из нативного буфера копируются в массив
Каждый вызов
Буферизация и сокращение пути данных
При первом вызове
Путь данных с буферизацией:
Первый
Второй
После исчерпания
Это сокращает количество системных вызовов с N до N/8192, где N — размер файла.
#Java #для_новичков #beginner #IO #NIO #InputStream #OutputStream
Глава 1. Классический Java I/O (java.io)
Байтовые потоки: абстрактные классы InputStream и OutputStream
Байтовые потоки в Java представляют собой фундаментальный слой абстракции для работы с данными в их сыром, двоичном виде. Классы
InputStream и OutputStream оперируют единицей данных размером в 8 бит — байтом — и не накладывают никакой семантической интерпретации на прочитанные или записанные значения. Байт может быть частью изображения JPEG, аудиофрейма MP3, сериализованного объекта, зашифрованного пакета или любого другого бинарного формата.Это разделение ответственности — транспорт без интерпретации — является ключевым архитектурным решением Java I/O. Байтовые потоки отвечают только за перемещение сырых данных между источником и назначением. Интерпретация этих данных — декодирование текста, парсинг изображений, десериализация объектов — возлагается на более высокие уровни абстракции, которые строятся поверх байтовых потоков через паттерн декоратора.
Использование байтовых потоков обязательно для любых бинарных форматов, где побитовая точность критична. Попытка чтения бинарного файла через символьные потоки (
Reader/Writer) приведет к повреждению данных, так как символьные потоки применяют кодировку, трансформирующую последовательности байт в Unicode-символы. Для форматов вроде PNG, PDF, ZIP, MP4 или собственных бинарных протоколов единственно корректный выбор — байтовые потоки.Путь данных в памяти JVM: от диска до heap
Когда
FileInputStream.read() читает байт из файла, данные проходят через несколько уровней памяти прежде чем стать доступными Java-коду. Этот путь критичен для понимания производительности и поведения garbage collector.Уровень 1: Диск и страничный кэш ОС. Файловая система читает данные с блочного устройства в страничный кэш ядра (page cache). Это память ядра операционной системы, недоступная напрямую из Java. Размер страницы обычно 4KB, и чтение меньшего объема все равно загружает целую страницу.
Уровень 2: Нативный буфер и системный вызов. JVM выполняет системный вызов
read(), который копирует данные из страничного кэша ядра в нативный буфер в userspace. Это прямое копирование между kernel space и user space управляется DMA (Direct Memory Access) контроллером без участия CPU для самих данных, но требует переключения контекста процессора из userspace в kernelspace.Уровень 3: Копирование в heap JVM. Данные из нативного буфера копируются в массив
byte[], расположенный в heap JVM. Это вторая копия данных, и именно здесь начинает работать garbage collector.// read() возвращает int, но данные прошли путь: диск -> page cache -> нативный буфер -> heap
int byteValue = fileInputStream.read();
Каждый вызов
read() без буферизации порождает этот полный путь для одного байта. Системный вызов и переключение контекста стоят дороже самого чтения, что делает посимвольное чтение катастрофически неэффективным.Буферизация и сокращение пути данных
BufferedInputStream решает проблему, вводя промежуточный буфер в heap JVM:// BufferedInputStream внутренне содержит byte[] buf размером по умолчанию 8192 байт
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("data.bin"))) {
int b;
while ((b = bis.read()) != -1) {
processByte(b);
}
}
При первом вызове
read() BufferedInputStream читает до 8192 байт из underlying потока одним системным вызовом, заполняя внутренний массив buf. Последующие вызовы read() извлекают байты из этого массива без системных вызовов. Данные в buf — это обычный массив в heap, управляемый garbage collector.Путь данных с буферизацией:
Первый
read(): диск -> page cache -> нативный буфер -> buf[8192] в heap -> возврат buf[0]Второй
read(): buf[1] из heap (системный вызов отсутствует)После исчерпания
buf: повторение шага 1Это сокращает количество системных вызовов с N до N/8192, где N — размер файла.
#Java #для_новичков #beginner #IO #NIO #InputStream #OutputStream
👍5