<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Yang's Blog]]></title><description><![CDATA[Yang's Blog]]></description><link>https://blog.yangzheng.ca</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 20:44:08 GMT</lastBuildDate><atom:link href="https://blog.yangzheng.ca/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Google Cloud outage on June 12]]></title><description><![CDATA[THe outage on June 12, 2025, which affected Google Cloud and subsequently caused widespread internet service disruptions, was a result of multiple "small errors" accumulating throughout the development, testing, deployment, and operations.
Here are t...]]></description><link>https://blog.yangzheng.ca/google-cloud-outage-on-june-12</link><guid isPermaLink="true">https://blog.yangzheng.ca/google-cloud-outage-on-june-12</guid><category><![CDATA[google cloud]]></category><category><![CDATA[Outage]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Tue, 17 Jun 2025 19:56:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/1lfI7wkGWZ4/upload/ae790ea6fc5f276ccad6e72e81d07b0e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>THe outage on June 12, 2025, which affected Google Cloud and subsequently caused widespread internet service disruptions, was a result of multiple "small errors" accumulating throughout the development, testing, deployment, and operations.</p>
<h2 id="heading-here-are-the-key-points-that-caused-this-outage">Here are the key points that caused this outage:</h2>
<ol>
<li><strong>First Small Error: Lack of Error Handling in New Code (Development Phase)</strong></li>
</ol>
<ul>
<li><p>On May 29, 2025, the Service Control team, which manages Google's internal API management system, upgraded its quota policy function.</p>
</li>
<li><p>The new code introduced failed to include basic error handling.</p>
</li>
<li><p>This meant that if a new policy containing a null value was written into the Service Control system, it would trigger a null pointer exception, causing the entire system to crash.</p>
</li>
</ul>
<ol start="2">
<li><strong>Second Small Error: Skipping Staging Environment Testing (Testing Phase)</strong></li>
</ol>
<ul>
<li><p>Testing the new Service Control function in a shared staging environment could have impacted the daily work of 76 other Google Cloud product development teams that relied on the system.</p>
</li>
<li><p>To avoid this inconvenience, the Service Control team chose to bypass staging testing, relying instead on local unit tests.</p>
</li>
<li><p>Consequently, the null pointer exception bug remained undiscovered and made its way into the production environment.</p>
</li>
</ul>
<ol start="3">
<li><strong>Third Small Error: Real-Time Global Deployment of Policies (Deployment Phase)</strong></li>
</ol>
<ul>
<li><p>Google's product managers prioritized real-time synchronization of services over system safety.</p>
</li>
<li><p>The Service Control system used a distributed database for policy distribution.</p>
</li>
<li><p>When a new policy containing a null value was written to the database in one Google Cloud partition on June 12, 2025, all 42 global partitions simultaneously synchronized this flawed policy.</p>
</li>
<li><p>This led to a synchronized null pointer exception across all partitions at once, causing widespread system crashes.</p>
</li>
</ul>
<ol start="4">
<li><strong>Fourth Small Error: Flawed Recovery Mechanism (Operations Phase)</strong></li>
</ol>
<ul>
<li><p>Although Google's operations team quickly identified the problem and deployed a patch within 40 minutes, the Service Control system's retry mechanism was inadequate.</p>
</li>
<li><p>It lacked both random delays (randomized) and increasing delays (exponential backoff).</p>
</li>
<li><p>As a result, when the system recovered, large partitions, such as US Central One, experienced an overwhelming surge of accumulated tasks all attempting to retry simultaneously. This "stampede" of retries crashed the system again, leading to further outages in entire partitions.</p>
</li>
<li><p>This required the operations team to manually throttle tasks and redirect traffic, taking nearly three hours to clear the backlog.</p>
</li>
<li><p>Overall, Google Cloud's 76 products across 42 global partitions were affected for a total of 6 hours and 41 minutes.</p>
</li>
</ul>
<ol start="5">
<li><strong>Cascading Failure: Cloudflare's Critical Dependency on Google Cloud</strong></li>
</ol>
<ul>
<li><p>The outage was exacerbated by Cloudflare's reliance on Google Cloud.</p>
</li>
<li><p>Cloudflare, a key internet infrastructure provider, used their core KVS product, WERS KV, as a primary database for critical functions like API caches, system configurations, and user authentication.</p>
</li>
<li><p>Crucially, WERS KV was deployed on Google Cloud's servers, not Cloudflare's own.</p>
</li>
<li><p>Furthermore, Cloudflare <em>only</em> relied on Google Cloud, without redundant deployments on other platforms.</p>
</li>
<li><p>This meant that Google Cloud's failure not only brought down internet applications directly hosted on it but also caused Cloudflare, an underlying infrastructure service, to fail3. Cloudflare's subsequent outage then led to the collapse of even more platform services and internet applications, resulting in significant portions of the internet going down3.</p>
</li>
</ul>
<p>The source highlights that each of these contributing factors represented "entry-level software engineering errors" and points to systemic organizational or industry-wide deficiencies, rather than isolated major faults.</p>
<p><strong>Refs:</strong></p>
<ul>
<li><p><a target="_blank" href="https://status.cloud.google.com/incidents/ow5i3PPK96RduMcb1SsW">https://status.cloud.google.com/incidents/ow5i3PPK96RduMcb1SsW</a></p>
</li>
<li><p><a target="_blank" href="https://www.youtube.com/watch?v=eF0SFyCGWlg">https://www.youtube.com/watch?v=eF0SFyCGWlg</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Add Github SSH Auth to Windows WSL - 2023]]></title><description><![CDATA[Open WSL terminal

Enter ssh-keygen -t ed25519 -C "your_email@example.com"

Enter cat ~/.ssh/id_ed25519.pub , copy ssh key "ssh-ed25519....."

Go to https://github.com/settings/keys and log in to your Github account if you haven't done that yet.

