Андрей Садулин

о разработке и не только

Искать по годам: 2024 | по тегам | смотреть избранное ⭐️ или сразу всё

Kiro — новая среда разработки c AI (программисты пока ещё нужны)

Участвую в бета-тестировании нового редактора от Amazon: Kiro. На данный момент он полностью бесплатен, и лимитов на использование ИИ-функций тоже, кстати, нет.

Концепция очень похожа на широко известный Cursor —  по сути, это VS Code с дополнительными плагинами, обеспечивающими интеграцию с LLM, в случае с Kiro — это модели Claude 3.7 и 4.0 от Anthropic. Умное автодополнение, окно с чатом в режиме агента, доступ ко всей кодовой базе проекта, загрузка файлов и документации из сети — всё это мы уже видели, и работает оно ожидаемо хорошо.

Основная фишка редактора — режим планирования работы AI в 3 шага: формирование требований, написание дизайна и создание упорядоченного списка задач с зависимостями между ними.

То есть, можно как обычно поставить задачу в общих чертах, и Kiro сам всё формализует, опишет user stories, нарисует структуру папок и файлов, сформирует модели и интерфейсы, и в конце даст возможность по шагам выполнять то, что он предложил, попутно корректируя его работу, если потребуется. Да, то же самое можно сделать и с помощью Cursor: так же попросить его сгенерировать документы с требованиями и планом их реализации, но Kiro специально делает ставку именно на этом подходе, максимально упрощая его и делая доступным для начинающего пользователя.

И это работает. Сам процесс взаимодействия с редактором и конечный результат меня, честно говоря, очень удивили (в хорошем смысле слова): я точно знал, что ожидать от ИИ на каждом этапе, а если вдруг он всё же начинал делать что-то странное, я легко поправлял его (чаще всего прямо там, в окне чата, но пару раз всё-таки пришлось лезть в код самому, благо написан он был хорошо).

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

Ubuntu на VMware Fusion

Попробовал поработать на виртуалке c Ubuntu 25.04, поднятой в VMware Fusion — пока что очень нравится. Хост машина у меня — MacBook на M1 Pro с 32 GB памяти, для гостевой я немного поправил базовые настройки: выделил ей 4 vCPU, 8 GB RAM, 40 GB HDD и ткнул опцию «Use full resolution for Retina display». Уже в Ubuntu выбрал разрешение экрана 4K и поднял масштабирование интерфейса до 200%. Супер. Работает быстро, визуально разве что скроллинг не такой плавный, как на Mac, ну и есть явно ощутимые задержки в выводе звука, например, с видео на YouTube. И пока почему-то не работает copy-paste ни в какую сторону даже после установки VMware Tools — пока не понятно, почему, попробую разобраться на досуге. В целом, с учетом того, что VMware Fusion официально распространяется бесплатно (хотя нынче всё-таки, видимо, придется регистрироваться на портале Broadcom — я раньше писал, что можно было скачать его напрямую по ссылке или с помощью Brew, но лавочку прикрыли), на текущий момент это неплохая замена платному Parallels, если вам не нужна бесшовная интеграция с MacOS.

Небольшое напоминание про SSL-сертификаты

На самом деле, здесь можно было бы просто оставить вот эту статью в качестве ликбеза, но если интересны детали, то кратко: на сайте суда Советского района г. Нижнего Новгорода, доступного по адресу https://sovetsky.nnov.sudrf.ru , установлен wildcard-сертификат с Common Name (CN) *.sudrf.ru и двумя Subject Alternative Name (SAN): sudrf.ru и *.sudrf.ru. Наверное, подразумевалось, что он будет применяться как для основного домена, так и для всех его поддоменов, но, к сожалению, это так не работает, потому что для субдоменов второго уровня и выше уже необходим Multi-Domain SSL Certificate (MDC), который обычно требует доп. проверку организации. В общем, надо чинить, а то пользователи теряются — сегодня как раз так и случилось.

29

Сегодня мне 29 лет. Захотелось поделиться тем, как прошел этот год, и немного подумать о том, как провести следующий.

Итак, за прошедшие 366 дней я:

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

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

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

  1. Дважды съездил в отпуск с девушкой: во Вьетнам и в Азербайджан. Во Вьетнаме жил в шикарном отеле, в номере с балконом и видом на море, без толп отдыхающих, без детей, аниматоров и дискотек по ночам. Попробовал свежий дуриан (тот самый фрукт с противоречивым ароматом), посетил местный аква- и зоопарк, много гулял по Нячангу, ездил в тур по стране на бывшем военном УАЗике, купался под водопадом, ел свежеприготовленных на костре креветок, прошел путь монаха внутри каменного дракона.

