discuz mysql 数据库编码转换latin1->utf8[ZT]

帮朋友的论坛做了一次编码转换的工作。系统是windows 2003,mysql4.1 discuz 5
本来以为很简单,dump数据
mysqldump -u root -p –opt –default-character-set=latin1 \
–skip-set-charset olddb cdb_members > d:\bak\cdb_members.sql
出来,用工具转一下编码,然后再导入
mysql -u root -p –default-character-set=utf8 newdb < d:\bak\cdb_members.sql

实际操作并没有想象的那么简单,最后解决的方案,也不是那么复杂。

先说一下教训,建立数据库的时候,同一个应用,所有的编码一定要一致, 不然就是自寻烦恼,现在跟你说,你肯定说不好,但是有时候就是不注意。要迁移的这个论坛就有两种编码gbk和latin1,目标是迁移到utf8,里面 gbk的双字节数据全部是乱码,尝试改编码也读不出数据了,由于不是重要数据,后来就放弃转码了,据说原来就有乱码的问题。
里面还遇到一个问题就是老的数据是更改过的,目标db是全新安装的,表结构不一致,好在新系统是老系统的子集,那么我就以老表为参照物,来改新db的表结构。

导出用了mysqldump,这里要提的是–default-character-set,后边要跟数据表的编码,不然导出的数据可能会乱码。
问题出在import,转编码后import,怎么也不成功,说什么mysql数据库gone away或者说duplicate,突然又一次成功,一看是因为建表语句的编码设置没有修改成utf8。
转编码用的ultraedit的转换功能,后来怀疑ultraedit的转换出错,网上找了一个win版本的iconv装上
iconv -f ISO-8859-1 -t UTF-8 original.txt> newfile.txt
问题依旧.其中有几个小表,直接用导出的sql粘贴到phpmyadmin里运行就可以了,但是会员和帖子表肯定不能用这个办法。
还试用了把latin1的表修改字符,然后试图用convert转码
update cdb_members set username=CONVERT(username USING utf8),也没成功
后来当我一筹莫展准备缴械的时候,想起了另外两个功能
SELECT INTO OUTFILE

LOAD DATA INFILE
是另外一种导入导出的方法。贴出使用的sq

SELECT
uid,
nickname,
site,
alipay,
icq,
qq,
yahoo,
msn,
taobao,
location,
customstatus,
medals,
avatar,
avatarwidth,
avatarheight,
bio,
signature,
sightml,
ignorepm,
groupterms,
authstr INTO OUTFILE ‘d:/cdb_memberfields.txt’
FIELDS TERMINATED BY “,”
OPTIONALLY ENCLOSED BY “”””
LINES TERMINATED BY “\r\n”
FROM gench2.cdb_memberfields;

然后转换’d:/cdb_memberfields.txt’ 的编码为utf8,可以用ultraedit或者iconv,然后load到新数据库的表
LOAD DATA INFILE ‘d:/cdb_memberfields.txt’ INTO TABLE cdb_memberfields
FIELDS TERMINATED BY “,”
OPTIONALLY ENCLOSED BY “”””
LINES TERMINATED BY “\r\n”;

上面还有一个问题是TERMINATED,ENCLOSED的选取,如果选的不对,会load失败。

附1:共迁移了如下表
cdb_attachments
cdb_forums
cdb_memberfields
cdb_members
cdb_onlinetime
cdb_posts
cdb_threads

附2:google到的链接

http://gentoo-wiki.com/TIP_Convert_latin1_to_UTF-8_in_MySQL

解决Firefox3下Flashgot的”AddRef”问题

Firefox3通过Flashgot插件调用调用迅雷(去广告的)时出现了AddRef的问题,即下载对话框如下:

19lou.com

Firefox3_Flashgot_AddRef

捣鼓了一把,发现解决方案如下:

1. 使用Firefox3打开about:config页面(即在地址栏中输入about:config后回车);
2. 找到flashgot.autoReferrer项,将其值改为false,问题就搞定了。

DD-WRT版本说明

Micro (最小版) 只能用于2MB FLASH

Mini (迷你版) 可用于4MB FLASH

Standard (STD标准版) 可用于4MB FLASH

VOIP (带VOIP功能版)

Mega (完整版) 只能用在8MB FLASH

其他可以不用管. 还有就是NEWD(新驱动)和VINT(旧驱动)之分.

