打字學習

目標:高 WPM盲打

目標

  1. 精準
  2. 速度

工具

serverless-aws-handbook

整理 serverless 運用 AWS Provider 開發 Lambda

環境準備&介紹

  • AWS - Installation
    1. 安裝 Node.js
    2. 安裝 Serverless npm install -g serverless
    3. 設定 AWS credentials
  • AWS - Introduction
    • 協助開發、部署 Lambda
    • 管理 code, infrastructure by CloudFormation
    • 支援多種程式語言
    • 主要概念
      • functions: AWS Lambda function
      • events: 用來 trigger Lambda
      • resources: Lambda 所需的 infrastructure
      • services: project 單位
      • plugins
  • serverless.yml 可用的屬性

Quick Start

https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-using-debugging.html

Install

User Guide

Functions

  • handler 指向檔案及 module
  • function 預設繼承 provider 屬性或是自行指定
  • function 可用 array file 來分別管理
  • Permission
    • 利用 provider.iamRoleStatements 設定 IAM Role
    • 使用現有 IAM Role provider.role
  • Environment Variables
    • key-value paris
      • function, override provider
      • provider
  • Tags
    • key/value tags
      • function, override provider
      • provider

Variables

Credentials

  • serverless 需要能 access AWS resource 的權限,已進行操作管理
  • 註冊 AWS Account(廢話)
  • 建立 IAM user, access key,啟用 Programmatic access
    • Serverless Framework Dashboard,運用 AWS Access Roles 並使用 1 小時後就失效的 access key
    • 無腦方式直接賦予 IAM user AdministratorAccess 權限
    • 最小權限化可參考 gist
  • 使用 access key
    • export AWS_ACCESS_KEY_ID, export AWS_SECRET_ACCESS_KEY
    • AWS Profiles
      • serverless config credentials
      • aws-cli aws configure 會以 INI 格式儲存在 ~/.aws/credentials

IAM

Serverless 會自動建立 所有 function 共用的 IAM Role,可自行修改或建立 function 獨立用的 IAM Role

The Default IAM Role

  • create, write CloudWatch logs
  • VPC 有設定時,就能跟 VPC 內的 resource 都通
  • 所有 service 共用的 role 設定在 provider.iamRoleStatementsprovider.iamManagedPolicies
  • 可用運 CloudFormation 語法

Custom IAM Roles

  • provider 定義的 iamRoleStatements 不再使用
  • 自定義的 role 可用用在 provider 或個別 function
    • function 沒定義 role 時,會使用 provider.role
    • function 有定義 role 時,會覆寫 provider.role
    • 每個 function 都有指定 role 時,預設的 role, policy 將不會產生

Deploy

Deploy All

update function by serverless.yml, translate syntax to CloudFormation

  • 建立 CloudFormation template
  • 建立 S3 Bucket, 預設 AES256 encryption
  • function code package to zip files
  • 比對檔案 hash, 有不同才會進行 deploy
  • zip file 上傳到 S3 Bucket
  • 建立 CloudFormation 所需 resources
  • 更新 CloudFormation stack
  • 發布新版的 function

Deploy Function

因不仰賴 CloudFormation,較為快速

  • package function into zip file
  • 比對檔案 hash, 有不同才會進行 deploy
  • zip file 上傳到 CloudFormation stack 指定的 S3 Bucket

AWS Events

Schedule

SNS

  • lambda 會在訊息傳到 topic 後呼叫
  • 可在不同 function 使用相同 topic
  • 用 ARN 指定現有 topic,可運用 CloudFormation function 組合
  • topic 在 serverless.yml 中時,要用 Fn::Ref!Ref 取得 ARN

DynamoDB Streams

  • table 資料新增、修改時,觸發 lambda
  • stream 僅會掛上已存在的 stream,serverless 不會新增新的 stream
  • 設定
    • batchSize
    • startingPosition
    • batchWindow
    • maximumRetryAttempts
    • parallelizationFactor
    • enable

CLI

Create

nodejs, python, python3, java

Templates

Reference

SSH 不帶入本機語系設定

最近遇到機器重啟後,email 發送亂碼的問題

經查詢後發現是因為該機器是 zh_TW.big5 語系,有人本機設定語系為 zh_TW.UTF-8,使用 sudo s- 進入後重啟所導致

以下方法可以不把本機語系傳到遠端

1
vi /etc/ssh/ssh_config

註解以下設定

SendEnv LANG LC_*

測試流程: 設定本機語系後,ssh 至 remote,再看看語系設定

