Sunday, January 28, 2018

Structure Padding in C/C++

這篇會簡單提到 C/C++ 裡面的struct padding.

前幾天面試有遇到相關問題, 沒有研究過 compiler 當場回答不出來

之後在網路上查了相關資料並且用clion測試後整理出結論:

structure 是 C/C++ 用來把不同data type 打包起來

struct car {
  int serial_number;
  long long year;
  char type;
  char name[8];
} car_t;

問題 1:  sizeof(car_t) 有多大呢?

這種問題,是半開放的問題

需要做很多假設

1. 第一件事一定要考慮 32/ 64 bit machines.
這個或許會影響 pointer size 的不同. 為什麼我說也許, 因為platform 也會影響 pointer size.

2. 第二件事是compiler,有些comiler 可以optimize. 我不太懂就不多贅述了

考慮完之後我們可以計算


  int serial_number; -> 32 bits -> 4 bytes
  long long year; -> 64 bits -> 8 bytes
  char type; -> 8 bits -> 1 byte;
  char name[8]; ->  8 * 8 bits -> 8 bytes

得到 4 + 8 + 1 + 8 = 21 bytes.

這並不是正確答案

在底層實作上會加上padding.

通常會找出struct 中最大的 bytes. 然後一個一個往下放進去

以上述例子

最大的element 是 8 bytes. 放不下的時候要補足8 bytes 再往下做

int serial_number; -> 4 bytes
#### padding 4 bytes
long long year; -> 8 bytes
#### padding 0 bytes
char type; -> 1 byte  +   char name[:7] -> 7 bytes
#### padding 0 bytes
char name[8:]; -> 1 byte
#### padding  7 bytes

最後總共會是32 bytes.

依照上述的規則如果我們把順序調整

struct car {
  int serial_number;
  char type; // change the order
  long long year;
  char name[8];
} car_t;

int serial_number; -> 4 bytes
char type; -> 1 byte
#### padding 3 bytes
long long year; -> 8 bytes
#### padding 0 bytes
char name[8]; -> 8 byte
#### padding 0 bytes

總共會用到 24 bytes

在底層C/C++ structure 非常常用

如果可以減少 size 也許會對performance有很大影響


https://www.ibm.com/developerworks/library/l-port64/index.html
https://www.geeksforgeeks.org/structure-member-alignment-padding-and-data-packing/







Sunday, December 31, 2017

ECE MS 課程

過了一學期,

記錄一下在美國MS跟BS就讀的差別

美國碩士有non thesis 學程 修完課就可以畢業

這是我以ECE, Computer System Software. CS 的角度去看



先從碩士課程開始好了

我覺得主要分四類


一種是通識類型的

這種類型的課跟大學部的課沒有太大區別

目的通常是把碩博士的知識水平拉到及格線

也是大家所說的涼課/水課

這種類型的課程大部分的資料都可以在網路上找到

很適合有基礎但是有觀念不熟的人去聽



一種是Project 為主

用Projects 帶概念並且實現

通常會要求團隊合作

學習強度的深淺會跟隊友還有自己投入的心力有關

這些Project也可以成為面試的相關經驗

我認為這類課程是最接近我在實習時做的事情

缺點是花了心力的項目也許對未來的工作沒有直接關係



一種是研究導向

這類課程是BS不會接觸到的

上學期修的課要求每周同學輪流上台講解一篇Paper,

用現今技術去帶概念

例如這星期講 Dynamic Analysis

老師會選幾篇相關的paper幫助理解

這種課程比較像是幫助論文型學生找研究方向和題目

也可以當作練習presentation

培養在一大串廢話中找重點的能力


最後一種比較特別

通常是一個教授擅長的領域

例如 Advanced XXX, 或是 XXX Theory

這種課程比較容易跟找工作脫鉤

比較是為了興趣而學的



在大學需要有目的去選課

通識加上大部分專業課程有prerequisite

課表沒有想像中那麼彈性

在Georgia Tech ECE 很容易被迫為了學分畢業門檻去修相關課程

我算是修了很多有趣的課程 沒有特意去挑涼課

我很多同學他們課表都很像因為涼課大家皆知

我在通識方面修了

日文 靜力學 剛體力學 美國歷史 體育 現代物理

在選修上

嵌入式系統 網路 計算機結構 演算法 機率


在BS如果是將來想走研究路線

可能大學就會去做專題去實驗室打雜

修一些比較理論的課

跟教授套關係

同時洗GPA準備申請




反觀碩士課程

我個人是認為碩士沒有所謂的方向

比較像把BS 有興趣但是沒學完的東西學完

選課通常也比較自由

Monday, December 4, 2017

Dash Python API 中文簡介

這學期的雲端計算 project

用了 Dash 當作 front-end

這是 Dash 介紹

Written on top of Flask, Plotly.js, and React.js, Dash is ideal for building data visualization apps with highly custom user interfaces in pure Python. It's particularly suited for anyone who works with data in Python


整個架構需要寫一個 app.py

可以包含 plot graph 還有 html layout.

比較進階的寫法是 live updating components

這個 feature 可以設個 interval


讓網站在一個時間內自動update

這裡是簡單的example, 提供兩種寫 graph 的方法


https://gist.github.com/boalinlai/7da3aac5a73cd45e046c88bdaae016cf

layout 裡面用 id 去指定function

call back function 裡面要有 data, layout

然後設置一個 time interval

最後

指定完 host 還有 port 之後

sudo python app.py

Sunday, November 19, 2017

