<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: WildTuna</title>
    <description>The latest articles on DEV Community by WildTuna (@wildtuna).</description>
    <link>https://dev.to/wildtuna</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F862153%2F2dc91135-b270-461d-a704-316fdb4ad93c.jpeg</url>
      <title>DEV Community: WildTuna</title>
      <link>https://dev.to/wildtuna</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wildtuna"/>
    <language>en</language>
    <item>
      <title>500+ коммитов за пять месяцев: как я в одиночку запустил RetroPoint</title>
      <dc:creator>WildTuna</dc:creator>
      <pubDate>Thu, 03 Sep 2026 22:46:43 +0000</pubDate>
      <link>https://dev.to/wildtuna/500-kommitov-za-piat-miesiatsiev-kak-ia-v-odinochku-zapustil-retropoint-43m4</link>
      <guid>https://dev.to/wildtuna/500-kommitov-za-piat-miesiatsiev-kak-ia-v-odinochku-zapustil-retropoint-43m4</guid>
      <description>&lt;p&gt;Пятого апреля 2026 года я начал проверять гипотезу: можно ли собрать работающий MVP SaaS за месяц на подписке Cursor за $20, работая по три-четыре часа четыре вечера в неделю. Через месяц MVP был. Второго сентября я выкатил релиз 2026.09.2, а между этими датами уместились больше 500 коммитов, семь модулей в проде и более шестидесяти пройденных фаз разработки.&lt;/p&gt;

&lt;p&gt;По порядку: почему пришлось собирать свой инструмент, как устроен стек, как разделение работы между моделями дало такую скорость и что из задуманного не сработало.&lt;/p&gt;

&lt;p&gt;Оговорюсь сразу о двух вещах. RetroPoint делаю я, так что читайте это как рассказ заинтересованного лица. И разработчик тут действительно один, но не с чистого листа.&lt;/p&gt;

&lt;p&gt;Дизайн RetroPoint я заказал у дизайнера &lt;a href="https://t.me/processofmylife" rel="noopener noreferrer"&gt;Натальи&lt;/a&gt; 10 декабря 2022 года. Она проработала только модуль ретроспектив, но этого хватило, чтобы задать визуальный язык продукта. До полноценной разработки постоянно не доходили руки. Я вернулся к отложенной идее весной 2026-го, когда развитие AI-моделей и агентов сделало такой запуск в одиночку реалистичным. С помощью Claude Design и современных AI-моделей я продолжил исходную систему уже без дальнейшего участия дизайнера и перенес ее на остальные модули.&lt;/p&gt;

&lt;h2&gt;
  
  
  Почему пришлось собирать свое
&lt;/h2&gt;

&lt;p&gt;Я в разработке семнадцатый год, двенадцать из них руковожу командами разного размера и зрелости. Для ретроспектив, оценки задач, целей и встреч один на один находился свой инструмент, но вместе они не складывались в единый рабочий ритм. Контекст был разнесен по сервисам, таблицам, календарям, чатам и личным заметкам, а связывать его приходилось вручную.&lt;/p&gt;

&lt;p&gt;Потом привычный набор рабочих сервисов стал менее предсказуемым.&lt;/p&gt;

&lt;p&gt;Менялись условия оплаты и доступа, а вместе с ними появлялся риск потерять накопленную историю встреч. Я не хотел снова строить процесс команды вокруг инструментов, доступность которых не контролирую.&lt;/p&gt;

&lt;p&gt;Российские сервисы никуда не делись и работают. Когда я выбирал замену как тимлид, доступные мне продукты хорошо закрывали отдельные процессы, но не связывали их результаты в единый рабочий цикл.&lt;/p&gt;

&lt;h2&gt;
  
  
  Чего мне не хватало
&lt;/h2&gt;

&lt;p&gt;Хорошая ретроспектива заканчивается договоренностями. Ради них встречу и собирали. Но после фиксации решений работа в инструментах обычно заканчивалась.&lt;/p&gt;

&lt;p&gt;В командах, которыми я руководил, процесс чаще всего ломался в трех местах:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Контекст распадается. Цели живут в таблице, встречи в календаре, договоренности в чате, а личные заметки руководителя отдельно от всего этого.&lt;/li&gt;
&lt;li&gt;Договоренность теряется. Записать решение мало. Нужно понимать, к какой цели оно ведет, кто отвечает, насколько это важно и к какому сроку.&lt;/li&gt;
&lt;li&gt;Тимлид сшивает воркфлоу руками. Перед каждой встречей он заново собирает факты и переносит следующие шаги между сервисами.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Мне нужна была не доска, а связка «встреча, решение, действие с ответственным и сроком», чтобы следующий цикл начинался с того, чем закончился прошлый.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что получилось
&lt;/h2&gt;

&lt;p&gt;Сейчас в проде семь самостоятельных модулей: ретроспективы с 19 готовыми техниками, Planning Poker, OKR, встречи 1‑2‑1, Performance Review, рабочие встречи и календарь отсутствий с днями рождения.&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;li&gt;AI-помощник собирает темы, готовит итоги и предлагает следующие шаги, но ничего не применяет без подтверждения человека.&lt;/li&gt;
&lt;li&gt;Данные хранятся в России, оплата идет в рублях, а 27 июля продукт включили в реестр операторов персональных данных. Для части российских команд это входное требование к новому сервису.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Как это устроено
&lt;/h2&gt;

&lt;p&gt;Бэкенд работает на Python 3.12 и FastAPI, данные лежат в PostgreSQL 16 через SQLAlchemy 2.0 и Alembic. Слои обычные: api, service, repository и adapters. Доска обновляется у всех участников через SSE, PDF собирается reportlab, файлы уходят в S3-совместимое хранилище.&lt;/p&gt;

&lt;p&gt;На фронтенде React 18 с TypeScript и сборка на Vite. Перетаскивание карточек на dnd-kit, текстовые поля на TipTap, графики на ECharts. Инфраструктура простая: Docker Compose, GitLab CI, VDS на Ubuntu и nginx.&lt;/p&gt;

&lt;p&gt;Дольше всего я возился с SEO у SPA. Публичная часть сайта живет на том же React-роутере, и по умолчанию поисковый робот получает пустой &lt;code&gt;&amp;lt;div id="root"&amp;gt;&lt;/code&gt;. Решение немодное, но работает. На сборке я собираю второй, серверный бандл через &lt;code&gt;vite build --ssr&lt;/code&gt;, прогоняю по нему все публичные маршруты и раскладываю готовый HTML рядом со статикой. Оттуда же генерируется &lt;code&gt;sitemap.xml&lt;/code&gt; из тех же данных, что и сами страницы, поэтому карта сайта не расходится с реальностью. Сборка падает, если у страницы пустой &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;, отсутствует description или подозрительно мало HTML внутри &lt;code&gt;#root&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;В &lt;code&gt;public&lt;/code&gt; лежит еще один файл, &lt;code&gt;llms.txt&lt;/code&gt;. В нем карта публичной части сайта с явными границами для AI-агентов: где смотреть актуальные тарифы и почему этот файл не служит API. Мне важно, чтобы бот, которого спросили про сервисы ретроспектив, читал текущие условия, а не пересказ статьи двухлетней давности. Проверять такой файл глазами бессмысленно, поэтому у него есть контрактный тест. Меняются тарифы или состав модулей в коде, а &lt;code&gt;llms.txt&lt;/code&gt; не обновлен, и тест краснеет.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как один человек тянет больше 60 фаз
&lt;/h2&gt;

