Обновить
256K+
2042

Переводчик-фрилансер

164,8
Рейтинг
3 643
Подписчики
Отправить сообщение

Что я узнал, поместив GitHub Copilot за MITM‑прокси

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

За последнюю пару лет появилось множество приложений на основе ИИ и ИИ‑функций. Чем больше появляется таких приложений, тем любопытнее мне становится изучить их внутреннюю работу. Надеюсь, мне удастся узнать что‑то новое; по крайней мере, почерпну какие‑нибудь знания о разработке десктопных приложений.

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

Читать далее

Куда подевался старый веб? Мы прошли по 657 607 ссылкам, чтобы разобраться

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

В старой резервной копии базы данных 0.mk хранится 657 958 ссылок, созданных с 2009 по 2014 год, а также количество нажатий на них. В августе 2026 года мы восстановили 657 607 из этих записей в виде ссылок до 2015 года и прошли по каждой из них. Из 655 178 безопасных записей ссылок с возможностью перехода 76,7% больше не возвращало загружающуюся страницу.

Большинство из пользователей 0.mk находится в Македонии, поэтому это исследование не отражает картину для всего веба. Это большой архив того, чем в тот период делилось одно онлайн-сообщество, в том числе сборник местных новостей, фотохостингов, форумов и популярных на то время платформ.

Основанный в 2009 году 0.mk был любительским проектом команды из трёх человек. Мы работали над ним в свободное от работы время, обычно по несколько часов в день. Спустя семнадцать лет один из нас нашёл на диске резервную копию базы данных и решил вернуть её к жизни.

Читать далее

AirSense: самый умный самодельный очиститель воздуха

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

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

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

Эта система на основе Waveshare ESP32-S3 выполняет мониторинг концентрации пыли PM2.5, индекса качества воздуха (Air Quality Index, AQI), температуры, влажности и атмосферного давления при помощи специальных датчиков окружающей среды. Все собираемые данные отображаются локально на ЖК‑дисплее устройства; кроме того, к ним можно получить удалённый доступ при помощи Arduino IoT Cloud, что позволяет пользователям отслеживать состояние окружающей среды и управлять очистителем через смартфон.

Ядром AirSense служит HEPA‑фильтр Xiaomi Air Purifier 4 Lite, способный фильтровать до 99,97% частиц размером вплоть до 0,3 мкм, включая пыль, пыльцу, частицы дыма и другие распространённые загрязнители воздуха. Система оснащена мощным вытяжным вентилятором размером 150 мм, непрерывно пропускающим воздух через цилиндрический фильтр.

Чтобы проект выглядел как изготовленный профессионально, конструкцию всего корпуса я создал в Autodesk Fusion 360. Система объединяет в себе HEPA‑фильтр, вентилятор, датчики, дисплей и электронику.

Читать далее

Проектируем с нуля калькулятор на FPGA. Часть 10: Всё работает

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

← Девятая часть

В предыдущих постах мы подробно разбирали каждый слой: CPU, арифметику, скриптовый интерпретатор, оборудование. Вот, что окончательный отчёт о синтезе Quartus сообщает обо всех них: в готовой архитектуре используется 1593 логические ячейки из доступных в EP2C5 4608 (35% чипа) с 594 выделенными логическими регистрами и 17 блоками памяти M4K. Сам модуль CPU занимает 1173 из этих логических ячеек и 400 регистров. Остальная логика отдана периферии: драйверу ЖК‑дисплея (154 логические ячейки), сканеру клавиатуры (97), интерфейсу термопринтера (64), таймеру CTC (49) и аппаратному PRNG (20). 12 блоков памяти M4K занимает ROM микрокода (49152 бит: это полная программа калькулятора), 2 блока — ROM скриптинга (8192 бита), 1 — ROM BCD‑констант, 1 — таблица поиска для BCD‑умножения внутри CPU и 1 блок — ОЗУ. Меня это очень радует: полнофункциональный научный калькулятор уместился в 35% небольшой дешёвой FPGA.

Читать далее

wake up: демо в 16 байтах

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

В детстве я учился программированию на старом IBM PC с монохромным зелёным монитором, поэтому давно хотел создать программу для этой системы. За последние пятнадцать лет я написал более чем сотню небольших интро. В последнее время я был не так активен, но потрясающее интро «Rainbow Surf» автора Plex размером всего 16 байт мотивировало меня снова вернуться к старым наброскам и взяться за работу.

