一群棒子的技術部落格

CSS 控制 SVG 顏色
筆記

CSS 控制 SVG 顏色

在製作網站上面,很多時候 icon 都會使用 svg 檔案來顯示,好處就是就算是放大縮小也不需要擔心失真的問題。 通常拿到 svg 檔案時,在前端使用之前都會先進行一陣加工,像是移除空白的 group 標籤 不過最常用的就是,svg 檔案,顏色隨著 parent css 一起改變,這個時候可以將 fill 與 stroke 改為 currentColor 如此一來顏色就會隨著 css color 一起改變了。

WordPress 搬遷至 Ghost CMS
筆記

WordPress 搬遷至 Ghost CMS

沒錯,我們搬家了!拖了好久終於從 WordPress 搬家到 Ghost 上了,拖延了一年多沒有寫文章後終於有了新的動力。 簡短說明一下原因: 太多的技術債了,大部分是伺服器(都是我自己搞出來的🤡) Markdown 一直被轉存為 HTML(這個我超怒) 版型懶得重寫 速度有夠慢 我只想好好寫部落格 簡單來說,我很懶 要是有人需要從 WordPress 轉到 Ghost 上,可以參考我的筆記 事前準備 WordPress 安裝 Ghost 外掛 安裝 Categories to Tags Converter 將分類轉為 Tag 如果你有詳細看他的外掛說明 Tags will be migrated, but not categories. If needed you

Cloudflare + Heroku 部署流程
Cloudflare

Cloudflare + Heroku 部署流程

簡單的筆記如何將 Domain Name Server 託管給 Cloudflare 將網址公開對外。 Cloudflare 先建立一個專案,並且將 Domain Name Server 給 Cloudflare 託管 Heroku 在 settings 頁面建立一個 SSL Certificate 在Domains區塊建立對外的 Domain Name 回到 Cloudflare DNS 分頁建立 CNAME Name 輸入剛剛在 Heroku 建立的對外 Domain Name名稱 Content 則輸入 Heroku 自己建立的專案名稱網址 ${project_name}.herokuapp.com 打開 HTTPS 如果你有需要的話

WordPress

WordPress 使用 add_rewrite_rule 方法建立一個新的 route

