阅读视图

发现新文章,点击刷新页面。

2025最新查看小米/红米手机电池健康度和循环次数方法

先说明一下,网上的一些教程已经过时,从MIUI各个版本迭代到如今 HyperOS 改了又改,很多方法失效了。通过拨号键盘输入 *#*#6485#*#* 现在已不展示 MF_05 和 MF_06 的值。

系统里的【电池保护】功能只使用通俗语言描述了电池健康度,没有显示剩余容量的百分比。

电池保护功能只使用通俗语言描述电池健康-压缩后.jpg

当前是2025年3月,我经过实践得知,通过拨号键盘输入 *#*#284#*#* ,手机会生成Bug检测报告,仔细查阅这份 txt 报告,能得到当前手机容量和循环次数。

生成bug检测报告大概率很慢,需要耐心等待,系统通知栏会有进度条。生成成功之后,zip 文件存在于 内部存储器/MIUI/debug_log/bugreport-2025-03-07-120503.zip,我是把这个文件拷贝到了电脑上。然后解压缩此 zip 文件,得到 bugreport-Redmi K70-2025-03-07-121000.zip,继续解压缩这个 redmi k70 的 zip 文件,得到 bugreport-vermeer-UKQ1.230804.001-2025-03-07-12-05-04.txt 这个文件。不同型号这个文件名不同,你需要查看的是 bugreport 开头的并且扩展名是 .txt 的文件。使用 vscode 或者其他文本编辑器搜索这个文件

1️⃣ 搜索 battery capacity 能够得到电池当前容量
k70电池现今剩余容量-压缩后.jpg

2️⃣ 搜索 cycle count 能得到手机循环次数,实际上这里的 Full charge 的值也是现在手机电池的最大容量,4825000就是 4825毫安时,除以出厂时的典型容量5000毫安时可得,容量还剩 96.5%

电池循环次数cycle count-压缩后.jpg

我的 K70 是2023-12-02到手的,典型容量是5000毫安时。手机电池一般是三元锂软包,我的经过了402次循环还剩96.5%的容量,说明我的电池使用习惯还不错。

PS: 今天2025-03-07,距离2023-12-02已经过了461天,这段时间K70一直是我的主力机。

开始时间:2023年12月02日 00:00
结束时间:2025年03月07日 00:00

相差年数:2年
相差月数:15月
相差周数:65周余6天
相差天数:461天
相差小时:11064时

完美解决 seafile FILE_SERVER_ROOT 配置导致的内网外网不能同时访问和上传下载的问题

我的 seafile 安装在内网,服务地址是 http://10.10.10.5:8088,然后我使用 frp 将其暴露在了公网 https://seafile.940304.xyz

正常情况下在任何联网设备上都可以通过域名 seafile.940304.xyz 访问,并且能够上传和下载。但是当我处于 10.10.10.0/24 家里的内网时,我发现上传文件走了公网(seafile.940304.xyz所在服务器),所以数据包兜了个圈再回到我家,这样的表现就是上传下载文件都非常缓慢,最大速率刚好是我的公网机器的带宽。我发现这是 seafile 系统设置当中 FILE_SERVER_ROOT 这个变量定义成了 https://seafile.940304.xyz/seafhttp 导致的,于是寻求解决办法。

seafile系统设置.jpg

一个临时办法:

当我处于家庭内网时,如果需要上传大文件,我可以手动改一下系统配置,将 FILE_SERVER_ROOT 改成 http://10.10.10.5:8088/seafhttp,这样可以临时解决上传速度慢的问题。

但是这样未免有点低效。我开始上网搜索解决办法,看到如下这些相似的帖子:

思索再三之后,配合 gpt-4o 对我的一些建议,我发现一个不错的解决办法,因为我的家庭网络使用了 openwrt 作为网关路由器,并且当时构建的镜像使用 nginx 替代了原本的 uhttpd 作为 web server,这样就更加接近我的目标了。简单说下实现思路

  1. seafile 的系统设置当中,SERVICE_URL 保持公网地址 https://seafile.940304.xyz/FILE_SERVER_ROOT 的值保持公网地址 https://seafile.940304.xyz/seafhttp。此时非内网的公网下访问、上传、下载都没有问题
  2. 当我处于内网,将 seafile.940304.xyz 域名直接映射到 10.10.10.1,这是我的 openwrt 地址
  3. 通过 nginx 反向代理,将来自seafile.940304.xyz 的请求全都转发到 10.10.10.5:8088

以下是详细步骤。

step 1

填入公网的地址即可。SERVICE_URL 填入公网地址 https://seafile.940304.xyz/FILE_SERVER_ROOT 的值填入公网地址 https://seafile.940304.xyz/seafhttp,然后保存。

step 2

打开 openwrt 后台管理页面,进入 网络 -> DHCP/DNS -> 主机名映射,添加一条记录,主机名 seafile.940304.xyz,IP地址 10.10.10.1 然后保存。

dhcp-dns配置域名映射.jpg

这个操作是否生效了可以在本地局域网任何一台机器使用命令 nslookup seafile.940304.xyz 检查,返回结果是 10.10.10.1 则说明配置正常且生效了。否则可能还是域名对应的公网地址

nslookup 查询结果.jpg

step 3

nginx 配置如下,文件名 /etc/nginx/conf.d/seafile-on-pvedebian11.conf,其中 ssl 证书和私钥 key 部分是我从我的公网机器上 copy 过来的。

