• Category Archives: Programming

computer

PhantomJS+CasperJS备份微博

备份微博通常调用新浪微博提供的API就可以了,但是我并不关注文本数据,更需要得到一条微博原原本本的显示内容,就像archive.org对网站进行备份一样,可以将微博截图快照下来。

对于网页快照,可以使用PhantomJS进行截图。PhantomJS是一个支持JavaScript API的无界面、运行于服务端的WebKit环境(Headless WebKit with JavaScript API),Headless这里的意思是渲染页面在后台完成。PhantomJS可以用来进行前端自动化测试、网络状况监控、网页渲染后自动截图等。但是微博快照和网页快照不同,微博快照在网页渲染后,只是截取页面上指定的区域(DOM),依赖于PhantomJS的CasperJS提供了更强大的函数封装、方法和语法糖,可以完成定义排序浏览器导航步骤、填充提交表单、点击跟踪链接、指定DOM元素区域截图等任务,当然也可以实现备份微博。

首先使用CasperJS模拟用户登陆微博过程,填写用户名密码并提交表单。

var casper = require("casper").create();
casper.start('http://www.weibo.com/login.php', function() {
    this.fill('div[class="W_login"]', {'loginname':'YOURUSERNAME'}, false);
    this.fill('div[class="W_login"]', {'password':'YOURPASSWORD'}, false);
    this.click('a[class="W_btn_d"]');
});

用CasperJS给页面上指定的区域(DOM)截图非常简单:调用captureSelector,给页面中'.WB_feed_type'选择器匹配的元素截图,输出的文件名为微博的mid号。

casper.thenOpen('http://weibo.com/u/UID',function() {
    mid=this.getElementAttribute(".WB_feed_type", "mid");
    this.captureSelector(mid+'.png',".WB_feed_type");
});

最后获得的微博截图效果如下,加入cron定时任务就能自动备份。现在个人微博首页只显示5条最新微博,可以每次将5条微博全部备份,同时设定合理的更新间隔时间,可以避免只备份最新微博但是在更新间隔时间里新增了多条微博的问题。类似的,稍加改动还可以应用于备份twitter豆瓣的timeline。

weibo_capture

编程语言的网络

最近在上Coursera的SNA社交网络分析,翻之前学生做的大作业压力好大,有做知识网络Network map of Knowledge and Art,有做俄罗斯选举的投票网络,还有类似的哲学的发展网络。按照哲学家网络的思路,我拿编程语言的网络来练个手,每种语言是一个节点,如果语言B受语言A的影响,则B向A连边,比如Java和Python都有受Smalltalk的OO影响,smalltalk又受Lisp,Logo影响。

数据获取
数据来自DBpedia语义数据库,简单的说,它收集的是维基百科的数据,然后经过一些处理得到结构化的语义web。互联网发明人蒂姆·伯纳斯-李曾在TED演讲"关联数据",互联网最初的设计只是想把文档放在一起而已,但是现在互联网还是有巨大的可释放潜力,我们从网上得到的数据不是我们想要的数据。在DBpedia如果你去找John McCarthy,会包含了与John McCarthy相关的信息,它们被联系到了一起,比如他的导师、他所带出来的学生、出生年、出生地、获得的成就等,下一代搜索引擎比如Wolfram|Alpha就是这么工作的。
然后用SparQL,它将Web2.0和Semantic web两种新的web技术联系起来,你可以直接在web页写类似sql语句进行查询编程语言以及该编程语言收到那些语言的影响(要翻墙):

SELECT * WHERE {
?p a <http://dbpedia.org/ontology/ProgrammingLanguage>.
?p <http://dbpedia.org/property/influencedBy> ?influencedBy.
}

拿到数据初始化/归一化,导出为csv。

数据可视化
使用Gephi进行数据可视化,这是个开源的复杂网络分析软件,没教程也能上手。这里生成了552 nodes, 1011 edges的网络,平均路径长度3.126,Force Atlas Layout,使用HITS算法提炼枢纽节点,可见Lisp, Smalltalk, C, Java, Scheme, Pascal在语言发展中的地位,不过ALGOL和Fortran不是很大,估计是太古老太传说了,新语言出度没有传递给这两者。
颜色按Community分类:绿色是functional language和logic language,橙色是object-oriented,淡蓝色Javascript,Pascal和Ada,ALGOL在一起,Lisp和Scheme分家了,看看就好。

