标签: 软件

  • 如何增强互联网的记忆力?

    IPFS(InterPlanetary File System)是一个点对点的媒体传输协议,旨在建立一个持久的、分布式的文件系统。它通过内容寻址的方式来定位和获取文件,使得文件在网络中具有高可用性的特性[2]。而dreamlink.cloud是一个基于IPFS的静态网站,提供了一系列在去中心化P2P网络上运行的工具[1]

    以下是对IPFS和dreamlink.cloud的介绍:

    IPFS的特点:

    • 去中心化:IPFS没有特权节点,所有节点都是平等的,任何用户都可以存储和分享文件内容[2]
    • 内容寻址:IPFS使用内容的哈希值作为文件的唯一标识,通过请求哈希值来获取文件内容,而不是通过地址寻址[2]
    • 高可用性:IPFS中的文件可以被存储在成千上万的节点中,即使某个节点宕机或下线,其他节点仍然可以获取到文件内容[2]
    • 安全性:IPFS使用哈希值来校验文件内容的完整性,如果文件在传输过程中被篡改,哈希值将与请求的哈希值不一致,从而保证了数据的安全性[2]

    dreamlink.cloud的特点:

    • 无需安装IPFS节点:dreamlink.cloud提供了一个在Web浏览器中运行的IPFS节点,用户无需自行安装节点即可使用IPFS功能[1]
    • 无限制的文件分享:用户可以上传文件和文件夹,没有账户、大小或带宽限制,实现自己的文件提供者角色[1]
    • 分布式搜索:通过ipfs-search.com进行文件和文件夹的搜索[1]
    • 文本粘贴板:用户可以创建和分享任何文本格式的内容[1]
    • 加密P2P聊天室:用户可以创建加密的P2P聊天室,与信任的人进行自由通信[1]

    IPFS和dreamlink.cloud的优势:

    • 高可用性和抗审查:IPFS的去中心化特性使得文件具有高可用性和抗审查的能力,而dreamlink.cloud作为基于IPFS的静态网站,进一步增强了这些特性[2]
    • 无需中心化服务器:与传统的互联网不同,IPFS和dreamlink.cloud不依赖于中心化的服务器托管商,任何人都可以注册一个节点,成为一个高效的文件提供者[2]

    IPFS是一个点对点的媒体传输协议,通过内容寻址的方式实现高可用性的分布式文件系统。而dreamlink.cloud则是一个基于IPFS的静态网站,提供了无需安装IPFS节点的文件分享、搜索、文本粘贴板和加密P2P聊天室等功能。


    Learn more:

    1. GitHub – opendreamnet/dreamlink.cloud: Static website with tools running entirely on IPFS.
    2. IPFS 介绍 | Verne in GitHub
    3. What Is the Interplanetary File System (IPFS) and How Do You Use It?
  • 【Excel】把金额的阿拉伯数字转换成中文大写

    在Excel中,你可以使用以下方法将金额的阿拉伯数字转换成中文大写:

    方法一:使用内置格式

    1. 将阿拉伯数字输入到一个单元格中。
    2. 选中该单元格,右键点击并选择”设置单元格格式”,或者使用快捷键CTRL+1来打开”设置单元格格式”对话框。
    3. 在”设置单元格格式”对话框中,选择”数字”选项卡。
    4. 在”分类”列表中选择”中文大写数字”。
    5. 确认并关闭对话框,你会发现该单元格中的阿拉伯数字已经被转换成了中文大写数字[2]

    方法二:使用公式

    1. 在一个单元格中输入以下公式:
       =IF(MOD(A1,1)=0,TEXT(INT(A1),"[DBNUM2]")&"元整",TEXT(INT(A1),"[DBNUM2]")&"元"&TEXT(MID(A1,LEN(INT(A1))+2,1),"[DBNUM2]D角")&TEXT(MID(A1,LEN(INT(A1))+3,1),"[DBNUM2]D分"))

    其中,A1是包含阿拉伯数字的单元格,你可以根据实际情况进行调整。

    1. 按下Enter键,该单元格将显示转换后的中文大写金额[2]

    方法三:使用VBA宏
    如果你需要在多个单元格中进行批量转换,你可以使用VBA宏来实现。以下是一个示例的VBA代码:

    Sub ConvertToChinese()
        Dim rng As Range
        Dim cell As Range
    
        Set rng = Selection ' 选择要转换的单元格范围
    
        For Each cell In rng
            cell.Value = Application.WorksheetFunction.Text(cell.Value, "[DBNUM2]")
        Next cell
    End Sub
    1. 打开Excel,按下ALT+F11打开VBA编辑器。
    2. 在VBA编辑器中,插入一个新的模块。
    3. 将上述VBA代码复制粘贴到新的模块中。
    4. 关闭VBA编辑器。
    5. 选中要转换的单元格范围。
    6. 按下ALT+F8打开宏对话框。
    7. 选择”ConvertToChinese”宏,并点击”运行”按钮。
    8. 选中的单元格将被转换成中文大写金额[2]

    请注意,以上方法适用于Excel的大多数版本。如果你使用的是其他版本或者有特定的需求,请参考相关文档或搜索更多资源。

    参考文献:
    [1] Excel表格中数字转中文大写怎么做?这里总有需要的那一种方法 – 腾讯云开发者社区-腾讯云
    [2] 百度知道 – 信息提示


    Learn more:

    1. 百度知道 – 信息提示
    2. Excel表格中数字转中文大写怎么做?这里总有需要的那一种方法 – 腾讯云开发者社区-腾讯云
    3. 百度知道 – 信息提示
  • 调整 PHP-FPM 以获得超高的服务器性能

    这篇文章提供了一个关于如何通过调整 PHP-FPM 设置来优化服务器内存使用并提高性能的逐步指南。

    步骤 1:确定 PHP-FPM 进程的内存使用情况

    • 运行以下命令以显示按 RSS(常驻集大小,即进程实际使用的物理内存量)排序的 php-fpm 进程:
       ps -ylC php-fpm7.3 --sort:rss 
    • 注意每个 php-fpm 进程使用的内存量(以 KB 或 GB 为单位)。

    步骤 2:估算其他进程的内存消耗

    • 运行 top 命令。
    • 按三次 < 键以按 RES(常驻内存大小)排序。
    • 确定 MySQL 和 Apache 等其他进程使用的内存量。

    步骤 3:为 PHP-FPM 分配内存

    • 根据服务器上的可用内存和步骤 1 和 2 中确定的内存使用情况,为 PHP-FPM 分配一定数量的内存。
    • 例如,如果您可以为 PHP-FPM 分配 2GB 内存,并且每个进程使用 0.15GB,则可以运行大约 13 个子进程 (2 / 0.15 = 13.33)。

    步骤 4:配置 PHP-FPM

    • 打开 PHP-FPM 配置文件:
       sudo nano /etc/php/7.x/fpm/pool.d/www.conf
    • 找到以下设置并根据您的计算结果进行调整:
      • pm = dynamic:将此设置为 dynamic 以允许 PHP-FPM 根据需要动态调整子进程的数量。
      • pm.max_children = 12:设置 PHP-FPM 可以创建的最大子进程数。
      • pm.min_spare_servers = 2:设置空闲状态下保持的最小服务器进程数。
      • pm.max_spare_servers = 4:设置空闲状态下保持的最大服务器进程数。
      • pm.start_servers = 12:设置 PHP-FPM 启动时启动的服务器进程数。
      • pm.max_requests = 500:设置每个子进程在重启之前可以处理的最大请求数,以防止内存泄漏。

    步骤 5:保存并重新启动 PHP-FPM

    • 保存配置文件。
    • 重新启动 PHP-FPM 以使更改生效:
       sudo service php7.3-fpm restart

    步骤 6:监控内存使用情况

    • 在进行更改后,请持续监控服务器的内存使用情况,以确保 PHP-FPM 性能最佳,并且不会导致内存不足的问题。

    在 PHP 8 中,您无法完全关闭垃圾回收(GC)机制。

    PHP 的垃圾回收器是其内存管理的核心部分,对于确保脚本运行时的稳定性和防止内存泄漏至关重要。

    尽管您无法禁用 GC,但您可以通过以下方式影响其行为:

    • gc_disable() 函数: 这个函数可以暂时禁用垃圾回收器的运行。 然而,这并不会阻止 PHP 引擎跟踪引用计数。 一旦 gc_enable() 被调用或者脚本结束,垃圾回收器会重新启动并清理不再需要的变量。
    • 修改 php.ini 配置文件: 您可以调整 zend.enable_gc=Off 来禁用循环引用收集器。 将其设置为 Off 会阻止 PHP 引擎检测和清理循环引用,但这可能会导致潜在的内存泄漏,尤其是在处理大量对象和复杂数据结构时。

    重要提示:

    • 强烈建议不要尝试完全禁用 PHP 的垃圾回收机制。 这样做可能会导致不可预测的行为,包括内存泄漏、性能下降,甚至导致 PHP 进程崩溃。
    • 如果您在脚本运行期间遇到与 GC 相关的性能问题,请先尝试优化代码以减少对象创建和循环引用的数量,而不是尝试禁用 GC。

  • SSE (Server-Sent Events) 概念和工作原理

    一、什么是 SSE?

    Server-Sent Events (SSE) 是一种服务器推送技术,允许服务器单向地将数据推送给客户端。与传统的客户端请求-服务器响应模式不同,SSE 允许服务器在任何时候主动向客户端发送数据,而无需客户端明确请求。

    二、SSE 的工作原理

    1. 建立连接: 客户端使用 EventSource API 建立到服务器的持久 HTTP 连接。
    2. 订阅事件流: 服务器端会生成一个事件流,并将数据以文本流的形式发送给客户端。
    3. 接收和处理数据: 客户端监听 message 事件,并在接收到数据时进行处理。
    4. 保持连接: 连接会一直保持,直到客户端或服务器断开连接。

    三、SSE 的特点

    • 单向推送: 数据传输方向是从服务器到客户端,客户端不能向服务器发送数据。
    • 基于 HTTP 协议: SSE 使用 HTTP 协议进行通信,无需额外的协议支持。
    • 轻量级: SSE 相比 WebSocket 更轻量级,更易于实现和维护。
    • 实时性: SSE 可以实现实时数据推送,但相较于 WebSocket 会有一定的延迟。

    四、SSE 的应用场景

    • 实时数据更新: 例如股票报价、新闻推送、社交媒体通知等。
    • 进度条显示: 例如文件上传、下载进度等。
    • 聊天应用: 例如简单的聊天室、客服系统等。

    五、SSE 与 WebSocket 的比较

    特性SSEWebSocket
    数据传输方向单向双向
    协议HTTPWebSocket
    复杂度
    实时性较低
    应用场景单向数据推送双向实时通信

    六、总结

    SSE 是一种简单高效的服务器推送技术,适用于单向实时数据推送的场景。它易于实现和维护,并且可以与现有 HTTP 基础设施良好兼容。

  • UDP打洞穿透NAT:突破网络限制的利器

    在现代网络通信中,我们常常遇到一个问题:由于网络中存在防火墙和NAT设备,使得处于不同网络环境下的计算机难以直接进行通信。为了解决这个问题,人们提出了各种技术和协议,其中UDP打洞穿透NAT成为了一种有效的解决方案。本文将深入探讨UDP打洞穿透NAT的原理和实现方法。

    NAT和NAT穿透

    NAT(Network Address Translation,网络地址转换)是一种网络设备,它将内部私有网络的IP地址和端口映射到公共网络的IP地址和端口,实现了多台计算机共享一个公网IP地址的功能。然而,NAT的存在也带来了一些问题,比如内网中的计算机无法直接被外网访问,导致了通信的限制。

    为了解决NAT带来的通信限制,人们提出了NAT穿透(NAT Traversal)的概念。NAT穿透是一种技术,通过各种手段和协议,使得处于不同网络环境下的计算机能够直接进行通信,而不需要经过中间服务器的转发。其中,UDP打洞就是一种常用的NAT穿透技术。

    UDP打洞的原理

    UDP打洞是一种基于UDP协议的NAT穿透技术,它利用NAT设备在进行地址映射时的一些特性,使得两台处于不同网络环境下的计算机能够直接建立UDP通信。

    在UDP打洞过程中,首先要确定自己的NAT类型。根据NAT设备在进行地址映射时行为的不同,NAT可以分为以下四种类型:Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。判断自己的NAT类型可以使用一些工具或库,如PyStun。

    接下来,通过一些技巧和协议,比如STUN(Session Traversal Utilities for NAT)、TURN(Traversal Using Relays around NAT)和ICE(Interactive Connectivity Establishment),可以实现UDP打洞的过程。简单来说,UDP打洞的过程包括以下几个步骤:

    1. 客户端A向位于公网上的STUN服务器发送Binding Request消息,获取经过NAT转换后的公网地址和端口。
    2. 客户端A将获得的公网地址和端口发送给客户端B。
    3. 客户端B将自己的公网地址和端口发送给客户端A。
    4. 客户端A和客户端B尝试通过各自的NAT设备向对方发送UDP数据包。
    5. 如果两台设备的NAT设备允许数据包通过,那么它们就可以直接建立UDP通信。

    UDP打洞的实现

    为了更好地理解UDP打洞的实现过程,我们可以借助一些开源库,如ice4j。ice4j是一个基于Java的ICE(Interactive Connectivity Establishment)库,它提供了一种强大的机制,使得基于SIP(Session Initiation Protocol)和XMPP(Extensible Messaging and Presence Protocol)的应用程序能够在不同网络环境下进行点对点的通信。

    ice4j库的使用示例可以参考文献[1]中的代码。在实际应用中,我们可以根据具体的需求和网络环境进行相应的配置和调整,以实现UDP打洞的功能。

    UDP打洞的应用举例

    UDP打洞在网络通信中有着广泛应用。以下是一些常见的应用场景:

    1. 实时音视频通信:UDP打洞可以使得两台设备在不同网络环境下直接建立音视频通信,实现实时的语音和视频传输。
    2. P2P文件传输:UDP打洞可以使得两台设备在不同网络环境下直接进行文件传输,而不需要通过中间服务器的转发。
    3. 多人游戏联机:UDP打洞可以使得多台设备在不同网络环境下直接进行游戏联机,提供更好的游戏体验和互动性。
    4. IoT设备通信:UDP打洞可以使得不同的物联网设备在不同网络环境下直接进行通信,实现智能家居、智能城市等领域的互联互通。

    需要注意的是,UDP打洞虽然是一种有效的NAT穿透技术,但并不是万能的解决方案。在实际应用中,仍然需要考虑网络环境、安全性、稳定性等因素,并根据具体的需求选择合适的技术和协议。

    结语

    通过UDP打洞穿透NAT,我们可以突破网络限制,使得处于不同网络环境下的计算机能够直接进行通信。UDP打洞的实现依赖于一些技巧和协议,如STUN、TURN和ICE。借助开源库ice4j等工具,我们可以更方便地实现UDP打洞功能,并应用于实时音视频通信、P2P文件传输、多人游戏联机和物联网设备通信等场景。

    参考文献:
    [1] 试验UDP打洞穿透NAT_ice4j-CSDN博客, https://blog.csdn.net/liwf616/article/details/45507457

  • 挖掘宝藏:五款你可能错过的VSCode实用插件

    对于程序员来说,VSCode 就像一把趁手的兵器,而插件则是让这把兵器更加锋利的神兵利器。你是否厌倦了千篇一律的插件推荐?今天,就让我们跳出“Prettier”等耳熟能详的选择,一起探索五款功能强大却鲜为人知的 VSCode 扩展,助你提升代码效率,开启全新编程体验!

    1. Error Lens:让错误无处遁形

    还记得在“问题”面板中上下翻找错误信息的痛苦吗?Error Lens 将彻底终结这种低效!它能够直接在代码编辑器中,将错误信息清晰地显示在对应行的旁边,并用醒目的颜色高亮显示。从此,告别繁琐的查找,一眼就能发现并解决问题。

    2. Console Ninja:化身控制台忍者

    在代码和控制台之间来回切换,只为查看几行日志?Console Ninja 助你摆脱这种重复劳动!它可以直接在编辑器中显示控制台输出和运行时错误,让你无需离开代码编辑界面,就能轻松掌控程序运行状态。

    3. Pretty TypeScript Errors:告别冗长的TS报错信息

    TypeScript 固然强大,但其冗长复杂的错误信息也常常令人头疼。Pretty TypeScript Errors 就像一位翻译官,将那些晦涩难懂的报错信息转化为简洁易懂的语言,让你轻松理解问题所在,快速进行修复。

    4. Hungry Delete:一键清除多余空格

    还在用 Backspace 键一个一个地删除多余空格或制表符吗?Hungry Delete 让你只需按下 CTRL + BACKSPACE,就能瞬间清除光标前后的所有空白字符,让你的代码更加整洁高效。

    5. Add gitignore:快速生成 .gitignore 文件

    创建 .gitignore 文件是每个项目都绕不开的步骤。Add gitignore 提供了丰富的模板,让你可以根据项目类型快速生成 .gitignore 文件,省去手动添加的烦恼,将更多精力集中在代码创作上。

    参考文献:

    • Gent. (2023, June 1). 🌟 Discover 5 Must-Have VSCode Extensions You Haven’t Tried Yet. DEV Community. https://dev.to/g3nt/discover-5-must-have-vscode-extensions-you-havent-tried-yet-185m
  • 去中心化社交协议:Nostr、ActivityPub、Farcaster 和 Lens Protocol 的比较

    本文将对四种主流的去中心化社交协议:Nostr、ActivityPub、Farcaster 和 Lens Protocol 进行比较分析,探讨它们的核心理念、主要功能、优缺点以及目标用户群体。

    评估去中心化社交协议的关键因素:

    • 账户创建和通信:用户如何在不依赖中心化服务器的情况下创建账户并进行互动?
    • 数据存储和社交图谱:用户数据(包括社交关系和内容)存储在哪里,如何访问?
    • 内容审核:协议如何解决垃圾邮件和有害内容等问题,同时维护言论自由原则?
    • 激励机制:如何激励服务提供商维护网络并确保其长期可持续性?

    1. Nostr:

    • 核心理念:Nostr 构建在去中心化的中继网络之上,优先考虑抗审查性和用户对数据的控制权。
    • 主要功能:
      • 用户创建公私钥对以进行身份验证。
      • 消息广播到连接的中继,并传递给连接到相同中继的用户。
      • 中继没有义务存储数据,但有些提供付费存储选项。
      • 内容审核由各个中继自行决定。
    • 优点:高度抗审查、设计简洁、方便使用比特币闪电网络支付。
    • 缺点:数据持久性可能是一个问题,由于缺乏集中审核,垃圾邮件和有害内容的风险增加。
    • 目标用户:比特币爱好者、隐私倡导者、寻求抗审查的用户。

    2. ActivityPub:

    • 核心理念:一种联合社交协议,类似于电子邮件,可实现互操作的社交网络。
    • 主要功能:
      • 用户在特定的实例(服务器)上创建帐户。
      • 实例之间相互通信以传递消息和共享数据。
      • 用户可以导出数据并迁移到其他实例。
      • 内容审核由各个实例自行处理。
    • 优点:用户体验熟悉,成熟的应用程序(如 Mastodon),允许具有不同审核政策的多元化社区。
    • 缺点:依赖实例管理员,实例关闭或审查的风险,缺乏针对实例运营商的明确激励机制。
    • 目标用户:寻求中心化社交媒体平台替代方案的用户,具有特定兴趣或价值观的社区。

    3. Farcaster:

    • 核心理念:旨在创建一个具有强大的数据存储层和用户友好应用程序的去中心化社交网络。
    • 主要功能:
      • 利用以太坊进行用户注册和身份验证。
      • 采用中心网络进行实时数据同步。
      • 计划引入订阅模式以创收。
      • 内容审核方法仍在开发中。
    • 优点:高度重视数据的持久性和可用性,通过订阅实现可持续资金的潜力。
    • 缺点:架构复杂,如果中心数量有限,可能会出现中心化问题。
    • 目标用户:寻求 Twitter 的去中心化替代方案的用户,注重数据所有权和可靠性。

    4. Lens Protocol:

    • 核心理念:利用区块链技术赋予用户对其社交数据的所有权和控制权。
    • 主要功能:
      • 建立在 Polygon 区块链之上,使用户能够以 NFT 的形式拥有他们的社交图谱和内容。
      • 允许创建具有不同功能和盈利模式的去中心化社交应用程序。
      • 强调应用程序之间的可组合性和互操作性。
      • 内容审核可以在应用程序级别实施。
    • 优点:真正拥有社交数据,创新的社交应用程序和盈利策略的潜力。
    • 缺点:与区块链技术相关的可扩展性挑战,潜在的高昂 Gas 费用。
    • 目标用户:精通加密的用户,寻求将其内容货币化的创作者,构建去中心化社交应用程序的开发人员。

    结论:

    选择哪种去中心化社交协议取决于个人需求和优先级。Nostr 提供简单性和抗审查性,ActivityPub 提供熟悉的联合模型,Farcaster 专注于数据持久性和用户体验,Lens Protocol 则通过基于区块链的所有权赋予用户权力。随着该领域的不断发展,这些协议可能会继续创新,并吸引寻求中心化社交媒体平台替代方案的不同社区。

  • KerasCV和KerasNLP:视觉和语言的增强

    在机器学习领域,Keras是最常用的工具之一,它提供了高层次的抽象来构建和训练机器学习模型。近年来,计算机视觉(CV)和自然语言处理(NLP)的发展给从业者带来了新的挑战。一方面,随着模型规模的不断增大,从头开始训练一个最先进的模型变得成本过高;另一方面,有效的数据预处理和度量计算也变得更加困难。为了解决这些问题,研究人员提出了KerasCV和KerasNLP这两个库,它们是Keras API在CV和NLP领域的扩展。

    KerasCV和KerasNLP的设计目标:

    KerasCV和KerasNLP旨在提供易于使用且性能优越的工具,支持在JAX、TensorFlow或PyTorch等深度学习框架上运行,以促进快速实验和模型开发。它们采用了模块化和分层的设计思想,为用户提供了不同层次的抽象和灵活性。

    KerasCV和KerasNLP的主要功能:

    • 基础组件:KerasCV和KerasNLP提供了构建和训练预处理流水线、模型和评估逻辑的可组合模块。这些组件可以在Keras Domain Packages生态系统之外使用,具有高度的灵活性。
    • 预训练骨干模型:这些库还提供了预训练的模型骨干,可以用于微调。在NLP模型中,还可以创建匹配的分词器。
    • 任务模型:KerasCV和KerasNLP提供了专门针对特定任务的端到端模型,如NLP中的文字生成和CV中的对象检测。这些任务模型结合了底层API中的预处理和建模模块,可以直接在原始输入上进行训练和推理。
    • 高效训练支持:库支持XLA编译,提高了训练效率。使用tf.data API运行所有预处理,通过编译的TensorFlow操作图来实现高效的数据处理。
    • 统一的分布式API:KerasCV和KerasNLP兼容Keras统一分布式API,支持模型和数据的并行处理,简化了模型的分布式训练配置。
    • 开源和社区贡献:这两个库完全开源(Apache 2.0许可),在GitHub上可供用户下载和使用,鼓励社区贡献和协作。

    KerasCV和KerasNLP的性能表现:

    论文中提供了KerasCV和KerasNLP在不同模型上的性能测试结果。例如,使用NVIDIA A100 GPU进行的实验显示,KerasCV和KerasNLP在模型训练和推理方面具有良好的性能。论文还与HuggingFace Transformers库进行了比较,突出了KerasNLP和KerasCV的设计哲学和方法的优势。

    未来的研究方向:

    论文中还提出了一些可以进一步探索的研究方向。例如,扩展多模态模型的提供,以支持更广泛的应用;优化与后端特定大型模型服务解决方案的集成,确保无缝部署和可扩展性。

    总之,KerasCV和KerasNLP为CV和NLP领域的研究人员和从业者提供了强大而易用的工具。它们的模块化和分层设计使得构建和训练模型变得更加简单和高效。通过提供预训练的模型骨干和任务模型,以及支持XLA编译和tf.data API的高效训练支持,KerasCV和KerasNLP为CV和NLP任务的快速实验和模型开发提供了便利。

    参考文献:

    KerasCV和KerasNLP的相关论文:

    更多关于KerasCV和KerasNLP的信息可以在官方网站和GitHub上找到。

    • Matthew Watson, Divyashree Shivakumar Sreepathihalli, François Chollet, Martin Görner, Kiranbir Sodhia, Ramesh Sampath, Tirth Patel, Haifeng Jin, Neel Kovelamudi, Gabriel Rasskin, Samaneh Saadat, Luke Wood, Chen Qian, Jonathan Bischof, Ian Stenbit. “KerasCV and KerasNLP: Vision and Language Power-Ups.” [PDF8].
    • François Chollet, et al. “Keras: The Python Deep Learning library.” Journal of Machine Learning Research 22.3 (2021): 1-7.
    • Thomas Wolf, et al. “Transformers: State-of-the-Art Natural Language Processing.” Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing: System Demonstrations. 2020.

    原始论文:

    • [PDF8] KerasCV and KerasNLP: Vision and Language Power-Ups
  • S3D:低内存GPU上的自推测解码方案

    引言

    大型语言模型(Large Language Models,LLMs)在自然语言处理领域起着重要作用,能够生成人类语言的连续文本,为我们提供强大的语言处理能力。然而,LLMs在推理过程中面临一个重要问题,即幻觉(Hallucination)问题。幻觉指的是模型生成看似合理但实际上不准确的信息,这可能导致误导性的结果和信息的传播。

    为了更好地理解和解决LLMs中的幻觉问题,研究者们进行了大量的研究工作。其中一篇关于幻觉问题的研究论文是《S3D: A Simple and Cost-Effective Self-Speculative Decoding Scheme for Low-Memory GPUs》。这篇论文提出了一种名为Skippy Simultaneous Speculative Decoding(简称S3D)的自推测解码方案,旨在解决在低内存GPU上进行LLM推理时的性能和内存限制问题。

    S3D方案解决的问题

    S3D方案的目标是解决在低内存GPU上进行LLM推理时的性能和内存限制问题。传统的推测解码方法在高端设备上实现了显著的加速,但在低内存设备上却存在性能下降的问题。此外,量化带来的内存开销也限制了LLMs在低内存GPU上的应用。因此,S3D方案旨在提供一种成本效益高、适用于低内存GPU的自推测解码方法。

    相关研究

    在幻觉问题的研究领域,已经有许多相关研究取得了重要进展。其中,早期的推测解码方法、多标记预测、雅可比迭代方法、层跳过技术以及其他SD系统等都与S3D方案有一定的关联。

    S3D方案的关键内容

    S3D方案提出了Skippy Simultaneous Speculative Decoding(S3D)方法,通过同时多标记预测和中层跳过的方式实现自推测解码。S3D方法不需要额外的显存成本,同时具备高训练效率。与其他SD系统相比,S3D方法在性能-内存比率方面表现出色,且无需进行大规模的架构调整和训练数据的修改。

    实验验证

    论文中进行了一系列实验来验证S3D方案的性能。实验结果表明,S3D在性能-内存比率方面表现出色,相较于其他开源SD系统,具有更好的性能。此外,论文还进行了成本效益和速度的比较实验,验证了S3D方案的有效性和实用性。

    进一步的研究方向

    尽管S3D方案已经取得了一定的研究成果,但仍有一些潜在的研究方向值得进一步探索。这些方向包括适配器技术、更广泛的硬件评估、更深入的超参数优化、模型泛化能力、量化和稀疏性、并行化和分布式训练、实时应用、鲁棒性和错误分析、与其他优化技术的集成、用户研究和应用案例等。

    通过进一步的研究探索,可以更好地理解S3D方案的潜绪和局限性,并推动其在更广泛的领域中的应用。

    结论

    《S3D: A Simple and Cost-Effective Self-Speculative Decoding Scheme for Low-Memory GPUs》论文提出了一种名为S3D的自推测解码方案,旨在解决低内存GPU上进行LLM推理时的性能和内存限制问题。S3D方案通过同时多标记预测和中层跳过的方式实现自推测解码,具备成本效益高、训练效率高的优点。实验结果表明S3D在性能和内存比率方面表现出色,并具有实际应用的潜力。进一步的研究可以在适配器技术、更广泛的硬件评估、模型泛化能力等方面开展,以推动S3D方案的发展和应用。

    参考文献:

    • Wei Zhong, Manasa Bharadwaj. “S3D: A Simple and Cost-Effective Self-Speculative Decoding Scheme for Low-Memory GPUs.” 2024.

    S3D (Skippy Simultaneous Speculative Decoding) is a simple and cost-effective self-speculative decoding scheme designed for low-memory GPUs. It aims to achieve fast inference, low VRAM costs, and high training efficiency [1].

    Speculative decoding (SD) is a technique that accelerates low-latency model (LLM) inference without sacrificing quality. It works by drafting tokens at a faster speed and then verifying the guessed tokens at the end of an iteration using a full forward pass. However, existing SD methods often achieve optimal performance on high-end devices or with a substantial GPU memory overhead. When applied to smaller models or low-memory devices where quantization is necessary, these methods can experience significant slowdowns [1].

    To address these challenges, S3D introduces mid-layer skipping and simultaneous multi-token predictions. It offers no added VRAM costs and high training efficiency. By leveraging memory efficiency, S3D demonstrates optimal performance-memory ratios among recent open-source SD models. It can avoid significant quantization overheads under certain VRAM constraints and outperform previous SD methods under 8-bit quantization by up to 3.9x in speedups on A10G GPU [1].

    S3D also provides optimal hyper-parameters by formalizing the relationship between the number of skipped layers and speedup in self-speculative decoding. It can verify the optimal number of token predictors, leading to improved performance [1].

    In summary, S3D is a cost-effective self-speculative decoding scheme that achieves fast inference, low VRAM costs, and high training efficiency for low-memory GPUs. It overcomes the limitations of existing SD methods and demonstrates optimal performance-memory ratios [1].


    Learn more:

    1. S3D: A Simple and Cost-Effective Self-Speculative Decoding Scheme for Low-Memory GPUs
    2. GitHub – hemingkx/SpeculativeDecodingPapers: 📰 Must-read papers and blogs on Speculative Decoding ⚡️
    3. [2309.08168] Draft & Verify: Lossless Large Language Model Acceleration via Self-Speculative Decoding

    S3D是一种简单且经济高效的自我推测解码方案,专为低内存GPU设计。该方法通过同时进行多令牌解码和中间层跳过来实现推测解码,既不增加显存开销,又具有高训练效率[1]

    S3D的主要特点和贡献包括:

    1. 有效的自我推测解码:S3D采用了中间层跳过和同时进行多令牌预测的简单且节省内存的自我推测解码方案。相比之前的方法,S3D在较小的模型上克服了速度上的限制[1]
    2. 最优超参数:S3D通过对自我推测解码中跳过层数和速度提升之间关系的形式化研究,确定了最优的令牌预测器数量[1]
    3. 最优速度-内存比:S3D在最近的开源自我推测解码模型中展现出最优的性能-内存比。通过利用内存效率,S3D可以避免在特定显存限制下进行量化时产生的显著开销,并在A10G GPU上在8位量化下比之前最快的SD方法(EAGLE)提升了3.9倍的速度[1]

    相关工作方面,早期的自我推测解码方法主要集中在特定领域任务上,如翻译和语法错误修正,这些任务很容易实现显著的加速。而S3D则针对通用领域任务,通过同时预测多个令牌和非批处理解码来节省内存并提高训练效率[2]


    Learn more:

    1. S3D: A Simple and Cost-Effective Self-Speculative Decoding Scheme for Low-Memory GPUs
    2. [2405.20314] S3D: A Simple and Cost-Effective Self-Speculative Decoding Scheme for Low-Memory GPUs
    3. GitHub – hemingkx/SpeculativeDecodingPapers: 📰 Must-read papers and blogs on Speculative Decoding ⚡️
  • 通俗易懂:理解ICE协议及其Java实现ice4j

    引言

    在网络通信中,当涉及到穿越网络地址转换(NAT)设备时,传统的通信协议可能会面临一些挑战。为了解决这个问题,我们需要使用一种特殊的协议来实现穿越NAT设备的功能。其中一种常用的协议是ICE(Interactive Connectivity Establishment)协议,它将STUN(Simple Traversal of UDP through NAT)和TURN(Traversal Using Relays around NAT)等工具结合起来,为基于Offer/Answer的协议(如SIP和XMPP)提供了一种强大的穿越NAT的机制。

    在本文中,我们将介绍ICE协议及其在Java中的实现ice4j。我们将详细讨论ICE协议的原理、作用,以及ice4j项目的特点和用途。让我们一步步深入了解ICE协议及其Java实现ice4j吧!

    ICE协议的原理和作用

    ICE协议是一种用于解决NAT穿越问题的协议。它通过结合STUN和TURN等工具,提供了一种机制来使基于Offer/Answer的协议能够穿越NAT设备。

    ICE协议的核心思想是在通信的两端(称为对等体)之间建立一个可靠的连接。ICE协议通过以下步骤实现穿越NAT的功能:

    1. 收集候选地址:对等体收集自己的IP地址和端口号,并将其作为候选地址。这些候选地址可以是本地的IP地址,也可以是通过STUN服务器获取的公网地址。
    2. 建立连接:对等体之间交换候选地址,然后根据一系列规则和优先级选择最佳的候选地址来建立连接。
    3. NAT穿越:如果对等体之间的直接连接无法建立,ICE协议将尝试使用TURN服务器作为中继来实现穿越NAT。

    通过以上步骤,ICE协议能够有效地解决NAT穿越的问题,确保通信双方能够建立可靠的连接。

    ice4j项目的特点和用途

    ice4j是一个用Java实现的ICE协议库,它提供了一些特色功能和用途,使其成为开发者们首选的ICE协议实现之一。

    1. 简化开发:ice4j提供了一套简单易用的API,使开发者能够快速、方便地集成ICE协议功能到他们的应用程序中。
    2. 支持Pseudo TCP:除了基本的ICE功能,ice4j还支持Pseudo TCP协议,这是一种通过UDP模拟TCP连接的技术。它提供了可靠的数据传输,并通过模拟TCP的流量控制和拥塞控制来优化传输性能。
    3. Socket共享:ice4j支持在多个应用程序之间共享同一个UDP套接字,这样可以有效地减少网络资源的占用。

    通过使用ice4j,开发者们可以轻松地实现ICE协议的功能,从而使他们的应用程序能够在复杂的网络环境中实现可靠的通信。

    ice4j的应用举例

    以下是一些使用ice4j的典型应用场景:

    1. 即时通信应用:ice4j可以用于构建支持实时音视频通信的应用程序,如视频会议、在线聊天等。它能够帮助应用程序穿越NAT设备,实现可靠的点对点通信。
    2. WebRTC应用:WebRTC是一种用于在Web浏览器中实现实时通信的技术,而ICE协议是WebRTC的核心组成部分之一。通过使用ice4j,开发者可以轻松地在WebRTC应用中实现NAT穿越和建立可靠的连接。
    3. 网络游戏:在网络游戏中,玩家之间需要建立可靠的连接以进行实时游戏交互。通过使用ice4j,开发者可以实现游戏服务器和客户端之间的可靠通信,提供流畅的游戏体验。

    总结

    ICE协议及其Java实现ice4j为解决NAT穿越问题提供了一种强大的机制。通过收集候选地址、建立连接和使用中继服务器,ICE协议能够实现可靠的点对点通信。ice4j作为ICE协议的Java实现,提供了简化开发、支持Pseudo TCP和Socket共享等特色功能,使开发者能够轻松地集成ICE协议功能到他们的应用程序中。

    参考文献:

  • ActivityPub:去中心化社交网络协议

    ActivityPub 是一个去中心化的社交网络协议,基于 ActivityStreams 2.0 数据格式。它提供了从客户端到服务器的 API,用于创建、更新和删除内容,以及一个从服务器到服务器的 API,用于传递通知和内容。本文将深入探讨 ActivityPub 的核心概念和实现方式。

    什么是 ActivityPub?

    ActivityPub 是一种标准化的协议,旨在实现去中心化的社交网络。它包括两个主要部分:

    1. 客户端到服务器的协议:允许用户(包括真实用户、机器人和其他自动化进程)通过他们在服务器上的账户与 ActivityPub 通信。这可以通过手机、桌面应用或网页应用实现。
    2. 服务器到服务器的协议:使去中心化网站能够共享信息和内容。

    基本概念

    在 ActivityPub 中,用户通过其在服务器上的账户表示为“actors”。每个 actor 都有一个收件箱(inbox)和发件箱(outbox),用于接收和发送消息。

    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Person",
      "id": "https://social.example/alyssa/",
      "name": "Alyssa P. Hacker",
      "preferredUsername": "alyssa",
      "summary": "Lisp enthusiast hailing from MIT",
      "inbox": "https://social.example/alyssa/inbox/",
      "outbox": "https://social.example/alyssa/outbox/",
      "followers": "https://social.example/alyssa/followers/",
      "following": "https://social.example/alyssa/following/",
      "liked": "https://social.example/alyssa/liked/"
    }

    客户端到服务器的交互

    客户端通过向 actor 的发件箱(outbox)发送 POST 请求来发布活动。请求必须包含一个 Activity 对象,服务器随后会将其处理并传递到目标收件箱。

    发布活动示例

    假设 Alyssa 想给她的朋友 Ben 发送一条消息,询问他是否还书。她的消息可以表示为一个 ActivityStreams 对象,并通过 POST 请求发送到她的 outbox。

    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Note",
      "to": ["https://chatty.example/ben/"],
      "attributedTo": "https://social.example/alyssa/",
      "content": "Say, did you finish reading that book I lent you?"
    }

    服务器会将此消息包装在一个 Create 活动中,并将其 POST 到 Ben 的收件箱。

    接收消息

    Alyssa 的手机会通过 GET 请求轮询她的收件箱,以获取新消息。当 Ben 回复了她的消息,她会看到如下内容:

    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Create",
      "id": "https://chatty.example/ben/p/51086",
      "to": ["https://social.example/alyssa/"],
      "actor": "https://chatty.example/ben/",
      "object": {
        "type": "Note",
        "id": "https://chatty.example/ben/p/51085",
        "attributedTo": "https://chatty.example/ben/",
        "to": ["https://social.example/alyssa/"],
        "inReplyTo": "https://social.example/alyssa/posts/49e2d03d-b53a-4c4c-a95c-94a6abf45a19",
        "content": "<p>Argh, yeah, sorry, I'll get it back to you tomorrow.</p><p>I was reviewing the section on register machines, since it's been a while since I wrote one.</p>"
      }
    }

    服务器到服务器的交互

    服务器之间通过向 actor 的收件箱发送 POST 请求来传递消息。这种交互方式允许去中心化的社交网络跨不同服务器传递信息。

    示例:服务器间的消息传递

    当 Alyssa 发布一条消息到她的 outbox,服务器会查找消息的目标收件箱,并将消息 POST 到这些收件箱。这样,Ben 的服务器就能接收到 Alyssa 的消息,并将其存储在 Ben 的收件箱中。

    安全性与认证

    ActivityPub 使用认证机制来验证客户端与服务器之间、以及服务器与服务器之间的互动。为了确保内容的真实性,服务器应验证接收到的内容,确保其来自声称的 actor,并且该 actor 有权限更新资源。

    验证示例

    服务器在接收到一个活动后,应验证该活动的 idactor 属性,确保其真实性。例如:

    {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Like",
      "actor": "https://example.net/~mallory",
      "to": ["https://hatchat.example/sarah/", "https://example.com/peeps/john/"],
      "object": {
        "@context": {"@language": "en"},
        "id": "https://example.org/~alice/note/23",
        "type": "Note",
        "attributedTo": "https://example.org/~alice",
        "content": "I'm a goat"
      }
    }

    服务器应确保 idactor 属性合法,并查验对象是否由 actor 创建。

    结论

    ActivityPub 通过提供去中心化的社交网络协议,实现了更高的自由度和隐私保护。无论是客户端到服务器的交互,还是服务器到服务器的消息传递,ActivityPub 都为构建去中心化的社交网络提供了强大的工具。

    参考文献

    通过了解和实现 ActivityPub,我们可以构建一个更加自由和开放的互联网社交网络环境。

    image.png

  • ActivityPub:构建分布式社交网络的开放协议

    什么是ActivityPub

    ActivityPub是一种开放的、基于分布式社交网络的协议,用于创建、更新和删除内容,并实现服务器之间的通信和内容传递。它为客户端到服务器和服务器到服务器提供了API接口,使得用户可以方便地在不同的社交网络平台之间进行交流和互动。

    ActivityPub的目标是构建一个去中心化的社交网络,让任何人都可以在网络上运行自己的节点,并与其他服务器上的用户进行关注、点赞、评论等互动。这种去中心化的架构使得用户可以更好地掌控自己的数据和隐私,并且不受单一平台的限制。

    ActivityStreams:社交网络的共同词汇

    ActivityPub使用ActivityStreams作为其词汇,它包含了表示社交网络中各种活动和内容的常用术语。ActivityStreams的词汇已经包含了大部分我们在社交网络中需要使用的词汇,但即使它没有覆盖到我们所需的所有情况,我们仍然可以通过扩展JSON-LD来自定义新的词汇。

    JSON-LD是一种用于表示语义数据的JSON扩展格式,它可以将数据组织成图形结构,并提供了一种机制来连接不同的数据源。对于了解JSON-LD的人来说,可以采取更加高级的链接数据方法;而对于不熟悉JSON-LD的人来说,JSON-LD文档和ActivityStreams可以被理解为普通的JSON格式。通过使用JSON-LD,我们可以更好地描述和表示社交网络中的各种活动和内容。

    ActivityPub的工作原理

    在ActivityPub中,用户通过其在服务器上的帐户来表示为”actors”,每个帐户对应一个独立的”actor”。每个”actor”都有自己的收件箱(inbox)和发件箱(outbox),用于接收和发送消息。用户可以在发件箱中发布消息,其他用户可以通过收件箱接收到这些消息。服务器之间也可以相互传递消息和内容,以实现跨服务器的互联互通。

    举个例子,假设我们有两个用户Alyssa和Ben,他们分别在不同的服务器上拥有自己的帐户。当Alyssa想给Ben发送一条消息时,她会将消息发布到自己的发件箱中。然后,Alyssa的服务器会查找Ben的收件箱地址,并将消息发送到Ben的收件箱中。Ben可以通过检查自己的收件箱来读取Alyssa发送的消息。

    此外,ActivityPub还支持用户之间的关注、点赞、评论等互动。用户可以关注其他用户的帐户,以便在自己的收件箱中接收他们的消息。用户还可以对其他用户的帖子进行点赞或评论,这些互动也会通过服务器之间的通信进行传递。

    ActivityPub的工作进展

    ActivityPub协议是世界广泛支持的社交网络标准,在Fediverse中得到了广泛应用。该标准由Evan Prodromou(StatusNet的创始人)等人共同编写,并于2018年1月被W3C发布为推荐标准。

    ActivityPub的独特之处在于它允许用户在不同的服务器上创建帐户,并与其他服务器上的用户进行互动。这种联邦架构使得用户可以选择自己喜欢的服务器,并与其他用户跨服务器进行关注、点赞、评论等互动。

    目前,许多社交网络平台已经实现了ActivityPub协议,包括Mastodon、PeerTube、Pixelfed等。这些平台都允许用户在自己的服务器上创建帐户,并与其他平台上的用户进行互动。用户可以通过关注其他用户的帐户,接收他们的消息和更新。他们还可以在自己的发件箱中发布消息,使其可供其他用户阅读和互动。

    此外,ActivityPub还支持用户之间的私信功能。用户可以通过私信功能与其他用户进行一对一的私密对话,这些对话只有双方能够看到。

    ActivityPub的应用案例

    Mastodon是基于ActivityPub协议构建的一个开源微博平台,类似于Twitter。用户可以在Mastodon上创建自己的帐户,并与其他用户进行关注、点赞、评论等互动。Mastodon的一个独特之处在于它由许多独立的服务器组成,这些服务器之间通过ActivityPub协议进行通信,用户可以选择加入任何一个服务器。

    PeerTube是基于ActivityPub协议构建的一个开源视频分享平台,类似于YouTube。用户可以在PeerTube上上传和分享视频,并与其他用户进行互动。PeerTube的联邦架构允许用户自主选择他们信任的服务器,并在不同的服务器之间共享视频内容。

    Pixelfed是基于ActivityPub协议构建的一个开源图片分享平台,类似于Instagram。用户可以在Pixelfed上上传和分享图片,并与其他用户进行互动。Pixelfed的联邦架构使得用户可以选择他们喜欢的服务器,并与其他服务器上的用户进行互动。

    ActivityPub的未来发展

    随着ActivityPub协议的不断发展和完善,越来越多的社交网络平台将采用这一标准。这将促进不同平台之间的互操作性和联邦互联,使用户能够更加自由地选择他们喜欢的平台,并与不同平台上的用户进行交流和互动。

    未来,我们可以期待更多创新和发展,例如更加智能化的内容推荐算法、更加灵活的隐私设置以及更加丰富的互动功能。ActivityPub将继续推动社交网络的去中心化和用户自主性的发展,为用户提供更加丰富、安全和自由的社交网络体验。

    参考文献:

    1. ActivityPub – Wikipedia
  • JBang:安装应用程序

    引言

    JBang是一款功能强大的工具,它不仅可以管理依赖项,还可以安装和管理应用程序。通过安装应用程序,我们可以轻松地将脚本和应用程序添加到系统的PATH中,从而在任何操作系统上都可以随时随地调用它们。本文将介绍如何使用JBang安装和管理应用程序。

    安装应用程序

    从版本0.56开始,JBang具备了使用jbang app命令将脚本和应用程序安装到系统的PATH中的功能。这对于在任何操作系统上轻松访问脚本和应用程序非常有用。

    要开始使用,请运行jbang app setup命令。在Windows上,这将修改系统范围的PATH,以包含由JBang管理的文件夹。在基于bash/zsh的shell上,它将在你的bashrc或zshrc文件中设置PATH。

    一旦设置完成,你就可以使用jbang app install <scriptRef>命令将脚本或应用程序安装到JBang管理的路径中。例如,jbang app install myscript.java将把myscript作为一个可以运行的命令。

    你还可以使用别名,例如jbang app install gavsearch@jbangdev

    如果你有两个同名的脚本或应用程序,或者想要使用特定的名称,可以使用--name参数来控制生成的命令,例如jbang app install --name mvnsearch gavsearch@jbangdev

    如果想查看已安装的应用程序列表,可以使用jbang app list命令。如果想卸载脚本或应用程序,可以使用jbang app uninstall <name>命令。

    导出应用程序

    JBang还提供了导出应用程序的功能。通过导出应用程序,你可以将脚本和应用程序打包成可执行的JAR文件,以便在其他环境中运行。导出应用程序非常有用,特别是当你想与其他人共享你的脚本或应用程序时。

    模板

    JBang还支持使用模板来快速创建脚本和应用程序。模板是预先定义好的代码结构和文件布局,你可以根据需要选择和使用它们。使用模板可以加快开发速度,并确保项目具有一致的结构。

    结论

    通过JBang的应用程序安装功能,我们可以轻松地将脚本和应用程序添加到系统的PATH中,使其在任何操作系统上都可以随时调用。通过导出应用程序,我们可以打包脚本和应用程序,以便在其他环境中运行。使用模板可以快速创建具有一致结构的项目。

    JBang为我们提供了强大且便捷的工具,使我们能够更好地管理和使用脚本和应用程序。

    参考文献

  • JBang:灵活的文件组织方式

    引言

    在软件开发过程中,良好的文件组织方式对于代码的可读性和可维护性至关重要。文件组织的合理性可以使我们更好地组织代码和资源文件,提高开发效率。本文将介绍一款名为JBang的工具,它提供了灵活的文件组织方式,使我们能够更好地组织和管理项目文件。

    JBang的文件组织方式

    JBang允许我们使用多个源代码文件,并提供了一种简单的方式来组织这些文件。我们可以将多个源文件放置在同一个源代码目录中,甚至可以在一定程度上使用包进行组织。

    以下是一个示例,展示了如何在JBang中使用多个源文件:

    Main.java
    
    import model.Person;
    
    public class Main {
    
        public static void main(String... args) {
            Person p = new Person(args[0]);
            System.out.println("Hello " + p.getName());
        }
    }
    
    model/Person.java
    
    package model;
    
    public class Person {
        String name;
    
        public String getName() {
            return name;
        }
    
        public Person(String n) {
            this.name = n;
        }
    }

    在这个示例中,我们有两个源代码文件:Main.javamodel/Person.javaMain.java文件包含了应用程序的入口点,而model/Person.java文件定义了一个简单的Person类。我们可以通过在命令行中运行jbang Main.java来执行这个应用程序。

    需要注意的是,当多个源文件相互引用时,有些情况下可能会出现问题。例如,如果model.Person引用了util.Generator,则会导致编译错误。此外,由于jbang edit在运行之前必须进行编译,因此它无法识别和处理多个源文件。

    使用多个源文件的高级功能

    从版本0.46开始,JBang提供了更高级的功能,使多个源文件的管理更加灵活。主要的脚本文件定义了所有的依赖项,而我们可以使用//SOURCES <filename>注释将更多的源文件添加到应用程序中。如果包含的源文件中存在//SOURCES注释,那么这些文件也将被递归地添加进来。对于.jsh脚本文件,包含的源文件将按照它们被发现的顺序进行添加,采用深度优先的方式。

    在编译时,列出的文件名将被添加到源文件列表中。

    需要注意的是,目前尚不支持使用*.java样式匹配或在这些.java文件中声明//DEPS或其他JBang配置。目前,这些配置只会被主要的脚本或应用程序所识别。根据反馈,未来将放宽这些限制。

    添加更多资源文件

    如果你想要添加META-INF/application.propertiesMETA-INF/resource.index.html或其他文件到生成的JAR文件中,你可以使用//FILES注释来添加它们。

    //FILES的格式为//FILES <mountpoint>[=<sourcefile>]

    以下是一个示例:

    //FILES resource.properties
    //FILES META-INF/resources/index.html=index.html

    在这个示例中,resource.properties文件将被直接复制,而META-INF/resources/index.html文件的内容将来自于index.html文件。

    所有的位置都需要相对于脚本所在的位置。

    需要注意的是,目前jbang edit和基于HTTP(S)的脚本与//FILES不兼容。

    用于命令行插件的无扩展名/非Java文件

    你可以使用JBang编写命令行插件,例如kubectl、git等。这些插件希望插件能够以<cmd>-<plugin>的方式命名,例如kubectl-myplugin

    针对这种情况,JBang提供了两种方法来使其工作。第一种推荐的方式是使用jbang app install命令,在中间生成一个脚本来避免问题。例如,jbang app install --name kubectl-my-plugin myplugin.java

    第二种方式是利用JBang的自动处理能力,适用于只有一个文件且不需要中间脚本的情况。具体的做法如下:

    • 将文件命名为kubectl-my-plugin,不包含.java.jsh扩展名。
    • JBang会将该文件复制到一个临时目录,并使用短横线命名法将文件名映射为合适的Java类名。

    例如,如果你创建了一个名为kubectl-my-plugin的文件,JBang将会假设实际的类名为KubectlMyPlugin

    需要注意的是,当使用jbang edit时,JBang会创建一个符号链接,使得IDE将其视为普通的驼峰式Java类。

    如果不遵循这种命名模式,将会导致编译错误,因为javac要求公共类和文件名相等。

    此外,针对无扩展名的脚本,你可以在文件开头添加#!注释,以让应用程序识别它作为脚本处理。为了避免编译问题,JBang在编译之前会删除该注释行。

    结论

    JBang提供了灵活的文件组织方式,使我们能够更好地组织和管理项目文件。通过使用多个源文件和注释,我们可以轻松地组织代码结构,并将资源文件添加到生成的JAR中。此外,JBang还允许我们为命令行插件编写无扩展名的文件,并提供了便捷的命名约定。

    合理的文件组织方式有助于提高代码的可读性和可维护性。通过使用JBang的文件组织功能,我们可以更加高效地开发和管理我们的项目。

    参考文献

  • JBang:简单依赖管理工具

    引言

    在软件开发过程中,我们经常需要使用各种各样的库和框架来构建功能强大的应用程序。然而,手动管理这些依赖项可能会变得非常复杂和耗时。在本文中,我们将介绍一款名为JBang的工具,它可以帮助我们轻松管理项目的依赖项。无论你是一名Java开发人员还是对软件开发感兴趣的新手,JBang都将是你的好帮手。

    JBang简介

    JBang是一款基于Java的命令行工具,它提供了一种简单且灵活的方式来管理项目的依赖项。使用JBang,我们可以轻松地指定所需的库和框架,并自动下载和安装它们,而无需手动处理复杂的依赖关系。JBang还提供了许多有用的功能,例如脚本执行、构建项目和编辑代码等。

    安装和使用JBang

    JBang的安装非常简单。你只需前往官方网站(JBang官网)下载适用于你的操作系统的安装包,然后按照说明进行安装即可。

    安装完成后,你可以在命令行中输入jbang命令验证安装是否成功。如果成功,你将看到JBang的版本信息和可用命令列表。

    指定和管理依赖项

    在JBang中,我们可以使用两种方式指定和管理依赖项:使用内联注释或使用外部依赖文件。

    内联注释方式

    使用内联注释的方式非常简单。在你的脚本或代码文件中,你只需在需要引入依赖项的地方添加类似以下的注释:

    //DEPS groupId:artifactId:version

    其中,groupId代表库或框架的组织ID,artifactId代表项目的唯一标识符,version代表所需的版本号。你可以根据需要指定一个或多个依赖项,它们之间用空格分隔。

    以下是一个使用内联注释指定依赖项的示例:

    //DEPS org.apache.logging.log4j:log4j-core:2.14.1
    //DEPS com.google.guava:guava:30.1-jre

    在你运行脚本时,JBang将自动解析并下载所需的库和框架,并将其添加到类路径中,使其可供你的脚本使用。

    外部依赖文件方式

    除了使用内联注释,JBang还支持使用外部依赖文件来管理项目的依赖项。你可以创建一个文本文件(通常命名为dependencies.jsh),并在其中列出所需的依赖项,每个依赖项占一行。以下是一个外部依赖文件的示例:

    org.apache.logging.log4j:log4j-core:2.14.1
    com.google.guava:guava:30.1-jre

    在你的脚本或代码中,你可以使用以下语法来引用外部依赖文件:

    //DEPS {file=path/to/dependencies.jsh}

    JBang将读取外部依赖文件,并自动解析和下载所需的库和框架。

    解析和安装依赖项

    一旦你在脚本或代码中指定了依赖项,JBang将自动解析并下载所需的库和框架。它会检查本地缓存中是否已经存在这些依赖项,如果不存在,就会从远程存储库中下载并安装它们。

    当你第一次运行包含依赖项的脚本时,JBang会显示一个进度条,提示正在解析和下载依赖项。完成后,你就可以开始使用这些库和框架了。

    示例说明

    让我们通过一个简单的示例来演示JBang的使用。假设我们想编写一个使用log4j库进行日志记录的Java程序。

    首先,我们需要在我们的代码中添加对log4j库的依赖。我们可以使用内联注释或外部依赖文件来指定依赖项。以下是在代码中使用内联注释的示例:

    //DEPS org.apache.logging.log4j:log4j-core:2.14.1

    或者,使用外部依赖文件的示例:

    dependencies.jsh:

    org.apache.logging.log4j:log4j-core:2.14.1

    在你的代码中,你可以使用log4j进行日志记录。以下是一个简单的示例:

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    public class LoggingExample {
        private static final Logger logger = LogManager.getLogger(LoggingExample.class);
    
        public static void main(String[] args) {
            logger.info("This is an info message");
            logger.warn("This is a warning message");
            logger.error("This is an error message");
        }
    }

    在这个示例中,我们首先导入了log4j库的必要类和接口。然后,我们创建了一个名为logger的静态变量,并使用LogManager.getLogger()方法获取日志记录器。最后,我们使用logger记录了不同级别的日志消息。

    当我们运行这个程序时,log4j将根据配置的日志级别将日志消息输出到控制台或其他目标。

    结论

    JBang是一款强大且易于使用的依赖管理工具,它可以帮助我们简化项目的依赖项管理过程。通过使用内联注释或外部依赖文件,我们可以轻松指定所需的库和框架,并自动解析、下载和安装它们。JBang还提供了许多其他功能,例如脚本执行和项目构建等。

    不管你是一名经验丰富的Java开发人员还是一个新手,JBang都会成为你开发过程中的有力助手。使用JBang,你将能够更快地构建功能丰富的应用程序,并在开发过程中更加专注于核心功能的实现。

    参考文献

  • JBang使用指南

    简介

    JBang是一款强大而灵活的工具,为开发者提供了便捷的方式来编写和运行Java代码。它可以处理包含main方法的单个.java文件,也可以处理.jsh文件(用于jshell)。下面我们将详细介绍JBang的安装和使用方法。

    安装

    要使用JBang,首先需要安装它。安装过程非常简单,只需按照以下步骤操作:

    1. 访问JBang官方网站(https://www.jbang.dev/)。
    2. 根据你的操作系统选择对应的安装包进行下载。
    3. 安装完成后,你就可以使用JBang了。

    使用方法

    JBang的使用方法非常灵活,你可以通过以下几种方式来执行Java代码:

    1. 直接运行Java文件:如果你有一个包含main方法的Java文件,你可以使用以下命令来运行它:
       jbang filename.java

    这将直接执行该Java文件,并输出结果。

    1. 执行.jsh文件:如果你有一个.jsh文件(用于jshell),你可以使用以下命令来执行它:
       jbang filename.jsh

    JBang将会将该文件传递给jshell进行处理,并输出结果。

    1. 运行已编译的Jar文件:JBang还支持直接运行已编译的.jar文件。你可以使用以下命令来运行.jar文件:
       jbang filename.jar

    JBang会自动加载并执行该.jar文件。

    依赖关系

    在Java项目中,处理依赖关系是常见的任务。JBang提供了便捷的方式来管理和引入依赖关系。你可以通过在代码文件中添加//DEPS的注释来指定所需的依赖项,JBang会自动下载并加载这些依赖项。例如:

       //DEPS com.example:library:1.0.0

    这将下载并加载名为”com.example:library:1.0.0″的依赖项。

    Java版本

    JBang兼容多个Java版本,你可以根据自己的需要选择合适的Java版本进行编译和运行。如果系统中没有指定的Java版本,JBang会自动下载并使用默认的Java版本。你也可以使用以下命令来指定Java版本:

       jbang --java java_version filename.java

    其中,java_version表示你要使用的Java版本。

    文件组织

    JBang支持帮助你更好地组织和管理项目文件。你可以将相关的代码文件放在一起,以提高代码的可读性和维护性。例如,你可以将所有与数据库操作相关的文件放在一个名为”database”的文件夹中。

    运行和调试

    JBang提供了丰富的运行和调试功能,让你可以更轻松地执行和调试Java代码。你可以使用以下命令来运行和调试代码:

    • 运行代码:
      jbang run filename.java
    • 调试代码:
      jbang debug filename.java

    编辑

    JBang支持代码编辑功能,你可以通过指定编辑器来编辑代码文件,以提高开发效率。你可以使用以下命令来编辑代码:

    jbang edit filename.java

    JBang会打开默认编辑器,并加载指定的代码文件供你编辑。

    导出和发布

    当你的项目完成后,JBang提供了导出和发布的功能。你可以将代码打包成可执行的文件或发布到其他平台上。例如,你可以使用以下命令将代码导出为可执行的Jar文件:

    jbang export filename.java

    JBang会将代码打包成一个可执行的Jar文件,方便你在其他环境中运行。

    依赖项

    在Java项目中,处理依赖关系是非常常见的任务。JBang提供了便捷的方式来管理和引入依赖项。你可以通过在代码文件中添加//DEPS的注释来指定所需的依赖项,JBang会自动下载并加载这些依赖项。例如:

    //DEPS org.apache.commons:commons-lang3:3.12.0
    //DEPS com.google.guava:guava:30.1-jre

    这样,JBang会自动下载并加载”org.apache.commons:commons-lang3:3.12.0″和”com.google.guava:guava:30.1-jre”这两个依赖项。

    Java版本

    JBang兼容多个Java版本,你可以根据自己的需要选择合适的Java版本进行编译和运行。如果系统中没有指定的Java版本,JBang会自动下载并使用默认的Java版本。你也可以使用以下命令来指定Java版本:

    jbang --java java_version filename.java

    其中,java_version表示你要使用的Java版本。

    文件组织

    JBang支持帮助你更好地组织和管理项目文件。你可以将相关的代码文件放在一起,以提高代码的可读性和维护性。例如,你可以将所有与数据库操作相关的文件放在一个名为”database”的文件夹中。

    运行和调试

    JBang提供了丰富的运行和调试功能,让你可以更轻松地执行和调试Java代码。你可以使用以下命令来运行和调试代码:

    • 运行代码:
      jbang run filename.java
    • 调试代码:
      jbang debug filename.java

    编辑

    JBang支持代码编辑功能,你可以通过指定编辑器来编辑代码文件,以提高开发效率。你可以使用以下命令来编辑代码:

    jbang edit filename.java

    JBang会打开默认编辑器,并加载指定的代码文件供你编辑。

    导出和发布

    当你的项目完成后,JBang提供了导出和发布的功能。你可以将代码打包成可执行的文件或发布到其他平台上。例如,你可以使用以下命令将代码导出为可执行的Jar文件:

    jbang export filename.java

    JBang会将代码打包成一个可执行的Jar文件,方便你在其他环境中运行。

    以上是JBang的一些常用功能和使用方法。通过JBang,你可以更便捷地编写和运行Java代码,提高开发效率和代码质量。

    参考文献:
    JBang使用指南

  • 探索 JBang——Java 开发的全新体验

    前言

    Java 开发者们,无论您是学生、教育者还是专业开发人员,您是否曾经希望有一种更简单、更高效的方式来创建、编辑和运行 Java 程序?今天,我们将带您了解一个令人兴奋的工具——JBang。它不仅简化了 Java 应用的开发过程,还提供了丰富的功能和广泛的支持平台。

    什么是 JBang?

    JBang 是一个旨在让学生、教育者和专业开发人员能够轻松地创建、编辑和运行自包含的源代码 Java 程序的工具。借助 JBang,您可以在几乎任何操作系统上无缝地运行 Java 程序,而且无需复杂的设置过程。

    多平台支持

    安装与运行

    JBang 可以安装并运行在 Windows、Linux、macOS、Docker 以及 GitHub Actions 上。此外,它还可以通过 Maven 和 Gradle 插件使用。这意味着无论您使用什么开发环境,都可以轻松集成 JBang。

    无需预装 Java

    如果您的系统上没有安装 Java,JBang 也能自动下载所需的 Java 版本。这极大地简化了初学者的上手过程。

    嵌入式依赖管理

    自动获取依赖

    通过 JBang,您可以直接在源代码中使用 //DEPS group:artifact:version@Grab 注解来自动获取任何依赖项。这使得依赖管理变得前所未有的简单和直接。

    //DEPS org.slf4j:slf4j-api:1.7.30
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class HelloWorld {
        private static final Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    
        public static void main(String[] args) {
            logger.info("Hello, World!");
        }
    }

    JBang AppStore

    JBang 提供了一个 AppStore,您可以在其中找到其他人发布的应用程序,或者将您自己的应用程序发布到一个由 git 支持的 jbang-catalog.json 中。这为开发者提供了一个共享和发现工具的平台。

    发布与发现应用

    通过 JBang AppStore,您可以轻松地发现和使用其他开发者发布的应用程序,也可以发布自己的应用程序供其他人使用。这种共享机制促进了开发者之间的交流和协作。

    IDE 集成

    无论您使用的是 Intellij、Eclipse、Visual Studio Code、Apache Netbeans,还是 vim 和 emacs,JBang 都能轻松集成。它提供了适当的内容辅助和调试支持,使得开发过程更加流畅和高效。

    轻松编辑与调试

    JBang 提供了丰富的编辑和调试支持,让您在熟悉的开发环境中也能享受到 JBang 带来的便利。无论是代码补全、语法高亮还是调试功能,JBang 都能很好地与您的 IDE 集成。

    选择合适的 Java 版本

    JBang 支持从 Java 8 及更高版本的任何 Java 版本。您可以根据项目需求自由选择最合适的 Java 版本,享受最新的语言特性和性能提升。

    灵活的版本支持

    无论是需要使用 Java 8 的老项目,还是想要尝试最新的 Java 版本,JBang 都能满足您的需求。这种灵活性使得 JBang 成为一个非常适合多种场景的工具。

    用户体验

    很多用户都对 JBang 的使用体验表示赞赏。正如 Oliver Weiler 所说:“第一次使用 JBang 的体验真的很棒!你可以感觉到 @jbangdev 是用爱在做这件事!”

    社区反馈

    通过社交媒体和开发者社区,许多用户分享了他们的使用体验和心得。JBang 的用户友好性和强大的功能得到了广泛的认可和赞誉。

    总结

    JBang 为 Java 开发者提供了一种全新的开发体验。无论是简化的依赖管理、多平台支持、无缝的 IDE 集成,还是便捷的 AppStore,JBang 都展示了其强大的功能和极高的可用性。如果您还没有尝试过 JBang,现在就是开始的好时机!

    欲了解更多信息并下载 JBang,请访问 JBang 官方网站


    参考文献:

    JBang 官方网站

  • autoMate:用AI简化你的数字生活

    引言

    在这个数字化飞速发展的时代,我们的生活越来越依赖于各种软件和应用程序。但是,你有没有想过,如果这些软件能够更加智能,能够理解我们的指令并自动完成一些重复性的任务,那将会怎样?这就是autoMate所承诺的——它就像出行中的共享单车一样,只需3分钟,就能将AI的智能植入到任意一个软件中,让你的数字生活变得更加轻松和高效。

    autoMate是什么?

    autoMate是一个开源免费的项目,它允许用户通过简单的配置,将AI的能力集成到他们日常使用的软件中。无论是自动化工作流程,还是简化复杂的任务,autoMate都能提供强大的支持。

    如何开始使用autoMate?

    如果你是第一次使用autoMate,你只需要进行一些基础的设置。首先,你需要修改配置文件,添加OpenAI的信息。这可以通过在autoMate的左上角点击文件,然后选择components,接着配置OpenAI的相关信息来完成。

    autoMate的主要功能

    autoMate的核心功能是将AI集成到软件中,但它并不止步于此。以下是autoMate的一些主要功能:

    • 自动化任务:autoMate可以帮助你自动化那些重复性高且耗时的任务。
    • 智能决策:通过集成AI,autoMate能够提供智能的决策支持,帮助你更高效地完成工作。
    • 易于配置:即使是没有编程背景的用户,也能够通过简单的配置快速上手autoMate。

    各产品优势对比

    autoMate在众多自动化工具中脱颖而出,它的优势在于其开源免费的特性,以及对AI能力的集成。这使得autoMate不仅能够帮助个人用户提高效率,也能够为企业提供强大的自动化解决方案。

    开源社区的支持

    autoMate完全依赖于开源社区的支持,这意味着它不断地在改进和更新。社区的贡献者们不断地为autoMate添加新功能,修复bug,确保它能够满足用户的需求。

    结语

    autoMate是一个强大的工具,它能够让你的软件更加智能,让你的工作更加高效。无论你是希望简化日常任务,还是想要探索AI的潜力,autoMate都是一个值得尝试的选择。而且,由于它是开源免费的,你没有任何理由不试试这个能够改变你数字生活的神奇工具。

    呼吁行动

    如果你对autoMate感兴趣,不妨访问它的GitHub页面,那里有详细的安装指南和使用文档。同时,如果你觉得autoMate对你有帮助,不妨给它点个star,以示对开源项目的支持和鼓励。


  • 从底层程序员到失意的IT培训学员

    前言

    一直以来,程序员这个职业在许多人眼中都是高富帅的代名词。通过IT培训学校,普通人也能迅速切入这个行业,成为软件开发的编程工人。但在现实中,这些底层程序员们往往只能沦为外包公司的代码搬运工,无法实现自我提升和价值实现。本文通过几个典型案例,探讨了普通人进入IT行业的艰辛历程,以及培训学校和外包公司对他们造成的种种困境。

    培训学校的”神话”与现实

    孙玲是众多IT培训学员心中的”神话”。她从一名深圳流水线厂妹,通过不懈努力,最终成长为纽约的高薪程序员。这种”逆袭”的人生轨迹,激发了许多普通人的梦想。

    但事实证明,孙玲只是少数幸运儿。对于大多数学员来说,在培训学校所学的知识往往只是皮毛,无法满足互联网公司日新月异的技术要求。培训学校为了招揽学生,不惜使用”应试教育”的手法,教授一些过时且简单的编程知识,仅仅是为了应付面试。

    随着行业变革,头部互联网公司对员工的技术要求越来越高,普通培训学校难以跟上步伐,反而被淘汰出局。许多原本报考的学生,最终只能进入人力外包公司,沦为代码搬运工,无法实现自我价值。

    外包公司:编码的”送外卖”

    进入外包公司后,许多底层程序员发现自己的处境并没有太大改变。他们不得不连续加班完成一个又一个项目,却无法掌控最终产品的走向。就像一位员工所说,”就像对着空气敲代码”。

    缺乏成就感和发展空间,使得许多员工对未来失去信心。有的人干脆选择辞职,去送外卖或做其他工作,因为那样”至少不用整天写些脏东西”。

    失意的IT培训学员

    无论是孙玲这样的成功典型,还是陷入困境的普通学员,他们的经历都给我们一个深刻启示:IT培训学校并非通往程序员”圣殿”的捷径,而是一条充满荆棘的道路。

    如果没有扎实的编程基础和持续学习的决心,普通学员很难在这个行业立足。外包公司的无奈处境,也让我们看到了IT培训学校的局限性。

    也许,对于大部分普通人来说,IT行业的”神话”终究只是一个遥不可及的梦想。我们需要更加务实地看待自己的处境,选择适合自己的人生道路,而不是盲目地追求那些虚幻的前景。

  • Salesforce带头暴跌,美国软件股全线崩盘,AI时代不转型就是死?

    作者:常嘉帅

    近年来,软件公司的业绩一直是推动其股价飙升的主要动力。然而,最新的财报季显示,这一局面正在发生改变。AI投资的激增,导致企业在传统软件上的支出减少,使得曾经的科技明星公司如Salesforce等面临增长放缓的严峻挑战。

    Salesforce的困境:20年来最惨跌幅

    周四,Salesforce的股价暴跌了约20%,创下近20年来的最大单日跌幅,这不仅拖累了整个软件板块,也使得美股软件板块整体重挫5%,创下两年来最大单日跌幅。Salesforce的全年业绩指引略微下调,同时其四季度财报在营收、利润率等方面均未能达到华尔街的预期。

    根据财报,Salesforce上季的营收仅增长10.7%,创下历史新低。更为糟糕的是,其订单同比涨幅仅有3%,同样刷新了历史最差水平。Salesforce高管承认,重大交易越来越难以敲定,且交易规模普遍缩小,总合同价值指标也罕见地低于两位数增幅。

    这一困境并非Salesforce独有。十家最大的软件公司中,有八家公司在发布最新业绩后股价应声下跌,跌幅平均达9%。隔夜iShares软件ETF(IGV)暴跌近6%。

    AI投资分流资本支出:软件公司面临双重挑战

    分析人士指出,AI热潮对软件公司有两方面的影响。一方面,鉴于AI被视为未来科技发展的终极力量,软件公司不得不在转型之路上加大投入,以免落伍,这无疑影响了营销等其他领域的资本支出;另一方面,软件公司的客户们也在大力投资于AI,导致对传统软件的投资减少。

    例如,Workday上季的订单数据逊色,全年订阅收入预期也出现下调,股价遭遇八年来最惨重挫。其CEO坦言,客户正在压缩续约时的员工使用授权数量,削减采购规模。而Snowflake则因大笔投入AI导致利润率预期大幅下调,遭投资者抛售。

    如何应对AI浪潮的冲击?

    尽管当前的财报季表现疲软,部分科技巨头已经尝到了AI转型的甜头。以微软为例,依靠其ChatGPT等生成式AI服务,公司目前的营收增速已超过Salesforce等老牌竞争对手。

    投行奥本海默分析师Brian Schwartz认为,Salesforce等软件公司本季度成绩“令人失望”,疲软表现可能意味着AI支出抢走了其他方向的投资,并且拖累了这些公司的招聘步伐。德意志银行分析师Brad Zelnick指出,虽然多头可能会觉得这只是一个季度的表现,但他认为,糟糕的财报已经让软件公司的AI应用道路及其最终货币化前景蒙上重重疑问。

    尽管如此,包括Salesforce在内的软件公司并未坐以待毙,正在纷纷加大对AI的投入,谋求在这场升级换代浪潮中取得突破,为客户提供更加智能和高效的软件产品。然而,要证明人工智能真能为它们带来丰厚回报,以抵消当前增长乏力的影响,仍需要一个漫长的过程。

    参考文献

    • 常嘉帅. Salesforce带头暴跌,美国软件股全线崩盘,AI时代不转型就是死?