400 Bad Request-Url特殊字符编码

今天碰到一个诡异的问题,线上系统没有问题可以访问,但在本机测试却不行。现象是在火狐访问空白页面,当时就蒙了啊,后来换ie则提示:400 Bad Request。
原来url中不允许出现特殊字符,比如:%
修改前url:http://index.youku.com/vr_keyword/id_6ZOB6KGA5L2%2f5ZG9&type=alldata
修改后url:http://index.youku.com/vr_keyword/id_6ZOB6KGA5L2%2f5ZG9&type=alldata
修改前代码:

var reg = new RegExp("\+", "g"); // 创建正则RegExp对象
var reg2 = new RegExp("\=", "g");
var reg3 = new RegExp("\/", "g");
basewords = basewords.replace(reg, "%2b");
basewords = basewords.replace(reg2, "%3d");
basewords = basewords.replace(reg3, "%2f");

修改后的代码:

var reg = new RegExp("\+", "g"); // 创建正则RegExp对象
var reg2 = new RegExp("\=", "g");
var reg3 = new RegExp("\/", "g");
basewords = basewords.replace(reg, "%252b");
basewords = basewords.replace(reg2, "%253d");
basewords = basewords.replace(reg3, "%252f");

PS:修改前url在线上是没有问题的,使用的resin服务器,但本机开发的tomcat却无法通过!估计处理机制有区别!
有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号。 编码的格式为:%加对应字符的ASCII(16进制)码值。例如:空格的编码值是”%20″ 。
一些URL特殊符号及编码(十六进制值)
1. + URL中+号表示空格 %2B
2. 空格 URL中的空格可以用+号或者编码 %20
3. / 分隔目录和子目录 %2F
4. ? 分隔实际的 URL 和参数 %3F
5. % 指定特殊字符 %25
6. # 表示书签 %23
7. & URL中指定的参数间的分隔符 %26
8. = URL中指定参数的值 %3D
java中URL的编码和解码函数: java.net.URLEncoder.encode(String s) java.net.URLDecoder.decode(String s);
javascript中URL的编码和解码函数: escape(String s) unescape(String s) ;
更详细资料:
http://www.cnblogs.com/leaven/archive/2012/07/12/2588746.html

MySQL手册已经悄悄移除了GPL许可证

刚刚引起我们注意的是 MySQL 的手册已经修改了授权许可证,这是从 MySQL 5.5.30 到 5.5.31 时做的改动,该改动影响源码包中的 man 文件夹里的所有页面。
老的手册遵循 GPLv2 许可证(MySQL 5.5.30 或者更早版本):
This documentation is free software; you can redistribute it and/or modify it only under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License.
而新的手册页面(MySQL 5.5.31 或者更新版本)则采用如下授权协议:
This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.
此举明显的显示出 Oracle 非常不友善的行为。新的许可证跟 GPL 差别巨大,并且明确表达不再使用 GPL 许可证。
oracle你这是要闹哪样啊???
 

利用hdfs搭建网盘–数据模型设计

先阐述下利用hdfs搭建网盘的思路:
(1)、首先要搭建hadoop集群,确保该集群正常运行
(2)、通过API访问文件到存储在hdfs中的文件,能对文件进行增删改查
(3)、文件的其他结构化信息,,比如:文件名称,上传时间,所属用户、文件类型等信息,需要存储在数据库里,我们使用mysql
(4)、用户需要通过操作界面来访问网盘系统,而不是直接操作hdfs,这里采用java、struts2框架来实现web端开发
(5)、有用户系统,存储用户相关信息,另外hdfs中文件存放的路径也和用户有直接关系
网盘系统的截图:http://pan.baidu.com/share/link?shareid=3253971941&uk=772112791
第一点已经在《Hadoop集群搭建详细简明教程》里详细写明步骤了,再次就不再提了
第二点已经在《利用HDFS java API增删改查操作》里详细阐述了
这篇文章先阐述下第三、第五点
网盘数据模型的设计,以及mysql在linux下的安装
网盘数据模型的设计:

