环保从我做起 前天上班路过星巴克,想着我(为了拿徽章)已经自愿加入环保俱乐部,于是进去花了20大洋买了个带盖的保温杯。 买了杯子之后,我粗略的算了一下每天大概节约了6个纸杯+小于等于6个的盖子+1个塑料瓶。谷歌说1棵树约等于8000个纸杯,这么一算,差不多3.65年我可以节约一棵树出来。尽我所能节能减排(顺便方便泡枸杞)(真想减排就少吃肉嘛) 很多事情上老美是口号喊的震天响,轮到自己的时候就打脸打的啪啪响。尤其是环保方面。 比如说节能这个事,说实话我几乎每年都能让办公室的空调吹感冒一次。而且偶尔深夜从公司附近路过,尽管楼内应该空无一人,但是整个大楼依旧灯火通明的。很多店铺也是,明明打烊了依旧亮着灯牌。 再比如说浪费,我认识的老美基本都是周末采买一冰箱的吃的,然后把冰箱里上一个星期采买的没吃的但是过期的食物扔掉。而且步行超过五分钟的路程都要开车(当然这个可能更是因为懒),家里没人也要开着空调,等等等等。 当然,环保这个事情更多的是靠自觉了。不说了,待会儿我的枸杞水该凉了……

Read More → 节能环保

白毛,粉毛,蓝毛——我全都要 上周五出了火纹新作。本来我对这类SLG游戏是不感冒的,但是最近没什么能玩的好游戏,于是咬咬牙买了首发。 周五晚上先是和两个前同事吃了饭,接着在法拉盛买了很多零食,最后带着奶茶和零食回到家里猫在沙发上打开了刚刚可以玩的火纹。 三个小时后,嗯, 真香。 小时候我也玩过GBA上的两作火纹。奈何那时候由于智商没发育完善的原因对于这类策略游戏很难上手。当然现在是对于策略类和动作类都苦手,因为又蠢反应又慢。由于那时候是用烧录卡玩的,并且烧录店的老板是我熟人,于是我自动获得每周可以免费烧新游戏的特权——火纹在我的烧录卡里活了一周,就被双截龙代替掉了。 上了大学之后因为学校有各种资源站,我尝试了各种类型的游戏。古剑奇谭,老滚,等等。尝试了很多游戏之后,对于很多人热捧的开放世界我完全提不起兴趣:一来开放世界让我觉得缺少目标,二来是我有点轻微完美主义的倾向,近似强迫症的想要清空任务列表,结果就变成了疯狂去接各种重复的支线任务。唯独对与射击类和跳台类游戏情有独钟。 工作之后,因为能玩游戏的时间少了, 并且大多空闲时间是在通勤的路上。于是开始玩起了一些手游。后来是因为怕自己英年早得颈椎病,手机举太高又累,就停止了手游之路。此外手游上大作没法玩下去,因为信息啊,推送啊会持续打断游戏体验,小作比如2048这种玩多了就很无聊。 再后来出了NS,这简直是通勤神器:回家了安在TV set上就可以继续玩主机大作,出门了拔下来就可以边走边玩。 之前我和朋友也在讨论,未来的娱乐形式是什么样的。像Netflix颠覆了VCD/DVD产业,VR正在慢慢占领客厅,手游把娱乐空间从客厅拓展到了室外。 但是不管未来娱乐会成为什么样的形式,火纹真的是个好游戏。

Read More → 火焰纹章

