Golang 環境變量

https://www.cnblogs.com/baiyuxiong/p/4545014.html
https://www.itread01.com/articles/1490395087.html

package main
import "os"
import "fmt"

func main() {

os.Clearenv()

os.Setenv("FOO", "1")

fmt.Println("FOO:", os.Getenv("FOO"))

os.Unsetenv("FOO")

fmt.Println("FOO:", os.Getenv("FOO"))


os.Setenv("hello", "1")

os.Setenv("world", "2")

fmt.Println()

for _, e := range os.Environ() {

fmt.Println(e)

}

}


输出结果:

FOO: 1
FOO:

hello=1
world=2



可以看出,调用Unsetenv后FOO就没有值了。通过for range可以遍历Environ中所有的环境变量。

上述操作,包括Clearenv只会影响程序当前运行环境中的环境变量。并不会对程序外的系统环境变量产生影响。所以当這段代码运行结束时,系统的环境变量并不会发生改变。

Google 的 URL 相關參數


https://developers.google.com/custom-search/docs/xml_results?hl=en&csw=1

https://sites.google.com/site/tomihasa/google-language-codes

Google Maps嵌入參數:https://jax-work-archive.blogspot.com/2011/07/google-maps.html



 the tbm URL parameter appears to indicate the filter used. For example:

Applications: tbm=app
Blogs: tbm=blg
Books: tbm=bks
Discussions: tbm=dsc
Images: tbm=isch
News: tbm=nws
Patents: tbm=pts
Places: tbm=plcs
Recipes: tbm=rcp
Shopping: tbm=shop
Video: tbm=vid



gl
Description
Optional. The gl parameter value is a two-letter country code. For WebSearch results, the glparameter boosts search results whose country of origin matches the parameter value. See the Country Codes section for a list of valid values.
Specifying a gl parameter value in WebSearch requests should improve the relevance of results. This is particularly true for international customers and, even more specifically, for customers in English-speaking countries other than the United States.
Examples
This request boosts documents written in the United Kingdom in WebSearch results:
q=pizza&gl=uk


hl
Description
Optional. The hl parameter specifies the interface language (host language) of your user interface. To improve the performance and the quality of your search results, you are strongly encouraged to set this parameter explicitly.
See the Interface Languages section of Internationalizing Queries and Results Presentation for more information and Supported Interface Languages for a list of supported languages.
Examples
This request targets ads for wine in French. (Vin is the French term for wine.)
q=vin&ip=10.10.10.10&ad=w5&hl=fr




用 Golang 的 flag 套件 建置 CLI (Command line)


在 Windows 的環境,以下列程式碼為例:


在線上可以跑出一個預設結果

word: foo
numb: 42
fork: false
svar: bar
tail: []

然後對程式碼 Ctrl+S 存檔到本機後編譯,
在 Windows cmd 環境內,

C:\Users\User\go>main.exe -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []

C:\Users\User\go>main.exe -numb=30
word: foo
numb: 30
fork: false
svar: bar
tail: []


進一步詳閱
https://www.kancloud.cn/liupengjie/go/570085
終端讀取:
1. 從鍵盤 (控制台) 輸入 fmt
2. 命令行參數 os.Args
3. 命令行參數 flag


https://blog.rapid7.com/2016/08/04/build-a-simple-cli-tool-with-golang/



BadgerDB

https://github.com/dgraph-io/badger

Badger v1.0於2017年11月發布。

Badger is stable and is being used to serve data sets worth hundreds of terabytes. Badger supports concurrent ACID transactions with serializable snapshot isolation (SSI) guarantees. A Jepsen-style bank test runs nightly for 8h, with --race flag and ensures maintainance of transactional guarantees. Badger has also been tested to work with filesystem level anomalies, to ensure persistence and consistency.

BadgerDB 相當穩定,已經被用於數百TB的數據集。Badger 支持具有可序列化快照隔離(SSI)保證的並發 ACID 事務。 Jepsen風格的銀行測試每晚運行8小時,帶有--race標誌並確保維護交易保證。Badger 還經過測試,可以處理文件系統級異常,以確保持久性和一致性。




一个高性能的 LSM K/V store
https://colobu.com/2017/10/11/badger-a-performant-k-v-store/

这是 dgraph.io 开发的一款基于 log structured merge (LSM) tree 的 key-value 本地数据库, 使用 Go 开发。

