普通视图

发现新文章,点击刷新页面。
昨天以前Allen Hua 的网络博客

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

作者 Allen Hua
2024年10月13日 11:48

我的 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 替代了原本的 httpd 作为 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剧透效果

作者 Allen Hua
2024年8月25日 16:56

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

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

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

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

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

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

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

增加全局样式

我考虑了一下,还是鼠标直接悬浮就直接展示原文,这样更加简单直接。否则还需要在文章内添加点击事件,必须引入js脚本。有一些论坛的实践确实是需要点击后才显示原文。

登录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主题的一些修改,图片懒加载优化,样式定制

作者 Allen Hua
2024年8月16日 10:22

使用 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月我的宜昌 - 重庆 - 川西小环线自驾旅行分享

作者 Allen Hua
2024年8月15日 00:43
前排提示:本文包含大量图片,一共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年打卡南京市区人防工程纳凉点

作者 Allen Hua
2024年8月2日 09:51

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


第一天首探

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 再次来到红山森林动物园

作者 Allen Hua
2024年7月29日 00:30

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体验分享

作者 Allen Hua
2024年7月27日 11:38

我挑选第一颗变焦镜头有参考很多文章、帖子和视频,写了一篇文章记录挑选过程,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

作者 Allen Hua
2024年7月15日 14:00

我现在都在用 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抓取易车销量排行榜数据到一个页面上展示

作者 Allen Hua
2024年7月10日 14:00

易车销量排行榜页面是 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

作者 Allen Hua
2024年7月9日 17:58

哔哩哔哩观看历史记录的页面地址是 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 第一次夜景出片

作者 Allen Hua
2024年7月7日 13:59

这几天很喜欢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盘空间

作者 Allen Hua
2024年7月1日 17:54

我们知道,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去钟山拍照

作者 Allen Hua
2024年6月29日 21:17

给今天的文章增加一首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第一次扫街,分享今天拍的一些片子

作者 Allen Hua
2024年6月22日 22:36

我问了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 定焦镜头

作者 Allen Hua
2024年6月22日 21:48

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桌面环境

作者 Allen Hua
2024年6月19日 14:27

最近安装了 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最新版默认打开的链接预览功能

作者 Allen Hua
2024年6月18日 22:56

我的 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 版本

作者 Allen Hua
2024年6月18日 22:38

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 驱动扬声器,外部耳机,外接显示器过程分享

作者 Allen Hua
2024年6月16日 23:15

前言

革命未完成,我的心不死——还是想打造一个纯粹的 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的痛。

❌
❌