景美 人黑 地动 赶着六月底去了趟加州,开了一趟鼎鼎有名的一号公路。其实16年就想过去自驾一号公路,但是当时由于泥石流导致一部分公路封锁,所以一直推到19年才成行。 在翻阅了大量文献(游记博客)之后,我们的路线就是 SF -> Monterey -> San Luis Obispo -> LA. Day 0 MTV, SF 到了加州的第一件是就是拜山头了。上午去见了几个朋友,顺便朝圣了一下,去了Google MTV 办公室和Apple 总部,还买了俩文化衫。 下午去到了SF。走了趟九曲花街,看了看海边和金门大桥。除了流浪汉太多,不敢随便停车(怕被砸车窗)之外,整个城市还是很漂亮的。 Day 1 Monterey 第二日一早,起床洗漱退房后,我们驱车前往蒙特雷。途径了鸽子灯塔。蒙特雷是一个民风淳朴的小镇(也就是看起来没有那么多的流浪汉)。17英里路景色是相当好看了。海边还有一个叫做情人点公园的地方,值得一看。 Day 2 San Luis Obispo 驾车4个小时左右,我们从Monterey开到了San Luis Obispo。途径有名的大索尔[桥山],还看到了号称全球唯一一个海边瀑布。大索尔山附近的盘山路真是山路十八弯,开下来就觉得隐隐作呕,司机也晕车。 Day 3 LA 大概开了两个小时左右就从SLO开到了LA。说实话这段路上我见到了这辈子最多的房车。路边满满的停着大的小的各种类型的房车。看来喜欢去沙滩过夜真的是老美的癖好,难怪沙雕这么多。相比于SF,LA 的流浪汉更多。我们游览的麦克阿瑟公园已经完全被流浪汉占领,星光大道上也尽是流浪汉和他们带来的尿骚味。 甚至于我都不敢拿出相机,只好手机拍了几张照片草草了事。 Day 4 Redeye, Earthquake 最后一天我们逛了逛LA的景点,然后赶到机场准备登机。为了红眼上能好好睡一觉,我在酒吧点了点啤酒。刚喝了半瓶下去就觉得浑身发抖,头很晕。花了十几秒我才反应过来不是我喝多了,而是地震了。过了大概十分钟,收到了消息说是7.1级地震。嗯,充分感受到了LA的热情 经验总结 自驾的话,宾馆一定要选好一点的,带免费停车的。防晒霜要涂好,建议全程戴帽子,穿防晒服,这样可能回晒得少黑一点。停车尽量停室内,或者买全险。

Read More → 一号公路

蹭热度一时爽,一直蹭一直爽 昨天FB宣布了他们自己的数字货币Libra 币。各路新闻纷纷报导顺带着把FB的股价推高到了194。昨晚的新消息是各路机构开始呼吁要对Libra加强监管,审查等,又把股价拉了回来。 那么问题来了,要知道市面上各种币数以十万计,为啥偏偏Libra币就能突然爆火?就凭他爸是FB? 简单来比对一下Libra币与其他数字货币 储备金支持 数字货币被人诟病的问题之一就是背后缺少储备金支持,导致空气币满天飞。这家吹完自己的一个币能够在北上换一套房,那边就敢吹自己一个币就能让马一龙带你去火星转一圈。与之相反Libra背后有着储备金的支撑,换句话说就类似你把钱存进银行,你的账户上多出来的数字是有着真正的金钱对应的。所以风险相比其他数字货币低很多。 稳定币 Libra号称稳定币,会与当地法币依一定比例稳定兑换,因而相比比特币更具有交易属性。比特币的波动性使它的投资(机)属性远大于交易属性 挖矿 根据白皮书所说,Libra Coin 的唯一获取途径就是通过法币向Libra 机构购买(是不是很像Q币?),并且销毁途径是用Coin从机构回购法币。而非比特币通过奖励的coinbase来增发新币 交易速度 未见白皮书披露Libra具体交易速度,但是第三节开头有提到可以支持十亿级用户量交易。相比,比特币的每笔交易需要经过约一小时的时间来确认交易记录在主链上。因而Libra相比比特币更具有日常交易属性。 匿名 与比特币一样,所有账户均为匿名 去中心化 虽然Libra标榜自己去中心化,但是从其白皮书而言,我个人的感觉是它更类似于以寡头(机构)为中心的“伪去中心化”数字币。原因有二:一,寡头完全掌握铸币权二,白皮书并未披露如何决定所提到的Libra 币与当地法币兑换比例,但推测应有寡头(机构)决定。 从此两点来看,寡头(机构)在Libra币交易中充当一个“应被绝对信任”的角色——有权发币,有权定价。 无国界货币 Libra在发布初期,构想是做无国界货币。最终目标是一处换币,处处潇洒。主要受众大多是移动支付不发达,本地法币波动性大,甚至不存在银行的不发达地区。但是考虑到如果一个地区落后到不存在银行,它的配套设施(网络,带宽,线下购买渠道)很难支撑Libra交易。很可能会面临的一个局面是:发达国家用不着(有自己的联储,货币保值),落后国家用不起,发展中国家不敢用(想想97金融危机?) 监管 白皮书未披露如何监管交易/账户/外汇。这也是很多人对Libra不看好的原因——技术并没有重大突破,瓶颈在于如何通过监管许可。 总结 从Libra的描述上来看,FB对Libra的构想是它能够成为新一代的交易货币而非比特币之类的投资大于交易的投资商品。如果Libra能够解决监管上的问题,那么其未来不可限量。否则,可能只依靠FB的噱头赚一下眼球,然后泯然众币矣。

