常用JS表单验证汇总(持续更新)

六月 7th, 2013 17 views

首先是测试html页面的编写

1
2
3
4
5
6
7
8
<form name="form1" action="#" method="post" onsubmit="return check()">

帐号:<input name="ID" type="text" />
密码:<input name="PWD" type="password" />
<input name="submit" type="submit" value="提交" />  
<input name="reset" type="reset" value="取消" />

</form>

以下为相应功能的js脚本
①验证为非空

1
2
3
4
5
6
7
8
9
10
function check()
{
    if(document.form1.ID.value=="" || document.form1.PWD.value=="" )
    {
        alert("用户名或密码不能为空!");
        this.form1.ID.focus();
        return false;
    }
else form1.submit();
}

②密码位数验证

1
2
3
4
5
6
7
//添加进check()中即可
if(document.form1.zhanghao.value.length<6)
{
    alert("用户名字符不能少于6位!");
    this.form1.zhanghao.focus();
    return false;
}

BeiTown
2013.06.07

数据库清除冗余数据的常用SQL脚本(初级)

六月 5th, 2013 26 views

最近项目的数据库要清理一些冗余数据,冗余数据主要来自于一些死账号即长期不登录的玩家或帐户余额长期为0的玩家,基本方法就是使用SQL脚本进行批量删除。同时冗余数据大多不会只存在一个表中,因此还需要跨表进行操作。

①单个表日期筛选删除
首先是日期筛选,比如需要过滤出最后登录日期在多少年月日以前的帐号。
这里对日期筛选的脚本如下:
如删除最后登录日期在2013年1月1日0点0分之前的帐号:

1
DELETE FROM [玩家表] WHERE 最后登录日期字段名 <  '2013-1-1 00:00:00'

如果查找之后的使用大于号”>”即可

②表连接进行跨表删除
比如此时需要删除最后登录日期在2013年1月1日并且其账户余额为0的玩家帐号:

1
2
DELETE FROM [玩家表] WHERE  最后登录日期字段名 < '2013-1-1 00:00:00' AND 用户ID字段 IN
(SELECT 用户ID字段 FROM [账户表] WHERE 余额字段 = 0)

此方法为一个嵌套查询,即先在玩家表中寻找余额为0的行,再在这些行中筛选出登录日期小于13年1月1日的行并删除。通常嵌套查询会比较慢但利于理解。

③清除其他表中的无效数据
当执行了第二步操作后,玩家表中满足条件的行都将被删除,但此时账户表中该玩家的信息尚未删除,此时只需要做一个对比即可,即删除存在一个表(玩家表)而不在另一个表(账户表)中的数据。
依旧用嵌套查询的方法吧

1
2
DELETE FROM [账户表] WHERE 用户ID字段 NOT IN
(SELECT 用户ID字段 FROM [玩家表])

以上脚本即可简单的删除一些定向抛弃的数据库的冗余信息,当然由于方法相对初级因此执行效率有待提高,但对于手动脚本操作来说基本影响不大。

总结:
通过对以上三段代码的举一反三,即可完成大多数数据库的冗余数据清除。
欢迎大家提出更优秀高效的方案,后期我也会陆续更新一些更高级的冗余数据清理方案,本篇到此,谢谢关注。

BeiTown
2013.06.05

C++使用ADO方式操作SQLSERVER数据库

六月 4th, 2013 381 views

C++连接数据库的方式常用的有 DB-Lib、ODBC、OLEDB和ADO。本篇中将使用的是ADO方式。
ADO是一个微软提供的访问数据库中数据的编程接口,关于ADO网上的描述很多,本篇直接说明如何使用,其他相关的介绍大家可以自行参考官方文档
首先需要导入一个ADO的dll库,并添加一个数据库连接指针和查询结果集指针,在头文件ADOConn.h中添加如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#import "c:\Program Files\Common Files\System\ado\msado15.dll"
no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")

class ADOConn  
{
public:
    //添加一个指向Connection对象的指针
        _ConnectionPtr m_pConnection;
    //添加一个指向Recordset对象的指针
    _RecordsetPtr m_pRecordset;

public:
    ADOConn();
    virtual ~ADOConn();

