作者: Jerry Lin

  • 《QBQ!問題背後的問題》  

    這十章可以當成是一個描述「個人」的篇章。比較偏向對對自我的行為原則建議。雖然說內容有些老生常談,我覺得可以濃縮成一句話:

    把注意力重心放在自身能夠完成的事項。

    我覺得「覺察」是一呼應這十章中,一個滿重要的實作方法。覺察當下為什麼會有改變他人的意圖? 覺察自己當下為什麼會選擇這個決定?覺察到自己的行動和計畫產生了偏差、覺察到目前作了一個任性沒有思考過的決定?

    有這些「覺察」可以把更多注意力放在自身能夠完成的事項上,進而讓未來產生一個正向循環。不過也要注意的,自己的經驗來看,「覺查」這的作法其實滿消耗注意力的,可能要注意自己的注意力容量:提升,或是節省其他開銷。

    值得一提的是,這對自己的身心健康也會非常的有幫助,可以多多觀察自己,不論是自身肌肉運作、心理想法、言行舉止等等,這就比較偏向正念的領域了。

    另外我覺得很有趣的是  27 章。 27 章所描述的「模範」行為,並不是為了要「改變他人」所準備的。他人的想法和感受,也並非自己的課題(參考《被討厭的勇氣》),所以不應該由自己需要面對的,其中最後提到「誰正在觀察仿效你呢?」,我心想:「關我屁事。」

    總截至目前來說:我認為自己從態度、想法,產生選擇並且實作的整個階段,是從自身的「籌碼」和「眼界」以及自身相關的「利益」所考慮的結果,在這個狀態下,修練自己的想法這件事就變的非常重要。我相信如果是一個夠聰明的人,不管是邪惡混亂還是善良守序的人,不管哪種個性的人,最終會做出的理性的選擇都會是相同的。會有的差異我想應該還是在實作的意願和自我控制的能力上。一定都會遇到與自己情緒或本性相違背的,德不孤必有鄰(?)。理解之後,可以把更多注意力放在如何實現自己的選擇上面。

    我覺得 30 章是一個 bullshit,為了 29 章舉了一個爛例子。

  • 《QBQ!問題背後的問題》  

    我覺得 10-20 章所提到的內容都是在描述如何實作「個人擔當」這種精神。

    延續之前提到「容量」的概念,我的分類是這樣的:

    增加時間的餘裕:

    10 都是拖延惹的禍

    認清自己的容量上限:

    11 在現有的資源下做出成績

    12 還有什麼新辦法可以用?

    減少情緒的使用,騰出更多情緒空間來直面問題:

    13 少責怪別人

    14 無能的水手責怪風向

    16 擊敗你生命中的裁判

    17 誰為發生的問題負責?(一次做一個選擇)

    善用他人的容量空間,合作以互補不足:

    15 我們全在同一個團隊裡

    18 主人翁精神

    19 團隊精神的基石

    20 提高個人責任意識,從“我”做起

    概念是認同的,不過對他的例子會滿想吐嘈的。我覺得這是歐美的翻譯書很容易會產生的問題。整個「當責」的實踐中舉的例子,看起來會很像是「不顧公司利益,給客戶最大好處,只要這樣做就一定會有好的回報」。不可能是這樣的,更甚至反而會被當盤子,或是被公司扣薪水,或是公司賠錢。

    所以,先不管其他文化,我覺得,在華人世界中,「當責」的這個精神底下,能夠產生不同「選擇」的,除了本身專業技術和素養之外,還會有「眼界」和「籌碼」這兩種「容量」的提升。

    「眼界」是指說對需求的判斷,可以看成在這個領域所站位置的高度。以前有一個說法是要大家多培養「資方思維」,這是一種讓自己眼光轉換的的思維,會得到可能和當前職務所產生不同想法,進而會有不同的選擇和決定。

    e.g. 乙方的情緒勒索,甲方窗口該怎麼做

    「籌碼」則是只目前能運用的資源,這決定了你能做的事情,尤其在具有制度的,有規模的企業環境底下,能夠運用的資源往往是非常固定的。所以說,你要很清楚清楚而且清晰的知道,你有哪些籌碼,你可以怎麼運用,或是你要拿到更多籌碼,你會有哪些機會成本產生。

    e.g.  Bar 台的打工經驗、賠錢賣的業務

    還是有條件的,我會認為在掌握工具的當下,在改變「選項」的「想法」之前,在真實的社會上,還是要避免成為小孩超人,或是一個能力超群但是永遠好心辦壞事的選手。小心。

  • vue3 學習筆記 EP5

    整理一下至今(2022-10-23)關於 vue3 學習到的項目,列成關鍵字以後方便索引。

    我的學習方法一如既往,就是拿一個專案來實做,反正不賺錢的 idea 很多,和浪浪一樣滿街跑。

    處理上依然使用 sublime 3 處理,一來是習慣了,二來是開啟快速方便處理;壞處是.vue 檔案語法標示要特別處理(目前是改用 HTML 的格式來標示)之外,找不到自動排版的外掛,面對複合 ts 和 html template 的 .vue 檔案也是有夠難處理的。為此我認為可能需要開始針對不同語言來找專門使用的 IDE 或編輯器來處理,這樣可以避免安裝過多的外掛導致衝突,也能夠因為使用專門 IDE 保持實作該語言最舒服的狀態。

    目前學習到的關鍵字如下:

    1. typescript 和 javascript ;scss 和 css
    2. Options API 和 Composition API
    3. 使用 Vite 工具創建專案、編譯,並執行熱更新(HMR)
    4. components 、 template 使用
    5. composables、plugin 包裝(axios \ vue3-loading-overlay \ pinia \ bs-toaster ..)
    6. 前後端分離: controller、網域
    7. CSR、SSR、SSG

    以上。有新的東西再整理一份。

    同場加映

    DEVLOG of andyyou
    本文為翻譯自 Comparing the New Generation of Build Tools 一文加上更新補充。因建置工具更新速度關係,如遇部分內容無法實作或不一致請參考各官方文件。 …
    Day03 – 深入淺出 CSR、SSR 與 SSG – iT 邦幫忙::一起幫忙解決難題,拯救 IT …
    前言 在這篇文章中,我們來聊聊 CSR、SSR 與 SSG 的不同,這三者皆是現今常被提到的網頁技術,而 Next.js …
  • Cloudflare Workers 服務介紹

    如果有使用 cloudflare 服務,需要 serverless 功能的話,可以評估使用量來使用 cloudflare 的 workers 服務。參考:

    Cloudflare Workers documentation · Cloudflare Workers docs
    Documentation for Cloudflare Workers, a serverless execution environment that allows you to create entirely new applications or augment existing ones without configuring or maintaining infrastructure.

    他可以作為 client to server 的 middleware 或是當作是一個終端。 serverless 的服務各大 vps 商也都有,像是 AWS GCPAzure 等,這裡也有篇 Linode 關於 Serverless Computing 的優缺點介紹

    值得一提的是他還有 wokers router 服務,以及 workers KV 服務,提供了路由和儲存的實作,有興趣可以玩玩看。另外在 workers 的設定中,如果同一個帳號中也有使用 name server 的服務,可以調整自定義網域的作法,將子域名指定過去,這樣就不用記很奇怪的域名啦。

    Cloudflare 的 workers 服務有提供免費以及付費的方案,參考介紹頁面底下的表格,細節計算可以參考:

    Pricing · Cloudflare Workers docs
    By default, users have access to the Workers Free plan. The Workers free plan includes limited usage of Workers, Pages Functions and Workers KV. Read …

    Workers 使用的語言比較偏向 nodejs ,可用的應用場景滿多的,可以參考官方文件範例
    像是如果需要做一個簡單跳轉,可以這樣寫:

    const base = 'https://example.com';
    const statusCode = 301;
    
    async function handleRequest(request) {
      const url = new URL(request.url);
      const { pathname, search } = url;
    
      const destinationURL = base + pathname + search;
    
      return Response.redirect(destinationURL, statusCode);
    }
    
    addEventListener('fetch', async event => {
      event.respondWith(handleRequest(event.request));
    });
    

     

    同場加映其他介紹文章:

    Cloudflare Workers入門 ─ 簡介
    Cloudflare Workers將送進來的request在cloudflare的網絡上做處理。你可以把它放在client和server的中間,用做Middleware;後方也可以沒有server ─ …
    tool man xyz
    此網站版面極為簡潔,內容包含不好笑又尷尬的文章、覺得之後可能會看所以先保存但事後很少會看的新聞等。
  • vue3 學習筆記 EP4

    axios 套件介紹,請參考這裡

    這是一個很好用的 AJAX 套件,目前有兩個需求:

    1. 需要一個統一的前置作業,例如 baseUrl 設定、timeout 設定等等。
    2. 需要避免每個 router 的 template 有用到就創建一個實例。
    3. 未來其他功能套件,想要讓各種設定儘量在同一個地方都找得到。

    所以這邊選擇一個封裝和單例的實作來處理。因為網路上找到的作法實在太多,又初學導致一直碰壁,這邊記錄下目前認為最恰當的方法,參考這裡(雖然說文章內建議的方法是使用 ES modules):

    首先確定安裝好 axios 套件,這邊使用 npm 安裝:

    npm install axios

    確保有安裝 Pinia 套件,參考這裡

    npm install pinia

    建立一個 plugins 外掛集合,透過 pinia 存在全域。注意未來如果有其他套件,建議拉一個資料夾管理並確實作好 import:

    # src/composables/plugins.js
    import axios from 'axios'
    import { defineStore } from "pinia";
    
    export const useAppPlugins = defineStore({
      id: "appPlugins",
      state: () => {
        return {
          axios : axios.create({
            baseURL: '',  
            timeout: 10000  
          })
        }
      }
    });

    使用上,引用 plugins.js 中把要用的外掛都抓進來,就可以直接使用了:

    <script>
    import { useAppPlugins } from '@/composables/plugins.js';
    const appPlugins = useAppPlugins();
    
    export default {
    	data(){
    		return {
    			...
    		}
    	},
    	mounted() {
    		...
    	},
    	beforeUnmount() {
    		...
    	},
    	methods: {
    		submitForm: () => {
    
    			let api = appPlugins.axios;
    			console.log(api);
    			api.get('/api/login_config')
    	      .then( (response) => {
    	      	console.log(response);
    	      } )
    	      .catch( (error) => { // 请求失败处理
    	        console.log(error);
    	    });
    		},
    		gotoForgetPwd: (username, event) => {
    			console.log("gotoForgetPwd");
    			console.log(event.target.tagName);
    			
    		}
    	}
    }

    未來如果有其他外掛需要於全域設定的也能夠加入到 appPlugins 中提供呼叫。

    文件中有提到一些好處:

    • Documented APIs.
    • Familiarity among developers.
    • Standard usage patterns that, by design, avoid common problems.
    • Integration with Vue Devtools.
    • You don’t have to maintain the code yourself.

    另外我認為未來在同一個專案中如果有不同的應用場景,可以建立不同外掛集合的檔案提供呼叫,這樣可以整理成一個檔案呼叫,減量減少一個 vue 檔案要 import 一堆而且還要注意上下傳遞關係的麻煩。

    目前對 ES modules 方式的疑或是:每一個 vue 檔案 import 一次,他會不會就直接 create 一個新的實例?
    2022-10-16 update: 這邊在 axios.create 中 baseURL 參數用隨機產生。發現 ES modules 的方法每次 import 都不會產生新的 baseURL 。並不會每次 import 就 create 一次的。

    另外有翻到一個套件叫做 vue-axios ,看起來是包好直接放在 windows 裡面,這有空可以來試試。

    vue-axios
    A small wrapper for integrating axios to Vuejs. Latest version: 3.5.0, last published: 3 days ago. Start using vue-axios in your project by running `npm i vue-axios`. There are 500 other projects in …

    同場加映,單例的設計模式參考:

    单例模式 | 菜鸟教程
    单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 …

    貼心翻譯給看不懂簡體的繁體中文使用者,重點是這些:

    意圖:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
    主要解決:一個全局使用的類頻繁地創建與銷毀。
    何時使用:當您想控制實例數目,節省系統資源的時候。
    優點:

    1. 在內存里只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷毀實例(比如管理學院首頁頁面緩存)。
    2. 避免對資源的多重佔用(比如寫文件操作)。

    缺點:

    1. 沒有接口,不能繼承,與單一職責原則衝突
    2. 一個類應該只關心內部邏輯,而不關心外面怎麼樣來實例化。

    使用場景:

    1. 要求生產唯一序列號。
    2. WEB 中的計數器,不用每次刷新都在數據庫里加一次,用單例先緩存起來。
    3. 創建的一個對象需要消耗的資源過多,比如 I/O 與數據庫的連接等。

    同場加映,單例與全局變量差異:

    JavaScript: global variables vs singletons
    If singleton is available globally, how is it different from a global variable that has a single instance?

    單例滿多缺點的爭議,可以參考這個討論串

  • 《QBQ!問題背後的問題》  

    參加讀書會的讀書心得,找個地方放。

    如果要對整本書下一個註解的話,我會認為:

    這本書描述的是指,「個人擔當」這種精神,以及他的實作方法和介紹。

    書中所描述的「藉由提出更好的問題,當下做出更好的選擇」。

    以我的理解,想可以這樣說:

    人的行為模式是由「意圖」,塑造「想法」,「想法」產生各種「選擇」來付諸「行動」。 我們的想法往往會是想要「趨吉避凶」,也就是儘量用最低的機會成本的選擇來動作。這本書提供另外一個思路是:在做選擇之前,可以再多想想,其實還有更多,機會成本更低的選擇,只是我們常常沒有想到而已。

    至於實際上該如何「多想想」呢?在第十章以前,可以整理成一個重點:

    就是:放棄「不公平」這種委屈的情緒。把重點抓回到需要解決的問題,或是要被滿足的意圖本身。

    當你感受到「不公平」這種委屈的情緒的時候,你很容易產生一種,認同感稀缺的心態,這時候你會發現,你有的選項當中,大部分都會是去滿足你所缺乏的認同感的選項,像說:質疑對方啦、發文討拍啦、遷怒啦等等的。這本書告訴你,這不是你當下應該做的,你應該要回歸到當下,想想「要怎麼做」才能解決掉,目前遇到的問題本身才是。

    有趣的是,其實人在壓力或是情緒過於溢出的狀態下,很容易做出所謂「不理性」的決定,往往和心情平靜時或是精神穩定時候表現不同。我覺得,要減少這樣出錯的機率,除了保持自己在良好的狀態之外,也會需要一個,比較像是提高或是保持,自身「容量」的概念,也可以叫做「創造餘裕」,或是在經濟學相關的書籍會提到的「抗風險能力」的生活應用。書多也有提到一些,例如:不要拖延(創造時間餘裕),拒絕增加壓力的態度:「為什麼找上我?」「我怎麼碰到這麼倒楣的事情?」(擁有情緒的容量),必須要多溝通(提高溝通產生的情緒容量),或是之後會提到的運用團隊(建立能力的餘裕)等等。

  • Linode 伺服器調整規格與調整硬碟空間配置

    常常會有需要調整 VPS 規格的狀況,一般通常會有幾個狀況需要調整規格:

    1. 應用程式需要更多,或是更少的 CPU / 內存(Memory)
    2. 硬碟空間不足,但是不想要另掛儲存空間
    3. 發現目前使用量太少了,目前規格過高需要調低

    我們以調整 Linode 的 VPS 服務操作介紹,首先需要確認以下幾個項目:

    1. 調整的是 Linodes ,也就是 VPS 主機服務的規格。
    2. 調整無法更換地區,如果需要更換地區請使用 clone 服務,IP 也會更換,如果 VPS 內應用程式有依賴 IP 的話,或是 DNS 服務需要特別注意是否能夠更改。
    3. 更換前需要確認該 VPS 配置的硬碟空間是否符合目標規格所使用的硬碟空間。
    4. VPS 更換規格大約會停機 5 – 30 分鐘,如果是已經上線產品的話要注意是否是離峰時段。

    以下介紹至 2022-10-07 當前的版本下如何操作更換規格:

    首先登入以後會看到你的 VPS 服務器列表,選一個。

    可以從列表上選擇,或是點進去 VPS 後選擇 Resize 選項。

    選擇 Resize 後,會彈出一個視窗,可以選擇對應的規格。

    選擇規格後,注意 Auto Resize Disk 選項,如果勾選了表示他將會隨著規格上的硬碟自動配置。這樣之後要降規格時會需要特別調整。

    最後在 Confirm 上輸入要求的內容(作為確保輸入無誤用途)後,Resize Linode 按鈕就會顯示可點擊狀態,點擊該按鈕送出即可。

    在 Linode VPS 上特別要注意的是 Auto Resize Disk 這個選項,如果沒有硬碟空間的需求,或是暫時調高規格的話,是可以不需要勾選的。

    果需要調整硬碟空間,要注意以下幾點:

    1. 購買的硬碟空間不等於這台 VPS 分配的硬碟空間
    2. 配置硬碟空間時需要停止主機才能啟用

    首先,要先確認主機是否關閉,如果沒有關閉的話要先 Power Off。

    接者往下滑動(需要等一下或是再刷新一下頁面),選擇 Storage 選項,接著在主要硬碟(這個例子是 “CentOS 7 Disk” 這個項目,我們可以看到他的 Size 是 258088 MB。如果有另外開,則需確保總共的容量)中。選擇 Resize 這個連結。

    點擊後可以看到 Size 這個選項可以輸入以 MB 為單位的硬碟配置空間,底下有一個 Maximun Size 顯示當前可以配置的總空間數量,輸入數字無法超過這個最大上限。輸入完後,點擊 Reszie 按鈕送出,再重新啟動 VPS 主機即可生效。

    提醒一下:請注意目前硬碟實際佔用空間,輸入最小數量請勿低於實際佔用空間。
    查看實際佔用空間可以參考使用指令,參考指令文件

    df -h

  • vue3 學習筆記 EP3

    直譯語言和編譯語言是程式語言的一種分類,自己在有 server-side 的程式中寫 PHP 寫久了,都快忘記編譯語言會有編輯檔案以及編譯後的檔案。 這時會開始苦惱幾個需求:

    1. 在 server 上只 pull 下編譯後檔案即可
    2. 編輯檔還是需要版控
    3. server 上儘量不要搞太多東西,要不以後架設會很麻煩
    4. 儘量自動化

    版控使用 git 來實現,因為部屬到 server 是 master branch,所以打算開一個 dev branch 來處理編輯,然後測試沒問題以後再 marge 到 master branch ,然後 npm run build 把產生的 dist 的資料夾(編譯後的檔案) push 上去。

    參考:

    HowTo have specific .gitignore for each git branch
    HowTo have specific .gitignore for each git branch – gitignore_per_git_branch.md

    可以透過 git 之中的 hook 達到目的。

    他的原理是透過 git hook 在 checkout 的時候,取得對應不同 branch 的 .gitignore.{branch name} 檔案,讀取裡面的設定實現 git ignore 的功能,以達到不同 branch 能夠指定不同需要 ignore 檔案的目的。

    主要的作法是在 .git/hooks 之中建立一個 post-checkout 檔案(該檔案名稱對應 hook 行為):

    #!/bin/sh
    
    old_ref=$1
    new_ref=$2
    branch_switched=$3
    
    if [[ $branch_switched != '1' ]]
    then
        exit 0
    fi
    echo "---- POST CHECKOUT ----"
    current_branch=$(git rev-parse --abbrev-ref HEAD)
    hook_dir=$(dirname $0)
    root_dir="$(pwd -P)"
    info_dir="$root_dir/.git/info"
    
    exclude_target='.gitignore'
    if [[ -f "$root_dir/$exclude_target.$current_branch" ]]
    then
    	echo "Prepare to use .gitignore.$current_branch as exclude file"
        exclude_target=.gitignore.$current_branch
    fi
    cd "$info_dir"
    rm exclude
    #ln -s $exclude_target exclude
    echo "Copy .gitignore.$current_branch file in place of exclude"
    cp "$root_dir/$exclude_target" exclude
    echo "--- POST CHECKOUT END ---"

    然後執行 git init ,重新啟用 git hooks。

    之後實作 .gitignore 時,檔案名稱依照分支加上後綴即可。例如是 dev 分支下,添加 .gitignore.dev 檔案即可生效;在 master 中,添加 .gitignore.master 就行啦。

    附上設定截圖更清楚:

     

    同場加映:

  • vue3 學習筆記 EP2

    在 sublime 中,.vue 的檔案再配置高亮(highlight)的實作方法,網路上很多推薦 vue-syntax-highlight 這個外掛,安裝方法就不贅述了。

    而如果 .vue 檔案中包含了 script 和 template 兩個 tag 的話,這個外掛就很容易只會 highlight 上面的 tag ,這樣頗不方便的。 後來發現,其實只要把 .vue 設定為 HTML 的格式, highlight 的動作就會很漂亮的。

    但是 .vue 並非預設是 HTML 格式,內建設定中,打開 .vue 會是以純文字的形式,如果想要每次開啟預設都是以 HTML 格式開啟,需要調整一下設定:

    1. 點擊 Sublime Text-> Preferences->Browse Packages,開啟資料夾。
    2. 進入 Packages 資料夾後,點擊進入 User 資料夾。該資料夾是用戶設定的集合。
    3. 創建一個 HTML.sublime-settings 檔案,並且依照格式輸入以下檔案清單,主要是有包含 vue 這個值就行的:
      {
           // Which file extensions go with this file type?
          "extensions":
          [   
              "html5",
              "vue"
          ]
      }

     

    題外話,同樣的資料夾中,如果需要創建不同的對應,只要把 HTML.sublime-settings 名稱的 HTML 至換成想要的格式即可。

     

  • vue3 學習筆記 EP1

    這份學習筆記是基於自身的經驗之上,在學習 vue.js 3 所寫下的筆記。

    目標和過去經驗:

    1. 寫過 node.js 做爬蟲和 API 服務
    2. 後端分離,後端打算以 PHP 做 restful API 套用。
    3. 前端以 vue3 typescript 為主
    4. 基本上學到了以後就用套件,這是套件王精神。
    5. 以實作一個個人 Line 工具服務,可登入後台操作。

    dev 環境:

    1. macOS 12.6
    2. node 16.17.1, npm 8.19.2
    3. IDE 用的是 sublime3 和 Mac 內建的編譯器
    4. PHP 使用 vm 獨立環境,vue3 於 macOS 環境實作。

    首先先確認在 mac 上安裝 npm 和 node,這之前安裝過了,參考這裡

    安裝 git,之前用 fork 跑 git 結果發現 macOS 本體沒安裝過,參考這裡

    brew install git

    再來升級一下太久沒用的 npm 和 node ,參考這裡

    sudo npm install -g npm@latest
    sudo npm cache clean -f
    sudo npm install -g n
    
    sudo n stable

     

    這樣就差不多啦~

    vue3 的教學參考:

    個人推薦使用 vite 創建,不過依照接下來要實作的專案,我應該會直接買一個模版來製作的。

    另外提供一下退坑的文章:

    對我來說,最大的學習成本是:

    1. vue 要建構一個編譯環境到生產環境再處理上 CI 的流程,以及未來協做或接手的作法(總不可能 node_modules 都上 git )。
    2. 學習在 vue3 上 操作 SaaS 和 AJAX
    3. 各種 vue 上的套件蒐集和使用方式,儘量不要用到 jQuery 套件的。

    加油吧。