<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>DevSimple</title>
  <subtitle>Блог о веб-разработке</subtitle>
  <id>https://devsimple.ru/posts</id>
  <link href="https://devsimple.ru/posts"/>
  <link href="https://devsimple.ru/feed.xml" rel="self"/>
  <updated>2019-05-11T19:24:00+05:00</updated>
  <author>
    <name>Аникин Артем</name>
  </author>
  <entry>
    <title>Эпизод #5 - Overcommit</title>
    <link rel="alternate" href="https://devsimple.ru/posts/overcommit/"/>
    <id>https://devsimple.ru/posts/overcommit/</id>
    <published>2019-05-11T19:24:00+05:00</published>
    <updated>2019-06-02T21:14:33+05:00</updated>
    <author>
      <name>Аникин Артем</name>
    </author>
    <content type="html">&lt;p&gt;&lt;a href="https://github.com/sds/overcommit" title="Репозиторий Overcommit"&gt;Overcommit&lt;/a&gt; - инструмент для удобного управления хуками гита, рассмотрим его как инструмент для самоконтроля по написанию чистого кода.
Overcommit будет полезен как фронтендерам, так и бекендерам за счет того, что имеет большую базу предустановленных хуков.
В данной статье будет рассмотрена настройка проверки кода утилитами &lt;code&gt;RuboCop&lt;/code&gt; и &lt;code&gt;Fasterer&lt;/code&gt; при каждой попытке сделать коммит.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

        &lt;h2 id="-" class="title"&gt;
          &lt;a name="-" class="anchor" href="#-"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Установка
        &lt;/h2&gt;
      
&lt;p&gt;Overcommit устанавливается как gem, командой:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gem install overcommit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Теперь можно устанановить хуки в репозиторий.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Важно:&lt;/strong&gt; установка производится в корневом каталоге проекта, где инициализирован Git репозиторий. Если репозиторий не инициализирован, то запустите команду &lt;code&gt;git init&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;overcommit &lt;span class="nt"&gt;--install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Данная команда заменит все существующие хуки. Ваши хуки будут сохранены в резервной копии и их можно восстановить командой:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;overcommit &lt;span class="nt"&gt;--uninstall&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        &lt;h2 id="-_1" class="title"&gt;
          &lt;a name="-_1" class="anchor" href="#-_1"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Конфигурация
        &lt;/h2&gt;
      
&lt;p&gt;Все специфичные для репозитория настройки хранятся в файле &lt;code&gt;.overcommit.yml&lt;/code&gt;, который распологается в корневой директории вашего проекта.
Ваш конфигурационный файл будет автоматически расширять &lt;a href="https://github.com/sds/overcommit/blob/master/config/default.yml" title="Overcommit default configuration"&gt;настройки по умолчанию&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Предположим, что мы хотим настроть хуки, которые будут срабатывать каждый раз, когда мы создаем новый коммит (&lt;code&gt;PreCommit&lt;/code&gt;).
Хуки должны проверить код на соответствие так называемым style-guide и убедиться, что при написании кода мы использовали самые оптимальные методы.
В этом нам помогут уже знакомые по предыдущим эпизодам инструменты &lt;a href="/posts/rubocop" title="Эпизод #2 - Rubocop"&gt;Rubocop&lt;/a&gt; и &lt;a href="/posts/fast-ruby-and-fasterer" title="Эпизод #1 - Fast Ruby &amp;amp; Fasterer"&gt;Fasterer&lt;/a&gt;.
Все возможные PreCommit-хуки можно найти &lt;a href="https://github.com/sds/overcommit#precommit" title="PreCommit хуки"&gt;тут&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Начнем с подключения Rubocop.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.overcommit.yml&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Precommit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;RuboCop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Указываем момент срабатывания хука - &lt;code&gt;PreCommit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Прописываем название самого хука - &lt;code&gt;Rubocop&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Активируем его &lt;code&gt;enabled: true&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Далее нужно определиться с поведением хука для строк, которые не были модифицированны. Ранее мы определились, что мы хотим, чтобы хук анализировал только тот код, который был изменен. Поэтому нужно добавить опцию &lt;code&gt;problem_on_unmodified_line&lt;/code&gt; с флагом &lt;code&gt;ignore&lt;/code&gt;. А также определить поведение, когда будут найдены несоответствия. Настроим так, чтобы коммит нельзя было создать, пока не будут исправлены все несоответствия. В этой задаче нам поможет флаг &lt;code&gt;on_warn&lt;/code&gt; с флагом &lt;code&gt;fail&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Precommit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;RuboCop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;on_warn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fail&lt;/span&gt;
    &lt;span class="na"&gt;problem_on_unmodified_line&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ignore&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Часто требуется исключить некоторые файлы из проекта. Допустим, мы работаем над Rails проектом и хотим исключить из хука &lt;code&gt;Rubocop&lt;/code&gt; все файлы, которые лежат в директории &lt;code&gt;**/db/&lt;/code&gt;. Тогда наш конфигурационный файл примет следующий вид:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Precommit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;RuboCop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;on_warn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fail&lt;/span&gt;
    &lt;span class="na"&gt;problem_on_unmodified_line&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ignore&lt;/span&gt;
    &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**/db/'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Теперь можно проделать тоже самое для хука &lt;code&gt;Fasterer&lt;/code&gt;. Все шаги практически идентичны предыдущим, за несколькими исключениями. Вот так будет выглядеть обновленный конфигурационный файл:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Precommit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;RuboCop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;on_warn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fail&lt;/span&gt;
    &lt;span class="na"&gt;problem_on_unmodified_line&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ignore&lt;/span&gt;
    &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**/db/'&lt;/span&gt;

  &lt;span class="na"&gt;Fasterer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;on_warn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fail&lt;/span&gt;
    &lt;span class="na"&gt;problem_on_unmodified_line&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ignore&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Важно:&lt;/strong&gt; убедитесь, что у вас установлены &lt;code&gt;Rubocop&lt;/code&gt; и &lt;code&gt;Fasterer&lt;/code&gt;, перед использованием этого конфигурационного файла.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gem install fasterer rubocop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;После того как конфигурационный файл подготовлен необходимо прописать новые хуки в настройки вашего репозитория:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;overcommit &lt;span class="nt"&gt;--sign&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Данную команду нужно запускать каждый раз, после того как вы внесли какие-либо изменения в конфигурационный файл.&lt;/p&gt;

        &lt;h2 id="-_2" class="title"&gt;
          &lt;a name="-_2" class="anchor" href="#-_2"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Использование
        &lt;/h2&gt;
      
