0%

今天因为用badblocks去检查硬盘坏道的时候莫名的加了-w选项。导致整个data分区都跪了。本来在装系统的时候把/data 单独分到一块硬盘上就是为了保护数据看,想着以后重装系统的时候只需要重新mount一下就好了。没想到今天发生了这样的事…然后更惨的是发现自己并没有对/data进行备份,因为也好久没用了,欲哭无泪。

于是痛定思痛,决定利用起家里的NAS来进行定期自动的备份(是个QNAP TS-288, Linux系统, 所以其实硬盘+Rasperry PI 这种都可以实现相同的效果)

环境

我的笔记本在network中是bucketzxm-pc, NAS 可以叫做qnap

因为rsync需要ssh登录,所以我们需要配置一下ssh,让它能自动的进行任务。

配置sshkey

首先在qnap上配置好ssh key.(就是把bucketzxm-pc/.ssh/ssh_key.pub 复制到 qnap/.ssh/authorized_keys 中, 具体的可以查一下如何用sshkey进行auth登录)

备份

选择文件夹

本文中以备份bucketzxm-pc(我的笔记本)上的/data//home/bucketzxm来举例。 因为我所有的数据都是在/data上,home中可能有一些Download和config文件。因为NAS还够大,所以多备份一些也没关系。

rsync

这里qnap的IP地址是192.168.1.102, 在尝试的时候需要换成自己家中备份设备的地址。 可以通过 ssh IP-address 来测试是否能连接并成功登录

rsync 的命令很简单,需要注意的是--delete. 如果不用--delete,那如果本地文件删除了,在rsync的时候是不会删除原本备份的文件的。
例如在今天bucketzxm-pc上/data/testfolder 备份到 qnap上/backup/testfolder。 明天我删除了bucketzxm-pc/data/testfolder, 此时如果rsync,那么qnap上/backup/testfolder是不会被删除的。

相反,如果使用了--delete 参数,那么当笔记本上的文件被删除后,对应的备份中的文件也会被删除(此时相当于同步了)

-r-d都是为了对文件夹做操作,表示recursive.

1
rsync -av -r -d --delete  /data 192.168.1.102:/backup/daily/
1
rsync –av -r -d --delete /home/bucketzxm 192.168.1.102:/backup/daily/

这样之后在qnap上就会有两个文件夹 /backup/daily/data/backup/daily/bucketzxm. 也就成功的备份了。

crontab

光是靠人来每天rsync不太靠谱,所以我们就可以用crontab加个定时任务。

qnap上我创建了了三个文件夹,分别是daily,weeklymonthly, 对应着每天的备份,每周的备份和每月的备份。基本的策略是每天凌晨2点进行rsync从bucketzxm-pcqnap。 每周一次在qnap上从daily文件夹sync到weekly文件夹。最后每月的第一天,会把daily文件夹下所有东西用tar打包,放到monthly下。

在笔记本上

首先在bucketzxm-pc上设置每日的rsync任务。

contab -e 打开编辑,加入以下两行

1
0 2 * * * rsync -av -r -d --delete  /data 192.168.1.102:/backup/daily/
1
0 2 * * * rsync –av -r -d --delete /home/bucketzxm 192.168.1.102:/backup/daily/

这两行是告诉crontab, 每天凌晨2点的时候,把/data/ 和 /home/bucketzxm 备份到 qnap的/backup/daily下。 采用的是增量式的同步,并且文件保持和笔记本上的是一样的(会删除对应的文件)

在备份服务器上

同样是使用crontab -e 打开crontab 的配置, 加入以下两行并保存退出

1
0 18 * * 5 rsync -av --delete /backup/daily /backup/weekly

每周五的18点把/backup/daily下的所有内容备份到/backup/weekly下。

1
0 6 1 * * tar cvjf /backup/monthly/monthly_$(date +%Y%m%d).tar.bz2 /backup/daily/

每个月1号早上6点, 把/backup/daily下的文件打包成压缩包,并以日期命名存放到/backup/montyly下
例如monthly_20181006.tar.bz2

crontab 语法说明

希望不要再掉数据了!

