实战笔记:当我想查端口却没装 Telnet 时,我决定自己写个工具

我从事于 IT 工作,经常会碰到各种奇葩的问题。其中的一项就是服务无法访问,当碰到这些情况,如何快速的排查问题?如果手边有电脑,那还好办,直接打开电脑找问题即可。如果手边没有电脑,我们怎么快速的定位问题?是服务挂掉了?还是服务器宕机了? 我的基本思路是这样的,先查看服务器是否宕机,如果服务器没有宕机,那么查看服务是否挂掉?如果服务没有挂掉,那么很大可能是数据造成的问题,或者程序 Bug。 某次我急需确认服务器上的一个端口是否正常开启,习惯性地打开 Windows 命令行准备敲下 telnet 命令。结果弹出的却是:“telnet 不是内部或外部命令”。这是让我抓狂的一刻。 由于系统刚重装,这个组件还没勾选。当我从控制面板找到它、安装、甚至可能还要重启系统时,这套复杂的操作让我陷入了反思:为了检测一个端口,至于这么麻烦吗? 更进一步想,如果我手头没有电脑,只有一部手机,我该如何快速判断服务器防火墙是不是忘了开? 痛点:环境依赖与生态限制 在实现这个功能之前,我有过两个思考维度: 环境依赖:无论是 Windows 的 Telnet 还是 Linux 的 nc,都依赖当前操作系统的环境配置。 小程序限制:微信小程序虽然有网络请求能力,但它必须配置服务器域名白名单。如果你想直接用小程序前端去探测一个随机的 IP 或端口,微信的底层安全机制是不允许的。 方案:Go 后端代劳,小程序只做“遥控器” 为了绕过这些限制,我在“豆子工具”里实现了一个远程端口检测功能。它的逻辑非常直接且高效: 前端交互:用户只需在小程序里输入目标服务器的 IP/域名 和 端口号。 后端核心:数据提交到我用 Go 编写的后端服务。 模拟连接:后端服务代替用户执行 TCP 连接探测。Go 语言的 net.DialTimeout 在这里非常实用,可以精准控制探测时间,避免由于网络超时导致的页面死等。 结果反馈:后端将“连接成功”或“连接失败”的结果返回给小程序展示。 那么如何操作呢? 1,访问服务器的 SSH 端口,查看是否通畅?如果程序返回开启,那么进行下一步。 2,访问服务端口,查看是否挂掉?如果程序返回开启,那么进行下一步。 3,查看其他用户是否这样的情况?如果是,大概率是程序 Bug,如果不是,大概率给这个用户的数据相关。 价值:随时随地的“运维眼” 自从这个功能上线后,我解决了很多尴尬的场景: 排查防火墙:在云厂商后台改了安全组策略后,掏出手机点一下,秒知是否生效。 现场交付:在客户现场没有电脑时,快速确认后端服务是否已经拉起。 零部署成本:再也不用担心当前电脑有没有装 Telnet 或 Netcat。 总结 很多时候,工具的意义并不在于它用了多么高深的算法,而在于它是否能在你最需要的时候,以最简单的方式解决那个微小却刺手的痛点。 这个小功能的背后,其实是 Go 语言并发网络模型的一个微小缩影。

2018-01-08 · 1 min · Eagle

实战笔记:从一个按钮到全能生成器,随机数功能的“进化论”

