Golang: 清空 slice 的兩種方法

https://play.golang.org/p/tk31HADdMxA

letters := []string{"a", "b", "c", "d"}

letters = nil
// 清空後 cap 值清零、len 值清零

letters = letters[:0]
// 清空後 cap 值和之前相同、len 值清零

說好一年一聘,卻被控非法解雇!約聘人員也要給資遣費?這些法律不可不知

L 公司去年剛經歷一波人力緊縮,不過,業務部經理 David 認為有機會衝刺業績,因此向公司提議用一年一聘的方式增加人力,一年後若業績不見起色也不必擔心裁員問題,只要約滿不續聘就好了。

後來 David 招募了三位約聘員工到業務部門,一年過去他評估只需留下一位表現最好的員工轉為正職,其他兩位則約滿不續聘。不料,這兩位未被續聘的員工卻聯合起來控告公司非法解雇,要求公司恢復他們的工作或支付資遣費。David 不解:「當初合約上已經寫明一年一聘了,怎麼會變成非法解雇?」

兩種狀況約聘人員自動轉正

在上面的例子中,L 公司就是犯了「約聘、正職分不清」的錯誤,以為只要公司與員工在合意的情形下簽了定期契約,約滿就可以不付資遣費。但事實上, 除非是符合特定條件,否則所有的員工在被雇用、上工的那一天起,就算是「正職員工」,不能僅憑公司的需求隨意解雇、開除。

若從法律的層面看,除了公務機關較為特殊之外,員工與公司間的關係大致上只分為兩種:一種是我們常見的一般員工,如果要解雇或開除,都必須要依照《勞基法》的規定辦理,也必須支付員工的資遣費及退休金,法律上稱為「不定期勞動契約」;另一種則是有期限的員工,也就是我們熟知的約聘制人員,法律上稱為「定期勞動契約」。

有些企業為了節省成本,或是為了因應快速變遷的市場環境,選擇聘用大量的約聘人員。不過, 大量且長期的使用約聘人員作為公司營運的主要人力來源,非常有可能遇到法律問題。
在定期契約的相關規定中,非常強調「非繼續性工作」這六個字,意思是,這個工作與職務只能在此特定期間或特定目標下存在,當時間屆滿或任務完成後,這個工作將不再有需求,也不需要任何人繼續付出勞力。所以,如果公司在一年的定期契約期滿後,在 30 天內續聘這位員工,法律就會認定這份工作是常態性的、繼續性的工作,那麼這位員工就算是你的正職員工,就不能簽訂定期契約。

另一種情況是,公司內部有其他的員工跟這位約聘人員從事同樣的工作,例如案例中 David 聘用三位約聘業務同事,但同時間公司還有其他正職的業務同事,就代表這個「業務工作」是一種繼續性的常態工作,也不能簽訂定期契約。

由此可知,少數企業為了節省人力成本而把約聘人員當正職使用,已違反《勞基法》,不只可能為公司招來更大的損失,還可能損及商譽,應該採用其他的解決方案控管成本。

4 種狀況公司可以合法解雇,不必支付資遣費

根據《勞基法》第9條規定,有四種狀況公司可以和員工簽訂定期契約,期滿後公司可以合法的解雇員工,且不必支付資遣費:

一、臨時性工作: 即我們常說的臨時工。例如公司的倉庫淹水了,為了清運泡水的物品必須臨時聘請額外的清潔工幫忙,這種就算是臨時工作,可以簽訂定期契約。

二、短期性工作: 最常見的例子就是公司同事請產假,必須聘請一位職務代理人,一旦原同事產假結束之後,這個代理人的職務就告一段落,這種情況也可以合法的雇用約聘人員。

三、季節性工作: 例如農夫在春天至秋天期間需要人力協助採收作物,但冬天就沒有這個需求,那麼他就可以與員工簽訂定期契約,採收完成後就自動解雇。

四、特定性工作: 在特定期間內、因為特定目的而出現的工作。例如公司要建置一套ERP系統,聘用了一位專職的建置工程人員,而當系統完成之後,該工程師的任務便已消失。
不過,在這裡要注意的是,定期契約都有時間上的限制。

臨時工作與短期性工作最多都不能超過半年;季節性工作不能超過九個月;特定性工作則是不能多於一年,若超過一年,必須事先向勞工局核備。 如果你和約聘人員的定期契約上,超過了這些時間限制,就不會被法律承認,而會直接被視為正職員工,需要依照《勞基法》才能解雇。

