Functional options pattern in GO

前言

之所以使用 Functional options 的契機,是因為用到 gRPC 的 New Server API,發現他是用 functional options 來讓使用者調整 Server 預設配置,這樣的作法不但兼具了擴充性和可用性,也能避免一些使用者誤用。而除了看 source code 來學習如何實作之外,也找起相關文章,進而發現原來早在 2014 年就有人發表過類似教學文,實在是太孤陋寡聞了~

![study-2019-02]({{ site.url }}/assets/images/functional-options.png)

趁著這次機會,把相關文章的重點整理出來,讓大家在寫類似 API 時,也能做個參考。

Self-Referential Functions

首先要提到的是由 Rob Pike 所整理出 self-referential functions文章,此 Pattern 方式可用於:

  1. 有效地處理繁多且複雜的 setting options
  2. 需要保留之前所設定的 option

以下為文章中的實作例子:

Read more →

2019/02月份自我學習回顧

![study-2019-02]({{ site.url }}/assets/images/study-2019-02.png)

前言

這個月大多在適應新的生活環境,第一次來新竹工作,不意外地在新手村落腳。在還沒來新竹之前,就聽聞過新竹可能是個比台北無聊的地方,那時候覺得反正我生活也很宅,不是 coding 就是買化妝品,只要有舒適的套房和康是美就可以存活了,但是實際上沒有我想的這麼簡單XD 畢竟新竹的社群活動真的少很多,讓假日少了一些樂趣。既然沒有實體活動,只能在線上多參與一些活動或是多看別人分享的文章了。

本月份學習內容除了加強 React 之外,也開始加入多一點 Golang 內容,不意外的話,之後工作使用語言應該會是 JavaScript 和 Golang,所以先安排階段性的練習,在之後專案中也能比較快上手。

學習回顧

React

React 在大致上用過一輪主流的 libs 後,開始慢慢把學習重心放在 source code 研究。例如 build form 常用的 formlik,看一下他是怎樣透過簡單的 loadash.toPath function 取得 value,讓 formlik 可以用在複雜的 nested form 上。另外也研究 react-bootsrapmaterial UI 中 styled component 架構,希望對於往後開發相關 component 有幫助。

Read more →

React Hooks with memoizedState

前言

React Hooks 自從正式 release 後,就出現很多相關教學文章,所以這篇不是講如何實作,而是說他如何在 stateless functional component 中保存當前 state。 此外,最近也開始嘗試把 class component 轉換成使用 hooks 的 components,但過程中還是需要蠻多調整,包含之前有使用一些 lifecycle functions ,藉此機會順便檢視是否真的必要使用這些 functions,是否可以透過其他架構方式來簡化。

useState

以下是我們使用 useState function 的基本範例:

1
2
3
4
5
6
7

function Example(props) {
const [state, setState] = useState(initialState)
  return (
  /// ReactElement
  )
}

依照 functional component 邏輯,我們應該每次都會新建一個 state,導致 state 值無法保存。不過透過 React Hooks,我們卻可以在每次 render 時得到上次更新後的 state 值,這是為什麼呢?

Read more →

2019/01月份自我學習回顧

又到了每個月檢討念書進度的日子了,這次 2019 新的一年有蠻多人生大轉變,像是離職換了一個新的工作環境,以及脫離媽寶身份,跑去新竹生活等。 Moxa 算是我轉職後第一份的正式工作,而在這一年中其實學到很多經驗,但是也對一些流程和開發方式有些疑問。我很想要根據這些問題提出自己的見解,可惜經驗少,又沒有其他公司經驗可以參考,因此總有很想要提出改善,卻又不知道該如何改善的感覺。

而在年底時,剛好有這個機會可以去趨勢工作,在考量趨勢科技是一家成熟軟體公司的情況下,雖然目前開發經驗還累積不足,但還是決定前往了。我不能説決定是不是正確的,但是我覺得人生就是充滿各種契機,只要在過程中很努力的學習,相信最後都還是值得的結果。

話又說回來,這次學習主軸又拉回前端,並且參雜一點 Network 理論。這次學習是以 React 以及相關 lib 為主,而 network 則是清大開放課程的 區域網路,之前上完這位教授的網路概論,覺得收穫良多,所以繼續上教授的另一門課程。

此外,這次在學習紀錄上則是採用 91哥 所提到的 Trello + Calendar Plugin,不過比較不方便的是因為每天紀錄都要開一張卡,寫 blog 時不好統整,因此又自己寫了一個小工具,可以讓這些 Card 擷取並轉換成自己的格式。

