MoreRSS

site iconSunZhongWei | 孙仲维 修改

博客名「大象笔记」,全干程序员一名,曾在金山,DNSPod,腾讯云,常驻烟台。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

SunZhongWei | 孙仲维 的 RSS 预览

有了 github copilot pro,在 VSCode 中记录笔记更高效了

2025-06-23 16:03:26

我是一个不记录笔记,就无法正常工作的人 😓。

之前也尝试了各种记录的方案。例如:

  • 手机便签
  • 独立的 markdown git 项目,专门用来记录笔记
  • 在博客网站上记录
  • 使用 obsidian 等笔记软件

每个方式,都坚持过一段时间。但是,我发现自从有了 github copilot pro 之后,笔记记录在项目中是最方便的。 基于无限使用的 gpt 4.1 模型,github copilot 可以实时理解我的需求,并且辅助我编写文档和笔记。 甚至可以节省我去 Google 搜索的时间。

同时,我发现记录在项目中也有更多的优势:

  1. 编辑方便不用切换程序。写代码和写文档,都在 VSCode 中完成,也不用切换到其他应用程序。
  2. 方便 AI 理解需求。因为 AI 可以直接读取项目中的代码和文档,理解上下文。复制需求到 copilot chat 窗口,也非常方便。
  3. 实时利用 github copilot 来辅助文档编写。水起内容来,拦不住的感觉。

内容太杂也不是问题

一天只搞一个项目。这样笔记就能更集中,思路更清晰。晚上回家也可以继续这个项目。

先这样试用一段时间,看看效果如何。

唯一不方便的是,如果 git 项目只有我一个人参与还好,如果多人的项目,在里面记录一些不沾边的笔记,就非常尴尬了 🥲

VSCode VIM 插件的中文输入法自动切换

2025-06-23 15:20:21

在 VSCode 中使用 VIM 插件写代码时,经常会因为当前在中文输入法下,导致各种奇怪的现象。 例如,

  • 切换到 Normal 模式后,按字母键,会出现中文输入法的提示框。
  • Normal 模式下,想按下 i 键进入 Insert 模式,结果是在中文输入法下,即输入了奇怪的东西。

非常之不爽,我一度想放弃 VIM 插件,甚至干脆不用中文 🥲,但是,这不现实,因为好多界面需要中文描述。

解决思路

在 VIM 插件退出 Insert 模式时,自动切换回英文输入法。

VSCode VIIM 插件的官方文档里,恰好有相关的配置。参考:

https://github.com/VSCodeVim/Vim#input-method

Input Method: Disable input method when exiting Insert Mode.

配置项

  • vim.autoSwitchInputMethod.enable:是否启用自动切换输入法功能。默认值为 true。
  • vim.autoSwitchInputMethod.defaultIM:默认的输入法,注意这里 Mac 和 Windows 的配置不一样。
  • vim.autoSwitchInputMethod.obtainIMCmd: 获取当前输入法的命令的路径。例如 im-select,需要安装这个命令行工具。
  • vim.autoSwitchInputMethod.switchIMCmd: 切换输入法的命令。需要加上 {im} 占位符,表示目标输入法。

Windows 配置示例

"vim.autoSwitchInputMethod.enable": true,
"vim.autoSwitchInputMethod.defaultIM": "1033",
"vim.autoSwitchInputMethod.obtainIMCmd": "D:\\apps\\im-select.exe",
"vim.autoSwitchInputMethod.switchIMCmd": "D:\\apps\\im-select.exe {im}"

im-select.exe 的下载地址

注意,github 上 im-select 的下载地址在这里,项目 readme 里的链接 404。

https://github.com/daipeihust/im-select/issues/72

Windows 下输入法的 ID

在 Windows 下,输入法的 ID 是一个数字。可以通过以下命令获取当前输入法的 ID:

> im-select.exe
1033

> im-select.exe
2052
  • 1033 是英文输入法。即英文键盘输入法
  • 2052 是中文输入法。即切换到中文输入法,例如,微信输入法。注意,如果在中文输入法下,即便是切换为英文输入,仍然是中文输入法,也是返回 2052。

如何修改配置文件

图形化的配置界面,看不太懂。不如直接修改配置文件,更简单直观。

