活在这珍贵的人间--海子

活在这珍贵的人间太阳强烈水波温柔一层层白云覆盖着踩在青草上感到自己是彻底干净的黑土块活在这珍贵的人间泥土高溅扑打面颊活在这珍贵的人间人类和植物一样幸福爱情和雨水一样幸福

Redis笔记(0)

 

简介:
Redis是一种key-value数据库,其数据可以保存在磁盘上,所以数据一般不会丢失。它的键值类型包括:普通数值,strings,lists,sets,zsets和hashes,对于这些键值,我们可以执行push/pop,add/remove,计算集合的并集,交集和差集等原子操作。
Redis提供了大部分主流语言的接口,目前支持:
C,C++,C\#,Clojure,Common Lisp,Erlang,Haskell,Java,Javascript,Lua,
Objective-C,Perl,PHP,Python,Ruby,Scala,Go,Tcl。
Redis为了提高存取速度,一般将数据存储在内存中,为了保持数据的持久化,它会将数据不断写入磁盘或者通过在日志尾部追加操作命令,前一种方式性能较高,但可能丢失数据,后一种相反。同时Redis还支持主从同步。
 
安装及配置:
基本安装下载源码包,然后直接在src目录下make-make install即可。
Redis的配置文件为redis.conf,其中可配置选项如下:
#是否为守护进程运行
daemonize no
#配置pid的存储位置
pidfile /var/run/redis.pid
#默认监听端口
port 6379
#客户端限制多少秒后自动断开连接
timeout 300
#日志显示级别
loglevel verbose
#指定日志输出文件名,也可指定到标准输出
logfile stdout
#设置数据库数量,默认连接数据库为0,可以通过select N来连接不同的数据库
databases 16
#保存数据到disk的策略
##当有一条Keys数据被改变是,900秒刷新到disk一次
save 900 1
##当有10条Keys数据被改变时,300秒刷新到dis 一次
save 300 10
##当有1w条keys数据被改变时,60秒刷新到disk一次
save 60 10000
#当dump .rdb数据库的时候是否压缩数据对象
rdbcompression yes
#dump数据库的数据保存的文件名
dbfilename dump.rdb
#Redis 的工作目录
dir ./
########### Replication #####################
#Redis 的复制配置
# slaveof <masterip> <masterport>
# masterauth <master-password>
############## SECURITY ###########
# requirepass foobared
############### LIMITS ##############
#最大客户端连接数
# maxclients 128
#最大内存使用率
# maxmemory <bytes>
########## APPEND ONLY MODE #########
#是否开启日志功能
appendonly no
# 刷新日志到 disk 的规则
# appendfsync always
appendfsync everysec
# appendfsync no
################ VIRTUAL MEMORY ###########
#是否开启 VM 功能
vm-enabled no
# vm-enabled yes
vm-swap-file /tmp/redis.swap
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 4
############# ADVANCED CONFIG ###############
glueoutputbuf yes
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
#是否重置 Hash 表
activerehashing yes

 

简单测试:
键入命令:
elvalad@earth:~$ redis-server ./桌面/redis-2.2.12/redis.conf 

 

检测是否启动:
elvalad@earth:~$ netstat -an -t
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 117.22.87.81:53         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:47711           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:39491         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN     

 

总结

下午正在床上睡觉,阿里的一个大哥打电话过来谈实习的事,现在想想还是好人多啊,只是和几个前辈们聊了下工作的事,大家都特别热心的帮助我,无论结果如何,在此都需要谢谢大家。

 
这里,我觉得有必要总结一下今天的谈话,老大是看了我的简历之后给我的电话,我简历中关于计算机技能处写了以下内容:
 
程序设计:熟练使用 c,基本了解 python,java,LATEX,bash
                        
系统平台:有两年以上使用 GNU/Linux 的经验,了解最基础的操作系统原理
 
开发工具:能够较熟练的使用 emacs,gcc,gdb,make,git 等开发工具
 
算法基础:了解基本的数据结构和算法
 
老大问了我第一个问题,说说gdb调试多进程改用什么命令啊!我愣了10s加,多亏大哥给面子人好,没为难俺,后面问的几个问题答的都还马马虎虎,但一涉及到工具的细节我都晕,还有一个是说说gdb调试时如何看堆栈,我好像记得一个info register,后来一想,这该是看寄存器的,堆栈貌似该是stack,不过老大也放我一马了。
 
