Обновить
1024K+

Программирование *

Искусство создания компьютерных программ

1 308,89
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Безопасное хранение паролей: соли, перцы и выбор алгоритма

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели505

Выбираете алгоритм хеширования паролей — берёте bcrypt, потому что все берут bcrypt, ставите rounds=10, потому что так в туториале, и идёте дальше. Разбираем, почему это может быть ошибкой, чем отличаются Argon2, scrypt и PBKDF2, и как правильно настроить каждый из них.

Читать далее

Новости

Как выбрать эмбеддинг для проекта

Уровень сложностиСредний
Время на прочтение20 мин
Охват и читатели2.3K

Эмбеддинги (иначе говоря, векторные представления) — это способ представления абстрактных данных в виде набора чисел (в виде векторов, как вы могли уже понять), близкие значения которых связаны семантически и математически и с которыми может работать модель искусственного интеллекта.

Разберемся какие модели лучше других подходят для кодирования слов. Параллельно с этим разберём принципы, на которые нужно опираться при выборе эмбеддинг-модели, пощупаем русские BERT-модели и внесём ясность про системные требования, контекстное окно и размер батча.

Читать далее

File-based apps в .NET 10

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели2.6K

Для небольших скриптов на C# долгое время приходилось создавать полноценный проект даже ради нескольких строк кода. В.NET 10 появилась поддержка file‑based apps — теперь приложение можно запускать и публиковать прямо из одного.cs‑файла. Разбираемся, как это работает и где новый подход действительно полезен.

Читать далее

Средовой подход вместо системного: как проектировать ИТ-продукты, которые растят сами себя

Время на прочтение12 мин
Охват и читатели2.3K

В этой статье попытаюсь начать набрасывать методологию проектирования ИТ-продуктов в средовом, а не системном подходе. Сразу предупреждаю — это скорее черновик, и мысли или конструирование вслух, хотя местами что-то мне уже удалось проверить на практике, а что-то мы сами того не зная уже давно используем.

Я отношусь к написанному ниже как к гипотезе, которую надо проверять об практику и об другие умы. Собственно этим я и занимаюсь, и продолжу заниматься.

Для начала вспомним что такое средовой подход и чем он отличается от системного

Читать далее

Как я решил проблему ввода спецсимволов без запоминания кучи клавиатурных сокращений

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели4.9K

Ввод специальных символов с клавиатуры начинает вызывать боль, как только вы пытаетесь выйти за рамки предустановок в системе. В итоге степень числа проще написать как ^2, а градус заменить словом не потому что так правильно, а потому что иначе приходится вспоминать Alt-коды, переключать раскладки, копировать символы из интернета или держать в голове комбинации клавиш.

По большому счету проблема не в самих символах, а в способе доступа к ним.

Типографские раскладки решают эту задачу через клавиатуру: добавляют новые комбинации и позволяют вводить символы напрямую. Подход рабочий, но не всегда удобный. Горячие клавиши могут конфликтовать с программами или системными сочетаниями. Раскладки зависят от языка ввода. Установка и перенос настроек тоже добавляют лишний слой сложности.

Я решил подойти к той же задаче проще. Помимо прочего функционала в программе KeyRay я добавил возможность автоматической замены текста.

Читать далее

Трансформация интерфейса приложений: сначала консоль, потом GUI, потом скажи, что нужно, и ИИ сделает?

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели10K

Всем привет.

Программировать я очень давно начал. Помню, как мне папа, прочитав журнал, вытравил плату и купил микросхемы, и, используя два больших калькулятора для бухгалтеров, разрезав их и склеив, собрал мне ZX Spectrum. У меня отец работал в Толмачёво инженером, который обслуживал большие ЭВМ и тренажёры для лётчиков "Аэрофлота".

