练手小工具 之 纯文本跨设备传输 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
SuperMild
5.49D
V2EX    程序员

练手小工具 之 纯文本跨设备传输

  •  2
     
  •   SuperMild
    ahui2016 2022-02-13 21:02:07 +08:00 3526 次点击
    这是一个创建于 1336 天前的主题,其中的信息可能已经有所发展或是发生改变。

    练手项目很难选,也很难参考,毕竟每个人的技术栈、兴趣、目的、需求等等都有巨大的差异。

    比如目的,如果专注于提升技术,就会选择难度较大的项目;如果专注于赚钱,就要多花精力在平面设计、竞品调查研究、宣传上。而本文提出的例子,目的主要是满足自己的需求以及为空闲时间提供一些既有趣又没有心理压力的任务。

    需求与灵感

    现在我有一个需求:需要在不同的电脑、手机之间交换纯文本(一个短字符串),包括 Windows, MacOS, Linux, iOS, Andriod, 其中包括无图形界面的服务器。

    做一个满足这个需求的小工具,对于我来说最简单的就是做一个网站,由于我的需求只是传输很短的纯文本,并且是一个自用的工具,因此不需要担心传输速度、流量、服务器负荷等问题。

    小项目,多花样

    最基本的玩法是做一个网站,不同设备通过访问网页进行文本的黏贴、复制。

    但玩法绝非止步于此,比如:

    • 无图形界面的服务器,可以做一个 CLI 工具来收发文本
    • iOS 可以利用“快捷指令”来接收文本到剪贴板、发送剪贴板内容到服务器
    • Windows 可以使用 AutoHotkey 操作剪贴板,一个快捷键就能接收文本到剪贴板或发送到服务器
    • 做手机 App
    • 增加对图片、文件的支持
    • 改成多用户系统,开放注册
    • 复制代码片段文本转换成图片
    • 复制文字后触发语音朗读
    • …… 等等

    不是说这些全都做,而是可以想到很多,然后挑一些来做。我建议先做一两个简单的功能,后续再慢慢进化。

    总设计(需求与灵感的细化、具体化)

    对于我来说,总设计是最关键、最难,通常也是要花最多时间的一步。

    总设计的本质是做选择。一个表面简单的需求背后通常隐藏在大量选择,比如:

    • 做成单用户还是多用户系统?
    • 只能传输文本吗,要不要提供传输图片或文件的功能?
    • 每条消息的上限是多少字?
    • 全部消息要长期保存吗,要做搜索功能吗?
    • 要做 CLI 吗,网页版的功能与 CLI 有什么区别?
    • 是完全公开还是要密码登入? 使用 CLI 时如何输入密码(每次输入还是缓存在哪里)?
    • 每条消息可单独编辑吗,还是不允许编辑只能删除?

    …… 等等。这只是一个极简单的小工具,要思考的东西算很少了,项目稍大一点要思考的因素就会指数式增长。

    有人习惯先做,一边做一边想一边改,这个方法完全没有问题。我的习惯是先总体上尽量多想,让脑子里“成品”的形象越来越清晰,清晰到一定程度之后我才开始写代码。

    我的决策

    目前,我想象中的这个小工具应具备以下特性:

    • 只能收发纯文本
    • 上限 1000 条,超过上限则自动删除最早的消息
    • 每条消息上限 1024 bytes
    • 每条消息均可单独编辑、删除、复制
    • 可在线添加新消息
    • 主密码的唯一功能是生成 key, 其他操作需要使用 key
    • 每个 key 的有效期是 30 天
    • 网页提供搜索功能, CLI 提供受限制的搜索功能(向 CLI 返回搜索结果的上限是 10 条)
    • 只检查是否与上一条消息内容相同,不检查历史消息
    • 消息列表不分页,但只截取开头,需要点击才加载全文

    如果是你来做这个小工具,你会如何决策呢?每个人有不同的决策,这正是做小工具的乐趣之一。

    技术选型

    由于我很懒,也怕麻烦,技术实力也差,因此我会尽量选择简单、原始、直观(思维负担低)的技术栈。

    比如前端我就用 JQuery, 简单到极致。我也用过 React 和 Vue, 结果发现对于一个简单的界面来说, JQuery/React/Vue 都差不多!

    React/Vue 做复杂界面有优势,但对于简单界面,实在没有带来特别明显的好处。JQuery 的好处是比较轻,而且可以彻底抛弃 npm, 这使得前端构建省了很多事。

    当然,这是因为我不太爱玩前端,对于爱玩前端的人来说选择就完全不一样了,这需要根据自己的喜好、技术背景、目的来选择。

    后端我选择 Go, 因为用 Go 做的小工具(小网站)是最容易发布的, 现在做项目通常都会使用 GitHub 之类的代码仓库,而仓库地址就是 Go 项目的发布渠道,完全不需要额外的操作,而且又能打包为一个免安装的可执行文件。

    再加上 Go 占用的资源极少,我只需要一个最低配置的 VPS 就能同时运行一大堆小工具。

    容易发布 /部署、运行资源少、编译速度快、web 框架很轻但也够用,同时具备这几大优点的语言也只有 Go 了吧?(当然,如果做大项目, Go 的优势就不明显了,主流语言能够成为主流,各有各的好。)

    最后

    这个小项目我现在开始做,后续想到什么再补充吧。

    第 1 条附言    2022-02-14 08:46:31 +08:00

    有了新的想法:专门为 txt-CLI 工具提供永久保存功能:

    • 平时发送至 txt-server 的文本消息默认为临时消息,上限1000条,超过上限就自动删除旧消息。
    • 使用命令 txt save [n] 可以把第 n 条消息转为永久保存,不会被自动删除。
    • 可使用搜索功能查找永久保存的文本,类似于 Ctrl+R 搜索最近命令,区别只是数据保存在服务器(因此可跨设备使用)
    • 每条永久保存的文本可单独设定别名,类似于 alias 命令,区别只是数据保存在服务器(因此可跨设备使用)
    • 别名功能可以用来方便输入常用网址、电邮地址、不常用(比如一个月、几个月要用一次)的命令
    15 条回复    2022-02-27 21:21:22 +08:00
    rekulas
        1
    rekulas  
       2022-02-13 22:50:44 +08:00
    supercaizehua
        2
    supercaizehua  
       2022-02-14 00:15:00 +08:00
    abc8678
        3
    abc8678  
       2022-02-14 07:58:06 +08:00 via Android   1
    我也经常被文本传输困扰,有些内容不宜通过聊天工具传输。用蓝牙或 U 盘传文本也小题大做了。于是平时用二维码生成器应付一下
    SuperMild
        4
    SuperMild  
    OP
       2022-02-14 08:09:18 +08:00
    @rekulas
    @supercaizehua

    谢谢提供参考!
    SuperMild
        5
    SuperMild  
    OP
       2022-02-14 08:10:42 +08:00
    @abc8678 啊对,我忘了二维码,这个功能要加到候选列表里。
    catsoul
        6
    catsoul  
       2022-02-14 09:11:19 +08:00
    这个功能我记得以前有一个叫“方片”的工具,支持跨平台(包括桌面端和移动端)复制粘贴。后来 iOS <-> OS X 自带互通,各种安卓系统跟自身厂家有 NFC 近场传输后,就基本没有使用这个工具了。

    当然类似工具其实很多了。
    SuperMild
        7
    SuperMild  
    OP
       2022-02-14 09:42:09 +08:00
    @catsoul 印象中见多很多同类工具,但都不支持无图形界面的 Linux 。

    我这个不仅支持纯命令行,而且还打算给命令行增加一些方便的功能,比如:

    - 列出最近 5 条云剪贴板消息
    - 指定复制第 n 条云剪贴板消息
    - 搜索云剪贴板消息
    - 通过别名精确指定云剪贴板消息
    supercaizehua
        8
    supercaizehua  
       2022-02-14 11:21:17 +08:00
    想起来还有一个多平台的 app, 快贴, 能支持图片, 之前听网课的时候, 喜欢一遍听一遍 ipad 做笔记, 然后电脑截图通过快贴拖到 ipad 的笔记软件中
    abc8678
        9
    abc8678  
       2022-02-14 16:07:18 +08:00 via Android
    我以前也问过跨网络跨平台传递文本的问题,当时把希望寄托在外设上。打算一台电脑给另一台电脑模拟键盘输入内容,也没问到太多有效的办法。平时的使用场景是,复制粘贴命令到网络不通的 Linux 终端。我用那个类似于幽灵键鼠、badusb 的方法勉强解决了,就是一个外形想 U 盘的设备。一台电脑通过一个软件写内容,然后插入另一台电脑,就一键模拟键盘敲出这个文本。然而不灵活,明显就不能支持中文。
    当时的问题 t/811853
    vst93
        10
    vst93  
       2022-02-14 17:58:20 +08:00
    自己写的用的 https://meimingzi.top
    SuperMild
        11
    SuperMild  
    OP
       2022-02-14 18:38:07 +08:00
    @abc8678 存在鼠标里面,硬核的方案啊哈哈哈,从未想过的路径。

    @vst93 通过极短标识符+ip 来实现便利与隐私的平衡,果然大家各有各的创意啊。
    xiqishow
        12
    xiqishow  
       2022-02-14 18:59:35 +08:00
    ppzhilian.com 挺好用的
    SuperMild
        13
    SuperMild  
    OP
       2022-02-14 19:34:01 +08:00
    @xiqishow 以前我只知道 snapdrop, 但 snapdrop 貌似受限于局域网,现在才知道 PP 直连,好东西呀。
    wdssmq
        14
    wdssmq  
       2022-02-27 14:59:31 +08:00
    所以吐槽下,,win 自带的剪切板同步从来没成功过。。- -
    SuperMild
        15
    SuperMild  
    OP
       2022-02-27 21:21:22 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2692 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 114ms UTC 14:08 PVG 22:08 LAX 07:08 JFK 10:08
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86