[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies":3,"\u002Fopen-source\u002Fnerdy-pro-dev-container":167,"glossary":603},[4,10,15,21,26,32,38,43,48,53,58,63,68,73,77,82,87,92,97,103,108,113,118,123,128,133,138,143,147,152,157,162],{"title":5,"description":6,"slug":7,"category":8,"icon":9},"Android","Каждое наше приложение выходит и на Android — платформенные API, фоновое выполнение, разрешения и требования магазина вместе с ними.","android","framework","logos:android-icon",{"title":11,"description":12,"slug":13,"category":8,"icon":14},"Angular","Фронтенд-фреймворк, в котором мы работаем, когда продукт уже на Angular, — строгая структура, подходящая большим долгоживущим приложениям.","angular","logos:angular-icon",{"title":16,"description":17,"slug":18,"category":19,"icon":20},"Dart","Язык, на котором написано каждое наше Flutter-приложение, — строгая null safety, полноценный pattern matching и компиляция в нативный код и веб.","dart","language","logos:dart",{"title":22,"description":23,"slug":24,"category":8,"icon":25},"Django","Python-фреймворк, который мы берём, когда продукту нужны админка, аутентификация и модель данных в первый же день, а не самописный сервис.","django","logos:django-icon",{"title":27,"description":28,"slug":29,"category":30,"icon":31},"Docker","Каждый наш сервис поставляется в виде контейнера, поэтому на ноутбуке, в CI и в продакшене работает один и тот же артефакт, а не три разных.","docker","infrastructure","logos:docker-icon",{"title":33,"description":34,"slug":35,"category":36,"icon":37},"Fastlane","Автоматизация релизов в нашей мобильной разработке — подпись, сборки и загрузка в сторы идут из CI, а не с ноутбука одного инженера в день релиза.","fastlane","tools","logos:fastlane",{"title":39,"description":40,"slug":41,"category":8,"icon":42},"Flutter","Наш основной мобильный стек с 2018 года — одна кодовая база на Dart для iOS, Android, веба и десктопа без отдельной команды под каждую платформу.","flutter","logos:flutter",{"title":44,"description":45,"slug":46,"category":36,"icon":47},"Git","Все проекты, к которым мы прикасаемся, живут в Git — ревью пул-реквестов, CI на каждой ветке и история, понятная и спустя месяцы.","git","logos:git-icon",{"title":49,"description":50,"slug":51,"category":19,"icon":52},"Go","Наш бэкенд-язык для real-time API и сервисов под нагрузкой — маленькие бинарники, быстрая сборка и конкурентность, которая остаётся читаемой.","go","logos:gopher",{"title":54,"description":55,"slug":56,"category":30,"icon":57},"Google Cloud","Облако, в котором работают наши продакшен-нагрузки, — управляемый Kubernetes, хранилище и сеть без серверов, которые надо обслуживать руками.","gcp","logos:google-cloud",{"title":59,"description":60,"slug":61,"category":36,"icon":62},"Gradle","Система сборки, через которую проходит каждый Android-релиз, — флейворы, конфигурации подписи и вся обвязка зависимостей под Flutter-приложением.","gradle","logos:gradle",{"title":64,"description":65,"slug":66,"category":30,"icon":67},"Helm","Так мы упаковываем деплой в Kubernetes — сервис, конфигурация, секреты и ingress как одна версионируемая единица, которую можно выкатить и откатить.","helm","logos:helm",{"title":69,"description":70,"slug":71,"category":19,"icon":72},"Kotlin","То, что мы берём, когда Flutter-приложению нужен настоящий Android под ним, — platform channels, фоновые задачи и интеграции с нативными SDK.","kotlin","logos:kotlin-icon",{"title":74,"description":75,"slug":76,"category":8,"icon":72},"Kotlin Multiplatform","Общая бизнес-логика для iOS и Android, а нативный интерфейс у каждой платформы свой, — альтернатива, когда Flutter не подходит.","kmp",{"title":78,"description":79,"slug":80,"category":30,"icon":81},"Kubernetes","Так мы запускаем сервисы в продакшене — деплой в Helm-чартах, откатываемые выкатки и масштабирование, для которого не нужен человек в три ночи.","kubernetes","logos:kubernetes",{"title":83,"description":84,"slug":85,"category":30,"icon":86},"NATS","Лёгкий обмен сообщениями между сервисами — publish\u002Fsubscribe и request\u002Freply без эксплуатационного веса полноценного кластера брокера.","nats","logos:nats-icon",{"title":88,"description":89,"slug":90,"category":8,"icon":91},"Nuxt","Vue с серверным рендерингом, роутингом и SEO из коробки — так мы делаем сайты и веб-приложения, которые должны быстро грузиться и индексироваться.","nuxt","logos:nuxt-icon",{"title":93,"description":94,"slug":95,"category":19,"icon":96},"PHP","Там, где PHP-бэкенд уже есть: дорабатываем его, интегрируемся с ним и делаем мобильные и веб-клиенты, которые он обслуживает.","php","logos:php",{"title":98,"description":99,"slug":100,"category":101,"icon":102},"PostgreSQL","Наша база данных по умолчанию — от проектирования схемы до настройки индексов мы берём её, если у продукта нет конкретной причины взять другую.","postgres","database","logos:postgresql",{"title":104,"description":105,"slug":106,"category":19,"icon":107},"Python","Наш язык для бэкендов, работы с данными и AI-интеграций — включая Python-биндинги, которые мы выпускаем к собственным инструментам на Rust.","python","logos:python",{"title":109,"description":110,"slug":111,"category":8,"icon":112},"React","Фронтенд-библиотека, в которой мы работаем, когда продукт уже на React, — компоненты, хуки и выросшая вокруг них экосистема.","react","logos:react",{"title":114,"description":115,"slug":116,"category":101,"icon":117},"Redis","Место для данных, которые должны быть быстрыми и которые не жалко пересчитать, — кэши, сессии, лимиты и очереди фоновых задач.","redis","logos:redis",{"title":119,"description":120,"slug":121,"category":19,"icon":122},"Ruby","Язык, на котором написана автоматизация наших мобильных релизов, — лейны Fastlane, кастомные действия и связка с CI, доставляющая сборки в сторы.","ruby","logos:ruby",{"title":124,"description":125,"slug":126,"category":19,"icon":127},"Rust","Куда мы идём, когда важны и скорость, и корректность, — рендеринг документов, CLI-инструменты и сервисы, которые обязаны оставаться быстрыми и предсказуемыми.","rust","simple-icons:rust",{"title":129,"description":130,"slug":131,"category":101,"icon":132},"SQLite","База данных, которая поставляется внутри приложения, — локальные кэши, offline-first хранилище и всё, что должно работать без сети.","sqlite","logos:sqlite",{"title":134,"description":135,"slug":136,"category":8,"icon":137},"Strapi","Headless CMS, к которой мы обращаемся, когда контент должны вести сами редакторы, — готовая админка и чистый API вместо самописных.","strapi","logos:strapi-icon",{"title":139,"description":140,"slug":141,"category":19,"icon":142},"Swift","То, что мы берём, когда Flutter-приложению нужен настоящий iOS под ним, — platform channels, интеграции нативных SDK, виджеты и App Clips.","swift","logos:swift",{"title":144,"description":145,"slug":146,"category":8,"icon":142},"SwiftUI","UI-фреймворк Apple, на котором мы делаем нативные поверхности, недоступные Flutter-приложению, — виджеты, App Clips и расширения.","swiftui",{"title":148,"description":149,"slug":150,"category":8,"icon":151},"Tailwind CSS","Так мы стилизуем весь фронтенд — утилитарные классы и дизайн-токены вместо таблицы стилей, которая только растёт и никогда не чистится.","tailwind","logos:tailwindcss-icon",{"title":153,"description":154,"slug":155,"category":19,"icon":156},"TypeScript","Стандарт для всего, что мы пишем для браузера и для Node-сервисов, — типы ловят ошибки интеграции раньше, чем код доходит до ревью.","typescript","logos:typescript-icon",{"title":158,"description":159,"slug":160,"category":8,"icon":161},"Vue","Наш фронтенд-фреймворк для админок, дашбордов мерчантов и веб-приложений, которые должны оставаться поддерживаемыми годами, а не спринтами.","vue","logos:vue",{"title":163,"description":164,"slug":165,"category":36,"icon":166},"Whisper","Открытая модель распознавания речи от OpenAI — движок транскрипции для голосового ввода, который работает и как бэкенд-сервис, и прямо на устройстве в приложении.","whisper","simple-icons:openai",{"id":168,"title":169,"body":170,"description":571,"extension":572,"links":573,"meta":577,"metaDescription":578,"metaTitle":579,"navigation":580,"ogDescription":581,"path":582,"repository":583,"seo":586,"slug":207,"stem":587,"technologies":588,"updated":589,"__hash__":590,"stats":591},"open_source_ru\u002Fopen-source\u002Fnerdy-pro-dev-container.md","Nerdy Pro Dev Container",{"type":171,"value":172,"toc":560},"minimark",[173,178,192,199,203,222,225,280,291,298,302,308,337,344,348,355,390,393,398,405,422,436,440,446,450,459,519,525,529,535,556],[174,175,177],"h2",{"id":176},"проблема","Проблема",[179,180,181,186,187,191],"p",{},[182,183,185],"term",{"slug":184},"dev-container","Dev-контейнеры"," VS Code — самый чистый способ дать каждому участнику проекта одинаковое окружение: та же ОС, те же версии инструментов, тот же shell. Но за это приходится платить: при первом открытии проекта VS Code собирает образ контейнера с нуля. Установка базового слоя ОС, рантайма языка, shell и любых AI-инструментов поверх него может занять несколько минут — и это повторяется при каждом изменении ",[188,189,190],"code",{},"Dockerfile",", инвалидирующем кэш.",[179,193,194,195,198],{},"Для команд, которые также используют Claude Code внутри контейнера, есть ещё один источник трения: чтобы аутентификация, история shell и кэш npm переживали пересборку контейнера, один и тот же шаблонный ",[188,196,197],{},"devcontainer.json"," приходится копировать в каждый репозиторий.",[174,200,202],{"id":201},"как-это-решается","Как это решается",[179,204,205,208,209,213,214,218,219,221],{},[188,206,207],{},"nerdy-pro-dev-container"," — это готовый ",[182,210,212],{"slug":211},"multi-arch-image","мультиархитектурный"," Docker-образ, опубликованный в GitHub ",[182,215,217],{"slug":216},"container-registry","Container Registry",". Вместо сборки образа dev-контейнера для каждого проекта репозиторий указывает в ",[188,220,197],{}," на опубликованный образ, и VS Code скачивает его напрямую — без этапа сборки, без ожидания.",[179,223,224],{},"Образ включает всё необходимое для немедленной работы над Node.js-проектом:",[226,227,228,240,246,252,265,271],"ul",{},[229,230,231,235,236,239],"li",{},[232,233,234],"strong",{},"Ubuntu 26.04"," в качестве базового образа (официальный ",[188,237,238],{},"devcontainers\u002Fbase"," от Microsoft)",[229,241,242,245],{},[232,243,244],{},"Node.js LTS",", установленный через NodeSource",[229,247,248,251],{},[232,249,250],{},"Claude Code",", установленный глобально через npm",[229,253,254,257,258,260,261,264],{},[232,255,256],{},"zsh с oh-my-zsh",", настроенный с плагинами ",[188,259,46],{}," и ",[188,262,263],{},"fzf"," как shell по умолчанию",[229,266,267,270],{},[232,268,269],{},"Стандартные CLI-инструменты"," — git, curl, wget, jq, gpg, клиент OpenSSH, fzf",[229,272,273,276,277],{},[232,274,275],{},"sudo без пароля"," для пользователя ",[188,278,279],{},"vscode",[179,281,282,283,286,287,290],{},"Образ собирается как для ",[188,284,285],{},"linux\u002Famd64",", так и для ",[188,288,289],{},"linux\u002Farm64",", поэтому один и тот же тег работает и на Intel\u002FAMD, и на Apple Silicon.",[179,292,293],{},[294,295],"img",{"alt":296,"src":297},"VS Code, открытый в Nerdy Dev Container, с Claude Code, работающим во встроенном терминале и боковой панели","\u002Fopen-source\u002Fnerdy-pro-dev-container\u002Fscreenshot.webp",[174,299,301],{"id":300},"сохранение-состояния-между-пересборками","Сохранение состояния между пересборками",[179,303,304,305,307],{},"Контейнер, который пересобирается при каждом изменении ",[188,306,190],{},", удобен, только если состояние не сбрасывается вместе с ним. Шаблон подключает четыре именованных Docker-тома, чтобы ничего не терялось между пересборками:",[226,309,310,321,328,331],{},[229,311,312,313,316,317,320],{},"Конфигурация и данные сессий Claude Code (директория ",[188,314,315],{},".claude",", через ",[188,318,319],{},"CLAUDE_CONFIG_DIR",")",[229,322,323,324,327],{},"История команд zsh (",[188,325,326],{},"HISTFILE"," на постоянном томе)",[229,329,330],{},"Кэш npm-пакетов",[229,332,333,336],{},[188,334,335],{},"known_hosts"," для SSH, чтобы доверие к git-хостам не приходилось устанавливать заново каждый раз",[179,338,339,340,343],{},"Аутентификация git пробрасывает SSH-агент хоста внутрь контейнера, а ",[188,341,342],{},"gitconfig"," хоста копируется автоматически — коммиты, сделанные внутри контейнера, указывают правильного автора без какой-либо ручной настройки.",[174,345,347],{"id":346},"начало-работы","Начало работы",[179,349,350,351,354],{},"Скопируйте шаблон в ",[188,352,353],{},".devcontainer\u002Fdevcontainer.json",":",[356,357,362],"pre",{"className":358,"code":359,"language":360,"meta":361,"style":361},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"name\": \"my-project\",\n  \"image\": \"ghcr.io\u002Fnerdy-pro\u002Fnerdy-pro-dev-container:latest\"\n}\n","json","",[188,363,364,372,378,384],{"__ignoreMap":361},[365,366,369],"span",{"class":367,"line":368},"line",1,[365,370,371],{},"{\n",[365,373,375],{"class":367,"line":374},2,[365,376,377],{},"  \"name\": \"my-project\",\n",[365,379,381],{"class":367,"line":380},3,[365,382,383],{},"  \"image\": \"ghcr.io\u002Fnerdy-pro\u002Fnerdy-pro-dev-container:latest\"\n",[365,385,387],{"class":367,"line":386},4,[365,388,389],{},"}\n",[179,391,392],{},"Переоткройте проект в dev-контейнере — Node.js, zsh и Claude Code будут готовы без этапа сборки.",[394,395,397],"h3",{"id":396},"аутентификация-claude-code","Аутентификация Claude Code",[179,399,400,401,404],{},"Claude Code внутри контейнера считывает переменную окружения ",[188,402,403],{},"CLAUDE_CODE_OAUTH_TOKEN"," вместо интерактивного входа. Сгенерируйте долгоживущий токен на хосте:",[356,406,410],{"className":407,"code":408,"language":409,"meta":361,"style":361},"language-shell shiki shiki-themes material-theme-lighter github-light github-dark","claude setup-token\n","shell",[188,411,412],{"__ignoreMap":361},[365,413,414,418],{"class":367,"line":368},[365,415,417],{"class":416},"sbgvK","claude",[365,419,421],{"class":420},"s_sjI"," setup-token\n",[179,423,424,425,428,429,432,433,435],{},"Сохраните его в менеджере учётных данных хоста — Keychain на macOS, keyring рабочего стола (",[188,426,427],{},"secret-tool",") на Linux или DPAPI на Windows — и пробросьте в контейнер через запись ",[188,430,431],{},"remoteEnv"," в ",[188,434,197],{},", чтобы его никогда не приходилось вводить внутри самого контейнера.",[394,437,439],{"id":438},"первая-git-операция","Первая git-операция",[179,441,442,443,445],{},"Первый push или fetch в свежем контейнере запросит в терминале проверку ключа хоста — это разовое подтверждение, которое устанавливает SSH-доверие к этому git-хосту, а дальше оно кэшируется на постоянном томе ",[188,444,335],{},".",[174,447,449],{"id":448},"версионирование-и-релизы","Версионирование и релизы",[179,451,452,453,432,455,458],{},"Образы собираются и публикуются только из релизов GitHub, а не при каждом коммите — изменение ",[188,454,190],{},[188,456,457],{},"main"," никак не влияет на других, пока не выпущен релиз. Каждый релиз публикует четыре тега:",[460,461,462,475],"table",{},[463,464,465],"thead",{},[466,467,468,472],"tr",{},[469,470,471],"th",{},"Тег",[469,473,474],{},"Поведение",[476,477,478,489,499,509],"tbody",{},[466,479,480,486],{},[481,482,483],"td",{},[188,484,485],{},"1.0.0",[481,487,488],{},"Зафиксирован — никогда не меняется",[466,490,491,496],{},[481,492,493],{},[188,494,495],{},"1.0",[481,497,498],{},"Обновляется при патч-релизах",[466,500,501,506],{},[481,502,503],{},[188,504,505],{},"1",[481,507,508],{},"Обновляется при минорных и патч-релизах",[466,510,511,516],{},[481,512,513],{},[188,514,515],{},"latest",[481,517,518],{},"Всегда последний стабильный релиз",[179,520,521,522,524],{},"Такой набор тегов позволяет проекту зафиксировать точную версию ради воспроизводимости или следовать за ",[188,523,515],{},", чтобы обновляться автоматически.",[174,526,528],{"id":527},"лицензия","Лицензия",[179,530,531,532,534],{},"Dockerfile, шаблон ",[188,533,197],{}," и документация распространяются под лицензией MIT. Всё, что установлено поверх базового образа — Ubuntu, Node.js, zsh, fzf, Claude Code — сохраняет свою исходную лицензию.",[536,537,539],"questions",{":items":538},"[{\"title\":\"Что такое nerdy-pro-dev-container?\",\"text\":\"Это готовый мультиархитектурный Docker-образ для VS Code Dev Containers, включающий Node.js LTS, zsh и Claude Code, опубликованный в GitHub Container Registry как ghcr.io\u002Fnerdy-pro\u002Fnerdy-pro-dev-container. Проект указывает на этот образ в devcontainer.json и полностью пропускает этап сборки.\"},{\"title\":\"Нужно ли собирать образ самостоятельно?\",\"text\":\"Нет. Образ опубликован в GitHub Container Registry и скачивается напрямую VS Code. Достаточно указать в devcontainer.json на ghcr.io\u002Fnerdy-pro\u002Fnerdy-pro-dev-container:latest — и этап сборки пропускается полностью.\"},{\"title\":\"Что предустановлено в контейнере?\",\"text\":\"Ubuntu 26.04, Node.js LTS, Claude Code, zsh с oh-my-zsh (плагины git и fzf) и стандартные CLI-инструменты, включая git, curl, wget, jq, gpg и клиент OpenSSH.\"},{\"title\":\"Как аутентифицируется Claude Code внутри контейнера?\",\"text\":\"Выполните claude setup-token на хосте, чтобы сгенерировать долгоживущий токен, сохраните его в менеджере учётных данных хоста и пробросьте в контейнер как переменную окружения CLAUDE_CODE_OAUTH_TOKEN через remoteEnv в devcontainer.json.\",\"slot\":\"claude-auth\"},{\"title\":\"Сохраняется ли состояние при пересборке контейнера?\",\"text\":\"Да. Четыре Docker-тома сохраняют конфигурацию Claude Code, историю zsh, кэш npm и SSH known_hosts между пересборками, поэтому повторная аутентификация и установление доверия не требуются каждый раз.\"},{\"title\":\"Какие архитектуры поддерживаются?\",\"text\":\"Образ собирается как для linux\u002Famd64, так и для linux\u002Farm64, поэтому один и тот же тег работает и на Intel\u002FAMD, и на Apple Silicon.\"},{\"title\":\"Как устроено версионирование?\",\"text\":\"Образы публикуются только из релизов GitHub. Каждый релиз создаёт четыре тега — точную версию вроде 1.0.0, минорную версию вроде 1.0, мажорную версию вроде 1 и latest — так что проект может зафиксировать конкретную версию или следовать за последним стабильным релизом.\"}]",[540,541,542],"template",{"v-slot:claude-auth_body":361},[179,543,544,545,548,549,551,552,432,554,445],{},"Выполните ",[188,546,547],{},"claude setup-token"," на хосте, чтобы сгенерировать долгоживущий токен, сохраните его в менеджере учётных данных хоста и пробросьте в контейнер как переменную окружения ",[188,550,403],{}," через ",[188,553,431],{},[188,555,197],{},[557,558,559],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":361,"searchDepth":374,"depth":374,"links":561},[562,563,564,565,569,570],{"id":176,"depth":374,"text":177},{"id":201,"depth":374,"text":202},{"id":300,"depth":374,"text":301},{"id":346,"depth":374,"text":347,"children":566},[567,568],{"id":396,"depth":380,"text":397},{"id":438,"depth":380,"text":439},{"id":448,"depth":374,"text":449},{"id":527,"depth":374,"text":528},"Готовый Docker-образ для dev-контейнера с предустановленными Node.js, zsh и Claude Code — подключите его в .devcontainer любого проекта, чтобы пропустить сборку и сразу начать работу.","md",[574],{"type":575,"url":576},"open_devcontainer","https:\u002F\u002Fvscode.dev\u002Fredirect?url=vscode:\u002F\u002Fms-vscode-remote.remote-containers\u002FcloneInVolume?url=https:\u002F\u002Fgithub.com\u002Fnerdy-pro\u002Fnerdy-pro-dev-container",{},"Готовый Docker-образ для dev-контейнера с предустановленными Node.js, zsh и Claude Code. Подключается через .devcontainer\u002Fdevcontainer.json без сборки.","Готовый VS Code Dev Container с Claude Code",true,"Node.js, zsh и Claude Code уже внутри. Укажите образ в .devcontainer — и пропустите сборку целиком.","\u002Fopen-source\u002Fnerdy-pro-dev-container",{"type":584,"company":585,"name":207},"github","nerdy-pro",{"title":169,"description":571},"open-source\u002Fnerdy-pro-dev-container",[29,46],"2026-08-02","RGqqgTiGILQ7Z_19vQutA2un4bzeYZD4NX_m4PA1dpQ",{"forks":592,"stars":368,"contributors":593,"last_release":599,"issues":592,"has_contribution_guide":600,"license":601,"last_updated":602,"watchers":368},0,[594],{"login":595,"profile_url":596,"avatar_url":597,"contributions":598},"thenixan","https:\u002F\u002Fgithub.com\u002Fthenixan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F3602098?v=4",23,"v1.1.0",false,"MIT","2026-08-05T14:37:59Z",[604,618,631,646,660,675,688,701,714,731,744,755,765,778,790,801,810,824,837,844,858,873,886,899,912,923,934,945,958,968,981,993,1007,1018,1032,1041,1052,1065,1078,1091,1103,1115,1127,1139,1151,1163,1174,1188,1199,1211,1222,1235,1247],{"slug":605,"term":606,"definition":607,"category":608,"aliases":609,"links":611,"related":615,"readMore":-1,"target":617,"hasArticle":600},"aosp","AOSP","Android Open Source Project — Android без надстройки Google, который может форкнуть кто угодно. На его форках работают кассовые терминалы, киоски и автомобильные системы, а работа на этом уровне открывает части ОС, которых прикладной разработчик не видит.","platform",[610],"Android Open Source Project",[612],{"kind":613,"url":614},"website","https:\u002F\u002Fsource.android.com\u002F",[616],"host-card-emulation","\u002Fglossary#aosp",{"slug":619,"term":620,"definition":621,"category":608,"aliases":622,"links":623,"related":627,"readMore":-1,"target":630,"hasArticle":600},"app-clips","App Clips","Функция Apple, позволяющая запустить небольшую часть iOS-приложения — до 15 МБ — не устанавливая его целиком. Вызывается по QR-коду, NFC-метке или ссылке: для случаев, когда первое действие пользователя не должно требовать похода в App Store.",[],[624],{"kind":625,"url":626},"documentation","https:\u002F\u002Fdeveloper.apple.com\u002Fapp-clips\u002F",[628,629],"deep-linking","install-referrer","\u002Fglossary#app-clips",{"slug":632,"term":633,"definition":634,"category":608,"aliases":635,"links":636,"related":642,"readMore":-1,"target":645,"hasArticle":600},"bigquery","BigQuery","Аналитическое хранилище Google Cloud. Вы запускаете SQL по миллиардам строк, и они сканируются за секунды, а данные при этом лежат отдельно от машин, выполняющих запросы. Именно это снимает отчётность и исследование данных с базы, обслуживающей живой трафик.",[],[637,639],{"kind":613,"url":638},"https:\u002F\u002Fcloud.google.com\u002Fbigquery",{"kind":640,"url":641},"wikipedia","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBigQuery",[643,644],"object-storage","elasticsearch","\u002Fglossary#bigquery",{"slug":647,"term":648,"definition":649,"category":650,"aliases":651,"links":655,"related":658,"readMore":-1,"target":659,"hasArticle":600},"ci-cd","CI\u002FCD","Автоматизация, которая собирает, тестирует и выкладывает каждое изменение без ручного запуска команд. В мобильной разработке это то, что превращает релиз в нажатие кнопки вместо полудня ожидания, пока освободится нужный человек.","practice",[652,653,654],"CI","непрерывная интеграция","непрерывная поставка",[656],{"kind":640,"url":657},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCI\u002FCD",[],"\u002Fglossary#ci-cd",{"slug":661,"term":662,"definition":663,"category":664,"aliases":665,"links":668,"related":671,"readMore":-1,"target":674,"hasArticle":600},"crud","CRUD","Create, read, update, delete — четыре операции, стоящие почти за каждой формой и админкой. Собирательное название для рутинной половины приложения, которая управляет данными, в отличие от частей с реальной предметной логикой.","architecture",[666,667],"Create, Read, Update, Delete","создание, чтение, обновление, удаление",[669],{"kind":640,"url":670},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCreate,_read,_update_and_delete",[672,673],"rest","graphql","\u002Fglossary#crud",{"slug":184,"term":676,"definition":677,"category":650,"aliases":678,"links":681,"related":686,"readMore":-1,"target":687,"hasArticle":600},"Dev Container","Среда разработки, описанная один раз в devcontainer.json — ОС, инструменты и версии рантаймов, которые нужны проекту, — и открываемая одинаково внутри контейнера в редакторе любого участника, вместо инструкции по установке, которую каждый понимает по-своему.",[197,679,680],"Dev Containers","VS Code Dev Containers",[682,684],{"kind":613,"url":683},"https:\u002F\u002Fcontainers.dev\u002F",{"kind":625,"url":685},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fdevcontainers\u002Fcontainers",[216],"\u002Fglossary#dev-container",{"slug":644,"term":689,"definition":690,"category":608,"aliases":691,"links":694,"related":699,"readMore":-1,"target":700,"hasArticle":600},"Elasticsearch","Поисковый и аналитический движок, который индексирует записи, чтобы их можно было интерактивно фильтровать и искать, а не сканировать. К нему обращаются, когда вопрос звучит как «покажи вот эти сессии с шестью фильтрами», а не «просуммируй колонку».",[692,693],"Elastic","ELK",[695,697],{"kind":613,"url":696},"https:\u002F\u002Fwww.elastic.co\u002Felasticsearch",{"kind":640,"url":698},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElasticsearch",[632],"\u002Fglossary#elasticsearch",{"slug":702,"term":703,"definition":704,"category":664,"aliases":705,"links":708,"related":709,"readMore":-1,"target":713,"hasArticle":600},"fan-out","Fan-out","Чтение источника один раз и доставка каждого обновления всем подписанным на него клиентам. Наивная версия пишет подписчикам в цикле и встаёт, как только один из сокетов начинает тормозить; рабочая — держит отдельный буфер на каждого клиента и отключает тех, кто не успевает.",[706,707],"веерная рассылка","фан-аут",[],[710,711,712],"websocket","pub-sub","server-sent-events","\u002Fglossary#fan-out",{"slug":715,"term":716,"definition":717,"category":650,"aliases":718,"links":721,"related":726,"readMore":-1,"target":730,"hasArticle":600},"gdpr","GDPR","Регламент ЕС о персональных данных людей в ЕС: законное основание для сбора, настоящее согласие на трекинг, право увидеть и удалить свои данные. Он следует за вашими пользователями, а не за вашими серверами: где зарегистрирована компания, значения не имеет.",[719,720],"Общий регламент по защите данных","General Data Protection Regulation",[722,724],{"kind":613,"url":723},"https:\u002F\u002Fgdpr.eu\u002F",{"kind":640,"url":725},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",[727,728,729],"pci-dss","soc-2","hipaa","\u002Fglossary#gdpr",{"slug":732,"term":733,"definition":734,"category":650,"aliases":735,"links":739,"related":742,"readMore":-1,"target":743,"hasArticle":600},"golden-test","Golden-тест","Тест, который отрисовывает виджет и сравнивает результат попиксельно с эталонным изображением. Во Flutter это самый дешёвый способ узнать, не сломал ли редизайн пустое состояние на 320pt, в тёмной теме, при 200% масштабе текста.",[736,737,738],"golden test","золотой тест","скриншотный тест",[740],{"kind":625,"url":741},"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fflutter_test\u002FmatchesGoldenFile.html",[647],"\u002Fglossary#golden-test",{"slug":673,"term":745,"definition":746,"category":664,"aliases":747,"links":748,"related":753,"readMore":-1,"target":754,"hasArticle":600},"GraphQL","Язык запросов к API, где клиент сам перечисляет нужные поля и получает один ответ ровно такой формы. Он снимает избыточную выдачу, к которой дрейфуют REST-эндпоинты, и добавляет собственный режим отказа: неограниченный запрос, обходящий всю модель данных.",[],[749,751],{"kind":613,"url":750},"https:\u002F\u002Fgraphql.org\u002F",{"kind":640,"url":752},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGraphQL",[672],"\u002Fglossary#graphql",{"slug":729,"term":756,"definition":757,"category":650,"aliases":758,"links":760,"related":763,"readMore":-1,"target":764,"hasArticle":600},"HIPAA","Закон США о защищённой медицинской информации: как её можно хранить, передавать, логировать и раскрывать. Как и PCI-DSS, это архитектурное ограничение, которое выбирают в начале, а не документ, который дописывают перед запуском.",[759],"Health Insurance Portability and Accountability Act",[761],{"kind":640,"url":762},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHealth_Insurance_Portability_and_Accountability_Act",[727,715,728],"\u002Fglossary#hipaa",{"slug":766,"term":767,"definition":768,"category":664,"aliases":769,"links":772,"related":775,"readMore":-1,"target":777,"hasArticle":600},"headless-cms","Headless CMS","Система управления контентом с админкой и API, но без собственного фронтенда. Редакторы публикуют в одном месте, а сайт или приложение отрисовывает контент само — слой представления принадлежит вам, а не вендору CMS.",[770,771],"безголовая CMS","контентное API",[773],{"kind":640,"url":774},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHeadless_content_management_system",[776,672],"server-side-rendering","\u002Fglossary#headless-cms",{"slug":616,"term":779,"definition":780,"category":608,"aliases":781,"links":785,"related":788,"readMore":-1,"target":789,"hasArticle":600},"Host Card Emulation","Режим, в котором Android-телефон программно эмулирует бесконтактную карту по NFC, без аппаратного защищённого элемента. Так платит приложение-кошелёк на терминале: телефон говорит с ним по тому же протоколу EMV Contactless, что и пластиковая карта.",[782,783,784],"HCE","EMV Contactless","бесконтактные платежи",[786],{"kind":625,"url":787},"https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fconnectivity\u002Fnfc\u002Fhce",[727,605],"\u002Fglossary#host-card-emulation",{"slug":791,"term":792,"definition":793,"category":608,"aliases":794,"links":795,"related":798,"readMore":-1,"target":800,"hasArticle":600},"impeller","Impeller","Движок рендеринга, на котором Flutter работает сегодня: по умолчанию на iOS с 2023 года и на Android с 2024-го. Он компилирует шейдеры заранее, а не во время первой анимации, что убрало главную видимую проблему Flutter в проде — джанк на компиляции шейдеров.",[],[796],{"kind":625,"url":797},"https:\u002F\u002Fdocs.flutter.dev\u002Fperf\u002Fimpeller",[799],"skia","\u002Fglossary#impeller",{"slug":629,"term":802,"definition":803,"category":608,"aliases":804,"links":805,"related":808,"readMore":-1,"target":809,"hasArticle":600},"Install Referrer","API Google Play, который передаёт только что установленному Android-приложению параметры кампании из ссылки, приведшей к установке. Android-половина отложенного диплинкинга и надёжный способ понять, откуда пришёл пользователь.",[],[806],{"kind":625,"url":807},"https:\u002F\u002Fdeveloper.android.com\u002Fgoogle\u002Fplay\u002Finstallreferrer",[628,619],"\u002Fglossary#install-referrer",{"slug":811,"term":812,"definition":813,"category":814,"aliases":815,"links":817,"related":822,"readMore":-1,"target":823,"hasArticle":600},"jwt","JWT","Подписанный токен, несущий свои данные внутри: сервер понимает, кому принадлежит запрос, не обращаясь к хранилищу сессий. Стандарт мобильной аутентификации. Подпись доказывает, что токен не меняли, но не скрывает его содержимое.","protocol",[816],"JSON Web Token",[818,820],{"kind":613,"url":819},"https:\u002F\u002Fjwt.io\u002F",{"kind":640,"url":821},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON_Web_Token",[727],"\u002Fglossary#jwt",{"slug":825,"term":826,"definition":827,"category":650,"aliases":828,"links":832,"related":835,"readMore":-1,"target":836,"hasArticle":600},"kyc","KYC","Know Your Customer — проверки личности, которые регулируемый финансовый продукт проводит, прежде чем разрешить переводить деньги: съёмка документов, liveness, санкционный и антиотмывочный скрининг. На онбординг это влияет сильнее любого дизайн-решения.",[829,830,831],"Know Your Customer","AML","KYC\u002FAML",[833],{"kind":640,"url":834},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnow_your_customer",[727,715],"\u002Fglossary#kyc",{"slug":76,"term":74,"definition":838,"category":608,"aliases":839,"links":841,"related":842,"readMore":843,"target":843,"hasArticle":600},"Переиспользование бизнес-логики на Kotlin между Android, iOS и сервером, при этом интерфейс на каждой платформе остаётся нативным. Альтернатива Flutter, когда UI обязан быть нативным, а правила за ним — нет.",[840],"KMP",[],[],"\u002Ftechnologies\u002Fkmp",{"slug":845,"term":846,"definition":847,"category":848,"aliases":849,"links":852,"related":855,"readMore":-1,"target":857,"hasArticle":600},"mvp","MVP","Минимальная версия продукта, которую можно показать реальным пользователям и которая при этом отвечает на вопрос, ради которого его делали. Решение об объёме, а не о качестве: MVP всё равно обязан работать.","business",[850,851],"минимально жизнеспособный продукт","minimum viable product",[853],{"kind":640,"url":854},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMinimum_viable_product",[856],"white-label","\u002Fglossary#mvp",{"slug":859,"term":860,"definition":861,"category":814,"aliases":862,"links":866,"related":871,"readMore":-1,"target":872,"hasArticle":600},"oauth","OAuth","Стандарт, на котором держатся «Вход через Apple», Google и остальные: пользователь авторизует ваше приложение у провайдера, которому уже доверяет, а приложение получает токен вместо пароля. Никто не заводит новый пароль, и вы его не храните.",[863,864,865],"OAuth 2.0","вход через соцсети","Sign in with Apple",[867,869],{"kind":613,"url":868},"https:\u002F\u002Foauth.net\u002F2\u002F",{"kind":640,"url":870},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOAuth",[811],"\u002Fglossary#oauth",{"slug":727,"term":874,"definition":875,"category":650,"aliases":876,"links":879,"related":884,"readMore":-1,"target":885,"hasArticle":600},"PCI-DSS","Стандарт безопасности карточной индустрии, обязательный для всех, кто хранит, обрабатывает или передаёт данные карт. Большинство приложений намеренно остаются вне зоны его действия, отдавая ввод карты сертифицированному платёжному провайдеру.",[877,878],"PCI DSS","Payment Card Industry Data Security Standard",[880,882],{"kind":613,"url":881},"https:\u002F\u002Fwww.pcisecuritystandards.org\u002F",{"kind":640,"url":883},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPayment_Card_Industry_Data_Security_Standard",[811],"\u002Fglossary#pci-dss",{"slug":887,"term":888,"definition":889,"category":848,"aliases":890,"links":893,"related":896,"readMore":-1,"target":898,"hasArticle":600},"product-market-fit","Product-market fit","Момент, когда продукт доказуемо нашёл своих людей: они им пользуются, возвращаются и платят. До него разработка отвечает на вопрос, после — на спрос.",[891,892],"PMF","соответствие продукта рынку",[894],{"kind":640,"url":895},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct-market_fit",[845,897],"time-to-market","\u002Fglossary#product-market-fit",{"slug":900,"term":901,"definition":902,"category":650,"aliases":903,"links":906,"related":909,"readMore":-1,"target":911,"hasArticle":600},"prompt-injection","Prompt injection","Атака, при которой текст от пользователя языковая модель читает как инструкции, а не как данные, и уходит в обход собственных правил. Родственник SQL-инъекции в эпоху LLM: возникает везде, где пользовательский ввод склеивается в промпт.",[904,905],"инъекция промпта","инъекция в промпт",[907],{"kind":640,"url":908},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPrompt_injection",[910],"rate-limiting","\u002Fglossary#prompt-injection",{"slug":711,"term":913,"definition":914,"category":664,"aliases":915,"links":918,"related":921,"readMore":-1,"target":922,"hasArticle":600},"Pub\u002FSub","Шаблон обмена сообщениями: производитель публикует событие, а любое число потребителей независимо читает его через стоящий между ними брокер. Производитель никогда их не ждёт — так путь запроса остаётся быстрым, а более медленная работа выполняется в фоне.",[916,917],"публикация\u002Fподписка","Google Cloud Pub\u002FSub",[919],{"kind":640,"url":920},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPublish%E2%80%93subscribe_pattern",[],"\u002Fglossary#pub-sub",{"slug":672,"term":924,"definition":925,"category":664,"aliases":926,"links":929,"related":932,"readMore":-1,"target":933,"hasArticle":600},"REST","Общепринятый стиль HTTP-API: URL называет ресурс, а HTTP-метод говорит, что с ним сделать. Способ по умолчанию, которым приложение общается с бэкендом, и то, что ожидает найти большинство сторонних интеграций.",[927,928],"REST API","Representational State Transfer",[930],{"kind":640,"url":931},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FREST",[710,712],"\u002Fglossary#rest",{"slug":728,"term":935,"definition":936,"category":650,"aliases":937,"links":940,"related":943,"readMore":-1,"target":944,"hasArticle":600},"SOC 2","Отчёт внешнего аудитора о том, как компания обращается с данными клиентов — безопасность, доступность, конфиденциальность, — а не сертификат, который можно купить. Корпоративные заказчики его требуют, а архитектуру он ограничивает задолго до самого аудита.",[938,939],"SOC2","System and Organization Controls",[941],{"kind":640,"url":942},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSystem_and_Organization_Controls",[727,715,729],"\u002Fglossary#soc-2",{"slug":946,"term":947,"definition":948,"category":848,"aliases":949,"links":952,"related":955,"readMore":-1,"target":957,"hasArticle":600},"saas","SaaS","Софт, который продают как постоянную подписку на размещённый у поставщика продукт, а не как разовую лицензию для установки у себя. Поставщик держит серверы, непрерывно выкатывает обновления и берёт плату за пользователя или за объём.",[950,951],"Software as a Service","ПО как услуга",[953],{"kind":640,"url":954},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_as_a_service",[956,856],"multi-tenancy","\u002Fglossary#saas",{"slug":712,"term":959,"definition":960,"category":814,"aliases":961,"links":963,"related":966,"readMore":-1,"target":967,"hasArticle":600},"Server-Sent Events","Односторонний поток от сервера к клиенту поверх обычного HTTP-соединения. Проще, чем WebSocket, и достаточен там, где только серверу есть что сказать: прогресс операции, ответ AI, приходящий токен за токеном.",[962],"SSE",[964],{"kind":640,"url":965},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",[710,672],"\u002Fglossary#server-sent-events",{"slug":799,"term":969,"definition":970,"category":608,"aliases":971,"links":974,"related":979,"readMore":-1,"target":980,"hasArticle":600},"Skia","Открытая 2D-графическая библиотека Google, которая рисует Chrome, Android и — до появления Impeller — каждый кадр Flutter. Она умеет выводить не только на экран, но и в PDF: именно это делает «печать в PDF» в Chrome.",[972,973],"Skia Graphics Engine","skia-safe",[975,977],{"kind":613,"url":976},"https:\u002F\u002Fskia.org\u002F",{"kind":640,"url":978},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSkia_Graphics_Engine",[791],"\u002Fglossary#skia",{"slug":982,"term":983,"definition":984,"category":848,"aliases":985,"links":989,"related":990,"readMore":-1,"target":992,"hasArticle":600},"staff-augmentation","Staff augmentation","Модель найма, при которой инженеры внешнего партнёра входят в вашу команду и работают под вашим управлением — в вашем репозитории, ваших спринтах, вашем процессе, — а не сдают отдельный проект. Вы покупаете ресурс; код и контекст остаются у вас.",[986,987,988],"аутстаффинг","расширение команды","выделенные разработчики",[],[991,897],"total-cost-of-ownership","\u002Fglossary#staff-augmentation",{"slug":994,"term":995,"definition":996,"category":814,"aliases":997,"links":1001,"related":1004,"readMore":-1,"target":1006,"hasArticle":600},"tls","TLS","Слой шифрования под HTTPS. Он подтверждает, что сервер именно тот, о ком говорит его сертификат, согласует свежий ключ на сессию и шифрует всё дальнейшее — сеть между вами видит шифртекст и не может незаметно его изменить.",[998,999,1000],"SSL","HTTPS","Transport Layer Security",[1002],{"kind":640,"url":1003},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTransport_Layer_Security",[1005,811],"end-to-end-encryption","\u002Fglossary#tls",{"slug":897,"term":1008,"definition":1009,"category":848,"aliases":1010,"links":1013,"related":1016,"readMore":-1,"target":1017,"hasArticle":600},"Time to market","Время от решения строить продукт до момента, когда им пользуются настоящие люди. Большинство споров о стеке и объёме работ — на самом деле споры об этом числе: каждая сэкономленная неделя — это неделя выручки, обратной связи и позиции на рынке.",[1011,1012],"TTM","время выхода на рынок",[1014],{"kind":640,"url":1015},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTime_to_market",[845,991],"\u002Fglossary#time-to-market",{"slug":1019,"term":1020,"definition":1021,"category":814,"aliases":1022,"links":1024,"related":1029,"readMore":-1,"target":1031,"hasArticle":600},"webrtc","WebRTC","Браузерный и мобильный стандарт для передачи аудио, видео и данных напрямую между двумя устройствами; серверы участвуют только в том, чтобы их познакомить. На нём строят видеозвонок внутри приложения, когда не берут готовый SDK.",[1023],"Web Real-Time Communication",[1025,1027],{"kind":613,"url":1026},"https:\u002F\u002Fwebrtc.org\u002F",{"kind":640,"url":1028},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebRTC",[1030,710],"xmpp","\u002Fglossary#webrtc",{"slug":710,"term":1033,"definition":1034,"category":814,"aliases":1035,"links":1036,"related":1039,"readMore":-1,"target":1040,"hasArticle":600},"WebSocket","Протокол, который держит одно соединение между клиентом и сервером открытым, чтобы любая сторона могла отправить данные в любой момент, а не клиент спрашивал снова и снова. На нём работают живые котировки, чаты и статусы присутствия.",[],[1037],{"kind":640,"url":1038},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebSocket",[712,672],"\u002Fglossary#websocket",{"slug":856,"term":1042,"definition":1043,"category":848,"aliases":1044,"links":1047,"related":1050,"readMore":1051,"target":1051,"hasArticle":580},"White-label","Один продукт, выпускаемый под многими брендами. White-label платформа собирает каждому клиенту готовое к публикации приложение со своим названием, оформлением и контентом из общей кодовой базы, а не форкает проект под заказчика.",[1045,1046],"белый лейбл","мультитенантное приложение",[1048],{"kind":640,"url":1049},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWhite-label_product",[845],"\u002Fglossary\u002Fwhite-label",{"slug":1030,"term":1053,"definition":1054,"category":814,"aliases":1055,"links":1058,"related":1063,"readMore":-1,"target":1064,"hasArticle":600},"XMPP","Открытый федеративный протокол обмена сообщениями и давняя альтернатива тому, чтобы писать чат-бэкенд самому или арендовать чужой. Он покрывает статусы присутствия, индикаторы набора и передачу файлов, а зрелые клиентские библиотеки есть под любую платформу.",[1056,1057],"Jabber","Extensible Messaging and Presence Protocol",[1059,1061],{"kind":613,"url":1060},"https:\u002F\u002Fxmpp.org\u002F",{"kind":640,"url":1062},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FXMPP",[1019,710],"\u002Fglossary#xmpp",{"slug":1066,"term":1067,"definition":1068,"category":848,"aliases":1069,"links":1073,"related":1076,"readMore":-1,"target":1077,"hasArticle":600},"in-app-purchase","Встроенные покупки","Продажа цифровых товаров и подписок через биллинг Apple и Google, который оба стора требуют для цифрового контента и с которого берут комиссию. Сложность никогда не в самой покупке, а в её восстановлении на новом устройстве и в честном учёте прав доступа.",[1070,1071,1072],"in-app purchase","IAP","внутренние покупки",[1074],{"kind":625,"url":1075},"https:\u002F\u002Fdeveloper.apple.com\u002Fin-app-purchase\u002F",[887],"\u002Fglossary#in-app-purchase",{"slug":628,"term":1079,"definition":1080,"category":608,"aliases":1081,"links":1086,"related":1089,"readMore":1090,"target":1090,"hasArticle":580},"Диплинкинг","Ссылка, которая открывает конкретный экран внутри установленного приложения, а не его главную или веб-страницу. Отложенный диплинкинг переживает установку: нажатие, прошедшее через магазин приложений, всё равно приводит на нужный экран.",[1082,1083,1084,1085],"deep linking","отложенный диплинкинг","Universal Links","Android App Links",[1087],{"kind":640,"url":1088},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMobile_deep_linking",[619,629],"\u002Fglossary\u002Fdeep-linking",{"slug":211,"term":1092,"definition":1093,"category":664,"aliases":1094,"links":1098,"related":1101,"readMore":-1,"target":1102,"hasArticle":600},"Мультиархитектурный образ","Один тег образа, который разрешается в разные бинарники для каждой архитектуры процессора — обычно это пара linux\u002Famd64 и linux\u002Farm64, — так что один и тот же docker pull работает без изменений и на серверах Intel\u002FAMD, и на ноутбуках с Apple Silicon.",[1095,1096,1097],"мультиарх-сборка","multi-arch build","linux\u002Famd64 + linux\u002Farm64",[1099],{"kind":625,"url":1100},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fmulti-platform\u002F",[216],"\u002Fglossary#multi-arch-image",{"slug":956,"term":1104,"definition":1105,"category":664,"aliases":1106,"links":1109,"related":1112,"readMore":-1,"target":1114,"hasArticle":600},"Мультитенантность","Один развёрнутый бэкенд обслуживает много клиентов, и каждый видит только свои данные, конфигурацию и включённые функции, потому что контекст тенанта определяется для каждого запроса. Именно это делает линейку брендированных приложений одним продуктом, а не набором форков.",[956,1107,1108],"мультиарендность","тенант",[1110],{"kind":640,"url":1111},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",[856,1113],"feature-flags","\u002Fglossary#multi-tenancy",{"slug":643,"term":1116,"definition":1117,"category":664,"aliases":1118,"links":1122,"related":1125,"readMore":-1,"target":1126,"hasArticle":600},"Объектное хранилище","Хранилище, которое держит файл целиком под ключом, а не в дереве файловой системы, — Amazon S3 и множество сервисов, совместимых с его API. Дешёвое, практически безграничное, привычное место для сырых событий, бэкапов и медиа: пишется один раз, читается редко, хранится вечно.",[1119,1120,1121],"S3","S3-совместимое хранилище","блоб-хранилище",[1123],{"kind":640,"url":1124},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FObject_storage",[632],"\u002Fglossary#object-storage",{"slug":910,"term":1128,"definition":1129,"category":650,"aliases":1130,"links":1134,"related":1137,"readMore":-1,"target":1138,"hasArticle":600},"Ограничение частоты запросов","Предел на число запросов от одного клиента за заданный интервал. Именно он не даёт одному увлечённому пользователю, скраперу или боту потратить месячный бюджет платного API за вечер, и стоять он должен на вашей стороне интеграции.",[1131,1132,1133],"rate limiting","рейт-лимит","троттлинг",[1135],{"kind":640,"url":1136},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRate_limiting",[900],"\u002Fglossary#rate-limiting",{"slug":1140,"term":1141,"definition":1142,"category":608,"aliases":1143,"links":1146,"related":1149,"readMore":-1,"target":1150,"hasArticle":600},"platform-channels","Платформенные каналы","Мост, через который Flutter-приложение вызывает нативный код iOS и Android — Keychain и Keystore, биометрию, платёжные шторки, любой SDK без Dart-пакета. Работа рутинная, но настоящая, и первое место, где споткнётся инженер, не выходивший за пределы Dart.",[1144,1145],"platform channels","method channel",[1147],{"kind":625,"url":1148},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fplatform-channels",[76],"\u002Fglossary#platform-channels",{"slug":1152,"term":1153,"definition":1154,"category":814,"aliases":1155,"links":1158,"related":1161,"readMore":-1,"target":1162,"hasArticle":600},"post-quantum-cryptography","Постквантовая криптография","Алгоритмы шифрования, рассчитанные на устойчивость к будущему квантовому компьютеру; стандарты уже финализированы NIST. Мигрировать нужно до появления железа: трафик, записанный сегодня, расшифруют, когда такая машина появится.",[1156,1157],"PQC","постквантовое шифрование",[1159],{"kind":640,"url":1160},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPost-quantum_cryptography",[994,1005],"\u002Fglossary#post-quantum-cryptography",{"slug":1164,"term":1165,"definition":1166,"category":650,"aliases":1167,"links":1171,"related":1172,"readMore":-1,"target":1173,"hasArticle":600},"staged-rollout","Поэтапная раскатка","Релиз сначала на небольшой процент пользователей и расширение только тогда, когда доля сессий без падений держится. Плохая сборка, пойманная на десяти процентах, — испорченный вечер; она же на ста процентах — испорченная неделя.",[1168,1169,1170],"staged rollout","phased release","канареечный релиз",[],[1113,647],"\u002Fglossary#staged-rollout",{"slug":216,"term":1175,"definition":1176,"category":664,"aliases":1177,"links":1183,"related":1186,"readMore":-1,"target":1187,"hasArticle":600},"Реестр контейнеров","Хранилище образов контейнеров, адресуемых по имени и тегу, — Docker Hub, GitHub Container Registry или собственный реестр облачного провайдера. Публикация сборки в реестр превращает «у меня работает» в образ, который любой может скачать и запустить без изменений.",[1178,1179,1180,1181,1182],"реестр образов","Docker registry","GHCR","ghcr.io","container registry",[1184],{"kind":625,"url":1185},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpackages\u002Fworking-with-a-github-packages-registry\u002Fworking-with-the-container-registry",[184,211],"\u002Fglossary#container-registry",{"slug":776,"term":1189,"definition":1190,"category":664,"aliases":1191,"links":1194,"related":1197,"readMore":-1,"target":1198,"hasArticle":600},"Серверный рендеринг","Сборка страницы в готовый HTML на сервере, чтобы первый же ответ содержал контент, заголовки, метатеги и структурированные данные. Краулеры, превью ссылок и медленные устройства читают это, не выполняя JavaScript.",[1192,1193],"SSR","server-side rendering",[1195],{"kind":640,"url":1196},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-side_scripting",[766],"\u002Fglossary#server-side-rendering",{"slug":1005,"term":1200,"definition":1201,"category":664,"aliases":1202,"links":1206,"related":1209,"readMore":-1,"target":1210,"hasArticle":600},"Сквозное шифрование","Шифрование, которое накладывается на устройстве отправителя и снимается только на устройстве получателя, так что сервис, передающий сообщение, не может его прочитать — ни по решению суда, ни после взлома. Оно защищает содержимое, но никогда — метаданные.",[1203,1204,1205],"E2EE","end-to-end encryption","оконечное шифрование",[1207],{"kind":640,"url":1208},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEnd-to-end_encryption",[994,811],"\u002Fglossary#end-to-end-encryption",{"slug":991,"term":1212,"definition":1213,"category":848,"aliases":1214,"links":1217,"related":1220,"readMore":-1,"target":1221,"hasArticle":600},"Совокупная стоимость владения","Во что продукт обходится за всю жизнь, а не только на этапе разработки: поддержка, обновления, ежегодные миграции на новые ОС и правила сторов, вторая команда, чтобы две кодовые базы не расходились. Обычно больше сметы на разработку и почти никогда в неё не входит.",[1215,1216],"TCO","total cost of ownership",[1218],{"kind":640,"url":1219},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTotal_cost_of_ownership",[897],"\u002Fglossary#total-cost-of-ownership",{"slug":1223,"term":1224,"definition":1225,"category":664,"aliases":1226,"links":1230,"related":1233,"readMore":-1,"target":1234,"hasArticle":600},"state-management","Управление состоянием","То, как приложение решает, где живёт значение, кому позволено его менять и какие части экрана перерисовываются, когда оно меняется. Во Flutter выбор между Riverpod, BLoC и Provider — одно из первых архитектурных решений и одно из самых трудных для пересмотра.",[1227,1228,1229],"state management","BLoC","Riverpod",[1231],{"kind":625,"url":1232},"https:\u002F\u002Fdocs.flutter.dev\u002Fdata-and-backend\u002Fstate-mgmt\u002Foptions",[732],"\u002Fglossary#state-management",{"slug":1113,"term":1236,"definition":1237,"category":650,"aliases":1238,"links":1242,"related":1245,"readMore":-1,"target":1246,"hasArticle":600},"Фиче-флаги","Переключатели, которые включают и выключают функциональность из конфигурации, а не из релиза. Один бинарник ведёт себя по-разному для разных брендов, рынков и пользователей, а рискованную фичу можно погасить, не отправляя новую сборку на ревью.",[1239,1240,1241],"feature flags","фиче-флаги","feature toggle",[1243],{"kind":640,"url":1244},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFeature_toggle",[1164,856,956],"\u002Fglossary#feature-flags",{"slug":1248,"term":1249,"definition":1250,"category":664,"aliases":1251,"links":1255,"related":1258,"readMore":-1,"target":1259,"hasArticle":600},"floating-point","Числа с плавающей точкой","Двоичный формат IEEE 754, стоящий за double и float. Он не хранит 0.1 точно, поэтому 0.1 + 0.2 даёт 0.30000000000000004 — незаметно в графике и фатально в деньгах, которым место в целых минорных единицах или в decimal-типе.",[1252,1253,1254],"IEEE 754","double","плавающая запятая",[1256],{"kind":640,"url":1257},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIEEE_754",[],"\u002Fglossary#floating-point"]