事实上,市面上已经有一些知名的基于 LSM tree 的 k/v数据库, 比如 leveldb、goleveldb、rocksdb,既然已经有了一些优秀的开源的LSM tree的项目,为什么dgraph还要创建一个新的轮子呢?

答案是: 更好的性能。





Go语言高级编程 (Advanced Go Programming)

https://wiki.jikexueyuan.com/project/the-way-to-go/12.11.html

Gob 是 Go 自己的以二进制形式序列化和反序列化程序数据的格式;可以在 encoding 包中找到。这种格式的数据简称为 Gob (即 Go binary 的缩写)。

https://play.golang.org/p/x2msH84z2lZ




https://chai2010.cn/advanced-go-programming-book/
https://www.gitbook.com/book/chai2010/advanced-go-programming-book/

本书涵盖CGO、Go汇编语言、RPC实现、Web框架实现、分布式系统等高阶主题,针对Go语言有一定经验想深入了解Go语言各种高级用法的开发人员。对于刚学习Go语言的读者,建议先从《Go语言圣经》开始系统学习Go语言的基础知识。如果希望了解Go2的最新动向,可以参考《Go2编程指南》。





BoltDB

https://github.com/boltdb/bolt


BoltDB 為一個單機的 key-value 數據庫,模型異常簡單且漂亮,代碼簡潔,總共代碼 (除去測試代碼) 只有6K左右。

以 Golang 編程。

核心代碼大約只有 3000 行,便於學習。

對於想學習數據庫模型的同學,強烈推薦閱讀 BoltDB 源碼,理解 BoltDB 模型,閱讀其代碼,不只是學習,也是享受。



Bolt supports fully serializable ACID transactions.
BoltDB 支持完全可序列化的 ACID 事務。

ACID,是指資料庫管理系統(DBMS)在寫入或更新資料的過程中,為保證事務(transaction)是正確可靠的,所必須具備的四個特性:原子性(atomicity,或稱不可分割性)、一致性(consistency)、隔離性(isolation,又稱獨立性)、持久性(durability)。

在資料庫系統中,一個事務是指:由一系列資料庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原帳戶扣除金額,以及向目標帳戶添加金額,這兩個資料庫操作的總和,構成一個完整的邏輯過程,不可拆分。這個過程被稱為一個事務,具有 ACID 特性。

Atomicity(原子性):一個事務(transaction)中的所有操作,或者全部完成,或者全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。即,事務不可分割、不可約簡。

Consistency(一致性):在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設約束、觸發器、級聯回滾等。

Isolation(隔離性):資料庫允許多個並發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。

Durability(持久性):事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。



BoltDB 的優缺點
https://zhuanlan.zhihu.com/p/47214093

BoltDB 源碼相當清晰,沒有黑魔法,就是經典的B+Tree實現,在工程中非常可控,簡單可靠。

B+Tree 天然優勢,隨機查詢比 LSM tree (Log-structured merge-tree) 快。

BoltDB 為了規避 mmap 寫入性能下降的問題,只有在讀取的時候走 mmap,寫回是在 tx.go 的func (tx *Tx) Commit() error 然後跳到 tx.db.ops.writeAt。
原理可以搜索 unified buffer cache,用 mmap 寫大文件時需要留意此問題。

如果 內存 > 數據庫 && 讀 > 寫 && 穩定 > 性能,可以考慮選擇 BoltDB。



基于 Go 的 K/V 数据库 BoltDB 簡介與使用說明
https://godoc.org/github.com/boltdb/bolt
https://studygolang.com/articles/10433
http://www.opscoder.info/boltdb_intro.html
https://zhuanlan.zhihu.com/p/27444660
https://iter01.com/442959.html




用 Golang 搭建自己的區塊鏈


Bitcoin in Go: https://github.com/btcsuite/



Building Blockchain in Go.  使用 Golang 建構區塊鏈
https://jeiwan.cc/

Part 1: Basic Prototype 基本原型
https://jeiwan.cc/posts/building-blockchain-in-go-part-1/
https://annatarhe.github.io/2017/12/29/building-blockchain-in-go-part-1-basic-prototype.html
https://github.com/Jeiwan/blockchain_go/tree/part_1
完整程式碼的演示:https://play.golang.org/p/6zOWpS_Yna0

