Dec 06

三角洲行动国际服上线,想来玩一把,没想到遇到一堆问题。由于国际服是强制锁区,所以 UU 加速开启国际服加速时,会一并加速 Steam 客户端,否则游戏会提示 “对此地区不可用”。由于不想多个虚拟网卡,所以之前我一直只用 进程加速 模式。启动 UU 加速器后再启动 Steam 客户端,发现商店就进不去,Proxifier 日志疯狂报错:

这个 127.100.163.1 从哪来的呢? 通过分析 UU 日志,发现 UU 修改了系统 hosts 文件,添加了如下内容:

然后通过邮件联系 Proxifier 支持,官方回复解决方法如下:

Add the following key to HKEY_CURRENT_USER\Software\Initex\Proxifier\Settings:
FakeSubnet(REG_DWORD)=100 (64 in hex)

Alternatively, you can use this command to create the key automatically:
reg add HKCU\Software\Initex\Proxifier\Settings /v FakeSubnet /t REG_DWORD /d 100

To activate the option, you need to restart Proxifier. It should output message like the following on start:
Fake IPv4 subnet = 100

1. 注册表编辑器找到 HKEY_CURRENT_USER\Software\Initex\Proxifier\Settings ,添加 REG_DWORD, 名称 FakeSubnet , 值为 100 (16进制的 64);
2. 或者直接用以下命令:

reg add HKCU\Software\Initex\Proxifier\Settings /v FakeSubnet /t REG_DWORD /d 100

然后重启 Proxifier 即可。修改成功的话启动日志会有:

Fake IPv4 subnet = 100

BTW: 后续发现,只有在使用 UU 加速器 进程模式 且选择特定的一些服务器上会出现这个冲突,路由模式是没有问题的,因为路由模式并不会修改 hosts 文件。进程模式有一些服务器也不会有问题,这时候打开 hosts 文件你会发现 UU 添加的项目 IP 不是 fake IP 而是真实的 IP 地址。冲突的根源就是当 UU 添加了类似 127.100.*.* 的项目到 hosts 文件中时,会与 Proxifier 的远程 DNS 解析使用的 fake IP 池冲突(127.8.*.*)


Jul 07

运行在 U 盘的系统随着时间推移越来越大已经不能备份在 N1 的 EMMC 里,突然损坏的话就要做很多重复工作来复原。直接做盘对盘克隆有个限制就是目标盘必须比源盘容量大,同样是标称 8G 的 U 盘,非常有可能实际可用容量是不一样的,之前就是因为这样把一个 8G 的系统盘一直备份成了 64G 的 U 盘.。。。将要介绍的备份方法则没有这个限制,只要主分区(一般是 ROOTFS)的实际数据使用量不大于备份盘容量即可。

首先用 DiskGenius 将 U 盘的两个主要分区备份为: BOOT.pmf 和 ROOTFS.pmf 文件。注意这里 BOOT 分区备份最好选择 “备份所有扇区” 模式,因为这个分区并不大;而 ROOTFS 分区则选择 “按文件备份” 模式,这样我们就可以把整个系统恢复到较小的 U 盘上。(只要实际数据不大于恢复盘的总容量)

然后在 Linux 桌面模式(可以是虚拟机)把原系统的初始镜像 (比如: Armbian_20.10_Arm-64_focal_current_5.9.0.img) 恢复到新的 U 盘。因为初始镜像最小,我们其实只需要恢复这个系统默认的分区表和文件结构。这里推荐使用 balenaEtcher。恢复完成后用 GParted 或者 KDE Partition Manager 无损调整 ROOTFS 分区至你需要的大小,还可以在这个阶段创建 SWAP 分区。这一步理论上也可以在 Windows 下完成,比如恢复用 USB Image Tool,balenaEtcher Windows 版本等工具,然后用 DiskGenius 调整分区大小,但经过数次测试,这些对于 EXT 分区的操作在 Windows 下非常容易出错不能完成,或者完成后的 U 盘不能启动,或者是文件结构/分区表有问题。

最后在 DiskGenius 中把之前备份的 BOOT 和 ROOTFS 文件恢复到 U 盘对应的分区。

保险起见可以把这个盘最后一次加载到 Liunx 下用 fsck 检查一下各个分区。


Jun 29

armv5 架构下用 Tomatoware 静态编译 Zerotier 会出现 atomic 原子操作错误,解决的办法就是增加 -latomic 和删除 -pie:

#atomic error, add -latomic and delete -pie

# Static builds, which are currently done for a number of Linux targets
ifeq ($(ZT_STATIC),1)
	override LDFLAGS+=-static
	LDLIBS+=-latomic
endif

LDFLAGS=-pie -Wl,-z,relro,-z,now  ----> LDFLAGS=-Wl,-z,relro,-z,now

VFP 相关错误则需要修改 make-linux.mk 文件:

# ARM32 hell -- use conservative CFLAGS
ifeq ($(ZT_ARCHITECTURE),3)
	ifeq ($(shell if [ -e /usr/bin/dpkg ]; then dpkg --print-architecture; fi),armel)
		override CFLAGS+=-march=armv5t -mfloat-abi=soft -msoft-float -mno-unaligned-access -marm
		override CXXFLAGS+=-march=armv5t -mfloat-abi=soft -msoft-float -mno-unaligned-access -marm
		ZT_USE_ARM32_NEON_ASM_CRYPTO=0
	else
		override CFLAGS+=-march=armv5t -mfloat-abi=soft -msoft-float -mno-unaligned-access -marm
		override CXXFLAGS+=-march=armv5t -mfloat-abi=soft -msoft-float -mno-unaligned-access -marm
		ZT_USE_ARM32_NEON_ASM_CRYPTO=0
	endif
endif

