互联网数据聚合

我们经常需要从互联网上获取数据,在很多情况下,你需要的是特定信息,或者说是符合某些条件的信息,比如:

image

这条需求隐含着两个有普遍意义的步骤:

  1. 从互联网上聚合符合特定条件的信息;
  2. 当满足阈值条件时,以某种方式通知用户。

事实上有太多做互联网数据聚合的网站了,比如酷讯机票,聚合了各大航空公司的机票信息:

image

再比如一些博客聚合网站等等。现在想想这样的场景:

  • 每到一个新地方,自动给我的各个微博账号发一条地点签到微博;
  • 我关注的明星有最新的动态,邮件通知我,第一时间获得消息;
  • 我的股票一旦涨到某个值,短信提醒我该抛售了;
  • ……

其实这些事情不难实现。

IFTTT

不知道你是不是和我一样,

[……]阅读全文

网络爬虫

最近在写一个程序,去爬热门事件和热门关键词网站上的数据。在这里介绍一下网络爬虫的种种。

基本组件

image

网络爬虫也叫做网络蜘蛛,是一种互联网机器人,把需要的网页撷取下来,组织成适当格式存储。它是搜索引擎的重要组成部分,虽然从技术实现上来说,它的难度往往要小于对于得到的网页信息的处理。

上面这张图来自维基百科,scheduler调度多个多线程的下载器下载网页,并把信息和元数据存储起来。而通过解析下载网页的数据,找到链接,又把链接加入到工作队列中去准备下载。这看起来是一个迭代的过程。

网络爬虫相关的几项重要策略:

  • 选择策略:哪些网页是需要被抓取的;
  • 重访问策略:怎样的方式去检测网页是否被修改过;

[……]阅读全文

JavaScript使用for循环时出现的问题

javascript 这个问题的讨论最初来自公司内部邮件,我只是把这个问题的讨论内容记录下来。

有一些项目组在定位问题的时候发现,在使用“for(x in array)”这样的写法的时候,在IE浏览器下,x出现了非预期的值。

具体说,如果自定义了Array.prototype.indexOf方法(譬如源于某prototype污染),也许是因为老版本IE浏览器并不支持array.indexOf方法,而开发者又很想用,那么这样的浏览器可能会出现这样的问题:

Array.prototype.indexOf = function(){...};
var arr = [1, 2];
for (x in arr) consol

[……]阅读全文

再谈大楼扔鸡蛋的问题

egg 这道题是说,100层楼,两个一模一样的鸡蛋,某层之上扔鸡蛋就会碎。问要测试多少次才能找出这层楼来。我曾经在去年初的这篇文章里面讨论过这个问题的解法,因为只想记录一下思路和讨论过程,写得很简略。现在,我想重新整理一下这个问题,再稍稍扩展和挖掘一下。希望可以用尽可能清晰易懂的描述,把这个问题的前后说清楚。

现在只有两个鸡蛋,而算法必须在各种合法输入下都是可行的,就是说要能找出这一层来,你得假设你的运气最差,这就意味着,我求解的是在每种扔鸡蛋的策略下都有一个需要扔的次数的最大值,而现在需要求解的是这些最大值中的最小值的问题。如果我只有一枚鸡蛋,这就意味着,我只能从第一层开始老老实实地一层一层往上试

[……]阅读全文

有趣还是无趣?

funny 这是一篇扯淡,一篇rant,或者是一坨不靠谱的文字。有一些观点过于偏激,如果你没法接受,也请不要太在意。

无趣的接口封装

我记得刚工作的时候,我的第一个正式项目是去写一个基于SOAP的WebService接口,那个时候觉得新鲜,“原来web service是这样子的!”;到了现在,已经写过各种各样的service接口,再也没有觉得做这样的事情很有意思,或者很有新意、很有挑战性,尤其是一些并不复杂的增删改查的接口(当然业务逻辑是有够繁琐的)。

有同事说,做界面、做portal并没有什么意思,都是浮于表面的东西。虽然我不完全认可,但在这个前端工作被普遍瞧不起的国度,而且从某些层面上说也对,可是我

[……]阅读全文

行动、眼界和体验

action 这是一堆杂乱的文字。可以认为它是我从去年二月份正式跳槽到北京工作以来,这一年三个月的时间里,出现次数最多的感悟。

不知道有多少人和我一样,有选择焦虑症,总是思考要做出怎样的决定而浪费了时间。事实上,在大多数情况下我们总不能做出完全正确的选择,就像人生永远都会充满遗憾和后悔。做软件也是一样,想一猛子扎下去把东西设计完美,就走上了彻底的不归路。倒不如,像Facebook说的那样,“move fast and break things”,先弄出一个符合你基本预期的东西来,然后再来细细打磨和深加工,做所谓的“refactory”?

这看起来像个权衡的算术题对不对?到底是思考久一点,调查久一点,慢一点

