# 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+ 关于该项目 起源 该项目的起因是一个比较程(老)序(油)猿(条)的理由,有一天我发现我下班时间比较早,有点尴尬,但是又不想没事干还坐在公司,那么如何解决我的问题呢,初步想法是远程控制电 ...
随机推荐
- 前端面试那些坑之HTML篇
HTML 1.Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于<html> 标签之前.告知浏览器的解析 ...
- Debian 8 jessie, OpenSSH ssh connection server responded Algorithm negotiation failed
安装了debian 8.5 就出问题了. root@debian8:~# lsb_release -aNo LSB modules are available.Distributor ID: Debi ...
- ubuntu 16.04 Dockerfile 安装mysql
默认上MariaDB的包并没有在Ubuntu仓库中.要安装MariaDB,我们首先要设置MariaDB仓库. 配置MariaDB 仓库 # apt-get install software-prope ...
- 实现滑动条与表单中的input中的value交互
最近在写一个考试系统的项目,遇到一些比较有意思的小知识,在这里分享给大家 下面是一个滑动条与input中的value值的交互,即滑动条的颜色会跟随给定input的value值实时变化,虽然表单中的ra ...
- 最近碰到的一些 SSL 问题记录
最近碰到一些 SSL 的小问题,特记录下. 我们有个 Java 实现的 SSL TCP 服务端,为客户端(PC.Android 和 iOS)提供 SSL 接入连接服务.最近有用户反馈其手机上 App ...
- IT人生知识分享:博弈论的理性思维
背景: 昨天看了<最强大脑>,由于节目比较有争议性,不知为什么,作为一名感性的人,就想试一下如果自己理性分析会是怎样的呢? 过程是这样的: 中国队(3人)VS英国队(4人). 1:李建东( ...
- 解读ASP.NET 5 & MVC6系列(4):核心技术与环境配置
asp.net 5是下一代的asp.net,该版本进行了全部重写以适用于跨平台,新新版本中,微软引入了如下工具与命令:DNVM.DNX.DNU. DNVM(.NET Version Manager): ...
- 标准数据源访问库 - JayData
JayData 是一个标准的.跨平台的库和方法,用于访问和操作各种不同的数据源,最适合用于 JavaScript 和 HTML5 应用. 官方网站:http://jaydata.org/ ASP.N ...
- ABP理论学习之工作单元(Unit of Work)
返回总目录 本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IRe ...
- 你必须知道的Javascript 系列
JavaScript是见过最多人说它“有趣”,“好玩”的一门语言.不仅仅是因为它的灵活性,包括它本身很多的特性,比如说原型链,作用域链都是非常好玩的东西.现在已经有很多的JavaScript设计模式, ...