Category Archives: app

做的应用记录

分组微博

其实最近写了一个作品分组微博。算是好久没有出作品的成果吧,产品设计的初衷是为了自己的信息共享。例如我就有几帮玩的比较好的朋友。那微博总是个富含创造力的地方,每天总是可以发现一些有价值的好玩的东西。但是我们怎么记得那么人的昵称,特别是有些小伙伴们一向坚持“换昵称大于更新微博的频率不动摇”这个基本准则,改着改着就不知道到底谁是他了。

根据这么个需求就写了这个分组微博,本想写出来给自己用,但是一想独乐了不如众乐乐,就做成了一个小的系统。但是由于新浪微博的各种限制和各种审核慢导致到现在还没有上线。但是好不容易发布一个产品还是写一篇文章好好记录其诞生的来龙去脉吧,我一向把自己做的产品当做一个有生命力的东西。之前写过一堆有意思没意思的东西,例如一些测试应用“谁at我最多”、“死亡时间测试”等等,也做过一些工具类的东西,但是基本都没有上线,有一个“懒人工具包”到现在也没做过任何推广,一直给自己用。之前还没毕业的时候搞过一个小圈子的微博,当然到现在它早就夭折了。但是通过它我还是学到了很多东西,认识了一批好玩的不好玩的人。

那这个分组微博的怎么实现的呢?其实它就是一个机器人,但是机器人的触发条件依赖SAE 的cron服务,因为按照被调用的方式能够唤醒它的方式无外乎两种。第一种就是通过评论的方式,第二种就是原创微博@分组微博 @用户设置的分组。所以我起了两个cron脚本,一个分析所有@到分组微博的评论,另外一个则专门用于分析微博@到分组微博。但这个时候有几个值得搞定的事情,第一个就是匹配出用户设置的微博分组,这里贡献一下我用到的正则。

$text = '微博正文内容啦,例如@分组微博 @小伙伴们 @土豪们';
$reg = "/@([\x{4e00}-\x{9fa5}a-z0-9A-Z_-]+)/u";
preg_match_all($reg, $text, $matches);

以上的正则可以搞定这个事情,可以完美的匹配出“分组微博”、“小伙伴们”、“土豪们”这几个分组。但是我毕竟只是按照自己设想的去测试的,有些极端的字符可以被新浪微博昵称接受的可能就匹配不出来了。那么匹配到了我们就可以检测这个用户到底是不是我们的用户,这个可以通过weibo uid这个搞定。另外这些分组用户是不是设置了,以上的判断可以剔除掉一部分所谓的脏数据。

如果只是给自己用,那么接下来就可以偷懒了,一般的做法是我们以上检测到确实是在召唤分组微博机器人帮你干活的信息,我们可以直接在这个地方利用存到数据库中的分组微博自己微博账号的token去给用户设置的分组成员发通知了。但这么搞显然存在很大的弊端。弊端之一就是不能胜任特别是当用户的数目巨大的时候,那php脚本执行总是会有一个最大的执行时间。加入在一分钟之内检测到了有1000个用户在召唤,那么不可能能同时处理这么多的请求。毕竟这么做,做的操作时串行的。另外一个弊端就是会对应用接口有效的调用频率造成冲击一下子就被禁用了。

那么鉴于以上的情况,我在发送微博的时候也用了一个队列,用到了sae的分布式任务taskqueue服务,如果想对以上的服务有详细的了解,可以参见 taskqueue文档。那么既然用到了分布式这么高端的东西,我们还是需要用到“锁”,因为不用锁就可能一个发送作业可能被不同的机器执行,由于我还是用了最简便的mysql做锁,那肯定需要做成“租约锁”。如果你对“租约锁”不熟悉的话,可以移步我的上篇文章关于租约机制Lease

晒晒高端大气上档次的首页吧:

这次前端的部分还是用到了bootstrap的3.0版本,我发现世界都快被他大一统了。但是人家搞的确实很上档次,确实越来越符合我的品位。值得一提的是用到了其中的一个js的插件叫“bootbox”,很好用,如果想了解。可以看看bootbox。我个人觉得这个还是完全由js来控制更好,例如下面简单的代码:

bootbox.dialog({
  message: "I am a custom dialog",
  title: "Custom title",
  buttons: {
    success: {
      label: "Success!",
      className: "btn-success",
      callback: function() {
        Example.show("great success");
      }
    },
    danger: {
      label: "Danger!",
      className: "btn-danger",
      callback: function() {
        Example.show("uh oh, look out!");
      }
    },
    main: {
      label: "Click ME!",
      className: "btn-primary",
      callback: function() {
        Example.show("Primary button");
      }
    }
  }
});

