今天最重要的事,就是跟wenddy谈延长试用期。

显然,这个延长使用期是有我的工作不到位导致的。没有定期跟wenddy进行沟通,也没有定期在团队内组织沟通活动。

看来,形式是弥补日常健忘的好方法。还是要每周有一个简要的站会,给团队创造一个沟通契机。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 沟通契机

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

可能是因为我周五的时候说要一起吃饭,总之今天Deanna就聚会组织大家一起吃饭。不过人来得不够齐。

一开始,Deanna还比较矜持,没有透露自己要搬家的消息。所以说出来的时候,Cyrus表情既吃惊,又有些失落。也许是由于又有一名旧识老友要被迫撤离北京。

话题很快转移到装修的事情上。也许也是我有意引导,为的是给Deanna一些参考。实际上,也没啥实用性,毕竟城市不一样,装修市场的差异可能很大。

最后,这个饭局由于人不齐,意义有些差强人意。

苏菲的感冒进入后半程,想在家瘫着看电视卧床休息。我于是干脆跑公司继续跟GenServer较劲。

昨天晚上已经解决了GenServer接口编程的实现,结果今天一下午都在跟GenServer如何在phoenix中启动的问题里摸索。

结果搜到这样一篇文章How to build a lightweight webhook or JSON API endpoint in Elixir,讨论从无到有在不使用phoenix的前提下实现restful接口。嗯,尤其是lightweight这个字眼,我喜欢。

倒是可以作为一个突破口。

昨天钥匙忘在办公桌上,结果上午被锁家里了,还麻烦苏菲跑回来开门。结果,她的感冒似乎加重了。等下午下班回家,苏菲已经在在家卧床了。

十一点多才到公司。整个下午都在为新疆项目的close烦心。顺手写了这个月的计划,但Nebula的离岗导致计划存在太多不确定性因素,不少工作的进展实际上被挂起了。


中午继续没吃饭,发现其实中午不吃也挺舒服的。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 挂起

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

前天晚上突击回京,结果昨天磨蹭到下午四点才去公司。今天已经没能把作息调整过来,晚上顺势在公司加班了。

新疆项目现场的进展倒是比较顺利,棘手的问题已经大部分都解决了。甲方的测试人员也不再纠结于易用性上的小问题,盯着执行效率做测试。出现的问题变成14个小时的超长数据处理时间。

这个问题,需要详细的日志来分析定位,目前我们在这方面太缺乏日志数据。


中午没吃饭🍚。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 剩下效率问题

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

说起来,确实是今天回到北京的,凌晨一点。

跟乌鲁木齐的两个小时时差,导致我早上四点还很清醒。

于是八点起来坐着晃了几下,还是躺下又睡着了。直到两点多才清醒一些。

然后,中午没吃饭,居然到七八点钟了,都不饿。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 回到北京

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

在现场各种使不上劲,今天同事抵达,越发没有耐心,查了一下机票,发现明天白天的票都要1500以上,晚上的才折到一千以下,当时就觉得不能忍。

现场能用的人太少,大家对于项目实施并没有研究的兴趣,一旦具体执行时,立刻破绽百出。

比如昨天由于客户侧测试人员处理要从数据库中删除几张表,因为我们的功能变更,表结构自然也要更新。结果他们操作完之后功能并没有正常,然后我一脸遭逼。完全不知道从何查起。过了半天,我才想起来确认会不会是数据库搞错了。

同事由于家中急事,匆匆忙忙离开现场,我们并没有针对现场交接有约定的流程,说走就走了。这是第一层问题,说明我在处理工程问题上其实挺业余的。尽管同事可能有较为详尽的文档,但是我既没有习惯问他要,更没有想起来有必要向他要。

另一层是,我应该没被视作“项目实施”人员,所以同事没有交接的“触发点”。但是他走了之后,现场只剩下我一人,而我的表现就意味着是整个公司的表现。从这个角度,“最后一人”应该算是一个触发点了。

同事本身是很有责任感、责任心素养的,但在上述例子中,我们都客观上未做到“尽职”。

其二。目前在现场实际上没有项目经理,所以项目经理该做的事情,其实既没有定义,更谈不上分工,处于完全level-0的状态。

其三。当客户要求上线前要提交概要设计文档、详细设计文档等等项目文档的时候,我也是两眼发直的。虽然说我们开发周期很短,人手又有限,也都知道应该要有这些东西,但是,但是,但是,我们就是在执行过程中完全没有提前准备的任何一点意思。至少就我自己而言,就是这样。

以上,对于我这个随性的人而言,真是沮丧至极。

怎么办?这才是重点。


吴军在《未来科技将走向何处?人类的希望在哪里?》这篇文章里说到的“系统思考的方法”问题,其实始终就是早就明白,却始终处理不好的问题。所谓“执行力差”,大抵就是如此吧。

2016 年,当谷歌的AlphaGo(阿尔法狗)打败李世石之后,世界上掀起了一阵人工智能热,有的人兴奋,有的人恐惧,更多的人是迷茫。

面对人工智能给人类可能带来的冲击,我们不禁问自己:人类过去的长处到底在哪里,以至于我们的祖先在同其他动物以及人类的近亲竞争中能够最终胜出?

