Sep 09

你可能会觉得PHP中将浮点数(float)转成字符串非常简单, 但是, 常用的方法隐藏着严重的bug. 因为, PHP在处理浮点数时有非常不合理的做法, 会有精度丢失. 经研究, 其实是PHP在显示浮点数时的问题, 也可以说是BUG. PHP内置的echo, var_dump, json_encode, 字符串拼接等函数(指令)在显示浮点数时都有问题, 导致精度丢失.

<?php
$a = 1315537636.338467;
printf("%f", $a); echo "\n";
echo $a . "\n";
echo $a; echo "\n";

结果

1315537636.338467
1315537636.3385
1315537636.3385

也就是说, 用PHP最顺手的方法将浮点数转成字符串或者显示是不行的, 必须使用printf/sprintf将浮点数转成字符串.

Written by ideawu at 2011-09-09 11:33:47

Sep 04

虽然用vhost可以支持子域名, 但不方便.

RewriteCond $1 !^bbs/
RewriteCond %{HTTP_HOST} bbs.example.com
RewriteRule (.*) /bbs/$1 [L]

RewriteCond $1 !^bbs/ 避免内部无限redirect.

Continue reading »

Written by ideawu at 2011-09-04 22:26:02 | tags:

Aug 07

最近, 两大知名的社交游戏厂商, Zynga 和 Digital Chocolate 开始建造自己的服务器硬件环境(IDC)了. 之前, 这两家公司完全使用的是 Amazon 的 AWS 云计算服务. 也就是说, 虽然他们从创业到发展壮大, 却从来不知道也不用关心自己所用的服务器和机房是什么样子. 但是, 现在他们开始控制这部分的内容了, 比如Zynga 建造自己了云计算环境.

这似乎就是云计算服务的作用, 它可以帮助你创业时减少支基础计算能力的考虑, 关注于自己的服务更好的服务于用户. 但一旦发展壮大, 就要把云给踢开了.

不过, 在中国创业初期连这个选择都没有, 必须一开始就要被服务器购买, IDC 机架位租用, 操作系统和软件(如 LAMP)安装等烦恼, 更困难的还是在与管理部门打交道, 耗费大量精力.

Written by ideawu at 2011-08-07 20:57:17

Aug 05

从前, 键盘工程师新创造了一个叫”Fn”的人造人, 想把它加入到键盘按键的队伍里. 工程师想, 它是一个革命性的产品, 因为, 它功能强大, 这从它的名字就能看出它的工程师老母对它的期望. 它可以帮忙打开键盘灯, 这样, 在黑暗中你也可以使用笔记本电脑. 它还可以帮忙调整屏幕亮度, 调整音量, 真是一个强大贴心的助手. 所以, 工程师决定把它放到了原来一个叫”CTRL”的人的位置, 把CTRL排挤到了一边. 那是键盘上最左下角的地方, 也是手指流量最密集的地方.

但是, Fn并不受欢迎, 因为没有人经常需要, 没有人天天不停地打开和关闭键盘灯, 即使好几年下来有一天遇到了, 先开灯或者在进入黑暗之前打开键盘灯也很正常.

相反, 人们怀念CTRL, 因为人们每天要把手指放在CTRL上面上千遍:

CTRL + C: 复制
CTRL + V: 粘贴
CTRL + S: 保存
CTRL + A: 全选
CTRL + X: 剪切
CTRL + W: 关闭窗口
CTRL + T: 打开浏览器标签
CTRL + 空格: 切换输入法

对比Fn, Fn用不了一两回. 因为那些自以为是很内裤的功能, 其实都是和硬件有关, 根本就不常用到. 比如谁会没事按Fn让自己的键盘灯一亮一灭的, 或者没完没了地调整屏幕亮度和音量, 他有病啊!

大部分的电脑厂商都明白了这个道理, 绝情地把Fn赶走了, 重新迎回CTRL. 但是, 有一个叫IBM的巨人和它的买主还是坚持迂腐, 感情上不愿意把CTRL接回来, 最终决定帮人在BIOS里偷偷给Fn和CTRL换了衣服.

Fn垂头丧气, 成了不受欢迎的失败产品. 现在, 它在寻找一个最不起眼的角落, 想静地躺在那里, 不要像以前那么招摇.

Written by ideawu at 2011-08-05 22:55:50

Aug 04

发现一个在网页中绘制数据图, 如曲线图, 柱状图的纯 JavaScript 工具: flot. 极度推荐啊! 有图和代码为证:

*代码附后*

以前知道的工具有 Open Flash Chart, 还有 Google 出品的 Google Chart Tool. 两者使用不同的技术, 同时也是两种截然不同的设计理念. 相比较而言, 我更认同 Google Chart 的设计理念. 原因如下:

Continue reading »

Written by ideawu at 2011-08-04 01:03:09 | tags: , ,

Aug 03

常常有这样的功能需求: 每次从一批候选项中随机选取其中一项, 要求每一项的出现都有一定的概率. 比如说, 有如下候选项和对应的概率: A:10%, B:5%, C:25%, D:60%.

现在, 把每一项的概率用一个正整数(概率值)来表示, 不使用百分率, 整数的总和不一定等于100, 可以是任意大小,

实际概率 = 概率值/总和 * 100%

概率选取的算法如下:

  • 依次(顺序可随机)将各项按概率值从原点开始放在一维坐标上首尾相连, 这样, 每一项对应一个取值区间
  • 在总区间范围内随机选取一个点, 落在哪一项对应的区间就选中哪一项

用伪码表示:

total_p = sum(p1 + p2 + p3 + ...)
rand = random(1, total_p) // [1, total_p]
foreach(items as item){
    rand -= item.p
    if(rand <= 0){
        // 选中了
    }
}

Written by ideawu at 2011-08-03 09:02:49