最后老大布置了点儿作业,呵呵,是个python的和一个涉及到网络编程的,俺虽说是个python雏鸟,但还是得好好努力努力。总之,要特别感谢那些帮助我的人,世上还是好人多啊:)
 
最后,把几个没答好的问题整理一下,留作备份:
 
-------------------------------------------------------------------------------
0)gdb调试多进程
例如:Proc2 是 Proc1 的子进程,Proc3 又是 Proc2 的子进程,如何使用gdb对其调试
 
(实际上,GDB 没有对多进程程序调试提供直接支持。例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。那么该如何调试子进程呢?其实可以利用GDB的特点或者其他一些辅助手段来达到目的。此外,GDB 也在较新内核上加入一些多进程调试支持。)
 
a)follow-fork-mode 方法:
set follow-fork-mode [parent|child]
如果需要调试子进程,在启动gdb后:(gdb) set follow-fork-mode child,并在子进程代码设置断点。
 
由于follow-fork-mode的调试是从父进程开始的,对于fork多次子进程又有子进程的情况使用不太方便
 
b)Attach子进程
 
可以利用attach <pid>命令attach到子进程然后进行调试。要调试某个进程时,先查看此进程的pid,然后启动gdb,attach到这个进程。
 
一个新的问题是,子进程一直在运行,attach上去后都不知道运行到哪里了,这时可以在main函数开头添加一段测试代码。
 
c)VNC server配合GDB wrapper进行远程调试。
 
-------------------------------------------------------------------------------
1)git和svn的区别
GIT是分布式的,SVN不是;
GIT把内容按元数据方式存储,而SVN是按文件;
GIT分支和SVN的分支不同;
GIT没有一个全局的版本号,而SVN有;
GIT的内容完整性要高于SVN。
 
-------------------------------------------------------------------------------
 
最后我发现,在计算机技能里我谈到自己熟悉的部分,其实自己一点都不熟悉,平时如果自己用到的时候,都会google或者查手册,都没怎么记住,而且很多知识我用到的机会都不怎么多,所以,以后一定要多注意细节,细节决定成败。今天,多亏还没有问我算法的细节知识,平时写代码如果需要什么算法的时候都是临时查《算法导论》,看看伪代码,自己再实现下,过了头又忘了,现在总算知道自己的基础知识掌握的有多么不牢固了。
 
以后要养成记笔记,勤思考,多动手的好习惯,把自己看似熟悉实则不熟的东西真正牢记于心。

正则表达式笔记

 

1.入门
1.1什么是正则表达式
1.2正则表达式能干些什么
1.3如何使用
 
2.匹配
2.1纯文本匹配
2.2特殊字符匹配
 
3.高级应用
3.1回溯引用
3.2条件分支
 
4.几个正则表达式实例
 
1.入门
 
1.1什么是正则表达式
简单的说正则表达式是一些用来匹配和处理文本的字符串。它有其特殊的语法和指令,但并不是完备
的程序设计语言。它是处理分本流最强大的工具之一。
 
1.2正则表达式能干些什么
a)在文本文件中匹配特定的字符或字符串
b)生成特定的格式的代码,比如说html中的链接
c)检查某些格式䒈正确性,比如说电子邮件格式
d)在文本文件中需要进行替换
正则表达式的最基本作用就是查找和替换,在平时的使用过程中经常会碰到需要正则表达式来解决这
两个问题,比如使用grep系列的命令匹配字符串,在emacs中使用正则表达式替换等等。
 
1.3如何使用
首先需要明确,不存在正则表达式程序,它只不过是在某些编程语言或开发工具中的具体实现而已,
所以,在使用正则表达式之前,必须保证你的工具或语言拥有解释正则表达式的引擎。同时要注意,
在不同语言,和不同工具中正则表达式的引擎会有所不同。在使用正则表达式时,一个问题通常会
有很多解决方案,没有具体的对错之分。
 
 
2.匹配
 
2.1纯文本匹配
在linux下有很多正则表达式测试工具,比如可以直接使用grep,shell中也内嵌正则表达式,emacs
更是使用正则表达式的最佳战场,也有专门的正则表达式学习工具,比如说kiki等。这里以kiki为例来
学习。
 
文本
hello,i am a boy,i love CS
now,i am learning linux kernel
my homepage is http://elvalad.wordpress.com
 
正则表达式
linux
 
结果
now,i am learning (linux) kernel
 
这是最简单的正则匹配,而正则表达式的功能远非如此。
 
