分类 随手记 下的文章

前段时间我去爬山,回来写了文章:朱雀国家森林公园痛苦一日游
上传图片的时候发现当前时代的浏览器并不支持浏览HEIF格式的图片,但是这一标准在苹果和许多较新安卓设备上都已经开始推广,并且压缩率不错,所以能不能想办法让浏览器显示HEIF格式的图片呢?

找到所需开源项目:

hoppergee/heic-to Convert HEIC/HEIF images to JPEG, PNG in browser
我的需求显然早就有人在做了,这个项目利用javascript提供了一个在前端将HEIF格式图片转换成jpeg/png的方案。

引用heic-to

工作原理:

  1. 自动检测所有带有.heic或.HEIC扩展名的图片
  2. 使用fetch API获取原始HEIC文件
  3. 在浏览器中转换为JPEG格式
  4. 替换图片的src属性显示转换后的图片
<script type="module">
// 导入CSP安全版本的HEIC转换模块 需要支持ES6特性
import { heicTo } from 'https://cdn.jsdelivr.net/npm/[email protected]/dist/csp/heic-to.js';

document.addEventListener('DOMContentLoaded', async function() {
    // 检查浏览器是否支持所需API
    if (!window.fetch || !window.URL || !window.Blob) {
        console.warn('浏览器不支持HEIC转换所需API');
        return;
    }
    
    // 处理HEIC图片转换
    async function processHEICImages() {
        const images = document.querySelectorAll('img[src$=".heic"], img[src$=".HEIC"]');
        if (images.length === 0) return;
        
        console.log(`找到 ${images.length} 张HEIC图片,开始转换...`);
        
        for (const img of images) {
            const src = img.src;
            const originalAlt = img.alt || '';
            const originalClass = img.className;
            
            try {
                // 添加加载状态
                img.alt = 'HEIC图片转换中...';
                img.classList.add('heic-loading');
                
                // 获取HEIC文件
                const response = await fetch(src);
                if (!response.ok) throw new Error(`HTTP错误! 状态码: ${response.status}`);
                
                const blob = await response.blob();
                
                // 转换为JPEG
                const jpegBlob = await heicTo({
                    blob: blob,
                    type: "image/jpeg",
                    quality: 0.8
                });
                
                // 创建对象URL并替换
                const jpegUrl = URL.createObjectURL(jpegBlob);
                img.onload = function() {
                    URL.revokeObjectURL(jpegUrl); // 释放内存
                    img.classList.remove('heic-loading');
                    img.classList.add('heic-converted');
                };
                img.src = jpegUrl;
                img.alt = originalAlt;
                img.className = originalClass;

            } catch (err) {
                console.error('HEIC转换失败:', err);
                img.alt = originalAlt + ' [HEIC转换失败]';
                img.classList.remove('heic-loading');
                img.classList.add('heic-error');
            }
        }
    }
    
    await processHEICImages();
});
</script>

<style>
.heic-loading {
    position: relative;
    min-height: 100px;
    background: #f5f5f5 url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="40" stroke="%233498db" stroke-width="8" fill="none" stroke-dasharray="62.8 188.8"><animateTransform attributeName="transform" type="rotate" repeatCount="indefinite" dur="1s" values="0 50 50;360 50 50" keyTimes="0;1"></animateTransform></circle></svg>') no-repeat center;
    background-size: 50px;
}
.heic-converted {
    border: 2px solid #2ecc71;
}
.heic-error {
    border: 2px dashed #e74c3c;
}
</style>

使用方法:

你可以引用上面的代码到任意html页面,通常我们把他放在header或footer里。
在Typecho上我们可以把它放在主题文件的: header.php 中

本文代码已在Github以MIT协议开源,感谢自由软件与开源社区!
DisplayMyHEIC

测试图片

测试图片1-人物
测试图片2-缆车

