Windows 上使用sshfs

作为Linux开发者需要利用Windows的图形界面的便利增加开发效率,所以需要将Linux的文件系统mount到Windows上。

Samba 是一个不错的选择,但是Samba 配置复杂,经常出各种问题,而且如果是要经外网访问也有安全问题,所以我觉得sshfs 是一个更安全高效的选择,协议更加安全,有fuse就可以使用,也无需多余配置。但是Windows 没有fuse,所以需要第三方软件的支持。

需要安装两个软件,分别安装winfsp sshfs-win 即可。

安装完就可以像挂载网络磁盘一样,在文件管理器中右键点击“此电脑”,选择”添加一个网络位置“,输入形如\\sshfs\[locuser=]user@host[!port][\path] 的地址,例如\\sshfs\root@localhost!1024\ 就可以了。

Read more...

Ceph Luminous 安装要点

只记录Luminous 和旧版有区别的地方,基本流程没有变,参见旧文。 Bootstrap keyring 之前的版本在初始化mon的时候会在/var/lib/ceph/bootstrap-{节点名}/自动生成bootstrap其他节点用的keyring,但是有时候又不会。 如果没有这个keyring,可以手动生成以初始化除了mon以外的节点。 根据文档: ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring \ --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' 但是不知道为什么并没有用,在ceph auth list里面并没有看到新的key生成。所以还是用老方法: ceph auth get-or-create client.bootstrap-osd mon 'profile bootstrap-osd' 创建bluestore Luminous 默认存储backend 由filestore替换成了新的bluestore,同时也简化了初始化流程: ceph-volume lvm create --data {data-path} 要求硬盘没有挂载。 这样默认创建出来的bluestore 会分出两个区,一个区给block,一个区给db。如果有更好的设备,可以按如下方式把db单独放在另一块盘。 假设sdc是一块ssd,想要把所有bluestore的db都放在sdc上。在sdc上创建bluestore rocksdb用的lg: pvcreate /dev/sdc vgcreate ceph-journal /dev/sdc 对每个OSD, - 创建db用的lv: lvcreate --size 10G ceph-journal --name ${dev}.db && \ lvcreate --size 10G ceph-journal --name ${dev}.wal prepare, activate: ceph-volume lvm prepare --data /dev/${dev} --block.
Read more...

笔记本电脑对比表 - A Notebook Comparison sheet

要买一台笔记本电脑,15000 RMB左右预算,花一上午时间,参考官网、电商、Wikipedia、Intel网站做了一个横向对比,对比了CPU、RAM、Disk、Display(size ppi nit)、Battery Life、GPU、Weight / Height、Price这些维度,精力有限,只罗列了常见的选择,希望于诸君有用。 表中未填项与上一行同型号产品相同或未知,待机时间为官方宣称,大部分是以播放本地视频为方法来测试的,看看就行。 | Model | CPU | RAM | Disk | Display(size ppi nit) | Battery Life | GPU | Weight / Height | Price | Other | |-----------------------|---------------------------------|---------|------|-----------------------|--------------|---------------|-----------------|-------|----------------| | MacBook | 1.4G 7th i7 4M 7Y75 | 16 | 256 | 12’ 226 | | HD 615 | 0.92 / 13.1 | 12188 | 显存和内存共享 | | | | | 512 | | | | | 14948 | | | MacBook Air | 1.
Read more...

力的三种意义-数学推导

1. 质量 * 加速度

$$ f = m \times a $$

基本定义,不再赘述,接下来在数学上说明力的另外两种意义。


2. 动量变化率

动量的定义:

$$ momentum = m \times v $$

取动量关于时间的微分,$\frac{d(mv)}{dt}$

$m$是固定的,所以原式可以写成

$$ m \times \frac{dv}{dt} $$

加速度即速度的瞬时变化率: $a = \frac{dv}{dt}$

所以

$$ m \times \frac{dv}{dt} = m \times a = f $$


3. 关于功

也可以说力是在作用方向上每单位距离所做的功。

功的定义

$$ w = f \times y $$

固定力,取功关于距离的微分

$$ dw = f \times dy
f = \frac{dw}{dy} $$

Read more...

一次python内存泄露debug

