操作系统
2022-03-02
-
麒麟
-
银河麒麟 Kylin,国防科技大学研发 kylinos.cn
据说早些年基于 FreeBSD,后来改成 Linux
2019 年,银河麒麟(天津麒麟信息技术有限公司)收购中标麒麟(中标软件有限公司),改名麒麟软件有限公司,是中国电子旗下子公司。
中标麒麟主打民用,银河麒麟主打军用。
星光麒麟:嵌入式 OS
开放麒麟(OpenKylin):社区
- 中标麒麟 NeoKylin
-
优麒麟,Ubuntu Kylin(Ubuntu 中国定制版)
工信部软件与集成电路促进中心、国防科技大学
搞了个自己的界面,叫 UKUI
不知道什么时候开始,也变成了麒麟软件的项目
优麒麟是由麒麟软件有限公司主导开发的全球开源项目,专注于研发“友好易用,简单轻松”的桌面环境,致力为全球用户带来更智能的用户体验,成为 Linux 开源桌面操作系统新领航!
-
湖南麒麟信安 Kylinsec
-
普华,中国电科(军工)旗下企业
-
统信
-
深度,开始是基于 Ubuntu,后来基于 Debian,现在是完全使用 Linux Kernel 和开源组件独立构建,“建设中国桌面操作系统根社区”。
-
UOS,分成 A 版和 E 版,分别基于阿里龙蜥(Anolis)和华为欧拉(Eular)。据说还有一个 D 版,基于 Debian,但是官网没有看到。
-
红旗
-
2019 年,中科红旗(chinaredflag.cn)被大连五甲万京信息科技产业集团收购
- 发现有一家公司叫做北京红旗软件(redflag-os.com),也是做红旗操作系统,不知道和中科红旗有什么关系
-
中科红旗向北京红旗软件道歉
北京红旗软件有限公司与中科红旗(北京)信息科技有限公司一审民事判决书
-
中科方德
- 中兴新支点
-
起点 startos.com
-
华为 鸿蒙
- 华为 欧拉
- 阿里 龙蜥
-
腾讯 CloudLinux
-
LingmoOS(Cutefish)
-
RT-Thread RTOS
Golang
2022-03-01
哈喽,大家好,我是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()
}
- A.
aaa: done
- B.
bbb: surprise!aaa: done
- C.
永远不会结束
- D.
编译错误
解析
答案: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语言资深工程师的路上任重道远呀~。
招聘
2022-02-27
阮一峰的文章摘自英文博客 Hiring Developers: How to avoid the best
今天的招聘市场上,每个人都想招到优秀程序员。但是,有一些因素,会让你错失他们,只招到没有其他地方可去的程序员。
- 缓慢的招聘流程
优秀工程师非常抢手,一出现在市场上就会被抢走。只要你把招聘流程放慢,每个阶段都要1到2周才给出回复,他们就会中途被其它公司雇佣。
- 面试一些他们平时不做的事情
面试时,你问一些他们根本不拿手的、其它领域的问题,比如让前端程序员回答如何调试 MySQL 的性能。优秀程序员会对这种毫无意义的面试感到沮丧,从而自己放弃。
另一种情况是,你让他们把一个需要好多天工作的技术难题,带回家解答。优秀程序员根本不会有时间,用来解这种题目。技术难题耗费的时间越长、越复杂,优秀程序员越会直接拒绝这样做。
- 只在本地面试
你撒的网越小,发现宝物的机会也越小。如果限制只在一个小城市招聘,几乎就不会有机会遇到优秀程序员。尤其是还不提供远程工作。
另外,要求所有申请人自费到公司进行30分钟的面试,而你的公司又在很偏僻的地方,也很难招到优秀程序员。因为如果申请人愿意自费长途跋涉,这表明他们迫切需要一份工作。如果你不提供搬家费,但是申请人愿意从另一个城市搬到公司所在地,这也不是一个好的迹象。只有真正绝望的程序员才会自费搬家,为一家不知名的小公司工作。
- 毫无激情的工作内容
优秀程序员对自己所做的事情,或者对于技术有很大的热情。他们通常把空闲时间都花在技术社区的活动,或者钻研 IT 技术和开源项目。如果你的工作把他们的时间占满,同时工作内容又无法让他们感到自豪或产生激情,优秀程序员就会产生反感。
- 少付报酬
优秀程序员理应得到丰厚的报酬,要是你付给他们工资低于竞争对手,股权也很少,或者要在公司待很长时间才能得到股权,如果他们足够聪明,就会意识到为这点报酬,要待这么长时间是不值得的。
上面这些因素,保证让你雇佣不到优秀的程序员。但是,如果你把每一个因素都反过来做,那么很有可能雇佣到他们。
- 快速招聘,迅速做出决定。
- 重视程序员的专长。
- 珍惜并尊重申请人的时间。
- 提供远程工作和搬迁费用。
- 不占用下班时间,为他们留出生活和业余爱好的空间。
- 支付公平的薪水,并让他们有涨薪的期望。
Linux HTTP
2022-02-25
今天发现一个奇怪的现象,相同的代码在 CentOS 7 服务器上发起 HTTP 请求 3 秒之后超时,报 “TimeoutError: [Errno 110] Connection timed out”。
在我本地就按我们的定义的超时时间 5 秒超时,报 “tornado.simple_httpclient.HTTPTimeoutError: Timeout while connecting”。
Nginx
2022-02-22
线上环境 HTTP 服务有报获取不到 Host 信息。应该是域名,但是拿到的是 backend 这样的名字。
我第一反应肯定是 Nginx 的配置问题,我印象中 Nginx 给 upstream 转发的请求就会设置 Host 为 upstream 名称。
但是我检查了 Nginx 的配置 (nginx.conf), 在 http 这一层的配置中有 proxy_set_header Host $http_host;
。
不过搜索 proxy_set_header 的时候发现,在 server 这一层设置了 proxy_set_header X-Forwarded-For $remote_addr;
, 这个头在 http 这一层也设置了,没必要在设置的。
我就想到,会不会下层设置头会覆盖上一层的所有头设置。
在 Nginx 文档 (proxy_set_header) 中查到:
Allows redefining or appending fields to the request header passed to the proxied server.
The value can contain text, variables, and their combinations.
These directives are inherited from the previous configuration level if and only if there are no proxy_set_header directives defined on the current level.
当本层没有 proxy_set_header 指令的时候,才会继承上一级的 proxy_set_header 指令。
将 server 层重复的这个设置拿掉,果然就好了。
个人
2022-02-21
已经 30 几了,生活一团糟。
如果能有些事业,好歹有一个方面可以让我感受到自己的价值,至少可以分散一下注意力。可是,也没有,反而也是个令人糟心的事,让我常有髀肉复生之叹,感觉人生就要荒废。
我感觉我在一个漩涡中无法自拔,想逃离却又不能逃离。我不知道该怎么做。我时常想起《阿甘正传》中珍妮的祈祷。
这个可能就是中年危机的前兆吧!
WebDev CDN
2022-02-19
公共库 CDN,也叫静态资源库。
我想了一下,国内公共库 CDN 全面挂了可能是由于监管压力。
在国内,如果 CDN 提供的静态资源被一些恶意网站引用,会被问责。如果要全面审核使用 CDN 的网站,肯定是会增加太多的管理成本。
感觉这真是太不合理了!
如果是线上项目,不要用公共库 CDN。
小项目自己管理静态资源,大项目可以用付费的 CDN 服务。
BootCDN
https://bootcdn.cn
我之前用的最多的 CDN,但是总是挂,心累。现在开始用字节跳动 CDN 了。
字节跳动 CDN
http://cdn.bytedance.com/
CloudFlare CDN
https://cdnjs.com/
JsDelivr
https://www.jsdelivr.com/
不可用清单
百度 [不可用]
http://cdn.code.baidu.com
已经挂了。
腾讯 [不可用]
https://libs.qq.com/
打不开。
新浪 [不可用]
http://lib.sinaapp.com/
只有很少的资源。
360 [不可用]
http://libs.useso.com/
又拍云 [不可用]
http://jscdn.upai.com/
只有很少的资源。
七牛云 [不可用]
http://www.staticfile.org/
感觉很久没有维护了。一些常用库都非常老了。
参考资料与拓展阅读
DB
2022-02-15
https://db-engines.com/en/ranking
https://db-engines.com/en/ranking_trend
关系型 Relational
https://db-engines.com/en/ranking/relational+dbms
- Oracle
- Microsoft SQL Server
- IBM Db2
- Microsoft Azure SQL Database,应该就是 SQL Server 的云版
- Snowflake
- Microsoft Access
- FileMaker 类似 Access 的数据库产品
这几种大型商用数据库就不提了,除了 Access 和 SQL Server 稍微熟悉一点点之外,其他几个碰都没碰过。
开源:
- MySQL
- PostgreSQL
- MariaDB 排 RDBMS 第 8 名
- Percona Server for MySQL 排 RDBMS 第 56 名
- SQLite
- Firebird
文档型 Document
MongoDB 遥遥领先。
键值型 Key-Value
- Redis
- Memcached
- etcd
搜索引擎 Search Engine
排除两个商业服务 Splunk, Algolia。
- Elasticsearch
- Apache Solr
- Sphinx
Elasticsearch 和 Solr 都基于 Apache Lucene
列式存储 Wide Column
熟悉的 RDB 基本上都是行式存储。
Cassandra 遥遥领先, 第二是 HBase。
图 Graph
- Neo4j
- Microsoft Azure Cosmos DB
时序型 Time Series
- InfluxDB
- Kdb+
- Prometheus
- Graphite
- TimescaleDB
- Apache Druid
- RRDtool
- OpenTSDB
参考资料与拓展阅读
Linux
2022-02-08
set file capabilities, 设置文件权限
setcap
usage: setcap [-q] [-v] [-n <rootid>] (-r|-|<caps>) <filename> [ ... (-r|-|<capsN>) <filenameN> ]
Note <filename> must be a regular (non-symlink) file.
Golang
2022-02-07
编程语言中一般都有枚举类型。可以用来替换代码中的那些有一定范围的常量,减少幻数的使用,提升代码可读性。
有些语言的枚举支持遍历等操作,有一些语言的枚举还支持枚举值和枚举名字的映射。
Go 没有在语言层面实现枚举,只能通过定义一组变量。
比如(src/runtime/time.go
):
const (
timerNoStatus = iota
timerWaiting
timerRunning
timerDeleted
timerRemoving
timerRemoved
timerModifying
timerModifiedEarlier
timerModifiedLater
timerMoving
)
官方代码(src/time/time.go
)中有些地方会给这些变量加一个自定义类型:
// A Weekday specifies a day of the week (Sunday = 0, ...).
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
参考资料与拓展阅读