server {
    listen 443 ssl;
    server_name seafile.940304.xyz;

    ssl_certificate /etc/letsencrypt/live/940304.xyz/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/940304.xyz/privkey.pem;
    access_log /var/log/nginx/seafile_access.log;
    error_log /var/log/nginx/seafile_error.log;

    location / {
        proxy_pass http://10.10.10.5:8088;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /seafhttp {
        proxy_pass http://10.10.10.5:8088/seafhttp;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

然后检查 nginx 配置是否正确和重载 nginx 服务即可。

OpenWrt nginx配置.jpg

在内网使用公网域名正常访问,并且是反向代理过的,访问、上传和下载速度都极快。可以通过 openwrt 上的 nginx 日志验证。

seafile使用公网域名正常访问.jpg

检查 openwrt 上 nginx 的日志文件 /var/log/nginx/seafile_access.log

[root@openwrt_ai_dk_20240831:11:54 AM /etc/nginx/conf.d] # tail -n 10 /var/log/nginx/seafile_access.log
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /api/v2.1/admin/web-settings/ HTTP/1.1" 200 1176 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /media/img/seafile-logo.png?t=1728788662258 HTTP/1.1" 200 12612 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /media/favicons/favicon.png?t=1728788662258 HTTP/1.1" 200 45439 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:03:55 +0800] "GET /media/custom/login-bg.jpg?t=1728788662258 HTTP/1.1" 200 338345 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:05:19 +0800] "GET / HTTP/1.1" 200 2227 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:05:20 +0800] "GET /api/v2.1/notifications/ HTTP/1.1" 200 689 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:05:20 +0800] "GET /api/v2.1/repos/?type=mine HTTP/1.1" 200 1394 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:24:32 +0800] "GET / HTTP/1.1" 200 2229 "https://seafile.940304.xyz/sys/web-settings/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:24:32 +0800] "GET /api/v2.1/notifications/ HTTP/1.1" 200 689 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
10.10.10.108 - - [13/Oct/2024:11:24:32 +0800] "GET /api/v2.1/repos/?type=mine HTTP/1.1" 200 1394 "https://seafile.940304.xyz/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"

并且,在内网依然可以使用内网IP和端口访问,并且此时上传和下载还是走 https://seafile.940304.xyz/seafhttp 匹配到的 nginx 反向代理,即 http://10.10.10.5:8088/seafhttp,所以还是走的内网,速度依然最佳。

seafile使用内网ip端口正常访问.jpg

于是这个问题通过设置公网地址+公网域名映射内网ip+nginx反向代理完美解决。

纯css实现typecho博客文章文字spoiler剧透效果

我发现一些论坛,还有 telegram,都支持文字 spoiler 效果,那什么是文本 spoiler?

在英文中,“spoiler”这个词原本的含义是指“破坏者”或“毁坏者”。在不同的上下文中,它可以指代能够破坏某种事情、情节、计划或体验的因素。

近年来,随着社交媒体和娱乐讨论的普及,“spoiler”一词常常用于指代剧透,特别是在讨论电影、电视剧、小说等作品时。

因此,虽然“spoiler”最初的意思是“破坏者”,但现代用法主要与“剧透”相关,体现了该词在流行文化中的演变。

在Telegram客户端中,文字的spoiler效果可以通过特定的格式来实现。用户可以将某些文本标记为spoiler,使其在聊天中不直接显示,而是被一个模糊的、可点击的框包裹。这种设计的作用主要有几个方面:

  1. 避免剧透:当讨论电影、电视剧、书籍或其他故事情节时,使用spoiler效果可以有效避免给其他人带来剧透的困扰。只有在有兴趣的人点击内容时,才会显示具体的信息。
  2. 增强互动性:通过在聊天中使用spoiler,用户可以增加互动性,鼓励其他人点击查看内容,从而引发讨论。
  3. 保护隐私:在某些情况下,用户可能希望分享敏感信息或私人事项,而使用spoiler效果可以在某种程度上保护这些信息,使其不那么显眼。

我想在typecho中实现这个效果。既然markdown不支持,那么我们就用原生css和html实现吧。

增加全局样式

我考虑了一下,还是鼠标直接悬浮(当然也支持点击)就直接展示原文,这样更加简单直接。有一些论坛的实践(比如 linux.do )确实是需要点击后才显示原文。

登录typecho后台,进入博客的样式设置页面(控制台 -> 外观 -> 设置外观),url路由是 https://xxx.com/admin_path/options-theme.php ,其中 admin_path 默认是 admin,如果你像我一样想增强博客安全,可以更改一下这部分的路由,改成复杂字符串或者自己的名字之类的字符串,目的是为了不让别人轻易发现博客后台登录地址。

在全局css 样式中定义如下样式,这是我精心调试过的效果。效果演示放在后文。

.spoiler {
    position: relative; /* 使得伪元素可以定位 */
    background-color: rgba(200, 200, 200, 0.3); /* 浅灰色半透明背景 */
    color: rgba(0, 0, 0, 0.5); /* 半透明黑色文字 */
    user-select: none; /* 禁止选中文字 */
    overflow: hidden; /* 隐藏溢出的内容 */
    cursor: pointer; /* 鼠标悬停时光标变为手型 */
    filter: blur(3px); /* 添加模糊效果 */
    padding: 5px; /* 为文本添加内边距以增强效果 */
    transition: filter 0.3s ease; /* 添加平滑过渡效果 */
}

.spoiler:hover {
    background-color: inherit; /* 悬停时使用父元素的背景色 */
    color: inherit; /* 悬停时显示原色 */
    filter: blur(0); /* 悬停消除模糊效果 */
}

保存即可。后面就是写文章时直接引用该class即可。

文章内需要处引用

我习惯使用 <span> 标签。比如原文是 我才知道周也的父亲是叫周秦快。,如果你是写影评,为了避免剧透把周秦快做spoiler效果,那就写如下内容

我才知道周也的父亲是叫<span class="spoiler">周秦快</span>。

效果演示

我才知道周也的父亲是叫周秦快


ok,这便是我想要的效果。

我对Typecho Facile主题的一些修改,图片懒加载优化,样式定制

使用 Facile 主题已经有一年多了应该,首先感谢作者的开发,目前我使用得挺好。我最近刚由 2.1.12 切换到 2.2 版本,但是图片懒加载功能似乎一直没有生效?直到我最近写了一篇包含94张图片的文章,才发现浏览体验受到了很大的影响。

我也提了一个 issue,并给出了我的解决方法, https://github.com/changbin1997/Facile/issues/12 作者回复他那边没问题,那很可能是我这边什么插件导致了 replaceImgSrc 方法不起作用,或者其他兼容性问题,但最后好在我解决了,本文就分享一下我的解决方法,并且给出我做的其他小细节定制。

图片懒加载优化

引入懒加载js文件

进入容器(或者你是宿主机直接安装就去宿主机找)找到文件 usr/themes/Facile/components/header.php

<head> 标签下引入脚本,详细如下

找到 <link rel="stylesheet" 这一行,以及 <!--自定义CSS--> 这一行,在其中插入 <script src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.2.2/lazysizes.min.js" async></script> 修改后如下

<link rel="stylesheet" href="<?php $this->options->themeUrl('assets/css/style-1722355012.css'); ?>" type="text/css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.2.2/lazysizes.min.js" async></script>
<!--自定义CSS-->
<?php if ($this->options->cssCode): ?>

修改 replaceImgSrc 方法

找到 usr/themes/Facile/functions.php 文件,或者直接在 typecho 后台管理页修改,也就是 控制台 -> 外观 -> 编辑当前外观 -> functions.php,具体修改如下,注释掉原本的代码,我修改的 replaceImgSrc 使用了一个 svg loading 图作为占位符(滚动可视区域内的图片尚未完全加载前的转圈圈效果

// 把图片的 src 替换为 data-src,用于图片懒加载,这是Facile 2.1.12以及2.2 版本当中的代码
//function replaceImgSrc($content) {
//    $pattern = '/<img(.*?)src(.*?)=(.*?)"(.*?)">/i';
//    $replacement = '<img$1data-src$3="$4"$5 class="load-img">';
//    return preg_replace($pattern, $replacement, $content);
// }

function replaceImgSrc($content) {
    // SVG 数据URI
    $loadingSVG = 'data:image/svg+xml;charset=UTF-8,' . rawurlencode('<svg version="1.1" id="L9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 0 0" xml:space="preserve"><path fill="#000" d="M73.438,49.25c0-13.025-10.634-23.562-23.75-23.562c-13.024,0-23.562,10.537-23.562,23.562h6.797 c0-9.276,7.489-16.765,16.765-16.765c9.276,0,16.765,7.489,16.765,16.765H73.438z"><animateTransform attributeName="transform" attributeType="XML" type="rotate" dur="1s" from="0 50 50" to="360 50 50" repeatCount="indefinite" /></path></svg>');

    $pattern = '/<img(.*?)src=["\'](.*?)["\'](.*?[^>])>/i';
    $replacement = '<img$1src="' . $loadingSVG . '" data-src="$2"$3 class="lazyload"><noscript><img$1src="$2"$3></noscript>';
    return preg_replace($pattern, $replacement, $content);
}

这个方法是在 usr/themes/Facile/post.php 的如下地方调用的,也就是主题设置中的图片懒加载功能需要打开

<?php echo $this->options->imagelazyloading == 'on'?replaceImgSrc($GLOBALS['post']['content']):$GLOBALS['post']['content']; ?>

最终我这边图片懒加载功能完美运行,你可以参考我这篇文章,一共94张图,可以很好地预览图片懒加载功能 2024年8月我的宜昌 - 重庆 - 川西小环线自驾旅行分享

给文章添加字数统计和预计阅读时间

usr/themes/Facile/functions.php 尾部追加代码,如下

// 添加文章字数统计,预计阅读用时方法
function  art_count ($cid){
    $db = Typecho_Db::get ();
    $rs = $db->fetchRow ($db->select ('table.contents.text')->from ('table.contents')->where ('table.contents.cid=?',$cid)->order ('table.contents.cid',Typecho_Db::SORT_ASC)->limit (1));
    $text = preg_replace("/[^\x{4e00}-\x{9fa5}]/u", "", $rs['text']);
    $text_num = mb_strlen($text,'UTF-8');
    $read_time = ceil($text_num/400);
    $output = '本文共' . $text_num . '个字,预计阅读时间' . $read_time  . '分钟';
    return $output;
}

然后修改 usr/themes/Facile/post.php 文件,在适当位置调用 art_count 方法,修改后如下

<span class="ml-1" title="发布日期" data-toggle="tooltip" data-placement="top">
    <i class="icon-calendar mr-2" aria-hidden="true"></i>
    <?php $this->date('Y年m月d日'); ?>
</span>
<span class="ml-2" title="作者" data-toggle="tooltip" data-placement="top">
    <i class="icon-user mr-2" aria-hidden="true"></i>
    <a rel="author" href="<?php $this->author->permalink(); ?>" class="mr-2" title="作者:<?php $this->author(); ?>">
        <?php $this->author(); ?>
    </a>
</span>
<span class="ml-2" title="阅读量" data-toggle="tooltip" data-placement="top">
    <i class="icon-eye mr-2" aria-hidden="true"></i>
    <?php echo postViews($this); ?>
</span>
<span class="ml-2" title="文章字数和阅读预计用时" data-toggle="tooltip" data-placement="top">
    <i class="icon-eye mr-2" aria-hidden="true"></i>
    <?php _e(art_count($this->cid)); ?>
</span>

页面footer底部修改

修改文件 usr/themes/Facile/components/footer.php ,我改成了如下

<footer>
    <div class="container py-3">
        <?php if ($this->options->icp): ?>
        <nav class="text-center mb-1">
            <?php $this->options->icp(); ?>
        </nav>
        <?php endif; ?>
        <nav class="text-center">
            <p>Copyright &copy;
                <?php echo "2019 - " . date('Y'); ?> by hellodk.cn | Proudly Powered by <a href="http://www.typecho.org"
                    target="_blank">Typecho</a> &amp;
                <a href="https://hellodk.cn/" target="_blank"> ❤.</a>
                Theme by
                <a class="ml-1" href="https://github.com/changbin1997/Facile" target="_blank">Facile</a>.
            </p>
            <p>
                <?php hasBeenRunningTime2(); ?>
            </p>
        </nav>
    </div>
</footer>

其中调用了一个方法 hasBeenRunningTime2,该方法定义如下,添加到 usr/themes/Facile/functions.php 尾部

// 计算网站已运行多长时间
function hasBeenRunningTime2()
{

        // 设置时区
        date_default_timezone_set('Asia/Shanghai');
        // 在下面按格式输入本站创建的时间
        $site_create_time = strtotime('2019-04-06 14:00:00'); //格式:年 月 日 时 分 秒
        $time = time() - $site_create_time;
        if (is_numeric($time)) {
                $value = array(
                        "years" => 0, "days" => 0, "hours" => 0,
                        "minutes" => 0, "seconds" => 0,
                );
                if ($time >= 31556926) {
                        $value["years"] = floor($time / 31556926);
                        $time = ($time % 31556926);
                }
                if ($time >= 86400) {
                        $value["days"] = floor($time / 86400);
                        $time = ($time % 86400);
                }
                if ($time >= 3600) {
                        $value["hours"] = floor($time / 3600);
                        $time = ($time % 3600);
                }
                if ($time >= 60) {
                        $value["minutes"] = floor($time / 60);
                        $time = ($time % 60);
                }
                $value["seconds"] = floor($time);
                echo 'Site has been running for ';
                echo '<span class="btime">' . $value['years'] . ' years ' . $value['days'] . ' days ' . $value['hours'] . ' hours.</span>';
        } else {
                echo '';
        }
}

访客添加评论时增加简单算数校验

usr/themes/Facile/functions.php 尾部追加方法,代码如下

//评论区简单算术验证,防止评论被滥用
function themeInit($comment){
    $comment = spam_protection_pre($comment, $post, $result);
}

function spam_protection_math(){
    $num1=rand(1,49);
    //数字范围,自定义修改
    $num2=rand(1,49);
    echo "验证码:<input type=\"text\" name=\"sum\" class=\"text\" value=\"\" size=\"25\" tabindex=\"4\" style=\"width:100px\" placeholder=\"$num1 + $num2 = ?\">\n";
    echo "<input type=\"hidden\" name=\"num1\" value=\"$num1\">\n";
    echo "<input type=\"hidden\" name=\"num2\" value=\"$num2\">";
}

function spam_protection_pre($comment, $post, $result){
    $sum=$_POST['sum'];
    switch($sum){
        case $_POST['num1']+$_POST['num2']:
        break;
        case null:
        throw new Typecho_Widget_Exception(_t('对不起: 请输入验证码。<a href="javascript:history.back(-1)">返回上一页</a>','评论失败'));
        break;
        default:
        throw new Typecho_Widget_Exception(_t('对不起: 验证码错误,请<a href="javascript:history.back(-1)">返回</a>重试 。','评论失败'));
    }
    return $comment;
}

然后需要修改 usr/themes/Facile/components/comment-input.php 文件,在适当位置添加对 spam_protection_math 方法的调用,修改后如下

<!--姓名输入-->
<div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-6">
    <label for="author" class="d-block">姓名</label>
    <input type="text" class="form-control" placeholder="请输入您的姓名或昵称" name="author" id="author" value="<?php $this->remember('author'); ?>" required>
</div>
<!--邮箱地址输入-->
<div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-6">
    <label for="mail" class="d-block">电子邮件地址(不会公开)</label>
    <input type="email" class="form-control" placeholder="请输入您的电子邮件地址" name="mail" id="mail" value="<?php $this->remember('mail'); ?>" <?php if ($this->options->commentsRequireMail): ?> required <?php endif; ?>>
</div>
<!--网站地址输入-->
<div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-6">
    <label for="url" class="d-block">网站(选填)</label>
    <input type="url" class="form-control" placeholder="请输入您的网站或博客地址" name="url" id="url" value="<?php $this->remember('url'); ?>" <?php if ($this->options->commentsRequireURL): ?> required <?php endif; ?>>
</div>
<!--数字验证码-->
<div class="col-12 col-sm-12 col-md-6 col-lg-6 col-xl-6">
    <?php spam_protection_math(); ?>
</div>

gravatar 换源

参考了这篇文章 Gravatar 头像镜像源收集 (2024年)

主题

Facile 2.2 版本支持在主题设置中设置 gravatar 源,于是我参考上面文章,修改成了 https://cravatar.cn/avatar/ 国内源,目前 gravatar 头像加载速度很快,解决的很完美。

博客全局

顺便修改一下 Typecho 系统全局的 gravatar 源。比如在 manage-comments.php 评论管理页面就用上了这个地方定义的头像源。修改文件 config.inc.php,改成如下

// 更换头像源
define('__TYPECHO_GRAVATAR_PREFIX__', 'https://cravatar.cn/avatar/');

改后建议重启 typecho 和数据库。


好了,目前我做的一些修改就是这些。其实之前 2.1.12版本时我还做了全站字数统计放在归档页面等小细节,但是目前就这样,先不改了。

本文是给自己做的修改的详细记录,也给广大网友提供了参考。如有问题,欢迎评论。

2024年8月我的宜昌 - 重庆 - 川西小环线自驾旅行分享

前排提示:本文包含大量图片,一共94张。经过压缩后,一共58.5MB,请注意流量/放心观看。 文章比较流水账,但也有我的一些思考和理解。

前言

去年的这个时候,我一个人去了皖南川藏线和黄山徽州天路等地方旅行。今年早早的有所规划,写了一份还算详尽的计划书。计划着想去但一直没去的川西。至于怎么去最终还是决定和我哥俩人自驾着去,虽然劳累,但是最节省,尽管这样会浪费一些时间在路上。

现在是 2024-08-14 22:13:19,我在旅行归来后总结旅行。在经历过这次舟车劳顿的旅行体验之后,下一次这种去往很远的地方的旅行就再也不会纯自驾了——可能会托运汽车,也可能当地租车,反正都比我们从合肥开车过去要轻松。

这一次的旅行计划是从合肥开到宜昌,走走G348中国地质科普公路,看看三峡库区的雄伟壮丽。再去往重庆,看看美丽山城的夜景。后面就是从重庆直达川西小环线,看海螺沟,翻越折多山垭口,驻足欣赏贡嘎雪山,看看沿途美丽的高原风景……

具体的路线和计划在这篇文章就不写了,本文记录一下旅行当中我拍摄的照片,不过会大致描述一下每天的行程

day 0 - 2024-08-03

今天是假期第一天。我收拾好行李后开车去往合肥,走了国道因为想去看看巢湖……

当天温度有37度左右,但是我按耐不住拿出相机拍下这些田园风光……笔直的公路,绿油油的农田,是我印象中南方夏天的样子。

HDK00761-dk-compressed.jpg

HDK00768-dk-compressed.jpg

这就是在巢湖大道拍摄的照片。这一段巢湖的北岸与南岸的直线距离大概是15km左右,还是能看到对岸的山的。

HDK00782-dk-compressed.jpg

HDK00787-dk-compressed.jpg

中午到达合肥,下午和晚上继续收拾东西,购买部分补给,整装待发。

day 1 - 2024-08-04

6点便洗好出门,怀着激动的心情开启我们的自驾之旅。

第一次到三峡库区,第一次踏上G348国道,一切都很新鲜,风景养眼,就是烈日当空,40度的天气,太劝退人了。本来这样的天气只适合在家吹空调的,但是看到路上也还有一些人在旅行,想想也的确没办法,普通打工人的假期不能自定义,只能硬着头皮上了。

HDK00832-dk-compressed.jpg

从宜昌下高速,直达【听风谷观景台】。

HDK00839-dk-compressed.jpg

在听风谷观景台远眺远方的城市宜昌。

HDK00842-dk-compressed.jpg

宜昌G348。我是在小红书看到很多人推荐G348自驾,刚好我们的行程经过宜昌,于是今天的行程安排可以说相当合理了。

HDK00844-dk-compressed.jpg

长江中的轮船,拖运的一般是什么?

HDK00909-dk-compressed.jpg

HDK01000-dk-compressed.jpg

这条风光大道,标识性的东西做得挺好的,非常多可让人打卡留恋的场景。

HDK01016-dk-compressed.jpg

晚上准备夜宿【屈原故里】—— 秭归县,傍晚时分感受着江岸的城市,岁月静好,幽静自然,实在是太美好了。如果能不上班该多好啊😭️

HDK01065-dk-compressed.jpg

山城就是有高低层次,对于长久生活在平原地区的人们来说一定是一道亮丽的风景。

HDK01070-dk-compressed.jpg

晚上在秭归县街头走走逛逛,发现小县城真的好有活力,还有不错的商业,只是屈原故里等景点未能打卡,略有遗憾。以后有缘再会。

day 2 - 2024-08-05

今天从宜昌秭归准备去往重庆市。一开始的打算还要经过一下恩施市,并且去看一下【恩施大峡谷】,但是开到高速口还耽误了很多时间,大峡谷门票200+,只玩一两个小时太亏了,也太贵了。后面只好放弃恩施的游玩计划,直驱重庆市。而且导航显示,到达重庆市也要傍晚6点了。这时候我的研究生同学汤工也顺利到达重庆,于是我们汇合,逛吃重庆,夜拍重庆。这样的安排就刚刚好。

早上出门走的国道/省道,拍摄的沿途的三峡景观。

HDK01094-dk-compressed.jpg

听我宜昌的朋友说,前阵子刚泄过洪,所以江水看起来才是浑浊的。不然这段的江水,平时清澈得很。

HDK01133-dk-compressed.jpg

傍晚到达重庆,我们坐了一个公交去往【山城步道】。在重庆坐公交和地铁都是有意思的。

HDK01165-dk-compressed.jpg

透过公交车的玻璃拍摄,尽管玻璃表面不那么干净,但依然能感受到重庆山城的魅力。这段是乘坐的重庆市322路公交,在重庆长江大桥上。

HDK01184-dk-compressed.jpg

山城山城,复杂的城市道路会有上上下下,起起伏伏的坡,于是很多视角都是平原城市所很难看到的。这也是在重庆拍照和拍影片容易出片的原因之一。

HDK01199-dk-compressed.jpg

在山城步道观看远处的【南纪门轨道大桥】。

HDK01214-dk-compressed.jpg

夜幕降临,我们打车来到重庆大剧院这边,欣赏重庆最具魅力的夜景打卡地。实际上我准备了很多地点都想去,但是迫于时间紧张,只能打卡一两个确实遗憾。重庆以后还会再来的。

HDK01260-dk-compressed.jpg

重庆这里的夜景,在国内确实排得上前几的。现场人山人海,我们一度怀疑今天是不是什么假期,哪知道只是一个普通的周一晚上。

HDK01345-dk-compressed.jpg

今天晚上夜宿重庆市南岸区,明天我们将驱车去往川西,我们此行真正的目的地。

day 3 - 2024-08-06

6点钟,我们三人打起精神起床,准备直接前往海螺沟景区。重庆到成都段的高速实在是好开,路平车少,轻轻松松跑120~130。

中午我们在泸定县下高速,然后在一家餐馆吃了饱饱的午餐。转了转泸定桥,后面就继续赶路前往海螺沟了。因为景区最后一班车是15:00发车,景区要求15:00之前到达并检票,由于堵车我们差点没去成海螺沟。

检票后还需要坐很长一段时间的景区大巴车,一路上听着车里的介绍,海螺沟景区(5A)在上次地震受损后实现了重建,如今更上一层楼,几乎所有配置均得到了升级。可尽管如此,我们此行依然有所遗憾,他最上面的索道关停了,我们无法到达最高处近距离欣赏贡嘎雪山了。

一起来欣赏海螺沟里面的风景。

HDK01370-dk-compressed.jpg

幸亏有腾龙28-200镜头,天涯镜名不虚传,出门旅游拍照实在是太方便了。这种大江大河的场景,能拍到比大光圈更加重要。

HDK01375-dk-compressed.jpg

高原小湖泊,海螺沟景区里的小湖。

HDK01421-dk-compressed.jpg

这水有点不太清澈,应该是上游有什么活动导致的。

HDK01423-dk-compressed.jpg

看往景区上游的方向,可惜今天不能到达了。

HDK01430-dk-compressed.jpg

到了川西和藏区,玛尼堆随处可见。在川西和藏区,玛尼堆是一种具有重要宗教和文化意义的石堆。它们通常由信徒在朝圣或旅行途中堆砌而成,象征着对佛教、特别是藏传佛教的敬仰。

HDK01439-dk-compressed.jpg

HDK01452-dk-compressed.jpg

天空美的我说不出话——奈何本人没啥文化,只能说一句美得像画。

HDK01537-dk-compressed.jpg

这边的雪山融水是清澈的。使用慢快门拍出了流水“丝绸”般柔和、平滑的效果。

HDK01549-dk-compressed.jpg

从景区下山后,我们开车走榆磨路去康定市区,今晚将夜宿康定。

HDK01570-dk-compressed.jpg

虽然在海螺沟没有看到雪山,但是天空作美,我们在榆磨路路边看到了“拨开乌云见雪山”,甚至是日照金山!实在是有些激动。第一次看到日照金山的我被深深打动——人们为什么那么向往雪山,因为他就在那里。

HDK01573-dk-compressed.jpg

今天下午乃至晚上的行程有些危险,全程有好几段路路况很差,我们只是一辆轿车。

  • 大车很多,会车很慢
  • 路边很多动力不强的油车打开前机盖给发动机和变速箱散热
  • 快到山顶的时候还遇到大雾,视野变得相当差
  • 好在我不紧不慢的节奏,以及稳定的驾驶,我们在晚上9点多安全到达康定市区
  • 一路上还有一个同样皖A车牌的哥们跟着我们一起下山。在中途堵车的时候他就在后面喊“合肥老乡”了,hhhh。最后因为晚上时间不够就没有在一起聚餐。第二天我们的行程和他们的也不一样,于是就此分别

然后出去觅食,我们吃到了味道极好的【牦牛肉面】。今晚夜宿康定。

day 4 - 2024-08-07

今天从康定到新都桥,路程较少,但中途会有很多观景台可以停车打卡。

早上在康定情歌广场附近拍的。昨晚住在新城,康定情歌广场所处的位置在下游,比较老的城区里。

HDK01597-dk-compressed.jpg

大渡河流经康定市,在此处水面翻涌,水流挺大。

HDK01624-dk-compressed.jpg

康定情歌歌词本打卡。

HDK01627-dk-compressed.jpg

出发去折多山垭口,途中观景台拍摄。

HDK01642-dk-compressed.jpg

去折多山垭口一直在爬坡,居然这里也能拍到雪山!在川西一步一个风景,实在是惊喜,惊喜。

HDK01700-dk-compressed.jpg

快要到垭口的地方,回望上山路,这视野真广阔。该碎碎念腾龙28-200广角端不够广了……

HDK01704-dk-compressed.jpg

从垭口停车休息区开始爬山,因为第一次来海拔4000的高山,我必须慢慢爬,调整呼吸节奏,每一次深呼吸都是尽可能防止高反头痛的发生。在山腰上停留也拍到了远处的雪山。

HDK01732-dk-compressed.jpg

牵着马下山的当地人和巨大的玛尼堆。

HDK01740-dk-compressed.jpg

路过这个小伙子摊位前,我发挥出隐藏e人属性,勇敢的说我可以为你拍两张照片吗?他轻轻地点了点头,然后十分认真的看着我的镜头。我一共拍了三张,每一张他的眼睛都很干净和光亮。我好几个同学朋友说,“这有点像丁真了……”

HDK01752-dk-compressed-mosaic.jpg

这些雪山几乎都是200mm超长焦拍摄的,实际上雪山距离我们还是很远的。

HDK01775-dk-compressed.jpg

俊俏的马儿,背景很美~

HDK01787-dk-compressed.jpg

去往康定机场的路上。

HDK02067-dk-compressed.jpg

在斯丁措拍摄。

HDK02077-dk-compressed.jpg

斯丁措景点附近的牦牛,行走的牦牛肉干。

HDK02082-dk-compressed.jpg

这是去往红海子的路上。

HDK02092-dk-compressed.jpg

通过一些具有玛尼堆景物的前景,想表达一下远处高山的巍峨,表现力应该还可以吧。

HDK02248-dk-compressed.jpg

这是在【进村路】上,一路的高山草甸,太美好了!如果不是高原的阳光太晒,我的感受还要加10分。

HDK02252-dk-compressed.jpg

从【红海子】前往【新都桥镇】,汇入318国道之前会走这一段【进村路】,风景很好,属于旅行中的意外之喜。

HDK02264-dk-compressed.jpg

傍晚我们驱车来到【新都桥镇 - 贡嘎雪山观景台】,观景台本身是免费的,爬上来时还是出现了一点高反的症状,不过为了在山顶看到贡嘎雪山,我也仍然坚持了下来。

HDK02310-dk-compressed.jpg

看到几个小伙子自驾游,也驻足这里拍贡嘎。一个是富士xt5 150-300mm(可能不太对),这个等效全画幅焦距需要乘以1.5裁切因子;另一个是尼康Z5 全画幅,镜头好像是24-200。我们交流着如何拍到更具细节、分辨率更高的雪山山体。还调侃脖子上挂着诸多相机,却依然掏出手机拍照的一些网络名场面,哈哈哈

HDK02325-dk-compressed.jpg

然后我真的拍到了贡嘎雪山的尖尖,虽然没有日照金山那般震撼,但这是贡嘎 7556m 的尖尖,能看到拍到依然非常兴奋。

HDK02330-dk-compressed.jpg

夜晚汤工在新都桥镇住的民宿,我和我哥决定在呷八乡露营。我换上了SONY FE 35mm F1.8 镜头,架上了三脚架,尝试夜拍一下星空。于是拍到了下面几张照片。

HDK02349-dk-compressed.jpg

璀璨的星河,真的美丽。

HDK02360-dk-compressed.jpg

这一张,前景有草,中景有山,背景有银河星星。此行我最喜欢的照片之一。

HDK02363-dk-compressed.jpg

由于偷懒没带睡袋,夜里在帐篷里通过几个毯子保暖还是不够,一夜蜷缩着双脚,艰难的度过了一晚。谁能知道这时候江浙沪晚上的户外还有34度,和这里比起来就是不开空调无法睡觉。来这里避暑果然还是有点先见的。

day 5 - 2024-08-08

昨晚在呷八乡露营,今早有一个大妈牵着马过来问我们是否骑马,被我们婉言拒绝后她图穷匕见,向我们索要20元的露营费🏕️。🤣,没办法我们也只好给了。

今天的计划是打卡一下【塔公草原】、【墨石公园】、【木雅大寺】、【青绕神山】,然后折返直接走318去往泸定,并从泸定上高速回成都。

因为我们的计划是走川西小环线,但是从丹巴县到小金县的路被封了,由于地质灾害造成的道路中断,我们只能绕行北面的317国道,但是这样会增加7个小时的车程,迫于时间上的考量,我们直接放弃了环线后面的内容。真是遗憾,但后会有期。

川西小环线推荐住宿点.jpg

不是很懂,塔公寺门口这个老人转着手里的这个东西…… 手持转经筒?感受到一种虔诚和坚定,有一点震撼我心。

HDK02385-dk-compressed.jpg

塔公草原的某一侧。

HDK02482-dk-compressed.jpg

塔公草原需要20元门票,不建议买票进去。附近太多出片的好地方,没必要花钱进去。

HDK02493-dk-compressed.jpg

好多马儿,这是可以花钱坐上去然后骑到(被人牵着走)塔公草原景区里的山顶上的。

HDK02501-dk-compressed.jpg

骏马1

HDK02505-dk-compressed.jpg

骏马2,白色皮肤版,帅气呀

HDK02508-dk-compressed.jpg

墨石公园打卡成功。我哥用无人机拍了一些场景,我们又节省了门票和时间。

HDK02528-dk-compressed.jpg

两张墨石公园航拍。

墨石公园位于中国四川省甘孜藏族自治州道孚县,是一处独特的自然景观区。它因其独特的地质景观和丰富的文化底蕴而备受游客青睐。公园得名于其广泛分布的黑色岩石,这些岩石在阳光照射下泛着淡淡的金属光泽,像极了墨色的画卷。

墨石公园被誉为“中国的天然地质博物馆”,拥有多种地质遗迹和奇特的岩石形态,如石林、石柱、石峰等。它形成于大约1.4亿年前的侏罗纪时期,经历了长期的地质演化和风化作用,使得这一地区的岩石形状各异,充满了自然奇观。

此外,墨石公园还紧邻丰富的人文景观和多样的少数民族文化,您可以在这里欣赏到藏族、羌族和彝族等少数民族的传统文化和习俗。

总体而言,墨石公园结合了壮丽的自然风光和深厚的文化底蕴,是一个值得探索和体验的旅游胜地。

引用内容来自 GPT4

墨石公园航拍1-压缩后.jpg

墨石公园航拍2-压缩后.jpg

木雅大寺这边还是很震撼的,视野极度广阔,建筑也非常具备特色。

HDK02545-dk-compressed.jpg

经典——藏民的摩托车,寺庙当中的年轻僧人。

HDK02549-dk-compressed.jpg

我叫不上名字的雪山一隅。

HDK02588-dk-compressed.jpg

来到青绕神山,拍到了这张拥有广阔视野的高山草原。

HDK02603-dk-compressed.jpg

从青绕神山这边看到的雪山应该是雅拉雪山。

HDK02623-dk-compressed.jpg

随后一直赶路,直到到达成都。晚上还和另外几名同事汇合,我们在成都吃了美美的一顿火锅。

相聚成都火锅-压缩后.jpg

day 6 - 2024-08-09

今天计划在成都稍微转一转,下午就启程回合肥了。

准备在成都买一点大熊猫周边,哈哈

你在成都?记得带“熊猫”回来哈!

IMG_20240809_123751-dk-compressed.jpg

宽窄巷子附近好多特产店~嘿嘿这也是我第一次来成都🤣

IMG_20240809_123757-dk-compressed.jpg

买了三个熊猫周边。可爱捏

IMG_20240809_124920-dk-compressed.jpg

IMG_20240809_125023-dk-compressed.jpg

IMG_20240809_125249-dk-compressed.jpg

今天成都下了超级大的雨。把汤工送回酒店之后我和我哥踏上了归程。从成都收费站上高速。成都,以后再见了。

IMG_20240809_144424-dk-compressed.jpg

19:36 左右,路过重庆万州这边。

IMG_20240809_193654-dk-compressed.jpg

20:53分穿过隧道到达重庆第一县——云阳县,真是一坐极具三峡特色的县城,以后有空必须再来逛逛。

经过重庆万州的一些省道,路边的村民都拿着蒲扇,围在一起唠家常,我真是很久没有亲眼看到过这样的景象了,只觉得他们的生活非常惬意,虽然平淡但是尽享生活。我们都在城市当牛马,身边除了班味,很少能感受到这样的风土人情。

穿过隧道之后看到如此灯火通明的城市,一瞬间又让我有些感动。有一点绝处逢生的感觉——当你在逆境中待久了,重新回到人类文明集中的世界那种解脱感、安全感。也许最好的生活方式是城市和农村的结合,不能久处城市,更不能久处农村。

IMG_20240809_205342-dk-compressed.jpg

今晚夜宿重庆云阳县。

day 7 - 2024-08-10

早上从云阳出发回合肥。随意瞥见的长江山城——重庆云阳。

mmexport1723244521468-dk-compressed.jpg

早晨07:14的云阳街头。

IMG_20240810_071442-dk-compressed.jpg

吃一份重庆小面再出发。

IMG_20240810_072723-dk-compressed.jpg

在加油站旁边拍到的云阳景色。

IMG_20240810_073124-dk-compressed.jpg

不愧是重庆第一县城,从新城的建筑看还是蛮繁华的。

IMG_20240810_073522-dk-compressed.jpg

经过了白天的不懈赶路,我们在傍晚6点40到达了合肥新桥机场附近。

IMG_20240810_183912-dk-compressed.jpg

随后便是顺利抵达合肥,安全完成我们的宜昌 - 重庆 - 川西小环线之旅。虽有遗憾,但见到了许多未曾见识的风景,值也值也。

day 8 - 2024-08-11

今天在合肥休息,下午走高速回南京。


全程一共走了4148公里,我用高德 web 制作了全程路书,和实际里程还是蛮吻合的。

Screenshot_2024-08-12-10-52-03-186_com.autonavi.minimap-dk-compressed.jpg

本次旅程除了康定-新都桥那天,其余每天都在路上奔波,的确辛苦和疲惫,但就是痛并快乐着。以后类似的旅行,我得花更多的预算,以求一个更加舒服的旅行体验。

引用

感谢阅读。有感兴趣的欢迎在评论区与我讨论。

2022年打卡南京市区人防工程纳凉点

重要提醒——本文是补档,因为原文 打卡南京市区人防工程纳凉点 访问经常出现问题,原因是所在服务器资源不足。


第一天首探

2022-08-01 20:58:41 update

原视频中的是菠萝山人防工程(鼓楼区广州路229号),这个好像装修不错,具有桌椅还有 wifi。


还记得这个吗?2022-07-11 有个南京同城热搜。我今天去打卡一下南京市区的人防工程纳凉点。

【南京人防工程纳凉点开放至8月底】 同城热度5784 | @江苏新闻

https://s.hellodk.com/2qz3kis0

1.jpg

原微博热搜直链 https://m.weibo.cn/search?containerid=100103type%3D1%26t%3D10%26q%3D%23%E5%8D%97%E4%BA%AC%E4%BA%BA%E9%98%B2%E5%B7%A5%E7%A8%8B%E7%BA%B3%E5%87%89%E7%82%B9%E5%BC%80%E6%94%BE%E8%87%B38%E6%9C%88%E5%BA%95%23

首条微博直链 https://m.weibo.cn/detail/4789784855450027

截图如下

2.jpg

今天我就试图体验打卡一番。

搜了各个地点,挑选了前两天决定前往。

  • 北极岩人防工程(鸡鸣寺那里)
  • 北极西村人防工程(北极西村31号104室)

先去了北极西村,事实上不太好找。

3.jpg

工作人员让我扫了场所码之后我就下阶梯,下了两段楼梯,好家伙,确实好凉快。

4.jpg

工作人员和我说里面有施工🚧️的。可是我没想到,我进去后居然只有我一个市民,其他的都是工人。😂️

5.jpg

等等,这么拉胯?和我在网上看到的不一样呀🤣。。而且这都8月1号了,你7月1号开始整的活,一个月了还是这个进度,有点对不起老百姓了啊。看来我在网上看到的是鸡鸣寺那里的那个,那个还有桌子,还有饮用水之类的,里面的装修也好很多。不过无可厚非,拿来宣传,肯定找最好的。

6.jpg

我放下书包,拿起米家温湿度计 Pro,一开始温度 35.4℃(图片中是35.0,并非一开始的温度),此时下午 4点18。

7.jpg

这里面是真的凉快啊,温度下降的也很快,还有两个工业用的风扇一直吹。4点24的时候温度已经下降到26.3℃了。我决定等到28分,看看十分钟后温度下降到多少。

8.jpg

下午4点28分,温度24.2℃,我已经感觉到冷冷的了😂️,29分时把温度计放回包里表显23.8℃,狠!我书包里还背了 MacBook Pro,我打算来这里上网的,因为网上说还有免费 wifi 🙃️。于是我就出发吧,去鸡鸣寺那个。

9.jpg

这两个人防工程离得不远,骑车不到2公里就到了。

10.jpg

11.jpg

骑车到了这边发现不给进了,写着服务到下午5点。这么热的天不给到9点嘛,你网上是咋宣传的呀,视频里也说的到9点呀,顿生强烈鄙视之感。这个时候不给服务到9点那是啥时候服务到9点。

12.jpg

然后也就没什么好看的了,回吧~~~

这么热的天,还有许多游客来玄武湖、鸡鸣寺游览也是真的勇士。

Allen Hua at 2022-08-01 17 : 55 : 22

第三天再探

第二天下午下了暴雨,但我没灰心,第三天下午又来了。下午的室外确实是无敌的炎热,我选定了菠萝山的人防工程,在高德地图上的 label name 只有 应急掩蔽场所 鼓楼区广州路229号

骑车到虎踞关广州路的丁字路口,找地方停车然后沿着坡道(广州路)往上走,在一处宾馆前面就能看到标识,进入即可。

菠萝山人防工程.jpg

111.jpg

222.jpg

进去是个宾馆,纳凉的地方还要继续往里走。扫场所码,老奶奶说没有口罩不给进,但我没带诶,老奶奶有点不情愿得给了我一个新的口罩😁️,谢谢她老人家。

里面确实要好很多哇,有免费的水、wifi、报刊、桌椅,这点有点像话甚至是非常不错了。里面的空间也比北极西村的要大很多。

333.jpg

444.jpg

里面除了我只有一个年轻人,偷看到屏幕好像是在浏览马蜂窝。

555.jpg

人防工程里都没有手机信号,这个有 wifi 真滴蛮不错,离得近的话不论老少皆宜,而且这个开放到晚上9点,给个大大好评💯️。

针不戳。

2024年带着A7C2+腾龙28-200 再次来到红山森林动物园

2024年7月27日,我顶着35度高温天气去拍红山的毛孩子们。

上一次来红山森林动物园是21年。当时有记录下来这样一篇: 南京红山森林动物园附近纪实照片分享

这几年红山动物园真是在网上大火呀,经营状况比起前些年大有改善。就在前天那么炎热的天气下,仍然有很多很多游客前来游玩。替红山森林动物园高兴!

拓展阅读:
曾亏3000万的南京红山动物园,如今将它的小动物变成了顶流
票价40,火过迪士尼?中国穷鬼乐园,终于开窍了

这一次带着刚买不久的腾龙28-200mm 镜头,来试试小长焦拍小动物的效果。来时在小红书做了一下停车攻略,停哪里呢?我选择停在了「十字街」道路两侧,🈶️划车位,并且没有收费,美滋滋。千万不要开车去动物园北门,堵死。开车导航去 【碧玉苑】 或者 【御林山庄】 ,这两个小区门前都有设立道路停车位,费用不记得了,好像是一块钱一小时。

这么热的天气下大爷们在下棋,好一闲情雅致。

DSC00580-dk-compressed.jpg

门票40元,美团和线下购买同价。

DSC00585-dk-compressed.jpg

DSC00588-dk-compressed.jpg

大狮子🦁️。

DSC00598-dk-compressed.jpg

脑斧。🐅️

DSC00604-dk-compressed.jpg

这叫什么来着,瘦猫还是啥来着,猫科王国看到的。

DSC00613-dk-compressed.jpg

这是狐獴,也叫细尾獴。站起来时好有趣。这几张看起来长焦真的好啊,能拍到比画质好更重要,当然了,两者全都要也好,可惜要么价格贵,要么这样的产品还没有开发出来。

DSC00625-dk-compressed.jpg

DSC00630-dk-compressed.jpg

DSC00635-dk-compressed.jpg

动物园内小火车的轨道。

DSC00640-dk-compressed.jpg

猴山里的吗喽。🐒️😄️

DSC00648-dk-compressed.jpg

DSC00651-dk-compressed.jpg

这张好喜欢,抓拍到了,热得我满头大汗。

DSC00662-dk-compressed.jpg

长颈鹿。🦒

DSC00666-dk-compressed.jpg

大象。🐘️

DSC00671-dk-compressed.jpg

国宝大熊猫。🐼️ 哈哈 抓拍了好多张。

  1. 玻璃好脏,好难拍一张干净的照片
  2. 一直在吃东西,导致快门时间经常需要好几秒才能正常曝光。最后只好强设2500以上的 ISO,终于拍到几张不错的,噪点没啥明显感知,这就是索尼全画幅的威力吗?看来以后要多用范围内的(比如 50 - 6400)自动 ISO 功能

DSC00686-dk-compressed.jpg

DSC00693-dk-compressed.jpg

吃竹子吃得贼hi

DSC00724-dk-compressed.jpg

没看到小熊猫~ 天太热啦。

DSC00733-dk-compressed.jpg

此时快6点了,将要闭园。我是4点进园的,暴走俩小时。什么鸟🦆不知道。

DSC00741-dk-compressed.jpg

不认识的🦆。

DSC00743-dk-compressed.jpg

碰到一个大哥,牛逼的很,适马sigma 600mm。忘了问他机身是啥……

DSC00749-dk-compressed.jpg

可能是适马 SIGMA 150-600mm F5-6.3 DG OS HSM | Contemporary

官方页面: http://www.sigma-photo.com.cn/lenses/overview?id=40 看了一下京东价格,索尼E口是 8499 元,还不错~~~

适马sigma150-600变焦镜头.jpg

我看他拍鸟这么有兴致,我也赶紧拉到200mm F5.6 试试看打鸟 🤣

DSC00756-dk-compressed.jpg

热🥵热。我来得稍微有些晚,像是考拉🐨️馆,16:30就闭馆了。而且很多动物拍不到,因为他们的家都太大了[笑哭],而且有时候躲在人类看不到的角落[旺柴]。

红山对动物,是尊重,是保护,更是爱护。不是把动物放进一个铁笼子或者钢筋混凝土构成的空间,而是精心给他们创造了一个类似他们原本生活地方的家,感谢这么有爱的动物园~

入手a7c2第一个变焦镜头腾龙28-200体验分享

我挑选第一颗变焦镜头有参考很多文章、帖子和视频,写了一篇文章记录挑选过程,2024年7月索尼A7C2的第一颗变焦镜头选择 .

过一两周有计划出门旅行,在综合了诸多方面:价格、焦段实用程度、画质表现、光圈大小、镜头发布年月、二手市场流通性/受欢迎程度等等因素,我还是决定先买腾龙 28-200,原厂的 20-70 F4是一开始的打算,但是在旅游一镜走天下方面,还是200mm 更香。

现在腾龙28-200 京东自营价格还是要 5490,综合考虑之后决定买一个靠谱二手。最后就收到了成色很好的腾龙28-200 ~ 🥳

二手腾龙28-200商品说明.jpg

腾龙28-200二手闲鱼.jpg

卖家箱说全,这点很重要。买这种数码类产品,最好原始包装盒保留一下,考虑到未来出二手,会方便一些,也能有一些优势。买家一般优先选那些箱说全的。到货 check 一下……

腾龙28-200到货盒子.jpg

看不出明显的使用痕迹,很不错了。

腾龙28-200到货check 一下.jpg

下面是我拿出去拍的一些照片。

DSC00511-dk-compressed-dk-compressed.jpg

DSC00518-dk-compressed-dk-compressed.jpg

DSC00527-dk-compressed-dk-compressed.jpg

DSC00530-dk-compressed-dk-compressed.jpg

DSC00532-dk-compressed-dk-compressed.jpg

DSC00534-dk-compressed-dk-compressed.jpg

DSC00536-dk-compressed-dk-compressed.jpg

DSC00547-dk-compressed.jpg

DSC00565-dk-compressed.jpg

DSC00574-dk-compressed.jpg

对于这颗镜头的表现,初步给出印象分8分(满分10分)

  • 28-200mm 焦段实用性拉满,满足个人绝大部分使用场景。即将开启的旅行计划在川西拍摄星空,到时候用 FE 35mm F1.8 和这个 28mm F2.8 都试试。这颗大便浇头在28mm广角端拥有F2.8光圈,到时候都试试看效果,实践出真知
  • 画质个人感觉够用,不是专业用户,也不是靠摄影吃饭的用户应该收收味。网络上推崇的器材和装备党实际上是一种攀比行为,容易对新人造成不良引导
  • 体积控制可能很难再优化了,但确实还是蛮大蛮重的。但是在类似规格的情况下,腾龙这颗镜头也才575g,相对而言还是优秀的

这颗镜头官方介绍页 https://www.tamron.com.cn/cameralens/products/a071/index.shtml

总体体验不错,后面拍了新的片子会继续分享。

使用 exiftool 方便快捷写入图片的 exif metadata

我现在都在用 squoosh 批量压缩照片。但是 squoosh 压缩出来的图片丢失了 exif 数据,不论是网页还是终端 squoosh-cli。关于使用终端 squoosh-cli 批量压缩图片,你可以阅读我写的 [可能是]最好的压缩图片程序,使用 squoosh-cli 批量压缩图片

关于在得到压缩后的图片不丢失exif元数据这个问题,我尝试了其他压缩工具,比如 tinypng.com 也一样无法实现目的。

tinypng.com 的 web,压缩后的图片无法得到元数据。然后我关注到了其 API,https://tinypng.com/developers/reference/java

保留元数据.jpg

我写了段Java代码试了一下,通过调用方法 source.preserve("copyright", "creation", "location"); 可以保存元数据

System.out.println("start to tiny your images...");
        try {
            String path = "c:\\users\\dk\\downloads\\IMG_1989.jpg";
            Source source = Tinify.fromFile(path);
            String lowercasedPath = path.toLowerCase(Locale.ROOT);
            Source sourceWithMetadata;
            if (lowercasedPath.endsWith(".jpg") || lowercasedPath.endsWith(".jpeg")) {
                //location
                sourceWithMetadata = source.preserve("copyright", "creation", "location");
            }
            else {
                sourceWithMetadata = source.preserve("copyright", "creation");
            }
            sourceWithMetadata.toFile("c:\\users\\dk\\downloads\\IMG_1989-dk-compressed.jpg");
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }

但是经过实践发现只保留下来了图片拍摄时间。我想要的相机信息,镜头信息,拍摄参数(比如快门时间、ISO大小、光圈大小)等还是丢失了。

经过一番研究,我最终转变了思路。 使用 exiftool 工具写入照片的原始exif metadata,我之前居然不知道 exiftool 这么好用的工具。

官网 https://exiftool.org/

ExifTool 由 Phil Harvey 开发,是一款免费、跨平台的开源软件,用于读写和处理图像(主要)、音视频和PDF等文件的元数据(metadata)。ExifTool可以作为Perl库(Image::ExifTool)使用,也有功能齐全的命令行版本。ExifTool支持很多类型的元数据,包括Exif、IPTC、XMP、JFIF、GeoTIFF、ICC配置文件、Photoshop IRB、FlashPix、AFCP和ID3,以及众多品牌的数码相机的私有格式的元数据。

本段介绍source

我在 squoosh 容器当中继续操作。

squoosh 容器基于 alpine 镜像制作,所以使用 apk 安装 exiftool 即可。

# apk add exiftool

然后编写一段 shell 脚本。

2024-08-02 19:18:18 新增一些说明

  • 我做的 dko0/squoosh:v1.12.0 镜像是支持amd64, arm64 and arm v7 arch这三个架构的,但是只有在 arm64 机器上运行的容器安装了vim之后才能正常运行。在amd64机器上pull了此镜像后启动一个容器然后通过apk安装vim会无法运行,都会报错Segmentation fault (core dumped)。关于这个问题我检查了很多东西,发现可能是 alpine linux 和不同架构的相关依赖实现的问题
  • 由于 Alpine Linux 使用的是轻量级的 musl libc,而不是更常见的 glibc,这可能会导致某些软件在运行时出现兼容性问题
  • alpine linux 默认使用 /bin/ash 作为 default shell,而且内置的 vi 等命令都是来自 busybox,简体中文不太好支持。所以下面的 shell 我最终改用 /bin/bash 编写。我放在宿主机 debian 执行了
  • debian 需要通过 apt-get update && apt-get install -y exiftool 安装 exiftool 工具
#!/bin/bash

# 检查是否提供了必要的参数
if [ -z "$1" ] || [ -z "$2" ]; then
    echo "Usage: $0 <input_dir> <output_dir>"
    exit 1
fi

# 从命令行参数中读取输入目录和输出目录
input_dir="$1"
output_dir="$2"

# 检查输入目录是否存在
if [ ! -d "$input_dir" ]; then
    echo "Input directory '$input_dir' does not exist."
    exit 1
fi

# 检查输出目录是否存在
if [ ! -d "$output_dir" ]; then
    echo "Output directory '$output_dir' does not exist."
    exit 1
fi

# 如果 output_dir 以 / 结尾,删除末尾的 /
if [ "${output_dir: -1}" = "/" ]; then
    output_dir="${output_dir%/}"
fi

# 定义要处理的文件扩展名
exts=("jpg" "JPG" "jpeg" "JPEG")

# 遍历所有指定文件扩展名的图片文件
for ext in "${exts[@]}"; do
    for input_file in "$input_dir"/*."$ext"; do
        # 检查文件是否存在
        if [ ! -f "$input_file" ]; then
            continue
        fi

        # 提取文件名,不带路径
        filename=$(basename "$input_file")

        # 构建目标文件路径
        output_file="${output_dir}/${filename%.*}-dk-compressed.jpg"

        # 检查压缩后的文件是否存在,以防万一
        if [ ! -f "$output_file" ]; then
            echo "File $output_file does not exist, skipping..."
            continue
        fi

        # 复制 EXIF 元数据
        exiftool -TagsFromFile "$input_file" -all:all "$output_file"
        echo "$output_file exif metadata write success."

        # 删除生成的备份文件(-TagsFromFile 操作会创建一个备份文件)
        rm "${output_file}_original"
    done
done

将此 shell 文件保存为 /home/dk/copy_exif.sh

使用时的命令:~/copy_exif.sh . ./output/

解释说明:

  1. 该脚本从命令行参数中读取输入目录和输出目录,可以是相对路径。会将输入路径下的所有 xxx.jpg 的元数据读取出来,写入当前文件夹下的 output 目录中的 xxx-dk-compressed.jpg 文件中,这样刚好能确保 exif metadata 有正确的归属关系
  2. 记住添加可执行权限 chmod +x /home/dk/copy_exif.sh
  3. 我使用 dk 这个用户执行,因为 squoosh-cli 也是在 dk 这个用户下执行的。不在 root 下操作是不希望破坏文件权限和所有者,宿主机内的文件系统还通过 samba 挂载了,其他设备访问时如果是 root 用户操作的会无法删除文件(没有写权限)

经过 exiftool 写入exif元数据之后,文件会变大一丢丢。通过下面一个case 粗略估计文件体积会增大5%。

写入exif metadata元数据前后文件大小对比.jpg

可以看到压缩后的照片也具有了元数据了,这对我将文件存放在 immich 里时可以有更好的读写性能,并且在浏览照片时也能看到照片 exif 信息,这对我很重要。

保留了元数据.jpg

当然具备完整细节的原图还在SD卡/电脑里备份着。

使用JavaScript抓取易车销量排行榜数据到一个页面上展示

易车销量排行榜页面是 https://car.yiche.com/newcar/salesrank/ ,由于易车 web 端没有提供一页展示多少条数据的功能,所以浏览这个排行榜时就得一页一页的翻,想查某一车型的销量数据很不方便。

但是易车手机app是可以一页展示的,而且也能搜索车型,不过碍于手机屏幕过小,我还是希望在 web 上查看,可以利用 Control + F 功能,更快速的寻找想要的数据。

  • 首页 https://car.yiche.com/newcar/salesrank/
  • 非首页 https://car.yiche.com/newcar/salesrank/?page=xxx

当前时间是 2024-07-10 13:47:01,默认展示的是上一个月的数据,也就是2024年6月份的销量排行榜。

如果想抓取2024年5月的数据,请求地址是

  • 首页 https://car.yiche.com/newcar/salesrank/?date=2024-05-01
  • 非首页 https://car.yiche.com/newcar/salesrank/?date=2024-05-01&page=xxx

其中 xxx 代表页码。

我抓取了 2024年6月的国内汽车销量数据,生成了一个静态页面。欢迎查阅:2024年6月国内汽车销量排行榜-按车型分

下面是源码

(async () => {
    const totalPages = 62; // 一共62页

    const fetchDataForPage = async (pageNum) => {
        let pageUrl = `https://car.yiche.com/newcar/salesrank/?page=${pageNum}`;
        const response = await fetch(pageUrl);
        const text = await response.text();
        const parser = new DOMParser();
        const doc = parser.parseFromString(text, 'text/html');
        // 返回整个 div.rk-list-box 元素
        return doc.querySelector('div.rk-list-box');
    };

    // 定义睡眠函数
    const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));

    // 获取第一页的数据,并初始化页面
    let mainListBox = document.querySelector('div.rk-list-box');

    if (!mainListBox) {
        console.error('初始化时无法找到 div.rk-list-box 元素');
        return;
    }

    for (let i = 2; i <= totalPages; i++) {
        console.log(`正在抓取第 ${i} 页的数据...`);
        const pageListBox = await fetchDataForPage(i);

        if (pageListBox) {
            // 查找并更新所有懒加载图片
            const lazyImages = pageListBox.querySelectorAll('.rk-img.lazyload');
            lazyImages.forEach(img => {
                if (img.dataset.original) {
                    img.src = img.dataset['original'];
                }
            });
            // 将新页的数据追加到现有的列表中
            mainListBox.append(...pageListBox.children);
        } else {
            console.error(`第 ${i} 页的数据抓取失败`);
        }

        // 每抓取一页后等待15秒
        await sleep(15000); // 15秒
    }

    console.log('所有数据抓取完毕!');
})();

页面数据抓取完成之后,利用 chrome extension SingleFile 保存成一个 html 文件。

  • 源码地址 https://github.com/gildas-lormeau/SingleFile
  • Chrome Web Store 地址 https://chromewebstore.google.com/detail/singlefile/mpiodijhokgodhhofbcjdecpffjipkle

Web Extension for saving a faithful copy of a complete web page in a single HTML file

然后我将这个htm文件托管到了自己的服务器上,尽管这个文件有 44MB,但是加载好之后通过 Control + F 查找车型和销量数据实在是太方便了。

使用JavaScript脚本快速获取B站观看历史记录页面的视频标题和URL

哔哩哔哩观看历史记录的页面地址是 https://www.bilibili.com/account/history

有时候我想分享最近观看的几个视频给朋友,尤其是在我使用关键字搜索之后的列表,会有好几个条目,一个一个打开并复制出一个干净的标题和干净的视频地址太麻烦了。于是我用js写了一段脚本快速获取页面上的视频标题和URL

源码如下

// 使用 querySelectorAll 选择符合路径的 div
const targetDiv = document.querySelector('#history_list');

// 检查 targetDiv 是否存在
if (targetDiv) {
    // 在 targetDiv 内选择所有的 li 标签
    const liTags = targetDiv.querySelectorAll('li');
    let title_url = '';

    // 遍历每一个 li 标签,获取其内容
    liTags.forEach(liTag => {
        const titleA = liTag.querySelector('a.title'); // 获取 class 名称是 title 的那个 a 标签
        if (titleA) {
            let url = titleA.getAttribute('href'); // 获取链接地址
            let title = titleA.textContent;
            if (url) {
                let originStr = url.trim(); // 原始字符串
                url = `https:${originStr.replace(/\?.*$/, '')}`; // 利用正则格式化,前面拼上 https: 顺便把半角问号和后面的字符串都remove掉
                title_url += '- ' + title + ' ' + url + '\n'; // 拼接英文减号和空格,再拼上视频标题和空格,最后拼上视频地址
            } else {
                title_url += '- No title attribute\n'; // 如果没有 title 属性,添加提示
            }
        }
    });
    console.log(title_url)
} else {
    console.log('无法找到目标 div');
}

使用方法

  1. 打开历史记录页面,搜索某关键词(搜索是可选项,不搜索也可以,但是js脚本只会收集出页面已加载的内容)
  2. 按下键盘F12,切换到 Console 标签
  3. 粘贴如上代码后回车即可。如果此网站不允许粘贴,临时在Console中键入allow pasting 回车即可。不过B站的web是允许粘贴的

举例,我使用富士搜索出如下视频

富士搜索结果.jpg

执行js代码之后快速获取了这些视频的标题和URL

执行后效果.jpg

刚好我顺手记录一下这些视频的地址。下面各二级标题就是我使用标题搜出来的结果(基于我最近观看的视频)。不太清楚,B站历史记录的最大条目好像是 1000?(有知道的朋友欢迎留言评论)

富士

索尼

直出

创意外观

ok, that's all.

入门三脚架推荐|云腾VCT-668配合索尼A7C2+FE 35mm F1.8 第一次夜景出片

这几天很喜欢AI陶喆演唱的《泪桥》,陶比特泪目😭️,今天的文章我想用它作bgm,下面请收听

一些说明

  • 原曲来自伍佰2003年发布的同名专辑《泪桥》
  • 上面AI陶喆唱的编曲来自B站火鸡,https://space.bilibili.com/247308944 火鸡编曲的泪桥 https://www.bilibili.com/video/BV1P4421X79K/

最近长三角地区受副热带高压影响,都是晴好的天气,虽然巨热,但是天空晴朗,空气能见度高。17年毕业季班级出资送了我一个三脚架,但是弄丢了已经,今天自费买一个,哈哈。

依然是选择入门性价比的三脚架产品,不用来干活,不用来吃饭,个人用用玩玩就够了。

在预算100多的条件下,我只留下了两个候选:

  • 云腾 VCT-668
  • 优篮子 Ulanzi 青葱-影

优篮子整体设计和用料做工会更好一点,还有白色款,颜值真的高很多。但是现在价格298,查了一下历史低价,也看了B站一些视频的评论区,有些人实付款170就买到了……我现在原价购买就是大冤种。

也查了云腾 VCT-668的历史低价,100,现价118,于是果断入手。

周四晚上23点之前买的,希望周五下午就能到货,只有京东自营做得到了。

IMG_20240705_170957-dk-compressed.jpg

下了班之后我直奔蒋王庙,顾不上吃碳水,想着这大热天流汗还能燃脂……

35 36度的天,背着书包+三脚架爬山已经很难了。这些人为了赚点小钱,背着这么多矿泉水在山间各休息点卖,真是好不容易啊。

IMG_20240705_192523-dk-compressed.jpg

爬到山顶天完全黑了,为了早些到达山顶我还一路超人,导致周末肌肉酸痛[捂脸]

手持1.3s长曝光。

DSC00362-dk-compressed.jpg

感觉晚上天空反而没有那么纯净。头陀岭这两个观景台,护栏太高了,人又很多,不太好找机位。凑合拍了几张,感觉还没有小米14 Ultra 拍得好呢。虽然 FE 35mm F1.8 有 F1.8 大光圈,但是手机摄影的夜拍实在是厉害,计算摄影不容小觑。

DSC00365-dk-compressed.jpg

下面圆拱顶带灯的建筑是岗子村太阳宫,远处的湖是玄武湖,再远处的江是长江。A7C2全画幅 sensor 3300万像素的照片,原图解析力还是很不错的。

DSC00373-dk-compressed.jpg

DSC00377-dk-compressed.jpg

下山后我还去了一趟玄武湖,拍了几张,此时大腿和膝盖已经在疼了 [捂脸]

DSC00385-dk-compressed.jpg

ISO手动指定到了100,画面纯净度没得说,比手机自动模式强。

DSC00389-dk-compressed.jpg

树上的细节清晰可见,不错。

DSC00393-dk-compressed.jpg

就拍了这么多,天气实在是太热了,后面天气合适时再战。

Windows 11 Docker Desktop 更换默认C盘存储路径,释放C盘空间

我们知道,Docker Desktop 在win上默认存储的路径是 %LOCALAPPDATA%\Docker,实际存储路径:C:\Users\dk\AppData\Local\Dockerdk 是你的用户名。

我的C盘还是出厂自带的512G固态,虽然我没有分区,将所有空间都给了C盘,但随着 docker 的使用,Windows创建vhdx后缀的磁盘镜像文件不断扩容,这个文件越来越大,当然还有其他大文件。

使用 WinDirStat 软件分析,我的 Docker 目录占用了 107.4GB,这对 512GB 固态来说有点吃力。很遗憾忘了截图,当时的C盘只剩34GB空闲空间,已经爆红了……

win_dir_stat分析结果.jpg

所以我打算 migrate Docker Desktop root storage path for windows...

使用 docker image prune -af 或者 docker system prune 这些方法只能释放一部分空间。

还看到使用压缩镜像的方式减小镜像文件体积的方法。

但使用符号软链接的方式是最优雅的,改动最小,实现起来也最简单,还最能释放空间。

docker root路径迁移 cmd 命令列表.jpg

看上图,整体思路

  1. 退出 Docker Desktop
  2. 创建文件夹 E:\docker_desktop_files
  3. 复制 C:\Users\dk\AppData\Local\Docker 下面的所有文件到 E:\docker_desktop_files
  4. 使用管理员权限打开一个 cmd 窗口,进入路径 C:\Users\dk\AppData\Local
  5. 重命名 Docker 文件夹为 Docker_bak,这一举作用有二:让Docker客户端知道 C:\Users\dk\AppData\Local\Docker 路径已不存在;暂时只是重命名文件夹,相当于一个备份,如果后续迁移出现问题,比如无法打开 Docker Desktop,还能改回来
  6. 创建符号链接mklink /j "C:\Users\dk\AppData\Local\Docker" "E:\docker_desktop_files"
  7. 再次打开 Docker Desktop,正常运行
  8. 删除 Docker_bak 文件夹,释放了 C 盘很多空间。再次检查 C:\Users\dk\AppData\Local\ ,发现生成了一个带有符号链接标志的 Docker 文件夹

带链接符号的 Docker 目录.jpg

下面给出上面部分命令的解释

# 使用管理员权限打开一个 cmd 窗口,进入路径 `C:\Users\dk\AppData\Local`
cd C:\Users\dk\AppData\Local\

# 重命名 `Docker` 文件夹为 `Docker_bak`,使用 ren 命令重命名
ren Docker Docker_bak

# 创建符号链接,左边路径是 Docker Desktop 程序默认读取的路径,E:\docker_desktop_files 是软链接过去的路径
mklink /j "C:\Users\dk\AppData\Local\Docker" "E:\docker_desktop_files"

再次打开 Docker Desktop,发现程序和里面的镜像、容器等都正常。通过 rmdir /s /q Docker_bak 强制递归删除原本的 Docker 目录,释放了C盘空间。

释放后的C盘空间.jpg

参考: https://stackoverflow.com/questions/62441307/how-can-i-change-the-location-of-docker-images-when-using-docker-desktop-on-wsl2

雨游钟山——雨天带着索尼A7C2去钟山拍照

给今天的文章增加一首BGM,欢迎收听 Aimer - Ref:rain, 恋如雨止

下午的雨还在下,但坐不住了,决定去走走雨中的钟山,拍拍雨中的钟山。由于时间的问题,今天只去了范鸿仙墓和灵谷寺,其他很多地方没有逛到,以后再去拍。

DSC00189-dk-compressed.jpg

DSC00196-dk-compressed.jpg

DSC00198-dk-compressed.jpg

去范鸿仙墓停车场的路,很喜欢大树遮荫后的道路。

DSC00225-dk-compressed.jpg

会玩,不过他们停在弯道+下坡处,有点不太好属于是……

DSC00228-dk-compressed.jpg

陵园路的梧桐大道都知道,但是这里看起来也像梧桐大道,你知道是哪里吗?

DSC00237-dk-compressed.jpg

DSC00239-dk-compressed.jpg

云雾缭绕在半山腰,山顶已看不清。

DSC00241-dk-compressed.jpg

左边是南京体育学院和灵谷寺之间的巨大草坪。

DSC00246-dk-compressed.jpg

DSC00252-dk-compressed.jpg

湖里都浑浊了。雨中垂钓的大哥,意境拉满。

DSC00253-dk-compressed.jpg

灵谷寺。

DSC00256-dk-compressed.jpg

DSC00262-dk-compressed.jpg

这张快门时间 0.5s,稍微能把流水拍出纱布绵延细长的感觉。

DSC00266-dk-compressed.jpg

吼吼,身上都湿了,收拾收拾咱们下回见。

带上A7C2第一次扫街,分享今天拍的一些片子

我问了GPT-4 这个问题:“全画幅35mm焦段适合拍摄什么样的场景?”,他的回答是

35mm焦段的镜头,在全画幅相机上使用时,提供了一种接近于人眼视角的视野,因此它是非常多才多艺的,可以用于多种不同的拍摄场景。以下是几种场景,其中35mm焦距表现尤为出色:

  1. 街头摄影:由于35mm焦段提供了宽广的视野,非常适合街头摄影。它允许摄影师快速抓拍人物和环境,同时保持足够的距离,不会打扰到拍摄对象。

  2. 人像摄影:虽然通常人像摄影更倾向使用85mm或更长的焦距来压缩背景,但35mm焦距允许摄影师拍摄更多环境背景,创造环境人像摄影。这对于想要在人像中展示更多背景故事的情况特别有用。

  3. 风景摄影:35mm焦距虽不如超广角镜头那样能够捕捉广阔的景象,但它提供了一种自然的视角,非常适合拍摄风景。通过35mm镜头,可以获得很好的前景和背景平衡,创造出引人入胜的风景照片。

  4. 纪实摄影:纪实摄影强调故事的真实性和自然性,35mm焦距凭借其接近人类自然视角的特点,成为纪实摄影师的首选。它既可以捕获广阔的场景,又不至于扭曲,非常适合记录人物和事件。

  5. 旅行摄影:旅行时携带设备的轻便性很重要,35mm镜头因其适用于多种场合,成为了旅行摄影师的理想选择。它能够应对街拍、人像、风光等多种摄影需求,是旅行中的多面手。

  6. 日常摄影:35mm镜头同样适合记录日常生活,无论是拍摄家人、宠物还是街角的小确幸,35mm的视角都能很好地捕捉这些瞬间,让照片充满生活感。

总之,35mm焦距的镜头非常灵活,适合广泛的摄影场景。它可以是摄影师包包里的"瑞士军刀"——无论是专业摄影人士还是摄影爱好者都能从中受益。


他回答的很好且全面。我今天带着 FE 35mm F1.8 出门街拍了,扫街试试看。但是今天体验有所不好的就是天气太闷热了,30多度的天,空气湿度还80%以上,一路上都汗流浃背。来看看我今天拍摄的照片。

仔细想了想还是开车出门,第一站玄武湖。把车停在一个好地方,不用停车费,嘿嘿。

DSC00024-dk-compressed.jpg

DSC00042-dk-compressed.jpg

玄武湖游船码头,5年了,还没有坐过。🤣

DSC00046-dk-compressed.jpg

码头上靠着水上房屋休息的环卫工人。

DSC00048-dk-compressed.jpg

这35mm拍拍一般的广角风景还是够用的,但是拍大山大河就不够用了。

DSC00052-dk-compressed.jpg

DSC00059-dk-compressed.jpg

南京玄武湖最佳摄影点(现在有个指示牌子

DSC00063-dk-compressed.jpg

熟悉的南京站。

DSC00071-dk-compressed.jpg

有一点过曝。斑马线和直方图还没有熟练掌握。

DSC00079-dk-compressed.jpg

一只小猫咪。

DSC00100-dk-compressed.jpg

DSC00102-dk-compressed.jpg

小朋友太可爱了!一直盯着我,我马上开机拍了下来,分别时我向她招了招手,她面部依然没有明显的表情,哈哈哈,她爸爸也没有发现后面我在拍。看她爸爸后背上的汗水也能知道今天走在大街上有多热了。

DSC00105-dk-compressed.jpg

中华门绿道。

DSC00108-dk-compressed.jpg

这颗镜头最近对焦距离 22cm,蛮实用。

DSC00122-dk-compressed.jpg

DSC00133-dk-compressed.jpg

DSC00142-dk-compressed.jpg

一间很小的书店网红小猫猫,我忘了叫什么名字。我也在他们那个微信群里!嘿嘿
今天拍这只小猫的时候,旁边一个小姐姐也拿着相机拍,先看我怎么拍的,问我我的参数是啥样的,然后还问ISO要怎么调,我还和她说用绿叶当前景,…… hhhh

DSC00152-dk-compressed.jpg

他们家的另一只猫。

DSC00154-dk-compressed.jpg

喵喵,有点帅的呀。

DSC00157-dk-compressed.jpg

DSC00161-dk-compressed.jpg

DSC00170-dk-compressed.jpg

偷拍的汉服小姐姐(捂脸

DSC00171-dk-compressed.jpg

今天扫街热得一批,但收获满满。

再次为尼,买了人生第二台相机——索尼A7C2和FE 35mm F1.8 定焦镜头

2015年5月5号我买了人生第一台相机索尼A6000。当时我敏锐的嗅觉已经察觉到单反在未来市场将会越来越小,人们会越来越喜欢微单带来的甜,而逐渐不爱带着单反出门了。当然了这其中更加需要预见的是手机计算摄影,手机摄影的更加发达,也会侵蚀一部分相机市场。但是最近两三年相机市场都有点“供不应求”,不断溢价,我想这其中的原因一方面是主机厂产能问题,另外一方面绝对是B站,小红书,抖音这些平台上给予的微单相机领域泼天的流量,让众多的小仙女小仙男们蜂拥而上……

我在2020年4月26日卖掉了A6000,个中缘由主要是因为工作将我磨平了棱角,没有那么爱拍了…… 21年,22年,二手A6000价格涨到了3000,我颇有些后悔20年卖了相机,而且我是保养的非常好的机器,还另送了一个副厂垃圾定焦镜头,当时成交价2100多。我真是血亏。以下是当时发的朋友圈。

mmexport1719063699473-dk-compressed.jpg

22年,23年我不断有入全幅相机的想法,但是没有一个合适的契机,也没有合适的机器和价格。24年618,我终于决定了,下单索尼A7C2吧,当下最适合我需求的相机了,而且一步到位,普通数码摄影爱好者对于摄影器材的一步到位:我直接A7C2机身+FE 35mm F1.8 大光圈镜头。后续再考虑腾龙 28-200 等变焦镜头。我想先用这颗35定大光圈拍好眼前的光影。都说35mm是人双眼所看到的视角,也的确是,正是因为这个视角我们每天都接触,所以驾驭好35定并不是一件容易的事。85定可以轻松拍好人像模特,不在乎背景是否杂乱,反正无脑虚化后就能得到干干净净的照片,但是这样的照片看久了会腻,远没有35mm能讲述好照片中蕴含的故事。50mm接近人一只眼睛的视角,在我看来是不上不下的类型,如果拍人我就选85mm焦段了。比35更广的广角更难驾驭,一般只适合拍摄宏大叙事下的风景和画面。

所以,我今年选相机和镜头都很坚决,其实有这样的决定是最好的——知道自己的需求,了解市面上的各种产品,然后挑选最符合自己需要的产品,这实在是一件美事,有一种钱花得特别值的感觉。

下面附上一些照片~

这小巧的机身,也是我选他的重要原因之一。愿意带出门的相机都是好相机,相机做好轻量化让人更有带出去的欲望。

IMG_20240618_185328-dk-compressed.jpg

头一次看见全画幅CMOS,这是一个35.7×23.8mm(35mm全画幅)Exmor R™ CMOS影像传感器,约3300万有效像素,索尼大法好。

IMG_20240618_185443-dk-compressed.jpg

机身全家桶:

  • 机身
  • 肩带
  • 电池一枚
  • A to C 数据线一根
  • 说明书保修书若干纸片...

IMG_20240618_185310-dk-compressed.jpg

镜头到了。我要学习一下 35mm 焦段,众多大师都爱用的焦段,使用这颗镜头好好练习,拍有故事性的照片。另外35焦段也很适合视频记录,偶尔和家人在一起时用视频记录碎片会更生动,35定也很能胜任这一需求。

IMG_20240619_193505-dk-compressed.jpg

虽然是一颗2019年发布的镜头,但是我丝毫不觉得老,数码圈都有“买新不买旧”的说法,但是这颗镜头很经典,当下价格也还算合适。这全金属机身让我放弃了副厂,直接原厂走起好吧。实际手感、质感都很不错。

IMG_20240619_193636-dk-compressed.jpg

美妙的镜头,奇妙的物理光学世界,比起时下流行的计算摄影,这个才真正让人发烧(捂脸

IMG_20240619_193721-dk-compressed.jpg

买了 256GB 的三星 SD 卡,虽然是V30规格,但是read/write 速度还是不错的,够用了。看了相当长时间的存储卡,都准备买达墨或致态了……但是仔细斟酌后还是选了三星。达墨,致态你们再迭代几次产品,我以后一定来支持。

IMG_20240619_193442-dk-compressed.jpg

组装完毕的样子,还是相当帅气的。

IMG_20240619_205443-dk-compressed.jpg

当天晚上用这颗镜头拍了三张微距照片。

我自组的机械键盘。

DSC00001-dk-compressed.jpg

我的 redmi k70 手机。

DSC00002-dk-compressed.jpg

宜家买的还未拆开的香包。

DSC00005-dk-compressed.jpg

再次为尼,希望这台相机帮我记录下更多美好时光。

更新 link-cleaner v1.1.0 适配linux桌面环境

最近安装了 debian trixie,用我之前写的 https://github.com/hellodk34/link-cleaner 这个程序,下载了jar包到本地,执行之后发现程序正常输出了,但是并没有将新的内容写入到系统剪贴板里。后来我才发现是 windows/macos 与 Linux 窗口工作机制不一样有关。

具体窗口工作的原理我尚未搞清楚。但以下代码在 linux 上不工作是因为 AWT API 在 linux 上处理方式不同导致的,具体的我还真说不上来。

// Windows、macOS 可以持久化这个内容到系统剪贴板
StringSelection stringSelection = new StringSelection(myString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null);

但在 linux 下我们可以借助其他工具,安装 xclip 或者 xsel

此处我安装 xclip,源代码也使用的 xclip,源代码处理方式

private void setClipboardUsingXClipOnLinux(String text) {
        // 加入 -n 选项以避免 echo 在末尾自动添加换行
        String[] cmd = {"/bin/bash", "-c", "echo -n " + escape(text) + " | xclip -selection clipboard"};
        try {
            Runtime.getRuntime().exec(cmd);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 适当地转义文本中的特殊字符
    private String escape(String text) {
        return "'" + text.replace("'", "'\\''") + "'";
    }

安装方法

# deb 系
$ sudo apt install -y xclip
# rpm 系,下面两个命令一般二选一即可,老的 CentOS 可能还是 yum,较新的 Fedora 或者 Rocky Linux、OpenEuler 都可以直接使用 dnf
$ sudo yum install -y xclip
$ sudo dnf install -y xclip

安装 v1.1.0 版本的 jar 包,在 release 页 https://github.com/hellodk34/link-cleaner/releases/tag/v1.1.0

确保linux本地有安装 java11,export 了环境变量之后,在任意位置,任意用户都能正常调用 java 命令,以下命令就能正常工作

$ java -jar link-cleaner-v1.1.0.jar 
your original clipboard text is: 【无人区太大了走了5天还没走出去,今天晚上在桥洞里睡觉,这里比较安全一点】 https://www.bilibili.com/video/BV1Vm4215729/?share_source=copy_web&vd_source=f3e330de995a48b819604c85bc0d59e7

your new clipboard text is: 【无人区太大了走了5天还没走出去,今天晚上在桥洞里睡觉,这里比较安全一点】  https://www.bilibili.com/video/BV1Vm4215729/

【无人区太大了走了5天还没走出去,今天晚上在桥洞里睡觉,这里比较安全一点】 https://www.bilibili.com/video/BV1Vm4215729/ 也被成功写入系统剪贴板。

参考:Linux下Java剪贴板的访问

使用自定义JavaScript脚本功能禁止memos最新版默认打开的链接预览功能

我的 memos 当前版本是 0.22.0,忘了是这个版本开始的还是上一两个版本开始的,当你在 memos 中间插入了普通的链接文本,保存后鼠标经过时会自动预览链接内容,这个功能对我来说有点蛋疼,影响阅读。蛋疼的是有时候 pop up 出来的页面元素还不会自动消失,就更加影响阅读了。

memos链接自动预览.jpg

我在其 issues 列表新建了一个 issue,能不能增加一个选项,允许关闭鼠标经过链接时的链接自动预览?

有人回复了我,详情可去浏览原 issue。

热心网友提供了自定义 JavaScript 脚本禁止memos自动获取链接标题等内容并展示到页面上,脚本如下

window.fetch = new Proxy(window.fetch, {
    apply(target, thisArg, args) {
        const url = args[0];
        // 检查请求的URL是否是我们想要阻止的API
        if (url.includes('/memos.api.v1.MarkdownService/GetLinkMetadata')) {
            // 返回一个空的Promise,模拟请求被取消
            return Promise.resolve({
                ok: true,
                json: () => Promise.resolve({}),
            });
        }
        // 如果不是我们要阻止的请求,就正常执行Fetch
        return target.apply(thisArg, args);
    }
});

memos自定义脚本功能.jpg

可以看到,memos 的 api /memos.api.v1.MarkdownService/GetLinkMetadata',阻止他发送 http 请求即可,返回了空的 Promise,模拟请求被取消,这样鼠标在页面经过链接时也不会请求链接标题,也就不会影响阅读,达成了我的目的。感谢热心网友。

debian 11升级 docker ce 版本和 docker-compose 版本

important update
参考 https://immich.app/docs/install/requirements ,immich 官方已经启用 docker-compose ,今后将不支持。请使用 docker compose, noted at 2024-06-24 09:54:52

昨天晚上将 immich 服务端从 v1.98.2 升级到 v1.106.4,花了一个多小时,因为整体上还是比较复杂的

  • docker 客户端和 docker-compose 版本过低,immich 最新的 compose 文件使用了 start_interval 语法, 使用 docker-compose config 检查语法时报错 Additional property start_interval is not allowed
  • 我用的是 github docker/copmpose 项目的 docker-compose 二进制,而不是 docker compose 子命令
  • pgdata 数据库以前使用 volume 形式挂载的,现在把路径写到了 .env 文件里,通过路径直接映射挂载的。我看了一下 immich release 发行描述,写了很多人都不仔细阅读immich 的更新日志,尤其是有 breaking changes 一些版本,用户按照自己的想法直接更新导致了一些 data loss,还是很惨痛的
  • 整个compose服务删除了一个容器
  • 升级之前备份 pgdata 和 model-cache 数据

昨晚更新 docker 和docker-compose版本之前用的版本,

  • docker: 20.10.17
  • docker-compose: Docker Compose version v2.6.0

升级过程:

# 先关闭 docker daemon 是个好习惯
$ sudo systemctl stop docker

# sudo apt-get update 之后直接安装最新版本的 docker ce 软件包
$ sudo apt-get install --only-upgrade docker-ce docker-ce-cli containerd.io

# 下面开始升级 docker-compose,我还是选择下载官方二进制到本地,然后赋予可执行权限,截止 2024-06-17 22:32:16,最新二进制是 v2.27.1,此处我下载的是 v2.27.0
$ curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" > ./docker-compose
# 备份一下旧的 docker-compose,版本是v2.6.0
$ sudo cp /usr/local/bin/docker-compose /usr/local/bin/docker-compose-v2.6.0
$ sudo mv ./docker-compose /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

几个命令,docker ce 和 docker-compose 都升级好了

  • docker ce 新版本:26.1.3
  • docker-compose 新版本:Docker Compose version v2.27.0

最后,我的 immich 服务端升级也非常顺利,成功升级到了 v1.106.4

机械革命无界14 Pro 安装 debian testing/trixie/sid 驱动扬声器,外部耳机,外接显示器过程分享

前言

革命未完成,我的心不死——还是想打造一个纯粹的 Linux 开发电脑,可惜为了追求更好的硬件买了更新的笔记本,按理说我去买那种 Ubuntu Certified 的笔记本设备 https://ubuntu.com/certified/laptops 比较一劳永逸。

京东给免费更换新的固态硬盘

前文须知,2023 年 618 买了一台机械革命笔记本,但很不愉快 。最近我在这台笔记本上安装的致态 ZHITAI TiPlus7100 2TB 固态硬盘出现了问题,买了一年多,虽然已经过了【只换不修】期(好像是6个月),但在我申请了售后之后,京东还是果断给我换新处理了,真是感谢🙏🏻️东哥大善人。

实际上这固态出现磁盘IO读写的问题已经有好几个月了,在B站上也能搜到不少相关视频,是硬件问题……

我用这个 ssd 全新安装的 debian 12 桌面系统,但是运行10几天之后(通常是这个时间),就会出现 ext4-fs warning 的问题,导致机器无法ssh,也无法操作进入桌面,只能强制重启。

IMG_20240601_093628.jpg

售后小哥直接带着新的固态硬盘上门取件,给了我新的同时,将旧的带走了,这体验相当丝滑。

IMG_20240602_153127.jpg

好了,说回来。在新的固态到了之后我又全新安装了 debian 12,暂时没有发现 ext4-fs warning/error 相关的问题,但是这次准备将各种硬件驱动起来,当开发电脑用试试看,挑战一下。

截止2024年6月16日 22时38分,debian 12 带的 Linux 内核版本还是 6.1.0。

解决扬声器输出问题

自带扬声器无法驱动…… 参考这篇文章解决 解决debian升级后没有声音

解决办法:

$ sudo echo "options snd-intel-dspcfg dsp_driver=1" >> /etc/modprobe.d/inteldsp.conf
$ sudo reboot

解决插入耳机无法驱动的问题

$ sudo echo "options snd-hda-intel model=headset-mode" >> /etc/modprob.d/alsa-base.conf
$ sudo reboot

很开心重启之后耳机输出能工作了,并且也能识别到耳机自带的麦克风,可以录音了!腾讯会议这些软件也可以用了!

解决外接显示器的问题

使用 hdmi 外接了显示器,但是无法点亮外接显示器,这个问题困扰了我整整一天。CPU 型号是 12th Gen Intel i7-12650H (16) @ 4.600GHz , GPU 型号是 Intel Alder Lake-P GT1 [UHD Graphics]

#dmesg | grep -i hdmi
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.1.0-21-amd64 root=UUID=c1e44205-7f09-409c-92e4-e23218c3f2b1 ro quiet video=HDMI-A-1:e drm.edid_firmware=HDMI-A-1:edid/1920x1080.bin
[    0.022427] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.1.0-21-amd64 root=UUID=c1e44205-7f09-409c-92e4-e23218c3f2b1 ro quiet video=HDMI-A-1:e drm.edid_firmware=HDMI-A-1:edid/1920x1080.bin
[    5.904483] input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input33
[    5.904526] input: HDA Intel PCH HDMI/DP,pcm=7 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input34
[    5.904565] input: HDA Intel PCH HDMI/DP,pcm=8 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input35
[    5.904602] input: HDA Intel PCH HDMI/DP,pcm=9 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input36
#lspci | grep -i vga
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-P GT1 [UHD Graphics] (rev 0c)

根据我搜索到的最有用的帖子 https://forums.linuxmint.com/viewtopic.php?t=413931https://forums.linuxmint.com/viewtopic.php?f=42&t=349669

grub 启动时的内核参数我增加了 video=DP-1:e 选项,很欣喜,重启之后在设置里看到了多显示器的设置,但是无法激活,外接显示器也不亮。就在我垂头丧气准备放弃之时,忽然看到有人提到了可以升级到 debian testing,当前 debian testing 代号是 trixie,也就是未来发布的 debian 13 的代号。

于是我果断升级。从 debian 12(stable) 升级到 debian testing 花费了不少时间,安装各种软件包很费时,主要是网络不太好,尽管我已经使用了阿里云镜像过的 debian testing 源。

我的 /etc/apt/sources.list

# deb cdrom:[Debian GNU/Linux 12.5.0 _Bookworm_ - Official amd64 DVD Binary-1 with firmware 20240210-11:28]/ bookworm contrib main non-free-firmware

deb https://mirrors.aliyun.com/debian/ testing main non-free-firmware
deb-src https://mirrors.aliyun.com/debian/ testing main non-free-firmware

deb https://security.debian.org/debian-security testing-security main non-free-firmware
deb-src https://security.debian.org/debian-security testing-security main non-free-firmware

# bookworm-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
deb https://mirrors.aliyun.com/debian/ testing-updates main non-free-firmware
deb-src https://mirrors.aliyun.com/debian/ testing-updates main non-free-firmware

升级系统参照了 https://linuxiac.com/how-to-switch-from-debian-stable-to-testing/ 作者很详细的说明了 how to upgrade your debian system from stable to testing...

成功升级 debian testing 之后,居然一步到位解决了外接显示器的问题。Linux Kernel 也升级到了 6.7.12,看来之前无法驱动外接显示器就是内核过低的原因。因为 Linux 不像 Windows,大部分驱动适配都是写在 Kernel 里的,Kernel 过低要么对当前内核打 patch,要么直接升级内核。当用比较新的硬件安装 Linux 时,总有这种痛苦 😭️😭️

重启进入 debian testing/debian trixie 之后可以正常的使用多显示器设置了,外接显示器也正常工作,完美~~

截图 2024-06-16 22-57-29.jpg

外接4K@60Hz 的显示器也是轻轻松松,一次点亮。不像我现在用的 mac,还只能 4K@30Hz,2020年那时我费了很大力气解决了 60Hz 刷新率的问题。

系统体验

目前这台笔记本安装的 Debian Trixie, 内核版本 6.7.12,相对来说非常好用,桌面环境用的 GNOME,来看看系统信息

截图 2024-06-16 11-33-31.jpg

这大 emoji,很喜欢 🥳

截图 2024-06-16 07-55-03.jpg

目前最大的瑕疵是内置麦克风无法驱动,不过在插入耳机之后可以用麦克风,正常工作用问题就不大,满足腾讯会议是OK的就行。

最后说一句,驱动真是所有笔记本装Linux的痛。

不借助 mirror 仓库,为docker engine daemon添加 proxy 访问 docker hub,解决国内公开的docker mirror 仓库不再可用了的问题

我们都知道最近的新闻了

docker hub 国内mirror仓库不再可用.jpg

ustc 也早早的就出了一份公告。原始链接 https://mirrors.ustc.edu.cn/help/dockerhub.html

ustc docker mirror 仓库关停公告.jpg

本文不讨论利用 cloudflare workers 加速 docker 镜像站,这种个人用用还是非常不错的,算是感谢 cf 大善人,个人用用非常滴不错,如果你没有一个稳定的 local proxy 的话。

本文将要讨论的是利用 http/https proxy 连接 docker hub,既然我们都用代理访问 google/youtube 了,那么再通过代理访问 docker hub 也是顺理成章的事,只不过这次的事件加速了这样一个【历史进程】。

但是需要知道的是,使用代理连接 docker hub,不是在 linux 终端 export HTTP_PROXY='' 这样就行了的,而是需要给 docker engine 的 daemon 程序显式设置 http 代理。官方文档可参考

https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

可以看到,docker client version 23.0 或更新版本都可以直接编辑 /etc/docker/daemon.json 添加 proxies 对象即可。

{
  "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "https://proxy.example.com:3129",
    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
}

我在本地创建的如下,如果当前文件有其他内容,需要注意 json 格式合法性

{
    "proxies": {
      "http-proxy": "http://10.10.10.242:7890",
      "https-proxy": "http://10.10.10.242:7890",
      "no-proxy": "127.0.0.0/8"
    }
}

保存后重启 docker daemon 即可正常拉取 docker hub 的镜像了。systemctl restart docker

在使用 systemd 的 linux 系统上还可以使用如下方式创建给 docker daemon 使用的代理

注意:不可以创建 /etc/systemd/system/multi-user.target.wants/docker.service.d/http-conf.proxy , 因为经过我的实测这样操作无效。尽管你的 docker.service 文件位于 /etc/systemd/system/multi-user.target.wants/docker.service

正确的路径是 /etc/systemd/system/docker.service.d/http-proxy.conf

mkdir -p /etc/systemd/system/docker.service.d

# 写入 http_proxy 配置

cat > /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://10.10.10.242:7890"
Environment="HTTPS_PROXY=http://10.10.10.242:7890"
EOF

systemctl daemon-reload
systemctl restart docker

最终可以通过 docker infosystemctl show --property=Environment docker 这两个命令检查,如果有正确的代理配置输出就ok。

重启后执行 docker info 看到如下信息说明 all done

Debug Mode: false
HTTP Proxy: http://10.10.10.242:7890
HTTPS Proxy: http://10.10.10.242:7890

然后就能愉快地拉取 docker hub 上最新的镜像。

徒步江苏镇江句容九连尖

句容九连尖号称华东mini版武功山,昨天下午我轻装无登山杖徒手完成了这一徒步路线,今天把相关历程记录在本文。

众所周知,江西武功山是中国著名的道教名山之一,位于江西省九江市。其因为高山草甸、红岩谷瀑布群、金顶古祭坛群,被称为江南三大绝景,被誉为“江南第一名山”,吸引着众多游客前来观光和朝拜。

九连尖位于江苏省镇江市句容市,是一座以峰林地貌为主要特色的风景区。九连尖因其九座相连的山峰而得名,被称为华东的“mini版武功山”,吸引着徒步爱好者和登山者前来探险和观赏美景。

我来之前在小红书和B站都有搜索路线和教程。主要参考以下两个视频

现在是2024年3月,从第九尖下山之后可能无法走「固江口水库」了,因为现在封起来了,无法走视频中的由南向北大环线。考虑到我昨天是下午才出发的,我就走了由北向南的一个小环线。

我是导航到「青林公交站」的,并且把车子也停在这里。但是实际上车子直接开到「九华山公墓」会更近。下图是那个废弃矿业公司。

IMG_20240302_144617-dk-compressed.jpg

矿山关停。原来句容这边还有矿呢!具体是什么矿我还不清楚……

IMG_20240302_144707-dk-compressed.jpg

没错,车子直接开到这附近会更省事,前面就是九华山公墓。

IMG_20240302_145248-dk-compressed.jpg

我是从青林公交站走到了起点,大概一公里左右,很幸运的看到了这个废弃矿业公司,以及一些小山羊,🐏️。

开始正式爬山。这是全程唯一一个地标建筑,一个亭子,大家都将这作为起点。

IMG_20240302_145730-dk-compressed.jpg

看到有人骑着越野摩托车上下第一个尖,对摩托研究不太多,这是 ktm 吗?(萌新不懂)拍了两个片段。

先拍到他下山。

然后这小伙又一次上山,来来回回了好几次。

今天我是妥妥的e人。见到老哥在第一尖远眺远方休息:

me: "老哥你这也太帅了吧(先夸他一下)","不过还是要注意安全","我可以给你拍一张照片吗?"
boy: "点点头(喘着气)"
me: "(拍好了)pretty cool! really cool! 嘿嘿"

IMG_20240302_150700-dk-compressed.jpg

继续爬第二尖,已经开始有很多大石头了。

IMG_20240302_151911-dk-compressed.jpg

空中还有一个别人正在飞的无人机。

IMG_20240302_151917-dk-compressed.jpg

别具一格的大石头。

IMG_20240302_151935-dk-compressed.jpg

于第二尖顶所摄。

IMG_20240302_152407-dk-compressed.jpg
IMG_20240302_152002-dk-compressed.jpg

下面这一尖是最高峰,海拔436m左右,而且并不好爬,很多大石头,坡度也挺抖。

IMG_20240302_154500-dk-compressed.jpg

爬最高尖看到的越野车。

IMG_20240302_155323-dk-compressed.jpg

最高峰海拔436m

Screenshot_2024-03-02-15-57-22-746_com.vonglasow.michael.satstat-dk-compressed.jpg

在最高峰的一张自拍(doge

徒步九连尖自拍-2024-03-02.jpg

从最高峰下来看到的一些风景,远处的水库就是「固江口水库」,但是去那边的路被封了。据说能绕路过去完成由南向北大环线,但是本次我没有具体实践,下次有机会挑一个上午过来挑战一下。

IMG_20240302_162011-dk-compressed.jpg
IMG_20240302_162026-dk-compressed.jpg
IMG_20240302_155615-dk-compressed.jpg
IMG_20240302_161846-dk-compressed.jpg
IMG_20240302_161949-dk-compressed.jpg

用手机拉了5倍焦距,看到了刚刚那越野车开始下山咯,好刺激

IMG_20240302_155908-dk-compressed.jpg

还拍了一小段视频,一起来实际感受一下真正的越野(哈哈哈

一个小女孩带着她爷爷徒步九连尖,看起来蛮厉害的,虽然步履很慢,但是精神太赞!

IMG_20240302_160832-dk-compressed.jpg

由北向南环线,此时我走到了最后一段直路,但是这里几乎没有路,全是行人走过的痕迹。而且近期下过雨,很多泥潭。不料我的鞋子也陷进去了一点。

IMG_20240302_163641-dk-compressed.jpg

捋一撮野草,试图刷鞋,但是泥巴太厚,只能等前面去找水然后冲洗。

IMG_20240302_165532-dk-compressed.jpg

好多泥巴啊。

IMG_20240302_165534-dk-compressed.jpg

找到了一处流动的水,还挺大的水流。于是在这里把鞋子刷干净了🤣

IMG_20240302_170109-dk-compressed.jpg

遇到徒步的两个女生向我问路,我看着两步路上的别人的轨迹,自信的给他们指路。

最后终于到达了起点。路过这废弃的矿业公司,残垣败壁的厂房。

IMG_20240302_173750-dk-compressed.jpg

日落将至,我也赶紧启动了归程。

IMG_20240302_173653-dk-compressed.jpg

全程使用了 OpenTracks 记录轨迹,也用了行者记录,两步路只记了一段。

行者轨迹 with 卫星图

行者轨迹-2024-03-02-徒步九连尖.jpg

OpenTracks 轨迹,使用 OsmAnd~ 地图加载的gpx。OsmAnd~ 可以单独下载等高线地图,这对于爬山来说还是很专业很有用的。另外右下角的xxx部队看到了吗,这附近是军区,hhhh. 高德地图百度地图等地图在这个地方是没有地标的

Screenshot_2024-03-05-09-33-39-167_net.osmand.plus-opentracks轨迹-压缩后.jpg

让我们下一次爬山再见。下一次应该会做更多的准备,似乎需要买一个登山杖了。

macOS 安装 proxychains-ng 并借助局域网 socks5 代理使用 Google Earth Pro

之前我在 Windows 上实践通过 proxychains 软件借助本地 socks5 代理使用 win 下的 Google Earth Pro,今天我来实践一下 macOS 上的做法。

前文,win 上的操作指南: https://hellodk.cn/post/1155

我的 mac 还是 19 年买的 intel 芯片,苹果首款 16 寸 mbp。

我的mac压缩后.jpg

当前系统版本是 macOS Ventura 13.5.2

我通过 brew 安装 proxychains-ng,因为换了 ustc (中科大)的源,所以直接使用 brew 安装更方便。

brew install proxychains-ng

安装完成后,检查帮助文档

$ proxychains4 --help

Usage:  proxychains4 -q -f config_file program_name [arguments]
    -q makes proxychains quiet - this overrides the config setting
    -f allows one to manually specify a configfile to use
    for example : proxychains telnet somehost.com
More help in README file

检查默认配置文件是否存在

ls -alh /usr/local/etc/proxychains.conf

如果文件存在则使用 nano 或者 vim 编辑该配置文件,比如 vim /usr/local/etc/proxychains.conf

我在 [ProxyList] 下新增了 socks5 代理,代理主机是局域网中的 10.10.10.115,socks5 端口 7891

[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks4     127.0.0.1 9050
socks5 10.10.10.115 7891

然后怎么让谷歌地球使用上这个代理呢?

mac 上打开一个应用终端命令是 open,比如 open /Applications/xxx.app

所以构建启动命令 proxychains4 open /Applications/Google\ Earth\ Pro.app

但是命令运行后谷歌地球并不能正常使用。原来是 macOS 的 SIP 机制导致 proxychains-ng 无法读取系统库文件,导致代理不能正常运作。

完全关闭 SIP

重启Mac,按住Option键进入启动盘选择模式,再按⌘ + R进入Recovery模式。 实用工具(Utilities)-> 终端(Terminal)。 输入命令 csrutil disable(这将禁用 SIP)。 直接 reboot 进入系统后,终端里输入 csrutil status,结果中如果有 System Integrity Protection status:disabled. 则说明关闭成功。

接着再在终端中执行 proxychains4 open /Applications/Google\ Earth\ Pro.app 即可畅游谷歌地球。其他需要代理的命令或者程序均同理。

proxychains-ng 使用示例.jpg

参考: https://medium.com/@xiaoqinglin2018/mac-osx-%E4%BD%BF%E7%94%A8proxychains-ng-91ba61472fdf

修复一块 18 年 12 月买的二手 4TB 机械硬盘

18 年开始自组软路由的硬件,后面入了 PT 的坑,在 18 年 12 月购买了一块二手 4TB 机械硬盘。

18年12月购买的二手机械硬盘.jpg

这 5 年多,我的软路由一直比较稳定的运行着,期间有过几次因为二手电源而淘气,后面换了一个全新的长城 200w 电源解决。

但是这块硬盘也没有让人省心,除了日常读取它上面的数据时能清晰的感受到里面磁头开始转动的声音,有时候写大量数据还产生豆子沙沙的声音。

而且有过好多次因为硬盘问题导致 OpenWrt 系统无法启动。

最近这块磁盘“掉盘”了,看了一下 OpenWrt 上有硬件设备,但是无法挂载到挂载点。里面还有以前存储的所有照片和视频,虽然这些照片和视频都被我备份到了我 immich server 上,但是缺少一份文件冷备份。

今天就试图修复这块盘,让它重新在 OpenWrt 上恢复读写能力。

磁盘分区 /dev/sdb1 无法挂载到 mount point /mnt/ThreeTB

lsblk 缺失挂载点 挂载失败.jpg

使用 df 检查,确实没有挂载成功

[root@dk-router:10:44 AM /mnt/ThreeTB] # df -hT

Filesystem Type Size Used Available Use% Mounted on

/dev/root squashfs 64.8M 64.8M 0 100% /rom

tmpfs tmpfs 1.9G 26.3M 1.9G 1% /tmp

/dev/loop0 f2fs 445.4M 175.2M 270.2M 39% /overlay

overlayfs:/overlay overlay 445.4M 175.2M 270.2M 39% /

/dev/sdc1 ext4 15.7M 12.0K 15.4M 0% /boot

/dev/sdc1 ext4 15.7M 12.0K 15.4M 0% /boot

tmpfs tmpfs 512.0K 0 512.0K 0% /dev

/dev/sda1 ext4 3.6T 211.6G 3.2T 6% /mnt/four

/dev/sdd1 ext4 457.4G 193.5G 240.6G 45% /mnt/FiveOO

/dev/sde1 ext4 2.7T 2.4T 108.9G 96% /mnt/ThreeTB2

/dev/sdc1 ext4 15.7M 12.0K 15.4M 0% /mnt/sdc1

使用 smartctl 查看硬盘健康状态,居然是 PASSED,说明还能挣扎一下 😏️

[root@dk-router:10:45 AM /mnt/ThreeTB] # smartctl -H /dev/sdb1

smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.15.58] (localbuild)

Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===

SMART overall-health self-assessment test result: PASSED

使用 fsck 检查时,确保磁盘设备没有挂载上。求稳还是执行一下 umount /dev/sdb1

[root@dk-router:10:56 AM /mnt/ThreeTB] # fsck.ext

fsck.ext2 fsck.ext3 fsck.ext4

[root@dk-router:10:56 AM /mnt/ThreeTB] # fsck.ext

fsck.ext2 fsck.ext3 fsck.ext4

[root@dk-router:10:56 AM /mnt/ThreeTB] # umount /dev/sdb1

umount: /dev/sdb1: not mounted.

因为磁盘文件系统格式是 ext4,所以使用 fsck.ext4 /dev/sdb1 命令

[root@dk-router:10:59 AM /mnt/ThreeTB] # fsck.ext4 /dev/sdb1

e2fsck 1.46.5 (30-Dec-2021)

/dev/sdb1: recovering journal

Error reading block 365987992 (I/O error). Ignore error<y>? yes

Force rewrite<y>? yes

JBD2: Invalid checksum recovering data block 524812391 in log

JBD2: Invalid checksum recovering data block 524291104 in log

JBD2: Invalid checksum recovering data block 524812399 in log

JBD2: Invalid checksum recovering data block 525338144 in log

JBD2: Invalid checksum recovering data block 524812385 in log

JBD2: Invalid checksum recovering data block 524812395 in log

JBD2: Invalid checksum recovering data block 524812389 in log

JBD2: Invalid checksum recovering data block 524815392 in log

JBD2: Invalid checksum recovering data block 524812392 in log

JBD2: Invalid checksum recovering data block 524812384 in log

JBD2: Invalid checksum recovering data block 524813344 in log

JBD2: Invalid checksum recovering data block 524812408 in log

JBD2: Invalid checksum recovering data block 524812383 in log

JBD2: Invalid checksum recovering data block 702552096 in log

JBD2: Invalid checksum recovering data block 524812401 in log

JBD2: Invalid checksum recovering data block 524812407 in log

JBD2: Invalid checksum recovering data block 702552608 in log

JBD2: Invalid checksum recovering data block 524812403 in log

JBD2: Invalid checksum recovering data block 524814880 in log

JBD2: Invalid checksum recovering data block 524812398 in log

JBD2: Invalid checksum recovering data block 524812397 in log

JBD2: Invalid checksum recovering data block 524812393 in log

JBD2: Invalid checksum recovering data block 524292128 in log

JBD2: Invalid checksum recovering data block 524288095 in log

JBD2: Invalid checksum recovering data block 524288097 in log

JBD2: Invalid checksum recovering data block 524288096 in log

JBD2: Invalid checksum recovering data block 524812388 in log

JBD2: Invalid checksum recovering data block 525336608 in log

JBD2: Invalid checksum recovering data block 524812406 in log

JBD2: Invalid checksum recovering data block 524812402 in log

JBD2: Invalid checksum recovering data block 524812404 in log

JBD2: Invalid checksum recovering data block 524291616 in log

JBD2: Invalid checksum recovering data block 524812386 in log

JBD2: Invalid checksum recovering data block 524812409 in log

JBD2: Invalid checksum recovering data block 524817952 in log

JBD2: Invalid checksum recovering data block 524812387 in log

JBD2: Invalid checksum recovering data block 524816416 in log

JBD2: Invalid checksum recovering data block 524819488 in log

JBD2: Invalid checksum recovering data block 524812396 in log

JBD2: Invalid checksum recovering data block 524292640 in log

JBD2: Invalid checksum recovering data block 524818464 in log

JBD2: Invalid checksum recovering data block 524818976 in log

JBD2: Invalid checksum recovering data block 524289056 in log

JBD2: Invalid checksum recovering data block 524812832 in log

JBD2: Invalid checksum recovering data block 524288094 in log

JBD2: Invalid checksum recovering data block 524812411 in log

JBD2: Invalid checksum recovering data block 524290592 in log

JBD2: Invalid checksum recovering data block 524293152 in log

JBD2: Invalid checksum recovering data block 524293664 in log

JBD2: Invalid checksum recovering data block 524295712 in log

JBD2: Invalid checksum recovering data block 524820000 in log

JBD2: Invalid checksum recovering data block 525338656 in log

JBD2: Invalid checksum recovering data block 524812394 in log

JBD2: Invalid checksum recovering data block 524813856 in log

JBD2: Invalid checksum recovering data block 524289568 in log

JBD2: Invalid checksum recovering data block 524290080 in log

JBD2: Invalid checksum recovering data block 524814368 in log

JBD2: Invalid checksum recovering data block 524815904 in log

JBD2: Invalid checksum recovering data block 524295200 in log

JBD2: Invalid checksum recovering data block 525337632 in log

Journal checksum error found in /dev/sdb1

/dev/sdb1 contains a file system with errors, check forced.

Pass 1: Checking inodes, blocks, and sizes

Inode 131072602 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131072627 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131072974 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131072986 extent tree (at level 2) could be narrower. Optimize<y>? yes

Inode 131073020 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131073033 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131073054 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131073057 extent tree (at level 1) could be narrower. Optimize ('a' enables 'yes' to all) <y>? yes

Inode 131073077 extent tree (at level 1) could be narrower. Optimize ('a' enables 'yes' to all) <y>? yes

Inode 131073095 extent tree (at level 1) could be narrower. Optimize ('a' enables 'yes' to all) <y>? yes

Inode 131073107 extent tree (at level 1) could be narrower. Optimize ('a' enables 'yes' to all) <y>? yes

Inode 131073113 extent tree (at level 2) could be narrower. Optimize<y>? yes

Inode 131073126 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131073129 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131203700 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204106 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204124 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204136 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204142 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204198 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204208 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204279 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204285 extent tree (at level 2) could be narrower. Optimize<y>? yes

Inode 131204295 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204346 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204355 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204371 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204393 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204405 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204413 extent tree (at level 2) could be narrower. Optimize<y>? yes

Inode 131204415 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204435 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204453 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204457 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204471 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204483 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204489 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204558 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204655 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204666 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131204667 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131334149 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 131334152 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 132908866 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 132908867 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 132908902 extent tree (at level 2) could be narrower. Optimize<y>? yes

Inode 132909521 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 132909755 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 132910044 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 132910190 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 132910212 extent tree (at level 2) could be narrower. Optimize<y>? yes

Inode 132910341 extent tree (at level 1) could be narrower. Optimize<y>? yes

Inode 132910363 extent tree (at level 1) could be narrower. Optimize<y>? yes

Pass 1E: Optimizing extent trees

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

/lost+found not found. Create<y>? yes

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/dev/sdb1: ** FILE SYSTEM WAS MODIFIED **

/dev/sdb1: 47029/183148544 files (2.7% non-contiguous), 666008011/732566385 blocks

跟着终端操作输入 y 即可

最后那段日志,说明

fsck.ext4 命令完成了对文件系统的修复过程。每个步骤的解释:(来自 ChatGPT)

  • Pass 1E: 优化范围树(extent trees):这个步骤优化了文件系统中的范围树结构,以提高性能和效率。
  • Pass 2: 检查目录结构:这个步骤检查文件系统中的目录结构是否正确,确保文件和目录的层次结构正确无误。
  • Pass 3: 检查目录连通性:这个步骤检查文件系统中的目录之间的连接是否正确,确保文件和目录之间的关联关系正确无误。
  • /lost+found 未找到。创建? yes:这个步骤是在文件系统中创建一个 /lost+found 目录,用于存放在修复过程中找到的孤立文件或目录。
  • Pass 4: 检查引用计数:这个步骤检查文件系统中文件和目录的引用计数,确保每个文件和目录都有正确的引用计数。
  • Pass 5: 检查组摘要信息:这个步骤检查文件系统中每个组的摘要信息,确保文件系统的整体状态正确无误。
  • /dev/sdb1: 文件系统已被修改 :这个提示表示文件系统已经被修改,意味着 fsck.ext4 命令成功修复了文件系统中的问题。
  • /dev/sdb1: 47029/183148544 个文件(2.7% 非连续),666008011/732566385 个块:这个提示提供了修复后文件系统的统计信息,包括修复的文件数量、非连续文件的百分比以及修复的块数量。

综上所述,您的文件系统已经成功修复,并且修复后的文件系统处于可用状态。

然后通过 OpenWrt luci 界面重启了挂载点服务,url 路径是 luci/admin/system/mounts

挂载成功!开心

修复后挂载成功.jpg

再通过 samba 看到了以前备份的这些照片视频文件,看着往日用摄像头记录下的回忆,很感动。

这些照片找了回来 虽然上传到 immich 了 但是缺失一份冷备份.jpg

之前把我 23 年 618 购买的机械革命无界 14 pro 加装了一块致态 tiplus 7100 2TB m2 固态,之前安装了 deepin,时隔半年多,我决定重新装上 debian12,也装上 DE 环境,但是大部分场景作为服务器使用。

在我装上 debian 12 之后,立马使用 nfs 连上 OpenWrt 上的这块磁盘开启的 nfs 服务,通过 rsync 把这些照片视频冷备份到了 致态 tiplus 7100 固态硬盘上面。

安心了,很爽快。因为这块固态性能还不错,我在手机上使用 Solid Explorer 或者 mac 上通过腾讯看图浏览里面的照片和视频,速度上明显快了 n 个数量级。还是固态香啊。

这块机械硬盘修复成功,存储占的满是因为里面放了好几年前下载的 imdb top 250,这个我记得就有 2.x TB 了。

好了就这些了,如果你对文中所描述的任何事物感兴趣,欢迎和我讨论。

iCloud 在 Windows 下很流氓,用 taskkill 干掉它

iCloud 在 windows 下是真的流氓。

程序长这样

icloud app.jpg

主界面,没有退出功能。点击 close 并不能退出程序

icloud 主界面 点击 close 并不能退出程序.jpg

系统托盘当中的图标也没有提供完全退出的功能

icloud 没有退出功能.jpg

我们打开一个管理员权限下的 cmd 窗口,用 tasklisttaskkill 干掉它

C:\Windows\System32>tasklist |findstr icloud // 应该查询 iCloud 应区分大小写

C:\Windows\System32>tasklist |findstr iCloud
iCloudCKKS.exe               18604 Console                    1     19,140 K
iCloudServices.exe           15212 Console                    1     21,592 K
iCloudDrive.exe              21864 Console                    1     31,716 K

C:\Windows\System32>taskkill -f -t -im iCloudCKKS.exe
SUCCESS: The process with PID 18604 (child process of PID 10792) has been terminated.

C:\Windows\System32>taskkill -f -t -im iCloudServices.exe
SUCCESS: The process with PID 4540 (child process of PID 13800) has been terminated.
SUCCESS: The process with PID 13800 (child process of PID 15568) has been terminated.
SUCCESS: The process with PID 20860 (child process of PID 15568) has been terminated.
SUCCESS: The process with PID 20876 (child process of PID 15568) has been terminated.
SUCCESS: The process with PID 20956 (child process of PID 15568) has been terminated.
SUCCESS: The process with PID 21196 (child process of PID 15568) has been terminated.
SUCCESS: The process with PID 15568 (child process of PID 15212) has been terminated.
SUCCESS: The process with PID 15212 (child process of PID 1540) has been terminated.

C:\Windows\System32>taskkill -f -t -im iCloudDrive.exe
SUCCESS: The process with PID 21864 (child process of PID 1984) has been terminated.

C:\Windows\System32>
C:\Windows\System32>
C:\Windows\System32>tasklist |findstr iCloud
C:\Windows\System32>

使用 tasklist |findstr iCloud 找到存活的 iCloud 相关进程,使用如下命令杀死他们

  • taskkill -f -t -im iCloudCKKS.exe
  • taskkill -f -t -im iCloudServices.exe
  • taskkill -f -t -im iCloudDrive.exe
  • taskkill -f -t -im iCloudOutlookConfig64.exe

舒服了。

2023 年 12 月 Spotify 彻底被墙,我在比亚迪车机上安装 surfboard 挂代理听歌

23 年 12 月开始,Spotify 彻底被墙,以前登录上可以直接搜索、听歌的。如今彻底被墙之后各个终端需要用点法子才能无痛使用 spotify 了。

醒目的【无网络连接】,尤其是搜索时加载半天都不会出来结果,最开始一度以为车机网络出现问题。

无网络连接.jpg

关于被墙的消息来源,可以阅读以下内容


如果确实有用它听歌听播客的需求,那么可以——

  1. 在家里可以用软路由,透明代理可以方便解决
  2. desktop app 可以单独设置代理,后来我才发现 mobile app 不能
  3. mobile 这边,如果是手机上使用联通电信移动这三网的数据流量,由于 IPv6 暂时还能连到服务器,所以手机上使用流量还能听。但是用 wifi 时就得透明代理或者手机上单独的代理 app 了
  4. 车机上呢?我在我的比亚迪车机上成功安装了 surfboard,并且导入了 profile,最终修改了配置文件实现了需求

spotify 桌面端可以单独设置 socks5 代理,这点很好用。但是移动端 app 没有

spotify 桌面端设置socks5代理.jpg

我在车机上怎么实现的呢?

1. 安装 surfboard

通过 apkpure.com 之类的网站下载到 surfboard 的 apk,再通过一些手段将 apk 转到车机上。我是下载好之后上传到自己的 seafile 服务器,然后创建分享,得到分享链接,再利用短链接服务创建一个短链接(访问后指向刚刚创建的 seafile 长链接)。车机上打开 alook 浏览器,在地址栏手动输入短链接,然后下载好 apk。或者我用 mattermost,类似于在车机上装一个微信,自己给自己/小号/微信传输助手 发一条消息(下载链接),但是微信这种 3A 大作我是不可能往车机上安装的,那岂不卡死,何况没有需求。我自己部署的 mattermost 就轻量多了,车机跑起来丝毫无压力。

安装好 surfboard

安装好surfboard.jpg

2. 导入 profile

导入🐓️场配置文件,通过导入文件的方式失败,有可能是 byd 车机限制了读取 document 的 api。通过 url 导入我试了好几次才成功,这个有可能是网络问题。

导入成功之后启动,可以看到公网 IP 变成了 Hong Kong,右上角也有了 VPN 图标。不知道未来 byd 车机系统会不会做阉割,但是目前来看都还是能用的,这个车机比起其他车企的车机系统,已经是最开放的了。

公网ip dns.jpg

打开 alook,成功访问 google

成功访问 google.jpg

3. 配置 spotify 规则

update at 2024-01-18 10:04:27

以下域名需要配置走代理,参考来自 spotify domain list

byspotify.com
pscdn.co
scdn.co
spoti.fi
spotify-everywhere.com
spotify.com
spotify.design
spotifycdn.com
spotifycdn.net
spotifycharts.com
spotifycodes.com
spotifyforbrands.com
spotifyjobs.com

默认的 config 已经具备了上述配置,但是大部分都指向了国外媒体这一 proxy group,确认一下这个分组用的哪个/种代理节点,比如美国节点香港节点,或者xxx某一个具体节点都可以。

后面我添加了如下规则,防止漏网之鱼。

DOMAIN-KEYWORD,spotify,🚀️ 节点选择

domain keyword.jpg

今天晚上通勤回家路上测试已经能听了,搜索功能似乎还是不行,有知道的小伙伴可以在文章下留言。

2024-01-26 13:40:30 update
前几天测试,已能正常搜索。至此,在挂上有效代理后 Spotify Android 所有功能都能使用了。

thanks.

利用 proxychains 让 Windows10/11 上的 Google Earth Pro 通过代理正常访问

后面在 mac 上实现了同样的操作,操作指南见 https://hellodk.cn/post/1160

以前使用一些 fq 客户端,我都在各个设备上安装各自的客户端,现在每到达一个局域网,我都喜欢设置一个 standalone proxy server。比如用 OpenWrt + Passwall 透明代理,也或者在 N1 上使用 debian + systemd + clash core 做一个基于 clash core 的 proxy service。

以前在 win 上使用 CFW 或者 ss 等客户端的时候启动系统代理即可使用 Google Earth Pro,但是由于我的代理使用习惯改变,我一直在寻找一个“优雅的”使用 Google Earth Pro 方式。

2021 年在 V 站发过这个帖子,如何在不开启系统代理的情况下使用 Google Earth Pro ,有兴趣的可以去阅读。

今天刚好又有查看谷歌地球的需求,于是又稍作了一点搜索和实践,新的方法也成功应用了。利用 proxychains 让目标程序强制走 socks5 代理。

下载 proxychains

进入 https://github.com/shunf4/proxychains-windows/releases/ 页面。优先阅读该项目的 readme,谷歌地球是基于 Win32 构建的 windows 传统可执行程序,所以需要下载 proxychains_0.6.8_win32_x64.zip,解压缩到合适位置之后,能看到这些文件

dk-wsl2@dk-mechrevo:/mnt/e/myfiles/compressed-files/proxychains_0.6.8_win32_x64$ tree .
.
├── COPYING
├── README.md
├── README_zh-Hans.md
├── proxychains.conf
├── proxychains.exe // 这个文件原始名称是 proxychains_win32_x64.exe 改成 proxychains.exe 的目的是为了后续使用命令行启动 google earch pro
├── proxychains_helper_win32_x64.exe
├── proxychains_helper_win32_x86.exe
├── proxychains_hook_x64.dll
├── proxychains_hook_x86.dll
└── 原始exe文件名.txt  // 这个文件是我自己加的

下载好 proxychains_0.6.8_win32_x64.zip 后,解压缩所有文件到合适位置,将 proxychains_win32_x64.exe 重命名至 proxychains.exe

再修改 proxychains.conf

直接拉到文件底部,修改你的 socks5 服务端 ip 和端口,比如我的 ip 是局域网中的 192.168.1.29,端口 7890。默认值是 localhost1080

[ProxyList]
socks5 192.168.1.29 7890

配置 Windows 系统环境变量

拷贝 proxychains 的主程序目录 E:\myfiles\compressed-files\proxychains_0.6.8_win32_x64,拷贝 proxychains.conf 文件的绝对路径 E:\myfiles\compressed-files\proxychains_0.6.8_win32_x64\proxychains.conf

在系统环境变量修改的页面

系统环境变量编辑页面.jpg

  • 修改 Path 新增一个 item,值是 E:\myfiles\compressed-files\proxychains_0.6.8_win32_x64 。这样做的目的是为了在系统任意路径下执行 proxychains 都能运行 E:\myfiles\compressed-files\proxychains_0.6.8_win32_x64\proxychains.exe 这个程序,这也是上面将这个 exe 文件改名的目的
  • 新增系统环境变量,key 是 PROXYCHAINS_CONF_FILE value 是 E:\myfiles\compressed-files\proxychains_0.6.8_win32_x64\proxychains.conf (上面已经拷贝,直接读取 ditto 的剪贴板历史记录

环境变量配置完毕。

启动 Google Earch Pro

找到谷歌地球的启动命令,是 C:\Program Files\Google\Google Earth Pro\client\googleearth.exe

打开一个 cmd 终端,最好是 cmd 终端,Windows 11 比较新的 build 已经把 cmd 的 profile 集成到了 Windows Terminal 当中,win+r 输入 cmd 会自动打开一个 profile 是 cmd 的 windows terminal 窗口。

运行 proxychains "C:\Program Files\Google\Google Earth Pro\client\googleearth.exe" 即可启动能正常访问的谷歌地球程序,当然了前提是 192.168.1.29:7890 这个 socks5 服务端正常,且节点正常访问 google 相关服务。

随便搜了一个 黄浦江,正常浏览,正常搜索

谷歌地球正常搜索正常浏览.jpg

启动时

proxychains 谷歌地球1.jpg

关闭 Google Earch Pro 时

proxychains 谷歌地球2.jpg

faq

faq1

如果遇到命令行无法启动谷歌地球,可能是之前打开过谷歌地球,其进程没有杀干净。使用管理员权限打开一个 cmd 窗口,执行 taskkill -f -t -im googleearth.exe 即可。

C:\Windows\System32>taskkill -f -t -im googleearth.exe
SUCCESS: The process with PID 23044 (child process of PID 11884) has been terminated.

faq2

proxychains 适用于很多难以设置代理的程序,详情可以查看作者仓库的 readme 以及 issues 列表。

faq3

如果遇到报错,说缺少 cygwin1.dll 这个动态链接库文件导致程序无法启动,那你可能下错了压缩包。下载文件名带有 win32 x64 的那个试试,比如 proxychains_0.6.8_win32_x64.zip

参考

https://www.xiazhanjian.com/archives/proxychainsforwindows.html

湖州安吉天荒坪盘山公路和杭州临安浙西天路之旅

使用 immich 创建了一个照片视频合集 album,链接在此 https://s.xkkkx.com/hjehwa2w 欢迎观看。分享 7 天后过期。如过期后再需要可在此文下评论。

这是一个临近出发前两三天才做好的决定——打卡一下安吉的秋名山公路,天荒坪盘山公路。这段路有很多天然曲折的 S 弯道,还是电影《飞驰人生》取景地,另外也很想见识一下安吉,我就想着要去打卡一番。

准备的行程是周六出发,周日回。

事实上我只计划好了第一天的行程,第二天一开始都没想好要去哪。


Day 1

周六上午就从南京出发,自驾前往安吉县,导航目的地就是 安吉县人民政府,一路有 222 公里。我喜欢走国道省道县道乡道,一是喜欢看沿途的风景,感受不同的村庄,二还能省钱(嘿。

222公里-dk-compressed.jpg

在句容看到的摩旅小队伍(已将他们的车牌号打码)

CRnall_20231209_094537485-打码后-dk-compressed.jpg

棉絮一样的白云和笔直的公路

CRnall_20231209_101716281-dk-compressed.jpg

真是爱死了这种小路,非常安静,山里静悄悄的,如果不是阳光太强,我愿意就这样在车里睡 20 分钟,刚好缓解驾驶疲劳。

CRnall_20231209_113505211-dk-compressed.jpg

溧阳一号公路

CRnall_20231209_114442587-dk-compressed.jpg

溧阳一号公路1 溧阳一号公路2

从江苏去到浙江,没想到中间又回来了我安徽,江浙沪皖果然是一家(强行带上我皖 。安徽省宣城市广德市。

CRnall_20231209_120706568-dk-compressed.jpg

然后在一个国道上目睹了浙江界,说实话这还是我第一次踏入浙江的土地。当时道路上有很多大车不方便停车,就没能拍照留恋。

终于触到安吉。安吉(浙江湖州安吉县)和长兴(浙江湖州长兴县)界。

安吉界 长兴界

到达安吉之后,停好车简单吃了点东西。稍微逛了一下安吉的街。虽然烈日当空,温度也有20多度,很难想象接下来几天会有大降温,但是从遍地吹落的红叶能看出来,南方是真要降温了。

CRnall_20231209_135006657-dk-compressed.jpg

然后我就去打卡天荒坪咯。小镇子是真干净漂亮,浙江民富不是吹的。

CRnall_20231209_151959754-dk-compressed.jpg

天荒坪镇1 天荒坪镇2

开始上山,体验一下这浙江版“秋名山”(也有说法是中国版,手动吃瓜

CRnall_20231209_153900371-dk-compressed.jpg

CRnall_20231209_154854257-dk-compressed.jpg

到达山顶 天荒坪藤原豆腐店,就一网红打卡点,不卖豆腐但卖咖啡和奶茶,消费还很贵,消费可免费停车。

CRnall_20231209_160414925-dk-compressed.jpg

这张墙画确实很有头文字 D 动漫的感觉。搭配上图中的

  • 严禁山路飙车
  • 严禁山路漂移
  • 严禁山路追逐

有内味了

CRnall_20231209_160450557-dk-compressed.jpg

在山顶看最后一眼夕阳的余晖;快要到山脚的地方拍到的火烧云

山顶夕阳余晖 山脚火烧云

稍微总结一下这段路

  • 全长约18公里
  • 路修得非常好,没有特别险的感觉,至少在我去过徽州天路之后这样认为
  • 一路观景台修的太少了,不好停车拍照和静静欣赏风景
  • 骑自行车沿坡下降的比较多,肯定很爽呀,我要是有机会也想在这骑公路车

今天就到这了,拖着疲惫的身躯回到宾馆思考明天的行程。

Day 2

在 B 站、小红书,高德地图,百度搜索引擎的帮助下,我做好了今天行程的决定——去体验一下浙西天路。

浙西天路

🛣️全程39公里

📍位于浙江省临安

🚘自驾路线:十门峡剑门景区-浪广村-太子尖-兔川悬索桥-石浪景观-华光潭村

我看了一下我的位置,先去华光潭村是最近的,但也有 108 公里。

前方就要到达南极!👀。这是宁国市南极乡。

IMG_20231210_094504-dk-compressed.jpg

这是我第一次来浙江,所以也是我第一次来杭州🙃。所以这个地方拍个照不过分吧……

IMG_20231210_102124-dk-compressed-打码后-已压缩.jpg

刚沿着这段山路上来还有一点续航焦虑,爬坡就是费电。不过在后面的临安岛石镇龙山村充了 27 分钟的电,还是第一次在村里用上快充(60kW),浙江还是先进啊

IMG_20231210_102339-dk-compressed.jpg

回看宁国这边。因为 8 月份走过皖南川藏线,所以对宁国不陌生了。

IMG_20231210_102658-dk-compressed-打码后-已压缩.jpg

两省界碑

安徽这边的界碑 浙江这边的界碑

岛石镇,图中有钓鱼佬。

IMG_20231210_112331-dk-compressed.jpg

IMG_20231210_112339-dk-compressed.jpg

兔川悬索桥

兔川悬索桥1 兔川悬索桥2

站在悬索桥上看对面的村庄

IMG_20231210_113906-dk-compressed.jpg

到达浙西天路标志性的起点(大峰隧道旁边)

IMG_20231210_114524-dk-compressed.jpg

距离太子尖 18 公里处

IMG_20231210_115926-dk-compressed.jpg

华浪线(华光潭村到浪广村的县道)和浙西天路就沿着这河流而上。可以看到文明聚集处多是江河周边,公路一般也修在河流沿岸,不仅这边如此,祖国的西北,西南也是如此

IMG_20231210_120007-dk-compressed.jpg

IMG_20231210_120438-dk-compressed.jpg

这里的道路和小山给我川藏线上的感觉了……

这里的道路和小山给我川藏线上的感觉1 这里的道路和小山给我川藏线上的感觉2
这里的道路和小山给我川藏线上的感觉3 这里的道路和小山给我川藏线上的感觉4

跑山真有意思,很有头文字 D 的感觉有木有

IMG_20231210_123622-dk-compressed-打码后-已压缩.jpg

IMG_20231210_123649-dk-compressed.jpg

到达公路最高处,太子尖驿站。此时我拿 miui 自带的指南针应用一看发现居然没有海拔…… 难道和国行 iPhone 一样砍掉了指南针应用的海拔功能?有可能。。下图是我在 iPhone 上装的第三方 app。现在还在公路上,但是海拔已经 1362 了,太酷啦!

IMG_20231210_124850-dk-compressed.jpg

在这里的观景台上拍到了一组云海照片,下面的小村子海拔有 7 8 百了(也好像 1000 了,已不太记得),没想到在华东还有这种地方

观景台云海1 观景台云海2
观景台云海3 观景台云海4

老爷爷架着三脚架在拍延时

IMG_20231210_125600-dk-compressed.jpg

浙西天路对坡度等级的科普,对于骑行者来说一般是了解的

IMG_20231210_132800-dk-compressed.jpg

浙西天路包含所有坡度等级。(刚刚还有一个兄弟爬上山来骑了40多公里上山,有点厉害。不过有好几个人下山

IMG_20231210_132754-dk-compressed.jpg

爬坡王。看来浙西天路这边自行车文化挺盛行,至少比起很多城市已经很能接受公路车文化了

IMG_20231210_133317-dk-compressed.jpg

中午吃一个鸡腿,一个苹果。很遗憾,图中的保温杯当时落在了驿站,回南京时走了 150 公里才意识到,可惜

IMG_20231210_130910-dk-compressed.jpg

准备下山,云雾缭绕,下了好几拨雨,在太子尖驿站休息的片刻还和不同的人有交流,感觉浙西这边挺不错的,以后时间充裕时,做好准备时再来,还可以登一下太子尖,安排晚上露营和第二天的日出🌄

IMG_20231210_134551-dk-compressed.jpg

继续下山,浙西天路比起“中国版秋名山”那边好停车多了,路边很多空地,方便我们停车驻足,欣赏风景,拍摄照片和视频。路过一辆 tank 300 上山

IMG_20231210_134608-dk-compressed-打码后-压缩后.jpg

为了减轻存储和网络的压力,这几张照片压缩的似乎有些狠,照片质量损失有些大。

IMG_20231210_134640-dk-compressed.jpg

IMG_20231210_134724-dk-compressed.jpg

IMG_20231210_134729-dk-compressed.jpg

IMG_20231210_134754-dk-compressed-打码后-压缩后.jpg

IMG_20231210_135030-dk-compressed.jpg

山脚下的村子清晰可见

IMG_20231210_135305-dk-compressed.jpg

很喜欢这一张。当时太阳透过云层,给岩石🪨表面打了一点光,使得照片更有层次感了

IMG_20231210_135326-dk-compressed.jpg

快要到山脚下,到这里很有瑞士,北欧小城镇的感觉,生活在这里也太幸福了。他们农村的房子建的都很好,而且路修的好,不仅私家车方便,公共交通也有。

IMG_20231210_135930-dk-compressed.jpg

拍完上一张照片,时间来到了 2023-12-10 13:59:30。我看了一下目的地是 十门峡剑门景区,再看一眼地图,发现是向着南去的,而我要回家的方向——南京,在更远的北方。

于是我掉头准备回家,今天打卡浙西天路还是收获满满的。开车回南京,全程 299 公里,冲。

直到晚上 8 点多才到家。第二天晚上在此记录这个充实,疲惫,见识到了大美山川的周末,写完这《湖州安吉天荒坪盘山公路和杭州临安浙西天路之旅》,困意袭来,落笔再会。

Redmi K70 首发开箱和拍照体验 Review

购买

2023-11-29 晚 19:00 点,Redmi K70 发布了。我刚好想换掉手中用了三年多的 iPhone 12,于是就准备入手 Redmi K70 标准版。第二天我去小米之家观摩了实机,感觉还是挺满意的,主要满意的点在

  • 快充
  • 屏幕
  • Android 较为开放的生态

但是不太敢买红米手机的首发,因为不到几个月肯定会降价,会被背刺,于是我就想着双十二买?但是似乎也不太可能刚发布几天就降价,下一波降价肯定是在明年 618 附近,在此之前多是一些小打小闹,上不了几百块的官降。烦恼这破 iPhone 的杀后台和续航差信号差等情况蛮久了,又在B 站评论区看到有人建议直接在小米商城 Redmi K70 直播间购买这个手机,直播间会送一个价值 89 元的小米充电宝,然后我毫不犹豫下单了。

12 月 1 号晚上 23:30 下的单,使用中国银行信用卡还立减了 10 块钱,非常不错。

谁能想到这物流这么快呢。尽管页面上显示预计 3 号送达,但是快递从凌晨就从苏州太仓一路狂奔南京,2 号下午,顺风小哥就联系我了,这是真的快!

开箱

手机到手准备开盒

redmi k70 开箱1.jpg

送的充电宝,很是精致。在充电宝领域,小米、紫米、酷态科是你绕不开的品牌。

redmi k70开箱2.jpg

这 120w 充电有点震撼(来自 5 年 iPhone 用户的震惊 😲

redmi k70开箱3.jpg

买的晴雪白,16+512,2989 实付。质感还是不错的,由于用上了金属中框和玻璃后盖,比前几代红米手机的质感看起来要好很多。

redmi k70 开箱4 打码后 压缩后.jpg

拍照

IMG_20231203_134834-dk-compressed.jpg

IMG_20231203_142405-dk-compressed.jpg

IMG_20231203_142418-dk-compressed.jpg

IMG_20231203_143431-dk-compressed.jpg

IMG_20231203_143853-dk-compressed.jpg

IMG_20231203_144841-dk-compressed.jpg

IMG_20231203_155705-dk-compressed.jpg

总体上没有太多惊喜,徕卡的相关功能(滤镜)是一点都不下放啊,小米。 Redmi K 系列旗舰这么不能做人嘛……

2989 能买到骁龙 8 gen 2,还有 16+512 的存储组合,这在 iPhone 角度上看简直就是天方夜谭,重新换回 Android,发现还是 Android 香……

其他

如何在 Redmi K70 上安装 Google framework?

很简单,打开 miui 自带的应用商店,搜索 google play,如果搜索结果匹配到了,那么恭喜你,该手机可以直接安装 google 框架,直接点升级(upgrade)就好了,然后 Play 商店就会显示在你的 app 列表中。

然后登录 google 账号即可。

我的做法是,通过 OpenWrt 打开 Passwall,构建透明代理环境,然后 Redmi K70 连上这个 wifi 可以直接登录 google 账号。登录到 Play 商店能下载 app 之后,我就下载了一个 Surfboard……

反诈怎么关?

打开 Settings,搜索 anti-fraud ,对应中文系统搜 电诈防护,然后挨个关

如何打开开发者选项

打开设置,我的设备 -> 全部参数与信息 -> 多点击几次 OS版本 即可开启

Android 13+ 通过 Shizuku + Language Selector 给特定应用设置独立语言

正文

最近5年我一直在使用 iPhone,从 iPhone 6 到 iPhone XR,再到买 iPhone 12 首发,到昨天也算是把 iPhone 12 用了三年整(还要多一个多月)。这 iPhone 12 已经卡得让人想骂娘了,尤其是打开过 Camera 应用之后,再切回微信,微信必被杀然后重启,我看到的就是小人+蓝色地球画面…… iPhone 12 卡死了,很慢,我当时还是 7599 首发价买的 4+256,没错,这破手机只有 4GB RAM,苹果是对 iOS 多有信心呐?

看了 redmi k70 发布会,前天 2989 购入了 redmi k70 16+512 版本,通过小米商城直播间购买还送了一个小米10000毫安充电宝。关于换手机这事,看看后续是否再写一篇文章记录吧。


本文探讨一下在 Android 下,如何给指定的应用设置语言,比如系统语言是英文,我想把地图应用设置为简体中文。

然后我也把系统语言换成了 English(United States),这个主要是避免有些 app 在我的手机上拉屎,因为你知道的,有些第三方 app,你把语言换成英文或者繁体中文就会发现老实多了。

很多 app 都是直接读取的系统语言,没有独立的语言设置,我从 F-Droid 安装了 Organic Maps, https://organicmaps.app/ 这个开源地图应用,但是无法切换成中文,地图上很多 label 都还是英文的,看着难受,有的无法分辨是什么地名。

暂时还没有 root ,在没有 root 的情况下,可以单独设置特定应用的语言吗?答案是可以。通过 Shizuku + Language Selector 能给特定应用设置独立语言。Android 13 开始,Android 提供了这个能力和功能,但是 MIUI 把这个功能给砍了,MIUI 上这个功能没有入口。

Pixel 是可以直接在 Settings 里更改应用的显示语言的,可以看看下面三个链接阅读详情。


本文记录的是在 MIUI 系统下的操作,现在叫 Xiaomi HyperOS 但是底层仍然是 Android,这无需多言,只是小米为了生态大一统而这么宣发的,实际上这个生态严重依赖 Android 底层和生态,不多说了……

当前系统版本

  • OS version: 1.0.4.0.UNKCNXM
  • Android version: 14 | Android security update: 2023-11-01

Shizuku 入门,我是通过少数派这篇文章入门的 https://sspai.com/post/73294

Language Selector 是这个 GitHub repo https://github.com/VegaBobo/Language-Selector 从它的 release 页找到最新的 apk 下载到本地然后安装。

Shizuku 我是直接从 Google Play 下载的,也可以从这个页面寻找其他下载方式 https://shizuku.rikka.app/download/ (这是他们官网,放心进入)

手机这边,点击 N 次 OS version 打开开发者选项。

启动 Shizuku 需要打开 USB debugging 和 USB debugging (Security settings) (这个重要,如果不打开的话,在 shizuku 启动之后会有一个 warning,会导致它不能很好的工作(can not work properly)

然后要打开 Wireless debugging,打开之后选择 Pair device with pairing code,这里点击了之后会弹出一个 6 位数字的小窗口,但是此时你需要重点注意

  • 需要 grant 授予 Shizuku 通知权限,把这个应用的通知权限打开
  • 重点来了(本条针对 MIUI,其他国产系统可能处理方式不一样,如果你的系统不是 MIUI,请关注 Shizuku 里的提示),进入 Settings 搜索 Notification Shade,把 Notification Shade 的 Notification Style 从 Classic 改成 Android,这时你再在【Wireless debugging】中点击 【Pair device with pairing code】就能在通知中心输入那边生成的 6 位数字验证码,然后就是 pair 成功,Shizuku 成功运行

接下来就是打开 Language Selector,点击右上角三个点,点击 Show system apps。我为下面三个应用设置了 中文(简体中文,中国)

  • Calculator(包名是 com.miui.calculator
  • Weather(包名是 com.miui.weather2
  • Organic Maps(包名是 app.organicmaps
  • MIUI 自带拨号应用 Phone / Contacts and dialer (包名是 com.android.contacts

这下舒服了,为什么要把系统语言设置成英文?

  • 很多国产 app 会在手机里拉屎,对的,很多第三方应用你把它语言改成英文,广告就消失了,广告消失术?对,了解一下!
  • 你要说把系统语言改成英文可以学英语我只能说您这扯淡呢,咱程序员每天都面对这些单词,但是硬要说,对于英语的敏感度肯定是有提升的,而且有时候还能见到不认识的单词,也会促进词汇量提升。对非程序员群体,对整体的英语能力提升确有好处
  • 有些字体中文下很丑,英文下就还好

那本文折腾半天,为什么又要把部分 app 改成简体中文呢?本文的其他地方也略有提及,拨号、天气、小米计算器(可以方便的计算亲戚关系,还是中文比较方便),还有我下载的 Organic Maps 这样的地图应用,地图上的 label 全是中文有助于我了解地图,难道你们不是地图爱好者吗!

好了,that's all,希望能帮到你。

感谢

感谢我自己发的帖 https://www.v2ex.com/t/997299 和楼中回帖的朋友们

截图

我把几张重要的截图整合在了一起,可以看到在桌面首页的小米天气小组件当中,已经是中文了,但是其他所有地方都还是系统默认语言——英文。

shizuku_language_selector.png

我的 2023 Spotify Wrapped 听歌总结

这是我第四年使用 Spotify,第三次听它的年度总结。这个歌曲串烧往往给我带来一点感动,时间被音乐沉淀,4分钟里能通过听过的歌感受这一年里听歌时的种种心情。

最喜欢 Spotify 的功能是类似“接力”的概念,我举个通俗一点的例子说明,比如准备通勤回家,上车后呼叫车机让打开 Spotify,然后选择了一个播放列表 playlist 播放,下车前打开一下手机上的 Spotify 程序,就能将当前播放列表、当前播放歌曲、当前播放的状态进度条之类的数据同步到手机上。然后下电关车门回家,此时能继续使用手机听歌,或者回到家使用电脑+音箱播放,这在听一些 Podcast 时十分有用,因为无缝衔接不被打断,不需要记住进度条,更不需要手动跳转。

先来B站听听这4分钟?[doge]

其实,2020年我也上传过当时的 wrapped 总结视频,在这 【【Allen Hua】My listening for 2020 on Spotify】 https://www.bilibili.com/video/BV13y4y1B7gg/


我提取了2023年的摘要信息如下

  • 22种音乐基因
  • 听得最多的音乐类型是
    1. Mandopop 华语流行
    2. Korean Pop 韩国流行
    3. K-Pop (这不也是韩国流行音乐?)
    4. Anime 动漫,日本动漫 ACG 音乐
    5. Mainland Chinese Pop 中国大陆流行音乐
  • 台湾歌手陶喆,Tank,周兴哲
  • 播放了1443首歌
  • top song 是陶喆的流沙 2023 reimagined 版本
  • top song
    1. 流沙 Reimagined 陶喆
    2. Winter Sleep IU
    3. 全世界会唱的歌 陶喆
    4. なきむし。(爱哭鬼。) Miku Sawai 沢井美空 《少年同盟》ED
    5. 我很快乐 周兴哲
  • 一共收听了 22098 分钟,相当于15天不休不息一直在听歌,1月27号那天听了386分钟,这是最高纪录
  • 听了565位歌手的歌曲,top artist 是陶喆
  • top 歌手
    1. 陶喆
    2. 周杰伦
    3. IU
    4. 周兴哲
    5. 金泰妍
  • prefer emotional and atmospheric music more,更偏好饱含情感和有一些气氛的音乐

54395abb43f55d05413a7c184c187ab8.jpg

压缩剪贴板内图片并立即写入剪贴板,减轻服务器存储压力

更新日志

  • v1.0.1 发现 jdk 内置的压缩效果实在太差,最终引入了 net.coobirdthumbnailator 库进行图片的压缩
  • v1.0.0 最初版本发布

背景

在使用 self-built chatting system 聊天时,用的是非官方的服务器,有时候从 X 或者 TG 上粘贴一张图片过来,9 MB 的大小让人深感 vps 硬盘不够大,得省着点用。所以我想压缩一下图片再粘贴到聊天框,于是我就寻找一个简单快捷的工作流,但是很遗憾我没有找到。

于是我用 Java 写了一段代码实现了这个逻辑

  • 从其他任意地方复制图片(此时系统剪贴板里应是一张图片)
  • 执行一条命令,直接将压缩后的图片写入剪贴板(此时剪贴板里是压缩后的图片)
  • 直接在聊天页面中粘贴,此时粘贴的是压缩后的图片,达到了我们想要照顾服务器硬盘太小的这个目的

使用效果

我用自建的 Mattermost 举例

压缩前

mm压缩前.jpg

压缩后

mm 压缩后.jpg

压缩前后对比

compress 压缩前后对比.jpg

源码实现

基于 OpenJDK11 开发和构建,打包成了 jar,全部使用 jdk 内嵌包,没有引入第三方图片压缩的库,按理说可以引入,因为压缩后的成片质量可能比自带的 Graphics2D g = resImage.createGraphics(); g.drawImage(image, 0, 0, newWidth, newHeight, null); 效果好,但我此处的需求很简单,就是聊天时用用,对于图片的清晰度可能要求不是很高,有些文字很多的都快包浆了的那种图片也不适合压缩后再发送。

源码

import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.DecimalFormat;

/**
 * @author: hellodk
 * @description CompressImageAndPaste
 * @date: 11/3/2023 1:13 PM
 */

public class CompressImageAndPaste {

    /**
     * 压缩倍率
     */
    private static final double compress_ratio = 0.4;

    public static void main(String[] args) {
        CompressImageAndPaste ciap = new CompressImageAndPaste();
        BufferedImage srcImage = ciap.readImageFromClipboard();
        if (srcImage == null) {
            return;
        }
        long sizeInBytes = ciap.getImageSizeInBytes(srcImage);
        String sizeInHumanReadable = ciap.formatSize(sizeInBytes);
        System.out.println("Original image size is " + sizeInHumanReadable + ".");
        BufferedImage compressedImage = ciap.compressImage(srcImage, compress_ratio); // 压缩比例设置为 0.4
        ciap.writeImage2Clipboard(compressedImage);
        long newSizeInBytes = ciap.getImageSizeInBytes(compressedImage);
        String newSizeInHumanReadable = ciap.formatSize(newSizeInBytes);
        System.out.print("Compressed image size is " + newSizeInHumanReadable);
        System.out.println(", and has been written to your clipboard, you can paste it anywhere.");
    }

    private BufferedImage readImageFromClipboard() {
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        Transferable transferable = clipboard.getContents(null);
        if (transferable != null && transferable.isDataFlavorSupported(DataFlavor.imageFlavor)) {
            try {
                return (BufferedImage) transferable.getTransferData(DataFlavor.imageFlavor);
            }
            catch (UnsupportedFlavorException | IOException e) {
                e.printStackTrace();
            }
        }
        else {
            System.out.println("Make sure your clipboard latest item is image and continue.");
            System.out.println("Jar usage description: read your clipboard image and compress it, finally write the compressed image to your clipboard, you can paste it anywhere.");
        }
        return null;
    }

    private BufferedImage compressImage(BufferedImage image, double compressRatio) {
        BufferedImage resImage = null;
        try {
            Path tmpFilePath = Files.createTempFile("compressed_image", ".jpg");
            File targetFile = tmpFilePath.toFile();
            Thumbnails.of(image)
                    .scale(1)
                    .outputQuality(compressRatio)
                    .toFile(targetFile);
            resImage = ImageIO.read(targetFile);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return resImage;
    }

    private void writeImage2Clipboard(BufferedImage image) {
        Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
        ImageTransferable it = new ImageTransferable(image);
        cb.setContents(it, null);
    }

    private long getImageSizeInBytes(BufferedImage image) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "jpg", outputStream);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        byte[] compressedImageBytes = outputStream.toByteArray();
        long sizeInBytes = compressedImageBytes.length;
        return sizeInBytes;
    }

    private String formatSize(long sizeInBytes) {
        String[] units = {"B", "KB", "MB", "GB", "TB"};
        int unitIndex = 0;
        double size = sizeInBytes;
        while (size >= 1024 && unitIndex < units.length - 1) {
            size /= 1024;
            unitIndex++;
        }
        DecimalFormat df = new DecimalFormat("#.##");
        return df.format(size) + " " + units[unitIndex];
    }

    // 自定义Transferable类,用于将BufferedImage对象传输到剪贴板
    private static class ImageTransferable implements Transferable {
        private final BufferedImage image;

        public ImageTransferable(BufferedImage image) {
            this.image = image;
        }

        @Override
        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[]{DataFlavor.imageFlavor};
        }

        @Override
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return flavor.equals(DataFlavor.imageFlavor);
        }

        @Override
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            if (flavor.equals(DataFlavor.imageFlavor)) {
                return image;
            }
            else {
                throw new UnsupportedFlavorException(flavor);
            }
        }
    }
}