claw.cloud 以仅通过发送邮件的方式向包括我在内的众多用户宣布关闭香港地区的大部分业务,并提供了迁移方案,但是原有服务器可用时间截至到7月31日。很不幸,当我意识到服务器不对劲的时候,一切已经晚了。
我不知道能否完全恢复数据,但目前来看多半是没戏。
目前本博客通过yandex网页快照和互联网档案馆(https://web.archive.org/)手动复制恢复了大部分文章,但许多长文内容残缺不全仅有开头,关键段落及图像格式排版全部丢失,此事完全结束后,我会向互联网档案馆捐款以表感谢。

在此我只能奉劝各位数据上云的同学,及时备份。

如果此次数据丢失在和客服交涉后无法完全恢复,我的所有站点服务数据将永不上云,云服务仅限用于转发。

此次事件不涉及邮件服务器。

Flutter 安卓开发第一坑
作者: 未知狐
时间: 2025-7-28
分类: 随手记,Linux,折腾=-=
评论
官方文档不全
直接运行 flutter run

...
"Install NDK (Side by side) 26.3.11579264 v.26.3.11579264" failed.

FAILURE: Build failed with an exception.

  • Where:
    Build file '/home/xfox/Dev/WatchLauncher/android/build.gradle.kts' line: 16
  • What went wrong:
    A problem occurred configuring project ':app'.

    java.lang.RuntimeException: com.android.builder.sdk.InstallFailedException: Failed to install the following SDK components:
    ndk;26.3.11579264 NDK (Side by side) 26.3.11579264

    Install the missing components using the SDK manager in Android Studio.
    ...
    直接通过AS尝试构建apk则:

/home/xfox/Dev/flutter-sdk/flutter/bin/flutter --no-color build apk
[!] No Android SDK found. Try setting the ANDROID_HOME environment variable.
Process finished with exit code 1
显而易见是的,从Flutter doctor里我只能看到AS这项是打了对号的并且我确定已经安装了Flutter 文档写的相关工具链,但是就是报错编译不了。
也就是说我应该安装对应版本的NDK,也就是SDK Manager->SDK Tools ->NDK(Side by Side)
这个问题我曾经怀疑需要下载NDK,因为曾经尝试过使用AS当时开发流程就需要使用,现在显然仍然需要。
糟糕的是Configure the Android toolchain in Android Studio压根就没写这条。对于不了解的新人实在是坑爹至极。

  • 阅读剩余部分 -
    内容已丢失

作者: 未知狐
时间: 2025-7-27
分类: 随手记,Linux,折腾=-=
1 条评论
今天本来准备看点Dart和信创的信息,然后忽然发现这玩意不支持LoongArch (不过释然了,反正龙芯生态现在也是半死不活,本来也没报太大期望,RISC-V倒是有支持) 然后又看了眼橘子派画的Nova龙芯开发板大饼,仍然是只有宣发(疑似宣发也删了)不见实物,倒是官网榜上华为的产品页面挺醒目。
遂漫游到华为那边,本来打算看看华为的DevEco现在有没有Linux支持,然而一点下载,跳转到一个华为账户登录界面,直接失去探索兴趣沉默一秒关闭网页。
😅 华为你还是自己玩吧,老老实实当中央的谈判工具。真他妈搞笑,下载IDE也得登录。想学苹果玩封闭生态?还是早点回到被制裁的半死不活的状态对中外用户都好些。

顺便还看了PyQt的讯息,对支持的安卓版本限制范围刚好把我的CP303C手表卡没了,还是老老实实继续学Flutter吧。

作者: 未知狐
时间: 2025-7-22
分类: 随手记,Linux,阅读笔记,折腾=-=
评论
github仓库地址
Python软件包,在多个常见Linux发行版及OSX平台具有官方仓库打包。
今晚察觉自己看的书不方便复制,部分繁体字第一次见不太熟悉于是尝试查找解决方案。
虽然能不能复制不是很重要,但是我还是希望能有一个可复制的选择。

作者: 未知狐 时间: 2025-7-19 分类: 随手记,阅读笔记
也是我用过最垃圾的自由的邮件软件。
SMTP什么都对就是发不出去,Connect Closed,开什么玩笑?服务器断开连接? 同网络K9-Mail能发你不能是吧。
太垃圾了,我甚至能在Reddit上找到三年前同样的问题,哪怕过了三年也没人去修,逆天。
KMail 发不了邮件
老老实实用雷鸟,商店打三星都是给KDE脸了😅

标签: none

仅有一条评论
mxdyeahmxdyeah
2025年7月19日14:06
还是Thunderbird好用,一个邮件客户端竟然能够接入IRC或者Matrix,还有各种插件。
最开始是用的Foxmail,Thunderbird已经用了快5年,啥问题都没遇到过。

作者: 未知狐 时间: 2025-7-19 分类: 随手记,Linux,趣分享,时间轴,折腾=-=,硬核灌水
前清提要:
为了方便使用,我用podman-compose 文件部署了pmail,配置如下:

pmail-compose.yml

version: '3'
services:
pmail:

image: ghcr.io/jinnrry/pmail:latest
container_name: pmail
restart: always
ports:
  - "25:25"
  - "80:80"
  - "443:443"
  - "110:110"
  - "465:465"
  - "995:995"
  - "993:993"
volumes:
  - "/root/podman/pmail/config:/work/config"

这样,更新pmail版本只需要执行:

podman stop pmail
podman rm pmail
podman rmi pmail:latest
podman-compose -f pmail-compose.yml up -d

就能完成数据无损更新。

但是今天发现kmail无法正常连接邮件服务器,打开浏览器一检查后台,发现web后台也挂了,那肯定是后端服务出问题了。
遂SSH上线Debug。
podman logs -f pmail
发现日志疯狂刷新不带停的,Ctr+C 好几次后才停下来。报错和ssl.go等文件有关系,我不是开发者也看不明白,不过报错文件路径前有一句指向明确的英语意思是警告证书过期,这句倒是看懂了🤣。
那么接下来就是更新证书了,查看服务配置文件发现,我配置的是手动管理证书。
参见: 配置文件说明

{

"logLevel": "",
"domain": "linuxuser.site",
"domains": [
    "linuxuser.site"
],
"webDomain": "mail.linuxuser.site",
"dkimPrivateKeyPath": "/work/config/dkim/dkim.priv",
"sslType": "1",
"SSLPrivateKeyPath": "/work/./config/ssl/private.key",
"SSLPublicKeyPath": "/work/./config/ssl/public.crt",
"dbDSN": "/work/config/pmail.db",
"dbType": "sqlite",
"httpsEnabled": 0,
"spamFilterLevel": 1,
"httpPort": 0,
"httpsPort": 0,
"weChatPushAppId": "",
"weChatPushSecret": "",
"weChatPushTemplateId": "",
"weChatPushUserId": "",
"tgBotToken": "",
"tgChatId": "",
"isInit": true,
"webPushUrl": "",
"webPushToken": ""

}
显然是当初部署的时候因为已经有服务器部署了ACME.sh更新证书所以不能用项目推荐的证书更新管理方式;这等于是又挖了个更新的坑————配置A-B服务器证书文件同步。

编写证书同步脚本:
首先要厘清我的服务架构,我在ClawHK服务器(也就是本博客所在的服务器)部署了ACME.sh管理证书并对其他服务器线路不佳的Web服务(RackNerd-USA)进行反代,因此证书本身是处于ClawHK上的,现在我需要把它同步到Racknerd-USA的指定路径供PMail使用。
先自己简单写出来基本操作流程,再用DeepSeek和ChatGPT进行细节润色。

!/bin/bash

PmailSSLSync.sh

本脚本应该运行在Racknerd-USA

定义变量

local_private_key_path="/root/podman/pmail/config/ssl/private.key"
local_public_key_path="/root/podman/pmail/config/ssl/public.crt"
remote_private_key_path="/home/xfox/www/all_linuxuser.site/privkey.pem"
remote_public_key_path="/home/xfox/www/all_linuxuser.site/fullchain.pem"
temp_dir=$(mktemp -d /tmp/cert_sync_XXXXXX)

停止服务

sudo podman stop pmail

删除本地过期证书

sudo rm -f "$local_private_key_path" "$local_public_key_path"

从ClawHK同步证书文件到临时目录

sudo rsync -avz -e "ssh -i /root/.ssh/id_ed25519 -o StrictHostKeyChecking=no" \
[email protected]:"$remote_private_key_path" \
[email protected]:"$remote_public_key_path" \
"$temp_dir/"

检查文件是否存在

if [ ! -f "$temp_dir/privkey.pem" ] || [ ! -f "$temp_dir/fullchain.pem" ]; then
echo "证书同步失败!"
sudo podman start pmail
exit 1
fi

移动证书到最终位置

sudo mkdir -p "/root/podman/pmail/config/ssl"
sudo mv "$temp_dir/privkey.pem" "$local_private_key_path"
sudo mv "$temp_dir/fullchain.pem" "$local_public_key_path"
sudo chmod 600 "$local_private_key_path"
sudo chmod 644 "$local_public_key_path"

清理临时目录

rm -rf "$temp_dir"

重启服务

sudo podman start pmail

有脚本了,还得保证脚本及脚本所需命令能能按时跑。
在邮件服务器上安装好所需工具,并添加定时任务
apt install crontab rsync
crontab -e
添加如下条目

0 4 * /root/PmailSSLSync.sh

应该不会有人凌晨四点给我发邮件吧 ;)
添加完成后检查一下:
crontab -l
大功告成!

