作者归档:℃冻番茄

xcode4.3开启gcc/g++

真的坑爹,今天才开始玩MAC OX,装了个最新版本的10.7.3,只能装XCODE 4.3 这个月刚发行的版本。
安装时发现没有install过程,直接双击就进入开发环境了。而且装完后没有gcc 等各种编译工具,在TERMINAL下各种命令不识别,想装ruby的各种开发工具,都不行了。

查了半天才发现:
Apple announced Xcode 4.3 for OSX Lion and 4.4 for OSX Mountain Lion last week. The major difference is that Xcode no longer provide an installer which is good thing because you now could update Xcode with AppStore in the future, plus it is much easier to carry the development environment with you. However, there is a little problem with this new version of Xcode, is that all command line toolsets and compilers are not visible in terminal.

解决方案一:
A simple fix is to update your PATH env:
export PATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:$PATH
Please be noted that clang does not reside in /Developer/usr/bin, it is now in /Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Now you could access to gcc, g++, git or any toolsets bundled with Xcode. For your convenience, it is recommended to include it in your .bash_profile.
解决方案二:
You can install these additional tools directly in Xcode :
Preferences > Downloads > Command Line Tools > Install

于 PHP 安装使用 Google LevelDB extension

LevelDB (leveldb – a fast and lightweight key/value database library) 是 Google 开发非常快速的 key-value 储存的函式库, 效能看起来相当不错: LevelDB Benchmarks, 且 LevelDB 的资料, 都会经过 Snappy 压缩, 所以资料也会比较小.

注: 下述安装环境为 Debian / Ubuntu Linux

于 PHP 增加 Google LevelDB 的 Extension

有 LevelDB 的 Source code, 再来找 PHP 的 ext 是否有人写, 于是就找到: leveldb for php

也正好找到此篇有人已经有做过编译: 从原始码编译 Google LevelDb 的 PHP 扩展, 下述步骤摘录自此篇.

安装、编译步骤
  1. BUILD=/usr/local/
  2. # 编译安装 LevelDB
  3. svn export http://leveldb.googlecode.com/svn/trunk/ leveldb
  4. cd $BUILD/leveldb
  5. make -j8 OPT=”-O2 -DNDEBUG -fPIC”
  6. # 编译安装 php-leveldb ext
  7. git clone git://github.com/arraypad/php-leveldb.git
  8. cd $BUILD/php-leveldb
  9. phpize
  10. ./configure –with-leveldb=$BUILD/leveldb
  11. make -j8
  12. make test
  13. make install
  14. # 于 Apache 的 PHP 设定 leveldb.so (extenstion)
  15. vim /etc/php5/cli/conf.d/leveldb.ini # 内容如下述
    extension=leveldb.so
  16. /etc/init.d/apache2 restart # 到此就可以开始使用 LevelDB 囉~

LevelDB 于 PHP 的操作与使用范例

范例可于 php-leveldb 的 tests 里面找到: basic.phpt (下述参考整理自此档案)

范例
<?php
if (!extension_loaded('leveldb')) {
    die('skip leveldb not loaded');
}

$path = '/tmp/leveldb.test';
$db = new LevelDb($path);

echo "* setting (foo=bar): \n";
var_dump($db->set('foo', 'bar')); // bool(true)

echo "* getting (foo): \n";
var_dump($db->get('foo')); // string(3) "bar"

echo "* delete (foo): \n";
var_dump($db->delete('foo')); // bool(true)

echo "* getting (foo): \n";
var_dump($db->get('foo')); // bool(false)
?>

beanstalkd 消息队列的第一手资料

beanstalk 消息队列 小结
协议说明和各状态转换情况

基本知识点:
1. 对于beanstalk 消息队列中每条数据都为 job
2. beanstalk service端 ,会维护 tubes[多个管道]
3. client端可以监听,使用多 tube
4. client端可以指定 use 管道[ client生成一个新的job时会把此job提交到 指定管道]
5. client端可以指定 watch 管道 [ client接收处理job时会到 指定管道得到待处理的job]

官方示意图:
put reserve delete
—–> [READY] ———> [RESERVED] ——–> *poof*

