因為在家裡會忍不住開冷氣,也不能一直宅著,所以早上還是出來「工作」一下。先找個比較方便的地方,之前有發現某家星巴克超多插座,不過今天先去最近的一家就好。
早上要處理Asset Administration Shell相關的東西,其實還只是個雛形,目前已經用一個sample xml測試過加入assetAdministrationShell、asset、submodel的支援,接下來要處理conceptDescription的部分。xml本身不複雜,但是看了一下一些文章 https://res.mdpi.com/d_attachment/computers/computers-09-00028/article_deploy/computers-09-00028-v2.pdf (只提到幾頁)...恩,處理起來可能沒有我想的簡單,需要多做一些動作。還是要更熟悉Asset Administration Shell規格書中的模型架構才比較放心。理想狀況是剖析xml之後可以用上下文無關的方式呼叫node-opcua-coreaas的api來處理,不過不太可能XD
這家星巴克的問題就是插座少,結果就是筆電快沒電了,趕快轉移陣地到有插座的地方...
下午來輕鬆一下,看一下之前嘗試在前端處理zip檔案格式的東西。處理zip檔案結構的部分已經可以跑了,inflate處理目前是透過 pako,寫了簡單的網頁來跑跑看:
恩恩,last modified date跟last modified time看起來怪怪的,要再研究一下這兩個欄位怎麼處理(先猜測last_modified_date位移後跟last_modified_time相加就是timestamp)...
查了一下規格:https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT ,從「4.4.6 date and time fields: (2 bytes each)」這一節可以知道,zip的日期時間是dos格式...不是簡單計算就好,正確的格式在msdn上面可以找到:https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-dosdatetimetofiletime 可以找到,所以是5 bits的日,4 bits的月,7 bits的年構成last_modified_date,好煩...寫一個函數來處理好了
function formatMSDOSDate(n) {
let y = (n >> 9) + 1980;
let m = (n & 0b0000000011100000) >> 5;
let d = n & 0b0000000000011111;
return `${y}-${(m).toString().padStart(2, '0')}-${(d).toString().padStart(2, '0')}`;
}
這樣輸入19004
就會輸出2017-01-28
,跟zip軟體裡面顯示的日期一致。
時間的格式是5 bits的秒,6 bits的分,然後是5 bits的時,秒的精度是兩秒,所以還要乘以二。也寫一個函數來處理:
function formatMSDOSTime(n) {
let h = n >> 11;
let m = (n & 0b0000011111100000) >> 5;
let s = (n & 0b0000000000011111) * 2;
return `${(h).toString().padStart(2, '0')}:${(m).toString().padStart(2, '0')}:${(s).toString().padStart(2, '0')}`;
}
這樣輸入40233
就會輸出19:41:18
,也跟zip軟體裡面顯示的時間一致。
先賣個關子,明天再來看到底怎麼處理zip檔案格式(湊字數)。總之改良結果:
總算可以看到日期跟時間。
失業...是因為疫情嗎?!
太震驚了,連這麼強的前輩都這樣
還是其實前輩只是存夠錢,提早退休而已
其實不關疫情,公司不賺錢,沒辦法,而且我原本負責的就不是核心業務...不然這家公司很少裁人的。
沒退休啦,只是想稍微輕鬆一陣子,接接案。
明白,支持前輩這系列文章!