История технологии сегодня — 28 июня
ℹ️ Кто родился в этот день
И́лон Рив Маск (англ. Elon Reeve Musk, МФА: [ˈiːlɒn 'mʌsk]; род. 28 июня 1971, Претория, Гаутенг, ЮАР) — американский и южноафриканский предприниматель, инженер и долларовый триллионер, государственный, политический и общественный деятель ультраправых и либертарианских взглядов. Основатель, генеральный директор и главный инженер компании SpaceX; крупнейший акционер, член совета директоров и генеральный директор компании Tesla; основатель The Boring Company; соучредитель Neuralink и OpenAI; генеральный директор XAI (объединяет xAI и социальную сеть X).
Кла́ус фон Кли́тцинг (нем. Klaus von Klitzing; род. 28 июня 1943, Шрода, оккупированная Германией часть Польши) — немецкий физик, лауреат Нобелевской премии по физике 1985. Открыл целочисленный квантовый эффект Холла, состоящий в квантовании Холловского сопротивления двумерного электронного газа в сильных магнитных полях и при низких температурах.
Мари́я Гёпперт-Ма́йер (нем. Maria Göppert-Mayer; 28 июня 1906, Катовице, Пруссия, Германская империя — 20 февраля 1972, Сан-Диего, Калифорния) — немецкий и американский учёный, физик-ядерщик, лауреат Нобелевской премии по физике (половина премии за 1963 год, совместно с Хансом Йенсеном, «за открытия, касающиеся оболочечной структуры ядра»; вторую половину премии получил Юджин Вигнер «за вклад в теорию атомного ядра и элементарных частиц, особенно с помощью открытия и приложения фундаментальных принципов симметрии»).
🌐 Знаковые события
1712 — в Санкт-Петербурге в присутствии Петра I на воду спущен первый линейный корабль, построенный в Главном адмиралтействе для Балтийского флота.
#Biography #Birth_Date #Events #28июня
И́лон Рив Маск (англ. Elon Reeve Musk, МФА: [ˈiːlɒn 'mʌsk]; род. 28 июня 1971, Претория, Гаутенг, ЮАР) — американский и южноафриканский предприниматель, инженер и долларовый триллионер, государственный, политический и общественный деятель ультраправых и либертарианских взглядов. Основатель, генеральный директор и главный инженер компании SpaceX; крупнейший акционер, член совета директоров и генеральный директор компании Tesla; основатель The Boring Company; соучредитель Neuralink и OpenAI; генеральный директор XAI (объединяет xAI и социальную сеть X).
Кла́ус фон Кли́тцинг (нем. Klaus von Klitzing; род. 28 июня 1943, Шрода, оккупированная Германией часть Польши) — немецкий физик, лауреат Нобелевской премии по физике 1985. Открыл целочисленный квантовый эффект Холла, состоящий в квантовании Холловского сопротивления двумерного электронного газа в сильных магнитных полях и при низких температурах.
Мари́я Гёпперт-Ма́йер (нем. Maria Göppert-Mayer; 28 июня 1906, Катовице, Пруссия, Германская империя — 20 февраля 1972, Сан-Диего, Калифорния) — немецкий и американский учёный, физик-ядерщик, лауреат Нобелевской премии по физике (половина премии за 1963 год, совместно с Хансом Йенсеном, «за открытия, касающиеся оболочечной структуры ядра»; вторую половину премии получил Юджин Вигнер «за вклад в теорию атомного ядра и элементарных частиц, особенно с помощью открытия и приложения фундаментальных принципов симметрии»).
1712 — в Санкт-Петербурге в присутствии Петра I на воду спущен первый линейный корабль, построенный в Главном адмиралтействе для Балтийского флота.
#Biography #Birth_Date #Events #28июня
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Виды Телецкого озера
🔥7
"Как я притворяюсь программистом"
Вот представьте, 40-летний, вполне состоявшийся человек, однажды решает поменять свою жизнь и идет в IT😨
Начинает учиться, и что-то даже писать на Java.🤓
Проходит некоторое время и волею судеб, этот мужик получает оффер и выходит на работу.🥳
Уже войдя в команду и выполняя поначалу простые, но тем не менее продуктовые задачи, он в тайне думает, что все это не взаправду.
Ведь:
❌ Вся команда может завтра узнать, что он новичок, и писать то не умеет.
❌ А код он берет с Stack Overflow и чатаЖПТ и скоро это выплывет наружу.
❌ Завтра он напишет код с багами и в него начнут тыкать пальцами.
❌ И зарплату ему платят зря, ведь он вообще ничего не знает и от него нет пользы.
❌ И вообще он занял место того, кто явно умнее, но менее удачлив.
Но проходит время и всего этого не происходит.
Наоборот, его периодически хвалят за хорошую работу, и неплохой код.
Его приложения давно крутятся на PROD-е, но данные мысли не уходят...
И если у тебя тоже так - добро пожаловать в клуб людей с «Синдромом Самозванца»
И ты спросишь - а что делать, то?
Самое важное - ПЕРЕСТАНЬ ПАРИТЬСЯ🙃
Эффективно бороться с «синдромом самозванца» можно только его же методами:
1. Понять и принять, что эти ощущения никуда не денутся долгое время😭
Ведь - «Программирование — это вечное незнание».
Еще очень долго будет казаться, что ты просто глуп для занимаемого тобою места и только признание команды, и осознание того, что ты справляешься, постепенно притупит эти ощущения.
2. Понять, что ты в этом не одинок.🤝
В сфере программирования даже у мидлов, отработавших уже далеко не один год, есть ощущение, что они "на грани провала".
Это нормально.
Одна из причин возникновения этого синдрома - сравнение себя с более опытными разработчиками. Видя, как они за день выдают в мердж реквест целую систему, кажется, что ты так никогда не сможешь и вообще бестолочь😉
Но, ты не видишь, как тот же сеньор загуглил вчера “what is hashmap in java” и сломал клавиатуру в попытках сделать зеленым тест, при написании это системы.
Все познается в сравнении.🙂
3. Понять, что чувство фальши значит - ты не врёшь себе. ☝️
Важно осознать свое место.
Понять, что ты хоть и новичок, но раз ты получил оффер, значит ты достоин. Если у тимлида к тебе нет претензий - значит ты справляешься.
Пойми, настоящие фейковые программисты никогда не страдают синдромом самозванца.
Сомнения — признак того, что тебе не всё равно, что ты понимаешь уровень своей компетенции. А это уже преимущество. Потому что только такие не стоят на месте.
ПОЭТОМУ
Не сомневайся
Пиши код. Ошибайся. Двигайся.
Даже прочитав это, ты уже не там, где был до этого.
Это и есть прогресс.
И мы с тобой✈️
😎
#motivation
Вот представьте, 40-летний, вполне состоявшийся человек, однажды решает поменять свою жизнь и идет в IT
Начинает учиться, и что-то даже писать на Java.
Проходит некоторое время и волею судеб, этот мужик получает оффер и выходит на работу.
Уже войдя в команду и выполняя поначалу простые, но тем не менее продуктовые задачи, он в тайне думает, что все это не взаправду.
Ведь:
Но проходит время и всего этого не происходит.
Наоборот, его периодически хвалят за хорошую работу, и неплохой код.
Его приложения давно крутятся на PROD-е, но данные мысли не уходят...
И если у тебя тоже так - добро пожаловать в клуб людей с «Синдромом Самозванца»
«Синдром самозванца» (на англ. impostor syndrome) — это психологическое явление, впервые описанное в 1978 году американскими психологами Полин Кланс и Сюзанн Аймс. Оно не является официальным психиатрическим диагнозом, но признано как психологический феномен, с которым сталкиваются миллионы людей, особенно в сферах с высоким уровнем интеллектуальной нагрузки — таких как программирование, наука, медицина, искусство.
Что это такое с научной точки зрения:
Синдром самозванца — это устойчивое внутреннее ощущение, что твои достижения не заслужены, что ты — "обманщик", и скоро все это "раскроется".
Люди с этим синдромом часто приписывают успех:
случайности,
везению,
внешним факторам ("мне просто помогли", "повезло с задачей"),
а не своим способностям или труду.
И это НЕ болезнь, но:
Может сопровождаться тревожностью, депрессией, перфекционизмом и прокрастинацией.
Чаще возникает у людей с высоким уровнем самокритики и требовательности к себе.
Не имеет четких диагностических критериев в МКБ-11 или DSM-5 (официальные классификаторы заболеваний), но изучается в клинической психологии.
И ты спросишь - а что делать, то?
Самое важное - ПЕРЕСТАНЬ ПАРИТЬСЯ
Эффективно бороться с «синдромом самозванца» можно только его же методами:
1. Понять и принять, что эти ощущения никуда не денутся долгое время
Ведь - «Программирование — это вечное незнание».
Еще очень долго будет казаться, что ты просто глуп для занимаемого тобою места и только признание команды, и осознание того, что ты справляешься, постепенно притупит эти ощущения.
2. Понять, что ты в этом не одинок.
В сфере программирования даже у мидлов, отработавших уже далеко не один год, есть ощущение, что они "на грани провала".
Это нормально.
Одна из причин возникновения этого синдрома - сравнение себя с более опытными разработчиками. Видя, как они за день выдают в мердж реквест целую систему, кажется, что ты так никогда не сможешь и вообще бестолочь
Но, ты не видишь, как тот же сеньор загуглил вчера “what is hashmap in java” и сломал клавиатуру в попытках сделать зеленым тест, при написании это системы.
Все познается в сравнении.
3. Понять, что чувство фальши значит - ты не врёшь себе. ☝️
Важно осознать свое место.
Понять, что ты хоть и новичок, но раз ты получил оффер, значит ты достоин. Если у тимлида к тебе нет претензий - значит ты справляешься.
Пойми, настоящие фейковые программисты никогда не страдают синдромом самозванца.
Сомнения — признак того, что тебе не всё равно, что ты понимаешь уровень своей компетенции. А это уже преимущество. Потому что только такие не стоят на месте.
ПОЭТОМУ
Не сомневайся
Пиши код. Ошибайся. Двигайся.
Даже прочитав это, ты уже не там, где был до этого.
Это и есть прогресс.
Интересный факт:
Исследования показывают, что 70–80% людей испытывали синдром самозванца хотя бы раз в жизни.
Особенно часто:
женщины в STEM-профессиях,
начинающие специалисты,
талантливые подростки и студенты.
И мы с тобой
#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
История технологии сегодня — 29 июня
ℹ️ Кто родился в этот день
Йозеф Людвиг Франц Рессель ( чеш . Josef Ludvík František Ressel ; 29 июня 1793 — 9 октября 1857) — австрийский лесничий и изобретатель, сконструировавший один из первых действующих корабельных винтов .
🌐 Знаковые события
1975 — в Институте ядерной энергии им. Курчатова введена в строй крупнейшая в мире термоядерная установка «Токамак-10».
2007 — в США поступил в продажу первый iPhone.
#Biography #Birth_Date #Events #29июня
Йозеф Людвиг Франц Рессель ( чеш . Josef Ludvík František Ressel ; 29 июня 1793 — 9 октября 1857) — австрийский лесничий и изобретатель, сконструировавший один из первых действующих корабельных винтов .
1975 — в Институте ядерной энергии им. Курчатова введена в строй крупнейшая в мире термоядерная установка «Токамак-10».
2007 — в США поступил в продажу первый iPhone.
#Biography #Birth_Date #Events #29июня
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Раздел 11. Работа с файлами, I/O и сетью (NIO.2)
Глава 1. Классический Java I/O (java.io)
PrintWriter и PrintStream – форматированный вывод. Путь данных и управление памятью
Внутреннее устройство PrintWriter
При конструировании
Рекомендуется оборачивать в
Методы форматированного вывода
print() и println()
printf() и format()
Путь данных в памяти при printf()
Путь данных детально:
Объекты в heap при одном вызове
#Java #для_новичков #beginner #IO #NIO #PrintWriter #PrintStream
Глава 1. Классический Java I/O (java.io)
PrintWriter и PrintStream – форматированный вывод. Путь данных и управление памятью
PrintWriter и PrintStream — высокоуровневые обертки для форматированного вывода текста. Они предоставляют методы print(), println(), printf(), которые автоматически преобразуют примитивы, объекты и строки в текстовое представление и записывают в underlying поток. Ключевое отличие от базовых Writer/OutputStream: эти классы никогда не выбрасывают IOException. Вместо этого они устанавливают внутренний флаг ошибки, проверяемый методом checkError().PrintStream — байтовый поток, наследник OutputStream. Исторически использовался для System.out и System.err. PrintWriter — символьный поток, наследник Writer. Предпочтителен для нового кода, так как работает с символами и корректно обрабатывает Unicode.Внутреннее устройство PrintWriter
// Упрощенная структура из OpenJDK
public class PrintWriter extends Writer {
// Underlying Writer для фактической записи
private Writer out;
// Флаг autoFlush: сброс буфера после println()
private boolean autoFlush;
// Флаг ошибки: true, если произошла IOException
private boolean trouble = false;
// Конструкторы
public PrintWriter(Writer out) {
this(out, false); // autoFlush = false по умолчанию
}
public PrintWriter(Writer out, boolean autoFlush) {
super(out);
this.out = out;
this.autoFlush = autoFlush;
}
public PrintWriter(String fileName) throws FileNotFoundException {
this(new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(fileName))), false);
}
}
При конструировании
new PrintWriter(new FileWriter(...)) создается цепочка оберток:PrintWriter
-> Writer (FileWriter)
-> FileWriter extends OutputStreamWriter
-> FileOutputStream (внутри OutputStreamWriter)
PrintWriter не имеет собственного буфера — он делегирует запись в underlying Writer. Если underlying Writer не буферизован (как FileWriter), каждый вызов print() инициирует немедленную запись. Рекомендуется оборачивать в
BufferedWriter:// Правильно: буферизация через BufferedWriter
new PrintWriter(new BufferedWriter(new FileWriter("file.txt")));
Методы форматированного вывода
print() и println()
public void print(String s) {
if (s == null) {
s = "null";
}
write(s); // Делегирование в underlying Writer
}
public void println(String s) {
print(s);
println(); // Запись разделителя строки
}
public void println() {
// Запись line.separator
write(System.lineSeparator());
if (autoFlush) {
flush(); // Сброс при autoFlush=true
}
}
println() добавляет платформенный разделитель строки и, при autoFlush=true, вызывает flush(). Это гарантирует немедленную видимость данных, но снижает производительность.printf() и format()
public PrintWriter printf(String format, Object... args) {
return format(format, args);
}
public PrintWriter format(String format, Object... args) {
try {
Formatter f = new Formatter(this);
f.format(format, args);
} catch (FormatterClosedException x) {
// Обработка
}
return this;
}printf() создает объект Formatter — сложный парсер форматных строк. Formatter анализирует строку формата, извлекает аргументы, выполняет преобразования и записывает результат в Appendable (в данном случае — PrintWriter).Путь данных в памяти при printf()
try (PrintWriter pw = new PrintWriter(
new BufferedWriter(new FileWriter("report.txt")))) {
pw.printf("Book: %s, Author: %s, Price: %.2f%n",
book.getTitle(), book.getAuthor(), book.getPrice());
}
Путь данных детально:
[Java: pw.printf("Book: %s...", title, author, price)]
-> [new Formatter(pw)] // Создание Formatter в heap
-> [Formatter.parse(format)] // Парсинг строки формата
-> [StringBuilder внутри Formatter: накопление результата]
-> [%s: title.toString()] // Вызов toString(), создание String
-> [%s: author.toString()] // Вызов toString(), создание String
-> [%.2f: String.format("%.2f", price)] // Создание String
-> [%n: замена на \n или \r\n]
-> [Formatter.flush(): запись StringBuilder в PrintWriter]
-> [PrintWriter.write(String)] // Делегирование в BufferedWriter
-> [BufferedWriter.write(char[], off, len)] // Накопление в cb
-> [OutputStreamWriter: кодирование char -> байты UTF-8]
-> [FileOutputStream: системный вызов при заполнении/flush]Объекты в heap при одном вызове
printf():Formatter — временный, собирается GC после вызоваStringBuilder внутри Formatter — временныйString от toString() аргументов — если аргументы уже String, новые не создаютсяString от форматирования чисел — временная#Java #для_новичков #beginner #IO #NIO #PrintWriter #PrintStream
👍4
Роль garbage collector
Жизненный цикл объектов при форматировании
Пик памяти:
Оптимизация: ручное форматирование для горячих путей
Этот подход переиспользует
autoFlush: семантика и производительность
При
Путь данных с
Для логирования в реальном времени
Практический пример: запись книг в CSV
Путь данных и память при записи CSV
Для книги с
Объекты в heap за одну итерацию:
Все временные, собираются minor GC. Для 1 000 000 книг — ~360MB временных объектов, но они не накапливаются.
#Java #для_новичков #beginner #IO #NIO #PrintWriter #PrintStream
Жизненный цикл объектов при форматировании
public void writeBooksCsv(String path, List<Book> books) throws IOException {
// Объекты, создаваемые при конструировании:
// - FileWriter (heap)
// - BufferedWriter (heap) с cb[8192] (heap, 16KB)
// - PrintWriter (heap)
try (PrintWriter pw = new PrintWriter(
new BufferedWriter(new FileWriter(path)))) {
pw.println("Title,Author,Price,Year"); // Заголовок
for (Book book : books) {
// Каждая итерация:
// - Formatter (временный, внутри printf)
// - StringBuilder (временный, внутри Formatter)
// - String от Double.toString() или String.format() (временный)
// - char[] при записи в BufferedWriter (переиспользуется)
pw.printf("%s,%s,%.2f,%d%n",
escapeCsv(book.getTitle()),
escapeCsv(book.getAuthor()),
book.getPrice(),
book.getYear());
// Formatter и StringBuilder собираются GC
// String от escapeCsv() — если не сохранена, собирается
}
} // close() с flush()
// Все объекты недостижимы, GC собирает
}Пик памяти:
BufferedWriter.cb (16KB) + Formatter + StringBuilder + временные String. Для списка в 1 000 000 книг создается 1 000 000 объектов Formatter и StringBuilder — все короткоживущие, собираются minor GC.Оптимизация: ручное форматирование для горячих путей
// Антипаттерн для горячих путей: printf создает много временных объектов
pw.printf("%s,%s,%.2f,%d%n", title, author, price, year);
// Оптимизация: ручное форматирование через StringBuilder
// (но PrintWriter не предоставляет доступа к внутреннему буферу)
// Альтернатива: накопление в собственном StringBuilder, затем одна запись
StringBuilder sb = new StringBuilder(256);
for (Book book : books) {
sb.setLength(0); // Сброс без создания нового объекта
sb.append(escapeCsv(book.getTitle())).append(',')
.append(escapeCsv(book.getAuthor())).append(',')
.append(String.format("%.2f", book.getPrice())).append(',')
.append(book.getYear()).append('\n');
pw.write(sb.toString());
}
Этот подход переиспользует
StringBuilder, устраняя создание Formatter. Однако String.format("%.2f", ...) все еще создает временные объекты. Для полной оптимизации требуется ручное форматирование чисел.autoFlush: семантика и производительность
// autoFlush=true: flush() после каждого println()
try (PrintWriter pw = new PrintWriter(
new BufferedWriter(new FileWriter("log.txt")), true)) {
pw.println("Entry 1"); // Запись + flush()
pw.println("Entry 2"); // Запись + flush()
// Каждый flush() = сброс BufferedWriter -> OutputStreamWriter -> FileOutputStream
}
При
autoFlush=true каждый println() инициирует полный сброс цепочки: BufferedWriter.flushBuffer() -> OutputStreamWriter.flush() -> FileOutputStream.flush() -> системный вызов. Это гарантирует немедленную запись, но снижает производительность на порядки.Путь данных с
autoFlush=true:[println("Entry")]
-> [print("Entry")]
-> [BufferedWriter.write("Entry")] // Накопление в cb
-> [println()]
-> [write("\n")] // Накопление в cb
-> [flush()] // СБРОС!
-> [BufferedWriter.flushBuffer()]
-> [OutputStreamWriter.write(cb, 0, n)]
-> [StreamEncoder: кодирование]
-> [FileOutputStream: системный вызов]
-> [Page Cache]Для логирования в реальном времени
autoFlush=true оправдан. Для пакетной записи — катастрофичен.Практический пример: запись книг в CSV
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
public class CsvBookWriter {
public void writeBooks(String path, List<Book> books) throws IOException {
// Цепочка оберток с буферизацией
// PrintWriter -> BufferedWriter -> OutputStreamWriter -> FileOutputStream
try (PrintWriter pw = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(path), StandardCharsets.UTF_8)))) {
// Заголовок CSV
pw.println("id,title,author,price,year,pages");
// Данные
for (Book book : books) {
pw.printf("%d,\"%s\",\"%s\",%.2f,%d,%d%n",
book.getId(),
escapeCsv(book.getTitle()),
escapeCsv(book.getAuthor()),
book.getPrice(),
book.getYear(),
book.getPages());
}
// Явный flush перед закрытием
pw.flush();
// Проверка ошибок
if (pw.checkError()) {
throw new IOException("Error occurred during writing");
}
} // close() с неявным flush()
}
// Экранирование спецсимволов CSV
private String escapeCsv(String value) {
if (value == null) return "";
return value.replace("\"", "\"\"");
}
public record Book(int id, String title, String author,
double price, int year, int pages) {}
}
Путь данных и память при записи CSV
Для книги с
title="The Great Gatsby", author="F. Scott Fitzgerald", price=10.99:[printf("%d,\"%s\",\"%s\",%.2f,%d,%d%n", ...)]
-> [Formatter создан в heap]
-> [StringBuilder внутри Formatter создан в heap]
-> [Форматирование: "1,\"The Great Gatsby\",\"F. Scott Fitzgerald\",10.99,1925,180\n"]
-> [toString() для title — уже String, новый объект не создан]
-> [String.format("%.2f", 10.99) — создание String "10.99" в heap]
-> [Formatter.flush(): запись в PrintWriter]
-> [PrintWriter.write(String)]
-> [BufferedWriter.write(char[], 0, len)]
-> [Накопление в cb[8192]]
-> [При заполнении cb: сброс в OutputStreamWriter]
-> [Кодирование UTF-8]
-> [FileOutputStream: системный вызов]
-> [Formatter и StringBuilder — недостижимы, GC собирает]Объекты в heap за одну итерацию:
Formatter — ~200 байтStringBuilder — ~40 байт + внутренний char[] — ~80 байтString от String.format("%.2f", ...) — ~40 байт + char[]/byte[]Все временные, собираются minor GC. Для 1 000 000 книг — ~360MB временных объектов, но они не накапливаются.
PrintWriter предпочтителен для всего текстового вывода благодаря явному контролю кодировки и корректной работе с Unicode.#Java #для_новичков #beginner #IO #NIO #PrintWriter #PrintStream
👍4
Что выведет код?
#Tasks
import java.io.*;
public class Task290626 {
public static void main(String[] args) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (PrintWriter pw = new PrintWriter(baos, true)) {
pw.print("Hello");
}
System.out.println(baos.size());
}
}
#Tasks
👍2
👍2
Что такое метод 🤓
Ответ:
String.repeat(int count) (Java 11) возвращает новую строку, состоящую из исходной, повторённой count раз.
Если count = 0, возвращается пустая строка.
Если count < 0, выбрасывается IllegalArgumentException.
Полезно для генерации отступов, разделителей, простой вёрстки. Пример: "-".repeat(10) → "----------".
Упрощает код по сравнению с циклами и StringBuilder.
#собеседование
String.repeat()? Ответ:
String.repeat(int count)
Если count = 0, возвращается пустая строка.
Если count < 0, выбрасывается IllegalArgumentException.
Полезно для генерации отступов, разделителей, простой вёрстки. Пример: "-".repeat(10) → "----------".
Упрощает код по сравнению с циклами и StringBuilder.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 30 июня
ℹ️ Кто родился в этот день
Влади́мир Алекса́ндрович Михельсо́н (18 [30] июня 1860, Тульчин, Подольская губерния (ныне Винницкая область Украины) — 27 февраля 1927, Москва) — русский и советский физик и геофизик, метеоролог, один из основоположников отечественной актинометрии, профессор. Михельсон первым применил методы статистической физики для определения функции распределения энергии в спектре излучения абсолютно чёрного тела. Обобщил эффект Доплера на случай, когда свет проходит через среду с изменяющимся показателем преломления. Установил зависимость скорости распространения волны горения от состава горючей газовой смеси (детонация и дефлаграция). Заложил основы теории взрывного горения и развил теорию горения газовой смеси в горелке Бунзена.
Влади́мир Никола́евич Челоме́й (17 (30) июня 1914, Седльце, Российская империя — 8 декабря 1984, Москва, СССР) — советский конструктор ракетно-космической техники и учёный в области механики и процессов управления, организатор науки, педагог высшей школы. Основные научные труды В. Н. Челомея относятся к области конструкции и динамике машин, теории колебаний, динамической устойчивости упругих систем, теории сервомеханизмов. В 1986 году в Государственный реестр открытий СССР под № 314 занесено открытие «Явления аномально высокого прироста тяги в газовом эжекционном процессе с пульсирующей активной струёй».
🌐 Знаковые события
1948 — учёные Уильям Шокли, Уолтер Браттейн и Джон Бардин из «Bell Laboratories» объявили о создании транзистора.
#Biography #Birth_Date #Events #30июня
Влади́мир Алекса́ндрович Михельсо́н (18 [30] июня 1860, Тульчин, Подольская губерния (ныне Винницкая область Украины) — 27 февраля 1927, Москва) — русский и советский физик и геофизик, метеоролог, один из основоположников отечественной актинометрии, профессор. Михельсон первым применил методы статистической физики для определения функции распределения энергии в спектре излучения абсолютно чёрного тела. Обобщил эффект Доплера на случай, когда свет проходит через среду с изменяющимся показателем преломления. Установил зависимость скорости распространения волны горения от состава горючей газовой смеси (детонация и дефлаграция). Заложил основы теории взрывного горения и развил теорию горения газовой смеси в горелке Бунзена.
Влади́мир Никола́евич Челоме́й (17 (30) июня 1914, Седльце, Российская империя — 8 декабря 1984, Москва, СССР) — советский конструктор ракетно-космической техники и учёный в области механики и процессов управления, организатор науки, педагог высшей школы. Основные научные труды В. Н. Челомея относятся к области конструкции и динамике машин, теории колебаний, динамической устойчивости упругих систем, теории сервомеханизмов. В 1986 году в Государственный реестр открытий СССР под № 314 занесено открытие «Явления аномально высокого прироста тяги в газовом эжекционном процессе с пульсирующей активной струёй».
1948 — учёные Уильям Шокли, Уолтер Браттейн и Джон Бардин из «Bell Laboratories» объявили о создании транзистора.
#Biography #Birth_Date #Events #30июня
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
[Совет по Java #055]
Тема:
Проблема: В асинхронном программировании с
Разработчики часто используют
Решение: Используйте
Эти методы вызываются всегда — как при нормальном завершении, так и при исключении.
Объяснение: При вызове
Все последующие этапы, созданные через методы без обработки ошибок (
#Java #советы
Тема:
CompletableFuture при вызове completeExceptionally не возвращает значение, но последующие thenApply не выполняются.Проблема: В асинхронном программировании с
CompletableFuture исключение, переданное через completeExceptionally, прерывает цепочку стадий, построенных через thenApply, thenAccept и подобные методы. Они попросту игнорируются, а исключение "проваливается" дальше, пока не встретит обработчик. Разработчики часто используют
exceptionally для восстановления, но он имеет ограничение: он выполняется только при исключении и не знает о значении при успешном завершении. Это приводит к дублированию логики или потере доступа к результату при нормальной работе.Решение: Используйте
handle(BiFunction) или whenComplete(BiConsumer). Эти методы вызываются всегда — как при нормальном завершении, так и при исключении.
handle принимает би-функцию, которая получает результат и исключение (одно из них null), и может возвращать новое значение для продолжения цепочки. whenComplete — аналогично, но возвращает CompletableFuture того же типа и не может изменить результат; он подходит для сайд-эффектов (логирование, аудит). public class CompletableFutureHandle {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// Создаем будущее, которое завершится исключительно
CompletableFuture<String> failedFuture = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Ошибка в задаче");
});
//thenApply не выполнится, исключение игнорируется
CompletableFuture<String> badChain = failedFuture.thenApply(s -> s + " обработано");
// badChain.get() выбросит ExecutionException с исходной ошибкой
//handle: всегда вызывается, получает результат или исключение
CompletableFuture<String> handled = failedFuture.handle((result, ex) -> {
if (ex != null) {
System.err.println("Ошибка: " + ex.getMessage());
return "Значение по умолчанию";
}
return result + " (успех)";
});
System.out.println("handle result: " + handled.join()); // Значение по умолчанию
//whenComplete: для логирования, не меняет результат
CompletableFuture<String> logged = failedFuture.whenComplete((result, ex) -> {
if (ex != null) {
System.err.println("Логируем ошибку: " + ex);
} else {
System.out.println("Успешно: " + result);
}
});
// logged по-прежнему будет завершено исключительно
// logged.join() выбросит CompletionException
// Обработка через exceptionally (только при ошибке)
CompletableFuture<String> recovered = failedFuture.exceptionally(ex -> {
System.err.println("Восстановление: " + ex);
return "Восстановленное значение";
});
System.out.println("exceptionally: " + recovered.join());
// Комбинирование: handle может изменить тип
CompletableFuture<Integer> typed = failedFuture.handle((s, ex) -> {
return ex != null ? -1 : s.length();
});
System.out.println("handle with type: " + typed.join()); // -1
}
}Объяснение: При вызове
completeExceptionally будущее переходит в состояние "завершено с исключением". Все последующие этапы, созданные через методы без обработки ошибок (
thenApply, thenCompose и т.д.), не выполняются, а исключение распространяется по цепочке. handle и whenComplete являются "терминальными" в смысле обработки ошибок — они всегда вызываются и предоставляют доступ к обоим исходам. handle может преобразовать ошибку в результат, что часто удобно для восстановления или трансформации. whenComplete предназначен для побочных действий и не влияет на значение будущего.#Java #советы
👍6
Что выведет код?
#Tasks
import java.util.concurrent.CompletableFuture;
public class Task300626 {
public static void main(String[] args) throws Exception {
CompletableFuture<String> future = new CompletableFuture<>();
CompletableFuture<String> result = future
.thenApply(s -> s + "!")
.exceptionally(ex -> "fallback");
future.completeExceptionally(new RuntimeException("Oops"));
System.out.println(result.get());
}
}
#Tasks
👍2
👍2
Какие методы появились в 🤓
Ответ:
Помимо repeat(), добавились:
isBlank() — возвращает true, если строка пуста или содержит только пробелы.
lines() — возвращает Stream<String> строк, разбитых по \n, \r, или \r\n.
strip() — удаляет пробелы в начале и конце (понимает Unicode, в отличие от trim()).
stripLeading() / stripTrailing() — соответственно. formatted(Object... args) — упрощает форматирование: "Hello %s".formatted("World").
Эти методы делают работу со строками более выразительной и безопасной.
#собеседование
String в Java 11? Ответ:
isBlank() — возвращает true, если строка пуста или содержит только пробелы.
lines() — возвращает Stream<String> строк, разбитых по \n, \r, или \r\n.
strip() — удаляет пробелы в начале и конце (понимает Unicode, в отличие от trim()).
stripLeading() / stripTrailing() — соответственно. formatted(Object... args) — упрощает форматирование: "Hello %s".formatted("World").
Эти методы делают работу со строками более выразительной и безопасной.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
История технологии сегодня — 01 июля
ℹ️ Кто родился в этот день
Михаи́л Миха́йлович Шульц (1 июля 1919 года, Петроград — 9 октября 2006 года, Санкт-Петербург) — учёный-химик, физикохимик, художник. Действительный член АН СССР (1979, с 1991 — РАН), Герой Социалистического Труда (1991), лауреат двух Государственных премий СССР. Шульц написал ряд работ по термодинамической теории, термодинамике гетерогенных систем, теории стёкол, химии и электрохимии стекла, мембранной электрохимии, теории ионного обмена и фазовых равновесий многокомпонентных систем, теории стеклянного электрода. С именем учёного связано становление pH-метрии и ионометрии, организация производства измерительной аппаратуры и материалов, широко используемых в медицине, химической и ядерной промышленности, в авиа- и ракетно-космической технике, в сельском хозяйстве и многих других областях.
🌐 Знаковые события
1896 — На Всероссийской промышленной выставке в Нижнем Новгороде представлен первый русский автомобиль (создатели — Евгений Яковлев и Пётр Фрезе).
#Biography #Birth_Date #Events #01июля
Михаи́л Миха́йлович Шульц (1 июля 1919 года, Петроград — 9 октября 2006 года, Санкт-Петербург) — учёный-химик, физикохимик, художник. Действительный член АН СССР (1979, с 1991 — РАН), Герой Социалистического Труда (1991), лауреат двух Государственных премий СССР. Шульц написал ряд работ по термодинамической теории, термодинамике гетерогенных систем, теории стёкол, химии и электрохимии стекла, мембранной электрохимии, теории ионного обмена и фазовых равновесий многокомпонентных систем, теории стеклянного электрода. С именем учёного связано становление pH-метрии и ионометрии, организация производства измерительной аппаратуры и материалов, широко используемых в медицине, химической и ядерной промышленности, в авиа- и ракетно-космической технике, в сельском хозяйстве и многих других областях.
1896 — На Всероссийской промышленной выставке в Нижнем Новгороде представлен первый русский автомобиль (создатели — Евгений Яковлев и Пётр Фрезе).
#Biography #Birth_Date #Events #01июля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Раздел 11. Работа с файлами, I/O и сетью (NIO.2)
Глава 1. Классический Java I/O (java.io)
SequenceInputStream – объединение потоков. Последовательное чтение и управление памятью
Ключевое архитектурное решение — ленивое переключение между потоками.
Конструкторы и внутреннее устройство
Конструктор с двумя потоками создает временный
Создание
Механика чтения и путь данных
Посимвольное чтение
Путь данных для
Критически важно:
Блочное чтение
Блочное чтение более эффективно: данные копируются напрямую из underlying потока в предоставленный массив без промежуточных буферов
#Java #для_новичков #beginner #IO #NIO #SequenceInputStream
Глава 1. Классический Java I/O (java.io)
SequenceInputStream – объединение потоков. Последовательное чтение и управление памятью
SequenceInputStream — декоратор над одним или несколькими InputStream, который представляет их как единый непрерывный поток. Данные читаются последовательно: сначала из первого потока до его исчерпания, затем из второго, и так далее. С точки зрения вызывающего кода это обычный InputStream — методы read(), available(), close() работают прозрачно, скрывая факт наличия нескольких underlying источников.Ключевое архитектурное решение — ленивое переключение между потоками.
SequenceInputStream не читает данные заранее и не буферизует их. Он делегирует вызовы текущему активному потоку, и только при достижении конца текущего потока (возврат -1) переключается на следующий. Это минимизирует потребление памяти: данные не дублируются, а передаются напрямую из underlying потоков в вызывающий код.Конструкторы и внутреннее устройство
// Упрощенная структура из OpenJDK
public class SequenceInputStream extends InputStream {
// Текущий активный поток
private InputStream in;
// Перечисление оставшихся потоков
private Enumeration<InputStream> e;
// Конструктор для двух потоков
public SequenceInputStream(InputStream s1, InputStream s2) {
Vector<InputStream> v = new Vector<>(2);
v.addElement(s1);
v.addElement(s2);
e = v.elements();
nextStream(); // Установка первого потока
}
// Конструктор для произвольного количества потоков
public SequenceInputStream(Enumeration<InputStream> e) {
this.e = e;
nextStream(); // Установка первого потока
}
// Переключение на следующий поток
private void nextStream() {
if (in != null) {
in.close(); // Закрытие исчерпанного потока
}
in = e.hasMoreElements() ? e.nextElement() : null;
}
}
Конструктор с двумя потоками создает временный
Vector — устаревшая synchronized коллекция. Это исторический артефакт: SequenceInputStream существует с Java 1.0, и Vector был стандартом того времени. Создание
Vector в heap — незначительная аллокация, но в современном коде предпочтительнее использовать конструктор с Enumeration, построенным из Iterator или Collections.enumeration().Механика чтения и путь данных
Посимвольное чтение
public int read() throws IOException {
if (in == null) {
return -1; // Все потоки исчерпаны
}
int c = in.read(); // Делегирование текущему потоку
if (c == -1) {
nextStream(); // Переключение на следующий
return read(); // Рекурсивный вызов для нового потока
}
return c;
}Путь данных для
read():[Java: sis.read()]
-> [SequenceInputStream: in != null?]
-> [in.read()] // Делегирование текущему потоку
-> [Например, FileInputStream.read()]
-> [Системный вызов read()]
-> [Page Cache -> нативный буфер -> byte в heap]
-> [c == -1?] // Конец текущего потока?
-> [Нет: возврат c]
-> [Да: nextStream()]
-> [in.close()] // Закрытие исчерпанного потока
-> [in = e.nextElement()] // Следующий поток
-> [Рекурсивный read()] // Чтение из нового потока
Критически важно:
nextStream() автоматически закрывает исчерпанный поток. Это предотвращает утечку файловых дескрипторов. Однако если underlying потоки не поддерживают повторное открытие (как FileInputStream), они становятся недоступны после закрытия.Блочное чтение
public int read(byte[] b, int off, int len) throws IOException {
if (in == null) {
return -1;
}
if (b == null) {
throw new NullPointerException();
}
int n = in.read(b, off, len); // Попытка чтения из текущего потока
if (n > 0) {
return n; // Данные прочитаны
}
if (n == -1) {
nextStream(); // Конец потока — переключение
return read(b, off, len); // Рекурсивный вызов
}
// n == 0: поток вернул 0 байт, но не EOF
return 0;
}Блочное чтение более эффективно: данные копируются напрямую из underlying потока в предоставленный массив без промежуточных буферов
SequenceInputStream. Это минимизирует копирование в памяти.#Java #для_новичков #beginner #IO #NIO #SequenceInputStream
👍3