人类未来的希望在哪里,我们每一个人在未来的社会中如何能找到自己合适的位置?

我在一次讲座中问听众:“在座的哪一位和剑齿虎搏斗过,如果有,能否把你剩余部分举起来让我看看?如果没有见过剑齿虎,和它们的近亲美洲狮搏斗过也可以。”

当然没有人举手,一些听众会说:“剑齿虎已经灭绝了。”

是的,剑齿虎已经灭绝了,事实上是被我们的祖先灭绝的。这一点说明,我们的脑子远比四肢重要。

至于为什么现代智人的思维高出其他灵长类动物,包括我们人类的近亲,蒙洛迪诺认为,是好奇心和不断从失败中总结经验的本领。

好奇心对人类文明的进程至关重要。在我们过去的印象中,中世纪是一个长期黑暗的年代,整个欧洲,民间除了《圣经》就没有一本流行的书籍。

但是就是在这样的环境下却诞生了现代意义上的大学,这又是为什么呢?

这就要说到人的一个本性了,即对未知世界的好奇和不断探究。

中世纪是一个把精神世界看得比物质世界更重要的时代,精神上的富翁,也就是僧侣阶层,属于第一等级,地位要高于世俗世界的贵族,后者属于第二等级。其他人再有钱,只能算是第三等级。

虽然教会总是希望用正统的思想统一人的思维,但是总是有一些僧侣试图搞清楚从物质世界到精神世界的各种奥秘,并且喜欢聚在一起研究学问,他们可能还会有不少追随者。

前者成为教授,后者成为学生,这样由师生共同形成的团体,就是大学的雏形。大学的拉丁文一词最早是复数,即universities,意思是很多人的共同体,后来才演变成学校这样的专有名词,成为单数。

直到今天,美国大部分大学教授的薪金报酬并不高,但是社会上依然有很多人优秀的人喜欢当教授,让他们做出这种职业发展决定的思想核心是探求未知,这一点和七八百年前的知识阶层没有什么太多的不同。

在《思维简史》这本书中,蒙洛迪诺讲述了很多这一类的例子,从亚里士多德和牛顿这样的大科学家,到古埃及不知名的学者,再到某个想把问题搞清楚的囚徒,都是如此。

在未来的智能时代,计算机可以帮助我们解决问题,却不能取代我们提出问题,也就是说好奇心不仅在人类进化和现代智人形成的过程中起到了巨大的作用,未来依然是我们人类在大自然生存的立足之本。

光有好奇心还不足以促成文明的进步,人类还需要有系统地解决问题,获得新知的方法。

蒙洛迪诺在《思维简史》中,详细介绍了人类是如何从炼金术出发发展出化学,并且逐步认识构成我们物质世界的规律的。炼金术在东西方都出现过,从古埃及到古代中国,从阿拉伯世界到欧洲。

但是,如果没有从玻意耳到普利斯特里,最后到拉瓦锡的工作,炼金术依然是一种巫术,而不会变成化学这样一种实验科学,更无法获得积累性的进步。

拉瓦锡等人超出同时代人的地方在于他们的思维方式和工作方法,使得他们能够通过实验获得新知。拉瓦锡是量化实验的鼻祖,他是一个天平不离身的人,他总是强调没有进过精确的实验,不应该轻易得出结论。

此外,拉瓦锡善于解释实验现象并且指出背后的理论原因,在这方面他给后人树立了很好的榜样。

一个世纪之后,俄国伟大的化学家门捷列夫在前人工作的基础上,提出了元素周期表,他告诉了世人我们这个很复杂的世界其实不过是由几十种(当时只知道几十种元素)质量不同的基本元素构成,而且这些元素的排列很有规律。

类似地,在生物学上,从最早观察到细胞的胡克和列文虎克,到后来提出进化论的达尔文,也是靠着一整套有效的思维方法和实验方法,将生物学和遗传学从无到有建立起来的。

我经常和朋友们讲,人和人之间的差异,首先还不是在学识上,更不是在金钱上,而是在思维方式和做事方法上。自笛卡儿以来,一套行之有效的思维方式,使得发明和发现从过去的偶然变成了后来必然。

挑战极限是人类思维的第三个值得称道的特点。

当我们知道了世界上万物是由不同原子构成的之后,不禁要问那么原子里面是什么,那些更小的粒子如果存在的话,是如何相互作用的。

从普朗克,经过爱因斯坦,到希格斯等人的工作,其实就是在挑战这个认知的极限。每一次,当人类觉得前人提出的问题都被解决之后,新的未知有展现在了我们的面前。

当人类通过实验证实了希格斯关于希格斯场和希格斯波色子的理论,以及爱因斯坦关于引力波的理论之后,人类又发现我们的宇宙中可能充满着观测不到的暗物质和暗能量,它们占据了宇宙质能的绝大部分。

这其实又是人类所需要突破的一个新极限。每一次突破这样的极限,人类的思维就进化了一次。对于今天的和未来的人,应该对世界永远充满这些需要突破的极限而感到兴奋。

事实上,人类的文明史相比地区的历史,甚至相比现代智人的历史,都是非常短暂的,世界还充满了未知。我们完全没有必要担心技术发展太快而会让机器取代我们,事实上我们有太多的事情要做,太多的问题要搞清楚,以至于我们需要更好的技术,当然,也需要更好的思维方式。

