<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Инструменты командной строки</title>
    <description>Если черная консоль вам милее кнопочных интерфейсов, то здесь вы найдете информацию о том, как грамотно использовать терминал и консольные приложения.</description>
    <link>https://tproger.ru/tag/command-line-tools</link>
    <atom:link href="https://tproger.ru/tag/command-line-tools/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 20:21:45 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Инструменты командной строки</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Rust Coreutils 0.11 показывает ошибку кареткой и ускоряет cp на треть</title>
      <link>https://tproger.ru/news/rust-coreutils-0-11-pokazyvaet-owibku-karetkoj-i-uskoryaet-cp-na</link>
      <comments>https://tproger.ru/news/rust-coreutils-0-11-pokazyvaet-owibku-karetkoj-i-uskoryaet-cp-na?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/rust-coreutils-0-11-pokazyvaet-owibku-karetkoj-i-uskoryaet-cp-na</guid>
      <description><![CDATA[<p>Вышел Rust Coreutils 0.11.0: сообщения об ошибках с указателем на проблемный символ в 28 утилитах, PGO-сборки до 31% быстрее, cp ускорен на 32,93%, совместимость с GNU 653 из 685 тестов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/rust-coreutils-0-11-pokazyvaet-owibku-karetkoj-i-uskoryaet-cp-na">Rust Coreutils 0.11 показывает ошибку кареткой и ускоряет cp на треть</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 01:34:15 GMT</pubDate>
      <content:encoded><![CDATA[<p>Проект uutils 31 августа <a href="https://github.com/uutils/coreutils/releases/tag/0.11.0">выпустил</a> Rust Coreutils 0.11.0, переписанный на Rust набор базовых утилит Linux. Главное изменение видно сразу: cut, chmod, sort и ещё 25 утилит при ошибке в аргументах показывают строку с указателем на проблемный символ, как это делают компиляторы Rust и Clang. Плюс сборки с PGO, которые, по данным команды, дают до 31% прироста, и cp, ускоренный на 32,93%.</p><p>Для тех, кто пользуется обычными GNU Coreutils, ничего не меняется, пока дистрибутив не переключится сам. Но тенденция понятна: Ubuntu уже ставит Rust-реализацию по умолчанию, и вопрос «а чем это отличается» становится практическим. Ответ версии 0.11: сообщениями об ошибках, скоростью и очередным шагом к полной совместимости с GNU.</p><ul><li>Новый диагностический движок на библиотеке ariadne: подсказки с указателем в 28 утилитах.</li><li>Переменная UUTILS_DIAG принимает always, never и auto; в скриптах и пайпах по умолчанию сохраняется однострочное сообщение.</li><li>PGO-сборки для Linux, macOS и Windows дают до 31% прироста; cp ускорен на 32,93%, join в одном сценарии в 2,5 раза быстрее GNU.</li><li>Совместимость с тестами GNU: 653 успешных, 22 неудачных, 10 пропущенных из 685; было 645 и 28.</li><li>Исправлены TOCTOU-проблемы в mv, cp, rm и chmod; 358 pull request от 26 новых участников.</li></ul><h2>Как выглядит новая ошибка</h2><p>Идея, описанная Сильвестром Ледрю в <a href="https://uutils.org/blog/2026-08-error-diagnostics/">блоге проекта</a>, проста: GNU-утилиты десятилетиями отвечали на опечатку сухой строкой вроде «invalid field specification», и пользователь сам искал, где именно ошибся. Теперь под командой печатается сама команда, а под ней каретка, указывающая на неверный символ, и короткое объяснение. Реализовано это на библиотеке ariadne, той же, что используют некоторые парсеры на Rust.</p><p>Важная деталь для тех, кто пишет скрипты: многострочная диагностика включается только в интерактивном терминале. В пайпах и при перенаправлении вывода по умолчанию остаётся привычное однострочное сообщение, поэтому парсеры stderr не сломаются. Управляет этим переменная окружения UUTILS_DIAG со значениями always, never и auto. Попробовать без установки можно в <a href="https://uutils.org/playground/?cmd=sort%20-k2.3x%20notes.txt">браузерной песочнице</a> проекта.</p><h2>Скорость: «медленнее GNU теперь считается багом»</h2><p>Команда прямо формулирует новую политику: «утилита, которая значительно медленнее GNU, теперь считается багом» (перевод редакции). В релизе это подкреплено PGO-сборками для Linux, macOS и Windows, которые, по замерам проекта, дают до 31% прироста. Отдельно названы cp, ускоренный на 32,93%, и join, который в одном из сценариев работает в 2,5 раза быстрее GNU-версии. Это замеры самого проекта на его наборах; на других данных разница будет иной.</p><h2>Совместимость с GNU</h2><p>Таблица в релизе сравнивает результаты на тестовом наборе GNU Coreutils: в 0.10.0 было 645 успешных и 28 неудачных тестов из 683, в 0.11.0 стало 653 успешных, 22 неудачных и 10 пропущенных из 685. Оставшиеся расхождения касаются редких флагов и краевых случаев, но именно они всплывают в старых скриптах, поэтому перед заменой системных утилит стоит прогнать свои сценарии.</p><p>Из исправлений безопасности названы TOCTOU-проблемы, то есть гонки между проверкой и использованием файла, в mv, cp, rm и chmod; также закрыты зависания и переполнения. Реализации kill и uptime доработаны для Windows.</p><h2>Как попробовать</h2><p>Проект распространяется под лицензией MIT и рассчитан на Linux, Windows, Redox и Fuchsia. Самый безопасный способ познакомиться: поставить uutils рядом с системными утилитами, а не вместо них. По README проекта, сборка из исходников выполняется через cargo, а в ряде дистрибутивов пакет называется uutils-coreutils или rust-coreutils и ставит бинарники в отдельный каталог. Точные имена пакетов зависят от дистрибутива, поэтому проверять их стоит в его репозитории.</p><p>Если ваши скрипты парсят stderr утилит, оставьте UUTILS_DIAG в значении auto: тогда в неинтерактивном режиме формат ошибок не изменится.</p><p>В релиз вошли 358 pull request от 26 новых участников; всего в проекте отметились более 1000 контрибьюторов. Редакция проверит, как изменится таблица совместимости в 0.12.</p><p>Источники: <a href="https://github.com/uutils/coreutils/releases/tag/0.11.0">Релиз 0.11.0 на GitHub</a>, <a href="https://uutils.org/blog/2026-08-error-diagnostics/">Блог uutils: новая диагностика ошибок</a></p><p>Изображение на обложке: uutils</p>]]></content:encoded>
    </item>
    <item>
      <title>GitHub CLI 2.99 прикладывает скриншоты и видео к issue из терминала</title>
      <link>https://tproger.ru/news/github-cli-2-99-prikladyvaet-skrinwoty-i-video-k-issue-iz-termin</link>
      <comments>https://tproger.ru/news/github-cli-2-99-prikladyvaet-skrinwoty-i-video-k-issue-iz-termin?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/github-cli-2-99-prikladyvaet-skrinwoty-i-video-k-issue-iz-termin</guid>
      <description><![CDATA[<p>В GitHub CLI 2.99.0 появился флаг --attach: картинки и видео загружаются в issue, pull request и комментарии прямо из терминала. Лимиты, форматы, требования к токену и что не работает на Enterprise Server.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/github-cli-2-99-prikladyvaet-skrinwoty-i-video-k-issue-iz-termin">GitHub CLI 2.99 прикладывает скриншоты и видео к issue из терминала</a>»</p>]]></description>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 01:32:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>GitHub 1 сентября <a href="https://github.blog/changelog/2026-09-01-github-cli-media-in-issues-pull-requests-and-comments/">объявил</a>, что в GitHub CLI появился флаг --attach: он загружает локальные изображения и видео в issue, pull request или комментарий. Раньше терминальный клиент умел работать только с текстом, а скриншот или запись экрана приходилось тащить через браузер. Функция доступна всем пользователям GitHub на всех тарифах после обновления до версии 2.99.0.</p><p>Для тех, кто пишет багрепорты из скриптов, собирает отчёты в CI или просто не хочет переключаться в браузер ради одной картинки, это закрывает давний разрыв между «вот команда, которая падает» и «вот как это выглядит». Единственное серьёзное исключение: GitHub Enterprise Server в этом релизе не поддерживается.</p><ul><li>Флаг --attach работает в gh issue create, edit, comment и в gh pr create, edit, comment; его можно повторять несколько раз.</li><li>Форматы: PNG, JPEG, GIF, WebP, SVG для картинок и MP4, MOV, WebM для видео.</li><li>Лимит на изображение и GIF 10 МБ; видео до 10 МБ на бесплатном плане и до 100 МБ на платных.</li><li>Нужен OAuth-токен от gh auth login или classic personal access token и право записи в репозиторий.</li><li>GitHub Enterprise Server не поддерживается; нужна версия gh 2.99.0.</li></ul><h2>Как это выглядит в командной строке</h2><p>Минимальный пример из changelog: приложить скриншот к комментарию в issue.</p><p>Флаг повторяемый, поэтому к одному issue можно приложить сразу несколько файлов, указав --attach для каждого. Alt-текст задаётся после пути через решётку: --attach './login.png#The login error state'. Это тот же alt, который потом увидят читатели со скринридером, так что писать его стоит осмысленно.</p><p>Самая полезная деталь спрятана в обработке Markdown. Если в тексте issue или комментария уже стоит локальная ссылка вида ![alt](./login.png), CLI перепишет её на адрес загруженного файла. Вложения, на которые в тексте ссылок нет, добавляются в конец Markdown. Значит, можно писать описание бага в редакторе с относительными путями к картинкам, а потом одной командой отправить и текст, и файлы.</p><h2>Ограничения, о которых стоит знать заранее</h2><p>Для загрузки нужен либо OAuth-токен, полученный через gh auth login, либо classic personal access token; другие типы токенов в changelog не упомянуты, и это стоит учитывать в CI. Кроме того, требуется право записи в репозиторий: приложить файл к чужому issue в проекте, где вы не участник, не получится, даже если оставлять комментарии там можно.</p><p>Лимиты размеров: 10 МБ для изображений и GIF, для видео 10 МБ на Free и 100 МБ на платных планах. GitHub Enterprise Server новую возможность не получил; сроки для самостоятельно развёрнутых инсталляций в публикации не названы.</p><p>Что ещё не сказано: как ведёт себя команда при превышении лимита, поддерживает ли она загрузку по URL вместо локального файла и когда флаг доберётся до gh release. Судя по тексту changelog, речь только об issue, pull request и комментариях.</p><h2>Где это пригодится</h2><ul><li>Тестовые пайплайны: упавший end-to-end тест прикладывает скриншот или запись браузера к автоматически созданному issue.</li><li>Ревью интерфейсов: gh pr comment --attach с записью экрана вместо описания «нажмите сюда, потом сюда».</li><li>Скрипты отчётов: график из matplotlib или диаграмма сборки уходит в комментарий к pull request без промежуточного хостинга.</li></ul><p>Обновиться можно штатным способом: через менеджер пакетов, которым gh ставился, или скачав релиз 2.99.0 с GitHub.</p><p>Редакция проверит, появится ли поддержка Enterprise Server в следующих релизах gh.</p><p>Источник: <a href="https://github.blog/changelog/2026-09-01-github-cli-media-in-issues-pull-requests-and-comments/">Changelog GitHub: GitHub CLI media in issues, pull requests, and comments</a></p><p>Изображение на обложке: GitHub</p>]]></content:encoded>
    </item>
    <item>
      <title>Tailscale выпустила tailcat: соединить две машины через NAT без аккаунта</title>
      <link>https://tproger.ru/news/tailscale-vypustila-tailcat-soedinit-dve-mawiny-cherez-nat-bez</link>
      <comments>https://tproger.ru/news/tailscale-vypustila-tailcat-soedinit-dve-mawiny-cherez-nat-bez?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/tailscale-vypustila-tailcat-soedinit-dve-mawiny-cherez-nat-bez</guid>
      <description><![CDATA[<p>Tailscale открыла tailcat, CLI и Go-пакет, который соединяет две машины за NAT через WireGuard и DERP без аккаунтов и tailnet. Как это работает, для чего годится, чем отличается от ngrok, SSH-туннелей и обычного Tailscale, как установить.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/tailscale-vypustila-tailcat-soedinit-dve-mawiny-cherez-nat-bez">Tailscale выпустила tailcat: соединить две машины через NAT без аккаунта</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Сетевые протоколы]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 01 Sep 2026 17:28:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Tailscale 31 августа <a href="https://tailscale.com/blog/tailcat">опубликовала</a> <b>tailcat</b>, открытый инструмент, который соединяет две машины, где бы они ни стояли, без регистрации в сервисе и без сети tailnet. Автор — Брэд Фицпатрик, создатель memcached и один из основателей Tailscale. Идея проста: взять из Tailscale только сетевую часть (WireGuard, обход NAT и релеи DERP) и выбросить всё, что требует аккаунта. Компания называет это «Tailscale без Tailscale, от Tailscale» (перевод редакции).</p><p>На практике это netcat для интернета: на одной машине запускаете tailcat в режиме ожидания и получаете одноразовый адрес-токен, на другой вызываете tailcat с этим адресом, и между ними появляется шифрованный двунаправленный канал. Сверху можно пустить SSH, передачу файлов или проброс порта. Для разового доступа к машине за NAT это заменяет и промежуточный сервер, и регистрацию в чужом сервисе.</p><ul><li>tailcat — CLI и Go-пакет github.com/tailscale/tailcat под лицензией BSD-3-Clause.</li><li>Использует WireGuard, NAT traversal и DERP-релеи Tailscale, но не control plane: аккаунты, вход и tailnet не нужны; IP-адреса внутри туннеля есть, но пользователю их знать не требуется.</li><li>Адрес машины — её публичный ключ с информацией о DERP-сервере для первого контакта, закодированный в строку с префиксом tc.</li><li>Сценарии: SSH на машину за NAT, передача файлов, временный доступ; есть экспериментальная браузерная демонстрация на WebAssembly.</li><li>Прототип под названием derpcat написан в сентябре 2023 года; обещаний стабильности API и CLI у проекта нет.</li></ul><h2>Как соединение работает без сервера-посредника</h2><p>В обычном Tailscale центральный сервер (control plane) раздаёт машинам ключи друг друга и координаты, по которым их искать. В tailcat этого посредника нет: всё, что нужно для соединения, упаковано в сам адрес. По описанию в блоге, это публичный ключ WireGuard плюс сведения о том, через какой DERP-релей к машине можно достучаться, если прямой путь через NAT не найдётся; строка начинается с tc и кодирует эти данные в base64. Получатель адреса знает и кому доверять, и где искать.</p><blockquote>No accounts, login flow, tailnets, or IP addresses.</blockquote><p>Дальше работает тот же механизм, что и в Tailscale: машины пытаются пробить NAT и соединиться напрямую, а если не выходит, трафик идёт через DERP-релей, зашифрованный концами так, что релей содержимого не видит. Релеи Tailscale публичные, и их можно заменить своим. Ни root, ни TUN-интерфейс, ни права администратора не нужны: tailcat работает в пространстве пользователя как обычная программа.</p><h2>Чем это отличается от ngrok, SSH-туннелей и самого Tailscale</h2><p>От <b>ngrok</b> и подобных сервисов tailcat отличается тем, что не выставляет ничего в публичный интернет: соединение получит только тот, у кого есть адрес, а адрес — это ключ. От <b>SSH-прыжков</b> через промежуточный сервер — тем, что промежуточный сервер не нужен вообще: DERP лишь помогает найти друг друга и при необходимости ретранслирует уже зашифрованные байты. От <b>Tailscale</b> — отсутствием всей управляющей части: нет списка устройств, ACL, MagicDNS, нет и постоянной сети, каждое соединение живёт само по себе.</p><p>Отсюда и границы применимости. tailcat хорош для разового доступа: подключиться к ноутбуку коллеги, забрать большой файл с домашней машины из офиса, дать подрядчику временный вход на стенд. Для постоянной сети между десятками серверов с правами доступа он не замена Tailscale или WireGuard-конфигу, и авторы этого не обещают: README прямо предупреждает, что инструмент бесплатный, но стабильность API и CLI не гарантируется.</p><h2>Как попробовать</h2><ul><li>Установка при наличии Go: go install github.com/tailscale/tailcat/cmd/tailcat@latest; готовые бинарники смотрите в релизах репозитория.</li><li>На принимающей стороне запустите tailcat в режиме прослушивания и скопируйте выданный адрес; на второй машине передайте этот адрес как аргумент.</li><li>Поверх канала поднимайте SSH или пробрасывайте порт; для передачи файлов подойдёт обычное перенаправление stdin и stdout, как с netcat.</li><li>Для закрытого контура поднимите собственный DERP-сервер: код релея открыт в репозитории Tailscale.</li><li>Браузерная демонстрация на WebAssembly лежит на GitHub Pages проекта и показывает, что канал можно открыть даже из вкладки.</li><li>Публичные DERP-релеи даны без SLA, с ограничением частоты запросов и лишь в нескольких регионах; для рабочих сценариев поднимите свой релей.</li></ul><h2>Контекст</h2><p>Первый прототип под именем derpcat Фицпатрик написал в сентябре 2023 года, публично проект показали после конференции TailscaleUp в августе 2026-го. Мотив компании понятен: чем больше людей знакомы с её сетевым стеком, тем проще им потом прийти за полноценным продуктом. Для разработчика это честная сделка: рабочий инструмент под BSD-лицензией без обязательств, но и без гарантий, что завтра его интерфейс не изменится.</p><p>Источники: <a href="https://tailscale.com/blog/tailcat">tailcat: Tailscale without Tailscale (блог Tailscale)</a>, <a href="https://github.com/tailscale/tailcat">Репозиторий tailscale/tailcat</a></p><p>Изображение на обложке: Tailscale</p>]]></content:encoded>
    </item>
    <item>
      <title>awk за пределами print $1: пять нетривиальных задач</title>
      <link>https://tproger.ru/articles/awk-za-predelami-print-1-pyat-netrivialnyh-zadach</link>
      <comments>https://tproger.ru/articles/awk-za-predelami-print-1-pyat-netrivialnyh-zadach?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Нефедов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/awk-za-predelami-print-1-pyat-netrivialnyh-zadach</guid>
      <description><![CDATA[<p>Практический разбор awk на пяти задачах: суммы по группам, уникальные строки с сохранением порядка, join файлов через FNR==NR и парсинг /etc/passwd. С примерами команд.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/awk-za-predelami-print-1-pyat-netrivialnyh-zadach">awk за пределами print $1: пять нетривиальных задач</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 12 Aug 2026 16:18:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>Пожалуй, самое частое применение awk  - выдрать первую колонку из вывода, кинуть в пайплайн дальше. На этом знакомство с awk у большинства и заканчивается.</p><p>Но awk - это не утилита для вырезания колонок, это полноценный язык программирования с ассоциативными массивами, регулярками, форматированным выводом и управляющими конструкциями. Все то, ради чего обычно тянутся за Python-скриптом, awk умеет в одну строку прямо в терминале.</p><p>Ниже - пять задач, которые на первый взгляд выглядят элементарно, но ломают привычку "awk это про колонки". По каждой разберем три вещи: как хочется решить сходу, почему это неоптимально, и как можно при помощи awk.</p><h2>Задача 1: сумма по группам.</h2><p>Дан файл /root/spend.txt - категория трат и сумма:</p><p>Нужно просуммировать по каждой категории.</p><p>Первое что приходит в голову - сгруппировать. Собрать уникальные категории, по каждой отфильтровать строки и сложить. Получается что-то такое:</p><p>Это работает. Но это три прохода по файлу на каждую категорию, внешний цикл в shell, и на большом файле оно будет работать очень медленно.</p><p>Да, awk '{sum += $2}' умеет накапливать одно число - общую сумму по всему файлу. Но  как только сумм нужно несколько - по одной на категорию - рука тянется наружу, к циклу в shell, потому что "одна переменная - одна сумма". Но в awk не одна переменная. Здесь также есть ассоциативные массивы, где индексом может выступать строка.</p><p>Итого, решение через awk может выглядеть следующим образом:</p><p>Вот как это работает:</p><p>s[$1] += $2 - берем ячейку массива s с ключом "первое поле" и прибавляем к ней второе. Для строки food 10 это s["food"] += 10, для toys 5 - s["toys"] += 5. awk сам заводит новую ячейку когда встречает новый ключ, обнулять ничего не надо. Прошли весь файл - в массиве накопились суммы по всем категориям за один проход.</p><p>Блок END выполняется после того как файл закончился. for(k in s) обходит все ключи массива, print k, s[k] печатает ключ и накопленную по нему сумму.</p><h2>Задача 2: уникальные строки с сохранением порядка</h2><p>Дан файл /root/items.txt, строки в нем повторяются:</p><p>Нужно оставить только уникальные, сохранив порядок первого появления.</p><p>Тут даже awk сначала не вспоминаешь - есть же готовый инструмент:</p><p>Запускаем, получаем a b c. Вроде совпало. Но совпало случайно - в этом примере уникальные значения итак идут по алфавиту. sort -u сортирует, а значит **порядок первого появления теряется</p><p>awk в свою очередь помнит, какие строки уже видел, и делает это в один проход - потому что у него, опять же, есть ассоциативный массив.</p><p>Более простое решение задачи через awk:</p><p>По шагам:</p><p>$0 - это вся текущая строка целиком. seen[$0] - ячейка массива с ключом "эта строка". Для новой, еще не встречавшейся строки ее значение пустое, а в числовом контексте awk считает пустое за 0.</p><p>seen[$0]++ - это постфиксный инкремент: awk сначала возвращает текущее значение ячейки, а потом увеличивает его на 1. То есть при первой встрече строки выражение отдает 0 и тут же делает ячейку равной 1. При второй встрече отдает 1 (и делает равной 2), и так далее.</p><p>И ключевой момент: в awk, если условие написано без блока {...}, то то по умолчанию выполняется действие print - "напечатать строку"</p><h2>Задача 3: строки между маркерами</h2><p>В log.txt есть блок, обернутый в строки-маркеры --START-- и --END--:</p><p>Нужно вытащить то, что между маркерами - line1 и line2</p><p>И раз есть четкие границы, напрашивается grep или sed по диапазону. У sed даже есть готовый синтаксис "от x до y":</p><p>Но так мы получаем блок вместе с маркерами. Далее, чтобы выкинуть маркеры, можно начать городить что-то вроде sed -n '/--START--/,/--END--/{/--START--/d; /--END--/d; p}'. Но это уже не для слабонервных.</p><p>grep тут вообще не поможет - он смотрит на каждую строку отдельно и не знает, внутри блока она или снаружи. А вся суть задачи именно в этом - определить, находится ли текущая строка внутри интересующего нас блока. Инструменту надо помнить, где он находится, переходя от строки к строке. То есть нужна переменная-состояние - а это как раз задача для awk:</p><p>Здесь f - флаг. По умолчанию у неинициализированной переменной значение 0 = "не печатать".</p><p>Вся "программа" - это 3 правила подряд:</p><p>/--START--/{f=1; next} - строка совпала со стартовым маркером: ставим флаг в 1 и через next сразу прыгаем к следующей строке, не доходя до печати. Сам маркер не выводится.</p><p>/--END--/{f=0} - встретили конечный маркер, обнуляем флаг.</p><p>f - это третье правило, и оно ключевое. Голое условие без блока {...} в awk значит "напечатать строку, если условие истинно" (мы это уже видели в !seen[$0]++). Здесь условие - просто значение f. Когда f равен 1,  строка печатается. Когда f равен 0, строка молча пропускается.</p><p>На выходе получаем ровно line1 и line2.</p><h2>Задача 4: соединить два файла по ключу</h2><p>Даны два файла с общим ключом в первом поле.</p><p>names.txt:</p><p>ages.txt:</p><p>Нужно соединить их по ключу-id и получить имя возраст.</p><p>По сути - обычный JOIN из SQL, только над двумя текстовыми файлами.</p><p>Как вариант, решить скриптом:</p><p>Работает, но каждая строка первого файла запускает отдельный grep по всему второму. Для 3-х строк неважно, но для файла на сотни тысяч строк это O(n²) и будет ползти очень долго.</p><p>Решение с помощью awk:</p><p>awk читает несколько файлов подряд как один поток и ведет два счетчика строк:</p><p>NR - общий номер строки с начала, сквозной по всем файлам.</p><p>FNR - номер строки внутри текущего файла, сбрасывается в 1 на каждом новом файле.</p><p>Пока awk идет по первому файлу, счетчики идут одинаково: FNR == NR. Как только awk переходит ко второму файлу, FNR обнуляется и стартует заново, а NR продолжает расти - равенство ломается. То есть FNR == NR - это способ понять, какой файл читается в данный момент.</p><p>FNR == NR {name[$1]=$2; next} - пока идем по names.txt, запоминаем: в ячейку name с ключом-id кладем имя.</p><p>{print name[$1], $2} - для каждой строки id возраст печатаем name[id] (имя, которое достаем из хэша по ключу мгновенно) и $2 (возраст).</p><h2>Задача 5: awk на реальном файле - разбор /etc/passwd</h2><p>/etc/passwd устроен так: семь полей, разделенных двоеточиями (имя, пароль-заглушка, UID, GID, комментарий, домашний каталог, login shell):</p><p>Нужно выписать имена пользователей, у которых shell - /bin/bash</p><p>Без awk эту задачу решают через grep | cut:</p><p>Работает, но с нюансом: grep '/bin/bash' матчит подстроку в любом месте строки, а не только в поле shell. Если у пользователя, скажем, домашний каталог /home/bin/bash-fan - grep его ошибочно поймает. Чтобы точно, надо якорить на конец: grep '/bin/bash$'. А потом еще cut отдельно. Два инструмента, и надо помнить про якорь.</p><p>awk же фильтрует именно по седьмому полю ($7 == "/bin/bash") - точное сравнение поля целиком, ложных срабатываний нет, и фильтр с извлечением в одной команде. Но чтобы обращаться к "седьмому полю", awk сначала надо объяснить, что поля здесь разделены не пробелами.</p><p>В предыдущих задачах было достаточно стандартного для awk разбития строк по пробелам, но тут поля через двоеточия.</p><p>Для этого у awk есть флаг -F, определяющий разделитель полей.</p><p>Пример:</p><p>С -F: поле $1 - имя, $7 - shell. Двоеточие как разделитель, все семь полей сразу доступны по номерам.</p><p>Нужны только строки, где седьмое поле равно /bin/bash:</p><p>$7 == "/bin/bash" - правило-условие: блок выполняется только для строк, где shell именно /bin/bash. Системные аккаунты с nologin отсеиваются сами. И печатаем только $1 - имя.</p><p>Ни в одной из пяти задач не пришлось тянуться за Python или склеивать пайп из четырех утилит - awk справился сам. Все потому, что это не "вырезалка колонок", а язык с ассоциативными массивами, состоянием между строками и полями.</p><p>И учить его целиком не надо. Достаточно нескольких шаблонов:</p><p>массив[ключ] += значение - суммы по группам</p><p>!seen[$0]++ - убрать дубли, сохранив порядок</p><p>f=1 … f=0 … f - вырезать блок между маркерами</p><p>FNR == NR{…; next} {…} - склеить два файла по ключу</p><p>-F: -  сменить разделитель</p><p>Задачи я взял из своего сервиса для практики в изучении Linux и DevOps - <a href="https://IzzyLab.ru" rel="nofollow">IzzyLab.ru</a>. Там команды набираешь в живом терминале в браузере, а решение проверяется автоматически по состоянию системы, а не по тому, что ты ввел. Задач по Linux и DevOps там еще несколько сотен.</p>]]></content:encoded>
    </item>
    <item>
      <title>Git умеет игнорировать файлы не только через .gitignore: три уровня защиты от мусора в репозитории</title>
      <link>https://tproger.ru/articles/git-umeet-ignorirovat-fajly-ne-tolko-cherez-gitignore-tri-uro</link>
      <comments>https://tproger.ru/articles/git-umeet-ignorirovat-fajly-ne-tolko-cherez-gitignore-tri-uro?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/git-umeet-ignorirovat-fajly-ne-tolko-cherez-gitignore-tri-uro</guid>
      <description><![CDATA[<p>Разбираем, как Git игнорирует файлы на уровне репозитория, машины и локальной копии. Узнайте, когда использовать .gitignore, .git/info/exclude и глобальный ignore.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/git-umeet-ignorirovat-fajly-ne-tolko-cherez-gitignore-tri-uro">Git умеет игнорировать файлы не только через .gitignore: три уровня защиты от мусора в репозитории</a>»</p>]]></description>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Jul 2026 05:38:39 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы работаете с Git, .gitignore для вас — привычная табличка у входа в репозиторий: сюда нельзя, туда нельзя, node_modules и .env оставьте за дверью. Но Git умеет фильтровать нежелательные файлы на трёх уровнях — и только один из них версионируется вместе с кодом. Остальные два спасают, когда правила общие не подходят: личные заметки, локальные скрипты, артефакты операционной системы.</p><p>Игнорирование в Git — это не магия, а просто набор шаблонов. Когда вы запускаете git status, Git сверяет имена файлов с тремя списками и решает, показывать их или нет. Важно: игнорируемый файл всё ещё лежит в рабочей директории, просто Git не предлагает его добавить в индекс.</p><ul><li>.gitignore — правила для всего репозитория, версионируются и делятся с командой.</li><li>.git/info/exclude — локальные правила одного клона, не попадают в коммиты.</li><li>~/.config/git/ignore — глобальные правила для всех репозиториев на машине.</li><li>git check-ignore -v filename покажет, какой именно файл игнорирует файл.</li><li>Правильный выбор уровня избавляет команду от конфликтов и лишних правок .gitignore.</li></ul><h2>Три файла, которые говорят Git «не замечай»</h2><p>Каждый из трёх файлов отвечает за свой масштаб. Отличаются они не синтаксисом — он везде одинаковый, — а областью действия и тем, попадают ли изменения в историю репозитория.</p><h3>.gitignore — общие правила репозитория</h3><p>Это классика. Файл лежит в корне проекта или в подкаталогах, попадает под контроль версий и работает одинаково у всех, кто клонирует репозиторий. Сюда стоит писать всё, что относится к проекту целиком: зависимости, сборочные артефакты, локальные конфиги IDE, тестовые базы.</p><p>Плюс очевиден: все члены команды видят одни и те же правила. Минус тоже очевиден: если правило нужно только вам, каждый раз править общий .gitignore и создавать коммит — избыточно.</p><h3>.git/info/exclude — личные правила для одного репозитория</h3><p>Внутри каталога .git каждого клона есть файл info/exclude. Он устроен так же, как .gitignore, но не входит в коммиты. Это идеальное место для файлов, которые есть только у вас: черновики, личные заметки, экспериментальные скрипты, локальные дампы.</p><p>Сценарий простой: вы держите в репозитории файл notes.txt с личными пометками. Добавлять его в .gitignore не хочется — коллегам он не нужен, а в .git/info/exclude он исчезает из git status только на вашей машине.</p><h3>~/.config/git/ignore — глобальные правила для всей машины</h3><p>Третий уровень действует на все репозитории текущего пользователя. Если у вас macOS, вы наверняка устали видеть .DS_Store в выводе git status. Вместо того чтобы добавлять его в каждый .gitignore, проще вынести на глобальный уровень.</p><p>Путь к глобальному файлу можно переопределить. Например, чтобы использовать .gitignore_global в домашней директории, выполните:</p><p>Вернуть значение по умолчанию можно командой git config --global --unset core.excludesFile.</p><h2>Как проверить, кто именно игнорирует файл</h2><p>Когда правил много, легко забыть, какой файл за что отвечает. Git предоставляет команду git check-ignore -v, которая показывает источник игнорирования: название файла с правилами, номер строки и сам шаблон.</p><p>Если файл игнорируется .gitignore, вывод будет начинаться с .gitignore; если локальным exclude — путь к нему; если глобальным ignore — путь в домашней директории. Если команда ничего не выводит, значит файл никто не игнорирует.</p><p><b>Полезно:</b><br />git check-ignore работает и с каталогами. Передайте путь к папке, чтобы узнать, почему она не попадает в индекс.</p><h2>Когда какой уровень использовать</h2><ul><li>.gitignore — правила, общие для всей команды: зависимости, сборочные артефакты, секреты.</li><li>.git/info/exclude — персональные файлы внутри одного репозитория, которые не должны светиться в коммитах.</li><li>~/.config/git/ignore — файлы ОС и редактора, которые мешают в любом проекте на вашей машине.</li></ul><p>Главный принцип: чем шире правило, тем реже его стоит менять. Глобальный ignore настраивается один раз при настройке рабочей машины, а .gitignore живёт вместе с проектом и развивается вместе с ним.</p><h2>Выводы</h2><p>Git предлагает не один, а три уровня игнорирования, и каждый решает свою задачу. .gitignore отвечает за командные договорённости, .git/info/exclude — за личный порядок в одном репозитории, а ~/.config/git/ignore — за чистоту рабочей машины в целом. Разделение уровней помогает не засорять общие правила личными исключениями и не тащить в коммиты то, что нужно только вам.</p><blockquote>Хороший .gitignore защищает команду, а правильное использование exclude и global ignore защищает ваше собственное ментальное здоровье при работе с кодом.</blockquote><p>Источник: <a href="https://nelson.cloud/.gitignore-isnt-the-only-way-to-ignore-files-in-git/" rel="noopener noreferrer">Nelson Ameyin, «.gitignore isn’t the only way to ignore files in Git»</a>.</p><p>Попробуйте проверить свои репозитории: запустите git check-ignore -v на паре подозрительных файлов — возможно, вы найдёте правила, про которые давно забыли.</p>]]></content:encoded>
    </item>
    <item>
      <title>Дайджест Android-разработки за июнь 2026: Android 17, Play и безопасность</title>
      <link>https://tproger.ru/articles/android-cli-1-0-navyki-ii-agentov-i-android-bench-ot-google</link>
      <comments>https://tproger.ru/articles/android-cli-1-0-navyki-ii-agentov-i-android-bench-ot-google?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/android-cli-1-0-navyki-ii-agentov-i-android-bench-ot-google</guid>
      <description><![CDATA[<p>Главное для Android-разработчиков в июне 2026: релиз Android 17, новые правила Google Play, zero-day CVE-2025-48595 и верификация разработчиков. Разбираем.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/android-cli-1-0-navyki-ii-agentov-i-android-bench-ot-google">Дайджест Android-разработки за июнь 2026: Android 17, Play и безопасность</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Инновации]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Jul 2026 12:30:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Июнь 2026 года выдался насыщенным для Android-разработчиков: Google выпустила Android 17 с API 37, пересмотрела комиссии и биллинг в Play, залатала активно эксплуатируемую уязвимость и продолжила накатывать верификацию разработчиков. Ниже — краткий дайджест главных событий месяца, которые стоит учитывать при планировании релизов и миграций.</p><p><b>Android 17</b> вышел 16 июня. API 37, AppFunctions для ИИ-агентов, adaptive-first и Compose-first, строгие лимиты памяти и новые API приватности.</p><p><b>Google Play</b> расширяет выбор платёжных систем и снижает комиссии: с 30 июня 2026 сервисный сбор отдельно от платёжного, первый $1M — 10%.</p><p><b>Безопасность</b>: июньский бюллетень закрыл 124 уязвимости, включая zero-day CVE-2025-48595 в Framework. С 30 сентября 2026 начинается обязательная верификация разработчиков в четырёх странах.</p><p><b>Инструменты</b>: Android CLI 1.0, 17+ Android skills, Android Bench с Gemma 4 и Gemini 3.5 Flash, Android XR SDK DP4 и Eclipsa Video для HDR.</p><h2>Android 17: релиз 16 июня и API 37</h2><p>16 июня 2026 года Google <a href="https://android-developers.googleblog.com/2026/06/Android-17.html" rel="noopener">выпустил Android 17</a>. Платформа переходит от «операционной системы» к «интеллектуальной системе»: центральную роль занимают AppFunctions — функции приложений, которые ИИ-агенты могут обнаруживать и вызывать через Jetpack-библиотеку. Разработчики аннотируют класс, добавляют KDoc, и Gemini получает доступ к локальному состоянию приложения.</p><p>Главное архитектурное изменение — <b>adaptive-first</b>: на больших экранах (sw &gt; 600 dp) для приложений с targetSdk 37 игнорируются ограничения ориентации и размера. Вместе с этим появились App Bubbles, Bubble Bar и интерактивный Picture-in-Picture для десктопа. Google заявляет, что Compose теперь является первым классом UI: View-компоненты и View-based библиотеки переведены в режим обслуживания.</p><h3>Производительность и приватность</h3><p>Android 17 вводит лимиты памяти на основе объёма RAM устройства и убивает процессы, их нарушающие. Для диагностики добавили интеграцию LeakCanary в Android Studio Panda и on-device аномалию в ProfilingManager. ART получил generational GC, а MessageQueue для targetSdk 37 стал lock-free — это ускоряет старт и снижает пропуск кадров, но ломает рефлексию над приватными полями.</p><p>Из приватных нововведений — системный Contact Picker без разрешения READ_CONTACTS, системный Eyedropper для выбора цвета, временный доступ к локальной сети через ACCESS_LOCAL_NETWORK и post-quantum криптография с ML-DSA и гибридной подписью APK v3.2.</p><h2>Инструменты и продуктивность: Android CLI 1.0, skills и Bench</h2><p>9 июня в блоге Android Developers <a href="https://android-developers.googleblog.com/2026/06/android-developer-productivity-updates.html" rel="noopener">подвели итоги I/O</a> по продуктивности. Главное — стабильный релиз Android CLI 1.0: теперь инструмент доступен через npm и Homebrew, умеет Journeys и команду studio для моста с Android Studio, а также интегрируется с Google Antigravity.</p><p>Каталог Android skills вырос до 17+ сценариев: адаптивный UI, CameraX, Perfetto SQL, Engage SDK, Wear OS, AppFunctions и другие. А Android Bench обзавёлся открытыми моделями, включая локальную Gemma 4, и свежими Gemini 3.5 Flash. В ближайшее время в бенчмарк добавят долгие многошаговые задачи.</p><h2>Google Play: биллинг, комиссии и поиск</h2><p>24 июня Google <a href="https://android-developers.googleblog.com/2026/06/play-expanded-billing.html" rel="noopener">расширила выбор платёжных систем</a> в Великобритании, ЕЭЗ и США. Разработчики могут предлагать альтернативный биллинг или внешние ссылки на свой сайт. С 30 июня 2026 сервисный сбор отделяется от платёжного: первый $1M в год — 10%, все автообновляемые подписки — 10%, остальное зависит от новой/существующей установки. Платёжная комиссия при использовании Google Play billing — 5% в этих регионах; при альтернативном биллинге она не берётся.</p><p>Также Google запустила программы Games Level Up и Apps Experience с пониженными ставками, а в Play Store появился AI-поиск Ask Play, Trusted Contributor-значки и более заметные скидки. Для разработчиков это означает, что ASO и монетизацию придётся пересматривать под новые механики отображения цен.</p><h2>Безопасность: zero-day и верификация разработчиков</h2><p>Июньский Android Security Bulletin закрыл 124 уязвимости. Самая неприятная — CVE-2025-48595 в Framework, уже эксплуатируемая в ограниченных целевых атаках. Она затрагивает Android 14–16 QPR2 и позволяет повысить привилегии без взаимодействия с пользователем. Критичный патч — уровень 2026-06-05, так как он включает исправления чипсетов Qualcomm и MediaTek.</p><p>18 июня Google <a href="https://android-developers.googleblog.com/2026/06/android-developer-verification.html" rel="noopener">обновила статус верификации разработчиков</a>. С 30 сентября 2026 в Бразилии, Индонезии, Сингапуре и Таиланде станут обязательными регистрация приложений в семи магазинах. В июне на устройствах начали раскатывать системный сервис, который позже будет проверять регистрацию. В июле–августе появятся Android Developer ID Status API и Developer Console API для массовой регистрации через CI/CD.</p><h2>Android XR: DP4, движки и Geospatial API</h2><p>15 июня вышел <a href="https://android-developers.googleblog.com/2026/06/what-is-new-android-xr.html" rel="noopener">Developer Preview 4 Android XR SDK</a>. Для очков дополненной реальности добавили Jetpack Projected с Device Availability API, а Compose Glimmer оптимизирован под прозрачные дисплеи и тачпад. Для иммерсивных приложений — ранняя версия Geospatial API на базе ARCore и Visual Positioning System.</p><p>Кроме Unity для проводных XR-очков появилась официальная поддержка Unreal Engine и Godot, а также Android XR Engine Hub — десктопный инструмент для Windows с real-time тестированием прямо во вьюпорте движка. Программа Android XR Developer Catalyst Program открыта для заявок и даёт доступ к pre-release железу.</p><h2>Premium-опыт: R8, Glance и Media3</h2><p>В посте 2 июня <a href="https://android-developers.googleblog.com/2026/06/building-premium-android-experiences-google-io-26.html" rel="noopener">о премиум-опыте</a> Google акцентировала R8 Configuration Analyzer: он показывает, какие keep-rules мешают оптимизации. Monzo за счёт настройки R8 получили 30% прирост холодного старта и 35% снижение ANR.</p><p>Jetpack Glance теперь унифицирует виджеты для телефонов, часов и автомобилей на базе Compose, а RemoteCompose позволяет рендерить UI на внешних поверхностях. Media3 получил AI Effects, CodecDB, Scrubbing Mode в ExoPlayer и улучшенный CastPlayer. CameraX 1.5+ добавляет CameraXViewfinder Composable и динамические диапазоны.</p><h2>Eclipsa Video: единый стандарт HDR</h2><p>29 июня Google <a href="https://android-developers.googleblog.com/2026/06/eclipsa-video-hdr-review.html" rel="noopener">представила Eclipsa Video</a> — стандарт HDR на базе SMPTE ST 2094-50, разработанный совместно с Apple и NBCUniversal. Он задаёт единый HDR reference white, адаптирует яркие участки под возможности дисплея и сохраняет творческий замысел кадр за кадром. Поддержка встроена в Android 17, ExoPlayer/Media3 обрабатывают метаданные автоматически.</p><h2>FAQ</h2><h2>Выводы</h2><p>Июнь 2026 показал, что Google делает ставку на три вещи: ИИ-агентов как часть рабочего процесса (AppFunctions, Android CLI, skills), адаптивность интерфейсов под любые форм-факторы и жёсткий контроль за безопасностью экосистемы. Разработчикам стоит в первую очередь протестировать приложения под Android 17, проверить R8-конфигурацию и подготовиться к новым правилам биллинга и верификации.</p><blockquote>Самый быстрый способ не отстать — поставить Android CLI, добавить пару skills под свой проект и прогнать релиз на Android 17 эмуляторе, прежде чем OEM-партнёры начнут массово раскатывать обновление.</blockquote><p>Источники: <a href="https://android-developers.googleblog.com/2026/06/Android-17.html" rel="noopener">Android 17 is here</a>, <a href="https://android-developers.googleblog.com/2026/06/android-developer-productivity-updates.html" rel="noopener">Top 3 updates for Android developer productivity</a>, <a href="https://android-developers.googleblog.com/2026/06/play-expanded-billing.html" rel="noopener">Expanded billing choice and lower fees on Google Play</a>, <a href="https://android-developers.googleblog.com/2026/06/android-developer-verification.html" rel="noopener">Android developer verification</a>, <a href="https://android-developers.googleblog.com/2026/06/what-is-new-android-xr.html" rel="noopener">What's New in Android XR</a>, <a href="https://android-developers.googleblog.com/2026/06/building-premium-android-experiences-google-io-26.html" rel="noopener">Building Premium Android Experiences</a>, <a href="https://android-developers.googleblog.com/2026/06/eclipsa-video-hdr-review.html" rel="noopener">Eclipsa Video</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что такое Git worktrees и зачем их использовать</title>
      <link>https://tproger.ru/translations/chto-takoe-git-worktrees-i-zachem-ih-ispolzovat</link>
      <comments>https://tproger.ru/translations/chto-takoe-git-worktrees-i-zachem-ih-ispolzovat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/chto-takoe-git-worktrees-i-zachem-ih-ispolzovat</guid>
      <description><![CDATA[<p>Git worktrees появились ещё в 2015 году, но популярность обрели только недавно. Разбираем, что это такое, как использовать в терминале и зачем они пригодятся.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/chto-takoe-git-worktrees-i-zachem-ih-ispolzovat">Что такое Git worktrees и зачем их использовать</a>»</p>]]></description>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 18 Jun 2026 03:00:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Перевод статьи Cassidy Williams из GitHub Blog, оригинал: <a href="https://github.blog/ai-and-ml/github-copilot/what-are-git-worktrees-and-why-should-i-use-them/">https://github.blog/ai-and-ml/github-copilot/what-are-git-worktrees-and-why-should-i-use-them/</a></p><p>Git worktrees позволяют держать несколько рабочих копий одного репозитория на разных ветках — и сейчас эта возможность в тренде. Забавно, что в Git она появилась ещё в 2015 году. Но worktrees действительно удобны, и в этой статье разберёмся, зачем они нужны, чем отличаются от обычных веток и почему внезапно стали популярны.</p><p>worktree — это дополнительная рабочая копия репозитория на другой ветке, привязанная к тому же .git.</p><p>С их помощью можно переключаться между задачами, не прерывая текущую работу и не используя stash.</p><p>Они особенно полезны при параллельной работе с ИИ-агентами и в приложении GitHub Copilot.</p><p>У worktrees есть ограничения: раздувание зависимостей, необходимость убирать папки, правила .gitignore и запрет на одновременный checkout одной ветки в нескольких worktrees.</p><h2>Переключение контекста через ветки и stash</h2><p>Представьте: вы работаете над задачей и вдруг получаете срочный баг. Нужно срочно переключить контекст.</p><p>Сначала, скорее всего, спрячете текущие изменения в stash:</p><p>Потом перейдёте на main и обновите её:</p><p>Затем создадите ветку с хотфиксом:</p><p>Пофиксите, закоммитите и запушите ветку:</p><p>После слияния pull request вы вернётесь к компьютеру, подтянете main и удалите ветку с багфиксом:</p><p>А потом сможете вернуться к задаче, над которой работали:</p><p>Фух. На чём мы остановились?</p><p>Переключение туда-сюда, перезагрузка файлов, переустановка node_modules в зависимости от того, что изменилось, — всё это отнимает много сил. Нагрузка от смены контекста серьёзная.</p><p>Это базовый пример, но иногда разработчики справлялись с таким хаосом сложными командами git stash или даже несколькими клонами одного репозитория (я сама грешила этим).</p><p>А потом появились… worktrees!</p><h2>Переключение контекста через worktrees</h2><p>С worktrees вы никогда не покидаете свою ветку и не используете stash, а редактор с вашей текущей фичей остаётся нетронутым.</p><p>Эта команда мгновенно создаёт соседнюю папку hotfix-workspace, базирует её на main и создаёт новую ветку hotfix-bug.</p><p>Теперь можно открыть эту папку в новом окне редактора (или перейти в неё через cd) и чинить баг. Исходное окно редактора остаётся в том же состоянии, в котором вы его оставили.</p><p>Pull request сливаете онлайн, как обычно, а после слияния можно просто удалить временную папку.</p><p>Гораздо плавнее! Нет риска конфликтов stash, редактор не перезагружается, и вы действительно можете работать параллельно.</p><h2>Так почему же сейчас?</h2><p>Долгое время worktrees были относительно неизвестны. Большинство разработчиков никогда о них не слышали, потому что либо Git GUI не поддерживали их (или относились как к второсортной функции), либо все привыкли к знакомой схеме: feature-ветка, работа, PR, merge и повтор.</p><p>Сейчас наша работа изменилась. ИИ заставляет нас работать параллельно больше, чем когда-либо в истории разработки ПО. Разработчики запускают множество сессий одновременно, а «культура код-ревью» растёт быстрее, чем «культура написания кода».</p><p>Агенты и люди могут делать больше параллельно с помощью worktrees. Это режим по умолчанию в приложении GitHub Copilot и во многих других современных инструментах.</p><blockquote>Агенты и люди могут делать больше параллельно с помощью worktrees.</blockquote><h2>В чём подвох?</h2><p>Worktrees решают кучу проблем, но есть нюансы, на которые стоит обращать внимание.</p><ul><li>Раздувание зависимостей: каждая папка worktree требует собственную копию зависимостей проекта. Если запускать npm install или pip install в нескольких worktrees, диск может быстро закончиться.</li><li>Управление папками: нужно удалять папки worktree, чтобы со временем не засорять родительский каталог. Приложение GitHub Copilot часто делает это за вас, но если вы работаете в терминале, придётся следить самостоятельно.</li><li>Требования к глобальному .gitignore: если создавать worktree внутри основного репозитория, их нужно вручную добавить в .gitignore, чтобы случайно не закоммитить. Можно создавать worktree за пределами основного репозитория (GitHub Copilot делает это по умолчанию), но это стоит учитывать.</li><li>Ограничение «одна ветка»: Git не позволяет одновременно checkout’ить одну и ту же ветку в двух разных worktrees, чтобы избежать повреждения данных.</li></ul><h2>Как использовать git worktrees в приложении GitHub Copilot?</h2><p>Отличный вопрос! Здорово, что там всё работает «из коробки». Когда вы открываете приложение, на главном экране есть выпадающий список, который спрашивает, где запускать новую сессию. По умолчанию выбран новый worktree.</p><p>Когда вы запускаете новую сессию, можно нажать на имя сессии вверху приложения и увидеть (забавное!) сгенерированное имя вашего worktree, а также путь, где он находится, проект, для которого он создан, и сведения о внесённых изменениях.</p><p>Проще простого!</p><h2>Стоит ли использовать worktrees?</h2><p>Я дам вам самый senior-ответ, который только можно: зависит от ситуации! Вам может быть удобнее работать по-другому. Возможно, вы не так много работаете параллельно и привыкли к ментальной модели веток и stash. Возможно, теперь вы будете использовать только worktrees. А может, захотите и то, и другое!</p><p>Мир у ваших ног, и попробовать всё это можно уже сегодня в приложении GitHub Copilot.</p><p><b>Об авторе.</b> Cassidy Williams — старший директор по адвокации разработчиков в GitHub. Она создаёт ПО, консультирует стартапы и учит разработчиков строить лучше. Подписаться на её еженедельную рассылку можно на <a href="https://cassidoo.co/newsletter">cassidoo.co/newsletter</a>.</p><h2>Выводы</h2><p>Git worktrees — способ работать с несколькими ветками одновременно, не прерывая текущую задачу и не рискуя запутаться в stash. Они особенно удобны при параллельной работе с ИИ-агентами и встроены в приложение GitHub Copilot по умолчанию. Попробуйте — возможно, именно они упростят ваш рабочий процесс.</p>]]></content:encoded>
    </item>
    <item>
      <title>Трюки в терминале, которые реально экономят время (и нервы)</title>
      <link>https://tproger.ru/translations/tryuki-v-terminale--kotorye-realno-ekonomyat-vremya--i-nervy-</link>
      <comments>https://tproger.ru/translations/tryuki-v-terminale--kotorye-realno-ekonomyat-vremya--i-nervy-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Картофельный Повелитель]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/tryuki-v-terminale--kotorye-realno-ekonomyat-vremya--i-nervy-</guid>
      <description><![CDATA[<p>Ctrl+W, Ctrl+R, sudo !!, cd -, brace expansion и другие приёмы работы в шелле, которым почему-то не учат. Универсальные POSIX-трюки и фишки Bash/Zsh.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/tryuki-v-terminale--kotorye-realno-ekonomyat-vremya--i-nervy-">Трюки в терминале, которые реально экономят время (и нервы)</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 27 Mar 2026 15:39:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>Есть особый вид боли — наблюдать, как талантливый инженер зажимает Backspace на шесть секунд, чтобы исправить опечатку в начале строки.</p><p>Мы все там были. Выучили ls, cd и grep — и на этом остановились. Терминал стал местом, где мы живём, но обустроить его мы так и не удосужились. Мы миримся с тем, что какие-то действия требуют 40 нажатий, хотя авторы шелла решили нашу проблему ещё в 1989 году.</p><p>Вот подборка приёмов, которые не то чтобы секретные — но которым почему-то не учат. Разделим их на две группы: <b>универсальные</b> (работают почти в любом POSIX-шелле) и <b>для Bash/Zsh</b> (интерактивные фишки).</p><p><b>TL;DR:</b> Ctrl+W удаляет слово, Ctrl+U — строку до курсора, Ctrl+R ищет по истории, !! повторяет предыдущую команду (незаменимо для sudo !!), а cd - возвращает в предыдущую директорию. Начните хотя бы с этих пяти.</p><h2>Универсальные: работают (почти) везде</h2><p>Эти приёмы опираются на стандартные привязки клавиш Emacs-стиля через Readline. Даже если вы подключились по SSH к роутеру 2009 года выпуска или минимальному Alpine-контейнеру — они будут работать.</p><h3>Замена Backspace</h3><ul><li><b>Ctrl+W</b> — удалить слово перед курсором. Набрали /var/log/nginx/, а нужно было /var/log/apache2/? Одно нажатие вместо 7 Backspace</li><li><b>Ctrl+U</b> — вырезать всё от курсора до начала строки. Набрали длинную команду rsync, но сначала нужно проверить директорию? Ctrl+U вырезает, а <b>Ctrl+Y</b> вставляет обратно</li><li><b>Ctrl+K</b> — то же самое, но вырезает от курсора до конца строки</li><li><b>Ctrl+A</b> и <b>Ctrl+E</b> — прыжок в начало и конец строки. Забудьте про Home и End — они далеко от домашнего ряда</li><li><b>Alt+B</b> и <b>Alt+F</b> — перемещение по словам назад и вперёд. Быстрый аналог стрелок (на Mac нужно настроить Option как Meta в терминале)</li></ul><h3>Терминал показывает иероглифы?</h3><p>Случайно сделали cat на бинарник — и терминал превратился в месиво символов? Наберите вслепую reset и нажмите Enter. Терминал восстановится. Альтернатива — stty sane.</p><h3>Экстренные выходы</h3><ul><li><b>Ctrl+C</b> — отменить текущую команду. Ваш аварийный выход, когда что-то зависло</li><li><b>Ctrl+D</b> — отправить EOF. Если командная строка пуста — разлогинит из шелла. Осторожнее!</li><li><b>Ctrl+L</b> — очистить экран, не прерывая набор текущей команды. Удобнее, чем clear</li></ul><h3>Прыгаем между директориями</h3><p><b>cd -</b> — переключение между двумя последними директориями. Вы в /usr/local/etc/postfix, перешли в /var/log посмотреть логи — cd - вернёт обратно. Как кнопка «последний канал» на пульте.</p><p><b>pushd</b> и <b>popd</b> — если cd - это переключатель, то pushd это стек. pushd /etc перейдёт в /etc, запомнив предыдущую директорию. popd снимет её со стека и вернёт вас.</p><h3>Мгновенная очистка файла и последний аргумент</h3><p><b>&gt; file.txt</b> — очищает файл, сохраняя права и не прерывая процессы. <b>$_</b> — последний аргумент предыдущей команды:</p><h3>Страховка для скриптов</h3><ul><li><b>-e</b> — останов при ошибке (нюансы с if и пайпами)</li><li><b>-u</b> — ошибка при несуществующей переменной. Спасёт от rm -rf /usr/local/${OPECHATKA}/*</li><li><b>-o pipefail</b> — ошибка в любом звене пайпа = ошибка всей цепочки</li></ul><h2>Bash и Zsh: зона комфорта</h2><h3>Поиск по истории и «sudo !!»</h3><p><b>Ctrl+R</b> — обратный поиск по истории. Начните вводить часть команды — шелл найдёт её. <b>!!</b> — повторить предыдущую команду. Классика: получили «Permission denied» — sudo !!.</p><h3>Редактор, brace expansion и процессы</h3><p><b>Ctrl+X, Ctrl+E</b> — открывает текущую команду в $EDITOR. <b>fc</b> — то же для предыдущей команды. <b>Esc+.</b> — вставляет последний аргумент прямо на месте курсора. Брейс-экспаншн для быстрых операций:</p><h3>Спасти процесс от обрыва SSH</h3><p>Терминал — это набор инструментов, а не полоса препятствий. Возьмите один приём, используйте его неделю — и переходите к следующему.</p><p>Источник: <a href="https://blog.hofstede.it/shell-tricks-that-actually-make-life-easier-and-save-your-sanity/">Shell Tricks That Actually Make Life Easier</a> — Hofstede Blog</p>]]></content:encoded>
    </item>
    <item>
      <title>От ffmpeg до торрентов для терминала: 7 новых TUI-инструментов, которые советуем</title>
      <link>https://tproger.ru/articles/ot-ffmpeg-do-torrentov-dlya-terminala--7-novyh-tui-instrumentov--kotorye-sovetuem</link>
      <comments>https://tproger.ru/articles/ot-ffmpeg-do-torrentov-dlya-terminala--7-novyh-tui-instrumentov--kotorye-sovetuem?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ot-ffmpeg-do-torrentov-dlya-terminala--7-novyh-tui-instrumentov--kotorye-sovetuem</guid>
      <description><![CDATA[<p>Конвертация видео, создание лицензий, поиск торрентов и даже часы — всё это теперь можно делать прямо в консоли без GUI.​</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ot-ffmpeg-do-torrentov-dlya-terminala--7-novyh-tui-instrumentov--kotorye-sovetuem">От ffmpeg до торрентов для терминала: 7 новых TUI-инструментов, которые советуем</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 24 Feb 2026 09:05:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие разработчики продолжают переключаться в браузер или GUI-приложения для простых задач — конвертировать видео, добавить лицензию, скачать торрент. Собрали подборку свежих TUI-инструментов, которые закрывают эти боли и позволяют не выходить из консоли.​</p><h2>1. MONICA — ffmpeg без боли</h2><p>MONICA — это интерактивная надстройка над ffmpeg, которая избавляет от необходимости каждый раз гуглить или спрашивать у GPT нужные команды.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-20/eb8a885d-3304-443a-8f09-47d30efbb6e8.jpg" alt="" /></figure><p>Закидываете файлы в папку /import, запускаете инструмент, стрелками выбираете операцию (конвертировать, извлечь аудио, изменить размер), результат появляется в /export.​</p><p>Идея в том, что если вы часто делаете одни и те же операции, не нужно каждый раз ничего вводить — просто тыкаете в меню и не тратите токены на запросы к ИИ. Рецепты операций хранятся в JSON, можно добавлять свои. Если ffmpeg не установлен, MONICA сама его скачает. Инструмент работает пакетно — можно накидать несколько файлов и обработать все за раз.​</p><p>Установка через клонирование репозитория:</p><p><a href="https://github.com/Ssenseii/monica/tree/main">Код доступен на GitHub</a>, при написании мог применяться ИИ, но сама утилита рабочая.​</p><h2>2. lic — лицензии одной командой</h2><p>Знакомая ситуация: создаёте новый репозиторий, нужна лицензия, идёте на choosealicense.com, копируете текст, вставляете, правите год и имя. lic делает это одной командой в терминале.​</p><p>Запускаете lic, выбираете лицензию из TUI-меню, вводите имя и год — готово. Файл LICENSE создаётся в текущей директории. Данные берутся из официальной базы лицензий GitHub.​</p><p>Установка:</p><p>Проект свежий — вышел в конце декабря 2024 года, но уже набрал 21 звезду и попал в Homebrew. <a href="https://github.com/kushvinth/lic">Код доступен на GitHub</a>, смотрите демо на видео.</p><h2>3. PNANA — редактор между nano и vim</h2><p>Терминальные редакторы живут где-то между «слишком просто» (nano) и «нужна неделя на изучение» (vim). PNANA пытается занять золотую середину — взять простоту nano, современный UI от micro и продуктивные возможности Sublime.​</p><p>Проект выложили буквально на днях. По сути это TUI-редактор на C++17 с использованием библиотеки FTXUI. Идея в том, чтобы можно было просто открыть и работать, без изучения мануалов. При этом есть поддержка tree-sitter для подсветки синтаксиса. FTXUI под капотом даёт кроссплатформенность, поддержку UTF-8, мыши и анимаций.​</p><p>Запуск:</p><p>Бинарных релизов пока нет, нужно собирать из исходников. <a href="https://github.com/Cyxuan0311/PNANA/blob/master/README_EN.md">Код на GitHub</a>, смотрите демо на видео.​</p><h2>4. CodeWeaver — весь код в одном Markdown-файле</h2><p><a href="https://github.com/tesserato/CodeWeaver">CodeWeaver</a> — это удобный CLI-инструмент, который собирает вашу кодовую базу в один читаемый документ: дерево файлов плюс содержимое каждого файла в code-блоках.​</p><p>Зачем это нужно? Скормить проект ИИ-ассистенту одним файлом (Cursor, Claude, ChatGPT), поделиться структурой проекта с коллегой или создать документацию.​</p><p>Что умеет:</p><ul><li>Рекурсивный обход директорий с tree-view​</li><li>Фильтрация через regex: -include, -ignore​</li><li>Автоматическое исключение бинарников​</li><li>Копирование в буфер обмена: -clipboard​</li><li>Логи включённых и исключённых файлов​</li></ul><p>Установка:</p><p>Пример использования:</p><p>Получаете один codebase.md со всей структурой и кодом — готов для вставки в чат с ИИ.</p><h2>5. clox — часы прямо в терминале</h2><p>У clox вышла новая версия 1.3 — это консольные часы и календарь, которые показывают время прямо в терминале. Инструмент рассчитан на то, что вы всё делаете в командной строке и хотите иметь под рукой аккуратное текстовое отображение времени и даты.​</p><p>clox умеет показывать время в нужном часовом поясе, поддерживает ручные смещения, календарный режим и разные форматы даты. Часы рисуются псевдографикой, есть разные циферблаты, можно включать и выключать мигание, скрывать дату и пояс, переключать 12/24-часовой формат.​</p><p><b>Быстрый старт:</b> устанавливаете пакет как обычный модуль Python: pip install clox==1.3. После этого достаточно запустить clox в терминале, чтобы увидеть часы, или python -m clox; завершение через Ctrl+C.</p><p>Можно поиграться с аргументами: выбрать вариант отображения clox --face=3, указать пояс clox --timezone="Etc/GMT+7" или включить календарь clox --calendar=month.​</p><p><a href="https://github.com/sepandhaghighi/clox">Код в репозитории</a>, смотрите пример работы на видео.​</p><h2>6. Torrra v2 — торрент-клиент в TUI</h2><p>Вышла вторая версия Torrra — это TUI-клиент, который позволяет искать и качать торренты прямо из консоли, без браузера и без отдельного GUI-клиента. Сделан на Python, интерфейс собран на Textual, так что всё выглядит аккуратно и отзывчиво.​</p><p>Можно подключаться к своим индексаторам Jackett или Prowlarr, смотреть результаты поиска и выбирать чем качать — через встроенный движок на базе libtorrent или передать внешний magnet в свой любимый клиент. Автор утверждает, что в версии v2 серьёзно ускорил UI, улучшил навигацию, прокачал поиск и работу с несколькими торрентами сразу, плюс почистил интеграцию с индексаторами и отполировал раскладку интерфейса.​</p><p>Установит можно через pipx install torrraлибо можно взять пакеты из AUR, Homebrew, докер-образ или готовые бинарники под основные платформы.​</p><p>После установки минимальный сценарий такой: поднимаете Jackett или Prowlarr, запускаете:</p><p>А дальше стрелками ходите по списку, Enter — скачать, p — пауза, r — продолжить, q — выйти.</p><p>Поведение можно подкрутить через config.toml: задать дефолтные индексаторы, пути, какие клиенты использовать, чтобы каждый раз не вбивать одно и то же в аргументах. Проект кроссплатформенный (Linux/macOS/Windows) и живой: есть документация и регулярные релизы.​</p><p><a href="https://github.com/stabldev/torrra">Код в репозитории</a>, смотрите демо работы на видео.​</p><h2>7. Git graph — история веток одной строкой</h2><p>Полезная команда для терминала — компактный и наглядный вывод истории git:​</p><p>Она рисует ветки в виде графа, показывает автора, дату, теги, хэши и сообщения — аккуратно в одну строку. Читать историю становится в разы приятнее.​</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-01-20/70c6bab9-dd43-46c2-8173-d241a6ef0dc1.jpeg" alt="" /></figure><p>Чтобы не печатать каждый раз, можно добавить алиас в .bashrc</p><p>или .zshrc:</p><p>Так не нужно будет ничего запоминать или сохранять, просто вбиваете graph — и получаете весь git-граф прямо в консоли. Красиво, удобно и без лишних утилит.​</p><p>Все семь инструментов объединены идеей продуктивности в терминале — каждый решает конкретную боль разработчика. Большинство свежие (конец 2024 — начало 2025 года) и активно развиваются. Попробуйте те, что закрывают ваши задачи — возможно, некоторые GUI-приложения вам больше не понадобятся.​</p>]]></content:encoded>
    </item>
    <item>
      <title>15 полезных команд терминала macOS для новичков</title>
      <link>https://tproger.ru/articles/15-poleznyh-komand-terminala-macos-dlya-novichkov</link>
      <comments>https://tproger.ru/articles/15-poleznyh-komand-terminala-macos-dlya-novichkov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/15-poleznyh-komand-terminala-macos-dlya-novichkov</guid>
      <description><![CDATA[<p>Команды терминала macOS для новичков: поиск файлов, очистка диска, управление процессами, скрытые настройки системы. Синтаксис и примеры для каждой команды.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/15-poleznyh-komand-terminala-macos-dlya-novichkov">15 полезных команд терминала macOS для новичков</a>»</p>]]></description>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 13 Dec 2025 12:20:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Обзор базовых команд терминала macOS, которые пригодятся в повседневной работе.</p><p><b>Вы научитесь</b>:</p><ul><li>находить потерянные файлы,</li><li>проверять скорость интернета,</li><li>переименовывать сотни документов одной строкой,</li><li>убивать зависшие процессы без перезагрузки,</li><li>включать скрытые функции, которых нет в настройках.</li></ul><p>Каждую команду объясняем простым языком, показываем синтаксис и приводим примеры использования.</p><h2>Как найти любой файл за пару секунд</h2><p>Команда find ищет файлы и папки по критериям. Finder тоже умеет искать, но через терминал вы получаете точный контроль над параметрами поиска.</p><p>Синтаксис:</p><p>Попробуем найти все PDF-файлы в папке «Документы»:</p><p>Символ «~» обозначает вашу домашнюю папку. Звёздочка «*» заменяет любую последовательность символов, поэтому «*.pdf» означает «все файлы с расширением pdf».</p><p>Больше примеров:</p><p>Команда find пригодится, когда:</p><ul><li>Вы не помните, куда сохранили файл.</li><li>Нужно найти все скриншоты или документы определённого типа.</li><li>Хотите очистить диск от больших файлов, но не знаете, где они лежат.</li></ul><h2>Как узнать, что съедает место на диске</h2><p>Команда du (disk usage) показывает, сколько места занимают папки и файлы.</p><p>Самый полезный вариант использования:</p><p>Флаг «-s» выводит итоговый размер каждого элемента, «-h» форматирует числа в человекочитаемый вид (килобайты, мегабайты, гигабайты).</p><p>Результат выглядит так:</p><ul><li>1.8G — /Users/username/Downloads/video.mp4</li><li>46M — /Users/username/Downloads/archive.zip</li><li>7.9M — /Users/username/Downloads/document.pdf</li></ul><p>Найдём 10 самых больших папок в домашней директории:</p><p>Здесь команды объединены через символ «|». Результат du передаётся в «sort», который сортирует по размеру в обратном порядке, «head» оставляет только первые 10 строк.</p><p>Функции du пригодятся, когда:</p><ul><li>MacOS предупреждает о нехватке места на диске.</li><li>Хотите понять, какие папки разрослись за время использования.</li><li>Нужно решить, что удалить или перенести на внешний накопитель.</li></ul><h2>Как скачать файл по ссылке без браузера</h2><p>Команда curl загружает файлы из интернета напрямую в указанную папку. Это быстрее, чем открывать браузер, и удобнее для больших файлов.</p><p>Базовый синтаксис:</p><p>Флаг «-O» сохраняет файл с оригинальным именем в текущую папку.</p><p>Чтобы сохранить файл с другим именем:</p><p>Продолжить прерванную загрузку:</p><p>Флаг «-C -» проверяет, сколько уже скачано, и продолжает с того места, где загрузка прервалась.</p><p>Показать прогресс загрузки:</p><p>Флаг «-#» отображает прогресс-бар вместо технической информации.</p><p>Перед загрузкой перейдите в нужную папку командой cd /путь/к/папке, иначе файл сохранится в текущей директории (по умолчанию — домашняя папка).</p><h2>Как быстро просмотреть содержимое текстового файла</h2><p>Команда cat показывает весь файл целиком.</p><p>Текст выводится прямо в терминал. Подходит для коротких файлов.</p><p>Команда head показывает начало файла.</p><p>Число после «-» задаёт количество строк. В данном случае head покажет первые 20 строк.</p><p>Команда tail выводит конец файла:</p><p>Так удобнее просматривать логи, где свежие записи добавляются в конец файла.</p><p>Команда less запускает постраничный просмотр:</p><p>Навигация:</p><ul><li>пробел — следующая страница;</li><li>b — предыдущая страница;</li><li>/слово — поиск по файлу;</li><li>q — выход.</li></ul><h2>Как изменить скрытые настройки macOS</h2><p>Команда defaults управляет системными настройками macOS. Включая те, которых нет в стандартных «Настройках». Apple хранит параметры в файлах формата .plist, и defaults редактирует их напрямую.</p><p>Показать скрытые файлы в Finder:</p><p>Строка «killall Finder» перезапускает Finder, чтобы изменения вступили в силу.</p><p>Изменить формат скриншотов с PNG на JPG:</p><p>JPG-файлы занимают меньше места, что удобно, если вы регулярно делаете скриншоты.</p><p>Изменить папку сохранения скриншотов:</p><p>Теперь скриншоты перестанут захламлять рабочий стол.</p><p>Ускорить анимацию Dock:</p><p>Первая команда убирает задержку перед появлением Dock, вторая ускоряет саму анимацию.</p><p>Вернуть настройку к значению по умолчанию:</p><p>Команда defaults пригодится, если:</p><ul><li>Хотите настроить систему под себя, но в «Настройках» нет нужной опции.</li><li>Раздражают стандартные анимации или поведение интерфейса.</li><li>Нужно оптимизировать рабочее окружение.</li></ul><p>Перед изменением настроек запишите текущее значение. Посмотреть его можно командой «defaults read». Например, «defaults read com.apple.screencapture type».</p><h2>Как управлять процессами и освобождать ресурсы системы</h2><p>Команда top показывает запущенные процессы в реальном времени: какие программы потребляют процессор и память.</p><p>Запуск:</p><p>Экран обновляется каждые несколько секунд. Вы увидите таблицу с колонками:</p><ul><li>PID — идентификатор процесса;</li><li>COMMAND — название программы;</li><li>%CPU — процент использования процессора;</li><li>MEM — использование памяти.</li></ul><p>Управление внутри:</p><ul><li>q — выход;</li><li>o cpu — сортировка по использованию процессора;</li><li>o mem — сортировка по использованию памяти.</li></ul><p>Чтобы завершить зависший процесс, найдите PID процесса в top или через команду «pgrep -l "название_программы"».</p><p>Затем завершите процесс:</p><p>Если процесс не реагирует на обычный kill:</p><p>Флаг «-9» принудительно завершает процесс без возможности сохранить данные.</p><p>Когда пригодится:</p><ul><li>Вентиляторы Mac работают на полную, и непонятно, какая программа нагружает систему.</li><li>Приложение зависло и не закрывается обычным способом.</li><li>Хотите понять, куда уходят ресурсы компьютера.</li></ul><p>Команда htop показывает ту же информацию в более удобном виде, но её нужно установить отдельно через Homebrew.</p><h2>Как упростить ввод длинных команд</h2><p>Терминал macOS поддерживает <b>алиасы</b> — короткие команды, которые заменяют длинные.</p><p>Создать временный алиас (работает до закрытия терминала):</p><p>Теперь команда «ll» выводит содержимое папки в подробном формате, включая скрытые файлы.</p><p>Чтобы создать постоянный алиас, откройте файл конфигурации Zsh:</p><p>Добавьте строку с алиасом в конец файла. Сохраните файл (Ctrl+O, затем Enter) и выйдите (Ctrl+X).</p><p>Примените изменения:</p><p>Примеры полезных алиасов:</p><p>Команда alias пригодится, если вы часто выполняете одни и те же длинные команды или хотите создать свои «горячие клавиши» для терминала.</p><h2>Как узнать информацию о своём Mac одной командой</h2><p>Чтобы выяснить, какой процессор стоит в Mac, сколько оперативной памяти установлено или какая версия macOS запущена, обычно открывают меню «Об этом Mac». Терминал даёт гораздо больше информации и делает это быстрее.</p><p>Команда system_profiler выводит подробные сведения о железе и программном обеспечении. Для обзора основных характеристик введите:</p><p>Терминал покажет модель Mac, идентификатор модели, название процессора, количество ядер, объём оперативной памяти и серийный номер. Информация пригодится при обращении в поддержку Apple или при продаже устройства.</p><p>Для просмотра информации о дисках:</p><p>Отобразится название каждого тома, файловая система, общий объём и свободное место.</p><p>Если хотите узнать всё о сетевых интерфейсах:</p><p>Команда выведет список всех Wi-Fi, Ethernet, Bluetooth PAN. Для каждого интерфейса отобразится IP-адрес, MAC-адрес и статус подключения.</p><p>Полный отчёт о системе:</p><p>Команда сохраняет подробный отчёт в текстовый файл на рабочем столе. Файл содержит информацию обо всём: от установленных приложений до подключённых USB-устройств.</p><h2>Как проверить скорость интернета и сетевые соединения</h2><p>Команда ping отправляет тестовые пакеты на указанный адрес и измеряет время ответа:</p><p>Терминал начнёт отправлять запросы и показывать время отклика в миллисекундах. Нормальный пинг до крупных сайтов — 20-100 мс.</p><p>Чтобы остановить ping, нажмите «Ctrl+ C». Для отправки определённого количества запросов добавьте флаг «-c»:</p><p>Команда отправит ровно 10 пакетов и покажет статистику: минимальное, среднее и максимальное время отклика с процентами потерянных пакетов.</p><p>В macOS Monterey и новее появилась встроенная утилита для измерения скорости интернета:</p><p>Команда измерит скорость загрузки и выгрузки, покажет показатель RPM (Round-trips Per Minute) — он отражает отзывчивость соединения. Тест занимает около 15-20 секунд.</p><h2>Как очистить кэш DNS при проблемах с сайтами</h2><p>Иногда сайт не открывается, хотя интернет работает нормально. Или сайт переехал на другой сервер, но браузер упорно показывает старую версию. Причина в кэше DNS, для очистки используйте комбинацию двух команд:</p><p>Система запросит пароль администратора. После выполнения кэш очистится, и macOS начнёт заново запрашивать адреса сайтов у DNS-серверов.</p><p>Когда это помогает:</p><ul><li>Сайт не открывается, хотя у других пользователей работает.</li><li>После смены DNS-серверов в настройках сети.</li><li>При разработке, когда переключаетесь между локальным и рабочим сервером.</li><li>Когда сайт переехал на новый хостинг, но отображается старая версию.</li></ul><p>Проверить текущий DNS-кэш нельзя — Apple не предоставила такой команды. Очистка занимает секунду и ничего не ломает, поэтому при проблемах с доступом к сайтам стоит попробовать.</p><h2>Как создавать и распаковывать архивы</h2><p>Finder умеет создавать ZIP-архивы через контекстное меню. Терминал даёт больше контроля: выбор степени сжатия, исключение определённых файлов, работа с разными форматами архивов.</p><p>Создание ZIP-архива из папки:</p><p>Флаг «-r» означает рекурсивную обработку — в архив попадут все вложенные папки и файлы. Без этого флага заархивируется только сама папка.</p><p>Создание архива с паролем:</p><p>Флаг «-e» включает шифрование. Терминал дважды попросит ввести пароль. Без этого пароля распаковать архив не получится.</p><p>Исключение определённых файлов:</p><p>Команда создаст архив проекта, но пропустит служебные файлы .DS_Store и папку node_modules.</p><p>Распаковка ZIP-архива:</p><p>Архив распакуется в текущую директорию. Для распаковки в конкретную папку:</p><h2>Как узнать историю введённых команд и повторить их</h2><p>После нескольких дней работы с терминалом накапливается история команд. Вместо того чтобы вспоминать и заново набирать длинную строку, её можно найти в истории.</p><p>Просмотр последних команд:</p><p>Терминал выведет пронумерованный список всех введённых команд. По умолчанию Zsh хранит 1000 последних команд.</p><p>Для поиска конкретной команды используйте grep:</p><p>Эта команда покажет только строки, содержащие слово «docker».</p><p>Повторение последней команды:</p><p>Два восклицательных знака выполнят предыдущую команду.</p><p>Очистка истории (если вводили что-то конфиденциальное):</p><p>Для полной очистки, включая файл истории:</p><h2>Как переименовать много файлов одной командой</h2><p>Переименование одного файла — это стандартная задача, для неё необязательно открывать терминал. Зато в ситуации, когда нужно переименовать 500 фотографий или добавить префикс к сотне документов, использование Finder превращается в пытку.</p><p>Базовое переименование одного файла через терминал:</p><p>Команда mv (move) перемещает файл. Если указать тот же каталог, но другое имя — файл переименуется.</p><p>Массовое переименование с добавлением префикса:</p><p>Цикл пройдёт по всем JPG-файлам в текущей папке и добавит к каждому префикс «vacation_». Файл «IMG_001.jpg» станет «vacation_IMG_001.jpg».</p><p>Замена части имени во всех файлах:</p><p>Конструкция ${file/IMG/Photo} заменяет «IMG» на «Photo» в имени файла. Файл «IMG_001.jpg» станет «Photo_001.jpg».</p><p>Добавление даты к имени файла:</p><p>Каждый PDF-файл получит префикс с текущей датой в формате «2025-01-15_».</p><p>Изменение расширения файлов:</p><p>Конструкция ${file%.jpeg} удаляет расширение .jpeg, а затем добавляется .jpg.</p><h2>Как выключить или перезагрузить Mac из терминала</h2><p>Немедленная перезагрузка:</p><p>Система запросит пароль и сразу начнёт перезагрузку. Несохранённые данные в приложениях будут потеряны.</p><p>Перезагрузка через определённое время:</p><p>Mac перезагрузится через 5 минут. Таймер даст время сохранить работу в других приложениях.</p><p>Выключение Mac:</p><p>Флаг «-h» означает «halt» — полное выключение.</p><p>Выключение в определённое время:</p><p>Mac выключится в 23:00.</p><p>Отмена запланированного выключения:</p><p>Если передумали, команда отменит запланированное выключение.</p><p>Усыпление Mac:</p><p>Команда не требует sudo и мгновенно переводит Mac в режим сна.</p><h2>Как открыть файл или папку в нужном приложении</h2><p>Команда open связывает терминал с графическим интерфейсом macOS.</p><p>Открытие текущей папки в Finder:</p><p>Точка означает текущую директорию. Команда пригодится, когда вы перешли в нужную папку через терминал и хотите продолжить работу в Finder.</p><p>Открытие конкретной папки:</p><p>Finder откроет папку «Загрузки».</p><p>Открытие файла в приложении по умолчанию:</p><p>PDF откроется в программе, назначенной по умолчанию для этого типа файлов (обычно «Просмотр»).</p><p>Открытие файла в конкретном приложении:</p><p>Флаг «-a» указывает приложение. Файл project.py откроется в VS Code, даже если по умолчанию Python-файлы открываются в другом редакторе.</p><p>Открытие нескольких файлов:</p><p>Все JPG-файлы в текущей папке откроются в приложении для просмотра изображений.</p><p>Показать файл в Finder (не открывая):</p><p>Флаг «-R» откроет Finder и выделит указанный файл. Полезно, чтобы определить расположение файла.</p><h2>Итоги</h2><p>Начните с команд find, du и cat. Они решают повседневные задачи: найти потерянный файл, выяснить, что занимает место на диске, быстро просмотреть содержимое документа.</p><p>После освоения базы переходите к связкам команд. Например, find находит файлы, а du показывает их размер — вместе они помогают очистить диск.</p><p>Для специфичных задач используйте:</p><ul><li>ping и networkQuality — диагностируют проблемы с интернетом;</li><li>top — выявляет программы, загружающие процессор;</li><li>kill — завершает зависшие процессы;</li><li>defaults — настраивает скрытые параметры интерфейса;</li><li>цикл for с командой mv — переименовывает сотни файлов за секунды;</li><li>history возвращает ранее введённые строки.</li></ul><p>Сохраните эту подборку и обращайтесь к ней по мере необходимости. Через пару недель регулярного использования команды запомнятся сами.</p>]]></content:encoded>
    </item>
    <item>
      <title>7 команд в GIT которые реально экономят время и нервы</title>
      <link>https://tproger.ru/articles/7-komand-v-git-kotorye-realno-ekonomyat-vremya-i-nervy</link>
      <comments>https://tproger.ru/articles/7-komand-v-git-kotorye-realno-ekonomyat-vremya-i-nervy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/7-komand-v-git-kotorye-realno-ekonomyat-vremya-i-nervy</guid>
      <description><![CDATA[<p>Полезные Git-команды для быстрой и безопасной работы с ветками, коммитами и откатами: от git bisect до cherry-pick — с примерами и пояснениями.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/7-komand-v-git-kotorye-realno-ekonomyat-vremya-i-nervy">7 команд в GIT которые реально экономят время и нервы</a>»</p>]]></description>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 30 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>1. git bisect — быстро находим ломающийся коммит</h2><p>Допустим, у нас сломался билд после релиза версии v2.0.0. Последняя стабильная версия — v1.2.0. Проблема появилась где-то между ними. В такой ситуации можно искать причину наугад, а можно воспользоваться git bisect. Эта команда использует бинарный поиск, чтобы найти самый первый коммит с багом:</p><p>Мы запускаем git bisect start, далее, при помощи git bisect bad и git bisect good, указываем диапазон коммитов, от нерабочего до стабильного. Git сам начнёт переключать нас между промежуточными версиями. Например, если коммитов 50, то он отправит нас на 25-й.</p><p>Далее мы проверяем этот коммит: если баг сохраняется, то отмечаем его как «плохой» с помощью git bisect bad; если баг исчез — отмечаем «хороший» через git bisect good. Git снова разделит диапазон пополам и отправит на следующий коммит для проверки. Так продолжается до тех пор, пока не останется один коммит, который внёс баг.</p><h2>2. git switch — переключаемся между ветками без checkout</h2><p>В любой активной разработке приходится прыгать между разными задачами. Раньше для этого использовали git checkout. Команда по возможностям напоминает швейцарский нож: она может не только переключать между ветками, но и заменять файлы, создавать новые ветки и даже возвращать отдельные коммиты. Из-за такой универсальности git checkout часто путает новичков (да и опытных разработчиков тоже), можно легко потерять все изменения из-за случайной ошибки.</p><p>В 2019 году в Git появилась отдельная команда — git switch. Она делает ровно одну вещь: быстро и безопасно переключает между ветками или создаёт новую. Ошибиться здесь сложно.</p><p>Примеры использования:</p><p>В этом примере мы сначала быстро переключаемся на ветку «new-login» с новой фичей, чтобы что-то проверить, а потом одной командой возвращаемся обратно — продолжать багфикс. Если появляется ещё одна срочная задача, заводим для неё отдельную ветку «urgent-redirect» с помощью -c и сразу попадаем в нужное место.</p><p>Такой подход экономит время и избавляет от путаницы, которая раньше возникала с многофункциональным git checkout.</p><h2>3. git restore — откатываем изменения для конкретных файлов</h2><p>Допустим, мы внесли кучу изменений, что-то пошло не так — и хочется вернуть всё обратно, но только для определённых файлов. Использовать git reset или checkout слишком рискованно: легко случайно стереть не то, что нужно. В таких случаях пригодится команда git restore.</p><p>Она работает как с рабочей директорией, так и с индексом, не затрагивая остальной проект.</p><p>Примеры использования:</p><p>В первом случае файл main.c возвращается к состоянию последнего коммита. Во втором  мы убираем из индекса все файлы с расширением .js, но наши изменения остаются в рабочей директории. Третий вариант позволяет вернуть все файлы к состоянию предыдущего коммита, если, например, мы случайно наделали лишних изменений во всём проекте.</p><h2>4. git rebase — приводим историю в порядок</h2><p>Иногда хочется привести историю коммитов в порядок: объединить случайные правки, переименовать сообщения и т. д. Команда git rebase -i открывает текстовый интерфейс, где можно управлять списком последних коммитов:</p><ul><li>Объединять несколько в один (squash),</li><li>Менять порядок (pick),</li><li>Редактировать сообщения (reword),</li><li>Вставлять дополнительные команды (exec).</li></ul><p>Примеры использования:</p><p>Git откроет в редакторе список из последних трёх коммитов, там будет указан их хэш и комментарий:</p><p>Мы можем перетасовать коммиты при помощи команды pick, в этом примере мы поменяли верхний и нижний коммиты местами:</p><p>Если хотим объединить второй коммит с предыдущим, то можем использовать команду squash:</p><p>Теперь оба изменения попадут в один коммит.</p><p>Чтобы изменить сообщение у последнего коммита, меняем pick на reword:</p><p>После этой команды git предложит ввести новый текст комментария.</p><p>Таким образом, за одну операцию можно собрать историю под ключ: объединить, переименовать, проверить — и только потом отправить в общий репозиторий аккуратную, читаемую цепочку коммитов. Однако не рекомендуется использовать git rebase для командной работы, так как стирание истории может запутать других разработчиков и привести к конфликтам в разных версиях проекта.</p><h2>5. git stash — прячем незаконченные правки, чтобы вернуться к ним позже</h2><p>Бывает, что срочно нужно переключиться на другую задачу или ветку, но текущие изменения ещё не готовы к коммиту. Не хочется захламлять историю, да и откладывать задачу опасно — можно забыть, где остановился. Для этого в Git есть команда git stash, которая убирает все незавершённые правки «под ковёр» до лучших времён.</p><p>Пример использования:</p><p>В первом примере мы сохраняем все незакоммиченные изменения при помощи git stash save, давая им осмысленное имя. Так мы сможем вернуться к правкам позже.</p><p>Команда git stash list показывает все «стеши» — сохранённые правки, которые нам надо применить.</p><p>git stash apply возвращает изменения в рабочую директорию, но не удаляет стеши из списка. Ещё есть git stash pop, который делает то же самое, но сразу удаляет стеши.</p><h2>6. git cherry-pick — добавляем только нужные коммиты</h2><p>Иногда в соседней ветке уже есть нужный багфикс или маленькая фича, а добавлять её всю не хочется — появится куча лишних изменений. Для таких случаев подходит git cherry-pick: эта команда позволяет взять конкретный коммит (или диапазон коммитов) и аккуратно «приземлить» его в свою ветку.</p><p>Примеры использования:</p><p>Сначала мы применяем команду git cherry-pick, после которой указываем хэш нужного коммита (например, f1a2b3c). Git найдёт этот коммит в истории и «применит» его изменения к текущей ветке — как будто мы только что их закоммитили сами.</p><p>Если нужно забрать сразу несколько коммитов, можно указать диапазон через две точки «..» как в примере: git cherry-pick 1a..4d. Важно: команда возьмёт все коммиты после 1a, но не сам 1a.</p><p>Иногда при cherry-pick возникают конфликты — это нормально. В таком случае Git попросит разрешить эти конфликты вручную. После того как это сделано, мы можем ввести команду git cherry-pick --continue, чтобы продолжить слияние.</p><h2>7. git log — визуализируем историю проекта</h2><p>Когда в проекте появляется несколько веток и десятки коммитов, обычный просмотр истории быстро превращается в путаницу. В такие моменты помогает визуализация истории — чтобы увидеть, где расходились ветки, когда были слияния, и где появился тот самый «пропавший» коммит.</p><p>В Git для этого есть команда:</p><ul><li>--graph рисует дерево истории с линиями, которое показывает, где ветки расходятся и сливаются.</li><li>--decorate подписывает ветки и теги прямо в выводе, чтобы сразу было видно, где «main», «feature», релиз.</li><li>--oneline делает вывод лаконичным: каждая запись — одна строка, только хеш и короткое описание.</li><li>--all показывает не только текущую ветку, но и всю историю репозитория.</li></ul><p>Писать эту команду неудобно, она слишком длинная, поэтому мы можем создать алиас — короткую версию:</p><p>Теперь, чтобы команда сработала, достаточно применить git graph.</p><p>Например, если у нас две ветки, которые разошлись, а потом слились, мы увидим вот такой граф:</p><p>Звёздочки и линии показывают, где расходились ветки (feature/login отделялась от main), а где обратно слились (Merge).</p><p>Метки (например, main, feature/login, tag: v1.0) появляются рядом с коммитами — это и есть результат --decorate.</p><p>Все коммиты выстроены по одной строке — это делает схему быстрой для чтения.</p><h2>Заключение</h2><p>Освоить Git — значит не просто выучить базовые команды, а знать, как быстро решить типовые проблемы и не тратить время на рутину. Даже одна «правильная» команда может в нужный момент сэкономить время и нервы. А какие команды-git вы используете чаще всего? Напишите в комментариях. Кто знает, может в следующий раз именно ваша подборка появится в будущих материалах.</p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft открыла исходный код Windows Subsystem for Linux (WSL)</title>
      <link>https://tproger.ru/news/--microsoft-otkryla-ishodnyj-kod-windows-subsystem-for-linux--wsl-</link>
      <comments>https://tproger.ru/news/--microsoft-otkryla-ishodnyj-kod-windows-subsystem-for-linux--wsl-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--microsoft-otkryla-ishodnyj-kod-windows-subsystem-for-linux--wsl-</guid>
      <description><![CDATA[<p>Microsoft открыла исходный код WSL — теперь сообщество может вносить изменения, улучшать интеграцию и оптимизировать производительность</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--microsoft-otkryla-ishodnyj-kod-windows-subsystem-for-linux--wsl-">Microsoft открыла исходный код Windows Subsystem for Linux (WSL)</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 20 May 2025 04:59:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Windows Subsystem for Linux (WSL) — это инструмент, который позволяет запускать приложения и команды Linux прямо в Windows.</p><p>Впервые представленное в 2016 году, это решение стало важной частью рабочего процесса для разработчиков, которым нужны мощные инструменты командной строки и скрипты Linux в среде Windows.</p><p>Больше новостей — в нашем тг-канале «<a href="https://t.me/your_tech">Представляешь»</a></p><p>WSL предлагает более легкую и интегрированную альтернативу традиционным виртуальным машинам, что делает его популярным выбором среди программистов и DevOps-инженеров.</p><h2>Что изменилось</h2><p>Теперь Microsoft решила сделать почти весь исходный код WSL открытым. Об этом компания объявила на конференции Build.</p><p>В блоге Microsoft старший инженер компании Пьер Буле <a href="https://blogs.windows.com/windowsdeveloper/2025/05/19/the-windows-subsystem-for-linux-is-now-open-source/">отметил</a>, что этот шаг был сделан в ответ на многолетние просьбы сообщества. Фактически, это закрывает <a href="https://github.com/microsoft/WSL/issues/1">первый pull request</a>, созданный на GitHub еще в 2016 году, когда проект только начинал развиваться.</p><h2>Какие компоненты остались закрытыми</h2><p>Хотя большая часть WSL теперь открыта, несколько ключевых элементов остаются проприетарными:</p><ul><li><b>lxcore.sys</b> — основной драйвер ядра для WSL 1, первой версии системы, выпущенной в 2016 году.</li><li><b>p9rdr.sys</b> и <b>p9np.dll</b> — компоненты, отвечающие за редирект файловой системы между Windows и Linux, что позволяет легко получать доступ к данным из обеих операционных систем.</li></ul><p>Microsoft не исключает, что эти компоненты тоже могут быть открыты в будущем, но пока конкретных планов на этот счет не объявлено.</p><h2>Почему это важно</h2><p>Открытие исходного кода WSL означает, что теперь сообщество разработчиков может вносить прямые изменения в проект, исправлять баги, добавлять новые функции и оптимизировать производительность. Это может ускорить развитие WSL и улучшить интеграцию Linux и Windows, что особенно важно для тех, кто использует обе системы в повседневной работе.</p><h2>Что нового в WSL</h2><p>В последние месяцы Microsoft активно развивала WSL. Например, компания добавила поддержку дистрибутивов Fedora и Arch Linux, расширив выбор для пользователей, которым нужны более гибкие настройки системы.</p><p>Эти изменения стали возможны благодаря переходу WSL на модель установки через Microsoft Store, что упростило добавление новых функций без необходимости обновлять саму операционную систему.</p><p>Чтобы установить WSL, достаточно набрать wsl --install в командной строке или выбрать нужный дистрибутив в Microsoft Store. Можно использовать несколько дистрибутивов одновременно и переключаться между ними в зависимости от текущих задач.</p>]]></content:encoded>
    </item>
    <item>
      <title>Топ-10 малоизвестных языков программирования, которые могут выстрелить в будущем</title>
      <link>https://tproger.ru/articles/top-10-maloizvestnyh-yazykov-programmirovaniya--kotorye-mogut-vystrelit-v-budushhem</link>
      <comments>https://tproger.ru/articles/top-10-maloizvestnyh-yazykov-programmirovaniya--kotorye-mogut-vystrelit-v-budushhem?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/top-10-maloizvestnyh-yazykov-programmirovaniya--kotorye-mogut-vystrelit-v-budushhem</guid>
      <description><![CDATA[<p>Языки программирования будущего. Показываем, какие языки наиболее перспективны. Рассматриваем плюсы и минусы каждого Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/top-10-maloizvestnyh-yazykov-programmirovaniya--kotorye-mogut-vystrelit-v-budushhem">Топ-10 малоизвестных языков программирования, которые могут выстрелить в будущем</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Квантовые вычисления]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Интернет вещей]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[смарт-контракты]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 07 Feb 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Технологический ландшафт постоянно обновляется, и ведущую роль в продвижении инноваций играют языки программирования. Сегодня большинство продуктов создается на Python, C и C++, Java, JavaScript, PHP, но специалисты постоянно развивают другие инструменты.</p><p>Мы собрали топ-10 малоизвестных и относительно новых языков программирования, которые с высокой долей вероятности могут стать популярными в профессиональной среде.</p><h2>Критерии отбора языков</h2><p>Каждый язык остается востребованным, пока им пользуются для написания кода. Например, COBOL, который появился еще в середине прошлого века, до сих пор применим в банковской системе США, а Fortran — в прикладной математике.</p><p>Однако стремительное развитие компьютерных технологий побуждает к разработке принципиально новых, более эффективных и производительных инструментов. Они могут выполнять сугубо утилитарные задачи (вроде управления системами и устройствами), или становятся универсальными средствами программирования.</p><p>Иногда даже сами создатели языка не подозревают, какой продукт у них появился. Так случилось с С, который разработали американские программисты Керниган и Ритчи. Они всего лишь хотели перенести любимую игру с сервера на офисный компьютер, но поскольку действующая операционка не подходила для этих целей, пришлось создавать новый язык. Теперь им пользуются миллионы программистов во всем мире.</p><p>В топ языков программирования входят перспективные для развития инструменты. При отборе мы пользовались экспертными данными, собранными из авторитетных профессиональных источников. Рассмотрим ключевые факторы.</p><h3>Технологический прогресс</h3><p>Языки программирования развиваются параллельно с техническим прогрессом. К числу наиболее актуальных направлении в современной индустрии относятся:</p><ul><li>Искусственный интеллект. Для разработки таких технологий и управления ими нужны языки, способные продуктивно работать со сложными алгоритмами, массивами данных и параллельными вычислениями.</li><li>Квантовые технологии. Новые архитектурные концепции могут «заставить» нас использовать абсолютно непривычные языки.</li><li>Мобильные устройства и IoT. Эта отрасль задает тренд на развитие легких по структуре и более производительных языков, которые работают со встраиваемыми системами.</li><li>Аппараты. Распространение многоядерных процессоров и распределенных по разным компьютерам систем повышает потребность в языках программирования, поддерживающих параллелизм.</li><li>Блокчейн. Да, чтобы проводить смарт-контракты и писать децентрализованные приложения, привычных языков может быть недостаточно.</li></ul><h3>Отраслевые потребности</h3><p>На развитие и востребованность языков программирования влияют и потребности различных отраслей. Например, финансовый сектор нуждается в языках, которые обеспечивают максимальный уровень безопасности и надежности. К таким языкам можно отнести, например, F#.</p><p>В сфере здравоохранения нужны языки, которые упрощают анализ данных диагностики или используются для машинного обучения систем, задействованных в прогнозировании заболеваний. Таким инструментом может стать, например, Solidity. Созданный на этом языке софт на основе ИИ можно применять для аналитики диагностических данных с последующим прогнозированием течения заболеваний.</p><p>В игровой индустрии нужны языки, которые обеспечивают высокую производительность и возможность реализации интерактивных технологий гейминга (например, дополненную реальность) в онлайн-режиме.</p><h3>Тренды в сообществах разработчиков</h3><p>Еще один значимый фактор отбора программных языков — потребности сообщества разработчиков. Профи и любители ориентируются на простоту синтаксиса, наличие библиотек и фреймворков, легкость в использовании инструмента для выполнения реальных задач.</p><p>По этой причине языки с открытым исходным кодом и популярные «народные» продукты с активными сообществами развиваются быстрее. Они способствуют обширной инфраструктуре в виде вспомогательных инструментов и ресурсов.</p><h2>Топ-10 языков программирования</h2><p>Рассмотрим уникальные особенности, сильные стороны и сферы применения языков программирования, которые обладают большим потенциалом.</p><h3>Zig</h3><p>Этот язык в последнее время стал одним из самых обсуждаемых в профессиональном сообществе. В популярных профильных изданиях его даже называют «новой звездой на небосводе современной разработки».</p><p>Его создатель, американский программист Эндрю Келли, ставил задачу объединить плюсы низкоуровневого программирования с надежностью и удобством высокоуровневых языков.</p><p>Это типизированный компилируемый инструмент с инновационными концепциями в основе. Статическая типизация отвечает за максимальную надежность кода и позволяет выявить большинство ошибок еще до выполнения программ.</p><p>Основные плюсы:</p><ul><li>продукты на Zig отличаются стабильностью, безопасностью и простотой дальнейшей поддержки;</li><li>язык можно использовать для разработки низкоуровневого ПО в качестве легковесной альтернативы C;</li><li>выполнение кода в процессе компиляции и ручное управление памятью делает работу более простой и безопасной;</li><li>производительность Zig делает его подходящим инструментом для системного программирования и создания приложений с лимитированными ресурсами.</li></ul><p>Язык будет все активнее использоваться в проектах, где важны производительность и максимальный уровень контроля. Он идеально подходит для разработки игр, сетевого и системного программирования.</p><p>Код на Zig выглядит следующим образом:</p><p>Пример проекта на Zig — репозиторий <a href="https://github.com/zig-gamedev/zig-gamedev?tab=readme-ov-file"> Zig-gamedev</a> для разработки игр на этом языке.</p><figure><img src="https://media.tproger.ru/user-uploads/101528/2025-01-29/7234e496-77ad-449e-a43f-8e3421220993.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/101528/2025-01-29/f6f7a616-44a0-45ad-9ebc-17c9c4f5421e.png" alt="" /></figure><p>Готовый продукт, созданный на основе модулей библиотеки — фэнтезийная игра от первого лица и с открытым миром Tides of Revival.</p><h3>Crystal</h3><p>Язык с Ruby-подобным, предельно простым синтаксисом и высокой производительностью. Как и Zig, он статически типизирован и компилируем. Объединяет ясность и простоту Ruby с эффективностью и скоростью C.</p><p>В числе главных преимуществ Crystal:</p><ul><li>сходство с синтаксисом Ruby делает его предельно простым для изучения;</li><li>по производительности Crystal не уступает самым востребованным компилируемым языкам;</li><li>проверка в процессе компиляции и глобальный вывод типов позволяют выявлять ошибки на ранних этапах разработки, поэтому язык оптимален для создания приложений.</li></ul><p>Производительность, безопасность и простота применения делают Crystal отличным выбором для написания сценариев, в том числе высокого уровня. На этом языке разрабатывают инструменты командной строки, микросервисы и веб-продукты различной степени сложности. По мере развития фреймворков и библиотек Crystal становится все более востребованным и имеет все шансы войти в число основных языков для разработки приложений.</p><p>Примеры сервисов, созданных на Crystal:</p><ul><li>Kinko booking — платформа для бронирования гостиниц в туристических агентствах в режиме реального времени;</li><li>Eat App — облачные приложения автоматизации для ресторанного бизнеса, повышающие эффективность работы предприятий;</li><li>Nabobil.no — европейский каршеринг.</li></ul><p>Пример кода наглядно демонстрирует лаконичность Crystal:</p><p>puts “Hello World!”</p><h3>Elixir</h3><p>Язык, в котором реализована функциональная методика создания кода, построен на базе виртуальной машины  Erlang. Использует динамическую типизацию переменных, подходит для работы с распределенными системами.</p><p>Главные плюсы:</p><ul><li>динамичность и функциональность языка позволяют использовать его для разработки масштабируемых и отказоустойчивых приложений;</li><li>поскольку код выстраивается из процессов, он отлично справляется с параллелизмом и одновременным выполнением множества задач, в том числе на разных устройствах;</li><li>идеально подходит для создания и поддержки распределенных систем, а также приложений реального времени;</li><li>системы на Elixir продолжают работу даже при отказе нескольких составных частей.</li></ul><p>Язык будет все чаще использоваться для разработки масштабируемых, распределенных и отказоустойчивых бэкенд-систем. Это относится к игровым онлайн-платформам, информационным ресурсам реального времени и другим приложениям с большим трафиком. Поскольку спрос на такие продукты только растет, будущее Elixir выглядит вполне определенным.</p><p>Код тоже предельно лаконичен:</p><p>IO.puts(“Hello, World!”)</p><p>На Elixir создан фреймворк <a href="https://github.com/phoenixframework/phoenix">Phoenix</a>, который содержит модули для разработки быстро масштабируемых приложений.</p><figure><img src="https://media.tproger.ru/user-uploads/101528/2025-01-29/e8f90602-b194-4714-b535-b7839a2ebc95.png" alt="" /><figcaption>Фреймферк Phoenix</figcaption></figure><h3>Nim</h3><p>Этот статически-типизированный и компилируемый язык развивает концепции Ada, Modula, Python, но стремится превзойти их по эффективности и выразительности.</p><p>Основные преимущества:</p><ul><li>язык используется для метапрограммирования — то есть для настройки и генерации кода;</li><li>универсальный синтаксис позволяет применять Nim как для веб-разработки, так и для научных вычислений и работы с большими данными;</li><li>поскольку язык компилируемый, разработчик может использовать для работы не только собственные библиотеки, но и фреймворки на C и C++.</li></ul><p>Nim уже сейчас применяется для веб-разработки, системного программирования и создания сценариев. Однако его универсальность, эффективность и возможность  метапрограммирования делают его инструментом с большим потенциалом, в том числе в сфере разработки продуктов на основе ИИ.</p><p>Код на Nim с последующим компилированием:</p><p>Самые известные фреймворки на Nim —  это <a href="https://github.com/dom96/jester">Jester</a> и <a href="https://github.com/karaxnim/karax">Karax</a>. Первый используется для серверной разработки, второй — для клиентской. Обе библиотеки есть в свободном доступе на GitHub.</p><h3>F#</h3><p>Функционально ориентированный язык, работающий на базе экосистемы .NET — кроссплатформенной среды для разработки приложений.</p><p>Преимущества F#:</p><ul><li>лаконичный и ясный синтаксис, относительно простой для понимания;</li><li>надежный вывод типов, что позволяет использовать F# для машинного обучения, анализа массивов данных и параллельного программирования;</li><li>благодаря безопасности подходит для разработки приложений, работающих с конфиденциальными данными в финансовой сфере.</li></ul><p>Поскольку вся финансовая отрасль постепенно уходит в цифру, а системы становятся все более сложными, F#, как производительный и точный инструмент, все чаще будет использоваться для создания ПО, в котором важна надежность и предельная корректность выполняемых операций.</p><p>В плане лаконичности F# вполне сравним с предыдущими примерами:</p><p>printfn “Hello, world!”</p><p><a href="https://github.com/giraffe-fsharp/Giraffe#giraffe">Giraffe</a> — популярная библиотека на F# для разработки веб-приложений с высокой производительностью и безопасностью.</p><figure><img src="https://media.tproger.ru/user-uploads/101528/2025-01-29/d1fb7e13-8df1-4d82-a7dc-b0e39f088c02.png" alt="" /></figure><p>Еще один полезный фреймворк на этом языке — <a href="https://saturnframework.org/">Saturn</a>.</p><h3>Julia</h3><p>Высокопроизводительный и высокоуровневый язык с динамической типизацией. Изначально создавался для сложных математических вычислений и анализа данных. Объединяет скорость C++ и простоту Python.</p><p>Плюсы Julia:</p><ul><li>высокая скорость, благодаря компиляции Just-In-Time и множеству опций диспетчеризации, делают язык предпочтительным инструментом для сложных вычислений и анализа данных;</li><li>подходит для создания эффективного нативного кода для исполнения алгоритмов на реальном оборудовании;</li><li>язык постоянно обновляется и совершенствуется.</li></ul><p>Способность Julia обрабатывать большие массивы данных и работать со сложными задачами применяется для глубокого обучения, а также разработки ИИ. Язык используется для научных исследований в экономике, физике, астрономии и других дисциплинах. Благодаря тому, что сообщество Julia постоянно растет, а библиотеки регулярно пополняются, язык имеет большой потенциал в науке и машинном обучении.</p><p>Простой сценарий на Julia выглядит так:</p><p>Примеры библиотек на Julia для научных разработок по астрофизике <a href="https://juliaastro.github.io/">JuliaAstro</a>, <a href="https://github.com/JuliaSpace">JuliaSpace</a>, по биологии и химии: <a href="https://biojulia.net/">JuliaBio</a>, <a href="https://github.com/JuliaMolSim">Molecular simulations</a>, по экономике:  <a href="https://julia.quantecon.org/">QuantEcon</a>, <a href="https://github.com/JuliaQuant">JuliaQuant</a>.</p><h3>Scala</h3><p>Этот язык считается флагманом функционального программирования, то есть работает не с конкретными переменными, а с функциями, которые их описывают. Scala компилируется в Java и может использоваться там, где применяется этот язык (практически везде).</p><p>Преимущества:</p><ul><li>объектно-ориентированный подход позволяет создавать более четкий и структурированный код для широкого спектра продуктов;</li><li>лаконичность — простой и краткий синтаксис более удобен, он быстрее пишется и читается;</li><li>код на Scala кроссплатформенный и запускается где угодно, поэтому программистам не нужно думать о совместимости.</li></ul><p>Масштабируемость Scala и его универсальность позволят этому языку в будущем частично заменить Java и в полной мере реализовать концепцию функционального программирования во множестве проектов.</p><p>Код на Scala:</p><p>@main def hello() = println(“Hello, World!”)</p><p>Библиотека <a href="https://github.com/scala-js/scala-js">Scala.js</a> компилирует этот язык в JavaScript. Этого инструмента достаточно, чтобы начать разработку с объектно-ориентированным подходом.</p><h3>Red</h3><p>Минималистичный, лаконичный по синтаксису, но при этом функционально полноценный язык был создан как универсальный инструмент для решения самого широкого круга задач — от написания сценариев до низкоуровневого системного программирования.</p><p>Ключевые преимущества:</p><ul><li>простота синтаксиса, легкость в освоении и использовании делают Red идеальным инструментом для начинающих программистов;</li><li>несмотря на минималистичность, язык обладает мощью и гибкостью, что позволяет использовать его для приложений любого уровня сложности;</li><li>есть множество GUI-библиотек, которые существенно упрощают написание кода на Red.</li></ul><p>Сейчас применение языка ограничивается локальными проектами, но эксперты уверены, что его широкое распространение — вопрос времени. Способность поддерживать как высоко-, так и низкоуровневые проекты позволяет рассчитывать, что Red войдет в число наиболее востребованных языков для мобильной и веб-разработки, IoT, создания драйверов и графических интерфейсов.</p><p>Код на Red:</p><p>На Red написан проект <a href="https://github.com/glebdmitriew/smartXML">SmartXML</a>, предназначенный для хранения и передачи структурированных данных. Он также поддерживает вычисления с большими числами и используется в прикладной математике.</p><h3>Ballerina</h3><p>Язык с открытым исходным кодом, специально созданный для работы с облачными технологиями и разработки сетевых сервисов.</p><p>Плюсы Ballerina:</p><ul><li>использует объектно-ориентированный подход и существенно упрощает обработку данных;</li><li>идеально подходит для работы с микросервисами;</li><li>совмещает функции языка и платформы для интеграции веб-сервисов, поддерживает множество протоколов.</li></ul><p>По мнению экспертного сообщества, Ballerina имеет все шансы стать со временем новым стандартом в разработке облачных структур и веб-сервисов, благодаря разнообразным встроенным инструментам.</p><p>Код на Ballerina выглядит следующим образом:</p><p>На языке, в частности, написано расширение <a href="https://choreo.dev/">Choreo</a> для создания, развертывания и тестирования облачных приложений непосредственно из редактора Visual Studio Code.</p><figure><img src="https://media.tproger.ru/user-uploads/101528/2025-01-29/d6cf2389-97e1-46e1-9375-1f264ed125cd.png" alt="" /></figure><h3>Solidity</h3><p>Высокоуровневый язык, разработанный для виртуальной машины Ethereum. Функционирует на основе блокчейна и смарт-контрактов. Синтаксис Solidity напоминает Python, при этом язык основан на принципиально иных концепциях.</p><p>Плюсы Solidity:</p><ul><li>позволяет быстро и эффективно создавать смарт-контракты, не испытывая технических сложностей;</li><li>относительно прост для освоения для тех, кто знаком с Python и Java.</li></ul><p>Большинство экспертов считают, что со временем смарт-контракты будут использоваться практически во всех отраслях промышленности, где есть цифровые технологии. Уже сегодня смарты применяют для управления цепями поставок, а также в сфере здравоохранения для сохранения конфиденциальности данных пациентов.</p><p>Создание смарт-контракта на Solidity выглядит так:</p><p>На Solidity работают децентрализованные проекты типа Uniswap и Compound, где можно брать кредиты в крипте без посредников, а также NFT-маркетплейсы OpenSea и Rarible.Игра<a href="https://www.cryptokitties.co/"> Cryptokitties</a> для покупки, разведения и продажи виртуальных кошек тоже написана на этом языке.</p><figure><img src="https://media.tproger.ru/user-uploads/101528/2025-01-29/f8295011-b3a6-402d-a281-2711f1e10f39.png" alt="" /></figure><h2>Как выбрать язык для изучения</h2><p>При выборе перспективного языка программирования разработчику в первую очередь стоит учитывать область своих профессиональных интересов. Собственные инструменты есть в сферах веб-приложений, игр, продуктов на основе ИИ, программ для аналитики данных.</p><p>Аспекты, на которые стоит обязательно обратить внимание —  активность сообщества и наличие подробной документации. Все языки из представленного нами списка развиваются и имеют обширную аудиторию пользователей.</p><p>Значение имеют и вспомогательные инструменты — библиотеки и фреймворки. Готовые решения значительно упрощают как освоение языка, так и разработку конкретных продуктов для прикладных задач.</p><p>Следите за трендами ИТ-индустрии. Направления с серьезным потенциалом развития в ближайшие 10 лет: ИИ; квантовые вычисления; интернет вещей; блокчейн и смарт-контракты; автоматизация и робототехника.</p><p>Изучив новые языки раньше других, вы сможете опередить рынок и стать востребованным специалистом с минимальной конкуренцией. Если вы новичок, вы дадите мощный старт своей карьере разработчика.</p><p>А если хотите изучить хотя бы один из языков (или просто присматриваетесь) — все самые полезные инструменты <a href="https://t.me/+Qi8OJ_0gQZUyMWEy">тут</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Топ крутых команд Linux — спасителей времени</title>
      <link>https://tproger.ru/articles/top-krutyh-komand-linux-kotorye-uberegut-ot-perezatrat-vremeni</link>
      <comments>https://tproger.ru/articles/top-krutyh-komand-linux-kotorye-uberegut-ot-perezatrat-vremeni?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Лена Капаца]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/top-krutyh-komand-linux-kotorye-uberegut-ot-perezatrat-vremeni</guid>
      <description><![CDATA[<p>Подобрали семь нестандартных и забавных директив, чтобы разработка проходила быстрее и комфортнее</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/top-krutyh-komand-linux-kotorye-uberegut-ot-perezatrat-vremeni">Топ крутых команд Linux — спасителей времени</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Инструменты терминала Linux]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 10 Dec 2023 15:53:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>Linux — прекрасное семейство операционных систем, поскольку за долгие годы была создана огромная база тредов под любой, самый тонкий запрос. В пучине плавающих багов, ада зависимостей и прочих проблем разработчика она воспринимается как островок стабильности и спокойствия, ведь по два дня на отладку бага тратить, скорее всего, не придется. Если вы работаете с этой системой регулярно, уже запомнили основные команды Linux и ищете способ совершенствоваться в обращении с терминалом, далее я расскажу о нетиповых, но очень полезных директивах.</p><p>Начинающим же советую статью с базовыми операторами.</p><h2>nl: нумерация строк</h2><p>Порой приходится вычитывать и редактировать код прямо в CLI, ведь некоторые файлы не дублируются силами git на ноутбук намеренно. Такое встречается, например, при разработке вебхук-ботов. Если в большинстве IDE строки пронумерованы по умолчанию, то почему бы не сохранить комфорт и при работе с терминалом? Здесь поможет команда nl:</p><h2>&amp;&amp;: комбинация независимых команд</h2><p>Большинство линуксоидов знакомятся с конвейерами (pipe) на курсах и знают, как передать результат первой команды второй:</p><p>Но что писать bash, если понадобилось запустить несвязанные команды? Pipe в таком случае выпадает в ошибку. Здесь на помощь придет оператор «двойной амперсанд»:</p><p>Вывода у второй директивы нет, но файл появился:</p><h2>pv: удивляем родителей</h2><p>Это развлекательный инструмент, позволяющий имитировать скорый набор текста, как у хакеров в кино. Прежде чем баловаться этой красотой, установим pv:</p><p>Теперь запустим набор текста командами echo и pv:</p><p>Если быстро нажимать клавиши, можно ненароком стать сыном маминой подруги</p><h2>at: отложенный запуск</h2><p>Подходит для и̶м̶и̶т̶а̶ц̶и̶и̶ ̶р̶а̶б̶о̶т̶ы запуска команд в определенное время, под капотом используется утилита cron.</p><p>Если регулярных директив по расписанию собирается целая коллекция, лучше перейти на Apache Airflow. Гайд по установке ПО можно изучить здесь.</p><h2>&gt;: отправка логов в файл</h2><p>Если на вашем сервере сидит проект из нескольких десятков взаимосвязанных модулей (например, сайт на Django), то мониторить в консоли все ошибки, с которыми сталкиваются посетители портала, просто бессмысленно. Лучше наладить вывод из главного файла проекта, впоследствии почитывать трейсбеки и исправлять возникающие проблемы:</p><h2>cmatrix: raining code, как в «Матрице»</h2><p>Прекрасный скринсейвер силами сторонней утилиты. Для запуска «дождя из кода» достаточно одноименной команды:</p><h2>fold: подгонка под длину «не более 80 символов»</h2><p>Еще одна сторонняя утилита от «жертв» Vim, судя по всему, ибо горизонтальная прокрутка там неудобная:</p><p>Посмотрим, как утилита разрубила код на куски не более 80 символов:</p><p>Не нравится мне это в случае с кодом (разорвал аргумент функции), жди ошибок. Но для текстовых файлов очень удобно:</p><p>Может, вы знаете утилиту для автоматических переносов строк в коде для Linux? Поделитесь в комментариях.</p><h2>Заключение</h2><p>Команды терминала представляют собой неотъемлемую часть эффективного управления операционной системой. Знание их и корректное применение способствуют повышению производительности и обеспечивают более глубокий контроль над проектом.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что нужно знать перед тем, как работать с контейнерами</title>
      <link>https://tproger.ru/articles/chto-nuzhno-znat-pered-tem-kak-rabotat-s-kontejnerami</link>
      <comments>https://tproger.ru/articles/chto-nuzhno-znat-pered-tem-kak-rabotat-s-kontejnerami?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вика Овсянникова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-nuzhno-znat-pered-tem-kak-rabotat-s-kontejnerami</guid>
      <description><![CDATA[<p>Рассказываем, почему все пользуются технологией контейнеризации и зачем знать про namespaces и системные вызовы при работе с контейнерами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-nuzhno-znat-pered-tem-kak-rabotat-s-kontejnerami">Что нужно знать перед тем, как работать с контейнерами</a>»</p>]]></description>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 20 Nov 2023 11:50:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Все умеют работать с контейнерами, но мало кто понимает, как работают они сами. Это ограничивает возможности диагностики и управления программным обеспечением и средствами контейнеризации. DevOps-практики оказываются неэффективными, а безопасность просаживается. Разбираемся, на каких уровнях могут возникнуть ошибки, где можно зайти в тупик и что нужно знать, чтобы этого не произошло.</p><h2>Почему мы пользуемся контейнерами</h2><p>Разработчики пользуются библиотеками. Они позволяют не изобретать велосипед и пользоваться готовыми функциями.</p><p>К сожалению, если появляется новый дистрибутив, подтягиваются и новые библиотеки. Все они поставляются с определенными версиями ОС, и их нужно тестировать в различных средах. А также закрывать уязвимости, делать бэкпорт фич с учетом старых версий библиотек на более ранних дистрибутивах. И учитывать, что в разных дистрибутивах могут различаться стандарты размещения файлов — FHS.</p><p>Чаще всего ресурсов на поддержку такого «зоопарка» нет. Чтобы избежать постоянных тестов совместимости, слой библиотек передается вместе с docker image, из которого разворачивается тот самый контейнер. В нем есть всё необходимое в переносимом виде.</p><h2>Чем технология контейнеризации отличается от виртуализации</h2><p>У операционной системы есть абстракция-посредник между программами и оборудованием — ядро, которое обеспечивает API-вызовы. Происходит это через системные вызовы. Чаще всего они относительно низкоуровневые, надежные и примитивные. Например, «считай 10 байт, открой файл, считай 10 байт». Большинству программ этого достаточно.</p><p>Обратите внимание на эти системные вызовы: с помощью fopen можно смотреть, по какому пути открывается файл, а с clone(fork) и exec — видеть, как идут запуски тредов и внешних программ в контейнере.</p><p>Если, например, приложению приходится работать с аппаратными токенами, то нужны полноценные драйверы. Здесь может понадобиться виртуализация, где гипервизор host-OS позволяет запустить любое ядро с нужными драйверами.</p><p>Получается матрешка. Есть железо, на нем работает программа — ядро. Она создала процесс и запустила в нем гипервизор. Тот создал абстракцию железа, в которой запустилась программа-ядро. Оно создало процесс, в котором запустило программу. Не про это ли думал Нолан, когда снимал «Начало»?</p><p>При контейнеризации мы остаемся на уровне абстракции ядра (на котором запущены контейнеры), и так же отправляем туда системные вызовы. Процесс не знает о файловой системе и компьютере, он получает всю необходимую информацию из ядра.</p><p>Что почитать: «Linux. Системное администрирование», Р. Лав. В книге описаны системные вызовы, происходящие в Linux. Помогает понять, как работает ОС «с пользовательской точки зрения».</p><h2>Что такое namespace</h2><p>Ядро умеет изолировать программы друг от друга через процессы. Между ними изоляция осуществляется благодаря namespaces, которые позволяют отвечать на системные вызовы каждого приложения по-разному. Это как с билетами на концерт: по одному можно пройти на танцпол, по другому — в ложу, по VIP — пообщаться с артистом за кулисами.</p><p>С помощью Linux namespace мы показываем процессу, что ядро должно отдавать ресурсы из особой области, где распакованы docker image или лежат socket-файлы сетевых подключений.</p><p>Нужно понимать, за что отвечают такие namespaces:</p><ul><li>Файловая система (Mount) — область файловой системы, которая предоставляется приложению как корневая.</li><li>UTS — собственный hostname.</li><li>PID — позволяет в различных пространствах давать одинаковые ID процессам.</li><li>Сети (Network) — позволяет изолировать ресурсы, связанные с сетью. При этом процессы из разных пространств видят свои сетевые устройства, таблицы маршрутизации, правила firewall и так далее.</li><li>Межпроцессное взаимодействие (IPC) — позволяет организовать межпроцессное взаимодействие.</li><li>Пользовательские ID (User) — позволяет иметь копию пользовательских и групповых идентификаторов.</li><li>Время (Time) — позволяет разным процессам видеть разное системное время или часовой пояс.</li></ul><p>Процесс в среде разработки ведет себя немного по-другому, нежели чем в контейнере после сборки. Обработка тех же системных вызовов и набор ресурсов, которые в итоге система вернет процессу при запросе, могут отличаться. Например, процесс запрашивает список пользователей, а он может быть вынесен в другой namespace. Или система может выдать другое дерево файловой системы, потому что базовый образ файловой системы для этого docker image от другого дистрибутива.</p><p>Также на удаленке многие разработчики начали работать в других временных зонах. Часто при дебаге тестировщики не могут найти ошибки в соседних системах из-за разницы временных меток в логах разработчика и системы.</p><p>Что почитать: «Внутреннее устройство Linux», Д. Кетов. В книге рассматриваются основные подсистемы ядра и их сущности: файлы и файловые системы, виртуальная память и отображаемые файлы, процессы, нити и средства межпроцессного взаимодействия, каналы, сокеты и разделяемая память.</p><p>Посмотрим на конкретных примерах, какие проблемы можно отследить.</p><h3>Кейс №1: выросло System time</h3><p>Процесс может потреблять большое количество процессорного времени. Можно диагностировать это стандартными средствами. Посмотреть на цифры в выводе команды TOP:</p><ul><li>US( user time);</li><li>SY (system time);</li><li>WA (wait);</li><li>IO wait и так далее.</li></ul><p>Если разработчик не понимает, за что эти цифры отвечают, он решит, что накосячил где-то в коде. Хотя на самом деле процесс может потреблять много system time.</p><p>Пример из практики: информационная безопасность экспериментировала с журналами аудита и добавила дополнительные правила. По графикам системы мониторингов Grafana нагрузка на сервере подскочила процентов на 30. В этот же день был релиз фронтенд-приложения. Естественно, все решили, что фронт начал атаковать бэкенд, и именно он потребляет больше ресурсов даже не на пике.</p><p>Первая идея — искать, какие REST-вызовы дали нагрузку. На сервере мы видим, что на самом деле выросло SY. В процессе разработчики поняли, что были добавлены новые правила аудита, и решили их убрать. Тогда нагрузка вернулась к обычным стандартным значениям.</p><p>Что почитать: «Сетевые операционные системы», В. Олифер, Н. Олифер. В книге рассматриваются концепции и принципы построения большинства современных ОС.</p><h3>Кейс №2: ошибка в документации</h3><p>Команда писала приложение, в котором использовались криптографические подписи. После сборки и упаковки в Image, все перестало работать, это типичная ситуация. Ошибка говорит, что недоступен файл, который точно должен быть доступен. Базовый образ минималистичен, утилит диагностики в себе не содержит. Для разработчика это тупиком.</p><p>Проблема решилась обычным strace на компьютере разработчика, в котором довольно быстро удалось выудить ошибку системного вызова fopen. Оказалось, в документации криптобиблиотеки ошибка, и монтировать файлы с закрытым ключом нужно по другому пути. Разработчик же пользовался графическим интерфейсом криптобиблиотеки, и о путях знал только из документации.</p><h2>Что в итоге</h2><p>Технология контейнеризации — это не магическая виртуализация. По большому счету, понятие процесса, в котором запускаются программы, никуда не делось. Просто с точки зрения операционной системы он вынесен в отдельный пул ресурсов. Если разработчик понимает, какие стандартные средства операционной системы задействованы в процессе, он сможет диагностировать и ошибки, которые могут возникать в том числе при запуске приложений в контейнерах.</p>]]></content:encoded>
    </item>
    <item>
      <title>Права в Linux: команды и группы</title>
      <link>https://tproger.ru/articles/prava-v-linux-komandy-i-gruppy</link>
      <comments>https://tproger.ru/articles/prava-v-linux-komandy-i-gruppy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/prava-v-linux-komandy-i-gruppy</guid>
      <description><![CDATA[<p>Составили краткий обзор системы прав доступа в Linux. Рассмотрели использование команд chmod, chown, chgrp, id и umask.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/prava-v-linux-komandy-i-gruppy">Права в Linux: команды и группы</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Nov 2023 12:26:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>Составили краткий обзор системы прав доступа в Linux. Объяснили, как работает концепция многоуровневой защиты в Linux, где каждый пользователь имеет свой уникальный идентификатор (UID) и принадлежит одной или нескольким группам.</p><p>Рассмотрели использование команд и утилит, таких как chmod, chown и chgrp, для управления правами доступа к файлам и каталогам.</p><ol><li><a href="https://tproger.ru/#one">Что такое UID и GID в Linux</a></li><li><a href="https://tproger.ru/#two">Краткий список команд для управления правами в Linux</a></li><li><a href="https://tproger.ru/#three">Команда chmod для управления правами в Linux</a></li><li><a href="https://tproger.ru/#four">Команда chown</a></li><li><a href="https://tproger.ru/#five">Команда chgrp</a></li><li><a href="https://tproger.ru/#six">Команда id</a></li><li><a href="https://tproger.ru/#seven">Команда umask</a></li></ol><h2>Что такое UID и GID в Linux</h2><p>UID (User Identifier) и GID (Group Identifier) в Linux играют важную роль в идентификации пользователей и групп.</p><p>UID отображает уникальный идентификатор для каждого пользователя, в то время как GID используется для определения принадлежности к группам.</p><p>Они используются системой для установления доступа к файлам, ресурсам и управления безопасностью.</p><h3>UID (User Identifier)</h3><p><b></b>UID – это уникальный числовой идентификатор пользователя, который используется операционной системой для идентификации пользователя. Каждому пользователю в системе назначается свой уникальный UID.</p><p>UID представлен в виде числа и связан с конкретным пользователем в системе. У каждого пользователя есть свой уникальный UID, которое является основным идентификатором пользователя в системе.</p><p>При создании нового пользователя в Linux, система автоматически назначает ему уникальный UID. Этот UID используется для определения владельца файлов и директорий в системе, а также для контроля доступа к ним.</p><p>В системе Linux, UID 0 зарезервирован для суперпользователя, также известного как root. Как суперпользователь, root имеет полный доступ ко всем файлам и ресурсам в системе. Кроме того, у каждого пользователя есть свой собственный UID, который определяет его права доступа к файлам и директориям.</p><h3>GID (Group Identifier)</h3><p>GID в Linux – это идентификатор группы, который используется для идентификации группы пользователей в системе. GID представляет собой числовой идентификатор, который присваивается каждой группе в Linux.</p><p>В системе Linux каждый пользователь может быть членом одной или нескольких групп пользователей. Группы используются для управления доступом к файлам, директориям и другим ресурсам в системе. Пользователи, входящие в одну и ту же группу, могут иметь общие права доступа к определенным файлам и директориям.</p><p>GID используется для определения принадлежности пользователей к конкретным группам и для управления разрешениями доступа к ресурсам. При создании новой группы в системе, ей автоматически назначается уникальный GID. Как и UID, GID также может быть изменен или назначен пользователем вручную.</p><p>Когда файл или директория создается в Linux, ей назначаются права доступа, определенные для владельца, группы и остальных пользователей. Права доступа директории можно установить так, чтобы все файлы, созданные в ней, автоматически наследовали GID этой директории.</p><h2>Краткий список команд для управления правами в Linux</h2><p>В Linux права доступа к файлам и директориям играют важную роль в обеспечении безопасности и определении возможностей пользователя для чтения, записи и выполнения файлов. Права доступа в Linux управляются с помощью комбинации трёх групп: владелец файла, группа и остальные пользователи.</p><p>Права доступа в Linux имеют три основных типа: чтение (read), запись (write) и выполнение (execute). Владелец файла имеет право на все три типа доступа, группа может иметь свои собственные права, и остальным пользователям также могут быть назначены отдельные права.</p><p>Каждый файл или директория в Linux имеет набор прав доступа, который представлен в виде трёх наборов битов: биты чтения, записи и выполнения для владельца, группы и остальных пользователей. Например, для файла, у которого установлены права чтения и записи для владельца, право чтения для группы и право чтения для остальных пользователей, права доступа будут выглядеть так: -rw-r--r--.</p><p>Ниже представлены основные команды, которые позволяют работать с правами доступа в Linux.</p><h3>chmod</h3><p>Команда chmod используется для изменения прав доступа к файлам и директориям. Она позволяет устанавливать или изменять права чтения, записи и выполнения для владельца файла, группы и остальных пользователей.</p><p>Пример: chmod u+rwx filename (установка прав на чтение, запись и выполнение для владельца файла).</p><h3>chown</h3><p>Команда chown используется для изменения владельца и/или группы файла или директории. Она позволяет сменить владельца файла или директории на указанного пользователя и группу.</p><p>Пример: chown username:groupname filename (изменить владельца и группу файла).</p><h3>chgrp</h3><p>Команда chgrp используется для изменения группы файла или директории. Она позволяет сменить группу на указанную.</p><p>Пример: chgrp groupname filename (изменить группу файла).</p><h3>id</h3><p>Команда id показывает информацию о текущем пользователе, такую как uid (идентификатор пользователя), gid (идентификатор группы) и список групп, в которых состоит пользователь.</p><p>Пример: id -n выведет имя текущего пользователя вместо числового идентификатора.</p><h3>umask</h3><p>Команда umask используется для управления маской создания файлов. Она определяет, какие права доступа не будут установлены по умолчанию при создании нового файла или директории.</p><p>Пример: umask -S выведет маску прав доступа в символьном формате, например, u=rwx,g=rx,o=rx.</p><h2>Команда chmod для управления правами в Linux</h2><p>Команда chmod в Linux имеет различные опции для управления правами доступа к файлам и директориям.</p><ol><li>u (user): Эта опция применяется к владельцу файла или директории. Например, chmod u+r filename добавляет право на чтение для владельца файла, а chmod u-wx directory удаляет право на запись и выполнение для владельца директории.</li><li>g (group): Эта опция применяется к группе файла или директории. Например, chmod g+r filename добавляет право на чтение для группы файла, а chmod g-x directory удаляет право на выполнение для группы директории.</li><li>o (others): Эта опция применяется ко всем остальным пользователям системы, не являющимся владельцем файла или членами группы. Например, chmod o+r filename добавляет право на чтение для остальных пользователей, а chmod o-wx directory удаляет право на запись и выполнение для остальных пользователей.</li><li>a (all): Эта опция применяется ко всем пользователям – владельцу, группе и остальным пользователям. Например, chmod a+r filename добавляет право на чтение для всех пользователей.</li><li>+ (add): Эта опция добавляет указанные права доступа к текущим правам доступа файла или директории. Например, chmod +x filename добавляет право на выполнение для всех пользователей.</li><li>- (remove): Эта опция удаляет указанные права доступа из текущих прав доступа файла или директории. Например, chmod -w directory удаляет право на запись для всех пользователей.</li><li>= (set): Эта опция устанавливает указанные права доступа, заменяя существующие права доступа файла или директории. Например, chmod u=rw filename устанавливает только права чтения и записи для владельца файла.</li></ol><h2>Команда chown для управления правами в Linux</h2><p>Команда chown в Linux используется для изменения владельца и/или группы файла или директории. Она позволяет сменить владельца или группу на указанный пользователь или группу.</p><ol><li>chown user file: Изменяет владельца файла или директории на указанного пользователя. Например, chown john file.txt устанавливает пользователя “john” в качестве владельца файла “file.txt”.</li><li>chown user:group file: Изменяет владельца и группу файла или директории. Например, chown john:users file.txt устанавливает пользователя “john” в качестве владельца и группы “users” для файла “file.txt”.</li><li>chown :group file: Изменяет только группу файла или директории. Например, chown :users file.txt устанавливает группу “users” для файла “file.txt”, сохраняя текущего владельца.</li><li>chown -R user directory: Рекурсивно изменяет владельца для всего содержимого директории. Например, chown -R john documents изменяет владельца всех файлов и поддиректорий внутри директории “documents” на пользователя “john”.</li><li>chown --reference=reference_file file: Копирует права доступа существующего файла “reference_file” на указанный файл. Например, chown --reference=reference_file new_file устанавливает владельца и группу нового файла “new_file” такими же, как у файла “reference_file”.</li><li>chown -h user symlink: Изменяет владельца символической ссылки без изменения владельца файла, на который ссылается символическая ссылка. Например, chown -h john symlink.txt изменяет владельца символической ссылки “symlink.txt”.</li></ol><h2>Команда chgrp для управления правами в Linux</h2><p>Команда chgrp в Linux используется для изменения группы владельцев для файлов и каталогов. Группа владельцев определяет, к какой группе пользователей принадлежит файл или каталог. Это позволяет управлять доступом к файлам и каталогам для членов определенной группы.</p><ol><li>-R или --recursive: Рекурсивно изменяет группу владельцев для всех файлов и подкаталогов в указанном каталоге. Например, chgrp -R group1 /path/to/directory изменит группу владельцев для всех файлов и подкаталогов в /path/to/directory на group1.</li><li>--reference=&lt;файл или каталог&gt;: Копирует группу владельцев из заданного файла или каталога на другие файлы и каталоги. Например, chgrp --reference=file1 file2 скопирует группу владельцев из file1 на file2.</li><li>--no-dereference: Не следовать символическим ссылкам и изменять группу владельцев самих ссылок, а не файлов, на которые они указывают. Например, chgrp --no-dereference group1 symlink1 изменит группу владельцев symlink1, а не файла, на который он указывает.</li><li>--preserve-root: Защищает корневой каталог от изменения группы владельцев. Например, chgrp --preserve-root group1 / не изменит группу владельцев для корневого каталога /.</li><li>--verbose: Выводит подробную информацию о каждом изменении группы владельцев. Например, chgrp --verbose group1 file1 выведет информацию о изменении группы владельцев для file1.</li><li>--help: Выводит справку о команде chgrp. Например, chgrp --help отобразит справку о команде chgrp.</li></ol><h2>Команда id для управления правами в Linux</h2><p>Команда id в Linux используется для вывода информации о реальном и эффективном идентификаторах пользователя и группы. id позволяет узнать информацию о идентификаторах пользователя, таких как UID (User Identifier) и GID (Group Identifier), а также о его принадлежности к различным группам.</p><ol><li>-a или --ignore: Игнорирует групповой список и выводит только информацию об идентификаторах пользователя. Например, id -a выведет информацию о реальном и эффективном UID пользователя без списка групп, к которым он принадлежит.</li><li>-Z или --context: Выводит только контекст безопасности процесса. Например, id -Z выведет контекст безопасности текущего процесса.</li><li>-g или --group: Выводит только эффективный идентификатор группы. Например, id -g выведет эффективный идентификатор группы текущего пользователя.</li><li>-G или --groups: Выводит все идентификаторы групп, к которым принадлежит пользователь. Например, id -G выведет все идентификаторы групп, к которым принадлежит текущий пользователь.</li><li>-n или --name: Выводит имя вместо числовых идентификаторов. Например, id -n выведет имя текущего пользователя вместо числового идентификатора.</li></ol><h2>Команда umask для управления правами в Linux</h2><p>Команда umask в Linux используется для установки маски прав доступа по умолчанию для новых файлов и каталогов. Маска прав доступа определяет, какие права доступа будут автоматически установлены при создании нового файла или каталога.</p><ol><li>-S или --symbolic: Выводит маску прав доступа в символьном формате. Например, umask -S выведет маску прав доступа в символьном формате, например, u=rwx,g=rx,o=rx.</li><li>-p или --preserve: Сохраняет текущую маску прав доступа и выводит ее значение. Например, umask -p сохранит текущую маску прав доступа и выведет ее значение, например, 0022.</li><li>-r или --reference=&lt;файл&gt;: Устанавливает маску прав доступа в соответствии с правами доступа заданного файла. Например, umask -r file1 установит маску прав доступа в соответствии с правами доступа file1.</li><li>-S &lt;маска&gt; или --symbolic=&lt;маска&gt;: Устанавливает маску прав доступа с заданным символьным значением. Например, umask -S u=rwx,g=rx,o=rx установит маску прав доступа для пользователя: чтение, запись и выполнение; для группы и остальных: чтение и выполнение.</li><li>&lt;маска&gt;: Устанавливает маску прав доступа с заданным числовым значением. Например, umask 0022 установит маску прав доступа 0022, что означает, что для новых файлов и каталогов будут автоматически включены права чтения и выполнения для группы и остальных, а право записи будет выключено для всех.</li></ol><h2>Заключение</h2><p>Права пользователей в Linux играют важную роль в обеспечении безопасности и контроля доступа к файлам и ресурсам.</p><p>Система основана на использовании UID (User Identifier) и GID (Group Identifier) для идентификации пользователей и групп.</p><p>Через команды chmod, chown и другие утилиты администраторы могут управлять правами доступа к файлам и директориям, обеспечивая контроль над разрешениями.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разработчик собрал более 5 трюков, повышающих продуктивность в командной строке</title>
      <link>https://tproger.ru/news/razrabotchik-sobral-bolee-5-trjukov-povyshajushhih-produktivnost-v-komandnoj-stroke</link>
      <comments>https://tproger.ru/news/razrabotchik-sobral-bolee-5-trjukov-povyshajushhih-produktivnost-v-komandnoj-stroke?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/razrabotchik-sobral-bolee-5-trjukov-povyshajushhih-produktivnost-v-komandnoj-stroke</guid>
      <description><![CDATA[<p>Айко Клостерман собрал приёмы работы в терминале: возврат в предыдущую директорию через cd с минусом, повтор команды по !! и обращение к её индексам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/razrabotchik-sobral-bolee-5-trjukov-povyshajushhih-produktivnost-v-komandnoj-stroke">Разработчик собрал более 5 трюков, повышающих продуктивность в командной строке</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Инструменты терминала Linux]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 05 Apr 2021 15:46:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сложно переоценить то, насколько полезным может быть знание командной строки. Но, как ни странно, многие из нас так и не заходят дальше пары-тройки самых часто используемых команд.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/1-4.png" alt="" /></figure><p>Разработчик и спикер-консультант Айко Клостерман опубликовал свой список трюков, которые могут быть очень полезны в ваших программистских буднях.</p><h3>cd –</h3><p>Так или иначе, большинство из нас в курсе, как работает команда cd. Но многие ли из вас знали, что cd с минусом вернёт вас в предыдущую директорию? Пример:</p><h3>!!</h3><p>Можно легко «использовать» предыдущую команду, добавив в её начало новую. Пример:</p><h3>!:[index]</h3><p>Также Клостерман рассказал об удобном способе выбрать лишь часть предыдущей команды. Для этого подойдёт обращение к индексу определённой фразы. Пример:</p><h3>!:[index]-[index]</h3><p>Подобным образом можно выбрать и несколько команд. Пример:</p><h3>Переход в начало и конец строки</h3><p>Для того, чтобы попасть в самое начало строки, достаточно прожать сочетание Ctrl + A. В свою очередь в её конец можно попасть, нажав Ctrl + E.</p><p>Стоит отметить, что сам Клостерман использует Z Shell в iTerm2 для macOS. Ознакомиться с полным списком таких вот трюков можно на его сайте по <a href="https://aiko.dev/shell-commands/">ссылке</a>.</p><p>Источник: <a href="https://aiko.dev/shell-commands/">Aiko.dev</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Разработчик придумал лёгкий способ настроить Touch ID для sudo-авторизации</title>
      <link>https://tproger.ru/news/razrabotchik-pridumal-ljogkij-sposob-nastroit-touch-id-dlja-sudo-avtorizacii</link>
      <comments>https://tproger.ru/news/razrabotchik-pridumal-ljogkij-sposob-nastroit-touch-id-dlja-sudo-avtorizacii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/razrabotchik-pridumal-ljogkij-sposob-nastroit-touch-id-dlja-sudo-avtorizacii</guid>
      <description><![CDATA[<p>Дэвид Уолш описал решение из двух строк: вместо пароля при использовании sudo достаточно приложить палец к сканеру отпечатка на MacBook.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/razrabotchik-pridumal-ljogkij-sposob-nastroit-touch-id-dlja-sudo-avtorizacii">Разработчик придумал лёгкий способ настроить Touch ID для sudo-авторизации</a>»</p>]]></description>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 02 Mar 2021 14:19:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>JavaScript-консультант Дэвид Уолш <a href="https://davidwalsh.name/touch-sudo">опубликовал</a> в своём блоге полезный пост. В нём он рассказал о том, как можно настроить Touch ID в MacBook так, чтобы больше не вводить пароль при использовании sudo.</p><figure><img src="https://media.tproger.ru/uploads/2021/03/1-4.jpg" alt="" /><figcaption>Источник: AppleInsider</figcaption></figure><p>Если большинство советов в сети предлагают выполнить мини-квест для настройки сканера отпечатка пальцев, решение Уолша умещается в две строки.</p><h3>Как заменить ввод пароля на Touch ID?</h3><ul><li>Открыть Терминал.</li><li>Открыть утилиту sudo, введя команду sudo vi /etc/pam.d/sudo.</li><li>Вписать в первую строку: auth sufficient pam_tid.so.</li><li>Всё получилось, вы великолепны!</li></ul><p>Теперь каждый раз, как у вас возникнет необходимость ввести пароль из-за использования sudo, достаточно будет приложить палец к сканеру отпечатка пальцев MacBook.</p><p>Источник: <a href="https://davidwalsh.name/touch-sudo">davidwalsh.name</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Сборка программ и утилиты терминала Linux. Часть третья</title>
      <link>https://tproger.ru/translations/instrumenty-terminala-linux-tretja-chast</link>
      <comments>https://tproger.ru/translations/instrumenty-terminala-linux-tretja-chast?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/instrumenty-terminala-linux-tretja-chast</guid>
      <description><![CDATA[<p>Рассмотрим утилиты терминала Linux и главные инструменты для сборки программ, которые сэкономят время и повысят эффективность работы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/instrumenty-terminala-linux-tretja-chast">Сборка программ и утилиты терминала Linux. Часть третья</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Инструменты терминала Linux]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 24 Dec 2020 13:48:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы уже рассказали об <a href="https://tproger.ru/translations/instrumenty-terminala-linux-pervaja-chast/">основных командах терминала Linux</a>, а также <a href="https://tproger.ru/translations/instrumenty-terminala-linux-vtoraja-chast/">инструментах для начинающих</a> вроде tmux, GnuPG и Bash. В этой части рассмотрим сборку программ и утилиты терминала Linux.</p><h2>Инструменты для сборки программ</h2><p>Речь пойдёт про интерпретируемые программные платформы, доступные в большинстве систем — Python, Perl, awk, Bash. Кроме того, вам понадобится система сборки кода Make.</p><p>Код, который пишет программист, часто разделяется на файлы заголовков .h и файлы исходного кода .c.</p><p>При этом компилятор gcc делает следующее:</p><ul><li>При компиляции -S исходный код преобразуется с .c в код сборки .s.</li><li>При компиляции -c код сборки трансформируется в объектный код .o.</li><li>Ссылка -l — это ссылка на стандартные библиотеки для создания исполняемого файла.</li></ul><p>По умолчанию gcc объединяет вышеуказанные этапы, создавая исполняемый файл.</p><p>gcc hello.c — создает a.out, а не .o или .s-файлы.</p><h3>Система сборки Make</h3><p>Данная система автоматизирует компиляцию нескольких исходных файлов в сложном проекте, упорядочивает зависимые действия и выполняет их по порядку. После чего ею считывается конфигурация из файла «сборки», обычно именуемого Makefile. В итоге Makefile действует как программный компонент процесса сборки проекта.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/lt-3-1.png" alt="" /></figure><h3>Процесс работы make-команды</h3><p>make будет считывать данные из Makefile и запускать команды, чтобы построить конечную цель. Например, в Makefile, показанном выше, make будет запускать команды для правил 2–4, за которыми последует правило 1:</p><p>gcc -c dep1.c # создать dep1.o<br />gcc -c dep2.c # создать dep2.o<br />gcc -c main.c # создать main.o</p><p>gcc -o an_exe main.o dep1.o dep2.o -lm</p><h2>Утилиты терминала Linux</h2><p>Чтобы запустить команду в определённое время, используйте at:</p><p>at 17:00<br />at&gt; log_days_activities.sh # иногда можно сократить: at&gt; prompt [Ctrl+D]</p><p>at предлагает использование ключевых слов, таких как now, noon, today, tomorrow (сейчас, полдень, сегодня, завтра), а также различные опции, например, часы и дни, которые можно указывать с символом +.</p><p>at noon<br />at now + 1 year<br />at 3:08pm + 1 day<br />at 15:01 December 19, 2018</p><p>Используйте cron, если вы хотите задать периодичность запуска команд.</p><p>Утилита терминала Linux cron позволяет настроить периодический запуск посредством файла crontab, который управляет процессом и определяет, что и когда требуется выполнить. Запись может быть создана в любом файле и добавлена в систему с помощью команды crontab следующим образом:</p><p>echo '15 18 30 6 * find /home -mtime +30 -print' &gt; f00<br />crontab f00 # добавить предыдущую команду в систему crontab</p><p>crontab -l # список записей crontab<br />crontab -r # удалить записи crontab</p><p>Вывод команды cron будет осуществляться через почту (в качестве альтернативы она может быть перенаправлена в файл с помощью &gt;).</p><p>Анатомия записи в crontab:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/lt-3-2.png" alt="" /></figure><p>В данном случае получаем следующее: выполнение команды find ежегодно 30 июня в 18:15.</p><h2>Применение математики</h2><ul><li>Генерация случайных чисел с помощью shuf (может потребоваться установка):<br />shuf -i 1-100 -n 1</li><li>Форматирование чисел с помощью numfmt:<br />numfmt --to=si 1000<br />1.0K<br />numfmt --from=iec 1K<br />1024</li><li>Использование bc в качестве универсального калькулятора:<br />bc &lt;&lt;&lt; 48+36 # без пробелов по обе стороны от +<br />echo 'obase = 16; ibase = 10; 56 '| bc # десятичное в шестнадцатеричное<br />echo 'scale=8; 60/7.02' |bc # произвольная точность</li></ul><h2>Python-утилиты</h2><ul><li>Если вам нужно установить простой веб-сервер менее чем за минуту, то просто используйте:<br />python3 -m http.server 35000</li><li>Если требуется распечатать файл json:<br />python3 -m json.tool afile.json</li><li>Если требуется запустить небольшие программы на Python:<br />python -c "import math; print (str (math.pi) [: 7])"</li><li>Если требуется применить математику:<br />python -c "print(6*6+20)"<br />python -c "fctrl=lambda x:0**x or x*fctrl(x-1);<br />print(fctrl(6))" # вычислить факториал</li></ul><h2>Различные полезности</h2><p>Далее будут приведены всевозможные команды, которые во многом облегчат жизнь рядовому пользователю и сэкономят его время.</p><ul><li>Чтобы выполнить команду в течение указанного времени с использованием тайм-аута:<br />timeout 2 ping google.com</li><li>Отобразить изменяющуюся переменную:<br />watch -n 5 free -m</li><li>Используйте yes для автоматического подтверждения операций:<br />yes | pip install pkg --upgrade<br />yes "this is a test" | head -50 &gt; testfile.txt # позволяет создать файл с произвольным количеством строк</li><li>Создание PDF-файла из текста с помощью vim:<br />vim states.txt -c "hardcopy&gt; states.ps | q" &amp;&amp;<br />ps2pdf states.ps # позволяет преобразовать .ps в .pdf</li><li>Запуск команды от имени другой группы Linux:<br />sg grpgit -c 'git push'</li><li>Отображение CSV-файла в формате столбца или таблицы:<br />column -t -s , filename.csv</li><li>В случае, если возникли трудности с отправкой двоичных исполняемых файлов по электронной почте:<br />xxd f.exe f.hex # hexdump exe, необходимо просто отправить его по e-mail<br />xxd -r f.hex f.exe # конвертируем приёмник обратно в exe</li><li>Если требуется сгенерировать пароль:<br />head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8<br />openssl rand 8 -base64 | cut -c1-8 # -base64 8 для конкретной версии</li><li>Pandoc для конвертации файлов (md, tex, txt, html, docx, pdf, odt):<br />pandoc manual.md -o manual.pdf<br />pandoc example.txt -o example.html<br />pandoc -s example.txt -o example.docx</li><li>Также можно анализировать и читать файлы XML с помощью xmllint.</li><li>Чтобы разделить большой файл на небольшие части (например, для отправки в виде вложения по почте):<br />split -b 20M large.tgz parts_ # блоки по 20 МБ<br /># отправить части__* по почте<br />cat parts_a *&gt; large.tgz # на принимающей стороне</li></ul><p>Если вы пользуетесь не только Linux, но и Windows, посмотрите наше <a href="https://tproger.ru/translations/powershell-tutorial/">руководство по Windows PowerShell для начинающих</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Инструменты терминала Linux для начинающих. Часть вторая</title>
      <link>https://tproger.ru/translations/instrumenty-terminala-linux-vtoraja-chast</link>
      <comments>https://tproger.ru/translations/instrumenty-terminala-linux-vtoraja-chast?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/instrumenty-terminala-linux-vtoraja-chast</guid>
      <description><![CDATA[<p>Обзор инструментов терминала Linux: мультиплексор tmux, командная оболочка Bash и шифровальщик GnuPG с примерами рабочих команд.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/instrumenty-terminala-linux-vtoraja-chast">Инструменты терминала Linux для начинающих. Часть вторая</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Инструменты терминала Linux]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 22 Dec 2020 15:21:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы уже разобрали <a href="https://tproger.ru/translations/instrumenty-terminala-linux-pervaja-chast/">команды терминала Linux</a>, а в этой статье рассмотрим инструменты, среди которых tmux, Bash, шифровальщик GnuPG и многое другое.</p><h2>Управление сеансами: tmux</h2><h3>Управление рабочим пространством с помощью tmux</h3><p>tmux — это один из инструментов терминала Linux, а точнее терминальный мультиплексор, который позволяет создавать несколько постоянных терминалов в рамках одного входа в систему. Другими словами, tmux — это программа, которая даёт возможность вам работать с несколькими «вкладками» в одном окне терминала.</p><p>tmux будет полезен в следующих случаях:</p><ul><li>если компиляция или другая аналогичная операция в перспективе может занять много времени;</li><li>для интерактивной многозадачности;</li><li>в необычных случаях, например, при парном программировании;</li><li>с целью экономии времени и одновременного осуществления нескольких операций.</li></ul><h3>Краткое руководство по tmux</h3><p>Стандартный рабочий tmux-процесс:</p><p>tmux new -s s1 # запуск нового сеанса</p><p>Ctrl+B :detach — позволяет прервать сеанс, выйти из системы, вернуться домой.</p><p>Позже снова можете зайти в систему. Для того нужно:</p><p>tmux a-t s1</p><p>Дополнительные полезные команды tmux:</p><ul><li>Ctrl+B ( — возврат к предыдущей сессии;</li><li>Ctrl+B ) — переход к следующей сессии;</li><li>tmux ls — получение списка всех сессий;</li><li>tmux kill-session -t s1 — окончание сессии.</li></ul><p>Непосредственная коллаборация в tmux:</p><p>#user1#<br />tmux -S /tmp/collab<br />chmod 777 /tmp/collab</p><p>#user2#<br />tmux -S /tmp/collab attach</p><h3>Создание частей окна и их синхронизация</h3><ul><li>tmux new -s s2 — начать новую сессию;</li><li>Ctrl+B " — горизонтальное разделение;</li><li>Ctrl+B % — вертикальное разделение;</li><li>Ctrl+B :setw — для включения и выключения синхронизации;</li><li>Ctrl+B o — прокрутить окна;</li><li>Ctrl+B x — убрать активные окна.</li></ul><h2>ssh-конфигурация и туннелирование</h2><h3>Ssh-конфигурация (~/.ssh/config)</h3><p>Host login1 <br />  hostname login1.ornl.gov <br />  User km0</p><p>Host cades <br />  Port 22 <br />  hostname or-slurm-login.ornl.gov <br />  ProxyJump login1 <br />  User km0 <br />  ServerAliveCountMax=3 # максимальное количество сообщений, отправленных без ack<br />  ServerAliveInterval=15 # отправка нулевого сообщения каждые 15 секунд</p><p>Чтобы перейти на ssh/scp, необходимо использовать команду ssh/scp cades.</p><h3>Преимущества ssh-конфигурации</h3><p>Конфигурация облегчает запоминание ssh-команд при наличии нескольких хостов. При этом настройка подключения к отдельным хостам выполняется автоматически. Для дополнительной информации касательно данного типа конфигурации смотрите man 5 ssh_config.</p><p>Например: ssh summit достаточно для подключения к summit.olcf.ornl.gov со всеми свойствами, упомянутыми в этом разделе:</p><p>Host summit<br />  Port 22 <br />  hostname summit.olcf.ornl.gov<br />  User ketan2<br />  ServerAliveCountMax=3<br />  ServerAliveInterval=15</p><p>Переадресация порта с помощью SSH-туннелирования:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/lt-1.png" alt="" /><figcaption>Пример ssh-тунелирования</figcaption></figure><p>Чтобы запустить HTTP-сервер на удаленном узле и просмотреть его через локальный веб-браузер, нужно:</p><ol><li>remote$ python2 -m SimpleHTTPServer 25000 OR;</li><li>remote$ python3 -m http.server 25000;</li><li> local$ ssh -L 8000:localhost:25000 id@remote -N;</li><li>Откройте браузер на локальном компьютере и перейдите на http://localhost:8000.</li></ol><h2>Инкрементное удалённое копирование с помощью rsync</h2><p>Такое копирование позволяет синхронизировать данные между локальным и удалённым хранилищем. При этом можно использовать набор опций, а именно: -а и -v как наиболее часто используемые.</p><p>rsync -av localdir/ remotehost:~/remotedir.</p><p>Также есть лайфхак для применения rsync: быстрое удаление большого каталога можно осуществить посредством этой команды:</p><p>mkdir empty &amp;&amp; rsync -a --delete empty/ large_dir/.</p><h2>Безопасная связь через GnuPG</h2><h3>Основы использования GNU Privacy Guard</h3><p>GnuPG — это инструмент командной строки Linux для безопасной связи. Она имеет следующие функции:</p><ul><li>создание пар ключей;</li><li>обмен ключами и верификация;</li><li>шифровка и расшифровка документов;</li><li>аутентификация документов с помощью цифровых подписей.</li></ul><p>При всех вышеперечисленных плюсах, данная программа не предполагает:</p><ul><li>концепцию криптографии с открытым ключом;</li><li>сложные и продвинутые варианты использования.</li></ul><h3>Создание новой пары ключей</h3><p>Для начала используйте gpg --gen-key, после чего нужно будет ответить на предложенные вопросы.</p><ol><li>Укажите имя и адрес электронной почты в качестве идентификатора, потом выберите фразу-пароль.</li><li>«Артефакты» ключей можете посмотреть по адресу $HOME/.gnupg dir.</li></ol><p>Далее необходимо создать сертификат аннулирования:</p><p>gpg --output revoke.asc --gen-revoke &lt;ID&gt;.</p><p>Для чего используйте электронную почту в качестве идентификатора. Также стоит включить функцию уведомления, если пара ключей больше не может быть использована. Например, если вы забыли свою фразу для восстановления пароля, потеряли ключи и т. д.</p><h3>Обмен ключами и верификация</h3><p>Экспорт открытого ключа:</p><ul><li>gpg --output pub.gpg --export — бинарный код;</li><li>gpg --armor --export &gt; pubtxt.gpg — кодировка ASCII.</li></ul><p>Импорт открытого ключа:</p><p>gpg --import billpub.gpg — импорт по умолчанию.</p><p>После чего проверьте и подпишите импортированный ключ, для чего есть следующая команда:</p><p>gpg --edit-key b@ms.us — здесь указывается ключевая информация и подсказка.</p><p>command&gt; fpr  — отпечатки пальцев, проверка по телефону.</p><p> Остаётся лишь пройти верификацию в командной строке — command&gt; sign.</p><h3>Шифрование и расшифровка документов</h3><p>Ниже приведён пример шифрования документа с помощью открытого ключа пользователя (пусть это будет Билл):</p><p>gpg --output doc_pdf.gpg --encrypt --recipient.</p><p>b@ms.us doc.pdf — как вы уже поняли, у вас должен быть ключ Билла в свободном доступе.</p><p>Билл расшифровывает документ (то есть у него должен быть его персональный ключ и фраза-пароль):</p><p>gpg --output doc.pdf --decrypt doc_pdf.gpg.</p><p>Документы могут быть зашифрованы без ключа, просто посредством фразы-пароля:</p><p>gpg --output doc_pdf.gpg --symmetric doc.pdf.</p><h3>Аутентификация документов с помощью цифровых подписей</h3><p>Документы с цифровой подписью подтверждают тот факт, что они являются подлинными и что они не подвергались чьим-либо посторонним изменениям:</p><p>gpg-output doc.signed-sign doc.pdf.</p><p>Помните, что у вас должен быть закрытый ключ для создания цифровой подписи.</p><p>Подписанный документ можно проверить и расшифровать следующим образом:</p><p>gpg --ouput doc.pdf --decrypt doc.signed.</p><h2>Инструменты Bash</h2><p>Это оболочка командной строки Linux. В данном случае могут быть применены такие команды и утилиты, как grep, sed, awk и определены переменные, константы, условные обозначения, циклы и функции. Bash также предполагает использование арифметических операций и логических операций: &amp;&amp; (и) и || (или):</p><ul><li>wget ...|| curl ... — выполнить curl iff wget не удается;</li><li>make install &amp;&amp; make test — срабатывает команда test iff install.</li></ul><p>Файлы Shell «Startup»  устанавливают среду при запуске оболочки.</p><p>.bashrc — файл, который запускается в каждой новой создаваемой оболочке.</p><p>.bash_profile — файл, который запускается только в «оболочке входа в систему», а не во всех оболочках. Например, он не запустится, если вы вызовете сценарий оболочки, который создает «подоболочку».</p><h3>Псевдонимы и функции</h3><p>Псевдонимы — это короткие и удобные имена для длинных команд. Как правило, они определяются в .bashrc или отдельном файле .aliases.  Чтобы временно обойти псевдоним (скажем, поменять псевдоним ls на ls -a), используйте \: \ ls.</p><p>Также необходимо помнить о том, что функции Bash обычно определяются в файле .bashrc/.bash_profile и что функции более выразительны по сравнению с псевдонимами. Поэтому, обычно, следует отдавать предпочтение именно им.</p><p>Примеры псевдонимов:</p><ul><li>alias s=ssh;</li><li>alias c=clear;</li><li>alias cx='chmod +x';</li><li>alias ls='ls -thor‘;</li><li>alias more=less;</li><li>alias ps='ps auxf';</li><li>alias psg='ps aux | grep -v grep | grep -i -e USER -e';</li><li>alias ..='cd ..';</li><li>alias myp='ps -fjH -u $USER';</li><li>alias cleanup='rm -f *.tmp *.aux *.log'.</li></ul><p>Примеры полезных функций:</p><ul><li>mcd() { mkdir -p $1; cd $1 };</li><li>cdl() { cd $1; ls};</li><li>backup() { cp "$1"{,.bak};};</li><li>gfind() { find / -iname $@ 2&gt;/dev/null };</li><li>lfind() { find . -iname $@ 2&gt;/dev/null };</li><li>rtfm() { help $@ || man $@ || $BROWSER "http://www.google.com/search?q=$@"; };</li><li>Смотрите /usr/share/doc/bash-*/examples/functions для поиска дополнительных примеров функций.</li></ul><h3>Переменные и подстановка команд</h3><p>Переменные являются неявно типизированными, они могут представлять собой буквальное значение или замену команды.</p><p>vname = value — присвоить значение переменной vname.</p><p>$vname — прочесть значение переменной vname.</p><p>Подстановка команды:</p><ul><li>curdir=$(pwd);</li><li>curdate=$(date +%F);</li><li>echo "There are $(ls -1 | wc -l) items in the current dir".</li></ul><h3>Условная инструкция</h3><p>В данном случае используется конструкция if-then-else (условного оператора), а именно — управляющая структура программы с ветвлением, аналогичная языкам программирования.</p><p>Существуют две формы механизмов условной оценки:</p><ul><li>$ if test $USER = 'km0'; then echo 'I know you'; else echo 'Who are you'; fi;</li><li>$ if [ -f /etc/yum.conf ]; then echo 'yum.conf exists'; else echo 'file do not exist'; fi.</li></ul><p>Условные инструкции:</p><ul><li>Строка-z строка — если длина строки равна 0;-n строка — если длина строки не равна 0;string1 = string2 — если строки идентичны (обратите внимание на одиночный знак =).</li><li>Числаint1 -eq int2 — если первое целое число равно второму;-ne, -gt, -ge, -lt, -le — если не равно; больше, чем; больше или равно.</li><li>Файл-r имя_файла — если файл существует и доступен для чтения;-w имя_файла — если файл существует и доступен для записи;-f, -d, -s — если файл или каталог существует и не пуст.</li><li>Логические операции!, -a, -o — отрицание, логическое И, логическое ИЛИ.</li></ul><h3>Циклы</h3><p>Тут циклы представлены в 3 различных формах:</p><ul><li>for i in {0..9}; do echo $i; done;</li><li>for ((i=0;i&lt;10;i++)){ echo $i;}  # аналогично С++;</li><li>for var in list; do comand; done # в стиле Python.</li></ul><p>Также такая схема может применяться при параллельной замене команд:</p><ul><li>for i in $(\ls -1 *.txt); do echo "$i"; done;</li><li>for i in $(get_files.sh); do upload.sh "$i"; done.</li></ul><h2>Heredoc-синтаксис</h2><p>Данный синтаксис позволяет создавать «встроенные» файлы.</p><p>Пример команды:</p><p>sh &lt;&lt; END<br />echo "Hello World"<br />END &lt;нажмите enter&gt;</p><p>Использование heredoc позволяет:</p><ul><li>создавать многострочные сообщения с использованием cat;</li><li>использовать переменные для подключения к созданным файлам, что позволяет, например, тестировать несколько конфигураций для программ.</li></ul><p>В следующей части мы поговорим о <a href="https://tproger.ru/translations/instrumenty-terminala-linux-tretja-chast/">сборке программ и утилитах терминала Linux</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>eDEX-UI — кроссплатформенный эмулятор терминала в стиле Sci-Fi</title>
      <link>https://tproger.ru/articles/edex-ui-krossplatformennyj-jemuljator-terminala-v-stile-sci-fi</link>
      <comments>https://tproger.ru/articles/edex-ui-krossplatformennyj-jemuljator-terminala-v-stile-sci-fi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Почекутов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/edex-ui-krossplatformennyj-jemuljator-terminala-v-stile-sci-fi</guid>
      <description><![CDATA[<p>Полноэкранный эмулятор терминала для Windows, macOS и Linux с 16 темами и настройками в файле settings.json доступен для скачивания на GitHub.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/edex-ui-krossplatformennyj-jemuljator-terminala-v-stile-sci-fi">eDEX-UI — кроссплатформенный эмулятор терминала в стиле Sci-Fi</a>»</p>]]></description>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 21 Dec 2020 06:55:43 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разбавить рабочие будни атмосферой научной фантастики — почему бы и нет? На GitHub можно скачать полноэкранный эмулятор терминала eDEX-UI. Он доступен на Windows, macOS и Linux.</p><p><a href="https://github.com/GitSquared/edex-ui">Репозиторий проекта на GitHub</a></p><p>Самое важное — скриншоты:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/tron.png" alt="" /><figcaption>Это стандартная тема Tron</figcaption></figure><figure><img src="https://media.tproger.ru/uploads/2020/12/matrix.png" alt="" /><figcaption>А это Matrix</figcaption></figure><figure><img src="https://media.tproger.ru/uploads/2020/12/interstellar.png" alt="" /><figcaption>Как насчёт Interstellar?</figcaption></figure><p>Всего в списке 16 тем и их вариаций. Можно изменить тему или создать свой вариант. Параметры работы хранятся в файле settings.json. Их можно менять прямо в эмуляторе, нажав сочетание клавиш Ctrl+Shift+S.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/settings.png" alt="" /><figcaption>Эмулятор удобно настраивать</figcaption></figure><p>Особенности eDEX-UI:</p><ul><li>Полнофункциональный эмулятор терминала с вкладками.</li><li>Мониторинг системы и сети в реальном времени.</li><li>Поддержка сенсорных дисплеев.</li><li>Встроенное средство просмотра каталогов.</li><li>Расширенные возможности для настройки внешнего вида и функциональности.</li><li>Звуковые эффекты, созданные для максимального голливудского хакерского настроения.</li></ul><p>Конечно, по мощности кастомизации eDEX-UI не сравнится со Zsh. Это, скорее, развлечение, которое помогает немного разнообразить работу.</p>]]></content:encoded>
    </item>
    <item>
      <title>Команды терминала Linux для начинающих. Часть первая</title>
      <link>https://tproger.ru/translations/instrumenty-terminala-linux-pervaja-chast</link>
      <comments>https://tproger.ru/translations/instrumenty-terminala-linux-pervaja-chast?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/instrumenty-terminala-linux-pervaja-chast</guid>
      <description><![CDATA[<p>Основы терминала Linux: структура типичной команды, работа с файлами и каталогами, проверка доступности команд и создание списка процессов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/instrumenty-terminala-linux-pervaja-chast">Команды терминала Linux для начинающих. Часть первая</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Инструменты терминала Linux]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 07 Dec 2020 13:21:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Возможно, вы уже знаете некоторые команды терминала Linux, умеете работать с файлами, каталогами и осуществлять редактирование, например: cd, ls, pwd, cat. Но в данном обзоре всё изложено как можно конкретнее, чтобы предусмотреть распространённые вопросы.</p><h2>Основы в терминале Linux</h2><p>Ниже представлена схема типичной команды в терминале ОС Linux:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/1-7.png" alt="" /></figure><p>Следующие команды позволят вам лучше узнать систему:</p><ul><li>id — если вы хотите получить информацию касательно вашей учётной записи;</li><li>w — чтобы понимать, кто на данный момент находится в системе (-f — для того, чтобы узнать, откуда был совершен вход);</li><li>lsblk — если вы хотите открыть список блочных устройств хранения данных;</li><li>lscpu — отображает информацию о процессорах;</li><li>lstopo — предоставляет доступ к топологии аппаратного ПО отображения информации (требуются пакеты hwloc, hwloc-gui);</li><li>free — показывает объём свободной и уже используемой памяти (используйте также free -g);</li><li>lsb_release -a — если вы хотите получить информацию о распределении данных;</li></ul><p>Примечание Для PS0: используйте Ctrl+C, чтобы деактивировать неактуальные команды. Что касается PS1: некоторые команды могут быть недоступны. Чтобы проверить, какие именно, введите which &lt;cmdname&gt;.</p><h2>Работа с процессами</h2><p>Для начала создайте список процессов по имени, идентификационного номеру процесса и т. д. (обычно используемый признак состояния aux).</p><p>Учитывайте особенности реализации программных потоков: POSIX, GNU и BSD, а также то, что они отличаются в работе и применении. Вышеуказанные реализации отличаются различными опциями: POSIX (-), GNU (–), BSD (без тире).</p><p>Индикаторы процесса в данной системе: top, htop, atop.</p><p>Понижайте приоритет процесса, используя nice. Например, следующим образом:</p><p>nice -n 19 tar cvzf archive.tgz large_dir</p><p>Чтобы аннулировать процесс, введите kill &lt;pid&gt;. Данная команда используется для завершения процессов-зомби или прекращения зависших сеансов.</p><p>Далее идут команды терминала Linux, которые спасут положение в затруднительных ситуациях:</p><ul><li>man nano — данная команда обеспечивает доступ к организованным по разделам справочным страницам. Итого на каждый раздел — одна страница. Например: 5 passwd #5й раздел;</li><li>wget --help — весьма удобная команда, которая позволит быстро получить справку по синтаксису;</li><li>info curl — позволяет получить информацию о команде (в данном случае о curl);</li><li>/usr/share/doc — используйте в браузере. В случае проблемы, не забывайте, что обычно файлы README содержат информацию и примеры команд. Просмотр осуществляется с помощью браузера.</li></ul><h2>Работа с файлами</h2><p>Следующие команды потребуются вам при работе с файлами разного типа и объёма:</p><ul><li>cat — для относительно коротких файлов:<br />cat states.txt;</li><li>less —  считывает текст не полностью, а небольшими фрагментами:<br />less /etc/ntp.conf;</li><li>more — для длинных файлов;</li><li>tail -f — используется для просмотра растущего файла в окне интерактивного запуска кода.</li></ul><p>Что вы можете сделать с двоичными файлами? На самом деле, вариантов не очень много:</p><ul><li>strings — команда выведет готовые к печати строки файла;</li><li>od — позволит вам напечатать файл в восьмеричном формате;</li><li>cmp — даёт возможность побайтно сравнивать файлы.</li></ul><p>Если вам требуется сравнить текстовые файлы друг с другом, введите следующие команды:</p><ul><li>comm — отсортированные файлы будут строка за строкой;</li><li>diff — позволяет построчно выявить различия. Эта команда используется наиболее часто в силу богатого набора опций.</li></ul><h2>Интернет в командной строке</h2><p>При работе в терминале Linux с интернет-ресурсами применяйте следующие команды:</p><ul><li>curl — обычно используется для загрузок из интернета:<br />curl -O http://www.gutenberg.org/files/4300/4300-0.txt<br />curl ifconfig.me #быстро определяет ваш ID </li><li>wget — аналогичная команда:<br />wget http://www.gutenberg.org/files/4300/4300-0.txt<br />wget https://kubernetespodcast.com/episodes/KPfGep{001..062}.mp3</li><li>lynx — позволяет использовать достаточно удобный текстовый браузер. Под удобным в данном случае подразумевается, что вы:сможете наконец-то избавиться от постоянно всплывающих рекламных окон;решите проблему с медленным/зависающим интернетом, например: lynx text.npr.org;сможете иметь доступ к локальным html-страницам, например, к тем, что можно найти с помощью /usr/share/doc;</li><li>w3m и links — дополнительные текстовые браузеры: w3m lite.cnn.com.</li></ul><h2>Горячие клавиши</h2><h3>Навигация</h3><figure><img src="https://media.tproger.ru/uploads/2020/12/2-2.png" alt="" /></figure><p>Ctrl+] &lt;char&gt; перемещает курсор на первое вхождение &lt;char&gt; вправо.</p><p>Ctrl+alt+] &lt;char&gt; перемещает курсор на первое вхождение &lt;char&gt; влево.</p><h3>Удаление</h3><figure><img src="https://media.tproger.ru/uploads/2020/12/3.png" alt="" /></figure><p>Используйте Ctrl+Y, чтобы вставить обратно удалённые файлы.</p><h3>Дополнительно</h3><ul><li>Alt+. — если требуется вставить последний аргумент предыдущей команды;</li><li>Alt-&lt;N&gt;-Alt-. — если требуется использовать N-й аргумент предыдущей команды;</li><li>Ctrl+L — используется для очистки терминала;</li><li>cd – — требуется для внесения изменений в предыдущий каталог;</li><li>cd — перейти в домашний каталог;</li><li>Ctrl+R — обзор истории;</li><li>Ctrl+D — выход из терминала.</li></ul><h2>Подстановочные символы</h2><p>Далее приведены подстановочные символы, которые расширяют объём команды терминала Linux во время её выполнения:</p><ul><li>*  позволяет расширить команду до любого количества символов:<br />ls -lh /etc/*.conf — все элементы с расширением .conf;</li><li>? позволяет расширить команду до одного символа:<br />ls -ld ? ?? ??? — сюда относятся элементы, длина которых составляет 1, 2 или 3 символа;</li><li>! — отрицание:<br />ls -ld [!0-9]* — элементы, которые не начинаются с числовых значений;</li><li>Экранирование и цитирование с целью предотвращения расширения:\ для экранирования подстановочного знака;' для цитирования подстановочного знака.</li></ul><h2>Хитрости, которые сэкономят время</h2><p>Этот список полезных знаков позволит вам в разы ускорить работу с командами:</p><ul><li>!! — повторяет последнюю команду;</li><li>!$ — позволяет изменить команду, сохраняя последний аргумент:cat states.txt — используется, если файл слишком длинный, чтобы поместиться на экране;less !$ — используется для повторного открытия в меньшем объёме;</li><li>!* —позволяет изменить команду, сохраняя при этом все аргументы:head states.txt | grep '^Al' — при использовании должен быть хвост;tail !* — нет необходимости вводить остальную часть команды;</li><li>&gt;x.txt — используется для создания пустого файла или очистки существующего.</li><li>lsof -P -i -n — позволит определить, к каким скриптам идёт обращение со стороны веб-сервера.</li></ul><h2>Потоки ввода-вывода терминала и переадресация</h2><p>В терминале Linux работа осуществляется через три потока ввода-вывода: вход (stdin), выход (stdout) и ошибка (stderr).</p><p>Данные потоки представлены файловыми дескрипторами. Их также принято считать идентификаторами: 0 для stdin, 1 для stdout, 2 для stderr.</p><p>Использование угловых скобок применяется для перенаправления (переадресации) команд и файлов в них и из них:</p><ul><li>&gt; для отправления в поток;</li><li>&lt; для получения из потока;</li><li>&gt;&gt; для добавления в поток;</li><li>&lt;&lt; для непосредственного присоединения потока (используется в «heredoc»);</li><li>&lt;&lt;&lt; используется в «herestring» (на сегодняшний день не особо распространенная команда);</li><li>&amp; используется для записи в поток, например &amp;1 для записи в stdout.</li></ul><figure><img src="https://media.tproger.ru/uploads/2020/12/4.png" alt="" /></figure><p>Дополнительные примеры переадресации приведены ниже:</p><ul><li>чтобы отправить stdout и stderr в один и тот же файл (короткий вариант bash v4+)<br />pip install rtv &gt; stdouterr.txt 2&gt;&amp;1 ac -pd &amp;&gt; stdouterr.txt;</li><li>чтобы пропустить и stdout, и stderr:<br />wget imgs.xkcd.com/comics/command_line_fu.png &amp;&gt; /dev/null<br />/dev/null — это «нулевой» файл для удаления потоков. А ещё это паблик со смешными мемами для ITшников (<a href="https://vk.com/tnull">ВК</a> и <a href="https://t.me/ithumor">Телеграм</a>);</li><li>чтение из stdin в качестве вывода команды:<br />diff &lt;(ls dirA) &lt;(ls dirB);</li><li>добавить stdout в файл журнала<br />sudo yum -y update &gt;&gt; yum_update.log.</li></ul><h2>Каналы</h2><p>Канал — это особая концепция системы Linux, которая автоматизирует перенаправление вывода одной команды посредством использования входных данных на следующую команду. Такое использование каналов приводит к эффективным комбинациям независимых команд. Ниже приведены некоторые из них:</p><ul><li>find .| less — позволяет прокручивать длинный список файлов постранично;</li><li>head prose.txt | grep -i 'little' echo $PATH | tr ':' '\n' — переводит на новую строку;</li><li>history | tail — отображает последние 10 команд;</li><li>free -m|grep Mem:|awk '{print $4}' — отображает доступную память;</li><li>du -s *|sort -n|tail — отображает 10 наиболее больших файлов/каталогов в pwd.</li></ul><h3>Расшифровка и отладка команд каналов</h3><p>free -m|grep Mem:|awk '{print $4}'</p><p>Приведённая выше команда эквивалентна выполнению следующих 4 команд:</p><ul><li>free -m &gt; tmp1.txt</li><li>grep Mem: tmp1.txt &gt; tmp2.txt</li><li>awk '{print $4}' tmp2.txt</li><li>rm tmp1.txt tmp2.txt</li></ul><p>Сокращение этапов работы с командами зачастую является эффективным и более простым способом, который позволяет сэкономить время и упростить процесс. Например, вышеупомянутый конвейер можно уменьшить следующим образом:</p><p>free -m|awk '/Mem:/{print $4}'</p><p>Ниже приведено ещё несколько примеров каналов:</p><p>Чтобы получить доступ к pdf-файлам страниц справочника man:</p><p>man -t diff | ps2pdf - diffhelp.pdf </p><p>Чтобы получить актуальные на сегодняшний день файлы:</p><p>ls -al --time-style=+%D | grep `date +%D`</p><p>Топ-10 самых часто используемых команд:</p><p>history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head</p><p>Далее будут команды терминала Linux, которые принимают только литеральные аргументы.</p><p>Большинство команд получают входные данные, например, из stdin (канала) и файла:</p><p>wc &lt; states.txt #ок </p><p>wc states.txt #ок</p><p>Однако, существуют определённые исключения. Например, некоторые команды получают входные данные только из stdin, а не из файла:</p><p>tr 'N' 'n’ states.txt #работать не будет</p><p>tr 'N' 'n’ &lt; states.txt #работать будет</p><p>Некоторые команды не получают входные данные ни из stdin, ни из файла. Например, следующие:</p><ul><li>echo &lt; states.txt  — не подходит. Предполагается, что вы собираетесь распечатать содержимое файла;</li><li>echo states.txt  — не подходит. Предполагается, что вы собираетесь распечатать содержимое файла;</li><li>echo «Привет, как дела?» —  принимает литеральные аргументы.</li></ul><p>cp, touch, rm, chmod относятся к другим примерам.</p><h2>Xargs: когда канала недостаточно</h2><p>Некоторые команды не считываются из стандартного входа, канала или файла. Им, как правило, требуются аргументы. Кроме того, некоторые системы ограничивают количество аргументов в командной строке.</p><p>Например команда rm tmpdir/*.log завершится ошибкой, если файлов .log будет слишком много.</p><p>Итак, команда xargs решает сразу обе проблемы: преобразует стандартный поток ввода команды в литеральные аргументы и разбивает args на допустимое число, многократно запуская команду.</p><p>Например, можно попробовать создать файлы с именами в somelist.txt:</p><p>xargs touch &lt; somelist.txt</p><h2>Параллельность в GNU</h2><p>В данном случае речь идёт о параллельном выполнении задач из командной строки. В некотором смысле похожее на xargs. Что по итогу это даёт?</p><ul><li>Позволяет обрабатывать параметры как независимые аргументы команды и выполнять параллельно команду.</li><li>Осуществляет синхронизированный вывод — как если бы команды в Linux-терминале выполнялись последовательно.</li><li>Обеспечивает настраиваемое количество параллельных заданий.</li><li>Хорошо подходит для выполнения простых команд или скриптов на вычислительных узлах для использования многоядерной архитектуры.</li></ul><p>Необходимо учитывать, что, возможно, потребуется <a href="http://www.gnu.org/software/parallel">специальная установка</a>, так как по умолчанию это недоступно.</p><p>Примеры параллельного выполнения в GNU:</p><p>Для того, чтобы найти все html-файлы и переместить их в каталог:</p><p>find . -имя '*.html' | parallel mv {} web/</p><p>Для того, чтобы удалить файл pict0000.jpg и заменить его на pict9999.jpg (здесь подразумевается одновременное выполнение 16 параллельных заданий):</p><p>seq -w 0 9999 | parallel -j 16 rm pict{}.jpg</p><p>Создание миниатюр для всех файлов изображений (требуется программное обеспечение imagemagick):</p><p>ls *.jpg | parallel convert -geometry 120 {} thumb_{}</p><p>Загрузка из списка URL-адресов и отчёт о неудачных загрузках:</p><p>cat urlfile | parallel "wget {} 2&gt;errors.txt"</p><p>Для дополнительной информации можно ознакомиться с книгой <a href="https://doi.org/10.5281/zenodo.1146014">GNU parallel 2018</a>.</p><h2>Классические инструменты для программирования: find, grep, awk, sed</h2><h3>Особенности find</h3><figure><img src="https://media.tproger.ru/uploads/2020/12/5.png" alt="" /></figure><p>Путь: может иметь несколько вариантов, например .find /usr /opt -iname "*.so".</p><p>Критерии:</p><ul><li>-name,  -iname, -type (f, d, l), -inum &lt;Н&gt;;</li><li>-user&lt;uname&gt;, -group&lt;gname&gt;,  -perm (ugo+/-rwx);</li><li>-size +x[c], -empty, -newer &lt;fname&gt;;</li><li>-atime +x, -amin +x, -mmin -x, -mtime -x;</li><li>критерии могут быть объединены с логическими и (- а) и или (-о).</li></ul><p>Действие:</p><ul><li>-print — действие по умолчанию — отображать;</li><li>-ls — выполните команду ls -lids для каждого результирующего файла;</li><li>-exec cmd — выполнить команду;</li><li>-ok cmd — используется как exec, за исключением того, что команда выполняется после подтверждения пользователем.</li></ul><p>Примеры команд для поиска:</p><ul><li>find . -type f -iname "*.txt" — xt-файлы в curdir;</li><li>find . -maxdepth 1 — эквивалент ls;</li><li>find ./somedir -type f -size +512M -print — все файлы размером более 512M в ./somedir;</li><li>find /usr/bin ! -type l — не символьная ссылка в /usr/bin;</li><li>find $HOME -type f -atime +365 -exec rm {} + — позволяет удалить все файлы, которые не были доступны в течение года;</li><li>find . \( -name "*.c" -o -name "*.h" \) — все файлы, имеющие расширение .c или .h.</li></ul><h3>Grep: поиск шаблонов в тексте</h3><p>Grep изначально представлял собой команду global regular expression print или «g/re/p» в текстовом редакторе ed. Данная функция оказалась настолько полезной, что была разработана отдельная утилита под названием grep.</p><p>Grep позволяет извлекать строки из текста, который соответствует определённому шаблону. Также можно находить строки с определённым рисунком в большом объёме текста. Сюда относится:</p><ul><li>поиск в списке процессов;</li><li>выборочная проверка большого количества файлов на наличие паттерна;</li><li>исключение некоторого фрагмента текста из большого текстового объёма.</li></ul><figure><img src="https://media.tproger.ru/uploads/2020/12/6.png" alt="" /></figure><p>Полезные опции grep:</p><ul><li>-i: игнорировать случай;</li><li>-n: отображение номеров строк вместе со строками;</li><li>-v: инвертированный вывод. Отберутся те строки, которые не совпадают с регулярным выражением;</li><li>-c: печать конкретного количества совпадающих строк;</li><li>-A&lt;n&gt;: включение n-строк после совпадения;</li><li>-B&lt;n&gt;: включение n-строк перед совпадением;</li><li>-o: печать только совпадающего выражения (а не всей строки);</li><li>-E: позволяет использовать «расширенные» регулярные выражения.</li></ul><h2>Регулярные выражения в терминале Linux</h2><p><a href="https://tproger.ru/articles/regexp-for-beginners/">Регулярные выражения</a> (regex) — это язык описания шаблона строк.</p><p>Точка «.» является специальным символом, который будет соответствовать любому символу (кроме новой строки). Например, b.t будет соответствовать bat, bbt, b%t и так далее, но при этом сюда не подойдут bt, xbt.</p><p>Класс символов: один из элементов в квадратных скобках [ ] будет совпадать, при этом допускаются последовательности:</p><p>[Cc]at — соотносится с Cat и cat.<br />[f-h]ate — соотносится с fate, gate, hate.</p><p>Символ «^» внутри класса символов означает отрицание, например:</p><p>b[^eo]at будет соответствовать brat, но не boat или beat.</p><p>Расширенные выражения запускаются с помощью egrep или grep -E, при этом:</p><p>«*» соответствует нулю или более, «+» соответствует одному или более, «?» соответствует нулю или разовому появлению предыдущего символа, например:</p><p>[hc]+at будет соответствовать hat, cat, hhat, chat, cchhat  и т. д.</p><p>«|» является разделителем для нескольких шаблонов, а «(» и «)» позволяют группировать шаблоны, например:</p><p>([cC]at)|([dD]og) будет соответствовать cat, Cat, dog и Dog.</p><p>«{}» может использоваться для указания диапазона повторения, например:</p><p>ba{2,4}t будет соответствовать baat, baaat и baaaat, но не bat.</p><h3>Примеры grep</h3><p>Строки, которые заканчиваются двумя гласными:</p><p>grep '[aeiou][aeiou]$' prose.txt</p><p>Проверка 5 строк до и после строки, где встречается «little»:</p><p>grep -A5 -B5 'little' prose.txt </p><p>Комментируйте команды и выполняйте поиск последних использованных в истории:</p><p>some -hard 'to' \remember --complex=command #success </p><p>history | grep '#success'</p><p>Удостоверьтесь, что вы правильно написали все команды в терминале Linux и избежали возможных двусмысленностей:</p><p>grep -E '^ambig(uou|ou|ouo)s$' /usr/share/dict/linux.words</p><p>find + grep — ещё одна очень полезная комбинация вам на заметку.</p><p>find . -iname "*.py" -exec grep 'add[_-]item' {} +</p><h2>awk: извлечение и использование данных</h2><p>awk — это специальный программируемый фильтр, который считывает и обрабатывает входные данные строку за строкой. Он располагает широким спектром встроенных функций:</p><ul><li>явные поля ($1 ... $NF) и управление записями;</li><li>функции (математические, построчная обработка и т. д.);</li><li>синтаксический анализ и фильтрация регулярных выражений.</li></ul><p>Этот фильтр также позволяет работать с переменными, циклы, условными обозначениями, массивами ассоциативных элементов, пользовательскими функциями.</p><h3>Анатомия awk</h3><p>В большинстве случае используется в качестве однострочной идиомы следующего вида:</p><p>awk ‘awk_prog’ file.txt</p><p>или:</p><p>command | awk ‘awk_prog’</p><p>Где awk_prog это:</p><ul><li>BEGIN {действие} — выполнить определённое действие один раз перед чтением и обработкой входных данных;</li><li>шаблон или условие {действие} — выполнить действие для каждой строки входных файлов и/или stdin, которые удовлетворяют шаблону или условию;</li><li>END {действие} — выполнить определённое действие один раз после прочтения и обработки входных данных.</li></ul><p>В команде нужно указывать хотя бы один из вышеперечисленных разделов.</p><h3>Шаблоны, условия и действия</h3><p>Шаблон — это регулярное выражение, которое соответствует (или не соответствует) входной строке, например:</p><ul><li>/New/ — любая строка, содержащая New;</li><li>/^[0-9]+ / — строка, начинающаяся с цифр;</li><li>/(POST|PUT|DELETE)/ — строка, которая содержит определённые слова;</li></ul><p>Условие — это булевое выражение, которое выбирает входные строки, например:</p><p>$3&gt;1 — строки, для которых третье поле больше, чем 1</p><p>Действие — это последовательность операций, например:</p><ul><li>{print $1, $NF} — печать первого и последнего поля/столбца;</li><li>{print log($2)} — получить журнал второго поля/столбца;</li><li>{for (i=1;i&lt;x;i++){sum += $3}} — получить суммарное значение.</li></ul><p>При этом пользовательские функции могут быть определены и указаны в любом блоке действий.</p><h2>Полезные однострочные awk-команды терминала Linux</h2><ul><li>awk '{print $1}' states.txt;</li><li>awk '/New/{print $1}' states.txt;</li><li>awk NF &gt; 0 prose.txt — печать строк, содержащих хотя бы одно поле (пропустить пустые строки);</li><li>awk '{print NF, $0}' states.txt — поля в каждой строке и в самой строке;</li><li>awk '{длина печати($0)}' states.txt — символы в каждой строке;</li><li>awk 'BEGIN{print substr("New York",5)}' #York;</li></ul><h2>sed: синтаксический анализ и преобразование текста</h2><p>sed — это специальный потоковый редактор, который ищет шаблон в тексте и применяет к нему необходимые изменения.</p><p>Данный редактор может быть в том числе пакетным или неинтерактивным редактором. Его функции заключаются в том, что он считывает из файла или из stdin (при наличии каналов) по одной строке за раз. При этом исходный входной файл остается неизменным (так как sed также является фильтром), после чего результаты преобразуются в стандартные выходные данные.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/7.png" alt="" /></figure><p>Опции sed:</p><ul><li>адрес — может быть номером строки, диапазоном или совпадением. Может быть оставлен по умолчанию, либо являться файлом целиком;</li><li>команда — s:substitute (замена), p:print (печать), d:delete (удалить), a:append (добавить), i:insert (вставить), q:quit (завершить);</li><li>regex — регулярные выражения;</li><li>знак-разграничитель — в данном случае необязательно использовать «/», можно также применять  «|» или «:» или любой другой символ;</li><li>модификатор — его роль может выполнять число n, которое применяет команду к N-му вхождению, g применяет ко всей строке в целом;</li><li>общие признаки состояния sed — -n (без печати), -e (несколько операций), -f (чтение sed из файла), -i (на месте редактирования).</li></ul><p>Полезные примеры sed:</p><ul><li>sed -n '5,9 p' states.txt — печать строк с 5 по 9;</li><li>sed '20,30 s|New|Old|1' states.txt — влияет на 1-е вхождение в стр. 20–30;</li><li>sed -n '$p' states.txt — печать последней строки;</li><li>sed '1,3 d' states.txt — удалить первые 3 строки;</li><li>sed '/^$/d' states.txt — удалить все пустые строки;</li><li>sed '/York/!s/New/Old/' states.txt — заменить всё, кроме  York;</li><li>kubectl -n kube-system get configmap/kube-dns -o yaml | sed 's/8.8.8.8/1.1.1.1/' | kubectl replace -f -.</li></ul><p>В следующей части разберём основные <a href="https://tproger.ru/translations/instrumenty-terminala-linux-vtoraja-chast/">инструменты терминала Linux</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>7 прикольных команд терминалов Linux и macOS, которые заставят вас улыбнуться</title>
      <link>https://tproger.ru/translations/7-funny-linux-and-macos-commands</link>
      <comments>https://tproger.ru/translations/7-funny-linux-and-macos-commands?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Максим Притула]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/7-funny-linux-and-macos-commands</guid>
      <description><![CDATA[<p>Хорошее настроение для работы не менее важно, чем умение пользоваться терминалом. Статья посвящена прикольным командам для Linux и macOS.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/7-funny-linux-and-macos-commands">7 прикольных команд терминалов Linux и macOS, которые заставят вас улыбнуться</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 22 Sep 2020 11:47:40 GMT</pubDate>
      <content:encoded><![CDATA[<p>Работа работой, а веселиться — по расписанию. Мы уже делали <a href="https://tproger.ru/translations/bash-cheatsheet/">Bash-шпаргалку для начинающих</a>, а также <a href="https://tproger.ru/articles/useful-linux-commands/">профи-подборку полезных команд в терминале Linux</a>. Теперь предлагаем подборку прикольных команд в терминале Linux и macOS.</p><p>Примечание Для macOS сначала понадобится установить менеджер пакетов Homebrew.</p><h2>sl</h2><p>Сначала установим:</p><p>Команда sl призывает паровоз, проезжающий у вас в терминале справа налево.</p><figure><img src="https://media.tproger.ru/uploads/2020/09/1-sl-terminal-command.gif" alt="" /></figure><h2>fortune</h2><p>Позвольте компьютеру предсказать вашу судьбу. fortuneвыводит в терминале цитаты, шутки и даже стихи.</p><figure><img src="https://media.tproger.ru/uploads/2020/09/2-fortune-terminal-command.png" alt="" /></figure><p>Детальная информация по применению команды есть на <a href="http://software.clapper.org/fortune/">сайте</a> fortune.</p><h2>cowsay</h2><p>После ввода $ cowsay hello в терминале выйдет корова и «произнесёт» введённые слова (в данном случае hello).</p><figure><img src="https://media.tproger.ru/uploads/2020/09/3-cowsay-terminal-command1.png" alt="" /></figure><p>А если соединить её с командой fortune, то вашу судьбу расскажет вам именно корова:</p><figure><img src="https://media.tproger.ru/uploads/2020/09/3-cowsay-terminal-command2.png" alt="" /></figure><h2>toilet</h2><p>Эта команда превращает введённый текст в ASCII-графику любых цветов:</p><figure><img src="https://media.tproger.ru/uploads/2020/09/4-toilet-terminal-command.png" alt="" /></figure><p>Желающим больше узнать о том, как пользоваться toilet (pun intended), советуем прочитать небольшое <a href="https://delightlylinux.wordpress.com/2015/11/13/colored-text-with-toilet/">руководство</a>.</p><h2>oneko</h2><p>Пожалуй, самая прикольная команда в списке, но только для Linux. После ввода на экране появляется котик, который будет гнаться за курсором.</p><p>А если не любите котов — можно поменять на собачку.</p><h2>xeyes</h2><p>Приложение идёт в комплекте с графической системой x11. Эти глаза не только для забавы: они помогают обнаружить маленький курсор на большом экране.</p><figure><img src="https://media.tproger.ru/uploads/2020/09/6-terminal-command-xeyes.gif" alt="" /></figure><h2>cmatrix</h2><p>cmatrix выводит на экране падающий текст, прямо как в фильме «Матрица». Исходный <a href="https://github.com/abishekvashok/cmatrix">код</a> доступен на GitHub.</p><figure><img src="https://media.tproger.ru/uploads/2020/09/7-terminal-command-cmatrix.gif" alt="" /></figure><p>Напишите в комментариях, какие ещё прикольные команды терминалов Linux и macOS вы знаете! И посоветуйте, пожалуйста, котиков под MacOS. Очень нужно!</p>]]></content:encoded>
    </item>
    <item>
      <title>Руководство по Windows PowerShell для начинающих</title>
      <link>https://tproger.ru/translations/powershell-tutorial</link>
      <comments>https://tproger.ru/translations/powershell-tutorial?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Corewood]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/powershell-tutorial</guid>
      <description><![CDATA[<p>Руководство по Windows PowerShell: пишем скрипты, используем командлеты и конвейер для автоматизации задач администрирования. Начните с нуля прямо сейчас!</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/powershell-tutorial">Руководство по Windows PowerShell для начинающих</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 13 Oct 2018 16:42:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой статье про PowerShell для начинающих мы посмотрим, как писать скрипты, которые помогают оптимизировать управление Windows-окружением.</p><p>PowerShell — это объектно-ориентированный программный движок и скриптовый язык с интерфейсом командной строки, предоставляющий широкие возможности для конфигурирования операционных систем семейства MS Windows. Он предлагает как чисто консольный интерфейс, так и полноценную среду разработки PowerShell ISE (Integrated Scripting Environment, встроенное скриптовое окружение) для скриптов.</p><p>Для запуска интерфейса командной строки введите powershell в меню «Выполнить» (WinKey + R). PowerShell ISE запускается с помощью команды «PowerShell ISE» в том же меню. ISE более предпочтительно, так как предоставляет более широкие возможности разработчику благодаря подсветке синтаксиса, функции автозаполнения кода и другим особенностям, присущим многим «большим» IDE.</p><figure><img src="https://media.tproger.ru/uploads/2018/10/PS2.jpg" alt="" /></figure><h2>Написание и запуск скриптов</h2><p>Скрипты сохраняются в виде файлов с расширением .ps1. Несмотря на то, что PowerShell уже давно является нативной частью ОС Windows, вы не сможете запустить его скрипты простым двойным щелчком. Для этого надо кликнуть правой кнопкой по скрипту и выбрать «Запустить в PowerShell».</p><p>Также существуют системные политики, ограничивающие выполнение скриптов. Можно проверить текущие параметры политики, введя команду Get-ExecutionPolicy. Результатом будет одно из следующих значений:</p><ul><li>Restricted — выполнение скриптов запрещено. Стандартная конфигурация;</li><li>AllSigned — можно запускать скрипты, подписанные доверенным разработчиком; перед запуском скрипта PowerShell запросит у вас подтверждение;</li><li>RemoteSigned — можно запускать собственные скрипты или те, что подписаны доверенным разработчиком;</li><li>Unrestricted — можно запускать любые скрипты.</li></ul><p>Для начала работы необходимо изменить настройку политики запуска на RemoteSigned, используя команду Set-ExecutionPolicy:</p><figure><img src="https://media.tproger.ru/uploads/2018/10/PS5-768x79.jpg" alt="" /></figure><h2>Командлеты</h2><p>Командлеты — это команды с предопределённой функцией, подобные условным операторам в языках программирования. У них есть несколько ключевых особенностей:</p><ul><li>существуют системные, пользовательские и опциональные командлеты;</li><li>результатом выполнения командлета будет объект или массив объектов;</li><li>командлеты могут обрабатывать данные и передавать их другим командлетам с помощью конвейеров;</li><li>командлеты нечувствительны к регистру, так что нет никакой разницы между Get-ADUser, get-aduser и gEt-AdUsEr;</li><li>в качестве разделителя используется символ ; .</li></ul><p>Каждый командлет содержит в себе глагол и существительное, разделяемые дефисом. Например:</p><ul><li>Get-Process — отобразить текущие процессы, запущенные на компьютере;</li><li>Get-Service — отобразить список служб и их статус;</li><li>Get-Content — отобразить содержимое указанного файла, например Get-Content C:\Windows\System32\drivers\etc\hosts.</li></ul><p>При необходимости список всех доступных командлетов можно вывести с помощью Get-Help-Category. Запомните эту команду — она крайне важна для тех, кто изучает PowerShell с нуля, так как помогает быстрее начать ориентироваться в его возможностях.</p><figure><img src="https://media.tproger.ru/uploads/2018/10/PS7.png" alt="" /></figure><p>Также можно создавать свои командлеты, но эта тема выходит за рамки нашего руководства по PowerShell для начинающих.</p><h2>Параметры</h2><p>У каждого командлета есть несколько параметров, определяющих его работу. PowerShell ISE автоматически предлагает все доступные параметры с отображением их типа. Например, Get-Service-NameW* выводит список служб, у которых имя начинается с W. Если вы забыли, какие параметры у введённого командлета, воспользуйтесь Get-Member.</p><p>Например, Get-Process | Get-Member:</p><figure><img src="https://media.tproger.ru/uploads/2018/10/PS9-768x682.jpg" alt="" /></figure><p>Если вы не нашли того, что нужно, или не уверены в том, как правильно задаются параметры, можно даже запросить примеры с помощью параметра -Examples. Встроенное руководство по PowerShell покажет, для чего используются разные параметры:</p><figure><img src="https://media.tproger.ru/uploads/2018/10/PS10-768x563.jpg" alt="" /></figure><p>Некоторые командлеты также могут вызываться с помощью алиасов. Например, вместо Get-Help можно просто написать Help — эта команда также вызовет встроенное руководство по PowerShell.</p><p>При написании больших скриптов или коллективной разработке можно пользоваться комментариями. Каждый комментарий начинается с символа #, а блок комментариев ограничивается комбинациями символов &lt;# и #&gt; в начале и в конце соответственно.</p><h2>Конвейер</h2><p>PowerShell позволяет осуществлять обмен данными между командлетами с помощью конвейера. Например:</p><ul><li>GetService | SortObject -property Status — сортировка запущенных служб по статусу;</li><li>"Hello World!" | Out-File C:\ps\test.txt — запись текста в файл.</li></ul><p>Можно использовать несколько конвейеров. Например, следующий скрипт выводит список имён всех служб за исключением остановленных:</p><p>Get-Service | WHERE {$_.status -eq "Running"} | SELECT displayname</p><h2>Заключение</h2><p>Это руководство для тех, кто изучает PowerShell с нуля, поэтому здесь раскрыты только базовые понятия и приёмы. После его прочтения у вас должно появиться представление о том, что собой представляет этот инструмент. Также мы рассмотрели варианты изменения политики выполнения скриптов, что такое командлет, как они обмениваются данными с помощью конвейера и как получить свойства нужного объекта. Помните, что в случае затруднений можно воспользоваться командлетом Get-Help – это одна из самых важных команд для начинающих изучать PowerShell.</p><p>Если пользуетесь не только Windows, но и Linux, посмотрите статью про <a href="https://tproger.ru/translations/instrumenty-terminala-linux-pervaja-chast/">команды терминала Linux для начинающих</a>. В ней рассказывается про работу с процессами и файлами, навигацию, каналы, xargs, awk и grep.</p>]]></content:encoded>
    </item>
    <item>
      <title>Работаем в терминале Linux как профи: подборка полезных команд</title>
      <link>https://tproger.ru/articles/useful-linux-commands</link>
      <comments>https://tproger.ru/articles/useful-linux-commands?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/useful-linux-commands</guid>
      <description><![CDATA[<p>Приёмы, экономящие время в командной строке: автодополнение по Tab, быстрое возвращение в прошлую рабочую директорию и другие полезные команды.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/useful-linux-commands">Работаем в терминале Linux как профи: подборка полезных команд</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Инструменты терминала Linux]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 21 Sep 2018 17:10:09 GMT</pubDate>
      <content:encoded><![CDATA[<p>Видели про-юзеров Linux, которые эффективно работают в терминале? Хотите так же? Не вопрос: в этой статье мы собрали некоторые из полезных команд, которые помогут вам сэкономить время и повысить продуктивность.</p><h3>Использование табов для автодополнения</h3><p>Когда вы начинаете что-то вводить в терминале, вы можете нажать Tab и вам будут предложены возможные варианты продолжения, которые начинаются с введённой вами строки.</p><p>Например, если вы хотите скопировать файл с именем file1.txt, вы можете ввести только cp f, нажать Tab и увидеть возможные варианты.</p><p>Также Tab можно использовать для автодополнения команд.</p><h3>Возвращение в последнюю рабочую директорию</h3><p>Представьте ситуацию, когда вы спустились глубоко по иерархии папок, затем перешли в папку, которая находится в совершенно другом месте, а потом поняли, что вам нужно вернуться обратно. В таком случае вам всего лишь нужно ввести следующую команду:</p><p>cd -</p><p>Она вернёт вас в последнюю рабочую директорию и вам не придётся вручную вводить длинный путь.</p><p>Примечание Последняя рабочая директория хранится в переменной окружения OLDPWD; вы можете использовать эту переменную для своих целей (попробуйте echo $OLDPWD) или даже подложить команде cd - другой путь (OLDPWD=/usr/bin cd -).</p><h3>Возвращение в домашнюю директорию</h3><p>Это слишком очевидно. Чтобы вернуться в домашнюю директорию из любого места, вы можете использовать следующую команду:</p><p>cd ~</p><p>А вообще, можно ограничиться командой cd и получить тот же результат. В большинстве современных дистрибутивов Linux эта команда должна сработать.</p><h3>Вывести содержимое каталога</h3><p>Вы, наверное, догадываетесь, какая команда нужна для отображения содержимого каталога. Всем известно, что для этого можно использовать ls -l.</p><p>Однако не все знают, что можно обойтись командой ll.</p><p>Конечно, всё зависит от дистрибутива, но в большинстве случаев вы сможете воспользоваться этой командой.</p><p>Примечание На самом деле, ll является не отдельной командой, а псевдонимом для ls -l.</p><h3>Запуск нескольких команд за раз</h3><p>Допустим, вам нужно запустить несколько команд одну за другой. Что вы будете делать? Подождёте завершения первой команды, а затем запустите следующую?</p><p>Вместо этого вы можете использовать разделитель ;. Таким образом можно запустить несколько команд на одной строке. Вам не нужно ждать, пока какая-то из команд завершит свою работу, чтобы запустить следующую.</p><p>command_1; command_2; command_3</p><p>Примечание При запуске команд таким образом, они выполняются не параллельно, а последовательно. Если вам нужен именно первый вариант, то используйте конструкцию (command_1 &amp;); (command_2 &amp;).</p><h3>Запуск нескольких команд за раз при условии, что предыдущая команда была выполнена успешно</h3><p>Как запускать несколько команд за раз вы уже знаете. А как убедиться, что команды не завершились с ошибкой?</p><p>Допустим, вы хотите собрать код и запустить его в случае успешной сборки.</p><p>В этом случае вы можете использовать разделитель &amp;&amp;, который запускает следующую команду только при условии, что предыдущая успешно завершилась.</p><p>command_1 &amp;&amp; command_2</p><p>Как пример использования &amp;&amp; можно привести команду sudo apt update &amp;&amp; sudo apt upgrade для обновления системы через терминал на системах, основанных на Debian.</p><h3>Время убивать</h3><p>Есть несколько способов «убить» программу. Команда killall сделает это по имени, а kill требуется номер процесса. Например, killall chrome убьёт все процессы chrome. Также можно послать любому процессу сигнал прерывания (как Ctrl+C) с помощью kill -INT &lt;номер процесса&gt;.</p><h3>Пора остановиться</h3><p>Чтобы поставить работающую команду на паузу нажмите комбинацию Ctrl+Z, а чтобы продолжить — %.</p><h3>Простой поиск и использование предыдущих команд</h3><p>Представим ситуацию, когда вы воспользовались какой-то командой пару часов назад и снова хотите её использовать, но не можете вспомнить название.</p><p>Здесь поможет обратный поиск. С его помощью можно по заданному условию найти команду в истории.</p><p>Просто нажмите комбинацию Ctrl+R и введите часть команды. Затем вам будут показаны команды из истории, которые удовлетворяют заданному условию.</p><p>Ctrl+R &lt;условие&gt;</p><p>По умолчанию показывается только один результат. Чтобы увидеть больше результатов, нужно повторно нажать Ctrl+R. Чтобы выйти из поиска, нажмите Ctrl+C.</p><p>Учтите, что в некоторых оболочках Bash можно использовать Page Up и Page Down с условием поиска для автодополнения команды.</p><h3>Выводим консоль из зависания после Ctrl+S</h3><p>Многие привыкли использовать комбинацию Ctrl+S для сохранения. Однако после её использования в терминале, он часто зависает. Чтобы вернуть его в нормальное состояние, нажмите комбинацию Ctrl+Q.</p><h3>Переход к началу или концу строки</h3><p>Допустим, вы вводите длинную команду и вдруг понимаете, что вам нужно что-то изменить в её начале. Чтобы попасть в начало или конец строки вы можете несколько раз нажать клавишу стрелки влево/вправо или Home/End. А можете нажать Ctrl+A или Ctrl+E.</p><h3>Чтение лог-файла в реальном времени</h3><p>В ситуациях, когда вам нужно анализировать логи при запущенном приложении, можно использовать команду tail с флагом -f.</p><p>tail -f &lt;путь к лог-файлу&gt;</p><p>Также можно использовать регулярные выражения в grep, чтобы выводить только нужные строки:</p><p>tail -f &lt;путь к лог-файлу&gt; | grep &lt;регулярное выражение&gt;</p><p>Кроме того, вы можете использовать флаг -F, чтобы tail продолжал работу даже в случае удаления лог-файла. Таким образом, когда лог-файл снова будет создан, tail продолжит логирование.</p><p>Если вы хотите просматривать системный лог в реальном времени, воспользуйтесь аналогичной опцией -f команды journalctl:</p><p>journalctl -f</p><h3>Чтение сжатых логов без извлечения</h3><p>Серверные логи обычно сжимаются gzip’ом для сохранения дискового пространства. Это становится проблемой для разработчика или сисадмина, который анализирует эти логи. Возможно, вам придётся скопировать архив в другое место, а затем извлечь его, так как не всегда есть права на извлечение логов.</p><p>К счастью, в таких ситуациях всегда спасут z-команды. Они являются альтернативами обычных команд, которые используются для работы с логами вроде less, cat, grep.</p><p>Поэтому вы можете воспользоваться zless, zcat, zgrep и т.д., даже не извлекая логи.</p><h3>Использование less для чтения файлов</h3><p>Команда cat не всегда лучший выбор для отображения содержимого файла, особенно если он большой — cat выведет сразу весь файл.</p><p>Вы можете использовать Vi, Vim или другой терминальный текстовый редактор, но если вам просто нужно прочитать файл, то команда less подойдёт гораздо лучше.</p><p>less &lt;путь к файлу&gt;</p><p>В less можно искать нужную подстроку, листать по страницам, отображать номера строк и не только. А ещё less может читать не только текстовые документы, но ещё и архивы и другие типы файлов.</p><h3>Использование аргумента предыдущей команды с помощью !$</h3><p>Использование аргумента предыдущей команды может пригодиться во многих ситуациях. Например, вы создали директорию и вам нужно сразу в неё перейти.</p><p>Ещё лучше использовать alt+. . Множественное нажатие точки позволяет выбрать аргумент одной из нескольких предыдущих команд.</p><h3>Использование предыдущей команды в текущей с помощью !!</h3><p>С помощью !! можно вызвать даже всю предыдущую команду. Это особенно полезно в тех случаях, когда оказывается, что для запуска команды нужны рут-привилегии.</p><p>Быстрое sudo !! позволяет сэкономить немного времени.</p><h3>Использование alias для исправления опечаток</h3><p>Вероятно, вы уже знаете, зачем нужна команда alias. Её можно приспособить для исправления опечаток.</p><p>Представим, что вместо grep вы часто пишете gerp. Если вы установите псевдоним следующим образом, то вам не придётся больше перепечатывать команду:</p><p>alias gerp=grep</p><p>К слову, для исправления опечаток не обязательно использовать псевдонимы — утилита <a href="https://github.com/nvbn/thefuck">The Fuck</a> сама исправит предыдущую команду.</p><h3>Перезагружаемся</h3><p>Чтобы выключить компьютер из терминала, введите poweroff, а для перезагрузки — reboot.</p><h3>Вставка скопированного текста в терминал</h3><p>Здесь не всё однозначно, так как между дистрибутивами Linux и терминалами есть определённая разница. Но в общем случае вставить текст можно одним из следующих способов:</p><ul><li>Скопируйте текст и кликните правую кнопку мыши для вставки (работает в Putty и других Windows-клиентах SSH);</li><li>Скопируйте текст и нажмите среднюю кнопку мыши (колёсико) для вставки;</li><li>Ctrl+Shift+C для копирования и Ctrl+Shift+V для вставки;</li><li>В некоторых эмуляторах терминала работает привычная комбинация Ctrl+V.</li></ul><h3>Завершить работающий процесс/команду</h3><p>Возможно, это слишком очевидно. Если у вас запущена команда, работу которой вы хотите завершить, просто нажмите Ctrl+C и команде будет отправлен сигнал прерывания (SIGINT). А если вы хотите быстро покинуть терминал, нажмите комбинацию Ctrl+D, которая для баша и других интерактивных программ означает окончание ввода.</p><h3>Команда для скриптов или команд, которым нужен интерактивный ответ</h3><p>Команда yes может пригодиться, если какой-то скрипт/команда требует взаимодействия с пользователем, которое заключается только в нажатии Y каждый раз.</p><p>yes | &lt;команда или скрипт&gt;</p><h3>Очистить файл, не удаляя его</h3><p>Если вам нужно только очистить содержимое файла, а не удалить его, вы можете сделать это следующим образом:</p><p>&gt; имя_файла</p><h3>Узнать, есть ли файл с определённым текстом</h3><p>В терминале Linux можно искать разными способами. Если вам нужно узнать, есть ли файл(ы) с определённым текстом, можете воспользоваться этой командой:</p><p>grep -Pri &lt;текст_для_поиска&gt; &lt;путь_к_директории&gt;</p><h3>Получаем справку для каждой команды</h3><p>Почти все команды/инструменты командной строки содержат справку с указаниями по работе. Чтобы получить справку, воспользуйтесь этой командой:</p><p>&lt;команда&gt; --help</p><p>Кроме того, порой можно получить более подробную справку с помощью команды man &lt;команда&gt;.</p><h3>Получаем историю команд</h3><p>Если вы хотите взглянуть на все команды, которые вы когда-либо запускали, введите history. Если вам нужен не полный список, а только несколько последних, воспользуйтесь командой fc -l.</p><h3>Быстро запускаем команды из истории</h3><p>При получении команд одним из вышеуказанных способов рядом с каждой командой находится её номер в истории. Чтобы быстро запустить команду из этого списка просто введите !&lt;номер команды&gt;.</p><h3>Выполняем команду в обход истории</h3><p>Если вы хотите выполнить команду так, чтобы она не сохранилась в истории, просто введите пробел перед командой.</p><h3>Поднимаем простой HTTP-сервер</h3><p>Чтобы поднять сервер и сделать доступной текущую директорию по адресу http://localhost:8000/ введите python3 -m http.server.</p><h3>Пишем длинные команды с удобством</h3><p>Если зажать Ctrl, а затем нажать по очереди X и E, то откроется текстовый редактор, в котором можно будет спокойно записать длинную команду, а после выхода из него — выполнить её.</p><h3>Восстанавливаем терминал</h3><p>Если вы вывели в терминал сырые бинарные данные или ещё что-то, что выводить не стоило, то убрать увиденную абракадабру позволит команда reset.</p><h3>Информация о файловых системах</h3><p>Чтобы получить информацию о текущих смонтированных файловых системах с удобным оформлением по столбцам, введите команду mount | column -t.</p><p>Также вы можете воспользоваться командой findmnt, которая отображает информацию в виде красивого дерева и сама форматирует столбцы, а также может найти нужную файловую систему:</p><h3>Деревья процессов</h3><p>Есть инструмент pstree, который умеет рисовать красивые деревья процессов. Например:</p><h3>Экран блокировки</h3><p>Чтобы заблокировать экран, используйте команду $ loginctl lock-session.</p><p>Для разблокировки экрана введите команду $ loginctl unlock-session. Конечно, вряд ли вы сможете использовать терминал при заблокированном экране, однако вы можете пойти обходными путями. Например, можно создать задачу для разблокировки через какое-то время.</p><h3>Супершелл</h3><p>Чтобы запустить шелл от имени суперпользователя, можно воспользоваться командой sudo -s.  Во многих источниках можно встретить вариант sudo su, который тоже работает, но медленнее, так как запускает лишний процесс.</p><h3>Быстро открываем файлы в программе по умолчанию</h3><p>Команда xdg-open позволяет открыть любой файл в соответствующей программе. Например, xdg-open file.txt откроет файл в текстовом редакторе по умолчанию.</p><h3>Статус системных сервисов</h3><p>Чтобы посмотреть статус системных сервисов, введите команду systemctl status или systemctl status &lt;имя сервиса&gt;, если вас интересует конкретный сервис.</p><h3>Быстро ищем файлы</h3><p>Если вам нужно найти файл, но вы не знаете, где конкретно он находится, можно воспользоваться командой find. Например:</p><h3>Используем вывод одной команды в качестве аргумента другой</h3><p>Чтобы использовать вывод одной команды в качестве аргумента другой, используйте конструкцию команда-2 $(команда-1). Например:</p><h3>Календарь</h3><p>Команда cal может нарисовать календарь на текущий месяц (и даже выделить текущее число) или на другой промежуток:</p><h3>Планировщик задач</h3><p>Чтобы выполнить какую-то команду в нужное вам время, воспользуйтесь at:</p><p>echo команда-для-выполнения | at время_выполнения</p><p>Учтите, что эта команда может отсутствовать на вашей системе, и вам придётся установить её самостоятельно.</p><h3>Получаем свой внешний IP</h3><p>Чтобы получить свой внешний IP-адрес введите curl ifconfig.me или curl ipinfo.io/ip. Возможно, сначала вам придётся установить curl.</p><h3>Прогноз погоды</h3><p>Введите команду curl wttr.in/&lt;нужный город&gt; и получите красивую таблицу с прогнозом погоды:</p><h3>Получаем таблицу ASCII</h3><p>Чтобы получить быстрый доступ к таблице ASCII просто введите man ascii.</p><h3>Простой калькулятор</h3><p>Небольшие выражения можно вычислять прямо в терминале. Это можно сделать либо с помощью конструкции echo &lt;выражение&gt; | bc, либо echo $((&lt;выражение&gt;)). Например:</p><h3>Выполняем команду в другой директории и возвращаемся обратно</h3><p>Если вы хотите выполнить команду в другой директории, но при это не хотите покидать текущую, то просто оберните команду скобками. Например, (cd /tmp &amp;&amp; ls). Здесь скобки запускают подшелл (subshell), внутри которого мы и выполняем cd.</p><h3>Узнаём, какие библиотеки нужны команде/библиотеке</h3><p>Чтобы узнать, какие динамические библиотеки нужны программе или библиотеке и как они будут разрешены при запуске, используйте команду ldd:</p><h3>Узнаём, что лежит внутри файла</h3><p>Чтобы определить тип содержимого, находящегося в файле, используйте команду file:</p><h3>Многократный запуск команды</h3><p>Чтобы запускать команду каждые несколько секунд (по умолчанию две) и смотреть на её вывод, воспользуйтесь командой watch &lt;команда&gt;.</p><h3>Время на запуск команды</h3><p>Чтобы узнать, сколько времени уходит на запуск команды, используйте time &lt;команда&gt;.</p><h3>Системные вызовы команды</h3><p>Чтобы узнать, какие системные вызовы совершает программа, введите strace &lt;команда&gt;.</p><h3>Запоминаем набираемую команду</h3><p>Если вы набираете какую-то команду и вам по какой-то причине нужно прерваться и, например, ввести другую команду, вы можете «запомнить» то, что вы ввели комбинацией Ctrl+U, а затем вставить комбинацией Ctrl+Y.</p><h3>Выкачиваем сайты</h3><p>Чтобы выкачать сайт используйте команду wget --random-wait -r -p -e robots=off -U mozilla &lt;адрес сайта&gt;.</p><h3>Проводим туннели</h3><p>С помощью команды ssh -N -L 2001:localhost:80 somemachine можно создать туннель от 80 порта на удалённой машине до 2001 на локальной.</p><p>А какие полезные команды знаете вы? Делитесь в комментариях.</p>]]></content:encoded>
    </item>
    <item>
      <title>IBM представила Redli, новый клиент командной строки для хранилища Redis</title>
      <link>https://tproger.ru/news/ibm-redis-redli</link>
      <comments>https://tproger.ru/news/ibm-redis-redli?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тимур Кондратьев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ibm-redis-redli</guid>
      <description><![CDATA[<p>Открытый CLI-клиент от подразделения IBM Compose упрощает подключение к серверам Redis, защищённым протоколами TLS/SSL, в отличие от redis-cli.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ibm-redis-redli">IBM представила Redli, новый клиент командной строки для хранилища Redis</a>»</p>]]></description>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 25 Aug 2018 12:13:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>Подразделение IBM <a href="https://www.ibm.com/cloud/compose">Compose</a>, которое разрабатывает защищенное облачное окружение для различных баз данных, <a href="https://www.ibm.com/blogs/bluemix/2018/08/introducing-redli-new-redis-command-line-client/">представило</a> open source интерфейс командной строки (CLI) Redli для нереляционной высокопроизводительной СУБД <a href="https://redis.io/">Redis</a>. Особенностью клиента является удобное подключение к серверам, защищенным протоколами безопасности TLS/SSL.</p><h3>Зачем Redis еще один CLI-клиент?</h3><p>Разработчики утверждают, что работа с защищенными серверами Redis с помощью клиента командной строки по умолчанию — redis-cli — доставляет определенные неудобства. Для каждого соединения необходимо настроить утилиту <a href="https://www.stunnel.org/">Stunnel</a>, которая обеспечивает безопасное подключение, с ее помощью направить сервер на локальный порт и, наконец, подключиться к этому порту с помощью redis-cli.</p><p>С одним сервером это не такая большая проблема, но когда постоянно обращаешься к 4 или 5 серверам Redis, приходится держать в голове все локальные порты для каждого сервера. В дополнение к мороке с управлением сертификатами для проверки серверов, это все становится немного утомительным.</p><p>Авторы Redli попробовали решить проблему с помощью скрипта <a href="https://medium.com/ibm-watson-data-lab/how-to-stunnel-to-redis-on-demand-with-stunredis-960d804b3d68">stunredis</a> для автоматизированной настройки туннелей по запросу, но он не всегда работал корректно.</p><h3>Что умеет Redli?</h3><p>Специалисты IBM написали CLI-клиент на языке программирования Go с использованием обработчика флагов командной строки Redigo, интерактивной библиотеки и JSON из документации Redis. Среди ключевых возможностей Redli:</p><ul><li>схемы rediss: в унифицированных идентификаторах ресурса (<a href="https://ru.wikipedia.org/wiki/URI">URI</a>) для полного указания соединения с БД Redis;</li><li>флаг --tls для активации протоколов TLS/SSL, а также -h, -p и -a, которые аналогичны таковым в redis-cli;</li><li>флаг --long, показывающий полное имя сервера и порт в строке;</li><li>help с помощью по каждой команде;</li><li>завершение вкладки для команд;</li><li>история каждого сеанса;</li><li>все поддерживаемые Redis команды, в том числе и будущие;</li><li>немедленное выполнение операций Redis, написанных сразу после команды Redli.</li></ul><p>По сообщениям разработчиков, из-за принципов работы интерфейса он пока не поддерживает особенные флаги отладки и отчетов --stat, --latency и --bigkeys. Это будет исправлено в последующих обновлениях.</p><p>Все установочные файлы доступны на <a href="https://github.com/IBM-Cloud/redli/releases/latest">GitHub-странице</a> проекта, а распространяются они под лицензией Apache 2.</p><p>В феврале 2017 года из-за проблем с кластерами Redis система управления версиями GitLab <a href="https://tproger.ru/news/gitlab-down-again-due-to-redis-cluster-problems/">вышла из строя</a> на полчаса после неудачной попытки обновления.</p>]]></content:encoded>
    </item>
    <item>
      <title>PowerShell стала доступной на Linux в формате snap</title>
      <link>https://tproger.ru/news/powershell-linux-snap</link>
      <comments>https://tproger.ru/news/powershell-linux-snap?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тимур Кондратьев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/powershell-linux-snap</guid>
      <description><![CDATA[<p>Snap-версия PowerShell для Linux упрощает установку, обновляется автоматически и поддерживает несколько ОС. Также доступна превью-версия.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/powershell-linux-snap">PowerShell стала доступной на Linux в формате snap</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 23 Jul 2018 07:31:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Оболочка командной строки от Microsoft с открытым кодом PowerShell Core <a href="https://blog.ubuntu.com/2018/07/20/powershell-launches-as-a-snap">получила</a> snap-версию для ОС Linux. Инструмент построен на базе платформы .NET и работает не только на десктопе, но и в облаке, а также на устройствах «интернета вещей».</p><p>PowerShell разработана специально для администраторов гибридных облачных систем и пользователей, желающих автоматизировать управление операционной системой и ее программами.</p><figure><img src="https://media.tproger.ru/uploads/2018/07/UbuntuSnap_b7yOPlK.jpg" alt="" /></figure><h3>Ключевые особенности PowerShell</h3><p>Самодостаточные пакеты в формате <a href="https://snapcraft.io/?_ga=2.45464484.1890798184.1532277623-924791472.1531297600">snap</a> работают нативно на популярных Linux-дистрибутивах, обновляются автоматически и предоставляют высокий уровень безопасности для пользователей. По словам авторов проекта, snap-версия устанавливается проще, чем классические приложения, получает прямые обновления от Microsoft и обеспечивает гибкость при работе с несколькими ОС.</p><p>Microsoft также <a href="https://snapcraft.io/powershell-preview?_ga=2.246846212.1890798184.1532277623-924791472.1531297600">опубликовала</a> превью-версию программы для всех желающих опробовать новые функции первыми. Она распространяется как отдельный пакет, поэтому ей можно пользоваться наряду со стабильным релизом. Подробнее узнать о PowerShell для Linux можно в <a href="https://blogs.msdn.microsoft.com/powershell/2018/07/20/powershell-core-now-available-as-a-snap-package/">блоге</a> компании.</p><p>Загрузить обе версии можно с помощью команд snap install powershell –classic и snap install powershell-preview –classic.</p><p>В версию Linux-дистрибутива Ubuntu 18.04 LTS была полностью <a href="https://tproger.ru/news/ubuntu-18-04-lts/">интегрирована</a> поддержка пакетов в формате snap. Каталог snap-приложений в официальном магазине пополнился 3 тысячами пакетов популярных программ.</p>]]></content:encoded>
    </item>
    <item>
      <title>Делаем всё в терминале: от конвертации валют и до прогноза погоды</title>
      <link>https://tproger.ru/digest/terminal-tools</link>
      <comments>https://tproger.ru/digest/terminal-tools?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Vladimir Gabrinevski]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/terminal-tools</guid>
      <description><![CDATA[<p>Коллекция bash-скриптов для терминала включает конвертер валют, прогноз погоды, шифрование. Протестирована на MacOS и Linux. Установка через homebrew или Git.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/terminal-tools">Делаем всё в терминале: от конвертации валют и до прогноза погоды</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 13 Jun 2018 11:10:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Коллекция небольших bash-скриптов для поклонников работы в терминале. В набор входит конвертер валют и криптовалют, прогноз погоды, шифрование файлов и другие полезные инструменты.</p><p>Все скрипты из набора Bash-Snippets были полностью протестированы на MacOS и Linux. Большинство этих скриптов было протестировано на Windows 10. Скрипты не работают с Cygwin или Mysys2.</p><h2>Установка</h2><p>Для MacOS через homebrew, для Linux через linuxbrew:</p><p>Все скрипты:<br />brew install bash-snippets # installs all tools</p><p>Отдельные скрипты:<br />brew install bash-snippets --without-all-tools --with-newton --with-weather</p><p>Установка через Git:</p><p>Для начала необходимо клонировать репозиторий:</p><p>git clone https://github.com/alexanderepstein/Bash-Snippets</p><p>Затем нужно перейти в клонированную директорию:</p><p>cd Bash-Snippets</p><p>Запустить скрипт управляемой установки, это позволит выбрать какие скрипты устанавливать:</p><p>./install.sh</p><p>Установить все скрипты:</p><p>./install.sh all</p><p>Установить отдельный скрипт, указав его имя:</p><p>./install.sh stocks</p><h2>Скрипты</h2><h3>Youtube-Viewer</h3><p>Дает возможность запустить просмотр видео прямо из терминала. Можно использовать ytview -c [channel name] чтобы просмотреть недавние видео с этого канала. Или использовать ytview -s [videoToSearch] или просто ytview [videoToSearch] для поиска.<a href="https://media.tproger.ru/uploads/2017/12/ytview.jpg"></a></p><h3>Weather</h3><p>Показывает прогноз погоды на 3 дня. Если запустить команду без аргументов, погода будет показана исходя из геопозиции IP-адреса.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/weather.png" alt="" /></figure><p>Можно получить более точный прогноз погоды, передав аргументами город и страну. Также эта команда может показывать текущую фазу луны.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/moon.jpg" alt="" /></figure><h3>Meme</h3><p>Моментальный генератор мемов.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/meme.jpg" alt="" /></figure><h3>Qrify</h3><p>Переводит любую текстовую строку в QR-код. Может быть полезно для передачи ссылок или сохранения текстовых команд в телефон.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/qrify.png" alt="" /></figure><h3>Short</h3><p>Раскрывает полный вариант сокращенной ссылки.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/short.png" alt="" /></figure><h3>Cheat</h3><p>Это самый быстрый способ найти необходимые параметры команд или куски кода. Поддерживает различные языки и множество bash-команд.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/cheat.jpg" alt="" /></figure><h3>Cloudup</h3><p>Инструмент, который облегчает резервное копирование репозиториев Github на Bitbucket.  Кроме того, вы можете сделать резервную копию хранилищ любого пользователя Github на ваш Bitbucket.</p><p>Используя флаг -a можно скопировать все репозитории. Запустив команду без флагов можно копировать репозитории выборочно.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/cloudup.jpg" alt="" /></figure><h3>Crypt</h3><p>Обертка для openssl, позволяющая быстро шифровать и расшифровывать файлы.</p><p>crypt -e [original file] [encrypted file] # encrypts filescrypt -d [encrypted file] [output file] # decrypts files</p><p>Детали шифрования:</p><ul><li>использует алгоритм шифрования AES 256;</li><li>cоль создается перед созданием ключа;</li><li>пароль не отображается в открытом виде, когда OpenSSL генерирует ключ на основе пароля;</li><li>зашифрованные данные кодируются в Base64, чтобы их можно было использовать как обычный текст в электронном письме. (Обычно не требуется, если данные прикреплены как файл)</li></ul><p>ВНИМАНИЕ: Используйте разные имена файлов, иначе ваш файл будет перезаписан!</p><figure><img src="https://media.tproger.ru/uploads/2017/12/crypt.jpg" alt="" /></figure><h3>Cryptocurrency</h3><p>Это конвертер криптовалют, который использует обменные курсы в реальном времени.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/cryptocurrency.jpg" alt="" /></figure><p>В примере показано, что после запуска cryptocurrency, скрипт предлагает ввести значения для трех аргументов:</p><p>Базовая валюта – BTC<br />Валюта назначения – доллар США<br />Сумма – 12,35<br />Если вы хотите обойти управляемый ввод, вы можете передать 3 аргумента с командой:</p><p>cryptocurrency [базовая валюта] [валюта назначения] [сумма обмена]Допустимым вариантом использования будет:</p><p>cryptocurrency BTC USD 12,35</p><h3>Currency</h3><p>Конвертер валют. Использует обменные курсы в реальном времени.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/currency.png" alt="" /></figure><p>Если вы не хотите использовать интерактивный ввод, вы можете передать 3 аргумента с командой:</p><p>currency [базовая валюта] [валюта назначения] [сумма обмена]</p><h3>Geo</h3><p>Предоставляет данные о WAN IP, LAN IP, IP-адрес роутера, DNS, MAC-адрес и IP по геолокации.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/geo.png" alt="" /></figure><h3>Lyrics</h3><p>Находит текст для указанной песни.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/lyrics.jpg" alt="" /></figure><h3>Movies</h3><p>Быстрый поиск информации о фильме.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/movies.jpg" alt="" /></figure><h3>Newton</h3><p>Выполняет любые вычисления вплоть до символьных.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/newton.png" alt="" /></figure><h3>Siteciphers</h3><p>С помощью команды siteciphers можно узнать, какие алгоритмы шифрования и хеширования включены или отключены для указанного сайта. Некоторые алгоритмы считаются уязвимыми, поэтому при смене конфигурации компьютера и ПО может быть полезно знать отключен ли он на самом деле.</p><p>Отдельные браузеры (например старые версии IE) не поддерживают некоторые новые криптографические алгоритмы. В такой ситуации список поддерживаемых алгоритмов поможет сделать необходимые настройки.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/siteciphers.jpg" alt="" /></figure><h3>Stocks</h3><p>Предоставляет информацию о конкретном тикере акций.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/stocks.jpg" alt="" /></figure><h3>Taste</h3><p>Движок предлагает 3 рекомендации, исходя из указанного элемента. Доступные темы: шоу, книги, музыка, артисты, фильмы, авторы, игры.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/taste.png" alt="" /></figure><p>Необходим ключ API (бесплатный). Получить ключ можно на <a href="https://tastedive.com">официальном сайте</a> проекта. После того, как ключ получен, необходимо запустить следующую команду:</p><p>export TASTE_API_KEY="yourAPIKeyGoesHere" &gt;&gt; ~/.bash_profile</p><h3>Todo</h3><p>Простой список дел для командной строки.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/todo.jpg" alt="" /></figure><h3>Transfer</h3><p>Быстрая передача файлов с помощью командной строки.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/transfer.png" alt="" /></figure><p>Любите работать в терминале? Тогда посмотрите <a href="https://tproger.ru/articles/cool-linux-commands/">полезные команды Linux</a> для терминала.</p>]]></content:encoded>
    </item>
    <item>
      <title>Интересные проекты: пробрасываем трафик через Telegram</title>
      <link>https://tproger.ru/articles/teletun-ip-over-telegram</link>
      <comments>https://tproger.ru/articles/teletun-ip-over-telegram?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/teletun-ip-over-telegram</guid>
      <description><![CDATA[<p>Teletun — GitHub-проект для проброса IP-трафика через Telegram. Для работы нужен telegram-cli, скрипт запускается на двух сторонах (клиент и сервер).</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/teletun-ip-over-telegram">Интересные проекты: пробрасываем трафик через Telegram</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 May 2018 10:46:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вы когда-нибудь хотели передавать IP-трафик через мессенджер? Хотели проверить, на что способен Telegram?</p><p>Что значит «нет»? А надо! Ловите <a href="https://github.com/PiMaker/Teletun">Teletun</a> и наслаждайтесь!</p><h2>Установка</h2><p>Установите пакет <a href="https://github.com/vysheng/tg">telegram-cli</a> (например, с помощью snap).</p><p>Запустите telegram-cli следующим образом:</p><p>Убедитесь, что -P написана с большой буквы.</p><p>Установите зависимости:</p><p>Скачайте <a href="https://github.com/PiMaker/Teletun/blob/master/teletun.py">скрипт</a> и запустите его. Молитесь в ожидании чуда.</p><p>Обратите внимание, одна сторона запускает скрипт без параметров, а вторая должна передать параметр --server. Затем клиент будет доступен по адресу 10.8.0.1 или 10.8.0.2 в зависимости от того, с какой стороны вы находитесь.</p><p>Как бы нелепо это ни звучало, но на многих платформах для нормальной работы нужны root-права.</p><h2>Производительность</h2><p>Не то чтобы это имело значение (вы же не думали, что будете использовать это для чего-то серьёзного?), но производительность не так уж и плоха.</p><p>Конечно, пропускная способность сильно ограничена, но зато пинг находится в пределах 100-150 мс. Наверное поэтому Telegram называется системой для обмена мгновенными сообщениями.</p>]]></content:encoded>
    </item>
    <item>
      <title>Краткий man: обзор инструмента tldr</title>
      <link>https://tproger.ru/articles/short-man-pages</link>
      <comments>https://tproger.ru/articles/short-man-pages?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Хачатурян]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/short-man-pages</guid>
      <description><![CDATA[<p>Инструмент tldr превращает длинные man-справки в короткие подсказки; коллекция для UNIX, Linux, macOS и SunOS пополняется сообществом.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/short-man-pages">Краткий man: обзор инструмента tldr</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 26 Apr 2018 09:37:31 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сообщество из более чем 500 разработчиков на GitHub <a href="https://github.com/tldr-pages/tldr">выпустило</a> инструмент для краткого представления справочных материалов — так называемых man-ов.</p><h3>TL;DR</h3><p>Разработка получила название tldr – сокращение от Too Long;Didn’t Read (слишком длинно;не читал). Она сокращает справку к популярным утилитам, делая её более дружелюбной. Очень легко забыть, за что отвечают lsof или tar. И вызов помощника через man tar не очень-то упрощает жизнь:</p><p>Вместо этого tldr предлагает ознакомиться со следующими подсказками:<br /><a href="https://media.tproger.ru/uploads/2017/12/Snimok-jekrana-2018-02-19-v-22.13.19.jpg"></a></p><p>Репозиторий инструмента постоянно пополняется новыми коллекциями самых распространённых утилит UNIX, Linux, macOS и SunOS.</p><h3>Клиенты</h3><p>У tldr есть множество реализаций:</p><ul><li><a href="https://github.com/cs1707/tldr-alfred">Alfred Workflow</a>;</li><li>Клиенты для Android:tldr-viewer, доступный в Google Play;tldroid, доступный в Google Play;</li><li>Клиенты для Bash:tldr;tldr-bash-client;</li><li><a href="https://github.com/tldr-pages/tldr-cpp-client">Клиент для C++</a>: brew install tldr;</li><li><a href="https://github.com/porras/tlcr">Клиент для Crystalt</a>: brew install porras/tap/tlcr;</li><li><a href="https://github.com/hterkelsen/tldr">Клиент для Dart</a>: pub global activate tldr;</li><li><a href="https://github.com/Moddus/tldr-python-dash-docset">Dash docset</a>: Preferences &gt; Downloads &gt; User Contributed, пункт списка tldr pages;</li><li><a href="https://github.com/edgurgel/tldr_elixir_client">Клиент для Elixir</a> (бинарные файлы пока не доступны);</li><li><a href="https://github.com/kuanyui/tldr.el">Клиент для Emacs</a>, доступен в <a href="https://github.com/melpa/melpa">MELPA</a>;</li><li>Клиенты для Go:github.com/pranavraja/tldr: go get github.com/pranavraja/tldr(или скомпилированные релизы);4d63.com/tldr: go get 4d63.com/tldr или brew install 4d63/tldr/tldr(или скомпилированные релизы);</li><li>Клиенты для iOS:tldr-man-page, доступен в App Store;tldr-pages, доступен в App Store;</li><li><a href="https://github.com/psibi/tldr-hs">Клиент для Haskell</a>: stack install tldr;</li><li><a href="https://github.com/tldr-pages/tldr-node-client">Клиент для Node.js</a>: npm install -g tldr;</li><li><a href="https://github.com/shoichikaji/perl-tldr">Клиент для Perl5</a>: cpanm App::tldr;</li><li><a href="https://github.com/BrainMaestro/tldr-php">Клиент для PHP</a>: composer global require brainmaestro/tldr;</li><li>Клиенты для Python:tldr-python-client: pip install tldr;tldr.py: pip install tldr.py;</li><li><a href="https://github.com/kirillseva/tldrrr">Клиент для R</a>: devtools::install_github('kirillseva/tldrrr');</li><li><a href="https://github.com/YellowApple/tldrb">Клиент для Ruby</a>: gem install tldrb;</li><li>Клиенты для Rust:rust-tldr (тонкий клиент с поиском онлайн): cargo install tldr;tealdeer (полноценный клиент с оффлайн кэшем): cargo install tealdeer;</li><li>Веб-клиенты:tldr.jsx: http://tldr.ostera.io/;DistroWatch.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Пишем инструменты командной строки на Python с помощью Click</title>
      <link>https://tproger.ru/translations/python-command-line-tools-with-click</link>
      <comments>https://tproger.ru/translations/python-command-line-tools-with-click?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/python-command-line-tools-with-click</guid>
      <description><![CDATA[<p>Библиотека Click помогает превратить простой Python-скрипт в интерфейс командной строки с аргументами, опциями и инструкциями по использованию.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/python-command-line-tools-with-click">Пишем инструменты командной строки на Python с помощью Click</a>»</p>]]></description>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 01 Feb 2018 14:30:39 GMT</pubDate>
      <content:encoded><![CDATA[<p>Python — невероятно гибкий язык программирования, который хорошо интегрируется с существующими программами. Немало Python-кода написано в виде скриптов и интерфейсов командной строки (CLI).</p><p>Инструменты и интерфейсы командной строки — эффективная вещь, так как они позволяют автоматизировать практически всё что угодно. Как следствие, эти интерфейсы с течением времени могут стать довольно сложными.</p><p>Обычно всё начинается с простого скрипта на Python, который что-то делает. Например, получает доступ к веб-API и выводит результат в консоль:</p><p>Вы можете запустить этот скрипт с помощью команды python3 print_user_agent.py, и он выведет имя user-agent, использованного для вызова API.</p><p>Как и было сказано, довольно простой скрипт.</p><p>Но что делать, когда подобная программа растёт и становится всё более сложной?</p><p>Решением этого вопроса мы сегодня и займёмся. Вы узнаете об основах написания интерфейсов командной строки на Python и о том, как click позволяет упростить этот процесс.</p><p>Используя эти знания, мы шаг за шагом перейдём от простого скрипта к интерфейсу командной строки с аргументами, опциями и полезными инструкциями по использованию. Всё это мы сделаем с помощью библиотеки click.</p><p>К концу этой статьи вы будете знать:</p><ul><li>Почему click — лучшая альтернатива <a href="https://docs.python.org/3/library/argparse.html">argparse</a> и <a href="https://docs.python.org/2/library/optparse.html">optparse</a>;</li><li>Как с его помощью создать простой CLI;</li><li>Как добавить обязательные аргументы командной строки в ваши скрипты;</li><li>Как парсить флаги и опции командной строки;</li><li>Как сделать ваши консольные приложения более удобными, добавив справочный текст.</li></ul><p>Вы увидите, как сделать всё это с минимальным количеством <a href="https://en.wikipedia.org/wiki/Boilerplate_code">шаблонного кода</a>.</p><p>Примечание переводчика Код в данной статье написан на Python 3.6, работоспособность на более ранних версиях не гарантируется.</p><p>Итак, начнём!</p><h2>Зачем вам писать скрипты и инструменты для командной строки на Python?</h2><p>Код выше — всего лишь пример, не очень полезный в реальной жизни. На самом деле скрипты бывают куда более сложные. Возможно, вы имели опыт с ними и знаете, что они могут быть важной частью нашей повседневной работы: некоторые скрипты остаются на протяжении всего времени жизни проекта, для которого они были написаны. Некоторые начинают приносить пользу другим командам или проектам. У них даже может расширяться функционал.</p><p>В этих случаях важно сделать скрипты более гибкими и настраиваемыми с помощью параметров командной строки. Они позволяют указать имя сервера, учётные данные или любую другую информацию скрипту.</p><p>Здесь приходят на выручку такие модули, как optparse и argparse, которые делают нашу жизнь на порядок проще. Но прежде чем мы с ними познакомимся, давайте разберёмся с терминологией.</p><h2>Основы интерфейса командной строки</h2><p>Интерфейс командной строки (CLI) начинается с имени исполняемого файла. Вы вводите имя в консоль и получаете доступ к главной точке входа скрипта, такого как pip.</p><p>В зависимости от сложности CLI обычно есть определённые параметры, которые вы можете передавать скрипту:</p><ol><li>Аргумент, который является обязательным параметром. Если его не передать, то CLI вернёт ошибку. Например, в следующей команде click является аргументом: pip install click.</li><li>Опция — необязательный параметр, который объединяет имя и значение, например --cache-dir ./my-cache. Вы говорите CLI, что значение ./my-cache должно использоваться как директория для кэша.</li><li>Флаг, который включает или выключает определённый сценарий. Вероятно, самым частым является --help. Вы только указываете имя, а CLI самостоятельно интерпретирует значение.</li></ol><p>С более сложными CLI, такими как pip или <a href="https://devcenter.heroku.com/articles/heroku-cli">Heroku CLI</a>, вы получаете доступ к набору функций, которые собраны под главной точкой входа. Они обычно называются командами или подкомандами.</p><p>Возможно, вы уже использовали CLI, когда устанавливали Python-библиотеку с помощью команды pip install &lt;имя пакета&gt;. Команда install говорит CLI, что вы хотите использовать функцию установки пакета, и даёт вам доступ к параметрам, характерным для этой функции.</p><h2>Пакеты для работы с командной строкой, доступные в стандартной библиотеке Python 3.x</h2><p>Добавление команд и параметров в ваши скрипты может сделать их значительно лучше, но парсить командную строку не так просто, как может показаться. Однако вместо того, чтобы пытаться самостоятельно решить эту проблему, лучше воспользоваться одним из многих пакетов, которые сделали это за вас.</p><p>Два наиболее известных пакета для этого — optparse и argparse. Они являются частью стандартной библиотеки Python и добавлены туда по принципу «всё включено».</p><p>По большей части они делают одно и то же и работают схожим образом. Главное отличие заключается в том, что optparse не используется начиная с Python 3.2, и argparse считается стандартом для создания CLI в Python.</p><p>Вы можете узнать о них больше в документации Python, но, чтобы иметь представление, как выглядит скрипт с argparse, посмотрите на пример ниже:</p><h2>click против argparse: лучшая альтернатива?</h2><p>Вероятно, вы смотрите на этот код и думаете: «Что это всё значит?» И это является одной из проблем argparse: код с ним неинтуитивен и сложночитаем.</p><p>Поэтому вам может понравиться <a href="http://click.pocoo.org/5/">click</a>.</p><p>Click решает ту же проблему, что и optparse и argparse, но немного иначе. Он использует декораторы, поэтому ваши команды должны быть функциями, которые можно обернуть этими декораторами.</p><p>С click легко создавать многофункциональный CLI с небольшим количеством кода. И этот код будет легко читаться, даже когда ваш CLI вырастет и станет более сложным.</p><h2>Пишем простой CLI на Python с помощью click</h2><p>Вдоволь поговорив о CLI и библиотеках, давайте взглянем на пример, чтобы понять, как написать простой CLI с click. Как и в первом примере, мы создаём простой CLI, который выводит результат в консоль. Это несложно:</p><p>Не пугайтесь последних двух строк: это то, как Python запускает функцию main при исполнении файла как скрипта.</p><p>Как вы видите, всё, что нам нужно сделать — создать функцию и добавить к ней декоратор @click.command(). Он превращает функцию в команду, которая является главной точкой входа нашего скрипта. Теперь вы можете запустить скрипт через командную строку и увидеть что-то вроде этого:</p><p>Что в click здорово, так это то, что мы получаем некоторые дополнительные возможности просто так. Мы не реализовывали справочную функцию, однако вы можете добавить флаг --help и увидеть базовое сообщение:</p><h2>Более реалистичный пример CLI на Python с использованием click</h2><p>Теперь, когда вы знаете, как click упрощает написание CLI, давайте взглянем на более реалистичный пример. Мы напишем программу, которая позволяет нам взаимодействовать с веб-API.</p><p>API, который мы дальше будем использовать, — <a href="https://openweathermap.org/api">OpenWeatherMap API</a>. Он предоставляет информацию о текущей погоде, а также прогноз на пять дней для определённого местоположения. Мы начнём с тестового API, который возвращает текущую погоду для места.</p><p>Прежде чем мы начнём писать код, давайте познакомимся с API. Для этого можно использовать сервис <a href="https://httpie.org/">HTTPie</a>, включая <a href="https://httpie.org/run">онлайн-терминал</a>.</p><p>Давайте посмотрим, что случится, когда мы обратимся к API с Лондоном в качестве местоположения:</p><p>Если вы смущены наличием API-ключа в примере сверху, не переживайте, это тестовый API-ключ, предоставляемый сервисом.</p><p>Более важное наблюдение заключается в том, что мы отправляем два параметра (обозначаемые == при использовании HTTPie), чтобы узнать текущую погоду:</p><ul><li>q — место, в котором мы хотим узнать погоду;</li><li>appid — наш API-ключ.</li></ul><p>Это позволяет нам создать простую реализацию на Python с использованием библиотеки requests (опустим обработку ошибок и неудачных запросов для простоты):</p><p>Эта функция делает простой запрос к API, используя два параметра. В качестве обязательного аргумента она принимает location (местоположение), которое должно быть строкой. Также мы можем указать API-ключ, передавая параметр api_key при вызове функции. Это необязательно, так как по умолчанию используется тестовый ключ.</p><p>И вот мы видим текущую погоду в <a href="https://docs.python.org/3.6/tutorial/interpreter.html">Python REPL</a>:</p><h2>Парсим обязательные параметры с click</h2><p>Простая функция current_weather позволяет нам создать CLI с местоположением, указанным пользователем. Это должно работать примерно так:</p><p>Как вы, возможно, догадались, местоположение — это аргумент, поскольку оно является обязательным параметром для нашего погодного CLI.</p><p>Как нам сделать это при помощи click? Всё довольно просто, мы используем декоратор под названием argument. Кто бы мог подумать?</p><p>Давайте возьмём наш предыдущий пример и слегка изменим его, добавив аргумент location:</p><p>Если этот print выглядит для вас странно, не волнуйтесь — это новый способ форматирования строк в Python 3.6+, который называется f-форматированием.</p><p>Как вы видите, всё, что нам нужно сделать, это добавить дополнительный декоратор к нашей функции main и дать ему имя. Click использует имя в качестве имени аргумента, переданного обёрнутой функции.</p><p>Примечание переводчика Имя аргумента, переданное click, должно совпадать с именем аргумента в объявлении функции.</p><p>В нашем случае значение аргумента командной строки location будет передано функции main в качестве аргумента location. Логично, не так ли?</p><p>Также вы можете использовать тире в именах, например api-key, которые click переведёт в <a href="https://ru.wikipedia.org/wiki/Snake_case">snake case</a> для имени аргумента в функции, например main(api_key).</p><p>Реализация main просто использует нашу функцию current_weather для получения погоды в указанном месте. И затем мы с помощью print выводим полученную информацию.</p><p>Готово!</p><h2>Парсим опциональные параметры с click</h2><p>Как вы, возможно, догадались, тестовый API ограничивает нас в возможностях. Поэтому, прежде чем мы продолжим, <a href="https://openweathermap.org/appid">зарегистрируйтесь</a> и получите настоящий API-ключ.</p><p>Первое, что нам нужно изменить, — URL, откуда берутся данные о текущей погоде. Это можно сделать, изменив значение переменной url в функции current_weather на URL, указанный в <a href="https://openweathermap.org/current">документации OpenWeatherMap</a>:</p><p>Это изменение приведёт к неработоспособности нашего CLI, так как указанный API-ключ не работает с реальным API. Поэтому давайте добавим новый параметр в наш CLI, который позволит нам указывать API-ключ. Но сначала мы должны решить, будет ли этот параметр аргументом или опцией. Мы сделаем его опцией, так как добавление параметра вроде --api-key делает его более явным и говорящим за себя.<br />Мы хотим, чтобы наша программа запускалась таким образом:</p><p>Проще простого. Посмотрим, как добавить опцию к нашей существующей команде:</p><p>И снова мы добавляем декоратор к нашей функции main. В этот раз мы используем декоратор с говорящим именем @click.option и указываем имя для нашей опции, начинающееся с двух тире. Как вы видите, мы также можем указать сокращение для нашей опции с одним тире, чтобы сэкономить пользователю немного времени.</p><p>Как было сказано ранее, click создаёт аргумент для передачи в функцию main из длинного варианта имени. В случае с опцией он убирает впередистоящие тире и переводит её в snake case. Таким образом, --api-key становится api_key.</p><p>Чтобы всё заработало, осталось лишь передать API-ключ в функцию current_weather.</p><p>Мы добавили возможность указывать свой собственный ключ и проверять погоду в любом месте:</p><h2>Добавляем автоматически генерируемые инструкции по использованию</h2><p>Можете себя похвалить, вы создали отличный небольшой CLI почти без шаблонного кода. Однако прежде чем вы решите отдохнуть, давайте убедимся, что новый пользователь будет знать, как пользоваться нашим CLI, путём добавления документации. Не бойтесь, всё будет просто.</p><p>Сначала давайте проверим, что выведет флаг --help после всех сделанных изменений. Довольно неплохо, учитывая что мы не приложили к этому никаких усилий:</p><p>Первое, что нужно исправить, это добавить описание для нашей опции с API-ключом. Всё, что нам для этого нужно сделать, — добавить справочный текст в декоратор @click.option:</p><p>Второе (и последнее), что мы сделаем, — добавим документацию для всей click-команды. Самый простой и самый питонический способ сделать это — добавить строку документации в нашу функцию main. Да, нам в любом случае нужно сделать это, поэтому это не лишняя работа:</p><p>Сложив всё вместе, мы получаем хороший вывод для нашего инструмента:</p><h2>Подводим итоги</h2><p>Итак, в этом уроке мы рассмотрели много всего. Можете гордиться собой, вы написали свой собственный CLI, и всё это с минимальным количеством шаблонного кода! Исходный код ниже доказывает это. Не стесняйтесь использовать его для собственных экспериментов:</p>]]></content:encoded>
    </item>
    <item>
      <title>Автоматизируем аргументы командной строки на Python с Google Fire</title>
      <link>https://tproger.ru/translations/python-command-line-tools-with-google-fire</link>
      <comments>https://tproger.ru/translations/python-command-line-tools-with-google-fire?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/python-command-line-tools-with-google-fire</guid>
      <description><![CDATA[<p>Google Fire помогает быстро создавать интерфейсы командной строки на Python, но уступает Click по числу доступных функций.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/python-command-line-tools-with-google-fire">Автоматизируем аргументы командной строки на Python с Google Fire</a>»</p>]]></description>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 01 Feb 2018 14:28:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сегодня мы рассмотрим библиотеку Fire, которая позволяет автоматизировать интерфейсы командной строки (CLI) на Python.</p><p><a href="https://github.com/google/python-fire">Fire</a> — самая популярная после <a href="https://github.com/tensorflow/tensorflow">TensorFlow</a> разработка для Python, которую Google выложил в открытый доступ:</p><figure><img src="https://media.tproger.ru/uploads/2018/01/pic1.jpg" alt="" /></figure><p>Правда, она не настолько популярна…</p><p>Что интересно в библиотеке TensorFlow, так это то, что на момент её выхода на рынке уже было несколько популярных библиотек глубокого обучения (<a href="https://github.com/Theano/Theano">Theano</a>, <a href="https://github.com/BVLC/caffe">Caffe</a> и <a href="https://github.com/torch">Torch</a>). Несмотря на это, TensorFlow сразу начал набирать популярность, посмотрите на активность Stack Overflow:</p><figure><img src="https://media.tproger.ru/uploads/2018/01/pic3.png" alt="" /></figure><p>В этом плане Fire похож на Tensorflow, так как и до него было уже достаточно много хороших инструментов для автоматизации интерфейсов командной строки на Python. Будет интересно посмотреть, примут ли разработчики Fire.</p><p>Примечание После использования Fire в течение нескольких недель и сравнения с другими вариантами вроде <a href="http://click.pocoo.org/">Click</a>, становится понятно, что Fire больше подходит для быстрой разработки, так как в нём отсутствуют многие функции других CLI. Тем не менее, новые функции находятся в разработке. В первом релизе IPython был обязательной зависимостью, что приводило к долгой загрузке даже простых скриптов, но <a href="https://github.com/google/python-fire/releases/tag/v0.1.2">сейчас в нём нет необходимости</a>!</p><h2>Пример приложения с Fire</h2><p>Fire можно установить с помощью pip:</p><p>Документацию можно найти на <a href="https://github.com/google/python-fire">GitHub</a>. В ней содержится проницательная заметка:</p><blockquote>Почему библиотека называется Fire?Когда вы вызываете Fire, она выстреливает (fire off, выполняет) вашей командой.</blockquote><p>Мы можем выполнить команду, вызвав fire.Fire(my_object), где my_object может быть функцией, классом или другим объектом.</p><p>Теперь пора делать приложение. Мы напишем генератор случайного выбора. Функция random_sample будет вычисляться через Fire. Как мы увидим, значения, возвращённые функцией, будут выведены в консоль.</p><p>Посмотрим на код:</p><p>Примечание переводчика Код в данной статье написан на Python 3.6, работоспособность на более ранних версиях не гарантируется.</p><p>Мы передаём нашу функцию random_sample методу Fire, который автоматически создаёт аргументы командной строки для параметров функции. Нам не нужно писать инструкции по применению скрипта: пользователь может ввести python3 random_sample.py -- --help и увидеть следующий вывод:</p><p>Пример использования скрипта:</p><p>Примечание Если вы хотите запускать скрипт как исполняемый файл (например, ./random_sample.py вместо python3 random_sample.py), то добавьте в начале скрипта строку #!/usr/bin/env python и разрешите исполнение скрипта с помощью команды chmod +x random_sample.py.</p><h2>Интерактивный режим</h2><p>Что в Fire интересно, так это то, что он может перенести вас в среду IPython REPL. Для этого вам просто нужно добавить -- --interactive в конце вызова вашего скрипта. Например:</p><ol><li>Запускаем random_sample.py.</li><li>Показываем вывод random_sample.py.</li><li>Заметили модуль и объекты, которые были загружены?</li><li>Запускаем интерпретатор IPython.</li><li>Выводим результат.</li></ol><p>Данные, возвращённые вызовом функции, теперь расположены в памяти, так же, как и сама функция. Ниже мы выводим документацию и снова запускаем генератор случайного выбора:</p><p>Аргументы для выбора передаются как кортеж, а во время использования командной строки они передаются как строка:</p><h2>Зажигаем класс</h2><p>Вы можете передать любой объект модулю Fire, и библиотека сгенерирует CLI. Вот пример, в котором мы используем класс:</p><p>Наш класс WikiPage запрашивает страницу из Википедии, и затем функция get_html_element ищет HTML-элемент на этой странице.</p><p>Примечание Для поиска HTML-элементов лучше использовать специальные библиотеки вроде BeautifulSoup, а не регулярные выражения.</p><p>Давайте посмотрим, как это работает:</p><p>При передаче аргумента page мы получаем полезную инструкцию по использованию:</p><p>Давайте попробуем получить код состояния:</p><p>А теперь сгенерируем случайную страницу и проверим URL:</p><p>Также мы можем вызывать модули прямо из командной строки:</p><p>Например:</p>]]></content:encoded>
    </item>
    <item>
      <title>Интересные проекты: бесплатная записная книжка с открытым исходным кодом Joplin</title>
      <link>https://tproger.ru/articles/joplin-by-laurent22</link>
      <comments>https://tproger.ru/articles/joplin-by-laurent22?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/joplin-by-laurent22</guid>
      <description><![CDATA[<p>Joplin хранит заметки в Markdown, импортирует записи из Evernote вместе с вложениями и синхронизирует их через локальную сеть или OneDrive.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/joplin-by-laurent22">Интересные проекты: бесплатная записная книжка с открытым исходным кодом Joplin</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 23 Dec 2017 00:40:17 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://github.com/laurent22/joplin/">Joplin</a> является проектом с открытым исходным кодом. Приложение предназначено для ведения заметок, которые можно копировать, модифицировать, присваивать каждой теги. Все эти функции доступны как в самом приложении, так и напрямую из любимого текстового редактора. Каждая заметка записывается в формате <a href="https://ru.wikipedia.org/wiki/Markdown">Markdown</a>.</p><h3>Основные функции</h3><p>Доступен <a href="https://github.com/laurent22/joplin/#importing-notes-from-evernote">импорт</a> существующих заметок из Evernote, включая формат записей, все вложения и изображения, а также любые метаданные — геолокация, время создания и обновления записи и многое другое. Для каждой из записей доступна синхронизация различной сложности. Будь то синхронизация посредством файловой системы на устройствах одной локальной сети, либо с облачным хранилищем OneDrive от Microsoft.</p><p>При синхронизации заметки и их коллекции в виде записных книжек, а также теги и остальные метаданные сохраняются в обычные текстовые файлы, которые можно легко проверять, выполнять их резервное копирование и перемещать.</p><ul><li>Поддержка заметок, to-do списков, тегов;</li><li>Поддержка оффлайн — инструмент работает даже без доступа в Интернет;</li><li>Мультицелевая синхронизация — от файловой системы до облачных сервисов;</li><li>Заметки формата Markdown;</li><li>Поддержка прикрепления файлов;</li><li>Функция поиска по заметкам;</li><li>Поддержка геолокации.</li></ul><figure><img src="https://media.tproger.ru/uploads/2017/12/AllClients.jpg" alt="" /></figure><h3>Использование последних технологий разработки</h3><p>Joplin всё ещё находится в стадии разработки, но авторы обещают скорый выход продукта из бета-тестирования. По их словам, этот инструмент отлично подойдёт для ежедневного использования. Пользовательский интерфейс клиентского терминала построен поверх библиотеки терминальных SDK, настольный клиент — с использованием <a href="https://electronjs.org/">Electron</a>, а интерфейс Android — при помощи <a href="https://facebook.github.io/react-native/">React Native</a>.</p><h3>Установка</h3><p>Приложение доступно в десктопных (<a href="https://github.com/laurent22/joplin/releases/download/v0.10.39/Joplin-Setup-0.10.39.exe">Windows</a>, <a href="https://github.com/laurent22/joplin/releases/download/v0.10.39/Joplin-0.10.39.dmg">macOS</a>, <a href="https://github.com/laurent22/joplin/releases/download/v0.10.39/Joplin-0.10.39-x86_64.AppImage">Linux</a>), мобильных (<a href="https://play.google.com/store/apps/details?id=net.cozic.joplin&amp;utm_source=GitHub&amp;utm_campaign=README&amp;pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1">Android</a>, <a href="https://itunes.apple.com/us/app/joplin/id1315599797">iOS</a>) и терминальных (Windows, macOS, Linux) версиях. Все приложения имеют похожий пользовательский интерфейс и могут быть синхронизированы друг с другом.</p><h3>Приложение терминала</h3><p>Для установки на macOS используйте команду brew install node joplin. Версии для Linux и Windows (с использованием <a href="https://tproger.ru/articles/win10-creators-update-new-in-wsl-console/">WSL</a>) можно установить, воспользовавшись следующей командой. Важное условие — наличие <a href="https://nodejs.org/en/download/package-manager/">Node 8+</a> на рабочей машине.</p><p>По умолчанию, бинарное приложение установится в ~/.joplin-bin. В случае необходимости можно изменить этот каталог. Иначе, если ваши разрешения для npm настроены, как описано <a href="https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-2-change-npms-default-directory-to-another-directory">здесь</a> (Вариант 2), тогда установка упрощается: npm -g install joplin. Для начала работы просто наберите в терминале: joplin. Инструкция использования команд терминала доступна на официальном сайте приложения.</p><figure><img src="https://media.tproger.ru/uploads/2017/12/ScreenshotTerminal.png" alt="" /></figure>]]></content:encoded>
    </item>
    <item>
      <title>Интересные проекты: сокращатель ссылок для запуска на Docker</title>
      <link>https://tproger.ru/articles/reducepy-by-abdullahselek</link>
      <comments>https://tproger.ru/articles/reducepy-by-abdullahselek?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/reducepy-by-abdullahselek</guid>
      <description><![CDATA[<p>Проект ReducePy сокращает ссылки на Tornado и Redis, запускается в Docker и содержит юнит-тесты для одной и нескольких версий Python.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/reducepy-by-abdullahselek">Интересные проекты: сокращатель ссылок для запуска на Docker</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 19 Dec 2017 08:20:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Новый GitHub-проект <a href="https://github.com/abdullahselek/ReducePy">ReducePy</a> — это сервис для сокращения ссылок, разработанный с использованием Tornado и Redis, для запуска на Docker.</p><p>Проверить работу последней версии можно анонимно:</p><p>Установить зависимости можно любым из этих способов:</p><p>Для установки минимального набора зависимостей достаточно:</p><h3>Запуск тестов</h3><p>Набор тестов работает с одной версией Python. Для этого требуются pip install pytest и, необязательно, pip install pytest-cov — они устанавливаются в числе зависимостей из requirements.testing.txt.</p><p>Для запуска юнит-тестов с одной версией Python:</p><p>Для проверки покрытия кода:</p><p>Для запуска юнит-тестов с набором версий Python:</p><h3>Команды</h3><p>Запуск в Docker:</p><p>Пример:</p>]]></content:encoded>
    </item>
    <item>
      <title>Интересные проекты: инструмент командной строки, воссоздающий эффект дешифровки данных из фильма «Тихушники» 1992 года</title>
      <link>https://tproger.ru/articles/nms-by-bartobri</link>
      <comments>https://tproger.ru/articles/nms-by-bartobri?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Хачатурян]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/nms-by-bartobri</guid>
      <description><![CDATA[<p>Инструмент командной строки nms из ASCII- или UTF-8-текста делает набор символов, а затем воспроизводит эффект дешифровки из фильма «Тихушники».</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/nms-by-bartobri">Интересные проекты: инструмент командной строки, воссоздающий эффект дешифровки данных из фильма «Тихушники» 1992 года</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Фильмы]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 28 Nov 2017 10:34:54 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://www.kinopoisk.ru/film/tikhushniki-1992-2035/">«Тихушники»</a> (Sneakers) — один из знаменитых американских детективов 90-х годов, посвященный нелегкой доле первых хакеров. В <a href="https://www.youtube.com/watch?v=F5bAa6gFvLs&amp;t=35">одном из эпизодов</a> появляется так полюбившаяся многим зрителям картинка дешифровки данных на экране компьютера. Одному из пользователей GitHub пришла идея <a href="https://github.com/bartobri/no-more-secrets">воссоздать</a> ее у себя в консоли.</p><h3>«Больше никаких секретов»</h3><p>Проект представляет из себя инструмент командной строки с названием nms (no more secrets — название того самого эпизода). Эта команда работает через конвейеры: сначала по-голливудски преображает любой текст кодировки ASCII или UTF-8 в зашифрованный набор символов, а затем эффектно расшифровывает все обратно.</p><figure><img src="https://media.tproger.ru/uploads/2017/11/687474703a2f2f7777772e627269616e626172746f2e696e666f2f65787465726e2f696d616765732f6e6d732f6e6d732e676966.gif" alt="" /></figure><p>В проект так же включена команда sneakers, полностью воспроизводящая текст, высвечивавшийся на экране монитора в фильме. Примечательно, что перед завершением программа требует от пользователя выбрать один из пунктов меню.</p><figure><img src="https://media.tproger.ru/uploads/2017/11/687474703a2f2f7777772e627269616e626172746f2e696e666f2f65787465726e2f696d616765732f6e6d732f736e65616b6572732e676966.gif" alt="" /></figure><p>Изначально в проекте не предусматривалось никаких зависимостей, однако для воссоздания эффекта все же пришлось использовать <a href="https://www.google.ru/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=2&amp;ved=0ahUKEwimjKmsz9rXAhUsGZoKHc7DAy4QFggpMAE&amp;url=https%3A%2F%2Fmsdn.microsoft.com%2Fru-ru%2Flibrary%2Fh21280bw.aspx&amp;usg=AOvVaw3zVsFRmN7HPi4b3oyzvF3W">escape-последовательности</a> терминала ANSI/VT100. Большинство современных терминалов поддерживают эти последовательности, так что у пользователей не должно возникнуть особых проблем с запуском новой программы. Но на всякий случай в проект встроена библиотека <a href="https://ru.wikipedia.org/wiki/Ncurses">NCurses</a> (правда, с потерей встроенного функционала, ведь ncurses всегда очищает экран прежде, чем отобразить вывод).</p><h3>Установка</h3><p>Установить nms можно через большинство пакетных менеджеров. Чтобы собрать проект из исходников, введите в терминале следующее:</p><p>Если ваш терминал не поддерживает escape-последовательности ANSI/VT100, вам потребуется библиотека ncurses. <a href="https://github.com/bartobri/no-more-secrets/blob/master/NCURSES.md">Установив</a> её, соберите проект:</p><h3>Использование</h3><p>nms работает с любыми данными, переданными через конвейер. В примере ниже используется простой вывод содержимого директории:</p><p>По умолчанию nms не начнёт расшифровывать данные, пока вы не нажмёте любую клавишу (именно так это было показано в фильме).</p><p>Для желающих использовать подобные эффекты в своих приложениях автор проекта выложил C-библиотеку <a href="https://github.com/bartobri/libnms">LibNMS</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Интересные проекты: ОС из Docker-контейнеров для работы с Docker-контейнерами</title>
      <link>https://tproger.ru/articles/rancheros</link>
      <comments>https://tproger.ru/articles/rancheros?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/rancheros</guid>
      <description><![CDATA[<p>RancherOS включает только сервисы для запуска Docker, загружается за 5–10 секунд и подходит для микросервисов и автоматического масштабирования.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/rancheros">Интересные проекты: ОС из Docker-контейнеров для работы с Docker-контейнерами</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 23 Nov 2017 10:03:47 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://github.com/rancher/os">RancherOS</a>, по словам разработчиков, является самым маленьким в размере и самым лёгким в использовании инструментом для запуcка Docker. Он включает в себя необходимые системные сервисы udev и syslog.</p><h3>Подробнее о RancherOS</h3><p>Именно благодаря тому, что этот инструмент включает в себя только необходимые для запуска Docker средства, его размер гораздо меньше традиционных ОС. Удалив все ненужные библиотеки и службы, разработчики добились сокращения числа требований к исправлениям безопасности ОС. Основной идеей, подтолкнувшей создателей RancherOS к такому решению, стал факт, что обычно пользователи Docker упаковывают все необходимые библиотеки в свои контейнеры.</p><p>Ещё одним преимуществом RancherOS является то, что он постоянно запускает самые последние версии Docker. Это позволяет пользователям использовать самые новые возможности Docker, а также быть уверенным, что большинство ошибок контейнеров уже исправлены.</p><p>Как и другие минималистические дистрибутивы Linux, RancherOS загружается невероятно быстро, как правило, в течение 5–10 секунд. Запуск контейнеров Docker почти мгновенен, подобно запуску любого другого процесса. Эта быстрота идеально подходит для организаций, использующих микросервисы и автомасштабирование.</p><h3>Коротко o Docker</h3><p><a href="https://tproger.ru/news/docker-container-diff-new-tool/">Docker</a> — это платформа с открытым исходным кодом, предназначенная для разработчиков, системных администраторов и DevOps. Она используется для создания и запуска контейнеров с использованием простого, но мощного интерфейса командной строки (Command Line Interface, CLI). Поближе познакомиться с Docker вы можете <a href="https://tproger.ru/translations/how-to-start-using-docker/">в нашей статье</a>.</p><h3>Архитектура RancherOS</h3><p>Всё внутри RancherOS — это обычный Docker-контейнер. Запуск ОС представляет собой запуск двух экземпляров Docker. Один из них называется System Docker и является основным процессом системы. Все остальные системные службы, такие как ntpd, syslog и console, работают в контейнерах Docker. System Docker заменяет традиционные системы инициализации, такие как systemd, и может использоваться для запуска <a href="http://rancher.com/docs/os/v1.1/en/system-services/adding-system-services/">дополнительных системных служб</a>.</p><figure><img src="https://media.tproger.ru/uploads/2017/11/rancheros.png" alt="" /></figure><p>System Docker запускает специальный контейнер под названием Docker, который является еще одним демоном, ответственным за управление всеми контейнерами пользователя. Любые контейнеры, которые вы запускаете в качестве пользователя из консоли, будут запускаться внутри этого Docker. Таким образом создаётся изоляция от контейнеров System Docker.</p><p>Этот подход гарантирует, что обычные пользовательские команды не повлияют на системные службы. Такое решение выглядит логичным, ведь будет не очень хорошо, если кто-то воспользуется командой docker rm -f $ (docker ps -qa) и удалит всю ОС.</p><h3>Установка</h3><p>Подробная инструкция по установке инструмента доступна <a href="http://rancher.com/docs/os/v1.1/en/quick-start-guide/">на его официальном сайте</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Интересные проекты: облачная файловая система pingfs</title>
      <link>https://tproger.ru/articles/pingfs-by-yarrick</link>
      <comments>https://tproger.ru/articles/pingfs-by-yarrick?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pingfs-by-yarrick</guid>
      <description><![CDATA[<p>Файловая система pingfs использует ICMP Echo-пакеты и FUSE для хранения данных в Интернете; проект поддерживает IPv4 и IPv6 и требует права суперпользователя.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pingfs-by-yarrick">Интересные проекты: облачная файловая система pingfs</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 14 Nov 2017 09:59:59 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://github.com/yarrick/pingfs">pingfs</a> — это аналог привычной файловой системы, но с одним отличием. Все данные хранятся в сети Интернет в качестве <a href="https://ru.wikipedia.org/wiki/ICMP">ICMP</a> Echo-пакетов (пингов), «путешествующих» между компьютером пользователя и удалёнными серверами.</p><p>Проект реализован с использованием <a href="https://ru.wikipedia.org/wiki/%D0%A1%D1%8B%D1%80%D0%BE%D0%B9_%D1%81%D0%BE%D0%BA%D0%B5%D1%82">API сырых сокетов</a> и <a href="https://ru.wikipedia.org/wiki/FUSE_(%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%D1%8F%D0%B4%D1%80%D0%B0)">FUSE</a> (filesystem in userspace, файловая система в пользовательском пространстве), поэтому для полноценной работы и запуска проекта необходимы права суперпользователя. Linux является единственной ОС, на которой возможно запустить программу. Поддерживаются обе версии протокола удалённых хостов, IPv4 и IPv6.</p><h3>Работа с проектом</h3><p>Для компиляции проекта необходимо запустить make в корневой папке. Чтобы начать использование, необходимо:</p><ul><li>Создать текстовый файл с именами хостов и их IP-адресами;</li><li>Запустить программу в режиме root-пользователя при помощи команды: ./pingfs &lt;название файла&gt; &lt;точка монтирования&gt;. Программа начнёт проверку хостов на правильность их реакции посредством отправки нескольких пингов. На экран будет выведена некоторая информация и статистика, затем будет произведено монтирование файловой системы;</li><li>pingfs останется запущенным и будет печатать статистику по пакетам и байтам каждую секунду.</li></ul><p>Чтобы остановить работу программы:</p><ul><li>Нажмите Ctrl+C;</li><li>В противном случае, можно воспользоваться командой fusermount -u.</li></ul><h3>Поддерживаемые операции</h3><ul><li>Создание и удаление обычных файлов;</li><li>Листинг файлов;</li><li>Переименование файлов;</li><li>Чтение, запись и усечение файлов;</li><li>Настройка и получение прав на доступ к файлам.</li></ul><h3>Неподдерживаемые операции</h3><ul><li>Создание и удаление каталогов;</li><li>Создание жёстких и мягких ссылок на файлы;</li><li>Временные отметки (в этой версии они всегда равны 0).</li></ul><p>Автор проекта отмечает, что в настоящее время производительность обработки LAN-хостов слишком низкая. Передача данных между ними часто приводит к потере пакетов, поэтому используйте pingfs с осторожностью.</p><p>В качестве шутки над идеей проекта пользователи Reddit уже <a href="https://www.reddit.com/r/programming/comments/78apup/pingfs_a_filesystem_where_the_data_is_stored_only/">придумали</a> ему девиз:</p><blockquote>Где мои данные? Не могу сказать. Но они существуют? Надеюсь.</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Статический анализ кода: обзор инструмента OCLint</title>
      <link>https://tproger.ru/articles/oclint-by-ryuichi</link>
      <comments>https://tproger.ru/articles/oclint-by-ryuichi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/oclint-by-ryuichi</guid>
      <description><![CDATA[<p>Инструмент OCLint ищет баги и ошибки в программах на C, C++ и Objective-C, которые могут остаться незаметными для компилятора.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/oclint-by-ryuichi">Статический анализ кода: обзор инструмента OCLint</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Objective-C]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 07 Nov 2017 08:48:02 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="http://oclint.org/">OCLint</a> — инструмент, разработанный <a href="https://ryuichi.co/labs/">Ryuichi Laboratories</a>, который проверяет программы на С, С++ и Objective-C на наличие следующих багов и ошибок:</p><ul><li>пустые конструкции if/else/try/catch/finally;</li><li>неиспользуемые локальные переменные и параметры;</li><li>использование кода с высокой <a href="https://habrahabr.ru/company/intel/blog/106082/">цикломатической</a> и <a href="https://modess.io/npath-complexity-cyclomatic-complexity-explained/">NPath</a> сложностью;</li><li>избыточное использование конструкций if и ненужных скобок;</li><li><a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4_%D1%81_%D0%B7%D0%B0%D0%BF%D0%B0%D1%88%D0%BA%D0%BE%D0%BC">код с запашком</a> — использование длинных методов и длинных списков параметров;</li><li>плохие практики написания кода — переназначение параметров, неправильное использование логики.</li></ul><h3>Функциональность OCLint</h3><p><a href="https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BA%D0%BE%D0%B4%D0%B0">Статический анализ кода</a> призван обнаруживать критические дефекты кода, которые не видны компилятору, но способны обрушить программу в будущем. OCLint автоматизирует процесс проверки кода при помощи расширенных функций:</p><ul><li>Динамическая загрузка правил в систему, даже во время выполнения;</li><li>Гибкие и расширяемые конфигурации программы гарантируют пользователю настройку поведения OCLint именно под нужды каждого;</li><li>Возможность вызова инструмента из командной строки вносит <a href="https://martinfowler.com/articles/continuousIntegration.html">непрерывную интеграцию</a> и постоянную проверку кода в процессе разработки. Это поможет исправлять все баги ещё на этапе разработки;</li><li>Снижена вероятность ложных срабатываний инструмента для избежания ситуаций, когда полезный код может быть помечен как избыточный;</li><li>Эффективность и точность инструмента основана на использовании <a href="https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE">абстрактного синтаксического дерева</a> исходного кода.</li></ul><h3>Установка инструмента</h3><p>OCLint является автономным инструментом, работающим на платформах Linux и macOS. Получить самую свежую версию 0.13 продукта вы можете, загрузив и самостоятельно скомпилировав <a href="http://oclint.org/docs/intro/build.html">исходный код</a>, либо уже <a href="https://github.com/oclint/oclint/releases">скомпилированные двоичные файлы</a> программы.</p><p>Процесс установки подробно <a href="http://docs.oclint.org/en/stable/intro/installation.html">описан</a> на специальной странице инструмента. Также доступно <a href="http://oclint.org/docs/intro/tutorial.html">руководство пользователя</a> с подробным описанием использования команд инструмента. Продукт распространяется под лицензией Modified BSD.</p>]]></content:encoded>
    </item>
    <item>
      <title>Интересные проекты: «змейка» для терминала, работающая на этапе компиляции</title>
      <link>https://tproger.ru/articles/cpp-compile-time-snake</link>
      <comments>https://tproger.ru/articles/cpp-compile-time-snake?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/cpp-compile-time-snake</guid>
      <description><![CDATA[<p>Проект на C++14 предлагает интерактивную «Змейку» с перекомпиляцией каждого хода и статичную версию с однократной компиляцией всех файлов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/cpp-compile-time-snake">Интересные проекты: «змейка» для терминала, работающая на этапе компиляции</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 24 Oct 2017 10:35:00 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://github.com/mattbierner/STT-C-Compile-Time-Snake">Проект</a>, написанный Мэттом Бирнером, представляет собой новую версию игры «Змейка». Правда, сейчас в неё поиграть удастся прямо в терминале или командной строке.</p><p>Проект использует шаблонное метапрограммирование стандарта С++14. Игра доступна в двух версиях — интерактивной, когда игроку необходимо каждый раз перекомпилировать файл с новыми командами, и статичной, когда для игры необходима лишь однократная компиляция всех файлов. Отметим, что игра заканчивается, как и в обычной версии, когда змея упирается в стены игрового поля или своё собственное тело.</p><h3>Интерактивная версия</h3><p>Для отображения каждого нового хода необходима перекомпиляция файлов с флагами для контроля процесса игры:</p><p>Параметры флага -D управляют движением змейки по игровому полю: UP,DOWN,RIGHT и LEFT. Если флаг не был передан компилятору на исполнение, то змейка продолжит своё движение прямо. Есть возможность вернуться в исходное положение, запустив скрипт ./reset.sh. Для сохранения положения змеи между компиляциями используется подход сериализации данных.</p><h3>Статичная версия</h3><p>Весь игровой процесс происходит при однократной компиляции программы. Вся логика игры этой версии находится <a href="https://github.com/mattbierner/STT-C-Compile-Time-Snake/tree/master">в главной ветке проекта</a> на GitHub. Все движения змеи строго указаны в главной функции программы:</p><h3>Исходный код</h3><p>Исходный код инструмента можно найти <a href="https://github.com/mattbierner/STT-C-Compile-Time-Snake">на GitHub</a>. Интерактивная версия находится в соответствующей ветке проекте interactive, статичная версия — в главной ветке. Подробное описание функций программы можно найти в блоге автора, в котором также есть отдельное описание как <a href="https://blog.mattbierner.com/stupid-template-tricks-snake-part-2-interactive-nibbler/">интерактивной</a> версии, так и <a href="https://blog.mattbierner.com/stupid-template-tricks-snake/">статичной</a>.</p><h3>Игровой процесс</h3><p>Ниже приведён игровой процесс интерактивной версии игры, при которой пользователь решает, в каком направлении змея должна двигаться, посредством указания параметров флага -D. Для статичной версии всё аналогично, за исключением того, что нужно всего лишь наблюдать за процессом игры, а не участвовать в нём, так как от пользователя требуется лишь компиляция файла для запуска игры.</p>]]></content:encoded>
    </item>
    <item>
      <title>Кроссплатформенный текстовый редактор с поддержкой мыши в терминале: обзор инструмента micro</title>
      <link>https://tproger.ru/articles/micro-text-editor</link>
      <comments>https://tproger.ru/articles/micro-text-editor?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Максим Леонов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/micro-text-editor</guid>
      <description><![CDATA[<p>Редактор micro запускается в терминале как статический бинарный файл без зависимостей и стремится сохранить простоту nano, добавляя поддержку мыши.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/micro-text-editor">Кроссплатформенный текстовый редактор с поддержкой мыши в терминале: обзор инструмента micro</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 03 Oct 2017 13:24:58 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://micro-editor.github.io/">Micro</a> — это текстовый редактор, работающий в терминале. Он поставляется как статический бинарный файл без зависимостей, готовый к работе из коробки.</p><p>Как видно из названия, micro пытается стать преемником редактора nano в плане простоты использования и установки. Однако разработчики стараются сделать его удобным для тех, кто пользуется терминалом как по собственному желанию, так и вынужденно.</p><h3>Чем может похвастаться micro?</h3><ul><li>Не требуются зависимости и внешние файлы — только бинарник.</li><li>Поддержка нескольких курсоров.</li><li>Знакомые сочетания клавиш (Ctrl-S, Ctrl-C, Ctrl-V, Ctrl-Z …).Можно изменять сочетания, исходя из своих предпочтений.</li><li>Удобные настройки по умолчанию.Не нужно ничего настраивать «из коробки» (а если и придётся, то это легко сделать).</li><li>Поддержка разделения экрана и вкладок.</li><li>Очень хорошая поддержка мыши.Можно использовать перетаскивание мыши для выделения текста, двойной клик для выделения слова и тройной клик для выделения строки.</li><li>Кроссплатформенность.Поддержка Windows есть, но пока проскакивают ошибки.</li><li>Система плагинов.В micro встроен диспетчер плагинов, который автоматически устанавливает, удаляет и обновляет все ваши плагины.</li><li>Автоматический линтинг и уведомление о ошибках.</li><li>Поддержка различных цветовых тем.По умолчанию micro поставляется с 4-, 8- и 24-битными (TrueColor) темами.</li><li>Подсветка синтаксиса для <a href="https://github.com/zyedidia/micro/tree/master/runtime/syntax">более чем 90 языков</a>.</li><li>Сниппеты.Плагин сниппетов может быть установлен с помощью команды plugin install snippets.</li><li>Поддержка буфера обмена системы.</li><li>Поддержка макросов.</li></ul><p>Также в будущем планируется добавление функций автозаполнения и древовидного представления файлов.</p><h3>Установка</h3><p>Вы можете <a href="https://github.com/zyedidia/micro/releases">скачать</a> уже собранный бинарник или собрать его самостоятельно. Больше информации об установке можно найти на <a href="https://github.com/zyedidia/micro/wiki/Installing-Micro">вики-страничке проекта</a>.</p><h4>Менеджеры пакетов</h4><p>Вы можете установить micro с помощью Homebrew на Mac:</p><p>С помощью <a href="https://chocolatey.org/">Chocolatey</a> или <a href="https://github.com/lukesampson/scoop">Scoop</a> на Windows:</p><p>или</p><p>А на Linux с помощью <a href="https://docs.snapcraft.io/core/install">snap</a>:</p><h4>Сборка исходного кода</h4><p>Если для вашей операционной системы нет собранного бинарника, но она поддерживает Go, вы можете собрать micro из исходного кода.</p><p>Убедитесь, что у вас установлен Go версии 1.5 или выше.</p><p>Бинарник будет установлен в $GOPATH/bin (или ваш $GOBIN).</p><p>Можно произвести установку и с помощью go get (go get -u github.com/zyedidia/micro/cmd/micro), но данный способ не рекомендуется, так как он собирает micro без информации о версии, которая полезна для диспетчера плагинов.</p><h4>Терминал macOS</h4><p>Если вы используете macOS, то вам стоит использовать <a href="https://iterm2.com/">iTerm2</a> вместо терминала Mac, установленного по умолчанию. iTerm2 обладает лучшей поддержкой мыши, сочетаний клавиш и цветовых схем.</p><h4>Поддержка буфера обмена Linux</h4><p>Для поддержки данной функции на Linux требуется утилита xclip или xsel. Для Ubuntu:</p><p>Если у вас нет xclip или xsel, micro будет использовать внутренний буфер обмена для копирования и вставки, но он не будет работать с внешними приложениями.</p><h4>Цвета и подсветка синтаксиса</h4><p>Если вы откроете micro и поймете, что подсветка синтаксиса не работает, то причина, скорее всего, в том, что вы используете терминал, который не поддерживает 256 цветов. Попробуйте изменить цветовую схему на simple , использлвав сочетание клавиш Ctrl-E и набрав set colorscheme simple.</p><p>Если вы используете терминал Ubuntu, убедитесь, что переменная TERM установлена в xterm-256color.</p><p>Многие терминалы Windows не поддерживают более 16 цветов, поэтому цветовая схема micro, установленная по умолчанию, будет выглядеть не лучшим образом. Вы можете либо установить цветовую схему simple , либо загрузить эмулятор терминала вроде mintty.</p><h4>Plan9, Cygwin</h4><p>Micro использует библиотеку <a href="https://github.com/gdamore/tcell">tcell</a>, поэтому он не поддерживает Plan9, Cygwin (хотя в будущем это может измениться) и Native Client (NaCl).</p><h3>Использование</h3><p>Установив редактор, его можно запустить командой micro path/to/file.txt или просто micro, открыв пустой буфер.</p><p>Micro также поддерживает создание буфера из stdin:</p><p>Можно использовать мышь и клавиатуру для управления курсором.</p><h3>Документация и справка</h3><p>В micro встроена система поддержки, которую можно запустить, нажав Ctrl-E и напечатав help . Кроме того, вы можете просматривать файлы справки здесь:</p><ul><li><a href="https://github.com/zyedidia/micro/blob/master/runtime/help/help.md">основная помощь</a>;</li><li><a href="https://github.com/zyedidia/micro/blob/master/runtime/help/keybindings.md">привязки клавиш</a>;</li><li><a href="https://github.com/zyedidia/micro/blob/master/runtime/help/commands.md">команды</a>;</li><li><a href="https://github.com/zyedidia/micro/blob/master/runtime/help/colors.md">цвета</a>;</li><li><a href="https://github.com/zyedidia/micro/blob/master/runtime/help/options.md">настройки</a>;</li><li><a href="https://github.com/zyedidia/micro/blob/master/runtime/help/plugins.md">плагины</a>.</li></ul><p>Также к прочтению <a href="https://github.com/zyedidia/micro/blob/master/runtime/help/tutorial.md">рекомендуется</a> руководство, которое быстро познакомит вас с более сложными функциями.</p>]]></content:encoded>
    </item>
    <item>
      <title>Популярный терминал iTerm2 «сливал» данные пользователей в Сеть</title>
      <link>https://tproger.ru/news/iterm2-leaks</link>
      <comments>https://tproger.ru/news/iterm2-leaks?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/iterm2-leaks</guid>
      <description><![CDATA[<p>Проверка ссылок в iTerm2 отправляла текст под курсором в DNS-запросах, включая пароли и API-ключи; проблему исправили в версии 3.1.1.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/iterm2-leaks">Популярный терминал iTerm2 «сливал» данные пользователей в Сеть</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 21 Sep 2017 20:00:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>Новая версия 3.1.1 отключает функцию проверки валидности URL-адресов, встроенную и включенную по умолчанию в iTerm2. Эта проверка работала в автоматическом режиме: при наведении курсора мыши на строку она либо подсвечивалась как валидная ссылка, и по ней можно было перейти, либо оставалась обычным текстом.</p><h3>Как данные попадали в сеть?</h3><p>Приложение каждый раз создавало DNS-запрос с текстом, над которым был курсор мыши, и проверяло, действительно ли существует такой домен, отправляя запрос на DNS-серверы. Главная опасность заключается в том, что пользователь может случайно оставить курсор мыши над паролями, ключами API или же просто приватными данными, которые в итоге отправятся на серверы в виде текста. Любой злоумышленник может «подслушать» такой запрос, даже не столкнувшись с каким-либо видом шифрования.</p><p>Согласно статистике официального сайта приложения, версия 3.0.0 была выпущена ещё в июле 2016 года. Это означает, что больше года персональные данные пользователей по случайности и ошибке разработчиков просто «утекали» на сторонние серверы.</p><h3>Реакция компании-разработчика</h3><p>Первые проблемы с поведением приложения были обнаружены ещё 10 месяцев назад. Разработчики сразу выпустили новую версию 3.0.13, в которой появилась возможность отключения функции проверки валидности URL-адресов, включенной по умолчанию. Однако только спустя год после выпуска «опасной» версии приложения и после <a href="https://gitlab.com/gnachman/iterm2/issues/6050">баг-репорта</a> голландского разработчика Питера ван Дейка компания выпустила новую версию, в которой данная функция была полностью отключена. Джордж Нахман, один из программистов проекта iTerm2, принёс свои официальные извинения:</p><blockquote>Мне нет оправданий. Я просто не придал значения возможной глубине вопроса введения подобной функции. Я прошу прощения за то, что не до конца понял проблему, и обещаю впредь быть более аккуратным. Ваша конфиденциальность всегда будет моей главной задачей.</blockquote><p>Пользователям, владеющим iTerm2 версий с 3.0.0 по 3.0.12, настоятельно рекомендуется обновить приложение хотя бы до версии 3.0.13, в которой есть возможность отключения функции проверки валидности: перейдите в пункт меню Preferences ⇒ Advanced ⇒ Semantic History и переведите ползунок Perform DNS lookups to check if URLs are valid? в положение No.</p><figure><img src="https://media.tproger.ru/uploads/2017/09/iTerm-disable.jpg" alt="" /></figure>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft показала оболочку Azure Cloud Shell и обновление Azure CLI 2.0</title>
      <link>https://tproger.ru/news/azure-cli-2-0-cloud-shell</link>
      <comments>https://tproger.ru/news/azure-cli-2-0-cloud-shell?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/azure-cli-2-0-cloud-shell</guid>
      <description><![CDATA[<p>Azure Cloud Shell даёт браузерную командную строку для Azure и интегрируется с Azure CLI 2.0, Bash, редакторами и инструментами сборки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/azure-cli-2-0-cloud-shell">Microsoft показала оболочку Azure Cloud Shell и обновление Azure CLI 2.0</a>»</p>]]></description>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[Microsoft Build 2017]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 11 May 2017 17:26:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>На конференции Microsoft Build 2017 <a href="https://azure.microsoft.com/ru-ru/blog/public-preview-of-azure-cloud-shell/">был представлен</a> интерфейс командной строки Azure Cloud Shell. Теперь вы можете работать с сервисами Azure как через привычный графический интерфейс, так и при помощи командной строки.</p><p>Пока что доступна только Bash-версия. PowerShell появится чуть позже, после чего вы сможете выбирать как между графическим и текстовым интерфейсами, так и их типами.</p><figure><img src="https://media.tproger.ru/uploads/2017/05/startup.gif" alt="" /></figure><h2>Возможности Cloud Shell</h2><p>Cloud Shell предоставляет возможность использования оболочки для управления сервисами Azure прямо из браузера. Доступны такие привычные инструменты, как shell-интерпретаторы, текстовые редакторы, системы управления версиями, инструменты для сборки, работы с контейнерами и базами данных и т.д. Также вы можете работать и с несколькими популярными языками, такими как Node.js, .NET и Python.</p><p>Каждая сессия Cloud Shell предоставляет доступ к настроенному окружению, автоматически синхронизированному с директорией $Home, которая хранится в Azure. Это позволяет получить доступ к файлам, содержащим сценарии автоматизации и т.д.</p><figure><img src="https://media.tproger.ru/uploads/2017/05/e8673e97cc904f50b8d794e1c5d8ba7d.gif" alt="" /></figure><h3>Интеграция с Azure CLI 2.0</h3><p>Cloud Shell позволяет автоматизировать рабочий процесс в Azure и предоставляет для этого удобный интерфейс Azure CLI 2.0. Для обеспечения максимально комфортной работы с ним Cloud Shell автоматически предоставляет доступ ко всем подпискам аккаунта и своевременно обновляет его.</p><h2>Нововведения в Azure CLI 2.0</h2><p>Релиз инструмента Azure CLI 2.0 <a href="https://tproger.ru/news/azure-cli-2-is-now-available/">произошёл</a> в самом конце этой зимы, и с тех пор разработчики Microsoft добавили в него несколько новых фич. Были добавлены следующие модули команд: appservices, cdn, cognitive services, cosmosdb, data lake analytics/store, dev/test labs, functions, monitor, mysql, postgres, service fabric client, vsts.</p><p>Также изменился синтаксис некоторых команд. Ближайшие несколько версий будут поддерживать оба синтаксиса, но затем старый перестанет поддерживаться. Такие команды будут помечены специальным предупреждением.</p><h3>Новые установщики</h3><p>Одним из неудачных мест в исходной реализации была установка оболочки на Windows-системы. Именно поэтому Microsoft выпускает MSI-установщик Azure CLI 2.0. Это решит проблему корректной установки версий Python и иных зависимостей, а также упростит дальнейшие обновления.</p><figure><img src="https://media.tproger.ru/uploads/2017/05/1-6.png" alt="" /></figure><p>На Mac и Linux такой проблемы не наблюдается: для установки можно использовать curl, apt-get и pip. Инструкции по установке можно найти на <a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli">обновлённой загрузочной странице</a> инструмента.</p><p>Компания планирует расширить набор нативных установщиков в ближайшие месяцы.</p><h3>Интерактивный режим и Azure Cloud Shell</h3><p>В апреле стала доступна отдельная установка Azure CLI 2.0 в интерактивном режиме. Теперь она добавлена в основную версию инструмента и доступна по простой команде:</p><p>После этого Azure CLI 2.0 запускается в собственной интерактивной оболочке с выпадающими списками команд, кешированными автодополнениями и доступной по клику документацией с примерами использования команд. Этот формат очень удобен для начинающих своё знакомство с Azure CLI 2.0 и оптимизирован для выполнения отдельных команд, а не автоматизационных скриптов.</p><figure><img src="https://media.tproger.ru/uploads/2017/05/2-1.jpg" alt="" /></figure><p>Выйти из этого режима можно при помощи команды quit.</p><p>Кроме того, Azure CLI теперь можно запускать не только на машине-клиенте, но и в Azure Cloud Shell прямо из портала Azure Management Portal. Это уже было описано выше.</p><figure><img src="https://media.tproger.ru/uploads/2017/05/3-3.png" alt="" /></figure><p>Также стоит отметить возросшую производительность многих команд. Поделиться фидбеком можно, введя команду az feedback прямо в командной строке.</p><h3>Новые команды для App Services, MySQL и Azure Functions</h3><p>Azure CLI 2.0 предоставляет все необходимые средства для разработки приложений на <a href="https://docs.microsoft.com/en-us/azure/app-service/app-service-value-prop-what-is">платформе App Services</a> и управления ими.</p><p>Azure <a href="https://tproger.ru/news/microsoft-azure-sql-mysql-postgresql/">начала предоставлять</a> полнофункциональные сервисы для запуска MySQL- и PostgreSQL-баз данных в облаке. Управлять этими сервисами также можно из Azure CLI 2.0. Подробное обучающее руководство по запуску веб-приложения на PHP и MySQL можно найти в <a href="https://docs.microsoft.com/ru-ru/azure/app-service-web/app-service-web-tutorial-php-mysql">документации Azure</a>.</p><p><a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview">Azure Functions</a> — это решение для запуска небольших кусков кода, или «функций», в облаке. Вы можете просто написать необходимый код и разместить его в Azure, не беспокоясь о настройке инфраструктуры. Azure CLI 2.0 позволяет сделать это из командной строки всего одной строчкой кода:</p><h3>Как начать использовать Azure CLI 2.0?</h3><p>Вы можете скачать её <a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli">с официального сайта</a> или запустить в <a href="https://portal.azure.com/">Azure Cloud Shell</a>. Также вам пригодится обновлённая <a href="https://docs.microsoft.com/en-us/cli/azure/">документация с примерами</a>.</p><p>Azure CLI 2.0 является open source проектом, её исходники доступны <a href="https://github.com/azure/azure-cli">на GitHub</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Руководство по созданию скриптов для Bash</title>
      <link>https://tproger.ru/articles/bash-scripts-guide</link>
      <comments>https://tproger.ru/articles/bash-scripts-guide?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Юрченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bash-scripts-guide</guid>
      <description><![CDATA[<p>Серия руководств по Bash объясняет условные переходы, циклы и работу с файлами, а затем знакомит с регулярными выражениями, expect, awk и sed.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bash-scripts-guide">Руководство по созданию скриптов для Bash</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 05 May 2017 19:46:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>Каким бы простым ни пытались разработчики дистрибутивов Linux сделать свои графические интерфейсы, всё равно многие задачи удобно решать через терминал. Во-первых, потому что это быстрее, во-вторых, не на всех машинах есть графический интерфейc.</p><p>Опытные пользователи часто выполняют различные задачи через терминал. Нередко несколько команд надо выполнять по очереди, например, при обновлении системы необходимо сначала выполнить обновление репозиториев, а уже затем скачать новые версии пакетов. Это очень неудобно и таких действий очень много, даже, например, резервное копирование и загрузка скопированных файлов на удаленный сервер. Поэтому можно использовать скрипты, чтобы не вводить одни и те же команды несколько раз.</p><p>А еще настоятельно рекомендуется не решать рутинные задачи копипастом кода себе в консоль из интернета. Мы рассказывали, почему, в <a href="https://tproger.ru/translations/dont-copy-paste-from-internet-to-terminal/">одной из наших статей</a>.</p><p>Следующая серия статей поможет вам освоить bash:</p><ul><li><a href="https://likegeeks.com/bash-script-easy-guide/">Bash Script Step By Step</a> — о том, как начать создание bash-скриптов, рассмотрено использование переменных, описаны условные конструкции, вычисления, сравнения чисел, строк, выяснение сведений о файлах.</li><li><a href="https://likegeeks.com/bash-scripting-step-step-part2/">Bash Scripting Part 2, Bash the awesome</a>. Раскрываются особенности работы с циклами for и while.</li><li><a href="https://likegeeks.com/linux-bash-scripting-awesome-guide-part3/">Bash Scripting Part 3, Parameters &amp; options</a>. Эта часть посвящена параметрам командной строки и ключам, которые можно передавать скриптам, работе с данными, которые вводит пользователь и которые можно читать из файлов.</li><li><a href="https://likegeeks.com/shell-scripting-awesome-guide-part4/">Bash Scripting Part 4, Input &amp; Output</a>. Здесь речь идёт о дескрипторах файлов и о работе с ними, о потоках ввода и вывода, ошибок, о перенаправлении вывода.</li><li><a href="https://likegeeks.com/linux-bash-scripting-awesome-guide-part5/">Bash Scripting Part 5, Sighals &amp; Jobs</a> посвящена сигналам Linux, их обработке в скриптах, запуску сценариев по расписанию.</li><li><a href="https://likegeeks.com/bash-functions/">Bash Scripting Part 6, Functions</a>. Из этой статьи можно узнать о создании и использовании функций в скриптах, о разработке библиотек.</li><li><a href="https://likegeeks.com/sed-linux/">Bash Scripting Part 7, Using sed</a> посвящена работе с потоковым текстовым редактором sed.</li><li><a href="https://likegeeks.com/awk-command/">Bash Scripting Part 8, Using awk</a> — о программировании на языке обработки данных awk.</li><li><a href="https://likegeeks.com/regex-tutorial-linux/">Bash Scripting Part 9, Regular Expressions</a>. В этой части можно почитать об использовании регулярных выражений в bash-скриптах.</li><li><a href="https://likegeeks.com/write-shell-script/">Bash Scripting Part 10, Practical Examples</a>. О приёмах работы с сообщениями, которые можно отправлять пользователям, и методике мониторинга диска. Кстати, для мониторинга системы есть множество утилит, самые удобные из которые мы рассматривали в <a href="https://tproger.ru/digest/useful-linux-utilities/">нашей подборке</a>.</li><li><a href="https://likegeeks.com/expect-command/">Bash Scripting Part 11, Expect Command</a> посвящена средству expect, с помощью которого можно автоматизировать взаимодействие с интерактивными утилитами. В частности, здесь идёт речь об expect-скриптах и об их взаимодействии с bash-скриптами и другими программами.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Make files not war: что такое утилита GNU make, зачем ее использовать и как это делать правильно</title>
      <link>https://tproger.ru/translations/make-files-best-practices</link>
      <comments>https://tproger.ru/translations/make-files-best-practices?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Саша Ушатинская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/make-files-best-practices</guid>
      <description><![CDATA[<p>Тонкости работы с GNU make и приёмы, которые делают make-файлы простыми и читаемыми при автоматизации сборки проектов самого разного рода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/make-files-best-practices">Make files not war: что такое утилита GNU make, зачем ее использовать и как это делать правильно</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 26 Apr 2017 15:44:59 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой статье мы поговорим о некоторых тонкостях работы с утилитой GNU make, а также научимся писать простые и аккуратные make-файлы. Последнее особенно важно — make-файлы выглядят сложно и нечитабельно, если им не уделить должного внимания. Это обеспечивает make плохую репутацию, хотя на самом деле инструмент крайне удобный, особенно для автоматизации сборки.</p><p>В большинстве проектов, будь то разработка ПО, написание книги или публикация записи в блоге, в какой-то момент приходится генерировать «конечные продукты» из вручную написанных исходных файлов, то есть осуществлять сборку.</p><p>Суть автоматической сборки состоит в том, чтобы взять за основу генерацию какого-то одного элемента, вычленить правила, по которым она происходит, и применить их к большему количеству элементов такого же типа, обновляя только изменяемые параметры.</p><p>Это может быть сделано (и часто делается) под определенную задачу с помощью кастомных скриптов, но мы в данной статье рассмотрим, как можно удобно автоматизировать сборку, используя утилиту make и её встроенные правила.</p><h3>Почему стоит использовать утилиту make</h3><ul><li>она работает;</li><li>легко настраивается как для новых, так и для существующих проектов;</li><li>в большинстве ОС она предустановлена, если нет — её легко скачать;</li><li>она крошечная и содержит мало зависимостей;</li><li>make-файлы всё-таки могут быть короткими, ёмкими и красивыми;</li><li>она не использует загадочные папки типа working или resource;</li><li>да и вообще темной магией не занимается — всё на виду.</li></ul><h2>Пишем make-файлы</h2><p>Создадим файл и назовем его makefile или Makefile. Содержание стандартного make-файла можно описать так: «если любой из файлов-пререквизитов был изменен, то целевой файл должен быть обновлен». Суть make в том, что нам нужно по определенным правилам произвести какие-то действия с пререквизитами, чтобы получить некую цель.</p><p>Правила, которые и составляют основу make-файла, по сути являются командами и могут быть сколь угодно сложными, а также могут содержать в себе вызов других инструментов, таких как компиляторы и парсеры.</p><p>Базовый синтаксис для определения цели (в файле makefile):</p><p>Важно Индентация производится с помощью табуляции, а не пробелов.</p><p>В командах описывается, что make должна сделать, чтобы создать целевой файл. Они исполняются, когда мы делаем запрос на создание или обновление целевого файла и make заключает, что пререквизиты изменились или целевой файл еще не существует.</p><p>Часто нам нужно обрабатывать несколько файлов одного вида по одним и тем же правилам. Например, при создании страниц HTML на основе размеченного текста. Это делается с помощью шаблонных правил, наличие которых является отличительной чертой make в сравнении с обычной сборкой через командную строку.</p><p>Шаблонные правила работают на основе сопоставления расширений файлов. Например, make знает, как создавать объектные файлы *.o из исходных C-файлов *.c, компилируя их и передавая компилятору флаг -c. В make есть несколько встроенных шаблонных правил, самые известные из которых используются для компиляции кода на C и C++.</p><p>Теперь мы можем упростить make-файл, избегая написания команд в случаях, когда make сама знает, что делать. Главное, не забывать ставить пустую строку после цели — make это нужно, чтобы определять, где кончается одна цель и начинается другая.</p><p>В большинстве случаев мы можем даже опустить пререквизиты: внутренние правила make подразумевают, что для того, чтобы, например, собрать somefile.o по принципу Исходник на C → Объектный файл, нам нужен somefile.c.</p><p>Будьте аккуратны: когда вы предлагаете make свой список команд, она будет ориентироваться только на ваш код и в данном случае не будет искать шаблонные правила для сборки цели.</p><h2>Вызываем make</h2><p>Запустим make в текущей директории:</p><p>Если make-файл в ней уже есть, будет создана (собрана) первая цель, которую make сможет найти. Если make-файла нет (или он есть, но в нем нет целей), make об этом сообщит.</p><p>Чтобы обратиться к конкретной цели, запустите:</p><p>Здесь цель — это название цели (без квадратных скобок).</p><p>make может догадаться, что делать, используя встроенные правила, без дополнительной информации от пользователя. Попробуйте создать файл test.c в пустой папке и запустить make. test.make скомпилирует test.c, используя встроенное шаблонное правило, и соберет цель с названием test. Это сработает даже через несколько шагов генерации промежуточных файлов.</p><h2>Специальные цели</h2><p>В большинстве make-файлов можно найти цели, называемые специальными. Вот самые распространенные:</p><ul><li>all — собрать весь проект целиком;</li><li>clean — удалить все сгенерированные артефакты;</li><li>install — установить сгенерированные файлы в систему;</li><li>release или dist — для подготовки дистрибутивов (модули и тарболы).</li></ul><p>Они не обязательно должны присутствовать в make-файле, но большинство сборочных процессов странно представить без хотя бы первых трех.</p><p>При сборке этих целей не будут созданы файлы с именами, например, all или clean. make обычно решает, запускать ли какие-либо процессы, основываясь на данных о том, нужно ли изменять целевой файл. Создание файлов с подобными именами не даст make произвести никаких изменений с целями.</p><p>Для предотвращения этого GNU make позволяет помечать такие цели как «фиктивные» (phony), чтобы запускать их в любом случае. Сделать это можно, добавив необходимые цели в качестве пререквизитов во внутреннюю цель .PHONY следующим образом:</p><p>Цель all обычно просто содержит главный исполняемый файл в пререквизите — иногда с дополнительными командами для пост-обработки генерируемых файлов. Так как мы в большинстве случаев хотим, чтобы цель all исполнялась по умолчанию, она должна стоять первой в файле.</p><p>Для цели clean стоит добавить список команд, удаляющих все генерируемые файлы. Это может быть легко сделано с использованием переменных, о которых мы поговорим в следующем разделе.</p><h2>Переменные и функции</h2><p>Как и в большинстве языков программирования, make-файлы можно сделать более читабельными, используя переменные. make импортирует свою среду, позволяя нам определять переменные внутри файла через внешние источники.</p><h3>Основные операции</h3><p>Определять переменные и ссылаться на них можно следующим образом:</p><p>Ссылаться на переменные можно через $(NAME) или ${NAME}. Если опустить скобки, make сочтет за имя переменной только первый символ. Присоединение осуществляется при помощи оператора +=. Можно также задать условные переменные с помощью ?= (если им еще не присвоены значения).</p><p>Наконец, большинство реализаций make позволяют нам задать выходную переменную с помощью оператора != при порождении одного подпроцесса за операцию.</p><h3>Передача аргументов встроенным шаблонным правилам</h3><p>Ранее мы видели некоторые шаблонные правила в действии, правда, во всех случаях они запускали одни и те же базовые команды. Конечно, требования к сборке не всегда одинаковы, и инструменты могут запрашивать разные флаги для разных задач.</p><p>Например, какому-то ПО нужно обеспечить соединение с разными библиотеками, или заданные оптимизации различаются для сборки отладки и итоговой сборки.</p><p>Поэтому встроенные правила в make включают в себя несколько распространённых переменных в важных местах команд. Мы можем установить их по желанию из make-файла или внешней среды.</p><p>Это позволяет, например, запускать один и тот же make-файл с разными компиляторами, снабдив make необходимым именем бинарного файла для выполнения. Так задаётся переменная среды компилятора C:</p><p>Вот некоторые из самых известных переменных, которые вы могли видеть, если когда-нибудь заглядывали в make-файл:</p><ul><li>$(CC) / $(CXX) — бинарные файлы для компиляторов C и C++, которые make использует для сборки;</li><li>$(CFLAGS) / $(CXXFLAGS) — флаги, передаваемые компиляторам;</li><li>$(LDLIBS) — присоединяемые библиотеки.</li></ul><h3>Программные переменные</h3><p>make хранит некоторые распространённые программы в переменных. В основном это делается для того, чтобы при необходимости их можно было перезаписать.</p><p>Самая важная из них — $(MAKE), которая должна использоваться при рекурсивном вызове make из make-файла. Она принимает во внимание аргументы командной строки из исходного вызова.</p><p>В цели clean, главная задача которой — удаление файлов, безопаснее использовать переменную $(RM) вместо прямого вызова rm.</p><h3>Функции нескольких переменных</h3><p>GNU make определяет некоторые очень полезные методы, большинство которых работает со словами, то есть с разделенными пробелами строками символов. Это облегчает работу с переменными, содержащими в себе списки файлов.</p><p>Функции вызываются таким же образом, как вызывалась бы переменная с таким же именем, но с добавлением аргументов перед закрывающей скобкой.</p><p>Вот некоторые наиболее интересные методы:</p><ul><li>$(wildcard шаблон) возвращает список с названиями файлов, соответствующих шаблону, которые в том числе могут представлять собой относительный путь. Список внутри разделен с помощью пробелов, что проблематично для работы с файлами, содержащими пробелы в названии. Лучше всего избегать таких файлов при работе с make. Шаблон может содержать универсальный символ *;</li><li>$(patsubst шаблон поиска, шаблон замены, список слов) заменяет все слова в списке, которые соответствуют шаблону поиска в соответствии с шаблоном замены. Оба шаблона используют % в качестве символа;</li><li>$(filter-out шаблон поиска, список слов) возвращает список всех слов, отфильтрованных по шаблону поиска;</li><li>$(notdir список слов) возвращает список слов, где имя каждой записи сокращается до основного (то есть если имя содержит название директории, то оно отфильтровывается);</li><li>$(shell команда) запускает команду в подпроцессоре и перехватывает стандартный вывод подобно оператору !=. Оболочка для выполнения команды определяется переменной $(SHELL).</li></ul><p>Подробное описание функций можно найти в <a href="https://www.gnu.org/software/make/manual/html_node/Functions.html">официальной документации</a>.</p><h3>Продвинутое использование переменных</h3><p>Отсылки к переменным можно делать в любом контексте внутри make-файла. Можно даже соорудить имя исполняемого файла внутри списка команд с помощью соединения нескольких переменных. Это позволяет использовать переменные в качестве целей или пререквизитов и создавать простые конструкции типа:</p><p>Данный make-файл создает список всех исходных C-файлов в директории, заменяет суффикс .c на .o, используя функцию $(patsubst ...), и потом использует этот список файлов в качестве пререквизитов к цели all. При запуске make станет собирать цель all, потому что она определена первой. Так как цель зависит от нескольких объектных файлов, которые могут ещё не существовать или должны быть обновлены, а make знает, как их сделать из исходных C-файлов, все запрашиваемые файлы также будут собраны.</p><p>Это становится мощным инструментом в сочетании с шаблонными правилами — мы можем автоматически собирать пререквизиты, которые косвенно используются в качестве новых целей.</p><h3>Замена суффиксов</h3><p>Для совместимости с другими реализациями make обеспечивает альтернативный синтаксис при вызове функции $(patsubst ...), называемый «ссылка с заменой» и позволяющий заменить некоторые суффиксы в списке слов на другие.</p><p>Make-файл из предыдущего примера можно преобразовать следующим образом:</p><p>Важно Вместо функции $(wildcard ...) используется оператор !=.</p><h3>Целезависимые переменные</h3><p>Это ещё одна интересная особенность, использование которой ведёт к сокращению кода: она позволяет устанавливать переменным разные значения в зависимости от текущей цели.</p><p>В этом примере мы бы установили $(FOO) значение bar глобально, значение frob для цели один и значение bar baz для цели два.</p><p>Можно использовать любые необходимые операторы присваивания, что позволяет, например, создавать цели с разными наборами флагов для компилятора, просто присвоив переменной $(CFLAGS) разные значения.</p><h3>Интеграция с внешними процессами</h3><p>В связи с тем, что дистрибутивы Linux в большинстве случаев поставляются с системой управления пакетами и многие пакеты создаются из проектов, использующих make для сборки, были приняты некоторые общие правила использования переменных.</p><p>В основном они касаются установки целей проекта, так как бинарные пакеты часто состоят из результатов запуска make install, упакованных в распространённом формате. Важно запомнить следующие переменные:</p><ul><li>$(DESTDIR) должна быть пустой по умолчанию и никогда не должна задаваться из make-файла (режим чтения). Используется составителями пакета для вставки пути доступа перед устанавливаемыми файлами;</li><li>$(PREFIX) — значение этой переменной в вашем make-файле должно соответствовать /usr/local или другому заданному вами пути. Она позволяет пользователю пакета задать желаемую директорию для установки. Задавайте значение этой переменной, только если оно не было передано окружением (используя оператор ?=).</li></ul><h2>Определение шаблонных правил</h2><p>Синтаксис для написания шаблонных правил во многом похож на обычный синтаксис целей. Основное отличие состоит в использовании шаблонного символа % в основе цели (её имени до расширения), который и будет применяться для поиска соответствий.</p><p>Шаблон также может быть использован в списке пререквизитов, где он будет заменён на основу для формирования неявно определённых пререквизитов. (Список пререквизитов в случае чего можно расширить и явно определёнными.)</p><p>Также можно перезаписать любое из встроенных правил с помощью определения правила с такой же целью и пререквизитами.</p><p>Так как шаблонное правило должно быть написано таким образом, чтобы отличаться от реальных имён файлов, с которыми оно вызывается, make предоставляет специальные переменные для определения шаблонных правил.</p><h3>Динамические переменные</h3><p>Все имена динамических переменных состоят из одного знака, поэтому скобки для ссылки на них не нужны. Таких переменных довольно много, рассмотрим наиболее необходимые:</p><ul><li>$@ — полное название цели;</li><li>$&lt; — имя первого пререквизита (в том числе косвенно сгенерированного поиском по шаблону);</li><li>$^ — разделенный пробелами список всех пререквизитов (версия GNU).</li></ul><p>Шаблонное правило, конвертирующее размеченные файлы в HTML с использованием markdown, получает такой вид:</p><h2>Итоги</h2><p>Ранее мы разобрали некоторые из наиболее трудных аспектов в контексте make-файлов. Перед вами относительно сложный, но тем не менее полезный make-файл, использующийся для статей на <a href="https://fabianstumpf.de/articles/makefiles.htm">сайте автора</a>:</p><p>Скрипт generate_article.py реализует минималистичный шаблонизатор, используя index.htm в качестве базы для вставки HTML, сгенерированного из входных файлов. Присутствие шаблонизатора в пререквизитах шаблонного правила обеспечивает, что изменения в шаблонизаторе вызовут изменения всех файлов, относящихся к статье.</p><p>Для дальнейшего изучения make рекомендуем ознакомиться с <a href="https://www.gnu.org/software/make/manual/">официальным руководством</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>На GitHub появился стековый калькулятор: обзор инструмента Clac</title>
      <link>https://tproger.ru/articles/clac-calculator</link>
      <comments>https://tproger.ru/articles/clac-calculator?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Саша Ушатинская]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/clac-calculator</guid>
      <description><![CDATA[<p>Калькулятор со стековой архитектурой всегда показывает содержимое стека и использует обратную польскую нотацию, избавляя вычисления от скобок.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/clac-calculator">На GitHub появился стековый калькулятор: обзор инструмента Clac</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 17 Apr 2017 12:24:25 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://github.com/soveran/clac">Clac</a> — это калькулятор со стековой архитектурой и интерфейсом командной строки. Он всегда выводит содержание стека и отображает его изменения в процессе вычислений.</p><h3>Зачем такое создавать?</h3><p>Автор любит стековые языки программирования типа <a href="https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D1%82_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)">Форта</a>, а также раньше пользовался <a href="https://www.gnu.org/software/bc/manual/dc-1.05/html_mono/dc.html">калькулятором dc</a>, после которого все остальные калькуляторы кажутся не столь мощными. Но интерфейс dc оказался недостаточно удобным.</p><h3>Принцип работы</h3><p>Ввод числа проталкивает его в стек, а арифметические операции берут аргументы, удаляя их из стека, и затем проталкивают результат. Благодаря <a href="https://ru.wikipedia.org/wiki/Обратная_польская_запись">обратной польской нотации</a> (операнды располагаются перед знаками операций) пропадает неоднозначность вычислений: не нужно использовать скобки и беспокоиться о расстановке приоритетов.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/clac.gif" alt="" /></figure><h3>Установка</h3><p>Следующая команда установит Clac в директорию /usr/local/bin:</p><p>Если вы хотите самостоятельно задать папку, используйте:</p><p>Для удаления калькулятора из системы:</p><p>С подробным описанием и списком поддерживаемых операций можно ознакомиться на соответствующей <a href="https://github.com/soveran/clac">странице репозитория</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows 10 Creators Update: что нового в WSL и консоли Windows</title>
      <link>https://tproger.ru/articles/win10-creators-update-new-in-wsl-console</link>
      <comments>https://tproger.ru/articles/win10-creators-update-new-in-wsl-console?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Юлия Черкашина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/win10-creators-update-new-in-wsl-console</guid>
      <description><![CDATA[<p>Подсистема Windows для Linux получила в Creators Update сотни исправлений и улучшенную совместимость с инструментами разработчика, включая Node.js и Java.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/win10-creators-update-new-in-wsl-console">Windows 10 Creators Update: что нового в WSL и консоли Windows</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Windows 10]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Apr 2017 08:07:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда было выпущено обновление Windows 10 Anniversary Update (AU), подсистема Windows для Linux (WSL) была еще далека от завершения. У нее была масса несовместимостей, особенно с популярными инструментами разработчика, такими как Node.js, Java и т.д. Но с недавно вышедшим Creators Update многое изменилось.</p><h2>Что нового в WSL?</h2><p>Во время цикла разработки Windows 10 Creators Update (CU) команда разработчиков WSL добавила сотни исправлений и улучшений, большинство из которых можно найти в <a href="https://msdn.microsoft.com/en-us/commandline/wsl/release_notes">списке изменений</a>. Мы же опишем самые выдающиеся из них.</p><h3>Дополнительная совместимость</h3><p>Основной целью для Win10 CU было значительно улучшить глубину и широту WSL-совместимости с <a href="https://en.wikipedia.org/wiki/Linux_kernel_interfaces">интерфейсом системных вызовов Linux</a> (SCI). Расширяя и улучшая реализации системных вызовов, Microsoft увеличивает количество доступных инструментов, платформ и сред выполнения.</p><p>Каков результат? В Win10 CU большинство основных инструментов разработчика теперь работают, как и должны, в том числе:</p><ul><li>основные инструменты: apt, sed, grep, awk, top, tmux, ssh, scp и прочее;</li><li>оболочки: Bash, zsh, fish и т. д.;</li><li>инструменты для разработки: vim, emacs, nano, git, gdb и т. д.</li><li>языки и платформы: Node.js и npm, Ruby и Gems, Java и Maven, Python и Pip, C / C ++, C # и .NET Core с Nuget, Go, Rust, Haskell, Elixir / Erlang и другие;</li><li>системы и службы: sshd, Apache, lighttpd, nginx, MySQL, PostgreSQL.</li></ul><h3>Поддержка Ubuntu 16.04</h3><p>В то время, как Anniversary Update Win10 предоставило поддержку Ubuntu 14.04, в Creators Update WSL теперь поддерживает Ubuntu 16.04. Любые новые версии Bash, установленные на Win10 CU, теперь устанавливают Ubuntu 16.04.</p><p>Если вы хотите узнать, какую версию Ubuntu вы используете, введите следующую команду в Bash на Ubuntu :</p><blockquote><b>Важное примечание:</b> Существующие версии Ubuntu14.04НЕ обновляются автоматически до16.04: выдолжны вручную обновиться доUbuntu16.04.</blockquote><h3>ifconfig и поддержка перечисления сетевых подключений</h3><p>Одной из главных неприятностей для Win10 AU было то, что ему не хватало возможности перечислять сетевые соединения, и это мешало правильной работе таких инструментов, как ifconfig, gulp и npm. Это было исправлено в Win10 CU, и теперь вы можете использовать ifconfig для перечисления и проверки конфигурации доступных сетевых адаптеров:</p><figure><img src="https://media.tproger.ru/uploads/2017/04/1-ifconfig.png" alt="" /></figure><h3>Поддержка Ping и ICMP</h3><p>Еще одна проблема, с которой пользователи столкнулись в Win10 AU, заключалась в том, что не администраторы не могли проверить связь с конечной точкой сети. В Win10 CU это исправлено:</p><figure><img src="https://media.tproger.ru/uploads/2017/04/2-ping.png" alt="" /></figure><h3>Поддержка уведомлений об изменении файлов (INOTIFY)</h3><p>Еще одно исправление — это возможность регистрации уведомлений при изменении файла. Это существенная функция, часто используемая веб-, Node-, Ruby- и Python-разработчиками, а также многими другими.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/3-inotify.png" alt="" /></figure><h3>Windows и Linux</h3><p>Основной целью создания WSL было сокращение «пробелов», возникающих при работе с инструментами Windows вместе с инструментами и командной строкой Linux. Когда в Windows 10 AU внедрили WSL, Linux и Windows объединились друг с другом, но по-прежнему существовал большой «пробел». Несмотря на то, что обе системы могли использовать одни и те же файлы, среды были довольно сильно изолированы друг от друга.</p><p>Пользователи часто говорили, что хотели бы работать с приложениями приложения Windows в Bash и открывать приложения Linux из Windows. И эта функция появилась!</p><p>В Windows 10 Creators Update теперь можно запускать приложения и инструменты Windows из Bash …</p><figure><img src="https://media.tproger.ru/uploads/2017/04/4-interop.png" alt="" /></figure><p>… и вы можете запускать файлы / команды / скрипты Linux в Windows:</p><figure><img src="https://media.tproger.ru/uploads/2017/04/5-interop-bash.png" alt="" /></figure><h3>Улучшения в сокетах UNIX и Netlink</h3><p>Некоторые аспекты сокетов UNIX и сокетов Netlink не поддерживались в Anniversary Update.</p><p>В обновлении Creators в WSL были добавлены сокеты дейтаграмм UNIX и сокеты Netlink. Параметры и свойства позволяют использовать различные формы IPC.</p><h3>Улучшения в TCP-сокете и IPv6</h3><p>В обновлении для авторов команда WSL и группы Windows Core Networking работали вместе, чтобы позволить WSL поддерживать несколько дополнительных параметров и свойств сокетов IPv6 и TCP. Это позволяет использовать широкий спектр инструментов и технологий, которые полагаются на различные функции сетевых сокетов, улучшенную поддержку IPv6 и т. д.</p><h3>Другие улучшения WSL</h3><p>Перечисленные выше улучшения WSL представляют собой лишь некоторые из наиболее заметных и примечательных изменений. Но есть сотни других улучшений WSL, включенных в Creators Update. Ниже приведены некоторые из них.</p><ul><li>Процессы Linux подвержены инфраструктуре перечисления Windows, поэтому они отображаются в TaskManager;</li><li>Добавлены функции, помогающие включить средства защиты от вредоносных программ и брандмауэров для понимания процессов Linux;</li><li>Поддержка общей памяти, требуемая PostgreSQL и другими инструментами.</li></ul><p>Консоль Windows является одной из фундаментальных частей всей операционной системы и является частью Windows на протяжении нескольких десятилетий. Около двух лет назад была сформирована новая консоль Windows, которая позволила самой консоли измениться впервые за 30 лет!</p><p>Одним из ключевых поводов для капитального обновления консоли была необходимость включить панель для отображения вывода инструментов командной строки Linux и приложений, работающих на WSL.</p><h2>Что нового в консоли?</h2><p>Поскольку консоль Windows изначально не была создана для поддержки *NIX-систем, она не могла обрабатывать <a href="https://en.wikipedia.org/wiki/ANSI_escape_code">различные команды и данные</a>, генерируемые средствами командной строки и приложениями *NIX.</p><p>В Windows 10 Anniversary Update консоль была усовершенствована, позволяя обрабатывать большинство распространенных VT Sequence, позволяя ей правильно отображать большинство простого форматирования текста. Однако не хватало поддержки для нескольких более сложных сценариев.</p><p>В Windows 10 Creators Update поддержка VT Sequence в консоли была дополнительно улучшена, чтобы корректно обрабатывать несколько более продвинутые VT Sequence, позволяя консоли освещать многие функции богатого текстового интерфейса в vim, emacs, Midnight Commander, tmux, htop и других.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/6-console-tmux.png" alt="" /></figure><h3>Поддержка 24-битного цвета</h3><p>Еще один частый запрос заключался в том, чтобы консоль поддерживала более 16 цветов. Это важно при работе с все более богатыми и современными инструментами командной строки, оболочками и прочим.</p><p>В Win10 Creators Update консоль обновлена и поддерживает 24-битный цвет!</p><figure><img src="https://media.tproger.ru/uploads/2017/04/7-console-colors.png" alt="" /></figure><p>Для получения дополнительной информации можете <a href="https://blogs.msdn.microsoft.com/commandline/2016/09/22/24-bit-color-in-the-windows-console/">прочитать</a> запись в блоге, посвящённую этому изменению.</p><h3>Поддержка мыши</h3><p>Количество многофункциональных текстовых интерфейсов постоянно растет, и поэтому пользователям нужна поддержка мыши для таких инструментов, как Midnight Commander, Htop и тому подобного. Поэтому эта функция также появилась в новом обновлении.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/8-console-mouse.png" alt="" /></figure><h3>Символьные ссылки в Windows без прав администратора</h3><p>Символьные ссылки (симлинки) — важный инструмент, широко используемый в Linux, но в меньшей степени в Windows. Для их создания необходимы права администратора.</p><p>В Windows 10 Creators Update было отменено ограничение прав администратора для пользователей, которые включили режим разработчика, позволяя создавать символические ссылки в консоли.</p><h2>Итоги</h2><p>И в WSL, и в консоли появилось много новых дополнений, улучшений, функций и возможностей. Но, несмотря на то, что консоль и WSL были значительно улучшены в Creators Update, важно отметить, что WSL остается бета-функцией в Creators Update.</p>]]></content:encoded>
    </item>
    <item>
      <title>Оболочка Bash — шпаргалка для начинающих</title>
      <link>https://tproger.ru/translations/bash-cheatsheet</link>
      <comments>https://tproger.ru/translations/bash-cheatsheet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/bash-cheatsheet</guid>
      <description><![CDATA[<p>Шпаргалка по Bash: команды навигации, grep, sed, awk, конвейеры и права доступа. Изучите терминал Linux быстро — с примерами и таблицей горячих клавиш.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/bash-cheatsheet">Оболочка Bash — шпаргалка для начинающих</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 12 Jan 2017 15:28:59 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Ключевые моменты:</b><br />— Bash (Bourne Again Shell) — оболочка для взаимодействия с операционной системой через терминал<br />— Основные команды навигации: pwd, cd, mkdir — позволяют перемещаться по файловой системе<br />— Команды grep, sed и awk — мощные инструменты для поиска и обработки текста<br />— Конвейеры (pipe, символ |) позволяют соединять вывод одной команды со входом другой<br />— Права доступа в Linux управляются командой chmod с буквенной или восьмеричной записью</p><p>В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.</p><h3>Оболочка Bash: введение</h3><p>Оболочка, или шелл (shell) — это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как <a href="https://help.gnome.org/users/gnome-terminal/stable/">gnome-terminal</a>, eterm, nxterm и т. п.</p><h3>Навигация</h3><p>В Linux файлы и каталоги имеют иерархическую организацию, то есть существует некий начальный каталог, называемый корневым. В нём содержатся файлы и подкаталоги, которые в свою очереди содержат файлы и свои подкаталоги.</p><h4>pwd</h4><p>Команда pwd, сокращение от print working directory, отображает текущее местоположение в структуре каталогов.</p><h4>cd</h4><p>Команда cd позволяет перейти в новый каталог.</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/fe3000f0-76eb-4373-950d-354dda8c943c.png" alt="Примеры использования команды cd в Bash" /></figure><h4>mkdir</h4><p>Команда mkdir создаёт новый каталог в текущем каталоге.</p><h3>Основные команды</h3><h4>man</h4><p>Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat:</p><h4>cat</h4><p>Команда cat считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.</p><h4>echo</h4><p>Команда echo выводит свои аргументы по стандартному каналу вывода.</p><p>Если вызвать echo без аргументов, будет выведена пустая строка.</p><h4>head</h4><p>Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:</p><h4>tail</h4><p>Команда tail работает аналогично команде head, но читает строки с конца:</p><p>Также можно просматривать добавляемые к файлу строки в режиме реального времени при помощи флага -f:</p><h4>less</h4><p>Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.</p><p>Подробнее о назначении символа | будет рассказано ниже в разделе команды history.</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/8396171d-ad81-4d62-892d-f14b4f1d9cd2.png" alt="Пример вывода команды less в терминале" /></figure><h4>true</h4><p>Команда true всегда возвращает ноль в качестве выходного статуса для индикации успеха.</p><h4>false</h4><p>Команда false всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.</p><h4>$?</h4><p>$? — это переменная, которая содержит выходной статус последней запущенной команды. Под статусом обычно понимается <a href="https://ru.wikipedia.org/wiki/Код_возврата">код возврата</a> программы. 0 означает успешное выполнение программы, любое значение большее 0 отражает тот факт, что в процессе выполнения возникли некоторые ошибки. Кстати, именно поэтому в bash истинной (true) считается 0, а все, что не 0 — ложью (false):</p><h4>grep</h4><p>Команда grep занимается поиском переданной строки в указанном файле:</p><p>grep также может принимать несколько файлов и регулярных выражений для уточнения формата текста.</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/767f1010-e77e-42ce-b7c4-3101142038a5.png" alt="Примеры использования команды grep" /></figure><p>Также можно ознакомиться с <a href="https://github.com/mikeizbicki/ucr-cs100/tree/2015winter/textbook/using-bash/regex">руководством по regex</a>. У нас на сайте тоже есть <a href="https://tproger.ru/translations/regular-expression-python/">руководство</a> по «регуляркам» в Python для новичков.</p><h4>sed</h4><p>Команда sed — это потоковый редактор, преобразующий входные текстовые данные. Обычно её используют для замены выражений так: s/regexp/replacement/g. Например, следующий код заменит все слова «Hello» на «Hi»:</p><p>Также вы можете ознакомиться с <a href="https://github.com/mikeizbicki/ucr-cs100/tree/2015winter/textbook/using-bash/sed">руководством по sed</a>.</p><h4>history</h4><p>Команда history выводит историю командной строки. Обычно её используют вместе с командой grep для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++:</p><p>Здесь также используется символ | — это так называемый <a href="https://ru.wikipedia.org/wiki/Перенаправление_ввода-вывода">конвейер</a> (pipe). Благодаря ему можно перенаправлять вывод одной команды на вход другой — таким образом в примере выше вся история, которая в обычном режиме выводится командой history прямо в вывод терминала, будет перенаправлена в grep в качестве входных данных. Мы не увидим вывода команды history, но увидим вывод команды grep.</p><p>Это может быть довольно сложно для понимания без практики, поэтому поэкспериментируйте самостоятельно, например с командами ls, history, ps (описана ниже), перенаправляя их вывод в grep, sed или less, например.</p><h4>export</h4><p>Команда export устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name со значением student:</p><h4>ps</h4><p>Команда ps выводит информацию о запущенных процессах.</p><p>Выводится четыре элемента:</p><ul><li>ID процесса (PID),</li><li>тип терминала (TTY),</li><li>время работы процесса (TIME),</li><li>имя команды, запустившей процесс (CMD).</li></ul><h4>awk</h4><p>Команда awk находит и заменяет текст в файлах по заданному шаблону: awk 'pattern {action}' test.txt</p><h4>wget</h4><p>Команда wget скачивает файлы из Сети и помещает их в текущий каталог.</p><h4>nc</h4><p>Команда nc — это утилита для отладки сети. Также можно ознакомиться с <a href="https://github.com/mikeizbicki/ucr-cs100/tree/2015winter/textbook/using-bash/nctutorial">руководством по nc</a>.</p><h4>ping</h4><p>Команда ping тестирует сетевое подключение.</p><p>Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.</p><h4>git</h4><p>Git — это популярная система контроля версий. Также можно ознакомиться с <a href="https://github.com/mikeizbicki/ucr-cs100/tree/2015winter/assignments/lab/lab1-git">руководством по git</a> и <a href="https://tproger.ru/tag/git/">нашими материалами</a>.</p><h3>Переменные окружения</h3><p>Переменные окружения — это именованные переменные, содержащие значения, используемые одним или несколькими приложениями.</p><p>Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.</p><p>Переменная HOME содержит путь к домашнему каталогу текущего пользователя.</p><h3>Коннекторы</h3><p>Коннекторы позволяют запускать несколько команд одновременно.</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/313416d4-e746-498b-9f3f-46b769f29cc3.png" alt="Таблица коннекторов Bash: &amp;&amp;, ||, ;" /></figure><h3>Конвейеры</h3><p>Конвейеры, или пайпы, позволяют соединять входные и выходные каналы различных команд. В следующем примере вывод команды ls будет передан в head , и в результате будет напечатано лишь 10 первых элементов.</p><h3>Перенаправление ввода/вывода</h3><h4>Перенаправление вывода</h4><p>Для стандартного перенаправления вывода используются символы &gt; и &gt;&gt;.</p><p>Например, этот код передаст вывод ls в файл, а не на экран:</p><p>Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду &gt;&gt; — она дописывает данные в конец файла.</p><h4>Перенаправление ввода</h4><p>Для стандартного перенаправления вывода используется символ &lt;. В следующем примере sort берет входные данные из файла, а не с клавиатуры:</p><p>Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:</p><h4>Продвинутое перенаправление</h4><p>Добавление &amp; к &gt; приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp выведет строку stdout в cout и строку stderr в cerr.</p><p>Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к &gt;.</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/6ff29136-7d62-47e1-a2a4-b28fc95b6af0.png" alt="Таблица файловых дескрипторов: stdin, stdout, stderr" /></figure><p>Например, для перенаправления stderr в test.txt нужно сделать следующее:</p><h3>Права доступа</h3><p>Команда ls -l выводит много информации о правах доступа к каждому файлу:</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/794762b4-ca69-4d6e-93d0-dd6aa207c6fb.png" alt="Схема прав доступа к файлам в Linux" /></figure><h4>chmod</h4><p>Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:</p><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/d19f4656-1797-48a2-828c-2c8ab0cbb7ef.png" alt="Таблица флагов команды chmod" /></figure><p>Вы можете вызвать chmod с описанием действий над конкретным файлом. Символ - обозначает удаление прав, символ + — добавление. Следующий пример сделает файл доступным для чтения и записи владельцу и группе:</p><p>Кроме того, chmod можно использовать с восьмеричными числами, где 1 — это наличие прав, а 0 — отсутствие:</p><p>Следующая команда сработает так же, как и предыдущая:</p><p>Также можно ознакомиться с <a href="https://github.com/mikeizbicki/ucr-cs100/tree/2015winter/textbook/using-bash/file-permission">руководством по правам доступа</a>.</p><h3>Сочетания клавиш</h3><figure><img src="https://media.tproger.ru/user-uploads/46677/2023-12-27/ebfca099-3843-40d0-bee1-890e22bb9abb.png" alt="Таблица горячих клавиш Bash" /></figure><h2>FAQ</h2><h3>Чем Bash отличается от других оболочек (Zsh, Fish)?</h3><p>Bash — стандартная оболочка в большинстве дистрибутивов Linux и macOS (до Catalina). Zsh предлагает более продвинутое автодополнение и плагины (Oh My Zsh), а Fish — интуитивный синтаксис и подсветку прямо из коробки. Однако Bash остаётся самым универсальным выбором: скрипты на Bash работают практически везде без дополнительной настройки.</p><h3>Как запустить Bash-скрипт?</h3><p>Создайте файл с расширением .sh, добавьте в первую строку шебанг (#!/bin/bash), напишите команды и сделайте файл исполняемым: chmod +x script.sh. После этого запустите его командой ./script.sh или bash script.sh.</p><h3>Что означает символ | (pipe) в командной строке?</h3><p>Символ | (pipe, конвейер) перенаправляет стандартный вывод одной команды на стандартный вход другой. Например, ls | grep txt выведет только файлы, содержащие "txt" в имени. Это один из ключевых принципов Unix-философии: простые команды, соединённые в цепочку.</p><h3>Как посмотреть историю команд в Bash?</h3><p>Используйте команду history для вывода всей истории. Для поиска конкретной команды нажмите Ctrl+R и начните вводить часть команды — Bash покажет последнее совпадение. Также можно использовать history | grep ключевое_слово для фильтрации.</p><h3>Как изменить права доступа к файлу в Linux?</h3><p>Используйте команду chmod. Буквенная запись: chmod u+rwx,g+rx,o+r file — даёт владельцу все права, группе чтение и выполнение, остальным только чтение. Числовая запись: chmod 754 file — делает то же самое. Числа складываются из r=4, w=2, x=1.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 полезных утилит Linux для анализа и мониторинга системы</title>
      <link>https://tproger.ru/digest/useful-linux-utilities</link>
      <comments>https://tproger.ru/digest/useful-linux-utilities?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/useful-linux-utilities</guid>
      <description><![CDATA[<p>Инструменты вроде ccze для оформления логов и dstat для наблюдения за памятью, процессами и сетью пригодятся администраторам систем и сетей.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/useful-linux-utilities">10 полезных утилит Linux для анализа и мониторинга системы</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 04 Sep 2016 23:06:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы собрали для вас 10 инструментов Linux, которые могут пригодиться, помимо прочего, для администрирования систем, сетей и повышения производительности в целом.</p><h3>1. ccze</h3><p>Инструмент для декорации логов.</p><h4>Примеры:</h4><figure><img src="https://media.tproger.ru/uploads/2016/09/ccze-1-1024x220.png" alt="" /></figure><p>Список модулей:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/ccze-2.png" alt="" /></figure><p>Сохранение лога в формате HTML:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/ccze-3-1024x182.png" alt="" /></figure><h3>2. dstat</h3><p>Гибкий инструмент, который можно использовать для мониторинга памяти, процессов, сетей и прочего. Неплохая замена для ifstat, iostat, dmstat и т.д.</p><h4>Примеры:</h4><p>Детальная информация о процессоре, жёстком диске и сети:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/dstat-1.png" alt="" /></figure><p>Информация только о процессоре:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/dstat-2.png" alt="" /></figure><p>Более подробная информация о процессоре:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/dstat-3.png" alt="" /></figure><p>Информация о диске:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/dstat-4.png" alt="" /></figure><h3>3. findmnt</h3><p>Команда findmnt используется для поиска подключённых файловых систем. С её помощью можно вывести список подключённых устройств, а также подключить/отключить устройство.</p><h4>Примеры:</h4><figure><img src="https://media.tproger.ru/uploads/2016/09/findmnt-1.png" alt="" /></figure><p>Вывод в формате списка:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/findmnt-2-1024x419.png" alt="" /></figure><p>Сортировка по типу файлов:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/findmnt-4-1024x61.png" alt="" /></figure><h3>4. nmon</h3><p>Nmon — это инструмент, отображающий информацию о производительности системы.</p><figure><img src="https://media.tproger.ru/uploads/2016/09/nmon-1.png" alt="" /></figure><p>nmon может выводить информацию об использовании сетей, процессора, памяти и диска.</p><p>Информация о процессоре:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/nmon-2.png" alt="" /></figure><p>Информация о сетях:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/nmon-3.png" alt="" /></figure><h3>5. ncdu</h3><p>Версия ‘du’ с поддержкой курсора, используется для анализа занятого дискового пространства.</p><figure><img src="https://media.tproger.ru/uploads/2016/09/ncdu-1-1024x297.png" alt="" /></figure><p>Конечный вывод:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/ncdu-2.png" alt="" /></figure><h3>6. ranwhen.py</h3><p>Инструмент, написанный на Python и способный графически отображать активность системы. Детали представлены красочными гистограммами.</p><p>Установите Python:</p><p>Обновите систему:</p><p>Скачайте Python:</p><p><a href="https://github.com/p-e-w/ranwhen/archive/master.zip">Скачайте</a> и распакуйте ranwhen.py:</p><p>Запустите инструмент:</p><h3>7. ss</h3><p>ss — хорошая замена netstat, она превосходит её в скорости.</p><h4>Примеры:</h4><p>Вывод всех подключений:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/ss-1.png" alt="" /></figure><p>Вывод только tcp-трафика:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/ss-2-1024x153.png" alt="" /></figure><p>Вывод имён и pid процессов:</p><h3>8. saidar</h3><p>Ещё одна программа для мониторинга системы.</p><h4>Примеры:</h4><figure><img src="https://media.tproger.ru/uploads/2016/09/saidar-1.png" alt="" /></figure><p>Раскрашенный вывод:</p><h3>9. slurm</h3><p>CLI-инструмент, предназначенный для мониторинга сетевых интерфейсов.</p><h4>Примеры:</h4><figure><img src="https://media.tproger.ru/uploads/2016/09/slurm-1.png" alt="" /></figure><h3>10. w</h3><p>Вывод списка вошедших в систему пользователей и исполняемых ими процессов.</p><figure><img src="https://media.tproger.ru/uploads/2016/09/w.png" alt="" /></figure><p>Помощь:</p><p>Информация о текущем пользователе:</p><figure><img src="https://media.tproger.ru/uploads/2016/09/w-2.png" alt="" /></figure><p>Надеемся, вам пригодятся эти малоизвестные, но полезные инструменты администрирования Linux. Также ознакомьтесь с <a href="https://tproger.ru/articles/cool-linux-commands/">нашей статьёй</a>, посвящённой полезным командам Linux.</p>]]></content:encoded>
    </item>
    <item>
      <title>Полезные команды Git: безопасная отмена коммитов, добавление файла из другой ветки и другие</title>
      <link>https://tproger.ru/translations/git-tips-and-tricks</link>
      <comments>https://tproger.ru/translations/git-tips-and-tricks?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/git-tips-and-tricks</guid>
      <description/>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 07 Aug 2016 12:47:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает автор блога AlgoTech</p><p>Git — это мощный, хотя и незамысловато выглядящий, инструмент, который при неосторожном использовании может устроить большой беспорядок. Поэтому, прежде чем пробовать выполнять различные фокусы с Git, я рекомендую ознакомиться с его основными командами (init, clone, push, pull, status, log и т.д.) и концептами (репозиторий, ветвь, коммит, и т.д.).</p><p>Итак, если вы уверенно чувствуете себя при работе с Git, вот несколько полезных трюков, о которых я знаю.</p><h3>Reflog. Отмена операций</h3><p>Я помню, что в начале знакомства с Git я боялся запускать команды. Я думал, что всё испорчу. Например, первое использование git rebase вызвало у меня несколько восклицаний наподобие «Вот *****! Что я только что сделал?!» из-за дублировавшихся или вообще исчезнувших коммитов. Вскоре после этого я понял, что нужно идти дальше.</p><p>Лично я не люблю использовать инструмент, не зная, что именно он делает для достижения результата. Это как вождение машины без руля: всё прекрасно до тех пор, пока не доедешь до поворота. А что потом? Ну, вы меня поняли.</p><p>Итак, в нашем деле очень важно понимать концепты. Я много <a href="https://tproger.ru/books/4-books-about-vcs/">читал про Git</a>, прошёл несколько обучающих курсов, и моё видение мира Git кардинально изменилось. Используя его, я стал чувствовать себя гораздо спокойнее, а что более важно, я познал его истинную мощь. И одной из самых мощных команд является git reflog. Все эти и другие темы мы подробно разобрали в <a href="https://tproger.ru/articles/git-polnyj-putevoditel-ot-pervogo-kommita-do-prodvinutyh-wor">полном путеводителе по Git</a>.</p><p>Используя reflog, вы можете вернуться в прошлое, отменяя почти любые действия, сделанные в Git. Даже если это были rebase или reset. Кроме того, её легко использовать. Чтобы доказать это, приведу маленький пример.</p><p>Чтобы изменить нужное состояние, нужно запустить checkout, используя абсолютную ссылку:</p><p>или относительную ссылку:</p><p>и вы окажетесь в независимом (detached) состоянии HEAD, из которого можно создать новую ветвь.</p><p>Вот и всё. Все операции после вышеуказанного состояния отменены.</p><h3>Revert. Отмена изменений коммита</h3><p>Вы, должно быть, сталкивались с ситуацией, когда вам нужно было отменить некоторые изменения. На помощь придёт команда revert:</p><p>Что она делает? Она просто отменяет действия прошлых коммитов, создавая новый, содержащий все отменённые изменения. Зачем использовать её вместо других решений? Это — единственный безопасный способ, так как он не изменяет историю коммитов. Он обычно используется в публичных ветвях, где изменение истории нежелательно.</p><p>Давайте взглянем на другие команды, способные отменять действия.</p><h4>Rebase</h4><p>Вы можете выполнить эту команду и просто убрать строки, относящиеся к ненужным коммитам. Это самое очевидное и простое решение, но у него есть недостаток, из-за которого его нельзя использовать в публичных ветвях: он изменяет историю коммитов. Поэтому после rebase’а у вас может возникнуть проблема с push’ем.</p><h4>Reset</h4><p>Эта команда удаляет все коммиты выше указанного. Она лучше предыдущей тем, что не добавляет новую информацию в историю, но тем не менее тоже ее меняет.</p><h4>Checkout</h4><p>Эта команда откатывает выбранный файл к состоянию в более ранней версии указанного коммита. Отменённые изменения будут в рабочей директории, и их можно будет закоммитить как угодно.</p><p>Вывод таков, что git revert — самая безопасная операция для отмены действий. Кроме того, нужно заметить, что эти команды не взаимозаменяемы в 100% случаев. Подробнее об этом -- в статье <a href="https://tproger.ru/articles/git-rebase-vs-merge-kogda-chto-ispolzovat-i-v-chyom-raznica">git rebase vs merge: когда что использовать</a>.</p><h3>Log. Более приятное форматирование</h3><p>С git log всё просто. Вы вводите команду и видите историю коммитов в хронологическом порядке, и каждый пункт включает в себя хэш коммита, автора, дату и прикреплённое сообщение.</p><p>Давайте взглянем на вид лога по умолчанию:</p><p>Я думаю, что могло бы быть и лучше.</p><p>Я предпочитаю простые вещи. Поэтому я использую две опции:</p><ul><li>--oneline – показывает каждый коммит в одной строке. Кроме того, она показывает лишь префикс ID коммита.</li><li>--decorate – печатает все относительные имена показанных коммитов.</li></ul><p>Вот как это выглядит:</p><p>Опция --oneline сокращает количество занятых строк, а опция --decorate добавляет относительные имена (локальные/удалённые ветви + HEAD). Используя эти две опции, мы получаем более компактный и осмысленный git log. Да, мы теряем некоторые вещи, но они не особо важны. Так гораздо лучше, да?</p><p>Тем не менее, иногда нам нужно знать дату и автора коммита. В таких случаях я использую следующее:</p><p>Ничего себе! Давайте посмотрим, как это выглядит:</p><p>Весьма неплохо.</p><p>И всё-таки вводить эти команды каждый раз достаточно неудобно, так? Давайте создадим алиасы. Я считаю, что использование алиасов очень сильно повышает продуктивность. Чтобы зарегистрировать их, добавим следующие строки в «~/.bash_profile» (конечно, если вы используете *nix OS):</p><p>Таким образом, мы получили не только хорошо выглядящую историю коммитов, но и упрощённый способ доступа к ней, используя команды gl и gh.</p><p>Еще один вариант украшения вывода лога приведен в <a href="https://tproger.ru/translations/git-log-enhanced/">этой</a> статье.</p><h3>Diff. Разница между коммитами</h3><p>Простая команда, показывающая изменения между объектами в проекте — git diff. Один из основных сценариев её использования — сравнение двух коммитов:</p><p>Другой — вывод всех изменений, не внесённых в индекс. Для этого нужно выполнить следующее:</p><h3>Branch. Проверка ветвей на слияние</h3><p>Я думаю, вы уже знаете, что делает базовая команда git branch (без опций выводит список локальных веток — прим. перев.), поэтому перейдём к делу. Время от времени вам понадобится удалять старые или ненужные ветви из вашего «дерева» git.</p><p>Используя следующее:</p><p>вы получите список всех веток, соединённых с текущей.</p><p>Можно и наоборот:</p><p>Так вы получите список всех не соединённых с текущей веток.</p><p>Таким образом, вы всегда узнаете, безопасно ли удаление той или иной ветви.</p><h3>Checkout. Получение файла из другой ветви</h3><p>Вам наверняка приходилось искать конкретную версию файла, которая была в другой, ещё не присоединённой ветви. Помните команду checkout, приведённую выше? Она выглядит так:</p><p>Указанный файл будет приведен к версии, указанной в заданном коммите. Раньше мы использовали это для отмены изменений файла. Удобно то, что этот коммит необязательно должен находиться в той же ветви, что и наш файл. Поэтому мы можем задать любому файлу любую версию из любого коммита или ветви.</p><p>Надеюсь, вы нашли здесь для себя что-то полезное. Прошу заметить, что все вышеуказанные моменты субъективны, поскольку я подгонял их под свои нужды.</p>]]></content:encoded>
    </item>
    <item>
      <title>Получаем больше информации от git log</title>
      <link>https://tproger.ru/translations/git-log-enhanced</link>
      <comments>https://tproger.ru/translations/git-log-enhanced?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Антон]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/git-log-enhanced</guid>
      <description><![CDATA[<p>Короткий совет для тех, кто работает с git через консоль: алиас превращает неинформативный стандартный вывод команды в наглядную историю.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/git-log-enhanced">Получаем больше информации от git log</a>»</p>]]></description>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 08 Jun 2016 23:20:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сегодня делимся коротким советом с теми, кто использует <a href="https://tproger.ru/tag/git/">git</a> через консоль. Это одна из первых команд, которые автор этого совета рекомендует использовать на новой машине, и по его заверениям, сам он все время убеждается в бесценности этого инструмента:</p><p>После этой команды можно использовать git lg вместо стандартного git log. Что же делает git lg? Она превращает стандартный неинформативный вывод:</p><figure><img src="https://media.tproger.ru/uploads/2016/06/e1PTbGxmqPA.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2016/06/bF6mYm1xoO0.jpg" alt="" /></figure><p>А еще у нас есть <a href="https://tproger.ru/articles/prohozhdenie-learn-git-branching/">полное прохождение Learn Git Branching</a>, которое обязательно пригодится на первых этапах изучения VCS.</p>]]></content:encoded>
    </item>
  </channel>
</rss>