#902 Web 分词 API

2023-04-21

看了 How to split JavaScript strings into sentences, words or graphemes with "Intl.Segmenter" 了解到,现在 Web 已经支持分词了:

const text = `我爱北京天安门,天安门上太阳升。伟大领袖毛主席,指引我们向前进。`;
const granularities = ["sentence", "word", "grapheme"];
granularities.forEach(function (granularity) {
  // console.log([granularity, index, self])
  let segmenter = new Intl.Segmenter("zh", { granularity: granularity });
  let seg = segmenter.segment(text);
  // console.log(seg) // Segments{}
  let result = Array.from(seg, (s) => s.segment);
  console.log(result);
});
// ['我爱北京天安门,天安门上太阳升。', '伟大领袖毛主席,指引我们向前进。']
// ['我', '爱', '北京', '天安门', ',', '天安门', '上', '太阳', '升', '。', '伟大', '领袖', '毛主席', ',', '指引', '我们', '向', '前进', '。']
// ['我', '爱', '北', '京', '天', '安', '门', ',', '天', '安', '门', '上', '太', '阳', '升', '。', '伟', '大', '领', '袖', '毛', '主', '席', ',', '指', '引', '我', '们', '向', '前', '进', '。']

#901 Golang 程序中内嵌 Lua

2023-04-19
package main

import (
    "fmt"
    "github.com/Shopify/go-lua"
)

func main() {
    state := lua.NewState()
    defer state.Close()

    // 加载 Lua 代码
    lua.DoString(state, `
        function add(a, b)
            return a + b
        end
    `)

    // 调用 Lua 函数
    lua.GetGlobal(state, "add")
    lua.PushInteger(state, 1)
    lua.PushInteger(state, 2)
    lua.Call(state, 2, 1)

    // 获取 Lua 函数返回值
    result := lua.ToInteger(state, -1)
    lua.Pop(state, 1)

    fmt.Println(result)
}

#900 进击巨人的一些细节

2023-04-18

人物关系

