上海移动有 1 元抽百 G 活动,在 app 上搜索 1 元百 g
上海移动客户均可办理( wap 套餐客户除外)
[活动时间]
即日起至 2025 年 12 月 31 日。
[活动规则]
活动期间客户可参与百 G 礼包抽奖,有机会抽得以下奖品:
1 、1 元百 G 礼包:当月订购,当月生效。原价 10 元含 1GB 国内通用流量(不含港澳台地区),现 12 个月内优惠至 1 元/月且每月加赠 99GB 上海地区通用流量、即每月 1 元含 100GB 流量。
2 、5 元百 G 礼包:当月订购,当月生效。原价 10 元含 1GB 国内通用流量(不含港澳台地区),现 12 个月内优惠至 5 元/月且每月加赠 99GB 上海地区通用流量、即每月 5 元含 100GB 流量。
3 、10 元百 G 礼包:当月订购,当月生效。原价 10 元含 1GB 国内通用流量(不含港澳台地区),现 12 个月内每月加赠 99GB 上海地区通用流量、即每月 10 元含 100GB 流量。
4 、20 元百 G 礼包:当月订购,当月生效。原价 20 元含 3GB 国内通用流量(不含港澳台地区),现 12 个月内每月加赠 97GB 上海地区通用流量、即每月 20 元含 100GB 流量。
5 、4 元百 G 礼包:一次性收费 4 元,次月自动失效。礼包共计包含 100GB 流量,其中 1GB 为国内通用流量(不含港澳台地区),99GB 为上海地区通用流量。
[重要提醒]
1 、抽得的礼包若未立即办理,当月可在“我的礼包=已抽取礼包”找到和办理。若未找到则抽得的礼包已逾期失效,需重新抽取。
2 、1 元、5 元、10 元百 G 礼包默认开通 10 元 1GB 流量可选包,20 元百 G 礼包默认开通 20 元 3GB 流量可选包,均在相应流量可选包基础上享受月费优惠和流量加赠。
3 、所含流量资源均不可共享、不可结转。流量使用优先级高于可结转的套内流量。上海地区通用流量仅限在上海市内手机上网抵扣使用,使用外省(市)网络则抵扣国内通用流量或按基础套餐资费收取,具体以话单为准。
4 、对于已办理全国大流量-高速流量的用户,若套内高速流量使用完毕则遵循合约流量模组的流量封顶规则、降速规则。
5 、高速流量客户在高速流量用尽限速后,可订购自动提速包取消限速,然后继续使用本活动流量。
6 、百 G 礼包仅可办理一次,已经参与过百 G 礼包活动用户将不能重复办理。
[默认开通的流量可选包规则]
1 、合约期 12 个月,到期当月有到期提醒短信并可退订,下月生效;合约期间,客户如因销户、携号转网等需提前解除协议,应先退订。
2 、若合约期内转出合约流量包,需前往营业厅办理办理提前解约,需支付的违约金=流量可选包月费×50%×已享受优惠的月数。
3 、合约到期月,您可变更档次或退订;若未在到期当月退订,则次月默认延续,合约期仍为 12 个月;以此类推,后续每 12 个月均按上述规则自动展期。
上海移动客户均可办理( wap 套餐客户除外)
[活动时间]
即日起至 2025 年 12 月 31 日。
[活动规则]
活动期间客户可参与百 G 礼包抽奖,有机会抽得以下奖品:
1 、1 元百 G 礼包:当月订购,当月生效。原价 10 元含 1GB 国内通用流量(不含港澳台地区),现 12 个月内优惠至 1 元/月且每月加赠 99GB 上海地区通用流量、即每月 1 元含 100GB 流量。
2 、5 元百 G 礼包:当月订购,当月生效。原价 10 元含 1GB 国内通用流量(不含港澳台地区),现 12 个月内优惠至 5 元/月且每月加赠 99GB 上海地区通用流量、即每月 5 元含 100GB 流量。
3 、10 元百 G 礼包:当月订购,当月生效。原价 10 元含 1GB 国内通用流量(不含港澳台地区),现 12 个月内每月加赠 99GB 上海地区通用流量、即每月 10 元含 100GB 流量。
4 、20 元百 G 礼包:当月订购,当月生效。原价 20 元含 3GB 国内通用流量(不含港澳台地区),现 12 个月内每月加赠 97GB 上海地区通用流量、即每月 20 元含 100GB 流量。
5 、4 元百 G 礼包:一次性收费 4 元,次月自动失效。礼包共计包含 100GB 流量,其中 1GB 为国内通用流量(不含港澳台地区),99GB 为上海地区通用流量。
[重要提醒]
1 、抽得的礼包若未立即办理,当月可在“我的礼包=已抽取礼包”找到和办理。若未找到则抽得的礼包已逾期失效,需重新抽取。
2 、1 元、5 元、10 元百 G 礼包默认开通 10 元 1GB 流量可选包,20 元百 G 礼包默认开通 20 元 3GB 流量可选包,均在相应流量可选包基础上享受月费优惠和流量加赠。
3 、所含流量资源均不可共享、不可结转。流量使用优先级高于可结转的套内流量。上海地区通用流量仅限在上海市内手机上网抵扣使用,使用外省(市)网络则抵扣国内通用流量或按基础套餐资费收取,具体以话单为准。
4 、对于已办理全国大流量-高速流量的用户,若套内高速流量使用完毕则遵循合约流量模组的流量封顶规则、降速规则。
5 、高速流量客户在高速流量用尽限速后,可订购自动提速包取消限速,然后继续使用本活动流量。
6 、百 G 礼包仅可办理一次,已经参与过百 G 礼包活动用户将不能重复办理。
[默认开通的流量可选包规则]
1 、合约期 12 个月,到期当月有到期提醒短信并可退订,下月生效;合约期间,客户如因销户、携号转网等需提前解除协议,应先退订。
2 、若合约期内转出合约流量包,需前往营业厅办理办理提前解约,需支付的违约金=流量可选包月费×50%×已享受优惠的月数。
3 、合约到期月,您可变更档次或退订;若未在到期当月退订,则次月默认延续,合约期仍为 12 个月;以此类推,后续每 12 个月均按上述规则自动展期。
招聘 Flutter 开发
base:长沙 25-35k
核心职责
基于 Flutter 框架设计并开发高质量的跨平台( iOS/Android/Web )应用程序。
优化应用性能,解决复杂的技术问题(如渲染效率、内存管理、多端适配等)。
与产品、UI/UX 、后端团队协作,确保技术方案与业务需求高度匹配。
主导技术方案评审,推动代码规范、测试覆盖率和工程化最佳实践。
探索 Flutter 前沿技术(如 Impeller 、FFI 、Isolate 等),提升团队技术竞争力。
任职要求
必备条件:
5 年以上移动端开发经验,3 年以上 Flutter 商业项目经验,至少主导过 2 个以上完整 Flutter 项目上线。
精通 Dart 语言,深入理解 Flutter 框架原理( Widget 树、渲染管线、状态管理等)。
熟悉 Native ( Android/iOS )开发,能独立处理平台相关功能(如原生插件开发、性能调优)。
熟练使用 Riverpod/Bloc 等状态管理工具,掌握 GetX 、FlutterBoost 等常用库的深度优化。
具备复杂动画、自定义绘制、多线程编程等实战经验。
熟悉 CI/CD 流程(如 Fastlane 、Codemagic ),有自动化测试( Unit/Widget/Integration )经验
加分项:
有 Web 或桌面端( Flutter Desktop )开发经验。
参与过开源 Flutter 项目,或技术社区贡献者。
熟悉后端技术( Node.js/Go 等),具备全栈能力。
团队与文化
技术驱动:鼓励技术创新,提供硅谷级技术栈和硬件支持。
base:长沙 25-35k
核心职责
基于 Flutter 框架设计并开发高质量的跨平台( iOS/Android/Web )应用程序。
优化应用性能,解决复杂的技术问题(如渲染效率、内存管理、多端适配等)。
与产品、UI/UX 、后端团队协作,确保技术方案与业务需求高度匹配。
主导技术方案评审,推动代码规范、测试覆盖率和工程化最佳实践。
探索 Flutter 前沿技术(如 Impeller 、FFI 、Isolate 等),提升团队技术竞争力。
任职要求
必备条件:
5 年以上移动端开发经验,3 年以上 Flutter 商业项目经验,至少主导过 2 个以上完整 Flutter 项目上线。
精通 Dart 语言,深入理解 Flutter 框架原理( Widget 树、渲染管线、状态管理等)。
熟悉 Native ( Android/iOS )开发,能独立处理平台相关功能(如原生插件开发、性能调优)。
熟练使用 Riverpod/Bloc 等状态管理工具,掌握 GetX 、FlutterBoost 等常用库的深度优化。
具备复杂动画、自定义绘制、多线程编程等实战经验。
熟悉 CI/CD 流程(如 Fastlane 、Codemagic ),有自动化测试( Unit/Widget/Integration )经验
加分项:
有 Web 或桌面端( Flutter Desktop )开发经验。
参与过开源 Flutter 项目,或技术社区贡献者。
熟悉后端技术( Node.js/Go 等),具备全栈能力。
团队与文化
技术驱动:鼓励技术创新,提供硅谷级技术栈和硬件支持。
最近自建一个 nas 装了飞牛,使用域名解析 ipv6, 只能局域可以访问, 外网访问不了,怎么回事,折腾半天不行,求教。
  
  
我用 AI 做了两个 Wordpress 插件 —— 好物/应用分享页
作为小白,一直很羡慕各位大佬制作的好物分享页面。之前我也有尝试使用 Wordpress 的古腾堡编辑器手搓好物页和应用分享页,但添加新的内容会变得十分麻烦,以至于我几乎没有更新过页面。于是,完全不懂 PHP 的我用 AI 制作了两个简单的 Wordpress 插件,实现了好物和应用分享页面的搭建,并且操作非常简单,适合小白用户。
## 效果展示

