• 【Rust】Hello World

    创建main.rs文件来编写一个将文本打印到屏幕上的小程序Hello, world!

    fn main() {
        println!("Hello, world!");
    }

    Rust 文件总是以 .rs 扩展名结尾。如果在文件名中使用多个单词,惯例是使用下划线将它们分开。例如,使用hello_world.rs而不是helloworld.rs。

    编译和运行

    Linux或macOS

    rustc main.rs
    ./main
    编译
    编译成功后,Rust 输出二进制可执行文件
    运行

    Windows

    rustc main.rs

    .\main.exe

    编译后,使用 Windows 上的 PowerShell执行 ls 或者 使用 CMD 时执行

     dir /B %= the /B option says to only show the file names =%

    都可以看到三个文件:

    main.exe
    main.pdb
    main.rs

    扩展名为.rs的源代码文件、可执行文件(在 Windows 上为main.exe,但在所有其他平台上为main),以及使用 Windows 时包含调试信息且扩展名为.pdb的文件。

    程序剖析

    函数main始终是每个可执行 Rust 程序中运行的第一段代码。

    1. 函数体包裹在{}。Rust 要求所有函数体都用大括号括起来。
    2. Rust 风格是用四个空格缩进,而不是制表符。
    3. 使用 a!意味着您正在调用宏而不是普通函数,并且宏并不总是遵循与函数相同的规则。上面代码中println!调用 Rust 宏,如果它调用了一个函数,输入为println(不带!)
    4. 分号结束一行,表示表达式已结束

    编译和运行是分开的步骤

    Rust 是一种提前编译语言,这意味着可以编译一个程序并将可执行文件提供给其他人,他们可以在没有安装 Rust 的情况下运行它。

    如果给别人一个.rb.py.js文件,他们需要安装 Ruby、Python 或 JavaScript 实现(分别)。但是在这些语言中,只需要一个命令来编译和运行程序。一切都是语言设计的权衡。


  • OPPO K9 智能电视开启 HDMI 增强模式以使用 4K@60Hz

    问题描述

    最近把电脑接到电视(OPPO K9 55寸)上使用,发现设置 4K 分辨率会有显著卡顿。在 Windows 显示设置中发现,只有 1920*1080@60Hz、3840*2160@30Hz、4096*2160@24Hz 可选,显卡是 RTX3060,按理说不该有问题。OPPO官网也写了该电视支持 4K@60Hz。尝试更换 HDMI 线缆后问题依旧没有解决。

    解决方案

    看起来可能是协商成 HDMI 1.4 了,所以无法设置高分辨率和高刷新率。一番尝试后,在电视设置中找到了相关选项:在 HDMI 信号源显示的时候,按下遥控器菜单键,将信号格式变更为“增强”即可解决问题。修改后,就能使用 3840*2160@60Hz 了。如下图所示。

    信号格式选择“标准”,此时最高仅能选择 3840*2160@30Hz
    信号格式选择“增强”,此时最高可以选择 3840*2160@60Hz

    信号格式默认是“自动”,但我这里不清楚为什么自动模式却不能自动使用 4K@60Hz,需要手动设置为“增强”才可以正常使用。

    附:上面的截图通过 OPPO 电视助手 App 连接电视后截取。

    最后的碎碎念

    其实我本来都不想水这篇文章的,主要还是到处都搜不到详细的用户手册,官网只有制作精良的产品详情彩页和不那么详细的技术参数。客服这个点也下班了,只有机器人在那里回复:“亲,支持4K,支持60Hz的”。自己折腾半天发现那个“自动”并没有那么智能,实在是非常恼火。

    我还发现了什么

    NGA 上面也有一样遭遇的网友,可以自行移步观看。https://ngabbs.com/read.php?tid=33153215


  • Linksys MX4200 子节点手动升级固件

    本文假设两个 Linksys MX4200 组成局域网,主节点 IP 为 192.168.1.1,子节点 IP 为 192.168.1.2。

    问题

    发现组网之后,子节点在 App 或是网页版管理页面均无法升级固件,直接浏览器访问子节点 IP 试图请求管理页面会直接被重定向回主节点的管理页面。

    解决方案

    浏览器先访问主节点的管理页面,登录之后,点按右下角的“CA”进入高级设置,此时将浏览器地址栏中的 URL 的 IP(192.168.1.1)修改为子节点的 IP(192.168.1.2),此时可以正常登录子节点的管理页面。不过这个时候还不会显示本地上传固件升级,点按右下角的“CA”,再次点开连接选项卡即可手动上传固件升级。


  • Git 仓库迁移

    git clone --mirror https://github.com/quarkusio/quarkus.git
    cd ./quarkus.git
    git remote set-url origin https://git.code.tencent.com/foobar/quarkus.git
    git push --mirror origin

    引用

    https://stackoverflow.com/a/26552740
    https://stackoverflow.com/a/58246301


  • Linksys MX4200 无线局域网下 Aqara M1S/P3 配网提示“WiFi 密码错误”

    最近买了个 M1S,配网总是失败,语音提示“WiFi 密码错误”后长亮白灯。想到家里有两个还在正常使用的 P3,于是尝试重置了一个,重新配网的时候也出现了一样的情况。

    联系客服后定位到问题可能与 Linksys MX4200 的 Apple Home 集成功能有关。于是到手机的家庭 App 右上角的家庭设置里,将无线局域网与路由器中的设备移除,然后在 Linksys App 中的左侧栏的 Apple Home 集成功能中,点按断开网状路由器的连接。重启路由器后,再次给 M1S/P3 配网成功。

    本文为个人解决上述情况下网关无法配网的思路分享,并非通用解决方案,仅供参考。


  • 微信小程序保存图片到本地相册

    2022/10/29 更新

    可以利用canvas来绕过下载图片到本地受微信下载白名单的限制

    方案:

    1. canvas 绘制图片
    2. wx.canvasToTempFilePath拿临时路径
    3. wx.saveImageToPhotosAlbum 保存图片

    代码片段:https://developers.weixin.qq.com/s/iKZ2ymm87uDj

    原文章

    小程序使用wx.saveImageToPhotosAlbum保存图片到本地相册,该方法不能直接保存网络路径地址

    如果页面渲染的图片链接是网络地址,可以通过wx.downloadFile获取文件的本地路径 / 临时文件路径后,再调用保存图片方法

    除了保存图片到本地,如果还需要用到图片其他信息,可以使用wx.getImageInfo,该方法是对wx.downloadFile方法的封装,也会返回图片的本地路径,两个方法都需要先在管理后台配置下载白名单


  • Windows 与 Internet 时间服务器同步

    最近发现电脑和 time.windows.com 的时间同步老是失败,有些时候 2FA 都用不了。

    前往控制面板->时钟和区域->设置时间和日期->Internet 时间->更改设置,直接手填 ntp.tencent.com 然后立即更新,确定保存。

    这个 NTP 服务器是这里抄的:云服务器 NTP 服务概述-最佳实践-文档中心-腾讯云

    如果爱改注册表的,可以直接前往 \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers


  • Element Plus自定义命名空间

    使用Vue 3 + Element Plus开发新项目时,因为要引入的公共组件是Vue 2 + Element UI实现的。同一个项目中既有Element UI,又有Element Plus,会造成CSS冲突。

    官方给出的解决方案是给Element Plus修改命名空间,如:原来的都是el-开头,我们可以改成ep-开头。

    • 使用 ElConfigProvider 包装您的根组件
    <!-- App.vue -->
    <template>
      <el-config-provider namespace="ep">
        <!-- ... -->
      </el-config-provider>
    </template>
    
    • 在src目录下创建 styles/element/index.scss
    // styles/element/index.scss
    // we can add this to custom namespace, default is 'el'
    @forward 'element-plus/theme-chalk/src/mixins/config.scss' with (
      $namespace: 'ep'
    );
    // ...
    
    • vite.config.ts 中导入 styles/element/index.scss
    import { defineConfig } from 'vite'
    // https://vitejs.dev/config/
    export default defineConfig({
      // ...
      css: {
        preprocessorOptions: {
          scss: {
            additionalData: `@use "~/styles/element/index.scss" as *;`,
          },
        },
      },
      // ...
    })
    

    完全按照教程在全新的项目中试验会发现虽然类名都变成ep-开头了,但是element 源码中的类依然是el-

    原因:

    1. 官方教程中使用了~别名,如果你在vite / webpack中没有配置~别名,自定义命名空间就不会生效
    2. 如果是全部导入,需要在styles/element/index.scss中引入Element源码
    // we can add this to custom namespace, default is 'el'
    @forward "element-plus/theme-chalk/src/mixins/config.scss" with (
      $namespace: "ep"
    );
    
    @use "element-plus/theme-chalk/src/index.scss" as *;
    注意:如果是按需导入组件,需要使用ElementPlusResolver,具体配置参考官方模版
    
    import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
    
    Components({
          resolvers: [
            ElementPlusResolver({
              importStyle: 'sass',
            }),
          ]
    })
    

  • 在Vue模版中定义临时变量

    使用场景:需要在Vue中多次用到同一个表达式,表达式太长影响代码可读性且不方便放在data中

    可以使用void 表达式,不会影响DOM

    <template>
      <div>
        {{ void (value1 = 1, value2 = 2) }} // 不会渲染额外的 DOM 
      </div>
    </template>
    

    使用:set定义临时变量占位符,不能用在方法中

    <div id="app">
      <div
        v-for="id in users"
        :key="id"
        :set="user = getUser(id)"
      >
        {{ user.name }}: {{ user.age }} years old
      </div>
    </div>
    
    
    const app = new Vue({
      el: '#app',
      data: {
        users: [1, 2, 3, 4],
        usersData: {
          1: {name: 'Mohamed', age: 29},
          2: {name: 'Ahmed', age: 27},
          3: {name: 'Zizo', age: 32},
          4: {name: 'John', age: 13},
        }
      },
      methods: {
        getUser(id) {
          return this.usersData[id];
        },
      },
    });

    举个例子:后台返回表格的数据中有一个字段是数组,要求默认只展示前三个,超过三个支持展开收起。效果如下:

    代码如下:

    <el-table ref="table">
    <el-table-column label="文件名">
        <template slot-scope="scope">
            <div v-if="scope.row.fileLists && scope.row.fileLists.length">
                {{ void (length = scope.row.fileLists.length) }}
                <div
                    :style="
                        scope.row.isOverflow
                            ? { height: '69px', overflow: 'hidden' }
                            : { height: 'auto' }
                    "
                >
                    <p v-for="(item, index) in scope.row.fileLists" :key="item">
                        {{ item }}
                        <span v-if="index === length - 1">({{ length }})</span>
                    </p>
                </div>
                <el-button
                    v-if="length > 3"
                    type="text"
                    @click.prevent="scope.row.isOverflow = !scope.row.isOverflow; $refs.table.doLayout()"
                >
                    {{ scope.row.isOverflow ? '展开全部' : '收起' }}
                </el-button>
            </div>
            <p v-else>暂无文件</p>
        </template>
    </el-table-column>
    </el-table>

    参考链接:https://forum.vuejs.org/t/topic/30395/8,https://stackoverflow.com/questions/43999618/how-to-define-a-temporary-variable-in-vue-js-template


  • Aqara P3 切换连接米家或 Aqara App

    现状

    早些时候(不太记得了,可能 1 年前左右)购买的 Aqara P3 空调伴侣默认连接的是 Aqara App,新买的却是默认连接米家 App。如果启动的时候,没有注意听语音,在错误的 App 上连接了之后会有各种奇怪的问题。Aqara App 上可能会提示错误代码 1。

    解决方案

    回去翻说明书(其实我是先在 M1S 的商品详情页看到的),上有写到:

    所以应该先连续短按 10 次按钮,然后听到语音后的 10 秒内,再连续短按 2 次按钮,即可完成切换。

    已在 Aqara P3,固件版本 3.4.0_0004.0616 上验证通过。

    Aqara M1S 商品详情页 FAQ 关于切换 App 的描述:

    Aqara P3 商品详情页 FAQ 关于短按 10 次和长按 10 秒的区别的描述: