<?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: Qiwen Yu</title>
    <description>The latest articles on DEV Community by Qiwen Yu (@qiwenyu).</description>
    <link>https://dev.to/qiwenyu</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%2F701330%2Fef7165e2-711b-488d-af6c-6b4e31b0501f.jpeg</url>
      <title>DEV Community: Qiwen Yu</title>
      <link>https://dev.to/qiwenyu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qiwenyu"/>
    <language>en</language>
    <item>
      <title>OSD600 Release 0.4: Release and Final Thoughts</title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Thu, 16 Dec 2021 04:09:02 +0000</pubDate>
      <link>https://dev.to/qiwenyu/osd600-release-04-release-and-final-thoughts-3ddg</link>
      <guid>https://dev.to/qiwenyu/osd600-release-04-release-and-final-thoughts-3ddg</guid>
      <description>&lt;p&gt;As approaching to the end of this semester, I have leared a lot about the open source project, such as how to contribute to an open source project, what is the contribution process and how to find a proper issue to work on.&lt;/p&gt;

&lt;p&gt;The issue[&lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2511"&gt;https://github.com/Seneca-CDOT/telescope/issues/2511&lt;/a&gt;] I worked on in the release 0.4 is about a bug fixing. To investigate the code to figure out why the referenceButtons is a null. It shows that the referenceButtons has an uncaught type error.&lt;/p&gt;

&lt;p&gt;Through investigating the code and trying to debugging this issue, I found out it is kind of difficult for me to locate the specific spot to fix this issue. I spent time on understanding the whole project structure and logic. &lt;/p&gt;

&lt;p&gt;Sometimes it took me more time on reading and understanding the code  than actually changing the code. &lt;/p&gt;

</description>
      <category>osd600</category>
      <category>opensource</category>
    </item>
    <item>
      <title>OSD600 Release 0.4: Progress </title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Thu, 16 Dec 2021 04:08:29 +0000</pubDate>
      <link>https://dev.to/qiwenyu/osd600-release-04-progress-27f5</link>
      <guid>https://dev.to/qiwenyu/osd600-release-04-progress-27f5</guid>
      <description>&lt;h2&gt;
  
  
  Updates on Issues
&lt;/h2&gt;

&lt;p&gt;At this stage of the project, I have received updates on issues, and have some thoughts on how to write pull requests to solve most issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  IBM Issue
&lt;/h2&gt;

&lt;p&gt;This &lt;a href="https://github.com/IBM/compliance-trestle/issues/883"&gt;issue&lt;/a&gt; is about creation of a customized jinja tag to insert a specific markdown content header. I have found two useful tutorials, &lt;a href="https://github.com/dldevinc/jinja2-simple-tags"&gt;https://github.com/dldevinc/jinja2-simple-tags&lt;/a&gt; and &lt;a href="https://michaelabrahamsen.com/posts/jinja2-custom-template-tags/"&gt;https://michaelabrahamsen.com/posts/jinja2-custom-template-tags/&lt;/a&gt;. With customized tag, the Python library jinja can have new functionality unique to your own project. &lt;/p&gt;

&lt;p&gt;This issue is pretty similar to what we did about static site generator for generating a complete HTML web site from raw data and files. Jinja doesn't have the functionality that IBM wants. So this issue is about to create a jinja annotation for developers to use. &lt;br&gt;
I have left the comment below this issue and communicated with the project maintainer. Turned out that, even though this issue currently shows open on the board, it actually was being fixed in another issue.&lt;br&gt;
In this case, I was not be able to get this issue assigned to me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Microsoft Issue
&lt;/h2&gt;

&lt;p&gt;This issue[&lt;a href="https://github.com/microsoft/qlib/issues/691"&gt;https://github.com/microsoft/qlib/issues/691&lt;/a&gt;] is a bug fixing issue for qlib. The module_path is wrong. This is a pretty simple issue. After contacting the project maintainer, it turned out this issue has been resolved in another issue as well. So that I couldn't get a chance to work on it as well.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Telescope issue - 01:
&lt;/h3&gt;

&lt;p&gt;This issue[&lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2521"&gt;https://github.com/Seneca-CDOT/telescope/issues/2521&lt;/a&gt;] is about to fix the backend end point url. Now the url has ":4000" inside, and it's expected to be changed into "/deploy" to the places where we are acting as a consumer of the deploy routes vs. defining them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Telescope issue - 02:
&lt;/h3&gt;

&lt;p&gt;This issue[&lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2511"&gt;https://github.com/Seneca-CDOT/telescope/issues/2511&lt;/a&gt;] is to fix a bug of an uncaught type error.&lt;/p&gt;

</description>
      <category>osd600</category>
      <category>opensource</category>
    </item>
    <item>
      <title>OSD600 Release 0.4: Plan </title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Wed, 15 Dec 2021 23:03:36 +0000</pubDate>
      <link>https://dev.to/qiwenyu/osd600-release-04-plan-2le5</link>
      <guid>https://dev.to/qiwenyu/osd600-release-04-plan-2le5</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this blog, I am going to give a brief review of what I have planed to do for this stage of the project. At this stage, we are encouraged to submit more pull requests in the GitHub open source development community, meanwhile, do  some code reviews in &lt;/p&gt;

&lt;h2&gt;
  
  
  Plan
&lt;/h2&gt;

&lt;p&gt;The plan including the issues I was trying to get assigned, including an issue from &lt;a href="https://github.com/IBM/compliance-trestle/issues/883"&gt;IBM&lt;/a&gt;, this was an issue about "Create a custom jinja tag to insert a specific markdown content header". I found this issue is interesting and doable. Another issue was from &lt;a href="https://github.com/microsoft/qlib/issues/691"&gt;Microsoft China&lt;/a&gt;, this is a project about Quant Trading. &lt;br&gt;
Moreover, since I was not sure if I could get those issues assigned, I reached out to a Seneca Open Source project &lt;a href="https://github.com/Seneca-CDOT/telescope"&gt;Telescope&lt;/a&gt;. For this project, I took two issues, the first one is a small &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2521"&gt;issue&lt;/a&gt; of update of the API url, and the second one is a larger &lt;a href="https://github.com/Seneca-CDOT/telescope/issues/2511"&gt;issue&lt;/a&gt;. This issue is about debugging the value of &lt;code&gt;referenceButton&lt;/code&gt; value of the Telescope build-log dashboard. This variable had an uncaught type error, and its details remain to be investigated through the Console log.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Review
&lt;/h2&gt;

&lt;p&gt;The most interesting part of contributing to Open Source project is reading the Code Review and providing Code Reviews. With the Seneca Open Source projects, we are given the right to give Code Reviews. So I will provide at least one Code Review during this project. &lt;/p&gt;

</description>
      <category>osd600</category>
      <category>opensource</category>
    </item>
    <item>
      <title>SPO600-Lab6, Project Stage 3: SVE2</title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Wed, 15 Dec 2021 21:20:43 +0000</pubDate>
      <link>https://dev.to/qiwenyu/spo600-lab6-project-stage-3-3668</link>
      <guid>https://dev.to/qiwenyu/spo600-lab6-project-stage-3-3668</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the previous &lt;a href="https://dev.to/qiwenyu/spo600-lab6-project-stage-2-23fk"&gt;blog&lt;/a&gt;, I introduced the Python numeric calculation package NumPy and the SIMD optimization implemented in it. I have checked 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;#ifdef _MSC_VER
     #include &amp;lt;Intrin.h&amp;gt;
 #endif
 #include &amp;lt;arm_neon.h&amp;gt;

 int main(void)
 {
     float32x4_t v1 = vdupq_n_f32(1.0f), v2 = vdupq_n_f32(2.0f);
     /* MAXMIN */
     int ret  = (int)vgetq_lane_f32(vmaxnmq_f32(v1, v2), 0);
         ret += (int)vgetq_lane_f32(vminnmq_f32(v1, v2), 0);
     /* ROUNDING */
     ret += (int)vgetq_lane_f32(vrndq_f32(v1), 0);
 #ifdef __aarch64__
     {
         float64x2_t vd1 = vdupq_n_f64(1.0), vd2 = vdupq_n_f64(2.0);
         /* MAXMIN */
         ret += (int)vgetq_lane_f64(vmaxnmq_f64(vd1, vd2), 0);
         ret += (int)vgetq_lane_f64(vminnmq_f64(vd1, vd2), 0);
         /* ROUNDING */
         ret += (int)vgetq_lane_f64(vrndq_f64(vd1), 0);
     }
 #endif
     return ret;
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As ARMv9 is approaching, I am thinking that NumPy should support the improved SIMD implementation called Scalable Vector Extensions v2 (SVE2) coming together with ARMv9.&lt;/p&gt;

&lt;h2&gt;
  
  
  SVE2
&lt;/h2&gt;

&lt;p&gt;It is important to know that the existing implementations are for fixed-width SIMD, while SVE2 is variable-width, and that AArch64 code will need to detect either at compile-time or runtime whether advanced SIMD or SVE2 SIMD instructions should be used.&lt;/p&gt;

&lt;p&gt;SVE2 is following the development of Neon architecture, which has a fixed 128-bit vector length for the instruction set. SVE is an extension to AArch64, and a superset of SVE and Neon, to allow for flexible vector length implementations. SVE improves the suitability of the architecture for High Performance Computing (HPC) applications, which require very large quantities of data processing. Particularly, SVE2 can be implemented from 128 bits up to 2048 bits with 128 bits increment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Example and Recommendation
&lt;/h2&gt;

&lt;p&gt;The code examples were provided in &lt;a href="https://developer.arm.com/documentation/dai0548/latest"&gt;official documentation&lt;/a&gt;.&lt;br&gt;
In this documentation, the &lt;strong&gt;Section B&lt;/strong&gt; of Generic Vector and Matrix Operations examples are very useful for update of NumPy SIMD optimization.&lt;/p&gt;

&lt;p&gt;They have example such as shown below for vectors dot-product with complex SP floating-point elements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct cplx_f32_t {
float re;
float im;
};
void vecdot(int64_t n, cplx_f32_t* a, cplx_f32_t* b, cplx_f32_t* c) {
cplx_f32_t acc;
acc.re = 0;
acc.im = 0;
for (int64_t i = 0; i &amp;lt; n; ++i) {
acc.re += a[i].re * b[i].re - a[i].im * b[i].im;
acc.im += a[i].re * b[i].im + a[i].im * b[i].re;
}
c-&amp;gt;re = acc.re;
c-&amp;gt;im = acc.im;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>spo</category>
      <category>simd</category>
      <category>aarch64</category>
      <category>sve2</category>
    </item>
    <item>
      <title>SPO600-Lab6, Project Stage 2: Analysis of an AArch64 SIMD Optimization</title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Wed, 15 Dec 2021 21:08:42 +0000</pubDate>
      <link>https://dev.to/qiwenyu/spo600-lab6-project-stage-2-23fk</link>
      <guid>https://dev.to/qiwenyu/spo600-lab6-project-stage-2-23fk</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;At this stage of project, I am going to focus on one of the open source projects which has applied SIMD (See Definition Below) Optimization, locate and analysis the SIMD code for AArch64 and other architectures including x86_64,  SSE/SSE2, and AVX512.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source Projects
&lt;/h2&gt;

&lt;p&gt;It is worth mentioning that all of the following projects have SIMD optimization implemented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ardour&lt;/li&gt;
&lt;li&gt;eigen&lt;/li&gt;
&lt;li&gt;ffmpeg&lt;/li&gt;
&lt;li&gt;gnuradio&lt;/li&gt;
&lt;li&gt;gromacs&lt;/li&gt;
&lt;li&gt;lame&lt;/li&gt;
&lt;li&gt;mjpegtools&lt;/li&gt;
&lt;li&gt;nettle&lt;/li&gt;
&lt;li&gt;numpy&lt;/li&gt;
&lt;li&gt;pipewire&lt;/li&gt;
&lt;li&gt;pulseaudio&lt;/li&gt;
&lt;li&gt;vlc&lt;/li&gt;
&lt;li&gt;xz&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SIMD
&lt;/h2&gt;

&lt;p&gt;SIMD optimization or SIMD operations both mean the same thing. Single instruction, multiple data (SIMD) is a type of parallel processing. SIMD describes computers with multiple processing elements that perform the same operation on multiple data points simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  numpy
&lt;/h2&gt;

&lt;p&gt;The source code of NumPy can be found &lt;a href="https://github.com/numpy/numpy" rel="noopener noreferrer"&gt;here&lt;/a&gt;. This project, NumPy is the fundamental package for scientific computing with Python. Originally Python was not designed for numeric computation. And the Numpy was created in 2005 to address this challenge. As the array size increase, Numpy gets around 30 times faster than Python List.&lt;/p&gt;

&lt;p&gt;Several years ago, a &lt;a href="https://stackoverflow.com/questions/44944367/are-numpys-basic-operations-vectorized-i-e-do-they-use-simd-operations" rel="noopener noreferrer"&gt;StackOverflow answer&lt;/a&gt; clearly pointed out, there are &lt;a href="https://github.com/numpy/numpy/blob/main/numpy/core/src/umath/simd.inc.src" rel="noopener noreferrer"&gt;SIMD vectorized operations in NumPy project&lt;/a&gt;. In this program, it was wrote as &lt;/p&gt;

&lt;p&gt;"""&lt;br&gt;
/* Currently contains sse2 functions that are built on amd64, x32 or non-generic builds (CFLAGS=-march=...) */&lt;br&gt;
"""&lt;/p&gt;

&lt;p&gt;However, this is only a simple example of SIMD optimization applied in this project.&lt;/p&gt;
&lt;h2&gt;
  
  
  Details of SIMD in NumPy
&lt;/h2&gt;

&lt;p&gt;A detailed paper published in NumPy support documentation, &lt;a href="https://numpy.org/devdocs/reference/simd/index.html" rel="noopener noreferrer"&gt;CPU/SIMD Optimizations&lt;/a&gt;, clearly states that:&lt;/p&gt;

&lt;p&gt;"""&lt;br&gt;
NumPy comes with a flexible working mechanism that allows it to harness the SIMD features that CPUs own, in order to provide faster and more stable performance on all popular platforms. Currently, NumPy supports the X86, IBM/Power, ARM7 and ARM8 architectures.&lt;br&gt;
"""&lt;/p&gt;

&lt;p&gt;Where the AArch64, aka ARM64 was first introduced with the ARMv8-A architecture. Another review paper was published &lt;a href="https://numpy.org/neps/nep-0038-SIMD-optimizations.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The SIMD optimization support for AArch64 was summarized here:&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%2Fx5n7iautvika1p0xmylb.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%2Fx5n7iautvika1p0xmylb.png" alt="SIMD AArch64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The SIMD optimization support for X86 was summarized here:&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%2F5gv2d6lud7pj4o5j0n8z.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%2F5gv2d6lud7pj4o5j0n8z.png" alt="X86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, the above StackOverflow question is outdated now, a very important Pull Request was merged in the last year, &lt;a href="https://github.com/numpy/numpy/pull/13516" rel="noopener noreferrer"&gt;ENH: enable multi-platform SIMD compiler optimizations&lt;/a&gt;. This PR is very important to trace back all of the SIMD optimization applied in NumPy, it contains both a lot of discussions on how to implement SIMD in NumPy and corresponding changed programs.&lt;/p&gt;

&lt;p&gt;Code examples, the code shown below is about the selection mechanisms for the SIMD code, including the compile-time mechanisms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#ifndef NPY_DISABLE_OPTIMIZATION
     #if defined(__powerpc64__) &amp;amp;&amp;amp; !defined(__cplusplus) &amp;amp;&amp;amp; defined(bool)
         /**
          * "altivec.h" header contains the definitions(bool, vector, pixel),
          * usually in c++ we undefine them after including the header.
          * It's better anyway to take them off and use built-in types(__vector, __pixel, __bool) instead,
          * since c99 supports bool variables which may lead to ambiguous errors.
         */
         // backup 'bool' before including '_cpu_dispatch.h', since it may not defiend as a compiler token.
         #define NPY__DISPATCH_DEFBOOL
         typedef bool npy__dispatch_bkbool;
     #endif
     #include "_cpu_dispatch.h"
     #ifdef NPY_HAVE_VSX
         #undef bool
         #undef vector
         #undef pixel
         #ifdef NPY__DISPATCH_DEFBOOL
             #define bool npy__dispatch_bkbool
         #endif
     #endif
 #endif 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In general, the SIMD code in NumPy is used for linear algebra. ARMv9 is on the horizon, and it includes an improved SIMD implementation called Scalable Vector Extensions v2 (SVE2). Now, NumPy does not support of ARMv9.  &lt;/p&gt;

&lt;p&gt;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;#ifdef _MSC_VER
     #include &amp;lt;Intrin.h&amp;gt;
 #endif
 #include &amp;lt;arm_neon.h&amp;gt;

 int main(void)
 {
     float32x4_t v1 = vdupq_n_f32(1.0f), v2 = vdupq_n_f32(2.0f);
     /* MAXMIN */
     int ret  = (int)vgetq_lane_f32(vmaxnmq_f32(v1, v2), 0);
         ret += (int)vgetq_lane_f32(vminnmq_f32(v1, v2), 0);
     /* ROUNDING */
     ret += (int)vgetq_lane_f32(vrndq_f32(v1), 0);
 #ifdef __aarch64__
     {
         float64x2_t vd1 = vdupq_n_f64(1.0), vd2 = vdupq_n_f64(2.0);
         /* MAXMIN */
         ret += (int)vgetq_lane_f64(vmaxnmq_f64(vd1, vd2), 0);
         ret += (int)vgetq_lane_f64(vminnmq_f64(vd1, vd2), 0);
         /* ROUNDING */
         ret += (int)vgetq_lane_f64(vrndq_f64(vd1), 0);
     }
 #endif
     return ret;
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code is for AArch64, might be updated for ARMv9.&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>simd</category>
      <category>numpy</category>
      <category>aarch64</category>
    </item>
    <item>
      <title>SPO600-Lab6, Project Stage 1: Algorithm Selection Lab</title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Wed, 15 Dec 2021 00:23:09 +0000</pubDate>
      <link>https://dev.to/qiwenyu/spo600-lab6-project-stage-1-algorithm-selection-lab-2429</link>
      <guid>https://dev.to/qiwenyu/spo600-lab6-project-stage-1-algorithm-selection-lab-2429</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;This is the Algorithm Selection Lab.In this lab, the goal is to investigate the impact of different algorithms which produce the same effect. Based on benchmarking, three algorithms for adjusting the volume of PCM audio samples were tested. It is crucial to remember not to compare the relative performance across different machines, because various systems have different microarchitectures, memory configurations, peripheral implementations, and clock speeds, from mobile-class to server-class (e.g. Intel Atom vs. Xeon; AMD APU vs. Threadripper; ARM Cortex-A35 vs. Neoverse-V1).&lt;/p&gt;

&lt;p&gt;However, do compare the relative performance of the various algorithms on the same machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Procedures
&lt;/h2&gt;

&lt;p&gt;Digital sound is typically represented as two streams of signed 16-bit integer signal samples. To change the volume of sound, each sample can be scaled (multiplied) by a volume factor, in the range of 0.00 (silence) to 1.00 (full volume). On a mobile device, the amount of processing required to scale sound will affect battery life.&lt;/p&gt;

&lt;p&gt;The given six programs are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vol0.c is the basic or naive algorithm, which using casting between integer and floating points. Expensive.&lt;/li&gt;
&lt;li&gt;vol1.c does the math using fixed-point calculations.&lt;/li&gt;
&lt;li&gt;vol2.c pre-calculates all 65536 different results, and then looks up the answer for each input value.&lt;/li&gt;
&lt;li&gt;vol3.c is a dummy program, negative control.&lt;/li&gt;
&lt;li&gt;vol4.c uses Single Instruction, Multiple Data (SIMD) instructions accessed through inline assembley (assembly language code inserted into a C program). &lt;strong&gt;Only for Aarch64&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;vol5.c uses SIMD instructions accessed through Complier Intrinsics. This program is also specific to &lt;strong&gt;AArch64&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Get example programs using 
&lt;code&gt;tar -xvzf spo600-volume-examples.tgz -C ~/Lab6/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Change directory to where the &lt;code&gt;Makefile&lt;/code&gt; stored. Using &lt;code&gt;make&lt;/code&gt; to compile c-scripts.&lt;/li&gt;
&lt;li&gt;Define &lt;code&gt;SAMPLES&lt;/code&gt; in the header file &lt;code&gt;vol.h&lt;/code&gt; and the scale of volume was set to &lt;strong&gt;50%&lt;/strong&gt; in this header file.&lt;/li&gt;
&lt;li&gt;The memory used by these algorithm can be measured using &lt;code&gt;free -m&lt;/code&gt; command in terminal.&lt;/li&gt;
&lt;li&gt;Simple measure of time using &lt;code&gt;time&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;Find a way to measure performance, using &lt;code&gt;#include &amp;lt;sys/time.h&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Prediction
&lt;/h3&gt;

&lt;p&gt;My prediction is that algorithms &lt;code&gt;vol5&lt;/code&gt; and &lt;code&gt;vol4&lt;/code&gt; are faster than others, &lt;code&gt;vol2&lt;/code&gt; is medium speed, while &lt;code&gt;vol1&lt;/code&gt; and &lt;code&gt;vol0&lt;/code&gt; are slowest, may vary depends on situations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test in Aarch64
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Simple test
&lt;/h3&gt;

&lt;p&gt;Simple test using &lt;code&gt;time&lt;/code&gt; command:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Questions.
&lt;/h2&gt;

&lt;p&gt;The prediction can be found at the above.&lt;/p&gt;

&lt;p&gt;Q: Measure performance&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct timbal start, stop;
float elapsed;

gettimeofday(&amp;amp;start, 0);

for (x=0; x&amp;lt; SAMPLES; x++){
  data[x] = scale_sample(data[x], 0.5);
}

gettimeofday(&amp;amp;stop, 0);

elapsed = (stop.tv_sec - start.tv_sec)*1000.0f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The running time is roughly between &lt;code&gt;start&lt;/code&gt; and &lt;code&gt;stop&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>x8664</category>
      <category>aarch64</category>
      <category>benchmarking</category>
    </item>
    <item>
      <title>SPO600-Lab5 64-bit Assembler Lab: Aarch64 VS.  X84_64</title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Tue, 14 Dec 2021 23:10:59 +0000</pubDate>
      <link>https://dev.to/qiwenyu/spo600-lab5-64-bit-assembler-lab-aarch64-vs-x8464-3m18</link>
      <guid>https://dev.to/qiwenyu/spo600-lab5-64-bit-assembler-lab-aarch64-vs-x8464-3m18</guid>
      <description>&lt;h2&gt;
  
  
  Instruction
&lt;/h2&gt;

&lt;p&gt;This lab is to experiment with assembler on the x86_64 and aarch64 platforms. &lt;/p&gt;

&lt;p&gt;Particularly, example scripts were provided in the &lt;a href="https://wiki.cdot.senecacollege.ca/wiki/SPO600_Servers"&gt;server&lt;/a&gt;. First we need to extract the content to a different folder with command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tar -xvzf spo600-assembler-lab-examples.tgz -C ~/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code examples were shown as below:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gagSnpld--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jnub2qkg7cvw37mprmjo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gagSnpld--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jnub2qkg7cvw37mprmjo.png" alt="Code Examples" width="736" height="786"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review assembly language programs using &lt;code&gt;objdump -d objectfile&lt;/code&gt;, compared to source code, X86_64 VS. Aarch64.&lt;/li&gt;
&lt;li&gt;Write loop with digit in assembly language X86_64 VS. Aarch64. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Aarch64
&lt;/h2&gt;
&lt;h3&gt;
  
  
  objdump
&lt;/h3&gt;

&lt;p&gt;Overall, the &lt;code&gt;objdump&lt;/code&gt; command is used to inspect compiled binaries. Thus, first using &lt;code&gt;gcc&lt;/code&gt; to compile &lt;code&gt;hello.c&lt;/code&gt; code to &lt;code&gt;hello&lt;/code&gt;, then using &lt;code&gt;objdump&lt;/code&gt; to inspect, taking the &lt;code&gt;main&lt;/code&gt; section as the example:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nyc3bW-U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vyobsms1f1rct030xcce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nyc3bW-U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vyobsms1f1rct030xcce.png" alt="Aarch64 hello.c main" width="880" height="265"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  loop
&lt;/h3&gt;

&lt;p&gt;The next part was to write and run loops with assembly language. For example, if you have a assembly language file &lt;code&gt;helloWorld.s&lt;/code&gt;, then you have to use command &lt;code&gt;as -g -o helloWorld.o helloWorld.s&lt;/code&gt; to compile it. And then you have to take the &lt;code&gt;helloWorld.o&lt;/code&gt; file and link it using this command &lt;code&gt;ld -o helloWorld helloWorld.o&lt;/code&gt; and then you can actually run the program using this command &lt;code&gt;./helloWorld&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The following code can give us a sequence of 'Loop: ' in the terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.text
.globl _start

min = 0                          /* starting value for the loop index; note that this is a symbol (constant) */
max = 11                         /* loop exits when the index hits this number (loop condition is i&amp;lt;max) */
ten = 10
_start:

        mov     x19, min
        mov     x17, ten
        mov     x0, 0           /* status -&amp;gt; 0 */

loop:
        mov     x0, 1           /* file descriptor: 1 is stdout */
        adr     x1, msg         /* message location (memory address) */
        mov     x2, len         /* message length (bytes) */

        mov     x18, x19        /*mov x19 into x18 */
        udiv    x9, x18, x17
        add     x13, x9, 0x30   
        msub    x10, x9, x17, x18 /*get remainder*/
        add     x14, x10, 0x30  
        adr     x15, msg        
        strb    w13, [x15, 8]   

        strb    w14, [x15, 9]  
        mov     x8, 64          /* write is syscall #64 */
        svc     0               /* invoke syscall */

        add     x19, x19, 1
        cmp     x19, max
        b.ne    loop

.data
msg:    .ascii      "Loop:  \n"
len= .- msg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  X86_64
&lt;/h2&gt;

&lt;h3&gt;
  
  
  objdump
&lt;/h3&gt;

&lt;p&gt;Similarly, the main section:&lt;/p&gt;

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

&lt;p&gt;As shown above, the compiled code in Aarch64 and X86_64 are very different.&lt;/p&gt;

&lt;h3&gt;
  
  
  loop
&lt;/h3&gt;

&lt;p&gt;The similar program to produce a list of 'Loops: ' in X86_64 was shown as below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.text
.globl  _start

_start:
        movq    $min, %r10      /*store the min vlaue into r10 as a loop index*/
        movq    $division, %r9   /*store the division value(10) into r9*/

loop:
        cmp     %r9, %r10      /*compare r10(loop index) with 10*/
        jl      digit_1          /*if r10 is less than 10, go to the subroutine digit_1*/
        jmp     digit_2          /*if r10 is greater or equal to 10, go to the subroutine digit_2*/


digit_1:
        movq    %r10, %r15      /*store the r10 value into r15*/
        add     $'0', %r15       /*add '0' to r15 so the value will be ascii number character value*/

        movq    $msg+15, %r11   /*the digit location within string*/
        movb    %r15b, (%r11)   /*store the digit at the location*/

        jmp     print           /*go to the subroutine print*/

digit_2:
        movq    $0, %rdx         /*initialize rdx to 0 for division*/
        movq    %r10, %rax     /*store the r10 value into rax for division*/
        div     %r9              /*divide rax value by 10(r9)*/

        movq    %rax, %r14    /*store the rax value(quotient) into r14*/
        movq    %rdx, %r15    /*store the rdx value(remainder) int r15*/

        add     $'0', %r14       /*add '0' to r14 so the value will be ascii number character value*/
        add     $'0', %r15       /*add '0' to r15 so the value will be ascii number character value*/

        movq    $msg+14, %r11   /*the digit location within string*/
        movb    %r14b, (%r11)   /*store the digit at the location*/

        movq    $msg+15, %r12   /*the digit loctaion within string*/
        movb    %r15b, (%r12)   /*store the digit at the location*/

        jmp     print   /*go to the subroutine print*/


print:
        movq    $len,%rdx                       /* message length */
        movq    $msg,%rsi                       /* message location */


        movq    $1,%rdi                         /* file descriptor stdout */
        movq    $1,%rax                         /* syscall sys_write */
        syscall
        inc             %r12b

        inc             %r10      /*increment loop index*/
        cmp             $max, %r10  /*compare the max with r10*/
        jne             loop      /*if the max value and the r10(loop index) value is not equal,*/
                                  /*   redo the loop subroutine*/

        movq    $0,%rdi                         /* exit status */
        movq    $60,%rax                        /* syscall sys_exit */
        syscall


.section .data
msg:    .ascii      "Loop:   \n"
        len = . - msg
min = 0
max = 10
division = 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;It is relatively straight-forward to get the loop to print a list of 'Loop: ', but it is very difficult to figure out how to make the loop to print 'Loop: 0', 'Loop: 1', ..., 'Loop: 9', 'Loop: 10'. The challenging parts include to show the digit and to show only the second digit but not to show as 'Loop: 00', 'Loop: 01' ... 'Loop: 09'.&lt;/p&gt;

</description>
      <category>assembler</category>
      <category>spo600</category>
      <category>x8664</category>
      <category>aarch64</category>
    </item>
    <item>
      <title>SPO600 Lab4(Option 4): Screen Colour Selector Part B</title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Tue, 14 Dec 2021 19:42:25 +0000</pubDate>
      <link>https://dev.to/qiwenyu/6502-lab4option-4-screen-colour-selector-part-b-1i01</link>
      <guid>https://dev.to/qiwenyu/6502-lab4option-4-screen-colour-selector-part-b-1i01</guid>
      <description>&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This dev blog is the second part of the &lt;a href="https://dev.to/qiwenyu/6502-lab4option-4-screen-colour-selector-2k25"&gt;previous one&lt;/a&gt;. In this part, I have figured out all the subroutines required and put together as the final scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Implementation
&lt;/h2&gt;



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

 lda #$00 
 sta COLOUR
 sta COLOUR_INDEX 

 jsr initialize_print ; jump to subroutine

; = get key input =
getKey:
 lda $ff
 sty $ff

 cmp #UP_KEY
 beq decrement_key

 cmp #DOWN_KEY 
 beq increment_key

 jmp getKey

decrement_key:
 lda COLOUR
 cmp #$01
 bpl decrement_colour

 jmp getKey

decrement_colour:
 dec COLOUR

 jsr initialize_print
 jsr initialize_paint
 jmp getKey

increment_key:
 lda COLOUR
 cmp #$0f
 bmi increment_colour

 jmp getKey

increment_colour:
 inc COLOUR
 jsr initialize_print
 jsr initialize_paint
 jmp getKey

; = print screen (Output) =
initialize_print:
 jsr SCINIT
        ldy #$00

title_write:
 lda title,y
        beq title_done
        jsr CHROUT
        iny
        bne title_write

title_done:
 lda #$00
 sta COLOUR_INDEX

write_colourStart:
 ora #$00
 ldy #$00

write_colourName:
 jsr select_colour
 beq write_done
 jsr toggle_highlight

 jsr CHROUT

 iny
 bne write_colourName

write_done:
 inc COLOUR_INDEX
 lda COLOUR_INDEX
 cmp #$10
 bne write_colourStart

select_colour:
 lda COLOUR_INDEX

 cmp #$00
 beq print_colour0

 cmp #$01
 beq print_colour1

 cmp #$02
 beq print_colour2

 cmp #$03
 beq print_colour3

 cmp #$04
 beq print_colour4

 cmp #$05
 beq print_colour5

 cmp #$06
 beq print_colour6

 cmp #$07
 beq print_colour7

 cmp #$08
 beq print_colour8

 cmp #$09
 beq print_colour9

 cmp #$0a
 beq print_colour10

 cmp #$0b
 beq print_colour11

 cmp #$0c
 beq print_colour12

 cmp #$0d
 beq print_colour13

 cmp #$0e
 beq print_colour14

 cmp #$0f
 beq print_colour15

 rts

print_colour0:
 lda colour0,y
 rts

print_colour1:
 lda colour1,y
 rts

print_colour2:
 lda colour2,y
 rts

print_colour3:
 lda colour3,y
 rts

print_colour4:
 lda colour4,y
 rts

print_colour5:
 lda colour5,y
 rts

print_colour6:
 lda colour6,y
 rts

print_colour7:
 lda colour7,y
 rts

print_colour8:
 lda colour8,y
 rts

print_colour9:
 lda colour9,y
 rts

print_colour10:
 lda colour10,y
 rts

print_colour11:
 lda colour11,y
 rts

print_colour12:
 lda colour12,y
 rts

print_colour13:
 lda colour13,y
 rts

print_colour14:
 lda colour14,y
 rts

print_colour15: 
 lda colour15,y
 rts

toggle_highlight:
 ldx COLOUR_INDEX
 cpx COLOUR
 beq highlight

 ora #$00
 rts

highlight:
 ora #$80
 rts

; = Screen Paint =
; = Initialize =
initialize_paint:
 lda #$00         ; set a pointer at $40 to point to $0200
        sta POINTER
        lda #$02
        sta POINTER_H

 ldy #$00

 lda COLOUR

draw_screen:
  sta ($40), y     ; set pixel

        iny              ; increment index
        bne draw_screen  ; continue until done the page

        inc $41          ; increment the page
        ldx $41          ; get the page
        cpx #$06         ; compare with 6
        bne draw_screen  ; continue until done all pages

 rts

; = for screen printing =
title:
dcb "C","o","l","o","u","r","s",13,00

colour0:
dcb "0",".",32,"B","l","a","c","k",13,00

colour1:
dcb "1",".",32,"W","h","i","t","e",13,00

colour2:
dcb "2",".",32,"R","e","d",13,00

colour3:
dcb "3",".",32,"C","y","a","n",13,00

colour4:
dcb "4",".",32,"P","u","r","p","l","e",13,00

colour5:
dcb "5",".",32","G","r","e","e","n",13,00

colour6:
dcb "6",".",32,"B","l","u","e",13,00

colour7:
dcb "7",".",32,"Y","e","l","l","o","w",13,00

colour8:
dcb "8",".",32,"O","r","a","n","g","e",13,00

colour9:
dcb "9",".",32,"B","r","o","w","n",13,00

colour10:
dcb "1","0",".",32,"L","i","g","h","t",32,"r","e","d",13,00

colour11:
dcb "1","1",".",32,"D","a","r","k",32,"g","r","e","y",13,00

colour12:
dcb "1","2",".",32,"G","r","e","y",13,00

colour13:
dcb "1","3",".",32,"L","i","g","h","t",32,"g","r","e","e","n",13,00

colour14:
dcb "1","4",".",32,"L","i","g","h","t",32,"b","l","u","e",13,00

colour15:
dcb "1","5",".",32,"L","i","g","h","t",32,"g","r","e","y",13,00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I have Learned
&lt;/h2&gt;

&lt;p&gt;From this lab, I have learned how to work with strings in assembly language. Moreover, one need to use ROM, input and output key, and implement highlight characters as well.&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>6502</category>
      <category>assembly</category>
    </item>
    <item>
      <title>Release the TextHTMLPress package to PyPI</title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Fri, 26 Nov 2021 23:18:44 +0000</pubDate>
      <link>https://dev.to/qiwenyu/release-the-texthtmlpress-package-to-pypi-3o7d</link>
      <guid>https://dev.to/qiwenyu/release-the-texthtmlpress-package-to-pypi-3o7d</guid>
      <description>&lt;p&gt;In this blog, we are focusing software releases and getting our code into the hands of users from a GitHub repository. My static html generator, &lt;a href="https://github.com/Qiwen-Yu/TextHTMLPress"&gt;TextHTMLPress&lt;/a&gt; was used as the package to be published on &lt;a href="https://pypi.org/"&gt;PyPI&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Setup the Python Packge structure
&lt;/h2&gt;

&lt;p&gt;Based on references on &lt;a href="https://stackoverflow.com/questions/44977227/how-to-configure-main-py-init-py-and-setup-py-for-a-basic-package/45143896"&gt;setup Python project&lt;/a&gt;,  &lt;a href="https://stackoverflow.com/questions/193161/what-is-the-best-project-structure-for-a-python-application"&gt;package structure&lt;/a&gt;, and a production-level &lt;a href="https://github.com/flyteorg/flytekit"&gt;Python package&lt;/a&gt;, I refactor the package as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TextHTMLPress/
|-- tests/
|   |-- inputs/
|   |-- test.py
|   |
|-- TextHTMLPress/
|   |-- __main__.py
|   |-- __init__.py
|   |-- generator.py
|   
|-- .gitignore
|-- config.yml
|-- requirements.txt
|-- LICENSE
|-- CONTRIBUTING.md
|-- setup.cfg
|-- pyproject.toml
|-- README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Write pyproject.toml and setup.cfg
&lt;/h2&gt;

&lt;p&gt;To build a Python Package with &lt;code&gt;setuptools&lt;/code&gt; and &lt;code&gt;wheel&lt;/code&gt;, &lt;a href="https://github.com/Qiwen-Yu/TextHTMLPress/blob/main/pyproject.toml"&gt;&lt;code&gt;pyproject.toml&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/Qiwen-Yu/TextHTMLPress/blob/main/setup.cfg"&gt;&lt;code&gt;setup.cfg&lt;/code&gt;&lt;/a&gt; files are required. Follow the &lt;a href="https://packaging.python.org/tutorials/packaging-projects/"&gt;documentation&lt;/a&gt;, one thing worth noting is that now, static metadata &lt;code&gt;setup.cfg&lt;/code&gt; should be preferred over &lt;code&gt;setup.py&lt;/code&gt;, and now &lt;code&gt;setup.py&lt;/code&gt; is not required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entry point
&lt;/h2&gt;

&lt;p&gt;Adding a console script entry point in &lt;code&gt;setup.cfg&lt;/code&gt; allows the package to define a user-friendly name for installers of the package to execute, seeing the &lt;a href="https://setuptools.pypa.io/en/latest/userguide/entry_point.html"&gt;reference&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build and Upload
&lt;/h2&gt;

&lt;p&gt;Register at PyPI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python -m build
python -m twine upload dist/*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final package can be found at &lt;a href="https://pypi.org/project/TextHTMLPress/1.0.1/"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>pypi</category>
      <category>release</category>
      <category>python</category>
      <category>package</category>
    </item>
    <item>
      <title>Flytekit: Create a Conda package for flytekit</title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Mon, 22 Nov 2021 07:56:33 +0000</pubDate>
      <link>https://dev.to/qiwenyu/flytekit-create-a-conda-package-for-flytekit-m4l</link>
      <guid>https://dev.to/qiwenyu/flytekit-create-a-conda-package-for-flytekit-m4l</guid>
      <description>&lt;h2&gt;
  
  
  Flyte and Flytekit
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/flyteorg/flyte"&gt;Flyte&lt;/a&gt; is a large open source community and project, which is mainly developed and maintained by Lyft. This a production-level project with hundreds of developers working on a significant sized code base spread across several repos. This type of work is often characterized by longer review cycles, stricter guidelines on what your contribution must be, and fixes that take a long time to make due to the need to read and understand big code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/flyteorg/flytekit"&gt;Flytekit&lt;/a&gt; Python is the Python Library for easily authoring, testing, deploying, and interacting with Flyte tasks, workflows, and launch plans.&lt;/p&gt;

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

&lt;p&gt;This &lt;a href="https://github.com/flyteorg/flyte/issues/1679"&gt;issue&lt;/a&gt; was to create a Conda package for flytekit, now is &lt;code&gt;pip install flytekit&lt;/code&gt;, the goal is to apply &lt;code&gt;conda install flytekit&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;The first step was to propose a proper plan to publish this package on conda. Initially, I wrote a comment addressing this issue with a &lt;a href="https://github.com/flyteorg/flyte/issues/1679#issuecomment-943851196"&gt;draft plan&lt;/a&gt;. Finally, as the first &lt;a href="https://github.com/flyteorg/flytekit/pull/731"&gt;PR&lt;/a&gt; submitted, the &lt;a href="https://github.com/flyteorg/flyte/issues/1679#issuecomment-966795132"&gt;plan was settled&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then, I recieved very useful comments from the project maintainers and submitted a follow up &lt;a href="https://github.com/flyteorg/flytekit/pull/731/commits/ae358ef648f66ddd53a9bedffa1e38da42ab9529"&gt;revision&lt;/a&gt;. This PR is still under review, but the picture is very clear right now. The &lt;code&gt;meta.yaml&lt;/code&gt; file will eventually submit to &lt;code&gt;conda-forge&lt;/code&gt; channel via the flyteorg fork of &lt;a href="https://github.com/conda-forge/staged-recipes"&gt;https://github.com/conda-forge/staged-recipes&lt;/a&gt;, following the steps in this guide: &lt;a href="https://conda-forge.org/#add_recipe"&gt;https://conda-forge.org/#add_recipe&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>flyte</category>
      <category>flytekit</category>
      <category>conda</category>
      <category>condaforge</category>
    </item>
    <item>
      <title>Code review</title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Mon, 22 Nov 2021 07:55:13 +0000</pubDate>
      <link>https://dev.to/qiwenyu/code-review-2nin</link>
      <guid>https://dev.to/qiwenyu/code-review-2nin</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;This blog is to summarize what I have done in code review for internal open source projects of Seneca College. &lt;/p&gt;

&lt;p&gt;Overall, this is my first GitHub code review experience, which is very exciting and educating. Code review is an important stage in the completion and merge of a pull request. &lt;/p&gt;

&lt;h2&gt;
  
  
  Code Review 1
&lt;/h2&gt;

&lt;p&gt;This is the one I used as the template and example to learn from. In this &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2503#pullrequestreview-811866432"&gt;code review&lt;/a&gt;, our instructor demonstrated the whole process from request a code review, add reviews to changed file (code), add comment to finish a review, and request changes as follow up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Review 2
&lt;/h2&gt;

&lt;p&gt;This is a simple &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2508#pullrequestreview-812181494"&gt;code review&lt;/a&gt; I did for the &lt;a href="https://github.com/Seneca-CDOT/telescope"&gt;Telescope&lt;/a&gt; project. This pull request (PR) was to update the version of a dependency in &lt;code&gt;package.json&lt;/code&gt; file. The changes applied in the PR were successfully deployed. In addition, I checked the changed file (raw code) and it looks good to me. In summary, my opinion is that this PR is good to be merged.&lt;/p&gt;

</description>
      <category>seneca</category>
      <category>opensource</category>
      <category>codereview</category>
    </item>
    <item>
      <title>Seneca Telescope: Update Traefik</title>
      <dc:creator>Qiwen Yu</dc:creator>
      <pubDate>Mon, 22 Nov 2021 07:54:21 +0000</pubDate>
      <link>https://dev.to/qiwenyu/seneca-telescope-update-traefik-4gfp</link>
      <guid>https://dev.to/qiwenyu/seneca-telescope-update-traefik-4gfp</guid>
      <description>&lt;h2&gt;
  
  
  Telescope
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Seneca-CDOT/telescope"&gt;Telescope&lt;/a&gt; is a tool for tracking blogs in orbit around Seneca's open source involvement. In more details, Telescope is an open source web server and client application for aggregating and presenting a timeline of Seneca's open source blogs. Telescope makes it easy to see what's happening with open source at Seneca right now. In this way, blogs posted on a variety of platforms are aggregated on one &lt;a href="https://telescope.cdot.systems/"&gt;site&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;The issue here is to update Traefik to newer version. &lt;a href="https://traefik.io/"&gt;Traefik&lt;/a&gt; is a cloud native edge router. And Traefik is a modern HTTP reverse proxy and load balancer that makes deploying microservices easy. The challenge to me is to understand the framework and structure of this project. Because Telescope uses microservices, Docker and Docker-compose. Those are frameworks I have never used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixes
&lt;/h2&gt;

&lt;p&gt;I followed the &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/docs/CONTRIBUTING.md"&gt;contributing documentation&lt;/a&gt;, and tried to setup this project both &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/docs/environment-setup.md"&gt;locally&lt;/a&gt; and on &lt;a href="https://github.com/Seneca-CDOT/telescope/blob/master/docs/gitpod.md"&gt;Gitpod&lt;/a&gt;. Gitpod is a convenient automated development tools supporting cloud development. The challenge of local setup is to install, setup, and run docker and docker-compose properly on Mac system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Finally, I checked the &lt;a href="https://doc.traefik.io/traefik/migration/v2/"&gt;changelog&lt;/a&gt;, and felt confident to migrate to v2.5 from v2.4 for Traefik. The final &lt;a href="https://github.com/Seneca-CDOT/telescope/pull/2495"&gt;PR&lt;/a&gt; was simple, just changed the image in &lt;code&gt;docker-compose.yml&lt;/code&gt; file. The newer version was tested good on Gitpod and locally by reviewers ang got merged successfully.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>telescope</category>
      <category>traefik</category>
      <category>dockercompose</category>
    </item>
  </channel>
</rss>
