Junyi Han的blog

  • 首先,朋友你也太牛逼了,能找到这里的人都是百年一遇的练武奇才,欢迎且恭喜你!
  • 我不喜欢给人下定义,但如果一定要有一些标签才能了解我,那么可能是这些:
  • 被社会淘汰的程序员 | 曾经失败的赌徒 | 销售自己的销售员 | 塔勒布门徒

尝试聊聊:JavaScript 高阶函数、闭包与函数式范式进阶

高阶函数(HOFs)是 JavaScript 函数式编程(FP)的基石。它们不仅仅是数组操作的语法糖,更是实现 纯度(Purity)、不变性(Immutability) 和 强大的控制流抽象 的关键。本篇将深入探讨 HOFs 的底层机制和高级用法。 一、高阶函数:闭包的天然舞台 高阶函数与 闭包(Closures) 机制是密不可分的。当一个函数被作为返回值返回时,它天然形成闭包,能够“记住”并访问其定义时的作用域中的变量。这是实现 柯里化(Currying) 和 函数工厂 的底层原理。 示例:用高阶函数创建可配置的日志记录器 我们创建一个高阶函数 createLogger,它返回一个定制化的日志函数。 /** * 高阶函数:createLogger * 接收 level 和 tag 参数,并返回一个闭包函数 */ function createLogger(level, tag) { // 闭包捕获了 level 和 tag 变量,即使 createLogger 执行结束 return function(message) { if (level === 'DEBUG') { console.log(`[${tag}][DEBUG] ${new Date().toISOString()}: ${message}`); } else { console.warn(`[${tag}][WARN] ${message}`); } }; } // HOFs 的应用:创建定制化的函数 const dbLogger = createLogger('DEBUG', 'DATABASE'); const apiLogger = createLogger('WARN', 'API'); dbLogger('连接池已初始化。'); apiLogger('请求超时,HTTP 504。'); // 优势:dbLogger 可以在程序任何地方调用,且 level/tag 始终保持一致,避免了重复传参。 深度剖析: dbLogger 函数就是闭包,它封装了外部作用域的 level 和 tag。这实现了 数据私有化 和 状态绑定,是函数式编程中偏应用(Partial Application) 的基础。 ...

December 2, 2025 · 2 min · Theme PaperMod

炒了那么久的币,自己试试用JavaScript写一个吧

刚接触区块链和加密货币,就被吸引了,可惜的是没有从技术上研究,结果沉迷上了炒币,现在写个简单的区块链实现,算是补上这块知识空白吧。 💻 用 JavaScript/Node.js 实现一个简单的区块链网络 本教程将引导你使用 JavaScript 和 Node.js 创建一个简化版的区块链(Blockchain),实现区块的构造、链的链接以及工作量证明(Proof-of-Work, PoW)机制。 前置知识与环境 环境: Node.js 环境 依赖: 我们将使用 crypto-js 库来计算 SHA256 哈希值,这是区块链安全的基础。 npm install crypto-js 核心概念回顾 区块 (Block): 包含数据、时间戳、前一个区块的哈希值、难度值(Difficulty)和随机数(Nonce)。 链 (Chain): 区块按顺序连接在一起,通过哈希值链接。 不可篡改性: 任何数据更改都会改变区块哈希,导致链条断裂。 工作量证明 (PoW): 通过计算寻找一个满足特定条件的哈希值(以特定数量的零开头),以此来验证和确认新区块。 一、创建 Block 类 我们首先定义 Block 类,它将负责存储区块数据并计算自身的哈希值。 const SHA256 = require('crypto-js/sha256'); /** * 区块类 (Block Class) * 负责存储数据和计算自身的哈希值 */ class Block { constructor(timestamp, data, previousHash = '') { this.timestamp = timestamp; this.data = data; this.previousHash = previousHash; // 指向前一个区块的哈希值 this.nonce = 0; // 随机数,用于 PoW this.hash = this.calculateHash(); // 当前区块的哈希值 } /** * 计算当前区块的哈希值 * 哈希值由区块的所有属性共同决定 */ calculateHash() { return SHA256( this.previousHash + this.timestamp + JSON.stringify(this.data) + this.nonce ).toString(); } /** * 工作量证明 (Proof of Work, PoW) 方法 * 通过不断改变 nonce,直到哈希值以特定数量的 '0' 开头 */ mineBlock(difficulty) { // 创建一个由 '0' 组成的字符串,长度为 difficulty const target = Array(difficulty + 1).join("0"); while (this.hash.substring(0, difficulty) !== target) { this.nonce++; this.hash = this.calculateHash(); } console.log("区块挖掘完成: " + this.hash); } } 二、创建 Blockchain 类 接下来是 Blockchain 类,负责管理链条、验证链的有效性,并添加新区块。 ...

November 28, 2025 · 3 min · Theme PaperMod

贝叶斯和LLMs

大学学概率论的时候,光知道贝叶斯了,完全没有深入学习,现在看来,是个十分有趣的领域,尤其是结合大模型(LLMs)来看,更是能发现很多有意思的联系。 🔬 深度解析:贝叶斯概率如何奠定大模型(LLMs)的基石 大型语言模型(LLMs)的惊人表现往往让人忽略了其背后的数学根基。事实上,从早期的垃圾邮件过滤到今天的复杂语义理解,贝叶斯概率一直扮演着核心角色。本文将深入探讨贝叶斯推理与 LLMs 之间的内在联系,并结合代码示例,帮助你从概率视角理解语言模型的演进。 一、贝叶斯定理:从信念到预测的数学桥梁 贝叶斯定理是所有概率语言模型的理论核心。它为我们在掌握新信息时更新旧知识(信念)提供了一个数学框架。 贝叶斯定理表达式: $$P(\text{假设}|\text{证据}) = \frac{P(\text{证据}|\text{假设}) \cdot P(\text{假设})}{P(\text{证据})}$$ 在文本处理中,这个公式被应用于分类任务。例如,在判断一封邮件是否是垃圾邮件时: $$P(\text{垃圾邮件}|\text{包含“免费”}) = \frac{P(\text{包含“免费”}|\text{垃圾邮件}) \cdot P(\text{垃圾邮件})}{P(\text{包含“免费”})}$$ 二、传统应用:朴素贝叶斯分类器(Naive Bayes) 朴素贝叶斯(NB)是最早也是最成功的文本分类算法之一。它的“朴素”之处在于假设所有词语在给定类别下是相互独立的。虽然这个假设在现实中很少成立,但在文本分类任务中表现出惊人的效率和准确性。 我们用一个简单的 Python 代码示例来展示如何使用 scikit-learn 的朴素贝叶斯分类器进行文本分类。 import numpy as np from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import CountVectorizer # 1. 训练数据:文本语料库 texts = [ "这是一个关于技术的博客文章", "Hugo 是一个静态网站生成器", "今天天气很好,适合旅行", "我喜欢做饭,特别是烘焙蛋糕" ] # 标签:0代表技术,1代表生活 labels = np.array([0, 0, 1, 1]) # 2. 特征提取:词频统计 (CountVectorizer) # 这一步将文本转化为朴素贝叶斯可以处理的数值特征 vectorizer = CountVectorizer() X_train = vectorizer.fit_transform(texts) # 3. 训练朴素贝叶斯模型 # 模型学习 P(词语|类别) 和 P(类别) model = MultinomialNB() model.fit(X_train, labels) # 4. 预测新的句子 new_text = ["我正在学习新的编程语言"] X_new = vectorizer.transform(new_text) # 预测类别 (0 或 1) predicted_label = model.predict(X_new) predicted_proba = model.predict_proba(X_new) # 输出结果 print(f"新句子的预测类别(0=技术, 1=生活):{predicted_label[0]}") print(f"技术类别概率 (P(技术|新句子)): {predicted_proba[0][0]:.4f}") print(f"生活类别概率 (P(生活|新句子)): {predicted_proba[0][1]:.4f}") 在这个例子中,NB 模型通过计算 $P(\text{类别}|\text{词语})$ 来确定句子的类别。它是一个显式的概率模型。 ...

November 28, 2025 · 2 min · Theme PaperMod

二中故事三则

一个小的序 接到岳老师关于他新书的约稿,非常开心,又能一睹老师的新作了。 一算时间,才惊觉初中已经是二十年前的事情,恩师也从小岳老师到了老岳校长,二十年后再向老师交作业,有些激动。如果282的大家再次穿上校服,收一收各自的肚皮,坐在教室里,是一番怎么样的场景?就让我穿越到那个朴素的教室里,讲讲还未丢失的故事吧。 虽然我的这点劣作远远不及能被"约稿"的水平,但是不妨也提供一些有意思的视角,那些是我真实生活过和大笑过的地方,值得被记录。 我的偶像干鸡 老师们对不起了,你们不知道这个“坏学生”多有人格魅力。 干鸡,人如其名,干瘦如鸡,打架却是挺猛,皮白,眼深,留着那时候时兴的微炸毛发型,好像叫毛寸,介于寸头和非主流之间;插兜抽烟很酷——不考虑抽烟场所的话。我一直忘了探究他是因为打架出名才被冠以可以媲美“洪兴山鸡”的霸气名字,还是自己天赋异禀早早就给自己起了这样的名字,然后才“闯出”自己的江湖地位。多年后我看到电影《热血高校》的时候,感觉干鸡就是我那个时空里的小栗旬。 说来也莫名其妙,我的偶像之路的起源不是科比艾弗森,也不是周杰伦杰克逊,他们太过遥远,我打球做不了对抗,唱歌五音不全,但是如果能被班里的坏蛋头子所青睐并纳入麾下,就堪比周董邀请我上演唱会。 我和干鸡的交集始于某一天的早自习:我在按座位收作业(那是我此生当过最大的官——数学课代表,自豪!),收到干鸡那里的时候,干鸡对我一笑说: “小韩,来份作业抄抄!”然后眼神示意了一下我手中托着的一打作业本。 “给,别全抄一样哈,老师最近老问XXX是不是学习态度不好,总是抄作业作弊啥的。“我倒也利索,回之以“都是自己人”的微笑,随即把时任班长的贾雀儿的作业给了他,毕竟班长的学术水准还是可以的。 “谁要他的?换个人!”干鸡嫌弃的撇回了本子。 “这次作业有点儿难度,他正确率还是靠谱的。”我回道。 “不需要正确率,来你的就行。” 被大家排斥,是所有班长的宿命,这可能是我们基因里对权力的警惕,虽然随着社会的驯化,这种警惕大部分会变成阿谀,但是这丝毫没有影响当时我的小激动,我认为这是组织对我的认可,我虽然没有写申请书,但是组织不嫌弃我在数学业务上的粗陋技能,反而大胆启用,我觉得我离组织近了一步,接下来的我,是不是会遇到某种“内部考核”?类似情报机构的忠诚考验?我期待着。 机会很快来临,而且是我创造的。 物理课上,画风像极了《哈利波特》斯内普教授的物理老师在台上讲课,表情严肃如同黑板上的公式,我大概注意力缺陷,没有研究黑板上的公式,偏偏研究起了前桌女生掉在地上的胶带纸。当然,上句话的宾语是胶带纸,可是重点却是前桌女生,那可是我的柏拉图初恋(那时还不是),为了吸引未来的柏拉图的注意,我不放过任何一个机会,我蹲下身子捡起了胶带纸,但是并没有还给她,还给她能带来什么呢?一句“谢谢”?太过普通,不够产生“羁绊”。 我一边想一边撕开了胶带,胶带发出了“滋滋”的胶被剥离的声音,我太过专注思考,没有注意到声音还是比较刺耳的。撕了几秒,我发现我也没有什么好方法能利用这个胶带,可是我又不甘心只收到一句“谢谢”就结束了和柏拉图的交流,于是我试图毁灭,柏拉图似乎已经不再重要,胶带成了我泄愤的工具,我把胶带套进了手中的笔,这样撕胶带非常快。我把撕开的胶带的一头传给后桌——干鸡,让他继续往后拉——我不明白我为什么那么做,我也不知道他为什么那么自然的就接了,并且还继续的向后传递,就这样,我手里拿着笔,笔上套着胶带,胶带疯狂地旋转,干鸡和后续同学疯狂地拉——我不知道的是,斯内普教授也在疯狂地压抑着怒气。 我坐在第三排,当胶带从我这一列传到后边,又传到另一列,又向前传到我同桌,胶带才撕完了,剩下的塑料圈在笔上随着惯性又空转了两圈,这个时候,斯内普教授开口了:“终于完了,我也等着呢,我倒想看看你们能拉多长!”随后斯内普教授走下讲台,拿走了我们齐心协力的作品,一坨乱七八糟的胶带缠绕成了一个球状物,扬长而去。 五分钟后,班主任岳老师——促成此篇回忆的老师,即将出版新书的作者——大步流星地来了,身后带着一股黑风,飘飘衬衫似乎没有了平时的文雅气韵,大长腿一步跨过讲台,来到事发地点附近,不大却犀利的眼睛审视半圈,骤然开口: “先说吧,胶带是谁的?” ”我的。“柏拉图平时嚣张惯了,不怵道。 岳老师继续问:“是谁带的头?” 没人说话。 柏拉图见自己相安无事,就转头看向我们后边的这帮嫌疑犯,看我的时候似乎在饶有意味的笑,一半儿“你完蛋了吧”,一半儿“你还挺会玩儿”。 我的天,我的目的达到了吗?我成功的吸引了柏拉图的注意了吗?就在我思绪又要跑偏的时候,岳老师发话了: “没人承认就都出来吧,就从你(指向我)到最后一排,都站到后边去。” 于是三方势力开始博弈了:岳老师必须整顿学风,不容许学生在课堂搞破坏;同学们在看表演,一来要看岳老师的雷霆手段,二来要看我们这帮坏蛋的下场如何;最复杂的就是我们这帮坏蛋了,首先,坏蛋们是不能供出老师想要的答案的——即我这个始作俑者,其次,这帮坏蛋里有个大坏蛋就是干鸡,一定程度上我们得看意见领袖干鸡的指示,第三,最好的方案就是我自首认罪,其他人警告,我自裁以儆诸猴。 可是,那时候我还年轻(借口)啊,而且又比较怂(事实),唯一会的就是装死,于是我装死,老师不断质问,“敢做不敢当?”,我继续装死,“这么多人等你一个?”,我仍然装死。可是每个故事都有结尾,这个故事的结尾就是,干鸡站了出来: “我干的老师,跟他们没有关系,让他们回去吧”。 我X,我傻了。 这难道不应该是我的台词吗?我在那个瞬间同时学到了大义凛然,一马当先,舍我其谁这些词,但是这些显然不是我,我是他们的反面。 是的,如同我日后遇到的或主动或被动得到的机会一样,我浪费掉了这个“大义凛然”的帅气的机会,我没脸面对我的柏拉图,我没脸面对和我一起做坏蛋的同学,我没脸面对给了我大好机会的老师,我搞砸了组织的考验,即使这个考验还是我发起的。有些人总是背景板,有些人注定传奇。 老师留下干鸡一个人罚站,其他人放回座位,我是其他人分之一。 学霸二伟 数学上,梅老师在讲测试题,那期的测试最后有一道被称作是“幻方”的思考题,题目要求把1-9这9个数字填到三横三竖的九个格子里,使得从横竖斜三个方向加起来的和都相等。老师说她也没怎么见过这种题目,做出来了也是凑的数,同学中有两个人做出来了——我和学霸二伟,想让他们来讲讲咋做的,有没有什么好的方法。 我们班的班长历经了好几代,但是学霸只有一个,那就是二伟同学。二伟同学前期是学习委员,后期是班长,基本统领班内一切事务,地位威望无人可撼。当我听说只有二伟和我做出来了后,可把我激动坏了!让我俩讲讲题目,这不就是C罗梅西争球王?泰森阿里站拳台?而且,这个题目,我可不光是会做!我还有两种方法!天赐良机!对面可是战功卓著、威名横扫同级八个班的学霸二伟啊!我有自知之明,一个排名几百的学渣引起的话题不会超过一天,可纵使蜉蝣撼树,此战也值了。我跃跃欲试。 果然,老师似乎看出了我的躁动,先叫我去讲——好机会呀,我都讲了,接下来就没什么可讲的了吧,我是第一个登珠峰的人。我起身,向讲台走去,我想,我会两种方法,要都讲吗?一种过程复杂但是好理解,大家都能懂;另一种过程简单,但是不好理解记忆,很难一次搞懂。一边想着,一边已经走上了讲台,梅老师递给了我粉笔,我拿上粉笔看了一眼老师,又向下看了一眼学霸同学,我决定了,讲难懂的,给你们都讲懂了,怎么能显示我的牛逼呢?于是我直接上手,从1到9,顺次填到了相应的位置,老师和同学也比较震惊我的“直接”,他们甚至看不出我的思考过程——这让我的虚荣达到了顶峰,大家的反应正是我想要的。 随后就是向大家展示填数的方法,这个方法的具体内容是,从最上方中间格子开始填“1”,每次向右上角走一步,遇到障碍(越界或已填)就向正下方走一步。 这个方法很显然略有复杂,需要记忆和练习,但效果非常酷——只要你掌握了,甚至能两分钟填出一个5x5的幻方。 正当我还沉浸在自己帅气的解题过程中时,学霸二伟上场了。二伟拿着粉笔说,“我的方法比较慢”,“哼,我当然知道了,所以我才不讲那个”,我暗暗高兴——我不仅展示了我高超的填数技艺,还赌对了学霸只会另一个方法。 学霸二伟做了辅助线,先把9宫格四个边的中间分别多添加了一个格子,这样就形成了十字形,然后斜着把1-9数字顺次填进去,再把在9宫格外的数字调换到对边空白的地方,最后擦除掉9宫格外的辅助线。 这个方法用文字描述出来有点儿啰嗦,但是只要看一遍,每个人都会了——这其实是老师和大家都满意的效果——而我笨到现在才发现! 这场战斗是学霸单方面的屠杀,而我唯一获得的就是,学霸不是靠小聪明成为学霸的,他们简单朴素稳扎稳打,他们杀我的时候甚至没有感情——大象踩死蚂蚁需要什么感情呢? 傲慢与偏见 初三了,是很“关键”的时期。后黑板的倒计时每天更新着数字,告诉大家还有多久就能够享受一次没有作业的超长暑假,还有就是告知一部分同学中考的紧迫性——我就是这部分同学。因为学霸和学渣都是很稳定的,前者有稳定的学业水准,后者有稳定的心态,最闹心的就是我这样不上不下的中等生了。 好学生的策略是——额对不起,我不知道好学生的策略是啥,就不妄谈了。 中等生的策略很简单,就是补短板,因为历史积累和时间等问题,长板再搞也长不了多少分。你能搞的过学霸吗?有这时间精力去把短板补上来,最终整体成绩可以提高一大截。基于这样的原因,岳老师把英语四十分的我安排到了数学六十分的英语课代表荣同学旁边坐同桌,美其名曰“互补学习”。 荣同学,女,英语无敌,不苟言笑,俊秀小脸,七分杀气,我的印象里没见她笑过。英语老师的爪牙,能在老师讲错答案的时候予以提示。回答老师问题的时候,不仅答出正确答案,还能说出这道题曾经出现在书本的某页某行。做题喜皱眉,估计已入化境。 即使这样,我依然不忿领导的安排。荣同学是我们(至少是我)最讨厌的班干部,对老师唯命是从,对同学威逼利诱——没有一点儿同窗情谊——更别说我这样的“灵活”。她是英语老师的一把利器,监察同学们的作业,考试,小道消息等等。就冲这些,我不可能让她和平度过初三,我不能为往圣继绝学,但我能为江湖证道。 我们还没开始“互补学习”呢,契机就来了。 我们坐的木凳有些不太牢靠,纯靠楔子来固定四条凳腿,正巧一天她的凳子摔了一下,本来就快朽掉的楔子也撑不住碎了,随之凳腿就掉下来,十几岁的女生力量比较弱,修理凳子很不擅长,自己捣鼓了半天也没能装好,我就故意在旁边看着荣同学,时不时来一句两句风凉话,“哎呀,要不然叫英语老师来帮修一下吧”——我能想到当时我的显毛猴样(张北语,意为贱样)。 荣同学脸上开始泛起红晕,不知道是累的还是被我气的,这时,隔岸关火的我的一个兄弟刚哥走了过来,我感受到他有点儿看不下去,准备伸出援助之手,荣同学也终于看到了希望,长出了一口气,就在这时,我伸手,自以为很优雅的缓缓的把刚哥拦下了,我神气的说,“刚哥你是我兄弟,不要为虎作伥”——虽然此时我是那只讨厌的虎。 我是个恶人,在我终于把一个女生惹哭之后,我才知道,而且我没有道歉。我应该干过很多类似充满恶意的事情,虽然初中是我极为珍惜的时光,可也充斥了很多我的阴暗。 我和荣同学不约而同的陷入了某种冷战,我们没有同学间的聊天,只有业务上的往来——我请教她各式各样的英语问题,她偶尔问我一个数学题,这样的情况持续了整个初三,我们似乎觉得这样很正常,现在想想——很cool。 初三末尾最后三次模拟考试,我的英语来到了井喷期,喷到了英语老师半开玩笑着问我是不是作弊的程度,我一边私下吐槽英语老师的职业素养,一边享受这样的”质疑“——一个虚伪的两面派。 初中最后,我们拿到分数,上演离别,班级似乎没有了物理空间,我们随处分散在校园各个地方,谈论着分数,假期和未来。我站在某个地方正在和大头计划着明天去哪里玩儿,荣同学从另一边小跑过来,兴奋地跟我说,”韩筠宜!我数学比你高“!荣同学似乎不会表达高兴或兴奋,我只能用两个惊叹号来形容当时的场景了,我也真的很为她的成绩开心——狭隘的我很少为别人的进步开心。我回她:”我也看你的英语了,你也被我超了!“荣同学笑了笑,转身就走了,我们二十年没有再见。 后记 抱歉我拖稿了,本来是五一应该写的作业拖到了六一,希望不要被罚站。 不过也正常,总有一些学生要“拖后腿”的嘛。 初中时代是我求学经历最开心的时代,可能是因为我那时完全没有意识到那个时间是“学习”阶段,我还特意查了一下关于初中的设计: 初中,初级中学的简称,是现代教育体系中为青春期孩子设计的过渡性学习阶段,它既是认知能力发展的关键期,也是人格、社会认同逐渐成型的关键阶段。 当然这种说法趋向于素质教育,可是基于我的环境,这个阶段没有这么复杂,学习就应该是唯一答案。 我从未知道这个阶段是有一定的任务的,而我的逻辑是应付。应付家长和老师,感觉学到了某个程度就能“兑换”一定的自由空间去玩,可是当时那个比较贫瘠的小县城又根本没什么可玩的,我便在迷迷瞪瞪中自得其乐了,在街上和树林还有网吧消耗了很多时间。 所以老师们对我这个“不上进”的“中等生“难免会感觉”可惜“,从情感上我比较愧疚,我也得到了很好的资源,但对于这个结果,我自己也说不清楚,谁又能真正说清楚自己呢?好在我能把故事讲清楚,就够了。 还有重要的一点,在这篇回忆里向荣同学郑重道歉,请原谅我。也一并向其他我曾经恶意相向的一些同学,那时我是一个显毛猴而不自知。 最后希望老师的新书顺利、生活如意;祝那些联系和不联系的同学们都勇敢热烈。

November 28, 2025 · 1 min · Theme PaperMod

我是谁

我总想弄明白一个戒指是怎么生产出来到我手里的,用了什么宝石,宝石是从哪个国家产的,它是真的吗?在哪里切割的呢?金银或者其他金属是怎么融化注模成戒指样子?或者用了其他工艺?这是一个厂子做的吗?每一个步骤都需要什么成本,又有多少利润呢?最终在销售端表现的价格,到底怎么评估它值还是不值呢? 我总是陷于这样的思考中,或者说不上思考,是迷茫,对于自己,也是,我干了很多事情,但是没有清晰的目标,我之前是一个活在自己世界里的人,做事不问为什么,只是觉得好玩就去做了,后来发现这个这个世界完全不是我想的样子,我信奉的东西现在看起来甚至比较可笑。 于是我开始尝试做与我之前做的相反的事情,去了解这个世界到底是怎么运转的,去了解人们为什么要做这些事情,去了解我为什么要做这些事情。 在这之后,估计能回答我是谁这个问题,这个网站,这个场域,也是这个目的的一个尝试吧,大家可以看到我的一段思想和行为的一段历程,希望足够有趣。

November 28, 2025 · 1 min · Theme PaperMod