MoreRSS

site iconScarSu | 酥鱼修改

96女性程序员,18年至今全职从事前端开发工作,开发了一个浏览器插件NotionX
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

ScarSu | 酥鱼的 RSS 预览

我所理解的“人生意义”

2025-07-25 08:00:00

%E6%9E%81%E7%AE%80%E8%AE%BE%E8%AE%A1_%2814%29.png

胡适在《忍不住的新努力》中说,人生的意义是个人自己创造的,以我的理解,就是找到自己想做的事

焦虑与迷茫

我大学之前十数年学生生涯只关心成绩、上大学后只因为就业和工资产生焦虑;

毕业后搬砖之余,开始产生了迷茫之感,不知道是为了什么而“活着”。

以我个人之见解,

之所以焦虑,是能力及不上欲望。

之所以迷茫,是不满足于一成不变的状态、缺乏成长和进步的目标;

要解决焦虑,答案很简单,需要**提高能力,**1增加知识储备,多获取信息,多思考;2丰富实际体验和经验,大胆试错。

要解决迷茫,则需要探寻目标,需要进一步探究。

自寻目标

《心流》中说,在传统社会中,帝王、主教、政治等社会权威,给大众提供的人生目标是:宗教、道德、阶级习俗、爱国主义

在现代社会中,以商人为代表的资本阶级,给大众提供的人生目标是:工作、用工作赚来的钱_消费_。

他们设置这些目标的动机,都是为了维护社会秩序,为了维护统治者和既得利益者自身的长久利益

简而言之,提供目标的人都有其主观偏好和私利

因此我们要从社会制约与本能冲动下,建立自我意识,不再以社会的奖赏为念,试着以自己所能控制的奖赏取而代之,自寻目标

那么问题就变成了,如何探寻以自我为出发点的目标

以提高人生体验为终极目标

《心流》中提出,一个人身上真正有价值的,就是个人的体验

我们的人生,就是由体验所组成的。