&lt;p&gt;Такой объем в одиночку я бы не вытянул без AI-агентов, но подход «просто попросить написать код» не работает вообще.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;В моей схеме сильная модель принимает решения, а более доступная их исполняет.&lt;/strong&gt; Claude Opus внутри Cursor снимал неопределенность: выбирал продуктовое и архитектурное решение, а потом превращал его в подробное ТЗ с критериями готовности. Реализацию по готовому контракту забирали более доступные модели. Главная экономия была не в стоимости запросов, а в том, что решение принималось один раз. Более доступные модели получали готовое ТЗ и не тратили время на повторный выбор подхода.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhttorqaa3hfqlbe771av.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhttorqaa3hfqlbe771av.png" alt="Схема работы AI-агентов: сильная модель принимает решение, доступная реализует, затем результат проходит проверку или возвращается на доработку" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Когда ТЗ можно отдавать исполнителю.&lt;/strong&gt; Да-да, по ходу работы я изобрел свой велосипед — локальную версию Spec-Driven Development. Superpowers, Spec Kit и OpenSpec я не использовал. Вместо готового фреймворка постепенно собрал процесс вокруг проектных спецификаций в файлах &lt;code&gt;docs/plan/phase-NN-*.md&lt;/code&gt;, которые появляются до кода. Передавать план можно, когда в нем приняты все ключевые решения. Исполнителю не нужно угадывать, зачем нужен сценарий и кто им пользуется, что входит в scope и что намеренно исключено, какой существующий паттерн продолжать, какие роли, права, тарифы и состояния учитывать, как выглядит API-контракт и чем доказывать готовность. Если хоть по одному пункту осталась развилка, исполнитель тихо начинает работать архитектором, и дешевая реализация превращается в дорогую переделку. Половина ошибок отсекается прямо здесь, потому что противоречие видно в тексте, а не в диффе на 900 строк.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Дизайн-токены сделали визуальное ТЗ достаточно точным.&lt;/strong&gt; Исходный дизайн покрывал только ретро, но уже задавал палитру и типографику продукта. Все остальные модули, от Planning Poker до Performance Review, я проектировал в Claude Design поверх этой системы. Помог не запрос «нарисуй красиво». Помогло то, что у агента были &lt;code&gt;docs/design-tokens.md&lt;/code&gt; и &lt;code&gt;tokens.css&lt;/code&gt;: семантические роли цвета, шкала типографики, 8pt-сетка, радиусы и размеры контролов. Макет показывает одно правильное решение. Дизайн-токены объясняют агенту, почему это решение принадлежит именно этому продукту. Иерархию, плотность, состояния и права по-прежнему принимал я.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Где схема ломалась.&lt;/strong&gt; На сквозном фронтенде несколько попыток Claude Sonnet и Composer 2.5 не прошли мою приемку. Дело было не в моделях. Под видом реализации я отдавал им еще не законченное проектирование. Это хорошо показывает Planning Poker: коммит &lt;code&gt;9e5ba4c&lt;/code&gt; затронул 42 файла и добавил 4839 строк, а полный прогон включал 323 теста. Сложность там создает не объем JSX. Экран одновременно держит состояние сессии, роли участников, ограничения тарифа и визуальную иерархию. Opus снял развилки, и после этого части снова уходили исполнителям.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Проектные скиллы в репозитории.&lt;/strong&gt; Для RetroPoint я сделал отдельные скиллы и храню их рядом с кодом. Это не универсальные инструкции для любого репозитория, а накопленный контекст конкретного продукта. В них зафиксированы карта UI-примитивов, правила слоев бэкенда, подход к архитектурным планам, редакционный стиль и требования внешних площадок. Поэтому агент точнее понимает существующие решения, а договоренности не теряются между чатами.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Скучные правила репозитория.&lt;/strong&gt; Ни npm, ни python с хоста, все команды идут в контейнерах &lt;code&gt;api&lt;/code&gt; и &lt;code&gt;frontend&lt;/code&gt; из корневого compose. Скучно, зато «у меня работает» больше не случается. Второе правило с первого дня: агент не коммитит без явной команды и не решает сам, что работа закончена.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Контрактные тесты на публичные обещания.&lt;/strong&gt; Критичные обещания на сайте проверяются кодом. Один тест сверяет цифры на странице тарифов с лимитами в бэкенде. Другой держит &lt;code&gt;llms.txt&lt;/code&gt;. Третий проверяет SEO-метаданные на сборке фронта. Агент может уверенно написать «до 10 активных досок», и остановит его только красный тест.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что не сработало
&lt;/h2&gt;

&lt;p&gt;Теперь про грабли.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Страница тарифов.&lt;/strong&gt; Я собрал четыре тарифа и шестнадцать дополнительных пакетов с отдельной таблицей возможностей для каждого. Вышла страница высотой около 28 500 пикселей с восемью таблицами. Мне казалось, что так честнее: человек видит все и выбирает точно. На деле выбор такой сложности человек не делает, он закрывает вкладку. В 55-й фазе я переупаковал все заново и свел линейку к постоянному бесплатному тарифу, двум платным вариантам для одной команды и небольшого направления, а также корпоративному тарифу по запросу. При регистрации по-прежнему доступны 30 дней полного продукта без карты и автосписания.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Приватная фича, из-за которой сайт пропал из выдачи всех поисковиков.&lt;/strong&gt; Одиннадцатого апреля я поднял pre-render всех публичных маршрутов и успокоился. Двадцать первого мая, занимаясь совсем другой задачей про восстановление сессии в новой вкладке, я поставил &lt;code&gt;AuthSessionProvider&lt;/code&gt;, который возвращал &lt;code&gt;null&lt;/code&gt;, пока не проверит cookie. В статике все лежало правильно. Но React гидратировался, вычищал &lt;code&gt;#root&lt;/code&gt; и держал его пустым до ответа бэкенда, так что краулер с JS получал пустую страницу на каждом публичном маршруте. Так продолжалось неделю, и этого хватило, чтобы поисковики убрали RetroPoint из выдачи. Сборка все это время была зеленой, потому что SEO-ассершены проверяли файл на диске, а не то, что остается после гидратации. Починил двадцать восьмого мая, вторым заходом второго июня добил клиентский рендер, а правильный вывод сделал только в конце июля, когда добавил post-deploy smoke по опубликованным адресам.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Страница регистрации отдавала 404.&lt;/strong&gt; Пре-рендер знает только публичные маршруты, а все остальное в nginx уходило в &lt;code&gt;error_page 404&lt;/code&gt;. Внешне все выглядело прилично: приложение поднималось и рисовало нужный экран. Но код ответа был 404, и в первом кадре успевала мигнуть надпись «Страница не найдена». Живой человек этого почти не замечал, а вот рекламный кабинет отклонял &lt;code&gt;/register&lt;/code&gt; как посадочную страницу, и краулеры превью показывали в мессенджерах ошибку вместо карточки ссылки. Лечится SPA-фолбэком для приложенческих префиксов, при котором на все прочие адреса остается честный 404. Чувствительные файлы и раньше не попадали в публичную статику: &lt;code&gt;.env&lt;/code&gt; исключался из сборочного контекста, секреты бэкенда хранились отдельно, а деплой публиковал только собранный фронтенд. В nginx я добавил еще один рубеж защиты. Теперь скрытые файлы и карты исходников возвращают 404, даже если однажды случайно окажутся в релизе. На эту мысль навели логи: сканеры регулярно пытались достать &lt;code&gt;/app/.env&lt;/code&gt;. Конфиг уехал на прод первого сентября, за день до того, как я сел писать этот текст.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Один провайдер входа оказался точкой отказа.&lt;/strong&gt; По срезу на второе сентября у 67 владельцев аккаунтов из 110 вообще не было локального пароля: они входили только через внешнего провайдера. До отключения Google был самым популярным внешним способом входа. Поэтому в июле исчезла не просто одна из кнопок, а привычный путь в продукт для заметной части аудитории. &lt;a href="https://www.consultant.ru/document/cons_doc_LAW_61798/" rel="noopener noreferrer"&gt;Часть 10 статьи 8 закона № 149-ФЗ&lt;/a&gt; ограничивает способы авторизации пользователей в России для российских владельцев сайтов и приложений. С 7 июля 2026 года &lt;a href="https://base.garant.ru/414444105/" rel="noopener noreferrer"&gt;закон № 199-ФЗ&lt;/a&gt; ввел за нарушение административную ответственность.&lt;/p&gt;

&lt;p&gt;Яндекс уже был подключен, но закрывал только часть потребности. Неожиданным для меня оказалось другое: заметная часть регистраций через него пришла с корпоративных доменов. Корпоративные решения Яндекса привели в RetroPoint аудиторию, которую я не ожидал увидеть в этом канале.&lt;/p&gt;

&lt;p&gt;После отключения Google я стал искать российский способ входа, который с высокой вероятностью уже есть у целевой аудитории. Выбор пал на Сбер ID и быстро себя оправдал. В срезе на четвертое сентября у Сбер ID было восемь регистраций, у Яндекса 38, у отключенного Google 25, а у VK ни одной. Сбер ID появился в продукте только шестого августа, поэтому восемь регистраций примерно за месяц стали для меня заметным сигналом спроса.&lt;/p&gt;

&lt;p&gt;Теперь я отношусь к провайдеру входа как к неотъемлемой части доступа, а не как к еще одной кнопке. Зависимость от одного популярного способа авторизации становится продуктовым риском. Альтернативу лучше добавлять, пока основной канал еще работает.&lt;/p&gt;