2.2特殊字符匹配
前面的静态纯文本根本无法体现正则表达式的强大,下面一些例子更加实用。
在正则表达式中有些字符具有特殊含义,这些特殊字符我们一般称之为元字符,
下面是一些常用的元字符:
 
------------------------------------------------------
元字符  | 含义   
------------------------------------------------------
[]     |字符集合,至少匹配集合中的一个字符
------------------------------------------------------
[^]    |对字符集合求非
------------------------------------------------------
\      |转义字符
------------------------------------------------------
\b     |回退符(匹配单词边界)
------------------------------------------------------
\B     |不匹配单词边界
------------------------------------------------------
\f     |换页符
------------------------------------------------------
\n     |换行符
------------------------------------------------------
\r     |回车符
------------------------------------------------------
\t     |制表符
------------------------------------------------------
\v     |垂直制表符
------------------------------------------------------
\d     |任意单个数字
------------------------------------------------------
\D     |任意非数字单个字符
------------------------------------------------------
.      |除换行符以外的任意字符
------------------------------------------------------
\w     |等价于[a-zA-Z0-9_]
------------------------------------------------------
\W     |等价于[^a-zA-Z0-9_]
------------------------------------------------------
\s     |等价于[\f\n\r\t\v]
------------------------------------------------------
\S     |等价于[^\f\n\r\t\v]
------------------------------------------------------
\x     |匹配十六进制数
------------------------------------------------------
\0     |匹配八进制数
------------------------------------------------------
+      |匹配一个或多个字符集合
------------------------------------------------------
*      |匹配0个或多个字符集合
------------------------------------------------------
?      |撇配0个或1个字符
------------------------------------------------------
{}     |重复匹配
------------------------------------------------------
\<     |只匹配单词的开头(很多工具不支持)
------------------------------------------------------
\>     |只匹配单词的结尾(很多工具不支持)
------------------------------------------------------
^      |匹配字符串的开始
------------------------------------------------------
$      |匹配字符串的结束
------------------------------------------------------
()     |子表达式
------------------------------------------------------
?=     |向前查找,查找出现在匹配文本之后的内容
------------------------------------------------------
?<=    |向后查找,查找出现在匹配文本之前的内容
------------------------------------------------------
|      |逻辑或操作
------------------------------------------------------
\E     |结束\L或\U转换
------------------------------------------------------
\L     |把后面的字符转换为小写直到遇到\E
------------------------------------------------------
\l     |把下一个字符转换为小写
------------------------------------------------------
\U     |把下一个字符转换为大写直到遇到\E
------------------------------------------------------
\u     |把下一个字符转换为大写
------------------------------------------------------
------------------------------------------------------
3.高级应用
 
3.1回溯引用
回溯引用是指模式的后半部分引用用在前半部分中定义的子表达式。
\1为第一个子表达式,\2为第二个子表达式依次类推。
一个回溯的例子:要求匹配出文本中连续出现的单词
 
文本:
hello hello world
bye bye
small is is beautiful
 
正则表达式:
(\w+)[ ]+\1
 
注意:回溯引用只能用来引用模式中的子表达式,回溯引用一般以\1代表第一个
子表达式,而以\0代表整个正则表达式。
 
3.2条件分支
正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,
具体方法是用|把不同的规则分隔开。
 
例子:
0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种
是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)
 
注意:使用分枝条件时,要注意各个条件的顺序,原因是匹配分枝条件时,将会从左到右地
测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
 
4.几个正则表达式实例
 
URL地址:
 
https?://[-\w.]+(:\d+)?(/([\w/_.]*)?)?
 
IP地址:
 
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
 
电子邮件地址:
 
(\w+\.)*\w+@(\w+\.)+[A-Za-z]+
 
HTML注释:
 
//.*
 
正则表达式的学习需要每天多加练习,包括在平时使用emacs,grep时都是练习的最佳时机。

我不适合PH.D

这几天,没事就会想想关于未来的问题,有时候希望自己可以潜下心来,好好搞搞学术,读个硕士然后再争取个PH.D,有时候又希望自己可以赶紧去工作,过上自己最向往的流浪的生活,因为我从来都不是一个安分的人。

中午,我专门看了些PH.D的东东:

http://matt.might.net/articles/phd-school-in-pictures/ 这篇有趣而发人深思的文章告诉了我什么样的人才能算作一个合格的PH.D,而我再用中文搜索计算机PH.D,得到的有用的信息不是很多,不少是在谈论国内PH.D能干嘛,PH.D如何找工作等等我并不是太感兴趣的话题。

