文档章节

processing初体验与再识Awk - 从小语言到领域特定语言

暗夜在火星
 暗夜在火星
发布于 2016/03/08 08:56
字数 1833
阅读 61
收藏 0

在往常一样寒夜的夜晚,外面下着小雨,而我坐在小书房里,静静地看着技术类的书籍。

但和之前不一样的是,心上的这本书不仅让我学到了一些新东西,而且还深深吸引了我要动手来玩一玩(绝不是书中的练习题要求我做的)。这本书就是《代码本色》。

下面我将简单陈述一下自学processing的过程和一些有趣的体验。

一、processing初体验

1、简单的绘画

processing是一门针对图形的语言,具体也可以在开源中国上找得到,如:图像处理框架语言 Processing

processing的安装其实非常地简单,在有JAVA环境的系统上(这里是Ubuntu),把processing的压缩包解压后,再执行以下命令即可启动:


./processing-3.0.2/processing
启动后,我们就可以这样简单地玩一玩了。


processing是一个针对画图的语言,或者说是一个工具。如简单地画一条线:

2、结合Box2d

但更为有趣的是,我们可以结合Box2d来绘画一些带有物理属性的物体和场景,如重力、加速度、摩擦力等,也就是说我们可以轻松创始一个粒子系统,创始一个属于我们的“世界”。

如画一张我一直都想画的网:

然后,添加一些吸引力:

再进一步,我们可以尝试创造一张羽毛球网:


其中用到的Box2d,需要使用Java版的。更多说明可参考:http://www.jbox2d.org/

3、与生物、遗传学的结合

上面是processing在物理学的应用,但我们也可在生物这个领域进行一些好玩的尝试。如重现细胞的90规则:

书中提到的,有四种规则,也颇让我印象深刻。这四种规则分别是:

  • 呈现周期性的重复
  • 最终的统一,或是归一
  • 随机性
  • 综合以上这几种的

而上面的规则90就是第一种:周期性的重复。


基于这些规则,我们可以创建一些细胞,并模拟它们的生长、退化、和衰亡。也可以模拟一些病毒感染的场景。

4、最后的练习:碰撞的小球

在读大学的时候,我们用的电脑经常会用到屏保。其中有一个屏保就是几个泡泡在相互碰撞。当时我看到比较有趣,就想能不能自己也模拟实现一下。

在经过了大量的设计(只要是计算物理中两个物体相撞后的方向和速度变化),我们勉强做出了效果。最终呈现还不错,但花费了不少的时间,大概也有几天甚至一周。

如今再用processing,我可以在短短的10多分钟就完成了效果。如下:

5、小结

上面都是简单到不能再简单的示例了,只是提供了一些表面的感观的了解。但通过这些,我们其实可以总结到更多。

对于编程的初学者,尤其是未受过专业学习而是初尝编程的中小学生,上面的编程都是很有趣的,因为这把他们带到了个新的世界。他们可以由此受到启发,而做一些与物理、化学、生物有关的科技竞赛或创新。

而对于编程的老手,对于已经有工作经验的人来说,持续学习和尝试一些新的技术是值得的。因为这会让我们从新的角度来看待问题。比如如何组织设计这些虚拟现实世界的物体,如何实现processing。后面这点我们稍候会再讨论。

但不管怎样,作为一名程序员,我还是忘不了最初学会编程的那种兴奋。当然,也很enjoy这次这样的编程乐趣。因为在这里,你不需要考虑太多的业务,也不用做什么DBUF,只是做你想做的事情就好。你完全可以做很酷的事情,发挥你的创造力。

二、Awk重新的认识

在我刚毕业的时候,因为工作需要,用到了shell批处理,因而接触到了awk的使用。如通常地:


cat ./a.txt | awk -F '{print $1}'
但稍微复杂的语法则不会使用了,更不用说它的内部实现。



但最近在看《编程珠玑》的时候,才发现Awk这一语言里面蕴藏了如此丰富的设计和思想。

其中就是它的“pattern-action”模式,而且还有它的内置变量,不需要初始化的变量,关联数组,以及BEGIN-END的结构等。

很多看似很复杂在其他语言实现困难的,都可以在Awk得到优化的解决。

三、从小语言到DSL

《编程珠玑》一书中提及到了小语言,可以用它来绘画一些特定场景的图表,以及很自然地表达某个领域的规则和实现。如一些基于Awk的预处理的小语言,可以把绘画化学分子结构图这样专业的事情更加简单化。

而processing可以说是内部的领域特定语言,即DSL。因为processing是基于JAVA实现的,所以也受限于JAVA的语言语法限制。但前面提到的小语言则属于外部DSL,可以用任何语言、任何工具解析文法然后生成Awk的代码再执行。

