2019电子产品及周边剁手总结

2019年对我来说是一个圆梦之年。这一年买了几件电子产品:M10, iphone 11 pro,ergodox,。还借了借件电子产品: iMac, pixel3 XL, ergodox ez. 顺便还体验了一段时间的chrome book. 接下来是对各个产品的一个总结

最有价值& 最有逼格:Leica M10

黄铜铸就,健身伴侣,帕金森患者的福音书。

街拍神器,护体利器,激励我学习的永动机。

纯手动用起来真的是有门(逼)槛(格),黄斑我练了一个多月才能够合焦准确。不过确实是德味满满,尤其是夜景,真的是好看。也迫使自己开始研究拍照,要不然这么贵的相机岂不是浪费了。 至于最有价值,这相机买来就涨价,都成理财产品了……

最关爱身体:健身环大冒险

自从买了之后就开始了日日深蹲活动,感觉自己离健身达人已经不远了。感觉是那种买了就会觉得自己已经变瘦就不需要健身的产品了。嗯买了就会瘦,可以放开吃了!

最佳体验:iMac Pro

实话实说开发机用iMac是真的舒服,性能强劲,显示效果极佳。本来想在家配一个一样的机器,看了一下开发机的配置和价格之后我就放弃了——$6999 真的只能是地主家发的金锄头了,长工真的是消费不起。

最平滑升级:iPhone 11 pro

没有惊喜也没有意外的升级,从8升级到11之后终于用上了face id 解锁。ios一贯的平滑迁移,让我无缝衔接新老设备。

最轻薄:Chromebook

Chromebook真的是轻,跟Mac book pro比起来跟玩具似的。而且还支持触屏和手写笔做笔记,第一次接触真的感觉不错。不过最后我决定把它换成macbook 的原因有二:chromebook 的触控板太差了;chromebook 没有像alfred 这样的杀手级应用。

最刚需:Ergodox EZ

刚买键盘的时候,同事老秦问我这键盘如何。我说你要是有腱鞘炎的话你会爱死它,你要是没有腱鞘炎的话会恨死它。 现在有腱鞘炎的我已经离不开二狗了,而健康人秦老板买的二狗已经吃灰很久了。

最吃灰:la metric

这东西是我看C菌的视频时种草的,当时特别迷它,买来了之后还给它写了个插件,后来发现因为在家里没有办公桌,最后只能放在那儿吃灰。

最失望:Pixel 3 XL

整体来说和pixel 2 XL 体验一致,而且我那台指纹识别还出现了问题,现在只能用密码解锁手机。各方面和2都没有明显的提升,连挤牙膏升级都算不上。

杂事

与年龄呈负相关的,除了发量还有记忆力
——沃资基硕得

最近事情很多,过年,冠状病毒,封城,隔离,perf,项目……坐下来想写点什么的心思都没有。

本来年初想写个年终总结再加个新年立志,后来想想19年一年似乎也没干什么,职场高光都是在18年了;19年前半年划了四个月的水,又用了半年wrap up,剩下三个月基本上是快放假了划划水。今年回来才体验到due 卡到脖子上急吼吼的拽着同事干活的感受。

再说立志这个事,我觉得除了“我今年想买个XX”之类的愿望值得写,其他的真的都还是憋在自己的日记里吧,要不然等再过个三五年被翻出来批评一番会觉得当年太中二了(画外语:你们有人翻过自己的人人或者qq空间么?)。当然三五年之后有人愿意翻这破玩意也算好的……

最后说说记忆力这个事。我强烈觉得自己是单线程生物,在线程切换这方面不是很好。尤其是并行的项目多了之后经常抓狂。后来跟隔壁的小哥学了一个很好的方法:记笔记……

alright,写完之后继续看代码去了。

代码迷惑行为大赏

人无远虑,必在on-call

纪念从业四年多,整理一个自己写过的智障代码合集

喝假酒系列


class wtf{
    // bala
private: 
    std::string_view name; 
};

// 点评:知道你学了c++17,也不能这么瞎胡闹吧
//(string_view 不拥有string 内容的指针)
void func(){
    std::lock_guard<mutex> a(lock);
    {
        // critical section
    }
    // 2000 行其他逻辑
}

// 点评:很困惑,你是想锁哪部分?
//(a的声明周期“本应该”与critical section一致,但是……)
void func(ptr* a){
    unique_ptr<ptr> a_ptr{a};
    // bala
}
auto d = std::make_unique<ptr>();
func(d.get()); 

// 点评:很常见:写func的和用func的不是一个人,所以没有事先约定谁有所有权。
// 什么?是同一个人?假酒害人。 
void func(){
auto d = std::make_unique<ptr>();

boost::fibers::fiber([&]() {
    d->foo();
 }).detach();
}

// 点评:嗯,这种不太明显的生命周期问题还真的是令人困(抓)惑(狂)

时差没倒好篇

void func(const bool & condition);

// 点评:直接copy bool 可能都比传引用要快
Ptr* func(){
    Ptr object{};
    return &object;
}

// 点评:你的别致很栈啊。
void func(){
    for(int thread_id = 0; thread_id< MAX_THREAD; ++thread_id){
       boost::fibers::fiber([&]() {
          log.info("thread id is %d", thread_id);
       }).detach();
     }
}

// 点评:你会收获很多很多 thread id 为MAX_THREAD 的日志

Fly Alone

原来电影里的都是真的

每年在拉斯维加斯都有一个展销会。我父亲以前是很少去的。自从我来美国了之后,这个展销会却成了为数不多的碰面机会。所以经常是今年我去拉斯维加斯,明年我父亲来纽约。

今年又轮到我去维加斯了。因为之前那次去维加斯没看成什么好的秀。于是这次我提前订了太阳马戏团的KÁ,订好了宾馆租好了车,准备当一次尽职地陪+翻译。

奈何从纽约直飞维加斯的飞机不多,并且为了在他们落地之前我先料理好一切事宜,于是我订了早上6点的机票。如果一切顺利,我会在上午9点左右落在Vegas,提了车子,等他们落地先接他们去吃顿好的,然后去宾馆休息下,晚上再去看个秀。完美。

于是我早上3:30左右起床,洗漱,然后4点多打车去了机场。强忍着困意领了登机牌,过了安检,在候机厅等了半个小时,等到5点多的时候开始有人排队登机了。这里要吐槽一下纽瓦克机场:我的登机牌上写的是Gate 41,然后 1.Gate 41那里没有显示器显示登机航班,2. 他根本没有Gate 41,只有41A和41B,而且是紧挨着的,两边的队伍都连在一起了。当时考虑到这个时间起飞的飞机应该就是我要乘的航班,于是强忍着困意站起来排队。到了我的时候,机组扫了我的登机牌,并挥手让我进去。于是我就进了飞往迈阿密的航班。

本来到这里依然是可以发现我做错了航班的,但是一来我太困了,上飞机就开始睡;二来我本该坐的航班的座位在去往迈阿密的航班上竟然是空的。于是我上机倒头就睡,全程都没觉得有问题。甚至到飞机快落地的时候听机组说local time是9:02 —— 我“应该”坐的那班航班是9:10落地。当时我还庆幸居然提前了8分钟落地。

落地之后我就懵了——怎么是welcome to Florida? 然后急忙忙的开始联系重新订票,联系宾馆late checkin,最担心的是我那语言不通的老父亲要在Vegas等我8个小时(后来远程协助打到了车,入住了宾馆,KA的票也退掉了)。在餐厅的时候还和服务生卖了个惨,她听闻我要在机场等8个小时,送了我一瓶苏打水(同样的招数在想升舱的时候被识破了,并没有任何同情价/折扣)。

最后统计一下,整个损失是:

  • 吃了两顿机场餐(尽管有21块钱的代金券,依然自己掏了20块)
  • 比预期晚了11个小时到Vegas
  • KA秀没看成

整个事件中学到的教训是:

  • 再困也要问一嘴。。。。工作人员都太不靠谱
  • 不要买早上9点以前的机票
  • 随身带switch是我做的最正确的决定。

另:坐上飞往Vegas的航班,点开娱乐系统看电影推荐,前三个里面有两部是home alone。sigh.

Pixel 4 和它的小伙伴们

一个也不能分割

今天美东时间早上十点pixel 4 发布了。与它同场发布的还有stadia,期货耳机,pixelbook go,还有nest home mini。

本来计划看直播的我,因为和同事讨论一个问题,一直到10:40 才开始看直播。20分钟之后,发布会就结束了。开始只以为发布了pixel4,后来重新看了发布会:一个小时里居然发布了这么多硬件产品??