file_info

file_info


user

user


tables

tables


目前只用到这file_ifno,user这两个表
mysql在linux:
我是在《Hadoop集群搭建详细简明教程》中搭建好的hadoopm主机上,通过yum安装的mysql,并设置mysql密码

yum install mysql
yum install mysql-server
yum install mysql-devel
chgrp -R mysql /var/lib/mysql
chmod -R 770 /var/lib/mysql
service mysqld start
mysql
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('secret_password');

PS:设置密码的时候可能会报错:ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number
可通过这个命令:select password(‘root’);得知root的 41-digit是什么
设置mysql开机启动:

chkconfig --levels 345 mysqld on

相关参考资料:
1、linux下安装mysql
2、设置用户
http://www.hackbase.com/tech/2011-09-09/65234.html
yum install mysql
http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/16/2214272.html
3、远程连接
http://www.cnblogs.com/smallstone/archive/2010/04/29/1723838.html
4、创建数据库–奇怪的问题:必须得使用特别奇怪的引号,否则不生效
http://tdcq.iteye.com/blog/363955
http://blog.sina.com.cn/s/blog_5dc960cd0100ea2h.html
5、在数据库上创建表
http://www.51cto.com/html/2005/1129/12524.htm
6、mysql中文乱码
http://www.2cto.com/database/201108/101151.html
7、修改表结构
http://database.51cto.com/art/201005/201148.htm
8、2007-07-20 10:59 在mysql中查询一个数据库中的所有表
http://hi.baidu.com/aigyoo/item/d56a8c01dcb50c10cd34eacf
9、mysql查看表结构命令
http://www.blogjava.net/etlan/archive/2007/07/12/129794.html

Linux配置IP

Linux配置IP
先执行命令:

ifconfig

如果没有ip,则通过配置文件进行ip配置。
执行命令:

cd /etc/sysconfig/network-scripts
vi ifcfg-eth0

将其修改为如下所示结果:

DEVICE="eth0"
NM_CONTROLLED="yes"
ONBOOT="yes"
IPADDR=172.21.34.1
NETMASK=255.255.252.0
GATEWAY=172.21.32.1

然后保存,重启网卡(service network restart)。
如果重启网卡报eth0 failed。
则执行以下操作:

ifconfig -a

如果显示的结果中有eth1,则接着执行:

cd /etc/sysconfig/network-scripts/
mv ifcfg-eth0 ifcfg-eth1
vi ifcfg-eth1

将其内容改为:

DEVICE="eth1"
NM_CONTROLLED="yes"
ONBOOT="yes"
IPADDR=172.21.34.1
NETMASK=255.255.252.0
GATEWAY=172.21.32.1

然后保存,接着重启网卡。

检测java方法执行时间

在方法开始处加上第一句
long a = System.currentTimeMillis();
在要监测的点加上下面这句:
System.out.println(“监测的时间:”+(System.currentTimeMillis()-a)/1000f+” 秒 “);
就OK了!

Hadoop知识整理

