作者归档:Dante

RSS feed of Dante

最后更新于 .

各位C、C++开发的朋友们,有没有想过小小的printf也会有陷阱呢?这篇文章,我们就深入来探究一下(代码均在suse10 32位系统下编译测试通过)。 废话不多说,直接上代码:

int64_t a = 1;
printf("%d\n", a); 

结果是多少呢?当然是1,你可能会说。 我们来看一下结果:

1

果然是1!但是你会不会以为是 a 首先被自动转化成了 int 类型,然后输入为 1的呢? 如果真这么简单,本文到此也该结束了。我们换一个写法:

int64_t a = 1;
int b = 2;
printf("%d, %d\n", a, b);

这次的结果是多少呢?1 和 2?真的吗?我们来看一下结果:

1, 0 ...

最后更新于 .

在日常的前后台联调中,我们都习惯用host的方式来使某个域名的cgi都访问测试环境,然而这有一个显而易见的问题: 如果一个域名下有十几个CGI,而这次提测的只有其中的一个,那么要想整个环境可用,你除了要保证这个CGI可用之外,和你完全无关的十几个CGI也要全部调通。 很纠结,不是吗? 其实我们有更好的方式,那就是用反向代理,我们可以用nginx来实现。 以 appsupport.qq.com 这个域名举例,比如本次提测的cgi路径是:

/cgi-bin/appstage/send_topic.cgi

这个cgi要访问测试环境: 172.16.197.186;而这个域名上的其他cgi都要访问正式的外网环境(如10.137.148.124)。 到http://nginx.org/en/download.html下载windows版本的nginx,解压到C盘,然后修改他的nginx.conf文件如下:

#测试环境
upstream test_env {
    server 10.6.207.119;
}

#预发布环境
upstream pre_env ...

最后更新于 .

相信对于这个标题,用过lisp的朋友一定不陌生,本来也是准备了一大堆理论要讲,想了想还是直接举例子比较好。 就举最近产品提的一个产品需求吧,简单描述一下:

  1. 对于不同的第三方应用,有不同的频率限制。没有配置则使用默认值
  2. 对于不同的第三方应用,在不同的时间段,有不同的频率限制。没有配置则使用默认值

公司内部都是用C++,当时第一点想到的肯定是配置一个xml文件,里面配置上这些参数,在进程启动的时候,用tinnyxml或者其他xml解析器把xml解析成C++可以辨识的数据结构。

我们来看一下这个xml配置有多复杂:

<freq_config interval="60" pt_relevant="1">
    <app_list>
        <app appid="0" max_day_load="360000">
            <time_range_list>
                <time_range begin_time="1" end_time="5" load_perc="0.1" />
                <time_range begin_time="17" end_time="20" load_perc="0.5" />
            </time_range_list>
            <pt_config ...

最后更新于 .

之前已经已经写过一篇《从开放平台建设者角度对应用开发者的一点架构建议(1)》,主要是介绍了最基本的openid、平台数据、应用内部数据的存储建议,这一次我们更深入一点。

对之前的文章,我们提到了三种数据:

  • openid-id
  • id-平台数据
  • id-应用数据

相信大部分个人开发者的第一反应是,上面每份数据建一张表,之间建立很多外键关系。这样的确会有很大的好处,很多数据查询操作都可以直接通过sql语句完成,比如:

  1. 通过openid查询id
  2. 通过id查询openid
  3. 通过用户名查询openid/id
  4. 通过应用数据查询openid/id

上面的架构都很好的,并且开发成本非常低,但是这一切的前提是你的应用的用户量有多少。

100w是个坎,100w之前没有任何问题,100w之后,这种架构就是垃圾

很多人会说,对于一个小应用,考虑那么大量用户干嘛?你这是过度设计了吧。

有这种思想的人不少,没错,当年facebook过100w用户的时候,已经是一家有很多职员的公司了。那你会不会觉得,当我们的小应用成长为100w用户的时候,我们已经有了足够的资金,足够的职员,可以考虑重构了?

然而事实是,zynga新推出的游戏《帝国与同盟》在facebook上上线一周,日活跃就达到3000w,更别说注册用户量。而就国内的情况来说,在朋友网上面的任何一款应用,只要不是太差,1~2个月 ...

最后更新于 .

之前的文章已经提到了 django+fastcgi的运行并不如意(web.py+spawn-fcgi却正常很多……),所以特意抽时间研究了一下uwsgi,试了一下,运行的很好,也很快,哈哈。 所以笔者的所有之前用apache+django搭建的项目(如fuload等)都已经替换成了nginx+django+uwsgi。 一.安装uwsgi

  1. http://projects.unbit.it/uwsgi/wiki/WikiStart#Getit 下载最新版本的uwsg。
  2. 解压后,如果没有安装libxml2,又不想安装的话,那么编辑文件 buildconf/default.ini, 把
    xml_implementation = libxml2
    
    改成
    xml_implementation = false
    
  3. 执行编译
    python uwsgiconfig.py --build
    
  4. 执行安装
    python setup.py install
    

