2009年7月

Linux的Logrotate配置

Logrotate 程序是一个Linux系统日志文件的管理工具
它可以根据日志文件的大小,也可以根据其天数来转储。
它还可以用于压缩日志文件,以及发送日志到指定的E-mail 。

Logrotate 的缺省配置文件是/etc/logrotate.conf


# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}




Logrotate的运行脚本放在/etc/cron.daily/logrotate

/usr/sbin/logrotate /etc/logrotate.conf


可以看出,它并没有自己的守护进程
而是由crond来每天执行的

Sqlite的executemany命令

Python的Sqlite库提供了一个executemany命令
用于批量插入一批数据

写了个简单的程序测试了下
分别以以下三种方式来执行10000条数据的插入
结果如下:

1.单个insert,单个commit   ------------->   21.153429985    
2.单个insert,最后一次性的commit --->   0.3483850955
3.执行executemany           ------------->   0.0741539001

从以上数据还是能看出,executemany的效率有多高
但是,executemany实际上也相当于是一次commit
所以,如果其中的某条insert操作失败的话
整个执行都会不成功的





Sqlite数据库的恢复

当用程序查询一个Sqlite3数据库时,如果出现
database disk image is malformed
则说明sqlite数据库的某个表中有一部分记录有问题,导致无法select,update或者delete
但出现这种错误的时候,insert是可以进行的


似乎Sqlite3本身并没有提供任何的恢复机制
但通过Sqlite3提供的命令行工具,应该是能恢复其中的正常数据的
以下是操作步骤:


首先从损坏的数据库中dump数据库

sqlite3 Maildir.sqlite3

SQLite version 3.5.6

Enter ".help" for instructions

sqlite> .tables

folders  mails

sqlite> select count(*) from mails;

SQL error: database disk image is malformed

sqlite> .output data.sql

sqlite> .dump



然后新建一个sqlite库,并导入刚才的数据库

sqlite3 new.sqlite3

sqlite> .read data.sql

sqlite> .tables

folders  mails  

sqlite> select count(*) from mails;

25


更简单的一个shell脚本命令:

echo '.dump' | sqlite3 db.bad |sqlite3 db.new

郁闷的CVS lock问题

今天在使用CVS的客户端工具时
不知道是做了什么操作
结果导致向某个目录commit时
报如下错误
cvs server: [10:20:09] waiting for cvs's lock in /opt/cvsroot/vipmail_new/web/images/help

上网搜了一下,大概都是这么说的

查看仓库里面在消息中提到的目录并删除它们所属以 #cvs.rfl、 #cvs.wfl 或 #cvs.lock 开始的文件。



于是,登录到cvs服务器上对应的目录下find
结果,没有发现上面所说的几个文件
后来,直接把那个lock的目录在cvs服务器上给干掉了
然后,在本地重新add,重新commit
但是,仍旧是报上面的错误
不知道那个lock信息是在哪里记录着......

实在没办法了
就修改了目录的名字
重新提交
然后就好了

真是郁闷.....

ProxyPassMatch和ProxyPass

Apache2中的反向代理有以下2个指令:

1.ProxyPass:
  
  ProxyPass [path] !|url

  它主要是用作URL前缀匹配,不能有正则表达式,它里面配置的Path实际上是一个虚拟的路径,在反向代理到后端的url后,path是不会带过去的。

  Suppose the local server has address http://example.com/; then
   ProxyPass /mirror/foo/ http://backend.example.com/
   will cause a local request for http://example.com/mirror/foo/bar to be internally converted into a proxy request to   http://backend.example.com/bar.

   在nginx中与之对应的指令是

  location ^~ /static/

2.ProxyPassMatch:
  
  ProxyPassMatch [regex] !|url

   它实际上是url正则匹配,匹配上的regex部分是会带到后端的url的。

  This directive is equivalent to ProxyPass, but makes use of regular expressions, instead of simple prefix matching. The supplied regular expression is matched against the url, and if it matches, the server will substitute any parenthesized matches into the given string and use it as a new url.

   Suppose the local server has address http://example.com/; then
   ProxyPassMatch ^(/.*\.gif)$ http://backend.example.com$1
will cause a local request for http://example.com/foo/bar.gif to be internally converted into a proxy request to http://backend.example.com/foo/bar.gif.

   在nginx中与之对应的指令是
  
  location ~* /static

3. ProxyPassReverse:

它一般和ProxyPass指令配合使用,此指令使Apache调整HTTP重定向应答中Location, Content-Location, URI头里的URL

这样可以避免在Apache作为反向代理使用时,后端服务器的HTTP重定向造成的绕过反向代理的问题