&lt;p&gt;Заодно выяснилось, что OAuth совсем не сводится к кнопке в форме. Нужно учесть callback, state и PKCE, привязку при занятом email, восстановление доступа, флаг функции, ошибки конкретного провайдера и отдельную приемку в рабочей среде.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Семь модулей, но ни один пока не стал привычкой.&lt;/strong&gt; Срез рабочей среды на десятое сентября: 110 активных владельцев аккаунтов, 106 из них сейчас внутри 30-дневного триала. Ретро-доски с карточками есть у 43 человек, всего 48 досок и 871 карточка. Дальше цифры падают: 8 команд, 20 встреч 1‑2‑1, 22 задачи в двух сессиях Planning Poker, один цикл Performance Review и ни одного цикла OKR. Признак повторения есть у 11 владельцев из 43: девять возвращались на ту же доску в другой день, трое завели вторую доску. Сначала я считал повторением только вторую доску и получил трех человек, но это неверно: несколько ретроспектив часто проходят на одной доске, которую просто правят заново. С деньгами так же: одна оплата от внешнего пользователя за все время, 200 ₽ 12 мая. Вывод получился неприятный. Скорость разработки не равна скорости изменения привычек, и семь процессов я построил заметно раньше, чем у четверти пришедших появился признак повторения хотя бы одного. Пять месяцев я занимался тем, что умею, архитектурой и модулями, и почти не занимался ни дистрибуцией, ни тем, чтобы довести до второй ретроспективы тех, кто уже пришел. С этой статьи и начинаю исправлять.&lt;/p&gt;

&lt;h2&gt;
  
  
  Что дальше
&lt;/h2&gt;

&lt;p&gt;Дальше по плану аналитика воронки и UTM-атрибуция, а следом работа с дистрибуцией вместо очередного модуля.&lt;/p&gt;

&lt;p&gt;Посмотреть, что получилось, можно на &lt;a href="https://retropoint.ru/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=2026_09_solo_launch_story&amp;amp;utm_content=solo_launch_story_post" rel="noopener noreferrer"&gt;retropoint.ru&lt;/a&gt;. Бесплатный тариф с ретро-досками остается бесплатным.&lt;/p&gt;