时间线

  1. 两千年前,尤弥尔生活的村子遭遇艾尔迪亚人入侵,尤弥尔与其他村民一样,被割去舌头,成为初代弗里茨王的奴隶。

  2. 谁放跑了猪事件:猪圈没有关,猪逃跑了。初代弗里茨王要求犯人主动承认,否则所有奴隶挖掉一只眼睛。众奴隶指认尤弥尔,尤弥尔被当做猎杀游戏的猎物。

  3. 尤弥尔是一个心地善良,时刻为他人着想的人。放走小猪可能真是她做的。

  4. 你自由了,然后开始猎杀。这和后面“自由”这个词每每包含不好的寓意相呼应(艾伦放弃了所有一生追寻的自由也是毫无意义,反而成为自由的奴隶)。

  5. 受伤的尤弥尔逃到一棵大树下,意外跌落到树洞里的水坑中,接触怪诞虫,获得巨人之力。

  6. 始祖尤弥尔的巨人形态看起来非常巨大。

  1. 奴性太强,导致尤弥尔继续回到了初代弗里茨王的身边,继续做奴隶,并成为生育机器为其生下三个女儿:玛利亚,罗塞,希娜。

  2. 帕拉迪岛(乐园)三堵墙的名字就是从这里来的。

  3. 驻足观望他人婚礼的画面似乎想说明她对爱情的渴望。加上奴性的缘故,和弗里茨王生育子女可能使其产生了一种畸形的、单向的、受虐狂的爱。

  4. 艾尔迪亚人获得尤弥尔这个大杀器之后疯狂使用,使艾尔迪亚从一个小部落一跃而成当时最强大的帝国。与之相随的是曾经强大的马莱帝国覆灭。

  5. 枭对格里沙说的话可以参考:

    马莱人讲,艾尔迪亚人对他们实行民族清洗。
    可是哪有能经历两千年的清洗不被消灭,反而能迅速崛起,称霸全球的民族。
    艾族人说,他们只是利用巨人之路修路搭桥搞建设。
    这恐怕也不符合我对人性的认知。

  6. 十三年后,被压迫的人(可能是同族,也可能是他族)反抗,刺杀初代弗里茨王。始祖尤弥尔替王挡枪。
    王命令尤弥尔站起来:“这根本不能伤害到你!”
    可是尤弥尔没有生的欲望,违背了王的命令,然后闭上眼睛死去。

  7. 这导致后面每一代巨人获得巨人之力 13 年之后死亡(就是一个强设定,没有原因)。

  1. 初代弗里茨王命令尤弥尔的三个女儿吃掉尤弥尔的身体,从而使得巨人之力继续传承。

  2. 不知道怎么回事,最后巨人之力分裂成了 9 份,分别是始祖巨人、超大型巨人、进击的巨人、女型巨人、铠之巨人、颚之巨人、兽之巨人、战锤巨人、车力巨人。

  3. 始祖巨人的能力最为逆天,能控制艾族人的思想,改变艾族人的基因等等等等。
  4. 这 9 个巨人也被称之为智慧巨人,持有者(宿主)在有强烈意愿并受伤的情况下能够变身,然后也可以从巨人脖子上剥离出来。
  5. 根据后面的剧情,持有者刚继承的时候可能会失忆,操作也不熟练。
  6. 巨人只能由艾尔迪亚人继承,一个艾尔迪亚人能够同时继承多份巨人之力。

    1. 主角艾伦最后同时拥有始祖巨人、进击的巨人、战锤巨人
      1. 进击巨人:枭 -> 格里沙 -> 艾伦
      2. 始祖巨人:乌利 -> 弗丽达 -> 格里沙 -> 艾伦
      3. 战锤巨人:戴巴家族 -> 艾伦
  7. 145 代弗里茨王 —— 卡尔·弗里茨,不战之约。

  8. 巨人信息:

  9. 始祖巨人 :墙内之王

  10. 进击的巨人 :追求自由,枭 -> 格里沙
  11. 战锤巨人 :马莱高层
  12. 超大型巨人 :马莱战士,体型大
  13. 女型巨人 :马莱战士,
  14. 铠之巨人 :马莱战士,
  15. 颚之巨人 :马莱战士,灵活,咬合力
  16. 兽之巨人 :马莱战士,远程攻击
  17. 车力巨人 :马莱战士,战力有限

