清朝云资源网

作者: 清朝云

  • 解决兰空图床备份恢复后访问图片 404 问题


    共计 269 个字符,预计需要花费 1 分钟才能阅读完成。

    由于服务器进了黑洞,准备先将图床放在别的服务器,于是将之前的备份迁移过去,发现访问图片 404。

    原来是兰空图床在网站根目录的 public 目录会创建一个软连接指向图片实际存储的目录。这里如果修改了图片访问地址,那么就会创建一个新的软连接,比如修改为 public 就会创建一个 public 的软连接。

    但是在迁移的过程中这个软连接丢失了,所以导致无法访问。

    只需要执行如下命令:

    # 如果修改了图片存储的目录需要进行相应的修改
    ln -s /var/www/html/storage/app/uploads uploads

    或者在配置存储策略界面上重新保存一下即可。

    解决兰空图床备份恢复后访问图片 404 问题

    提醒:本文发布于530天前,文中所关联的信息可能已发生改变,请知悉!

    />

    Tips:清朝云网络工作室

  • 分享一个批量导入 docker 镜像和导入并运行镜像的脚本


    共计 997 个字符,预计需要花费 3 分钟才能阅读完成。

    在生产环境下,一般不允许连接外网,那么就需要把镜像导出拷贝到生产环境下。如果一个项目的中间件比较多,并且微服务架构下的服务镜像也很多,那么这个步骤就会显得比较麻烦。

    并且,服务镜像是可以导入并直接启动的,因为他们运行的命令都类似,除了镜像名称不同以外,所有清朝云写了如下脚本:

    #!/bin/bash
    shell_dir=$(pwd)
    loadStartDir="load_and_start"
    loadOnlyDir="load_only"
    loadedDir="loaded"
    
    if [ ! -d $loadedDir ]; then
      mkdir $loadedDir
    fi
    
    if [ -d $loadStartDir ]; then
      echo "======导入并启动镜像开始======"
      for file in $shell_dir/$loadStartDir/*.tar
      do
        if [ -f $file ]; then
          result=$(docker load < $file)
          ## 将文件移动到已导入文件夹
          mv $file $shell_dir/$loadedDir
          repo=$(echo "$result" | awk -F: '{print $2}')
          ## 容器名不能带 /
          serverName=$(echo "$repo" | sed 's/\//_/g')
          ## 删除以前的容器
          docker rm -f $serverName > /dev/null 2>&1
          echo "server $serverName is starting"
          tag=$(echo $result | awk -F: '{print $3}')
          docker run -d --net host --restart=unless-stopped -e ACTIVE=pro --name $serverName $repo:$tag > /dev/null 2>&1;
        fi
      done
      echo "======导入并启动镜像结束======"
    fi
    
    if [ -d $loadOnlyDir ]; then
      echo "======仅导入镜像开始======"
      for file in $shell_dir/$loadOnlyDir/*.tar
      do
        if [ -f $file ]; then
          echo "$(docker load < $file)"
          mv $file $shell_dir/$loadedDir
        fi
      done
      echo "======仅导入镜像结束======"
    fi

    这里的 docker run 命令根据实际情况进行修改。

    提醒:本文发布于529天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • WordPress 在线修改 php 文件提示 Scrape key check failed. Please try again


    共计 1480 个字符,预计需要花费 4 分钟才能阅读完成。

    挺郁闷的,清朝云今天修改 php 文件时报错了。

    Wordpress 在线修改 php 文件提示 Scrape key check failed. Please try again

    />

    网上找了一圈没结果,但是这个功能又不能不管,于是只能使用下策了,修改 wordpress 核心文件。

    找到 wp-includes 文件夹下面的 load.php 文件,修改 wp_start_scraping_edited_file_errors 函数。

    原代码:

    function wp_start_scraping_edited_file_errors() {
        if ( ! isset( $_REQUEST['wp_scrape_key'] ) || ! isset( $_REQUEST['wp_scrape_nonce'] ) ) {
            return;
        }
        $key   = substr( sanitize_key( wp_unslash( $_REQUEST['wp_scrape_key'] ) ), 0, 32 );
        $nonce = wp_unslash( $_REQUEST['wp_scrape_nonce'] );
    
        if ( get_transient( 'scrape_key_' . $key ) !== $nonce ) {
            echo "###### wp_scraping_result_start:$key ######";
            echo wp_json_encode(
                array(
                    'code'    => 'scrape_nonce_failure',
                    'message' => __( 'Scrape key check failed. Please try again.' ),
                )
            );
            echo "###### wp_scraping_result_end:$key ######";
            die();
        }
        if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) {
            define( 'WP_SANDBOX_SCRAPING', true );
        }
        register_shutdown_function( 'wp_finalize_scraping_edited_file_errors', $key );
    }

    这里只需要修改一下判断逻辑即可。

    function wp_start_scraping_edited_file_errors() {
        if ( ! isset( $_REQUEST['wp_scrape_key'] ) || ! isset( $_REQUEST['wp_scrape_nonce'] ) ) {
            return;
        }
        $key   = substr( sanitize_key( wp_unslash( $_REQUEST['wp_scrape_key'] ) ), 0, 32 );
        $nonce = wp_unslash( $_REQUEST['wp_scrape_nonce'] );
    
        if ( get_transient( 'scrape_key_' . $key ) == $nonce ) {
            echo "###### wp_scraping_result_start:$key ######";
            echo wp_json_encode(
                array(
                    'code'    => 'scrape_nonce_failure',
                    'message' => __( 'Scrape key check failed. Please try again.' ),
                )
            );
            echo "###### wp_scraping_result_end:$key ######";
            die();
        }
        if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) {
            define( 'WP_SANDBOX_SCRAPING', true );
        }
        register_shutdown_function( 'wp_finalize_scraping_edited_file_errors', $key );
    }

    提醒:本文发布于518天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • Docker 配置使用 gpu 开始 AI 之旅


    共计 3719 个字符,预计需要花费 10 分钟才能阅读完成。

    前言

    随着 AI 的爆火,更多的开源 AI 代码也涌现出来。但是,想要在用 docker 本地部署一个 AI 程序,仅仅靠 cpu 运行实在太慢,所以 docker 能使用宿主机的 gpu 也是很有必要的。

    下面就简单了解一下如何让 docker 能够使用 宿主机的 gpu,清朝云仅自己尝试过,不敢保证完全正确。

    一、升级docker并配置

    1. 升级

    建议更新 docker 到最新版本,版本至少 23 以上,可以参考 Linux 离线安装 Docker

    2. 安装nvidia-container-toolkit

    nvidia-container-toolkit 是一个用于与 NVIDIA GPU 集成的工具集,提供了一组工具和库,可以在容器中访问和管理 NVIDIA GPU 资源。

    # 添加源
    curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
        sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
        sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \
      && \
        sudo apt-get update
    # 安装nvidia-container-toolkit
    sudo apt-get install -y nvidia-container-toolkit

    nvidia-container-toolkit 包含以下组件:

    • nvidia-container-runtime:这是 NVIDIA 容器运行时,它提供了在容器内访问 NVIDIA GPU 的功能。它与 NVIDIA 驱动程序和 CUDA 工具栈进行集成,使容器中的应用程序能够利用 GPU 进行加速计算。

    • nvidia-container-runtime-hook:这是 NVIDIA 容器运行时的钩子程序,它用于在容器启动和停止时进行设置和清理操作。它与容器运行时一起使用,以确保正确配置 GPU 访问和运行时选项。

    • nvidia-docker:它是 Docker 的一个插件,提供了与 NVIDIA 容器运行时的集成。它简化了在 Docker 容器中配置和管理 GPU 加速应用程序的过程。

    在安装 nvidia-container-toolkit 时,可以看见以下几个相关软件包:

    • libnvidia-container-tools:是 nvidia-container-toolkit 的一个依赖包,它提供了与容器运行时相关的工具和库。

    • libnvidia-container1:也是 nvidia-container-toolkit 的一个依赖包,它提供了与容器运行时相关的库。

    • nvidia-container-toolkit-base:这是 nvidia-container-toolkit 的基础软件包,它包含必要的运行时组件和依赖项,用于支持 NVIDIA 容器运行时和相关工具。

    以下是一些扩展内容:

    Docker 19 之前,Docker 并不原生支持容器内直接使用 GPU。因此,为了在容器中实现 GPU 加速,NVIDIA 公司开发了一个名为 nvidia-docker 的项目。它通过与 NVIDIA 容器运行时 nvidia-container-runtime 集成,为 Docker 提供了 GPU 加速容器的支持。使用方式为:docker run –runtime=nvidia
    从 Docker 20 版本开始,Docker 引入了官方的 GPU 加速支持,无需使用额外的 nvidia-docker 工具。可以安装官方插件 nvidia-container-toolkit,而这个插件正如上面所说包含了 nvidia-container-runtime。使用方式为:docker run –gpus all

    另外,不管是 nvidia-docker 和 nvidia-docker2 已经被英伟达迭代了,使用的话会出现别的问题。最好还是安装比较高版本的 docker,使用 nvidia-container-toolkit 插件。

    在线安装方式:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

    离线安装方式:https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/

    找到系统对应的版本,下载四个包进行安装:libnvidia-container-tools、libnvidia-container1、nvidia-container-toolkit、nvidia-container-toolkit-base,注意这里不要直接复制连接 wget 下载,需要将链接的 blob 改为 raw。

    二、安装cuda

    可以尝试直接使用包管理工具安装 sudo apt install nvidia-cuda-dev nvidia-cuda-toolkit,仅使用 apt install nvidla-cuda-toolkit 可能报错。

    1. 安装

    借用 chatgpt 的回答,CUDA(Compute Unified Device Architecture)是由 NVIDIA 开发的并行计算平台和编程模型。它提供了一种在NVIDIA GPU上进行通用目的并行计算的方法。所以,本教程也仅适用 NVIDIA GPU 的机器。

    下载地址:https://developer.nvidia.com/cuda-toolkit-archive , 选择与自己系统相对应的版本。

    这里可以选择最新版的,和驱动没有必要关系,不过这里安装的 cuda 可能也会捆绑显卡驱动,但是驱动不一定适合本机。

    Docker 配置使用 gpu 开始 AI 之旅

    />

    这里选择本地或在线安装都可以,按照提示的命令安装就行。

    2. 配置环境变量

    安装好以后需要配置环境变量,一般会在 /usr/local 文件夹下有一个 cuda 的文件夹。

    cat >> ~/.bashrc <<EOF
    export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
    EOF

    注意:这里 cuda 根据实际目录进行配置,可以通过 find / -name "nvcc" 查看。

    接下来,更新环境变量配置。

    source ~/.bashrc

    验证是否配置成功。

    nvcc -V

    三、安装显卡驱动

    1. 查看驱动是否安装

    nvidia-smi

    如果提示命令不存在就是没有安装,其他提示可能是机器本身没有显卡或者显卡驱动安装的版本不正确。

    如果提示内容为 Not supported,也是说明安装的版本不正确。

    Docker 配置使用 gpu 开始 AI 之旅

    />

    2. 查看显卡型号

    lspci | grep -i vga

    Docker 配置使用 gpu 开始 AI 之旅

    />

    可以看见显卡的型号为 NVIDIA 的 GeForce GT 710。

    如果后面内容显示为一串数字如下,则可以访问:http://pci-ids.ucw.cz/mods/PC/10de/2486 (把后面的数字替换为查询到的数字),查询到显卡型号为 3060 Ti。

    root@robot-server:~# lspci | grep -i vga
    01:00.0 VGA compatible controller: NVIDIA Corporation Device 2486 (rev a1)

    3. 安装显卡驱动

    查询地址:https://www.nvidia.com/Download/index.aspx?lang=zh-cn

    Docker 配置使用 gpu 开始 AI 之旅

    />

    通过输入显卡型号和系统类型进行搜索下载,下载后你将得到一个 run 后缀的文件,运行即可。

    # 安装gcc和make
    apt install -y  gcc make 
    # 安装驱动
    chmod +x NVIDIA-Linux-x86_64-470.182.03.run && \
    ./NVIDIA-Linux-x86_64-470.182.03.run

    这里需要注意的是,可能会弹出窗口让你选择,如果看见 dkms,尽量选 yes,但清朝云也不是很懂,其他的选择默认即可。

    4. 测试显卡驱动

    nvidia-smi

    正常显示结果如下:

    Docker 配置使用 gpu 开始 AI 之旅

    />

    四、Docker使用GPU

    docker run -it --rm --gpus all ubuntu nvidia-smi

    显示如下结果说明大功告成。

    Docker 配置使用 gpu 开始 AI 之旅

    />

    容器内使用 nvcc 命令:

    docker run -it --rm -v $(which nvcc):/usr/bin/nvcc --gpus all ubuntu nvcc -V

    参考资料:https://blog.csdn.net/NekoTom/article/details/127508810

    提醒:本文发布于517天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • Ubuntu 安装 vnc 远程桌面


    共计 1673 个字符,预计需要花费 5 分钟才能阅读完成。

    TigerVNC 是一个开源的远程桌面软件,它提供了图形化用户界面 (GUI) 的远程访问功能。TigerVNC 是基于 Virtual Network Computing (VNC) 协议的一个实现,它允许用户通过网络远程连接到另一台计算机,并在远程计算机上查看和操作图形界面。

    1. 安装vnc-server

    # 下面是Ubuntu中TigerVNC相关的一些包,使用 VNC server 功能只需要安装没有注释掉的部分即可
    sudo apt install tigervnc-common
    # sudo apt install tigervnc-scraping-server
    sudo apt install tigervnc-standalone-server
    # sudo apt install tigervnc-viewer
    # sudo apt install tigervnc-xorg-extension

    tigervnc-common:这是 TigerVNC 的公共文件和配置文件。它包含了用于配置和管理 TigerVNC 的共享文件、启动脚本和其他必要的共享组件。
    tigervnc-scraping-server:这是 TigerVNC 的屏幕抓取服务器组件。它允许你在 TigerVNC 会话中进行屏幕截图和屏幕录制。
    tigervnc-standalone-server:这是 TigerVNC 的独立服务器组件。它提供了一个独立的 VNC 服务器,可以在没有桌面环境的情况下运行,以便在远程计算机上提供图形化的远程访问。
    tigervnc-viewer:这是 TigerVNC 的查看器组件。它是一个用于连接和查看远程 TigerVNC 会话的图形界面应用程序。
    tigervnc-xorg-extension:这是 TigerVNC 的 Xorg 扩展组件。它允许 TigerVNC 与 X Window System(Xorg)集成,并提供了支持 Xorg 扩展的功能。

    2. 配置密码

    vncpasswd

    重复输入密码后,会提示这个密码连接是否是只读的远程,选择 n。

    3. 配置远程连接显示的桌面

    touch ~/.vnc/xstartup && \
    chmod +x ~/.vnc/xstartup && \
    cat > ~/.vnc/xstartup <<EOF
    #!/bin/sh
    # Uncomment the following two lines for normal desktop:
    unset SESSION_MANAGER
    exec /etc/X11/xinit/xinitrc
    unset DBUS_SESSION_BUS_ADDRESS
    
    [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
    
    # xsetroot -solid grey
    # vncconfig -iconic &
    # x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
    # x-window-manager &
    
    # export XKL_XMODMAP_DISABLE=1
    
    gnome-panel &
    gnmoe-settings-daemon &
    metacity &
    nautilus &
    gnome-terminal &
    EOF

    4. 启动vnc-server

    # 数字代表会话号
    vncserver -localhost no -geometry 1920x1080 :1

    然后就可以通过 vncviewer 进行连接,默认是 5901 端口。

    Ubuntu 安装 vnc  远程桌面

    />

    5. 常用命令

    5.1 启动 VNC 服务器

    # 一般需要设置其他参数
    vncserver :1

    5.2 查看会话列表

    vncserver -list

    5.3 关闭会话

    # 数字代表会话号
    vncserver -kill :1

    5.4 设置分辨率

    # 设置会话1的分辨率为 1920x1080
    vncserver :1 -geometry 1920x1080

    据说 x0vncserver 可以实现远程桌面和本地同步,但清朝云一直没有实现,使用这个命令需要安装 tigervnc-scraping-server。

    提醒:本文发布于517天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • 解决 Docker 使用 gpu 报错


    共计 140 个字符,预计需要花费 1 分钟才能阅读完成。

    docker 使用 gpu 的情况下,可能报错:

    thread_monitor operation not permitted in pthread_create

    这个报错将导致程序异常,容器无法启动。

    这可能是 docker 版本太低,升级 docker 版本即可解决问题,最好将 docker 升级至最新版。

    提醒:本文发布于515天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • 10月16日,星期三, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 终于赢了!国足2比1击败印尼

    2. 朝鲜半岛局势何以突然“变天”? 当地时间10月15日,朝鲜炸毁朝韩军事分界线部分区段道路,随后韩军进行回应性射击。记者表示:半岛局势陡然升级,恐将持续。

    3. 以科技创新驱动产业发展 作为用来探测深空的“大眼睛”,宽视场光谱巡天望远镜(MUST)在江苏省江阴市有了新进展。江阴以科技创新为引领,持续推动传统制造业数字化转型升级。

    4. 国足保住小组前4希望 世预赛亚洲区18强赛第4轮,国足2比1战胜印尼,3分到手,保住小组前4希望,伊万帅位暂时稳住了。

    5. 已有投资者被银行提前收回资金

    6. 张玉宁黄牌系乌龙 亚足联给出错信息 15日,国足主场2比1击败印尼队。根据这场比赛的比赛报告显示,张玉宁并没有获得黄牌,亚足联官方在比赛期间曾给出了错误信息。

    7. 母女住民宿遭男子强闯

    8. 50岁女子生下二胎 5年前失去独子 近日,湖北一50岁母亲通过试管的方式怀孕并顺利生下二胎。当事人表示,其独子5年前在一次意外爆炸事件中失去生命。

    9. 医生回应男孩错把滴水观音当芋头 近日,15岁的小昊(化名)跟朋友一起出去玩时发现一个类似芋头的植物,小昊认为是芋头,朋友们认为不是,几个人展开了激烈的讨论。为了证明自己是对的,小昊一气之下咬了一口“芋头”

    10. 我国无需缴纳个税人员占比超七成

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 基因的优胜劣汰特征为什么没有把世界上所有丑的人完全淘汰掉?
    链接: https://daily.zhihu.com/story/9776247
    ———————-
    标题: 为什么张爱玲会写爱上自己爸爸这样的小说?
    链接: https://daily.zhihu.com/story/9776248
    ———————-
    标题: 东北雨姐带货红薯粉条厂家承认「产品确有三分之一木薯粉」,木薯粉会给身体造成危害吗?
    链接: https://daily.zhihu.com/story/9776252
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9776136
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 苹果发布 2024 款 iPad mini 7 平板电脑:128GB 版本 3999 元,512GB 版本 6499 元
    发布时间: 2024-10-15T21:07:47.887
    新闻简介: 新款 iPad mini 主要是规格升级,粉色改为蓝色,搭载 A17 Pro 芯片(5 核 GPU 版),且支持新款 Apple Pencil Pro,依然配备 8.3 英寸 Liquid Retina 显示屏。
    ———————-
    标题: QQ 纯血鸿蒙版抢先体验:超级纯净,藏小惊喜,有大期待
    发布时间: 2024-10-15T14:30:09.393
    新闻简介: 原生版界面超级纯净,体验极其纯粹,且聊天、钱包、短视频、空间、频道这些核心功能都支持,已经可以正常使用
    ———————-
    标题: 苹果全新 iPad mini 7 平板电脑升级 USB-C 3.1 Gen 2,传输速率 10 Gbps
    发布时间: 2024-10-15T21:27:22.907
    新闻简介: 苹果公司现已在官网上线 iPad mini 7 平板电脑,存储空间扩大至 128GB 起步,将于 10 月 17 日上午 9 点接受预购,10 月 23 日发售。IT之家获悉,这款平板电脑的 USB-C 接口为“USB 3”规格,然苹果将其称为 USB 3,但这一速率实际上已经达到了 USB 3.1 Gen 2 的标准。不过,要想充分发挥出这一传输速度,用户还需要购买合适的 10Gb/s 数据线。
    ———————-
    标题: 华为 nova 13 系列手机定金预售:黑 / 白 / 绿 / 紫四色,到手价 2XX9 元起
    发布时间: 2024-10-15T13:02:38.26
    新闻简介: 华为 nova 13 有星耀黑、洛登绿、羽砂紫、羽砂白四种颜色;有 256GB 和 512GB 存储版本可选;支持北斗卫星图片消息、AI 修图;电商平台页面显示到手价 2XX9 元。
    ———————-
    标题: 郭明錤:骁龙 8 Gen 4 芯片 2024 下半年出货量同比增 50%、单价涨 15%,中国手机品牌冲击高端是主因之一
    发布时间: 2024-10-15T06:53:17.693
    新闻简介: 天风国际分析师郭明錤昨日发布投资简报,报告称高通旗舰芯片骁龙 8 Gen 4 在 2024 年下半年出货量预估为 900 万颗,相比较骁龙 8 Gen 3 出货量同比增长 50%;单价至 180 美元(IT之家备注:当前约 1275 元人民币),涨幅 15%。
    ———————-
    标题: vivo:X200 系列手机预售首日全系销量是上代 150%,Pro 版本是上代 200%
    发布时间: 2024-10-15T11:01:28.957
    新闻简介: vivo X200 系列手机昨晚正式发布,全球首发天玑 9400 处理器,标准版售价 4299 元起,Pro 版(含 vivo X200 Pro 和 vivo X200 Pro mini)售价 4699 元起。
    ———————-
    标题: 四川警方通报 74 岁老人驾“老头乐”强闯高速逆行事故,致两人死亡
    发布时间: 2024-10-15T14:44:02.64
    新闻简介: 10 月 12 日,有低速电动车“老头乐”冲闯道闸进入高速逆行发生交通事故,引发网友关注,截至IT之家发稿,相关话题在微博登上热搜榜第四,阅读量 3969.9 万。经查,10 月 12 日 8 时许,杨某安(男,74 岁)无证驾驶无牌低速四轮电动车(俗称“老头乐”)搭载韩某容(女,55 岁),由 G5 京昆高速公路(成雅段)蒲江东收费站冲闯道闸进入高速公路,随后在雅安至成都方向左起第一车道内逆向行驶时,与杨某(男,30 岁)驾驶的小型轿车相撞。事故造成杨某安、韩某容死亡,两车受损。
    ———————-
    标题: 10 月 24 日发布,OPPO Find X8 系列手机、Pad 3 Pro 平板、Enco X3 耳机渲染图曝光
    发布时间: 2024-10-15T07:50:04.733
    新闻简介: 消息源 Evan Blass 今天(10 月 15 日)在 X 平台发布系列推文,分享了 OPPO Find X8 系列智能手机、OPPO Pad 3 Pro 平板以及 Enco X3 无线耳机的高清渲染图,上述三款产品将于 10 月 24 日发布。
    ———————-
    标题: 原生鸿蒙之夜暨华为全场景新品发布会官宣 10 月 22 日举行
    发布时间: 2024-10-15T09:03:15.843
    新闻简介: 原生鸿蒙之夜暨华为全场景新品发布会官宣 10 月 22 日 19:00 举行,口号为“星河璀璨,共见鸿蒙”。
    ———————-
    标题: 苹果全新 iPad mini 7 电脑支持 esim 通信,对比上代缺少 1 个千兆 LTE 频段
    发布时间: 2024-10-15T21:58:14.44
    新闻简介: IT之家查询苹果官网获悉,iPad mini 7 取消对 nona-SIM 卡的支持,新增 esim 网络通信、同时升级蓝牙 5.3。需要注意的是,iPad mini 7 在千兆 LTE 网络上,支持最多 29 个频段,相比上一代少 1 个频段。
    ———————-
    标题: i5-14400F+RTX4060Ti:联想 T4900k 台式机 16+1TB 版 4996 元 6 期免息
    发布时间: 2024-10-15T09:25:10.603
    新闻简介: i5-14400F+RTX4060Ti:联想 T4900k 台式机 16+1TB 版 4996 元 6 期免息
    ———————-
    标题: 大跳 1918 元:三星 S24 小屏旗舰手机 3581 元京东 6.5 折新低
    发布时间: 2024-10-15T11:59:18.487
    新闻简介: 三星 S24 手机国行于 1 月 31 日上市,8+256G 上市价为 5499 元。

    京东 11.11 大促期间,今日直降至 3799 元,下单立减 199 元,PLUS 下单再享 9.5 折优惠,到手价仅需 3581.01 元。
    ———————-

    —- IT之家新闻 End —-

  • Java 使用 EasyExcel 导出基本使用方法


    共计 7390 个字符,预计需要花费 19 分钟才能阅读完成。

    工作中要说用到 excel 的情况说多也不多,说少也不少,但是很多次遇到似乎都要去查一遍 EasyExcel 的用法,所以这里把经常用到的注解记录一下。

    1. 基本导出

    1.1 指定标题

    常规导出情况下,只需要指定单元格头部标题,和忽略部分字段即可。

    public class DemoData {
        @ExcelProperty("字符串标题")
        private String string;
        @ExcelProperty("日期标题")
        private Date date;
        @ExcelProperty("数字标题")
        private Double doubleData;
        /**
         * 忽略这个字段
         */
        @ExcelIgnore
        private String ignore;
    }

    1.2 指定行高和列宽

    行高和列宽可以先对所有字段统一设置,再根据每个字段具体调整。

    // 指定头部行高、内容行高和宽度
    @HeadRowHeight(20)
    @ContentRowHeight(10)
    @ColumnWidth(25)
    public class WidthAndHeightData {
        @ExcelProperty("字符串标题")
        private String string;
        @ExcelProperty("日期标题")
        private Date date;
        /**
         * 宽度为50
         */
        @ColumnWidth(50)
        @ExcelProperty("数字标题")
        private Double doubleData;
    }

    2. 指定字段排序和导出内容

    2.1 指定字段排序

    可以设置 index 或者 order 来指定字段所在的列。

    @ExcelProperty(value = "字符串标题", index = 0)
    private String string;
    // 使用 order 的好处是,当排除字段时不会出现空行
    @ExcelProperty(value = "字符串标题", order = 0)
    private String string;

    2.2 指定导出字段

    // 根据用户传入字段 假设我们只要导出 date
    Set<String> includeColumnFieldNames = new HashSet<>();
    includeColumnFieldNames.add("date");
    // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
    EasyExcel.write(fileName, DemoData.class).includeColumnFieldNames(includeColumnFieldNames).sheet("模板")
        .doWrite(data());

    2.3 指定排除字段

    // 根据用户传入字段 假设我们要忽略 date
    Set<String> excludeColumnFieldNames = new HashSet<>();
    excludeColumnFieldNames.add("date");
    // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
    EasyExcel.write(fileName, DemoData.class).excludeColumnFieldNames(excludeColumnFieldNames).sheet("模板")
        .doWrite(data());
    

    3. 设置复杂头

    通过对单元格头部设置多个标题来实现复杂头。

    @ExcelProperty({"主标题", "字符串标题"})
    private String string;
    @ExcelProperty({"主标题", "日期标题"})
    private Date date;
    @ExcelProperty({"主标题", "数字标题"})
    private Double doubleData;

    通过对所有字段设置相同的标题可以将单元格合并,如果想要设置更复杂的头部,参考示例:

    @ExcelProperty({"顶格", "顶格", "两格"})
    private String string0;
    @ExcelProperty({"顶格", "顶格", "两格"})
    private String string1;
    @ExcelProperty({"顶格", "四联", "四联"})
    private String string2;
    @ExcelProperty({"顶格", "四联", "四联"})
    private String string3;
    @ExcelProperty({"顶格"})

    结果如下:

    Java 使用 EasyExcel 导出基本使用方法

    />

    4. 分页查询数据写入

    数据量太大的情况下,可以考虑分页查询数据,然后再多次写入。

    try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
        // 这里注意 如果同一个sheet只要创建一次
        WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
        // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
        for (int i = 0; i < 5; i++) {
            // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
            List<DemoData> data = data();
            excelWriter.write(data, writeSheet);
        }
    }

    5. 写入不同sheet

    写入不同 sheet 也是一个很常见的功能需求,比如导出员工数据时根据部分进行划分 sheet。

    5.1 写入相同的对象

    
    try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
        // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
        for (int i = 0; i < 5; i++) {
            // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
            WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).build();
            // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
            List<DemoData> data = data();
            excelWriter.write(data, writeSheet);
        }
    }

    5.2 写入不同的对象

    try (ExcelWriter excelWriter = EasyExcel.write(fileName).build()) {
        // 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
        for (int i = 0; i < 5; i++) {
            // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class
            // 实际上可以一直变
            WriteSheet writeSheet = EasyExcel.writerSheet(i, "模板" + i).head(DemoData.class).build();
            // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
            List<DemoData> data = data();
            excelWriter.write(data, writeSheet);
        }
    }

    6. 格式转换

    EasyExcel 提供对常用的日期、数字转换的注解,同时也提供了自定义格式转换器。

    public class ConverterData {
        /**
         * 我自定义 转换器,不管数据库传过来什么 。我给他加上“自定义:”
         */
        @ExcelProperty(converter = CustomStringStringConverter.class)
        private String string;
        /**
         * 这里用string 去接日期才能格式化。我想接收年月日格式
         */
        @DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
        private String date;
        /**
         * 我想接收百分比的数字
         */
        @NumberFormat("#.##%")
        private String doubleData;
    }

    其实大部分情况下还是需要格式转换器来转换,比如员工性别,数据库的数据是 0 和 1,需要将其转换问男和女。

    下面是 EasyExcel 提供的一个示例:

    public class CustomStringStringConverter implements Converter<String> {
        @Override
        public Class<?> supportJavaTypeKey() {
            return String.class;
        }
    
        @Override
        public CellDataTypeEnum supportExcelTypeKey() {
            return CellDataTypeEnum.STRING;
        }
    
        /**
         * 这里读的时候会调用
         *
         * @param context
         * @return
         */
        @Override
        public String convertToJavaData(ReadConverterContext<?> context) {
            return "自定义:" + context.getReadCellData().getStringValue();
        }
    
        /**
         * 这里是写的时候会调用 不用管
         *
         * @return
         */
        @Override
        public WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) {
            return new WriteCellData<>(context.getValue());
        }
    }

    7. 写入图片

    可以通过多种方式写入图片,比如 url,file 对象,Stream 流。

    String imagePath = TestFileUtil.getPath() + "converter" + File.separator + "img.jpg";
    try (InputStream inputStream = FileUtils.openInputStream(new File(imagePath))) {
        List<ImageDemoData> list = ListUtils.newArrayList();
        ImageDemoData imageDemoData = new ImageDemoData();
        list.add(imageDemoData);
        // 放入五种类型的图片 实际使用只要选一种即可
        imageDemoData.setByteArray(FileUtils.readFileToByteArray(new File(imagePath)));
        imageDemoData.setFile(new File(imagePath));
        imageDemoData.setString(imagePath);
        imageDemoData.setInputStream(inputStream);
        imageDemoData.setUrl(new URL(
            "https://www.qcyqq.com/wp-content/uploads/2023/04/f09d57b823cf06b3d50fba052e21baf.png"));
        // 写入数据
        EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list);
    }

    其中 ImageDemoData.java 类如下:

    @Getter
    @Setter
    @EqualsAndHashCode
    @ContentRowHeight(100)
    @ColumnWidth(100 / 8)
    public class ImageDemoData {
        private File file;
        private InputStream inputStream;
        /**
         * 如果string类型 必须指定转换器,string默认转换成string
         */
        @ExcelProperty(converter = StringImageConverter.class)
        private String string;
        private byte[] byteArray;
        /**
         * 根据url导出
         *
         * @since 2.1.1
         */
        private URL url;
    
        /**
         * 根据文件导出 并设置导出的位置。
         *
         * @since 3.0.0-beta1
         */
        private WriteCellData<Void> writeCellDataFile;
    }
    

    可以看见 string 使用了 StringImageConverter 转换器,这个转换器将给定的路径读取文件,然后再进行写入。

    public class StringImageConverter implements Converter<String> {
        @Override
        public Class<?> supportJavaTypeKey() {
            return String.class;
        }
    
        @Override
        public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty,
            GlobalConfiguration globalConfiguration) throws IOException {
            return new WriteCellData<>(FileUtils.readFileToByteArray(new File(value)));
        }
    }

    8. 导出并合并

    可能会遇到这种情况,某些字段导出的内容也需要进行合并。

    public void mergeWrite() {
        // 方法1 注解
        String fileName = TestFileUtil.getPath() + "mergeWrite" + System.currentTimeMillis() + ".xlsx";
        // 在DemoStyleData里面加上ContentLoopMerge注解
        EasyExcel.write(fileName, DemoMergeData.class).sheet("模板").doWrite(data());
    
        // 方法2 自定义合并单元格策略
        fileName = TestFileUtil.getPath() + "mergeWrite" + System.currentTimeMillis() + ".xlsx";
        // 每隔2行会合并 把eachColumn 设置成 3 也就是我们数据的长度,所以就第一列会合并。当然其他合并策略也可以自己写
        LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 0);
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, DemoData.class).registerWriteHandler(loopMergeStrategy).sheet("模板").doWrite(data());
    }

    其中 DemoMergeData 类如下:

    public class DemoMergeData {
        // 这一列 每隔2行 合并单元格
        @ContentLoopMerge(eachRow = 2)
        @ExcelProperty("字符串标题")
        private String string;
        @ExcelProperty("日期标题")
        private Date date;
        @ExcelProperty("数字标题")
        private Double doubleData;
    }

    9. 自定义样式

    自定义样式可以自定义单元格的背景,单元格的文字大小等等。

    // 头背景设置成红色 IndexedColors.RED.getIndex()
    @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 10)
    // 头字体设置成20
    @HeadFontStyle(fontHeightInPoints = 20)
    // 内容的背景设置成绿色 IndexedColors.GREEN.getIndex()
    @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 17)
    // 内容字体设置成20
    @ContentFontStyle(fontHeightInPoints = 20)
    public class DemoStyleData {
        // 字符串的头背景设置成粉红 IndexedColors.PINK.getIndex()
        @HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 14)
        // 字符串的头字体设置成20
        @HeadFontStyle(fontHeightInPoints = 30)
        // 字符串的内容的背景设置成天蓝 IndexedColors.SKY_BLUE.getIndex()
        @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
        // 字符串的内容字体设置成20
        @ContentFontStyle(fontHeightInPoints = 30)
        @ExcelProperty("字符串标题")
        private String string;
        @ExcelProperty("日期标题")
        private Date date;
        @ExcelProperty("数字标题")
        private Double doubleData;
    }

    10. 其他

    其他比如生成动态头部、插入超链接、拦截器形式自定义样式等等,更多内容参考:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write

    提醒:本文发布于514天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • xrdp + xfce4 搭建 Linux 远程桌面


    共计 1324 个字符,预计需要花费 4 分钟才能阅读完成。

    前言

    Linux 的远程桌面没有 Windows 那么简单,可以通过安装 vnc 的方式实现,这种需要安装额外的软件来进行远程,今天介绍一种 xrdp 实现的方式。

    1. 安装xrdp和xface4

    xfce4 是一个很轻量级的桌面,如果你不想使用 xfce4,那么只开启 xrdp 也是可以的,那么远程的时候就是默认进入 gnome 的桌面系统。

    sudo apt update && sudo apt -y upgrade && \
    sudo apt-get purge xrdp && \
    sudo apt install -y xrdp xfce4 xfce4-goodies

    2. 配置

    首先修改下 xrdp 配置文件以获得更好的展示效果。

    sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak
    sudo sed -i 's/max_bpp=32/#max_bpp=32\nmax_bpp=128/g' /etc/xrdp/xrdp.ini
    sudo sed -i 's/xserverbpp=24/#xserverbpp=24\nxserverbpp=128/g' /etc/xrdp/xrdp.ini

    设置系统在启动 x 会话时使用 xfce4 作为默认的会话管理。器。

    echo xfce4-session > ~/.xsession

    修改配置 xrdp 会话中使用 xfce4 桌面环境,因为默认情况下,xrdp 使用 “/etc/X11/Xsession” 脚本来启动 x 会话。

    sudo vim /etc/xrdp/startwm.sh
    !以下这两行注释掉:
    #test -x /etc/X11/Xsession && exec /etc/X11/Xsession
    #exec /bin/sh /etc/X11/Xsession
    
    !添加这一行:
    # xfce
    startxfce4

    3. 启动

    启动 xrdp 服务并设置自启动。

    systemctl start xrdp && \
    systemctl enable xrdp

    然后就可以通过 windows 远程桌面进行访问。

    xrdp + xfce4 搭建 Linux 远程桌面

    />

    当重复进行远程访问时,可能出现闪退的情况,查看用户目录下 .xsession-errors 文件,发现报错:

    xfce4-session-Message: 20:26:23.125: SSH authentication agent is already running
    gpg-agent[1604739]: 警告: “–write-env-file” 是一个废弃的选项 – 此选项不会产生作用
    gpg-agent: 有一个 gpg-agent 实例正在运行 – 无须启动新的实例

    此时解决办法是:

    # 删除会话
    pkill xfce4-session

    4. 其他

    4.1 安装中文输入法

    安装中文输入法/谷歌拼音。

    sudo apt install fcitx fcitx-googlepinyin
    fcitx-autostart

    4.2 配置中文环境

    这个清朝云没有尝试,因为默认安装的就是中文的桌面。

    # 安装中文语言
    sudo apt install -y language-pack-zh-hans
    # 导入中文环境
    export LC_ALL=zh_CN.UTF-8
    # 修改LOCALE
    sudo vim /etc/default/locale
    修改:
    LANG=zh_CN.UTF-8
    LANGUAGE="zh_CN:zh"

    提醒:本文发布于514天前,文中所关联的信息可能已发生改变,请知悉!

    Tips:清朝云网络工作室

  • 如何查看 Linux 机器是否能通过 Docker 运行 gui 界面


    共计 291 个字符,预计需要花费 1 分钟才能阅读完成。

    用一个非常简单的容器可以达到测试效果,不管是在远程 ssh 界面,或者是本地运行这将会打开一个时钟。

    docker run \
    --rm -it \
    --net=host \
    -e DISPLAY=$DISPLAY \
    -v $HOME/.Xauthority:/root/.Xauthority \
    sshipway/xclock

    这里的 --net=host 非常重要,否则将会提示:

    Error: Can’t open display: localhost:x

    另外,如果是 ssh 远程想要在本地打开 gui 界面的话,需要本地装有 x server,像 mobaxterm 就是默认就安装了并且不需要配置,其他的 ssh 终端可以需要进行配置。

    如何查看 Linux 机器是否能通过 Docker 运行 gui 界面

    提醒:本文发布于513天前,文中所关联的信息可能已发生改变,请知悉!

    />

    Tips:清朝云网络工作室