大象笔记

知者行之始,行者知之成

又到了每年双十一纠结阿里云服务器如何续费的时间 (2023版)

目前用的阿里云服务器是 2000 年双十一时参加活动购买的,买了3年。规格是 2 核 4G 内存,3M 带宽的版本。型号是 “共享标准型实例规格族s6”。 今年双十一正好到期。又要纠纷续费的问题了。纠结的原因无非就是太贵了。 续费价格 昨晚收到阿里云的推广邮件,说有一张3折的续费折扣券,但是只能续费1年。 限时续费1年3折,限1台1次 进入阿里云管理后台看,价格确实有点诱惑力,原价 ¥ 1839.60,折后 ¥ 788.40 今年,即 2023 年,阿里云优惠活动的地址是 2023阿里云金秋云创季-阿里云。 可以领一堆满减优惠券。 s6 的特点 s6的特点如下:相比上一代共享型实例规格族( ...

阅读全文...

react markdown 组件支持 table 表格渲染

发现默认安装的 react markdown 组件不支持 table 表格的渲染。 在官方文档里查了一下,需要安装额外的组件 remark-gfm 来支持 table 渲染。 安装 remark-gfm tyarn add remark-gfm 代码配置 import Markdown from "react-markdown"; import remarkGfm from "remark-gfm"; <div class="markdown_container"> <Markdown remarkPlugi ...

阅读全文...

Android 点击按钮显示悬浮菜单

需求 点击 Android 屏幕上的设置按钮,弹出一个悬浮菜单,显示具体的细分配置功能。例如: 时间设置 语言设置等 Material Design Menu 组件 https://github.com/material-components/material-components-android/blob/master/docs/components/Menu.md 也可用过输入框的下拉列表。 overflow, context, popup 的区别 Dropdown Menu 又细分为几种类型: Overflow menu: 溢出菜单,即 Android 界面右上角三个点,点开后显示 ...

阅读全文...

制作带轻柔背景音乐的人工语音提示音

需求背景 在 Android App 控制设备运行结束时,需要语音提示用户运行已结束。 文字转音频 https://ttsmaker.com/ 可以直接使用 TTSMaker 这个在线服务生成人工语音音频,这个服务非常赞,无需下载,也无需注册,而且免费。 里面中文语音支持多种 voices,甚至山东、四川方言,及粤语等。唯一遗憾的是,没有志玲姐姐的声音。 生成之后,还可以下载 mp3 文件。 下载轻柔背景音乐 单单是人工提示音,还是有点单调,可以再增加一段轻柔的背景音乐。 例如去这里: https://www.tukuppt.com/peiyueso/qingrou.html 但是下载需要注册 ...

阅读全文...

android AppCompatButton 设置背景图片

遇到一个奇怪的问题,在 Android 项目中给 Button 设置背景图片,总是不生效。 <Button android:background="@drawable/normal" android:text="OK"> </Button> 改用 androidx.appcompat.widget.AppCompatButton <androidx.appcompat.widget.AppCompatButton android:background="@drawable/normal" and ...

阅读全文...

Rasa in Docker: Could not load model due to Error deserializing graph schema

When deploying Rasa service in production Docker environment, error show: rasa.core.agent - Could not load model due to Error deserializing graph schema. Can't find class for graph component type 'rasa.graph_components.providers.forms_provider.FormsProvider' Reason This error typically occurs whe ...

阅读全文...

docker 容器的 timezone 时区设置

这里只列举目前用到的两种系统镜像 ubuntu 和 alpine 的时区配置方法。 宿主机为 Ubuntu。 ubuntu 镜像 这里以 rasa 的 ubuntu 镜像为例: timezone 和 localtime 文件映射一下宿主机的就可以了。 所以,前提是宿主机的配置是正确的。 action_server: image: rasa/rasa:3.4.6-full ports: - 5055:5055 environment: - ACTION_SERVER_SANIC_WORKERS=4 volumes: - ./:/app - /etc ...

阅读全文...

Android APP 设置版本号,并显示在界面上

由于给客户定制的 Android APP 不需要发布到应用商店,没有一套统一的版本控制渠道。 只能先通过人肉查看版本号的方式,将版本号显示在界面上。 设置版本号 app build.gradle 文件: 通过 versionCode 和 versionName 来配置 App 的版本号。 android { namespace 'com.sunzhongwei.app' compileSdk 33 defaultConfig { applicationId "com.sunzhongwei.app" minSdk 2 ...

阅读全文...

对话机器人 Rasa(二十六):生产环境支持多并发的配置

默认,Rasa 服务器只使用 1 个 worker。 对于生产环境,这肯定是不能接受的。 rasa 多并发 单机高并发设置 环境变量 SANIC_WORKERS 设置为 1 以上 默认 Rasa custom action server 也只使用 1 个worker。将环境变量 ACTION_SERVER_SANIC_WORKERS 的值设置为 1 以上 注意:locker store 的设置不是 InMemoryLockStore 时, 才可以启用多个 worker。 为何直接增加 worker 数量行不通 因为每一次请求的回复都需要基于对话的历史,而同一个用户的多个请求分散到多个 wo ...

阅读全文...

Android Kotlin 对字节 byte 中的某一位 bit 取反

Android Kotlin 中,需要对字节 byte 中的某一位 bit 取反 取反代码 fun toggleBit(byteValue: Byte, bitIndex: Int): Byte { // Convert the Byte to an Int to perform bitwise operations val intValue = byteValue.toInt() // Create a mask with the bit at the specified index set to 1 val mask = 1 shl bitIndex ...

阅读全文...

Android Studio 中修改 App 的包名

需求背景 一套 Android 蓝牙控制硬件设备的程序,每个客户端界面和逻辑都有比较大的差异,所以想分成 N 个 git 代码仓库进行管理。 为了方便测试,例如在一个 Android 平板上安装多套不用版本的 App 进行测试,就需要区分开每个 App 的包名。 修改流程: 改包名 Android 视图下,右键点击 java 目录下的 com.sunzhongwei.app,选择 refactor - rename , 修改成新的名称。 例如:com.sunzhongwei.app2 app build.gradle namespace, 及 applicationId 修改包名。 其他文件 ...

阅读全文...

Android LiveData 实战总结

这周在重构一个 Android 平板蓝牙控制的 App,之前为了赶工期,代码写的比较乱, 正好这段时间赶上多个客户的定制要求,发现要一套代码实现多套差异化的需求,如果代码不好好规整根本改不动。 自己欠的技术债,总归是要还的。 在改造的过程中,发现之前使用 LiveData 的方式有不少问题,总结一下: 逻辑不要放在 Fragment 中 能在 ViewModel 中处理的,尽量在 ViewModel 中处理。 Activity / Fragment 尽量只监听 LiveData, 然后直接显示,不做任何复杂的逻辑判断。 集中在 ViewModel 处理,逻辑更清晰。 多个 Fragment ...

阅读全文...