Windows
Windows 编程

会测接口测试工具(H.Test)

    微信截图_20190221102029.png

帮助文档

视频说明  文档说明  运行库(2017)  文件安全  码云历史

如系统为精简版或无法运行提示Dll问题,可打开运行库,选择Visual Studio 2017安装。

    函数说明

    Base64函数:_G64(all) | _U64(all)

        参数:

            all:所有可输入字符

        注:_Gxx:GB2312编码、_Uxx:UTF-8编码

    递增函数:_Var(num)

        参数:

            num:初始值。会在此值的基础上累加

    数组函数:_ArrFun(star,end | num)

        参数:

            star:字典开始位置【1】

            end:字典结束位置

        参数:

            num:直接索引

        字典格式:

            1,2,3,4,5  [字典为根目录下的ArrFun.txt]

    随机函数:_RandFun(num,len)

        参数:

            num:1:数字  2:字母  3:数字+字母

            len:返回文本长度

    随机整数函数:_NumFun(star,end)

        参数:

            star:开始数

            end:结束数

    函数使用

    新建php代码:

    <?php
        $ret=' | _Var:'.$_POST['Var'].
        ' | _ArrFun:'.$_POST['ArrFun'].
        ' | _RandFun:'.$_POST['RandFun'];
        exit($ret);

    POST数据格式:

    Var=_Var(1)&ArrFun=_ArrFun(1,3)&RandFun=_RandFun(3,10)

    返回结果:

    22:00:47[277]    | _Var:17 | _ArrFun:广州 | _RandFun:0joaoO46L7

    22:00:47[277]    | _Var:21 | _ArrFun:深圳 | _RandFun:tQVv3B8p5s

    ...

    22:00:47[277]    | _Var:9 | _ArrFun:上海 | _RandFun:7aqX44Cco5

    22:00:47[277]    | _Var:23 | _ArrFun:上海 | _RandFun:9aEQArrFPc

    更新日志


    SplitField

    将建表语句复制到剪贴板,然后打开SplitField就可以显示所有的字段,然后选择性的勾选就好了。建表语句可以直接从Navicat查看与复制。主要用于联查或子查询等一些需要选择字段的情况


    技术栈:Jdk1.8+Gradle   支持:win+osx




    2019.1.1  SplitField.zip

    增加对enum类型的分析

    修复剪贴板为空自动退出问题



    兼容版本:SplitField.jar.zip

    Win右键版本:SplitField.zip


    编写语法分析器分析Mysql字段

    看了一段时间的开发语言类的书籍,写了个小的例子,它定义了Mysql创建语句的语法表达式,实现了一个最小的语法解析器。


    语法分析器原理图(个人理解):


    开始.png


    Mysql语句:

    CREATE TABLE `fa_category` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '父ID',
      `type` varchar(30) NOT NULL DEFAULT '' COMMENT '栏目类型',
      `name` varchar(30) NOT NULL DEFAULT '',
      `nickname` varchar(50) NOT NULL DEFAULT '',
      `flag` set('hot','index','recommend') NOT NULL DEFAULT '',
      `image` varchar(100) NOT NULL DEFAULT '' COMMENT '图片',
      `keywords` varchar(255) NOT NULL DEFAULT '' COMMENT '关键字',
      `description` varchar(255) NOT NULL DEFAULT '' COMMENT '描述',
      `diyname` varchar(30) NOT NULL DEFAULT '' COMMENT '自定义名称',
      `createtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
      `updatetime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
      `weigh` int(10) NOT NULL DEFAULT '0' COMMENT '权重',
      `status` varchar(30) NOT NULL DEFAULT '' COMMENT '状态',
      PRIMARY KEY (`id`),
      KEY `weigh` (`weigh`,`id`),
      KEY `pid` (`pid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='分类表';


    词法分析:

    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.List;
    /**
     * 词法分析器 注:会分析出非终结符
     */
    public class lexicalAnalysis {
        /**
         * 分析出终结符或者非终结符
         * @param codeStr
         * @return
         */
        public static List<String> lex(String codeStr){
            //词法Token
            List<String> lexToken=new ArrayList<String>();;
            if("".equals(codeStr)) return null;
            String orignal = null;
            try {
                String tmpToken="";
                //对中文进行处理
                orignal = new String(codeStr.getBytes(), "UTF-8");
                for (int i = 0; i < orignal.length(); i++) {
                    String ch =String.valueOf(orignal.charAt(i));
                    if(ch.equals(" ") || ch.equals("(") || ch.equals(")"))
                    {
                        if(!tmpToken.equals("")){
                            lexToken.add(tmpToken);
                            tmpToken="";
                        }
                    }
                    else
                    {
                        tmpToken=tmpToken+ch;
                    }
                }
                //追加上最后一个临时Token
                if(!tmpToken.equals("")) lexToken.add(tmpToken);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return null;
            }
            //返回词法Token
            return lexToken;
        }
    }


    效果:

    词法分析-示例.png


    语法解析:

    import java.util.List;
    /**
     * 解析指定表达式的语法分析器
     */
    public class syntaxParsing {
        /**
         * 分析字段的语法解析器
         *
         * @param curr 当前的字段
         * @param nex  下一个字段
         * @return 是否是产生式
         */
        public static boolean parsing(String curr, String nex) {
            /**
             *  ①明确匹配产生式
             *  ②这里简单的认为:字段定义:字段类型 即为字段定义的产生式
             *  ③字段定义展开的产生式:重音符:字段名:重音符
             *  ④字段类型展开的产生式:内部字段名:参数(可选)
             **/
            if (curr.length() > 3)
                if (curr.substring(0, 1).equals("`")  && curr.substring(curr.length() - 1, curr.length()).equals("`") && internalType(nex))
                    return true;
                else return false;
            else return false;
        }
        /**
         * 判断Token是否是内部定义的类型
         *
         * @param nex 需要判断的Token
         * @return
         */
        public static boolean internalType(String nex) {
            /**
             * 这里不再对类型定义做产生式,而是粗略的进行判断
             */
            //转换为小写
            String i_nex = nex.toLowerCase();
            //判断是否是内部定义类型 :类型定义提取自nacicat for mysql
            switch (i_nex) {
                case "tinyint":
                    return true;
                case "smallint":
                    return true;
                case "mediumint":
                    return true;
                case "int":
                    return true;
                case "integer":
                    return true;
                case "bigint":
                    return true;
                case "float":
                    return true;
                case "double":
                    return true;
                case "char":
                    return true;
                case "varchar":
                    return true;
                case "tinyblob":
                    return true;
                case "tinytext":
                    return true;
                case "blob":
                    return true;
                case "text":
                    return true;
                case "mediumblob":
                    return true;
                case "mediumtext":
                    return true;
                case "longblob":
                    return true;
                case "longtext":
                    return true;
                case "date":
                    return true;
                case "time":
                    return true;
                case "year":
                    return true;
                case "datetime":
                    return true;
                case "timestamp":
                    return true;
                case "set":
                    return true;
            }
            return false;
        }
    }


    效果:

    语法解析.png

    源代码:https://github.com/iwonmo/Mysql-field-parsing

    谷歌浏览器离线游戏辅助编写

    以离线模式访问谷歌浏览器,会出现一个小鳄鱼的游戏,其玩法就是通过跳动躲避障碍物来得分。


    微信截图_20181023134458.png


    写了一个小的辅助软件。原理如下:


    20181023113557.png


    通过判断屏幕坐标点的颜色值来得到是否是有障碍物,如果存在障碍物则像谷歌浏览器发送跳动事件,让其自动跳起。


    红色:物体从右往左滑入可视区域可判断的点。

    蓝色:判断的位置。


    代码:

    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    Dim lngTmp As Long
    Private Sub Form_Load()
        Timer1.Interval = 100
    End Sub
    Private Sub Timer1_Timer()
        lngTmp = GetDC(0)
        If GetPixel(lngTmp, 280, 316) = 5460819 Or GetPixel(lngTmp, 289, 313) = 5460819 Or GetPixel(lngTmp, 296, 314) = 5460819 Or GetPixel(lngTmp, 292, 314) = 5460819 Then
            Call keybd_event(&H26, 0, 0, 0)
            Call keybd_event(&H26, 0, &H2, 0)
        End If
    End Sub


    优化:由于这个小游戏的障碍物有高有低,还有在顶端的障碍物,宽窄更不一样。所以判断的点可以选取多个。


    效果:

    1540273893204199.gif

    一款小游戏的算法

    屏幕快照 2018-10-17 下午10.45.55.png


    上述是一个小游戏的界面,也是我最近玩的游戏。玩的久了就寻思它怎么实现的。


    效果:每次手势移动,自身圆圈就会逐个随着移动改变位置。


    界面:


    屏幕快照 2018-10-17 下午10.41.30.png


    上述界面是用Visual Basic 建的一个简单样式。实际每个圆圈对应数组的一个节点,所有的圆圈形成一个竖状的移动标识,也就是玩家自己。每次移动手势,从顶部自上而下逐个会产生移动,如果手势移动的过快,上次的手势不会清除,也就是说每次移动都会产生动画,直到所有的手势移动完毕。


    思路:保存进数组结构或其它链式结构中。每次移动产生的位置信息存储入结构,另外一个死循环的线程不断的去查询这个数组,然后进行所有的界面移动。这里可以添加一些延迟。如果是用cocos2dx引擎来做,那可以添加一些特效。


    源码:


    Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
    Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
        Dim point as integer
        ReDim preserve point(1 To 1)
        point(UBound(point)) = 1
        ReDim preserve point (1 To UBound(point) + 1)
        point(UBound(point)) = 2
        While 1 '注意这个循环建议放在线程中进行操作。
            Dim l
            If IsArray(point) Then
                goto nextMark
            End If
            l = point(LBound(point))
            For i = 0 To Command1.UBound
                Command1.move(l)
            Next
            delArray point ,LBound(point)
        nextMark:
        Wend
    Function IsArray(ByRef arr() as integer) as bool
        Dim pMyarr as long
        CopyMemory pMyarr, ByVal VarPtrArray(arr), 4
        If pMyarr = 0 Then
            IsArray = True
        Else
            IsArray = False
        End If
    End Function
    Function delArray(byref arr() As Integer, index As Integer)
        For i = index To UBound(arr) - 1
            arr(i) = arr(i + 1)
        Next i
        ReDim Preserve arr(UBound(arr) - 1)
    End Function



    地图滚动可以参考我以前写的一个游戏:http://www.iwonmo.com/letitfall.apk