对于pixel 4 本体,浴霸镜头早在8月就在推上自曝了;相关的soc也被各路媒体根据供应链猜的八九不离十;soli(雷达芯片)更是四年前就布好了局。唯独一丢丢让我惊艳的就是手机摄像。居然都能拍星空了!

记得17年在阿拉斯加拍极光的时候。有个老哥吐槽我说:“你用的啥破相机,拍的星星还不如我用手机拍的多”。我看了一眼他的星空照,满屏的“星星”基本全是噪点。这回pixel 4拍出来星空的成图真的很惊艳。还有那个super zoom,真实贯彻了“software defined camera”。

然后stadia,11月19终于能玩上了。(嗯,没了,就这么一句话带过)

google home mini改名叫nest home mini了(那是不是以后要说hello nest了?)。新feature:挂壁。

pixelbook go,据说安全性上提供 titan M级别的加密。多了粉色!

全程看下来,感觉除了Rishi削微有点激情,其他人都在看着提词器念稿。尤其是Ivy,pixel book go 和可再生能源那段看的我尬死了。一个小时的日程安排也是有待商榷:这么多硬件特性,本来每个单独提出来讲讲,发布会摊到两个小时时长都会很好。生生压进一个小时里,感觉就是拿着佛跳墙的料,做出来了个乱炖。

CL描述信息的最佳实践

翻译腔依旧

Change List(CL) 是一个公开的,包含有“修改了什么”,以及“为什么修改“的记录。它会被永久的存储在版本控制系统里。并且,不仅仅是你的组员,其他部门甚至其他公司的工程师也常常会参考这些CL描述。

如果你的CL描述过于含糊,重点不明,或者只是简单的“修复bug”,“重构”,“重排格式”,那其他的工程师将很难通过仅仅阅读CL描述来理解你做了什么。同理,当你在阅读别人的CL时,你也不想每次都阅读长长的代码,而是希望有一个简短精准的描述告诉你他/她做了什么。因此,本文档将概述如何写易读易懂的CL描述。

第一行

  • 简短描述你在CL里做了什么。
  • 完整的一句话,尽量使用祈使句。
  • 后面加一句空行

CL描述的第一行应该是一句简短且具体的做了什么的总结,和一个空行。因为大多时候代码搜索工具在显示历史树的时候,它会显示每个CL的第一行。所以第一行应该具有足够多的信息量,这样其他工程师不必点开每一个CL,阅读它完整的描述才能知道这个CL做了什么。

按照传统,CL描述的第一行应是一个完整的祈使句。比如,说“Delete the FizzBuzz RPC and replace it with the new system.” 而不是“Deleting the FizzBuzz RPC and replacing it with the new system.” 不过,除第一句外,剩下的CL描述不必都是祈使句。

正文应当信息丰富

除第一行外,剩余的描述应当提供尽量多的信息。它可能包括对要解决的问题的简要概述,以及为什么这是最好的方法。如果该方法有任何缺点,均应在CL正文中提及。如果有与之相关的设计文档,bug 号,基准测试的结果等,均应提供相应的链接。就算CL只有一行代码修改,也应尽量包含上下文信息。

最差实践示范

“fix bug” 是一种最没用的CL描述。工程师们无法获知:修复了什么bug?如何修复的?和它一样糟糕的描述还有:

  • “Fix build.”
  • “Add patch.”
  • “Moving code from A to B.”
  • “Phase 1.”
  • “Add convenience functions.”
  • “kill weird URLs.”

上述示例中都是真实案例。这些CL的作者可能相信他们已经提供了有用的信息,但是作为CL,只写这些并不足以让其他工程师们理解上下文。就好比你去读书之前,总是希望书的名字会告诉你接下来你会读的内容,比如《C++算法》就是讲C++和算法的。而《书》,《这是一本书》这种名字无疑会让读者摸不着头脑。

较好的cl描述示范

功能变更

rpc: remove size limit on RPC server message freelist.

Servers like FizzBuzz have very large messages and would benefit from reuse. Make the freelist larger, and add a goroutine that frees the freelist entries slowly over time, so that idle servers eventually release all freelist entries.