Создание этой программы сопровождалось привычными экспериментами. Я развлекался с клеточными автоматами в графике и звуке, а также исследовал трюки sizecoding. В частности: а) полиморфные ассемблерные команды (наподобие add [bx+si],al, имеющую машинный код 0x0000) б) переход в середины команд для экономии байт и многократного использования опкодов. Из сотен мелких экспериментов мне приглянулся один, интересный одним только своим названием.

Когда я дополнял всё это и избавился от лишнего, мне трудно было понять, что же происходит. Я чесал в затылке, глядя на простую формулу, оставшуюся после удаления код‑гольфингом кучи байт. Я и сам не ожидал, что объяснение этих считанных байт окажется настолько глубоким.

В моём интро «M8trix» 2014 года по экрану уже бегали псевдослучайные буквы (в 8 байтах, а потом и в 7), но мне всегда было интересно, как добавить к ним красивый звук. Но хронологически в разработке «wakeup» я сначала занимался звуком. Хорошим подзаголовком к статье мог бы быть «16 байт, превращающие звук треугольника Серпинского в дождь символов из „Матрицы“».

Примечание: на каждом такте времени новая строка треугольника Серпинского а) воспроизводится через динамик б) отрисовывается на экране с шагом 56. Можно ощутить движение, но не увидеть его, потому что оно имеет «ширину» 8192 пикселей, но одна строка символов состоит всего из 80 байт. Если бы экран был гораздо больше, то можно было бы увидеть треугольник. Или если не пропускать пиксели и рисовать и все одновременно, он тоже был бы виден.

Читать далее

RGB‑значения нужно нормализовать делением на 255 или на 256?

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

Допустим, вы пишете программу для обработки изображений. Программа получает изображение, преобразует его в значения с плавающей запятой, выполняет обработку и сохраняет изменённые пиксели на диск в виде 8-битных цветов. Сегодня я хочу рассмотреть вопрос преобразования целых значений в значения с плавающей запятой. Существует два решения, которые на Python и NumPy выглядят так:

Стандартное деление на 255

pixels = img / 255.0
result = process(pixels)
output = np.trunc(result * 255 + 0.5)

Альтернативное деление на 256

pixels = (img + 0.5) / 256.0
result = process(pixels)
output = np.trunc(result * 256)

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

# Ограничение и преобразование в 8 бит
output_8bit = output.clip(0, 255).astype(np.uint8)

В стандартном случае целочисленный 0 соответствует 0.0, а 255 соответствует 1.0. Это работает абсолютно нормально и именно так всё реализовано в GPU. В альтернативном случае прибавляется смещение на 0,5 и деление происходит на 256, поэтому целочисленный 0 соответствует 0.5/256=0.001953125. Это неудобно, потому что код обработки изображений, например, без знания константы не сможет обнаруживать чёрные пиксели. Из‑за этого мы привязываем логику к 8-битным значениям, даже если вычисления выполняются с плавающей запятой. В стандартном решении всегда можно предполагать, что чёрный соответствует 0.0.

Однако некоторых программистов всё равно притягивает альтернативное решение. В чём дело? Чем оно им так нравится?

Читать далее

99% трафика моего веб‑сайта составляют боты

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

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

Конечно, я шучу. Мне даже неизвестно, читают ли веб‑краулеры посты, чтобы узнавать такую информацию.

Но я целый год занимался борьбой с ботами в своей базе данных филантропов PatronView. Когда пишешь код при помощи ИИ‑агентов, такому никто не научит, поэтому я решил поделиться полученными знаниями.

Вот некоторые факты, о которых ниже будет рассказано подробнее:

 ● Всего за один день к моему сайту обратились 3,6 миллиона запросов китайских ботов.

 ● Cloudflare сообщает, что краулеры Anthropic выполняют примерно три тысячи операций краулинга на однго приведённого посетителя. У меня этот показатель составил 35 тысяч:1.

 ● Два дня назад я заблокировал поисковый ИИ‑краулер Amazon. Он считывал по 117 тысяч страниц в день, но не направил мне ни одного посетителя.

 ● Показатель решения моей CAPTCHA равен 0,24%. Боты даже не пытаются её решать.

 ● В конце перечислены все используемые мной правила файрволла.

Читать далее

Объяснение диэдральных подгрупп на примере Factorio

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

Диэдральная группа — это математическое обозначение всех поворотов и отражений правильного многоугольника. Для n‑стороннего многоугольника всегда существует n возможных поворотов и n отражений, что даёт нам 2n возможных симметрий.

