發表文章

目前顯示的是 2021的文章

[書摘] 原子習慣

圖片
  習慣改變帶來巨大的成就,並不表示你將在工作中出類拔萃、人群中傲視群雄,而是在你的生命裡探索出更多的可能性。副標題所說的巨大的能力提升,則是中文譯者自己加上去誤導大眾,類似於高效學習的觀念進去。 這本書適合兩種人,第一種是還在茫然尋找生活目的,缺乏動力執行目標、找不到能夠改變自己的方法。本書提供許多方法讓你建立習慣,以及戒斷壞習慣的心法。 但二種是對生活過得很嚴謹,已經盡可能榨乾自己的專注力以及能夠使用的時間去讓自己更好。這類型的人可以用來檢視這些理論或方法是不是早就已經成為習慣實行在日常生活中。 習慣形成的四個步驟,建立在提示、渴望、回應、獎賞。建立好習慣要讓提示顯而易見、讓習慣有吸引力、讓行動輕而易舉、讓獎賞令人滿足。反之戒斷壞習慣則反轉這些法則。 開始新的習慣,可以把想要的行為跟每天已經在做的事綁在一起。例如我想養成每日聽BBC News的習慣,能用以下的習慣堆疊公式「做完(目前的習慣)之後,我會執行(新的習慣)」,例如:當每天早上戴起AirPods pro, 我會聲控”hey Siri, play bbs podcast”。 想要讓習慣成為生活的一大部分,就讓提示成為環境的一大部分,大多人都是視覺、聽覺優先的生物,藉由物品的擺設、提示音等設計讓好習慣的提示顯而易見。 運用誘惑綑綁的方式,將想要的行為與需要的行為配對。例如養成聽英文的習慣, 但又需要身體健康,就把「爬山聽英文廣播」捆綁在一起。 習慣養成的成功與否取決於頻率,而非時間。因此打造環境降低阻力,讓行動比較容易執行。例如將英文廣播設定為手機捷徑或聲控觸發,減少手動畫面切換的繁瑣流程,讓行為更自動化、更聰明。 也別忘了當完成習慣時,適時給自己立即的獎賞,並且追蹤自己的習慣,持續的頻率以及品質。而我常做的就是每週都會留30分鐘去做一週的retrospective,做得不錯就給自己一杯美味的拿鐵。

Java Spring Injections - The first sight

Java Spring Injections的 Injection Type  有三種:Constructor、Setter、Field 以寫code的觀點來說,直接在物件上加上@autowired的Field Injection是相當易讀也簡潔。 Field injection具有immutability特性不能針對final 的物件 assign dependency。 即便這些觀點是Spring Team提出來的,但實際上也是有工程師持不同的意見。例如某些field就是不可變的才用final修飾、開發時就是避免閱讀上理解錯誤,以及並無明顯效能與安全性差異,才用相對簡潔的方式撰寫。 references: https://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/ https://stackoverflow.com/questions/39890849/what-exactly-is-field-injection-and-how-to-avoid-it

Mapped Diagnostic Context (MDC) - The first sight

 Log4j提供能在不同的scope中也能夠log 資訊來輔助tracking logs。 假設想要log執行transaction前後的資訊在同一行raw log中,藉由MDC 這個map去put欲保留的參數與值,並在執行完畢後clear,就會在執行的當下將保留的參數保留在thread中。即便暫存是implement 在threadLocals上去確保thread-safty,但因為thread都是從thread pools拿取,因此clean這件事情變得重要。 改善的方法是可以在ThreadPoolEcxecutor去override afterExecute讓每次執行完都做 MDC.clean()。 reference: https://www.baeldung.com/mdc-in-log4j-2-logback

Aspect Oriented Programming(AOP) - The first sight