&lt;p&gt;После того как Overcommit настроен и хуки прописаны в вашем репозитории, при попытке сделать коммит, будет производиться анализ измененного кода.
Если будут найдены какие-либо несоответствия прописанным правилам, созадние коммита будет прервано и указаны инструкции для испавления ошибок.&lt;/p&gt;

&lt;p&gt;Для примера напишем класс &lt;code&gt;User&lt;/code&gt;.
Добавим пару простых методов, первый будет находить первого администратора среди всех пользователей, второй будет возвращать название роли пользователя.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
  &lt;span class="nb"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:last_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:admin?&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first_admin&lt;/span&gt;
    &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;admin?&lt;/span&gt; &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;role_name&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;admin?&lt;/span&gt;
      &lt;span class="s2"&gt;"Администратор"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="s2"&gt;"Пользователь"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Добавим новый код репозиторий:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;git add user.rb
git commit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Добавленный код был проанализирован, коммит отменен и мы видим допущенные ошибки.
&lt;div class="image-block"&gt;&lt;img src="/assets/images/posts/2019/05/overcommit-failed-f7e64aff.png" alt="overcommit-failed" /&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Внесем изменения согласно данному отчету:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
  &lt;span class="nb"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:last_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:admin?&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first_admin&lt;/span&gt;
    &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:admin?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;role_name&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;admin?&lt;/span&gt;
      &lt;span class="s1"&gt;'Администратор'&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="s1"&gt;'Пользователь'&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Повторим создание коммита:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;git add user.rb
git commit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Теперь код валиден и мы можем завершить создание коммита
&lt;div class="image-block"&gt;&lt;img src="/assets/images/posts/2019/05/overcommit-success-dcab8283.png" alt="overcommit-success" /&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Бывают случаи, когда исправить код не получается, а коммит нужно сделать и причем срочно. Для таких случаем нам придут на помощь переменные окружения. С помощью них можно отключить определенный хук или наоборот запустить только конкретный, а можем поностью провести коммит отключив все хуки. Вот примеры таких команд:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;SKIP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;RuboCop git commit &lt;span class="c"&gt;# пропустить хук RuboCop&lt;/span&gt;
&lt;span class="nv"&gt;ONLY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;RuboCop git commit &lt;span class="c"&gt;# запустить только RuboCop&lt;/span&gt;
&lt;span class="nv"&gt;OVERCOMMIT_DISABLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 git commit &lt;span class="c"&gt;# отключить все хуки&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Для удобства можно создать алиасы для часто используемых команд.&lt;/p&gt;

&lt;p&gt;Обязательно загляните в &lt;a href="https://github.com/sds/overcommit" title="Репозиторий Overcommit"&gt;оф. репозиторий&lt;/a&gt; и изучите все возможности Overcommit.&lt;/p&gt;

&lt;p&gt;В этой статье рассмотрена лишь малая часть возможностей этой замечательной утилиты, но даже эта малая часть поможет сделать вашу работу чуточку проще.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>BAT - улучшенный CAT с подсветкой синтаксиса</title>
    <link rel="alternate" href="https://devsimple.ru/posts/bat/"/>
    <id>https://devsimple.ru/posts/bat/</id>
    <published>2019-01-26T10:24:00+05:00</published>
    <updated>2019-03-03T22:43:39+05:00</updated>
    <author>
      <name>Аникин Артем</name>
    </author>
    <content type="html">&lt;p&gt;В UNIX подобных системах &lt;code&gt;cat&lt;/code&gt; используется для последовательного считывания и вывода содержимого файлов в стандартный вывод.
В этой статье мы разберем похожую утилиту, являющуюся клоном &lt;code&gt;cat&lt;/code&gt;, но с дополнительными улчшениями, такими как подсветка синтаксиса и интеграция с &lt;a href="https://git-scm.com/"&gt;GIT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;div class="image-block"&gt;&lt;img src="/assets/images/posts/2019/01/bat-cat-comparison-1641e542.png" alt="Bat and Cat comparison" /&gt;&lt;/div&gt;&lt;/p&gt;

        &lt;h2 id="-" class="title"&gt;
          &lt;a name="-" class="anchor" href="#-"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Установка
        &lt;/h2&gt;
      
        &lt;h3 id="Ubuntu" class="title"&gt;
          &lt;a name="Ubuntu" class="anchor" href="#Ubuntu"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Ubuntu
        &lt;/h3&gt;
      
