Currently browsing

December 2013

Scala 数据统计之 Hello World

最近要做一个报表,可是其中有一项 CDN 相关的数据就是不对,差了好几个数量级。于是我从最原始的数据源头开始分析。下面的几行是我们的数据的样本,我们需要统计其中数字部分的总和。
需求有了,那我们应该用什么工具来进行统计呢? 我们有各种的脚本语言可以帮我们完成这个统计任务,甚至我们还可以写 Java 程序来统计。在这篇文章中,我想演示的是如何用 Scala 完成任务。Scala 丰富的 Collection 的类型,及其相应的一些方法,使得 Scala 非常的适合于这类型的数据统计的任务。

下面便是我们要统计的数据的一个片段,每一行都类似于 JSON 的一个 Object,Key 是 CDN 的名称,Value 是对应的 CDN 下载的流量(当然了,这里的 CDN 名称是做过处理的啦~)。我们统计所有的 Value 的总和。这里我用正则表达式的方式去获取 Value。对于每个匹配:(\d+)的 Match,我们取其的 group(1),再toLong就可以得到 CDN 的下载量。
阅读全文 “Scala 数据统计之 Hello World” »

初学 D3.js (一)第一印象之helloworld

最近开始尝试着去学习一些数据可视化的技术,虽然我不是做前端的,但我觉得还是有必要掌握一些可视化的技能的,特别是在项目的前期,没有前端和美工帮你的时候,我们需要自己掌握一些可视化的技术,做出一个可以演示的原型系统。

当自己尝试着去学习 D3.js 时,才发现这个学习曲线不是一般的陡峭。这里记下自己刚开始学习的时候,一些简单的理解。或许可能是错误的一些理解,不过我会回过头来修正这些的。

常见的数据可视化的前端类库
  1. Highcharts JS 应用非常广的一个 Javascript 图表类库,经常可以在各类报表应用中看到影子。
  2. jqPlot 也非常的漂亮,最关键的是 Free and Open Source,项目中有些模块已经在用了。
  3. Echarts 百度做的,看上去很漂亮的样子,不过没用过。
  4. LimeJS 一个 HTML5 的游戏框架,以前用它做过一个简单的游戏,也很不错。
  5. 还有很多其他的吧,不过都没有一个个的考察过去。

阅读全文 “初学 D3.js (一)第一印象之helloworld” »

Hive TODO: query over time-based window

先给自己挖一个坑:给 Hive 增加一个能够在滑动的时间窗口上查询的功能。

类似于下面的语句:

select symbol, min(ticks.timestamp, news.timestamp) as minT
  from StockTickEvent.win:time(30 sec) as ticks, NewsEvent.win:time(30 sec) as news
  where ticks.symbol = news.symbol

静态数据上进行基于时间的滑动窗口查询(哎,这名字起的)

难点是

  • 进行基于时间的滑动窗口查询的前提是数据按时间排序的,而静态的数据是不保证这点的,必须先按某个字段对数据进行排序。
  • 完备的语义定义。
  • 理解 Hive 的 Antlr 语法。并增加相应的语法。
  • 编写 Map Reduce, 把查询转化成最优的 Hadoop job。

重设 MySQL root 密码

最开始的时候其实并不是想重设 MySQL 的 root 密码,我们需要在一个新的 CentOS 上安装 MySQL。于是我们下载了最新的 MySQL 5.6.15 rpm 包。可是我们安装完后,按照以往的初次安装 MySQL 设置密码的方式,怎么也无法登陆 MySQL。删除数据目录重装后也没有用。于是当时我们就只好重设了 root 的密码。这个错误犯的太乌龙了,下次安装软件的时候,一定要浏览对应版本号的官方安装文档,即便是以前有过安装这个软件的经验

在讲如何重设密码之前,我们先看下 MySQL 的 rpm 包是如果处理 root 密码的吧。从 MySQL 5.6.8 开始,新的 rpm 安装包在安装的时候,会在调用 mysql_install_db 时加上参数 –random-passwords。这意味着 MySQL 会为 root 账号生成一个随机的默认密码(存放在 $HOME/.mysql_secret,一般情况都是 /root/.mysql_secret),并且将 root 标记为密码已过期,同时删除匿名账号。

我们在初次安装 MySQL 之后需要使用随机生成的密码登陆 MySQL,然后使用 SET PASSWORD 设置新的密码才能正常使用 MySQL。
更多详细的信息可以查看 MySQL 官方的安装文档: Installing MySQL on Linux Using RPM Packages

下面我们讲如何重设 MySQL root 密码。

第一种方法
阅读全文 “重设 MySQL root 密码” »

微小痛点,微小创新

微痛点、微创新是现在很流行的一个概念。我们做一个产品其实不需要做一个很革命性的创新,我们往往也很难做到革命性的创新。所谓微痛点,就是我们平时生活中经常忍受着,忍受的时间久了便习惯了的微小痛点;所谓微创新,就是我们设计一个解决微痛点的微小创新。只是很多人都不屑于微创新,遇到生活中不便的地方,发发牢骚,然后就着忍受,很少会想到去改进它。

寻找微痛点,是我们进行微创新的入口点。
阅读全文 “微小痛点,微小创新” »

