2023年4月

探索 Collabora Online 的互操作性,使文档和电子表格在所有办公套件中兼容。

Collabora Online 支持各种各样的文件和格式。不过,这个开源办公套件在互操作性方面的表现如何?本文仔细研究了 Collabora Online 与不同办公套件(如 Microsoft 365 和 Google Workspace)交换复杂文本文档和电子表格的能力。

Collabora Online 是一款适用于云端或内部的开源办公套件,可以保护你的隐私,让你完全控制你的数据。该软件由位于剑桥的 Collabora Productivity Ltd 开发,其团队在世界各地工作。Collabora Online 以 LibreOffice 技术为基础,并主要使用 Mozilla Public License 2.0 许可。

Collabora Online 可以在任何现代网络浏览器中运行,不需要额外的插件或附加组件。它有一个完整的基于云的办公套件,包括一个文字处理器(Writer)、电子表格程序(Calc)、演示软件(Impress)和一个设计矢量图的应用(Draw)。

本文介绍了 Collabora Online 的一些新的互操作性功能,包括宏、动态字体加载和电子表格应用程序的 Sparklines 支持。这些功能扩展了现有的对微软文件格式的出色处理。

什么是互操作性,为什么它很重要?

一般来说,互操作性是指不同的设备或应用在一起工作和无缝交换数据的能力。在办公套件的背景下,互操作性主要是指文件格式。用户应该能够打开、编辑和保存 .doc.docx.xls.xlsx.odt.ods文件,无论它们是用微软的 Word、苹果的 iWork 还是 LibreOffice 创建。

对于在线办公套件也是如此。通过确保文件可以在 Microsoft 365、Google Workspace 和 Collabora Online 之间交换,互操作性有助于提高生产力和促进协作。所有在线办公套件都可以保存各种格式的文件。它们还可以导入和导出最初在其他办公套件中创建的文档、电子表格和演示文稿。

管理宏,确保文件处理顺畅

经常引起问题的是带有宏的文件。它们通常是用特定的编程语言开发的,适用于某个特定的应用。虽然在 Google Sheets 中记录和编辑宏是可能的,但在微软 Office 中用 Visual Basic for Applications(VBA)实现的宏不能被转换,必须用 Google Apps Script 重新创建。打开带有 VBA 宏的 Word 文档会产生错误,并通知用户这些宏将被忽略或禁用。

Collabora Online 支持宏,并在容器内的服务器端运行它们。该功能默认是禁用的,管理员必须在 coolwsd.xml 配置文件中明确激活它。之后,用户可以选择在加载文档时允许使用宏。不过,有几个限制。例如,它不可能访问数据库源,访问其他(外部)文件,调用外部程序,使用控制形状,等等。多年来,由于活跃的社区以及客户和合作伙伴的贡献,Collabora Online 支持的代码和对象的数量已经大大增加。

Collabora Online:动态字体加载

办公套件中互操作性的另一个关键方面是字体。使用含有在特定平台上无法使用的字体的文档,可能会导致错误、意外的格式变化,甚至是内容的完全丢失。

微软 Office 文档经常使用 Google Workspace 或 Collabora Online 中没有的默认字体。为了解决这个问题,办公套件经常建议替换掉缺失的字体。这通常是有用的,但有时会导致不好的结果。

从 22.05.7 版本(2022 年 11 月发布)开始,Collabora Online 可以列出缺失的字体并建议替换。它还可以下载必要的字体并将其添加到服务器上。一切都是动态进行的,而不会停机。新的字体在几分钟内就可以在编辑会话中使用,实现最佳的互操作性。

Fonts can introduce a surprising complexity to your document, but Collabora Online can handle it.

为了实现这一目标,在文档被渲染的同时,通过 API 追踪丢失字体的信息。一个 JSON 文件存储了需要添加的字体列表。coolwsd.xml 文件(服务器端的设置)指向该 JSON 文件。它每分钟检查一次修改情况,并下载缺少的字体。

