<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kyle Harrison</title>
    <description>The latest articles on DEV Community by Kyle Harrison (@apoclyps).</description>
    <link>https://dev.to/apoclyps</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%2F97856%2F5d5150a2-453b-4f88-9f06-24ebcb519842.jpeg</url>
      <title>DEV Community: Kyle Harrison</title>
      <link>https://dev.to/apoclyps</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/apoclyps"/>
    <language>en</language>
    <item>
      <title>Empowering Education Through Technology: Vyta Sponsors 10 Laptops for CoderDojo Craigavon</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Wed, 06 Sep 2023 19:26:31 +0000</pubDate>
      <link>https://dev.to/coderdojocraigavon/empowering-education-through-technology-vyta-sponsors-10-laptops-for-coderdojo-craigavon-2a39</link>
      <guid>https://dev.to/coderdojocraigavon/empowering-education-through-technology-vyta-sponsors-10-laptops-for-coderdojo-craigavon-2a39</guid>
      <description>&lt;p&gt;In a world driven by technology, access to digital resources is a gateway to boundless opportunities. Recognising the importance of fostering digital literacy and education in our community, CoderDojo Craigavon is excited to announce it has received sponsorship of 10 laptops from IT Asset Disposition company, Vyta, to support CoderDojo Craigavon — a vibrant initiative that empowers young minds to learn coding and computational thinking.&lt;/p&gt;

&lt;p&gt;From their headquarters in Mallusk, &lt;a href="https://vyta.com/"&gt;Vyta&lt;/a&gt; offers a fully comprehensive IT lifecycle solution across the UK &amp;amp; Ireland, covering a wide array of needs including the collection of redundant IT equipment, secure data wiping, WEEE recycling and refurbishing of IT equipment for reuse. Their approach isn't just about maximising value return; it's about minimising the carbon footprint associated with keeping hardware in the circular economy for as long as possible and ensuring that data security and compliance requirements are met with meticulous attention to detail.&lt;/p&gt;

&lt;p&gt;Vyta shares CoderDojo Craigavon’s vision of harnessing technology for good by creating a nurturing space where young enthusiasts can explore the world of coding and computer science. By providing young people with the tools they need to excel in an increasingly digital world, CoderDojo Craigavon is paving the way for future innovators, programmers, and problem solvers.&lt;/p&gt;

&lt;p&gt;“Through our sponsorship of 10 laptops, we hope to help CoderDojo Craigavon expand its reach and impact, benefiting more young minds”, stated Rachael Weir of Vyta.&lt;br&gt;
_&lt;br&gt;
These laptops will serve as invaluable resources for young learners, enabling them to access online tutorials, coding platforms, and educational resources. Each laptop represents a stepping stone towards unlocking creativity, inspiring a generation of tech-savvy individuals who are equipped for their futures.&lt;/p&gt;

&lt;p&gt;At CoderDojo Craigavon, we invite you to join us in supporting initiatives that harness the power of technology for education. Together, we can build a brighter, more inclusive future where every young mind has the chance to explore, learn, and create with confidence.&lt;/p&gt;