Сочетание любых двух симметрий даёт нам элемент из той же группы, и это превращает её в группу в математическом смысле.

Теория групп полезна при разработке игр. Я вспомнил об этом, прочитав девлог Factorio, в котором разработчик рассказал о проблемах, возникших из‑за того, что изначально он забыл учесть все случаи.

Читать далее

Руководство, считающее, что ИИ заменит персонал — это фиговое руководство

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

За последние три месяца я сталкивался с четырьмя случаями сумасшествия CEO из-за искусственного интеллекта. Поразительным для меня было сходство всех этих случаев: всей команде рассылалось электронное письмо, в котором CEO рассказывал о великолепии LLM-инструментов и об обязанности всех сотрудников немедленно учиться их использованию; в противном случае им придётся искать другую работу. Иногда они говорят о найме «консультантов», которые будут учить команду правильно пользоваться инструментами. Иногда они создают «график консультаций» или устраивают «внутрикорпоративные ИИ-хакатоны».

Но в каждом случае смысл примерно один и тот же: «охренеть, как же крут ИИ, вы должны теперь постоянно использовать его в работе». В самом тяжёлом случае несколько компаний даже таблицу рейтинга траты токенов — наверно, это самый тупой способ мотивации к правильному использованию LLM. При правильной работе с ИИ в том числе нужно обучаться видеть в токенах дефицитный ресурс. Смехотворно считать мерой качества простой подсчёт того, насколько активно сотрудник сжигает токены, ведь контрпродуктивно тратить их невероятно легко.

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

Никто из тех, кого заставляют работать с этими инструментами, не научится пользоваться ими качественно.

Читать далее

Проектируем с нуля калькулятор на FPGA. Часть 9: погоня за последним разрядом

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

← Восьмая часть

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

Но «большинство» это не «все», а «примерно 12» — это не 15-16 разрядов, которые может и должна обеспечивать 16-разрядная BCD-машина. Существовали пограничные случаи, в которых результаты оказывались совершенно неверными. Имелись итеративные алгоритмы с точностью приемлемой, но не такой, какой она могла быть. Кроме того, в процессе тестирования я обнаружил ошибки, при отладке которых обнаружились фундаментальные баги в коде прототипа на C++. Это привело меня в смятение, ведь для их устранения мне бы пришлось переделать заново код прототипа. В конечном итоге, так я и поступил. Старый код я оставил в репозитории (Pathfinding/Methods) и с нуля разработал совершенно новую версию (Pathfinding/Proof). Я пообещал себе, что занимаюсь этим последний раз в жизни, поэтому стремился делать всё идеально.

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

Читать далее

Рисуем ASCII-арт в Vim

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

Мне нравится создавать ASCII-арт в Vim. Я не пользуюсь никакими плагинами: в Vim уже есть множество встроенных фич, очень полезных при рисовании ASCII!

Эта статья предназначена для тех, кто уже занимался ASCII-артом и хочет исследовать новые инструменты. А если вы никогда не пробовали создавать ASCII-арт, то рекомендую не читать эту статью! Вам не нужна вся эта информация для создания текстовой графики. Просто откройте любимый текстовый редактор и начинайте писать. А если не знаете, с чего начать, то изучайте работы мастеров и практикуйтесь. И уже после этого, если вам всё ещё будет интересно, возвращайтесь и прочитайте статью.

Vim — редактор не для всех. Я пользуюсь им просто потому, что знаю его. Если вы тоже прокляты этим знанием, то продолжайте чтение!

Рекомендую сначала освоить основы (например, открытие файла, переключение между режимами, сохранение и выход). Если вы новичок в Vim, то можете обучиться основам при помощи vimtutor!

Читать далее

Загадочный комментарий в древней игре на BASIC

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

Давайте исследуем замок волшебника (точнее, его исходный код)!

10 REM"_(C2SLFF4

Это первая строка написанной на BASIC игры 80-х годов The Wizard's Castle, которую изначально создавали для платформы Exidy Sorcerer.

Она представляет собой REMарку, комментарий языка. 10 — это номер строки.

Но интересна здесь строка "_(C2SLFF4. Опечатка или мусор? Нет. Точно в таком же виде она встречается в исходном коде, опубликованном в выпуске журнала Recreational Computing за июль 1980 года .

Что это за чертовщина?

Читать далее

Проектируем с нуля калькулятор на FPGA. Часть 8: От платы разработки до реального устройства

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

← Седьмая часть

