<?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: Minsu Kim</title>
    <description>The latest articles on DEV Community by Minsu Kim (@mkim219).</description>
    <link>https://dev.to/mkim219</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%2F703851%2F962fb081-9ae0-4e58-beeb-a58014dd4b80.png</url>
      <title>DEV Community: Minsu Kim</title>
      <link>https://dev.to/mkim219</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mkim219"/>
    <language>en</language>
    <item>
      <title>Progress Release 0.4</title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Thu, 30 Dec 2021 12:51:46 +0000</pubDate>
      <link>https://dev.to/mkim219/progress-release-04-1h2g</link>
      <guid>https://dev.to/mkim219/progress-release-04-1h2g</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The previous my blog post indicates the plan of the Release 0.4. This blog post would talk about the challenge that I have faced with. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/kokarn/tarkov-tools/issues/113"&gt;First Issue&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0fKnvNTK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvfw7uumu257s4xvbvo9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0fKnvNTK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvfw7uumu257s4xvbvo9.gif" alt="Image description" width="880" height="348"&gt;&lt;/a&gt;&lt;br&gt;
The challenge that I have faced with this issue is how to approach the issue. I have considered the solution that every time user clicks the different maps, refresh the page. But this solution is very inefficient and dirty method. I should consider different method. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/elliotchance/tracklist-editor/issues/12"&gt;Second Issue&lt;/a&gt;&lt;br&gt;
The challenge that I have faced with this issue is syntax. Since I do not have experienced with Vue.js. The highlighting the table row when mouse hover the table row cab be done with CSS. However, this method cannot be used because the input table row is also highlighted when the hovering mouse over which is the repository owner does not want to have this behavior. Therefore I have to approach different method using Vue.js&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/elliotchance/tracklist-editor/issues/13"&gt;Third Issue&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The chllange that I have faced with this issue is communication with repository owner. The issue indicates that replace the back-ticks and UTF-8 apostrophes with regular apostrophes. The issue itself is very simple. However, I did not sure where this implementation should belongs, either for displaying or parser. I interpenetrated the issue as replacement for displaying but repository owner wants to implementation on the parser.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Planning Release 0.4 </title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Thu, 30 Dec 2021 12:51:02 +0000</pubDate>
      <link>https://dev.to/mkim219/planning-release-04-2i60</link>
      <guid>https://dev.to/mkim219/planning-release-04-2i60</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The plan for release 0.4 is that I should do something outside of comfort zone which means the issue should have  more difficulty level than previous releases. &lt;/p&gt;

&lt;h2&gt;
  
  
  Issues
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/kokarn/tarkov-tools/issues/113"&gt;Issue 1&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/elliotchance/tracklist-editor/issues/12"&gt;Issue 2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/elliotchance/tracklist-editor/issues/13"&gt;Issue 3&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Description
&lt;/h2&gt;

&lt;p&gt;The issue number 1 is the video game guild website called  &lt;a href="https://dev.totarkov-tools"&gt;tarkov tools&lt;/a&gt;. The issue is that there is a bug, the zoom level persists when other maps being clicked. &lt;/p&gt;

&lt;p&gt;The issue 2 is made from Vue framework to build music tracking list. The project owner wants to add the feature that the table row should be highlighted when user hover mouse over.&lt;/p&gt;

&lt;p&gt;The issue 3 is from same repository as issue 2. This issue is enhancement that the cleanup back-ticks and UTF-8 apostrophes to regular apostrophes.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Final Release 0.4 </title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Thu, 30 Dec 2021 12:50:34 +0000</pubDate>
      <link>https://dev.to/mkim219/final-release-04-4gbj</link>
      <guid>https://dev.to/mkim219/final-release-04-4gbj</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The previous blog post talked about planning and progress. Now I would like to talk about the final release 0.4&lt;/p&gt;

