阅读视图

发现新文章,点击刷新页面。
☑️ ☆

如何从零写一个实用的 VS Code 拓展(编辑中)

如何从零写一个实用的 VS Code 拓展(编辑中)

VS Code 是一个实用的编辑器,它拥有强大的扩展生态系统,允许用户自由安装或发布拓展来增强软件的功能。

本文源自个人的需求,围绕一个实用看板工具拓展的开发,详细讲解如何从零编写并发布属于你自己你的 VS Code 拓展。

发掘需求

当你有需求的时候,首先应该先在 VS Code 的拓展商店中查找符合你需求的拓展,而不必重复造轮子。当你发现别人开发的应用都无法符合你的需求、或者缺少你想要的功能,这时候才应该考虑自己开发一个拓展。

在本文的实例中,我想要有一个看板工具,可以一键将我的 Markdown 文档渲染为简洁的看板视图,以此一览当下的所有任务。但是现成的看板相关的拓展,要么源文件不是基于 Markdown 格式的,要么无法做到实时更新看板的预览页面,甚至它们都不够简洁。总之,没有一款能满足我的需求。所以,我打算自己造一个。

搭建框架

开发拓展的第一步,首先要确保 VS Code 和 Node.js 已经安装在本地,随后使用 npm 安装 Yeoman 和 VS Code Extension Generator,快速生成扩展开发的骨架:

npm install -g yo generator-code

安装完成后,运行命令创建新的扩展:

yo code

当提示选择扩展类型时,可以选择“New Extension (TypeScript)”或根据个人偏好选择其他类型。

在自动生成的框架中,有两个比较重要的文件,它们的名字及用途是:

  • src/extension.ts:扩展的主要入口点和逻辑实现。
  • package.json:定义扩展的元数据和依赖。

开发拓展

测试拓展

在 VS Code 中按 F5 即可运行和调试扩展。实例中,在 Debug 窗口打开一个 Markdown 文件,即可测试拓展是否可用于渲染出一个看板页面

打包并发布扩展

打包拓展,需要安装 vsce 工具:

npm install -g vsce

然后使用 vsce package 打包扩展。

(编辑中)

☑️ ☆

机器学习常用的包

机器学习常用的包

在机器学习领域,有许多优秀的库可供研究者和开发者使用。以下推荐一些适合初学者的机器学习的包,它们各具特色,适合不同层次的学习需求和应用场景:

Scikit-learn:初学者的最佳选择

Scikit-learn 是一个开源的机器学习库,适用于 Python。它的特点是简洁的 API、丰富的算法库和易用性,是初学者的理想选择。Scikit-learn 提供了广泛的监督和无监督学习算法,如线性和逻辑回归、决策树、聚类等,同时也支持各种实用的数据变换和模型评估方法。该库的文档详尽,且有大量教程和示例,有助于新手快速上手。

TensorFlow:深度学习的强大工具

TensorFlow 是由 Google 开发的一个开源深度学习框架。不仅适用于研究和开发高级深度学习模型,也适合那些希望将模型部署到生产环境中的用户。TensorFlow 支持多种语言,并提供了丰富的工具和库,比如 TensorBoard,用于模型训练过程中的可视化。虽然 TensorFlow 的学习曲线相对陡峭,但它的灵活性和强大功能使其成为深度学习领域的重要工具之一。

Keras:简化深度学习的高级 API

Keras 是一个开源的神经网络库,旨在简化深度学习模型的构建和实验。它可以作为 TensorFlow、Microsoft Cognitive Toolkit 或 Theano 的高级接口使用,提供了一种更简单、更快速的方式来创建深度学习模型。Keras 的特点是用户友好的 API、模块化和可扩展性。对于希望快速实现和测试新想法的用户来说,Keras 是一个极佳的选择。

PyTorch:研究和快速原型开发的首选

PyTorch 是一个由 Facebook 开发的开源机器学习库,特别适合于研究原型和实验的快速迭代。它提供了强大的 GPU 加速支持和动态神经网络(即计算图可以在运行时动态改变),这使得模型的设计、调试和优化更加直观和灵活。PyTorch 的 API 简洁明了,易于理解和使用。

XGBoost:梯度提升冠军

XGBoost 是一个优化的分布式梯度提升库,专为提升速度和性能而设计。它在许多机器学习和数据科学比赛中表现优异,如 Kaggle 竞赛,被广泛应用于各种回归、分类和排序问题。XGBoost 具有出色的准确性,支持多种语言,易于使用,且能够处理大规模数据。对于追求模型性能和效率的开发者来说,XGBoost 是一个不可或缺的工具。

这五个库各有侧重,从 Scikit-learn 的易用性到 TensorFlow 和 PyTorch 的灵活性,再到 Keras 的快速开发和 XGBoost 的高效性能。选择适合自己的库才是最重要的。

原文地址:https://wiki-power.com/
本篇文章受 CC BY-NC-SA 4.0 协议保护,转载请注明出处。

☑️ ☆

机器学习入门 - 基础流程

机器学习入门 - 基础流程

一般而言,传统的编程是告诉计算机一些数据以及计算规律,让计算机输出结果。当规则制定好之后,对于每一次输入,计算机输出的答案应该也是唯一确定的。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      规则-->传统编程方法;
      数据-->传统编程方法;
      传统编程方法-->答案;

而机器学习的方法,是告诉计算机数据和一部分答案(标签),计算机输出答案与规律。这种方法是从已知答案的数据背后寻找某种规则。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      数据-->机器学习方法;
      部分答案-->机器学习方法;
      机器学习方法-->规则;

