2025-06-23 16:03:26
我是一个不记录笔记,就无法正常工作的人 😓。
之前也尝试了各种记录的方案。例如:
每个方式,都坚持过一段时间。但是,我发现自从有了 github copilot pro 之后,笔记记录在项目中是最方便的。 基于无限使用的 gpt 4.1 模型,github copilot 可以实时理解我的需求,并且辅助我编写文档和笔记。 甚至可以节省我去 Google 搜索的时间。
同时,我发现记录在项目中也有更多的优势:
一天只搞一个项目。这样笔记就能更集中,思路更清晰。晚上回家也可以继续这个项目。
先这样试用一段时间,看看效果如何。
唯一不方便的是,如果 git 项目只有我一个人参与还好,如果多人的项目,在里面记录一些不沾边的笔记,就非常尴尬了 🥲
2025-06-23 15:20:21
在 VSCode 中使用 VIM 插件写代码时,经常会因为当前在中文输入法下,导致各种奇怪的现象。 例如,
非常之不爽,我一度想放弃 VIM 插件,甚至干脆不用中文 🥲,但是,这不现实,因为好多界面需要中文描述。
在 VIM 插件退出 Insert 模式时,自动切换回英文输入法。
VSCode VIIM 插件的官方文档里,恰好有相关的配置。参考:
https://github.com/VSCodeVim/Vim#input-method
Input Method: Disable input method when exiting Insert Mode.
im-select
,需要安装这个命令行工具。"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}"
注意,github 上 im-select 的下载地址在这里,项目 readme 里的链接 404。
https://github.com/daipeihust/im-select/issues/72
在 Windows 下,输入法的 ID 是一个数字。可以通过以下命令获取当前输入法的 ID:
> im-select.exe
1033
> im-select.exe
2052
图形化的配置界面,看不太懂。不如直接修改配置文件,更简单直观。
ctrl + shift + p 打开命令面板,输入 settings.json
,选择 User Settings,开配置文件。
实际就是一个 json 文件。
User Settings 跟 Workspace Settings 的区别是前者是全局配置,后者是当前工作区的配置。
会发现,只要按下 ESC 键退出 Insert 模式,输入法就会自动切换回英文输入法。 非常完美。
但是,目前还是有一些小瑕疵
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 原生能力不太行,也许说明这个方向还有一点技术门槛,竞争没那么激烈吧。。。
恰好在 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 吧。
2025-06-12 13:18:13
这两天在用 golang 开发一个论坛的后端接口,遇到了一个 XSS 攻击的场景。 发帖时,前端传递过来的 Content 是 html,经测试发现,如果不对 html 内容进行清理,会导致 XSS 攻击。😰 即,帖子内容中包含了恶意的 js 代码,攻击者可以通过这个 js 代码来窃取用户的 cookie 或者执行其他恶意操作。
XSS(Cross-Site Scripting)攻击是一种常见的网络安全漏洞,攻击者通过在网页中注入恶意脚本代码,使得这些代码在其他用户的浏览器中执行,从而窃取用户信息、劫持会话等。 XSS 攻击通常发生在用户输入未经过滤或清理的情况下,攻击者可以通过输入框、评论区等地方注入恶意代码。例如,提交的评论内容是这样的:
老师,我发现视频没有声音,想修改一下 <p>正常文本</p>
<script>alert(\"XSS攻击\")</script>
<a href=\"javascript:alert('XSS')\">点击</a>
在 Golang 中,可以使用 bluemonday 这个库来清理 HTML 内容,防止 XSS 攻击。Github 地址:
https://github.com/microcosm-cc/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>"
}
发现视频没有声音,想修改一下 <p>正常文本</p><script>alert("XSS攻击")</script><a href="javascript:alert('XSS')">点击</a>
这个直接在前端渲染,点击按钮后,会执行 alert 那段 js 代码。
发现视频没有声音,想修改一下 <p>正常文本</p>点击
会看到恶意代码已被自动过滤。
bluemonday.UGCPolicy() 适合大多数富文本场景,能过滤绝大多数 XSS 攻击。👍
2025-06-10 16:12:09
昨天接到大象计算器的热心用户 Avery 🐻 老板(金融巨鳄🐊)的反馈,希望增加一个日均达标计算的功能。因为他心爱的一个小程序“日均达标测算”再也无法打开了。估计是没有续费,或者备案,被强制下架了吧。
银行有吸收存款的业务考核指标。比如要求是年日均达标 50 万,我输入现在的余额和现在的年日均,然后我要 6.30 号那天达标 50 万,今天此时此刻还要进多少钱放着不动,放到 6.30 号能达标 50 万。
由于计算器类的功能界面都差不多,我快速实现了一个版本,功能界面如下:
微信中搜索🔍大象计算器,在首页找到 日均达标计算功能。
使用网页版本的日均达标计算器
好奇,你们银行内部没有这种工具吗?巨鳄说,内部有类似工具,但是不够灵活😮💨。还得是大象跳舞🐘,秀一秀灵活地身体啊。其实我主要是想试试 gpt 4.1 的免费编码效果如何。实际效果还可以。
2025-06-09 13:53:40
我使用☁️七牛云存储了一堆 pdf 文件,我想批量下载其中的一部分,打包成一个压缩包。 最好是不需要通过我的服务器中转,能在七牛云上直接完成。
纠结了一下,发现还是 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
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 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 文件再次上传到七牛云。