文档章节

Beetl开源那些事2

闲大赋
 闲大赋
发布于 2015/11/16 16:03
字数 3518
阅读 4023
收藏 45
点赞 23
评论 51

 

  Beetl开源已经有快5年了,对于一个国内的开源软件,能做5年,从默默无名到逐渐国内外认可,非常不容易。跟去年的博文“beetl开源那些事”一样,我在这里还是想分享一下开源心得,为那些有志从事开源工作的人提供一些借鉴。

  说beetl 在持续维护中,可能很多人都看不出来,拿一个语言里最常用的debug函数来解释,就可以看到beetl一直在维护中。
  第一版:debug(a), 跟其他语言一样,没什么特别的,输出a到控制台而已。                 
//debug(a),如果a=123,输出
123

  第二版 : debug 允许接受多个参数,如debug(a,b),这个跟其他语言一样,稍微有点变化               

123,456

  第三版: debug还需要额外打印出所在文件以及debug所在行数,这样查看后台日子就方便了             

//如果a=123,则debug(a) 输出是:
123 @ xxx.btl 里 ,第5行。

  第四版: debug(a,b.name),输出的时候,还输出了变量名,如:          

a=123,b.name=xiandafu @xxx.btl ,第5行

  第5版: 对于字符串,会额外输出引号,比如a=123,b="123"; 则debug(a,b) 输出             

a=123,b="123" @xxx.btl ,第5行

  到目前为止,一个简单debug函数已经变得非常实用,但是改进并非很容易,第三版,对引擎做了特别的修改,将额外的上下文信息(代码所在行数,所在模板文件,传入到debug函数),第四版的时候,也对引擎和表达式astnode做了修改,将变量表达式字符串也传入了debug函数。因此,如果你打开DebugFunction.java,你会看到代码并不是你想象的一行代码        

System.out.println(paras[0]);

而是多达50行内容,包括了debug模式判断,参数CharSequence类型判断,行数,文件名,变量名输出等等。

   正如debug函数实现演进,Beetl其他方面也在不断的演进中,最近一年每隔一个半月都会发布一个小版本。它持续维护的动力来源有很多,我对此有一些总结,可以提供给其他开源着参考:

 第一是要有空闲时间:无法想象早9晚9工作,还有周六加班的的程序员,能把开源做好,开源是个需要创新和交流的工作,得留出精力和时间给开源工作 。而且,开源倘若运转的很好,那也需要花费很大精力去做技术支持。所以,对于开源程序员来说,务必规划出空闲时间专注于开源开发,是成功的条件。以Beetl为例,以前在不忙的企业上班,有充足时间编写,后来换到创业公司,则会在漫长的上班路上(90分钟)构思自己要做的事情,上班过程中,完成公司任务后,可以切换到beetl开发当做休息了。更多的时间来源于下班后和周末,挤挤时间总是有的。我为了能更快的写代码,尝试过冥想编写代码,但总归是年纪不小了,只能冥想编写几行伪代码了。不像年轻的时候,能冥想多行伪代码,且能穿越各种类。 现在穿越到其他类,就穿越不回来了:) 希望冥想编码以后能有人探索一下,方便我们这样上下班路上太长的开发人员。

 第二要保持初心:对于开源者来说,大部分都是技术顶尖的人,能力很强,因此会被公司用在各个技术领域,自己也可能会把精力放在不同地方。如果开源不能保持专注,则自己的开源很可能就是搞个一年半载,就自己放弃了。或者是因为没有兴趣了,或者是因为更喜爱别的流行技术了。当想放弃的时候,可以想想自己当初为什么要做这样的开源,beetl当初想做,其实就是想学一下如何编写一门语言 能替代难用的freemarker,照这样的初心来看,beetl只完成了50%,还需要进一步完善语法解析及其后处理,完善ide集成等。这也是我一直对担心beetl停滞不前的人说,beetl还有至少2年的持续完善。初心的建立,我觉得必须纯真一点,我也知道有些开源仅为了出名的,开源只是他的一个工具,倘若出名,开源产品就会被抛弃,同样,也有人写开源是为了找好工作方便,这样人的开源产品,一点都不好用·而且,也注定不会长久


 第三:我认为的一些有用的开源技巧,这些都比较主观,但可以供后来者参考

  开源差异归根到底不是技术差异,而是审美差异: 大部分开源,都不是技术领先的,都是关乎作者的审美。而审美又是一个跟时代相关的话题,因此开源永远都有新的机会。以模板引擎为例,当xml流行的时候,freemarker流行。当js流行的时候,beetl开始流行。同样规则看到soap,和json, maven 和 gradle。beetl在开发一个新的语言特性的时候,会将从审美的观点看待这个特性,比如beetl推出的ajax局部渲染,当时就有好几个语法的样子,刚开始从本质上来将,是个局部渲染,因此,定义的语法如下:
 