</description>
      <category>coderdojo</category>
      <category>stem</category>
    </item>
    <item>
      <title>Sharing Github Labels across Repositories</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Fri, 03 Feb 2023 10:42:15 +0000</pubDate>
      <link>https://dev.to/apoclyps/sharing-github-labels-across-repositories-2a0f</link>
      <guid>https://dev.to/apoclyps/sharing-github-labels-across-repositories-2a0f</guid>
      <description>&lt;p&gt;&lt;code&gt;Labels&lt;/code&gt; (&lt;a href="https://github.com/hackebrot/labels" rel="noopener noreferrer"&gt;https://github.com/hackebrot/labels&lt;/a&gt;) is a CLI app for managing GitHub labels. It allows labels to be fetched and stored in a toml file (which can then be updated to include the required labels on another repository). Once fetched, the labels can then be synced to another repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;labels

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LABELS_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"apoclyps"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LABELS_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$GITHUB_TOKEN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you are ready to fetch labels from your chosen repository&lt;/p&gt;

&lt;h2&gt;
  
  
  Copying labels
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;labels fetch &lt;span class="nt"&gt;-o&lt;/span&gt; apoclyps &lt;span class="nt"&gt;-r&lt;/span&gt; reviews
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create an output file in your current working directory called &lt;code&gt;labels.toml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[bug]&lt;/span&gt;
&lt;span class="py"&gt;color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"d73a4a"&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"bug"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Something isn't working"&lt;/span&gt;

&lt;span class="nn"&gt;[config]&lt;/span&gt;
&lt;span class="py"&gt;color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"93447B"&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"config"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;

&lt;span class="nn"&gt;["contains: migrations"]&lt;/span&gt;
&lt;span class="py"&gt;color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"EDFA48"&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"contains: migrations"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;

&lt;span class="nn"&gt;[dependencies]&lt;/span&gt;
&lt;span class="py"&gt;color&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"030750"&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"dependencies"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Syncing labels
&lt;/h2&gt;

&lt;p&gt;To do a dry run using the &lt;code&gt;-n&lt;/code&gt; flag to see what changes would be applied&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;labels sync -n -o apoclyps -r deps 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;This would delete the following labels:
  - yaml
This would update the following labels:
  - contains: migrations
  - dependencies
This would create the following labels:
  - config
This would NOT modify the following labels:
  - bug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are happy with the changes, rerun the same command without &lt;code&gt;-n&lt;/code&gt; to apply the labels to the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;labels &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; apoclyps &lt;span class="nt"&gt;-r&lt;/span&gt; deps 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>cryptocurrency</category>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
    <item>
      <title>Chickity-check yo self before you wreck yo self!</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Tue, 06 Jul 2021 08:08:35 +0000</pubDate>
      <link>https://dev.to/apoclyps/chickity-check-yo-self-before-you-wreck-yo-self-44ib</link>
      <guid>https://dev.to/apoclyps/chickity-check-yo-self-before-you-wreck-yo-self-44ib</guid>
      <description>&lt;p&gt;Have you ever found yourself in a situation where you pushed a commit to a branch for review, only to discover you made a spelling mistake, used outdated syntax, or forgot to lint your code again after making that one last change?&lt;/p&gt;

&lt;p&gt;I've wasted countless hours in the past doing exactly this! It is slow and time-consuming to identify an issue after the fact and it also slows down other folks in your team performing the code review. There must be a better way!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pre-commit.com/"&gt;Pre-commit&lt;/a&gt; solves this problem by providing pre-commit hooks that run after every commit which solves all of these common, repeatable problems that machines are good at solving. &lt;/p&gt;

&lt;p&gt;However finding an awesome new tool to enhance your workflow is only half the challenge, convincing one or more teams to adopt it another.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using a tool - without imposing it upon a team
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;pre-commit&lt;/code&gt; requires a &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt; to be placed in a repository however to avoid updating the &lt;code&gt;.gitignore&lt;/code&gt; file for every new repository you wish to interactive with, the best solution i found was to add the following to a global &lt;code&gt;.gitignore&lt;/code&gt;.&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="o"&gt;&amp;gt;&lt;/span&gt; vim ~/.gitignore

.pre-commit-config.yaml
.codespellrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows for the file to be ignored from all repositories I interact with, without the risk of potentially committing it or needing to update the repository to use it. This is especially useful when I need to add confirmation files for some of the additional pre-commit hooks that I'm using such as &lt;code&gt;codespell&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Finally within your repository you can create and use use pre-commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;# .pre-commit-config.yaml&lt;/span&gt;
&lt;span class="c1"&gt;# ========================&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# pre-commit clean&lt;/span&gt;
&lt;span class="c1"&gt;# pre-commit install&lt;/span&gt;
&lt;span class="c1"&gt;# pre-commit install-hooks&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# precommit hooks installation&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# - pre-commit autoupdate&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# - pre-commit run black&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# continuous integration&lt;/span&gt;
&lt;span class="c1"&gt;# ======================&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# - pre-commit run --all-files&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;

&lt;span class="na"&gt;repos&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/pre-commit/pre-commit-hooks&lt;/span&gt;
    &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v4.0.1&lt;/span&gt;
    &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;trailing-whitespace&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;end-of-file-fixer&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;debug-statements&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check-merge-conflict&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sort-simple-yaml&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fix-encoding-pragma&lt;/span&gt;
        &lt;span class="na"&gt;args&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;--remove"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;forbid-new-submodules&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mixed-line-ending&lt;/span&gt;
        &lt;span class="na"&gt;args&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;--fix=lf"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Forces to replace line ending by the UNIX 'lf' character.&lt;/span&gt;      
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check-added-large-files&lt;/span&gt;
        &lt;span class="na"&gt;args&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;--maxkb=500"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no-commit-to-branch&lt;/span&gt;
        &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;--branch&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;master&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check-yaml&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check-json&lt;/span&gt;
        &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^tests/app/&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pretty-format-json&lt;/span&gt;
        &lt;span class="na"&gt;args&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;--no-sort-keys"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--autofix"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;files&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^tests/app/&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;meta&lt;/span&gt;
    &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check-hooks-apply&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;check-useless-excludes&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/ambv/black&lt;/span&gt;
    &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;21.5b1&lt;/span&gt;
    &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;black&lt;/span&gt;
        &lt;span class="na"&gt;language_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python3.9&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/PyCQA/bandit&lt;/span&gt;
    &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.7.0&lt;/span&gt;
    &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bandit&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Security oriented static analyser for python code&lt;/span&gt;
      &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tests/|scripts/&lt;/span&gt;
      &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;-s&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;B101&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt;   &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/codespell-project/codespell&lt;/span&gt;
      &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v2.1.0&lt;/span&gt;
      &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt;   &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;codespell&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;codespell&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checks for common misspellings in text files.&lt;/span&gt;
          &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;codespell&lt;/span&gt;
          &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python&lt;/span&gt;
          &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;text&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt;   &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/asottile/pyupgrade&lt;/span&gt;
      &lt;span class="na"&gt;rev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v2.19.4&lt;/span&gt;
      &lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt;   &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pyupgrade&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you also want to use &lt;code&gt;codespell&lt;/code&gt;, you will need to add a &lt;code&gt;.codespellrc&lt;/code&gt; file to the root of your repository:&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="o"&gt;[&lt;/span&gt;codespell]
quiet-level &lt;span class="o"&gt;=&lt;/span&gt; 3
count &lt;span class="o"&gt;=&lt;/span&gt;
check-hidden &lt;span class="o"&gt;=&lt;/span&gt;
check-filenames &lt;span class="o"&gt;=&lt;/span&gt;
enable-colors &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nb"&gt;builtin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; clear,rare,informal,code,names
ignore-words-list &lt;span class="o"&gt;=&lt;/span&gt; pullrequest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that pre-commit is configured, you can install and run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pre-commit &lt;span class="nb"&gt;install

&lt;/span&gt;pre-commit run &lt;span class="nt"&gt;--all&lt;/span&gt;

Trim Trailing Whitespace.................................................Passed
Fix End of Files.........................................................Passed
Debug Statements &lt;span class="o"&gt;(&lt;/span&gt;Python&lt;span class="o"&gt;)&lt;/span&gt;................................................Passed
Check &lt;span class="k"&gt;for &lt;/span&gt;merge conflicts................................................Passed
Sort simple YAML files...............................&lt;span class="o"&gt;(&lt;/span&gt;no files to check&lt;span class="o"&gt;)&lt;/span&gt;Skipped
Fix python encoding pragma...............................................Passed
Forbid new submodules....................................................Passed
Mixed line ending........................................................Passed
Check &lt;span class="k"&gt;for &lt;/span&gt;added large files..............................................Passed
Don&lt;span class="s1"&gt;'t commit to branch...................................................Passed
Check Yaml...............................................................Passed
Check JSON...........................................(no files to check)Skipped
Pretty format JSON...................................(no files to check)Skipped
Check hooks apply to the repository..................(no files to check)Skipped
Check for useless excludes...........................(no files to check)Skipped
black....................................................................Passed
bandit...................................................................Passed
codespell................................................................Passed
pyupgrade................................................................Passed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lastly, if pre-commit is ever blocking your workflow and for any reason you don't want to run it, you can append a &lt;code&gt;--no-verify&lt;/code&gt; flag onto your commit to skip it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"do the thing"&lt;/span&gt; &lt;span class="nt"&gt;--no-verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now all your future commits are protected from common gotcha's and save time in code review. &lt;/p&gt;

</description>
      <category>linting</category>
      <category>python</category>
      <category>git</category>
      <category>codereview</category>
    </item>
    <item>
      <title>Release your Software already!</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Thu, 03 Jun 2021 20:59:33 +0000</pubDate>
      <link>https://dev.to/apoclyps/release-your-software-already-157o</link>
      <guid>https://dev.to/apoclyps/release-your-software-already-157o</guid>
      <description>&lt;p&gt;Are you struggling to keep on top of multiple pull requests across multiple Github repositories from multiple teams? This was my experience when I joined a new company and a normal workday involved reviewing several pull requests across one or more repositories that my team and I were responsible for reviewing and maintaining. Code review is a great blocker to releasing software when the code review session has gone stale and requires frequent check-ins. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3oKIPvgM0vzCenlcs0/source.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3oKIPvgM0vzCenlcs0/source.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As my team and other teams grew, so did the number of features, repositories, and code reviews; it became apparent that software was taking a longer time to ship, and on a rare occasion pull requests were opened for several days without review due to the difficulty of keeping on top of everything. It wasn't uncommon either for a few Dependabot pull requests to be forgotten about for several months because they just weren't visible through all the noise.&lt;/p&gt;

&lt;p&gt;I found using a combination of GitHub dashboards, slack channels and 3rd party programs (like Trailer) for notifications was a great start; yet I still found myself routinely falling back to manually checking open pull requests several times during the day. Identifying changes was laborious and frequently there was no update since my last check. It was clear this was never going to scale, as more pull requests equals more simultaneous reviews. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/1jXGsHY2EKdL27mEMd/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/1jXGsHY2EKdL27mEMd/giphy.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Releasing software is comparatively much easier to measure than tracking the "real" time spent on code review. Stale reviews cause burnt cycles and delays releasing software because of inactivity; coordinating reviews in a timely and efficient way ensures features, enhancements, and fixes get shipped without delay and that all begins with improving visibility.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/QBAzA0CaPCKwGg3pDs/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/QBAzA0CaPCKwGg3pDs/giphy.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's build an MVP
&lt;/h3&gt;

&lt;p&gt;Reviews to the rescue!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reviews is a terminal UI dashboard to monitor requests for code review across Github repositories. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It began life as a simple script to list all open pull requests for a single repository, then several, and quickly evolved to do more as time went by.&lt;/p&gt;

&lt;p&gt;The goal was to create a CLI dashboard that would poll Github for updates. Using configuration provided by a user, &lt;code&gt;reviews&lt;/code&gt; would “watch” and render updates such as approval status, ability to merge, time the pull request has been opened, and more. This was the original idea for reviews; It has grown a little since then.&lt;/p&gt;

&lt;p&gt;The technology behind Reviews was simple and minimal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;click for cli&lt;/li&gt;
&lt;li&gt;rich for layout&lt;/li&gt;
&lt;li&gt;pygithub for using the Github API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick mock up of the UI looked like this for the MVP:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uXEvc2rA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qy32gpj253k2n4w7h93k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uXEvc2rA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qy32gpj253k2n4w7h93k.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;followed by an initial spike using the libraries listed above, the first incarnation of Reviews was born and it looked a bit naff!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iP-35Qsa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9slrc4oqvhk3kpwrp91m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iP-35Qsa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9slrc4oqvhk3kpwrp91m.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The first release
&lt;/h3&gt;

&lt;p&gt;At an internal hackathon a work, I pitched the project and managed to convince at least 1 other person to join me on the project. &lt;/p&gt;

&lt;p&gt;Over 2 days we worked on making improvements and trying to produce something usable as a &lt;code&gt;0.1.0&lt;/code&gt; version of Reviews. Back then it was called &lt;code&gt;Dexi&lt;/code&gt; (after an energetic 3 year old said it sounded like a pokedex). It mostly worked, but it was slow, prone to errors, and had huge sections in the TUI that did nothing yet. I didn't see anyone else using it except for me for the foreseeable future.&lt;/p&gt;

&lt;p&gt;The strangest thing happened next ; after a quick demo, people seemed to like the concept and a few folks asked how to install and use it. &lt;/p&gt;

&lt;p&gt;Embarrassed by the hacked together code; I held off on open-sourcing it for a bit, but the next iteration was better. &lt;code&gt;code-review-manager&lt;/code&gt; was created at version &lt;code&gt;0.1.1&lt;/code&gt;. It fixed several bugs, errors, code quality issues, and empty sections of UI. It was not perfect, I was still slightly embarrassed to share it at this early stage, but I figured 1-2 people viewing the code couldn't hurt. &lt;/p&gt;

&lt;h3&gt;
  
  
  Project Growth
&lt;/h3&gt;

&lt;p&gt;As the star count began to increase on the repository from friends and co-workers, I made a post on Reddit to find contributors who might be interested in helping with the project. It gained a lot of attention and invaluable feedback was provided via feature requests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ImzDxPh2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/htvqjfsyl83sskba4kqd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ImzDxPh2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/htvqjfsyl83sskba4kqd.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Afterwards, &lt;code&gt;reviews&lt;/code&gt; got an honourable mention in &lt;a href="https://pycoders.com/issues/472"&gt;PyCoder's Weekly Issue 472&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SO48KPuf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ge3oib8xrkcf3uq009v9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SO48KPuf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ge3oib8xrkcf3uq009v9.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above attention helped push &lt;code&gt;reviews&lt;/code&gt; forward from &lt;code&gt;0.1.1&lt;/code&gt; by 11 releases to the current &lt;code&gt;0.2.0&lt;/code&gt; release and even managed to spawn a simple website: &lt;a href="https://reviews-cli.dev/"&gt;https://reviews-cli.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QRkwiW8K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kr9xg6pfua4vpady57rq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QRkwiW8K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kr9xg6pfua4vpady57rq.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;If I waited until I was 100% happy with &lt;code&gt;reviews&lt;/code&gt;, it still wouldn't be released today but I have been using Reviews daily as an enhancement to my original workflow and others have started using it too. I get to spend less time checking for stale reviews, and more time on active code review which has been a huge win. &lt;/p&gt;

</description>
      <category>codereview</category>
      <category>github</category>
      <category>python</category>
      <category>tui</category>
    </item>
    <item>
      <title>Reviews released 0.1.5 on PyPi</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Sat, 08 May 2021 14:54:35 +0000</pubDate>
      <link>https://dev.to/apoclyps/reviews-released-0-1-5-on-pypi-569o</link>
      <guid>https://dev.to/apoclyps/reviews-released-0-1-5-on-pypi-569o</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZBFkrnoc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rjq8599b28mvzt1qnxo6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZBFkrnoc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rjq8599b28mvzt1qnxo6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Reviews&lt;/code&gt; is a terminal UI Dashboard for monitoring requests for code review across several Github repositories and pull requests.&lt;/p&gt;

&lt;p&gt;It's been a personal project I've been incrementally adding to over the past few weeks and it's been paying off 10x. In a normal workweek, it can be time-consuming to keep on top of several teams, across several repositories, and track who needs a code review, and which code reviews are complete and ready to ship. &lt;/p&gt;

&lt;p&gt;In the latest release, it's even easier to see which pull requests you have approved, and which have been approved by others.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aDgZXlbw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n12bx0pkqq4zv3do6f9r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aDgZXlbw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n12bx0pkqq4zv3do6f9r.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are interested in using the TUI, want to check it out, or even contribute the source code is freely available on Github (&lt;a href="https://github.com/apoclyps/reviews"&gt;https://github.com/apoclyps/reviews&lt;/a&gt;) and it can be installed directly from PyPI.&lt;/p&gt;

&lt;p&gt;Want to get started right away? Check out the following snippet:&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="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GITHUB_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-github-username"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your personal github token used for interacting with the API"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REPOSITORY_CONFIGURATION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"apoclyps/reviews"&lt;/span&gt;

pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; reviews

reviews dashboard &lt;span class="nt"&gt;--no-reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Release discussion and changelog on Github: &lt;a href="https://github.com/apoclyps/reviews/discussions/91"&gt;https://github.com/apoclyps/reviews/discussions/91&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>codereview</category>
      <category>tui</category>
      <category>dashboard</category>
    </item>
    <item>
      <title>A simple terminal UI dashboard for code review</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Fri, 16 Apr 2021 16:19:04 +0000</pubDate>
      <link>https://dev.to/apoclyps/a-simple-terminal-ui-dashboard-for-code-review-2g76</link>
      <guid>https://dev.to/apoclyps/a-simple-terminal-ui-dashboard-for-code-review-2g76</guid>
      <description>&lt;p&gt;Reviews is a simple code review manager that lists the status of open pull requests across multiple organizations &amp;amp; repositories as a terminal UI dashboard.&lt;/p&gt;

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

&lt;p&gt;The project was created as a way to keep on top of multiple teams creating large amounts of pull requests across several repositories by having a single up-to-date view of the pull request's approval status and age.&lt;/p&gt;

&lt;p&gt;The initial implementation can be found over on Github at &lt;a href="https://github.com/apoclyps/code-review-manager" rel="noopener noreferrer"&gt;https://github.com/apoclyps/code-review-manager&lt;/a&gt; and can be installed from PyPI: &lt;a href="https://pypi.org/project/reviews/" rel="noopener noreferrer"&gt;https://pypi.org/project/reviews/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contributions and feedback are welcome. It's in the very early stages of development and it has a long way to go but hopefully, there is enough here for others to derive some value from it being released early.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting started with reviews
&lt;/h3&gt;

&lt;p&gt;You can immediately start using review by installing it from PyPI and using providing the following configuration before running it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;reviews

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REPOSITORY_CONFIGURATION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"apoclyps/code-review-manager,apoclyps/my-dev-space"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-token"&lt;/span&gt;

reviews dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>python</category>
      <category>terminal</category>
      <category>github</category>
      <category>codereview</category>
    </item>
    <item>
      <title>Track your Bandwidth &amp; Storage limits with our Quota API</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Tue, 08 Dec 2020 14:14:26 +0000</pubDate>
      <link>https://dev.to/cloudsmith/track-your-bandwidth-storage-limits-with-our-quota-api-1011</link>
      <guid>https://dev.to/cloudsmith/track-your-bandwidth-storage-limits-with-our-quota-api-1011</guid>
      <description>&lt;p&gt;At Cloudsmith, helping fledgeling startups grow from a single person operation to enterprise-level organisations is a constant joy! In those early stages, startups need all the help they can get to survive, and even veteran organisations experience similar challenges when scaling up rapidly.&lt;/p&gt;

&lt;p&gt;Cloudsmith can help with our self-service approach to managing and defining storage and bandwidth limits to keep costs under control while allowing you to scale when needed. After all, no one wants to be caught between an unexpected bill for overages or any interruption to their business, no matter how minor.&lt;/p&gt;

&lt;p&gt;The fantastic news is that now you have a new tool in your arsenal, as you can track your bandwidth and storage programmatically via the Quota API. It's easy to miss an email when your busy or a prompt within the Cloudsmith UI (if you haven't needed to log in recently); but you will always want to know if you're near/over a limit or even if you're over-provisioned.&lt;/p&gt;

