CRZ's Blog

浅谈ML学习

博主曾多次尝试“学习ML”:

  • 各种专业课(涉及到但不教的/教但是一大半是老古董的/…)上:一点没掌握,期末手写个反向传播,卷子一交忘得干干净净;实验是只会疯狂tab的,交完报告了事
  • cs231n:CV经典课,质量确实高但博主当时学的时候没开窍
  • 同理还有cs224n(NLP)
  • 应该还有别的但是往事不可查

现在回想当初乱跑的经历,我现在认为问题出在,自己都不知道自己到底在学一个什么东西,汲取新东西没有目的性。外加花里胡哨的概念太多,一下子涌上来眼花缭乱更是不知所以然了。

其实,学习ml,或者学习任何其它新领域,应当采用做research的思维去思考(本身这些方法也是从research中来的)。

具体来说,以ml为例,首先应该问:

如果 ML 是一个方法,那么它究竟是为了解决什么问题而诞生的?

这个问句的答案是:为了更好地找到一个function的“形状”,我们发明了ml。

自然而然地就有了下面的思考:

  1. 我们允许学出什么样的 function

    我们认为怎样的 function family 更适合描述这个问题?

    详细展开来说,function框架长什么样?哪些参数要学?为什么设计成这样?

    例如:MLP / Transformer / CNN / GNN。

  2. 如何学习?

    1. 从哪里学习?

      • 有标准答案,于是可以做 supervised learning。
      • 没有逐步的标准答案,只能通过和环境交互获得 reward,于是有了 reinforcement learning。

      还有 self-supervised learning、unsupervised learning 等等,本质上也都在回答:learning signal 从哪里来。

      我们能获得什么样的 feedback,会进一步决定该怎样构造 loss / objective / reward,以及整个 training procedure。

    2. 怎么学我们定义的“好”的 function?

      • gradient descent、backpropagation、SGD、Adam、learning rate
      • PPO / GRPO

顺着这种research思路往下学习,才真正能内化零碎的知识。

tips:

  1. 其实博主的饺子醋是想批判常规的四分格教学思路(先学回归再学分类再学聚类之类的),这样只是提出了一个又一个新概念而已,知道了一大堆名词,却不知道它们为什么会出现在这里,这种上来就进入methodology的思路值得鄙视
  2. 给了博主巨大帮助的教程:李宏毅老师的ML相关课程,在油管上均可以搜到。感谢老师的无偿分享TT

How to read a paper?

目前的一些体会,基本可以概括为:保持好奇心,多八卦(!)

有新想法的时候会更新。

调研

怎么调研一个领域

  • 找到领域最重要最关注的问题
  • 现在有什么解决方法
    • 带着上面找到的问题去读
  • 现有方法还存在什么问题
    • 哪些问题已经基本解决
    • 哪些问题大家还在反复解决
  • 顺着这些没有解决好的问题继续往下找 idea

泛读

  • 文章研究的领域
  • 现有工作要解决的是这个领域的什么问题
  • 现在的方法都是怎么做的
  • 他们存在哪些缺陷
  • 这个工作有什么样的insight
    • 它从哪里考虑来解决这个问题

泛读完,应当能把最大创新点说出来。

如果感兴趣,再去精读methodology。

精读

读method

  • method从什么提出(observation(尤其是 empirical observation)/assumption?)
  • 一定要问自己:为什么某某操作能提升某某效果
    • 解释实验现象
  • method好在哪里
    • 从应用端去想:为什么要用我们改进过后的方法?
      • 省时间/资源/可拓展性/generalization

看experiment

evidence 是否真的 support claim

看citing

  • 向前追:找领域SOTA和默认baseline
  • 向后索

对自己工作的启发

  • 该方法能否引入自己领域
    • X 在 A 为什么有效?
    • B 是否满足 X 赖以成立的条件?
    • 如果不满足,是哪一个结构阻止了它?
    • 这个阻碍本身能不能成为问题?
      • 如果确实是个不显而易见的问题,那么完全可以尝试思考如何解决这个罪魁祸首

Crossover使用说明

安装普通 .exe 程序

单独创建瓶子

  1. 点击安装后,点击右上角的安装未列出应用
  2. 选择下载好的 .exe 安装文件;
  3. 选择容器:
    • Bottle Name:随意,例如软件名称;
    • Bottle Type:选择合适的 Windows 版本即可;
  4. 安装。接下来会弹出 Windows 软件自己的安装界面,像在 Windows 上一样正常执行安装即可。

安装结束后,CrossOver 通常会自动生成软件图标,之后直接从对应瓶子中启动即可。

安装进已有瓶子

例如某个 .exe 是 Steam 游戏需要的补丁、组件或附加程序:

  1. 选中目标瓶子,例如 Steam;
  2. 选择 Install Application into Bottle;
  3. 后续同上

这样安装程序所写入的文件、注册表和 Windows 组件都会进入这个 Steam 瓶子。

文件管理

以steam中游戏的文件替换为例:

  1. 打开 CrossOver 主界面;
  2. 左侧选中安装 Steam 的瓶子;
  3. 点击 Open C: Drive。

Finder 打开后,进入steam,按以下路径选择即可

1
2
3
4
5
Program Files (x86)
└── Steam
└── steamapps
└── common
└── 游戏名称

At the End of the World

前言

