Jekyll2022-04-19T09:11:07+00:00https://etern.github.io/feed.xmlBlog惟江上之清风,与山间之明月,耳得之而为声,目遇之而成色
quick sort2022-04-19T08:50:05+00:002022-04-19T08:50:05+00:00https://etern.github.io/2022/04/19/quick-sort<p>When haskellers say they can implement quick sort in just 2 loc:</p>
<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">qsort</span> <span class="kt">[]</span> <span class="o">=</span> <span class="kt">[]</span>
<span class="n">qsort</span> <span class="p">(</span><span class="n">x</span><span class="o">:</span><span class="n">xs</span><span class="p">)</span> <span class="o">=</span> <span class="n">qsort</span> <span class="p">[</span><span class="n">a</span> <span class="o">|</span> <span class="n">a</span> <span class="o"><-</span> <span class="n">xs</span><span class="p">,</span> <span class="n">a</span> <span class="o"><=</span> <span class="n">x</span><span class="p">]</span> <span class="o">++</span> <span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">++</span> <span class="n">qsort</span> <span class="p">[</span><span class="n">a</span> <span class="o">|</span> <span class="n">a</span> <span class="o"><-</span> <span class="n">xs</span><span class="p">,</span> <span class="n">a</span> <span class="o">></span> <span class="n">x</span><span class="p">]</span>
</code></pre></div></div>
<p>Pythoner smiles:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">qsort</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="p">[],</span> <span class="o">*</span><span class="n">xs</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span> <span class="ow">and</span> <span class="p">(</span><span class="n">qsort</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">xs</span> <span class="k">if</span> <span class="n">a</span> <span class="o"><</span> <span class="n">x</span><span class="p">])</span> <span class="o">+</span> <span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">+</span> <span class="n">qsort</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">b</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">xs</span> <span class="k">if</span> <span class="n">b</span> <span class="o">>=</span><span class="n">x</span><span class="p">]))</span>
<span class="c1"># (x != 0) call with arg destructuring: qsort(*[3, 1, 2])
</span></code></pre></div></div>
<p>For linked list sort, we don’t have to do inplace swaping, this is
alright. Argument destructuring is used to imitate haskell pattern
matching, and here is a real pattern matching version (py3.10):</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">qsort</span><span class="p">(</span><span class="n">xs</span><span class="p">):</span>
<span class="n">match</span> <span class="n">xs</span><span class="p">:</span>
<span class="n">case</span> <span class="p">[]:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">case</span> <span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="o">*</span><span class="n">rest</span><span class="p">]:</span>
<span class="k">return</span> <span class="n">qsort</span><span class="p">([</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">rest</span> <span class="k">if</span> <span class="n">a</span> <span class="o"><</span> <span class="n">x</span><span class="p">])</span> <span class="o">+</span> <span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">+</span> <span class="n">qsort</span><span class="p">([</span><span class="n">b</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">rest</span> <span class="k">if</span> <span class="n">b</span> <span class="o">>=</span><span class="n">x</span><span class="p">])</span>
</code></pre></div></div>
<p>Still concise, power of multi paradigm language!</p>When haskellers say they can implement quick sort in just 2 loc:Add toggle switch for everything to your Windows desktop2022-02-16T10:56:55+00:002022-02-16T10:56:55+00:00https://etern.github.io/2022/02/16/add-toggle-switch-to-your-windows-desktop<p>The idea is simple:</p>
<ol>
<li>With powershell script, you can do almost everything on Windows,
for instance, start/stop a service:
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Start-Service</span><span class="w"> </span><span class="nt">-Name</span><span class="w"> </span><span class="nx">FortiSslvpnDaemon</span><span class="w">
</span><span class="n">Stop-Service</span><span class="w"> </span><span class="nt">-Name</span><span class="w"> </span><span class="nx">FortiSslvpnDaemon</span><span class="w">
</span></code></pre></div> </div>
</li>
<li>Create a desktop shortcut for that script</li>
<li>You can change the look of shortcut on clicking!! That makes a
switch with visual state</li>
</ol>
<p>Here an example powershell script that start/stop a service:</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$shortCutFile</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"C:\Users\xxx\Desktop\ToggleFortiVPNDaemon.lnk"</span><span class="w">
</span><span class="nv">$svcName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"FortiSslvpnDaemon"</span><span class="w">
</span><span class="kr">function</span><span class="w"> </span><span class="nf">Change-Shortcut-Icon</span><span class="p">(</span><span class="nv">$scFile</span><span class="p">,</span><span class="w"> </span><span class="nv">$iconNo</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nv">$WScriptShell</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-Object</span><span class="w"> </span><span class="nt">-ComObject</span><span class="w"> </span><span class="nx">WScript.Shell</span><span class="w">
</span><span class="nv">$shortcut</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$WScriptShell</span><span class="o">.</span><span class="nf">CreateShortcut</span><span class="p">(</span><span class="nv">$scFile</span><span class="p">)</span><span class="w">
</span><span class="nv">$shortcut</span><span class="o">.</span><span class="nf">IconLocation</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"C:\Windows\System32\imageres.dll, </span><span class="nv">$iconNo</span><span class="s2">"</span><span class="w">
</span><span class="nv">$shortcut</span><span class="o">.</span><span class="nf">Save</span><span class="p">()</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="nv">$svc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Get-Service</span><span class="w"> </span><span class="nt">-Name</span><span class="w"> </span><span class="nv">$svcName</span><span class="w">
</span><span class="kr">if</span><span class="w"> </span><span class="p">(</span><span class="nv">$svc</span><span class="o">.</span><span class="nf">Status</span><span class="w"> </span><span class="o">-eq</span><span class="w"> </span><span class="s1">'Running'</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="n">Stop-Service</span><span class="w"> </span><span class="nt">-Name</span><span class="w"> </span><span class="nv">$svcName</span><span class="w">
</span><span class="n">echo</span><span class="w"> </span><span class="s2">"stoped"</span><span class="w">
</span><span class="n">Change-Shortcut-Icon</span><span class="w"> </span><span class="nv">$shortCutFile</span><span class="w"> </span><span class="nx">26</span><span class="w">
</span><span class="p">}</span><span class="w"> </span><span class="kr">elseif</span><span class="w"> </span><span class="p">(</span><span class="nv">$svc</span><span class="o">.</span><span class="nf">Status</span><span class="w"> </span><span class="o">-eq</span><span class="w"> </span><span class="s1">'Stopped'</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="n">Start-Service</span><span class="w"> </span><span class="nt">-Name</span><span class="w"> </span><span class="nv">$svcName</span><span class="w">
</span><span class="n">echo</span><span class="w"> </span><span class="s2">"started"</span><span class="w">
</span><span class="n">Change-Shortcut-Icon</span><span class="w"> </span><span class="nv">$shortCutFile</span><span class="w"> </span><span class="nx">28</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Store this script as <code class="language-plaintext highlighter-rouge">ToggleFortiVPNDaemon.ps1</code> somewhere like
<code class="language-plaintext highlighter-rouge">C:/myscripts</code>, and create Desktop shortcut for it, rename the
shortcut to <code class="language-plaintext highlighter-rouge">ToggleFortiVPNDaemon</code>.</p>
<p>To run the shortcut as Admin (required by service commands), open
property dialog of the shortcut, in the <code class="language-plaintext highlighter-rouge">Target</code> field, add
<code class="language-plaintext highlighter-rouge">powershell</code> before the script name, and click <code class="language-plaintext highlighter-rouge">Advanced</code> button,
check the <code class="language-plaintext highlighter-rouge">Run as Admin</code>.</p>
<p>Now, double click the Desktop shortcut, after a confirmation for admin
permission, the service is under control.</p>
<p>The shortcut icon changes as you click, to reflect the service state,
and that’s the fantastic part, let’s examine it a bit more.</p>
<p>The <code class="language-plaintext highlighter-rouge">Change-Shortcut-Icon</code> function accepts a <code class="language-plaintext highlighter-rouge">$iconNo</code> argument,
which is the index into icons in resource file <code class="language-plaintext highlighter-rouge">imageres.dll</code>, you can
use a separate <code class="language-plaintext highlighter-rouge">*.ico</code> file for this, but the builtin icon resource is
just easier for maintain, it’s already there.</p>
<p>To view all icons in <code class="language-plaintext highlighter-rouge">imageres.dll</code>, I recommand
<a href="https://www.botproductions.com/iconview/iconview.html">IconViewer</a>,
after install, it’s integreted in windows property dialog. In above
script, I use number 26 and 28, those are:</p>
<ul>
<li>red cross icon for <code class="language-plaintext highlighter-rouge">Stopped</code> status</li>
<li>green check icon for <code class="language-plaintext highlighter-rouge">Running</code> status</li>
</ul>
<p>But I still don’t know how to get the icon number, the #number shown
in IconViewer is not right, I tried it out, tell me if you know how.</p>The idea is simple: With powershell script, you can do almost everything on Windows, for instance, start/stop a service: Start-Service -Name FortiSslvpnDaemon Stop-Service -Name FortiSslvpnDaemon Create a desktop shortcut for that script You can change the look of shortcut on clicking!! That makes a switch with visual stateI wrote this blog post in markdown without writing markdown2022-02-11T15:08:00+00:002022-02-11T15:08:00+00:00https://etern.github.io/2022/02/11/i-wrote-this-blog-post-in-markdown-without-writing-markdown<p>Actually, I wrote Org.</p>
<p>Github pages is awesome, with the default supported <code class="language-plaintext highlighter-rouge">jekyll</code>, you can’t
write in org-mode, some people resort to alternative site generators,
like <code class="language-plaintext highlighter-rouge">hugo</code>, for a workaround, and here is another way:
<a href="https://github.com/etern/edit-as-format">edit-as-format</a>.</p>
<h1 id="how-to-use-the-package">How to use the package</h1>
<p>With this package, you can edit one format as another format, in
<strong>emacs</strong>, as long as both format supported by pandoc, like <code class="language-plaintext highlighter-rouge">org</code> <->
<code class="language-plaintext highlighter-rouge">markdown</code>.</p>
<p>Here’s the steps:</p>
<ol>
<li>
<p>Create this blog post as markdown, open it in emacs. (the parent
buffer)</p>
</li>
<li>
<p><code class="language-plaintext highlighter-rouge">M-x</code> <code class="language-plaintext highlighter-rouge">edit-as-format-org</code> will open an org-mode buffer. (the
indirect buffer)</p>
</li>
<li>
<p>Write in this buffer with Org syntax, <code class="language-plaintext highlighter-rouge">C-x C-s</code> to commit back to
parent buffer.</p>
</li>
</ol>
<p>It works vice versa, in case you want to edit Org files as markdown,
<code class="language-plaintext highlighter-rouge">M-x</code> <code class="language-plaintext highlighter-rouge">edit-as-format</code> choose <code class="language-plaintext highlighter-rouge">markdown</code> from the prompt. Or, define
your own convenient commands:</p>
<div class="language-elisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">edit-org-as-markdown</span> <span class="p">()</span>
<span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
<span class="p">(</span><span class="nv">edit-as-format</span> <span class="s">"org"</span> <span class="s">"markdown"</span><span class="p">))</span>
</code></pre></div></div>
<h1 id="why-should-you-use-it">Why should you use it</h1>
<p>What really matters about blogging format, the <strong>syntax</strong> or <strong>storage
format</strong>? Here is my view:</p>
<table>
<thead>
<tr>
<th>Factor</th>
<th>Really Matters?</th>
</tr>
</thead>
<tbody>
<tr>
<td>Syntax</td>
<td>Yes</td>
</tr>
<tr>
<td>Writing Experience</td>
<td>Yes</td>
</tr>
<tr>
<td>Storage file</td>
<td>No</td>
</tr>
</tbody>
</table>
<ul>
<li>I like Org over markdown, because of the syntax, I like to write
slash(/) for <em>italic</em>, which is more intuitive than star(*)</li>
<li>I like Org inside <strong>Emacs</strong>, it feels soooo good editing Org tables
with <code class="language-plaintext highlighter-rouge">TAB</code> key</li>
<li>How is the file stored, <code class="language-plaintext highlighter-rouge">*.md</code> file or <code class="language-plaintext highlighter-rouge">*.org</code> file? pure text? or
even binary? Not important, only if it can be edited in emacs with
Org syntax</li>
</ul>
<p>If you agree with me, the <code class="language-plaintext highlighter-rouge">hugo</code> solution seems less attractive, you
should try <code class="language-plaintext highlighter-rouge">edit-as-format</code> ;)</p>
<p>Org mode is such big thing, pandoc might not support all of it’s
features, I just show you the most basic ones: emphasis, links,
ordered/unordered list, code blocks and tables, that’s great amount for
blog posting.</p>
<p><em>Caution: <code class="language-plaintext highlighter-rouge">edit-as-format-org</code> will process the whole buffer if there’s
no marked region, for posts with
<a href="https://jekyllrb.com/docs/front-matter/">front-matter</a>, mark region to
exclude it first.</em></p>Actually, I wrote Org. Github pages is awesome, with the default supported jekyll, you can’t write in org-mode, some people resort to alternative site generators, like hugo, for a workaround, and here is another way: edit-as-format. How to use the package With this package, you can edit one format as another format, in emacs, as long as both format supported by pandoc, like org <-> markdown. Here’s the steps: Create this blog post as markdown, open it in emacs. (the parent buffer) M-x edit-as-format-org will open an org-mode buffer. (the indirect buffer) Write in this buffer with Org syntax, C-x C-s to commit back to parent buffer. It works vice versa, in case you want to edit Org files as markdown, M-x edit-as-format choose markdown from the prompt. Or, define your own convenient commands: (defun edit-org-as-markdown () (interactive) (edit-as-format "org" "markdown")) Why should you use it What really matters about blogging format, the syntax or storage format? Here is my view: Factor Really Matters? Syntax Yes Writing Experience Yes Storage file No I like Org over markdown, because of the syntax, I like to write slash(/) for italic, which is more intuitive than star(*) I like Org inside Emacs, it feels soooo good editing Org tables with TAB key How is the file stored, *.md file or *.org file? pure text? or even binary? Not important, only if it can be edited in emacs with Org syntax If you agree with me, the hugo solution seems less attractive, you should try edit-as-format ;) Org mode is such big thing, pandoc might not support all of it’s features, I just show you the most basic ones: emphasis, links, ordered/unordered list, code blocks and tables, that’s great amount for blog posting. Caution: edit-as-format-org will process the whole buffer if there’s no marked region, for posts with front-matter, mark region to exclude it first.Setup github pages2022-02-07T13:12:55+00:002022-02-07T13:12:55+00:00https://etern.github.io/2022/02/07/setup-github-pages<h1 id="install-jekyll">Install jekyll</h1>
<ol>
<li><code class="language-plaintext highlighter-rouge">apt install ruby ruby-dev</code></li>
<li><code class="language-plaintext highlighter-rouge">gem install jekyll bundler</code></li>
</ol>
<h1 id="create-site">Create site</h1>
<ol>
<li><code class="language-plaintext highlighter-rouge">mkdir mysite</code></li>
<li><code class="language-plaintext highlighter-rouge">jekyll new --skip-bundle .</code></li>
<li>edit Gemfile, comment out <code class="language-plaintext highlighter-rouge">gem "jekyll"</code>, uncomment <code class="language-plaintext highlighter-rouge">gem "github-pages"</code></li>
</ol>
<h1 id="configure-site">Configure site</h1>
<p><code class="language-plaintext highlighter-rouge">_config.yml</code></p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">defaults</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">scope</span><span class="pi">:</span>
<span class="na">path</span><span class="pi">:</span> <span class="s2">"</span><span class="s">"</span> <span class="c1"># an empty string here means all files in the project</span>
<span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">posts"</span> <span class="c1"># previously `post` in Jekyll 2.2.</span>
<span class="na">values</span><span class="pi">:</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s2">"</span><span class="s">post"</span> <span class="c1"># use `post` layout for all posts</span>
<span class="na">comments</span><span class="pi">:</span> <span class="no">true</span> <span class="c1"># show disqus comment for all posts</span>
<span class="na">disqus</span><span class="pi">:</span>
<span class="na">shortname</span><span class="pi">:</span> <span class="s">xxxx</span> <span class="c1"># where is it used: minima-theme post template</span>
<span class="na">url</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://xxx"</span> <span class="c1"># disqus `this.page.url` prefix</span>
</code></pre></div></div>
<h1 id="update-dependency">Update dependency</h1>
<ol>
<li><code class="language-plaintext highlighter-rouge">rm Gemfile.lock</code></li>
<li><code class="language-plaintext highlighter-rouge">bundle update</code></li>
</ol>
<h1 id="run-locally">Run locally</h1>
<p><code class="language-plaintext highlighter-rouge">bundle exec jekyll serve -P 8080</code></p>
<h1 id="create-post">Create post</h1>
<ol>
<li><code class="language-plaintext highlighter-rouge">cd _post</code></li>
<li><code class="language-plaintext highlighter-rouge">emacs `date -I`-post-name.md</code></li>
<li>
<p><code class="language-plaintext highlighter-rouge">M-x</code> <code class="language-plaintext highlighter-rouge">auto-insert</code></p>
<p>where front matter template is defined as:</p>
<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">define-auto-insert</span> <span class="p">(</span><span class="nv">rx</span> <span class="p">(</span><span class="nv">seq</span> <span class="p">(</span><span class="nb">=</span> <span class="mi">4</span> <span class="nv">digit</span><span class="p">)</span> <span class="nv">?-</span> <span class="p">(</span><span class="nb">=</span> <span class="mi">2</span> <span class="nv">digit</span><span class="p">)</span> <span class="nv">?-</span> <span class="p">(</span><span class="nb">=</span> <span class="mi">2</span> <span class="nv">digit</span><span class="p">)</span> <span class="p">(</span><span class="nv">one-or-more</span> <span class="nv">any</span><span class="p">)</span> <span class="s">".md"</span><span class="p">))</span>
<span class="p">(</span><span class="k">lambda</span> <span class="p">()</span>
<span class="p">(</span><span class="nv">insert</span> <span class="s">"---\ntitle: "</span><span class="p">)</span>
<span class="p">(</span><span class="nv">insert</span> <span class="p">(</span><span class="nv">substring</span> <span class="p">(</span><span class="nv">file-name-base</span> <span class="p">(</span><span class="nv">buffer-name</span><span class="p">))</span> <span class="mi">11</span><span class="p">))</span>
<span class="p">(</span><span class="nv">insert</span> <span class="s">"\ndate: "</span><span class="p">)</span>
<span class="p">(</span><span class="nv">insert</span> <span class="p">(</span><span class="nv">format-time-string</span> <span class="s">"%Y-%m-%d %H:%M:%S %z\n---"</span><span class="p">))))</span>
</code></pre></div> </div>
</li>
</ol>
<h1 id="reference">Reference</h1>
<ul>
<li><a href="https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll/about-github-pages-and-jekyll">Set up site with jekyll</a></li>
</ul>Install jekyll apt install ruby ruby-dev gem install jekyll bundler欢迎访问我的博客!2017-08-24T01:13:53+00:002017-08-24T01:13:53+00:00https://etern.github.io/technology/2017/08/24/welcome-to-jekyll<p>jekyll生成的静态网站,在_post里markdown,上传之后,github服务端会运行jekyll,生成静态网页</p>
<p>_post里markdown命名形式为 <code class="language-plaintext highlighter-rouge">YYYY-MM-DD-name-of-post.ext</code> ,markdown文件里需要添加jekyll的 <code class="language-plaintext highlighter-rouge">front matter</code>。可以看看这条日志的源码了解 <code class="language-plaintext highlighter-rouge">front matter</code>。</p>
<p>Jekyll也提供代码段高亮展示,比如:</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">print_hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
<span class="nb">puts</span> <span class="s2">"Hi, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="n">print_hi</span><span class="p">(</span><span class="s1">'Tom'</span><span class="p">)</span>
<span class="c1">#=> prints 'Hi, Tom' to STDOUT.</span></code></pre></figure>
<p>欢迎访问<a href="https://github.com/etern">我的github主页</a></p>jekyll生成的静态网站,在_post里markdown,上传之后,github服务端会运行jekyll,生成静态网页