network

节点大小按Degree设置,标出了一些有代表性的语言 比如R,Logo, Prolog, COBOL
network

如果把C语言和他的邻居受C语言影响和影响C语言的节点筛选出来,C的入度有54是所有节点里最大的,庞大的C家族一目了然:
红色表示出度,C的前身是B,原型是ALGOL 60,受Fortran和PL/I影响用= operator来表示赋值,而非ALGOL的:= operator。
蓝色入度表示C影响了C++, Python, Perl, JavaScript等语言,大部分都借鉴了C的语法。
network

Python,胶水语言,借鉴了Perl, C++, Lisp, Java, Haskell, C, ALGOL, Dylan, Icon等等等等
network

Haskell出度14是最大的,除了Lisp, Scheme, ML/Standard ML好多不认识的语言,冷艳高贵orz
network

我把Lisp, C++, Smalltalk, Java, R, javascript也做了图,放在了豆瓣相册

最后感觉编程语言网络好看有余营养不足:没有时间信息,层次也没有树状清晰。不过可以像豆瓣代码大爆炸一样按时间添加节点效果会很赞。除了分析枢纽Hub节点和平均路径长度应该还有可以挖掘的地方。

O'Reilly动物丛书颜色分析

在上次O'Reilly情人节福利文章里提到O’Reilly动物丛书颜色和内容的联系,于是拿到了360本O’Reilly丛书的旧数据,使用Python+networkx+matplotlib进行分析:

按颜色关键词排序
对书名进行分词作为关键词,统计频次排序。这里篇幅限制列出了出现大于1次的keywords列表,很明显动物丛书颜色是有主题的,比如最新的Data Science Kit都是红色封面。

PMS 301C
微软系列
[('.net', 12), ('windows', 10), ('visual', 7), ('basic', 6), ('c#', 6), ('2000', 5), ('essentials', 4), ('excel', 3), ('win32', 3), ('services', 3), ('writing', 2), ('framework', 2), ('server', 2), ('security', 2), ('access', 2), ('macros', 2), ('active', 2), ('language', 2), ('vb.net', 2), ('system', 2), ('word', 2),('asp.net', 2), ('administration', 2), ('transact-sql', 2),('applications', 2)]
PMS 3272C
Web相关
[('web', 12), ('xml', 7), ('mx', 5), ('javascript', 4), ('apache', 4), ('php', 4), ('essentials', 3), ('flash', 3), ('xslt', 3), ('html', 3), ('actionscript', 3), ('services', 3), ('practical', 2), ('cd', 2), ('privacy', 2), ('perl', 2), ('bookshelf', 2), ('http', 2), ('applications', 2)]
PMS 313C
神兽Perl
[('perl', 25), ('best', 3), ('journal', 3), ('perl/tk', 3), ('regular', 2), ('graphics', 2)]
PMS 165C
Oracle系列
[('oracle', 31), ('pl/sql', 7), ('sql', 3), ('tuning', 2), ('sql*plus', 2), ('performance', 2), ('database', 2), ('essential', 2), ('dbas', 2)]
PMS 2607C
Java相关
[('java', 33), ('enterprise', 7), ('javaserver', 3), ('javabeans', 3), ('best',3), ('applications', 3), ('practices', 3), ('xml', 2), ('web', 2), ('jdbc', 2),('data', 2), ('struts', 2), ('weblogic', 2), ('vol.', 2), ('servlet', 2), ('pages', 2), ('database', 2), ('jakarta', 2), ('workbook', 2)]
PMS 246C
语言+工具
[('python', 6), ('c', 6), ('c++', 5), ('mysql', 3), ('shell', 3), ('awk', 3), ('gnu', 3), ('practical', 3), ('vi', 2), ('unix', 2), ('sed', 2), ('emacs', 2), ('uml', 2), ('editor', 2), ('sql', 2), ('using', 2), ('embedded', 2), ('cvs', 2),('software', 2)]
PMS 2725C
Mac OS X
[('mac', 7), ('x', 7), ('os', 7), ('unix', 4), ('cocoa', 3), ('geeks', 2), ('panther', 2)]
PMS Reflex Blue
网络通信
[('networks', 4), ('using', 4), ('cisco', 4), ('network', 3), ('internet', 3), ('sendmail', 3), ('system', 3), ('administration', 3), ('samba', 2), ('essential', 2), ('routers', 2), ('802.11', 2), ('dns', 2), ('lists', 2), ('wireless', 2),('protocols', 2)]