另外,雖然約聘人員只是公司的短暫過客,但你必須要有一個基本的認知:這些約聘人員受到的法律保障跟正職人員一模一樣,包括加班、特休、勞健保、退休金提撥等,全都得比照正職人員的待遇,不能因為約聘的身分而剝奪他的權利,否則企業可以被處以 2 萬元至 30 萬元的罰鍰,主管們必須特別注意。

Golang: 數字型態


uint8  : 0 ~ 255
uint16 : 0 ~ 65535
uint32 : 0 ~ 4294967295
uint64 : 0 ~ 18446744073709551615
int8   : -128 ~ 127
int16  : -32768 ~ 32767
int32  : -2147483648 ~ 2147483647
int64  : -9223372036854775808 ~ 9223372036854775807
整數預設型態: int

https://play.golang.org/p/GRpIOgxZafU


https://blog.cyeam.com/json/2017/12/18/go-int-size

int is a signed integer type that is at least 32 bits in size. It is a distinct type, however, and not an alias for, say, int32.

uint is a variable sized type, on your 64 bit computer uint is 64 bits wide.

int 與 uint 是根據 CPU 是 32位元 或 64位元 變化的。

若查看 strconv.Itoa 的原始碼,會發現

const host32bit = ^uint(0)>>32 == 0

使用了 int 長度的特性來判斷是否為 32位元

https://play.golang.org/p/Or99SPVNbm


如何取得使用者 IP 的方法與資安探索

https://devco.re/blog/2014/06/19/client-ip-detection/

本文與留言區的討論


重點摘錄:

一、使用代理伺服器的情況下,HTTP Header 會有不同的行為。例如 Elite Proxy 如何隱藏客戶端的真實 IP。以下簡單介紹幾種常見的狀況給各位參考。

直接連線 (沒有使用 Proxy)
REMOTE_ADDR: 客戶端真實 IP
HTTP_VIA: 無
HTTP_X_FORWARDED_FOR: 無

Transparent Proxy
REMOTE_ADDR: 最後一個代理伺服器 IP
HTTP_VIA: 代理伺服器 IP
HTTP_X_FORWARDED_FOR: 客戶端真實 IP,後以逗點串接多個經過的代理伺服器 IP

Anonymous Proxy
REMOTE_ADDR: 最後一個代理伺服器 IP
HTTP_VIA: 代理伺服器 IP
HTTP_X_FORWARDED_FOR: 代理伺服器 IP,後以逗點串接多個經過的代理伺服器 IP

High Anonymity Proxy (Elite Proxy)
REMOTE_ADDR: 代理伺服器 IP
HTTP_VIA: 無
HTTP_X_FORWARDED_FOR: 無 (或以逗點串接多個經過的代理伺服器 IP)


二、攻擊者可以竄改 header 插入特殊字元,對網站進行 SQL Injection 或者 Cross-Site Scripting 攻擊。


三、從資安的角度,應留存下所有可能紀錄到真實 IP 的資料,記錄下所有相關的 header 欄位,包含「REMOTE_ADDR」「X-Forwarded-For」等等,真正有犯罪事件發生時,就可以調出所有完整的 IP 資訊進行人工判斷,從蛛絲馬跡中或許有機會找出真正的 IP。當然從 header 存入的數值也可能會遭到攻擊者竄改插入特殊字元嘗試 SQL Injection,因此存入值必須先經過過濾,或者使用 Prepared Statement 進行存放。

可以參考的 HTTP Header(依照可能存放真實 IP 的順序)

HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
HTTP_X_FORWARDED
HTTP_X_CLUSTER_CLIENT_IP
HTTP_FORWARDED_FOR
HTTP_FORWARDED
REMOTE_ADDR (真實 IP 或是 Proxy IP)
HTTP_VIA (參考經過的 Proxy)

「駭客思維」就是找出網站任何可能竄改的弱點,從網頁上的元素到 HTTP Header 都是嘗試的對象。因此身為防禦者一定要清楚的知道哪些數值是不能信賴的。


四、REMOTE_ADDR 只能透過 Proxy、VPN 等方法來改變,沒辦法藉由竄改 Header 來假造。

五、用 Onion Routing 連線的 IP 有辦法被查出嗎? 沒有辦法,只能夠知道「Exit Node」的 IP。

六、一般來說不會透過 Onion Routing 來做 DDoS 攻擊。典型的 的 DDoS 攻擊也無法透過 Onion Routing。

七、Web Server 能夠取得的資訊就是那些欄位,包含 REMOTE_ADDR 以及其他 HTTP Header,因此能夠獲得的資訊有限。直接 TCP 連線的 IP 位置就是 REMOTE_ADDR。

程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...