Part 2: Proof-of-Work 工作量證明
https://jeiwan.cc/posts/building-blockchain-in-go-part-2/
https://annatarhe.github.io/2017/12/30/building-blockchain-in-go-part-2-proof-of-work.html
https://github.com/Jeiwan/blockchain_go/tree/part_2
合併程式碼 (Ctrl+S 存檔到本機後編譯才能運作):https://play.golang.org/p/JFBU1hWQkhQ

Part 3: Persistence and CLI 持久化與命令行
https://jeiwan.cc/posts/building-blockchain-in-go-part-3/

在 func (cli *CLI) printChain() 中 加入更完整的區塊細節打印

Part 5: Addresses 地址
https://jeiwan.cc/posts/building-blockchain-in-go-part-5/
https://annatarhe.github.io/2018/01/02/building-blockchain-in-go-part-5-addresses.html
https://cordate.github.io/2018/03/28/blockchain/%E6%AF%94%E7%89%B9%E5%B8%81/Bitcoin%E4%B8%ADBase58Check/
https://github.com/Jeiwan/blockchain_go/tree/part_5
合併程式碼 (Ctrl+S 存檔到本機後編譯才能運作):https://play.golang.org/p/e4Ws_uN-Yrl

Part 6: Transactions 2 交易 2
https://jeiwan.cc/posts/building-blockchain-in-go-part-6/
https://annatarhe.github.io/2018/01/06/building-blockchain-in-go-part-6-transactions-2.html
https://github.com/Jeiwan/blockchain_go/tree/part_6
合併程式碼 (Ctrl+S 存檔到本機後編譯才能運作):https://play.golang.org/p/yEo5xdfDKvA

Part 7: Network 網絡
https://jeiwan.cc/posts/building-blockchain-in-go-part-7/
https://annatarhe.github.io/2018/01/12/building-blockchain-go-part-7-network.html
https://github.com/Jeiwan/blockchain_go/tree/part_7
合併程式碼,並添加了教程說明中所需要的環境變數 (Ctrl+S 存檔到本機後編譯才能運作):https://play.golang.org/p/rII18zokMTv

在 func main() 中加入 os.Setenv("NODE_ID", "3000")

最新版本:
https://github.com/Jeiwan/blockchain_go/tree/master
修正了比特幣存在多種版本的地址格式:https://21st.each1.net/2019/07/blog-post_7.html


從 Part 4 之後的範例,實測後發現 bugs,當同一個 address 自己轉給自己,查詢餘額時會發現餘額增加... 透過打印出完整的區塊細節,可以先找出一個 bug 發生的地方,然後可以再延伸出其他 bugs...

檢查後發現,這些 bugs 的起因是由於 returns a list of transactions containing unspent outputs 這個部分的函數,
當同一個地址自己轉給自己時,會在同一個 transaction 內生成兩個相同地址的 outputs (一個是轉帳的金額,一個是找零),
但是當後續的交易再引用上述 outputs 時,若只用到同一個 transaction 內的其中一個 output 時,該 transaction 仍然會被列在 list of transactions containing unspent outputs 內,然後後續的程式流程卻誤以為這個 transaction 內的所有 outputs 都是 unspent,因而導致了可用餘額憑空增加。

從代碼來看,就是從下面這個方法開始的邏輯流程發生錯誤
func (bc *Blockchain) FindUnspentTransactions(address string) []Transaction {
}

除錯後,總共修正了三個函數:
https://play.golang.org/p/YpFzoFvFLHK

整併為
https://play.golang.org/p/SA_55kFhOtq


Part 7 實測後發現許多 bugs,比如說相同節點的多筆帳戶互轉、同節點的多筆帳戶互轉相同金額,同一個地址轉給自己等等...

檢查後發現,
相同節點的多筆帳戶互轉、同一個地址轉給自己 的 bugs 是延續 Part4 的問題...

而其他問題比如說同一個地址轉帳給兩個帳戶,然後才一起挖掘時,會去引用同一筆輸出,導致雙花 (double spending) ...

綜合來看,是文中所提及還沒有完成的諸多工作,比如說應該驗證『區塊內的交易是否符合規則』。

以比特幣的做法來說,比特幣的雙重支付意味著一筆幣(UTXO)被花費了兩次。通常,這意味著A將她的0.413 BTC發送給了B,然後她又把同一筆比特幣又發送給了C。
比特幣的解決方法是,其中一筆交易會納入一個區塊,由此來決定實際誰得到了報酬。如果兩筆交易不知何故都傳遞到了多個區塊,那麼後面發生的區塊,就會被軟件給拒絕掉。如果兩筆交易都在同一個區塊當中,那麼這個區塊也會遭到軟件的拒絕。



