开始一个新的项目

最近公司 IT 建设速度明显加快了,上周开始业务中台的需求启动,今天 DevOps 的计划也准备开始试点。

有时候想想,学习编程已经三十多年了,小学时候的 Basic,初中时候沉浸在 LOGO 语言中,以及后来的 dbase 和 foxbase 这些。五年前的技能都被淘汰了,IT 世界发展的太快。但是这份初心却始终不变。我还是很喜欢编程。所以就继续喜欢吧。有时候很多东西难以说清,或许就是那么多年了,即便我没有太高天分,也毕竟花费了这么多时间和努力,总不至于太差。

开始一个新的项目,查了一下版本记录,最早是2016年4月就开始研究了,思考了那么久,还是要给自己一些压力。之前的 fish_base 项目功能虽然简单,但是从 sphinx 文档到之后 CI,都在努力学习中,然后这个项目也准备做的好一些,之后能够开源,让更多人收益。做一个基于半自然语言的报表生成工具、数据分析工具。

PyCharm 2018.1 新版本发布

PyCharm 2018.1 新版本如期而至。

对于 Python 3.7 的支持,比如 dataclasses。

更加智能的代码提示。

对单元测试更好的边栏支持。

科学研究模式可以运行部分指定的代码。

通过 conda 环境来支持建立一个科学数据研究项目。

Flask CLI 的支持。(Flask 在目前版本支持 Click 的命令行功能,现在 PyCharm 直接支持 Flask CLI 的调试了)

对于 TypeScript 2.7 的完整支持。

版本管理支持部分提交、更好的 rebase 支持。

远程开发方面支持更容易配置的基于 SSH 的 Python 调试器,提高了对于 Docker Compose 3.3 的支持。

PyCharm 包含了 JetBrainstorm DataGrip 的所有功能。

一直感觉,PyCharm 已经是非常完美的工具,甚至觉得它的功能太多了,已经复杂的很,没想到,依然继续提升,继续跟进所有的技术开发潮流。佩服!

Python 机器学习实战 终于出版

更新:京东购买本书的链接: https://item.jd.com/12289823.html


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

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

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

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 整体的理解或许还有所欠缺。所以不管之后怎么继续,先用这些文字来将思想统一。

还是选择放弃使用 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 程序,来达到这个目的。

Flake8 Rules

The standardization of writing in programming languages is very important, good programming practices can prevent a lot of bugs.

Python is a language with more freely formatting, so it’s important to follow the famous flake8 rules.

The following article explains in detail every rule of the Flake8, it’s worth learning.

The Big Ol’ List of Rules

I like Pycharm because it can automate monitoring of these rules, so we can write the elegant Python program.

Pycharm 2017.3 发布

我始终认为用敏捷开发的方式持续升级是一件很恐怖的事情,因为不断的提升功能和性能同时又和市场贴近,产品就会非常有竞争力。

Pycharm 就是这样一款产品。Pycharm 2017.3 今天正式发布了,这次主要提升的是各类性能、科学计算、Rest 调试工具等,详细情况可以到 JetBrains 官网查看。

https://www.jetbrains.com/pycharm/whatsnew/#v2017-3-python

最近开始尝试用 Go 语言来进行服务端的测试,我始终不太喜欢 Java 的啰嗦。JetBrains 的 Go 语言工具目前还是在测试中,希望能够尽快提升功能和稳定性,现在这样一个月一个的早期测试版本使用起来也不是很方便。


I always think it’s a wonderful thing to keep upgrades in an agile way, because of the continuous promotion of features and performance and the close to the market, the product will be very competitive.

Pycharm is such a product. Pycharm 2017.3 was officially released today. The main promotion is all kinds of performance improved, scientific computing, Rest debugging tools, and so on. The details can be examined on the JetBrains website.

https://www.jetbrains.com/pycharm/whatsnew/#v2017-3-python

Recently I started trying to test writing server with the Go language. I don’t love Java verbose. JetBrains’s Go language tool is still in the early beta test, hope to improve the function and stability as soon as possible. It is not very convenient to use an early test version that I need update every month.

 

Flask, Sanic and Eve, Three Good Web Frameworks For Python

Prepare to improve my English writing ability. I know my English is very stiff, grammar also has many problems. But I still try to persist it. Thanks and sorry for my poor English

In recent years, the performance of Python has been greatly improved. Base on highly asynchronous event processing ability, web framework of Python have been greatly improved. After continued follow-up.  I think the following frameworks are worth future study.

In normal working hours, We use Flask as a web service framework. So I have some preference for flask-like type.

  1. Flask. http://flask.pocoo.org/  We all know, flask has long history and has stable performance. It’s a micro framework and has a lots of extensions. So it’s lightweight and configurable. I believe we will continue to use flask as the mainly web service framework for a long time. The latest version is 0.12.2.
  2. Sanic. https://github.com/channelcat/sanic This is a magical tool, it’s improve the web service performance by using asynchronous technology by Python 3.5+. In practical application, I think flask is enough. Flask can easily do hundreds concurrent in basic server on the cloud. But I believe it, The performance improvement is endless. In particular, the introduction of more and more Micro-Services framework requires that web service framework has strong ability. Sanic web framework much like flask, therefore, the learning and migration costs are relatively low.The latest version is 0.6.0.
  3. Eve. https://github.com/pyeve/eve Eve framework is based on flask, and mainly target is Restful API. As mentioned above, Restful API based design has became the standard in today’s internet application. Eve framework through the configuration file to quickly setup the restful api program. Design of Eve is very smart, we can learn a lots of python programming skill from it.

Currently, based on Flask, I’m studying Sanic and Eve, first, improve program skill of web service. Second, improve my English. At last, python is a profound script language, we will study lots from these famous frameworks, and I will continue share my study notes here. Looking forward to everyone’s correction.

终于新书完成

没想到前后居然还是花费了半年时间,本来想在8月完成的,一直因为内容和组稿的关系,拖拉到11月底。之后应该还要再等2个月,出版社印刷出版。

刚毕业的时候,很有冲劲,几乎一个人完成了一本书,耗时一年,当时写的 Visual Basic 的书和工作并不太大关系,现在看看这个书写的很幼稚,也充满了老气横秋的语句。

之后觉得写书太辛苦,在1997年应该是投稿之年,发表了20篇,偶然整理旧物,当时的文章简报都在。

然后出了零星的文章以外,就发表的少了。从2003年开始 blog,喜欢这种不受拘束的形式。

今年,2017年初,也是巧合,之前也想过的出书小结一些自己和团队这么多年互联网领域努力的成果,但是不太了解出版的行情,如今才知道,原来出版行业也是商业化运作了。

从2015年初开始重新学习 Python 到各类实践,以及同事们在机器学习方面的探索。为了把 Python 研究的更加好,参与了一些内部培训材料的编写。当然也发现外面各类鱼目混珠的教材太多了。且大多数国人不太有分享精神。我们并不是因为自己厉害,而是愿意分享,总是有人需要入门。特别是机器学习方面,国内要么只说结果,要么翻译一些国外的课件,鲜有真正的原创分享。技术从来不应该是保守的敝帚自珍。

我的所作所为就是喜欢这些作为,而不是要证明自己,也不是取悦他人。