Cli...]]></description><link>https://blog.yangzheng.ca/add-github-ssh-auth-to-windows-wsl-2023</link><guid isPermaLink="true">https://blog.yangzheng.ca/add-github-ssh-auth-to-windows-wsl-2023</guid><category><![CDATA[SSH Git]]></category><category><![CDATA[ssh]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Wed, 25 Oct 2023 03:20:12 GMT</pubDate><content:encoded><![CDATA[<ol>
<li><p>Open WSL terminal</p>
</li>
<li><p>Enter <code>ssh-keygen -t ed25519 -C "</code><a target="_blank" href="mailto:your_email@example.com"><code>your_email@example.com</code></a><code>"</code></p>
</li>
<li><p>Enter <code>cat ~/.ssh/id_ed25519.pub</code> , copy ssh key "ssh-ed25519....."</p>
</li>
<li><p>Go to <a target="_blank" href="https://github.com/settings/keys"><strong>https://github.com/settings/keys</strong></a> and log in to your Github account if you haven't done that yet.</p>
</li>
<li><p>Click <strong>New SSH key</strong>. Paste your copied public key into the text box under Key. You can also optionally input a title under Title, like "my laptop". Then click <strong>Add SSH key.</strong></p>
</li>
</ol>
<p>Try to clone a repo needs auth, when prompt "<strong>Are you sure you want to continue connecting (yes/no/[fingerprint])?</strong>", enter fingerprint(you can get it from the result of ssh-keygen). Then you will get "<strong>Please type 'yes', 'no' or the fingerprint:</strong> " prompt, enter "<strong>yes</strong>".</p>
]]></content:encoded></item><item><title><![CDATA[Fix the Bluetooth couldn't turn on problem on Ubuntu 22.04LTS]]></title><description><![CDATA[I used a newly installed Ubuntu 22.04LTS OS, and I couldn't turn on the Bluetooth.
I tried the following commands and was able to turn on the Bluetooth:
sudo apt update && sudo apt upgrade
sudo systemctl start bluetooth
rfkill unblock bluetooth
ps: r...]]></description><link>https://blog.yangzheng.ca/fix-the-bluetooth-couldnt-turn-on-problem-on-ubuntu-2204lts</link><guid isPermaLink="true">https://blog.yangzheng.ca/fix-the-bluetooth-couldnt-turn-on-problem-on-ubuntu-2204lts</guid><category><![CDATA[Ubuntu]]></category><category><![CDATA[bluetooth]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Tue, 07 Jun 2022 15:29:32 GMT</pubDate><content:encoded><![CDATA[<p>I used a newly installed Ubuntu 22.04LTS OS, and I couldn't turn on the Bluetooth.</p>
<p>I tried the following commands and was able to turn on the Bluetooth:</p>
<pre><code>sudo apt <span class="hljs-keyword">update</span> &amp;&amp; sudo apt <span class="hljs-keyword">upgrade</span>
sudo systemctl <span class="hljs-keyword">start</span> bluetooth
rfkill unblock bluetooth
</code></pre><p>ps: reboot after execute commands</p>
<p>After that, I was able to turn on Bluetooth on Ubuntu, but I had an error when I connect a pair of Jabra earphones.</p>
<p>Then tried the following way:</p>
<ol>
<li>Remove the Jabra device from Ubuntu.</li>
<li>Turn off other Bluetooth connections of the Jabra earphones.</li>
<li>Press both the left and the right buttons of the earphones to switch to connection mode.</li>
<li>Connect from Ubuntu again.</li>
</ol>
<p>Finally, connect my Bluetooth earphones to Ubuntu!</p>
]]></content:encoded></item><item><title><![CDATA[Select Nodejs version by using nvm on Ubuntu]]></title><description><![CDATA[curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
  source ~/.profile
  export NVM_DIR="$HOME/.nvm"
  [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
  [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/...]]></description><link>https://blog.yangzheng.ca/select-nodejs-version-by-using-nvm-on-ubuntu</link><guid isPermaLink="true">https://blog.yangzheng.ca/select-nodejs-version-by-using-nvm-on-ubuntu</guid><category><![CDATA[Ubuntu]]></category><category><![CDATA[Node.js]]></category><category><![CDATA[nvm]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Thu, 02 Jun 2022 23:45:12 GMT</pubDate><content:encoded><![CDATA[<pre><code>curl https:<span class="hljs-comment">//raw.githubusercontent.com/creationix/nvm/master/install.sh | bash</span>
  source ~/.profile
  export NVM_DIR=<span class="hljs-string">"<span class="hljs-subst">$HOME</span>/.nvm"</span>
  [ -s <span class="hljs-string">"<span class="hljs-subst">$NVM_DIR</span>/nvm.sh"</span> ] &amp;&amp; \. <span class="hljs-string">"<span class="hljs-subst">$NVM_DIR</span>/nvm.sh"</span>  <span class="hljs-comment"># This loads nvm</span>
  [ -s <span class="hljs-string">"<span class="hljs-subst">$NVM_DIR</span>/bash_completion"</span> ] &amp;&amp; \. <span class="hljs-string">"<span class="hljs-subst">$NVM_DIR</span>/bash_completion"</span>  <span class="hljs-comment"># This loads nvm bash_completion</span>
  nvm install node
  nvm install <span class="hljs-number">16</span>
  nvm <span class="hljs-keyword">use</span> 16
  <span class="hljs-title">npm</span> <span class="hljs-title">i</span> -<span class="hljs-title">g</span> <span class="hljs-title">yarn</span>
</code></pre>]]></content:encoded></item><item><title><![CDATA[Easy way to fix MongoDB Error: "couldn't connect to server 127.0.0.1:27017"(In Windows OS)]]></title><description><![CDATA[The MongoDB error below usually caused by the MongoDB service is stopped:
Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: No connection could be made b...]]></description><link>https://blog.yangzheng.ca/easy-way-to-fix-mongodb-error-couldnt-connect-to-server-12700127017in-windows-os</link><guid isPermaLink="true">https://blog.yangzheng.ca/easy-way-to-fix-mongodb-error-couldnt-connect-to-server-12700127017in-windows-os</guid><category><![CDATA[MongoDB]]></category><category><![CDATA[Windows]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Fri, 22 Apr 2022 16:57:50 GMT</pubDate><content:encoded><![CDATA[<h3 id="heading-the-mongodb-error-below-usually-caused-by-the-mongodb-service-is-stopped">The MongoDB error below usually caused by the MongoDB service is stopped:</h3>
<p><em>Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: No connection could be made because the target machine actively refused it. : connect@src/mongo/shell/mongo.js:372:17 @(connect):2:6 exception: connect failed exiting with code 1</em></p>
<h3 id="heading-share-an-easy-way-to-fix-that">Share an easy way to fix that:</h3>
<ul>
<li><p>Press Ctrl + Shift + Esc, open Task manager</p>
</li>
<li><p>Open the Services tab, locate MongoDB</p>
</li>
<li><p>Right-click and select Start</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Job apply suggestions for coding boot camp graduates]]></title><description><![CDATA[1. Lack of study and professional experiences
For a career changer and coding boot camp graduate, lack of study and professional experiences will be the most challenge we will face.
That will leads to no response or rejection before the first intervi...]]></description><link>https://blog.yangzheng.ca/job-apply-suggestions-for-coding-boot-camp-graduates</link><guid isPermaLink="true">https://blog.yangzheng.ca/job-apply-suggestions-for-coding-boot-camp-graduates</guid><category><![CDATA[job search]]></category><category><![CDATA[coding]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Mon, 11 Apr 2022 20:14:07 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-1-lack-of-study-and-professional-experiences">1. Lack of study and professional experiences</h2>
<p>For a career changer and coding boot camp graduate, lack of study and professional experiences will be the most challenge we will face.
That will leads to no response or rejection before the first interview.</p>
<p>Since we chose boot camp as the way we change our careers, we saved time and money for learning at University or College, we will spend more time on job searching.
Personal projects and volunteer experiences will help us shorten this process.</p>
<h2 id="heading-2-there-are-too-many-tech-skills-to-learn">2. There are too many tech skills to learn</h2>
<p>As in the tech area, things change every day, and you have too many techs to choose from. JavaScript, Java, Python, SQL, no-SQL, AWS, Asure.....
I have spent too much time expanding my tech stack. I hope I have chosen one and stick to it.
My suggestion is to stick to JavaScript and try to master it. You will use it to solve all tests you will face in interviews, and after you get a job, you will know what other techs you need to learn.</p>
<h2 id="heading-3-keep-applying">3. Keep applying</h2>
<p>Apply for 10 positions a day. 100 applications will lead you to 10 interviews, and 10 interviews will lead you to 1 offer.
This suggestion is from a friend, it fits my situation.</p>
<h2 id="heading-4-expand-your-network">4. Expand your network</h2>
<p>Networks will help you get a job, even if you didn't do well in all the above aspects.</p>
]]></content:encoded></item><item><title><![CDATA[Build a WordPress Website]]></title><description><![CDATA[#1. Find a free/paid host, sign up for an account.
I use https://freehostia.com, for more free options, visit https://smartblogger.com/free-wordpress-hosting
#2. Set up your domain's NS.
Find name servers address from your host, set NS address.
#3. I...]]></description><link>https://blog.yangzheng.ca/build-a-wordpress-website</link><guid isPermaLink="true">https://blog.yangzheng.ca/build-a-wordpress-website</guid><category><![CDATA[WordPress]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Fri, 18 Feb 2022 18:46:41 GMT</pubDate><content:encoded><![CDATA[<p>#1. Find a free/paid host, sign up for an account.</p>
<p>I use https://freehostia.com, for more free options, visit <a target="_blank" href="https://smartblogger.com/free-wordpress-hosting">https://smartblogger.com/free-wordpress-hosting</a></p>
<p>#2. Set up your domain's NS.</p>
<p>Find name servers address from your host, set NS address.</p>
<p>#3. Install WordPress on your host.</p>
<p>#4. Sign in to your wp-admin page. </p>
<p>WordPress Admin URL: http://yourdomain.com/wordpress/wp-login.php</p>
<p>#5. Choose a free theme or install your downloaded theme</p>
<p>Navigate to Appearance &gt; Themes &gt; Add New -&gt; Upload theme
Choose theme.zip file.
Wait while the theme is uploading, install and activate it.</p>
<p>#6. Set up and customize theme</p>
<p>#7. Publish website</p>
]]></content:encoded></item><item><title><![CDATA[JavaScript String Methods - part 1]]></title><description><![CDATA[.length
string.length
returns the length of a string
.slice()
string.slice(start, end)
returns the extracted part in a new string, end not included
If a parameter is negative, the position is counted from the end of the string.
If you omit the second...]]></description><link>https://blog.yangzheng.ca/javascript-string-methods-part-1</link><guid isPermaLink="true">https://blog.yangzheng.ca/javascript-string-methods-part-1</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Fri, 04 Feb 2022 20:47:33 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-length">.length</h1>
<p><code>string.length</code></p>
<p>returns the length of a string</p>
<h1 id="heading-slice">.slice()</h1>
<p><code>string.slice(start, end)</code></p>
<p>returns the extracted part in a new string, <strong>end not included</strong></p>
<p>If a parameter is negative, the position is counted from the end of the string.</p>
<p>If you omit the second parameter, the method will slice out the rest of the string.</p>
<h1 id="heading-substring">.substring()</h1>
<p><code>string.substring(start, end)</code></p>
<p>substring() is similar to slice().</p>
<p>The difference is that substring() cannot accept negative indexes.</p>
<h1 id="heading-substr">.substr()</h1>
<p><code>string.substr(start, length)</code></p>
<p>substr() is similar to slice().</p>
<p>The difference is that the second parameter specifies the length of the extracted part.</p>
<p>If you omit the second parameter, substr() will slice out the rest of the string.</p>
<p>If the first parameter is negative, the position counts from the end of the string.</p>
<h1 id="heading-replace">.replace()</h1>
<p><code>string.replace("old", "new")</code></p>
<p>The replace() method replaces a specified value with another value in a string.</p>
<p>The replace() method does not change the string it is called on.</p>
<p>The replace() method returns a new string.</p>
<p>The replace() method replaces only the first match</p>
<p>If you want to replace all matches, use a regular expression with the /g flag set. </p>
<p>To replace case insensitive, use a regular expression with an /i flag (insensitive).</p>
<p>excerpt from：<a target="_blank" href="https://www.w3schools.com/js/js_string_methods.asp">https://www.w3schools.com/js/js_string_methods.asp</a></p>
]]></content:encoded></item><item><title><![CDATA[Introduction to CSS3 - Selectors - Learnning notes]]></title><description><![CDATA[Common Selectors
Type Selector
Selects an element by its type.
h1 
Class Selector
Selects an element by the class attribute value, which may be reused multiple times per page.
.blue-button    
ID Selector
Selects an element by the ID attribute value,...]]></description><link>https://blog.yangzheng.ca/introduction-to-css3-selectors-learnning-notes</link><guid isPermaLink="true">https://blog.yangzheng.ca/introduction-to-css3-selectors-learnning-notes</guid><category><![CDATA[CSS3]]></category><category><![CDATA[learn coding]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Wed, 19 Jan 2022 19:14:53 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-common-selectors">Common Selectors</h1>
<h2 id="heading-type-selector">Type Selector</h2>
<p>Selects an element by its type.</p>
<p><code>h1</code> </p>
<h2 id="heading-class-selector">Class Selector</h2>
<p>Selects an element by the class attribute value, which may be reused multiple times per page.</p>
<p><code>.blue-button</code>    </p>
<h2 id="heading-id-selector">ID Selector</h2>
<p>Selects an element by the ID attribute value, which is unique and to only be used once per page.</p>
<p><code>#submit</code></p>
<h1 id="heading-child-selectors">Child Selectors</h1>
<h2 id="heading-descendant-selector">Descendant Selector</h2>
<p>Selects an element that resides anywhere within an identified ancestor element.</p>
<p><code>div h2</code></p>
<h2 id="heading-direct-child-selector">Direct Child Selector</h2>
<p>Selects an element that resides immediately inside an identified parent element.</p>
<p><code>div &gt; p</code></p>
<h1 id="heading-sibling-selectors">Sibling Selectors</h1>
<h2 id="heading-general-sibling-selector">General Sibling Selector</h2>
<p>Selects an element that follows anywhere after the prior element, in which both elements share the same parent</p>
<p><code>h3 ~ p</code></p>
<h2 id="heading-adjacent-sibling-selector">Adjacent Sibling Selector</h2>
<p>Selects an element that follows directly after the prior element, in which both elements share the same parent.</p>
<p><code>h3 + p</code></p>
<h1 id="heading-attribute-selectors">Attribute Selectors</h1>
<h2 id="heading-attribute-present-selector">Attribute Present Selector</h2>
<p>Selects an element if the given attribute is present</p>
<p><code>a[target]</code></p>
<h2 id="heading-attribute-equals-selector">Attribute Equals Selector</h2>
<p>Selects an element if the given attribute value exactly matches the value stated</p>
<p><code>a[href="http://google.com/"]</code></p>
<h2 id="heading-attribute-contains-selector">Attribute Contains Selector</h2>
<p>Selects an element if the given attribute value contains at least once instance of the value stated</p>
<p><code>a[href*="login"]</code></p>
<h2 id="heading-attribute-begins-with-selector">Attribute Begins With Selector</h2>
<p>Selects an element if the given attribute value begins with the value stated</p>
<p><code>a[href^="https://"]</code></p>
<h2 id="heading-attribute-ends-with-selector">Attribute Ends With Selector</h2>
<p>Selects an element if the given attribute value ends with the value stated</p>
<p><code>a[href$=".pdf"]</code></p>
<h2 id="heading-attribute-spaced-selector">Attribute Spaced Selector</h2>
<p>Selects an element if the given attribute value is whitespace-separated with one word being exactly as stated</p>
<p><code>a[rel~="tag"]</code></p>
<h2 id="heading-attribute-hyphenated-selector">Attribute Hyphenated Selector</h2>
<p>Selects an element if the given attribute value is hyphen-separated and begins with the word stated</p>
<p><code>a[lang|="en"]</code></p>
<h1 id="heading-pseudo-classes">Pseudo-classes</h1>
<h2 id="heading-link-pseudo-classes">Link Pseudo-classes</h2>
<p>Selects a link that has not been visited by a user</p>
<p><code>a:link</code></p>
<p>Selects a link that has been visited by a user</p>
<p><code>a:visited</code></p>
<h2 id="heading-user-action-pseudo-classes">User Action Pseudo-classes</h2>
<p>Selects an element when a user has hovered their cursor over it</p>
<p><code>a:hover</code></p>
<p>Selects an element when a user has engaged it</p>
<p><code>a:active</code></p>
<p>Selects an element when a user has made it their focus point</p>
<p><code>a:focus</code></p>
<h2 id="heading-user-interface-state-pseudo-classes">User Interface State Pseudo-classes</h2>
<p>Selects an element in the default enabled state</p>
<p><code>input:enabled</code></p>
<p>Selects an element in the disabled state, by way of the disabled attribute</p>
<p><code>input:disabled</code></p>
<p>Selects a checkbox or radio button that has been checked</p>
<p><code>input:checked</code></p>
<p>Selects a checkbox or radio button that neither been checked or unchecked, leaving it in an indeterminate state</p>
<p><code>input:indeterminate</code></p>
<h2 id="heading-structural-andamp-position-pseudo-classes">Structural &amp; Position Pseudo-classes</h2>
<p>Selects an element that is the first within a parent</p>
<p><code>li:first-child</code></p>
<p>Selects an element that is the last within a parent</p>
<p><code>li:last-child</code></p>
<p>Selects an element that is the only element within a parent</p>
<p><code>div:only-child</code></p>
<p>Selects an element that is the first of its type within a parent</p>
<p><code>p:first-of-type</code></p>
<p>Selects an element that is the last of its type within a parent</p>
<p><code>p:last-of-type</code></p>
<p>Selects an element that is the only of its type within a parent</p>
<p><code>img:only-of-type</code></p>
<p>Selects an element that matches the given number or expression, counting all elements from the beginning of the document tree</p>
<p><code>li:nth-child(2n+3)</code></p>
<p>Selects an element that matches the given number or expression, counting all elements from the end of the document tree</p>
<p><code>li:nth-last-child(3n+2)</code></p>
<p>Selects an element that matches the given number or expression, counting only elements of its type from the beginning of the document tree</p>
<p><code>p:nth-of-type(3n)</code></p>
<p>Selects an element that matches the given number or expression, counting only elements of its type from the end of the document tree</p>
<p><code>p:nth-last-of-type(2n+1)</code></p>
<h2 id="heading-target-pseudo-class">Target Pseudo-class</h2>
<p>Selects an element whose ID attribute value matches that of the URI fragment identifier</p>
<p><code>section:target</code></p>
<h2 id="heading-empty-pseudo-class">Empty Pseudo-class</h2>
<p>Selects an element that does not contain any children or text nodes</p>
<p><code>div:empty</code></p>
<h2 id="heading-negation-pseudo-class">Negation Pseudo-class</h2>
<p>Selects an element not represented by the stated argument</p>
<p><code>div:not(.awesome)</code></p>
<h1 id="heading-pseudo-elements">Pseudo-elements</h1>
<h2 id="heading-textual-pseudo-elements">Textual Pseudo-elements</h2>
<p>Selects the first letter of text within an element</p>
<p><code>.alpha:first-letter</code></p>
<p>Selects the first line of text within an element</p>
<p><code>.bravo:first-line</code></p>
<h2 id="heading-generated-content-pseudo-elements">Generated Content Pseudo-elements</h2>
<p>Creates a pseudo-element inside the selected element at the beginning</p>
<p><code>div:before</code></p>
<p>Creates a pseudo-element inside the selected element at the end</p>
<p><code>a:after</code></p>
<h2 id="heading-fragment-pseudo-element">Fragment Pseudo-element</h2>
<p>Selects the part of a document which has been selected, or highlighted, by a users’ actions</p>
<p><code>::selection</code></p>
<h3 id="heading-excerpted-fromhttpslearnshayhowecomadvanced-html-csscomplex-selectors">Excerpted from：https://learn.shayhowe.com/advanced-html-css/complex-selectors/</h3>
]]></content:encoded></item><item><title><![CDATA[Docker learning notes - 02]]></title><description><![CDATA[1. Fix connect error
When first start Windows computer, may face an error when using docker commands
error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/images/json": ...]]></description><link>https://blog.yangzheng.ca/docker-learning-notes-02</link><guid isPermaLink="true">https://blog.yangzheng.ca/docker-learning-notes-02</guid><category><![CDATA[Docker]]></category><category><![CDATA[learn coding]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Mon, 17 Jan 2022 18:12:56 GMT</pubDate><content:encoded><![CDATA[<h1 id="heading-1-fix-connect-error">1. Fix connect error</h1>
<p>When first start Windows computer, may face an error when using docker commands</p>
<p><code>error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/images/json": open //./pipe/docker_engine: The system cannot find the file specified.</code></p>
<p>Execute the following command in PowerShell to switch Docker daemon: </p>
<p><code>&amp; 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchDaemon</code></p>
<h1 id="heading-2-image-commands">2. Image Commands</h1>
<h2 id="heading-21-displays-the-available-commands">2.1 Displays the available commands:</h2>
<p><code>docker image --help</code></p>
<h2 id="heading-22-lists-all-the-images">2.2 Lists all the images:</h2>
<p><code>docker image ls</code></p>
<h2 id="heading-23-pulls-an-image-from-dockerhub">2.3 Pulls an image from dockerhub:</h2>
<p><code>docker image pull</code></p>
<p>docker image pull alpine</p>
<p>docker image pull alpine: 3.15</p>
<h2 id="heading-24-build-an-existing-image">2.4 Build an existing image:</h2>
<p><code>docker image build</code></p>
<h2 id="heading-25-removes-all-unused-images">2.5 Removes all unused images</h2>
<p><code>docker image prune</code></p>
<h2 id="heading-26-tags-an-image">2.6 Tags an image</h2>
<p><code>docker image tag</code></p>
<h2 id="heading-27-removes-an-image">2.7 Removes an image</h2>
<p><code>docker image rm</code></p>
<h1 id="heading-3-container-commands">3. Container Commands</h1>
<h2 id="heading-31-see-available-commands">3.1 See available commands</h2>
<p><code>docker pull --help</code></p>
<h2 id="heading-32-pulls-a-container">3.2 Pulls a container</h2>
<p><code>docker pull</code></p>
<h2 id="heading-33-lists-containers">3.3 Lists containers</h2>
<p><code>docker container ls</code></p>
<h2 id="heading-34-runs-a-container">3.4 Runs a container</h2>
<p><code>docker run</code></p>
<h2 id="heading-35-lists-all-containers">3.5 Lists all containers</h2>
<p><code>docker ps</code></p>
<h2 id="heading-36-stop-a-container">3.6 Stop a container</h2>
<p><code>docker stop</code></p>
<h2 id="heading-37-start-a-container">3.7 Start a container</h2>
<p><code>docker start</code></p>
<h2 id="heading-38-interact-with-a-container">3.8 Interact with a container</h2>
<p><code>docker exec</code></p>
<h2 id="heading-39-remove-a-stopped-container">3.9 Remove a stopped container</h2>
<p><code>docker container rm</code></p>
<h2 id="heading-310-removes-all-stopped-containers">3.10 Removes all stopped containers</h2>
<p><code>docker container prune</code></p>
<h1 id="heading-4-dockerfile">4. Dockerfile</h1>
<h2 id="heading-41-image-and-version">4.1 Image and version</h2>
<p><code>FROM</code></p>
<h2 id="heading-42-adds-file-in-build-to-the-image">4.2 Adds file in build to the image</h2>
<p><code>ADD</code></p>
<h2 id="heading-43-same-as-add-but-limited-to-the-project-directory">4.3 Same as ADD but limited to the project directory</h2>
<p><code>COPY</code></p>
<h2 id="heading-44-environment-variables">4.4 Environment variables</h2>
<p><code>ENV</code></p>
<h2 id="heading-45-ports-to-expose">4.5 Ports to expose</h2>
<p><code>EXPOSE</code></p>
<h2 id="heading-46-switch-to-a-specific-user">4.6 Switch to a specific user</h2>
<p><code>USER</code></p>
<h2 id="heading-47-set-the-working-directory">4.7 Set the working directory</h2>
<p><code>WORKDIR</code></p>
<h2 id="heading-48-command-that-needs-to-be-run-on-execution">4.8 Command that needs to be run on execution</h2>
<p><code>CMD</code></p>
<h2 id="heading-49-practice">4.9 Practice</h2>
<p>Dockerfile:</p>
<p><code>FROM node:alpine</code></p>
<p><code>COPY . /app</code></p>
<p><code>WORKDIR /app</code></p>
<p><code>CMD ["node", "app.js"]</code></p>
<p>In PowerShell:</p>
<p><code>docker build -t docker-node  .</code></p>
<p><code>docker run --rm docker-node</code></p>
]]></content:encoded></item><item><title><![CDATA[FAQ: How can I get the most out of attending a coding bootcamp?]]></title><description><![CDATA[Share my view of how to get the most out of attending a coding bootcamp.
1. Can I learn to code by just listening carefully in class?
No, it's not enough! Most students cannot understand everything the teacher teaches in class. You have to listen car...]]></description><link>https://blog.yangzheng.ca/faq-how-can-i-get-the-most-out-of-attending-a-coding-bootcamp</link><guid isPermaLink="true">https://blog.yangzheng.ca/faq-how-can-i-get-the-most-out-of-attending-a-coding-bootcamp</guid><category><![CDATA[bootcamp]]></category><category><![CDATA[learn coding]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Fri, 14 Jan 2022 21:00:24 GMT</pubDate><content:encoded><![CDATA[<h4 id="heading-share-my-view-of-how-to-get-the-most-out-of-attending-a-coding-bootcamp">Share my view of how to get the most out of attending a coding bootcamp.</h4>
<h2 id="heading-1-can-i-learn-to-code-by-just-listening-carefully-in-class">1. Can I learn to code by just listening carefully in class?</h2>
<p>No, it's not enough! Most students cannot understand everything the teacher teaches in class. You have to listen carefully and follow the teacher, but you need more practice to make the knowledge your own.</p>
<h2 id="heading-2-how-should-i-study-in-a-coding-bootcamp">2. How should I study in a coding bootcamp?</h2>
<p>Pre-read the material before class, summarize what you don't understand, listen carefully in class, and look for answers.</p>
<p>Ask questions you don't understand.</p>
<p>Practice more after class. If the exercises provided in the course are not enough, you can ask your teacher and TA to recommend more exercises or tutorials.</p>
<h2 id="heading-3-how-many-hours-a-day-should-i-spend-studying-and-practicing-coding">3. How many hours a day should I spend studying and practicing coding?</h2>
<p>As much as you can.</p>
<h2 id="heading-4-what-will-i-get-at-the-end-of-this-course">4. What will I get at the end of this course?</h2>
<p>You will get basic javascript full-stack web development knowledge, a project to showcase your skills, and most importantly, you will have the skills to continue learning and self-learning.</p>
]]></content:encoded></item><item><title><![CDATA[Docker learning notes - 01]]></title><description><![CDATA[1. Check Docker version:
docker --version
2. Run Container
docker run -it alpine
3. Check who am I
whoami
root
4. Check where am I
pwd
\
5. List and Navigate
ls
cd
cd .. && ls
6. Files and Directories
mkdir  touch  mv echo  cat  rm  more  less  head ...]]></description><link>https://blog.yangzheng.ca/docker-learning-notes-01</link><guid isPermaLink="true">https://blog.yangzheng.ca/docker-learning-notes-01</guid><category><![CDATA[Docker]]></category><category><![CDATA[learn coding]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Fri, 14 Jan 2022 18:02:07 GMT</pubDate><content:encoded><![CDATA[<h3 id="heading-1-check-docker-version">1. Check Docker version:</h3>
<p><code>docker --version</code></p>
<h3 id="heading-2-run-container">2. Run Container</h3>
<p><code>docker run -it alpine</code></p>
<h3 id="heading-3-check-who-am-i">3. Check who am I</h3>
<p><code>whoami</code></p>
<p>root</p>
<h3 id="heading-4-check-where-am-i">4. Check where am I</h3>
<p><code>pwd</code></p>
<p>\</p>
<h3 id="heading-5-list-and-navigate">5. List and Navigate</h3>
<p><code>ls</code></p>
<p><code>cd</code></p>
<p><code>cd .. &amp;&amp; ls</code></p>
<h3 id="heading-6-files-and-directories">6. Files and Directories</h3>
<p><code>mkdir</code>  <code>touch</code>  <code>mv</code> <code>echo</code>  <code>cat</code>  <code>rm</code>  <code>more</code>  <code>less</code>  <code>head</code>  <code>tail</code></p>
<h3 id="heading-7-exiting-and-cleanup">7. Exiting and Cleanup</h3>
<h4 id="heading-containers">Containers</h4>
<p><code>docker ps</code></p>
<p><code>docker container ls -a</code></p>
<p><code>docker container prune</code></p>
<h4 id="heading-images">Images</h4>
<p><code>docker image ls -a</code></p>
<p><code>docker image prune</code></p>
<h3 id="heading-8-install-vim-in-alpine">8. Install vim in Alpine</h3>
<p><code>apk update</code></p>
<p><code>apk add vim</code></p>
<h3 id="heading-9-save-and-exit-in-vim">9. Save and exit in vim</h3>
<p><code>:w</code> save</p>
<p><code>:q</code> exit</p>
<p><code>:q!</code> exit and throw unsaved change.  </p>
]]></content:encoded></item><item><title><![CDATA[FAQ for the my-first-site practice]]></title><description><![CDATA[Summarize of common issues we faced in  my-first-site  practice:
1. Authentication issues:
In the terminal of VS code, execute the following codes to set up your GitHub account.
git config --global user.name <github userID>
eg: git config --global us...]]></description><link>https://blog.yangzheng.ca/faq-for-the-my-first-site-practice</link><guid isPermaLink="true">https://blog.yangzheng.ca/faq-for-the-my-first-site-practice</guid><category><![CDATA[GitHub]]></category><category><![CDATA[Visual Studio Code]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Wed, 12 Jan 2022 18:44:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1642012819295/L-s3n2egux.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Summarize of common issues we faced in  <a target="_blank" href="https://github.com/ComITorg/ComIT_Node_Saskatoon/blob/main/first-site.md">my-first-site</a>  practice:</p>
<h2 id="heading-1-authentication-issues">1. Authentication issues:</h2>
<p>In the terminal of VS code, execute the following codes to set up your GitHub account.</p>
<p><code>git config --global user.name &lt;github userID&gt;</code></p>
<p><em>eg: <code>git config --global user.name mygithubusername</code></em></p>
<p><code>git config --global user.email &lt;github email&gt;</code></p>
<p><em>eg: <code>git config --global user.email myemailforgithub@gmail.com</code></em></p>
<p>When you proceed to execute <code>git push -u origin main</code>
, you will be promoted to an authentication window, you can simply choose to <strong>Sign in with Browser</strong> to authorize VS code to connect to your GitHub account or use username and password.</p>
<p>If you still have issues with authentication, you can choose to use SSH, I wrote a simple guide -  <a target="_blank" href="https://blog.yangzheng.ca/how-to-use-ssh-to-log-into-github-from-vs-code">how to use SSH to log into GitHub guide from VS code</a>.</p>
<h2 id="heading-2-execute-code-at-the-wrong-path">2. Execute code at the wrong path:</h2>
<p>You have to execute code like <code>git init</code> in the path of the my-first-site folder.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642012631942/PkbTJYdXp.png" alt="image.png" /></p>
<p>For beginners, to navigate in the command line interface, use <code>cd foldername</code> to change the working directory to "foldername", use <code>cd ..</code> to change the working directory to the parent folder of the current folder, use <code>ls</code> to show all folders and files of the current folder.</p>
<h2 id="heading-3-how-to-redo-the-practice">3. How to redo the practice:</h2>
<p>If you are stuck somewhere and would like to redo the practice, you will need to delete the hidden <strong>.git</strong> folder inside my-first-site folder, then start from executing <code>git init</code>.</p>
<p>Another way is to create a new folder and start from creating index.html, scripts.js and styles.css.</p>
<h2 id="heading-4-why-the-website-didnt-show-up">4. Why the website didn't show up</h2>
<p>GitHub pages need about 2 - 5 minutes to show up after the initial setting. </p>
<p>The same as the initial setting, if you made some changes to your code, and push the code to the GitHub repo which you have already set up GitHub pages, you also need to wait about 2 - 5 minutes to see the changes on the website.</p>
]]></content:encoded></item><item><title><![CDATA[How to use SSH to log into Github from VS Code]]></title><description><![CDATA[Before August 13, 2021, you can simply use a Github username and password in VS Code terminal to log into Github. But now that's no longer possible. We can use either SSH or personal access token to log into Github from VS Code. 
I will introduce the...]]></description><link>https://blog.yangzheng.ca/how-to-use-ssh-to-log-into-github-from-vs-code</link><guid isPermaLink="true">https://blog.yangzheng.ca/how-to-use-ssh-to-log-into-github-from-vs-code</guid><category><![CDATA[GitHub]]></category><category><![CDATA[Visual Studio Code]]></category><category><![CDATA[ssh]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Tue, 11 Jan 2022 16:46:39 GMT</pubDate><content:encoded><![CDATA[<p>Before August 13, 2021, you can simply use a Github username and password in VS Code terminal to log into Github. But now that's no longer possible. We can use either <strong>SSH</strong> or <strong>personal access token</strong> to log into Github from VS Code. </p>
<p>I will introduce the easier way - SSH, in this post.</p>
<p>Steps:</p>
<ol>
<li>Open a terminal in VS Code.</li>
<li>Enter <code>ssh-keygen</code> in the terminal, and press the enter key.</li>
<li>There will be prompted for a “passphrase” (i.e., password). If you decide to not set a password, just press the enter key. Otherwise, input a password (no need to be the same as your Github password), then press the enter key, then input the password again, then press the enter key. </li>
<li>Enter <code>cat ~/.ssh/id_rsa.pub</code> in the terminal, and press the enter key. Your "public key" will be shown in the terminal. Copy the public key, from "ssh-rsa" to the end.</li>
<li>Go to  <a target="_blank" href="https://github.com/settings/keys">https://github.com/settings/keys</a> and log in to your Github account if you haven't done that yet.</li>
<li>Click <strong> New SSH key </strong> . Paste your copied public key into the text box under <strong>Key</strong>. You can also optionally input a title under Title, like "my laptop". Then click <strong>Add SSH key</strong>.</li>
</ol>
<p>Now you are all set to log into Github from your VS Code. If you input a password in step 3, you might be asked to enter that.</p>
]]></content:encoded></item><item><title><![CDATA[How to use an SSH tunnel and MySQL Workbench to connect to a MySQL instance that uses an AWS public EC2 instance?]]></title><description><![CDATA[Open MySQL Workbench.

Select MySQL New Connection and enter a connection name.

Choose the Connection Method, and select Standard TCP/IP over SSH.

For SSH Hostname, enter the public IP address of your EC2 instance.

For SSH Username, enter the defa...]]></description><link>https://blog.yangzheng.ca/how-to-use-an-ssh-tunnel-and-mysql-workbench-to-connect-to-a-mysql-instance-that-uses-an-aws-public-ec2-instance</link><guid isPermaLink="true">https://blog.yangzheng.ca/how-to-use-an-ssh-tunnel-and-mysql-workbench-to-connect-to-a-mysql-instance-that-uses-an-aws-public-ec2-instance</guid><category><![CDATA[AWS]]></category><category><![CDATA[MySQL]]></category><category><![CDATA[ec2]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Mon, 27 Sep 2021 22:10:08 GMT</pubDate><content:encoded><![CDATA[<ol>
<li><p>Open MySQL Workbench.</p>
</li>
<li><p>Select MySQL New Connection and enter a connection name.</p>
</li>
<li><p>Choose the Connection Method, and select <strong>Standard TCP/IP over SSH</strong>.</p>
</li>
<li><p>For SSH Hostname, enter the <strong>public IP address</strong> of your EC2 instance.</p>
</li>
<li><p>For SSH Username, enter the <strong>default SSH user name</strong> to connect to your EC2 instance.</p>
</li>
<li><p>Choose SSH Key File, and select <strong>the .pem file</strong> used to connect from your file system.</p>
</li>
<li><p>For MySQL Hostname, enter the <strong>database endpoint name</strong>.</p>
</li>
<li><p>For MySQL Server Port, enter the port number that you use to connect to your database.</p>
</li>
<li><p>For Username, enter the user name that you use to <strong>connect to your database</strong>.</p>
</li>
<li><p>For Password, enter <strong>the MySQL user password</strong>.</p>
</li>
<li><p>Choose Test Connection. After the test is successful, choose OK to save the connection.</p>
</li>
</ol>
<p>After the connection is configured, you can connect to your private RDS DB instance using an SSH tunnel. </p>
<p>(Excerpted from AWS Q&amp;A)</p>
]]></content:encoded></item><item><title><![CDATA[Cheatsheet for Installing MySQL on AWS]]></title><description><![CDATA[1. Create an AWS EC2 instance.
2. Connect to the instance.
3. Install MySQL

sudo su

yum install wget -y

wget https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm

md5sum mysql80-community-release-el8-1.noarch.rpm

rpm -ivh rpm -ivh...]]></description><link>https://blog.yangzheng.ca/cheatsheet-for-installing-mysql-on-aws</link><guid isPermaLink="true">https://blog.yangzheng.ca/cheatsheet-for-installing-mysql-on-aws</guid><category><![CDATA[MySQL]]></category><category><![CDATA[AWS]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Mon, 27 Sep 2021 17:45:59 GMT</pubDate><content:encoded><![CDATA[<h3 id="1-create-an-aws-ec2-instance">1. Create an AWS EC2 instance.</h3>
<h3 id="2-connect-to-the-instance">2. Connect to the instance.</h3>
<h3 id="3-install-mysql">3. Install MySQL</h3>
<pre><code>
sudo su

