Hexo博客搭建

入门

1
2
3
4
5
6
7
8
// 使用淘宝npm源
npm install -g cnpm --registry=https://registry.npm.taobao.org
// 安装
cnpm install -g hexo
// 切换到你认为合适的路径,创建博客
hexo init
// 运行
hexo s -p 4040

进阶

使用七牛云插件

如何配置,hexo-qiniu-sync写得很清楚

1
cnpm install hexo-qiniu-sync --save

主题

直接在把主题clone到hexo的themes文件夹,然后在_config.yml里面指定theme即可。

部署

现在Github上面创建一个以你用户名命名的repository。yourname.github.io

1
2
3
4
5
6
7
cnpm install hexo-deployer-git --save
// 部署
hexo g
hexo d -g
// 可能会遇到错误,建议先清理一下再generate
hexo clean

近况

依旧忙

很多懒人喜欢用忙来掩饰自己的懒,我就是其中的一位。
懒到旅游计划被搁置,懒到不出去拍照,懒到不更博,甚至懒到出门吃个麻辣烫都不愿意。
我跟HR说,要辞了。
确实,在一个九月份才成立的创业公司工作,有多辛苦,可想而知。辛苦到下班之后再也不想碰代码,一点也不想碰了。我之前跟鸡哥说过:“当你把你的兴趣变成了工作的时候,你会发现,这并不会是一件好事“。
辞掉工作之后应该不会这么忙了,我似乎也终于有时间去好好逛一逛广州了。离毕业仅有三个月,希望可以好好去探索这座我已经生活了四年,以后应该没什么机会再接触的城市。

春招

原本盘算着,如果南方电网不录取我的话,我就打算留在现在工作的公司,再不然我就参加春招。
现在似乎工作也辞了,春招也不用去了,一切都朝着截然不同的方向发展了。
阿柴他拿了南网的offer,但是他不去,他去了中山的一家私企。
“觉得有发展前景而已。哈哈”
前景。前景。这个虚无缥缈的词。前景会是怎么样的,谁知道呢。
年前收到南方电网的录取通知,年后回到学校之后立刻把三方寄出去。我也不知道是什么驱使我,几乎是毫不犹豫地放弃一切的”前景“,回到那个我以前压根没想过回去的地方工作。

Python的Signal模块

信号

进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。操作系统规定了进程收到信号以后的默认行为,但是,我们可以通过绑定信号处理函数来修改进程收到信号以后的行为,有两个信号是不可更改的SIGTOP和SIGKILL。

发送信号一般有两种原因

  1. (被动式) 内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号
  2. (主动式) 通过系统调用kill来向指定进程发送信号

几个常用信号:

SIGINT 终止进程 中断进程 (control+c)
SIGTERM 终止进程 软件终止信号
SIGKILL 终止进程 杀死进程
SIGALRM 闹钟信号

Python中Signal的用法

signal包的核心是使用signal.signal()函数来预设(register)信号处理函数

绑定信号处理函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import os
import signal
from time import sleep
def onsignal_term(a,b):
print '收到SIGTERM信号'
#这里是绑定信号处理函数,将SIGTERM绑定在函数onsignal_term上面
signal.signal(signal.SIGTERM,onsignal_term)
def onsignal_usr1(a,b):
print '收到SIGUSR1信号'
#这里是绑定信号处理函数,将SIGUSR1绑定在函数onsignal_term上面
signal.signal(signal.SIGUSR1,onsignal_usr1)
while 1:
print '我的进程id是',os.getpid()
sleep(10)
运行该程序。然后通过另外一个进程来发送信号。
import os
import signal
#发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改
os.kill(16175,signal.SIGTERM)
#发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改
os.kill(16175,signal.SIGUSR1)

signal.alarm()

它被用于在一定时间之后,向进程自身发送SIGALRM信号
在signal.alarm()执行5秒之后,进程将向自己发出SIGALRM信号,随后,信号处理函数myHandler开始执行。

1
2
3
4
5
6
7
8
9
10
import signal
# Define signal handler function
def myHandler(signum, frame):
print("Now, it's the time")
exit()
# register signal.SIGALRM's handler
signal.signal(signal.SIGALRM, myHandler)
signal.alarm(5)
while True:
print('not yet')

python linecache模块读取文件的方法

在python中,有个好用的模块linecache,该模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行。


linecache.getlines(filename)
从名为filename的文件中得到全部内容,输出为列表格式,以文件每行为列表中的一个元素,并以linenum-1为元素在列表中的位置存储
linecache.getline(filename,lineno)
从名为filename的文件中得到第lineno行。这个函数从不会抛出一个异常–产生错误时它将返回”(换行符将包含在找到的行里)。
如果文件没有找到,这个函数将会在sys.path搜索。
linecache.clearcache()
清除缓存。如果你不再需要先前从getline()中得到的行
linecache.checkcache(filename)
检查缓存的有效性。如果在缓存中的文件在硬盘上发生了变化,并且你需要更新版本,使用这个函数。如果省略filename,将检查缓存里的所有条目。
linecache.updatecache(filename)
更新文件名为filename的缓存。如果filename文件更新了,使用这个函数可以更新linecache.getlines(filename)返回的列表。


注意:使用linecache.getlines(‘a.txt’)打开文件的内容之后,如果a.txt文件发生了改变,如果要再次用linecache.getlines获取的内容,不是文件的最新内容,还是之前的内容,此时有两种方法:
1、使用linecache.checkcache(filename)来更新文件在硬盘上的缓存,然后在执行linecache.getlines(‘a.txt’)就可以获取到a.txt的最新内容;
2、直接使用linecache.updatecache(‘a.txt’),即可获取最新的a.txt的罪行内容

