About Migrate | 关于博客的迁移
这篇博客或许是我使用 Hugo 作为博客引擎的最后一篇。 我正在写一个基于 Nuxt 的主页项目。其中包含了一个高度定制化的博客。 本博客现有文章或许可以直接迁移到新的博客中。我将尽量保证原连接的持续性。
Drag and Drop Does Not Work on Chrome in Wayland
It is an annoying issue that drag and drop (especially drop) events DOES NOT WORK on chrome in Wayland. I have found some relative issues: Drag and drop does not work in Wayland · Issue #156723 · microsoft/vscode · GitHub Chrome/Plasma 6/Wayland: No mouse input after drag and drop / AUR Issues, Discussion & PKGBUILD Requests / Arch Linux Forums There is a flag option, Preferred Ozone platform, for selecting the platform backend used on Linux....
Docker 网络模型
在之前的文章中,我曾经使用 Docker 的 Macvlan 网络在内网创建了一台 OpenWrt 主机作为旁路网关。在 N1 盒子 Armbian 上使用 docker 安装 openwrt 旁路网关 | Finley’s Blog 那么 Docker 的网络究竟有哪几种,每种网络模型都是什么样的呢? Docker 的网络模型一共有六种: bridge: 默认的桥接网路 host: 去除了宿主机和容器的网络隔离 none: 完全将容器和宿主机、以及其他容器隔离 ipvlan: 完全控制 ipv4 和 ipv6 协议 macvlan: 给容器分配一个 MAC 地址 overlay: 连接多个容器和宿主机 Bridge 网桥 桥接器 - 维基百科,自由的百科全书 网桥是一种在数据链路层将多个网段连接在一起变成一个子网的设备 对于 Docker 来说则是一样的道理。在同一个 Bridge 网路中的容器之间能够相互通信。 容器在没有经过任何配置的默认情况下,就是 Bridge 模式。 容器将连接到默认的 bridge 网路。 而宿主机则与默认的 bridge 连接,宿主机作为网关,转发容器的网络请求,使容器可以进行网络请求。 我们使用的 -p 8080:80 参数则相当于 端口转发。其本质是将外部的请求通过网桥传入容器。 用户定义的 Bridge 当然除开默认的 bridge,用户还可以自定义网桥设备。 最主要的作用是可以与默认的网桥隔离开来。...
Neovim 配置 Volar
几天没写 vue,回来发现我的 volar 莫名奇妙的失效了。上 github 一看才知道,原来 volar 2.0.0 之后不再提供 TypeScript 解析,需要由 tsserver 提供。 之前在 nvim 上配置 volar 需要将 tsserver 关掉,或者使用 neoconf.nvim 等工具在项目中将 tsserver 禁用。 然后使用 volar 的 takeover (接管?)模式直接解析 ts 文件。 不必多说,参考 nvim-lspconfig/doc/server_configurations.md at master · neovim/nvim-lspconfig · GitHub 直接开搞 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 local lspconfig = require('lspconfig') local home = os....
在 N1 盒子 Armbian 上使用 docker 安装 openwrt 旁路网关
去年搞了一台 n1 盒子,寒假期间从海鲜市场淘来了一台中兴的千兆路由器 (型号是E503),准备让 N1 盒子做旁路网关,实现软路由(主要目的是实现透明的魔法) 现在我的(宿舍)网络拓扑图如下: 1 2 3 4 5 6 [百兆宽带] -- [E503路由器](主路由 192.168.123.1 )--wlan-- 无线终端设备(手机等) | ├-- (lan1) -- 电脑 (192.168.123.123) ├-- (lan2) -- N1 盒子 |--- 192.168.123.250 Armbian ├--- 192.168.123.251 openwrt 旁路由 旁路网关就是把内网中的终端设备的网关设置为旁路由的网关(192.168.123.251),而旁路由的网关设置为主路由网关(192.168.123.1),如是,则内网中的所有流量都将经过旁路由的转发,再到主路由。 除了手动设置网关外,可以通过 DHCP 自动设置网关。 n1 刷入 Armbian 由于我购入的 n1 已经刷入过 openwrt,直接插入烧录好的 U 盘即可从 U 盘启动 我使用的 Armbian 固件是:Armbian_24.2.0_amlogic_s905d_bullseye_6.6.15_server_2024.02.01.img.gz 可以从 Releases · ophub/amlogic-s9xxx-armbian · GitHub 获取 如何选择版本? 参考: DebianReleases - Debian Wiki 我选择的是 Bullseye,较老的版本。我希望尽量使用 docker 管理我 n1 盒子上的各种应用,因此 debian 的版本并不重要。...
Hugo 数学公式支持
睡不着,水篇博客。 三周以前 Hugo released 了 0.122 版本 Release v0.122.0 · gohugoio/hugo · GitHub 推出了一个新的 goldmark(hugo使用的 markdown parser) 的插件 passthrough,用于解决数学公式中的内容被转义的问题。 Hugo 的 goldmark 并不支持数学公式,一般使用前端技术栈的 KaTeX 或者是 MathJax 实现对数学公式的渲染(在浏览器上) 然而在之前,goldmark 会对如 \ 等进行转义,导致部分数学公式无法正常渲染。 例如要通过 aligned 进行多行渲染时,换行符 \\ 将被转义为单个反斜杠 \ 现在只需要配置好 passthrough 插件即可在文章的特定部分(例如数学公式)不进行 goldmark 的转义 配置 passthrough 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 markup: goldmark: extensions: passthrough: delimiters: block: - - \[ - \] - - $$ - $$ inline: - - \( - \) - - $ - $ enable: true Mathematics in markdown | Hugo...
山西中国联通光猫破解及桥接+IPTV设置
首先介绍一下我家的网络情况: 光纤入户,接入光猫(型号SK-D742) 该光猫有4个lan口,其中一个为千兆网口,其余3个为百兆。 默认情况下,光猫进行 pppoe 拨号并路由。 比较合理的方式是使用千兆网口接主路由,改桥接后由主路由进行拨号。 我家使用了一台 tp-link 的路由器。笔者推荐使用一台多 Wan 口路由器,以便将 iptv 并入内网。 修改桥接需要进入光猫管理后台(192.168.1.1/cu.html) 以下为获取超级管理员密码的方式: 访问 http://192.168.1.1/hidden_version_switch.html 进入光猫隐藏设置 开启 telnet 功能(按下后页面刷新,自动取消选中) 使用 telnet 访问 192.168.1.1 输入用户名 root,密码随意。 使用 ftp 访问 192.168.1.1 ftp useradmin@192.168.1.1 密码为 192.168.1.1 ftp 使用 passive mode quote pasv passive get /var/tmp/telnet_su_passwd 为光猫管理密码(帐号为CUAdmin) IPTV 的设置需要在电视盒子里选择 DHCP 模式 参考: 联通光猫SK-D540保姆级破解教程!!!-光猫/adsl/cable无线一体机-恩山无线论坛
编译原理(三):语义分析
通过语法分析可以得到语法分析树,但是不不知道其含义所在。 语义分析则赋予其含义。 语法制导翻译 语法制导定义(Syntax-Directed Definition,SDD),是在语法处理过程中对语言节点的属性的处理 我们将讨论非终结符号的两个属性:继承属性和综合属性 综合属性(synthesized attribute):在分析树节点N上的非终结符号A的综合属性是由N上的产生式所关联的语义规则来定义的。 继承属性(inherited attribute):在分析树节点N上的非终结符号B的继承属性是由N的父节点上的产生式所关联的语义规则来定义的。 如果一个SDD的每个属性都是综合属性,那么这个SDD是一个S属性的SDD。 对于一个S属性的SDD,可以按照语法分析树结点的任何自底向上顺序来计算它的各个属性值。S属性的SDD可以在自底向上的语法分析过程中实现 L 属性:一个产生式体所关联的各个属性之间,依赖图的边总是从左到右,而不能从右到左。 要么是一个综合属性 要么是一个继承属性,但是它的语义规则有这些限制 对于 $A \to X_{1}X_{2}\dots X_{n}$,继承属性 $X_{i}.a$: 只能使用 A 的继承属性 使用左兄弟节点的继承属性 与 $X_{i}$ 的实例本身相关的全部属性,但是在 $X_{i}$的 全部属性组成的依赖图中不能存在环 语法制导的翻译方案(syntax-directed translation scheme,SDT)是在产生式中嵌入了程序片段的上下文无关文法 这些程序片段称为语义动作,可以出现在产生式体中的任何地方。 基本文法可以使用LR分析技术,且SDD是S属性的 基本文法可以使用LL分析技术,且SDD是L属性的 参考: 编译工程8:语法制导翻译 - 知乎
编译原理(二):语法分析
进行语法分析后得到了 token 流,对 token 流进行分析以得到语法树的过程是语法分析。 语法分析分为两种: 自顶向下的语法分析 自低向上的语法分析 这个方向的定义是来源于树的产生方式。 Context-free Grammar 使用上下文无关语法进行语法定义。 1 S -> a | b | c 非终结符产生(推导到)终结符。 二义性 一个文法可以产生多棵分析树,则为二义性文法。 例如 悬空 else 问题: 有语法: 1 2 3 4 5 S -> if C then S | if C then S else S | id := E C -> E = E | E < E | E > E E -> E + E | E - E | id 1 2 3 4 if x<3 then if x>0 then x:=5 else x:=-5 // 这个 `else` 是哪个 if 的 else ?...
编译原理(一):词法分析
前言 编译原理是很有趣的一门学科,但是相对晦涩难懂。 本文的首要目的是为我自己梳理编译原理的学习笔记,也是为了能为后人有一个参考的资料。 本系列文章将会有若干篇,每篇文章的基本结构将会是: 术语表:用于解释本文中的各种术语 主要内容,将分为不同的几个标题 技巧性的知识 术语表 本系列文章将在每篇的开头先把本文的术语解释一下。 在编译原理的学习过程中,各种奇怪的术语总是令人困扰。 Lexical Analysis 将字符串转换为 Token 串的过程 Token 词法单元, 通过词法分析得到的词法单元 Regular Expression 正则表达式、正规式:用来描述词法的工具 NFA: Non-determined Finite Automaton,非确定有限状态自动机(详细解释见下文) DFA: Determined Finite Automaton, 确定有限状态自动机 词法分析的过程 词法分析的目的就是将一串字符串转化为计算机可以使用的串(也即 Token 串)。 执行这一过程的程序是一种 “扫描器”。按照一定方向(一般是从左到右)扫描字符串,并将得到的 Token 通过一定的方式表达出来 (例如 XML ) 1 2 flowchart LR 字符串 --> id[(扫描器)] --> Token串 那么如何定义某个串为一个 Token 呢? 这就需要用到正则表达式。 正则表达式是给人类使用的,用于定义 Token 串的工具,而计算机对于正则表达式也是束手无策。 实际上扫描器是基于有限状态自动机的。 正则表达式 本文不详细解释正则表达式,正则表达式理论上对于能够学习编译原理的同学并不陌生。 需要注意的是正则表达式有三种最重要的符号: 联合,通常使用+ 或 | 表示 连接,通常不使用符号表示(或者使用 $\cdot$ 表示) 闭包,通常使用* 表示 上述符号的优先级顺序为从上到下,优先级递增。 当然除此之外还需要括号来表示运算的优先级。...