DigitalOcean 网速测试

AWS 一年免费的 micro instance 就快要到期了, 但是国内访问 AWS 的速度太慢了,所以不想继续使用 AWS。打算换一个 VPS。

在 Twitter 上看见 Anthony 在派发代金券,于是要了一张。

Digital Ocean 提供纽约、新加坡、荷兰三个地区的主机。
我依次在三个地区建一个主机,分别测试从国内访问它们的速度,并与 AWS 的悉尼主机进行比较。
阅读全文 “DigitalOcean 网速测试” »

Effective Java: 使用静态工厂方法

这是 Effective Java 的第一节的标题。本文更多的是摘译该节的内容。

什么是静态工厂方法(static factory methods)

static factory methods 翻译过来就是静态工厂方法。它并不是 GOF 提的设计模式中的一个设计模式。
我们看下面的例子(摘自JDK 1.7)。

public final class Boolean implements java.io.Serializable,
        Comparable<boolean> {

    public static final Boolean TRUE = new Boolean(true);
    public static final Boolean FALSE = new Boolean(false);
        
    public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }
}</boolean>

我们要获取一个 Boolean 的一个对象,可以使用构造函数 new Boolean(true) 也可以使用里面的静态方法 Boolean.valueOf(true),后者便是静态工厂方法。
阅读全文 “Effective Java: 使用静态工厂方法” »

Linux Ext4 文件系统对 MySQL 性能的影响

最近要做一个 MySQL 数据库迁移,就是将一个 MySQL 中的数据迁移到另外一个 MySQL 数据库中。我们碰到了一个 Ext4 文件系统 barrier 的问题。Linux Ext4 文件系统默认开启了 barrier,我们可以在 man mount 里看到下面的这段话

The ext4 filesystem enables write barriers by default.

默认开启的 barrier=1 会极大的影响 MySQL 的性能,约三倍左右。
我做了一个实验测试 barrier=1 对 MySQL 性能的影响。
阅读全文 “Linux Ext4 文件系统对 MySQL 性能的影响” »

可扩展的中小型推介系统实践

本文的目的是描述如何使用 Mahout 开发/部署一个可扩展的中小型推介系统

我会一步一步的描述如何用 Mahout 搭建一个这样的推介系统。本文假设读者对 Mahout 有所了解,熟悉 Mahout 中的协同过滤(Collaborative Filtering)推介算法。本文不会描述 CF 相关的具体算法。

场景描述

这是最近在做的一个推介系统的实际场景。垂直领域的视频播放网站,用户访问我们的网站观看视频,我们根据用户的观看记录向用户推介其可能感兴趣的视频。

  1. 视频数量:几千或几万
  2. 用户数量:几十万
  3. 用户每播放完一个视频后,在视频播放页面显示用户可能喜欢的其他视频
  4. 所有的播放请求中,20% 是登陆用户,80% 为未登陆的匿名用户(由于版权的原因,有些视频必须登陆付费之后才能观看,所以登陆用户的比例很高)

阅读全文 “可扩展的中小型推介系统实践” »

Ubuntu 安装备忘录

新年回来开工第一天就遇到电脑故障,使用有线网络上网的时候,丢包率达到 80%,严重影响到上网速度。最后弄啊弄居然把 Ubuntu 桌面给弄坏了。纠结的,既然无法启动了,那就使用杀手锏了:重装 ^_^
这里记录安装的整个过程,以后就不用到处 google 找教程了。

硬盘安装 Ubuntu
  1. 下载最新的 Ubuntu iso 镜像,放在一个空余的分区。(我用的是 NTFS 的分区,未试验是否可以使用 Ext4)
  2. 重启系统,进入 Grub2 引导界面,按 C 进入手动引导界面
  3. 输入下面的命令
    insmod loopback
    loopback loop (hd1,msdos5)/ubuntu.iso
    linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu.iso 
    initrd (loop)/casper/initrd.lz
    boot
  4. 引导 ISO 镜像之后,按照提示安装 Ubuntu

阅读全文 “Ubuntu 安装备忘录” »

一键快速配置 VIM

每次有新的服务器,或者换新的电脑的时候,配置 VIM 总是很麻烦。不管是一步一步的配置,还是拷贝原有的配置文件,都不是很便捷。有时候要拷贝配置文件的时候,还会发现找不到原来用的配置文件了。

在网上看到一个 Gist。本来挺好用的,但是这个 gist 链接坏掉了,无法打开。不过还好的是自己有个备份,所以稍微做了一下修改保存到自己的 Github repo 里:https://github.com/hellojinjie/vimrc

只要在 bash 里切换当前目录到主目录运行下面命令

curl https://raw.github.com/hellojinjie/vimrc/master/vim.sh | sh

就可以一键完成 VIM 的配置。

如果你对这个配置也感兴趣的话,欢迎 fork,并做适合自己的修改。

初学 D3.js (二)世界地图之Map

好久没有写博客了,最近都在忙另外一个项目,D3.js的学习稍微放下了一段时间,现在闲下来了继续学D3.js。这篇文章中我们将用D3.js画世界地图。效果可以点这里,完整的代码和地图数据可以点这里

首先我们准备地图数据,这是我在网上找到的稍微做了修改,主要的修改是将某省合并到大陆,避免不必要的纠纷。 world-countries.json

我们用了默卡托投影后,南极洲太大了,所以我们先过滤南极洲,这里我们用到了 underscorejs。

var features = _.filter(data.features, function(value, key) {
  return value.properties.name != 'Antarctica';
});

阅读全文 “初学 D3.js (二)世界地图之Map” »

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” »