大象笔记

知者行之始,行者知之成

dp, sp, px 与 Android 界面布局自适应

之前写 Android 平板 App,由于没有正经写过 Android 界面布局,为了图省事, 直接用 px 像素做的布局,及字号大小设置。 好在平板是我们指定的型号,屏幕尺寸,及像素。但是自从发货到客户手中之后, 我就非常担心,一旦这款平板停产,换个更高分辨率的平板怎么办? 为了消除焦虑,我了解了一下 Android 布局的基础。 总结起来一句话: 字号用 sp,宽高用 dp。 问题简化 图片宽度用什么单位? dp 字号用什么单位?sp dp 是什么? dp 是怎么换算为 px 的? dp 是怎么换算为 px 的 android 中,dp 在渲染前,都会被转换成 px。 px = den ...

阅读全文...

Rust web 框架 axum (一): 安装及 hello world

为何要尝试 axum 最近在看两本 Rust 的教程,一本在早上上厕所时看,一本在班车上看/睡觉前看。这两个作者确实经验丰富,文笔也非常有趣,比刷抖音愉快多了。是个很好的放松方式。 但是光看不练,学习效率就很低,所以决定一边看书,一边写点 Rust 代码巩固一下。 虽然我对于 Rust 还没有实现的项目用途,但可以写一点 web 小工具,毕竟每天实际工作中每天都会遇到一些繁琐的手动操作需要自动化。之前学习 golang 就是,练手写了一个微信小程序的后台,写完后感觉对 golang 就尽在掌握了。。。这个小程序至今已积累了 30 万用户,日活 2k,也非常有成就感。 axum 简介 axum ...

阅读全文...

对话机器人 Rasa(二十八):添加逻辑的工作流/规范

总结的一些 Rasa 开发过程中的经验和技巧,持续更新中 ... 第一步:流程图/对话逻辑图 原始的流程是怎样的 新流程逻辑分支 1 是怎样的 新流程逻辑分支 2 是怎样的 新流程逻辑分支 N 是怎样的 新流程逻辑抽象合并 第二步:utter_xxx 回复内容 domain.yml 中补充新增的 utter。 因为有了 utter,剩下的任务就把逻辑串联起来。 与此同时,通过完成简单的小任务,减少项目进度焦虑。 utter_xxx 前加上 intent 方便在 domain.yml 内可以搜索到所有的逻辑,省去了去 stories / rules 文件中去查找逻辑对应关系。 例如: utt ...

阅读全文...

对于复杂业务逻辑代码的梳理方法

这两天遇到一个复杂的业务逻辑改动需求。 如果是第一次写,也许反而简单很多;但,现实是,需要在既有的逻辑代码上,去修改调整。 于是,我被难到了。。。 接到这个需求的第一天晚上,我看了半天,也整理了不少文档,硬是没有任何思路。 以为太晚了,可能大脑过于疲惫,于是拖到了第二天。但是第二天伊始,依旧没有头绪。 站立 & 纸和笔 恰好需要去车间跟设备进行现场调试,在等设备接线的过程中,我站在货架边,用纸和笔把逻辑梳理了出来。 没想到异常简单。。。 我觉得之前没有快速搞定,很大的问题在于陷入了之前代码的思维陷阱,总想着怎么在现有代码的基础上去改动。 而,用纸和笔快速梳理出来的根本原因是,先抛弃了现 ...

阅读全文...

使用国内源安装 Rust

这段时间写 Android 界面快吐了,极度枯燥,想学习一下 Rust 放松一下心情。于是在 Windows 11 的 WSL Ubuntu 中安装最新版本的 Rust。 下载安装脚本 参考 Rust 官网的新手文档 https://www.rust-lang.org/learn/get-started 在终端命令行中执行 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 但是这个安装过程非常慢,且没有进度条,估计是下载速度不行。 参照网上的做法,可以先下载官方的安装脚本,然后将其中的下载源替换为国内的源即可。 所以 ...

阅读全文...

VIM 在 tabnew 中打开目前鼠标所在行文本所指向的文件

例如,在 VIM 中打开某个文件,其中一行是文件路径,如: /etc/timezone 如果想在 VIM / NeoVIM 中,通过快捷键,在 tabnew 中打开目前鼠标所在行文本所指向的文件。 可以使用 Ctrl+w gf tips: ctrl + w 看似难记,实际跟分屏切换命令的前缀是一样的。 如果不想在 tabnew 中打开,而是当前 window,可以直接使用 gf 然后就能使用 buffer 相关的命令,在原文件与目标文件间切换。 使用场景 比如在代码注释/文档中,注明了相关联的代码文件,就可以直接写上目标文件的地址。 然后通过 gf 快捷键快速打开。 buffer 相关命 ...