&lt;p&gt;Now you can automate a solution that works for you using either our API or CLI to always stay on top of your storage and bandwidth limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started quickly
&lt;/h2&gt;

&lt;p&gt;Using the Cloudsmith CLI, you can quickly and easily view the usage, limits, and maximum allocation of bandwidth and storage for your plan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudsmith quota limits ORG-NAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Alternatively, if you want to view the entire history for your organisation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudsmith quota &lt;span class="nb"&gt;history &lt;/span&gt;ORG-NAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Finally, to view the OSS usage for an organisation, you can add the &lt;code&gt;-oss&lt;/code&gt; flag to any command to view only OSS limits and history.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudsmith quota limits ORG-NAME &lt;span class="nt"&gt;-oss&lt;/span&gt;
cloudsmith quota &lt;span class="nb"&gt;history &lt;/span&gt;ORG-NAME &lt;span class="nt"&gt;-oss&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you identify a limit that is over-provisioned or quickly approaching a threshold, then you can quickly and easily &lt;a href="https://help.cloudsmith.io/docs/organisations?#usage-limits" rel="noopener noreferrer"&gt;adjust your limits&lt;/a&gt; at any time within the Cloudsmith UI.&lt;/p&gt;

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

&lt;p&gt;Additionally, if you wish to automate a solution, you can also check out the Quota API or the Cloudsmith API Bindings (available in multiple languages) and connect it to your favourite CI/CD or monitoring service to alert internally within your organisation.&lt;/p&gt;