    //初始化--连接数据库
    void OnInitADOConn();
    //执行查询
    _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);
    //执行SQL语句
    BOOL ExecuteSQL(_bstr_t bstrSQL);
    //断开数据库连接
    void ExitConnect();
};

如上一个数据库的操作分别需要实现以上4个函数,即初始化连接、查询、执行以及断开连接。
Read the rest of this entry »

Php圆周取点算法

五月 27th, 2013 58 views

本篇的重点其实是圆周取点算法,说是Php只是因为通过Php的进行编码而已,使用其他语言均可。

首先概述一下圆周取点算法的需求:以 O(Xo,Yo) 为圆心,d 为半径画一个圆,从圆心角0度开始,依次显示出在这个圆上直线间距为 t 的所有点的坐标。

如图:

在这个圆 O上所有直线间距为t的点的坐标为 P1、P2…Pn

接下来看算法:

①如上图,通过圆的简单定理可以知道在同一个圆上当两个扇形的弦长即 t 相等时,其圆心角也是相等的,因此本算法可以将 t 转换为圆心角度数再做计算:

SinO` = t / 2r
∠O` = arcsin(SinO`)
∠O = 2∠O`

此时即将弦长 t 转换成了对应的圆心角。

②接下来我们根据圆心角计算出对应的点的坐标,使用公式如下:

Xn = Xo + r * Cos(0°* (n-1))
Yn = Yo + r * Sin(0°* (n-1))

此时Pn(Xn,Yn)即是我们需要求出的圆上的点。
Read the rest of this entry »

margin:0px auto在IE中失效的解决方案

五月 19th, 2013 39 views

这个问题其实是N年前的问题了,刚刚遇到一个网站需要修复首页的错位问题,因此写下来顺带温习一下:
错位的表现为网站主框架DIV,即warp不居中,准确的说是在IE中不居中,firefox、chrome浏览器无此bug。

检查网站源码发现缺少了一个DOCTYPE声明
在网站首页代码最顶部添加如下代码:

1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"]

保存后即可成功居中。
多数在IE浏览器中margin:0px auto失效的情况均为缺少这个DOCTYPE声明造成的。

BeiTown
2013.05.19

Android wifi机器人视频传输接收端的实现

五月 8th, 2013 1,419 views

本篇的开发基于已将S605摄像头挂载在Openwrt系统上,并且已通过网页测试访问 http://192.168.1.1:8080/?action=snapshot 摄像头视频数据流成功的基础上。
上述过程的实现,大家可以自行在论坛里查找相关资料。本篇重点讲述如何通过Android手机端实现网页端相同的视频接收功能。

首先我们需要了解到这是一个MJPEG图片视频流,是以发送逐帧的JPEG图片数据连贯起来的动画视频。Android端通过访问目标Openwrt系统上的指定服务器端口,获取这个图片流数据,并逐帧播放出来。了解此原理之后,我们的工作即可简化为在Android端创建一个socket长连接,并对目标服务器端口发送请求,并接受请求。因为数据的传输都是以字节流的形式的,所以基本传输原理与常用的socket传输方式无基本差别,主要在用字节流的解析过程,将其还原成JPEG格式的信号。

在Android的中对于视频的显示处理通常使用surfaceView这个类,继承该类实现一个自定义的surfaceView组件即可。
surfaceView有两种创建方式,一种是在Activity中正常New出来,另一种是在UI设计界面下拖拽出一个surfaceView控件,并在xml中强制转换为自定义的surfaceView类型。
下面说下这两种方式的实现区别与用途,第一种通常用于整个界面的跳转,并且new出来的surfaceView是不受UI设计界面控制的,因此无法控制其图层的顺序,并且与其他Layout控件并存等等。实现方式是直接new即可,在我们自定义的VideoSurfaceView类里,使用第一个构造函数:

1
2
3
4
public VideoSurfaceView(Context context)
{
    super(context);
}

Read the rest of this entry »

关于QT中域名解析IP的方法(阻塞式)

五月 2nd, 2013 103 views

最近在用QT制作一套网络安全工作,正巧需要实现域名解析出IP的一个功能,用winsock也可以实现,需要用到gethostbyname(url)方法,调用后返回的是一个HOSTENT结构体。但相对在QT中来处理这个结构体,各种位操作及字符指针的移动比较麻烦,同时也考虑到将来工具的跨平台性,趁早拜托对winsock的依赖为好,因此,还是用QT中实现域名解析的QHostInfo类来实现这项功能。

相对于winsock中的几十行代码,在QT中仅仅需要两行即可实现:

1
2
QHostInfo info=QHostInfo::fromName("www.beitown.com");
qDebug()<<info.addresses().first().toString()<<endl;

注意如果提示 QHostInfo : No such File or directory (找不到QHostInfo文件)请在.pro 文件添加 QT += network 即可.

本例为QHostInfo解析域名方法的其中之一,即可阻塞式方法。另外一种是使用信号与槽机制的非阻塞方法,实现原理类似,后续用到时另外开篇。

本篇到此,谢谢关注。

BeiTown
2013.05.02

QT 多线程(UI线程)间的signal/slot(信号与槽)通信

五月 1st, 2013 947 views

写这篇的时候感觉有点像写之前Android主线程与子线程间的通信消息队列,其实需要这么做的原因基本相同,即QT在主线程(UI线程)中某些阻塞行为会造成UI的更新的阻塞,举例来说,在UI线程中创建一个while循环,并在这个while循环中对UI进行更新,运行结果是UI完全无响应,因为UI线程一直卡在while中无法跳出来去完成更新,虽然它不断的得到了更新UI的通知。

因此在本篇中我们将通过多线程的方式来解决此类问题。

QT中已经替我们实现了一个线程类QThread,我们只需要继承它就好。使用时只需->start()即可。

1
2
3
4
5
6
7
8
9
10
class MyThread : public QThread
{
Q_OBJECT
public:
    MyThread();
signals://定义一个信号
    void sendString(QString);
protected:
    void run();
};

上面的代码简单实现了一个线程类的头文件,这里注意一下定义的signals(信号)。
信号与槽是QT特有的一个通信机制,简单阐述一下其运用在线程间的工作流程。
Read the rest of this entry »

C++网络安全工具编程(二)Web目录扫描器

四月 30th, 2013 136 views

我们知道对目标网站的访问是基于Http协议的,而Http又是基于TCPsocket连接的,所以本例中将会使用到上一节中的部分代码,即关于C++最简socket连接建立的Demo。
建立socket连接的过程请参考《C++网络安全工具编程(一)connect端口扫描器》中的基础部分。

当成功与目标服务器的80端口(即http服务端口)建立连接后,我们即可通过发送请求和接收消息来与目标网站服务器进行信息交互,大部分浏览器的实现也是基于此原理。

那么,应该怎样与目标网页服务器进行交互呢。这里我们需要先了解一下Http报文。

先来看下Http请求报文


(图来自网络)
Read the rest of this entry »

C++网络安全工具编程(一)connect端口扫描器

四月 28th, 2013 171 views

端口扫描的种类有很多,其中最简单的即为基于TCP三次握手协议的connect扫描器。其原理为与服务端口建立一个socket连接,当连接上时即可判断端口打开,之后断开连接,进行下一端口的试探。

首先来看一个最简的c++客户端与目标服务器建立socket连接的基础代码

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
#include "stdafx.h"
#include <string .h>
#include <winsock .h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    //初始化Windows Sockets 动态库

    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    {
        cout< <"找不到可使用的WinSock dll!"<<endl;
        return 1;
    }

    //创建套接字
    SOCKET sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(sClient==INVALID_SOCKET)
    {
        cout<<"创建客户端socket失败!"<<endl;
        return 1;
    }
    //连接服务器
    SOCKADDR_IN addrServ;
    addrServ.sin_family=AF_INET;
    addrServ.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addrServ.sin_port=htons(10046);

    if(connect(sClient,(sockaddr *)&addrServ,sizeof(sockaddr))==SOCKET_ERROR)
    {
        cout<<"连接服务器失败!"<<endl;
        closesocket(sClient);
        return 1;
    }
    else
        cout<<"连接服务器成功!"<<endl;
   
    //关闭套接字,释放资源
    closesocket(sClient);
    WSACleanup();

    return 0;

Read the rest of this entry »