Tabby,一个 5 万星标的终端工具

部署运行你感兴趣的模型镜像

你好,我是坚持分享干货的 EarlGrey,翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。

如果我的分享对你有帮助,请关注我,一起向上进击。

Tabby 是一名老外在 Github 开源的终端连接的工具,至今已经累积 55K+ star。

faa852fddd60e67198a0d12f34cbbee6.png

Tabby 的功能特性大概有:

  • 支持多平台,Windows、MacOS(Intel 芯片/M1 芯片)、Linux 都有对应的安装包的;

  • 自带 SFTP 功能,能够与 Linux 系统传输文件;

  • 炫酷的终端页面,简单易用,以及各种插件支持等

70365d9558ab74fbe5f9e75ca627b374.png

安装包

136771343e1654a085962419cacad617.png

github地址:https://github.com/Eugeny/tabby/releases/tag/v1.0.164

找到适合自己电脑的安装版本

安装之后是这个页面

2ce70a455d417cf67c296f1c50057616.png

SSH 连接

一开始我以为点击「New terminal」是弹出填写连接服务器的信息。

结果不是,它默认是新建一个针对本地电脑的终端窗口,比如如果你的电脑是windows 系统就会新建一个 cmd 控制窗口,如果是 macOs 系统就会新建一个 terminal。

所以,要想新建一个连接服务器的终端,要点击「Settings」,进入到配置页面。

a5bd12d17debee7575e2362ccb8d325e.png

进入到设置页面后,选择 profiles&connections 这个选项,然后点击「New profile」新建一个终端配置

b0677e61768439dabb975a9434118e80.png

然后选择 ssh connection

485455ba6d12fde1e202c42c751c1963.png随后就会弹出配置 ssh 连接的信息,填上终端名称、IP 地址、端口号、账号密码就可以了。

6a47293c65bcb0d4336d1ca00bb481d2.png保存完后,就会出现刚新增的终端配置,然后点击运行的图标就可以了。

1634f388d377ee4956b88c97faeb57c2.png也可以通过图中的小方块, 选择连接的服务器。

41ee15abbb6ed457ea7c92038acdb945.png选择后,就会进入到终端页面了,也就可以对服务器进行操作了。

490d2367d1d373784f0096162f9b7fa1.png

SFTP 传输工具

前面也介绍过,这款终端工具是自带 SFTP 功能的。要使用的话,直接点击下图中的 SFTP 图标就行。

ef063364541e22040c7fb3ce37963ce6.png然后就会弹出服务器上的目录

fb846ecad9eba3197798dc9a66db3d24.png如果你想把服务器上的文件传输到本地电脑,你只需要找到服务器的文件,然后点击,就会弹出保存文件的提示。

f52e8fa5cbec9e15c7272e8b331ba6dc.png如果你想把本地电脑的文件放到服务器上,只需要把文件拖拽到对应的目录就行。或者点击右上角上传文件

ea0836f22b4a039dc077cdaf0342f830.png

设置

Tabby 提供很多终端页面风格,都挺好看的。

6481139bd80d3bf07f5b366cdf4142cc.png还有字体的大小设置等

4baeb81e1f3bbfcfb8571710b5a756db.png以及常用的快捷键

9b0a4535b8b308ece0340032d5bcf9da.png详细可以去 Tabby 的 Github 上看。

本文来源:blog.csdn.net/weixin_45417821/article/details/122579794

- EOF -

文章已经看到这了,别忘了在右下角点个“赞”和“在看”鼓励哦~

推荐阅读  点击标题可跳转

1、Python 项目工程化最佳实践

2、Python 可以比 C 还要快!

3、streamlit,一个超强的 Python 库

4、豆瓣8.9分的C++经典之作,免费送!

5、Python 3.12 版本有什么变化?

最近我开了一家淘宝店,名字叫【打破壁垒】,主打程序开发相关付费素材、工具的共享类商品,帮助大家降低试错和使用成本。欢迎大家关注。

c9932a87ad1ba507dc4079a375f3714a.jpeg

长按扫描下方二维码,然后点击页面中的【打开淘宝】,即可进入店铺:

ce3d8ab2d88ea75b83fad3b9b72c027e.png

回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,领取进击的Grey与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「书单02」,领取进击的Grey整理的 10 本 Python 入门书的电子版

👇关注我的公众号👇

告诉你更多细节干货

84cc6df67e40c0899534ae6f95a6fb00.jpeg

欢迎围观我的朋友圈

👆每天更新所想所悟

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

我们来做一个**交互式系模拟器(Galaxy Simulator)**,使用 HTML + CSS + JavaScript 在网页中实现一个可视化的、动态旋转的系效果,包含恒、行、轨道和引力动画。 --- ## 🌌 目标:创建一个“可交互的系” ### ✅ 功能需求: 1. **视觉表现**: - 中心是一个明亮的“系核心”(如银河系中心) - 多条螺旋臂向外延展 - 数百个随机分布在螺旋臂上,并绕中心缓慢旋转 - 支持缩放与拖拽视角 2. **交互功能**: - 鼠标滚轮可以缩放系 - 拖动鼠标可以移动视图 - 点击某颗显示信息(名称、距离等) 3. **性能要求**: - 使用 Canvas 或 WebGL 实现流畅渲染(60fps) - 支持上千颗体而不卡顿 --- ## ✅ 完整代码实现(基于 HTML5 Canvas) ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>系模拟器</title> <style> body { margin: 0; overflow: hidden; background-color: #000; color: #fff; font-family: Arial, sans-serif; } canvas { display: block; cursor: move; } .info-panel { position: absolute; top: 10px; left: 10px; background: rgba(0, 0, 0, 0.7); padding: 10px; border-radius: 5px; max-width: 300px; transition: opacity 0.3s; } .controls { position: absolute; bottom: 20px; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.7); padding: 10px; border-radius: 5px; font-size: 14px; } </style> </head> <body> <canvas id="galaxy"></canvas> <div class="info-panel" id="infoPanel"> <h3>系模拟器</h3> <p>点击查看信息,滚轮缩放,拖动平移。</p> <div id="starInfo"></div> </div> <div class="controls"> 缩放: 滚轮 | 平移: 拖动 </div> <script> const canvas = document.getElementById('galaxy'); const ctx = canvas.getContext('2d'); const infoPanel = document.getElementById('infoPanel'); const starInfo = document.getElementById('starInfo'); // 设置画布全屏 function resizeCanvas() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; } window.addEventListener('resize', resizeCanvas); resizeCanvas(); // 视图状态 let scale = 1; let offsetX = 0; let offsetY = 0; let isDragging = false; let dragStart = { x: 0, y: 0 }; // 数据 const stars = []; const numStars = 1500; // 数量 // 生成螺旋系中的(对数螺旋分布) function generateSpiralStars(count) { for (let i = 0; i < count; i++) { const angle = Math.random() * Math.PI * 20; // 多圈螺旋 const radius = Math.pow(Math.random(), 0.8) * 400; // 非线性分布更集中 // 对数螺旋公式:r = a * e^(bθ) const spiralFactor = 0.3; const spiralOffset = angle * spiralFactor; const x = radius * Math.cos(angle + spiralOffset); const y = radius * Math.sin(angle + spiralOffset); // 添加随机扰动(让系更自然) const jitter = 40; const jitterX = (Math.random() - 0.5) * jitter; const jitterY = (Math.random() - 0.5) * jitter; // 随机亮度和大小 const size = Math.random() < 0.05 ? 3 : Math.random() < 0.2 ? 2 : 1; const brightness = Math.random(); const hue = Math.random() < 0.9 ? 200 : Math.random() < 0.98 ? 30 : 0; // 蓝白为主,少量黄红 stars.push({ x: x + jitterX, y: y + jitterY, size, brightness, hue, id: i, name: `恒-${i}`, distance: Math.sqrt(x*x + y*y).toFixed(2) }); } } generateSpiralStars(numStars); // 绑定事件 canvas.addEventListener('wheel', handleWheel); canvas.addEventListener('mousedown', startDrag); window.addEventListener('mousemove', drag); window.addEventListener('mouseup', endDrag); canvas.addEventListener('click', handleClick); function handleWheel(e) { e.preventDefault(); const zoomSpeed = 0.1; const scaleFactor = e.deltaY > 0 ? 1 - zoomSpeed : 1 + zoomSpeed; scale *= scaleFactor; // 限制缩放范围 scale = Math.min(Math.max(scale, 0.1), 10); } function startDrag(e) { if (e.button !== 0) return; // 只响应左键 isDragging = true; dragStart.x = e.clientX - offsetX; dragStart.y = e.clientY - offsetY; canvas.style.cursor = 'grabbing'; } function drag(e) { if (!isDragging) return; offsetX = e.clientX - dragStart.x; offsetY = e.clientY - dragStart.y; } function endDrag() { isDragging = false; canvas.style.cursor = 'move'; } // 点击检测最近的 function handleClick(e) { const rect = canvas.getBoundingClientRect(); const clickX = (e.clientX - rect.left - offsetX) / scale; const clickY = (e.clientY - rect.top - offsetY) / scale; let closestStar = null; let minDist = 5; // 5px 内才算命中 for (const star of stars) { const dx = star.x - clickX; const dy = star.y - clickY; const dist = Math.sqrt(dx*dx + dy*dy); if (dist < minDist) { minDist = dist; closestStar = star; } } if (closestStar) { starInfo.innerHTML = ` <strong>${closestStar.name}</strong><br/> 类型: ${closestStar.hue < 10 ? '红巨' : closestStar.hue < 30 ? '黄矮' : '蓝/白'}<br/> 距离中心: ${closestStar.distance} 光年<br/> 亮度: ${Math.round(closestStar.brightness * 100)}% `; } else { starInfo.innerHTML = ''; } } // 动画循环 let rotationAngle = 0; function animate() { ctx.clearRect(0, 0, canvas.width, canvas.height); // 更新旋转(缓慢自转) rotationAngle += 0.0002; // 极慢转动 // 绘制每颗 stars.forEach(star => { // 应用旋转矩阵 const cosR = Math.cos(rotationAngle); const sinR = Math.sin(rotationAngle); let rx = star.x * cosR - star.y * sinR; let ry = star.x * sinR + star.y * cosR; // 应用视图变换 const screenX = rx * scale + offsetX; const screenY = ry * scale + offsetY; // 只绘制屏幕附近的以提升性能 if ( screenX < -50 || screenX > canvas.width + 50 || screenY < -50 || screenY > canvas.height + 50 ) return; // 设置颜色 ctx.save(); ctx.globalAlpha = star.brightness; ctx.fillStyle = `hsl(${star.hue}, 100%, ${star.brightness * 80}%)`; // 绘制 if (star.size > 2) { // 较大的加光晕 const grad = ctx.createRadialGradient(screenX, screenY, 0, screenX, screenY, star.size * 2); grad.addColorStop(0, `hsl(${star.hue}, 100%, ${star.brightness * 100}%)`); grad.addColorStop(1, 'transparent'); ctx.fillStyle = grad; ctx.beginPath(); ctx.arc(screenX, screenY, star.size * 2, 0, Math.PI * 2); ctx.fill(); } ctx.fillStyle = `hsl(${star.hue}, 100%, ${star.brightness * 80}%)`; ctx.beginPath(); ctx.arc(screenX, screenY, star.size, 0, Math.PI * 2); ctx.fill(); ctx.restore(); }); requestAnimationFrame(animate); } // 开始动画 animate(); </script> </body> </html> ``` --- ## 🔍 代码解释 ### 1. **系结构生成** - 使用**对数螺旋公式**模拟真实系(如银河系)的旋臂结构: ```js r = pow(random, 0.8) * 400; θ += r * 0.3; // 螺旋偏移 ``` - 加入随机抖动使分布更自然 ### 2. **视觉效果** - 小用 `arc()` 绘制 - 大添加 `radialGradient` 光晕效果 - HSL 控制颜色:蓝色为年轻恒,黄色为类太阳,红色为老年 ### 3. **交互系统** - **缩放**:通过 `scale` 变量控制 - **平移**:`offsetX`, `offsetY` - **旋转**:全局缓慢自转(体现系运动) - **点击识别**:反向计算坐标并找最近点 ### 4. **性能优化** - 超出屏幕的不绘制 - 使用 `requestAnimationFrame` 流畅动画 - 控制最大数(1500 已非常流畅) --- ## 🎮 效果预览 当你打开这个页面时,你会看到: - 一个缓缓旋转的蓝色/白色为主的螺旋系 - 中心密集,边缘稀疏 - 鼠标拖动可探索不同区域 - 滚轮缩放深入观察 - 点击任意亮斑显示其信息 --- ## 🚀 后续扩展建议 | 功能 | 技术方案 | |------|--------| | 添加行系统 | 点击恒后弹出 mini 太阳系动画 | | 多种系类型 | 椭圆系、不规则系切换 | | 引力模拟 | 使用 Verlet 积分或 Barnes-Hut 算法做 N-body 模拟 | | WebGPU 加速 | 升级为 GPU 渲染级别 | | 存储探索记录 | localStorage 记录访问过的“恒” | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值