https://veryjack.com/goods

https://veryjack.com/apps
## 项目地址
[好物分享页 Wordpress 插件]( https://github.com/very-jack/wp_goods_exhibition)
[应用分享页 Wordpress 插件]( https://github.com/very-jack/wp_apps_exhibition)
## 使用方法
两个插件的使用方法相似,均是先在 github releases 页面下载 zip 文件,在 Wordpress 中安装插件,最后在后台页面添加信息即可,以好物分享页为例,具体步骤如下:
1. [下载插件]( https://github.com/very-jack/wp_goods_exhibition/releases);
2. 在 Wordpress 后台 - `插件` - `添加插件` - 选择下载的 zip 文件进行安装;
3. 在 Wordpress 后台 - `好物页面` 选项 - `添加新产品` - 填入`产品名称`、`产品描述`、`跳转链接(可不填)`、`产品图片`即可;
4. 创建一个页面或者新的文章,在文中输入段代码即可调用该分享页面。
```
[goods_exhibition_page]
```
## 注意事项
如果需要调整颜色等样式,需要自行下载插件后解压,修改 `.css` 文件。
作为小白,一直很羡慕各位大佬制作的好物分享页面。之前我也有尝试使用 Wordpress 的古腾堡编辑器手搓好物页和应用分享页,但添加新的内容会变得十分麻烦,以至于我几乎没有更新过页面。于是,完全不懂 PHP 的我用 AI 制作了两个简单的 Wordpress 插件,实现了好物和应用分享页面的搭建,并且操作非常简单,适合小白用户。
## 效果展示

https://veryjack.com/goods

https://veryjack.com/apps
## 项目地址
[好物分享页 Wordpress 插件]( https://github.com/very-jack/wp_goods_exhibition)
[应用分享页 Wordpress 插件]( https://github.com/very-jack/wp_apps_exhibition)
## 使用方法
两个插件的使用方法相似,均是先在 github releases 页面下载 zip 文件,在 Wordpress 中安装插件,最后在后台页面添加信息即可,以好物分享页为例,具体步骤如下:
1. [下载插件]( https://github.com/very-jack/wp_goods_exhibition/releases);
2. 在 Wordpress 后台 - `插件` - `添加插件` - 选择下载的 zip 文件进行安装;
3. 在 Wordpress 后台 - `好物页面` 选项 - `添加新产品` - 填入`产品名称`、`产品描述`、`跳转链接(可不填)`、`产品图片`即可;
4. 创建一个页面或者新的文章,在文中输入段代码即可调用该分享页面。
```
[goods_exhibition_page]
```
## 注意事项
如果需要调整颜色等样式,需要自行下载插件后解压,修改 `.css` 文件。
多进制数的乘法时间复杂度 O(n)?
举个🌰,比如 7-5-3 进制数,可以表示 0-104 ,105 个整数
7-5-3 进制数跟 10 进制数的转换
0-0-0 表示 0
1-1-1 表示 1
2-2-2 表示 2
3-3-0 表示 3
4-4-1 表示 4
5-0-2 表示 5
以此类推
6-4-2 表示 104
10 进制数转换为 7-5-3 进制数很容易,求余即可。反过来,7-5-3 进制数转换为十进制数可用中国剩余定理算 a-b-c to (a*15 + b*21 + c*70) mod 105.
显而易见,7-5-3 进制数的加法:
a-b-c + x-y-z = (a+x)-(b+y)-(c+z),只需要对每位计算一次,完全不需要考虑进位。当然这个并不是大问题,计算机算加法也是可以同时并行计算每一位,并不是手算那种需要考虑进位的依赖。
有意思的是乘法:
a-b-c * x-y-z = (a*x) mod 7-(b*y) mod 5-(c*z) mod 3
n 位的乘法只需要 O(n),而非小学学的 O(n^2),也比基于 FFT 的 O(n*log n* log log n)快
其中最大的优点是可并行计算,只要计算单元够多,O(1)就能计算出乘法结果而没有进位的依赖.
举个🌰,比如 7-5-3 进制数,可以表示 0-104 ,105 个整数
7-5-3 进制数跟 10 进制数的转换
0-0-0 表示 0
1-1-1 表示 1
2-2-2 表示 2
3-3-0 表示 3
4-4-1 表示 4
5-0-2 表示 5
以此类推
6-4-2 表示 104
10 进制数转换为 7-5-3 进制数很容易,求余即可。反过来,7-5-3 进制数转换为十进制数可用中国剩余定理算 a-b-c to (a*15 + b*21 + c*70) mod 105.
显而易见,7-5-3 进制数的加法:
a-b-c + x-y-z = (a+x)-(b+y)-(c+z),只需要对每位计算一次,完全不需要考虑进位。当然这个并不是大问题,计算机算加法也是可以同时并行计算每一位,并不是手算那种需要考虑进位的依赖。
有意思的是乘法:
a-b-c * x-y-z = (a*x) mod 7-(b*y) mod 5-(c*z) mod 3
n 位的乘法只需要 O(n),而非小学学的 O(n^2),也比基于 FFT 的 O(n*log n* log log n)快
其中最大的优点是可并行计算,只要计算单元够多,O(1)就能计算出乘法结果而没有进位的依赖.
斗地主记牌器的开发
## 起源
周末经常和同事一起玩 JJ 斗地主,每局输赢不大,主要以娱乐为主。由于经常输,所以萌生了开发一款记牌器来偷偷提升斗地主水平的想法。
我的本职工作是 Java 后端开发,没有接触过安卓开发,再加上最近 AI 编程的火热,让我萌生了使用 Cursor 开发一款安卓应用的想法。
## 思路
主要思路:如果能够每隔 1 秒截取到当前手机屏幕的内容,然后识别出截图中的所有牌张的点数及花色,那么用 54 张牌直接减去对应的牌张及花色即可得到剩余的牌张。
***实现的困难点在于,不仅要识别牌的点数,还需要识别牌的花色。***
因为如果只是单纯的识别牌的点数而不考虑花色,那么会产生 Bug 。
例如:先出黑桃 2 ,再出红桃 2 ,等了 3 秒后再出其它牌。由于出牌时间不是固定的,在这期间每隔 1 秒识别截图会重复识别多次牌张 2 ,导致剩余牌张数不准确。
如果同时识别牌的点数及花色,则不会出现重复多次扣减同样牌张的问题。
## UI 设计
记牌器 UI 的主体借鉴了 JJ 斗地主自身的记牌器。
应用主界面如下:

由于是自己使用,所以界面做得比较简单,主界面只有一个 [开启记牌器] 按钮。点击后该按钮会变成 [结束记牌器] 。
点击 [开启记牌器] 按钮,会弹出系统屏幕录制权限,可以只录制单个应用,也可以全局录制整个屏幕。如下所示:

点击 [开始] 按钮,会在当前页面显示记牌器悬浮窗,如下所示:

整个悬浮窗由三部分组成:
+ 左侧: [隐] 按钮点击可以控制悬浮窗的显示和隐藏。点击后变为 [显] 按钮。
+ 中间:记牌器的主体分为上下两排,下面是 3 到大王的剩余牌张数,如果有炸弹,文字会显示为红色。
+ 右侧: [开始] 按钮点击后可以开始新一局的录制,同时按钮会变为 [结束] 按钮。
点击右侧 [开始] 按钮后,开始一局的录制,同时按钮会变为 [结束] 按钮。

整个悬浮窗可以全局灵活的自由拖动:

悬浮窗还可以显示和隐藏:

记牌器显示在桌面的效果如下:

记牌器在 JJ 斗地主游戏界面显示如下:

## UI 开发
期间一共开发了三个版本:
+ 第一个版本由 Cursor 的 Agent 模式开发,使用 Claude 3.7 Sonnet 模型。由于个人知识的局限性,对于安卓全局悬浮窗和屏幕录制权限完全不了解。当提出的问题本身可能都不完全正确的情况下,让 AI 去实现相应的功能以及修改 Bug 的时候,AI 往往会陷入死循环,结果就是 Cursor 消耗了 200 左右的对话次数都无法修改正确一个在我个人看来非常简单的问题。令人失望的是,最后并没有达到想要的效果,以失败告终。
+ 第二次尝试使用免费的 Trae 来开发同样的 UI 部分,同样使用 Claude 3.7 Sonnet 模型。有了第一次的经验,使用 Trae 开发的前期比较顺畅,但是当对话次数多了之后需要排队,由于等待时间较长,严重影响写代码的体验,最终还是放弃了。
+ 前面两次 AI 生成的 UI 代码也不是完全没有用处。有了前面两次的经验,还是让我学习到了不少安卓 UI 开发的相关知识。最后还是通过搜索相关实现例子,手写大部分 UI 代码再加上 AI 的辅助,最终才搞定 UI 的部分。
## 图像识别
记牌器的技术难点在于图像识别。
前期通过调研,得知 OpenCV 可以实现图像识别,并且网上可以搜索到相应的代码示例,再加上 OpenCV 有对应的 Java 包,所以优先选择了 OpenCV 来开发图像识别功能。
通过 ChatGPT 以及 DeepSeek 的辅助,花费了不少时间开发出了第一版的 OpenCV 识别算法。
核心思路大致是:
+ 通过手动截取出 54 张牌的左上角的数字以及花色区域,得到 54 张截图模板。
+ 对模版和待识别的截图进行各种预处理(转为灰度图、高斯模糊、二值化等)。
+ 最后使用 OpenCV 的模板匹配,将 54 张模板和待识别的截图依次做相似度匹配,取匹配相似度最高的结果,并且丢掉低于设定阈值的匹配结果。
测试过程中发现 OpenCV 的识别效果不太理想,容易出现识别错误以及漏识别的问题。
`对于记牌器应用来说,是不能容忍任何的漏记以及错误识别的,必须想办法提高识别的精度。`
## 深度学习
OpenCV 的模版匹配方案还有另外 2 个致命的问题:
+ 不同手机的分辨率可能不一样,势必会影响识别的准确度。
+ 无法适配其它斗地主游戏。
既然 OpenCV 存在致命的缺陷,所以不得不推倒重来。
又是新的一轮咨询 ChatGPT 以及 DeepSeek ,得到了可以通过基于深度学习框架 YOLO 来提高图像识别的准确度。
大致看了一下官网文档,看上去比较容易上手。
整体大致流程:
+ 先手动截取一些包含所有 54 种牌张的截图
+ 使用 `LabelImg` 对截图进行类别的标注
+ 将截图按照 `8:2` 的比例分为训练集和验证集
+ 使用 YOLO 进行训练
+ 最后导出训练的最佳模型
有了 AI 的详细指导,整个过程基本上都比较顺畅。使用 Google 免费的 Colab 很快就训练出了第一版模型。然而最终验证的识别效果还是不太理想,还是存在漏记和错记的情况。
最后得知原因在于训练的数据集太小(手动截图并标注了几十张训练图)。想要识别效果比较理想,一般的 YOLO 训练集的大小规模在几千到上万张左右。
由于手动一张张截取手机屏幕并标注,消耗的时间实在是太长了。为了解决训练集不足的问题,最后不得不写了一个程序,根据截图模版随机生成了一万张图片以及对应的 YOLO 标注文件用于训练。
当训练集规模到了一万张的时候,预计模型训练花费的时间会达到几个小时,Google 免费的 Colab 有运行时间的限制条件,无法再满足训练的需求,不得不考虑租用 GPU 服务器。
综合对比之下,最后采用了阿里云的 GPU 服务器。配置为 16G 显存的 V100 显卡。非常幸运的是,新用户前 100 个小时有很大的优惠折扣,折合 2 块/小时左右,实在是太划算了。
在阿里云上总共的训练时长不到 3 个小时。最后,识别精度意外的好,每张牌都能到达 0.98-0.99 的准确度,实际体验下来没有遇到过错记或漏记的情况。
## 整合
将训练好的图像识别模型与 UI 整合起来有两种方式:
+ 通过 Python 调用训练好的模型并部署 API 接口供安卓 UI 调用。
+ 将模型转换为适用于移动端的模型格式,安卓自身通过代码直接调用模型进行图像识别。
方案 1 的缺点就是需要额外的服务器进行部署,且依赖网络传输截图数据。
方案 2 我个人没有尝试过,但看 ChatGPT 给出来的代码示例,感觉也许应该是可行的吧。有空会尝试一下方案 2 ,不清楚移动设备的识别效率会怎样。
由于难易程度的关系,我采用了方案 1 。通过 ChatGPT 给出的 Python 调用模型进行识别的方式,很容易就对外暴露了一个识别 API 接口供安卓 UI 调用。
最后在家里的 M4 Mac Mini 上部署之后,达到了非常完美的识别效果。
## 思考和总结
经常在网上看到一些所谓的`完全不懂编程,我竟然 4 小时靠 AI 复刻出月入$600k 的 APP 的同款`的营销文章和视频。说实话,我个人是非常反感这类文章和视频的。
从我个人的亲身体验来看,现阶段的 AI 还只能用于辅助开发。AI 的知识储备确实非常丰富,能够带领你尝试你从未涉及的领域。但是,往往由于个人本身所掌握的知识的局限性,遇到特定的问题的时候,依靠 AI 往往很难解决。
另一个方面,AI 很容易犯错。我记得让 ChatGPT 给出使用 SpringBoot 实现直接调用训练好的 YOLO 模型的时候,AI 很快给出了一段看上去像模像样的 Java 代码并贴心的给出了 Maven 依赖包。当你按照 AI 的指导写好所有代码的时候,你会惊奇的发现,Maven 包实际上并不存在,完全是 AI 瞎编造出来的,包括那些像模像样的实现代码也是一样。当你质问 AI 给出的 Maven 依赖包为何不存在的时候,只会得到 一句抱歉。
然而即使现阶段的 AI 在使用上还有着各种各样的缺陷,我对未来的 AI 编程还是抱有期望的。对比几年前,AI 的提升无疑是巨大的。这些改进和提升在往后的几十年中还会不断的上演,甚至呈现指数级的增长,直到实现普通人都能够轻松使用的真正的 AI 。
## 起源
周末经常和同事一起玩 JJ 斗地主,每局输赢不大,主要以娱乐为主。由于经常输,所以萌生了开发一款记牌器来偷偷提升斗地主水平的想法。
我的本职工作是 Java 后端开发,没有接触过安卓开发,再加上最近 AI 编程的火热,让我萌生了使用 Cursor 开发一款安卓应用的想法。
## 思路
主要思路:如果能够每隔 1 秒截取到当前手机屏幕的内容,然后识别出截图中的所有牌张的点数及花色,那么用 54 张牌直接减去对应的牌张及花色即可得到剩余的牌张。
***实现的困难点在于,不仅要识别牌的点数,还需要识别牌的花色。***
因为如果只是单纯的识别牌的点数而不考虑花色,那么会产生 Bug 。
例如:先出黑桃 2 ,再出红桃 2 ,等了 3 秒后再出其它牌。由于出牌时间不是固定的,在这期间每隔 1 秒识别截图会重复识别多次牌张 2 ,导致剩余牌张数不准确。
如果同时识别牌的点数及花色,则不会出现重复多次扣减同样牌张的问题。
## UI 设计
记牌器 UI 的主体借鉴了 JJ 斗地主自身的记牌器。
应用主界面如下:

由于是自己使用,所以界面做得比较简单,主界面只有一个 [开启记牌器] 按钮。点击后该按钮会变成 [结束记牌器] 。
点击 [开启记牌器] 按钮,会弹出系统屏幕录制权限,可以只录制单个应用,也可以全局录制整个屏幕。如下所示:

点击 [开始] 按钮,会在当前页面显示记牌器悬浮窗,如下所示:

整个悬浮窗由三部分组成:
+ 左侧: [隐] 按钮点击可以控制悬浮窗的显示和隐藏。点击后变为 [显] 按钮。
+ 中间:记牌器的主体分为上下两排,下面是 3 到大王的剩余牌张数,如果有炸弹,文字会显示为红色。
+ 右侧: [开始] 按钮点击后可以开始新一局的录制,同时按钮会变为 [结束] 按钮。
点击右侧 [开始] 按钮后,开始一局的录制,同时按钮会变为 [结束] 按钮。

整个悬浮窗可以全局灵活的自由拖动:

悬浮窗还可以显示和隐藏:

记牌器显示在桌面的效果如下:

记牌器在 JJ 斗地主游戏界面显示如下:

## UI 开发
期间一共开发了三个版本:
+ 第一个版本由 Cursor 的 Agent 模式开发,使用 Claude 3.7 Sonnet 模型。由于个人知识的局限性,对于安卓全局悬浮窗和屏幕录制权限完全不了解。当提出的问题本身可能都不完全正确的情况下,让 AI 去实现相应的功能以及修改 Bug 的时候,AI 往往会陷入死循环,结果就是 Cursor 消耗了 200 左右的对话次数都无法修改正确一个在我个人看来非常简单的问题。令人失望的是,最后并没有达到想要的效果,以失败告终。
+ 第二次尝试使用免费的 Trae 来开发同样的 UI 部分,同样使用 Claude 3.7 Sonnet 模型。有了第一次的经验,使用 Trae 开发的前期比较顺畅,但是当对话次数多了之后需要排队,由于等待时间较长,严重影响写代码的体验,最终还是放弃了。
+ 前面两次 AI 生成的 UI 代码也不是完全没有用处。有了前面两次的经验,还是让我学习到了不少安卓 UI 开发的相关知识。最后还是通过搜索相关实现例子,手写大部分 UI 代码再加上 AI 的辅助,最终才搞定 UI 的部分。
## 图像识别
记牌器的技术难点在于图像识别。
前期通过调研,得知 OpenCV 可以实现图像识别,并且网上可以搜索到相应的代码示例,再加上 OpenCV 有对应的 Java 包,所以优先选择了 OpenCV 来开发图像识别功能。
通过 ChatGPT 以及 DeepSeek 的辅助,花费了不少时间开发出了第一版的 OpenCV 识别算法。
核心思路大致是:
+ 通过手动截取出 54 张牌的左上角的数字以及花色区域,得到 54 张截图模板。
+ 对模版和待识别的截图进行各种预处理(转为灰度图、高斯模糊、二值化等)。
+ 最后使用 OpenCV 的模板匹配,将 54 张模板和待识别的截图依次做相似度匹配,取匹配相似度最高的结果,并且丢掉低于设定阈值的匹配结果。
测试过程中发现 OpenCV 的识别效果不太理想,容易出现识别错误以及漏识别的问题。
`对于记牌器应用来说,是不能容忍任何的漏记以及错误识别的,必须想办法提高识别的精度。`
## 深度学习
OpenCV 的模版匹配方案还有另外 2 个致命的问题:
+ 不同手机的分辨率可能不一样,势必会影响识别的准确度。
+ 无法适配其它斗地主游戏。
既然 OpenCV 存在致命的缺陷,所以不得不推倒重来。
又是新的一轮咨询 ChatGPT 以及 DeepSeek ,得到了可以通过基于深度学习框架 YOLO 来提高图像识别的准确度。
大致看了一下官网文档,看上去比较容易上手。
整体大致流程:
+ 先手动截取一些包含所有 54 种牌张的截图
+ 使用 `LabelImg` 对截图进行类别的标注
+ 将截图按照 `8:2` 的比例分为训练集和验证集
+ 使用 YOLO 进行训练
+ 最后导出训练的最佳模型
有了 AI 的详细指导,整个过程基本上都比较顺畅。使用 Google 免费的 Colab 很快就训练出了第一版模型。然而最终验证的识别效果还是不太理想,还是存在漏记和错记的情况。
最后得知原因在于训练的数据集太小(手动截图并标注了几十张训练图)。想要识别效果比较理想,一般的 YOLO 训练集的大小规模在几千到上万张左右。
由于手动一张张截取手机屏幕并标注,消耗的时间实在是太长了。为了解决训练集不足的问题,最后不得不写了一个程序,根据截图模版随机生成了一万张图片以及对应的 YOLO 标注文件用于训练。
当训练集规模到了一万张的时候,预计模型训练花费的时间会达到几个小时,Google 免费的 Colab 有运行时间的限制条件,无法再满足训练的需求,不得不考虑租用 GPU 服务器。
综合对比之下,最后采用了阿里云的 GPU 服务器。配置为 16G 显存的 V100 显卡。非常幸运的是,新用户前 100 个小时有很大的优惠折扣,折合 2 块/小时左右,实在是太划算了。
在阿里云上总共的训练时长不到 3 个小时。最后,识别精度意外的好,每张牌都能到达 0.98-0.99 的准确度,实际体验下来没有遇到过错记或漏记的情况。
## 整合
将训练好的图像识别模型与 UI 整合起来有两种方式:
+ 通过 Python 调用训练好的模型并部署 API 接口供安卓 UI 调用。
+ 将模型转换为适用于移动端的模型格式,安卓自身通过代码直接调用模型进行图像识别。
方案 1 的缺点就是需要额外的服务器进行部署,且依赖网络传输截图数据。
方案 2 我个人没有尝试过,但看 ChatGPT 给出来的代码示例,感觉也许应该是可行的吧。有空会尝试一下方案 2 ,不清楚移动设备的识别效率会怎样。
由于难易程度的关系,我采用了方案 1 。通过 ChatGPT 给出的 Python 调用模型进行识别的方式,很容易就对外暴露了一个识别 API 接口供安卓 UI 调用。
最后在家里的 M4 Mac Mini 上部署之后,达到了非常完美的识别效果。
## 思考和总结
经常在网上看到一些所谓的`完全不懂编程,我竟然 4 小时靠 AI 复刻出月入$600k 的 APP 的同款`的营销文章和视频。说实话,我个人是非常反感这类文章和视频的。
从我个人的亲身体验来看,现阶段的 AI 还只能用于辅助开发。AI 的知识储备确实非常丰富,能够带领你尝试你从未涉及的领域。但是,往往由于个人本身所掌握的知识的局限性,遇到特定的问题的时候,依靠 AI 往往很难解决。
另一个方面,AI 很容易犯错。我记得让 ChatGPT 给出使用 SpringBoot 实现直接调用训练好的 YOLO 模型的时候,AI 很快给出了一段看上去像模像样的 Java 代码并贴心的给出了 Maven 依赖包。当你按照 AI 的指导写好所有代码的时候,你会惊奇的发现,Maven 包实际上并不存在,完全是 AI 瞎编造出来的,包括那些像模像样的实现代码也是一样。当你质问 AI 给出的 Maven 依赖包为何不存在的时候,只会得到 一句抱歉。
然而即使现阶段的 AI 在使用上还有着各种各样的缺陷,我对未来的 AI 编程还是抱有期望的。对比几年前,AI 的提升无疑是巨大的。这些改进和提升在往后的几十年中还会不断的上演,甚至呈现指数级的增长,直到实现普通人都能够轻松使用的真正的 AI 。
做了一个开发者友好的 API 中转站,支持 GPT/Grok/Gemini 等大模型 API
大家好,我是一名开发者,最近做了一个 API 中转站 [zzzzapi.com]( https://zzzzapi.com),主要是为了解决在开发过程中使用各种 AI 大模型 API 的痛点,希望能对同样有这方面需求的开发者有所帮助。
## 我为什么要做这个项目
在开发中遇到这些问题:
- OpenAI API 在国内访问不稳定
- Gemini AI API 和 Grok API 接入需要处理各种认证和请求格式
- 多个项目需要使用不同的 AI 模型,API 调用方式不统一
- API 密钥管理和费用控制困难
## zzzzapi.com 提供的解决方案
1. **统一的 API 中转**:同时支持 ChatGPT API 、Gemini AI API 和 Grok API ,通过统一的接口访问
2. **提高访问稳定性**:解决了 OpenAI API 在某些地区访问不稳定的问题
3. **便捷的密钥管理**:集中管理各平台的 API 密钥
4. **使用额度控制**:精确控制和监控 API 调用量和费用
5. **请求日志和分析**:提供详细的 API 调用记录和分析报表
## 技术细节
所有的 API 请求都经过加密处理,确保数据安全。
## 目前支持的 API
- OpenAI API (GPT-4.5/GPT-4/GPT-4o)
- Google Gemini AI API
- Anthropic Claude API
- xAI Grok API
- [克劳德,以及各种 API]
## 使用反馈
目前已有一些开发者在使用,反馈都很不错
## 邀请体验
欢迎大家访问 [zzzzapi.com]( https://zzzzapi.com) 体验,如有任何问题或建议,可以在评论区留言或直接联系我。
大家好,我是一名开发者,最近做了一个 API 中转站 [zzzzapi.com]( https://zzzzapi.com),主要是为了解决在开发过程中使用各种 AI 大模型 API 的痛点,希望能对同样有这方面需求的开发者有所帮助。
## 我为什么要做这个项目
在开发中遇到这些问题:
- OpenAI API 在国内访问不稳定
- Gemini AI API 和 Grok API 接入需要处理各种认证和请求格式
- 多个项目需要使用不同的 AI 模型,API 调用方式不统一
- API 密钥管理和费用控制困难
## zzzzapi.com 提供的解决方案
1. **统一的 API 中转**:同时支持 ChatGPT API 、Gemini AI API 和 Grok API ,通过统一的接口访问
2. **提高访问稳定性**:解决了 OpenAI API 在某些地区访问不稳定的问题
3. **便捷的密钥管理**:集中管理各平台的 API 密钥
4. **使用额度控制**:精确控制和监控 API 调用量和费用
5. **请求日志和分析**:提供详细的 API 调用记录和分析报表
## 技术细节
所有的 API 请求都经过加密处理,确保数据安全。
## 目前支持的 API
- OpenAI API (GPT-4.5/GPT-4/GPT-4o)
- Google Gemini AI API
- Anthropic Claude API
- xAI Grok API
- [克劳德,以及各种 API]
## 使用反馈
目前已有一些开发者在使用,反馈都很不错
## 邀请体验
欢迎大家访问 [zzzzapi.com]( https://zzzzapi.com) 体验,如有任何问题或建议,可以在评论区留言或直接联系我。
小米相册 .globalTrash 相关问题
手上有一台 REDME K60 ,系统 MIUI14.0.25 。操作删除带图的文件夹时候,发现图不会删除,而是先移动到 DCIM/.globalTrash 下。后来了解到,这个文件夹似乎就是小米的相册回收站的储存的地方。并且这个功能似乎无法关闭
这样每次删除手机本地里的文件夹时,如果文件夹里的图过多,大量的文件都会被剪切到.globalTrash 下。小米相册 app 肉眼可见的卡死
1. 想了解一下,小米手机有没有相关解法,能够一次性删除图片
2. 其他安卓手机有类似的行为吗,比如换 oppo 或者 vivo 系的手机可以一次直接删除图片吗
手上有一台 REDME K60 ,系统 MIUI14.0.25 。操作删除带图的文件夹时候,发现图不会删除,而是先移动到 DCIM/.globalTrash 下。后来了解到,这个文件夹似乎就是小米的相册回收站的储存的地方。并且这个功能似乎无法关闭
这样每次删除手机本地里的文件夹时,如果文件夹里的图过多,大量的文件都会被剪切到.globalTrash 下。小米相册 app 肉眼可见的卡死
1. 想了解一下,小米手机有没有相关解法,能够一次性删除图片
2. 其他安卓手机有类似的行为吗,比如换 oppo 或者 vivo 系的手机可以一次直接删除图片吗
如何与犟种的父母相处?
农村人,父母年纪都上来了,身体自我初中开始就一直不好,家里最常见的东西就是药瓶,每次在外地接电话都胆战心惊,以至于我每隔几天主动打电话回家,杜绝他们主动电话找我这样我才安心。永远忘不了大学有一年放假回家,我爸杵着拐杖站在村口等我回家,原来长时间生病无法出门挣钱,导致精神出了问题,连沟通能力都快失去了,刷牙的时候刷着刷着去喝刷牙的水,过马路不看车站在路中间发呆,加上腰的问题走路都困难,每次回想那个场景,都觉得是上天给我开的一个大玩笑,可能会成为我这辈子抹不掉的梦魇。回家当天饭还没吃就带着我爸出门看病,后来好转了很多,但是因为犟种的脾气身体一直无法彻底好转(爱喝酒抽烟,每餐必喝酒),兜兜转转,今年他都 60 了。
时间回到现在,明知道腰不行非要逞能去茶山摘茶叶,两天的时候发作,忍着到第四天,疼得在床上直哭,带他去治疗好不容易好了不少,没几天又被邻居喊去打麻将,昨天坐了一下午,今天又开始唉声叹气,下午邻居又来喊他,忍着从床上爬起来又去了,怎么说都没用,实在是想不明白,怎么会有这种脑回路,到底图什么呢?问他为什么去,他就说没办法,我寻思这不过就是凑个局,身体不行为什么要去?这一年多我都看在眼里,因为腰不行,我和我妈也不让他干活,每天吃完饭就出去打牌,这还要怎么样?
我妈是个苦命的女人,我因为工作一直不顺没赚到什么钱,最近还生病(现在好的差不多,马上出门上班),我爸和她自己一直都是病痛不断,但是不知道从哪年开始她感觉到我爸是指望不上的,变得格外的坚强,我是很敬佩她的,我和我妈说不要一直去茶山,因为最近茶价下来了没必要再去拼了,她也没听,我对于我妈来说,不是气她犟脾气,就是心疼她不要命,说到底是我没给她安全感,她没什么办法只能靠自己拼命。
因为家里一直生病的原因,我这 20 多年一直没有安全感,哪怕工作了我一直担心父母的身体,担心他们又会怎么样了,劝他们吧根本也劝不动,不劝的话随他门折腾又觉得自己狠心,别人都说老人比小孩难照顾我现在慢慢是有体会了,父母的观念已经形成,又是父母的身份,根本听不进去你的话,哪怕掰开了揉碎了说都没用。
稀里糊涂说了好多,不知道论坛里的朋友们有没有什么建议,我知道这种情况有一部分原因是家里经济条件不行,这是我接下来要解决的问题,其他方面我是真没有什么头绪。放假期间聊这种问题,看到的朋友们如果打扰了你们假期休息,先道一声抱歉。
农村人,父母年纪都上来了,身体自我初中开始就一直不好,家里最常见的东西就是药瓶,每次在外地接电话都胆战心惊,以至于我每隔几天主动打电话回家,杜绝他们主动电话找我这样我才安心。永远忘不了大学有一年放假回家,我爸杵着拐杖站在村口等我回家,原来长时间生病无法出门挣钱,导致精神出了问题,连沟通能力都快失去了,刷牙的时候刷着刷着去喝刷牙的水,过马路不看车站在路中间发呆,加上腰的问题走路都困难,每次回想那个场景,都觉得是上天给我开的一个大玩笑,可能会成为我这辈子抹不掉的梦魇。回家当天饭还没吃就带着我爸出门看病,后来好转了很多,但是因为犟种的脾气身体一直无法彻底好转(爱喝酒抽烟,每餐必喝酒),兜兜转转,今年他都 60 了。
时间回到现在,明知道腰不行非要逞能去茶山摘茶叶,两天的时候发作,忍着到第四天,疼得在床上直哭,带他去治疗好不容易好了不少,没几天又被邻居喊去打麻将,昨天坐了一下午,今天又开始唉声叹气,下午邻居又来喊他,忍着从床上爬起来又去了,怎么说都没用,实在是想不明白,怎么会有这种脑回路,到底图什么呢?问他为什么去,他就说没办法,我寻思这不过就是凑个局,身体不行为什么要去?这一年多我都看在眼里,因为腰不行,我和我妈也不让他干活,每天吃完饭就出去打牌,这还要怎么样?
我妈是个苦命的女人,我因为工作一直不顺没赚到什么钱,最近还生病(现在好的差不多,马上出门上班),我爸和她自己一直都是病痛不断,但是不知道从哪年开始她感觉到我爸是指望不上的,变得格外的坚强,我是很敬佩她的,我和我妈说不要一直去茶山,因为最近茶价下来了没必要再去拼了,她也没听,我对于我妈来说,不是气她犟脾气,就是心疼她不要命,说到底是我没给她安全感,她没什么办法只能靠自己拼命。
因为家里一直生病的原因,我这 20 多年一直没有安全感,哪怕工作了我一直担心父母的身体,担心他们又会怎么样了,劝他们吧根本也劝不动,不劝的话随他门折腾又觉得自己狠心,别人都说老人比小孩难照顾我现在慢慢是有体会了,父母的观念已经形成,又是父母的身份,根本听不进去你的话,哪怕掰开了揉碎了说都没用。
稀里糊涂说了好多,不知道论坛里的朋友们有没有什么建议,我知道这种情况有一部分原因是家里经济条件不行,这是我接下来要解决的问题,其他方面我是真没有什么头绪。放假期间聊这种问题,看到的朋友们如果打扰了你们假期休息,先道一声抱歉。
Win10, 手贱把 NTUSER.DAT 以及相关的几个文件删除了,现在无法用原来的本地账户登录 windows, 每次登录都会自动创建临时的用户目录, 开始菜单无法打开
https://i.imgur.com/QsENBrr.jpeg
https://i.imgur.com/QsENBrr.jpeg
用 AI 解决提高围棋水平的痛点
围棋水平提高有一个痛点,AI 的选择是黑箱,人类很难理解,只知道是好棋,但不知道如何思考才能想出来。
前天忽然想到这个痛点,思考能不能通过 AI 分析解决这个痛点,经过几个小时努力 coding ,完成了这个功能,感觉分析的还不错。
现在正在自己测试和迭代
https://i.imgur.com/5pDgfVN.png
https://i.imgur.com/DGm4b3a.png
围棋水平提高有一个痛点,AI 的选择是黑箱,人类很难理解,只知道是好棋,但不知道如何思考才能想出来。
前天忽然想到这个痛点,思考能不能通过 AI 分析解决这个痛点,经过几个小时努力 coding ,完成了这个功能,感觉分析的还不错。
现在正在自己测试和迭代
https://i.imgur.com/5pDgfVN.png
https://i.imgur.com/DGm4b3a.png