就可以实现很炫的弹窗效果了:

当然实用的还是其中的callback的设计。今天是中秋,北京天公不作美,月亮影子都看不到。愿家人、朋友们都快乐。

Python 连接 Mysql

本文环境在centos 6.0下。首先需要确认你的环境有MySQLdb包。
可以输入

[root@mingming-dev python]# python
Python 2.6.6 (r266:84292, Dec  7 2011, 20:48:22)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named MySQLdb
>>>
</module></stdin>

出现No module named MySQLdb,说明没有这个包,需要手工加入,下载可以使用

wget "http://lazypeople.sinaapp.com/python/MySQL-python-1.2.3.tar.gz"

Continue reading

Vimdiff

手工做code merge的时候,经常会用到文件比较与同步的工具。vimdiff是我比较喜欢的。首先保证系统中的diff命令是可用的。Vim的diff模式是依赖于diff命令的。Vimdiff的基本用法就是:

# vimdiff  FILE_LEFT  FILE_RIGHT

或者

# vim -d  FILE_LEFT  FILE_RIGHT

屏幕被垂直分割,左右两侧分别显示被比较的两个文件。两个文件中连续的相同的行被折叠了起来,以便使用者能 把注意力集中在两个文件的差异上。只在某一文件中存在的行的背景色被设置为蓝色,而在另一文件中的对应位置被显示为绿色。两个文件中都存在,但是包含差异 的行显示为粉色背景,引起差异的文字用红色背景加以突出。除了用这种方法启动vim的diff模式之外,我们还可以用分割窗口命令来启动diff模式:

# vim FILE_LEFT

然后在vim的ex模式(也就是”冒号”模式)下输入:

:vertical diffsplit FILE_RIGHT

也可以达到同样的效果。

如果希望交换两个窗口的位置,或者希望改变窗口的分割方式,可以使用下列命令:

  • 1. Ctrl-w K(把当前窗口移到最上边)
  • 2. Ctrl-w H(把当前窗口移到最左边)
  • 3. Ctrl-w J(把当前窗口移到最下边)
  • 4. Ctrl-w L(把当前窗口移到最右边)

其中1和3两个操作会把窗口改成水平分割方式。

光标移动

接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。这是因为”scrollbind”选项被设置了的结果,vim会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:

:set noscrollbind

可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:

]c

反向跳转是:

[c

如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。比如如果在位于第一个差异点的行输入”2]c”,将越过下一个差异点,跳转到第三个差异点。

文件合并

文件比较的最终目的之一就是合并,以消除差异。如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令:

dp (diff "put")

如果希望把另一个文件的内容复制到当前行中,可以使用命令:do (diff “get”,之所以不用dg,是因为dg已经被另一个命令占用了),如果希望手工修改某一行,可以使用通常的vim操作。如果希望在两个文件之间来回跳转,可以用下列命令序列:

Ctrl-w, w

在修改一个或两个文件之后,vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:

:diffupdate

如果希望撤销修改,可以和平常用vim编辑一样,直接

, u

但是要注意一定要将光标移动到需要撤销修改的文件窗口中。同时操作两个文件,在比较和合并告一段落之后,可以用下列命令对两个文件同时进行操作。比如同时退出:

:qa (quit all)

如果希望保存全部文件:

:wa (write all)

或者是两者的合并命令,保存全部文件,然后退出:

:wqa (write, then quit all)

如果在退出的时候不希望保存任何操作的结果:,

:qa! (force to quit all)

上下文的展开和查看

比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff 缺省是会把不同之处上下各6行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置:

:set diffopt=context:3

可以用简单的折叠命令来临时展开被折叠的相同的文本行:zo (folding open,之所以用z这个字母,是因为它看上去比较像折叠着的纸)然后可以用下列命令来重新折叠:zc (folding close)

linux平台下php扩展的开发

php扩展顾名思义,是用于增强php的功能,可以把现实功能的php代码放到php的底层用C语言实现,以后待博主自己调试完成将webdav编译到php的扩展成为一个.so文件的时候再发文章详细的说明。php扩展不必要自己完全的写代码,其实php官方本身就自带了一个小工具,叫做ext_skel。

具体实现的方法

切目录到你的php的源码的目录,找到ext,切到ext下,你就会发现ext_skel这个文件,下面你就需要新建一个文件,随便举个例子lazypeople.skel (linux command $ touch lazypeople.skel),然后对文件进行编辑,文件的内容写为:string lazypeople(string str),然后使用命令自动生成扩展的那么的文件,只需要./ext_skel –extname=lazypeople –proto=lazypeople.skel 这个命令也很好懂。

这时你就会发现自动生成了很多的函数

Continue reading