这样 ...

最后更新于 .

在上一篇文章linux下nginx+python+fastcgi部署总结(django版)中,我们部署了nginx+django+fastcgi的环境,这次我们来部署一下nginx+web.py+fastcgi。 其实web.py上的官方网站已经说的比较清楚了,原文如下: http://webpy.org/cookbook/fastcgi-nginx 这里主要讲一下一些原文没有照顾到的地方。

一.安装依赖

spawn-cgi

lup

二.配置nginx

在server配置项下增加

location / {
    #这两种方法都可以,只不过spawn-cgi启动的方法不同
    #fastcgi_pass 127.0.0.1:9002;
    fastcgi_pass unix:webpy.sock;

    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_param ...

最后更新于 .

最近因为项目上的需要开始大量使用nginx,因此也想趁机将以前常用的django+apache的架构换成django+nginx+fastcgi,此文是整个搭建的步骤,主要留作备忘,也希望对大家有所帮助。

注意:虽然本文成功的搭建了django运行fastcgi的实例,但是在实际运行中发现了很多问题,比如程序执行异常,进程在每次请求之后退出之类的。可能是我机器的问题,也可能是程序本身bug,大家如果用来搭建外网环境,请务必多多测试。

一.编译nginx

在网上买了一本《实战nginx-取代Apache的高性能服务器》,写的比较浅,主要是些配置方面的东西,不过却正是目前我所需要的。

由于需要支持https和rewrite,所以除了nginx的源码之外,又下载了 openssl-0.9.8r.tar.gz 和 pcre-8.12.tar.gz,把他们和nginx-1.0.4.tar.gz放到同一个目录。

为了方便编译,笔者写了一个脚本,代码如下:

#!/bin/bash

#=============================================================================
#脚本所在绝对目录
abs_path(){
    local path=$1
    local basename=$( basename ...

最后更新于 .

本文来自于Unix对话录的博主刺猬的投稿。 很高兴有朋友能够制作这样的翻译作品来分享给大家,笔者也仔细看了一下,都是些非常常用的命令,因此对Vim初学者应该会很有帮助。 截一部分图给大家预览一下,如果觉得不错请点击这里下载。

1

最后更新于 .

2011年,各大平台相继开放,相信关注的朋友都应该知道,6月15日,腾讯也召开了开发者大会,在这里笔者不想就开放本身做太多讨论,作为一个技术博客,我们还是专注讨论技术架构吧。

笔者在腾讯主要负责腾讯开放openapi的开发,也确实见到了不少应用由于架构不当,导致开发维护成本非常高的例子,更重要的是接入成本非常高导致落在了别的应用后面,所以,笔者在这里会结合腾讯开放的一些特点,给应用开发者一点建议。

如果有朋友致力于应用的开放,希望能有所帮助。

我们就从最基本的地方开始说起吧。

开放平台都会提供一个openid,一个openid对应平台上面的一个真实帐号,在腾讯当然就代表的是QQ号。通过openid就可以或者某个人的个人信息,他的好友关系链等等信息。

那么,怎么让openid与应用自身的数据关联起来呢?

这是我所见到的第一种架构:

一.openid直接作为主键

openid 主键
名称  
性别  
地点  
头像  
应用内部数据  

应用直接将平台的openid来做主键,即应用没有自身的id。
这种方式有什么问题呢?假设说你做的是一个有发展前景的应用,你的应用以后可能会接入facebook,人人,等等开放平台,而每个开放平台的openid格式又都不一样,那么你的数据库表设计将会每个平台的都有一部分不一样,而大部分业务逻辑又都一样,严重违反了“DRY”原则,增加了开发和维护的成本。
所以这种方式不好。

二.有自己的id ...

最后更新于 .

emacs中有gtd模式,那vim是不是也可以实现呢?当然可以! 只要搭配vimwikisnipmate,再加上笔者写的插件vimgtd,就可以完美实现gtd的功能,目前实现的功能如下:

  1. 查看今天待完成的任务
  2. 查看所有待完成的任务
  3. 查看过去某天已完成的任务
  4. 快捷创建任务,标记为已完成
  5. 以不同的颜色标识 未开始、进行中、过期、已完成 状态的任务

一.安装方法

二.使用说明 如功能列表里面提到的,我们一步步来操作

  • 查看今天要完成的任务列表 输入如下命令:
    :TaskToday
    
    此时的界面应该是空的,因为我们还没有创建任何任务。现在在编辑区输入 ...