作者: 未知狐 时间: 2025-7-13 分类: 随手记 2 条评论
最近才发现这个问题,Youtube就没这个问题,通过统计信息可以发现AV1编码是不受影响的,并且默认AV1编码的这类视频通常是对象存储而不是带有mcdn的PCDN类型。
下面是一个可以正常播放的视频:
https://www.bilibili.com/video/BV1KHNizkEdD

Mime Type: video/mp4;codecs="av01.0.00M.10.0.110.01.01.01.0", audio/mp4;codecs="mp4a.40.2"
Player Type: DashPlayer
Resolution: 720 x [email protected]
Video DataRate: 526 Kbps
Audio DataRate: 93 Kbps
Segments: 5 / 17
Dropped Frames: 8 / 678
Video Host: upos-sz-mirror08c.bilivideo.com
Audio Host: xy183x93x100x12xy.mcdn.bilivideo.cn:8082
Video Speed: 9494 Kbps
Audio Speed: 2072 Kbps
Network Activity: 0 KB
Integrated Loudness: -28.67 LUFS
4.9.39-Log: [Copy] [Download]
下面是一个不能正常播放的视频(开头几秒可以播放但是闪屏卡顿)随后跳转B站视频播放错误的视频。
https://www.bilibili.com/video/BV1Cy7azWEG1/