一般情况:
1. 任务提交到service端,job 管理放入内存空间并为其标记状态 [READY]
2. client通过轮训竞争得到次状态, job 改为 [RESERVED]
2.1 当在默认时间 120 秒内没处理完 , job.stats.timeouts 就会大于 0
同时其他 轮训竞争client会拿到这个job【 注意了 每次timeouts时,在轮训的客户端就会得到次job,状态都为 ready,timeouts>0 】
3. 随便其中一台client处理完 job.delete , 其他 client 中的此job 都会 *poof*

deom – python beanstalkc 中 job.stats 参考:
使用 easy_install beanstalkc
API 参考 : http://github.com/earl/beanstalkc/blob/master/TUTORIAL
刚生成的 beanstalk
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 0, ‘ttr’: 120,
‘age’: 6, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’, ‘time-left’: 114,
‘kicks’: 0, ‘id’: 2}

以timeout了的 beanstalk,并且在其他client轮训到 job
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 1, ‘ttr’: 120,
‘age’: 417, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’, ‘time-left’: 110,
‘kicks’: 0, ‘id’: 2}
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 1, ‘ttr’: 120, ‘age’: 415,
‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’, ‘time-left’: 4294967163L,
‘kicks’: 0, ‘id’: 2}

当没所有client 的 job 都到期 了 状态
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 2, ‘ttr’: 120,
‘age’: 417, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘ready’, ‘time-left’: 4294967161L,
‘kicks’: 0, ‘id’: 2}
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 2, ‘ttr’: 120, ‘age’: 415,
‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘ready’, ‘time-left’: 4294967163L,
‘kicks’: 0, ‘id’: 2}

其中 client1 job.delete
client1 job.stats *poof*
client2 job.stats *poof*

比较全的状态说明 – [官方文档]
http://github.com/kr/beanstalkd/blob/v1.1/doc/protocol.txt?raw=true

官方示意图:

先简单说明下(完全自己理解的,欢迎拍砖。本人E人太差~看官档费劲,谅解下):
job.stats状态 = [READY] 待处理, [RESERVED] 正处理, [DELAYED]延迟状态 , [BURIED] 隐藏状态

1. 延迟提交
py.client1.put>>> beanstalk.put(‘yes!’, delay=10)
py.client3.reserve>>> job = beanstalk.reserve()
# 等待 10 秒

2. 管道测试
put-job到service端 可以指定 put的tube管道
如:

py.client1.put>>> beanstalk.use(‘foo’)
py.client1.put>>> beanstalk.put(‘hey!’)

py.client2.reserve>>> job = beanstalk.reserve()
# 一直拥塞,应为 他 watch 管道 ‘default’

py.client3.reserve>>> beanstalk.watch(‘foo’)
# beanstalk.ignore(‘bar’) 放弃监听 bar
py.client3.reserve>>> job = beanstalk.reserve()
py.client3.reserve>>> job.body #输出 ‘hey!’

3. 隐藏状态 现在吧 client 1/2/3 的 use watch 的管道都调回 default
py.client2.reserve>>> job = beanstalk.reserve()
py.client3.reserve>>> job = beanstalk.reserve()
py.client1.put>>> beanstalk.put(‘隐藏状态!’)
py.client2.reserve>>> job.bury() #2 轮训得到 并且 修改 job 为隐藏状态
# 120 秒后 client3 没有轮训得到 此job
py.client2.reserve>>> job.stats()
{‘buries’: 1, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 0, ‘ttr’: 120,
‘age’: 188, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘buried’,
‘time-left’: 4294967228L, ‘kicks’: 0, ‘id’: 11}
py.client2.reserve>>> beanstalk.kick( job.stats()[‘id’] ) #修改状态为 reserved
# 立刻 client3 得到 job
py.client3.reserve>>> job.stats()
{‘buries’: 1, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 0, ‘ttr’: 120, ‘age’: 313,
‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’,
‘time-left’: 110, ‘kicks’: 1, ‘id’: 11}
# 这时候 client2 / 3 同时 有 job 11 状态 ‘buries’: 1,’timeouts’: 0,’state’: ‘reserved’

4. peek 窥见
可以得到 一个 stats – read 的 job ,其他 client 可以 job = beanstalk.reserve()
后马上 job.stats 会变成 [RESERVED]
py.client2.reserve>>> job = beanstalk.peek_ready()
取得 job 并看 本 client 能 处理能
>>> job = beanstalk.peek(3)
>>> job.body
‘yes!’
>>> job.stats()[‘state’]
‘ready’
这种形式西 job 不能 bury 等修改状态,但 可以 delete

