msgbartop
很傻很天真的程序员
msgbarbottom

10 十 10 MySQL数据表分析及优化

分析表

ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name]

本语句用来分析表的状态,在分析期间,使用一个读取锁对表进行锁定。该语句仅对MyISAM, BDB和InnoDB表有作用。对于MyISAM表,本语句相当于使用myisamchk -a的效果。

mysql> analyze table a;
+——–+———+———-+—————————–+
| Table  | Op      | Msg_type | Msg_text                    |
+——–+———+———-+—————————–+
| test.a | analyze | status     | OK                                   |
+——–+———+———-+—————————–+
1 row in set (0.00 sec)

优化表

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] 

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。
在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。
对于MyISAM表,OPTIMIZE TABLE按如下方式操作:
如果表已经删除或分解了行,则修复表。
如果未对索引页进行分类,则进行分类。
如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新。

mysql> OPTIMIZE table a;
+——–+———-+———-+—————————–+
| Table  | Op       | Msg_type | Msg_text                    |
+——–+———-+———-+—————————–+
| test.a | optimize | status   | OK                                 | 
+——–+———-+———-+—————————–+
1 row in set (0.00 sec)

注意:无论是ANALYZE还是OPTIMIZE在执行期间将对表进行锁定,因此请注意这些操作要在数据库不繁忙的时候

09 十 10 java unicode字符操作源码

百度加Google查找unicode字符操作方法,翻了好几页,总是找到不合适的源码或实例。没有办法,自己写吧!

需求:实现汉字字符转换成unicode,unicode恢复还原汉字字符

[code]

public class UnicodeUtil {

/**
* unicode字符恢复
* @param unicode
* @return 转换成功的字符
*/
public static String unicode2Char(String unicode) {
int len = unicode.length();
StringBuffer chinese = new StringBuffer(len);
char tmp;
for(int index=0;index<len;){
tmp = unicode.charAt(index++);
if(tmp=='\\'){
tmp = unicode.charAt(index++);
if(tmp=='u'){
StringBuffer cTmp = new StringBuffer(4);
for(int i=0;i<4;i++){
tmp = unicode.charAt(index++);
cTmp.append(tmp);
}
chinese.append((char) Integer.parseInt(cTmp.toString(), 16));
}
}else{
chinese.append(tmp);
}
}
return chinese.toString();
}

/**
* 字符转换成unicode
* @param s
* @return unicode字符
*/
public static String char2Unicode(String s) {
StringBuffer unicode = new StringBuffer();
for(char c:s.toCharArray()){
if(c>128){
unicode.append("\\u").append(Integer.toHexString(c));
}else{
unicode.append(c);
}
}
return unicode.toString();
}
}

[/code]

27 九 10 servlet2.5也能用HttpOnly

出来混的,安全很重要!!
收到安全部门的邮件,登录功能存在xss安全漏洞,简单点说就是敏感数据可以被js脚本读到。要用设定cookie的HttpOnly属性,才能降低这种安全风险。百度一下,google HttpOnly,大约描述如下:Servelt3.0有一项新特性,cookie的安全得到提升,提供了HttpOnly属性设置,似的cookie能够根据需要不被js读取。简单,不久在cookie保存的时候,设定一个属性吗?但是,Eclipse告诉我没有该属性。看了下,我用的jar杯具的发现,我们用的是Servlet2.5,不支持HttpOnly。继续google,纠结的是貌似大家实现HttpOnly用的都是Servelt3.0。那么我要实现HttpOnly面临着就是升级Servlet的版本,麻烦接踵而至,Servlet一般是和tomcat一起的,测试的工作量会很大。发现只有tomcat7是Servlet3.0的,现状是公司服务器上的tomcat大多是5的,它们还在等待升级成6呢。为了用HttpOnly升级tomcat到7明显不可能,那么只能另寻它途。在网上看到有tx,介绍可以通过直接写header的方式来保存cookie实现HttpOnly,那么说干就干。第一步先把cookie格式化成一个cookie标准的字符串如(“uc=kbtiao;domain=sina.com.cn;path=/;maxAge=-1;HttpOnly”),第二步通过设置header,response.setHeader(“Set-Cookie”, “uc=kbtiao;domain=sina.com.cn;path=/;maxAge=-1;HttpOnly”),就实现了cookie的HttpOnly。不信,你打开firecookie看看,是不是出现了HttpOnly。
大概的讲完了,下面为了凑字数复制了些关系HttpOnly的介绍:
HttpOnly是微软对cookie做的扩展,该值指定 Cookie 是否可通过客户端脚本访问, 解决用户的cookie可能被盗用的问题,减少跨站脚本攻击 主流的大多数浏览器(firefox,ie6,7,8)已经支持此属性。

20 九 10 一句话技巧

