Resive world

Come world to Record life


  • Home

  • Tags

  • Categories

  • Archives

  • Sitemap

  • Search

一个实用的代码查重程序sim工具

Posted on 2016-01-08 | In Linux

sim工具是在搭建hustoj的过程中发现的一个小玩意。毕竟作为一个OJ,hust的人肯定也考虑到了网络比赛中代码复制粘贴的现象。所以一个代码判重的工具肯定是必不可少的。然而这个工具在网站的前后台中并没有体现,而是作为一个附带的工具一起打包下来的。而且事实上他打包的版本有点老了,所以我去了作者的博客上找了最新的版本--Dick grune。

额,是的没错,他就叫 Dick~~,大概看了下博客,真是个挺厉害的人,写了不少的书,都是关于编译方面的东西,好像还搞了LaTeX的解释器啥的。。。我现在要用的是他的一个小工具,在这里下载。

下下来解包之后还要细心的查看并编辑下Makefile的配置,然后进行编译,主要是这几步:

  1. 选择操作系统,Makefile里有两套配置,一套是“For UNIX-like systems”,另一套是“For MSDOS + MinGW”,根据当前系统把另一套注释掉就行了。
  2. 修改BINDIR的值,推荐设置为/usr/bin/,一般来说,放到$PATH下比较方便。
  3. 修改MAN1DIR的值,推荐设置为/usr/share/man/man1,这个目录是系统man文档的默认目录。
  4. 将sim.1文件放到刚才设置的MAN1DIR里,放进去之后,man sim命令就应该可用了。
  5. 安装依赖,一般来说,安装了gcc,make,flex这几个东西就够了。
  6. 执行make install。

搞定之后就会发现生成了一堆可执行文件:

1
2
3
4
5
6
7
8
9
sim_8086
sim_c
sim_c++
sim_java
sim_lisp
sim_m2
sim_mira
sim_pasc
sim_txt

这样,编译工作就搞定了。不过,如果是用的windows,其实直接就有编译好的可执行文件了,不需要自己编译安装。。。

用法

  1. 选择语言: sim 支持多种语言:C, Java, Pascal, Modula-2, Lisp , Miranda, or text files,对应的命令分别是: sim_c ,sim_java,sim_pasc ,sim_m2,sim_lisp ,sim_mira,sim_text 。
  2. 选择参数: 常用的参数有三个:
参数 含义
-p 表示以“F consists for x % of G material”的形式输出相似度
-t N 表示只显示相似度大于N%的条目(除text 默认为20%外,其余默认为1%);
-o file 表示将结果输出到file中
最后可以输入文件名,支持通配符。

示意