巨人不用吃东西,可以永生。
吃了人也无法消化,之后又会吐出来。
网上有资料说,曾经有孕妇被巨人吃下去,然后吐出来,肚子里的孩子存活。

  1. 帕拉迪岛信息:

    1. 100 多年前,巨人突然出现,人类几乎被炫干净了,只剩最后一小部分人筑墙,挡住巨人攻势。
    2. 立体机动装置(可以让人变成蜘蛛侠,需要 “瓦斯” 喷气反作用力推进)。
    3. 巨人可以通过切断脖子斩杀。但是故事开始的时候斩杀巨人还非常困难。
    4. 曾经有一个矿工试图尝试从地下挖出去,结果发现墙壁在地下还有很深,挖了几个小时都没有挖到头。
      后来和朋友都失踪了。
    5. 宗教,牧师,墙崇拜。
  2. 格里沙·耶格尔是调查兵团团长基斯·夏迪斯在墙外调查救回来的。
    格里沙自称失忆,只记得自己是一名医生。后来和基斯成为好友,了解到墙内的很多事情。
    当时基斯暗恋着卡尔菈·耶格尔。也正因为这个关系,格里沙和卡尔菈相识,后面结婚了,生下艾伦。

  3. 尤弥尔还是马莱的一个无名小乞丐,被一些人选中,取尤弥尔这个名字,冒充艾尔迪亚王室,充当救世主,接受马莱收容所艾族人跪拜。

  4. 785 年(大约),尤弥尔所在团体被查获,尤弥尔和组织者被放逐到帕拉迪岛。

  5. 832 年,牺牲 20 人的代价,成功捕捉巨人(伊尔泽剧情提及)。

  6. 843 年,马莱巨人战士候补生的选拔(六选五)中,马赛为了保护弟弟波尔克(智慧巨人只有 13 年寿命),在评比中动了手脚,刻意将弟弟刷下去,从而吊车尾的莱纳才有了机会继承铠之巨人。
    不知情的莱纳非常开心,获得荣誉马来人身份,找到亲生父亲,希望得到父亲的认可,从而可以一家人开心的生活在一起。但是父亲对他们母子依然非常厌恶。

  7. 844 年,埃尔文胁迫利威尔加入调查兵团。
    第一次参与壁外调查(#23)时,利威尔的两个伙伴死亡。

  8. 844 年,三笠(也被翻译为米卡莎)父母双亡,被艾伦父母收养。重要节点:第一季开始

  9. 845 年,马莱派遣巨人战士队四位成员潜伏上岛,试图夺取始祖巨人。

    • 颚之巨人 马赛‧加里亚德
    • 铠之巨人 莱纳·布朗,后面的剧情中战绩感人,可以称得上“不胜巨人”
    • 超大巨人 贝特霍尔德(贝尔托特)·胡佛
    • 女巨人 阿尼·利昂纳德

    刚一登岛,马赛向莱纳坦白巨人战士候补生选拔中的事情,莱纳愣住了。
    结果埋在土了的尤弥尔突然冒出来,扑向莱纳,在场众人都懵了。
    只有队长马赛反应过来,救下莱纳,但自己被吃掉。
    剩下的几个人竟然都吓得逃跑了,包括被救下的莱纳。
    结果马赛牺牲,颚之巨人也被夺走了。
    马莱小队没有战斗觉悟的体现。

  10. 845 年,故事开始此时好友三人都 10 岁。希干希纳区沦陷

    1. 艾伦的梦境,流泪 伏笔
    2. 责备汉尼斯叔叔他们驻屯兵团不应该喝酒,应该有随时战斗的觉悟
    3. 调查兵团回城
      基斯·夏迪斯,现任调查兵团团长
      埃尔文·史密斯,分队长
    4. 三笠告密:艾伦想加入调查兵团
      妈妈卡尔菈非常生气
      爸爸格里沙·耶格尔许诺回家之后带艾伦去秘密地下室
      阿明·阿诺德出场,被欺负,然后被艾伦和三笠救下,随即一起聊天,直到巨人来袭
    5. 超大巨人来袭,踢开大门,玛利亚之墙南部瓮城希干希纳区沦陷
    6. 被汉尼斯扛在肩上的三笠头疼:“又来了” 伏笔
    7. 几个小时之后,铠之巨人洞穿玛利亚之墙南门。
  11. 破墙的那天晚上,格里沙找到雷伊斯家,希望他们能出来拯救民众。
    正好雷伊斯家正在举行巨人之力传承的仪式,乌利·雷伊斯被侄女弗丽达吃掉。弗丽达和叔叔一样,还是没有摆脱先辈不战之约的影响,放弃作战,拒绝拯救民众。
    格里沙吃掉刚刚继承巨人之力的弗丽达,抢走了始祖巨人。
    疑问:为什么这个时候格里沙自己没有出来战斗?可能是去治病的地方太远,赶回来的时候已经来不及了。然后打不过?
    疑问:为什么夺始祖巨人,并杀光王血?艾伦的唆使,艾伦想拥有始祖巨人的力量。

  12. 不知道具体的时间点,格里沙找到艾伦,想让艾伦继承巨人之力。
    这个时候基斯看到,对他说:“你又要对人施加诅咒了吗?”
    随后在树林中,给艾伦地下室的钥匙,叮嘱他回去看看,然后给艾伦注射脊髓液,让艾伦吃掉自己继承进击巨人和始祖巨人。
    第二集,艾伦梦境里有回忆到。艾伦一直在哭喊,“妈妈去世之后,爸爸就变得很奇怪”。

  13. 粮食危机 -> 开荒 -> 没起到什么作用

  14. 846 年,玛利亚之墙夺还战
    总人口的 20%,大概 25 万人牺牲,最后只活下来一百多人。阿明的爷爷(漫画版是父母)也牺牲了。

  15. 847 年,伊尔泽·兰纳参与第 34 次壁外调查,牺牲。

    失去马匹,立体机动装置损坏,孤身一人,在野外逃亡。一边记录壁外情报,一边向城墙方面赶路。
    中途遭遇一个会说话的巨人,对伊尔泽跪拜,并说出:“尤弥尔大人,欢迎回来”。(认错人了,应该是和尤弥尔一起被放逐的那个组织的成员)
    伊尔泽震惊之余,愤怒责问巨人为什么要吃人,明明不用吃人也能一直活着,你们应该从这个世界消失!这也是为了进一步获取情报。
    不料,巨人随即失控,咬掉了伊尔泽的脑袋,将身体部分存放在树洞里面。
    直到死亡的最后一刻,在巨人口中,还在记录巨人的情报:牙齿很大,嘴有点臭。

  16. 847 年,好友三人加入训练兵团 104 期,开始了 3 年的训练
    基斯教官(受不了现实和理想的巨大反差,战士惨死带来的负罪感,兵团长职务已经换埃尔文了)

    1. 艾伦平衡性测试始终通不过,最后在卖命的训练下勉强合格。这时发现是艾伦的设备有故障,所以很难平衡。
    2. 后面《旁观者》中说,是基斯教官故意破坏的。应该是出于对卡尔菈的爱,就像斯内普对莉莉一样。
  17. 除好友三人之外,同一期的战友清单:

    1. 莎夏
    2. 故乡三人组
    3. 莱纳
    4. 贝尔托特
    5. 阿尼
    6. 尤弥尔
    7. 克里斯塔(真名:希斯特莉亚·雷伊斯,真王族罗德·雷伊斯的私生女)
    8. 柯尼
    9. 马可
    10. 约翰
  18. 849 年,第 49 次壁外调查,回收伊尔泽的笔记本。
    里面关于巨人说话的情报还是给韩吉队长和调查兵团不小的震惊,随即调查兵团通过了韩吉的巨人捕捉计划,研究巨人。

  19. 850 年,104 期毕业

    1. 为什么能力强的去最安全的地方,远离战斗?
    2. 这一期中出了 6 个智慧巨人,一个女王。
    3. 一共 12 人加入调查兵团。
    4. 一共 n 人加入宪兵团。
  20. 850 年,第 57 次壁外调查,前往艾伦家的地下室,查明世界的真相。
    真实目的是找奸细。
    遭遇女巨人,损失惨重,伤亡过半。
    最后推断出故乡三人组的奸细身份。
    利威尔,艾伦,三笠几人进入地下室,了解到格里沙医生和墙外世界的信息。
    随即 104 期新兵被解除武装,软禁在外面的一个地方(?),说是保护,其实是接受调查。

  21. 850 年,史托黑斯区作战,成功捕获女巨人阿尼,但阿尼最后时候将自己硬质化,没能获取更多情报。重要节点:第一季结束,第二季开始

    但是阿尼逃跑的时候,将城墙外沿抓破,漏出一个可怖的超大巨人脸,眼睛还在动,众人吓傻。
    尼克神父站出来请众人立即挡住巨人的脸,不能使之见到阳光。证实了墙内部分人知道世界的真相。

  22. 巨人来袭。直扑 104 期驻地。军团不知道是不是罗塞墙已被攻破。于是分兵三路,前往城墙调查。
    兽之巨人出场(17 米)。
    经过仔细检查之后,兵团发现城墙完全没有损坏,不过康尼村子被破坏了。
    提出假想,巨人是康尼村子的人变成的。

  23. 尼克神父看到人民的惨状,只吐露了一个名字:104 期的战友,克里斯塔,她身上有真相的线索。随后被中央宪兵灭口。

    韩吉队长不认识克里斯塔,三笠介绍:就是经常和尤弥尔在一起的女生。韩吉大为惊讶。(对应 VOA(伊尔泽的笔记)中,说话巨口中念叨的尤弥尔大人)

  24. 104 期逃到高塔上,被兽之巨人指挥无脑巨人围攻。

    尤弥尔认识马莱那边的文字(罐头,兽之巨人带来的),被莱纳识破身份。
    尤弥尔跳出,暴露自己,保护克里斯塔(S2E5 倒叙尤弥尔的经历,以及和克里斯塔的感情)。
    危险关头,韩吉队长带人过来救援(三笠,艾伦等),终于化险为夷。尤弥尔的巨人身份也被完全公开了。

  25. 调查兵团就被王政府取缔,所有成员都即将被逮捕,因为在内城战斗,导致史托黑斯区 100 多人牺牲,还有财产损失。

  26. 种种证据指向王政府,埃尔文联合总统演戏,假装罗塞墙被攻破,测试王政府对人民的责任心。
    王政府冷血的下令关闭城门禁止难民涌入。
    随机政变发起,宣布王政府解散。

  27. 850 年,莱纳和贝尔托特在城墙上自曝身份(我凯他超),将艾伦掳走。
    随即,调查兵团、驻屯兵团、宪兵团联合作战。
    最后成功夺回艾伦,埃尔文团长被巨人咬断右臂,大部分人几乎全军覆没。

  28. 罗德·雷伊斯抓住艾伦,要女儿克里斯塔吃掉艾伦,夺回始祖巨人。
    克里斯塔拒绝了自私的父亲,打翻针剂,并在摔爹 BGM 里把罗德摔断了腰。
    罗德爬过去舔食脊髓液,结果变成前所未见的 120 米特大型奇行种(城墙超大巨高度的两倍),下半身依旧无法动弹,只能靠两只手往爬。
    最后,罗德巨被克里斯塔当众斩杀。这个操作应该是在作秀,为了在不明真相的民众面前将克里斯塔打造成救世英雄,然后在伪王被政变推翻之后顺利继承王位。

  29. 850 年,玛利亚之墙夺回作战。

  30. 马赛的弟弟,波尔克,吃掉自愿回到马莱的颚之巨人尤弥尔,还是与马赛意愿相违地,继承了巨人之力。

  31. 854 年,马莱雷贝里欧收容区远征作战。

  32. 地鸣。
    作战中,波尔克因为与艾伦接触,而看到哥哥的记忆,解除了和莱纳的误会。并同哥哥一样,为了救下莱纳,被无脑巨人法尔克吃掉。

#899 磁盘 KV 项目

2023-04-16

有几个不是磁盘 KV,注意分辨。

服务

#898 OSPO:开源办公室

2023-04-15

OSPO 是 Open Source Program Office(开源计划办公室)的缩写,它是一个专门负责管理和支持一个组织的开源项目的部门或团队。OSPO 可以帮助组织制定开源策略,确保开源项目遵循法律和伦理标准,建立和维护与其他开源社区的联系,以及管理知识产权和许可证问题等。

OSPO 的职责范围通常包括以下方面:

  1. 管理开源软件开发过程中的知识产权和许可证问题;
  2. 确保开源项目遵循法律、伦理和道德标准;
  3. 帮助组织与其他开源社区建立联系和合作;
  4. 支持组织的开源战略和决策制定;
  5. 管理组织内部的开源项目和参与度;
  6. 组织和管理贡献者社区。

OSPO 对于大型组织或企业来说,是实现开源战略和管理开源项目的重要手段之一。

#897 ISO 8601 与时间格式化

2023-04-10

https://en.wikipedia.org/wiki/ISO_8601

占位符

占位符 描述
%Y 四位数的年份
%m 两位数的月份
%d 两位数的日数
%H 24 小时制的小时数
%M 两位数的分钟数
%S 两位数的秒数
%z 时区偏移量,格式如 +0800
%a 星期几的缩写,例如:Mon、Tue 等
%A 星期几的全称,例如:Monday、Tuesday 等
%b 月份的缩写,例如:Jan、Feb 等
%B 月份的全称,例如:January、February 等
%c 本地日期时间,例如:Tue Aug 16 21:30:00 1988
%f 微秒,范围是 0~999999
%j 年份中的第几天,范围是 001~366
%p 上午或下午,例如:AM、PM
%r 12 小时制的时间,例如:09:30:00 PM
%s 自 1970 年 1 月 1 日以来的秒数
%u 星期几,范围是 1~7,其中 1 表示星期一
%w 星期几,范围是 0~6,其中 0 表示星期日
%x 本地日期,例如:08/16/88
%X 本地时间,例如:21:30:00
%y 两位数的年份,例如:88
%Z 时区名称或缩写,例如:UTC、GMT、EST 等

Linux

date -u +"%Y-%m-%dT%H:%M:%S.%3NZ"

Python

import datetime

now = datetime.datetime.now()
iso8601 = now.isoformat(timespec='milliseconds')
print(iso8601)

PHP

$now = new DateTime();
$iso8601 = $now->format('Y-m-d\TH:i:s.v\Z');
echo $iso8601;

Java

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String iso8601 = now.format(formatter);
System.out.println(iso8601);

JS

const now = new Date();
const iso8601 = now.toISOString();
console.log(iso8601);

C

#include <stdio.h>
#include <time.h>

int main() {
    char iso8601[30];
    time_t now = time(NULL);
    strftime(iso8601, sizeof iso8601, "%Y-%m-%dT%H:%M:%S.000Z", gmtime(&now));
    printf("%s\n", iso8601);
    return 0;
}

Golang

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now().UTC()
    iso8601 := now.Format("2006-01-02T15:04:05.000Z")
    fmt.Println(iso8601)
}