&lt;p&gt;Если вы тоже запускали продукт в одиночку, расскажите, как вы поняли, что пора отложить новые функции и заняться привлечением пользователей и продажами. Я слишком долго оценивал прогресс по темпу разработки. Коммитов и модулей становилось больше, но повторных пользователей и оплат почти не прибавлялось.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>startup</category>
      <category>ai</category>
      <category>agile</category>
    </item>
    <item>
      <title>MacOS: Внешние диски и APFS (format external ssd drive in APFS)</title>
      <dc:creator>WildTuna</dc:creator>
      <pubDate>Mon, 05 Sep 2022 13:28:01 +0000</pubDate>
      <link>https://dev.to/wildtuna/macos-vnieshniie-diski-i-apfs-format-external-ssd-drive-in-apfs-2klo</link>
      <guid>https://dev.to/wildtuna/macos-vnieshniie-diski-i-apfs-format-external-ssd-drive-in-apfs-2klo</guid>
      <description>&lt;p&gt;Если вы пользователь MacOS, то скорее всего сталкивались с подключением внешних дисков. Как вы уже знаете система монтирует их в /Volumes/*. Система MacOS устроена таким образом, что она  создает разные скрытые файлы с метаданными всех файлов и директорий. В APFS это как правило .DS_Store и еще несколько директорий для корзины и Spotlight. Если же мы говорим о других файловых системах, с которыми могут работать и другие операционные системы (ExFat, NTFS), то MacOS создает гораздо больше файлов. Сразу могут броситься файлы, которые начинаются на &lt;code&gt;._&lt;/code&gt; (dot underscore) - это и есть метаданные по файлам и директориям, которые использует MacOS. Помимо внешних дисков файлы .DS_Store создаются и на сетевых дисках.&lt;/p&gt;

&lt;p&gt;Для отключения создания .DS_Store файлов на сетевых дисках в MacOS предусмотрена специальная директива. Выполните эту команду в терминале, чтобы .DS_Store файлы не создавались на сетевых дисках:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Для новых версиях MacOS появилас аналогичная директива и для USB дисков:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Также нужно отключить индексирование внешнего диска:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mdutil -i off /Volumes/&amp;lt;DISK NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Важный момент, если пользователей несколько, то выполнять эти команды нужно под каждым из них.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;К сожалению запретить создание файлов &lt;code&gt;._&lt;/code&gt; нельзя. Эти файлы очень мешают при работе с Git и Docker. Единственное, что можно сделать - это удалить их вручную командой в терминале &lt;code&gt;dot_clean -n &amp;lt;dirname&amp;gt;&lt;/code&gt;, где &lt;code&gt;&amp;lt;dirname&amp;gt;&lt;/code&gt; - это директория, в которой нужно удалить начинающиеся с &lt;code&gt;._&lt;/code&gt; файлы. Для рекурсивного удаление в текущей директории и всех поддиректориях используйте команду&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dot_clean -n .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Но есть и хорошая новость! Эти файлы создаются только на файловых системах, отличных от Apple-овских. Поэтому, если отформатировать диск в MacOS Extended или APFS проблема с &lt;code&gt;._&lt;/code&gt; (dot underscore) пропадет.&lt;/p&gt;

&lt;p&gt;Для того, чтобы переформатировать жесткий диск нам понадобится "Дисковая утилита". В левом меню выбираем нужный диск, в быстром меню (правая кнопка мыши) выбираем "Стереть..." и в открывшемся окне выбираем нужную файловую систему. На рисунке ниже отображено окно форматирования подключенного по USB SSD диска.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblooc7aiyrfpdoxigp7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblooc7aiyrfpdoxigp7c.png" alt=" " width="799" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Но где же заветная APFS? Все дело в том, что большинство дисков, которые продаются используют разметку MBR, которая не совместима с APFS. Для форматирования диска в APFS у него должна быть разметка GPT (иногда ее называют GUID). Сделать этого в GUI версии "Дисковой утилиты" не получится. Обратимся к консольной. Для этого в терминале нужно выполнить последовательность действий ниже. &lt;/p&gt;

&lt;p&gt;Смотрим под каким номером примонтирован интересующий нас диск. Для этого выполним команду &lt;code&gt;diskutil list&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5oiil7cwwhaezd2a0o5v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5oiil7cwwhaezd2a0o5v.png" alt=" " width="800" height="829"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;На рисунке выше мы видим результат выполнения этой команды. Интересующий нас диск я выделил красным. Он примонтирован как /dev/disk2 - это понадобится для команды форматирования.&lt;/p&gt;

&lt;p&gt;Собственно для форматирования диска в APFS нужно выполнить эту команду:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;diskutil partitionDisk &amp;lt;disk number&amp;gt; 1 GPT APFS &amp;lt;disk name&amp;gt; R
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Где &lt;code&gt;&amp;lt;disk number&amp;gt;&lt;/code&gt; - это примонтированный диск, а &lt;code&gt;&amp;lt;disk name&amp;gt;&lt;/code&gt; - это имя диска, с которым он будет отображаться в приложениях и в /Volumes/*.&lt;/p&gt;

&lt;p&gt;Пример команды с заполненными параметрами:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;diskutil partitionDisk /dev/disk4 1 GPT APFS KINGSTON R
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;После успешного выполнения команды в &lt;code&gt;diskutil list&lt;/code&gt; мы увидим, что диска теперь два и нужный отформатирован в APFS. На рисунке ниже приведен результат этой команды после форматирования.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnisj0wgq1ws3gqvu6lr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnisj0wgq1ws3gqvu6lr.png" alt=" " width="799" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Теперь у вас внешний диск в APFS и на нем не будут создаваться файлы с &lt;code&gt;._&lt;/code&gt; (dot underscore). Так же в этой файловой системе у меня увеличилась скорость чтения и записи на 200Mb/s в сравнении с ExFat. &lt;/p&gt;

</description>
      <category>ssd</category>
      <category>programming</category>
      <category>docker</category>
      <category>hardware</category>
    </item>
    <item>
      <title>Ошибка обновления GitLab из-за ошибки обновления Let’s Encrypt</title>
      <dc:creator>WildTuna</dc:creator>
      <pubDate>Fri, 20 May 2022 08:55:07 +0000</pubDate>
      <link>https://dev.to/wildtuna/oshibka-obnovlieniia-gitlab-iz-za-oshibki-obnovlieniia-lets-encrypt-1pfk</link>
      <guid>https://dev.to/wildtuna/oshibka-obnovlieniia-gitlab-iz-za-oshibki-obnovlieniia-lets-encrypt-1pfk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk00a45jocfv16yhxifqy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk00a45jocfv16yhxifqy.png" alt=" " width="799" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Столкнулся недавно с проблемой обновления GitLab до версии 12.6 из-за ошибки реконфигурации, вызываемой попыткой обновления сертификата Let’s Encrypt. Так получилось, что обновление пришлось на день, когда был просрочен сертификат. Не беда! Отключаем использование сертификата в &lt;strong&gt;/etc/gitlab/gitlab.rb&lt;/strong&gt; и запускаем реконфигурацию вручную:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /etc/gitlab/gitlab.rb
// Находим это строку и выставляем значение &lt;span class="nb"&gt;false
&lt;/span&gt;letsencrypt[&lt;span class="s1"&gt;'enable'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;
// Сохраняем файл и выполняем реконфигурацию
gitlab-ctl reconfigure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Теперь GitLab успешно применит новые параметры и сможет обновиться. После завершения обновления возвращаем использование Let’s Encrypt в &lt;strong&gt;/etc/gitlab/gitlab.rb&lt;/strong&gt;, снова реконфигурируем GitLab и… снова получаем прежнюю ошибку!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Running handlers:
There was an error running gitlab-ctl reconfigure:
letsencrypt_certificate[git.hostname.com] &lt;span class="o"&gt;(&lt;/span&gt;letsencrypt::http_authorization line 5&lt;span class="o"&gt;)&lt;/span&gt; had an error: RuntimeError: acme_certificate[staging] &lt;span class="o"&gt;(&lt;/span&gt;/opt/gitlab/embedded/cookbooks/cache/cookbooks/letsencrypt/resources/certificate.rb line 25&lt;span class="o"&gt;)&lt;/span&gt; had an error: RuntimeError: ruby_block[create certificate &lt;span class="k"&gt;for &lt;/span&gt;git.lapaygroup.ru] &lt;span class="o"&gt;(&lt;/span&gt;/opt/gitlab/embedded/cookbooks/cache/cookbooks/acme/resources/certificate.rb line 108&lt;span class="o"&gt;)&lt;/span&gt; had an error: RuntimeError: &lt;span class="o"&gt;[&lt;/span&gt;git.hostname.com] Validation failed, unable to request certificate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Огорченный полез гуглить. Оказалось, проблема не только у меня, но четкого решения проблемы нет. После пары часов изучения баг-трекера GitLab и тщетных попыток устранить проблему мой рецепт решения был найден, и он очень простой:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;проверить, что порты &lt;strong&gt;80&lt;/strong&gt; и &lt;strong&gt;443&lt;/strong&gt; открыты;&lt;/li&gt;
&lt;li&gt;проверить домен на &lt;a href="https://letsdebug.net/" rel="noopener noreferrer"&gt;сайте Let’s Encrypt&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;установить параметры в &lt;strong&gt;/etc/gitlab/gitlab.rb&lt;/strong&gt;:
&lt;code&gt;
nginx[‘redirect_http_to_https’] = true 
nginx[‘redirect_http_to_https_port’] = 80
&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;удалить файлы проблемного сертификата из папки &lt;strong&gt;/etc/gitlab/ssl&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;запросить новый сертификат: &lt;strong&gt;gitlab-ctl renew-le-certs&lt;/strong&gt;. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;В моем случае оказался закрыт 80 порт и что-то случилось с правами на файлы сертификата в &lt;strong&gt;/etc/gitlab/ssl&lt;/strong&gt; — при обновлении GitLab не мог их заменить.&lt;/p&gt;

&lt;p&gt;Надеюсь, мой рецепт поможет решить проблему и вам!&lt;/p&gt;

</description>
      <category>gitlab</category>
      <category>linux</category>
      <category>debian</category>
      <category>russian</category>
    </item>
    <item>
      <title>Удаление Checkpoint Endpoint Security client on Mac (Uninstall)</title>
      <dc:creator>WildTuna</dc:creator>
      <pubDate>Fri, 20 May 2022 08:45:02 +0000</pubDate>
      <link>https://dev.to/wildtuna/udalieniie-checkpoint-endpoint-security-client-on-mac-uninstall-4lk5</link>
      <guid>https://dev.to/wildtuna/udalieniie-checkpoint-endpoint-security-client-on-mac-uninstall-4lk5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fti6wrxzcgur7ykenlhxe.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fti6wrxzcgur7ykenlhxe.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Для удаление &lt;strong&gt;Checkpoint Endpoint Security client on Mac&lt;/strong&gt; на MacOS необходимо выполнить shell скрипт в терминале.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#bash&lt;/span&gt;
sh /Library/Application Support/Checkpoint/Endpoint Security/uninstall
Или &lt;span class="o"&gt;(&lt;/span&gt;зависит от установленной версии&lt;span class="o"&gt;)&lt;/span&gt;
sh /Library/Application Support/Checkpoint/Endpoint Security/uninstall.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>checkpoint</category>
      <category>vpn</category>
      <category>macos</category>
      <category>russian</category>
    </item>
    <item>
      <title>Как обновить GitLab 12.9 до 13.1 в Debian и Ubuntu</title>
      <dc:creator>WildTuna</dc:creator>
      <pubDate>Fri, 20 May 2022 08:43:01 +0000</pubDate>
      <link>https://dev.to/wildtuna/kak-obnovit-gitlab-129-do-131-v-debian-i-ubuntu-44f7</link>
      <guid>https://dev.to/wildtuna/kak-obnovit-gitlab-129-do-131-v-debian-i-ubuntu-44f7</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqzbnsehma8oyrce4uaw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqzbnsehma8oyrce4uaw.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Если вы пропустили несколько обновлений GitLab и теперь при попытке апдейта через &lt;strong&gt;apt update &amp;amp;&amp;amp; apt upgrade&lt;/strong&gt; получаете ошибку перехода на мажорную версию (см. текст ошибки ниже), то устанавливать обновления придется поочередно.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Preparing to unpack .../gitlab-ce_13.1.3-ce.0_amd64.deb ...
gitlab preinstall: It seems you are upgrading from major version 12 to major version 13.
gitlab preinstall: It is required to upgrade to the latest 13.0.x version first before proceeding.
gitlab preinstall: Please follow the upgrade documentation at https://docs.gitlab.com/ee/policy/maintenance.html#upgrade-recommendations
dpkg: error processing archive /var/cache/apt/archives/gitlab-ce_13.1.3-ce.0_amd64.deb &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;--unpack&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
 subprocess new pre-installation script returned error &lt;span class="nb"&gt;exit &lt;/span&gt;status 1
Errors were encountered &lt;span class="k"&gt;while &lt;/span&gt;processing:
 /var/cache/apt/archives/gitlab-ce_13.1.3-ce.0_amd64.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В моем случае порядок устанавливаемых версий выглядит так:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// Ставим последнюю 12 версию
apt &lt;span class="nb"&gt;install &lt;/span&gt;gitlab-ce&lt;span class="o"&gt;=&lt;/span&gt;12.10.10-ce.0
// Ставим новую мажорную версию
apt &lt;span class="nb"&gt;install &lt;/span&gt;gitlab-ce&lt;span class="o"&gt;=&lt;/span&gt;13.0.4-ce.0
// Ставим последнее обновление
apt upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Принцип подходит для любой ошибки пропуска версий, главное — соблюдать &lt;a href="https://docs.gitlab.com/ee/policy/maintenance.html#upgrade-recommendations" rel="noopener noreferrer"&gt;порядок их обновления&lt;/a&gt;. Список всех версий можно посмотреть &lt;a href="https://packages.gitlab.com/gitlab/gitlab-ce" rel="noopener noreferrer"&gt;тут&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Надеюсь, статья была полезна. Спасибо, что дочитали до конца!&lt;/p&gt;

</description>
      <category>gitlab</category>
      <category>linux</category>
      <category>debian</category>
      <category>russian</category>
    </item>
    <item>
      <title>Проверка доступности TCP/UDP- порта в Linux-server</title>
      <dc:creator>WildTuna</dc:creator>
      <pubDate>Fri, 20 May 2022 06:29:46 +0000</pubDate>
      <link>https://dev.to/wildtuna/provierka-dostupnosti-tcpudp-porta-v-linux-server-37m5</link>
      <guid>https://dev.to/wildtuna/provierka-dostupnosti-tcpudp-porta-v-linux-server-37m5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ajxntmxjxy5i1gxjd6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ajxntmxjxy5i1gxjd6z.png" alt=" " width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Приветствую тебя, читатель! Если ты попал сюда, видимо, ты находишься в поиске информации, как проверять сетевые доступы в командной строке Linux. Постараюсь ответить на этот вопрос.&lt;/p&gt;

&lt;h2&gt;
  
  
  Проверка доступности TCP-порта
&lt;/h2&gt;

&lt;p&gt;Для проверки доступности TCP-порта в командной строке Linux идеально подходит утилита &lt;strong&gt;telnet&lt;/strong&gt;. Ниже я приведу несколько примеров:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Порт 3306 доступен и его слушает MySQL 5.5.62, установленный на ОС Debian 8
telnet testmysql.domain.com 3306
Trying 10.80.80.1...
Connected to testmysql.domain.com.
Escape character is '^]'.
W
5.5.62-0+deb8u1-log
// Для выхода из окна отправки команд на порт нужно ввести quit или сочетание клавиш ctrl/cmd + C
// Нет разрешения на подключение (Firewall) или порт никто не слушает)
telnet testmysql.domain.com 3307
Trying 10.80.80.1...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Вместо telnet можно воспользоваться утилитой &lt;strong&gt;nc&lt;/strong&gt; (&lt;a href="https://ru.wikipedia.org/wiki/Netcat" rel="noopener noreferrer"&gt;NetCat&lt;/a&gt;), команды у нее очень простые. Ниже приведу аналогичную проверку доступности порта MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nc testmysql.domain.com 3306
W
5.5.62-0+deb8u1-log��sU/({V{)��!�X^OS2@+UIQ9hmysql_native_password
// -z - Не посылать данные (сканирование портов) 
// -v - Дополнительная диагностика (verbose)
nc -z -v testmysql.domain.com 3306
Connection to testmysql.domain.com port 3306 [tcp/mysql] succeeded!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;С полным списком доступных ключей утилиты &lt;strong&gt;nc&lt;/strong&gt; и их описанием можно ознакомиться &lt;a href="https://ru.wikipedia.org/wiki/Netcat" rel="noopener noreferrer"&gt;тут&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Проверка доступности UDP-порта
&lt;/h2&gt;

&lt;p&gt;Для проверки UDP-портов выбор утилит меньше. Я использую в основном &lt;strong&gt;nc&lt;/strong&gt; (&lt;a href="https://ru.wikipedia.org/wiki/Netcat" rel="noopener noreferrer"&gt;NetCat&lt;/a&gt;). Ниже приведу несколько примеров проверки UDP-порта:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// MacOS
nc -z -v -u grayloghost.com 12311
Connection to grayloghost.com port 12311 [udp/*] succeeded!
// Linux
nc -z -v -u grayloghost.com 12311
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.80.80.2:12311.
Ncat: UDP packet sent successfully
Ncat: 1 bytes sent, 0 bytes received in 2.01 seconds.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Надеюсь, статья была полезна. Спасибо, что дочитали до конца!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>network</category>
      <category>tcp</category>
      <category>russian</category>
    </item>
    <item>
      <title>GitHub: Authentication failed on git push</title>
      <dc:creator>WildTuna</dc:creator>
      <pubDate>Fri, 20 May 2022 06:21:46 +0000</pubDate>
      <link>https://dev.to/wildtuna/github-authentication-failed-on-git-push-2j2h</link>
      <guid>https://dev.to/wildtuna/github-authentication-failed-on-git-push-2j2h</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3daaxoatmb4ezonqqigb.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3daaxoatmb4ezonqqigb.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Столкнулся тут с проблемой внесения изменений в одну из своих библиотек на GitHub, а именно ошибкой аутентификации.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvec4xrgzfose25lwduzf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvec4xrgzfose25lwduzf.png" alt=" " width="800" height="89"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Достаточно странно. Пароль точно верный, но в чем же дело? Стал вспоминать, что последнее делал в GitHub и вспомнил. Я включил двухфакторную аутентификацию.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztks8gcher4r8anoxc09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztks8gcher4r8anoxc09.png" alt=" " width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Лечится эта проблема просто. Заходим в &lt;strong&gt;Settings -&amp;gt; Developer settings&lt;/strong&gt; (отдельная кнопка внизу в левом меню). В открывшемся окне выбираем &lt;strong&gt;Personal access tokens&lt;/strong&gt; и наживаем на кнопку &lt;strong&gt;Generate new token&lt;/strong&gt; (&lt;a href="https://github.com/settings/tokens/new" rel="noopener noreferrer"&gt;https://github.com/settings/tokens/new&lt;/a&gt;). В открывшемся окне указываем название токена и нужные права доступа.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8e1p4usq73j3rmga1yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8e1p4usq73j3rmga1yw.png" alt=" " width="799" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;После заполнения нажимаем кнопку &lt;strong&gt;Generate token&lt;/strong&gt; и копируем полученный токен в буфер обмена, он понадобится для аутентификации в &lt;strong&gt;git push&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zawypinsyops83sohmc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zawypinsyops83sohmc.png" alt=" " width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Рекомендую сохранить его, так как повторный просмотр в интерфейсе невозможен.&lt;/p&gt;

&lt;p&gt;Тепер возвращаемся к терминалу в каталог с локальным репозиторием и вводим команду &lt;strong&gt;git push&lt;/strong&gt;. Git запросит Username и Password. Вводим ваш Username на GitHub и созданный &lt;strong&gt;access token&lt;/strong&gt; вместо своего пароля.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6w679hq6939qhmpx552.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6w679hq6939qhmpx552.png" alt=" " width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Вот и все, теперь аутентификация снова работает! Удачи!&lt;/p&gt;

</description>
      <category>github</category>
      <category>ssh</category>
      <category>2fa</category>
      <category>russian</category>
    </item>
    <item>
      <title>Visual Studio Code как альтернатива PHPStorm для Backend-разработчика</title>
      <dc:creator>WildTuna</dc:creator>
      <pubDate>Thu, 19 May 2022 22:13:00 +0000</pubDate>
      <link>https://dev.to/wildtuna/visual-studio-code-kak-altiernativa-phpstorm-dlia-backend-razrabotchika-1d7k</link>
      <guid>https://dev.to/wildtuna/visual-studio-code-kak-altiernativa-phpstorm-dlia-backend-razrabotchika-1d7k</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3ba2fueob8atcsi0k7t.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3ba2fueob8atcsi0k7t.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В сложившейся ситуации с покупкой продуктов JetBrains на территории РФ задумался об альтернативе одному из их продуктов PHPStorm. Давно слышал много хороших отзывов о VSCode и решил попробовать поработать в нем недельку. Начал с изучения доступных расширений и их настройки. В итоге мне удалось собрать под себя очень достойную альтернативу PHPStorm. В чем-то она хуже, в чем то лучше продукта от JetBrains, но для себя я решил пока остаться на VSCode. Ниже я поделюсь с вами расширениями, которые использую и настройками.&lt;/p&gt;

&lt;p&gt;Начинаем с установки Visual Studio Code. Для этого нужно скачать установщик с &lt;a href="https://code.visualstudio.com/Download" rel="noopener noreferrer"&gt;официального сайта&lt;/a&gt;. После установки мы получим голый VSCode.&lt;/p&gt;

&lt;p&gt;При желании можно установить языковый пакет, который локализует интерфейс приложения.&lt;/p&gt;

&lt;h2&gt;
  
  
  Установка расширений
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Менеджер проектов
&lt;/h3&gt;

&lt;p&gt;По умолчанию в VSCode нет привычной работы с проектами,  но эту проблему легко решить используя расширение &lt;a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager" rel="noopener noreferrer"&gt;Project Manager&lt;/a&gt;. Чтобы создать проект открываем папку с файлами, которую хотим использовать как проект, нажимаем ctrl+shift+P, в появившейся строке вводит Project и выбираем выделенный ниже элемент списка.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0mzda1ekdo4m2vqjdwa0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0mzda1ekdo4m2vqjdwa0.png" alt=" " width="800" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Будет предложено ввести имя проекта.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb55qt9pspcssbdtxspqh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb55qt9pspcssbdtxspqh.png" alt=" " width="800" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;После подтверждения проект будет создан и его можно будет увидеть в разделе с проектами.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foy53i0fbvt3akk62jrmb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foy53i0fbvt3akk62jrmb.png" alt=" " width="718" height="766"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;При клике на проект VSCode сразу откроет папку, к которой был привязан проект.&lt;/p&gt;
&lt;h3&gt;
  
  
  Расширения для PHP
&lt;/h3&gt;

&lt;p&gt;Для комфортной работы с PHP необходимо установить эти расширения:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Для отладки через &lt;a href="https://marketplace.visualstudio.com/items?itemName=xdebug.php-debug" rel="noopener noreferrer"&gt;XDebug&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Самое удобное расширение для работы с PHP кодом в &lt;a href="https://marketplace.visualstudio.com/items?itemName=DEVSENSE.phptools-vscode" rel="noopener noreferrer"&gt;VSCode от DevSense с AI подсказками&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Альтернатива предыдущего расширения для работы с кодом &lt;a href="https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client" rel="noopener noreferrer"&gt;PHP Intelephense&lt;/a&gt; (Очень советую приобрести Premium версию)&lt;/li&gt;
&lt;li&gt;Альтернатива предыдущего расширения для работы с кодом &lt;a href="https://marketplace.visualstudio.com/items?itemName=zobo.php-intellisense" rel="noopener noreferrer"&gt;PHP IntelliSense&lt;/a&gt; (На мой взгляд хуже предыдущего)&lt;/li&gt;
&lt;li&gt;Для работы с DocBlock &lt;a href="https://marketplace.visualstudio.com/items?itemName=neilbrayfield.php-docblocker" rel="noopener noreferrer"&gt;PHP DocBlocker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Для автовставки Namespace &lt;a href="https://marketplace.visualstudio.com/items?itemName=MehediDracula.php-namespace-resolver" rel="noopener noreferrer"&gt;PHP Namespace Resolver&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Для генерации &lt;a href="https://marketplace.visualstudio.com/items?itemName=cvergne.vscode-php-getters-setters-cv" rel="noopener noreferrer"&gt;getters и setters&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Генератор конструктора &lt;a href="https://marketplace.visualstudio.com/items?itemName=MehediDracula.php-constructor" rel="noopener noreferrer"&gt;PHP Constructor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Добавляет генерацию классов, интерфейсов, трейтов, enum при создании нового файла &lt;a href="https://marketplace.visualstudio.com/items?itemName=jaguadoromero.vscode-php-create-class" rel="noopener noreferrer"&gt;PHP Create Class&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Вставка подсказок type hints и входных параметров &lt;a href="https://marketplace.visualstudio.com/items?itemName=MrChetan.phpstorm-parameter-hints-in-vscode" rel="noopener noreferrer"&gt;PHP Parameter Hint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Для работы с &lt;a href="https://marketplace.visualstudio.com/items?itemName=ikappas.composer" rel="noopener noreferrer"&gt;Composer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Для подсказок пакетов и версий в composer.json &lt;a href="https://marketplace.visualstudio.com/items?itemName=kainiklas.composer-intellisense" rel="noopener noreferrer"&gt;Composer IntelliSense&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=junstyle.php-cs-fixer" rel="noopener noreferrer"&gt;CSFixer&lt;/a&gt; по желанию, требуется установленный на машине PHP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Если включить одновременно IntelliSense и Intelephense, то будут задвоены подсказки методов и аннотации с описанием функций.&lt;/p&gt;

&lt;p&gt;После установки расширений нужно отключить базовые подсказки PHP VSCode. Для этого нужно в расширениях в поисковой строке ввести &lt;a class="mentioned-user" href="https://dev.to/builtin"&gt;@builtin&lt;/a&gt; php и отключить расширение PHP Language Features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoyqc8vc0uzaz9n3hw5y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoyqc8vc0uzaz9n3hw5y.png" alt=" " width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Расширения для Symfony
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=TheNouillet.symfony-vscode" rel="noopener noreferrer"&gt;Symfony for VSCode&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=nadim-vscode.symfony-super-console" rel="noopener noreferrer"&gt;Symfony Console Run All Symfony Commands&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=nadim-vscode.symfony-code-snippets" rel="noopener noreferrer"&gt;Symfony code snippets And Twig Support &amp;amp; Yaml &lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Расширения для Laravel
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ryannaddy.laravel-artisan" rel="noopener noreferrer"&gt;Laravel Artisan&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=onecentlin.laravel-blade" rel="noopener noreferrer"&gt;Laravel Blade Snippets&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=austenc.laravel-blade-spacer" rel="noopener noreferrer"&gt;Laravel Blade Spacer&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=amiralizadeh9480.laravel-extra-intellisense" rel="noopener noreferrer"&gt;Laravel Extra Intellisense&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=ctf0.laravel-goto-controller" rel="noopener noreferrer"&gt;Laravel Goto Controller&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=codingyu.laravel-goto-view" rel="noopener noreferrer"&gt;Laravel goto view&lt;/a&gt;&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=onecentlin.laravel5-snippets" rel="noopener noreferrer"&gt;Laravel Snippets&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Работа с тэгами
&lt;/h3&gt;

&lt;p&gt;Для удобства работы с HTML, XML и прочими документами с тэгами: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag" rel="noopener noreferrer"&gt;Auto Rename Tag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag" rel="noopener noreferrer"&gt;Auto Close Tag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-complete-tag" rel="noopener noreferrer"&gt;Auto Complete Tag&lt;/a&gt; Ставит сам два расширения выше&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Встроенный Rest Client
&lt;/h3&gt;

&lt;p&gt;Rest client по аналогии с тем, что был добавлен в PHPStorm&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client" rel="noopener noreferrer"&gt;REST Client&lt;/a&gt;.&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client" rel="noopener noreferrer"&gt;Thunder Client&lt;/a&gt; - встроенный клиент, похожий на Postman.&lt;/p&gt;
&lt;h3&gt;
  
  
  Работа с проектом по FTP/SFTP
&lt;/h3&gt;

&lt;p&gt;Для работы с проектами на удаленных машинах нужно установить расширение &lt;a href="https://marketplace.visualstudio.com/items?itemName=liximomo.sftp" rel="noopener noreferrer"&gt;SFTP&lt;/a&gt;. Оно добавляет возможность в проектах добавлять SFTP конфиг, в котором можно указать опции синхронизации. &lt;/p&gt;
&lt;h3&gt;
  
  
  Системы контроля версий VCS
&lt;/h3&gt;

&lt;p&gt;Для работы с Git, пожалуй, лучшее расширение &lt;a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens" rel="noopener noreferrer"&gt;GitLens — Git supercharged&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Для отображения веток в виде графа &lt;a href="https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph" rel="noopener noreferrer"&gt;Git Graph&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Для удобного просмотра истории &lt;a href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory" rel="noopener noreferrer"&gt;Git History&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Для работы с GitLab и проведения CodeReview есть хорошее официальное расширение &lt;a href="https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow" rel="noopener noreferrer"&gt;GitLab Workflow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Есть еще интересный проект &lt;a href="https://marketplace.visualstudio.com/items?itemName=CodeStream.codestream" rel="noopener noreferrer"&gt;New Relic CodeStream&lt;/a&gt;, но мне не нравится, что там нужна регистрация и части кода, который комментируется, сохраняются на их серверах. &lt;/p&gt;
&lt;h3&gt;
  
  
  Верстка и шаблонизаторы
&lt;/h3&gt;

&lt;p&gt;Для быстрого составления HTML &lt;a href="https://code.visualstudio.com/docs/editor/emmet" rel="noopener noreferrer"&gt;Emmet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Для поддержки синтаксиса TWIG &lt;a href="https://marketplace.visualstudio.com/items?itemName=mblode.twig-language-2" rel="noopener noreferrer"&gt;Twig Language 2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Для удобной работы с CSS &lt;a href="https://marketplace.visualstudio.com/items?itemName=pranaygp.vscode-css-peek" rel="noopener noreferrer"&gt;CSS Peek&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JavaScript (ES6) code snippets &lt;a href="https://marketplace.visualstudio.com/items?itemName=xabikos.JavaScriptSnippets" rel="noopener noreferrer"&gt;JavaScript (ES6) code snippets&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Работа с СУБД
&lt;/h3&gt;

&lt;p&gt;Для работы с СУБД из VSCode &lt;a href="https://marketplace.visualstudio.com/items?itemName=mtxr.sqltools" rel="noopener noreferrer"&gt;SQLTools&lt;/a&gt; Есть драйвера для всех популярных СУБД (ставятся отдельными расширениями).&lt;/p&gt;
&lt;h3&gt;
  
  
  Работа с Docker
&lt;/h3&gt;

&lt;p&gt;Для удобной работы с контейнерами, сетями, образами, voluems и т.д. есть отличное расширение от Microsoft &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Документация
&lt;/h3&gt;

&lt;p&gt;Для работы с Markdown &lt;a href="https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint" rel="noopener noreferrer"&gt;markdownlint&lt;/a&gt;&lt;br&gt;
Для предпросмотра Swagger прямо в IDE &lt;a href="https://marketplace.visualstudio.com/items?itemName=Arjun.swagger-viewer" rel="noopener noreferrer"&gt;Swagger Viewer&lt;/a&gt;&lt;br&gt;
Автоподсказки для написания Swagger &lt;a href="https://marketplace.visualstudio.com/items?itemName=adisreyaj.swagger-snippets" rel="noopener noreferrer"&gt;Swagger Snippets&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Форматирование и читаемый вид
&lt;/h3&gt;

&lt;p&gt;Крутое расширение для форматирования и работы с &lt;a href="https://marketplace.visualstudio.com/items?itemName=redhat.vscode-xml" rel="noopener noreferrer"&gt;XML&lt;/a&gt; от RedHat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5tyus7y4cjja5sqw702h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5tyus7y4cjja5sqw702h.png" alt=" " width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;При нажатии правой кнопкой мыши в открывшемся меню появится новый блок для форматирования после установки расширения.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcbn8qnw9fhucw40nj7t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcbn8qnw9fhucw40nj7t.png" alt=" " width="800" height="899"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Альтернатива расширениею выше для работы c &lt;a href="https://marketplace.visualstudio.com/items?itemName=redhat.vscode-xml" rel="noopener noreferrer"&gt;XML&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Форматирование JSON &lt;a href="https://marketplace.visualstudio.com/items?itemName=eriklynd.json-tools" rel="noopener noreferrer"&gt;JSON Tools&lt;/a&gt;&lt;br&gt;
Для форматирования нужно использовать комбинации славишь ниже:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ctrl(Cmd)+Alt+M для преобразования JSON в читаемый вид&lt;/li&gt;
&lt;li&gt;Alt+M для минимизализации JSON &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Форматирование SQL &lt;a href="https://marketplace.visualstudio.com/items?itemName=adpyke.vscode-sql-formatter" rel="noopener noreferrer"&gt;SQL Formatter&lt;/a&gt;&lt;br&gt;
При нажатии правой кнопки мыши по выделенному SQL в меню появится новый блок после установки расширения.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8d2xjm607eomd1uyhb2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8d2xjm607eomd1uyhb2.png" alt=" " width="800" height="1059"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Для работы с &lt;a href="https://marketplace.visualstudio.com/items?itemName=GraphQL.vscode-graphql" rel="noopener noreferrer"&gt;GraphQL&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  TODO и FIXME
&lt;/h3&gt;

&lt;p&gt;Работая с PHPStorm многие из вас привыкли к удобному просмотру TODO и FIXME в виде списка по всему проекту. В VSCode для этой задачи есть два расширения.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree" rel="noopener noreferrer"&gt;Todo Tree&lt;/a&gt; - очень удобное расширение, позволяет видеть все TODO в виде списка, огромные возможности кастомизации отображения, возможность добавлять свои тэги.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight" rel="noopener noreferrer"&gt;TODO Highlight&lt;/a&gt; - расширение попроще предыдущего, но также позволяет кастомизировать отображение и добавлять свои тэги. На мой взгляд менее удобно реализован листинг TODO по проекту.&lt;/p&gt;
&lt;h3&gt;
  
  
  Работа с таск-трекерами
&lt;/h3&gt;

&lt;p&gt;Для быстрой работы с задачами прямо из VSCode для себя использую эти расширения:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=rozpuszczalny.vscode-redmine" rel="noopener noreferrer"&gt;Redmine&lt;/a&gt; - позволяет быстро просматривать список задач, менять статусы и трекать затраченное время;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=bulut4.youtrack" rel="noopener noreferrer"&gt;YouTrack&lt;/a&gt; - позволяет смотреть задачи, создавать ветки при открытии задачи, MR и прочее;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=HuddleBoards.youtrack-issues" rel="noopener noreferrer"&gt;YouTrack Issues&lt;/a&gt; - попроще предыдущего, но мне он нравится больше, так как сосредоточен только на работе с задачами и более удобный листинг задач;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=Atlassian.atlascode" rel="noopener noreferrer"&gt;Jira and Bitbucket&lt;/a&gt; - официальное расширение, которое отлично реализует работу с задачами в Jira и Bitbucket. &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Темы
&lt;/h3&gt;

&lt;p&gt;В магазине VSCode есть большой выбор тем. Мне больше всего нравится во всех IDE Twilight &lt;a href="https://marketplace.visualstudio.com/items?itemName=gerane.Theme-Twilight" rel="noopener noreferrer"&gt;Twilight Theme&lt;/a&gt; Многим нравится &lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.github-vscode-theme" rel="noopener noreferrer"&gt;GitHub Theme&lt;/a&gt;.  В целом в магазине каждый найдет что-то на свой вкус.&lt;/p&gt;

&lt;p&gt;Если вы обычно работаете с несколькими окнами VSCode одновременно, то вас может заинтересовать расширение &lt;a href="https://marketplace.visualstudio.com/items?itemName=johnpapa.vscode-peacock" rel="noopener noreferrer"&gt;Peacock&lt;/a&gt;, которое позволяет задать окнам IDE разную палитру и проще ориентироваться в открытых проектах.&lt;/p&gt;
&lt;h3&gt;
  
  
  Прочее
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=praveencrony.total-lines" rel="noopener noreferrer"&gt;Total Lines&lt;/a&gt; - добавляет в тулбар информацию, о количестве строк в файле.&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=chrmarti.regex" rel="noopener noreferrer"&gt;Regex Previewer&lt;/a&gt; - быстрая отладка регулярных выражений прямо в VSCode.&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks" rel="noopener noreferrer"&gt;Bookmarks&lt;/a&gt; - для удобных флажков на строчки кода.&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments" rel="noopener noreferrer"&gt;Better Comments&lt;/a&gt; - кастомизация комментариев в коде.&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=janisdd.vscode-edit-csv" rel="noopener noreferrer"&gt;Edit CSV&lt;/a&gt; - просмотр и редактирвоание CSV.&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=jasonlhy.hungry-delete" rel="noopener noreferrer"&gt;Hungry Delete&lt;/a&gt; - быстрое удаление пустых строк и пробелов одним нажатием.&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense" rel="noopener noreferrer"&gt;Path Intellisense&lt;/a&gt; - автоподставление путей к файлам.&lt;/p&gt;
&lt;h2&gt;
  
  
  Настройки
&lt;/h2&gt;

&lt;p&gt;Посе установки всех необходимых расширений необходимо произвести некоторые настройки в самом settings.json VSCode и в проектах настроить файлы-конфигурации расширений для их использования.&lt;/p&gt;
&lt;h3&gt;
  
  
  Базовые настройки VSCode
&lt;/h3&gt;

&lt;p&gt;Для комфортной работы расширений нужно произвести настройки в главном settongs.json.&lt;br&gt;
Для открытия его редактирования нужно набрать ctrl + shift + P и в строке ввести settings.json.&lt;br&gt;
В выпадающем списке выбрать выделенный на скрине вариант.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F611eczzzpykf7b5cw8xj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F611eczzzpykf7b5cw8xj.png" alt=" " width="797" height="125"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Откроется глобальный settings.json для всего VSCode, в котором нужно добавить / обновить значение узлов, как показано ниже.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Если&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;нужен&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;прокси&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;для&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;выкачивания&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;плагинов&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"http.proxyStrictSSL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"http.proxy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://proxy-host.ru:3128"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"editor.wordSeparators"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"`~!@#%^&amp;amp;*()-=+[{]}&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;|;:'&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;,.&amp;lt;&amp;gt;/?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Чтобы&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;символ&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;попадал&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;в&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;выделение&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;слова&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;при&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;двойном&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;клике&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.rulers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;125&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Максимальное&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;количество&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;символов&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;в&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;строке.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Рисуется&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;вертикальная&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;линия&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;как&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;в&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;PHPStorm&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Настройки&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;чтобы&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;подсказки&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;работали&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;везде&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(аннотации&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;и&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;прочее)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.quickSuggestions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
        &lt;/span&gt;&lt;span class="nl"&gt;"other"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"comments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"strings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workbench.editor.labelFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Показывать&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;путь&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;до&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;файла&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;в&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;табе&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;вкладки&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(long&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;medium&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;short&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;default)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workbench.colorCustomizations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Цвет&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;текста&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;у&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;подсказок&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;TypeHint&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"phpParameterHint.hintForeground"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#757373"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Цвет&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;фона&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;у&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;подсказок&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;TypeHint&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"phpParameterHint.hintBackground"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#2b2b2b"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Путь&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;до&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;интерпретатора&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;PHP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;для&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;линтеров&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(пример&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;пути&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;для&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Windows)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"php.executablePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"D:/Users/user/php/php.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"php.validate.executablePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"D:/Users/user/php/php.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Путь&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;до&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;интерпретатора&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;PHP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;для&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Symfony&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;VSCode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;расширения&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"symfony-vscode.phpExecutablePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/bin/php"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Чтобы&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;в&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;терминале&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;поддерживался&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;шрифт&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Menlo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;для&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Powerline&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"terminal.integrated.fontFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Menlo for Powerline"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Отключаем&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;отправку&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;данных&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;об&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;использовании&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"redhat.telemetry.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Путь&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;до&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;исполняемого&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;файла&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Composer&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"composer.executablePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/bin/composer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Переопределяем&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;шаблоны&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;исключения&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;для&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;расширения&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;подсказок&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"intelephense.files.exclude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"**/.git/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"**/.svn/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"**/.hg/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"**/CVS/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"**/.DS_Store/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"**/node_modules/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"**/bower_components/**"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"**/vendor/**/{Test,test,Tests,tests}/**/*Test.php"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Чтобы&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Twig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;обрабатывался&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;как&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;HTML&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(расширение&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;добавляет&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;само)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"emmet.includeLanguages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"twig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Настройки&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;для&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;расширения&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;автозакрытия&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;тэгов&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(расширение&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;добавляет&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;само)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"auto-close-tag.activationOnLanguage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"xml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"php"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"blade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"ejs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"jinja"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"javascript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"javascriptreact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"typescript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"typescriptreact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"plaintext"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"vue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"liquid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"erb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"lang-cfml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"cfml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"HTML (EEx)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"HTML (Eex)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"plist"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Настройка SFTP / FTP подключения в проекте