1
2
3
4
# 設定本機語系
LANG="en_IN.utf8" && export LANG
LANG="zh_TW.big5" && export LANG
LANG="zh_TW.UTF-8" && export LANG
1
2
locale # 目前語系設定
locale -a # 列出支援的語系

參考資料

Git 手冊

設定

指令設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
git config --list # git config -l

# account
git config --global user.name "[name]"
git config --global user.email "[email address]"

# push
git config --global push.default simple

# core
git config --global editor vim
git config --global ignoreCase false

# color
git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto
git config --global color.log auto

# alias
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.aa add --all
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cblueby %an %Cgreen(%cr)%Creset'"
git config --global alias.lg "log --graph --pretty=format:'%C(reverse ul cyan)%h%Creset -%C(yellow)%d%Creset %C(ul)%s%Creset %C(dim white)<%an>%Creset %Cgreen(%cr)%Creset %ci'"

編輯 ~/.gitconfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[user]
name = your_user_name
email = account@domain.com
[core]
editor = vim
ignorecase = false
[push]
default = simple
[color]
diff = auto
status = auto
branch = auto
log = auto
[alias]
co = checkout
br = branch
aa = add --all
ci = commit
st = status
lg = log --graph --pretty=format:'%C(reverse ul cyan)%h%Creset -%C(yellow)%d%Creset %C(ul)%s%Creset %C(dim white)<%an>%Creset %Cgreen(%cr)%Creset %ci'

基本使用

  • .gitignore 忽略不需要的檔案
  • .gitkeep 保留空資料夾
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
git init
git status
git status -s

git add <pathspec>... # 新增特定檔案 to staging: file name, *.extension, folde name
git add . # 新增所有檔案 to staging
git commit -m '[commit messgae]'
git commit -am '[commit messgae]' # 自動 stage 被修改, 刪除的檔案
git commit --amend # 修改最後一次的 commit
git commit --amend -m '[commit messgae]' # modify last commit
git rm <file>...
git rm --cached <file>... # 刪除檔案
git rm --cached -r . # 所有 staging 檔案 to untracked
git mv <file_name_old> <file_name_new> # 重新命名檔案
git mv file_from file_to # git mv <options>... <args>...
git checkout master <file_name> # 從 master 取回檔案

git diff
git diff --staged # git diff --cached

# 提交空目錄
mkdir img
cd img
touch .gitkeep

# 清除 untrack file or folder
git clean -f
git clean -df

# 查看 log
git show 9083cdc # git show <object>...
git blame wtf.html # git blame index.html
git log
git log --graph --oneline
git log --stat
git log --pretty=oneline
git log -p README.md
git log -p -2
git log --pretty=format:"%h %s" --graph
git log --since=2.weeks
git log -Sfunction_name # git log -S<string> -G<regex>
git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-11-01" --no-merges
git reflog # 所有的 local 歷史紀錄,遠端不會有,存放在 ~/.git/logs/refs/
git log -g # reflog 詳細版

git reset HEAD README.md # Unstageing
git checkout -- README.md # Unmodofying, 修改紀錄會消失!!!!!

git clone <GIT URL>
git remote -v
git remote add pb <GIT URL>
git fetch pb # git fetch <remote>
git remote show origin
git remote rename pb paul
git remote remove paul

Git Branching

  • 特性:輕量化、快速切換、鼓勵多合併(commit 圖解請參閱 Git Branching)
  • 預設分支:master
  • 目前分支的指標: HEAD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
git branch -l
git branch -r
git branch -v
git branch -vv

# 建立分支
git branch <newbranchname>
git checkout -b <newbranchname> # 等同 git branch <newbranchname> && git checkout <newbranchname>
# 建立分支 - 針對節點
git branch <newbranchname> <object>
git checkout -b <newbranchname> <object>

# 切換分支
git branch <branchname>
git checkout <branchname>

# 合併分支
git merge <branchname>

# 刪除分支
git branch -d <branchname> # --delete
git branch -D <branchname> # 強制刪除 --delete --force

git branch --merged
git branch --no-merged
git branch --no-merged master

# remote
git ls-remote [remote]
git remote show [remote]
git fetch <remote>
git remote add
git push <remote> <branch>
# tracking
git checkout -b <branch> <remote>/<branch> # or git checkout serverfix
git branch -u origin/serverfix

# pulling
git pull # git fetch && git merge

## delete remote branch
git push origin --delete serverfix

Rebase

不要 rebase 其他人正在進行的 branch

1
2
3
4
git checkout <branchname>
git rebase master
git rebase <basebranch> <topicbranch>
git pull --rebase