block:xxxx {

}

但是,我觉得这样并不好看,对于使用者,也不明显,为何不直接叫ajax呢,既然就是为了ajax渲染用的,后来定义为  

ajax:xxxx{

}

尽管这样已经很好了,但这样写法无法与开发者已有的的经验联系起来,我就想起来html的 anchor,于是,我再次改写了我的草稿,写成如下  

#ajax:xxx{

}

这就是我想要的,也是beetl使用者一看就能明白的语法。

  选择不做比做更难。开源者技术能力强大,有很多炫酷特性都可以轻而易举加入,但我以为在选择的时候,要问自己,我为什么要加入这个功能,这个功能对使用者有什么好处,80%的使用者会用到这个特性吗?以beetl为例子,作为一个语言类技术,可供借鉴和参考的语法特性很多,而且,都很容易做到,但我大部分都选择了不做,以,python 的范围操作符号为例,    for(var i in [1..9] )  如果这个用在beetl里,确实很酷,但我觉得,采用range函数,实现一个iterabale更加能被使用者接受,而且,不需要改动引擎核心。只是一个普通函数而已,因此,最后演变成

for( var i in range(1,9)){

}

  在比如,beetl 并没有提供在模板里定义一个function功能,只提供了以模板文件放在functions目录下,自动注册为function的功能。尽管在模板里定义function,显得beetl更有程序语言气质,但我认为模板中使用function很少见,而且不易于架构师控制(架构师控制模板一直是beetl的设计出发点),所以也最终没有提供。


 从简单开始:假如你无心情,或则自认为无时间做开源的时候,建议你从简单的工作做起,比如,给你的代码增加注释,完善文档,或者写一些简单的重构。写一写的时候,你就上自己的套了,精神倍增,思路开始活跃,身不由己,开始做一些更有挑战的技术。我常常就是这么开头的。对于开源架构设计,也要尽可能简单,这就是kiss原则。简单的设计,简单的实现,然后依据反馈来改进。我觉得没有几个程序员一开始就能把程序设计和实现的很完美,就如同刚出生的婴儿一样,开始很丑的,当长着长着,就漂亮起来,相反,那些一出生就很漂亮的孩子,往往长大都不好看。一出生,就长大像成人的,医生都会说,孩子可能有问题了....

尽早获得“三敢”用户: beetl成长一直有金牌用户支持,就是我总结的“三敢用户”,
    敢用你的开源,哪怕开源还未成形。
    敢提出反对建议,对于开源功能和实现,能提出自己的意见,甚至是反对建议。
    敢于等待,出了问题,你说得周末改一下,他会一直等你到周末。有些事个人产品无所谓,有些事公司的产品,也敢这么做,让人佩服
    
    “三敢用户”是完美的开源用户,万岁 :)

 不要让开源成为公司项目.让公司支持开源项目,好处当然多,给时间也给人,说不定还有其他奖励。但好处不是白给的,公司开源,必然得为公司服务,我以为这样容易导致开源功能不足。 开源作者在提供功能的时候,也会以公司需求为基础。我曾在beetl基础上做了bingoui,一个跨终端的webui,适用于需要提供复杂内容的企业应用。这是以前公司做的,给了美工,给了前端,还给了2清华美女程序员,但最后还是失败了。并非是技术很参与者能力问题,而是做起来各种不顺手。越做越远离自己想法。进度要求导致质量降低。最后,我离开公司也导致此项目没有完成。


   前面大部分都是给其他开源这提供一些开源思路,这里也想给开源使用者里小白提供一些个人建议,毕竟beetl提供了很好的开源服务,也曾经以捐助名义提供一些一对一的服务(捐助已经停了,因为1对1太费劲,而且,有个小白捐助了10元因为得不到servlet相关技术帮助,说我长的丑,我愤而停止了捐助)。

   对于小白(指技术不懂的程序员),我想给的最大建议就是不要认为自己不懂,就唯唯诺诺。问问题总是一句一句试探,深怕被人说不懂
