我在 Twitter 发布的一条 tweet,写了使用了墨水屏制作了一个 Todo List,可以同步苹果提醒的全家待办列表。收到了很多推友的关注,所以我决定写一个教程,帮助大家制作一个墨水屏 Todo List。
同步服务由我开发的 einktodo.com 提供。
同步苹果提醒的全家待办列表
— Eson Wong (@eson000) January 15, 2024
创造真的令人感到愉快 https://t.co/guVXon73n5 pic.twitter.com/Rb9Fg3fUP7
我正在尝试将墨水屏 Todo List 制作成产品,如果你对这个产品感兴趣,可以在前往 einktodo.com 加入行等待邮件列表,你将会收到产品制作的最新进度信息。
我正在凑备量产产品的资源,在不久就会以原型产品为奖励的方式众筹启动资金。如果您加入了等待邮件列表,您将会收到众筹启动的通知和众筹的优惠信息。
下面是制作墨水屏 Todo List 的教程。
微雪 7.5 寸墨水屏可以在网上找到拆机屏,也可以买新的。注意要买 800x480 分辨率的。
墨水屏驱动板在闲鱼搜索墨水屏驱动板
,买 24 pin 的驱动板。
将墨水屏驱动板按下面的表格对应的脚位连接到 ESP32 开发板上。
墨水屏驱动板 | ESP32 开发板 |
---|---|
VCC | 3.3V |
GND | GND |
SDA | Pin 14 |
SCK | Pin 13 |
CS | Pin 15 |
DC | Pin 0 |
RST | Pin 2 |
BUSY | Pin 4 |
将墨水屏的 FPC 排线连接到墨水屏驱动板。
注意排线的正反面。这个 FPC 排线端子的触点是在上面的,所以排线的触点朝上。我在第一次尝试点亮墨水屏的时候,就因为排线插反了,当时信心受到了极大的打击。
下载 VSCode,并安装。
安装好 VSCode 后,打开 VSCode,点击左侧的扩展按钮,搜索 PlatformIO,点击安装。
然后从 E-ink Todo List 固件代码开源仓库 下载固件代码。
点击右上角的绿色按钮,选择Download ZIP
。下载完成后解压得到固件代码文件夹。
用 VSCode 打开固件代码文件夹。
选择固件代码文件夹, PlatformIO 插件会自动安装编译固件所需依赖。
将 ESP32 开发板用 USB 线连接到电脑。
编译和烧录固件到 ESP32 开发板。
在 VSCode 上点击蚂蚁头形状的PlatformIO
菜单来打开 PlatformIO 的面板。选择 e-ink-todo-list
-> General
-> Upload and Monitor
。
等待烧录完成。
在 API Key 页面 创建 API Key。
固件编译和烧录完成,墨水屏上会提示你连接墨水屏的热点和热点密码,接下来要连接热点进行设置。
连接墨水屏 Todo List 的 Wi-Fi: E-ink Todo List AP
,密码: einktodo.com
。
打开浏览器,进入墨水屏上显示的设置页面。
设置墨水屏要连接的 Wi-Fi 网络和要使用的 API Token。
点击Configure WiFi
按钮进入设置页面。然后选择你想要让默水屏连接的 Wi-Fi 或在 SSID 输入框里输入 Wi-Fi 名。在 Password 输入框里输入这个 Wi-Fi 的密码。在 API Key 输入框里输入刚刚在 einktodo.com 获取的 API Key。
点击Save
按钮。
墨水屏 Todo List 会自动重启并尝试连接 Wi-Fi。如果没有开始连接,你可以按 Reset 按钮重启 ESP32 开发板来触发连接。注意保持 Wi-Fi 信号良好。
如果尝试连接 3 次没有成功,墨水屏将会重新打开 Wi-Fi 热点,你可以重新连接 Wi-Fi 进行设置。
如果在 pin 16 (ESP8266 为 pin0)上连接了按键,长按按键也可以重新进入设置页面。
同步的 Todo List 目前支持苹果的提醒事项应用。其它常用的待办应用将来会逐步集成到 einktodo.com。
点击下面的链接在 iPhone 上安装Sync Einktodo.com
快捷指令。
在 Safari 中打开上面的链接,点击获取捷径
。
点击添加快捷指令
。
添加完之后,找到 Sync Einktodo.com
快捷指令,点击它上面的...
按钮,进入编辑界面。
在Sync Einktodo.com
快捷指令中的文本块中输入刚刚在 einktodo.com 获取的 API Key。
按完成
保存快捷指令。
在快捷指令自动化中,设置打开或关闭“提醒事项”应用时运行此快捷指令来同步待办。
打开快捷指令应用,点击自动化
Tab
点击+
按钮创建自动化, 选择App
,点击下一步
。
设置为打开
或关闭
提醒事项
应用时运行快捷指令
App 那一项选择提醒事项
,勾选打开
或关闭
,并选择立即执行
,然后点击下一步
。
选择Sync Einktodo.com
快捷指令。
这样设置后,当你打开或关闭提醒事项应用时,快捷指令会自动同步待办到墨水屏 Todo List。
允许快捷指令访问提醒事项
当你第一次触发这个自动化时,系统会提示你允许快捷指令将提醒事项应用的数据发送到 einktodo.com,点击始终允许
我在 2022 的年末写了一篇文章 2022 年我买过的最好用的商品,介绍了我 2022 年购入的我觉得最好用的商品。
在这个中文互联网自媒体觉大多数都依赖厂家推广费存活的时代,看到真实的商品评价越来越难。所以我打算每年年末都写一篇这样的文章,介绍我买过的那些我觉得好用或者每天者在使用的商品。让中文互联网上多一丝丝真实消费者的声音。
这是我 2023 年购入的值得推荐的产品:
买了房子之后我就加大了智能家居的折腾力度。在 2022 年我买过的最好用的商品 中我推荐了 Aqara 的窗帘伴侣。今年他们家的毫米波人体传感器发布了第二代,我买了一个试了水。
在使用它之前我用了 4 个红外人体传动作传感器。红外动作人体传感器的缺点是,如果你在房间里不动它就会认为房间里没人。我以前用它们用它们控制灯的开关,在上厕所和其它动作幅度不大的场景下会关灯,导致我常被我家人吐槽。红外人体传感器不适合在家居场景下使用。
购入 Aqara 人体存在传感器 FP2 是我认为毫米波人体传感器经过了几年的发展也差不多成熟了。体验下来它有超出我预期的地方,也有让我对 Aqara 的做法及其失望的地方。
超出预期的地方有:
缺点:
Aqara 有意的让他们家的设备无法在其它智能家居平台上触发自动化。
表面上看 Aqara 表现的很开放,几乎所有的设备都支持 HomeKit。但实际上 FP2 上的包含时间限制的触发自动化功能只能在 Aqara App 里使用。Aqara 既不开放 API(无法通过 HomeBridge 接入 HomeKit),也不能通过什么场景控制等其它方式绕过限制。
安装问题
毫米波人体传感器设备不是低功耗设备,所以它需要接入电源。所以只能选择安装在有电源的地方或者为它拉电源线。而且安装的高度也有要求,不能太高也不能太低。安放它有些麻烦。
识别准确度
识别不能达到 100% 的准确度,有时候会有误判。之前我把它安装在电风扇附近,电风扇的转动会让它误判有人在房间里,我不得不把它移到其它地方。更新的 AI 预测干扰在一定程度上优化了这个问题。但是最近我并没有使用风扇,灯到天所热一些之后才能再次验证这个问题是否解决。
综合考虑对智能家居的自动化提升程度和可接受的准确度,我又买了 3 个 FP2,分别安装在两个卧室和洗手间。目前家中大多数的灯都可以在合适的时候自动打开和关闭了。
我的购买渠道是咸鱼,因为 Aqara 对线上渠道的价格有保护,所以在咸鱼上才能以正常价格买到。
去年买了 Apple Watch Series 7,到现在使用了原装运动表带,淘宝上买的海洋回环、高山回环、和野径回环表带。最后高山回环表带是我最常用的表带。
它的优点是:弹性效适中,带着不晃动。透气,不会让手腕潮湿。比较薄,让我可以在晚上睡觉的时候戴着 Apple Watch,在穿长袖厚衣服的时候也最小限度的影响到了 Apple Watch 的佩戴。
这个表带不耐脏,最好买深色的。
我使用的是 11 寸的 iPad,日常通勤的时候我会带着它在地铁上看书学习英语。为了方便拿取,以及在过地铁安检的时候不用过安检,我找了很久才找到这个包。它刚好能装下我的 iPad,不会感到太累赘。带有磁吸扣的设计,让我在进地铁的可以方便的打开给安检人员看,避免过安检机。使用 iPad 的时候也也以快速的拿出来。
但是价格在我看来略贵。
还有一个非常让人不爽的问题是挂带子的金属件容易掉漆,我要想办法把它们换掉。
今年入手的玩具车,和我以前喜欢玩的游戏 PUBG《绝地求生》中的越野车“蹦蹦”同款。它的对地形的要求很低,哪里都可以玩。
不过价格有点贵,组装也有点麻烦。如果手残的话建议闲鱼上买成品车。
]]>在我们的生活里,习惯就像是无声的指挥官,默默地引导着我们的行动和选择。在《Atomic Habits》这本书中,詹姆斯·克利尔(James Clear)用他洞见卓识的笔触,展现了如何通过习惯的力量来雕塑更好的自我。这本书不仅是养成好习惯的指南,更是一部自我改革的宝典,它教会我们将小变化累加成巨大的成果。
作者詹姆斯·克利尔,一个以自己的转变故事激励人们追求强大个人习惯的灵魂导师。通过在个人发展领域中的不懈努力和深刻的思考,他不仅在书籍的篇章中分享了他的智慧,也在他的网站和各类讲座中,持续地影响着那些渴望改变的灵魂。
书中明示,习惯是我们日常决策的结果,它们定义了我们的效能和最终能达到的高度。我们之所以被困在不满的迷宫,很大程度源于那些未经意识审视的自动行为。因为习惯一旦养成,在无意识的驱动下,就会反复执行而不易察觉。
克利尔在书中提出,培养习惯不仅是为了达成目标,更是为了雕塑身份。那种“我是谁”的信念,影响着我们的选择和行为。比如我自身的经历,将发布 iOS 应用视为过程而非一次性目标,还有每天阅读 15 分钟的习惯,正是这种理念的反映。
书里提到的四大定律,为我们提供了改变习惯的明确路径。
我们的大脑趋向于自动反应日常环境中的线索。通过创建显眼的触发器,如备好健身包放在门口,我们就构筑了迈向健身房的第一步。类似方法可以用于任何我们想要建立的习惯。
积极的感觉是维持习惯的关键因素。我们可以把习惯与自己喜爱的活动关联起来,比如在跑步机上听喜爱的播客,以此增强坚持的动力。
降低好习惯的入门门槛至关重要。比如要养成早起的习惯,可以先从调早闹钟五分钟做起。而同时,增加不良习惯的难度,就像删除手机上的社交媒体应用,以避免不必要的干扰。
适当的即时奖励可以巩固好习惯。每当完成一项任务后给予自己奖励,无论是一杯咖啡还是一个小时的电视时间,都能够加强我们的积极反馈回路。
书籍最终落脚在如何实践。制定一个鲜明的计划,如何每天写博客、读书、运动,然后根据习惯的四大定律将计划付诸行动。重要的是,要让这些活动符合你的身份认同,让自己真正相信“我是一个写作者”,“我是一个爱读书的人”,“我是一个健身者”。
《Atomic Habits》不仅是一本关于习惯的书,它是一张改变生活的地图。詹姆斯·克利尔回答了我们在寻求进步路上的那些困惑,他用科学的方法和真实的故事,指引我们向着更好的自己前进。现在,是时候把这些理念应用于实践,开始自我改革的旅程了!
]]>重读开音节 | 重读闭音节 | r 音节 | re 音节 | 非重读音节 | |
---|---|---|---|---|---|
A | /eɪ/ | /æ/ | /ɑː/ | /eə/ | /ə/ |
E | /iː/ | /e/ | /ɜː/ | /ɪə/ | /ə/ or /ɪ/ |
I | /aɪ/ | /ɪ/ | /ɜː/ | /aɪə/ | /ə/ or /ɪ/ |
O | /əʊ/ | /ɒ/ | /ɔː/ | /ɔː/ | /ə/ |
U | /juː/ | /ʌ/ | /ɜː/ | /jʊə/ | /ə/ |
音节是发音的基本单位,是一个发音的完整单位。
音节由一个元音或一个元音加一个或几个辅音组成。中文里每个字都是一个音节。英文里每个单词会有一个或多个音节。
元音是发音时,舌头不接触上下牙齿,不接触嘴唇的音。通常元音发音时,气流从喉咙出来,通过口腔或鼻腔,不受阻碍,形成的音。
比如:cat /kæt/ 中的 /æ/ 是一个元音。
短元音:/æ/、/e/、/ɪ/、/ɒ/、/ʌ/、/ʊ/、/ə/
长元音:/iː/、/ɑː/、/ɔː/、/ɜː/、/uː/、/ɔɪ/、/aɪ/、/eɪ/、/aʊ/、/əʊ/、/ɪə/、/eə/、/ʊə/
辅音是发音时,舌头接触上下牙齿,接触嘴唇的音。通常辅音发音时,气流在口腔、鼻腔或咽头受阻碍而形成的音。
比如:cat /kæt/ 中的 /k/ 和 /t/ 是辅音。
辅音:/b/、/d/、/f/、/g/、/h/、/j/、/k/、/l/、/m/、/n/、/ŋ/、/p/、/r/、/s/、/ʃ/、/t/、/tʃ/、/θ/、/ð/、/v/、/w/、/z/、/ʒ/
一个音节中,必须有一个元音,可以有一个辅音或几个辅音,但是不能有一个以上的元音。
开音节(open syllable)是一种音节类型。在开音节中,音节的末尾是一个元音字母,即元音字母后面没有紧跟的辅音字母。
开音节的特征:
开音节单词的例子:
词内开音节的例子:
音节后面是一个辅音字母加上不发音的 e,前面这个音节叫做相对开音节。
如:
闭音节(closed syllable)是由辅音结尾的音节。
如:
一个单词中重读的音节,音标中用'
表示
比如:
一个单词中次重读的音节,音标中用ˌ
表示
比如:
下面是自然拼读的常见规则,并不是所有的单词都符合这些规律,仅列出常见的规律。
重读 | 重读 | 重读 | 重读 | 重读 | 非重读 | |
---|---|---|---|---|---|---|
单个元音 | 单个元音 | 单个元音 | 与 re 组合 | 与 er 组合 | 单个元音 | |
开音节 | 相对开音节 | 闭音节 | ||||
A | /eɪ/ baby | /eɪ/ make | /æ/ cat | /ɑː/ arm | /eə/ care | /ə/ about |
E | /iː/ be | /iː/ theme | /e/ bed | /ɜː/ her | /ɪə/ here | /ə/ the /ɪ/ basket |
I | /aɪ/ hi | /aɪ/ bite | /ɪ/ sit | /ɜː/ bird | /aɪə/ fire | /ə/ pencil /ɪ/ rabbit |
O | /əʊ/ go | /əʊ/ home | /ɒ/ hot | /ɔː/ born | /ɔː/ bore | /ə/ today/ |
U | /juː/ july | /juː/ cube | /ʌ/ cup | /ɜː/ burn | /jʊə/ cure | /ə/ until |
字母 Y 有时候等同于元音字母 I。
单个元音字母在重读音节里读字母本身的发音。
A | E | I | O | U |
---|---|---|---|---|
/eɪ/ | /iː/ | /aɪ/ | /əʊ/ | /juː/ |
如:
相对开音节中的元音字母也是字母本身的发音。
比如:
A | E | I | O | U |
---|---|---|---|---|
/æ/ | /e/ | /ɪ/ | /ɒ/ | /ʌ/ |
ar | er | ir | or | ur |
---|---|---|---|---|
/ɑː/ | /ɜː/ | /ɜː/ | /ɔː/ | /ɜː/ |
are | ere | ire | ore | ure |
---|---|---|---|---|
/eə/ | /ɪə/ | /aɪə/ | /ɔː/ | /jʊə/ |
A | E | I | O | U |
---|---|---|---|---|
/ə/ | /ə/ or /ɪ/ | /ə/ or /ɪ/ | /ə/ | /ə/ |
ch | ck | dg | gh | kn | mb | mn | ng | ph | rh | sh | th | wh | wr |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/tʃ/ | /k/ | /dʒ/ | /f/ | /n/ | /m/ | /m/ | /ŋ/ | /f/ | /r/ | /ʃ/ | /θ/ | /w/ | /r/ |
最近开发一个项目 Next.js,部署到 Vercel 上在国内访问速度和稳定性都不太好,所以想部署到自己的服务器上。经过实践后,分享一下怎么用 Github Actions 部署 Next.js 项目到 Linux 服务器上。
在服务器要安装 Node.js 和 PM2,然后配置 Nginx。
推荐使用 [fnm] 来安装 Node.js,以后可以方便的使用不同版本的 Node.js。
1 | curl -fsSL https://fnm.vercel.app/install | bash |
安装好后重新 SSH 连接到服务器终端,用 fnm 安装 Node.js。
1 | fnm install 18 |
我们使用 [PM2] 来管理 Node.js 进程。以便在服务器重启后自动启动项目。
用 npm 安装 PM2:
1 | npm install pm2 -g |
Node.js 项目默认运行在 3000 端口,我们使用 Nginx 来反向代理到 3000 端口。这样就可以使用 80 或 443 端口来访问项目。
在 nginx 配置文件夹 /etc/nginx/sites-available
中创建一个配置文件 example.com.yml
:
1 | server { |
然后在 sites-enabled
文件夹中创建一个软链接。
1 | sudo ln -s /etc/nginx/sites-available/example.com.yml /etc/nginx/sites-enabled/example.com.yml |
然后重新加载 Nginx 配置文件:
1 | sudo nginx -s reload |
安装 certbot 来生成证书并修改 Nginx 配置文件以使用证书。
生成证书:
1 | sudo certbot --nginx |
命令执行后会提示输入邮箱,然后选择同意条款,最后选择要生成证书的域名,然后就会自动的生成证书并修改 Nginx 配置文件和重新加载。
把公钥添加到 Github 仓库的 Deploy keys 中
把私钥到放到服务器的用于发布项目的用户的 ~/.ssh/id_rsa
路径,以便 Github Actions 用 SSH 连接服务器拉取 Github 上的代码。
1 | echo "private-key" >> ~/.ssh/id_rsa |
我们使用 [appleboy/ssh-action@master] 这个 Github Action 用 ssh 来连接服务器,然后执行命令来部署项目。为了安全起见,我们把服务器 host 和端口,还有 ssh 密钥都配置到 Github 仓库的 Secrets 中,这样就不会把服务器的信息暴露到配制文件中。
再生成 SSH 密钥对用于发布项目
把公钥添加到服务器的 ~/.ssh/authorized_keys
文件中
1 | echo "public-key" >> ~/.ssh/authorized_keys |
在 Github 仓库的 Settings -> Secrets -> Actions 中添加名为 key
的 secret,值为私钥。
同样在 Github 仓库的 Settings -> Secrets -> Actions 中添加 host
和 port
。
在仓库的根目录中创建文件夹 .github/workflows
。在此文件夹中创建一个 .yml
后缀的文件。
在配置文件中指定main
分支在 push 时触发 Github Actions,然后指定一个 job 名为 deploy
,在这个 job 中使用 appleboy/ssh-action@master
这个 Github Action 来连接服务器,然后执行部署脚本。在 Github Actions 中可以使用 Secrets 中的变量,这样就不会把服务器的信息暴露到配制文件中。
部署脚本首先用 git clone
拉取代码, 然后安装依赖,最后使用 PM2 启动项目。最后用 pm2 save
保存项目配置,以便在服务器重启后自动启动项目。
1 | on: |
此后每次 push 到 main 分支时,Github Actions 就会自动部署项目到服务器上。
FFmpeg 是一个非常强大的视频处理工具。大多数应用都会使用 FFmpeg 来处理视频。我的 Network RC 项目也使用了 FFmpeg 来处理视频。
Video4Linux2(v4l2) 是 Linux 上的一个视频采集框架,它提供了一套统一的接口,可以方便的接入视频设备的输入和输出。FFmpeg 也可以通过 Video4Linux2 接口来采集摄像头的视频。
v4l2-ctl 是 Video4Linux2 的一个命令行工具,可以用来查看和设置视频设备的参数。
1 | # 查看视频输入设备 |
在 ffmpeg 命令中,使用 -f v4l2
或 -f video4linux2
指定视频输入接口为 Video4Linux2。
使用 -i /dev/video0
指定视频输入设备路径为。
1 | ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -preset ultrafast -f mp4 camera-test.mp4 |
使用 -input_format
指定视频输入格式。
1 | ffmpeg -f v4l2 -i /dev/video0 -input_format yuyv422 -c:v libx264 -preset ultrafast -f mp4 camera-test.mp4 |
使用 -video_size
指定视频分辨率。
1 | ffmpeg -f v4l2 -i /dev/video0 -video_size 1920x1080 -c:v libx264 -preset ultrafast -f mp4 camera-test.mp4 |
使用 -framerate
指定视频帧率。
1 | ffmpeg -f v4l2 -i /dev/video0 -framerate 30 -c:v libx264 -preset ultrafast -f mp4 camera-test.mp4 |
Prettier 是一个代码格式化工具。ESLint 是一个代码检查工具,它可以检查你的代码是否遵循了规范。他们通常会在项目中一起使用。前端开发过程中,我们通常会使用 Prettier 和 ESLint 来保持代码的可读性和统一代码风格和规范。项目脚手架工具和代码编辑器都可以引入 Prettier 和 ESLint 工具。
Prettier 和 ESlint 配置不当,会导致代码格式化和代码检查的冲突。项目脚手架工具和代码编辑器的配置不统一也会导致格式自动修复的冲突。
下面是配制 Prettier 和 ESLint 的方法:
安装 eslint-config-prettier
1 | yarn add --dev eslint-config-prettier |
在 ESLint 配置文件中添加配置
在 .eslintrc.json
文件中的 extends
的最后中添加 "prettier"
;
1 | { |
这样 VSCode 使用 Prettier 插件来格式化代码就不会冲突了。
]]>这本书我是与《自控力》一起读的。都是基于相同的目的而读:学习和运用其中实际可操作的方法,为我开发的 App 设计功能帮用户能够改变自己。
前三章探讨习惯建立过程、大脑、意志力、动力以及这些因素之间是如何相互关联的。接下来的两个章节将探讨合理、科学的途径。最后两章是行动指南和原则。
一个微习惯,是坚持做一件感知不到困难、不会消耗意志的事情。它是潜意识行为。
重复就是(潜意识)大脑使用的语言。
大脑的有两种工作模式,通过重复行为识别模式;抑制模式,改进行为。”模式识别”由基底神经节完成。效率高,消耗能量少。它很稳定,不易改变。
前额皮层可以抑制模式识别,改进已经形成习惯的行为,但能耗较大。
压力会促进习惯性行为,无论这种习惯是好是坏。
因为在压力下,大脑会倾向于使用能耗较少的”模式识别”。
一个习惯在大脑中,是很多条件触发一系列动作的不断的强化结果。也许是某些条件触发某些动作的神经通路在不断重复的过程当中,神经细胞们自发的生长出信号越来越强烈和畅通的连接。
神经通路是大脑里的沟通渠道,这些通路就是习惯在身体里的“长相”。
一旦某个习惯指定的神经通路被一个想法或外部信号触发,脑中就会有一个电荷沿着这条通路放电,然后你就会有一股想进行这项习惯行为的强烈欲望。
在特定条件下总是重复的触发一系列动作,我们要让大脑执行这个过程要消耗的能量越来越少,来获得竞争优势。这就是习惯的生理学和演化学上的意义。
潜意识大脑喜欢效率,这就是我们能养成习惯的原因。当你重复某个行为一段时间后,大脑就能自动完成这个过程了。比起每次都要有意识地进行权衡和选择再决定以同样的方式行动,这种做法更节能。
相比某一天做很多事,每天做一点儿事的影响力会更大。
哪怕是一点点行动,也比毫不作为强无数倍(在数学意义上如此,实际生活中也是如此)
杜克大学的一项研究表明:我们的行为中大约有 45% 源于习惯。
而且大部分每天都在重复,长远看,这种不断的重复叠加起来,要么收益颇丰,要么贻害无穷。
第一步选择微习惯的策略,使用一周弹性计划来确定自己使用单一微计划,还是多项微计划。当自控力较弱时应选选择单一微计划来改善自控力。如果把微习惯当作一项技能来说的话,初学者应该从单一微计划开始尝试。微习惯的每一次任务要到小不会让你在精力疲备的时候也不会产生抵抗,既使会感到它小到很荒唐。
微步骤之小会让我们感到荒唐,这可能是社会标准、更高更大的思维习惯以及自尊心导致的。
在习惯没有连续完成时,进行分解操作。把分解出来的第一步作为微习惯。
想知道习惯是否值得我们付出努力的最佳方法是先认清来源。
列好习惯后,看看你为什么想要实现它们,但别在这一步就停止。再问问为什么,不断地问下去,直到形成循环和重复为止,因为这时候你已经找到了核心。
习惯的的价值要来自于自身的追求。而不是来自于外界的压力。
来自同龄人的压力和别人对你的期待并不是我们要寻找的想法来源。
习惯行为不是主动的思维触发的,而是潜意识能感受到的条件触发的。比如时间、环境、事件、情绪等等。通勤坐地铁会触发我的多邻国打卡习惯,周末则是饭后。当然,饭后也会触发我抽烟的环习惯。
培养习惯的常见依据有两种,时间和行为方式
一个有固定依据习惯会形成得更快,没有依据的习惯会更灵活,触发习惯的概率更高。因为没有依据的习惯通常有多个不同的触发条件,模式更复杂,在大脑中形成得更慢。
只凭借一个依据行事会让你难以获得社会机遇和发挥自主性。
我们可以从简单的做起。培养好习惯让它有固定的时间、环境或事件来触发。然后再逐渐增加触发条件。
习惯需要回报反馈来刺激大脑形成它,大脑会自动把与行为不相关的回报关联起来。
我们能做的是将行为与完全不相关的回报建立关联,一段时间过后,大脑就会把这个行为和回报联系起来,这就是我们想要的!之后,大脑就不再需要这个(硬性建立起关联的)回报来促进行动了。
建立习惯的诀窍就是把它想象成教孩子骑自行车。刚开始,你一边让孩子蹬自行车一边向他保证你在稳稳地扶着他。可是在某个时候你把手松开后,孩子没有你的扶持也能继续骑车了。
回报可以恢复意志力。
通常我们会把回报看作因为做了一件好事而得到的报偿,但回报也能给你回报。
超额完成的满足感本身是一种回报。去学会感受到这种满足,会让你的动力满满。
你在超额完成很多工作后,可能会想奖励自己,以鼓励该行为。
完成习惯后对更大回报的期待又是一种回报形式。
注意,不要在这个时候冲动的增加习惯的大小。
我应该为超额完成习惯设计一个奖励机制。比如在我的应用里超额完成时给出更高的爆击率反馈。
记录自己完成一件事情,也会产生“自我效能感”。我们都感受过这种感觉,记录下来会让这种感觉更具象化,大脑会更容易形成习惯。
不管你选择什么策略,我建议你到睡前再检查自己是否成功。如果你在白天就早早地检查完毕,完成任务的感觉会降低你继续进行额外工作的动力。
我用 Streaks 来记录我的习惯,它可以把每个习惯的日历放在手机、电脑、平板和手表的主屏幕上(苹果生态)。
记录习惯的完成情况,可以让你对习惯的完成情况有更好的了解。及时缩小习惯,防止意志力的过多消耗。
所以在我想开发的的应用中让记录完成情况要很方便,还要有缩小习惯的功能,以及完成情况的日历视图。
真正让微习惯策略脱颖而出的是,你绝不会有失败的借口,绝不会害怕失败,而且绝不会感到内疚。即使你的意志力已经耗尽,微习惯的任务要求是如此之低,你总能找到方法完成。
让习惯行为来激发动力,不要依赖动力来产成行动。前者积攒意志,后者消耗意志。如果前者遇到阻碍就缩小习惯
微习惯绝不会阻碍你进步,就好像火花绝不可能阻碍一场大火的蔓延一样。
超额完成让人产生的满足很愉悦,你可以在每次产生充足的动力时超额完成习惯来感受这种“自我效能感”。
虽然我们完成这些微习惯时依赖的完全是意志力,但我们选择在达到目标后继续努力时,动力就会起作用了。
下意识会追求你过于困难的目标,这会扼杀你的动力。切记,不要在习惯形成之前就想着要扩大习惯的规模。
最大的障碍是耐心。你不想成为那个每天写 50 字的人——你想让自己迅速变成每天能写出 4000 字的人,尽快实现梦想。
急于求成是很常产生的念头。你需要等待习惯的形成,而不能急于求成。
从潜意识层面看,超额完成目标后,大脑会设定一个新的期待值,它承载了你以前设定过的典型目标(你懂的,那些无效目标)带来的负担和压力。
打游戏的时候我常期望一些不可能的胜利(当游戏匹配机制给你分配了不在同一水平的对手时),只少数时候它可以成功。但在游戏中并没关系,我动力充足。现实中应该运用更理性的策略,期待值要合理。
坚持每天进步一点点,比只能坚持做几次就放弃对你的未来更有帮助。
所以,一定要提醒自己,你每天的目标并没有改变,这一点极为重要。
我们要把期待值和精力放到坚持目标上,而不要对任务量抱有较高的期待。
如果一个习惯已经形成,你会发现你不再抵触它;你会产生一种身份认同感;你不需为开始该行为寻找理由;你不再担心你不会完成它;开始行动时是非情绪化的;它很无聊。已经形成的习惯,不会让你高兴,但它对你有好处。
代表行为已成为习惯的信号有:
- 没有抵触情绪:该行为似乎做起来容易,不做反而更难。
- 身份:现在你认同该行为,而且可以信心十足地说“我常看书”或“我是个作家”。
- 行动时无须考虑:你不需要做出执行的决定就能开始该行为。
- 你不再担心了:刚开始时,你也许会担心自己漏掉一天或者早早放弃,可当行为变成习惯后,你知道你会一直做这件事,除非出现紧急情况。
- 常态化:习惯是非情绪化的。
- 它很无聊:好的习惯并不会让人兴奋,它们只是对你有好处而已。
看书 15 分钟,这是我已经养成的习惯。我每天都会看书,我会说我经常看书。每天到了看书的时候不仅会抵触,还会有一丝期待,虽然可能是因为我看的书是我想看的书。 还有多邻国打卡,累的时候一天过一次关卡。比较闲或没给事可做就会多过几个关卡。
不要一次培养过多的习惯。要培养的习惯越多,失败的风险越大。失败会消弱意志。
微习惯策略效果很好,可是如果你在一个行为真正成为习惯之前就停止,继续添加下一组习惯,那么你可能会像个手法拙劣的杂耍艺人一样冒着让手里的橘子全部落地的风险。
让长远对你有用的事情变成你无聊时会去做的一种习惯。养成习惯后,你不会感受到焦虑。让你的生活平淡的向着积极的方向发展。
经常回报自己,尤其在完成微习惯之后.
保持头脑清醒。当你精力充沛时,就容易冲动,错误的估计自己的能力,增加自己的目标大小。
你需要特别注意避免这么做,因为你每对自己提高一点要求,就需要更多意志力才能达到要求,而且就算你应付得了额外的意志力负担,也许还有同时培养多个习惯的目标。
感到强烈抵触时,后退并缩小目标。在执行习惯时,不要让自己的精力过度消耗。这样会让你的意志力耗尽,导致习惯培养的失败。
只要遇到抵触,我就会把任务缩小,问题就解决了。
满意每一个进步。
李小龙有一句名言能很好地总结这一点:“要满意,但别满足。”
用多余精力超额完成任务,而不是制定更大目标。
大目标在纸面上看着漂亮,但只有行动才算数。目标渺小、结果丰硕的状态比反过来好多了。
我们想要确保成功,而不是听成功和失败发号施令。
人们在设定目标时经常犯的一个错误就是没有把动力和精力水平的剧烈波动考虑在内,而是假定到了实施行动的时候,他们能维持或重新激活当前的精神和精力状态。
绝不要小看微步骤。
微习惯策略的核心是一个很简单的大脑错觉,但同时也是一种重视开始的生活哲理,一种认为行动优于动力的生活哲理,一种相信将每一小步积累起来便能让量变转为质变的生活哲理。
反馈是大脑形成习惯路径的关键。通常我们训练的的习惯有着更复杂的条件和动作,形成时间较长。
不要企图用冲动来坚持一件事情,不掺杂情绪的习惯更可靠。
冷静的头脑是建立习惯的最佳思维模式,因为它很稳定,而且可以预见。在不断取得进步的过程中,你可能会兴奋起来,但别让这种兴奋变成你实施行动的原动力。变得依赖动力或情绪正是许多个人成长计划最终失败的原因。
绝不要自欺欺人。
常识告诉我们,一定要突破强烈抵触情绪的阻碍,但我得说,这种做法很愚蠢。
VS Code 推出了 tunnel 插件和服务,现在终于可以方便的在 iPad 的浏览器上打开 VS Code 了。
VS Code 可以在一台电脑上运行 VS Code Server ,并通过 Github 账号登录开启一个 tunnel 隧道生成一个网址,然后在其他设备上打开这个网址就可以使用 VS Code 了。
在服务器上也可以使用 VS Code CLI 命令行工具来启动 VS Code Server。
1 | code tunnel |
网页上使用 VS Code 的体验相当完整。我使用的插件基本上都可以使用。本址端口也可以方便的转换成一个公网地址,可以在 iPad 上访问。对于前端开发来说,可以完全在 iPad 上完成开发。
唯一的问题是 tunnel 隧道的网络延迟会不稳定,影响开发体验。
我在 VS Code 上使用 Vim 插件,需要使用 ESC 键切换模式。但是在 iPad 大部份键盘上没有 ESC 键,command + .
可以代替。也可以修改修饰键映射来解决。
在 Safari 的分享菜单中,可以添加到主屏幕,这样就可以像一个 App 一样使用了。也能得到全屏幕的体验。
]]>1 | git clone https://github.com/THUDM/ChatGLM-6B |
1 | cd ChatGLM-6B |
1 | source .venv/bin/activate |
1 | pip install -r requirements.txt |
1 | cd .. |
修改 webapp.py 文件。
.cuda()
改为 .to("mps")
/Users/eson/git/chatgml-6b-model
。1 | -tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True) |
1 | python webapp.py |
这将会在本地启动一个 web 服务,会自动打开浏览器。
]]>它的作者是凯利•麦格尼格尔(Kelly McGonigal)。她为斯坦福大学继续教育学院开设包括《自控力科学》(The Science of Willpower)和《在压力下好好生活》(Living Well With Stress)两门课程。
她有一个双胞胎姐妹珍妮·麦高尼格,职业是游戏设计师。我想她在开她的课程和写这本书的时候,一定和她的姐妹有过很多的交流。游戏设计通常会用到一些手段来让玩家上瘾,这些手段也可以用在自控力上。
这本书的内容大体上是作者把她在坦福大学继续教育学院开设的课程的内容整理出来的。讲的是自控力的生理机制、提升方法。
我读这本书是想学习和运用其中实际可操作的方法,来增加对自身的时间的分配和撑控能力。还想要为自己开发的,给有同样需求的人使用的 App 乐办(Recreation),做一些更有科学依据的特性。
这一章初略的概括了大脑控制不同行为的几个部份,自控力演化出来的原因。
前额皮质左边和右边以及前额皮质后面靠下的部份,决定的人类的意志力。一些不健康的活动会削弱这些区域的能力。菲尼亚斯·盖奇(Phineas Gage)的前额皮质受损的经典案例证明了这个事实.
原始人类需应激反应来在突发危机前保障生存,但是现代社会更多的是需要自控力来应对未来的挑战。为了适应人类社会的发展,人类需要越来越多的自控力来协调人际关系。在人类的社会环境下,有更多自控力的人,生育的机会越大。
自控力和压力的关系。压力和自控的生理反应是有冲突的,管理压力是提身自控力的重要部分。心率变异率可以反应自控力,越高自控力越强。
自知之明是自控的基础。认识到自己的意志力存在问题,则是自控的关键。
前额皮质并非始终可靠,醉酒、缺觉、分心等都会影响到它,使我们无法控制自己的冲动。
在作决定的时候,你必须意识到自己此刻需要意志力。否则,大脑总会默认选择最简单的。
前额皮质正是大脑中控制冲动的区域。
你自控的时候,大脑的能量供应会增加,从而帮助前额皮质发挥意志力。
应激反应会让你面对最原始的欲望,而这正是你当下最不愿看到的。
当人们感到压力时,交感神经系统会控制身体。这种生理学现象让你能够战斗或者逃跑。心率升高,心率变异度就会降低。
相反,当人们成功自控的时候,副交感神经系统会发挥主要作用,缓解压力,控制冲动行为。心率降低,心率变异度便会升高。
任何给你的身心带来压力的东西都会影响自控力的生理基础,甚至会摧毁你的意志力。焦虑、愤怒、抑郁和孤独都与较低的心率变异度和较差的自控力有关。慢性疼痛和慢性疾病则会消耗身体和大脑的意志力储备
放慢呼吸能激活前额皮质、提高心率变异度,有助于你的身心从压力状态调整到自控力状态
压力和自控的生理学基础是互相排斥的。
一项针对 10 个不同研究的分析发现,改善心情、缓解压力的最有效的锻炼是每次 5 分钟。
放慢呼吸能激活前额皮质、提高心率变异度,有助于你的身心从压力状态调整到自控力状态。
介绍自控力的有限性和“道德许可”现像对自控力的影响。
道德许可效应:是指当人们做出善举后,感到可以为此得到赞同或者批准,从而产生一种道德放松的现象。这种现象会导致人们对道德标准的降低或改变,甚至变得不再尊重这些标准。例如,一个人如果曾经捐款给了慈善机构,他可能会认为自己已经做出了一个善良的行为,而不再认为自己有义务去做出其他的善举,这就是道德许可效应在行为方面的一种表现。
自控时大脑消耗的能量比依照习惯和条件反射行事时多。血液中能量下降时,大脑会首先限制消耗较大的活动。所以当你感到疲惫时,你的自控力会下降。自控和和非自控时,相当于慢思考和快思考,我们不能时刻进行慢思考。
自控力就像肌肉一样有极限
自控可能比大脑处理其他问题时所用的能量多,但远远低于身体运动时所需的能量
因为,自控是所有大脑活动中耗能最高的一项。为了保存能量,大脑不愿意给你充足的能量去抵抗诱惑、集中注意力、控制情绪
重要的是,能预测被试者选择结果的并不完全是血糖含量,而是血糖的变化方向
资源不足时,大脑会选择满足当下的需求;资源充足时,大脑则会转向选择长期的投资
当你的血糖含量降低时,你的大脑仍旧会考虑短期的感受”
自控消耗了身体的能量,而能量的消耗又削弱了意志力。”
他把人们带进实验室,布置了一系列自控力任务,比如集中注意力和控制自己的情绪。他在做每个任务前后分别测量人们的血糖含量。被试者在完成任务后血糖含量降得越多,他们在下一个任务中表现得就越差。看起来,自控消耗了身体的能量,而能量的消耗又削弱了意志力。”
喝到含糖柠檬水的被试者表现出了更强的意志力,而喝到“安慰柠檬水”的人意志力继续减弱。”
现代人在饥饿的时候更愿意冒险。比如,人们饥饿的时候会作出更冒险的投资,在节食后会更愿意“尝试多种交配策略”(这是进化心理学家的术语,实际上指的是背着自己的伴侣偷情)。”
这就意味着,股票经纪人可能在午餐前买进错误的股票,节食者更容易去“投资”彩票,不吃早餐的政客可能觉得实习生魅力难挡
简单说来,只要我们的思想中存在正反两方,好的行为就总是允许我们做一点坏事。
学生们因为驳斥了性别歧视和种族歧视的言论而感觉良好,因此放松了警惕,更容易作出有歧视色彩的决定。他们更可能根据直觉的偏好作出判断,而不去考虑这个决定和他们“追求公平”的目标是否一致
记住我们为什么会拒绝诱惑,这是个很有效的办法。
这一章主要是讲,多巴胺不是认人们感受到快乐的物质,它产生的感觉是期待,它会让你行动起来。
在有压力时,多巴安会让我们去寻找快乐。真正能缓解压力的不是释放多巴胺或依赖奖励的承诺,而是增加大脑中改善情绪的化学物质,如血清素、γ-氨基丁酸和让人感觉良好的催产素。这些物质还会让大脑不再对压力产生反应,减少身体里的压力荷尔蒙,产生有治愈效果的放松反应。
我在开发 App 时多巴胺让我不段追加功能,对 App 发布上线的事情却不顾。应对方法:感受什么期待产生多巴胺,思考当前的行动是否是自己的长期目标。
当大脑发现获得奖励的机会时,它就释放出叫做多巴胺的神经递质
大量的多巴胺并不能产生快乐的感觉,那种感觉更像是一种激励
但有一件事很清楚——这不是喜欢、满足、快乐或真正的奖励会带来的感觉
多巴胺控制的是行动,而不是快乐
大脑正是靠对快乐的承诺让你不停地去狩猎、采集野果、工作和求爱,而不是让你直接感受快乐。
当多巴胺给我们的大脑安排寻找奖励的任务时,我们就展现了自己最敢于冒险、最冲动、最失控的一面。
和有保证的小奖励相比,我们的奖励系统面对可能获得的大奖会更加兴奋
美国杜兰大学的罗伯特·希斯(Robert Heath)在病人的大脑中植入电极,并交给他们一个控制盒。控制盒能让他们刺激自己这个新发现的快感中心。希斯的病人表现得和奥尔兹的小白鼠如出一辙。他们可以自己选择刺激的频率,结果他们平均每分钟会电击自己 40 次。休息的时候,研究人员给他们端来了食物,病人们虽然承认自己已经很饿了,但仍然不愿意停下电击去吃点东西。在实验人员提出终止这个实验或切断电极的时候,有一个病人提出了强烈的抗议。另外一个被试者在电流切断后仍然按了 200 多下按钮,直到实验人员要求他停下来为止
研究表明,即便你摘除了小白鼠大脑中的多巴胺系统,它们仍会在吃到糖果时露出傻傻的笑容。它们不会为了奖励而付出努力。它们喜欢糖,但在吃到糖之前不会想要糖
2001 年,斯坦福神经科学家布莱恩·克努森(Brian Knutson)发表了一份具有决定意义的实验报告,证明了多巴胺会促使人们期待得到奖励,但不能感觉到获得奖励时的快乐
在人类历史的大部分时间里,除非你真的有机会和别人交配,否则你很难看到一个裸体的异性摆出诱惑的姿势。如果你想把你的基因延续下去,这时候最好还是给自己一点动力
2005 年,28 岁的韩国锅炉修理工李承生在连续 50 个小时奋战“星际争霸”之后死于心血管衰竭。他不吃不睡,只想继续玩游戏。听到这件事的时候,我们很难不联想到奥尔兹和米尔纳实验中力竭而亡的小白鼠。
这一章更详细解释了在压力时的大脑动作对人的影响,以及如何应对压力。但我觉得她说应对得方法不实用(《微习惯》一书提畅的方法更有操作性)。
压力状态下,大脑前额能力被消弱。
当我们情绪低落时,大脑更容易受到诱惑
当你感到压力时,你的大脑就会指引着你,让你去做它认为能带给你快乐的事情”
所以你不会想要再消耗意志。
当暴饮暴食的人为体重增加或缺乏自控力感到羞愧的时候,他们会怎么做呢?他们会吃更多的东西来抚慰自己的情绪。当拖延症患者想到自己已经远远落后于进度的时候,他们会万分焦虑,这反而让他们继续拖延下去,不去面对落后于进度的事实。在每个案例中,“想要更快乐”这个目标总是战胜了自控力的目标。
一个目标让自己感到有压力,应当改变目标来减少压力,而不是对抗。
“虚假希望综合征”, 不切实际的目标最终会让你放弃目标。
“虚假希望综合征”:不切实际的乐观可能给我们一时的快乐,但接下来我们就会感到失落。作出改变的决定是最典型的即时满足感——在什么都没做之前,你就感觉良好了。但真正作出改变时面临的挑战却会给你当头一棒,奖励并不像我们想象的那么容易获得。(“我丢了 5 英镑,还做着一份糟糕的工作!”)当我们第一次面对挫折时,失望就会取代最初决定改变时的良好感觉。没能达到预期目标会再度引发曾经的罪恶感、抑郁和自我怀疑,而承诺改变的情绪慰藉作用也消失了。这时,大多数人会彻底放弃努力。只有当我们感觉失控,需要再次拥有希望的时候,我们才会再次发誓作出改变。于是,这个循环又开始了。
缓解压力的活动:
最有效的解压方法包括:锻炼或参加体育活动、祈祷或参加宗教活动、阅读、听音乐、与家人朋友相处、按摩、外出散步、冥想或做瑜伽,以及培养有创意的爱好
真正能缓解压力的不是释放多巴胺或依赖奖励的承诺,而是增加大脑中改善情绪的化学物质,如血清素、γ-氨基丁酸和让人感觉良好的催产素。这些物质还会让大脑不再对压力产生反应,减少身体里的压力荷尔蒙,产生有治愈效果的放松反应
面对压力的方法应该是不要让压力存在,就如《微习惯》中说的一样,让你的目标变得更小,让你的行动变得更小,让你的压力不存在。这需要有足够的耐心和远见来让你能够接受自己缓慢的进步。而不是一下子就想要达到目标,那会让你感到压力袭来。
我们必须避免常见的意志力陷阱,即用“改变的承诺”而不是“改变”来改善我们的心情
这一章讲我们对眼的诱惑更敏感,对未来的自己是麻木的。
看不到直接的奖励会让奖励变得抽象起来,对奖励系统的刺激作用也会减少
我们会把未来的自己想象成完全不同的一个人
脑成像研究发现,我们在考虑现在的自己和未来的自己时,运用的是大脑中不同的区域
当我们考虑未来的自己时,大脑的活动和我们考虑别人的特征时如出一辙
对待眼前的诱惑,我们要让自己和它产生距离(大多数情况下基本无效)。
想获得一个冷静明智的头脑,我们就需要在所有诱惑面前安排 10 分钟的等待时间。如果 10 分钟后你仍旧想要,你就可以拥有它。但在 10 分钟之内,你一定要时刻想着长远的奖励,以此抵抗诱惑。如果可以的话,你也可以创造一些物理上(或视觉上)的距离。
自己做每周计划的时候,对未来的任务只是罗列,没有深刻的思考实施细节。
想像自己的未来在接受挑战的场景。想像得越生动,现在做的决定就越不会后悔。给未来的自己发信息,让你和未来的自己联系越紧密。
我喜欢甘特图,它能让自己更连续的感受未来的自己和更清晰的感受未来自己的状态。
增加“未来自我的连续性”不仅会增加你的存款,还能帮助你应对各种意志力挑战。较高的“未来自我的连续性”会让人现在就做到最好
- 创造一个未来的记忆
- 给未来的自己发条信息
- 想象一下未来的自己
你也可以利用这个特性操控它人.
如果是让其他人承诺奉献他们的金钱、时间或努力,你可以利用他们对未来的想象,让他们提前作出承诺。
这一章讲了人的社会属性包括“羊群效应”、社会认同现象,对人的意志力的影响。
“羊群效应”是由”镜像神经元“的系统来控制的(现在的脑科学实在是太含糊了,因为它过于复杂)。
人生来就要和其他人产生联系。我们的大脑已经找到了一种巧妙的方法,确保我们能产生这样的联系。我们有专门的脑细胞管这件事,它名叫“镜像神经元”。
这种无意识的身体镜像似乎能帮助人们更好地了解彼此,同时带来相互联系、关系密切的感觉。
大脑让我们误入迷途的第二种形式是传染情绪。我们发现,自己的镜像神经元会对别人的疼痛产生反应,也会对别人的情绪产生反应。
最后,当我们看到别人屈服于诱惑时,我们的大脑也可能受到诱惑。
同时,你和优秀的人社交也会让你变得优秀。
但是,这种自动读心术也有一种自控的副作用:它会激活我们心中的共同目标。心理学家称之为“目标传染病”。
目标传染在两个方向上都会起作用——你既可以感染自控,也可能感染自我放纵。但是,我们好像更容易感染上诱惑。
你对一个人越有好感,你就越容易被他影响。
社会传染病在人际网络中传播,那里面都是互相尊重、互相欣赏的人
我们的日常行为受到“社会认同”的巨大影响。
自豪、羞愧等直接了当的控制人的行为。
预想自己实现目标(比如戒烟或献血)后会非常自豪的人,更有可能坚持到底并获得成功,预想自己的行为会受到谴责也很有效
与讨论长期成本和收益的理性论证比起来,自豪、羞愧等社会情感能更迅速、更直接地影响我们的选择。德斯丹诺把这称为“激情的自控
这一章主要解释了“讽刺性反弹”这一现象的的作用和原理。
当人们试着不去想某件事时,反而会比没有控制自己的思维时想得更多,比自己有意去想的时候还要多
压抑人的本能时,就会产生这种讽刺性反弹效应”
“讽刺性反弹” 是由韦格纳提出,大脑的一部分负责监控,另一部分负责操作。监控的那一部份也会让你做出你想避免做出的行动。
韦格纳认为,这和大脑如何处理“不要去想”这个指令有关。大脑把这个指令分为两部分,分别由两个不同系统去执行。
- ”大脑的一部分负责将人的注意力从被禁止的想法那里引开”,韦格纳将这个过程称为“操作”
- “大脑的另一部分则负责寻找证据,证明你没有去想、去感觉、去做你不该去想、去感觉、去做的事”,“韦格纳将这个过程称为“监控”
人们相信的事物会受记忆的强度影响。
“人们会根据想起事情的难易程度来判断它的可能性或真实性。”
“大脑的潜意识不断想到被禁止的内容。这么做的结果是,你会想到、感觉到或去做自己正在努力避免的事”
“当人们试图摆脱一种想法,它却不断回到脑海中时,人们很可能认为它一定是真的。”
书中跟据这一现象提出的应对方法我自己尝试很难达到效果,我觉得更好的方法是让自己的注意力转移在其他事情上,而不是让自己不去想。
“冲动就像渴望一样,只要你不依照其行事,它就会自行消亡”
“放弃控制内心感受,反而能让我们更好地控制外在行为。”
“他们既不需要从冲动上转移注意力,也不需要寄希望于它自己消失,只需好好地观察自己,看看当时自己在想什么,有什么样的冲动,自己的肚子、肺部、喉咙会不会感觉不适”
总体来说,前两章有一点含糊,实践部分不太接地气。担是书中的下面这些知识可以让我更好的理解自己的行为,从而更好的控制自己:
所以大体上还是值得一读的,如果想要更直接的方法,可以看看《微习惯》这本书。
]]>在 Next.js 的 React 组件 props 中,日期类型应当被存储为字符串,而不是日期对象。这是因为 Next.js 的 getStaticProps
和 getServerSideProps
函数要求返回的数据必须是 JSON 可序列化的,而日期对象无法直接序列化为 JSON。
为了在 Next.js 的 props 中使用日期类型,你可以将日期对象转换为字符串。在 JavaScript 中,可以使用 toISOString() 方法将日期对象转换为 ISO 8601 格式的字符串。这样,日期数据就可以被 Next.js 处理,并在组件中使用。
维基百科:国际标准 ISO 8601,是国际标准化组织的日期和时间的表示方法.
例如,在 getStaticProps 中将日期对象转换为字符串:
1 | export async function getStaticProps() { |
在组件中,你可以将字符串格式的日期转换回日期对象,然后用 Intl.DateTimeFormat
将其格式化为所需的样式。
1 | function formatDate(dateString) { |
1 | export default function Blog({ posts }) { |
最近在玩 Stabl Diffusion ,想用老婆的照片来训练一个 LoRA 模型。因为 Mac 上无法调用 GPU 进行 fp16 运算, LoRa 的模型训练无法在 Mac 上运行,所以我用了 Google Colab 来训练 LoRa 模型。下面介绍如何在 Google Colab 上训练 LoRa 模型。
Colab 在空闲时会自动断开连接,释放资源。所以在操作时要尽量保持 Colab 页面不要关闭,并且不要把这个页面放在后台。如果 Colab 页面被关闭,需要重新打开页面,然后从 1.1
开始执行。
选择 “代码执行程序” -> “更改运行时类型”,在硬件加速器选项中选择 “GPU”,然后点击 “保存”。
运行 1.1 安装依赖
。如果出现错误,请重复第 2 步。训练好的 LoRA 模型将保存到 Google Drive,因此需要授权访问 Google Drive。
完成后执行按钮旁边会出现绿色的对勾,大约等待 3 分钟。
LoRA 模型需要搭配基础模型才能发挥预期效果。可以通过执行 2.1 选择一个基础模型
下载,或执行 2.2 指定模型 URL
来下载基础模型。
可以从 https://civitai.com 下载模型按钮上复制模型 URL。
以 ChilloutMix 为例:在 2.2
的 modeUrl
输入框中输入 https://civitai.com/api/download/models/11745
,然后执行 2.2
。
在 2.3
中选择 none
,然后执行。
模型会下载到 pretrained_model
目录下。
3.1
。/LoRA/train_data
文件夹。在 4.1
中勾选 convert
。
执行 4.1
以处理图片。
执行 4.2.1
或 4.2.2
为图片生成 prompts。
在 5.1 的 project_name
输入框中填入 将要创建的 LoRA 模型名称。
下面示范中填的是 test-lora
:
在 pretrained_model
目录下复制底模的路径粘贴到 pretrained_model_name_or_path
输入框
执行 5.1
执行 5.2
执行 5.3
执行 5.4
执行 5.5
开始训练模型。
训练好的模型存放在 Google Drive 的 MyDrive/LoRA/output
目录,示范的文件名为 test-lora.safetensors
。
我的单次通勤时间是一个半小时,全程地铁,由于地铁的运行噪音,我需要一幅降噪耳机。我之前用了 3 年的 AirPods Pro 1 代由于耳机的异响,而且苹果转门针对 AirPods Pro 1 代的维修计划不履行,再加上苹果生态的绑定,我又买了 AirPods Pro 2。
使用体验上二代比一代稍有改进,我感知比较强的两点是:降噪有所提升,耳机仓有了磁铁更方便充电。
这是淘宝上买的一个山寨 MagSafe 充电器和一个无名的铝合金支架的组合,用蓝凝胶粘起来的。放在公司的办公桌上用,充电非常顺手。于是又买了一套放在家里用。
这也是在淘宝购入的,本来想买一对给 iPad 用,避免 iPad 充电频繁拔插。使用了之后发现挺好用的,又买了三对,在 Macbook Pro 上和充电宝这些会反复插拔 USB Type-C 接口的地方都用上了。这个东西支持 USB Gen 2 10Gbps 的数据传输。
这种窗帘伴侣可以无痛将普通窗帘变成智能窗帘。我在家里两个卧室都安装了这个,并设置了晚上自动关窗帘和早上自动打开的定时任务,避免小区对面楼晚上开灯照射到卧室,又让早上起床变得更加轻松。另外它可以通过网关设备同时接入米家和 HomeKit。
智能家居设备中除了灯具、窗帘伴侣,空调伴侣也是一个感知比较强感知的设备。我在家里两个卧室安装了这款空调伴侣。客厅的空调用的是一个博联的红外射频遥控器控制,同时也用它控制电视和遥控的电风扇。这样就消灭了家里所有的遥控器。
这些产品是我今年认为买到的比较值且使用频率比较高的物件,也是我今年最值得推荐的产品,希望对您的剁手有帮助。
]]>封面图:《经济机器是怎样运行的》视频封面。
科学技术见闻和评论。分享优秀的文章、视频、软件、服务和摘录。
这是我写的 React 2022 生态太介绍的博文,希望能给要做 web 开发的人一些帮助。
Shields IO 是一个免费可以生成简单数据的图片服务。
比如,可以生成 Twitter follow 数的和图片,每次加载就会显示最新的数据:
生成 npm 和 GitHub 数据的图片 。我的我的博文 React 2022 的生态 中大量使用了这个服务生成的图片来方便的展示数据内容。
tldr 是一个命令行程序,用于查询其它命令行程序的使用方法
Markwhen 是一个用文本来绘制甘特图的服务, 它还有 VScode 的插件。
Google 实验室出品, 根据自然语意来搜索书籍(仅英文)。
一个非常经典必看的介绍经济知识的视频。作者是桥水基金创始人瑞·达利欧(Ray Dalio)。
VIM 编辑器键位图,来自 Reddit 的用户 electricRGB
我在 VSCode 里用了几年 vim 键位,对它的不常用操作还是不熟练,于是在这个帖子找到了这张高清图片做桌面壁纸。
星际拓荒(Outer Wilds)
它是一款真开放世界的硬科幻解密游戏,你要在一个恒星系中探索它的奇特行星解开一个关于宇宙宏大秘密。作为一个对科幻迷,玩过《星际拓荒》之后,它成为我心目中仅次于《塞尔达·荒野之息》之后排名第二名的游戏作品。
拖延最大的坏处不是耽误,而是会使自己变得犹豫,甚至丧失信心。不管什么事,决定了,就立刻去做,这本身就能使人生气勃勃,保持一种主动和快乐的心情。
来源:文铁生《暴有国的事》
做产品最怕的不是做错需求,而是在称不上对也不那么错的需求中消耗了宝贵的时间,还让产品变得非常笨重。
独立开发者最难的根本不是创造产品,像我每天都有新的想法,而且执行力很强,几天就能肝出来。难的是如何把一个产品持之以恒地运营下去。这里说的运营下去是指,在不完美时就拿出来,找到你的用户群,根据反馈不断修正。这个过程包括写文章,做宣传,社交媒体互动,是独立开发者很不擅长的一块。
来源:Hal 的推文
从 2013 年 React 开放源码到现在已经过去了九年,React 一直是我最喜欢的一个前端开发框架。有追求的团队和公司前端前端团队也都会使用 React 开发。因为 React 的生态丰富又活跃。
这篇文章就来看看 React 2022 年最新的生态。希望对自己和要做Web 开发的读者的带来一些帮助。
前端开发的框架生态主要包含的工具有:
另外还有一些 React 项目多数会被使用的工具:
下面标有
👈🏻
emoji 的项目是我个人推荐使用的。
构建工具是对源代码和资源做编译、处理、打包的工具。前端开发者们作为非常激进的一群开发者,为了使用先进的的语言特性或非直接被浏览器的支持的代码(例如 JSX、CSS 拓展、Vue 组件),创造出了像 Webpack、Vite、Rollup、Parcel、ESBuild 这类工具。
脚手架可以让我们快速启动项目,这两个工具都有对应使用它们的脚手架。
它们都提供了开箱即用的配置,也有自定义配置方法。也都可以使用各自社区的项目模版。
Next.js 是最为流行的 React 服务端渲染框架,被许多大型网站使用,包括 Netflix、GitHub、Uber 和星巴克。如果你的项目有 SEO 和 SSR 的需求,是 React 生态下首选的框架。👈🏻
Gatsby.js 是 Meta(Facebook) 开发的使用 GraphQL 数据源和 React 生成静态站点的框架。许多开发者用它来搭建自己的博客。
Remix 新兴的 React 服务端渲染框架,是由 React Router 的开发团队开发的。相比 Next.js 支持子级路由布局的嵌套,但不支持静态网站的生成。
Docusaurus 专注于文档的静态站点的生成工具,许多开源项目会用它来制作项目网站和文档。
React Native 是 Facebook 在 2015 开源的用 React 来编写代码,但使用非 webview 来渲染的一个框架。至今一直在积极维护和使用。在 React 生态下它是唯一的跨平台开发开发框架。👈🏻
如果不局限于 React 生态的话它存在两个强有力的竞争对手:Cordova 和 Flutter。但是相比 React Native ,Cordova 作为 webview 的套壳的方案,渲染性能不及 React Nitive,适合做 UI 不复杂的应用。Flutter 在语言和应用生态则需要追赶一些时日。
React 2022 的生态里,状态管理库是最难以选择和比较的。因为随着 React 的更新迭代,状态管理管理库的设计哲学和使用范式也经历着巨变和分化。从集中式的到原子式组件自制的管理方式,从 Provider 到 Hooks 的方式分发状态,从实用主义到遵循 React 设计哲学,有丰富的选择。
首先你要选择状态应当集中管理,还是以原子组件自制的方式管理。如果你喜欢以集中方式管理,你可以选择 Redux、MobX 和 Zustand。原子状态管理库可以选择 Recoil 和 Jotai。
Redux 如果你不知道怎么选,这是一个稳妥的选择。但它上手比较难,但随着 Redux Hooks 和 Redux Toolkit 的出现,学习过程变得容易。👈🏻
MobX 非常的实用主义,容易上手,如 VUEX 简单直觉。
zustand 只支持 Hooks 精简的集中式状态管理库。👈🏻
Recoil Facebook 自己也开源了 Recoil 这样的 遵循了 React Hooks 的使用方式的原子状态管理库。
Jotai 也是一个符合 Hooks 精神的原子状管理态库。相比 Recoil 简洁许多。👈🏻
浏览器的路由经过多年的发展,开成了一个简洁而又全面的页面(界面)导航系统。由于它的出色也被其它应用系统吸收。建议在所有大小型的项目引入路由功能。
React Router 在 React 生态中目前是不二的选择。👈🏻
Reach Router 在前几年由 React Router 分化精简出来的,也受到一些开发者的拥簇。
React Hook 能将函数组件内的重复逻辑抽出,为 React 带来了更强大的逻辑封装能力。Vue 3 也效仿推出了组合式 API。
异步请求 hook 通常用来做网络请求,当然也可以用来做其它异步操作。异步 hooks 库通常还会集成常用的异步状态、缓存、渲染优化、自动更新异步数据等一些逻辑功能,会简化我们在 React 中对异步业务的开发。
React Query 被作者定义为异步状态管理器,不仅针对网络请求。
SWR 默认使用 fetch 请求,仅需一行代码,你就可以简化项目中数据请求的逻辑。👈🏻
React Use 是使用最广泛的 React Hooks 集合。包含了很多 Web API 和 JavaScript 常用基础逻辑的 hook 封装。👈🏻
ahooks 是一套由阿里巴巴开源的 React Hooks 库。封装了常用的基础逻辑,以及大量提炼自业务的高级 Hooks。
React 组件化的开发模式,自然对 CSS 也有组件化的要求,于是诞生了各种组件 CSS 绑定方法。
CSS Modules 是 CSS-in-CSS 的方法,它被 cerate-react-app 默认支持。
Styled Components 是目前最受欢迎的 CSS-in-JS 的方案。
react-i18next i18next 一个强大的国际化 JavaScript 插件。 react-i18next 为 React 项目中使用 i18next 提供了方便的工具和组件。👈🏻
react-intl react-init 是基于另一个强大的国际化 JavaScript 库 formatjs 构建的 React 国际化工具库。
组件是 React 设计出来组织代码的方式,UI 组件 和 UI 组件库是 React 生态的最顶层。它们是否丰富反应了一个前端框架是否流行。
如果你在使用 UI 库你可以优先使用组件库内的表单组件,否则你可以在下面选择一个:
React Hook From 使用它的 useForm
hook 和 Controller
组件 API 来帮你实现表单的逻辑。
FORMIK 使用组件的封装的方式提供表单功能。
React Final Form 与 FORMIK 类似。
recharts 是基于 svg 的简洁图表组件库。
visx 是来自 airbnb 团队对 D3 封装的图表组件集合。
G2 是蚂蚁集团大数据可视化解决方案中的图表部份,有丰富的中文文档。👈🏻
VICTORY 是一个视觉风格很独特的图表库。
富文本编辑器在前端开发中是个无底洞,React 生态中有这些开源的组件可以使用,我们要心怀感恩。
Draft.js 是一个富文本编辑器的库,包含了 React 组件,由 Facebook 开发的,在 React 开发者中非常受欢迎。
Slate React Slate 是一个功能丰富的富文本编辑器库,支持 Markdown。官方实现了 React 组件。👈🏻
tiptap 是一个支持实时协作的富文本编辑器。官方实现了 React 和 Vue 组件。
如果想要快速产出一个项目,或者做一些中后台的项目, UI 库是必不可少的。React 有最丰富的开源 UI 库生态。
Ant Design 是阿里蚂蚁金服的前端团队为企业目标用户制作的 UI 组件库。它具涵盖的中后台项目会用到的绝大多数组件,每个组件都有完善的功能,交互体验也非常好。是我最喜欢的 React 组件库。👈🏻
MUI 是根据谷歌的设计指南创建的,提供了全套的用户端 UI 组件,帮助你快速构建一个全新的项目。也是最多人使用的 React UI 组件库。👈🏻
React Bootstrap Bootstrap 5 的 React UI 组件库。
Mantine 一个组件和功能丰富的 UI 库,适合快速构建网站。
单元测试工具是开发生态中重要的一部份。在写通用组件库时,它是必备的!React 常见的测试库有 2 个:
Jest 是最受欢 JavaScript 测试框架。它允许你使用 jsdom 操作 DOM。
React Testing Library 能让你不依赖 React 组件具体实现对他们进行测试的辅助工具。
像云盘和同步笔记类的应用可以分别的解决这类问题,但又在各方面存在着不便。
使用国内的服务,在传输的内容上被受法律影响会被监控和审查。使用国外的服务,又会受防火墙的干扰,使用不顺畅。
于是我找到了 Snapdrop ,是一个跨平台方便在内网传输文件和文本的开源 Web 应用。但是它使用了的 Google 的服务,导致国内无法正常使用。
于是我修改了这一部份,部署了一个可以在国内正常使用的 Snapdrop: https://drop.esonwong.com
进入网页便可自动发现局域网内其它进入这个网页的设备。
点击目标调设备或拖动文件到设备所示的图标上便可以发送文件。
右键点击或长按设备可发送文本。
它也是一个 PWA(Progressive Web Apps,渐进式 Web 应用)。可以启用通知接收文件和文本通知。还可以放到手机桌面,使用便捷。
]]>Nuxt.js 是一个基于 Vue 可用来创建服务端渲染(SSR) Web 应用的框架。
Web 前端的服务器端渲染(SSR)主要有以下好处:
相比非 SSR 的 Web 应用它也会带来一些缺点:
要做到上述优点还能保证用户交互体验,要做到在首次加载页面的时候才进行 SSR。下面的 Nuxt.js 的简要流程图反应的何时才会进行 SSR。
在浏览器进行站内导航时,无需 SSR。
完整的生命周期:https://nuxtjs.org/docs/concepts/nuxt-lifecycle/
Nuxt.js 也可以以单页应用模式和静态站点模式运行,默认以 SSR 模式运行,可在项目根目录下的配置文件 nuxt.config.js
中做修改
1 | // nuxt.config.js |
Nuxt.js 框架会 根据 pages 文件夹的结构自动生成路由的规则:
1 | pages/ |
以 _
开头命名 vue 文件以定义 params, 可用在组件中以 this.$route.params
取得:
1 | pages/ |
⚠️ 使用 NuxtLink 组件在站内路由导航。
⚠ pages 文件夹不要写非页面组件,会生成不必要的路由配置。非页组件应写在 components 文件夹内。
问答: pages/user/list.vue 的访问路径是什么?
如果项目不是部署在域名根目录下,需要配置 router.base
1 | // nuxt.config.js |
由于 SSR,Nuxt.js 的请求库是在服务器端实例化的。所以不能简单的像单页应用一样,封装一个请求模块导出使用。这样使 Nuxt.js 在不同用户访问时共用一个请求实例,会出现用户数据泄漏的问题。
社区提供了 @nuxt/asiox 模块来处理这个问题。
使用:
安装 @nuxt/asiox
包
配置
1 | // nuxt.config.js |
使用方法
https://axios.nuxtjs.org/usage
在 plugin 中添加拦截器:https://axios.nuxtjs.org/extend
为了方便在服务器和浏览器中方便和有统一的方法对 cookie 进行操作,我们可以使用社区提供的 cookie-universal-nuxt
包。
1 | // nuxt.config.js |
它能在 Nuxt.js 的上下文 context
的 app
和 Vue 组件实例中添加 $cookies
对象,其中有对 cookie 的操作方法:
1 | // nuxt middleware |
问答: cookit 设置成 httpOnly 要在哪一端获取 cookit , nodejs or 浏览器?
Nuxt.js 为 Vue 添加了两个钩子
1 | <template> |
fetch 方法来获取数据填充应用的状态树(vuex)。为了让获取过程可以异步,你需要返回一个 Promise,Nuxt.js 会等这个 promise 完成后再渲染组件,如:
1 | <template> |
1 | // pages/somepage.vue |
问答:asyncData 在什类型的组件中使用,页面组件 / 非页面组件?
state
使用 function
设置默认值。 Object
是引用类型数据,在服务器端会在多个用户访问时使用同一个对象引用来初始化 store。
1 | // store/something.js |
减少静态资源的 size。
Element UI 和 Vant UI 的示范:
1 | // nuxt.config.js |
1 | <template> |
使用 nuxt-lazy-load 在用户需要看见媒体时才加载资源。
https://gitlab.com/broj42/nuxt-lazy-load
1 | // nuxt.config.js |
默认配置所有媒体开启懒加载。
背景图片的懒加载:
1 | <div lazy-background="~/assets/images/background-image.jpg">Content</div> |
非懒加载的 img 标签加 data-not-lazy,避免出现一些 bug,比如图片裁切组件等等:
1 | <audio controls="controls" data-not-lazy> |
添加服务器端日志,方便排查日志。
使用 nuxt-winson-log
配置:
1 | // nuxt.config.js |
使用
1 | // pages/page-a.vue |
1 | echo '提交内容' | npx commitlint |
全局安装 @commitlint/cli
1 | npm install -g @commitlint/cli |
@commitlint/config-conventional
包含了 约定式提交 的规则。
1 | npm install -g @commitlint/config-conventional |
commitlint.config.js
文件来配置1 | // commitlint.config.js |
commitlint
命令来测试 commit message运行 echo '提交内容' | commitlint
来测试 commit message。commitlint 命令会打印规范检查信息和返回状态码。
1 | Lint from stdin |
1 | npx @commitlint/cli |
我写了一篇 Husky 入门教程 博文。下面介绍 Commitlint 和 Husky 配合,在提交 message 前自动使用 Commitlint 检查提交规范。
按照 Husky 入门教程 配置好 Husky, 使用下面的命令添加 Husky 的 commit-msg
的 hook:
1 | npx husky add .husky/commit-msg 'npx --no -- commitlint --edit $1' |
配制好后,提交时,Commitlint 会自动检查 commit message 是否符合项目中 commitlint.config.js
文件配制的规范。
Mrm 是一个命令行工具,用于帮助开发者更好对这些工具进行管理配置。除此之外还可以对帮助我们配置 README.md
、license
、package.json
等文件进行管理。
1 | npx mrm gitignore # 生成或更新 .gitignore |
用 npx 命令可以在不安装的情况下使用 mrm。
1 | npx mrm |
这个命令将会列出所有预设支持的配置。
1 | ci Adds GitHub Actions workflow to run Node.js tests |
其中比较常用的有:
创建或更新 .gitignore 文件
1 | npx mrm gitignore |
配置 Prettier 代码格式化工具
1 | npx mrm prettier |
配置 ESLint 代码检查工具
1 | npx mrm eslint |
配置 lint-staged 只对被提交的文件进行代码检查
1 | npx mrm lint-staged |
也可在 ~/.mrm/<TASK>/index.js
创建自定义任务。
比如,我们可以创建一个自定义的 my-gitignore
任务,用于生成或更新 .gitignore
文件。
安装 mrm-core
1 | cd ~/.mrm |
创建自定义任务
1 | // ~/.mrm/my-gitignore/index.js |
执行自定义任务
1 | npx mrm my-gitignore |