为什么宏定义要使用 do {...} while (0) ?

参考内容: do {…} while (0) in macros do {...} while (0) 在宏定义中的作用 do{}while(0)只执行一次无意义?你可能真的没理解 近期参与的项目属于嵌入式软件领域,自然而然就得用 C 语言进行开发,开发过程中发现引入的第三方库里面有一些奇奇怪怪的写法,比如大佬们都喜欢使用do {...} while(0)的宏定义,在 Stack Overflow 上也有人提出了这个问题。之前从事 Linux 内核开发的谷歌大佬 Robert Love 给出了如下的解释: do {…} while(0) is the only construct in C that lets you define macros that always work the same way, so that a semicolon after your macro always has the same effect, regardless of how the macro is used (with particularly emphasis on the issue of nesting the macro in an if without curly-brackets). do {...} while(0) 在 C 中是唯一的构造程序,让你定义的宏总是以相同的方式工作,这样不管怎么使用宏(尤其在没有用大括号包围调用宏的语句),宏后面的分号也是相同的效果。 这句话读起来有些拗口,只觉得大佬的表述曲高和寡,翻译翻译就是:使用do {...} while(0)构造后的宏定义不会受到大括号、分号等影响,总能按照我们期望的方式调用运行。下面我们举几个实际的例子来加深理解。 // 现有如下宏定义 #define foo(x) bar(x); baz(x) // 1. 可以这样调用 foo(wolf); // 上述调用将会被展开为下列代码,完美没有问题 bar(wolf); baz(wolf); // 2. 如果我们像下面这样调用呢? if (!feral) foo(wolf); // 上述调用将会被展开为下列代码,很明显这是错误的,并且是很容易犯的错误 if (!feral) bar(wolf); baz(wolf); 为了避免上面例子所出现的问题,我们可以考虑使用{ }直接把整个宏包裹起来,如下所示: // 修改宏定义为 #define foo(x) { bar(x); baz(x) } // 3. 例 1 调用 if (!feral) foo(wolf); // 现在上述调用将展开为下列代码 if (!feral) { bar(wolf); baz(wolf); }; // 4. 我们再考虑一下如下调用呢 if (!feral) foo(wolf); else bin(wolf); // 上述调用将会被展开为下列代码,很明显又出现了语法错误 if (!feral) { bar(wolf); baz(wolf); }; else bin(wolf); 我们继续考虑比使用{ }直接把整个宏包裹起来更好的方法,即本文标题所说的使用do {...} while (0),即上述宏将定义为如下形式。 // 终极版宏定义 #define foo(x) do { bar(x); baz(x) } while (0) // 5. 例 4 调用 if (!feral) foo(wolf); else bin(wolf); // 现在上述调用将展开为下列形式,很完美 if (!feral) do { bar(wolf); baz(wolf) } while (0); else bin(wolf); do {...} while (0)除了在宏定义中可以发挥完美的作用外,在某些情况下还可以当作goto使用。因为goto不符合软件工程的结构化,并且容易使得代码晦涩难懂,所以很多公司都不倡导使用甚至禁止使用。那么我们可以使用do {...} while (0)来做同样的事情。 #include <stdio.h> #include <stdlib.h> int main() { char *str; /* 最初的内存分配 */ str = (char *) malloc(15); if(str != NULL) goto loop; printf("hello world\n"); loop: printf("malloc success\n"); return 0; } 上述代码我们可以修改为下列形式,使用do {...} while (0)将函数主体包裹起来,而break语句则替代了goto语句的作用,并且代码的可读性与可维护性都比上述goto方式更好。 #include <stdio.h> #include <stdlib.h> int main() { do{ char *str; /* 最初的内存分配 */ str = (char *) malloc(15); if(str != NULL) break; printf("hello world\n"); }while(0); printf("malloc success\n"); return 0; }
Read More ~

如何获得好运气

一点幼稚的思考 从我自身浅薄的经历做了一点总结,如果某个公司的员工有超过三分之一都是同一个地方的人,那这个公司大概率是个骗子公司,因为常规渠道他们无法招到员工,只能靠亲戚、同学、同乡一类关系拉拢,如果下限再放低一点就是传销。这类公司开早会常常是这样的——主管在前台扯着嗓门儿大喊:“亲爱的家人们,大家早上好!”下面的员工齐声回答:“好!很好!非常好!” 之前在财富与幸福指南中有翻译过一点纳瓦尔的语录,今年 4 月份这本书已经出版了,里面有提到把事情做到极致,让机会自动找到你,让运气成为必然。结合自身经历愈发认可其说法,在一次少儿科创比赛活动中遇到一个小领导,他问我现场的学生都是谁教的,我说是某某老师教的,他突然冒出一句:“某某老师教的学生肯定不会差”。这样随口而出的一句话给了我不小的触动,这个某某老师把事情做到极致,名气在他不知道的情况下就打出去了,这就是运气。 发现那些让人仰慕的大佬都有一个无所畏惧的特质。面对同一项未知的任务,所有人都不知道如何去完成,强者与弱者唯一的区别是敢不敢接这个任务,强者总是毅然扎进去并着手寻找方案,弱者总是以不知道怎么做、没有学过相关知识等理由推脱。长此以往大家就觉得强者什么都会,口口相传自然就带来了运气。 当下社会快速的生活节奏让人喘不过气来,很多人长期都是两点一线的生活,每天的生活轨迹完全重合没有一点波动。生活需要变量才会精彩,机会往往是跟随变量出现的,保持年轻的折腾,保持一颗好奇心才会有更多的可能。把乔布斯的话搬出来用一下:Stay Hungry,Stay Foolish。 不一样的生活 偶然了解到电鸭社区,它所提倡的只工作,不上班理念让我眼前一亮,数字游民这一新的词汇加到我的字典。原来这世界上还有可以不打卡的工作,他们的工作地点居然完全没有限制,在工作的同时还可以开着房车旅行...... 非常希望能体验一下数字游民生活,上帝彷佛能听见我的愿望一样,立马就把一个机会给了我。牛客网需要一些人审核主站题目,后续是出题、审题等等一系列工作,可能因为我交付的题目质量还不错,她们愿意把一些高利润的工作派给我,一个题目从几百到几十价格不等,有俩月拿到的劳务报酬竟超过了本职工资。牛客让我体验了一把远程工作乐趣,以后如果真的创业失败了,就老老实实找个远程工作苟且吧。 通过Jina全球社区的负责人 Lisa,了解到一个2050团聚活动,这是我第一次接触如此纯粹的社区,把分散在各行业又比较理想主义的人汇集到了一起。目前对这个社区是很有好感的,容我观察两年再细说体会。 鼓捣独立博客 我是快毕业时开始接触公众号的,那时候的环境很单纯,很多作者都把公众号当博客用。认识的一个和我同龄的作者,为了能把某个算法讲清楚经常熬夜 P 图。那时候的程序员小灰还叫玻璃猫,刘欣大大的文章标题比现在也要朴素。我自己那段时间写文章尤其认真,因此也认识了许许多多网友,收到了博文视点和另一家出版社的出版邀请。那时大部分人还不懂什么是 IP,流量一词更普遍的含义还是电话卡用的那个上网流量,10 万+偶有出现但频率不高。 刘欣大大的码农翻身依旧朴实,只是文章标题明显有一些刻意了,今年刘欣给一些编程老师免费送去了新书《半小时漫画计算机》 慢慢有人开始专门为了 10万+而写文章,抖音一类短视频应用出现后,整个互联网环境开始变得浮躁,大家为了流量不择手段,一些人为了博取流量而瞎编骇人听闻的事情。比如年初在抖音出现的血奴事件,更为可笑的是一些权威媒体居然转发了这个视频,官方媒体为了流量不查证新闻真实性就转发,那便是没有责任感的媒体。 媒体常常为了流量而故意删减新闻细节,比如之前文章多从自己身上找问题中所提到的新闻。互联网让大家的情绪得以便利的发泄,常常故事听一半就抑制不住心中正义,评论下面骂两句、转发个朋友圈都是没有成本的事情。台剧我们与恶的距离和电影狩猎对这个话题有比较深刻的探讨,值得花时间看一看。 百度取消了快照功能,必应中国区没了快照;一打开微信不出现视频号的可能性几乎为零;标题党的文章充满了订阅号;公众号不允许外链和无法修改错误很烦心。于是我鼓捣起了独立博客,在独立博客中可以自由的发布和修改文章。我选择的博客写作工具是Gridea,选它并不是因为它好用,而是因为上面有一款主题我比较喜欢,我自己花了些时间将该主题的 bug 修复了,并且在原基础上增加了几个 sidebar card,大致长下面这个样子,我个人还挺喜欢的。 有意思的事儿 只能发送 500 英里的邮件。一所大学的邮件只能发送 500 英里(800 公里),这听起来像是一个胡编乱造的故事。原因是因为这所大学的服务器配置错误,他们将连接到远程服务器的超时设为了零延迟。而程序运行时 0 超时是按 3 毫秒计算的,一旦 3 毫秒内没有收到远程服务器的答复,就认为邮件无法发送。光在 3 毫秒时间前进的距离,刚好就是 500 多英里。 导致电脑宕机的原因竟然是 Janet Jackson 的一首歌。微软资深工程师 Raymond Chen 披露 WinXP 发布早期,一些用户报告电脑系统会意外崩溃。起初他们以为是 Windows 的 bug,但很欣慰的是发现同行也存在这个问题,最终定位到这个问题的根源竟然是 Janet Jackson 1989 年发行的歌曲《Rhythm Nation》。歌曲中一些旋律会和当时一款 5400 转硬盘发生共振,进而导致电脑崩溃。 “看黄片被罚”的闹剧何时休?这是一篇旧闻,从网站上的时间看是 2012 年 6 月 17 日。讲述的是延安小夫妻在家看黄碟被抓,生活几乎陷绝境的故事。 推荐一个视频 这是一个插画师、立体书设计师在一席的演讲,她把自己的生活都做成了好玩儿的立体书,如同演讲主题在生活里东张西望一样,池塘子是一个地地道道的生活观察家,生活中的那些无形爱都被她做成了立体书。
Read More ~