第一行用了寥寥数语描述了这个cl做了什么。正文部分描述了它解决了什么问题,为什么这个cl的实现是一个可行的方案,并交待了一些实现的细节。

重构

Construct a Task with a TimeKeeper to use its TimeStr and Now methods.

Add a Now method to Task, so the borglet() getter method can be removed (which was only used by OOMCandidate to call borglet’s Now method). This replaces the methods on Borglet that delegate to a TimeKeeper.

Allowing Tasks to supply Now is a step toward eliminating the dependency on Borglet. Eventually, collaborators that depend on getting Now from the Task should be changed to use a TimeKeeper directly, but this has been an accommodation to refactoring in small steps.

Continuing the long-range goal of refactoring the Borglet Hierarchy.

第一行描述了这个CL做了什么以及此改动与现有方案的不同。正文部分则描述了具体实现的细节,提供了问题的上下文,以及重构后依旧可能会遇到的问题。并且解释了为什么要重构。

小改动也要提供上下文

Create a Python3 build rule for status.py.

This allows consumers who are already using this as in Python3 to depend on a rule that is next to the original status build rule instead of somewhere in their own tree. It encourages new consumers to use Python3 if they can, instead of Python2, and significantly simplifies some automated build file refactoring tools being worked on currently.

第一句话描述了改动是什么,正文则提供了此次改动的背景信息。 这样读者在阅读时即可了解背景而不用去搜索“为什么要把status.py的Build Rule由Python2 更改到Python3”。

iPhone 11 pro 不专业极简测评

真是浴霸不能

自从ip7之后,我觉得换手机已经不再是一个每年秋季的常规活动了。但是随着我64G的手机被app,照片给填满,换手机又成了我今年的非常规活动。

考虑到5G在纽约还没有大面积铺开。以及就算5G彻底铺开了,其对于手机应用的影响在我来看依旧不大。加上我现在一整套苹果的全家桶用着颇为顺手,于是7月份的时候我就已经准备好买个新苹果了。

20号晚上,我终于喜提了iPhone 11 pro AKA 浴霸手机。

先聊几个比较喜欢的地方:对于第一次用刘海屏的我来说,face id的体验真的很棒。再也不会因为湿手刷不开touch id。真的是 盯~ 然后手机就开了。第二个让我觉得惊艳的就是A13,新手机上Lightroom出图真的是秒出。其三就是三摄的13mm广角效果真的是好,有小鱼眼的效果。最后一点就是每次换手机后都会短暂感受到的续航爆发式提升,一天中度下来手机还剩大概40%的电。

聊过了喜欢的地方,再谈谈不喜欢的地方:第一个ios 13上依旧有很多app没有更新适配好,包括schwab 还会闪退。第二是在刘海屏手机上,依旧有很多app没有做显示适配,所以这些app会有诡异的内容被刘海遮挡现象。第三就是新手机真的沉啊,跑步时放在口袋里打的腿疼。最后就是无home键之后很多手势操作我自己还没适配过来,还没有熟悉很多操作。

最后谈一点相对中立的,就我个人体验来看,iPhone 11 Pro的三摄与我的预期相差很远:除了广角镜头之外,另外两个镜头和iPhone 7 的双摄体验没有太大差别。软件层面上的比如夜景模式等体验也很一般,或者说和我的预期有一定的出入。当然,三个镜头调料的参数强一致也体现了苹果强大的工业水平。

Misc

北大的唱歌也挺好听

最近在搞两个事情,一个是买了 LaMetric然后自己写程序,一个是在听《乐队的夏天》。

LaMetric这个东西真的挺好玩的,给大家种个草,很方便用,又可以DIY。遇上我这个好折腾的主,真是一个好玩具。虽然某人一直怀疑我这个玩具的热度会持续多久。

乐队的夏天里有俩乐队我特别喜欢,一个是大家都爱的新裤子,他们那个别再问我什么是Disco太洗脑了,每次想起来就想问啥是Disco;另一个是Mr.Miss,是少见的人声爵士组合。让我这个爵士乐圈外自封爱好者简直浴霸不能。

说到浴霸,iPhone 新浴霸今晚就可以入手了。本来说我已经过了年年追着手机换的岁数了,但是现在的手机只有64G,基本上装几个常用的app + 照片就满了。公司用的软件都装不下。新手机有512G的我估计可以用个三年吧。顺手又买了Apple Care+。这回可以把常用的app,不常玩的游戏都装个爽了。