年龄越大越明白了备份和离线的重要性,还记得高中的时候随便乱装Linux随便玩分区,就曾经把自己和别人重要的文件都删除了….惨剧…定期的备份重要性是不言而喻的。现在一些不涉及私密的文档会习惯放在dropbox上,一般的代码都会保存在gitlab或者github上。 其他私密或者重要的东西只能靠自己做离线的备份了。包括现在网上很多内容都会消失,所以现在我看到需要的东西都会先保存进Note或者下载下来。 希望大家配置好今天的rsync之后能够减少掉数据的概率!

Muji 旅行用熨斗

今天碰巧看到这个非常小的熨斗,加上之前发现很多衬衫都变的很褶皱,于是就买了这个Muji的旅行用熨斗。 日文名字叫:トラベル用アイロン(Travel用Iron). 型号: TPA-MJ211

价格

加上税是3591日元,免税大概就是3000日元左右,大约是人民币180块。(按照6.03的汇率计算的)

开箱

盒子比较小,大概就和一个饼干盒子差不多大。毕竟是旅行用的,方便携带。

使用介绍

一个米色的袋子

两个旅行用电压转换器接头

熨斗本体

本体是可以分离的,一个底部的熨斗和一个把手
不用的时候可以插在一起。

使用的时候竖起来可以搭扣在一起

因为是旅行用的,所以自然是可以切换使用电压的

使用的时候可以竖起来放,不会烫到桌子什么的,和普通的熨斗一样。

最后全套东西都可以收进这个小袋子,携带也非常方便

温度调整

看到网上有人说不知道怎么调温度和开关的,其实就是从上俯视下去,在把手旁边有一个突出的点,这个点对准的温度就是当前温度了。

最后附上温度的说明,最高好像是180度

使用感觉

Muji这款熨斗最大的优点其实就是便携,东西本身是很小巧精致,毕竟目标是旅行携带的。使用下来感觉就是温度不够太高,如果是衬衫短袖之类的还是挺够用的(我主要是用来熨衬衫的,发现放了一年实在是太皱了), 但如果是那种冬天的衣服或者外套,估计温度就不够了。 总体使用感觉还是挺不错的 :)

最近在Youtube上发现一个蛮有意思的关于数学的频道 3Blue1Brown,内容也很好。(B站上有中文的频道 b站)

Essense of LInear Algebra这个系列主要使用通过图形几何的角度来介绍线性代数,让大家能从直观上对线性代数有所认识。相信大多数人在大学上的课,老师都只是介绍计算过程,比如矩阵乘法,如何计算行列式,叉乘点乘之类的。但是并没有很多关于为什么的解释。

其实线性代数与空间运动与变换有很大的关系,如果能从本质上理解线性代数,那不论是对与思考或者计算都能起到很大的帮助作用:)

先简单的把目录列一下,之后再补充一些简单的总结,方便以后快速查看。

Brief Summary

  1. Vectors, what even are they?
  2. Linear combinations, span, and basis vectors
  3. Linear transformations and matrices
  4. Matrix multiplication as composition
  5. Three-dimensional linear transformations
  6. The determinant
  7. Inverse matrices,column space and null space
  8. Nonsquare matrices as transformations between dimensions
  9. Dot products and duality
  10. Cross products
  11. Cross products in light of linear transformations
  12. Change of basis
  13. Eigenvectors and eigenvalues
  14. Abstract vector spaces

最近看了一些关于专注文章和书,通过一个例子来记录一下。

其实专注有许多周边同义词, 比如坚持, 专一, 持续投入, 深度…………

巴菲特的”Two List” 策略

这段时间发现有一个特点在很多成功的人人生似乎都有所体现( 尽管有些事后诸葛亮)。 这个特点就是专注(Focus)。

这里以巴菲特的一个”2 List” Strategy作为例子。巴菲特大多数人应该都耳熟能详,作为20世纪以来最成功的投资者之一, 也是当今世界最富有的几个人之一, 他的思想和理念也一直被广为学习。 相信很多人也听说过“价值投资”,这也是巴菲特一直在推崇的理念之一。

这则故事据说是来源于他的雇员Mike Flint,也就是他的飞行员。Mike Flint有着10年的经验,曾经也为美国总统开过飞机。他们俩曾经聊起过有关于职业优先级的问题。

