作者 kfrico 的所有文章

GCP(Google Cloud Platform)筆記|心得

GCP

GCP SKD安裝

install gcloud
https://cloud.google.com/sdk/downloads

安裝

./install.sh

認證授權

gcloud init

設定區域

gcloud config set compute/zone asia-east1-a

建立叢集

gcloud container clusters create [CLUSTER-NAME]

查看叢集

gcloud container clusters list

設定叢集

gcloud container clusters get-credentials [CLUSTER-NAME]

建立永久磁區

gcloud compute disks create --size 200GB [disk name]

刪除永久磁區

gcloud compute disks delete [disk name]

手動建立容器

 

gcloud container builds submit --config cloudbuild.yaml .
gcloud container builds submit --tag gcr.io/[PROJECT_ID]/quickstart-image .

gcloud docker -- push images

 

GCP GIT

設定git 驗證方式

git config credential.helper gcloud.sh

建立專案

gcloud source repos create [REPO_NAME]

設定專案庫

git remoto add google https://xxx

有效地去 – Effective go 正體中文翻譯

簡介

Go 是一門新的程式語言。雖然它從現有的程式語言中借鏡了許多設計理念,但它也有許多與眾不同的特性。若你把用 C++ / Java 撰寫的程式改寫成等價的 Go 程式,恐怕難以得到令人滿意的結果。同樣地,用 Go 語言的角度來解決問題,你可能會寫出有效但不太一樣的程式。換句話說,想要寫出好的 Go 程式,對於 Go 語言特性及慣例的掌握是重要的一環。同時,對於社群慣例 (比如排版、命名方式、程式的建立等等) 也應該要適當的瞭解,這樣其他使用 Go 語言的開發者才容易理解你寫的程式。

這份文件列舉出一些訣竅,讓你寫出清楚、符合 Go 語言特性的程式。這是對於 Go 語言規格書導覽 Go 語言以及 如何撰寫 Go 程式 等三份文件的補充,所以你應該先讀過這三份文件。
繼續閱讀

GoLang Cookie

GoLang Cookie


Go 語言內 struct methods 該使用 pointer 或 value 傳值?

寫入或讀取

如果您需要對 Struct 內的成員進行修改,那請務必使用 Pointer 傳值,相反的,Go 會使用 Copy struct 方式來傳入,但是用此方式你就拿不到修改後的資料。

效能

假設 Struct 內部成員非常的多,請務必使用 Pointer 方式傳入,這樣省下的系統資源肯定比 Copy Value 的方式還來的多。

一致性

在開發團隊內,如果有人使用 Pointer 有人使用 Value 方式,這樣寫法不統一,造成維護效率非常低,所以官方建議,全部使用 Pointer 方式是最好的寫法。

參考網站


Function types

從golang的官方文檔得知function types的解釋是這樣的。

A function type denotes the set of all functions with the same parameter and result types.

先找個例子來看一下:

package main

import "fmt"

// Greeting function types
type Greeting func(name string) string

func say(g Greeting, n string) {
    fmt.Println(g(n))
}

func english(name string) string {
    return "Hello, " + name
}

func main() {
    say(english, "World")
}

輸出

Hello, World

say()函數要求傳入一個Greeting類型,因為english函數的參數和返回值跟Greeting一樣,參考接口的概念這裡可以做類型轉換。我們換個方式來實現上面的功能:

package main

import "fmt"

// Greeting function types
type Greeting func(name string) string

func (g Greeting) say(n string) {
    fmt.Println(g(n))
}

func english(name string) string {
    return "Hello, " + name
}

func main() {
    g := Greeting(english)
    g.say("World")
}

同樣輸出Hello, World,只是給Greeting類型添加了say()方法。上面說了,函數類型是表示所有包含相同參數和返回類型的函數集合。我們在一開始先把func(name string) string這樣的函數聲明成Greeting類型,接著我們通過Greeting(english)將english函數轉換成Greeting類型。通過這個轉換以後,我們就可以借由變量g調用Greeting類型的say()方法。兩段代碼的差異就是go的類型系統添加方法和類C++語言添加類型方法的差異

既然是函數集合,那麼只有一個函數顯然是不足以說明問題的。

package main

import "fmt"

// Greeting function types
type Greeting func(name string) string

func (g Greeting) say(n string) {
    fmt.Println(g(n))
}

func english(name string) string {
    return "Hello, " + name
}

func french(name string) string {
    return "Bonjour, " + name
}

func main() {
    g := Greeting(english)
    g.say("World")
    g = Greeting(french)
    g.say("World")
}

輸出

Hello, World
Bonjour, World

在其他語言裡面,有些函數可以直接作為參數傳遞,有些是以函數指針進行傳遞,但是都沒有辦法像go這樣可以給函數類型「增加」新方法。

回到Go: net/http的HandlerFunc類型,只要Martini的函數遵循文檔中type HandlerFunc func(ResponseWriter, *Request)的要求,就可以轉換成HandlerFunc類型,也就可以調用func (HandlerFunc)ServeHTTP函數。

參考網站


PHP empty, is_null, isset 判斷結果列表

empty判斷值在不在,isset判斷變數在不在,兩個不同屬性