#896 对焦虑的看法

2023-04-09

我们经常说这个世界的节奏越来越快,而快节奏会伴随各种压力。
例如,工作、学业、家庭或社交等方面可能会让我们感到紧张、压抑、困惑或不安。
这些压力主要源于担心不能如期望地完成各种任务,从而导致不良后果。

这些压力常常伴随着焦虑,焦虑带来压力,压力加重焦虑。

会不会丢掉工作?
以后的路怎么走?
会不会跟不上形势?

我想来想去,觉得这就是对未来的不确定性的一种恐慌。
过去的人们生活在一种稳定不变的社会中,几乎一辈子也不会发生什么太大的变化。
这样的世界早已远去。

但是可能是由于人类的本性,大多数人都希望生活在稳定的环境中,这种稳定可以带来安全感。
现代社会种的各种不确定性使得我们无法完全掌控自己的生活,从而导致焦虑的产生。


就写到这里,以后再继续补充。

#895 转载:在 URL 中存储状态

2023-04-08

I'm working on a flowchart editor that runs in the browser, and I wanted a way for people to use it without having to sign in, or store any data on our server. I wanted to give them control over their data and to be able to store it locally to open and edit later. And also easily share it with other people. It's easy to do this by supporting file upload/download, but I wanted something simpler, like the ability to share by sending a url. I also didn't want to store anything on the backend (at least for the free tier).
我正在开发一个在浏览器中运行的流程图编辑器,我希望人们不用登录,不用在我们的服务器上存储任何数据就能使用它。
我想让用户控制自己的数据,并能够将其存储在本地,以便以后打开和编辑,而且也很容易与他人分享。
通过支持文件上传/下载很容易做到这一点,但我想要一些更简单的东西,比如通过发送 url 来共享。
我也不想在后端存储任何东西(至少对于免费服务部分)。