正确的问法,应该是包含下面内容
   1 介绍自己背景,比如,是否是新手,是否用过这个开源。这样,有助于解答者思考答案。此处应该有2行
   2 详细说出你的输入,和期望输出,以及实际输出,该有代码的贴代码,该有图的贴图。此处应该至少20行和若干图片
   3 说出自己的理解,描述你对当前问题的判断,尽管这些判断肯定不对,但有助于解答者了解你思路,从而根据你的思路来回答.此处应该有2行

    这些内容,应该尽可能一次贴出来到qq群或者论坛里,以我的经验,这样能很快得到解答,而且,解答内容跟你提问内容详细程度成正比。 你若有字,有图,我也会有代码,有详解

  对于小白的还有一个建议,还有就是要看一手资料,这来源于官网的文档,和demo。而文档需要仔细看第一章和目录。这花不了半天时间。尽管可能内容并不是小白直接想要的,但遵循第一章内容引导,大部分问题能被解决。如果你仅仅依靠baidu,对于开源技术来说,为时过早了点,而且,不是一手资料,不是过时了,就可能描述的有歧义。建议小白掌握看官网的技能,这样很快就能高大上起来。 小白如果是能成功解决问题,最好能在官网分享一下,这样有助于后来人。而且分享过程也是整理自己思路的过程。我也遇到过奇葩小白,让他在社区提问,如论如何他都不去,等问题解决了,我希望他能整理一下发表到社区,他也不干。真不知道他为什么那么忙?

  Beetl已经有快5年历史了,有网友佩服我,说我搞了一门这么好的模板语言,说我聪明。其实,我的聪明基本上停留在2013年1.0版本那个时刻,然后我的聪明劲就停滞不前了。在那之后,有数不清的开发者向beetl提供了自己建议,甚至捐助了代码。有建议将编译方式改为解释方式执行的(我不屑过这个方案),有建议提供html 标签功能的(我记得当时我大义凛然的反驳过他这个观点,甚至为这个刺头离开群而暗自高兴),有建议我参考别的语言特性的,如省略的三元表达式(我当时认为没必要),还有很多提供了自己的扩展代码,还有那些希望我提供完善的demo,指出我文档不足之处的小白。我越来越觉得,自己是开源作者,但越来越缺少主动权了,他们一直有各种想法,建议我,督促我完善beetl。我希望在他们帮助下,beetl还能再维护几年。

© 著作权归作者所有

共有 人打赏支持
闲大赋

闲大赋

粉丝 1112
博文 86
码字总数 81146
作品 10
西城
架构师
加载中

评论(51)

马丁的早晨
马丁的早晨
看了这篇博客才知道有个debug函数:sweat_smile:
蒲池幸子
蒲池幸子
支持beetl
素人派
素人派
说了些很实在的话,加油!
JFinal
JFinal

引用来自“Jieven”的评论