</description>
      <category>cloudsmith</category>
      <category>quotas</category>
    </item>
    <item>
      <title>Restore authority with Token Bandwidth Controls!</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Tue, 06 Oct 2020 16:33:15 +0000</pubDate>
      <link>https://dev.to/cloudsmith/restore-authority-with-token-bandwidth-controls-29ld</link>
      <guid>https://dev.to/cloudsmith/restore-authority-with-token-bandwidth-controls-29ld</guid>
      <description>&lt;p&gt;Now you can go beyond &lt;a href="https://cloudsmith.com/blog/vendors-rejoice-analyse-your-bandwidth-usage/" rel="noopener noreferrer"&gt;measuring your bandwidth usage&lt;/a&gt; and regain control via Cloudsmith's new bandwidth controls for Entitlement tokens. You can craft tokens with individual usage limits using the UI, API, and CLI, allowing you to decide the exact level of usage for each token.&lt;/p&gt;

&lt;p&gt;Combining the new and existing limits for entitlement tokens, allowances are configurable to provide fine-grained control for any combination of properties. For example, the total amount of bandwidth, number of unique clients using a token, or the maximum number of downloads a token can perform on an individual token basis. Also, you can also scope your tokens by restrictions for advanced control of tokens.&lt;/p&gt;

&lt;p&gt;If you are a vendor, you may want to have tiered levels of tokens for different users. Providing higher or even potentially unlimited allowances to your premium users is now possible, whilst maintaining control of your offering to free users with suitable limits. The best part is you can provide a lifetime limit for a token, or you can configure a refresh period to refresh the limits after the period has elapsed. For example, a token with a 1 GB daily limit, will allow up to 1 GB of daily usage and no more. After 1 day has passed, the token will be reset allowing another 1 GB of daily usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Within the Cloudsmith UI for Entitlement tokens, you can edit individual tokens to provide visibility restrictions, usage limits, or even provide additional metadata on the token for your own internal requirements.&lt;/p&gt;