圖片
AOP 是個程式編寫方式,透過允許橫切的方式分離並且模組化,能在不修改程式碼本身就能添加額外的程式碼。接下來介紹 Spring實作的 AOP 與library AspectJ。 圖片出處 www.baeldung.com AOP Aspect - 標準的程式碼功能分散在分散在application中多個位置點,每個aspect專注於特定的橫切功能 Joinpoint - 程式執行過程的的特殊點,例如method 執行、call建構子、參數被指定, etc Advice - 於在特定的joinpoint的aspect中採取行動 Pointcut - match joinpoint的正規表示法,當join point match 的pointcut, 與pointcut相關的特定advice會被直執行 Weaving - 連結aspects 與目標物件來建立advised 物件的process Business Object - 一般的邏輯物件,像是兩個參數相加 public class SampleAdder { public int add(int a, int b) { return a + b; } } Aspect - 能跨多個class的模組化類別 public class AdderAfterReturnAspect { private Logger logger = LoggerFactory.getLogger(this.getClass()); public void afterReturn(Object returnValue) throws Throwable { logger.info("value return was {}", returnValue); } } 以上就是個簡單在物件,當關聯物件return之後,會寫log。此時還沒有任何Spring annotation去做關聯。 Joinpoint - 執行程式中的連接點,例如執行method或處理exception。 在Spring AOP中,JoinPoint通常是在程式執行的時候。 Pointcut - 切入點是個predicate(謂詞是一個會回傳boolean的function)

JUnit - The first sight