ctrl + shift + p 打开命令面板,输入 settings.json,选择 User Settings,开配置文件。 实际就是一个 json 文件。

User Settings 跟 Workspace Settings 的区别是前者是全局配置,后者是当前工作区的配置。

修改后的效果

会发现,只要按下 ESC 键退出 Insert 模式,输入法就会自动切换回英文输入法。 非常完美。

但是,目前还是有一些小瑕疵

  • 切换速度还是慢,不敢操作快了
  • 如果是切换到英文键盘,再去其他应用里输入中文,还需要切换中英文键盘。我才知道切换中英文输入法的快捷键早已不是 ctrl + space, 而是 win + space。我 out 了
  • 不知道为何每次输入中文标点符号时,都会自动输入两个相同的标点符号 😅

Android App 原生 Kotlin 开发提示词模板

2025-06-17 10:00:55

我发现 claude 3.7 AI 在生成 Android APP 项目代码时,完全不参考当前项目的开发语言。 例如,项目是 kotlin 的项目,AI 默认生成的代码居然是 Java ...

看来,必须在提示词上多下点功夫,避免绕弯路。

提示词模板

## 技术栈
-  编程语言:Kotlin / Java
-  UI 框架:XML Layouts (Views) / Jetpack Compose
-  核心库/组件: (列出关键依赖,例如:ViewModel, LiveData/StateFlow, Room, Retrofit, Hilt/Dagger, Navigation Component, WorkManager, Coil/Glide 等)

对于我来说,使用下面的足够

## 技术栈
-  编程语言:Kotlin
-  UI 框架:XML Layouts (Views)

我甚至找到了一个在线售卖 Android Dev 提示词模板的网站,这细分领域也是没谁了。

最后

github copilot 里的 claude 3.7 写 Android 原生 kotlin,确实不太行。界面设计难看,bug 一堆,逻辑也不通。完全不如写网页的效果。也不知道是不是我的提示词问题。

昨天在 Android Studio 试了试豆包家的 Trae 插件,写出来的 toast 让人哭笑不得。直接一个