还记得我之前提到的吗?2018 年,“豆子工具”的初版只有一个功能:点一下按钮,生成一个随机数。 那时候的代码逻辑极其简单,甚至算不上一个“工具”。但随着这几年自己在开发、运维过程中不断遇到“需要一个复杂密码”、“需要一个 16 位纯金钥”或者“需要一个全大写 ID”等实际场景,我发现简单的随机数其实并不简单。 痛点:单一随机数的局限 早期的随机数功能非常死板,生成的格式往往不是我想要的。每次生成后,我可能还需要手动去改长度、改大小写,甚至手动补上特殊字符。 作为一个开发者,如果一个工具不能让我“一键到位”,那就是不合格的。 进化:高度自定义的“融合模式” 于是,我把这些年所有关于“随机”的需求全部揉碎、重组,将它升级成了一个全能的生成器。 现在的随机数功能,不再是盲目地随机,而是基于规则的精准生成。我为其设计了一套组合逻辑: 长度自定义:不再局限于几位数字,用户可以根据需求自由输入长度。 字符集自由组合: 纯数字:适用于验证码类场景。 纯字母:适用于临时 ID 或变量命名。 字母+数字:兼顾强度与易读性。 含特殊字符:专门为高强度随机密码设计。 结果格式化: 支持结果一键转大写或转小写。这在配置某些特定系统的 API Key 时非常有用,省去了手动切换输入法的麻烦。 思考:小功能里的“产品观” 虽然随机数在技术实现上只是简单的字符数组随机采样,但从产品角度看,它体现了一种**“减少用户操作”**的原则。 把纯数字、字母、符号和格式化选项融合在一起,本质上是把原本需要用户在脑子里构思、在手里修改的过程,变成了一个简单的“勾选”动作。 以前,我曾把这个功能做的非常复杂,可以生成Excel文件并进行下载,但是当我上线后,我发现这个功能用的人很少,而我自己也没有这样的场景。我用的最多的就是需要一个临时密码,用来分享时会用到。所以就砍掉了这个功能。 当简化之后,它有几个好处:1,增加了稳定性,因为去掉了导出Excel的功能。2,界面更简单,减少了很多输入的操作,方便使用。 总结 现在,每当我需要为一个新数据库设置密码,或者为测试环境生成一批随机标识时,我都会习惯性地打开这个功能。 从 2018 年那个只有一个按钮的“玩具”,到如今能够满足生产环境需求的“工具”,这种一点一滴的打磨,也许正是独立开发者的乐趣所在。

2018-01-07 · 1 min · Eagle

实战笔记:我把 FFmpeg 搬进小程序,搞定了音频格式转换

在“豆子工具”众多的功能里,音频转换(m4a 转 mp3) 是我使用频率最高、也最具有“个人救赎”色彩的一个。 起因:被软件更新“背刺”后的郁闷 这个功能的由来非常接地气:有一段时间,我需要频繁地将苹果手机录音产生的 m4a 格式文件转换成 mp3,因为当时某个必须使用的业务软件只认 mp3。 那时候我找遍了各种转换工具。最后发现某款主流音乐软件自带的转换功能挺好用。然而,好景不长,在一次软件自动更新后,这个功能竟然被砍掉了。我去搜老版本安装包,却发现根本找不到安全的下载路径。 那种“被绑架”的无奈感,相信每个工具控都深有体会。 进阶:大名鼎鼎的 ffmpeg 郁闷之后,我转向了技术人的终极方案——ffmpeg。 命令行虽然硬核,但确实强大到无以复加。一条简单的指令就能解决所有问题: ffmpeg -i input.m4a output.mp3 用了很长一段时间的命令行后,新的问题又来了:我总不能随时随地都带着电脑吧?如果我在外面,急需用手机转一个文件发给客户怎么办? 于是,我动了把 ffmpeg 搬进“豆子工具”的心思。 实现:极简架构下的“随时随地” 在小程序里实现这个功能,原理其实并不复杂,核心在于后端调度: 前端上传:小程序端选择 m4a 文件,上传至服务器。 后端处理:后端使用 Go 语言接收文件,通过 exec 模块调用服务器系统环境中的 ffmpeg 进程进行转换。 实时试听:为了保证体验,我在小程序里集成了一个音频播放器。转换前可以听一下是否选对了文件,转换后也可以即时试听确认效果。 即用即删:转换生成的文件在用户下载后会立即从服务器删除,既保护了隐私,也完全不占用宝贵的服务器存储空间。 感受:工具的本质是“自由” 自从这个功能上线后,我就彻底告别了 ffmpeg 命令行。 最爽的一点是随时随地:无论是在地铁上还是在户外,掏出手机,几秒钟就能完成格式转换。这种把强大工具揣在兜里的感觉,就是开发者最大的浪漫。 如果你也经常被各种音频格式限制折磨,或者对 Go 调用 ffmpeg 的具体代码实现感兴趣,欢迎在评论区交流。

2018-01-04 · 1 min · Eagle