<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Dmitry Kalinin</title>
    <description>The latest articles on Forem by Dmitry Kalinin (@id1).</description>
    <link>https://forem.com/id1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F513231%2Fbeea125f-51cd-4062-b1d5-4ccce38c5e40.jpg</url>
      <title>Forem: Dmitry Kalinin</title>
      <link>https://forem.com/id1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/id1"/>
    <language>en</language>
    <item>
      <title>TikTok Scraper</title>
      <dc:creator>Dmitry Kalinin</dc:creator>
      <pubDate>Fri, 18 Dec 2020 05:07:03 +0000</pubDate>
      <link>https://forem.com/id1/tiktok-scraper-25a9</link>
      <guid>https://forem.com/id1/tiktok-scraper-25a9</guid>
      <description>&lt;p&gt;This is not an official API support and etc. This is just a scraper that is using TikTok Web API to scrape media and related meta information.&lt;/p&gt;

&lt;h4&gt;
  
  
  Installation
&lt;/h4&gt;

&lt;p&gt;tiktok-scraper requires Node.js v10+ to run.&lt;/p&gt;

&lt;p&gt;Install from NPM&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; tiktok-scraper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install from YARN&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn global add tiktok-scraper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  In Terminal
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;tiktok-scraper &lt;span class="nt"&gt;--help&lt;/span&gt;
Usage: tiktok-scraper &amp;lt;&lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;options]
Commands:
  tiktok-scraper user &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;     Scrape videos from username. Enter only username
  tiktok-scraper hashtag &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;  Scrape videos from hashtag. Enter hashtag without &lt;span class="c"&gt;#&lt;/span&gt;
  tiktok-scraper trend         Scrape posts from current trends
  tiktok-scraper music &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;    Scrape posts from a music &lt;span class="nb"&gt;id &lt;/span&gt;number
  tiktok-scraper video &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;    Download single video without the watermark
  tiktok-scraper &lt;span class="nb"&gt;history       &lt;/span&gt;View previous download &lt;span class="nb"&gt;history
  &lt;/span&gt;tiktok-scraper from-file &lt;span class="o"&gt;[&lt;/span&gt;file] &lt;span class="o"&gt;[&lt;/span&gt;async]  Scrape &lt;span class="nb"&gt;users&lt;/span&gt;, hashtags, music, videos mentioned
                                &lt;span class="k"&gt;in &lt;/span&gt;a file. 1 value per 1 line
