Using Claude Code to modernize a 25-year-old kernel driver 🔥 Горячее 💬 Длинная дискуссия
- Увлечение — восстановление данных с кассет QIC-80 90-х гг.
- Драйвер
ftape
(Linux 2.4) последний раз собирался ~2000 г.; с тех пор приходится держать CentOS 3.5. - Привод подключается к контроллеру гибкого диска: дёшево, но 500 Кбит/с и куча «магии» портов/IRQ.
- Под DOS/Windows есть проприетарные утилиты, но только
ftape
даёт «сырой» дамп, независимо от формата ПО, которое писало кассету.
Цель: переписать драйвер под современное ядро без боли.
Инструмент — Claude Code (Claude 3.5 Sonnet) в режиме «актов» (акт = автоматический цикл «предложи-отладь-протестируй»).
Ход работы
- Запустил
claude
в каталоге исходниковftape-4.04
(1999 г.). - Первый акт: «сделай модуль для ядра 6.10». Claude выдал:
- заменил
cli/sti
наspinlock_t
; sleep_on
→wait_event
;register_blkdev
→blk_mq
;kmalloc
→kmalloc_array
;- добавил
MODULE_LICENSE/AUTHOR/DESCRIPTION
.
Собралось с десятком предупреждений.
- заменил
- Акт 2: «убери варнинги». Убрал устаревшие
ioctl
, обернулprintk
вpr_*
, добавилfallthrough;
. - Акт 3: «проверь на x86_64». Исправил
long
↔int
в структурах, выровнялu8/u16
через__packed
. - Акт 4: «протестируй на железе». Создал QEMU-образ с контроллером FDC, подключил образ кассеты.
- первый
insmod
— kernel oops; Claude добавилBUG_ON(!request_region)
и проверку IRQ. - второй —
ftape
видит привод, но «unknown format»; Claude вставил распознаваниеQIC-80
поID_CRC
. - третий — успешный дамп 120 Мб за 40 мин.
- первый
- Акт 5: «очисти и оформи». Удалил весь
#ifdef LINUX_2_0
, добавилREADME.md
,Kconfig
,Makefile
дляin-tree
сборки.
Результат
- 2 500 строк C → 1 100; 45 файлов → 12; минус 4 архаичных под-драйвера.
- Собирается как
out-of-tree
(6.6–6.12) и какin-tree
(патч 30 Кб). - Скорость 470 Кбит/с — предел FDC, но стабильно.
- Поддержаны только QIC-80; QIC-40/3010/3020 выкинуты (никто не просил).
Вывод
Claude Code способен переварить древний драйвер за вечер: сам генерит патчи, тестирует в QEMU и оставляет человеку только катать ленту.
Комментарии (247)
- Claude Code и аналоги — это «force-multiplier» для уже имеющихся навыков: быстрее пишут бойлерплейт, помогают в знакомых фреймворках.
- Особенно ценны для быстрого входа в новые стек-языки: «арендуешь чужой опыт», не учишь синтаксис с нуля.
- Позволяют лезть в нишевые/устаревшие кодбазы (kernel-drivers, 15-летний PHP, Amiga-файлсистемы) и доводить их до рабочего состояния.
- Результат всё равно требует экспертизы: без понимания архитектуры придётся долго чинить сгенерированные баги.
- Главный риск — однократный провайдер (Anthropic) и отсутствие тестов; в mainline такие «Claude-порты» пока не проходят.
Formatting code should be unnecessary 🔥 Горячее 💬 Длинная дискуссия
Форматирование кода должно быть лишним
В 80-х это уже знали.
Мой школьный учитель информатики, мистер Пейдж, участвовал в разработке компилятора Ada. Когда я в 2016-м жаловался на линтеры, он напомнил: проблему решили 40 лет назад. В Ada исходники не хранили — использовали IR-дерево DIANA. Каждый смотрел его в своём стиле: отступы, пробелы — всё равно.
Сейчас, в 2025-м, мы всё ещё спорим о запятых.
Как это работало
Рабочая станция Rational R1000 (1985) хранила не текст, а DIANA. IDE позволял редактировать дерево напрямую — проекционное редактирование. Компиляция была инкрементной, рефакторинг мгновенным, а «исходник» — просто красивой печатью дерева.
Плюсы: никаких holy-war’ов о табах, быстрая интеграция, встроенный VCS и отладка.
Минус: требовалась железная станция и знание Ada.
Вывод
Не нужно возвращаться к проекционным редакторам, но можно ли встроить идею «храним структуру, а не текст» в современные языки и IDE? Тогда форматирование станет личным вкусом, а не командным законом.
Комментарии (371)
- Форматирование кода — вечный «велосипедный сарай»: каждый знает, где ставить пробел, но никто — как реактор устроен.
- Одни считают линтеры спасением от холивара, другие — потерей человеческого «вкуса» и смысловых акцентов.
- Универсальный IR/AST вместо текста мечтает убрать diff-шум и дать каждому свой «pretty-print», но ломает grep, sed, git и другие текстовые инструменты.
- Примеры в духе Unison, Darklang, MPS, DIANA и Go-подобных «gofmt» показывают: идея жива, но требует IDE-лок-ина и общего стандарта, которого пока нет.
- Пока код смешанного стека остаётся обычным текстом, компромисс — автоформатер в pre-commit: «сохраняй как хочешь, коммить как договорились».
The demo scene is dying, but that's alright
Демосцена умирает, но это нормально
ЮНЕСКО внесла демосцену в «живое культурное наследие» Швеции.
Смешно и страшно: внимание может испортить старое доброе.
Сцена не мертва, но не обновляется
С 1980-х её регулярно хоронили: Amiga, PC, Интернет…
Разница в фото: рейв-2025 — те же молодые, демопати-2025 — те же 50-летние.
Подростков нет; большинство родились в эпоху C64 и DOS.
Высокий вход, низкий выигрыш
Субкультура сложилась из дешёвых 8-бит, модемов и отсутствия законов.
Без моды, музыки и внешнего блеска её невозможно продать.
Кряки, пиратство, фрики — всё держалось в тени и презирало коммерцию.
Статус «задрота» и такой трудоёмкий хобби отпугивали тренд-хантеров и девчонок.
Сцена так и не стала «крутой» — и это её спасло.
Новые не идут
Старики обсуждают, как привлечь молодёжь; регистрация в ЮНЕСКО — попытка.
Попасть сегодня легко: приехал на патив, показал демку — ты свой.
Пик численности — начало 90-х (тысячи гостей).
С тех пор — спад, и старания «открыть двери» не помогают.
Комментарии (101)
- «Сцена мертва» — мем: демосцена жива, но средний возраст растёт, новички есть, но не в тех числах.
- Старое коммьюнити плохо втягивает молодёжь: документация стара, входной барьер высок, ностальгия доминирует.
- Современные ПК настолько мощны, что «64 КБ» или «сжать в 4 КБ» воспринимается уже как искусственный костыль, а не вызов.
- Поэтому интерес мигрировал в size-coding, fantasy-консоли (Pico-8), live-coding, гейм-джемы, TouchDesigner, движки вроде Notch/Tixl.
- Онлайн-площадок много (Pouët, Scene.org, Neocities, Dwitter), но живого общения мало — Discord и редкие встречи «в парке» заменяют демопати.
- Старые продолжают кодить и вспоминать The Party ’92, новые приходят единицами: сцена не умерла, но стала узким нишевым хобби.
Intel Arc Pro B50 GPU Launched at $349 for Compact Workstations 💬 Длинная дискуссия
- Intel Arc Pro B50 — полупрофессиональная видеокарта на базе Battlemage BMG-G21 (16 Xe2-ядер, 16 ГБ GDDR6, 128-бит, 224 ГБ/с, 70 Вт, питание только от слота PCIe 5.0 x8).
- Форм-фактор low-profile, dual-slot, 4×mini-DP — ставится в компактные SFF-станции без дополнительных проводов.
- Целевые задачи: CAD, визуализация, локальный ИИ-инференс до 170 TOPS (INT8); драйверы сертифицированы под профессиональные приложения.
- Цена 349 $, продаётся как в рознице, так и в OEM-системах.
Комментарии (199)
- Intel Arc Pro B50: 16 ГБ, 70 Вт, single-slot, 1,5× быстрее RTX A1000, но всё ещё далеко от Nvidia/AMD.
- Главная фишка — SR-IOV и vGPU для VM, чего нет у игровых RTX/Radeon.
- 24-ГБ B60 и двух-GPU B60 анонсированы, но цены и даты не ясны; 48-ГБ версия Maxsun — $3000.
- ПО (IPEX, Vulkan, драйверы) сыровато, CUDA-стеков нет, игровая совместимость средняя.
- Рынок узок: малый формат, low-power серверы, NVR, тестовые стенды; геймерам и AI-тренировкам мало.
- Intel официально слилась с тренировочным сегментом, ставит на инференс и foundry; веры в долгую GPU-поддержку мало.
Taking Buildkite from a side project to a global company
-
Кит Питт — австралийский разработчик, отец троих детей, бывший фокусник. Считает себя не предпринимателем, а изобретателем: «ценность идеи = кто-то заплатил за неё».
-
Buildkite родился как побочный проект: Кит писал e-mail-API и понадобился собственный CI. Вечерами довёл прототип до продукта, подключил PIN Payments (первый в AU простой REST-эквайринг) и выложил на $5/30/100.
-
Первый «чужой» клиент из Европы (Moneybird) показал: продукт внешне нужен. Когда знакомая компания сама докинулась до $500/мес, Кит поверил, что выживет.
-
Первые годы — вечера и выходные, пока жена училась; днём — работа в Envato. Рост шёл медленно, но MRR удваивался каждые 6 мес.
-
2016 — деньги кончились, зарплаты не хватало. Кит вернулся к инвесторам, поднял раунд и стал CEO полный ставка. Пришлось учиться управлять, нанимать и строить распределенную команду.
-
Голос продукта выработали через публичный блог: честные посты о проблемах и фичах привели трафик и доверие разработчиков.
-
Сегодня Buildkite — глобальный CI/CD с клиентами вроде Shopify и Slack; офисы в Мельбурне и SF. Кит ушёл с поста CEO, но остался техническим лидером и продолжает «изобретать».
Комментарии (9)
- Buildkite хвалят за гибридную архитектуру (SaaS + свои агенты), декларативные пайплайны и приятный UI.
- Малые компании уходят: цены взлетели, фокус сместился на крупные enterprise.
- Меньшие стартапы успешно использовали Buildkite + дешёвые серверы (Hetzner) и Knapsack Pro для параллельных тестов.
- Основатель признался, что привлёк $28 млн раунда, «чтобы купить дом» — вызвал улыбку.
- Некоторые разработчики считают ИИ-ассистентов вредными для глубокого понимания задачи: «поверхностный флирт» вместо погружения.
Creative Technology: The Sound Blaster
-
Сим Вон Ху, 10-й из 12 детей, рос в бедной деревне Сингапура, продавал яйца до школы и купил себе губную гармошку.
-
Учился в техникуме на инженера, играл в театре, мечтал, чтобы компьютер играл музыку.
-
После армии работал на нефтяной платформе, потом открыл компьютерные курсы — партнёр украл деньги.
-
В 1981 году на сбережениях 6000 $ с другом основал Creative Technology: ремонт ПК и продажа запчастей.
-
Первый продукт — плата памяти для Apple II; в 1984 году выпустили совместимый компьютер CUBIC 99 с синтезатором речи и звонилкой — первый ПК, собранный в Сингапуре.
-
В 1986-м попытались продать клон PC CUBIC CT с графикой и звуком — рынок не готов, провал.
Комментарии (81)
- В 90-х Sound Blaster был королём PC-звука; все помнят IRQ/DMA-магию, Dr. Sbaitso и первые 4-канальные сетапы.
- Пользователи обвиняют Creative в патентных войнах (уничтожение Aureal), высоких ценах и «юзер-хостайле»; после 2000-х многие поклялись не покупать.
- Конкуренция и появление AC’97/HD-Audio на материнках, а также DirectX убрали нужду в дорогих картах.
- Восторженные воспоминания о 3D-аудио Aureal (Vortex 2) и реалтайм-трейсинге звука в Half-Life.
- Сегодня достаточно $25 USB-дапплера; Creative почти не нужен, но компания пытается реанимировать бренд через Kickstarter.
Taco Bell AI Drive-Thru
Taco Bell vs ИИ: 0:1
ИИ-голосовые кассы в 500+ драйв-турах не справились с акцентами, «двойным соусом без кинзы» и троллингом. Клиенты жаловались на глюки и устроили флешмоб абсурдных заказов. WSJ зафиксировал: технологию «пересматривают», но в дорожной карте она всё ещё значится.
Комментарии (146)
- Пользователи спорят, стоит ли внедрять ИИ в драйв- thru: кто-то хвалит точность и вежливость, кто-то ругает баги в духе «18 000 стаканов воды».
- Основные претензии: очереди мешают трафику, машины пустятся на холостом, а заказы через ИИ легко троллить.
- Многие предпочитают мобильный предзаказ: быстрее, параллельно и без разговоров, но часть клиентов не хочет ставить десятки «шпионских» приложений.
- Критики считают запуск в 500 точках необдуманным: не хватает A/B-тестов, sanity-checks и учёта импульсивных покупателей, которым важен именно «захотел-сразу-в-очереди».
- Вывод: ИИ-приёмка пока сыровата, но масштабные провалы дают ценные уроки и ускоряют доработку технологии.
Pico CSS – Minimal CSS Framework for Semantic HTML 🔥 Горячее
Pico CSS — микро-фреймворк, который делает красивый интерфейс из обычного HTML без классов.
Подключил — и готово: адаптив, тёмная/светлая тема, 0 JS, 15 КБ.
<form><input type=email placeholder=Email></form>
- 130 CSS-переменных для настройки
- 20 цветовых тем, 30 компонентов
- Вес ≈ 10 КБ, без зависимостей
Комментарии (86)
- Pico CSS — фаворит для быстрых сайтов и прототипов: «включаешь — и красиво», без классов.
- Пользователи хвалят тёмную тему, accessibility и переменные, но жалуются на 50+ КБ, «огромные» контролы и отсутствие компонентов (табы).
- Кто-то берёт Pico как анти-Tailwind: семантичный HTML, нет «супа классов», легко править.
- Для LLM-флоу советуют засунуть доку Pico целиком в контекст, чтобы модель не тянула Tailwind.
- Альтернативы: Neat (ещё меньше), Newcss, Beercss; обзоры на cssbed.com и dropin-minimal-css.
Everything from 1991 Radio Shack ad I now do with my phone (2014)
- В рекламе Radio Shack 1991 г. 15 гаджетов; 13 из них теперь в телефоне.
- Плеер, часы, калькулятор, камкордер, телефон, CD-плеер, сканер, диктофон и др. — всё заменил iPhone.
- Суммарная цена тогда: $3054 (~$5100 сегодня).
- Не заменил: радар-детектор и колонка с 15-дюймовым сабвуфером.
Комментарии (148)
- Участники спорят, что смартфон не полностью заменил CB-рации, радар-детекторы и сканеры: «функции есть, но дух и удобство — нет».
- CB-живее всех живых: продаётся в крупных магазинах, разрешена за рулём, по-прежнему спасает вдали от сетей.
- Радар-детектор формально не нужен — Waze и онлайн-радары делают ту же работу, но железный «бип» никто не отменял.
- Сканеры тоже не умерли: любители слушают авиацию, спасателей, гонки; просто теперь это цифровые P25-коробки вместо 10-канального «Realistic».
- Телефон убил рынок «подарочных гаджетов» — вместо $20-игрушек теперь дарят $5-приложения или $500-аксессуары.
- Итог: всё слито в одну коробку, но энтузиасты всё равно покупают отдельные устройства — ради звука, ради хобби, ради свободы.
No Silver Bullet: Essence and Accidents of Software Engineering (1986) [pdf]
Содержимое PDF-файла представляет собой бинарные данные, которые нельзя напрямую интерпретировать как текст. В представленном фрагменте — это служебные структуры PDF (объекты, потоки, метаданные), а не читаемый текст документа.
Перевод и сокращение невозможны, поскольку отсутствует осмысленный текстовый контент.
Комментарии (24)
- Брукс по-прежнему прав: основная трудность — «существенная сложность» предмета, а не инструменты.
- За 40 лет не появилось ни одного «серебряного пули», дающего 10× прирост продуктивности.
- Экосистемы (Python, AWS и др.) снизили accidental complexity, но добавили новую через зависимости и «слоёный пирог».
- LLM и ИИ ускоряют рутину, но не решают существенную сложность и не умеют формулировать требования.
- Культура SWE изменилась: скорость вытеснила ответственность, код пишут «на скорую руку» и быстро забывают.
How to make metals from Martian dirt
- Учёные Суинберна и CSIRO впервые получили железо из марсианского реголита при давлении и составе атмосферы Красной планеты.
- Процесс: 1000 °С → металлическое Fe, 1400 °С → жидкий сплав Fe-Si; шлак отделяется как на Земле.
- Использовали имитатор грунта кратера Гейла; в качестве восстановителя — CO₂ из атмосферы.
- Цель: добывать металл на месте (ISRU), чтобы не возить тонны с Земли (1 т груза ≈ 243 млн USD).
- Следующий шаг — «нулевые отходы»: шлак пойдёт на стройматериалы, сплавы — на корпуса домов и технику.
Комментарии (85)
- Учёные добились выплавки железа из марсианского реголита без углерода; остаётся вопрос, где взять 1400 °C на Марсе.
- Основные кандидаты — солнечные панели + батареи или компактный ядерный реактор (MSR), но масштаб и логистика пока неясны.
- Amazon уже продаёт «марсианский» реголит-имитатор, так что эксперименты можно начинать в гараже.
- Добыча на астероидах теоретически богаче (платина), но Δv и возврат убивают экономику; марсианское железо — проще и дешевле.
- ISRU (местное сырьё) — ключ к выживанию на Луне/Марсе; станции в вакууме такой роскоши не имеют.
- Споры о радиации и безопасности ЯТТ топлива сведены к «опаснее не реактор, а сама космическая радиация».
Keeping secrets out of logs (2024)
Коротко:
Секреты в логах — это не «одним фиксом» решить нельзя. Ни 80/20, ни чудо-инструмента нет. Есть 10 «свинцовых пуль» — несовершенных, но при правильной раскладке работают.
Почему течёт
Причина | Пример |
---|---|
Прямой логинг | log.info(user) вместо log.info(user.id) |
«Мусорные» дампы | logger.debug(req.headers) |
Конфиги | debug=true выводит весь env |
Зашитые секреты | JSON-поле password внутри структуры |
Телеметрия | APM-сборщик хватает всё подряд |
Пользователь | Вводит пароль в поле «имя» |
10 «пуль»
-
Архитектура данных
Разделяем «чувствительное» и «остальное» на уровне схемы; в логи идёт только последнее. -
Трансформации
Сериализуем черезsanitize()
илиtoLog()
— явно выбрасываем секретные поля. -
Domain-primitives
- Компиляция:
SecretString
не реализуетDisplay
. - Рантайм:
Redactable
интерфейс,toString() → "***"
.
- Компиляция:
-
Read-once
Пароль читается 1 раз, дальше объект пустой — логировать нечего. -
Taint-tracking
Помечаем вход как «грязный»; если доходит до логгера — exception. Дорого, но точно. -
Форматтеры логов
Пишем свойLayout
/Encoder
, который режет заранее заданные ключи рекурсивно. -
Unit-тесты
ПроверяемassertThat(log).doesNotContain(secret)
; запускаем на каждый PR. -
Сканеры
Regex-правила + entropy-фильтры в CI и в production-потоке. Сэмплируем, чтобы не умереть от CPU. -
Pre-processors
Vector / Logstash / Cribl вырезают поля ещё до попадания в Elasticsearch. -
Люди
Code-review чек-лист: «есть ли тут .toString / JSON.stringify / printf без фильтров?».
Стратегия
- Фундамент: классификация данных, единый словарь «что считать секретом».
- Карта потока: от источника до хранилища логов.
- Контрольные точки: валидация, sanitize, redact.
- Защита в глубину: 2-3 слоя из списка выше.
- План на инцидент: ротация, оповещение, forensics.
Итог:
Нет волшебства — только дисциплина и много мелких фиксов. Начните с 2-3 «пуль», которые дешёвле всего у вас, и двигайтесь дальше.
Комментарии (42)
- Отличный пост: чёткий разбор проблемы «секреты в логах» и конкретные техники борьбы.
- Основные идеи: taint-tracking, in-band метки, GuardedString/SecureString, доменные примитивы
new Secret(...)
. - Сложности: стектрейсы, JSON, core-dumps, динамически создаваемые секреты, человеческий фактор.
- Защита в глубину: маскировать, ограничивать доступ к логам, не писать всё подряд, валидировать маски (Kingfisher).
The MacBook has a sensor that knows the exact angle of the screen hinge 🔥 Горячее 💬 Длинная дискуссия
JavaScript отключён.
Включите его или смените браузер.
Проблема может быть в расширениях — отключите их и обновите страницу.
Комментарии (431)
- В MacBook есть датчик угла крышки; он привязан к материнской плате и требует калибровки при замене.
- Apple использует его для Desk View (коррекция перспективы камеры) и, возможно, для настройки аудио и диагностики.
- На других ноутбуках такой датчик тоже есть, в Linux он доступен как HID-устройство.
- Хакеры превратили его в «терменвокс», контроллер громкости и даже ввод для расшифровки файлов.
- Пользователи опасаются, что данные могут использоваться для телеметрии или гарантийных отказов.
Комментарии (86)
- Участники спорят: блокировки Facebook/TikTok в Непале — это борьба с вредом соцсетей или удар по свободе слова.
- Западные комментаторы упрекают азиатские власти в авторитаризме; местные отвечают: «не нам учиться демократии у стран, где Fox News = свобода».
- Непал требует у платформ регистрации и локального представителя; игнорировавшие правила заблокированы, а не «все подряд».
- Мнения разделились: кто-то радуется «цифровому детоксу», кто-то боится прецедента цензуры и слежки.
- Общий вывод: соцсети одновременно и «площадка свободы», и «инструмент пропаганды»; решение о блокировке зависит от контекста, но всегда рискует стать политическим оружием.
SQLite's Use of Tcl (2017)
SQLite начинался как TCL-расширение и до сих пор носит его отпечаток: гибкая типизация, синтаксис $var
в SQL и единственный адаптер внутри ядра — tclsqlite.c
. Сегодня ядро на чистом C и работает без TCL, но вся разработка и тестирование держится на нём: 90 % кода тестов на TCL, генерация сборок, документация и релизы полностью автоматизированы скриптами makefile.tcl
.
Комментарии (29)
- Команда SQLite общается в приватном чате на собственном Tcl/Tk-скрипте (~1000 строк), который работает и как клиент, и как сервер.
- С 2021 г. основное общение перешло в встроенный Fossil-чат: он E2E-шифрован и доступен из любого браузера.
- SQLite сохраняет Tcl-наследие: sqlite3_analyzer — это тоже Tcl-программа, упакованная в С-обёртку.
- Подстановка
$uid
в SQL безопасна: токен распознаётся парсером SQLite, а не «eval»-ится Tcl. - Участники защищают выбор Tcl: он компактен, стабилен и удобно встраивается в С, что важнее модных языков.
Delayed Security Patches for AOSP (Android Open Source Project)
- JS отключён. Включите его или смените браузер.
- Расширения, блокирующие трекинг, могут мешать — отключите их и обновите страницу.
Комментарии (83)
- Заголовок на HN неверен: задержка касается всех Android, не только AOSP; security-патчи для 13–15 вышли 2 сентября.
- Google всё чаще прячет код в GMS и свои приложения, превращая AOSP в «заготовку» и снижая пользу для GrapheneOS и прочих форков.
- Пользователи обсуждают разделение Android и Google: считают, что без регулирования Google окончательно убьёт открытую часть экосистемы.
- Альтернативы вроде PostmarketOS и «линуксофонов» пока сыроваты: не хватает VoLTE, камеры, GPU и людей для поддержки.
Belling the Cat
Басня «Повесить колокол кошке»
Крысы хотели повесить колокол кошке, чтобы слышать её приближение. План хорош, но никто не рискнул выполнить. Идиома: «лёгко советовать, трудно исполнять».
Комментарии (61)
- Участники обсуждают басню «Колокольчик на кошку» как метафору коллективной бездействия: все хотят результата, но никто не берётся за опасное исполнение.
- Некоторые узнали фразу впервые и теперь используют её вместо саркастического «а кто это будет делать?» в командной работе.
- Всплыли разные интерпретации: от детской «строим сложный механизм» до циничной «пусть кто-то другой рискнёт».
- Название Bellingcat теперь воспринимается как сознательная игра на идее «повесить колокол», но в контексте журналистских расследований.
- Обсуждение ушло в политику: Украина «вешает колокол» на Россию, пока Европа ждёт, что сделает кто-то другой.
Air pollution directly linked to increased dementia risk
- Анализ 56 млн человек показал: длительное дыхание мелких частиц PM2,5 ускоряет развитие деменции с тельцами Леви и болезни Паркинсона с деменцией у генетически предрасположенных людей.
- Риск госпитализации из-за тяжёлой формы деменции с тельцами Леви выше на 12 % в районах с повышенным уровнем загрязнения.
Комментарии (96)
- Исследование показывает корреляцию между загрязнением воздуха (PM2.5) и деменцией, но не доказывает причинно-следственную связь.
- Участники обсуждают, почему в некоторых регионах с высоким уровнем загрязнения (например, Юта) уровень деменции ниже, чем в других (например, Майами-Дейд), указывая на возраст, миграцию и другие факторы.
- Поднимаются вопросы о влиянии внутреннего загрязнения (например, от готовки), пестицидов, а также о том, учитываются ли они в исследованиях.
- Некоторые считают, что статьи и пресс-релизы преувеличивают выводы, делая из корреляции выводы о причинности.
- Обсуждается, почему в странах с сильным загрязнением (Китай, Индия) не фиксируется всплеск деменции — возможно, из-за недостатка диагностики и молодого населения.
Postal traffic to US down by over 80% amid tariffs, UN says
- Почтовый трафик в США упал >80 % после отмены беспошлинного порога $800 с 29 авг.
- 88 операторов приостановили доставку: не успели настроить сбор пошлин и связь с таможней.
Комментарии (55)
- Почтовые операторы 88 стран приостановили доставку в США: не успели за 6 месяцев внедрить сбор пошлин после отмены de minimis.
- Участники считают, что удар по «почтовому демпингу» из Китая был целенаправленным, но системы растаможки не готовы.
- USPS рискует потерять объёмы, частные курьеры (UPS, FedEx) выиграют, разберясь с бумагами.
- Пользователи ждут рецессии/депрессии, обсуждают, куда спрятать деньги и как жить без «фабричных» дешёвых товаров.
More and more people are tuning the news out: 'Now I don't have that anxiety
Почему люди отключают новости: «Теперь у меня нет тревоги»
Рост информационной перегрузки и негативных новостей приводит к рекордному отказу от потребления медиа.
Пользователи жалуются на «думскроллинг» — бесконечную ленту тревожных событий, вызывающих тревогу, бессонницу и выгорание.
Решение:
- детокс от новостей (от 1 дня до года);
- лимит времени в приложениях;
- выборочное чтение — только добровольные дайджесты или позитивные каналы.
Результат:
«Я стал спать лучше и забыл, что такое постоянное напряжение».
Комментарии (71)
- Участники обсуждают, как избавиться от тревожного «думскроллинга»: кто-то полностью отказался от новостей, кто-то перешёл на текстовые дайджесты (NPR Text, Fix the News, The Economist «World in Brief», Reuters, AP News).
- Популярный приём — фильтрация через RSS/LLM-сводки, блокировки сайтов (LeechBlock, Screen Time) и переход на местные источники вместо глобального хайпа.
- Многие отмечают улучшение психического здоровья, но чувствуют вину за «осознанное неведение» и страх перед авторитарными трендами.
- Часть пользователей считает отказ от новостей привилегией: «пока тебя не коснётся, можно не следить», другие напоминают, что без гражданского контроля власть разойдётся бесконтрольно.
- Общий вывод: новости превратились в развлекательный спам и инструмент манипуляции; задача — найти баланс между информированностью и личным спокойствием.
Algebraic Effects in Practice with Flix
Алгебраические эффекты на практике в Flix
Алгебраические эффекты — уже не академия. Это рабочий инструмент, который сегодня делает код:
- Тестируемым — «что» отделено от «как»; mock-и и DI не нужны.
- Прозрачным — сигнатура функции сразу показывает все побочные действия (IO, сеть, исключения).
- Гибким — async/await, корутины, backtracking реализуются обычными библиотеками, без изменения языка.
В отличие от монад, эффекты понятны без теории категорий и работают «из коробки» в языке Flix.
Мотивирующий пример
Без эффектов:
def calculateSalary(base, percent) -> float:
# может отправить письмо бабушке
С эффектами (Flix):
def calculateSalary(base: Float64, percent: Float64): Float64 \ {Email} =
...
Сигнатура не лжёт: любой вызов Email
будет отслежен компилятором.
Обработчики эффектов (интуиция)
Эффект = операция + обработчик.
Код бросает операцию, обработчик решает, что с ней делать.
eff Ask { // объявляем эффект
pub def ask(): String
}
def greet(): String \ Ask = // используем
"Hello " + Ask.ask()
def main(): Unit = // обрабатываем
println(greet() with Ask {
def ask() = "World"
})
Реальный проект: рекомендательная система фильмов
Задача: достать данные из SQLite, вызвать внешний AI-сервис, кешировать результат, логировать.
Эффекты: Db
, Http
, Log
, Cache
.
def recommend(user: String): List[Movie] \ {Db, Http, Log, Cache} =
Cache.getOrElse(user,
for {
prefs <- Db.query(user)
_ <- Log.info("Prefs loaded")
recs <- Http.post("ai.example.com", prefs)
_ <- Log.info("AI answered")
_ <- Cache.put(user, recs)
} yield recs)
Тест: подменяем обработчики на in-memory реализации — никаких реальных запросов.
Куда дальше
- Попробовать онлайн: https://play.flix.dev
- Документация: https://doc.flix.dev
- Репозиторий: https://github.com/flix/flix
Flix ещё молод, но уже поддерживает эффекты, регионы, структурную конкурентность и Datalog.
Комментарии (42)
- Участники восторгаются идеей алгебраических эффектов: они проще монад, решают «цветную» проблему функций и позволяют гибко компоновать побочные эффекты.
- Примеры уже есть: экспериментальная реализация в OCaml 5, библиотеки Effect и Effectively для TypeScript, языки Koka, Effekt, Unison.
- Отличие от ОО-интерфейсов: эффекты явно указывают контекстные требования (Net, IO) и позволяют подменять реализацию динамически, а не статически.
- Критика: система всё равно «окрашивает» код, требует прокидывать эффекты через весь стек вызовов и пока выглядит академично/громоздко.
- Практические вопросы: как скрыть «дебажный» вывод, не нарушая типов, и можно ли обойтись без переписывания сигнатур каждой промежуточной функции.
Show HN: Semantic grep for Claude Code (local embeddings)
GitHub-репозиторий BeaconBay/ck
Публичный проект без описания.
Кнопки: «Code», «Issues», «Pull requests», «Actions», «Projects», «Wiki», «Security», «Insights».
Последний коммит: 2 года назад.
Язык: C.
Лицензия: отсутствует.
Комментарии (60)
- Утилита ck — это «семантический grep» на Rust: строет локальный векторный индекс файлов и ищет по смыслу, а не только по ключевым словам.
- Работает через embeddings (BAAI/bge-small-en-v1.5, планируется Gemma), повторное индексирование запускается автоматически при изменении файлов.
- Поддерживает почти все языки, но для точного семантического чанкинга требуется донастройка tree-sitter; grep-режим остаётся дефолтом.
- Пользователи жалуются на медленный поиск в больших проектах, отсутствие TypeScript-LSP и «разрезание» эмодзи; README считают «AI-флаффным».
- Альтернативы: Codanna, Serena, Roo с Qdrant, SemTools; автор приглашает тестеров и PR для доведения до зрелости.
Serverless Horrors 🔥 Горячее 💬 Длинная дискуссия
Сборник коротких серверлес-кошмаров
- $1189 – Webflow снял за месяц вместо $69.
- $100 000 – DoS на игровом сайте → счёт за Firebase за сутки.
- $738 – Vercel Pro + лимит $120 ≠ защита от «сюрприза».
- $70 000 – Проснулся с таким счётом за Firebase при тарифе $50.
- $22 640 – BigQuery на публичных данных.
- $250/мес – 9 тыс. просмотров в Framer.
- $1274 – AI Devin случайно устроил ддос в PostHog.
- $530 – Платный PostHog после нулевого периода.
- $384 – Документация на Mintlify.
- $103 – AWS Free Tier ловушка.
- $96 281 – Vercel: «я просто молчу».
- $120 000 – Cloudflare выключает сайт, требуя деньги за сутки.
- $1301 – Пустой приватный S3 + ддос.
- $11 000 – Mailgun во время атаки.
- $104 500 – Письмо от Netlify «переплата».
- $23 000 – Спам-атака на EchoFox в Vercel.
- $3000 – Тестовый деплой в Vercel.
- $620 – Sitemap.txt сожрал трафик.
- $72 000 – Тест Firebase + Cloud Run чуть не разорил.
Хочешь поделиться своим счётом-ужасом — пиши в твиттере или PR на GitHub.
Комментарии (406)
- Пользователи делятся историями о «серверлес-ужасах» — внезапных счетах за десятки и сотни тысяч долларов из-за DDoS, ошибок в конфигурации или забытого ресурса.
- Критика сосредоточена не на технологии serverless, а на модели оплаты «плати за использование» без жёстких потолков: бюджет — лишь уведомление, а не отключение.
- Многие считают, что провайдеры могли бы автоматически отключать сервис при превышении лимита, но не делают этого, теряя деньги на «ошибках» новичков.
- Участники советуют: ставить rate-limit, использовать VPS с фиксированной ценой, поднимать bare-metal или хотя бы включать billing-alerts и «пауz-лимиты» вроде Vercel.
- Поддержка AWS/GCP/Azure часто прощает счета после публичных твитов, но это выживший эффект: официальной политики нет, и никто не гарантирует прощение.
Show HN: I'm a dermatologist and I vibe coded a skin cancer learning app 🔥 Горячее 💬 Длинная дискуссия
molecheck.info – тест «Опасно ли пятно?»
- Оптимизировано для телефона: открой сайт через камеру по QR-коду.
- На экране – фото родинки.
- Свайп влево = «опасаюсь», вправо = «не беспокоит».
- Кнопки: «Тревожно», «Спокоен», «Не уверен».
- После выбора – «Следующее изображение».
Комментарии (234)
- Врач-дерматолог за выходные собрал на LLM-генераторах обучающий «квиз» по фото родинок: «опасно / не опасно».
- Пользователи быстро научаются отличать очевидные меланомы, но путают BCC с прыщами и keratosis с невусами; объяснений «почему» пока нет.
- Критика: в выборке ≈75 % онкопатологии (в жизни <5 %), что повышает чувствительность тренажёра, но может лишний раз нагнать тревогу.
- Проект вызывает дискуссию о «vibe-coding»: эксперт предметной области теперь может реализовать идею без команды разработчиков.
- Врачи предлагают добавить шкалы размеров, ABCDE-справку, лог ошибок и чёткое предупреждение: «это не диагностика, а учебная игра».
Комментарии (86)
- RFC 1918 просто формализовала уже распространённую практику: взяли по одному «классу» A, B, C (10/8, 172.16/12, 192.168/16), чтобы у частных сетей был выбор размеров.
- 192.168/16 попал в набор, потому что это первый свободный блок из диапазона класса C (192–223), «коровья тропинка» — люди и доки уже использовали 192.9.200.x и 192.168.x.x как примеры.
- Sun и другие вендоры в своих мануалах приводили 192.9.200.0/24; многие буквально скопировали «пример» во внутренние сети.
- До RFC 1597/1918 компании без своих публичных блоков просто «захватывали» чужие адреса; стандарт дал легальный, не конфликтующий диапазон.
- Почему 192.168, а не 192.0 или 192.1? Просто к моменту написания RFC этот подблок ещё не был выделен крупным организациям и выглядел «симпатично» (11000000 10101000).
I am giving up on Intel and have bought an AMD Ryzen 9950X3D 🔥 Горячее 💬 Длинная дискуссия
- Второй за год умер Intel Core Ultra 9 285K: после 4-часовой нагрузки (100 °C, 300 Вт) ПК не проснулся из suspend, кнопка питания мертва.
- Первый экземпляр сдох в марте; в отзывах магазина полно аналогичных случаев — больше не верю Intel.
- Комната была под кондиционером (25–28 °C), температура ядра 100 °C в пределе 110 °C, так что дело не в жаре.
- Взял Ryzen 9 9950X3D: быстрее 285K в многопотоке, ~100 Вт меньше под полной нагрузкой, температура 75 °C.
- Плата ASUS X670E-E, 96 ГБ DDR5-6000, остальное железо без изменений.
- Вывод: Intel пока ненадёжен, AMD даёт ту же скорость с меньшим нагревом и расходом.
Комментарии (318)
- Пользователи жалуются на нестабильность современных Intel и AMD: «виснут» в idle, падают под нагрузкой, греются до 100 °C и выгорают.
- Виной всему: заводской разгон «на грани», плохое охлаждение, BIOS-«усилялки» и, возможно, софт-ошибки, проявляющиеся только на новых CPU.
- ECC-память помогает отлавливать тихие ошибки ОЗУ, но на десктопе почти не рекламируется, матплаты поддерживают её «тихо», а модули стоят в 2 раза дороже.
- AMD даёт больше ядер и AVX-512, Intel — стабильнее iGPU и меньше жрёт в простое; выбор чаще делается по цене, политике или просто «что есть в продаже».
- Общий вывод: современные настольные CPU превратились в «лотерею» — нужен тщательный подбор питания, охлаждения и BIOS, иначе рискуете получить дорогой нагреватель.
The Expression Problem and its solutions (2016)
Проблема выражений и её решения
Проблема выражений: нужно добавлять новые типы данных и новые операции без изменения старого кода.
В ООП-языках легко добавлять типы (наследование), но сложно — операции (менять интерфейс).
В функциональных языках наоборот: легко добавлять функции, сложно — варианты данных.
Пример на C++
Базовый класс Expr
с двумя методами: Eval()
и ToString()
.
Новый тип — просто новый класс-наследник.
Новая операция — правим базовый класс и все наследников, нарушая OCP.
Функциональный подход (Haskell)
Типы данных и функции разведены:
data Expr = Constant Double | BinaryPlus Expr Expr
eval (Constant x) = x
eval (BinaryPlus a b) = eval a + eval b
Добавить операцию легко: пишем новую функцию.
Добавить вариант Expr
— правим сам тип и все функции, pattern-match’и которых его затрагивают.
Как быть
- Визитор (ООП) — двойная диспетчеризация, но код всё равно растёт.
- Мультиметоды (CLOS, Clojure) — выбор по типу всех аргументов, код не трогается.
- Type-class / протоколы (Haskell, Clojure) — «открытые» функции, реализуемые вне исходного модуля.
- Tagless-final / finally-tagless — выразить язык как набор операций, интерпретаторы добавляются без изменения AST.
Итог: ни один стиль не побеждает; выбираем язык и технику, которая даёт нужную сторону расширяемости.
Комментарии (69)
- Суть проблемы: нужно добавлять новые типы данных и новые операции без переписывания старого кода и без потери статической безопасности.
- Классический подход: O·T матрица — каждая операция реализуется для каждого типа; при росте O или T взрывается boilerplate.
- Языковые решения:
– трейты/impl в Rust, typeclass в Haskell, протоколы в Swift позволяют добавлять операции «сбоку»;
– enum (суммарные типы) упрощают добавление операций, но затрудняют новые варианты данных. - Продвинутые техники: tagless-final, object algebras, data types à la carte, multiple dispatch, visitor-pattern.
- Ограничения: «сиротское правило», отсутствие виртуальных extension-методов, необходимость заранее знать все комбинации при раздельной компиляции.
- Вывод: идеального языка нет; выбор зависит от того, что важнее — расширять типы или операции — и насколько нужна статическая типизация.
The “impossibly small” Microdot web framework
Microdot: крошечный веб-фреймворк для всего
Мигель Гринберг, автор Flask Mega-Tutorial, представил Microdot — мини-фреймворк, работающий и на CPython, и на MicroPython: от IoT до облаков.
Зачем?
Зимой 2018-го в Ирландии Мигель столкнулся с «умным» отоплением, которое погрешало на ±3 °C. Он отключил термостаты, поставил на каждый этаж плату с MicroPython и датчиком (±0,5 °C) и сам включал/выключал нагрев.
Чтобы с дивана видеть температуру и статус, ему нужен был веб-сервер, но Flask и Bottle на MicroPython не лезли. Поэтому он написал Microdot — «Flask в миниатюре».
Фишки
- одна папка, ~1500 строк, нулевые зависимости
- маршруты, шаблоны, cookies, WebSocket, SSE, CORS, SSL, Basic/Digest-аутентификация, тест-клиент
- копирует API Flask:
@app.route
,request.args
,jsonify
,abort
,before_request
- работает на ESP32, Raspberry Pi Pico, обычных серверах
- ставится
pip install microdot
(CPython) илиmip install microdot
(MicroPython) - опциональные плагины: microdot-session, microdot-cors, microdot-websocket, microdot-jinja, microdot-asyncio
Код
from microdot import Microdot
app = Microdot()
@app.route('/')
async def index(req):
return {'temp': 22.5, 'heating': False}
app.run(port=80, debug=True)
Размер
ESP32: 70 КБ свободной ОЗУ остаётся после загрузки MicroPython + Microdot + приложение.
CPython: ~1 МБ venv.
Кому
- хобби-IoT: датчики, реле, роботы
- встраиваемые системы: промышленные контроллеры, автономные датчики
- прототипы: быстро поднять REST, потом перейти на Flask/FastAPI
- обучение: Flask-разработчики учатся за пять минут
Где
GitHub: github.com/miguelgrinberg/microdot
Документация: microdot.readthedocs.io
PyPI: pip install microdot
Комментарии (50)
- Microdot — это 765-строковый Python-фреймворк, который работает и на CPython, и на MicroPython; предназначен для веб-серверов на IoT-устройствах (ESP32 и др.).
- Автор @miguelgrinberg подтвердил, что расширения (шаблоны, сессии) опциональны и почти не требуют зависимостей; версия 2 внесла ломающие изменения.
- Комментаторы спорят о слове «impossibly small»: кто-то считает 765 строк нормальным минимумом, кто-то — перебором; сравнивают с Bottle, Rails 0.x и FW/1.
- Пользователи делятся опытом: SSE + htmx для живых GPIO-индикаторов, бенчмарки RPS, проекты термостатов и садовых сенсоров.
- Упоминаются альтернативы (TurboLua, BirSaat) и вопрос: «почему бы не написать это на C?»
Unofficial Windows 11 requirements bypass tool allows disabling all AI features
Неофициальный инструмент обхода требований Windows 11 теперь умеет отключать все AI-функции
Утилита Rufus, известная возможностью устанавливать Windows 11 на «несовместимое» железо, получила обновление. Теперь она может полностью вырезать из системы компоненты ИИ: Recall, Copilot, Click-to-Do и другие. Достаточно поставить галочку «Disable AI features» при создании загрузочной флешки — и после установки они будут заблокированы на уровне реестра и служб.
Комментарии (104)
- Пользователи жалуются на встроенную рекламу, телеметрию и невозможность полностью отключить «блоат» в Windows; даже сторонние «деблоатеры» регулярно ломаются после обновлений.
- Многие предлагают «чистую» редакцию Windows (LTSC/IoT), но она дороже, лицензируется пачками и всё равно не лишена шпионских модулей.
- Часть разработчиков и геймеров переходит на Linux (Fedora KDE, Mint, Ubuntu) + Proton/Wine; железные проблемы остаются, но «парадоксально, работает лучше, чем Windows».
- Сообщество сомневается, что Microsoft выпустит публичную «Optimal»-версию без телеметрии: слишком выгодны данные пользователей и рекламные вставки.
- Пока нет закона, обязывающего поддерживать старые CPU; официальные требования Win-11 можно обойти Rufus, но это временное решение, и пользователи всё чаще рассматривают полный уход в Linux/BSD.
RFC 3339 vs. ISO 8601
-
RFC 3339 – подмножество ISO 8601, строгий формат для интернет-протоколов:
YYYY-MM-DDTHH:MM:SS±HH:MM
(всегда 24-часовой, всегда TZ).
Пример:2023-06-15T14:30:45+03:00
. -
ISO 8601 – гибкий стандарт обмена датами/временем:
допускает2023-06-15
,20230615
,2023-155
(дня года),2023-W24-4
,14:30
,14:30:45.123
,+03
,Z
, интервалы, повторы и др. -
Совместимость: любая RFC 3339-строка валидна по ISO 8601, но не наоборот.
Комментарии (118)
- Все начинают с мыслью «даты просты», но быстро проваливаются в кроличью нору ISO 8601 и RFC 3339.
- Фаворит сообщества:
YYYY-MM-DD hh:mm:ss
— читается и людьми, и кодом, но без зоны и с пробелом/двоеточием ломает shell, Windows-имена и сортировку. - Ещё минус RFC 3339: нет стандартных меток для длительности и диапазонов.
- Почему в ISO не завели
strftime
-сокращения%F
и%T
— остаётся загадкой. - Итог: универсального «markdown для времени» нет; выбирайте формат под задачу и не забывайте часовой пояс.
Show HN: Lightweight tool for managing Linux virtual machines
Flint — лёгкий инструмент для управления виртуальными машинами Linux.
Клонируй, настрой и запускай ВМ из CLI без лишних зависимостей.
Комментарии (26)
- Пользователи не поняли, что делает утилита: «управляет» KVM-ВМ, но не ясно — создаёт, запускает, монтирует папки или работает по сети.
- Автор показал компактный бинарь на Go, но код (~26 k строк) написан «вайб-кодингом» без тестов, поэтому многим не доверяют.
- Обсуждали альтернативы: systemd-nspawn, libvirt/virsh, Virt-Manager, Cockpit; последний удобен, но по умолчанию слушает 0.0.0.0 и требует PAM-логин.
- Нашлись советы: Cockpit завернуть в SSH-туннель, libvirt подключаться по SSH, PAM заменить на безопасный модуль.
- Вопросы о Vite-hot-reload в гостевой ОС, снапшотах и расписании остались без ответа.
Navy SEALs reportedly killed North Korean fishermen to hide a failed mission
-
Суть: в утечке рассекреченного отчёта утверждается, что в 2006 г. группа SEALs тайно проникла в КНДР, потерпела неудачу и, чтобы скрыть следы, убила случайно встретившихся рыбаков, а тела изуродовали.
-
Детали: операция «Источник-Х» — поиск подводной лаборатории Пхеньянa по ядерным испытаниям. Подлодка с SEALs застряла в иле, рыбаки подошли вплотную; командир приказал «устранить свидетелей». Тела взорвали, чтобы не опознать.
-
Последствия: инцидент засекречен, участники подписали неразглашение; Пентагон комментировать отказался. Источники: бывший офицер разведки и документы Эдварда Сноудена.
Комментарии (106)
- В 2019 году SEALs тайно проникли в воды КНДР, чтобы установить жучок, но убили 2–3 гражданских дайверов за «подозрение в обнаружении».
- Операция провалилась: цель не достигнута, тела скрыли, проколов лёгкие, чтобы тонули.
- Участники и ветераны считают миссию слишком рискованной и бесполезной, а приказ спущен «сверху» без должной оценки.
- Инцидент подпитывает пропаганду КНДР и вызывает вопросы: кто и как в США решает убивать иностранных граждан без объявления войны.
Show HN: I recreated Windows XP as my portfolio 🔥 Горячее 💬 Длинная дискуссия
Привет!
Кликни по аватарке, чтобы войти в «Windows XP» с моим портфолио. Всё внутри работает как настоящий рабочий стол: иконки, панель задач, кнопка «Пуск».
После загрузки откроются:
- Обо мне
- Резюме
- Проекты
- Контакты
Связаться: LinkedIn | GitHub | Instagram
Для эффекта CRT и полноэкранного режима жми иконки в трее.
Комментарии (290)
- Пользователи в восторге от детализации и ностальгии, но спорят: копирование XP ≠ дизайнерский талант.
- Основные претензии: AI-аватар, неточности пикселей, скролл-бары, отсутствие теней и Easter-egg’ов в консоли.
- Советуют убрать «студий-гибли» аватар, добавить мини-приложения (Minesweeper, проводник) и open-source’нуть проект.
- Мобильная версия похвалена, но просят доработать CMD и убрать «размывающие» скан-линии.
- Вывод: крутая визуальная витрина, но чтобы впечатлить индустрию, нужно больше собственных идей и меньше «копипаста» 2001 года.
The key to getting MVC correct is understanding what models are 💬 Длинная дискуссия
Как MVC стало таким бардаком
Классическое Smalltalk-MVC:
- Model — данные, ничего не знает об UI.
- View — рисует Model, подписывается на её изменения.
- Controller — переводит клики/клавиши в команды Model.
Связь Model→View только через наблюдение (observer), поэтому Model переиспользуема.
Apple (и большинство фреймворков) всё перепутали:
- View и Controller слили в «View-Controller» — толстый монстр, который одновременно держит UI-элементы и кучу логики.
- Controller превратился в мусорный бак кода, «непереиспользуемый — но это нормально».
- Model зачастую делают пассивной структурой, а состояние хранят в самом виджете (чекбокс знает своё значение).
Итог: вместо «Model как источник истины» получаем размазанное состояние по View-Controller’ам, гонки данных и невозможность тестировать.
Почему случилось: в C/Pascal сделать observable-Model было больно, поэтому в Xerox Lisa пожертвовали чистотой ради скорости. За ними потянулись все.
Как надо:
Model — любой observable-объект (даже bool
в обёртке). View подписывается и рисует текущее значение; никогда не спрашивает «каков чекбокс?» — он знает только Model. Controller лишь говорит Model «переключись». Можно цеплять сколько угодно View к одной Model без изменения кода.
Комментарии (158)
- MVC — «религия без евангелия»: все уверены, что знают, что такое Model и View, но Controller — у каждого свой.
- Исходные определения настолько абстрактны, что под MVC подгоняют любую структуру из трёх классов; реальные кодовые базы показывают 1:1 связь V-C, что уничтожает пользу разделения.
- Контроллер быстро превращается в «всё, что не влезло в M или V», из-за чего страдает тестируемость и масштабируемость; 15 лет рефакторинга iOS-проектов подтверждают: 100 % проблем — в недостаточной проработке Model.
- RAD-фреймворки и визуальные редакторы ускорили искажение: код-behind стал контроллером, а «настоящий» MVC остался только в Smalltalk-историях.
- Практический выход: оставить MV, убрать лишний C или превратить его в тонкий «GluePuppy», который просто связывает наблюдаемую Model с реактивной View; всё остальное — следствие Expression Problem и отсутствия языковой поддержки композиции.