В Азербайджане мы были на свадьбе друга, но успели и погулять по старому Баку, и посетить музей Гейдара Алиева, и прекрасно поужинать в ресторане Аркадия Новикова, и даже пожить один день в прекрасном отеле на берегу Каспийского моря, несколько раз с удовольствием там же искупавшись.

  1. Избавился от вредных привычек. Больше не пью пиво вечером (иногда разве что безалкогольное), почти не употребляю мучного и сладкого (хотя, если честно, с последним пока ещё есть проблемы: мне очень нравится местный зефир), не курю.
  2. Пережил 2 землетрясения магнитудой в 5-6 баллов каждое.
  3. Сделал себе вот этот блог, где могу делиться своим опытом, мыслями и интересными находками без каких-либо функциональных ограничений социальных сетей.
  4. Немного катался на сноуборде, но под конец горнолыжного сезона, к сожалению, бросил — очень хотелось приобрести свой собственный комплект экипировки, и в процессе езды у меня редко получалось уверенно менять кант с переднего на задний, что закономерно приводило к падениям.
  5. Совсем не катался на мотоцикле — в предыдущих выездах сильно уставал от низкой посадки на KTM 350 Freeride, а Yamaha 450 была для меня слишком тяжелой и неповоротливой. Недавно появилась возможность взять в аренду новенькие Husqvarna 350 — надеюсь, на них будет комфортнее.
  6. Много занимался в спортзале. Тренировки стали для меня отличным способом избавиться от стресса, обрести уверенность в себе, стать сильнее и выносливее. На сегодняшний день я вежу 112 кг при росте 203 см, мой присед со штангой — 120 кг, жим от груди лежа на горизонтальной скамье — 90 кг, становая тяга — 120 кг (всё на 1 повторение). Очень доволен результатами, однако, определённо ещё есть, к чему стремиться. В двух упражнениях рубеж в 100 кг был преодолён как раз в прошлом году.
  7. Так и не получил водительское удостоверение, не купил машину и мотоцикл.
  8. Не доделал своё мобильное приложение, не прошел курс по 3D-моделированию.
  9. Не прочитал подаренную мне книжку, не прошел видеоигры, которые хотел, постоянно откладывал просмотр интересных мне фильмов.
  10. Мне отказали в визе в Италию и, соответственно, я не поехал в командировку.
  11. Оформил наконец-то военный билет.
  12. Посетил несколько летних open-air музыкальных фестивалей, концерт любимой группы, дегустацию вина и ужин от шеф-повара со звездой Мишлен в ресторане в горах.

Вот. Надеюсь, через год список будет длиннее, а писать я его буду не с горьким сожалением об окончательно прошедшей молодости, а с приятным предвкушением того, что принесет мне новая страница моей истории. И писать желательно где-нибудь, где подают «Секс на пляже».

Ну что, за работу?

Непопулярное мнение

После того, как в России заблокировали замедлили YouTube, я присмотрелся к его альтернативам, и обнаружил с удивлением, что на RUTUBE есть множество классных фильмов с отличным качеством картинки и звука, в том числе и зарубежные новинки 2023 и -24-х годов: «Индиана Джонс и Колесо Судьбы», «Головоломка 2», «Трансформеры — Восхождение Звероботов» (вот он, кстати, отвратительный!), «Наполеон» и др. Мой папа любит сериалы по вселенной «Звездных Войн» — пожалуйста: «Мандалорец», «Книга Бобы Фетта» — всё доступно.

Работает всё, кстати, довольно неторопливо, но видео «не тормозит». И рекомендации, конечно, так себе.

А вот чего я там не нашел — так это фильмов и сериалов, каким-либо образом аффилированных с Кинопоиском (например, «Беспринципные», или новый «Майор Гром: Игра»): Яндекс за авторские права может и спросить, в отличие от зарубежных дистрибьюторов 😁

Если не принимать во внимание этический и юридический аспекты такого «пиратства» , то в сухом остатке для конечного пользователя мы имеем большой плюс в отсутствии необходимости смотреть тот же самый контент на сомнительных сайтах с рекламой букмекеров и казино (уверен, вы хотя бы раз на такой точно заходили и понимаете, о чем я) или искать его на торрент-трекерах. Естественно, о полноценной замене YouTube речи не идет, но, как говорится, нет худа без добра.

Cloudflare: HTTPS и SSL