我想,好奇心、系统思考的方法(或者说思维方式),以及不断挑战极限的精神,应该是人类立足于世界的根本。

连夜跟Nebula和Deanna讨论了需要解决的几个缺陷问题,细排下来倒好像只需要三天时间就可以解决。倒是让我有些意外之喜,弥补了昨天下午受到的惊吓带来的不安。连夜发了邮件,后面三天每天每个人的安排。

但这个安排显然还是不够精细,遗留了一些细节需要在执行的时候再确定。


下午连上了测试环境,发现数据量问题确实严重影响了地图的效果。

如果不改善,这个功能会很鸡肋。

上午的会两次转折。

一上来谭有些不知从何开始,于是让周先介绍测试情况,于是周噼里啪啦说了一通元数据部分的功能缺陷。尤其让我胆战心惊的是对元数据采集的要求,绕口令一般倒出了七八种不满足。

讨论一番,谭很明智地将重点放在了导出这个我一直忽略的功能点上。这倒是没啥可推脱,尽管我觉得这个功能实际上使用频率也很低。但对于我们目前的底层存储结构而言,直接数据库导出如果让用户自己操作估计很痛苦。

然后谈质量检查。自然,要被抨击现在的使用SQL的方式很别扭,表面上看手动工作量很大。不过讨论一展开,会发现各种表面上看起来的优化途径,都有绕不过去的障碍。虽然主键是可以从元数据中获取的,但关联在RDB中却并不是那么显而易见。当然可以利用值域扫描的方式在一定程度上解决,但对于甲方显然这种方案处于盲区中。更何况还要从一堆字段中选取对人有提示作用的(其实基于元数据做好分类一定程度上也可以做到),对甲方而言更是眼前一黑的无解需求。

谭再次拉回了大家的思路,表示只要改掉几个易用性问题,在后续推广中可保证颜面,即可上线。算是送了口气。

但下午找他要签字确认的阶段报告,显然无法达成。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 总体向好

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

一天时间在等待客户的时间。下午终于明确可以在明天中午过会。

今天意识到数据量导致的版本功能产生大量关联数据的问题。一时没有好的解决方案,看来需要重新审视git模型的长短处,重新思考如何实现底层的存储设计。


于是一天都在TDD,稍微尝到了其好处。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 等待中

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

五点半闹起来,匆忙下楼前打车,等我下楼,车已经到北门了。

于是顺利到机场,还可以不慌不忙在星巴克喝杯早咖啡,走到登机口正好赶上第二班摆渡车。

机上读完了《深度工作法》,是一本小册子,如同预想,能一句话说清楚的事儿,非要写成175页的书,很快翻完。倒是第二版《OKR工作法》穿插着小故事,读起来更轻松,也更容易引发心流。说起来,确实也更让人有实践的欲望,毕竟是团队管理相关。

到了行里,Nebula一下午努力,终于在下班时间把最后一个遗留问题解决。这样明天可以进入到讨价还价的阶段了。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 乌鲁木齐

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

今天给老丈人带了无糖面板,才发现这东西也不那么好买。动了自己做的念头。老龄人消费市场还是有很多可以琢磨的地方。


下午出差的同时准时发起电话会议,不知不觉大家就讨论了3个小时。

版本如何实现,依然没有理想的存储方案。


苏菲跑去看演出了,好像是话剧。等到十一点没赶上末班车,进门就埋怨我没搭理她,导致她走了一站地。

我赶紧给她讲怎么照料那盏鼓槌石斛,结果她毛手毛脚地从阳台架子上摘石斛附着的木板时,还磕在手推车的车把上,瞬间掉了四片叶子。这时候的苏菲,就像犯错的小孩,自己先无比自责,期待你宽慰她。我很高兴有这样的机会,可以“哎呀,你也有今天”地抓住了把柄嘲弄她两句。不能再多,不然就吃不了兜着走了。及时刹车拐弯很重要。对,光刹车还不行,还得拐弯,得转移注意力。

又放了一集《武法律师》。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 无糖面包🍞

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

一早起来,苏菲闹着非要去咖啡店吃早餐,结果先去媒体村那家,人满为患,转到华贸城这边,总算顺了心了。

程序是停滞的,等着中午吃完饭送苏菲去加班,直接去打球。到的时候已经三点多了,上半场结束,于是趁着他们有些乏,我蹭了两局。汗淋漓。不过却没有上次的腰酸背疼。

洗完澡,一直在研究到底是ETS还是Mnesia。七点多又去接苏菲,然后去龙德买鞋。结果发现热风那家店换了位置,并且店面摆设好像outlet,品种都很少。不过苏菲还是在其它店里找到了心仪的。有一瞬间,我心想,今年貌似不能再给Irene送凉鞋了。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 买鞋

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

昨天开会讨论六月份的任务安排。几个比较头疼的事情摆在一起:

  • 大数据量时效率低下,问题主要出在写库一段
  • 版本管理的设计始终存在逻辑冲突
  • 元模型的使用一直是半吊子