1、关于tomcat的一点事情
一直认为在eclipse上改掉tomcat的server.xml文件是可以直接生效的,昨天才发现必须得重新publish下才会生效,杯具了,希望有类似经历的tx不要犯相同的错误。
2、ubuntu下卸载wine
sudo aptitude purge wine (如果不存在aptitude则请先安装sudo apt-get install aptitude)
接着cd ~/.local/share/applications/;sudo rm -rf wine* 删除所有wine相关的东东,那么世界变得清净了
3、ubuntu远程连接到windows只要一句话
rdesktop 192.168.1.2(目标机器ip地址)
-f 全屏 -u 登录用户名 -p登录密码 更多参数查看man rdesktop
rdesktop -f -uadmin -p123456 192.168.1.2
4、通过重定向来达到ubuntu下不能配置tomcat80口的问题
iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 8080
5、产生一个0-32767的随机整数
echo $RANDOM
6、15分钟前的时间按yyyy-MM-dd HH:mm:ss显示
date -d ‘-15min’ ‘+%Y-%m-%d %T’

06 九 10 windows安装mongoDB

1:下载http://fastdl.mongodb.org/win32/mongodb-win32-i386-1.6.2.zip

2:将zip文件解压到一个目录,在这里我把它解压到E盘(E:\mongodb)

3:把mongodb的bin目录加到,windows系统的path(不是必须的)

4:打开cmd,输入mongo,看到了版本信息了,如果看到了,那么诸位恭喜你安装成功了
[code]
MongoDB shell version: 1.6.2
connecting to: test
Mon Sep 06 07:20:51 Error: couldn't connect to server 127.0.0.1} (anon):1137
exception: connect failed
[/code]

5:通过4的提示,我们可以看到报错信息,不急那是因为没有可以连接的服务。现在我们开始启动mongod服务,在cmd下输入
[java]
mongod.exe –dbpath=c:\db
[/java]
看到下面的内容了没,这就是服务启动后的提示,关于mongd的参数具体的还请看帮助
[code]
Mon Sep 06 07:26:35 MongoDB starting : pid=1944 port=27017 dbpath=c:\db 32-bit

** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data

** see http://blog.mongodb.org/post/137788967/32-bit-limitations

Mon Sep 06 07:26:35 db version v1.6.2, pdfile version 4.5
Mon Sep 06 07:26:35 git version: aef371ecf5d2a824f16ccdc3b745f3702165602f
Mon Sep 06 07:26:35 sys info: windows (5, 1, 2600, 2, 'Service Pack 3') BOOST_LI
B_VERSION=1_35
Mon Sep 06 07:26:35 [initandlisten] waiting for connections on port 27017
Mon Sep 06 07:26:35 [websvr] web admin interface listening on port 28017
[/code]

6:再新打开CMD输入:mongo,如果出现下面提示,那么您就可以开始mongo之旅了
[code]
MongoDB shell version: 1.6.2
connecting to: test
>
[/code]
今天的windows安装mongodb就到这里,具体使用及其他请听下回分解

01 九 10 p3p java实践

说干就干,要跨域,那么就要有两个域名,本机测试,只要指host就行了。host设置如下:
127.0.0.1 www.a.com
127.0.0.1 www.b.com
接着开始上代码:
http://www.b.com/b.jsp 通过js设置a的cookie
================
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%
response.addHeader("Cache-Control","no-cache");
response.addHeader("Expires","Thu,01 Jan 1970 00:00:01 GMT");
cookiev = "test";
%>

================
http://www.a.com/a_setcookie.jsp www.a.com下的cookie设置
================
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%
response.setHeader("P3P","CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");