![12-study]({{ site.url }}/assets/images/study-2019-01.png)

學習回顧

React

由於已經學習過一個框架,所以在學習另一個框架的時候,就把重點擺在它的實作原理和在應用時應該要注意的事項。像是 Lifecycle 一定要知道(React 16 版本)還有 render 時的流程,要如何避免它會 over render。甚至當這些畫面沒有如你預期更新時。可能是哪些流程出了問題等。

Read more →

工作 - Redux State 被異常更新除錯紀錄

問題:

今天收到 back-end 同事回饋,說是在新版本的 APP UI 中出現不正常行為。由於我們的 menu 必須根據 Embedded System 中的 Applcation 來增減,因此就使用 menu state 來讓其他 component 也可以透過 dispatch 控制 menu 項目。

menu state 中有一個 property 是用來記錄 menu 的縮放,結果現在這個縮放行為會在使用者按 menu item 時出現異常,property value 會回到原始狀態 (initial state)。

找出原因:

當同事回報這個問題時,第一個想到的就是在 menu state 被 re-create,才會引發 re-render 行為,進而讓 menu 回到沒有縮放的初始狀態。

Read more →

使用 React-Redux 注意事項和運作原理

前言

網路上有很多關於如何使用 redux and react-redux 的教學文章,所以在這邊就不寫如何去應用,而是會著重在一些可能會忽略的細節以及大概的 實作原理。其實這些細節都寫在官網上,不過一般在教學文章內較少著墨,所以特別摘錄出來,讓大家在使用 react-redux 時能注意到可能會發生的問題。

mapStateToProps Issues

首先來談談在建立 connectHOC 常用到的 mapStateToProps,由於這個 function 關係到 component props,所以就容易產生沒有發生 render 或是 render 次數過多的問題。

1. render() 沒有被觸發

關於這部分,官網也有提出相關內容:

By default, React Redux decides whether the contents of the object returned from mapStateToProps are different using === comparison (a “shallow equality” check) on each fields of the returned object.

Read more →

2018/12月份自我學習回顧

前言

其實可以看到,我從 11 月開始發文量變少(雖然本來就不多XD),主要是因為目前在複習一些理論課程,我又是手寫筆記派,所以自然地就比較少用 blog 記錄,反而是都寫成筆記,不但能強化當下的記憶,也方便日後複習。 ![12-study]({{ site.url }}/assets/images/12-study.jpg)

學習回顧

Network Principle

本月份主力衝刺在 Network 基本概念,這個月複習 Network LayerData Link Layer,雖然對於其中所使用到的 algorithm implementation 方式不熟悉,不過至少找回了概念,之後在 trace network protocol code 的時候也會更有方向。

學習日誌

本月份總共 9 天沒有唸書,因為剛好遇到跨年連假和公司年末要趕專案進度,所以減少了晚上自修的時間。

  • 12/01: 生日!正式邁入而立之年
  • 12/02: Implement TCP cong control (additive increase, multiplicate increase), TCP slow start, Refinement - three dup ACKs and timeout
  • 12/03: Golang slice review and string (immutable) to bytes
  • 12/04: 趕工作進度
  • 12/05: Network Layer - service model, connection and connection-less
  • 12/06: 經痛
  • 12/07: Network Layer - virtual circuit (create a path to dest) forward table, datagram (only dest 32bit data) and router table.
  • 12/08: ICMP protocol, Input and output queue, IP fragmentation
  • 12/09: Subnets, DHCP protocol
  • 12/10: 趕工作進度
  • 12/11: NAT concept ICMP protocol
  • 12/12: IPv6 features - fixed header, no fragmentation, tunnel
  • 12/13: Forwarding table algorithm
  • 12/14: 趕工作進度
  • 12/15: Routing algorithm - Link State(On2) and should know all node in network
  • 12/16: Routing algorithm - Distance Vector and broadcast the path table to another routers. AS (atomic system) inter - AS and intra - AS
  • 12/17: Routing protocol - RIP routing info protocol | OSPF open shortest path first | IGRP (only for scisco)
  • 12/18: Boder Gateway Protocol (Prefix + attribute), routes selection
  • 12/19: Broadcast and multicast with tree
  • 12/20: 醫生說要多休息,不然感冒會惡化,因此提早睡
  • 12/21: Reverse path forwarding, pruning forwarding tree, shard-tree (NP-complete, impractical) , DVMRP and IGMP protocol, PIM protocol
  • 12/22: Golang code style, Data link layer intro (principle) service for framing, NIC adaptor, Adaptor communication, error checking (bits)
  • 12/23: Channel partition - FDMA / TDMA, Random access protocol - ALOHA, CSMA and CSMA/CD, Taking turn MAC protocol (polling and token pass)
  • 12/24: Mutation Testing , MAC address and ARP (Address resolution protocol), The process of send data from A node to B node (datagram -> broadcast to get MAC -> if no target then send to default router)
  • 12/25: 聖誕節聚餐
  • 12/26: The process of CSMA/CD.
  • 12/27: CSMA/CD - Exponential Back off, efficiency, Manchester encoding. Physical layer device - hub. (only broadcast signal). 線上直播 - Linux 核心設計: 多核處理器和 spinlock
  • 12/28: Switch table and self learning, Interconnecting switches. The difference of switch and router
  • 12/29: Application layer
  • 12/30: 跨年連假
  • 12/31: 跨年連假