&lt;p&gt;To provide a bandwidth restriction with a refresh period. You will need to select a unit of Bandwidth e.g., GB, and enter a corresponding unit of bandwidth you would like to restrict by (e.g., 1GB of bandwidth). A "Monthly" refresh may be more than enough for most users but may prevent misuse of tokens by users accidentally using many TB's of data per month.&lt;/p&gt;

&lt;p&gt;In this example, fine-grained bandwidth controls will be configured for the amount of bandwidth usage that token is allowed to consume every month. This is accomplished by selecting a few preset values and entering a bandwidth amount within the Edit Entitlement Token form.&lt;/p&gt;

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

&lt;p&gt;To configure a 1GB bandwidth limit that resets monthly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Select "Monthly" for "Refresh Token"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(Presets provide values from "Never Reset" to a range between "Daily" to "Annual")&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Enter a number to Restrict by Bandwidth.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The number should be between 0 - 1000; you can go higher than 1000; however, the unit of bandwidth provides sensible defaults to keep values readable. (e.g. 1000000 bytes can instead be expressed as 1 Megabyte).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Select a Unit of Bandwidth.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Values range from a single Byte to an insanely large number of Petabytes.&lt;/p&gt;

&lt;p&gt;Finally, select Edit to save your changes to the token. These restrictions will take effect almost immediately.&lt;/p&gt;

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

&lt;p&gt;If you wish to set your limits programmatically, entitlement restrictions are configurable using the &lt;a href="https://help.cloudsmith.io/reference?#entitlements-1" rel="noopener noreferrer"&gt;Entitlements API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, the easiest way to get started with making programmatic changes to entitlement tokens and applying restrictions is via the &lt;a href="https://help.cloudsmith.io/docs/cli" rel="noopener noreferrer"&gt;Cloudsmith CLI&lt;/a&gt;. Using the following command, you can set all visibility restrictions and usage limits for an entitlement token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudsmith entitlements restrict OWNER/REPOSITORY/TOKEN_IDENTIFIER  &lt;span class="nt"&gt;--RESTRICTION&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudsmith entitlements restrict demo/example-repo/GYwg00eEElKs &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--limit-bandwidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--limit-bandwidth-unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gigabyte &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--limit-num-clients&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--limit-num-downloads&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--limit-package-query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"package-darwin-amd64"&lt;/span&gt;  &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--limit-path-query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tag:latest &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--limit-date-range-from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2020-01-01T00:00:00Z &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--limit-date-range-to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2077-01-01T00:00:00Z &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;--refresh-token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;daily
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's that simple to get started! &lt;/p&gt;

</description>
      <category>cloudsmith</category>
    </item>
    <item>
      <title>Vendors Rejoice! Analyse your Bandwidth Usage</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Tue, 29 Sep 2020 15:13:29 +0000</pubDate>
      <link>https://dev.to/cloudsmith/vendors-rejoice-analyse-your-bandwidth-usage-4i52</link>
      <guid>https://dev.to/cloudsmith/vendors-rejoice-analyse-your-bandwidth-usage-4i52</guid>
      <description>&lt;p&gt;As a vendor, understanding your bandwidth usage is an invaluable insight into how packages are distributed across your user base and how specific users have grown over a timeframe.&lt;/p&gt;

&lt;p&gt;As a user base grows from 10s, 100s, and 1000s of users and package downloads are many multiples of your total number of users, it's essential to understand the distribution of your bandwidth utilisation by a user (or more precisely, entitlement token's) to aid in the identification of token's that make up a large percentage of your overall traffic.&lt;/p&gt;

&lt;p&gt;When providing an entitlement token to a user under a specific license, you trust an entitlement token will be used to download packages upon the agreed-upon terms. However, an increase in your total bandwidth may start off slow and continuously grow over several months until it's suddenly become a massive increase in your overall bandwidth. Understanding this usage and precisely where this growth originates helps identify where/where change occurs and provides options to mitigate runaway bandwidth from specific entitlement tokens by changing how those specific users are managed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;Whenever a user downloads a package via an entitlement token, the exact number of bytes transmitted from our servers to the user host is stored for that specific token as an individual log entry. At the end of each day, we calculate the total bandwidth for every user across all of our repositories containing one or more packages and store the result as a daily aggregated value representing bandwidth usage.&lt;/p&gt;

