2023年4月

3月底,眼睛不舒服,觉得和过度使用手机有关,于是计划买一个电子阅读器代替手机,把随手从口袋中掏出的手机改为阅读器。这个阅读器需要日常放在口袋中,像手机一样,对便携性要求非常高。

另一个要求是系统开放性,完全开放的安卓系统最好,能根据自己的需要安装任何阅读app,但如果是封闭的,至少要能预装微信读书,因为我主要使用微信读书。

最初买了掌阅的iReader Light2,能安装微信读书,6寸的屏幕和我的iPhone 12接近,大小合适。但到手之后发现边框太宽,实际机身尺寸非常大,方方正正的,完全没有手机的握持感。因为粗边框,6寸屏显得非常小,阅读体验一般。于是直接退货了。

此时发现海信的Hi Reader,刚好京东百亿补贴活动,原价1499,补贴后只要999元,虽然比iReader Light2到手价仍然贵了不少,但值得一试,因为它是海信墨水屏手机的一个降阶产品,意味着:

  • 完全开放的Android系统
  • 有类似手机的屏占比

先说结论,目前使用满一个月了,看了几本书,非常满意,走到哪都带着,基本实现了想玩手机的时候就用它替代。下面展开讲讲。

以下是掌阅iReader Light2和海信Hi Reader的参数对比:

参数掌阅iReader Light2海信Hi Reader
机身尺寸156 × 110.6 × 8.6172.4 × 86.6 × 7.5
屏蔽尺寸6寸6.7寸
分辨率1024×756(212ppi)1800×900(300ppi)
重量158g177g
电池1700mAH3000mAH
系统有限开放(能装微信读书)完全开放(可装任何安卓应用)
到手价699元999元

如果只是用来读书,处理器、内存这些性能参数,真的不重要,所以没有列出来。

以我最关心的便携性来说,二者关键区别在于宽度,iReader Light2仅6寸屏,整了110.6毫米的宽度,Hi Reader有6.7寸屏,才86.6毫米宽,便携性碾压iReader Light2;Hi Reader的屏幕尺寸、分辨率和ppi还有优势,阅读体验更好。(如果能来个6寸的Hi Reader,我会更喜欢)

作为对比,iPhone 14 Pro Max也是6.7寸屏,机身尺寸为160.7 × 77.6 × 7.8,重量240g。Hi Reader机身尺寸只略大一点,但重量轻得多,带着它,不会比带着一个iPhone 14 Pro Max麻烦。

找了两张京东官图,可大致感受一下屏占比:

掌阅iReader Light2海信Hi Reader

把iReader Light2和Hi Reader放一起对比,无论从定价还是定位,其实不太公平。掌阅iReader Light2是一个纯粹的阅读器,系统是半封装的,只能安装极少数应用,性能较差。但Hi Reader是一款砍掉了sim卡和相机功能的Android手机,处理器、内存等配置比iReader Light2好不少,可以安装任何Android应用,网上一些评测视频,甚至直接用它打王者荣耀。

就我的使用场景而言,Hi Reader的性能是严重过剩的,价格过高,如果不是百亿补贴打到999元,也未必会买。

续航方面,我只安装了微信读书,只用来读书,3000mAH的电池完全够用。我差不多一两周一充,没具体计算过,估计连续阅读十几小时不在话下。

此外,还有一些锦上添花的小细节:

  • 侧边有一个墨智键,单击能重刷墨水屏,提高清晰度。双击打开特定应用,我直接设置为打开微信读书。
  • 墨智键+音量键,能快速开关背光灯,并且背光灯支持自动感应调整亮度。
  • 待机的时机界面有点酷

这是拾月周刊第19期,从这期开始,我使用自己写的脚本调用亚马逊的AWS SES服务发送本周刊,排版很朴素,希望不影响阅读体验。如有问题,欢迎到博客留言。

韩炳哲

上周分享的播客元宇宙批评 中,主播讲到互联网与社交媒体带来各种社会问题时,提了一嘴韩炳哲,于是这周看了四本他的书。如下:

  1. 他者的消失:当代社会、感知与交际
  2. 倦怠社会
  3. 山寨:中国式解构
  4. 爱欲之死

