惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
D
DataBreaches.Net
Simon Willison's Weblog
Simon Willison's Weblog
F
Fortinet All Blogs
Help Net Security
Help Net Security
P
Proofpoint News Feed
F
Full Disclosure
G
GRAHAM CLULEY
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
G
Google Developers Blog
T
The Blog of Author Tim Ferriss
P
Palo Alto Networks Blog
T
Threat Research - Cisco Blogs
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Microsoft Azure Blog
Microsoft Azure Blog
T
Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Register - Security
The Register - Security
The Hacker News
The Hacker News
Scott Helme
Scott Helme
T
Tor Project blog
Recorded Future
Recorded Future
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
Vercel News
Vercel News
L
Lohrmann on Cybersecurity
Know Your Adversary
Know Your Adversary
T
The Exploit Database - CXSecurity.com
IT之家
IT之家
C
Check Point Blog
NISL@THU
NISL@THU
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
LangChain Blog
S
Schneier on Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
CERT Recently Published Vulnerability Notes
博客园 - 三生石上(FineUI控件)
Spread Privacy
Spread Privacy
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
L
LINUX DO - 最新话题
S
Security @ Cisco Blogs
The Cloudflare Blog

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派 万字剖析:千问App深度体验报告(2026) - 少数派 在2026年,如何真正防止别人抄袭你的作品 - 少数派 怎么用 50 块搭个 AI 语音助手?我踩了 3 天坑 - 少数派 YeeroAI:让 AI 对话真正成为知识管理的一部分 - 少数派 爬泰山 - 少数派 「旅图显影」 App 更新:这次,我们补上了一点「手感」 - 少数派 假期出门太折磨?我的 23 条经验帮你规划惬意旅行 - 少数派 工作流会变吗 - 少数派 Claude Opus 4.6 怎么用最省钱?我测了 5 种方案 - 少数派 GPT Image 2 让图文并茂不再稀罕 - 少数派 用户侧出发——什么是AI,我要不要学习? - 少数派 找片、转存、整理、播放一条龙!让你的付费网盘值回票价 - 少数派 欢迎试用!日课一问2.0插件 - 少数派 自己做的MDeditor,原本想购买 Typora 试了两次支付不成功,干脆自己做一个 - 少数派 vibe coding了一个 3MB 的小工具,让 ~/Downloads 彻底告别混乱 - 少数派 因为受不了 Mac 的风扇策略,我做了一个风扇控制工具 - 少数派 别只怪模型 - 少数派 Warp 终端的 AI 功能怎么用?我测了一周的体验 - 少数派 AI 写代码老是出 bug?这 5 个配置我后悔没早知道 - 少数派 「新玩意」苹果出相机可能就这样:Sigma BF + 45mm F2.8 DG Contemporary - 少数派 一个面向2030年的AI操作系统是什么样子的:浅谈cola这款有灵魂的Agent - 少数派 别只看写代码 - 少数派 每天解决10个问题,还是一口气攻坚解决400个? - 少数派 AI 交易机器人怎么搭?我用 Claude 跑了一周实盘 - 少数派 Maptoposter Online:把你爱的城市画成艺术海报 - 少数派 Function Calling 怎么用?我测了 3 个模型发现差距真大 - 少数派 Legend Talk:我做了个 AI 圆桌,让 160 位思想家围着你的问题转 - 少数派 如何找到自己的蓝方?在小县城寻找压力测试 - 少数派 语音输入与软件接口|2026年聊AI时,我们都聊些什么(上) - 少数派 混动已经卖爆,纯电又来补刀——钛7闪充版简直“不讲武德” - 少数派 本月玩什么|朋友收藏、识质存在、沙罗周期 - 少数派 为什么要每天坚持输出? - 少数派 Claude API 挂了好几个小时,你的项目有备用方案吗? - 少数派 Function Calling 没你想的复杂——我用它做了个有点用的工具 - 少数派 登录系统立即播放视频或者图片音乐的软件 - 少数派 我为什么创建 FlipHTML5 下载工具 - 少数派 残局没电?多品牌外设电量统一管理软件EasyBluetooth已支持RTSS游戏内显示以及AIDA64 - 少数派 前往通义路的路 - 少数派 太好看了,媲美Sun的个人导航页,NAS部署星云门户 - 少数派 乌黑嘴唇“一键检测”上线了 - 少数派 派早报:Claude AI 接入多个创意软件生态、FILCO 生产方接手品牌等 - 少数派 【更新】BearCLI、Claude 连接器与 MCP 服务器 - 少数派 记了上千条流水,还是看不懂财务?我做了一个让 AI 读懂账本的工作台 - 少数派 MINI R56 升级原厂 Sport 模式 - 少数派 新玩意 | 一棵柠檬树(仿真版) - 少数派 Momenta的“物理AI”野望,需迈过“含摩量”这道关 - 少数派 网页直接投屏控制手机!NAS一键部署PandaScrcpy,流畅丝滑可远程。 - 少数派 众测|邀你一同探索随身 AI 硬件入口 YoooClaw C·ONE - 少数派 2050大会:分享时间是真诚 参会记 - 少数派 iPad 赋能电影创作:国内首部宣纸手绘长片《燃比娃》的幕后故事 - 少数派 AI的审美:我用 8 个大模型给 100 张旅行照片打分 - 少数派 普通人如何破圈?去参加一个本地协会 - 少数派 把极空间的图标全换了,主题DIY全攻略打造你的专属NAS桌面 - 少数派 电子便签墙,帮你实现便签自由 - 少数派 我如何用三个 CLI 工具取代文档创建需求 - 少数派 原来真的有人可以玩一辈子 - 少数派 社区速递 139 | 派友热议三月买了啥、复古单反尼康 Df 体验 - 少数派 06 作品的赏析与评价 - 少数派 TDS REVIEW|索尼 WF-1000XM6 降噪真无线耳机体验 - 少数派 35.98万起售的第二代腾势D9,我看重的不是堆料,而是不凑合 - 少数派 鼠须管 Squirrel 皮肤配置指北 - 少数派 从watch ultra2换到redmi watch6 - 少数派 派早报:阿里巴巴发布视频生成模型 HappyHorse 1.0 等 - 少数派 别迷信1M - 少数派 家人们天塌了!网盘“大封杀”,多个渠道多条路,NAS部署PanHub - 少数派 AI与人勾心斗角!NAS一键部署AI狼人杀,假日休闲必备。 - 少数派 电商必备!Comfyui工作流批量生图插件,一次生成12张!支持Nano banana pro模型 - 少数派 Comfyui工作流配置Gpt-image-2模型教程,0.03/张 - 少数派 OpenClaw第三方APi怎么配置?可使用Gpt-image-2模型 - 少数派 会员社区话题精选 Ep. 103 - 少数派
自我研究:记录自己每天的睡眠 - 少数派
2024-08-23 · via 少数派

