分类 其他技术 下的文章

安装

在Mac下安装前提条件,已经安装好了docker desktop,并修改了代理源 https://registry.docker-cn.com。
直接在docker桌面端开启k8s是没用的,一直提示 kubernetes is starting… :cry: 我竟然不知道,这样子持续了n天。​
自己手动安装 k8s

  • git clone https://github.com/maguowei/k8s-docker-for-mac.git

  • cd k8s-docker-for-mac/

  • ./load_images.sh

安装minikube

# install minikube
$ brew cask install minikube
$ brew install docker-machine-driver-xhyve
# docker-machine-driver-xhyve need root owner and uid
$ sudo chown root:wheel $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve
$ sudo chmod u+s $(brew --prefix)/opt/docker-machine-driver-xhyve/bin/docker-machine-driver-xhyve

最后启动minikube

# start minikube.
# http proxy is required in China
$ minikube start --docker-env HTTP_PROXY=http://proxy-ip:port --docker-env HTTPS_PROXY=http://proxy-ip:port --vm-driver=xhyve

依赖注入,控制反转 设计模式
目的:实现模块与项目的解耦
实现流程
首先模块有指针,其次DI拿到指针,再次DI将指针赋给调用者
共调研了三个框架:iris内置的di&mvc,uber-dig,google/wire
最终决定使用 wire
google DI 框架 wire
它通过使用代码生成构建容器来避免运行时反射。
用法:

// file main.go
package main
import "bytes"
type Logger struct{}
func (logger *Logger) Log(message string) {
    println(message)
}
type HttpClient struct {
    logger *Logger
}
func (client *HttpClient) Get(url string) string {
    client.logger.Log("Getting " + url)
    return "my response from " + url
}
func NewHttpClient(logger *Logger) *HttpClient {
    return &HttpClient{logger}
}
type ConcatService struct {
    logger *Logger
    client *HttpClient
}
func NewConcatService(logger *Logger, client *HttpClient) *ConcatService {
    return &ConcatService{logger, client}
}
func (service *ConcatService) GetAll(urls ...string) string {
    service.logger.Log("Runing GetAll")
    var result bytes.Buffer
    for _, url := range urls {
        result.WriteString(service.client.Get(url))
    }
    return result.String()
}
func main() {
    service := CreateConcatService()
    result := service.GetAll(
        "http://example.com",
        "https://drewolson.org",
    )
    println(result)
}
// file container.go
package main
import (
    "github.com/google/wire"
)
// CreateConcatService 设置 service 的依赖
// wire 生成 wire_gen.go 的 模板文件
func CreateConcatService() *ConcatService {
    panic(wire.Build(
        wire.NewSet(wire.Struct(new(Logger))), // struct 使用 wire.Struct 创建
        NewHttpClient,
        NewConcatService,
    ))
}
$ go get github.com/google/wire/cmd/wire
$ wire

执行 wire 解析 container.go ——> wire_gen.go
解析完毕后删除 container.go 文件, 使用 wire_gen.go 中的方法就行

编程语言选择参考
[TOC]

包和模块管理

  • 依赖包多版本管理
    • python 不能直接管理,需要利用 virtualenv来分割不同的环境
    • nodejs NPM 包管理,可以同时依赖不同版本的第三方模块
  • 引入模块
    • python 使用 from / import,不同模块同名不好区分
    • nodejs 模块引入的其他模块在本模块内都有局部有效的名字
  • 导出模块
    • python

    • nodejs 直接向 exports 中添加属性,或向 module.exports 赋值即可,非语言级别,而是普通操作

语言本身

  • 版本统一性
    • python 2,3不兼容
    • nodejs 版本兼容
  • 语法
    • python 的确比较精炼清晰,丰富的数据结构,各种运算符代替函数,有丰富的语法糖
    • nodejs 语言是 javascript,核心更为精简,数据结构和数据处理比较简陋。
  • 灵活性
    • javascript 基于 prototype 的继承灵活
    • nodejs 基于事件的处理使得处处是钩子和扩展点
  • 可hack性
    • python 不容易 hack
    • javascript 非常容易hack

性能

  • 都是解释性语言
    • python 无JIT
    • nodejs v8 可以 JIT 执行 javascript,性能要更好
  • 并发模型
    • python 需要多线程编程
    • nodejs 异步I/O读磁盘数据,做非CPU(计算)密集型应用高效

开发质量和效率

  • 都是解释性语言
    • 都无法再编译期进行各种检查
    • nodejs 有 javascript 语言的格式和语法检查器
    • 可以采用 coffee-script 开发 javascript,吸收了大量的 python 语法糖
    • build system
    • nodejs 有完整的build system(grunt/gulp)
    • nodejs web 开发资源的高于 python

学习成本

  • 解释型语言都不难

异步编程框架比较

  • javascript 的 nodejs 和 python 的 tornado 比较
角度 nodejs (javascript) tornado (python)
语言本身性能 v8引擎性能很好 python 解释器性能较差
IO性能 使用epoll等高效IO机制,性能好 使用epoll等高效IO机制,性能好
生态圈 nodejs各个版本和外围模块版本匹配好 python存在各种版本的兼容性问题, 也不易集成第三方模块
跨平台 nodejs在x86/arm/power/sparc都支持 python 由于大量使用c/c++模块,跨平台较差

其他类似点

方面 nodejs (javascript) tornado (python)
包管理器 npm pip
平台多版本管理器 n virtualenv
进程监控器 pm2 supervisor

mysql5.7 —>mysql8 的升级
MySQL8的加密方式有变化
命令行查看MySQL8 账户的加密方式

use mysql;
select user,plugin from user ;

在mysql8之前的版本使用的密码加密规则是mysql_native_password,但是在mysql8则是caching_sha2_password
Navicat不支持 caching_sha2_password 这种加密方式,所以升级后 Navicat 不能连接 MySQL8

Navicat 连接 mysql8 的解决方案有三:

方案一 重新创建一个账号,设此账号的加密方式为 mysql_native_password,使用这个账号

create user 'fanjinlong'@'%' identified with mysql_native_password by '333';
create user 'your username'@'%' identified with caching_sha2_password by 'your password';
ps. 此路不通,该账号无法创建 database 和 table

方案二 修改root 的密码加密方式,刷新

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; # 更改root 的加密方式
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';# 重置密码
FLUSH PRIVILEGES; #刷新数据库

方案三 更换MySQL8 客户端

关于 caching_sha2_password
MySQL提供了两个身份验证插件,可以为用户帐户密码实现SHA-256哈希:
sha256_password:实现基本的SHA-256身份验证。
caching_sha2_password:实现SHA-256身份验证(如sha256_password),但在服务器端使用缓存以获得更好的性能,并具有更广泛的适用性的附加功能。

在MySQL 8.0中,caching_sha2_password是默认的身份验证插件而不是 mysql_native_password。
要使用通过caching_sha2_password插件进行身份验证的帐户连接到服务器,您必须使用安全连接或支持使用RSA密钥对进行密码交换的未加密连接,如本节后面所述。无论哪种方式, caching_sha2_password插件都使用MySQL的加密功能。

首先你得明白程序设计中作用域这个概念:通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域

词法作用域 VS 动态作用域

词法作用域,也叫静态作用域,它的作用域是指在词法分析阶段就确定了,不会改变。动态作用域是在运行时根据程序的流程信息来动态确定的,而不是在写代码时进行静态确定的。
主要区别:词法作用域是在写代码或者定义时确定的,而动态作用域是在运行时确定的(this也是!)。词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用