SyraTi.ICU

霧雨魔法店 下属

问题表现

更改/etc/ssh/sshd_config的端口号之后,发现systemctl enable ssh无效,开机后ssh服务不会自动启动,且ssh也连不上

问题原因

ssh默认以socket-activated方式启动而不是传统的service方式

什么是socket-activated

Socket Activation是systemd一种提供的系统服务管理方式。它允许系统在实际需要时启动服务,从而节省资源和提高启动速度。

也就是说,在ssh以socket-activated启动的情况下,当有客户端尝试连接 SSH 的端口(默认为 22)时,systemd 会监听这个端口并激活相应的 SSH 服务。

而socket所监听的接口并不会读取/etc/ssh/sshd_config而是存储在ssh.socket当中,所以当我们修改了/etc/ssh/sshd_config中的端口号之后,就无法触发ssh.socket了

验证&排查

  1. 检查ssh是否为socket-activated方式启动

    1
    systemctl status ssh.socket 

    在这里插入图片描述

    如图所示,状态为active,说明当前的ssh是socket-activated方式启动,且正在监听22接口

    解决方式有两种,一种是修改ssh.socket所监听的端口号,另一种是恢复传统的service方式启动,这里我们选择第二种

  2. 关闭ssh.socket

    1
    systemctl disable ssh.socket 
  3. 启用ssh.service

    1
    systemctl enable ssh.service 
  4. 重启解决

    1
    reboot

前情提要

鼠标滚轮滚动/触控板双指缩放都会触发wheel事件,在滚轮不需要触发缩放的场景下,需要对两种事件进行区分。

TL;DR

双指缩放事件会被映射为按下ctrl键的wheel事件

即:由触控板缩放触发的wheel事件,ev.ctrlKey的值会为true,所以可以按照下面的代码进行区分:

1
2
3
4
5
6
7
8
9
$target.addEventListener('wheel', (ev) => {
const isTrackpadPinch = ev.ctrlKey
if(isTrackpadPinch){
console.log('trackpad pinch')
}
else{
console.log('mousewheel')
}
})

浏览器支持

浏览器支持(截至文章发布)

注意

需要注意的是, Pinch-to-zoom maps to WheelEvent + ctrl key 行为并没有在W3C标准中进行规定,应当是公认的实现。好在主流的浏览器实现都是一致的,一般情况下不用做兼容性处理。

参考来源

前情提要

今天闲来无事,突然想起来之前在业务中看到的一个“能跑,但是不太合乎逻辑”的流程。

1
2
# 构建生产环境下的产物
NODE_ENV=production && npm install && npm run build

看起来一段非常简单的构建命令,实际会出现一些问题:当NODE_ENV=production时,npm install不会下载devDependencies,例如webpack、Typescript项目中的@types/xxx等。从而导致npm run build失败。

解决方案

这时候可能有人会问了:我把@types/xxx丢到dependencies不就好了?

话虽如此,但是这样真的正确吗?

阅读全文 »

前情提要

已经在群晖部署了Emby+Aria2,但是番剧一直是手动下载,比较麻烦。想着能不能订阅自动下载之类的,翻了一遍Github看到了BGmi这个仓库,尝试下来体验还算不错。

部署

由于是在群晖部署,自然能用docker就用docker,BGmi也贴心提供了docker镜像。镜像除了BGmi本体之外,还包含了一个Transmission,如果没有安装Aria2的姥爷们,也可以直接使用Transmission。

ok,那么下面开始正式部署:

阅读全文 »

0. V8介绍

官方文档这么介绍:V8是谷歌开源高性能JavaScript和WebAssembly引擎,用C++编写。它主要用在Chrome和Node.js中,等等。

简单的来说,我们知道,JavaScript是解释型的语言,需要逐行解释执行

V8则是一种C++开发的JavaScript解释器,它将JavaScript编译成可执行代码,即机器码。

1. V8工作流程概述

JavaScript是解释型的语言,解释型的语言先天就有执行效率上的不足。为此,V8引擎同时采用了解释执行和编译执行这两种方式,也就是在解释执行的同时进行编译,这种方式称为JIT (Just in Time) 即时编译

解释执行:V8在执行JavaScript源码时,会先通过解析器Parser将源码解析成AST,解释器Ignition会将AST转化为字节码,一边解释一遍执行。

即时编译:Ignition同时会记录某一代码片段的执行次数,如果执行次数超过了某个阈值,这段代码便会被标记为热点代码(HotSpot),同时将运行信息反馈给优化编译器TurboFan,会将这部分热点代码的字节码优化并编译,生成机器码更高效地运行。

graph LR
  源代码 --Parser--> AST
  AST --Ignition--> 字节码
  字节码 --Ignition--> 逐行解释为机器码执行
  字节码 -.Ignition高频执行.-> HotSpot
  HotSpot --TurboFan--> 编译为机器码执行
阅读全文 »

前情提要

hexo发现经过CI之后,所有文章的 更新时间(mtime) 变成了CI运行的时间。

解决思路

在CI checkout代码时,使用文件最后一次涉及的commit时间作为文件的修改时间,进行mtime的恢复。

阅读全文 »

前情提要

公司里放了一台黑裙,但是没有公网IP,想到用openvpn拨到家里的路由器,再进行端口转发达到内网穿透,公网访问的目的。

总之的总之三步走,需要openwrt上有server,以及群晖能够有client进行拨入,最后配置端口转发


阅读全文 »

0.概念说明

一切开始的开始 先说明一些概念

物理卷(Physical Volume)即PV: 物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
卷组(Volume Group)即VG: LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
逻辑卷(Logical Volume)即LV: LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。

总之 LV建立在VG之上,VG建立在PV之上,是PV的集合,PV即物理卷。

本文的总体思路为: 扩容PV-> 扩容LV -> 扩容根目录空间

阅读全文 »

问题表现

vue.config.js中无法配置自定义devtool选项,无论是使用configureWebpack还是chainWebpack都无法改变source-map的类型。官方文档也没有提供相关的说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// vue.config.js
const Components = require('unplugin-vue-components/webpack')
const { ElementPlusResolver } = require('unplugin-vue-components/resolvers')
// 两种方式均无法更改devtool
module.exports = {
configureWebpack: {
devtool: "source-map",
// 2021.10.26更新 ↓罪魁祸首
plugins: [
Components({
resolvers: [ElementPlusResolver()]
})
]
},
chainWebpack: config => {
config
.devtool('source-map')
}
}
阅读全文 »