大象笔记

知者行之始,行者知之成

堪称良心云,老客户不再是狗,199 入手了阿里云2核4G 5M 带宽服务器

早上收到阿里云的推广短信,说有 99 一年的 2核2G 3M的服务器优惠活动,而且还可以享受3次这个续费价格。活动截止 2014 年 3 月底。 说实话,99 一年我并没有心动,心动的是可以续费这么多次。 正好目前在用的这个服务器,今年,即 2014 年 11 月就到期了,我正愁每年续费的问题。现在续费一次是 2000 多一年,配置为 2c4g 3M 带宽。我觉得非常不合算。 于是赶紧打开了阿里云官网看看具体的活动细节。活动地址: 阿里云ECS11月销量王 99元/年 跳过前面的幻兽帕鲁服务器活动,下面就是 99 每年的活动。 没想到发现了另一个更适合我的活动,就是这个2核4G 5M 带宽服 ...

阅读全文...

升级 rust 到最新版本

今天在安装 rust loco-cli 时,发现系统上的 rust 版本太低,无法安装相关依赖: package clap_derive v4.5.0 cannot be built because it requires rustc 1.74 or newer, while the currently active rustc version is 1.73.0 看了一下版本,确实是 1.73.0 版本。 $ cargo --version cargo 1.73.0 (9c4383fb5 2023-08-26) 升级命令 rustup update 执行之后,就能看到所有 rust ...

阅读全文...

基于用友 U8 API 实现手持 Android 设备上的库存管理

需求背景 公司内部有一套用友 U8 的 ERP 系统,里面有仓库库存管理的功能。 库管人员希望能够加上手持 PDA (比如这个商米的设备:https://www.sunmi.com/zh-CN/v2s/),或者手机 App 扫码入库/打印标签的功能。 但是本地代理公司的开发费用非常离谱,所以公司考虑内部实现这个功能。于是查了一下 U8 相关的接口方案。 网上搜索了一下,资料真是少,而且这个行业非常 low,大部分能看到文档都是软文,和误导,让你去加他们联系方式,获取一个他们封装好的接口。问题是这么敏感的内部数据,怎么敢使用这类小作坊的接口层(涉及到账号密码的提交)。 API 接入方式 1: O ...

阅读全文...

企业内部系统的统计报表实现方案选型

今年的工作重点变成了公司内部的企业数字化开发。说得更具体点,就是搞一些: 销售管理 CRM 仓库管理 生产计划任务管理 各种 ERP OA 集采平台数据打通 ... 任务繁杂,需求不明确,没有人手。看起来无比头疼,非常不想介入这些事情。因为最近看的一本书里说的非常有道理,如果一个项目对于最终客户体验没有任何改善,那么就不要去自己实现,例如,内部的这些信息化系统。 牢骚这么多,进入正题。 需求 将 CRM 中的合同等数据做统计报表,分行业,分产品,分销售部门/个人统计,方便老板及管理层查看。 为何要选型 由于是使用了开源的 CRM,所以如果要在上面直接二次开发一些统计功能页面,实际上,梳理代 ...

阅读全文...

升级 Android App API 级别

有近一年没有打开 Google Play Console 了,最近打开,发现一堆警告信息,大部分是: 请在 2023年8月31日之前更新您的目标 API 级别,以发布应用的更新 警告内容 我们检测到您的应用以旧版 Android 为目标平台。为了向用户提供安全可靠的使用体验,Google Play 要求所有应用都必须符合目标 API 级别要求。 自 2023年8月31日起,如果您的目标 API 级别不是在最新 Android 版本发布日期前 1 年内推出的,您将无法更新应用。 如需继续更新应用,请确保您的应用以 Android 13(API 级别 33)为目标平台。 目前最新的 andro ...

阅读全文...

《岩田先生:任天堂传奇社长如是说》

过年期间为了看一本编程的书续费了微信阅读会员,程序写完了,发现会员就没啥用了,为了不浪费找了本书看看,就是这本《岩田先生:任天堂传奇社长如是说》,没想到意外的好。原书推荐一读。 看完之后,有点意犹未尽,在 B 站上找了一些关于岩田聪(后面统称聪哥)的视频,比如这部著名的 GDC 2005 上的演讲。 https://www.bilibili.com/video/BV1FA41147j7 On my business card, I am a corporate president. In my mind, I am a game developer. But in my heart, I a ...

阅读全文...

对话机器人 Rasa(三十四): Socket.IO channel 设置 session id

在之前的 Rasa 笔记中记录过 Sender ID 的使用,即 session id 的管理: 对话机器人 Rasa(十二):用户会话 Session 管理 对于基于 HTTP 的自定义渠道,session id 比较好处理,直接获取请求中的 sender 等自定义的字段值即可。 但是,对于基于 socket.io channel 来说,代码修改相对复杂一些,还有额外的概念。这里记录一下。 session_persistence 参考官方文档: https://rasa.com/docs/rasa/connectors/your-own-website/ socketio: user_m ...

阅读全文...

对话机器人 Rasa(三十三): 测试 socket.io channel 异步返回多条消息

测试场景 向 rasa server 发送一条消息,除非一连串的耗时操作,每个操作执行前都返回一条消息。 即,客户端发送一条聊天消息,rasa 机器人间隔返回多条消息回复。 同时作为统一消息格式的测试工具。 客户端模拟 本来打算用 python socket.io client 实现,但是考虑到目前大部分使用场景都是基于浏览器。 所以还是基于 html js 来实现一个客户端更合适。 也顺便把 socket.io 版本的 chatui.io 聊天界面实现。 测试逻辑 建立 socket.io 连接 建立连接后,发送消息,触发指定的 rasa custom action rasa custom ...

阅读全文...

对话机器人 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 ...

阅读全文...