使用方法

发布到了 GitHub: https://github.com/hellodk34/CompressImageAndPaste ,从 release 页面下载 jar 包(最新版本 v1.0.1)。需要在电脑上安装 jdk11 环境,然后直接执行

java -jar compress_image_and_paste.jar

即可。

一些执行日志:

java -jar compress_image_and_paste.jar
Make sure your clipboard latest item is image and continue.
Jar usage description: read your clipboard image and compress it, finally write the compressed image to your clipboard, you can paste it anywhere.

java -jar compress_image_and_paste.jar
Original image size is 9.18 MB.
Compressed image size is 1.47 MB, and has been written to your clipboard, you can paste it anywhere.

初涉录音设备,记录我购买声卡和麦克风的曲折经历以及第一首翻唱陶喆——流沙 soul power 版本(low quality)

前言

两三年前就有买麦克风唱歌的想法了,一来是因为兴趣,二来是觉得消遣还能使我心情愉悦。另外相关设备的价格也是在能承受范围之内。近期这个想法又让我上头了,于是就有了本文。

我的B 站有7个音频投稿稿件,多是毕业之后使用 EarPods 3.5mm 耳机录的,不过甚至有我上高中时拿普通的头戴式耳机录的,也欢迎各位看官去浏览浏览,不吝啬的话也可以给我来个三连。哈哈。

