函数声明
1 | function func(){ |
Django框架大概是python web框架中最有名的一个了,由于学习需要得用python搞个网页出来,那就学学这个喽。
入门级的介绍我是参考自强学堂的简单教程,总的来说讲的还是蛮清楚的。
下面简单记录下搭建过程,其实也是非常容易上手。
当然可以去django官网下载源码直接$sudo pip install Django
,而且版本也比较新。
相比下源码直接用来说,用pip安装能自动的把常用的命令对应的放在/usr/local/bin/等里面而不是扎堆放在一起,因此非常方便随处使用。
安装完成后在python命令行里输入
1 | >>> import django |
即可查询当前版本了,这个还是要十分清楚的,因为1.7、1.8、1.9各个版本的使用差别还是很大的。
django工程首先用django-admin.py startproject project-name
来创建,这会生成一个项目文件夹。然后进入文件夹,输入python manage.py startapp app-name
命令来生成一个应用。不过新建的app要手动在项目文件里注册,即在Test/Test/settings.py里的INSTALLED_APPS的字典里加上’app-name’字段来帮助项目找到属于他的应用。
文件树大概是这样的:
1 | Test/ |
大的Test文件就是整个项目,MyApp就是一个项目(网站),小的Test就是项目的配置文件,包括项目的基本配置(setting.py),以及url映射文件(urls.py)。
下面就显示一个HelloWorld。
既然要显示网页,就肯定得有url到文件的映射,这个就是由项目里的urls.py文件设置:
1 | #coding:urf-8 |
首先得导入项目的views,然后用正则来匹配网页,r’^$’很明显就是匹配根目录。而MyAppViews.index就是对应调用的函数,这个函数就写在app/views.py下:
1 | #coding:utf-8 |
很好理解,就是直接打印。
最后启动服务,在项目根目录下输入
1 | python manage.py runserver 8000 |
当然,端口号8000可以省略或者指定其他的端口。
这样就能在本地访问8000端口的http服务了。
理论上,这点东西就足以搞搞静态页面了,不过事实上,他的功能更加强大。
最近看了很多大牛的博客,感觉在迷迷糊糊的考试周里突然又有了学习的动力,不知不觉对工程也有了兴趣。以前总是怀疑我是不是不应该学软件工程而是该学计算机科学,现在想想但是还真是naive。虽然身边的那些师兄、同学都说搞工程什么的特别low(感觉我以前内心深处也是这么想的0.0),但是仔细看了看他们自己似乎也没有什么特别大的成果。我总觉得肚子里越是没有干货的人就越是喜欢对自己稍微了解的领域评头论足。当然,说实话我对Software Engineering这个行当也不是很了解,而且感觉同专业里大多数人了解的应该不会比我多多少,但是这并不是止步不前的借口。且不说知乎上那些大一就能够经济独立的同学,或者是已经工作了的博主,就是身边也有很多取得出色成就的牛人。马上大三了,还有很多路要走。真正搞代码的人虽说从骨子里都有种傲气,但是我们也都清楚真正的力量和自己的藐小。总觉得乔帮主对干咱们这个行当的人总结的特别好,stay hungry,stay foolish.
屁话撸多了,言归正传,既然要搞工程,首先肯定得会搬砖。所谓搬砖嘛,也就是把建筑材料拼拼补补,一点一点的堆起来,最后弄成个小房子。这件事本身其实没有什么问题,一个小房子自己搞搞也能弄完,出了问题也没人推,自己的设计自己也清楚。但是如果是盖大房子呢,这肯定就不能是一个人就能搞定的了,得有很多人一起弄,那么这就有些麻烦了。搞不好就是你碰了我的砖,我动了你的砖,出了问题我也可以说这块砖不是我搬的等等很麻烦。这就引出了版本控制的重要性,现在几乎所有的项目都是用版本控制和仓储工具的,存在的意义也没什么好争辩的了。在这当中我想最出名的就是Github了,不过Github也只是git版本控制的一个仓储平台,类似的平台还有很多,比如oschina里的git(吐槽下github的网络不稳定,感觉oschina才是比较实用的东西。。。),最终用的是git版本控制方法。而git也只是各种版本控制和仓储工具的一种,还有很多类似SVN、CVS等,不过git应该算是最流行的了。
对于git的安装、使用和它的优点以及细节,Pro Git这本书已经写的非常好了,可以作为教程学习(比那些上来就写命令的菜鸟教程好多了)。这个书的来源也十分值得研究https://github.com/progit/progit
,搭建这个阅读环境的方法也十分漂亮。
具体的操作也就不提了,书上写的已经是非常好了,有问题直接查阅。
现在已经分析清楚了,就这么点玩意,照着之前分析出来的接口用python写个小脚本就行了。
hack.py
1 | #coding:utf-8 |
最后执行python hack.py <账号> <密码>
即可。不出意外的话,几秒钟之后就会显示Your score is 100 !
了。
不知道从什么时候开始,学校的体育理论考试搞成了下载一个app然后在这上面考。。。本来觉得没什么,然后突然爆出这个app有一坨bug,安卓端多选题只能提交一个答案(后来发现原因是多选题提交答案时的while循环里多写了一个break。。。),导致分数奇低。虽然后来做了一个紧急修复,但从这也能看出开发人员的尿性。。。再后来,有个专门搞app的同学说他能够刷到满分,我稍微想了下,这种考试型app的逻辑能够被破解,无非有两个方法:第一种就是记录所有模拟题库中的题目和答案,然后比对考题进行提交;第二种就是他在把题目发送过来的时候顺带把答案也发送过来了,然后在本地做的成绩校验,最后把结果发回服务器。后来实际操作了下,发现app中的题库在考试阶段是关闭的,那么只就剩下第二种可能了。不得不说开发的同行们也是人才,发送考试卷子还会把答案发过来,而且报文还是明文未加密的,这不是成心勾人犯罪么。。。
这样,思路有了,下面就是操作了。说白了,我们需要做的就是抓包分析,分析他前后台传送的http报文,然后模拟考试。
跟抓网页不一样,这次是抓手机的包,那么就需要用电脑来代理手机的网络,具体做法详见Fiddler代理如何配置。这里讲的很清楚了,不过需要注意的是默认的端口8888可能会被一些程序占用,无法使用的时候换一个端口号即可。
当然首先电脑跟手机得是一个局域网,我这里当然是校园网。
顺便提一句,这个方法还可以用一个网关登陆N多个终端。。。不过目测是分享带宽的。。。
代理配置好之后,打开app,考一次试(这将浪费一次考试机会),记录下fiddler抓到的报文:
request
1 | POST http://appsrv.ihodoo.com/login HTTP/1.1 |
respond
1 | { |
登陆的过程就是把用户名密码post过去,然后他会返回给你一堆信息,这里显示了json数据部分,意思也都很清楚,尤其注意那个token。
request
1 | GET http://appsrv.ihodoo.com/auth/exam/enterIndex?uid=17751129083&token=afa6da18-0fd2-476c-93df-4a2e3b0263eb HTTP/1.1 |
respond
1 | { |
这是进入考试的提醒,把uid和token用Get方法传过去,他会返回你即将得到的考卷的信息,包括某编号(id)、题目数(totalSubCount)、试卷编号(examPaperId)。
request
1 | GET http://appsrv.ihodoo.com/auth/exam/start/10/318367?uid=17751129083&token=afa6da18-0fd2-476c-93df-4a2e3b0263eb&totalCount=50 HTTP/1.1 |
respond
1 | { |
这是获得考卷的过程,把id、examPaperId、uid、token、totalSubCount传过去即可,得到一堆试题。。。。。。这里取三种典型题目,第一个是单选题,第二个是判断题,第三个是多选题。每道题都有题目内容,题目编号,题目顺序(由于json是不保证顺序的,因此需要有个sort来控制顺序)、题目选项、以及题目答案。。。
request
1 | GET http://appsrv.ihodoo.com/auth/exam/select/318367/38861?selectOptions=B,C&token=afa6da18-0fd2-476c-93df-4a2e3b0263eb&uid=17751129083 |
返回结果大概就是提交成功之类的。
这个过程其实就是把每道题的id、答案加上自己的uid和token一起发过去,非常简单。
request
1 | GET http://appsrv.ihodoo.com/auth/exam/submit/318367?uid=17751129083&token=afa6da18-0fd2-476c-93df-4a2e3b0263eb HTTP/1.1 |
respond
1 | { |
套路跟上面一样。。。最后发现我得了6.0分。。。
都知道写文档论文之类的肯定是用LaTeX比较漂亮,虽然我对用LaTeX写数学公式稍微有点了解,但是还是没有直接用它来排版。下面就整理下用LaTeX写文档的方法。
最常用的LaTeX排版工具是MikTeX。选择好windows版本,下载安装即可。可执行文件是%install_path%/miktex/bin/x64/texworks.exe
。
这里的格式通常是在网上找模板。。。毕竟自己弄还是挺麻烦的,而且还要考虑中文编码的问题。我找到的模板如下:(用pdfLaTeX+MakeIndex+BibTex编译)
1 | \documentclass[a4paper, 11pt]{article} |
这主要是写中文文档的配置,当然他会提醒你下载一些包,照做即可。
其实,通常使用的时候,我们最需要的操作只是对文章进行分章节:
1 | \section{Section} |
效果大概是这样:
高中学信息论的课后作业,本来自己的项目文档和中期汇报还没写,为了强行装x答应了下来,结果硬是熬夜到四点才敲完。。。。(以后绝不装逼了)
虽然算法看上去不难,但是不得不说还是走了很多弯路,学到了很多东西,在这里做个记录。
用Huffman 编码实现文件的无损压缩和解压。
算法当然用到了霍夫曼编码,构造霍夫曼树。具体过程也很简单,就是把读入的字节流按照字节进行频数分析,对频率高的字符用短编码,对频率低的用长编码。然后将编码的映射表和编码后的结果写入文件,这时候生成的文件就是压缩后的文件了。根据信息论的相关知识,这大概算是无损编码中压缩效率最高的了。
相比我在遇到这个问题的时候,遇到的最大难度其实是文件的读写。由于平时对文件读写操作的练习不到位,出了很多洋相。比如忘记了java中char是两字节的;比如byte是有符号的;比如中文字符的编码问题;比如ObjectInputStream对象的available方法返回的是当前block的剩余字符而不是整个文件的剩余字符;除此之外,还要考虑压缩后的比特流长度可能不能构成完整的字节,因此要设计空白比特的填充处理;由于是压缩文件,因此还要考虑空间效率,不能直接用ArrayList
没有考虑读入和写入的效率问题,文件处理(尤其是压缩的写入过程)写的比较丑。。。
1 | import java.io.File; |
之前的文章讲过了,如果想向Mysql快速的批量导入数据的话,最好的方法就是使用load data local in file "path" into table mytable
。但是在最近的一次使用中,我发现,对于使用含有auto_increment
字段的表,多次导入数据的时候,该字段的值会出现跳跃丢失。。。不知道是怎么一回事。下面是实验过程。
mysql 5.7.12
一、创建一个简单的表:
1 | mysql> create table tmp(id int not null primary key auto_increment,value int not null); |
注意到id字段设置为auto_increment。
二、创建一个数据文件in.txt:
1 | null 1 |
三、导入数据
第一次:
1 | mysql> load data local infile "in.txt" into table tmp; |
第二次:
1 | mysql> load data local infile "in.txt" into table tmp; |
很明显可以看到,中间丢失了三个id,不知道是为什么。
最后问了百度知道。。。知道上的同学说是数据最后加了个空行;本来我还不相信,以为每条数据之后都要加个回车,但是仔细一研究果然是这样。加了空行后,这一行数据的值会为默认值,而且自增Id的值也会出现问题,就像上面描述的这样;而把最后的回车删除之后,结果就没有问题了。。。