orelly

按书名关系可视化

按颜色聚类就没有意义了,所以就按书名建图:如果两本书书名有相同的关键词则连边。把无信息量水词pocket, reference,cookbook, programming, guide, definitive, learning, designing, managing, mastering, building加入stopwords,剩下书名包含的信息量更有限了,每个节点的度不大。

作图用了Fruchterman-Reingold force-directed algorithm,同其他书关系比较多的书将绘制的比较靠近中心,而关系较少的会在相对靠外的位置。可以看出橙色和紫色封面的书有比较好的聚类,因为橙色关键字是Oracle紫色关键字是Java,青色的有Perl系列的,右下粉色的是Python系列。

orelly-with-labels

PS1: 不是统计专业的,也不知道还有什么信息可以挖掘,计算closeness, betweenness, Hub节点在这里ms没有实际意义,再去解下最大团Maximum Clique啥的。
PS2: 要是能找到更全更新的O'Reilly动物丛书数据就好啦!

O'Reilly情人节福利

oreilly

今年情人节O’Reilly给程序猿们也带来了福利:所有粉红色的电子书半价。FOREVER ALONE!

说到O’Reilly出品的动物丛书,程序猿无人不知。这系列书最显著的特点就是封面上手绘的动物,所以也有动物世界/饲养员指南的别名。考据癖有专门一篇文章解疑了为什么O’Reilly用动物形象做书籍封面,原文可见Origin of Species: A History of O'Reilly Animals

设计者Edie Freedman姐姐在设计动物丛书的第一本书时(上图中间),她接触到UNIX、vi、sed&awk、lex、yacc这些不知所云的词,让她觉得这些词都像来自于当时正流行的游戏“龙与地下城”,于是她心目中UNIX程序员的形象就是一个龙与地下城的玩家。Edie在19世纪的木版画中找到了灵感,画中诡异的动物刚好和那些高深的UNIX术语是绝配。还有一件更严肃的事情,出版动物丛书让Edie更加注意到生态问题。很多封面动物已经濒临灭绝,而在版画绘制的时期,这些动物还是大量存活的。O’Reilly也希望他们使用这些动物做封面能够引起人们对动物保护的关注。

关于O’Reilly动物丛书颜色和内容有没有联系,应该是有,不过没有查到具体说明和相似的问题,不过有所有O’Reilly丛书数据,可以根据颜色然后分析关键词,就先在这挖个坑。FOREVER ALONE!

Unix隐藏文件的由来

今天在豆瓣上看到的文章,原文来自Rob Pike 8月发表在google plus上关于Unix dot files实现的教训,才知道Unix以.开头的文件被作为隐藏文件是个不经意的结果:

在当年Unix的文件系统在设计过程中,加入了.(当前路径)和..(上层路径)来方便路径定位。但是在输入ls的时候,.和..却错误地被显示,所以Ken或Dennis加入了用汇编写的判断,用C写出来就是:

if (name[0] == '.') continue;

其实正确的写法本应是:

if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;

于是被简写的代码无心插柳:出现了隐藏文件(dot file)的思路。其实Unix就是个各种bug不好用的系统,但是后来各种bug习惯了,就成了约定俗成的feature。就好像博主是个好人,但是好人卡拿多了习惯了,最后就forever alone了<-解释给猪肉肉听!

Rob Pike吐槽这是个捷径的教训,他认为应该是文件来发挥这个作用,而不是以文件的命名方式决定。

For those who object that dot files serve a purpose, I don't dispute that but counter that it's the files that serve the purpose, not the convention for their names.

前半句没看懂,被自己蠢哭>3<类似于DOS and MS Windows系统?附个资料~Hidden file and hidden directory

close