Code your own blockchain in less than 200 lines of Go

所有教程的完整代碼
https://github.com/mycoralhealth/blockchain-tutorial

Part I 一個單機上的區塊鏈生成與展示
https://medium.com/@mycoralhealth/code-your-own-blockchain-in-less-than-200-lines-of-go-e296282bcffc

Part II 仍然需要主節點的分散式架構 (比較簡單的架構,但尚未達到完全去中心化)
https://medium.com/@mycoralhealth/part-2-networking-code-your-own-blockchain-in-less-than-200-lines-of-go-17fe1dad46e1

工作證明
Code your own blockchain mining algorithm in Go
https://medium.com/@mycoralhealth/code-your-own-blockchain-mining-algorithm-in-go-82c6a71aba1f

了解如何使用IPFS通過區塊鏈存儲數據

編寫區塊鏈 P2P 網路
Code a simple P2P blockchain in Go

英文原文:https://medium.com/@mycoralhealth/code-a-simple-p2p-blockchain-in-go-46662601f417

中文翻譯:https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/510718/

中文翻譯內的資源連結是失效的,需要到英文原文才能連結查看更多相關文件



p2p 協議概述:
https://blog.csdn.net/echoaiya/article/details/45887843

根据拓扑结构的关系可以将P2P研究分为四种形式:

中心化拓扑(Centralized Topology)、
全分布式非结构化拓扑(Decentralized Unstructured Topology)、
全分布式结构化拓扑(Decentralized Structured Topology, 也称为DHT网络)、
半分布式拓扑(Partially Decentralized Topology)。

(1)
中心化拓扑最大的优点是维护简单、发现效率高。缺点是与传统C/S结构类似,易造成单点故障。这是第一代P2P网络采用的结构模式,经典案例是著名的MP3共享软件Napster。

(2)
全分布非结构化网络在重叠网络采用了随机图的组织方式,结点度数服从“Power-law”规律,从而能够较快发现目的结点,面对网络的动态变化体现了较好的容错能力,因此具有较好的可用性。同时可以支持复杂查询,如带有规则表达式的多关键词查询,模糊查询等,最典型的案例是 Gnutella。