Cloud Computing AWS (雲端計算)

雲端計算會這麼實用,

在我的觀點主要有兩類,



第一點是計算量的負擔,

傳統的計算必須先空出硬體資源

造成過多資源空轉

雲端計算能夠把計算量分散

同時實現

用多少拿多少的硬體支援



第二點是簡化開發流程

最早以前要開發一個環境

要買主機 把作業系統(windows, linux macos) 裝進去

再來用虛擬機 (virtual machine)

直接從電腦上用軟體模擬出硬體空間

到現在

可以用AWS 直接拿一個虛擬主機來用

接來會針對我有興趣的AWS 技術做介紹

Wednesday, October 4, 2017

Information Theory (資訊理論)

這篇文章會記錄我對 information theory 的了解。


==== Entropy ====

先來討論所有機率是平均分佈


A 有一個硬幣,正面反面出現機率各一半

A 擲了一次硬幣 現在他想把結果告訴 B

但是A 和 B 不可以直接溝通 只能透過其他方式

這些方式有共通點, 只能有兩個狀態

例如:聲調高低, 顏色深淺

我們可以把兩種狀態用 0, 1 來表示

在硬幣的例子,我們可以用 0 代表反面,  1 代表正面

A 擲了2次硬幣 2 次都是正面。

A 現在只要用兩個 1 就可以讓 B 知道結果了

現在我們可以換一個角度想兩種狀態的意義,

A 給 B 0 或 1
可以想成 B 可以問 A 一個問題

A 會回答 0 或 1 代表 是或否

這個例子B 問 A 1個問題就可以知道 1 次結果 



2 個問題 2 次結果


現在考慮骰子 x  = [1, 2, 3, 4, 5, 6], p(x) = 1/6

我們一樣只有兩種狀態

A 丟了 6

現在 B 需要什麼資訊才能知道 A 拿到 6 呢?

a,  B 可以問 A, 是 1,  是 2 ,  是 3 ... 是6?

考慮最壞結果

B 必須問 A 6 個問題

但是  B 也有可能第一次就問到正確結果

 B 實際上不能確定他到底要問幾次才知道


b.  B 可以問A:這個數字是否是 {1, 2, 3} 
這樣子的話我們一次可以把一半的可能去除

1 -> 01
2 -> 001
3 -> 000
4 -> 11
5 -> 100
6 -> 101


由於 log2(6)  = 2.58 不是整數,
我們需要 3 個問題 來確定數字是什麼




a, b 的差別:


假設丟的次數很大

a. 

我們可以想成我們平均需要 3.5 個問題可以問出結果

b.
在 b 情況 3 個問題就可以得到 A 丟的結果

當次數很大時

我們考慮長度

2 * (2 * 1/6) +  4 * (3*1/6) = 2.667

這裡可以看到我們算出來的平均長度會比log2(6) 大

2.667  > log2(6)  = 2.58


to be continue...

Wednesday, June 14, 2017

軟體工程師實習

研究所前,做過了兩個軟體工程師實習。

一個是美國航空電子業,

一個是台灣晶片廠。

在大公司做實習,


這兩個裡面我都是被指派一個小領域裡面。

解決別人邏輯上或是因為版本更新的錯誤。

這種工作需要很強的除錯能力,

要了解整個軟體的架構後,

開始分析可能的原因,開始一個一個試。


上次在國外實習,

我連 version control 怎麼用都不知道,

最主要的收穫還是了解怎麼跟別人合作討論解決問題。

還有在龐大的公司軟體架構中做出自己的貢獻。




這次在台灣做實習,

被指定了一個side project,

有一點意外這個工作需要的背景知識,

很難想像一個新人需要花多少時間才能把知識補齊。

可是感覺一鑽進去,

就會因為有經驗就出不來了。



我覺得軟體工程師算是一個很需要經驗的行業。

解決一個問題,

要去解決背後所有的小細節。

還有解決問題時,

有沒有想要用最優雅的方式去寫,

還是只要能過關就好。


在大公司裡,

有各式各樣的軟體工程師,

我覺得也很好,

大家都有自己的優先事項,

有些混一口飯吃。

有些重心是家庭朋友。

有些單純是喜歡技術。

有些想跳槽。

這些都沒有對錯,

只要不要留麻煩給其他工程師就好。

Monday, May 15, 2017

大學成績

雖然我在一年之前就確定直升碩班,

大學畢業對我來說只是一個過程。

但是想整理一下自己對大學成績的感想。



大學期間在我一直覺得修課拿 A 是學生的本分,

先把成績顧好,再想其他事。

但是畢業前我想了一下,

工數以及化學這些課程拿高分對我到底有什麼意義?

如果別人用這些來評斷我,到底合不合理?



成績這個代表一個學生在有限的時間內,

被教授以及學校量化的學習過程。

其中又有天份、努力、運氣成分。

一個拿書卷獎的學生,

只代表獲得了教授一致的肯定,

吸收消化了所有的教材或是做出指定的項目要求。



到了大三大四,

我發現身邊的人都有了自己的規劃,

不管是找工作、研究專題、還是準備研究所。

如果不是要考頂尖研究所,

成績只是態度的參考而已。

如果可以重來,

我會想在維持中上的成績同時培養興趣和實力。

ubuntu on x1c carbon 6 th

此篇網誌將會記錄 x1c 使用心得以及問題 @ 12/2018 拿到windows 10 pre-installed x1c 6th 壓縮容量 改bios開機設定 安裝 ubuntu 18 from usb @ issue 1. 電量問題 co...