使用公有云云函数创建自己的消息提醒服务

之前一直使用Server酱的消息提醒服务,前一段时间微信发布了公告模板消息可能会在21年4月份下线,到时候Server酱的提醒服务也会受到影响,虽然Server酱已经提供了Turbo版加入了企业微信的支持,利用企业微信的消息提醒实现在微信中提醒,但是Turbo版也加入了相关的限制(如每天最多5条消息提醒)。

不论是server酱还是自己建立的消息提醒,本质都相当于对企业微信的提供的API进行了封装。其实完全可以直接使用企业微信的API,不过使用起来会复杂一些。既然只是对API进行封装,为什么不自己封装一下建立自己的消息提醒服务呢?

目前各大公有云都提供了Severless服务(云函数),完全可以使用云函数完成对API的封装。我这里使用的是腾讯云,其他公有云的操作也类似。

步骤1:企业微信相关配置

PS:相关说明直接copy hostloc论坛@arron说明:https://shimo.im/docs/38dpjtwWtRRVQ6Wy/read

第一步,注册企业

用电脑打开企业微信官网,注册一个企业

第二步,创建应用

注册成功后,点「管理企业」进入管理界面,选择「应用管理」 → 「自建」 → 「创建应用」

应用名称填入「Server酱」,应用logo到这里下载,可见范围选择公司名。

创建完成后进入应用详情页,可以得到应用ID( agentid ),应用Secret( secret ),复制并填到上方。

第三步,获取企业ID

进入「我的企业」页面,拉到最下边,可以看到企业ID,复制并填到上方。

推送UID直接填 @all ,推送给公司全员。

第四步,推送消息到微信

进入「我的企业」 → 「微信插件」,拉到下边扫描二维码,关注以后即可收到推送的消息。

步骤2:云函数相关设置

1.新建一个云函数,语言可以选择python、go、java、nodejs等,这里我使用的是python3.6

加入代码(其实比较简单),已经放在了GitHub,https://github.com/yjcn/msg_server/,防止有的同学没法访问我也在博客里粘一下

# -*- coding: utf8 -*-
import os
import json
import requests
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# 从环境变量获取相关id
CORPID = os.environ['corpid']
AGENTID = os.environ['agentid']
CORPSECRET = os.environ['corpsecret']
# 相关id设置 
# corpid = 'xxx'  # 企业id
# agentid = 'xxx'   # 应用id
# corpsecret = 'xxx' # 企业secret

# 企业微信 api url
MSG_URL = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}'

# text_card template
text_card_dict = {
       "touser" : "@all",
       # "toparty" : "PartyID1 | PartyID2",
       # "totag" : "TagID1 | TagID2",
       "msgtype" : "textcard",
       "agentid" : AGENTID,
       "textcard" : {
                "title" : "领奖通知",
                "description" : "<div class=\"gray\">2016年9月26日</div> <div class=\"normal\">恭喜你抽中iPhone 7一台,领奖码:xxxx</div><div class=\"highlight\">请于2016年10月10日前联系行政同事领取</div>",
                "url" : "URL",
                            "btntxt":"更多"
       },
       "enable_id_trans": 0,
       "enable_duplicate_check": 0,
       "duplicate_check_interval": 1800
    }

def get_access_token():
    url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={}&corpsecret={}".format(CORPID, CORPSECRET)
    resp = requests.get(url=url)
    resp_dict = resp.json()
    access_token = None
    if resp.status_code == 200:
        access_token = resp_dict['access_token']
    return access_token
def main_handler(event, context):
    logger.info("Received event: " + json.dumps(event, indent = 2))
    logger.info("Received context: " + str(context))
    # 解析请求参数
    queryString = event['queryString']
    msg_title = queryString.get('text',None)
    msg_desp = queryString.get('desp', msg_title)
    text_card_dict['textcard']['title'] = msg_title
    text_card_dict['textcard']['description'] = msg_desp
    # logger.info(str(text_card_dict))
    # 获取access_token
    access_token = get_access_token() if msg_title is not None else None
    resp_status = 400
    resp_json = dict()
    if access_token is not None:
        resp = requests.post(url=MSG_URL.format(access_token),json=text_card_dict)
        resp_status = resp.status_code
        resp_json = resp.json()
    return {
        "isBase64Encoded": False,
        "statusCode": resp_status,
        "headers": {'Content-Type': 'application/json'},
        "body": json.dumps(resp_json)
    }

2.设置环境变量

在函数管理-函数配置里设置环境变量,把第一步获取到的agenid(应用id)、corpid(企业id)、corpsecret(企业secret)设置为云函数的环境变量。(当然也可以直接在云函数里直接写好。)

3.创建API触发器

建立好云函数数后,点击触发管理,创建API网关触发

创建好之后,就可以使用POST或者GET的方式访问建立的API链接(访问路径的链接),与sever酱相同,text为消息的标题,desp为具体的消息描述,访问完之后就会微信就会收到消息提醒。

除了使用默认的访问路径,还可以在API网关-服务-自定义域名里设置自定义域名,具体设置可以查看说明文档。

PS:目前的代码只实现了基本的功能,欢迎大家继续提PR继续完善

Intel NCS2计算棒以及OpenVINO尝鲜

1.什么是Intel NCS2 计算棒

NCS 是 Neural Compute Stick的缩写,2表明这是第二代产品,就像他的名字NCS是用来加速神经网络计算的,网络训练好之后,从输入得到输出的过程称为前向计算,NCS就是来加速这一部分的计算的。

2.计算棒性能测试

在Intel网站看了计算棒的相关资料,计算棒需要配合Intel出的OpenVINO推理框架,使用时首先需要将模型文件转换为OpenVINO的模型。OpenVINO目前支持Caffe、TensorFlow、MXNet等主流的深度学习框架。