gragit
  • 利用git模型来管理graph数据的历史快照。
  • 当前的设计将节点与文件对标,就意味着edge也应该对标文件。
  • 当前的设计将repository与某个sub graph对应,一个应用中基于不同sub graph有若干repository。这种设计导致edge出现在sub的边缘时似乎会出现决策两难。但如果坚持将edge视同文件,那么也没什么问题?
grameta
  • 我们希望通过meta的设置,可以顺次形成:存储结构设置、存储存取设置、逻辑结构设置、可视化设置、交互约束。
  • 存储结构的设置原则:要灵活适应meta可变的情况,最好是列数据库。否则,添加属性最易放行,修改属性涉及细节较多。
  • 可见当存储设施不能很好配套的情况下,需要更有仪式感的设计让meta的编辑更为谨慎,比如专门设置deploy环节,编辑引发的骨牌效应带来的成本显性地归集在deploy过程中承载。并且可以使用table级别的”克隆->整型->替代”过程来保障应用的持续运行。最后可以利用session的迁移,来完成界面层的交互迁移。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: “元语驱动”

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

读这篇文章的时候,不由得让我想起了《西部世界》中对于人的自我意识的探讨。在这部圈粉无数的美剧中,对人的自我意识做了深入的思考。尤其是这种自我意思的来源,是来自于记忆?来自于自我质疑?来自于外部的情景设定?

从“废人”这篇文章来看,人的自我似乎很大程度上被社会文化环境所设定。书全们的境遇,从小注定。可见幼童和少年时期的教育,其实应该是饱览群书为宜,接触世界范围的各种思想,对于正确认识这个世界多么有帮助。

学人说|被称作“废人”的人们

撰文:杨华

责编:刘燕舞

我在南方农村调查时,听到当地人对没有男嗣后裔的农民的评价,说“他们这辈子就废了”。无论一个人再有能耐,只要他没有儿子或孙子,人们对待他无非是两种交叠的心态,一方面同情他,另一方面看不起他。而无论哪种心态,都缘于他是个“废人”。农民要体验人生的意义,在村落里实现生命存在的价值,就得确保有延绵的男嗣后裔,否则就成了废人——一辈子活得没有奔头,没有意义,难以在村落里安身立命的人。

1 讨不到儿媳“死了都不眯眼睛”

60多岁的寡妇秀娘有一个信念,就是累死累活也要将独子养大成人,给他讨上老婆。她对家族近亲、娘家亲戚没有别的索求,就希望能给她家介绍一门亲。但是她也知道,毕竟自己家太穷了,自己又这副邋遢样儿,哪家姑娘会愿意来她家受苦取辱呢。眼看着独子的年龄进入二十二三岁,讨老婆的事连影都没有,做老娘的就越发揪心,湾上的许多妇女都给她家牵线搭桥,但无一成功。且打工浪潮之后,本地女孩几乎都跑光了,而她的儿子却死活也不出去打工,婚姻之事就一直这样悬着。

2007年秀娘被查出重病晚期,本来平常还精气神十足,总有股不给儿子讨上亲誓不罢休的劲儿,但得知自己来日不多之后,整个人立马崩溃得不像样。她对来看望她的家门和亲戚说,“本来活了60多年,也活够了,就是屋里一个老娘没送上山,一个崽没讨起亲,死了都不得眯眼睛!”说得甚是悲凉,令听者无不动情落泪。她死的时候,我的受访人马花刚好在场,她问马花自己还能活多少时间,马花如实告诉她最多还有几天的工夫,她便再次说了上述一番话。说话时她儿子正喂她吃饭,可能是听马花讲后心事加重,加上本来就身体虚弱,一口饭没咽下去,卡在脖子上,顿时眼睛一瞪,断了气,果然没有眯眼睛。

“死了都不眯眼睛”,就是死不瞑目的意思,表明说话者有重大的心事没完成,因而对死亡充满忌讳与恐惧。秀娘之所以死有不甘,不是因为自己才六十几岁远没有活够,主要是她上有80多岁的婆婆还活着,下有二十好几的儿子没有成家。人生的两大任务——生养死葬和收亲完配,她无一完成,哪能平静地去死,哪有脸去见死去的丈夫和列祖列宗,对身后世界有着想象的她,如何眯得上眼睛。

像秀娘这样没有完成人生任务就故去的妇女,意味着她没有实现立命。所谓“立命”,是指农民完成了文化上规定的人生最重要的任务后,能够在村落生活与社会交往中,自觉体验到人生的意义与生命的价值,即到老年之后觉得活了一辈子,死也值得的一种人生体验。具体到老年人,当他们生儿子、实现安身之后,就会把精力放在打造立命的基础上,主要也就是协助丈夫给公婆养老送终,为儿子建房娶妻。

养老送终无非是生养死葬,主要有两大准备,一是为老人置办棺材,一般在老人六七十岁的时候就得办妥,而且多半是由男性老人亲自督办;二是为老人准备一场体面的丧葬,在老人去世前就要着手积攒钱物。这个任务一般较为容易完成。

