Archive for 编程

利用Django表单实现 用户注册,检测数据库中是否有该用户。方法 查到的比较好的一种方法 get(**kwargs) 以下文描述的 "字段查询" 格式返回匹配查找参数的对象.如果没有找到符合给定参数的对象,会引发一个模块级的DoesNotExist 异常. 如果找到不止一个对象,引发AssertionError 异常.

from django.core.exceptions import ObjectDoesNotExist
try:
#判断用户名是否被注册
    User.objects.get(username=username)
except ObjectDoesNotExist:
    return username
raise forms.ValidationError('改用户名已存在')

Continue

在我们的js中,最大的一般还是js库,毕竟具体的功能实现只需要写一点点代码而已。但是js库里那么多用到的没用到的东西,还是有点份量的。我们 又想用,又嫌它大。怎么办呢?拆成很多个吧,多一个js还多一个并发连接呢…… 幸好,google挺够意思,号称“永久提供”常见js库,google的服务器和线路品质那自然是不在话下的。即提高了下载速度又减少了自己服务器的并 发连接数。不用就是傻子了。 用起来也很简单,直接在网页里引用google服务器上的相关js文件就可以了。不过,如果引用多个js,就要插入多段的script。现在像我这样代码 能少一个字算一个字的人不少。google也提供了相应的办法,那就是google load。我们只需要在页面里引用一个js文件,就可以根据需要实时加载用到的js库了。首先在页头部分加入以下这行代码:

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
这就足够了,google提供了以下这些js框架/库的API: jQuery jQuery UI Prototype script.aculo.us MooTools Dojo 而且google的API中包括这些js框架/库的所有正式发布版。你可以根据自己的需要来选择。以jQuery为例,我们可以这样使用:
<script type="text/javascript">
  google.load("jquery", "1.3.2");//加载jQuery 1.3.2
 </script>
这样我们就从google的最近的CDN镜像上加载了jQuery 1.3.2版的js库,接下来就可以正常写js代码了。不过,即使是google的CDN镜像,下载也毕竟是需要时间的,万一代码库还没有下载完而浏览器 已经解释到了下面的代码了怎么办?我们可以设定在js库加载完以后才开始执行js:
<script type="text/javascript">
    google.load("jquery", "1.3.2"); //加载jQuery 1.3.2
    google.setOnLoadCallback(function() {//加载完成后执行代码
        $("body").html("Hello World!");
    });
</script>

Continue

1、MySQL数据库 net start mysql 启动mysql服务 net stop mysql 停止mysql服务 2、Django 启动自带的web服务 python manage.py runserver 创建项目 django‐admin.py startproject mysite 创建应用 python manage.py startapp books 以正确Django配置启用Python交互解释器 python manage.py shell 检查模型的语法和逻辑是否正确  python manage.py validate 生成 CREATE TABLE 语句(books 是app的名称) python manage.py sqlall books 提交SQL语句至数据库的方法  python manage.py syncdb  (syncdb 并 不能将模型的修改或删除同步到数据库)  

Continue

