Windows
Windows 编程

codeblock dlib gcc

Code::Blocks gcc 编译 dlib 方法

注意:gcc需要是支持C++11 并且 thread model是posix不能是win32。

打包文件,回复后下载

阅读全文»

微擎:小程序上传图片重定向问题

调用wx.uploadFile总是返回如下代码

<!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">
    </head>
    <body>
        <script type="text/javascript">
            var ua = navigator.userAgent.toLowerCase();
            var isWeixin = ua.indexOf('micromessenger') != -1;
            var isAndroid = ua.indexOf('android') != -1;
            var isIos = (ua.indexOf('iphone') != -1) || (ua.indexOf('ipad') != -1);
            if (!isWeixin) {
                document.head.innerHTML = '<title>抱歉,出错了</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0"><link rel="stylesheet" type="text/css" href="https://res.wx.qq.com/open/libs/weui/0.4.1/weui.css">';
                document.body.innerHTML = '<div class="weui_msg"><div class="weui_icon_area"><i class="weui_icon_info weui_icon_msg"></i></div><div class="weui_text_area"><h4 class="weui_msg_title">请在微信客户端打开链接</h4></div></div>';
            }
        </script>
    </body>
</html>

百思不得其解,上网查询也是无果,没有办法只能看下HTTP请求包。

微信截图_20190523173447.png可以看到被302重定向了,后端上传代码里并没有重定向操作,所以查看了下标识,发现MicroMessenger。猜测应该是被微擎重定向了。

微擎源代码里有这么一段:

// 检查是否在微信中打开
public static function isMicroMessage($agent = '')
{
    $agent = self::getAgent($agent);
    if (stripos($agent, 'MicroMessenger') !== false) {
        return self::MICRO_MESSAGE_YES;
    } else {
    return self::MICRO_MESSAGE_NOT;
    }
}

会检查你的agent,如果包含MicroMessenger则会当成是在微信中打开。然后调用getOauthCodeUrl|getOauthCodeUrl去获取你的微信信息。所以会造成重定向。

修改微信开发者工具,将请求头改掉

333.png然后上传成功

微信截图_20190523173600.png

真实的环境下,一般会存在第三方存储服务商,所以不会发生这种情况。如果你要在微擎里改掉授权操作,那么很有可能出现一系列问题,所以还是建议在微擎外写一个上传接口。

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