HomeBrew 安装特定版本的 Formula

在 Mac 上 brew 作为常用的包管理软件,一直被我使用。

一般来说,使用 brew 都会安装最新版本的软件,有时候需要安装特定版本的软件的时候,我都会考虑使用 Docker 实现。

不过也有偷懒的时候,brew 也确实是方便,所以考虑一下怎么使用 brew 安装特定版本、本机安装多版本的 Formula

brew 安装 Formula 简单原理介绍

1
2
3
4
5
6
$ brew tap-info homebrew/core 

output :
homebrew/core: 3 commands, 6162 formulae
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core (6,606 files, 643.2MB)
From: https://github.com/Homebrew/homebrew-core

可以看到,整个就是一个 github repo

具体的每个 formula 在目录 https://github.com/Homebrew/homebrew-core/tree/master/Formula

如果软件作者希望 formula 被添加或者被更新,都给这个 repo 提 PR 即可

1
2
3
4
$ brew install grafana 

会读文件
https://github.com/Homebrew/homebrew-core/blob/master/Formula/grafana.rb

安装 grafana 会依赖本地的 grafana.rb 文件,根据文件内容下载 url 的压缩包,然后校验 sha256

Year 2022 展望

已然是 2022 年了,还会不经意的感觉还停留在 2021 年,时间如此飞逝,年复一年。

小时候我们会说,长大了,现在我们只能是变老了。

事实是正值壮年。

需要正视各种变迁、各种文化,正视时代贩卖的焦虑,正视对码农特有的关注,且还年轻着。

回顾 2021

最近折腾的软件

折腾不止

尝试于公司配置的新电脑,希望使用一些新的软件,改变一下工作方式

Notion

十年 Evernote 老用户,想换种不一样的笔记思路,尝试使用 Notion https://www.notion.so/

刚开始打开很懵,功能很多,这是笔记软件么?

目前摸索使用中,很强大。

鼠须管

网上被吹了很久的输入法,褒贬不一,一大亮点是隐私,尝试使用 https://rime.im/

Mac 建议直接往上找别人现成的配置,容易上手,否则极易劝退。

目前各种不适中,打字效率减低 50%,准备在调教一个月。

Raycast

快速启动,用于代替 Alfred - 虽然我是付费用户(有些高级特性用不大到),看看免费版的是否满足需求。

https://raycast.com/

Bitwarden

Lastpass 之前修改了平台使用方案,桌面端和移动端不能同时使用了,本身使用体验上不很好,尤其是 IOS 。

看了很久的 bitwarden ,一个亮点是可以自己 Docker 搭建,但是我还是觉得直接使用在线的 Server 服务。

目前使用体验好于 Lastpass

https://bitwarden.com/

Safari

Chrome 的使用体验还是很好的 - 最近更新的很多新特性很适用,就是占内存,费电。

希望使用更原始的浏览器,看看体验如何 + 极其必要的插件。

是两者并用状态,并不会完全取代

腾讯柠檬清理

用于替代 CleanMyMac ,https://cleanmymac.com/

虽然我也是付费用户。

就想看一下,是否满足日常需求,毕竟其实我打开次数不多 - Alfred 是日常使用软件

https://lemon.qq.com/

Foxmail

https://www.foxmail.com/

一款曾经在 Win 上必备的软件,当初切换到 Mac 之后,发现 mac 版很久没迭代了,就放弃了。

Max 上也试了一些邮件管理软件,并没有特别中意的。

我看最近又有更新,就再用用吧

以上

一些小尝试

Go Modules 历史变迁

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

两种包管理运行模式

  • GOPATH mode,从 vendorGOPATH 下寻找依赖,依赖会被下载至 GOPATH/src 目录下
  • module-aware mode

Go 1.11 – 2018.8

正式推出 go modules ,可以查看 go help modules 获取相关信息

GO111MODULE

新增的环境变量,用于控制 Go 代码包管理运行模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
For more fine-grained control, the module support in Go 1.11 respects
a temporary environment variable, GO111MODULE, which can be set to one
of three string values: off, on, or auto (the default).
If GO111MODULE=off, then the go command never uses the
new module support. Instead it looks in vendor directories and GOPATH
to find dependencies; we now refer to this as "GOPATH mode."
If GO111MODULE=on, then the go command requires the use of modules,
never consulting GOPATH. We refer to this as the command being
module-aware or running in "module-aware mode".
If GO111MODULE=auto or is unset, then the go command enables or
disables module support based on the current directory.
Module support is enabled only when the current directory is outside
GOPATH/src and itself contains a go.mod file or is below a directory
containing a go.mod file.