收藏学习 PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。它可以比 CGI或者Perl更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成 HTML标记的CGI要高许多。下面介绍了十个PHP高级应用技巧。 1, 使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。 这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。 2, 在验证 email 地址的时候使用 checkdnsrr() 函数验证域名是否存在。 这个内置函数能够确认指定的域名能够解析成 IP 地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数,这个函数基于 checkdnsrr(),用来验证 email 地址的合法性。对于那些认为自己的 email 地址是 [url=mailto:“joeuser@wwwphp.net]“joeuser@wwwphp.net[/url]” 而不是 [url=mailto:“joeuser@php.net]“joeuser@php.net[/url]” 的家伙们,这个方法可以很方便的抓住他们。 3, 如果你使用的是 PHP 5 和 MySQL 4.1 或者更高的版本,考虑抛弃 mysql_* 系列函数改用改进版的 mysqli_* 系列函数。 一个很好的功能就是你可以使用预处理语句,如果你在维护一个数据库密集型站点,这个功能能够加快查询速度。一些评估分数。 4, 学会爱上三元运算符。 5, 如果你在项目中感觉到有可复用的部分,在你写下一行代码前先看看 PEAR 中是否已经有了。 很多 PHP 程序员都知道 PEAR 是一个很好的资源库,虽然还有很多程序员不知道。这个在线资源库包含了超过 400 个可以复用的程序片段,这些程序片段你可以立即用刀你的程序里。除非说你的项目真的是非常特别的,你总能找到帮你节省时间的 PEAR 包。(参见 PECL) 6, 用 highlight_file() 来自动的打印出格式化的很漂亮的源代码。 如果你在留言板、IRC 这些地方寻求一个脚本的帮助的话,这个函数用起来非常的顺手。当然了,要小心不要意外的泄露出你的数据库连接信息和密码等。 7, 使用 error_reporting(0) 函数来防止用户看到潜在的敏感错误信息。 在理想情况下,发布服务器应该在 php.ini 里完全禁止。但是如果你用的是一个共享的 web 服务器的话,你没有自己的 php.ini 文件,那么这种情况下你最好的选择就是在所有脚本的第一行前加上 error_reporting(0);(或者使用 require_once() 方法)。这就能够在出错的时候完全屏蔽敏感的 SQL 查询语句和路径名。 8, 在网数据库中存储很大的字符串之前使用 gzcompress() 和 gzuncompress() 来显式的压缩/解压字符串。 这个 PHP 内置函数使用 gzip 算法,可以压缩普通文本达 90%。在我每次要读写 BLOB 类型的字段的时候都使用这些函数。唯一额例外就是当我需要全文检索的时候。 9, 通过“引用”传递参数的方法从一个函数中得到多个返回值。 就像三元运算符一样,大部分受过正式编程训练的程序员都知道这个技巧。但是那些 HTML 背景大于 Pascal 背景的程序员都或多或少的有过这样的疑问“在仅能使用一次 return 的情况下,从一个函数里返回多个值?”答案就是在变量前加上一个 “&” 符号,通过“引用”传递而非“值”传递。 10, 完全理解“魔术引号”和 SQL 注入的危险性。 我希望阅读到这里的开发者都已经很对 SQL 注入和了解了。不过我还是把这条列在这里,是因为这个确实有点难以理解。如果你还没有听说过这种说法,那么把今天剩下的时间都用来 Google、阅读吧。

Continue

1 、Apache安装配置 下载http://httpd.apache.org/download.cgi 一路next  我是直接用的wamp的 2、Python安装 直接过了 3、Django安装 下载:https://www.djangoproject.com/download/ 在解压出的目录下执行: python setup.py install ,django就自动安装到了C:\Python25\Lib\site-packages 这个目录下了。 Python25/script/目录下有Django-admin.py  在该目录 下执行命令:Django-admin.py startproject testbb 创建一个工程 看到Python25/script/下多一个testbb目录,里面有文件。 testbb目录下执行manage.py runserver,打开浏览器:http://127.0.0.1:8000/ 可以看到内容,哈哈。 4、mod_python安装 选择路径OK,下载http://archive.apache.org/dist/httpd/modpython/win/3.3.1/ 5、安装PIL 直接下载安装了。 6、MySQL安装 下载:http://dev.mysql.com/downloads/mysql/5.0.html 7、MySQL-python 找到一个好的下载地址http://www.codegood.com/downloads 在运行Python setup.py install后,出现serverKey =_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,options['registry_key']),如果使 用mysql 5.5需要修改site.cfg文件中registry_key = SOFTWARE\MySQL AB\MySQL Server 5.0修改为5.5。 1)安装MingW32。先下载mingw-get,然后用mingw-get安装g

