<?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: Jason</title>
    <description>The latest articles on DEV Community by Jason (@yodacanada).</description>
    <link>https://dev.to/yodacanada</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%2F701830%2Ff29b8711-fbbc-4d40-b788-422eb5641cc2.jpg</url>
      <title>DEV Community: Jason</title>
      <link>https://dev.to/yodacanada</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yodacanada"/>
    <language>en</language>
    <item>
      <title>Release0.4 - Release</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Sat, 11 Dec 2021 01:59:35 +0000</pubDate>
      <link>https://dev.to/yodacanada/release04-release-2e25</link>
      <guid>https://dev.to/yodacanada/release04-release-2e25</guid>
      <description>&lt;p&gt;The issues &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2519"&gt;2519&lt;/a&gt; has completed, and it closed by PR &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2556"&gt;2556&lt;/a&gt;. The issue &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2542"&gt;2542&lt;/a&gt; has completed, and it is being reviewed by PR &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2562"&gt;2562&lt;/a&gt;. I also reviewed two PR &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2543"&gt;2543&lt;/a&gt; and &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2582"&gt;2582&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2519"&gt;2519&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;At the beginning, I edit the windows size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const width = window.innerWidth;
const height = window.innerHeight;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is work, but it duplicates what we already have with &lt;a href="https://www.npmjs.com/package/xterm-addon-fit"&gt;https://www.npmjs.com/package/xterm-addon-fit&lt;/a&gt;. The right way to do this is to have the parent element that holds the terminal fill the available width and height, and then it will automatically use that. So I , I will try to fix CSS. I used the following code, and the windows size looks good, but The terminal shouldn't display the text on many lines, and it has glitchy text instead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.xterm {
  padding: 0.5rem;
  position: fixed;
  width: 100%;
  height: 89%;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I use &lt;code&gt;vh&lt;/code&gt; instead of &lt;code&gt;%&lt;/code&gt; and the issue fixed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.xterm {
  padding: 0.5rem;
  position: relative;
  width: 100vh;
  height: 89vh;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However there are two lines doesn't seem to be necessary. It is optimized to solve this problem with only one line of code. Please refer to the PR &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2556"&gt;2556&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2542"&gt;2542&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This issue has almost done a part of it is being fixed some issue. &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ljqtt8lj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ptoulqxi8k704ek612nu.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ljqtt8lj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ptoulqxi8k704ek612nu.PNG" alt="Image description" width="673" height="192"&gt;&lt;/a&gt;&lt;br&gt;
We can check the code of PR &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2562"&gt;2562&lt;/a&gt;. &lt;br&gt;
I add the following code in the src/api/status/src/views/builds.hbs file.  If the build done, hide loading and error and show success. if it is loading hide error, success, and show loading. If it has error, hide loading, success, and show error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="container-fluid py-2"&amp;gt;
    &amp;lt;div class="table-responsive"&amp;gt;
      &amp;lt;div class="row mb-2"&amp;gt;
        &amp;lt;div class="col col-md-1 text-xs"&amp;gt;status&amp;lt;/div&amp;gt;
        &amp;lt;div class="col col-md-2 text-xs"&amp;gt;Build in progress&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class="row"&amp;gt;
        &amp;lt;div class="col text-sm"&amp;gt;
          &amp;lt;div class="align-center"&amp;gt;
            &amp;lt;span hidden id="build-loading" class="material-icons fa-spin fa-9x " style="font-size: 24px; color:rgb(255, 196, 0) !important" &amp;gt;motion_photos_on&amp;lt;/span&amp;gt;
            &amp;lt;span  hidden id="build-success" class="material-icons"  style="font-size: 22px; color:green"&amp;gt;check_circle&amp;lt;/span&amp;gt;
            &amp;lt;span hidden id="build-fail" class="material-icons" style="font-size: 23px; color:red"&amp;gt;cancel&amp;lt;/span&amp;gt;
            &amp;lt;span id="calculatorData" style="float: center; color:blue" &amp;gt;&amp;lt;/span&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;   
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following code is datetime-calculator, and it decide which icon will be hidden.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const buildDateCaltulator = document.getElementById('calculatorData');
const buildLoading = document.getElementById('build-loading');
const buildSuccess = document.getElementById('build-success');
const buildFail = document.getElementById('build-fail');

export default function calculatorBuildInfo(data) {
  const startedAtValue = data.startedAt;
  const stoppedAtValue = data.stoppedAt;
  const resultValue = data.result;

  if (startedAtValue !== 'null' &amp;amp;&amp;amp; stoppedAtValue === 'null') {
    const date = Math.abs((new Date(startedAtValue).getTime() / 1000).toFixed(0));
    const currentDate = Math.abs((new Date().getTime() / 1000).toFixed(0));
    const diff = currentDate - date;
    const hours = Math.floor(diff / 3600) % 24;
    const minutes = Math.floor(diff / 60) % 60;
    const seconds = diff % 60;
    buildDateCaltulator.innerText = `${hours} h ${minutes} m ${seconds} s`;
    buildFail.hidden = true;
    buildSuccess.hidden = true;
    buildLoading.hidden = false;
  } else if (resultValue === 0 &amp;amp;&amp;amp; stoppedAtValue !== 'null') {
    const date = Math.abs((new Date(startedAtValue).getTime() / 1000).toFixed(0));
    const currentDate = Math.abs((new Date(stoppedAtValue).getTime() / 1000).toFixed(0));
    const diff = currentDate - date;
    const hours = Math.floor(diff / 3600) % 24;
    const minutes = Math.floor(diff / 60) % 60;
    const seconds = diff % 60;
    buildDateCaltulator.innerText = `${hours} h ${minutes} m ${seconds} s`;
    buildLoading.hidden = true;
    buildFail.hidden = true;
    buildSuccess.hidden = false;
  } else if (resultValue !== 0 &amp;amp;&amp;amp; stoppedAtValue !== 'null') {
    const date = Math.abs((new Date(startedAtValue).getTime() / 1000).toFixed(0));
    const currentDate = Math.abs((new Date(stoppedAtValue).getTime() / 1000).toFixed(0));
    const diff = currentDate - date;
    const hours = Math.floor(diff / 3600) % 24;
    const minutes = Math.floor(diff / 60) % 60;
    const seconds = diff % 60;
    buildDateCaltulator.innerText = `${hours} h ${minutes} m ${seconds} s`;
    buildLoading.hidden = true;
    buildSuccess.hidden = true;
    buildFail.hidden = false;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The following code can connect the above two documents:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UJeV_YzH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hlu5pkgbk6342wndnz8b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UJeV_YzH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hlu5pkgbk6342wndnz8b.png" alt="Image description" width="800" height="424"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RvGVuvlN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2go0e90pxnuziei5rc80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RvGVuvlN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2go0e90pxnuziei5rc80.png" alt="Image description" width="800" height="326"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qMQCwqpV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z5o4ipmoj1okurnjrsyx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qMQCwqpV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z5o4ipmoj1okurnjrsyx.png" alt="Image description" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Review PR &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2543"&gt;2543&lt;/a&gt; and &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2582"&gt;2582&lt;/a&gt;.
&lt;/h3&gt;

&lt;p&gt;I retest the PR 2543 and provide my suggestion.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qWJs-S6N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7toj3x5h22gck4an1u9k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qWJs-S6N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7toj3x5h22gck4an1u9k.png" alt="Image description" width="800" height="765"&gt;&lt;/a&gt;&lt;br&gt;
I also retest the PR 2582, and the provide the following review comment:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--akxHn7Yy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dl3vc37k58mgo8jbdam9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--akxHn7Yy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dl3vc37k58mgo8jbdam9.png" alt="Image description" width="800" height="422"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--APqdUIWM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jzx0w4n45iwdcoyg9pir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--APqdUIWM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jzx0w4n45iwdcoyg9pir.png" alt="Image description" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What did I learn from OSD600
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;I improved my soft skill of networking and collaborating with community members. I mastered Slack, Dev and Discord.&lt;/li&gt;
&lt;li&gt;I learned lots of knowledge about GitHub including forking, cloning, creating branch, creating pull request and so on. I also mastered some command, for instance, checkout, rebase, remote, merge, pull, push, fetch and so on.&lt;/li&gt;
&lt;li&gt;I handed on the Markdown language.&lt;/li&gt;
&lt;li&gt;I learned some feature about Docusaurus, and I have saved some skill which I noted using Docusaurus.&lt;/li&gt;
&lt;li&gt;I learned how to apply Black to format Python code; how to apply a linter - Flake8, how to integrate  my project.&lt;/li&gt;
&lt;li&gt;I learned how to use Pytest to create test case and test my SSG.&lt;/li&gt;
&lt;li&gt;I learned how to use PyPI to package and release SSG.&lt;/li&gt;
&lt;li&gt;I learned lots of skills about Python, JS, CSS and other languages.&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Release 0.4 Progress</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Mon, 06 Dec 2021 02:07:07 +0000</pubDate>
      <link>https://dev.to/yodacanada/release-04-progress-57do</link>
      <guid>https://dev.to/yodacanada/release-04-progress-57do</guid>
      <description>&lt;p&gt;The two issues &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2519"&gt;2519&lt;/a&gt;, and &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2542"&gt;2542&lt;/a&gt; were both partially completed this week.&lt;/p&gt;

&lt;h4&gt;
  
  
  Issue 2519
&lt;/h4&gt;

&lt;p&gt;I think the terminal port can't auto fit the height because the Browser can't get the size of the container. So I edit the terminal.js file and get the window's width and height, then calculate the row height and column width based on these data.&lt;br&gt;
If the user has more than one screen, just refresh the screen, the terminal window will fit the new screen. The issue solved and I pull the request &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2556"&gt;2556&lt;/a&gt;.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--inue5Z-k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x9e0ayilfo0rxsrfkq8w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--inue5Z-k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x9e0ayilfo0rxsrfkq8w.png" alt="Image description" width="800" height="338"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kzKq0DMI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w2eye69jnv8zw20zcjpw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kzKq0DMI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w2eye69jnv8zw20zcjpw.png" alt="Image description" width="800" height="213"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2Ng_UqCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w0y2tsa4y7pml53gyvt7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2Ng_UqCN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w0y2tsa4y7pml53gyvt7.png" alt="Image description" width="800" height="852"&gt;&lt;/a&gt;&lt;br&gt;
However, the professor thinks it duplicates what we already have with &lt;a href="https://www.npmjs.com/package/xterm-addon-fit"&gt;https://www.npmjs.com/package/xterm-addon-fit&lt;/a&gt;. The right way to do this is to have the parent element that holds the terminal fill the available width and height, and then it will automatically use that. So I will fix my CSS for the page so that it does this.&lt;/p&gt;
&lt;h4&gt;
  
  
  Issue 2542
&lt;/h4&gt;

&lt;p&gt;I want to do this issue by four steps.&lt;br&gt;&lt;br&gt;
1.An animated indication shows a build is happening.&lt;br&gt;
2.The animated indicator shows the percentage being built.&lt;br&gt;
3.The indicator shows how long it's been going for.&lt;br&gt;
4.When it's done, the yellow animated circle becomes a green checkmark or a red ' X'.&lt;br&gt;
I have done the first two steps, and the &lt;a href="https://user-images.githubusercontent.com/55161917/144630593-96189add-8327-4c58-8dee-9e0e10486881.mp4"&gt;result video&lt;/a&gt; looks good. I edited two files and added the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* {
  margin: 0;
  padding: 0;
  font-family: sans-serif;
}
.box {
  position: relative;
  height: 50px;
  width: 250px;
  background: transparent;
  border-radius: 5px;
}
.box svg {
  position: absolute;
  height: 160px;
  width: 160px;
  left: 25%;
  top: 50%;
  transform: translate(-50%, -50%) rotate(-90deg);
}
.box svg circle {
  fill: transparent;
  stroke: #ff0;
  stroke-width: 3;
  stroke-dasharray: 500;
  stroke-dashoffset: 500;
  stroke-linecap: round;
  animation: stroke 28s steps(500) forwards;
}
.box .counter {
  position: absolute;
  top: 60%;
  left: 25%;
  transform: translate(-50%, -50%);
  width: 70%;
  height: 30px;
  color: #e6b800;
  text-align: center;
  overflow: hidden;
}
.box .counter span {
  font-size: 10px;
  line-height: 25px;
  font-weight: bold;
  /* text-align: center; */
}
.box .counter span:after {
  content: '0%\A 1%\A 2%\A 3%\A 4%\A 5%\A 6%\A 7%\A 8%\A 9%\A 10%\A 11%\A 12%\A 13%\A 14%\A 15%\A 16%\A 17%\A 18%\A 19%\A 20%\A 21%\A 22%\A 23%\A 24%\A 25%\A 26%\A 27%\A 28%\A 29%\A 30%\A 31%\A 32%\A 33%\A 34%\A 35%\A 36%\A 37%\A 38%\A 39%\A 40%\A 41%\A 42%\A 43%\A 44%\A 45%\A 46%\A 47%\A 48%\A 49%\A 50%\A 51%\A 52%\A 53%\A 54%\A 55%\A 56%\A 57%\A 58%\A 59%\A 60%\A 61%\A 62%\A 63%\A 64%\A 65%\A 66%\A 67%\A 68%\A 69%\A 70%\A 71%\A 72%\A 73%\A 74%\A 75%\A 76%\A 77%\A 78%\A 79%\A 80%\A 81%\A 82%\A 83%\A 84%\A 85%\A 86%\A 87%\A 88%\A 89%\A 90%\A 91%\A 92%\A 93%\A 94%\A 95%\A 96%\A 97%\A 98%\A 99%\A 100% ';
  position: absolute;
  white-space: pre;
  left: 50%;
  transform: translateX(-50%);
  animation: animate 10s steps(100) forwards;
}
h8 {
  color: #000;
  position: absolute;
  width: 100%;
  text-align: center;
  top: 25%;
  right: 2%;
  letter-spacing: 1px;
}
@keyframes animate {
  0% {
    top: 0%;
  }
  100% {
    top: -5000px;
  }
}
@keyframes stroke {
  100% {
    stroke-dashoffset: 0;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--poCjy-JG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0jcb52fadbpiz9y65cf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--poCjy-JG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0jcb52fadbpiz9y65cf5.png" alt="Image description" width="800" height="654"&gt;&lt;/a&gt;&lt;br&gt;
The professor's opinion is that we can't use a % since we don't have any concept of where we are in a build, and we know when a build started (Datetime) and therefore can calculate how long it's been running, so we could do something like 1m 15s, yes.&lt;br&gt;
I will modify the code according to the professor's suggestion.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Release 0.4 Planning</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Mon, 06 Dec 2021 01:13:22 +0000</pubDate>
      <link>https://dev.to/yodacanada/release-04-planning-1j89</link>
      <guid>https://dev.to/yodacanada/release-04-planning-1j89</guid>
      <description>&lt;p&gt;I plan to work on &lt;a href="https://github.com/Seneca-CDOT/telescope"&gt;Seneca-CDOT/telescope&lt;/a&gt;.Thare are some issues that inside my comfort zone and the difficulty also meets the requirements. In addition, I intend to continue to contribute to this project after this semester. I chose two issues, one the issue &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2519"&gt;2519&lt;/a&gt;, and another is &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2542"&gt;2542&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Issue 2519
&lt;/h4&gt;

&lt;p&gt;The issue is about "Extend build terminal in dashboard to full height of viewport". The &lt;a href="https://dev.api.telescope.cdot.systems/v1/status/pages/build.html"&gt;build terminal&lt;/a&gt; is only occupying the top portion of the page and the owner wish it extend to fill the available space vertically.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QmJDan-i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jc40zz7ewro2tnhc9urb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QmJDan-i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jc40zz7ewro2tnhc9urb.png" alt="Image description" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Issue 2542
&lt;/h4&gt;

&lt;p&gt;The issue is about "Indicate a build is in progress in Dashboard build page". When go to a build in GitHub Actions, the user can see an animated indication that a build is happening, and how long its been going for:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OIxeuBA6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q2izx9nbprpzza04b5wk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OIxeuBA6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q2izx9nbprpzza04b5wk.png" alt="Image description" width="497" height="90"&gt;&lt;/a&gt;&lt;br&gt;
When it's done, the yellow animated circle becomes a green check mark or a red "X".&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vpxddEQ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8z01lf7q979gwupaesw5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vpxddEQ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8z01lf7q979gwupaesw5.png" alt="Image description" width="492" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Release 0.3 code review</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Tue, 30 Nov 2021 21:29:03 +0000</pubDate>
      <link>https://dev.to/yodacanada/release-03-code-review-40ii</link>
      <guid>https://dev.to/yodacanada/release-03-code-review-40ii</guid>
      <description>&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; I reviewed the &lt;a href="https://github.com/Seneca-ICTOER/IPC144/pull/131"&gt;IPC144 Issue 124&lt;/a&gt; - Build PDF in deployment and include when we publish to GH-Pages.&lt;br&gt;
I checked the &lt;a href="https://docusaurus.io/docs/api/docusaurus-config#title"&gt;docusaurus-config&lt;/a&gt; optional fields, it seems no field support downloading the document directly if you use the &lt;code&gt;links: [ {items:}]&lt;/code&gt;.  I suggest that create a new file, e.g. the name is Seneca-IPC144-download.md.  Then, fill in a back-end interface for downloading files on this page, e.g. &lt;a href="https://codeload.github.com/douban/douban-client/legacy.zip/master"&gt;https://codeload.github.com/douban/douban-client/legacy.zip/master&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var $btn = $("#btn");

//A back-end interface for downloading files is known:
https://codeload.github.com/douban/douban-client/legacy.zip/master

$btn.click(function(){
    window.open("https://codeload.github.com/douban/douban-client/legacy.zip/master");
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, in the docusaurus.config.js file, use the following code that can navigate to the download page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;items: [
        {
            label: 'Download',
            to: '/Seneca-IPC144-download',
         },
          ],
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; I reviewed another &lt;a href="https://github.com/Seneca-ICTOER/IPC144/pull/80"&gt;issue&lt;/a&gt;-ASCII Collating Sequence image converted into Table&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s----zjKtNF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0wpf4cpwkhorb87mbx4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s----zjKtNF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0wpf4cpwkhorb87mbx4t.png" alt="Image description" width="800" height="317"&gt;&lt;/a&gt;&lt;br&gt;
I have two suggestions, the first is that at the end of line 47, the table should display " | ", but it is blank.&lt;br&gt;
The second is the page didn't display a subtitle compared with the IPC144 old version.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Release0.3 Seneca-ICTOER/IPC144 -Audit &amp; fix Information.md</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Tue, 30 Nov 2021 03:21:05 +0000</pubDate>
      <link>https://dev.to/yodacanada/release03-seneca-ictoeripc144-audit-fix-informationmd-2id3</link>
      <guid>https://dev.to/yodacanada/release03-seneca-ictoeripc144-audit-fix-informationmd-2id3</guid>
      <description>&lt;p&gt;I'm responsible for fixing the Information.md page, and the following six issues were fixed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Fixed images work in dark modes. The memory model image's downward arrows and the letter in the bottom right corner are not clear in dark modes. I wrapping them in a tag and adding class "mdImg" to it.
2. The images can't display in all models. Change all the image path from "/img/.jpg" to "../../static/img/.jpg". The issue is fixed.
3. Fix Frontmatter for the page to include id, title, slug, and description.
4. Replace blockquote with Admonitions for clarity.
5. Added alt text for diagram images.
6. Some of " * "will get converted into _ after being formatted with Prettier. I use "\ *" replace them.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How to fix the code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zPbVpdkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7lz0ghfbbbrrdhelx0tu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zPbVpdkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7lz0ghfbbbrrdhelx0tu.png" alt="Image description" width="800" height="445"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IndaFJ8W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sty5yk3dyeiepk7tdi4z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IndaFJ8W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sty5yk3dyeiepk7tdi4z.png" alt="Image description" width="800" height="545"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Kl9KoHKj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndoc9o5pur9z3r75zwi3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kl9KoHKj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndoc9o5pur9z3r75zwi3.png" alt="Image description" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tips about merging commits
&lt;/h3&gt;

&lt;p&gt;The challenge of this project is about how to merge all commits to one. I failed many times and I have to close the PR and recreate a new one. There are some tips about the issue.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don’t use &lt;code&gt;git add .&lt;/code&gt; because it will often add files you don’t intend, and then you get into a mess when you have to remove them and don’t know how.  Instead, use: &lt;code&gt;git add file1 file2 dir1 dir2&lt;/code&gt; Specify the files/folders by name.  It will save you making mistakes.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you’re going to rebase onto main, you need to do this first:&lt;br&gt;
&lt;br&gt;
&lt;code&gt;git checkout main&lt;br&gt;
git pull upstream main&lt;br&gt;
git checkout issue-44&lt;br&gt;
git rebase -i main&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There’s no reason to pull from my origin/issue-44 because I made all these commits.  Unless I merged something into my fork, which is unlikely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t do this: &lt;code&gt;git pull origin main, then merge it to issue-44.&lt;/code&gt; First, I need to checkout main and pull from the upstream, not my origin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use git reflog, check &lt;a href="https://medium.com/@shreyawhiz/how-to-undo-a-mistaken-git-rebase-life-saver-2977ff0a0602"&gt;here&lt;/a&gt; for more information. Revert your squashed commit by using git reset — hard , make changes, rebase and push it to issue-44 again. Before doing this, you can checkout a new branch to be extra safe.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the added files are still in staging. For example, .gitignore and yarn.lock staged in git. Use restore --staged  to unstage them, use git checkout issue044  to rollback their content. Then use git add  for files that you are meant to change, in this case only docs/A-Introduction/information.md and maybe files in static/img. Rebase it and force push.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Release0.3 Using PyParing lib in mindsdb</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Tue, 30 Nov 2021 02:32:20 +0000</pubDate>
      <link>https://dev.to/yodacanada/release03-using-pyparing-lib-in-mindsdb-46mj</link>
      <guid>https://dev.to/yodacanada/release03-using-pyparing-lib-in-mindsdb-46mj</guid>
      <description>&lt;p&gt;MindsDB is a predictive platform that makes databases intelligent and machine learning easy to use. It allows data analysts to build and visualize forecasts in BI dashboards without going through the complexity of ML pipelines, all through SQL. It also helps data scientists to streamline MLOps by providing advanced instruments for in-database machine learning and optimize ML workflows through a declarative JSON-AI syntax.&lt;br&gt;
I did 3 issues of this project, &lt;a href="https://github.com/mindsdb/mindsdb/pull/1773"&gt;1773&lt;/a&gt; and &lt;a href="https://github.com/mindsdb/mindsdb/pull/1771"&gt;1771&lt;/a&gt; have merged, and &lt;a href="https://github.com/mindsdb/mindsdb/pull/1777"&gt;1777&lt;/a&gt; had approved.&lt;/p&gt;
&lt;h3&gt;
  
  
  PR 1773 and PR1771 review
&lt;/h3&gt;

&lt;p&gt;These two issues are easy to fix, but it can help me understand the program as soon as possible and let me establish good communication with the project owner.&lt;br&gt;
The first issue need to find the integrations table file, and remove the supported integrations table.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JYAHendf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o0r2y6lutpgozb34je2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JYAHendf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o0r2y6lutpgozb34je2l.png" alt="Image description" width="800" height="217"&gt;&lt;/a&gt;&lt;br&gt;
The second issue is that rename two sections from the left navigation menu.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--igrEza7W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qipzc6fkjr6urn3fy9qc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--igrEza7W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qipzc6fkjr6urn3fy9qc.png" alt="Image description" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  PR1777 review
&lt;/h3&gt;

&lt;p&gt;The issue is that if the user adds the space in the integration name, the app isn't able to parse that for e.g My SQL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; CREATE PREDICTOR home_rentals_model FROM `My SQL`(SELECT * from test_data.home_rentals)  PREDICT rental_price;
ERROR 1149 (HY000): Expected "PREDICT" (at char 45), (line:1, col:46)
mysql&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the beginning, I think the issue is from the interface, and I just need to remove the white space. Then I used the following code to deal with the issue.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9mg7AgPP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7emyupyyu9y1im95a2d1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9mg7AgPP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7emyupyyu9y1im95a2d1.png" alt="Image description" width="800" height="326"&gt;&lt;/a&gt;&lt;br&gt;
After communicating with the project owner, I know that the interface changes affect only 'integration', ie when you work with MindsDB from your database (not via direct connection to MindsDB). In original issue error had raise in 'create predictor' query, which cant be used with such connection. The issue is parser error, probably it does not understand back quote symbols.&lt;br&gt;
I searched for some information about &lt;a href="https://pyparsing-docs.readthedocs.io/en/latest/pyparsing.html"&gt;pyparser&lt;/a&gt; and the pyparser can't understand backquotes as you said. Then I checked some methods about how to identify backquotes, probably two methods. One is to use backslash + backquote, and the other is to use repr (). I use the backslash +backquote method in this PR.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6dEW9vXU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2jh7pxt0v37ym9ha1ko3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6dEW9vXU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2jh7pxt0v37ym9ha1ko3.png" alt="Image description" width="723" height="1219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What I learned
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://pypi.org/project/pyparsing/"&gt;pyparsing module&lt;/a&gt; is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. The pyparsing module provides a library of classes that client code uses to construct the grammar directly in Python code. There are lots of functions, and I am learning them.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Lab10 Packaging and Releasing SSG</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Sat, 27 Nov 2021 20:36:37 +0000</pubDate>
      <link>https://dev.to/yodacanada/lab10-packaging-and-releasing-ssg-mg</link>
      <guid>https://dev.to/yodacanada/lab10-packaging-and-releasing-ssg-mg</guid>
      <description>&lt;p&gt;Lab10 will focus on packaging and releasing my own SSG project and getting our code into the hands of users. I use the &lt;a href="https://packaging.python.org/tutorials/packaging-projects/"&gt;PyPI &lt;/a&gt;to do it. &lt;/p&gt;

&lt;h3&gt;
  
  
  How to set up
&lt;/h3&gt;

&lt;p&gt;I followed the &lt;a href="https://packaging.python.org/tutorials/packaging-projects/"&gt;instruction&lt;/a&gt; to finish all the steps. &lt;br&gt;
&lt;strong&gt;First&lt;/strong&gt;, I need to change the directory structure before I package SSG. I create a new directory named src/. When importing the package, Python searches through the directories on sys.path looking for the package subdirectory. I also need to update import information of all files. &lt;br&gt;
&lt;strong&gt;Second&lt;/strong&gt;, I creat a new file named _&lt;em&gt;init_&lt;/em&gt;.py. The _&lt;em&gt;init_&lt;/em&gt;.py files is required to import the directory as a package, and should be empty. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xv0Ii8Tn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/emccygb0dlm3iy2qtqio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xv0Ii8Tn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/emccygb0dlm3iy2qtqio.png" alt="Image description" width="511" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third&lt;/strong&gt;, edit the exist  pyproject.toml file which tells build tools (like pip and build) what is required to build your project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[build-system]
requires = [
    "setuptools&amp;gt;=42",
    "wheel"
]
build-backend = "setuptools.build_meta"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Forth&lt;/strong&gt;, configuring metadata. There are two types of metadata: static and dynamic. I use the static metadata because it is simpler, easier to read, and avoids many common errors. &lt;code&gt;setup.cfg&lt;/code&gt; is the configuration file for setuptools. It tells setuptools about your package (such as the name and version) as well as which code files to include. Eventually much of this configuration may be able to move to pyproject.toml.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[metadata]
name = magic-ssg
version = 0.9.1
author = Tengzhen Zhao
author_email = tzhao16@myseneca.com
description = A simple Static Site Generator tool, and it can help you to generate .html from .txt and .md files. 
long_description = file: README.md
long_description_content_type = text/markdown
url = https://github.com/Yoda-Canada/Magic-SSG
project_urls =
    Bug Tracker = https://github.com/Yoda-Canada/Magic-SSG/issues
classifiers =
    Programming Language :: Python :: 3
    License :: OSI Approved :: MIT License
    Operating System :: OS Independent

[options]
package_dir =
    = src
packages = find:
python_requires = &amp;gt;=3.8.5

[options.packages.find]
where = src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fifth&lt;/strong&gt;, Now run this command from the same directory where pyproject.toml is located. Then register an account using this &lt;a href="https://test.pypi.org/account/register/"&gt;register page&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;py -m pip install --upgrade build
py -m build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;py -m pip install --upgrade twine
py -m twine upload --repository testpypi dist/*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sixth&lt;/strong&gt;, after registered, I use twine to upload the distribution packages and install Twine. Once installed, run Twine to upload all of the archives under dist.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;py -m pip install --upgrade twine
py -m twine upload --repository testpypi dist/*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://test.pypi.org/project/magic-ssg/"&gt;magic-ssg 1.0.0&lt;/a&gt;  upload to the PyPI successfully. &lt;/p&gt;

&lt;h3&gt;
  
  
  Testing
&lt;/h3&gt;

&lt;p&gt;Former students of OSD600 helped me to test the installation of this software. The installation went smoothly and there was no problem running.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---zHaUkYp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d1cmjx6r8xrvcxlvhk5y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---zHaUkYp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d1cmjx6r8xrvcxlvhk5y.png" alt="Image description" width="800" height="138"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jEohBK6E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tc1ihi51tcs0o1gg0ttw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jEohBK6E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tc1ihi51tcs0o1gg0ttw.png" alt="Image description" width="650" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reflection
&lt;/h3&gt;

&lt;p&gt;I learned how to control the version and how to package and publish the program. I know how the version number is constantly updated, which is helpful for my future to develop a project.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Lab9 Continuous Integration Pipelines and Test Automation</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Sat, 20 Nov 2021 02:30:49 +0000</pubDate>
      <link>https://dev.to/yodacanada/lab9-continuous-integration-pipelines-and-test-automation-5f30</link>
      <guid>https://dev.to/yodacanada/lab9-continuous-integration-pipelines-and-test-automation-5f30</guid>
      <description>&lt;p&gt;This week I focused on managing project complexity through the use of Continuous Integration Pipelines and Test Automation.  CI is a method whereby we build and run our tests automatically whenever anything is pushed to the repo, or a new pull request is made.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to create a GitHub Actions Workflow
&lt;/h3&gt;

&lt;p&gt;The video &lt;a href="https://www.youtube.com/watch?v=TfbBF0mJp6M"&gt;Running Tests through CI&lt;/a&gt; is very help and I followed the steps to create my first GitHub Actions Workflow. GitHub provides its own CL service called GitHub Action and we just need to click "Actions" tab. I choose the Python - Anacondas template into my project. Then I follow the &lt;a href="https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python"&gt;instruction&lt;/a&gt; to configure the python-package-conda.yml file. Most of items are auto generated, only apart of them need to edit. For example, add the push and pull request action, and also edit the install dependencies.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--USVlMXIk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ffypfawi0b53jde026p8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--USVlMXIk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ffypfawi0b53jde026p8.png" alt="Image description" width="800" height="922"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Pull Request to Test my CI
&lt;/h3&gt;

&lt;p&gt;I create a new branch named lab9, and add a new file named test_md_txt_title.py. After all function passed, I push the branch to the remote and pull a new &lt;a href="https://github.com/Yoda-Canada/Magic-SSG/pull/21"&gt;PR&lt;/a&gt;. After GitHub Action passed the PR, I merged it. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TBkkXsbQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/auj168i7xquln0j9slhn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TBkkXsbQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/auj168i7xquln0j9slhn.png" alt="Image description" width="532" height="1020"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Tests to Partner Project
&lt;/h3&gt;

&lt;p&gt;According to my parter's &lt;a href="https://github.com/oliver-pham/silkie/issues/28"&gt;issue&lt;/a&gt;, I create a new test file named. I pull a new &lt;a href="https://github.com/oliver-pham/silkie/pull/30"&gt;PR&lt;/a&gt;, the partner's Actions passed it.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dIVt5Nlv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mllsr4ae2se1ffpkfxxo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dIVt5Nlv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mllsr4ae2se1ffpkfxxo.png" alt="Image description" width="800" height="716"&gt;&lt;/a&gt;&lt;br&gt;
Before that, I found that many projects have the function of automatic error checking. I wonder how to do it. After lab9, I also created my own GitHub actions. I'm very excited.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Lab8 Manage project complexity through the use of Automated Testing</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Sat, 13 Nov 2021 23:11:45 +0000</pubDate>
      <link>https://dev.to/yodacanada/lab8-manage-project-complexity-through-the-use-of-automated-testing-1hka</link>
      <guid>https://dev.to/yodacanada/lab8-manage-project-complexity-through-the-use-of-automated-testing-1hka</guid>
      <description>&lt;p&gt;The Lab8 are focused on managing project complexity through the use of Automated Testing. There are three frequently used framework for Python: Unittest, Nose and Pytest.  Unittest has an associated module unittest2, but unittest2 is only applicable to Python 2.4-2.6. Nose has entered the maintenance mode. It can be seen from GitHub nose that the latest code submission of nose was on May 4, 2016. Nose2 inherits nose, but it should be noted that nose2 does not support all the functions of nose. Pytest's purpose is to make unit testing easier, and it can also be extended to support complex functional testing at the application level. Unlike unittest / nose, pytest can be used not only for unit testing, but also for higher-level, application-oriented functional testing. Therefore, if a higher level of testing is required, pytest is suitable. So I choose Pytest to test my project.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to install
&lt;/h3&gt;

&lt;p&gt;Run the following command in your command line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pip install -U pytest&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check that you installed the correct version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pytest --version&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to build directory tree
&lt;/h3&gt;

&lt;p&gt;To get started writing tests, I need to simply create a folder named tests, which will contain test cases. Create an empty file called __init__.py in both tests folder and it's subfolder. Creating the __init__.py file means that the tests folder can be imported as a module from the parent directory. So my directory tree will look something like this:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xjcX-yXM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lqke3u3zpjmisfhoi7zt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xjcX-yXM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lqke3u3zpjmisfhoi7zt.png" alt="Image description" width="269" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to write test case
&lt;/h3&gt;

&lt;p&gt;In the assiLib.py has a function named get_txt_title. The function will specify if the article has title. If the first three lines have 2 blank lines and one non comment line, the function will take the non comment line as the title. I want to test it and separate it to 5 test cases. the first case is the title in the first line; the second is the title in the second line and it is centered; the third is the title in the Third line; the forth is the first line is the comment line; the fifth is the first line is the first sentence of the first paragraph.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CiYun0z2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/439novum7bocs3gwfgc9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CiYun0z2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/439novum7bocs3gwfgc9.png" alt="Image description" width="800" height="954"&gt;&lt;/a&gt;&lt;br&gt;
When I run the test file, there are four passed and one failed. The failed case isn't a bug, it is an function need to be enhanced.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2HkfwsH3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nsrksy9fq87h7119ypib.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2HkfwsH3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nsrksy9fq87h7119ypib.png" alt="Image description" width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to install Pytest-watch
&lt;/h3&gt;

&lt;p&gt;What if you are working on a particular file/function, and want to run a single test over and over again while you fix a bug? There is a zero-config CLI &lt;a href="https://github.com/joeyespo/pytest-watch"&gt;tool&lt;/a&gt; that runs pytest, and re-runs it when a file in your project changes. It beeps on failures and can run arbitrary commands on each passing and failing test run. You can install it using the following command.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;$ pip install pytest-watch&lt;/code&gt;
You can run it using the every simple command in under the root directory.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$ ptw&lt;/code&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pQBENFL7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lzqwku4b7whz1et7gim4.png" alt="Image description" width="800" height="316"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to install &lt;a href="https://github.com/pytest-dev/pytest-cov"&gt;Pytest-cov&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This plugin produces coverage reports. Compared to just using coverage run this plugin does some extras:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Subprocess support: you can fork or run stuff in a subprocess and will get covered without any fuss.&lt;/li&gt;
&lt;li&gt;Xdist support: you can use all of pytest-xdist's features and still get coverage.&lt;/li&gt;
&lt;li&gt;Consistent pytest behavior. If you run coverage run -m pytest you will have slightly different sys.path (CWD will be in it, unlike when running pytest).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Install it with pip:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pip install pytest-cov&lt;/code&gt;
Usage:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pytest --cov=MAGIC-SSG tests/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I am looking for a job of automation tester. The lab8 is very helpful for me to interview the automation tester position.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Lab 7 Use Static Analysis tooling to manage project</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Fri, 05 Nov 2021 21:31:10 +0000</pubDate>
      <link>https://dev.to/yodacanada/lab-7-use-static-analysis-tooling-to-manage-project-epk</link>
      <guid>https://dev.to/yodacanada/lab-7-use-static-analysis-tooling-to-manage-project-epk</guid>
      <description>&lt;p&gt;       Lab 7 focused on managing project complexity through the use of Static Analysis tooling. My project use Python, so I run with Python &lt;a href="https://pypi.org/project/black/"&gt;Black&lt;/a&gt; and &lt;a href="https://flake8.pycqa.org/en/latest/index.html"&gt;Flake8&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  How to apply Black to format Python code
&lt;/h3&gt;

&lt;p&gt;      Black is the uncompromising Python code formatter and it is easy to install and to use. So I can save time and mental energy for more important matters.&lt;br&gt;
      Black can be &lt;strong&gt;installed&lt;/strong&gt; by running: &lt;code&gt;pip install black&lt;/code&gt;&lt;br&gt;
      Easy to &lt;strong&gt;run&lt;/strong&gt; with: &lt;code&gt;black {source_file_or_directory}&lt;/code&gt; or &lt;code&gt;python -m black {source_file_or_directory}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;      Black supports configurations and will look for configuration starting from the current working directory. By default Black looks for pyproject.toml starting from the common base directory of all files and directories passed on the command line. The pyproject.toml contains separate sections for different tools and Black is using the [tool.black] section.  &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7_9Ecg0C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gk21cwo8tq0whcze5ce7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7_9Ecg0C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gk21cwo8tq0whcze5ce7.png" alt="Image description" width="348" height="329"&gt;&lt;/a&gt;&lt;br&gt;
      After run Black, there are 2 files reformateed. One is to use double quotation marks instead of single quotation marks, and another is formatted multiple parameters in a row into multiple rows. After formatting, my code is really easier to read&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k7kElzgK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6pl9d187m4cdxwfea6xu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k7kElzgK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6pl9d187m4cdxwfea6xu.png" alt="Image description" width="800" height="514"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q0I_HgKA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hwo744pl87ra1p9wmiq5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q0I_HgKA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hwo744pl87ra1p9wmiq5.png" alt="Image description" width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How to apply a linter - Flake8
&lt;/h3&gt;

&lt;p&gt;      Flake8 is a tool officially released by Python to help detect whether Python code is standardized. Compared with pylin, which is popular at present, flake8 has flexible inspection rules, supports the integration of additional plug-ins and has strong expansibility.&lt;br&gt;
      Flake 8 can be &lt;strong&gt;installed&lt;/strong&gt; by running: &lt;code&gt;python -m pip install flake8&lt;/code&gt;&lt;br&gt;
      Easy to &lt;strong&gt;run&lt;/strong&gt; with: &lt;code&gt;flake8 path/to/code/to/check.py&lt;/code&gt; or &lt;code&gt;flake8 path/to/code/&lt;/code&gt;&lt;br&gt;
      After run Flake8, there are &lt;code&gt;W605&lt;/code&gt;, &lt;code&gt;E501&lt;/code&gt;, &lt;code&gt;E541&lt;/code&gt; issues. &lt;br&gt;
       1. Issue &lt;code&gt;W605&lt;/code&gt; is about invalid escape sequence. I solved this issue by adding "r" at the beginning of the regular expression.&lt;br&gt;
       2. Issue &lt;code&gt;W501&lt;/code&gt; is about line too long(80&amp;gt;79 characters). I create a ".flake8" file, and add a command &lt;code&gt;max-line-length = 90&lt;/code&gt;, then the issue solved.&lt;br&gt;
       3. Issue &lt;code&gt;F541&lt;/code&gt; is about f-string is missing placeholders. I solved this issue by add ad placeholder {args.config}.&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1PEexBJf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/niued42a529cxwaiawuw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1PEexBJf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/niued42a529cxwaiawuw.png" alt="Image description" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Intergration
&lt;/h3&gt;

&lt;h4&gt;
  
  
  How to create one-step solution
&lt;/h4&gt;

&lt;p&gt;      I create a new file named check.sh to provide one-step solution that use a shell script to execute the Black and flake8. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4zoUf6bf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uk65glejfccv7fzpq764.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4zoUf6bf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uk65glejfccv7fzpq764.png" alt="Image description" width="609" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How to integrate the 2 extensions into .vscode
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Create &lt;a href="https://code.visualstudio.com/docs/getstarted/settings"&gt;User and Workspace&lt;/a&gt; settings, and add "black" to the .vscode/settings.json.&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u_4Sbym0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7znxk17q8nxsa5pxu1pa.png" alt="Image description" width="800" height="224"&gt; &lt;/li&gt;
&lt;li&gt;Repeat step 1 and integrate all extensions into the json file.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cain_9Ba--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3o2q6kej3b0p5xjxoc7e.png" alt="Image description" width="597" height="213"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pre-commit hook
&lt;/h3&gt;

&lt;p&gt;      &lt;a href="https://pre-commit.com/"&gt;Git hook scripts&lt;/a&gt; are useful for identifying simple issues before submission to code review. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before you can run hooks, you need to have the pre-commit package manager installed: &lt;code&gt;pip install pre-commit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add a pre-commit configuration. I create a file named .pre-commit-config.yaml and generate a very basic configuration using pre-commit sample-config.&lt;/li&gt;
&lt;li&gt;Install the git hook scripts. I run &lt;code&gt;pre-commit install&lt;/code&gt; to set up the git hook scripts. Now pre-commit will run automatically on git commit!&lt;/li&gt;
&lt;li&gt;Add Black and Flake8 into the pre-commit file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l6sOt4Qj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/odin8tuphzxxirm18bev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l6sOt4Qj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/odin8tuphzxxirm18bev.png" alt="Image description" width="621" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reflection
&lt;/h3&gt;

&lt;p&gt;      I used to read the project on GitHub. There are many files that I don't understand what their purpose is. After I complete the lab7, I understand most of them， for instance .vscode, .pre-commit-config.yaml, contributting.md, pyproject.toml and so on.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Release0.2 week four</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Fri, 29 Oct 2021 03:06:08 +0000</pubDate>
      <link>https://dev.to/yodacanada/release02-week-four-3aj9</link>
      <guid>https://dev.to/yodacanada/release02-week-four-3aj9</guid>
      <description>&lt;p&gt;        The difficulty of this project is to be fast. The owner don't assign the issue to anyone and he only accept and merge the first PR that fixes correctly and well implements the issue following our contributing guidelines. So I must understand the project and the issue ASAP. At the same time, I have to upload the PR fist.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the project
&lt;/h3&gt;

&lt;p&gt;         &lt;a href="https://github.com/meilisearch/MeiliSearch"&gt;MeiliSearch&lt;/a&gt; is a powerful, fast, open-source, easy to use and deploy search engine. Both searching and indexing are highly customizable. Features such as typo-tolerance, filters, and synonyms are provided out-of-the-box.&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8-j_OvJq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rqk4009sv5tgfsywla2k.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8-j_OvJq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rqk4009sv5tgfsywla2k.gif" alt="Image description" width="800" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  About the issue
&lt;/h3&gt;

&lt;p&gt;        In the API Reference, the examples for the distinct attributes are introduced with movie_id which is the primary key of the index. The MeiliSearch hits are always distinct according to the unique identifier: so the primary key is the only attribute you will never put as a distinct attribute. It does not help to understand the purpose of a distinct attribute. The issue would like to apply some changes in the .code-samples.meilisearch.yaml file at the root of the repository&lt;/p&gt;

&lt;h3&gt;
  
  
  How to do
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, Look for the get_distinct_attribute_1, update_distinct_attribute_1 and reset_distinct_attribute_1 in the .code-samples.meilisearch.yaml file, then change the index parameter from 'movies' to 'shoes'.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b5nN93ko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c5i6bbfh4xqz5960eokl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b5nN93ko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c5i6bbfh4xqz5960eokl.png" alt="Image description" width="800" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second&lt;/strong&gt;, Find the update_distinct_attribute_1 in the in the .code-samples.meilisearch.yaml file, then change the from "movie_id" to 'skuid'&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--50vj_-km--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0trh39f2au9gix1eqh65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--50vj_-km--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0trh39f2au9gix1eqh65.png" alt="Image description" width="800" height="67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reflection
&lt;/h3&gt;

&lt;p&gt;         The ability to read and understand code structures and issue is very important because the owner only accept and merge the first PR that fixes correctly and well implements the issue following our contributing guidelines. In the future, I must improve my reading comprehension speed.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Release0.2 week three</title>
      <dc:creator>Jason</dc:creator>
      <pubDate>Fri, 29 Oct 2021 01:52:19 +0000</pubDate>
      <link>https://dev.to/yodacanada/release02-week-three-4mo2</link>
      <guid>https://dev.to/yodacanada/release02-week-three-4mo2</guid>
      <description>&lt;p&gt;        This project is very challenging because I need to know some knowledge about Algorithms. The project named &lt;a href="https://github.com/Yoda-Canada/fliscopt"&gt;Fliscopt&lt;/a&gt;, and it is a simple optimization library for flight scheduling and related problems in the discrete domain. The library supports plotting, asynchronous multiprocessing, and unimodal optimization benchmarks. &lt;/p&gt;

&lt;h3&gt;
  
  
  The issue
&lt;/h3&gt;

&lt;p&gt;        The &lt;a href="https://github.com/Agrover112/fliscopt/issues/35"&gt;issue&lt;/a&gt; need to add error message for failed unittests. A message indicating a failure for each unit-test, should give the user a small idea of what went wrong in the test. ex:self.assertEqual ( f(values), 0, msg ='HEURISTIC MESSAGE INDICATING WHY TEST CASE FAILED')&lt;/p&gt;

&lt;h3&gt;
  
  
  How to do
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, understand the testing structure and find the files which need to add error messages. I learned some automation testing knowledge and all test files saved in the tests folder. The run_pypy-tests.sh and run_tests.sh files implement automated testing! The test_algorithms.py, test_chaining.py and test_fitness.py need to add error messages.&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L3Nb_1S8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dap2vrfu96ifnf8bu7tf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L3Nb_1S8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dap2vrfu96ifnf8bu7tf.png" alt="Image description" width="241" height="327"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Second&lt;/strong&gt;, learned the algorithms and decided how to write the error message. This project has about a dozen algorithms, and they have different dimensions, input domain and global minimum. Here are three-dimensional images of several functions.&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JwEmyqo6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/26nc441wh6ugf665xwma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JwEmyqo6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/26nc441wh6ugf665xwma.png" alt="Image description" width="754" height="536"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NucedPEQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7glukuolv8bxhylv66w0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NucedPEQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7glukuolv8bxhylv66w0.png" alt="Image description" width="800" height="612"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uMlUxbhb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/00lo95huwcq9lsu9peic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uMlUxbhb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/00lo95huwcq9lsu9peic.png" alt="Image description" width="800" height="379"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Three&lt;/strong&gt;, according to different dimensions, input domain， global minimum and the different positions of the matrix, try to write a draft of the wrong information. Complete the task after repeated discussion and confirmation with the owner.&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Sn4in0lW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7qlyu3p0fk714s0ie36x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sn4in0lW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7qlyu3p0fk714s0ie36x.png" alt="Image description" width="800" height="354"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ay7tfXxw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/51udasm8xz4sv51mkblm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ay7tfXxw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/51udasm8xz4sv51mkblm.png" alt="Image description" width="800" height="587"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gCwfWzsk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/84qk74kie0os4zzj5hup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gCwfWzsk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/84qk74kie0os4zzj5hup.png" alt="Image description" width="800" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reflection
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;I learned some methods to write automation test code. I can try to do the automation testing work in the future.&lt;/li&gt;
&lt;li&gt;Learned some knowledge about some functions of the algorithm. Although the task was difficult, I was successfully completed through communication with the owner.&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
  </channel>
</rss>