&lt;/h3&gt;

&lt;p&gt;Для настройки SFTP / FTP подключения в проекте нужно создать файл-конфигурацию sftp.json в проекте. Для этого нужно набрать ctrl + shift + P, в строке ввести SFTP: Config и выбрать выделенный ниже элемент списка.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcz5qow3cqjtwvgkvtbon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcz5qow3cqjtwvgkvtbon.png" alt=" " width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Оптимальный файл-конфигурации приведен ниже.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Connection Name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Название&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;соединения&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test.ru"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Адрес&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;сервера&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"interactiveAuth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Чтобы&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;работал&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;fa&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(DUO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Мультифактор&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;и&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;т.п.)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sftp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Протокол&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;подключения&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;к&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;серверу&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Порт&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;подключения&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;к&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;серверу&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Имя&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;пользователя&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;под&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;которым&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;подключаемся&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"privateKeyPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/user/.ssh/id_rsa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Путь&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;к&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;приватному&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;SSH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ключу&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;на&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ПК&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"remotePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/var/www/html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Каталог&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;который&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;нужно&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;синхронизировать&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"downloadOnOpen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Скачивать&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;файл&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;с&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;сервера&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;при&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;открытии&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"uploadOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Загружать&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;файл&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;на&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;сервер&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;при&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;сохранении&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ignore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Список&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;файлов&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;и&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;папок&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;которые&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;нужно&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;исключить&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;из&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;синхронизации&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;".vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;".idea"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;".git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;".DS_Store"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"var"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"remoteExplorer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Список&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;файлов&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;и&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;папок&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;которые&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;нужно&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;исключить&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;из&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;визора&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;файлов&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;на&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;сервере&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"filesExclude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"/var"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Для скачивания проекта файлов с сервера нужно ввести SFTP Download и выбрать выделенный ниже элемент списка.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xrfveafl5u7h1t7cb5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xrfveafl5u7h1t7cb5n.png" alt=" " width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;При нажатии правой кнопкой мыши по файлу в дереве файлов в открывшемся меню есть блок скачки и выгрузки файла на сервер.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvj5wdo0gdwfcih3fwgrk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvj5wdo0gdwfcih3fwgrk.png" alt=" " width="640" height="896"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Настройка SQLTool
&lt;/h3&gt;

