A years-long Turkish alphabet bug in the Kotlin compiler
В Kotlin-компиляторе скрыта ошибка, срабатывающая при сборке проекта в турецкой локали. Из-за неё при попытке скомпилировать код в турецкой локали возникает ошибка парсинга XML от компилятора: строчка var category: CompilerMessageSeverity? = CATEGORIES[qName.toLowerCase()] в функции CompilerOutputParser некорректно обрабатывает турецкий символ I (U+0049), который при приведении к нижнему регистру становится не i (U+0069), а ı (U+0131) — точкой надстрочного i без точки. Из-за этого ключ i не находится в словаре CATEGORIES, и код ошибочно считает, что это неизвестный тег, и выдаёт сообщение об ошибке.
Ошибка скрывалась в коде с 2016 по 2021 год, пока не была обнаружена и исправлена. Теперь код корректно использует локально-независимый toLowerCase(Locale.ROOT), и проблема решена. Это яркий пример того, как тонкости локализации могут вызывать ошибки в интернационализированном ПО, особенно при обработке текста.
Комментарии (145)
- Проблема "турецкое I" встречается везде, где не указывается локаль при работе со строками, и это приводит к багам, когда вместо "I" в турецкой локали превращается в "ı" (без точки) и наоборот.
- Современные языки и фреймворки должны предоставлять единообразные и предсказуемые API, но вместо этого они вынуждают разработчиков указывать локаль каждый раз, что приводит к ошибкам.
- Пользователи с турецкой локалью страдают от багов, которые не могут быть обнаружены автоматически, потому что большинство разработчиков тестируют только на английской локали.
- Это также является примером более широкой проблемы: API-функции, которые не принимают
Localeпараметр, вместо этого полагаясь на дефолтной локали, что может привести к ошибкам.
Ask HN: Who is hiring? (October 2025) 💬 Длинная дискуссия
—
Комментарии (282)
- Компании ищут инженеров для работы с AI/ML, включая роли Senior Machine Learning Engineer, ML Scientist и разработчиков для создания AI-инструментов в различных областях, таких как биология, недвижимость и безопасность.
- Предлагаются позиции в software development, включая Full Stack, Backend, Frontend и MLOps инженеров, с использованием технологий Python, Kotlin, TypeScript, Rust и других, для удаленной, гибридной или офисной работы.
- Есть вакансии в сфере облачных технологий и инфраструктуры, такие как Cloud Engineer, SRE и DevOps, с фокусом на AWS, GCP, Azure и управление масштабируемыми системами.
- Несколько ролей связаны с разработкой в нишевых областях: квантовые вычисления, 3D-моделирование, финансовые технологии (алготрейдинг), видеоигры и управление цепочками поставок.
- Предложения включают позиции разного уровня, от начинающих до ведущих инженеров и архитекторов, с вариантами визовой поддержки, релокации и конкурентными зарплатами в диапазоне от $120k до $240k+ в зависимости от опыта и локации.
Comparing Rust to Carbon
На RustConf 2025 обсуждалась совместимость Rust и C/C++, где Чендлер Каррут сравнил подходы Rust и экспериментального языка Carbon. Rust предлагает инструменты вроде bindgen и cxx для взаимодействия, но они слабо подходят для сложного legacy-кода C++ (brownfield), где тесные связи и большой API усложняют миграцию. Carbon же задуман как полностью совместимый с C++ язык, позволяющий постепенно переписывать проекты файл за файлом без смены компилятора, с акцентом на аннотации для безопасности памяти.
Каррут считает, что Rust не скоро решит проблему полной интероперабельности с C++, тогда как Carbon предлагает эволюционный путь, аналогичный переходу от JavaScript к TypeScript. Это даёт пространство для Carbon, особенно в крупных legacy-проектах, где полный переход на Rust непрактичен. Вывод: два языка могут сосуществовать, решая разные аспекты миграции к безопасным языкам.
Комментарии (30)
- Обсуждается сложность и подходы к миграции с C/C++ на современные языки (Rust, Kotlin, Swift), включая инструменты для конвертации и постепенного перехода.
- Поднимаются вопросы о важности качественной интероперабельности между языками и недостатках C как языка-«клея» из-за отсутствия современных функций безопасности.
- Высказываются сомнения в универсальности Rust для полного переписывания из-за архитектурных несовпадений с идиоматическим C++.
- Отмечается, что такие проекты, как Carbon, нацелены на крупные кодобазы (вроде Google) и инкрементальный рефакторинг без полного переписывания.
- Упоминается, что принятие Rust в Linux пока ограничено (драйверы, отдельные подсистемы), а будущее Kotlin и Swift вне их экосистем (Android/Apple) остается под вопросом.
Rustroid, a Rust IDE for Android
Разработка Rustroid началась с увлечения Minecraft в детстве, когда на мобильном телефоне пришлось создавать моды без нормальных инструментов — только базовый редактор JSON. Это выявило острую нехватку developer tools под Android. Позже автор экспериментировал с Java, портируя игры через приложение CodeAssist, и освоил основы Android SDK.
С появлением ПК интерес сместился на Rust из-за его целостного инструментария (Cargo) и популярности. Выбор пал на Rust IDE, а не Java, из-за отсутствия аналогов и личной симпатии к языку. Проект начался на Java, но быстро перешел на Kotlin и Jetpack Compose — это оказалось эффективнее. Rustroid работает локально на устройстве, используя встроенный компилятор и пакетный менеджер Rust.
Комментарии (31)
- Обсуждается возможность и опыт программирования на телефоне с использованием различных инструментов (Termux, tmux, vim, внешние клавиатуры) и IDE.
- Отмечается, что кодинг на телефоне может быть актуален для пользователей без доступа к ПК, в поездках или в развивающихся странах.
- Поднимаются технические вопросы о работе конкретных приложений, их офлайн-доступности и интеграции с периферией (DeX, внешние экраны).
- Высказывается мнение, что рынок IDE для телефонов недостаточно развит, но имеет потенциал для быстрого прототипирования и работы "на ходу".
- Участники дискутируют, является ли скорость печати (WPM) ключевым фактором продуктивности в программировании, особенно с учетом развития ИИ-инструментов.
Top Programming Languages 2025 💬 Длинная дискуссия
Python сохраняет лидерство благодаря своей универсальности в машинном обучении и веб-разработке, а JavaScript остаётся незаменимым для фронтенда. Rust продолжает расти из-за акцента на безопасность и производительность, особенно в системном программировании. Go набирает популярность в облачных сервисах и микросервисной архитектуре благодаря простоте и эффективной параллельной обработке.
Стоит отметить рост TypeScript как более строгой альтернативы JavaScript, а также стабильное присутствие Java в корпоративных приложениях. Интерес к Julia увеличивается в научных вычислениях, а Kotlin укрепляет позиции в мобильной разработке под Android. Практический вывод: выбор языка всё больше зависит от конкретной области, а не только от общей популярности.
Комментарии (343)
- Сомнения в методологии рейтинга языков программирования IEEE из-за использования ненадёжных источников (поисковые запросы, устаревающий StackOverflow), что может искажать реальную картину.
- Удивление высокой позицией Java (2-е место), объясняемой её доминированием в enterprise-секторе (финансы, страхование, здравоохранение) и миграцией legacy-систем с COBOL.
- Обсуждение искусственного завышения позиции Python из-за его популярности у новичков, в академических статьях и как основного языка вывода для LLM.
- Предложение объединить рейтинги близких языков (JavaScript/TypeScript, Java/Kotlin, C/C++) для более точного отражения популярности экосистем.
- Размышления о влиянии AI-ассистентов на будущее языков: возможная стагнация из-за зависимости LLM от популярных языков или, наоборот, упрощение изучения нишевых.
Pocket Casts, You Altered the Deal, So I Will Alter Your App
Pocket Casts изначально был платным приложением с разовой оплатой, но после нескольких смен владельцев и перехода на модель подписки начал показывать рекламу даже пользователям, которые уже заплатили. Это вызвало недовольство, особенно учитывая, что в 2022 году приложение стало открытым исходным кодом. Автор статьи воспользовался этим, чтобы убрать рекламу через форк репозитория на GitHub, изменив флаги BANNER_ADS_PLAYER и BANNER_ADS_PODCASTS в коде на Kotlin.
В краткосрочной перспективной можно отключить рекламу через debug-сборку и встроенные переключатели функций, но в будущем это может стать сложнее из-за ужесточения политики безопасности Android. Ситуация напоминает 2020 год, когда NPR потеряла $800 тыс. на управлении приложением, что привело к продаже Automattic.
Комментарии (42)
- Пользователи критикуют добавление рекламы в приложение Pocket Casts, нарушающее обещание "единоразовой оплаты навсегда"
- Обсуждаются высокие эксплуатационные расходы сервиса и предполагаемая финансовая несостоятельность компании
- Высказывается недовольство Automattic за изменение условий и неуважение к пользователям
- Предлагаются альтернативные модели монетизации (подписка на новые функции) без ущерба для старых пользователей
- Поднимается вопрос о необходимости соблюдения договоренностей и этичности ведения бизнеса
Playing “Minecraft” without Minecraft (2024)
Разработчики создали полностью свободную альтернативу Minecraft, используя три независимых проекта: сервер Cuberite, прокси ViaProxy и клиент Minosoft. Это позволяет играть в совместимую версию игры без использования оригинального кода Mojang, что особенно интересно для энтузиастов open-source и тех, кто хочет избежать лицензионных ограничений.
Для запуска требуется 64-битная система с 4 ГБ ОЗУ, Java 17 и OpenGL-совместимая видеокарта. Cuberite эмулирует версию 1.12.2 с поддержкой измерений, а ViaProxy решает проблему совместимости между версиями протокола. Minosoft, написанный на Kotlin, завершает цепочку, предоставляя клиент с открытым исходным кодом.
Такой подход не только демонстрирует мощь сообщества, но и поднимает вопросы о будущем игровых экосистем, построенных на обратной разработке.
Комментарии (56)
- Обсуждаются технические требования и альтернативные реализации Minecraft, такие как Minosoft, Cuberite и Minetest (Luanti).
- Участники отмечают отсутствие официальной поддержки модификаций от Mojang и постепенный переход Microsoft на менее гибкую версию Bedrock.
- Предлагаются решения для совместимости разных версий, например, использование прокси-сервера ViaProxy для устранения багов.
- Minetest (Luanti) хвалят как образовательную платформу для обучения детей программированию, несмотря на некоторые ограничения.
- Упоминаются конкретные проекты, такие как Mineclonia, как наиболее близкие к оригинальному Minecraft по функциональности.
Configuration files are user interfaces
Файлы конфигурации — это пользовательские интерфейсы. Мы часто сталкиваемся с ситуацией, когда растущее ПО требует настройки, но полноценный графический интерфейс кажется избыточным. Прагматичное решение — текстовый файл конфигурации, который легко версионировать и который оставляет возможность для будущего развития.
Выбор языка для конфигурации — непростая задача. JSON кажется слишком техническим, TOML — слишком минималистичным. И тут возникает соблазн использовать YAML: он приятен глазу и популярен. Однако за кажущейся простотой скрываются pitfalls, как показывает печально известный «документ из ада». Со временем даже небольшой YAML-файл может превратиться в кошмар поддержки.
Корень проблемы не в выборе языка (YAML vs. альтернативы), а в том, что мы недооцениваем конфигурационные файлы как пользовательские интерфейсы. Они должны обеспечивать отличный UX: предотвращать ошибки, вести пользователя к успеху и работать как «велосипед для ума».
Пример реализации такого подхода — проект KSON, который позиционируется как более эффективная альтернатива YAML/JSON/TOML. KSON является верифицированным надмножеством JSON, поддерживает JSON Schema и предлагает инструменты для улучшения работы с конфигурациями.
Комментарии (81)
- Критика KSON за отсутствие чувствительности к пробелам, что может приводить к неочевидным ошибкам парсинга, как в примере с вложенным списком портов.
- Обеспокоенность рисками безопасности из-за единственной реализации на Kotlin и сложностей сборки для других языков, таких как Python и Rust.
- Предложение использовать полноценные языки программирования (например, Python) для конфигурации вместо специализированных форматов, чтобы дать пользователям больше инструментов.
- Аргумент в пользу того, что конфигурационные форматы должны быть выразительными, но ограниченными (как Cue, Starlark или Dhall), а не просто данными, как JSON или YAML.
- Подчёркивание различия между форматами для людей (конфигурация) и для компьютеров (данные), и критика попыток совместить их в одном формате.
- Замечание, что сложная конфигурация часто указывает на проблемы в дизайне ПО, и что лучше предоставить пользовательский интерфейс вместо сложных файлов.
- Упоминание альтернатив, таких как TOML, HJSON, HOCON, KDL и Jsonnet, с различными подходами к простоте, выразительности и проверке типов.
For Good First Issue – A repository of social impact and open source projects
Делай вклад в цифровые общественные блага
Помоги проектам, которые борются с климатом, голодом и прочими глобальными задачами. Ниже — готовые к первому PR репозитории.
| Проект | Язык | Направление |
|---|---|---|
| mautic | PHP | маркетинг-автоматизация |
| credebl | TypeScript | децентрализованная идентичность |
| avni-webapp | JavaScript | медицинские данные |
| the-turing-way | TeX | воспроизводимая наука |
| X-Road | Java | обмен данными между госорганами |
| OpenTermsArchive | JavaScript | прозрачность сервисов |
| OpenFn Lightning | Elixir | автоматизация workflow |
| android-fhir | Kotlin | мобильная медицина |
| casa | Ruby | волонтёрство для детей |
| ODK Collect | Kotlin | сбор данных в поле |
| cht-core | JavaScript | цифровое здравоохранение |
| policyengine-app | Jupyter | расчёт последствий политик |
| querido-diario | Python | открытые госгазеты |
| ODK Central | JavaScript | сервер для форм |
| decidim | Ruby | участие граждан |
Фильтр по языку и Целям устойчивого развития (SDG) на сайте.
Комментарии (14)
- Участники приветствуют инициативу списка проектов с «good first issue», но сомневаются в кураторстве: много проектов без активных задач, не все связаны с социальным влиянием.
- Предложено скрывать репозитории с 0 issues и добавлять метрики активности (коммиты, разработчики, возраст), как в Re-Decentralise.
- Новички спрашивают, считать ли правку опечаток «настоящим» вкладом; большинство советует упоминать, но честно указывать уровень участия.
MapLibre Tile: A next generation geospatial format optimized for rendering
MapLibre Tile — новый формат векторных тайлов, призванный заменить Mapbox Vector Tile (MVT).
Основные цели:
- меньше размер (до 50 % экономии);
- быстрее парсинг (до 2× ускорения);
- простота реализации без внешних зависимостей.
Ключевые улучшения
- FlatBuffers вместо Protocol Buffers → компактнее и без распаковки.
- структурированные слои: геометрия, атрибуты, индексы — отдельные буферы, что ускоряет выборку.
- delta-кодирование координат и ID → ещё меньше байт.
- встроенный R-tree для быстрого поиска объектов в тайле.
Совместимость
- Поддержка JS, C++, Swift, Kotlin.
- Рендерится в MapLibre GL JS ≥ 5.0 без изменений API.
- Обратная совместимость: конвертер MVT → MLT доступен.
Roadmap
Q4 2024 — стабильная спецификация, конвертеры, примеры.
Комментарии (11)
- Участники рады ускорению декодирования и уменьшению размера тайлов, но опасаются сложности внедрения вне MapLibre.
- Некоторые считают, что узкое место не в загрузке/декодировании, а в памяти и рантайме при множестве слоёв.
- Уже ведётся работа над MapLibre GL JS/Native (Java, JS, Rust, TS); CLI-кодировщик почти готов.
- Ожидается интеграция с Planetiler и, возможно, форк tippecanoe; документация и анонсы через новостную рассылку MapLibre.
Traps to Developers
-
CSS
min-width: auto(по умолчанию) имеет приоритет надflex-shrink,overflow: hidden,width: 0; задайтеmin-width: 0.- Горизонталь и вертикаль различаются:
width: autoрастягивается,height: autoпо содержимому;margin: 0 autoцентрирует по горизонтали, но не по вертикали (вflex-direction: columnработает). - BFC (
display: flow-root) предотвращает схлопывание margin и «обнуление» высоты родителя с float-потомками. - Новый stacking context создают
transform,filter,opacity,position: fixed/sticky,z-index+absolute/relativeи др.;z-indexдействует только внутри контекста. - На мобильных
100vhвключает скрытые панели; используйте100dvh. position: absoluteориентируется на ближайший «positioned» ancestor, а не на родителя.floatне работает внутри flex/grid-родителя.- Процентные
width/heightне работают, если размер родителя не задан. display: inlineигнорируетwidth,height, вертикальныеmargin.- Пробелы между
inline-blockэлементами рендерятся; в flex/grid — нет. box-sizing: content-box(по умолчанию) не включает padding/border; включитеborder-box.- Указывайте
width/heightу<img>для предотвращения CLS. - Загрузка файлов не показывается в DevTools; используйте
chrome://net-export/. - Внутри
<script>строка</script>ломает парсинг.
-
Unicode
- Отличайте code point и grapheme cluster (последнее — то, что видит пользователь).
Комментарии (100)
- Маршрутизаторы могут тихо обрывать простаивающие TCP-соединения; настройте TCP-keepalive или HTTP-заголовки.
- Возвращать
nullизOptional<T>— антипаттерн; Kotlin и аннотации уже решают это. - UTF-16 в Java/C#/JS — деталь реализации; в Go строки — просто байты.
min-width: autoработает не везде; CSS-свойства нельзя читать изолированно.- Регексы, YAML, LF/CRLF,
rm -rf $DIR/— каждый язык/платформа имеет свои подводные камни.
Zig's Lovely Syntax 💬 Длинная дискуссия
Zig выглядит почти как Rust, но делает синтаксис ещё приятнее за счёт более простой семантики и ряда изящных решений.
Числа
Литералы 92 всегда имеют тип comptime_int; при присваивании они неявно приводятся к нужному типу. Суффиксов нет.
Строки
Многострочные «сырые» строки пишутся через \\ в начале каждой строки; \ не экранируется, отступы не портятся, а лексер работает построчно.
Структуры
.{ .x = 1, .y = 2 } — запись поля через .x = совпадает с присваиванием, что позволяет грепом находить именно записи, а не чтения.
Типы
Все типы префиксные: u32, [3]u32, ?[3]u32, *const ?[3]u32. Разыменование постфиксное: ptr.*.
Идентификаторы
Синтаксис @"имя с пробелом" позволяет обходить ключевые слова и экспортировать любые имена.
Функции
fn add(x: i32, y: i32) i32 — без стрелки ->, так как лямбд нет, а возвращаемый тип всегда обязателен. pub fn main() void {}.
Переменные
const и var; часто используемое const короче, чем в Rust, но всё же длиннее Kotlin-овского val.
Комментарии (156)
- Обсуждение разделилось: кому-то синтаксис Zig кажется «прекрасным» минимализмом, другим — «шумным» и «капризным».
- Спор о порядке «имя: тип» vs «тип имя»: одни хотят видеть тип первым, другие — имя.
- Критика деталей: @-префиксы,
.{}, отсутствие лямбд, перенос строк,orelseбез пробела. - Плюсы: raw-строки Zig решают проблему отступов; обработка ошибок через
tryнравится многим. - Сравнения: Kotlin, C#, Go, Rust, D — каждый считает «своё» лучше.
- Итог: «красота» синтаксиса субъективна и во многом привычна; после практики Zig начинает нравиться.
An AI-first program synthesis framework built around a new programming language
Universalis: язык, который читают эксперты, а пишут LLM
Автор: Erik Meijer
- Цель — дать знатокам предметной области возможность формулировать задачи естественным языком и получать готовые программы без участия разработчиков.
- Средство — язык Universalis (в честь Лейбница), исполняемый нейро-компьютером Automind. Код похож на Excel-формулы, обёрнутые в «живые» описания.
Пример
Вопрос: «Алиса купила килограмм яблок за @B и продала за @S. Какой процент прибыли @P?»
Ответ-Universalis:
[@D is (@S-@B)]
[@P is (@D/@B)*100]
Вводим @B=10, @S=17 → @P=70 %.
Особенности
- Синтаксис максимально приближен к естественному языку.
- Внутри — логические предикаты Prolog.
- Поддержка пред-/пост-условий для валидации данных.
- Среда «живого программирования» наподобие электронной таблицы: переключение между формулами и значениями.
Комментарии (14)
- Критика: статья расплывчата, синтаксис «языка» меняется, управляющие конструкции описаны прозой, примеры сводятся к «сделай всё за меня».
- Сомнения: это реальный язык или фантазия LLM?
- Опасения: упрощение ведёт к потоку «мусорного» кода.
- Технические детали: под капотом Kotlin DataFrames, возможна ad-hoc типизация.
- ACM Queue обвиняют в рекламе без упоминания ограничений.
- Перспектива: рано или поздно придётся заново изобретать модули, типы, ошибки, параллелизм и т.д.
Byte Buddy is a code generation and manipulation library for Java
Byte Buddy — библиотека для генерации Java-классов во время выполнения без компилятора. В отличие от встроенных средств, она позволяет создавать произвольные классы, а не только прокси по интерфейсам.
Поддержка
- Коммерческая: обучение, консультации, разработка — пишите rafael.wth@gmail.com.
- Общие вопросы: задавайте на Stack Overflow с тегом
byte-buddy; для неформатных тем — рассылка. - Баги и фичи: issue tracker; пришлите пример кода и версию Java.
- Разработка: делайте pull-request; крупные фичи обсудите заранее в рассылке.
Проект ведёт Rafael Winterhalter с 2014 г.
Комментарии (27)
- В обсуждении сравнивают новый стандартный API для генерации байт-кода в JDK 24 (JEP 484) и старое решение ByteBuddy.
- Упоминают JavaPoet (теперь форк от Palantir) как удобный инструмент для генерации кода на уровне исходников.
- Micronaut показан примером фреймворка, избегающего runtime-генерации, делая всё во время компиляции.
- Поднимаются вечные споры «Java vs Kotlin»: кто-то считает Java «C для JVM», кто-то предпочитает Kotlin, а LLM якобы лучше понимают Java.