他者的消失和爱欲之死,是完全相同的主题,或者说,爱欲之死是他者消失的一个切面。讲的是当下社会的同质问题,不再有否定性的他者。我读的时候,甚至觉得两篇内容部分段落完全一样。

倦怠社会是对他者消失的进一步延伸,相比他者的消失和爱欲之死,哲学概念少一些,更容易读懂。

山寨是四部作品中最短的,与另外三本不在同一主题范围。主要介绍中西文哲学的核心差别:中国哲学核心是「变化」,西方哲学核心是「永恒」。其中关于中国收藏家喜欢在艺术作品上加盖收藏印章的讨论,角度十分有趣,具有说服力。

以下是一些其它的感受:

  • 四本书都特别短,均在2-4万字左右,大概就是长点的公众号文章。
  • 大量引用经典哲学的概念和观点,海德格尔、列维纳斯和福柯等哲学家的出镜率相当之高。
  • 德国哲学一直很晦涩,韩炳哲利用这些晦涩的概念分析当下的社会问题,甚至解构一些流行文化(如某些电影),拉近了哲学与现实的距离,比较接地气。虽然仍然不太明白这些概念,但对其中描述的社会问题很有共鸣。
  • 他的作品中论证少,断言多,随便拎出一句都能当格言,再结合有共鸣的现实主题,读起来非常的爽。但社会问题都很复杂,断言简化了问题,未必经的起仔细推敲。
  • 有些作品的主题完全一致,只是从不同角度重新阐述一遍。
  • 他这种短平快的写作风格,正是他所批评的社会的一种现象,有些矛盾。

从这四本书的阅读体验和启发性来讲,我个人挺喜欢的。

随便看看

这周的随便看看有点多,真的挺随便。

1、Reinventing Explanation - Michael Nielsen @ 2014年

作者以「辛普森悖论」为便,介绍图形或其它新媒体形式,能够更好的解释一些科学原理。

2、降级论 - meditic @ 2012年

一种错位竞争。

3、【视频】前京东副总裁,身患绝症后的最后一次创业:自费千万,要救50万人 - Bilibili

主人公名叫蔡磊,身患渐冻症。去年(或更早)看过他的人物专访,读着挺绝望的。今天再看这个视频,他在视频中说:和我同期的病友基本都死了。感慨万千啊。

4、一块伴随 Apple 20 多年发展的小磁铁 - 少数派

从一个小细节,把一家公司的产品史研究的这么细,好有意思。

5、中美关系究竟哪里出了问题? - 纽约时报中文网

喜欢托马斯·弗里德曼的文章,本文给我最大的启发不在于「信任」是两国关系的症结,而在于,为什么今天「信任」比30年前的信任更加重要。—— 因为科技的发展,因为科技产生的联结,因为科技产生的监控问题。

6、龙应台:北京未开一枪,已给台湾社会带来裂痕 - 纽约时报中文网

我们(台湾)在这样的境况之下建起了充满活力的民主,并取得了经济成功,为此我们感到自豪。我们已经证明,民主在中华文化环境里是可以运转的。这种焦虑、骄傲和坚持的混合是台湾性格的本质,而这一点往往被世界所忽视,世界总是视台湾为中美竞争中的一个棋子。然而我们也是有血有肉的人。

7、印度果链、第四次工业革命与“孔乙己” – 虹线

印度人口超过了中国,但人口结构没有。特别是民族结构,这意味着印度的14亿人,无论作为生产者还是消费者,都不是统一的14亿人。

8、特稿丨拼多多正在失控

拼多多「仅退款」功能引导的「恶」以及卖家的起义。

博客更新

这周博客更新了一篇文章:使用Python实现RSS转Newsletter,欢迎邮件订阅本博客更新

缘起

想给博客添加Newsletter功能,并且最好支持RSS转Newsletter,这样一来,只要博客更新,Newsletter能自动更新。

这样的服务挺多的,但多半收费,还不便宜,比如著名的Mailchimp

