Windows,软件应用
Windows 编程

HBuilder 免安装调试方法探究

关于HBuilder基座的分析可以看:https://www.iwonmo.com/archives/1414.html

本质上是一个webview,而每次保存adb都会push到私有目录下的www目录,然后进行重运行。

命令行如下:

parent_pid:612
cmdline:'c:\users\wonmo\desktop\hbuilderx.1.8.1.20190330.full\hbuilderx\plugins\launcher\tools\adbs\adb.exe -s 022TDM1481004885 push C:\Users\wonmo\Documents\HBuilderProjects\d\unpackage\dist\dev\app-plus/. /sdcard/Android/data/io.dcloud.HBuilder/apps/HBuilder/www/'
image_base:0x0000000000400000
image_size:0x00113000

这种方式每次都要把vue编译后的文件上传到www。在想有没有更简便的方式,结合前段时间分析微信的开发者工具https://www.iwonmo.com/archives/1539.html尝试了一种方法。

流程:

屏幕快照 2019-03-31 上午11.43.44.png


编辑器搭建http环境,手机收到广播,判断广播类型,webview重新加载http地址。

实现:

发送

屏幕快照 2019-03-31 上午11.26.03.png

接收

屏幕快照 2019-03-31 上午11.26.20.png

redis 长连短连区别

PHP_REDIS_API int
redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
{
    zval *object;
    char *host = NULL, *persistent_id = "";
    zend_long port = -1, retry_interval = 0;
    strlen_t host_len, persistent_id_len;
    double timeout = 0.0, read_timeout = 0.0;
    redis_object *redis;
#ifdef ZTS
    /* not sure how in threaded mode this works so disabled persistence at
     * first */
    persistent = 0;
#endif
    //获取传入参数
    if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
                                     "Os|ldsld", &object, redis_ce, &host,
                                     &host_len, &port, &timeout, &persistent_id,
                                     &persistent_id_len, &retry_interval,
                                     &read_timeout) == FAILURE)
    {
        return FAILURE;
    } else if (!persistent) {
        persistent_id = NULL; //如果是0的话则代表短连接 则先置空 redis_sock_create里 会把它清掉 不然的话 会复用
    }
    //连接超时
    if (timeout < 0L || timeout > INT_MAX) {
        zend_throw_exception(redis_exception_ce,
            "Invalid connect timeout", 0 TSRMLS_CC);
        return FAILURE;
    }
    //读取超时
    if (read_timeout < 0L || read_timeout > INT_MAX) {
        zend_throw_exception(redis_exception_ce,
            "Invalid read timeout", 0 TSRMLS_CC);
        return FAILURE;
    }
    //重来超时
    if (retry_interval < 0L || retry_interval > INT_MAX) {
        zend_throw_exception(redis_exception_ce, "Invalid retry interval",
            0 TSRMLS_CC);
        return FAILURE;
    }
    //判断是否是UNIX套接字
    /* If it's not a unix socket, set to default */
    if(port == -1 && host_len && host[0] != '/') {
        port = 6379;
    }
    //获取redis对象
    redis = PHPREDIS_GET_OBJECT(redis_object, object);
    //如果已经有一个sock对象,则先关闭这个对象,并且清理掉对象内容
    //这里要注意,如果你是一个长连接 redis_sock_disconnect 是不会关掉的链接的
    //而redis_free_socket会释放掉sock属性
    //所以说如果你是长连接的话,你连接的实例是不会被关闭的,但是你的部分参数会被清掉。
    /* if there is a redis sock already we have to remove it */
    if (redis->sock) {
        redis_sock_disconnect(redis->sock, 0 TSRMLS_CC);
        redis_free_socket(redis->sock);
    }
    //创建一个sock对象 这里把sock覆盖掉,如果是长连接的话 redis这个实例是不会被覆盖掉的,这里的sock可以理解为是一个参数对象
    redis->sock = redis_sock_create(host, host_len, port, timeout, read_timeout, persistent,
        persistent_id, retry_interval);
    //连接sock 如果是长连接的话 会直接返回0  如果是短连接的话 才会再次去以新的数据链接
    if (redis_sock_server_open(redis->sock TSRMLS_CC) < 0) {
        if (redis->sock->err) {
            zend_throw_exception(redis_exception_ce, ZSTR_VAL(redis->sock->err), 0 TSRMLS_CC);
        }
        redis_free_socket(redis->sock);
        redis->sock = NULL;
        return FAILURE;
    }
    return SUCCESS;
}


函数层级判断

前段时间我为Penu https://www.iwonmo.com/archives/1444.html 增加了函数功能,现在我想完成套嵌的编写方法。于是需要知道函数的层级数,以便执行函数。


      // TODO: code your application's behavior here.
        CString strHello;
        strHello=("Var=_Var(1)&ArrFun=_ArrFun(_RandFun(_ArrFun(2,3),_ArrFun(2,3)),3)&RandFun=_RandFun(_ErJI(),10)");
        CStringArray d,x,z,n;
        CString str;
        bool t=false;
        for (int i=0;i<strHello.GetLength();i++) {
            CString f(strHello[i]);
            if(f=="_") {t=true;str="";}
            if(t==true ) str+=strHello[i];
            if(f=="(") {
                t=false;
                if(str!=""){
                    d.Add(str.Left(str.GetLength()-1));
                    d.Add("(");
                    str="";
                }
            }
            if( f==")") d.Add(f);

        }

        //  此时d 为最小token

        int k=0;
        for(i=0;i<d.GetSize();i++){
            if(d.GetAt(i)=="(") k++;
            else if(d.GetAt(i)==")") k--;
            else if(d.GetAt(i) !="(" && d.GetAt(i) !=")"){
                if(k>=0){
                    x.Add(d.GetAt(i));
                    CString p;
                    p.Format("%d",k);
                    n.Add(p);
                }else{
                    k=0;
                }   
            }
        }

        // 此时 x 为 函数 n为函数层级 层级越大 越先执行

        for(i=0;i<x.GetSize();i++)

            printf("函数: %s,层级: %s\r\n",x.GetAt(i),n.GetAt(i));  

        printf("---\r\n");

        //排序

        for( i = 0; i < n.GetSize(); i++)
        {
            for(int j = i+1; j < n.GetSize(); j++)
            {
                if(_ttoi(n.GetAt(i))<_ttoi(n.GetAt(j)))
                {
                    CString t=x.GetAt(i);
                    x.SetAt(i,x.GetAt(j));
                    x.SetAt(j,t); 
                    t=n.GetAt(i);
                    n.SetAt(i,n.GetAt(j));
                    n.SetAt(j,t); 
                }
            }
        }

        for(i=0;i<x.GetSize();i++)

            printf("函数: %s,层级: %s\r\n",x.GetAt(i),n.GetAt(i));


屏幕快照 2019-02-01 下午5.26.41.png

会测接口测试工具(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