按照what、how、why整理了下文章,帮助大家快速梳理下hadoop知识:
what:
Hadoop的作用: http://tianhailong.com/hadoop%E7%9A%84%E4%BD%9C%E7%94%A8.html
hadoop到底能做什么?怎么用hadoop?: http://tianhailong.com/hadoop%E5%88%B0%E5%BA%95%E8%83%BD%E5%81%9A%E4%BB%80%E4%B9%88%EF%BC%9F%E6%80%8E%E4%B9%88%E7%94%A8hadoop%EF%BC%9F.html
Hadoop和云计算的关系: http://tianhailong.com/hadoop%E5%92%8C%E4%BA%91%E8%AE%A1%E7%AE%97%E7%9A%84%E5%85%B3%E7%B3%BB.html
hadoop和java的关系: http://tianhailong.com/hadoop%E5%92%8Cjava%E7%9A%84%E5%85%B3%E7%B3%BB.html
Hadoop10大应用: http://tianhailong.com/hadoop10%E5%A4%A7%E5%BA%94%E7%94%A8.html
Hadoop是分布式计算的未来: http://tianhailong.com/187.html
Hadoop发展历史: http://tianhailong.com/hadoop%E5%8F%91%E5%B1%95%E5%8E%86%E5%8F%B2.html
Hadoop大事记: http://tianhailong.com/hadoop%E5%A4%A7%E4%BA%8B%E8%AE%B0.html
Hadoop主要子项目: http://tianhailong.com/hadoop%E4%B8%BB%E8%A6%81%E5%AD%90%E9%A1%B9%E7%9B%AE.html
Hadoop, Hive和Scribe在运维方面的应用: http://tianhailong.com/hadoop-hive%E5%92%8Cscribe%E5%9C%A8%E8%BF%90%E7%BB%B4%E6%96%B9%E9%9D%A2%E7%9A%84%E5%BA%94%E7%94%A8.html
hadoop招聘: http://tianhailong.com/hadoop%E6%8B%9B%E8%81%98.html
how:
渐进学习hadoop: http://tianhailong.com/%E6%B8%90%E8%BF%9B%E5%AD%A6%E4%B9%A0hadoop.html
hadoop基础-Hadoop入门一: http://tianhailong.com/hadoop%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86%E7%82%B9.html
认识hdfs和MapReduce-Hadoop入门二: http://tianhailong.com/hadoop%E5%85%A5%E9%97%A8%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86%E7%82%B9%E4%BA%8C.html
HDFS开发MapReduce开发-Hadoop入门三: http://tianhailong.com/hadoop%E5%85%A5%E9%97%A8%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86%E7%82%B9%E4%B8%89.html
hadoop在百度的应用: http://tianhailong.com/hadoop%E5%9C%A8%E7%99%BE%E5%BA%A6%E7%9A%84%E5%BA%94%E7%94%A8.html
Hadoop集群搭建–Hadoop安装: http://tianhailong.com/hadoop%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BAhadoop%E5%AE%89%E8%A3%85.html
why:
hdfs:hadoop分布式文件系统的架构和设计: http://tianhailong.com/hdfs%EF%BC%9Ahadoop%E5%88%86%E5%B8%83%E5%BC%8F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%9E%B6%E6%9E%84%E5%92%8C%E8%AE%BE%E8%AE%A1.html

没有学位,通过这四步也能进Google