cc. 2)安装MySQL Connector/C. 网上有很多文档说是安装MySQL Server,但是我安装了MySQL Server(包含开发用的Header/Lib),结果在后面哦编译中还是报有些头文件找不到,后来才发现应该是安装Connector/C, 而不是MySQL的Server。 3)注释掉MySQL Connector/C中的config-win.h中的行typedef int mode_t; 4)下载MySQL-python-1.2.3.tar.gz,解压后,修改MySQL-python-1.2.3中的setup_window.py. a)注释掉行mysql_root, dummy = _winreg.QueryValueEx(serverKey,'Location') 修改为:mysql_root=r"<安装MySQL Connector/C的目录>"  *虽然那个serverKey可以在site.cfg中设置,但是感觉比较怪异,为什么不让用户直接在site.cfg中配置这个Locstion呢,反倒是要配置一个注册表中的键值。 b)注释掉行libraries = [ 'kernel32', 'advapi32', 'wsock32',client] 修改为:libraries = [ 'kernel32', 'advapi32', 'wsock32',"libmysql"] *这个真的让我郁闷了很久,当使用mysqlclient这个lib时,undefined reference超多。为了查那些错误,让我浪费了很多的时间,最后尝试写死了用libmysql,竟然通过了. c)注释掉行extra_compile_args = [ '/Zl' ] 修改为:extra_compile_args = [ ] *这个Option应该是GCC不支持。 5)在MySQL-python-1.2.3中执行 python ez_setup.py install python setup.py build --compiler=mingw32 python setup.py install 6) 把MySQL Connector/C.中的lib/opt/libmysql.dll复制到Windows的System32目录下面。 7)修改MySQL-python-1.2.3中的tests/test_MySQLdb_dbapi20.py中的connect_kw_args,加入user,passwd,host等参数。并运行测试,如果所有的Test都通过了,就OK了。

Continue

本科的《编译原理》课程依稀在我脑中留下些许映象。当初的课程大作业是写一个叫Dicuf(貌似是这么发音)的编译器,在万恶的助教的鞭策下,我们使用了Lex和Yacc成功逃离了恐怖之狱。现在又要拾起编译来,还是有些挑战性的。 善其事,利其器。在网络上一番东游西逛,我对于时兴的一些语法分析器自动生成工具有了点了解。现总结如下,以资参考。 Lex/Yacc   它生于Unix,是最经典的词法\语法分析器,是经典教材中的示例御用工具。现在它也支持在Windows上生成(安装环境),然而其所生成语法分析器的语言仅有C语言。 Flex/Bison   与前者类似,Bison与Yacc有很高的兼容性。生成语言为C、C++和Java。 CoCo/R   较早的一个语法分析器生成工具。其生成语法分析器的语言极其之多,包括C#、 Java、 C++、F#、VB.Net、Oberon等等。 ANTLR   作为翻译程序的一部分,你可以使用简单的操作符和动作来参数化你的文法,使之告诉ANTLR怎样去创建抽象语法树(AST)和怎样产生输出。ANTLR知道怎样去生成识别程序,生成语法分析器的语言包括Java,C++,C#. 语法有点麻烦。 GOLD   它是一个较为复杂的分析器,支持语言貌似最多。生成语言包括(官网说的):Assembly - Intel x86 、ANSI C、C#、D、Delphi、Java、Pascal、Python、Visual Basic、Visual Basic .NET、Visual C++、所有.NET语言、所有ActiveX语言。难以想象这居然是个免费的软件。 Grammatica   这是一个C#和Java的语法剖析器生成器(Parser Generator或叫作编译器的编译器:Compiler Complier) 。它相对于其它一些类似的工具如yacc和ANTLR有了更好的改进。这是因为Grammatica:   1.创建了更好的注释和易读的源代码.   2.拥有错误自动恢复并能够详述错误信息.   3.支持语法/词法测试与调试. JavaCC   它是用JAVA开发的最受欢迎的语法分析生成器之一。它还提供JJTree等工具来帮助我们建立语法树。它还有一个用于辅助JavaCC应用程序开发的Eclipse插件.生成语法分析器语言为java。 还有很多语法分析器生成工具,比如JFlex、SableC、Beaver、JTopas、Runcc、CUP、SJPT、Chaperon。但我实在是没精力一一介绍了,之前实在没想到这工具如此繁多。    最后我选择了Grammatica,因为我需要C#语言的语法分析器,而且要求足够简单:)   我利用Grammatica的一个示例生成了一个C#的语法分析器,并移植到Silverlight项目上(由于另一个项目需要),目前运行良好。由于.Net与Silverlight.Net非常相像,这个移植工作比想象中要容易。不过,我不太赞成将语法分析器放到Web上,这样会使客户端明显增大,一种可以考虑的做法就是将用于验证功能的语法分析器封装成Web服务放到服务器端。

