两个笨笨 - MKirin
type: channel
link: https://mkirin.top/author/2/
description: MKirin
items: E103-W20添加WM8978声卡
items: VSCode VSIX插件离线下载
items: Sqxy宿舍电费微信推送
items: CentOS/RHEL Linux命令笔记
items: VMWare 虚拟机中执行sudo很慢解决
items: Linux下unzip中文解压乱码解决
items: Linux下指定文件编码挂载磁盘
items: 高分屏LXQT桌面环境中的DPI设置
items: 关闭Windows长路径限制
items: Android权限申请

E103-W20添加WM8978声卡
type: item
date: 2025-10-04T13:57:00+00:00
description: E103-W20添加WM8978声卡前言在很久之前我看到MT7628AN有i2s接口,于是买了一块WM8978G模块.但因为某些原因,该功能一直没有实现,在国庆期间闲来无事,进行了一番调试,在此记录.设备环境模组/开发板:E103-W20路由器,具体参考我的工程:E103-W20路由器音频模组:W8978G模组,淘宝极客科技店铺购买系统:OpenWrt 21.02硬件连接WM8978 MT2628 DAT（I2C_SDI/eX_sd） I2C_SDI MCK（I2S_MCLK） I2S_MCLK(refclk) SCK（I2S_SCLK/BCLK） I2S_SCK SDB（I2C_SDO/SD） I2C_SDO FSA（I2S_LRC/WS） I2S_WS SCL（I2C_SCL） I2C_SCL SDA（I2C_SDA） I2C_SDA请注意,MT7628没有I2S_MCLK引脚,这里用的是MT7628的REF_CLKO引脚来代替MCLK.MT7628的REF_CLKO引脚默认功能是12Mhz参考时钟输出.设备树实现// 请在'/'根节点添加以下内容 sound { compatible = "simple-audio-card"; simple-audio-card,name = "WM8978-Sound-Card"; simple-audio-card,format = "i2s"; simple-audio-card,bitclock-master = <&codec_dai>; simple-audio-card,frame-master = <&codec_dai>; simple-audio-card,mclk-fs = <256>; cpu_dai: simple-audio-card,cpu { sound-dai = <&i2s>; }; codec_dai: simple-audio-card,codec { sound-dai = <&wm8978>; }; }; //在根节点外添加或者修改以下内容 &i2c { status = "okay"; clock-frequency = <400000>; wm8978: wm8978@1a { status = "okay"; compatible = "wlf,wm8978"; reg = <0x1a>; #sound-dai-cells = <0>; }; }; &i2s { status = "okay"; #sound-dai-cells = <0>; pinctrl-names = "default"; pinctrl-0 = <&i2s_pins>, <&refclk_pins>; }; 项目编译因为Openwrt没有提供kmod-soc-wm8978之类的包,所以需要我们在内核中配置.使用make kernel_menuconfig打开内核配置请参考以下配置来打开WM8978支持.在这里,我配置的是把WM8978编译成内核模块方便调试,实际可以编译到内核里.Device Drivers -> I2C support -> <*>I2C Support Device Drivers -> <*>Sound Card Support -> <*>Advanced Linux Sound Architecture -> <*> Sound hardware support [*] Enable OSS Emulation [*] MIPS sound devices ---- <*> ALSA for SoC audio support ---> <*> SoC Audio (I2S protocol) for Ralink SoC <*> ASoC Simple sound card support CODEC drivers ---> <M> Wolfson Microelectronics WM8978 codec使用make menuconfig打开Openwrt配置请参考以下配置,kmod-usb-audio用于外接usb声卡,可以选择不编译.Kernel modules -> I2C support -> -*- kmod-i2c-core <*> kmod-i2c-mt7628 Kernel modules -> Sound Support -> -*- kmod-sound-core -*- kmod-ac97 <*> kmod-sound-mt7620 -*- kmod-sound-soc-core <*> kmod-usb-audio Sound -> <*> alsa-utils使用make -j32来编译整个系统.编译完成…

