Image for post
Image for post

如果要說天底下最帥氣的職業是什麼?在電腦、網路如此發達的今日,我覺得莫過於當一個駭客

穿著深色帽 T 坐在電腦前,面對黑底綠字的終端機,以飛快的速度下著指令,就能在網路世界飛天遁地。不管是要攻破對手的網站、竊取政府機密、甚至是阻止核彈發射,似乎都是輕而易舉

但要成為一名真正的駭客,就跟當工程師一樣,除了扎實的理論基礎之外,還需要大量的練習。但練習總不可能隨便亂打別人的網站吧!?練功練到上法院可不是什麼有趣的事

所以我今天要來跟大家介紹駭客的練功場 — CTF,也順便講幾個 Web 領域的題目,讓大家知道打 CTF 大概是什麼感覺


不知道大家在寫 Go 時有沒有注意過,一個 struct 所佔的空間不見得等於各個 field 加起來的空間,甚至有時把 field 宣告的順序調換一下,又會得到不同的結果

今天的文章就是要從 CPU 抓資料的原理開始介紹,然後再講到 Data Structure Alignment(資料結構對齊),希望大家在看完之後能對 CPU 跟記憶體有更多認識~

直接上例子

以 T1 為例,整個 struct 共有三個欄位,型別分別是 int8int64int32,所以變數 t1 應該需要 1+8+4=13 bytes 的空間。但實際在 Go Playground 上跑,會發現 t1 竟然需要 24 bytes,真奇怪是吧?

如果嘗試把欄位的順序調整一下,改成 int8int32int64 再跑一次,就 …


不知道有沒有人看到標題的「LLVM IR」跟「編譯器」就先嚇跑了XD,這些東西真的要可以講很深,但今天只會帶大家看些簡單的 LLVM IR組合語言,並且舉一些例子來講 編譯器最佳化 在做些什麼

另外,今天的範例會以 Rust 為主,因為 Rust 編譯器的核心是建立在 LLVM 之上,所以當然也支援編譯成 LLVM IR(這樣我才好做實驗啊XD)

雖然如此,就算你完全不了解 LLVM 跟 Rust 也還是可以讀,因為今天會從 LLVM 是啥開始講,而且用到的 Rust 語法也超超簡單(比較複雜的我會提供 JS 版本),所以只要有寫過任何一個語言就一定能看懂~

LLVM

LLVM 的命名源自於 Low Level Virtual Machine 的縮寫,但隨著專案發展,現在的 LLVM 跟虛擬機已經沒 …


一代武術宗師李小龍曾經說過:「天下武功,無堅不催,唯快不破」。全天下這麼多武功,一定都有辦法可以破解;再怎麼堅硬的東西,也一定有辦法被摧毀;唯一不能破解的,就只有「快」

武術是這樣,工程師的工作也是這樣。別人在 Github 上開個 repo 需要三分鐘,而你只要三秒;別人光找個檔案就找半天,而你早就完成你的工作在旁邊進修(或耍懶)

所以今天要來跟大家分享我的 終端機環境 以及 十個增進效率的 CLI 工具,希望大家在看完這篇後都能更善用終端機,工作效率提高了,才有更多時間可以偷懶~

Terminal

終端機我已經用 iTerm2 很久了,雖然聽別人推薦過 Hyper,但我用起來覺得也沒特別厲害XD(我是兩三年前用的了,也許現在有),而且他又是 Electron-based 的很吃資源,所以後來還是用回 iTerm2

Image for post
Image for post

Shell

至於 Shell 的話我跟很多人一樣都是用 Zsh,雖然中間一度有想要換到 Fish shell,但後來發現 Fish 的功能幾乎都可以透過 plugin 做到,而且 Zsh 的 plugin 真的太多太方便了XD,所以最後還是選擇 Zs …


這篇文章想講的東西有點多XD,所以內容比較長,沒空的話可以先 bookmark 起來改天再讀

上上週 Luka 已經在「從 Github 開源指南|學習如何貢獻開源專案」介紹過為何要貢獻開源專案,以及在參與開源專案之前有什麼注意事項。我想很多人看了之後,雖然知道貢獻開源專案可以增進實力、加強履歷,但突然想貢獻開源專案還是不知要從哪裡開始

所以今天我想以我自身的經驗,跟大家分享 該怎麼找到適合的開源專案 以及 我可以為專案貢獻什麼,希望大家在看完之後都能夠鼓起勇氣發 PR,不只為了自己的技術成長,也為開源的世界貢獻一份心力

先備知識

這篇文章會以分享我自己參與開源的經驗為主,不會從頭教你怎麼使用 Git 還有 Github,若是對這些還不熟悉的話推薦你先看看龍哥的《為你自己學 Git》的第十章節 — 使用 …


小提醒:這篇文章程式碼比較多,可以存起來用電腦會比較好看唷 ~

