VSCode 搭建 C++ 开发环境
毕业后开始对 C++ 着迷,但是毕竟工作基本用不上,所以大多数时候都是写一些小程序。因为日常开发使用 Android Studio,所以在选择 C++ 编辑器/IDE 时自然而然想到了它的兄弟 CLion,不过还是因为 JB 家的东西都太吃内存而放弃了;第二个想到的是 XCode,颜值与实力并存,最终没有选择 XCode 还是因为它”过度”封装,无法把握工程细节和编译过程(也可能是我没找到相关设置)。最后选择 VSCode 是因为它足够轻量,简单配置后就能像 IDE 一样一键运行/调试,同时工程文件所见即所得,不会像 XCode 无法直观地知道源文件的磁盘路径。 1. 安装拓展VSCode 原生并不支持 C/C++ 开发,所以需要安装一些拓展来提供一些必要的能力:语法高亮、错误提示、自动补全以及最重要的调试/运行。 1.1. C/C++ 巨硬提供的 C/C++ 拓展,安装量远超其它 C/C++ 拓展,提供了几乎所有 C++ 开发所需要的功能。 默认配置下也能用得比较开心,但是每个人的快乐都不太一样,所以还是要简单配 ...
记一次 Head Buffer Overflow
昨晚刷 LeetCode-17 最后提交时,本以为能一遍就 pass,结果直接给报了个 heap buffer overflow: 第一次碰到这种内存错误,信息量比较少,加上本地能正常运行,一时间也不知道问题在哪里。 下面是提交的代码: 123456789101112131415161718192021222324252627282930313233343536class Solution { private: std::vector<std::vector<char>> mapping = { {'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'}, {'j', ...
新一代图像格式——WebP
最近开始写公众号,本地写 Markdown 图片都是用相对路径,复制粘贴到微信公众号编辑器就跪了,手动上传图片的过程中想到了 WebP,就思考是不是可以尝试把图片后缀都统一成 WebP呢?当然现实是公众号不支持上传 WebP 后缀的图片,即使公众号后台会把你上传的 PNG/JPEG 转成 WebP 🐶 。 1. 了解 WebPWebP 是 Google 研发的具有先进有损无损压缩算法的图片格式,主要的特点有:高压缩率、支持透明通道、支持动图。据 WebP 官网的描述,在图片质量等同的条件下,WebP 无损压缩后的图片文件大小比对应的 PNG 图片小 26%,有损压缩图片比对应 JPEG 图片小 25~34%。 目前主流浏览器,如 Google Chrome、FireFox、Edge 以及 Opera (macOS Big Sur Safari 实测支持 WebP)等,都原生支持 WebP 了。虽然 WebP 是面向 Web 推出的解决方案,但是凭借其优越压缩比,其它平台、工具也逐渐加入了支持 WebP 的队伍。 2. 使用 WebP虽然主流浏览 ...
音频编码—PCM
1. 声音三要素声音主观感受上主要有响度、音高、音色以及掩蔽效应等特征,其中响度、音高、音色在物理上可以量化成具有振幅、频率、相位的波,故称它们为声音的”三要素”。 响度。表示声音能量的强弱,振幅越大,能量越大。 音高。表示人耳对音调高低的主观感受,物理上用频率与之对应,频率越高,音高越高。人耳可以识别的声音频率范围是 20~20kHz。 音色。从音乐的角度来讲,音色由乐器的材质决定。物理上,音色是是众多相位不同波形叠加产生,其中波形的基频产生的听得最清楚的音称为基音,各谐波(其它相位)微小震动产生的声音称为泛音。 2. A/D转换与PCM要将自然界中的信号进行传输,声音转换成计算机能够识别的形式,前者称为模拟信号,后者称为数字信号,模拟信号与数字信号之间的转换过程就叫做**数模转换(A/D)**。 PCM(Pulse Code Modulation) 是数字通信中编码方式的一种,也即计算所能识别的信号形式。PCM 通过对模拟信号进行采样、量化、编码而产生,接收 PCM 信号的端则将编码”还原”成模拟信号。采样过程将连续的信号按照固定时间间隔离散化(声音是一个连 ...
颜色编码方式——YUV
1. YUV 简介与 RGB 类似,YUV 也是一种非常流行的颜色编码方式。RGB 编码方式诉求人眼对色彩的感受,而 YUV 则关注人眼对亮度的敏感程度。人眼中除了感受色彩的视锥细胞外还有对亮度(能量)敏感的视杆细胞,在 RGB 中基本没有提到过视杆细胞对大脑成像的影响,但实际上 RGB 三原色分量都各自包含了亮度信息。 YUV 中 “Y” 表示亮度(Luminance),”U” 和 “V” 则表示色度、**浓度(Chrominance、Chroma)**,UV 通常组合起来使用/描述,Y 包含了完整图像信息。 在计算机领域中,UV 分量有时也会称作蓝色通道和红色通道,基于此可以分别提取图片中蓝色和红色的物体轮廓 YUV 诞生于黑白电视向彩色电视过渡时期,黑白电视只有灰度/亮度(Y)信号,所以对于彩色电视信号,去除彩色(UV)信号就能兼容黑白电视。另一方由于人眼对亮度信号更加敏感,可以适当降低 UV 分量采样率以降低信号传输的带宽压力,实际上大多数YUV格式平均像素位数都小于24bit,所以 YUV 比 RGB 更加适合传输场景。 由于历史原因,YUV 实际上是 ...
颜色编码方式——RGB
1. 什么是RGB?下面摘自 wikipedia 原文: 三原色光模式(RGB color model),又称RGB颜色模型或红绿蓝颜色模型,是一种加色模型,将红、绿、蓝三原色的色光以不同比例相加,以合成产生各种色彩光。 仔细地拆拆这句话,提出这么些疑问: 什么是颜色? 什么是加色模型? 为什么将RGB定义为三原色? 1.1. 什么是颜色?这个问题看起有些莫名其妙,颜色不就是颜色么,还能是什么?颜色是生物学上的概念,是眼、脑和生活经验对物理世界的感知特征的描述,并且不同生物在颜色感知上是不一样的。在实际物理世界中,颜色只是人类对电磁波谱中可见光部分(特定波长,约312.30nm至745.40nm)的一个别称。 根据初中生物所学过的知识,人类眼底视网膜上遍布了许多能够感受光照刺激的视锥细胞,一般分为感受黄绿色(565nm)、绿色(535nm)和蓝紫色(420nm)三种细胞。这些细胞不是只接受这三种颜色的刺激,而是接收到这三种颜色对应光谱光照刺激所产生的信号最强烈,也就是说三种视锥细胞对任意可见光谱中的颜色都会产生相应的信号,这些信号的组合就是人眼所能分辨的颜色的总和。 1.2. 什么 ...
Hadoop 集群配置
下半学期开了“大数据与云计算”的课程,一次实验课要求配置 Hadoop 分布式集群。配环境这东西真的不好说,运气好一气呵成,运气不好,真的要杠上两三天。所以这篇就给踩的坑做一个笔记。 前言Hadoop 提供 单机模式 、伪分布式模式 以及 分布式模式,因为真正的生产环境都是在真正的分布式环境下,所以这里就选最后一种进行配置。 为了方便起见,所有都机器都是本地 CentOS 7 的虚拟机,也只配置一个 master 和一个 worker 节点。 修改主机名为了方便管理,需要修改一些主机名。修改 /etc/hosts: 123# 增加下面两行10.211.55.19 master10.211.55.23 worker master 就是当前正在配置的虚拟机的内网 IP,worker 准备从 master 里 clone 出来,后续需要再进行补充/修改,到时就不再赘述了。 修改 /etc/hostname: 12# 整个替换文件内容,如果是 worker 就填 worker,这一行也不能要master 安装 JDKHadoop 是 Java 编写的,所以环境 ...
【Git】实用操作
平常用 Git 就 add、commit、push,遇到一些少用的就很麻烦,不是查文档就是搜 Google。简单记下,未雨绸缪。 暂存更改有时候对工作空间进行了修改,但是又需要 pull 远端更新,强行 pull 会提示失败 1234# 更改压栈git stash# 弹出git stash pop 可以多次 stash git stash list 进行查看 fetch 指定分支1git fetch origin remote-branch:local-branch clone 指定 tagclone 的时候只想 clone 一个指定版本的提交 1git clone --branch <tag> <repo> 这里 tag 也可以是分支名 合并代码 rebaserebase 和 merge 合并方式有些不同,rebase 会将被合并分支作为基础, commit 记录变为线性 1git rebase branch 回滚单个文件123456# 回退到指定版本git reset <commit-id> <file># 更新工作空间 ...
【Flutter】UI 刷新
Flutter 在 Framework 上打设计大量借鉴 React,做到通过声明的方式编写 UI 代码,让开发者围绕 Widget 进行开发。但仅仅这样是不够的,我们知道 Flutter 相比于 React 还多了关于测量、布局以及绘制的逻辑,而这些都是在前端开发中很难触碰到的,既然 Flutter 提供了这样的机会,理解其中的原理就显得尤为必要了。这篇文章主要分析 Flutter UI 更新背后的逻辑。 入口在 这篇文章 中分析了 runApp 的启动流程,也知道了这里是触发界面绘制的入口之一。还有一个比较常见的触发界面刷新的入口是 State#setState 方法,这里主要就分析 setState 内部逻辑: 123456789101112131415161718// State#setStatevoid setState(VoidCallback fn) { final dynamic result = fn() as dynamic; if (result is Future) { throw FlutterError(&q ...
【Flutter】runApp 流程
不管是使用 Flutter 开发完整应用还是作为区块嵌入某个页面,都需要调用 runApp ,而我们需要做的只是传入一个 Widget 实例,那么 runApp 背后所做的工作就很有趣了,比如触发视图的构建、更新以及绘制等,下面我们就粗略地看一下这个函数到底做了啥。 🧐 runApp 声明先看一下 runApp 的函数声明: 12345void runApp(Widget app) { WidgetsFlutterBinding.ensureInitialized() ..attachRootWidget(app) ..scheduleWarmUpFrame();} WidgetsFlutterBinding 使用了 mixin,将负责点击事件、绘制的 XXXBinding 组合起来,这个类也使用了单例模式,即 ensureInitialized。 调用 attachRootWidget 将会触发 Widget、Element、RenderObject 的构建调用 scheduleWarmUpFrame 会触发 ...