0%

最近WebShell支持了右键下载,这里总结下实现过程

说明

  1. 当前仅支持下载文件,暂不支持文件夹
  2. 使用技术栈

技术实现

  1. 文本选中

    • xterm.js支持双击选中部分文本,匹配模式为word,因此如果如果文件夹名称是hello world,那只能自己再拖拽选择了。
    • shell中无法具体直接识别字符是不是文件,文件夹还是PS1这类的提示符,通过Shell配置只是可以控制颜色,但是反向根据颜色来判断是否是文件夹这是没用的,毕竟主题不同,颜色值也会不同。
  2. 文件所在目录即Current Working Directory

    • 这个需要Shell integration来解决,本质就是函数钩子,在每次执行一条命令结束时获取当前所在目录并发送消息出来。同时目录信息存储在隐藏字符中避免显示到终端上,程序中我们持续提取当前目录即可。

      1
      2
      3
      4
      source /usr/local/bash-precmd/bash-preexec.sh
      preexec() { printf "\x1B]1337;PreExec;Timestamp=$(date +%s);\x7"; }

      precmd() { printf "\x1B]1337;PostExec;Exit=$?;CurrentDir=$(pwd);Timestamp=$(date +%s);\x7"; }
    • 有了目录,同时支持选中文件,最基础的执行下载就OK了。

  3. 目录历史

    • 如果说用户选中最新一行的文件那没问题,但是终端下,每一行信息所在的目录是不同的,因此CWD要持续记录
    • 记录的标准并不应该按照xterm显示终端的行号进行一对一,因为比如一个ls命令显示文件列表,可能会具体显示为2行,因此最佳的方式是CWD针对这次写入终端信息所在的N行对齐即可
  4. 获取文件信息

    • 选中文本并不能保证一定是个文件,因此我们还需要根据选中文本能够识别出文件类型/大小/权限等等。ssh2-sftp-client下有stat方法可以支持

    • stat方法返回的mode值是二进制,比如33279,需要转化后才可以具体指导rwx权限

      1
      (rslt.mode& parseInt('777', 8)).toString(8)
    • 针对软链接类型文件,list接口返回的类型为l,但是stat方法返回的isSymbolicLink却是false,这种情况两者不一致,目前还没有解决办法。

  5. 文件下载

    • 在明确了可以下载的前提下,执行下载方法就很多了。ssh2-sftp-client下提供的get,或者fastGet均可实现下载,如果是终端连接的ssh会话也可以走sz下载均可。
    • 空文件下载以上方法均支持,只是注意针对get的流方法,该流的onData数据不会被触发,但end方法可以正常执行。

写在最后

支持了右键下载,下载的体验就会更舒服流畅,但背后的下载执行仍然是跟其它下载方式一致。

最近家人也换了iPhone,进入苹果生态,这里研究下家人共享,试图用该方式让家人免费+便捷的用上我使用多年的苹果生态服务。

官方文档对于家人共享说的含糊不清,因此踩了坑。这里总结下,整体来说家人共享还是挺香的,推荐那些自己买了一大堆苹果生态服务的用户,通过家人共享可以在不再二次开销的基础上让他人也用上部分优秀服务。OK,开始。

https://static.1991421.cn/2022/2022-11-05-220803.jpeg

家人共享

该功能可以这么理解,家人共享类似于平常开通的YouTube家庭会员/Spotify家庭会员。家人共享服务涵盖多种

  1. iCloud,AppleMusic,Apple TV等订阅服务

    • 一般Apple会员拼车即采用的该方式,比如iCloud空间,发起人并不能直接通过配置来限制每个人可用大小,整个空间大小是共享的
  2. AppStore购买App[不包含内购服务]

    • 内购不支持,比如MarginNote本身App免费下载,但是Pro功能是内购的,那么家人共享并不会共享Pro服务,家人还需要单独购买。但比如Things本身付费购买,这种就可以。
  3. 位置信息等,其它请以官网为主

  4. 家人共享是按账户共享,iPhone/Mac均会加入

    阅读全文 »