(因为此类网络采用了随机图、泛洪等机制,构建的系统没有固定的结构,故称为非结构化)
(随机图的“随机”二字体现在边的分布上。一个随机图实际上是将给定的顶点之间随机地连上边,参考网址:http://blog.csdn.net/foreverdengwei/article/details/7337429)

Gnutella 是一个P2P文件共享系统,它和 Napster 最大的区别在于 Gnutella 是纯粹的P2P系统,没有索引服务器,它采用了基于完全随机图的泛洪(Flooding)发现和随机转发(Random Walker)机制。为了控制搜索消息的传输,通过TTL(Time To Live)的减值来实现。详情参见 [Gnutella 协议]。

随着网络节点的不断增多,网络规模不断扩大,通过这种泛洪方式定位对等点的方法将造成网络流量急剧增加,从而导致网络中部分低带宽节点因网络资源过载而失效。所以在初期的Gnutella网络中,存在比较严重的分区、断链现象。也就是说,一个查询访问只能在网络的很小一部分进行,因此网络的可扩展性不好。所以,解决Gnutella网络的可扩展性对该网络的进一步发展至关重要。

(3)
全分布式结构化拓扑网络。目前研究的重点放在了如何有效地查找信息上,最新的成果都是基于DHT的分布式查找和路由算法。这些算法都避免了类似Napster的中央服务器,也不像Gnutella那样基于广播进行查找,而是通过分布式散列函数,将输入的关键字惟一映射到某个结点上,然后通过某些路由算法同该结点建立连接。

DHT类结构能够自适应结点的动态加入/退出,有着良好的可扩展性、鲁棒性、结点ID分配的均匀性和自组织能力。由于重叠网络采用了确定性拓扑结构,DHT可以提供精确的发现。只要目的节点存在于网站中,DHT总能发现它,发现的准确性得到了保证,最经典的案例是Tapestry,Chord,CAN和Pastry。

DHT类结构维护机制较为复杂,尤其是节点频繁加入/退出造成的网络波动会极大增加DHT的维护代价。

DHT仅支持精确关键词匹配查找,无法支持内容/语义等复杂查询。

(4)
半分布式结构吸取了中心化结构和全分布式非结构化拓扑的优点,选择性能较高(处理、存储、带宽等方面性能)的节点作为超级节点(SuperNodes, Hubs),在各个超级点上存储了系统中其他部分节点的信息,发现算法仅在超级节点之间转发,超级节点再将查询请求转发给适当的叶子节点。半分布式结构也是一个层次式结构,超级点之间构成一个高速转发层,超级点和所负责的普通节点构成若干层次。最典型的的案例是KaZaa。

半分布式结构的特点是性能、可扩展性较好;较容易管理,对超级节点依赖性大,易于受到攻击;容错性易受影响。

比较标准/拓扑结构
中心化拓扑
全分布式非结构化拓扑
全分布式结构化拓扑
半分布式拓扑
可扩展性
差
差
好
中
可靠性
差
好
好
中
可维护性
最好
最好
好
中
发现算法效率
最高
中
高
中
复杂查询
支持
支持
不支持
支持



https://murphymind.blogspot.com/2017/09/bitcoin.mechanics.html

在 Bitcoin 中,如何讓大家知道新的 transaction 發生了?

Bitcoin 採用的作法是 gossip process - 把消息通知自己知道的人,聽到的人再通知其他人,依此類推。

Bitcoin scripts

Bitcoin transaction 裡的 input "addresses" 及 output "addresses" 實際上是 scripts:

習慣上,input "addresses" 的 script 稱為 scriptSig,
output "addresses" 的 script 稱為 scriptPubKey。
因為在最簡單的情況下,output script 指定 public key,而 input script 指定 signature。

要驗證一筆 transaction 是否 valid,把 input script 及 output script 結合起來執行,如果沒有 error,就視為是一筆 valid transaction。





更多參考資料:

精通比特幣:http://book.8btc.com/master_bitcoin
精通比特幣第二版:http://book.8btc.com/masterbitcoin2cn
比特幣改進提案:https://en.bitcoin.it/wiki/Category:BIP
從原理解析,探討密碼學、橢圓曲線的原理,以及程式碼的撰寫:https://yhheho.gitbooks.io/bitcoin/
Block Chain Basic Knowledge: https://developpaper.com/block-chain-basic-knowledge/
指標與位址的教程:http://edisonshih.pixnet.net/blog/post/27961535

大數 big.NewInt(), .Lsh()  vs 一般數的 >>右移 <<左移 位運算符:https://play.golang.org/p/__ityUdxwlt

在 Go 裡面做大數運算:
https://studygolang.com/static/pkgdoc/pkg/math_big.htm
http://weijr-note.blogspot.com/2013/04/go.html
.Cmp 比较x和y的大小。x<y时返回-1;x>y时返回+1;否则返回0。

big.Int 是一个结构体(struct),相当于C++中的class,所以每次新建 big.Int 时可以用 x := new(big.Int), 返回一个指针。注意对 big.Int 的算术操作,要使用该對象的成員函數,比如說 Add()。

用 Golang 的 flag 套件 建置 CLI (Command line):https://21st.each1.net/2019/05/golang-flag-cli-command-line.html

bytes.Join 的用法:https://play.golang.org/p/sQOBBheA0Y5

Golang 的 Map:
https://www.cnblogs.com/igloo1986/p/3546337.html
https://blog.golang.org/go-maps-in-action

Golang: 合併 slice 的 append 方法
https://21st.each1.net/2019/06/golang-slice-append.html

Golang: base58 編碼 & 解碼
https://21st.each1.net/2019/06/golang-base58.html

使用 String() 方法來客製化字符串的輸出
https://21st.each1.net/2019/06/string.html

Golang 環境變量:https://21st.each1.net/2019/05/golang.html

時間格式處理:
https://www.jianshu.com/p/fe56edd8d30b
https://blog.csdn.net/skh2015java/article/details/70051512

google "源码分析 比特币"
google "源码分析 p2p"
google "源码分析 比特币 p2p"
google "源码分析 乙太坊 p2p"
google "源码分析 bt p2p"
google "p2p 协议"

利用go語言實現比特幣的一些中文教學
google 『比特幣 UTXO golang』
https://www.twblogs.net/a/5b80a1d42b71772165a8628c
https://shanma.pro/tutorial/57052.html

Why separate execution of unlocking and locking scripts (為什麼單獨執行解鎖和鎖定腳本):
https://bitcointalk.org/index.php?topic=5095376.msg49150302#msg49150302
https://github.com/bitcoinbook/bitcoinbook/blob/second_edition_print3_rc2/ch06.asciidoc#tx_script




Golang: sha256、base64編碼和解碼



https://play.golang.org/p/qV0bTJSPLXm

package main

import (
    "crypto/sha256"
    "fmt"
)

func main(){
    s := "測試字串"

    h := sha256.New()
    h.Write([]byte(s))
    bs := h.Sum(nil)

    fmt.Printf("origin: %s, sha256 hash: %x\n", s, bs)
}



https://play.golang.org/p/MtH80JUERdV

package main

import (
"encoding/base64"
"crypto/sha256"
"fmt"
)

func main() {

h := sha256.New()
h.Write([]byte(""))
b := h.Sum(nil)

s256, _ := fmt.Printf("%x", b)
fmt.Println(s256)

b64 := base64.StdEncoding.EncodeToString(b)
fmt.Println(b64)

decodeBytes, _ := base64.StdEncoding.DecodeString(b64)
s256d, _ := fmt.Printf("%x", decodeBytes)
fmt.Println(s256d)
}







價格彈性

美國總統川普於台灣時間 10 日上午 12 點 1 分正式將價值 2,000 億美元的中國進口品關稅從 10% 調高至 25%,一般來說,關稅將推升進口物價,恐傷害自家經濟,但據日媒指出,在美中貿易摩擦上,川普政府之所以敢無視上述理論、調高關稅,主要是因為美國有穩定的物價做後盾,強硬有理,貿易戰痛的恐將是中國。

因為穩定的物價強力支撐川普政府,使其有強硬的理由。根據日本經濟新聞的調查,美國列為制裁對象的中國進口品中,高達七成是缺乏獨特性、即便被課徵關稅也難於進行漲價的產品。從美中的物價來看更易於瞭解。2019 年 4 月美國消費者物價年增 2.0%,雖說因為原油走跌影響降低而略微揚升,但還低於第一波制裁關稅發動前(2018 年 6 月的 2.9%)水準。反觀中國的生產者物價波動劇烈。2018 年 6 月時還有 4.7%,但之後急轉直下,2019 年 4 月僅有 0.9%。

影響物價的因素很多,但似乎看不到「在美國的中國進口品售價因關稅而調升」的現象,倒不如說有可能是「中國企業調降出口價格」。以「價格彈性」(price elasticity)來看,彙整世界銀行和美國貿易代表署(USTR)的資料顯示,列為關稅對象的中國進口品中,約七成的價格彈性超過 1。價格彈性超過 1,代表若漲價容易引發需求減弱、被視為「不利於漲價」,而容易找到替代品的低附加價值產品的價格彈性就超過 1。

也就是說,貿易戰中,中國的立場處於弱勢。歐洲智庫 EconPol Europe 推估美國將關稅調高至 25% 的影響,相較於美國消費者物價揚升 4.5%、中國生產者物價將大跌 20.5%。也就是實際上,約八成負擔由中國企業承受,結果雖驚人,但和美中物價動向相吻合。

美國總統川普曾於 5 日透過 Twitter 指出,「支付給美國的關稅,對產品成本幾無影響,大都是由中國承擔」。

MySQL 允許外部連入

google "mysql 8 remote access"
google "mysql 8 remote access ssl"
google "gcp mysql 遠程連接"


MySQL 8 的新特性與解決方式
http://www.manongjc.com/article/13483.html

* 創建用戶與授權方式的改變
* 遠程連結強制加密
* 預設為 caching_sha2_password



Mysql 允許外部連入
https://contemplator.github.io/blog/2018/06/06/Mysql-%E5%85%81%E8%A8%B1%E5%A4%96%E9%83%A8%E9%80%A3%E5%85%A5/

* 修改 Mysql 設定檔 - /etc/mysql/mysql.conf.d/mysqld.cnf
註解原本的 bind-address

* 修改後需要重啟 mysql
$ sudo service mysql restart

* 開通防火牆
如果是 Google Cloud ,就是去開通防火牆端口,
如果是其他的 VPS ,則可能是參考如下: 
$ /sbin/iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT
eht0 是 網路卡名稱,比如說查出來的結果是 ens3
查詢的方式,在 VPS server 輸入以下指令
$ ifconfig

* 測試是否可以連到 mysql,先不論帳號密碼和權限
telnet <your-mysql-ip> 3306



程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...