表達式			GETTYPE()	EMPTY()		IS_NULL()	ISSET()	  	BOOLEAN : IF($X)
$x = "";		string		TRUE		FALSE		TRUE		FALSE
$x = null;		NULL		TRUE		TRUE		FALSE		FALSE
var $x;			NULL		TRUE		TRUE		FALSE		FALSE
$x is undefined	        NULL		TRUE		TRUE		FALSE		FALSE
$x = array();	        array		TRUE		FALSE		TRUE		FALSE
$x = false;		boolean		TRUE		FALSE		TRUE		FALSE
$x = true;		boolean		FALSE		FALSE		TRUE		TRUE
$x = 1;			integer		FALSE		FALSE		TRUE		TRUE
$x = 42;		integer		FALSE		FALSE		TRUE		TRUE
$x = 0;			integer		TRUE		FALSE		TRUE		FALSE
$x = -1;		integer		FALSE		FALSE		TRUE		TRUE
$x = "1";		string		FALSE		FALSE		TRUE		TRUE
$x = "0";		string		TRUE		FALSE		TRUE		FALSE
$x = "-1";		string		FALSE		FALSE		TRUE		TRUE
$x = "php";		string		FALSE		FALSE		TRUE		TRUE
$x = "true";	        string		FALSE		FALSE		TRUE		TRUE
$x = "false";	        string		FALSE		FALSE		TRUE		TRUE

參考連結

http://php.net/manual/zh/types.comparisons.php

Docker筆記

進入容器

docker exec -it sk2_mysql_1 bash
docker attach sk2_mysql_1 bash

查看私庫套件
http://docker.private.today/v2/_catalog

查看私庫套件Tag列表
http://docker.private.today/v2/scott/gusher/tags/list

讓容器在後台運行而不退出的方法

tail -f /dev/null
service nginx -g "daemon off;"

獲取容器/鏡像的元數據

docker inspect

產生image

docker build --no-cache --pull --force-rm -t ken/ubuntu:base -f ubuntubase.dockerfile .

存儲容器狀態到tar

docker export ubuntu > ubuntu.tar

容器tar 轉成 image

cat ubuntu.tar | docker import - ken/ubuntu

把現有的images推到私倉

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
docker tag [現有的IMAGE]:[TAG] [私倉名字]/[建立者]:[TAG]
docker push [私倉名字]/[建立者]:[TAG]

建立容器

docker create -t -i fedora bash

啟動已終止容器

docker start -ai fedora

映射IP(對外連線 本機:Docker容器內)

docker run -p 8080:80 -v \local\work:container\work ken\php

 

讓非root 使用者用docker

建立docker group

sudo groupadd docker

將連接的用戶$USER添加到docker組

sudo gpasswd -a $USER docker

執行更新group

newgrp docker

Mac 初體驗

必裝軟體

1.HomeBrew

套件管理軟體,類似ubuntu的apt-get

brew install bash-completion 自動補齊

2.CheatSheet

查閱快捷鍵的小幫手

3.Magnet

App視窗分邊的工具

4.iTerm2

好用的 terminal 支援快捷鍵Hide/Show

semantic history設定,下載iterm_open_with.sh

/usr/local/bin/iterm_open_with \5 \1 \2

5.AppCeaner

深度移除APP的工具

6.Sublime text

編輯器

7.更新PHP7

brew unlink php56

brew install php72

 

Git 常用指令整理

推回上一個點

git revert -m 1 eff349a7a4132fdbb5f45bbb0d1b72248ace29a1(merge的點) 會新增一個commit

連同檔案一起推回上一個點

git reset --head HEAD^1

回覆修改紀錄

git reset --soft HEAD^

–soft – 緩存區和工作目錄都不會被改變
–mixed – 默認選項。緩存區和你指定的提交同步,但工作目錄不受影響
–hard – 緩存區和工作目錄都同步到你指定的提交

取消追蹤檔案

git rm --cached xxxxxxxxxxxx

git stash pop 衝突解法

git reset 或 git git reset HEAD [files]

[參考] (http://stefaanlippens.net/resolve-git-unmerged-paths-after-stash-pop)

建立分支

git branch branch_name SHA

檢查Log

git log

輸入指令!帳號密碼只要打一次

git config --global credential.helper store

git 從那個點到那個點的差異or檔案名稱

git diff 93fd4171999e8682850ff5d1ca300c419fe3610e HEAD
git diff --name-only 93fd4171999e8682850ff5d1ca300c419fe3610e HEAD

更換git遠端名稱

git remote rename origin upstream

新增異動檔案暫存區

git add -u

Git Repository

mkdir ${PROJECT}.git

cd ${PROJECT}.git

git --bare init

然後在本機裡加入

git remote add origin file:///${PROJECT}.git

上傳更新本地位址

在${PROJECT}.git底下的hooks資料夾加入post-receive並寫入以下bash (檔案權限須改成755)

 #!/bin/bash

while read oldrev newrev refname
do
 if [ "$refname" == "refs/heads/master" ]; then
 break;
 fi
done

if [ "$refname" != "refs/heads/master" ]; then
 exit;
fi

branch=$(git rev-parse --symbolic --abbrev-ref $refname)

git --work-tree=要覆蓋的位址 checkout -f $branch

Debain 建立防火牆規則

查看有無建立iptables

sudo iptables -L

建立一個新檔案 iptables.firewall.rules

sudo vim /etc/iptables.firewall.rules 

內容如下

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

規則只開放 80(http), 443(https), SSH(22), ICMP 服務

啟用規則

sudo iptables-restore < /etc/iptables.firewall.rules

最後是確保每次重開機都會載入這規則

sudo vi /etc/network/if-pre-up.d/firewall

內容如下

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.firewall.rules

更改檔案權限

sudo chmod +x /etc/network/if-pre-up.d/firewall

linode官方教學: https://www.linode.com/docs/security/securing-your-server