不想看设备想直接听翻唱的,请——

【Allen Hua翻唱】陶喆 流沙 2003 Soul Power 版本 cover 陶喆 - https://www.bilibili.com/audio/au4093706


准备入电容麦

在YouTube,B站和知乎等等平台上搜索了很多设备,看了很多评测,也算是浅浅了解了动圈和电容的一些特性对比。但对于我的房间声学条件过于自信的我还是准备买电容麦克风。

下单百灵达 bm1 的时间是2023-09-04 晚上,平台是京东第三方专营店(但是京东快递)。卖家听说我是B 站粉丝,还给了我一张50元的优惠券,因为没要自带的支架,另外找他要了一个6.5mm 转3.5mm 的转接头。于是非常期待收货。

收到货真是非常喜欢这个颜值了,小巧但很重,非常给人厚实稳重感。做工也非常的不错,十分期待它的声音表现。就继续等待声卡到货。

2023-09-06 21.31.49-dk-compressed.jpg

2023-09-06 21.32.56-dk-compressed.jpg

2023-09-07 21.09.44-dk-compressed.jpg

500块钱的入门专业声卡

据说近两年入门声卡涨价了,1000块才能买到差不多的入门 2-in & 2-out 专业声卡了,但是我发现了 Sonicake 这个品牌,官网 https://www.sonicake.com/ ,其产品 Sonic Cube https://www.sonicake.com/products/sonic-cube 一眼就吸引了我。在B 站也看到好几个up狂推,不知道是真心的推荐还是收了钱,但是我认为买这个准没错。于是它到货了。

