Thoughts, stories and ideas.

在 remix v2 中使用 CJS 作为服务端模块格式

在 remix v2 版本中默认的服务端模块格式是 ESM,这在 nodejs 环境中,有些包由于没 有提供 ESM exports 从而导致无法使用这些包,这时可以将模块格式改成 CJS 。 首先在 remix 配置文件 remix.config.js, 服务端启动文件 server.js 的后缀由 .js 改成 mjs,然后在 remix.config.mjs 中,将 serverModuleFormat 的值改 成 cjs。 然后在 package.json 中,去掉 type: "module",并将 scripts 里的 server.js

9p

使用宿主机的目录作为 QEMU 虚拟机的主文件系统

一般我们在使用 KVM/QEMU 虚拟机时,都是需要创建一个 block 设备,然后格式化成文件系统作为里面的主文件系统(rootfs)来使用的。但这里有个问题,就是在创建设备文件时,需要预先设定该 block 设备的大小,一旦设置好,在使用过程中如果发现空间不足需要扩容,修改起来就不是那么方便了。 使用虚拟机的另一个问题就是怎么便捷地与宿主机交换文件,通常情况下会使用 nfs/smb 这些网络文件系统协议,但这需要先部署它们 才能使用,没办法做到开箱即用。 通过搜索发现有两种方案可以实现共享宿主机的目录给虚拟机用,分别是 virtio-fs 和 9pfs,virtio-fs 需要先启动 virtfsd 服务,通过 libvirt 来启动虚拟机时如果配置了共享目录,会自动启动该服务,但通过 qemu 直接启动虚拟时就需要手动启动 virtfsd 了。而 9pfs 则没有这个问题,是 qemu 内置支持的,

zhihu

关于网站跳转、弹窗、唤起 APP 的“伪”技术分析(知乎篇)

首先,这里的网站跳转、弹窗、唤起 APP 都是指在非用户的意愿下、擅自将用户带离当前 页面,跳转到或弹出一些广告、推广的页面或唤起 APP 来执行一些广告或推广操作。 主要目的是获取广告展示或点击的收益、下载安装推广软件(APP)的收益以及唤起 APP 获取其举办的活动收益。 上面的这些行为可以分为主动跟被动的。主动指是网站自己加入相关代码来触发,这种一般 出现在一些垃圾站上。被动是指网站被植入了恶意代码而触发的,这种情况可能是网站自己 并不知情的,但能发生这种情况,说明存在安全漏洞,或者安全方面做得不到位,导致网站 的流量被劫持了。 流量劫持,有可能发生 ISP 的通信设备上,还有可能在用户的路由器、电脑里(被安装了恶意软件)。 流量劫持是如何发生的呢? 先简单说下我们打开一个网站,其背后所发生的一个过程。 在浏览器中,从我们输入一个链接(URL),按回车后。 首先浏览器会将链接的域名部分提取出来,进行域名解析,以得到一个 IP 地址。 这里可能会发生第一次被劫持:

android

通过 ssh 命令临时地使用 Android 作为 SOCKS 4/5 服务器

最近需要在一台 Linux 的 PC 上访问 Wikipedia,但不好在这台电脑上安装一些软件。刚 好自己的手机开启了 VPN 可以正常访问到 Wikipedia。然后无意间在浏览 ssh man page 时,看到可以在 Android 机上使用 ssh 的 -R [bind_address:]port 选项来开启一个 SOCKS5。这样一来,似乎就可以在 PC 上通过 SOCKS5 转发请求到 Android 机上,然后 再通过 Android 开启 VPN 来访问 Wikipedia 了。经过测试,可以正常工作,以下是折腾 过程。 PC 上确保已经开启了

使用 GnuPG(OpenPGP) ECC(ed25519/ecc25519) 密钥作为 ssh 登录密钥

