Levon's Blog

微信: L6241425

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(接收者们)已经没有值可以读了。

阅读全文 »

Happens-before 是一个内存模型中的核心概念,它定义了在并发程序中,一个操作(如写入变量)的结果保证对另一个操作(如读取该变量)可见的规则。

它不是关于“真实物理时间”的先后,而是一种关于内存操作顺序和可见性的逻辑承诺。如果事件 A happens-before 事件 B,那么 A 操作对内存产生的所有影响,都必须在 B 操作开始之前,对 B 完全可见。

它解决了并发编程中最棘手的两个问题:指令重排和内存可见性。

  1. 对抗混乱的“幕后优化”:为了追求极致性能,编译器和 CPU 会对你的代码进行“优化”,比如打乱指令的执行顺序 (Instruction Reordering)。在单线程中这通常没问题,但在并发环境下,这种重排可能导致灾难性的后果。
  2. 确保数据同步:在现代多核 CPU 架构中,每个核心都有自己的高速缓存 (Cache)。一个核心对数据的修改不会立即同步到主内存或其他核心的缓存中。这就导致一个 goroutine 修改了数据,另一个 goroutine 可能根本“看不见”这个修改。
阅读全文 »

1. 数据卷

Docker 数据卷(Volume)是 Docker 提供的一种特殊机制,用于将容器内的数据与容器本身的生命周期解耦。它是一个由 Docker 管理的、存在于主机文件系统中的特定目录,可以被一个或多个容器挂载,从而实现数据的持久化和共享。

简单来说,容器可以被随时删除和重建,但数据卷里的数据会一直保留下来,直到你主动删除它。

阅读全文 »

1. 基本概念

1.1 镜像

镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

阅读全文 »

1. 介绍

一个网络请求Request,每个Request都需要开启一个goroutine做一些事情,这些goroutine又可能会开启其他的goroutine。所以我们需要一种可以跟踪goroutine的方案,才可以达到控制他们的目的,这就是Go语言为我们提供的Context,称之为上下文非常贴切,它就是goroutine的上下文。

阅读全文 »

1. vim-plug 安装

1
2
3
4
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

# 进入vim, :PlugInstall 执行安装命令
阅读全文 »

1. 如何实现散列表

  • 在散列表这种数据结构中,会包含 N 个 bucket(桶)。对于某个具体的散列表,N(桶的数量)通常是【固定不变】的。于是可以对每个桶进行编号,从 0 到 N-1。

  • “桶”是用来存储“键值对”的,你可以把它通俗理解成一个动态数组,里面可以存放【多个】“键值对”。

  • 当使用某个 key 进行查找,会先用某个散列函数计算这个 key 的散列值。得到散列值通常是一个整数,然后用散列值对 N(桶数)进行“取模”运算(除法求余数),就可以算出对应的桶编号。(注:取模运算是最常用的做法,但不是唯一的做法)

阅读全文 »

4. BitTorrent协议

BitTorrent 使用”分布式哈希表”(DHT)来为无 tracker 的种子(torrents)存储 peer 之间的联系信息。这样每个 peer 都成了 tracker。这个协议基于 Kademila 网络并且在 UDP 上实现。

阅读全文 »
0%