说到游戏,最近风花雪月通了之后没啥好游戏玩,不过前几天发现逆转裁判更了中文,又有星际锁链,又有各类动作游戏……别人家游戏烧钱,老任家游戏不仅烧钱还伤肝。

顺便,这回可以好好体验一下apple arcade了,然后等到年底又能体验Stadia。嗯不枉我给Stadia修Bug。

众生皆苦

谁也不是草莓味的

我一直就比较喜欢听脱口秀:主题明确;一场大概5分钟;不需要看屏幕,带着耳机听就可以;听完了车也就到站了,不误事。

听的脱口秀多了,我逐渐的理解了“喜剧的内核是悲剧”这句话。

众多脱口秀演员中,我最喜欢的有两个,一个是建国一个是思文。两者共同点是,都十分擅长从生活中汲取段子(当然王建国这个谐音梗真的是……)。两人用脱口秀将当代青年面对的焦虑,压力,人际关系困境表达的淋漓尽致。两者中我更喜欢建国一点,毕竟同是辽宁省出来的,老乡情谊还是有的。

建国又开了一档《隔三岔五国仔饭》。和其他饮食节目要么详细教你做饭,要么疯狂灌鸡汤不同,建国做饭时总是给人一种丧丧的感觉。讲的也都是一些:想做排骨焖饭的是饭菜都在一个锅,可以少洗两个锅;炸虾炸久了就不复炸了,怎么吃不是吃;高汤有最好,没有也不能不做饭是不是等等。很丧很随性。

被各类公众号荼毒了许久的我第一次感觉到了这种丧文化的魅力。也许是每一代人到了30ish都会有莫名的焦虑感。而随着互联网的发展,90后的焦虑感被无限放大扩散了。

第一次和朋友吃饭聊创业的时候,提到到某某创业了拿到了几个M的融资,我说这人运气真好。第N次和朋友吃饭聊到创业的时候,听着各种热钱砸脸的故事,我真的有想过要不要去创业。如果有几个M,是不是房子和未来的孩子教育等等问题都不再是问题。后来和某身价过M的大佬讨论,他说教育投入是个无底洞,几个M丢进去可能连个响都听不到。于是我们又一起焦虑了起来:有钱的考虑财富保值增值,没钱的焦虑如何能有钱。

絮叨了这么多也有点跑题了。从脱口秀到焦虑,诸般种种的缘由还是没能与自己和解。看别人在健身就想到自己肚腩的赘肉;见别人在学习就想起自己一直想要考的证书和没翻过的教材;甚至在朋友圈里看到别人出去玩的照片又想到自己今年尚未度假,随即联想到难做的项目,暂时无望的升职。明明自己尚且年轻,还在学习,有正当职业,却一直对自己现状不满,“想要成为不一样的自己”。

众生皆苦,与其焦虑不止,不如正视自己。既然同样是苦,那就努力去做能回甘的茶——比妄想成为草莓来得实际。

节能环保

环保从我做起

前天上班路过星巴克,想着我(为了拿徽章)已经自愿加入环保俱乐部,于是进去花了20大洋买了个带盖的保温杯。

买了杯子之后,我粗略的算了一下每天大概节约了6个纸杯+小于等于6个的盖子+1个塑料瓶。谷歌说1棵树约等于8000个纸杯,这么一算,差不多3.65年我可以节约一棵树出来。尽我所能节能减排(顺便方便泡枸杞)(真想减排就少吃肉嘛)

很多事情上老美是口号喊的震天响,轮到自己的时候就打脸打的啪啪响。尤其是环保方面。

比如说节能这个事,说实话我几乎每年都能让办公室的空调吹感冒一次。而且偶尔深夜从公司附近路过,尽管楼内应该空无一人,但是整个大楼依旧灯火通明的。很多店铺也是,明明打烊了依旧亮着灯牌。

再比如说浪费,我认识的老美基本都是周末采买一冰箱的吃的,然后把冰箱里上一个星期采买的没吃的但是过期的食物扔掉。而且步行超过五分钟的路程都要开车(当然这个可能更是因为懒),家里没人也要开着空调,等等等等。

当然,环保这个事情更多的是靠自觉了。不说了,待会儿我的枸杞水该凉了……