分类存档: Coding

正确配置 vc4-fkms-v3d 驱动,避免使用 llvmpipe

vc4-fkms-v3d 是树莓派的开源 GPU 驱动,支持 OpenGL 2.1。正确配置的情况下 mesa 应该使用 V3D 驱动而不是 llvmpipe,后者使用的是 CPU。树莓派本来就贫弱的 CPU 并不经得起桌面渲染的折腾。此外 Chrome 也应能打开大多数硬件加速。

首先需要切换到开源驱动。前往 raspi-config -> Advanced Options -> GL Driver -> GL (Fake KMS)。树莓派 4 是默认使用这个开源驱动的。

继续阅读 »

将树莓派用作 SD 读卡器

需求

  • 树莓派
  • SD 卡 2 张,其中一张可引导系统
  • USB 存储(可选)

不需要

  • SD 读卡器
  • 显示器
  • 键盘

最近买了第四代树莓派,但等到 SD 卡寄到了我才意识到我的读卡器忘记带在身边了。环顾四周,唯一有 SD 卡槽的居然只有那只老的树莓派 3B+。理论上我可以直接用 U 盘引导系统,但我不知为何一直无法成功。我更无法冒险将唯一可以引导系统的 SD 卡改为引导到 U 盘,因为万一失败了我在搞到读卡器之前都再也进不去系统了。

于是我就想到了一个骚操作:先用一张 SD 卡引导系统,ssh 进去,然后利用 pivot_root 将 root 转移到 SD 卡以外的地方(U 盘或者内存盘),这样我就能把引导系统的 SD 卡拔下来换新的上去了。全程都可以在 ssh 上完成。

继续阅读 »

在 MSYS2 中安装 Git for Windows 并自定义 PATH 中的 toolchain

背景

Git Bash 在 WSL 出现之前一直是 Windows 开发必不可少的工具。哪怕不使用 unix toolchain,git 也是免不了要用的。在 WSL 出现后它依然没有退出历史舞台——至少 VS Code 目前还需要 Git for Windows 来整合 git 功能。此外,Git bash 是基于 MSYS2 开发的,而 MSYS2 在一些从 *nix 移植到 Windows 的项目上不可或缺。

然而,Git for Windows 中的 MSYS2 环境是刻意缩减过的。最重要的是他没有 pacman 包管理系统。如果不想装两份 MSYS2(一份完整的,一份 Git for Windows),那么 Git for Windows 官方提供了两种方案:使用 Git for Windows SDK,或在已有的 MSYS2 中安装 Git for Windows SDK

注:Git for Windows 修改过 MSYS2 的运行环境。未经修改的运行环境不能很好的在 Windows 下互操作,例如 Powershell 中连 git status 都会无法执行。因此在 MSYS2 中安装 Git for Windows 会覆盖原版的 MSYS2 运行环境。

摆脱 SDK

Git for Windows SDK 是一套为了开发 Git for Windows 而存在的环境。把这套 SDK 当 MSYS2 使用会有诸多不便。我只是想把完整的 MSYS 和 Git for Windows 合二为一而已,但在已有的 MSYS2 中安装 Git for Windows SDK 教程中却把 SDK 一同装上了。不装 SDK 其实很简单,不安装 git-extra 包即可。也就是最后一步的命令改为: pacboy sync git:x git-doc-html:x git-doc-man:x curl:x

继续阅读 »

TypeScript on Electron 解决 Renderer 没有 exports 的问题

Electron 的 Renderer process 虽然和 main process 是不同的进程,但依然可以使用 node 的环境,比如 require(‘fs’) 之类. 但如果一个 js 脚本是在浏览器环境中用 <script> 标签加载的话,exports 变量是缺的,会报 exports is not defined.

而解决方法是不要使用 <script src=”./script.js”></script> 而是 <script>require(‘script’);</script>. 这样所有的脚本就是以 module 的方式加载而不是页面脚本了. 以 module 方式加载的脚本是有 exports 变量的.

继续阅读 »

使用 VSCode 运行 Task 并自动 Attach Debugger

本文将讲述如何在 VSCode 中使用 Attach 模式 Debug 的时候,也能像 Launch 模式一样一键启动 Debuggee. 具体原理是使用 preLaunchTask 并将此 Task 的 isBackground 属性设置为 true.

VS Code Debug Protocol 描述了两种不同的 Debug 方式:Launch 以及 Attach. 他们分别对应了 VSCode 负责启动程序并 Debug,以及 VSCode 去 Debug 一个正在运行的程序,包括非本地的程序.

其中,Launch 模式的潜在含义是,VSCode 将负责管理 Debuggee 的生命周期,也就是说 VSCode 负责启动及停止,而这些操作对于用户而言就是按一下按钮. 反观 Attach 则是另一种设计:用户必须自行启动 Debuggee,可以在本地可以在远程,只要 Debugger 能够与之通信,而 VSCode 只负责将 Debugger 与 Debuggee 对接.

在本地开发本地运行本地调试的情况下,Launch 无疑是最好的选择,因为一旦配置完毕,今后 Debug 只需要一键启动及一键停止. 这种开发环境十分的理想化,尽管可以满足大多数需求,但当环境变得复杂时,Attach 模式将是无法避免的. 例如执行代码的机器一定是在远程,这常见于跨平台开发,包括在 Windows 上使用 WSL 做 Linux 开发,以及使用 QEMU + GDB 做内核开发. 尽管微软在近期对一些官方插件就 WSL 进行了优化,即可以使用 Launch 模式在 WSL 中运行程序,但第三方插件仍然不可避免地需要使用 Attach.

