SILLYFEED

Java

@javatg · 17.1K подписчиков

Открыть канал в Telegram

Посты канала Java в SillyFeed: единая лента публичных Telegram-каналов со ссылками на оригиналы.

Самая актуальная информация по JavaПо всем вопросам-@haarrp@itchannels_telegram-🔥лучшие каналы@pythonl-🐍@ai_machinelearning_big_data- ml@ArtificialIntelligencedl- AI@datascienceiot- ds@pythonlbooks📚РКН:clck.ru/3FmwKr#VRHSZ

Посты канала

Java
💡 Java: вложенные if-else быстро превращают код в лабиринтКогда вся логика уходит в глубокую вложенность, читать метод становится больно: основной сценарий спрятан где-то внизу, а перед ним несколько уровней проверок.Проще использовать guard clauses - ранние проверки с выходом из метода.Было:- проверяем user- внутри проверяем active- внутри проверяем order- внутри проверяем paid- только потом выполняем основное действиеСтало:- если user == null - сразу ошибка- если user неактивен - сразу ошибка- если order == null - сразу ошибка- если order не оплачен - сразу ошибка- основная логика остаётся плоской и читаемойТакой код легче:- читать- тестировать- ревьюить- расширять без превращения метода в пирамиду из ifGuard clauses - маленький приём, который сильно улучшает чистоту кода.
Java
⚡️ Java совет: перестань терять производительность из-за boxingКогда используешь Stream<Integer>, JVM создаёт объект Integer для каждого значения.Это лишние аллокации, нагрузка на GC и замедление кода.Если работаешь с примитивами — используй primitive streams.❌ Boxing (медленнее)Stream<Integer> boxed = Stream.of(1, 2, 3, 4, 5);int sumBoxed = boxed.reduce(0, Integer::sum);✅ Без boxing (быстрее и эффективнее)int sumPrimitive = IntStream.of(1, 2, 3, 4, 5).sum();Другие primitive streams:IntStreamLongStreamDoubleStreamКогда это критично:• большие коллекции• high-load сервисы• data processing• performance-sensitive кодПравило простое: Если работаешь с числами - используй primitive streams, а не обёртки.⚡️ Полезные ресурсы по Java 🚀 Max@javatg
Java
🚀 Java: используйте ReentrantReadWriteLock, когда чтений намного больше, чем записейЕсли у вас есть общий ресурс (например, кэш, конфигурация или состояние сервиса), который часто читают разные потоки, но редко изменяют — обычный synchronized может сильно тормозить систему.В таких случаях лучше использовать ReentrantReadWriteLock из java.util.concurrent.Идея простая:- Read Lock — позволяет нескольким потокам читать данные одновременно - Write Lock — разрешает запись только одному потоку и блокирует всех остальных Таким образом можно сильно увеличить параллелизм: десятки потоков могут читать данные одновременно, а запись происходит эксклюзивно.Когда это полезно:- данные читаются очень часто - записи происходят редко - важно максимально увеличить throughput системыПримеры использования: кэш в сервисе, конфигурации, метаданные, in-memory storage, state менеджеры.import java.util.concurrent.locks.ReentrantReadWriteLock;public class SharedValue { private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); private int value = 0; public int readValue() { lock.readLock().lock(); try { return value; } finally { lock.readLock().unlock(); } } public void writeValue(int newValue) { lock.writeLock().lock(); try { value = newValue; } finally { lock.writeLock().unlock(); } }}Главный плюс:несколько потоков могут читать одновременно, не блокируя друг друга.Но как только начинается запись - все чтения и записи блокируются, пока операция не завершится.

Ещё по теме «Технологии»