如下两个文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//a.cpp
#include<stdio.h>
typedef struct //定义一个新的数据类型
{
int yue;//月份
int tian;//天
}Date;
void f(Date x, Date y);//函数声明
int main()
{
Date date1, date2;
//类型赋值
printf("输入一个日期(mm/dd):\n");
scanf_s("%d/%d", &date1.yue, &date1.tian);
printf("再输入一个日期(在上一个日期之后)(mm/dd):\n");
scanf_s("%d/%d", &date2.yue, &date2.tian);
//调用函数
f(date1, date2);
return 0;
}
void f(Date x, Date y)
{
int m, n;
int t;
//计算两个日期的天数
switch (x.yue)
{
case 1:m = x.tian; break;
case 2:m = x.tian + 31; break;
case 3:m = x.tian + 59; break;
case 4:m = x.tian + 90; break;
case 5:m = x.tian + 120; break;
case 6:m = x.tian + 151; break;
case 7:m = x.tian + 181; break;
case 8:m = x.tian + 212; break;
case 9:m = x.tian + 243; break;
case 10:m = x.tian + 273; break;
case 11:m = x.tian + 304; break;
case 12:m = x.tian + 334; break;
}
switch (y.yue)
{
case 1:n = y.tian; break;
case 2:n = y.tian + 31; break;
case 3:n = y.tian + 59; break;
case 4:n = y.tian + 90; break;
case 5:n = y.tian + 120; break;
case 6:n = y.tian + 151; break;
case 7:n = y.tian + 181; break;
case 8:n = y.tian + 212; break;
case 9:n = y.tian + 243; break;
case 10:n = y.tian + 273; break;
case 11:n = y.tian + 304; break;
case 12:n = y.tian + 334; break;
}
//求相差天数
t = n - m;
printf("相差的天数:%d\n", t);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//b.cpp
#include<stdio.h>
typedef struct //使用结构体
{
int month;
int day;
}date;
int f(date d1, date d2);//函数声明
int main(void)
{
date d1, d2;
printf("输入第一个日期:\n");
scanf_s("%d,%d", &d1.month, &d1.day);//输入第一个日期
printf("输入第一个日期:\n");
scanf_s("%d,%d", &d2.month, &d2.day);//输入第二个日期
printf("相差%d天", f(d1, d2));//调用函数并输出相差天数
return 0;
}
int f(date d1, date d2)//函数定义
{
int x, m, n;
switch (d1.month)//计算第一个日期是一年的第几天
{
case 1:
m = d1.day;break;
case 2:
m = d1.day + 31;break;
case 3:
m = d1.day + 59;break;
case 4:
m = d1.day + 90;break;
case 5:
m = d1.day + 120;break;
case 6:
m = d1.day + 151;break;
case 7:
m = d1.day + 181;break;
case 8:
m = d1.day + 212;break;
case 9:
m = d1.day + 243;break;
case 10:
m = d1.day + 273;break;
case 11:
m = d1.day + 304;break;
case 12:
m = d1.day + 334;break;
}
switch (d2.month)//计算第二个日期是一年的第几天
{
case 1:
n = d2.day;break;
case 2:
n = d2.day + 31;break;
case 3:
n = d2.day + 59;break;
case 4:
n = d2.day + 90;break;
case 5:
n = d2.day + 120;break;
case 6:
n = d2.day + 151;break;
case 7:
n = d2.day + 181;break;
case 8:
n = d2.day + 212;break;
case 9:
n = d2.day + 243;break;
case 10:
n = d2.day + 273;break;
case 11:
n = d2.day + 304;break;
case 12:
n = d2.day + 334;break;
}
x = m - n;//计算日期差
if (x >= 0)//返回非负值
return x;
else
return -x;
}

这两个是用来计算日期只差的cpp文件(学生提交的作业,对不对另说),看上去还是有点差别的,至少很多变量名都经过了替换,修改了注释,而且也改了缩进的风格,但是经过sim程序判别之后,可以发现他们的相似度还是极高的:

1
2
3
4
5
6
7
myths@Business:~/桌面$ sim_c -p a.cpp b.cpp
File a.cpp: 374 tokens, 82 lines
File b.cpp: 388 tokens, 81 lines
Total: 762 tokens

a.cpp consists for 89 % of b.cpp material
b.cpp consists for 86 % of a.cpp material

相似度仍然达到了90%左右,所以我们可以确定的认为这两份作业是抄袭的。可以证明这个程序的识别率还是非常高的~

Ubuntu中命令行下的图片查看器eog

Posted on 2016-01-08 | In Linux

有时候在命令行下看文件的时候突然遇到个图片,这个又不能直接在命令行下查看,还得手动在桌面上打开文件来查看,十分的不方便。其实ubuntu本身自带的图像查看器就带了一个命令行下打开的接口——eog 命令(eye of gnome 的缩写,十分好记)。

命令

1
2
3
4
5
6
7
8
9
10
EOG(1)                 General Commands Manual                EOG(1)

NAME
eog - a GNOME image viewer

SYNOPSIS
eog [options] files...

DESCRIPTION
An image viewer for GNOME which uses gdk_pixbuf

用man 命令可以看到用法,其实通常option 选项可以忽略,直接在后面接文件名即可,非常的方便。

附加

后来发现,其实Linux桌面下绝大多数图片查看器都可以用命令行打开,比如使用shotwell命令也可以从命令行查看图片。。

sudo命令免输密码配置

Posted on 2016-01-07 | In Linux

闲来无聊再次作死权限的管理,这次是想实现一下输入sudo 命令时无需输入密码的配置。之前看了教程,感觉挺简单的,就没试过。今天突然心血来潮想配置下,结果就被权限玩的很惨,重启了好几次电脑。。。。。。

网上说的很简单,就是在/etc/sudoers文件里的%admin ALL=(ALL)  ALL 改成%admin ALL=(ALL) NOPASSWD: ALL 即可。其实他说的也没错,可是自己手敲的时候敲残了,结果保存之后再用sudo 命令就报错了,说无法正确读取sudo!本来修改sudoers文件就需要sudo 命令,现在sudo 命令也用不了了。。。没辙,只能重启电脑进recovery模式重新配置一下了。(方法见:这里)

好了,修改完之后发现还是不能实现免密码登陆。想了想有可能是我当前的用户不在admin组里,于是打开/etc/group文件看了看,竟然没有admin这个组。没事,我记得我的用户是在sudo这个组里的,那么再次修改下sudoers文件,在sudo 组里加上NOPASSWD:ALL 即可了。(手残又敲错,重启电脑中。。。。)

这样配置完之后,试了下果然可行。

后来想了想,如果每次不小心配置错sudoers 文件都要重启的话,岂不是很麻烦。肯定有更好的方法。查了下发现可以用 visudo 这个命令来修改/etc/sudoers文件。用这个修改之后,他会检查语法,如果语法不合规范,他是不会让你保存的。这倒是蛮人性化的,只是这个命令用的是nano 编辑器,vim 用惯了就完全不习惯这种东西了。不高兴。

网上找了下还有一个办法,就是先给sudoers文件740的权限,修改,修改完再改回440。这样就可以在出错的时候有修改的权限了。然而试了下并没有卵用,就算有440的权限,修改这个还是要用sudo 命令的,此法不通。。。(作死重启修改配置中。。。)

然后突发奇想,何不把权限改成777,这样不就能修改了么,大不了最后再改回来就行了。试了下,发现ubuntu有一个坑爹、但是很有道理的策略,就是sudoers文件的不能对所有用户都有7的权限,否则就不给你用。。。。无奈,再次啥都动不了(作死重启修改配置中。。。)

最后突然意识到----为什么不在一开始就用 sudo  -i 进入root 模式呢,这样不就不用输入sudo 来修改文件了么。。。。。。

Hustoj系统的安装搭建

Posted on 2016-01-06 | In Web

本来一直觉得没什么事情做,最近想了想还是学着写些网页吧,于是就打算用一些平台来学习web开发。想来想去还是研究一下OnlineJudge系统之类的网页。一方面自己之前经常使用,另一方面,觉得以后或许在当助教的过程中能用的到。于是找到了华中科技大学开源的一个OJ系统,据说很出名,但是搭建果断还是费了一点功夫的。

首先得找到正确的渠道,本来一直是在github上找的,然而找到后安装好了发现效果并不好,运行也特别的慢。后来发现了作者的博客 zhblue的博客,才知道原来github上的是个beta版的,稳定版的在googleCode上。(然而据说googlecode 就要关了,估计就要下不到了。。。)

把下载的文件包解压缩会的到这么多的文件:

1
2
3
myths@Business:~/下载/install$ ls
db.sql install-interactive.sh java0.policy judged
hustoj-read-only install.sh judge.conf README

老规矩先看README,晓得文件的结构,然后看先install.sh(不要手残直接执行,,很多东西都要事先配置下的)

我们打开install.sh会看到开头的一段话:

1
2
3
4
5
6
7
8
9
10
11
myths@Business:~/下载/install$ head install.sh
#!/bin/bash
#before install check DB setting in
# judge.conf
# hustoj-read-only/web/include/db_info.inc.php
# and down here
#and run this with root

#CENTOS/REDHAT/FEDORA WEBBASE=/var/www/html APACHEUSER=apache
WEBBASE=/var/www
APACHEUSER=www-data

这样我们就知道了,我们需要配置下judge.conf等的文件,来确保网页能访问到数据库,主要就是提供下数据库的用户名和密码。

还有就是默认的站点的位置,apache2默认应该是要放在/var/www/html下,改下就好了。

然后还要注意一点,就是我们会发现install.sh脚本里会执行其他的脚本,而执行的命令是:sudo ./make.sh 这样的。而事实上这谢文件又没有可执行的权限。想直接执行的需要用:sudo bash ./make.sh才行。那么我们要做的就是要么修改脚本,要么给所有的.sh文件都赋予x权限。(之前没有注意到这个脚本没有得到执行,结果导致无法进行判题,后来手动执行了一下就好了)

最后直接install.sh即可,完美不报错,打开/JudgeOnline 目录可以看到已经搭建的网站了。

搭建完成后发现并不能直接用,因为没有设置管理员的权限,回头看下README,发现原来第一个管理员账户是要手动敲进数据库的:

1
2
3
4
5
6
注册用户
http://127.0.0.1/JudgeOnline/registerpage.php
注册一个普通帐号
创建管理员
insert into privilege(user_id,rightstr) values('zhblue','administrator');
zhblue 为需要加管理员权限的帐号

照着弄就好了,最后就可以进入/JudgeOnline/admin看到后台了。

另:这里还有一个坑,不知道什么原因,实验室的电脑能用svn下载评测机的内核,而服务器的电脑不能下载(日了狗了,明明hosts什么的都是一样的而且都是用的校园网)。。。而在install.sh中需要下载最新版本的内核,这导致了服务器上搭建的网站不能进行编译。。。这个问题最后通过将本地下载的最新内核上传上去解决的。。。也是醉了。。

Ubuntu中修改主机名的方法

Posted on 2016-01-05 | In Linux

在实验室的电脑上安装了Ubuntu,安装的时候填写主机名时没注意,使用的时候才发现命令行是这样的:

1
myths@myths-HP-ProDesk-498-G3-MT-Business-PC:~$

名字长的很蛋疼,本来挺小的命令行硬是被占满了一行,使用的时候怪怪的。

其实修改的方法也很简单,打开/etc/hostname 文件,填写一个新的主机名就好了。

别急,修改完成后还要再修改一下hosts文件的配置,因为hosts里有这样的开头:

1
2
3
4
5
6
7
8
9
10
myths@myths-HP-ProDesk-498-G3-MT-Business-PC:~$ head /etc/hosts
127.0.0.1 localhost
127.0.1.1 myths-HP-ProDesk-498-G3-MT-Business-PC

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

我们还得把本地的主机名也改过来,否则在运行sudo 命令的时候会报一个”无法解析主机名”的错误,而且会特别的慢。

最后重启一下电脑,更新下配置就好了。

配置完成后:

1
myths@Business:~$

干净了好多~~

Ubuntu中添加软件源与ppa源

Posted on 2016-01-02 | In Linux

Ubuntu下的软件的更新是以一种不同与windows下的方式进行的。windows下的软件更新,是通过打开应用后,应用自动联网查看更新然后来提醒用户。而Ubuntu下,用户只需要隔三差五的运行下apt-get update  命令就可以通过查看软件的各个源来获取所有软件的更新信息。那么,apt-get 命令为什么能做到这个呢?其实是因为apt-get 命令有一个源列表,他所有提供的软件都是从这个列表上获取的,那么很自然,每当软件有了最新的版本,apt总能够通过查看当前的列表获取得到,从而反馈给用户。

软件源

这个源列表就是/etc/apt/sources.list 。这里记录了源的地址,格式基本如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
# deb cdrom:[Ubuntu 14.04.2 LTS _Trusty Tahr_ - Release amd64 (20150218.1)]/ trusty main restricted

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://ubuntu.cn99.com/ubuntu/ trusty main restricted
deb-src http://ubuntu.cn99.com/ubuntu/ trusty main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://ubuntu.cn99.com/ubuntu/ trusty-updates main restricted
deb-src http://ubuntu.cn99.com/ubuntu/ trusty-updates main restricted
......

这里的ubuntu.cn99.com就是我们镜像的地址,决定着源的更新访问的速度。可以通过修改这个来使用最佳的源。当然,每次修改完源之后,还要执行update 命令来使系统重新识别一下。

ppa源

当然,系统自带的源是很有限的,我们肯定需要一些其他的软件包,然而如果是直接下载deb格式的文件的话,又不能获取到更新和维护。所以这就用到了十分重要的ppa源了。

所谓ppa源,就是指“Personal Package Archives”,也就是个人软件包集。这其实是一个网站,即-launchpad.net 。Launchpad是Ubuntu母公司canonical有限公司所架设的网站,是一个提供维护、支援或联络Ubuntu开发者的平台。由于不是所有的软件都能进入Ubuntu的官方的软件库,launchpad.net 提供了ppa,允许开发者建立自己的软件仓库,自由的上传软件。供用户安装和查看更新。

加入ppa源的命令:sudo add-apt-repository ppa:user/ppa-name

删除ppa源的命令:sudo add-apt-repository -r ppa:user/ppa-name

比如我们要添加wine的源,就可以执行:sudo add-apt-repository ppa:ubuntu-wine/ppa

好了,让我们看看添加完ppa源之后到底发生了什么:

1
2
3
4
5
6
myths@Business:~$ cd /etc/apt/sources.list.d/
myths@Business:/etc/apt/sources.list.d$ ls
myie-browser.list sogoupinyin.list
myie-browser.list.save sogoupinyin.list.save
openalpr.list ubuntu-wine-ppa-trusty.list
openalpr.list.save

恩,其实是在/etc/apt/sources.list.d/文件夹里放了一个文件,我们打开来看看:

1
2
3
myths@Business:/etc/apt/sources.list.d$ cat ubuntu-wine-ppa-trusty.list 
deb http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu trusty main
# deb-src http://ppa.launchpad.net/ubuntu-wine/ppa/ubuntu trusty main

原来就是添加了一个跟软件源一模一样的东西,他们的作用殊途同归啊。我想其实只是为了分辨官方的源和第三方的源,Ubuntu才设计成在sources.list 和 sources.list.d/ 这两个地方中存储源。因为第三方的源毕竟不太可信,如果随便更新的话可是会出事情的。

Ubuntu的OCR识别软件包tesseract

Posted on 2015-12-30 | In Computer Vision

这个包据说是开源的OCR中非常好用的一个,在图像识别的领域里,tesseract-ocr引擎曾是1995年UNLV准确度测试中最顶尖的三个引擎之一。在1995年到2006年期间,它几乎没有什么改动,但是它可能仍然是现在最准确的开源OCR引擎之一。它会读取二进制的灰度或者彩色的图像,并输出文字。一个内建的tiff阅读器让它可以读取未压缩的TIFF图像,但是如果要读取压缩过的TIFF图像,它还需要一个附加的libtiff库。

下载

下载地址是:http://code.google.com/p/tesseract-ocr/downloads/list

这里有比较全的文档、源码、语言包等必要数据。当然我们主要是下载 tesseract-ocr-3.02.02.tar.gz 然后根据README进行配置编译。

当然,如果图方便也可以直接在ubuntu中用apt来下载:

1
$sudo apt-get install tesseract-ocr

安装

基本上按照README 的提示去做就可以了,不过有两点需要注意:

1、这里用的是autorun.sh进行的生成,需要执行aclocal命令,没有安装这个命令会报错。安装方法见aclocal的安装。

2、在执行./configure的时候发现这个还需要一个依赖包leptonica,否则无法配置。这个包可以在这里下载。查看README直接安装即可。

语言包

除了下载源码,我们还需要下载语言包,根据需要可以在之前的页面中下载。下载后会得到一个tessdata文件夹,文件夹下有一堆的文件。

接下来我们只需要把这里的东西丢到/usr/local/share/tessdata 里去就可以了,这里保存的就是语言库。

测试

1
tesseract  b.png res

程序会生成res.txt 文件显示识别到的内容。

结果

测试了好多组数据,无论是规范的文字还是不规范的验证码,识别的效果都很不理想。。。看来这个东西还是没得用。。。

用autogen.sh安装源码时的重要组件aclocal

Posted on 2015-12-28 | In Linux

试着在Linux上构建一个程序,该程序的开发版本是使用“autogen.sh”脚本进行的。当我运行它来创建配置脚本时,却发生了下面的错误:

1
2
3
4
5
myths@myths-Business-PC:~$ ./autogen.sh
Running aclocal
./autogen.sh: 50: ./autogen.sh: aclocal: not found

Something went wrong, bailing out!

说是找不到aclocal文件。查看了下文件目录,发现了一个叫aclocal.m4的脚本,感觉大概是这个文件没有得到解析。

百度了一下发现了,在用类似autogen.sh脚本来生成源代码的时候,通常需要以下三个依赖包:

1
autoconf    automake    libtool

那么我们就可以通过下载这三个包来解决问题了:

1
myths@myths-Business:~$ sudo apt-get install libtool autoconf automake 

安装好这几个包就可以了。

一款开源的车牌号码识别系统openalpr

Posted on 2015-12-27 | In Computer Vision

关于车牌号码的识别,其实研究也很多了。但是对于普通的开发者而言,本身不想去研究这些算法层面的东西,只是想能够直接应用来做我们自己需要的事情。虽然很多网站提供了Api接口,但是毫无疑问这是要money的。之前看到国人发的一片博客介绍他自己写的开源车牌识别系统叫Easypr,我自己也下载下来研究了一下。然而使用的时候发现错误有很多,而且没有正规的接口文档,做的也特别粗糙,显然不太适合直接使用。百度不到我就直接去google,果然还是发现了老外写的一款开源的识别软件–openalpr(Open Automatic License Plate Recognition 开源自动车牌识别),发布在github上。拿过来测试之后发现效果还挺好的,而且文档清楚,虽然不能识别中文,但是对字母和数字的识别准确性还是挺好的。不管怎么说,先记下来以防以后用到。

这个程序有很多版本,有各种语言的接口,也有Linux下的二进制文件。鉴于现在不需要用来开发,我们直接用他编译成的二进制命令即可。当然如果有需要,也可以去下载他的源码,调用他的函数库。如果有闲工夫的话也可以尝试这改一改。。。。让他能识别中文,造福国人。

安装:

使用github上提供的最简单的方法–

1
2
3
4
wget -O - http://deb.openalpr.com/openalpr.gpg.key | sudo apt-key add -
echo "deb http://deb.openalpr.com/master/ openalpr main" | sudo tee /etc/apt/sources.list.d/openalpr.list
sudo apt-get update
sudo apt-get install openalpr openalpr-daemon openalpr-utils libopenalpr-dev

帮助:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
alpr  [-c <country_code>] [--config <config_file>] [-n <topN>] [--seek
<integer_ms>] [-p <pattern code>] [--clock] [-d] [-j] [--]
[--version] [-h] <image_file_path>

Where:

-c <country_code>, --country <country_code>
Country code to identify (either us for USA or eu for Europe).
Default=us

--config <config_file>
Path to the openalpr.conf file

-n <topN>, --topn <topN>
Max number of possible plate numbers to return. Default=10

--seek <integer_ms>
Seek to the specified millisecond in a video file. Default=0

-p <pattern code>, --pattern <pattern code>
Attempt to match the plate number against a plate pattern (e.g., md
for Maryland, ca for California)

--clock
Measure/print the total time to process image and all plates.
Default=off

-d, --detect_region
Attempt to detect the region of the plate image. [Experimental]
Default=off

-j, --json
Output recognition results in JSON format. Default=off

--, --ignore_rest
Ignores the rest of the labeled arguments following this flag.

--version
Displays version information and exits.

-h, --help
Displays usage information and exits.

<image_file_path>
Image containing license plates

OpenAlpr Command Line Utility

效果:

1
2
3
4
5
6
7
8
9
10
11
12
myths@myths-X450LD:~/Download$ alpr a.jpg
plate0: 10 results
- EHL5747 confidence: 90.5541
- EHL577 confidence: 83.4746
- EHLS747 confidence: 82.0519
- EH5747 confidence: 80.6372
- EHLB747 confidence: 78.9456
- EHE5747 confidence: 78.337
- EHC5747 confidence: 77.903
- EHL747 confidence: 77.4477
- EBL5747 confidence: 76.8316
- EL5747 confidence: 75.6551

对于正面的牌照识别的效果还是很好的,但是对于中国的车牌来说识别的效果就很差了。

苏大Mooc系统的刷课脚本的制作(3/3)

Posted on 2015-12-26 | In Web

最后决定用最简单的python脚本进行实现。具体过程部分析了,不过值得一提的是,在登陆获取用户的cookie的时候,他也发送了一个挺长的“随机”串,研究了半天才发现他是使用了md5摘要算法,将密码和密码的摘要一同发给了服务器。。。。。。

以下是源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#cheat.py

import urllib,urllib2,cookielib,md5,re,json,sys

def login(name,pwd):
url_login="http://ids1.suda.edu.cn/amserver/UI/Login?goto=http://myauth.suda.edu.cn/default.aspx?app=kczx"
m=md5.new()
m.update(pwd)
pwd_md5=m.hexdigest()
cj=cookielib.CookieJar()
post_data=urllib.urlencode({
'IDButton':'Submit',
'encoded':'false',
'goto':'',
'gx_charset':'UTF-8',
'IDToken0':'',
'IDToken1':name,
'IDToken9':pwd,
'IDToken2':pwd_md5,
})
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders=[('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36))')]
urllib2.install_opener(opener)
req=urllib2.Request(url_login,post_data)
urllib2.urlopen(req)
return opener

def watch(PlainId,fPartName,fPartId,fSecond,fVideoSecond,fVideoFileId,opener):
if fVideoFileId==u'0':
return
url='http://kczx.suda.edu.cn/G2S/Learning/StudentLearning.ashx?action=GetG2SSetStageLearnPartStudent&fPlanID='+PlainId+'&fPartID='+fPartId+'&fSecond='+fVideoSecond
urllib2.install_opener(opener)
urllib2.urlopen(url)
print fPartName+'has been watched'
return

if __name__=='__main__':
#url_lecture='http://kczx.suda.edu.cn/G2S/Learning/Learning.htm?Part=&Plan=34&type=2'
if len(sys.argv)!=4:
print 'Please enter <number> <pwd> <url>'
sys.exit();
name=sys.argv[1]
pwd=sys.argv[2]
url_lecture=sys.argv[3]
opener=login(name,pwd)
urllib2.install_opener(opener)
PlainId=re.findall(r'(?<=Plan=).*?(?=&)',url_lecture)[0]
url_ajax='http://kczx.suda.edu.cn/G2S/Learning/StudentLearning.ashx?action=GetG2SStageLearnGetChapter&fPlanID='+PlainId
ajax_text=urllib2.urlopen(url_ajax).read()
ajax_text=ajax_text.replace('RowCount','"RowCount"')
ajax_text=ajax_text.replace('Rows','"Rows"')
s=json.loads(ajax_text)
fPartName=[]
fPartId=[]
fSecond=[]
fVideoFileId=[]
fVideoSecond=[]
for k in s['Rows']:
fPartName.append(k['fPartName'])
fPartId.append(k['fPartID'])
fSecond.append(k['fSecond'])
fVideoSecond.append(k['fvideoSecond'])
fVideoFileId.append(k['fVideoFileID'])
for k in range(len(fPartName)):
watch(PlainId,fPartName[k],fPartId[k],fSecond[k],fVideoSecond[k],fVideoFileId[k],opener)

当然,为了省事,没有任何的容错处理和用户界面。。。使用时,输入:

1
myths@myths-X450LD:~$ python cheat.py <学号> <密码> <课程网址>

而且在Linux下,课程网址中的“&”符号需要转义为”&“才能用。。。。。。

基本就是这些了,按理说如果管理员有心,是可以查出我们提交的数据其实是有问题的,不过目测应该是没人看的吧~~~

1…495051…58

574 posts
69 categories
286 tags
© 2024 Companyd
Powered by Hexo
|
Theme — NexT.Muse v5.1.4