我们拥有很多体验来源:

  • 感官之乐(食欲、性欲、听觉享受、视觉享受、触感、运动之乐
  • 思维之乐(文字、记忆、历史、科学、哲学、思维游戏
  • 工作之乐(成就感
  • 人际之乐(友情、爱情、亲情天伦之乐

因此,以自我为出发点,我们可以将人生的终极目标定为提高自己的人生体验,然后自上而下拆解,从各个方面做出努力。

向下拆解

《极简主义》中提出了人生中最重要的五个方面:健康、人际关系、热情、成长、奉献

这五个方面,可以看作”提高人生体验”的一种拆解形式。

  1. 健康,是一切体验的基础
  2. 人际关系,是解决孤独与寂寞,探寻人际之乐的的唯一途径。
  3. 热情,培养自得其乐的性格,心理能量充足,才能付出注意力、继而收获体验。
  4. 成长,是创造心流,达到最优心理体验的方法。
  5. 奉献,最复杂、最高级的心流体验

本篇文章使用Notion创作,由我的自动化工具从Notion同步。

《暗时间:思维改变生活》- 了解思维、锻炼思维、运用思维,高效利用暗时间(碎片时间)

2025-07-22 08:00:00

《暗时间》豆瓣链接: https://book.douban.com/subject/35858123/

dark_time-cover.png

"暗时间"指的是生活中的碎片时间,作者刘未鹏通过这一概念,阐述了如何运用思维方式高效利用这些暗时间,从而强调了思维在个人成长和学习中的核心重要性。

提高效率

  1. 暗时间是指 生活中的碎片时间(通勤 家务 排队),应该学会利用这些暗时间
  2. 真正的有效投入 = 时间 * 效率(思考的深度与持续性),而不是单纯的时长
  3. 提高效率的方法:训练迅速进入专注状态的能力、训练长时间保持专注的能力
  4. 设计进度条:将目标拆解成详细的计划和步骤、设置进度条,可以增强反馈、增强信心
  5. 提高记忆的效率:将新的知识提取出许多线索、与已有的知识体系连接((包括空间位置、环境、气味、情绪、视觉、听觉等等,举一反三),多实践、多输出,定时复盘

了解思维、锻炼思维、利用思维

  1. 学习心理学、思维相关的知识,有利于我们了解自己思维的弱点,避免思维陷阱,可以使我们更善于利用自己的大脑,可以看看《影响力》这本书,以及这个思考的技术与艺术豆列里面的书
  2. 避免思维陷阱:避免认知偏见、思维惯性、受直觉和情绪影响、归因错误
  3. 区分理性和情感直觉,正确利用理性大脑:我们的大脑中同时存在着远古的自我,和现代的自我,并且两者并没有完美协调。所谓“说起来容易做起来难”,为什么明知正确的事情就是没法去做,因为大脑中主管行为的并不仅仅是你的“认知”模块,认知模块发完话之后自会有更强大的情绪模块藐视“上级”的决定。世界上最痛苦的事情不是和别人作斗争,而是和自己作斗争。

核心竞争力

  1. 对新鲜事物的兴趣和热爱、自学的能力是一个人终身成长的关键因素
  2. 英语对程序员很重要:英文世界的技术资料很丰富,一旦熟练掌握了语言这个平台,背后就是一扇大门,通向一个海量的信息源,例如wikipedia和英文版的书;平时尽量读英文的一手资料、使用英文参加国外技术交流、写英文博客、
  3. 作者刘未鹏建立TopLanguage论坛,通过与人交流使自己受益匪浅:促使自己清晰表达观点、激发自己思考、交朋友
  4. 坚持长期写作输出:是对思维的备份、缓存、细化、论证和反思、沉淀,是与自我的对话、与他人的交流,是费曼学习法以教为学的实践
  5. 遇到困难应该迎难而上:学习新知识、遇到困难的时候,大脑会做最优经济决策:因为困难所以看不到成功的可能 因此直接放弃。这种决策是错误的,1是因为我们不懂所以才高估了困难程度,大部分知识在掌握了之后才会发现“豁然开朗”,2是因为现代社会很多东西是知识密集型的 我们遇到的问题不是孤立的、一次性的,以后很可能会再次用到,困难的路会越走越容易
  6. 不可替代的核心竞争力是以下四个能力的组合:
    1. 专业领域的技能水准
    2. 跨领域解决问题、创新思维、判断与决策、表达沟通的能力
    3. 学习能力
    4. 性格品质:专注、坚持、自省、好奇心、自信&谦卑

本篇文章使用Notion创作,由我的自动化工具从Notion同步。

View Transition API - 实现HTML视图的过渡动画

2024-09-19 08:00:00

触发视图动效的方法&时机:

  • 对于SPA,将更新DOM的方法updateDomTrigger作为参数传递给document.startViewTransition(updateDomTrigger)方法,浏览器会先截取当前页面DOM元素的快照(声明了 view-transition-name CSS属性的DOM元素,默认是:root),再执行updateDomTrigger方法,然后再执行过渡动效

  • 对于MPA,添加以下CSS规则,过渡效果会在导航到下一个同源页面的时候自动触发。

    @view-transition {
      navigaion: auto;
    }
    

默认的过渡效果是交叉淡化

旧视图快照opacity从1 到 0,新视图快照opacity从0 到 1。

如何自定义动效:

HTML会针对视图动效生成以下伪元素树:

::view-transition
└─ ::view-transition-group(root)
  └─ ::view-transition-image-pair(root)
      ├─ ::view-transition-old(root)
      └─ ::view-transition-new(root)
  • 可以通过在多个 DOM 元素上设置不同的 view-transition-name CSS属性,对不同的元素使用不同的自定义动效。因此,每一个 view-transition-name都对应一个view-transition-group(默认是root
  • view-transition-old指向动效前元素的静态快照
  • view-transition-new指向动效后元素的实时快照

具体的动画效果由CSS animation设置:


/* 只需要添加以下@view-transition规则,就会在切换页面时,触发默认的“淡化”动效 */
@view-transition {
    navigation: auto;
}

/* 自定义默认的动画行为 */
::view-transition-group(root) {
    animation-duration: 0.5s;
}

/* 创建自定义动画 */
@keyframes move-out {
    from {
        transform: translateY(0%);
    }
    to {
        transform: translateY(-100%);
    }
}
@keyframes move-in {
    from {
        transform: translateY(100%);
    }
    to {
        transform: translateY(0%);
    }
}

/* 将自定义动画应用到新旧元素 */
::view-transition-old(root) {
    animation: 0.4s ease-in both move-out;

}
::view-transition-new(root) {
    animation: 0.4s ease-in both move-in;
}

用JavaScript控制动效:

对于SPA,document.startViewTransition() 方法会返回一个 ViewTransition 对象实例,这个实例包含多个 promise:

对于MPA:

  • 旧页面在即将unload之前,会触发pageswap 事件,事件的event对象上的PageSwapEvent.viewTransition 属性包含了 ViewTransition 实例, PageSwapEvent.activation 包含当前切换页面的导航类型、当前文档和目标文档历史记录。
  • 新页面初次渲染时, 会触发pagereveal 事件,事件的event对象上的PageSwapEvent.viewTransition 属性包含了 ViewTransition 实例。
  • 要注意的是,为了确保处理pagereveal 事件的script脚本在渲染动效之前执行,需要给脚本添加 blocking=“render” 属性;
  • 另外,为了确保动效执行之前,元素是可视的,需要添加标签<link rel="expect" href="#lead-content" blocking="render" />,其中#lead-content指向对应元素。

浏览器兼容性

image.png

参考


本篇文章使用Notion创作,由我的自动化工具从Notion同步。

Stacking Context - DOM元素的层级关系

2024-09-04 08:00:00

不是z-index越大的元素越在上层

通过z-index来控制层级是很常见的前端需求,

但是你是否遇到过,无论z-index设置多大,仍然无法将一个元素移到最上层的情况?

这是因为z-index依赖于一个抽象的概念:Stacking Context

Stacking Context是什么?

stacking context是层叠上下文,决定了DOM元素上下层级关系

Stacking Context的根元素

每个层叠上下文都由一个元素创建,这个元素被称为stacking context的根元素

什么情况会创建Stacking Context?

  • html根元素
  • fixed定位的元素
  • 其他任何z-index不是默认值auto的元素(z-index=0也会创建层叠上下文)
  • CSS
    • 有透明度的元素:opacity<1
    • 有二维/三维变幻的元素:transform不为none,或者will-change
    • 有滤镜的元素:filter不为none
    • isolation: isolate;:创建一个新的堆叠上下文,隔离混合效果

Stacking Context之间的层级顺序

  • 对于同级(根元素是兄弟元素)的stacking context,层级由z-index值决定,z-index大的在上层;
  • 同级stacking context如果z-index相同,由DOM中出现的顺序决定,出现晚的在上层;
  • 对于嵌套的stacking context,子stacking context在上层;

Stacking Context内部层级顺序

  • 最底层:元素的背景色、背景图、边框
  • 子元素由底层到顶层的顺序:
    • z-index<0的元素
    • 块级盒子
    • 浮动盒子
    • 内联盒子
    • z-index:0或auto的定位盒子
    • z-index>0的元素

例子🌰

DOM结构:

div1
div2
div3
	-> div4
	-> div5
	-> div6

最终的层级顺序:

image.png

一个有用的浏览器扩展:CSS Stacking Context inspector

image.png

这个扩展在浏览器devtools中列出了网页上的stacking context。在遇到z-index和层级问题时,可以让我们更快的定位问题。


本篇文章使用Notion创作,由我的自动化工具从Notion同步。

2023热门JS语法新特性

2024-09-02 08:00:00

Nullish Coalescing

空值合并运算符(??),识别null和undefined值;MDN

const foo = null ?? 'default string';
console.log(foo);
// Expected output: "default string"

const baz = 0 ?? 42;
console.log(baz);
// Expected output: 0

Dynamic Import

动态引入,import函数支持异步引入js模块;MDN

import(moduleName)
import(moduleName, options)
await import('/modules/my-module.js')

Private Field

类私有属性,以#为前缀,无法在类的外部引用;MDN

class ClassWithPrivateField {
  #privateField
}

Logical Assignment

逻辑与赋值&&=,逻辑或赋值||=MDN

const a = { duration: 50, title: '' };

a.duration ||= 10;
console.log(a.duration);
// expected output: 50

a.title ||= 'title is empty.';
console.log(a.title);
// expected output: "title is empty"

let a = 1;
let b = 0;

a &&= 2;
console.log(a);
// Expected output: 2

b &&= 2;
console.log(b);
// Expected output: 0

Hashbang Comments

#! HashBang注释,用于在shell中执行js时,指定js解释器

是单行注释,只能写在js代码的第一行;MDN

#!/usr/bin/env node

console.log("Hello world");

error.cause

error实例中cause属性,指示了引起错误的具体原因;MDN

try {
  connectToDatabase();
} catch (err) {
  throw new Error('Connecting to database failed.', { cause: err });
}

array.toSpliced(),toSorted(),toReversed()

不改变数组原始值,创建新数据作为返回值

array.with()

相对于直接用[索引]更新数组,with方法不改变原始值、返回新数组

const arr = [1, 2, 3, 4, 5];
console.log(arr.with(2, 6)); // [1, 2, 6, 4, 5]
console.log(arr); // [1, 2, 3, 4, 5]

本篇文章使用Notion创作,由我的自动化工具从Notion同步。

Notion到博客的自动化更新

2023-07-29 08:00:00

我在上周的文章程序员一定要有自己的博客中写了我博客工具链的5步:

  1. 在趁手的工具写笔记(Notion PC端、移动端)
  2. 工具将笔记转化为md文档
  3. 自动推送md文档到我的博客git仓库
  4. git仓库更新,触发部署工具(netlify、vercel、jenkins)自动部署
  5. 更新博客

当时只实现了其中1245步,经过两天的探索我完成了第3步,让这个工具链实现了完整的自动化,这篇文章大致介绍一下。

从Notion到Git仓库

我的博客代码仓库使用Github托管,Github提供了一个十分有用的自动化工作流的工具:Github Actions

Github Actions 可以定时执行我提供的脚本,通过脚本,实现了从Notion到代码仓库的更新。大致逻辑是这样的:

  1. Github Actions 负责每天凌晨00:00执行脚本
  2. 在脚本中,使用Notion API接口获取Notion特定数据库的数据,筛选出前一天更新的文章
  3. 为每一篇文章,在代码仓库创建一个md文件
  4. 将文章的attributes,转化为博客md文件的frontmatter
  5. 将文章正文的md字符串,转化为md文件的正文内容
  6. 将所有md文件通过git命令提交到github仓库中
  7. 如果脚本执行失败,github会发邮件通知我

通过以上脚本,实现了 notion文章数据库到git仓库的更新。

脚本执行的频率是可以自由更改的,我偏向于损失一些时效性,保证环境稳定性,所以选择了一天一更新。

以上脚本可以在我的博客开源仓库中看到,链接在这里这里

由于我们的notion数据库字段、md文件的frontmatter配置很可能不同,我的脚本无法直接被你复用,有几个需要考虑变更的点:

  • 在你的git仓库中,需要配置几个脚本中需要使用的secrets。配置的地方在你的github仓库首页 - settings - secrests and variables - actions,参数名是NOTION_DATABASE_IDNOTION_KEY,前者是你在Notion中文章所在数据库的id(可以通过copy link获得),后者是你开通的notion api的key(notion api的开通详见这个文档)。
  • 从notion page attributes到md frontmatter的映射,可以在这个脚本postToMDFile中找到,逻辑比较简单,按照你的需求修改即可。
  • 脚本中的git信息,例如name、email、branch 可以按照你的需求修改。
  • 按照你的需求筛选notion数据,filter写在这个脚本getPosts中。
  • 有一个可能踩坑的点在于,必须要将workflow读写仓库的权限开启,否则脚本会因为缺少git push权限而报错,开启权限的地方在:github仓库首页-settings-actions-general-workflow permission - 开启read and write permissions
  • 脚本的执行周期,可以在上述yml脚本的cron字段中配置,注意脚本中的时间使用的是UTC时间,要考虑当地时区的时间差,例如UTC=北京时间-8,我希望在凌晨0点执行,所以写的小时是16。

从Git仓库到博客网站

这一步我使用的是Vercel工具,监听Git仓库的push事件,自动拉取代码更新,打包部署到网站。

这一步Vercel的配置很简单,推荐查看官方文档,不做赘述。


本篇文章使用Notion创作,由我的自动化工具从Notion同步。