Beaver Habit Tracker 近况更新(v0.3.4)
Beaver Habit Tracker 是一款使用 Python 编写的习惯跟踪应用,支持自部署。由于作者希望大家尽可能生活的松弛,所以在应用中没有目标的概念 :)
《Atomic Habits》
为了更好的开展项目获取更多灵感,最近开始读一本书,名字叫做《Atomic Habits》
有趣的是,开篇作者的观点便与博主项目的标题不默而合:FORGET ABOUT GOALS, FOCUS ON SYSTEMS INSTEAD
文中阐述的四个目标的陷阱:
- Winners and losers have the same goals
- 每个运动员都希望成为奥运冠军,但真正的奥运冠军的成功,并不是因为当初制定了雄心勃勃的目标。
- Achieving a goal is only a momentary change
- 如果目标是让房间保持干净,仅仅一次的打扫可以达到目标,但无法做到长久的维系
- Goals restrict your happiness.
- 构建可持续的系统,并享受过程,而不是掉入延迟满足的陷阱。
- Goals are at odds with long-term progress.
- 即使咬牙坚持完成目标,是否会如同泄气的气球般,瘫倒,再也不愿继续前行
总而言之,作者呼吁:“忘记你的目标,而是专注构建系统”。是鸡汤还是干货,期待后续的读后感~
Beaver Habits 0.3.4 更新 ✨
最新的更新新增了以下的特性:
Daily Notes/descriptions
根据用户提出的需求,希望完成“习惯”的时候,支持添加简短的描述。例如追踪阅读的频率时,希望能够记录在那个特定时刻正在阅读的书。
参考了市面上的产品,主流的做法是全局开关:如果打开后,点击完成就会跳出 dialog 供用户输入文字。
第一版实现后,总觉得有一丝别扭,如何才能让这个功能对用户的“负担”降到最低呢?于是有了这个天才般的想法:去掉了任何的开关或编辑习惯类型,只要「长按」便可以触发添加文字,与「单击」动作相配合。最终实现自然流畅的交互:
实现的过程中,遇到的几个问题:
1)关闭 iOS 系统 contextmenu 事件
document.body.style.webkitTouchCallout='none';
document.addEventListener('contextmenu', function(event) {
event.preventDefault();
event.stopPropagation();
event.stopImmediatePropagation();
return false;
});
2)加锁避免弹框重复触发
release = asyncio.Event()
async def handle_mouse_down():
release.clear()
try:
async with asyncio.timeout(0.5):
await release.wait()
except asyncio.TimeoutError:
ui.notify("Hold")
async def handle_mouse_up():
release.set()
ui.button("Hold") \
.on("mousedown", handle_mouse_down) \
.on("mouseup", handle_mouse_up) \
.on("touchstart", handle_mouse_down) \
.on("touchend", handle_mouse_up)
Trusted email header
同样来自用户的诉求,期望通过 cloudflare auth 登陆并访问 tunnel 时,通过 header Cf-Access-Authenticated-User-Email
中的邮箱地址,自动登录。
细节不展开,感兴趣可以参考:https://docs.openwebui.com/features/sso/#cloudflare-tunnel-with-cloudflare-access
Add EXPOSE to Dockerfile
一行的小改动,但很高兴来自用户的 PR:https://github.com/daya0576/beaverhabits/pull/65