<?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: Andy Yang</title>
    <description>The latest articles on DEV Community by Andy Yang (@yzwdroid).</description>
    <link>https://dev.to/yzwdroid</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%2F440927%2F0426692d-9ef7-4ea4-8455-53dd12f57eb9.jpg</url>
      <title>DEV Community: Andy Yang</title>
      <link>https://dev.to/yzwdroid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yzwdroid"/>
    <language>en</language>
    <item>
      <title>Release 0.43</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Sat, 12 Dec 2020 05:19:11 +0000</pubDate>
      <link>https://dev.to/yzwdroid/release-0-43-e3b</link>
      <guid>https://dev.to/yzwdroid/release-0-43-e3b</guid>
      <description>&lt;h1&gt;
  
  
  The Final
&lt;/h1&gt;

&lt;p&gt;When I still work on the second issue, I found another issue to work with &lt;a href="https://github.com/eupn/macrotest/issues/54"&gt;https://github.com/eupn/macrotest/issues/54&lt;/a&gt;. This is the pull request I made. &lt;a href="https://github.com/eupn/macrotest/pull/57"&gt;https://github.com/eupn/macrotest/pull/57&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Migrate from Travis CI to Github Actions
&lt;/h1&gt;

&lt;p&gt;This is a rust project wants move to Github Actions. This is the draft I made.&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Rust&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&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="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&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="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{matrix.os}}&lt;/span&gt;

    &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;rust&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;stable&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;os&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;macos-latest&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;windows-latest&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&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;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

      &lt;span class="pi"&gt;-&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;Use stable rust toolchain&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions-rs/toolchain@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;minimal&lt;/span&gt;
          &lt;span class="na"&gt;toolchain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stable&lt;/span&gt;
          &lt;span class="na"&gt;override&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;

      &lt;span class="pi"&gt;-&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;install&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;matrix.os == 'windows-latest'&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;rustup target add x86_64-pc-windows-msvc&lt;/span&gt;
      &lt;span class="pi"&gt;-&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;before script&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;rustup toolchain install nightly&lt;/span&gt;
          &lt;span class="s"&gt;rustup component add rustfmt&lt;/span&gt;
          &lt;span class="s"&gt;cargo install $TARGET cargo-expand&lt;/span&gt;
      &lt;span class="pi"&gt;-&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;script&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;cargo build $TARGET --verbose --all&lt;/span&gt;
          &lt;span class="s"&gt;cargo test&lt;/span&gt;
          &lt;span class="s"&gt;cd test-project&lt;/span&gt;
          &lt;span class="s"&gt;cargo test -- --nocapture&lt;/span&gt;
          &lt;span class="s"&gt;cd ../test-procmacro-project&lt;/span&gt;
          &lt;span class="s"&gt;cargo test -- --nocapture&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are some problems. The author wants a minimal version of rust being tested. When they use &lt;code&gt;export MSRV=1.34.0&lt;/code&gt;, but it not working on windows in github action. I am working on something similar to handle this issue. The potential solution could be use &lt;code&gt;set MSRV=1.34.0&lt;/code&gt; in windows.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Release 0.42 - Three ideas about automating release.</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Fri, 11 Dec 2020 17:10:27 +0000</pubDate>
      <link>https://dev.to/yzwdroid/release-0-42-three-ideas-about-automating-release-5b9j</link>
      <guid>https://dev.to/yzwdroid/release-0-42-three-ideas-about-automating-release-5b9j</guid>
      <description>&lt;h1&gt;
  
  
  The current release process
&lt;/h1&gt;

&lt;p&gt;The telescope project &lt;a href="https://github.com/Seneca-CDOT/telescope.git"&gt;https://github.com/Seneca-CDOT/telescope.git&lt;/a&gt; use release-it &lt;a href="https://www.npmjs.com/package/release-it"&gt;https://www.npmjs.com/package/release-it&lt;/a&gt; as the release tool. To automate the release process, I have three ideas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea one: release-it
&lt;/h2&gt;

&lt;p&gt;The release-it tool have a ci mode &lt;code&gt;release-it --ci&lt;/code&gt;, it will automate the process without any prompt. We can also continue our release process like before, just moving to the cloud.&lt;/p&gt;

&lt;p&gt;But I have two problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Problem one: read the &lt;code&gt;GITHUB-TOKEN&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have tried&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="pi"&gt;-&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;export env&lt;/span&gt;
        &lt;span class="s"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;export GITHUB_TOKEN="${{ secrets.GITHUB_TOKEN }}"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and&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="pi"&gt;-&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;Create Release&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run release&lt;/span&gt;
  &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;none of them work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Problem two: triger the release&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We triger the release when push to github with the tag v*, but &lt;code&gt;release-it&lt;/code&gt; also add a new tag when create the new release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Idea two:
&lt;/h2&gt;

&lt;p&gt;We maintain a file &lt;code&gt;CHANGLOG.md&lt;/code&gt;.&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="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;v*'&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;Create Release&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&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;Create Release&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&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;Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class="pi"&gt;-&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;Create Release&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;create_release&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/create-release@v1&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;tag_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.ref }}&lt;/span&gt;
          &lt;span class="na"&gt;release_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Release ${{ github.ref }}&lt;/span&gt;
          &lt;span class="na"&gt;body_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./CHANGELOG.md&lt;/span&gt;
          &lt;span class="na"&gt;draft&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
          &lt;span class="na"&gt;prerelease&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Idea Three: Release Drafter
