今天有个学弟发消息问我关于redis的一个问题,结果问题不在redis,而是在于shell.

他在看的书上有这样一段话:

DEL命令的参数不支持通配符,但我们可以结合Linux的管道和xargs命令自己实现删除所有符合规则的键。比如要删除所有以“user:”开头的键,就可以执行redis-cli
KEYS “user:” | xargs redis-cli
DEL。另外,由于DEL命令支持多个键作为参数,所以还可以执行redis-cli DEL ‘redis-cli KEYS “user:
“‘来达到同样的效果,性能更好。

他在测试的时候前者能起作用,而后者貌似不起作用.

查了他的操作记录,发现他是把 ` ' 弄混了,单引号是直接把单引号内的内容当做字符串,

redis-cli DEL 'redis-cli KEYS "user:"'

就是删除redis中名叫redis-cli KEYS "user:"的key,
而反向引号是先执行反向引号中的内容取结果,就是说,

redis-cli DEL `redis-cli KEYS "user:"`

先执行的是redis-cli KEYS "user:",取出结果
然后执行redis-cli DEL user01 \n user02 \n user03

以上.

我用来搭梯子的Linode小水管莫名其妙的就跪了,处于脱产学习的宝宝干脆停了它,然后从第三方买的服务有非常不稳定,从Docker Hub中拉取镜像并不能成功,而且速度特别慢。

所以要给Docker配置一个国内的registry mirror,当我们需要的镜像在mirror中则直接返回,如果没有则从Docker Hub中拉取。是否使用registry mirror对用户来说是透明的。

配置文件/etc/default/docker

DOCKER_OPTS="--registry-mirror=http://aad0405c.m.daocloud.io"

使用service docker restart重启Docker服务即可。

用Python不仅能节省了大量coding / debug的时间。也让人在编程时更注重逻辑思考,印证了那句

Programming not coding

当然,缺点也十分明显,损失了大量的时间和内存性能,回头golang学起来哈


Russian Doll Envelopes

You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envelope can fit into another if and only if both the width and height of one envelope is greater than the width and height of the other envelope.

What is the maximum number of envelopes can you Russian doll? (put one inside other)

Example:
Given envelopes = [[5,4],[6,4],[6,7],[2,3]], the maximum number of envelopes you can Russian doll is 3 ([2,3] => [5,4] => [6,7]).

Solution:

class Solution(object):
    """docstring for Solution"""
    def maxEnvelopes(self, envelopes):
        nums = sorted(envelopes, 
                      cmp = lambda x,y: x[0] - y[0] if x[0] != y[0] else y[1] - x[1])
        size = len(nums)
        dp = []
        for x in range(size):
            low, high = 0, len(dp) - 1
            while low <= high:
                mid = (low + high) / 2
                if dp[mid][1] < nums[x][1]:
                    low = mid + 1
                else:
                    high = mid - 1
            if low < len(dp):
                dp[low] = nums[x]
            else:
                dp.append(nums[x])
        return len(dp)

 

最近玩儿了一周的redis和memcached,学了不少东西,那么我们就来回顾一下最初学过的东西,简单来说就是实现一个memcpy()函数,仔细想想还是很好玩儿的.

void mymemcpy(void *dst,const void *src,size_t num)
{
    assert((dst != NULL) && (src != NULL));

    const char *psrc = (const char *)src;
    char * pdst = (char *)dst;

    if (pdst < psrc && pdst < psrc + num)
    {
        for (size_t i = num -1; i != -1; --i)
        {
            pdst[i] = psrc[i];
        }
    }
    else
    {
        for (size_t i = 0; i < num; ++i)
        {
            pdst[i] = psrc[i];
        }
    }
}

这是最开始一拍脑门写的(应该是) bug free的代码,因为没跑过2333

一个字节一个字节拷贝这样效率太慢了,或者我们来做一些优化吧,比如说块拷贝就能提升不少效率.

void mymemcpy(void *dst,const void *src,size_t num)
{
    assert((dst!=NULL)&&(src!=NULL));

    int wordnum = num / 4;
    int slice = num % 4;
    const int* pintsrc = (const int*)src;
    int* pintdst = (int*)dst;

    //copy 4 bytes
    while(wordnum--)
    {
        *pintdst++ = *pintsrc++;
    }

    //copy 1 byte
    const char* pcharsrc = (const char*)pintsrc;
    char* pchardst = (char*)pintdst;
    while(slice--)
    {
        *pchardst++ = *pcharsrc++;
    }
}

本周正式开始搞 neutron agent list,有点小兴奋,nite.

Beoing Tech Vito Niel performs fusion welds on the tank plugs

Beoing Tech Vito Niel performs fusion

愿中国青年都摆脱冷气
只是向上走
不必听自暴自弃之流的话

能做事的做事
能发声的发声
有一分热,有一分光

就令萤火一般
也可以在黑暗里发一点光
不必等待炬火

此后如竟没有炬火
我便是唯一的光

–Lu Xun, Re feng

最近这两天宝宝很高产啊,但是昨天一个关于redis的小问题困扰了我好长时间,刚刚才解决

AttributeError: 'module' object has no attribute 'Redis'

进入命令行也是一个很奇怪的报错

>>> import redis
Traceback (most recent call last):
  File "", line 1, in 
  File "/root/redis.py", line 4, in 
AttributeError: 'module' object has no attribute 'Redis'

为了测试方便,我在当前文件下封装了一个叫redis.py的文件,第一次运行后就生成redis.pyc,很费解啊.
然后我把这个pyc删除之后又改写了redis.py的文件名,done!
所以总结一下,这是我命名文件的问题,当我第一次运行后生成redis.pyc,以后调用redis(import redis),都会直接调用redis
Solution:
命名py脚本时,不要与python预留字,模块名等相同