难办的是给儿子收亲完配,这是人生任务的重中之重。古话说“养崽讨媳妇”,生下了儿子,父母就有义务和责任为他讨回一门亲,老年人操心也主要在这里。建房子只不过是讨媳妇的配套措施,有房子就更容易讨到媳妇。讨媳妇的首要目的是生孙子,为夫姓家族传宗接代。当讨上媳妇,抱上孙子之后,无论是老年妇女,还是男子,心里就彻底踏实下来,意味着人生最后的立命得以实现。

2 有儿子没有孙子也是“多一代来绝”

作为一个农村妇女,如果不出现奇迹,青竹这辈子就“废了”。青竹是因为没能为儿子讨上媳妇而废了,现在开始出现另一种“多一代来绝”的情况,即讨上老婆的年轻人在头胎生了女儿后,不愿意或不能再生,从而造成老一辈人被废。书全夫妇就是这样被废的。

现年57岁的书全、本香夫妇从小学到初中一直是同学,由以前的老同学牵线搭桥成为恋人。1980年他们头胎生下儿子后,接连生下三胎女孩。他们的独子小浪很争气,一路读书不让父母操其他的心,只操钱的心。小浪高考后上了大学,并且毕业分配在国家机关工作,给父母在湾里挣了很大的面子。小浪于2007年找了个女朋友,结婚后并很快怀孕。本香见此当然十分高兴,但她也有疑虑,即儿子是公家人,媳妇就不可能生第二胎,于是本香便患上了媳妇头胎恐惧症。有一次,本香跟儿子道出了心中的疑虑,满腹期待地说,“你阿爸就养到你一个崽,要是xx(媳妇的名字)养个崽就好了,你阿爸这房人也好传下去。”小浪不理会母亲的“老思想”,并反问母亲,“要是她养个女,你难道还会对她不好?”见儿子如此,本香不好再说话。

老天总爱戏弄人,怕什么,什么就紧跟而来。本香的媳妇果然给她生了个孙女。本香对我说,从电话里听到这个消息,她当时就觉得天塌地陷,天大的灾难砸到了她们家头上,什么希望也没有了。她几天后才从懵懂的状态中镇静下来,并很长时间没敢对外人透露此事。同时,她更担心老伴书全受不了打击,会做出什么出格的事情来,但没想到老伴却一脸无事的样子,好像不是他的媳妇生了小孩似的。但是,巨大的变化,乃至断裂正在这个家庭中悄然发生。

变化最明显的竟是平静的书全。孙女2008年出生后,书全变得极其没有耐心,越来越烦躁不安,开始无休止地与本香争吵。从来没有打骂过老婆的他,在半年之内竟然将老婆从家里赶出过两回,每回本香都要跑到大嫂家躲上七八天。最后忍无可忍,本香一气之下跑到媳妇工作的城市打工去了。一个人在家的书全,酗酒更加厉害,并且酒后在湾子里到处吹牛皮、说疯话,湾里人则耍猴子一样地逗他。我每次碰到他,老远就闻到一股酒气,他的脖子总是被酒精熏得红彤彤的。他还不分辈分地对湾子里的小媳妇开些黄色玩笑,让人避之不及。不仅如此,他开始到湾里的寡妇家串门,公开给寡妇家帮忙做事,在湾里传为笑柄。

2009年清明期间,一向对扫墓、祭祖十分积极的书全,竟然在人家都去给祖宗祭扫时,却在家睡大觉。湾里的老礼生质问他连自己的老子老娘都不要了,还算是人吗?他则狡辩说老子老娘都成了一坯泥巴了,还要来干什么。要是放在以前,很难想象这话是从书全嘴里说出来的。

2008年,书全还耕种了几亩田,2009年,他就把所有田地给抛荒了,活像个退休工人,整天在湾里吊儿郎当地到处游荡,无所事事。本香好心好意地劝他,“在家还是要做点事,人家哪个五十多岁的人会在家游手好闲的。”他出口就骂道,“还做?做我条卵,反正(代)绝掉了,(灶)倒掉了,做起来有什么用?”这正是所有绝代人的思维逻辑,青竹、书全莫不如此。

在社会关系上,往年腊月间,只要有人家杀“过年猪”,他就会凑过去帮忙烧火、烫猪毛,他烫猪毛的耐心与细心程度在湾里为人所称道。而2009年腊月,他甚至连自己大哥家都“忘记”去了。他家前几年打了口深井抽水饮用,因为水量大,他便让湾上其他几户人家搭了便车,甚至连电费都不让人家出,因为他家“有个拿国家工资的崽”。但是,在我2009年5月份调查期间,他却无缘无故地不再让人家抽水,理由是“他又不是他们的老子”,令人家十分难堪。

我调查了解到,在孙女出生后的一年多时间里,书全不仅搅乱了自己在村落里的主要社会关系,甚至退出了当地的价值评价体系,成为村落的一个“外人”。我调查期间,他的大嫂当着我的面将他赶出家门一次,另外还明确地驱赶过两次,坚决不让他死皮赖脸地进屋。如今,湾子里唯一欢迎他的是小卖部,因为他每天要到那里去消费一瓶二锅头。

由此可断定,听到儿媳生的是女孩的消息后,表面平静的书全,其实内心已经死却。湾里人都心知肚明,书全之所以会变成这个糗样,完全是绝了后的缘故。媳妇生下女儿的那一刻,就注定了他之后的命运。