&lt;/h2&gt;

&lt;p&gt;We can draft a release as we commiting to the repo.&lt;br&gt;
&lt;a href="https://github.com/marketplace/actions/release-drafter"&gt;https://github.com/marketplace/actions/release-drafter&lt;/a&gt;&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Release Drafter&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# branches to consider in the event; optional, defaults to all&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;$default-branch&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;update_release_draft&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Drafts your next Release notes as Pull Requests are merged into "master"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;release-drafter/release-drafter@v5&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml&lt;/span&gt;
          &lt;span class="c1"&gt;# config-name: my-config.yml&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Release Go package</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Sun, 06 Dec 2020 04:44:59 +0000</pubDate>
      <link>https://dev.to/yzwdroid/release-go-package-4p34</link>
      <guid>https://dev.to/yzwdroid/release-go-package-4p34</guid>
      <description>&lt;h1&gt;
  
  
  Release Method
&lt;/h1&gt;

&lt;p&gt;For the Go program, I choose &lt;a href="https://pkg.go.dev/"&gt;https://pkg.go.dev/&lt;/a&gt; to release my &lt;a href="https://github.com/yzwdroid/goURL"&gt;goURL&lt;/a&gt;. And the release address &lt;a href="https://pkg.go.dev/github.com/yzwdroid/goURL"&gt;https://pkg.go.dev/github.com/yzwdroid/goURL&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the document.
&lt;/h2&gt;

&lt;p&gt;The first thing I do is read google's document for release. It is hard to find a clue, but as a programmer, I did some experiments.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Visiting that page on pkg.go.dev, and clicking the “Request” button. For example:&lt;br&gt;
&lt;a href="https://pkg.go.dev/example.com/my/module"&gt;https://pkg.go.dev/example.com/my/module&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I guess this is meaning my released address should be &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://pkg.go.dev/github.com/yzwdroid/goURL"&gt;https://pkg.go.dev/github.com/yzwdroid/goURL&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is hard to guess. But google treated all the programmer knows everything.&lt;/p&gt;

&lt;p&gt;I created my first release three months ago. But when I add a new release today, it didn't refresh. Maybe it takes some time to refresh.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Release 0.41</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Mon, 30 Nov 2020 16:30:18 +0000</pubDate>
      <link>https://dev.to/yzwdroid/release-0-41-3j2o</link>
      <guid>https://dev.to/yzwdroid/release-0-41-3j2o</guid>
      <description>&lt;p&gt;For release 0.4, I will work on the CI/CD area on the telescope project. I already  fixed one issue &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1336"&gt;https://github.com/Seneca-CDOT/telescope/issues/1336&lt;/a&gt;, the pull request &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1345"&gt;https://github.com/Seneca-CDOT/telescope/pull/1345&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;It takes a little time to this issue. I learned a lot about Github action from this issue.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding if condition
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;matrix.os == 'ubuntu-latest'&lt;/span&gt;
        &lt;span class="s"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run test-ci&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Run multiple jobs in parallel.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="na"&gt;Prettier-Check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v1&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install &amp;amp;&amp;amp; npm run prettier-check&lt;/span&gt;
  &lt;span class="na"&gt;Lint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v1&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install &amp;amp;&amp;amp; npm run eslint&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;add cache.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt; &lt;span class="pi"&gt;-&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;Cache node modules&lt;/span&gt;
        &lt;span class="s"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/cache@v2&lt;/span&gt;
        &lt;span class="s"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;cache-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cache-node-modules&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# npm cache files are stored in `~/.npm` on Linux/macOS&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;~/.npm&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will redo the cache if the file changed &lt;code&gt;package-lock.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next step.
&lt;/h2&gt;

&lt;p&gt;I am currently working on the second issue &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1301"&gt;https://github.com/Seneca-CDOT/telescope/issues/1301&lt;/a&gt; to automate the release process about telescope.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>lab8-unit test and CI</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Sat, 28 Nov 2020 04:50:58 +0000</pubDate>
      <link>https://dev.to/yzwdroid/lab8-unit-test-and-ci-15n0</link>
      <guid>https://dev.to/yzwdroid/lab8-unit-test-and-ci-15n0</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This week we practiced unit tests and continuous integration using Github action. This is the first time I write a unit test and with the help of go document and &lt;code&gt;go test&lt;/code&gt;. I feel more confident to write the test first and then write the logic code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up testing framework
&lt;/h2&gt;

