计算机成为人手必备的生产力工具的今天,几乎所有人每天都会使用键盘打字,但是不同人的打字习惯也不尽相同,如果能有一个小程序记录每天打字的习惯,或许会有一些意料之外的发现。因此我使用 GreptimeDB 做了一个小小的实验,本篇文章作为实验教程供大家参考。
下图是我个人打字习惯的一个可视化报表:

我的输入法需要用空格键确认,不出意外地 Key.space
是我最常按的按钮。因为我只在笔记本上用原装屏幕工作,没有外接显示屏分屏看不同窗口,所以 Key.cmd + Key.tab
是我最常用的组合键(MacOS 系统上这个组合键可以切换不同的窗口),所以这两个结果都在意料之中。
让我有些惊讶的是,我按 Key.cmd + v
粘贴的次数居然超过 Key.cmd + c
的次数;此外,尽管现在大多数软件都有自动保存的功能,但我下意识地按 Key.cmd + s
确保工作内容存档已经形成肌肉记忆了。
如果你也认为上面的监控反馈和结论有点意思,那么下面我介绍一下如何利用开源软件快速搭建起你自己的键盘输入习惯看板,迅速监控自己的打字习惯,发现自己键盘使用的秘密。
准备工作
所有相关源代码都可以从 GitHub 上的 GreptimeTeam/demo-scene 仓库自由下载。为了运行相关代码,你需要先准备好一个 Python 3 的环境。
什么是 Streamlit
在这个示例当中,我们将借助 Streamlit 展示输入频率的相关数据。
Streamlit 是一个开源的数据可视化应用框架,可以支持用户快速开发数据科学领域的 Web 应用。Streamlit 开箱即用地提供了一系列数据展示能力,并且支持各种数据输入。例如上面看板中的最后一个表格就有一个日期选择器,通常用户只需几行代码就可以实现一个优雅的应用。
什么是 GreptimeDB
在这个示例当中,我们将部署一个 GreptimeDB 集群以供存储键盘输入事件。
GreptimeDB 是一个开源的,关注性能、扩展性和分析能力的分布式时序数据库,从一开始就为云环境量身定做,充分利用了云存储的能力。GreptimeDB 完全可以作为一个更高效和更具有性价比的 InfluxDB 替代,或者是 Prometheus 的后端存储引擎。
本地环境配置
运行下面的命令,拉取相关源代码并安装依赖:
git clone https://github.com/GreptimeTeam/demo-scene.git
cd demo-scene/keyboard-monitor
pip3 install -r requirements.txt
上述命令会完成下面的所有安装:
Streamlit 框架;
用于链接 GreptimeDB 集群的 SQLAlchemy 库;
用于监控键盘输入事件的 pynput 库。
极速创建集群
Greptime 团队为 GreptimeDB 提供了 GreptimeCloud 云服务。你可以选择 GreptimeCloud 的 Hobby 计划免费创建一个集群。
集群创建成功后,进入集群控制面,点击 Connect 标签,在页面上复制集群的 MySQL 连接串。
🌟 GreptimeDB 提供多种访问方式,包括 Prometheus Remote Read 和 MySQL/PostgreSQL 的命令行工具等等。

回到示例源代码目录,创建一个名为 .env
的文件,粘贴刚才复制的连接串作为环境变量 DATABASE_URL
的值:
DATABASE_URL=mysql://[username]:[password]@[hostname]:4002/[database]
一切准备就绪,接下来我们就可以运行监听脚本抓取输入行为事件了。
启动监控应用
运行 agent.py
脚本以监听键盘输入:
python3 agent.py
应用成功启动后,可以在终端看到启动日志:
2024-03-07 20:57:53,799 INFO listener_thread Listening...
正常使用电脑和键盘,每当敲击行为发生时,运行监听脚本的终端会打印如下日志:
2024-03-07 20:58:01,510 INFO sender_thread sent: Key.backspace
2024-03-07 20:58:01,947 INFO sender_thread sent: Key.enter
2024-03-07 20:58:02,498 INFO sender_thread sent: Key.shift+'#'
2024-03-07 20:58:02,938 INFO sender_thread sent: Key.space
2024-03-07 20:58:03,377 INFO sender_thread sent: Key.cmd+Key.right
2024-03-07 20:58:04,052 INFO sender_thread sent: Key.cmd+'s'
...
查询统计数据
终端输出 sender_thread sent: ...
日志意味着键盘输入行为已经成功写入云上的 GreptimeDB 集群。我们可以从 GreptimeCloud 的 Web UI 上查询打字行为的统计数据:


从控制面的 Portal 页点击 Web Dashboard 一栏,跳转到 Web UI 页面后点击“+”创建查询。
例如,可以用标准 SQL 查询最常按的按钮:
SELECT hits, COUNT(*) as times
FROM keyboard_monitor
WHERE hits NOT LIKE '%+%'
GROUP BY hits
ORDER BY times DESC limit 10;
对于时序数据,我们还可以基于时间做聚合查询。例如,计算每个整点小时的键盘敲击次数,可以使用 GreptimeDB 的 范围查询 语法:
SELECT
ts,
COUNT(1) RANGE '1h' as times
FROM keyboard_monitor ALIGN '1h'
ORDER BY ts DESC
LIMIT 10;
基于 Streamlit 的可视化
如前所述,开发者可以用 Streamlit 快速搭建一个可视化报表的应用。GreptimeDB 集成到这个框架上是非常丝滑的,因为它支持 MySQL 通讯协议,所以可以直接当成一个 SQL 数据库连接上来。
运行以下命令,执行可视化脚本:
streamlit run display.py
这个脚本会自动打开网页(http://localhost:8501/)展示相关数据:

这样我们就完成了键盘输入看板的搭建。
小结
在这份使用指南中,我们展示了如何创建一个用于监控键盘输入习惯的 dashboard。
欢迎各位也进行自己的实验,探索个人键盘输入习惯,说不定会有一些有趣的发现。也欢迎您继续使用 GreptimeDB 探索更多有趣的玩法,并通过微信小助手(greptime)和微信技术交流群与我们分享您的发现和演示,参与丰富我们的社区,相互学习。
关于 Greptime
Greptime 格睿科技专注于为可观测、物联网及车联网等领域提供实时、高效的数据存储和分析服务,帮助客户挖掘数据的深层价值。目前基于云原生的时序数据库 GreptimeDB 已经衍生出多款适合不同用户的解决方案,更多信息或 demo 展示请联系下方小助手(微信号:greptime)。
欢迎对开源感兴趣的朋友们参与贡献和讨论,从带有 good first issue 标签的 issue 开始你的开源之旅吧~期待在开源社群里遇见你!添加小助手微信即可加入“技术交流群”与志同道合的朋友们面对面交流哦~
Star us on GitHub Now: https://github.com/GreptimeTeam/greptimedb
Twitter: https://twitter.com/Greptime
Slack: https://greptime.com/slack