我调查的中期,本香从儿媳工作的城市回到家,并不打算再去。本香似乎已经从一年前的阴霾中恢复过来,依然表现出一般农村妇女所没有的优雅与雍容,丝毫不像个绝后的人。但是她的内心却没有这般坚强,她坦言出走打工,其实是极不负责任的表现。她当时有得过且过、舍弃农村这个家的念头,因为只要在村落里呆上一天,自己就要背负“绝代婆”的心理压力,到死都难以释怀。虽然只要你为人好,不与人发生口角,就没有人明着说你,但却骗不了自己,自己从此就是个绝代婆。劳苦奔波了半辈子,最终落个绝代婆的下场,是她内心难以接受的。但她的理智还是控制了情绪,她不能像书全那样把家庭折腾得不像样,自己可以不要名声,但还得为城里的儿子着想——儿子虽然在外工作,但以后每年清明总是要回来的,因而要给他在村落里挣名气;而且,自己与老伴的尸骨总得由家门来捡,因此还必须把家门关系搞好起来。所以,本香决心回来重新打理家庭。

在村落的文化意义上,本香夫妇与秀娘是同样的命运——这辈子废了。如果说本香的情况因为儿子是公家人,尚有些特殊的话,那么村落新一代年轻人越来越不愿多生,并多持生男生女都一样的思想后,他们的父母辈被废的几率就会增加,“晚节不保”也就不再特殊。为了能抱上孙子,晚年不被废,不少婆婆可谓是费尽了心机,但仍不能如愿,于是,最终的立命就成了问题。

但是,在年轻一辈看来,老人要抱孙子、传宗接代是封建思想在作怪,是脑子不开窍的表现,因此他们在“先进”思想的统领下,完全置老人的“落后”思想于不顾,甚至以“先进”战胜“落后”为荣。正如小浪不理会母亲本香的“老思想”一样,其结果是老一辈人必然被名正言顺地废掉,而年轻人却丝毫也不会感知老人被废后的精神创伤,更不清楚老人变化如此之大的真正缘故。大学毕业的小浪,并不知道父亲的变故正是自己一手造成的,还一味地归咎于父亲的嗜酒如命。

新一代年轻人的观念完全转变后,即便没有生育男嗣后裔,也不会有“废了”的感觉。而如今四五十岁以上的几辈人,因为传宗接代思想根深蒂固,着实无法根除,因此,他们辛苦半辈子养儿育女,却可能没有孙子。于是,所做的一切不过是“多一代来绝”,到头来还是竹篮打水一场空。所以,他们很有可能是废了的一代人。

不知道为什么,我一直觉得今天是周五。偶然说给Nebula,他居然说他也这种感觉。

可能前两天的POC耗尽了大家的精力。


几乎花了一天的时间,一直在调试利用ecto写库,结果实际上问题并不在ecto上,而是模型在设置主键字段的时候,字段名写错了。有时候,提词功能一不小心就帮倒忙。


上午来了新同事,有点帅的东北人,姑且称之为峰吧。是产品和市场侧定位,希望能带来新变化。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 有点帅

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

《今日版式》昨天到货,今天出差回来,迫不及待拆开快递包装,结果发现不仅里面用发泡塑料层层包裹,而且书还覆膜。

于是决定明天直接交给最近总让我意外的同事。

等着同事开封再瞻仰吧。

Morning昨晚熬夜一点多把程序写完,估计是想着能争取早点展示功能,结果不幸被jar包中的引用冲突给挡住了。尝试了不少办法,最终通过删掉冲突的所有log包引用解决了问题,但时间也近中午了。

下午等着配出界面来,结果有个参数设置理解错误,导致界面出不来。Morning又是闷头查问题,但很没头绪。后来五点多实在等急了,问了情况,排除了数据问题之后,又是打电话又是跑照片发微信,果然立刻定位了问题所在。

等界面出来之后,客户的人估计是吃饭去了不在,又是一通等。等我们实在熬不住去吃饭,刚开始点菜,又来电话说客户会到单位了。于是立马赶回,终于演示了功能。结束了POC。

一路超速,Morning在副驾上,有几个超车我都有些不好意思了,Morning似乎也没啥反应,也不知是无知无畏还是乐在其中。


这次POC除了感觉到客户方的执行人员的亲和力之外,似乎并没有什么特别收获。

一早五点二十,睁眼随手按了一下ipad的电源键,看到了5:20的字样。

应该起身去看看票有没有抢到,知道大抵是没戏,身子很诚实地一动没动。等听见闹铃,已经是再次惊醒。

赶紧去按掉桌上手机的闹钟,朦朦胧胧看见抢票的进度条还是红的,翻到微信给大家发了消息。

结果,意外地,nebula很快回消息,“那我们是不是就开车了?”

一路上还是比较顺利,基本上没遇到太堵车的地方,主要是东五环两个地段车行缓慢,进廊坊的时候已经快八点,估计是早高峰了,有两个红绿灯比较堵一点。全程一个半小时,基本上是百度地图的预测值。

早起的人迷瞪了一会儿,然后聊了一会儿《傲战法庭》,说了特朗普笑话,大家都会意,居然让他们想到了程序员之间关于花括号是不是重启一行的观点冲突问题,有些没想到。然后听见新闻里说,周六中美达成了一致,贸易战的硝烟开始消散。剧情里外,边界仿佛模糊起来。果然,大家都在一场大戏里。