小东西也非常精致,耐看做工也不错。

2023-09-07 19.28.15-dk-compressed.jpg

2023-09-07 19.28.32-dk-compressed.jpg

2023-09-07 20.09.01-dk-compressed.jpg

但是我将bm1和声卡连接上电脑,打开了熟悉的 au,另外也装了 Studio One v6.0.1,打开声卡上的 48v 幻象电源开关,发现声音真的好小……

不论我怎么调试,声音都还是好小。这声卡在 win 上需要驱动,官网下载即可,mac 上免驱,但最终搞了好几个小时都未能达到满意的效果。

第二天还把 mac 升级到了最新系统,要知道我的19年底 16寸 intel MacBook Pro 买来就从未升级过🤣,为了尝试麦克风能有一些输入电平,我决定升级了一下 mac,但升级之后还是让我失望了。我联系了两边的客服,都不能帮助我解决问题。

没有 Input Level,声卡上的 line1 input gain 调到了最大,有了一些电平,但是底噪也非常的大…… 这基本是不能用的状态。

2023-09-08 19.47.25-dk-compressed.jpg

换了个声卡——百灵达 umc202hd

把 Sonic Cube 退货了,重新买了一个百灵达 umc202hd。但并没有改变 input level 低的现实,用 au 录音,波形非常不正常,试了试调整振幅,效果也很差劲,增益调大也一样。声音大了底噪也会增大。于是垂头丧气的我决定将这些全都退货。