自从发表了《坚持编程:如何找到一份工程师工作》这篇文章,很多人问我在没有学位的情况下怎么获得在谷歌(Google)工作的机会。你通向成功之路或许会和我不一样,下面是我的故事。
我非常希望能上大学,我的理想大学是加利福尼亚大学洛杉矶分校(UCLA)。很不幸,我高中的 GPA 低的令人尴尬,只有2.45。所以实际上,我并没有随便选择一家大学。我在普渡大学盖莱默分校上的计算机科学课程,希望可以当交换生或者找到别的出路。差不多两个学期以后,后者发生了。我收到了一个不可拒绝的offer。
第一步:在你能做之前先装装样子。大学的时候,我在一家专门为本地企业建设网站小公司工作,时薪是12美金。在我的职业规划里,我从未想过做这样一份工作,但当时来看还不错。
我同时参与多个项目,身负重任,我选择埋头苦干,全力以赴。从这个过程中我获得了很多信任。同时,我尝试利用我不多的业余时间开发游戏。我去到一个 天主教会,向那里的管理人员请求提供我少量的钱和三个月时间来开发这个游戏,然后在网上销售。我绘制了漂亮的报表和颜色丰富的图片,向他们展示共享软件模型( shareware model )是怎么工作以及如何确切知道这会带来回报。实际上,我对于我将要做的东西还不是非常清楚,但是他们买了,也许是由于那些漂亮的颜色。
经过两个月的开发,我将Demo发布到网上。一个在加州刚刚起步的创业公司CodeFire发现我的Demo和他们的游戏如此相似,都是一个从上往 下看的太空射击游戏,都和SubSpace非常相似,除了3D部分。不幸的是,他们通过勒令停止通知函与我交涉。我只能给他们一个回复“当然可以,只要你们聘请我工作,我就马上停止”。他们马上给我发了offer。然后我就收拾行装去了加州。
第二步:和大师交朋友。这可能是最重要的事情。在你的领域里找到一位大师,让他们成为你的导师,不停的向他们学习。当我在Double Helix工作时,有一位大师叫 Nathan Hunt,他是我遇过最聪明的却又最谦卑的人。不管我问的问题如何的基础,他都极度耐心的一一解答。我至少上千次的走进他办公室,问一些诸如“我怎样才能平滑的将一个旋转矩阵插值到另外一个里面”,“我应该如何实现移动柱体的碰撞检测”的问题。几年以后,他晚我一个月加入了谷歌。
每一个导师都改变了我解决问题或者看待世界的方法,而这只有其中的一小部分。
第三步:填补不足。因为我没有一个正式的计算机学位,我清楚自己缺乏很多基础的理论知识。比如,我实现了一个物理引擎,但从未解决过动态规划的问题。为了填补这些空缺,我几乎实现了所有我见过或读过的数据结构与算法。这些虽然都已经有了,但是通过观察而知道其如何 工作,与通过实现而知道其为什么可行有着巨大差别。
完成以下几点:
至少掌握其中一门语言: C、 C++、Objective-C、Java、PHP、Python 或 Ruby。了解至少一门其他语言,熟悉Scala、Haskell 或者 Lisp。
学习数据结构。尝试实现其中的大部分。理解他们的时间复杂度。
解决编程问题。阅读下面的文章( Read this)和解决这里的大多数问题( solve many of these)。
为你的项目建立主页。(比如,编程框架、移动应用、网页应用、小游戏等)
第四步:找到自信。在离开印第安纳州6年以后,我已经通过多个平台发布了超过6个游戏。我渐渐觉得无聊,需要新的挑战。我申请了谷歌的职位,由于我没有学位,我想着如果我被聘请了,我就能成为梦寐已久的一名真正的工程师了。但是,我从未收到回信,对于这一点我感到一点都不意外。
一年以后,我再次提交了我的简历。而这一次,我把“教育”这一部分删除了。讽刺的是,这次一位招聘官给我打电话和我预约了一个电话技术面试。我咨询是否可以预约在两个星期以后,他同意了。我需要这一部分时间。我利用这段时间,尽最大努力将尽可能多的算法和数据结构塞到我的脑子里。我每天编码 12-14个小时,解决了几百道编程题。我慢慢沉迷进去了,直到我对谷歌面试的害怕变成了自信和兴奋。
我记得住在谷歌的每一次面试,每一次与他们的交锋。面试官都很健谈,我相信他们都看得出来我非常兴奋的迎接他们的问题。
我遇到的一些面试题如下:
给定一组2维点,计算出他们的轮廓线。这非常简单,我采用了非常一种通用的数据结构叫做最大堆。这道题有很多解决方法,这里有一个非常好的。( good one)
设计微软的画笔。这是目前为止最有趣的问题。我从画接口和类图开始,我提到了画笔桶(Paint Bucket),面试官让我实现它。幸运的是,多亏TopCoder,我闭着眼睛都知道如何实现一个迭代的,广度优先遍历的桶。
描述你的软件的长处。这是一道开放的讨论面试题。我说到了测试的类型和他们的重要性(单元测试,集成测试,验收测试)。我又说到了代码风格的一致性和可维护性等等。这些东西你可以在《代码大全》和 《Effective Java》找到。
我真正的享受每一轮面试和每一个扔给我的问题。如果我没有那样认真的准备,我现在肯定不是这个样子。面试完了以后,我感觉非常好。但是,我听说即使招聘委员组同意了给offer,拉里本人仍有权利否决。我担心一旦他看到我没有学位以后,我就完蛋了。
不过,这并没有发生,有一天我在Santa Clara吃着寿司午餐,我接到了电话,我非常热情的接受了Offer。那一天,我清楚的知道我不用再回到学校里去了。
胜利的战士先胜了再去战场,而失败的战士先上战场再去求胜。
喜欢或者讨厌这篇文章,都请让我知道。@guitardave24
经过5年学习和成长,我现在已经不再为谷歌干活了。
http://blog.jobbole.com/40257/

