0%

博主前些日子逛 V2EX 时,经常看到有人讨论各种 ChatGPT 的第三方客户端。作为一个月月被 ChatGPT-4 爆金币的人,自然对这些第三方客户端没有兴趣(毕竟咱可是高贵的官方用户)。直到 Google 发布了 Gemini 模型后,博主才想要体验一下这个 AI 模型到底有多厉害,于是在 GitHub 上搜索起了 Gemini 的第三方客户端。

1

好家伙,第一条结果的 babaohuang/GeminiProChat 居然有 3.5k 颗 Star,看来这个客户端还是挺受欢迎的,可顺着仓库给出的演示 URL 进去,结果却让博主大失所望。

2

这套客户端没有历史记录,发出去的消息也不能再编辑,另外 Gemini 很重要的识图功能居然也没有实现,这怎么能行?

鉴于以上种种不好的使用体验,因此博主最后决定自己开发一个山寨版的 ChatGPT 客户端,名字就叫 ChatGemini。

说干就干,博主花了 3 天时间,用 React + TypeScript + TailwindCSS 打造了出一款全新的,有如下功能的 Gemini 客户端,项目一经发布,截止博主写这篇文章时,已经收获了 470 颗 Star。

  • 适配移动端
  • 支持多 API 密钥分流
  • 操作逻辑同 ChatGPT
  • 仿 ChatGPT 3.5 界面
  • 支持多轮聊天对话
  • 支持上传图片进行识别
  • 逐字输出(SSE)回应
  • 集成 PHP 版反向代理
  • 自定义 Gemini API 地址
  • 可启用站点通行码防止滥用
  • 聊天内容导出(HTML 和 PDF)
  • 对话内容保存在 IndexedDB 中
  • 在 AI 回应中运行 Python 代码

3

这篇文章并不打算将 README 中的内容再复述一遍,因此这里只会记录一些博主在开发过程中的细节。

阅读全文 »

在博主刚入门单片机时,经常看到其他人写出类似这样的驱动代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
// ... 其他内容
i2c_write_cmd(0xAE);
i2c_write_cmd(0x00);
i2c_write_cmd(0x10);
i2c_write_cmd(0x40);
i2c_write_cmd(0xDA);
i2c_write_cmd(0x1D);
i2c_write_cmd(0xF1);
i2c_write_cmd(0x8D);
i2c_write_cmd(0x14);
i2c_write_cmd(0xA4);
i2c_write_cmd(0xA6);
// ... 其他内容

作为小白,看到一大堆的 16 进制数字,自然是一脸懵比,就算看了半天也只能从调用的函数名字勉强猜出这可能是在操作寄存器,但是具体是什么寄存器,写入的值是什么,就不得而知了。

用这种一把梭方式写出的驱动代码,不仅可读性极差,而且一旦需要修改,事情就会变得非常麻烦:由于不清楚每句代码都是在操作哪个寄存器,因此开发者又需要回到 Datasheet 中去查找寄存器的地址,然后再去查看寄存器的功能,最后才能确定要写入的值,这样的开发效率可想而知,如果时间一长,开发者便会对这个项目产生厌恶情绪,最终导致项目被搁置,而屎山项目也就此诞生。

但不幸的是,这种一把梭的方式在很多开源项目中都能看到,因此这也让有强迫症的博主非常不爽。对此,博主决定写一篇文章,以自己的 AnyShake Explorer 项目开发途中为 ADC 编写驱动的经历为例,来分享如何才能写出能惊艳到其他人的驱动代码。

阅读全文 »

本项目已更名 AnyShake Project,并由博主继续维护。AnyShake Project 网站及文档位于 anyshake.org,GitHub 主页位于 github.com/anyshake

由于本文写在项目有起色之初,部分内容可能已经过期或不适用,因此一切请以 AnyShake Project 官网文档给出的内容为准

博主在今年(2023 年)上半年在带领实验室其他成员报名「全国大学生嵌入式芯片与系统设计竞赛」时,在项目选题时却犹豫不止,大多数人都是选择在「智能小车」、「智能机器人」及其相关的项目上下功夫,而博主却想做点不一样的。

在报名截止的前夕,博主突然想起博主的一位朋友曾经给博主提到他买过一台名叫 Raspberry Shake 的地震仪,这台地震仪可以将地震波数据整合或上传到云端,供用户调阅查看,而且他也长期在 Bilibili 上直播地震仪测到的实时数据,在看过他的直播后,博主立刻被这台地震仪所吸引住了。

最后,博主决定用比赛方提供的龙芯开发板,造一台自己的地震仪,但由于 Raspberry Shake 不开源核心代码,所以博主只能自己动手,一切从零开始。

在历经 3 个多月紧张的开发后,博主终于实现了这套系统的基本功能,并一举挺进了全国总决赛,最终拿下了全国一等奖的好成绩。

在获得佳绩后,博主也决定将这一整套系统开源到 GitHub 上,并继续加以维护,毕竟博主并不是地球物理学专业的学生,所以博主也希望能有更多的专业人士能够参与到这个项目中来,从而使这个项目能够更加完善