В общем, я был, наверное, первый счастливчик в Новосибирске, у кого был персональный компьютер дома. Тогда ещё бизнесмены не успели продавать ZX Spectrum и кассеты к нему с играми, а у меня уже всё было. Я помню, как первые программы я не на кассетный магнитофон записывал, а на большой катушечный, сорри, не помню, как называется, но явно не магнитола и явно не магнитофон.

Я помню, первую программу продал кабельному телевидению. Она была написана на Бейсике, и там был простой интерфейс: вводишь номер объявления и текст, и так можно 10 объявлений задать. Потом запускаешь, мол, делай бегущую строку, и на кабельном телевидении моя программа внизу под фильмами бегущей строкой показывала рекламные сообщения.

Когда моего отца спросили, мол, как отблагодарить ребёнка, или можно бесплатно, отец сказал: "Ни в коем случае. Его спросите, что он хочет за проделанную работу". И я тогда, помню, запросил 10 рублей! И мне их оплатили! Вот было счастье при зарплате обычного работяги 100- 200 или инженера 200-300 рублей в месяц.

В общем, технологии шли вперёд, и у меня появился дисковод. Это было бомба! Не надо ждать 5 минут, когда с кассеты или с катушек загрузится программа. Программа грузилась за секунды!

Читать далее

Каталог из 83 форматов с плавающей точкой, который сам себя проверяет

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели10K

Если вы ловили расхождение точности между двумя реализациями одной сети, то знаете это чувство: один matmul на двух устройствах даёт разные числа, и непонятно — это баг, bf16 округлил или формат не тот. Две команды меряют один результат разными линейками.

Я сделал одну линейку с точными насечками: машинно-проверяемый каталог из 83 числовых форматов в 13 кластерах. Для каждого — разрядка битов, смещение, кодирование inf/NaN/субнормалей и общий якорь проверки 0x47C0. Из одного источника истины генерируются Markdown, JSON, Python, Rust, C и RTL для кремния.

У каждого формата стоит метка зрелости: 51 Verified, 12 Historical, 11 Experimental, 9 Open. И отдельная ось — граница RTL: где правило e = round((N−1)/φ²) ещё работающее железо (GF16 доведён до кремния), а где уже гипотеза (GF512/GF1024 — экстраполяция без строки Verilog). Внутри — лестница зрелости форматов, связь с IEEE P3109 и реальный баг в умножителе, который нашли только потому, что под форматом есть железо.

Как устроена линейка

HyperLogLog: как найти уникальные значения в терабайте данных, не храня их

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели12K

Представим задачу: хайлоад-сервис гонит поток данных — логи, IP-адреса, ID пользователей, миллиарды записей в сутки. Ваша задача — посчитать количество уникальных посетителей за неделю.

Первым решением может показаться завести HashSet и кидать туда ключи, а в конце посмотреть размер. Решение неплохое, но когда речь заходит о миллиардах записей — память будет слабым местом. Один IP-адрес (4 байта) как ключ в HashSet потянет за собой накладные расходы на ноды, указатели и хеши. На практике один элемент сжирает не меньше 50–100 байт. Поток в миллиард уникальных записей потребует под сотню гигабайт оперативной памяти. Это дорого, а если инстансов десять — то просто нереально.

Но существует алгоритм, который способен решить эту задачу примерно в 1.5 килобайта памяти с погрешностью около 2%? Без хранения самих данных и гигантских кластеров. Достаточно одного прохода по потоку и пары битовых трюков — именно так и работает HyperLogLog, алгоритм родом из математической статистики, который перевернул подход к подсчёту уникальности в Big Data.

HyperLogLog используют в Redis, BigQuery, ClickHouse, Presto. В этой статье мы разберем и реализуем этот алгоритм на C, а также узнаем его предысторию.

Читать далее

Пять ошибок начинающих C++ разработчиков при работе с памятью, из‑за которых программа крашится

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели6.9K

Большинство ошибок с памятью в C++ не выглядят как ошибки. Код компилируется, тесты проходят, приложение работает неделями. А потом внезапно появляется Segmentation fault, повреждённая куча или утечка памяти, которую приходится искать часами.