В предыдущем посте я писал о микрокоде и слое скриптинга. На этом этапе калькулятор почти полностью существовал только в ПО: в виде десктопного Qt-приложения, выполняющего симуляцию, или в виде страницы с WebAssembly в браузере. Это удобная среда для разработки и демонстрации, но это не калькулятор. Калькулятор должен лежать на столе, его можно взять и постучать по кнопкам.

Сегодня мы поговорим об этом этапе (за исключением издевательств над кнопками).

Читать далее

Запуск DOOM на собственном CPU

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

Doom — это выпущенная в 1993 году видеоигра, которую разработала id Software. Она совершила революцию в гейминге и стала определяющей для современных шутеров от первого лица. Благодаря её популярности возникла поговорка «Doom можно запустить на чём угодно». Чтобы доказать это, Doom портировали почти на все платформы, от микроконтроллеров до тостеров и даже бактерий.

Две недели назад мы успешно запустили Doom (тормозной) на созданном с нуля CPU (а потом опубликовали об этом видео, получившее несколько миллионов просмотров). Честно говоря, мне до сих пор в это не верится. Но что же мы создали на самом деле? Спроектировали собственный CPU на уровне логических вентилей, подключили его к периферии, адаптировали исходный код DOOM для запуска на этой машине и развернули всё это на FPGA для исполнения в реальном времени. До запуска Doom мы писали только простые программы, например, Pong и множества Мандельброта. Теперь мы можем запускать завершённые опубликованные игры, но путь к этому был довольно непростым.

Читать далее

Кража памяти: как я заставил Claude рассказать личные секреты пользователя

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

Посмотрите на эту беседу с Claude. Заметили что-нибудь подозрительное?

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

$ bun dev

Exfiltrating data...

Name: Ayush Paul

Company: Beem

Hometown: Charlotte, NC

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

Учтя всё это, я решил присмотреться к Claude, и в частности к основному повседневному помощнику (claude.ai, не Claude Code). Claude имеет функциональную, но наивную систему памяти из двух частей. Первая — это генерация сводки за день: недавние беседы кратко излагаются в нескольких параграфах о пользователе и вставляются в каждую беседу, чтобы Claude не приходилось каждый раз начинать с нуля. Вторая — это инструмент извлечения conversation_search, позволяющий по запросу выполняют поиск по всей истории бесед.

Там хранится невероятно ценная информация. Сама система памяти безопасна; вопрос заключается в том, что происходит, когда мы связываем её с агентом, способным ходить по вебу.

Читать далее

Новый взгляд на дилемму заключённого: может ли сотрудничество победить?

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

Лучше сотрудничать или обманывать?

Этот вопрос лежит в основе так называемой дилеммы заключённого, одной из самых известных идей в теории игр. Предположим, есть двое подозреваемых, задержанных за одно и то же преступление; их разделили и предложили сделку со следствием. Они могут или «сотрудничать», не выдав напарника, или «обмануть», предав его и согласившись на сделку. Если оба из них будут молчать, то оба получат короткие сроки. Если один промолчит, а другой его сдаст, то один получит максимальный срок, а второй выйдет на свободу. Но часто бывает так, что обманет и тот, и другой. Опасаясь предательства, каждый подозреваемый действует в собственных интересах, соглашается на сделку и потом долгие годы сидит в тюрьме. (Такой исход называется равновесием Нэша в честь Нобелевского лауреата, математика Джона Нэша.)

Дилемму заключённого уже давно используют для понимания множества различных процессов, от взаимодействия конкурирующих микробов в чашке Петри до поведения человеческих обществ, стремящихся развязать ядерную войну.  Эта модель всегда озадачивала учёных: сотрудничество необходимо для выживания биологической жизни, но как оно может возникнуть, если обман всегда обеспечивает наибольший выигрыш?

Читать далее

Doom работает везде, даже на Neo Geo

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

Примерно месяц назад мы сняли видео [а на Хабре опубликовали его перевод] о сложности реализации игры наподобие Doom на консоли Neo Geo. Причина заключается в том, что у Neo Geo нет концепции буфера кадров, то есть всё, что мы видим на экране Neo Geo, рендерится, как спрайт. Также в этом видео я рассуждал о концепции движка рейкастинга, который вполне неплохо работал на Neo Geo. Придуманная мной концепция, по сути, заключалась в создании плоской сетки блоков и испускании одного луча на каждый вертикальный столбец. Разработчик Sabino даже предпринял любопытную попытку создать на этом движке игру в стиле Doom.