阅读全文...

代码可读性, 开发效率与可维护性

为何今天才意识到代码可读性,可维护性的重要? 如果一份代码需要频繁修改,新增逻辑,及逻辑更新会不断破坏旧有逻辑。而逻辑本身又非常复杂。 这时代码可读性就非常重要了。 因为,在频繁改动的项目上,花在理解既有逻辑上的时间,可能比写代码的时间多 N 倍。 提高代码可读性,可以大大降低时间成本。 反面示例 最近在维护自己写的代码时,发现前期的每一次代码规范上的偷懒,都会影响后续修改代码的效率。例如: 变量名,函数名,图省事用了模棱两可的名字。 超长的函数 未处理的异常,错误 超长的代码文件,充斥着无尽的类和函数 无处不在的废弃的,但是没有清理的代码 增强代码可读性, 减少对外部文档的依赖 逻辑梳 ...

阅读全文...

手机自动化任务工具,解决下班忘打卡的烦恼

最近在调研 RPA (Robotic Process Automation) 自动化方案,突然想到平时经常忘记下班打卡,Android 手机上是否有类似的工具能实现自动打卡呢? 每次掏出蓝牙耳机,MIUI 都会自动打开网易云音乐,看起来是自动为我创建了一条自动任务规则。那么一定是可以自定义一个到了固定时间触发打开企业微信/钉钉的规则。 自动任务 查了一下,果然,小米手机系统的手机管家 APP 内置了一个自动任务的功能: 里面内置了一些常见的使用场景 可惜都不是我需要的。于是,点击右下角的添加按钮,新建一条自定义规则 触发条件是工作日下午 17:31,自动执行打开企业微信。 已有自动任务列 ...

阅读全文...

如何在写代码时保持愉悦的心情

与愉悦相对的就是焦虑,烦躁。 焦虑与烦躁 这段时间的情绪波动尤其明显,确切地说是最近两个月。根源是: 无穷无尽的开发需求,似乎没有做完的那一天。 例1: 主要工作变成了写 Android App,界面部分是大头,但是一个 App 给三四家客户各写一套, 每套界面还不一样,确实没啥新鲜感了。虽然写界面越来越熟练了,但是毫无意义,枯燥又乏味。 还要忍住不去吐槽客户新手设计师的奇葩设计。 例2: 另一个长期维护的项目,在有新功能的同时,还有既有功能的不断体验优化需求。 优化建议很合理,但是无休止地优化,影响了新功能的开发节奏,达不到自己上线的预期,于是焦虑就产生了。 经常在屏幕前,纠结半天要做什么, ...

阅读全文...

Android 点击设置菜单条目,基于 DialogFragment 实现弹窗

DialogFragment 在 android 3.0 时被引入。是一种特殊的 Fragment,用于在 Activity 的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。在 DialogFragment 产生之前,创建对话框:一般采用 AlertDialog 和 Dialog。注:官方不推荐直接使用 Dialog 创建对话框。使用 DialogFragment 来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和 Fragment 有着基本一致的声明周期。且 DialogFragment 也允许开发者把 Dialog 作为内嵌的组件进行重用,类 ...

阅读全文...

对话机器人 Rasa(二十七):返回视频

虽然 Rasa 支持图片资源的返回,但是并不支持视频资源。 可以采用自定义字段的方式返回视频链接。 例如: utter_my_video: - text: "Watch video below" custom: video: "https://www.youtube.com/embed/qsKoT__cmAw?si=1hv4HoKA3ZcTvNCN" 这里的视频链接使用了 youtube 嵌入 iframe 中的视频源链接。 前端可以封装一个 video 卡片组件,将 youtube iframe 嵌入到页面中。 自定义字段直接返回 ifr ...

阅读全文...

入手了小米家的机械键盘

家里一直用的我买 Dell 台式机送的键盘,虽然鼠标已经坏了两个,但是键盘一直坚挺。 终于到了该退伍的时刻,最近 Ctrl 键越来越按不动,对于 Ctrl C / Ctrl V 程序员来说,这实在无法忍受。 特别是晚上写代码,本来就烦躁,然后 Ctrl C 还不好使,真有砸键盘的冲动。 于是我准备入手一把新键盘了。印象中这也是我第一次买键盘。。。 需求 唯一的需求就是带背光,因为有时候喜欢关灯写程序,没有背光,看不清键盘。 蓝牙还是有线 我担心背光影响电池续航,所以优先选择有线。 键盘的品牌 这个我倒是没有特别的喜好,之前用过公司发的 Cherry 机械键盘,但实际上感觉跟普通的 Dell, ...

阅读全文...