继续阅读 »

在 WSL 中使用 ssh-agent

在阅读前请注意,ssh-add 在没有 keychain 的情况下只能临时保存 SSH key. 也就是说重启 ssh-agent 后需要重新 ssh-add. 若要永久添加某个 SSH key,最快捷的方法是在 ~/.ssh/config 中添加 IdentityFile. 但如果要使用 SSH agent forwarding,就需要 ssh-agent 了.

在 WSL 中自动启用 ssh-agent 并不是那么直接,因为 WSL 的入口 bash.exe 并不能继承来自父进程关于 ssh-agent 的环境变量,毕竟父进程是个 Windows 进程. 此外另一点特殊的地方在于,当所有 bash.exe 进程结束的时候,所有的 WSL 进程会被杀掉,包括 ssh-agent.

ssh-agent 的启动比较特殊. 手动启动的方式是:

这是因为 ssh-agent 默认执行两件事:1. 后台运行 ssh-agent;2. 输出一段 shell script 以供执行. 这段 shell script 中包含着与这次启动的 ssh-agent 通信所需的环境变量.

一般情况下,例如在 Linux 桌面环境里,在桌面环境启动前 ssh-agent 就被启动并且环境变量也被设置了. 之后启动的桌面环境,以及桌面环境启动的 Terminal 都会自动继承这个环境变量.

继续阅读 »

Lambert W function 数值计算

由于一些很蠢的原因,我写了一份完全用不着的用于计算 Lambert W function 的 C# 代码. 具体原理是很粗暴的牛顿法求解,但有几个特别处理的地方:

首先是估算. W0比较好处理,其实随便给个初始值就好,我这里选择了偏移后的 ex. 而 W-1 则比较特殊,首先在 x < -2 的部分变成了 concave 的,而且越往左斜率越小,所以一律从 x = -2 开始尝试;而在 -2 < x < -1 的区间内其实也是随便给个初始值就好,我这里选择了偏移后的 cos 函数.

其次是精度处理. 通过 log2x 做差可以求出二进制下的有效数位,然而当 y 值较大的时候其实并不能把完整的 52 位双精度浮点数的小数部分求完整,大概只能求到 47 位左右,所以这里我保守选择了 42 位有效数字.

继续阅读 »

CanvasRenderingContext2d bug 2 则,附解决方案

前言:这篇文章本来是上上次在 Autodesk 实习结束的时候 (2015.12) 就要发的,后来存在草稿箱给忘了,现在这两个 bug 并不知道还存不存在,本来是有计划写详细的代码示例的也搁置了.

第一个 bug 仅影响 Windows 平台的 Firefox.

当在 clip 过的 context 中绘制阴影时,如果在本次渲染周期前没有任何 fill 操作,clip 会失效. 后果是 clip 外的内容会被覆盖.

解决方案是在所有渲染操作前绘制一个透明的像素.

第二个 bug 有关于 IE 的 CORS.

IE 是部分支持 CORS 的,比如如果请求头设置正确的话图像是可以在 <img> 中正确加载并显示的,也可以通过 Image 类加载并绘制到 canvas 中. 然而,通过后者绘制的 canvas 将不能使用 toDataUrl (会报 SecurityError 异常).

解决方案是先使用 XHR 载入图像数据,然后将 ObjectUrl 赋值给 Image.src. 感谢微软,至少 XHR 的 CORS 还是能用的. (此处应有一颗药丸)

.NET Core 调用 native library 的 project.json 写法

太长不看版:

一点废话:最近在用 ASP.NET Core 练手,想把去年 CS246 (C++) 的期末大作业做个 web interface. 当时选做了国际象棋,整个 C++ 代码从设计到完成,还附带一个不带 WebSocket 的用 ASP.NET Core beta5 (当时还叫 ASP.NET 5) 写的简易 web interface 作为附加分,一共也就用了 50 小时 (虽然忘记做王车移位时不能被将的判断了) 其中还有至少 4 小时花在了将 还处在 beta 的 ASP.NET Core 部署在 Amazon Linux 上. 而现在,我花在这个 web interface 上的时间可能都超过 100 小时了,看来核心业务逻辑果然是只占有非常少的比例啊…

这次要说的是,如果 C# 中要调用 native library,也就是要用 DllImport,那在 project.json 中应该如何导出这个 dll. 撰写此文的时候是 2016/09/10 版本是 .NET Core 1.0. (按照微软的尿性谁知道下个版本这么写还对不对)

继续阅读 »

As3 使用 FlvEncoder 输出 1080p 视频

话接上回,这次真刀真枪输出1080p的视频了. 前前后后折腾了一天,终于顺利输出无报错了,注意点有两个:

1. 不要使用 FlvEncoder 的 Alchemy 模式,我每次渲染都会在进行到一分多钟的时候报错,排查下来是使用 Alchemy 的 helper 不能正常生成 ArrayByte (长度为0,位于 VideoPayloadMakerAlchemy.as Line 74). Adobe 自己也反复表明不建议将其用于生产环境中,看来还是有道理的.

继续阅读 »