使用 Git 工具进行项目管理

参考内容: Git工作流实践 Git 工作流程 Git三大特色之WorkFlow(工作流) Git分支管理策略 使用 Issue 管理软件项目详解 GitLab Issue 创建及使用说明 Git 提交规范 Git 是软件开发活动中非常流行的版本控制器类工具。随着项目时间的拉长、项目参与人员的更替、软件不同特性功能的发布,从开发人员角度看会发现工程的提交历史、分支管理等非常混乱,项目管理者会因为需求迭代、bug 修复、版本发布等活动无法与代码提交历史一一对应而头疼,混乱的管理常常导致故障泄漏给客户,所以一套规范的规范的 git 工作流程是非常有必要的。 Git WorkFlow WorkFlow 的字面意思即工作流,比喻像水流那样顺畅、自然的向前流动,不会发生冲击、对撞、甚至漩涡。工作流不涉及任何命令,它就是团体成员需要自遵守的一套规则,完全由开发者自己定义。 当下比较流行的三种工作流程分别为:Git Flow、GitHub Flow、GitLab Flow。它们有一个共同点:都采用功能驱动开发。其中 Git Flow 出现的最早,GitHub Flow 对其做了一些优化,比较适用于持续的版版发布。GitLab Flow 出现的时间比较晚,所以是综合了前面两个工作流的优点制定的。 Git Flow git-flow 的思路非常简洁,通过 5 种分支来管理整个工程。 分支 周期 说明 master 长期 主分支,用于存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版 develop 长期 开发分支,用于日常开发,存放最新的开发版 feature 短期 功能分支,它是为了开发某种特定功能,从 develop 分支上面分出来的。开发完成后,要再并入 develop release 短期 预发分支,它是指发布正式版本之前(即合并到 master 分支之前),我们可能需要有一个预发布的版本进行测试。预发布分支是从 develop 分支上面分出来的,预发布结束以后,必须合并进 develop 和 master 分支 hotfix 短期 bug 修补分支,从 master 分支上面分出来的。修补结束以后,再合并进 master 和 develop 分支 Github Flow github-flow 可以认为是 git-flow 的一个简化版,它适用于持续部署的工程,直接将最新的功能部署到 master 分支上,不再操作 develop 分支。同时通过 CI&CD 的使用,不再需要额外的 release 和 hotfix 分支。github 还结合了推送请求(pull request)功能,在合并 feature 分支之前通过PR请求其他成员对代码进行检查。 master分支中的任何东西都是可部署的 要开发新的功能特性,从 master 分支中创建一个描述性命名的分支(比如:new-oauth2-scopes) 在本地提交到该分支,并定期将您的工作推送到服务器上的同一个命名分支 当您需要反馈或帮助,或者您认为分支已经准备好合并时,可以提交一个推送请求(PR) 在其他人审阅并签署了该功能后,可以将其合并到 master 中,合并后原来拉出来的分支会被删除 一旦它被合并到 master 分支中,就可以并且应该立即部署 github-flow 最大的优点就是简单,非常适合需要持续发布的产品。但是它的问题也很明显,因为它假设 master 分支的更新与产品的发布是一致的,即 master 分支的最新代码,默认就是当前的线上代码。 但实际可能并非如此,代码合入 master 分支并不代表着它立刻就能发布。比如小程序提交审核以后需要等待一段时间才能发布,如果在这期间还有新的代码提交,那么 master 分支就会与刚刚发布的版本不一致。另外还有一种情况就是,有的公司只有指定时间才会发布产品,这会导致线上版本严重落后于 master 分支。 可以发现针对上述情况,一个 master 分支就不够用了,你可能需要在 master 分支之外新建一个 prodution 分支才能解决问题。 Gitlab Flow 因为 gitlab-flow 出现的比较晚,所以它同时具备前面两种工作流的优点,并且又摒弃了它们存在的一些缺点。它的最大原则叫做上游优先(upsteam first),即只存在一个主分支 master,它是所有其他分支的上游。只有上游分支采纳的代码变化,才能应用到其他分支。 gitlab-flow 分为两种情况,分别适用于持续发布和版本发布项目。对于持续发布项目,它建议在 master 分支以外,再建立不同的环境分支。比如,开发环境的分支是 master,预发环境的分支是 pre-production,生产环境的分支是 production。 开发分支是预发分支的上游,预发分支又是生产分支的上游。如果产环境出现了 bug,这时就要新建一个功能分支,先把它合并到 master,确认没有问题,再cherry-pick 到 pre-production,这一步也没有问题,才进入 production。 对于版本发布的项目,建议的做法是每一个稳定版本,都要从 master 分支拉出一个分支,比如 2-3-stable、2-4-stable 等等。发现问题,就从对应版本分支创建修复分支,完成之后要先合并到 master 分支,然后才能合并到 release 分支。版本记录可以通过 master 上的 tag 来记录。 Issue 使用 Git WorkFlow 主要解决了开发人员的问题,但是对项目管理者问题的解决力度不够,比如客户需求的管理、bug 的跟踪等。Github 和 Gitlab 提供的 Issue 功能可以比较好的解决项目的管理问题。 Issue 中文可以翻译为议题或事务,是指一项待完成的工作,比如一个 bug、一项功能建议、文档缺失报告等。每个 Issue 应该包含该问题的所有信息和历史,使得后来的人只看这个 Issue,就能了解问题的所有方面和过程。 Issue 起源于客服部门。用户打电话反馈问题,客服就创建一个工单,后续的每一个处理步骤、每一次与用户的交流,都需要更新工单,全程记录所有信息。因此,Issue 的原始功能是问题追踪和工单管理,后来不断扩展,逐渐演变成全功能的项目管理工具,还可以用于制定和实施软件的开发计划。 下面以可以免费使用的 Github Issues 来介绍如何使用 Issue。 创建 Issue 每个 Github 仓库都有一个 Issue 面板,如下图所示是新建 Issue 的界面。左侧输入 Issue 的标题和内容,支持 markdown 语法。右侧分别对应四个配置项,将在下面一一进行介绍。 Assignees Assignee 选择框用于从当前仓库的所有成员之中,指派某个 Issue 的处理人员。 Labels 可以为每个 Issue 打上标签,这样方便分类查看和管理,并且能比较好的使用看板进行查看。一般来说一个 Issue 至少应该有两种类型的 Label,即 Issue 的类型和 Issue 的状态(根据需要可打第三种用于表示优先级的 Label),其中 Issue 的状态可以用来构建敏捷看板。 Milestone Milestone 翻译过来叫里程碑,它的概念和迭代(sprint)或版本(version)差不多。Milestone 是 Issue 的容器,可以很方便的用来规划一个迭代(版本)要做的事情,也能非常方便的统计进度。 Projects Projects 是 Github 2020 年 6 月份提供的功能,它就是项目看板的功能,Gitlab 所提供的类似功能为 Issue boards,感兴趣读者可以自行阅读文档了解。 PR&MR 至此,可以发现我们可以使用 Issue 管理需求、bug,Milestone 又提供了迭代(版本)的计划管理,通过 Projects 可以创建敏捷看板,用于关注整体项目的进度。前文 Git WorkFlow 从开发者角度提供了项目管理的工作流程,可以思考一下还差什么问题没有解决? 最后剩下的问题是:每一个 Issue 都需要提交代码/文档进行解决,那代码/文档如何与 Issue 进行关联呢?其实无论是 GitHub 还是 GitLab,都可以很方便地在 Issue 上创建分支,在该分支上解决完 Issue 所对应的问题后,提交远程分支即可发起合并请求,在 Github 中称为 Pull request(PR),在 Gitlab 中则叫做 Merge request(MR)。 Git 提交规范 上文已经说了我们可以对每个 Issue 创建分支,既然是分支,那超过一个 commit 是再常见不过的事情了。一些开发人员所写的提交说明常常是fixbug或者是update等非常不规范的说明。 不规范的说明很难让人明白这次代码提交究竟是为了什么。在实际工作中,一份清晰简洁规范的 commit message 能够让后续的代码审查、信息查找、版本回退都更加高效可靠,因为我们还需要对提交说明制定一套规范。 那么什么样的 commit message 才算是符合规范的说明呢?不同团队可以制定不同的规范,此处推荐使用 Angular Git Commit Guide 提交格式指定为提交类型(type)、作用域(scope,可选)和主题(subject),提交类型指定为下面其中一个: 类型 说明 build 对构建系统或者外部依赖项进行了修改 ci 对 CI 配置文件或脚本进行了修改 docs 对文档进行了修改 feat 增加新的特征 fix 修复 bug pref 提高性能的代码更改 refactor 既不是修复bug也不是添加特征的代码重构 style 不影响代码含义的修改,比如空格、格式化、缺失的分号等 test 增加确实的测试或者矫正已存在的测试 作用域即表示范围,可以是任何指定提交更改位置的内容。主题则包括了对本次修改的简洁描述,有以下三个准则: 使用命令式,现在时态:“改变”不是“已改变”也不是“改变了” 不要大写首字母 不在末尾添加句号 下图是 NocoBase 的 commit message 截图,可供参考
Read More ~

