FPs

第一台NAS

qnap

两年前在腾讯的时候,内部福利领取了一年的微云会员,就将女友旧电脑的一百多G的资源全部上传备份,然后处理掉了旧电脑。 虽然当时知道日后会离职会员会过期,不过看了产品协议记得是会员过期存储空间不回收,只是无法再上传罢了,类似Dropbox。

月初却收到了如下通知

自2019年10月24日零时起,微云将上线超额存储管理规则。已用容量超出可用额度的用户,需要在180天内升级存储空间或对容量超额部分进行清理。若超期未作处理,帐号将被冻结,冻结期间微云保留清理超额空间的权利。

好吧,没法“白嫖”了,也长个记性,国内这些云存储的厂商,大多数不靠谱,还是买台NAS吧,也长草很久了。

Continue ->

糟糕的斑马旅游

2018 年的元旦和女友又去了一次泰国,这次由于我工作比较忙,没精力做攻略,逛了一圈携程、飞猪,选了斑马旅游的产品,也叫歌晨旅游。

携程上一片五星好评,官网和产品介绍上“高品质”、“轻奢品质”、“精品”、“管家服务”等字眼,促使让我快速下单,继续埋头工作,坐等出发,相信斑马旅游会对本次服务提供一个高品质,和我们付出价格相符的服务,入了个大坑。

Continue ->

ip_local_port_range 小问题

发现系统打印了一条日志,类似redhat solution:2887631

Jan 23 14:37:22 localhost kernel: ip_local_port_range: prefer different parity for start/end values.

意思是建议将/proc/sys/net/ipv4/ip_local_port_range 的两个数设置一个奇数,一个偶数。

Continue ->

Python Switch 多次调用小问题

大家都知道Python 中没有Switch 关键词,如果写一堆if-elif-else 非常不美观,通常的做法是使用字典,今天遇到一个小问题,如下:

class Recource(object):
   def do(self, provider, action):
       return {
         'aliyun':{
             'create': self.__create__(),
             'update': self.__update__(),
             ...
             },
         'aws': ...
        }[provider][action]

写完测试一下,发现字典里面每个函数都会被执行一遍,有点蒙,不过马上就明白了,但是一时不知道该如何解决,Google 下找到了解决方式: Pythonic switch within class,

改一下:

class Recource(object):
   def do(self, provider, action):
       return {
         'aliyun':{
-            'create': self.__create__(),
-            'update': self.__update__(),
+            'create': lambda: self.__create__(),
+            'update': lambda: self.__update__(),
             ...
             },
         'aws': ...
-       }[provider][action]
+       }[provider][action]()

原来如此,简单快捷,学习了,又一次面向Stack Overflow 编程 :P。


最近面试的体会

最近半年一直在面试(作为面试官),由于我上一份跳槽的经历,和候选人暖场之后(我也会做一个自我介绍),会和他说明这轮面试考察的几个大点。 例如:

  • 系统运维基础/经验;
  • 计算机网络基础知识和工具使用;
  • 开放性问题,考察排查能力、解决思路;
  • 编程能力和开发经验;
  • 应聘岗位的特殊要求等等。。。

随机性提问,一般由浅入深,或者发散展开。如果觉得候选人某个点的问题回答的不好,一般会追加几个同类问题,以便全面考察,怕误判。 结束之后,再和候选人回顾一下。这个时候,我个人的做法是直接告诉候选人有哪些不足,再给予他解释的机会,我怕因为我的原因漏掉一个合适的候选人。

这轮面试的结果也会直接告知,除非需要梳理或者和同事商量再判断。

对于现场通知结果,有一些候选人,会很喜欢这种方式,也会感谢我提出的点,愉快的结束这轮面试,这类候选人一般年纪教小,资历较浅。

也有一些候选人,会表示忿怒,甚至会反过来质疑我的年纪和资历,这类候选人一般都是所谓的大厂员工,年纪大、资历深,但是技能实在平庸。

对于后者,我不太会应付,也不想应付。我可以和其他公司的面试官一样,用一些“有消息通知你,今天先这样”,“leader 在开会,我们再约”等应付的话术。但是何必呢?

我也受到过太多的“冷处理”,可能HR 同学看来“冷处理”是一种比较高效、恰当的方式。但我觉得我的做法对候选人足够的尊重,对候选人来说能清晰的知道考察的点,也有自我辩解的机会,可能是一个更好的方式?

面试一直都是一个相互了解的过程,公司和候选人双方都应该要有这个意识。

由于我一般是首轮面试,基础和经验是我看重的。我之前一直很看重基础,当然现在也看重,不过现在也会一样看重候选人的态度,做事习惯。责任心是不是足够强?自我时间管理做的如何?是不是有owner 意识?遇到问题追的够不够深?解决问题的思路?对技术的热情如何?等等。可是说实话,这些点实在不太好判断,可能我还需要去学一些心理学知识?

工作越久,越发觉得做事习惯、个人性格和智商、技能一样重要。


ANAME、CNAME、DNAME

CNAME 很常见,一般人都很熟悉,将一个域名映射到另外一个域名。但是CNAME 有个限制,顶级域名(apex domain)不建议设置CNAME,因为会和MX 记录冲突,详细解释:为什么裸域名不可以设置 CNAME?#26

RFC1912:2.4 CNAME records

A CNAME record is not allowed to coexist with any other data. In other words, if suzy.podunk.xx is an alias for sue.podunk.xx, you can't also have an MX record for suzy.podunk.edu, or an A record, or even a TXT record...

所以就诞生了ANAME,有些DNS 服务商叫做ALIAS,可以在apex domain 上实现类似CNAME 效果。第一次见到这个,是在配置Github Pages

Continue ->

Airflow 并发trigger DAG 的问题

有一个小服务使用了airflow,会把比较耗时的离线任务丢到airflow 处理。 在需要的时候触发(trigger_dag)这些任务。最近发现一小部分任务没成功,对应的dag 下也没找到日志记录,看起来是没触发成功。 在airflow-web-server 中发现了异常日志:

Run id ... already exists for dag id ...

看了下代码:incubator-airflow/airflow/api/common/experimental/trigger_dag.py

未指定run_id 的情况下,run_id 默认为utcnow,并且还默认去掉了microsecond。这样的话,对同一个dag 大量并发trigger 的时候,run_id 很容易相同。

临时的解决方法,在trigger dag 时指定下run_id。我临时改成了 utcnow+uuid4,应该不会再撞上了吧,不然就可以买彩票了。。。