又LAG隨性筆記
  • 關於我
  • 作品集
  • 生活隨筆
  • 與我聯絡
  • 隨手扎

隨手扎

November 18, 2024

關於SSO服務的DB群集節點調整設定經驗這件事

背景

目前任職公司的SSO服務架構是由我建立以及維護的。我們在四個廠區建立服務群集,每個廠區分別有一個負載平衡/反向代理節點、一個備援的負載平衡/反向代理節點,以及實際作為服務的兩個應用節點。

資料庫同樣在四個廠區皆有節點,並組成跨廠區群集,使用MariaDB的Galera Cluster機制。由於資料庫是多主叢集架構,各別都可以作爲主節點寫入,因此SSO服務節點使用的AD服務和DB服務都是設定相同廠區,減少物理上的路徑。但不同的是資料庫是由DBA負責管理的。

而這次的狀況是: 資料庫需要進行設定調整,啟用某些功能。這些功能有助於了解服務使用狀況等等。

不過DBA並沒有信心能夠調整而不影響服務。因此有先向我詢問過意見。

May 21, 2023

LAG挑戰資深實習生 BFS 程式面試考題

解法

其實再上一篇後沒多就,就有朋友提到:「那麼我需要花多久時間完成題目呢?」。

恩…我也挺好奇的。

實際上也就那幾天就已經自己量時間測驗過了。雖然是有些馬後炮,但我花了16分18秒完成第一個版本(repl.it):

async function searchGraph(start) {
  let visited = new Set();
  let curr_nodes = new Set([start]);
  let next_nodes = new Set();

  while(curr_nodes.size > 0) {
    next_nodes = new Set();

    for(let node of curr_nodes) {
      console.log(node);
      visited.add(node);
      let neighbours = await fetchNeighbours(node);
      neighbours.data.forEach((node) => {
         if(!visited.has(node)){
           next_nodes.add(node);
         }
      })
    }
    curr_nodes = next_nodes;
  }
}

然後又花了14分鐘27秒調整成第二個版本(repl.it):

此外,其實我覺得Terry後續的部份引導還不錯的。有讓我想到其他調整方式…

April 25, 2023

技術總監需要有技術嗎?

前因後果

最近鬧得沸沸揚揚的網紅(應該可以算是吧)開課,其中有一個是資訊技術領域的。
雖然課程與技術看起來並沒有直接相關。不過,我就來蹭個熱度?

欸!不是我原本真的沒這樣想。

其實看完兩個影片以後(合作影片與後續的解釋影片),我是沒有太多想法。想法是有,但沒有到會特別想發表,直到…看到了Denny的這篇:技術總監需要有技術嗎?

不好意思,我就抄標題了

不得不說,從我個人經驗這篇文章真的有打到我的點上。所以我也就不討論影片內容,直接從「技術總監需要有技術嗎?」的角度切入。

因為我沒有收錢,所以就不放連結了,有興趣的人自己去找,結論是我可能會推薦,但我並沒有購買,最後也會告訴你在早鳥看完課程介紹後我沒有購買的原因

我有什麼資格討論這件事情

放我LinkedIn好像也什麼作用🤠。但或許稍微了解一下我的背景會更清楚我是站在什麼角度來看這件事情。

December 9, 2022

你可能不知道在JS世界裡的特殊物件

特殊物件清單

JavaScript是一個有著龐大使用族群的程式語言,但是因為其歷史淵源和不同考量等因素下,其中有不少令人萬丈摸不著頭緒的設計。自連class都只作為保留字而無實際作用的時候,就已經有在接觸,在後續越了解越多,想想應該是能來分享一些,其中一些我知道的特殊物件。

  • undefined
  • null
  • this
  • super
  • NaN
  • Infinity
  • new
    • new.target
  • Object.prototype
    • 先有Function還是先有Object
  • Symbol
    • Symbol.for()、Symbol.keyFor()
  • document.all
    • typeof document.all
  • arguments
  • hashbang
  • HTML comment
  • 'use strict'
  • globalThis
  • window
  • document

其中有一些並不是真正的物件,但都是一些執行環境下支援特殊寫法。或許有一些並沒有實際作用,但可能很多人並不知道,畢竟平常大概也沒有人會這樣寫吧!所以其實也就是一些JavaScript裡無關緊要的有趣小地方。 當然…當中有一部分也有可能成為你日後會踩入的陷阱(抗)。那麼就先來說說undefined和null吧!