概括来说,巴菲特建议他做了以下三步。

  1. 首先写下TOP25的人生或者职业生涯计划。
  2. 回顾刚才写下的25个计划, 并且从中选择5个你认为是最重要的目标或者计划。 相信很多人在这一步也许会有一些困难。
  3. 这时候你就有了两张列表, A列表上有5个你认为最重要的, B列表上有20个你从第一次列出但第二次划掉的计划或者目标。

到这里相信很多人会觉得,那一定就是从最优先的5个开始,然后在过程中,也尽可能去实现剩下列出的20个计划。但是实际上巴菲特给出的建议是所有没有入选你那5个目标的剩余20项,都应该是你拒绝去做的事情(Avoid-At-All-Cost)。 这些事情不应该在你完成前五项之前干扰你。

这就是所谓的”Two List”。 不要让那些次要的目标干扰你去完成最重要的目标。你也可以试着做一下这个练习。

消除的力量

如果你做了上面那个三步实验, 可能你会和我一样发现在25选5的这个过程中,是比较困难的。很多时候我们对一些事情无法取舍,一方面因为很多事情无法量化,没有办法评分。 二是人总是很贪心的,想要这个也想要那个。因此很多时候无法做出选择, 甚至逃避做出选择。 这样只会让事情更糟。 因此在生活中应该更加的果断, 该舍弃的东西就要舍弃。 如果那不是最重要的, 也许就可以不要。

抵制诱惑

The grass is always greener on the other side of the fence

这句话很多人会理解为 别人的东西看起来更好。 但其实也可以理解为告诫我们要抵制诱惑。都是一样的grass草坪,但是为什么邻居家的总是看起来更绿更好呢?

比如一个大学刚开始学编程的人,可能会被烟花缭乱的各种技术所吸引。然而到了大学毕业我们才发现,那些四年如一日学习一种技术的人,是最厉害的。 不光因为他在那个领域的深度之深让他人望尘莫及。 也因为在某一领域达到一定深度后,在其他临近的领域也可以融会贯通,比较容易的扩展自己的边界。 反而是那些经不起诱惑,每当看到别人在学习某一样技术,或者在做某一方面的研究,就觉得自己做的没有意义,而别人做的东西更有吸引力,更有“前途”,转而换方向的人,会比较惨。(是不是别人的女朋友更好也有相同的道理:P)

使用有限的精神力和决策能力在最重要的事情上

其实这个例子中也还是强调了专注的重要性。

这让我也想起了很多其他有意思的事情。 比如据说扎克伯格的衣柜里有很多同一款式的衣服和裤子(灰色短袖和蓝色牛仔裤)。这可能就是在避免让自己花费决策力在日常生活中这些小事上。 之前也看到过一种说法是人的注意力和决策力在一天中是有限的, 那么就要尽可能的把这些重要的精神放在重要的事情上,才能做的更好。 因此需要将生活中很多不必要的选择尽量的流程化或者通过一些程序将其消除。 例如在选择衣服这件事情上,让所有的衣服都一样,那也就消除了选择的这一决策过程。 这也是尽可能的让自己专注(Focus)在重要事情上的一种表现。

通过给自己设定外部的规则(rules)来尽量减少自己不断重复的主观判断。比如将整个衣柜的衣服都换成一样的,那自然而然不会去想今天要穿什么。 相似的也有比如规定好自己明天要干什么。那第二天不会一直在浪费时间回忆思考自己的行程安排等等。 不断的给自己设定规则和方法,并且在实践中不断的完善这些,改进这些规则。(推荐一本桥水基金的老板Ray Dalio的书: Priniples )


我们必须认识到人一生的时间是有限的。 而且显然目前人生只有一次,是没有后悔药的。 一方面需要节约时间,另一方面也要把时间花在几个更加专一的领域。 我们无法对抗时间,但可以利用时间来筑造自己的护城河。

commitments will guarantee to be success

Work pervades their existence. Friends fade into the background.The ties of marriage fray or rip apart. Children are neglected or deferred. Hobbies wither. Computer code comes to mean everthing. If private dreams are nursed al all, it is only to ease the pain of creating NT