Continue

在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例javascript代码: ($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_) 这是一段完全合法的javascript代码,效果相当于alert(1)。它可以在大部分浏览器上运行。(虽然目前我测试过手头的浏览器都能运行,但理论上不能保证所有浏览器都能正确运行,原因见下文) 这段代码的好处(对于黑客)是,它不包含任何字符或数字,可以逃过某些过滤器的检查。比如说,如果假定一个AJAX请求将返回一个只包含数字的JSON,于是很可能会简单判断了一下其中不含字母就直接eval了,结果给黑客们留下了后门。上面的代码功能很简单,只是alert(1),但使用同样的原理,完全可以干出更复杂的事,例如alert(document.cookie)。更重要的是,这段代码再一次提醒我,黑客的想象力是无限的……正如Ryan Barnett的演讲标题:"XSS:The only rule is no rule"。 那么这段代码是如何工作的呢? 我们可以把它分为两个部分来理解: 第一部分: ($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])() 第二部分: [__[_/_]+__[_+~$]+$_[_]+$$](_/_) 其中第一部分是核心,我们首先对它进行分析,先缩进一下: ($= [$=[]][ (__=!$+$)[_=-~-~-~$] + ({}+$)[_/_] + ($$= ($_=!''+$)[_/_] + $_[+$]) ] )() 显然,最外层是(...)()形式的函数调用,我们需要看看这里究竟调用了什么函数,返回了什么。下一步,我们把原来代码中赋值表达式提取出来,将其改写为以下等价形式: $ = []; //1 __ = !$+$; //2 _ = -~-~-~$; //3 $_=!''+$; //4 $$ = $_[_/_] + $_[+$]; //5 $= [$][ __[_] + //6 ({}+$)[_/_] + //7 $$ //8 ]; //9 $(); //10 现在来一行行看: 1. $先赋值为一个空数组 (后面会被覆盖) 2. __ = ![] + [] = false + [] = "false" 这里利用了javascript运算的强制类型转换特性。首先空数组是一个非null值,因此![]的结果是false(布尔型)。在计算false + []时,由于数组对象无法与其他值相加,在加法之前会先做一个toString的转换,空数组的toString就是"",因此事实上在计算false + ""。这时false被自动转换为字符串。最终结果是"false"+"" = "false"。 **换句话说,在$为空数组时,使用 “+$”的方式可以将任何一个值转为字符串** 3. 在计算~[]时,~需要一个数字操作数,空数组无法直接转换为数字,则作为0处理。因此~[] = ~0 = -1。 参考: ~3 = -4 ~[3] = -4 ~[3,2] = -1 (无法转为数字) ~"3" = -4 ~"abc" = -1 因此: _ = -~-~-~[] = -~-~-(-1) = -~-~1 = -~-(-2) = -~2 = -(-3) = 3 理论上,可以用这种方式得出1-9所有数字 4. !''是true,使用+$将其变为字符串 "true" 5. 这里需要注意的是,之前一直用“值+[]”来获得“值”的字符串形式。而“+[]”则是0(正号导致[]被自动转换为数值0)。因此:$$ = "true"[3/3] + "true"[+[]] = "true"[1] + "true"[0] = "rt" 6. __[_] = "false"[3] = "s" 7. ({} + [])导致空对象{}被转换为字符串"[object Object]", 因此({}+$)[_/_] = "[object Object]"[1] = "o" 9. 这里把$覆盖为 [[]]["s"+"o"+"rt"]。注意这里[[]]本身是一个包含空数组的数组,其实对这一步来说,任何一个数组都没有关系(不一定要是嵌套数组),但作者巧妙地把$的首次赋值式放在了数组内部,使代码更为紧凑。最终结果是,$ = [[]]["sort"] = [[]].sort = Array.prototype.sort。 10. 调用$(),作为整个表达式最终的取值。需要注意,$是全局范围的,是window的一个属性,相当于window.$。而Array.prototype.sort会返回this。对于window.$来说,this就是window。因此,整个第一部分的值,就是window本身!当然,这个过程的正确运作依赖于当前浏览器的Array.prototype.sort实现能对this为window的情况容错。 通过第一部分,我们已经获得将任何值转换为字符串的简单方法,并能产生任意的数值,理论上就可以从javascript的取值系统中提取出大部分字母(不知道是不是全部,需要考证)。并且,我们获取到了window的引用。下面就可以开始上下其手,为所欲为了。木哈哈哈哈哈! 可以看出,上面的第10步是与浏览器的具体实现相关的,因此也存在着某些浏览器下需要对代码作出修改的可能。 现在看第二部分,事实上已经非常明朗了,唯一需要注意的是,现在$是一个函数,因此~$ = ~0 (无法直接转换为数字则作为0处理) = -1。 [__[_/_]+__[_+~$]+$_[_]+$$](_/_) = ["false"[1]+"false"[3+(-1)]+"true"[3]+"rt"](1) = ["a"+"l"+"e"+"rt"](1) 所以,整条式子相当于: window["alert"](1) 最后只想再感慨一次:黑客的想象力是无限的。理解代码并不难,问题是一开始时他们是怎么能想出来的。。。