undefined

undefined是一個屬於undefined的物件。(但可能不是唯一)

typeof undefined; // -> "undefined"

In all non-legacy browsers, undefined is a non-configurable, non-writable property. (Even when this is not the case, avoid overriding it.) – from MDN

儘管在現今主流的瀏覽器都是不可改變全域的undefined變數:

October 15, 2022

這些那些你可能不知道我不知道的web技術細節-目錄與完賽感想

終於、終於30天啦啦啦!!!

原本其實是有猶豫今年要不要報名的,因為去年結果讓我有點失落憔悴…

然後這次也沒有組團,沒拖人下水成功。雖然也還是有發現一些認識的朋友今年也有參加,但還是一度在猶豫要不要報名,所以我幾乎是拖到最後一天才報名的哈哈。

工作的這兩年,遇到的事情這樣看來應該不算少。我有把一些我有興趣的議題記錄下來的習慣,雖然回去看也就一些很零碎的關鍵字,甚至有些一度回想不起來是什麼玩意兒。 這些東西我是有可能另外寫出來做記錄發表的,所以這次抱著反正之後也還是想寫,那就參加寫吧的想法報名,沒完賽就算了。

不過其實原本是有兩個參賽主題的,但最後只選擇了一個。一方便是另外一個對現在我來說不太好組織,另外就是時間安排上,我是很後來才真正決定要報名的。

而且在開賽前幾天確診Orz
隔離了7天

「這些、那些、你可能不知道、我不知道的Web技術細節」記錄了一些受到工作同僚、朋友聊天討論啟發,進一步研究原本我不知道或沒那麼清楚的Web技術細節。儘管足有接近30篇,但其實與我原本記下的關鍵字還是少了不少。像是WebAssembly、WebRTC、WebGL、Mono Repo、Micro Frontend等等。有些東西我有一些接觸,也有不少是還需要花費大量時間學習的。

而且這個系列,每一篇都至少花 超過兩個小時 構思撰寫。並且我實在不是很像破壞每一篇的獨立和完整性。所以有些篇數對於一次要閱讀完怕是會有些吃力,但基本每一篇都可以獨立參考閱讀,而不需要在意閱讀順序性。

目錄(依發表時間序)

October 15, 2022

你可能不知道的Web API--Web Locks

前言

Web Locks相關的API目前還是實驗性質的,這意味著未來可能有所變動,會與本片內容提及用法、作用有差異。雖然是實驗性質,但目前主流瀏覽器都已經支援。

使用方式

最基本用法是透過navigator.locks.request()取得一把鎖,如果無法取得就必須等待直到能夠取得。如果取得了,就可以執行後續callback的動作。通常callback是一個異步函式,舉例來說寫法會如下:

navigator.locks.request('lock-1', async (lock) => {
  console.log('get lock-1');

  console.log('do something');

  console.log('release lock-1');
});

callback的執行區域,被稱作是 關鍵區域 (Critical section)。

如果設計的恰當,關鍵區域只會有一個在執行。把上面再改寫一下:

var lock_name = 'lock-1';

navigator.locks.request(lock_name, (lock) => {
    console.log(`A: get lock ${lock.name}`);
    return new Promise(res => {
        /// 10秒後釋放鎖
        setTimeout(() => {
            console.log(`A: release lock ${lock.name}`);
            res(); // release lock
        }, 10000 /*ms*/);
    })
})

navigator.locks.request(lock_name, (lock) => {
    console.log(`B: get lock ${lock.name}`);
    return new Promise(res => {
        /// 5秒後釋放鎖
        setTimeout(() => {
            console.log(`B: release lock ${lock.name}`);
            res(); // release lock
        }, 5000 /*ms*/);
    })
})

A: get lock lock-1 A: release lock lock-1 B: get lock lock-1 B: release lock lock-1

在上面範例,有兩個程式區塊A和B需要使用到lock-1這把鎖。A需要消耗10秒,並優先取得了鎖;B必須等待10秒後,才會開始執行。

可以透過將Promise的resolve()或reject()傳遞出來,來決定什麼時候要釋放鎖:

  • ««
  • «
  • 1
  • 2
  • 3
  •  … 
  • 33
  • »
  • »»
© 又LAG隨性筆記 2025