Разберём пять типичных ловушек, в которые регулярно попадают начинающие разработчики.

Читать далее

Как нарисовать тысячи объектов на карте и не убить FPS: эволюция рендера на Mapbox GL

Время на прочтение7 мин
Охват и читатели7.6K

Когда-то давно я разрабатывал геолокационную соцсеть, где на карте живут «облака» — посты, привязанные к точке. И этих облаков на экране могло быть очень и очень много. Наивный подход «одно облако = одна аннотация-UIView» упирается в потолок уже на десятках точек: карта превращается в слайд-шоу. Здесь история о том, как я пять раз упёрся в производительность и в итоге переехал на GL-слои с data-driven выражениями: три движка рендера на разных зумах, круги постоянного реального размера в метрах через metersPerPixel, а вся zoom-зависимость считается на GPU. И отдельно — как анимировать прозрачность GL-слоя, у которого вообще нет анимируемого свойства

Читать далее

Как мы отучали LLM выдумывать цифры в данных. Допрос Claude Desktop с пристрастием

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели8.2K

Никто не верил, что модель можно подпустить к таблицам и заставить не галлюцинировать. Цифры из воздуха, выдуманные колонки, суммы, которые не сходятся с источником, думаю на этом обжигались все, кто пробовал. Мы заставили, проблемы все еще есть, но выглядят решаемыми.

Начать допрос

Realtime-чат без WebSocket: long-polling, гонки переподключения и дубли пушей

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7K

Бывает, что realtime на проекте уже нужен, а WebSocket по каким-то причинам нет. Остаётся long-polling: клиент шлёт «бесконечный» HTTP-запрос, сервер держит его, пока не появятся новые сообщения, отвечает - и клиент тут же открывает следующий. Звучит просто, ровно до первого запуска на живом устройстве где-нибудь в метро. Дальше начинается то, ради чего и написана статья: гонки при переподключении, дубли локальных пушей и два независимых потока сообщений в одном ответе. Разбираю на примере реального iOS-сервиса, который я разрабатывал более 5 лет

Читать далее

Skill of the Week: Spring Data JDBC — качество Opus на модели за копейки

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели7.1K

Ранее в рубрике Skill of the Week мы уже разбирали Skill для Spring Data JPA. И, что предсказуемо, в комментариях нашлись те, кто увидел в нём лишнее доказательство простого тезиса: «вот видите, JPA не нужна, она слишком сложная». Аргумент понятный — у AI Agent-а с JPA действительно регулярно случаются «пожары»: ошибки в настройке связей между сущностями, странности с конфигурацией базовых типов, путаница с контекстом персистентности и разными состояниями сущности. Что характерно, ровно на этих же местах спотыкаются и живые разработчики — так что претензия скорее к технологии, чем к модели.

Раз JPA такая сложная — почему бы не взять что-нибудь попроще? Чистый JDBC многим кажется слишком низкоуровневым, и взгляд естественным образом падает на Spring Data JDBC: те же репозитории и сущности, но без прокси, lazy loading и кэша первого уровня. Технология проще — значит, и никакой Skill тут не нужен, верно?

А вот и нет. Умение AI «пользоваться» той или иной технологией зависит не столько от её когнитивной сложности, сколько от того, сколько кода с её использованием модель видела на этапе обучения. Spring Data JDBC объективно проще JPA, но кода с ней в открытом доступе на порядки меньше. Парадокс, но именно для технологий «с малым количеством кода» Skill даёт наибольший эффект: он закрывает ровно тот пробел, который модели нечем заполнить самостоятельно.

В сегодняшнем эпизоде еженедельной рубрики Skill of the Week разберёмся, как, используя Spring Data JDBC Skill, научить своего агента важным навыкам при работе со Spring Data JDBC.

Читать далее

Ближайшие события

Как биология и особенности медицинского учета издеваются над программистами

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели13K


