Code makes the world a better place

How to debug Rust via GDB

Introduction

Big open source projects are huge, such as the Servo browser in Rust. I have counted the lines of code for you. There are almost a hundred thousand lines of code in the Servo project. To develop such a big project, knowing how to debug in a right way is very important, since you would like to find the bottleneck in a fast and efficient way.

In this article, I will teach you some tips to use GDB developing and debugging your Rust code and the Servo project. The debug method can be also applied to C/C++ as well.

Continue reading

在 Linux 上使用 Perf 做效能分析(入門篇)

簡介

透過效能分析工具 (Profiler),我們可以得知更多關於軟體的運行資訊,像是花了多少記憶體、多少 CPU Cycles、多少 Cache Misses、I/O 處理時間等等,這些資訊對我們去找到程式效能瓶頸很有幫助。想辦法找到那裡讓程式變慢,進而最大化效能,便是我們做效能分析的最大目的。

本文將介紹 Linux 上的 perf 效能分析工具,藉由一個簡單的程式範例,示範如何使用 perf 去分析一隻程式,我們將會發現使用分析工具時能更輕易的發現問題根源。本文參考 Gabriel Krisman Bertaz 寫的 Performance analysis in Linux

Continue reading

使用 Elixir 建立簡易 HTTP Server

簡介

Elixir 是一個動態 Functional Programming 語言,專門用來打造可擴展且易維護的系統。

Elixir 基於 Erlang VM 所建,適合用在需要低延遲、分散式、錯誤容忍(fault-tolerant)的系統上,同時也可以用在網頁開發、嵌入式軟體、資料處理、多媒體處理等用途上。這篇文章「Game of Phones: History of Erlang and Elixir」介紹了 Elixir 來龍去脈,值得一看。

Elixir 寫起來滿有趣的,寫了之後才意識到原來 JS 和 Rust 從 Functional Programming 借鏡了不少概念,所以在從頭學 Elixir 的過程,一些 FP 的特色,像是 Pattern Matching、Enumerable 都已經在先前接觸過。

看完官方的語言教學後,覺得需要藉由寫小專案更熟悉,所以就研究如何用 Elixir 建造一個簡單的 HTTP Server。

Continue reading

交大觀察與心得(三):碩一下課美術社&研究篇

前言

接續上篇介紹碩一下的修課,接下來談談課外活動和研究。課外活動只有去美術社畫畫,相較於大學時到處實習、參加開源專案和參與社群,就顯得比較單調。由於我比較晚才下定決心好好念碩士,在探索領域和找題目上已經比較晚,但我依然在這學期發現自己有興趣研究的領域,並且也找到題目,暑假也開始進行研究了。

Continue reading

完整介紹 WebAssembly 使用方式

1. 簡介

先來說說 WebAssembly 是甚麼,為甚麼我們需要這玩意?

如今網頁技術已經無所不在,人們上網時間佔一天好幾個小時,人們透過網路享受各種服務,各種應用服務也漸漸都轉移到網頁上,桌面程式或手機程式也越來越多採用網頁程式 (Web App) 或混合式程式 (Hybrid App),可以說網頁技術已經主宰了世界。

網頁是採用 JavaScript (JS) 語言,隨著瀏覽器進步、JS 引擎發展,我們似乎已經達到優化效能的瓶頸,JS 不管怎樣快,由於是直譯式語言,會一行一行讀程式碼同時進行編譯,這種模式鐵定會比編譯式語言像是 C++ 還要慢。那你會問,為啥網頁不用 C++ 這種編譯式語言?這是因為不管是事先編好,編譯出來的執行檔會很大,這樣傳給瀏覽器反而會造成網路傳輸花太多時間,或是瀏覽器拿到檔案才開始編譯,那要等他全部編完才能跑也會花太多時間。所以直譯式語言的 JS 先傳給瀏覽器,由於是原始檔檔案不會很大傳輸時間就還行,然後拿到檔案後一行一行編譯,先編譯好的部分可以先跑,也不會讓速度過慢。

