使用UrlQuerySanitizer来处理URL

网上对于 UrlQuerySanitizer 的资料比较少,这个是 Android 提供的一个用来处理 url 的 API。由于项目的需要,需要对 url 的 query 参数进行排序,因此需要解析 url 并处理 query 参数。

最初的方法是使用 Uri:

通过这样的方式就可以解析 url,并获取到各个 query 参数。但后来发现 Uri 不能处理一些特殊字符,比如#,Uri 会截断#以后的内容,这样就不能满足开发需求。经过各种 google,最后发现了一个 UrlQuerySanitizer 的 API:

首先要使用 setAllowUnregisteredParamaters 让其支持特殊字符,然后使用 setUnregisteredParameterValueSanitizer 来设置支持哪些特殊字符,UrlQuerySanitizer 提供了集中默认的 ValueSanitizer:

每种 ValueSanitizer 都对应过滤哪些字符,被过滤掉的特殊字符会被替换成_或者空格。
如果默认的 ValueSanitizer 不能满足开发需求,还可以自己构造 ValueSanitizer:

UrlQuerySanitizer 也可以通过 key 来获取相应的 value,比如给一个 url:http://coolerfall.com?name=vincent:

UrlQuerySanitizer 还可以只解析 query 参数,比如:name=vincent&article=first:

以上就是 UrlQuerySanitizer 大致用法,用来解析处理 url 非常的方便。

参考链接


使用 UrlQuerySanitizer 来处理 url

macOS Sonoma(14.2.1)通过UTM虚拟机编译Android 12.1源码过程总结(MacBook Pro 2023-Apple M2 Pro)

前置条件


根据 Google 官方文档,2021年6月22日之后的Android系统版本不支持在macOS系统上构建,我们在 Applic SiliconmacOS 系统是不能直接成功构建后续版本的,但是之前的版本可以在修改编译配置后成功编译,只是是否能正常运行存疑

尝试过使用 Podman Desktop / Docker 方式进行编译、也尝试过借助 OrbStackLima 这些纯虚拟机通过安装 ubuntu 22.04 系统镜像的方式进行编译,结果都在执行 lunch 命令的时候长时间卡住,观察系统进程发现名为 nsjail 进程的 CPU 占用持续卡住在 100% 上无法继续编译,并且由于 Docker 或者虚拟机文件系统是 Linux 文件系统,而宿主机的文件系统是 AppleFS 文件系统,导致需要进行文件转换,中间的转换性能代价非常高,性能很差。

相反,目前测试来看,直接在 UTM 虚拟机里执行编译的性能反倒更好一些。

目前测试发现存在严重的文件系统缺陷,编译/大量文件复制过程中,经常出现文件系统损坏,导致编译失败。

原因参考:

https://github.com/utmapp/UTM/pull/5869
https://github.com/utmapp/UTM/pull/5919

需要等待 UTM 合并到主分支。

另外,我们需要安装 Rosetta 2 支持运行部分 x86_64 应用。注意  Rosetta 2 只支持 64 位应用,不支持 32 位应用。 参考 Does Rosetta 2 support 32-bit Intel apps?

继续阅读macOS Sonoma(14.2.1)通过UTM虚拟机编译Android 12.1源码过程总结(MacBook Pro 2023-Apple M2 Pro)

ubuntu 22.04.3使用blivet-gui创建SoftwareRAID

最近家里安装降噪棉的时候使用了钉书钉,结果安装的时候,意外震坏了一块八年历史的老西数硬盘,造成数据丢失。

话说,西部数据的硬盘耐用性真的很成问题,家里至少已经坏了五块硬盘了,四块都是西部数据的。

于是另购了一块希捷的银河系列 16TB 硬盘,打算跟现存的一个刚刚替换的西部数据的 12TB 红盘(质保期之内坏了,走售后,花了一个多月换了一张盘,估计寿命也是堪忧),组一个 Raid 1 软阵列,到时候万一再有硬盘损坏,至少可以保住数据。

当前设备是使用 HP Gen8 上安装的 ubuntu 22.04.3 系统,四个盘位,其中两个从群晖上替换下来的 4TB 硬盘直接挂载到两个盘位上,依旧保持群晖的 Raid 1 软阵列。另外两个盘位,就是我们需要新组的软件 Raid 1 的位置了。

网上搜索了半天,都是需要通过命令行,逐个磁盘分区,分区之后再使用 mdadm 通过命令行组建阵列,虽然难度不大,但是操作比较繁琐,还是希望能在 UI 界面上点击一下鼠标搞定。

可以使用 storaged-project/blivet-gui 这个开源项目完成这个需求。

继续阅读ubuntu 22.04.3使用blivet-gui创建SoftwareRAID

QUIC 开源实现列表

QUIC的全称是 Quick UDP Internet Connections protocol,由 Google 设计提出,目前由 IETF 工作组推动进展,其设计的目标是替代 TCP 成为 HTTP/3 的数据传输层协议。本文章整理目前各大厂及主流编程语言的开源 QUIC 实现。

在线社区:discord/quic

维护者:YoMo

C/C++

