博文

Linux下添加Service并自动启动设置

添加服务的主要命令是chkconfig 可以先在系统中庸chkconfig命令列出所有的当前自动启动的项目 添加的方法为(以redis为例): vim /etc/init.d/redis 内容为: #!/bin/sh # # redis        Startup script for redis # # chkconfig: - 85 15 # processname: redis cd "/home/worker/redis-db/" case "$1" in     start)         /usr/local/bin/redis-server redis.conf         ;;     stop)         /usr/local/bin/redis-cli -p 1500 shutdown         ;;     *)         /usr/local/bin/redis-server redis.conf         ;; esac 几个注意的地方: chkconfig: - 85 15 这句 后面的85是启动优先级,15是关闭优先级,我没有在这里设置启动级别,所以打了- 后面的命令是解析参数值,我只增加了对start和stop命令的解析,如果没有参数,那么默认是start,这个其实是没有仔细的去写的,理论上还可以添加restart命令之类的,可以按照格式随意添加。 然后保存此命令文本,设置它为可运行: chmod +x redis 然后设置它为自动启动 chkconfig --level 3 redis on chkconfig --level 4 redis on chkconfig --level 5 redis on 启动等级的解释如下: 0 为停机,机器关闭。 1...

Windows上的Erlang命令行快速启动

Erlang程序设计中文版中提到过,如果你把erlang的代码放在一个别的地方,那么你每次启动可能都需要运行 cd("c:/your_code_path")。 每次都需要运行一次,这无疑是很麻烦的一个事情。 于是作者也提出一个好办法,那就是在建立一个名为.erlang文件放在erlang的安装目录: 文件内容如下: io:format("consulting .erlang in ~p~n",           [element(2, file:get_cwd())]). c:cd("E:/WorkSpace/erlang"). io:format("Now in:~p~n", [element(2, file:get_cwd())]). 原书上说的是直接放在erlagn的安装目录就可以了,但是可能是erlang一直伴随着升级而书不可能跟着升级得那么快的缘故,现在把这么个文件放在形如:“D:\Dev\erl5.10.1”这样的安装目录下已经不起作用了。 真正的解决方法是放在安装目录下的/usr/文件夹下,形如:“D:\Dev\erl5.10.1\usr” 至于Windows下无法让你创建形如.erlang这样的文件的问题,直接找个Editplus之类的第三方编辑器然后用另存为的方式就可以了。

在CentOS上安装和启动Erlang

首先保证自己的系统中起码有GCC和GCC-C++吧 yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel 然后到这里去下载最新的源码包吧: http://www.erlang.org/download.html 解包编译安装: wget http://www.erlang.org/download/otp_src_R16B.tar.gz tar -xvf otp_src_R16B.tar.gz cd otp_src_R16B ./configure --prefix=/usr/local/erlang --enable-hipe --enable-threads --enable-smp-support --enable-kernel-poll make && make install 拷贝可执行文件到 /user/bin/ cd /usr/bin/ ln -s /usr/local/erlang/lib/erlang/bin/erl erl ln -s /usr/local/erlang/lib/erlang/bin/erlc erlc 这就完结了.. 启动的时候使用 erl +K true 这样就会打开核心的epoll模式了,否则会大幅度降低性能 没有打开epoll模式时: Erlang R16B (erts-5.10.1) [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] Eshell V5.10.1  (abort with ^G) 打开epoll之后: Erlang R16B (erts-5.10.1) [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:true] Eshell V5.10.1  (abort with ^G) 简单的方法是直接修改~/.bashrc 添加一行: alias erl='...

Ternado,同步与异步

图片
总所周知,Ternado是一个非阻塞的Web服务器,很多人因为它的高效性,因为它的短小精悍而选择使用它。同样的理由,我们也选择了使用它。但是在用了它快一年后的今天,我才发现我根本就没有使用到它真正的异步特性。 首先,什么是阻塞?什么是非阻塞?以下两张图就应该能够解释一切了: 阻塞(同步)模型 非阻塞(异步)模型 两个模型从图形上理解起来都很容易。一个是顺序执行,另外一个则是打乱顺序执行。 理论上讲,非阻塞的模型并不一定绝对拥有最佳的效率,但是它在外部调用频繁、涉及到多处IO请求的状况下,它理论上拥有更高的执行效率,因为它在同步处于等待状态下的时间段内它也依然在尽力的压榨着CPU的运算能力。而异步模型最大的问题就是频繁的在多个进程(线程)中调度过程中的CPU消耗。 那么按照Ternado中给出的示例代码的执行结果是什么? 你会惊讶的发现,它官网给出的所有代码执行出来的结果都是同步的。也就是说你根本无法真正的启用它的异步特性。 import time import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") class BlockHandler(tornado.web.RequestHandler): def get(self): time.sleep(10) self.write("Final Over") application = tornado.web.Application([ (r"/", MainHandler), (r"/test/", BlockHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start() 做一个简单的试验,运行这个程序,...

Python中为什么要用is None来代替== None?