在許多的網頁框架當中要建立一個 route 並不是一件困難的事情,可是在 WordPress 當中並不是很直覺,這牽扯到了 WordPress 的運行機制。那麼你會說 permalink 不能夠滿足你的需求嗎?就程式面來說確實不夠彈性,對我來說。 例如:一個 url 要顯示滿足條件的文章內容,條件來自於 acf 欄位的值,以permalink 確實沒法辦到,所以就自己寫程式解決。 程式碼 要自己開一個客製化外掛,還是寫在子版型內都可以,只要 hook 有被呼叫到就可以了。 function bonze_add_rewrite_rule() { $categories = ['classrooms', 'people', 'projects', 'reports', 'videos']; foreach ($categories as $category) { add_rewrite_rule("^({$category})/(\d+

Docker

.drone.yml 設定檔範例

將.drone.yml的檔案放在專案的根目錄下,這樣 drone 的伺服器接受到 GitHub、 Gitlab時,會去讀取專案底下的.drone.yml,才知道流程該怎麼走。 .drone.yml的設定範例: pipeline: build: image: node:latest commands: - npm install - npm run build deploy: image: tmaier/docker-compose:latest commands: - docker-compose up -d --build - docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

Middleman How to Localization Data Files
ruby

Middleman How to Localization Data Files

Middleman 是 Ruby 語言撰寫的框架,用於快速地產生靜態網頁,記錄使用 middleman 用到 data files 功能如何搭配 i18n 實現多國語言。 啟用 i18n 功能 Localization (i18n) 寫到 config.rb 內開啟 i18n 功能,個人的配置如下 activate :i18n, :path => "/:locale/",:mount_at_root => :en 意思就是主語言為 en 並將對應的語言放置於自己的資料夾內,輸出資料如圖: 啟用 Data Files Data Files 照官方文件使用起來也沒有太大難度,資料夾放在專案根目錄,只要重新啟動 middleman

Language

Nuxt.js SSR記憶體溢出

最近公司的產品在伺服器經常遇到當有大量的請求時,伺服器記憶體的使用量會急遽的往上提升。以正常的GC運作方式,理論上經過一段時間後,這些資源應該要立即收回,但卻發現並不是這一回事,導致伺服器經常當機。這個問題困擾了我們對於整個產品的後續維護,因此我開始著手進行問題排除,經過排除後有幾點想將它記錄下來,以免在花同樣的時間除錯。 禁止在伺服器寫下這些程式 setInterval and setTimeout 記住別在伺服器上寫下event loop,因為你沒有機會在任何地方可以取消它們,儘管你知道要取消,因為在Nuxt SSR的hook中,並沒有提供這樣的鉤子讓你解除。 在beforeMount之前所有的鉤子都會在Nuxt SSR執行,但很可惜的是之後所以的hook(destroyed)這類的,都不會在伺服器端執行,這意味著你只能做一次性的程式碼執行。 請確認插件是否必須在伺服器上運行 請確認你想要裝的插件是真的必須在伺服器做完在交給客戶端嗎?有些套件其實是可以交給客戶端自行處理的,比如像是bootstrap-vue,如果你將它放在伺服器端處理,這意味著它會在伺服器中運行,並且常駐在記憶體中。 必須確認arrow function是否有影響到global 請確保this不要指向到global,否則只要node的程式不關閉,你的程式碼將會常駐於記憶體中。

使用 rvm 管理 Ruby 版本
ruby

使用 rvm 管理 Ruby 版本

對於前端開發 nvm 這個套件相信大家一定不陌生,rvm 就如同 nvm 的功能是用來管理 ruby 版本的套件,順道紀錄 macOS 如何安裝 rvm,那麼就來看看怎麼安裝他吧。 安裝與使用 網站 https://rvm.io/ 也有教學與使用方法。 \curl -sSL https://get.rvm.io | bash -s stable 接著可以下 rvm -v 檢查指令是否正確安裝與版本。 如果出現 command not found 的話記得要去 source ~/.zshrc 或是 source ~/.bashrc 或是關掉重開終端機。 rvm list known 可以列出 ruby 版本

Let's encrypt 使用 certbot 幫網站掛上 SSL
筆記

Let's encrypt 使用 certbot 幫網站掛上 SSL

Let\’s encrypt 是一個非常有名的數位憑證認證機構,它提供了免費的 SSL 憑證服務,就是你網址左邊的綠色鎖頭 (HTTPS),這件事情在許多的網域商或是主機商是需要付費購買憑證的。Let\’s encrypt 雖然免費可是每次憑證的有效期限是三個月所以每到時間我們就必須去更新憑證。 certbot 是一個非常好用的機器人,他可以簡單的幫我們網站掛上 SSL 憑證,唯一缺點就是如果使用者對指令介面不熟系,可能要花一點時間去研究它了;剛剛提到的三個月就必須更新憑證這件事,身為一名高端的工程師自動的事情當然要交給程式來解決囉。 安裝與放上憑證 直接在官網上 https://certbot.eff.org/ 選擇你的系統跟你的 webserver 就會看到相對應的安裝方法,這個部分應該就不多贅述,網路上的教學也很完整。 ### 會遇到的問題 certbot 當然憑證不能亂簽他會去驗證網址是否歸你所有,所以他會去你的網址底下放驗證檔案來確保不被亂用,在這時候你可能會遇到驗證失敗原因為驗證網址為 403 / 404 這兩種的問題,所以我們需要去調整 webserver 的設定,如果你不熟系還是建議你不要亂動比較好。 以下為 nginx 相關設定 location

禁止 Google 翻譯特定元素
筆記

禁止 Google 翻譯特定元素

紀錄如何讓 google 翻譯不要翻譯特定的元素,起因很簡單:$1234 在瀏覽器語言第一順位為英文,使用者翻譯中文很有可能會被翻譯為1234 美金,當然你也不能限制使用者如何操作為了避免不必要的麻煩還是加上會比較好。 實作 <div class="notranslate" translate="no">hello</div> 恩對,就是這麼簡單,translate="no" 這個屬性未必會有作用,個人測試對 google 翻譯是沒有效果的,反倒是 class="notranslate" 效果很正常。 參考資料 HTML translate Attribute

JavaScript 陣列求交集、差集
筆記

JavaScript 陣列求交集、差集

在面試題目中常遇到的題目,陣列的交集、差集、補集等這類的題目,記錄一篇解法與自己的理解以便於加深自己的印象,不囉唆直接上 code 。 使用方法 Array.filter filter() 方法會建立一個經指定之函式運算後,由原陣列中通過該函式檢驗之元素所構成的新陣列。 Set Set 物件可讓你儲存任何類型的唯一值(unique),不論是基本型別(primitive)值或物件參考(references)。 jQuery 大家的好朋友就不用多說了 交集 求出兩個陣列的交集 Array.filter let arr1 = [1,2,3,4,5] let arr2 = [2,4,6,8,10] let result =arr1.filter((e) => { return arr2.indexOf(

使用 Node.js 套件 Puppeteer 撰寫爬蟲
JavaScript

使用 Node.js 套件 Puppeteer 撰寫爬蟲

Puppeteer 是 Google 開源的網路爬蟲工具,說明文黨一開始就提到 Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. 主要是以 Chrome 當作核心個人使用起來感覺,就是使用程式去操作瀏覽器而已。 範例 const puppeteer = require("puppeteer") exports.getPageTitle = async url => { const browser = await puppeteer.launch() const page = await browser.newPage(

JavaScript HTMLCollection / NodeList 轉 Array 的方法
JavaScript

JavaScript HTMLCollection / NodeList 轉 Array 的方法

如果習慣用 jQuery 的朋友某天改使用 Vanilla JS 選擇器一定會先矇一下,怎麼很多方法不能使用,錯誤訊息為.forEach is not a function 例如範例 document.getElementsByTagName('h3').forEach((el)=>{ console.log(el) }) 如果你看仔細一點其實會發現 document.getElementsByTagName 其實是 HTMLCollection 又或是 document.querySelectorAll('h3') 會給你 NodeList HTMLCollection 與 NodeList 差別 那你會問兩個差別在哪?簡單來說 HTMLCollection 會是隨著 DOM 改變而一起變動,NodeList 則不一定,蛤!?舉個例子 let mainDOM

這一年來我所看見的技術債
筆記

這一年來我所看見的技術債

到職到現在也快一年,一位前輩說過大約一年就可以看清楚一間公司的全貌,趁著放假的時間好好的整理一下一年間所看到的東西,這並不是抱怨文或什麼,只是想紀錄也以此為借鏡避免自己犯下同樣的錯誤。有一位前輩說過到哪邊都有技術債只是看你能不能接受,一個大型的專案有技術債也是很正常的事情時間上的壓力、上頭主管的決策、技術力上的不足都是導致技術債的原因,還債的也不一定是你,搞不好是後續接手專案的人。 歷史悠久的專案 我參與的專案算是很大型的電商平台系統,看程式碼上的註解時間沒 10 年有也有 5 年。既然這麼久的專案一定埋藏著許多技術債,經常你解決一個問題會延伸出兩個以上的問題。 沒有技術文件 恩對,整個專案都沒有技術文件,功能壞了要問誰?沒人知道他是幹嘛的這些事情很常發生,畢竟沒有技術文件留下來,全都是口頭的傳承或是當事人明瞭,隨著人員流動知識也消失了。 義大利麵程式碼 這個專案是:後端 Java 搭配 Oracle 資料庫、前端模板則是 jsp 可能當時這樣算是標配吧? 一個 jsp 檔案內有許多程式碼存在 <head> <style> // css cdoe <

Chrome Resource Override 插件開發技巧
筆記

Chrome Resource Override 插件開發技巧

身為前端工程師通常都習慣在本地開發程式,大多的專案都是 HTML CSS JavaScript 三者成一組,所以在開發上本機還原也是相當簡單的,如果專案是因為環境上的因素無法在本機還原呢?像是程式必須在測試機才看得到效果、又或是使用 JSP 輸出 HTML 模板而你又無法安裝 JAVA 環境,這時在開發上就有點綁手綁腳了。 Resource Override 遇到這種情況我都會使用 chrome 的插件 Resource Override 使用起來也是非常的直觀,在你的開發面板會看到一個新的分頁,Overrides 他可以做到 URL 對 URL URL 對 程式碼 插入程式碼 修改請求 Headers 適用情境 本地端不想/無法還原,只能在線上端觀看結果 組合技 一開始覺得不段貼上程式碼很沒效率一直想有沒有更快的方式,其實 URL 對 URL 這個 Rules 可以接受本地端的路徑,

JavaScript 使用 Web Speech Recognition 語音辨識
JavaScript

JavaScript 使用 Web Speech Recognition 語音辨識

最近工作上有實作到語音辨識輸入這功能,不過在文件上並不是那麼清楚所以寫一篇筆記來紀錄事件觸發的順序。  瀏覽器支援度 可以用 Can I use 這個網站看看瀏覽器的支援度,恩..基本上只有 Chrome 有辦法使用。手機更不用說了 iOS 全滅只有 Android 手機有辦法使用。 判斷是否有支援語音辨識可以用以下程式碼 window.SpeechRecognition = window.webkitSpeechRecognition || window.SpeechRecognition if(!window.SpeechRecognition){ return } const recognition = new SpeechRecognition() 如果你直接 new SpeechRecognition() 就會 Uncaught ReferenceError: SpeechRecognition is not defined 事件觸發順序 礙於文件上的翻譯不完全,就字面上也不太清楚何時會觸發所幸自己直接全部都盤過一遍。 語音辨識正確的事件順序 onstart onaudiostart onsoundstart onspeechstart

Microsoft Office Online Video攻擊概念

Microsoft Office Online Video攻擊概念

起因 最近在接觸一個要收錢的掃毒&檔案清洗的程式OPSWAT,要掃毒當然自己得要有毒才行,所以在網路上找了一個word的攻擊概念驗證的文章,來進行今天的介紹。 接下來就讓我們開始吧! 過程 首先打開一個word,切換到插入點擊線上視訊 我們這邊成功放入一個可撥放的影片。 接著我們存檔,並開始下一階段。 針對word檔做解壓縮。 接著我們進入word資料夾內編寫document.xml檔 搜尋 embeddedHtml 關鍵字,並對內容作修改,這邊我就不把我修改內容貼上了。 修改完並存檔後,我們重新壓縮這個word並重新命名 結果 接著打開檔案並點擊影片,會發現跳出一個下載提示!! 使用掃毒進去查看,眾多軟體只有一家抓到… 以上就是這個攻擊漏洞的原理,與掃毒結果。 資料來源:https://blog.cymulate.com/abusing-microsoft-office-online-video

如何除錯元素 CSS 過寬而造成捲動軸
筆記

如何除錯元素 CSS 過寬而造成捲動軸

相信在寫前端樣式時時常都會遇到一個問題,就是元素過寬造成出現捲動軸或是手機可以拖移至螢幕外諸如此類的問題,最土法煉鋼的除錯方式就是一層一層地慢慢下 display:none 看是哪一個元素太寬造成破版,直到最近發現有一位大神寫了一段簡短的 js code 幫助 debug。 解決方案 [].forEach.call($$("*"),function(a){a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16)}) 只要將上面這段 code 貼在你的 console 內就可以看到效果,馬上就可以知道是哪一個元素在搞鬼了。 參考資料 108 byte CSS Layout Debugger