I decied to encode the entire application state as a Base64 encoded string in the hashmark of the url. For example, a url would look like (note its truncated since they are very long):
我决定将整个应用程序状态编码为 Base64 字符串,放在 url 井号部分,例如(截断之后):

knotend.com/g/a#N4IgzgpgTglghgGxgLwnARgiAxA9lAWxAC5QA7X...

Everything after the /g/a# is a stringified version of a json object that contains all the information about the flowchart. It gets stringified, then compressed, then Base64 encoded. I update the url on every graph edit, so copying the graph state is as simple as copying the url in your browser bar.
流程图有关的所有信息存储在 JSON 对象中,被转换成字符串,压缩,Base64,最后放在 URL 中。
每次编辑图形的时候更新 URL,复制 URL 就可以复制图形状态。

Here's the pseudo code for creating the url, and then later reading it:
伪代码:

const stateString = JSON.stringify(appState); // appState is a json object
const compressed = compress(stateString);
const encoded = Base64.encode(compressed);
// Push that `encoded` string to the url
// ... Later, on page load or on undo/redo we read the url and
// do the following
const decoded = Base64.decode(encoded); // same encoded as above, but read from url
const uncompressed = uncompress(decoded);
const newState = JSON.parse(uncompressed);
// Now load your application with the newState

