Minimal and Clean blog theme for Hugo
解析pptx文件
Styled-Component
安装
npm install --save styled-components
创建样式组件
创建组件
import styled from 'styled-components'
const Button = styled.button``
一般的样式
const Button = styled.button`
background: transparent;
border-radius: 3px;
border: 2px solid palevioletred;
color: palevioletred;
margin: 0 1em;
padding: 0.25em 1em;
`
读取组件参数
const Button = styled.button`
background: transparent;
border-radius: 3px;
border: 2px solid palevioletred;
color: palevioletred;
margin: 0 1em;
padding: 0.25em 1em;
${props =>
props.primary &&
css`
background: palevioletred;
color: white;
`};
`
子选择器
…Head-First-Golang
goroutine
main函数就是在一个goroutine中运行的。如果在其中直接运行一个goroutine(a),那么a还没运行完main就运行完了,就会退出程序,所以a相当于没来得及运行。
想要main等内部的goroutine运行结束的话,需要channel。
…Goland
json转换为go的数据结构定义
- copy一段json结构的代码字符串。
- ctrl+v 时会有一个dialog提示
- 结构体中还有嵌入结构体时,可以用 ctrl + shift + alt + T 然后选择 intorduce type…把嵌入的结构体提取出来为一个独立的结构体。
- 可以改变json的名字格式,alt + enter 选择change field name style in tags 选择fieldName
- 还可以批量的修改tag的内容,alt + enter 选择 update key value in tags ,输入 ,omitemypty
html/template
默认的html/template文件扩展名是gohtml
https://blog.jetbrains.com/go/2018/12/14/go-templates-made-easy/
…Head-First-设计模式
第一章
开发中的不变真理——CHANGE
设计原则
- 找出应用中可能变化之处,把它们独立出来,不要和哪些不需要变化的代码混在一起。
这是几乎每个设计模式背后的精神所在。所有的模式都提供栏一套方法让“系统中的某部分改变不会影响到其他部分。”
结果如何?代码变化引起的不经意后果变少,系统变得更有弹性。
- 针对接口编程,而不是针对实现编程。
将鸭子的行为通过接口定义,同一行为的不同表现有不同的实现。这么一来,有了继承的“复用好处”,却没有继承所带来的包袱。
类之间的关系:IS-A, HAS-A, IMPLEMENTS,“有一个”比“是一个”更好。
- 多用组合,少用继承。
软件开发在完成后花费的时间更多,所以要致力于提高可维护性和扩展性。
定义
策略模式定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
继承(is a)–实线三角;实现–虚线三角;有一个–实现箭头;
要点
- 良好的OO设计必须具备可复用、可扩展、可维护三个特性。
继承的缺点
- 代码在多个子类中重复
- 运行时的行为不容易改变
- 很难知道所有子类的全部行为
- 改变会牵一发动全身,造成其他子类不想要的改变。
观察者
装饰器
工厂模式
单例模式
命令模式
设计原则
好莱坞原则
模板方法模式,父类属于高层组件,子类属于底层组件。父类是冲向类,其中有若干具体抽象方法,他们是算法的某部分的具体实现,由子类提供。父类还可以定义钩子,用于控制算法流程。
好莱坞原则是说,高层组件会去调用底层组件的方法,不要反向调用。
这样做的好处是避免环形依赖。解耦,其他代码只依赖高级组件,可以减少整个系统的依赖。
框架中比较多。框架提供模板,实现算法的步骤,细节交给使用者实现。
…PostgreSQL
允许被远程访问
在目录 /etc/postgresql/9.x/main 下
-
允许任意IP的连接请求 postgresql.conf 文件 去掉注释,并修改
listen_addresses = '*'
-
允许密码认证
pg_hba.conf 文件
# TYPE DATABASE USER CIDR-ADDRESS METHOD
host all all 0.0.0.0/0 md5
- 重启
sudo service postgresql restart
创建MergeRequest的CLI工具
使用了这几个库
- github.com/atotto/clipboard
- github.com/urfave/cli/v2
gg r
快速的往gitlab提一个 merge request 。
- bufio.NewReader 读取用户输入
- go exec 执行命令
- 读取当前git分支名算法
- 剪贴板操作
开发CLI工具
cli: https://github.com/urfave/cli/blob/master/docs/v2/manual.md
交互式: https://github.com/manifoldco/promptui
app := &cli.App{
Flags: []cli.Flag {
&cli.StringFlag{
Name: "lang",
Aliases: []string{"l"},
Value: "english",
Usage: "language for the greeting",
Destination: &language,
},
},
Action: func(c *cli.Context) error {
name := "someone"
if c.NArg() > 0 {
name = c.Args().Get(0)
}
if language == "spanish" {
fmt.Println("Hola", name)
} else {
fmt.Println("Hello", name)
}
return nil
},
}
这段代码里既有 arguments 又有 flag 。在使用命令时,要先输入 flag 后输入 arg
go run main.go -lang=spanish wangshushuo
flag 部分有多种用法可选:
- -lang=abc
- –lang=abc
- –lang abc
如果定义里 Aliase 还可以
- -l abc
环境变量
定义 EnvVars 可以用来读取环境变量
…Go Tips
取map的size
用 len() 函数
遍历map
for k, v := range m {
fmt.Printf("key[%s] value[%s]\n", k, v)
}
JSON转换
使用encoding/json
包的 Unmarshal 和 Marshal 方法,结构体要注明 json
package main
import (
"fmt"
"encoding/json"
)
type Data struct {
Votes *Votes `json:"votes"`
Count string `json:"count,omitempty"`
}
type Votes struct {
OptionA string `json:"option_A"`
}
func main() {
s := `{ "votes": { "option_A": "3" } }`
data := &Data{
Votes: &Votes{},
}
err := json.Unmarshal([]byte(s), data)
fmt.Println(err)
fmt.Println(data.Votes)
s2, _ := json.Marshal(data)
fmt.Println(string(s2))
data.Count = "2"
s3, _ := json.Marshal(data)
fmt.Println(string(s3))
}
指定interface{}的类型
var a interface{}
var b string
b = a.(string)
go run 失败
$ go run main.go
# command-line-arguments
.\main.go:4:2: undefined: a
.\main.go:5:2: undefined: average2
main.go 文件引用了 package main 中的另外两个文件中的函数。所以 run 命令应该是这样的
…