<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Петр Коробейников</title><link>https://petr-korobeinikov.com/ru/</link><description>Recent content on Петр Коробейников</description><generator>Hugo</generator><language>ru-RU</language><lastBuildDate>Fri, 15 Nov 2024 07:10:52 +0300</lastBuildDate><atom:link href="https://petr-korobeinikov.com/ru/index.xml" rel="self" type="application/rss+xml"/><item><title>9:41</title><link>https://petr-korobeinikov.com/ru/posts/9-41/</link><pubDate>Fri, 15 Nov 2024 07:10:52 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/9-41/</guid><description>&lt;p&gt;Допустим, вы готовите скриншоты для AppStore вручную, делая их на симуляторе. Было бы очень здорово, чтобы часы на них
показывали 9:41.&lt;/p&gt;</description></item><item><title>Showcase-проекты</title><link>https://petr-korobeinikov.com/ru/posts/showcase/</link><pubDate>Tue, 06 Aug 2024 22:08:38 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/showcase/</guid><description>&lt;p&gt;Вместо pet-проектов, которые у большинства из нас застывают в состоянии как на картинке&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, я практикую создание
showcase-проектов. Этот подход хорошо зарекомендовал себя и прижился (как мне кажется) в моей команде.&lt;/p&gt;</description></item><item><title>Then</title><link>https://petr-korobeinikov.com/ru/posts/then/</link><pubDate>Sun, 10 Mar 2024 19:40:15 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/then/</guid><description>&lt;p&gt;В &lt;code&gt;Kotlin&lt;/code&gt; есть &lt;code&gt;scope&lt;/code&gt;-функции&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; — функции, позволяющие запустить блок кода в контексте объекта.
В &lt;code&gt;Swift&lt;/code&gt; такого механизма нет, но его можно сделать самостоятельно или взять готовый.&lt;/p&gt;</description></item><item><title>RocketSim</title><link>https://petr-korobeinikov.com/ru/posts/rocketsim/</link><pubDate>Sun, 18 Feb 2024 16:20:57 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/rocketsim/</guid><description>&lt;p&gt;&lt;code&gt;RocketSim&lt;/code&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; — очень мощное дополнение к симулятору &lt;code&gt;iOS&lt;/code&gt;. Но доступен он по платной подписке. Давайте
разберемся, кому
этот инструмент нужен, а кто может обойтись без него.&lt;/p&gt;</description></item><item><title>Генерация проектов Xcode</title><link>https://petr-korobeinikov.com/ru/posts/xcode-project-generation/</link><pubDate>Fri, 12 Jan 2024 12:15:15 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/xcode-project-generation/</guid><description>&lt;p&gt;&lt;code&gt;Xcode&lt;/code&gt; очень чувствителен к служебным файлам проекта, хранящимся в каталогах &lt;code&gt;.xcworkspace&lt;/code&gt;
и &lt;code&gt;.xcodeproj&lt;/code&gt;. Для индивидуального разработчика, работающего на одной машине, это не является особой проблемой. Но я
ещё раз напомню — мы говорим о работе в команде. Именно поэтому нам важно добиться прозрачной переносимости проекта и
воспроизводимости сборки на всех машинах разработчиков и узлах &lt;code&gt;CI&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Service Template</title><link>https://petr-korobeinikov.com/ru/posts/service-template/</link><pubDate>Mon, 08 Jan 2024 07:24:57 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/service-template/</guid><description>&lt;p&gt;Даже среди сильных инженеров часто можно услышать такое мнение:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ну, микросервисы, это когда каждый сам ковыряется как хочет,
выбирает что хочет и как-то там решает проблемы.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;К большому сожалению, это частое заблуждение.
Давайте обсудим, какие преимущества даёт применение
паттерна &lt;code&gt;Service Template&lt;/code&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; на уровне всей компании.&lt;/p&gt;</description></item><item><title>Установка Xcode</title><link>https://petr-korobeinikov.com/ru/posts/xcode-install/</link><pubDate>Sat, 06 Jan 2024 13:47:52 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/xcode-install/</guid><description>&lt;p&gt;Первый шаг на пути к созданию приложений — установка среды разработки.
В самом начале многие спешат установить &lt;code&gt;Xcode&lt;/code&gt; из &lt;code&gt;AppStore&lt;/code&gt;, и для индивидуальной разработки своего первого приложения
это вполне допустимо.
Но мы с вами фокусируемся на командной разработке, поэтому нам потребуется соблюдать некоторые соглашения и правила.&lt;/p&gt;</description></item><item><title>Вместо вступления</title><link>https://petr-korobeinikov.com/ru/posts/intro/</link><pubDate>Thu, 04 Jan 2024 05:35:43 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/intro/</guid><description>&lt;p&gt;Примерно 10 лет назад я передавал дела своим коллегам, когда Крейг Федериги на &lt;code&gt;WWDC 2014&lt;/code&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; анонсировал новый
язык программирования — &lt;code&gt;Swift&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Инженерная зрелость</title><link>https://petr-korobeinikov.com/ru/posts/engineering-maturity/</link><pubDate>Fri, 22 Dec 2023 20:35:38 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/engineering-maturity/</guid><description>&lt;p&gt;Инженерная зрелость — это показатель высокого уровня подготовки, глубины опыта и широты кругозора.&lt;/p&gt;
&lt;p&gt;Мои коллеги, работавшие и работающие со мной, знают, что для характеристики уровня инженерной зрелости я использую три
термина:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Единообразие&lt;/li&gt;
&lt;li&gt;Системность&lt;/li&gt;
&lt;li&gt;Воспроизводимость&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Давайте обсудим, какой смысл я вкладываю в каждый из них. Я приведу примеры из моей предметной области и буду рад вашим
в комментариях.&lt;/p&gt;</description></item><item><title>traefik</title><link>https://petr-korobeinikov.com/ru/posts/traefik/</link><pubDate>Mon, 18 Dec 2023 21:21:43 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/traefik/</guid><description>&lt;p&gt;Данная заметка является ответом на комментарий одного из моих подписчиков, который предложил тему следующего поста:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip; как настроить докер чтобы LB сразу в нужные контейнеры роутил&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Как я вижу поставленную задачу?&lt;/p&gt;</description></item><item><title>mkcert</title><link>https://petr-korobeinikov.com/ru/posts/mkcert/</link><pubDate>Thu, 14 Dec 2023 14:01:22 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/mkcert/</guid><description>&lt;p&gt;При разработке в локальном окружении многие пренебрегают имитацией &lt;code&gt;https&lt;/code&gt; и запускают свои сервисы по &lt;code&gt;http&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Задача состоит в следующем:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Сервить траффик на локальной машине по &lt;code&gt;https&lt;/code&gt; с валидным сертификатом;&lt;/li&gt;
&lt;li&gt;Сделать так, чтобы это легко воспроизводилось не только у вас, но и у всех членов вашей команды.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>dnsmasq</title><link>https://petr-korobeinikov.com/ru/posts/dnsmasq/</link><pubDate>Tue, 14 Nov 2023 11:11:23 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/dnsmasq/</guid><description>&lt;p&gt;Когда-то многие из нас занимались разработкой сайтов, и, чтобы локально разрабатывать и тестировать очередной проект,
добавляли в &lt;code&gt;/etc/hosts&lt;/code&gt; ещё одну запись примерно такого вида:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-hosts" data-lang="hosts"&gt;127.0.0.1 next-project.tld
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>http.DefaultClient</title><link>https://petr-korobeinikov.com/ru/posts/go-http-defaultclient/</link><pubDate>Sat, 21 Oct 2023 11:04:54 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/go-http-defaultclient/</guid><description>&lt;p&gt;&amp;ldquo;1024 плети тому, кто использует &lt;code&gt;http.DefaultClient&lt;/code&gt; в своём коде&amp;rdquo; — такая &amp;ldquo;шутка&amp;rdquo; звучит на наших стендапах. Проблема
заключается в отсутствии таймаутов в настройках по умолчанию. На эту тему есть отличная статья в
блоге &lt;code&gt;Cloudflare&lt;/code&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description></item><item><title>uber/fx + gRPC</title><link>https://petr-korobeinikov.com/ru/posts/go-uber-fx-grpc-showcase/</link><pubDate>Fri, 13 Oct 2023 09:33:55 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/go-uber-fx-grpc-showcase/</guid><description>&lt;p&gt;В своих решениях я использую &lt;code&gt;IoC&lt;/code&gt;-контейнер &lt;code&gt;fx&lt;/code&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; от &lt;code&gt;Uber&lt;/code&gt;. Существуют разные лагери сторонников и противников
подобных решений, но мы сконцентрируемся именно на теме применения &lt;code&gt;fx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Если вы не знакомы с основами применения, я рекомендую выполнить официальный &lt;code&gt;Quick Start&lt;/code&gt;&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;. Он поможет
начать ориентироваться в решении.&lt;/p&gt;</description></item><item><title>Gitlab Subgroup + go get</title><link>https://petr-korobeinikov.com/ru/posts/gitlab-subgroup-go-get/</link><pubDate>Fri, 06 Oct 2023 20:37:55 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/gitlab-subgroup-go-get/</guid><description>&lt;p&gt;Дано:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gitlab&lt;/code&gt;, скорее всего, развернутый во внутреннем контуре;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;перфекционизм&amp;rdquo;, требующий раскладывать всё &amp;ldquo;по папочкам&amp;rdquo;, или требование свыше;&lt;/li&gt;
&lt;li&gt;внутренний пакет на &lt;code&gt;Go&lt;/code&gt;, который необходимо устанавливать как зависимость.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Jetbrains Space + go get</title><link>https://petr-korobeinikov.com/ru/posts/jetbrains-space-go-get/</link><pubDate>Wed, 04 Oct 2023 20:06:21 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/jetbrains-space-go-get/</guid><description>&lt;p&gt;Дано:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы используете &lt;code&gt;Jetbrains Space&lt;/code&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;Вы пишите код на &lt;code&gt;Go&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Вам необходимо создать общую библиотеку и подключать её как модуль в ваших внутренних проектах.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>lima, colima, M1</title><link>https://petr-korobeinikov.com/ru/posts/lima-colima-m1/</link><pubDate>Fri, 22 Sep 2023 16:44:05 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/lima-colima-m1/</guid><description>&lt;p&gt;По той или иной причине вы перешли с &lt;code&gt;Docker Desktop&lt;/code&gt; на &lt;code&gt;lima&lt;/code&gt; или &lt;code&gt;colima&lt;/code&gt; и у вас макбук на &lt;code&gt;M1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;По умолчанию &lt;code&gt;lima&lt;/code&gt; и &lt;code&gt;colima&lt;/code&gt; используют под капотом &lt;code&gt;qemu&lt;/code&gt;. Чтобы получить ускорение в 1.5-2 раза &lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, вам
необходимо запускать машину с опциями виртуализации, заменяющими &lt;code&gt;qemu&lt;/code&gt; на &lt;code&gt;Virtualization.Framework&lt;/code&gt;&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description></item><item><title>oasdiff</title><link>https://petr-korobeinikov.com/ru/posts/oasdiff/</link><pubDate>Thu, 21 Sep 2023 19:43:36 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/oasdiff/</guid><description>&lt;p&gt;Дано:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Две версии одного приложения: A и B.&lt;/li&gt;
&lt;li&gt;Обе версии предоставляют контракт, описанный с помощью &lt;code&gt;OpenAPI&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;У приложения есть пользователи, соблюдающие текущий контракт.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Задача:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Выяснить, имеются ли обратно несовместимые изменения в контракте новой версии.&lt;/li&gt;
&lt;li&gt;Выяснить, какие дополнительные изменения произошли в контракте.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Golang Test Summary</title><link>https://petr-korobeinikov.com/ru/posts/golang-test-summary/</link><pubDate>Tue, 19 Sep 2023 11:08:30 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/golang-test-summary/</guid><description>&lt;p&gt;Стандартные инструменты &lt;code&gt;Go&lt;/code&gt; не позволяет вывести сводную информацию по тестам. Но, когда у вас большой проект, и надо
понимать общую картину, такая информация бывает полезна. Допустим, вы обновляете ваш собственный форк до состояния
апстрима, и вам необходимо оценить объем проблем, вызванных слиянием изменений.&lt;/p&gt;</description></item><item><title>APFS Case Sensitive</title><link>https://petr-korobeinikov.com/ru/posts/apfs-case-sensitive/</link><pubDate>Sun, 17 Sep 2023 19:30:55 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/apfs-case-sensitive/</guid><description>&lt;p&gt;По умолчанию файловая система в &lt;code&gt;macOS&lt;/code&gt; регистронезависимая. Это значит, что &lt;code&gt;file.txt&lt;/code&gt; и &lt;code&gt;FILE.txt&lt;/code&gt; для неё одно и то
же. В некоторых, хоть и довольно редких ситуациях, при разработке и поддержке некоторых проектов может потребоваться
регистрозависимость. Переформатировать диск и переустанавливать ОС — долгое и неблагодарное занятие. Вот как я решил эту
проблему.&lt;/p&gt;</description></item><item><title>Postgres Table Naming</title><link>https://petr-korobeinikov.com/ru/posts/postgres-table-naming/</link><pubDate>Fri, 25 Aug 2023 22:15:55 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/postgres-table-naming/</guid><description>&lt;p&gt;Почему я предпочитаю именовать таблицы в &lt;code&gt;postgres&lt;/code&gt; в единственном числе?&lt;/p&gt;</description></item><item><title>/usr/bin/arch</title><link>https://petr-korobeinikov.com/ru/posts/usr-bin-arch/</link><pubDate>Sat, 12 Aug 2023 21:29:04 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/usr-bin-arch/</guid><description>&lt;p&gt;Многие из нас за последнее время стали обладателями маков на процессорах M1. Для поддержки приложений, написанных для
процессоров Intel есть Rosetta. В этой заметке я хочу подсветить расширенную утилиту &lt;code&gt;arch&lt;/code&gt;, которая на маках работает
чуть шире, чем &lt;code&gt;uname -m&lt;/code&gt;, и ситуации, в которых она может быть полезна.&lt;/p&gt;</description></item><item><title>Leetcode 2</title><link>https://petr-korobeinikov.com/ru/posts/leetcode-2/</link><pubDate>Tue, 08 Aug 2023 19:12:51 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/leetcode-2/</guid><description>&lt;p&gt;Leetcode предлагает три уровня сложности задач: Easy, Medium и Hard. Очевидно, что за решения задач более высоких
уровней сложности дают больше баллов рейтинга. Но сейчас нас интересует не рейтинг, а отношение к вашему профилю со
стороны компании, куда вы будете проходить интервью.&lt;/p&gt;</description></item><item><title>Leetcode 1</title><link>https://petr-korobeinikov.com/ru/posts/leetcode-1/</link><pubDate>Mon, 07 Aug 2023 19:04:14 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/leetcode-1/</guid><description>&lt;p&gt;Давайте обсудим цели, которые ставят перед собой разработчики, решая задачи на leetcode. Исходя из них определимся с
выбором языка программирования, на котором и будем решать эти задачи. На мой взгляд, существует, как минимум, три
варианта:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Повысить собственный уровень алгоритмической подготовки — самый очевидный;&lt;/li&gt;
&lt;li&gt;Опробовать подходы к обработке данных в конкретно взятом языке программирования;&lt;/li&gt;
&lt;li&gt;Гордиться циферкой рядом с фото профиля — &amp;ldquo;нагриндить&amp;rdquo; рейтинг и хвастаться коллегам.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Leetcode 0</title><link>https://petr-korobeinikov.com/ru/posts/leetcode-0/</link><pubDate>Sun, 06 Aug 2023 20:31:14 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/leetcode-0/</guid><description>&lt;p&gt;К алгоритмическим собеседованиям у многих разработчиков очень неоднозначное отношение. Кто-то считает секцию алгоритмов
обязательной, кто-то нет. Многие компании, несмотря на то, что для реальной работы и выполнения их задач намного важнее
знание и понимание принципов чистой архитектуры, паттернов проектирования, глубокое погружение в тот или иной фреймворк,
включают в свои интервью алгоритмическую секцию, часто с нетривиальными задачами, которые довольно сложно решать в
стрессовой ситуации и в условиях ограничения по времени.&lt;/p&gt;</description></item><item><title>pre-commit</title><link>https://petr-korobeinikov.com/ru/posts/pre-commit/</link><pubDate>Fri, 16 Jun 2023 20:44:53 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/pre-commit/</guid><description>&lt;p&gt;Я и моя команда столкнулись с проблемой, когда нарушения соглашений по Code Style стали выявляться достаточно поздно: в
CI или на Code Review. Общей настройки &lt;code&gt;.editorconfig&lt;/code&gt; нам было явно недостаточно, так как сам по себе &lt;code&gt;editorconfig&lt;/code&gt; не
может описать полностью все нюансы форматирования.&lt;/p&gt;</description></item><item><title>chezmoi</title><link>https://petr-korobeinikov.com/ru/posts/chezmoi/</link><pubDate>Wed, 14 Jun 2023 10:28:32 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/chezmoi/</guid><description>&lt;p&gt;Многие из нас используют в работе несколько компьютеров. И, конечно, используют если не одинаковые, то пересекающиеся
наборы приложений и инструментов, которые требуют одинаковой конфигурации на всех машинах:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim/nvim&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tmux&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;editorconfig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;karabiner&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zsh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;и другие.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Обычно, конфигурационные файлы называются дотфайлами (&lt;code&gt;dotfiles&lt;/code&gt;) — их имена начинаются с точки (&lt;code&gt;.&lt;/code&gt;), что в мире
unix-подобных систем делает файл скрытым.&lt;/p&gt;</description></item><item><title>gitlab</title><link>https://petr-korobeinikov.com/ru/posts/gitlab/</link><pubDate>Sun, 11 Jun 2023 11:03:26 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/gitlab/</guid><description>&lt;p&gt;Один из моих подписчиков подсветил проблему, что исходный код решений, которые мы реализуем на стримах не был доступен
публично. Признаться честно, я не думал, что он может быть кому-то полезен вне контекста стрима — мы показываем процесс
решения проблемы, трансформируя его в приемлемый результат. Оказалось, что моё мнение ошибочно, и исходники всё же
представляют интерес.&lt;/p&gt;</description></item><item><title>youtube</title><link>https://petr-korobeinikov.com/ru/posts/youtube/</link><pubDate>Sun, 04 Jun 2023 21:50:04 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/youtube/</guid><description>&lt;p&gt;С недавнего времени я перестал стесняться и осуществил свою давнюю задумку — запустил канал на youtube. Мне всегда
хотелось показывать и рассказывать о подходах к разработке без кликбейтных картинок и заголовков, говорить по делу и
передавать свой опыт другим людям.&lt;/p&gt;</description></item><item><title>sdkman + kotlin</title><link>https://petr-korobeinikov.com/ru/posts/sdkman-kotlin/</link><pubDate>Sun, 21 May 2023 19:56:06 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/sdkman-kotlin/</guid><description>&lt;p&gt;В скором времени мне потребуется расширить свой стек ещё одним языком программирования — &lt;code&gt;Kotlin&lt;/code&gt;. Меня не беспокоит
процесс погружения в синтаксис, это самое простое, что может быть. Как и всегда, во главу угла я ставлю вопрос о
простоте, скорости и воспроизводимости развёртывания, особенно локального окружения разработчика — в команде я буду
работать не один, и важно, чтобы версии компиляторов совпадали у моих коллег до миллибитов.&lt;/p&gt;</description></item><item><title>Имитация systemd в docker-контейнере и применение testinfra</title><link>https://petr-korobeinikov.com/ru/posts/docker-systemd-testinfra/</link><pubDate>Sun, 19 Mar 2023 12:25:24 +0400</pubDate><guid>https://petr-korobeinikov.com/ru/posts/docker-systemd-testinfra/</guid><description>&lt;p&gt;Наши команды активно используют &lt;code&gt;ansible&lt;/code&gt; для создания шаблонов и финальной
конфигурации виртуальных машин. Поэтому перед нами встаёт вопрос обеспечения
работоспособности и корректности сценариев развёртывания.&lt;/p&gt;
&lt;p&gt;В этой заметке будет рассказано об имитации &lt;code&gt;systemd&lt;/code&gt; внутри &lt;code&gt;docker&lt;/code&gt;-контейнера
и валидации финального результата с помощью фреймворка &lt;code&gt;testinfra&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Technical Breadth</title><link>https://petr-korobeinikov.com/ru/posts/technical-breadth/</link><pubDate>Sun, 20 Nov 2022 12:40:10 +0600</pubDate><guid>https://petr-korobeinikov.com/ru/posts/technical-breadth/</guid><description>&lt;p&gt;&lt;code&gt;Technical Breadth&lt;/code&gt; — определение, которое я впервые услышал в английском
варианте от архитектора Марка Ричардса (Mark Richards). Если грубо переводить
его на русский язык, оно означает &amp;ldquo;технический кругозор&amp;rdquo;. Аналогом этого
слова у дизайнеров является &amp;ldquo;насмотренность&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Что делать с этим понятием и как расширять свой технический кругозор?&lt;/p&gt;</description></item><item><title>Semantic Workspace</title><link>https://petr-korobeinikov.com/ru/posts/semantic-workspace/</link><pubDate>Sat, 19 Nov 2022 19:35:18 +0600</pubDate><guid>https://petr-korobeinikov.com/ru/posts/semantic-workspace/</guid><description>&lt;p&gt;&lt;code&gt;Semantic Workspace&lt;/code&gt; — это просто красивое название, которое я придумал полгода
назад для ряда простых принципов организации каталога с проектами на локальной
машине.&lt;/p&gt;</description></item><item><title>direnv</title><link>https://petr-korobeinikov.com/ru/posts/direnv/</link><pubDate>Sat, 12 Nov 2022 19:47:36 +0600</pubDate><guid>https://petr-korobeinikov.com/ru/posts/direnv/</guid><description>&lt;p&gt;Все наши сервисы полностью соответствуют 12 факторам. Но в этой заметке речь
пойдёт только об одном из них — конфигурации через переменные окружения, а
точнее про недооцененный инструмент &lt;code&gt;direnv&lt;/code&gt;, позволяющий автоматически
загружать переменные окружения при переходе в каталог с проектом.&lt;/p&gt;</description></item><item><title>Postgres Workqueue</title><link>https://petr-korobeinikov.com/ru/posts/postgres-workqueue/</link><pubDate>Sun, 30 Oct 2022 17:13:50 +0600</pubDate><guid>https://petr-korobeinikov.com/ru/posts/postgres-workqueue/</guid><description>&lt;p&gt;В этом посте речь пойдёт про организацию очереди отложенных задач в базе данных.
На практике выяснилось, что очень большое количество разработчиков эту идею
принимают с большим трудом, сразу же выражают обеспокоенность искусственно
созданной нагрузкой. С одной стороны, это грамотное замечание. С другой — это
тот барьер, через который надо научиться переступать, наблюдать за вашим
приложением и грамотно настраивать базу.&lt;/p&gt;</description></item><item><title>Containerized Tooling</title><link>https://petr-korobeinikov.com/ru/posts/containerized-tooling/</link><pubDate>Thu, 27 Oct 2022 23:13:39 +0600</pubDate><guid>https://petr-korobeinikov.com/ru/posts/containerized-tooling/</guid><description>&lt;p&gt;В своей работе мы постоянно используем различные инструменты: &lt;code&gt;protoc&lt;/code&gt;,
&lt;code&gt;golangci-lint&lt;/code&gt;, &lt;code&gt;allure&lt;/code&gt; и многие другие.&lt;/p&gt;
&lt;p&gt;Чтобы избежать ситуации, в которой версия или конфигурация инструмента у одного
разработчика отличается от того, что уже установлено у другого, или от того, что
настроено в &lt;code&gt;CI&lt;/code&gt;, наши инструменты &amp;ldquo;запечены&amp;rdquo; в контейнеры.&lt;/p&gt;</description></item><item><title>multipass-compose</title><link>https://petr-korobeinikov.com/ru/posts/multipass-compose/</link><pubDate>Tue, 25 Oct 2022 22:09:40 +0600</pubDate><guid>https://petr-korobeinikov.com/ru/posts/multipass-compose/</guid><description>&lt;p&gt;В данной заметке речь пойдёт о &amp;ldquo;настоящих&amp;rdquo; виртуальных машинах, и никак не про
контейнерную виртуализацию. Поэтому мысль вида &amp;ldquo;да всё ж можно в докер
запихнуть&amp;rdquo; тут немного неуместна.&lt;/p&gt;
&lt;p&gt;Строя облачные сервисы, мы в своей работе постоянно используем виртуальные
машины. В продакшине — гипервизоры первого типа, которые, говоря простым языком,
ставятся на &amp;ldquo;голое железо&amp;rdquo;; на своих локальных машинах — второго типа, это
привычные нам всем &lt;code&gt;VirtualBox&lt;/code&gt;, &lt;code&gt;qemu&lt;/code&gt; и, возможно, &lt;code&gt;Parallels Desktop&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Makefile ToC</title><link>https://petr-korobeinikov.com/ru/posts/makefile-toc/</link><pubDate>Sun, 23 Oct 2022 21:01:40 +0600</pubDate><guid>https://petr-korobeinikov.com/ru/posts/makefile-toc/</guid><description>&lt;p&gt;К большому сожалению, несмотря на наличие продвинутых систем сборок, нам всё ещё
приходится использовать утилиту &lt;code&gt;make&lt;/code&gt; и писать &lt;code&gt;Makefile&lt;/code&gt;-ы руками.&lt;/p&gt;
&lt;p&gt;Передо мной встала задача по составлению справки по целям сборки в
текущем &lt;code&gt;Makefile&lt;/code&gt; проекта. Из коробки древняя утилита не позволяет получить
список целей сборки и их описание, которого не предполагалось.&lt;/p&gt;</description></item><item><title>Semantic Line Breaks</title><link>https://petr-korobeinikov.com/ru/posts/sembr/</link><pubDate>Wed, 19 Oct 2022 16:01:57 +0600</pubDate><guid>https://petr-korobeinikov.com/ru/posts/sembr/</guid><description>&lt;p&gt;Вся техническая документация наших проектов пишется в формате &lt;code&gt;Markdown&lt;/code&gt;.
Это простой и удобный формат, который можно читать даже в сыром виде без
постобработки.&lt;/p&gt;</description></item><item><title>Собственная локальная инсталляция Sentry</title><link>https://petr-korobeinikov.com/ru/posts/getsentry-self-hosted/</link><pubDate>Sun, 11 Sep 2022 18:38:25 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/getsentry-self-hosted/</guid><description>&lt;p&gt;Мне часто приходится экспериментировать с настройками мониторинга, сбором ошибок
и метрик в различных окружениях.&lt;/p&gt;
&lt;p&gt;Чтобы не выделять отдельный проект в общем &lt;code&gt;Sentry&lt;/code&gt;, предпочитаю разворачивать
собственную локальную копию.&lt;/p&gt;
&lt;p&gt;Процесс развёртывания занимает некоторое время, для &amp;ldquo;старого&amp;rdquo; ноутбука,
процедура может занять минут десять.&lt;/p&gt;</description></item><item><title>adr-tools</title><link>https://petr-korobeinikov.com/ru/posts/adr-tools/</link><pubDate>Thu, 01 Sep 2022 16:57:37 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/adr-tools/</guid><description>&lt;p&gt;Многие команды для обсуждения и ведения &lt;code&gt;ADR&lt;/code&gt; используют инструменты, подобные
Confluence и
Wiki. Все мы прекрасно понимаем, что это подход &amp;ldquo;write once, read never&amp;rdquo;.&lt;/p&gt;</description></item><item><title>ADR</title><link>https://petr-korobeinikov.com/ru/posts/adr/</link><pubDate>Mon, 15 Aug 2022 23:46:45 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/adr/</guid><description>&lt;p&gt;&lt;code&gt;ADR&lt;/code&gt; — Architecture Decision Record.&lt;/p&gt;
&lt;p&gt;Часто сталкиваюсь с недооценкой использования &lt;code&gt;ADR&lt;/code&gt; в разных командах
разработки.&lt;/p&gt;</description></item><item><title>asdf</title><link>https://petr-korobeinikov.com/ru/posts/asdf/</link><pubDate>Sat, 13 Aug 2022 13:43:10 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/asdf/</guid><description>&lt;p&gt;&lt;code&gt;asdf&lt;/code&gt; — менеджер версий рантаймов.&lt;/p&gt;
&lt;p&gt;С его помощью можно заменить &lt;code&gt;nvm&lt;/code&gt;, &lt;code&gt;rbenv&lt;/code&gt; , &lt;code&gt;pyenv&lt;/code&gt;, &lt;code&gt;gvm&lt;/code&gt; и ещё массу
менеджеров версий одним общим.&lt;/p&gt;</description></item><item><title>jo</title><link>https://petr-korobeinikov.com/ru/posts/jo/</link><pubDate>Wed, 10 Aug 2022 14:23:16 +0300</pubDate><guid>https://petr-korobeinikov.com/ru/posts/jo/</guid><description>&lt;p&gt;&lt;code&gt;jo&lt;/code&gt; — конструктор &lt;code&gt;json&lt;/code&gt; для командной строки.&lt;/p&gt;
&lt;p&gt;Часто вижу, как коллеги в чатах перекидываются фрагментами запросов или
примерами вызовов &lt;code&gt;API&lt;/code&gt;, передавая &lt;code&gt;json&lt;/code&gt; в виде экранированных строк.&lt;/p&gt;</description></item><item><title>Политика конфиденциальности</title><link>https://petr-korobeinikov.com/ru/projects/apps/story-point-calculator/privacy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://petr-korobeinikov.com/ru/projects/apps/story-point-calculator/privacy/</guid><description>&lt;p&gt;Мы не собираем персональные данные.&lt;/p&gt;
&lt;p&gt;Собираются только метрики производительности.&lt;/p&gt;</description></item><item><title>Резюме</title><link>https://petr-korobeinikov.com/ru/cv/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://petr-korobeinikov.com/ru/cv/</guid><description>&lt;h1 id="петр-коробейников"&gt;Петр Коробейников&lt;/h1&gt;
&lt;p&gt;Founding Engineer &amp;amp; Architect - Go, Kotlin, Postgres, Cloud, DBaaS, Kubernetes&lt;/p&gt;
&lt;p&gt;Желаемая позиция: Principal Engineer&lt;/p&gt;
&lt;p&gt;Желаемый стек: Kotlin, Kubernetes, Postgres, Kafka/Pulsar&lt;/p&gt;
&lt;p&gt;Контакты&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/petr-korobeinikov"&gt;linkedin.com/in/petr-korobeinikov&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="профиль"&gt;Профиль&lt;/h2&gt;
&lt;p&gt;Principal-инженер с опытом проектирования и запуска отказоустойчивых облачных сервисов: DBaaS для Postgres и Redis, Managed RabbitMQ, voice/real-time-системы на Go и gRPC, событийные интеграции на Kafka, оркестрация бизнес-процессов на Temporal. Веду архитектурные ревью, формирую инженерные стандарты и DevEx-практики на уровне направления, выступаю ментором во внутренней менторской программе. Адаптирую AI-инструменты к процессу разработки команды. Веду публичный блог &lt;a href="https://principal-engineering.ru/"&gt;principal-engineering.ru&lt;/a&gt;, YouTube- и Telegram-каналы об инженерных практиках.&lt;/p&gt;</description></item></channel></rss>