在 2023 年底的时候,我开始准备记录自己每天的时间是怎么安排的。

其实对于我自己来说,最大的驱动力来自记录自己的睡眠。毕竟作为「研究生」,平时也没有白天一定要做什么事情的需求(除了开会),生物钟经常颠倒,睡觉也睡的不好。如果能够自己统计一些具体的数据,或许可以分析分析怎么才能让自己的生物钟正常点,每天睡的时间也能多一点。

其实当时我也调研了一些可能的 app 去做时间记录,但是我自己可能是一个比较挑剔的人,根据我的以下需求,确实是很难有满足我要求的第三方工具了:

  • 能导出 CSV 数据:别人画的图毕竟受限,想好看我有了数据可以自己 Python 画
  • 足够方便:随时随地记录,而且点击要少,时间要短(一定一定不能有诸如开屏广告的玩意儿)
  • 可自由定制类型:我可以只把时间分成两类(生活+工作),也可以细分到每一个工作项目,每一种生活类型(甚至玩哪个游戏),选择哪种方案是我的自由,想简单可简单,想复杂可复杂

好吧,说到这儿,我说实话已经不太可能找别人开发的方案了。

基于快捷指令的时间记录「app」

聊几句我自己的背景:我是做生信的,代码能力不强,也就玩玩 Python 的水平,写 iOS app 是绝对不行的。不过本段涉及的算法技术只有 if-else,其他部分大家真的随便看看就懂了。