[……]阅读全文

DNS劫持

想谈一谈这个话题是因为最近有一位朋友抱怨他的博客在某些用户某些时候访问的时候,被莫名其妙地加上了广告,他检查来检查去,始终发现不了网站本身有什么问题,后来他才了解到了DNS劫持一说。

DNS劫持

其实这不是一个新概念了,在几年前,中国一些不讲道德的运营商,尤其是地方运营商就开始捕捉用户浏览器的访问记录,然后根据不同用户的访问行为,有选择地往用户访问的网页里面推送广告。因为运营商掌握着DNS主机,所以他们可以为所欲为地强制改写网站HTML页面,采用往返回页面里写入JavaScript等方式,来注入广告:

image

这是访问55BBS网站时某些用户会在屏幕右下角看到一个京东商城的广告。这样的广告,

[……]阅读全文

Notes: Hadoop-based open source projects

Here's my notes about introduction and some hints for Hadoop-based open source projects. Hope it's useful to you.

Management Tool

Ambari: A web-based tool for provisioning, managing, and monitoring Apache Hadoop clusters which includes support for Hadoop HDFS, Hadoop MapReduce, Hive, HCata

[……]阅读全文

你没有抓住Promises的要点

注:这篇文章翻译自《You're Missing the Point of Promises》,阅读这篇文章,你首先需要对于JavaScript中的Promises是什么有了解,否则,你可以先看一看这篇文章(英文),或者这篇文章(中文)掌握基础。有一些修改,另受水平所限,翻译的不当之处请参阅原文。

Promises是一种令代码异步行为更加优雅的抽象。如果用最基本的编码方式,代码是这种连续的形式:

getTweetsFor("domenic", function (err, results) {
    // the rest of your code goes

[……]阅读全文

小诗一首

libai 早上读到这条微博

当年论剑天山麓,一举成名处
青虹出鞘试锋芒,敢叫星辰暗淡月无光
而今历尽风尘闹,隐退江湖道
松涛林海意从容,不向行云流水问花红

烟客淘大湿回复道:

曾是少年多意气,
凡尘识尽亦悠然。
浮生何为虚名累,
断剑拿来换酒钱。

另一位子柳大湿也回复(唐伯虎的诗):

酒醒只在花前坐,
酒醉还须花下眠。
花前花后日复日,
酒醉酒醒年复年。

我觉得我也凑个热闹吧:

文墨岂识少年志,纸醉笔醒意阑珊。
花月诗文键盘翅,亦思亦梦程序员。
深居远行寂寥戏,修节积跬待涅槃。
待日终吁事成气,乐享创世自在言。

—&mdas

[……]阅读全文

Google矩阵

google matrix 使用一款搜索引擎,我们希望搜索结果能够拥有最佳的排序,Google为它最核心的排序算法PageRank申请了专利。在PageRank以前,排序大多依靠对搜索关键字和目标页的匹配度来进行的,这种排序方式弊端明显,尤其对于善于堆砌关键字舞弊的页面,很容易就跳到了搜索结果的首页。Larry Page和Sergey Brin开始着手解决这个问题,Google排序的继承来自于互联网上网页之间的链接关系。一张网页被其它网页引用的次数越多,可以简单地认为这样的网页越受欢迎,当然在结果列表中应该越靠前。

前面提到了目标网页被引用网页的“数量”,另一条重要的判定PageRank级别的

[……]阅读全文

编程语言学习和使用的观点

vb 我的一些关于编程语言学习和使用的观点如下,因为最近谈到这个事情,就记录下来吧,但是我只想简单的表述出来。当然,我不想陷入语言孰优孰劣这种争论的圈子里。

多掌握一门语言有没有价值?如果一门新的语言能改变你对编程的理解,它就是值得学习的。另外,每一门语言对应着一种或几种“编程范型”,接触不同的编程范型是很有价值的,这是扩展视野的好机会。

编程语言只是工具,工具都是用来解决特定的问题的。特定的问题使用适合的工具来解决。但是很多情况下,我们的选择太多。选择这一门编程语言的原因可能只是因为“它很酷啊”,或者“因为大家都在用它”。另外,还有一种极端的滥用的情况:“当手上有一把锤子的时候,你看什么都是钉子

[……]阅读全文

使用ID3算法构造决策树

决策树

决策树是一个预测模型,它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。

这张图很好地解释了决策树:

dt

明天要不要出去玩?

  • 晴天:
    • 潮湿:不出去
    • 不潮湿:出去
  • 阴天:出去玩
  • 雨天:
    • 刮风:不出去
    • 不刮风:出去

例子中可以找到两层的分类依据属性,第一层是晴/阴/雨,第二层是是否潮湿和是否刮风,分类依据的确定和先后顺序对决策树的质量有决定性的影响。另外,在实际

[……]阅读全文

朴素贝叶斯分类

bayes 贝叶斯定理

英国数学家贝叶斯(Thomas Bayes)曾经给出如下定理:

P(A)表示A事件发生的概率,P(B)表示B事件发生的概率;P(A|B)表示在B事件已经确定发生的情况下,发生A事件的概率;P(B|A)表示在A事件已经确定发生的情况下,发生B事件的概率;P(AB)表示AB事件同时发生的概率。所以:

P(A)P(B|A)=P(AB)=P(B)P(A|B)

也就是说,A事件发生的概率乘以A事件已发生条件下B事件发生的概率,和B事件发生的概率乘以B事件已发生条件下A事件发生的概率,这二者是相等的,都等于AB事件同时发生的概率。

(特例:如果A、B是独立事件,互不相关,那么P(A)=P(

[……]阅读全文

大数据时代的隐私安全危机

big data 315晚会上,网易销售人员为了强调”精准营销”,面对央视镜头称:通过cookies代码可以追踪用户隐私,甚至能读取网易用户的私人邮件。这件事情引起了轩然大波,网易股价当天就暴跌,但是也引起了无数争论。不可否认通过cookie可以获取用户信息,但是在这样做的企业有多少呢,这并不是一件稀奇到值得争论的事情;而推送恶意广告或者获取私人邮件,又成了遭来非议的过分行为。

网易手里掌握了多么海量的用户信息,该怎样用这些信息去谋取利益,却又避免背上“作恶”的骂名?这似乎就是薄薄一层窗户纸而已。没有足够的法律法规,也没有足够统一和公开的标准,每个人都会有自己的理解。当Google在利用搜索推送关联广告赚钱的

[……]阅读全文

reCAPTCHA项目

image 要说reCAPTCHA,就要先说一说CAPTCHA,全称是Completely Automated Public Turing test to tell Computers and Humans Apart,即全自动区分计算机和人类的图灵测试,也就是通常说的“验证码”,目的就是要把计算机和人区分开来。在互联网站上,为了防止不安全的、重复暴力的登陆密码破解等操作,需要使用验证码来将机器行为拒之门外。

验证码当然可以被识别,随着破解和反破解技术的发展,验证码的技术日新月异(简单的验证码很容易实现,在我刚开始学习JavaEE的时候,曾经写过一个验证码的实现程序)。最初对于验证码的机器识别,大多采用

[……]阅读全文

IT外企在中国

外企 要说这个话题是因为昨天和朋友聊起IT外企在中国就会“变味”的现实。

朋友口中的Google中国,尤其是在那件众所周知的事情之后,实在是不能和本土Google公司相提并论。他以前在北京和上海的Google中国工作过,他说,把一群非常优秀的人放到一起,就能做出成功的产品吗?未必如此,他经历了许许多多失败的项目。在会上大家总是一致喊好、互相鼓励,但是私下里却清醒地意识到、谈论着产品的问题。可为什么就没有人公开地说真话?

我们可以细心数一数在中国的那些非常有名的IT外企,的确并没能够做出多少革命性的或者令人眼前一亮的产品来,在我看来这实在算不得成功。鲁迅早就说过,中国是一

[……]阅读全文

过多if-else分支的优化

if-else 我想谈一谈这个话题是因为我的上一篇博客在ITEye上有一些朋友回复,说if-else过多的分支可以使用switch或者责任链模式等等方式来优化。确实,这是一个小问题,不过我们还是可以整理一下这个小问题的重构方式。

为什么要优化?

你没有看错。这是要放在第一条谈论的。

有许多人会说,叠起来一堆if-else分支,代码就不优雅了。可是,怎样去定义“优雅”的概念呢?再退一步说,即便不“优雅”,又有什么问题?

对于这样一段再普通不过的代码:

int code;
if("Name".equals(str))
	code = 0;
else if("Age".equals(str))
	code = 1;

[……]阅读全文

代码洁癖症的表现

cleanliness 有下列情形之一的,你患上了代码洁癖症。症状程度可轻可重,轻者帮助写出优雅整洁的代码,重者走火入魔,万劫不复。

  1. 多余的空行、分号,没有使用的变量,见一个删一个。
  2. tab或者空格没有对齐的必须纠正过来,除了缩进用,不允许看到代码内连续两个空格。
  3. 看到一个类某个方法没有注释,不由自主地加上,不管有没有意义。
  4. 错误的拼写,无论是在命名还是注释必须纠正过来;不一致的大小写,必须要纠正过来;标点符号的遗漏,必须补上。
  5. 看到if(a==0)这样的代码必须改成if(0==a)这样的形式。
  6. 所有IDE对代码的告警必须消除,无论采取的方式是否有实际意义。
  7. 看到赤裸的数字,必须定义成常量,即便数字表意很直观,还

[……]阅读全文

back to top