不管如何,JS 效能已經到上限了,人們開始想要怎樣讓網頁可以在瀏覽器上跑得更快,於是就有 WebAssembly (WASM) 的誕生了,WASM 是一個低階類似組合語言的語言,其效能可以接近原生 (Native) 的程式,像是 C++ 或 Rust 跑出來的效能。開發網頁時,JS 和 WASM 會搭配使用,概念簡單來說是一般程式邏輯一樣給 JS 跑,但把部分負擔很重的程式碼改成事先編譯的 WASM,這樣就可以讓效能更加進化。同時享有 JS 可以快速啟動的好處,也享有 WASM 在運算複雜的程式碼上有高效能的表現。

接下來本文將會介紹如何使用 JS 搭配 WASM 進行開發。

Continue reading

交大觀察與心得(二):碩一下修課篇

前言

我感覺這學期是這兩三年來過的最快樂的學期了。過得很充實,修了四門課,依舊參加美術社,寫了不少文章,找到研究方向和題目。念資工果真是一件很開心的事情。大致上,碩一下分為三個方面,分別介紹修課方面、美術社和研究方面,本篇先介紹修課方面。

Continue reading

使用 Emscripten 將 Pthread 轉成 JavaScript 與效能分析

簡介

Emscripten 是可以將 C/C++ 轉換成 WebAssembly 的工具,背後是透過 LLVM 轉換,支援轉換 Pthread,會轉成 JavaScript 的 Web Worker 加 WebAssembly,甚至可以將 OpenGL 轉成 WebGL,讓程式在網頁上跑還能有接近原生程式的效能。

其中 Pthread 轉成 Web Worker 加 WebAssembly 的部分,就是本文要介紹的重點。我會拿一個範例程式來實際轉換看看,不過要找一個好的測試程式不容易,所以我寫一支 Pthread 計算 PI 的平行程式,用來做轉換測試。

本文先介紹如何使用 Emscripten 將 Pthread 轉 JS,照著官網教學做的過程採到一些坑,順便也記錄下來,免得大家又落坑了。隨後會分析 (1)原生 C Code (2)Emscripten 轉換的 JS (3)直接用 JS 寫的 Web Worker,三種情境下的效能差異。

Continue reading

SPEC CPU 2006 安裝執行

前言

SPEC CPU 是 The Standard Performance Evaluation Corporation (SPEC) 組織建立的 CPU 效能測試指標 (Benchmark)。最近的指標有 SPEC CPU 2006 和 SPEC CPU 2017,因為具有極大公信力,許多研究都會以這套指標當作評量測試。

如果想要弄到這套指標,網路上是找不到的,是需要跟這機構購買,而且要價不斐,要用的話就是想辦法靠關係弄一套來。我最近要重現一篇論文,裡面有用到 SPEC CPU 2006/2017,實驗室剛好有 2006 年版,但在使用過程中滿多坑的,為此紀錄。

Continue reading

Side Project—做自己想用的東西

什麼是 Side Project

Side Project 是指用業餘時間開發的專案,通常是想要解決某個問題或是滿足自己興趣。滿常看到社群討論要做什麼 Side Project,以及有些人會分享他們的作品。本文分享我對 Side Project 的看法,順便介紹我之前做的幾個 Side Project。

Continue reading