最近发现平台一个python组件跑一段时间之后就会丢消息,卡住,然后内存暴增。这个组件主要负责接收agent上报,上报采用了ZeroMQ,收到消息后分给worker thread进一步处理入库。Debug的时候没有经验颇踩了一些坑浪费了很多时间,记录在此以警世人。 1. 直觉排查 因为之前遇到过类似的情况,直觉上以为是zmq的问题,可能上报连接过多,并且没有主动关闭,造成tw bucket overflow,再加上重试机制,只要一堵塞,就有越来越多重试,造成雪崩。看看ss,确实连接很多。想办法改进了一下agent,连接数是有降下来了,遗憾的是卡住内存暴增的现象还是没有解决。 2. 系统调用分析 这种卡住的情况,使用pdb是没办法的,只能使用strace + gdb。 gdb有python模块,但是业务机上面gdb无法和python一起build,所以attach了dump core也没有看出什么,全是??,也无法使用py-bt等命令来排查python代码问题。 ps -T找出这个进程的线程,找了一个内存最大的线程去strace,发现卡在recv: $ strace -p 32031 Process 32031 attached - interrupt to quit recvfrom(44, ^C <unfinished ...> Process 32031 detached 为什么卡在recv?难道是一个client导致的?从44这个fd着手,去查查这个socket的远端: $ ls -alh /procs/31757/fd/44 lrwx------ 1 root root 64 Jul 2 03:23 44 -> socket:[730348541] $ss -emp | grep 730348541 ESTAB 0 0 10.3.y.y:33226 10.3.x.x:4313 timer:(keepalive,9min23sec,0) users:(("python",31757,44)) ino:730348541 sk:ffff88010c747800 看到timer,这个连接已经keepalive了9分钟,这让我确信是zmq的连接机制的问题,双重保险,除了改了agent的socket的linger选项,还改小了keepalive: sysctl -w net.ipv4.tcp_keepalive_time=30 net.ipv4.tcp_keepalive_intvl=10 net.
Read more...

负债的原则

总结一下正和岛看来的一篇关于负债的文章和我的看法。

负债的三个原则:

  1. 收益超成本
  2. 杠杆够长
  3. 杠杆不断

收益超成本

债务收益要大于债务成本,只有收益大于成本,才能盈利和持续,这是负债的根本。

投资性负债收益相较于消费性负债更好定量分析。

杠杆够长

当确定收益能超过成本费用时,就要尽可能多的负债、尽可能长时间的负债,把杠杆做的足够长,越长的杠杆撬动力越大——也就是收益越大,最终的收益是杠杆的倍数。

例子:

100万的房产,若是20%的首付(就是5倍的杠杆),当房产上涨10%时,其绝对收益就是50%(收益值=100万*10%=10万;首付投入=100万*20%=20万。收益率=10万/20万*100%=50%)

杠杆不断

维持杠杆需要的是现金流,要让源源不断的现金流能覆盖住到期的债务,并长此以往的维持下去,直至经历一次牛熊周期,等到泡沫的来临。

总结

这篇文章中心思想是债务应决定于现金流而不是负债率,但是并没有说明白债务和现金流的定量关系。往往各种债务叠加,若不计算负债率很难说是否当前现金流能覆盖到期债务。

文中明确指出收益是杠杆的倍数,我认为这是一个一般情况,有时要考虑到杠杆长度带来的负债成本的增加,并不是杠杆越长就收益越大,也就是说杠杆长度和收益并不一定是线性关系。

虽然部分不同意文中说法,但是对我来说是引发对债务思考的一个不错的入口。

Read more...

费雪的几个观点

看到一个关于介绍何为货币时间价值的知乎答案,其中介绍了费雪的几个观点,感觉十分透彻,摘录如下。

资产:“一切可以带来未来收入的资源”。

收入的落脚点是享受,即享受性收入,但享受是一个主管衡量,人们通常比较货币收入:“工资不是收入,用工资换来各式享受的时候才是收入”。货币只是一个度量工具。

货币的时间价值即利息,利息是“现时消费与将来消费之间的选择”,利率是“现时消费与将来消费进行交换的价格”。

除了风险因素的利息被看作纯利息(安全贷款的利息),费雪认为纯利息有两个构成:“不耐”和“投资机会”。

  • 不耐(impatience):人们都有“现在收入优于未来收入的偏好”,这是人由于生命有限的天性,职业风险较高的从业者不耐倾向更高。不耐倾向除了风险还受收入(包括数量、时间分布)与个人因素(例如习惯、远见、自制)影响。要克服不耐,就需要一定代价即利息。所以利息即让人们放弃当期消费的代价。
  • 投资机会:货币是一种资源。这对不耐性也是一个冲击。

市场的利息就是在纯利息的基础上再加上风险、不确定性等等。

Read more...

使用certbot开启HTTPS

Deadline就是生产力,因为Chrome 50开始不允许不安全域名使用geolocation,所以不得不上https了。使用certbot简直将添加https变成了一件trivial的事情,但是因为我是自己编译安装的nginx,所以没有自动配置好nginx。如果使用yum安装nginx,应该只需要安装执行certbot即可。 安装certbot: yum -y install yum-utils yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional yum install certbot 执行certbot:certbot certonly --webroot -w {webroot} -d sub.domain.com -d domain.com 其中webroot指网站的根目录,-d为该目录的域名,可以有多个,可以有几组这样的-w,-d组合。 这个命令会有两个验证步骤:在你指定的webroot下放一个文件,在远端尝试访问这个文件,来确定你是否有这个网站的权限。所以你执行这个命令前要保证这个域名和指定的webroot是可以访问的,否则会遇到类似urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://sub.domain.com/.well-known/acme-challenge/longlonglonglonghash 的错误。这时你需要检查下你的web服务器的配置了。 接下来手动配置nginx。 生成ssl dhparam:openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048。 配置nginx: server { listen 443 http2 ssl; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ######################################################################## # from https://cipherli.st/ # # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html # ######################################################################## ssl_protocols TLSv1 TLSv1.
Read more...

Ceph手动升级要点

总结一下自己从Hammer手动(不使用ceph-deploy)升级到Jewel遇到的问题作为前车之鉴。重要信息没有列举,没有直接遇到这些问题的读者请读完后再实施。 0. 安装问题 先升级Ceph,这一步没有什么,因为升级并不会重启现有节点,所以还是旧的在跑,需要注意的都在重启的时候。之前是用自己的源安装的,这次用外部源,国内最好配置国内源,一个示例可用的完整的使用了阿里的Ceph源的repo如下,写入/etc/yum.repos.d/ceph.repo即可。 [ceph] name=Ceph packages for $basearch baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/$basearch enabled=1 priority=2 gpgcheck=1 [ceph-noarch] name=Ceph noarch packages baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch enabled=1 priority=2 gpgcheck=1 [ceph-source] name=Ceph source packages baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS enabled=0 priority=2 gpgcheck=1 一开始使用这个源配置的时候遇到Public key for *.rpm is not installed错误,gpgcheck改成0即可。 然后直接yum upgrade ceph。可能会遇到依赖不满足的问题,可以试下安装epel的源:epel-release。 接下来注意一下重启的步骤,不然可能会出问题: 1. MON 2. OSD 3. MDS 4. RGW 1. 重启 Jewel版Ceph的默认用户变成ceph:ceph,然而低版本的则默认是root,直接重启会造成/var/lib/ceph/{node-type} permission denied问题。 需要将/var/lib/ceph以及子目录赋给ceph:ceph:chown -R ceph:ceph /var/lib/ceph。但是chown并不管链接,OSD的journal和data都是链接过来的,所以还需要chown data和journal。 Jewel与Hammer不同,使用systemctl作为服务管理,不再使用/etc/init.d/ceph了,这里说下升级会用到的systemctl用法给不熟悉的读者。systemctl是支持通配符的,操作所有ceph服务: systemctl {status, start, stop} ceph-*,注意不要少了-。重启前的旧进程因为是init script启动的,所以在systemctl下显示的是ceph-{node-type}.{instance-id}.***的形式,可以先status,看到名字之后再复制、stop,最简便的办法是systemctl stop ceph-{node-type}*,之后启动就是正常的systemctl service的命名方式了:systemctl start ceph-{node-type}@{instance-id}.
Read more...