数据库读取慢的原因找了一早上,没什么头绪,后来尝试着给id字段加索引,恢复正常了,中午十二点十分。

开心地去吃中饭。

中午苏菲终于可以出门的时候,也两点多了。直接去吃中饭,越南粉。

然后苏菲在她中意的咖啡馆干活,我则干脆回办公室,继续调程序。

测试驱动还是有些不习惯,可能是由于测试点设置不合理的原因,经常看不见出错提示。忍不住恢复直接调试的方式,才发现其实问题主要还是在数据准备的格式方面。

一路摸到天黑。总算有些小进展。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 中意的咖啡馆

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

 

  • 创建表
    • table = :ets.new(:buckets_registry, [:set, :protected])
       :ets.new(tablename, [options]),其中options包括以下
    • 表类型
      • set — This is the default table type. One value per key. Keys are unique.
      • ordered_set — Similar to set but ordered by Erlang/Elixir term. It is important to note that key comparison is different within ordered_set. Keys need not match so long as they compare equally. 1 and 1.0 are considered equal.
      • bag — Many objects per key but only one instance of each object per key.
      • duplicate_bag — Many objects per key, with duplicates allowed.
    • 访问控制
      • public — Read/Write available to all processes. (即“无限制”)
      • protected — Read available to all processes. Only writable by owner process. This is the default.(“只读”)
      • private — Read/Write limited to owner process. (“不可见”)
  • 行的设计
    • 必须是元组(tuple),并且总是将第一个元素视作is the key。
  • insert
    • :ets.insert(:user_lookup, {doomspork”, Sean”, [Elixir”, Ruby”, Java”]})
      :ets.insert(tablename, {row data})
    • 使用:ets.insert_new/2可以强制只创建不更新。
  • select
    • 使用key来查询::ets.lookup(:user_lookup, "doomspork"),返回数组
    • 使用value的::ets.match(:user_lookup,{:"$1","Sean",:"_"}),其中To specify a variable in our match we use the atoms :"$1":"$2":"$3", and so on. The variable number reflects the result position and not the match position. For values we’re not interested in, we use the :"_" variable.
  • delete
    • :ets.delete(:user_lookup, "doomspork")

 

 

依据:

  1. https://elixir-lang.org/getting-started/mix-otp/ets.html
  2. https://elixirschool.com/en/lessons/specifics/ets/

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: ETS

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

一早起来,先去楼下星巴克吃早餐,然后再慢悠悠地晃到客户单位,一个早晨难得这般惬意。


上午导入数据之后,就开始遭受数据库查询慢的困扰。一直在找数据库慢的原因,下午实在没辙了,只好先从不受干扰的元数据部分开始展示。

还好,客户周末不加班,我们得以回北京做一些补课的功课。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: POC开始第二天

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

今天是POC的第一日。安装系统。

一开始以为必须使用WAS,后来绕了一圈,装了我们最近一直在使用的环境。还算顺利,比隔壁快了小半天。

遗憾的是我们的功能实现非常不彻底,到处是无法补齐的缺口,小统计一下:

  1. 元数据未能实现通用接口的采集,只能点对点处理。
  2. 元数据版本对比未考虑大数据量情况,导致对比结果无法呈现。
  3. 两个分支的元数据其实还无法实现merge,虽然有接口设计。
  4. 设计中“发布分支”亦未实现。
  5. 未能呈现数据处理流。
  6. 探头与被检视物之间无法查看关联关系。
  7. 规则的可定义的语法体系不完整。
  8. 没有质量跟踪机制。
  9. 缺乏统计手段。
  10. 没有配套的可设置的管理流程。

嗯,一共凑十点。


下午发现自己还没订房间,临时在携程上订了一个。后来才发现,是个“公寓”,那种商住两用的楼里,钥匙可以放在配电箱里留给客人的。morning和macro陪我找了半天,才确定这个公寓的位置。

 

到了廊坊同时才跟我说,下午客户方的接口人不在。

那其实等于啥都干不了。

由于起得早,加上路上有些劳顿?登记住宿之后就头疼犯困,干脆睡了一下午。

结果六点多被叫起来吃饭,才想起来是不是应该安排明天来人。这才发现,明天一早的高铁票居然都没了。只好安排小朋友乘坐K字车前来,路上颠了一个多小时。

晚上试着开始调程序,还是不在状态,几乎没有进展。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 廊坊

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

长春出差的同事在回来的路上很激动,给我打电话,表示对同行的另一同事的想法很不理解。

简单说,相互看不顺眼。

一个自忖经验丰富,自带做项目的精细劲,看不惯粗线条靠想象力做事的售前范。

另一个浮于表面,善于捕捉稍纵即逝的机会,讲究游击作战管杀不管埋,十足的售前范。

没法看对眼。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 激烈冲突

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

几个网站今天都出得晚。

今天剧情里,最让人掉下巴就是老Dores的30年返现的剧情。对于将人的大脑电子化保存,然后再import到电脑中可能会出现什么问题的刻画,非常有实感。很有看点。