String cookiev = request.getParameter("cookiev");
Cookie _cookie = new Cookie("test",cookiev );
_cookie.setMaxAge(30*60*100);
_cookie.setPath("/");
_cookie.setDomain(".a.com");
response.addCookie(_cookie);
%>
================
http://www.a.com/a_getcookie.jsp www.a.com下的cookie遍历
================
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%
Cookie cookies[]=request.getCookies();
Cookie sCookie = null;
if(cookies==null){
out.print("none any cookie");
}else{
out.println(cookies.length+"
“);
for(int i=0;i sCookie = cookies[i];
out.println("getVersion==>>>”+sCookie.getVersion()+”\n”);
out.println(“cookiename==>>>”+sCookie.getName()+”->cookievalue==>>>”+sCookie.getValue()+”
“);
}
}
%>
================
花絮:在firefox下可以不用设置response头的p3p申明,而ie是必须的。

01 九 10 p3p那点事情

P3P(Platform for Privacy Preferences Project),一种可以提供这种个人隐私保护策略,并且正在被越来越多的技术人员接受的新技术。 从技术上看,P3P包括了两个组件:一个放在服务器端;另外一个放在客户端,形成一个用户代理。当用户登陆网站的时候,服务器端的组件根据网站的要求,会自动生成XML语言形式的用户个人处理策略,这就像是贴在商店橱窗外的公众告示,而客户端的组件就将这个“公众告示”提供给用户。P3P是一个扩展语法和数据元集,它受RDF(Resource Description Framework,资源描述框架) 语言的规范。它允许用户通过浏览器与网站,通过临时或是成对的ID(TU ID/PU ID)进行协商,以明确可以透露哪些个人信息并且作何用途 。临时ID仅可以持续一个用户对话期,而成对的ID则可以维持多个对话期,这些ID并不带有辅助数据,而且不会被储存。 双方最终通过一个双向的选择达成用户个人隐私策略。P3P并不会使现有的PICS(Platform for Internet Content Selection因特网内容选择平台)标准失效,它仅仅是一个内容标记方案。RDF和XML目前虽然并未被PICS采用,但会在其未来的版本中派上用场。 (以上摘自百度百科)
个人理解,p3p就是允许写第三方cookie的协议,简言之就是跨域写cookie,当然这个还和客户端浏览器的设置有关。现有主流浏览器firefox和ie也有所不同。

30 八 10 Cookie的故事

Cookie指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。
Cookie由服务器端生成,发送给User-Agent(一般是浏览器),通常是浏览器将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。说到浏览器,就不得不提起浏览器家族的恩恩怨怨了。前端做开发的时候,为浏览器兼容苦恼着,后端又何尝不是呢。当我们在处理cookie是否注意过,ie和firefox的处理方式是不一样的。
那是某天晚上,俺在查一个bug,看了程序逻辑,貌似没有问题。俺质疑cookie存在问题,找到方向了,就开始挖据吧。不停的通过ie访问,firefox访问,观察彼此输出的cookie信息的内容。慢,貌似他们前期是相同的,当我进行过一次cookie重置后,貌似有所不同(重置:就是把cookie的maxAge=0)。firefox对maxAge的处理是当maxAge=0时,该cookie不在出现在cookie列表中,而ie是继续存在cookie列表中一个被重置的cookie值。这样就导致,我们在回复cookie是不但要判断cookie获取是否为空,还是判断cookie的内容是否为空了。呜呼哀哉,原来一直以为浏览器会影响前端,没有想到它对后端的影响也不少啊。

29 八 10 Firefox升级后cookie失效(丢失)的终极解决方案

每次升级Firefox,一些论坛的Cookie就会失效,需要重新登录。这是因为,很多论坛的Cookie是绑定User Agent的,一旦User Agent改变(Firefox每次升级,User Agent就会改变),Cookie就会失效。这个问题,可以通过固定Firefox的User Agent的方法解决这个问题,方法如下:
在地址栏输入 about:config 回车,然后在下面的窗口点击鼠标右键,选择“新建”->“字符串”,出来的对 话框中输入
[java]general.useragent.override[/java]
,按确定后,会让你输入刚才那个选项的值,也就是你 要设定的User Agent。比如,我的系统是Windows 2003,Firefox 是3.0b2pre,我指定的User Agent是:
[java]Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9) Gecko/Firefox/3.0[/java]
如果你用的是Firefox 2.0.0.x系列,Windows是XP,那么可以设成:
[java]Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1) Gecko/Firefox/2.0[/java]
这个修改立刻生效,从About对话框中就可以看的 出来。设定完后,可以到下面这个网页查看自己的 User Agent 设置的是否正确: http://www.useragentstring.com/
当然,做了上面的设定以后,因为User Agent改变了,所有绑定 User Agent 的论坛,都会要求你重新登录一次。不过,只要重新登录一次后,以后升级Firefox时就不用再登录了(除非你将原来的配置文件夹删除),cookie会 一直有效,直到真的过期为止。

21 八 10 慎用Html的DOCTYPE

话说我终于要把一个“旧”系统(比我的工龄还老)维护工作移交给一个新同事去做,但是日常的发布还是走的我流程。因需求方要求,我增加一个新的功能,反正熟门熟路,那个同事不在我就自己动手干吧。我用了一个以前写的时间控件,怎么折腾总是不能成功,看了一遍有一遍的代码,还是发现不了任何问题。同样的控件,同样的环境,同样的使用方法,就是不同的页面。感觉糗大了,本来以为很简单的东西 ,被我折腾了一两个小时。偶然的一眼,我发现了两个页面最大的不同之处,新的页面是有<!DOCTYPE> 声明的,老的页面是没有的。莫非这个就是罪魁祸首,说干就干,我动手把新页面上的<!DOCTYPE> 声明删除掉,没想到控件就可以用了。问题解决了,但是解决的有点莫名其妙,因为平时对html标准并不关注。于是,就开始baidu-google。以下是个人的一些小结:

1、<!DOCTYPE>不能随便用

2、为了兼容老的代码,<!DOCTYPE>还是不要轻易使用

3、俺们的老代码该升级换代了

注:<!DOCTYPE>位于文档中的最前面的位置,用于可告知浏览器文档使用哪种 HTML 或 XHTML 规范。该标签可声明三种 DTD 类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。

Analytics Plugin created by Web Hosting

普人特福的博客cnzz&51la for wordpress,cnzz for wordpress,51la for wordpress