#782 转载:防火墙的原理
计算机网络 网络安全 2022-03-25每一个中国开发者都必须去了解这个我们无法避开的网络特性。
coding in a complicated world
每一个中国开发者都必须去了解这个我们无法避开的网络特性。
Hadoop 核心组件:
| 节点编号 | 角色 | CPU | 内存 | SSD | HDD | 运行服务 |
|---|---|---|---|---|---|---|
| control-1 | 控制节点 | 8 核 | 32GB | 1TB SSD | 无 | NameNode(Active)、ResourceManager(Active)、ZooKeeper、JournalNode |
| control-2 | 控制节点 | 8 核 | 32GB | 1TB SSD | 无 | NameNode(Standby)、ResourceManager(Standby)、ZooKeeper、JournalNode |
| worker-1 | 计算+存储节点 | 16 核 | 64GB | 2TB SSD | 8TB × 2 HDD | DataNode、NodeManager、Spark / MapReduce 计算任务 |
| worker-2 | 计算+存储节点 | 16 核 | 64GB | 2TB SSD | 8TB × 2 HDD | DataNode、NodeManager、Spark / MapReduce 计算任务 |
| worker-3 | 计算+存储节点 | 16 核 | 64GB | 2TB SSD | 8TB × 2 HDD | DataNode、NodeManager、Spark / MapReduce 计算任务 |
| worker-4 | 计算+存储节点 | 16 核 | 64GB | 2TB SSD | 8TB × 2 HDD | DataNode、NodeManager、Spark / MapReduce 计算任务 |
| edge-1 | 边缘节点 | 8 核 | 32GB | 1TB SSD | 无 | Hadoop 客户端(hdfs/yarn 命令行)、Spark 客户端 |