Continue

几个比较大的在线提交系统(Online Judge)里面有大量历年的竞赛题目,注册一个ID,然后用自己熟悉的语言(一般有Pascal/C /C++/Java)写好源代码提交即可,会实时返回信息告诉你是否正确。采用黑箱测试,系统里有一套标准的输入输出数据(对外保密,而且通常数据很多很 怪),你的程序的输出和标准输出完全符合即可。常见的返回信息有AC(Accepted,通过)WA(Wrong Answer,输出有错 误)TLE(Time Limit Exceeded,超时)MLE(Memory Limit Exceeded,内存溢 出)RE(Runtime Error,发生实时错误)等,只有AC了才算做对一题。这里只是一个简要介绍,请大家在做题时先看看各网站上的 FAQ,Enjoy it~~~ 杭电acm http://acm.hdu.edu.cn 编程爱好者ACM题库 http://www.programfan.com/acm/ Enjoy ACM Life http://acm.asus.com.cn 清华ACM http://acm.lib.tsinghua.edu.cn 浙江大学 Online Judge(ZOJ) http://acm.zju.edu.cn 国内最早也是最有名气的OJ,有很多高手在上面做题。特点是数据比较刁钻,经常会有你想不到的边界数据,很能考验思维的全面性,现在我主要在这个OJ上做题 北京大学 Online Judge(POJ) http://acm.pku.edu.cn/JudgeOnline/ 建立较晚,但题目加得很快,现在题数和ZOJ不相上下,特点是举行在线比赛比较多,数据比ZOJ上的要弱,有时候同样的题同样的程序,在ZOJ上WA,在POJ上就能AC 西班牙Valladolid大学 Online Judge(UVA) http://online-judge.uva.es/problemset/ 世界上最大最有名的OJ,题目巨多而且巨杂,数据也很刁钻,全世界的顶尖高手都在上面。据说如果你能在UVA上AC一千道题以上,就尽管向IBM、微软什么的发简历吧,绝对不会让你失望的。 俄罗斯Ural立大学 Online Judge(URAL) http://acm.timus.ru/ 也是一个老牌的OJ,题目不多,但题题经典。 UsacoGate Online Judge(USACO) http://ace.delos.com/usacogate 全美计算机奥林匹克竞赛(USACO)的训练网站,特点是做完一关才能继续往下做,与前面的OJ不同的是测试数据可以看到,并且做对后可以看标准解答,所 以如果大家刚开始的时候在上面那些OJ上总WA却找不到原因的话,可以试着来这里做做,看看测试数据一般是从什么地方阴你的。

Continue