机器学习的基本流程大致如下:

数据收集

机器学习就像「神农尝百草」,是一种归纳法(传统编程是演绎法)。而对于归纳法而言,数据是基础,越多越好。数据决定了机器学习的上限,而模型和算法再好,也只是逼近这个上限。

数据预处理

在最初的阶段,需要处理带标签的原始数据,形成用于训练和用于验证的数据集。这一步骤的主要的工作是特征提取和数据清洗。

特征提取是将特征提取出来,作为模型训练的输入。而数据清洗通常的流程有:

  • 去除唯一属性:唯一属性通常是一些 id 编码,这些属性不能刻画样本的分布规律。
  • 处理缺失值:可以选择直接补全缺失值,也可以直接删除含有这个属性的特征。
  • 特征编码:把文字或其他形式的特征转换为数字编码,方便模型处理。比如把 ON/OFF 编码为 1/0.
  • 特征缩放:通过归一化和标准化的手段,将样本属性缩放到某个指定的范围内,避免数量级差异大的属性占据主导地位。

模型的构建和训练

拥有可用的数据集之后,就可以根据需求选择合适的算法模型了。机器学习主要有三种方式:监督学习(Supervised Learning),无监督学习(Unsuoervised learing)和强化学习(RL, Reinforcement Learning)。

  • 监督学习(Supervised Learning):监督意味着已经有标注好的数据集。通过已标注好的数据进行模型训练,从而利用训练好的模型来对新的数据进行预测。监督学习的应用一般分为 回归分类
    • 回归(Regression):预测一个数字,有无限种可能的结果
    • 分类(Classification):预测分类,只有两种或以上的少数选择,是拟合不同类别之间的分界线。
  • 无监督学习(Unsuoervised learing):无需标注数据(有时候人也不知道问题的准确答案),应用一般有 聚类降维异常检测(Anomaly Detection) 这几种:
    • 聚类(Clustering):例如给出一堆图片,把相似的图片划分到一起。
    • 降维(Dimensionality Reduction):数据特征过多、维度过高时,要将数据降到合适的低维空间处理,保留最重要的特征数据。主要算法有主成分分析(PCA, Principal Component Analysis)。
  • 强化学习(Reinforcement Learning, RL):把学习的过程作为一个试探评价的环节,会根据具体的环境得到反馈的强化信号(奖赏/惩罚)。让机器不断尝试,从而得到一种趋利避害的策略,形成一套解决问题的最优解。

我们可以对处理好的数据先做一个顶层的分析,是用监督学习还是无监督模型,问题的类型是属于分类还是回归。在实际选择时,也通常会选用不同的模型进行训练,然后比较输出结果并选择最佳的那个。

模型训练的根本,是找到最合适的权重,以最大限度地进行分类(分类问题中)、或使误差尽量小(回归问题中)。

我们以一个包含权重的公式为例:

\[ y=ax_1+bx_2+cx_3 \]

其中,\(y\) 就是标签,在训练数据集中已经有正确的标注;而 \(x_1, x_2, x_3\) 即特征值。举个实际的例子:

\[ 花的种类=a*花蕊颜色+b*叶子颜色+c*花瓣颜色 \]

在这个阶段的工作,就是通过训练反推出权重 a、b、c,使得这条公式的结果尽量逼近原始输入数据。并且要设定损失函数(Loss Function),设法减小整体误差,实际中常使用均方误差(MSE, Mean Squared Error)来计算损失函数的误差。

模型评估

在上一个阶段把误差降到足够小后即可停止训练,用预处理后的测试数据集来验证模型效果。

预测

在上个阶段模型达到了预期的准确率和覆盖率(召回率)之后,就可以把模型拿来实际使用了。


入门机器学习要两手抓,一方面是算法基础,另一方面是代码练习。这样才能在学习中巩固,把理论基础转化为实际用途。

下一篇文章我们先介绍机器学习环境的配置。