peek 系类
peek_buried
peek_ready

linux tar分卷压缩方法

linux下备份网站数据,由于文件很多,打包成一个文件会比较大,所以想分卷压缩成每个900M的文件,方便下载与上传到网盘备份。

1.分卷压缩,使用tar+split组合
进入网站目录,执行:
tar cvzf – web| split -b 900m

2.合并
cat x* > web.tar.gz

3.解压
tar xvzf web.tar.gz

一年一度的回家过大年的行动就要开始了

元旦加班,第二天也就是2号,起个大早,打开电脑准备秒杀回家火车票!
12306不给力,登了十多分钟才登上去,十点杭州放票,快十点半了票都没刷出来,等不了了,直接电话95105105,一打就通。然后屁颠屁颠得跑到城站火车站取票。

随便在火车站附近找了个小店吃饭。小店的水煮鱼非常给力!

13号的票,也就是这周五了。开始想念妈妈做的菜了····

Memcache的问题集

o memcached是怎么工作的?
o memcached最大的优势是什么?
o memcached和MySQL的query cache相比,有什么优缺点?
o memcached和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点?
o memcached的cache机制是怎样的?
o memcached如何实现冗余机制?
o memcached如何处理容错的?
o 如何将memcached中item批量导入导出?
o 但是我确实需要把memcached中的item都dump出来,确实需要把数据load到memcached中,怎么办?
o memcached是如何做身份验证的?
o 如何使用memcached的多线程是什么?如何使用它们?
o memcached能接受的key的最大长度是多少?(250bytes)
o memcached对item的过期时间有什么限制?(为什么有30天的限制?)
o memcached最大能存储多大的单个item?(1M byte)
o 为什么单个item的大小被限制在1M byte之内?
o 为了让memcached更有效地使用服务器的内存,可以在各个服务器上配置大小不等的缓存空间吗?
o 什么是binary协议?它值得关注吗?
o memcached是如何分配内存的?为什么不用malloc/free!?究竟为什么使用slab呢?
o memcached能保证数据存储的原子性吗?

继续阅读

关于人面解锁功能的一些胡扯

刚看了一个视频,用照片欺骗android4.0的人面解锁功能,据我所说,很多电脑也带这个功能,但基本上都可以用照片的方式进行欺通过,毕竟照片和真实人面通过摄像头生成的都是相同的平形图形图像。

所以就想到一个方法

记录合法用户的几个不同的面部特征。比如 眨左眼 眨右眼 张大嘴 等不同的几个动作保存下来

在验证人面时,类似随机验证码的原理,随机通过动作的先后,例如:先眨右眼,再张嘴等来进行验证,这样一般来说,可以防止照片来欺骗

Redis 作者详谈 2.4 版本改进[转]

由于Redis集群可能在较长一段时间内还处理开发阶段,为了避免稳定版本由于这一原因被无限延后,于是从2.2版本fork出了一个2.4分支,这一分支目前进行了一些新的优化改进及bug修复,如果没有严重bug将会在近几个星期内发布稳定版本。

随后作者列出了2.4版本中的一大堆优化改进及Bug修复,主要有下面一些:

  • 对小数据量的sorted sets结构的内存使用做很大的优化
  • RDB文件的持久化速度也将会大大提高
  • 对目前的一些写操作命令进行了改进,支持批量写入功能
  • 启用新的内存分配模式 jemalloc.
  • 通过对copy on write机制使用的优化,数据持久化保存的子进程的内存占用将大大减少
  • INFO内容更加丰富
  • 新的OBJECT命令,提供对Redis存储value结构描述
  • 新的CLIENT命令,提供对Redis客户端连接的信息描述
  • 彻底将Slave对Master的连接改成非阻塞,之前connect(2)系统调用是会阻塞的
  • Redis-benchmark、Redis-cli 都进行了几个方面的改进
  • Make 改为彩色输出,更易读
  • VM机制彻底废弃
  • 总的来说2.4版本会在各方面有性能上的提升
  • Redis测试框架也有非常大的提升

继续阅读