每次看到有开源作者分享自己的开源经历总是有很多同感,会产生很多共鸣,从最开始看热闹到加入这个圈子,慢慢的角色发生了转变,思想发生了转变,有了很多的感悟。
#EOVA# 作为 Beetl 忠实使用者,EOVA没有Beetl开源时间长但是也有2-3年了,之前都是闭门造车。
1.“三敢”用户,EOVA这边有一个更高大上的称谓叫“天使用户”,意思都一样。
2.选择不做比做更难,这个的确是一个纠结的问题,众口难调,又不能违背初心,所以对很多刺头又爱又恨。
3.空闲时间:自从开源之后,平均每天都是2-3点睡觉,发新版本都是4-5点,365天,每天都在加班,然后基本上没有什么报酬,还要经常被一些小白用户吐槽服务态度不够好(一般都是问Servlet这种问题,还好没人骂我长的丑,我非得双倍的钱砸他脸上),简直Fuck Dog...
之前私下问过大赋,Beetl知名度这么高,你薪资有没有因此翻倍,大家可以猜一下大赋的回复。
太多太多的辛酸血泪史,就不说了,希望大家多一些包容,多一些真诚,多一些支持,多一些理解,不信你也可以试试。

开源就是用生命在谱写新的篇章!
开源做得好的,95% 以上的部分是因为理想化、责任感,这可能就叫开源精神吧,长久坚持实属不易
闲大赋
闲大赋

引用来自“Jieven”的评论

每次看到有开源作者分享自己的开源经历总是有很多同感,会产生很多共鸣,从最开始看热闹到加入这个圈子,慢慢的角色发生了转变,思想发生了转变,有了很多的感悟。
#EOVA# 作为 Beetl 忠实使用者,EOVA没有Beetl开源时间长但是也有2-3年了,之前都是闭门造车。
1.“三敢”用户,EOVA这边有一个更高大上的称谓叫“天使用户”,意思都一样。
2.选择不做比做更难,这个的确是一个纠结的问题,众口难调,又不能违背初心,所以对很多刺头又爱又恨。
3.空闲时间:自从开源之后,平均每天都是2-3点睡觉,发新版本都是4-5点,365天,每天都在加班,然后基本上没有什么报酬,还要经常被一些小白用户吐槽服务态度不够好(一般都是问Servlet这种问题,还好没人骂我长的丑,我非得双倍的钱砸他脸上),简直Fuck Dog...
之前私下问过大赋,Beetl知名度这么高,你薪资有没有因此翻倍,大家可以猜一下大赋的回复。
太多太多的辛酸血泪史,就不说了,希望大家多一些包容,多一些真诚,多一些支持,多一些理解,不信你也可以试试。

开源就是用生命在谱写新的篇章!
最好别对自己开源有太多期望啊,否则难易坚持,无为而无不为
闲大赋
闲大赋

引用来自“Jieven”的评论

每次看到有开源作者分享自己的开源经历总是有很多同感,会产生很多共鸣,从最开始看热闹到加入这个圈子,慢慢的角色发生了转变,思想发生了转变,有了很多的感悟。
#EOVA# 作为 Beetl 忠实使用者,EOVA没有Beetl开源时间长但是也有2-3年了,之前都是闭门造车。
1.“三敢”用户,EOVA这边有一个更高大上的称谓叫“天使用户”,意思都一样。
2.选择不做比做更难,这个的确是一个纠结的问题,众口难调,又不能违背初心,所以对很多刺头又爱又恨。
3.空闲时间:自从开源之后,平均每天都是2-3点睡觉,发新版本都是4-5点,365天,每天都在加班,然后基本上没有什么报酬,还要经常被一些小白用户吐槽服务态度不够好(一般都是问Servlet这种问题,还好没人骂我长的丑,我非得双倍的钱砸他脸上),简直Fuck Dog...
之前私下问过大赋,Beetl知名度这么高,你薪资有没有因此翻倍,大家可以猜一下大赋的回复。
太多太多的辛酸血泪史,就不说了,希望大家多一些包容,多一些真诚,多一些支持,多一些理解,不信你也可以试试。