Reading List:

  1. Warren Buffett’s “2 List” Strategy: How to Maximize Your Focus and master Your priorities
  2. The Mistake Smart People Make: Being in Motion vs Tacking Action
  3. Do fewer Thins, Better
  4. Why Focus wins
  5. Simple Goal Setting that Gets Results + Free Goals WorkBook

I didn’t view Python as a functional programming language. —— Guido van Rossum

开篇这句Python爸爸的话同时也表明了作者后文所描述的一些感觉: 函数式编程在Python中并不是第一首选。

众所周知的是在Python中,一个函数是可以被当作对象传递的。首先我们可以使用type去查看函数的类型。我们也可以直接给函数换个名字。

1
2
3
4
5
6
7
8
>>> def factorial(n):
... return 1 if n < 2 else n * factorial(n-1)
...
>>> type(factorial)
<class 'function'>
>>> fact = factorial
>>> fact(5)
120

高阶函数(High-Order functions)

定义: A function that takes a function as argument or returns a function as result is a higher-order function.

例如在排序的时候,根据对象长度来排序的方法

1
2
3
>>> fruits = ['strawberry', 'fig', 'apple', 'cherry']
>>> sorted(fruits, key=len)
['fig', 'apple', 'cherry', 'strawberry']

这里len就是作为函数传入到sorted中,sorted 就是一个高阶函数。

有时候我们也用functors.partial 去构造一个高阶函数。

使用更现代的方法替换map, filterreduce

在Python中因为有许多方法,所以map, filterreduce 这些标准方法的使用就少了。

例如使用前面几章提到的 列表推导生成器 的方法可以替代许多mapfilter的使用场景。

1
2
3
4
>>> list(map(fact, range(6)))
[1, 1, 2, 6, 24, 120]
>>> [fact(n) for n in range(6)]
[1, 1, 2, 6, 24, 120]

在Python3中 reduce 被放进了functools中。 下面这里例子是用sum代替。

1
2
3
4
5
6
>>> from functools import reduce
>>> from operator import add
>>> reduce(add ,range(100))
4950
>>> sum(range(100))
4950

使用其它方法替代mapreduce可以起到相同作用,但是可读性更强,并且在某些时候一些内置函数经过优化速度会更快。

匿名函数

感觉Python中的lambda 是被吐槽的比较多的地方, 因为只能写一行。 因此lambda通常用来写一些简单的一行的函数传递。

1
2
3
>>> fruits = ['strawberry', 'fig', 'apple', 'cherry']
>>> sorted(fruits, key = lambda word: word[::-1]) # 按照单词反转后字母顺序来排序
['apple', 'fig', 'strawberry', 'cherry']

通常lambda在Python中用的也比较少, Lundh’s lambda refactoring recipe 也提供了简单的步骤如果去掉lambda函数。

函数自省

在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。自省向程序员提供了极大的灵活性和控制力。可以参考这篇文章

最常用的就是用dir方法查看函数对象有哪些属性:

1
>>> dir(factorial)

在Python中可以使用inspect模块, 例如使用inspect查看函数签名:

1
2
3
4
5
6
>>> from inspect import signature
>>> sig = signature(clip)
>>> sig
<inspect.Signature object at 0x...>
>>> str(sig)
'text, max_len = 80)'

书中还展示了一如何用inspect.signature 来绑定函数参数的例子。

函数注解(Function annotations)

在Python3 中添加了可以标注函数参数类型和返回值的特性。

1
2
def clip(text: str, max_len:'int >0' = 80) -> str:
...

但这些并不会在语言层面上做什么处理,只是在函数属性的__annotations__中添加对应的字典

1
2
>>> clip.__annotations__
{'text': <class 'str'>, 'max_len': 'int > 0', 'return': <class 'str'>}

这个特性对IDE和linters的用处可能更大一些,可以做静态检查。

几个用于函数式编程的模块

  1. operator 模块: 主要提供了一些运算符的封装,例如add, mul 等等。
  2. functools模块

后续阅读

Python HOW TO 中关于函数编程的文章

结尾的闲谈

So there you have it: Python is, by design, not a functional language — whatever that means. Python just borrows a few good ideas from functional languages.