&lt;p&gt;The easiest way to get started exploring these metrics is to check out the metrics command within the Cloudsmith CLI. Alternatively, to get more fine-grained metrics, you can implement a programmatic solution using our API or one of the API binding libraries published in various languages.&lt;/p&gt;

&lt;p&gt;Getting started quickly! Using the Cloudsmith CLI you can quickly and easily query the total bandwidth usage for your repository by running the following command with your organisation/repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudsmith metrics tokens OWNER/REPOSITORY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudsmith metrics tokens demo/examples-repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following screenshot shows an example repository containing a number of active and inactive entitlement tokens alongside the total bandwidth used. The statistics table provides a simple insight into min/max/average token usage.&lt;/p&gt;

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

&lt;p&gt;You can also retrieve usage metrics for one or more specific tokens by providing a comma-separated list of Entitlement token identifiers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudsmith metrics tokens cloudsmith/example &lt;span class="nt"&gt;--tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ZGCV58VqT8Sl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmnbkf8zn0gg4uvrb9hql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmnbkf8zn0gg4uvrb9hql.png" alt="metrics for specific token" width="585" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you wish to drill down further into a specific period of usage for a token, you can supply time and date for the start and finish parameters to filter for usage within that period. In this example, a single token is displayed for all of 2019:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudsmith metrics tokens cloudsmith/example &lt;span class="nt"&gt;--tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ZGCV58VqT8Sl &lt;span class="nt"&gt;--start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2019-01-01T00:00:00Z &lt;span class="nt"&gt;--finish&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2019-12-31T00:00:00Z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6wcjp1f8ggzqh1d4tmif.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6wcjp1f8ggzqh1d4tmif.png" alt="metrics for specific time period" width="566" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's that simple to get started! &lt;/p&gt;

&lt;p&gt;You can find more information about Entitlement Tokens in our &lt;a href="https://help.cloudsmith.io/docs/entitlements" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cloudsmith</category>
    </item>
    <item>
      <title>Automating your remote working setup!</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Thu, 03 Sep 2020 21:36:51 +0000</pubDate>
      <link>https://dev.to/apoclyps/automating-your-remote-working-setup-3ldf</link>
      <guid>https://dev.to/apoclyps/automating-your-remote-working-setup-3ldf</guid>
      <description>&lt;p&gt;Upon reflecting over the past 6 months of daily remote life, I've learned some very important lessons. The abrupt switch to remote working has been an interesting transition and I was completely unprepared for it. These are my insights from my experience thus far and how I employed a little automation to help.&lt;/p&gt;

&lt;h3&gt;
  
  
  Routine
&lt;/h3&gt;

&lt;p&gt;With no daily commute, the ritual of performing mundane actions whilst preparing yourself for the day ahead was completely gone. Re-establishing this routine took a little bit of time but eventually what worked for me was simple; I grabbed a bowl of cereal, started an Alexa routine to "Wake up" my office, listened to the radio, and browsed some news sites during the time I would be travelling to the office.&lt;/p&gt;

&lt;p&gt;I started with an &lt;a href="https://www.amazon.co.uk/dp/B07PJV3JPR" rel="noopener noreferrer"&gt;Amazon Echo&lt;/a&gt; and eventually upgraded to an &lt;a href="https://www.amazon.co.uk/amazon-echo-show-8-compact-smart-display-with-alexa/dp/B07SMN7FYZ" rel="noopener noreferrer"&gt;Echo Show&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This routine played a sci-fi engine booting up whilst the lights and fan turned on in the office, followed by a quick weather report, and finally a DJ on Planet rock kick-started the morning off with light conversation and rock tracks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq8fnfih4yig22hs5ic0m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq8fnfih4yig22hs5ic0m.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Natural Light
&lt;/h3&gt;

&lt;p&gt;Through a combination of "lockdown", living in the inner city, and remote working, it's was all too common to go days without --much- - any natural light. It's incredible how much your focus can be affected when the lighting is too bright, too dim, or it just feels completely wrong for that time of the day!&lt;/p&gt;

