# Hawk:开源贡献计划,设计,反思
Hawk在发布之后,收到了不少朋友的感谢和使用反馈,沙漠君表示非常开心。软件肯定有很多的问题和不足,还有很多可扩展的空间,因此我希望更多的朋友,能够参与到改进Hawk的计划中来,为开源世界作出努力。
不少朋友询问一些术语的意思,在下面解释一下:
- ETL:即数据清洗,包含抽取(E),转换(T)和加载(L)
- 行,列: 在数据表格上的行列
- 流,子流:一个流代表一组模块构成链条,子流也是流,只不过是被别的流调用的,可以将流理解为函数
- 模块:构成流中的一个个的组件,分为生成,转换,过滤和执行
- 合并多列:将多行数据合并到一行
- 一般的转换器:将一列数据转换到另外一列或多列
在设计上,Hawk不打算提供完整的运行环境,例如定时运行,分布式部署等功能,它仅仅提供一个设计IDE,生成的xml文件交给其他解释器来执行。大家都会用eclipse开发网站,但没人会把它当容器直接部署。
下一步的计划:
- 完善etlpy,其目前只支持Hawk的一部分子集,尚不能支持子流等功能(急需改进),而且还有一堆问题
- 开发基于.NET.Core的跨平台解释器,核心代码可原封不动的移植
- 添加其他数据库的连接器:目前只包含了MongoDB,建议增加MySQL和SQL Server的连接器。下面会简单介绍如何添加
- 优化Excel导出器:目前使用NPOI的类库,性能较差
- 软件国际化,将界面改为英文,提供其他语言的本地化支持
- 进一步优化核心算法,改bug
那为什么没有开发呢?因为没那么多时间啊,急需开源社区的贡献啊...
贡献方法:修改和优化代码后,在GitHub上提交合并请求,我负责将其合并到主分支上。
2. Hawk代码结构
Hawk采用插件式结构,所有的组件都是可分离的。插件系统是沙漠君自行设计的,非常类似于MEF框架。
使用绑定技术,MVVM结构,界面和逻辑分离。
工程文件介绍如下:
- Hawk.Core 底层基础类库
- Hawk.ETL 数据清洗和爬虫插件库
- Hawk.ETL.Controls 界面库
- HawK.exe 可执行程序和插件容器
核心的需要修改的代码,都位于Hawk.ETL和Hawk.Core中。
实现新的连接器
以实现MySQL支持为例,在Hawk.Core.Connectors目录中,新建MySQLConnector.cs文件,创建对应的类,从DBConnectorBase继承。
在类上添加attribute,结构如下:
[XFrmWork("MySQLConnector")]
public class MySQLConnector
{
//implement interface IDataBaseConnector
}
实现新的ETL组件
如果你想开发新的组件,完全可以参考已有的代码。但一些特别简单的功能,不建议再开发新的插件,而是直接使用Python转换器即可。
3.一些设计上的考量
Hawk开发了四年,之前远远不是现在的样子。源头可参考博客园上关于ITTC数据挖掘工具的文章。
数据清洗和爬虫,本来是这个平台很小的一部分功能,后来被不断强化,而其他功能都被删减掉了。
我现在越来越认可“只做一件事,并将其做好”的理念,没有必要把数据分析挖掘功能添加到软件之中,因为已经有更好的工具完成这件事了。也没必要为其设计过多的策略,如增量,定时等等复杂的东西。
如果真要设计增量更新,完全可以通过读取数据库或网页上的某个字段作为生成器参数,之后按照一般流程进行即可。而定时抓取,这属于运行时的范畴,使用crontab等等即可,只可惜现在还没有一个稳定可靠的Python或C#命令行实现。
比如你真的要对两个主键进行唯一性去重,那完全可以把这两个主键组合起来,然后再使用唯一性去重。工具应当提供地足够原子化,这样才能更好的扩展组合。
Hawk其实定义了一种语言,你不能把它当成厨子,给它指令,它就能做出一道菜来。而应该当成一组顺手的餐具,而真正做菜的那个人还是你。自动化只是解决了部分问题,而巧妙设计的源泉还是来自于操作者本人。
Hawk最大的价值,是将复杂的逻辑链条化了,你可以将代码变得不那么耦合,从而方便地组合和开关某些功能。当然这些都拜于函数式编程的思想所赐。
说起继续维护它,那是肯定的。只是它的核心代码用C#实现,同时维护几种语言的版本是非常恼人的,而我以后的工作语言,可能再也不会是C#了。这一点异常蛋疼。
Hawk本身的界面设计,被很多人,也会被更多的人吐槽。因为我本人不是设计出身,我只能尽量去做出一个能用的东西出来,至于好不好用,那真是没法控制了,哎。
不得不说,开源才是最贵的。大家看到开源,欢欣雀跃,以为在路上捡到了钱,其实不是的,如果你真想用起来,一定会花更多的时间来学习它,因为开源者没有义务像商业软件那样,提供完整的支持。时间和钱总是矛盾的,既想省钱还想省时间,天下没有这样的好事。
如果说我后悔没做什么,是我没有把软件做成英文,曾经有一段时间我个人非常崇尚中文编程,从而酿成了现在软件国际化异常困难的后果;再者,没有直接开发Python或者js这种能跨平台语言的版本,因此只能局限于桌面应用,而不同的社群就风气又不一样了。
当然,市面上还有火车头和八爪鱼这样的采集工具,我自己从来不愿意把Hawk定义为爬虫,火车头之于Hawk,有点像vim和EMacs的关系。Hawk提供的是一组环境,语言和工具。而火车头则专门在爬虫领域完成了一个特定的子集。孰优孰劣,尚难定论。
关于文档的事情,不少朋友都要求提供完整的文档。我实在不喜欢写文档,因为代码就在那里,如果不愿意看代码,那文档自然也是不爱看的。我假定每个用我软件的人都能触类旁通,因此通过一些通用的介绍,他应该就能理解绝大多数的功能。我不把使用者当傻子。那如果真的不懂代码呢?那不好意思,请用八爪鱼,否则Hawk的很多设计,对他来说就变得没有意义。
有朋友说,为什么你要开源,对自己来说是不是有点像代码外泄?我笑了笑说,嗨,我根本不care。谷歌的TensorFlow都开源了。牛逼的人都去开源代码,因为它们知道前面的路还有很远,都要忙着赶路呢,那些傻逼们才抱着自己手里的泥饭碗生怕别人抢走呢。再说一遍,我不care。
前一段文字是出发前在机场敲的,后来这些文字是在我刚从厦门旅行归来,跑到泉州的一家寺庙旁边的宾馆敲的,戾气有点重啊,会不会被未来的朋友看到,觉得我本人不够nice呢?有可能吧。Anyway, Hawk是鹰,不是绵羊或麻雀,酒吧的酒保不会因为你善良,就不会去坑你的。我的地盘,所以要听我的。而且我还要抓紧时间赶路。
祝大家用软件用的愉快,欢迎随时给我反馈。大家共同改进。
恩,以上。
(浓浓而又脑残的知乎风结尾)
# Hawk:开源贡献计划,设计,反思的更多相关文章
- Rafy 开源贡献中心 - 组织成立,并试运行一月小结
背景 最近两年,工作中虽然大量使用了 Rafy 框架作为各个产品.项目的开发框架.我是 2015 年的年中加入现在这家公司的,由于我个人工作太忙的缘故,一直没怎么编码,Rafy 框架底层的核心成长也比 ...
- 如何成为一名合格的Apache项目Committer,参与Apache开源贡献的正确姿势
近日,孙金城老师在 "Open Source Promotion Plan - Summer 2020" 开源软件供应链点亮计划做了<如何成为一名合格的Apache项目Com ...
- 【重新发布,代码开源】FPGA设计千兆以太网MAC(1)——通过MDIO接口配置与检测PHY芯片
原创博客,转载请注明出处:[重新发布,代码开源]FPGA设计千兆以太网MAC(1)——通过MDIO接口配置与检测PHY芯片 - 没落骑士 - 博客园 https://www.cnblogs.com/m ...
- Erda 开源的迷失和反思
前言 Erda 是我从2018年初加入上家公司直到今年初离开的四年时间里一直在做的一个云原生 PaaS 平台.在开源之前,Erda 在公司内部的名字代号是 D ,在21年初改名为现在的 Erda 进行 ...
- Ranger开源贡献统计
统计一下自己在Ranger开源社区贡献的Issue数量, 开源社区的Issue主要分为New Feature,Bug,Improvement, 这三种都是和代码相关的,会直接修改开源项目的代码库, 还 ...
- 通向码农的道路(enet开源翻译计划 一)
QQ 324186207群 enet交流技术.主要是为了研究tcp内部执行机制,欢迎大家增加探讨.小弟水平有限.翻译难免有误. . Features: ENet evolved specificall ...
- FreeLink开源呼叫中心设计思想
上一篇大概说了国内外优秀的呼叫中心系统: 国内外优秀呼叫中心系统简单介绍 借鉴上述呼叫中心系统,我们的设计新一代呼叫中心例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY ...
- 通向码农的道路(enet开源翻译计划 二)
QQ 324186207群 enet交流技术,主要是为了研究tcp内部执行机制.欢迎大家增加探讨.小弟水平有限,翻译难免有误. . http://enet.bespin.org 解析enet 双向链表 ...
- 基于WeChat的消息存储备份、远程控制、小功能项目开源分享计划
WeChat+ 关于该项目 起源 该项目的起因是一个比较程(老)序(油)猿(条)的理由,有一天我发现我下班时间比较早,有点尴尬,但是又不想没事干还坐在公司,那么如何解决我的问题呢,初步想法是远程控制电 ...
随机推荐
- gulp使用配置
gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nodejs中stream来读取和操作数据,其速 ...
- 利用js查找页面中的内链,外链
起初没听说过内链外链,只有链接锚文本,在面试中被问到如何查找到页面中的内链和外链,就在想,什么是内链和外链啊??????? 后来面试官给我解释了一下他们的区别,自己稍微懂了,自己当时回答的是通过获取a ...
- 图——拓扑排序(uva10305)
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- Python3.5+selenium操作Chrome浏览器
1.安装selenium 命令提示符下输入: pip install selenium 2.下载chromedriver 点击下载 3.将解压后的chromedriver.exe放到chrome浏览器 ...
- bzoj1455: 罗马游戏 + bzoj2809: Dispatching(可并堆)
昨天看了可并堆是什么,写的是左偏树 大概就是一棵树 1.有左偏性质,即当前根到左叶子节点距离比到右叶子节点距离大 2.有堆性质,堆顶关键字比子树关键字小 合并两个堆的时候,关键字大的插入到关键字小的那 ...
- ubuntu中source insight打不开,报错pagefault的解决方法
在ubuntu中装了source insight用来看代码. 但用了一段时间后,有一天突然就发现打不开了,打开马上会弹出wine的错误,详细信息里面是什么PageFault 0x0000008之类的, ...
- Java环境设置
win7/win8下JDK环境变量设置方法 首先需要到官网上下载JDK这款软件,本人下载的是jdk-7u40-windows-i586版本,安装完成显示jdk1.7.0_67. 其次选择安装路径.本人 ...
- 【实战Java高并发程序设计 4】数组也能无锁:AtomicIntegerArray
除了提供基本数据类型外,JDK还为我们准备了数组等复合结构.当前可用的原子数组有:AtomicIntegerArray.AtomicLongArray和AtomicReferenceArray,分别表 ...
- Android安全开发之通用签名风险
Android安全开发之通用签名风险 作者:伊樵.舟海.呆狐@阿里聚安全 1 通用签名风险简介 1.1 Android应用签名机制 阿里聚安全漏洞扫描器有一项检测服务是检测APP的通用签名风险.And ...
- 三周,用长轮询实现Chat并迁移到Azure测试
公司的OA从零开始进行开发,继简单的单点登陆.角色与权限.消息中间件之后,轮到在线即时通信的模块需要我独立去完成.这三周除了逛网店见爱*看动漫接兼职,基本上都花在这上面了.简单地说就是用MVC4基于长 ...