关于世界征服,本篇采用了一些私设:

  1. 费加罗和奥兹在开始世界征服之前已经有了自己的住所;
  2. 世界征服开始于密斯拉未满百岁之时,即约 1500—1400 年前。

正文

奥兹还在世界征服。

听说它最近在央国大开杀戒呢。

要不要趁奥兹在外地去袭击魔王城堡?这家伙周游世界,想必又攒了不少好东西。

不过,那个没品味的奥兹,说不定根本认不出来一路上遇见的宝贝,把玛那石一顿啃完,就又去赶下一个场子了。世界上最无趣旅行者的称号可以让给它。整天和奥兹作伴四处横行,光是想想都后背一凉啊,也只有费加罗这种恶趣味的家伙有心思跟着它转了。它倒是比奥兹识货些,但我宁愿去闯双子的结界,也没兴趣拜访费加罗的家,装模作样的,屋随其主,远远眺一眼就想掉头。

算了,我可不像奥兹那么闲。我一要守着我的船按时上岗,二要收集散落的古籍精进咒术,三要补充高品质玛那石提升力量……天呐,怎么有这么多事等着我去做。但是为了迎战奥兹,我必须加快训练的节奏才行。

世界征服,最后一站,肯定要来死之湖吧?

我还没和任何人聊过这个话题,只是,没有征服过我的领土的话,算什么世界征服啊。等到奥兹走完一圈世界,最后来到死之湖,向我正式宣战,我再用早已今非昔比的魔力将它击溃。奥兹的玛那石是什么味道的呢?我一定会尝到的。啊啊,好完美的结局。

在这之前,还是不去城堡找麻烦了。最好也别向切雷塔透露计划,总感觉那个人去双子家串门时会聊漏嘴。等我真的打败奥兹之后,它可再没有借口把我当小孩敷衍了。

于是就这样,一个人探险,一个人历练,过了数百年。切雷塔有时会来找我玩,不过它呆不了多久就会去找下一个乐子;我也不觉得无聊,试想,有这样一个美梦近在眼前,再怎么无欲无求的人也会感到愉悦吧。

在雪原里被不知名的远古巨兽按倒在地、闲来无事抱臂躺在船上望天、又一次独自吞下新鲜玛那石……有那么多契机让我完善脑海里的画面。奥兹是会推门闯进我的小屋,还是一杖敲碎我的湖面?费加罗多半会替它谋划最后一战吧,至于奥兹听不听,又是另一回事了。不理它也好,这一战,一定要只属于我们两个才圆满,奥兹嘛,堂堂正正决斗的决心总还是有的。

切雷塔还是知道了我的计划,但它这次没像以前那样笑得那么过分,我觉得它是被我独自升级的效率打动了。等事成之后,分一块魔王的玛那石给它也不是不可以;不管是前世界第一的玛那石,还是前追求对象的玛那石,切雷塔肯定都感兴趣。

可是,什么叫奥兹结束了世界征服?

谁允许它在前来挑战我之前停止世界征服?

我甚至是在梦之森和欧文玩的时候才被告知了消息。顺带一提,欧文也知道我的计划,等回来再找它算账,那副得意忘形的嘴脸,这次真是格外让人烦躁。

我觉得我有必要去要个说法。连一千年都坚持不到,还有什么资格做世界第一……

直接空间移动到奥兹的城堡门前。一打开传送门,厚重的风雪压着空气卷来,暗沉中,还没来得及动手闯入,倒是撞上了奥兹的帮凶。那个人,被奥兹拒之门外了啊。

不管它,现在就进去。

“密斯拉,别去打扰奥兹了吧。”

奇了怪,费加罗今天居然主动招惹我。它要找我打,我也不是不能奉陪,但不是今天啊。

我没理它,径直向大门走去。

“ポッシデオ。”

我闪身躲开。为什么没一件顺心事呢?几百年的余韵,仿佛一霎就被冲毁了。

“费加罗,别来打扰的是你才对吧。我可不会任由自己被拒之门外。”

它没说话。

雪一直落,要把世界淹没似的。

我明白进门前必有一战了。

召唤出魔道具,骷髅眼窝中准备燃起火焰,身侧的风雪忽然一乱,另一道声音传了过来。

“密斯拉,今天先回去吧。”

切雷塔也来了?

“你也来拦我。”

“嗯。”

“到底为什么?”

切雷塔停了一下。

“因为你现在进去,也得不到你想要的东西。”

它知道我问的不是我为什么不能进去。切雷塔明明知道的。

但是,好吧。

纷飞的雪花劈头盖脸地砸下来,我看着紧闭的大门,又看了看这俩没出息的门神。一个不说话,一个没有笑。如果我执意进去,这两个人都不会手下留情。

更重要的是,即使进了门,奥兹也不会重新开始世界征服了。我有这种感觉,就在刚刚这一瞬。

骷髅眼窝里的火焰熄灭了。

它怎么能放弃呢?

我转身踏进传送门,临走前又回头看了一眼。风雪把城堡遮得严严实实,仿佛无人居住其中。

算了。等奥兹哪天重新想起来,世界上还有一个地方没有被它征服,自然会来死之湖找我。

我等着就是了。

后记

没有人关心但是本质上是一篇世界征服压抑产物(

Just Another Day

前言

提前谢罪把王子大人写漏了TT

正文

贤者大人张罗着要给这届魔法使们拍张合影。

最早赶来的是米契尔和央国的小家伙,叽叽喳喳地围着贤者,合照还没个影,就计划着等会儿要怎么交换相机互拍。

听起来就麻烦。

我可不要留下陪你们玩,贤者大人也不准被耽搁,早早陪我上床睡觉才是正事。要不是这人一脸可怜鬼缠身的衰样,小型犬一样追着我保证,我才不会这么早就坐在水池边,什么事也不做,干等着那些散漫的家伙一个个出现。

刺耳的风从上空划过,溅出几簇水花洒在我肩上。不用抬头也知道,南国的迷糊鬼骑扫帚赶到了,大个子和费加罗也随后跟来;东边那四个倒是安静,结伙一起从魔法舍走出来,又一起钻进树荫下,不声不响地等着;央国的小子和奥兹并肩往这边行来,天哪,它又在拍奥兹的肩膀。跟奥兹勾肩搭背是什么感觉?想想都有点犯恶心,都怪奥兹,好想决斗。

不行,为了今晚,暂且让它一回。

我移开眼。西国的烦人鬼们也到了,这下烟花声、笑声、不知道谁领头唱起来的歌声全部混杂在一起,简直吵死人了。

所以说,到底为什么突然要拍照啊,贤者大人,又是那个世界的什么奇怪节日吗?

“诶,不是为了什么纪念日啦,只是,なんでもない日也可以聚在一起做些什么,这就是伙伴呀,密斯拉。况且这也可以作为留给下一任贤者的资料嘛!”

抱着头,手臂微微压住耳朵,在池边躺下,不知怎么又想起它的回答。明明最后一个来也没影响,让贤者一个人在那招待就是了,而不是现在这副傻样,把主动权递给还没来的人。但说不清为什么,那家伙一边笑着,一边牵着我的手,回过神来的时候,我已经坐在了水池旁。

“呀,密斯拉。”

黏糊糊的声音从头顶落下。

“你居然会老实等人?”

是欧文拉着布拉德利,一副亲亲热热的模样。那双异色的眼睛往前面的相机上一瞥,忽然眯了起来。

“看见了吗,布拉德利?下次试试用这个对付它怎么样?它脑袋笨,同时处理不过来两件事的,这边因为拍照晃了眼,那边就顾不上杀你了哦。”

看起来那么好说话的人,嘴里吐出来的东西怎么这么难懂呢?总感觉,这人又意有所指。

完全听不明白啊。它俩自己估计还要纠缠半天,等会儿再想吧,反正它们也打不过我。

“贤者大人,快开始吧,总算到齐了。”

我坐起来,伸伸懒腰,没理会旁边人的怪声怪气。

北国的双子总算到了,两个人你一声我一语,腻乎得像甜蜜的脓——欧文总爱这么形容,现在听来倒很合适。倚老卖老的家伙,居然让我等了这么久。

我挑了个最边上的位置站着,离这几个一肚子坏水的人远远的。

偏偏欧文今天很不对劲。没去缠着它家那个目玉の人,反倒挤来我旁边,也不说话,只是隔一会儿就转转眼球,从旁边斜我一眼。

搞不懂,我今天可没空奉陪它的馊主意。

眼看身边这家伙窸窸窣窣了半天,贤者大人总算把这一大群人都塞进了镜头里。

“三、二、一——”

前面的相机发出轻响。

白光闪过的瞬间,欧文突然贴过来,一把挽住我的手臂,夹得死紧。

这人今天到底怎么回事?找茬还是挑衅?

算了。照片都拍完了,没工夫跟它计较。该带贤者大人回去睡觉了。

转过头,准备甩手去抓人,箍在手臂上的力道却突然先一步松开。紧接着,又一道白光闪过眼前。我猛地侧过身去,可还是晚了一步。

“密斯拉呀,在魔法舍待久了,连这种程度都反应不过来了吗?以前明明不会被这种东西骗到的,被驯化的北国魔法使——哎呀,听起来好有趣。”

颧骨上传来一阵刺痛,有温热的液体淌下来。

“看吧布拉德利,我说了,这家伙的脑瓜只能单线程运转。”

欧文退开半步,笑眯眯地举起提包。

居然让欧文伤了我。好,这下不做个了断的话,今天是睡不成觉了。

我抬手抹掉碍事的血迹。

“アルシム。”

咒语落下,魔力凝成刀刃向那边刺去。周围传来几声惊呼,当然还混有老东西们装模作样的尖叫声。

对面早有准备,向后一跃。刀光擦过它的身侧,撕开一截衣角。

不过,欧文还真是没说错,一步退,步步退,从前我哪有这么多可让步的地方。一开始把贤者带回去陪我睡觉的话,我哪儿用得着费这些劲啊。

“嘿,密斯拉,这就生气了?陪贤者它们整天瞎混,连脑袋都跟着变迟钝了吗?”

“说什么呢?”

从今天见面起,欧文好像就一直在扯一些听不懂的话啊。

“啧,记性有够烂啊。”

它撇撇嘴,对我的反应相当不满意的样子,故技重施,又射出一道白色光箭。

我瞬间凝起光球,迎面撞上去,将光箭截在半空。

这人从头到尾都过于反常了,放在以前,它早该把箱子里那怪物放出来咬人的。

顷刻间,数道白光轰然对碰,无数碎片往四周飞散又炸开。

不想继续纠缠了。我召唤出魔道具,准备速战速决。

“欧文。”

它侧身避开一道炸开的白光。

“你今天到底在翻哪笔旧账?”

欧文的动作停了一瞬。

“……你不知道?”

“所以我才问你啊。”

它脸上的笑一下子消失了,猛地拉开手提箱。蛰伏其中的怪物探出三个脑袋,朝我张开满是尖牙的嘴。

总算对劲了。

我举起魔道具,对准它,骷髅眼窝中燃起幽色,冥火翻涌着,迎面撞上扑来的三头怪物。火焰和利齿剧烈相碰,掀起气浪向四周扫去。贤者它们又准备开始劝架了,可这回根本与我无关啊,我只是想睡个觉而已。刚刚还在给我们合影的相机也被掀翻了,那种东西,怎么样都好。

ケルベロス被冥焰轰翻在地,三个脑袋东倒西歪地叠在一起,彻底没了动静。我再次举起骷髅头,紫光在头顶铺展开来,一口气朝着欧文袭去。

“嘶——”

挡在它面前的魔法彻底崩碎。

我穿过尚未散尽的火焰,一把揪住它的衣领,将人重重按倒在地。骷髅空洞的眼窝重新燃起幽光,该是最后一击了。

“请您去死吧。”

“哎呀,密斯拉。”

被压在地上的人忽然笑了。

“你不看看旁边吗?”

才不会上它的当。

骷髅眼中的火焰烧得更盛了。

“真的不看吗?”欧文眯起眼睛,“明明四百年前,你对它还挺感兴趣的。”

四百年前?

啊,是那一次。

我终于明白它在扯什么了,但那又如何?请它再一次去死吧。

火光骤然落下。

就在冥焰即将吞没欧文的瞬间,另一道魔力突然从侧面撞了进来。火焰偏开半寸,擦着欧文的胸口轰进地面。它闷哼一声,整个人被余波掀了出去,重重摔在地上。

“哎呀,差一点就结束了。”

布拉德利站在不远处,慢悠悠地收回魔道具,脸上完全没有妨碍了决斗的歉意。

“先别急着杀嘛,密斯拉。它都提示到四百年前了,你至少回答一下再动手吧?”

“它说四百年前的时候,我就想起来了啊。”

欧文撑在地上的手顿了一下。

“就是你突然拿出一个黑色匣子对准我,结果话还没说完,就被我杀掉的那次吧?”

我看向它。

一阵白光而已,甚至算不上刺眼,当然不会影响我继续攻击。相机磕碜着,掉落在还没凉透的遗体身侧。唔,那天,我本来是打算直接回死之湖的,不过,我已经不记得后来为什么没能立刻动身,只是在原地蹲着,盯了半天尸体,临走前又捡起相机,对着欧文按了一下。

现在想想,还是不知道当时为什么要那么做。

“所以,你是对后来我给你拍的那张照片不满意吗?”

“你这家伙!”

它睁大眼睛,瞪着我的脸。这副表情,倒是又恢复到之前好搭话的样子了。突然有点懒得继续了。

“欧文,你还要我重新给你拍一张吗?我懒得动了啊,你需要的话,自己死一次吧。”

“嘁,谁要你拍尸体啊,真是恶趣味。”

好麻烦的人。

“那我走啦。贤者大人,回去睡觉,说好了的哦。”

旁边的布拉德利突然漏出声笑,拍拍欧文的肩,又被唰一下拍开。

“喂,我可是好心帮你。上次拍的是尸体,这次难得还活着,你真不想再来一张?”

“你闭嘴。”

本来就青白得跟死了没区别的脸色更难看了,欧文没理布拉德利,眯眼盯了我半天,泄了气似的。

“算了,跟睡不着觉的可怜鬼计较什么。”

撑起身,嗤笑一声,欧文无声无息地消失在空气中。

好吧,我歪歪脖子,虽然还是不太懂,但总算是可以回去睡觉了对吧。

后记

ミスラ说如果要向我表达好意的话,请给我千年不变的爱,到那时再考虑。

博主很想要强调北兄妹在关系性上的千年不变而绝非爱情,但是写着写着有点变流水账了()

不爱正视自己的两人,有着永远也不必要重新审视的关系,会翻旧账但是具体翻没翻过去谁也不在意。我实在太喜欢这种放任身心随水流沉浮的肆意感了。

Tears

前言

基于活动剧情《紅蓮の大地で遊ぶ愛し子》展开的往事。

小头作祟产物烦请多多包涵。

正文

那个西国的哲学家这几天总不厌其烦地找我搭话,自顾自地说起它收集全魔法舍眼泪的宏大计划。据它所说,魔法使留下的泪有强化魔法科学装置的力量,这是个已经得到实验验证的结论,虽然暂时原理不明,但战备时期特殊对待,难道我不想见证奇迹的发生吗?

“奥兹给了你眼泪吗?我可不想在这上面输给它啊。”

西国魔法使总是这么烦人,我避开它的眼神,试图打发走讨厌的野猫。

奥兹当然不会把体液遗留在外,或者说,但凡是对咒术略知一二的人,都不会留下这种把柄啊,这是有多不把我当回事。

说到底,我们这样的人,根本就不会流泪吧。

我只看过切雷塔的眼泪,约定成立的那个瞬间,我看见了泪光在它眼里闪烁。定下约定的明明是我自己,为什么是它坐在草地上又哭又笑的呢?就好像又在提醒我,自己和切雷塔毕竟已经不是一样的人了。

那它的眼泪还会和我眼眶里打转的液体是同一种味道吗?

天哪,我那个时候怎么没想过要尝一下它的眼泪,再也没有解答的机会了。或者当时应该直接问切雷塔的,那滴泪明明顺着它的脸颊流到了嘴角,况且之前那次,这个霸道的人真的吃过我的泪液来着。

在红莲炎山给贤者它们讲的故事,到封印就戛然而止了,多亏 diaugur 那家伙没有透视封印之力,千百年来只记得复读切雷塔叫我名字而已。

其实我早体会过贤者口中的桑拿,切雷塔结束故事的时候,我可是就趴在火山口旁边,眼睁睁看着自己的对手被强制暂停动静。不安恼怒的精灵把岩浆舞得到处都是,火山灰遮天蔽日,本就炎热的火山口被彻底闷成蒸笼,那热气,可不是姆鲁用魔法装置能模拟出来的呢。

巨大的 diaugur 就这样消失在眼前,我侧着脸,盯着只剩嘶嘶白气的岩床,不知道该摆出什么表情。那是沙子从手中滑落的感觉,我多想站起来,却发现竟然控制不了自己的魔力——我还没悟出精灵、支配与力量的关系,也没把此地精灵的暴躁真正看进眼里。

好烦躁,好想把大家伙揪回来,好想撑起身来继续作战,明明还没有决出胜负不是吗,为什么站不起来,大腿被咬穿而已,这样的伤我早受过无数遍了啊。

我咬着牙,试图控制残破的四肢,死命瞪着火山口,想往那边爬过去。可是,一双手轻飘飘地按住了我。

那个我一直假装忽略的人,把我翻过身来,用魔法定住我。我看见它凑过来,一脸笑意,胡乱拨弄着我的脸。

“哭了吗,密斯拉,因为被夺走了猎物?”

我不想理这个人,它也不在意没有回应,自顾自地念叨着什么“果然还是小孩子”,又俯下身来。我没法再去看消失的魔兽了,切雷塔占领了我的视线,越来越近,清晰的人像逐渐变成色块的交织。金色长发散落在我身上,和伤口黏在一起,又随着它的动作把血肉磨开。好痛,好热,气息还在靠近,瞳孔一直在放大,什么都看不清了,直到有什么湿答答的东西彻底触碰到它。

它想尝我眼球的味道吗?

炙热的软体挑衅着眼白,眼皮被手拉开,就这样直瞪瞪地被侵犯,一下,又一下。分泌的泪液下一瞬间就被刮去,好像一切液体都被眼前的炽热蒸发干净。

眼球又麻又干,只是每每在被触碰的瞬间微微跳动。

好想眨眼。为什么我耳边只余眼球起跳的声音。

“这下真的哭了呀,密斯拉。”

突然传来杂糅着惊讶的调笑,它在说什么,不对,它怎么在说话?我试着眨动眼皮,一滴泪从另一只被冷落的眼眶滑出。再眨,试着聚焦视线,用手撑起身躯,我瞪着这个讨厌的人。

“总算冷静下来了,你看,现在可以控制四肢了呢。”

完全没有被我的眼神吓到!

“切雷塔,我会回来找我的猎物的。”

脸上早已糊成一片,我用力抹了抹,却赶不走那种黏腻感,血迹也好,涎液也罢,早就在热气的蒸腾下凝固了,或许还混合着那滴泪。它看着我脏兮兮的样子,笑着应了声,挽住我的手带着我往死之湖飞去。

哈,切雷塔这副不称职的老师模样,现在只有我知道了。眼泪的味道,再也不会有人为我解答了。

I'm Only Sleeping

前言

密密的最终幻想(

正文

有多久没睡过完整的一觉了。

白日没有运送尸体的活找上门,无聊地度过一天光阴,在困倦中逐渐失去意识,一夜无梦,第二日懒洋洋地被太阳照醒;或是历经一番大战,修复好受损的血肉,就地躺下任凭自己昏迷,醒来再回船上待业。

我好想再完整地睡一觉。

上好的熊皮一定要准备一张,我要裹着它睡在雪被里。剩下的肉就在一旁的篝火上烧着吧,噢,讲起这个,烤肉酱好像用完了啊,我得抽个空去森林里再煮一锅,这次双子应该没那么多废话了吧。诶,好像忘了什么,之前不是说要和布拉德利一起去搜刮双子的房间来着,后来怎么没去呢?好烦,现在奥兹晚上恢复魔力了,就算趁天黑出击,大概也会被拦下来。那对双子总是搬救兵,丧失了半身力量的下场就是这样吗,真可怜。还是直接去闯魔王的城堡吧,也该到了一决胜负的时候了,我会证明自己才是夜之帝王的。日子就该这么过才对啊,马上就想传送过去打上一架。

“クーレ・メミニ。”

什么动静。

我睁开眼,侧身躲开,但还是被蹭掉一大块皮。

“アルシム。”

欧文,它怎么在这里?

“密斯拉,闯进梦之森,不需要先向主人打声招呼吗?”

啊,我在梦之森,大灾厄还没结束,觉也根本没睡成。做了个可笑的白日梦,现在还被吵醒了,真烦人。

“你是蠢货吗,呵呵……听不懂话也没关系,来了梦之森,总要留下点什么来滋养它吧,睡不着觉的你连梦境都没法提供,我就替可怜的它主持一下公道吧。”

好想睡觉。

总之,先解决眼前的挑衅吧,说不定,这次打累了可以睡个好觉呢。

Both Sides, Now

前言

本文灵感来源于Joni Mitchell的同名歌曲。

正文

又飘过一朵云。

这次是羽毛覆盖的峡谷,还是北国巨兽的翅膀?

我不知道,我只是躺在船上,看着云团聚拢又消散。

听起来文艺又无聊吗?唔,其实我也不知道自己是在看什么,或是在等待什么的出现。只是,风雪过境的日子太多,这样能够捕捉到云朵轨迹的时刻,我好像不想错过。

魔法使的生命太漫长,再稀少的瞬间,叠加起来也算不上稀奇。可我还是不明白,所以仍会一次次等待它出现又离去,连打斗也可以暂且放在一边。

从前我一直是这样看云的。切雷塔来之前是这样,走之后也是这样。

我以为我们可以一直这样看着云。我还是躺在那条船上,头枕着手,微眯着眼,望着难得的晴天。身边或许会有魔女突然降落,这样的时刻,即使是聒噪的它也会愿意只是坐在船侧,静静地感受身旁的吐息;或许直到云消散也不会有人来,但那又如何。魔法使的时间看不到尽头,云朵总会在下一次出现,行踪不定的那个人,也总会在某天又带来吵闹的笑声。

可我还是不懂云,尽管我已经看遍了它,从各个角度。有那么多事,我本来可以去做,却被云挡住了去路。我想去追问它的变幻莫测,不知不觉间,反倒一路跟着它来到了南国。死之湖的云厚重浓烈,飘到这里,却变得缥缈柔软。我不明白,明明一直在看着它,我还是不懂它为什么要变化。

船只在第谷湖上晃晃悠悠,我躺在上面,想找回熟悉的感觉,却浑身不得劲。这里的云可以从日出逗留到日落,可以被骤雨打散又在晴时恢复如初,一点都不像我地盘上的那家伙。可真懒散啊,我才不要奉陪,你就慢慢悠悠地留在这儿散步吧。猛地坐起来,没有知会任何人,我悄悄地回去了。

我好像有一点懂它了,在我不再能等到它之后。那些家伙都说它变了,我也依旧这样觉得,可或许,我曾坚信的那些也只是一场幻象呢,厚重却一吹即灭,无形却阴魂不散,这听起来,不是最荒谬的错觉吗?这家伙,真是给我留下了个大麻烦呢。

vim

vim学习

Vim

Linux系统下的开源文本编辑器

  • 基本输入操作
    • 创建文件(touch)
    • 打开文件
      1
      vim helloworld.c
    • 输入内容:按I进入输入模式
    • 保存并退出vim
      1. 按esc回到命令模式
      2. 按shift+;进入底线命令模式
      3. 输入w并enter,保存文件
      4. 再进入底线命令模式,输入q即可关闭文件回到CLI shell (3、4可合并为wq)

配置

  • 配置文件:.vimrc,位于用户主目录下
  • .vimrc配置

Normal模式

复制粘贴

如何复制选中内容到系统剪切板?

Undo/Redo

  • u:undo
  • <C-r>:redo

delete

  • x:删当前光标所在的一个字符
  • dd:删除当前行,并把删除的行存到剪贴板里

移动光标

  • 0:到行头
  • ^:到行首第一个非空字符
  • :<n>:移动到第n行
  • gg:移动到第一行
  • <C-f>/<C-b>:前后翻整页

可视模式

输入v进入

复制粘贴

以下仅限于vim内部操作

  • d:剪切选中的文本段
  • y:复制
  • p:粘贴

linux操作

Linux

What is Linux?

  • 一个Linux发行版(例如Ubuntu):
    • Linux内核
    • GNU项目:一个自由软件集合
    • 其它软件和库

Linux基础操作

1
命令名 [选项][参数]...
  • [ ]:意为可选0~n个
  • 可通过man命令来查看具体命令的使用说明
    1
    man [选项] 命令

目录操作

1
cd directory

在需要键入文件名或目录名时: 可以使用 Tab 自动补足全名,双击 Tab 可以显示所有可能选项

  • /:根目录
  • ~:当前用户主目录
    • 普通用户($):/home/username
    • root(系统管理员)用户(#):/root
  • .:当前目录
  • ..:上一级目录
  • -:上一次访问的目录
1
ls [选项] [目录]
  • 选项(常用):
    • -a 显示隐藏的文件
    • -l 每行只列出一个文件
1
mkdir [选项] 目录
1
pwd [选项]
  • 作用:输出当前目录的绝对路径
1
rmdir [选项] 目录
  • 作用:删除空目录

文件操作

支持对多个文件的操作,例如使用*来匹配任意长度的字符串

1
touch [选项] 文件名
  • 作用:当文件存在时更新文件的时间戳,当文件不存在时创建新文件。
1
rm [选项] 文件
  • 选项:
    • -r:递归删除目录及其内容,删除非空目录必须有此选项,否则无法删除
    • -f:强制删除,不提示用户确认,忽略不存在的目录
    • -i:逐一提示用户确认每个将要被删除的文件
1
cp [选项] 源文件 目标路径
  • 选项:
    • -r:递归复制目录及其子目录内的所有内容
1
mv [选项] 源文件 目标路径
  • 作用:
    • move
    • rename:例如mv test.txt test2.txt
  • 选项:
    • -v:显示详细的操作信息
    • -i:覆盖前询问
    • -u:(仅在有必要时移动)仅在源文件较新,或目标文件不存在时,才执行移动操作
  • 多源移动;当有多个源时,最后一个参数必须是目录
1
diff [选项] 文件1 文件2
  • 作用:比较
  • 选项:
    • -b:不检查空白字符的不同
    • -B:不检查空行
    • -1:仅显示有无差异,不显示详细信息
1
cat 文件
  • 作用:将文件内容输出到标准输出
1
echo <text>
  • 作用:print
  • 默认添加换行符,所以即使echo ''并非空(需要 -n去除)

查找操作

1
find [路径] <选项>
  • 作用:在给定路径/当前目录下查找
  • 选项:
    • -name <文件名>:指定需要查找的文件名
1
grep [选项] PATTERN FILE

(PATTERN是匹配字符串,FILE是文件或目录的路径)

  • 作用:输出匹配PATTERN的文件和相关的行。
  • 选项:
    • -a:不忽略二进制数据进行搜索。
    • -i:忽略大小写差异。
    • -r:从目录中递归查找。
    • -n:显示行号。
    • -v:反向过滤
    • -w:按独立单词匹配
    • -o:只输出匹配到的部分
  • 例如:grep hello a.txt
  • 可使用正则表达式作匹配
    • '^a':匹配行首为a的行
    • 'end$':匹配行尾为end的行
    • '[0-9]'
1
tree [选项] [目录名]
  • 作用:输出一个目录下的文件树。
  • 选项:
    • -a:列出全部文件(包含隐藏文件)
    • -d:只列出目录

快捷键

  • ctrl + c:终止程序执行
  • ctrl + z:挂起当前程序
  • ctrl + d:终止输入(相当于输入一个EOF)
  • ctrl + l:清屏
  • ctrl + s/ctrl + q:暂停/启动终端

GNU工具

GCC

即GNU编译器套件。

1
gcc [选项] 源代码文件
  • 作用:编译源代码文件
  • 选项:-o example
  • 若编译成功,同目录下出现a.out可执行文件
    • 执行./a.out即可输出
    • 需要传参?可类比:./casegen.out add 100 > case_add

make

make学习博客

  • make工具:根据Makefile中规则,自动化编译和构建项目
  • Makeflie
    • 由一系列rules构成,每条rule形式如下:
      1
      2
      <target> : <prerequisites> 
      [tab] <commands>
    • target
      • 通常是文件名:指明Make命令所要构建的对象
      • 也可以是某个操作的名字,这称为phony ,例如:
        1
        2
        3
        .PHONY: clean
        clean:
        rm *.o temp
      • 若Make命令没有指定目标,默认会执行Makefile文件的第一个目标
    • prerequisites(前置条件)
      • 通常是一组文件名,之间用空格分隔
      • 用法:生成多个文件alt text
      • 本质:若某个文件变化,会导致目标过期,则当前目标依赖该文件
        • 注意区分与伪目标(调用就执行,不关心过期)
    • commands(命令)
      • 注意:需要注意的是,每行命令在一个单独的shell中执行。这些Shell之间没有继承关系。alt text
        • 这种“独立”只反映在shell变量上,而不影响磁盘上文件的改变
    • 多级Makefile:
      • 调用下级Makefile:
        • make -C subfile xxx
    • Grammar
      1. #
      2. echoing回声
      • 正常情况下,make会打印每条命令,然后再执行,这就叫做回声
      • 在命令的前面加上@,就可以关闭回声
      1. wildcard通配符alt text
      2. 模式匹配:%
      3. 变量和赋值符
        1. 调用时,要把变量放在$()中
        2. 赋值运算符:常用:= alt text
      4. 内置变量
      • $(CC):指向当前使用的编译器
      1. 自动变量
        1. $@:代指当前target
        2. $<:代指第一个前置条件
        3. $?:代指比目标更新的所有前置条件
        4. $^:代指所有前置条件,之间以空格分隔
        5. $*:指代匹配符%匹配的部分
      2. 循环和判断:遵循bash语法

ctags

在~/.vimrc中添加配置:

1
2
set tags=tags
set autochdir
  • 功能:代码跳转
    • ctrl+]跳转至相关定义文件位置
    • ctrl+o返回跳转前位置

tmux

终端复用工具 输入tmux进入tmux新对话

  • 重要快捷键:alt text

Git

alt text

  • 工作区
  • 暂存区
  • 版本库 S
  • untracked:未跟踪,未被git跟踪的状态
  • unmodified:未修改,版本库版本和工作区版本一致
  • modified:已修改,版本库版本和工作区版本不一致
  • staged:已暂存,修改版本已提交至暂存区,但尚未上传

Git常用指令

基本提交

git init git clone <URL>:“克隆”一个已有的储存库到当前目录下 git status:查看当前分支状态 git add:将新文件/已修改文件加入暂存区

  • git add .:add所有修改进入暂存区
  • git add <filename>

git checkout:切换分支(需要保证当前所有文件状态为未修改) git commit:git commit -m <message>

  • 将暂存区的修改提交到储存库中

git log:查询提交记录

撤销指令

  • 工作区撤销 git restore <file> 把工作区文件恢复到暂存区版本
  • 暂存区撤销 git restore --staged <file> 把文件从暂存区取出,但还保留工作区文件
  • 删除未跟踪文件 git clean -f

版本回退

  • 版本库回到上一个提交 git reset --hard HEAD^
  • 版本库回到指定提交 git reset --hard <hash>
    • hash: 对应提交的hash值,可用git log获取

远程本地同步

  • 远程->本地:git pull [远程仓库名] [远程仓库分支]:[本地仓库分支]
  • 本地->远程:git push [远程仓库名] [本地仓库分支]:[远程仓库分支] git restore:取消修改
  • 未add入暂存区时:git restore <filename> 来撤销对这个文件的修改,使其退回到上一个 commit 的状态
  • 已add入暂存区后:git restore --staged <filename>将文件移除暂存区,再次restore

Shell

Shell,即操作系统的“外壳”(相对“内核”而言),是用于访问操作系统服务的用户界面

分类

GUI Shell

  • GUI:
    • Graphical User Interface

CLI Shell

  • CLI:
    • Command Line Interface:命令行界面

Shell脚本语言

Shell脚本的执行

  • 约定脚本文件的文件名以.sh结尾
  • 执行Shell脚本:./文件名
    • 前提:脚本文件有“执行”权限
    • 用chmod +x filename添加执行权限

Bash Shell语法基础

1
2
3
#!/bin/bash
#My first Shell script!
echo "Hello, world!"

alt text

  1. 变量:无需指定类型,但是等号两边不允许空格
  • 使用${var_name}/$var_name可以获取变量的值
  • 数组:i=(1 2 3 4)
  1. 脚本参数alt text 特殊变量:
    • $#:传递的参数个数
    • $*:一个字符串,内容是传递的全部参数
    • $?:函数返回值
    • $N:当N>=10时,需使用${N} 使用特殊变量时,尽量加上双引号"",防止解析错误
  2. 条件:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    if condition1
    then
    command11
    command12
    ......
    elif condition2
    then
    command21
    command22
    ......
    else
    command31
    command32
    ......
    fi
  • 整数比较方法:((condition))
  1. 循环
1
2
3
4
5
while condition
do
command
...
done
  1. 计算
    • 以下等价:
      • let i=i+1
      • i=$((i+1))
    • 运算符:
      • (()):结果非零时返回0(真)
      • $(()):直接返回计算数值结果
      • []:条件为真时返回0
        • [ -s < file> ]:文件非空
      • [[]]:支持&&等逻辑符
  2. 函数
  • 定义:
    1
    2
    3
    4
    function fun_name() {
    body...
    return int_value;
    }
    (如果要返回值,必须返回一个[0,255]之间的整数)
  • 调用: fun_name param1 param2 ... paramN
  1. 变量字符串分割
    1
    2
    ${name:1:3} //${变量:起始位置:长度}
    ${name:0:(-3) }//去掉末尾3个字符

sed

通过命令编辑和输出文本的工具

1
sed [选项] '命令' 文件
  • 选项
    • -n:安静模式,只显示经过sed处理的内容。否则显示输入文本的所有内容。
    • -i:直接修改读取的档案内容,而不是输出到屏幕。否则,只输出不编辑。
    • -e: 允许在同一行里执行多条命令,例如sed -e '4astr ' -e 's/str/aaa/' my.txt
  • 命令:
    • <行号>a<内容>: 新增,在行号后新增一行相应内容。行号可以是“数字”,在这一行之后新增,也可以是“起始行,终止行”,在其中的每一行后新增。当不写行号时,在每一行之后新增。使用$表示最后一行。后面的命令同理。
    • <行号>c<内容>:取代。用内容取代相应行的文本。
    • <行号>i<内容>:插入。在当前行的上面插入一行文本。
    • <行号>d:删除当前行的内容。
    • <行号>p:输出选择的内容。通常与选项-n一起使用。
      • ‘n,mp’:输出[n,m]行
    • s//:将(正则表达式)匹配的内容替换为
      • 默认只作用于每一行的第一个匹配项
      • 末尾标识符g:作用于所有,e.g.sed -i "s/char/int/g" file

awk

文本处理工具 awk '条件 { 动作 }' 文件名

  • awk默认:

    • 一次读取1行
    • 把这一行拆成若干字段,用空白字符分割每一列
    • 执行规则
  • 常用内置变量

    • $0:整行
    • $n:第n列
    • NF:当前行的字段数
    • NR:当前是第几行
    • OFS:输出字符分隔符
  • 例如:

    • awk '$2 > 80 {print $0}' score.txt:当第二列大于80时,输出一整行
    • awk -F ',' '{print $1, $3}' test.csv:输入分隔符为,
  • 一定要注意用''包裹条件&动作,防止解析错误

重定向

在命令后添加

  • > output.txt:覆盖原有内容,若不存在则新建
  • >> output.txt:追加内容 即可将输出重定向到文件中,而非原本的控制台上
  • <:输入重定向
  • 标准流:alt text
    • > 是 1> 的简写 tips:
    • 重定向不能创建目录,只能创建文件

管道

管道符号|可以对命令进行连接 alt text e.g.+

1
grep -n "key" file1.txt | cut -d ":" -f 1
  • cut:
    • -d ":":以":"作为分隔符
    • -f n:取第n块
      • -f n、m
      • -f n-m

Copyright © 2026 CRZ's Blog

Powered by Hexo • Theme Candelas