Mime Type: video/mp4;codecs="avc1.640028", audio/mp4;codecs="mp4a.40.2"
Player Type: DashPlayer
Resolution: 720 x [email protected]
Video DataRate: 1785 Kbps
Audio DataRate: 92 Kbps
Segments: 1 / 18
Dropped Frames: 12 / 62
Video Host: xy221x130x104x24xy.mcdn.bilivideo.cn:4483
Audio Host: xy221x130x104x21xy.mcdn.bilivideo.cn:4483
Video Speed: 9900 Kbps
Audio Speed: 930 Kbps
Network Activity: 0 KB
Integrated Loudness: -27.15 LUFS
4.9.39-Log: [Copy] [Download]
PCDN确实给这些公司节约了不少成本(顺带还坑了一把普通宽带用户,运营商上行甚至下行限速的视频B站比比皆是),不过这种玩意在我看来降本增笑的成分更多点。

目前可以确定B站和Chromium的编译参数都有责任,在Google Chrome上AVC和AV1都是完全正常的,考虑到国内资本家无利不起早的一贯做风详细的日志不发了,我也没有时间提交这些日志,就算递交也多半石沉大海。至于Fedora 团队打包者对Chromium的默认编译参数,涉及到专利问题,本身也无解,只能等视频平台统一使用AV1
希望各大平台都加快推用AV1编码,尽早联合硬件厂商淘汰AVC和HEVC编码降低不必要的流量成本。