In module-aware mode, GOPATH no longer defines the meaning of imports
during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod)
and installed commands (in GOPATH/bin, unless GOBIN is set).
  • GO111MODULE = auto,默认值(设置为 auto 或者不设置)
    • 在 GOPATH/src 目录外,且文件夹包含 go.mod 文件,就运行 module-aware mode,其余情况都是 GOPATH mode
  • GO111MODULE = on,开启
    • 不管目录所在路径,都是 module-aware mode
    • 运行 go build 等命令,会优先判断 go.mod 是否存在,不存在的话,先创建 go.mod 文件
  • GO111MODULE = off,关闭
    • 任何情况下,都关闭

包下载路径

  • module-aware mode 在 GOPATH/pkg/mod 目录下
  • GOPATH mode 在 GOPATH/src 目录下

Go Get

运行在不同 mode 下,行为不同

  • module-aware mode 会修改 go.mod 文件
  • GOPATH mode ,按照之前的行为运行

Go Get 存在的问题

如果 GO111MODULE = on ,且当前目录没有 go.mod 文件,会报错 go: cannot find main module; see 'go help modules'

vendor 目录支持

运行 go mod vendor ,会在当前目录生成 vendor 目录,从 GOPATH/pkg/mod 复制 packge 过来

运行命令类似,go build -mod=vendor 加上 -mod=vendor,会使用 vendor 目录下依赖,否则还是使用 GOPATH/pkg/mod 下依赖

GOPROXY

新增 GOPROXY 环境变量,用于设置 go module 下载代理地址

My New Article In 2020

许久未更新了。
生疏到 markdown 语法都已经忘记了。
眼看 2020 就要过去了。
还是需要练练手。
就当是为了 2021 可以相对持续的更新吧。
生活还在继续。
只是中年,庸人自扰。
望一切都好。

Go 阅读 negroni 源码

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

negroni 提供 golang 常用的中间件使用方式,项目地址 https://github.com/urfave/negroni/

阅读版本是 2019.6.2 的 7d1c5e commit

GoDoc - https://godoc.org/github.com/urfave/negroni

前提知识

了解 net/http server 的相关知识,也可以读我写的上一篇 【http-server】

基本使用

1
2
3
4
5
6
7
8
9
10
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Welcome to the home page! "+req.URL.Path)
})

n := negroni.New()
n.Use(negroni.NewLogger())

n.UseHandler(mux)
n.Run(":3000")

其中关于 mux 变量的部分,可以参考上一遍 http-server,这里就不说明了,主要关注 n := negroni.New()

Go HTTP Server 使用分析

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

使用 net/http 包处理 http request

GoDoc - https://godoc.org/net/http

net/http 主要包括两部分

  • client
  • server

这里就是关于 server 部分

Tip: go version go1.12.4 darwin/amd64

Handler interface

查看 http.ListenAndServe 定义

1
2
3
4
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}

会发现第二个参数是 Handler 类型

1
2
3
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}

Handler 是一个接口定义,只要实现了 ServeHTTP(ResponseWriter, *Request) 方法的类型,都可以

Go - var & make & new 在复杂类型上的使用区别

Go 分类文章,学习笔记,会不定时修改,补充,纠错,增加内容,路漫漫。

这里主要讲解 var & make & new 在声明变量关于 array、slice、map、struct 这些类型上的区别。

预备知识

var 声明变量

var 变量名字 类型 = 表达式 ,如果省略了表达式,就使用类型的零值初始化变量

make 和 new 的知识

可以查看 GoDoc - builtin 的相关内容

  • new
    • func new(Type) *Type
    • 创建一个 Type 类型的匿名变量,初始为 Type 类型的零值,返回变量地址,返回的指针类型为*Type
  • make
    • func make(t Type, size ...IntegerType) Type
    • 分配并初始化一个类型为 slice 、map 、或 channel 的对象,返回类型与 Type 相同,而非指向它的指针

零值

  • array、struct,每个元素或字段都是对应该类型的零值
  • slice、map,对于零值 nil

排序算法

Algorithms 分类文章,为了在下次又忘记又想想起来的时候,稍微快速的回想一下。

排序方法很多,仔细想想还是快排最实用
冒泡排序、选择排序、桶排序、快速排序、归并排序、堆排序