На Хабре есть серия статей, касающаяся заблуждений программистов о, казалось бы, простых вещах: о времени, почтовых адресах, именах и даже дверях. Я недавно пообщался с ребятами, пилящими медицинский софт, и решил собрать набор таких же заблуждений, только применительно к врачебному делу. А чтобы было чуть интереснее, собрал это в виде истории, которой позавидует любой индийский фильм или турецкий сериал.

Итак, перед нами молодой джун Игорь (здесь и далее все имена и фамилии вымышлены), который работает в компании, разрабатывающей софт для больниц. Его только что отправили разгребать легаси-код для ПО, установленного во множестве родильных домов. Одновременно в больницу поступила Елена Соколова, благополучно беременная двойней - будущий кармический спутник Игоря. Но не в романтическом смысле - просто благодаря Елене наш Игорь пройдет через множество Edge-случаев...

Читать далее

НЕкурс про создание собственного языка программирования: вдохновляемся неожиданными открытиями, чтобы сделать свои

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели6.6K

В этой заметке мы разберём, что такое экспертиза и в чём её суть. Она бывает разной глубины, сферы и предназначения. Экспертиза не может существовать без теоретических знаний, опыта и, конечно же, не рождается там, где нет трудностей и ошибок. У каждого человека она уникальна.

Читать далее

Tools, Hooks, Skills, MCP — что есть что?

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели10K

Статья, которая поможет разобраться:
- такое tools, hooks и skills
- чем они они отличаются
- когда и что использовать

Читать далее

Roadmap разработчика имитационных моделей в AnyLogic

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели13K

Данная статья предназначена для начинающих разработчиков имитационных моделей в среде AnyLogic и всех интересующихся этим направлением. Мой рецепт специалиста построен на собственном опыте профессионального становления, а также обучении новичков данному ремеслу, но не является единственно верным и носит лишь ориентировочный характер. Итак, приступим.

Приступим!

Source generators в.NET: как они вытеснили рефлексию из стандартной библиотеки

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели12K

Ещё несколько лет назад рефлексия считалась нормой для.NET‑приложений. Сегодня Microsoft последовательно выносит всё больше работы из runtime в этап компиляции: JSON‑сериализация, логирование, регулярные выражения, конфигурация и даже тестовые фреймворки всё чаще опираются на source generators.

Разбираемся, почему рефлексия начала сдавать позиции, где кодогенерация уже стала стандартом и что это меняет для разработчиков.NET.

Читать далее

Пять ошибок начинающих Android‑разработчиков при работе с жизненным циклом

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели8.4K

Если после релиза Android‑приложения вы внезапно получаете краши, утечки памяти и жалобы на пропадающие данные, проблема может скрываться в нескольких строках кода вокруг Activity и Fragment.

В этой статье собрали пять ошибок жизненного цикла, которые регулярно встречаются даже в реальных коммерческих проектах.

Читать далее

Project Valhalla: 10 спустя

Уровень сложностиПростой
Время на прочтение19 мин
Охват и читатели8.6K

В новом переводе от команды Spring АйО рассмотрим решение старой проблемы в Java: полноценные классы часто слишком дорогие для памяти и процессора.

Пример - массив из миллиона, например, точек Point. Сейчас это обычно не миллион точек подряд, а миллион ссылок на объекты в куче. У каждого объекта есть служебные данные, его нужно создать, потом убрать сборщиком мусора. Плюс процессор постоянно прыгает по памяти, а это медленно.

Project Valhalla добавляет value class. Это обычный на вид класс с полями, конструктором и методами, но без идентичности объекта. JVM сможет хранить такие данные плотнее: например, прямо внутри массива, без отдельного объекта для каждого значения.

JEP 401 планируют включить в JDK 28 как preview. Это еще не финал: value class пока может быть null, а полная поддержка быстрых generics и плотных коллекций появится позже. Но первый рабочий шаг Valhalla уже близко.

Читать далее