分类: 技术

  • 迁移 Google Photo 到云上贵州 iCloud Photo

    最近女友送我一台 iPhone,所以就有了如此逆向的操作,估计也就只有中国大陆的玩机用户需要这样吧。

    Google photo to iCloud 美区可以直接使用 Google Takeout 一键转移

    (更多…)
  • WebM/WebP to GIF with semi-transparency

    Preface

    Due to Add support of animated sticker #78

    There is currently no direct way to convert WebM to GIF this on the Internet.

    My idea is: WebM -> WebP -> GIF (due each steps have existing tools)

    Here are the difficulties we need to overcome:

    1. Remove vp8/9 from WebM to let we more easy to do next (Refer How can I convert WebM file to WebP file with transparency?)
    2. Convert WebP to GIF (Refer How to Convert WebP image to Gif with Python?) and handling semi-transparent pixels (here is what we need to face)
    (更多…)
  • Cut and move Runs via python-docx

    I want to cut and paste a run in one same document, but python-docx(1.1.0) don’t have the function.

    Here are some related page, but it doesn’t solve the problem:
    How do I copy the contents of a word document?
    Copy paragraphs elements from one document to another
    (更多…)
  • 代码即操作系统(UpgradeAll 2 开发计划)

    随着我使用的电子产品越来越多,跨度涉及 Linux 桌面/服务器,Android。我发现,备份还原的操作系统配置是有极限的,极限在于它未曾理解,也无法理解数据的意义。

    DNS hosts 与软件数据库缓存,在它眼里看来,都是一样的“文件”。

    过去

    这带来一个想法,就是代码即架构,也就是 Ansible、Terraform 等,但是它们在“代码”,这个概念的理解上,却出了大差错。软件代码,在软件停止运行后,软件的大部分副作用会消失,而那一小部分副作用也可以以测试代码的形式覆盖。

    现状

    操作系统,并不会随着 Ansible 或者 Terraform 停止运行而关机,其副作用,也不会因为我删除了 Ansible 里的一行代码并重新运行就会消失,于是这时候,便产生了所谓的“配置偏移”,这些传统的代码即架构的软件以“幂等性”来“自欺欺人”式的解决了这个问题,确实“幂等性”很重要,它会避免重复配置或者不必要的重复导致的错误,但是并不能解决这个回滚问题。

    然而,大部分操作都是可以回滚的,甚至配置得当,文件删除也是可以回滚的。现代操作系统已经为我们提供了很多回滚工具,git、文件系统快照、甚至最简单的文件回收站。但是,因为从运维角度编码,可复现与回滚,直接萎缩成了一次性快照,也就是 OCI 与 NixOS 之流。

    未来

    我在这里提出一个新的构建系统,也就是从程序员的角度运维。为一切可以回滚的操作添加支持,如果你在配置代码中删除了一个操作,那么在下次运行时将会对那一个特定操作进行自动回滚。

    此外,我也认为安装软件,维护系统这种经验,应该作为群体智慧被编程的方式保留下来,而不是让人们一次又一次的去重复学习简单的劳动。

    运维的未来应当像 NixOS,面向功能,而绝非面向软件与包。

    这个系统应当满足以下特性:

    1. 面对终端的普通用户
    2. 面对目标,也就是面对一些“单元测试”,因为操作系统应当为功能服务,而不是软件这个概念
    3. 可回滚
    4. 单机应用,可以远程运行,但是应当首要支持单机运行
    5. 与现有的运维技术兼容,并尽量使用现有的运维技术进行配置(初版暂定使用 Ansible),我们的世界不需要更多轮子了
    6. 可自动检查一个现有的,已经配置的操作系统,并生成配置代码
    7. 逻辑代码应当灵活,这个项目提出的一部分原因就是希望推进 Gentoo 的发展。(源码的自由是选择的自由,也是保证自由的基石)

    对于 Android

    而这个系统在 Android 上的体现会是 UpgradeAll

    因为我希望 UpgradeAll 可以拥有这些特性:

    1. 从源码编译(你可以随意使用开发者没有合并的分支与功能)
    2. 面对开发者友好(你可以编程你的更新流程)
    3. 面对用户友好(你可以只考虑需要什么功能,而不是寻找应用,这应该让开发者来做,参考 quickenergy)
    4. 促进 Android 应用开放化(Android 应用的封闭性在我看来有很大部分是因为深刻骨髓的二进制分发,tui)
  • 手动线刷任意 Android ROM

    通过 Fastboot 与 payload_dumper,我们可以在任意时刻刷入任意我们需要的 ROM。

    (更多…)
  • exa 仅显示点文件

    exa 是一个 ls 程序的替代品,旨在提供更加友好与多彩的用户界面,其期望与 bat 相似。

    背景

    在简单尝试 exa 后,我决定 alias 替换 ls 来体验一段时间,然后发现 ls -al --ignore="[^.]*" 命令无法被直接替换,因为 exa 没有 ignore 接口。

    测试命令

    在查找文档后,发现 exa 拥有基于 glob 语法的过滤(文档的 Filtering 节)。

    所以仅显示点文件的命令应该是

    exa -la --ignore-glob="[!.]*"

    其中,!意指不包括。

    添加 alias

    最后,我修改后的 rc 文件为(color 只是为了方便之后切换回 ls,exa 默认开启)

    alias ls='exa'
    alias l.='exa -la --ignore-glob="[!.]*"'
    alias ll='ls --color=auto -l'
    alias la='ls --color=auto -la'
  • Pipewire 多设备输出

    今天想和朋友一起听歌,把ta的蓝牙耳机连到电脑上后发现 KDE 界面只能设置一个音频输出端口。想起来上次 Steam Link 的经验,决定使用 Pipewire 实现这个功能。

    参考资料:
    https://xzos.net/steam-for-linux-no-sound-when-streaming/
    https://bbs.archlinux.org/viewtopic.php?pid=1986792#p1986792
    1. 查找音频设备
    $ pw-link -o
    Midi-Bridge:Midi Through:(capture_0) Midi Through Port-0
    v4l2_input.pci-0000_00_14.0-usb-0_6_1.0:out_0
    alsa_output.pci-0000_00_1f.3.analog-stereo:monitor_FL
    alsa_output.pci-0000_00_1f.3.analog-stereo:monitor_FR
    alsa_input.pci-0000_00_1f.3.analog-stereo:capture_FL
    alsa_input.pci-0000_00_1f.3.analog-stereo:capture_FR
    easyeffects_sink:monitor_FL
    easyeffects_sink:monitor_FR
    easyeffects_source:capture_FL
    $ pw-link -o
    Midi-Bridge:Midi Through:(capture_0) Midi Through Port-0
    v4l2_input.pci-0000_00_14.0-usb-0_6_1.0:out_0
    alsa_output.pci-0000_00_1f.3.analog-stereo:monitor_FL
    alsa_output.pci-0000_00_1f.3.analog-stereo:monitor_FR
    alsa_input.pci-0000_00_1f.3.analog-stereo:capture_FL
    alsa_input.pci-0000_00_1f.3.analog-stereo:capture_FR
    easyeffects_sink:monitor_FL
    easyeffects_sink:monitor_FR
    easyeffects_source:capture_FL
    easyeffects_source:capture_FR
    ee_soe_output_level:output_FL
    ee_soe_output_level:output_FR
    ee_soe_spectrum:output_FL
    ee_soe_spectrum:output_FR
    ee_soe_equalizer:output_FL
    ee_soe_equalizer:output_FR
    ee_soe_convolver:output_FL
    ee_soe_convolver:output_FR
    ee_sie_output_level:output_FL
    ee_sie_output_level:output_FR
    ee_sie_spectrum:output_FL
    ee_sie_spectrum:output_FR
    Audacious:output_FL
    Audacious:output_FR
    steam:output_FL
    steam:output_FR
    bluez_output.84_AB_26_A6_8A_6A.a2dp-sink:monitor_FL
    bluez_output.84_AB_26_A6_8A_6A.a2dp-sink:monitor_FReasyeffects_source:capture_FR
    ee_soe_output_level:output_FL
    ee_soe_output_level:output_FR
    ee_soe_spectrum:output_FL
    ee_soe_spectrum:output_FR
    ee_soe_equalizer:output_FL
    ee_soe_equalizer:output_FR
    ee_soe_convolver:output_FL
    ee_soe_convolver:output_FR
    ee_sie_output_level:output_FL
    ee_sie_output_level:output_FR
    ee_sie_spectrum:output_FL
    ee_sie_spectrum:output_FR
    Audacious:output_FL
    Audacious:output_FR
    steam:output_FL
    steam:output_FR
    bluez_output.84_AB_26_A6_8A_6A.a2dp-sink:monitor_FL
    bluez_output.84_AB_26_A6_8A_6A.a2dp-sink:monitor_FR

    确认希望使用的音频设备为 alsa_output.pci-0000_00_1f.3.analog-stereobluez_output.84_AB_26_A6_8A_6A.a2dp-sink

    2. 连接创建虚拟设备

    $ pactl load-module module-null-sink media.class=Audio/Sink sink_name=Simultaneous channel_map=stereo
    536870913  # 模块 ID,不用记

    3. 连接设备

    # 顺序不影响结果
    $ pw-link Simultaneous:monitor_FL bluez_output.84_AB_26_A6_8A_6A.a2dp-sink:playback_FL
    $ pw-link Simultaneous:monitor_FR bluez_output.84_AB_26_A6_8A_6A.a2dp-sink:playback_FR
    $ pw-link Simultaneous:monitor_FL alsa_output.pci-0000_00_1f.3.analog-stereo:playback_FL
    $ pw-link Simultaneous:monitor_FR alsa_output.pci-0000_00_1f.3.analog-stereo:playback_FR

    4. 去 KDE 设置里选择

    KDE 音频设置界面

    5. 卸载模块

    用完后可以卸载模块

    $ pactl unload-module module-null-sink
  • DP-3T 保护隐私的“健康码”

    人们总是选择并相信符合直觉的解释与方案,这导致了平庸

    DP-3T,一个保护隐私的接触者追踪软件,就好象健康码

    健康码,从全知全能的视角出发来“保护”每个人,这几乎可以预测一定会发生老大哥事件。

    而另一方面,从最小知识出发,基于随机 ID 与地理位置的 P2P(蓝牙)则避免了这些。

    这不符合人类作为个体的直觉,但加密货币的出现证明了这种实现的基础。

    更进一步的,参考加密货币的“价值网络”与“行为创造价值”的“权益证明”。我认为,我们可以引入加密货币的代币奖励机制,避免用户重置 ID。同时,用区块记录的方式计时与发放时间积分,保证用户手机尽力在线(除不可抗力导致的断网)与14天的检测期。

🌍 Language