Name Version Roles Handshake GitHub
Microsoft's MsQuic draft-29/v1 client, server TLS 1.3 RFC github.com/microsoft/ms
Facebook's mvfst draft-29 library, client, server TLS 1.3 github.com/facebookincu
Google's Chromium Q043, Q046, Q050, T050, T051, draft-27, draft-29 library, client, server QUIC Crypto, TLS chromium.org/quic/playi
ats (Apache Traffic Server) draft-29 client. server TLS 1.3 cwiki.apache.org/conflu
LiteSpeed's lsquic v1, Draft-34, Draft-29, Draft-27, Q043, Q046, and Q050 library, client, server QUIC Crypto, RFC 8446 github.com/litespeedtec
ngtcp2 draft-29, draft-30, draft-31, and draft-32 library, client, server TLSv1.3 (RFC 8446) github.com/ngtcp2/ngtcp
Cloudflare's nginx-cloudflare draft-27, draft-28, draft-29 server TLSv1.3 (RFC8446) github.com/cloudflare/q
picoquic draft-32/31/30/29/28/27 library and test tools, test client, test server TLS 1.3 (using picotls) github.com/private-octo
Pluginized QUIC draft-29 library, client, server TLS 1.3 (using picotls) github.com/p-quic/pquic
quant draft-33, draft-34, v1 library, client, server TLS 1.3 github.com/NTAP/quant
Fastly's quicly draft-27 client, server TLS 1.3 (final) github.com/h2o/quicly
nginx-quic draft-27 .. draft-32 server TLSv1.3 (RFC8446) hg.nginx.org/nginx-quic
XQUIC draft-29,v1 client, server TLS 1.3 github.com/alibaba/xqui

Rust

Name Version Roles Handshake GitHub
Cloudflare's quiche draft-27, draft-28, draft-29 library, client, server TLSv1.3 (RFC8446) github.com/cloudflare/q
Mozilla/Firefox's Neqo draft-27 through version 1 library, client, server TLS 1.3 github.com/mozilla/neqo
Quinn draft-28 library, client, server TLS 1.3 github.com/djc/quinn

Go

Name Version Roles Handshake GitHub
quic-go always the current draft library, client, server TLS 1.3 RFC github.com/lucas-clemen

Java

Name Version Roles Handshake GitHub
kwik draft-29, draft-30, draft-31, draft-32 library, client TLS 1.3 bitbucket.org/pjtr/kwik

Node.js

Name Version Roles Handshake GitHub
Node.js QUIC draft-25 client, server TLS 1.3 github.com/nodejs/quic
quicker draft-22 client, server TLS 1.3 github.com/rmarx/quicke

Python

Name Version Roles Handshake GitHub
aioquic draft-29 through version 1 library, client, server TLS 1.3 github.com/aiortc/aioqu

Haskell

Name Version Roles Handshake GitHub
Haskell quic draft-29 library, client, server TLS 1.3 github.com/kazu-yamamot

参考链接


QUIC 开源实现列表

云服务器 ECS Linux SSH 客户端断开后保持进程继续运行配置方法

在云服务器 ECS Linux 系统中,通常我们在执行一些运行时间比较长的任务时,必须等待执行完毕才能断开 SSH 连接或关闭客户端软件,否则可能会导致执行中断。

本文介绍几种保障程序在用户退出登录后持续运行的方法。

使用 nohup 执行


nohup 的作用顾名思义,它使得后面的命令不会响应挂断(SIGHUP)信号。也就是说,通过远程登录执行 nohup 后,即使退出登录后,程序还是会正常执行。通常情况下,nohup 命令最后会跟上 & 字符,表示将这个命令放至后台执行,这样才能真正做到将这个命令放至后台持续的执行。

操作示例:
1. 正常的执行命令为 bash hello.sh,执行结果为每秒输出一行的小程序:

2. 在命令头尾分别加上 nohup 和 &,变为 nohup bash hello.sh &,可以看到 nohup 输出了一行信息,再按一下回车键就跳回了 shell 命令行,此时命令已经在后台执行了,nohup 将命令的输出重定向至当前目录的 nohup.out 文件中。同时注意到 nohup 会将对应程序的 PID 输出,PID 可用于需要中断进程时 kill 进程。

3. 通过 tail -f nohup.out 可以持续的查看 nohup.out 的输出,达到监视程序的效果。

4. 在命令中也可以使用重定向将程序的输出改为自己想要的文件名,如 nohup bash hello.sh >hello.log &,则程序的输出就会写到 hello.log 文件中。

5. 若程序不会自动退出,那么此时需要使用 kill 命令来结束进程。比如,可以使用命令 kill -TRM <PID> 来操作,其中 PID 即为之前 nohup 输出的值,在此例中该值为 1231。

使用限制:

nohup 通常用于执行无干预的自动化程序或脚本,无法完成带有交互的操作。

使用 screen 执行


安装 sceen 工具

Linux 系统默认未自带 screen 工具,需要先进行安装:

  • CentOS 系列系统: yum install screen
  • Ubuntu 系列系统: sudo  apt-get  install screen
使用简介

1. 创建 screen 窗口

2. 列出 screen 进程,并进入所需 screen

如下图

然后进行所需操作,比如运行脚本、执行程序等等。

如下图示例:创建ftp连接后台下载传输文件

3. 退出保存

前述 ftp 操作示例开始传输后,在窗口中键入Ctrl+a 键,再按下 d 键,就可以退出 SSH 登录,但不会影响 screen 程序的执行。

4. 保存会话以便继续执行

可以利用 screen 这种功能来管理的远程会话。操作步骤概述:

  • 正常 SSH 登录服务器
  • 创建 screen 窗口
  • 执行所需任务
  • 需要临时中断退出时,Ctrl + a 再按下 Ctrl + d 保存退出
  • 需要继续工作时,再次 SSH 登录服务器,然后直接执行 screen -r -d 恢复会话即可。

参考链接


云服务器 ECS Linux SSH 客户端断开后保持进程继续运行配置方法