VSCode VSIX插件离线下载
type: item
date: 2025-07-18T09:26:06+00:00
description: VSCode VSIX插件离线下载前言在树莓派上安装code-server，新版本的C/C++插件提示不受支持。找了很多文章才实现离线下载旧版本插件，故此记录。注意此方法只适用于单个插件下载，对于插件包并不适用。如果无法下载插件，可以尝试到插件的GitHub项目中寻找发行版。链接格式已知VSIX下载链接格式如下：https://marketplace.visualstudio.com/_apis/public/gallery/publishers/{发布者}/vsextensions/{插件名}/{版本号}/vspackage https://marketplace.visualstudio.com/_apis/public/gallery/publishers/{发布者}/vsextensions/{插件名}?targetPlatform={platform} https://marketplace.visualstudio.com/_apis/public/gallery/publishers/{发布者}/vsextensions/{插件名}/{版本号}/vspackage?targetPlatform={platform}发布者与插件名More Info Version 1.26.3 Released on 2016/3/30 09:27:12 Last updated 2025/6/26 03:02:16 Publisher Microsoft Unique Identifier ms-vscode.cpptools # 发布者.插件名 Report Report a concern找到插件主页右下角的More Info栏，定位到Unique Identifier其中，发布者与插件名依据.分隔Platform分类目前有以下平台win32-x64: Windows 64-bitwin32-ia32: Windows 32-bitwin32-arm64: Windows ARM64darwin-x64: macOS Inteldarwin-arm64: macOS Apple Siliconlinux-x64: Linux 64-bitlinux-arm64: Linux ARM64alpine-x64: Alpine Linux版本号一般而言，看插件主页的Version History即可，上古版本建议去github看看。示例：C/C++插件发布者：ms-vscode插件名：cpptools版本：1.26.3平台：win32-x64https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode/vsextensions/cpptools/1.26.3/vspackage https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode/vsextensions/cpptools?targetPlatform=win32-x64 https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-vscode/vsextensions/cpptools/1.26.3/vspackage?targetPlatform=win32-x64

Sqxy宿舍电费微信推送
type: item
date: 2025-07-14T09:08:00+00:00
description: Sqxy宿舍电费微信推送前言宿舍电费只能使用支付宝完美校园小程序查询，还要忍受一堆广告。因此这里也是直接抓包，获得了电费查询的url。通过curl请求、crontab再配合微信测试号实现定时推送。软件工具curl这里只要安装了curl即可。使用方法获取微信测试号 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login获取微信AppID、AppSecert创建推送模板，获取Template_ID调用access_token接口获取Token调用电费接口获取剩余电费调用测试号推送接口推送电费数据将脚本放入Openwrt，使用Crontab定时推送模板微信测试号消息创建模板今天是：{{date.DATA}} 您的宿舍号是：{{roomno.DATA}} 当前剩余电费：{{electricities.DATA}}微信测试号消息推送json模板{ "touser": "被推送的用户id，用户关注测试号后获取", "template_id": "你的template_id,消息模板创建成功后获取", "url": "http://weixin.qq.com/download", "data": { "date": { "value": "2025年7月3日" }, "roomno": { "value": "30#2001" }, "electricities": { "value": "12.23度" } } }完美校园电费请求参数json模板{ "timestamp": "2025-03-02 17:48:02", "method": "samllProgramGetRoomState", "bizcontent": "{\"payproid\":953,\"schoolcode\":\"1402\",\"roomverify\":\"2-11--2-6005\",\"businesstype\":2}", "sourceId": 1 }完美校园电费返回值json模板{ "businessData": { "description": "剩余电量", "quantity": "97.55", "quantityunit": "度" }, "returncode": "SUCCESS", "returnmsg": "获取成功", "subCode": null, "subMsg": null }测试结果附件shell脚本源码#!/bin/bash ### configs # appID APPID='你的APPID' # appsecret APPSECRET='你的APPSECRET' # template_id TEMPLATE_ID='你的TEMPLATE_ID' # access_token TOKEN="" # followers FOLLOWERS=( '用户token1' # 用户1 '用户token2' # 用户2 ) ### headers # user-agent USER_AGENT="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35" # accept ACCEPT="accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" # content type CONTENT_TYPE="Content-Type: application/json" ### ### date # date formated # current date CUR_DATE=$(date '+%Y年%m月%d日') # Room No. ROOMNO='你的宿舍号' # electricities ELECTRICITIES="" # json data JSON_DATA="" # template url TEMPLATE_URL="http://weixin.qq.com/download" ### ### urls # get token GET_TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token" GET_TOKEN_URL_PARAM="grant_type=client_…