Phicomm N1 下 aarch64 编译应使用:

CC=aarch64-linux-gcc CXX=aarch64-linux-g++ make -j`nproc` ZT_STATIC=1 ZT_SSO_SUPPORTED=0 ZT_CONTROLLER=0

因为如果编译 ZT_CONTROLLER 就需要 Rust,耗时太长,没什么必要。


Oct 29

1. 下载并安装 uBlock Origin

2. 打开插件, 点击右侧齿轮图标, 选择"自定义静态规则", 贴入以下代码:

youtube.com##+js(set, yt.config_.openPopupConfig.supportedPopups.adBlockMessageViewModel, false)
youtube.com##+js(set, Object.prototype.adBlocksFound, 0)
youtube.com##+js(set, ytplayer.config.args.raw_player_response.adPlacements, [])
youtube.com##+js(set, Object.prototype.hasAllowedInstreamAd, true)

3. 在 uBlock Origin 设定页面中,选择“规则列表”,按下“清除所有缓存”,接着按“立即更新”。

4. 在 Youtube 页面,关闭除了 uBlock Origin 以外的其它广告拦截器,如 Adblock。

5. 刷新页面即可。

6. 若突然无法观看,请重复步骤 3。


Oct 07

哦,原来视频流式传输需要这么优化:

Optimizing MP4 Video for Fast Streaming
Tools to fix MP4 videos so players can start playback instantly (without downloading the whole file)
Understanding the M.P.E.G-4 moov atom: Pseudo-Streaming in Mp4

检测视频文件是否已经为流式传输优化:

mp4box -info A.mp4 2>&1 1>NUL | find "File suitable for progressive download (moov before mdat)"
#或者
AtomicParsley input.mp4 -T | sed -n 2p | grep -q "moov" && echo "yup" || echo "nope"

那么就撸个批处理干,支持 mp4/mkv/mov/m4v 格式的优化。

#!/bin/bash

[ -n "$1" ] && {
    src_folder="$1"
} || {
    echo "input you source folder location."
    exit
}

src_empty=$(ls -A "$src_folder")

[ -n "$src_empty" ] && {
    for file_a in ${src_folder}/*
    do
        in_full_filename=$(basename "$file_a")
        in_filename="${filename%.*}"
        in_extension="${file_a##*.}"
        out_full_filename="${in_filename}_.${in_extension}"

        echo "src=$in_full_filename ndst=$out_full_filename"

        case $in_extension in
            mp4|mov|m4v)
                ffmpeg -i "${src_folder}/${in_full_filename}" -movflags faststart -acodec copy -vcodec copy -copyts "${src_folder}/$out_full_filename"
                ;;
            mkv)
                ffmpeg -i "${src_folder}/${in_full_filename}" -c copy -reserve_index_space 100k -copyts "${src_folder}/$out_full_filename"
                ;;
            *)
                echo "${in_extension} file not support faster start."
                ;;
        esac

        [ $? -eq 0 ] && {
            rm -f "${src_folder}/${in_full_filename}"
            mv -f "${src_folder}/$out_full_filename" "${src_folder}/${in_full_filename}"
            echo "-----------${in_filename} now faster web loading------------"
        } || {
            echo "-----------${in_filename} faster process failed------------"
        }
    done
} || {
    echo "Source folder is empty."
}

Windows 版本,丢到要处理的视频目录下:

for /r %%F in (*.mp4) do (
    ffmpeg.exe  -i "%%F" -movflags faststart -acodec copy -vcodec copy -copyts "%%~dpnF"_.mp4
    if not errorlevel 1 if exist "%%~dpnF.mp4" (
		del /q "%%F"
		move "%%~dpnF"_.mp4 "%%F"
	)
)

for /r %%F in (*.mov) do (
    ffmpeg.exe  -i "%%F" -movflags faststart -acodec copy -vcodec copy -copyts "%%~dpnF"_.mov
    if not errorlevel 1 if exist "%%~dpnF.mov" (
		del /q "%%F"
		move "%%~dpnF"_.mov "%%F"
	)
)

for /r %%F in (*.mkv) do (
    ffmpeg.exe  -i "%%F" -c copy -reserve_index_space 100k -copyts "%%~dpnF"_.mkv
    if not errorlevel 1 if exist "%%~dpnF.mkv" (
		del /q "%%F"
		move "%%~dpnF"_.mkv "%%F"
	)
)

for /r %%F in (*.wmv) do (
    ffmpeg.exe  -i "%%F" -movflags faststart -copyts "%%~dpnF".mp4
    if not errorlevel 1 if exist "%%~dpnF.wmv" (
		del /q "%%F"
	)
)

for /r %%F in (*.mpg) do (
    ffmpeg.exe  -i "%%F" -movflags faststart -copyts "%%~dpnF".mp4
    if not errorlevel 1 if exist "%%~dpnF.mpg" (
		del /q "%%F"
	)
)

for /r %%F in (*.flv) do (
    ffmpeg.exe  -i "%%F" -movflags faststart -copyts "%%~dpnF".mp4
    if not errorlevel 1 if exist "%%~dpnF.flv" (
		del /q "%%F"
	)
)

for /r %%F in (*.rmvb) do (
    ffmpeg.exe  -i "%%F" -movflags faststart -copyts "%%~dpnF".mp4
    if not errorlevel 1 if exist "%%~dpnF.rmvb" (
		del /q "%%F"
	)
)

for /r %%F in (*.rm) do (
    ffmpeg.exe  -i "%%F" -movflags faststart -copyts "%%~dpnF".mp4
    if not errorlevel 1 if exist "%%~dpnF.rm" (
		del /q "%%F"
	)
)

[1/59]  1 2 3 4 5 6 7 8 9 10 > ... »