本文的操作在 Arch Linux 下进行,没有在其他 Linux 发行版下测试过,因此无法保证其他的 Linux 发行版也可以正常工作。 首先生成相应的公私钥 生成主密钥 gpg --full-gen-key --expert PS: 这里因为要生成 ECC 类型的密钥,因此需要使用 expert 模式才可以 Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) (7) DSA (set

WireGuard

WireGuard 配置和上网流量优化

本文涉及到 WireGuard 的使用介绍、国内外流量的分流等内容 WireGuard 安装在使用 WireGuard 之前,需要分别在服务器和本地安装。 由于本人的服务器上使用 debian 9、本地使用 Arch Linux,因此这里只给出这两种系统上的安装方式,其他系统上的安装可以在官网找到。 Debianecho "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list printf 'Package: *\nPin: release a=unstable\nPin-Priority: 150\n' > /etc/apt/preferences.d/limit-unstable apt

ssh

使用 ssh 连接相同 ip 不同主机时的 fingerprint 冲突问题

最近将家里的路由器刷了 openwrt,当使用 ssh 连接路由器时,提示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the RSA key sent

centos7

在 KVM 上安装 CentOS 7 过程记录

最近,由于 Crissic Solutions 关闭了服务,导致我不得不又要去寻找其他便宜点的 VPS 了,刚好 hostdo 有优惠,有个 KVM 的套餐价格与之前 Crissic 的一样。因此有买了一年。 刚下订单后,服务没立即开通,可能需要审核,等了比较久,于是发了一个 Ticket,在第 2 天登录后,发现已经开通了。购买时机房选洛杉矶的,从广州 ping 了下 time 值只有 160-180ms 左右,已经不错了,之前的 Crissic 基本上在 200ms 以上的。 由于在下订单选择操作系统的时候,选择了 None (More OS available after provisioned) ,因此在开通后的服务还没有操作系统,

rollup

Rollup: Error parsing /tmp/example.js: The keyword 'await' is reserved (1:18) in /tmp/example.js

解决方法 在 rollup 的配置(如 rollup.config.js)里加入: export default { //..., acorn: { allowReserved: true, }, //..., } 错误分析 一般出现这种错误是由于 js 里使用了保留字(Reserved Word)作为函数名或者变量名导致的, 因为 rollup 使用 acorn 将 js 解析成 AST,而在 acorn 中,只有 ecmascript 3 才被允许使用保 留字作为函数名或变量名,更高版本的 ecmascript 默认会报错,除非使用 allowReserved: true 选项来明确允许使用。 我们写代码时,也会避免使用保留字作为函数名或变量名,但有时会使用它们作为对象的 key 来使用,例如:

nodejs

非 root 用户安装和配置 NodeJS

本文主要针对 Linux 非 root 用户,在没有 root 权限下如果安装及配置 NodeJS(注:这里安装的是官网上已经编译好的二进制包)。 首先到 NodeJS 的官网(https://nodejs.org/en/download/)下载对应的已经编译好的 二进制包。 这里以 CentOS 6 32bit 为例,安装 NodeJS 的 LTS 版本: 下载 Linux Binaries 32bit 版本: curl -o node-v4.4.2-linux-x86.tar.xz https://nodejs.org/dist/v4.4.2/

postgresql

pg_restore: [directory archiver] could not open input file "xxx/xxx.dat": Value too large for defined data type

最近将本地的一个数据库搬到 VPS 上,在导入时出现了一个”Value too large for defined data type“的错误。通过 Google 搜索后发现没有实际的解决方案,但大致了解了下(http://www.gnu.org/software/coreutils/faq/coreutils-faq.html#Value-too-large-for-defined-data-type)出错的原因,可能是因为 VPS 的系统是 32bit,而其中需要导入的一个 xxx.dat.gz 文件的太大导致的。 由于在本地使用 pg_dump -Fd 来导出,该选项导出为文件夹,其中数据库的每个表的数据为一个经过 gzip 压缩的文件,后缀为 .dat.gz。该导出方式不能直接通过 psql

postgresql

在 CentOS 中安装 postgresql

安装 配置 YUM 仓库,编辑 /etc/yum.repos.d/Centos-Base.repo 中的 [base] 和 [updates] 部分,在这两部分中添加以下行: exclude=postgresql* 安装 PGDG RPM 文件,在 http://yum.postgresql.org 中查找你需要安装的相应版本的链接,然后运行以下命令安装: yum localinstall https://download.postgresql.org/pub/repos/yum/9.5/redhat/rhel-6-i386/pgdg-centos95-9.5-2.noarch.rpm 安装 Postgresql 列出可用的包:

canvas

获取鼠标在 canvas 中的位置

一般情况 一般情况下,如果需要在 canvas 中获取鼠标指针坐标,可以通过监听鼠标的 mousemove(如果只需单击时的坐标,可以用 click)事件。 当事件被触发时,我们可以获取鼠标相对于 viewport 的坐标(event.clientX, event.clientY)。 同时,我们可以通过 canvas.getBoundingClientRect() 来获取 canvas 相对于 viewport 的坐标,这样我们就可以计算出鼠标在 canvas 中的坐标。 canvas.addEventListener("click", function __handler__(evt) { var x = evt.clientX; var y = evt.clientY; var rect = canvas.

fc-match

fc-match 使用简介

在修改 gvim 的字体时,发现有些字体显示得不一样,于是查看了 fontconfig 的配置文件 ~/.config/fontconfig,但未找到问题所在。 于是想通过查看字体的加载顺序来进行排查,通过浏览 fonts-conf 及 google,发现可以 通过 fc-match 来查看字体的匹配情况。但 man fc-match 的介绍非常简单,导致刚开始 不知道怎样用,后来通过 man 了 fontconfig 的其他工具(fc-list)以及 fonts-conf, 大致了解了如何使用它,本文将简单的介绍下。 从 fc-match -h 的结果看: usage: fc-match [-savVh] [-f FORMAT] [--sort] [--all] [--verbose] [--format=FORMAT] [--version]

virtualbox

捕获 Virtualbox 虚拟机的网络流量

本文使用 wireshark 进行抓包(或查看),操作系统为 ArchLinux。 除了最后一个方案,本文的其他方案都需要一个 TAP,最终使用 wireshark 来捕获 Virtualbox 的流量也是使用这个接口的。 以下是创建一个名为 tap0 的 tap: # ip tuntap add dev tap0 mode tap user ${USER} $ ip tuntap show tap0: tap UNKNOWN_FLAGS:800 user 1000 # ip link set dev tap0 up 方案一:使用 bridge 该方案不支持出口网络(需要桥接的可以连接外网)的网卡是无线网卡。在这里假定该网卡名为

centos7

在 CentOS 7 中修改 sshd 的端口

编辑 /etc/ssh/sshd_config 添加/修改 Port XX 行(把 XX 改成需要设定的端口) 查看防火墙是否开启 systemctl status firewalld.service 如果开启,需要在防火墙上开放上面的端口: # 先查看是否已经添加了 firewall-cmd --zone=public --list-port # 如果添加了该端口,可忽略这条命令。把 XX 改成实际需要修改的端口 firewall-cmd --zone=public --add-port=XX/tcp --permanent # 重新加载 firewall-cmd --reload 查看 SELinux 是否开启 sestatus -v 如果显示 disabled 则表示 SELinux 已经关闭,