先晒出几张博主测到的地震波数据图,数据均来自博主设立在重庆北碚区的自研地震仪,由博主的那位朋友托管。

CST 2023-07-23 09:00:27 内江威远 M3.3

CST 2023-08-10 17:02:47 雅安石棉 M3.4

CST 2023-08-29 03:55:32 印尼巴厘海 M7.1

阅读全文 »

去年(2022 年) 8 月的某一天,博主逛淘宝时偶然刷到了一个 IN-12 辉光管,看完买家秀中展示的照片后,博主深深地被管子发出的幽幽红光给吸引住了,在 Google 上一番搜寻过后,博主发现大多数人都用它来做时钟。

虽然原理看上去非常简单,但显示时间的载体从液晶屏换到辉光管后,真的很炫酷。博主犹豫片刻过后,随即下单了一个 IN-12 管子和一个升压模块,决定先尝试将其点亮,看看效果如何,再决定是否继续。

几天后,快递如约而至,博主将升压模块和 IN-12 引脚连接好,接通 5V 电源后,辉光管发出了迷人的红光,博主也露出了满意的笑容。

单只辉光管

成功点亮 IN-12

试水计划顺利完成后,博主也没有闲下来,而是又下单了 3 只 IN-12,决定打造一台属于自己的辉光钟。在历经几个月的不断试错与改进过后,博主终于给交出了一份满意的答卷,并将整个项目(PCB 文件、单片机程序、授时软件)开源到了 GitHub,供更多人参考与借鉴。

GitHub - bclswl0827/OpenNixie

博主的辉光钟成品

阅读全文 »

了解博主的人都知道,博主曾经也是个长期混迹 HostLoc 的元老级 MJJ,即便天天被各种事情忙得抽不开身,还是会花出大量时间浏览各种 VPS 和域名相关的资讯。在那段疯狂的岁月里,博主也攒下了不少垃圾域名。

不幸的是,与其他 MJJ 一样,这些域名买下来之后,基本也没怎么用过,顶多也就挂挂探针,再无其他的用途。直到某日,博主在给别人发一个长链接时,突然想到,能不能把自己的吃灰域名给利用起来,搭建一个短网址服务呢?

博主调研了市场的大多数短网址程序过后,发现大多数短网址程序都是使用 PHP 实现的,并需要对接到 MySQL、PostgreSQL、SQLite 等数据库,当用户请求事前生成好的短网址时,该请求会发送到后端服务器,而后端程序会先从数据库检索到其对应到的长网址,再将长网址附在 301 或者 302 的响应中,实现跳转。

但是博主却对这些要使用后端的短网址程序都不太满意,因为在实际的部署和运营中,服务器除了要处理正常的访客流量,还需要处理来自机器人的大量疯狂试探(毕竟暴露在公网的服务本身就不安全),而且后端程序部署在自己服务器上,万一程序自身出了什么 0Day 漏洞,却又正好被利用的话,那么服务器就彻底沦为别人的肉鸡了。

再者,由于博主的服务器大多都是低配小鸡,随手一个 CC 攻击就能轻松拿捏博主。本着多一事不如少一事的原则,博主最终决定开发一套不依赖自建后端及数据库的短网址程序,再将前端部署于 GitHub Pages,只使用 JavaScript 做页面间的跳转,这样就能实现抵御大部分试探和攻击了。

阅读全文 »

又到了一年毕业季,让毕业生们头大的事也莫过于毕业设计了。博主所在的实验室也有一位即将毕业的大四学长,他的毕业设计方向与高速数据采集有关,简单来说,他需要将从 STM32 上采集来的数据透过串口实时发送至上位机,并在上位机上用 Python 做解析,并将数据打上时标,存入 MySQL 数据库。

但是某日这位学长却找到博主,提到自己在解析串口传来的数据时遇到了延时过大和数据丢包的问题,希望博主能够帮帮忙,而博主在看完这位学长的上下位机代码过后,陷入了沉思,因为这位学长传输并处理数据的方式是这样的。

  1. STM32 读取传感器浮点数据,放到一个长度为 1000 的数组
  2. 将数组中的数据遍历转为字符串,然后拼接为如下形式
    1
    <data_1>,<data_2>,<data_3>,<data_4>,...\t
  3. 将该字符串从 STM32 的串口送出
  4. 上位机使用 Python 以 \t 做为数据接收的起始和结束标志
  5. 将接收到的文本字符串使用 split 方法分割,取得一个数组
  6. 遍历该数组将数据类型转型回 float

乍看上去,这种方法好像没有任何问题,因为在许多带有串口协议的模块上(例如 NMEA 协议的 GNSS 模块),数据都是以这样的形式传输的,然而这位学长却忽略了一个重要的问题,那就是作为一个高速数据采集的项目,他程序的大部分时间却耗在了字符串处理上

博主最后给这位学长的解决方案是,将 STM32 中的传感器数据数组与一个校验和放进结构体,以组帧的方式,将结构体转为字节流,走二进制形式直接从串口送出;Python 上位机的部分则使用 struct 包中的 unpack 方法来解析下位机传来的二进制数据,直接得到来自下位机的原始数据,同时也省下了数据类型之间互转所花去的时间。