Git Branching - Remote

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# push
git push origin serverfix
git fetch origin
git checkout -b serverfix origin/serverfix

# track
git checkout --track origin/serverfix
git checkout serverfix
git checkout -b sf origin/serverfix
git branch -vv
git fetch --all; git branch -vv

# pull
git pull

# delete
git push origin --delete serverfix

# create empty branch
git checkout --orphan empty-branch
git rm -rf .
git commit --allow-empty -m "root commit"
git push origin empty-branch

Git on the Server

Hosting

1
2
3
4
5
6
7
8
9
10
# remote 操作
git clone git@github.com:[username]/[repo].git
git push -u
git remote add [name] git@github.com:[username]/[repo].git

git remote
git remote -v
git remote show origin
git pull [name]
git remote rm [name]

產生 SSH Public Key

  • ssh-keygen: Linux/macOS 內建、Git for Windows
    • passphrase: 使用 key 時需要密碼就填入(ssh-keygen -o 可防暴力密碼破解),不需要留空即可
  • id_rsa or id_dsa: private key
  • id_rsa.pub or id_dsa.pub: public key
  • public key 新增至 Github
1
2
3
4
5
6
cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "[email address]"
cat id_rsa.pub

# 測試 Github public key
ssh -T git@github.com

疑難雜症

1
2
# git help <verb>
git help config

修改歷史紀錄

1
2
3
4
5
git rebase -i <earliercommit>
git commit --amend --author="Author Name <email@address.com>"
git commit --amend -m="message"
git rebase --continue
git push -f

https://stackoverflow.com/questions/3042437/how-to-change-the-commit-author-for-one-specific-commit

參考資源

React 手冊

Component 展開多個 Object

1
<component {...{ ...objA, ...objB }} />

Higher-Order Components(HOC)

Render Props

Context

工具

TODO

Hexo - 靜態網頁框架

安裝需求: Git, Node

1
2
3
4
5
# 安裝 Hexo
npm install -g hexo-cli

# 佈署
npm install hexo-deployer-git --save

目錄及檔案

配置

  • _config.yml: 設定檔
  • scaffolds: 樣板
  • source: 文章
    • _draft: 草稿
    • _post: 文章
  • themes: 主題

文章

  • 設定檔 new_post_name 改為 :year-:month-:day-:title.md 比教方便管理
  • layout: post, page, draft,另外可以在 scaffolds 目錄新增樣板,讓風格一致
  • Front-matter
    • 分類和標籤只有 post 可以使用
  • 標籤外掛(Tag Plugins): 可插入特定內容,如:jsFiddle, Gist 等等
1
2
3
4
5
6
7
8
hexo new [layout] <title>
hexo new [layout] <title> <scaffolds>

# 發布草稿: 從 source/_drafts 移動到 source/_posts
hexo publish [layout] <title>

# 查看整文章的數量: page, post, route, tag, category
hexo list <type>

佈署

Git

將產生在 .deploy_git 目錄下的檔案 force push 到設定檔指定的 repo

1
2
3
4
5
deploy:
type: git
repo: git@github.com:vincentliu99999/vincentliu99999.github.io.git
branch: master
message: "Site updated: {{ now('YYYY-MM-DD HH:mm:ss') }}"

佈景主題

ICARUS

設定檔: theme/icarus/_config.yml

  • favicon
  • rss
  • logo
  • navbar
  • footer
  • article.highlight
  • article.thumbnail
  • comment
  • widgets
    • toc

指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 初始化
hexo init <folder>
cd <folder>
npm install

# 產生文章
hexo new 文章標題

# 產生靜態檔案
hexo generate

# 啟動伺服器 預設是 http://localhost:4000/
hexo server # hexo s
hexo s --draft # 包含草稿

# publish
hexo clean # 清除快取 db.json, /public/*
hexo generate # hexo g
hexo depoly # hexo d

# 產生檔案加佈署(任一指定即可)
hexo generate --deploy # hexo g -d
hexo deploy --generate # hexo d -g

DynamoDB 資料匯出工具

由於 DynamoDB 僅提供匯出 CSV 的選項,但是編輯的時候只能用 JSON…
剛好找到了 export-dynamodb

可匯出格式: CSV, JSON

1
2
3
4
5
6
7
8
# 安裝
pip install export-dynamodb
# 未指定 output file name, 就會用 table name
export-dynamodb -t TABLE_NAME -f csv
export-dynamodb -t TABLE_NAME -f json

export-dynamodb -t TABLE_NAME -f csv -o output.csv
export-dynamodb -t TABLE_NAME -f json -o output.json
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×