<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on 技術浮浪貢</title><link>https://blog.plk.tw/posts/</link><description>Recent content in Posts on 技術浮浪貢</description><generator>Hugo</generator><language>zh-tw</language><lastBuildDate>Sun, 29 Oct 2023 15:13:07 +0800</lastBuildDate><atom:link href="https://blog.plk.tw/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>用 TypeScript 寫 Jest 的 matcher</title><link>https://blog.plk.tw/posts/2023/10/custom-jest-matcher-using-typescript/</link><pubDate>Sun, 29 Oct 2023 15:13:07 +0800</pubDate><guid>https://blog.plk.tw/posts/2023/10/custom-jest-matcher-using-typescript/</guid><description>官方給的範例沒辦法把 matcher 加到 Matcher interface</description></item><item><title>用 OpenSSL 產生金鑰對</title><link>https://blog.plk.tw/posts/2023/09/generate-key-pair-using-openssl/</link><pubDate>Mon, 18 Sep 2023 03:03:58 +0800</pubDate><guid>https://blog.plk.tw/posts/2023/09/generate-key-pair-using-openssl/</guid><description>&lt;p&gt;手上的專案用 RSA256 做為 JWT 的簽章驗證方式，需要針對不同環境產生不同的金鑰對（key pair）。撰寫文件時發現網路上找到的方法通常都是用 &lt;code&gt;ssh-keygen(1)&lt;/code&gt; 搭配 &lt;code&gt;openssl(1)&lt;/code&gt;，但其實光用 &lt;code&gt;openssl(1)&lt;/code&gt; 就足以產生 private key 與 public key。&lt;/p&gt;</description></item><item><title>API 一定要有 controller 嗎？</title><link>https://blog.plk.tw/posts/2023/09/are-api-controllers-necessary/</link><pubDate>Sat, 09 Sep 2023 20:35:46 +0800</pubDate><guid>https://blog.plk.tw/posts/2023/09/are-api-controllers-necessary/</guid><description>&lt;p&gt;今天在 YouTube 看了 &lt;a href="https://youtu.be/gsAuFIhXz3g"&gt;Fix Your Controllers By Refactoring To Minimal APIs&lt;/a&gt; 然後被推薦 &lt;a href="https://youtu.be/pYl_jnqlXu8?t=1862"&gt;Goodbye controllers, hello Minimal APIs - Nick Chapsas - NDC London 2023&lt;/a&gt;。後者提出一個觀點——「API controller 是個奇怪的存在」。&lt;/p&gt;</description></item><item><title>踩到 JavaScript var 變數的雷</title><link>https://blog.plk.tw/posts/2023/08/javascript-var-declaration-pitfall/</link><pubDate>Sun, 27 Aug 2023 02:29:05 +0800</pubDate><guid>https://blog.plk.tw/posts/2023/08/javascript-var-declaration-pitfall/</guid><description>tldr; 把 &lt;code&gt;var&lt;/code&gt; 變數都換成 &lt;code&gt;let&lt;/code&gt; 才發現原本的 test case 是跑心酸的。</description></item><item><title>在 CommonJS module 中使用 ESM 型別</title><link>https://blog.plk.tw/posts/2023/08/import-esm-types-to-commonjs-module/</link><pubDate>Wed, 23 Aug 2023 02:07:26 +0800</pubDate><guid>https://blog.plk.tw/posts/2023/08/import-esm-types-to-commonjs-module/</guid><description>&lt;p&gt;要在 CommonJS module 中使用 ESM 必須透過&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import"&gt;動態 import&lt;/a&gt;；但型別是編譯時期的資訊，一定要用靜態 import。透過&lt;em&gt;宣告檔案&lt;/em&gt;（Declaration File）可以解決這個問題。&lt;/p&gt;</description></item><item><title>如何在 Scrum 裡處理技術債</title><link>https://blog.plk.tw/posts/2020/01/deal-with-tech-debts-in-scrum/</link><pubDate>Wed, 15 Jan 2020 07:30:54 +0000</pubDate><guid>https://blog.plk.tw/posts/2020/01/deal-with-tech-debts-in-scrum/</guid><description>把 Twitter 上推友對這個問題的回應整理成文。</description></item><item><title>升級 npm 內附的 node-gyp</title><link>https://blog.plk.tw/posts/2020/01/upgrade-node-gyp-bundled-in-npm/</link><pubDate>Sat, 04 Jan 2020 02:33:14 +0000</pubDate><guid>https://blog.plk.tw/posts/2020/01/upgrade-node-gyp-bundled-in-npm/</guid><description>紀錄在 macOS 下用 asdf-nodejs 遇到的 Python 3、node-gyp 的坑。</description></item><item><title>用 request 送出同名多值的 query 參數</title><link>https://blog.plk.tw/posts/2019/06/use-request-to-send-multiple-values-parameter/</link><pubDate>Fri, 14 Jun 2019 07:49:28 +0000</pubDate><guid>https://blog.plk.tw/posts/2019/06/use-request-to-send-multiple-values-parameter/</guid><description>tldr; 在 options 裡設定 useQuerystring 或是 qsStringifyOptions 的 arrayFormat</description></item><item><title>在本地端跑 GitLab CI job</title><link>https://blog.plk.tw/posts/2019/04/run-gitlab-ci-job-locally/</link><pubDate>Tue, 16 Apr 2019 08:57:26 +0000</pubDate><guid>https://blog.plk.tw/posts/2019/04/run-gitlab-ci-job-locally/</guid><description>gitlab-runner 可以直接在本地端跑 &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; 中定義的 job；但得給不少 command line 參數，記錄一些常用的。</description></item><item><title>iTerm2 + SSH + tmux</title><link>https://blog.plk.tw/posts/2019/04/attach-remote-tmux-session-natively-in-iterm2/</link><pubDate>Tue, 16 Apr 2019 03:34:58 +0000</pubDate><guid>https://blog.plk.tw/posts/2019/04/attach-remote-tmux-session-natively-in-iterm2/</guid><description>記錄 iTerm2 連上 SSH server 後直接操作遠端 tmux session 的方法</description></item><item><title>JavaScript 有條件增加物件屬性的簡短寫法</title><link>https://blog.plk.tw/posts/2019/03/conditional-insert-properties-into-javascript-object/</link><pubDate>Fri, 29 Mar 2019 02:17:37 +0000</pubDate><guid>https://blog.plk.tw/posts/2019/03/conditional-insert-properties-into-javascript-object/</guid><description>&lt;code&gt;const obj = {...condition &amp;amp;&amp;amp; { prop: value } };&lt;/code&gt;</description></item><item><title>JavaScript 的 diff 套件</title><link>https://blog.plk.tw/posts/2019/03/diff-libraries-in-javascript/</link><pubDate>Fri, 22 Mar 2019 08:34:59 +0000</pubDate><guid>https://blog.plk.tw/posts/2019/03/diff-libraries-in-javascript/</guid><description>&lt;p&gt;以前都用 &lt;a href="https://www.npmjs.com/package/diff"&gt;diff&lt;/a&gt;，它能以字元（char）、單字（word）、行（line）、句（sentences）為單位比較；但是只能處理「行」為單位的 patch 。&lt;/p&gt;
&lt;p&gt;最近發現 Google 的 &lt;a href="https://github.com/google/diff-match-patch"&gt;diff-match-patch&lt;/a&gt; 能處理「字元」的 patch，而且支援非常多語言（C++、C#、Java、JavaScript、Python、……）。也有人把它包成 npm package：&lt;a href="https://www.npmjs.com/package/diff-match-patch"&gt;diff-match-patch&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>10 套用 Go 寫的開發者工具</title><link>https://blog.plk.tw/posts/2019/02/summary-of-10-tools-written-in-go/</link><pubDate>Mon, 25 Feb 2019 07:16:10 +0000</pubDate><guid>https://blog.plk.tw/posts/2019/02/summary-of-10-tools-written-in-go/</guid><description>&lt;p&gt;簡單整理一下 &lt;a href="https://golang.works-hub.com/learn/10-tools-written-in-go-that-every-developer-needs-to-know-6d45d"&gt;10 tools written in Go that every developer needs to know&lt;/a&gt;，當作自己的備忘。&lt;/p&gt;</description></item><item><title>Docker build 不留下 SSH private key</title><link>https://blog.plk.tw/posts/2019/02/use-ssh-key-securely-in-docker-build/</link><pubDate>Sat, 09 Feb 2019 01:36:00 +0000</pubDate><guid>https://blog.plk.tw/posts/2019/02/use-ssh-key-securely-in-docker-build/</guid><description>我以前是用 dockito/vault；Docker 17.05 後可以使用 multi-stage、Docker 18.09 後則可以使用 BuildKit 的 SSH mount type。</description></item><item><title>Choosy extension 搞掛 Chrome 的解法</title><link>https://blog.plk.tw/posts/2019/01/prevent-choosy-extension-from-crashing-chrome/</link><pubDate>Mon, 21 Jan 2019 04:04:44 +0000</pubDate><guid>https://blog.plk.tw/posts/2019/01/prevent-choosy-extension-from-crashing-chrome/</guid><description>&lt;p&gt;前陣子開始用 &lt;a href="https://choosyosx.com"&gt;Choosy&lt;/a&gt; 讓不同的網站分別用不同的瀏覽器開。但是 Choosy 的 extension 一直讓 Chrome 掛掉，後來在&lt;a href="http://feedback.choosyosx.com/forums/6165-general/suggestions/35061085-choosy-crashes-chrome"&gt;這篇&lt;/a&gt;找到解法：&lt;/p&gt;
&lt;p&gt;在 Chrome 開啟 &lt;code&gt;x-choosy://prompt.all/&lt;/code&gt; 這個網址，然後勾選「永遠用這個 App 開啟」、按下 OK。&lt;/p&gt;</description></item><item><title>Git revision range</title><link>https://blog.plk.tw/posts/2018/12/git-revision-range/</link><pubDate>Mon, 17 Dec 2018 03:46:17 +0000</pubDate><guid>https://blog.plk.tw/posts/2018/12/git-revision-range/</guid><description>&lt;p&gt;常忘記 &lt;code&gt;..&lt;/code&gt; 跟 &lt;code&gt;...&lt;/code&gt; 的差別：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;A..B&lt;/code&gt; （兩個點）表示：只列出在 B 有的&lt;/li&gt;
&lt;li&gt;&lt;code&gt;A...B&lt;/code&gt; （三個點）表示：列出在 A 或 B 其中任一邊的&lt;br&gt;
可以加上 &lt;code&gt;--left-right&lt;/code&gt; 來顯示 commit 屬於哪一邊。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;參考資料：&lt;a href="https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection"&gt;Git - Revision Selection&lt;/a&gt;&lt;/p&gt;</description></item><item><title>在 editor 混用 Prettier 與 ESLint</title><link>https://blog.plk.tw/posts/2018/11/use-prettier-and-eslint-together-in-editors/</link><pubDate>Mon, 12 Nov 2018 09:09:50 +0000</pubDate><guid>https://blog.plk.tw/posts/2018/11/use-prettier-and-eslint-together-in-editors/</guid><description>&lt;p&gt;前篇 &lt;a href="https://blog.plk.tw/posts/2018/11/use-prettier-with-eslint/"&gt;Prettier + ESLint&lt;/a&gt; 提過了兩者的合作方式，這篇主要是筆記在各主流 editor 下……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prettier 與 ESLint 的 editor/IDE 外掛&lt;/li&gt;
&lt;li&gt;「混用 Prettier 與 ESLint 格式」的設定&lt;/li&gt;
&lt;li&gt;「存檔時自動排版」的設定&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vscode"&gt;VSCode&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Extensions: &lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode"&gt;Prettier&lt;/a&gt;, &lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint"&gt;ESLint&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prettier + ESLint: Turn on &lt;em&gt;Prettier: ESLint Integration&lt;/em&gt; (to use &lt;code&gt;prettier-eslint&lt;/code&gt; instead)
&lt;img src="NRGAlk7qrt7Srjp0n8pnSA.png" alt=""&gt;&lt;/p&gt;</description></item><item><title>Prettier + ESLint</title><link>https://blog.plk.tw/posts/2018/11/use-prettier-with-eslint/</link><pubDate>Fri, 09 Nov 2018 09:50:59 +0000</pubDate><guid>https://blog.plk.tw/posts/2018/11/use-prettier-with-eslint/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eslint.org/"&gt;ESLint&lt;/a&gt; — 程式碼檢查工具，包含排版風格與潛在問題&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prettier.io/"&gt;Prettier&lt;/a&gt; — 支援多種語言的格式化工具&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這篇不做個別介紹，只是整理一下兩個工具一起使用時的一些小細節。&lt;/p&gt;
&lt;h2 id="方式-1完全採用-prettier-的排版規則"&gt;方式 1：完全採用 Prettier 的排版規則&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;安裝 &lt;a href="https://github.com/prettier/eslint-config-prettier"&gt;eslint-config-prettier&lt;/a&gt;：關掉跟 Prettier 衝突或是不需要的規則。&lt;/li&gt;
&lt;li&gt;安裝 &lt;a href="https://github.com/prettier/eslint-plugin-prettier"&gt;eslint-plugin-prettier&lt;/a&gt;：新增 &lt;code&gt;prettier/prettier&lt;/code&gt; 規則。讓 ESLint 以 Prettier 排版結果為基準，指出需要修正的地方。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;需要的 &lt;code&gt;.eslintrc.json&lt;/code&gt; 設定如下：&lt;/p&gt;</description></item></channel></rss>