开源就是用生命在谱写新的篇章!
负责任的开源,非常不容易
Jieven
Jieven
每次看到有开源作者分享自己的开源经历总是有很多同感,会产生很多共鸣,从最开始看热闹到加入这个圈子,慢慢的角色发生了转变,思想发生了转变,有了很多的感悟。
#EOVA# 作为 Beetl 忠实使用者,EOVA没有Beetl开源时间长但是也有2-3年了,之前都是闭门造车。
1.“三敢”用户,EOVA这边有一个更高大上的称谓叫“天使用户”,意思都一样。
2.选择不做比做更难,这个的确是一个纠结的问题,众口难调,又不能违背初心,所以对很多刺头又爱又恨。
3.空闲时间:自从开源之后,平均每天都是2-3点睡觉,发新版本都是4-5点,365天,每天都在加班,然后基本上没有什么报酬,还要经常被一些小白用户吐槽服务态度不够好(一般都是问Servlet这种问题,还好没人骂我长的丑,我非得双倍的钱砸他脸上),简直Fuck Dog...
之前私下问过大赋,Beetl知名度这么高,你薪资有没有因此翻倍,大家可以猜一下大赋的回复。
太多太多的辛酸血泪史,就不说了,希望大家多一些包容,多一些真诚,多一些支持,多一些理解,不信你也可以试试。

开源就是用生命在谱写新的篇章!
n
nemo724
79
闲大赋
闲大赋

引用来自“clarchen”的评论

其实想用beetl+jodd的组合,已经成功了,但是我需要i国际化,请大牛解答下.多谢
可以自己实现一个format 函数,然后模版里: ${xxxx,local} local 是你注册的格式化函数,再local内部,你可以获取上下文信息,去格式化xxx,非常简单
clarchen
clarchen
其实想用beetl+jodd的组合,已经成功了,但是我需要i国际化,请大牛解答下.多谢
Beetl 2.1.0 发布,java模板引擎

Beetl 2.1.0 发布,此版本更新内容如下: 功能增强: 1 通过配置SimpleCrossFilter允许通过浏览器直接访问模板而不需要事先准备好Controller和Model 2 Spring 集成增强,允许注册被spring管理...

闲大赋
2014/10/23
1K
21
代码自动生成器 AutoCreate v2.0 发布

autocreate 是 数据库链接采用Jfinal ActiveRecordPlugin,模板配置采用beetl,实现根据模板自动生成项目代码。 可以根据自己项目代码结构,定制属于自己的模板,甚至可以通过备注配置,实现...

Fly的狐狸
2016/01/15
5K
13
代码自动生成器--AutoCreate

autocreate 是 数据库链接采用Jfinal ActiveRecordPlugin,模板配置采用beetl,实现根据模板自动生成项目代码。 可以根据自己项目代码结构,定制属于自己的模板,甚至可以通过备注配置,实现...

Fly的狐狸
2016/01/15
3.7K
3
Beetl 2.2.5 发布,java 模板引擎

Beetl 2.2.5 发布,此版本主要是 Bug 修复: 185: 模板里有混合的回车符号导致模板输出有错.如用rn 作为回车符号,但部分内容用了n.通常是粘贴其他内容导致的 184: isEmpty 函数判断 int[] ...

闲大赋
2015/09/09
2.1K
20
代码自动生成器 AutoCreate v2.1 发布,jfinal+beetl

AutoCreate v2.1 发布, 更新说明: 代码全面重构,jfinal升级为2.1. 加入了http://www.oschina.net/p/mtgxxw 项目,模板生成支持 autocreate 是 数据库链接采用Jfinal ActiveRecordPlugin,模...

Fly的狐狸
2016/01/17
3.2K
5
转:关于beetl集成struts2 +convention插件无法识别beetl模板的处理方案

转自 jplus 文章 今天第一次接触这个模板引擎,感觉非常不错,平时都是使用spring mvc开发,目前教带学生做一个小项目,使用struts+guice+mybatis,于是想试试这个模板引擎开开实际使用情况。...

闲大赋
2014/12/18
0
0
NutzWk 3.2 CMS版发布,JAVA企业级开源开发框架

NutzWk 是基于国产JAVA开源框架 Nutz 开发的一套集成Shiro权限控制、Ehcache缓存、Beetl模板引擎、Quartz等技术的开源企业级开发框架。 NutzWk 3.2 今日正式发布,主要新增CMS模块,源码地址...

Wizzer
2016/07/21
4K
17
快速开发框架--SpringBlade