CentOS/RHEL Linux命令笔记
type: item
date: 2025-07-09T02:23:00+00:00
description: [TOC]CentOS/RHEL命令学习笔记Linux命令软件包与软件源软件的安装方式yum 软件包管理器底层是rpm自动解决依赖问题安装完成会自动清理软件包文缓存安装分为远程安装和本地安装本地yum源 file://本地yum源路径远程yum源 http://xxx ftp://xxx用法：yum [参数] 包名 参数介绍： 常用指令参数组合： yum install 软件名 # 安装软件包 yum repolist # 查询yum源信息 yum install epel-release # 增加拓展源 yum clean all # 清除缓存 # 若替换了yum源 系统默认的缓存内容不会变化, # 找不到新替换的yum源,此时会报错 需要及时清理缓存 yum makecache # 加载缓存 ls -al /etc/yum.repos.d/ # 查看可使用的yum源 yum provides 命令 # 查看命令属于哪个软件,即使本地不存在的软件指令,yum也可以寻找 yum list # 查看系统已经安装好的软件和没有安装的软件(源里存在即可查找到) yum -y reinstall 软件名 # 重装 yum remove 软件名 # 卸载 yum erase 软件名 # 清除软件配置文件 示例： 1. yum安装mysql yum install mysqlrpm 软件包管理器，较少使用无法自动解决依赖关系，需要手动解决适用于依赖较少或已知依赖关系的情况rpm软件包名称： 软件名称 版本号(主版本 次版本 修订号) 操作系统 ---- 90%的命名规律用法：rpm [参数] 包名 - 资源路径可以是本地路径，也可以是网络链接 1. 查找rpm包 2. wget 网络资源路径 - wget需要手动安装 3. 使用 rpm -ivh xxx.rpm 从本地安装 4. 使用 rpm -ivh url链接 从网络安装（与上面的步骤二选一） 参数介绍： -i 安装 -v 显示安装信息 -h 显示安装进度 -U 安装时检测安装包版本是否最新，如不是则先升级再安装 -a 查看所有已安装的软件包 -q 查询所有已安装的软件包 -l 显示软件包的文件列表 -e 卸载指定的软件包 -f 软件包中的文件 常用指令参数组合： -ivh 安装指定软件包并显示进度 -qa 查询所有已安装的软件包 -qi 查询软件包的安装信息 示例： 5. 查询指定软件包 rpm -qa | grep 包名 6. 显示软件包的安装文件 rpm -ql 包名 7. 查询某个文件属于哪个软件包 rpm -qf 软件安装路径 # 只能查看已安装好的软件包 rpm软件包查找网站： - rpm find https://www.rpmfind.net/ - pkgs.org https://pkgs.org/源码安装一个软件想要在linux中运行,必须是二进制文件。 因此当我们拿到软件源码以后,需要将它编译(翻译)为二进制文件,才能在linux中运行。 源码包在编译时需要使用Linux系统的编译器. 通常源码包都是用C语言开发的[这是因为C语言是Linux最标准的程序语言,效率高]。 Linux中C语言编译器叫做 gcc. 利用gcc 可以把C语言变成可执行的二进制文件 源码安装的优点 - 编译安装的过程,可以设定参数[例如 安装路径 日志路径....], - 按照需求增加功能,并且可以指定安装的版本,灵活性比较大。 获取源码包 - 研发部自研 - 官方网站,获取软件包CentOS7换源/etc/yum.repos.d 源的存放位置http://mirrors.aliyun.com/repo/Centos-7.repo Ali Mirrorhttps://mirrors.163.com/.help/CentOS7-Base-163.repo wangyi Mirror备份源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup下载Ali Mirror源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo更新镜像源 yum clean all # 清理缓存 yum makecache # 重新建立缓存防火墙防火墙 防范一些网络攻击。有软件防火墙、硬件防火墙之分区域区域策略trusted 信任区允许所有数据包home 家庭区拒绝流入的流量，除非与流出的流量相关。允许ssh mdns ippclient amba-client dhcpv6-client服务通过…