&lt;h2&gt;
  
  
  First Issue
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/kokarn/tarkov-tools/issues/113"&gt;Issue&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/kokarn/tarkov-tools/pull/119"&gt;PR&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I talked about previous blog post. My first approach is failed to implement this feature because it is very inefficient that refresh the page every time user clicks the map. I have looked the project very carefully and I found that the repostirory owner used &lt;code&gt;react-zoom-pan-finch&lt;/code&gt; library to fetch the map images. I have read the &lt;a href="https://prc5.github.io/react-zoom-pan-pinch/?path=/story/docs-props--page"&gt;document&lt;/a&gt; for approach. The answer is much simpler than I think. The method called &lt;code&gt;resetTransform()&lt;/code&gt; can be accessed by &lt;code&gt;useRef&lt;/code&gt;. Create &lt;code&gt;useEffect&lt;/code&gt; to detect for changing state of &lt;code&gt;currentMap&lt;/code&gt; from &lt;code&gt;useParams&lt;/code&gt;. Every time user clicks the map, the zoom of image is reset by &lt;code&gt;ref?.current?.resetTransform()&lt;/code&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Second Issue
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/elliotchance/tracklist-editor/issues/12"&gt;Issue&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/elliotchance/tracklist-editor/pull/14"&gt;PR&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have added highlight feature with Vue.js instead of CSS only. The issue itself is very simple but I have challenged with Vue.js syntax. First, I have created the variables that receive the &lt;code&gt;TrackID&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;selectedRow: null,
deselectedRow: null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Second, I have to emit the table row ID when user hover the mouse over the table row. &lt;br&gt;
&lt;code&gt;@mouseenter="highlightTableRow(track.id)" @mouseleave="removeHighlightTableRow(track.id)"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then created functions to assign the &lt;code&gt;trackId&lt;/code&gt; with variables&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;highlightTableRow(trackId){
           this.selectedRow = trackId
},
removeHighlightTableRow(trackId){
           this.deselectedRow = trackId
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;trigger CSS with &lt;code&gt;:class&lt;/code&gt; in &lt;code&gt;&amp;lt;tr&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.highlight {
          background-color:powderblue;
}

.removeHighlight{
         background-color: white;
}
&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;:class="{'highlight': (track.id == selectedRow), 'removeHighlight': (track.id == deselectedRow)}"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Third Issue
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/elliotchance/tracklist-editor/issues/13"&gt;Issue&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/elliotchance/tracklist-editor/pull/22"&gt;PR&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;parse.js&lt;/code&gt; file contains the implementation for translating some random input into the track information. Create the &lt;code&gt;replace&lt;/code&gt; method for replace back-ticks and UTF-8 apostrophes with regular apostrophes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;track.title = track.title
            .replace(/`/g, "'")
            .replace(/[\u2018\u2019]/g, "'");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More over, replace double smart quotes with regular apostrophes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;track.title = track.title.replace(/[\u201C\u201D]/g, "\"");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add unit tests for those replacement&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
        str: '\`Leave The Door Open\`',
        lineMode: 'one-line',
        expected: [
            {number: '', title: "'Leave The Door Open'", time: ''},
        ],
    },
    {
        str: '‘Leave The Door Open’',
        lineMode: 'one-line',
        expected: [
            {number: '', title: "'Leave The Door Open'", time: ''},
        ],
    },
    {
        str: '“Leave The Door Open”',
        lineMode: 'one-line',
        expected: [
            {number: '', title: "\"Leave The Door Open\"", time: ''},
        ],
    },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Concolusion
&lt;/h2&gt;

&lt;p&gt;Throughout final release 0.4, I have learned that there is many different approaches to resolve the issue. It is very important to find proper way to resolve the issue. The one of the issue that I have used different JavaScript framework. I have learned from the last issue is that make sure I have proper communication with other person.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>SSG Release</title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Thu, 25 Nov 2021 09:07:02 +0000</pubDate>
      <link>https://dev.to/mkim219/ssg-release-2m7n</link>
      <guid>https://dev.to/mkim219/ssg-release-2m7n</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The last piece of puzzle of &lt;a href="https://github.com/mkim219/kimchi-ssg"&gt;Static Site Generator(ssg)&lt;/a&gt; development of previous 12 weeks task is releasing application. The most functionalities of SSG has been done successfully. Now it is time to release my application via package manager. &lt;/p&gt;

&lt;h2&gt;
  
  
  NuGet Package Manager
&lt;/h2&gt;

&lt;p&gt;NuGet is a free open source package manager program released by Microsoft as a visual studio development extension. The releasing application is very simple. Generate &lt;code&gt;.nupkg&lt;/code&gt; file and upload this file on NuGet website! Here is following steps for releasing my application: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure &lt;code&gt;&amp;lt;propertyGroup&amp;gt;&lt;/code&gt; project file (.csproj)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;PropertyGroup&amp;gt;
    &amp;lt;OutputType&amp;gt;Exe&amp;lt;/OutputType&amp;gt;
    &amp;lt;TargetFramework&amp;gt;net5.0&amp;lt;/TargetFramework&amp;gt;
    &amp;lt;RootNamespace&amp;gt;kimchi_ssg&amp;lt;/RootNamespace&amp;gt;
    &amp;lt;PackAsTool&amp;gt;true&amp;lt;/PackAsTool&amp;gt;
    &amp;lt;PackageId&amp;gt;Kimchi-ssg&amp;lt;/PackageId&amp;gt;
    &amp;lt;Version&amp;gt;1.0.1&amp;lt;/Version&amp;gt;
        &amp;lt;Authors&amp;gt;Minsu Kim&amp;lt;/Authors&amp;gt;
    &amp;lt;IsPackable&amp;gt;true&amp;lt;/IsPackable&amp;gt;
    &amp;lt;GeneratePackageOnBuild&amp;gt;true&amp;lt;/GeneratePackageOnBuild&amp;gt;
    &amp;lt;Description&amp;gt;Simple .NET application to generate static HTML file(s) from text and MarkDown&amp;lt;/Description&amp;gt;
    &amp;lt;PackageLicenseExpression&amp;gt;MIT&amp;lt;/PackageLicenseExpression&amp;gt;
    &amp;lt;PackageProjectUrl&amp;gt;https://github.com/mkim219/kimchi-ssg&amp;lt;/PackageProjectUrl&amp;gt;
  &amp;lt;/PropertyGroup&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Visual Studio does not generate &lt;code&gt;.nupkg&lt;/code&gt; file, &lt;code&gt;&amp;lt;IsPackable&amp;gt;true&amp;lt;/IsPackable&amp;gt;&lt;/code&gt; is required to generate &lt;code&gt;.nupkg&lt;/code&gt; file&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;There is two ways to generate &lt;code&gt;.nupkg&lt;/code&gt; file&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Build &amp;gt; Pack {Your application}&lt;/code&gt; on Visual Studio&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;dotnet pack {C# project file}&lt;/code&gt; in CLI. More detail please refer this page &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-pack"&gt;https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-pack&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the CLI, the successful message indicates the path where the &lt;code&gt;.nupkg&lt;/code&gt; file is created&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;a href="https://www.nuget.org/"&gt;Nuget&lt;/a&gt; and create account&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;a href="https://www.nuget.org/packages/manage/upload"&gt;Nuget Upload&lt;/a&gt; after login &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upload &lt;code&gt;.nupkg&lt;/code&gt;!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  GitHub Action
&lt;/h2&gt;

&lt;p&gt;Next step is creating GitHub Action for automating release. First, go to NuGet website for generating API key. Once I have API key, I create secret environment key in &lt;code&gt;setting &amp;gt; secrets &amp;gt; add new repository secret&lt;/code&gt; that I can use in CI. &lt;/p&gt;

&lt;p&gt;I found very useful publish template for C#. &lt;a href="https://github.com/marketplace/actions/publish-nuget"&gt;https://github.com/marketplace/actions/publish-nuget&lt;/a&gt;. This template provides a action to build, pack and publish packages automatically when a project version is released. The following code is added on existing &lt;code&gt;.yml&lt;/code&gt; file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    - name: publish on version change
      id: publish_nuget
      uses: rohith/publish-nuget@v2
      with:
        PROJECT_FILE_PATH: ./kimchi-ssg/kimchi-ssg.csproj
        PACKAGE_NAME: Kimchi-ssg
        VERSION_REGEX: '^\s*&amp;lt;Version&amp;gt;(.*)&amp;lt;\/Version&amp;gt;\s*$'
        NUGET_KEY: ${{secrets.KIMCHI_SSG_NUGET_KEY}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When GitHub action detects version updating on C# project file. The NuGet Package version is automatically updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback
&lt;/h2&gt;

&lt;p&gt;After I have released my package via NuGet, I have changed to review with my friend who is working on IT company as developer. I found some error that the path environment is different than Window because he uses Linux. Also, he gave me a advise that my &lt;code&gt;README.md&lt;/code&gt; is unclear and vague. I have fixed the issue that happen in the Linux environment and &lt;code&gt;README.md&lt;/code&gt; to make more understandable to reader.&lt;/p&gt;

&lt;h2&gt;
  
  
  Release
&lt;/h2&gt;

&lt;p&gt;My first release is &lt;a href="https://www.nuget.org/packages/Kimchi-ssg/1.0.3"&gt;here&lt;/a&gt;. Go to NuGet Console and enter &lt;code&gt;dotnet tool install --global Kimchi-ssg --version 1.0.3&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>csharp</category>
      <category>release</category>
    </item>
    <item>
      <title>CI &amp; Test Automation</title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Fri, 19 Nov 2021 14:27:43 +0000</pubDate>
      <link>https://dev.to/mkim219/ci-test-automation-1oja</link>
      <guid>https://dev.to/mkim219/ci-test-automation-1oja</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;The previous weekly assignment created unit test for Static Site Generator(ssg). In this week, we extend previous weekly task to implement test automation on Github action with Continuous Integration(CI).&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;

&lt;p&gt;The setting of Github Action CI Workflow is very straight forward. I have used suggested Workflows template for .NET from Github. Therefore, I just needed to configure the steps for test automation and lint.&lt;/p&gt;

&lt;p&gt;The first step is setting up .NET action. The .NET action finds a specific version of .NET from my SSG. My version of .NET is 5.0.x. Here is the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Setup .NET
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 5.0.x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second step is installing dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Install dependencies
      run: dotnet build ./kimchi-ssg/kimchi-ssg.csproj
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dotnet build&lt;/code&gt; compiles the SSG, reads through its dependencies specified in the project file, and publishes the resulting on virtual machine. &lt;/p&gt;

&lt;p&gt;The third step is setting up &lt;code&gt;Run Formatter &amp;amp; Linter&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Run Formatter &amp;amp; Linter
      run: |
        dotnet tool install --global dotnet-format --version 5.1.250
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I have installed &lt;code&gt;dotnet-format&lt;/code&gt; for detecting lint from my code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet-format --check --folder ./kimchi-ssg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code check the lint all the file from &lt;code&gt;./kimchi-ssg&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The last step is unit testing&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: Test
  run: dotnet test ./UnitTest/UnitTest.csproj
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;UnitTest.csproj&lt;/code&gt; includes test code for &lt;code&gt;Kimchi-ssg&lt;/code&gt;. The implementation code is same as I did on the &lt;code&gt;cmd&lt;/code&gt; and &lt;code&gt;terminal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The final code is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: .NET

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Setup .NET
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 5.0.x
    - name: Install dependencies
      run: dotnet build ./kimchi-ssg/kimchi-ssg.csproj
    - name: Run Formatter &amp;amp; Linter
      run: |
        dotnet tool install --global dotnet-format --version 5.1.250
        dotnet-format --check --folder ./kimchi-ssg
    - name: Test
      run: dotnet test ./UnitTest/UnitTest.csproj
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Since all the unit test that I created and the additional unit test that my partner created pass the automation test, it is time to test lint! I made lint intentionally like this&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H0JDqaMH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kd67sj64hawp6ocbvwjm.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H0JDqaMH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kd67sj64hawp6ocbvwjm.PNG" alt="lint" width="615" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and the error message is&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8EPMdu8t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hda56tqsg6x64jvj6fv1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8EPMdu8t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hda56tqsg6x64jvj6fv1.png" alt="lint-error-message" width="409" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I created a pull request for testing Lint. The CI throws error like this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x_-dk1u7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q98quzxv8bmpolj2kpcq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x_-dk1u7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q98quzxv8bmpolj2kpcq.PNG" alt="CI-error" width="880" height="227"&gt;&lt;/a&gt;&lt;br&gt;
The error message specify that there are two 29 whitespace characters on &lt;code&gt;helpers.cs&lt;/code&gt; which is the result that I expected. &lt;/p&gt;

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

&lt;p&gt;I have choose to work on JavaScript &lt;a href="https://github.com/ycechungAI/cmd-ssg"&gt;SSG application&lt;/a&gt; that created by Eugene Chung. The testing setup and environment is completely different. He has configured the Node environment whereas I have configured .NET environment on CI. Also the testing environment is different. I have used XUnit for unit testing whereas he has used the Jest for unit testing. However, I have change to work Jest for unit test on WEB422 and previous contribution on Telescope. Also he has excellent &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; for providing how to test in his application. Therefore, the testing on my partner's repo is straightforward. &lt;/p&gt;

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

&lt;p&gt;The CI is very excellent automate tool to prevent the code that includes lint and unit test the code. Sometimes I forgot to run &lt;code&gt;Linter&lt;/code&gt; command before I commit my code to repo. Since this application is open source project, other people can have unformatted code. Now I do not have to worry because CI automatically block my PR if I have lint on my code!   &lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Code Review</title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Thu, 18 Nov 2021 13:29:45 +0000</pubDate>
      <link>https://dev.to/mkim219/code-review-2ao2</link>
      <guid>https://dev.to/mkim219/code-review-2ao2</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;In the previous weeks, I had change to contribute internal Seneca opensource projects: &lt;a href="https://dev.to/mkim219/fix-the-bug-on-telescope-2d4i"&gt;fix the bug on Telescope&lt;/a&gt; and &lt;a href="https://dev.to/mkim219/ipc144-course-curriculum-renewal-5d0p"&gt;IPC144 course note renewal&lt;/a&gt;. The last piece of task is code reviewing on other student's PR. The code reviews that I have done are &lt;a href="https://github.com/Seneca-ICTOER/IPC144/pull/80"&gt;PR1&lt;/a&gt; and &lt;a href="https://github.com/Seneca-ICTOER/IPC144/pull/76"&gt;PR2&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  PR1 Code Review [&lt;a href="https://github.com/Seneca-ICTOER/IPC144/pull/80"&gt;Link&lt;/a&gt;]
&lt;/h3&gt;

&lt;p&gt;The first code review is "ASCII Collating Sequence image converted into Table" which is very similar with my IPC144 course note renewal. The reason why I had code review on this PR is that I want to know and compare how he resolved the issue. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lz3MNcXn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/duds1i6khujx87nsv4ug.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lz3MNcXn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/duds1i6khujx87nsv4ug.PNG" alt="PR1" width="808" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is Markdown code what he has done. He has smart idea to add one more column to improve readability on Docusarus. However, not only improving readability but also it helps developers to edit code for maintenance. He used &lt;code&gt;prettier&lt;/code&gt; to align all the content in right position. I had fixed my code after I have reviewed his code. &lt;/p&gt;

&lt;h3&gt;
  
  
  PR2 Code Review [&lt;a href="https://github.com/Seneca-ICTOER/IPC144/pull/76"&gt;Link&lt;/a&gt;]
&lt;/h3&gt;

&lt;p&gt;The second code review is "Audit and Fix arrays.md". The comment that I left for the code review is that there is a picture for explaining the concept of array. However, the picture did not have proper &lt;code&gt;alt&lt;/code&gt; tag in &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag. &lt;/p&gt;

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

&lt;p&gt;The &lt;code&gt;alt&lt;/code&gt; tag provides context of image that display and inform for search engine crawler which is important for SEO. Also &lt;code&gt;alt&lt;/code&gt; tag is important for accessibility perceptive &lt;/p&gt;

&lt;h3&gt;
  
  
  PR3 Code Review [&lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2468"&gt;Link&lt;/a&gt;]
&lt;/h3&gt;

&lt;p&gt;The third code review is "Fix escape character". This PR is about resolving the issue that &lt;code&gt;highlight.js&lt;/code&gt; showed bizarre behavior that the code &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; converted into &lt;code&gt;&amp;amp;amp;&amp;amp;amp;&lt;/code&gt;. The most parts are well organized and fixed. The one thing I concerned is that he deleted the code that prevent the error when no language detection. Therefore,  I left a comment about this concern. He is well explained my concern. So the PR successfully merged. &lt;/p&gt;

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

&lt;p&gt;The code review is not only helpful for the author of the code but also it is helpful to remind me the right knowledge and provide me better idea to solve the issue. &lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Fix the Bug on Telescope</title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Thu, 18 Nov 2021 10:14:58 +0000</pubDate>
      <link>https://dev.to/mkim219/fix-the-bug-on-telescope-2d4i</link>
      <guid>https://dev.to/mkim219/fix-the-bug-on-telescope-2d4i</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/Seneca-CDOT/telescope"&gt;Telescope&lt;/a&gt; is the open source project that maintains by Seneca College. The Telescope is an open source web servce and client application gathers all blog posts from variety of platforms such as WordPress, Medium, Dev Community, and many others and presenting as timeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bgyBviAR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndd98as6up51noyx51uk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bgyBviAR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndd98as6up51noyx51uk.png" alt="before-fix" width="880" height="943"&gt;&lt;/a&gt;&lt;br&gt;
 The &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2479"&gt;issue&lt;/a&gt; is one of blog post contain many lines of &lt;code&gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;p&amp;gt;&lt;/code&gt; at the end of blog post. This numerous of line break tag that wrap with paragraph tag interrupt view other blog posts.&lt;/p&gt;
&lt;h3&gt;
  
  
  Fix
&lt;/h3&gt;

&lt;p&gt;The issue is very simple to fix. In the&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;remove-empty-paragraphs.js
const cleanWhiteSpace = require('clean-whitespace');

module.exports = function (dom) {
  if (!(dom &amp;amp;&amp;amp; dom.window &amp;amp;&amp;amp; dom.window.document)) {
    return;
  }

  dom.window.document.querySelectorAll('p').forEach((p) =&amp;gt; {
    p.innerHTML = cleanWhiteSpace(p.innerHTML);
    const paragraphInnerHTML = p.innerHTML;
    if(!paragraphInnerHTML.replace(/&amp;amp;nbsp;/gm,'').trim()) {
      p.remove();
    }
  });
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The logic already has been made for the &lt;code&gt;&amp;amp;nbsp&lt;/code&gt; non-breaking space. Therefore simply add one more condition &lt;code&gt;|| paragraphInnerHTML.trim() === '&amp;lt;br&amp;gt;'&lt;/code&gt; that catch if the &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; contains only &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; tag for remove the &lt;/p&gt;
&lt;p&gt; tag. &lt;/p&gt;

&lt;h3&gt;
  
  
  challenge
&lt;/h3&gt;

&lt;p&gt;The issue supposed to be easily resolved. However there is two things that I have faced the challenge. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;remove-empty-paragraph.js&lt;/code&gt; is never called&lt;/li&gt;
&lt;li&gt;Since (1) challenge exists, I do not know my logic is correct. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The reason that &lt;code&gt;remove-empty-paragraph.js&lt;/code&gt; is not called is actually function never get called. I think the empty &lt;code&gt;&amp;amp;nbsp&lt;/code&gt; treats as edge case so I think the code was missing. Therefore I have create the code for invoking the function&lt;br&gt;
The second challenge has been resolved with the advice from David who is instructor of this course. His advice is create unit test case for testing my logic is whether pass or fail. Therefore I have created&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test('should remove &amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt; (line break)', () =&amp;gt; {
    const htmlData = toDom('&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;');
    removeEmptyParagraphs(htmlData);
    const expectedHtml = '&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;';
    expect(htmlData.window.document.body.innerHTML).toEqual(expectedHtml);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output is pass! My logic is correct but I do not see the any change on the Telescope running in local. I have no idea why my change does not reflect to the Telescope. So I have asked this issue to our Telescope Slack channel. Thankfully Josue and Duc Bui Manh helped to resolve this issue. They suggested me to delete old &lt;code&gt;redis-data&lt;/code&gt; and re-run the application that also update database to fetch the blog posts. It takes while the &lt;code&gt;elasticSearch&lt;/code&gt; crawls the all the blog posts but finally I have the expected result. &lt;/p&gt;

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

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

&lt;p&gt;During the time in Hacktoberfest, I have contributed 4 small projects. It is such a good experience to contribute to large open source project Telescope. &lt;/p&gt;

&lt;h3&gt;
  
  
  Link
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2481"&gt;PR&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>telescope</category>
    </item>
    <item>
      <title>IPC144 Course Curriculum Renewal  </title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Thu, 18 Nov 2021 09:18:55 +0000</pubDate>
      <link>https://dev.to/mkim219/ipc144-course-curriculum-renewal-5d0p</link>
      <guid>https://dev.to/mkim219/ipc144-course-curriculum-renewal-5d0p</guid>
      <description>&lt;p&gt;Our weekly tasks in this week contribute external and internal project. The one of the internal project in Seneca is &lt;a href="https://github.com/Seneca-ICTOER/IPC144"&gt;IPC144&lt;/a&gt; course curriculum renewal. The project is renewal &lt;a href="https://ict.senecacollege.ca/~ipc144/"&gt;original course note&lt;/a&gt; into &lt;a href="https://cghub.ca/"&gt;new course note&lt;/a&gt; by using &lt;a href="https://docusaurus.io/"&gt;Docusaurus&lt;/a&gt;. The design of current original course note is not user friendly and outdated. Therefore, the this open source project replaces old course note to new course note.  &lt;/p&gt;

&lt;p&gt;As I talked about Docusarus on previous week, the Docusaurus is a project for easily deploying, building, and maintaining the websites. The most part of content is implemented but the website needs contribution for reviewing and improving correctness. The &lt;a href="https://github.com/Seneca-ICTOER/IPC144/issues/67"&gt;issue&lt;/a&gt; indicates that the &lt;a href="https://cghub.ca/Resources-Appendices/ebcdic-collating-sequence"&gt;page&lt;/a&gt; uses EBCDIC Collating Sequence table as an image which is not accessible. The task should convert into text and Markdown table. &lt;/p&gt;

&lt;p&gt;The conversion itself is very simple. However, I should have to convert with extra carefulness because the task has to be manually converted which there is change that I mess up the table. The table is accessible than the image table after I converted into table.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--STFWoTGk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zd00hfhgbn5v952zd97g.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--STFWoTGk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zd00hfhgbn5v952zd97g.PNG" alt="After-Fix" width="880" height="427"&gt;&lt;/a&gt; I have created &lt;a href="https://github.com/Seneca-ICTOER/IPC144/pull/77"&gt;PR&lt;/a&gt; and received reviews from other student. I will talk about more peer review next post.  &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>docusarus</category>
    </item>
    <item>
      <title>Unit test for SSG</title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Thu, 11 Nov 2021 08:17:53 +0000</pubDate>
      <link>https://dev.to/mkim219/unit-test-for-ssg-1370</link>
      <guid>https://dev.to/mkim219/unit-test-for-ssg-1370</guid>
      <description>&lt;p&gt;Link: &lt;a href="https://github.com/mkim219/kimchi-ssg/pull/22"&gt;PR&lt;/a&gt;, &lt;a href="https://github.com/mkim219/kimchi-ssg"&gt;Repo&lt;/a&gt;&lt;br&gt;
For the task for open source development in this week is adding unit test for Static Site Generator(ssg). There are 3 testing framework options: &lt;a href="https://xunit.net/"&gt;xUnit&lt;/a&gt;, &lt;a href="https://nunit.org/"&gt;NUnit&lt;/a&gt;, and &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-mstest"&gt;MSTest&lt;/a&gt;. I have choose xUnit testing framework for unit testing because xUnit provides good documentation for creating unit test project and unit testing instruction.&lt;/p&gt;

&lt;p&gt;Next step is setting up the environment. The first step of setting up environment creates unit testing project and include ssg project. The next step is most hardest part of the task because I have made ssg with static methods which is most testing frameworks do not support. The logic of Static method is assigned to the class itself not a instance of object. Therefore I have to find alternative way to test static methods. I found interesting &lt;a href="https://www.infoworld.com/article/3571962/how-to-unit-test-static-methods-in-csharp.html"&gt;blog post&lt;/a&gt; that I can have unit test with static method! The author, Joydip Kanjilal recommends method called &lt;strong&gt;"application – by using wrapper classes and dependency injection"&lt;/strong&gt; what it is wrap static methods call in instance methods and use dependency injection to inject instance to wrapper class to be tested. Now I can have unit test with static methods with mock framework called &lt;a href="https://github.com/moq/moq"&gt;moq&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;While I was writing the unit testing code, I found some interesting bug. When user choose empty text or markdown file for generating HTML, the application crushes. Therefore I have to handle the error if user input empty text or markdown file. Previous 2 months I have focused on ssg application. The application runs fine and I thought my application is bug free. However, I have found multiple bug during the unit testing. I definitely do unit testing for making better application. &lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Formatter &amp; Linter for C#</title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Thu, 04 Nov 2021 08:29:39 +0000</pubDate>
      <link>https://dev.to/mkim219/formatter-linter-for-c-cb0</link>
      <guid>https://dev.to/mkim219/formatter-linter-for-c-cb0</guid>
      <description>&lt;p&gt;This week, I have added &lt;strong&gt;Static Analysis Tool&lt;/strong&gt; on my &lt;a href="https://github.com/mkim219/kimchi-ssg" rel="noopener noreferrer"&gt;Static Site Generator(ssg)&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/mkim219/kimchi-ssg/commits/main" rel="noopener noreferrer"&gt;commit&lt;/a&gt;. Using static analysis tool is critical in collaboration with other developers in same project because static analysis tool helps to maintain the quality of source code. The static analysis tools that I used for my ssg are: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/dotnet/format" rel="noopener noreferrer"&gt;dotnet-format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/DotNetAnalyzers/StyleCopAnalyzers" rel="noopener noreferrer"&gt;StyleCopAnalyzers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  dotnet-format
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;dotnet-format&lt;/code&gt; is a code formatter for applying style to solution to &lt;code&gt;dotnet&lt;/code&gt;. &lt;/p&gt;

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

&lt;p&gt;The installation of &lt;code&gt;dotnet-format&lt;/code&gt; can be done multiple ways. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Nuget packages for solution&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Nuget package manager console&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cmd&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Installation via &lt;code&gt;Nuget packages for solution&lt;/code&gt; in &lt;code&gt;Visual Studio 2019&lt;/code&gt; has versioning issue that requires &lt;code&gt;.NET6.0&lt;/code&gt; which is latest version and I am using &lt;code&gt;.NET5.0&lt;/code&gt;. Therefore I have installed &lt;code&gt;dotnet-format&lt;/code&gt; via &lt;code&gt;Nuget package manager console&lt;/code&gt; in &lt;code&gt;Visual Studio 2019&lt;/code&gt; with &lt;code&gt;Install-Package StyleCop.Analyzers -Version 1.1.118&lt;/code&gt;. Installation for &lt;code&gt;cmd&lt;/code&gt; can be done with &lt;code&gt;dotnet tool install --global dotnet-format --version 5.1.250801&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Implementation
&lt;/h4&gt;

&lt;p&gt;The implementation is very straightforward. The user can create &lt;code&gt;.editorconfig&lt;/code&gt; where should places same directory of &lt;code&gt;sln&lt;/code&gt; file which helps users to visualize the formatting and code style in &lt;code&gt;visual studio 2019&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x9w62bqbfpk4e4ro0kx.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x9w62bqbfpk4e4ro0kx.PNG" alt="editorconfig"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After I have verified the configuration on &lt;code&gt;.editorconfig&lt;/code&gt;. I have to create simple "one-step" solution for running formmater on the entire project form the command line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void FixFormat()
        {
            var directory = TryGetSolutionDirectoryInfo();
            var process = new Process();
            var startInfo = new ProcessStartInfo
            {
                FileName = "dotnet-format",
                Arguments = $"{directory}/kimchi-ssg.sln",
            };
            try
            {
                process.StartInfo = startInfo;
                process.Start();
                process.WaitForExit();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command for diagnose and fix the format is &lt;code&gt;dotnet-format &amp;lt;workspace&amp;gt;&lt;/code&gt;. The &lt;code&gt;workspace&lt;/code&gt; is the directory where the &lt;code&gt;sln&lt;/code&gt; places in. Therfore &lt;code&gt;TryGetSolutionDirectoryInfo()&lt;/code&gt; is iterative method for searching &lt;code&gt;sln&lt;/code&gt; file in parent directory. The &lt;code&gt;FixFormat()&lt;/code&gt; function places inside of &lt;code&gt;main&lt;/code&gt; for invoking corresponding formatting command.&lt;/p&gt;

&lt;h3&gt;
  
  
  StyleCopAnalyzers
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;StyleCop&lt;/code&gt; is a C# source code analyzer that allows to diagnose lint. The &lt;code&gt;styleCop&lt;/code&gt; analyzer itself does not have auto-linting with command line. However, the &lt;code&gt;dotnet-format&lt;/code&gt; supports to diagnose and fix the error with 3rd party analyzer.&lt;/p&gt;

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

&lt;p&gt;The installation of &lt;code&gt;StyleCopAnalyzers&lt;/code&gt; can be done via&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Nuget packages for solution&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Nuget package manager console&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the &lt;code&gt;Visual studio 2019&lt;/code&gt;, you can search the &lt;code&gt;StyleCopAnalyzers&lt;/code&gt; in the &lt;code&gt;Nuget packages for solution&lt;/code&gt; and enter the command &lt;code&gt;Install-Package StyleCop.Analyzers -Version 1.1.118&lt;/code&gt; on &lt;code&gt;Nuget package manager console&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Implementation
&lt;/h4&gt;

&lt;p&gt;The command in &lt;code&gt;dontet-format&lt;/code&gt; that support 3rd party analyzer to diagnose the lint and fix is &lt;code&gt;dotnet-format -a &amp;lt;severity&amp;gt; &amp;lt;workspace&amp;gt;&lt;/code&gt; where &lt;code&gt;&amp;lt;workspace&amp;gt;&lt;/code&gt; is the directory that has &lt;code&gt;sln&lt;/code&gt; file and &lt;code&gt;--severity&lt;/code&gt; can be refer this &lt;a href="https://docs.microsoft.com/en-us/visualstudio/code-quality/use-roslyn-analyzers?view=vs-2019" rel="noopener noreferrer"&gt;page&lt;/a&gt; for explanation. Since the error detects from IDE, I have used&lt;br&gt;
&lt;br&gt;
 ``&lt;code&gt;severity warn&lt;/code&gt;. &lt;/p&gt;

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

public static void FixLint()
        {
            var directory = TryGetSolutionDirectoryInfo();
            var process = new Process();
            var startInfo = new ProcessStartInfo
            {
                FileName = "dotnet-format",
                Arguments = $"-a warn {directory}/kimchi-ssg.sln",
            };
            try
            {
                process.StartInfo = startInfo;
                process.Start();
                process.WaitForExit();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;FixLint()&lt;/code&gt; function has similar logic with &lt;code&gt;FixFormat()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editor/IDE Development Environment
&lt;/h3&gt;

&lt;p&gt;For the sharing development environment with all contributors that work with the project, the &lt;code&gt;Visual Studio 2019&lt;/code&gt; provides the &lt;code&gt;vssettings&lt;/code&gt; file. On the &lt;code&gt;Visual Studio 2019&lt;/code&gt;, user can export their environment setting to share with other contributors. The contributors just import &lt;code&gt;vssettings&lt;/code&gt; file to work same development enviroment. &lt;/p&gt;

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

&lt;p&gt;Throughout this weekly assignment, as I mentioned many time previous blog post, it is very important to read document that involves project and package. I thougt C# does not have the tool and package that supports to auto-linting with command line. However I carefully read the document of `donet-format and there is a feature to support for auto-linting with 3rd part analyzer. Again, it is best practice to read the document when I lost. &lt;/p&gt;

&lt;p&gt;After auto-linting and auto-formatting, I realized I have a lot of formatting and linting issue in my source code. I think it is very important to write the code with formatter and linter for clean code.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Mimicking Features From Docusaurus</title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Thu, 28 Oct 2021 07:01:49 +0000</pubDate>
      <link>https://dev.to/mkim219/mimicking-features-from-docusaurus-10o1</link>
      <guid>https://dev.to/mkim219/mimicking-features-from-docusaurus-10o1</guid>
      <description>&lt;p&gt;In this week of assignment, I have done adding new features from Docusaurus to my &lt;a href="https://github.com/mkim219/kimchi-ssg"&gt;Static Site Generator(ssg)&lt;/a&gt;. The Docusaurus is the template that can easily publish the document websites. &lt;/p&gt;

&lt;p&gt;The deployment of Docusaurus on the Github pages was very straightforward. There is a need for reading a &lt;a href="https://docusaurus.io/docs/deployment"&gt;document&lt;/a&gt; which provides information about deploying Docusaurus to Github pages. After setting in &lt;code&gt;docusaurus.config.js&lt;/code&gt; and following instruction on &lt;code&gt;README.md&lt;/code&gt;, the deployment on Github pages successfully done. &lt;/p&gt;

&lt;p&gt;The features from Docusaurus that I added to my SSG are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search Engine Optimization (SEO), including &lt;code&gt;meta&lt;/code&gt; tags in the HTML head (&lt;a href="https://github.com/mkim219/kimchi-ssg/commit/98e689b8bc66de7ba545982d121fa57f58893a50"&gt;commit&lt;/a&gt;, &lt;a href="https://github.com/mkim219/kimchi-ssg/issues/21"&gt;issue&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Themes (&lt;a href="https://github.com/mkim219/kimchi-ssg/commit/89cc6d5aea1a67af8e6856c25cf54d1a408e7ea5"&gt;commit&lt;/a&gt;, &lt;a href="https://github.com/mkim219/kimchi-ssg/issues/19"&gt;issue&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Configurable Slidebar (i.e., table of contents) (&lt;a href="https://github.com/mkim219/kimchi-ssg/commit/98cb9ec0d932df6515a407a368784fbc68d379bc"&gt;commit&lt;/a&gt;, 
&lt;a href="https://github.com/mkim219/kimchi-ssg/issues/18"&gt;issue&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Search Engine Optimization (SEO)
&lt;/h3&gt;

&lt;p&gt;The SEO is the process of optimizing the website to be better visible to the search results from Google crawler "Spider". Simply if you have good SEO on your websites, you would like to have more visitors on your websites. This is crucial for earning money if your websites have advertisements and get paid by per-click.&lt;/p&gt;

&lt;p&gt;I have considered to add 3 meta name: &lt;code&gt;keyword&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt; and &lt;code&gt;author&lt;/code&gt;. When the user generates HTML files from the text and md file. The SSG asks user to enter the &lt;code&gt;keyword&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt; and &lt;code&gt;author&lt;/code&gt; for each file. Therefore, all the files have own meta data on their HTML head.&lt;/p&gt;

&lt;h3&gt;
  
  
  Theme
&lt;/h3&gt;

&lt;p&gt;I have checked that the Docusaurus has feature of dark and light mode. I have got motivated to implement this feature to my SSG. When user generate their HTML files by specifying the files or folder direcotory, the SSG use default theme setting. If the user generate HTML files by using &lt;code&gt;config.json&lt;/code&gt; then SSG provides two options &lt;code&gt;darkMode&lt;/code&gt; and 'lightMode'.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurable Slidebar
&lt;/h3&gt;

&lt;p&gt;All the websites and Docusaurus have table of contents on the left side navigation. The table of contents provides convenient to check what contents exist on the website and easily access to content. I think the &lt;code&gt;index.html&lt;/code&gt;, the homepage is required for this feature. Therefore, every time user generate the HTML file(s), the &lt;code&gt;index.html&lt;/code&gt; automatically generate as default. All the pages include the left side navigation with table of contents and has own its document(s).&lt;/p&gt;

&lt;h3&gt;
  
  
  Reflect
&lt;/h3&gt;

&lt;p&gt;The implementing the 3 features on my SSG has been done successfully as the functionality perspective. However, the design perspective, the implementation is not perfectly done. This is because I have lack of contents on the home page and I am using C# without ASP.NET which has limitation to apply design on my SSG. The next step for the feature, I will more focus on the design on my SSG.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>docusaurus</category>
    </item>
    <item>
      <title>Hacktoberfest #4</title>
      <dc:creator>Minsu Kim</dc:creator>
      <pubDate>Sat, 23 Oct 2021 07:25:01 +0000</pubDate>
      <link>https://dev.to/mkim219/hacktoberfest-4-1844</link>
      <guid>https://dev.to/mkim219/hacktoberfest-4-1844</guid>
      <description>&lt;p&gt;The last PR that I have contribute is &lt;a href="https://github.com/swapnilsparsh/ChatSociety" rel="noopener noreferrer"&gt;ChatSociety&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/swapnilsparsh/ChatSociety/pull/14" rel="noopener noreferrer"&gt;PR&lt;/a&gt;. The ChatSociety is simple chat application that user can join and have communication like Discord channel and Slack room. The &lt;a href="https://github.com/swapnilsparsh/ChatSociety/issues/13" rel="noopener noreferrer"&gt;issue&lt;/a&gt; is the scroll-view on holds very top of message even there are new message on the bottom when user joins the chat room after log-in &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1h7pq9emljwa6nu0vi28.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1h7pq9emljwa6nu0vi28.PNG" alt="issue"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This issue is very familiar to me because I have chance to use React and Hook on the &lt;a href="https://dev.to/mkim219/hacktoberfest-1-m88"&gt;Hacktoberfest#1&lt;/a&gt;. As soon as I reviewed the code, there is no &lt;code&gt;useEffect&lt;/code&gt; for controlling scroll-view side-effects in functional components like &lt;code&gt;componentDidMount&lt;/code&gt; and &lt;code&gt;componentDidUpdate&lt;/code&gt; in React class. But the project maintainer has created &lt;code&gt;useRef&lt;/code&gt; called &lt;code&gt;dummy&lt;/code&gt; for updating the scroll-view when user enter the new message. Therefore instead of having duplicate code for same functionality. I have create a function called &lt;code&gt;scrollToBottom&lt;/code&gt; which scroll to bottom with smooth animation. I have placed &lt;code&gt;scrollToBottom&lt;/code&gt; function inside of &lt;code&gt;useEffect&lt;/code&gt; and replace &lt;code&gt;ScrollToBottom&lt;/code&gt; to &lt;code&gt;SendMessage&lt;/code&gt; function where the update scroll-view when user enters the new message.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="//chatsociety.netlify.app"&gt;Sample Site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the processes of fixing the issue are very straightforward. The only part that I have little stuck is how to implement auto scroll to bottom of the page.  It is always good practice that research on the Mozilla MDN website first if I have concern with JavaScript.&lt;/p&gt;

&lt;p&gt;After I have done 4 pull requests during the Hacktoberfest, it is kind of sad that I only used React, JavaScript, HTML, and CSS. There are many open-source project written with Python and other programming language. I intended to join the open-source project that involves web development because I want to focus on web. Next year I would like to learn different languages and challenge myself to join open-source project. &lt;/p&gt;

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