Технологии
Машинное обучение RU
🚀 CodePilot: GUI для Claude CodeCodePilot — это настольное приложение с графическим интерфейсом для взаимодействия с Claude Code. Оно позволяет удобно общаться, писать код и управлять проектами без использования терминала. Приложение поддерживает управление сессиями, визуализацию файлов и настройку разрешений.🚀 Основные моменты:- 💬 Реальное взаимодействие с Claude с поддержкой Markdown и подсветки синтаксиса.- 📂 Удобное управление сессиями и сохранение разговоров в SQLite.- 🎯 Контекст проекта с живым деревом файлов.- 🔒 Настройка разрешений для действий.- ⚙️ Поддержка нескольких режимов взаимодействия.📌 GitHub: https://github.com/op7418/CodePilot#javascript
Василий 💥 Волшебник | Технический маркетолог 0340
⚠️ Новая схема телефонных МОШЕННИКОВ!Наткнулся в интернете на историю, и решил пересказать её здесь. Потому что именно на таких простых вещах люди чаще всего и попадаются.Ситуация произошла с девушкой-бровистом из Самары. Ей пишет клиентка: «Здравствуйте, можно записаться на ламинирование бровей?»Начинается стандартный диалог. Спрашивает прайс, уточняет адрес студии, всё выглядит максимально нормально. Никаких подозрений.Потом клиентка предлагает: «Можно я вам позвоню?»Девушка соглашается.Через пару секунд приходит звонок с какого-то странного номера. Не самарский, не московский, вообще какой-то непонятный. Звонок тут же сбрасывается.После этого клиентка пишет: «Я вам звоню, а вы не берёте».И тут же звонит ещё раз, но уже с другого номера.Параллельно объясняет:«Ой, у меня просто две сим-карты в телефоне. Я не знаю, с какого номера вам позвонила».И дальше идёт ключевая фраза. Она пишет:«Скажите, пожалуйста, с какого номера я вам звонила? Назовите последние две цифры».На этом месте девушка насторожилась и просто заблокировала человека.☝️ Схема здесь довольно простая. Мошеннику нужно, чтобы вы озвучили последние цифры или весь номер входящего звонка. Иногда это используют для обхода разных систем подтверждения, иногда - чтобы дальше выстроить более сложную комбинацию.То есть внешне это выглядит как обычный диалог с клиентом. Но в какой-то момент вас подводят к тому, чтобы вы начали выдавать информацию.❗️ Поэтому базовое правило: если незнакомый человек начинает просить вас назвать какие-то цифры, коды, последние номера, подтверждения - лучше просто остановить разговор!Особенно когда всё это происходит в странной и нелогичной форме.Решил поделиться этой историей, потому что такие схемы обычно распространяются волнами. Сегодня это бровисты, завтра могут быть фрилансеры, администраторы онлайн-школ и вообще любые специалисты, которые общаются с клиентами в мессенджерах.Сталкивались с похожими попытками обмана? Интересно, какие ещё схемы сейчас гуляют. Поделитесь!Канал в ТГ | Канал в Max#советспеца
Влад Кибенко // qbnk // Mini Apps, Development and Me
🙂 Как проверить, что попадёт в бандлПисать эффективный frontend — это очень важно. Во времена, когда Интернет имеет достаточно высокую скорость, разработчики не сильно заморачиваются на тему того, каким будет размер их приложения. А зря.С моей точки зрения, быстрый Интернет — это когнитивное искажение, которое возникает вследствие постоянного обитания в таковом. Когда в больших города с Интернетом чаще всего всё в порядке, в городах поменьше можно наблюдать картину, в которой существует какой-нибудь slow 4G, а то и 3G. Если вспомнить про страны, в которых Интернет в принципе не сильно развит, то проблема встаёт ещё острее.Именно по этой причине я всегда смотрю на то, сколько трафика качает пользователь. Чтобы это приходилось реже перепроверять, важно понимать, как бандлер работает с импортами, а еще перепроверять, как реализованы используемые библиотеки. Это не значит, что нужно идти и лезть в исходный код библиотек, достаточно использовать сервис, о котором расскажу дальше. Вот вам пример одного и того же намерения, но потенциально разного результата:
import { string } from 'valibot';console.log(string);
import * as v from 'valibot';console.log(v.string);
Вы можете сходу сказать, что из этого тяжелее? Скорее всего второй вариант. Почему? Потому что такой способ импорта потянет за собой все side-effect-ы, которые есть в библиотеке. Почему "скорее всего"? Потому что зависит от того, как разработчик реализовал эту библиотеку.Чтобы проверить, какой трафик вы потянете из этой библиотеки, можно использовать сервис bundlejs.com. Используйте там код, упомянутый выше, жмите кнопку Build, и справа в консоли увидите объем трафика, который скачает пользователь, чтобы заиспользовать этот функционал. Важно: не забывайте использовать импортированные значения, иначе они будут tree-shake-нуты (удалены) бандлером, и размер будет невалидный. Для этого я использовал console.log.Какие выводы следует сделать из этого поста?1. Пишите библиотеки без side-effect-ов. Это отдельный здоровый топик, который я разбирал тут, тут и тут. Просто придерживаетесь определенных правил, и у тех, кто использует библиотеку, проблем не будет.2. Проверяйте то, что используете. Зная про проблемы импорта import * as N, я решил на всякий случай проверить, не потяну ли действительно всю библиотеку просто из-за одного значения. А использую я иногда такой импорт, потому что он чуть удобнее прямого импорта сущностей.Хорошо писать библиотеки — это искусство. Нужно понимать, что является side-effect-ом, а что нет, понимать, как подсказать сборщику разработчика, что указанный вызов или функция являются чистыми, знать, как разбить код таким образом, чтобы связанность была как можно меньше, и сборщик мог откинуть ненужный код. Но именно в этом и кроется профессионализм — в способности максимально эффективно закрыть боль пользователя.———Стрим сегодня вечером. Ориентировочно в 17:00 Мск. До встречи! 👋
unitsyn photo
Первое свободное утро за неделю😅 Когда встал вопрос о починке F80, первым делом естественно начал искать мастера в Москве. Нашел. Говорит ну, это очень сложно, будем наваривать пластик, подгонять, две недели на ремонт.Прошерстил интернет, эта проблема с защелками дверцы для F80 типичная. Нашел 3D модель, нашел кто печатает. На все про все у меня ушло 20 минут😅Сегодня солнечно, тепло, пойду ка прогуляюсь, поснимаю стрит, протестирую. Всем хороших выходных!☺️
аня лепит 🌱
Дракошка 🌸Захотелось попробовать сделать флекси-фигурку. Еще не пробовала таким заниматься, так что ожидаются затупы в момент моделирования соединений, но, надеюсь, все не так страшно, как кажется 😅#3d #wip
🎷НеБрегович (No escape from Balkan)
А вот и Дубиоза про ИИ клип сделала, песня с красноречивым названием Jebiga. Их подход немного другой, но довольно узнаваемый - ничего нас не колышит, книжки больше не нужны, да и вообще зачем думать теперь.Не шедевр, но, пожалуй, самой интересной деталью стала визуализация ИИ - полено с платой и кнопкой, которая преображает реальность.Ок, принимается, по крайней мере лучше, чем их недавний турбофолк фит с Бреговичем🙈🙉🙊
Будни разработчика
#заметка дняПродолжение эпопеи про пульт для телевизоров на Flutter. В последнем посте я писал об неком подобии игры в CTF на сайте Samsung Apps.Что появилось с тех пор? Вообще, достаточно многое, но сейчас — чуть более прозаичная тема.Как это обычно бывает, иногда приходится внимательно смотреть, как те же задачи решают другие.Наткнулся на один пример, который идёт ровно по поему плану. Удивило, что у них — одна кнопка для play/pause, как на обычных пультах.Я был почти уверен, что без реального знания состояния плеера это корректно не сделать. Стало принципиально интересно, как они это реализовали.Попробовал декомпилировать через Ghidra — толком не вышло. Кроме строк ничего полезного вытащить не удалось, и там — ничего примечательного: ни скрытых команд, ни дополнительных кнопок. Тогда пришлось идти по сетевому следу.Поднял сервер, отвечающий на SSDP-запросы, начал сниффать весь трафик на предмет поисковых строк, логировать каждый запрос и его аргументы. Многие вещи пришлось копировать с реального телевизора — в том числе DMR-запросы (Digital Media Renderer, часть стандарта DLNA), через которые устройство объявляет и принимает мультимедийные возможности.Больше всего времени ушло на корректный ответ токен-авторизации: нужно было добиться, чтобы приложение приняло фейковый ответ. Ирония в том, что моё приложение в своё время вообще не проверяло формат ответа и не ждало подтверждения — вроде как получил токен и достаточно. Убил пару часов, а оказалось......оказалось эти гении просто отправляют pause и ставят у себя флажок. Следующее нажатие — play. Потом снова pause... ну вы поняли. Если видео не играет — нажать надо два раза. А если с другого пульта остановить воспроизведение — тоже.Я ожидал API, а получил социальную инженерию, на которую сам и попался. Надо было просто потестировать дольше минуты.Тем временем мой пульт уверенно движется к релизу: аккуратно выглядит на разных мобильных устройствах, на десктопах появились горячие клавиши, помимо Samsung Tizen теперь частично поддерживается и LG webOS, а ещё можно кастить фотографии на экран телевизора. Для публикации в Google Play нужно 12 тестировщиков — если хотите поучаствовать, буду рад услышать.#flutter #remote #smarttv