• 2012-07-15

    用C语法来写Python代码

    Views: 19663 | 11 Comments

    我认为 Python 不错, 因为作为脚本语言和动态语言, 它真的无可替代. 能作为通用用途的脚本语言本来就少 - PHP 主要用作 web 开发, gc 不成熟; Perl 算冷门, Ruby 等的语法就更加不堪入目了; Java/C# 需要编译且静态类型; JavaScript 主要在浏览器宿主中. 另外, Python 非常流行, 库很全.

    但是, 我决不认为 Python 的语法很优雅. 用缩进来表示区块的方法, 只对于少量代码才是优雅的, 当代码区块超过10行或者代码文件超过100行时, 缩进常常让你眼睛模糊, 这时就一点也不优雅了. 而且, 缺少了花括号, Python 的匿名函数和 lambda 表达式就是一项残废的鸡肋功能, 我怀疑是否真有人使用来虐待自己.

    前面也讲过, Python 非原始类型的函数默认参数其实相当于函数的静态变量, 这个语法负作用对初学者和仅仅把 Python 当工具的开发者是一个坑.

    另外, Python 里类函数的声明中的"self"也是毫无意义, 何不隐含"this", 并且强制要求使用类成员时必须带"this."呢? 而且, 调用父类方法的方式也是让人无可奈何.

    如果有这样的一种脚本语言(动态语言), 它继承了C的语法, 吸取了 Java 和 JavaScript 对 C 的改进部分, 同时使用 Python 引擎, 那将会是一种非常舒服的语言.

    可以使用一个编译器, 把这样语法的的代码编译成 Python 代码, 然后用 Python 执行器来执行, 这样很快就能实现. 我会这么干的. 项目地址: https://code.google.com/p/cpy-scripting-language/

    Posted by ideawu at 2012-07-15 14:29:22
  • 2012-05-25

    从开源社区学来的知识应该更加开放

    Views: 16993 | 3 Comments

    对于知识的创造者, 应该保有从其所创知识获得收益的权利, 比如小说的作者应该获得版税.

    而对于网络博客, 特别是关于IT技术的博客, 我认为作者应该更开放一些, 不要太小气. 本来网络上的东西就应该开放一些.

    我看到据称是世界第三的Nginx贡献的某国人的博客, 上面赫然写着:"如需转载,请留言或发邮件至...问询", 必须经得同意之后才能转载.

    "有性格", "写得不错", ... 你可以这么说, 没错! 他可以不允许别人保留出处转载他的文章, 但我同样可以鄙视这种在知识自封的人.

    也许你写得不错, 也许你真正做出了贡献. 但是, 作为一个接触那么多开源软件, 而且是在开源软件之上做的学习, 竟然对自己知识如此封闭, 真不是一个让我认同的人.

    如果是一个开放的人, 自己的博客文章被人正常正确地转载, 应该感到开心. 补充一点, 有这种行为的技术人员, 不一定是本质上的小气, 而是因为把知识当作奇技淫巧, 自认清高的不好风气.

    Continue reading »

    Posted by ideawu at 2012-05-25 10:37:16
  • 2012-05-25

    即时流式数据 MapReduce

    Views: 8075 | No Comments

    传统的 MapReduce 如 Hadoop, 是以任务的形式进行的 -- 获取一批数据, 提交给系统, 然后获取结果. 但是, 有一些统计的需求是即时的, 统计任务需要持续的运行, 一旦数据生成, 便立即发给统计任务处理, 生成的结果"推"给接收者.

    以一个网站用户在线时长统计的需求为例子, 那么系统就有这几个部分:

    数据接收

    接收 Web Server(如 Apache/Nginx) 的 log, 例如使用 syslog.

    Mapper(格式转换)

    依次输入以行为单位的原始的 Apache log, 输出一条或者多条结构化的数据. 这个输出将出 Reducer 进行下一步处理.

    Reducer(统计器)

    不同的精度用不同的统计器, 因为统计结果必须在要求的精度时间内进行输出. 例如当精度要求是小时, 用户连续在线1个小时, 并且横跨在2个自然小时上, 那么, 统计结果应该是2条. 如果精度要求是天, 那么类似, 跨越自然天的数据应该被分割.

    当 Reducer 的精度时间到达之后(如一个小时过完), Reducer 应该复位.

    传统 Reducer 的输入是来自 Mapper, 但 Reducer 的输入来源应该包括其它的 Reducer. 例如, 按小时统计的 Reducer 的输出可以作为按天统计的 Reducer 的输入.

    结果分发器

    结果会以不同的形式发送出去, 如写成文件, 发邮件, 推送到其它系统...

    结果的结构

    有一种简单的数据库存储结构(先不考虑分表分库), 表的结构为:

    time, timespan, key, val
    UNIQUE(time, timespan, key)
    

    用户在线时长的数据这样存:

    2012-05-25 09:12:20, 小时, ip1, 100s // ip1在线了100s, 从09:12:20开始
    2012-05-25 12:24:10, 小时, ip1, 200s // ip1在线了100s, 从09:12:20开始
    2012-05-25 09:12:20, 天, ip1, 300s // ip1 2012-05-25 在线了300s, 但不是连续在线时间
    

    系统

    根据上面的思想, 可以设计出一个即时流式数据的 MapReduce 系统, 也可以做一个代码框架. 但系统和框架的区别是, 系统包含了运行环境.

    上面不同部分之间的通信会形成一种广义上的"队列", 所以需要进行队列管理.

    Posted by ideawu at 10:13:27
  • 2012-03-23

    Redis被bgsave和bgrewriteaof阻塞的解决方法

    Views: 45608 | No Comments

    Redis 是一个性能非常高效的内存 Key-Value 存储服务, 同时它还具有两个非常重要的特性: 1. 持久化; 2. Value 数据结构. 这两个特性让它在不少场景轻松击败了 Memcached 和 Casandra 等.

    Redis 的持久化在两种方式: Snapshotting(快照) 和 Append-only file(aof). 在一个采用了 aof 模式的 Redis 服务器上, 当执行 bgrewriteaof 对 aof 进行归并优化时, 出现了 Redis 被阻塞的问题, 此时, Redis 无法提供任何读取和写入操作.

    按字面理解, bgrewriteaof 是在后台进行操作, 不应该影响 Redis 的正常服务. 原理也确实是这样的, Redis 首先 fork 一个子进程, 并在该子进程里进行归并和写持久化存储设备(如硬盘)的. 按照正常逻辑, 在一台多核的机器上, 即使子进程占满 CPU 和硬盘, 也不应该导致 Redis 服务阻塞啊!

    其实, 问题就出在硬盘上.

    Continue reading »

    Posted by ideawu at 2012-03-23 13:50:34 Tags: , , , , , , ,
  • 2011-08-05

    Fn和CTRL的故事

    Views: 12021 | 7 Comments

    从前, 键盘工程师新创造了一个叫"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垂头丧气, 成了不受欢迎的失败产品. 现在, 它在寻找一个最不起眼的角落, 想静地躺在那里, 不要像以前那么招摇.

    Posted by ideawu at 2011-08-05 22:55:50
  • 2011-08-03

    概率选取的实现

    Views: 9991 | 5 Comments

    常常有这样的功能需求: 每次从一批候选项中随机选取其中一项, 要求每一项的出现都有一定的概率. 比如说, 有如下候选项和对应的概率: 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){
            // 选中了
        }
    }
    
    Posted by ideawu at 2011-08-03 09:02:49
|<<<123456789>>>| 5/11 Pages, 61 Results.