VMWare 虚拟机中执行sudo很慢解决
type: item
date: 2025-06-10T06:34:00+00:00
description: 首先获取hostname：hostname然后编辑/etc/hosts文件，加入以下内容：127.0.0.1 localhost 你的hostname

Linux下unzip中文解压乱码解决
type: item
date: 2025-06-10T06:31:32+00:00
description: 如果zip文件是GB2312编码的，在Linux下直接unzip 文件.zip就会解压出乱码文件。可以加上神秘的-O选项指定编码解压。示例：unzip -O GB2312 ./office字体.zip

Linux下指定文件编码挂载磁盘
type: item
date: 2025-06-10T06:27:00+00:00
description: mount命令挂载磁盘的时候加上-o iocharset=编码选项即可。示例：mount /dev/sdb /mnt/usb -o iocharset=utf8

高分屏LXQT桌面环境中的DPI设置
type: item
date: 2025-06-10T06:21:23+00:00
description: LXQt配置中心 => 会话配置 => 环境添加变量名如下QT_AUTO_SCREEN_SCALE_FACTOR=2 XCURSOR_SIZE=24

关闭Windows长路径限制
type: item
date: 2025-05-22T07:06:00+00:00
description: 有些时候，如项目进行编译的时候，会受到Windows长路径的限制，进而产生编译失败。可以进入Windows系统策略设置，更改“启用 Win32 长路径（Enable Win32 long paths）”状态，这样就可以不限最长路径（MAX_PATH）限制。启用方法： win + r 打开运行，键入gpedit.msc，找到计算机配置->管理模板->系统->文件系统->启用win32长路径,双击，把选项改为已开启即可。

Android权限申请
type: item
date: 2025-05-22T07:02:00+00:00
description: Android权限申请权限详细的权限文档请参考：Android 权限文档权限的申请方式1. 动态申请动态申请需要在代码中调用ActivityCompat.requestPermissions方法，该方法有三个参数：Context上下文，要申请的权限，请求码申请SD卡写权限示例：ActivityCompat.requestPermissions(MainActivity.this, new String[] {"android.permission.WRITE_EXTERNAL_STORAGE"}, 1);2. 静态申请在AndroidManifest.xml的<manifest>标签中使用<uses-permission>标签来实现静态获取权限。需要注意的是，在Android6.0以后，Android修改了权限申请机制，其将权限分为了正常权限和危险权限两大类。申请危险权限时不仅要在AndroidManifest.xml中静态申请权限，还要在代码里动态申请权限。2.1 正常权限：不会直接给用户带来隐私风险的权限，如请求网络的权限。2.2 危险权限：涉及用户隐私的权限。申请该权限的应用程序，可能涉及用户隐私信息的数据或资源，也可能对用户存储的数据或其他应用程序的操作产生影响。危险权限一共有九组：位置（LOCATION）日历（CALENDAR）照相机（CAMERA）联系人（CONTACTS）存储卡（STORAGE）传感器（SENSORS）麦克风（MICROPHONE）电话（PHONE）短信（SMS）静态权限申请示例：<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mkirin.musicplayer"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> </manifest>