一直以来,我对于Pycharm提示我让我用is None来替代 == None这个判断表达式表示不是很理解。 直到我看到了《Python3程序开发指南》中的一句话: “身份比较的一个好处是速度非常快, 这是因为,并不必须对进行比较的对象本身进行检查,is操作符只需要对对对象所在的内存地址进行比较——同样的地址存储的是同样的对象。” 因为None是一个特殊的内置的空对象,所以所有的为None的对象都是指向的同一个内存地址的。所以用is None的速度也应该超过== None。 简单的试验一下: __author__ = 'Siglud' import time def testIsNone(): now = time.time() a = None i = 0 while i < 100000: if a is None: i += 1 return time.time() - now def testEqualNone(): now = time.time() a = None i = 0 while i < 100000: if a == None: i += 1 return time.time() - now if __name__ == '__main__': totalTime_isNone = 0 totalTime_equalNone = 0 for i in range(10): useTime = testIsNone() print 'TYPE:UseIS TestNum: %s, Time consumed: %s' % (i, useTime) totalTime_isNone += testIsNone() for i in range(10): useTime = testEqualNone() print 'TYPE:UseEqual TestNum: %s, Tim...

柴门文:恋爱的法则36

(一)绝对异性缘规则——被同性排斥的,受异性喜欢 大多数人都想有异性缘。 就算是已经结婚了,或有了条件很好的恋人,却还欲无止境地想要“有更多更多的异性为我着迷”。 所以,我这个法则会向大家公开让你绝对迷死异性的秘诀,要是你按法则做了仍不受异性欢迎,我从此断笔(我手劲大,到时三支笔绑在一起断给你看)。 总之,肯定从明天开始,就会有异性为你着迷,迷得不行。我都想着几乎要把这个法则拿去申请专利了。 (越受同性排斥的家伙,越得异性喜欢) 对有异性缘的男性,男人们的评论多半是:“那个光会耍嘴皮子的家伙,怎么女人就愿意被他骗呢?” 而对有异性缘的女性,女人们会恶言以对:“哼,什么呀,那么轻佻”。 也就是说,嘴巴甜的男性和举止轻佻的女性,最有异性缘。 为什么?那是因为:女人喜欢陶醉在男人的甜言蜜语里,男人喜欢让他碰的女人! 我认识的有异性缘男人,就是特别老实和会说。 “象你这样的女性,我还是头一回遇见”。 “我再忙,只要你叫,我从地球的那头也马上赶过来”。 “有你做我的恋人,我要骄傲的走遍全世界”。 那些对普通的男人来说打死也说不出口的话,他们就一边看着女人的眼睛,一边脸不红气不喘的说了出来。这,就是让女人们着迷的男人。 听了这话的女人,虽然心里想着“什么呀,就嘴上说说”,可心里高兴着呢。脑子里虽然想着“这个轻浮的男人”,可身体最深处却是喜悦万分。女人就是这样。明知道他对其他女人也会说同样的话,可是她对自己解释说:他只有对我才是真心这么说的哦。女人就会这样想的。 大多数日本男人都觉得“就算我不说,她也懂的吧”,甜言蜜语是怎么也说不出口。害羞和自尊兼有吧。但那样,是没有异性缘的。 肉麻的表白爱的女人是会被讨厌的,男人会觉得这个女人危险而抽身而去。所以,男人自己也在犹豫要不要对女人说爱。但是,女人绝对不会觉得对她说话肉麻的男人是危险人物。相反,还有点飘飘然呢。这就是男人和女人的心理机能不同。男人讨厌的东西,女人未必也讨厌。 继续说说轻佻女的话题吧。 一般来说,男人都喜欢摸女人;而女人讨厌男人碰她,除了非常喜欢的男人以外,既不想被人碰,也不想碰人。电车里的色鬼几乎百分百都是男人这个事实,也证明了这一点。男人对从没见过的陌生女子,都会有摸的欲望。 听说,夜总会的规矩是:女招待把手放到男客的膝盖上。 ...

MySQL使用长连接时连接Innodb数据库时遇到的怪问题

因为在MySQL中存放的相关交易的数据都是用事务型的Innodb数据库。加上最近改造程序整体架构,把所有的MySQL的读取连接都改为了使用DButils的长连接,于是这就出现了一个诡异的问题: 明明交易的数据库中已经成功的提交了,但是在之前那个长连接中的查询出来的数据却没有任何变化。 这诡异的数据回溯问题在之前每次都新建立连接的情况下是没有的,只有长连接的情况下会出现这种问题。而且数据是确实的提交了的,并且用GUI工具查询的时候能够得到正确的结果。 先开始想到的办法是每次对Innodb数据库做查询操作的时候,首先使用COMMIT,或者ROLLBACK,这样确实可以得到正确的结果,但是每次都这么做未免也太奇怪了。 查阅了MySQL的手册,手册中是这么说的: InnoDB默认是可重复读的(REPEATABLE READ) 而这个REPEATABLE READ的是最高级别的隔离,也就是不可读取未提交的任何数据。数据库会维持一个快照来实现这个功能。 虽然不知道具体是为什么,但是似乎之前DButils一直读取到的都是之前连入进去时候建立的快照信息。 于是简单的解决办法就是在建立长连接的时候执行: “set session transaction isolation level read committed” 亦即将当前的会话的隔离级别设置为READ COMMITTED即可 或者在每次执行SQL语句之前执行COMMIT