cmd下输入:
1) telnet 192.168.1.1
2) 输入用户名和密码
3) nvram show|grep corerev

如果显示
wl0_corerev=4
则一定要使用 VINT 版

如果显示
wl0_corerev >=5 <=7
则 VINT 版 和 NEWD 版都可用,建议使用 VINT 版

如果显示
wl0_corerev >=8
则 VINT 版 和 NEWD 版都可用

如果显示
wl0_corerev >9
则一定要使用 NEWD 版

outlook 找不到 Outlook.pst

在DOS下,用CD 切换到 Outlook.exe 可执行文件目录下(安装目录如:C:\Program Files\Microsoft Office\OFFICE11)

使用命令 outlook /importprf .\.prf 进行初始化 Outlook 数据文件。

取其一界面(很熟悉的)(初安装 Outlook 启动时,需要新建一电子邮件帐户界面)

如何实现字符串不足N位自动补零

文本中有如下一列:
1
2
3
4
……
100
我想把它输出为:
0001
0002
0003
0004
……
0100

就是不足4位的前面补0

awk '{printf("%04d\n",$0);}' filename

使用iptables开放指定端口

例如: 开放80port
vi /etc/sysconfig/iptables
加入此行:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p --dport 80 -j ACCEPT

指定IP访问指定端口
-A RH-Firewall-1-INPUT -s 192.168.1.1 -p tcp -m state --state NEW -m tcp --dport 9201 -j ACCEPT

示例:
1 限制连往本机的telnet单个IP并发连接为2个,超过的连接被拒绝:
iptables -I INPUT -p tcp --dport 23 -m iplimit --iplimit-above 2 -j REJECT

2 限制连往本机的web服务,1个C段的IP的并发连接不超过100个,超过的被拒绝:
iptables -I INPUT -p tcp --dport 80 -m iplimit --iplimit-above 100 --iplimit-mask 24 -j REJECT

urchin的安装及使用

Urchin是google收购的一个日志分析工具。界面跟google analytics是几乎完全一样的。但是google analytics每个月的统计只能在500W PV以内,这个对于稍微有点规模的网站是不可忍受的。所以我们还是需要自己来架设一个urchin 首先需要下载一个urchin6600_linux2.6_kernel.tar.gz 这个是根据自己monitor的系统版本来进行确定的。然后还需要有一个mysql或者postgresql 创建相应的数据库和数据库用户。这里数据库名为urchin,数据库账户为urchin,urchin的账户密码为urchinapassword, urchin账户拥有urchin库的all权限。

root@urchin# mysql -u root -p
mysql> create database urchin character set utf8;
mysql> GRANT ALL ON urchin.* to 'urchin'@'localhost' IDENTIFIED BY 'urchinpassword';

接着使用程序目录下的install.sh脚本进行安装,这里主要是选择安装目录,数据库配置连接等等。

./install.sh

安装时,如果MYSQL Server为localhost时,SQL Socket path路径可能为/var/lib/mysql/mysql.sock 、/tmp/mysql.sock 根据实际情况填写。如果MYSQL Server为远程服务器,填写地址后,则需填写SQL Port。

安装完成后就可以通过下列网址查看urchin。

http://yourserver:9999

修改admin用户的密码,默认密码为:urchin

/usr/local/urchin/util/uconf-manager table=uusers action=update ucus_name="admin" ucus_password="123456" key1=ucus_name print=status
这里是把admin用户的密码设置为123456

这样我们就能通过上面的网站看到urchin的界面了。

其他配置:

首先需要一个域名下放置urchin.js这个js代码。这个代码需要修改如下部分。

//-- UTM User Settings
var _udn="micronsky.com"; //这个是你网站一级目录
var _ugifpath="http://track.micronsky.com/__utm.gif"; //__utm.gif的地址

track.micronsky.com 这个最好是独立的域名,这样urchin就不会分析这个域名内其他不相关的日志了。

__utm.gif和urchin.js都在安装文件中存在,根据上面的建议进行修改和放置。

PS:如果你希望直接放在当前域名下,需要apache对于gif这类请求只记录__utm.gif,配置时加上 SetEnvIf Request_URI “^((?!__utm).)*\.gif$” dontlog ,当前当前域名don’t log所配置的内容。

关于日志配置:

