Jekyll2021-04-08T11:27:34+08:00https://lynn9388.github.io/feed.xmlLynn’s BlogReading, Thinking and WritingJavaScript Basics2020-10-07T00:00:00+08:002020-10-07T00:00:00+08:00https://lynn9388.github.io/2020/10/07/javascript-basics<p>Read a little history of JavaScript <a href="https://en.wikipedia.org/wiki/JavaScript#History">here</a>.</p>
<h2 id="miscellaneous">Miscellaneous</h2>
<ul>
<li>Display content
<ul>
<li>In the console: <code class="language-plaintext highlighter-rouge">console.log('Hello, world!');</code></li>
<li>Show alert message: <code class="language-plaintext highlighter-rouge">alert('Hello, world!');</code></li>
</ul>
</li>
<li>Comments
<ul>
<li>Single-line comment: <code class="language-plaintext highlighter-rouge">//</code></li>
<li>Multi-line comment: <code class="language-plaintext highlighter-rouge">/* */</code></li>
</ul>
</li>
<li>Semicolons
<ul>
<li>One statement ends and another begins: <code class="language-plaintext highlighter-rouge">;</code></li>
</ul>
</li>
<li>Variables
<ul>
<li>Naming conventions: <code class="language-plaintext highlighter-rouge">camelCase</code></li>
</ul>
</li>
</ul>
<h2 id="data-types">Data Types</h2>
<ul>
<li>Numbers
<ul>
<li>Arithmetic operators: <code class="language-plaintext highlighter-rouge">+</code>, <code class="language-plaintext highlighter-rouge">-</code>, <code class="language-plaintext highlighter-rouge">*</code>, <code class="language-plaintext highlighter-rouge">/</code>, <code class="language-plaintext highlighter-rouge">%</code></li>
<li>Comparison operators: <code class="language-plaintext highlighter-rouge"><</code>, <code class="language-plaintext highlighter-rouge">></code>, <code class="language-plaintext highlighter-rouge"><=</code>, <code class="language-plaintext highlighter-rouge">>=</code>, <code class="language-plaintext highlighter-rouge">==</code>, <code class="language-plaintext highlighter-rouge">!=</code></li>
</ul>
</li>
<li>Strings
<ul>
<li>String literals: <code class="language-plaintext highlighter-rouge">" "</code>, <code class="language-plaintext highlighter-rouge">' '</code></li>
<li>String concatenation: <code class="language-plaintext highlighter-rouge">+</code></li>
<li>String index: <code class="language-plaintext highlighter-rouge">'James'[0];</code></li>
<li>Escaping strings: <code class="language-plaintext highlighter-rouge">\\</code>, <code class="language-plaintext highlighter-rouge">\"</code>, <code class="language-plaintext highlighter-rouge">\'</code>, <code class="language-plaintext highlighter-rouge">\n</code>, <code class="language-plaintext highlighter-rouge">\t</code></li>
<li>Comparing strings: character-by-character for the ASCII values (<code class="language-plaintext highlighter-rouge">charCodeAt(0)</code>)</li>
</ul>
</li>
<li>Booleans
<ul>
<li><code class="language-plaintext highlighter-rouge">true</code></li>
<li><code class="language-plaintext highlighter-rouge">false</code></li>
</ul>
</li>
<li>Null, Undefined, and NaN
<ul>
<li>Value of nothing: <code class="language-plaintext highlighter-rouge">null</code></li>
<li>Absence of value: <code class="language-plaintext highlighter-rouge">undefined</code></li>
<li>Not-A-Number: <code class="language-plaintext highlighter-rouge">NaN</code></li>
</ul>
</li>
<li>Equality
<ul>
<li>Implicit type coercion: <code class="language-plaintext highlighter-rouge">'1' == 1</code>, <code class="language-plaintext highlighter-rouge">0 == false</code>, <code class="language-plaintext highlighter-rouge">' ' == false</code> (Returns: <code class="language-plaintext highlighter-rouge">true</code>)</li>
<li>Strict equality: <code class="language-plaintext highlighter-rouge">===</code>, <code class="language-plaintext highlighter-rouge">!==</code></li>
</ul>
</li>
</ul>
<h2 id="conditions">Conditions</h2>
<ul>
<li>
<p>If…else statements</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="k">if</span> <span class="p">(</span><span class="cm">/* this expression is true */</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// run this code</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="c1">// run this code</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
</li>
<li>
<p>Else ff statements</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre><span class="k">if</span> <span class="p">(</span><span class="cm">/* this expression is true */</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// run this code</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="cm">/* exra conditional statement */</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// run this code</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="c1">// run this code</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
</li>
<li>Logical operators
<ul>
<li>Logical AND: <code class="language-plaintext highlighter-rouge">&&</code></li>
<li>Logical OR: <code class="language-plaintext highlighter-rouge">||</code></li>
<li>Logical NOT: <code class="language-plaintext highlighter-rouge">!</code></li>
</ul>
</li>
<li>Short-circuiting
<ul>
<li><code class="language-plaintext highlighter-rouge">false && _</code> returns <code class="language-plaintext highlighter-rouge">false</code></li>
<li><code class="language-plaintext highlighter-rouge">true || _</code> returns <code class="language-plaintext highlighter-rouge">true</code></li>
</ul>
</li>
<li>Truthy and falsy
<ul>
<li>Only six falsy values in all JavaScript
<ul>
<li>The Boolean value <code class="language-plaintext highlighter-rouge">false</code></li>
<li>The <code class="language-plaintext highlighter-rouge">null</code> type</li>
<li>The <code class="language-plaintext highlighter-rouge">undefined</code> type</li>
<li>The number <code class="language-plaintext highlighter-rouge">0</code></li>
<li>The empty string <code class="language-plaintext highlighter-rouge">''</code></li>
<li>The odd value <code class="language-plaintext highlighter-rouge">NaN</code></li>
</ul>
</li>
<li>It’s truthy if it’s not in the list of falsy values</li>
</ul>
</li>
<li>Ternary operator
<ul>
<li><code class="language-plaintext highlighter-rouge">conditional ? (if condition is true) : (if condition is false)</code></li>
</ul>
</li>
<li>
<p>Switch statement</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="k">switch</span> <span class="p">(</span><span class="nx">option</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="mi">1</span><span class="p">:</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">You selected option 1.</span><span class="dl">'</span><span class="p">);</span>
<span class="k">break</span><span class="p">;</span>
<span class="k">case</span> <span class="mi">2</span><span class="p">:</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">You selected option 2.</span><span class="dl">'</span><span class="p">);</span>
<span class="k">break</span><span class="p">;</span>
<span class="k">case</span> <span class="mi">3</span><span class="p">:</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">You selected option 3.</span><span class="dl">'</span><span class="p">);</span>
<span class="k">break</span><span class="p">;</span>
<span class="nl">default</span><span class="p">:</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">You selected option </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">option</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">.</span><span class="dl">'</span><span class="p">);</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
</li>
</ul>
<h2 id="loops">Loops</h2>
<ul>
<li>
<p>While loop</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="kd">var</span> <span class="nx">start</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// when to start</span>
<span class="k">while</span> <span class="p">(</span><span class="nx">start</span> <span class="o"><</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// when to stop</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">start</span><span class="p">);</span>
<span class="nx">start</span> <span class="o">=</span> <span class="nx">start</span> <span class="o">+</span> <span class="mi">2</span><span class="p">;</span> <span class="c1">// how to get to the next item</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
</li>
<li>
<p>For loop</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="k">for</span> <span class="p">(</span><span class="nx">start</span><span class="p">;</span> <span class="nx">stop</span><span class="p">;</span> <span class="nx">step</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// do this thing</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
</li>
<li>
<p>Increment and decrement</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">x++ or ++x // same as x = x + 1</code></li>
<li><code class="language-plaintext highlighter-rouge">x-- or --x // same as x = x - 1</code></li>
<li><code class="language-plaintext highlighter-rouge">x += 3 // same as x = x + 3</code></li>
<li><code class="language-plaintext highlighter-rouge">x -= 6 // same as x = x - 6</code></li>
<li><code class="language-plaintext highlighter-rouge">x *= 2 // same as x = x * 2</code></li>
<li><code class="language-plaintext highlighter-rouge">x /= 5 // same as x = x / 5</code></li>
</ul>
</li>
</ul>
<h2 id="scope-and-variable-declaration">Scope and Variable Declaration</h2>
<ul>
<li>Global scope
<ul>
<li>When a particular variable is visible (can be used) anywhere in the code.</li>
</ul>
</li>
<li>Function scope
<ul>
<li>When a particular variable is visible (can be used) within a particular function only.</li>
</ul>
</li>
<li>Block scope
<ul>
<li>When a particular variable is visible (can be used) within a pair of { . . . } only.</li>
</ul>
</li>
</ul>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="rouge-code"><pre><span class="cm">/*
* Global scope.
* This variable declared outside of any function is called Global variable.
* Hence, you can use this anywhere in the code
*/</span>
<span class="kd">var</span> <span class="nx">opinion</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">This nanodegree is amazing</span><span class="dl">'</span><span class="p">;</span>
<span class="c1">// Function scope</span>
<span class="kd">function</span> <span class="nx">showMessage</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">// Local variable, visible within the function `showMessage`</span>
<span class="kd">var</span> <span class="nx">message</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">I am an Udacian!</span><span class="dl">'</span><span class="p">;</span>
<span class="c1">// Block scope</span>
<span class="p">{</span>
<span class="kd">let</span> <span class="nx">greet</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">How are you doing?</span><span class="dl">'</span><span class="p">;</span>
<span class="cm">/*
* We have used the keyword `let` to declare a variable `greet` because variables declared with the `var` keyword can not have Block Scope.
*/</span>
<span class="p">}</span> <span class="c1">// block scope ends</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="nx">message</span> <span class="p">);</span> <span class="c1">// OK</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="nx">greet</span> <span class="p">);</span> <span class="c1">// ERROR.</span>
<span class="c1">// Variable greet can NOT be used outside the block</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="nx">opinion</span> <span class="p">);</span> <span class="c1">// OK to use the gobal variable anywhere in the code</span>
<span class="p">}</span> <span class="c1">// function scope ends</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<ul>
<li>Variable declaration
<ul>
<li><code class="language-plaintext highlighter-rouge">let</code>
<ul>
<li>It is a new way to declare a variable in any scope. The value of this variable can be changed or reassigned anytime within its scope.</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">const</code>
<ul>
<li>It is also a way to declare constants in any scope. Once you are assigned a value to a const variable, the value of this variable CANNOT be changed or reassigned throughout the code.</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">var</code>
<ul>
<li>This is the old way of declaring variables in only two scope — Global, or Local. Variables declared with the var keyword can not have Block Scope. The value of this variable can be changed or reassigned anytime within its scope.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="functions">Functions</h2>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="c1">// x and y are parameters in this function declaration</span>
<span class="kd">function</span> <span class="nx">add</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// function body</span>
<span class="c1">// Here, `sum` variable has a scope within the function.</span>
<span class="c1">// Such variables defined within a function are called Local variables</span>
<span class="c1">// You can try giving it another name</span>
<span class="kd">var</span> <span class="nx">sum</span> <span class="o">=</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">y</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">sum</span><span class="p">;</span> <span class="c1">// return statement</span>
<span class="p">}</span>
<span class="c1">// 1 and 2 are passed into the function as arguments,</span>
<span class="c1">// and the result returned by the function is stored in a new variable `sum`</span>
<span class="c1">// Here, `sum` is another variable, different from the one used inside the function</span>
<span class="kd">var</span> <span class="nx">sum</span> <span class="o">=</span> <span class="nx">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<ul>
<li>
<p>Function body</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="kd">function</span> <span class="nx">add</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// function body!</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
</li>
<li>
<p>Return statements</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="k">return</span> <span class="nx">sum</span><span class="p">;</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
</li>
<li>
<p>Invoke or call a function</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nx">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
</li>
</ul>
<h3 id="hoistinng">Hoistinng</h3>
<ul>
<li>
<p>Examples</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="nx">sayHi</span><span class="p">(</span><span class="dl">'</span><span class="s1">Julia</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">function</span> <span class="nx">sayHi</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">greeting</span> <span class="o">+</span> <span class="dl">'</span><span class="s1"> </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">name</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">greeting</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Hello</span><span class="dl">'</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
<blockquote>
<p>undefined Julia</p>
</blockquote>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="nx">sayHi</span><span class="p">(</span><span class="dl">'</span><span class="s1">Julia</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">function</span> <span class="nx">sayHi</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">greeting</span> <span class="o">+</span> <span class="dl">'</span><span class="s1"> </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">name</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">greeting</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Hello</span><span class="dl">'</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
<blockquote>
<p>undefined Julia</p>
</blockquote>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="kd">function</span> <span class="nx">sayHi</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">greeting</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Hello</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">greeting</span> <span class="o">+</span> <span class="dl">'</span><span class="s1"> </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">name</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">sayHi</span><span class="p">(</span><span class="dl">'</span><span class="s1">Julia</span><span class="dl">'</span><span class="p">);</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
<blockquote>
<p>Hello Julia</p>
</blockquote>
</li>
<li>JavaScript hoists function declarations and variable declarations to the top of the current scope.</li>
<li>Variable assignments are not hoisted.</li>
<li>Declare functions and variables at the top of your scripts, so the syntax and behavior are consistent with each other.</li>
</ul>
<h3 id="function-expressions">Function Expressions</h3>
<p><strong>Function Expression</strong>: When a function is assigned to a variable. The function can be named, or anonymous. Use the variable name to call a function defined in a function expression.</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="c1">// anonymous function expression</span>
<span class="kd">var</span> <span class="nx">doSomething</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">y</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">};</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="c1">// named function expression</span>
<span class="kd">var</span> <span class="nx">doSomething</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">addOne</span><span class="p">(</span><span class="nx">y</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">};</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="c1">// for either of the definitions above, call the function like this:</span>
<span class="nx">doSomething</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<blockquote>
<p>All <em>function declarations</em> are hoisted and loaded before the script is actually run. <em>Function expressions</em> are not hoisted, since they involve variable assignment, and only variable declarations are hoisted. The function expression will not be loaded until the interpreter reaches it in the script.</p>
</blockquote>
<p><strong>Callback</strong>: A function that is passed into another function.</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre><span class="c1">// function expression catSays</span>
<span class="kd">var</span> <span class="nx">catSays</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">max</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">catMessage</span> <span class="o">=</span> <span class="dl">''</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">max</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">catMessage</span> <span class="o">+=</span> <span class="dl">'</span><span class="s1">meow </span><span class="dl">'</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">catMessage</span><span class="p">;</span>
<span class="p">};</span>
<span class="c1">// function declaration helloCat accepting a callback</span>
<span class="kd">function</span> <span class="nx">helloCat</span><span class="p">(</span><span class="nx">callbackFunc</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="dl">'</span><span class="s1">Hello </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">callbackFunc</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// pass in catSays as a callback function</span>
<span class="nx">helloCat</span><span class="p">(</span><span class="nx">catSays</span><span class="p">);</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p><strong>Inline function expressions</strong>: Writing function expressions that pass a function into another function inline.</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre><span class="c1">// function declaration that takes in two arguments: a function for displaying</span>
<span class="c1">// a message, along with a name of a movie</span>
<span class="kd">function</span> <span class="nx">movies</span><span class="p">(</span><span class="nx">messageFunction</span><span class="p">,</span> <span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">messageFunction</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// call the movies function, pass in the function and name of movie</span>
<span class="nx">movies</span><span class="p">(</span><span class="kd">function</span> <span class="nx">displayFavorite</span><span class="p">(</span><span class="nx">movieName</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">My favorite movie is </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">movieName</span><span class="p">);</span>
<span class="p">},</span> <span class="dl">'</span><span class="s1">Finding Nemo</span><span class="dl">'</span><span class="p">);</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<h2 id="arrays">Arrays</h2>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="c1">// creates a `donuts` array with three strings</span>
<span class="kd">var</span> <span class="nx">donuts</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">glazed</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">powdered</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">jelly</span><span class="dl">'</span><span class="p">];</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="c1">// creates a `mixedData` array with mixed data types</span>
<span class="kd">var</span> <span class="nx">mixedData</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">abcd</span><span class="dl">'</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">undefined</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="dl">'</span><span class="s1">all the things</span><span class="dl">'</span><span class="p">];</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="c1">// creates a `arraysInArrays` array with three arrays</span>
<span class="kd">var</span> <span class="nx">arraysInArrays</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="dl">'</span><span class="s1">Julia</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">James</span><span class="dl">'</span><span class="p">],</span> <span class="p">[</span><span class="kc">true</span><span class="p">,</span> <span class="kc">false</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">false</span><span class="p">]];</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<h3 id="indexing">Indexing</h3>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="kd">var</span> <span class="nx">donuts</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">glazed</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">powdered</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">sprinkled</span><span class="dl">'</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">donuts</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="c1">// 'glazed' is the first element in the `donuts` array</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nx">donuts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">glazed cruller</span><span class="dl">'</span><span class="p">;</span> <span class="c1">// changes the second element in the `donuts` array to 'glazed cruller'</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<h3 id="properties-and-methods">Properties and Methods</h3>
<ul>
<li>
<p>Array.length</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="kd">var</span> <span class="nx">donuts</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">glazed</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">powdered</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">sprinkled</span><span class="dl">'</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">donuts</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
<blockquote>
<p>3</p>
</blockquote>
</li>
<li>
<p>Push</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="kd">var</span> <span class="nx">donuts</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">glazed</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">chocolate frosted</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">Boston creme</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">glazed cruller</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">cinnamon sugar</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">sprinkled</span><span class="dl">'</span><span class="p">];</span>
<span class="nx">donuts</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="dl">'</span><span class="s1">powdered</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// pushes 'powdered' onto the end of the `donuts` array, and returns the length of the array after an element has been added</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
<blockquote>
<p>7</p>
</blockquote>
</li>
<li>
<p>Pop</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="kd">var</span> <span class="nx">donuts</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">glazed</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">chocolate frosted</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">Boston creme</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">glazed cruller</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">cinnamon sugar</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">sprinkled</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">powdered</span><span class="dl">'</span><span class="p">];</span>
<span class="nx">donuts</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span> <span class="c1">// pops 'powdered' off the end of the `donuts` array, and returns the element that has been removed</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
<blockquote>
<p>powdered</p>
</blockquote>
</li>
<li>
<p>Splice</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">arrayName.splice(start, deleteCount, item1, ..., itemX);</code>
<ul>
<li><code class="language-plaintext highlighter-rouge">start</code> Mandatory argument. Specifies the starting index position to add/remove items. You can use a negative value to specify the position from the end of the array e.g., -1 specifies the last element.</li>
<li><code class="language-plaintext highlighter-rouge">deleteCount</code> Optional argument. Specifies the count of elements to be removed. If set to 0, no items will be removed.</li>
<li><code class="language-plaintext highlighter-rouge">item1, ..., itemX</code> are the items to be added at index position <code class="language-plaintext highlighter-rouge">start</code></li>
<li>Returns the item(s) that were removed.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="array-loops">Array Loops</h3>
<ul>
<li>
<p><code class="language-plaintext highlighter-rouge">for</code> or <code class="language-plaintext highlighter-rouge">while</code> loop</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre><span class="kd">var</span> <span class="nx">donuts</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">jelly donut</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">chocolate donut</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">glazed donut</span><span class="dl">'</span><span class="p">];</span>
<span class="c1">// the variable `i` is used to step through each element in the array</span>
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">donuts</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">donuts</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">+=</span> <span class="dl">'</span><span class="s1"> hole</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">donuts</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">donuts</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">toUpperCase</span><span class="p">();</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
</li>
<li>
<p><code class="language-plaintext highlighter-rouge">forEach()</code></p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre><span class="kd">var</span> <span class="nx">donuts</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">jelly donut</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">chocolate donut</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">glazed donut</span><span class="dl">'</span><span class="p">];</span>
<span class="nx">donuts</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">donut</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">donut</span> <span class="o">+=</span> <span class="dl">'</span><span class="s1"> hole</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">donut</span> <span class="o">=</span> <span class="nx">donut</span><span class="p">.</span><span class="nx">toUpperCase</span><span class="p">();</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">donut</span><span class="p">);</span>
<span class="p">});</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
<p>The function passed to the <code class="language-plaintext highlighter-rouge">forEach()</code> method can take up to three parameters: element, index, and array. It always returns <code class="language-plaintext highlighter-rouge">undefined</code>.</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="nx">words</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">cat</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">in</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">hat</span><span class="dl">'</span><span class="p">];</span>
<span class="nx">words</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">word</span><span class="p">,</span> <span class="nx">num</span><span class="p">,</span> <span class="nx">all</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">Word </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">num</span> <span class="o">+</span> <span class="dl">'</span><span class="s1"> in </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">all</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span> <span class="o">+</span> <span class="dl">'</span><span class="s1"> is </span><span class="dl">'</span> <span class="o">+</span> <span class="nx">word</span><span class="p">);</span>
<span class="p">});</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
<blockquote>
<p>Word 0 in cat,in,hat is cat</p>
<p>Word 1 in cat,in,hat is in</p>
<p>Word 2 in cat,in,hat is hat</p>
</blockquote>
</li>
<li>
<p><code class="language-plaintext highlighter-rouge">map()</code></p>
<p>The <code class="language-plaintext highlighter-rouge">map()</code> method takes an array, performs some operation on each element of the array, and returns a new array.</p>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre><span class="kd">var</span> <span class="nx">donuts</span> <span class="o">=</span> <span class="p">[</span><span class="dl">'</span><span class="s1">jelly donut</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">chocolate donut</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">glazed donut</span><span class="dl">'</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">improvedDonuts</span> <span class="o">=</span> <span class="nx">donuts</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">donut</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">donut</span> <span class="o">+=</span> <span class="dl">'</span><span class="s1"> hole</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">donut</span> <span class="o">=</span> <span class="nx">donut</span><span class="p">.</span><span class="nx">toUpperCase</span><span class="p">();</span>
<span class="k">return</span> <span class="nx">donut</span><span class="p">;</span>
<span class="p">});</span>
</pre></td></tr></tbody></table></code></pre></div> </div>
</li>
</ul>
<h2 id="objects">Objects</h2>
<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre><span class="kd">var</span> <span class="nx">sister</span> <span class="o">=</span> <span class="p">{</span>
<span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Sarah</span><span class="dl">'</span><span class="p">,</span>
<span class="na">age</span><span class="p">:</span> <span class="mi">23</span><span class="p">,</span>
<span class="na">parents</span><span class="p">:</span> <span class="p">[</span><span class="dl">'</span><span class="s1">alice</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">andy</span><span class="dl">'</span><span class="p">],</span>
<span class="na">siblings</span><span class="p">:</span> <span class="p">[</span><span class="dl">'</span><span class="s1">julia</span><span class="dl">'</span><span class="p">],</span>
<span class="na">favoriteColor</span><span class="p">:</span> <span class="dl">'</span><span class="s1">purple</span><span class="dl">'</span><span class="p">,</span>
<span class="na">pets</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
<span class="na">paintPicture</span><span class="p">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="dl">'</span><span class="s1">Sarah paints!</span><span class="dl">'</span><span class="p">;</span> <span class="p">}</span>
<span class="p">};</span>
<span class="c1">// two equivalent ways to use the key to return its value</span>
<span class="nx">sister</span><span class="p">[</span><span class="dl">'</span><span class="s1">parents</span><span class="dl">'</span><span class="p">]</span> <span class="c1">// returns ['alice', 'andy']</span>
<span class="nx">sister</span><span class="p">.</span><span class="nx">parents</span> <span class="c1">// also returns ['alice', 'andy']</span>
<span class="nx">sister</span><span class="p">.</span><span class="nx">paintPicture</span><span class="p">();</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<h2 id="references">References</h2>
<p><a href="https://www.udacity.com/course/intro-to-javascript--ud803">Intro to JavaScript</a></p>Read a little history of JavaScript here.Git Basics2020-10-05T00:00:00+08:002020-10-05T00:00:00+08:00https://lynn9388.github.io/2020/10/05/git-basics<ul>
<li><a href="https://classroom.udacity.com/courses/ud123/lessons/1b369991-f1ca-4d6a-ba8f-e8318d76322f/concepts/63a6f935-dea7-43c2-aaa3-61deea5070c8">Mac/Linux Setup</a></li>
<li><a href="https://classroom.udacity.com/courses/ud123/lessons/1b369991-f1ca-4d6a-ba8f-e8318d76322f/concepts/8a5af628-7a18-49cf-bbc8-02691762f862">Windows Setup</a></li>
</ul>
<h2 id="terminology">Terminology</h2>
<ul>
<li>Working Directory</li>
<li>
<p>Staging Area / Staging Index / Index</p>
<p><img src="https://git-scm.com/book/en/v2/images/areas.png" alt="Area" /></p>
</li>
</ul>
<h2 id="basic-commands">Basic Commands</h2>
<h3 id="create-or-clone-a-repository">Create or Clone a Repository</h3>
<ul>
<li>Check the repository’s status
<ul>
<li><strong><code class="language-plaintext highlighter-rouge">git status</code></strong></li>
</ul>
</li>
<li>Initial a local repository
<ul>
<li><code class="language-plaintext highlighter-rouge">git init NAME</code></li>
</ul>
</li>
<li>Clone a remote repository to local (default branch: <em>master</em>, default remote name: <em>origin</em>)
<ul>
<li><code class="language-plaintext highlighter-rouge">git clone URL</code></li>
</ul>
</li>
</ul>
<h3 id="review-a-repositorys-history">Review a Repository’s History</h3>
<ul>
<li>List all commits
<ul>
<li><code class="language-plaintext highlighter-rouge">git log</code>
<ul>
<li><code class="language-plaintext highlighter-rouge">--oneline</code></li>
<li><code class="language-plaintext highlighter-rouge">--graph</code></li>
<li><code class="language-plaintext highlighter-rouge">--all</code></li>
<li><code class="language-plaintext highlighter-rouge">-p</code> or <code class="language-plaintext highlighter-rouge">--patch</code></li>
<li><code class="language-plaintext highlighter-rouge">--stat</code></li>
</ul>
</li>
</ul>
</li>
<li>List specific commit
<ul>
<li><code class="language-plaintext highlighter-rouge">git show SHA</code></li>
</ul>
</li>
</ul>
<h3 id="add-commits-to-a-repository">Add Commits to a Repository</h3>
<ul>
<li>Add
<ul>
<li>Add files to staging area
<ul>
<li><code class="language-plaintext highlighter-rouge">git add FILE1 FILE2</code></li>
</ul>
</li>
<li>Add all changed files to staging area
<ul>
<li><code class="language-plaintext highlighter-rouge">git add .</code></li>
</ul>
</li>
</ul>
</li>
<li>Commit
<ul>
<li>Record changes in staging area to the repository
<ul>
<li><code class="language-plaintext highlighter-rouge">git commit</code></li>
</ul>
</li>
<li>Use the given message as the commit message
<ul>
<li><code class="language-plaintext highlighter-rouge">git commit -m MESSAGE</code></li>
</ul>
</li>
</ul>
</li>
<li>Diff
<ul>
<li><code class="language-plaintext highlighter-rouge">git diff</code></li>
</ul>
</li>
</ul>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="rouge-code"><pre>Working Directory <<span class="nt">------</span>+-------+-------+
| | | |
| | | |
V | | |
<span class="s2">"git add"</span> | | diff
| | | |
| | | |
V | | |
Index <<span class="nt">----</span>+-------|-------|-------+
| | diff HEAD |
| | | |
V | | |
<span class="s2">"git commit"</span> diff <span class="nt">--cached</span> | diff HEAD^
| | | |
| | | |
V | | |
HEAD <<span class="nt">----</span>+-------+ |
| |
| |
V |
previous <span class="s2">"git commit"</span> |
| |
| |
V |
HEAD^ <<span class="nt">--------------</span>+
</pre></td></tr></tbody></table></code></pre></div></div>
<h3 id="good-commit-messages">Good Commit Messages</h3>
<ul>
<li>Explain <strong>what</strong> the commit does in the first line</li>
<li>Explain <strong>why</strong> in the body</li>
<li>No <strong>how</strong></li>
</ul>
<h3 id="tag-branch-and-merge">Tag, Branch and Merge</h3>
<ul>
<li>Tag
<ul>
<li>Create tag
<ul>
<li><code class="language-plaintext highlighter-rouge">git tag TAG</code></li>
</ul>
</li>
<li>Create tag with annotation
<ul>
<li><code class="language-plaintext highlighter-rouge">git tag -a TAG</code> or <code class="language-plaintext highlighter-rouge">git tag --annotate TAG</code></li>
</ul>
</li>
<li>Delete tag
<ul>
<li><code class="language-plaintext highlighter-rouge">git tag -d TAG</code></li>
</ul>
</li>
</ul>
</li>
<li>Branch
<ul>
<li>Create branch
<ul>
<li><code class="language-plaintext highlighter-rouge">git branch BRANCH</code></li>
</ul>
</li>
<li>Delete branch
<ul>
<li><code class="language-plaintext highlighter-rouge">git branch -d BRANCH</code></li>
</ul>
</li>
<li>Switch branch or restore working tree files
<ul>
<li><code class="language-plaintext highlighter-rouge">git checkout BRANCH/TAG/SHA</code></li>
</ul>
</li>
<li>Create a branch and switch to it
<ul>
<li><code class="language-plaintext highlighter-rouge">git checkout -b BRANCH</code></li>
</ul>
</li>
</ul>
</li>
<li>Merge
<ul>
<li><code class="language-plaintext highlighter-rouge">git merge BRANCH/TAG/SHA</code></li>
</ul>
</li>
</ul>
<h3 id="undoing-changes">Undoing Changes</h3>
<ul>
<li>Relative Commit References
<ul>
<li><code class="language-plaintext highlighter-rouge">^</code> indicates the parent commit</li>
<li><code class="language-plaintext highlighter-rouge">~</code> indicates the first parent commit</li>
</ul>
</li>
<li>Replace the tip of the current branch by creating a new commit
<ul>
<li><code class="language-plaintext highlighter-rouge">git commit --amend</code></li>
</ul>
</li>
<li>Revert an existing commit
<ul>
<li><code class="language-plaintext highlighter-rouge">git revert SHA</code></li>
</ul>
</li>
<li>Reset current HEAD to the specified state
<ul>
<li><code class="language-plaintext highlighter-rouge">git reset SHA</code>
<ul>
<li><code class="language-plaintext highlighter-rouge">--mixed</code></li>
<li><code class="language-plaintext highlighter-rouge">--soft</code></li>
<li><code class="language-plaintext highlighter-rouge">---hard</code></li>
<li><a href="https://s3.cn-north-1.amazonaws.com.cn/u-vid-hd/UN7ki2G2yKc.mp4">Video</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="git-collaboration">Git Collaboration</h2>
<h3 id="working-with-remotes">Working With Remotes</h3>
<p><img src="https://s3.cn-north-1.amazonaws.com.cn/u-img/fbbde604-5978-4814-b3ab-872d82dcfa30" alt="Remote Repository" /></p>
<ul>
<li>Remote
<ul>
<li><code class="language-plaintext highlighter-rouge">git remote</code>
<ul>
<li><code class="language-plaintext highlighter-rouge">-v</code></li>
<li><code class="language-plaintext highlighter-rouge">add REMOTE URL</code></li>
<li><code class="language-plaintext highlighter-rouge">rename OLD NEW</code></li>
<li><code class="language-plaintext highlighter-rouge">remove REMOTE</code></li>
</ul>
</li>
</ul>
</li>
<li>Update remote refs along with associated objects
<ul>
<li><code class="language-plaintext highlighter-rouge">git push</code></li>
</ul>
</li>
<li>Download objects and refs from another repository
<ul>
<li><code class="language-plaintext highlighter-rouge">git fetch</code></li>
</ul>
</li>
<li>Fetch from and integrate with another repository or a local branch
<ul>
<li><code class="language-plaintext highlighter-rouge">git pull</code> = <code class="language-plaintext highlighter-rouge">git fetch</code> + <code class="language-plaintext highlighter-rouge">git merge</code></li>
</ul>
</li>
</ul>
<h3 id="working-on-another-developers-repository">Working On Another Developer’s Repository</h3>
<ul>
<li>Fork repository</li>
<li>Summarize ‘git log’ output
<ul>
<li><code class="language-plaintext highlighter-rouge">git shortlog</code>
<ul>
<li><code class="language-plaintext highlighter-rouge">-s</code></li>
<li><code class="language-plaintext highlighter-rouge">-n</code></li>
<li><code class="language-plaintext highlighter-rouge">--author=NAME</code></li>
<li><code class="language-plaintext highlighter-rouge">--grep=REGEX</code></li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="staying-in-sync-with-a-remote-repository">Staying In Sync With A Remote Repository</h3>
<ul>
<li>Pull request</li>
<li>Stay in sync with source project
<ul>
<li>origin</li>
<li>upstream</li>
</ul>
</li>
<li>Reapply commits on top of another base tip
<ul>
<li><code class="language-plaintext highlighter-rouge">git rebase -i BASE</code></li>
</ul>
</li>
</ul>
<h2 id="references">References</h2>
<p><a href="https://www.udacity.com/course/github-collaboration--ud456">GitHub & Collaboration</a></p>Mac/Linux Setup Windows SetupA New PB for Mini-Marathon in HUST 🏅2019-11-24T00:00:00+08:002019-11-24T00:00:00+08:00https://lynn9388.github.io/2019/11/24/a-new-pb-for-mini-marathon-in-hust<p>The weather this morning was as cold as usual, but I was one of them at the entrance of Huazhong University of Science and Technology. This is the third mini-marathon I participated in. With my previous experience, I arrived at the starting point very early. The usual training gave me more confidence, and the final result did not disappoint me.</p>
<p><img src="https://lynn9388.github.io/images/post/Completion_certificate_for_2019_China_university_marathon_series.jpeg" alt="Completion certificate for 2019 China university marathon series" /></p>
<p>This is a new personal best, and I achieved a huge leap compared to the previous two competitions. Although I was a little tired when I was running, I knew that it was far from my limit. I hope that I can enter the top 20 next time.</p>
<p><img src="https://lynn9388.github.io/images/post/Medal_for_2019_China_university_marathon_series.jpeg" alt="Medal for 2019 China university marathon series" /></p>The weather this morning was as cold as usual, but I was one of them at the entrance of Huazhong University of Science and Technology. This is the third mini-marathon I participated in. With my previous experience, I arrived at the starting point very early. The usual training gave me more confidence, and the final result did not disappoint me.Completed Another Online Running2019-11-15T00:00:00+08:002019-11-15T00:00:00+08:00https://lynn9388.github.io/2019/11/15/completed-another-online-running<p>From October 11th to November 10th, I ran 353.39 kilometers in a month and completed another online running of HUST. I finally got another shiny bookmark today 🔖.</p>
<p><img src="https://lynn9388.github.io/images/post/Prizes_of_the_6th_online_running.jpeg" alt="Prizes of the 6th online running" /></p>
<p>I also finally collected the bookmarks for the 4th to 6th online running.</p>
<p><img src="https://lynn9388.github.io/images/post/Bookmarks_for_the_4th_to_6th_online_running.jpeg" alt="Bookmarks for the 4th to 6th online running" /></p>
<p>I am looking forward to next year’s event.</p>From October 11th to November 10th, I ran 353.39 kilometers in a month and completed another online running of HUST. I finally got another shiny bookmark today 🔖.Set Up Visual Studio Code for Markdown and Jekyll2019-11-15T00:00:00+08:002019-11-15T00:00:00+08:00https://lynn9388.github.io/2019/11/15/set-up-visual-studio-code-for-markdown-and-jekyll<p>In the end, I switched from <a href="/2019/07/27/set-up-sublime-text-for-markdown-and-jekyll.html">Sublime Text</a> back to Visual Studio Code 😂. I think I should not go back anymore. The reason I gave up the Visual Studio Code before was that it would make my computer overheat, but I found that I can solve this problem by <a href="https://code.visualstudio.com/docs/editor/extension-gallery#_manage-extensions">uninstalling or disabling unnecessary extensions</a>.</p>
<p>Visual Studio Code is very <a href="https://code.visualstudio.com/docs/languages/markdown">friendly to Markdown</a> and has a very good experience even after installation without any customization. I mainly use Markdown to write my blog and README documents. The following settings are mainly based on my two needs.</p>
<h2 id="markdown-linting">Markdown Linting</h2>
<p>This is a feature that is not built into Visual Studio Code, which is the only I have to install an extension. The name of the extension is <a href="https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint">markdownlint</a>, the same as the <a href="https://github.com/markdownlint/markdownlint">package for Sublime Text</a>.</p>
<p>After installation, you only need to set the rules in the Visual Studio Code’s <code class="language-plaintext highlighter-rouge">Settings</code> according to your writing habits. My settings are:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre><span class="nl">"markdownlint.config"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"MD003"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"style"</span><span class="p">:</span><span class="w"> </span><span class="s2">"atx"</span><span class="w"> </span><span class="p">},</span><span class="w">
</span><span class="nl">"MD004"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"style"</span><span class="p">:</span><span class="w"> </span><span class="s2">"dash"</span><span class="w"> </span><span class="p">},</span><span class="w">
</span><span class="nl">"MD007"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"indent"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="p">},</span><span class="w">
</span><span class="nl">"MD029"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"style"</span><span class="p">:</span><span class="w"> </span><span class="s2">"one"</span><span class="w"> </span><span class="p">},</span><span class="w">
</span><span class="nl">"MD046"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"style"</span><span class="p">:</span><span class="w"> </span><span class="s2">"fenced"</span><span class="w"> </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>
<h2 id="snippets-for-jekyll">Snippets for Jekyll</h2>
<p>Visual Studio Code also supports <a href="https://code.visualstudio.com/docs/editor/userdefinedsnippets">snippets</a>. Since I put all my Jekyll projects under the <code class="language-plaintext highlighter-rouge">Blog</code> folder, I create a folder snippets through <code class="language-plaintext highlighter-rouge">Code -> Preferences -> User Snippets -> New Snippets file for 'Blog'...</code>, it’s located in <code class="language-plaintext highlighter-rouge">/Blog/.vscode/markdown.code-snippets</code>.</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
</span><span class="nl">"Markdown link"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"markdown"</span><span class="p">,</span><span class="w">
</span><span class="nl">"prefix"</span><span class="p">:</span><span class="w"> </span><span class="s2">"link"</span><span class="p">,</span><span class="w">
</span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="s2">"[$1]($2)"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"Markdown post link"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"markdown"</span><span class="p">,</span><span class="w">
</span><span class="nl">"prefix"</span><span class="p">:</span><span class="w"> </span><span class="s2">"post"</span><span class="p">,</span><span class="w">
</span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="s2">"[$1]({{ site.baseurl }}{% post_url $2 %})"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"Markdown post anchor link"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"markdown"</span><span class="p">,</span><span class="w">
</span><span class="nl">"prefix"</span><span class="p">:</span><span class="w"> </span><span class="s2">"anchor"</span><span class="p">,</span><span class="w">
</span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="s2">"[$1]({{ site.baseurl }}{% post_url $2 %}#$3)"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"Markdown image"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"markdown"</span><span class="p">,</span><span class="w">
</span><span class="nl">"prefix"</span><span class="p">:</span><span class="w"> </span><span class="s2">"image"</span><span class="p">,</span><span class="w">
</span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"Markdown video"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"markdown"</span><span class="p">,</span><span class="w">
</span><span class="nl">"prefix"</span><span class="p">:</span><span class="w"> </span><span class="s2">"video"</span><span class="p">,</span><span class="w">
</span><span class="nl">"body"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{% include youtube.html id=</span><span class="se">\"</span><span class="s2">$1</span><span class="se">\"</span><span class="s2"> %}"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>
<h2 id="auxiliary-script">Auxiliary Script</h2>
<p>I haven’t found an extension like <a href="https://packagecontrol.io/packages/Jekyll">Jekyll</a> yet, so I wrote a few scripts to make my life easier.</p>
<h3 id="create-new-post">Create New Post</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="c">#!/bin/bash</span>
<span class="nb">set</span> <span class="nt">-euo</span> pipefail
<span class="nb">date</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> +<span class="s2">"%Y-%m-%d"</span><span class="si">)</span>
<span class="nv">title</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span> | <span class="nb">tr</span> <span class="s2">"[:upper:]"</span> <span class="s2">"[:lower:]"</span> | <span class="nb">tr</span> <span class="s2">" "</span> -<span class="si">)</span>
<span class="nb">cat</span> <span class="o">>></span> <span class="s2">"</span><span class="nv">$date</span><span class="s2">-</span><span class="nv">$title</span><span class="s2">.md"</span> <span class="o"><<</span> <span class="no">EOF</span><span class="sh">
---
title: </span><span class="nv">$@</span><span class="sh">
tags: []
---
</span><span class="no">EOF
</span></pre></td></tr></tbody></table></code></pre></div></div>
<p>It will create a file with the beginning of the current date, followed by the parameters of the script, where the parameters are the title. The file contains a simple template with the post’s title. For example, you can use <code class="language-plaintext highlighter-rouge">newpost Hello World</code> (the script is saved as <code class="language-plaintext highlighter-rouge">newpost</code>) to create file <code class="language-plaintext highlighter-rouge">2019-11-15-hello-world.md</code></p>
<h3 id="build-site-with-docker">Build Site with Docker</h3>
<p>I created a <a href="https://hub.docker.com/r/lynn9388/github-pages-docker">Docker image</a> to make it easy for me to build Jekyll site based on <a href="https://github.com/lynn9388/light-blog">light-blog</a>. It’s very convenient to use, as long as you install Docker, execute the following script in your site’s root directory, Docker will automatically pull the image, and then build your site.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="c">#!/bin/bash</span>
<span class="nb">set</span> <span class="nt">-euo</span> pipefail
<span class="nb">rm</span> <span class="nt">-f</span> Gemfile.lock
docker run <span class="nt">--rm</span> <span class="nt">-p</span> 4000:4000 <span class="nt">-v</span> <span class="si">$(</span><span class="nb">pwd</span><span class="si">)</span>:/site lynn9388/github-pages-docker
</pre></td></tr></tbody></table></code></pre></div></div>In the end, I switched from Sublime Text back to Visual Studio Code 😂. I think I should not go back anymore. The reason I gave up the Visual Studio Code before was that it would make my computer overheat, but I found that I can solve this problem by uninstalling or disabling unnecessary extensions.Switch IP Quickly2019-09-27T00:00:00+08:002019-09-27T00:00:00+08:00https://lynn9388.github.io/2019/09/27/switch-ip-quickly<p>I usually need to access different networks through different network settings, such as accessing the campus network via DHCP and using static IP to access the server in the lab. So I need a way to switch IP quickly.</p>
<h2 id="for-macos">For macOS</h2>
<p>macOS supports saving multiple network settings for different locations. You can see the settings in <code class="language-plaintext highlighter-rouge">System Preferences -> Network -> Location</code>.</p>
<p><img src="https://lynn9388.github.io/images/post/Network_settings_for_different_locations.png" alt="Network settings for different locations" /></p>
<h3 id="add-new-locations">Add New Locations</h3>
<p>You just need to click <code class="language-plaintext highlighter-rouge">Location -> Edit Locations... -> +</code>, and set a name for the untitled new location. For example, I set two locations, <code class="language-plaintext highlighter-rouge">Automatic</code> and <code class="language-plaintext highlighter-rouge">lab</code>. The former uses the default network settings to enable Wi-Fi to automatically obtain IP, while the latter will set a static IP, which allows me to access resources on the LAN.</p>
<p><img src="https://lynn9388.github.io/images/post/Add_a_new_location_for_network.png" alt="Add a new location for network" /></p>
<h3 id="switch-locations">Switch Locations</h3>
<p>After you add a new network, you will find a new option in the menu of the Apple logo in the upper left corner of the screen. All you need to do is switch between different locations when you need to change the IP quickly.</p>
<p><img src="https://lynn9388.github.io/images/post/Change_IP_quickly_by_switching_locations.png" alt="Change IP quickly by switching locations" /></p>
<h2 id="for-windows">For Windows</h2>
<p>Windows users could quickly configure the network through <a href="https://docs.microsoft.com/en-us/windows-server/networking/technologies/netsh/netsh">Network Shell (Netsh)</a>. For convenience, you can create a batch file and choose to execute different commands when you need to switch IP.</p>
<h3 id="create-batch-file">Create Batch File</h3>
<p>You can create a batch file (such as <code class="language-plaintext highlighter-rouge">config-ip.bat</code>) based on the code below (You can also view the source file <a href="https://github.com/lynn9388/script-tools/blob/master/windows/config-ip.bat">here</a>).</p>
<div class="language-bat highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
</pre></td><td class="rouge-code"><pre><span class="c">REM Please update the variables below before you run it</span>
<span class="kd">SET</span> <span class="kd">ethernet</span><span class="na">-adapter-name</span><span class="o">=</span><span class="kd">Ethernet</span>
<span class="kd">SET</span> <span class="kd">wifi</span><span class="na">-adapter-name</span><span class="o">=</span><span class="kd">Wi</span><span class="na">-Fi
</span><span class="kd">SET</span> <span class="kd">ethernet</span><span class="na">-static-ip</span><span class="o">=</span><span class="m">192</span>.168.1.90
<span class="kd">SET</span> <span class="kd">wifi</span><span class="na">-static-ip</span><span class="o">=</span><span class="m">192</span>.168.1.90
@echo <span class="na">off</span>
<span class="nb">cls</span>
<span class="nb">color</span> <span class="m">0</span><span class="kd">A</span>
<span class="nl">:check</span>_Permissions
<span class="nb">fsutil</span> <span class="kd">dirty</span> <span class="nb">query</span> <span class="nv">%systemdrive%</span> <span class="o">></span><span class="kr">nul</span>
<span class="k">if</span> <span class="nv">%errorLevel%</span> <span class="o">==</span> <span class="m">0</span> <span class="o">(</span>
<span class="k">goto</span> <span class="kd">loop</span>
<span class="o">)</span> <span class="k">else</span> <span class="o">(</span>
<span class="nb">echo</span> ######
<span class="nb">echo</span> # # # ###### ## #### ###### ##### # # # # ## ####
<span class="nb">echo</span> # # # # # # # # # # # # ## # # # #
<span class="nb">echo</span> ###### # ##### # # #### ##### # # # # # # # # # ####
<span class="nb">echo</span> # # # ###### # # ##### # # # # # ###### #
<span class="nb">echo</span> # # # # # # # # # # # # # ## # # # #
<span class="nb">echo</span> # ###### ###### # # #### ###### # # #### # # # # ####
<span class="nb">echo</span><span class="o">=</span>
<span class="nb">echo</span> # ###### # # ### # # ### ##### ####### ###### # ####### ####### ###### ### ###
<span class="nb">echo</span> # # # # ## ## # ## # # # # # # # # # # # # # # ### ###
<span class="nb">echo</span> # # # # # # # # # # # # # # # # # # # # # # # # ### ###
<span class="nb">echo</span> # # # # # # # # # # # # ##### # ###### # # # # # ###### # #
<span class="nb">echo</span> ####### # # # # # # # # # # # # # ####### # # # # #
<span class="nb">echo</span> # # # # # # # # ## # # # # # # # # # # # # # ### ###
<span class="nb">echo</span> # # ###### # # ### # # ### ##### # # # # # # ####### # # ### ###
<span class="nb">pause</span>
<span class="kd">Exit</span>
<span class="o">)</span>
<span class="nl">:loop</span>
<span class="nb">echo</span> <span class="m">1</span> <span class="kd">DHCP</span> <span class="vm">%ethernet</span><span class="na">-adapter-name</span><span class="err">%</span>
<span class="nb">echo</span> <span class="m">2</span> <span class="kd">Static</span> <span class="vm">%ethernet</span><span class="na">-adapter-name</span><span class="err">%</span> <span class="o">(</span><span class="vm">%ethernet</span><span class="na">-static-ip</span><span class="err">%</span><span class="o">)</span>
<span class="nb">echo</span> <span class="m">3</span> <span class="kd">DHCP</span> <span class="vm">%wifi</span><span class="na">-adapter-name</span><span class="err">%</span>
<span class="nb">echo</span> <span class="m">4</span> <span class="kd">Static</span> <span class="vm">%wifi</span><span class="na">-adapter-name</span><span class="err">%</span> <span class="o">(</span><span class="vm">%wifi</span><span class="na">-static-ip</span><span class="err">%</span><span class="o">)</span>
<span class="nb">echo</span> <span class="m">5</span> <span class="kd">Show</span> <span class="kd">IP</span> <span class="kd">Configuration</span>
<span class="nb">echo</span> <span class="m">6</span> <span class="kd">Exit</span>
<span class="nb">echo</span><span class="o">|</span><span class="kd">set</span> <span class="na">/p</span><span class="o">=</span><span class="kd">Please</span> <span class="kd">choose</span> <span class="kd">a</span> <span class="kd">option</span>:
<span class="kd">set</span><span class="na">/p </span><span class="kd">sel</span><span class="o">=</span>
<span class="k">if</span> <span class="s2">"</span><span class="nv">%sel%</span><span class="s2">"</span><span class="o">==</span><span class="s2">"1"</span> <span class="k">goto</span> <span class="kd">DHCP</span><span class="na">-Ethernet
</span><span class="k">if</span> <span class="s2">"</span><span class="nv">%sel%</span><span class="s2">"</span><span class="o">==</span><span class="s2">"2"</span> <span class="k">goto</span> <span class="kd">Static</span><span class="na">-Ethernet
</span><span class="k">if</span> <span class="s2">"</span><span class="nv">%sel%</span><span class="s2">"</span><span class="o">==</span><span class="s2">"3"</span> <span class="k">goto</span> <span class="kd">DHCP</span><span class="na">-Wifi
</span><span class="k">if</span> <span class="s2">"</span><span class="nv">%sel%</span><span class="s2">"</span><span class="o">==</span><span class="s2">"4"</span> <span class="k">goto</span> <span class="kd">Static</span><span class="na">-Wifi
</span><span class="k">if</span> <span class="s2">"</span><span class="nv">%sel%</span><span class="s2">"</span><span class="o">==</span><span class="s2">"5"</span> <span class="k">goto</span> <span class="kd">Show</span><span class="na">-IP-Configuration
</span><span class="k">if</span> <span class="s2">"</span><span class="nv">%sel%</span><span class="s2">"</span><span class="o">==</span><span class="s2">"6"</span> <span class="kd">EXIT</span>
<span class="nb">echo</span><span class="o">=</span>
<span class="nb">echo</span> <span class="kd">Please</span> <span class="kd">choose</span> <span class="kd">a</span> <span class="kd">valid</span> <span class="kd">option</span>
<span class="k">goto</span> <span class="kd">loop</span>
<span class="nl">:DHCP</span><span class="na">-Ethernet
</span><span class="nb">netsh</span> <span class="kd">interface</span> <span class="kd">ip</span> <span class="kd">set</span> <span class="kd">address</span> <span class="kd">name</span><span class="o">=</span><span class="vm">%ethernet</span><span class="na">-adapter-name</span><span class="err">%</span> <span class="kd">source</span><span class="o">=</span><span class="kd">dhcp</span>
<span class="nb">netsh</span> <span class="kd">interface</span> <span class="kd">ip</span> <span class="kd">delete</span> <span class="kd">dns</span> <span class="vm">%ethernet</span><span class="na">-adapter-name</span><span class="err">%</span> <span class="kd">all</span>
<span class="nb">ipconfig</span> <span class="na">/flushdns
</span><span class="k">goto</span> <span class="kd">Show</span><span class="na">-IP-Configuration
</span><span class="nl">:Static</span><span class="na">-Ethernet
</span><span class="nb">netsh</span> <span class="kd">interface</span> <span class="kd">ip</span> <span class="kd">set</span> <span class="kd">address</span> <span class="kd">name</span><span class="o">=</span><span class="vm">%ethernet</span><span class="na">-adapter-name</span><span class="err">%</span> <span class="kd">source</span><span class="o">=</span><span class="kd">static</span> <span class="kd">addr</span><span class="o">=</span><span class="vm">%ethernet</span><span class="na">-static-ip</span><span class="err">%</span> <span class="kd">mask</span><span class="o">=</span><span class="m">255</span>.255.255.0 <span class="kd">gateway</span><span class="o">=</span><span class="m">192</span>.168.1.1
<span class="nb">netsh</span> <span class="kd">interface</span> <span class="kd">ip</span> <span class="kd">set</span> <span class="kd">dns</span> <span class="kd">name</span><span class="o">=</span><span class="vm">%ethernet</span><span class="na">-adapter-name</span><span class="err">%</span> <span class="kd">source</span><span class="o">=</span><span class="kd">static</span> <span class="kd">addr</span><span class="o">=</span><span class="m">192</span>.168.1.1
<span class="nb">ipconfig</span> <span class="na">/flushdns
</span><span class="k">goto</span> <span class="kd">Show</span><span class="na">-IP-Configuration
</span><span class="nl">:DHCP</span><span class="na">-Wifi
</span><span class="nb">netsh</span> <span class="kd">interface</span> <span class="kd">ip</span> <span class="kd">set</span> <span class="kd">address</span> <span class="kd">name</span><span class="o">=</span><span class="vm">%wifi</span><span class="na">-adapter-name</span><span class="err">%</span> <span class="kd">source</span><span class="o">=</span><span class="kd">dhcp</span>
<span class="nb">netsh</span> <span class="kd">interface</span> <span class="kd">ip</span> <span class="kd">delete</span> <span class="kd">dns</span> <span class="vm">%wifi</span><span class="na">-adapter-name</span><span class="err">%</span> <span class="kd">all</span>
<span class="nb">ipconfig</span> <span class="na">/flushdns
</span><span class="k">goto</span> <span class="kd">Show</span><span class="na">-IP-Configuration
</span><span class="nl">:Static</span><span class="na">-Wifi
</span><span class="nb">netsh</span> <span class="kd">interface</span> <span class="kd">ip</span> <span class="kd">set</span> <span class="kd">address</span> <span class="kd">name</span><span class="o">=</span><span class="vm">%wifi</span><span class="na">-adapter-name</span><span class="err">%</span> <span class="kd">source</span><span class="o">=</span><span class="kd">static</span> <span class="kd">addr</span><span class="o">=</span><span class="vm">%wifi</span><span class="na">-static-ip</span><span class="err">%</span> <span class="kd">mask</span><span class="o">=</span><span class="m">255</span>.255.255.0 <span class="kd">gateway</span><span class="o">=</span><span class="m">192</span>.168.1.1
<span class="nb">netsh</span> <span class="kd">interface</span> <span class="kd">ip</span> <span class="kd">set</span> <span class="kd">dns</span> <span class="kd">name</span><span class="o">=</span><span class="vm">%wifi</span><span class="na">-adapter-name</span><span class="err">%</span> <span class="kd">source</span><span class="o">=</span><span class="kd">static</span> <span class="kd">addr</span><span class="o">=</span><span class="m">192</span>.168.1.1
<span class="nb">ipconfig</span> <span class="na">/flushdns
</span><span class="k">goto</span> <span class="kd">Show</span><span class="na">-IP-Configuration
</span><span class="nl">:Show</span><span class="na">-IP-Configuration
</span><span class="nb">netsh</span> <span class="kd">interface</span> <span class="kd">ip</span> <span class="kd">show</span> <span class="kd">addresses</span> <span class="vm">%ethernet</span><span class="na">-adapter-name</span><span class="err">%</span>
<span class="nb">netsh</span> <span class="kd">interface</span> <span class="kd">ip</span> <span class="kd">show</span> <span class="kd">addresses</span> <span class="vm">%wifi</span><span class="na">-adapter-name</span><span class="err">%</span>
<span class="nb">echo</span><span class="o">=</span>
<span class="k">goto</span> <span class="kd">loop</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p><strong>Note</strong> that before you run the batch file you should update the contents of the file at the start based on your network adapters and IP. If your settings for LAN are different from mine, you may need to modify other network parameters.</p>
<h3 id="run-batch-as-administrator">Run Batch as Administrator</h3>
<p>When you want to switch IP, you only need to run the batch file you created earlier and then choose one option. But be aware that you must run it as administrator, otherwise you will only see one message <code class="language-plaintext highlighter-rouge">PLEASE RUN AS ADMINISTRATOR !!</code>.</p>
<p>BTW, you can avoid manually select <code class="language-plaintext highlighter-rouge">Run as administrator</code> from context menu by following steps below</p>
<ol>
<li>Create a shortcut for this batch</li>
<li>Click <code class="language-plaintext highlighter-rouge">Properties</code> from the context menu to open <code class="language-plaintext highlighter-rouge">Shortcut Properties</code></li>
<li>Click <code class="language-plaintext highlighter-rouge">Advanced</code> from the <code class="language-plaintext highlighter-rouge">Shortcut</code> tab</li>
<li>Check <code class="language-plaintext highlighter-rouge">Run as administrator</code> in the pop-up window</li>
<li>Save and close pop-up windows</li>
</ol>
<p>After that, you only need to double-click the shortcut to run the batch file as administrator. Enjoy!😃</p>I usually need to access different networks through different network settings, such as accessing the campus network via DHCP and using static IP to access the server in the lab. So I need a way to switch IP quickly.Switch Global Proxy Quickly2019-09-23T00:00:00+08:002019-09-23T00:00:00+08:00https://lynn9388.github.io/2019/09/23/switch-global-proxy-quickly<p>Unlike the Google Chrome, Safari uses the system proxy by default and does not provide proxy API, so there is no extension like <a href="https://github.com/FelisCatus/SwitchyOmega">SwitchyOmega</a>. Since I set my default browser to Safari, the tool to quickly switch proxy has become a necessary tool for me to access Google.</p>
<h2 id="for-macos">For macOS</h2>
<p>I use <a href="https://github.com/zhuhaow/SpechtLite">SpechtLite</a>.</p>
<blockquote>
<p>A rule-based proxy app for macOS.</p>
</blockquote>
<h3 id="install-spechtlite">Install SpechtLite</h3>
<p>Just download the zip file from <a href="https://github.com/zhuhaow/SpechtLite/releases">here</a>, then move the unzipped application into <code class="language-plaintext highlighter-rouge">Applications</code> folder.</p>
<p><img src="https://lynn9388.github.io/images/post/Move_SpechtLite_into_Applications_folder.png" alt="Move SpechtLite into Applications folder" /></p>
<h3 id="configure-proxy-server">Configure Proxy Server</h3>
<p>Before you start using it, you need to add a configuration file (Filename can be set freely) into the profile folder (<code class="language-plaintext highlighter-rouge">.SpechtLite</code> folder within the root directory), which is <code class="language-plaintext highlighter-rouge">/Users/lynn/.SpechtLite</code> for my Mac.</p>
<p><img src="https://lynn9388.github.io/images/post/Add_SpechtLite_configuration_file.png" alt="Add SpechtLite configuration file" /></p>
<p>You could configure your own proxy server according to the <a href="https://github.com/zhuhaow/SpechtLite#configuration-file">demo configuration file</a>. But if you follow my settings for <a href="/2019/05/13/access-google.html#configure-local-client">Shadowsocks local client</a>, you can configure it like this:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="rouge-code"><pre><span class="na">port</span><span class="pi">:</span> <span class="m">9090</span>
<span class="na">adapter</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">id</span><span class="pi">:</span> <span class="s">heroku</span>
<span class="na">type</span><span class="pi">:</span> <span class="s">socks5</span>
<span class="na">host</span><span class="pi">:</span> <span class="s">127.0.0.1</span>
<span class="na">port</span><span class="pi">:</span> <span class="m">1090</span>
<span class="na">rule</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">type</span><span class="pi">:</span> <span class="s">all</span>
<span class="na">adapter</span><span class="pi">:</span> <span class="s">heroku</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<h3 id="up-and-running">Up and Running</h3>
<p>Click <code class="language-plaintext highlighter-rouge">Reload config</code> after launching SpechtLite. Finally, start proxy by click the name of your configuration name, and check <code class="language-plaintext highlighter-rouge">Set as system proxy</code>. When you want to stop the global proxy, just click <code class="language-plaintext highlighter-rouge">Stop proxy server</code>.</p>
<h2 id="for-windows">For Windows</h2>
<p>It’s hard to find a socks global proxy open source alternative for Windows that is as easy to use as <a href="https://www.proxifier.com">Proxifier</a>. But if one is not, we can use two instead 😂.</p>
<p>If you can <a href="/2019/05/13/access-google.html#access-google-with-shadowsocks-and-heroku">access google with Shadowsocks and Heroku</a>, you already have a Socks5 proxy. The open source tool <a href="https://github.com/shadowsocks/shadowsocks-windows">Shadowsocks for Windows</a> has build-in global proxy options, then all we have to do is convert the Socks5 protocol to the Shadowsocks protocol.</p>
<h3 id="tools">Tools</h3>
<ul>
<li><a href="https://github.com/onplus/shadowsocks-heroku/releases">shadowsocks-heroku</a>
<ul>
<li>Connect to Shadowsocks server running in Heroku with <a href="https://en.wikipedia.org/wiki/WebSocket">WebSocket</a>, and provide Socks5 proxy in local.</li>
</ul>
</li>
<li><a href="https://github.com/nadoo/glider/releases">glider</a>
<ul>
<li>Provide Shadowsocks proxy in local, and forward requests to a Socks5 proxy.</li>
</ul>
</li>
<li><a href="https://github.com/shadowsocks/shadowsocks-windows/releases">Shadowsocks for Windows</a>
<ul>
<li>Connect to a local Shadowsocks proxy, and provide global proxy for Windows.</li>
</ul>
</li>
</ul>
<p>You should already have the first tool, so you only need to download the last two tools.</p>
<h3 id="convert-socks5-to-shadowsocks">Convert Socks5 to Shadowsocks</h3>
<p>After you download <a href="https://github.com/nadoo/glider/releases">glider</a>, you can see a command line tool called <code class="language-plaintext highlighter-rouge">glider.exe</code>.</p>
<p><img src="https://lynn9388.github.io/images/post/Forward_proxy_tool_glider.png" alt="Forward proxy tool glider" /></p>
<p>To launch <code class="language-plaintext highlighter-rouge">glider</code>, you only need to run the following command in the <code class="language-plaintext highlighter-rouge">Command Prompt</code> after launching <code class="language-plaintext highlighter-rouge">shadowsocks-heroku local client</code></p>
<pre><code class="language-cmd">glider -listen ss://CHACHA20-IETF:PASSWORD@:8388 -forward socks5://127.0.0.1:1090 -verbose
</code></pre>
<p><img src="https://lynn9388.github.io/images/post/Convert_Socks5_to_Shadowsocks_with_glider.png" alt="Convert Socks5 to Shadowsocks with glider" /></p>
<p>But you can also create a batch file (named as <code class="language-plaintext highlighter-rouge">start.bat</code>) next to the <code class="language-plaintext highlighter-rouge">glider.exe</code>, just run that file when you want to launch <code class="language-plaintext highlighter-rouge">glider</code>, without having to manually enter the command each time.</p>
<div class="language-bat highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>@ECHO <span class="kd">OFF</span>
<span class="kd">CLS</span>
<span class="kd">COLOR</span> <span class="m">0</span><span class="kd">A</span>
<span class="kd">glider</span> <span class="na">-listen </span><span class="kd">ss</span>://CHACHA20<span class="na">-IETF</span><span class="nl">:PASSWORD</span>@:8388 <span class="na">-forward </span><span class="kd">socks5</span>://127.0.0.1:1090 <span class="na">-verbose
</span></pre></td></tr></tbody></table></code></pre></div></div>
<h3 id="configure-shadowsocks-for-windows">Configure Shadowsocks for Windows</h3>
<p>The last thing before you start the global proxy is to add the Shadowsocks proxy server provided by <code class="language-plaintext highlighter-rouge">glider</code> to <code class="language-plaintext highlighter-rouge">Shadowsocks for Windows</code>. You need to right click on the icon after launching <code class="language-plaintext highlighter-rouge">Shadowsocks for Windows</code>, then click <code class="language-plaintext highlighter-rouge">Servers -> Edit Servers...</code></p>
<p><img src="https://lynn9388.github.io/images/post/Configure_server_for_Shadowsocks.png" alt="Configure server for Shadowsocks" /></p>
<h3 id="set-global-proxy">Set Global Proxy</h3>
<p>It’s time to enable global proxy for Windows, you just need to click <code class="language-plaintext highlighter-rouge">System Proxy -> Global</code> in <code class="language-plaintext highlighter-rouge">Shadowsocks for Windows</code> (If the global proxy does not work, check your firewall settings). If you want to disable the global proxy, just click <code class="language-plaintext highlighter-rouge">System Proxy -> Disable</code>.</p>Unlike the Google Chrome, Safari uses the system proxy by default and does not provide proxy API, so there is no extension like SwitchyOmega. Since I set my default browser to Safari, the tool to quickly switch proxy has become a necessary tool for me to access Google.Create a Lite Windows 102019-09-06T00:00:00+08:002019-09-06T00:00:00+08:00https://lynn9388.github.io/2019/09/06/create-a-lite-windows-10<p>Since I usually use macOS, in some specific situations, such as using the full version of the Office, I need to temporarily use the Windows. My solution is to use a Windows virtual machine, but the image is one of the most simplified version.</p>
<h2 id="tools">Tools</h2>
<p>We need an official Windows 10 image (you can find the official download URL from <a href="https://tb.rg-adguard.net/public.php">TechBench by WZT</a>) and several other tools to rebuild that image.</p>
<ul>
<li><a href="https://tb.rg-adguard.net/public.php">Windows 10</a></li>
<li><a href="https://www.ultraiso.com">UltraISO</a></li>
<li><a href="http://www.chuyu.me/en/index.html">Dism++</a></li>
<li><a href="https://msmgtoolkit.in/download.html">MSMG Toolkit</a></li>
</ul>
<p><img src="https://lynn9388.github.io/images/post/Windows_10_image_and_other_tools.png" alt="Windows 10 image and other tools" /></p>
<h2 id="rebuild-windows-10-image">Rebuild Windows 10 Image</h2>
<p>Find a Windows PC to complete the following steps.</p>
<h3 id="remove-redundant-windows-versions">Remove Redundant Windows Versions</h3>
<p>If the Windows image contains multiple versions, we can reduce the size of the image by removing the extra versions.</p>
<ol>
<li>Open the Windows ISO image from UltraISO using <code class="language-plaintext highlighter-rouge">File -> Open...</code></li>
<li>
<p>Extract <code class="language-plaintext highlighter-rouge">install.win</code> from <code class="language-plaintext highlighter-rouge">sources</code> folder using <code class="language-plaintext highlighter-rouge">Extract To...</code></p>
<p><img src="https://lynn9388.github.io/images/post/Extract_install_image_with_UltraISO.png" alt="Extract install image with UltraISO" /></p>
</li>
<li>Open <code class="language-plaintext highlighter-rouge">install.win</code> from Dism++ using <code class="language-plaintext highlighter-rouge">File -> Open Image File</code></li>
<li>
<p>Extract the smallest image using <code class="language-plaintext highlighter-rouge">Export image</code> (Choose <code class="language-plaintext highlighter-rouge">Max</code> in <code class="language-plaintext highlighter-rouge">Save as type</code>)</p>
<p><img src="https://lynn9388.github.io/images/post/Extract_install_image_with_Dism++.png" alt="Extract install image with Dism++" /></p>
</li>
<li>Replace the original <code class="language-plaintext highlighter-rouge">install.win</code> with the new extracted small installation image in UltraISO using <code class="language-plaintext highlighter-rouge">Actions -> Add Files...</code></li>
<li>Save the Windows image using <code class="language-plaintext highlighter-rouge">File -> Save</code></li>
</ol>
<p>The new image (the first) is a few hundred megabytes smaller than the original image.</p>
<p><img src="https://lynn9388.github.io/images/post/Size_comparison_after_removing_redundant_Windows_versions.png" alt="Size comparison after removing redundant Windows versions" /></p>
<h3 id="remove-redundant-windows-components">Remove Redundant Windows Components</h3>
<p>Next, we need to remove the extra Windows components to further reduce the storage after the operating system is installed.</p>
<ol>
<li>Extract downloaded ToolKit archive file</li>
<li>Copy your new Windows ISO image to ToolKit’s <code class="language-plaintext highlighter-rouge">ISO</code> folder</li>
<li>Run <code class="language-plaintext highlighter-rouge">Start.cmd</code> as administrator</li>
<li>Agree to ToolKit’s EULA by pressing <code class="language-plaintext highlighter-rouge">A</code> key</li>
<li>Press <code class="language-plaintext highlighter-rouge">Enter</code> key to continue</li>
<li>Extract the source image using <code class="language-plaintext highlighter-rouge">Source -> Extract Source from DVD ISO Image</code> menu</li>
<li>Select the source image using <code class="language-plaintext highlighter-rouge">Source -> Select Source from <DVD> Folder</code> menu</li>
<li>Cleanup the source image using <code class="language-plaintext highlighter-rouge">Apply -> Cleanup Source Images</code> menu</li>
<li>Remove all required Windows components using <code class="language-plaintext highlighter-rouge">Remove -> Remove Windows Components</code> menu (This could take hours depends on how many components you want to remove)</li>
<li>Cleanup the source image using <code class="language-plaintext highlighter-rouge">Apply -> Cleanup Source Images</code> menu</li>
<li>Apply & save changes to source image using <code class="language-plaintext highlighter-rouge">Apply -> Apply & Save Changes to Source Images</code> menu</li>
<li>Rebuild source image using <code class="language-plaintext highlighter-rouge">Apply -> Rebuild Source Images</code> menu</li>
<li>Export source image to a ISO image <code class="language-plaintext highlighter-rouge">Target -> Make a DVD ISO Image</code> menu</li>
</ol>
<p>You will find the new ISO image (the second) in ToolKit’s <code class="language-plaintext highlighter-rouge">ISO</code> folder which is much smaller than the original image (the third).</p>
<p><img src="https://lynn9388.github.io/images/post/Size_comparison_after_removing_redundant_Windows_components.png" alt="Size comparison after removing redundant Windows components" /></p>
<h2 id="test-in-vm">Test in VM</h2>
<p>I create two virtual machines with the original image and the new lite image, then compare their resource usage. I choose <code class="language-plaintext highlighter-rouge">Windows 10 Home N</code> for the original version of Windows 10 virtual machine which is the same Windows version in the lite image.</p>
<p><img src="https://lynn9388.github.io/images/post/Choose_Windows_version_during_installation.png" alt="Choose Windows version during installation" /></p>
<h3 id="result">Result</h3>
<p>We can see from the picture below that virtual machines created with the lite image take up less storage and use less memory at runtime.</p>
<p><img src="https://lynn9388.github.io/images/post/Resource_usage_comparison_between_original_Windows_and_lite_Windows.png" alt="Resource usage comparison between original Windows and lite Windows" /></p>
<p>This is mainly because the system only contains the necessary system applications.</p>
<p><img src="https://lynn9388.github.io/images/post/Apps_number_comparison_between_original_Windows_and_lite_Windows.png" alt="Apps number comparison between original Windows and lite Windows" /></p>
<p>As you can see from the comparison, the lite virtual machine is indeed lighter and certainly faster.</p>Since I usually use macOS, in some specific situations, such as using the full version of the Office, I need to temporarily use the Windows. My solution is to use a Windows virtual machine, but the image is one of the most simplified version.Upgrade of Keep Grade — KG.11 🎉2019-08-22T00:00:00+08:002019-08-22T00:00:00+08:00https://lynn9388.github.io/2019/08/22/upgrade-of-keep-grade-%E2%80%94-kg.11<p>From 5 kilometers, 10 kilometers, to the half-marathon, after 237 days I finally upgraded to the KG.11 on August 18, which is very exciting for me, and I look forward to the arrival of KG.12.</p>
<p><img src="https://lynn9388.github.io/images/post/KG.11.png" alt="KG.11" /></p>
<p>Then I received a free key ring yesterday 😂</p>
<p><img src="https://lynn9388.github.io/images/post/Key_ring_for_KG.11.jpeg" alt="Key ring for KG.11" /></p>From 5 kilometers, 10 kilometers, to the half-marathon, after 237 days I finally upgraded to the KG.11 on August 18, which is very exciting for me, and I look forward to the arrival of KG.12.Set Up Sublime Text for Markdown and Jekyll2019-07-27T00:00:00+08:002019-07-27T00:00:00+08:00https://lynn9388.github.io/2019/07/27/set-up-sublime-text-for-markdown-and-jekyll<p><a href="https://www.sublimetext.com">Sublime Text</a> might be the first and most used code editor during my undergraduate stage. I have also tried <a href="https://www.sublimetext.com">Atom</a> when they released the stable version, but I finally gave up after a short trial because it was too slow, especially after installing a lot of packages. After the official release of <a href="https://code.visualstudio.com/">Visual Studio Code</a>, I immediately chose it, it has good performance, easy-to-use extensions, and most importantly, it integrates with Git.</p>
<p>Visual Studio Code has been working very well all the time, but a week ago, I found that it always caused my computer to be hot, even if I didn’t do anything, maybe because it was based on <a href="https://electronjs.org">Electron</a> (which uses Chromium, that’s also why I started to set Safari as my default browser instead of Chrome). Then I started to miss Sublime Text. After I opened its website, I found that it also started to integrate Git 👍, which is exactly what I want.</p>
<blockquote>
<p>I have <a href="/2019/11/15/set-up-visual-studio-code-for-markdown-and-jekyll.html">switched back to Visual Studio Code</a>.</p>
</blockquote>
<h2 id="precondition">Precondition</h2>
<p>After you install <a href="https://www.sublimetext.com/3">Sublime Text 3</a>, you should probably also install <a href="https://packagecontrol.io/installation">Package Control</a>, which makes it easier to manage other packages.</p>
<p>In the latest version of Sublime Text 3, you only need to click <code class="language-plaintext highlighter-rouge">Tools -> Install Package Control</code> menu item.</p>
<h2 id="for-markdown">For Markdown</h2>
<p>Sublime Text 3 has provided good syntax highlighting for Markdown, but we also need some packages and update the settings to make it more suitable for writing Markdown.</p>
<h3 id="automatic-completion">Automatic Completion</h3>
<p>I have introduced the <a href="https://lynn9388.github.io/light-blog/2019/07/19/writing-with-light-blog.html#add-more-content">syntax of Markdown</a>, which is pretty simple, so in fact, you can use the built-in automatic completion function directly. But if you want more advanced features, you can try <a href="https://packagecontrol.io/packages/MarkdownEditing">MarkdownEditing</a>, I have tried it, but I don’t like it.</p>
<h3 id="markdown-linting">Markdown Linting</h3>
<p>I am used to checking my Markdown file with <a href="https://github.com/markdownlint/markdownlint">markdownlint</a>. After you <a href="https://github.com/markdownlint/markdownlint#installation">install it</a>, you need an easy way to use it in Sublime Text instead of calling it from the terminal each time.</p>
<h4 id="configure-markdownlint">Configure Markdownlint</h4>
<p>According to <a href="https://github.com/markdownlint/markdownlint/blob/master/docs/configuration.md">Mdl configuration</a>, <a href="https://github.com/markdownlint/markdownlint/blob/master/docs/creating_styles.md">Creating styles</a>, and <a href="https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md">Rules</a>, we need to create <code class="language-plaintext highlighter-rouge">~/.mdlrc</code> and a style file (like <code class="language-plaintext highlighter-rouge">~/.mdl-rules.rb</code>).</p>
<p>My settings for <code class="language-plaintext highlighter-rouge">~/.mdlrc</code>:</p>
<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>show_kramdown_warnings true
ignore_front_matter true
style "/Users/lynn/.mdl-rules.rb"
</pre></td></tr></tbody></table></code></pre></div></div>
<p>We need to set an absolute directory for <code class="language-plaintext highlighter-rouge">style</code>, which is <code class="language-plaintext highlighter-rouge">/Users/lynn/.mdl-rules.rb</code> for <code class="language-plaintext highlighter-rouge">~/.mdl-rules.rb</code> in my computer, but you should set it based on the path in your computer.</p>
<p>My settings for <code class="language-plaintext highlighter-rouge">~/.mdl-rules.rb</code>:</p>
<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre><span class="n">all</span>
<span class="n">rule</span> <span class="s1">'MD003'</span><span class="p">,</span> <span class="ss">:style</span> <span class="o">=></span> <span class="ss">:atx</span>
<span class="n">rule</span> <span class="s1">'MD004'</span><span class="p">,</span> <span class="ss">:style</span> <span class="o">=></span> <span class="ss">:dash</span>
<span class="n">rule</span> <span class="s1">'MD007'</span><span class="p">,</span> <span class="ss">:indent</span><span class="o">=></span> <span class="mi">4</span>
<span class="n">rule</span> <span class="s1">'MD029'</span><span class="p">,</span> <span class="ss">:style</span> <span class="o">=></span> <span class="ss">:one</span>
<span class="n">exclude_rule</span> <span class="s1">'MD002'</span>
<span class="n">exclude_rule</span> <span class="s1">'MD013'</span>
<span class="n">exclude_rule</span> <span class="s1">'MD041'</span>
<span class="n">exclude_rule</span> <span class="s1">'MD046'</span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p>According to your Markdown writing style and <a href="https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md">rules</a>, you can set different lint rules.</p>
<h4 id="configure-sublime-text">Configure Sublime Text</h4>
<blockquote>
<p>Sublime Text provides <a href="https://www.sublimetext.com/docs/3/build_systems.html"><em>build systems</em></a> to allow users to run external programs. Examples of common uses for build systems include: compiling, transpiling, linting, and executing tests.</p>
</blockquote>
<p>We can create a new build system with <code class="language-plaintext highlighter-rouge">Tools -> Build System -> New Build System...</code> menu.</p>
<p>My setting for <code class="language-plaintext highlighter-rouge">Markdown Lint.sublime-build</code> (You could change the file name):</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
</span><span class="nl">"cmd"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"mdl"</span><span class="p">,</span><span class="w"> </span><span class="s2">"$file"</span><span class="p">],</span><span class="w">
</span><span class="nl">"selector"</span><span class="p">:</span><span class="w"> </span><span class="s2">"text.html.markdown"</span><span class="p">,</span><span class="w">
</span><span class="nl">"file_regex"</span><span class="p">:</span><span class="w"> </span><span class="s2">"([ </span><span class="se">\\</span><span class="s2">w-]+</span><span class="se">\\</span><span class="s2">.md):(</span><span class="se">\\</span><span class="s2">d+): ([^</span><span class="se">\\</span><span class="s2">n]+)"</span><span class="p">,</span><span class="w">
</span><span class="nl">"quiet"</span><span class="p">:</span><span class="w"> </span><span class="s2">"true"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>
<p>After you set the build system, click <code class="language-plaintext highlighter-rouge">Tools -> Build</code> in the Markdown file you opened to check the Markdown format according to the rules you set.</p>
<h3 id="markdown-preview">Markdown Preview</h3>
<p>We need two packages for the feature:</p>
<ul>
<li><a href="https://packagecontrol.io/packages/MarkdownPreview">MarkdownPreview</a></li>
<li><a href="https://packagecontrol.io/packages/LiveReload">LiveReload</a></li>
</ul>
<p>After you install them, you need to enable <code class="language-plaintext highlighter-rouge">LiveReload</code>, just search <code class="language-plaintext highlighter-rouge">LiveReload: Enable/disable plug-ins</code> in <code class="language-plaintext highlighter-rouge">Tools -> Command Palette...</code>, and choose one plug-in that you like, my choose is <code class="language-plaintext highlighter-rouge">Simple Reload with delay(400ms)</code>.</p>
<p>You can also configure the settings of <code class="language-plaintext highlighter-rouge">Markdown Preview</code> in <code class="language-plaintext highlighter-rouge">Sublime Text -> Preferences -> Package Settings -> Markdown Preview -> Settings</code>, mine is:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
</span><span class="nl">"enabled_parsers"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"github"</span><span class="p">],</span><span class="w">
</span><span class="nl">"github_mode"</span><span class="p">:</span><span class="w"> </span><span class="s2">"gfm"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>
<p>When you want to preview a Markdown file, just search <code class="language-plaintext highlighter-rouge">Markdown Preview: Preview in Browser</code> in <code class="language-plaintext highlighter-rouge">Command Palette</code>, and it will show like this:</p>
<p><img src="https://lynn9388.github.io/images/post/Markdown_preview_for_Sublime_Text.png" alt="Markdown preview for Sublime Text" /></p>
<h2 id="for-jekyll">For Jekyll</h2>
<p>I write Markdown for my blog, which is powered by <a href="https://jekyllrb.com/">Jekyll</a> and <a href="https://github.com/lynn9388/light-blog">light-blog</a>. Since I always need to create posts, insert references and image resources, I need to enter the date and some specific code in Markdown. Fortunately, Sublime Text and the community provide the corresponding features and package to meet my requirements.</p>
<ul>
<li><a href="https://docs.sublimetext.info/en/latest/extensibility/snippets.html">Snippets</a></li>
<li><a href="https://packagecontrol.io/packages/Jekyll">Jekyll</a></li>
</ul>
<h3 id="snippets">Snippets</h3>
<p>I said <a href="#automatic-completion">earlier</a> that syntax of Markdown is simple, but it’s boring to type <a href="https://lynn9388.github.io/light-blog/2019/07/19/writing-with-light-blog.html#links">links</a> and <a href="https://lynn9388.github.io/light-blog/2019/07/19/writing-with-light-blog.html#multimedia-elements">multimedia elements</a>. So I create several snippets in <code class="language-plaintext highlighter-rouge">Tools -> Developer -> New Snippet...</code>, that let me type in a few keywords and press the <code class="language-plaintext highlighter-rouge">tab</code> key to type the duplicates for me.</p>
<p>For example, I create <code class="language-plaintext highlighter-rouge">Markdown Anchor Link.sublime-snippet</code> to help me type the <a href="https://lynn9388.github.io/light-blog/2019/07/19/writing-with-light-blog.html#images">image element</a>:</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="rouge-code"><pre><span class="nt"><snippet></span>
<span class="nt"><content></span><span class="cp"><
]]></span><span class="nt"></content></span>
<span class="c"><!-- Optional: Set a tabTrigger to define how to trigger the snippet --></span>
<span class="nt"><tabTrigger></span>image<span class="nt"></tabTrigger></span>
<span class="c"><!-- Optional: Set a scope to limit where the snippet will trigger --></span>
<span class="nt"><scope></span>text.html.markdown<span class="nt"></scope></span>
<span class="nt"></snippet></span>
</pre></td></tr></tbody></table></code></pre></div></div>
<p>After I add it, I can insert an image like this:</p>
<p><img src="https://lynn9388.github.io/images/post/Automatic_completion_with_sublime_text_snippets.gif" alt="Automatic completion with sublime text snippets" /></p>
<h3 id="jekyll">Jekyll</h3>
<p>This package helps me to create a post and insert images. Like other packages, all I need to do is <a href="https://packagecontrol.io/packages/Jekyll">install it</a> and configure its settings in <code class="language-plaintext highlighter-rouge">Sublime Text -> Preferences -> Package Settings -> Jekyll -> Settings - User</code>, then call the functions it provides via <code class="language-plaintext highlighter-rouge">Command Palette</code>.</p>
<p>My settings for it is:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
</span><span class="nl">"jekyll_posts_path"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/Users/lynn/Documents/Writing/Blog/lynn9388.github.io/_posts"</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_drafts_path"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/Users/lynn/Documents/Writing/Blog/lynn9388.github.io/_drafts"</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_templates_path"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/Users/lynn/Documents/Writing/Blog/lynn9388.github.io/_templates"</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_auto_find_paths"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_uploads_path"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/Users/lynn/Documents/Writing/Blog/lynn9388.github.io/assets"</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_uploads_baseurl"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_default_markup"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Markdown"</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_markdown_extension"</span><span class="p">:</span><span class="w"> </span><span class="s2">"md"</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_send_to_trash"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_date_format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"%Y-%m-%d"</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_datetime_format"</span><span class="p">:</span><span class="w"> </span><span class="s2">"%Y-%m-%d %H:%M:%S"</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_debug"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
</span><span class="nl">"jekyll_utility_disable"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>
<p>Through all the settings above, I finally got a satisfactory writing editor for my blog 🎉.</p>Sublime Text might be the first and most used code editor during my undergraduate stage. I have also tried Atom when they released the stable version, but I finally gave up after a short trial because it was too slow, especially after installing a lot of packages. After the official release of Visual Studio Code, I immediately chose it, it has good performance, easy-to-use extensions, and most importantly, it integrates with Git.