Read More → Libra 币

vim是编辑器之神,能用好的都是神 第一次接触vim是在大二的时候吧,当时是 Micheal@ 给我演示他如何使用vim写程序。对于用惯了visual studio 2008 一键编译,一键调试的我来说,一个在命令行里黑洞洞的编辑器,一个用h,j,k,l来移动光标的编辑器实在令人提不起兴趣。 后来因为某些原因需要在服务器端来写代码(大多是配置文件),所以稍微学了一下如何使用vim。但是极高的学习曲线、各种蜜汁plugin,让我还是止步于快捷键组合vim infant 的程度。当然对外我还是自称是重度vim user——毕竟相比nano/emacs,我只会用vim。 再后来,第一份工作的时候用的是windows + visual studio 2015,这个在win下堪称完美的组合直接打消了我用vim的想法。尤其是vs2015 在当时是写C#的无二利器。第二份工作倒是基本上在服务器上鼓捣代码了,不过处于某些原因,很多vim 的插件没法安装。强上vim,很多时候效果还不如用sublime 来的好。后来我的主力开发工具就成了vs code + sftp。大多数时候这套组合能够满足我的需求;少量时候需要手动多操作几个步骤但也无伤大雅。 再再后来,也就是现在,因为Google内部对vim的支持比大部分编辑器都要好,在 秦大哥@ 的帮助下我终于算是完整的建好了自己的vim 配置;装了足量的插件;并配置好了诸如lsp等等工具。好好体验一下这个跟我同岁的编辑器的真正的抛瓦!(然后顺理成章的划水了一天)。

Read More → Vim SoftCore Player

‌软件工程师不懂硬件维护 最近家里有俩硬件出了问题,一个是马桶不停的漏水,一个是门锁有点问题。于是在查阅了各种攻略教程之后,在亚马逊上下单了“智能”门锁和一个马桶的衬垫。 说起这个硬件维护啊,软件工程师还真是不擅长。按图索骥撞上了门锁,用钥匙一试,装错了(多转了半圈,结果门锁不上)。拆下来重新装之后,发现门内的把手装倒了。三装两拆之后,终于把锁装好了。马桶的衬垫也是费了很大的力气,先拆下来各种部件,再换上新的衬垫,然后用更大的力气再把它安装回去。 估算了一下这些东西,要是找bumper 或者 locksmith,没有个300块应该下不来。顿时有一种赚了300块的感觉。这可比码工时薪可高太多了。 最后,愿你的马桶永不漏水,锁眼永不卡断钥匙,阿门。

Read More → 修马桶与换门锁