Итак, у вас есть домен, который вы перенесли в Cloudflare. Сразу же после его добавления и настройки на платформе к нему автоматически выдаются два SSL-сертификата: основной и запасной, с разными Certificate Authority — Let’s Encrypt, Sectigo, Google Trust Services. Время жизни сертификатов — 3 месяца, после — автопродление. Удобно.

Вот, как это выглядит:

Обратите внимание, что это Edge Certificates. Поскольку платформа по-умолчанию проксирует трафик на сайт через себя, эти «пограничные» сертификаты используются только на участке «пользователь — Cloudflare». Там же можно включить настройку «Always use HTTPS», и ожидаемо получить автоматические редиректы — но только всё на том же участке! Трафик от Cloudflare до сервера будет передаваться без шифрования!

Обновив страницу блога, я получил несколько ошибок в консоли вида «Mixed content: request has been blocked» — падали асинхронные запросы, инициированные где-то в JavaScript. Также не работало сохранение записей и некоторые редиректы — видимо, всё по той же причине 😭

Опытным путем я понял, что надо бы шифровать весь трафик E2E, а для этого нам понадобится Origin Certificate — как раз-таки тот, который отвечает за оставшийся путь от Cloudflare до сервера (в моем случае до Nginx).

Да, его действительно можно получить на 15 (!) лет

Нажав на кнопку «Create», мы получим, по сути, две строки: сам сертификат и приватный ключ для него. Для добавления их в Nginx Proxy Manager, я сохранил их как файлы и импортировал так, как показано на втором снимке в галерее ниже:

Отлично, осталось только подключить полное шифрование в Cloudflare...

...и протестировать, что получилось.

Добро пожаловать на новый домен: eviterno.online!

Обновление инфраструктуры

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

Начало

Кратко про архитектуру: «под капотом» здесь VPS c Ubuntu 22.04, веб-сервер и база данных запускаются в Docker-контейнерах, для их удобного администрирования я использую Portainer. Также здесь установлен Nginx Proxy Manager (тоже в контейнере), который перенаправляет трафик с www на основной домен, обеспечивает подключение по HTTPS, проверяет подлинность домена, и т. д. В качестве удобного интерфейса для конфигурации сервера и доступа к терминалу я выбрал Cockpit.

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

Подключаем Cloudflare

Zero Trust Tunnel позволяет связать субдомен и внутренний адрес на host-машине с установленным приложением-коннектором (его, кстати, тоже можно развернуть в контейнере). Не нужно открывать порты или отключать firewall, т. к. коннектор поднимает egress-соединение с облаком, и самое крутое — через панель управления Cloudflare можно также задать правила доступа к ресурсу и подключить дополнительный фактор аутентификации, например, отправку одноразового кода на почту или вход через Google-аккаунт.

То есть, можно буквально в два клика открыть доступ по HTTPS к localhost:9090 через private-service.my-site.com для тех, кто введет правильный email из whitelist’а и укажет верный код, отправленный в письме.

Красота! ❤️

Вот, как это выглядит в панели управления Cloudflare: на каждый «приватный» сервис я создал отдельный туннель. Обратите внимание на адреса — контейнер с коннектором cloudflared я добавил в bridge-сеть в Docker, которую создал вручную. Благодаря этому, во-первых, работает DNS, и можно обращаться к контейнерам по имени, а также легко можно получить доступ к host, указав Default Gateway.

Добавим policy с группой доступа по-умолчанию — у меня это «разрешить любому пользователю с email из списка получать одноразовый код на почту». Настраивать можно как угодно: работает фильтрация по странам, по IP-адресам, можно проверять токены и т. д.

Теперь при попытке обратиться к туннелю по public hostname, откроется форма авторизации. Выглядит она вот так, и её, кстати, можно настроить — добавить свой логотип, поменять цвет фона, написать какой-нибудь текст, добавить подсказки для входа.

На всякий случай повторюсь — если введенного адреса нет в whitelist, код просто не придет.

А ещё можно создать «приложения» и добавить их на главный экран — он называется App Launcher. Естественно, он тоже доступен только для авторизованных пользователей.

Отмечу, что работает это всё только с доменами, перенесенными в Cloudflare или изначально приобретенными у них. Мой был куплен в reg.ru, перенос занял минут 15, ничего сложного.

Сколько стоит?

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

P. S.

В Cloudflare можно автоматически добавить SSL-сертификат и настроить редиректы с HTTP на HTTPS — об этом читайте в следующей заметке.

Большое спасибо Михаилу Щербине за консультации.

Ранее Ctrl + ↓