mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-03-27 02:30:10 +08:00
Merge remote-tracking branch 'LCTT/master'
This commit is contained in:
commit
0e1cb2fc88
@ -1,8 +1,8 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11531-1.html)
|
||||
[#]: subject: (5 Best Password Managers For Linux Desktop)
|
||||
[#]: via: (https://itsfoss.com/password-managers-linux/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
@ -10,11 +10,13 @@
|
||||
5 个 Linux 桌面上的最佳密码管理器
|
||||
======
|
||||
|
||||
_ **密码管理器是创建唯一密码并安全存储它们的有用工具,这样你无需记住密码。了解适用于 Linux 桌面的最佳密码管理器。** _
|
||||
> 密码管理器是创建唯一密码并安全存储它们的有用工具,这样你无需记住密码。了解一下适用于 Linux 桌面的最佳密码管理器。
|
||||
|
||||
密码无处不在。网站、论坛、Web 应用等,你需要为其创建帐户和密码。麻烦的是密码。为各个帐户使用相同的密码会带来安全风险,因为[如果其中一个网站遭到入侵,黑客也会在其他网站上尝试相同的电子邮件密码组合][1]。
|
||||

|
||||
|
||||
但是,为所有新帐户设置唯一的密码意味着你必须记住所有密码,这对普通人而言不太可能。这就是密码管理器可以提供帮助的地方。
|
||||
密码无处不在。网站、论坛、Web 应用等,你需要为其创建帐户和密码。麻烦在于密码,为各个帐户使用相同的密码会带来安全风险,因为[如果其中一个网站遭到入侵,黑客也会在其他网站上尝试相同的电子邮件密码组合][1]。
|
||||
|
||||
但是,为所有新帐户设置独有的密码意味着你必须记住所有密码,这对普通人而言不太可能。这就是密码管理器可以提供帮助的地方。
|
||||
|
||||
密码管理应用会为你建议/创建强密码,并将其存储在加密的数据库中。你只需要记住密码管理器的主密码即可。
|
||||
|
||||
@ -26,121 +28,111 @@ _ **密码管理器是创建唯一密码并安全存储它们的有用工具,
|
||||
|
||||
### Linux 密码管理器
|
||||
|
||||
可能的非 FOSS 警报!
|
||||
> 可能的非 FOSS 警报!
|
||||
|
||||
我们优先考虑开源软件(有一些专有软件,请不要讨厌我!),并提供适用于 Linux 的独立桌面应用(GUI)。专有软件已高亮显示。
|
||||
> 我们优先考虑开源软件(有一些专有软件,请不要讨厌我!),并提供适用于 Linux 的独立桌面应用(GUI)。专有软件已高亮显示。
|
||||
|
||||
#### 1\. Bitwarden
|
||||
#### 1、Bitwarden
|
||||
|
||||
![][3]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* 开源
|
||||
* 免费供个人使用(可选付费升级)
|
||||
* 云服务器的端到端加密
|
||||
* 跨平台
|
||||
* 有浏览器扩展
|
||||
* 命令行工具
|
||||
|
||||
|
||||
* 开源
|
||||
* 免费供个人使用(可选付费升级)
|
||||
* 云服务器的端到端加密
|
||||
* 跨平台
|
||||
* 有浏览器扩展
|
||||
* 命令行工具
|
||||
|
||||
Bitwarden 是 Linux 上最令人印象深刻的密码管理器之一。老实说,直到现在我才知道它。我已经从 [LastPass][4] 切换到了它。我能够轻松地从 LastPass 导入数据,而没有任何问题和困难。
|
||||
|
||||
高级版本的价格仅为每年 10 美元。这似乎是值得的(我已经为个人使用进行了升级)。
|
||||
付费版本的价格仅为每年 10 美元。这似乎是值得的(我已经为个人使用进行了升级)。
|
||||
|
||||
它是一个开源解决方案,因此没有任何可疑之处。你甚至可以将其托管在自己的服务器上,并为你的组织创建密码解决方案。
|
||||
|
||||
除此之外,你还将获得所有必需的功能,例如用于登录的两步验证、导入/导出凭据,指纹短语(唯一键),密码生成器等等。
|
||||
除此之外,你还将获得所有必需的功能,例如用于登录的两步验证、导入/导出凭据、指纹短语(唯一键)、密码生成器等等。
|
||||
|
||||
你可以免费将帐户升级为组织帐户,以便最多与 2 个用户共享你的信息。但是,如果你想要额外的加密存储以及与 5 个用户共享密码的功能,那么高级升级的费用低至每月 1 美元。我认为绝对值得一试!
|
||||
你可以免费将帐户升级为组织帐户,以便最多与 2 个用户共享你的信息。但是,如果你想要额外的加密存储以及与 5 个用户共享密码的功能,那么付费升级的费用低至每月 1 美元。我认为绝对值得一试!
|
||||
|
||||
[Bitwarden][5]
|
||||
- [Bitwarden][5]
|
||||
|
||||
#### 2\. Buttercup
|
||||
#### 2、Buttercup
|
||||
|
||||
![][6]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* 开源
|
||||
* 免费,没有高级选项。
|
||||
* 跨平台
|
||||
* 有浏览器扩展
|
||||
* 开源
|
||||
* 免费,没有付费方式。
|
||||
* 跨平台
|
||||
* 有浏览器扩展
|
||||
|
||||
这是 Linux 中的另一个开源密码管理器。Buttercup 可能不是一个非常流行的解决方案。但是,如果你在寻找一种更简单的保存凭据的方法,那么这将是一个不错的开始。
|
||||
|
||||
|
||||
Linux 中的另一个开源密码管理器。Buttercup 可能不是一个非常流行的解决方案。但是,如果你在寻找一种更简单的方法来保存凭据,那么这将是一个不错的开始。
|
||||
|
||||
与其他软件不同,你不必对其云服务器持怀疑态度,因为它只支持离线使用并支持连接 [Dropbox][7]、[OwnCloud] [8]、[Nextcloud][9] 和 [WebDAV][10] 等云服务。
|
||||
与其他软件不同,你不必对怀疑其云服务器的安全,因为它只支持离线使用并支持连接 [Dropbox][7]、[OwnCloud] [8]、[Nextcloud][9] 和 [WebDAV][10] 等云服务。
|
||||
|
||||
因此,如果需要同步数据,那么可以选择云服务。你有不同选择。
|
||||
|
||||
[Buttercup][11]
|
||||
- [Buttercup][11]
|
||||
|
||||
#### 3\. KeePassXC
|
||||
#### 3、KeePassXC
|
||||
|
||||
![][12]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* 开源
|
||||
* 简单的密码管理器
|
||||
* 跨平台
|
||||
* 没有移动支持
|
||||
* 开源
|
||||
* 简单的密码管理器
|
||||
* 跨平台
|
||||
* 没有移动设备支持
|
||||
|
||||
|
||||
|
||||
KeePassXC 是 [KeePassX][13] 的社区分支,它最初是 Windows 上 [KeePass][14] 的 Linux 移植。
|
||||
KeePassXC 是 [KeePassX][13] 的社区分支,它最初是 Windows 上 [KeePass][14] 的 Linux 移植版本。
|
||||
|
||||
除非你没意识到,KeePassX 已经多年没有维护。因此,如果你在寻找简单易用的密码管理器,那么 KeePassXC 是一个不错的选择。KeePassXC 可能不是最漂亮或最好的密码管理器,但它确实可以做到该做的事。
|
||||
|
||||
它也是安全和开源的。我认为这值得一试,你说呢?
|
||||
|
||||
[KeePassXC][15]
|
||||
- [KeePassXC][15]
|
||||
|
||||
#### 4\. Enpass (非开源)
|
||||
#### 4、Enpass (非开源)
|
||||
|
||||
![][16]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* 专有
|
||||
* 许多功能-包括“可穿戴”设备支持。
|
||||
* Linux 完全免费(具有高级功能)
|
||||
|
||||
|
||||
* 专有软件
|
||||
* 有许多功能,包括对“可穿戴”设备支持。
|
||||
* Linux 完全免费(具有付费支持)
|
||||
|
||||
Enpass 是非常流行的跨平台密码管理器。即使它不是开源解决方案,但还是有很多人依赖它。因此,至少可以肯定它是可行的。
|
||||
|
||||
它提供了很多功能,如果你有可穿戴设备,它也将支持它,这点很少见。
|
||||
它提供了很多功能,如果你有可穿戴设备,它也可以支持它,这点很少见。
|
||||
|
||||
很高兴看到 Enpass 积极管理 Linux 发行版的软件包。另外,请注意,它仅适用于 64 位系统。你可以在它的网站上找到[官方的安装说明] [17]。它需要使用终端,但是我按照步骤进行了测试,它非常好用。
|
||||
很高兴能看到 Enpass 积极管理 Linux 发行版的软件包。另外,请注意,它仅适用于 64 位系统。你可以在它的网站上找到[官方的安装说明] [17]。它需要使用终端,但是我按照步骤进行了测试,它非常好用。
|
||||
|
||||
[Enpass][18]
|
||||
- [Enpass][18]
|
||||
|
||||
#### 5\. myki (非开源)
|
||||
#### 5、myki (非开源)
|
||||
|
||||
![][19]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* 专有
|
||||
* 不使用云服务器存储密码
|
||||
* 专注于本地点对点同步
|
||||
* 能够在移动设备上用指纹 ID 替换密码
|
||||
* 专有软件
|
||||
* 不使用云服务器存储密码
|
||||
* 专注于本地点对点同步
|
||||
* 能够在移动设备上用指纹 ID 替换密码
|
||||
|
||||
这可能不是一个受欢迎的建议,但我发现它很有趣。它是专有软件密码管理器,它让你避免使用云服务器,而是依靠点对点同步。
|
||||
|
||||
因此,如果你不想使用任何云服务器来存储你的信息,那么它适合你。另外值得注意的是,用于 Android 和 iOS 的程序可让你用指纹 ID 替换密码。如果你希望便于在手机上使用,又有桌面密码管理器的基本功能,这似乎是个不错的选择。
|
||||
|
||||
这可能不是一个受欢迎的建议,但我发现它很有趣。它是专有的密码管理器,它让你避免使用云服务器,并依靠点对点同步。
|
||||
|
||||
因此,如果你不想使用任何云服务器来存储你的信息,那么它适合你。另外值得注意的是,用于 Android 和 iOS 的程序可帮助你用指纹 ID 替换密码。如果你希望在手机上使用方便,还有桌面密码管理器的基本功能,这似乎是个不错的选择。
|
||||
|
||||
但是,如果你选择升级到高级版,这有个付费计划供你判断,绝对不便宜。
|
||||
但是,如果你选择升级到付费版,这有个付费计划供你判断,绝对不便宜。
|
||||
|
||||
尝试一下,让我们知道它如何!
|
||||
|
||||
[myki][20]
|
||||
- [myki][20]
|
||||
|
||||
### 其他一些值得说的密码管理器
|
||||
|
||||
@ -150,13 +142,13 @@ Enpass 是非常流行的跨平台密码管理器。即使它不是开源解决
|
||||
|
||||
如果你正在寻找命令行密码管理器,那你应该试试 [Pass][25]。
|
||||
|
||||
[Password Safe][26] 也是种选择,但它的 Linux 客户端还处于 beta。我不建议依靠 “beta” 程序来存储密码。还有 [Universal Password Manager][27],但它不再维护。你可能也听说过 [Password Gorilla][28],但并它没有积极维护。
|
||||
[Password Safe][26] 也是种选择,但它的 Linux 客户端还处于 beta 阶段。我不建议依靠 “beta” 程序来存储密码。还有 [Universal Password Manager][27],但它不再维护。你可能也听说过 [Password Gorilla][28],但并它没有积极维护。
|
||||
|
||||
**总结**
|
||||
### 总结
|
||||
|
||||
目前,Bitwarden 似乎是我个人的最爱。但是,在 Linux 上有几个选项可供选择。你可以选择提供原生应用的程序,也可选择浏览器插件,选择权在你。
|
||||
目前,Bitwarden 似乎是我个人的最爱。但是,在 Linux 上有几个替代品可供选择。你可以选择提供原生应用的程序,也可选择浏览器插件,选择权在你。
|
||||
|
||||
如果有错过值得尝试的密码管理器,请在下面的评论中告诉我们。与往常一样,我们会根据你的建议扩展列表。
|
||||
如果我有错过值得尝试的密码管理器,请在下面的评论中告诉我们。与往常一样,我们会根据你的建议扩展列表。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -165,7 +157,7 @@ via: https://itsfoss.com/password-managers-linux/
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -1,15 +1,17 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (laingke)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11533-1.html)
|
||||
[#]: subject: (Initializing arrays in Java)
|
||||
[#]: via: (https://opensource.com/article/19/10/initializing-arrays-java)
|
||||
[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen)
|
||||
|
||||
Java 中初始化数组
|
||||
======
|
||||
数组是一种有用的数据类型,用于管理在连续内存位置中建模最好的集合元素。下面是如何有效地使用它们。
|
||||
|
||||
> 数组是一种有用的数据类型,用于管理在连续内存位置中建模最好的集合元素。下面是如何有效地使用它们。
|
||||
|
||||
![Coffee beans and a cup of coffee][1]
|
||||
|
||||
有使用 C 或者 FORTRAN 语言编程经验的人会对数组的概念很熟悉。它们基本上是一个连续的内存块,其中每个位置都是某种数据类型:整型、浮点型或者诸如此类的数据类型。
|
||||
@ -20,29 +22,23 @@ Java 的情况与此类似,但是有一些额外的问题。
|
||||
|
||||
让我们在 Java 中创建一个长度为 10 的整型数组:
|
||||
|
||||
|
||||
```
|
||||
int[] ia = new int[10];
|
||||
```
|
||||
|
||||
上面的代码片段会发生什么?从左到右依次是:
|
||||
|
||||
1. 最左边的 **int[]** 将数组变量的 _类型_ 声明为 **int**(由 **[]**表示)。
|
||||
1. 最左边的 `int[]` 将变量的*类型*声明为 `int` 数组(由 `[]` 表示)。
|
||||
2. 它的右边是变量的名称,当前为 `ia`。
|
||||
3. 接下来,`=` 告诉我们,左侧定义的变量赋值为右侧的内容。
|
||||
4. 在 `=` 的右侧,我们看到了 `new`,它在 Java 中表示一个对象正在*被初始化中*,这意味着已为其分配存储空间并调用了其构造函数([请参见此处以获取更多信息][2])。
|
||||
5. 然后,我们看到 `int[10]`,它告诉我们正在初始化的这个对象是包含 10 个整型的数组。
|
||||
|
||||
2. 它的右边是变量的名称,当前为 **ia**。
|
||||
|
||||
3. 接下来,**=** 告诉我们,左侧定义的变量赋值为右侧的内容。
|
||||
|
||||
4. 在 **=** 的右侧,我们看到了 **new**,它在 Java 中表示一个对象正在 _被初始化_ 中,这意味着已为其分配存储空间并调用了其构造函数([请参见此处以获取更多信息][2])。
|
||||
|
||||
5. 然后,我们看到 **int[10]**,它告诉我们正在初始化的这个对象是包含 10 个整型的数组。
|
||||
|
||||
|
||||
因为 Java 是强类型的,所以变量 **ia** 的类型必须跟 **=** 右侧表达式的类型兼容。
|
||||
因为 Java 是强类型的,所以变量 `ia` 的类型必须跟 `=` 右侧表达式的类型兼容。
|
||||
|
||||
### 初始化示例数组
|
||||
|
||||
让我们把这个简单的数组放在一段代码中,并尝试运行一下。将以下内容保存到一个名为 **Test1.java** 的文件中,使用 **javac** 编译,使用 **java** 运行(当然是在终端中):
|
||||
让我们把这个简单的数组放在一段代码中,并尝试运行一下。将以下内容保存到一个名为 `Test1.java` 的文件中,使用 `javac` 编译,使用 `java` 运行(当然是在终端中):
|
||||
|
||||
```
|
||||
import java.lang.*;
|
||||
@ -61,15 +57,12 @@ public class Test1 {
|
||||
|
||||
让我们来看看最重要的部分。
|
||||
|
||||
1. 我们很容易发现长度为 10 的整型数组,**ia** 的声明和初始化。
|
||||
2. 在下面的行中,我们看到表达式 **ia.getClass()**。没错,**ia** 是属于一个 _类_ 的 _对象_,这行代码将告诉我们是哪个类。
|
||||
3. 在紧接的下一行中,我们看到了一个循环 **for (int i = 0; i < ia.length; i++)**,它定义了一个循环索引变量 **i**,该变量运行的序列从 0 到比 **ia.length** 小 1,这个表达式告诉我们在数组 **ia** 中定义了多少个元素。
|
||||
4. 接下来,循环体打印出 **ia** 的每个元素的值。
|
||||
|
||||
|
||||
|
||||
当这个程序被编译和运行时,它产生以下结果:
|
||||
1. 我们声明和初始化了长度为 10 的整型数组,即 `ia`,这显而易见。
|
||||
2. 在下面的行中,我们看到表达式 `ia.getClass()`。没错,`ia` 是属于一个*类*的*对象*,这行代码将告诉我们是哪个类。
|
||||
3. 在紧接的下一行中,我们看到了一个循环 `for (int i = 0; i < ia.length; i++)`,它定义了一个循环索引变量 `i`,该变量遍历了从 0 到比 `ia.length` 小 1 的序列,这个表达式告诉我们在数组 `ia` 中定义了多少个元素。
|
||||
4. 接下来,循环体打印出 `ia` 的每个元素的值。
|
||||
|
||||
当这个程序编译和运行时,它产生以下结果:
|
||||
|
||||
```
|
||||
me@mydesktop:~/Java$ javac Test1.java
|
||||
@ -88,7 +81,7 @@ ia[9] = 0
|
||||
me@mydesktop:~/Java$
|
||||
```
|
||||
|
||||
**ia.getClass()** 的输出的字符串表示形式是 **[I**,它是“整数数组”的简写。与 C 语言类似,Java 数组以第 0 个元素开始,扩展到第 **<数组大小> - 1** 个元素。我们可以在上面看到数组 ia 的每个元素都设置为零(看来是数组构造函数)。
|
||||
`ia.getClass()` 的输出的字符串表示形式是 `[I`,它是“整数数组”的简写。与 C 语言类似,Java 数组以第 0 个元素开始,扩展到第 `<数组大小> - 1` 个元素。如上所见,我们可以看到数组 `ia` 的每个元素都(似乎由数组构造函数)设置为零。
|
||||
|
||||
所以,就这些吗?声明类型,使用适当的初始化器,就完成了吗?
|
||||
|
||||
@ -105,15 +98,14 @@ int[] callsMade;
|
||||
int[] callsReceived;
|
||||
```
|
||||
|
||||
然后,每当我们开始一个新的累积呼叫统计数据的周期时,我们就将每个数组初始化为:
|
||||
然后,每当我们开始一个新的累计呼叫统计数据的周期时,我们就将每个数组初始化为:
|
||||
|
||||
```
|
||||
callsMade = new int[9];
|
||||
callsReceived = new int[9];
|
||||
```
|
||||
|
||||
在每个累积通话统计数据的最后阶段,我们可以打印出统计数据。粗略地说,我们可能会看到:
|
||||
|
||||
在每个累计通话统计数据的最后阶段,我们可以打印出统计数据。粗略地说,我们可能会看到:
|
||||
|
||||
```
|
||||
import java.lang.*;
|
||||
@ -151,7 +143,6 @@ public class Test2 {
|
||||
|
||||
这会产生这样的输出:
|
||||
|
||||
|
||||
```
|
||||
me@mydesktop:~/Java$ javac Test2.java
|
||||
me@mydesktop:~/Java$ java Test2
|
||||
@ -168,11 +159,11 @@ ext calls made calls received
|
||||
me@mydesktop:~/Java$
|
||||
```
|
||||
|
||||
呼叫中心不是很忙的一天。
|
||||
看来这一天呼叫中心不是很忙。
|
||||
|
||||
在上面的累加器示例中,我们看到由数组初始化程序设置的零起始值可以满足我们的需求。但是在其它情况下,这个起始值可能不是正确的选择。
|
||||
|
||||
例如,在某些几何计算中,我们可能需要将二维数组初始化为单位矩阵(除沿主对角线的那些零以外的所有零)。我们可以选择这样做:
|
||||
例如,在某些几何计算中,我们可能需要将二维数组初始化为单位矩阵(除沿主对角线———左上角到右下角——以外所有全是零)。我们可以选择这样做:
|
||||
|
||||
|
||||
```
|
||||
@ -182,7 +173,7 @@ for (int d = 0; d < 3; d++) {
|
||||
}
|
||||
```
|
||||
|
||||
在这种情况下,我们依靠数组初始化器 **new double[3][3]** 将数组设置为零,然后使用循环将对角元素设置为 1。 在这种简单情况下,我们可以使用 Java 提供的快捷方式:
|
||||
在这种情况下,我们依靠数组初始化器 `new double[3][3]` 将数组设置为零,然后使用循环将主对角线上的元素设置为 1。在这种简单情况下,我们可以使用 Java 提供的快捷方式:
|
||||
|
||||
```
|
||||
double[][] m = {
|
||||
@ -191,7 +182,7 @@ double[][] m = {
|
||||
{0.0, 0.0, 1.0}};
|
||||
```
|
||||
|
||||
这种可视结构特别适用于这种应用程序,在这种应用程序中,可以通过双重检查查看数组的实际布局。但是在这种情况下,行数和列数只在运行时确定,我们可能会看到这样的东西:
|
||||
这种可视结构特别适用于这种应用程序,在这种应用程序中,它便于复查数组的实际布局。但是在这种情况下,行数和列数只在运行时确定时,我们可能会看到这样的东西:
|
||||
|
||||
```
|
||||
int nrc;
|
||||
@ -202,8 +193,7 @@ for (int d = 0; d < nrc; d++) {
|
||||
}
|
||||
```
|
||||
|
||||
值得一提的是,Java 中的二维数组实际上是数组的数组,没有什么能阻止无畏的程序员让这些第二级数组中的每个数组的长度都不同。也就是说,下面这样的事情是完全合法的:
|
||||
|
||||
值得一提的是,Java 中的二维数组实际上是数组的数组,没有什么能阻止无畏的程序员让这些第二层数组中的每个数组的长度都不同。也就是说,下面这样的事情是完全合法的:
|
||||
|
||||
```
|
||||
int [][] differentLengthRows = {
|
||||
@ -220,19 +210,19 @@ int [][] differentLengthRows = {
|
||||
differentLengthRows.length
|
||||
```
|
||||
|
||||
告诉我们二维数组 **differentLengthRows** 的行数,并且:
|
||||
可以告诉我们二维数组 `differentLengthRows` 的行数,并且:
|
||||
|
||||
```
|
||||
differentLengthRows[i].length
|
||||
```
|
||||
|
||||
告诉我们 **differentLengthRows** 第 **i** 行的列数。
|
||||
告诉我们 `differentLengthRows` 第 `i` 行的列数。
|
||||
|
||||
### 深入理解数组
|
||||
|
||||
考虑到在运行时确定数组大小的想法,我们看到数组在实例化之前仍需要我们知道该大小。但是,如果在处理完所有数据之前我们不知道大小怎么办?这是否意味着我们必须先处理一次以找出数组的大小,然后再次处理?这可能很难做到,尤其是如果我们只有一次机会使用数据时。
|
||||
|
||||
[Java 集合框架][6]很好地解决了这个问题。提供的其中一项是 **ArrayList** 类,它类似于数组,但可以动态扩展。为了演示 **ArrayList** 的工作原理,让我们创建一个 ArrayList 并将其初始化为前 20 个[斐波那契数字][7]:
|
||||
[Java 集合框架][6]很好地解决了这个问题。提供的其中一项是 `ArrayList` 类,它类似于数组,但可以动态扩展。为了演示 `ArrayList` 的工作原理,让我们创建一个 `ArrayList` 对象并将其初始化为前 20 个[斐波那契数字][7]:
|
||||
|
||||
```
|
||||
import java.lang.*;
|
||||
@ -258,20 +248,17 @@ public class Test3 {
|
||||
}
|
||||
```
|
||||
|
||||
上面的代码中,我们看到:
|
||||
上面的代码中,我们看到:
|
||||
|
||||
* 用于存储多个 **Integer** 的 **ArrayList** 的声明和实例化。
|
||||
* 使用 **add()** 附加到 **ArrayList** 实例。
|
||||
* 使用 **get()** 通过索引号检索元素。
|
||||
* 使用 **size()** 来确定 **ArrayList** 实例中已经有多少个元素。
|
||||
* 用于存储多个 `Integer` 的 `ArrayList` 的声明和实例化。
|
||||
* 使用 `add()` 附加到 `ArrayList` 实例。
|
||||
* 使用 `get()` 通过索引号检索元素。
|
||||
* 使用 `size()` 来确定 `ArrayList` 实例中已经有多少个元素。
|
||||
|
||||
|
||||
|
||||
没有显示 **put()** 方法,它的作用是将一个值放在给定的索引号上。
|
||||
这里没有展示 `put()` 方法,它的作用是将一个值放在给定的索引号上。
|
||||
|
||||
该程序的输出为:
|
||||
|
||||
|
||||
```
|
||||
fibonacci 0 = 0
|
||||
fibonacci 1 = 1
|
||||
@ -295,20 +282,19 @@ fibonacci 18 = 2584
|
||||
fibonacci 19 = 4181
|
||||
```
|
||||
|
||||
**ArrayList** 实例也可以通过其它方式初始化。例如,一个数组可以提供给 **ArrayList** 构造器,或者 **List.of()** 和 **array.aslist()** 方法可以在编译过程中知道初始元素时使用。我发现自己并不经常使用这些选项,因为我对 **ArrayList** 的主要用途是我只想读取一次数据。
|
||||
`ArrayList` 实例也可以通过其它方式初始化。例如,可以给 `ArrayList` 构造器提供一个数组,或者在编译过程中知道初始元素时也可以使用 `List.of()` 和 `array.aslist()` 方法。我发现自己并不经常使用这些方式,因为我对 `ArrayList` 的主要用途是当我只想读取一次数据时。
|
||||
|
||||
此外,对于那些喜欢在加载数据后使用数组的人,可以使用 **ArrayList** 的 **toArray()** 方法将其实例转换为数组;或者,在初始化 **ArrayList** 实例之后,返回到当前数组本身。
|
||||
此外,对于那些喜欢在加载数据后使用数组的人,可以使用 `ArrayList` 的 `toArray()` 方法将其实例转换为数组;或者,在初始化 `ArrayList` 实例之后,返回到当前数组本身。
|
||||
|
||||
Java 集合框架提供了另一种类似数组的数据结构,称为 **Map**。我所说的“类似数组”是指 **Map** 定义了一个对象集合,它的值可以通过一个键来设置或检索,但与数组(或 **ArrayList**)不同,这个键不需要是整型数;它可以是 **String** 或任何其它复杂对象。
|
||||
Java 集合框架提供了另一种类似数组的数据结构,称为 `Map`(映射)。我所说的“类似数组”是指 `Map` 定义了一个对象集合,它的值可以通过一个键来设置或检索,但与数组(或 `ArrayList`)不同,这个键不需要是整型数;它可以是 `String` 或任何其它复杂对象。
|
||||
|
||||
例如,我们可以创建一个 **Map**,其键为 **String**,其值为 **Integer** 类型,如下:
|
||||
例如,我们可以创建一个 `Map`,其键为 `String`,其值为 `Integer` 类型,如下:
|
||||
|
||||
```
|
||||
Map<String, Integer> stoi = new Map<String, Integer>();
|
||||
```
|
||||
|
||||
然后我们可以对这个 **Map** 进行如下初始化:
|
||||
|
||||
然后我们可以对这个 `Map` 进行如下初始化:
|
||||
|
||||
```
|
||||
stoi.set("one",1);
|
||||
@ -316,23 +302,21 @@ stoi.set("two",2);
|
||||
stoi.set("three",3);
|
||||
```
|
||||
|
||||
等类似操作。稍后,当我们想要知道 **"three"** 的数值时,我们可以通过下面的方式将其检索出来:
|
||||
|
||||
等类似操作。稍后,当我们想要知道 `"three"` 的数值时,我们可以通过下面的方式将其检索出来:
|
||||
|
||||
```
|
||||
stoi.get("three");
|
||||
```
|
||||
|
||||
在我的认知中,**Map** 对于将第三方数据集中出现的字符串转换为我的数据集中的一致代码值非常有用。作为[数据转换管道][8]的一部分,我经常会构建一个小型的独立程序,用作在处理数据之前清理数据;为此,我几乎总是会使用一个或多个 **Map**。
|
||||
在我的认知中,`Map` 对于将第三方数据集中出现的字符串转换为我的数据集中的一致代码值非常有用。作为[数据转换管道][8]的一部分,我经常会构建一个小型的独立程序,用作在处理数据之前清理数据;为此,我几乎总是会使用一个或多个 `Map`。
|
||||
|
||||
值得一提的是,内部定义有 **ArrayList** 的 **ArrayLists** 和 **Map** 的 **Maps** 是很可能的,有时也是合理的。例如,假设我们在看树,我们对按树种和年龄范围累积树的数目感兴趣。假设年龄范围定义是一组字符串值(“young”、“mid”、“mature” 和 “old”),物种是 “Douglas fir”、“western red cedar” 等字符串值,那么我们可以将这个 **Map** 中的 **Map** 定义为:
|
||||
值得一提的是,`ArrayList` 的 `ArrayList` 和 `Map` 的 `Map` 是很可能的,有时也是合理的。例如,假设我们在看树,我们对按树种和年龄范围累计树的数目感兴趣。假设年龄范围定义是一组字符串值(“young”、“mid”、“mature” 和 “old”),物种是 “Douglas fir”、“western red cedar” 等字符串值,那么我们可以将这个 `Map` 中的 `Map` 定义为:
|
||||
|
||||
```
|
||||
Map<String, Map<String, Integer>> counter = new Map<String, Map<String, Integer>>();
|
||||
```
|
||||
|
||||
One thing to watch out for here is that the above only creates storage for the _rows_ of **Map**s. So, our accumulation code might look like:
|
||||
这里需要注意的一件事是,以上内容仅为 **Map** 的 _行_ 创建存储。 因此,我们的累加代码可能类似于:
|
||||
这里需要注意的一件事是,以上内容仅为 `Map` 的*行*创建存储。因此,我们的累加代码可能类似于:
|
||||
|
||||
```
|
||||
// 假设我们已经知道了物种和年龄范围
|
||||
@ -344,14 +328,13 @@ if (!counter.get(species).containsKey(ageRange)) {
|
||||
}
|
||||
```
|
||||
|
||||
此时,我们可以开始累加:
|
||||
|
||||
此时,我们可以这样开始累加:
|
||||
|
||||
```
|
||||
counter.get(species).put(ageRange, counter.get(species).get(ageRange) + 1);
|
||||
```
|
||||
|
||||
最后,值得一提的是(Java 8 中的新特性)Streams 还可以用来初始化数组、**ArrayList** 实例和 **Map** 实例。关于此特性的详细讨论可以在[此处][9]和[此处][10]中找到。
|
||||
最后,值得一提的是(Java 8 中的新特性)Streams 还可以用来初始化数组、`ArrayList` 实例和 `Map` 实例。关于此特性的详细讨论可以在[此处][9]和[此处][10]中找到。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -360,7 +343,7 @@ via: https://opensource.com/article/19/10/initializing-arrays-java
|
||||
作者:[Chris Hermansen][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[laingke](https://github.com/laingke)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -1,52 +1,46 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: ( Morisun029)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: translator: (Morisun029)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11534-1.html)
|
||||
[#]: subject: (Open Source CMS Ghost 3.0 Released with New features for Publishers)
|
||||
[#]: via: (https://itsfoss.com/ghost-3-release/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
开源 CMS Ghost 3.0发布新功能
|
||||
开源 CMS Ghost 3.0 发布,带来新功能
|
||||
======
|
||||
|
||||
[Ghost][1]是一个免费的开源内容管理系统(CMS)。 如果你还不了CMS,那我在此解释一下。CMS 是一款软件,用它可以构建专注于创建内容的网站,而无需了解 HTML 和其他与 Web 相关的技术。
|
||||
[Ghost][1] 是一个自由开源的内容管理系统(CMS)。如果你还不了解 CMS,那我在此解释一下。CMS 是一种软件,用它可以构建主要专注于创建内容的网站,而无需了解 HTML 和其他与 Web 相关的技术。
|
||||
|
||||
事实上,Ghost 是目前[最好的开源 CMS][2] 之一。它主要聚焦于创建轻量级、快速加载、界面美观的博客。
|
||||
|
||||
事实上,Ghost 是目前[最好的开源 CMS][2] 之一。 它主要聚焦于创建轻量级、快速加载、界面美观的博客。
|
||||
|
||||
|
||||
Ghost 系统有一个现代直观的编辑器,该编辑器内置 SEO(搜索引擎优化)功能。 你也可以用本地桌面(包括Linux 系统)和移动应用程序。 如果你喜欢终端,也可以使用其提供的 CLI(命令行界面)工具。
|
||||
|
||||
让我们看看Ghost 3.0带来了什么新功能。
|
||||
|
||||
Ghost 系统有一个现代直观的编辑器,该编辑器内置 SEO(搜索引擎优化)功能。你也可以用本地桌面(包括 Linux 系统)和移动应用程序。如果你喜欢终端,也可以使用其提供的 CLI(命令行界面)工具。
|
||||
|
||||
让我们看看 Ghost 3.0 带来了什么新功能。
|
||||
|
||||
### Ghost 3.0 的新功能
|
||||
|
||||
![][3]
|
||||
|
||||
我通常对开源的 CMS 解决方案很感兴趣。因此,在阅读了官方公告后,我继续尝试通过[Digital Ocean 云服务器][4]来安装新的 Ghost 实例。
|
||||
我通常对开源的 CMS 解决方案很感兴趣。因此,在阅读了官方公告后,我通过在 Digital Ocean 云服务器上安装新的 Ghost 实例来进一步尝试它。
|
||||
|
||||
与以前的版本相比,Ghost 3.0 在功能和用户界面上的改进给我留下了深刻的印象。
|
||||
|
||||
在此,我将列出一些值得一提的关键点。
|
||||
|
||||
|
||||
#### 书签卡
|
||||
|
||||
![][5]
|
||||
|
||||
除了编辑器的所有细微更改之外,3.0版本现在支持通过输入 URL 添加漂亮的书签卡。
|
||||
|
||||
如果你使用过WordPress(你可能已经注意到,WordPress 需要添加一个插件才能添加类似的卡片),所以该功能绝对是Ghost 3.0 系统的一个最大改进。
|
||||
除了编辑器的所有细微更改之外,3.0 版本现在支持通过输入 URL 添加漂亮的书签卡。
|
||||
|
||||
如果你使用过 WordPress(你可能已经注意到,WordPress 需要添加一个插件才能添加类似的卡片),所以该功能绝对是 Ghost 3.0 系统的一个最大改进。
|
||||
|
||||
#### 改进的 WordPress 迁移插件
|
||||
|
||||
我还未对 WordPress 进行特别测试,但它已经对 WordPress 的迁移插件进行了更新,可以让你轻松地将帖子(带有图片)克隆到 Ghost CMS。
|
||||
|
||||
基本上,使用该插件,你就能够创建一个存档(包含图片)并将其导入到Ghost CMS。
|
||||
|
||||
我没有专门对此进行测试,但它更新了 WordPress 的迁移插件,可以让你轻松地将帖子(带有图片)克隆到 Ghost CMS。
|
||||
|
||||
基本上,使用该插件,你就能够创建一个存档(包含图片)并将其导入到 Ghost CMS。
|
||||
|
||||
#### 响应式图像库和图片
|
||||
|
||||
@ -54,53 +48,49 @@ Ghost 系统有一个现代直观的编辑器,该编辑器内置 SEO(搜索
|
||||
|
||||
此外,帖子和页面中的图片也更改为响应式的了。
|
||||
|
||||
|
||||
|
||||
#### 添加成员和订阅选项
|
||||
|
||||
![Ghost Subscription Model][6]
|
||||
|
||||
虽然,该功能目前还处于测试阶段,但如果你是以此平台作为维持你业务关系的重要发布平台,你可以为你的博客添加成员,订阅选项。
|
||||
虽然,该功能目前还处于测试阶段,但如果你是以此平台作为维持你业务关系的重要发布平台,你可以为你的博客添加成员、订阅选项。
|
||||
|
||||
该功能可以确保只有订阅的成员才能访问你的博客,你也可以选择让未订阅者也可以访问。
|
||||
|
||||
#### Stripe:集成支付功能
|
||||
|
||||
#### 条纹(美国公司):支付整合
|
||||
|
||||
默认情况下,该版本支持 Stripe 付款网关,帮助你轻松订阅(或使用任何类型的付款的付款方式),而 Ghost 不再收取任何额外费用。
|
||||
默认情况下,该版本支持 Stripe 付款网关,帮助你轻松启用订阅功能(或使用任何类型的付款的付款方式),而 Ghost 不收取任何额外费用。
|
||||
|
||||
#### 新的应用程序集成
|
||||
|
||||
![][7]
|
||||
|
||||
你现在可以在 Ghost 3.0 的博客中集成各种流行的应用程序/服务。 它可以使很多事情自动化。
|
||||
你现在可以在 Ghost 3.0 的博客中集成各种流行的应用程序/服务。它可以使很多事情自动化。
|
||||
|
||||
#### 默认主题改进
|
||||
|
||||
引入的默认主题(设计)已得到改进,现在也提供了夜间模式。
|
||||
|
||||
你也可以随时选择创建自定义主题(如果没有可用的预置主题)。
|
||||
|
||||
#### 其他小改进
|
||||
|
||||
|
||||
除了所有关键亮点以外,用于创建帖子/页面的可视编辑器也得到了改进(具有某些拖放功能)。
|
||||
|
||||
我确定还有很多技术方面的更改-如果你对此感兴趣,可以在他们的[更改日志][8] 中查看。
|
||||
我确定还有很多技术方面的更改,如果你对此感兴趣,可以在他们的[更改日志][8]中查看。
|
||||
|
||||
### Ghost 影响力渐增
|
||||
|
||||
### Ghost 逐渐获得好的影响力
|
||||
要在以 WordPress 为主导的世界中获得认可并不是一件容易的事。但 Ghost 逐渐形成了它的一个专门的发布者社区。
|
||||
|
||||
要在以 WordPress 为主导的世界中获得认可并不是一件容易的事。 但 Ghost逐渐形成了一个专门的发布者社区。
|
||||
不仅如此,它的托管服务 [Ghost Pro][9] 现在拥有像 NASA,Mozilla 和 DuckDuckGo 这样的客户。
|
||||
不仅如此,它的托管服务 [Ghost Pro][9] 现在拥有像 NASA、Mozilla 和 DuckDuckGo 这样的客户。
|
||||
|
||||
在过去的六年中,Ghost 从其 Ghost Pro 客户那里获得了 500 万美元的收入。就从它是致力于开源系统解决方案的非营利组织这一点来讲,这确实是一项成就。
|
||||
|
||||
在过去的六年中,Ghost 从其 Ghost Pro 客户那里获得了500万美元的收入。 就从它是致力于开源系统解决方案的非营利组织这一点来讲,这确实是一项成就。
|
||||
这些收入有助于它们保持独立,避免风险投资家的外部资金投入。Ghost CMS 的托管客户越多,投入到免费和开源的 CMS 的研发款项就越多。
|
||||
|
||||
这些收入有助于它们保持独立,避免风险投资家的外部资金投入。Ghost CMS 的 托管客户越多,投入到免费和开源的 CMS 的研发款就越多。
|
||||
|
||||
总体而言,Ghost 3.0 是迄今为止提供的最好的升级版本。 这些功能给我留下了深刻的印象。
|
||||
|
||||
如果你拥有自己的网站,你会使用什么CMS吗? 你曾经使用过Ghost吗? 你的体验如何? 请在评论部分分享你的想法。
|
||||
总体而言,Ghost 3.0 是迄今为止提供的最好的升级版本。这些功能给我留下了深刻的印象。
|
||||
|
||||
如果你拥有自己的网站,你会使用什么 CMS?你曾经使用过 Ghost 吗?你的体验如何?请在评论部分分享你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -108,8 +98,8 @@ via: https://itsfoss.com/ghost-3-release/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Morisun029](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
译者:[Morisun029](https://github.com/Morisun029)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
Loading…
Reference in New Issue
Block a user