&lt;p&gt;Скачайте последнюю версию &lt;code&gt;.deb&lt;/code&gt; пакета &lt;a href="https://github.com/sharkdp/bat/releases"&gt;отсюда&lt;/a&gt; и выполните команду:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# замените имя пакета, на скаченный вами&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; bat_0.9.0_amd64.deb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        &lt;h3 id="MacOS" class="title"&gt;
          &lt;a name="MacOS" class="anchor" href="#MacOS"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          MacOS
        &lt;/h3&gt;
      
&lt;p&gt;Установите &lt;code&gt;bat&lt;/code&gt; с помощью пакетного менеджера &lt;a href="https://docs.brew.sh/Installation"&gt;Homebrew&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;brew install bat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        &lt;h3 id="Arch-Linux" class="title"&gt;
          &lt;a name="Arch-Linux" class="anchor" href="#Arch-Linux"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Arch Linux
        &lt;/h3&gt;
      
&lt;p&gt;Установите пакет &lt;code&gt;bat&lt;/code&gt; из официального репозитория:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; bat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        &lt;h3 id="-_1" class="title"&gt;
          &lt;a name="-_1" class="anchor" href="#-_1"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Другие системы
        &lt;/h3&gt;
      
&lt;p&gt;Если в списке выше вы не нашли своей операционной системы, то загляните в &lt;a href="https://github.com/sharkdp/bat#installation"&gt;репозитрий&lt;/a&gt;.&lt;/p&gt;

        &lt;h2 id="-_2" class="title"&gt;
          &lt;a name="-_2" class="anchor" href="#-_2"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Использование
        &lt;/h2&gt;
      
&lt;p&gt;Чтобы посмотреть содержимое файла, нужно выполнить команду:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;bat file01.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Вы также можете посмотреть содержимое сразу нескольких файлов:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;bat file01.md file02.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Или соединить несколько файлов в один:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;bat file01.md file02.md &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; multifile.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Перейдем к основным преимуществам &lt;code&gt;bat&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;/p&gt;

        &lt;h3 id="-Git" class="title"&gt;
          &lt;a name="-Git" class="anchor" href="#-Git"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Интеграция с Git
        &lt;/h3&gt;
      
&lt;p&gt;Если внести изменения в файл, который находится под контролем системы управления версиями &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;, то в колонке слева будут отображаться изменения.
&lt;div class="image-block"&gt;&lt;img src="/assets/images/posts/2019/01/bat-git-integration-c4fe7423.png" alt="Bat Git integration" /&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;/p&gt;

        &lt;h3 id="-_3" class="title"&gt;
          &lt;a name="-_3" class="anchor" href="#-_3"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Подсветка синтаксиса
        &lt;/h3&gt;
      
&lt;p&gt;&lt;code&gt;bat&lt;/code&gt; поддерживает подсветку синтаксиса для большого кол-ва языков разметки и программирования.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;bat posts_controller.rb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;С полным списком можно познакомиться, написав команду:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;bat &lt;span class="nt"&gt;--list-languages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;div class="image-block"&gt;&lt;img src="/assets/images/posts/2019/01/bat-list-languages-4f59da59.png" alt="bat-list-languages" /&gt;&lt;/div&gt;&lt;/p&gt;

        &lt;h2 id="-_4" class="title"&gt;
          &lt;a name="-_4" class="anchor" href="#-_4"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Конфигурация
        &lt;/h2&gt;
      
&lt;p&gt;Если вам не нравится тема по умолчанию, вы можете её поменять. Для того чтобы посмотреть список всех доступных команд запустите команду:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;bat &lt;span class="nt"&gt;--list-themes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;div class="image-block"&gt;&lt;img src="/assets/images/posts/2019/01/bat-list-themes-d2190a80.png" alt="bat-list-themes" /&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Для использования темы, для примера возьмем &lt;code&gt;Monokai Extended Origin&lt;/code&gt;, запустите:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;bat &lt;span class="nt"&gt;--theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Monokai Extended Origin"&lt;/span&gt; posts_controller.rb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;div class="image-block"&gt;&lt;img src="/assets/images/posts/2019/01/bat-custom-theme-5474bfae.png" alt="bat-custom-theme" /&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Для того, чтобы изменить тему по умолчанию, можно присвоить переменной окружения &lt;code&gt;BAT_THEME&lt;/code&gt; понравившуюся тему:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;BAT_THEME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"TwoDark"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        &lt;h3 id="-_5" class="title"&gt;
          &lt;a name="-_5" class="anchor" href="#-_5"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Добавление новой темы
        &lt;/h3&gt;
      
&lt;p&gt;Первое, что нужно сделать, это создать папку, где мы будем хранить новые темы:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;mkdir &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;bat &lt;span class="nt"&gt;--config-dir&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/themes"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;bat &lt;span class="nt"&gt;--config-dir&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/themes"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Теперь ищем тему с расширением &lt;code&gt;*.tmTheme&lt;/code&gt;, например по этой &lt;a href="https://github.com/filmgirl/TextMate-Themes"&gt;ссылке&lt;/a&gt;, скачиваем, копируем в только что созданную папку и обновляем кэш:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Перемещаем скачанную тему Railscasts.tmTheme&lt;/span&gt;
mv ~/Downloads/Railscasts.tmTheme &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Обновляем кэш&lt;/span&gt;
bat cache &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;После этого новая тему будет доступна для выбора.
&lt;div class="image-block"&gt;&lt;img src="/assets/images/posts/2019/01/bat-railscasts-theme-0ff4634c.png" alt="bat-railscasts-theme" /&gt;&lt;/div&gt;&lt;/p&gt;

        &lt;h3 id="-_6" class="title"&gt;
          &lt;a name="-_6" class="anchor" href="#-_6"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Файл конфигурации
        &lt;/h3&gt;
      
&lt;p&gt;Есть еще один вариант изменения настроек по умолчанию, использовать файл настроек. Для этого нужно создать файл &lt;code&gt;bat.conf&lt;/code&gt; и через переменную окружения
&lt;code&gt;BAT_CONFIG_PATH&lt;/code&gt; указать путь к этому файлу:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;BAT_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/path/to/bat.conf"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Пример такого файла:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Установить тему по умолчанию "TwoDark"&lt;/span&gt;
&lt;span class="nt"&gt;--theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"TwoDark"&lt;/span&gt;

&lt;span class="c"&gt;# Показать номера строк, изменения Git и отобразить имя файла&lt;/span&gt;
&lt;span class="nt"&gt;--style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"numbers,changes,header"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
На этом все. Надеюсь, что этот пост был вам полезен.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Эпизод #4 - Chartkick</title>
    <link rel="alternate" href="https://devsimple.ru/posts/chartkick/"/>
    <id>https://devsimple.ru/posts/chartkick/</id>
    <published>2018-08-30T03:17:00+05:00</published>
    <updated>2018-10-02T21:47:11+05:00</updated>
    <author>
      <name>Аникин Артем</name>
    </author>
    <content type="html">&lt;p&gt;В этом эпизоде рассмотрим возможности визуализации данных с помощью библиотеки &lt;code&gt;Chartkick&lt;/code&gt;.
&lt;/p&gt;

        &lt;h3 id="-" class="title"&gt;
          &lt;a name="-" class="anchor" href="#-"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Ссылки:
        &lt;/h3&gt;
      
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faker:&lt;/strong&gt; &lt;a href="https://github.com/stympy/faker"&gt;https://github.com/stympy/faker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chartkick:&lt;/strong&gt; &lt;a href="https://github.com/ankane/chartkick"&gt;https://github.com/ankane/chartkick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Оф. документация Chartkick:&lt;/strong&gt; &lt;a href="https://www.chartjs.org/docs/latest/"&gt;https://www.chartjs.org/docs/latest/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Groupdate:&lt;/strong&gt; &lt;a href="https://github.com/ankane/groupdate"&gt;https://github.com/ankane/groupdate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Highcharts:&lt;/strong&gt; &lt;a href="https://www.highcharts.com/demo"&gt;https://www.highcharts.com/demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Код:&lt;/strong&gt; &lt;a href="https://github.com/dev-simple/charts"&gt;https://github.com/dev-simple/charts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Эпизод #3 - Hound</title>
    <link rel="alternate" href="https://devsimple.ru/posts/hound/"/>
    <id>https://devsimple.ru/posts/hound/</id>
    <published>2017-12-12T23:54:00+05:00</published>
    <updated>2018-05-22T12:19:43+05:00</updated>
    <author>
      <name>Аникин Артем</name>
    </author>
    <content type="html">&lt;p&gt;В этом эпизоде рассмотрим HoundCI, инструмент для автоматического анализа кода в Pull Request’ах, который работает в связке с GitHub.

Hound может проанализировать несколько типов кода. Для каждого типа он использует свою технологию:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ruby - &lt;a href="https://github.com/bbatsov/rubocop"&gt;Rubocop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CoffeeScript - &lt;a href="http://www.coffeelint.org/"&gt;CoffeeLint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JavaScript - &lt;a href="https://github.com/jshint/jshint"&gt;JSHint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SCSS - &lt;a href="https://github.com/causes/scss-lint"&gt;SCSS-Lint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SASS - &lt;a href="https://github.com/sasstools/sass-lint"&gt;SASS-Lint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Haml - &lt;a href="https://github.com/brigade/haml-lint"&gt;Haml-Lint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go - &lt;a href="https://github.com/golang/lint"&gt;Golint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Swift - &lt;a href="https://github.com/realm/SwiftLint"&gt;SwiftLint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ESLint - &lt;a href="http://eslint.org/"&gt;ESLint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python - &lt;a href="http://flake8.readthedocs.org/en/latest/"&gt;Flake8&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TypeScript - &lt;a href="https://palantir.github.io/tslint/"&gt;TSLint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Elixir - &lt;a href="http://credo-ci.org/"&gt;Credo&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Подробнее можно посмотреть в &lt;a href="https://houndci.com/configuration"&gt;оф.документации&lt;/a&gt;&lt;/p&gt;

        &lt;h2 id="-" class="title"&gt;
          &lt;a name="-" class="anchor" href="#-"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Как это работает
        &lt;/h2&gt;
      
&lt;ol&gt;
&lt;li&gt;Вы пишите код&lt;/li&gt;
&lt;li&gt;Делает Pull Request&lt;/li&gt;
&lt;li&gt;Hound проверяет ваш код и комментирует все проблемные места от имени пользователя houndci&lt;/li&gt;
&lt;li&gt;Вы исправляете замечания&lt;/li&gt;
&lt;li&gt;Делаете merge с master&lt;/li&gt;
&lt;/ol&gt;

        &lt;h2 id="-Hound-" class="title"&gt;
          &lt;a name="-Hound-" class="anchor" href="#-Hound-"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Подключаем Hound к проекту
        &lt;/h2&gt;
      
&lt;p&gt;Первое, что необходимо сделать, это выполнить &lt;a href="https://houndci.com/"&gt;Вход&lt;/a&gt; используя свой GitHub аккаунт.
После этого вы увидите список всех Ваших репозиториев.
Для того, чтобы активировать Hound, нужно в строке с нужным репозиторием нажать на кнопку &lt;code&gt;Activate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;div class="image-block"&gt;&lt;img src="/assets/images/posts/2017/12/hound_activate-a13e87dd.png" title="Hound Activate repository" alt="Hound Activate" /&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;После этого Hound будет делать Code Review для каждого Pull Request’а в вашем проекте.&lt;/p&gt;

        &lt;h2 id="-_1" class="title"&gt;
          &lt;a name="-_1" class="anchor" href="#-_1"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Конфигурация
        &lt;/h2&gt;
      
&lt;p&gt;Мы можем подключить или отключить любой из линтеров.
Разместите в корне Вашего проекта файл &lt;code&gt;.hound.yml&lt;/code&gt; и, к примеру мы хотим отключить SCSS, напишем следующее:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;scss&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Это строка отключит слежку за файлами &lt;code&gt;*.scss&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Мы также можем подключить свой файл конфигурации для каждого линтера.
Для Ruby это может выглядеть так:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;ruby&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;config_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.rubocop.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Также можно исключить некоторые файлы из проверки:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;scss&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;app/assets/stylesheets/plugins/**"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Hound очень удобен и прост в использовании. Он поможет Вам сохранить массу времени для поддержания чистого кода.&lt;/p&gt;

        &lt;h3 id="-_2" class="title"&gt;
          &lt;a name="-_2" class="anchor" href="#-_2"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Ссылки
        &lt;/h3&gt;
      
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hound:&lt;/strong&gt; &lt;a href="https://houndci.com/"&gt;https://houndci.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Оф. документация:&lt;/strong&gt; &lt;a href="https://houndci.com/configuration"&gt;https://houndci.com/configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Проект, используемый в видео:&lt;/strong&gt; &lt;a href="https://github.com/dev-simple/create_blog_on_rails"&gt;https://github.com/dev-simple/create_blog_on_rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Эпизод #2 - Rubocop</title>
    <link rel="alternate" href="https://devsimple.ru/posts/rubocop/"/>
    <id>https://devsimple.ru/posts/rubocop/</id>
    <published>2017-12-04T01:33:00+05:00</published>
    <updated>2018-06-28T22:16:41+05:00</updated>
    <author>
      <name>Аникин Артем</name>
    </author>
    <content type="html">&lt;p&gt;В этом эпизоде поговорим о стиле программирования.
Если вы работаете в команде, коммитите в Open Source проекты или просто хотите чтобы ваш код был чище и читабельнее, то этот урок будет для вас полезен. &lt;/p&gt;

&lt;p&gt;Ruby очень гибкий язык, который дает нам возможность писать идентичный по функциональности код разными способами.
Вы наверняка хоть раз задумывались о том, где делать отступы, использовать для блока конструкцию &lt;code&gt;do … end&lt;/code&gt; или же использовать &lt;code&gt;{ ... }&lt;/code&gt;, использовать &lt;code&gt;def&lt;/code&gt; с круглыми скобками, если у метода есть переменные или нет…&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Ruby - &lt;a href="https://github.com/arbox/ruby-style-guide/blob/master/README-ruRU.md"&gt;https://github.com/arbox/ruby-style-guide/blob/master/README-ruRU.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rails - &lt;a href="https://github.com/arbox/rails-style-guide/blob/master/README-ruRU.md#activerecord"&gt;https://github.com/arbox/rails-style-guide/blob/master/README-ruRU.md#activerecord&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Например в Ruby-style-guide вы можете увидеть, что необходимо использовать 2 пробела в качестве уровня отступа и не использовать табуляцию.&lt;/p&gt;

&lt;p&gt;Для более удобного восприятия больших чисел необходимо использовать нижнее подчеркивание &lt;code&gt;_&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# плохо (Сколько тут нолей?)&lt;/span&gt;
&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;

&lt;span class="c1"&gt;# хорошо (число воспринимается гораздо легче)&lt;/span&gt;
&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Для того, чтобы придерживаться этому своду правил существует статический анализатор кода Rubocop.&lt;/p&gt;

        &lt;h2 id="Rubocop" class="title"&gt;
          &lt;a name="Rubocop" class="anchor" href="#Rubocop"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Rubocop
        &lt;/h2&gt;
      
&lt;p&gt;Для того, чтобы проанализировать ваш код, &lt;a href="https://github.com/bbatsov/rubocop"&gt;Rubocop&lt;/a&gt; использует так называемые cop&amp;#39;ы.
Существует несколько категорий cop&amp;#39;ов:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Style&lt;/strong&gt; - анализирует стиль кода (форматирование)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Style/TrailingWhitespace&lt;/strong&gt; - не использовать пробел в конце строки&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Style/UnlessElse&lt;/strong&gt; - не использовать Unlses вместе с Else, т.к. Это затрудняет чтение вашего кода&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Style/StringLiterals&lt;/strong&gt; - использование двойной или одинарных кавычек&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Layout&lt;/strong&gt; - анализирует использование отступов, выравнивание&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ayout/AlignArray&lt;/strong&gt; - выравние элементов в массиве, который имеет Болле одной строки&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ayout/AlignHash&lt;/strong&gt; - выравние элементов в хэше, который имеет Болле одной строки&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lint&lt;/strong&gt; - анализирует синтаксис и плохие практики&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lint/AssignmentInCondition&lt;/strong&gt; - присвоение значения переменной в условии&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lint/DuplicateMethods&lt;/strong&gt; - проверяет наличие повторяющихся методов&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Metrics&lt;/strong&gt; - различные метрики кода&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Metrics/LineLength&lt;/strong&gt; - следит за длиной строки&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metrics/MethodLength&lt;/strong&gt; - следит за числом строк в методе&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Naming&lt;/strong&gt; - следит за ошибками в наименовании, таких как наименование метода, констант и т.д.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Naming/AccessorMethodName&lt;/strong&gt; - следит за тем, чтобы вы не использовали в наименовании методов &lt;code&gt;get&lt;/code&gt; и &lt;code&gt;set&lt;/code&gt; префиксы&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Naming/AsciiIdentifiers&lt;/strong&gt; - следит за тем, чтобы в наименовании не использовались non-ascii символы&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt; - следит за тем, чтобы использовались более быстрые семантически эквивалентные методы.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance/Detect&lt;/strong&gt; - использовать &lt;code&gt;detect&lt;/code&gt; вместо констуркции &lt;code&gt;select.first&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance/FlatMap&lt;/strong&gt; - использовать &lt;code&gt;flat_map&lt;/code&gt; вместо конструкции &lt;code&gt;map.flatten&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt; - следит за потенциально не безопасными методами и конструкциями&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rails&lt;/strong&gt; - специфичный для Ruby on Rails проектов&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rails/ApplicationRecord&lt;/strong&gt; - следит за тем, чтобы модель наслаивалась от &lt;code&gt;ApplicationRecord&lt;/code&gt; вместо &lt;code&gt;ActiveRecord::Base&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rails/DynamicFindBy&lt;/strong&gt; - следит за динамическими методами &lt;code&gt;find_by_*&lt;/code&gt;, рекомендуя использовать &lt;code&gt;find_by&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bundler&lt;/strong&gt; - следит за стилями и хорошими практиками в &lt;code&gt;Gemfile&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bundler/DuplicatedGem&lt;/strong&gt; - следит за дупликатами в &lt;code&gt;Gemfile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bundler/OrderedGems&lt;/strong&gt; - следит за тем, чтобы gem&amp;#39;ы объявлялись в отсортированном порядке&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gemspec&lt;/strong&gt; - следит за стилями и хорошими практиками в &lt;code&gt;gemspec&lt;/code&gt; файлах&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Подробнее можно почитать в &lt;a href="http://rubocop.readthedocs.io/en/latest/"&gt;официальной документации&lt;/a&gt;.&lt;/p&gt;

        &lt;h2 id="-" class="title"&gt;
          &lt;a name="-" class="anchor" href="#-"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Практика
        &lt;/h2&gt;
      
&lt;p&gt;Установим rubocop
&lt;code&gt;console
gem install rubocop
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Для примера используем код из курса «Создание блога Rails». Перейдем в папку проекта и запустим rubocop c флагом &lt;code&gt;-D&lt;/code&gt; для отображения cop&amp;#39;а, который вызвал нарушение&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;cd blog
rubocop -D
…
db/migrate/20170212144127_devise_create_users.rb:33:1: C: Layout/EmptyLines: Extra blank line detected.

75 files inspected, 236 offenses detected
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Мы видим, что rubocop проанализировал проект и нашел 236 нарушений в 75 файлах. Так же в каждой строке можно увидеть какой именно cop обнаружил нарушение. В нашем примере последнее нарушение найдено cop&amp;#39;ом &lt;code&gt;Layout/EmptyLines&lt;/code&gt;. Он говорит нам, что в 33 строке одной из миграций есть пустая строка.
Можно вывести  все нарушения связанные с этим cop&amp;#39;ом&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;rubocop -D --only Layout/EmptyLines

Inspecting 75 files
..C.......................................................................C

Offenses:

Gemfile:3:1: C: Layout/EmptyLines: Extra blank line detected.
db/migrate/20170212144127_devise_create_users.rb:33:1: C: Layout/EmptyLines: Extra blank line detected.

75 files inspected, 2 offenses detected
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Мы видим, что подобная ошибка встречается дважды в миграции и &lt;code&gt;Gemfile&lt;/code&gt;.
Для исправления нарушения, мы можем вручную зайти в эти файлы и удалить пустую строку.&lt;/p&gt;

&lt;p&gt;Для удобства Rubocop поддерживает режим автокоррекции. Для этого достаточно запустить rubocop c флагом &lt;code&gt;-a&lt;/code&gt;. Если скомбинировать с флагом &lt;code&gt;--only&lt;/code&gt; и указать конкретный cop, то будут исправлены только присущие данному cop&amp;#39;у нарушения.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;rubocop -D -a --only Layout/EmptyLines

Inspecting 75 files
..C.......................................................................C

Offenses:

Gemfile:3:1: C: [Corrected] Layout/EmptyLines: Extra blank line detected.
db/migrate/20170212144127_devise_create_users.rb:33:1: C: [Corrected] Layout/EmptyLines: Extra blank line detected.

75 files inspected, 2 offenses detected, 2 offenses corrected
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Мы видим, что нарушения были исправлены. При повторном запуске rubocop, данных нарушений уже не будет&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;rubocop -D --only Layout/EmptyLines

Inspecting 75 files
&lt;/span&gt;&lt;span class="c"&gt;...........................................................................
&lt;/span&gt;&lt;span class="go"&gt;
75 files inspected, no offenses detected
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Автокоррекция надежный помощник, но бывают случаи когда не возможно автоматически скорректировать ваш код. Ярким примером может послужить cop &lt;code&gt;Metrics/LineLength&lt;/code&gt;, который следит за длинной строки.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;rubocop -D -a --only Metrics/LineLength
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Запустив такой cop в режиме автокорреции мы увидим, что эти нарушения не были изменены, что логично, ведь он не знает как правильно перенести код на разные строки. В таких случаях вам придется вручную исправить эти нарушения.&lt;/p&gt;

        &lt;h2 id="-Rubocop" class="title"&gt;
          &lt;a name="-Rubocop" class="anchor" href="#-Rubocop"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Конфигурация Rubocop
        &lt;/h2&gt;
      
&lt;p&gt;По умолчанию Rubocop следит за всеми нарушениями, но вы можете изменить его поведение, добавив правила в файл &lt;code&gt;.rubocop.yml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Этот файл может размещаться в вашей домашней директории и тогда эти настройки будут применяться для всех ваших проектов, а также можете разместить его в корне вашего проекта.&lt;/p&gt;

&lt;p&gt;В этом файле можно отключить любой cop или исключить отслеживаемые файлы.
К примеру мы хотим исключить файл &lt;code&gt;config/initializers/devise.rb&lt;/code&gt;,  все файлы в папке &lt;code&gt;db&lt;/code&gt; и увеличить длину строки до 120 символов. Для этого в файле &lt;code&gt;.rubocop.yml&lt;/code&gt; напишем следующее&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;AllCops&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config/initializers/devise.rb'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;db/**/*'&lt;/span&gt;
&lt;span class="s"&gt;Metrics/LineLength&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Max&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;120&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Приведу другой пример. Теперь мы хотим отключить cop который отвечает за документацию класса &lt;code&gt;Style/Documentation&lt;/code&gt;. Для этого в нашем конфиг-файле добавим следующую строку:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;Style/Documentation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;При запуске команды &lt;code&gt;rubocop -D&lt;/code&gt; мы больше не увидим нарушений этого типа. Но если ввести команду &lt;code&gt;rubocop -D --only Style/Documentation&lt;/code&gt;, то нарушения снова отобразятся.&lt;/p&gt;