There are several options for implementing the compress/uncompress functions, such as lz-stirng or pako.
有一些库可以实现压缩解压缩,比如 lz-string,pako。

Since I update it on every graph edit, I get something major for free -- undo/redo. The browser's history stack becomes my undo/redo functionality. The user can hit the browser back/forward buttons, or Command-Z,Command-Shift-Z which I map to history pop and push. This is a major win for something which is a free product that I wanted to ship quickly.
因为每次编辑图形都会更新 URL,依赖浏览器的历史功能,通过前进、后退按钮,或者快捷键 Command-Z、Command-Shift-Z,还能实现撤销和重做。

Another great benefit is that these urls can be embedded. That means the user can put their graph on any web page that supports embedding. I see people typically do this with wikis like Notion, which means you can share with a team without anyone needing an account on my site.
另一个巨大的好处是这些 URL 可以被嵌入。这意味着用户可以将他们的图形放在任何支持嵌入的 Web 页面上。
我看到人们通常在 Notion 这样的笔记软件中使用,这意味着您可以与团队共享,而不需要任何人在我的网站上注册帐户。

You can see how it works by checking out knotend, the keyboard-centric flowchart editor that I'mw working on.
你可以在 knotend 中看到这个到底是怎么实现。knotend 是我正在开发的一个键盘为中心的流程图编辑器。

Prior work and thank yous.
之前的工作,谢谢。

I'm not the first one to take this approach. I've seen atleast mermaidjs do this before, and I'm sure there are others.
我不是第一个采用这种方法的人。我以前至少见过 mermaidjs 这样做,我相信还有其他人。

Thank you to this comment by redleader55 on hacker news for pointing out that using window.location.hashmark is better for storing longer urls since some browsers will truncate the url when sending it over http. But that this doesn't apply to the hashmark, which stays client side.
感谢 redleader55 在 hacker news 上的评论,你指出使用 window.location.hashmark 更适合存储较长的 url,因为一些浏览器在通过 http 发送 url 时会截断 url。但这并不适用于 hashmark,它停留在客户端。

See conversation on Hacker News https://news.ycombinator.com/item?id=34312546

#894 ChatGPT 无法访问(又可以访问了)

2023-04-04

04/09 更新:发现借道小日子可以访问。可能是定向封锁了部分梯子。


我换浏览器,换梯子,清理 Cookie,还是无法打开。

图片占位符:拜拜就拜拜,下一个更乖