&lt;p&gt;Для добавления подключения к СУБД нужно нажать ctrl+shift+P, в строке ввести SQLTool и выбрать выделенный ниже элемент списка.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmm0ylq39ihepdlf8xu5m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmm0ylq39ihepdlf8xu5m.png" alt=" " width="799" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Откроется ассистент настройки подключения &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjxv4l0b33cevm02ar06.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjxv4l0b33cevm02ar06.png" alt=" " width="800" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В итоге будет получен settings.json файл с параметрами подключения.&lt;br&gt;&lt;br&gt;
В одном проекте может быть несколько подключений к разным БД.&lt;br&gt;
Для MySQL файл-конфиграции выглядит как приведено ниже.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sqltools.connections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"mysqlOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"authProtocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"previewLimit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Количество&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;строк&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;в&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;превью&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"server"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test.ru"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Адрес&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;сервера&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;СУБД&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3306&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Порт&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;СУБД&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"driver"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MySQL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Драйвер&lt;/span&gt;&lt;span class="w"&gt; 
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ConnactionName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Имя&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;подключения&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;в&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;визоре&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"database"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"testdb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Имя&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;БД&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Пользователь&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;БД&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"connectionTimeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Тайм-аут&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;подключения&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;в&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;секундах&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"db_password"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Пароль&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;пользователя&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;БД&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Настройка расширения XDebug
&lt;/h3&gt;