Quoted printable编码与CRLF

1.不同平台下的换行符差别:

  (1)Windows平台:在Dos和Windows下采用回车+换行CRLF表示下一行。
  (2)Linux/Unix平台:用换行符LF表示下一行。
  (3)Mac平台:用回车符CR表示下一行。
  
   回车符CR用'\r'表示, 十进制ASCII代码是13, 十六进制代码为0x0D;

     换行符LF用'\n'表示, ASCII代码是10, 十六制为0x0A.

     所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示.

2.Quoted printable编码:
  
  QP和Base64一样,都是MIME邮件中常用的传输编码方式,可将普通字符串编码成可打印的ASCII字符。

  QP的编码比较简单,对任何一个8位Byte,使用=后加该字节的16进制值来表示。比如“恭喜”的GBK编码是“\xb9\xa7”,那么对应的QP编码即为“=B9=A7”。

  QP编码有这样一个限制:编码后每行不能超过76个字符。当超过这个限制时,将适用软换行,用=表示编码行的断行,后接CRLF

   这样就有一个问题了,当通过SMTP发送邮件到Linux服务器上后,如果在Linux上又对邮件内容做了一定的处理后,有可能会把换行符给替换成Linux上的换行符LF,这样的邮件再下载到Windows上,通过OutLook打开后,会发现中文的编码有乱码,而且只乱了一部分,其原因就是CRLF惹的祸。

  所以,如果在Linux上对QP编码的邮件处理过后,最好还是应该保留每行的CRLF格式,这样下载到Windows上就不会乱码了。

  或者,在下载到Windows之前,做一下替换,把LF换成CRLF。
  
  或者,使用unix2dos转换一下即可。



vim中的文件编码问题

先引用网上一段广为流传的文字:


vim里面的编码主要跟三个参数有关:enc(encoding), fenc(fileencoding)和fencs(fileencodings)

其中fenc是当前文件的编码,也就是说,一个在vim里面已经正确显示了的文件(前提是你的系统环境跟你的enc设置匹配),你可以通过改变 fenc后再w来将此文件存成不同的编码。比如说,我:set fenc=utf-8然后:w就把文件存成utf-8的了,:set fenc=gb18030再:w就把文件存成gb18030的了。这个值对于打开文件的时候是否能够正确地解码没有任何关系。

fencs就是用来在打开文件的时候进行解码的猜测列表。文件编码没有百分百正确的判断方法,所以vim只能猜测文件编码。比如我的vimrc里面这个的设置是

set fileencodings=utf-8,gb18030,utf-16,big5

所以我的vim每打开一个文件,先尝试用utf-8进行解码,如果用utf-8解码到了一半出错(所谓出错的意思是某个地方无法用utf-8正确地解码),那么就从头来用gb18030重新尝试解码,如果gb18030又出错(注意gb18030并不是像utf-8似的规则编码,所以所谓的出错只是说某个编码没有对应的有意义的字,比如0),就尝试用utf-16,仍然出错就尝试用big5。这一趟下来,如果中间的某次解码从头到尾都没有出错,那么 vim就认为这个文件是这个编码的,不会再进行后面的尝试了。这个时候,fenc的值就会被设为vim最后采用的编码值,可以用:set fenc?来查看具体是什么。

至于enc,其作用基本只是显示。不管最后的文件是什么编码的,vim都会将其转换为当前系统编码来进行处理,这样才能在当前系统里面正确地显示出来,因此enc就是干这个的。在windows下面,enc默认是cp936,这也就是中文windows的默认编码,所以enc是不需要改的。在 linux下,随着你的系统locale可能设为zh_CN.gb18030或者zh_CN.utf-8,你的enc要对应的设为gb18030或者 utf-8(或者gbk之类的)。



自己来总结一下吧:

1.如果系统的local是zh_CN的,那么想让vim能显示正确的编码,在.vimrc中设置:  

set enc=gbk
set fencs=utf-8,gbk

   这样,vim会先探测utf-8的编码,失败了会作为gbk的编码进行解码。显示当然是gbk了,这个和locale相关。

2.查看当前文件的编码:  

:set fenc



3.vim中转换编码:

:set fenc=utf8


   然后保存即可

4.如果已经打开了解码错的文件,想重新设置编码格式:

:edit ++enc=utf8



5.shell转换编码:
将一个GBK 编码的文件转换成UTF-8编码

iconv -f gbk -t utf8 file1 -o file2

  
批量转换文件的编码  

find . -name '*.txt' -exec iconv -f gbk -t utf8 {} -o tmp.txt \; -exec mv tmp.txt {} \;


  

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它