那年今天:浮生六日

facebook 的那年今天是我最喜欢的节目,谢谢自己当年将 blog 同步到了 fb,所以现在有很多回忆。

2009年2月20日,我曾经写到:

浮生六日

第一日。北京。恭王府外一条小街,停车场旁边,北京炸酱面。和两位一起到北京来的同事,一人一碗炸酱面,就着鲈鱼、羊肉和番茄蛋汤。吃的很饱。窗外是恭王府的高墙,深深。

第二日。北京。簋街,东兴楼。说不上什么风味,可能是我不怎么吃辣的缘故,觉得有点像粤菜,也有点像杭州菜。味道不错,菜量很大。和一位北京的合作伙伴,主要是他说,我听。吃的早,结束的也早,华灯尚未点齐,黄昏的温暖还在身边。

第三日。北京。东四北大街,浙东土菜。味道比较清淡,有家常菜的风味,很喜欢。与一位派驻北京三年的同事小聚,言谈间,几分酸楚,几分怅然。舟车劳顿,不乏,思乡之情,却上心头。

第四日。上海。徐家汇,隐竹,日式料理。喜欢其器皿,精致,典雅。不熟悉,所以友人点的菜,一十八年未聚,左谈人生,右笑当年,中间是诸多的有趣故事。菜的味道应该是不错,有印象的却是食物之外。时间,真是弥足珍贵。

第五日。上海。吴兴路,夏面馆。这是一家性价比不太好的朵颐之处,只因味道着实不错,和一位少时同学在此吴侬之处追忆往日情怀。当年,和他厮混良久,误了一些学习,交了一些朋友。窗外,恰烟雨蒙蒙。

第六日。上海。天钥桥路,麦当劳。一位还有一周就要结婚的同事一起,临着街坐。薯条和汉堡,已然没有十多年前的吸引力,只是便捷一些吧。谈时尚,谈旅游。

吃什么,已经不太重要了。

在意的,是人,是事,是过往,是以后。窗外的风景永远在变,离开的时候,自己也是风景中的人。

在两个城市,和七人吃了六顿饭,不是经常能够发生的故事。

豁然发现,窗外已经是好天气了。

狗年来了

狗和猫是人类最好的朋友,没有猫年,所以狗年感觉上最亲近了。

现在盼望过年和小时候完全不一样了,只是想好好休息一下。

女儿已经很大了,已经知道在12点的时候掐好时间发祝福了。

1998年,在南京东路彼时奶奶的家,年初一,我们聊着相约98。

当时的印象,深刻的像在上个月,而竟然已经二十年了。很难想象二十年,我做了些什么呢?

当年刚工作没几年,后来发生了太多的事情,想起来也不容易,那么多事情,一件件,有的虽然兜了圈子,毕竟从来没有同样的我两次跨过同一条河流。一切都是经历。造就今天。

始终还是比较努力的,虽然不是最努力的那种,天赋也有限。很多事情想想还算好吧,

过去的一年,好几个亲人故去了,于是就只在记忆中了,那些音容笑貌。

以前总在年初一,到奶奶家,几十年,习惯了,却不知不觉中就改变了。

谁其实生活的都不容易,我很多时候的无所谓其实只是早习惯了这样,抱怨和空想,从来都没啥太大用处。

Python 机器学习实战 终于出版

经过了半年的折腾,书终于出版了,因为春节缘故影响物流,京东等要购买的话需要到3月初。

自己再看写的内容,实在有点惭愧,感觉很多问题没有说清楚,有些可以写得更好。整个目录结构也不尽合理。有机会出第二版再修订吧。

总的来说,还算不容易,完成了一个小小的梦想。

2017-2018

中国人总是要到春节才认为是上一年的结束新一年的开始。

每年各种事情都在变化,人们总是说年纪大了,才知道小时候无忧无虑。

我倒觉得也不全是这样的感觉,小时候,其实我们当时烦恼和无助也蛮多的。

所有的拥有和得到,都是恩赐。心态放好。

人生到了一定程度,总是要知道自己适合什么,不适合什么。无所谓多少人喜欢我,我喜欢我自己,我在乎在乎我的人。

这几年自己很努力,当然还是有可以改进的很大空间,继续努力!

过往皆是序章。

 

 

DSL 初步的设计和探索 (3)

DSL 是一个好东西,之前几年零零星星的只是探索,虽然也用在了一些项目中,但是总觉得有些不完美。

首先我们定义了一个 DSL 的语言,称之为 r2,r2的解析是通过一个配置文件来定义语法,r2从某种程度上更像一个命令行的定义工具。

然后我们将 r2的解析器和编译器分别定义为 c1和c2,c1是负责解析语法,根据配置文件,配置文件定义了所有参数的名称、允许值类型、允许值范围等;c1会将解析通过的 r2命令生成 json 格式对象,然后 c2会将这个 json 根据业务场景来生成sql 语句或者 html 等。我们目前的应用场景就是 sql 的生成和 html 网站的生成。

r2 作为 dsl 的问题在于:

  • r2的问题在于虽然形式上和一般的命令行没有差别,但是还是需要学习的。
  • r2的配置文件虽然可以定义各类需要的参数和取值范围,很灵活,但是其定义还是有不低的学习曲线。
  • 因为 r2是类似命令行的方式,所以缺乏基本语言的判断、循环、分支等,更不要说面向对象继承等这些了。

c1的问题:

  • 配置文件随着语法表现力的需要的增强,解析复杂度陡然上升。对于 sql 和 html 这样的互相关联性不强的场景还可以应付,但是如果要把 dsl 用在业务逻辑的描述,c1已经显得有点力不从心。