21天是肯定没法学会C++的。22天也不行。 C++11里引入了一个新的概念 :移动。 这个概念说简单其实很简单,因为它是介于拷贝和引用之间的一种概念。但还是有很多小伙伴表示不理解移动到底做了什么,如何理解移动。 要想理解移动,先来介绍一个概念:左值与右值。 左值与右值 笼统来讲,左值就是能够对其取地址的值。反之就是右值(临时变量也是右值)。比如1, 2.0, true, nullptr这种纯值类型,就是妥妥的右值。再比如 int a = 100; , a是左值,100是右值。在给a赋值的过程中,我们将右值拷贝到了左值。(其实并不是完全这样,编译器会做一定程度的优化,但为了方便理解,我们不考虑编译器的功劳) 两个栗子 在早期C++里,我们通常用指针或者引用来传递一个‌大变量,因为可以避免一次拷贝的开销。第一个栗子:如果我们有一个比较大的右值变量,我想将它传递给其他的函数,该如何避免/减少拷贝的开销呢?比较熟悉的朋友可能会说,我们可以传递 const & 来避免拷贝的开销。 没错,在C++11 之前,const & 可以对右值直接取引用。这样我们可以传递引用来避免拷贝的开销。那么下一个栗子就是,如果我们有一个比较大的右值变量,我想将它传递给其他的函数,‌又想要修改这个右值变量的值,该如何避免/减少拷贝的开销呢? C++11 提出了一个概念:右值引用。语法是两个&。 它允许我们对右值进行直接引用。 移动 理解了右值之后,我们来思考一个问题。当我们进行赋值语句时,其实是构建了一个右值,然后复制给了左值。那么有没有花销更小的方法呢?答案就是移动。 熟悉C++的都知道C++中有构造方法。构造方法又有拷贝构造和赋值构造两种特殊的构造方法。C++11提出了新的构造类型:移动构造。也即方法接受的参数是一个右值,然后通过移动的方式,减少拷贝与销毁的开销,实现资源的转移。样式为: Type::Type(Type && rval) 另一个作用就是,std::move在移动的时候,可以 剥夺原变量的数据所有权。通常进行所有权转移时我们会显式调用std::move 方法。 以vector来举例。 联通 C++ 11 中的移动语义使得我们在构造临时变量,减少构造与析构的消耗,并且可以显示表达所有权的转移。既增强了代码的运行效率,又增加了代码的可读性。 move不产生新变量,它只是c++的搬运工。

Read More → std::move

科技博主来蹭政治热度了 昨天收到了一个朋友的微信消息: XX,请教你下,这次Google禁华为,到底是哪些功能不能用了?我没大看明白:一个是以后的OS都不更新?然后所有Google 的apps 都禁止下载?那访问呢,比如已经下好的apps? 为了防止消息不准确造成的错误解读,我是等到了今天白天看了一圈新闻之后才打算写这个博文的。 首先回答下小伙伴的微信: 哪些功能不能用:Google play,GMS 等Google原生的app 以后的OS都不更新?:不,按照现在的Android 开源授权,依旧会有更新,只是没有办法预览新系统。 所有的Google apps都禁止下载?:应该是 访问已经下好的apps?这点没有任何确认的消息,有可能已经存在的app可以继续使用,也有可能无法访问服务器了。 接下来谈一谈短期与长期的影响。 短期影响: 对于国内来说,这个短期内几乎没有影响。毕竟国内用不了Google 全家桶这已是既定事实了,那官宣不支持也没有什么大影响。毕竟大部分服务在国内已经有了本土化的替代品。而从操作系统上来说,Android 是开源的,所以华为短期内依旧可以用Android,受益于Android生态。 对于国外来说,这个影响就比较大了。不能用Google 全家桶的Android 手机基本上就是一个只能打电话发短信的功能机了。而且在国外又缺少一套完整的可以替代Google 全家桶的生态,所以在欧洲等地,可以预见华为手机销量的下跌。 长期影响 长期来说,没有了官方合作关系,那么华为没法获得新系统的官方支持、预览等。适配等工作都需要正式版系统版本发布之后才能进行。换句话说,可能一加都已经用了半年的新Android,华为这边才适配好。另外Google也随时有可能更改开源授权来彻底禁止华为使用Android,所以长期来看对于华为影响还是很大的。 但是从好的方面来看,华为的技术独立准备的相当充分。方舟,海思芯片,自研OS等都表面了华为“高筑墙,广积粮,缓称王”的战略思想。也许经此事件,华为 OS会成为第三大移动操作系统。 科学没有国界,但科学家有祖国。同样,技术无国界,但公司有国界。祝愿华为手机继续大卖,技术独立。 最后不替东家洗个地:你们知道Apache也对华为停止合作了么?