另外:
读取文件之后,不需要使用文件的缓存时,需要在最后清理一下缓存,使linecache.clearcache()清理缓存,释放缓存。
此模块使用内存来缓存文件内容,所以需要耗费内存,打开文件的大小和打开速度和你的内存大小有关系。

Linux日志滚动

日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到。对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成了个问题。除此之外,处理一个单个的庞大日志文件也常常是件十分棘手的事。

logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例如,你可以设置logrotate,让/var/log/foo日志文件每30天轮循,并删除超过6个月的日志。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。

logrotate的配置文件是/etc/logrotate.conf,通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中,它(们)放在/etc/logrotate.d/目录下。

一个标准的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
/var/log/log-file {
monthly
rotate 5
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}

常用配置项

  • monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。
  • rotate 5: 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。
  • compress: 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
  • delaycompress: 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
  • missingok: 在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。
  • notifempty: 如果日志文件为空,轮循不会进行。
  • create 644 root root: 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
  • postrotate/endscript: 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。
  • compress 通过gzip 压缩转储以后的日志
  • nocompress 不需要压缩时,用这个参数
  • copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
  • nocopytruncate 备份日志文件但是不截断
  • create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
  • nocreate 不建立新的日志文件
  • delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
  • nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
  • errors address 专储时的错误信息发送到指定的Email 地址
  • ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
  • notifempty 如果是空文件的话,不转储
  • mail address 把转储的日志文件发送到指定的E-mail 地址
  • nomail 转储时不发送日志文件
  • olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
  • noolddir 转储后的日志文件和当前日志文件放在同一个目录下
  • prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
  • postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
  • daily 指定转储周期为每天
  • weekly 指定转储周期为每周
  • monthly 指定转储周期为每月
  • rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
  • tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
  • size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).

要调用为/etc/lograte.d/下配置的所有日志调用logrotate:

1
# logrotate /etc/logrotate.conf

要为某个特定的配置调用logrotate:

1
# logrotate /etc/logrotate.d/log-file

调试

1
# logrotate -d /etc/logrotate.d/log-file

logrotate需要的cron任务应该在安装时就自动创建了,我把cron文件的内容贴出来,以供大家参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
# cat /etc/cron.daily/logrotate
#!/bin/sh
# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

近况

最近博客少更了,因为找到实习,每天几乎都忙碌在实习更复习南网的面试更笔试之间。
本以为上周的南网笔试结束后,忙碌的日子将会告一段落了,可没想到学校居然还因为种种原因给我们加了两门课程。而且是加在考试月里面。这真是坑爹。

实习

最近一年都在使用Python,博客大部分内容都是关于Python的。其实刚开始学习Python的时候是因为爬虫。
实习,最终还是做了爬虫。
很多时候当你把一样你喜欢的东西变成了职业的时候,其实事实上并没有你想象得那么有趣 。
Anyway,继续做下去吧。等到南网的录取结果出来了再做打算了。

计划

等这段忙绿的事件过去,大概也是2017年了。
准备春招吧,如果进不去南网。也许留在现在实习的公司也是一个不错的选择。
准备毕设吧,毕竟自己拟题,整了个自己一直想做的东西,既然要做,就要认真做好。
好好整理今年拍摄的照片。
花多点时间陪陪家人。

Pyspider Deploment(RabbitMQ+MongoDB)

1
2
3
4
5
6
7
8
9
10
11
12
### config.conf
{
"taskdb": "mongodb+taskdb://127.0.0.1:27017/taskdb",
"projectdb": "mongodb+projectdb://127.0.0.1:27017/projectdb",
"resultdb": "mongodb+resultdb://127.0.0.1:27017/resultdb",
"message_queue": "amqp://127.0.0.1:5672/%2F",
"webui": {
"username": "root",
"password": "root",
"need-auth": true
}
}

注意,这里的MongoDB跟RabbitMQ都默认没有密码。
如需要用户名密码。

1
"taskdb": "mongodb+taskdb://username:passwd@127.0.0.1:27017/taskdb",

运行

1
2
3
4
5
6
7
8
9
10
# start **only one** scheduler instance
pyspider -c config.json scheduler
# phantomjs
pyspider -c config.json phantomjs
# start fetcher / processor / result_worker instances as many as your needs
pyspider -c config.json --phantomjs-proxy="localhost:25555" fetcher
pyspider -c config.json processor
pyspider -c config.json result_worker
# start webui, set `--scheduler-rpc` if scheduler is not running on the same host as webui
pyspider -c config.json webui

Linux终端快捷键

Shift+Ctrl+T:新建标签页
Shift+Ctrl+W:关闭标签页
Ctrl+PageUp:前一标签页
Ctrl+PageDown:后一标签页
Shift+Ctrl+PageUp:标签页左移
Shift+Ctrl+PageDown:标签页右移
Alt+1:切换到标签页1
Alt+2:切换到标签页2
Alt+3:切换到标签页3
Shift+Ctrl+N:新建窗口
Shift+Ctrl+Q:关闭终端
终端中的复制/粘贴:
Shift+Ctrl+C:复制
Shift+Ctrl+V:粘贴

回车和换行

Unix系统里,每行结尾只有”<换行>”,即”\n”;Windows系统里面,每行结尾是”<回车><换行>”,即”\r\n”;Mac系统里,每行结尾是”<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

|