showToast(''xxx")

我只想说,are you ok?

可能提示词上,或者项目结构上还是得优化一下。

转念一想,也未必是坏事,如果 AI 写 Android 原生能力不太行,也许说明这个方向还有一点技术门槛,竞争没那么激烈吧。。。

最好的 Android 开发模型

恰好在 reddit 上看到一个帖子讨论

Claude 4 Sonnet is the best model for Android dev (per Kotlin-bench)

https://www.reddit.com/r/androiddev/comments/1kttvd4/claude_4_sonnet_is_the_best_model_for_android_dev/

issue 解决成功率,claude 4 比 3.7 搞了 10 个百分点。

不过,下面的评论也很扎心。

感觉问题的根源,还是网上 android 原生开发的代码太少了,我很多时候根据 Google Android 官方文档的教程,都找不到相关的示例代码,新的组件对应的资料极少,用的人都不多。导致 AI 的训练数据就少的可怜。那训练出来的模型能靠谱么?😮‍💨

早上有人推荐我用 React Native 代替 Android Kotlin 开发,也是个办法。。。但是,我嫌 RN 的包体积太大了,不环保。我也没有 iOS 多端支持的需求,况且我想搞搞桌面组件的开发,先用着 Kotlin 吧。

Golang 后端防御 XSS 攻击:用 bluemonday 让富文本发帖更安全

2025-06-12 13:18:13

这两天在用 golang 开发一个论坛的后端接口,遇到了一个 XSS 攻击的场景。 发帖时,前端传递过来的 Content 是 html,经测试发现,如果不对 html 内容进行清理,会导致 XSS 攻击。😰 即,帖子内容中包含了恶意的 js 代码,攻击者可以通过这个 js 代码来窃取用户的 cookie 或者执行其他恶意操作。

什么是 XSS 攻击?

XSS(Cross-Site Scripting)攻击是一种常见的网络安全漏洞,攻击者通过在网页中注入恶意脚本代码,使得这些代码在其他用户的浏览器中执行,从而窃取用户信息、劫持会话等。 XSS 攻击通常发生在用户输入未经过滤或清理的情况下,攻击者可以通过输入框、评论区等地方注入恶意代码。例如,提交的评论内容是这样的:

老师,我发现视频没有声音,想修改一下 <p>正常文本</p>
<script>alert(\"XSS攻击\")</script>
<a href=\"javascript:alert('XSS')\">点击</a>

如何防御 XSS 攻击?

在 Golang 中,可以使用 bluemonday 这个库来清理 HTML 内容,防止 XSS 攻击。Github 地址:

https://github.com/microcosm-cc/bluemonday

bluemonday 简介

bluemonday is a HTML sanitizer implemented in Go. It is fast and highly configurable.

bluemonday 是一个 HTML 清理器,使用 Go 语言实现。它可以快速且高度可配置地清理 HTML 内容。

bluemonday takes untrusted user generated content as an input, and will return HTML that has been sanitised against an allowlist of approved HTML elements and attributes so that you can safely include the content in your web page.

bluemonday 会将不受信任的用户输入(可能包含 js 代码, 引发 XSS 攻击),返回经过允许的 HTML 元素和属性清理的 HTML,以便您可以安全地将内容包含在网页中。

依赖安装

go get github.com/microcosm-cc/bluemonday

使用示例

package main

import (
	"fmt"

	"github.com/microcosm-cc/bluemonday"
)

func main() {
	// Do this once for each unique policy, and use the policy for the life of the program
	// Policy creation/editing is not safe to use in multiple goroutines
	p := bluemonday.UGCPolicy()

	// 这个策略可以用来清理大量输入,并且可以在多个 goroutine 中安全使用
	html := p.Sanitize(
		`<a onblur="alert(secret)" href="http://www.google.com">Google</a>`,
	)

	// 输出:
	// <a href="http://www.google.com" rel="nofollow">Google</a>
	fmt.Println(html)
}

使用论坛发帖数据做测试:

提交内容

{
  "title": "老师,截止日期之后还能修改视频么?",
  "content": "发现视频没有声音,想修改一下 <p>正常文本</p><script>alert(\"XSS攻击\")</script><a href=\"javascript:alert('XSS')\">点击</a>"
}

未使用 bluemonday 的结果

发现视频没有声音,想修改一下 <p>正常文本</p><script>alert("XSS攻击")</script><a href="javascript:alert('XSS')">点击</a>

这个直接在前端渲染,点击按钮后,会执行 alert 那段 js 代码。

使用 bluemonday 的结果

发现视频没有声音,想修改一下 <p>正常文本</p>点击

会看到恶意代码已被自动过滤。

总结

bluemonday.UGCPolicy() 适合大多数富文本场景,能过滤绝大多数 XSS 攻击。👍

日均达标计算器,金融巨鳄必备微信小程序

2025-06-10 16:12:09

昨天接到大象计算器的热心用户 Avery 🐻 老板(金融巨鳄🐊)的反馈,希望增加一个日均达标计算的功能。因为他心爱的一个小程序“日均达标测算”再也无法打开了。估计是没有续费,或者备案,被强制下架了吧。

⚡️ 需求概要

银行有吸收存款的业务考核指标。比如要求是年日均达标 50 万,我输入现在的余额和现在的年日均,然后我要 6.30 号那天达标 50 万,今天此时此刻还要进多少钱放着不动,放到 6.30 号能达标 50 万。

📱 实际界面效果

由于计算器类的功能界面都差不多,我快速实现了一个版本,功能界面如下:

日均达标计算微信小程序功能界面

🧮 四种体验方式

  1. 长按识别或者扫码下方微信小程序码

日均达标计算微信小程序

  1. 微信中搜索🔍大象计算器,在首页找到 日均达标计算功能。

  2. 使用网页版本的日均达标计算器

更详细的功能说明

  1. 比如现在时点 5 万,年日均 48 万,6.30 号达标年日均 50 万的话,今天 6.9 号他还得进多少资金然后不动,放到 6.30 号能达标。
  2. 也不单单是 6.30 号达标年日均,比如我要他 6.20 号就达标年日均 50 万,此时此刻他要进多少资金能在 6.20 号那天达标。

好奇,你们银行内部没有这种工具吗?巨鳄说,内部有类似工具,但是不够灵活😮‍💨。还得是大象跳舞🐘,秀一秀灵活地身体啊。其实我主要是想试试 gpt 4.1 的免费编码效果如何。实际效果还可以。

七牛云存储使用 qshell 批量下载文件并打压缩包的方案

2025-06-09 13:53:40

我使用☁️七牛云存储了一堆 pdf 文件,我想批量下载其中的一部分,打包成一个压缩包。 最好是不需要通过我的服务器中转,能在七牛云上直接完成。

qshell 还是 pfop mkzip

  • 通过七牛云官方命令行工具 qshell 实现本地批量下载+自动压缩,全程无需服务器中转。类似在 linux 终端里使用 wget 或者 curl 命令一样
  • 使用七牛云 mkzip 异步处理接口,直接在云端打包,生成压缩包后下载。但是官方的 mkzip 文档太简陋了,我没有找到怎么对文件改名的操作。而且,如果一个文件变更,整个压缩包都需要重新打包。这样成本太高。所以,我还是选择 qshell 来下载文件。

纠结了一下,发现还是 qshell 更适合我的需求。因为我需要下载的文件数量较多,而且需要对文件进行重命名的操作。 虽然,不能直接在云端打包,但是可以通过 qshell 下载到本地后,再进行打包操作。这样可以更灵活地处理文件名和目录结构, 以及后续的删除文件操作。

qshell 安装

因为公司的电脑安装了加密软件,下载到本地的 pdf 文件会被加密,导致无法直接打开。所以,我选择的 WSL 1 来下载 pdf 文件。所以,需要在 WSL 1 中安装 qshell。

下载地址:

https://developer.qiniu.com/kodo/1302/qshell

因为我 WSL 中安装的是 Ubuntu Server,所以下载 Linux amd64 的版本。

如果下载 Linux X86 版本,执行会报错:

cannot execute binary file: Exec format error

确认 qshell 安装完成:

$ qshell -v
qshell version v2.16.0

qshell 设置账号信息

account 命令用来设置当前用户的 AccessKey 和 SecretKey ,这对 Key 主要用在其他的需要授权的命令中,比如 stat , delete , listbucket2 命令中。 该命令设置的信息,经过加密保存在 HOME 目录下的 .qshell/account.json 文件中。

设置方法参考:

https://github.com/qiniu/qshell/blob/master/docs/account.md

qshell account [--overwrite | -w] <Your AccessKey> <Your SecretKey> <Your Account Name>

设置完成后,可以通过以下命令查看账号信息:

qshell account

qshell 下载指定文件

命令格式:

qshell get <Bucket> <Key> [-o <OutFile>]

参考:

https://github.com/qiniu/qshell/blob/master/docs/get.md

例如执行:

$ qshell get my_bucket_name dir1/dir2/hello.pdf

需要注意的是,如果不指定 o 参数,则本地的保存目录结构会和七牛云上的目录结构一致。

即,会在当前目录下创建 dir1/dir2 目录,并将 hello.pdf 保存到 dir2 目录下。

对于需要打包压缩的场景,我需要把所有目标文件都放到一个目录下,然后再打包压缩。 所以,还是指定 o 参数,将文件下载到当前目录下。

批量下载

我想通过 golang 遍历数据库中存储的 pdf 文件 key,生成 qshell 命令列表,然后执行这些命令。

特殊符号转义

文件名中可能包含特殊符号,例如括号、空格等,这些符号在命令行中可能会导致:

  • 语法错误 (括号导致)
  • 找不到文件 (空格导致)

syntax error near unexpected token `('

这本质上是 linux shell 的转义问题,可以使用单引号完全禁用所有特殊字符。 单引号内部内容会按字面意义解析,无转义、无变量替换。例如:

$ qshell get my_bucket_name 'dir1/dir2/hello work(1).pdf' -o 'hello world.pdf'

唯一的问题是,需要防止原始文件名中包含单引号。好在还没有遇到。

执行

将导出的 qshell 命令列表保存到一个脚本文件中,然后执行:

$ chmod +x download.sh
$ ./download.sh

统计文件数量

> ls | wc -l
1024

打包

zip -r my_archive.zip my_folder/

再次上传七牛云

为了方便客户下载,我将打包好的 zip 文件再次上传到七牛云。