关于提交信息相关的规范中,被最多提及的应该是 Angular 的 Commit Message Format:
<type>(<scope>): <short summary>
│ │ │
│ │ └─⫸ Summary in present tense. Not capitalized. No period at the end.
│ │
│ └─⫸ Commit Scope: animations|bazel|benchpress|common|compiler|compiler-cli|core|
│ elements|forms|http|language-service|localize|platform-browser|
│ platform-browser-dynamic|platform-server|router|service-worker|
│ upgrade|zone.js|packaging|changelog|docs-infra|migrations|
│ devtools
│
└─⫸ Commit Type: build|ci|docs|feat|fix|perf|refactor|test
build 构建ci 持续集成docs 文档(documentation)feat 新功能(feature)fix BUG 修复perf 性能优化refactor 重构test 测试代码Vue 也有一个 Git Commit Message Convention
/^(revert: )?(feat|fix|polish|docs|style|refactor|perf|test|workflow|ci|chore|types)(\(.+\))?: .{1,50}/
比 Angular 增加了:
polish 优化style 样式修改workflow 工作流改进chore 构建过程或辅助工具的变动
style: 格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)
chore:构建过程或辅助工具的变动
其他
我之前没有用过 LVS 做负载均衡,只是做过一点了解。今天听说 LVS 不支持后端节点做 Client,我很好奇,想分析一下具体原因。
现象:SYN 包会丢,可能有 1.5% 的连接丢了一次,0.1% 的可能性会丢失两次。
最后反馈是 SLB 实例规格太低, 升级 SLB 解决问题。
Ubuntu 上安装:
wget https://github.com/hluk/CopyQ/releases/download/v6.1.0/copyq_6.1.0_Debian_11-1_amd64.deb -P ~/Resources/
sudo gdebi ~/Resources/copyq_6.1.0_Debian_11-1_amd64.deb
点击打开之后,在右上角会有一个小图标。
Windows 版本下载地址:
https://github.com/hluk/CopyQ/releases/download/v6.1.0/copyq-6.1.0-setup.exe
PS: Windows 版本安装程序不支持中文,但是安装之后支持中文。
就是会监听剪切板,在第一个标签页中(默认只开一个标签,不会显示标签页切换栏)新建条目。
不只是剪贴板,可以用来存储各种需要复制粘贴的小片段。可以固定,加标记,支持搜索。
太可惜了,我的工作中不需要导出复制粘贴内容,对我的工作效率帮助不会很大。
但是用来跨平台同步剪贴板,还是非常不错的。
这个小工具真是不错,要是可以进一步提升颜值,改进体验,今后大有发展。
C:\Users\用户名\AppData\Roaming\copyq~/.config/copyq首选项 > 条目 > 同步
指定标签页,和存储目录,然后就会自动将当前剪贴板的内容在存储目录创建一个文件(txt/html/png),每次剪贴板内容更新就会再新建一个。
PS: 文件名包含当前 UTC 时间,精确到毫秒, 比如 copyq_20220308085614369.txt。
将存储目录选定为一个同步目录,比如我用的坚果云,直接同步到多台机器上。然后多台机器都配置相同的同步目录就行了。
PS:默认的那个标签名是 &Clipboard,用来同步剪切板。可以选中任意一个标签同步剪贴板。
主题我用 wine,感觉看着还行。
solarized-dark 主体会导致一些复制的代码看不清。
麒麟
银河麒麟 Kylin,国防科技大学研发 kylinos.cn
据说早些年基于 FreeBSD,后来改成 Linux
2019 年,银河麒麟(天津麒麟信息技术有限公司)收购中标麒麟(中标软件有限公司),改名麒麟软件有限公司,是中国电子旗下子公司。
中标麒麟主打民用,银河麒麟主打军用。
星光麒麟:嵌入式 OS
开放麒麟(OpenKylin):社区
优麒麟,Ubuntu Kylin(Ubuntu 中国定制版)
工信部软件与集成电路促进中心、国防科技大学
搞了个自己的界面,叫 UKUI
不知道什么时候开始,也变成了麒麟软件的项目
优麒麟是由麒麟软件有限公司主导开发的全球开源项目,专注于研发“友好易用,简单轻松”的桌面环境,致力为全球用户带来更智能的用户体验,成为 Linux 开源桌面操作系统新领航!
湖南麒麟信安 Kylinsec
普华,中国电科(军工)旗下企业
统信
深度,开始是基于 Ubuntu,后来基于 Debian,现在是完全使用 Linux Kernel 和开源组件独立构建,“建设中国桌面操作系统根社区”。
UOS,分成 A 版和 E 版,分别基于阿里龙蜥(Anolis)和华为欧拉(Eular)。据说还有一个 D 版,基于 Debian,但是官网没有看到。
红旗
2019 年,中科红旗(chinaredflag.cn)被大连五甲万京信息科技产业集团收购
中科方德
起点 startos.com
华为 鸿蒙
腾讯 CloudLinux
LingmoOS(Cutefish)
RT-Thread RTOS
哈喽,大家好,我是asong。今天新注册了twitter,在里面没事瞎逛的时候,发现了一道有意思的题,他是由Redhat的首席工程师、Prometheus开源项目维护者 Bartłomiej Płotka 发出的,经调查显示,这道题的正确率只有15.2%,惨目忍睹,接下来我们就一起来看一下这道题~
原文地址:https://twitter.com/bwplotka/status/1495002204163678211
func aaa() (done func(), err error) {
return func() { print("aaa: done") }, nil
}
func bbb() (done func(), _ error) {
done, err := aaa()
return func() { print("bbb: surprise!"); done() }, err
}
func main() {
done, _ := bbb()
done()
}
aaa: donebbb: surprise!aaa: done永远不会结束编译错误答案:C 永远不会结束
这道题考查的点就是命名返回值 + 闭包,把上面的代码换成等效的匿名返回值代码你就明白了:
func aaa() (func(), error) {
var done func()
done = func() {
print("aaa: done")
}
return done, nil
}
func bbb() (func(), error) {
var done func()
done, err := aaa()
done = func() {
print("bbb: surprise!");
done()
}
return done, err
}
func main() {
done, _ := bbb()
done()
}
这其实是 Go 语言设计上一个 feature,当 Go 语言的返回值赋给我们特殊的"返回参数"时,如果它们被命名了,在 return 之后,我们可以在函数主体完成后的任何执行过程中引用那些带有这些名称的值,在 defer 或闭包中一样。
我们在说回这道题,在 bbb() 函数内我们使用了命名返回值 done func(), _ error,使用短变量声明 done, err := aaa() 接收 aaa() 的返回值,这里变量 done 并不是一个新变量,这就要说到Go语言的短变量声明的语法糖了,在多变量声明中,如果其中一个变量是新的,可以使用 := 声明,编译器会进行类型推断和赋值,已经声明的变量不会重新声明,直接在原变量上赋值;之后我们return的是一个闭包函数,闭包里的done值并不会被提前解析,在bbb()函数结束后,实际对应的代码就成了这样,变成了递归。
done = func() {
print("bbb: surprise!");
done()
}
如果我们把代码在改成这样:
func bbb() (func(), error) {
var done func()
done, err := aaa()
return func() {
print("bbb: surprise!");
done()
}, err
}
答案就是【B】:bbb: surprise!aaa: done
一道看似简单的题,其中蕴涵的知识点确有很多,这就说明了解设计原理是多么的重要,Go语言资深工程师的路上任重道远呀~。
阮一峰的文章摘自英文博客 Hiring Developers: How to avoid the best
今天的招聘市场上,每个人都想招到优秀程序员。但是,有一些因素,会让你错失他们,只招到没有其他地方可去的程序员。
优秀工程师非常抢手,一出现在市场上就会被抢走。只要你把招聘流程放慢,每个阶段都要1到2周才给出回复,他们就会中途被其它公司雇佣。
面试时,你问一些他们根本不拿手的、其它领域的问题,比如让前端程序员回答如何调试 MySQL 的性能。优秀程序员会对这种毫无意义的面试感到沮丧,从而自己放弃。
另一种情况是,你让他们把一个需要好多天工作的技术难题,带回家解答。优秀程序员根本不会有时间,用来解这种题目。技术难题耗费的时间越长、越复杂,优秀程序员越会直接拒绝这样做。
你撒的网越小,发现宝物的机会也越小。如果限制只在一个小城市招聘,几乎就不会有机会遇到优秀程序员。尤其是还不提供远程工作。
另外,要求所有申请人自费到公司进行30分钟的面试,而你的公司又在很偏僻的地方,也很难招到优秀程序员。因为如果申请人愿意自费长途跋涉,这表明他们迫切需要一份工作。如果你不提供搬家费,但是申请人愿意从另一个城市搬到公司所在地,这也不是一个好的迹象。只有真正绝望的程序员才会自费搬家,为一家不知名的小公司工作。
优秀程序员对自己所做的事情,或者对于技术有很大的热情。他们通常把空闲时间都花在技术社区的活动,或者钻研 IT 技术和开源项目。如果你的工作把他们的时间占满,同时工作内容又无法让他们感到自豪或产生激情,优秀程序员就会产生反感。
优秀程序员理应得到丰厚的报酬,要是你付给他们工资低于竞争对手,股权也很少,或者要在公司待很长时间才能得到股权,如果他们足够聪明,就会意识到为这点报酬,要待这么长时间是不值得的。
上面这些因素,保证让你雇佣不到优秀的程序员。但是,如果你把每一个因素都反过来做,那么很有可能雇佣到他们。
- 快速招聘,迅速做出决定。
- 重视程序员的专长。
- 珍惜并尊重申请人的时间。
- 提供远程工作和搬迁费用。
- 不占用下班时间,为他们留出生活和业余爱好的空间。
- 支付公平的薪水,并让他们有涨薪的期望。