悅讀源碼 (#0):序

悅讀源碼,看見程式之美

悅讀源碼將會是一個嶄新的系列文章,顧名思義就是要快樂閱讀源始碼 (Open Source),多虧於開源的開放性,我們得以觀摩高手撰寫的程式碼,藉此學習和模仿他們的思路和技巧。

Continue reading

資工系所學生的基本素養

一個資工系/所學生畢業該具備甚麼技能?一個資工所畢業的研究生該具備甚麼技能?
除了專業科目所學的知識,我想好好來討論一下資工系所該具備的「基本素養」。

Continue reading

Unix/Linux TOP 指令使用詳解

TOP 簡介

top 指令 (top command) 可以說是使用 Unix/Linux 最基本的工具了,他就像 Windows 系統中的工作管理員,可以監看目前所有程式的執行狀況。top 也是最簡單監控程式的方法,用它來觀察程式運行所花的記憶體、CPU 還有各種其他資訊。類似的程式很多,像是 htopgtop 都是衍伸版,大家有興趣可以去查查看,但以基本需求來說 top 就非常夠用了。

Continue reading

Linux/Unix 用指令設定 DNS

事情是這樣的,從昨天開始我實驗室的主機突然不能上網了,平常我都用那台當作 proxy,因為有時候查論文需要用交大 IP。然後我一開始以為是 Squid 出問題,在那邊弄了老半天設定,才發現問題好像也不是 Squid。接著我很震驚地發現,原來我可以 SSH 進主機,卻不能從他連出去。

Continue reading

傳染病 SIR 模型與機率模型介紹與簡易模擬

1. 簡介

最近武漢肺炎人心惶惶,有台大教授發表化學動力論來模擬傳染變化,而其實我高中時也做過類似的事,就是我的「傳染病之數學模型與個體導向模擬」科展。啟發於科學人雜誌《虛擬城市:天花來了》,文中藉由科學模擬來進行流行病預測與防治,我覺得十分有趣,那陣子對伊波拉病毒想深入研究加上也覺得寫程式好玩,因此就做了那個科展,本篇大致將我高中時的科展報告重新整理。

本文介紹 SIR 模型來做大尺度傳染病預測,同時也用機率函數來做個體導向的微觀尺度模擬,用兩種方式來模擬傳染病的擴散狀況。

公共衛生對傳染病研究有很多理論模型,其中隔間模型(Compartmental Model)藉由假設整個人口被區分成幾個群體,並且在同一群體中所有個體皆有一樣的特性,藉由這幾個假設可以簡化傳染病的社學模型。

在隔間模型中,易感受-感染者-康復者模型(SIR Model)是指由人口由易感受族群(Susceptible, $S$)、已感染族群(Infectious, $I$)、已康復族群(Recovered, $R$)三個部分組成的傳染病模型。模型假設傳染病可以藉由直接接觸傳染,並且每個人會隨機接觸其他人。模型中有兩個重要參數,分別是感染族群傳染給健康族群的傳染力(transmission rate)$β$,以及感染族群恢復的康復力(rate of recovered) $γ$。

機率模型則是本文藉由分布函數去模擬個體互動是否造成感染的簡易模型。

Continue reading

在 Windows 上編譯 Chromium

Chromium 是 Chrome 的開源版本,與 Chrome 差異是 Chrome 多了一些 Google 服務,並且介面設計上也會不太一樣。Chromium 因為是開源軟體,所以被許多其他瀏覽器開發商拿來改造,像是 MicroSoft Edge、Opera、Puffin 等瀏覽器,而 Chromium 底下的 V8 JavaScript 引擎則被 NodeJS 使用。

Continue reading

我與女友相遇的故事

現代人不聯誼了,以前抽鑰匙如今改抽卡,我與現任女友是在交友軟體上認識的,說說去年夏天以來的故事。

命運非常奇妙,當你越認為這個人和你的人生沒關係,你們彼此的牽絆就越強烈。一開始,我從來沒想過這女生會變成我女友。

Continue reading

簡明 CGI 原理與實作

CGI 介紹

Common Gateway Interface, CGI 讓伺服器(Server)將路由(Route)轉給轉外部程式(CGI 程式),使外部程式可以直接和客戶端(通常為瀏覽器) 互動。在 WEB 剛興起的時候,主要還是處於靜態伺服階段,單純傳送檔案或文字資訊而已。如果想要有表單之類的互動,也就是動態網站的話,就要靠呼叫外部程式來幫忙。隨著網路科技的發達,CGI 至今仁廣泛使用,像是 PHP 搭配 Apache。不過同時也有其他架構興起,例如以 Python、NodeJS、PHP、Java 等語言為基礎的網頁框架,像是 Flask 或 Express,抑或著實現前後端分離的 RESTful API 架構。

Continue reading

簡明 Shell 原理與實作

Shell 介紹

不管使用本地端 Unix、Windows 或是連線到伺服器,我們都會打開終端機(Terminal),而連線等入進去的起使畫面會是 Shell,然後開發者可以輸入指令來跑程式。某方面來說,當我們在講「使用終端機」就等同「使用 Shell」,即便他們原本代表意思其實不一樣。關於 Shell 的詳細介紹可以參考「C Sehll」英文維基。

Continue reading