Hero Image
[JS] JavaScript 當中的原型繼承鏈模型

基於原型 (Prototype-Based) 的 JavaScript 一般物件導向式(OOP; Object Oriented Programming) 程式語言 (如:java、c++、c#) 當中的物件是由類別模板 (class) 產生實體物件 (instance),實體物件的屬性各自獨立。類別模板上可設置共用的靜態資源包含靜態方法 (static method)、靜態屬性 (static field),而這些靜態資源可以在沒有建立實體的情況下透過類別名稱直接取用。 JavaScript 中的物件通常隸屬於另一個物件,這種隸屬關係類似物件導向語言的繼承,而在這種關係中的上層物件稱為原型 (Prototype)。原型本身又有自己所屬的原型,這種物件層層繼承的關係稱為原型鏈 (Prototype Chain),幾乎所有物件的最上層原型是一個構造函數叫做 Object 的物件。 因此一般物件導向式語言稱為基於類別 (Class-Based) 的語言;而 Javascript 是基於原型 (Prototype-Based) 的語言。 建立物件原型 JavaScript 本身沒有類別模板的概念,是以構造函數 (constructor) 建立物件,物件可以將 constructor 屬性指向構造函數,但並非所有物件都有構造函數,具有構造函數的物件可直接以構造函數產生原型鏈下一層物件;不具有構造函數的物件只能在其他物件建立完成後,以其他方式設置為其他物件的原型。 建立原型的方法就是直接宣告一個函數,JavaScript 會自動把該函數作為構造函數,並自動建立一個隸屬於 Object.prototype 之下的匿名物件,並把宣告的函數指定給該匿名物件的 constructor 屬性。 // 宣告一個函數 Foo function Foo (){} // Foo.prototype 在 Foo 被宣告時自動建立 Foo.prototype // {constructor: ƒ} // Foo.prototype 的 constructor 屬性自動指向 Foo Foo.prototype.constructor === Foo // true 建立物件 透過構造函數 // 建立一個物件 let bar = new Foo{} // {} 直接對變數賦值 JavaScript 對變數賦值底層行為:以 Object 構造函數建立物件,然後對物件並賦值(故賦值發生在物件建立之後)

Hero Image
[台灣杉] 一鍵登入國網中心台灣杉(Taiwania)

台灣杉(Taiwania)是國網中心2018年啟用的超級電腦,登入時密碼必須附加OTP (One-time Password),國網中心建議取得OTP的方式是從驗證器取得OTP密碼,但這樣的方式每次都需要打開驗證器(手機、chrome插件… etc),並且需要手動輸入OTP,下面分享我從Windows以及Linux環境下登入台灣杉所使用的一鍵登入方式。 OTP的演算法可粗分為HOTP (HMAC-based OTP);以及基於HOTP的TOTP (Time-based OTP),我們不必瞭解演算法細節,只需知道台灣杉採用Base32編碼作為TOTP金鑰(Secret),時間間格為30秒,每30秒可以根據”Secret”與”當前時間區間”以sha1演算法生成一次性密碼(OTP,或稱為Key),由於這是單向加密的過程所以無法用時間區間與Key逆推Secret,並且OTP在成功使用一次之後就會被伺服器廢棄,以確保安全性。 注意事項 校時 由於TOTP演算法依據當前時間區間產生OTP,如果作業系統的時間不正確則會產生錯誤的OTP,在Windows環境之下可以到國家時間與頻率標準實驗室的網頁下載NTP校時軟體,以管理員身分執行進行校時;Linux環境可以用下述指令更新時間並寫入BIOS: # 從NTP時間伺服器進行網路校時 sudo ntpdate time.stdtime.gov.tw # 將更新的時間寫入BIOS sudo hwclock -w 所有登入行為之間必須間隔30秒(包含使用winSCP、putty或從Linux直接登入)。 每個30秒區間會產生一個OTP,而該OTP一旦經過使用就會被伺服器廢棄而無法再用。我曾經連續登入以為程式壞了,但核對iService上面產生的密碼又是一樣的,後來才發現這件事…中間還因為連登失敗太頻繁還被鎖,因此記得間隔30秒以上再登入。 Linux要登入台灣衫需要將台灣衫加入know host,以生醫節點為例: ssh-keyscan 140.110.148.14 1>>~/.ssh/known_hosts 2>/dev/null 從Windows登入台灣杉 前置工作 安裝Go,並設置GOPATH。 安裝putty。 安裝WinSCP。 知道怎麼打開windows的命令提示字元 (WIN+R、鍵入cmd、enter)。 編譯TOTP產生器 取得TOTP套件 go get github.com/pquerna/otp/totp 撰寫程式碼main.go package main import ( "fmt" "github.com/pquerna/otp/totp" "os" "time" ) func main() { secret := os.Args[1] code, _ := totp.GenerateCode(secret, time.Now().UTC()) fmt.Print(code) } 編譯 go build -o taiwaniaOTP.exe main.