&lt;p&gt;Go program language has a standard testing package built-in. It's easy to test and benchmark with the standard library. After I learn some basic concepts, I started my work with &lt;code&gt;git checkout -b testing&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  My first test
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Test_removeDuplicate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;urls&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;tests&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;
        &lt;span class="n"&gt;want&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;}{&lt;/span&gt;
        &lt;span class="c"&gt;// TODO: Add test cases.&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;{[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"http://www.google.ca"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http://www.google.ca"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"http://www.google.ca"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;{[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"http://www.google.ca"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http://zyang.ca"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http://www.google.ca"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"http://www.google.ca"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"http://zyang.ca"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;got&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;removeDuplicate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;reflect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeepEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;got&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"removeDuplicate() = %v, want %v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;got&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks complicated, but to be honest, most of the code is generated by vscode.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Mock the HTTP server
&lt;/h2&gt;

&lt;p&gt;I spend a longer time searching for the right syntax to mocking in go. I found mocking a HTTP server is also built in the Go language. &lt;code&gt;"net/http/httptest"&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;httptest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandlerFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;404&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Not Found"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UR&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  run the test
&lt;/h2&gt;

&lt;p&gt;we can run all the test&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go test -v .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or we can just run one test file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go test filename
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  test coverage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go test cover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  git rebase
&lt;/h2&gt;

&lt;p&gt;I forgot to do the rebase in the testing branch. After commit to the master with all the commit history. Instead of &lt;code&gt;git rebase master -i&lt;/code&gt;, I found the commit number from &lt;code&gt;git log&lt;/code&gt; and did a rebase on the master branch. &lt;code&gt;git rebase 312ef0446a -i&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Github action
&lt;/h2&gt;

&lt;p&gt;Actually, I added the GitHub action a month ago. I already make some contributions to the CI/CD area.&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Go&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&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="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&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="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&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;Build&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

    &lt;span class="pi"&gt;-&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;Set up Go 1.x&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-go@v2&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;go-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.13&lt;/span&gt;

    &lt;span class="pi"&gt;-&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;Check out code into the Go module directory&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

    &lt;span class="pi"&gt;-&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;Build&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go build -v .&lt;/span&gt;

    &lt;span class="pi"&gt;-&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;Test&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go test -v .&lt;/span&gt;

  &lt;span class="na"&gt;lint&lt;/span&gt;&lt;span class="pi"&gt;:&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;Lint&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

    &lt;span class="pi"&gt;-&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;Set up Go 1.x&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-go@v2&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;go-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.13&lt;/span&gt;

    &lt;span class="pi"&gt;-&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;Check out code into the Go module directory&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go get -u golang.org/x/lint/golint&lt;/span&gt;
    &lt;span class="pi"&gt;-&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;lint&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;golint .&lt;/span&gt;
  &lt;span class="na"&gt;fmt&lt;/span&gt;&lt;span class="pi"&gt;:&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;Fmt&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

    &lt;span class="pi"&gt;-&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;Set up Go 1.x&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-go@v2&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;go-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.13&lt;/span&gt;

    &lt;span class="pi"&gt;-&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;Check out code into the Go module directory&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
    &lt;span class="pi"&gt;-&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;fmt&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gofmt .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test Pull Request
&lt;/h2&gt;

&lt;p&gt;To test the pull request and github action. I make this PR &lt;a href="https://github.com/yzwdroid/goURL/pull/12"&gt;https://github.com/yzwdroid/goURL/pull/12&lt;/a&gt;. All the tests passed, and I merged the PR to the master branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update contibuting.md
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Tests&lt;/span&gt;

You are welcome to add tests to this project.

go test filename
// or 
go test .
Test coverage
go test -cover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add tests to another project
&lt;/h2&gt;

&lt;h2&gt;
  
  
  integrate linter
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;lint&lt;/span&gt;&lt;span class="pi"&gt;:&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;Lint&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

    &lt;span class="pi"&gt;-&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;Set up Go 1.x&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-go@v2&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;go-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.13&lt;/span&gt;

    &lt;span class="pi"&gt;-&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;Check out code into the Go module directory&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go get -u golang.org/x/lint/golint&lt;/span&gt;
    &lt;span class="pi"&gt;-&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;lint&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;golint .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integrated test into VS Code
&lt;/h2&gt;

&lt;p&gt;Install the &lt;code&gt;Go&lt;/code&gt; plugin, generate the simple test as mentioned above.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Release 3.2 - Github action</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Fri, 20 Nov 2020 03:13:11 +0000</pubDate>
      <link>https://dev.to/yzwdroid/release-3-2-github-action-1bcp</link>
      <guid>https://dev.to/yzwdroid/release-3-2-github-action-1bcp</guid>
      <description>&lt;p&gt;For this release, I choose to work with github action as the external one. The issue I found is &lt;a href="https://github.com/infinyon/future-aio/issues/36"&gt;https://github.com/infinyon/future-aio/issues/36&lt;/a&gt;. The pull request is &lt;a href="https://github.com/infinyon/future-aio/pull/44"&gt;https://github.com/infinyon/future-aio/pull/44&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Github action
&lt;/h2&gt;

&lt;p&gt;Github action is a CI/CD tool. We can rent a virtual machine(Linux, Windows,macOS) from GitHub(Azure). For me, it's like a git hook on the cloud. Everytime we change our code (push, PR, tag), we can specify some commands to run, and the results will show on our repo.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  How to use it.
&lt;/h2&gt;

&lt;p&gt;All the command for github action is located at &lt;code&gt;.github/workflows/*.yaml&lt;/code&gt;. yaml is a superset of JSON. The syntax is like this:&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node-js-ci&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{matrix.os}}&lt;/span&gt;

    &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;os&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;macos-latest&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;windows-latest&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
        &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;12.x&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can have different actions for different branches of our repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work with the &lt;code&gt;rust&lt;/code&gt; project.
&lt;/h2&gt;

&lt;p&gt;I am new to &lt;code&gt;rust&lt;/code&gt;, so first install &lt;code&gt;rust&lt;/code&gt; on my MacBook.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After reading the &lt;code&gt;rust&lt;/code&gt; document, I know the package tool &lt;code&gt;cargo&lt;/code&gt; like &lt;code&gt;npm&lt;/code&gt;. For this issue &lt;a href="https://github.com/infinyon/future-aio/issues/36"&gt;https://github.com/infinyon/future-aio/issues/36&lt;/a&gt;, I need to create a release when we have a push with a tag &lt;code&gt;v*&lt;/code&gt;. And this is done by the code below.&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="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;v*'&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;Create Release&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&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;Create Release&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&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;Checkout code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
      &lt;span class="pi"&gt;-&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;Create Release&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;create_release&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/create-release@v1&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;tag_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.ref }}&lt;/span&gt;
          &lt;span class="na"&gt;release_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Release ${{ github.ref }}&lt;/span&gt;
          &lt;span class="na"&gt;body_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./changelist.md&lt;/span&gt;
          &lt;span class="na"&gt;draft&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
          &lt;span class="na"&gt;prerelease&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also created a &lt;code&gt;./changelist.md&lt;/code&gt; file to track the next release notes.  So the release body with replaced by the content of this file.&lt;/p&gt;

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

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Release 3.1 - telescope</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Fri, 20 Nov 2020 02:43:33 +0000</pubDate>
      <link>https://dev.to/yzwdroid/release-3-1-telescope-27d5</link>
      <guid>https://dev.to/yzwdroid/release-3-1-telescope-27d5</guid>
      <description>&lt;p&gt;For this release, I contribute to this issue &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/1351"&gt;https://github.com/Seneca-CDOT/telescope/issues/1351&lt;/a&gt;. The pull request &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/1352"&gt;https://github.com/Seneca-CDOT/telescope/pull/1352&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a relatively easy issue, We need to change the environment variable &lt;code&gt;MAX_POSTS_PER_PAGE&lt;/code&gt;. The first thing I do is search this variable in our code.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j1nYlSfh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/e8a3qvfr8bvaao2nyhmk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j1nYlSfh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/e8a3qvfr8bvaao2nyhmk.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three results from three files. &lt;br&gt;
Here are the steps I did.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a new branch with the issue number.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b issue#1351
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then, I set the value of this variable to 5. The coding job is done.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;remove the old &lt;code&gt;.env&lt;/code&gt; file, and copy the new &lt;code&gt;env.example&lt;/code&gt; to &lt;code&gt;.env&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then test the code in my local machine. It works, we have 5 posts per page.&lt;/p&gt;
&lt;h2&gt;
  
  
  Problem to push the code.
&lt;/h2&gt;

&lt;p&gt;When I push the code to the remote &lt;code&gt;git push origin issue#1351&lt;/code&gt;, git gives me a warning &lt;code&gt;no permission to push&lt;/code&gt;. I checked the remote address &lt;code&gt;git remote -v&lt;/code&gt;. I make a mistake and clone the repo from telescope. Now the original address is &lt;code&gt;https://github.com/Seneca-CDOT/telescope.git&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I solve the problem.
&lt;/h2&gt;

&lt;p&gt;If I am not in this class, I will delete everything and clone a new repo from my forked repo &lt;code&gt;git@github.com:yzwdroid/telescope.git&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;But I am a git master now (Thanks for @humphd), the remote repo is just a name &lt;code&gt;origin&lt;/code&gt;. I can just add another remote with the command &lt;code&gt;git remote add yzwdroid git@github.com:yzwdroid/telescope.git&lt;/code&gt;. Then just push the current branch &lt;code&gt;$issue1351&lt;/code&gt; to the &lt;code&gt;yzwdroid&lt;/code&gt; remote repo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push yzwdroid issue#1351
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I do the pull request from github.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Go development with VSCode and vim</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Sun, 15 Nov 2020 02:46:35 +0000</pubDate>
      <link>https://dev.to/yzwdroid/go-development-with-vscode-and-vim-4l7</link>
      <guid>https://dev.to/yzwdroid/go-development-with-vscode-and-vim-4l7</guid>
      <description>&lt;h2&gt;
  
  
  Gofmt
&lt;/h2&gt;

&lt;p&gt;Go takes a strong stance on code formatting. The gofmt tool rewrites code into the standard format.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gofmt filenames
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Golint
&lt;/h2&gt;

&lt;p&gt;Linter is a tool that analyzes source code to flag programming errors, bugs, stylistic errors, and suspicious constructs.&lt;br&gt;
Using Linter provides many benefits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find bugs&lt;/li&gt;
&lt;li&gt;Speed up code review&lt;/li&gt;
&lt;li&gt;Manage code quality
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go get -u golang.org/x/lint/golint
golint filenames
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  VSCode setup
&lt;/h2&gt;

&lt;p&gt;Install the Go extension maintained by Go Team at Google(previously maintained by Microsoft).&lt;/p&gt;

&lt;p&gt;You should immediately see a prompt in the bottom-right corner of your screen titled Analysis Tools Missing. This extension relies on a suite of command-line tools, which must be installed separately. Accept the prompt, or use the Go: Install/Update Tools command.&lt;/p&gt;

&lt;p&gt;Also, see the tutorial &lt;a href="https://code.visualstudio.com/docs/languages/go"&gt;https://code.visualstudio.com/docs/languages/go&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  vim setup
&lt;/h2&gt;

&lt;p&gt;Install the vim-go plugin &lt;br&gt;
&lt;code&gt;Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The official toturial &lt;a href="https://github.com/fatih/vim-go/wiki"&gt;https://github.com/fatih/vim-go/wiki&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are some settings from my vimrc file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;augroup go
  autocmd!

  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;Leader&amp;gt;v &amp;lt;Plug&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;go-def-vertical&lt;span class="o"&gt;)&lt;/span&gt;
  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;Leader&amp;gt;s &amp;lt;Plug&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;go-def-split&lt;span class="o"&gt;)&lt;/span&gt;
  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;Leader&amp;gt;d &amp;lt;Plug&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;go-def-tab&lt;span class="o"&gt;)&lt;/span&gt;

  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;Leader&amp;gt;x &amp;lt;Plug&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;go-doc-vertical&lt;span class="o"&gt;)&lt;/span&gt;

  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;Leader&amp;gt;i &amp;lt;Plug&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;go-info&lt;span class="o"&gt;)&lt;/span&gt;
  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;Leader&amp;gt;l &amp;lt;Plug&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;go-metalinter&lt;span class="o"&gt;)&lt;/span&gt;

  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;leader&amp;gt;b :&amp;lt;C-u&amp;gt;call &amp;lt;SID&amp;gt;build_go_files&lt;span class="o"&gt;()&lt;/span&gt;&amp;lt;CR&amp;gt;
  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;leader&amp;gt;t  &amp;lt;Plug&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;go-test&lt;span class="o"&gt;)&lt;/span&gt;
  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;leader&amp;gt;r  &amp;lt;Plug&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;go-run&lt;span class="o"&gt;)&lt;/span&gt;
  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;leader&amp;gt;e  &amp;lt;Plug&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;go-install&lt;span class="o"&gt;)&lt;/span&gt;

  autocmd FileType go nmap &amp;lt;silent&amp;gt; &amp;lt;Leader&amp;gt;c &amp;lt;Plug&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;go-coverage-toggle&lt;span class="o"&gt;)&lt;/span&gt;


  autocmd Filetype go &lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-bang&lt;/span&gt; A call go#alternate#Switch&lt;span class="o"&gt;(&lt;/span&gt;&amp;lt;bang&amp;gt;0, &lt;span class="s1"&gt;'edit'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  autocmd Filetype go &lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-bang&lt;/span&gt; AV call go#alternate#Switch&lt;span class="o"&gt;(&lt;/span&gt;&amp;lt;bang&amp;gt;0, &lt;span class="s1"&gt;'vsplit'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  autocmd Filetype go &lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-bang&lt;/span&gt; AS call go#alternate#Switch&lt;span class="o"&gt;(&lt;/span&gt;&amp;lt;bang&amp;gt;0, &lt;span class="s1"&gt;'split'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  autocmd Filetype go &lt;span class="nb"&gt;command&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-bang&lt;/span&gt; AT call go#alternate#Switch&lt;span class="o"&gt;(&lt;/span&gt;&amp;lt;bang&amp;gt;0, &lt;span class="s1"&gt;'tabe'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
augroup END
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Hello Telescope</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Sat, 07 Nov 2020 04:13:23 +0000</pubDate>
      <link>https://dev.to/yzwdroid/hello-telescope-1i5m</link>
      <guid>https://dev.to/yzwdroid/hello-telescope-1i5m</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uijJlxBF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/14jzosuo9axnvvl6fzpm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uijJlxBF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/14jzosuo9axnvvl6fzpm.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Telescope
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Seneca-CDOT/telescope"&gt;Telescope&lt;/a&gt; is an example of &lt;a href="https://en.wikipedia.org/wiki/Planet_(software)"&gt;planet&lt;/a&gt;: a tool for&lt;br&gt;
aggregating blog feeds. It reminds me of google reader which I used for a long time to read the news.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setup Environment
&lt;/h2&gt;

&lt;p&gt;I am working on a fedora33 with KDE Plasma Desktop. Docker still not support CgroupsV2. It takes a little time to install docker and I have written a blog post for the installation &lt;a href="https://dev.to/yzwdroid/fedora-33-docker-445k"&gt;https://dev.to/yzwdroid/fedora-33-docker-445k&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For some reason, redis has a permission error when &lt;code&gt;docker-compose&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;Starting telescope_redis_1        ... &lt;span class="k"&gt;done 
&lt;/span&gt;Starting telescope_elasticsearch_1 ... &lt;span class="k"&gt;done 
&lt;/span&gt;Attaching to telescope_redis_1, telescope_elasticsearch_1 
redis_1         | find: &lt;span class="s1"&gt;'.'&lt;/span&gt;: Permission denied 
redis_1         | &lt;span class="nb"&gt;chown&lt;/span&gt;: changing ownership of &lt;span class="s1"&gt;'.'&lt;/span&gt;: Permission denied 
telescope_redis_1 exited with code 1 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So I installed Redis by &lt;code&gt;sudo dnf install redis&lt;/code&gt;, and start it with&lt;br&gt;
&lt;code&gt;redis-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;All other part went well, I just follow the &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/docs/environment-setup.md"&gt;environment-setup.md&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Modify goURL
&lt;/h2&gt;

&lt;p&gt;To work with the REST API of telescope, I added a new flag &lt;code&gt;-u --url&lt;/code&gt;, fetch&lt;br&gt;
the json data, convert the data to a slice of post, get each post's contents by&lt;br&gt;
the url. I just added one new function to make this work. Below is the diff I&lt;br&gt;
made.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff HEAD main.go utils.go &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; lab6.diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The diff&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff &lt;span class="nt"&gt;--git&lt;/span&gt; c/main.go w/main.go
index 4679a1a..fd3d249 100644
&lt;span class="nt"&gt;---&lt;/span&gt; c/main.go
+++ w/main.go
@@ &lt;span class="nt"&gt;-25&lt;/span&gt;,6 +25,7 @@ var js &lt;span class="o"&gt;=&lt;/span&gt; flag.BoolP&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"json"&lt;/span&gt;, &lt;span class="s2"&gt;"j"&lt;/span&gt;, &lt;span class="nb"&gt;false&lt;/span&gt;, &lt;span class="s2"&gt;"output json format to stdout"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
 var fp &lt;span class="o"&gt;=&lt;/span&gt; flag.StringP&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"file"&lt;/span&gt;, &lt;span class="s2"&gt;"f"&lt;/span&gt;, &lt;span class="s2"&gt;""&lt;/span&gt;, &lt;span class="s2"&gt;"file name to check"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
 var ignore &lt;span class="o"&gt;=&lt;/span&gt; flag.BoolP&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ignore"&lt;/span&gt;, &lt;span class="s2"&gt;"i"&lt;/span&gt;, &lt;span class="nb"&gt;false&lt;/span&gt;, &lt;span class="s2"&gt;"ignore url patterns"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
 var failOnly &lt;span class="o"&gt;=&lt;/span&gt; flag.Bool&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fails"&lt;/span&gt;, &lt;span class="nb"&gt;false&lt;/span&gt;, &lt;span class="s2"&gt;"show only urls that failed"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
+var urlFlag &lt;span class="o"&gt;=&lt;/span&gt; flag.BoolP&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"url"&lt;/span&gt;, &lt;span class="s2"&gt;"u"&lt;/span&gt;, &lt;span class="nb"&gt;false&lt;/span&gt;, &lt;span class="s2"&gt;"read telescope restful API"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

 func main&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    flag.Parse&lt;span class="o"&gt;()&lt;/span&gt;
@@ &lt;span class="nt"&gt;-43&lt;/span&gt;,14 +44,20 @@ go run main.go &lt;span class="nt"&gt;-v&lt;/span&gt; or &lt;span class="nt"&gt;--version&lt;/span&gt; check version.
        os.Exit&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

-   dat, err :&lt;span class="o"&gt;=&lt;/span&gt; ioutil.ReadFile&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;fp&lt;span class="o"&gt;)&lt;/span&gt;
-   check&lt;span class="o"&gt;(&lt;/span&gt;err&lt;span class="o"&gt;)&lt;/span&gt;
-
+   var urls &lt;span class="o"&gt;[]&lt;/span&gt;string
+   var dat &lt;span class="o"&gt;[]&lt;/span&gt;byte
+   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;urlFlag &lt;span class="o"&gt;{&lt;/span&gt;
+       dat &lt;span class="o"&gt;=&lt;/span&gt; dataTelscope&lt;span class="o"&gt;()&lt;/span&gt;
+   &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
+       var err error
+       dat, err &lt;span class="o"&gt;=&lt;/span&gt; ioutil.ReadFile&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;fp&lt;span class="o"&gt;)&lt;/span&gt;
+       check&lt;span class="o"&gt;(&lt;/span&gt;err&lt;span class="o"&gt;)&lt;/span&gt;
+   &lt;span class="o"&gt;}&lt;/span&gt;
    // use xurls tool to exact links from file. Strict mod only match http://
    // and https:// schema
    rxStrict :&lt;span class="o"&gt;=&lt;/span&gt; xurls.Strict&lt;span class="o"&gt;()&lt;/span&gt;
    // urls is a slice of strings
-   urls :&lt;span class="o"&gt;=&lt;/span&gt; rxStrict.FindAllString&lt;span class="o"&gt;(&lt;/span&gt;string&lt;span class="o"&gt;(&lt;/span&gt;dat&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
+   urls &lt;span class="o"&gt;=&lt;/span&gt; rxStrict.FindAllString&lt;span class="o"&gt;(&lt;/span&gt;string&lt;span class="o"&gt;(&lt;/span&gt;dat&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    urls &lt;span class="o"&gt;=&lt;/span&gt; removeDuplicate&lt;span class="o"&gt;(&lt;/span&gt;urls&lt;span class="o"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;ignore &lt;span class="o"&gt;{&lt;/span&gt;
diff &lt;span class="nt"&gt;--git&lt;/span&gt; c/utils.go w/utils.go
index 5c27fc7..aee4859 100644
&lt;span class="nt"&gt;---&lt;/span&gt; c/utils.go
+++ w/utils.go
@@ &lt;span class="nt"&gt;-2&lt;/span&gt;,7 +2,9 @@ package main

 import &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"bufio"&lt;/span&gt;
+   &lt;span class="s2"&gt;"encoding/json"&lt;/span&gt;
    &lt;span class="s2"&gt;"fmt"&lt;/span&gt;
+   &lt;span class="s2"&gt;"io/ioutil"&lt;/span&gt;
    &lt;span class="s2"&gt;"log"&lt;/span&gt;
    &lt;span class="s2"&gt;"net/http"&lt;/span&gt;
    &lt;span class="s2"&gt;"os"&lt;/span&gt;
@@ &lt;span class="nt"&gt;-18&lt;/span&gt;,6 +20,43 @@ &lt;span class="nb"&gt;type &lt;/span&gt;urlStatus struct &lt;span class="o"&gt;{&lt;/span&gt;
    Status int
 &lt;span class="o"&gt;}&lt;/span&gt;

+type post struct &lt;span class="o"&gt;{&lt;/span&gt;
+   ID  string
+   URL string
+&lt;span class="o"&gt;}&lt;/span&gt;
+
+func dataTelscope&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;byte &lt;span class="o"&gt;{&lt;/span&gt;
+   var data &lt;span class="o"&gt;[]&lt;/span&gt;byte
+   var posts &lt;span class="o"&gt;[]&lt;/span&gt;post
+   resp, err :&lt;span class="o"&gt;=&lt;/span&gt; http.Get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000/posts"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
+   check&lt;span class="o"&gt;(&lt;/span&gt;err&lt;span class="o"&gt;)&lt;/span&gt;
+   defer resp.Body.Close&lt;span class="o"&gt;()&lt;/span&gt;
+
+   &lt;span class="k"&gt;if &lt;/span&gt;resp.StatusCode &lt;span class="o"&gt;==&lt;/span&gt; http.StatusOK &lt;span class="o"&gt;{&lt;/span&gt;
+       body, err :&lt;span class="o"&gt;=&lt;/span&gt; ioutil.ReadAll&lt;span class="o"&gt;(&lt;/span&gt;resp.Body&lt;span class="o"&gt;)&lt;/span&gt;
+       check&lt;span class="o"&gt;(&lt;/span&gt;err&lt;span class="o"&gt;)&lt;/span&gt;
+       &lt;span class="k"&gt;if &lt;/span&gt;err :&lt;span class="o"&gt;=&lt;/span&gt; json.Unmarshal&lt;span class="o"&gt;(&lt;/span&gt;body, &amp;amp;posts&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; err &lt;span class="o"&gt;!=&lt;/span&gt; nil &lt;span class="o"&gt;{&lt;/span&gt;
+           panic&lt;span class="o"&gt;(&lt;/span&gt;err&lt;span class="o"&gt;)&lt;/span&gt;
+       &lt;span class="o"&gt;}&lt;/span&gt;
+       &lt;span class="k"&gt;for &lt;/span&gt;_, p :&lt;span class="o"&gt;=&lt;/span&gt; range posts &lt;span class="o"&gt;{&lt;/span&gt;
+           resp, err :&lt;span class="o"&gt;=&lt;/span&gt; http.Get&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000"&lt;/span&gt; + p.URL&lt;span class="o"&gt;)&lt;/span&gt;
+           &lt;span class="k"&gt;if &lt;/span&gt;err &lt;span class="o"&gt;!=&lt;/span&gt; nil &lt;span class="o"&gt;{&lt;/span&gt;
+               fmt.Println&lt;span class="o"&gt;(&lt;/span&gt;err&lt;span class="o"&gt;)&lt;/span&gt;
+           &lt;span class="o"&gt;}&lt;/span&gt;
+           defer resp.Body.Close&lt;span class="o"&gt;()&lt;/span&gt;
+           &lt;span class="k"&gt;if &lt;/span&gt;resp.StatusCode &lt;span class="o"&gt;==&lt;/span&gt; http.StatusOK &lt;span class="o"&gt;{&lt;/span&gt;
+               bodyData, err :&lt;span class="o"&gt;=&lt;/span&gt; ioutil.ReadAll&lt;span class="o"&gt;(&lt;/span&gt;resp.Body&lt;span class="o"&gt;)&lt;/span&gt;
+               &lt;span class="k"&gt;if &lt;/span&gt;err &lt;span class="o"&gt;!=&lt;/span&gt; nil &lt;span class="o"&gt;{&lt;/span&gt;
+                   fmt.Println&lt;span class="o"&gt;(&lt;/span&gt;err&lt;span class="o"&gt;)&lt;/span&gt;
+               &lt;span class="o"&gt;}&lt;/span&gt;
+               data &lt;span class="o"&gt;=&lt;/span&gt; append&lt;span class="o"&gt;(&lt;/span&gt;data, bodyData...&lt;span class="o"&gt;)&lt;/span&gt;
+           &lt;span class="o"&gt;}&lt;/span&gt;
+       &lt;span class="o"&gt;}&lt;/span&gt;
+   &lt;span class="o"&gt;}&lt;/span&gt;
+
+   &lt;span class="k"&gt;return &lt;/span&gt;data
+&lt;span class="o"&gt;}&lt;/span&gt;
+
 func removeDuplicate&lt;span class="o"&gt;(&lt;/span&gt;urls &lt;span class="o"&gt;[]&lt;/span&gt;string&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;string &lt;span class="o"&gt;{&lt;/span&gt;
    result :&lt;span class="o"&gt;=&lt;/span&gt; make&lt;span class="o"&gt;([]&lt;/span&gt;string, 0, len&lt;span class="o"&gt;(&lt;/span&gt;urls&lt;span class="o"&gt;))&lt;/span&gt;
    temp :&lt;span class="o"&gt;=&lt;/span&gt; map[string]struct&lt;span class="o"&gt;{}{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The gist version is here &lt;a href="https://gist.github.com/yzwdroid/26b6cb71f75f3799dfccd5fb0ed9ec79"&gt;https://gist.github.com/yzwdroid/26b6cb71f75f3799dfccd5fb0ed9ec79&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Release 2.0 - pr4</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Mon, 02 Nov 2020 04:41:18 +0000</pubDate>
      <link>https://dev.to/yzwdroid/release-2-0-pr4-16e7</link>
      <guid>https://dev.to/yzwdroid/release-2-0-pr4-16e7</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MG1Ch1ej--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4kpru5dmah73hjrvotf3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MG1Ch1ej--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4kpru5dmah73hjrvotf3.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Release 2.0 - pr4
&lt;/h1&gt;

&lt;p&gt;For the fourth pull request, I worked on this issue [&lt;a href="https://github.com/JIITODC/jiitodc.github.io/issues/86#event-3923513143(https://github.com/JIITODC/jiitodc.github.io/issues/86#event-3923513143)"&gt;https://github.com/JIITODC/jiitodc.github.io/issues/86#event-3923513143(https://github.com/JIITODC/jiitodc.github.io/issues/86#event-3923513143)&lt;/a&gt;. The pull request is&lt;br&gt;
&lt;a href="https://github.com/JIITODC/jiitodc.github.io/pull/88"&gt;https://github.com/JIITODC/jiitodc.github.io/pull/88&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;I helped this repo to add a horizontal scrollbar on the table if the content is&lt;br&gt;
overflow. This is done by adding a style to the CSS file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;display&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;block&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;overflow-x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;white-space&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;nowrap&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How I failed to contribute to a large program.
&lt;/h2&gt;

&lt;p&gt;I planned to fix this issue &lt;a href="https://github.com/goreleaser/goreleaser/issues/1878"&gt;https://github.com/goreleaser/goreleaser/issues/1878 &lt;/a&gt;, but after three days of working, I found that is not an easy problem, I have to learn some third party libraries. And I asked for help on this issue, for now, no response yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned in this year's hacktoberfest
&lt;/h2&gt;

&lt;p&gt;Before this festival, I don't know how the open-source world work, how to file issue, how to help, how to ask help. I learned that communication is a key ability to work with others. Before we contribute to the program we should read the rules usually on a file named contribute.md.&lt;/p&gt;

&lt;p&gt;This festival gives me a chance to really start. It's a small step but the most important step for me to contribute to the real open source world.&lt;/p&gt;

&lt;p&gt;Thank Digital Ocean and my professor David. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fedora 33 - Docker</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Thu, 29 Oct 2020 17:03:27 +0000</pubDate>
      <link>https://dev.to/yzwdroid/fedora-33-docker-445k</link>
      <guid>https://dev.to/yzwdroid/fedora-33-docker-445k</guid>
      <description>&lt;h1&gt;
  
  
  Docker and Fedora 33
&lt;/h1&gt;

&lt;p&gt;With the release of Fedora 33, Docker is not supported by Fedora 33 officially.&lt;br&gt;
This article will help you install Docker on Fedora 33.&lt;/p&gt;
&lt;h2&gt;
  
  
  Remove old version
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf remove docker-&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf config-manager &lt;span class="nt"&gt;--disable&lt;/span&gt; docker-&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Enable old CGroups
&lt;/h2&gt;

&lt;p&gt;Docker still not support &lt;a href="https://fedoraproject.org/wiki/Changes/CGroupsV2"&gt;CgroupsV2&lt;/a&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="nb"&gt;sudo &lt;/span&gt;grubby &lt;span class="nt"&gt;--update-kernel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ALL &lt;span class="nt"&gt;--args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"systemd.unified_cgroup_hierarchy=0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Set up firewall
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;trusted &lt;span class="nt"&gt;--add-interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;docker0
&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;FedoraWorkstation &lt;span class="nt"&gt;--add-masquerade&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install Moby
&lt;/h2&gt;

&lt;p&gt;Moby is the open-source version of Docker.&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;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;moby-engine docker-compose
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;restart &lt;code&gt;sudo reboot&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Test
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;docker run hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Runing without &lt;code&gt;sudo&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;groupadd docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
//reboot to take effect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>fedora33</category>
      <category>docker</category>
    </item>
    <item>
      <title>release 2.0 - translation</title>
      <dc:creator>Andy Yang</dc:creator>
      <pubDate>Tue, 27 Oct 2020 09:36:05 +0000</pubDate>
      <link>https://dev.to/yzwdroid/release-2-0-translation-38cb</link>
      <guid>https://dev.to/yzwdroid/release-2-0-translation-38cb</guid>
      <description>&lt;h1&gt;
  
  
  Release 2.3
&lt;/h1&gt;

&lt;p&gt;For the third PR, I work on this issue &lt;a href="https://github.com/photoprism/photoprism/issues/514"&gt;https://github.com/photoprism/photoprism/issues/514&lt;/a&gt;. This is the PR I made &lt;a href="https://github.com/photoprism/photoprism/pull/569"&gt;https://github.com/photoprism/photoprism/pull/569&lt;/a&gt;. It's hard to find the project than actually work on the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I worked with it
&lt;/h2&gt;

&lt;p&gt;The instruction is so long to work with. I followed the instruction on this issue, but it did not work when I do this command &lt;code&gt;npm run gettext-compile&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;I realize it's a node module. So I tried &lt;code&gt;npm install&lt;/code&gt;, then everything works.&lt;/p&gt;

&lt;p&gt;The translation is easy to deal with with the help of Poedit &lt;a href="https://poedit.net/"&gt;https://poedit.net/&lt;/a&gt;. I translated both the frontend and backend of the software. And then test it on my local laptop. Then I did the pull request.&lt;/p&gt;

&lt;p&gt;I am so excited to contribute to software that has so many users. I can do more translations with this set-up experience.&lt;/p&gt;

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