探索 Sparkline:显示电子表格中的数据趋势

Sparkline 是在工作表中单个单元格内的微小图表,它可以将数据的趋势可视化。这些微型图表有不同的风格,包括线、条和柱。Sparkline 还支持不同的颜色和水平/垂直轴。与显示尽可能多的数据并与文本流分开的大型图表不同,Sparkline 被缩减为核心值,通常放在同一单元格中数据本身的旁边或后面。Sparkline 通常是为一个单元格定义的,但也可以将共享相同数据范围和属性的多个 Sparkline 进行分组,以便进行渲染。

Customize the look of Sparklines.

Sparkline 是一个紧凑的参考,提供了一个快速的方法来说明趋势、模式、统计异常、增加和减少,同时避免了完整图表的复杂性。下面是一些不同的 Sparkline 类型:

  • 线形图: 通过线段从左到右连接各点,对于显示在一定时间内变化的数据特别有用。
  • 条形图: 使用水平排列的条形图表示数据,通常用于比较数字数据。
  • 柱状图: 是比较一系列数值的理想选择。柱是垂直的,其长度表示数据的相对大小/价值。柱状图经常被用来表示不同类别或群体的数据。

要创建一个 Sparkline,你首先要为该函数定义一个输入数据范围(一列或一行中的两个或多个单元格)。你还可以决定你希望 Sparkline 出现的单元格。在大多数电子表格应用中,你右键点击迷你图表来调整其属性,选择图表类型,并选择颜色。Collabora Online 为此提供了一个单独的对话框,使得改变微型图表的风格变得简单而方便。

在三个线上办公软件之间交换带有 Sparkline 的文件是可能的,不会丢失图表及其格式。如果你想在 Microsoft 365、Google Workspace 和 Collabora Online 之间共享电子表格,请确保使用微软格式的 .xlsx 进行导入和导出,因为 Google Sheets 不能很好地处理 .ods 文件。

文件交换很容易

Collabora Online 提供了几个新的互操作性功能,使得与其他办公套件交换文件变得容易。宏程序支持、动态字体加载和 Sparkline 确保了文档的无缝处理,避免了意外的格式变化。使用 Collabora Online 来统一和简化你的办公工作。

(题图:MJ:Office docs process dark plain background Illustration )


via: https://opensource.com/article/23/4/open-source-collabora-online-interoperability

作者:Heike Jurzik 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

之前,我在写 有关 embark 的内容,我的第一设备为启动远程视频流设计了一个新的 embark。embark 的作者 Omar Antolín Camarena 不仅阅读了这篇内容,还点评了一下我认为值得跟进的一些重大改进。

