绕过Bluehost的数据库连接限制(Django/发芽网)

作者:半瓶墨水 链接:http://www.2maomao.com/blog/work-around-max_user_connections/

最近个把月,发芽网的访问量有所上升,直接后果就是数据库报错,说我的数据库用户链接数超过了max_user_connections

联系了一下bluehost,客服跟我说,最近他们设置了max_user_connections为15, 建议我多用cache方式减少数据库连接,并根据我用的是Django推荐了django-staticgenerator,我看了一下,还不错,但是最近太忙了,时间上估计来不及。

bluehost抱怨了一下连接数太少,顺便想到了一个暂时的解决方案:
1. 在settings.py里面加入了一个DATABASE_USERS的新变量,里面放上很多个用户名,这些用户对发芽网的数据库都有同样的访问权限,同样的密码
2. 在后台的python2.6/lib/site-packages/django/db/__init__.py里面,把获取数据库用户的赋值改成了random.choice( settings.DATABASE_USERS )

暂时来看,应该还是有点效果了,先观察几天再说。

BTW: 给发芽网添加了OpenID支持以后,到现在已经有80个用户使用了OpenID,多数都是Google的,第二位的是Yahoo,呵呵这个结果还不错。

  • Share/Bookmark

给发芽网添加OpenID支持,Google帐户登陆很方便

作者:半瓶墨水 链接:http://www.2maomao.com/blog/fayaa-openid/

fayaa-openid-1

上周刚刚做好,欢迎小白鼠 :)
(好像已经有十几个了,大部分都是Google用户)

登陆以后,可以选择生成新帐户(只要稍微改改就行,懒的话直接添个验证码,反正已经有三个人这么做了),或者绑定到老帐户,以后登录发芽网就可以多渠道了。而且,支持绑定多个Openid到一个发芽网帐号哦~~~!

fayaa-openid-2


关于实现

查了一下发芽网的Roadmap,大概八个月前,加入了OpenID的需求,这是个计划了很久的功能,刚刚想到的时候改了一半,结果没做完的工作直接导致了八个月内不敢做其他的更新,看来版本管理还是要做做好。

以下是准备过程:
最初的时候,想用Django-Openid-Auth
后来感觉本地用户还是需要的,就想用Django-Authopenid,被Nonce搞到晕
再后来,想过用Google Friend Connect(谷鸽迁徙香港后放弃)
然后还试过Django SocialAuth
还试过修改gaema
。。。
最终,回到起点,仔细研究了一下python openid的库以及openid的spec,基于python openid自己写了一个
(model那部分代码直接copy了django-authopenid)


PS:
这段时间很少有精力改进发芽网,一半的周末用于来往京津高速回家赔乖女儿乐乐,带她挖沙子是主要任务,呵呵

另外,来北京快5年了,前不久才去了故宫、簋街、南锣鼓巷,长城至今还没有去过,跟猫猫一合计,现在不转转真是对不住自己每天这么辛苦,于是另外一半的周末,一部分时间在北京转转玩玩,另一部分的时间,在睡觉,以及做爱做的事情。。。

  • Share/Bookmark

关于Singleton (单件),线程安全

作者:半瓶墨水 链接:http://www.2maomao.com/blog/when-cplusplus-meet-singleton/

很就没写技术相关的blog了,Twitter和Buzz都很少用了,甚至很少有时间静下来思考、敲打键盘

今天面试问到static关键字的时候,有个应试者提到了Singleton的实现,就顺便多问了一点儿,回来自己又查了查

Singleton,单件,四人帮(GoF)写design pattern那本书的时候提出来的,一个进程内有且只有一个实例

说起这些Design Pattern,当时一看,我操,酷毙了,你不知道都不好意思跟别人说你是搞编程的

后来,渐渐的发现,没有银弹,只是有些Design Pattern或许有些淫荡,比如这个Singleton

一个最初的C++标准实现是这样的(S-V1):

//——————Implementation #1 ———————-
//s.h
class Singleton {
  private:
    Singleton();
    static Singleton* instance_;
  public:
    static Singleton* getInstance() {
        if (!instance_)
            instance_ = new Singleton();
        return instance_; } };

//s.cpp
Singleton* Singleton::pInstance_ = 0;

注意其中构造函数是私有的,所有只能通过getInstance构造,构造前又会先检查,所以只有一个

后来有人说,这样不是线程安全的,哦,那就简单点儿,这样吧(S-V2):

//——————Implementation #2 ———————-
//s.h
class Singleton {
  private:
    Singleton();
  public:
    static Singleton* getInstance() {
        static Singleton* instance_ = new Singleton();
        return instance_; } };

结果有人说,这个是依赖于编译器的,GCC能保证static的初始化不会出问题,但是VC就难说了。
于是,有人觉得既然第一个实现稍微改改就行了,只要加一个淫荡的锁(S-V1.1):

//——————Implementation #1.1 ———————-
//s.h
class Singleton {
  private:
    Singleton();
    static Singleton* instance_;
  public:
    static Singleton* getInstance() {
        lock_mutex();
        if (!instance_)
            instance_ = new Singleton();
        unlock_mutex();
        return instance_; } };