&lt;p&gt;Для отладки PHP кода средствами Xdebug нужно составить файл-конфигурацию.&lt;br&gt;
Для этого в меню Run нужно выбрать Add Configuration...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65ny9um61z7on82bgsu9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65ny9um61z7on82bgsu9.png" alt=" " width="800" height="872"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Откроется редактор launch.json.&lt;br&gt;
Пример заполненного файла конфигурации для xdebug приведен ниже.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Используйте&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;IntelliSense&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;чтобы&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;узнать&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;о&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;возможных&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;атрибутах.&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Наведите&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;указатель&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;мыши&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;чтобы&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;просмотреть&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;описания&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;существующих&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;атрибутов.&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Для&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;получения&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;дополнительной&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;информации&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;посетите:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;https://go.microsoft.com/fwlink/?linkid=&lt;/span&gt;&lt;span class="mi"&gt;830387&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"configurations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Listen for Xdebug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Название&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;дебаггера&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"php"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"launch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"pathMappings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"/application"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${workspaceFolder}/application"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Слева&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;директория&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;приложеиня&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9005&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Порт&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;который&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;слушает&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;xdebug&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;По итогу работа отладчика будет выглядеть, как на скрине ниже&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfcxu5l3hkmlkkqnbkk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfcxu5l3hkmlkkqnbkk0.png" alt=" " width="800" height="559"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Настройка расширения Redmine
&lt;/h3&gt;

&lt;p&gt;Для работы с задачами в таск-трекере Redmine в конфигурационном файле settings.json в каталоге .vscode проекта нужно добавить настройки ниже. После сохранения для работы нужно перезапустить VSCode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;"redmine.url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://redmine.example.ru"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Адрес&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Redmine&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"redmine.apiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ApiKey"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;API&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Ключ&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Redmine&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"redmine.rejectUnauthorized"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Если&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;самоподписанные&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;SSL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;сертификат&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Настройка расширения Intelephense
&lt;/h3&gt;

&lt;p&gt;Чтобы указать версию PHP у проекта для корректной работы линтера нужно в файле settings.json &lt;strong&gt;в проекте&lt;/strong&gt; указать ее, как показано ниже.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;"intelephense.environment.phpVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7.4.0"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Спасибо, что дочитали до конца! Надеюсь, моя инструкция будет полезна и вам! &lt;/p&gt;

</description>
      <category>vscode</category>
      <category>phpstorm</category>
      <category>php</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