&lt;p&gt;I picked up a &lt;a href="https://www.amazon.co.uk/B22-Colour-Changeable-Dimmable-Required-KL130B/dp/B07R49TMCS/" rel="noopener noreferrer"&gt;Kasa Smart Bulbs by Tp-Link&lt;/a&gt; for my office which allows control over the Brightness and Color/White Illuminance via an App or one of many libraries (such as &lt;a href="https://pypi.org/project/python-kasa/" rel="noopener noreferrer"&gt;python-kasa&lt;/a&gt;. Adjusting the bulb from daylight (9000k) in the morning to a dim incandescent (2500k) in the evening combined with &lt;a href="https://justgetflux.com/" rel="noopener noreferrer"&gt;F.lux&lt;/a&gt; has made an incredible difference to my focus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqloiqu2jbfy4zakt3jxb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqloiqu2jbfy4zakt3jxb.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tracking Time
&lt;/h3&gt;

&lt;p&gt;It's easy to lose track of time, tasks, and meetings when there are no interruptions and you're focused on a task. I've been guilty of missing a meeting or two until I started setting reminders and TODOs&lt;/p&gt;

&lt;p&gt;Using a mix of &lt;a href="https://todoist.com/" rel="noopener noreferrer"&gt;Todoist&lt;/a&gt;, &lt;a href="https://www.google.com/calendar" rel="noopener noreferrer"&gt;Google Calendar&lt;/a&gt;, and &lt;a href="https://app.getpocket.com/" rel="noopener noreferrer"&gt;Pocket&lt;/a&gt; this has helped manage everything from short term tasks (don't forget to review code for x), to work meetings about to happen, and even articles to read whilst waiting for a build/deploy to complete. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Todoist integrates perfectly with the Echo Show and is a great way to check off remaining tasks during downtime. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvaisjnokwac1ylg4oppq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvaisjnokwac1ylg4oppq.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Calendar is also great for providing reminders on and checking what's coming up - I even use it for family events. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff7yl1g9wxlx8qh6x3oji.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff7yl1g9wxlx8qh6x3oji.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pocket is a nice addition for planning some reading for downtime. Simply add links and it will save a preview and how long it takes to read on average for you to pick up later.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Physical Setup
&lt;/h3&gt;

&lt;p&gt;Finally, the last piece of automation that made a huge difference was improving my desk &amp;amp; monitor setup. The daily struggle of swapping HDMI cables between my personal computer and work laptop became a real struggle. Cables would frequently get tangled, fall behind my desk, and every morning was a pain to get setup. &lt;/p&gt;

&lt;p&gt;I picked up some &lt;a href="https://www.amazon.co.uk/Invision-Monitor-Arm-Bracket-Adjustable/dp/B08B8X4KBV" rel="noopener noreferrer"&gt;Invision Monitor Arms&lt;/a&gt; and &lt;a href="https://www.amazon.co.uk/UGREEN-Support-Wireless-Control-Blu-ray-Black/dp/B00MWRZFP4/" rel="noopener noreferrer"&gt;UGreen HDMI Switchers&lt;/a&gt; to automatically switch screens without needing to remove/attach HDMI cables.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  What's next?
&lt;/h3&gt;

&lt;p&gt;Equipping yourself to work remotely is expensive and although there is a lot you can do on a small budget, there are some items that are always expensive. The following are some ideas I have for future automation when my budget allows it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a routine for working in standing/sitting positions with &lt;a href="https://www.fully.com/en-gb/standing-desks/jarvis/jarvis-adjustable-height-desk-laminate.html" rel="noopener noreferrer"&gt;Jarvis Standing Desk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create workflows using the &lt;a href="https://www.amazon.co.uk/Elgato-Stream-Deck-Controller-customizable/dp/B06W2KLM3S" rel="noopener noreferrer"&gt;Elgato Stream Deck&lt;/a&gt; for deployments &amp;amp; routine tasks that cannot be triggered via Alexa.&lt;/li&gt;
&lt;li&gt;Automated ring light for meetings - although a much cheaper alternative to &lt;a href="https://www.amazon.co.uk/Corsair-Elgato-professional-adjustable-app-enabled/dp/B07L755X9G/" rel="noopener noreferrer"&gt;Elgato Key Light&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>automation</category>
      <category>alexa</category>
      <category>productivity</category>
      <category>gadgets</category>
    </item>
    <item>
      <title>Cloudsmith Now Supports Conan!</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Wed, 26 Aug 2020 10:40:14 +0000</pubDate>
      <link>https://dev.to/cloudsmith/cloudsmith-now-supports-conan-5bb4</link>
      <guid>https://dev.to/cloudsmith/cloudsmith-now-supports-conan-5bb4</guid>
      <description>&lt;p&gt;We’re delighted to announce that Cloudsmith now supports Conan! &lt;/p&gt;

&lt;p&gt;As most of your know, Cloudsmith is universal. &lt;strong&gt;It is our aim to support all the languages and package formats our customers and prospective customers use&lt;/strong&gt;. We think any organization benefits from being able to store, secure, manage and distribute ALL of their software assets in a single consistent manner.&lt;/p&gt;

&lt;p&gt;That doesn’t necessarily mean multi-format repositories, but rather every member of the team knowing where to find the packages they need and being able to integrate them into build and deployment processes in the same way - no matter what format.&lt;/p&gt;

&lt;p&gt;Of course, there are a lot of formats and languages out there. So we never stop working to ensure that we cover as many as possible. We listen and respond to our customers, all with the intention of building the only truly universal cloud-native package management platform. &lt;/p&gt;

&lt;p&gt;Hence our support for Conan. Now on with the detail...&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Conan
&lt;/h2&gt;

&lt;p&gt;Conan is an open-source package manager for C/C++, including everything from its client to server implementation and even documentation. &lt;/p&gt;

&lt;p&gt;It is actively developed on GitHub by an awesome community of contributors and a team of engineers working full time on the project. C++ and C popularity continues to hold a steady spot at 9th and 11th place in the "most popular programming, scripting and mark up languages" category of the &lt;a href="https://insights.stackoverflow.com/survey/2019#most-popular-technologies" rel="noopener noreferrer"&gt;2019 Stack Overflow developer survey&lt;/a&gt;. Additionally, they hold the 6th and 9th place in the &lt;a href="https://www.businessinsider.com/most-popular-programming-languages-github-2019-11?r=US&amp;amp;IR=T" rel="noopener noreferrer"&gt;most popular programming languages on Github for 2019&lt;/a&gt;, demonstrating the C/C++ community's longevity.&lt;/p&gt;

&lt;p&gt;Conan is an excellent choice as a package manager. It provides the flexibility developers crave in a developer tool. It uses Python-based package recipes for extensibility, customization and integration with other systems. &lt;/p&gt;

&lt;p&gt;It also works on a multitude of systems; including Windows, Linux (Ubuntu, Debian, RedHat, ArchLinux, Raspbian), OSX, FreeBSD, and SunOS. It can target any existing platform, from bare metal to desktop, mobile, embedded, servers, cross-building and works with a range of build systems (Visual Studio MSBuild, CMake, Makefiles, SCons, etc), with extensibility to use any build system. When combined, these aspects of Conan make it an excellent choice as a multi-platform package manager.&lt;/p&gt;

&lt;p&gt;Using Conan with Cloudsmith allows development teams to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Develop packages internally and share them privately with other teams.&lt;/li&gt;
&lt;li&gt;Distribute and deploy your packages in a pipeline at your organization.&lt;/li&gt;
&lt;li&gt;Distribute packages as commercial software.&lt;/li&gt;
&lt;li&gt;Make modifications to public packages, choosing how you wish to republish (open-source, public, private).&lt;/li&gt;
&lt;li&gt;Capture the exact state of your dependencies at a particular version, release, user, and channel.&lt;/li&gt;
&lt;li&gt;Control (allow list/deny list) at an organization, repository, and package level&lt;/li&gt;
&lt;li&gt;In short, all the benefits of using Cloudsmith that are already enjoyed by development teams all over the world today, are now available for Conan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.conan.io/en/latest/introduction.html" rel="noopener noreferrer"&gt;Conan documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Getting started with Cloudsmith and Conan couldn't be simpler. First, you'll need a Cloudsmith account and a repository to which you can upload your packages. If you need to install Conan you can find &lt;a href="https://docs.conan.io/en/latest/installation.html#" rel="noopener noreferrer"&gt;instructions on the Conan website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Cloudsmith should work with all supported versions of Conan, but we recommend using at least Version 1.25.2 or later for the best experience. You can check your local version like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ conan --version

Conan version 1.25.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating a Conan Package
&lt;/h2&gt;

&lt;p&gt;For the purpose of this demonstration, we will create a Conan package containing a single function that prints "Hello World" using the official example. Running the following example will create a new package called "hello" at version "0.0.1" without the optional user/channel. &lt;/p&gt;

&lt;p&gt;The Conan create command is equivalent to running export, install, and test.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir mypkg &amp;amp;&amp;amp; cd mypkg

$ conan new hello/0.0.1 -t

$ conan create .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The conanfile.py generated as part of the above command will be used to by Conan to build packages however it will also be used by Cloudsmith to retrieve metadata related to a package such as the package name, version, license, etc which can be used for advanced filtering using the UI and Cloudsmith CLI.&lt;/p&gt;

&lt;p&gt;If you wish to learn more about how Conan creates the &lt;a href="https://docs.conan.io/en/latest/creating_packages/getting_started.html" rel="noopener noreferrer"&gt;Package Recipe and Test Packages&lt;/a&gt;, the official documentation provides a detailed breakdown for each command. You're now ready to upload your package to Cloudsmith.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uploading your Conan Package
&lt;/h2&gt;

&lt;p&gt;First, you need to add a remote for a specific namespace/repository to the list of Conan remotes.  The below example uses Cloudsmith as the namespace but this could be your namespace or one of an organization in which you are a member.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ conan remote add cloudsmith-testing-public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://conan.cloudsmith.io/cloudsmith/testing-public/" rel="noopener noreferrer"&gt;https://conan.cloudsmith.io/cloudsmith/testing-public/&lt;/a&gt; &lt;br&gt;
Once a remote has been added, a user can then be configured using your Cloudsmith username and password in place of the substituted values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ conan user -p PASSWORD -r cloudsmith-testing-public USERNAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you're remote and user has been configured within Conan your token will be cached in the client until it expires or becomes invalid. You're now ready to upload your package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;conan upload hello/0.0.1 --all -r cloudsmith-testing-public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once uploaded, you can view your package in Cloudsmith.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl08ia8wox907acyuhyic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl08ia8wox907acyuhyic.png" alt="Conan Package in Cloudsimth repo" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's that simple to get started with Conan on Cloudsmith&lt;/p&gt;

&lt;h2&gt;
  
  
  In Conclusion
&lt;/h2&gt;

&lt;p&gt;Cloudsmith provides fully featured Conan package repositories on all plans, flexible enough for use whether you’re hosting public packages for a public or open-source project, or private packages for your company’s internal needs. We're extremely proud to be able to support the C/C++ ecosystem with this tooling.&lt;/p&gt;

&lt;p&gt;You can find further, context-specific information, including detailed setup and integration instructions inside each Cloudsmith repository.&lt;/p&gt;

&lt;p&gt;Why wait? Get your public and private Conan package repository hosting at Cloudsmith now.&lt;/p&gt;

</description>
      <category>cloudsmith</category>
      <category>formats</category>
      <category>conan</category>
    </item>
    <item>
      <title>A month-long celebration to open source projects: coming soon!</title>
      <dc:creator>Kyle Harrison</dc:creator>
      <pubDate>Tue, 28 Jul 2020 12:34:12 +0000</pubDate>
      <link>https://dev.to/cloudsmith/a-month-long-celebration-to-open-source-projects-coming-soon-4297</link>
      <guid>https://dev.to/cloudsmith/a-month-long-celebration-to-open-source-projects-coming-soon-4297</guid>
      <description>&lt;p&gt;Yes, you guessed it! &lt;a href="https://hacktoberfest.digitalocean.com/" rel="noopener noreferrer"&gt;Hacktoberfest 2020&lt;/a&gt; preparations are already underway globally. If you're not familiar with the event, it's a month-long celebration of open source during October by Digital Ocean. Hacktoberfest promotes contributions to a diverse range of open source projects on Github and welcomes for first-time contributors to get involved with the community.&lt;/p&gt;

&lt;p&gt;It's easy and the perfect time to get involved or even to rejoin the open source community. If contributing to your favorite open source project sounds appealing, wait, because it gets even better! Hacktoberfest is open to everyone across the world. Contributors can sign up anytime between October 1st and October 31st to become eligible for fantastic swag in the form of t-shirts and stickers from Digital Ocean. Submitting four quality pull requests to a public Github repository qualifies each contributor to swag, and what fantastic swag it is! Check out last year's fantastic t-shirt!&lt;/p&gt;

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

&lt;p&gt;At Cloudsmith, we use open source tools and dependencies in all of the software we build and use daily. We love giving back to the community and frequently contributing enhancements and bug fixes to libraries and package management tools to help our customers and our own internal needs.&lt;/p&gt;

&lt;p&gt;Helping to support the open source community is important to us. That's why we provide &lt;a href="https://help.cloudsmith.io/docs/create-a-repository#open-source-repositories" rel="noopener noreferrer"&gt;free, open-source repositories&lt;/a&gt; for all our package formats and provide open source tools to help users get the most out of Cloudsmith as their universal package repository.&lt;/p&gt;

&lt;p&gt;This year, like many previous years, will see members of the team contributing to a range of open source projects for fun and to scratch our own itch by making something we love even better. Still, we're all about giving back and want to help empower developers to contribute to tools they enjoy using. That's why we will be creating a range of issues suitable for first-time contributors and experienced developers to make code and documentation improvements across some of our open source projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cloudsmith-io/cloudsmith-cli" rel="noopener noreferrer"&gt;Cloudsmith CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cloudsmith-io/action" rel="noopener noreferrer"&gt;Cloudsmith Github Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cloudsmith-io/terraform-provider-cloudsmith" rel="noopener noreferrer"&gt;Cloudsmith Terraform Provider&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a team, we are looking forward to engaging with the community we love, and creating new awesome software together!&lt;/p&gt;

</description>
      <category>cloudsmith</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