//s.cpp
Singleton* Singleton::pInstance_ = 0;

再后来,有人说这样也不行啊,每次get都加锁,效率太低了吧,那就更加淫荡一点,加锁之前我先check,加锁以后,我再check(S-V1.2):

//——————Implementation #1.2 ———————-
//s.h
class Singleton {
  private:
    Singleton();
    static Singleton* instance_;
  public:
    static Singleton* getInstance() {
        if (!instance_) {
          lock_mutex();
          if (!instance_)
              instance_ = new Singleton();
          unlock_mutex();}
        return instance_; } };

//s.cpp
Singleton* Singleton::pInstance_ = 0;

到这里,在搜索网络以前,我曾经认为已经OK了,但是多CPU多线程的复杂超乎想象,有人说,后一个实现不是线程安全的,因为对于instance的读和写并不是原子操作会发生写一半读一半的情况!
好吧,对效率没啥要求每个singleton就只会用个几次的用S-V1.1,没有多线程的用S-V2


========== 以下我也不是很懂的分割线 ==========

难道真的没办法优化S-V1.1了吗?

有办法,那个instance读一半写一半的情况对于int这个类型是不会发生的,那么,就多来一步,check一个int类型的标识吧:

//——————Implementation #1.3 ———————-
//s.h
class Singleton {
  private:
    Singleton();
    static Singleton* instance_;
    static int flag_;
  public:
    static Singleton* getInstance() {
        if (!flag_) {
          lock_mutex();
          if (!instance_)
              instance_ = new Singleton();
          unlock_mutex();}
          flag_ = 1;
        return instance_; } };

嘿嘿,这下你该满足了吧,NO!,还是有问题的,具体啥问题,参见这里那里,代码已经贴太多了。


进行到这里,你应该已经体会到,Singleton是很变态的,Design Pattern是很淫荡的。。。

Singleton最淫荡的地方在于:真正需要它的机会太少太少了,更多讨论参见:
[1] Singleton,你坏。。。在哪里?
[2] Singleton,银弹还是狗屎
[3] Singleton,何日才能用到你


路人甲:OMG,这是什么代码格式啊!
好吧,肯定有人不喜欢这个缩进,但是我敢肯定,肯定有人知道我喜欢Python了 :D

  • Share/Bookmark

众里寻它千百度 - Windows XP时间栏自定义工具Tclock

作者:半瓶墨水 链接:http://www.2maomao.com/blog/tclock-windows-xp-clock-customize/

今天无意间看到Tclock2,爱死了

WindowsXP原有的时间显示有些呆板,特别是我用了双层的任务栏以后,原有的时间显示内容还是那么些,有时候我需要知道今天是哪天,还需要鼠标停留在上面一会儿,还有的时候,可能是bug,我在每台用过的WindowsXP上都遇到过:鼠标停留再久都不显示那个日期提示框

Tclock2可以:

1. 自定义WindowsXP右下角的那个时间显示框,格式,字体
 (可惜没有背景色,虽然可以用自定义图片做皮肤,但是没那工夫)
2. 一键复制时间日期到剪贴板,我现在用的是鼠标左键单击的方式复制,很爽
3. 我设置了开机自动启动

不多说了,放个截图如下

tclock

另外,鉴于原官方站挂掉(上面的链接是unofficial的),以及方便自己下载,我把我的定制版压成一个zip包

下载地址:
http://www.2maomao.com/blog/wp-content/uploads/tclock21.zip

另外,如果你想用跟我一样的配置,又担心从这里下载的有问题,可以:
1. 到这里下载
2. 然后在Tclock2.exe所在目录下,建立一个Tclock2.ini的文件
3. Tclock2.ini的内容参见这里:http://fayaa.com/code/view/9493/

  • Share/Bookmark

Twitter Week @ 2010-02-07

作者:半瓶墨水 链接:http://www.2maomao.com/blog/twitter-week-2010-02-07/
  • Keso说的很对:“中国几乎注定不可能出现一个真正的Hulu,因为那些声称要做中国的Hulu:的,根本没有历史;中国更不可能出现一个YouTube,因为在我们这里打破控制是不被允许的。最终,中国� #
  • 《象之背》,很生活很感人的短片:http://www.u148.net/article/17502.html #
  • :: 玩具知识小讲-宝儿宝 品牌玩具/婴儿玩具大全/北京5元不限重/多视频-淘宝网 http://bit.ly/bFgAaz #
  • 韩寒:所谓文化大国zz: zz来自: http://htxt.it/Hj3U 韩寒:所谓文化大国 第二次来到厦门,然后这里的空气很好,难怪大家都喜欢散步啊。嗯,刚才我听邓老.. http://bit.ly/dCWtX3 #
  • :: Sketchpad - Online Paint/Drawing application: 很不错的HTML5画图板 http://bit.ly/8F7pOM #
  • :: 教你汽车快速停车入位 新手老手都适用: 呵呵不错 http://bit.ly/9LNfI3 #

Powered by Twitter Tools

  • Share/Bookmark