2023-09-12 12.08.31-dk-compressed.jpg

2023-09-11 19.23.20-dk-compressed.jpg

2023-09-11 19.23.06-dk-compressed.jpg

几天时间的调整,看上了另一款百元内usb电容麦

usb电容麦-compressed.jpg

没错,这个规格只需要不到60块,看有几个B 站up推荐的这款,有实录,感觉效果还不错,关键是价格,这价格还要什么自行车。另外这是在 1688 上车的,于是我就安装了 1688(以前装过但卸载了),下单了一个。

但是5天还没有给我发货,实在是令人无语,商品页写着承诺3天内发货的,于是找了理赔,然后那边赔了5块钱。

卖家和我说,我选的款没有货,但有公司定制的有那个公司定制logo的问我要不要,我拒绝了。另外也问我有个橙色的问我要不要,我还是拒绝了……

7天之后,卖家建议我取消订单吧,他们工厂还没排产…… 我也是累了,不想再等了,就直接取消了订单。虽然精神气消耗挺大,而且等了7天,但是因此也收入了5块钱…… 当作精神损失费挺合适的。

决定买动圈麦山逊 q7x 和百灵达umc202hd 声卡

这次很干脆了,直接上车山逊 q7x 和百灵达 umc202hd 这个声卡。

声卡 umc202hd