牛客网 NC632 牛牛摆木棒、POJ 1037 美丽的栅栏题解

参考内容: OI题解 - A decorative fence[POJ 1037] poj1037(dP+排列计数) 本文首发于牛客网:题解 | #牛牛摆木棒# 题目 牛客网 NC632 牛牛摆木棒、POJ1037-A decorative fence(美丽的栅栏) 描述 有n个木棒,长度为1到n,给定了一个摆放规则。规则是这样的:对于第 i (2≤i≤n−1)(2 \leq i \leq n-1)(2≤i≤n−1) 个木棒 aia_iai​,(ai>ai−1(a_i > a_{i-1}(ai​>ai−1​ && ai>ai+1)a_i > a_{i+1})ai​>ai+1​) 或 (ai<ai−1(a_i < a_{i-1}(ai​<ai−1​ && ai<ai+1)a_i < a_{i+1})ai​<ai+1​)。求满足规则的从小到大的第k个排列是什么呢。 对于两个排列 s 和 t:如果存在 j 有任意 i<ji<ji<j 使得 si==tis_i == t_isi​==ti​ 且 sj<tjs_j < t_jsj​<tj​,视为排列 s 小于排列 t。 示例 输入:3,3 返回值:[2,3,1] 说明:第一小的排列为:[ 1 , 3 , 2 ] 第二小的排列为:[ 2 , 1 , 3 ] 第三小的排列为:[ 2 , 3 , 1 ] 第四小的排列为:[ 3 , 1 , 2 ] 所以答案为:[ 2 , 3 , 1 ] 备注 (1≤n≤20,1≤k≤(n−1)!)(1 \leq n \leq 20, 1 \leq k \leq (n-1)!)(1≤n≤20,1≤k≤(n−1)!) 题意 该问题让我们求:n 的字典序排列中第 k 个波浪形的排列。什么是波浪形排列呢?即对排列中任意一个数字(除开第一个和最后一个)aia_iai​,只能 aia_iai​ 比 ai−1a_{i-1}ai−1​ 和 ai+1a_{i+1}ai+1​ 都小或者都大。比如 2 1 3和1 3 2是波浪形排列,但1 2 3就不是波浪形排列。 DFS 枚举 最容易想到的解决方案是把 n 的所有排列按字典序列出来,然后再逐一检查是否是波浪形排列,直接取出第 k 个波浪形排列即可。 我们以 3 的全排列为例画出如下树形图,非常容易的就能发现只要对这棵树进行深度优先遍历,就能够按字典序得到所有排列。但并不是所有排列都满足波浪形这个条件,所以我们每得到一个排列都需要检查该排列是否为波浪形,直到检查到第 k 个排列为止,返回该排列即可。 class Solution { public: // 记录当前已经有多少个波浪形排列 long long count = 0; // 记录最后的结果 vector<int> res; /** * * @param n int整型 木棒的个数 * @param k long长整型 第k个排列 * @return int整型vector */ vector<int> stick(int n, long long k) { // 用于标记当前考虑的数字是否已经被选择 bool visited[25] = {false}; // 用于记录已经选了哪些数 vector<int> path; dfs(n, 0, path, visited, k); return res; } /** * * @param n 可选的数字范围 * @param deep 递归到第几层了 * @param path 已经选的数字 * @param visited 记录哪些数已经被选了 * @param k 是否已经到第 k 个波浪形排列了 */ void dfs(int n, int deep, vector<int> path, bool visited[], long long k) { // 递归层数和范围相等,说明所有的数字都考虑完了,因此得到一个排列 if(deep == n){ // 判断该排列是否为波浪形排列 bool flag = true; for(int i = 1; i < n-1; i++){ if((path[i] > path[i-1] && path[i] < path[i+1]) || (path[i] < path[i-1] && path[i] > path[i+1])){ flag = false; break; } } // 是波浪形排列,则统计一次 if(flag) { count++; } // 判断是否已经到第 k 个排列 if(count == k) { // 如果返回结果还没有被赋值,则将该排列赋值给 res // 因为我们使用的是递归,所以 count==k 会被满足多次 // 只有第一次满足时才是真正的 k 值,所以必须判断 res 是否为空 // 如果不判空,则程序记录的不是正确结果 if(res.empty()){ res = path; } // 到第 k 个波浪形排列了,递归返回 return ; } // 没有可以选择的数字了,回溯 return ; } // 还没有得出一个排列,则继续挑选数字组成排列 for(int i = 1; i <= n; i++) { // 如果该数字已经被选择了,则终止本次循环 if(visited[i]){ continue; } // 选中当前数字加入到排列中 path.push_back(i); visited[i] = true; // 下一次递归所传的值不变,只有递归层数需要 +1 dfs(n, deep+1, path, visited, k); // 回溯,需要撤销前面的操作 path.pop_back(); visited[i] = false; } } }; 在 C++ 的 algorithm 库中已经提供了一个全排列方法 next_permutation。按照STL文档的描述,next_permutation 函数将按字母表顺序生成给定序列的下一个较大的序列,直到整个序列为减序为止。因此我们可以偷个懒直接使用现有的函数。 class Solution { public: /** * * @param n int整型 木棒的个数 * @param k long长整型 第k个排列 * @return int整型vector */ vector<int> stick(int n, long long k) { vector<int> res; // 记录当前已经有多少个波浪形排列 long long count = 0; // 构造初始化排列 for(int i = 1; i <= n; i++) { res.push_back(i); } do { // 判断当前排列是否为波浪形排列 bool flag = true; for(int i = 1; i < n-1; i++) { if((res[i] > res[i-1] && res[i] < res[i+1]) || (res[i] < res[i-1] && res[i] > res[i+1])){ flag = false; break; } } if(flag) { count++; } if(count == k) { break; } } while (next_permutation(res.begin(), res.end())); return res; } }; 复杂度分析 我们来看一下这个深度优先遍历的时间复杂度分析,该算法的时间复杂度主要由递归树的结点个数决定。因为程序在叶子结点和非叶子结点的行为时不一样的,所以我们先计算非叶子结点的个数,我们一层一层的去计算它。 第 1 层因为只有一个空列表,所以我们不考虑它; 第 2 层表示的意思是从 n 个数中找出 1 个数,即 An1A_n^1An1​; 第 3 层表示的意思是从 n 个数中找出 2 个数,即 An2A_n^2An2​; 以此类推,全部非叶子结点的总数为: An1+An2+⋯AnnA_n^1 + A_n^2 + \cdots A_n^nAn1​+An2​+⋯Ann​ =n!(n−1)!+n!(n−2)!+⋯+n!= \frac{n!}{(n-1)!} + \frac{n!}{(n-2)!} + \cdots + n!=(n−1)!n!​+(n−2)!n!​+⋯+n! =n!(1(n−1)!+1(n−2)!+⋯+1)= n!\left(\frac{1}{(n-1)!} + \frac{1}{(n-2)!} + \cdots + 1\right)=n!((n−1)!1​+(n−2)!1​+⋯+1) ≤n!(1+12+14+⋯+12n−1)\leq n!\left(1 + \frac{1}{2} + \frac{1}{4} + \cdots + \frac{1}{2^{n-1}}\right)≤n!(1+21​+41​+⋯+2n−11​) =n!×2(1−12n)= n! \times 2(1-\frac{1}{2^{n}})=n!×2(1−2n1​) <2n!< 2n!<2n! 每个非叶子结点都在内部循环了 n 次,所以非叶子结点的时间复杂度为 O(2n×n!)O(2n \times n!)O(2n×n!),去除系数后得到 O(n×n!)O(n \times n!)O(n×n!) 。 最后一层叶子结点的个数就是 n!n!n! 个,但是我们对每个叶子结点都做了一次判断,因此叶子结点的时间复杂度依然是 O(n×n!)O(n \times n!)O(n×n!) 。 该问题的 k 控制了遍历的次数,最好情况即 O(n!)O(n!)O(n!),最差即 O(n×n!)O(n \times n!)O(n×n!),平均一下也不过只加了个系数,因此总的时间复杂度为 O(n×n!)O(n \times n!)O(n×n!)。 递归树的深度为 n,需要 O(n)O(n)O(n) 的空间;程序运行过程中保存了问题的最终答案,需要 O(n)O(n)O(n) 的空间,总共需要 O(2n)O(2n)O(2n) 的空间,因此该算法的空间复杂度为 O(n)O(n)O(n)。 动态规划 上述算法在运行过程中会超时,究其原因就是不论测试数据要求我们求第几个波浪形排列,我们都老老实实的从第一个开始数,当数据比较大时就会出现超时的情况。那么有没有办法能够减少一些不必要的过程呢?比如测试数据要求第 100 个波浪形排列,很明显前面 80 个排列肯定不满足情况,我们能否舍弃一部分搜索直接从第 80 个甚至第 90 个开始呢? 我们先不考虑波浪形排列这个条件,如果是求第 k 个全排列的话是非常容易就能算出来的。还是以1 2 3的全排列为例,假设现在要求第 5 个全排列,可以发现只要第一个数确定了,排列数就由剩下数的排列方案决定,以1打头的排列有两个,以2打头的排列也有两个,而现在要求的是第 5 个排列,所以肯定不是以1或2打头的,这样我们就能直接跳过大部分不合法的排列,节省了时间。 仔细想想发现理想是比较丰满,上述方法的问题在于无法确定前面跳过的那部分里面究竟有多少个波浪形排列,因此这种直接计算的方法行不通。但是这个思想我们是可以借用一下的,那我们把一部分数据计算出来,尝试一下能不能找到规律。 当 n 为 1 时,总共有 1 个波浪形排列,1 打头的有 1 个; 当 n 为 2 时,总共有 2 个波浪形排列,1 打头的有 1 个; 当 n 为 3 时,总共有 4 个波浪形排列,1 打头的有 1 个; 当 n 为 4 时,总共有 10 个波浪形排列,1 打头的有 2 个; 当 n 为 5 时,总共有 32 个波浪形排列,1 打头的有 5 个; 当 n 为 6 时,总共有 122 个波浪形排列,1 打头的有 16 个; 列出来了 6 组数据都没有发现规律,这种方式基本得战略性放弃了。我们设置 A[i] 为 i 根木棒所组成的合法方案数,列数据找规律其实就是尝试找到 A[i] 和 A[i-1] 的规律,比如选定了某根木棒 x 作为第 1 根木棒的情况下,则剩下 i-1 根木棒的合法方案数为 A[i-1]。问题在于并不是这 A[i-1] 中每一种方案都能和 x 形成一种新的合法方案。 我们把第 1 根木棒比第 2 根木棒长的方案称为 W 方案,第 1 根木棒比第 2 根木棒短的方案称为 M 方案。A[i-1] 中方案中只有第 1 根木棒比 x 要长的 W 方案,以及第 1 根木棒比 x 要短的 M 方案,才能进行组合构成 A[i] 中的合法方案。 因此我们可以设A[i] = 0,先枚举 x,然后针对每一个 x 枚举它后面那根木棒 y,如果y > x(y < x同理)则有:A[i] = A[i] + 以 y 打头的 W 方案数,但是以 y 打头的 W 方案数,又和 y 的长短有关,因此只能继续将描述方式继续细化了。 设 B[i][k] 是 A[i] 中以第 k 短的木棒打头的方案数,则有: A[i]=∑k=1iB[i][k]A[i] = \sum_{k=1}^i B[i][k]A[i]=∑k=1i​B[i][k] B[i][k]=∑j=ki−1B[i−1][j](W)+∑n=1k−1B[i−1][n](M)B[i][k] = \sum_{j=k}^{i-1} B[i-1][j](W)+ \sum_{n=1}^{k-1} B[i-1][n](M)B[i][k]=∑j=ki−1​B[i−1][j](W)+∑n=1k−1​B[i−1][n](M) 公式中(W) 和 (M) 分别表示 W 方案和 M 方案,发现还是无法找出推导关系。设 C[i][k][0] 为 B[i][k] 中的 W 方案数,C[i][k][1] 为 B[i][k] 中的 M 方案数那么则有: B[i][k]=C[i][k][0]+C[i][k][1]B[i][k] = C[i][k][0] + C[i][k][1]B[i][k]=C[i][k][0]+C[i][k][1] C[i][k][1]=∑j=ki−1C[i−1][j][0]C[i][k][1] = \sum_{j=k}^{i-1} C[i-1][j][0]C[i][k][1]=∑j=ki−1​C[i−1][j][0] C[i][k][0]=∑n=1k−1C[i−1][n][1]C[i][k][0] = \sum_{n=1}^{k-1} C[i-1][n][1]C[i][k][0]=∑n=1k−1​C[i−1][n][1] 至此状态转移方程就出来了,初始条件为:C[1][1][0]=C[1][1][1] = 1,下面就可以开始写代码了。 class Solution { public: /** * * @param n int整型 木棒的个数 * @param k long长整型 第k个排列 * @return int整型vector */ vector<int> stick(int n, long long s) { long long dp[21][21][2]; memset(dp,0,sizeof(dp)); dp[1][1][0] = dp[1][1][1] = 1; for (int i = 2; i <= n; i++){ // 枚举第一根木棒的长度 for (int k = 1; k <= i; k++){ // W 方案枚举第二根木棒的长度 for (int m = k; m < i; m++){ dp[i][k][0] += dp[i-1][m][1]; } // M 方案枚举第二根木棒的长度 for (int m = 1; m <= k-1; m++){ dp[i][k][1] += dp[i-1][m][0]; } } } // 标记是否已经使用 bool visited[21] = {false}; // 保存结果的排列 int a[21]; // 逐一确定第 i 位 for(int i = 1; i <= n; i++) { int k = 0; // 假设第 i 放 j for(int j=1;j<=n;j++) { long long tmp = s; // 已经使用过的数不能再使用了 if(!visited[j]) { // j 是没有使用过的木棒中第 k 短的 k++; if(i == 1) { // 确定第一根木棒的长度 tmp -= dp[n][k][0] + dp[n][k][1]; } else if(j < a[i-1] && (i==2 || a[i-2]<a[i-1])) { // W 类型 tmp -= dp[n-i+1][k][0]; } else if(j > a[i-1] && (i==2 || a[i-2]>a[i-1])) { // M 类型 tmp -= dp[n-i+1][k][1]; } if(tmp <= 0) { visited[j]=true; a[i]=j; // 第 i 位为 j break; } } s = tmp; } } // 将结果转换为指定格式 vector<int> res; for(int i = 1; i <= n; i++) { res.push_back(a[i]); } return res; } }; 复杂度分析 最开始初始化dp数组时用了 O(2n2)O(2n^2)O(2n2) 的时间,随后填写dp数组花的时间为 O(n3)O(n^3)O(n3),计算最终答案的时间为 O(n2)O(n^2)O(n2),将结果转为指定格式的时间为 O(n)O(n)O(n),所以该算法的时间复杂度为 O(n3)O(n^3)O(n3)。 dp数组占用了 O(2n2)O(2n^2)O(2n2) 的空间,标记数组visited、保存结果的数组a,以及最终转换为指定格式的path向量,各占用了 O(n)O(n)O(n) 的空间,取最大值即该算法的空间复杂度为 O(2n2)O(2n^2)O(2n2),去掉系数得到最终空间复杂度 O(n2)O(n^2)O(n2)。
Read More ~