免费的也有,比如Mailbrew,我用了一段时间,但这个产品已不再维护,最近甚至无法登录,只得放弃。

自己动手,丰衣足食。于是开始折腾。

思路

实现RSS转Email,只需要两个功能:

  1. 表单工具,收集读者邮箱地址,需要支持退订
  2. 邮件发送服务,解析RSS内容使用邮件发出

第2点只需要找个邮件发送服务器,然后使用Python脚本,很容易解决。我选了亚马逊的AWS SES邮件服务,按发送量收费,每1000封邮件0.1刀,就我的博客更新频率和订阅量,成本可以忽略。

第1点,我不想(其实也不会)写前端代码,更不想做服务端开发,操作数据库。很自然的考虑找一个支持API操作的第三方数据库+表单。读者邮件列表是比较重要的数据,需要一个靠谱且容易管理的数据库,Notion的Database和Google Sheet是比较好的选择。二者区别:

  • Google Sheet自带表单工具,但国内无法访问
  • Notion国内可访问,但需要找第三方表单工具

我选了Notion,配合NotionForms,后者提供表单页面/组件,收集数据保存到Notion的Database,免费版不限收集的数据量,完全够用。

OK,广告时间到了,欢迎通过下列表单提交订阅,目前主要推送周刊内容,每周一早上更新。

(整个流程我自己测试都没问题,但毕竟下周一第一次推送,如果收到奇奇怪怪的内容,轻拍)

NotionForms免费版唯一的遗憾是不支持数据更新,意味着不能直接支持退订。

暂时的解决方案是:为退订单独提供一个表单及对应的Notion Database,收到退订申请后,手动删除订阅者列表。

如果退订太多,也可以基于Notion API写个脚本处理,以后考虑。

技术实现

基于上述思路,只需要Python脚本就能完成所有工作,仅三步:

  1. 读取Notion的Database中的Email列表
  2. 抓取RSS数据,获取博客更新
  3. 调用AWS SES发邮件

最后配置crontab定时任务,每天自动执行。

准备工作