2023-09-20 20.54.22-dk-compressed.jpg

山逊 q7x 动圈麦克风

2023-09-20 20.57.47-dk-compressed.jpg

麦克风支架是在京东买的,90块左右吧,30 40的没有选择怕产品太次了立都立不稳……

终于可以录歌试试看

第一首录了一下周兴哲《我很快乐》,这里就不放出来了。试了一下动圈麦的效果,我的使用环境果然还是应该买动圈麦啊,即使是300多块的动圈麦克风也能提供非常好的录音效果了。而且也不需要维护保养,使劲造就完事了。

第二首录了一下陶喆 流沙 2003 Soul Power 的版本,我是真的很钟情这个版本,那小提琴、鼓组以及口琴实在是太美了。已投稿B 站音频稿件,欢迎来听听👂

演唱还是有瑕疵,我自己也不满意,后续有待更好的状态发挥和技巧提升。另外是个混音小白,目前只做了100hz以下的低切,以及加了一点 10k 7khz 部分频率的增益,大概2 3db,人声和伴奏没有很好的融合。据说有什么 Side Chain 之类的用法,还有别的插件能帮助更好融合人声和伴奏,我再继续好好学习!

【Allen Hua翻唱】陶喆 流沙 2003 Soul Power 版本 cover 陶喆 - https://www.bilibili.com/audio/au4093706