yum <span class="hljs-keyword">install</span> wget -y

wget https://dev.mysql.com/<span class="hljs-keyword">get</span>/mysql80-community-<span class="hljs-keyword">release</span>-el8<span class="hljs-number">-1.</span>noarch.rpm

md5sum mysql80-community-<span class="hljs-keyword">release</span>-el8<span class="hljs-number">-1.</span>noarch.rpm

rpm -ivh rpm -ivh mysql80-community-<span class="hljs-keyword">release</span>-el8<span class="hljs-number">-1.</span>noarch.rpm

yum <span class="hljs-keyword">module</span> <span class="hljs-keyword">disable</span> mysql 
y

yum <span class="hljs-keyword">install</span> mysql-community-<span class="hljs-keyword">server</span>

systemctl <span class="hljs-keyword">start</span> mysqld

systemctl <span class="hljs-keyword">status</span> mysqld

ps -ef | grep mysql

cat /<span class="hljs-keyword">var</span>/<span class="hljs-keyword">log</span>/mysqld.log|grep temp

mysql -u root -p mysql

mysqladmin -u root -p <span class="hljs-keyword">password</span>

mysql -u root -p mysql

<span class="hljs-keyword">select</span> * <span class="hljs-keyword">from</span> mysql.time_zone;

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
</code></pre>]]></content:encoded></item><item><title><![CDATA[Add MySQL path to System variables in Windows 10]]></title><description><![CDATA[Right-click "This Computer";

Click "Properties";

Click the "Advanced" tab;

Click "Environment Variables";

Select the “Path” variable in System variables;

Click “Edit”;

Click "New";

Paste "C:\Program Files\MySQL\MySQL Server 8.0\bin".
*Confirm ...]]></description><link>https://blog.yangzheng.ca/add-mysql-path-to-system-variables-in-windows-10</link><guid isPermaLink="true">https://blog.yangzheng.ca/add-mysql-path-to-system-variables-in-windows-10</guid><category><![CDATA[MySQL]]></category><category><![CDATA[Windows]]></category><dc:creator><![CDATA[Yang]]></dc:creator><pubDate>Tue, 21 Sep 2021 20:20:34 GMT</pubDate><content:encoded><![CDATA[

<ol>
<li><p>Right-click <strong>"This Computer"</strong>;</p>
</li>
<li><p>Click <strong>"Properties"</strong>;</p>
</li>
<li><p>Click the <strong>"Advanced"</strong> tab;</p>
</li>
<li><p>Click <strong>"Environment Variables"</strong>;</p>
</li>
<li><p>Select the <strong>“Path”</strong> variable in System variables;</p>
</li>
<li><p>Click <strong>“Edit”</strong>;</p>
</li>
<li><p>Click <strong>"New"</strong>;</p>
</li>
<li><p>Paste <strong>"C:\Program Files\MySQL\MySQL Server 8.0\bin"</strong>.
<em>*Confirm that the MySQL Server version number is the same as your installed one.</em></p>
</li>
</ol>
]]></content:encoded></item></channel></rss>