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