默认nginx的日志格式,urchin是无法进行分析的。还必须要做相应的修改后urchin才能进行分析。
log_format urchin '$remote_addr $http_host - [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_cookie"';

默认Apache的日志格式,需要在LogFormat中再添加一中格式定义,或者在原有的combined格式中追加%{Cookie}i 。
LogFormat "%h %v %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\"" urchin

新建配置:

Urchin默认是英文界面,可以在显示中选择中文。基本设置如下:

urchin的原理:就是在所有的页面都会嵌入这个urchin.js来访问那个__utm.gif图片,通过这个来收集用户本地的相关信息来记录到gif图片域名下的日志中,然后urchin就来分析这个日志,所以这个分析结果的内容会比一般的多。

Urchin 参数

Google Analytics 原理与实例分析[zt]

最近在做Web统计相关的工作,在查资料的同时,顺手找到了GA的原理分析:)

# 发统计包

GET http://www.google-analytics.com/__utm.gif?utmwv=1&utmn=1261523910&utmcs=gb2312&utmsr=1400×1050&utmsc=32-bit&utmul=en-us&utmje=1&utmfl=-&utmhn=www.mydll.com&utmr=-&utmp=/gg.htm&utmac=UA-2789145-1&utmcc=__utma%3D251296922.1430927915.1192194210.1192194210.1192194210.1%3B%2B__utmb%3D251296922%3B%2B__utmc%3D251296922%3B%2B__utmz%3D251296922.1192194210.1.1.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)%3B%2B HTTP/1.1
Accept: */*
Referer: http://www.mydll.com/gg.htm
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Connection: Keep-Alive
Host: www.google-analytics.com
Pragma: no-cache

HTTP/1.1 200 OK
Pragma: no-cache
Cache-Control: private, no-cache, no-cache=”Set-Cookie”, proxy-revalidate
Expires: Fri, 04 Aug 1978 12:00:00 GMT
Content-Type: image/gif
Server: ucfe
Content-Length: 35
Date: Fri, 12 Oct 2007 13:04:04 GMT
Via: 1.1 HttpSpy

# 发出统计的请求详细分析

http://www.google-analytics.com/__utm.gif?

utmwv=1& # 常量 1
utmn=1261523910& # Math.round(Math.random()*2147483647);
utmcs=gb2312& # charset
utmsr=1400×1050& # screen
utmsc=32-bit& # screen.colorDepth
utmul=en-us& # navigator.language.toLowerCase();
utmje=1& # navigator.javaEnabled() ? 1 : 0;
utmfl=-& # _uFlash
utmhn=www.mydll.com& # JsUrlEncode(location.hostname)
utmr=-& # document.referrer
utmp=/gg.htm& # location.pathname+location.search; 或者优先是 用户输入的 page 页面
utmac=UA-2789145-1& # 站点ID,用户输入的 _uacct = “UA-2789145-1″;
utmcc=__utma%3D251296922.1430927915.1192194210.1192194210.1192194210.1%3B%2B__utmb%3D251296922%3B%2B__utmc%3D251296922%3B%2B__utmz%3D251296922.1192194210.1.1.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)%3B%2B
utmcc=__utma=251296922.1430927915.1192194210.1192194210.1192194210.1;+__utmb=251296922;+__utmc=251296922;+__utmz=251296922.1192194210.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none);+
utmcc=
__utma=251296922.1430927915.1192194210.1192194210.1192194210.1;+
__utmb=251296922;+
__utmc=251296922;+
__utmz=251296922.1192194210.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none);+
其中的 251296922 是根据当前页面的根域名计算出来的 HASH 值,例如本次请求是用 mydll.com 计算出来的值 251296922
__utma 的第二个数值 1430927915 是随机数字,用函数 Math.round(Math.random()*2147483647) 生成出来的
__utma 的第三、四、五个数值 1192194210 是随机数字,是用函数 _ust=Math.round((new Date()).getTime()/1000); 计算出来的
__utma 的第六个数值 1 是固定的常量
__utmz 的第一个数是域名的 HASH 值
__utmz 的第二个数值 1192194210 是随机数字,是用函数 _ust=Math.round((new Date()).getTime()/1000); 计算出来的
__utmz 的第三个数值 1 其实就是 __utma 的第六个固定常量
__utmz 的第四个数值 1 在第一次请求的时候是 1,我们就暂时不考虑第二次的请求
__utmz 的最后一个参数 utmccn=(direct)|utmcsr=(direct)|utmcmd=(none) 是表示来源等信息,默认就是这个

当链接是从其他网站点入时,其 __utmz 参数如下:
__utmz=251296922.1192220231.1.1.utmccn=(referral)|utmcsr=yx8.com|utmcct=/temp/togg.html|utmcmd=referral;+
utmccn – 的值表示有来源
utmcsr – 表示来源的跟域名
utmcct – 表示来源页面的 PATH
utmcmd – 表示一个命令好像,这里设置了 referral,可能是为了配合签名的

# 外部链接导入包

GET http://www.google-analytics.com/__utm.gif?utmwv=1&utmn=1389663121&utmcs=gb2312&utmsr=1400×1050&utmsc=32-bit&utmul=en-us&utmje=1&utmfl=-&utmcn=1&utmhn=www.mydll.com&utmr=http://www.yx8.com/temp/togg.html&utmp=/gg.htm&utmac=UA-2789145-1&utmcc=__utma%3D251296922.1389663121.1192220231.1192220231.1192220231.1%3B%2B__utmb%3D251296922%3B%2B__utmc%3D251296922%3B%2B__utmz%3D251296922.1192220231.1.1.utmccn%3D(referral)%7Cutmcsr%3Dyx8.com%7Cutmcct%3D%2Ftemp%2Ftogg.html%7Cutmcmd%3Dreferral%3B%2B HTTP/1.1
Accept: */*
Referer: http://www.mydll.com/gg.htm
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Connection: Keep-Alive
Host: www.google-analytics.com