Read More → 华为手机

没错,技术博主开始写技术文了 从我开始学C/C++的时候,指针和内存管理就是最让我头疼的东西:要么是忘了释放内存造成内存泄露,要么是多重释放造成了访问失败。甚至有些时候一个方法有多个返回语句的时候还要在每一个返回语句前释放一下内存。当时就在想为什么不能像Java一样有一个智能的垃圾回收器,来管理所有的内存呢。 这个痛点一直困扰到我开始学STL。原来STL早就考虑到手动释放内存的繁琐,所以提供了多种智能指针:auto_ptr, unique_ptr, shared_ptr, weak_ptr,并引入了“所有权”这个概念。大大简化了工程项目中的内存管理。也让我意识到我学的是假C++,真C(菜)。 所有权 单一所有权 两句话:所有权的拥有者有义务释放内存或转移所有权。同一时刻只会有一个所有权拥有者。 共享所有权 和用裸指针一样,所有权的拥有者不必负责释放内存,引用计数器会负责释放内存。同一时刻可以有多个所有权拥有者。 unique_ptr 重要的事情说三遍: unique_ptr 不能被拷贝 unique_ptr 不能被拷贝 unique_ptr 不能被拷贝 unique_ptr 的所有者即为单一所有权的拥有者,因此它无法被拷贝。如果需要转移所有权,需要显示调用 move(unique_ptr) 来转移 或者 unqie_ptr.release() 方法放弃所有权。在生命周期结束时,若 unique_ptr 依然是所有权的拥有者,它会立刻释放掉对应的资源。示例: 与裸指针不同,单一所有权明确了资源的所有者,确定了资源该于何时被释放,增强了代码的可读性。当然,传递 unique_ptr 引用这种合法不合理的事也别干,要么直接 move 过去,要么只提供 unique_ptr.get() 但不转移所有权。 小惊喜:试试 std::set<unique_ptr>,有惊喜。 shared_ptr shared_ptr 在使用上更像裸指针,不同的地方就是它内部有一个引用计数器,记录了有多少共享所有权的拥有者。当计数归零,它会自动释放掉资源。它的优势是比 unique_ptr 更灵活,在很多需要共享资源的场景(比如多线程共享物件),它符合场景的需求。并且活用 shared_ptr 的最后走的人关门特性,在某些多线程应用的场景里可以实现会话结束通知,更新标记等功能。 彩蛋: const unique_ptr<T> & make the world a better place

Read More → 所有权与智能指针

与麻将,北美玩家的周末三俗活动系列 我常常自诩是一个桌游爱好者,尤其是卡牌类游戏,从3C到三个杀都玩的还OK。唯独有一类桌游我特别不擅长,就是狼人杀这类开局一张嘴,游戏全靠编的(好吧,如果算上麻将的话是两类)。 上周接触了一夜狼人杀,游戏体验嘛,很一言难尽。比起狼人杀,它解决了第一轮被杀的玩家冷板凳的不良体验。但是对于新人来说,尤其是村民身份的时候,大多时候都是一种“我是谁?”“我在哪?”“我在干嘛?”的状态。加之缺少狼人杀每轮死掉一名角色的“确定”证据,整局游戏就像在猜薛定谔的身份。 职业所需,我经常要梳理清别人的需求并且上下文代入以便分析问题。这使得我从习惯上会假定别人说的都是对的,然后就被带到沟里了。再加上不擅长嘴炮类游戏,常陷入一种唉听着这个人说的有道理,下一个说着与之相反的逻辑,听听也挺在理。最后看谁说的都有道理,只好finger cross & “跟谁熟就跟谁投吧”。 啰嗦了这么多,归根结底还是理工男讷于言敏于行且不善打嘴炮的美德导致我没有很擅长这个游戏(对,真的不是我菜,是这游戏不是我的菜)。

Read More → 狼人杀与一夜狼人杀