Но, разумеется, рейкастер и движок уровня Doom — это далеко не одно и то же. Рейкастер может работать только с сеткой, то есть с квадратными блоками, а значит, все объекты на карте должны иметь одинаковую высоту, а стены находиться под прямыми углами. Doom же устроен сложнее: в нём есть стены, располагающиеся под любыми углами, помещения с разной высотой полов, лестницы, лифты и двери. Ничто подобное невозможно реализовать в простой игре с рейкастингом. Даже в проекте Sabino поворот за угол выглядит не особо естественно. В конечном итоге, мы имеем дело с сеткой из квадратных блоков, поэтому в таком движке с рейкастингом невозможно реализовать что-то наподобие уровня E1M1, The Hangar.

Однако у этой саги «Doom на Neo Geo» недавно появилось несколько продолжений, и я в восторге от того, куда всё это может привести. Как я упоминал в последующем видео, люди действительно серьёзно принялись за решение этой задачи. У нас появились новые подходы к реализации Doom на Neo Geo.

Читать далее

Проектируем с нуля калькулятор на FPGA. Часть 7: микрокод для самодельного CPU

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

← Шестая часть

В предыдущем посте мы спроектировали CPU. Я определился с набором команд, написал ассемблер, проверил каждый опкод и создал процессор, работающий в кремнии (или, точнее, в FPGA Altera Cyclone II EP2C5T144C8, что тоже довольно близко). Но у нас пока нет осмысленного ПО (микрокода калькулятора) для запуска на «железе».

В этой части проекта оправдали себя все эксперименты с прототипами на C++, описанные в частях 2 и 3.

Когда я начал писать addsub.asm (самую первую команду, которую я портировал), то не смотрел на пустую страницу, задаваясь вопросом, как работает BCD-сложение. У меня уже имелась эталонная реализация на C++ (addsub.cpp в проекте Proto), верифицированная на тысячах тестовых векторов. Алгоритм был известен, пограничные случаи найдены и охарактеризованы. Я проработал поведение защитного разряда и бита фиксации. Оставалось лишь транслировать это всё на язык ассемблера; задача всё равно сложная, но совершенно иного уровня сложности, нежели изобретение алгоритма в процессе его написания.

Я хотел бы сделать упор на этот двухэтапный процесс, потому что может показаться, что без него можно обойтись. Написание кода прототипа на C++ с последующей ручной трансляцией на язык ассемблера кажется избыточной и долгой работой. Однако она перестанет казаться избыточной к моменту, когда вы будете отлаживать неочевидный пограничный случай округления в 16-ниббловом BCD-вычитании. Наличие золотого эталона, с которым можно выполнять сравнения, не избыточно: это единственное, что стоит между вами и неделями кропотливого труда или даже провалом проекта.

Читать далее

Всё о компьютерах в фильме «Парк юрского периода»

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

Рассказав недавно историю про «Парк юрского периода», я захотел пересмотреть этот фильм снова. Наверно, я уже видел его раз десять. На этот раз я решил изучить все компьютеры и ПО из этого фильма.

Читать далее

Просто дайте мне ввести цифры

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

Цифровая идентификация и её значение для веба в последние годы стали темой горячих обсуждений. Они привнесли с собой множество спорных моментов: законы о проверке возраста и их влияние на онлайн-анонимность; Википедия потенциально будет вынуждена верифицировать в Великобритании личность пользователей; привязка к официальным операционным системам iOS и Android стала обязательным форм-фактором для кошельков цифровой идентификации; кроме того, стоит упомянуть ситуацию, когда американские цифровые аккаунты были закрыты потому, что их пользователь был судьёй Международного уголовного суда.

В своей истории я расскажу о швейцарской правительственной системе идентификации AGOV. Этот развёрнутый в 2024 году сервис сегодня насчитывает 1,6 миллиона аккаунтов и становится всё более необходимым: через него можно получать пособие по безработице, предоставлять налоговую декларацию (а это обязательное действие!) и выполнять множество других операций. В кантоне Цюрих это единственная возможность подачи заявления на гражданство.

В конечном итоге, я был вынужден создать аккаунт AGOV. К сожалению, его регистрация была довольно сложной задачей, пока я не нашёл причины странного бага accessibility. Вдохновившись статьёй «Просто дайте мне выделить текст», хочу представить вашему вниманию «Просто дайте мне ввести цифры».

Читать далее
1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Россия
Зарегистрирован
Активность