HTTP/1.1 200 OK
Pragma: no-cache
Cache-Control: private, no-cache, no-cache=”Set-Cookie”, proxy-revalidate
Expires: Fri, 04 Aug 1978 12:00:00 GMT
Content-Type: image/gif
Server: ucfe
Content-Length: 35
Date: Fri, 12 Oct 2007 20:17:14 GMT
Via: 1.1 HttpSpy

# 参数分析

http://www.google-analytics.com/__utm.gif?

utmwv=1&
utmn=1389663121&
utmcs=gb2312&
utmsr=1400×1050&
utmsc=32-bit&
utmul=en-us&
utmje=1&
utmfl=-&
utmcn=1&
utmhn=www.mydll.com&
utmr=http://www.yx8.com/temp/togg.html&
utmp=/gg.htm&
utmac=UA-2789145-1&
utmcc=__utma%3D251296922.1389663121.1192220231.1192220231.1192220231.1%3B%2B__utmb%3D251296922%3B%2B__utmc%3D251296922%3B%2B__utmz%3D251296922.1192220231.1.1.utmccn%3D(referral)%7Cutmcsr%3Dyx8.com%7Cutmcct%3D%2Ftemp%2Ftogg.html%7Cutmcmd%3Dreferral%3B%2B
utmcc=__utma=251296922.1389663121.1192220231.1192220231.1192220231.1;+__utmb=251296922;+__utmc=251296922;+__utmz=251296922.1192220231.1.1.utmccn=(referral)|utmcsr=yx8.com|utmcct=/temp/togg.html|utmcmd=referral;+
utmcc=
__utma=251296922.1389663121.1192220231.1192220231.1192220231.1;+
__utmb=251296922;+
__utmc=251296922;+
__utmz=251296922.1192220231.1.1.utmccn=(referral)|utmcsr=yx8.com|utmcct=/temp/togg.html|utmcmd=referral;+

# 再次刷新页面时发现 Cookie 已经设置上

GET http://www.mydll.com/51la.htm HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.mydll.com
Connection: Keep-Alive
Cookie: __utma=251296922.1389663121.1192220231.1192220231.1192220231.1; __utmb=251296922; __utmc=251296922; __utmz=251296922.1192220231.1.1.utmccn=(referral)|utmcsr=yx8.com|utmcct=/temp/togg.html|utmcmd=referral

一个很有用的apache指令SetEnvIf

SetEnv 指令

说明 设置环境变量
语法 SetEnv env-variable value

SetEnvIf 指令

说明 根据客户端请求属性设置环境变量
语法 SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...
作用域 server config, virtual host, directory, .htaccess