5.png

OpenVINO推理框架使用基本没有什么需要注意的,按照官方的教程直接操作就可以,我是在Windows 10系统上进行测试的,安装时需要Visual Studio 2015以上版本、CMake、OpenCV等。

之前使用检测的模型是使用MXNet训练的,模型可以直接通过OpenVINO的转换工具进行转换。转换时需要输入网络输入节点的名称以及输入图片的大小,还有一点需要注意,NCS 2计算棒支持的是16位精度的浮点型数据,所以在转换时还需要加上”–data_type=FP16”。

OpenVINO框架的示例中已经提供了SSD的相关程序,完成模型转换后可以使用SSD的示例程序进行测试。这里我拿之前训练的SSD 300模型进行了测试,由于之前模型训练时输入图像为RGB通道,示例程序中默认的是BGR通道,所以还需到对示例程序加入通道转换。

通过实际测试发现,在OpenVINO框架中使用NCS 2计算棒和直接使用CPU性能差不多,使用CPU(Intel Core i5 4200M)时,检测一帧需要660ms,使用NCS2计算棒需要590ms。但是在OpenVINO框架中使用CPU速度要比在MXNet中使用CPU快,MXNet中使用CPU检测一帧需要1.1s左右。

SSD 300 VGG16

框架 运算设备 一帧耗时
MXNet CPU(Intel i5 4200M) 1.1s
MXNet GPU(Nvidia GT730M) 300ms
OpenVINO CPU(Intel i5 4200M) 660ms
OpenVINO NCS 2计算棒 590ms

PS:除了OpenVINO,计算棒还有一个单独的NCSDK,但是NCSDK目前只支持1代的计算棒,实际试了下,使用2代计算棒运行NCSDK的示例程序会提示打开设备错误。

3.总结

经过实际测试感觉NCS2的性能并没有我预期中的那么好,测试下来性能基本和CPU差不多,所以在PC还是老老实实用GPU吧,如果树莓派这样的嵌入式设备上还是有一定的加速效果的,OpenVINO倒是让我觉得眼前一亮,前向计算能基本比mxnet框架快一倍。

使用MingW-w64 编译 64bit Qt5

现在Qt官方提供的mingw编译器的预编译版本都是32bit的,如果想使用64bit的话需要自己手动进行编译。

自己编译的话只需要下载mingw-w64编译器和Qt的源码,之前在官方Wiki上看到还需要Perl,实际测试发现没有Perl也可以正常编译。

mingw-w64直接去mingw-w64官网下载就可以了,选择MingW-W64-builds下载。安装时记得架构记得选择x86_64,版本的话选择最新的就可以了,我编译时使用的是8.1.0没有问题。

Qt源码的话也去Qt官网下载,5.9.6版本的下载地址为http://download.qt.io/archive/qt/5.9/5.9.6/single/qt-everywhere-opensource-src-5.9.6.zip,其他版本的可以到http://download.qt.io/archive/qt/ 到对应目录下载,如果下载预编译版本不想注册的话也可以直接从这里下载安装包。

下载好Qt安装包后直接进行解压,解压完成后需要注意默认解压出的路径比较长比如E:\qt-everywhere-opensource-src-5.9.6\qt-everywhere-opensource-src-5.9.6,mingw存在bug,太长的路径编译会报错,找不到相应的头文件’ No such file or directory #include “… qfreetypefontdatabase_p.h”‘。

解压完成后,在源文件夹目录新建以下bat脚本,QtPrefixDir为执行make install命令时安装的目录、MingwDir为安装的mingw-w64的路径。

以上的编译的是动态链接库,如果要静态链接库的话可以用下面的脚本。

 

参考资料:

https://wohlsoft.ru/pgewiki/Building_Qt_on_MinGW-w64

https://bugreports.qt.io/browse/QTBUG-64298

使用mxnet c_predict_api实现SSD前向检测

Github上找到了一个别人写的基于c_predict_api实现的ssd 但是这个版本的GetImageFile函数有问题,导致检测结果不正确,经过将近一周时间的的排除才发现了问题的所在(吐血)。下面是正确的代码(mxnet大法好!!!!!!!)

 

windows命令提示符中鼠标选中文字导致程序挂起问题

在windows命令提示符中运行程序  当用鼠标选中程序输出的内容时会导致程序挂起问题。

这个问题是命令提示符的锅,可以修改命令提示符的属性  取消快速编辑模式和插入模式

这样就无法在命令提示符中选择文字了 也就不会导致程序挂起了 。如果还有什么好的解决方法欢迎大家一起交流。\

参考:

在控制台窗口用鼠标选中一段文字会导致 Domino 服务器挂起

linux 新建swap分区

1.创建要作为swap分区的文件:增加1GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)。
dd if=/dev/zero of=/root/swapfile bs=1M count=1024

2.格式化为交换分区文件:
mkswap /root/swapfile #建立swap的文件系统

3.启用交换分区文件:
swapon /root/swapfile #启用swap文件

关闭swapoff

4.使系统开机时自启用,在文件/etc/fstab中添加一行:
/root/swapfile swap swap defaults 0 0

Windows 10下使用MinGW编译opencv 3.3

https://www.cnblogs.com/shushanxiaoyao/p/6179824.html

https://wiki.qt.io/How_to_setup_Qt_and_openCV_on_Windows

http://blog.csdn.net/scien2011/article/details/52830794

https://wiki.qt.io/OpenCV_with_Qt

https://ricky.moe/2017/06/17/qt5-6-2-opencv3-1-integration/

 

问题

http://blog.csdn.net/cnbloger/article/details/77609108

https://stackoverflow.com/questions/41918477/how-to-build-opencv-3-2-0-with-mingw-on-windows