欢迎大家给我一键三连 [doge]

特种兵旅行之马鞍山一日游

上周末和朋友来了一次特种兵旅行,哈哈,当下大学生喜欢玩的新鲜事物。

从雨花台开车到小马是真的近啊,上午10点多才出发,第一站就来到了安徽工业大学附属中学旁边的李大叔渣肉蒸饭(老八中店)。这物价是真的便宜,小份9元,大份13,豪华版16,相比南京已经便宜不少了。

李大叔渣肉蒸饭.jpg

2023-09-10 11.37.47-dk-compressed.jpg

今天的天气有些炎热,但除此之外其他都还好。吃完才12点不到,我们随即前往雨山湖公园一览这个大公园。

的确很大啊,和玄武湖公园打得有来有回,环境真的不错,就是感觉人不多,也许是大中午的,而且也还很热。

雨山湖公园.jpg

遇见一只小猫,居然一点不怕人,反而很黏我们。

2023-09-10 12.32.11-dk-compressed.jpg

2023-09-10 12.32.13-dk-compressed.jpg

2023-09-10 12.23.29-dk-compressed.jpg

嘿嘿,修猫咪

2023-09-10 12.26.56-dk-compressed.jpg

湖中有成片的彼岸花,全都一齐的开放了,非常好看。

2023-09-10 12.54.34-dk-compressed.jpg

游玩了湖去了旁边的金鹰,这里可是全马鞍山最潮流时尚,年轻人最喜爱的商场了,堪比南京的新街口。

喝到了挺不错的卡旺卡,据说一些南京的朋友还特地来小马喝这玩意……

后面驱车去了采石矶。2020年9月我在前公司时,有半个多月驻扎在马鞍山采石矶做驻场开发,再次来到这里算是故地重游。变化其实还是蛮大的,但就是物是人非,身边的朋友,同事,当时的景今又换了拨人看。而我又是那种不善于主动联系老同学老同事的人,很多关系是真滴太难维系。

在采石矶忘了拍照了。后面去逛了长江不夜城,老实说给我的感觉有点“做大了”,投资巨大,但是回报周期会很长。吃瓜群众还是要表示一下震惊的,做得不错。

马鞍山采石矶.jpg

晚餐时去了师专3号门,好多好吃的~还有好多美女妹妹。

马鞍山师专3号门.jpg

这个锅贴,1块钱2个!买了4个;煎包,1块钱1个。一共3块钱,还有3块钱的绿豆汤饮料,逆天的便宜。

2023-09-10 18.12.41-dk-compressed.jpg

2023-09-10 18.47.04-dk-compressed.jpg

总步数 24000+,特种兵旅行之马鞍山一日游结束。

2023-09-10 20.28.36步数.jpg

给我的 .com 域名续期以及转移域名(GoDaddy 到 Cloudflare)

com 顶级域最近两年屡次涨价,21年一次,23年9月再来一次,这让老互联网人没法好好玩耍了。众所周知,新互联网人只需要 app,小程序,客户端,很少有 domain,web 的思考和关注。的确,域名对部分互联网的发展越来越不重要了,但是也有人依然很有理想主义,你看 Elon Musk 毅然决然的将 twitter.com 换成了 x.com ,吊!令人钦佩。不过 x.com 这么厉害的域名,换我的话我也会用在自己的产品上。

话说回来,我的 xkkkx.com 是2022年从一个 mjj 手中买来的,目前觉得是真香。当时他从阿里云转出,我直接转入了 google domains,然后续了一年,用的当然是土耳其区的域,一年价格 195 土耳其里拉(折合人民币 53.33元,美元 7.26).这比狗爹便宜了好多啊!惊闻 com 马上又要涨价,2023-09-09 我决定直接续9年。

成功续命9年,这下快乐了。

1694352731646.png

TRY1755 约等于 CNY480.01 约等于 USD65.38

续费xkkkx.com土耳其里拉记录.jpg

我的另一个 com 域名 hellodk.com 是早几年前在 godaddy 买的,然后一直在狗爹那边没有转出,最近查看了一下续费的价格,立马惊呆了,居然要 22.17 美元一年。

然后在下面这两个域名价格对比的网站上搜索了一下,决定将 hellodk.com 从 godaddy 转移到 cloudflare。

两个域名价格对比网站:TLD Listdomcomp

后面的过程就是迁移域名:从 godaddy 迁出,从 cloudflare 迁入。

几个点可能会对搜到本文的你有帮助:

  1. 迁出前,需要 unlock 域名的安全锁,然后选择迁移到其他域名注册商
  2. 迁出时生成 authorization codes,保存好,后面迁入时需用到
  3. 迁入时可能会遇到“注册表状态:禁止客户端传输。请解锁并等待几个小时完成更新。”的提示,不用担心,就是因为上面1和2造成的,另外如果你执行了1和2上面两个步骤了但还是这个状态就耐心等待一两个小时,一般不会超过两个小时的,再次刷新页面,应该就能迁入了
  4. cloudflare声称他的域名是成本价,我姑且信了。价格是域名本身的价格再加 ICANN 的费用。我转入时的价格是9.77美元一年。

(9.77 + 58.62) / 7 = 9.77 因为这个价格比 google domains 贵一些,先整个7年的。

一共68.39美元,折合人民币502.15元;每年9.77美元,折合人民币71.74元。

hellodk.com域名转出到cf.jpg

主要是 Google Domains 目前已经关闭新域名注册和域名转入!开始迁移用户以及域名数据到Squarespace!土区优惠以后可能就这样没了,所以现在能续费就续费。后悔去年前年没有将 hellodk.com hellodk.cn 等域名都转到 google domains。。

现在后悔晚矣。

❌