header image

文章

群晖如何在非官方 SSD 上创建储存池
年初因为老的群晖 CPU 烧了,升级了新的带有 M.2 SSD 插槽的群晖。 看官方的介绍,说这个 SSD 插槽支持把 SSD 用做缓存或者可以用来做储存池。 直到昨天我插上一条 SSD 才发现原来如果要创建 SSD 分区只能用群晖自己的 SSD。 而群晖自己的 SSD 买得比普通牌子贵 2-3 倍,简直是抢钱。 去…
读懂 WebAssembly 如何表达 C++
本文同步发布到知乎 背景 最近因为项目原因,在项目中使用 Emscripten 将 C++ 代码编译到 WASM 以便在浏览器执行。借助这个过程我也学习了 WASM 上代码执行的方法。借助这个机会,用这篇文章介绍 C++ 是如何借助 WASM 字节码是执行的。 名词解释 WASM: WebAssembly,这个不多介…
QuickJS 源码解读(二):基础设施和标准库
上一篇文章 里面主要解释了 了 QuickJS 虚拟机的运作。第二篇文章打算介绍一下 QuickJS 里面 JavaScript 基础设施的实现。 基础设施 注意,使用 QuickJS 新建 JSContext 的时候,默认是不带基础设施的 (比如说 JSON 解析、Object、等等)。 这时候,可以调用以下命令进…
写一个飞快的 JavaScript 打包压缩工具
背景 平时大家在开发 Js 项目的时候,可能已经离不开 webpack 等打包工具了。而 webpack 打包速度大概就是“能用“的水平。大概去年开始,我就开始在构想,如果能写一个极速的打包工具,功能未必需要很强,可能对小项目非常有用。去年我用 C++ 写完 parser 之后,便没什么动力写下去了。但是最近发现有这…
使用 JS 操作 mac 下文件拓展属性
任何可以使用 JavaScript 来实现的应用都最终都会使用 JavaScript. --Atwood 通过浏览器和 Node.js,JavaScript 可以说上天入地无所不能。现在许多客户端应用程序也使用 Electron 进行开发。但是 Node.js 本身在一些 native 操作上稍有欠缺,比如说 mac…
多线程 SQLite with C++ 踩坑汇总
因为工作的原因使用 SQLite 作为本地数据库,然而 SQLite 和 C++ 配合使用有许许多多的坑,此文用于记录工作过程中使用 SQLite 的坑。 Last Insert rowId Last Insert Rowid SQLite 中有一个函数可以获得最最近 insert 的一行的 id。也就是说,当你 i…
使用 N-API 和 CMake 为 Node.js 添加 C++ 拓展
以前为 Node.js 编写拓展的时候,使用的是 Node.js 的 C++ addon API,直接使用 v8 提供的 api 和 Node.js 打交道。使用 C++ Addon 的 API 有个缺点就是 ABI 层面不兼容,升级 Node.js 之后 extension 要重新编译。 现在 Node.js 提供…
QuickJS 源码解读(一):虚拟机的实现
简介 Quick JS 是 Fabrice Bellard 今年发布的一款 JavaScript 引擎,具有以下特性: 轻量而且易于嵌入:只需几个C文件,没有外部依赖,一个x86下的简单的“hello world”程序只要180 KiB。 具有极低启动时间的快速解释器: 在一台单核的台式PC上,大约在100秒内运行E…
转换网易 ncm 格式到 mp3
不知道什么时候开始,网易下载的歌曲都不用以前的 mp3 格式,而采用了自家的 ncm,说真的,比较恶心,平时自己想要剪个视频用个配乐都很麻烦,搜了很久很多工具,最后搜到了这个:ncmdump。 首页提供了 Windows 和 Linux 的使用方法,mac 下面使用也很简单,先用 brew 安装 taglib,然后 …
使用 OCaml 解析 JavaScript
起因 最近在写一个关于 JavaScript 的静态分析器,作为我的毕业设计。我写静态分析主要是为了 ES6 层面的语法做更好的 DCE(Dead Code Elimination)。我选择 OCaml 来实现这个静态分析工具,用 flow 来 parse JavaScript。 为什么选择 OCaml 在和导师讨论…
2018 不停留
人生中一些很重要的时间段,往往会像细水那样慢慢流走,回过头来才发现,涓涓细水汇成了江河大海。对于我来说 2018 年就是这样的一年,回头一看觉得很平淡,但是不乏丰富的细节。 关键词: GSoC,大四,实习 (暂不开放)
在 Mojave 下编译 SpiderMonkey
自从 macOS 升级到 Mojave(10.14) 之后,编译 SpiderMonkey 变得有点不同。 有一点比较重要的变化是 libstdc++ 被替换成 libc++,这个修改是从 OS X 10.9 就开始有的修改,所以直接调用 ./configure 有这样的 warning 和报错: 很明显,报错原因是…
理解 Scala 中的 for 表达式
Scala 中的 for 表达式非常强大,用起来很简单顺手,但是理解起来可能需要一些背景知识。这个 for 从名字上看让我们觉得它很像命令式语言中的那种 for statement,但是其实 Scala 的 for 是非常函数式的,它跟命令式语言中的 for 语句根本不是一个东西,因为它根本不支持 break 和 c…
webpack 如何通过作用域分析消除无用代码
GSoC 2018 中,我的项目就在于给 webpack 实现深作用域分析(Deep Scope Analysis),主要还是为了改进 webpack 的 tree-shaking 工作。 前言 JS 的 tree-shaking 一直是前端开发中的痛点,大家都在想尽办法减少打包的代码体积。Tree shaking …
GSoC 之旅
有幸被 webpack 选中参加今年的 GSoC,这次的 GSoC 我主要负责实现 Deep Scope Analysis,这个最后会被用到最新版本的 webpack 里面用于 Tree Shaking Github 项目地址:webpack-deep-scope-analysis-plugin 根据 webpack…
初窥 Racket:解析一个数学表达式
当 Haskell 这些静态类型的函数式语言玩久了,就想尝试一下动态类型的函数式语言,比如 Lisp,最古老的编程语言之一。不过现在写 Lisp 是不现实,因为原始的 Lisp 是 dynamic scope 的,写起来会异常痛苦。所以我打算从 Lisp 的一些比较现代方言下手,比如说 Racket 这种广受赞誉的语…
关于函数式
此篇博文整理了我和 walkerlala 关于函数式相关问题的讨论 Vincent Chan 我觉得函数式很重要的一点是 Immutable,使得每一次更改都要重新生成一次整个数据结构(当然我们可以通过编译器优化来减少某些生成),但是immutable 也使得整个程序的状态可以被记录和更改。我之前写前端的时候就尝试了…
初窥 Haskell:解析一个数学表达式
最近在学习 Haskell,不得不说,这真的是一门令我着迷的语言,lazy 和纯函数式等特性都非常吸引我,不过短时间内还无法掌握得很好,最重要是思维的转变非常苦难。 学习一门语言最好的办法就是多实践,我还记得我写过一片文章编译原理学习笔记1:解析数学表达式 来讲述怎样去解析数学表达式,但是我没有讲如何去实现,现在刚好…
用 Python 生成饼状旋转动画
在写一个小游戏过程中,打算做一个饼状旋转的动画,于是打算用 Python 来生成这个动画,假设我们有这样一张图片 最后生成的动画是这个样子的 当然,中间会生成很多帧的动画 怎么去生成每一帧动画呢?其实关键就在于挖去一个饼状图形里面的像素 那我们只要遍历这张图片的所有元素,然后挖去在这个饼状范围内的像素即可,从…
HTML Canvas实现《黑客帝国》数字雨
《黑客帝国》是我最喜欢的电影之一,我感觉《黑客帝国》里面的数字雨简直是一种艺术,非常好看,看上去非常高大上,而且和“雨”这种东西结合,非常有意思,于是想自己实现一下。 效果图: 在Canvas里面实现动画的思路其实很简单,在很短的时间里面刷新一次就行了。每次刷新的时候,字符都会下降,然而数字雨里面并不是整串“雨”往…
写一个光线追踪渲染器
最近都在做一件事情,做一个光线追踪渲染器,一直很想揭开光线追踪渲染器的大门,于是跟着 Milo Yip 的步伐开撸了 用 JavaScript 玩转计算机图形学(一)光线追踪入门 渲染结果图: 其实制作的过程是非常坎坷的,我首先用 C# 按照博文的思路重写了一边,渲染出结果(1024x1024),总共耗时6秒,结果…
从头打造一个 Markdown 编辑器(一):数据结构和展现
刚开始写这个编辑器的时候,我是毫无思路的,就是完全不知道如何下手,后来去翻了一下 CodeMirror, ACEditor, VSCode 这些优秀编辑器的代码,但是我没有全看,因为我要我的编辑器大部分都是我自己想出来的,只有我想不到的时候才去看。 首先我们需要一个数据结构来储存我们的文本,为什么要用数据结构而不直接…
从头打造一个 Markdown 编辑器(序章)
开始写文章之前,先打个小广告,就是小弟新鲜出炉的作品 MDE,一个完全免费的,开源的,基于 Electron 的 Markdown 编辑器MDE Editor,点击链接进入GitHub 截图为在 Windows 10 上运行的效果 支持的功能: 即时渲染 Markdown 语法高亮(Syntax Highligh…
Syntax Highlighting之后的视图更新
前一篇blog讲述了如何给编辑器做Syntax Highlighting,可是做完之后要怎么样给视图更新才会做到更高效呢 毕竟我们采用这种Syntax Highlighting的方法, 就是要保证高效,如果不能好好利用,那么我们的这种方法就没有意义了。 我们知道,当一行改变了之后,这行下面的状态可能全部都会改变,所以…
如何实现编辑器文本语法高亮着色
最近正在尝试造一个Markdown编辑器的轮子 MDE 现在算是实现了简单的数据结构,用 chains of lines实现了,支持插入,删除,替换操作。 至于 Model 至视图(View)层面的更新就简单了,只要判断出插入、删除的那几行,去更新 DOM 里面那几行就可以了,也可以说是非常简单。 目前比较棘手的一个…
(翻译)用 Javascript 在浏览器里面虚拟一个可编辑的控件
此文翻译自 Marijn Haverbeke 的 Faking an editable control in browser JavaScript 你当前的问题是:你正在写一个和文本输入控件(Text intput Filed)相似的Javascript 控件——它必须是 focusable 的,而且要支持复制和粘贴…
编译原理学习笔记 3:实现一个虚拟机
至于 Lexer 和 Parser 部分,教程和用法实在太多,实现起来也比较简单,所以也没什么好说的,这里说说如何实现一个虚拟机(Virtual Machine) 虚拟机的实现有很多种,常见的分为 Stack Machine 和 Register Machine 前者基于栈,后者基于寄存器。 目前来说,基于栈的虚拟机…
把正方系统的课表导出成 ics 文件
文章的开始,先上一张图,打开 Siri,问 Siri:明天有什么安排? 为什么 siri 知道我的课表?因为我把课表导入了 iPhone 的日历中去了。 因为不想再使用超级课程表等软件,加上华农宝不怎么好看,而且很麻烦的缘故,自己写了一个工具,可以把课程表导出到ics 格式,可以把这个文件导入到系统的软件当中,比如…
编译原理学习笔记 2:赋值操作
上文中,提到如果解析一个数学表达式,并把它变成一棵树,我们把这个程序称为解释器,这次我要为这个解释器加一个功能:赋值操作 这里我们要区分左值(left-value)和右值(right-value) 右值是临时结果,而左值是一个变量。至于右面是一个表达式,表达式如何解析在上一篇文章已经详细说了,所以这里就不多说。 解…
编译原理学习笔记 1:解析数学表达式
说到编译原理,是计算机科学里面很重要的一个学科,你可以说编译原理无处不在。但是一般人很少可以接触到这样的理论。编译原理分前端和后端,前端包括文本解析和类型检查,后端包括优化和代码生成等等。这篇日志里我主要讨论文本解析中一个最为简单的部分:数学表达式。 数学表达式: 要求出这个表达式的值,不禁让我想起了当时学习数据结…