0%

树莓派基础设置

树莓派修改键盘布局
1
sudo dpkg-reconfigure keyboard-configuration

选通用的101键PC键盘

在键盘layout选择中,选Other

然后在选项中,选English(US)

再选English(US, alternative international)

一直下一步,最后重启

1
sudo reboot
树莓派修改启动进入终端界面
1
2
3
4
5

sudo raspi-config

boot option ->console

阅读全文 »

1. mac编译transmission

  • 下载项目
1
2
3
4
git clone https://github.com/transmission/transmission Transmission
cd Transmission
git submodule update --init
Xcode project file (Transmission.xcodeproj) for building in Xcode.
  • 在 xcode中编译

    下图第一个是编译 mac 的应用程序, 第二个是可以编译 transmission-daemon 程序

1

阅读全文 »

函数的调用信息是程序中比较重要运行期信息, 在很多场合都会用到(比如调试或日志)。

Go 语言 runtime 包的 runtime.Caller / runtime.Callers / runtime.FuncForPC 等几个函数提供了获取函数调用者信息的方法.

这几个函数的文档链接:

runtime.Caller的用法(常用)

函数的签名如下:

1
func runtime.Caller(skip int) (pc uintptr, file string, line int, ok bool)

runtime.Caller 返回当前 goroutine 的栈上的函数调用信息. 主要有当前的pc 值和调用的文件和行号等信息. 若无法获得信息, 返回的 ok 值为 false.

阅读全文 »

1. 循环内goroutine使用闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
func main() {
s := []string{"a", "b", "c"}
for _, v := range s {
go func() {
fmt.Println(v)
}()
}

time.Sleep(time.Second)
}


// c c c

改进:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func main() {                
s := []string{"a", "b", "c"}
for _, v := range s {
go func(v string) {
fmt.Println(v)
}(v)
}
}
// a b c


func main() {
s := []string{"a", "b", "c"}
for _, v := range s {
vv := v
go func() {
fmt.Println(vv)
}()
}

time.Sleep(time.Second)
}
// a b c
阅读全文 »

什么是rebase

Rebase对于很多人来说是一个很抽象的概念,也因此它的学习门槛就在于如何了解这个抽象的概念。对于rebase 比较恰当的比喻应该是「移花接木」,简单来讲把你的分支接到别的分支上,稍后我们用几个图来示范merge与rebase 的差异。

了解rebase之前,我们必须了解什么是base。对Git的使用者而言,在分支中进行开发活动是稀松平常的事情,也因此在合并管理分支时,也就需要了解分支是在哪个时间点哪个提交点分出来的旁支,而长出旁支来的提交点,对于旁支来说就是base commit,也就是base。所以简单来说,rebase其实就是改变分支的base的功能。

下图是在merge的情况会产生的版本演进的示意图,可以看到在新的分支中所做的变更,在合并之后,一并成为一个新的提交(commit 6)。而commit 1就是New Branch的base。

1

阅读全文 »

下载release版本

https://github.com/OpenVPN/easy-rsa/releases

配置公钥基础设施变量

1
2
cp vars.example vars
vim vars

修改内容示例

1
2
3
4
5
6
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "BeiJing"
set_var EASYRSA_REQ_CITY "BeiJing"
set_var EASYRSA_REQ_ORG "Wise Innovation Inc."
set_var EASYRSA_REQ_EMAIL "user@mail.com"
set_var EASYRSA_REQ_OU "Wise Innovation"
阅读全文 »

linux 安装 ftp 服务

1 . 安装ftp

1
sudo apt-get install vsftpd
  1. 修改配置 sudo vi /etc/vsftpd.con
1
2
3
local_root=/home/ftpuser
write_enable=YES
anon_mkdir_write_enable=YES
  1. 添加ftp用户
1
2
3
mkdir /home/ftpuser
sudo useradd -d /root/workspace -M ftpuser
sudo passwd ftpuser
  1. 调整文件夹权限
1
2
chown ftpuser:ftpuser  /home/ftpuser/
sudo chmod a-w /home/ftpuser
  1. 修改pam.d/vsftpd
1
2
3
sudo vi /etc/pam.d/vsftpd
#auth required pam_shells.so //注释掉这一行
sudo service vsftpd restart
  1. 连接
1
2
3
ftp://207.246.80.69  //通过浏览器访问

mac 可以下载 filezilla 客户端进行连接
阅读全文 »

  1. golang 没有简单普遍的方式来检查channel是否已经关闭了
  2. 关闭已经关闭的channel会导致panic
  3. 发送值到已经关闭的channel会导致panic

一个channel 关闭的原则是不要从接收端关闭channel,也不要关闭有多个并发发送者的channel。【别人可能还写呢】

换句话说,如果sender(发送者)只是唯一的sender或者是channel最后一个活跃的sender,那么你应该在sender的goroutine关闭channel,从而通知receivers(接收者们)已经没有值可以读了。

阅读全文 »

1. happens-before

1.1 术语

happens-before是一个术语,并不仅仅是Go语言才有的。

简单的说,通常的定义如下:假设A和B表示一个多线程的程序执行的两个操作。如果A happens-before B,那么A操作对内存的影响 将对执行B的线程(且执行B之前)可见。

  1. 如果操作A和B在相同的线程中执行,并且A操作的声明在B之前,那么A happens-before B。
  2. happens-before关系都是可传递的:如果A happens-before B,同时B happens-before C,那么A happens-before C。当这些关系发生在不同的线程中,传递性将变得非常有用。
1
2
3
4
5
6
7
8
int A, B;
void foo()
{
// This store to A ...
A = 5;
// ... effectively becomes visible before the following loads. Duh!
B = A * A;
}
阅读全文 »

5. 数据管理

5.1 数据卷

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和重用
  • 数据卷 的修改会立马生效
  • 数据卷 的更新,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷

阅读全文 »