SetEnvIf指令根据客户端的请求属性设置环境变量。第一个参数attribute必须是下列三种类别之一:

  1. 一个HTTP请求头域(参见RFC2616);例如:Host, User-Agent, Referer, Accept-Language 。可以用一个正则表达式来进行匹配。
  2. 下列请求属性之一:
    • Remote_Host 远程主机名(若可用)
    • Remote_Addr 远程主机IP地址
    • Server_Addr 接收到请求的服务器IP地址(2.0.43及以后版本)
    • Request_Method 所用的请求方法(GET, POST等等)
    • Request_Protocol 请求所使用的协议及其版本(“HTTP/0.9″, “HTTP/1.0″, “HTTP/1.1″等)
    • Request_URI 在HTTP请求行中请求的资源(通常是URL中去除协议、主机以及查询字符串后剩余的部分)。
  3. 列出的与该请求关联的环境变量名字中的一个。这将允许SetEnvIf指令基于预先匹配的结果进行测试。只有那些由较早的SetEnvIf[NoCase]指令定义的环境变量才可以按照这种方式测试。”较早的”意思是它们在更上层的作用域(比如全局范围)中被定义或者在同一作用域中较早出现。只有在请求的属性未能得到匹配并且attribute没有使用正则表达式的时候,环境变量才会被考虑。

如:不记录192.168.7.139的访问日志
首先设置环境变量 SetEnvIf Remote_Addr “192\.168\.7\.139″ dontlog
使用上面设置的环境变量
CustomLog “logs/access_log” common env=!dontlog

SetEnvIfNoCase
说明: Sets environment variables based on attributes of the request without respect to case
语法: SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] …
上下文: 服务器配置, 虚拟主机, 目录, .htaccess
覆盖项: FileInfo
状态: Base
模块: mod_setenvif
兼容性: Apache 1.3 and above

The SetEnvIfNoCase is semantically identical to the SetEnvIf directive, and differs only in that the regular expression matching is performed in a case-insensitive manner. For example:
SetEnvIfNoCase Host Apache\.Org site=apache
This will cause the site environment variable to be set to “apache” if the HTTP request header field Host: was included and contained Apache.Org, apache.org, or any other combination.
SetEnvIfNoCase 当满足某个条件时,为变量赋值,一般结合其他指令使用。
如:
1。SetEnvIf Request_URI “/logo(.)+” local_ref=0
Allow from env=local_ref  当local_ref有值时,可以访问。
2。SetEnvIfNoCase Request_URI .js$ useless-file
CustomLog logs/hebgc.com/access.log combined env=!useless-file
当满足条件时才记录日志。

VirtualBox 使用主机网络上网的配置[zt]

当VirtualBox 2.1.4升级到2.2.0以后,突然发现虚拟的系统无法使用主机的网络上网了,google了一下,发现很多人碰到这个问题,但没有解决办法,甚至有人认为是VirtualBox的Bug,其实不然。
经过研究发现,2.2.0缺省的不再是Bridge Network方式了,改为NAT,那么我们自己将网络修改回原来2.1.4的桥接方式就可以了。

1 首先,用鼠标右键点击“网上邻居”,选择“属性”;

图1

2 右键选择VirtualBox的host-only网络链接,选择“属性”;

图2

3 缺省的,“VirtualBox Bridged Networking Driver”是没有选中的,选中它,点击“确定”。这时候,会提示安装网络设备;

图3

4 不要管提示的内容,点击“仍然继续”。完成后,VirtualBox网络连接重新获取IP地址,图表显示为图4

5 启动VirtualBox,右键选择要修改的虚拟系统,并点击“设置”。

图5

6 点击左侧列表中的“网络”选项,可以看到“连接方式”的下拉列表里有好几个选项,默认是NAT,将之改为“Bridge Network”,并点击后面的螺丝刀图标;

图6

7 新弹出“桥接网络详情”窗口,如下:

图7

选择你的本地网络的网卡名称,我的是“Intel(R) 82566DM-2 Gigabit Network Connection”,你的可能不同,记住,不是“VirtualBox Host-only Ethernet Adapter”;如果下面的“Guest MAC Address”为空,点击后面的刷新按钮,随机指定一个MAC地址,点击“OK”按钮即可。

8 点击“<虚拟机系统名> 设置”窗口的“OK”按钮,以保存配置,启动虚拟操作系统,看看是不是可以上网了?