用Ruby将源代码文件Join起来,并且加上行号
今天要弄个专利申请,需要提交相关的代码。写了个script,目的是将文件目录下的java文件全部弄在一起,并且写上行号。 最后看了看生成的txt文件大小,足足有2M多。总数7万多行。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
今天要弄个专利申请,需要提交相关的代码。写了个script,目的是将文件目录下的java文件全部弄在一起,并且写上行号。 最后看了看生成的txt文件大小,足足有2M多。总数7万多行。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
最近需要读取应用的日志分析数据。打开其中一个节点的Log,发现已经差不多有2G了。我的妈呀~都长这么大了~ 分析文件是件麻烦事,特别是这么大的日志。而且,如果不用程序员的方法还真不知道要看到猴年马月。这是,我想起了Ruby的IO类以及其子类File。其中有几个方法:
现在逐个介绍一下。
这个函数官方文档上面是这样写的:
1
|
|
那也就是说,此斯比较适合用来读取二进制文件。OK,不太适合我。下一位。
文档上说:
1
|
|
嘿~还可以将每行读进IO,那就非常的好,正好哥的文件比较大,这个很适合。再看看还有没有更好的。
文档上说:
1
|
|
看来这个是可以按照数组的方式去操作文件行的,不错。但是,还有一个关键的东东,那就是把全部的文件都读到IO中,那就是说,假如我的文件有2G,但是我的系统中只有1G内存,那就有可能再读到一半的时候就挂掉了。
选来选去,还是用#each
吧。
以下是分析:假设我现在有个案例,需要找到日志中所有请求IP的前10名,而我的文件每行是以IP打头的,因此,就会写成以下的示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Total 12行就可以写一个简单的日志分析啦。回想起如果用Java的话,那是什么状况。不过题外话,这种还是可以用Linux下的Shell+awk来完成。
刚刚翻回之前写的一些爬虫脚本,想分享一下其中一个比较有意思的爬虫。 这个爬虫脚本使用的是Chris Kite写的Anemone(一个Ruby的爬虫库)。它提供了非常简单的DSL用来爬取每一个页面以及其URLs,官方说会自动计算出其需要的最短路径。而且,这个爬虫库是多线程。由于Ruby正则表达式的写法简洁,因此,看上去非常简短。
主要用到的gem有anemone,digest,还有用来保存链接的mongo
1 2 |
|
首先,会定义一些全局变量,其中ENTRY_PATTERN是入口,PAGE_PATTERN是要爬的页面,ANY_PATTERN还会包含另外一些需要爬的链接:
1 2 3 |
|
接着新建一个MONGODB以及表,因为是要爬http://www.oabt.org,所以就直接命名了:
1 2 |
|
接着,是定义Anemone的一些options:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
好了,接着就是开始爬了,#focus_crawl中会定义需要爬的URL,只会保留ANY_PATTERN的URL,接着,如果符合PAGE_PATTERN的,会在其页面中找他的title,id,reference url,还有就是他的下载链接:magnet/thunder/ed2k(这里会使用到NOKIGIRI,因为我熟悉css selector,所以代码中直接使用css selecor来抓),接着就会检查他的引用页的hash值是否已经存在,如果不存在就直接插入mongo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
全部的代码如下,总共不到60行的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
|
最近在做一个程序,用于我的EAM(固定资产管理系统)跟公司的ERP对接固定资产的数据。开始是想直接用MES在用的接口系统,修修补补上。 但是发现这个接口系统相对来说耦合比较厉害,如果要改来用,怕且都要搞个半个月才能上线。 后来就打算直接用Ruby写算了。于是就有了这篇文章。 下面看看其中的一个XML规格(大概),这是由ERP项目组定义的规法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
我最近都在用Ruby on Rails在开发项目(个人/公司),所以感觉上这个应该没有太大困难。不过还是有以下问题需要解决:
想用ActiveRecord直接生成XML,但是需求的XML跟ActiveRecord直接生成出来的样子不太一样。后来看了ActiveRecord的XML相关的builder的代码,觉得还是使用builder定制吧。 就有了以下的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
|
为啥写的这么别扭?其实是因为我直接使用了db的view去抓数据。哈哈哈,为防以后会有变更,这样直接修改SQL就可以了:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
到这步,基本上XML是能够生成了,但是如何去调用呢?上rubygems.org看了看包的使用量,soap这一块savon相对来说比较好,而且文档还是很充分。感觉这样写的话相对Java的SOA调用使用xfire非常简洁方便。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
OK,webservice call的问题已经解决了。就剩下最后一个问题,定时调用! 一开始就想通过linux crontab来定时调用这接口,这样就会相对于固定资产管理系统本身的sidekiq独立起来(毕竟这个是一个月才调用1次的接口,无需实时调要求,感觉也没有这个必要)
1 2 |
|
接着在crontab中增加一行调用:
1
|
|
OK~ 大功告成。相对Java版本的接口系统,同样功能大概只用了其1个类(差不多)的代码量就完成了~。