这集,Dolores和梅芙这两条线没出现,主要是围绕威廉和阿诺德展开。阿诺德的记忆碎片化,导致难以区分现实和回忆。这个设定也非常心理学。

但是威廉遇到女儿这个设置,明显是要把故事线搅浑。

 

开始启动animats项目。希望能形成一个利用大规模群体的协作行为解决初级智能问题的架构。

从最简单基础的调度问题开始。需要抓住的核心是:利用基于简单规则的多点协作,调整群体整体行为。

当然,目前还什么都谈不上,只是调度snoopy。要达到上面的目标,需要snoopy自身更加的细粒度化,并且各部分可以有跨域的协同和通信。

面临的困难是:参与者的知识准备都不够。解决方法只能是:更清晰的目标,更细碎的前进步伐,更敏捷地试错。

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址: 开启animats

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

从阮一峰的博客拷贝过来。

ESTful API的设计细节,探讨如何设计一套合理、好用的API。我的主要参考了两篇文章(12)。

一、协议

API与用户的通信协议,总是使用HTTPs协议

二、域名

应该尽量将API部署在专用域名之下。


https://api.example.com

如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。


https://example.org/api/

三、版本(Versioning)

应该将API的版本号放入URL。


https://api.example.com/v1/

另一种做法是,将版本号放在HTTP头信息中,但不如放入URL方便和直观。Github采用这种做法。

四、路径(Endpoint)

路径又称”终点”(endpoint),表示API的具体网址。

在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的”集合”(collection),所以API中的名词也应该使用复数。

举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。

  • https://api.example.com/v1/zoos
  • https://api.example.com/v1/animals
  • https://api.example.com/v1/employees

五、HTTP动词

对于资源的具体操作类型,由HTTP动词表示。

常用的HTTP动词有下面五个(括号里是对应的SQL命令)。

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源。

还有两个不常用的HTTP动词。

  • HEAD:获取资源的元数据。
  • OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。

下面是一些例子。

  • GET /zoos:列出所有动物园
  • POST /zoos:新建一个动物园
  • GET /zoos/ID:获取某个指定动物园的信息
  • PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
  • PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
  • DELETE /zoos/ID:删除某个动物园
  • GET /zoos/ID/animals:列出某个指定动物园的所有动物
  • DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

六、过滤信息(Filtering)

如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。

下面是一些常见的参数。

  • ?limit=10:指定返回记录的数量
  • ?offset=10:指定返回记录的开始位置。
  • ?page=2&per_page=100:指定第几页,以及每页的记录数。
  • ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
  • ?animal_type_id=1:指定筛选条件

参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。

七、状态码(Status Codes)

服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。

  • 200 OK – [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
  • 201 CREATED – [POST/PUT/PATCH]:用户新建或修改数据成功。
  • 202 Accepted – [*]:表示一个请求已经进入后台排队(异步任务)
  • 204 NO CONTENT – [DELETE]:用户删除数据成功。
  • 400 INVALID REQUEST – [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
  • 401 Unauthorized – [*]:表示用户没有权限(令牌、用户名、密码错误)。
  • 403 Forbidden – [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
  • 404 NOT FOUND – [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
  • 406 Not Acceptable – [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
  • 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
  • 422 Unprocesable entity – [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
  • 500 INTERNAL SERVER ERROR – [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

状态码的完全列表参见这里

八、错误处理(Error handling)

如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。


{
    error: "Invalid API key"
}

九、返回结果

针对不同操作,服务器向用户返回的结果应该符合以下规范。

  • GET /collection:返回资源对象的列表(数组)
  • GET /collection/resource:返回单个资源对象
  • POST /collection:返回新生成的资源对象
  • PUT /collection/resource:返回完整的资源对象
  • PATCH /collection/resource:返回完整的资源对象
  • DELETE /collection/resource:返回一个空文档

十、Hypermedia API

RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。

比如,当用户向api.example.com的根目录发出请求,会得到这样一个文档。


{"link": {
  "rel":   "collection https://www.example.com/zoos",
  "href":  "https://api.example.com/zoos",
  "title": "List of zoos",
  "type":  "application/vnd.yourformat+json"
}}

上面代码表示,文档中有一个link属性,用户读取这个属性就知道下一步该调用什么API了。rel表示这个API与当前网址的关系(collection关系,并给出该collection的网址),href表示API的路径,title表示API的标题,type表示返回类型。

Hypermedia API的设计被称为HATEOAS。Github的API就是这种设计,访问api.github.com会得到一个所有可用API的网址列表。


{
  "current_user_url": "https://api.github.com/user",
  "authorizations_url": "https://api.github.com/authorizations",
  // ...
}

从上面可以看到,如果想获取当前用户的信息,应该去访问api.github.com/user,然后就得到了下面结果。


{
  "message": "Requires authentication",
  "documentation_url": "https://developer.github.com/v3"
}

上面代码表示,服务器给出了提示信息,以及文档的网址。

十一、其他

(1)API的身份认证应该使用OAuth 2.0框架。

(2)服务器返回的数据格式,应该尽量使用JSON,避免使用XML。

(完)

原创文章,转载请注明: 转载自御风飞翔flying thru wind

本文链接地址:

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)