首先,你应该记得我们曾定义过一个检测视频 URL 的函数:

    (defun jao-video-finder ()
      "Check whether we're looking at a video URL.
    Return (video-url . <URL>) if so."
      (when-let ((url (thing-at-point-url-at-point)))
        (when (string-match-p jao-video-url-rx url)
          (cons 'video-url url))))

当我们得到了一个非空的 url 值,即便它不是一个视频链接,但它仍然是一个确切的 URL,并且 embark 已有了一个 url 类别,所以我们可以借助默认的 URL 寻检器存储一个新的句法分析,语句如下:

    (when-let ((url (thing-at-point-url-at-point)))
      (cons (if (string-match-p jao-video-url-rx url) 'video-url 'url) url))

这里有一个潜在的缺点就是:我们重写了 embark 的寻检器,embark-target-url-at-point,所以我们可能更愿意保留后者。

实际上多亏了 embark 的 目标转换器 我们才能做成。我们可以在 embark-transformers-alist 中添加任意一个函数,应用于任何一个给定类别的目标,而 embark 会将其转换后的值应用于它的操作中。Omar 很贴切地把这个过程称为“目标的精化”;我们具体做法如下:

    (defun jao-refine-url-type (url)
      "Refine type of URL in case it is a video."
      (cons (if (string-match-p jao-video-url-rx url) 'video-url 'url) url))

    (add-to-list 'embark-transformer-alist '(url . jao-refine-url-type))

通过这种策略,我们就不再需要 jao-video-finder 了,而且从概念上来说,我们的 video-url 应该被定义为一个精化操作而并非是一个目标 [脚注 1]。Omar 的第二个提议也与这个概念相契合:想必我们都希望所有关于 url 和我们的 video-url 的操作都是可用的,不是吗? 唔,这就是为什么我们用来定义行为的 embark-define-keymap 的宏可以通过使用关键字 [脚注 2] :parent 继承其他键映射中已经定义的所有操作的原因:

    (embark-define-keymap jao-video-url-map
      "Actions on URLs pointing to remote video streams."
      :parent embark-url-map
      ("p" jao-play-video-url))

    (add-to-list 'embark-keymap-alist '(video-url . jao-video-url-map))

这种继承键映射的功能并非是 embark 的附属功能:vanilla Emacs 键映射通过标准函数 set-keymap-parent 已经搞定它了。你可以完全不用 embark-define-keymap 来定义 jao-video-url-map,工作原理是一样的。

这样,我们的代码就能够更短,特征更多:谢谢你,Omar!

脚注 1:在某些情况下,保留 jao-video-finder 是有意义的,即,如果我们想要改变检测 URL 的功能的话。例如,我在使用 emacs-w3m 的时候,经常有一个 URL 作为文本属性储存了起来(实际文本是个链接文本)。要通过那里检索 URL,就需要调用 w3m-anchor,而用 embark-target-url-at-point 就会错过它。对于这种情况,我最终编写(并使用)jao-video-finder 将其通过下文定义:

    (when-let ((url (or (w3m-anchor) (thing-at-point-url-at-point))))
      (cons (if (string-match-p jao-video-url-rx url) 'video-url 'url) url))

另一种达成同件事情的方式(再次向 Omar 致敬)便是为 w3m 的锚点放置一个特定的巡检器(且继续使用 video-url 的转换器):

    (defun jao-w3m-url-finder ()
      (when-let ((url (w3m-anchor)))
        (cons 'url url)))

    (add-to-list 'embark-target-finders #'jao-w3m-url-finder)

这种方法更加模块化,并且取决于你们的喜好,且更加巧妙。这些功能都很小巧并且两种方法之间并没有太大的差别,但是如果其中某一种继续加入更多寻检器的话,前一种方法用起来来反而会让一切变得更糟。

脚注 2:在我最开始的例子中,我在视频地图中还添加了 browse-urlbrowse-url-firefox。前一个已不再重要,因为它已经在 embark-url-map 中出现过了,如果我们想让 browse-url-firefox所有 的 URLs 可用,我们可以将其加入到 embark-url-map (谨记,embark 的键映射只是 Emacs 的键映射)。这是另一种扩展 embark 的简便方法。

(题图:MJ:emacs video geek wallpaper dark plain background Illustration)


via: https://jao.io/blog/an-even-better-video-wharf.html

作者:jao 选题:lujun9972 译者:Drwhooooo 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

带有自由固件的 Thinkpad

一家英国公司 Minifree 发售装有 Libreboot 固件的旧 Thinkpad,该公司的盈利用来资助 Libreboot 项目。Libreboot 是专有 BIOS/UEFI 固件的自由替代品,“与大多数专有启动固件相比,提供更快的启动速度、更好的安全性和许多高级功能”,如直接在启动闪存中使用 GRUB,以及其他一些定制选项。该笔记本电脑上安装的操作系统是加密的 Debian,有完整的驱动程序支持,加密/启动、签名内核等高级功能均可使用。

消息来源:Mini Free
老王点评:虽然这笔记本电脑是老了点,但是都自由啊,而且全球发售。

Twitter 开源的代码被发现“安全漏洞”

Twitter 开源的推荐代码被安全专家发现一个 ‘影子封杀” 漏洞,并被分配了 CVE 编号。根据 Twitter 的推荐算法对负面行为的处理方式,如取消关注、静音、屏蔽和/或报告目标用户等行为会对该账户施加全局声誉惩罚,这相当于 “允许在没有追索权的情况下影响账户声誉”。这意味着被大规模封杀的账户基本上被 “影子封杀” 了。该漏洞有可能被僵尸网络大军利用。

消息来源:The Register
老王点评:开源就是放在聚光灯下,所以毫不意外会发现一些原本可能觉得没问题的问题。

使用钻石延长量子网络通讯距离

科学家们已经实现了短距离的量子通讯,它使用一对纠缠的量子比特来确保在网络上传输的流量是安全的。任何试图破坏密钥的行为都会导致量子状态崩溃,这被视为 “不可破解” 的网络。但跨越更远的距离,仍然是一个挑战。中继信号的中继器本质上也是一台微小的量子计算机。Amazon 的科学家们发现,钻石中的缺陷,那些颜色中心,是一个非常有希望的量子存储器和中继器平台。这不仅是在理论上可行,而且已经在学术实验室中展示过了。

消息来源:The Register
老王点评:果然是量子计算,用的都是贵的。

在 Rust 编程系列的第一篇中,你将学习如何用 Rust 编写和执行你的第一个程序。

Rust 是最快风靡开发者和科技公司的系统编程语言之一。日常使用它的开发者将其评为最受欢迎的编程语言之一,而它 已经连续七年获此殊荣了

它是如此的受欢迎,以致于现在有两股巨大的推力将其带入 Linux 生态系统中:

而这还仅仅是在 Linux 生态系统中。安卓上的蓝牙软件 Gabeldorsche 现在也是由 Rust 编写的。

你是否也看到了 Rust 的流行趋势?那么你或许也想学习使用 Rust 进行编程。

为什么你要考虑 Rust 而不是其他编程语言?

首先,Rust 是一门 类型安全的编程语言 并且 拥有极其严格的编译期检查。因此,你首先会 “被迫” 写不出不安全的代码(好吧,通常是这样)。

Rust 编程语言有以下 “目标”:

  • 性能:Rust 的二进制文件和 C 语言的二进制文件一样快,有时甚至超过了 C++ 的二进制文件!
  • 内存安全:Rust 非常重视内存安全。
  • 并发性:对内存安全的关注消除了很多类似竞争的情况,并帮助你在程序中无畏并发。

以下是在 C/C++ 等语言中可能犯的一些错误(但 Rust 不会):

  • 释放后使用
  • 双重释放
  • 越界访问
  • 使用 NULL
  • 不适当的指针运算或访问
  • 使用未经初始化的变量
  • 线程不安全的多线程

看看 苹果微软谷歌 等大公司因这类 0day 错误而引起的问题吧。

现在你可能知道了为什么要选择 Rust 语言而不是其他编程语言,让我们开始学习 Rust 语言的系列教程吧!

目标受众

出于对 Rust 的热爱,我写了这个系列的 Rust 教程,帮助你熟悉 Rust 编程的概念。

这个教程系列是为已经熟悉 C 和 C++ 等编程语言的人准备的。我假设你已经知道了 变量函数循环 等基本术语。

我对你的唯一要求是你不懈的坚持与努力。

安装 Rust 工具链

我希望你能在本地安装 Rust 工具链。你可以通过运行以下命令来做到这一点: (LCTT 译注:如果你使用 Linux 发行版,请不要直接安装软件源里的 Rust 工具链,尽管这样看起来很便捷。)

curl --proto '=https' --tlsv1.3 -sSf https://sh.rustup.rs | sh

Installing Rust on Ubuntu Linux

除了 Rust 基本工具链,我还建议再安装一些工具,这些工具将在开发过程中帮助你:

rustup component add rust-src rust-analyzer rust-analysis

你还需要 安装 gcc。否则,你可能会遇到“链接器 cc 未找到”的错误。该软件包在不同的发行版中都被称为 gcc。

在 Ubuntu 和 Debian 上使用:

sudo apt install gcc
? 如果你不希望在本地安装 Rust 工具链,不用担心。你还可以直接在你的浏览器中运行 Rust 代码!只要到 Rust 试验场 并把所讨论的代码粘贴在那里。

Hello Rust!

自从 丹尼斯·里奇 Dennis Ritchie 布莱恩・柯林汉 Brian Kernighan 用 “Hello World” 程序介绍了 C 语言后,在 UNIX 世界里,你学习的任何新编程语言第一步都这样做,这已经成为一种习惯。

因此,让我们也用 Rust 编写我们的 Hello World 程序。

我将在我的家目录里 新建一个项目目录 叫做 learn-rust-its-foss。然后,在这里我将新建一个叫 hello-world 的目录。最后,在里面新建 main.rs 文件:

// 这串代码将打印字符
// "Hello world!" 将被打印到 `标准输出`

fn main() {
    println!("Hello world!");
}
? 就像 C、C++ 和 Java 源代码文件相应的扩展名是 .c.cpp.java,Rust 的源文件扩展名是 .rs

作为一个 C/C++ 程序员,你可能已经在 Linux 上使用 GCC,在 macOS 上使用 Clang,在 Windows 上使用 MSVC。但是为了编译 Rust 代码,该语言的创造者自己提供了一个官方的 rustc 编译器。

运行 Rust 程序和 执行 C/C++ 程序 是一样的。你首先编译代码,然后得到可执行文件,最后再运行这个可执行文件从而来运行代码。

$ ls
main.rs

$ rustc main.rs

$ ls
main  main.rs

$ ./main
Hello world!

很好!

解读 Rust 代码

现在你已经编写、编译并运行了你的第一个 Rust 程序,让我们对 “Hello World” 的代码进行解读,并理解每一部分。

fn main() {
}

fn 关键字用来在 Rust 中声明一个函数。在它后面 main 是这个被声明函数的名字。像许多编译型编程语言一样,main 是一个特殊的函数,用来作为你的程序的入口。

任何写在 main 函数里的代码(在大括号 { } 之间)将在程序被启动时运行。

println 宏

main 函数中, 有一个语句(LCTT 译注:“语句” 区别于 “表达式”):

println!("Hello world!");

就像 C 语言的标准库有 printf 函数一样,Rust 语言的标准库有 println 。宏类似于函数,但它以感叹号!)来区分。你将在本系列的后面学习宏和函数的知识。

println 宏接收一个格式化的字符串,并把它放到程序的标准输出中(在我们的例子中,就是终端)。由于我希望输出一些文本而不是一个变量,我将把文本放在双引号(")内。最后,我用一个分号来结束这个语句,表示语句的结束。

? 你只需知道,任何看起来像函数调用但在开头括号前有感叹号的东西,就是 Rust 编程语言中的一个宏。

注释

Rust 遵循已知的 C 编程语言的注释风格。单行注释以两个正斜杠(//)开始,多行注释以 /* 开始,以 */ 结束。

// 这是一个多行注释
// 但是没有什么阻止你在
// 第二行或第三行也这样写

/*
 * 这是一个“真•多行注释”
 * 它看起来比较漂亮
 */

总结

你刚刚通过 Hello World 程序迈出了用 Rust 写代码的第一步。

作为一种练习,也许你可以编写并执行一个打印出 Yes! I did Rust 的 Rust 程序。

在本系列的下一部分中,你将学习在 Rust 程序中使用变量。敬请期待!

(题图:MJ:computer sci-fi ,code secure ,"rust" ,gold blue slive ,background dark, high resolution super detailed)


via: https://itsfoss.com/rust-introduction/

作者:Pratham Patel 选题:lkxed 译者:mcfd 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

使用思维导图与开源工具来做一个有影响力的演示。

在今天的世界和社交媒体中,许多人没有耐心阅读冗长的文字内容。视觉效果是吸引受众注意力的好方法。

你知道吗,3M 公司的研究得出结论,视觉的处理速度是文字的 60,000 倍?视觉比文字更有冲击力,能增强创造性思维和记忆。

一图胜千言

我收集了一些常见的 Git 命令。我把 Git 命令作为主话题,每个子话题都是一个带有定义的 Git 命令语法。为此,我使用了 Wisemapping。

A git command mind map

不管你以前是否知道 思维导图 是什么,现在你看到了思维导图,你就可以理解这个概念了。这就是视觉的力量。

如何创建一个思维导图?

  • 从主话题开始,把它放在你的画板中间。
  • 创建子话题并将它们与主话题联系起来。
  • 你可以为每个子话题添加细节,如定义、例子等。

3 个你可以用来创建思维导图的开源工具

看看这三个开源工具,为你的想法创建一个视觉:

维基百科对思维导图的定义是:将信息直观地组织成一个层次结构,显示整体中各部分之间的关系。思维导图从一个中心话题开始,然后建立起关系。它是一种结构化思想和创造有影响力的演示的视觉方式。

你可以在工作中使用思维导图。例如,我用思维导图来展示一个项目所计划的功能的高层概述。有了这些优秀的开源思维导图应用,你很容易就能开始将你的下一个项目可视化。试试用开源的思维导图吧。

(题图:MJ:Thinking Brainstorming Creativity Ideas Discussion Illustrations Blue Gold Simplicity)


via: https://opensource.com/article/23/3/open-source-mind-mapping

作者:Amrita 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

希望替代 C 的 Zig 语言进入 TIOBE 指数前 50 名

在 TIOBE 2023 年 4 月的最受欢迎的编程语言榜单中,一种它有望成为 C 的现代替代品的通用编程语言 Zig 排名第 46 位,尽管其评分仅为 0.19%。相比之下,谷歌推广的 Carbon 语言,被定位为 C++ 的实验性继任者,仅排名第 168 位。Zig 拥有 C 和 C++ 各种好特性,如用选项类型增强的显式内存管理,并放弃了不那么好的特性,如可怕的预处理。Tiobe 指数建立在课程、第三方供应商和工程师的搜索引擎结果之上。

消息来源:Info World
老王点评:虽然取代 C 语言看起来遥遥无期,但是至少是一个值得感兴趣的选项。

ChatGPT 因撒谎被起诉

澳洲赫本郡的市长 Brian Hood 曾帮助揭露与澳大利亚国家储备银行有关的丑闻,但是,如果你问 ChatGPT 关于他在丑闻中的作用,你会得到相反的事件版本。ChatGPT 谎称 Hood 本人因向外国官员行贿而被定罪,已承认受贿和腐败,并被判处监禁。Hood 打算对 ChatGPT 背后的公司提出诽谤诉讼,这将是第一次有人对 ChatGPT 的内容提出诽谤诉讼。

消息来源:MSN
老王点评:AI 的“事实幻觉”一直是个问题,虽然 AI 已经一再做出免责声明,但是法律似乎对此并无实践。

多款 Wi-Fi 路由器能被 ICMP 嗅探突破安全机制

国内安全专家发现,至少在 55 款 Wi-Fi 路由器中发现的一个漏洞可被不法分子利用,在通过无线网络发送数据时偷窥受害者的数据。这些设备采用了高通或海思的网络处理单元(NPU),该缺陷使得设备无法阻止伪造的 ICMP 重定向信息,从而规避了 Wi-Fi 的 WPA 安全措施,劫持和观察受害者的无线连接。这说明链路层的无线帧加密的设计功能,可以被 IP 层的 ICMP 错误处理的正常执行所干扰。在他们测试的 122 个 Wi-Fi 网络中,有 109 个(89%)容易受到这种攻击。

消息来源:The Register
老王点评:总之不要完全依赖网络层的安全性,应用层的 HTTPS 还是很有必要的。