說到單元測試,大家第一秒想到的應該都是 addsubtract 這類沒有副作用的 pure function,他們就只是把參數拿來做一些運算,過程中也不會讀取檔案或是發出網路請求,所以測試寫起來自然簡單,大概像這樣

但真實世界的應用往往不是如此,總有一些 function 會需要發出網路請求、或是對資料庫進行讀寫。所以今天的主題就是講怎麼用 Sinon.JS 的測試替身打破依賴,讓原本需要資料庫的單元測試,在沒有資料庫的環境下跑起來

待測對象

馬上來看看今天要被測試的主角 signupsignup function 是個簡單的註冊流程:從參數拿到使用者輸入的帳號密碼之後,依序會做這幾件事

  1. 先檢查密碼長度是否大於 6,太短就直接噴錯
  2. 接著再用 d …


今天這篇文沒有什麼太高深的技術,只是想跟大家分享一下我的 Side Project 的實作過程,放輕鬆看就好了~

事情是這樣的,筆者我身為一個專業的沙發馬鈴薯,在家時常常會把電腦螢幕投影到電視上,不管是追劇、上 Youtube 還是看線上課程,通通都是躺在沙發上看,邊看邊想著「人生至樂,莫過於此」

但問題來了,有時看到一半會突然有訊息需要回,或是線上課程上到一半聽到不懂的東西會想查一下,那就得先 離開沙發 走到電腦前把影片暫停,等事情忙完再繼續

因此,我決定做一個電腦遙控器,讓我可以坐在沙發上用手機遙控電腦。而今天文章的內容,就是講我這個電腦遙控器的進化史XD

先上 Demo

這是最後完成的電腦遙控器,螢幕是電視的畫面、右上角的小視窗則是我手機的

一開始我會先啟動 API server,手機掃了 QRCode 之後 …


今天的文章是要跟大家分享我最近在做的 Side Project,在進入正文之前,請大家先看個小故事~

前情提要

身為一個肥宅工程師,為了不要胖得太誇張,所以我跟女友都會常常去附近的公園打羽球,而那個公園就落在中正區跟大安區之間

雖然打羽球很開心,但因為那個羽球場是露天的,只要風大一點球就會開始亂飛,都不知道是在打球還是撿球。所以我在出門前都會先查好今天中正區跟大安區的風速,然後判斷今天適不適合打羽球

Image for post
Image for post

但問題就在這,就算我查到現在中正區的平均風速是 0.9m/s、瞬間風速是 4.2m/s,那我怎麼知道這樣的風速到底適不適合打羽球呢?所以我從去年就開始紀錄每次的風速、以及當天去打羽球的實際情況

而今天,就要來跟大家分享怎麼用搜集到的資料建出一棵 決策樹,這樣以後只要把風速丟進去決策樹裡面跑一跑,就可以知道今天適不適合 …


身為一個開發者,不管你寫的是什麼語言、用的是什麼框架,一定多少會用到 Git 版本控制系統,而且一定也很熟悉全球最大的男性交友平台 — Github

但你知道,Git commit 的作者是可以偽造的嗎?

以我自己的 Larry850806/a-awesome-repo 為例,這個專案的 contributors 每個都來頭不小:不只有 Linux 跟 Git 的發明人 Linus Torvalds,連 Node.js 圈的大神 TJ、還有 Python 的發明人 Guido 都來了

Image for post
Image for post

專案的 Contributors 的頁面也看不出有什麼問題,這些大神們確實貢獻了不少程式碼


後端資料庫在儲存使用者的密碼時,不應該直接存明碼應該已經是常識了。雖然大家都覺得自己家資料庫很安全,絕對不可能被駭客入侵,但不怕一萬只怕萬一,而且真的出事也來不及了

所以今天要來說說怎麼超前部署,從最簡單的編碼開始探討各種儲存密碼的方式,看看要怎麼做到即使資料庫被駭了,使用者的密碼也不會洩漏出去

先備知識

這篇的內容會延續一個月前的〈一次搞懂密碼學中的三兄弟 — Encode、Encrypt 跟 Hash〉,如果還不清楚編碼、加密跟雜湊分別是什麼,建議先看完上一篇再回來會比較能理解

接著就要從編碼開始探討各種儲存密碼的方案可能會有什麼風險、怎麼做會更安全

方案 1 — 將密碼經過 Base64 編碼

不該用明文儲存密碼,那存編碼後的密碼呢?

譬如說某使用者 Larry 的密碼是 LarryIsSmart,經過 Base64 編碼後變成 TGFycnlJc1N …

About

Larry Lu

我是 Larry 盧承億,傳說中的 0.1 倍工程師。我熱愛技術、喜歡與人分享,專長是 Javascript 跟 Go,平常會寫寫技術文章還有參加各種技術活動,歡迎大家來找我聊聊技術~

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store