大象笔记

知者行之始,行者知之成

对话机器人 Rasa(三十二):新建一个基于 socket.io 的自定义 channel

在之前的笔记中,整理了如何新建一个独立的 channel 来区分不同的客户端类型。 对话机器人 Rasa(十九):rasa 不同客户端类型区分处理 custom channel 但是这个是基于 HTTP 协议的,无法实现实时双向消息通信。例如,在一个 rasa 请求中, 需要执行一系列耗时的操作,需要在每个操作执行前,向客户端发送一个提示, 这个需求,用 HTTP 的接口是无法实现的。而,基于 WebSocket 协议的 Socket.IO 则能很好的解决这个问题。 此外,在需要人工客服向客户端主动推送消息的场景下,Socket.IO 也优势尽显。 可见,在聊天机器人领域,Socket.IO ...

阅读全文...

系统重启时 docker 容器没有自启动问题排查

线上服务器环境,基于 docker 部署了一堆服务,虽然在 docker-compose.yml 中将各个服务配置了 restart: always 但是,实际测试发现,系统重启后,所有后期配置的 restart: always 的服务,都没有自启动。 只有一开始就设置了 restart: always 的服务,才自启动成功。 Google 搜索了一下,发现确实存在这个问题,对于这种容器,需要后期手动通过 docker 命令来更新配置,只修改 docker-compose.yml 是不够的。 检查指定容器当前配置的方法 docker inspect <your-container&gt ...

阅读全文...

flask socket.io 生产环境部署

eventlet 由于 WSGI 不支持 WebSocket,所以需要引入 eventlet 来支持 WebSocket 协议。 (虽然 socket.io 也支持 http 协议,但是体验上会差很多。) eventlet is the best performant option, with support for long-polling and WebSocket transports 而在开发环境,如果没有安装 eventlet,默认使用的是 Werkzeug web server: In production mode the eventlet web server is us ...

阅读全文...

flask socket.io 使用自定义 path 路径

默认路径 使用 flask socket.io 启动服务之后,默认的路径是: /socket.io 但是由于我把 rasa 和 flask socket.io 部署在同一个域名下, rasa 本身自带了一个 socket.io,所以我需要将 flask socket.io 在线上部署时, 更换一个路径,以做区分。 flask 端调整 通过 path 参数设置新路径 socketio = SocketIO(app, path="f_api_socket.io") 如果不设置 path 参数,就是默认的 socket.io。 浏览器 js 端调整 将原有的 var sock ...

阅读全文...

python socket.io 客户端测试代码

为了测试基于 flask 实现的 socket.io server 端的功能,除了使用浏览器端 js 测试之外,我还想看看诸如 python,C# 这样的客户端的实现是否支持 flask 的 session 机制。即是否能够正常获取到 session id。 经过测试,server 端确实可以正常获取到 session id。 代码 import socketio # 创建 Socket.IO 客户端实例 sio = socketio.Client() # 当连接成功时的处理函数 @sio.event def connect(): print("Connected to ...

阅读全文...

python flask web 框架安装 socket.io 模块

想基于 python 的 socket.io 实现实时消息,及在线状态检测。 同时兼容 rasa 的 socket.io 版本。 确认 rasa 对应的 socket.io 版本 > conda list socketio (rasa) # packages in environment at ~/miniconda3/envs/rasa: # Name Version Build Channel python-socketio 5.8.0 pypi_0 ...

阅读全文...

卖掉域名之后,不要忘记修改网站的 ICP 备案

中午吃饭的时候接到阿里云备案检查人员的电话,说我的一个域名对应网站的底部没有正确显示备案编号,需要处理。我一看那个域名是之前卖掉的域名,参考: 在阿里云上成功卖掉了一个闲置的域名 我说那个域名已经不是我的了,需要对备案做什么处理? 工作人员说是需要注销备案。 修改备案的必要性 我感觉还是有必要的,因为这个域名的买方,购买域名后,我看其搭建了一个盗版视频类的网站,应该是放到了海外服务器上。这个要是被版权方追责,估计就直接找到我这边了。还好没有出现问题。 所以,赶紧处理为妙。 注销备案流程 登录阿里云后台的 ICP 备案管理: https://beian.aliyun.com/pcContaine ...

阅读全文...

对话机器人 Rasa(三十一):Form 的进阶用法,动态话术及 slot

需求背景 例如,诊所之类的预约场景下,到店需要核对预约号码,与预约的身份证号码,两个数据匹配成功,才能进入下一步的操作。 这里用一个 form 包含两个 slot 来实现信息录入,看起来是典型的 form 使用场景,没什么可说的。 但是如果在输入预约号码后,需要拉取身份证的掩码格式,让用户填写掩码部分,以减少用户输入。那么就需要在输入第一个 slot 后,调用其他服务的 api,获取身份证掩码。然后影响到第二个slot 的 utter ask 提示话术内容。 第二个需求是,如果第一个 slot 输入的预约号码查询不到,就不需要再提示身份证号码的输入了。那么就变成了一个动态的 form。 第二个 ...

阅读全文...

SuiteCRM 修改菜单后报 500 错误,管理员无法进入系统

在使用 SuiteCRM 管理员在后台配置菜单,选择将所有菜单隐藏。。。不要问为什么,就是这样配置了。 然后管理员再也无法使用 SuiteCRM 了,登录之后就报 500 错误,无法使用,也无法恢复之前的配置。 其他用户倒是可以正常登录。 报错信息 从日志看起来确实是找不到菜单,导致报错: FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, null given in ...

阅读全文...

Android MPAndroidChart 实时曲线使用时间作为 X 轴

MPAndroidChart 确实强大,但是文档太少,需要自己踩坑。 在基于 MPAndroidChart 绘制手环传输过来的实时数据时,发现用时间(小时:分钟)作为横轴坐标,网上找到的示例代码都不好使。 不支持时间戳 如果直接使用 System.currentTimeMillis() 生成基于毫秒的时间戳作为 x 坐标,会发现 MPAndroidChart 根本无法展示,我不确定问题出在哪里。有两个推测: 数值太大,组件不支持 x 轴可能设置了刻度 (这个可能无关) 基于时间差解决 而使用简单一秒加 1 的计数器,却可以完美的展示实时需求,唯一的问题是,这种计数器的值无法转换为时间。 ...

阅读全文...

Android MPAndroidChart 动态显示曲线数据

MPAndroidChart 的示例大多数静态图表,没有实时显示曲线的变化的示例。 找到一个官方的说明: https://github.com/PhilJay/MPAndroidChart/wiki/Dynamic-&-Realtime-Data there are various methods that allow to either add or remove Entry objects to an existing DataSet or DataSet objects to/from an existing ChartData object 看来确实可以实现动态修改。 添加 ...

阅读全文...

SuiteCRM 中自定义功能的字段,及必填项

在 SuiteCRM 的管理员账号后台,系统设置里的工作室功能,可以自定义字段,也能修改字段是否必填。 不得不感叹 SuiteCRM 的功能还真是强大啊。 ...

阅读全文...