既然都想自己搞了,我就把目光投向了 iOS 上的快捷指令。

在讲快捷指令之前,我甚至还尝试过一个更离谱的做法,写一段 Python 程序,然后手机执行代码,把记录结果远程发送到电脑。(这听着也太麻烦了吧)

一阵摸索后,我发现快捷指令比我想象中好用太多,其实本质上就是傻瓜式编程的软件,或者可以理解成现在流行的「无代码编程」。而且作为颜值控,快捷指令居然能生成一个类似于 app 的图标放在主屏,甚至这个图标还可以用自己的图片!能拥有自己定制的 logo 真是太美好了。

那么到这里,我们已经准备好了实现的途径,现在来列一下实际的需求:

  • 能导出 CSV 数据:app 的输出存放在便签中,作为纯文本数据,其实已经很容易读取;
  • 足够方便:每次记录时间点击屏幕三次(包括打开 app),不能再多了;
  • 可自由定制类型:方便地添加/删除记录的类型。

于是我的流程便是:

手动打开 app ➡️ 手动选择大类 (Work/Life) ➡️ 手动选择小类 (Relax/Gaming/Sleep/Travel) ➡️ 自动生成一段文字 ➡️ 自动添加到某个便签的最后一行

第一步:选择大类
第二步:工作大类中选择小类
第二步:生活大类中选择小类
最后一步:把结果(一句话)添加到便签
实际操作:点两下就行

上图就是实际操作的界面,两次点击(算上打开 app 三次)就可以了,真的很方便。而且我还换了一个好看的 logo,这样我就更有动力去点它了

输出的便签长这样:

Major: [Life]. Minor: [Life: Relax]. Starting at: [Jul 26, 2024 at 05:38]
Major: [Life]. Minor: [Life: Sleep]. Starting at: [Jul 26, 2024 at 08:01]
Major: [Life]. Minor: [Life: Relax]. Starting at: [Jul 26, 2024 at 12:00]
Major: [Life]. Minor: [Life: Relax]. Starting at: [Jul 27, 2024 at 12:04]

养成习惯还是需要一些过程的,平时的我需要睡觉前点一下,起床点一下,开始干活点一下,准备吃饭点一下,说白了还是小有点麻烦。所以我一开始分的类多,后面其实分类就越来越少了,无非就分休息/睡觉/工作这几个了。

统计结果可视化

既然都有了统计的结果,我们就可以根据记录的时间来做图了。我最近还是比较关心我每天睡的好不好,特别是每天到底睡够了没。

于是我就写了一段 Python 画图的代码,看看从今年第一天到现在(八月)每天睡了几个小时:

钟二每天睡了几个小时?

哎,上两周睡的也太惨了😭

如果统计一个直方图的话:

钟二睡觉时长居然符合正态分布?

群友锐评 1:睡眠时间能拉出以小时为单位的正态有点狠啊

群友锐评 2:感觉我要是用钟老师的 colorbar,这一张热图都是蓝的

不过我自己感觉还算良好,居然我大半部分时间都有错过六小时睡眠,我已经很满足了。

后话

我自己算是一个比较爱折腾的人,能为了记录个时间折腾半天也是没谁了 hhh。

其实除了看睡了几个小时,我之前还统计过我自己做的每个项目到底花了多少时间。等最后有了回报之后,我就能统计下我的时间/产出比了。还有一段时间我总觉得我的人生浪费在了无穷无尽无聊的开会中,我当时也统计了下我一周到底花了多少时间在开会上(真的很多!),那次之后我就开始翘会了,能不开就别开了

这个 TimeTracker 已经变成我生活中有趣的一部分了,今天分享给大家,要是感兴趣的话也欢迎大家来交流和尝试

Source code

画图的代码就不公开了,大家多多培养自己的艺术细胞吧

读便签数据:

# load timetracker data
# the line format: Major: [MAJOR_TYPE]. Minor: [MINOR_TYPE]. Starting at: [MONTH DAY, YEAR at TIME]
def load_timetracker_records(file_path):
    """Load timetracker records from a file

    Args:
        file_path (str): The path to the file

    Returns:
        pd.DataFrame: A DataFrame containing the records
        - major: The major activity
        - minor: The minor activity
        - start_time: The starting time
        - end_time: The ending time
    """

    major_activities = []
    minor_activities = []
    start_times = []

    with open('timetracker.txt', 'r') as f:
        # skip first line (first line is "time tracker")
        f.readline()
        for line in f:
            major, minor, start_time = re.findall(r"\[([^\]]+)\]", line)
            start_time = datetime.strptime(start_time, "%b %d, %Y at %H:%M")
            
            # add to lists
            major_activities.append(major)
            minor_activities.append(minor)
            start_times.append(start_time)
    
    end_times = start_times[1:] + ["None"]

    return pd.DataFrame({
        'major': major_activities,
        'minor': minor_activities,
        'start_time': start_times,
        'end_time': end_times
    })
        

统计每天睡眠时长:

# create a blank calendar
# result: a list of day names, a list of start of day time, a list of end of day time
calendar_name_list = []
calendar_start_of_day_time_list = []
calendar_end_of_day_time_list = []

# generate calendar data
for i in range((time_end_date - time_start_date).days):
    date = time_start_date + timedelta(days=i)
    start_of_day = date.replace(hour=0, minute=0)
    end_of_day = start_of_day + timedelta(days=1)

    calendar_name_list.append(date.strftime("%b %d, %Y"))
    calendar_start_of_day_time_list.append(start_of_day)
    calendar_end_of_day_time_list.append(end_of_day)


sleep_calendar = [0 for _ in range(len(calendar_name_list))]    # sleep calendar record sleep time for each day


# enumerate through time tracker records
for i in range(len(data)):
    record = data.iloc[i]
    major = record['major']
    minor = record['minor']
    start_time = record['start_time']
    end_time = record['end_time']

    # if the record is a sleep record
    if major == "Life" and minor == "Life: Sleep":
        # find the corresponding day
        for j in range(len(calendar_name_list)):
            if start_time >= calendar_start_of_day_time_list[j] and start_time < calendar_end_of_day_time_list[j]:
                if end_time >= calendar_start_of_day_time_list[j] and end_time < calendar_end_of_day_time_list[j]:   # if the sleep record is within the same day
                    duration = end_time - start_time
                    duration_hours = duration.total_seconds() / 3600
                    sleep_calendar[j] += duration_hours
                elif end_time >= calendar_end_of_day_time_list[j]:  # if the sleep record spans multiple days
                    duration_today = calendar_end_of_day_time_list[j] - start_time
                    duration_today_hours = duration_today.total_seconds() / 3600
                    sleep_calendar[j] += duration_hours

                    remaining_duration = end_time - calendar_end_of_day_time_list[j]
                    remaining_duration_hours = remaining_duration.total_seconds() / 3600
                    for k in range(j+1, len(calendar_name_list)):
                        if remaining_duration_hours > 0:
                            if remaining_duration >= timedelta(days=1):
                                sleep_calendar[k] += 24
                                remaining_duration -= timedelta(days=1)
                                remaining_duration_hours = remaining_duration.total_seconds() / 3600
                            else:
                                sleep_calendar[k] += remaining_duration_hours
                                remaining_duration_hours = 0
                        else:
                            break
                else:
                    raise Exception("Invalid sleep record: " + str(record))

sleep_calendar = np.array(sleep_calendar)
# append np.nan to be the 7*n
n = 7
if len(sleep_calendar) % n != 0:
    sleep_calendar_reshape = np.append(sleep_calendar, [np.nan for _ in range(n - len(sleep_calendar) % n)])
    sleep_calendar_reshape = sleep_calendar_reshape.reshape(-1, n)
else:
    sleep_calendar_reshape = sleep_calendar.reshape(-1, n)

> 关注 少数派小红书,感受精彩数字生活 🍃

> 实用、好用的 正版软件,少数派为你呈现 🚀