&lt;p&gt;Чтобы каждый раз не вводить флаг &lt;code&gt;-D&lt;/code&gt; для отображение имени cop&amp;#39;a нам может пригодится настройка &lt;code&gt;DisplayCopNames: true&lt;/code&gt; в секции &lt;code&gt;AllCops&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;AllCops&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;DisplayCopNames&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;Exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;config/initializers/devise.rb'&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;db/**/*'&lt;/span&gt;

&lt;span class="s"&gt;Metrics/LineLength&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Max&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;120&lt;/span&gt;

&lt;span class="s"&gt;Style/Documentation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        &lt;h2 id="Git-" class="title"&gt;
          &lt;a name="Git-" class="anchor" href="#Git-"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Git Хук
        &lt;/h2&gt;
      
&lt;p&gt;Велика вероятность того, что вы можете забыть проверить ваш код перед коммитом в репозиторий. Чтобы исключить вероятность человеческого фактора воспользуемся pre-commit хуком для git.&lt;/p&gt;

&lt;p&gt;В каждом проекте, в котором был инициализирован git репозиторий есть папка &lt;code&gt;.git/hooks&lt;/code&gt;. Создайте файл &lt;code&gt;pre-commit&lt;/code&gt; и скопируйте в него содержимое из файла по ссылке &lt;a href="https://gist.github.com/artanikin/95ab0189d42d05da92f74fdee6d38abf"&gt;https://gist.github.com/artanikin/95ab0189d42d05da92f74fdee6d38abf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Для работы данного хука, ему нужно добавить право доступа на исполнение&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;chmod +x .git/hooks/pre-commit
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Данный хук отслеживает все измененные в коммите файлы и «натравливает» на них rubocop. Если были найдены какие-либо нарушения, то rubocop предложит вам их исправить перед коммитом.&lt;/p&gt;

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