Base64编码

按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个位为一个单元,对应某个可打印字符。三个字节有24个位,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME, 在XML中存储复杂数据.
在MIME格式的电子邮件中,base64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号「+」,斜杠「/」,一共64个字符,等号「=」用来作为后缀用途。
完整的base64定义可见 RFC 1421和 RFC 2045。编码后的数据比原始数据略长,为原来的。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6(因为)个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
如果最后剩下两个输入数据,在编码结果后加1个「=」;如果最后剩下一个输入数据,编码结果后加2个「=」;如果没有剩下任何数据,就什么都不要加,这样才可以保证数据还原的正确性。
如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个’=’号,代表补足的字节数。也就是说,当最后剩余一个八位字节(一个byte)时,最后一个6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。
在URL中的应用:
Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java持久化系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的「/」和「+」字符变为形如「%XX」的形式,而这些「%」号在存入数据库时还需要再进行转换,因为ANSI SQL中已将「%」号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充’=’号,并将标准Base64中的「+」和「/」分别改成了「-」和「_」,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
另有一种用于正则表达式的改进Base64变种,它将「+」和「/」改成了「!」和「-」,因为「+」,「*」以及前面在IRCu中用到的「[」和「]」在正则表达式中都可能具有特殊含义。
此外还有一些变种,它们将「+/」改为「_-」或「._」(用作编程语言中的标识符名称)或「.-」(用于XML中的Nmtoken)甚至「_:」(用于XML中的Name)。
其他应用:
Mozilla Thunderbird和Evolution用Base64来保密电子邮件密码
Base64 也会经常用作一个简单的“加密”来保护某些数据,而真正的加密通常都比较繁琐。
垃圾讯息传播者用Base64来避过反垃圾邮件工具,因为那些工具通常都不会翻译Base64的讯息。
在LDIF档案,Base64用作编码字符串。
在设计BASE64编码的时候,我想设计人员最主要考虑了3个问题:
1.是否加密?
2.加密算法复杂程度和效率
3.如何处理传输?
加密是肯定的,但是加密的目的不是让用户发送非常安全的Email。这种加密方式主要就是“防君子不防小人”。即达到一眼望去完全看不出内容即可。
基于这个目的加密算法的复杂程度和效率也就不能太大和太低。和上一个理由类似,MIME协议等用于发送Email的协议解决的是如何收发Email,而并不是如何安全的收发Email。因此算法的复杂程度要小,效率要高,否则因为发送Email而大量占用资源,路就有点走歪了。
但是,如果是基于以上两点,那么我们使用最简单的恺撒法即可,为什么Base64看起来要比恺撒法复杂呢?这是因为在Email的传送过程中,由于历史原因,Email只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果您发送了一封带有非ASCII字符(即字节的最高位是1)的Email通过有“历史问题”的网关时就可能会出现问题。网关可能会把最高位置为0!很明显,问题就这样产生了!因此,为了能够正常的传送Email,这个问题就必须考虑!所以,单单靠改变字母的位置的恺撒之类的方案也就不行了。关于这一点可以参考RFC2046。
基于以上的一些主要原因产生了Base64编码。