2025-01-18 20:01:00
前日晚, 和汪哥聊起了搜索优化问题. 因为我经常折腾, 所以我修起这些问题来能比较快的定位到问题所在, 他问到我是如何掌握这些知识的. 我用流水账般的语言讲了从大学开始折腾的过程, 在某段时间做了什么, 在某段时间又做了什么. 乍一听起来就是一个学习的过程, 其内容就像是在某年某月学了什么, 会了什么. 这样讲出来, 旁人看起来一定是会说一句"我*, 👍", 仿佛你是一个轻松获得胜利的天才, 但实际上你可能在时候淡化了你当时的努力.
汪哥用了一个简单的例子说明了这点:
经历的事情,就像是在拾柴火,在拾的过程中根本不知道什么时候会点火,不知道拾了有啥用,就是闷着头拾就行了。等到某个时间点,得到了一个火种,这时候才发现这火种恰巧可以点着柴火,这时候才会对以前拾的柴火觉得有意义。
讲到这里的时候让我霍然开朗, 这在逻辑上来讲可以形成自洽. 当你积累(柴)了足够多, 在某一天你的灵感迸发(点火)了, 完成了某个目标, 而不是说你能在没有任何理论基础的情况下无师自通, 并且能知行合一的学以致用, 天才也不行.
那么用这个例子套入传授知识的过程, 我们的侧重点应该放在在有清晰理论的基础下进行引导. 也就是提供上等木柴的同时递给学生打火机. 在我国分数为王的教育体系里, 像学这些东西有什么用?能用来做什么
这样的声音已经被淹没了, 鲜有老师可以做到上面这点. 下面从教学体系上来讲解: 每个学校教授的内容是固定的, 那么如何避免不同的老师在授课内容上有偏差? 这就发明了教学大纲, 一些厉害的老师们将自己的毕生所学填充进去, 所有的老师再去进行雕琢完善, 就成为了一个包含所有老师智慧结晶的产物, 接下来就是围绕着大纲备课, 传授. 这一点无论是放在国内还是放在国外都是一样的.
话再说回来, 为什么经常会有人唾弃国内的教学体系? 套用上述例子, 个人拙见是老师尽心尽力的把优质木柴塞给了你, 却没有交给你点火的手段. 你知道这是木柴, 却不知道要如何点火. 那么会有人说, 我会做题了不就是会点火了吗. 你有了答题思路, 只会在同样的问题上不丢分, 换了问题照样会有大部分的人做错. 为什么说是大部分? 是因为对于小部分人来说, 他已经有了火种, 故而能触类旁通
. 因此, 一问一答看似解惑, 实则仍然属于传道授业的范畴.
在我的上一学期, 有一门课业比较繁重, 课程叫做Natural Language Processing(NLP/自然语言处理) 这门课程是一位风趣的女教授, 这是她时隔十几年来重新开设这门课程, 从基础的朴素贝叶斯讲起, 到最后的Transformer架构(GPT2/GPT3的底层架构)循序渐进娓娓道来. 我认为她的课程略显枯燥, 但是作业的质量极高. 总共3个作业参与评分, 每个占15%, 内容为一个.ipynb
项目文件+一个report. 项目文件会提供传入传出参数的注释, 你需要完成封装的逻辑, 使用的训练数据库都是目前最新or最权威的, 在完成项目文件后你需要完成2个Experiment, 例如修改参数/更换训练数据库等. 并且要将你Experiment写在report中. 我的作业1的report有些老实, 要求6页我就写了6页, 最终得分为71/100🤦♂️. 在确定老师所喜欢的论点后我的后面2个作业分数为100/100. 所有的report都拿到了满分, 例如如果有2份数据集的比较相差过大怎么办?(在作业3中使用了Transformer来实现英语和法语的翻译, 数据集的大小相差几十倍) 我用Python爬取了2份数据集的相关词汇的占比, 结果为占比类似, 因此这2份数据集参数比较仍然有相同点以供分析. 在这门课程中, 你获得的柴火可以在作业中点燃, 并且你在上一个作业的的report撰写方案仍然可以被优化, 应用到下一篇的分析中. 你的角度会越来越刁钻, 越来越专业.
这是我的缺点, 我在完成阶段性任务后往往选择归档搁置. 不会回过头来吸收这段过程中有用的地方, 因此如果和别人聊起来我在这段时间做了哪些努力, 学习了哪些内容, 我往往会一笔带过, 没能给大家提供有用的帮助. 所以在完成任务后复盘, 哪怕是撰写一份大纲进行留存也是一个进步.
2025-01-17 05:01:00
很多时候, 写前端是一个不怎么用脑力参与的事情. 你已经知道了它的基本原理, 你的键盘就在手前, 想到什么功能只需要去用那个逻辑实现就可以了. 刚好昨天实现了拖沓很久的openheart, 翻看之前的博客感觉有些冗杂, 虽然核心功能就那么多, 但在观感和页面加载速度上有些问题. 干脆一不做二不休的重新写一个. 存储库覆盖了原先的主题, 仍然位于A5yncX/DG
之前偶然在github闲逛发现了我现在个人主页的template, 于是打算新的主题贯彻那种风格, 找了找发现没找到, 于是打算基于Astro官网模板的Miniblog进行了二次开发. 说是二次开发, 其实大改了一翻(笑. 移除了更多的无关元素, 专注于写作本身, 于是有了现在这个主题, 我命名为Marius
. 没什么含义, 可能会作为日后我的英文名.
相信很大一部分人喜欢极简主义, 其实在我的上个博客中我也在做一个尝试, 同时顾及视觉的繁复和极简, 我认为对比色和干净的界面元素是一个很好的主意, 于是使用了#9bdbee
和#ffb300
作为对比色----没错, 灵感依旧来源于电影<TRON:Legacy>
.
现在看来尝试的结果是褒贬不一的, 但是新博客的内测用户: 汪哥(没错他有了博客)给出了很鼓舞的评价:
言归正传, 年末时分由于频繁的出入Benji的OpenHeart
博文, 于是发现了很多具有时效性的小彩蛋. 例如你会在他的blog的黑色背景中发现白色小点, 在你点击后所有具有超链接属性的文字会五颜六色, 又例如在圣诞节前后, 如果在他的网站滞留时间过长, 你的屏幕则会被大雪所填满, 你需要点击联系铲雪公司的按钮来清理掉所有的积雪. 我认为这是为博客添加特色的一个完美方案. 在上个博客中可能会有部分读者发现当访问主页的时候会出现随机的特效, 例如宇宙,又或者是彩色马赛克格. 这也是我的一个简单尝试, 但我看了访问统计的后端后发现鲜有人会呆在主页观看. 所以我打算将此类功能作为一个简单的TODO, 即添加一些彩蛋来奖励长时间留在blog中的读者.
大部分还是和上个博客的功能一样, 由于Astro的性质, markdown的渲染可以加入自建的remark/rehype.js
文件, 因此现在参与博客渲染的功能有状态bar/图注...etc. 此外就是使用markdown-it
的解析全文的rss, 以及让代码框功能更多的expressive-code
, 本地搜索Pagefind
, pagefind的css被集成在了其他地方, 考虑到双色浏览的可用性我用!important
覆盖了原先的颜色. 还有最最重要的就是终于填了2年前用TailwindCSS
的坑, 由于MiniBlog是用的TailwindCSS, 我被迫简单学习了一下, 真的很好用. .css
的行数从原博客的620行变成了现在的184行, 是一个不小的进步.
今天仔细的看了一下Astro的内容集合
, 也想明白了之前试图将博文分为中文和英文的困难之处, 新的主题将参与页面搭建的.md
归档在pages
集合, 而同时posts
集合又负责存储所有的博文, 这意味着我之后可以在Obsidian中编辑很大一部分页面的信息, 这对于时效性的内容, 例如最近在做的事/节日快乐等消息可以更快更简单的编辑.
我在写新的主题的时候尽可能的去顾及读者的观感.(btw, 实际发现我的blog可能并不会有外国有人读, 因此我取消了国际化功能. 考虑到rss不能变动, 所以订阅链接依旧为blog.asyncx.top/zh.xml
).此外, 也取消了博文置顶和友链的单独分类. 一个存在于Header中的README.md
栏对于专业性的读者/其他博主会有更强的吸引力.
虽然不是很懂所谓的冥想
, 但是像这样不分昼夜的去雕琢前端的细节对我来说是很能静下心的. 这断断续续的十几个小时能让我清空大脑是很值得的.
关于新的一年的展望其实有很多, 与自己和解/完全入门法语/多做,多尝试一些事情, 让未来的自己不后悔.
就是这样了, 新的一年, 新的博客, 加油💪
2025-01-15 23:01:00
<iframe style="border-radius:12px" src="https://open.spotify.com/embed/track/3k1IJYrxcQvm9m7UbITf3d?utm_source=generator" width="100%" height="352" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>
对我个人来说, 这2个月可以说是令我痛苦的2个月了, 有史以来第一次"挂科".
30%的原因出在语言上, 这门课需要理解题目并分析. 偏理论, 我缺乏这方面的复习经验.另外40%的原因出在我没有给这门课很高的重视, 我的作业成绩很高, 轻视考试的深度和难度了. 剩下30%的原因是我单打独斗了. 我给这门课程留下的预习复习时间是别的课程的的1/10甚至更少.
遭遇失败也不能找借口, 要找原因, 所以这学期打算找学习伙伴, 并且学习重心放在这门课上.
说起来很轻巧, 实际上在整整1个月的假期中 (12.13考完-12.27出这门课的成绩-1.13开学)情绪低落了大半个月, 什么都没有做, 也什么都没有做好. 仿佛回到了本科时候被论文和考研压得喘不过气的日子. 做梦惊醒, 呼吸费劲成为常态... 然后养成了现在每天吃维生素D的习惯.
谢谢亲人和好友, 在我低落的时候开导我安慰我, 让我不至于一蹶不振. 和好友一起在家吃火锅, 打雪仗, 打游戏. 让我的情绪稳定了很多.
去IGA买了三文鱼, 自己在冰箱冻了半个月来杀死寄生虫. 基于售卖的三文鱼的样子, 我得出了一个结论, 国内的三文鱼都是达不到生食品质的, 均为冷冻杀死寄生虫后再拿出来售卖的, 自己冻会更便宜和健康.
还有最大的一个改变就是驾驶技术, 飞速增长. Montreal迈入冬季, 一周可能有6天都没有太阳, 在体感温度大约为-15℃的天气还是开车出门购物更合适. 偶尔接上朋友去购物, 经常要跑高速. 争取这学期考下来驾照.
从上年年底友邻竹子在Mastodon转发了OpenHeart相关的帖子后我尝试部署了一下. 出现了无法使用的问题, 近日仔细查找后发现提供的worker.js
多了一次编码, 导致前端GET和POST的地址和KV中所存储的不一样. 在这里提供一些参考性的建议.
Openheart整个流程为: 前端传递-后端存储-前端获取. 当在前端点赞后, 通过脚本(worker.js)创建键值对(KV)进行存储, 并通过前端js来刷新显示最新的点赞计数. 现在来详细的进行部署.
本文教程使用Astro和Cloudflare
首先创建一个存储库: 存储和数据库-KV-创建. 如果想开箱即用, 名字就和我一样设置为KV
即可.
接下来创建Cloudflare Workers, 代码为:
const instruction = `.^⋁^.
'. .'
\`
OpenHeart protocol API
`;
export default {
async fetch(request, env) {
if (request.method === 'OPTIONS') {
return new Response(null, { headers });
}
if (request.method === 'GET') {
if (url(request).pathname === '/') {
return new Response(instruction, { headers });
} else {
return handleGet(request, env);
}
}
if (request.method === 'POST') return handlePost(request, env);
},
};
const headers = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET,POST",
"Access-Control-Max-Age": "86400",
};
function error(text, code = 400) {
return new Response(text, { headers, status: code });
}
function url(request) {
return new URL(request.url);
}
function ensureEmoji(emoji) {
const segments = Array.from(
new Intl.Segmenter({ granularity: 'grapheme' }).segment(emoji.trim())
);
const parsedEmoji = segments.length > 0 ? segments[0].segment : null;
if (/\p{Emoji}/u.test(parsedEmoji)) return parsedEmoji;
}
// Generate KV keys with single encoding
function generateKey(domain, uid, emoji) {
const encodedDomain = encodeURIComponent(domain); // Single encoding
const encodedUid = encodeURIComponent(uid); // Single encoding
return `${encodedDomain}:${encodedUid}:${emoji}`;
}
async function handleGet(request, env) {
const [domain, ...uidParts] = url(request).pathname.slice(1).split('/');
const decodedDomain = decodeURIComponent(domain); // 解码
const decodedUid = decodeURIComponent(uidParts.join('/')); // 解码
const prefix = `${encodeURIComponent(decodedDomain)}:${encodeURIComponent(decodedUid)}`; // 单次编码
console.log("GET Prefix:", prefix); // 调试日志
const res = await env.KV.list({ prefix });
const list = {};
for (const key of res.keys) {
const value = await env.KV.get(key.name);
const [, uidDecoded, emoji] = key.name.split(':').map(decodeURIComponent); // 解码键值
const obj = list[uidDecoded] || {};
obj[emoji] = Number(value);
list[uidDecoded] = obj;
}
console.log("GET Response Data:", list); // 调试日志
return new Response(
JSON.stringify(list[decodedUid] || {}),
{ headers: { ...headers, 'Content-Type': 'application/json;charset=UTF-8' } }
);
}
async function handlePost(request, env) {
const urlObject = url(request);
const path = urlObject.pathname.slice(1);
if (path === '') return error('pathname missing');
const [domain, ...uidParts] = path.split('/');
const decodedDomain = decodeURIComponent(domain); // 解码
const decodedUid = decodeURIComponent(uidParts.join('/')); // 解码
const emoji = ensureEmoji(await request.text());
if (!emoji) return error('request body should contain an emoji');
// Generate the key with single encoding
const key = generateKey(decodedDomain, decodedUid, emoji);
console.log("POST Generated Key:", key); // 调试日志
const currentCount = Number(await env.KV.get(key) || 0);
await env.KV.put(key, currentCount + 1);
return new Response('recorded', { headers });
}
在推送后回到Worker的设置界面, 绑定刚刚创建的KV, 名称均设置为KV. 当我使用自定义域的时候出现了问题, 因此我使用了默认的workers.dev域名.
接下来就是前端的传递. 在Openheart的协议中, 你需要在访问API时提供一个target和uid, 这个target可以是任何字符串, 于是我设置为当前博文的链接并将uid默认为like
.
所以根据官方的文档, 可以通过以下命令来进行POST(点赞)和GET(获取点赞数)操作:
curl -d '💯' -X POST 'https://xxx.workers.dev/xxx.example.com/like'
recorded%
curl 'https://xxx.workers.dev/xxx.example.com/like'
{"❤️":1}%
在这个过程中, 特殊字符, 例如:/
会根据worker.js设置来影响对KV的存储. 因此需要对url编码一次来转换这些特殊字符.
---
// Get current URL dynamically
const currentUrl = Astro.url.toString();
---
<div class="like">
<open-heart href={`https://xxx.workers.dev/${currentUrl}/like`} data-umami-event="Like" emoji="❤️">❤️</open-heart>
</div>
这样的请求和存储就保持一致了, 你可以通过开发者工具来确认这一点
最后就是前端样式, 由于我的基于benji的二次修改, 这是benji的文章链接, 可以自行访问获取.
颓废的这段时间都用来看小说了, 重新看了一遍龙族.
++tv/season/7SFK34YjPavk4GINN3OeGW++
第七集的抽帧让我感到惊艳, 就是最后的结尾略显仓促, 杰斯陪葬的动机我感觉不是很清晰.
++game/21J6htiKlo8WgU1CQbfI0N++
圣诞时候和大家一起用Switch玩了.
++tv/season/2ZgS53uh0au6wUA92UZrWW++
++game/6tNeehHtnETUtptu1nhwzO++
一部不错的魔幻史诗, 在刚出的时候觉得名字好听体验了一下, 被冗长的任务打断了. 现在创新号重新回坑过完了剧情, 很棒.
2024-11-20 20:11:00
本篇写得有一些仓促, 但我觉得很有意义. 之前有看过王德峰教授的录课, 但没有上心, 最近在抖音上看到了教授这样讲过, 认为有必要分享一下:
假如全人类只有一种思想,它就是思想和智慧的结束.
身边和我有过大量交流的朋友肯定会知道我是一个科幻迷, 如果再交流的更多我就会输出这样一个观点: 如果有机会可以让所有人类成为一个思维共同体, 我会毫不犹豫的同意. 我已经忘记这个观念来自于什么时候了, 但是很多科幻作品会出现这样的影子, 神们自己/沙丘/黑客帝国, 数不胜数. 我最感兴趣的其实是群体心智(蜂巢思维), 科幻作品中的虫族, 高度有序, 理想中的共产主义(笑). 我其实并不理解各个主义的形态, 但是以我个人的观点, 共产主义是不可能真正实现的, 原因是有悖人性.
回到正题, 我拿出来这句话配合我的想法来讲的原因, 是我感受到这有消极想法的存在, 我不会时时刻刻做此想, 只会在人和人之间无法传达全部信息/极度伤心的时候有这种想法. 换一个通俗易懂的语言来说, 消极的时候觉得个体不应该存在, 积极的时候觉得自己又存在. 听起来很双标, 但现在, 我看来这不是一个二元论的问题.
前段时间在吃饭的时候和朋友们聊起来安乐死, 我的想法是, 当我这一个体在精神层面死亡, 即我得了老年痴呆, 我不再是我的时候我会选择安乐死. 基于我的这个想法大家开始讨论客观和主观的我哪个才是真正的我. 我直接说结论好了: 共同存在, 相互作用. (参考:人的一生,要经历三次死亡...)
再次回到正题, 我其实不是很认同王德峰教授的这句话, 但是我能理解这样的想法, 甚至能想象到有人能摸出来<人类群星闪耀时>来扇我. 也如我所说这是一个乐观和悲观的两面, 悲观时看事物自然是消极的. 但是这两者如何统一呢, 我就用我小时候看的郑渊洁儿童读物(是皮皮鲁和鲁西西, 似乎是橙色系列的某本)的一段话来说好了: 孩子给妈妈说想要换爸爸, 妈妈说:"这样你就不会出生了", 孩子说:"我会以另一种形式存在在这个世界上." 3维生物能理解2/1维, 但是你虽然知道了高维, 却想象不到真正的存在形式一样, 因为思维就位于这个高度, 不妨接受, 吸纳, 再进一步辩证看待, Feed forward.
2024-11-13 03:11:00
:::note 下一次的月度小结会推迟到12月的期末周结束发布. :::
<iframe style="border-radius:12px" src="https://open.spotify.com/embed/track/7MZM9KhwGQG8QJ4BycsnQn?utm_source=generator" width="100%" height="352" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>
为什么会有这样的一篇博文? 我站在比较清醒的角度完整看到了朋友从清醒到做出不合乎常理举动的这一过程, 酒精能催化一起喝酒的人之间的关系, 我觉得十分有意思.
一言蔽之, 我不是一个能从喝酒体会到乐趣的人, 但是我会从调酒这一手艺中感到快乐, 写本文前也不能体会到乐趣, 但是体会到了看大家出糗的乐趣.
上月的Reading week旅行期间, 我第一次和同龄人在没有酒桌文化
的情况下喝酒, 那一次没有喝多少. 这个月的早些时间我们一起去看了万能青年旅店, 因为比较晚, 我就住在了朋友家. 朋友在来之前在国内由于工作原因, 对这方面有很多研究, 还能调出来带有渐变的酒(很简单, 一看就会), 我们三人就一边打扑克一边喝酒. 酒后, 他们就会做出不合常理的举动.
标题处的括号内英文Alcoholism的意思是酗酒, 我主观认为还没有到这样的地步. 饮酒让血液酒精浓度 (BAC) 达到0.03-0.12%的时候,通常会让整体情绪改善,以及可能产生欣快的感觉、自信和社交能力增加、焦虑减少、脸红反应、和判断力及肌肉精细协调力受到妨碍.
我在前言中之所以使用催化一词, 是因为结果并不一定是积极的.
一段时间前我和汪哥(汪哥终于搭了自己的博客, 开始输出)说过关于我不喜欢交际, 不喜欢谈论自己观点的原因, 我会认为我是一个很贫瘠的人, 我的语言, 思想是直来直去, 经不起推敲的. 放在和大家喝酒也是一样, 我会认为我在喝醉后自己的思想没有办法得到控制, 维特根斯坦说过: 凡能够说的,都能够说清楚;凡不能谈论的,就应该保持沉默.
回到催化, 酒精会抑制大脑中控制自我约束的区域,使人更加容易表达内心, 大家的想法会变得自然, 你会更快的看到这个人是什么样的. 这样的速度远远超过用MBTI那16种人格来对另一个人产生认知要更全面, 更快速. 因此, 当一个人自然表现的种种和你对ta的认知相差甚远, 或者你对ta的自然表现有所顾虑, 催化的结果自然就是消极的.
酒后的谈话往往比平日更自然,大家也更愿意分享彼此的经历和感受, 因此会产生集体认同感. 汪哥认为认同感的建立在很大程度上依赖于双向反馈,并且是个体抵抗孤独、寻求归属感的重要因素, 个体认同感往往源于对共性的寻找和亲密关系的深度. 而群体认同感则建立在个人在群体中的定位和价值感之上.
从心理学的角度来看,认同感和归属感是人类的基本需求之一, 人们往往通过交流和相互支持来增强认同感,而这建立在信任和对方反馈的基础上. 关于集体认同感, 我认为群体的反馈是认同感的关键, 假如我和合得来的人一起做事, 并且能得到正向的反馈, 这对于个人也是具有高度满足感的.
2024-10-27 19:10:00
<iframe style="border-radius:12px" src="https://open.spotify.com/embed/track/0l5bSnAfPH7hyrankRaq48?utm_source=generator" width="100%" height="152" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy"></iframe>
转眼来加已经两个月了, 相比第一个月的收获满满, 这一个月的学习和生活可以初步平衡了: 忙里偷闲变得没有负罪感了, 哈哈. 第一个月的学业有一种被自己push着前进的感觉, 到第二个月由于作业量突然增大, 没有那么多的时间去精雕细琢, 也算变相的于自己和解了. 生活方面, 临时搬到了西岛的亲戚家中住, 通勤时间从原先的1h且公交直达, 变成了1h20min偶尔要中转---这是有一些烦恼的, 这意味着我每天会在公共交通花费至少2.5个小时. 这段时间由于大部分是乘坐公交, 如果看电子设备我会晕车, 只能在路上听一些English Podcast. 上个月我听完了Six minute english
, 这个月正在听更长, 语速更快的BBC All Ears English Podcast
.
这个月没想到有什么比这个更有纪念意义的事情, 我的理解中Reading week是感恩节长假的另一种称呼, 在结束之后就要考试, 所以在这之前让你好好复习和放松. 我们总共5人, 都是中国留学生.
整个旅游的时间是2天, 行程是:
++movie/44lXTrJZeJlFQ6ZYbVQCMR++
++movie/1MQTe6StK7U9anZfXwrvxN++
++movie/2O7n5MUqKupr9wtmAflybI++
++movie/3uE2DHo3faivferMPTsrSQ++
++movie/4ZuBYH4VdKPyaqRRpycoRN++