&lt;p&gt;Для примера внесем изменения в файл &lt;code&gt;app/controllers/admin/posts_controller.rb&lt;/code&gt;, сохраним его и сделаем коммит.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;git add app/controllers/admin/posts_controller.rb
git commit -m ‘Test commit’
Inspecting 1 file
C

Offenses:

&lt;/span&gt;&lt;span class="gp"&gt;app/controllers/admin/posts_controller.rb:1:1: C: Style/FrozenStringLiteralComment: Missing magic comment #&lt;/span&gt; frozen_string_literal: true.
&lt;span class="go"&gt;class Admin::PostsController &amp;lt; Admin::AdminController
^
app/controllers/admin/posts_controller.rb:1:7: C: Style/ClassAndModuleChildren: Use nested module/class definitions instead of compact style.
class Admin::PostsController &amp;lt; Admin::AdminController
      ^^^^^^^^^^^^^^^^^^^^^^
app/controllers/admin/posts_controller.rb:2:34: C: Style/SymbolArray: Use %i or %I for an array of symbols.
  before_action :set_post, only: [:edit, :update, :destroy]
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
app/controllers/admin/posts_controller.rb:18:3: C: Style/EmptyMethod: Put empty method definitions on a single line.
  def edit ...
  ^^^^^^^^

1 file inspected, 4 offenses detected
Would you like to continue press 'any key' or 'n/N' to halt?
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Мы видим все нарушения, который нашел rubocop. Если мы хотим их исправить, то просто вводим &lt;code&gt;n&lt;/code&gt; и нажимаем &lt;code&gt;Enter&lt;/code&gt;.&lt;/p&gt;

        &lt;h3 id="-_1" class="title"&gt;
          &lt;a name="-_1" class="anchor" href="#-_1"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Ссылки:
        &lt;/h3&gt;
      
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ruby Style Guide:&lt;/strong&gt; &lt;a href="https://github.com/arbox/ruby-style-guide/blob/master/README-ruRU.md"&gt;https://github.com/arbox/ruby-style-guide/blob/master/README-ruRU.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rails Style Guide:&lt;/strong&gt; &lt;a href="https://github.com/arbox/rails-style-guide/blob/master/README-ruRU.md#activerecord"&gt;https://github.com/arbox/rails-style-guide/blob/master/README-ruRU.md#activerecord&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rubocop:&lt;/strong&gt; &lt;a href="https://github.com/bbatsov/rubocop"&gt;https://github.com/bbatsov/rubocop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rubocop оф. документация:&lt;/strong&gt; &lt;a href="http://rubocop.readthedocs.io/en/latest/"&gt;http://rubocop.readthedocs.io/en/latest/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git Hook:&lt;/strong&gt; &lt;a href="https://gist.github.com/artanikin/95ab0189d42d05da92f74fdee6d38abf"&gt;https://gist.github.com/artanikin/95ab0189d42d05da92f74fdee6d38abf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Эпизод #1 - Fast Ruby &amp; Fasterer</title>
    <link rel="alternate" href="https://devsimple.ru/posts/fast-ruby-and-fasterer/"/>
    <id>https://devsimple.ru/posts/fast-ruby-and-fasterer/</id>
    <published>2017-11-28T05:00:00+05:00</published>
    <updated>2018-10-02T21:45:47+05:00</updated>
    <author>
      <name>Аникин Артем</name>
    </author>
    <content type="html">&lt;p&gt;В этом эпизоде поговорим о том, как выбирать более быстрые методы для решения задач в языке Ruby.
&lt;/p&gt;

        &lt;h3 id="-" class="title"&gt;
          &lt;a name="-" class="anchor" href="#-"&gt;       &lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;
       &lt;path d="M4 9h1v1h-1c-1.5 0-3-1.69-3-3.5s1.55-3.5 3-3.5h4c1.45 0 3 1.69 3 3.5 0 1.41-0.91 2.72-2 3.25v-1.16c0.58-0.45 1-1.27 1-2.09 0-1.28-1.02-2.5-2-2.5H4c-0.98 0-2 1.22-2 2.5s1 2.5 2 2.5z m9-3h-1v1h1c1 0 2 1.22 2 2.5s-1.02 2.5-2 2.5H9c-0.98 0-2-1.22-2-2.5 0-0.83 0.42-1.64 1-2.09v-1.16c-1.09 0.53-2 1.84-2 3.25 0 1.81 1.55 3.5 3 3.5h4c1.45 0 3-1.69 3-3.5s-1.5-3.5-3-3.5z"&gt;&lt;/path&gt;
       &lt;/svg&gt;
&lt;/a&gt;
          Ссылки:
        &lt;/h3&gt;
      
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;fast-ruby:&lt;/strong&gt; &lt;a href="https://github.com/JuanitoFatas/fast-ruby"&gt;https://github.com/JuanitoFatas/fast-ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fasterer:&lt;/strong&gt; &lt;a href="https://github.com/DamirSvrtan/fasterer"&gt;https://github.com/DamirSvrtan/fasterer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Код из видео:&lt;/strong&gt; &lt;a href="https://github.com/dev-simple/lessons_code/tree/master/fast_ruby"&gt;https://github.com/dev-simple/lessons_code/tree/master/fast_ruby&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>