Read more →

11月份自我學習回顧

前言

這個月學習內容主要集中在 Embedded SystemNetwork,說來慚愧,雖然大學有修網際網路,但是過了這麼久,很多知識都還給老師了。因為目前在網通廠工作,常常會接觸到 Application Layer Protocol 和使用 UNIX Socket,所以趁這機會再一次把網路課程複習一下,混搭上個月沒有學完的 Embedded System

遂一算也快要年底了,這個月發生一些事情,這些過程警示自己的能力還要繼續加強,不能因為在工作上已經逐漸上手了,而導致學習速度慢了下來。現在學習上,新事物和基礎理論強化各佔半,希望能在吸收新知識同時,也能把過去學習到但是遺忘掉的理論補起來,讓自己在使用這些新技術也能充分了解其背後含義。

學習回顧

Embedded System

  • Build a linux kernel 和 simple linux service 這個月在 Embedded System 進展到 build linux kernel, linux 版本上選擇了 Alpine v3.8,size 極小和重視 security 的 linux system。規劃在熟悉了 alpine 整體架構後。會細看它如何去修改這些 kernel 去實現安全化的機制。Service 部分,目前是採用 Alpine 打包成 package 的方式,然後將 package 一起 build 到 kernel 中。不過這些內容比較偏實作面,理論基礎上對於 kernel space 和 user space 的細節和運用場景還需要再加強。

Network

Read more →

Node-Red - Node 坑坑紀錄

前言

最近工作接觸到 Node-RED,需要建立專屬的 Node,而在這過程中遇到蠻多坑的,所以特別紀錄一下。

相關技術

  1. Node.js v10.11.0
  2. node-gyp
  3. docker
  4. arm cross compile
  5. Node-RED node development

坑坑相連

1. Node-RED docker version & Node.js version

問題點

沒有先確認官方 Node-RED docker 所內含的 Node.js 版本,導致所建立的 node 無法在官方 Node-RED docker 中運行。

說明

目前官方所提供的 Node-RED docker 中, 並沒有提供內建 Node.js 10.x 版本 (目前最高只提供到 Node.js 8.x),而我的開發環境是使用 Node.js 10.11.0 版本,更不巧的是我又用到 Node.js 10.11.0 才有的 N-API functions,因此導致 node 在運行時直接出現 segmentation fault Error 訊息。

Read more →

Microprocessor System Lab. - Cross Compiler

前言

其實整個課程已經看完了,只是因為寫 blog 需要準備很多資料,畢竟有些部分老師快速帶過,所以生產文章的速度遠不及看課程速度XD 這次要說的是 Cross Compiler,因為如果是安裝像是 SW4STM32 IDE,它所有 cross compiler 設定都已經備妥妥了,使用者只要按一個蟲蟲鍵便能快速 Debugger,不過實際上它背後執行許多程序,只是因為都被自動配置好了,因此使用者不太需要去處理這些額外的環境設定。

Cross compiler

當我們在開發 Embedded software 時,通常情況下,都是在自己所使用、性能比較好的 host PC 進行程式碼編寫和 compile,接著把 compile 過後的執行檔燒在開發板上(畢竟開發板的執行效率不如自己手上的電腦好,如果直接使用開發板來 compile,會 compile 到天荒地老吧)。

不過,大部分人使用的電腦都是 x86 系列,如果直接在電腦上使用一般 compiler,就只會編出僅供 x86 辨識的執行檔,而想要 compile 出其他 CPU 可以辨識的執行檔,就必須透過 cross compiler 的協助才行。

Read more →