媒体的谎言|楼下的小餐馆|服务质量的思考

上个月很多地方都可以看到一个新闻,90 后安徽女孩 16 岁时到杭州打工,省吃俭用拼命存钱就为了在杭州买房,十年时间存了将近 100 万。但是 2020 年的疫情对她的服装生意影响太大,她先是自己在网上卖淫,后又通过社交软件招募失足妇女卖淫,半年时间获利近 60 万。这个女孩的故事本身是很励志的,但网上的故事版本基本是下图这个样子的,一句话概括就是「女孩卖淫获利 160 万」,简单明了、易传播、方便吃瓜,吃瓜是第一生产力。 相比之下,那些通过掩盖部分事实来教育国人的文章,到显得不那么可恶了一些。比如都说英国人喜欢在地铁看书看报纸,对比我们国人在地铁都是看手机显得没啥素养,但却很少文章提及伦敦地铁修建于 100 年前,由于隧道小致使安装通信设备的难度极大,所以他们的地铁是没有手机上网条件的。全线实现手机上网后,咱再来看看他们看书还是看手机! 媒体总喜欢发一些坏的东西,毕竟更容易吸引眼球且符合人的本能,人还没死但去世的相关新闻已经出来了,故意掩盖部分事实让大众理解扭曲。考虑到「流量就是金钱」这个前提,有时候也能理解现在媒体的做法。在台湾电视剧《我们与恶的距离》中就有一个片段,主角很清楚一个新闻能带来的收视率,但是自家的记者还没有考究到该新闻的真实性,当其它电视台都在报道这个新闻时,自家电视台应该随大流报道,还是坚守新闻人的底线? 人把自己置身于忙碌当中,有一种麻木的踏实,但丧失了真实,你的青春,也不过只有这些日子。你看到什么,听到什么,做什么,和谁在一起,有一种从心灵深处满溢出来的不懊悔,也不羞耻的平和与喜悦。 ——电影《无问东西》台词 用了差不多一年时间观察楼下的几个小餐馆,第一个引起我注意的是一个叫做「小鲜肉烧烤」的店,同期在它的隔壁也是一个烧烤店,在离它不到一百米的地方还有一个烧烤店。那时候正值寒冬,烤串拿出来很容易就变凉,大家都知道烤串凉了就不好吃了,这时小鲜肉烧烤自己买了个大棚子,同时还给每个桌子放了一个保温盘。 有了大棚子遮风,顾客就不需要忍着寒风吃烤串,而且保温盘让烤串一直都是热的。其它两家则一直是都是让顾客在忍着寒风吃串,我有一次骑行回来因为烤串上的太快了,里面的羊肉串中间那一坨肥肉都凝固成油泥了,骑行腐败的心情大打折扣。 小鲜肉烧烤专门有个人在外面守着,那眼睛就跟老鹰一样犀利,顾客还没有坐好菜单就送到面前了,另外两家则是师傅专心烤串,进去了是一脸懵逼不知道找谁,点完餐也不知道交给谁。过完年回来,楼下只剩一家烧烤店了。 紧接着小鲜肉烧烤的隔壁被一对夫妻租了去,他们做的是羊肉米线,想来两口子定是雄心勃勃、信心满满的。前三天用了一点小技巧引流,活动期间可以凭点餐券再免费领一份羊肉米线,出于占便宜和好奇的心理,开业第一天我就去了这家店,看的出来米线是在水里泡的太久了,而且表现非常的不光滑,猜测是为了节省成本用了便宜的原料。 大概坚持了一周的样子,这家店在饭店就无人问津了,左邻右舍的店铺都忙的不可开交,这家店铺是老公和老婆对坐玩手机,「葛优躺」完美的挂在了脸上,店里显得没有生机更是让人不想踏进去一步。这个商铺过了不到半个月就转手了。 接盘侠是一个做冒菜的老板,老板开业第一天就大火,服务好、菜品多、吃法新,生意一度优于旁边的烧烤店。大概过了半个月的样子,估计老板觉得店里比较稳了,于是开始把店里的事情逐渐放给员工,好几次我去那家吃都没有看到老板。 没有老板在自然一些细节把控不好,比如从厨房到餐桌的过道肯定是走最多,而那条过道上的污渍即使你有意无视它,它也能非常容易的钻到你眼睛里;顾客选择的是干拌冒菜,但是却在盘子里看到非常多的汤水;煮菜也看得出来做了流程化处理。 就这样冒菜店的生意以非常明显的速度在下滑,好在老板意识到问题又回来每天坚守阵地,但总体来说已经比不上刚开店的时候了,现在是和小鲜肉烧烤的人流量基本持平。 会有意识的去观察这些事物,大概和我现在从事的工作有关系。我现在是一名少儿编程老师,大学做家教教学生编程时,觉得只要自己专业技能够硬,学生问问题都能回答出来就可以,喜欢用一些听起来牛逼的专业词汇给学生讲课。现在想想那时候真是傻,那时候觉得人家听不懂叫牛逼,现在明白人家听不懂叫装逼。 开始主动的去反思自己的问题,讲课的流程、节奏、纪律、有趣等等,并且有意识的提升课堂的仪式感。现在讲课的问题还非常多,但也收获了一些学生和家长的认可。一个孩子我接手了之后得到的奖升了一级,家长一激动给我发了「感谢恩师」,笑死我了😂 一个学生课上说自己的一个同班同学「还在渣渣学而思学习编程」,虽然孩子只是随口一说,但是这句话让我心中暗喜。除了在外面上课外,我同时还在一些小学上社团课,一个学生想要到外面上课非选我不可,不然就不交钱报名...... 体会到服务业的一些乐趣,也真正认识到了质量的重要性,质量的轻微变动顾客都能感受到。尽力做好自己可以做的事情,但是也要明白事情不是自己能完全掌控的,就像张小龙说的跟漂流瓶扔出去一个瓶子是一个道理,看到以后发生什么不是我们所能够掌控的。 最后放两个学生的趣味作品吧。
Read More ~

信用卡航司里程和境外返现

在信用卡基础知识入门中已经提到过银行会和各大公司搞联名卡,其实当你把信用卡了解到一定程度之后就会发现银行、航司、电商、酒店都是相互关联的。信用卡可以匹配像希尔顿、万豪等一些酒店的高级会员,酒店高级会员又可以匹配航司高级会员。 提到航司这里建议各位小伙伴乘机时都先注册一个会员账户积累里程,很多人可能并没有去关注里程这个东西。以乘坐南航航班从成都到广州为例,用 12000 里程就可以兑换一张机票,相当于就省去了一张机票钱,最近是特殊时期一张机票看起来价格并不贵,要搁平时咋样也是会省 1000 来块钱的。 我之前也不懂航司里程这些东西,看了下航旅纵横发现我在 19 年总共乘坐了 17 次航班,其中有 4 次乘坐的是海南航空的航班,我并没有注册海南航空的会员,导致这几次航班的里程都没了。在 20 年我还使用几千南航里程和几千凤凰知音里程就换了几本书和一袋核桃,现在才知道当时换的是相当不划算的,一半的机票就被自己玩没了。 大多数人都只是在春节时需要来回飞一趟,靠乘坐航班积累里程的方式是不现实的,更加靠谱的方式就是通过信用卡。国内银行的白金卡基本都可以兑换航司里程(国外我也不懂),而且国内的信用卡非常乱,比如之前我用的招行金卡有 9 万多的额度,浦发给的一张白金卡才 6000 额度(已注销),所以一般额度有几万的都可以尝试去升级成白金卡。 比如中行和南航推的联名白金卡消费 10 元就可以积累 1 里程,这些消费本身都是平时会产生的,顺道积累一下里程它不香吗?配上撸货(俗称黄牛)那就是非常可观的量级了,稍微勤奋一点应该是一年二三十万里程没有问题。 信用卡除了积累里程外通常还会有其它的权益,比如搭配一个信用卡接送机的权益把来回机场的车票钱也给省下。比较重要的是信用卡的延误险权益,一种要求用带险种的卡片去购买机票才可赔付,另外一种是不论以什么方式购买机票只要延误就给赔。应该有小伙伴已经在网上看过有人撸了几百万延误险,结果把自己给搞进去了。再次提醒一下撸羊毛可以,但是别心太狠去宰羊。 曹大也写过一篇关于里程信息差套利的文章,我也是上个月才发现很多平台的积分都是可以互通的,比如平安银行的万里通积分就和各大航司、运营商、零售等挂上了钩,也可以通过这种方式把各种平台的积分都聚合到一起。 信用卡肯定要用起来才会有收益,除了国内日常所产生的消费可以积累一些积分外,还有一个门槛比较高的就是境外消费返现。比如建行出的「MUSE卡鎏金版」境外消费笔笔 1% 返现,精选商户还有 8% 的返现,聪明的小伙伴看到这个应该就能联系到「海外代购」了吧。
Read More ~

信用卡基础知识入门

相信绝大部分伙伴都使用过「花呗」这个产品吧,当月花下月还很契合现在的提前消费理念。花呗有账单日和还款日之分,需要在每个月的还款日之前将上期的账单还清,否则就会产生逾期记录进而影响自己的征信。当然如果确实没有足够的钱也可以选择账单分期,只不过需要支付一定的分期手续费。花呗的这些机制与信用卡一致,但是相比信用卡花呗就显得很抠门了,抽空对信用卡做了一点研究,就分享到这里一起交流。 虽然我从毕业开始就一直在用信用卡,但是我也一直没有搞明白信用卡的逻辑。比花呗更长的免息期,送开卡礼、首刷礼,用信用卡消费还给你积分兑换礼品、抵现或话费,偶尔还会给出一些支付立减的优惠(比如我前段时间用支付宝就老是遇到美国运通卡的立减金),银行难道是脑袋发热才这么送钱吗? 用脚趾头想都知道银行的目的肯定是为了赚钱,但是为啥又白白的把各种权益送给你呢,所以我们有必要了解一下银行为什么要发行信用卡?不管是在线上还是线下消费,只要使用了信用卡进行结账,那么商家就需要给出一定的手续费。比如商家支付了 100 元的手续费,银行会拿到 60 元的利润,银联拿到 5 块钱,剩下的交给支付通道公司,同时还会根据「商户编码」给到你一定的积分。所以当你使用信用卡进行消费时,银行就会赚到钱。 上一段提到了「商户编码」的概念,这个就像我们参加高考时老师给贴的条形码一样,是用来识别商户的。在教育、慈善一类的商户消费,银行是没有钱赚的,所以银行也不会给到你积分,我们可以把这类称之为「无积分商户」。银行就是根据商户编码来识别你刷的商户类型,具体可以查看刷卡之后小票商户编码 8-12 位。 国内支持的都是银联卡,不过美国运通的业务已经在国内出现,比如我目前正在使用的招行百夫长信用卡,就是一张美国运通卡,它在国内已经支持了线上消费。国外支持银联的不多,所以很多信用卡都会在银联卡之外给配一张外币卡,有人说外币卡会占用自己的授信额度,如果不出国就不要申请你那张附属卡。 信用卡是分不同等级的,比如普卡、金卡、白金卡、黑金卡。一般金卡及以下都是直接免年费或是可以通过一定的消费免年费的。白金及以上大部分都需要几千的年费,但是提供的相关权益也非常不错,比如航司里程、体检服务、机场贵宾厅、五星级酒店等等,不过白金及以上的下卡难度也大,具体可以看自己的实际情况去申请。 现在银行都会和各种公司联合发一些联名卡,比如我手里的平安爱奇艺联名卡,每个月只需要有三笔消费超过 188 元,下个月就可以领一张爱奇艺黄金会员月卡。像我这种视频平台会员权益,日常消费所累积的积分,加上银行平时的一些像「5 倍积分」活动,以及利用账单日、还款日这些免息期,就是妥妥的羊毛党味道。 我去年一年的话费都是使用平安的积分充值,相当于白嫖了一年话费。从深圳搬到成都冬天太冷没有被子,又用招行的积分换了被子和一些收纳箱。银行给你这些通道,就是默许你可以撸羊毛,但你千万别贪心把毛拔秃了甚至要宰羊,不然就会很容易把自己给撸进去。 不要小看撸羊毛这个行业,有的人能撸羊毛年入千万。我认识的人里面也有靠撸羊毛完全能养活自己的,再简单一点也有玩免费机票、酒店的。我觉得这个行业有意思的地方就是你日常生活的每一项都可以撸,电影票、外卖、水电话费、餐饮等等,但是玩信用卡玩着玩着也有一个问题,我现在哪怕在超市买瓶水也会不自觉的计算用哪张卡更划算。 最后放一张闲鱼的截图做个引子吧,有兴趣的伙伴可以自己去研究,我先暂且写这么多。
Read More ~

KK 给年轻人的 68 条建议

KK 是凯文·凯利的网名,他曾经担任《连线》杂志的第一任主编,是著名的科技评论家,也是畅销书《失控》的作者。去年的 4 月 28 日是他 68 岁生日,他在个人网站上发表了一篇给年轻人的 68 条建议,文章被翻译成了十几种其它语言,今年 4 月 28 日老爷子又续写了一篇给年轻人的 99 条建议,本文是给年轻人的 68 条建议中文翻译版,翻译除了借助 DeepL 机器翻译工具外,更多参考自KK 在 68 岁生日时给出的 68 条建议。 Learn how to learn from those you disagree with, or even offend you. See if you can find the truth in what they believe. 学着从那些你不认可甚至冒犯你的人身上学习,看看能否从他们的信仰中找到真理 Being enthusiastic is worth 25 IQ points. 充满热情可以抵得上 25 点智商 Always demand a deadline. A deadline weeds out the extraneous and the ordinary. It prevents you from trying to make it perfect, so you have to make it different. Different is better. 做任何事都应该设一个 deadline,它可以帮你排除那些无关紧要的事情,也能避免过分要求自己尽善尽美。努力去做到与众不同,差异比完美更好 Don’t be afraid to ask a question that may sound stupid because 99% of the time everyone else is thinking of the same question and is too embarrassed to ask it. 不要害怕自己问的问题看起来很愚蠢,99% 的情况下,其他人和你有一样的问题,只不过他们羞于问而已 Being able to listen well is a superpower. While listening to someone you love keep asking them “Is there more?”, until there is no more. 倾听是一种超能力,当听到你喜欢的人说话时,要不时的追问「还有吗」,直到他们没有更多的东西可讲 A worthy goal for a year is to learn enough about a subject so that you can’t believe how ignorant you were a year earlier. 一个有意义的年度目标是去充分了解一个学科,这样你就会对一年前的无知感到难以置信 Gratitude will unlock all other virtues and is something you can get better at. 感恩可以解锁其它所有的美德,也是你可以继续做的更好的一件事情 Treating a person to a meal never fails, and is so easy to do. It’s powerful with old friends and a great way to make new friends. 请一个人吃饭是非常简单的一件事情,不仅仅是老朋友,这也是结交新朋友的有效方式 Don’t trust all-purpose glue. 不要相信万能药 Reading to your children regularly will bond you together and kickstart their imaginations. 经常给的孩子读书不仅能巩固你们之间的感情,也能帮助孩子开启想象力 Never use a credit card for credit. The only kind of credit, or debt, that is acceptable is debt to acquire something whose exchange value is extremely likely to increase, like in a home. The exchange value of most things diminishes or vanishes the moment you purchase them. Don’t be in debt to losers. 永远不要用信用卡去透支。唯一可以接受的透支或负债,应该是那些通过负债有极大可能获得增值的事物,比如房屋。绝大多数事物在你买下它的那一刻就开始贬值了,别为那些没有未来的事物透支 Pros are just amateurs who know how to gracefully recover from their mistakes. 专业人士不过是善于从挫折中优雅爬起的菜鸟 Extraordinary claims should require extraordinary evidence to be believed. 要想让人相信非同寻常的观点,就需要非同寻常的证据 Don’t be the smartest person in the room. Hangout with, and learn from, people smarter than yourself. Even better, find smart people who will disagree with you. 别成为一群人中最聪明的那一个,和那些比你聪明的人待在一起,向他们学习。如果能找到和你观点相反的聪明人,那就更好了 Rule of 3 in conversation. To get to the real reason, ask a person to go deeper than what they just said. Then again, and once more. The third time’s answer is close to the truth. 对话中的「数字 3 原则」。想要找到一个人真正的意图,那就请他把刚才说的话再深入一些,如此反复直到第三遍,你就能比较接近真相了 Don’t be the best. Be the only. 不做最好的,去做唯一的 Everyone is shy. Other people are waiting for you to introduce yourself to them, they are waiting for you to send them an email, they are waiting for you to ask them on a date. Go ahead. 每个人都很害羞,其他人正等着你向他们介绍你自己,等着你给他们发送邮件,等着你约他们见面。大胆的向前走 Don’t take it personally when someone turns you down. Assume they are like you: busy, occupied, distracted. Try again later. It’s amazing how often a second try works. 别人拒绝你的时候不要往心里去。假设他们和你一样忙碌、腾不出手、心烦意乱,再试一次,第二次成功的几率超乎你的想象 The purpose of a habit is to remove that action from self-negotiation. You no longer expend energy deciding whether to do it. You just do it. Good habits can range from telling the truth, to flossing. 习惯的意义在于无需再为某类行为纠结,不用再消耗精力去觉得是否做这件事。干就完了,讲真话和使用牙线都是很好的习惯 Promptness is a sign of respect. 及时回应是表示尊重的一种方式 When you are young spend at least 6 months to one year living as poor as you can, owning as little as you possibly can, eating beans and rice in a tiny room or tent, to experience what your “worst” lifestyle might be. That way any time you have to risk something in the future you won’t be afraid of the worst case scenario. 当你年轻的时候,应该至少花半年到一年的时间,过尽可能穷的日子,拥有尽可能少的身外之物,居陋室而箪食瓢饮,体验你可能会经历的最穷困潦倒的生活。这样,在未来任何时候,你都不用担心最坏的情况 Trust me: There is no “them”. 相信我,没有「他们」 个人理解,KK 大叔想表达的意思应该是:太阳底下无新事,每个人都是历史的参与者 The more you are interested in others, the more interesting they find you. To be interesting, be interested. 你越有兴趣了解别人,别人就会发现你越有趣,要成为有趣的人,先要对别人感兴趣 Optimize your generosity. No one on their deathbed has ever regretted giving too much away. 常行慷慨之事,没有人会在死的时候后悔给予的太多 To make something good, just do it. To make something great, just re-do it, re-do it, re-do it. The secret to making fine things is in remaking them. 想要做好一件事,干就完了。想要做一件值得称赞的事情,那就重做一遍,重做一遍,再重做一遍。制造好东西的秘诀在于不断的重做 The Golden Rule will never fail you. It is the foundation of all other virtues. 金科玉律永远不会让你失望,它是所有其他美德的基础 If you are looking for something in your house, and you finally find it, when you’re done with it, don’t put it back where you found it. Put it back where you first looked for it. 如果你正在你的房子里寻找什么东西,那么用完后不要放回你找到它的地方,而是放到你最初找它的地方 Saving money and investing money are both good habits. Small amounts of money invested regularly for many decades without deliberation is one path to wealth. 存钱和投资是好习惯。几十年如一日的定期进行小额投资(定投),是一条致富之路 To make mistakes is human. To own your mistakes is divine. Nothing elevates a person higher than quickly admitting and taking personal responsibility for the mistakes you make and then fixing them fairly. If you mess up, fess up. It’s astounding how powerful this ownership is. 犯错是人之常情,承认错误是神圣的。认错并勇于担责,再认真弥补过错,没有什么比这更可贵了。是自己搞砸的就勇于承担,这反而能彰显你的强大 Never get involved in a land war in Asia. 永远不要在亚洲陷入地面战争 KK 大叔这句话没读懂 You can obsess about serving your customers/audience/clients, or you can obsess about beating the competition. Both work, but of the two, obsessing about your customers will take you further. 你可以专注于你的顾客、听众或客户,也可以沉迷于在竞争中获胜,这两种方法都行之有效,但是专注于服务你的客户会让你走的更远 Show up. Keep showing up. Somebody successful said: 99% of success is just showing up. 在场,坚持在场,某个成功人士说过:99% 的成功只不过是因为在场 Separate the processes of creation from improving. You can’t write and edit, or sculpt and polish, or make and analyze at the same time. If you do, the editor stops the creator. While you invent, don’t select. While you sketch, don’t inspect. While you write the first draft, don’t reflect. At the start, the creator mind must be unleashed from judgement. 将创造过程与改进过程分开,你不可能在写做的同时进行编辑,也不可能在凿刻的同时进行打磨,更不可能在制造的同时进行分析。如果你这么做,求善之心就会打断创造之意;创新时就要忘掉已有方案;勾勒草图时就不能太着眼于细处;写作时,先打草稿而不要去抠细节。在新事物之初,创意的思想必须得到无拘无束的释放 If you are not falling down occasionally, you are just coasting. 如果你从未跌倒过,那么你也就从未努力过 Perhaps the most counter-intuitive truth of the universe is that the more you give to others, the more you’ll get. Understanding this is the beginning of wisdom. 也许宇宙中最违反直觉的真理就是,你给予他人越多,你收获的就越多,这是智慧的起点 Friends are better than money. Almost anything money can do, friends can do better. In so many ways a friend with a boat is better than owning a boat. 朋友胜过金钱。金钱几乎可以做任何事情,但朋友可以做得更好。很多时候,自己有条船不如有个有船的朋友 This is true: It’s hard to cheat an honest man. 相信我,你很难欺骗一个诚实的人 When an object is lost, 95% of the time it is hiding within arm’s reach of where it was last seen. Search in all possible locations in that radius and you’ll find it. 当一件物品丢失时,95% 的情况下,它都藏在人们最后一次看到它时触手可及的地方。在这个半径范围内搜索所有可能的地点,你就能找到它 You are what you do. Not what you say, not what you believe, not how you vote, but what you spend your time on. 你做什么就是什么。不是你说什么,不是你相信什么,更不是你支持什么,而是你把时间花在了什么上 If you lose or forget to bring a cable, adapter or charger, check with your hotel. Most hotels now have a drawer full of cables, adapters and chargers others have left behind, and probably have the one you are missing. You can often claim it after borrowing it. 如果你遗失或忘记带电缆、适配器或充电器,不妨去问问你的酒店。大多数酒店都会有满满一抽屉的电源线、适配器和充电器,这些东西都是别人留下的,没准儿其中就有你的,酒店也并不介意你借用后随身带走 Hatred is a curse that does not affect the hated. It only poisons the hater. Release a grudge as if it was a poison. 仇恨是一种诅咒,但它不会影响被仇恨的人。它只会毒害仇恨者,把你的怨恨当作毒药一样丢掉吧 There is no limit on better. Talent is distributed unfairly, but there is no limit on how much we can improve what we start with. 没有最好,只有更好。个人的天分有高有低,但不论高低,自身的提升都永无止境 Be prepared: When you are 90% done any large project (a house, a film, an event, an app) the rest of the myriad details will take a second 90% to complete. 任何一项大工程(修房子、拍电影、开发 app)完成度为 90% 的时候,你都要做好心理准备:剩余的大量细节工作同样需要 90% 的时间来完成 When you die you take absolutely nothing with you except your reputation. 当你死的时候,除了你的名誉,你什么都无法带走 Before you are old, attend as many funerals as you can bear, and listen. Nobody talks about the departed’s achievements. The only thing people will remember is what kind of person you were while you were achieving. 在你年老之前,尽可能多地参加葬礼并听听别人的谈话,没有人会谈论逝者的成就,人们能记住的只有逝者在成功时是什么样的人 For every dollar you spend purchasing something substantial, expect to pay a dollar in repairs, maintenance, or disposal by the end of its life. 你每花一美元在实体店购买一件东西,将来都要再花一元钱去维修、保养,或是在它报废后处理掉它 Anything real begins with the fiction of what could be. Imagination is therefore the most potent force in the universe, and a skill you can get better at. It’s the one skill in life that benefits from ignoring what everyone else knows. 任何真实的东西都来源于虚构的想法,想象是宇宙中最强大的力量,也是你可以做的更好的一种能力,生命中可以因不知众人所知而获利 When crisis and disaster strike, don’t waste them. No problems, no progress. 当危机和灾难来临时,不要错过他们,没有问题就没有进步 On vacation go to the most remote place on your itinerary first, bypassing the cities. You’ll maximize the shock of otherness in the remote, and then later you’ll welcome the familiar comforts of a city on the way back. 度假时,先绕过城市去行程中最偏远的地方。这样你就能最大程度地体验到异域风情带给你的冲击,而在返程的路上,又可以享受熟悉的城市所带给你的舒适 When you get an invitation to do something in the future, ask yourself: would you accept this if it was scheduled for tomorrow? Not too many promises will pass that immediacy filter. 当你被邀请在未来的某个时间点做某件事情时,问问自己:如果是明天,你会接受邀请吗?绝大多数邀约都经不住这种迫切性检验 Don’t say anything about someone in email you would not be comfortable saying to them directly, because eventually they will read it. 如果一些话你不能当面对某人说出口,那么就不要在邮件中对他评头论足,因为他们最终会看到邮件 If you desperately need a job, you are just another problem for a boss; if you can solve many of the problems the boss has right now, you are hired. To be hired, think like your boss. 如果你只是迫切需要一份工作,那你只是老板的另一个问题;如果你能解决许多老板眼下的问题,那你自然能得到这份工作。要想得到一份工作,就要像老板一样去思考 Art is in what you leave out. 艺术藏身于你遗忘的地方 Acquiring things will rarely bring you deep satisfaction. But acquiring experiences will. 获得物品很少能给你带来深刻的满足感,但是经验却能做到 Rule of 7 in research. You can find out anything if you are willing to go seven levels. If the first source you ask doesn’t know, ask them who you should ask next, and so on down the line. If you are willing to go to the 7th source, you’ll almost always get your answer. 研究的「数字 7 原则」。当你愿意就一个问题深入七层时,总能找到你想要的答案。如果你问的第一层人不知道,那么就问问他们应该去找谁,如此追索下去,你几乎总能得到你的答案 How to apologize: Quickly, specifically, sincerely. 如何道歉:迅速、具体、真诚 Don’t ever respond to a solicitation or a proposal on the phone. The urgency is a disguise. 永远不要在电话上面答应一个请求或提议,所谓的急迫不过是一种假象 When someone is nasty, rude, hateful, or mean with you, pretend they have a disease. That makes it easier to have empathy toward them which can soften the conflict. 当有人对你粗鄙、无礼、刻薄,甚至是下流时,当他们有病就好了,这使得我们更容易对他们产生同情心,进而缓和冲突 Eliminating clutter makes room for your true treasures. 清理杂物,为真正重要的东西腾出空间 You really don’t want to be famous. Read the biography of any famous person. 你绝对不会想出名,不信的话可以随便找本名人传记读读 Experience is overrated. When hiring, hire for aptitude, train for skills. Most really amazing or great things are done by people doing them for the first time. 经验往往被高估了,招聘时应该多看资质,技能是可以培训的。许多令人惊奇和赞叹的事情,都是新手做出来的 A vacation + a disaster = an adventure. 度假 + 灾难 = 冒险 Buying tools: Start by buying the absolute cheapest tools you can find. Upgrade the ones you use a lot. If you wind up using some tool for a job, buy the very best you can afford. 购买工具:从最便宜的开始,升级那些使用频次高的。如果你的工具是用于工作,那么买你能买得起的最好的 Learn how to take a 20-minute power nap without embarrassment. 学会毫不尴尬的打 20 分钟小盹儿 Following your bliss is a recipe for paralysis if you don’t know what you are passionate about. A better motto for most youth is “master something, anything”. Through mastery of one thing, you can drift towards extensions of that mastery that bring you more joy, and eventually discover where your bliss is. 如果你不知道自己热爱什么,追寻心之所向往往会带你误入歧途,对年轻人来说,更好的格言是:master something, anything,在精通一件事的过程中,你可以顺着带给你更多快乐的方向继续深入,并最终发现你热爱的东西 I’m positive that in 100 years much of what I take to be true today will be proved to be wrong, maybe even embarrassingly wrong, and I try really hard to identify what it is that I am wrong about today. 我敢肯定,我今天认为正确的许多东西在 100 年后将被证明是错误的,甚至可能是令人尴尬的错误。而我非常努力在做的事情,就是去识别我对今天的错误认知 Over the long term, the future is decided by optimists. To be an optimist you don’t have to ignore all the many problems we create; you just have to imagine improving our capacity to solve problems. 从长远来说,未来由乐观主义者决定。作为一个乐观主义者并非要对我们制造的问题视而不见,而是要想象如何提升我们解决问题的能力 The universe is conspiring behind your back to make you a success. This will be much easier to do if you embrace this pronoia. 整个宇宙在背后密谋让你成功,要相信,天助人愿
Read More ~

通过在生财有术捡碎片每月赚顿火锅钱

有段时间看到有人在生财讨论「外卖淘客」的案例,生财有术的公众号也转发了一篇手把手教学的文章:睡后收入:适合小白操作的一个自动赚钱项目,当天晚上读了这篇文章之后便立马操作起来了。 先是去关注了一堆做外卖淘客的公众号,看一下他们的操作流程和话术。紧接着把自己以前申请的公众号改名字、改头像、改功能介绍,去公众号后台设置关注后自动回复。然后按照上面文章中的介绍去闲鱼引流,但是闲鱼上面放的链接一直无人问津,只是一直机械的去学习同行,优化闲鱼的自动回复话术。 大概过了快一周的时候,微信上的一个朋友告诉我她想领红包时候发现我放的二维码已经失效了。虽然一直还没有进一分钱,但是这个朋友的反应让我觉得这个事是有希望的,至少还是有人会惦记外卖红包的,马上又去换了新的二维码继续推。然后第二天又告诉我二维码失效了,加上自己使用的是个人号而不是企业号,每天主动推送消息的次数有限,而且会被折叠隐藏起来,这时就有一点心灰意冷了。 继续换上新的二维码默默期待,玩了不到两周赚了不到 10 块钱的样子,后面又失效了两次后就放弃了,但是这一小段时间的实践让我验证了闲鱼引流的可行性。 瞎翻生财帖子的时候发现了卡券回收,一个可以靠信息差赚取认知以外的收入,心想简单转变一下就可以卖各个视频平台的会员卡啊。马上去闲鱼修改链接为腾讯视频、爱奇艺会员卡,发现不允许上架这一类的商品,那就只能靠图片去传递信息了。图片怎么做?石墨文档甩张图片、调一下字体、上个色,截一张图就是一张介绍图片。 这下有效果了,第一天就有人来咨询会员卡怎么卖的了,但是好几天都只是有人咨询却并没有成交的客户,而且每天都只是零零散散的 10 个人左右咨询。想起来在生财精华帖看到过需要刷单,闲鱼成功交易的商品再次上架会提高权重,每天编辑重新发布也会获得更多的推荐量。 找了三个朋友刷了其中一个爱奇艺链接的单,见效非常的快,当天晚上 9 点多就开始不停的有人咨询,我一直回复到了 12 点多,忘记那天赚了多少钱了,大概是一块鸡排的钱吧。从第二天开始就不断的有人来咨询,已经多到我回复不过来了,因为我还有别的工作要做。 晚上回家就设置了闲鱼的自动回复,将之前的外卖话术转变一下引导加我的微信,虽然流量一直都还不错但是却没有一个加我微信的,于是又改为自己手动回复了。连续这样玩了好几天真心觉得累,因为中间的利润太低了,稍微一提高人家就不买了。于是又去找成本更低的货源,总算找到另外一个靠谱且更低价的平台,每天可以稳定的进来一顿早饭钱,但却一直没有增长。 注意到进来咨询的人大致可以分为两类,一种是给家里长辈买电视版会员的群体,针对这种群体我就狂推年卡,因为年卡是我可控范围内能将彼此利益最大化的商品,这个没什么好说的。另外一种是只要周卡的学生群体,周卡基本没有什么利润,于是稍微转变了一下思路,对于这类群体就问对方是想要看哪个剧?引导对方加微信,我直接帮他找资源,然后随意给我发个红包就行了。 那段时间进来的很多人都是想看「使徒行者 3」,我一直没看过这部剧也不知道它讲的是什么,但是人家需要就对了,恰好我知道有个影视资源平台更新的速度非常快,看使徒 3 不仅要会员还得付费点播,把影视资源平台直接发给对方,都会发 3-15 元的红包给我。 后面又尝试过设置自动回复引导加微信,但是一旦设置自动回复效果就没了,使徒3 完了之后效果也有比较明显的下跌,我自己玩了不到两个月时间,如果一直玩下去差不多每月能吃一顿火锅,我个人觉得投入产出比太低了就没再做了。 目前微信上还剩一个非常信任我的客户,上来就简单粗暴的给我转钱,服务他到变成了一种小乐趣。2 月份发现这种视频会员需求进来的人直接推外卖 CPS 也可以,当时加了差不多 100 个微信,距离停止视频会员项目已经快 3 个月了我才在朋友圈发了几天饿了么的二维码,还是有效果的。 在抖音直营中心工作的朋友告诉我,在投放广告按原有方式定位不到人群时,可以通过设置其它兴趣来定位人群,比如喜欢看可爱宠物视频的人群可能也很喜欢买衣服,喜欢刷剧的人极有可能也喜欢点外卖、吃零食,「外卖淘客」这段时间很火,给各位提供一个引流的思路,也欢迎你加我微信我们一起交流相关内容。
Read More ~

那些经历过的人生谎言

哈佛大学从 1938 年开始做了一个研究,研究内容就是「到底什么样的人活的最幸福?」,研究组在 75 年时间里跟踪了 724 个不同的人,到教授在 TED 演讲的时候仍然有 60 人在世并仍参与研究,大多数人都已经 90 岁了,现在已经在开始研究他们的子孙后代,并且人数达到了 2000 多人。 这 724 人后来成了医生、律师、砖匠等,有人成了酒鬼、有人患上了精神分裂症,还有一位成了美国总统。估计也只有哈佛这样的地方才会去搞如此变态的研究,有足够的资金去承受这样理想的研究。人人都想要活的更加幸福,哈佛 75 年研究汇集成几万页的数据,然而结果只有一句话:良好的人际关系能让人更加健康和快乐,和我们所追求的财富、名望、努力工作等都没关系。下面是原视频内容。 小学语文课本上面有一个课后题要求自己编写《负荆请罪》故事的后续,记得当时老师把这个题目当作家庭作业留给学生了。回家之后只顾着玩泥巴、看电视了,第二天早上第一节课就是语文课,老师一上来就抽不同的同学给大家读自己写的故事后续。 在其他同学读故事的时间,我慌忙的写了一段应付老师的抽查。不出所料,我也被抽中起来读自己编的故事了,没想到慌慌张张编的故事居然深得老师之心,还被老师当作范文给大家又读了一遍,因为我在故事里面用了「连忙」、「赶紧」这样的一些词汇,能表现出廉颇和蔺相如之间的客气等等。 但我清晰记得那时候只想在被老师抽中之前把作业写了,胡编乱造完全不管写的好不好,只需要有一段话能够证明自己是做了作业的,万万没想到那么简单的一段话被老师赋予了数不清的情感。可类比的是各种网络平台上的文章,尤其是某个公司哪一位老总成功上位,铺天盖地的文章会把这个人肠子都翻出来看看,就好像写手比主人公还要了解自己。 最开始写文章是大四时候太闲想找点事做,断断续续到现在也算是写了 2 年多了,合起来有 100 来篇文章的样子。偶尔我会把以前写的文章搬到其它平台,比如把以前写的讲磁盘原理和自己做自然语言处理的两篇文章搬到 InfoQ,两篇文章都被平台置顶且精选至首页,而在公众号中讲磁盘原理的那篇文章阅读量是最低的。 前不久写了一篇与拼多多等电商平台有关的内容,一发出来公众号后台立马将近 20 个取关,让我这个本就没几个读者朋友的公众号雪上加霜。然后我鼓起勇气把这篇文章复制到满是大佬的生财有术社群里面去,隔了几天就被评为了精华帖,拿到一颗龙珠,8000 元到手。 去年年底想起了和师兄们一起刷牛客网题目的时光,随手就把 18 年写的一点文字贴上去了,18 年时候我的技术还很弱鸡,没想到贴上去却获得了还不错的反馈,一篇还被牛客小编标记为精选帖。于是我把 19 年遇到的关于服务器性能优化的一篇文章贴上去,那篇是我花了一个月时间查各种资料再加上自己实践的经验,现在看来都依然觉得写的非常不错,然而这篇文章在牛客网连一个赞都没有。 我写文章是兴趣驱动,写的好写得坏都不咋关心,但偶尔会有那么一两篇文章自己花了很多的精力去写,写完还自嗨一下写的不错,结果一发出来就打脸了。也出现过我自己敷衍了事像是一时应付写的文章,却被好几个大 V 看中,希望转载的。 忘记 18 年怎么加了「寒泉子」微信的,当时他输出的文章很多是关于 Java 虚拟机性能优化的,没有一篇文章我能读懂的,所以寒泉子的文章对我完全没有作用,围观他的朋友圈只是看大佬是如何成长的,那时候寒泉子创建「笨马科技」公司不久(现在笨马已经获得了高瓴资本的投资)。成功创业且快速的成长让寒泉子得到了更多人的关注,寒泉子的文章相比那时候阅读量提高了很多,但我依旧看不到他文章对我的价值,但我知道看不到好文章价值的原因是因为我的水平不够。 说了这么多就是想表达很多文字不是没有价值,只是因为你的水平太低而看不到他的价值(水平太高也会看不到价值),并不一定都是别人写的差。一篇文章给了你一个关键字那他就是有价值的,我们更多的是应该去培养自己抓线索的能力,一个不起眼的词语就能揪出来太多有趣的东西,只是大多数人即使把方法告诉他了都还是不会操作,需要努力提升自己的信息素养。 读了些书、见了些人、经历了些事,总结了几个人生的高级谎言。中年危机是不思进取的人经历的,尽量不要被社会上那些营销话术给骗了,少看那些什么发展各种副业挣钱的广告,把搞这些的精力好好用到工作上薪资早早的就涨起来了,尤其是玩副业几年都没有玩出花样的人,更应该把心收一收踏踏实实工作。 大家都知道「复利效应」这回事,比如 100 块钱按每年 5% 的利息计算,50 年后就能变成 1000 多块钱,看这个收益是不是非常可观?这个谎言的真相是你找不到年化能长期稳定在 5% 的投资产品,市面上各种理财培训都会说这个谎言,一些人自己本来没有赚到钱,却通过教别人怎么赚钱而赚到钱了。 30 岁之后身体就不行了、女人生娃一定要在 28 岁之前。乍听起来没有什么问题,但仔细一想就会发现这里采用年龄进行量化就不对,科学的量化应该是采用身体机能的各项参数。年龄只是一个表象的东西,成熟也同样与年龄无关,而与经历相关。 观察了一些电信诈骗的案例,有认识的朋友也有从未谋面的网友,自己也协助警方做了一次证人。会主动给你发营业执照、自己工牌一类信息的就是骗子。如果销售多次给你强调自己是正规公司,那他们基本就是不正规公司。凡是你根本不认识的人,但一上来就说要带你赚钱的,简单的当骗子处理即可,百分百不会错杀一个好人。 每个人都有一套稳定且自洽的逻辑闭环,自己的观念代表的是自己这个人,观念被否定相当于自己这个人被否定,可能这就是会吵架的一个内在原因,「老顽固」大概也是这么来的。人天生就喜欢呆在舒适区,不同观点发生碰撞就是把稳态打破,别人否定自己是一件极难接受的事情,为什么会难以接受呢?因为打破稳态需要思考,而思考是一件费能量的事情,生物的天性就是要节省能量,这大概和祖先生活的环境有关系,虽然现在的环境已经不需要这样做了,但遗憾的是基因却还没有适应,自己努力克服基因的缺陷吧。 学生 A 就读于成都一所中法合办的小学,进出这个学校多次之后的感受就是学校有钱,学生家里也都比较有钱,所以大部分学生都属于调皮类型的,综合该校多名学生口中的信息,每个班至少气跑了两名以上的老师。学生 A 在我处学习编程,他们班的同学都属于比较社会的那种,班主任老师也被这帮学生训练的贼有经验。 学校有一个厕所坏了,所以物管处就把这个厕所给锁上了,然而这种被锁上的门总是能激起学生的好奇心,很多学生下课就跑去门缝观察 💩,甚至有的学生还翻墙进去观察 💩,里面最有创意的学生应属学生 A。 厕所里面被拖把遮住了,学生 A 在门缝寻找到了一个比较好的观察角度,大吼了一句「奥利给溢出来了」,另一个学生并没有看到所以就翻墙进去看,却一不小心掉进坑里了,学生 A 嘴里吼着「XXX 满是奥利给的跑出来了」跑开。估计这是有史以来「奥利给」这么正能量的词语被侮辱的最惨的一次。 此事被学生 A 的班主任老师知道了,要说就得佩服这种班级的老师,不打不骂只让学生以「奥利给」为主题写一篇观察日记,要求学生把观察 💩的过程详细描述出来。学生 A 和班主任老师配合的这出戏在学校广为流传,大大提高了学生 A 的名声。
Read More ~