这篇文章,博主会谈谈如何用这种方式优雅地透过串口稳定地传输数据,并给出示例 Arduino 下位机代码和由 Golang 和 Python 实现的上位机代码。

阅读全文 »

几日前和一个朋友聊起 SDR,在感叹两年的芯片短缺潮终于快要翻篇之余,朋友还提到了快二十年前他在玩的一种 SDR。

RTL-SDR 的出现在 2012 年左右,值得一提的是,博主入坑 SDR 的第一台设备,也是 RTL-SDR。而在这之前,SDR 设备主要还是集中在专业领域,成本较高且功能也相对有限,仅有 USRP、BladeRF 等几种选择,对于博主这样的业余玩家来说,要是当年购买一套 USRP 或是 BladeRF,恐怕就要掏空好几个腰包了。

即便如此,也没有难住那时的玩家:在遥远的当年,比较流行的一个方案就是 DIY 一块包含了射频信号采集、混频、放大、滤波的板卡,然后将其与 PC 上的声卡相连,以声卡作为 ADC,再透过软件进行信号处理,这就是声卡 SDR

声卡 SDR 架构图

上图是一个典型的声卡 SDR 架构框图,在博主正式给出声卡 SDR 的原理图之前,还需要引入一些概念和理论做铺垫,便于以出浅入深的方式去分析及理解声卡 SDR 的工作原理。

阅读全文 »

在博主的高中时代,曾经意外接触到一本名为「段子手股民的忏悔录」的书,出于兴趣,在博主满 18 岁那天的早上,便果断给自己开了一个股票账户,从此入坑大 A 股海。

由于博主资金体量不大,而大 A 市场也不能以零股形式交易,所以博主长期以来的持仓,都只能靠几只稳如老狗的银行股和几个行业 ETF 苟活。直到有一天,博主在刷雪球时看到,原来像博主这样的小散户,还能透过可转债打新的方式,靠运气赚点零花钱。

不幸的是,可转债这种东西,并不是每天都能申购的。作为一个懒人,每天一早打开炒股软件,生无可恋地看一眼自己绿油油的收益,再去看有没有能申购的新可转债,实在是一件很痛苦的事情。

多亏博主心理比较强大,也坚信价值投资的意义,否则就成为被收割的韭菜了。在痛苦之余,博主也曾思考,能否写一个小程序,获取每日的可转债并通知博主申购呢?

也好在博主是 Telegram 的常驻用户,同时,Telegram 也提供了健全的生态,以支援平台下的机器人开发,于是博主萌生了写一个 Telegram 可转债机器人的想法。

这篇文章,将会分享博主编写简单的 Telegram 可转债机器人时的一些思路,并介绍如何将其搭建在云服务器上,实现每天给自己或是往几个朋友组建的小群里自动推送可供当日申购的可转债,推动「共同富裕」。

博主 2022 打新收益

阅读全文 »

某日,博主在逛淘宝时,发现了一款电波钟模块。

JJY 电波钟模块

博主第一次听说长波授时的概念还是在上初中的时候,出于兴趣,当年也下单了过一个 CASIO 出口转内销的电波授时闹钟。如今距离买下这款闹钟已有快七年时间了,虽然当年买的电波钟外壳已经泛黄,但是时间仍然分毫不差。如今刷到这么一个模块,又唤起了博主的回忆。

在这七年间,博主也曾经尝试弄清楚电波授时的解码原理以及数据报文格式,但是迫于当年的知识面与技术并不到位,所以在几次尝试与几次失败后,博主便放弃了。

而如今博主作为一个通信工程大学牲,想要再次挑战弄懂 JJY 长波授时的时间码结构,并尝试编写程序解码准确时间,于是果断下单了这款模块。

在收到模块后,经过两天的不懈努力,博主也终于成功达成了目标,了结了七年来的心事。这篇文章,会分享博主玩转 JJY 时间码模块的过程。

阅读全文 »

博主最近在折腾一个地震监测相关的项目,项目中的测站上位机程序需要运行在 Linux 平台上。

由于博主的地震项目需要在异地多点部署测站,要是再从网上采购一堆 Linux 开发板的话,又会是一大笔开销。在翻遍实验室库存过后,博主发现了一堆往届学生参加嵌入式比赛留下的龙芯 2K1000 EDU 板子。

2K1000 EDU 是 mips64el 架构,说来惭愧,博主此前实际用过的 mips 架构的设备,也就只有几台路由器了。

当然,博主相信,这玩意肯定还是比路由器强一点的,不过能强多少,就不好说了。抱着测站程序「能跑就行」的想法,博主取了一块板子,准备上电装系统看看究竟。

本以为 2K1000 EDU 除了架构不太一样,性能比较拉垮一点之外,其他方面同别的 ARM Linux 系列开发板别无两样,结果却出乎博主的意料:本来预计一两个小时就能搞定的事情,在 2K1000 EDU 上折腾了快一天才完成。

所以,这篇文章将详细介绍博主与 2K1000 EDU 斗智斗勇的过程。

即将寄走的龙芯 2K1000 EDU

阅读全文 »