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”,再次点开连接选项卡即可手动上传固件升级。

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 秒的区别的描述:

Lens 安装 kube-state-metrics 超时

使用 Lens 安装 kube-state-metrics 时发现,镜像是从 k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.0.0 拉取的,国内的 TKE 集群拉取会超时。可以直接修改 Deployment 的镜像为:ccr.ccs.tencentyun.com/tkeimages/kube-state-metrics:v2.0.0。

也可以从 k8s-gcrio.azureedge.net/kube-state-metrics/kube-state-metrics:v2.0.0 拉取。

如果只有单节点而且不想修改 Deployment 的话,可以在对应机器上拉取国内镜像,然后使用对应运行时的镜像工具修改镜像 Tag。以 containerd 为例:

crictl pull ccr.ccs.tencentyun.com/tkeimages/kube-state-metrics:v2.0.0
ctr -n k8s.io image tag ccr.ccs.tencentyun.com/tkeimages/kube-state-metrics:v2.0.0 k8s.gcr.io/kube-state-metrics/kube-state-metrics:v2.0.0

修改 Kubernetes 默认 StorageClass

今天部署一个应用的时候卡在新建 PVC,看到报错:

Internal error occurred: 2 default StorageClasses were found

编辑那个现在是默认,但是实际上不需要是默认的 sc,把:

storageclass.kubernetes.io/is-default-class

注解改为 false,或直接删除。

引用

https://kubernetes.io/docs/tasks/administer-cluster/change-default-storage-class/