SpringBlade,是基于多个优秀的开源项目(spring+springmvc+beetl+beetlsql+shiro),高度整合封装而成的快速开发平台。 鸣谢 1.JFinal 2.eova 3.hutool 4.beetl 5.beetlsql 6.dreamlu 7.ki...

smallchill
2016/09/02
14.3K
8
NutzWk 3.3.4 发布,Java 企业级开源开发框架

“私活利器,企业应用”NutzWk 3.3.4 发布了。NutzWk 是基于国产 Java 开源框架 Nutz 开发的一套集成 Shiro 权限控制、Ehcache缓存、Beetl模板引擎、Quartz、Redis、Email、二维码、pdf等技术...

Wizzer
2017/01/17
1K
14
关于beetl认识的几个误区

beetl 现在国内越来越流行,社区网站每日访问量都有上千,下载量每日保持在20个左右(无法统计maven的)。qq群在满员之前已经踢走了一拨又一拨的不活跃会员还有少量价值观不符合的人(写这个...

闲大赋
2016/09/14
2.2K
17

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spark Streaming + Kafka Integration Guide

The Spark Streaming integration for Kafka 0.10 is similar in design to the 0.8 Direct Stream approach. It provides simple parallelism, 1:1 correspondence between Kafka partition......

刺猬一号
14分钟前
0
0
数据结构与算法2

一个数组的例子,实现查找,显示和删除的功能。 在这个数组中存储的数据类型是long型,使用long型为的是表明这是数据,而int型被用来表示下标。通常数据结构存储的数据项包含有好几个字段,所...

沉迷于编程的小菜菜
25分钟前
0
0
Python3 基于 requests 批量下载图片

Python3 基于 requests 批量下载图片 import requestsheaders = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encod......

leeyi
25分钟前
0
0
java获取当前时间所在一周的周一和周日日期

/** * 当前时间所在一周的周一和周日时间 * @param time 当前时间 * @return */ public static Map getWeekDate(String time) { Map map = new HashedMap(); SimpleDateFormat sdf = new Si......

小弱鸡
57分钟前
0
0
Redis数据的导出和导入(dump和load方式)

网上有些文章已经不再适用,本人也是踩了些坑,在此记录下。 迁移redis数据一般有如下3种方式: 第三方工具redis-dump,redis-load aof机制,需要开启aof功能 rdb存储机制 这里介绍第一种方式...

iplusx
今天
2
0
ElasticSearch 高亮显示大文档搜索结果

2016年12月,我们开始研究Ambar——一个文档搜索系统。Ambar使用ElasticSearch作为核心搜索引擎。 在Ambar开发的过程中,我们处理了很多与ES相关的问题,我们想分享我们得到的宝贵经验。让我...

九州暮云
今天
1
0
Python 使用 pywifi 模块 破解wifi密码

git https://github.com/awkman/pywifi 常见常量 from pywifi import const# Define interface status.IFACE_DISCONNECTED = 0IFACE_SCANNING = 1IFACE_INACTIVE = 2IFACE_CONNEC......

阿豪boy
今天
2
0
phpstorm使用Iedis

phpstorm的redis插件Iedis是真好用 看了网上挺多的文章,但是由于我系统还是ubuntu,就有点尴尬了,现在破解之后,留个笔记,即使自己之后有需要也可以很快翻阅 先下载资源 资源下载 zip压缩...

贤郎--均灵
今天
0
0
第三章 spring-bean之FactoryBeanRegistrySupport(4)

前言 从FactoryBeanRegistrySupport类的名字可以看出FactoryBeanRegistrySupport负责FactoryBean的注册与支持。如果想知道FactoryBean相关的资料,请阅读spring-bean中关于FactoryBean的解读...

鸟菜啊
今天
0
0
CentOS “Destination Host Unreachable”问题解决办法

挑战极速安装CentOS时遇到局域网主机不能通信的情况: [root@zjd network-scripts]# ping 8.8.8.8PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.64 bytes from 8.8.8.8: icmp_seq=1 ttl=......

wffger
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部