对于DSl,我也尝试在PhalApi进行了试用。

考虑到对远程接口的调用,为了给客户端统一接口请求调用的规范性、流畅性和简单易懂,我特别为此使用了内部领域特定语言: 接口查询语言 (Api Structured Query Language) 。 

最终,我们可以用一句话来描述接口请求。

正如文档上介绍的,其主要过程如下:

create

withHost host
withFilter filter
withParser parser

reset   #特别注意:重复查询时须重置请求状态

withService service
withParams paramName1 paramValue1
withParams paramName2 paramValue2
withParams ... ...
withTimeout timeout

request
即文法为:
create -> with -> request
以JAVA版本为例,简单的调用如下:


PhalApiClientResponse response = PhalApiClient.create()
       .withHost("http://demo.phalapi.net/")  //接口域名
       .request();                            //发起请求
通常的调用,即有设置接口服务名称、接口参数和超时:


PhalApiClientResponse response = PhalApiClient.create()
       .withHost("http://demo.phalapi.net/")
       .withService("Default.Index")          //接口服务
       .withParams("username", "dogstar")     //接口参数
       .withTimeout(3000)                     //接口超时
       .request();

高级复杂调用,即设置了过滤器、解析器的操作:

PhalApiClientResponse response = PhalApiClient.create()
       .withHost("http://demo.phalapi.net/")
       .withService("Default.Index")
       .withParser(new PhalApiClientParserJson()) //设置JSON解析,默认已经是此解析,这里仅作演示
       .withParams("username", "dogstar")
       .withTimeout(3000)
       .request();
可以看到,此设计是简单、一致且易于扩展的。各客户端可以根据自己的语言各自实现。

目前已实现的SDK版本包括但不限于:Java、PHP、Javascript、Ruby、Go、Object-C。


关于领域特定语言,可参考Martin Fowler的《领域特定语言》一书。

由于只出于简单备忘,是以简单纪录。

© 著作权归作者所有

共有 人打赏支持
暗夜在火星

暗夜在火星

粉丝 162
博文 172
码字总数 323357
作品 1
广州
程序员
私信 提问
swoole框架-swoft初体验

swoole框架-swoft初体验 没有swoole之前,php一直被"誉“为世界上最好的语言。swoole横空出世后,php就成了宇宙最好的语言了... 关于swoole的基础使用,详见 2018年swoole实战1-初识swoole ...

章鱼喵_
2018/07/31
0
0
linux基础--awk文本分析工具详解

简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的...

亮公子
2016/12/26
0
0
【C#每日一帖】初识.NET和C#

了解.NET与C# 1 .NET 是一个开发平台,它定义了一种公用语言子集(Common Language Subset,CLS),这是一种为符合其规范的语言和类库之间提供无缝集成的混合语言。.NET统一了编程类库,提供...

c_o_d_e_r
2011/07/14
0
1
1.LinQ初体验 简单的示例(原创)

查询表达式(LINQ)简介 LINQ是LanguageIntegrated Query的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数...

老朱教授
2017/08/27
0
0
AWK介绍和基本用法

AWK介绍: awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切...

一号花匠
2017/09/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【PG内核】事务ID冷冻简述

数据库代码中事务ID的类型TransactionId定义为:typedef uint32 TransactionId。因此事务ID最大值为2^32-1=4294967295。 事务ID是需要循环使用的,为了做到这一点,数据库在做vacuum时将很老...

movead
24分钟前
13
0
深入学习SpringMVC以及学习总结

一、优点: 1.SpringMVC简化web程序开发; 2.SpringMVC效率很好(单例模式); 3.SpringMVC提供了大量扩展点,方便程序员自定义功能; 如果想学习Java工程化、高性能及分布式、深入浅出。微服...

编程SHA
24分钟前
1
0
关于开源分布式事务中间件Fescar,我们总结了开发者关心的13个问题

开源分布式事务中间件 Fescar 自1月10日上线v0.1版本以来,受到了开发者们的极大关注(watch249,star3005,fork649,社区讨论的issue58,数据统计于1月17日14:00),可见,天下苦分布式事务...

阿里云官方博客
25分钟前
1
0
斯皮格尔:我们敢于采纳非常疯狂的创意

“阅后即焚”照片分享应用 Snapchat 母公司 Snap 的 CEO 埃文-斯皮格尔(Evan Spiegel)近日接受了英国《金融时报》记者的采访,谈到了该公司的未来发展,与社交网络 Facebook 的竞争,限制自己...

linuxCool
26分钟前
1
0
javaweb文件上传以及文件上传成功后但是目录中没有显示

经过看别人写的代码然后自己实际操作一遍,基本都是搬运也是为了练习。1:创建fileUpLoad.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UT......

小橙子的曼曼
28分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部