最近朋友推荐GitHub Copilot,开放心态尝试下。目前使用还比较初级,但觉得确实不错,这里mark下。

https://static.1991421.cn/2022/2022-10-30-125301.jpeg

使用门槛

GitHub Copilot已是付费订阅模式,如果想免费申请使用,有以下几种情况

免费

  1. 学生验证
  2. 热门开源项目的维护人员-主要贡献者-1年免费
    • 在访问订阅页面时如果没有提示免费,则证明不满足热门开源项目要求。

不满足上述情况,只能走订阅了,价格如下

订阅

  1. 付费订阅开通后会有2个月免费试用期,之后开始付费。
  2. 10刀/月或100刀/年,需要有Visa卡绑定支付。

如果想查询当前订阅状态/有效期状态,访问该页面

网络

除了本身付费之外为了正常使用GitHub/Copilot都需要网络健康,因此需要确保IDE或电脑本身代理OK。如果你GitHub都无法稳定访问,那么无法正常使用Copilot。

设置

在开通时会有一些设定,比如是否允许贡献我的代码片段,如果是公司项目还是建议拒绝为好。后期想修改这些设置,访问该页面

安装配置

在确保账户开通了使用权限后,即可在对应IDE中安装使用,这里我使用WebStorm

  1. 订阅/试用

    无论哪种方式先开通Copilot服务,确保可用

  2. 安装GitHub Copilot插件

https://static.1991421.cn/2022/2022-10-30-123048.jpeg

  1. 插件中选择登录

https://static.1991421.cn/2022/2022-10-30-123143.jpeg

  1. 安装提示打开网页,粘贴设备码提示设备连接成功后返回IDE

https://static.1991421.cn/2022/2022-10-30-123306.jpeg

看到如上提示后即可正常使用

使用技巧

  1. 注释说明或直接代码编写都会唤起Copilot提示,按tab键即可选中补全
  2. 中英文注释均可,但推荐英文注释
  3. 针对补全或切换上下建议热键可以在设置-插件部分自定义

写在最后

  • 个人还在试用阶段,目前感觉不错,毕竟网上检索代码,或者在自己的code snippet中检索效率偏低,而现在有个可以根据上下文自动提示代码片段还是很方便的。

相关文档

最近本地docker构建node项目时报错Cannot use import statement outside a module”,”event”:”uncaughtException。排查解决后,这里mark下。

环境说明

  • NodeJS版本为v12
  • 整个项目是CommonJS规范

错误含义

根据错误栈最后查到是node_modules/axios/lib/core/buildFullPath.js位置。本地开发环境下查看文件并没有问题,但进入docker容器中查看果然该文件中采用的ES import写法。由此确定根本问题。

原因追溯

  1. docker构建时package.lock文件及Node版本都是确定的,按理应该是与开发环境高度一致,但现在出现了不一致,只有可能是docker构建存在缓存之类的。

  2. 查看历史发现之前我曾安装过axios@latest即v1版本,因为安装时不指定版本即会走最新版。查看v1版发布包,发现内容已经变成了ES版本,所以大概原因应该是这样,docker构建环节的问题。查询发现docker builder prune可以清除构建缓存。因此尝试下,重新构建发现OK。

SSH登录失败如遇到kex_exchange_identification: read: Connection reset by peer,可以根据如下步骤排查

ssh时,v参数用于调试信息打印,从信息里可以看到,服务端并没有发送任何消息,如果第一步通讯正常应该或发送远程协议版本信息。

https://static.1991421.cn/2022/2022-10-20-203719.jpeg

大致可能会有几个地方影响

  1. /etc/ssh/sshd_config

    排查端口是否正确,可能并不是22,如果修改配置,需要重启服务生效service sshd restart

  2. /etc/hosts.allow/etc/hosts.deny

    默认两个文件配置会是空状态,没有任何生效配置

注意上述配置文件vi需要sudo或root用户