c2的问题:

  • 目前 c2在实现 sql 和 html 的生成时候,用的是基于模板的配置方式,实现上还是比较复杂的,从中间状态 json 到这些最终文件,这里是借用了一些编译的基本原理,问题是 json 描述 key-value 的确不错,但是对于语法的描述就比较弱了。

综上所述,我们继续探索新的 dsl 的实现方式和更广阔的应用场景。

ps

2015年用了半年业余时间,开发了 r2的定义和 r2c1,然后其他同事继续开发了 r2c2等,2017年,同事们将 r2这个 dsl 模式应用到一些业务场景中,这三年,对我们来说,还是走出了艰难的第一步。从2015-2016年中间,还是浪费了一些时间,当时一些同事对于 dsl 整体的理解或许还有所欠缺。所以不管之后怎么继续,先用这些文字来将思想统一。

舍得

到了一定年纪,在职业生涯中就要开始做选择。

自己,身边的同事,朋友,加人,似乎都在年初年尾碰到了这个问题。

答案也简单。

自己擅长什么,自己喜欢什么。

我几乎已经不愿意做太多挑战了。或许这是消极的态度。

其实我觉得这是断舍离。

很多东西,必须割舍,特别是自己跳起来都够不到的。

鱼和熊掌,难以兼得。

想想2009-2010年那些日子,现在的压力真不算什么了。

2018,注定会精彩,明天,我们会感谢今天努力的自己!

2018 新年快乐

今年跨年选择在名古屋,感受一下异域文化。

现在也越来越多思考人生此刻和下一站的意义,或许豁然开朗,或许还是稀里糊涂。不管怎么样,都挺好的。

在名古屋的吉卜力共和国商店很感触,十几年前喜欢宫崎骏喜欢的不得了,当时对天空之城、千与千寻、幽灵公主等都很着迷。

2018 新年快乐!所有我的家人、朋友!

还是选择放弃使用 Eve 作为 RESTful 框架的选择

虽然,Eve 框架很强大,也是基于 Flask,但是我还是选择放弃使用 Eve 了。几点原因:

  1. Eve 内置直接支持的数据库是 Mongo,我们已经不准备在 Mongo 上投入资源了。
  2. Eve 对额外的数据库的支持需要通过 eve-sqlalchemy,来调用 sqlalchemy 和 flask 等,这样就把问题搞的有点复杂化了。等于 flask、sqlalchemy、flask-sqlalchemy、eve、eve-sqllchemy,组合在一起,才能通过 orm 来支持各类数据库。
  3. Eve 的使用还是非常复杂的。
  4. 比较下来 flask-restful 框架就足够了。

flask-restful 框架通过将 class 直接转换为 RESTful 接口:

# Todo
# shows a single todo item and lets you delete a todo item
class Todo(Resource):
    def get(self, todo_id):
        abort_if_todo_doesnt_exist(todo_id)
        return TODOS[todo_id]

    def delete(self, todo_id):
        abort_if_todo_doesnt_exist(todo_id)
        del TODOS[todo_id]
        return '', 204

    def put(self, todo_id):
        args = parser.parse_args()
        task = {'task': args['task']}
        TODOS[todo_id] = task
        return task, 201

用类似下面的方法就直接 ok 了

##
## Actually setup the Api resource routing here
##
api.add_resource(TodoList, '/todos')
api.add_resource(Todo, '/todos/<todo_id>')

对于上面 Todo 这个 class 中数据怎么来,这不是 flask-restful 关心的,我们可以使用 flask-sqlalchemy 来完成这些和数据库操作的真正业务逻辑。

我一直觉得选择 flask 是正确的,它在很多理念的设计上也像微服务框架,每个人做好自己的事情,互相有一个约定来达到协同。

从 git 仓库看,flask-restful 的更新也还不错。

当然用了这个的话,Eve 框架很多强大的比如根据配置文件就能生成接口的能力,就要自己想办法了,初步考虑因为整个这些探索和设计都是为了自动根据数据库来生成 RESTful 接口程序,所以可以使用 DSL 来描述接口要求,将 DSL 转换为基于 flask 体系的 python 程序,来达到这个目的。

和美剧人物撞衫了

好像是前年在 amazon 上买过这件 tee,没想到在最近看的美剧 Salvation 救世 中看到了。也难怪,这个角色(也算主角之一吧)的定位就是一个极客,专注于技术而不太懂别的。我大概也是属于这个类型的。

这个 tee 都是纪念摇滚音乐,所以我也很乐意看到,JOY DIVISION 被翻译成:任逍遥。

Lazarus 1.8.0 发布

基于 freepascal 3.0.4 的 Lazarus 1.8.0 在12月初发布了。比较了 Delphi 之后的 GUI 开发工具,特别是在用 Python 的时候,也很不死心的想看看怎么样用 Python 来开发桌面应用,不管是基于 Qt,或者 Python 自带的 Tk,都一般吧。或许 Delphi 曾经太强大,已经超过了同时代的所有产品。VB 我已经要二十年不使用了,不知道如何,dotnet 架构现在应该也可以运行在 OSX 下了。

虽然 gdb 的安装还是很奔溃,Borland 当年的 Turbo C 2.0 横空问世现在想想是一件很恐怖的事情,在差不多20年前的电脑上,Delphi 可以几乎几秒就完成一个程序的编译。如果没有 IDE 的话,我们要耗费多少时间在安装、配置以及每次冗长的编译过程。其实 Delphi 还是占据了当前开发市场不小的份额,不过,太贵了。

偶尔如果需要写一些跨平台的小工具,那么 Lazarus 或许是不错的选择,Lazarus 的风格还是像一个增强版的 Delphi 7,不过也的确够用了。

最关键还是配合 Lazarus 和 FreePascal 背后的这些程序员、项目组织者,很不容易,坚持这么多年,逐步完善。