JUnit是一個Java語言的單元測試框架,目前主流為JUnit4 與JUnit5 junit5功能多又比較全面,因為junit5有向下相容junit4所以常常會看到混著寫的情況 可以觀察annotation, method的package,以下則是junit 5 org.junit.jupiter.api. 若是以下的則是junit 4 org.junit. 由於mocking的物件會橫跨至其他class,因此為了做mock session延展至在unit test階段,可以initMocks @Before public void setup() {     MockitoAnnotations.initMocks(this); } Getting start with @Mock, @Spy, @Captor and @InjectMocks 以上都是Mockito的annotation 不同的annotations 使用方式來啟動mockito test MoclitoJUnitRunner 就是最基本的JUnit測試 @RunWith(MockitoJUnitRunner.class) public class MockitoAnnotationTest {     ... } MockitoAnnotations.initMocks() 以programming的方式透過它來啟動Mockito @Before public void init() {     MockitoAnnotations.initMocks(this); } MockitoJUnit.rule()  (比較少看到...) public class MockitoInitWithMockitoJUnitRuleUnitTest { @Rule     public MockitoRule initRule = MockitoJUnit.rule();     ... } @Mock Annotation 最常見到到的Annotation, 用@Mock 建立/注入mocked instances 在沒有annotation的時候則需要自己寫Mockito instance List mockList = Mockito.mock(ArrayList.cla

Microservice transaction - The first sight

Transaction across Microservices 盡可能避免 transactions 在多個 microservices Two-phase commit protocol 兩階段提交協議,用於跨不同software components (databases, message queues...)的transaction Architecture of 2PC transaction coordinator 調節器包含兩個部分 準備階段 prepare phrase Commit and rollback phrase 會拖垮操作service的速度,例如 A -> B , A 先設定成prepare,等待 B執行結束返回,A才update成 commit/rollback XA standard (Open XA, (XA stands for extended Architecture) based on 2PC, 目標是保證執行在全域性transaction的原子性. 定義global transaction manager 以及special application,做交易都須透過此library,讓transaction manager track每筆交易。XA maintain logs 去決定是否要commit/rollback) 優點是cross service transaction 可以使用各自的技術去實作,包含各自有各自的database 缺點就會在transaction manager  有 bottle neck on 處理大量請求,必須保持service always alive Rest-AT Standard  Draft Standard 允許 application server as a transaction coordinator, 用rest API建立分散式 transaction 最終還是要要部署到local 或個環境、編寫橋接服務的邏輯 Eventual Consistency and Compensation (最終一致性跟補償) 此模型不強制跨維服務執行分散式的ACID行為,而是運用些機制:狀態、flag、batch process來確保系統在未來的某個時間點資料最終一致性。 在眾多可行

Spring with lombok - The first sight

 lombok project的誕生,是由於Java在框架實作上有許多無實質價值的code,藉此利用lomok annotation 取代撰寫code內容來增加生產力。 最常見的就是 Getters/setters 與Constructors的撰寫,畢竟在物件導向中用此封裝是常用的做法,如framework依賴Java Bean的模式。 @Entity @Getter @Setter @NoArgsConstructor // <--- THIS is it public class User implements Serializable { ... 也可以對物件參數做限制,例如ID只能get不能user set private @Id @Setter(AccessLevel.PROTECTED) Long id; 還有其他功能像是 lazy getter,以及運用Annotation去創造建構子。而@Accessors(fluent = true) 則是把呼叫的語法變簡潔,如getKey()變成key()。 public class GetterLazy { @Getter(lazy = true) private final Map<String, Long> transactions = getTransactions(); ... } @RequiredArgsConstructor @Accessors(fluent = true) @Getter     public class LoginResult {     private final @NonNull Instant loginTs;     ... } Builder annotation也對build object的行為做了簡化,不必再用一堆setA("test")的與法,直接.a("test") @Builder public class ApiClientConfiguration {     ApiClientConfiguration config = ApiClientConfiguration.builder()         .host("api.server.com")

Reverse proxy with NGINX - The first sight

NGINX reverse proxy更改配置為http和其他協議的反向代理,提供修改header和緩衝response,proxy通常用在多個server間分配loading來顯示不同網站內容。 將請求傳遞給代理伺服器,在 location 路徑block裡面,添增proxy_pass 即可在碰到該路徑,導向proxy URL。 location /some/path/ { proxy_pass http://www.example.com/link/; } 以上頭設定為例,若request路徑為 /some/path/home.html,則會被proxy到http://www.example.com/link/home.html Passing request headers 預設的情況下header中的host改為$proxy_host,Connection設定為關閉。可透過proxy_set_header 去修改。

Rate limiting with NGIX - The first sight

Rate Limiting with NGINX 可以用於安全性上,藉由限制使用者針對同一個URL的行為來對付暴力破解密碼的request、DDoS攻擊。一般來說,也要保護upstream的application避免同時接受大量的請求。 以NGINX  為例,他用的是leaky bucket algorithm,在通訊交換很常見的方式。假設水桶有洞,注入的水的速度大於滴出的速度,則會溢出。就像client進行http request,server 針對requests first-in-first-out 處理,太多請求太多請求超出緩衝區(bucket)就會丟棄請求。 幾個指令簡單介紹 limit_req_zone 設定共享記憶體大小和限制速度,但這沒有限制限制請求範圍。因此需要再深入設定location或server去限制特定請求,例如在 /login/ 的請求下才起用此設定。 處理突發 如果在限制內收到2個請求,第二個請求會被返回503 error code。理想狀態可有個緩衝並且即時做服務,這時候需要burst參數來設定。在前一個請求時間限制內來的第二個請求就會放置queue中,burst為記憶體大小。當burst滿了,除了第一筆資料先打到upstream, 後面的就放入原本bucket的queue中。當排隊超過burst大小還是會發生503。 若在burst加上nodelay,則會在burst滿了之後一次性的把request倒進bucket,如果burst中所有request都同時到達,那將只會有第一個request會被處理。 使用limit_req的延遲參數delay去達成兩階段 rate limit。例如在一個網站有4個 resource per pages,最多12狀況下,rate limit = 5 request /s , burst = 12, delay = 8 讓前8個在burst的request不delay, 後面的request按照rate limit速度打,溢出則丟棄。 reference: https://www.nginx.com/blog/rate-limiting-nginx/

RabbitMQ - The first sight

Message brokers 是讓application, service and system 做溝通與交換訊息,即便雙方用不同的語言、平台。提供驗證、route、儲存、發送message到指定收件人上,是個中介的角色。Sender 無需知道Receiver真實位置,也不用確認對方是否接收到或是否存在。 Rabbit MQ 是分散式的 message broker,提供在複雜的環境中進行資訊傳遞。採用推送的模式,提供理想低延遲的queue-base架構。 非常適合在快速請求response的web servers,並在高負載的工作下與其他服務共享訊息。另外也可以處理後台long running task 像是圖片轉換、PDF轉換。另一種message傳遞方式,可參考另一篇 Kafka - The first sight  介紹Publish/Subscribe的模式。

Kafka - The first sight

Kafka是分散式串流平台用在publish 與 subscribe 串流訊息記錄。由Java and Scala撰寫而成的pub/sub message bus,提供高流量的streaming process. 相比message queue, Kafka 將message附加到log中直到consumer reads 或超過保留上限。 適合用在A到B之間 streaming process,無需繁雜routing,能有最高吞吐量。也適合做在不同狀態間的資料流處理,像是data scientist 處理訊息、分析訊息 in real time。 Publish/Subscribe 是分派message的模式,讓發布者傳遞message。可運用其broadcast-style方法 ,達到Publisher與consumers之間one-to-many的關係。 另一種message傳遞方式,可參考另一篇 RabbitMQ - The first sight 介紹message broker的形式。

Webhook - The first sight

Web API 與 webhook兩個都是讓application互相溝通的方式,webhook 則是rest API其中一種,是由事件觸發的方式去做單向資料傳遞。 API 是個介面提供不同軟體間有相同的溝通方式。Webhook  允許程式立即送資料的服務,因此也被成為反向API,由原本A 不斷去問B data是否有更新,變成B一有更新就立即通知A。將反覆請求,改為Server方直接收到資料。簡單的例子就像是monitoring service alert tirgger傳遞notification message to Slack. reference: https://en.wikipedia.org/wiki/Webhook 

Java Spring Framework - The first sight

Intro Spring Framework是給程式開發者開發應用程式的基礎框架,前導概念,What is Java Bean? 跟POJO的差別是什麼?POJO就是最單純的Java Object,是Plain Old Java Object的縮寫。Beans 是 POJO的其中一個特別型態。Bean 可序列化(必須要implement serialization interface)、欄位皆為private並提供getter and setter、必存在無參數的建構子、欄位只能藉由建構子或getter and setter進行修改。  IoC  IoC (inversion on Control) 反轉控制是物件導向設計的一種原則,降低程式碼之間的耦合度,最常見的方法較依賴注入 DI (Dependency Injection),還有其他方法叫依賴尋找 DL (Dependency Lookup)。而Spring Framework實作了這個方法。 在Spring裡看到以@Component(以及他的好夥伴@service, @Repository)的annotation,是來定義可以被Spring IoC engine 實例化的class。 Spring Core Annotations 藉由org.springframework.beans.factory.annotation 與org.springframework.context.annotation packages 來發揮 dependency injection 最大效益 DI-related annotations @Autowired - 去標記Spring 要去解析、注入的物件。找到對應的Bean內容注入、並生成物件的方法。 @Bean - 標示為Spring Bean實例化的factory method,當需要新實例 return type ,Spring 會call 此method @Qualifier @Required @Value ... 等 Context configuration annotations - 用annotation描述 application context @Profile @import ...等 Spring Web Annotations 這是關於org

ArgoCD - The first sight

圖片
ArgoCD 是一款open source的 gitOps工具,用git repositories 作為application 狀態的來源 for kubernetes deployment。並能經由track updates on branch, tags, etc 去觸發 CI/CD automation。 GitOps由名字去拆想去猜想,會是git 與ops (operation) GitOps是一種管理kubernetes cluster與持續交付application的一種方式。利用git 作為infrastructure與application設定來源,與 service agent持續監測是否有設定上的變更,而進行資源操作。 這裡以ArgoCD開源軟體為例,ArgoCD application controller負責跟kubernetes溝通、確認status並且查看是否符合git repo所描述的內容並作更動。 開發人員可以透過git repo的commit/merge來觸發 build, test. 維運人員可透過UI/CLI方式觀察狀態以及部署。 reference: https://argoproj.github.io/argo-cd/

Kubernetes - The First sight

圖片
Kubernetes (簡寫 k8s) 提供一個有彈性的分散式系統框架,處理failover, scaling, canary deployment 等。包含load balancing, storage, auto-rollouts and rollbacks, auto bin packing(裝箱最佳化,指硬體資源分配上), self-healing, secret and config management。 Kubernetes components (Control Plane, Node, Addons) 當deploy k8s, 就是一組cluster, 包含跑containerized application的worker machines 稱為nodes。Worker node掌控Pods (每個pods包含running containers),並藉由control plane 去管理。原則上prod environment 會跨多台電腦,單一cluster 跑在多個nodes上來達到HA(High Availability)跟fault-tolerance. Control Plane Components - 當有events被偵測到時,Control Plane 會針對 deployments的資訊去對cluster做動作,例如起new pod。操作的components有 kube-apiserver 則是操作Control Plane的介面 etcd 儲存cluster parameter data kube-scheduler 定觀察pods與node的狀態 kube-controller-manger - 在controller process中又分這幾種類型 Node controller  job controller  endpoint controller  service account & token controller cloud-controller-manager - 可讓cluster與cloud provider API與cloud平台做互動,可以互動類型如下 Node Controller 檢查cloud provider 上node的狀態 Route controller 基於cloud inf

OAuth 2 - The first sight

圖片
傳統client-server的服務架構,取得受保護資源通常需要向server提供username/password做Authentication。若server又要提供第三方資源給client, 則可以導入Authorization,進而給予不同程度的授權。 Authentication的安全性問題可以讓client預先設定redirection URI或者是讓resource owner確認client身份。 Client 可由  authorization_code  password  client_credentials  refresh_token 其中一中grant_type去取得 Access token 核發Access Token 會帶有以下內容  access_token  token_type e.g.: Bearer  expired_in 幾秒過期  scope 授權範圍  refresh_token refresh_token 可用來申請新的access token,於過期、權限不足...等狀況中使用。在換發新的access token 同時, 因安全考量server也必須將舊的refresh token撤銷。 reference: https://blog.yorkxin.org/posts/oauth2-1-introduction.html

JWT - The first sight

圖片
JWT 是JSON web Token的縮寫,format輕巧又易於跨domain間傳輸,適合restful API這種stateless原則。 JWT 是一個字串,透過.切分成三個 base 64編碼 Header: Token總類與演算法,include token type, hash algorithm, payload: 使用者相關資訊user information,可以設定expired time, 簽發token時間 Signature: 簽章calculate from header, payload and self generated key 驗證流程如下 Client 經由任何一種方式跟Auth Service做驗證 Auth service 回傳JWT token給Client Client 能用該JWT 去call 其他有授權給該token的service 加密的細節在於,Auth service會用自己的private key對user 傳來的header, payload做加密。因此即便使用者解開jwt token並修改payload內容,除了沒有auth service上的private key可以重新encrypt, 加密出來的結果不會ㄓvalidate。不過Token一但被竊取就會被盜用,因此需要搭配expired time來減少風險,並且使用情境減少與安全議題相關的授權操作。 reference: https://jwt.io/introduction

Domain Driven Design (DDD) - The first sight

以領域知識為核心建立的模型,領域專家與開發人員可藉由此模型進行交流,來確保交付的東西是公同,來確保最終設計出來的東西是共同想要達到的結果。 分為4個Layer User Interface (用戶接口、表示層) Application Layer(定義軟體完成的任務、流程) Domain Layer(模型層,表達業務概念、狀態) Infrastructure Layer(基礎設施提供以上通用功能) 層與層關係由上而下互叫,可以跨層,但不回由下往上呼叫。 而Domain Layer中的模型有三種型態 1. entity, e.g: POJO with identifier  2.  Value, e.g.: POJO without identifier 3. Service Java 中的Spring框架通常分為三層 1. Controller 2. Service 3. DAO 對應到DDD分層,User interface對應Controller,Application與Domain 對應 Service,而 Application service 與 Domain Service, Infrastructure 對應DAO

Makefile - The first sight

 在Linux系統中make command的功用,是在大型程式編譯時,自動判斷需要重新編譯的部分,最後執行編譯產生執行檔。實際的用途卻不會只侷限在編譯程式語言,在開發CICD流程中除了可以用makefile簡化shell script上的行數,利用其先決條件的語法架構來實現各個階段相依性。 每條makefile規則如下: target: prerequisites <tab> command target - 目標。 prerequisites - 先決條件,先做完該目標才會執行前面的target。command - 欲執行的shell script 為了防止target名稱跟文件名字一樣,可設定為phony target來跳脫檢查 e.g.: .PHONY: debug clean validate build package deploy 

Git Merge Strategies- The first sight

執行merge會把兩個分支上的改動合而為一,git 會用不同的方法去找到commit 改動的源頭,這方法為merge strategies。git merge, git pull 在沒特定用-s去指定合併策略,會自動選擇最適合的方式。 Recursive, pull or merge 預設的merge strategy, 處理兩個分支之間的合併。若在發現欲合併的兩個分支有衝突,則會出現conflict的版本差異,修正後再進行commit。 resolve, 用3-way merge algorithm 去做,遇到差異直接自動合併。會造成合併成功但程式 ,但程式邏輯是被污染。 ours,  不衝突的狀況下就用預設的合併模式,但有衝突則會將用自己的修改為主。 theirs, 與ours相反,在有衝突的狀況下,會是以來自其他branch修改內容為主 octopus, 與許多個branches一次合併。 subtree, 修正版本的3-way merge algorithm,會將其合併的兩個分支,其中一個分支為另一個的sub tree https://www.atlassian.com/git/tutorials/using-branches/merge-strategy

AWS Lambda CloudFormation - The first sight

用Cloudformation deploy AWS lambda function有兩種方式,AWS::Serverless::Function and AWS::Lambda::Function 名詞解釋:AWS Serverless Stack - A combination of AWS offered serverless technologies including API-Gateway, Lambda, S3, etc. 因為複雜性使得在寫以上這些服務的Cloudformation 有挑戰,例如config繁多以及service dependency。 AWS::Serverless::Function 的SAM (Serverless Application Model) syntax是基於Serverless framework - open source devops template 去簡化deploy API-Gateway 跟 Lambda這種的serverless服務。最簡單的例子就是可以在建立一個lambda function同時,也能夠在同一個Cloudformation resource section中把相對應的 Lambda execution IAM role也建立出來。 而AWS::Lambda::Function則是一般Cloudformation建立Lambda的寫法,需要自己關聯Lambda execution role、 打包package 到自己定義的s3 bucket存放artifact等,隨後在下指令去s3拉檔案deploy。 https://stackoverflow.com/questions/49953270/what-is-the-difference-between-a-serverless-function-and-a-lambda-function

Python HTTP requests - The first sight

Python http library requests 是個簡單直覺又普及的library,即便如此他也提供進階的use cases. hooks 可以預先自行調整,決定request處理的項目或事件。通常搭配callback function,例如回傳時印出url, 可以先建立一個 def print_url(r, *args, **kwargs):     print(r.url) Call 的時候放在hooks 這dictionary中,就會在request後,接著執行到print_url這個function >>> requests.get('https://httpbin.org/', hooks={'response': print_url}) 實際上hook的概念並非Python獨有,hook function 像是一個interface讓開發者去複寫,客製化自己要的操作。 timeouts 自定義timeout 時間來確保回應的時間是符合自己預期,但每次都自己加參數容易忘記。 requests.get('https://google.com/', timeout=0.001) Retry 可以利用 HTTPAdapter (request.adapters) 跟Retry (requests.packages.urllib3.util.retry) 去搭配,不僅可以定義max retry的次數,也能只針對return code以及method的型態來做失敗時的retry retry_strategy = Retry(     total=3,     status_forcelist=[429, 500, 502, 503, 504],     method_whitelist=["HEAD", "GET", "OPTIONS"] ) adapter = HTTPAdapter(max_retries=retry_strategy) http = requests.Session() http.mount("https://", adapter) response = http.get("htt

JAVA Unit Testing - The first sight

Java Unit Testing 藉由實作相同interface 並new出相同fake物件,並對其依賴做修改 (SUT, System under test) 藉由Unit Test 重構,把測試code拿來描述情境、描述scenario。 例如:只為了判斷是不是聖誕節,年份就不是那麼重要可以抽出來遮蔽掉。 重構的步驟 Extract and Override 找到dependency extract method private -> protected 以上是將 prod code 重構成能夠讓測試去注入method行為,以下是 Testing code Create SUT 子類別 Override protected Add setter 模擬值assign Test method 改測 SUT 子類 setter 模擬值

AWS web application architecture - the first sight

圖片
  ALB, NLB (都囊括在ELB中),從internet透過ELB是直接打入在VPC裡的instance in private subnet,用的是private link的方式去連接網卡。資料從內部打到外部才是走NAT Gateway經由public subnet 出去。資料進的部分是會透過NAT進到private subnet, 資料連到internet就直接從ELB出,不會經過NAT gateway。 ALB - Layer 7 load balancer NLB - Layer 4 load balancer

Network Security - The first sight

圖片
為什麼HTTPS相較於HTTP更為安全?使用者是如何與網路服務做加密的傳輸? 示意圖 主流瀏覽器會存著各家廠商Root CA的public key,所以會信任由Root CA簽發digital certificate的網站, Root CA的private key 不會離開Root CA。 所以瀏覽器本身自己就有那些Root CA的public key, 所以才能認證這些有授權的網站。

Service Deployment - The first sight

圖片
Deployment Strategy Service deploy 到production 有以下幾種常見的策略 Recreate 重建部署 - Version A 下線後 ,B才上線 Ramped (rolling-update, incremental) 滾動部署 - 一小部分一小部分的Version B 漸漸取代Version A Blue/Green 藍綠部署 - 先建立好version B環境,再從A切換流量到B,建新拆舊 Canary 金絲雀部署 - Version B只向少部分使用者開放,之後再全部導過去 A/B testing A/B 測試 - 在特定情況下的使用者導向 Version B, 在版本間分散流量。是Canary的概念延伸。 Shadow 影子部署 - 將Version A 的請求同時分派到剛釋出的Version B,來測試負載程度 原圖出處於 thenewstack.io ref: https://thenewstack.io/deployment-strategies/ https://blog.marsen.me/2018/01/07/2018/six_strategies_for_application_deployment/

Transaction - The first sight

 Database Transaction 大部分的RDB都支援 Transaction, 一連串的SQL script。如果其中一個失敗則整個Transaction退到一開始的狀態,如同開始前建立個check point,執行期間出錯則rollback 到check point。 Database Transaction 資料庫交易 例如轉帳,A、B各有100元在戶頭,A轉30元給B,則 A戶頭 -30 與 B戶頭 +30這兩個update SQL語法需要都執行成功才算一個完整的Transaction(交易) DBMS處理transaction 須具備ACID特性來保證交易的完整可靠 Atomicity - 原子性、不可分割,途中發生錯誤即返回原始狀態 Consistency -  一致性,開始與結束資料庫的完整性沒有被破壞(data integrity) Isolation - 隔離性,Database 允許同時間對相同row進行讀寫,隔離性可以防止concurrent 交叉執行導致數據不一的狀況 Durability  - 持久性,交易處理完,對數據的修改是永久的 Isolation level 有分以下四種,Read uncommitted, Read commuted, Repeatable Read, Serializable Read uncommitted - transaction 可以讀到別的transaction尚未commit 的資料(完全無保護) Read committed - transaction 可以讀到別的transaction已經commit 的資料,解決dirty read issue Repeatable Read - 每次transaction讀取特定欄位,只要query條件相同,讀取到的資料就相同。(解決Non-repeatable Reads issue) Serializable - Concurrent transaction 只要順序相同,得到的結果也會是相同。也就是執行T1後執行T2,無論另一個transaction是否對自己操作的資料有和更動,都得到一樣的結果。(解決Phantom Reads issue) 大多數concurrent read, write database 都會遇到transaction

管理者的養成之路,十年磨不成一劍,那就花二十年。

圖片
本篇書摘是 The Making of a Manager: What to Do When Everyone Looks to you 的中文版,「當上主管後,難道只能默默崩潰?Facebook產品設計副總打造和諧團隊的領導之路」 書摘內容以 黑體字 呈現個人的練習以及補充則以 灰色 字呈現 左:中文版/ 右:原版封面 https://www.books.com.tw/products/0010855700 https://www.books.com.tw/products/F014325856 身為管理者,就是要想辦法讓一群人合作,並得出更好的結果。 管理者每天處理的三大類: 目標就是why,反問為什麼工作很重要,確保團隊知道成功長的樣貌,並且想要做到。 人就是who,團隊裡面的人是否有具備成功的條件?是否有正確的技能?是否有想要成功? 流程就是how,安排每個人的職責,做好計畫讓事情迅速完成。 優秀的manager是後天培育出來,你得享受日常的管理工作。 當自己對管理有興趣時,好奇自己是不是一位好主管,可以問自己三個問題: 我是否比較喜歡達成特定成果或扮演特定角色?企業領導人第一要務是要讓團隊成功,願意視情況擔任不同角色,成為組織需要的領導人物。 我喜歡跟人講話嗎?七成的時間花在開會,並且是有質量的會議,有建設性意見交流的輸出與輸入 我是否能在充滿情緒挑的情況下依舊穩若泰山?管理跟人有百分百的關係,管理者會碰上不好開口的時刻,包含要對方走人或者是沒有做到職位上的期待,此時情緒管理需要表現得更鎮定並也能保持同理心關心與支持他人。 接下管理職不一定是對職涯發展更好,思考以下情境是否出現在職涯道路上 到了一定年紀,不轉管理職職涯沒有升遷機會 -> 管理職實質上是職務的轉換,並不是晉升 我想獲得主導權 ->在管理過程東達到最理想的工作成效,是來再有共同目標病蟲滿幹凈且行動力行動的人,而不是單傳指揮別人做事。 被問到要不要接管理職 -> 是真心想接,享受管理,而不是在道義上以「我應該」和「我做得到」為理由 當個優秀管理者前提,是做個有影響力的領導者。 接下管理職途徑主要有四種 學徒:團隊正在成長,主管需要你接下一起來分擔臉工作 開拓者:新團隊創始成員 新來的主管:空降帶領運轉一段時間的團隊 繼任者:上司決定離開而接下位置 帶領小型團隊 帶領團隊一切最終

以”喜劇開場“迎接下個十年舞台

圖片
在Netflix, youtube, Amazon Prime 等網路串流興起,改變以往的觀看戲劇的體驗。此劇目前在friDay影音在台灣地區有播出。 photo from https://www.ntv.co.jp/conpaji/ 「喜劇開場」故事描述成軍十年的喜劇演員團體,因為沒有任何起色而開始思考接下來的人生規劃。藉由有村架純飾演的女主角 - 一位在人生、工作、感情上受到一連串的挫折,在迷茫的打工生活中認識這喜劇團體,漸漸的找回前進的動力。 在工作即將邁入十年之際,隨著這部日劇於上周的完結,正好來與劇中的角色心境做點呼應。 回顧剛出社會設定的十年目標,鮮少有達成的項目。在有限時間的球賽裡,沒能贏得比賽並不代表過去所有過程都是無用。 目標跟環境變化息息相關,世界變動的太快,滾動式的修正目標,也未必是對人生目標猶疑不定。 即便社會愛用「過程比結果重要」來削弱結果與成功之間的連結,但最終還是會以什麼年紀該有什麼成就、該有怎樣的頭銜、該有怎樣的能力來評斷一個人。 一句話、一個貼心的舉動可以鼓勵人、給對方勇氣向前,無論是多麼微不足道或毫無關聯。若對方尋求協助,不要吝嗇給予對方任何正反向的建議。 人生會迷惘是正常的,在卡住的同時試著對重新檢視、設計人生,或許會有新的體悟,建議可從「Designing your life」這本書上的練習去探索人生新的可能。 如同靈魂急轉彎Soul提到的火花(Spark)一樣,熱情未必能跟職業相合,但還是能在不同環境中保持那個初心。 人生旅途中了解自己,分析自己的優勢劣勢並持續學習讓自己更好、也回饋給社會讓世界變得更好。在同個領域堅持了十年,已經是成功了。 *コント 的發音是來自comedy,小時候熟知的志村大爆笑也屬於這一類短劇 *Designing your life -  books.com.tw/products/0010733134

在公開場合演講、主持會議、聚會閒聊中"精準表達"

圖片
此書對我而言像是個工具書,提點自己在與人聊天、溝通、會議上能夠事先做練習並再精進的地方。 會議、演講聽得夠多,會發現大家慣用的pattern,例如聽到用英文演講的開頭幾乎都是 "It's my honor to be here..." 這種「我很榮幸受邀參加貴司的演講」似乎歷久不衰,但也略顯老套。 並不是每個人天生都是表達高手,現實世界中又是以外向性格來主宰世界,口語表達需要如健身一樣時常訓練,產生肌肉記憶。 引人入勝的開場、簡潔的開頭、提問題的方式引發聽眾對你接下來說的話產生好奇心。但濫用的下場,就跟現在台灣新聞標題、youtube的封面一樣,理智的人早已麻木不感到興奮,看不夠多的人則容易被煽動。 說個有畫面的故事,像是拍電影。溝通的高手宛如電影導演,在讀者心中彩繪出視覺效果。例如,用視覺形容美食「烘烤過程香氣四溢,一刀劃破金黃色酥脆雞皮,切下烤雞腿肉的瞬間,飽滿雞汁滲出,再一口送入嘴裡裏,完美享用烤雞的樂趣」來取代「好吃」、「真香」。 故事也能藉由有話面的講場景、人物、事件衝突去構築,常聽到以自身為例子去說服別人,買下產品。如:「我自己有有在用PC-Ciliin 跟趨勢科技防詐達人」 數據呈現可用兩種以上方法去強調,例如「年收成長1.8B 相當於一年成長15%,也就是獲利足夠買下一戶陶朱隱園」 長話短說,準備較長的版本以及可以縮小的版本。適時放慢速度與停頓,讓觀眾喘口氣,用練習戒掉焦慮和口頭禪。 溝通時臉部談話對象或觀眾會注視的地方,避免有揉鼻子、揉眼睛等不必要的動作。適時修眉毛 <- 眉毛在臉上很搶戲 XD 當個聽眾,展現好奇心並想問題提問,溝通是建立在多人間的互動上,而不是儒家傳統教育所遵循的聽師長、父母的話就不能有質疑。 書中最後三個章節分別針對即席演講、求職、生活中的情境提供練習的方向,提供讀者練習各種情境下能夠表達得宜。