我那Ubuntu源服务器(u.srt.cn),最近出现了一些很诡异的错误。
比如:之前设置的crontab同步linux.deepin.org的iso镜像,已经有一段时间没有成功过了,手工执行rsync,却发现连的似乎是自己,因为banner都出来“Thanks for using SRT ubuntu mirror.”了,但是ping linux.deepin.org 却又能得到正确的结果。
再比如之前我设置了用公钥可以ssh登录另外一台机器,但是现在却提示我输入密码。
排查了许久之后,发现了一个问题,很多(但不是全部)公网的域名虽然ping的时候对应了正确的ip,但是正在使用(比如上面的rsync或ssh)的时候,好像都指到本地了。
再后来,无意之中,发现用ping6 去ping那些有问题的域名,返回的都是 localhost(::1),于是终于知道怎么回事了:系统用IPv6去访问那些域名了,而那些域名的IPv6解析不正确。
为了验证这点,只需要把系统的IPv6彻底禁用再试试就成了,但是服务器也是ubuntu,而ubuntu最新的版本都已经把IPv6编译进内核了,不能通过rmmod来禁用IPv6了,要完全禁用需要修改grub的配置,给内核传参数才行(方法见这里)。
这显然太麻烦了,其实暂时禁用一下还是有方便的办法的,就是这样:
echo 1 | sudo tee /proc/sys/net/ipv6/conf/all/disable_ipv6 |
echo 1 | sudo tee /proc/sys/net/ipv6/conf/all/disable_ipv6
执行完以后,可以执行
来确认已经禁用成功了,如果这命令没有输出就OK了。
然后现在再用ping6的话,会提示connect: Network is unreachable
。
再去试试之前的rsync和ssh,果然都正常了。
现在我担心的是:IPv4地址不都已经枯竭了吗?接下来该怎么办呢?
发表于:2011年02月10日 17:50 | 分类: 故障分析 | 6 个评论 »
网友MaskRay指出,之前版本的e-file在某些情况下,搜索结果会显示错误的HOMEPAGE信息。
并给我发来了一个patch。
我验证了一下,果然是这样,于是更新了一下,并把gentoo china overlay里的版本也一并更新了。不过portagefilelist.de自己做了一个包(app-portage/pfl)已经在portage里了,里面就包含了这个e-file,所以我在考虑是不是要删除overlay里的版本。。。恩,先mask掉好了,用overlay的同学可能需要自己unmask一下了,或者直接从这里下载也成。
哦,对了,非常感谢MaskRay。
发表于:2011年02月09日 21:09 | 分类: e-file | 1 个评论 »
昨天,HZLUG有了第一次线下活动,虽然地点远在滨江的网易大楼,但前来参加的仍然有60人左右,有学生也有已经工作的,有各大IT公司的SA还有来自上海的debian developer。
这次的人数已经大大出乎我的意料了,之前我觉得最多也就10多20个人的样子,演讲都可以直接围着电脑讲的那种,呵呵。。。
活动的详情可以看group内的帖子,也可以看TX的博文,都有大量的照片哦。
我这里就贴一下我演讲的slide吧:
发表于:2011年01月09日 11:57 | 分类: 流水帐 | 3 个评论 »
首先声明,本文不是神舟的软文。
07年底,我买了一台神舟的笔记本,但是没过几天,就出现了问题,所以08年初去换了一台新的。
说实话,当时确实觉得神舟不靠谱,尤其是人家都在质疑神舟的时候我出的手,而且买回来没几天又坏了。但是后来事实证明,神舟的性价比还是可以的:当时5k多点的价格,买是配置就算放在今天也不算很差。尤其是显示器的分辨率,现在1680 × 1050的分辨率也还是不多见,这是我最满意的一点。
说说具体情况:3年来我基本上是办公+家用两用,使用时间蛮长的,有数据为证:
lily@LLY ~$ sudo smartctl -A /dev/sda | grep Power_On_Hours
9 Power_On_Hours 0x0032 087 087 000 Old_age Always - 10102
lily@LLY ~$ echo "scale=2;10102/3/365" | bc
9.22 |
lily@LLY ~$ sudo smartctl -A /dev/sda | grep Power_On_Hours
9 Power_On_Hours 0x0032 087 087 000 Old_age Always - 10102
lily@LLY ~$ echo "scale=2;10102/3/365" | bc
9.22
也就是说,3年一共使用的时间是10102个小时,平均每天工作9.22小时。
损耗方面:电池,现在基本只能作为UPS防止意外断电用了,估计能撑10min就很好了;光驱也严重挑盘了,不是质量很好的盘读不了了,刻录功能也废了;另外,键盘在我把所有键帽拆下来洗了一遍再装上以后,2个键变得不怎么灵了(能按,但是弹回无力了,算基本不影响使用吧);电源键下陷严重,不太好按了。初此之外,主要的硬盘、CPU、内存什么的,一点问题都没有。
可以说,神舟的质量算是经得起考验的。不过,好像现在随着其他品牌的价格也都下降了蛮多,神舟的性价比优势也在渐渐失去了,希望神舟能掀起下一轮的降价风波,给消费者带来更多物美价廉的好本本。这样我就更支持你了。
发表于:2011年01月03日 22:51 | 分类: 流水帐 | 33 个评论 »
今天,在盛大某网站注册的时候,身份证必填,但我又不想填真实身份证号码,于是随便编了串自认为合法的身份证号码,但是却马上被提示号码错误,由于响应速度极快,可以肯定不是联机校验正确性的,那也就是说第二代身份证除了大家都知道的几位表示生日和性别的规则以外,还有另外的自我校验规则。于是翻开页面源码查看,发现这段js没有被压缩,所以规则也很好懂。
就在这里给大家科普下,不知道是不是火星了,呵呵。
以下代码来自这里,版权归盛大。当然,你也可以在维基百科找到更详细的介绍和算法。
iW = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
iSum = 0;
for( i=0;i<17;i++){
iC = v_card.charAt(i) ;
iVal = parseInt(iC);
iSum += iVal * iW[i];
}
iJYM = iSum % 11;
var sJYM = '';
if(iJYM == 0) sJYM = "1";
else if(iJYM == 1) sJYM = "0";
else if(iJYM == 2) sJYM = "x";
else if(iJYM == 3) sJYM = "9";
else if(iJYM == 4) sJYM = "8";
else if(iJYM == 5) sJYM = "7";
else if(iJYM == 6) sJYM = "6";
else if(iJYM == 7) sJYM = "5";
else if(iJYM == 8) sJYM = "4";
else if(iJYM == 9) sJYM = "3";
else if(iJYM == 10) sJYM = "2";
var cCheck = v_card.charAt(17).toLowerCase();
if( cCheck != sJYM ){
return false; //对不上就是假号码
} |
iW = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
iSum = 0;
for( i=0;i<17;i++){
iC = v_card.charAt(i) ;
iVal = parseInt(iC);
iSum += iVal * iW[i];
}
iJYM = iSum % 11;
var sJYM = '';
if(iJYM == 0) sJYM = "1";
else if(iJYM == 1) sJYM = "0";
else if(iJYM == 2) sJYM = "x";
else if(iJYM == 3) sJYM = "9";
else if(iJYM == 4) sJYM = "8";
else if(iJYM == 5) sJYM = "7";
else if(iJYM == 6) sJYM = "6";
else if(iJYM == 7) sJYM = "5";
else if(iJYM == 8) sJYM = "4";
else if(iJYM == 9) sJYM = "3";
else if(iJYM == 10) sJYM = "2";
var cCheck = v_card.charAt(17).toLowerCase();
if( cCheck != sJYM ){
return false; //对不上就是假号码
}
发表于:2011年01月01日 18:35 | 分类: 备忘 | 24 个评论 »
2010年的最后一天,打开自己的blog看了一眼,最后一个月居然什么都没留下了,觉得这样实在不太好,于是趁最后时刻,写点什么。
想了一下有什么值得一写的,发现还真不多,因为近来实在是少有时间去折腾,就拿这个来充数吧,如果能帮到有同样现象的朋友,也算不错。
我的gentoo在某次升级以后,gnome-panel就突然消失不见了,我的环境是蛮正常蛮标准的gnome+compiz,我的compiz开了窗口阴影,在屏幕最上方,本来是panel的地方,阴影还是有的。ps看了一下进程,gnome-panel也在。杀掉重启,或者执行 gnome-panel –replace 都无效。看起来就是面板的高度变成了0像素。
查了任何可查的日志,也没有发现什么异常。于是google了一把,发现有人说把 .gconf 删掉就可以恢复了,于是先把整个xdm停掉,把 .gconf 改名,再启动gnome,发现面板果然正常了。当然副作用就是我的大部分设置都丢了,这是我不能接受的。
当然到了这一步,就比较好办了,虽然我的办法很土,但是有效:继续用类似二分法的办法缩小.gconf里面的影响范围,当然,由于gconfd每次都会随gnome启动,所以每做一次范围确认都得停掉gnome,再打开。呵呵,虽然麻烦,但是还是很快早到了元凶,那就是: ~/.gconf/desktop/gnome/interface/%gconf.xml 一个主管界面和字体设置的配置文件,于是,干脆把它删掉,重新在系统-首选项-外观 那里设置一下字体,我的gnome-panel就这么回来了。
可能我这个问题是因为我的ubuntu和gentoo共用一个 /home 引起的,但是奇怪的是ubuntu下面板一切正常,自是gentoo有问题。
好了,问题解决了,最后一句俗却真诚的话:新年快乐!
发表于:2010年12月31日 23:18 | 分类: gentoo, 故障分析 | 4 个评论 »
工作中,经常会有用python访问各种数据库的需求,比如从oracle读点配置文件或者往mysql写点结果信息之类的。
这里列一下可能用到的各个模块。
sqlite3: 内置模块
用sqlite,有时候确实很方便,我觉得它确实做到了宣称的“零配置”。python自2.5版以来,就内置了对sqlite3的支持,使用也非常简单,按照文档上来:
#打开db文件,获得连接
conn = sqlite3.connect('数据文件名')
#获得游标
c = conn.cursor()
#执行SQL
c.execute('''SQL 片段''')
#如果有对数据的修改操作,那就需要commit一下
conn.commit()
#关闭游标
c.close()
#关闭连接
conn.close() |
#打开db文件,获得连接
conn = sqlite3.connect('数据文件名')
#获得游标
c = conn.cursor()
#执行SQL
c.execute('''SQL 片段''')
#如果有对数据的修改操作,那就需要commit一下
conn.commit()
#关闭游标
c.close()
#关闭连接
conn.close()
另外,关于sqlite在C和bash下的用法,可以参考为以前的文章。
oracle: cx_Oracle
其实,前面先介绍sqlite3,除了它确实是个小数据库以外,还有一个原因:其他数据库在python下的操作,其实基本上和sqlite3的操作是一样的,也就是说,python其实已经几乎统一了数据库的接口。
打开cx_Oracle的文档页面,你会发现其风格也和python文档很像,因为他们都是用 Sphinx 做的。模块的使用方法就更像了,把上面的代码里,获得连接的那行,换成这样:
conn = cx_Oracle.connect('username/password@TNSname') |
conn = cx_Oracle.connect('username/password@TNSname')
就可以了。只要把用户名、密码、TNS组成一个字符串,传进去,就可以得到一个oracle的连接了。
mysql: MySQLdb
和前两个非常类似,连接的时候用以下两个语法之一:
conn = MySQLdb.connect('host', 'username', 'password', 'database')
conn = MySQLdb.connect(host="host", user="username", passwd="password", db="database") |
conn = MySQLdb.connect('host', 'username', 'password', 'database')
conn = MySQLdb.connect(host="host", user="username", passwd="password", db="database")
接下来,也把它当成sqlite用就好了。
excel: pyExcelerator
好吧,我承认excel不算数据库,只是写在这里充数而已,哈哈。因为偶尔还是要取下别人发来的excel里的数据的。
其实,用pyExcelerator来读取文件也是很简单的:
sheets=pyExcelerator.parse_xls('xxx.xls') |
sheets=pyExcelerator.parse_xls('xxx.xls')
这样出来以后,sheets就是整个工作薄了,它是工作表组成的list,而一个工作表对应于一个tuple,格式是: ('工作表名', 内容)
,而内容又是一个dict,key是一个(行数, 列数)
的tuple,value才是正在的对应格子的内容。看起来确实比较绕,好在处理excel的应用也不多,将就吧。
另外,其实pyExcelerator还支持写入数据到excel的,如果有把查询结果保存成excel的需求的话,可以试试看,我还是尽量不用这种格式了,哈哈。
发表于:2010年11月28日 12:18 | 分类: 编程相关 | 12 个评论 »
现在觉得,时间的流逝速度和年龄确实是成正比的。也就是说,年纪越大,就会觉得空闲时间越来越少了~
因此,本blog都大半个月没更新了,呵呵。也不能老这么沉寂下去,今天来写点东西。
熟悉数据库的朋友们都知道,大多数数据库都有个truncate指令:truncate table xxx可以把xxx表里的所有数据都删掉,但是保留表结构。其实,在有任何数据库之前,UNIX系统里就有了truncate这个命令了,当然后面的*nix里都保留了这个。可以想像,系统里的truncate命令的操作对象肯定是文件,而且此命令不仅能把文件的数据删成0字节,还可以缩减(甚至扩大)文件至指定的大小(通过 -s 选项指定文件大小值),这对于那种日志头部有些不想删除的关键信息,但后面的部分又很多很杂的情况下很有用。对于普通的日志文件,我们要清理的时候通常可以执行 > log
来清除文件的内容(这样,log文件会变成0字节),但是如果清理的同时想保留原始日志的前面4K的信息,不用truncate就会很麻烦了。
truncate的用法还是通过实战来解释吧,如下:
lily@LLY ~$ echo -n 1234567 > txt
lily@LLY ~$ cat txt
1234567lily@LLY ~$
lily@LLY ~$ truncate -s 4 txt
lily@LLY ~$ cat txt
1234lily@LLY ~$
lily@LLY ~$ ls -l txt
-rw-r--r-- 1 lily lily 4 10月 24 16:54 txt
lily@LLY ~$ truncate -s 1M txt
lily@LLY ~$ ls -l txt
-rw-r--r-- 1 lily lily 1048576 10月 24 17:17 txt
lily@LLY ~$ du txt
4 txt
lily@LLY ~$ wc -c txt
1048576 txt |
lily@LLY ~$ echo -n 1234567 > txt
lily@LLY ~$ cat txt
1234567lily@LLY ~$
lily@LLY ~$ truncate -s 4 txt
lily@LLY ~$ cat txt
1234lily@LLY ~$
lily@LLY ~$ ls -l txt
-rw-r--r-- 1 lily lily 4 10月 24 16:54 txt
lily@LLY ~$ truncate -s 1M txt
lily@LLY ~$ ls -l txt
-rw-r--r-- 1 lily lily 1048576 10月 24 17:17 txt
lily@LLY ~$ du txt
4 txt
lily@LLY ~$ wc -c txt
1048576 txt
这里还可以看到一个“奇怪”的现象,本来已经缩至4字节的文件,把它扩展成1M以后,ls 和 wc 的结果显示大小确实是1M,但是 du 的结果却发现大小还是4字节。这也是要注意的地方之一,这种文件称为“空洞文件”,也就是说,文件的部分内容并没有实际存在于硬盘上(即没有分配对应的inode),只是“声称”有1M的大小而已。对于不存在于硬盘上的那部分字节,如果去读的话,也是不会报错的,会读到全0的数据。
这也从另一个方面反映出ls等命令默认显示的是文件“声称”的大小,而du (disk use)默认显示的是真正的磁盘占用。这里是我以前的另外一个例子。
发表于:2010年10月24日 18:29 | 分类: CLI软件 | 20 个评论 »
gnome默认的图片查看器是eog(Eye of GNOME,gnome之眼),但是由于这个比较笨重,我不是很喜欢。
之前用的都是 gpicview 这个轻量级的小玩意。因为我对图片查看器的需求只有:能快速打开,能进行旋转操作就可以了,当然,最好旋转完了以后能自动保存,这是因为我的傻瓜相机真的很傻,没有重力感应装置,所以拍出来的相机有很多都需要手工转一下~
但是,不知道从什么时候起,我的gpicview就不能做旋转照片的操作了(记得好像是哪次jpeg库升级了以后才有的,不是很确定),一点旋转按钮,程序就自动退出了,终端运行的话,会丢出一句让人摸不着头脑的提示:Bogus virtual array access。本来以为马上升级一下就可以解决问题的,但是等了很久也没解决,于是去找类似的替代品,就发现了这个:VIEWNIOR。
功能上没啥可说的,就是显示和支持旋转,哈哈,主要是依赖少,基本只依赖一个GTK了。依赖少,自然速度也快~
恩,够用就好。
发表于:2010年10月06日 16:04 | 分类: GUI软件 | 8 个评论 »
之前,这里的域名一直都是 li2z.cn
,但是,被CNNIC逼得走投无路以后,我终于把域名换成 luy.li
了。其实准确的说,不是“换”,是加了一个域名,并射成默认了而已,因此用 li2z.cn 还是可以访问的,甚至连301都没有做,之前我的做法只是把两个域名的后台路径指向同一个了而已(题外话:由于两个站的内容完全一致,所以被google惩罚了,li2z.cn 的PR瞬间就变成0了,所以在意PR的站长千万别这么干哦~)。
现在,时间也过去这么久了,大多数的流量已经是新域名下的了,但是老域名的流量也还有不少,于是我就想能不能在不影响访问的同时,统计一下老域名的每次http请求的来路。
方法自然是把所有request用301重定向到 luy.li 的对应地址,然后在日志里记录refer了(不明白301和refer的请自行google基础知识)。
这个用我三脚猫的php都很容易搞定,就几行代码,index.php如下:
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://luy.li".$_SERVER['REQUEST_URI']);
date_default_timezone_set('Etc/GMT-8');
$msg = date('Y-m-d H:i:s').' '.$_SERVER['HTTP_REFERER'].' '.$_SERVER['REQUEST_URI']."\n";
file_put_contents('log.txt',$msg,FILE_APPEND);
?> |
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://luy.li".$_SERVER['REQUEST_URI']);
date_default_timezone_set('Etc/GMT-8');
$msg = date('Y-m-d H:i:s').' '.$_SERVER['HTTP_REFERER'].' '.$_SERVER['REQUEST_URI']."\n";
file_put_contents('log.txt',$msg,FILE_APPEND);
?>
然后,建个 .htaccess 把域名下的所有请求都指向 index.php:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule> |
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>
测试一下,对get请求,可以完整地转到新的域名了:
$ curl -v "http://li2z.cn/abc?xxx=yyy"
* About to connect() to li2z.cn port 80 (#0)
* Trying 66.147.240.158… connected
* Connected to li2z.cn (66.147.240.158) port 80 (#0)
> GET /abc?xxx=yyy HTTP/1.1
> User-Agent: curl/7.21.1 (i686-pc-linux-gnu) libcurl/7.21.1 GnuTLS/2.10.2 zlib/1.2.5
> Host: li2z.cn
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Date: Sat, 02 Oct 2010 12:05:53 GMT
< Server: Apache
< X-Powered-By: PHP/5.2.14
< Location: https://luy.li/abc?xxx=yyy
< Cache-Control: max-age=1
< Expires: Sat, 02 Oct 2010 12:05:54 GMT
< Vary: Accept-Encoding
< Content-Length: 0
< Content-Type: text/html
<
* Connection #0 to host li2z.cn left intact
* Closing connection #0
然后在后台目录里会生成一个 log.txt ,里面会有所有访问的时间、refer和uri,这样日后就可以方便地查出老域名的所有来路和受访页面了,最重要的是,由于有301,还不会对正常访问造成影响哦~
发表于:2010年10月02日 20:34 | 分类: 编程相关 | 5 个评论 »