Options:
  &lt;span class="nt"&gt;--version&lt;/span&gt;               Show version number                          &lt;span class="o"&gt;[&lt;/span&gt;boolean]
  &lt;span class="nt"&gt;--timeout&lt;/span&gt;               Set &lt;span class="nb"&gt;timeout &lt;/span&gt;between requests. Timeout is &lt;span class="k"&gt;in
                          &lt;/span&gt;Milliseconds: 1000 mls &lt;span class="o"&gt;=&lt;/span&gt; 1 s              &lt;span class="o"&gt;[&lt;/span&gt;default: 0]
  &lt;span class="nt"&gt;--number&lt;/span&gt;, &lt;span class="nt"&gt;-n&lt;/span&gt;            Number of posts to scrape. If you will &lt;span class="nb"&gt;set &lt;/span&gt;0 &lt;span class="k"&gt;then &lt;/span&gt;all
                          posts will be scraped                     &lt;span class="o"&gt;[&lt;/span&gt;default: 0]
  &lt;span class="nt"&gt;--proxy&lt;/span&gt;, &lt;span class="nt"&gt;-p&lt;/span&gt;             Set single proxy                         &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--proxy-file&lt;/span&gt;            Use proxies from a file. Scraper will use random
                          proxies from the file per each request. 1 line 1
                          proxy.                                   &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--download&lt;/span&gt;, &lt;span class="nt"&gt;-d&lt;/span&gt;          Download video posts to the folder with the name input
                          &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;                        &lt;span class="o"&gt;[&lt;/span&gt;boolean] &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--asyncDownload&lt;/span&gt;, &lt;span class="nt"&gt;-a&lt;/span&gt;     Number of concurrent downloads            &lt;span class="o"&gt;[&lt;/span&gt;default: 5]
  &lt;span class="nt"&gt;--hd&lt;/span&gt;                    Download video &lt;span class="k"&gt;in &lt;/span&gt;HD. Video size will be x5-x10 &lt;span class="nb"&gt;times
                          &lt;/span&gt;larger and this will affect scraper execution speed.
                          This option only works &lt;span class="k"&gt;in &lt;/span&gt;combination with &lt;span class="nt"&gt;-w&lt;/span&gt; flag
                                                      &lt;span class="o"&gt;[&lt;/span&gt;boolean] &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--zip&lt;/span&gt;, &lt;span class="nt"&gt;-z&lt;/span&gt;               ZIP all downloaded video posts
                                                      &lt;span class="o"&gt;[&lt;/span&gt;boolean] &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--filepath&lt;/span&gt;              File path to save all output files.
      &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="s2"&gt;"/Users/blah/blah"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--filetype&lt;/span&gt;, &lt;span class="nt"&gt;--type&lt;/span&gt;, &lt;span class="nt"&gt;-t&lt;/span&gt;  Type of the output file where post information will
                          be saved. &lt;span class="s1"&gt;'all'&lt;/span&gt; - save information about all posts to
                          the&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="s1"&gt;'json'&lt;/span&gt; and &lt;span class="s1"&gt;'csv'&lt;/span&gt;
                               &lt;span class="o"&gt;[&lt;/span&gt;choices: &lt;span class="s2"&gt;"csv"&lt;/span&gt;, &lt;span class="s2"&gt;"json"&lt;/span&gt;, &lt;span class="s2"&gt;"all"&lt;/span&gt;, &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--filename&lt;/span&gt;, &lt;span class="nt"&gt;-f&lt;/span&gt;          Set custom filename &lt;span class="k"&gt;for &lt;/span&gt;the output files &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--noWaterMark&lt;/span&gt;, &lt;span class="nt"&gt;-w&lt;/span&gt;       Download video without the watermark. This option will
                          affect the execution speed  &lt;span class="o"&gt;[&lt;/span&gt;boolean] &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--store&lt;/span&gt;, &lt;span class="nt"&gt;-s&lt;/span&gt;             Scraper will save the progress &lt;span class="k"&gt;in &lt;/span&gt;the OS TMP or Custom
                          folder and &lt;span class="k"&gt;in &lt;/span&gt;the future usage will only download new
                          videos avoiding duplicates  &lt;span class="o"&gt;[&lt;/span&gt;boolean] &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--historypath&lt;/span&gt;           Set custom path where &lt;span class="nb"&gt;history &lt;/span&gt;file/files will be
                          stored
                   &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="s2"&gt;"/var/folders/d5/fyh1_f2926q7c65g7skc0qh80000gn/T"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--remove&lt;/span&gt;, &lt;span class="nt"&gt;-r&lt;/span&gt;            Delete the &lt;span class="nb"&gt;history &lt;/span&gt;record by entering &lt;span class="s2"&gt;"TYPE:INPUT"&lt;/span&gt; or
                          &lt;span class="s2"&gt;"all"&lt;/span&gt; to clean all the history. For example: user:bob
                                                                   &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--webHookUrl&lt;/span&gt;       Set webhook url to receive scraper result as HTTP requests.
                     For example to your own API                   &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--method&lt;/span&gt;           Receive data to your webhook url as POST or GET request
                                      &lt;span class="o"&gt;[&lt;/span&gt;choices: &lt;span class="s2"&gt;"GET"&lt;/span&gt;, &lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;default: &lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nt"&gt;--help&lt;/span&gt;             Show &lt;span class="nb"&gt;help&lt;/span&gt;                                         &lt;span class="o"&gt;[&lt;/span&gt;boolean]
Examples:
  tiktok-scraper user USERNAME &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 100
  tiktok-scraper user USERNAME &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 100 &lt;span class="nt"&gt;-f&lt;/span&gt; customFileName
  tiktok-scraper hashtag HASHTAG_NAME &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 100
  tiktok-scraper trend &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 100
  tiktok-scraper music MUSICID &lt;span class="nt"&gt;-n&lt;/span&gt; 100
  tiktok-scraper music MUSIC_ID &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 50
  tiktok-scraper video https://www.tiktok.com/@tiktok/video/6807491984882765062
  tiktok-scraper &lt;span class="nb"&gt;history
  &lt;/span&gt;tiktok-scraper &lt;span class="nb"&gt;history&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; user:bob
  tiktok-scraper &lt;span class="nb"&gt;history&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; all
  tiktok-scraper from-file BATCH_FILE ASYNC_TASKS &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 25
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Features
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Download unlimited post metadata from the User, Hashtag, Trends, or Music-Id pages&lt;/li&gt;
&lt;li&gt;Save post metadata to the JSON/CSV files&lt;/li&gt;
&lt;li&gt;Download media with and without the watermark and save to the ZIP file&lt;/li&gt;
&lt;li&gt;Download single video without the watermark from the CLI&lt;/li&gt;
&lt;li&gt;Sign URL to make custom request to the TikTok API&lt;/li&gt;
&lt;li&gt;Extract metadata from the User, Hashtag and Single Video pages&lt;/li&gt;
&lt;li&gt;Save previous progress and download only new videos that weren’t downloaded before. This feature only works from the * * CLI and only if download flag is on.&lt;/li&gt;
&lt;li&gt;View and manage previously downloaded posts history in the CLI&lt;/li&gt;
&lt;li&gt;Scrape and download user, hashtag, music feeds and single videos specified in the file in batch mode&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>bash</category>
    </item>
    <item>
      <title>Recovers passwords from pixelized screenshots</title>
      <dc:creator>Dmitry Kalinin</dc:creator>
      <pubDate>Wed, 09 Dec 2020 19:52:14 +0000</pubDate>
      <link>https://forem.com/id1/recovers-passwords-from-pixelized-screenshots-20o6</link>
      <guid>https://forem.com/id1/recovers-passwords-from-pixelized-screenshots-20o6</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/beurtschipper/Depix" rel="noopener noreferrer"&gt;Depix&lt;/a&gt; is a tool for recovering passwords from pixelized screenshots.&lt;/p&gt;

&lt;p&gt;This implementation works on pixelized images that were created with a linear box filter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cut out the pixelated blocks from the screenshot as a single rectangle.&lt;/li&gt;
&lt;li&gt;Paste a De Bruijn sequence with expected characters in an editor with the same font settings (text size, font, color, hsl).&lt;/li&gt;
&lt;li&gt;Make a screenshot of the sequence. If possible, use the same screenshot tool that was used to create the pixelized image.&lt;/li&gt;
&lt;li&gt;Run

&lt;code&gt;pythonpython depix.py -p [pixelated rectangle image] -s [search sequence image] -o output.png&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Algorithm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The algorithm uses the fact that the linear box filter processes every block separately. For every block it pixelizes all blocks in the search image to check for direct matches.&lt;/li&gt;
&lt;li&gt;For most pixelized images Depix manages to find single-match results. It assumes these are correct. The matches of surrounding multi-match blocks are then compared to be geometrically at the same distance as in the pixelized image. * Matches are also treated as correct. This process is repeated a couple of times.&lt;/li&gt;
&lt;li&gt;After correct blocks have no more geometrical matches, it will output all correct blocks directly. For multi-match blocks, it outputs the average of all matches.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>machinelearning</category>
      <category>github</category>
    </item>
    <item>
      <title>Captcha solver extension for humans</title>
      <dc:creator>Dmitry Kalinin</dc:creator>
      <pubDate>Mon, 16 Nov 2020 10:18:47 +0000</pubDate>
      <link>https://forem.com/id1/captcha-solver-extension-for-humans-2bm0</link>
      <guid>https://forem.com/id1/captcha-solver-extension-for-humans-2bm0</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjkbsjh9zbm8q363ryqjs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjkbsjh9zbm8q363ryqjs.png" alt="Alt Text" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dessant/buster" rel="noopener noreferrer"&gt;Buster&lt;/a&gt; is a browser extension which helps you to solve difficult captchas by completing reCAPTCHA audio challenges using speech recognition. Challenges are solved by clicking on the extension button at the bottom of the reCAPTCHA widget.&lt;/p&gt;

&lt;p&gt;reCAPTCHA challenges remain a considerable burden on the web, delaying and often blocking our access to services and information depending on our physical and cognitive abilities, our social and cultural background, and the devices or networks we connect from.&lt;/p&gt;

&lt;p&gt;The difficulty of captchas can be so out of balance, that sometimes they seem friendlier to bots than they are to humans.&lt;/p&gt;

&lt;p&gt;The goal of this project is to improve our experience with captchas, by giving us easy access to solutions already utilized by automated systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chrome.google.com/webstore/detail/buster-captcha-solver-for/mpbjkejclgfgadiemmefgebjfooflfhl" rel="noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/buster-captcha-solver/" rel="noopener noreferrer"&gt;Mozilla Addons&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://microsoftedge.microsoft.com/addons/detail/buster-captcha-solver-fo/admkpobhocmdideidcndkfaeffadipkc" rel="noopener noreferrer"&gt;Edge Add-ons&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://addons.opera.com/en/extensions/details/buster-captcha-solver-for-humans/" rel="noopener noreferrer"&gt;Opera Addons&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>Linting for your git commit messages</title>
      <dc:creator>Dmitry Kalinin</dc:creator>
      <pubDate>Sat, 14 Nov 2020 20:08:58 +0000</pubDate>
      <link>https://forem.com/id1/linting-for-your-git-commit-messages-2pid</link>
      <guid>https://forem.com/id1/linting-for-your-git-commit-messages-2pid</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8vqyxln3t4x46gsmtxs3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8vqyxln3t4x46gsmtxs3.png" alt="Alt Text" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jorisroovers.com/gitlint/" rel="noopener noreferrer"&gt;Gitlint&lt;/a&gt; is a git commit message linter written in python: it checks your commit messages for style.&lt;/p&gt;

&lt;h1&gt;
  
  
  Features
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Commit message hook&lt;/li&gt;
&lt;li&gt;Easily integrated&lt;/li&gt;
&lt;li&gt;Sane defaults&lt;/li&gt;
&lt;li&gt;Easily configurable&lt;/li&gt;
&lt;li&gt;Community contributed rules&lt;/li&gt;
&lt;li&gt;User-defined rules&lt;/li&gt;
&lt;li&gt;Full unicode support&lt;/li&gt;
&lt;li&gt;Production-ready&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Installation
&lt;/h1&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#### Pip is recommended to install the latest version&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;gitlint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;gitlint
&lt;span class="nb"&gt;sudo &lt;/span&gt;port &lt;span class="nb"&gt;install &lt;/span&gt;gitlint  &lt;span class="c"&gt;# alternative&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;gitlint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--ulimit&lt;/span&gt; &lt;span class="nv"&gt;nofile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1024 &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/repo jorisroovers/gitlint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check the last commit message&lt;/span&gt;
gitlint
&lt;span class="c"&gt;# Alternatively, pipe a commit message to gitlint:&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;examples/commit-message-1 | gitlint
&lt;span class="c"&gt;# or&lt;/span&gt;
git log &lt;span class="nt"&gt;-1&lt;/span&gt; &lt;span class="nt"&gt;--pretty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;%B | gitlint
&lt;span class="c"&gt;# Or read the commit-msg from a file, like so:&lt;/span&gt;
gitlint &lt;span class="nt"&gt;--msg-filename&lt;/span&gt; examples/commit-message-2
&lt;span class="c"&gt;# Lint all commits in your repo&lt;/span&gt;
gitlint &lt;span class="nt"&gt;--commits&lt;/span&gt; HEAD

&lt;span class="c"&gt;# To install a gitlint as a commit-msg git hook:&lt;/span&gt;
gitlint install-hook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>github</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