接着,我做了个MBTI的测试:

http://www.apesk.com/mbti/dati_en2.asp 得出的结果是ISTP型,哈哈,测试结果表明适合俺的职业有计算机程序员或者软件工程师是我非常中意的,其中并不包含纯正的科学工作者,也就是科学家。

通过这些基本调查,我发现自己非常不适合向PH.D奋斗,一个很大的原因是个人追求问题,纯正的科研工作者需要地是对未知事物的敏锐洞察力以及超强的抽象分析能力,记得前阵子,邓中翰来学校演讲时讲了他的求学经历,这种人就是我认为可以称为计算机科学家的人。而对未知事物敏锐的洞察力和非常抽象的分析能力都是我比较欠缺的(比如我不喜欢纯数学,不喜欢对明了的事物喋喋不休地使用公理,定理证明),这些都会阻挠我希望科研的道路,我个人比较崇尚的是务实主义,也就是一个engineer或者hacker比较喜欢的东西,而且我这辈子最大的梦想是可以不停的行走,且行且思考,我不想安分的呆在一个地方为了一些很崇高的目标把一辈子都搭上,或许有一天我累了,会开一个小小的书店或者一个小酒吧,没事的时候可以写写程序,自娱自乐。

记得前一阵子,我和jiejie兄(http://lijiejie.com/)谈到未来的问题,他告诉我,活着就该让生活充满乐趣,让自己开心,让自己的家人过的快乐。而这几天刚好又看到了一些性情中的程序员所追求的生活,比如冰河离开网易,Jamie Zawinski窝在旧金山卖啤酒,没错这种日子才是我所追求的。

和爸爸妈妈谈了一些这个问题,虽然从小到大我的一切事都是自己作主,但这次他们给我的保守建议是好好读书,先争取读个硕士,然后向PH.D奋斗。因为他们都是普普通通的中学老师,对于生活的领悟用的是他们自己的思维,比如他们希望平静,他们喜欢安定...而这些恰恰都和我的追求不符合,或许有一天当我在生活中撞墙的时候我会想到他们今天说过的话,但希望在我做出这个决定之后自己不会后悔,也希望他们可以谅解我。

所以,我仅仅想做一个coder,可以不停地coding,我仅仅想做一个行者,可以不停地行走。

 

 

python input()和raw_input()

在python中input()和raw_input()函数均可以从终端输入,但二者存在一定区别,例如如下代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# guess.py
import random

guessesTaken = 0

print ('Hello! what is your name')
#myName = raw_input()
myName = input()
number = random.randint(1, 23)
print ('well, ' + myName + ', i am thinking of a number between 1 and 23.')

while guessesTaken < 7:
    print ('Take a guess')
    guess = input()
    #guess = int(guess)

    guessesTaken = guessesTaken + 1

    if guess < number:
        print ('your guess is too low')
    if guess > number:
        print ('your guess is too high')
    if guess == number:
        break

if guess == number:
    print ('good job! you guess in %d guesses!' %guessesTaken)

if guess != number:
    print ('sorry! your guess is wrong')

在第10行中使用了input()函数,此时如果终端直接输入xxx,则会显示NameError: name 'xxx' is not defined的错误,如果输入"xxx"或'xxx'则可正确运行。

如果使用raw_input()函数,可直接输入xxx。

这两个函数的区别为如果直接键入数字,input()返回一个数值类型,比如int,float,而raw_input()则会返回字符串类型;如果键入非数字,则input()函数要求以字符串引用的形式输入,比如"xxx",而raw_input()可以直接输入为xxx,二者均返回字符串。

这里是input()和raw_input()内置函数的文档

C语言数据类型在IA32中的大小

这个主要是一些常识问题,以及在使用AT&T语法汇编时会使用的编码后缀:

C声明 Intel数据类型 汇编后缀 大小(byte)
char 字节  b  1
short  w  2
int 双字  l  4
long int 双字  l  4
long long int  -  4
char* 双字  l  4
float 单精度  s  4
double 双精度  l  8
long double 扩展精度  t  10/12

小常识:long double是在ISO C99中引入,用于扩展浮点精度,它的大小不仅和机器体系结构有关,同时和编译器也有关系,在除X86以外的平台上一般用8个字节表示,在X86机器上一般为10个字节,而GCC将其存储为12个字节。