最近想研究下linux
基本思路是在现有的windows系统下,装个虚拟机,虚拟机上装 linux。
虚拟机选择了 Sun xVM VirtualBox ,理由是界面友好,操作方便。下载地址 www.sun.com
虚拟机安装很向导化,不多阐述。
比较有意思的是关于 VirtualBox 的网络配置,网上搜索了一下,基本没有简单易懂的相关教程。
于是我花时间自己研究了下,其实实现很简单。
VirtualBox 有4种网络配置方式:
NAT
Bridged Adapter
Internal
Host-only Adapter
如图:
默认是 NAT 方法,NAT(网络地址转换),你可以认为你的虚拟机是在你的主机后方,所有的联网请求都先通过主机(其实是通过主机的NAT服务器,这是VirtualBox内置的)。
优点:配置简单,可以说只要你的主机可以上网那么配置就没有什么难的。
缺点:虚拟OS的网络地址外网不可见,无法与你的主机进行通信,所以如果你要利用主机和你的虚拟OS调试网络应用程序,恐怕不能使用这种联网方式。
这显然不能满足我们的基本要求。
经过我的反复尝试,得到一种简单有效的方法,看图说话如下:
确认本地连接和vbox建立的虚拟连接都处于正常连接状态
察看本地连接属性
确认vbox 的 bridge 驱动正常
然后配置 internet 协议 (tcp/ip) 为固定 ip
再察看下vbox 的虚拟网络连接的属性
这里注意不要修改vbox 生成的默认参数
最后在vbox 的网络配置里选择 Bridged Adapter,并选择相应的网卡连接。
完工。这样虚拟机通过网桥,实现模拟局域网内终端,经测试可以在网内ping通。
Tags: VirtualBox , 虚拟机
02月 9th, 2010
东木
javascript:var%20n=document.title.replace('%20-%20Windows%20Live','');var%20id=((location.hash=='')?window.selfPageData.currentItemHash:location.hash).replace('#resId/','');var%20u='http://storage.live.com/items/'+id+'?filename='+encodeURI(n);var%20p='http://'+document.location.host+'/redir.aspx?page=self&resId='+id;var%20e='<input%20onmouseover=%22this.select();%22%20onclick=%22this.select();%22%20value=%22';var%20f='%22%20style=%22width:580px%22%20type=%22text%22%20/><br>';var%20d='by%20(<a%20href=%22http://rpsh.net/%22>Rpsh</a>)';var%20c='\u5916\u94FE\u5730\u5740:'+d+e+u+f+'\u5206\u4EAB\u5730\u5740:'+e+p+f;var%20a=document.getElementById('content');var%20g=(a.getElementsByTagName('p')[0]);var%20b=g?g:document.createElement('P');b.innerHTML=c;a.insertBefore(b,a.firstChild);void(0)
Tags: SkyDrive
02月 8th, 2010
东木
在远景里找到的一位网友贴的解决办法,可以解决目前部份银行使用K宝U盾无法登陆网银的问题。方法很实用,不用修改程序文件或浏览器的安全级别,只需手动在注册表里指定网银CSP的一个文件路径。我只试了农行的华大K宝,其它的如(建行、工行、交行、广发、光大、兴业等)按跟贴的朋友尝试也是可行的。方法差不多相同。下面是原贴内容。
目前许多windows 7 IE8用户无法使用USBkey登入网银。该方法支持农行,建行,工行,光大,交行,广发,各股份制商业银行,各城市商业银行,各农村商业银行等多家银行网银,权当抛砖引玉,欢迎各位网友积极测试,以便供后人参考!
[快速导读]:修改注册表
32位 WIN 7下找到:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\###]
修改 “Image Path”=”%SystemRoot%\System32\ ***.dll”
64位 WIN 7下找到:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography\Defaults\Provider\###]
修改 “Image Path”=”%SystemRoot%\SysWOW64\ ***.dll”
注:不同的网银,###,***会不同,请根据自己需要修改。
敬请网友能测试下其他网银,成功的请贴出修改方法!
==以“华大K宝”登入“农行网银”为例==
一、症状:
在登陆农行网银,出现“确认证书”后,点击“确定”,却出现“无法显示该网页”!
二、解决方法:
打开注册表编辑器
(1)开始→运行→输入regedit
(2)32位 win7下找到:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\ZGHD Cryptographic Service Provider v1.0]
将Image Path值由”GP_MINCSP.dll”修改为”%SystemRoot%\System32 \GP_MINCSP.dll”
(即增加”%SystemRoot%\System32\”字段),结束。
64位 win7下找到(感谢腿毛飘飘,左楠风提供):
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node \Microsoft\Cryptography\Defaults\Provider\ZGHD Cryptographic Service Provider v1.0]
将Image Path值修改为”%SystemRoot%\SysWOW64 \GP_MINCSP.dll”
(3)无需重启,随便打开农行网银网址,出现“正在查找凭据平铺”,出现“确认证书”,点击确定即可出现“用户口令,请输入您的K宝密码”对话框,即可正常登陆网银。
三、本方法优点:
(1)不需要在开始菜单程序里找到CSP工具,将K宝里的证书注册
(2)不需要在桌面上找到“95599在线银行”的图标,这个图标进入农行的网站
(3)不需要修改IE8诸多配置:例如启用“内存保护帮助减少联机攻击”,“使用直接插入自动完成功能(在Internet Explorer之外)”,降低“安全级别”,取消“启用保护模式”,修改“兼容性视图设置”里添加农行网银地址
(4)不需要编辑C:\Windows\System32\drivers\etc\hosts文件,在hosts文件中加入农行网银地址
==其他可用网银(方法与上雷同,请根据不同网银做个性化调整)==
建行华宝E路通(感谢charlesou测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\CIDC Cryptographic
Service Provider v2.0.0]
“Image Path”=”%SystemRoot%\System32\CIDC_CSP.dll”
建行捷德(感谢cq-bbcyb测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\StarSec CSP CCB]
“Image Path”=”%SystemRoot%\System32\sscsp_ccb.dll”
建行华大智宝(感谢le57907579,chino测试)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\CIDC Cryptographic Service Provider v2.0.0
“Image Path”=”%SystemRoot%\System32\CIDC_CSP.dll”
农行飞天诚信K宝(感谢dongyang, successc测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\EnterSafe ePassAuto CSP For ABChina v1.0]
“Image Path”=”%SystemRoot%\System32\ePassAutocsp11_ABChina_s.dll”
农行动态口令卡(感谢hmiloy测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Base Smart Card Crypto Provider]“Image Path”=”%SystemRoot%\System32\basecsp.dll
工行金邦达(感谢hnxceagle测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Netting Smart Card Cryptographic Provider v1.2]
“Image Path”=”%SystemRoot%\System32\cspnet.dll”
交通银行(感谢k108cn, edwiny测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Beijing GD CSP BANKCOMM v1.0 ]
“Image Path”=”%SystemRoot%\System32\ep2csp32_bc.dll”
交行华大(感谢sevenyu测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\EnterSafe CSP v1.0 for BANKCOMM]
“Image Path”=”%SystemRoot%\System32\ngcsp_bc_2.dll”
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\ZGHD CSP for Bank of Communications v1.0]
“Image Path”=”%SystemRoot%\System32\HD_CSP_JH.dll”
广发银行(感谢thinkbook, hbzhong测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Minghua CSP for GDBC v1.0]
“Image Path”=”%SystemRoot%\System32\GDCSPS_V3.dll”
光大银行(感谢popofish, hbzhong测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\StarKey220 CSP version 1.0]
Image Path=“%SystemRoot%\System32\GDsk220csp_cebb.dll”
北京农村商业银行飞天诚信(感谢squid8测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\FEITIAN ePassNG CSP For BJRCB V1.0]
%SystemRoot%\System32\ngcsp_bjrcb.dll
北京银行(感谢maow测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\EnterSafe CSP (ePass2000-FT11) v1.0 for BJCA]
“Image Path”=”%SystemRoot%\System32\bjcacsp11_ft11_s.dll”
杭州银行(感谢zhanxinabc测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\NJA USBKEY CSP for HCCB V1.0]
“Image Path”=”%SystemRoot%\System32\HisCSP_hccb.dll”
兴业银行(感谢天很蓝测试)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\StarSec CSP For CIB]
“Image Path”=”%SystemRoot%\SYSTEM32\sscsp_cib.dll”
Tags: Win7 , 网银
02月 8th, 2010
东木
google analytics 使用 utma utmb utmc utmz 来做分析,其中 utmz记录了访问的来源 对于市场分析来说非常重要,
有的时候 会出现这个问题 从a网站来的顾客 来到网站 没有买任何东西就走了 后来通过b网站来下单 最后从下单的情况来看 到底是a网站 来的流量还是b (其实对于referral网站 类型 都是以第一次的为准)
有的时候还会碰到这个问题 从百度搜索一个关键词 ,没有没任何东西,又从google搜索一个关键词,买了东西 最后算那个词的转换(其实对于搜索引擎来说是最后一次)
还会碰到更复杂的问题
来一个顾客 从百度搜索一个词 来了网站 没买东西, 然后去别的网站逛 看到别的网站上挂的广告,于是点击这个banner广告来购买了 最后问是在google analytics里 是算那个流量来源的转换 (其实是算搜索的转换)
以上都是经过我多次测试的结果
附上试验表格
结论就是
在金字塔上面的来源的cookie值 ,越能覆盖下来的
文字描述就是 直接来源和推荐来源是算老的, 搜索的是看新的
Tags: Google Analytics , Urchin , utmz
01月 17th, 2010
东木
使用cpan,大概进去后,help一下就会用。
但是今天想安装Chart::OFC的时候还是碰到问题。
不知道为什么我的一台老的rhel3的系统里的urllist竟然是ftp://cpan.cse.msu.edu/ ,半天一个i Chart::OFC的命令也没有反应,速度太慢了,后来查了一下那个大学是密歇根州立大学,好偏远,于是必须更新一下urllist,但是我又忘了怎么更新了。
好在网上找到个帖子(http://mail.pm.org/pipermail/china-pm/2007-August/001002.html )告诉了我,转到如下:
你无需手工修改 /etc/perl/CPAN/Config.pm 来改变 CPAN 镜像地址的,以ROOT身
份运行:
# perl -MCPAN -e shell
cpan> o conf urllist unshift http://www.perl.com/CPAN/
cpan> o conf commit
在search.cpan.org也看到有两个中国的镜像,考虑到稳定性,还是使用perl.com的
还有一点是在用cpan的时候,因为模块安装时默认的make test不成功,make install就不会去做,但是因为某些情况并不需要这样,这时候,可以force install DBD::mysql
============================================================
配置http_proxy的方法:
o conf http_proxy http://proxy:8080
============================================================
有时候,可能几个不重要的make test中的测试项导致make test失败,这时候就用强制安装:
force install Test::WWW::Mechanize::Catalyst
Tags: CPAN , perl
01月 7th, 2010
东木
在地址栏输入 about:config
新建一个布尔项,名称是 extensions.checkCompatibility,值为 false,就不会进行扩展兼容性检查了。
Tags: Firefox , 兼容性
01月 4th, 2010
东木
Ⅰ、Nginx配置文件的修改
修改nginx的默认配置文件:
CODE:
vi /etc/nginx/nginx.conf
按下面的内容修改Nginx的配置文件。兰色表示需要手动修改的内容 ,红色表示增加的内容 :
#user nobody;
# 指定子进程数,酌情修改
worker_processes 4 ;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
# 最多可打开文件数
worker_rlimit_nofile 8196;
events {
# 最大并发数
worker_connections 1024 ;
}
http {
include mime.types;
default_type application/octet-stream;
# 关掉错误日志
error_log /dev/null crit;
# 如果需要错误日志,就用下面这行替换上面这行
#error_log /var/log/nginx/error.log notice;
# 定义日志格式,对日志使用缓存,避免频繁的磁盘I/O操作
access_log /var/log/nginx/access.log combined buffer=1m;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 10;
# 对静态文件和可压缩文件启用压缩,以节约网络带宽,提高访问速度
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_types text/html text/css text/xml text/plain application/x-javascript application/xml application/pdf application/x-perl application/x-tcl application/msword application/rtf application/vnd.ms-excel application/vnd.ms-powerpoint application/vnd.wap.xhtml+xml image/x-ms-bmp;
gzip_disable ”MSIE [1-6] .”;
gzip_vary on;
# 定义输出缓存大小
output_buffers 4 32k;
# 最大允许可上传文件大小
client_max_body_size 20m;
# 定义一个叫“myzone”的记录区,总容量为 10M
# 和下面的limit_conn一起限制单个IP的并发连接数为10
limit_zone myzone $binary_remote_addr 10m;
server {
listen 80;
server_name localhost;
location / {
root /var/nginx/html;
index index.php index.html index.htm;
limit_conn myzone 10;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/nginx/html;
}
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/nginx/html $fastcgi_script_name;
include fastcgi_params;
}
# 在浏览器本地暂存图片和静态文件,不记录日志,以节约机器资源
location ~* .(gif|png|jpg|jpeg|bmp|css|js|swf)$
{
root /var/nginx/html;
access_log off;
expires max;
}
# 在浏览器中输入http://xxx.xxx.xxx/status可以看到Nginx的运行信息
# 需要密码验证,不记录日志,限制IP访问
location ~ /status
{
auth_basic ”O.N.M.P.”;
auth_basic_user_file password;
stub_status on;
access_log off;
allow 192.168.0.0/24;
deny all;
}
}
}
其他的部分请酌情修改。
运行下面的命令生成查看Nginx运行状态的密码文件:
htpasswd -c /etc/nginx/password webadmin
按提示输入两遍密码即可。
在查看status的时候,输入用户名webadmin(见上面这行)和密码就能够看到Nginx的运行数据了。
Nginx能够流行和它的高负载能力是分不开的,在追求性能表现的场合,推荐使用Nginx+PHP-fastcgi的组合以获得强健的性能表现。而对于那些重视安全性的场合来说,可能OpenBSD内核集成的Apache更合适。OpenBSD下搭建Apache、MySQL、PHP环境的详细内容请参见偶的另篇博文,地址在下面:(博客速度可能较慢,四楼有转帖)
http://blog.chinaunix.net/u2/81136/showart_1860332.html
当然,你也可以利用Nginx内置的负载均衡功能,在前端分配访问流量,后端由Apache来运行PHP环境。Nginx负载均衡的配置可以去Nginx的主页参看相关内容,地址:http://wiki.nginx.org/Main 。
下面为一个Nginx负载均衡的示例:
http {
upstream myproject {
ip_hash;
server 192.168.1.1:80;
server 192.168.1.2:80;
server 192.168.1.3:80;
server 192.168.1.4:80;
}
server {
listen 80;
server_name www.domain.com;
location / {
proxy_pass http://myproject;
}
}
}
网络拓扑示意图如下:
Ⅱ、Nginx日志截断
OpenBSD默认每天00:00会执行/etc/daily.local脚本中的内容,我们只需要把Nginx日志截断的命令加入到这个文件中即可。
CODE:
vi /etc/daily.local
加入下面的内容:
#!/bin/sh
# 对Nginx日志进行截断和压缩,以节约log分区空间
# 在张宴的基础上修改,感谢!
mkdir -p /var/log/nginx/$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/
mv /var/log/nginx/access.log /var/log/nginx/$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/access.$(date -d “yesterday” +”%Y%m%d”).log
kill -USR1 `cat /var/run/nginx.pid`
sleep 1
gzip /var/log/nginx/$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/access.$(date -d “yesterday” +”%Y%m%d”).log
保存退出,为/etc/daily.local加上执行权限:
CODE:
chmod 0755 /etc/daily.local
其他需要每天运行的命令也都可以加在这个脚本里面,各位自行处理。
Tags: Nginx
01月 1st, 2010
东木
$array1 = array('a'=>1,'b'=>2);
$array2 = array('b'=>1,'c'=>5,'d'=>4);
foreach ((array)array_intersect(array_keys($array1),array_keys($array2)) as $key){
$mixed[$key] = $array1[$key]+$array2[$key];
unset($array1[$key],$array2[$key]);
}
$mixed = array_merge($array1,$array2,(array)$mixed);
Tags: PHP
12月 30th, 2009
东木
本文介绍的是从 BugFree 摘录来的二维数组排序函数,可以实现类似 MySQL 的 ORDER BY 效果,当数组不是从数据库取得时会有特殊应用。
PHP:
// 说明:PHP中二维数组的排序方法
// 整理:http://www.CodeBit.cn
/**
* @package BugFree
* @version $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $
*
*
* Sort an two-dimension array by some level two items use array_multisort() function.
*
* sysSortArray($Array,"Key1","SORT_ASC","SORT_RETULAR","Key2"……)
* @author Chunsheng Wang
* @param array $ArrayData the array to sort.
* @param string $KeyName1 the first item to sort by.
* @param string $SortOrder1 the order to sort by("SORT_ASC"|"SORT_DESC")
* @param string $SortType1 the sort type("SORT_REGULAR"|"SORT_NUMERIC"|"SORT_STRING")
* @return array sorted array.
*/
function sysSortArray($ArrayData,$KeyName1,$SortOrder1 = "SORT_ASC",$SortType1 = "SORT_REGULAR")
{
if(!is_array($ArrayData))
{
return $ArrayData;
}
// Get args number.
$ArgCount = func_num_args();
// Get keys to sort by and put them to SortRule array.
for($I = 1;$I < $ArgCount;$I ++)
{
$Arg = func_get_arg($I);
if(!eregi("SORT",$Arg))
{
$KeyNameList[] = $Arg;
$SortRule[] = '$'.$Arg;
}
else
{
$SortRule[] = $Arg;
}
}
// Get the values according to the keys and put them to array.
foreach($ArrayData AS $Key => $Info)
{
foreach($KeyNameList AS $KeyName)
{
${$KeyName}[$Key] = $Info[$KeyName];
}
}
// Create the eval string and eval it.
$EvalString = 'array_multisort('.join(",",$SortRule).',$ArrayData);';
eval ($EvalString);
return $ArrayData;
}
//################# 示例 #################
$arr = array(
array(
'name' => '学习',
'size' => '1235',
'type' => 'jpe',
'time' => '1921-11-13',
'class' => 'dd',
),
array(
'name' => '中国功夫',
'size' => '153',
'type' => 'jpe',
'time' => '2005-11-13',
'class' => 'jj',
),
array(
'name' => '编程',
'size' => '35',
'type' => 'gif',
'time' => '1997-11-13',
'class' => 'dd',
),
array(
'name' => '中国功夫',
'size' => '65',
'type' => 'jpe',
'time' => '1925-02-13',
'class' => 'yy',
),
array(
'name' => '中国功夫',
'size' => '5',
'type' => 'icon',
'time' => '1967-12-13',
'class' => 'rr',
),
);
print_r($arr);
//注意:按照数字方式排序时 153 比 65 小
$temp = sysSortArray($arr,"name","SORT_ASC","type","SORT_DESC","size","SORT_ASC","SORT_STRING");
print_r($temp);
?>
Tags: PHP , sort
12月 29th, 2009
东木
HTML::TreeBuilder
这个解析模块使用了强大的 HTML::Element 模块。解析时,HTML::TreeBuilder模块把整个 html 文档转换成了 perl 的数据结构,可以进行任意的操作。
使用时先创建一个 HTML::TreeBuilder 对象。
use Data::Dumper qw(Dumper);
$Data::Dumper::Indent = 1;
use HTML::TreeBuilder;
my $tree = new HTML::TreeBuilder;
直接向 HTML::TreeBuilder 传递文件好像会把中文转换成 unicode 的字符,所以一般传递文件句柄。而且传递的字符串或者句柄一般要先确保是 utf8 字符串才行,不然会有一个warning:
Parsing of undecoded UTF-8 will give garbage when decoding entities at /home/ywb/temp/t.pl line 16, line 5.
解析文件和解析字符串的区别仅仅是前者是使用 parse_file 函数,而后者使用parse 函数。下面以解析文件句柄的例子:
binmode DATA, “utf8″;
$tree->parse_file(\*DATA);
print Dumper($tree), “\n”;
__DATA__
要提取出表格中的内容可以这样:
foreach my $row ( $tree->find_by_tag_name(“tr”) ) {
foreach my $cell ( $row->content_list ) {
print $cell->as_text, “\t”;
}
print “\n”;
}
由于 HTML::Element 会强制把所有的 tag 都转换成小写,所以不用担心 tag的大小写问题。HTML::TokenParser和 HTML::Parser 等模块不同,HTML::TokenParser 模块是类似于流(stream oftokens)的方式来解析 HTML 文件。在解析的过程中 HTML 中的文本转换成这六种token:
["S", $tag, $attr, $attrseq, $text]
["E", $tag, $text]
["T", $text, $is_data]
["C", $text]
["D", $text]
["PI", $token0, $text]
这个例子应该能够体现这个模块解析的一些特点:
use HTML::TokeParser;
my $file = \*DATA;
my $parser = HTML::TokeParser->new($file)
or die “Can’t open $file: $!\n”;
my (@table, @row, $inrow);
while (my $token = $parser->get_token( )) {
my $type = $token->[0];
if ( $type eq ‘T’ ) {
push @row, $token->[1] if $inrow;
}
elsif ( $type eq ‘S’ ) {
if ( $token->[1] eq ‘tr’ ) {
$inrow = 1;
}
}
elsif ( $type eq ‘E’ ) {
if ( $token->[1] eq ‘tr’ ) {
push @table, [@row]; # 注意这一行不能用 \@row
@row = ();
$inrow = 0;
}
}
}
print Dumper(\@table), “\n”;
__DATA__
与前面 HTML::TreeBuilder 的例子相比可能有些麻烦,但是很多情况下,只需要一次处理一个 token,这时候用这个模块就非常方便了,比如你要得到一个html 里所有的图片或者所有的链接,像这样写就行了:
my @images;
while (my $token = $parser->get_token( )) {
my $type = $token->[0];
if ( $type eq ‘S’ ) {
if ( $token->[1] eq ‘img’ ) {
push @images, $token->[2];
}
}
}
__DATA__
专门的模块HTML::LinkExtor如果要提取 html 文件中的链接,也不用自己写了,用 HTML::LinkExtor 就好了。一个简单的例子:
require HTML::LinkExtor;
my $p = HTML::LinkExtor->new();
$p->parse_file(\*DATA);
print Dumper($p->links), “\n”;
__DATA__
x
HTML::LinkExtor 的 new 函数可以提供一个 callback 函数,这个函数是当发现链接时就调用这个函数。传递给这个函数的第一个参数是链接的类型,比如 ‘a’,'img’,其余的参数是链接的属性。如果提供了 callback 函数,HTML::LinkExtor 就不再累积链接了,这意味着你不能再用 links 函数来得到所有的链接。要得到所有链接,只有在 callback 函数里自己保存好。
require HTML::LinkExtor;
my $p = HTML::LinkExtor->new(\&cb);
$p->parse_file(\*DATA);
sub cb {
my($tag, %links) = @_;
print Dumper($tag, \%links), “\n”;
}
__DATA__
x
HTML::HeadParser如果只是要得到 html 的标题或者其它在 head 标签之间内容,就不要用HTML::TreeBuilder 这样的重量级模块了,HTML::HeadParser 模块就能完成这个任务,并且使用相当简单。
require HTML::HeadParser;
my $p = HTML::HeadParser->new;
my $text = join(”, );
$p->parse($text) and print “not finished”;
# to access
print “Title: “, $p->header(‘Title’), “\n”;
# to access
print “Base: “, $p->header(‘Content-Base’), “\n”;
# to access
print “Content type:”, $p->header(‘Content-Type’), “\n”;
# to access
print “Author:”, $p->header(‘X-Meta-Author’), “\n”;
print Dumper($p->header), “\n”;
__DATA__
可以看出它不能解析出 script、link、style 这样的标签。
HTML::TableExtractHTML::TableExtract 只能从 html 中提取出 table 里的内容。如果只要这个,那么这个模块是很容易使用的。
use HTML::TableExtract;
use Data::Dumper qw(Dumper);
my $html_string = join(“”,
);
$te = HTML::TableExtract->new();
$te->parse($html_string);
print Dumper($te), “\n”;
foreach $ts ($te->tables) {
print “Table (“, join(‘,’, $ts->coords), “):\n”;
foreach $row ($ts->rows) {
print join(‘,’, @$row), “\n”;
}
}
__DATA__
由这个例子可以看出,解析后链接信息都丢失了。但是表格里的内容是很容易得到的。
Tags: html , perl
12月 29th, 2009
东木
使用perl实现网页抓取,对网络蜘蛛的初步尝试。
环境
windows xp,IIS,perl 5.88,CMD
使用到的模块
use LWP::Simple; 用来得到网页
use HTML::HeadParser; 对部分进行解析,得到标题、编码、关键词等
use HTML::FormatText::WithLinks; 将html变成文本可读样式
use Encode qw/encode decode/; 解决不同网页的编码问题
需求
在CMD中调试,最后IIS中调用,解析结果要保存到数据库中,数据库中采用utf8编码,解析的网页为gb2312编码,所以理清编码特别重要。
关于编码首先应该弄清楚的概念
Perl字符串是使用utf8编码的,也就是说读进perl的字符的编码格式都是utf8;
读取输入时,perl会自动将其转换为urf8,输出时的编码依据运行环境已经上下游环境。
乱码问题
脚本使用ANSI编码,只是数据库的内容使用decode,结果内容有个别字符乱码 ,是HTML::FormatText::WithLinks; 将html变成文本可读样式时出现问题。可以算是一个bug
解决方法
脚本实用utf8编码,得到的网页首先进行decode,再进行其他的处理,问题解决,但在cmd下调试的时候,会有“Wide character in print”警告信息,因为环境是gbk,输出urt8编码是会报警,使用encode(”euc-cn”, $value),对输出进行转义,可以解决这个问题,而网上说的加 use encoding “utf-8″; 不能解决这个问题。
其他需要注意的问题
调用匹配的内容再去匹配其他内容时,注意对该内容的元字符进行转义;
入库的内容也要进行转义;
遗留问题 :IIS对perl的支持,配置没有问题,增加了对.pl、.cgi的定义,测试时发现在IE下正常,在firefox下弹出保存文件的对话框,但是以前的.pl正常。估计于haed的输出有关系,还有待于进一步的测试。
encode、decode函数说明
encode函数 是用来编码Perl字符串的。它将Perl字符串中的字符用指定的编码格式编码,最终转化为字节流的形式,因此和Perl处理环境之外的事物打交道经常需要它。
其格式很简单:
$octets = encode(ENCODING, $string [, CHECK])
$string: Perl字符串
encoding: 是给定的编码方式
$octets: 是编码之后的字节流
check: 表示转换时如何处理畸变字符(也就是Perl认不出来的字符)。一般不需使用
decode函数 则是用来解码字节流的。它按照你给出的编码格式解释给定的字节流,将其转化为使用utf8编码的Perl字符串,一般来说从终端或者文件取得的文本数据都应该用decode转换为Perl字符串的形式。它的格式为:
$string = decode(ENCODING, $octets [, CHECK])
$string、ENCODING、$octets和CHECK的含义同上。
明白如何使用该函数的例子:
use Encode;
$dat="测试文本";
$str=decode("gb2312",$dat);
@chars=split //,$str;
foreach $char (@chars) {
print encode("gb2312",$char),"\n";
}
Tags: perl
12月 29th, 2009
东木
CPAN(Comprehensive Perl Archive Network)是internet上Perl模块最大的集散地,包含了现今公布的几乎所有的perl模块。网址:http://www.cpan.org/
而http://search.cpan.org/,可以查找任何一个模块并提供下载
Linux/Unix—perl模块的安装方法
Linux/Unix下安装Perl模块有两种方法:手工安装和自动安装。第一种方法是从CPAN上下载您需要的模块,手工编译、安装。第二种方法是联上internet,使用一个叫做CPAN的模块自动完成下载、编译、安装的全过程。
A. 手工安装
从CPAN下载了安装模块的压缩文件,假设放在/usr/local/src(一般需要编译安装的软件,都放在此目录下安装)。
1. cd /usr/local/src
2. tar xvzf x.x.tar.gz
3. cd x.x
4. perl Makefile.PL (生成makefile)
5. make (建立模块)&& make test (测试模块)
如果测试结果报告“all test ok”,您就可以放心地安装编译好的模块了。
6. make install
注意:上述步骤适合于Linux/Unix下绝大多数的Perl模块。可能还有少数模块的安装方法略有差别,安装前,先看一下目录里的README或INSTALL。
B. 自动安装:
安装前需要先联上线,并且您需要取得root权限。
perl -MCPAN -e shell
初次运行CPAN时需要做一些设置,如果您的机器是直接与internet相联(拨号上网、专线,etc.),那么一路回车就行了,只需要在最后选一个离您最近的CPAN镜像站点。
cpan>h (获得帮助)
cpan>m (列出CPAN上所有模块的列表)
cpan>install module_name (自动完成从下载到安装的全过程。)
cpan>q (安装完,后退出)
常用模块:
(1) Net::FTP
(2) Net::Telnet
(3) LWP::Simple, get()
(4) Expect
(5) XML::Simple, XMLin()
(6) Data::Dumper, Dumper()
(7) IO::Socket
(8) Date::Manip, DateCalc(), UnixDate()
(9) Date::Manip, Date_Cmp()
(10) File::Find, find()
(11) ExtUtils::Installed, new(), modules(), version()
(12) DBI, connect(), prepare(), execute(), fetchrow_array()
(13) Getopt::Std
(14) Proc::ProcessTable
(15) Shell
(16) Time::HiRes, sleep(), time()
(17) HTML::LinkExtor, links(), parse_file()
(18) Net::Telnet, open(), print(), getline()
(19) Compress::Zlib, gzopen(), gzreadline(), gzclose()
(20) Net::POP3, login(), list(), get()
(21) Term::ANSIColor
(22) Date::Calc Calendar(), Today()
(23) Term::Cap, Tgetend(), Tgoto, Tputs()
(24) HTTPD::Log::Filter
(25) Net::LDAP
(26) Net::SMTP mail(), to(), data(), datasend(), auth()
(27) MIME::Base64, encode_base64(), decode_base64()
(28) Net::IMAP::Simple, login(), mailboxes(), select(), get()…
(29) Bio::DB::GenBank, Bio::SeqIO
(30) Spreadsheet::ParseExcel
(31) Text::CSV_XS, parse(), fields(), error_input()
(32) Benchmark
了解这些模块功能以及具体使用方法,可以去http://search.cpan.org/ 查看。
Tags: CPAN , perl
12月 29th, 2009
东木
perl自带的函数远不及php多,但功能确实很强大,实现起来也只有几行代码。
perl中的目录操作函数有:
1。mkdir 函数
调用语法:mkdir (dirname, permisions)
dirname:将要创建的目录名,可以为字符串或表达式。
permisions:八进制数,指定目录的访问权限。其值和意义如下:
权限值 权限
4000 运行时设置用户 ID
2000 运行时设置组 ID
1000 粘贴位
0400 拥有者读权限
0200 拥有者写权限
0100 拥有者执行权限
0040 组读权限
0020 组写权限
0010 组执行权限
0004 所有人读权限
0002 所有人写权限
0001 所有人执行权限
2。chdir 函数
调用语法:chdir (dirname)
3。opendir 函数
调用语法:opendir (dirvar, dirname)
dirvar:目录句柄,与文件句柄类似
dirname:目录名,可为字符串或表达式
调用成功返回真,否则返回假
4。closedir 函数
调用语法:closedir (mydir)
5。readdir 函数
调用语法:readdir (mydir)
6。telldir 函数
调用语法:location = telldir (mydir)
返回当前所在目录
7。seekdir 函数
调用语法:seekdir (mydir, location)
location必须为telldir 函数返回的值
8。rewinddir 函数
调用语法:rewinddir (mydir)
9。rmdir 函数
调用语法:rmdir (dirname)
程序代码:
#!/usr/bin/perl
sub listdir { my @arr, $j = 0;
for($i=0;$i<=$#_;$i++) {
if(-d $_[$i]) {
if(opendir($handle, $_[$i])) {
while($dir = readdir($handle)) {
if(!($dir =~ m/^\.$/) and !($dir =~ m/^(\.\.)$/)) {
print "$dir";
if(-d $_[$i]."\\$dir") {
$arr[$j++] = $_[$i]."\\$dir";
print "\t[DIR]"
}
print "\n";
}
}
closedir($handle);
}
}
}
if($j>0) {
listdir (@arr);
}
}
listdir “D:\\download”;
Tags: perl
12月 28th, 2009
东木
注册过程:
源文件:
G-Alarm2.3V.cab 安装包一个
galarm_KeyGen.exe注册机一个
注册方法:
在手机上,开始--设置--个人--主人信息--姓名--Jxxx
开始--设置--系统---个人--设备ID--设备标识--Jxxx
注意:名字的第一个字母是否大写,我发现设备ID那会自动为大写。。
然后在电脑上打开注册机,在OwnerID中输入Jxxx,得到值0B4SF6285xxx。
到程序中打开G_Alarm,然后将注册值输入注册即可。。
Tags: G-Alarm
12月 18th, 2009
东木
xmarks的在线书签居然不能用了,老是”problem syncing”,“网络超时错误”,下面介绍几个解决方法。
1 修改 HOSTS
将以下内容手工添加至C:WindowsSystem32etc的hosts文件里(linux在/etc)
64.147.188.86 www.xmarks.com 64.147.188.92 api.xmarks.com 64.147.188.89 login.xmarks.com 64.147.188.87 sync.xmarks.com 64.147.188.86 static.xmarks.com 64.147.188.86 download.xmarks.com 64.147.188.86 my.xmarks.com
如果还不行的话,左键点击 Xmarks 的图标,弹出设置菜单,选择“高级”,加密那个下拉框里面选择“全部加密”,再同步就成功了。
这个只是暂时性的解决,如果墙继续动一下的话可能就失效了,有FTP服务器的朋友 可以考虑将XMarks的书签同步到自己的服务器去。
2 搭建自己的xmarks服务器
如果你有自己的虚拟主机或服务器的话,就可以使用xmarks的“使用自己的服务器”功能,方法如下:
用FTP在网站根目录创建一个文件夹(如:xmarks),用来存放xmarks的书签数据。
打开xmarks的“设置”窗口,“把Status”中的用户名和密码改成你的FTP的用户名和密码。
进入“高级”,选中“使用自己的服务器”,然后
“地址”里填:ftp://你的服务器IP/xmarks/xmarks.json
“Password URL”里填:ftp://你的服务器IP/xmarks/passwords.json
点击“手动覆盖”区域里“强制覆盖服务器书签”后面的“上传”,xmarks将自动通过FTP把书签数据保存到你的服务器空间中。
如果你没有自己的服务器,推荐你用下面的比较稳定的免费空间:
http://www.v3host.be
http://www.cwahi.net
http://www.website.org
3 使用Weave Sync插件 https://services.mozilla.com/
这是由Mozilla实验室 开发的一个Firefox同步插件,不仅能同步书签,还能同步Firefox中保存的密码、浏览历史、自动填表内容、Tab项和一些个人设置。
登陆时会要求你输入在第一步注册时使用的邮箱、密码。另外还会要求输入一个Encryption Passphrase用于数据的加密,你可以输入一句好记、有个性、有意义的短语,如果怕麻烦就设成和密码一样的吧。这个短语不能更改(不确定),请和密 码一样牢记它,因为在以后的登录中也需要输入。
4 使用Gmarks (对中文支持不好)
Gmarks 是一个基于Google Bookmarks的Firefox插件。
5 使用代理
很多地方都有相关的知识!!!
xmarks的在线书签居然不能用了,老是”problem syncing”,“网络超时错误”,下面介绍几个解决方法。
1 修改 HOSTS
将以下内容手工添加至C:WindowsSystem32etc的hosts文件里(linux在/etc)
64.147.188.86 www.xmarks.com 64.147.188.92 api.xmarks.com 64.147.188.89 login.xmarks.com 64.147.188.87 sync.xmarks.com 64.147.188.86 static.xmarks.com 64.147.188.86 download.xmarks.com 64.147.188.86 my.xmarks.com
如果还不行的话,左键点击 Xmarks 的图标,弹出设置菜单,选择“高级”,加密那个下拉框里面选择“全部加密”,再同步就成功了。
这个只是暂时性的解决,如果墙继续动一下的话可能就失效了,有FTP服务器的朋友 可以考虑将XMarks的书签同步到自己的服务器去。
2 搭建自己的xmarks服务器
如果你有自己的虚拟主机或服务器的话,就可以使用xmarks的“使用自己的服务器”功能,方法如下:
用FTP在网站根目录创建一个文件夹(如:xmarks),用来存放xmarks的书签数据。
打开xmarks的“设置”窗口,“把Status”中的用户名和密码改成你的FTP的用户名和密码。
进入“高级”,选中“使用自己的服务器”,然后
“地址”里填:ftp://你的服务器IP/xmarks/xmarks.json
“Password URL”里填:ftp://你的服务器IP/xmarks/passwords.json
点击“手动覆盖”区域里“强制覆盖服务器书签”后面的“上传”,xmarks将自动通过FTP把书签数据保存到你的服务器空间中。
如果你没有自己的服务器,推荐你用下面的比较稳定的免费空间:
http://www.v3host.be
http://www.cwahi.net
http://www.website.org
3 使用Weave Sync插件 https://services.mozilla.com/
这是由Mozilla实验室 开发的一个Firefox同步插件,不仅能同步书签,还能同步Firefox中保存的密码、浏览历史、自动填表内容、Tab项和一些个人设置。
登陆时会要求你输入在第一步注册时使用的邮箱、密码。另外还会要求输入一个Encryption Passphrase用于数据的加密,你可以输入一句好记、有个性、有意义的短语,如果怕麻烦就设成和密码一样的吧。这个短语不能更改(不确定),请和密 码一样牢记它,因为在以后的登录中也需要输入。
4 使用Gmarks (对中文支持不好)
Gmarks 是一个基于Google Bookmarks的Firefox插件。
5 使用代理
很多地方都有相关的知识!!!xmarks的在线书签居然不能用了,老是”problem syncing”,“网络超时错误”,下面介绍几个解决方法。
1 修改 HOSTS
将以下内容手工添加至C:WindowsSystem32etc的hosts文件里(linux在/etc)
64.147.188.86 www.xmarks.com 64.147.188.92 api.xmarks.com 64.147.188.89 login.xmarks.com 64.147.188.87 sync.xmarks.com 64.147.188.86 static.xmarks.com 64.147.188.86 download.xmarks.com 64.147.188.86 my.xmarks.com
如果还不行的话,左键点击 Xmarks 的图标,弹出设置菜单,选择“高级”,加密那个下拉框里面选择“全部加密”,再同步就成功了。
这个只是暂时性的解决,如果墙继续动一下的话可能就失效了,有FTP服务器的朋友 可以考虑将XMarks的书签同步到自己的服务器去。
2 搭建自己的xmarks服务器
如果你有自己的虚拟主机或服务器的话,就可以使用xmarks的“使用自己的服务器”功能,方法如下:
用FTP在网站根目录创建一个文件夹(如:xmarks),用来存放xmarks的书签数据。
打开xmarks的“设置”窗口,“把Status”中的用户名和密码改成你的FTP的用户名和密码。
进入“高级”,选中“使用自己的服务器”,然后
“地址”里填:ftp://你的服务器IP/xmarks/xmarks.json
“Password URL”里填:ftp://你的服务器IP/xmarks/passwords.json
点击“手动覆盖”区域里“强制覆盖服务器书签”后面的“上传”,xmarks将自动通过FTP把书签数据保存到你的服务器空间中。
如果你没有自己的服务器,推荐你用下面的比较稳定的免费空间:
http://www.v3host.be
http://www.cwahi.net
http://www.website.org
3 使用Weave Sync插件 https://services.mozilla.com/
这是由Mozilla实验室 开发的一个Firefox同步插件,不仅能同步书签,还能同步Firefox中保存的密码、浏览历史、自动填表内容、Tab项和一些个人设置。
登陆时会要求你输入在第一步注册时使用的邮箱、密码。另外还会要求输入一个Encryption Passphrase用于数据的加密,你可以输入一句好记、有个性、有意义的短语,如果怕麻烦就设成和密码一样的吧。这个短语不能更改(不确定),请和密 码一样牢记它,因为在以后的登录中也需要输入。
4 使用Gmarks (对中文支持不好)
Gmarks 是一个基于Google Bookmarks的Firefox插件。
5 使用代理
很多地方都有相关的知识!!!
Tags: xmarks
12月 3rd, 2009
东木