失眠海峡https://blog.imalan.cn/我要与你坦诚相见http://www.rssboard.org/rss-specificationpython-feedgenlogo.jpg失眠海峡https://blog.imalan.cn/zh-CNSat, 21 Oct 2023 00:44:26 +0800Sat, 21 Oct 2023 00:44:26 +0800Maverick - Go My Own Way.https://blog.imalan.cn/archives/blog-now-powered-by-maverick/<p>首先是在少数派上写一些折腾经验,然后是自己基于 WordPress、Typecho 建站,我在各种网络平台上涂鸦也快三年了。这期间尝试了许多写作、建站工具,深感该领域百花齐放,令人眼花缭乱。很长的一段时间里,我沉浸于给博客程序写主题写插件、使用诸如 CDN 等方式优化网站速度、研究 SEO 玄学,不亦乐乎。</p><p>但终究有些厌倦了。Typecho 这类动态博客程序固然方便,然而自己管理一个服务器确实是负担,而且对图片、内容的管理不甚自由,一旦需要迁移就是噩梦一场;若只是在第三方平台上发表东西,就总觉得互联网上少了属于自己的一亩三分地。</p><p>因此我曾几次把目光转向静态博客。诸如 Hexo、Jekyll 这类静态博客生成器让用户在本地编写 Markdown 文本,再由生成器完成从原始文件到博客网页的转换。某种程度上,这类程序让写作者从维护网站的繁琐中解脱出来,而专注创作本身。MWeb、Gridea 作为博客写作工具时也属于此类。</p><p>然而实践下来,仍然有两个问题没能得到解决:</p><ol> <li>博客源文件的管理问题。想要达到真正的内容与展示分离,就不应该限制源文件的存储方式。现在的生成器要么要求把内容存储到自己的库中,要么要求放在生成器目录下的特定位置,某些甚至对目录结构都有要求。这并不是我想要的;</li> <li>图片等静态资源的处理问题。Markdown 对图片的处理一直都是痛点。我不希望把图片放在任何第三方图床,且不提上传图片-获得外链-插入外链这个过程多么不便,远程图床还有随时跑路的风险;而现在的生成器又不能很好地处理本地图片,至少处理起来并不优雅。</li> </ol> <p>Alan Key 的一句名言,被 Steve Jobs 引用后众人皆知:</p><blockquote> <p>People who are really serious about software should make their own hardware.</p></blockquote> <p>拿来活用,则「任何认真对待博客的人都应该自己写博客系统」。这话说起来固然偏执,但确实为吹毛求疵的人指了一条明路。既然现在的轮子都不满意,那就应该造自己的轮子。本着学习与探索的目的,我使用 Python 自己写了一个静态博客生成器,取名 <strong>Maverick</strong>,开源于 GitHub。它现在正驱动着我的<a href="https://wiki.imalan.cn/">个人 Wiki</a>。</p><p><a href="https://github.com/AlanDecode/Maverick"><strong>项目主页</strong></a> | <a href="https://blog.imalan.cn/"><strong>个人博客</strong></a> | <a href="https://alandecode.github.io/Maverick/"><strong>演示站点</strong></a> | <strong>欢迎反馈与Star</strong></p><p>现在可以说说 Maverick 本身。大致上,它与 Hexo 等相似,都是通过解析 Markdown 文件生成网页。不过我在设计它时考虑到了上文所述的系列问题,并做了针对性的改进。</p><p>首先是 Maverick 对源文件的处理。Maverick <strong>不限制</strong>源文件的存储位置,你可以把文章目录放在电脑上的任何路径下,例如 Dropbox、iCloud Drive,以便备份、同步、版本管理,以及在任何设备上用任何编辑器写作。Maverick 也<strong>不限制</strong>源文件的组织结构,你可以按照你喜欢的方式组织它们,按时间、按类别都可以。</p><p>为了达到这一点,Maverick 通过叫做 <code>source_dir</code> 的选项在指定路径下搜索所有 Markdown 文件,并根据里面提供的信息将它们分门别类,生成日期标签等等。这些内容被称作 <code>frontmatter</code>,也就是使用 Hexo 等写文章时顶部的使用 <code>---</code> 包裹起来的那部分东西。这样的设计让以前的内容可以被复用,也便于以后的迁移。</p><p>此外是对图片的处理。Maverick 允许在 Markdown 文件中引用<strong>任何位置</strong>的图片,并且都能在生成网站时合适地处理它们。若你在原始文本中通过绝对路径或者相对路径引用本地图片,Maverick 会在生成网站时自动寻找它们,并把它们复制到统一的位置,同时修改文章里的引用链接;若通过 URL 引用了远程图片,则(可选地)将它们下载到本地缓存,按本地图片对待。这样处理的好处很多。</p><ul> <li>Typora、VS Code 等软件都支持插入与预览本地图片。尤其是 Typora,本身还提供了插入图片时自动将图片复制到相对文章的某个目录的功能,这与 Maverick 的处理方式十分契合;</li> <li>通过本地缓存,减小了图片丢失的风险。若图床跑路,你还可以在本地找到一份备份,不会影响你发布的内容;</li> <li>虽然目前还没有实现这个功能,但通过本地化以及统一的发布流程,可以实现自动图片处理(例如压缩);</li> <li>可以提前获知图片的大小尺寸等信息,并在网页展示时提供优化的体验(比如图片排版与点击放大)。</li> </ul> <p>而这一切都发生在生成站点时,不会对原本的文章有任何影响,不需要在文章里多加什么标注或者声明。只需要用标准的 Markdown 语法引入图片就好。此外,不论是缓存还是尺寸信息,Maverick 都会在生成时缓存下来,不会反反复复地请求与解析。</p><hr /> <p>除了以上两点改进,Maverick 还自带了一些博客的常用功能,例如 RSS 源生成、<strong>实时搜索</strong>、Sitemap 等。这一切你都可以在<a href="https://alandecode.github.io/Maverick/">示例站点</a>上体验到。目前,Maverick 没有插件机制,但以我自己的体验而言,应该具备了个人博客应有的功能。</p><p>我在 Lepture 开发的 Markdown 解析器 <a href="https://github.com/lepture/mistune">mistune</a> 基础上进行扩展,添加了一些 Markdown 语法,使之能够良好地支持代码高亮、行内脚注、数学公式、图片排版等。</p><p>网页端的展示方面,Maverick 使用自带的主题 Galileo。这是一个比较简洁的主题,以文字阅读体验为重心开发,样式上借鉴了<a href="https://anyway.fm/post/">安妮薇日报</a>与 <a href="https://github.com/probberechts/hexo-theme-cactus">hexo-theme-cactus</a> 的设计。文字排版效果请参见 <a href="https://alandecode.github.io/Maverick/archives/typography/">Typography - Maverick</a>。</p><hr /> <p>总之,我从自己的观察与需求出发,自己写了一款静态博客生成器。本文只覆盖了关于 Maverick 的很小的一部分,欢迎各位移步 <a href="https://github.com/AlanDecode/Maverick">项目主页</a> 阅读完整的说明。</p><p>这是我用 Python 写的第一个像点样的东西,因此不免有些遗漏与错误,任何建议与反馈都十分欢迎。当然 Star 则是特别欢迎😜。</p><p>那么,就这样,感谢各位阅读。周末愉快~</p>hi@imalan.cn (熊猫小A)https://blog.imalan.cn/archives/blog-now-powered-by-maverick/Fri, 13 Dec 2019 11:27:00 +0800Nintendo Switch | 揽件日志https://blog.imalan.cn/archives/nintendo-switch/<p>受 NCP 疫情影响,这个春节十分轻松,也十分无聊。正是尝试新事物的大好时机。</p><p>虽然文章题目已说明我购买了任天堂的游戏主机 Switch,但容我扯远一些。我不玩游戏。若非说玩过,那就只限于魂斗罗、超级玛丽之类;其它主机、PC、手机游戏一概不沾。对我这代人而言,「不玩游戏」这个标签是与「好学生」绑定的,因此对这一点,即使称不上骄傲,我也觉得相当无所谓。</p><p>但到上了大学,我开始觉得有所谓。当室友、同学以及老友们聚在一起讨论王者荣耀、GTA 5、巫师时,自己却在一边插不上话,这种感觉是十分难受的。我清楚地记得一次饭局上,别人说吃完饭一同去「召唤师峡谷」,我不解地问「召唤师峡谷」是哪里,招致一片嘲笑。</p><p>不要误解,我对游戏没有任何偏见。不仅没有偏见,我后来还花了很多时间去了解游戏设计与理念。在不玩游戏的人里,我自认为是很懂游戏的(笑)。</p><p>但终归是纸上谈兵。也有几次尝试玩一玩,比如借来室友的 PS4,玩《神秘海域4》,然而并没有玩下去。手柄、摇杆都非常生疏,这种考验操作的游戏十分劝退。</p><hr /> <p>春节前期沉迷《爱情公寓5》,喜欢上了诸葛大力这个角色及其演员成果。在 Bilibili 冲浪时碰巧看到她玩《健身环大冒险》的视频,突然想起之前也对 Nintendo Switch 这款游戏机产生过兴趣。于是进一步做了做功课。</p><p>任天堂不爱难度超高、画质超好的硬核游戏,更注重游戏性本身,旗下主机是世界闻名的老幼妇孺机,这种理念非常吸引我。Switch 问世之后顺道而来的大量新奇玩法更是 mind-blowing(此处呼叫专业人士 <a href="https://www.velasx.com/">@Zeee</a>)。基于 Joy-Con(Switch 上的可拆卸手柄)体感功能开发的《健身环大冒险》就是其中之一。</p><iframe width="560" height="315" src="https://www.youtube.com/embed/GMCJh9ke4ZA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <p>这款游戏自发售以来一直处于供不应求的状态,价格也是居高不下;受疫情影响,更是<a href="https://www.gamersky.com/zl/column/202002/1261900.shtml">上涨到将近 1200 RMB</a>。我实在受不了憋在家里的无聊生活,最终选择了附近的商家一并买下了主机本体与这款游戏。</p><p>游戏形式以跑酷收集金币为主,战斗是回合式的对战。拿到手尝试之后方觉这游戏绝非过家家,真正是一个移动健身房。根据当前的运动能力设置好难度之后,运动量其实相当大,两三关下来就出汗喘气了。另外游戏也考虑到了均衡锻炼各个部位的需求,身体从上到下都有相应的运动可以练到,总计运动种类有 40 种之多。</p><p>闯关式的游戏本身并没有太多新意,最具创新性的还是腿部绑带与 Ring-Con(游戏附带的一个普拉提环,需要将一只 Joy-Con 插入使用),这两个组件共同检测身体姿态与运动状态并反馈给主机。实际体验下来精度相当不错;曾出现过一次腿部绑带姿态偏差,在设置里校正陀螺仪就好了。</p><p>我在 Switch 上为父母分别创建了账户,晚饭后休息一会儿就一人玩几关,确实十分愉快。这应该是任天堂主机才能带来的快乐吧。</p><hr /> <p>除《健身环大冒险》,我也准备物色一款真正意义上的游戏。最终的选择毫无意外是《塞尔达传说:旷野之息》,直接从在线商店以 499 港币入手了数字版。</p><p>不过上手之初还是让我吃了些苦头。花了大量时间习惯键位、摇杆之后,总算是成功通过了初始台地的三座神庙拿到了滑翔伞,一头扎进了广阔的海拉鲁大地。</p><figure class="pswp-item" style="flex: 88.88888888888889" ><img loading="lazy" width="1280" height="720" src="https://static.imalan.cn/file/image/post/breath-of-the-wild.jpg" /><figcaption>塞尔达传说 · 旷野之息</figcaption></figure><p>很难说我已经完全理解了这款游戏的迷人之处,但惊喜确实在一个接一个地找上门来。射出去的每一支箭都想捡回来,树上结着的每一个苹果都想去摘;荒野上、峭壁上任何闪闪发光的东西都想去一探究竟。路边的石头有点可疑,搬开一看竟然得到一个克洛格果实!在海拉鲁大地上探险,就像是给十四岁的我以无穷的勇气,让好奇心与童心肆无忌惮地释放。经常忘了还有神兽等我解放,还有灾厄盖侬等我讨伐,我只顾在这片原野上流连忘返。</p><p>这款游戏应该能成为我真正的游戏入门作。何等幸运呀。</p><hr /> <p>说回 Switch 这款主机本身。主机 + 掌机二合一的设计在发售前还有质疑声,认为两者皆做 = 两者皆差。但最终都被折服了。得益于任天堂的游戏理念,作为主机的 Switch 并没有在性能上吃什么苦头(评论区纠正可能只有任天堂第一方游戏如此),同样能给硬核玩家提供诸如《旷野之息》之类的优质大作;可拆卸带体感的 Joy-Con 更是提供了无限的可能性,配合特别设计的游戏,Switch 完全可以成为家庭娱乐中心,也是聚会上的优质玩具。作为掌机时体验也相当完整,足够大的屏幕、足够好用的按键与手柄、足够长的续航、通用的 Type-C 接口等等让 Switch 完全能塞满玩家手痒的每一刻。</p><p>如今我相信了,任天堂可能真是世界主宰。</p>hi@imalan.cn (熊猫小A)https://blog.imalan.cn/archives/nintendo-switch/Mon, 10 Feb 2020 20:09:00 +0800当一个小镇青年https://blog.imalan.cn/archives/be-a-young-man-in-town/<p>我从来没有像今年这样待在县城的家里这么久。出生于藏区小镇,长于县城,在四川第二大的城市读高中,在首都念大学。我一直在迁徙,所处的环境越发广阔,所见所闻在变多。然而滑稽的是在此特别的、临近毕业的紧要关头,似乎有意安排似的,我被困在这个小镇。</p><p>关于居家隔离、远程办公已经有很多论述。李如一在《一天世界》播客<a href="https://yitianshijie.net/episodes/79">第七十九期</a>里说:</p><blockquote> <p>……有的人甚至为此(居家隔离办公)寻求心理医生的帮助。我当时一听觉得,哇,那如果这样的话,像我们这样的人不就是病入膏肓了吗?</p></blockquote> <p>李如一口中的「我们这样的人」指的是基本不用到固定办公场所坐班的人。某些职业天生具有远程特性,比如记者、作家、独立开发者等等,这些人已经很适应透过屏幕办公了。但是也正如李如一所说,可能不适应 social distancing 才是正常的,而他那样的人才应该看医生。</p><p>若不是这次疫情,我可能没意识到自己几乎丧失了和家人在同一屋檐下朝夕相处的能力。春节期间我的预测是至多需要在家里住到三月,然后返校。三月 —— 大概就是我和家人互相看不惯的临界点。现在快八月了,我敲下这行字时还坐在家里的餐桌前,听着窗外淅淅沥沥的雨声。</p><p>我和家人几乎已经过了互相讨厌的阶段,进入井水不犯河水的生活模式。我一度纳闷世界上怎么会有到中年还跟父母住在一起的人?我是绝对受不了的。现在明白,也许我才应该看医生。</p><p>身处小镇与身处都市最大的不同是什么呢?也许就是人与人的关系:小镇就是中国,而一群人就是小镇。</p><hr /> <p>这半年来体重跌了不少。母亲总在我耳边说,你看吧,这样的生活适合你,瘦下来健康。但我最清楚体重跌下来的原因。</p><p>体重下跌,来自于不健康的精神状态和健康的生活状态。当我在家办公,我没有必要与任何人打交道,结果便是我不与任何人打交道。而在小镇,拒绝与人打交道是行不通的,只面对自己时,负面情绪就开始蔓延。</p><p>一个重要的人对我说:我觉得你没有很爱自己。后来我明白了,如果我在乎自己觉得重要的人,那我要爱自己,只有这样才有可能维护健康的关系,否则一切都是只存在于脑海里的烟花。</p><p>六月份搞砸了一些事,自己也受了一点不大不小的打击。好在有朋友不离不弃,先是陪我长谈,大骂了我一顿;接着教给我上面这个道理。我逐渐缓过来之后,带着愧疚决定成为更好的人。</p><p>每天六点半准时起床,出门晨跑;晚上在瑜伽垫上做一些力量训练;咖啡、糖都减少摄取;晚上尽量在午夜前睡觉。效果很明显。这些天县城雨季,早上经常下雨,跑步也无从进行。有时蒙头一睡再醒就是九点,我会有点惶恐,感觉自己浪费了一个上午。晨跑确实改变了一些东西。</p><hr /> <p>关于自我认识,我曾经与好几个朋友聊过,但似乎并不是每个人都有类似困扰。仅当理想、见识、能力三者不匹配时,这种苦恼才尤为严重。我在 Twitter 上说:</p><blockquote> <p>...不过我最近的感受是,相比起整天把正义、理想、社会秩序挂在嘴边的人,喜欢吃、关注自身、关注身边事物的人宜人度显著更高。</p></blockquote> <p>但我从不避讳「理想」这个词。大家羞于谈起自己的远大理想和细腻情绪,只顾着说一些不上不下的废话。这是一种逃避,因为你对自己的期望就是你的理想。不去思考理想,那就活得不明不白。只是不可否认:认识自己往往伴随着失望和痛苦。</p><p>去年双十一趁打折买了各色的 DNA 测试,收到报告上赫然写着:「创造力一般」,我大失所望。这样从天而降的定论我可以不服,但某些蛛丝马迹却不得不服。</p><p>在小镇生活的这大半年,我逐渐心安:挂在嘴上的、心心念念的远方,它终究只是远方;眼前可感知的,是楼下面馆,是菜市场喧嚣,是步行街的熙攘。我终究是一个俗不可耐的小镇青年。</p>hi@imalan.cn (熊猫小A)https://blog.imalan.cn/archives/be-a-young-man-in-town/Thu, 30 Jul 2020 20:01:00 +0800倒带贰零贰零https://blog.imalan.cn/archives/2020-rewind/<p>疫情也好,求职也好,毕业也好,获得也好,失去也好,对现在的我而言仅仅是没有实感的一个个词汇。在我身上刻下印记的不是这些节点,而是过程。</p><p>我一直信奉的,要设法体验一切身为人的感觉,今年着实体验了不少。不论是「小镇青年」还是「都市职人」,不过是路径不同而已,该有的挣扎、愤怒、怅然、愉悦、欣喜,一个都不会少的。</p><p>一月份回家过年时我断然想不到今年会这么特殊。跟父母吃饭时多次说起:「若不是这个疫情,我恐怕不会有这么久与家人同住一个屋檐下的机会」。这是实话,尤其是想到过去十五年间我一直与家人聚少离多,这样的机会显得弥足珍贵。即使是身处在关系如此僵硬的家里,我还是能感觉到自己态度逐渐软化,因而才有了上一篇小镇青年的文章。我认真思考过:也许呆在家,留在那个小镇,是我的归宿。</p><p>可我还是打了一场败仗,无奈、激动、期待、紧张地,我还要留在北京。不亲身经历这个阶段,真的很难体会选择的难处。当我向尽力克制失望的父母,向我曾许下承诺的朋友告知我的最终决定时,尤其困难。这是 2020 年我最大的意难平。</p><hr /> <p>八月底返校后几乎只忙于两样事务:毕业与求职,被这两座大山交替爆锤,后期甚至都麻木了。日复一日焦躁不安地写代码、写论文、投简历、笔试、面试,多少有些磨灭斗志。但结果还算好。结束那一刻固然欣喜,但我想这个过程最珍贵的收获不是录用信,而是求职季一同战斗的同伴间的情谊。这甚至称得上是「战友情」。到现在我仍然怀念拖着面试完疲惫的身体,开一瓶烧酒与相同疲惫的朋友一起聊天放松的日子。很多次跟自己说:「拿到这家我就结束秋招!」,想着大致有个工作养活自己就行了。终究还是靠着朋友的激励继续投下去。</p><p>因为听说过太多亲近的朋友甚至是同门师兄弟因为求职时的竞争关系而撕破脸皮的故事,我才十分珍惜能与我互通有无,「串通一气」的同伴。在千万求职大军中,我所认识的不过几十人。若在这样的格局下也要「内卷」,那么眼界实在太小。</p><hr /> <p>这是今年的第二个主题:与人的联系。在学校的最后一个学期,同时也成为了我学生生涯最愉快的一个学期。我所期待的实验室氛围终于建立起来。学术上,真正有意义的学术分享会(不,不是组会)开展起来了,我们有意地不让老师参与,因而可以在分享会上肆无忌惮地提最白痴的问题,争论最琐碎的细节。事实证明这是值得的,不仅是对我,对刚进组的后辈而言更是如此。我一直对进组时无人领路只能自己摸索的事耿耿于怀,这让我无比孤独,走了太多弯路。今年在留学回来的大师兄带领下终于有所改变,我由衷开心。我想,同处一个师门,分享与交流实在是再重要不过了。</p><p>因为争取到了经费,我们屯了大量零食,饮料,以及……酒。与组内同学喝酒撒欢也是今年才有的事。在实验室呆到十点十一点左右,常常心照不宣地一人开一瓶烧酒,坐在一起喝酒聊天。也有过分的时候,比如在公共会议室里喝吐,喝到不省人事。都是太有趣的回忆。</p><p>也是因为认识了,或者说「重新认识了」,许多人。我越来越珍惜身边人,越来越容易与人共情,越来越想做一个有温度的人。拖更博客多少也与我逐渐现充有关。当现实生活令我满足时,我并不太想活在线上。</p><hr /> <p>不久前出去吃饭时与朋友聊天,发现对方与我如此相似,有着几乎相同的困扰。回来后发了一条仅自己可见的微博:</p><blockquote> <p>今天出去喝酒,深聊之后发现一个和我情况(精神状态)和我非常像的人。我感觉很无助,因为自己也没有解决好,帮不了她。想了好久,跟她抱在一起,说我们一起加油吧。 ​​​ ​​​​</p></blockquote> <p>我也许是多虑了,因为对方比我更积极,有寻求相应的帮助。我的话,似乎一直以来也都能自己调节好。</p><p>我相信大部分的焦虑都来自期望与现实的不匹配,所以治本的方法是要搞明白「自己」的位置,并且在认识本质后坦然接受。这真的是太难的一个课题了。</p><hr /> <p>直接新启一个文档,取名「倒带贰零贰零」来为自己的这一年定论,我有些底气不足。太多纵然逝去的想法,太多被时间抹平的情绪。在博客上假死时,我在微博与推特发了许多零星的东西,有琐碎的,也有相对长一些的。我一边翻看这些内容,一边敲出这些字。现在唯有一个想法:</p><p><strong>请往前走,不要在此停留</strong>。</p>hi@imalan.cn (熊猫小A)https://blog.imalan.cn/archives/2020-rewind/Thu, 17 Dec 2020 19:35:00 +0800好耶!是树莓派🍓!https://blog.imalan.cn/archives/raspberry-pi/<p>树莓派的到来实在太令我惊喜。之前和某人聊天时提起过我有想买一个树莓派搭 NAS 的事,说过也就过了,哪曾想她真的记下来,并且背着我火速下单了一套直接寄到刚搬进去的新住处。她以前玩过 Arduino,对树莓派也知道一些,准备和我一起折腾些有趣的东西。</p><p>好,你们可以开始羡慕了😉。</p><figure class="pswp-item" style="flex: 58.64386072083079" ><img loading="lazy" width="1920" height="1637" src="https://static.imalan.cn/file/image/post/rasberry-pi.jpg" /></figure><p>我知道淘宝上的卖家总爱搭配一些良莠不齐的配件一同出售,但是某人深得我心,给我买了主机和全套官方配件,包含已经烧写了官方 Raspbian 系统的 SD 卡。我并不需要图形界面,所以打算使用 Ubuntu Server 作为操作系统,因而只是把 SD 卡插上去开机草草看了一眼 Raspbian 系统长啥样,就直接上 Ubuntu 20.04 了~ 然后一顿操作按照自己的习惯配置好终端环境后,情况大概这样:</p><figure class="pswp-item" style="flex: 69.75867269984917" ><img loading="lazy" width="1850" height="1326" src="https://static.imalan.cn/file/image/post/rpi-terminal.png" /></figure><p>拿到手的是一台树莓派 4B。树莓派本身应该很多人都熟悉了,其实就是一个麻雀虽小五脏俱全的微型电脑。体积非常小巧,也很轻,在这样的身躯下其性能却足够进行一些小型折腾和实验。接口方面,包含 2×Mini-HDMI 接口,2×USB 2.0 接口,2×USB 3.0 接口,音频接口,RJ45 端口,应该说能满足日常的外设需求。此外,这款树莓派主板上提供了 40 个可用于自主扩展的端口,称为 GPIO(general-purpose input/output) 接口,这是树莓派超级强大的一个重要原因。套件中包含一个小风扇,用于散热,就依靠 GPIO 端口工作。</p><figure class="pswp-item" style="flex: 87.0886075949367" ><img loading="lazy" width="2064" height="1185" src="https://static.imalan.cn/file/image/post/rpi-gpio.png" /><figcaption>树莓派 GPIO 接口图</figcaption></figure><p>我按照说明将风扇的三根线分别接到了板子上编号 4(5V power)、6(Ground)、8(GPIO 14) 的三个端口上,风扇顺利启动。然而,这风扇贼吵……而且是常开的,搜了一圈,经过了若干次失败和尝试后终于实现了用 Python 根据 SoC 温度控制风扇启停。代码如下(需要先安装 RPi.GPIO 库)。</p><div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/python3</span> <span class="kn">import</span> <span class="nn">time</span> <span class="k">try</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">RPi.GPIO</span> <span class="k">as</span> <span class="nn">GPIO</span> <span class="k">except</span> <span class="ne">RuntimeError</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error importing RPi.GPIO!&quot;</span><span class="p">)</span> <span class="k">def</span> <span class="nf">cpu_temp</span><span class="p">():</span> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&quot;/sys/class/thermal/thermal_zone0/temp&quot;</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> <span class="k">return</span> <span class="nb">float</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">())</span><span class="o">/</span><span class="mi">1000</span> <span class="k">def</span> <span class="nf">main</span><span class="p">():</span> <span class="n">channel</span> <span class="o">=</span> <span class="mi">14</span> <span class="n">GPIO</span><span class="o">.</span><span class="n">setmode</span><span class="p">(</span><span class="n">GPIO</span><span class="o">.</span><span class="n">BCM</span><span class="p">)</span> <span class="n">GPIO</span><span class="o">.</span><span class="n">setwarnings</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span> <span class="c1"># close air fan first</span> <span class="n">GPIO</span><span class="o">.</span><span class="n">setup</span><span class="p">(</span><span class="n">channel</span><span class="p">,</span> <span class="n">GPIO</span><span class="o">.</span><span class="n">OUT</span><span class="p">,</span> <span class="n">initial</span><span class="o">=</span><span class="n">GPIO</span><span class="o">.</span><span class="n">LOW</span><span class="p">)</span> <span class="n">is_close</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span> <span class="n">temp</span> <span class="o">=</span> <span class="n">cpu_temp</span><span class="p">()</span> <span class="n">output</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">ctime</span><span class="p">()),</span> <span class="nb">str</span><span class="p">(</span><span class="n">temp</span><span class="p">)])</span> <span class="k">if</span> <span class="n">is_close</span><span class="p">:</span> <span class="k">if</span> <span class="n">temp</span> <span class="o">&gt;=</span> <span class="mi">65</span><span class="p">:</span> <span class="n">GPIO</span><span class="o">.</span><span class="n">output</span><span class="p">(</span><span class="n">channel</span><span class="p">,</span> <span class="n">GPIO</span><span class="o">.</span><span class="n">HIGH</span><span class="p">)</span> <span class="n">is_close</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">else</span><span class="p">:</span> <span class="k">if</span> <span class="n">temp</span> <span class="o">&lt;</span> <span class="mi">55</span><span class="p">:</span> <span class="n">GPIO</span><span class="o">.</span><span class="n">output</span><span class="p">(</span><span class="n">channel</span><span class="p">,</span> <span class="n">GPIO</span><span class="o">.</span><span class="n">LOW</span><span class="p">)</span> <span class="n">is_close</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">if</span> <span class="n">is_close</span><span class="p">:</span> <span class="n">output</span> <span class="o">+=</span> <span class="s1">&#39; fan off&#39;</span> <span class="k">else</span><span class="p">:</span> <span class="n">output</span> <span class="o">+=</span> <span class="s1">&#39; fan on&#39;</span> <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;/var/log/autofan.log&#39;</span><span class="p">,</span> <span class="s1">&#39;a+&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> <span class="nb">print</span><span class="p">(</span><span class="n">output</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">f</span><span class="p">)</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span> <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span> <span class="n">main</span><span class="p">()</span> </pre></div> <p>以上代码可以使用 systemd 作为开启自启的服务,然后就不用再管树莓派的温度问题了(发热真的很厉害)。</p><hr /> <p><strong>我宣布,如今我的<a href="https://www.imalan.cn">个人主页</a>、当前这个博客、<a href="https://wiki.imalan.cn">个人Wiki</a> 都由这台树莓派提供服务!</strong></p><p>这是交给它的第一个重大任务。我连夜给它布置好了 LNMP 环境,然后使用 acme.sh 在上面申请好了 SSL 证书。得益于采用 <a href="https://github.com/AlanDecode/Maverick">Maverick</a> 生成我的网站,站点的迁移简单到难以置信:大概就是改动部署脚本中的三个字母。</p><p>这也就是说,以后如果我搬家或者家里断网,这个网站也会跟着挂掉🤣。但是想想吧,这就是早期互联网的样子啊!颇有些文艺复兴的感觉,我很喜欢。</p><p>另外,我在树莓派上插了一块 4T 的硬盘,里面保存了我的多年原始积累,终于实现了我在世界任何角落进行艺术鉴赏的梦想。接下来的打算是让树莓派成为家庭智能中枢,大概包括和智能家居联动、作为 AirPlay 投屏服务器、作为 TimeMachine 备份服务器等等。</p><p>好久没有这种兴奋的感觉了!真好,感觉有无穷的可能性等待探索。我充满了期待。</p>hi@imalan.cn (熊猫小A)https://blog.imalan.cn/archives/raspberry-pi/Sun, 24 Jan 2021 20:13:00 +0800Notion 记账与扩展https://blog.imalan.cn/archives/track-your-expense-with-notion/<p>我第一次尝试记账是本科期间接触 MoneyWiz 时,那时落入了把玩 App 的邪道,重点没有放到记账上;后来使用过很多其他软件,自然是各有优劣,但是均无善终。自毕业开始生活状态和学生时期大不相同,全靠一点微薄薪水养活自己,因而有必要严加管理自己的财务状况。这才重拾记账。</p><p>如果你与我相同,目的是<strong>通过记账搞明白自己的钱花到哪里了,然后根据过往支出修正自己的消费行为</strong>,那这篇文章提到的方法或可作为参考。</p><h2>关于记账</h2> <p>这次我没有直接奔向任何记账软件,而是首先思考了一下「记账」这件事。记账也属于自我量化的一部分,有人记账纯粹是为了了解自己,而别无他求;然而我猜更多人最终目的是想要增加账上余额。想要增加财富,无非开源、节流两种方法。</p><p>先说「开源」,一般来讲普通人的收入可以分为工资、副业、理财收入,但是对我(以及多数学生、初入社会的年轻人)来讲这三者都很固定,并不是可以随意调整的,因此其实没有必要考虑到记账体系中。</p><p>再说说「节流」,这才是记账的用武之地。财务状况一团糟的人最大的问题是「不知道钱花到哪里了」,记账则是通过记录支出,以期搞明白这个问题。但是值得注意的是:<strong>只是记账并不能达成这个目的</strong>,必须要搭配合适的回顾才能搞明白。这就隐含了对记账体系的一个要求:要支持对每笔支出归类,还要有灵活的统计回顾功能,这样才能根据过往支出调整未来支出。</p><p>以 MoneyWiz 为代表的记账软件实在过于繁复,包含了太多我不需要的东西,例如账户体系之类;而我真正想要的功能却缺失或者无法满足我的需求。因此为自己量身定制一个记账系统可能是正道所在。</p><p>接下来我会叙述如何使用 Notion 建立个人账本,并向你展示,它为何简洁、实用而强大。</p><h2>用 Notion 记账</h2> <p>细细想来,我所需要的个人账本其实无比简单。一笔账,最基本的信息莫过于金额、描述、交易时间,这三者是随着支出自然产生的;为了进行统计回顾,还需要再加上一个信息,用来将各种支出归类。</p><p>在 MoneyWiz 中,每笔交易有「交易类别」属性。然而我认为<strong>更合适的支出标记方法不是分类,而是标签</strong>。这两者之间的差别在于分类是唯一的,一笔支出只能属于一个分类;而标签不是唯一的,一笔支出可以被打上若干标签。</p><p>用标签替代分类可以增加许多灵活性。例如咖啡与可乐,按照分类大概是 <code>食品 &gt; 饮料</code>,然而按照标签,则可以是 <code>食品、饮料、咖啡(可乐)、含咖啡因、下午茶</code> 等等。其信息更加丰富,同样的信息量用分类系统实现则会无比麻烦。这样的灵活性能够在日后进行统计分析时带来诸多便利。</p><p>因而,我的账本中每笔支出不过四项信息:<strong>金额、描述、交易日期、交易标签</strong>。</p><p>Notion 提供了一种名为 Database 的模块,如果你也是 Notion 用户,你一定听说过。就如其名,一个 Database 就是一个数据库,以行列组成。一行是一条数据,列则表示了数据的各种信息。Notion Database 的优点在于它强大、灵活又易于使用,</p><p>上述账本使用 Notion 建立,不过是 3 分钟的事情:</p><figure class="pswp-item" style="flex: 72.73333333333333" ><img loading="lazy" width="2182" height="1500" src="https://static.imalan.cn/file/image/post/notion-jizhang/notion-zhangben.png" /><figcaption>Notion 账本</figcaption></figure><p>为易于使用,金额的类型可选择为 Number,交易标签设置为 Multi-select,交易日期则是 Date。</p><p>Notion 在移动设备上使用有些不便,因此我每天固定晚上的某个时间一次性在电脑上录入当天的所有支出,时间粒度以「天」为单位,日常消费没有记也无伤大雅,晚上补上即可。</p><h2>账本回顾与监控</h2> <p>对过往支出进行回顾,规划未来支出,监控当前已经花了多少钱,这样才能真正达到修正消费习惯、节约金钱的目的。这一步非常重要。</p><p>Notion Database 提供的 View 与 Filter 功能在这里大放异彩。View 是数据库的一个视图,Filter 则可以通过设定的条件过滤数据,只显示我们需要了解的数据记录。</p><p>我举一个例子。如果现在想要看看我除一日三餐外,在吃的上花了多少钱,应该怎么做?</p><p>首先,新建一个名为「非三餐食品支出」的 View,并在这个 View 中添加 Filter,设定为:</p> <pre><code> 交易标签 Contains 食 And 交易标签 Does not contain 三餐 </code></pre> <p>也就是过滤出标签包含<code>食</code>但不包含<code>三餐</code>的支出记录。设定好 Filter 后可以看到当前 View 的数据随即更新。</p><figure class="pswp-item" style="flex: 72.73333333333333" ><img loading="lazy" width="2182" height="1500" src="https://static.imalan.cn/file/image/post/notion-jizhang/notion-jizhang-view-full.png" /><figcaption>统计非三餐食品支出</figcaption></figure><p>一览无遗。利用 Filter 可以对支出进行相当灵活的归类筛选,这是 MoneyWiz 等现有记账软件不能实现、不便实现的。这是使用 Notion 的简洁、实用,又不失强大之处。</p><p>更棒的是,由于 Notion 是一个线上服务,基于其 API 可以实现更多有趣、实用的玩法。</p><figure class="pswp-item" style="flex: 94.53781512605042" ><img loading="lazy" width="1125" height="595" src="https://static.imalan.cn/file/image/post/notion-jizhang/notion-api-cost-widget.png" /></figure><p>我通过回顾以往的支出制定了本月的支出限额:总支出最多 ¥6000,非三餐食品支出最多 ¥2000,大额消费(金额高于 ¥150)小于 10 次。我基于开源的 <a href="https://github.com/jamalex/notion-py">Notion API</a> 编写了一个 API,并基于<a href="https://widget.xinxiao.tech/">新小组件</a>实现了一个 iOS 14 小组件,在手机主屏上实时展示我当前的总支出、重点控制支出、大额消费次数及剩余预算,效果如上图所示,也相当不错。</p><h2>结语</h2> <p>以上就是我一个多月以来使用 Notion 进行记账的实践细节。利用 Notion API 进行账目统计的实现目前还比较粗糙,就不开放了;小组件的代码在<a href="https://gist.github.com/AlanDecode/185b13791b451d4416d9564b9d0621b8">这里</a>,如果你安装了新小组件 App 可以一试。但是新小组件目前 bug 很多,请随缘。</p>hi@imalan.cn (熊猫小A)https://blog.imalan.cn/archives/track-your-expense-with-notion/Sun, 21 Feb 2021 12:52:00 +0800再见了,所有的 Evangelionhttps://blog.imalan.cn/archives/goodbye-all-evangelion/<p>惭愧,半年没更新了。一方面是因为生活逐渐丰富起来,很难有学生时代那样大块的空闲时间用来思考和行文;另一方面也是自己觉得「可发表」的阈值有所变高。前者自然是无可奈何,后者则并不一定是好事。事实上后者正是博客这个形态的一个弊端:这样以文章为单位的媒介会自然而然地让作者产生畏惧。我决定把这个畏惧暂时放在脑后,摘录一些发表在微博或推特上的只言片语过来(真的不是凑数的借口😝)。毕竟文本长短都是表达。</p><h2>生活切片</h2> <p>2021.08.14。EVA 最终篇终于有了可供观赏的资源,立刻看了。第一感是:唔,终于结束了。从高中时代至今我等这部最终篇已经等了太多年,自己也从十几岁的少年等成了社畜。从完结篇的角度看,《终》为整个系列画上了很圆满的句号,整部片子的告别意味很浓,大量用了老镜头,最后与每一位角色说再见,甚至是闪过了 TV 版所有标题作为告别,真让人怀念。电影终于交代了一切,从开始的动机到最终的结局。</p><p>或许是庵野真的厌倦了做这个系列,他从旧剧场版开始就一直在告诉观众的是,向前走吧,活在现实中吧,活在当下和未来吧,活在没有 EVA 的世界里吧。这部电影是与角色们,与庵野自己,与所有观众的最后一次促膝长谈。再见了,所有的 Evangelion。</p><figure class="pswp-item" style="flex: 117.93611793611794" ><img loading="lazy" width="1920" height="814" src="https://static.imalan.cn/file/image/post/goodbye-all-evangelion/eva-scene.png" /></figure><hr /> <p>2021.08.12。最近的幸福莫过于下班后和🐦一起吃宵夜看<a href="https://movie.douban.com/subject/33418361/">这部纪录片</a>。那时候屋子里乱乱的,电视直接放在地上。我们横七竖八地趴在地毯上,一边看一边聊一边笑。都觉得二手书,绘本,还有阅读本身都是很棒很棒的东西。</p><hr /> <p>2021.07.29。25岁这一年自己和周遭似乎都经历了天翻地覆的变化,但仔细想想,又似乎一切如旧。但有一点是非常确定的:我正在经历我最好的一段时光。自身的状态不错,也很幸运地有人陪伴身边。与十年前的我相比,最大的收获莫过于逐渐领悟了活在当下、珍惜身边人的重要性,就还蛮开心的。</p><hr /> <p>2021.07.25。回形针,滴滴,再加上这两天网暴失利奥运选手和绑架国产品牌捐款的事件,所谓事不过三,这已经短期内四次让我见识到网民的暴徒本质。</p><p>不论是极端的「爱国」还是极端的「恨国」,极端的右还是极端的左,他们都是同一群人,有同样的丑陋内核。无法开放思想、换位思考的人永远只能陷入自己的世界,输出给外界的只能是肮脏可怖的东西。</p><hr /> <p>2021.07.23。You are what you read 确有其事,如今刷微博也得列入「read」范畴,吞垃圾的风险颇高。故还是建议多摄入些出版物,毕竟两种媒介都是垃圾的可能性要小些。</p><hr /> <p>2021.05.07。我从来不觉得外婆会离去。我还小时她牵着我去河边捡石头,到我长大,她还是在给我做不变的、好吃的卤肉,她好像一直这么老,一直有一双暖和的大大的手,自然也会永远地,在这世上等我回家,等我去看她。</p><p>去年和今年外婆两次病重我恰好都在家,两次我都把她抬上救护车,但两次都挺了过来。我越发觉得,老太太生命力真是顽强,应该还能在世上好久吧。</p><p>但是她越来越瘦,越来越虚弱了。五一假期我回到康定,想去看看外婆住过的老房子,但老房子已不在。我只好站在老房子的位置,呆呆地看着对面不变的山。小时候我就趴在老房子的窗前看着这座山,外婆则会给我端来撒了白糖的油炸土豆丁。</p><p>到新都桥的酒店后我终于情绪失控,忍不住哭了出来。女朋友手足无措,只好默默地抱着我。</p><p>今天父亲来电说外婆刚离世了,我坐在工位上发了好久的呆,然后收拾东西回家。路上我想起几天前回家带女朋友去看外婆,那时她已十分虚弱,神志不清。</p><p>“阿婆!看,这是小江!”</p><p>外婆慢慢地握住女朋友的手,“哦小江啊!小江身体好哇!”</p><p>外婆的旅程到此就是终点,但世界延续,生生不息。</p><h2>精神食粮</h2> <ul> <li><a href="https://book.douban.com/subject/27594566/">《诗翁彼豆故事集》</a>,<a href="https://book.douban.com/subject/30193054/">《神奇的魁地奇球》</a>和<a href="https://book.douban.com/subject/27625554/">《神奇动物在哪里》</a>三本书向麻瓜们介绍了巫师世界的一些有趣知识,尽管其中一些在我们巫师看来是常识了。邓布利多的批注超有趣就是了!</li> <li><a href="https://book.douban.com/subject/34782541/">《从一到无穷大》</a>,花了五六个晚上读完了这本奇书。关于空间与宇宙的两章实在是给我很大的震撼。一本 1947 年的科普书在 2021 年还能给一个勉强算受过现代高等教育的普通青年如此大的触动,内容还不乏最先进、发展最快的科学领域,不得不说真是一个奇迹。虽然书中一些事实数据已经与现在的公认结论有所出入,但人类对基础科学的孜孜以求本身就有无穷的美感。</li> <li><a href="https://book.douban.com/subject/30255659/">《石黑一雄诺贝尔奖获奖演说》</a>,最近一两年很迷石黑一雄,也是多亏了诺贝尔奖,否则我都不知道这人。</li> <li><a href="https://book.douban.com/subject/25982254/">《大萝卜和难挑的鳄梨》,</a><a href="https://book.douban.com/subject/26367364/">《爱吃沙拉的狮子》</a>,周末独自在家适合读村上碎碎念,村上的絮叨也挺好玩的!</li> <li><a href="https://book.douban.com/subject/30400688/">《金银岛》</a>,让我想起了一大堆加勒比海盗的情节,海盗、叛变、寻宝、荒岛这些元素真是一个比一个有吸引力。</li> <li><a href="https://book.douban.com/subject/25803556/">《山本耀司:我投下一枚炸弹》</a>,说实话没咋看明白。</li> <li><a href="https://book.douban.com/subject/26962859/">《美国众神》</a>,可能读得太草率了 主线明白了 支线没理清。我还是适合哈利波特一点。</li> <li><a href="https://book.douban.com/subject/35315153/">《克拉拉与太阳》</a>,本来读完觉得是一本很温柔的书,但看了豆瓣热评我有点不确定了…</li> <li><a href="https://book.douban.com/subject/35277887/">《弃猫》</a>,好短的一篇文章,村上和他父亲的关系好像也引起了一些我的共鸣。</li> <li><a href="https://book.douban.com/subject/35386825/">《离线·共生》</a>,终于收到了离线的新刊,很激动,毕竟是我的科技文艺白月光。</li> <li><a href="https://book.douban.com/subject/35025453/">《失落的卫星》</a>,中亚大地跃然纸上!不过土库曼斯坦的一篇确实让我有点惊讶</li> <li><a href="https://book.douban.com/subject/35251990/">《千万别用Futura》</a>,倒是不知道 Futura 背后有这么故事……</li> <li><a href="https://book.douban.com/subject/35068894/">《一个叫欧维的男人决定去死》</a>,此前是知道电影,这次是读了原著。确实是十分暖心,舒服的故事。读的时候是初春,适合配上一杯热红茶,听<a href="https://music.163.com/#/song?id=605232">这首歌</a>。</li> <li><a href="https://book.douban.com/subject/35365849/">《潮骚》</a>。一本好读的小书,大概花了一个半小时读完,很沉浸的体验。可能也是因为今天的背景音乐总是与故事合拍。平时因为想看的书太多,许多书我都一目十行;但这本书让我不得不逐字逐句地读,细细体会。里面种种描绘实在是太细腻了……伴着窗外的风雨,我好像也身处这个质朴纯粹的歌岛。好喜欢这种能让我感受到辽阔开朗和生命力的作品❤️。</li> </ul> <hr /> <p>好,以上是一些碎碎念,和最近读的一些书。那么,周末愉快,下次再见。</p>hi@imalan.cn (熊猫小A)https://blog.imalan.cn/archives/goodbye-all-evangelion/Sat, 14 Aug 2021 17:26:00 +0800Maverick 的命运https://blog.imalan.cn/archives/the-fate-of-maverick/<p>我在 2019 年 12 月自己写了一个静态博客生成器,名叫 Maverick,使用它实现了我的个人博客完全自主化,一度是我最自豪的作品之一。但它现在久缺维护,似乎已经走到了生命的尽头。</p><p>想来这事很有意思。2016 年前后我开始接触个人博客,从公开的服务(简书,Medium,etc.)到自托管的博客程序(WordPress,Typecho,Hexo,etc.)统统玩了一个遍,最终停留在 Typecho 上,输出了一些内容,也写了一两个还算过得去也有人用的模板和若干插件。到 2019 年达到了一个小高潮:终于决定要自己写一个静态博客程序。</p><p>那时候我刚大四毕业,整天有无穷的精力和时间探索学习。和很多后来被证明是伟大创新的项目一样,我从自己的观察总结出发,写了面向自己需求的 Maverick。我承认,不是没有一瞬间,我希望这个项目被很多人用上,因为它真的解决了我许多需求:比如编写博客时图片引用的问题,比如对许多有用功能(RSS,搜索,图片排版等)的原生实现。事实上我也确实用它作为我的博客引擎直到今年。当 Maverick 第一版问世时,我心想:</p><blockquote> <p>写个静态博客生成器也不是那么难嘛。</p></blockquote> <p>现在再思考这句话,技术上依然是没问题的。一个静态博客生成器要做的无非是解析本地文件,生成对应的 HTML 网页罢了。可是,想写一个「大家都能用的」工具,其难度非凡。</p><p>虽然我时常对友人自夸说,Maverick 用起来可太舒服了,我觉得我是天才,只可惜没人用。后来明白,我至少搞错了两件事情。</p><p>第一,我混淆了「自己需要」和「大家需要」这两件事情。这便是技术人士想做产品的主要陷阱之一。基本功能(模板,插件)支持不全面,但却在一些偏门功能上过度设计,这让 Maverick 并算不上合格的工具。不过,对于一个非科班、没什么经验的学生来说,这些方面的问题是可以原谅,并且也是可以改进的。</p><p>第二,我沉迷在「发布」的快感中,却没有做到长期稳定的迭代与维护。毕竟一个所谓的开源项目,「发布」意味着 star,意味着热闹的评论区,意味着大量的夸赞,最重要的,意味着令人愉快的成就感;而「维护」意味着什么呢?意味着枯燥地修一个又一个的 bug,意味着没有任何背景知识的用户不着边际的反馈,甚至意味着一些没来由的批评与攻击。</p><p>上文中第二点更致命。因为它可以扩展到方方面面,其实说的就是做工作是否有长性,是否扎实。</p><hr /> <p>现在回头看 Maverick 的代码设计,自然是非常糟糕。但我不会觉得羞愧,因为那就是当时的我能做到的最好。但人在进步,Maverick 却还是小孩子的模样,这是我觉得惭愧的地方。现在我忙于工作,更没有时间去维护 Maverick。我大概要归档这个项目了,让它作为我成长过程中的历史资料吧。</p><p>上周末花了些时间,重新写了这个博客的代码,业已上线。这一次一切都变得更加简约,更加面向自己,并且暂时也没有大张旗鼓放出来供大家把玩的意向。我已经认识到,开源不只是开源而已,还有面向用户与社区的责任。这个责任心不是被强加的,而是我认为一个有开源志向的作者应当具备的。</p><p>在这里 shout out to 那些多年坚持维护、更新,或成为整个数字世界基石、或成为每个长情用户心头好的项目:刚过完 30 岁生日的 VIM,可能是被侵权最多的项目 FFmpeg,最近又开始更新的 Typecho... 数不胜数,这个世界因为这些项目变得更好,hopefully,会持续变好。</p>hi@imalan.cn (熊猫小A)https://blog.imalan.cn/archives/the-fate-of-maverick/Wed, 03 Nov 2021 19:57:00 +0800养一只猫https://blog.imalan.cn/archives/live-with-a-cat/<p>今年年初毕业后正式开始了社会人生活。我从小学四年级开始在学校寄宿,算起来集体生活已经过了十六七年,如今和🐦租房,明明只是十几平米的单间也显得空旷。于是时不时和🐦商量,「要不养只猫吧」!</p><p>🐦同样喜欢小动物,也是满口答应。然后我们就盘算着要去网上做做功课,要提前买一些猫猫用品,要怎么样布置家里让猫猫住的舒心……但始终没有迈出去接一只猫回家的这一步。就这么从春天盘算到了冬天。</p><p>这将近一年里眼睁睁看着几个朋友先后养了猫。更有甚者每晚给我发自家小猫的视频,或可爱或顽皮,说是会在每晚跳上床要抱抱,看得我好生羡慕。终于下定决心:养只猫吧!</p><p>于是开始在网上寻找靠谱的猫舍,也向朋友请教经验。我是不介意外貌什么的,但听说品种猫性格会比较好一些,所以比较偏好买一只品种猫;🐦则觉得领养代替购买更好,所以更偏好领养。不过我们都同意,接一只猫猫回家主要还是看缘分的。</p><div class="photoset"><div class="photos"><figure class="pswp-item" style="flex: 50.0" ><img loading="lazy" width="2825" height="2825" src="https://static.imalan.cn/file/image/post/live-with-a-cat/IMG_5973.jpg" /></figure> <figure class="pswp-item" style="flex: 50.0" ><img loading="lazy" width="2994" height="2994" src="https://static.imalan.cn/file/image/post/live-with-a-cat/IMG_6022.JPG" /></figure></div></div><p>缘分很快就来了。某天一个朋友转了篇公众号推送给我,是通州的一只小流浪找领养。说是小流浪,其实也由那时的主人接回去照顾了一段时间,做了驱虫,打了第一针疫苗,也即将绝育。那是个多猫家庭,原住民和这只猫猫相处不是很好,而且原住民患癫痫,不能受刺激,所以才会想为小猫找领养。</p><p>小猫叫豆花,是黄白相间的长毛男生。我俩觉得这机会不可多得,赶紧微信联系,想上门去看看猫,对对眼缘。于是在一个周末,我俩来到了通州。原主人家里暖气过剩,我俩穿着羽绒服戴着口罩,一边冒汗一边尝试接触豆花。豆花在笼子里,似乎有点不领情。听原主人说,豆花很胆小,说不定会对我们哈气,让我们也别介意,可能熟悉了就好了。实际见到豆花,倒没有哈气,但是躲得远远的,不太搭理我们。原主人见我们有点灰心,甚至安慰起来:「面试失败也没关系,养猫还是看缘分的」。</p><p>我俩虽觉得希望不大,不过还是认真考虑了一晚,向原主人回复说我们想领养他。想不到的是原主人说更愿意把豆花交给我们。据原主人说,并不是因为鸟也是个 LO 娘的原因,而是因为别人家里已经有猫猫了,原主人不确定豆花能不能跟原住民好好相处。于是一周后,待豆花做完了绝育,我们把他接回了家。</p><hr /> <p>刚到家的豆花怕得不行,一打开航空箱立刻钻进床底深处,睁大眼睛盯着我们,不出声也不动,不吃不喝。我们一边担心一边觉得惊讶:猫猫怎么能像个雕塑一样,纹丝不动地呆这么久!?</p><p>豆花会在熄灯后悄悄出来探索环境,我俩也被弄得神经紧张。一旦听到床下有个什么动静,我俩大气不敢出,生怕吓到豆花。只能在被子里互相掐对方,意思是:「听!豆花有动作!」就这么到凌晨才睡觉。</p><p><video controls src="https://static.imalan.cn/file/image/post/live-with-a-cat/IMG_5923.mp4"></video></p><p>我们专门买了个监控摄像头,带夜视那种,偷窥豆花。豆花喜欢东闻闻西蹭蹭,也喜欢跳上飘窗看窗外。几天后,虽然还是胆怯,豆花敢在我们睡着或不在家时出来吃东西、喝水了。拉屎倒是到家后第一晚就拉了,会用猫砂盆,拉完会认真埋好,猫砂盆里总是堆起小山。</p><p>向原主人报告豆花近况后,原主人说,豆花能吃能喝我们就可以大胆点试着摸摸他了。豆花胆小,不会打人。我决定试试。</p><figure class="pswp-item" style="flex: 66.66666666666667" ><img loading="lazy" width="4032" height="3024" src="https://static.imalan.cn/file/image/post/live-with-a-cat/IMG_5974.JPG" /></figure><p>我钻进床底。他果真不打人,稍稍躲了一下,就任我摸了。我知道他还是很警觉,随时准备逃走或者反击,也知道这是建立信任的关键一步,于是尽量慢慢温柔地摸他。豆花逐渐放松下来,喉咙里也开始发出呼噜声,我就知道成了。</p><p>后面几天里我维持着不会吓到他的程度和豆花接触,取得了他的信任。现在的豆花已经是会主动走到我脚边躺下,甚至翻身露出肚皮求摸摸的猫猫了。家里添置了猫爬架放在飘窗,如今那是豆花最爱的地方,每天下午固定在猫爬架上晒太阳。晒太阳的豆花很懒,睡得七倒八歪,丝毫不顾形象。</p><p>猫果真是敏感细腻的生物。饲主与猫的关系很难说是主人与奴仆的关系,而我也不全同意是反过来的主子与铲屎官的关系。我更多地悟出了一种相互尊重。猫不曾失去自尊,他有自己对待世界的一套方式,对人亲疏全看人是否友善待他。要和猫好好相处,其中的秘诀之一便是不要强迫猫,慢慢让猫知道他与你的相处是自然而安全的。偶尔试着伸出友好的手接近他,缘分到了他自然也会过来,用毛茸茸的脸蹭蹭你。</p>hi@imalan.cn (熊猫小A)https://blog.imalan.cn/archives/live-with-a-cat/Sun, 05 Dec 2021 15:36:00 +0800Apple TV × NAS | 揽件日志https://blog.imalan.cn/archives/apple-tv-and-synology-ds220plus/<p>空虚的生活需要精致物件填充,甜蜜的消费主义陷阱虽然是陷阱但确实很甜。好久不见,这里是「揽件日志」。</p><p>接近半年时间我都没购入什么大件,少有的上千的物品都是买给猫的(智能猫砂盆,烘猫箱…),甚至 iPhone 13 也忍住没买。过年返京年终奖一发,手里多了点闲钱,实在是没忍住,下手了第六代 Apple TV 和一台 Synology DS220+ NAS,今天就来说说感受。</p><h2>Apple TV: 最「果味儿」的影音体验</h2> <p>设备图片我就不放了哈,自己去<a href="https://www.apple.com/apple-tv-4k/">官网</a>看。一个小黑盒子,和其它电视盒子没啥两样。带一个遥控器,一根 Lightning 线(给遥控器充电)和一根电源线。很简朴。开机,联网,激活,然后就是非常简洁的主界面。苹果主推的 Apple TV+ 和 Apple Fitness+ 占据了屏幕上半部分主要的可视空间,然后下半部分是 App 列表。</p><p>方方面面的细致评测我懒得做懒得说。我说它「果味儿」,主要是三个方面:对 iOS 用户来讲非常熟悉的、流畅的操作逻辑;与其它苹果设备的深度整合;赏心悦目又好用的各种 App。</p><p>举几个例子。不知道大家有没有用过那款 iPod,那个带有 Click Wheel 的经典款?巧了我也没用过,但这次 Apple TV 附带的遥控器让我们有机会体验到那种有趣高效的交互。简单来说,这次的遥控器既有实体的按键,但也是可触控的,你可以在遥控器上面滑动,TV 上相应的焦点也会改变,十分顺滑。苹果甚至在配备了触摸遥控器的机型上修改了键盘布局,由 QWERTY 键盘变成了直接的 26 个字母罗列,想必是对新遥控器的输入速度很有信心。</p><p>流畅的体验不止于此,苹果通过自己的软硬件生态做到了只有它能做到的流畅:Apple TV 是可以用 iPhone 做遥控器的。当与 iPhone 配对之后控制中心会出现一个新按钮,点开就可以完全使用 iPhone 来遥控电视,当然也支持滑动手势,不需要下载什么 App,整合程度很深。另外 TV 上需要输入文字的地方,比如输密码,搜索内容,都可以使用 iPhone 输入。说起来这么自然的方案,第一次用上还是会觉得,啊,舒坦。另外和 HomeKit 的联动,支持 Siri 等等我就不说了。</p><p>App 方面可能见仁见智。因为 Apple TV 没有进入国区,所以是不能用国区的 Apple ID 下载 App 的,爱奇艺、优酷、腾讯等等也只能下载美区商店里的海外版,内容和国内不同。这对许多用户来说是硬伤,但具体到我就觉得还好,一者是我很少看这几个平台的视频,二者还能保底用 AirPlay 投屏。我更关心的如何播放我自己的收藏品,以及看 B 站,这两个需求在 Apple TV 上刚好能很好地解决。</p><p>前者我的选择是 <a href="https://firecore.com/infuse">Infuse</a>,一个横跨苹果所有平台的播放器。它首先实力超群,对各种格式、编码都有很好的支持,基本上解决了所有播放需求;其次颜值非常非常高。TV 端不好截屏,给你们看看 Mac 端的效果,TV 端基本类似。</p><div class="photoset"><div class="photos"><figure class="pswp-item" style="flex: 79.27332782824112" ><img loading="lazy" width="1920" height="1211" src="https://static.imalan.cn/file/image/post/apple-tv-and-synology-ds220plus/infuse-mac-1.png" /></figure> <figure class="pswp-item" style="flex: 79.27332782824112" ><img loading="lazy" width="1920" height="1211" src="https://static.imalan.cn/file/image/post/apple-tv-and-synology-ds220plus/infuse-mac-2.png" /></figure></div></div><p>这些元数据、海报都是 Infuse 自己匹配抓取的,只要文件名稍微符合格式,抓取正确率很高。有些人可能疑惑,用 Emby、Plex 之类的媒体库也能达成相似的效果,为什么不用呢?有这么几点原因:</p><ul> <li>我的文件都存在后文所说的 NAS,通过 SMB 在家里局域网内分享,Infuse 是上手即用的,不需要部署任何别的服务;</li> <li>Infuse 抓取的元数据可以通过 iCloud 同步,我的所有设备都能立刻获得相同的优质体验;</li> <li><strong>Infuse 颜值真的很高</strong>!</li> </ul> <p>后者我的选择是 <a href="https://github.com/Paladinfeng/MiaoProject">MiaoProject</a>,一个 Bilibili 的第三方客户端。它的数据是从电视端的云视听小电视来的,但同样是颜值很高,而且<strong>支持弹幕</strong>,应该是 Apple TV 上最好的 B 站播放器,说不定是所有 TV 端上最好的 B 站播放器。</p><p>虽然很主观也不全面,个人体验 Apple TV 一段时间下来总结起来就是我在推特上说的一句话:</p><blockquote> <p>从小米电视换 Apple TV,让我体会到了当年从安卓换 iPhone 的喜悦。</p></blockquote> <h2>Synology DS220+: 好玩、可靠、自由的文件服务</h2> <p>NAS 是我心水很久的东西,但一直都觉得没什么刚需。在此之前我的数据都存在一块 4T 的移动硬盘里插在树莓派上,通过 SMB 分享到局域网使用。但是近两个月频繁掉盘,我没找到原因(兴许是供电的问题),不安感逐渐增强起来:这可能不是长久之计。</p><p>通过调研、学习、对比之后,我入手了 Synology DS220+ 以及两块 8T 的希捷企业级硬盘,组 SHR(群晖自有的 RAID 方案,可以认为是 RAID 1 与 RAID 5 的加强版)使用,自认为是比较稳定、中长期内够用的配置。NAS 的细节太多,我推荐少数派出品的一本入门手册给大家:<a href="https://sspai.com/series/182">家用 NAS 入门指南</a>,手册是基于群晖 DSM 6.x 的,但是内容仍然有很强的参考性。</p><p>我开始是有点担心买回来吃灰的,因为在我的认知里 NAS 不过就是增加了一个管理面板的 Linux 服务器,顶多是稳定性稍微好一点,这样一来我家里的任何一台电脑都能胜任。到手探索了一段时间后发现群晖基于「存储」这个核心做了很多衍生,完全创造了新的价值。短短几天我就更新了认知:群晖 NAS 给用户提供的是「好玩、自由、可靠的文件服务」。</p><p>「好玩」两部分组成,一是群晖提供的 DSM 系统中集成的大量开箱可用的服务、套件,二是 Docker 支持带来了无限可能性。</p><p>文件共享服务器这个核心功能确实大多数的 Linux 都能做到的,群晖使用的也是 SMB、NFS、AFP 这些标准协议,但群晖 NAS 的优势在于这些服务开箱即用,支持十分全面,免去了很多繁琐的运维工作。基于文件存储的衍生服务才是群晖的独门绝技,这里我主要说的是 Synology Drive,Synology Photos 这两项服务。</p><p>Synology Drive 可以理解为自托管的类似 Dropbox 的服务,它在文件存储的基础上增加了同步、共享、协作等等特性。与 OneDrive、Dropbox 等类似,它也支持将远程存储映射到本地目录,并且官方支持 Windows、Mac、Linux(Ubuntu) 几大平台,对 Geek 相当友好。增量同步是有的,按需同步目前在 Windows 上支持,据官方表示今年 Q2 会上 Mac 平台。Synology Drive 还提供了 Web 界面,可以浏览文件,甚至也支持在网页端创建在线协作文档,就类似于 Google Docs 那种,个人用自必不说,对几人十几人的小团队来说也是堪用的。</p><p>Synology Photos 我还没有体验太多,大致是一套类似于 Google Photos 的服务,也支持基于 AI 的内容识别、照片归类等等。据深度使用过的人说,体验甚至比 Google Photos 更好,因为他不会压缩你的图片,空间限制也就是你的硬盘限制。</p><p>群晖 DSM 上还有很多优质套件,比如 Video Station,Audio Station 等,以及 Nginx,MySQL,PHP 等开发套件,应该是够技术达人们好好把玩一番了。还有一个套件是 Docker,我举两个用例。</p><p>国内环境里,全面使用 NAS 作为个人存储解决方案最大的阻碍只有一个:公网 IP。没有公网 IP 的情况下要从外网访问 NAS 只能走群晖的 QuickConnect,叫「Quick」,其实很不「Quick」。<a href="https://github.com/fatedier/frp">FRP</a> 这样的内网穿透服务使我们可以用一个有公网 IP 的 VPS 作为中转进而访问内网的 NAS。FRP,是可以通过 Docker 容器部署的,在群晖 NAS 上,部署只是点几下鼠标的工作量。基于此,我的 NAS 真正地<strong>随处可用</strong>了,它现在已经完全取代 OneDrive 成为了我所有文件的存取点。</p><p>阿里云盘大家都知道,不限速,资源也逐渐地在多起来。如果能在 Apple TV 上直接串流阿里云盘的内容是不是很美好?可惜阿里云盘并没有 TV 客户端。但是有人基于阿里云盘的 API 开发了<a href="https://github.com/messense/aliyundrive-webdav"> aliyundrive-webdav</a>,可以直接把阿里云盘转换成一个 WebDAV 服务器,同样支持 Docker 部署在 NAS 上,这样在 Apple TV 上通过 Infuse 连上这个 WebDAV 服务器,你的阿里云盘立即就变成了一个巨大的媒体库,可以直接在 TV 上串流播放,爽不爽?</p><p>举这俩例子是想说:DSM 对 Docker 的支持进一步让 NAS 的可玩性变得接近无限。</p><figure class="pswp-item" style="flex: 90.99526066350711" ><img loading="lazy" width="1920" height="1055" src="https://static.imalan.cn/file/image/post/apple-tv-and-synology-ds220plus/dsm-ds220plus.png" /></figure><p>说完了「好玩」,接下来稍微聊聊「可靠」、「自由」。如果钻牛角尖,前者公有云(百度云、阿里云盘之类的)私有云(NAS)都不能完全做到;后者公有云别想了,私有云反倒是有一定可能。</p><p>单纯论数据存储可靠性,我想公有云显然是更强的,毕竟企业级的多副本、灾备措施是本地 NAS 不能及的。这一点上可以通过 RAID 来多少提升一些数据可靠性,目前我的选择是 SHR,一块盘损毁不会丢失数据,算是比较保险的方案,在我的风险承受能力下,我称之为是「可靠」的。</p><p>如果我们把数据主权纳入考虑,会发现公有云陡然多了一层风险:数据审查。我想大家都体验过存在百度云上的视频被夹,那一刻我不知道你是什么感受?一笑了之?我是感到了恐惧与愤怒。数据是我的数据,你天天扫我数据,甚至还直接删除。虽然是监管要求也怪不得你云盘,但我就是不喜欢。谁没有点私密的东西不想让任何第三方知道呢?</p><p>NAS 则让我从这种风险中解脱。数据存在硬盘上,硬盘放在家里。虽然说不上是绝对的安全(毕竟警察也可以没收我的 NAS),但是比起把数据放在某某云盘上可是安心多了。</p><hr /> <p>本期揽件日志就到这里。我们拔高一点,上文的两个物件核心价值都来源于数据:NAS 让我以更稳定、可靠、可用的方式存储数据,Apple TV 则让我以最舒服的方式享受我的部分数据。数据到底多重要?现在,数据就是一切。把数据从公有云上撤下来、尽力保持数据私有,然后借助 NAS 获得不输公有云的可用性与可连接性,这是我当下的决定。</p>hi@imalan.cn (熊猫小A)https://blog.imalan.cn/archives/apple-tv-and-synology-ds220plus/Fri, 18 Mar 2022 17:44:00 +0800