参考与致谢

  • Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition (https://github.com/ageron/handson-ml3)
  • 《程序员的 AI 书:从代码开始》
  • 《AI 制胜:机器学习极简入门》
☑️ ☆

机器学习入门 - 环境搭建

机器学习入门 - 环境搭建

Anaconda 环境

我们选择使用 Anaconda 来配置在机器学习的环境。一方面其添加了许多常用的数据科学的包如 Numpy、TensorFlow 等,也包含了它们所依赖的更多模组;另一方面它能更方便地管理和切换运行环境。用一句话说,Anaconda 就是一个一站式的数据科学编程环境。

Anaconda 的下载:https://www.anaconda.com/download

安装完成后,如何开始呢?你可以看这个官方课程,一步步入手:Get Started with Anaconda,也可也直接参考以下的简明步骤开始。

当安装完成后,可以在 Anaconda Prompt 命令行界面,输入命令 conda list 验证其安装状况以及内置的包列表。

官方推荐创建一个虚拟环境,这样如果玩坏了可以直接换一个,不必重新卸载安装:

conda create --name NEW_ENV_NAME
conda activate NEW_ENV_NAME

conda 默认的 channel 是 defaults,但这个 channel 的代码包不全,所以将其更换为 conda-forge:

conda config --add channels conda-forge

接着,在这个虚拟环境里安装一些常用的包:

conda install jupyterlab rich faker chime schedule pandas scikit-learn

最后,启动 JupyterLab:

jupyter lab

scikit-learn 机器学习工具包

接下来的文章,将使用 scikit-learn 入门机器学习。scikit-learn(sklearn)包含了分类、回归、降维、聚类等基础常用的机器学习算法,也包含了特征提取、数据处理、模型评估等模块,适合入门。

参考与致谢

☑️ ☆

机器学习入门 - 基础流程

机器学习入门 - 基础流程

一般而言,传统的编程是告诉计算机一些数据以及计算规律,让计算机输出结果。当规则制定好之后,对于每一次输入,计算机输出的答案应该也是唯一确定的。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      规则-->传统编程方法;
      数据-->传统编程方法;
      传统编程方法-->答案;

而机器学习的方法,是告诉计算机数据和一部分答案(标签),计算机输出答案与规律。这种方法是从已知答案的数据背后寻找某种规则。

flowchart LR
  classDef default fill:#fff,stroke:#000,stroke-width:2px,font-size:16px,fill: white
      数据-->机器学习方法;
      部分答案-->机器学习方法;
      机器学习方法-->规则;

机器学习的基本流程大致如下:

数据收集

机器学习就像「神农尝百草」,是一种归纳法(传统编程是演绎法)。而对于归纳法而言,数据是基础,越多越好。数据决定了机器学习的上限,而模型和算法再好,也只是逼近这个上限。

数据预处理

在最初的阶段,需要处理带标签的原始数据,形成用于训练和用于验证的数据集。这一步骤的主要的工作是特征提取和数据清洗。

特征提取是将特征提取出来,作为模型训练的输入。而数据清洗通常的流程有:

  • 去除唯一属性:唯一属性通常是一些 id 编码,这些属性不能刻画样本的分布规律。
  • 处理缺失值:可以选择直接补全缺失值,也可以直接删除含有这个属性的特征。
  • 特征编码:把文字或其他形式的特征转换为数字编码,方便模型处理。比如把 ON/OFF 编码为 1/0.
  • 特征缩放:通过归一化和标准化的手段,将样本属性缩放到某个指定的范围内,避免数量级差异大的属性占据主导地位。

模型的构建和训练

拥有可用的数据集之后,就可以根据需求选择合适的算法模型了。机器学习主要有三种方式:监督学习(Supervised Learning),无监督学习(Unsuoervised learing)和强化学习(RL, Reinforcement Learning)。

  • 监督学习(Supervised Learning):监督意味着已经有标注好的数据集。通过已标注好的数据进行模型训练,从而利用训练好的模型来对新的数据进行预测。监督学习的应用一般分为 回归分类
    • 回归(Regression):预测一个数字,有无限种可能的结果
    • 分类(Classification):预测分类,只有两种或以上的少数选择,是拟合不同类别之间的分界线。
  • 无监督学习(Unsuoervised learing):无需标注数据(有时候人也不知道问题的准确答案),应用一般有 聚类降维异常检测(Anomaly Detection) 这几种:
    • 聚类(Clustering):例如给出一堆图片,把相似的图片划分到一起。
    • 降维(Dimensionality Reduction):数据特征过多、维度过高时,要将数据降到合适的低维空间处理,保留最重要的特征数据。主要算法有主成分分析(PCA, Principal Component Analysis)。
  • 强化学习(Reinforcement Learning, RL):把学习的过程作为一个试探评价的环节,会根据具体的环境得到反馈的强化信号(奖赏/惩罚)。让机器不断尝试,从而得到一种趋利避害的策略,形成一套解决问题的最优解。

我们可以对处理好的数据先做一个顶层的分析,是用监督学习还是无监督模型,问题的类型是属于分类还是回归。在实际选择时,也通常会选用不同的模型进行训练,然后比较输出结果并选择最佳的那个。

模型训练的根本,是找到最合适的权重,以最大限度地进行分类(分类问题中)、或使误差尽量小(回归问题中)。

我们以一个包含权重的公式为例:

\[ y=ax_1+bx_2+cx_3 \]

其中,\(y\) 就是标签,在训练数据集中已经有正确的标注;而 \(x_1, x_2, x_3\) 即特征值。举个实际的例子:

\[ 花的种类=a*花蕊颜色+b*叶子颜色+c*花瓣颜色 \]

在这个阶段的工作,就是通过训练反推出权重 a、b、c,使得这条公式的结果尽量逼近原始输入数据。并且要设定损失函数(Loss Function),设法减小整体误差,实际中常使用均方误差(MSE, Mean Squared Error)来计算损失函数的误差。

模型评估

在上一个阶段把误差降到足够小后即可停止训练,用预处理后的测试数据集来验证模型效果。

预测

在上个阶段模型达到了预期的准确率和覆盖率(召回率)之后,就可以把模型拿来实际使用了。


入门机器学习要两手抓,一方面是算法基础,另一方面是代码练习。这样才能在学习中巩固,把理论基础转化为实际用途。

下一篇文章我们先介绍机器学习环境的配置。


参考与致谢

  • Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 3rd Edition (https://github.com/ageron/handson-ml3)
  • 《程序员的 AI 书:从代码开始》
  • 《AI 制胜:机器学习极简入门》
☑️ ☆

如何不长痘

最近因为吃了一顿麦当劳上火感冒了,在养病的几天里,我发现脸上的痘渐渐消了,而且也没有新长痘。

之前小发也跟我讨论过,于是我想了想,大概是这几个原因:

  • 足够睡眠、不熬夜。在那几天里,我每天晚上十一点半睡,早上七八点醒。
  • 饮食清淡。那几天吃的都很清单,基本上都是汤面、汤饭,也不吃辣,不吃冷饮雪糕,所以一点儿上火或生寒的元素都不存在。

一直到现在我都保持着这些做法,所以到现在也不怎么长痘。

一旦知道自己没长痘,整个人就精神多了,待人接物也自信了许多。这也反过来督促自己该早睡早起、饮食清淡。这是一个积极的正向循环,希望我能坚持下去。

☑️ ☆

买了一台 NAS

我从闲鱼代理买了一台 DS220+。直接原因是因为,Google Photos 从六月以后取消了无限上传额度,且我也慢慢意识到,把从小到大整整几百个 G 的照片,都托付给垄断公司,是非常不保险的做法。甚至可以说,只要他们想,是可以找个借口,把用户数据丢掉的。

不仅仅是照片,项目仓库、音乐、电影等等,我都急切需要一个反脆弱的数据存放方式。

「让我的数字资产比我活得更久。」这是我的目标。

最开始,我仅仅是把数据存在电脑单一硬盘上,但如果不巧碰上硬盘坏了无法修复,或者往极端点想,电脑被偷了,那数据就永远丢失了。大多数人会想到这个问题,并选择冷备份的办法。但是我们都知道,数据是不断更新的,冷备份有周期性,一旦在备份开始前发生意外,那么这一个周期的数据(甚至恰好有关键数据)也是找不回来的。而且这种办法非常不 geek,繁琐的流程应该交给机器来解决。

后来我尝试用各种局域网 sync 工具和 git 的方法,但前者方案并不完善,而 git 虽然安全可靠,但不适合处理非二进制的大文件(所以我现在仅仅用 git 来处理项目仓库)。

所以我索性上了白群晖,NAS 本地储存 + Cloud Sync 加密上传各大网盘,一步到位。而群晖的 Photos 套件,跟 Google Photos 的用户习惯相差无几,不难入手。

数据的迁移还是挺花时间的,需要有耐心。这星期内我也会出炉一篇文章,讲讲我是如何「永久」保存数据的。

☑️ ☆

为什么要抵制智能推荐算法

我认为,对人工智能的恐惧,大多数情况下,就是对资本主义的恐惧。我们担心资本主义将如何通过技术来利用我们。
现在,技术与资本主义息息相关,已经很难区分两者了。

-- Ted Chiang,美国科幻小说作家

☑️ ☆

关于新能源行业的一些观点

其实在互联网工作了这么多年,各个巨头无非都在抢一个东西 —— 流量入口,车是未来的流量入口,互联网公司争抢造车这块市场也无非是这个原因。

在我看来,未来 3-5 年之内,新造车的战局就会稳定下来,到时候国内应该会有 1-2 家特别大的新能源车公司,就像之前的大众集团一样,吃掉大部分的市场,就像当年的美团、滴滴一样。

其实造车行业在各个行业吸了很多血,包括金融、互联网以及其他行业,人、财、物都往这个行业聚拢,洗牌之后可能并不需要这么多的从业人员。人是会跟着行业趋势走的,如果这个行业洗牌后依然能保持不错的增长,我会在这个行业工作比较长的时间。

☑️ ☆

内卷与未来的职业趋势

经济不景气,更有利于早点去朝阳行业。

早早去站位,早早去占坑。

本科生去了,几年后,就会发现,读研的同学还没有你混的好。

内卷,是无意义的做功。

一群人在无意义的做功,我们只要找到新方向的风口,过去占位。

占位,不卷。等到占稳了位置,就会有人卷过来。

到时候门槛水涨船高,但进入的早,便能卡住位置。

熟悉历史规律,自然能够找到合理的策略。

就像是在历史上,历次大萧条后,都会出现的洗牌。

对普通人来说,这恰恰是珍贵的机会。

—— 「立华说」

☑️ ☆

RoboMaster 赛后随笔

终于是打完比赛了,今年的成绩较前两年有突破,从南部赛区打进了国赛。但也仅仅是止步于国赛。

今年的问题在于硬实力。战术只能弥补一定的实力差距,带我们进国赛。但若说机器人在场上的基本功能都不能保证,那么无论多好的战术,都是弥补不来的。

最后一场打北科大,可以称得上是终局之战了。一号英雄被击毁,二号工程图传过热抓瞎,三号步兵翻车,五号步兵不能动,哨兵被摧毁,飞镖已打出但没击中前哨战。在操作间里,我们已经知道比赛无望了,所以尝试让四号步兵飞坡,结果也翻车了。最后一分钟金钱到位,只能启动无人机当哨兵用,倒是将敌方击退并造成两百多伤害(自瞄稳健)。无人机打完所有弹丸之后,也无力回天了。

还记得打川大那一局,本来第一局已经输了,但后来却扳回两局。他们三局的飞镖全都打中前哨战,到后来我们完全放弃守塔了。不过最后还是靠着地面推进,硬是赢回了比赛。

希望能一年比一年好吧。

☑️ ⭐

8 月深圳小记

8 月 28 日的午后,我来到车站等候回学校的火车。转眼间 8 月匆匆过去,我决定记录在深圳的这一个月。

月初,在 RM 比赛因疫情延期了两个月之后,我们的队伍终于来到了深圳。这是我第一次踏上赛场(去年因疫情变成了线上赛),在比赛中有幸作为云台手进入操作间,淋漓尽致地体验了一回比赛的氛围。

刚来到赛场的前两天,我们的准备完全不充分,在适应性训练和第一场比赛之中,各兵种机器人都遇到了大大小小的问题。不过,在接踵而至的比赛中,我们且战且进,逐渐适应了比赛的节奏。也感谢技术组的队员们,在团队士气最低落的时刻,依然默默坚守,修复机器人的各种问题。

小组赛,击败重庆理工和厦门理工后,却与福建工程学院打平,使我们非常被动地去迎战四川大学。在前年的比赛中,我们输给川大,从而无缘国赛。第一局,我们非常没有信心。川大的飞镖一开局就拆掉了我们的前哨战,而高佬的步兵下坎一急就翻车了,我们只能硬撑着局面。虽然第一小局输了,但坤坤发现,似乎我们少一台步兵,却勉强还能打得过。第二局开始了,我看着雷达的画面,十分焦虑,于是在麦克风里对大家说,我们要记住,我们是没有前哨战的,破釜沉舟,背水一战才有可能赢(事实上,三局对面的飞镖都把我们前哨战给拆掉了……)。川大虽然有飞镖这个杀器,但他们的地面单位没有战术配合。于是,我们根据演练了三个多月的战术配合,逐个击破。第二局的扳回,我们信心大增,在第三局的决战中,我们稳中求进,拿下了国赛的门票。

国赛无弱队,我们最终止步于国赛二等的奖项,只能期待明年下一届的比赛了。

打完了比赛,我就拖着行李箱往公司去了。读初中的时候,我开始接触单片机,Seeed 和柴火创客空间于我而言,一直是写在未来的愿望清单上的。

在这里的每一天都充满成就感,因为工作的内容就是兴趣所在,而且还能与优秀的伙伴们一起共事,这实在是一种享受。

在深圳的内卷的大环境下,生活仍然可以有甜点。偶然去了福田市中心的酒展,虽然酒一般般,但还是挺开心的:

周末午后书店的柠檬茶和苏打水:

终于与来深圳打工的朋友们聚了一回,晚上的啤酒搭烧烤还挺不错:

有天下班去地铁站的路上,一片晚霞搭起了一座虹桥,我才发现很久没有抬头仰望过天空了。

8 月底,开学了,接下来该何去何从呢?
回想起在赛场上喊得震天的口号,「脚踏实地,仰望星空」,我已经有了答案。

☑️ ☆

当下与永恒

当年,古罗马人在宏伟华丽的浴宫中吹着口哨,认为帝国就像身下的浴池一样,建在整块花岗岩上,将永世延续。

现在人们知道,没有不散的宴席,一切都有个尽头。

—— 刘慈欣《三体 Ⅲ·死神永生》

置身于浓厚的节日气氛里,看着身边欢乐的人们,我也不禁被融入其中。

「如果每一天都能如此快乐就好了」。但仔细一想,如果每天都一样地快乐着,那还能称之为快乐吗?先前读过一段话,「快乐是生活的点缀,无聊和痛苦才是生活的本质」。

远看到人的一生,生命之于宇宙的刻度,是尤其短暂的。如果可以永生,那活着的每天,还会有新鲜感吗?

经历过无聊和痛苦,才能明白快乐的来之不易;人知道生命会有终将逝去的一天,才会去珍惜在这个世界上的每一天。

如何把有限的生命,刻进永恒的宇宙维度,这是我一直在追寻的谜题。

不过,尚存一点我们可以把握的,是去珍惜身边的美好,珍惜你所爱的人,别待失去才追悔。

预祝中秋快乐~

一杯敬明天 一杯敬過往
支撐我的身體 厚重了肩膀
雖然從不相信所謂山高水長
人生苦短何必念念不忘

一杯敬自由 一杯敬死亡
寬恕我的平凡 驅散了迷惘
好吧天亮之後總是潦草離場
清醒的人最荒唐
…… —— 毛不易《消愁》

☑️ ☆

雨下了四年十一个月零两天。间或有细雨绵绵的日子,一开始人人都还身着盛装,带着久病初愈的神情预备庆祝天晴,但很快便习惯了将这些间歇当作滂沱重现的前奏。

🎵Who'll Stop the Rain🎵

那是最昌明的时世,那是最衰微的时世;
那是睿智开化的岁月,那是混沌蒙昧的岁月;
那是信仰笃诚的年代,那是疑云重重的年代;
那是阳光灿烂的季节,那是长夜晦暗的季节;
那是欣欣向荣的春天,那是死气沉沉的冬天;
我们眼前无所不有,我们眼前一无所有。

每天早晨,太阳升上地平线,爬到最高点再回落,这一天就宣告结束,为下一天让路。

大低谷纪念碑是纪念大低谷的建筑群,是一只只从沙漠中向上伸展的枯树干般的手,其都对着天空做出各种扭曲的姿态。
在雕塑群的边缘,罗辑看到了一块肃穆的方碑,上面刻着一行金色的大字:
给岁月以文明,而不是给文明以岁月。

在疫情汹涌而至前的岁月,大家的目光都向着前方;居家办公的日子里,外面的世界似乎愈发向着低谷在塌陷,瘟疫、战争的阴霾挥之不去,天启四骑士正逐一降临,巴别塔一次次被推倒。在人类漫长的历史岁月里,和平、开放、富足的年代是短暂的、火花一般闪耀了一下,随即跌入漫漫长夜之中。

白昼之光,岂知夜色之深。

危机出现后的一个世纪,曾经在黄金时代生活过的人们都离开了人世。……这个时代在今后一直被人不断地回忆,经历过这段美好岁月的老人像反刍动物似的不断把那段记忆吐出来,甜蜜地咀嚼,最后总是加上一句:「唉,那时咋就不懂得珍惜呢?」而听他们讲述的年轻人目光中充满嫉妒,同时也将信将疑:那神话般的和平、繁荣和幸福,那世外桃源般的无忧无虑,是否真的存在过。

假如某些相当偶然的事件发生,就会很容易就被视为传统,因而再也无法打破,或者几乎牢不可破。

Long as I remember the rain been comin' down
Clouds of mystery pourin' confusion on the ground
Good men through the ages tryin' to find the sun
And I wonder, still I wonder, who'll stop the rain?
I went down Virginia, seekin' shelter from the storm
Caught up in the fable, I watched the tower grow
Five Year Plans and New Deals, wrapped in golden chains
And I wonder, still I wonder, who'll stop the rain?
Heard the singers playin', how we cheered for more
The crowd had rushed together, tryin' to keep warm
Still the rain kept pourin', fallin' on my ears
And I wonder, still I wonder, who'll stop the rain?

☑️ ☆

现代都市与末日田园

🎵Nowwhere Man🎵

He's a real nowhere man,
Sitting in his nowhere land,
Making all his nowhere plans for nobody.

Doesn't have a point of view,
Knows not where he's going to,
Isn't he a bit like you and me?

现代都市能解决你的大部分需求:

  • 饿了?去楼下全家买个饭团填饱肚子,或者干脆下馆子
  • 想消费?走几步就能逛 mall
  • 出行?地铁公交网约车能带你去任何地方
  • 生病了?药店医院也不少

在赛博空间里也是一样的。微信、网易云音乐、淘宝……新时代的人们,能够随时享受到它们带来的便利。

曾几何时,我们以为它们是永恒的,不会对我们关闭入场权限,至少也不应该那么突然。

当下载的音乐因版权无法收听,当聊天与文字因敏感而被屏蔽,当现代都市因封锁而休克。我们开始意识到,面对它们的强势,我们是十分被动的。

于是,我们只能开始开垦自己的末日田园。「深挖洞,广积粮」,以末日生存的标准来做灾备,即使这样做会失去很多便利性。

自建博客、导航站、书库、音乐影视库、使用 RSS 订阅与播客,使用 NAS 进行分布式储存备份。

虽然我们尚未有条件去构筑现实世界的末日田园,但是至少可以在赛博空间内先实验一番,首先让精神得到安抚。

文明像一场五千年的狂奔,不断的进步推动着更快的进步,无数的奇迹催生出更大的奇迹,人类似乎拥有了神一般的力量……但最后发现,真正的力量在时间手里,留下脚印比创造世界更难,在这文明的尽头,他们也只能做远古的婴儿时代做过的事:把字刻在石头上。

☑️ ☆

硬件行业趋势与个人的选择

对硬件行业的一些观点

供需关系不匹配

我们的教育培养了一种不太正确的思维方式,认为难的东西就更值钱。其实现实中并非如此。一个东西的价格主要是由供需关系决定的。供不应求价格就会上涨,供大于求价格就会下跌。

一个职位的工资高低并不取决于该职位的技术难度,而是取决于该职位的市场价值。而市场价值又是由市场需求来决定。

一个人的技能是否值钱和这个技能的难度是没有一丁点关系的,只和市场需求有关系。市面上如果需要 100000 个熟练前端,但是只能培养出 5000 个熟练前端,这些人的薪资当然高了。反之,如果全中国每年只需要 20 个做编译器的软件工程师,但是每年光做编译器的博士研究生都有 30 个毕业的话。那些本科生是一丁点机会都没有的,无论你在大学四年中学了多么难且艰深的理论,连免费实习的机会都没有,别人嫌你浪费电。

作为基础设施的硬件行业,其本身的发展需要依赖于实实在在的基础科学与工程技术,与业务关联性没有很强,所以其更新换代的速度就没有那么快,也就限制了从业人员需求的增长。所以,即使某些硬件工程的门槛高,也架不住需要的人少呀。

扩张边际效益低、试错成本高、产品开发周期长

对于实体制造业,每扩张一倍,就意味着与之对应的其他各项成本(包括人力成本,机器成本,土地成本等等)至少也要扩张一倍,考虑到效率的因素,扩张的边际成本甚至是在增加的。而且这个过程需要大量的时间准备。

芯片器件集成度变高

芯片厂家的生态、参考设计越来越成熟,应用开发的门槛越来越低。

板级硬件现在都只剩抄抄图,看看芯片说明书。芯片说明书甚至帮你把外围电路都说了个七七八八。只需要一个高级的拼装工。

至于为什么需求这么小,前面也提到了,板级硬件技术发展了这么多年,很多东西都集成化,模块化了,没有硬件工程师发挥创造的舞台了,招一个牛逼的和一般的差不了太多。尤其在联发科创造的 turnkey 解决方案推动下,几乎所有的芯片原厂都会提供全套参考设计,也就是可以抄作业,抄好作业甚至还可以请芯片原厂检查一下作业。一旦作业完成之后,硬件工程师的活就剩下日常打杂,失效分析,产线故障处理,配合软件调试软件之类,再也没有设计与创作的空间。一个产品上市如果需要持续的硬件设计改进,说明这个产品的硬件设计一开始就是一坨屎,这种事情是绝对不允许发生的。而对软件而言,无论什么阶段,都可以持续改进,提高创新。说不定,还能引出一点新问题出来,大不了后续来个 OTA 升级修复就得了,可这些工作都需要人去干吧,需要软件去干吧。

职业发展选择

硬件工程师虽然待遇低,但公司与公司之间差距也是很大的。待遇按供应链分,欧美芯片原厂 > 国内芯片厂(包括台湾省)> OEM&ODM 终端厂 > 方案公司。所以,在跳槽的时候,尽量从右往左跳,工资待遇和技术竞争力会越来越好。凡事都有例外,像 OPPO/VIVO 这样的终端厂硬件待遇长期碾压芯片原厂,但我仍然建议一个硬件工程师至少有一段在芯片原厂的工作经历,以夯实技术,丰富经验,拓展视野,这只有原厂才能给你的,终端厂是给不了。然后再居高临下,傲视天下的姿态下嫁到有钱的终端厂,才是一个完美的结局。

基于以上各家的观点,我们能够得出来的结论是:如果还没入行,快逃,逃往嵌入式软件或纯软件领域;如果已经入行,往上游走,往原厂走,往硬件领域最核心的地方谋发展。

参考与致谢

☑️ ☆

星夜漫游

🎵Sgt. Peppers Lonely Hearts Club Band🎵

当我踏出实验室时,已是午夜时分。

跨上驾驶位,点火。披头士的 Sgt. Peppers Lonely Hearts Club Band 如同热浪一般,从音响中喷涌而出。好久没回顾经典摇滚了,我想,就接着听这部专辑吧。

最开始喜欢上这首富有张力的摇滚,是源自披头士波普风格的动画 Yellow Submarine. 经典从未消逝,在一次又一次的演绎中得以重生。

Yellow Submarine is the tenth studio album by English rock band the Beatles, released on 13 January 1969 in the United States and on 17 January in the United Kingdom. It was issued as the soundtrack to the animated film of the same name, which premiered in London in July 1968. The album contains six songs by the Beatles, including four new songs and the previously released "Yellow Submarine" and "All You Need Is Love". The remainder of the album is a re-recording of the film's orchestral soundtrack by the band's producer, George Martin.

游弋在城市快速路上,四下空无一人,震耳欲聋的音乐灌满了整个车舱。我置身于自己的黄色潜水艇中,一边琢磨着星空与月夜。或许在百万年前,这片土地也曾是深不可测的海洋。我心无旁骛,发现舱外逐渐现出寒武纪的三叶虫,三叠纪的长颈龙,头顶还有蓝鲸的庞大身影。它们呈半透明态,泛着荧光。它们丝毫不受惊扰,仿佛这片海洋就是自己的常驻之地。

一只胭脂色的水母朝我游过来。虽然我也在漫游,但它仍随我而动,游动姿态是那么的优雅。我很想把手伸出窗外触摸它,但却不想破坏了这般奇幻的美景。鲨鱼在不远处捕食一头海龟,自然的规律一直都存在于曾经或正生存在地球的生物上,人类创造的文明也仅仅是块遮羞布。

云层重新散开,月光再次漫无目的地洒落,夜色寂静如空。 没有鱼群,没有海洋,我恍过神来,到家了。 唯留下清澈的夜空,月明,星稀。

☑️ ☆

探索之路 - 2022 小记

2022 年转眼即逝,有趣之事蛮多,挑一些记录下来吧。

在专业领域的探索

2022 年,我在自己的专业领域 - 硬件与嵌入式的基础上,在射频、信号完整性、电源、半导体 ATE 等领域有了新的探索。也画了很多很多的电路板,焊接了数不清的元件。

在我的知识库体系下,各个分类的知识也在蓬勃增长着。

重新思考未来的方向

在职业生涯的路上,我看到供需关系不匹配、扩张边际效益低、试错成本高、开发周期长这一系列的问题,正压缩着硬件解决方案从业者的天花板。

认真调研了一番,我发现往上游的路似乎更好走。

一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程。

正值半导体行业火热,我决定去试试。于是,我离开了实习的公司。诚然,在 2022 年末看,半导体行业虽然会受经济传导到消费电子市场的影响,带来持续的下行周期,但从长期看来仍然是一个朝阳行业。

抓住每一个机会

江湖上说,半导体行业去原厂香,并且欧美原厂更香。记得有一段时间,我隔三岔五就有面试。在家、在火车上、开车在路上、甚至在毕业旅行在酒店里,我都在与面试官们谈笑风生。

在某一回大厂的面试后,面试官告诉我,有一个好消息和一个坏消息。好消息是我通过了面试,坏消息是此岗位只招实习生。面试官私底下给了我隔壁厂工程师的邮箱,说可以投个简历试试看。看似虚无缥缈的线索,我还是认真准备了简历,即使成功的概率很低,我也要努力去试试看。

后来令我没想到的是,居然能够成功通过面试并拿到 Offer。还记得去年在 RoboMaster 打进国赛后,我们激励自己,抓住机会,输了不亏,赢了血赚。实践再一次证明,这个思路还是非常具有可行性的。

复前行,豁然开朗

新的工作在上海,得开始动身了,这是我第一回去离家这么远的大城市打工。查了查地图,发现还是挺远的,1500 公里的距离,一个人开长途,为了不疲劳驾驶,同时还要给车规划充电,我只好把行程拆分成了好几天。

从深圳到上海,路过惠州、瑞金、上饶、杭州,小跨了半个中国。一路上,我听完了全集「易中天品三国」,在服务区与别的车抢充电桩,途中还因为感冒浑浑噩噩开了两天,终于在某一天的清晨开在了上海的高架路上。

在旅途中,我在西湖边上玩了两天。从南方到北方(广东人看来),一路上看着植被的变化,长途自驾其实还是挺有趣的。

跟 Covid 躲猫猫

疫情三年来,我一直与 Covid 玩躲猫猫。4 月的上海,9 月的广州深圳,我一直在避着毒圈跑,也时时处在幻阳的笼罩下。

所幸运气足够好,也感谢我身体细胞们的共同努力,又苟过一年,我们决赛圈见。

展望

2022 于我而言还是挺幸运的,不过现阶段尚未稳定下来,半场开香槟是不明智的。2023 年将会是一个不错的开始,有什么想法就勇敢去想,大胆放开去做吧。

☑️ ⭐

Auto-i18n:使用 ChatGPT 的自动多语言翻译工具

Auto-i18n:使用 ChatGPT 的自动多语言翻译工具

Auto-i18n 是一个使用 ChatGPT 自动将 Markdown 文件批量翻译为多语言的工具。它实现了博客文章 i18n(Internationalization) 的全自动化。你仅需将博文推送至 GitHub 仓库,即可借助 GitHub Actions 实现自动转译为多种语言。(目前支持英语、西班牙语和阿拉伯语,后续将提供更多语言支持)

Auto-i18n 的主要特性:

  • 批量多语言翻译:Auto-i18n 提供了批量翻译的功能,使你能够将一整个路径下的所有 Markdown 文档一次性翻译多语言,极大地提高了多语言化项目的效率。
  • 兼容 Front Matter:Auto-i18n 兼容 Markdown Front Matter 语法,你可以自定义不同字段的翻译或替换规则。
  • 固定内容替换:Auto-i18n 还支持固定内容替换。如果你希望文档中一些重复字段的译文保持不变,这个功能可以帮助你实现文档的一致性。
  • 自动化工作流:你可以使用 GitHub Actions 实现自动化的翻译流程"。。无需手动干预,翻译工作会自动进行并更新文档,使你能够更专注于内容。

快速上手

  1. 将仓库克隆到本地,把 env_template.py 重命名为 env.py,并提供你的 ChatGPT API。如果你没有自己的 API,可以到 GPT_API_free 申请到一个免费的;也可也借助 go-chatgpt-api 把网页版 ChatGPT 转 API 使用。
  2. 安装必需的模块:pip install -r requirements.txt
  3. 执行命令 python auto-translater.py 运行程序,它将会自动处理测试目录 testdir/to-translate 下的所有 Markdown 文件,批量翻译为英语、西班牙语、阿拉伯语。(后续将提供更多语言支持)

详细描述

程序 auto-translater.py 的运行逻辑如下:

  1. 程序将自动处理测试目录 testdir/to-translate 下的所有 Markdown 文件,你可以在 exclude_list 变量中排除不需要翻译的文件。
  2. 处理后的文件名会被记录在自动生成的 processed_list.txt 中。下次运行程序时,已处理的文件将不会再次翻译。
  3. 对于原本使用英文撰写的文章,程序不会重新翻译成英文,也不会翻译回中文,而会翻译为其他语言。你需要在文章中添加字段 > This post was originally written in English.(注意在上下各留一个空行),以便程序识别。请参考 测试文章_en.md
  4. 如果需要重新翻译指定文章(例如,翻译结果不准确,或文章内容发生更改等),你可以在文章中加入字段 [translate](同样需要在上下各留一个空行)。这将会忽略 exclude_listprocessed_list 的规则,强制进行翻译处理。请参考 测试文章_force-mark.md
  5. 如果 Markdown 文件中包含 Front Matter,将按照程序内的规则 front_matter_translation_rules 选择以下处理方式:
    1. 自动翻译:由 ChatGPT 翻译。适用于文章标题或文章描述字段。
    2. 固定字段替换:适用于分类或标签字段。例如同一个中文标签名,不希望被翻译成不同的英文标签造成索引错误。
    3. 不做任何处理:如果字段未出现在以上两种规则中,将保留原文,不做任何处理。适用于日期、url 等。

GitHub Actions 自动化指南

你可以在自己项目仓库下创建 .github/workflows/ci.yml,当检测到 GitHub 仓库更新后,可以使用 GitHub Actions 自动进行翻译处理,并自动 commit 回原仓库。

ci.yml 的内容可参考模板:ci_template.yml

你需要在仓库的 Settings - Secrets and variables - Repository secrets 中添加两个 secrets:CHATGPT_API_BASECHATGPT_API_KEY,并在程序 auto-translater.py 中将 import env 语句注释掉。

错误排除

  1. 如果需要验证 ChatGPT API key 的可用性,可以使用程序 verify-api-key.py 进行测试。如果在国内使用官方 API,需要有本地代理。
  2. 如果 Markdown 中的 Front Matter 无法被正常识别,可以使用程序 detect_front_matter.py 测试。
  3. 在使用 GitHub Actions 遇到问题时,请优先检查路径引用是否正确(例如 dir_to_translate dir_translated_en dir_translated_es dir_translated_ar processed_list)。

待解决的问题

  1. 在某些特殊的情况下,可能会出现翻译不准确、或某些字段没有翻译的情况,建议翻译后手动校验再发布文章。
  2. (已解决)~~如果 Markdown 中包含 Front Matter,将保留 Front Matter 的原始内容。Front Matter 部分参数翻译的功能正在开发中。~~

贡献

欢迎你参与本项目的改进!如果您想要贡献代码、报告问题或提出建议,请查看 贡献指南

版权和许可

本项目采用 MIT 许可证

问题和支持

如果你在使用 Auto-i18n 时遇到任何问题,或者需要技术支持,请随时 提交问题

我的博客使用 Auto-i18n 实现了多语言支持,你可以到 Power's Wiki 查看 Demo 效果。

致谢

Star History Chart

原文地址:https://wiki-power.com/
本篇文章受 CC BY-NC-SA 4.0 协议保护,转载请注明出处。

❌