2013 年个人总结

又一年的年终总结,似乎每个人的年终总结都是从感叹时间过的飞快开始的,嗯,我也不例外啦,时间过的真的很快啊,这么快就毕业一年了,这么快就工作一年了。从 2010 年开始写年终总结,到今年应该是第三篇了。(不是我不会数数,而是 2012 年的总结偷懒木有写,所以今年这篇是第三篇 o(╯□╰)o)还欠自己一个研究生三年的总结。

今年的总结照例是记流水账,不过和前两篇有所区别的是今年的总结会分公开的工作篇和和不公开的生活篇。

虽然以前也有一些工作经历,但都是短时间的、或者是兼职类型的,性质上有所不同。虽然每一份工作不管长短都尽力去做好,但还是会有些不同,当然与技术无关,更多的是和交流协作相关的问题,总的来说,在这里工作还是挺开心的啦。
写到这里就不知道该怎么写了,如果是不公开的 blog,我会想到什么就写什么,可是一想到我认识的人也可能会看到这个 blog,于是就写不下去了,每写一个字都要斟酌用词是否合理。
算了,那就不总结了吧,就说说我对工作、对学习的看法吧。

对于工作

我觉得最重要的就是主动,主动的参与到产品的设计、架构的设计、Bug 的修复。主动的推动产品、项目向前走。我不喜欢被动的接受任务,不喜欢在别人分析好业务、理清逻辑后再分配个任务给我,然后做着毫无成就感的工作。要不想做一个别人思想的实现者,就要自己更加主动的参与到工作中,有更多自己的想法。
阅读全文 “2013 年个人总结” »

本博客自定义的CSS

博客主题用的是 One Designs 的 Esplanade。稍微做了一些修改(轻微的像素强迫症 O(∩_∩)O~),比如:

  • 首页在 Mobile 上的 Responsive 布局的细微调整。
  • 首页及文章页的字体行间距的调整。
  • 代码高亮插件的颜色调整 。
  • Embeded Gist 字体调整。
  • 引文格式的调整。
  • 默认雅黑字体。

阅读全文 “本博客自定义的CSS” »

读 coolshell 的“数据的游戏:冰与火”

今天无意中看到 coolshell 上一篇讲数据处理的一篇文章(原文:http://coolshell.cn/articles/10192.html)。
我作为一个才开始接触数据处理不久的人就说说我自己对这篇文章的看法吧。

目前所流行的Buzz Word——大数据是相当误导人的。在我眼中,数据不分大小,只分好坏。
coolshell

这是里面的一句话,coolshell 非常偏激的认为数据质量是最重要的。好吧,既然是偏激,那我以初学者的身份也说说我的偏激的看法:数据只有大小,没有好坏。
阅读全文 “读 coolshell 的“数据的游戏:冰与火”” »

内部匿名类无法访问外面的非 final 的变量的问题

这个题目有点拗口,其实我更多的是想说 Java 内部类的一些特性。

之所以会想起这个题目只要是最近在阅读 JDK 源码中关于 HTTP keepalive 的代码时,其中一个源文件 sun.net.www.protocol.http.HttpURLConnection.java 无意中看到下面这段代码。(注意高亮部分的代码)

final boolean result[] = {false};
java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() {
    public Object run() {
        try {
            InetAddress a1 = InetAddress.getByName(h1);
            InetAddress a2 = InetAddress.getByName(h2);
            result[0] = a1.equals(a2);
        } catch (UnknownHostException e) {
        } catch (SecurityException e) {
        }
        return null;
    }
});

return result[0];

阅读全文 “内部匿名类无法访问外面的非 final 的变量的问题” »

五种不同的 URL 参数解析方法的性能比较

因为在我们的项目中需要解析日志中的 URL 的参数,所以我对比了一下五种不同 的 URL 参数解析方法的性能。

URL 参数解析方法
  1. httpclient org.apache.http.client.utils.URLEncodedUtils
  2. URLEncodedUtils.parse(query, Charset.forName("UTF-8"));
    
  3. jettyUtil org.eclipse.jetty.util.UrlEncoded
  4. MultiMap values = new MultiMap();
    UrlEncoded.decodeTo(query, values, "UTF-8", 1000);
    
  5. tomcat org.apache.catalina.util.RequestUtil
  6. Map values = new HashMap();
    RequestUtil.parseParameters(values, query, "UTF-8");
    
  7. regex 正则表达式
  8. String u = URLDecoder.decode(url, "UTF-8");
    for (String s : parameters) {
        Pattern p = Pattern.compile(s + "=([^&]*)(&|$)");
        Matcher m = p.matcher(u);
        if (m.find()) {
            m.group(1);
        }
    }
    
  9. split 使用String 的split 方法对 URL 进行分割,然后用equals 匹配对应的 参数
  10. String u = URLDecoder.decode(url, "UTF-8");
    for (String s : parameters) {
        String[] a = new String[100];
        if (u.indexOf(s) != -1) {
            a = (u.substring(u.indexOf(s))).split("&");
            a[0].split("=");
        }
    }
    

阅读全文 “五种不同的 URL 参数解析方法的性能比较” »