当然,需要一些准备工作,大致如下,折腾的过程中没有一步步截图,大家将就看看:

  1. 准备Database:在Notion中创建两个Database,分别为订阅列表退订列表。两个列表都必须有名为「Email」的属性,且属性值类型为「Email」。
  2. 准备表单:使用NotionForms连接Notion,基于上述两个Database分别创建表单。关于表单分享方式,NotionForms支持独立的表单页面URL,也提供iframe嵌入。
  3. 准备Notion Token及权限:前往Notion开发者页面,创建一个integration,类型选择Internal,需要取一个名字,比如「NewsletterAPP」。

    1. 会生成一个Token,请保存好,之后Python脚本中需要使用。
    2. 回到Notion的「订阅列表」Database,点击Database菜单中的「Add connections」,找到刚刚创建的「NewsletterAPP」,添加授权。
  4. 准备AWS SES及权限创建账户啥的就不讲了,有几点注意:

    1. 新创建的账户处于沙盒之中,无法给外部发信,需要提交工单申请移出沙盒。工单中需要详细说明用途,发送量,退信处理方式等。
    2. 需要给账户创建IAM身份,然后获取相应的aws_access_key_idaws_secret_access_key,并保存到~/.aws/credentials。(参考
  5. 需要用到的第三方Python库

    1. requests:不解释
    2. feedparser:RSS解析库,非常好用
    3. boto3:AWS SES的官方库,发邮件很方便

完整代码

1、运行代码,需要把AWS SES的身份凭证需要放到~/.aws/credentials文件中,其它的信息全在代码中补充参数即可。

2、完整代码

#!/usr/local/bin/python3
# -*- coding: UTF-8 -*-

import boto3,feedparser,requests,re,datetime
from botocore.exceptions import ClientError
from time import mktime

# ++++++++++
# 各种参数准备
# ++++++++++

# Notion参数
EMAIL_DATABASE_ID = '' # 订阅列表的database id,在database的url中有
NOTION_API_TOKEN = '' # 在Notion的开发者页面integration中查看
EMAIL_DATABASE_URL = 'https://api.notion.com/v1/databases/{database_id}/query'.format(database_id=EMAIL_DATABASE_ID)
HEADERS = {
    'accept': 'application/json',
    'Authorization': 'Bearer {token}'.format(token=NOTION_API_TOKEN),
    'Notion-Version': '2022-06-28',
    'content-type': 'application/json'
}
PAGE_SIZE = 100

# AWS SES参数
REGION_NAME = 'ap-northeast-2' # AES SES地区,在AWS账户中有
SOURCE = 'Name <email_address>' # AWS SES账户中已经授权的发件人
client = boto3.client('ses',region_name=REGION_NAME)

# RSS地址及个人邮箱,邮件用于接收通知
NOTI_MYSELF_EMAIL = 'email_address' # 每次Newsletter发完后,会邮件通知此邮箱
BLOG_URL = 'https://www.skyue.com/category/weekly/' # 博客URL,在Newsletter正文的底部使用,类似于查看更多
RSS_URL = 'https://www.skyue.com/feed/category/weekly/' # 需要转Newsletter的RSS地址
AUTHOR_URL = 'https://www.skyue.com' # 作者的个人主页,Newsletter正文作者处有用到

# NotionForm取消订阅的表单地址,Newsletter正文底部用到
UNSCRIBE_URL = ''


# ++++++++++
# 开始实现功能
# ++++++++++

# 通过Notion接口,获取邮件列表
# Notion数据库中,邮件地址存放在Email列,且Email列的数据类型为Email
# Notion中,至少需要有一个邮件地址,代码未做无地址的兼容
# 返回数据组,存储邮件列表
def get_emails():
    payload = {"page_size": PAGE_SIZE}
    emails = []
    response = requests.post(EMAIL_DATABASE_URL, json=payload, headers=HEADERS)
    for result in response.json()['results']:
        if result['properties']['Email']['email']:
            emails.append(result['properties']['Email']['email'])
    next_cursor = response.json()['next_cursor']

    while next_cursor:
        payload = {"page_size": PAGE_SIZE, 'start_cursor': next_cursor}
        response = requests.post(EMAIL_DATABASE_URL, json=payload, headers=HEADERS)
        for result in response.json()['results']:
            if result['properties']['Email']['email']:
                emails.append(result['properties']['Email']['email'])
        next_cursor = response.json()['next_cursor']

    # 对邮件列表的数据进行格式校验和去重
    emails = list(set(filter_email(emails)))

    return emails

# 定义一个函数,用于检验邮箱地址格式,过滤不正确的邮箱
def filter_email(emails):
    pattern = r'(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)'
    result = []
    for e in emails:
        if re.match(pattern, e.strip()):
            result.append(e.strip())
    return result

# 通过RSS获取文章内容,并处理好HTML邮件正文,使用feedparser库
# 只获取最新一版文章,返回结果为字典,包括标题、链接、发布时间及文章正文
def get_article():
    rss_weekly = feedparser.parse(RSS_URL)
    title = rss_weekly['entries'][0].title
    link = rss_weekly['entries'][0].link
    content = rss_weekly['entries'][0].content[0].value.replace('<a href="', '<a style="color:#3354AA" href="')
    published = datetime.datetime.fromtimestamp(mktime(rss_weekly['entries'][0].published_parsed)) + datetime.timedelta(hours=8)

    # 根据文章字段,生成邮件的正文部分
    content_html = '''
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>
            {title}
        </title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </head>

    <body style="margin: 0; padding: 0; font-size: 1.2em; color:#111; text-decoration:none; ">
        <table cellpadding="0" cellspacing="0" width="100%">
            <tr>
                <td> 
                    <table align="center" border="0" cellpadding="5" cellspacing="0" width="600"  style="border-collapse: collapse; border-color:lightgray; ">
                        <tr>
                            <td>
                                <h1>
                                    <a style="color:black;text-decoration:none;" href="{link}">{title}</a>
                                </h1>
                                <p>
                                    <i>by <a style="color:black" href="{author_url}">拾月</a></i>
                                </p>
                                <p>
                                    {content}
                                </p>
                            </td>
                        </tr>
                        <tr>
                            <td>-- EOF --</td>
                        </tr>
                        <tr>
                            <td>
                                <p>
                                    链接:<a style="color:black;" href="{blog_url}">往期周刊</a> | 
                                    <a style="color:black;" href="{unsubscribe_url}">取消订阅</a>
                                </p>
                            </td>
                        </tr>    
                    </table>
                </td>
            </tr>
        </table>
    </body>
    </html>
    '''.format(
        title=title, 
        link=link, 
        content=content,
        blog_url = BLOG_URL,
        unsubscribe_url = UNSCRIBE_URL,
        author_url = AUTHOR_URL
        )    
    
    return {
        'title': title,
        'link': link,
        'published': published,
        'content_html': content_html
    }

# 定义一个日志写入函数,用于保存相关成功或错误信息到日志文件
def write_log(text):
    with open('email_send_log.txt', 'a') as f:
        f.write(text)


# 定义发送邮件的函数,参数:
# 类型:发送给自己的通知,还是发给读者的文章,会记录到日志中
# 收件人:
# 标题:
# 正文:
# 返回值:发送状态,True or False
def send_email(email_type, to_email, title, body):
    try:
        # 尝试使用aws ses发邮件
        response = client.send_email(
            Destination={
                'ToAddresses': [
                    to_email,
                ],
            },
            Message={
                'Body': {
                    'Html': {
                        'Charset': "UTF-8",
                        'Data': body
                    },
                },
                'Subject': {
                    'Charset': "UTF-8",
                    'Data': title,
                },
            },
            Source=SOURCE,
        )
    # 保存日志,成功或错误都保存,并返回发送状态
    except ClientError as e:
        log = '{dt} {email_type} to {email} error info: {error}\n'.format(
            dt=datetime.datetime.now(),
            error=e.response['Error']['Message'],
            email = to_email,
            email_type = email_type
            )
        write_log(log)
        return False
    else:
        log = "{dt} {email_type} to {email} success message_id: {messageid}\n".format(
            dt = datetime.datetime.now(), 
            messageid=response['MessageId'], 
            email = to_email,
            email_type = email_type
            )
        write_log(log)
        return True

# 批量发Newsletter,返回发送成功和失败的数量
def send_newsletter():
    success_cnt = 0
    failure_cnt = 0
    emails = get_emails()
    article = get_article()
    have_new_post = 0
    #判断文章时间,如果是当天的,才发
    if article['published'].strftime('%Y-%m-%d') == datetime.datetime.now().strftime('%Y-%m-%d'):
        have_new_post = 1
        for email_addr in emails:
            status = send_email('send_newsletter_email' ,email_addr, article['title'], article['content_html'])
            if status == True:
                success_cnt = success_cnt + 1
            else:
                failure_cnt = failure_cnt + 1

    return {
        'success_cnt': success_cnt,
        'failure_cnt': failure_cnt,
        'have_new_post': have_new_post
    }
    
    
if __name__ == '__main__':
    try:
        result = send_newsletter()
        # 记录脚本运营状态
        write_log('{dt} run_script success: success_cnt={success_cnt}, failure_cnt={failure_cnt}, new_post={have_new_post}\n'.format(
            dt=datetime.datetime.now(),
            success_cnt=result['success_cnt'],
            failure_cnt=result['failure_cnt'],
            have_new_post=result['have_new_post']
        ))
        # 邮件通知自己脚本的运行状态
        send_email('send_noti_myself' ,NOTI_MYSELF_EMAIL, 
                   'Newsletter脚本运行通知',
                   '<html>发送成功:{success_cnt},发送失败:{failure_cnt}, 更新数量:{have_new_post}</html>'.format(
                        success_cnt=result['success_cnt'],
                        failure_cnt=result['failure_cnt'],
                        have_new_post=result['have_new_post']
        ))
    except Exception as e:
        write_log('{dt} run_script error: {e}\n'.format(dt=datetime.datetime.now(),e=e))
        # 邮件通知自己脚本的运行状态
        send_email('send_noti_myself' ,NOTI_MYSELF_EMAIL, 
                   'Newsletter脚本运行通知',
                   '<html>脚本运行报错:{e}</html>'.format(e=e))

3、设置定时任务

比如我将代码保存在/sky/job/newsletter/newsletter.py,然后设置如下crontab任务,每周一早上8点执行。

0 8 * * 1 python3 /sky/job/newsletter/newsletter.py >> /sky/job/newsletter/crontab.log 2>&1

这是拾月周刊第18期,上周刚切到Mailbrew,这周就无法登录,估计Mailbrew撑不了多久。所以也下掉了博客上周刊邮件订阅入口,已经订阅的目测还能收到Mailbrew的邮件。

元宇宙是什么

元宇宙在2021年-2022是最火的一段时间,但2022年底ChatGPT出来后,已经看不到人们讨论元宇宙了。因为它实在太遥远,不落地。不像ChatGPT已经让程序员效率大幅提升。尽管元宇宙不火了,但如果想了解元宇宙,以下4条内容或索引非常适合。

1、

【播客】元宇宙批评 - 机核游戏频道 GADIO @ 2021年

机核讲元宇宙这一期,去年听过,这周又听了一遍,做了很多笔记,至少是我目前听到的播客中,元宇宙讲的最详实的一个。

内容不局限在似是而非的概念层面,有不少的技术细节分解。困难涉及到很多方面,从结论看是:目前的技术远远做不到大规模、逼真(无限细节)、实时的3D渲染及交互。关键瓶颈是算力及数据传输(也包括存储)。

实际上,如果看科技史,每次革命都是算力及网络突破带来的。比如当下的ChatGPT,也是算力突破带来的,|第15期的分享的《The Bitter Lesson - Rich Sutton / 2019》有专门讨论。

2、

【播客】与其热议「元宇宙」,我们更想讲个荒诞的故事 - 声东击西 @ 2021年

声东击西这期,可以作为了解元宇宙的一个补充,播客主要分享了《RuneScape》游戏在委内瑞拉和《Axie Infinity》游戏在菲律宾的故事,从中看到游戏世界(绝大多数人想象元宇宙时所参考的实体)与现实的交织。这两个故事在上面机核的播客中也有提及,但没有细讲。

《RuneScape》中黑帮那一段,与《Axie Infinity》中放贷那一段,给我的感觉就是,无论科技怎么发展,现实社会底层的逻辑没有变化。

3、

Framework for the Metaverse — MatthewBall.vc @ 2021年
'The Metaverse Primer' — MatthewBall.vc @ 2021年

机核和声东击西的播客节目中,都提到并引用了Matthew Ball的内容。

Matthew Ball是元宇宙领域的一个投资人,非常早就开始研究元宇宙,《Framework for the Metaverse》是他对元宇宙的总结,并将元宇宙拆分为8个组成部分,每个部分又单独写了文章介绍,《The Metaverse Primer》则是9篇文章的汇总专题。

4、

【电影】头号玩家 (豆瓣) @ 2018年

关于元宇宙的实体想象,很困难,没人说的清楚。头号玩家提供了一个可能性的视角,也是很多人回答「元宇宙是什么样子」的时候,常用的例子。

同样的本周重看了一遍,仍然觉得很割裂,元宇宙看似自成体系,但仍然在现实之中,起码没有脱离「游戏」的概念。

随便看看

WSJ发了一篇情节百转千回的报道... - @阑夕的微博

远程办公非常有意思的一个「副作用」:在美国,远程办公越来越多,程序员们也很开心,但企业却发现既然都远程了,为什么不雇佣印度等地成本更低的程序员呢?于是,程序员们开始讨论,要不要回去办公,不然连饭碗都保不住。

其背后的逻辑在:任何资源的流动,一旦打破了物理空间的限制,在利益的驱动下将极速分化。信息的流动、财富的流动莫不如此,远程办公打破的是劳动力的流动。

What Are Reasonable AI Fears? - Robin Hanson

Robin Hanson是经济学家,从经济学角度分析了AI威胁论。我觉得其中有一条评论非常有启发性:

经济学作为一个研究领域是基于人们对激励的反应。换句话说,它假设人们以某种​​方式做出反应以最大化他们的个人利益,无论这些利益是什么。但这个基本假设,适用于AI吗?

我觉得未必,人性的这些侧面,其中一个重要来源是生命的有限性,但AI永生。没有这些基础假设之后,我们该如何预测AI的行为呢?

Montana passes bill blocking users from downloading TikTok

美国蒙大拿州通过法案阻止用户下载TikTok,后面还有签署等环节,预计2024年生效。尽管一个州的禁止不具操作性,但本身是个非常强烈的信号。

这是拾月周刊第17期。本期开始把邮件服务切换到Mailbrew,它能直接将RSS转Newsletter,比Substack发布更方便。

上一期讲了时间管理,这期讲一个相关主题:知识管理。

知识管理

这部分主要分享三个对我目前的笔记流程有较大影响的方法论。

1、

【图书】卡片笔记写作法 (豆瓣)

卢曼创建的卡片笔记在知识管理领域的地位,大概和GTD在时间管理领域的地位相当。

它强调笔记的原子化,一则笔记讲清晰一件事、一个概念、一个思考。关于一条笔记,有新的思考,可以不断在下面进行追加。在这个体系下,最终形成一个带有层级的树状知识库。

相应有一个概念叫MOC(Map of Content),以大纲的方式整理笔记,为每一则笔记在大纲中寻找一个位置。它的作用在「整理」二字,我觉得是一个消化吸收笔记的好方式。只记录,不整理的笔记,没有价值。

2、

【系列】Evergreen notes - Andy Matuschak

Andy Matuschak提出的常青笔记(Evergreen Note),与卡片笔记非常像。它强调对一则笔记的持续迭代和补充,而这种补充可能是以链接的方式链接到另一则笔记,最终形成一张知识网络。

关于常青笔记,有一个中文翻译计划,同时推荐Andy Mutuschak在Youtube上的直播视频,看看他每天早上是如何记笔记的。

3、

P.A.R.A. 是什么及在 Notion 中的应用 - 少数派

P.A.R.A.是项目(Project)、领域(Area)、资源(Resource)、 档案(Archive)的简称。这是一种按笔记功能(如项目vs资源)和生命周期(如用完归档)对笔记进行管理的方法。

前面介绍的卡片笔记和常青笔记,内容上更加侧重个人知识网络的建立。而PARA方法,则把知识工作相关的所有内容都管理起来,比如项目,是一个非常临时性的东西。因为解决的问题不同,它与前面两个方法能结合起来用。

随便看看

1、

最好的公司如何衡量内容质量 - DemoChen's Clip

介绍SEO和内容营销。
其中有一个重要的PDF:Google搜索质量评估指南

2、

Existential risk, AI, and the inevitable turn in human history - Marginal REVOLUTION

至少最近的两代人,生活在历史之外的泡沫中。既没有战争,也没有颠覆性的技术革命。而现在,泡沫可能要破了,AI可能带来颠覆性技术革命,而乌克兰和台湾局势可能引发更大规模的全球冲突。

3、

The Idea Trap - Bryan Caplan / 2004

想法、增长、政策三个变量相互影响,可以是正循环,也可能陷入负循环。而状态的改变,可能只是运气。

If both good and bad combinations of growth, policy, and ideas are stable, why does anything ever change? The answer, in my model, is luck.

这当然是放在社会角度看,放在个人角度,有点「思维决定命运」的味道。

4、

【播客】ScaPo#7 - H老师 - 康师傅和朋友们

闲聊节目,涉及到一些网络安全的知识。嘉宾目前从事推荐算法工作,喜欢他分享的一段经验和观点:现在算法的问题主要由「以时长为目标」的训练导致的,如果切换到别的目标,用户用起来也是可以很幸福的。并且,他曾在小项目中做过尝试。

5、

A Programmer Turned an Open Source Tool Into a $7,500,000,000 Empire | by Sanjay Priyadarshi | Level Up Coding

WordPress创始人Matt Mullenweg的故事,84年生,03年创建了WordPress。

写了什么

最近一段时间博客有些更新,分享其中两篇: