mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-19 22:51:41 +08:00
commit
69e9a13160
@ -0,0 +1,66 @@
|
||||
解决构建全球社区带来的挑战
|
||||
======
|
||||
|
||||
> 全球开源社区通常面临着语音壁垒、文化差异以及其它的挑战。如何去解决它们呢?
|
||||
|
||||
![配图 ](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_community2.png?itok=1blC7-NY)
|
||||
|
||||
今天的开源组织参与人员来自于全世界。你能预见到组建在线社区可能遇到哪些困难吗?有没有什么办法能够克服这些困难呢?
|
||||
|
||||
为开源社区贡献力量的人共同合作推动软件的开发和发展。在过去,人们是面对面或者通过邮件和电话来交流的。今天,科技孕育出了在线交流——人们只需要进入一个聊天室或消息渠道就能一起工作了。比如,你可以早上跟摩洛哥的人一起工作,到了晚上又跟夏威夷的人一起工作。
|
||||
|
||||
### 全球社区的三个挑战
|
||||
|
||||
任何一个团队合作过的人都知道意见分歧是很难被克服的。对于在线社区来说,语言障碍、不同的时区,以及文化差异也带来了新的挑战。
|
||||
|
||||
#### 语言障碍
|
||||
|
||||
英语是开源社区中的主流语言,因此英语不好的人会很难看懂文档和修改意见。为了克服这个问题,吸引其他地区的社区成员,你需要邀请双语者参与到社区中来。问问周围的人——你会发现意想不到的精通其他语言的人。社区的双语成员可以帮助别人跨越语言障碍,并且可以通过翻译软件和文档来扩大项目的受众范围。
|
||||
|
||||
人们使用的编程语言也不一样。你可能喜欢用 Bash 而其他人则可能更喜欢 Python、Ruby、C 等其他语言。这意味着,人们可能由于编程语言的原因而难以为你的代码库做贡献。项目负责人为项目选择一门被软件社区广泛认可的语言至关重要。如果你选择了一门偏门的语言,则很少人能够参与其中。
|
||||
|
||||
#### 不同的时区
|
||||
|
||||
时区为开源社区带来了另一个挑战。比如,若你在芝加哥,想与一个在伦敦的成员安排一次视频会议,你需要调整 8 小时的时差。根据合作者的地理位置,你可能要在深夜或者清晨工作。
|
||||
|
||||
肉身转移,可以让你的团队在同一个时区工作可以帮助克服这个挑战,但这种方法只有极少数社区才能够负担的起。我们还可以定期举行虚拟会议讨论项目,建立一个固定的时间和地点以供所有人来讨论未决的事项,即将发布的版本等其他主题。
|
||||
|
||||
不同的时区也可以成为你的优势,因为团队成员可以全天候的工作。若你拥有一个类似 IRC 这样的实时交流平台,用户可以在任意时间都能找到人来回答问题。
|
||||
|
||||
#### 文化差异
|
||||
|
||||
文化差异是开源组织面临的最大挑战。世界各地的人都有不同的思考方式、计划以及解决问题的方法。政治环境也会影响工作环境并影响决策。
|
||||
|
||||
作为项目负责人,你应该努力构建一种能包容不同看法的环境。文化差异可以鼓励社区沟通。建设性的讨论总是对项目有益,因为它可以帮助社区成员从不同角度看待问题。不同意见也有助于解决问题。
|
||||
|
||||
要成功开源,团队必须学会拥抱差异。这不简单,但多样性最终会使社区收益。
|
||||
|
||||
### 加强在线沟通的其他方法
|
||||
|
||||
- **本地化:** 在线社区成员可能会发现位于附近的贡献者——去见个面并组织一个本地社区。只需要两个人就能组建一个社区了。可以邀请其他当地用户或雇员参与其中;他们甚至还能为以后的聚会提供场所呢。
|
||||
- **组织活动:** 组织活动是构建本地社区的好方法,而且费用也不高。你可以在当地的咖啡屋或者啤酒厂聚会,庆祝最新版本的发布或者某个核心功能的实现。组织的活动越多,人们参与的热情就越高(即使只是因为单纯的好奇心)。最终,可能会找到一家公司为你提供聚会的场地,或者为你提供赞助。
|
||||
- **保持联系:** 每次活动后,联系本地社区成员。收起电子邮箱地址或者其他联系方式并邀请他们参与到你的交流平台中。邀请他们为其他社区做贡献。你很可能会发现很多当地的人才,运气好的话,甚至可能发现新的核心开发人员!
|
||||
- **分享经验:** 本地社区是一种非常有价值的资源,对你,对其他社区来说都是。与可能受益的人分享你的发现和经验。如果你不清楚(LCTT 译注:这里原文是说 sure,但是根据上下文,这里应该是 not sure)如何策划一场活动或会议,可以咨询其他人的意见。也许能找到一些有经验的人帮你走到正轨。
|
||||
- **关注文化差异:** 记住,文化规范因地点和人而异,因此在清晨安排某项活动可能适用于一个地方的人,但是不合适另一个地方的人。当然,你可以(也应该)利用其他社区的参考资料来更好地理解这种差异性,但有时你也需要通过试错的方式来学习。不要忘了分享你所学到的东西,让别人也从中获益。
|
||||
- **检查个人观点:** 避免在工作场合提出带有很强主观色彩的观点(尤其是与政治相关的观点)。这会抑制开放式的沟通和问题的解决。相反,应该专注于鼓励与团队成员展开建设性讨论。如果你发现陷入了激烈的争论中,那么后退一步,冷静一下,然后再从更加积极的角度出发重新进行讨论。讨论必须是有建设性的,从多个角度讨论问题对社区有益。永远不要把自己的主观观念放在社区的总体利益之前。
|
||||
- **尝试异步沟通:** 这些天,实时通讯平台已经引起了大家的关注,但除此之外还别忘了电子邮件。如果没有在网络平台上找到人的话,可以给他们发送一封电子邮件。有可能你很快就能得到回复。考虑使用那些专注于异步沟通的平台,比如 [Twist][1],也不要忘了查看并更新论坛和维基。
|
||||
- **使用不同的解决方案:** 并不存在一个单一的完美的解决方法,学习最有效的方法还是通过经验来学习。从反复试验中你可以学到很多东西。不要害怕失败;你会从失败中学到很多东西从而不停地进步。
|
||||
|
||||
### 社区需要营养
|
||||
|
||||
将社区想象成是一颗植物的幼苗。你需要每天给它浇水,提供阳光和氧气。社区也是一样:倾听贡献者的声音,记住你在与活生生的人进行互动,他们需要以合适的方式进行持续的交流。如果社区缺少了人情味,人们会停止对它的贡献。
|
||||
|
||||
最后,请记住,每个社区都是不同的,没有一种单一的解决方法能够适用于所有社区。坚持不断地从社区中学习并适应这个社区。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/12/working-worldwide-communities
|
||||
|
||||
作者:[José Antonio Rey][a]
|
||||
译者:[lujun9972](https://github.com/lujun9972)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/jose
|
||||
[1]:https://twistapp.com
|
@ -1,19 +1,18 @@
|
||||
一些常见的并发编程错误
|
||||
============================================================
|
||||
|
||||
Go 是一个内置支持并发编程的语言。借助使用 `go` 关键字去创建 goroutines(轻量级线程)和在 Go 中提供的 [使用][8] [信道][9] 和 [其它的并发][10] [同步方法][11],使得并发编程变得很容易、很灵活和很有趣。
|
||||
Go 是一个内置支持并发编程的语言。借助使用 `go` 关键字去创建<ruby>协程<rt>goroutine</rt></ruby>(轻量级线程)和在 Go 中提供的 [使用][8] [信道][9] 和 [其它的并发][10] [同步方法][11],使得并发编程变得很容易、很灵活和很有趣。
|
||||
|
||||
另一方面,Go 并不会阻止一些因 Go 程序员粗心大意或者缺乏经验而造成的并发编程错误。在本文的下面部分将展示一些在 Go 编程中常见的并发编程错误,以帮助 Go 程序员们避免再犯类似的错误。
|
||||
|
||||
### 需要同步的时候没有同步
|
||||
|
||||
代码行或许 [没有按出现的顺序运行][2]。
|
||||
代码行或许 [不是按出现的顺序运行的][2]。
|
||||
|
||||
在下面的程序中有两个错误。
|
||||
|
||||
* 第一,在 main goroutine 中读取 `b` 和在新的 goroutine 中写入 `b` 可能导致数据争用。
|
||||
|
||||
* 第二,条件 `b == true` 并不能保证在 main goroutine 中的 `a != nil`。在新的 goroutine 中编译器和 CPU 可能会通过 [重排序指令][1] 进行优化,因此,在运行时 `b` 赋值可能发生在 `a` 赋值之前,在 main goroutine 中当 `a` 被修改后,它将会让部分 `a` 一直保持为 `nil`。
|
||||
* 第一,在 `main` 协程中读取 `b` 和在新的 协程 中写入 `b` 可能导致数据争用。
|
||||
* 第二,条件 `b == true` 并不能保证在 `main` 协程 中的 `a != nil`。在新的协程中编译器和 CPU 可能会通过 [重排序指令][1] 进行优化,因此,在运行时 `b` 赋值可能发生在 `a` 赋值之前,在 `main` 协程 中当 `a` 被修改后,它将会让部分 `a` 一直保持为 `nil`。
|
||||
|
||||
```
|
||||
package main
|
||||
@ -39,7 +38,6 @@ func main() {
|
||||
}
|
||||
a[0], a[1], a[2] = 0, 1, 2 // might panic
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
上面的程序或者在一台计算机上运行的很好,但是在另一台上可能会引发异常。或者它可能运行了 _N_ 次都很好,但是可能在第 _(N+1)_ 次引发了异常。
|
||||
@ -70,7 +68,7 @@ func main() {
|
||||
我们先来看一个简单的例子。
|
||||
|
||||
```
|
||||
ppackage main
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
@ -118,7 +116,6 @@ func main() {
|
||||
num = 789
|
||||
fmt.Println(<-c)
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
你认为程序的预期输出是什么?`123` 还是 `789`?事实上它的输出与编译器有关。对于标准的 Go 编译器 1.10 来说,这个程序很有可能输出是 `123`。但是在理论上,它可能输出的是 `789`,或者其它的随机数。
|
||||
@ -127,7 +124,7 @@ func main() {
|
||||
|
||||
是的,在上面的程序中存在数据争用。表达式 `*p` 可能会被先计算、后计算、或者在处理赋值语句 `num = 789` 时计算。`time.Sleep` 调用并不能保证 `*p` 发生在赋值语句处理之前进行。
|
||||
|
||||
对于这个特定的示例,我们将在新的 goroutine 创建之前,将值保存到一个临时值中,然后在新的 goroutine 中使用临时值去消除数据争用。
|
||||
对于这个特定的示例,我们将在新的协程创建之前,将值保存到一个临时值中,然后在新的协程中使用临时值去消除数据争用。
|
||||
|
||||
```
|
||||
...
|
||||
@ -136,26 +133,21 @@ func main() {
|
||||
c <- tmp
|
||||
}()
|
||||
...
|
||||
|
||||
```
|
||||
|
||||
### 使 Goroutines 挂起
|
||||
### 使协程挂起
|
||||
|
||||
挂起 goroutines 是指让 goroutines 一直处于阻塞状态。导致 goroutines 被挂起的原因很多。比如,
|
||||
挂起协程是指让协程一直处于阻塞状态。导致协程被挂起的原因很多。比如,
|
||||
|
||||
* 一个 goroutine 尝试从一个 nil 信道中或者从一个没有其它 goroutines 给它发送值的信道中检索数据。
|
||||
* 一个协程尝试从一个 nil 信道中或者从一个没有其它协程给它发送值的信道中检索数据。
|
||||
* 一个协程尝试去发送一个值到 nil 信道,或者发送到一个没有其它的协程接收值的信道中。
|
||||
* 一个协程被它自己死锁。
|
||||
* 一组协程彼此死锁。
|
||||
* 当运行一个没有 `default` 分支的 `select` 代码块时,一个协程被阻塞,以及在 `select` 代码块中 `case` 关键字后的所有信道操作保持阻塞状态。
|
||||
|
||||
* 一个 goroutine 尝试去发送一个值到 nil 信道,或者发送到一个没有其它的 goroutines 接收值的信道中。
|
||||
除了有时我们为了避免程序退出,特意让一个程序中的 `main` 协程保持挂起之外,大多数其它的协程挂起都是意外情况。Go 运行时很难判断一个协程到底是处于挂起状态还是临时阻塞。因此,Go 运行时并不会去释放一个挂起的协程所占用的资源。
|
||||
|
||||
* 一个 goroutine 被它自己死锁。
|
||||
|
||||
* 一组 goroutines 彼此死锁。
|
||||
|
||||
* 当运行一个没有 `default` 分支的 `select` 代码块时,一个 goroutine 被阻塞,以及在 `select` 代码块中 `case` 关键字后的所有信道操作保持阻塞状态。
|
||||
|
||||
除了有时我们为了避免程序退出,特意让一个程序中的 main goroutine 保持挂起之外,大多数其它的 goroutine 挂起都是意外情况。Go 运行时很难判断一个 goroutine 到底是处于挂起状态还是临时阻塞。因此,Go 运行时并不会去释放一个挂起的 goroutine 所占用的资源。
|
||||
|
||||
在 [谁先响应谁获胜][12] 的信道使用案例中,如果使用的 Future 信道容量不够大,当尝试向 Future 信道发送结果时,一些响应较慢的信道将被挂起。比如,如果调用下面的函数,将有 4 个 goroutine 处于永远阻塞状态。
|
||||
在 [谁先响应谁获胜][12] 的信道使用案例中,如果使用的 future 信道容量不够大,当尝试向 Future 信道发送结果时,一些响应较慢的信道将被挂起。比如,如果调用下面的函数,将有 4 个协程处于永远阻塞状态。
|
||||
|
||||
```
|
||||
func request() int {
|
||||
@ -168,12 +160,11 @@ func request() int {
|
||||
}
|
||||
return <-c
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
为避免这 4 个 goroutines 一直处于挂起状态, `c` 信道的容量必须至少是 `4`。
|
||||
为避免这 4 个协程一直处于挂起状态, `c` 信道的容量必须至少是 `4`。
|
||||
|
||||
在 [实现谁先响应谁获胜的第二种方法][13] 的信道使用案例中,如果将 future 信道用做非缓冲信道,那么有可能这个信息将永远也不会有响应并挂起。例如,如果在一个 goroutine 中调用下面的函数,goroutine 可能会挂起。原因是,如果接收操作 `<-c` 准备就绪之前,五个发送操作全部尝试发送,那么所有的尝试发送的操作将全部失败,因此那个调用者 goroutine 将永远也不会接收到值。
|
||||
在 [实现谁先响应谁获胜的第二种方法][13] 的信道使用案例中,如果将 future 信道用做非缓冲信道,那么有可能这个信息将永远也不会有响应而挂起。例如,如果在一个协程中调用下面的函数,协程可能会挂起。原因是,如果接收操作 `<-c` 准备就绪之前,五个发送操作全部尝试发送,那么所有的尝试发送的操作将全部失败,因此那个调用者协程将永远也不会接收到值。
|
||||
|
||||
```
|
||||
func request() int {
|
||||
@ -189,10 +180,9 @@ func request() int {
|
||||
}
|
||||
return <-c
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
将信道 `c` 变成缓冲信道将保证五个发送操作中的至少一个操作会发送成功,这样,上面函数中的那个调用者 goroutine 将不会被挂起。
|
||||
将信道 `c` 变成缓冲信道将保证五个发送操作中的至少一个操作会发送成功,这样,上面函数中的那个调用者协程将不会被挂起。
|
||||
|
||||
### 在 `sync` 标准包中拷贝类型值
|
||||
|
||||
@ -234,7 +224,7 @@ func (c Counter) Value() (r int64) {
|
||||
|
||||
### 在错误的地方调用 `sync.WaitGroup` 的方法
|
||||
|
||||
每个 `sync.WaitGroup` 值维护一个内部计数器,这个计数器的初始值为 0。如果一个 `WaitGroup` 计数器的值也是 0,调用 `WaitGroup` 值的 `Wait` 方法不会被阻塞,否则,在计数器值为 0 之前,这个调用会一直被阻塞。
|
||||
每个 `sync.WaitGroup` 值维护一个内部计数器,这个计数器的初始值为 0。如果一个 `WaitGroup` 计数器的值是 0,调用 `WaitGroup` 值的 `Wait` 方法就不会被阻塞,否则,在计数器值为 0 之前,这个调用会一直被阻塞。
|
||||
|
||||
为了让 `WaitGroup` 值的使用有意义,当一个 `WaitGroup` 计数器值为 0 时,必须在相应的 `WaitGroup` 值的 `Wait` 方法调用之前,去调用 `WaitGroup` 值的 `Add` 方法。
|
||||
|
||||
@ -267,7 +257,7 @@ func main() {
|
||||
|
||||
```
|
||||
|
||||
为让程序的表现符合预期,在 `for` 循环中,我们将把 `Add` 方法的调用移动到创建的新 goroutines 的范围之外,修改后的代码如下。
|
||||
为让程序的表现符合预期,在 `for` 循环中,我们将把 `Add` 方法的调用移动到创建的新协程的范围之外,修改后的代码如下。
|
||||
|
||||
```
|
||||
...
|
||||
@ -279,16 +269,14 @@ func main() {
|
||||
}()
|
||||
}
|
||||
...
|
||||
|
||||
```
|
||||
|
||||
### 不正确使用 Futures 信道
|
||||
### 不正确使用 futures 信道
|
||||
|
||||
在 [信道使用案例][14] 的文章中,我们知道一些函数将返回 [futures 信道][15]。假设 `fa` 和 `fb` 就是这样的两个函数,那么下面的调用就使用了不正确的 future 参数。
|
||||
|
||||
```
|
||||
doSomethingWithFutureArguments(<-fa(), <-fb())
|
||||
|
||||
```
|
||||
|
||||
在上面的代码行中,两个信道接收操作是顺序进行的,而不是并发的。我们做如下修改使它变成并发操作。
|
||||
@ -296,12 +284,11 @@ doSomethingWithFutureArguments(<-fa(), <-fb())
|
||||
```
|
||||
ca, cb := fa(), fb()
|
||||
doSomethingWithFutureArguments(<-c1, <-c2)
|
||||
|
||||
```
|
||||
|
||||
### 没有等 Goroutine 的最后的活动的发送结束就关闭信道
|
||||
### 没有等协程的最后的活动的发送结束就关闭信道
|
||||
|
||||
Go 程序员经常犯的一个错误是,还有一些其它的 goroutine 可能会发送值到以前的信道时,这个信道就已经被关闭了。当这样的发送(发送到一个已经关闭的信道)真实发生时,将引发一个异常。
|
||||
Go 程序员经常犯的一个错误是,还有一些其它的协程可能会发送值到以前的信道时,这个信道就已经被关闭了。当这样的发送(发送到一个已经关闭的信道)真实发生时,将引发一个异常。
|
||||
|
||||
这种错误在一些以往的著名 Go 项目中也有发生,比如在 Kubernetes 项目中的 [这个 bug][3] 和 [这个 bug][4]。
|
||||
|
||||
@ -309,7 +296,7 @@ Go 程序员经常犯的一个错误是,还有一些其它的 goroutine 可能
|
||||
|
||||
### 在值上做 64 位原子操作时没有保证值地址 64 位对齐
|
||||
|
||||
到目前为止(Go 1.10),在标准的 Go 编译器中,在一个 64 位原子操作中涉及到的值的地址要求必须是 64 位对齐的。如果没有对齐则导致当前的 goroutine 异常。对于标准的 Go 编译器来说,这种失败仅发生在 32 位的架构上。请阅读 [内存布局][6] 去了解如何在一个 32 位操作系统上保证 64 位对齐。
|
||||
到目前为止(Go 1.10),在标准的 Go 编译器中,在一个 64 位原子操作中涉及到的值的地址要求必须是 64 位对齐的。如果没有对齐则导致当前的协程异常。对于标准的 Go 编译器来说,这种失败仅发生在 32 位的架构上。请阅读 [内存布局][6] 去了解如何在一个 32 位操作系统上保证 64 位对齐。
|
||||
|
||||
### 没有注意到大量的资源被 `time.After` 函数调用占用
|
||||
|
||||
@ -335,7 +322,6 @@ func longRunning(messages <-chan string) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
为避免在上述代码中创建过多的 `Timer` 值,我们将使用一个单一的 `Timer` 值去完成同样的任务。
|
||||
@ -370,7 +356,7 @@ func longRunning(messages <-chan string) {
|
||||
|
||||
在 `select` 块的第一个 `case` 分支的结束部分,`time.Timer` 值被释放,因此,我们不需要去停止它。但是必须在第二个分支中停止定时器。如果在第二个分支中 `if` 代码块缺失,它可能至少在 `Reset` 方法调用时,会(通过 Go 运行时)发送到 `timer.C` 信道,并且那个 `longRunning` 函数可能会早于预期返回,对于 `Reset` 方法来说,它可能仅仅是重置内部定时器为 0,它将不会清理(耗尽)那个发送到 `timer.C` 信道的值。
|
||||
|
||||
例如,下面的程序很有可能在一秒内而不是十秒时退出。并且更重要的是,这个程序并不是 DRF 的(译者注:data race free,多线程程序的一种同步程度)。
|
||||
例如,下面的程序很有可能在一秒内而不是十秒时退出。并且更重要的是,这个程序并不是 DRF 的(LCTT 译注:data race free,多线程程序的一种同步程度)。
|
||||
|
||||
```
|
||||
package main
|
||||
@ -392,12 +378,11 @@ func main() {
|
||||
<-timer.C
|
||||
fmt.Println(time.Since(start)) // 1.000188181s
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
当 `time.Timer` 的值不再被其它任何一个东西使用时,它的值可能被停留在一种非停止状态,但是,建议在结束时停止它。
|
||||
|
||||
在多个 goroutines 中如果不按建议使用 `time.Timer` 值并发,可能会有 bug 隐患。
|
||||
在多个协程中如果不按建议使用 `time.Timer` 值并发,可能会有 bug 隐患。
|
||||
|
||||
我们不应该依赖一个 `Reset` 方法调用的返回值。`Reset` 方法返回值的存在仅仅是为了兼容性目的。
|
||||
|
||||
@ -405,9 +390,9 @@ func main() {
|
||||
|
||||
via: https://go101.org/article/concurrent-common-mistakes.html
|
||||
|
||||
作者:[go101.org ][a]
|
||||
作者:[go101.org][a]
|
||||
译者:[qhwdw](https://github.com/qhwdw)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -1,4 +1,7 @@
|
||||
# GDPR 将如何影响开源社区?
|
||||
GDPR 将如何影响开源社区?
|
||||
===========
|
||||
|
||||
> 许多组织正在争先恐后地了解隐私法的变化如何影响他们的工作。
|
||||
|
||||
![How will the GDPR impact open source communities?](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_EU_flag.png?itok=4n9j74tL "GDPR 法案将如何影响开源社区?")
|
||||
|
||||
@ -70,17 +73,16 @@ GDPR 赋予欧盟公民更多的权利。其中一项权利是向企业查询个
|
||||
|
||||
[![](https://opensource.com/sites/default/files/styles/profile_pictures/public/robinm-low-3-square.jpg?itok=8qH6iUZh)][7]
|
||||
|
||||
Robin Muilwijk \- Robin Muilwijk 是一名互联网和电子政务顾问,在 Red Hat 旗下在线发布平台 Opensource.com 担任社区版主,在 Open Organization 担任大使。此外,Robin 还是 eZ 社区董事会成员,[eZ 系统][8] 社区的管理员。Robin 活跃在社交媒体中,促进和支持商业和生活领域的开源项目。可以在 Twitter 上关注 [Robin Muilwijk][9] 以获取更多关于他的信息。
|
||||
Robin Muilwijk 是一名互联网和电子政务顾问,在 Red Hat 旗下在线发布平台 Opensource.com 担任社区版主,在 Open Organization 担任大使。此外,Robin 还是 eZ 社区董事会成员,[eZ 系统][8] 社区的管理员。Robin 活跃在社交媒体中,促进和支持商业和生活领域的开源项目。可以在 Twitter 上关注 [Robin Muilwijk][9] 以获取更多关于他的信息。
|
||||
|
||||
[更多关于我的信息][10]
|
||||
|
||||
* [学习如何做出贡献][11]
|
||||
|
||||
---
|
||||
|
||||
via: [https://opensource.com/article/18/4/gdpr-impact][12]
|
||||
|
||||
作者: [Robin Muilwijk][13] 选题者: [@lujun9972][14] 译者: [pinewall][15] 校对: [校对者ID][16]
|
||||
作者: [Robin Muilwijk][13] 选题者: [lujun9972][14] 译者: [pinewall][15] 校对: [wxy][16]
|
||||
|
||||
本文由 [LCTT][17] 原创编译,[Linux中国][18] 荣誉推出
|
||||
|
||||
@ -99,6 +101,6 @@ via: [https://opensource.com/article/18/4/gdpr-impact][12]
|
||||
[13]: https://opensource.com/users/robinmuilwijk
|
||||
[14]: https://github.com/lujun9972
|
||||
[15]: https://github.com/pinewall
|
||||
[16]: https://github.com/校对者ID
|
||||
[16]: https://github.com/wxy
|
||||
[17]: https://github.com/LCTT/TranslateProject
|
||||
[18]: https://linux.cn/
|
@ -1,65 +1,69 @@
|
||||
Git 分支操作介绍
|
||||
======
|
||||
|
||||
> 在这个 Git 入门系列的第三篇中,我们来学习一下如何添加和删除 Git 分支。
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/arrows_translation_lead.jpg?itok=S4vAh9CP)
|
||||
|
||||
在本系列的前两篇文章中,我们[开始使用 Git][1],学会如何[克隆项目,修改、增加和删除内容][2]。在这第三篇文章中,我将介绍 Git 分支,为何以及如何使用分支。
|
||||
|
||||
![树枝][3]
|
||||
|
||||
不妨用树来描绘 Git 仓库。图中的树有很多分支,或长或短,或从树干延伸或从其它分支延伸。在这里,我们用树干比作仓库的 master 分支,其中 `master` 代指 ”master branch",Git 仓库的中心分支或第一个分支。为简单起见,我们假设 `master` 是树干,其它分支都是从该分支分出的。
|
||||
不妨用树来描绘 Git 仓库。图中的树有很多分支,或长或短,或从树干延伸或从其它分支延伸。在这里,我们用树干比作仓库的 master 分支,其中 `master` 代指 ”master 分支”,是 Git 仓库的中心分支或第一个分支。为简单起见,我们假设 `master` 是树干,其它分支都是从该分支分出的。
|
||||
|
||||
### 为何在 Git 仓库中使用分支
|
||||
|
||||
* 如果你希望为项目增加新特性,但很可能会影响当前可正常工作的代码。对于项目的活跃用户而言,这是很糟糕的事情。与其将特性加入到其它人正在使用的 `master` 分支,更好的方法是在仓库的其它分支中变更代码,下面给出具体的工作方式。
|
||||
* 更重要的是,[Git 被设计][4]用于协作。如果所有人都在你代码仓库的 `master` 分支上操作,会引发很多混乱。对编程语言或项目的知识和阅历因人而异;有些人可能编写有错误或缺陷的代码,也可能编写你觉得不适合该项目的代码。使用分支可以让你核验他人的贡献并选择适合的加入到项目中。(这里假设你是代码库唯一的所有者,希望对增加到项目中的代码有完全的控制。在真实的项目中,代码库有多个具有合并代码权限的所有者)
|
||||
使用分支的主要理由为:
|
||||
|
||||
* 如果你希望为项目增加新特性,但很可能会影响当前可正常工作的代码。对于该项目的活跃用户而言,这是很糟糕的事情。与其将特性加入到其它人正在使用的 `master` 分支,更好的方法是在仓库的其它分支中变更代码,下面会给出具体的工作方式。
|
||||
* 更重要的是,[Git 其设计][4]用于协作。如果所有人都在你代码仓库的 `master` 分支上操作,会引发很多混乱。对编程语言或项目的知识和阅历因人而异;有些人可能会编写有错误或缺陷的代码,也可能会编写你觉得不适合该项目的代码。使用分支可以让你核验他人的贡献并选择适合的加入到项目中。(这里假设你是代码库唯一的所有者,希望对增加到项目中的代码有完全的控制。在真实的项目中,代码库有多个具有合并代码权限的所有者)
|
||||
|
||||
### 创建分支
|
||||
|
||||
使用分支的主要理由为:
|
||||
|
||||
让我们回顾[本系列上一篇文章][2],看一下在我们的 Demo 目录中分支是怎样的。如果你没有完成上述操作,请按照文章中的指示从 GitHub 克隆代码并进入 Demo 目录。运行如下命令:
|
||||
|
||||
```
|
||||
pwd
|
||||
git branch
|
||||
ls -la
|
||||
```
|
||||
|
||||
`pwd` 命令(是当前工作目录的英文缩写)返回当前你所处的目录(以便确认你在 Demo 目录中),`git branch` 列出 Demo 项目在你主机上的全部分支,`ls -la` 列出当前目录下的所有文件。你的终端输出类似于:
|
||||
`pwd` 命令(是当前工作目录的英文缩写)返回当前你所处的目录(以便确认你在 `Demo` 目录中),`git branch` 列出该项目在你主机上的全部分支,`ls -la` 列出当前目录下的所有文件。你的终端输出类似于:
|
||||
|
||||
![终端输出][5]
|
||||
|
||||
在 master 分支中,只有一个文件 `README.md`。(Git 会友好地忽略掉其它目录和文件。)
|
||||
在 `master` 分支中,只有一个文件 `README.md`。(Git 会友好地忽略掉其它目录和文件。)
|
||||
|
||||
接下来,运行如下命令:
|
||||
|
||||
```
|
||||
git status
|
||||
git checkout -b myBranch
|
||||
git status
|
||||
|
||||
```
|
||||
|
||||
第一条命令 `git status` 告知你当前处于 `branch master`,(就像在终端中看到的那样)与 `origin/master` 处于同步状态,意味着 master 分支本地副本中的全部文件也出现在 GitHub 中。两份副本没有差异,所有的提交也是一致的。
|
||||
第一条命令 `git status` 告知你当前位于 `branch master`,(就像在终端中看到的那样)它与 `origin/master` 处于同步状态,这意味着 master 分支的本地副本中的全部文件也出现在 GitHub 中。两份副本没有差异,所有的提交也是一致的。
|
||||
|
||||
下一条命令 `git checkout -b myBranch` 中的 `-b` 告知 Git 创建一个名为 `myBranch` 的新分支,然后 `checkout` 将我们切换到新创建的分支。运行第三条命令 `git status` 确保你已经位于刚创建的分支下。
|
||||
下一条命令 `git checkout -b myBranch` 中的 `-b` 告知 Git 创建一个名为 `myBranch` 的新分支,然后 `checkout` 命令将我们切换到新创建的分支。运行第三条命令 `git status` 确保你已经位于刚创建的分支下。
|
||||
|
||||
如你所见,`git status` 告知你当前处于 `myBranch` 分支,没有变更需要提交。这是因为我们既没有增加新文件,也没有修改已有文件。
|
||||
|
||||
![终端输出][6]
|
||||
|
||||
如果希望以可视化的方式查看分支,可以运行 `gitk` 命令。如果遇到报错 `bash: gitk: command not found…`,请先安装 `gitk` 软件包(找到你操作系统对应的安装文档,以获得安装方式)。
|
||||
如果希望以可视化的方式查看分支,可以运行 `gitk` 命令。如果遇到报错 `bash: gitk: command not found...`,请先安装 `gitk` 软件包(找到你操作系统对应的安装文档,以获得安装方式)。
|
||||
|
||||
(LCTT 译注:需要在有 X 服务器的终端运行 `gitk`,否则会报错)
|
||||
|
||||
下图展示了我们在 Demo 项目中的所作所为:你最后一次提交(对应的信息)是 `Delete file.txt`,在此之前有三次提交。当前的提交用黄点标注,之前的提交用蓝点标注,黄点和 `Delete file.txt` 之间的三个方块展示每个分支所在的位置(或者说每个分支中的最后一次提交的位置)。由于 `myBranch` 刚创建,提交状态与 `master` 分支及其对应的记为 `remotes/origin/master` 的远程 `master` 分支保持一致。(非常感谢来自 Red Hat 的 [Peter Savage][7] 让我知道 `gitk` 这个工具)
|
||||
下图展示了我们在 Demo 项目中的所作所为:你最后一次提交(的对应信息)是 `Delete file.txt`,在此之前有三次提交。当前的提交用黄点标注,之前的提交用蓝点标注,黄点和 `Delete file.txt` 之间的三个方块展示每个分支所在的位置(或者说每个分支中的最后一次提交的位置)。由于 `myBranch` 刚创建,提交状态与 `master` 分支及其对应的记为 `remotes/origin/master` 的远程 `master` 分支保持一致。(非常感谢来自 Red Hat 的 [Peter Savage][7] 让我知道 `gitk` 这个工具)
|
||||
|
||||
![Gitk 输出][8]
|
||||
|
||||
下面让我们在 `myBranch` 分支下创建一个新文件并观察终端输出。运行如下命令:
|
||||
|
||||
```
|
||||
echo "Creating a newFile on myBranch" > newFile
|
||||
cat newFile
|
||||
git status
|
||||
|
||||
```
|
||||
|
||||
第一条命令中的 `echo` 创建了名为 `newFile` 的文件,接着 `cat newFile` 打印出文件内容,最后 `git status` 告知你我们 `myBranch` 分支的当前状态。在下面的终端输出中,Git 告知 `myBranch` 分支下有一个名为 `newFile` 的文件当前处于 `untracked` 状态。这表明我们没有让 Git 追踪发生在文件 `newFile` 上的变更。
|
||||
@ -67,11 +71,11 @@ git status
|
||||
![终端输出][9]
|
||||
|
||||
下一步是增加文件,提交变更并将 `newFile` 文件推送至 `myBranch` 分支(请回顾本系列上一篇文章获得更多细节)。
|
||||
|
||||
```
|
||||
git add newFile
|
||||
git commit -m "Adding newFile to myBranch"
|
||||
git push origin myBranch
|
||||
|
||||
```
|
||||
|
||||
在上述命令中,`push` 命令使用的分支参数为 `myBranch` 而不是 `master`。Git 添加 `newFile` 并将变更推送到你 GitHub 账号下的 Demo 仓库中,告知你在 GitHub 上创建了一个与你本地副本分支 `myBranch` 一样的新分支。终端输出截图给出了运行命令的细节及命令输出。
|
||||
@ -89,6 +93,7 @@ git push origin myBranch
|
||||
截至目前,我们有两个分支:一个是 `master` 分支,只有一个 `README.md` 文件;另一个是 `myBranch` 分支,有两个文件。
|
||||
|
||||
你已经知道如何创建分支了,下面我们再创建一个分支。输入如下命令:
|
||||
|
||||
```
|
||||
git checkout master
|
||||
git checkout -b myBranch2
|
||||
@ -96,7 +101,6 @@ touch newFile2
|
||||
git add newFile2
|
||||
git commit -m "Adding newFile2 to myBranch2"
|
||||
git push origin myBranch2
|
||||
|
||||
```
|
||||
|
||||
我不再给出终端输出,需要你自己尝试,但你可以在 [GitHub 代码库][13] 中验证你的结果。
|
||||
@ -105,27 +109,29 @@ git push origin myBranch2
|
||||
|
||||
由于我们增加了两个分支,下面删除其中的一个(`myBranch`),包括两步:
|
||||
|
||||
**1\. 删除本地分支** 你不能删除正在操作的分支,故切换到 `master` 分支 (或其它你希望保留的分支),命令及终端输出如下:
|
||||
1. **删除本地分支** 你不能删除正在操作的分支,故切换到 `master` 分支 (或其它你希望保留的分支),命令及终端输出如下:
|
||||
|
||||
`git branch` 可以列出可用的分支,使用 `checkout` 切换到 `master` 分支,然后使用 `git branch -D myBranch` 删除该分支。再次运行 `git branch` 检查是否只剩下两个分支(而不是三个)。
|
||||
![](https://opensource.com/sites/default/files/pictures/kulkarni_fig_new.png)
|
||||
|
||||
**2\. 删除 GitHub 上的分支** 使用如下命令删除 `myBranch` 的远程分支:
|
||||
```
|
||||
`git branch` 可以列出可用的分支,使用 `checkout` 切换到 `master` 分支,然后使用 `git branch -D myBranch` 删除该分支。再次运行 `git branch` 检查是否只剩下两个分支(而不是三个)。
|
||||
|
||||
2. **删除 GitHub 上的分支** 使用如下命令删除 `myBranch` 的远程分支:
|
||||
|
||||
```
|
||||
git push origin :myBranch
|
||||
|
||||
```
|
||||
|
||||
![Terminal output][14]
|
||||
![Terminal output][14]
|
||||
|
||||
上面 `push` 命令中分支名称前面的冒号(`:`)告知 GitHub 删除分支。另一种写法为:
|
||||
|
||||
```
|
||||
git push -d origin myBranch
|
||||
|
||||
```
|
||||
|
||||
其中 `-d` (也可以用 `--delete`) 也用于告知 GitHub 删除你的分支。
|
||||
|
||||
我们学习了 Git 分支的使用,在本系列的下一篇文章中,我们将介绍如何执行 fetch 和 rebase 操作,对于多人同时的贡献的项目而言,这是很必须学会的。
|
||||
我们学习了 Git 分支的使用,在本系列的下一篇文章中,我们将介绍如何执行 `fetch` 和 `rebase` 操作,对于多人同时的贡献的项目而言,这是很必须学会的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -134,13 +140,13 @@ via: https://opensource.com/article/18/5/git-branching
|
||||
作者:[Kedar Vijay Kulkarni][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[pinewall](https://github.com/pinewall)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/kkulkarn
|
||||
[1]:https://opensource.com/article/18/1/step-step-guide-git
|
||||
[2]:https://opensource.com/article/18/2/how-clone-modify-add-delete-git-files
|
||||
[1]:https://linux.cn/article-9319-1.html
|
||||
[2]:https://linux.cn/article-9517-1.html
|
||||
[3]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/tree-branches.jpg?itok=bQGpa5Uc (tree branches)
|
||||
[4]:https://en.wikipedia.org/wiki/Git
|
||||
[5]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/u128651/gitbranching_terminal1.png?itok=ZcAzRdlR (Terminal output)
|
@ -2,66 +2,65 @@
|
||||
======
|
||||
|
||||
![](https://www.ostechnix.com/wp-content/uploads/2018/05/Bittorrent-720x340.png)
|
||||
Bittorrent 已经存在了很长时间,它可以从互联网上共享和下载数据。市场上有大量的 GUI 和 CLI 的 Bittorrent 客户端。有时,你不能坐下来等待你的下载完成。你可能想要立即观看内容。这就是 **BTFS**这个不起眼的文件系统派上用场的地方。使用 BTFS,你可以将种子文件或磁力链接挂载为目录,然后在文件树中作为只读目录。这些文件的内容将在程序读取时按需下载。由于 BTFS 在 FUSE 之上运行,因此不需要干预 Linux 内核。
|
||||
|
||||
## BTFS – 基于 FUSE 的 Bittorrent 文件系统
|
||||
Bittorrent 已经存在了很长时间,它可以从互联网上共享和下载数据。市场上有大量的 GUI 和 CLI 的 Bittorrent 客户端。有时,你不能坐下来等待你的下载完成。你可能想要立即观看内容。这就是 **BTFS** 这个不起眼的文件系统派上用场的地方。使用 BTFS,你可以将种子文件或磁力链接挂载为目录,然后在文件树中作为只读目录。这些文件的内容将在程序读取时按需下载。由于 BTFS 在 FUSE 之上运行,因此不需要干预 Linux 内核。
|
||||
|
||||
### 安装 BTFS
|
||||
|
||||
BTFS 存在于大多数 Linux 发行版的默认参仓库中。
|
||||
BTFS 存在于大多数 Linux 发行版的默认仓库中。
|
||||
|
||||
在 Arch Linux 及其变体上,运行以下命令来安装 BTFS。
|
||||
|
||||
```
|
||||
$ sudo pacman -S btfs
|
||||
|
||||
```
|
||||
|
||||
在Debian、Ubuntu、Linux Mint 上:
|
||||
|
||||
```
|
||||
$ sudo apt-get install btfs
|
||||
|
||||
```
|
||||
|
||||
在 Gentoo 上:
|
||||
|
||||
```
|
||||
# emerge -av btfs
|
||||
|
||||
```
|
||||
|
||||
BTFS 也可以使用 [**Linuxbrew**][1] 包管理器进行安装。
|
||||
BTFS 也可以使用 [Linuxbrew][1] 包管理器进行安装。
|
||||
|
||||
```
|
||||
$ brew install btfs
|
||||
|
||||
```
|
||||
|
||||
### 用法
|
||||
|
||||
BTFS 的使用非常简单。你所要做的就是找到 .torrent 文件或磁力链接,并将其挂载到一个目录中。种子文件或磁力链接的内容将被挂载到你选择的目录内。当一个程序试图访问该文件进行读取时,实际的数据将按需下载。此外,像 **ls** 、**cat** 和 **cp**这样的工具能按照预期的方式来操作种子。像 **vlc** 和 **mplayer** 这样的程序也可以不加修改地工作。玩家甚至不知道实际内容并非物理存在于本地磁盘中,而是根据需要从 peer 中收集。
|
||||
BTFS 的使用非常简单。你所要做的就是找到 .torrent 文件或磁力链接,并将其挂载到一个目录中。种子文件或磁力链接的内容将被挂载到你选择的目录内。当一个程序试图访问该文件进行读取时,实际的数据将按需下载。此外,像 `ls` 、`cat` 和 `cp` 这样的工具能按照预期的方式来操作种子。像 `vlc` 和 `mplayer` 这样的程序也可以不加修改地工作。玩家甚至不知道实际内容并非物理存在于本地磁盘中,而是根据需要从 peer 中收集。
|
||||
|
||||
创建一个目录来挂载 torrent/magnet 链接:
|
||||
|
||||
```
|
||||
$ mkdir mnt
|
||||
|
||||
```
|
||||
|
||||
挂载 torrent/magnet 链接:
|
||||
|
||||
```
|
||||
$ btfs video.torrent mnt
|
||||
|
||||
```
|
||||
|
||||
[![][2]][3]
|
||||
![][3]
|
||||
|
||||
cd 到目录:
|
||||
|
||||
```
|
||||
$ cd mnt
|
||||
|
||||
```
|
||||
|
||||
然后,开始观看!
|
||||
|
||||
```
|
||||
$ vlc <path-to-video.mp4>
|
||||
|
||||
```
|
||||
|
||||
给 BTFS 一些时间来找到并获取网站 tracker。一旦加载了真实数据,BTFS 将不再需要 tracker。
|
||||
@ -69,9 +68,9 @@ $ vlc <path-to-video.mp4>
|
||||
![][4]
|
||||
|
||||
要卸载 BTFS 文件系统,只需运行以下命令:
|
||||
|
||||
```
|
||||
$ fusermount -u mnt
|
||||
|
||||
```
|
||||
|
||||
现在,挂载目录中的内容将消失。要再次访问内容,你需要按照上面的描述挂载 torrent。
|
||||
@ -82,8 +81,6 @@ BTFS 会将你的 VLC 或 Mplayer 变成爆米花时间。挂载你最喜爱的
|
||||
|
||||
干杯!
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/btfs-a-bittorrent-filesystem-based-on-fuse/
|
||||
@ -91,7 +88,7 @@ via: https://www.ostechnix.com/btfs-a-bittorrent-filesystem-based-on-fuse/
|
||||
作者:[SK][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[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,73 +0,0 @@
|
||||
translating---geekpi
|
||||
|
||||
Set up zsh on your Fedora system
|
||||
======
|
||||
|
||||
![](https://fedoramagazine.org/wp-content/uploads/2017/12/zsh-816x345.jpg)
|
||||
|
||||
For some people, the terminal can be scary. But a terminal is more than just a black screen to type in. It usually runs a shell, so called because it wraps around the kernel. The shell is a text-based interface that lets you run commands on the system. It’s also sometimes called a command line interpreter or CLI. Fedora, like most Linux distributions, comes with bash as the default shell. However, it isn’t the only shell available; several other shells can be installed. This article focuses on the Z Shell, or zsh.
|
||||
|
||||
Bash is a rewrite of the old Bourne shell (sh) that shipped in UNIX. Zsh is intended to be friendlier than bash, through better interaction. Some of its useful features are:
|
||||
|
||||
* Programmable command line completion
|
||||
* Shared command history between running shell sessions
|
||||
* Spelling correction
|
||||
* Loadable modules
|
||||
* Interactive selection of files and folders
|
||||
|
||||
|
||||
|
||||
Zsh is available in the Fedora repositories. To install, run this command:
|
||||
```
|
||||
$ sudo dnf install zsh
|
||||
|
||||
```
|
||||
|
||||
### Using zsh
|
||||
|
||||
To start using it, just type zsh and the new shell prompts you with a first run wizard. This wizard helps you configure initial features, like history behavior and auto-completion. Or you can opt to keep the [rc file][1] empty:
|
||||
|
||||
![zsh First Run Wizzard][2]
|
||||
|
||||
If you type 1 the configuration wizard starts. The other options launch the shell immediately.
|
||||
|
||||
Note that the user prompt is **%** and not **$** as with bash. A significant feature here is the auto-completion that allows you to move among files and directories with the Tab key, much like a menu:
|
||||
|
||||
![zsh cd Feature][3]
|
||||
|
||||
Another interesting feature is spelling correction, which helps when writing filenames with mixed cases:
|
||||
|
||||
![zsh Auto Completion][4]
|
||||
|
||||
## Making zsh your default shell
|
||||
|
||||
Zsh offers a lot of plugins, like zsh-syntax-highlighting, and the famous “Oh my zsh” ([check out its page here][5]). You might want to make it the default, so it runs whenever you start a session or open a terminal. To do this, use the chsh (“change shell”) command:
|
||||
```
|
||||
$ chsh -s $(which zsh)
|
||||
|
||||
```
|
||||
|
||||
This command tells your system that you want to set (-s) your default shell to the correct location of the shell (which zsh).
|
||||
|
||||
Photo by [Kate Ter Haar][6] from [Flickr][7] (CC BY-SA).
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/set-zsh-fedora-system/
|
||||
|
||||
作者:[Eduard Lucena][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://fedoramagazine.org/author/x3mboy/
|
||||
[1]:https://en.wikipedia.org/wiki/Configuration_file
|
||||
[2]:https://fedoramagazine.org/wp-content/uploads/2017/12/zshFirstRun.gif
|
||||
[3]:https://fedoramagazine.org/wp-content/uploads/2017/12/zshChangingFeature-1.gif
|
||||
[4]:https://fedoramagazine.org/wp-content/uploads/2017/12/zshAutoCompletion.gif
|
||||
[5]:http://ohmyz.sh/
|
||||
[6]:https://www.flickr.com/photos/katerha/
|
||||
[7]:https://www.flickr.com/photos/katerha/34714051013/
|
@ -1,121 +0,0 @@
|
||||
pinewall translating
|
||||
|
||||
4 Markdown-powered slide generators
|
||||
======
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bus_presentation.png?itok=CQeyO61b)
|
||||
|
||||
Imagine you've been tapped to give a presentation. As you're preparing your talk, you think, "I should whip up a few slides."
|
||||
|
||||
Maybe you prefer the simplicity of [plain text][1], or maybe you think software like LibreOffice Writer is overkill for what you need to do. Or perhaps you just want to embrace your inner geek.
|
||||
|
||||
It's easy to turn files formatted with [Markdown][2] into attractive presentation slides. Here are four tools that can do help you do the job.
|
||||
|
||||
### Landslide
|
||||
|
||||
One of the more flexible applications on this list, [Landslide][3] is a command-line application that takes files formatted with Markdown, [reStructuredText][4], or [Textile][5] and converts them into an HTML file based on [Google’s HTML5 slides template][6].
|
||||
|
||||
All you need to do is write up your slides with Markdown, crack open a terminal window, and run the command `landslide` followed by the name of the file. Landslide will spit out presentation.html, which you can open in any web browser. Simple, isn’t it?
|
||||
|
||||
Don't let that simplicity fool you. Landslide offers more than a few useful features, such as the ability to add notes and create configuration files for your slides. Why would you want to do that? According to Landslide's developer, it helps with aggregating and reusing source directories across presentations.
|
||||
|
||||
|
||||
![landslide.png][8]
|
||||
|
||||
Viewing presenter notes in a Landslide presentation
|
||||
|
||||
### Marp
|
||||
|
||||
[Marp][9] is a work in progress, but it shows promise. Short for "Markdown Presentation Writer," Marp is an [Electron][10] app in which you craft slides using a simple two-pane editor: Write in Markdown in the left pane and you get a preview in the right pane.
|
||||
|
||||
Marp supports [GitHub Flavored Markdown][11]. If you need a quick tutorial on using GitHub Flavored Markdown to write slides, check out the [sample presentation][12]. It's a bit more flexible than baseline Markdown.
|
||||
|
||||
While Marp comes with only two very basic themes, you can add background images to your slides, resize them, and include math. On the down side, it currently lets you export your slides only as PDF files. To be honest, I wonder why HTML export wasn’t a feature from day one.
|
||||
|
||||
|
||||
![marp.png][14]
|
||||
|
||||
Editing some simple slides in Marp
|
||||
|
||||
### Pandoc
|
||||
|
||||
You probably know [pandoc][15] as a magic wand for converting between various markup languages. What you might not know is that pandoc can take a file formatted with Markdown and create attractive HTML slides that work with the [Slidy][16], [Slideous][17], [DZSlides][18], [S5][19], and [Reveal.js][20] presentation frameworks. If you prefer [LaTeX][21], you can also output PDF slides using the [Beamer package][22].
|
||||
|
||||
You'll need to [use specific formatting][23] for your slides, but you can add some [variables][24] to control how they behave. You can also change the look and feel of your slides, add pauses between slides, and include speaker notes.
|
||||
|
||||
Of course, you must have the supporting files for your preferred presentation framework installed on your computer. Pandoc spits out only the raw slide file.
|
||||
|
||||
|
||||
![pandoc.png][26]
|
||||
|
||||
Viewing slides created with Pandoc and DZSlides
|
||||
|
||||
### Hacker Slides
|
||||
|
||||
[Hacker Slides][27] is an application for [Sandstorm][28] and [Sandstorm Oasis][29] that mates Markdown and the [Reveal.js][20] slide framework. The slides are simple, but they can be visually striking.
|
||||
|
||||
Craft your slide deck in a two-pane editor in your browser—type in Markdown on the left and see it rendered on the right. When you're ready to present, you can do it from within Sandstorm or get a link that you can share with others to present remotely.
|
||||
|
||||
What’s that—you say that you don’t use Sandstorm or Sandstorm Oasis? No worries.There's a [version of Hacker Slides][30] that you can run on your desktop or server.
|
||||
|
||||
|
||||
![hacker-slides.png][32]
|
||||
|
||||
Editing slides in Hacker Slides
|
||||
|
||||
### Two honorable mentions
|
||||
|
||||
If you use [Jupyter Notebooks][33] (see community moderator Don Watkins' [article][34]) to publish data or instructional texts, then [Jupyter2slides][35] is for you. It works with Reveal.js to convert a notebook into a nice set of HTML slides.
|
||||
|
||||
If you prefer your applications hosted, test-drive [GitPitch][36]. It works with GitHub, GitLab, and Bitbucket. Just push the source files for your slides to a repository on one of those services, point GitPitch to that repository, and your slides are ready to view at the GitPitch site.
|
||||
|
||||
Do you have a favorite Markdown-powered slide generator? Share it by leaving a comment.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/18/5/markdown-slide-generators
|
||||
|
||||
作者:[Scott Nesbitt][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/scottnesbitt
|
||||
[1]:https://plaintextproject.online/
|
||||
[2]:https://en.wikipedia.org/wiki/Markdown
|
||||
[3]:https://github.com/adamzap/landslide
|
||||
[4]:https://en.wikipedia.org/wiki/ReStructuredText
|
||||
[5]:https://en.wikipedia.org/wiki/Textile_(markup_language)
|
||||
[6]:https://github.com/skaegi/html5slides
|
||||
[7]:/file/397441
|
||||
[8]:https://opensource.com/sites/default/files/uploads/landslide.png (landslide.png)
|
||||
[9]:https://yhatt.github.io/marp/
|
||||
[10]:https://en.wikipedia.org/wiki/Electron_(software_framework)
|
||||
[11]:https://guides.github.com/features/mastering-markdown/
|
||||
[12]:https://raw.githubusercontent.com/yhatt/marp/master/example.md
|
||||
[13]:/file/397446
|
||||
[14]:https://opensource.com/sites/default/files/uploads/marp.png (marp.png)
|
||||
[15]:https://pandoc.org/
|
||||
[16]:https://www.w3.org/Talks/Tools/Slidy2/Overview.html#(1)
|
||||
[17]:http://goessner.net/articles/slideous/
|
||||
[18]:http://paulrouget.com/dzslides/
|
||||
[19]:https://meyerweb.com/eric/tools/s5/
|
||||
[20]:https://revealjs.com/#/
|
||||
[21]:https://www.latex-project.org/
|
||||
[22]:https://en.wikipedia.org/wiki/Beamer_(LaTeX)
|
||||
[23]:https://pandoc.org/MANUAL.html#producing-slide-shows-with-pandoc
|
||||
[24]:https://pandoc.org/MANUAL.html#variables-for-slides
|
||||
[25]:/file/397451
|
||||
[26]:https://opensource.com/sites/default/files/uploads/pandoc.png (pandoc.png)
|
||||
[27]:https://github.com/jacksingleton/hacker-slides
|
||||
[28]:https://sandstorm.io/
|
||||
[29]:https://oasis.sandstorm.io/
|
||||
[30]:https://github.com/msoedov/hacker-slides
|
||||
[31]:/file/397456
|
||||
[32]:https://opensource.com/sites/default/files/uploads/hacker-slides.png (hacker-slides.png)
|
||||
[33]:http://jupyter.org/
|
||||
[34]:https://opensource.com/article/18/3/getting-started-jupyter-notebooks
|
||||
[35]:https://github.com/datitran/jupyter2slides
|
||||
[36]:https://gitpitch.com/
|
@ -1,3 +1,5 @@
|
||||
translating----geekpi
|
||||
|
||||
Copying and renaming files on Linux
|
||||
======
|
||||
![](https://images.idgesg.net/images/article/2018/05/trees-100759415-large.jpg)
|
||||
|
@ -1,70 +0,0 @@
|
||||
构建全球社区带来的挑战
|
||||
======
|
||||
![配图 ](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_community2.png?itok=1blC7-NY)
|
||||
|
||||
今天的开源组织参与人员来自于全世界。你能预见到组建在线社区可能遇到哪些困难吗?有没有什么办法能够克服这些困难呢?
|
||||
|
||||
为开源社区贡献力量的人共同合作推动软件的开发和发展 (People contributing to an open source community share a commitment to the software they're helping to develop)。在过去,人们是面对面或者通过邮件和电话来交流的。今天,科技孕育出了在线交流--人们只需要进入一个聊天室或消息渠道就能一起工作了。比如,你可以早上跟摩洛哥的人一起工作,到了晚上又跟夏威夷的人一起工作。
|
||||
|
||||
## 全球社区的三个挑战
|
||||
|
||||
任何一个团队合作过的人都知道意见分歧是很难被克服的。对于在线社区来说,语言障碍,不同的时区,以及文化差异也带来了新的挑战。
|
||||
|
||||
### 语言障碍
|
||||
|
||||
英语是开源社区中的主流语言,因此英语不好的人会很难看懂文档和修改意见。为了克服这个问题,吸引其他地区的社区成员,你需要邀请双语者参与到社区中来。问问周围的人--你会发现意想不到的精通其他语言的人。社区的双语成员可以帮助别人跨越语言障碍,并且可以通过翻译软件和文档来扩大项目的受众范围。
|
||||
|
||||
人们使用的编程语言也不一样。你可能喜欢用 Bash 而其他人则可能更喜欢 Python,Ruby,C 等其他语言。这意味着,人们可能由于编程语言的原因而难以为你的代码库做贡献。项目负责人为项目选择一门被软件社区广泛认可的语言至关重要。如果你选择了一门偏门的语言,则很少人能够参与其中。
|
||||
|
||||
### 不同的时区
|
||||
|
||||
时区为开源社区带来了另一个挑战。比如,若你在芝加哥,想与一个在伦敦的成员安排一次视频会议,你需要调整 8 小时的时差。根据合作者的地理位置,你可能要在深夜或者清晨工作。
|
||||
|
||||
肉体转移 (Physical sprints),让你的团队在同一个时区工作可以帮助克服这个挑战,但这中方法只有极少数社区才能够负担的起。我们还可以定期举行虚拟会议讨论项目,建立一个固定的时间和地点以供所有人来讨论未决的事项,即将发布的版本等其他主题。
|
||||
|
||||
不同的时区也可以成为你的优势,因为团队成员可以全天候的工作。若你拥有一个类似 IRC 这样的实时交流平台,用户可以在任意时间都能找到人来回答问题。
|
||||
|
||||
### 文化差异
|
||||
|
||||
文化差异是开源组织面临的最大挑战。世界各地的人都有不同的思考方式,计划以及解决问题的方法。政治环境也会影响工作环境并影响决策。
|
||||
|
||||
作为项目负责人,你应该努力构建一种能包容不同看法的环境。文化差异可以鼓励社区沟通。建设性的讨论总是对项目有益,因为它可以帮助社区成员从不同角度看待问题。不同意见也有助于解决问题。
|
||||
|
||||
要成功开源,团队必须学会拥抱差异。这不简单,但多样性最终会使社区收益。
|
||||
|
||||
## 加强在线沟通的其他方法
|
||||
|
||||
**本地化:** 在线社区成员可能会发现位于附近的贡献者--去见个面并组织一个本地社区。只需要两个人就能组建一个社区了。可以邀请其他当地用户或雇员参与其中; 他们甚至还能为以后的聚会提供场所呢。
|
||||
|
||||
**组织活动:** 组织活动是构建本地社区的好方法,而且费用也不高。你可以在当地的咖啡屋或者啤酒厂聚会,庆祝最新版本的发布或者某个核心功能的实现。组织的活动越多,人们参与的热情就越高(即使只是因为单纯的好奇心)。最终,可能会找到一家公司为你提供聚会的场地,或者为你提供赞助。
|
||||
|
||||
**保持联系:** 每次活动后,联系本地社区成员。收起电子邮箱地址或者其他联系方式并邀请他们参与到你的交流平台中。邀请他们为其他社区做贡献。你很可能会发现很多当地的人才,运气好的话,甚至可能发现新的核心开发人员!
|
||||
|
||||
**分享经验:** 本地社区是一种非常有价值的资源,对你,对其他社区来说都是。与可能受益的人分享你的发现和经验。如果你不清楚(译者注:这里原文是说 sure,但是根据上下文,这里应该是 not sure) 如何策划一场活动或会议,可以咨询其他人的意见。也许能找到一些有经验的人帮你走到正轨。
|
||||
|
||||
**关注文化差异:** 记住,文化规范因地点和人口而异,因此在清晨安排某项活动可能适用于一个地方的人,但是不合适另一个地方的人。当然,你可以--也应该--利用其他社区的参考资料来更好地理解这种差异性,但有时你也需要通过试错的方式来学习。不要忘了分享你所学到的东西,让别人也从中获益。
|
||||
|
||||
**检查个人观点:** 避免在工作场合提出带有很强主观色彩的观点(尤其是与政治相关的观点)。这会抑制开放式的沟通和问题的解决。相反,应该专注于鼓励与团队成员展开建设性讨论。如果你发现陷入了激烈的争论中,那么后退一步,冷静一下,然后再从更加积极的角度出发重新进行讨论。讨论必须是有建设性的,从多个角度讨论问题对社区有益。永远不要把自己的主观观念放在社区的总体利益之前。
|
||||
|
||||
**尝试异步沟通:** 这些天,实时通讯平台已经引起了大家的关注,但除此之外还别忘了电子邮件。如果没有在网络平台上找到人的话,可以给他们发送一封电子邮件。有可能你很快就能得到回复。考虑使用那些专注于异步沟通的平台,比如 [Twist][1],也不要忘了查看并更新论坛和维基。
|
||||
|
||||
**使用不同的解决方案:** 并不存在一个单一的完美的解决方法,学习最有效的方法还是通过经验来学习。从反复试验中你可以学到很多东西。不要害怕失败; 你慧聪失败中学到很多东西从而不停地进步。
|
||||
|
||||
## 社区需要营养
|
||||
|
||||
将社区想象成是一颗植物的幼苗。你需要每天给它浇水,提供阳光和氧气。社区也是一样:倾听贡献者的声音,记住你在与活生生的人进行互动,他们需要以合适的方式进行持续的交流。如果社区缺少了人情味,人们会停止对它的贡献。
|
||||
|
||||
最后,请记住,每个社区都是不同的,没有一种单一的解决方法能够适用于所有社区。坚持不断地从社区中学习并适应这个社区。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/12/working-worldwide-communities
|
||||
|
||||
作者:[José Antonio Rey][a]
|
||||
译者:[lujun9972](https://github.com/lujun9972)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/jose
|
||||
[1]:https://twistapp.com
|
71
translated/tech/20180523 Set up zsh on your Fedora system.md
Normal file
71
translated/tech/20180523 Set up zsh on your Fedora system.md
Normal file
@ -0,0 +1,71 @@
|
||||
在 Fedora 系统上设置 zsh
|
||||
======
|
||||
|
||||
![](https://fedoramagazine.org/wp-content/uploads/2017/12/zsh-816x345.jpg)
|
||||
|
||||
对于一些人来说,终端可能会很吓人。但终端不仅仅是在黑屏中输入。它通常运行一个 shell,因为它围绕着内核调用。shell 是一个基于文本的界面,可让你在系统上运行命令。它有时也被称为命令行解释器或 CLI。与大多数Linux发行版一样,Fedora带有bash作为默认shell。但是,它不是唯一可用的 shell,你可以安装其他的 shell。本文重点介绍 Z Shell 或 zsh。
|
||||
|
||||
Bash 是对 UNIX 中提供的旧 Bourne shell(sh)的重写。通过更好的交互,zsh 旨在比 bash 更友善。它的一些有用功能是:
|
||||
|
||||
* 可编程的命令行补全
|
||||
* 在运行的 shell 会话之间共享命令历史
|
||||
* 拼写纠正
|
||||
* 可加载模块
|
||||
* 交互选择文件和文件夹
|
||||
|
||||
|
||||
|
||||
zsh 在 Fedora 仓库中存在。要安装,请运行以下命令:
|
||||
```
|
||||
$ sudo dnf install zsh
|
||||
|
||||
```
|
||||
|
||||
### 使用 zsh
|
||||
|
||||
要开始使用它,只需输入 zsh,新的 shell 在第一次运行时显示向导。该向导可帮助你配置初始功能,如历史记录行为和自动补全。或者你可以选择保持[ rc 文件][1] 为空:
|
||||
|
||||
![zsh First Run Wizzard][2]
|
||||
|
||||
如果输入 1,则启动配置向导。其他选项立即启动 shell。
|
||||
|
||||
请注意,与 bash 相同,用户提示符是 **%** 而不是 **$**。这里的一个重要功能是自动补全功能,它允许你使用 Tab 键在文件和目录之间移动,非常类似于菜单:
|
||||
|
||||
![zsh cd Feature][3]
|
||||
|
||||
另一个有趣的功能是拼写纠正,这有助于在混合大小写的情况下输入文件名:
|
||||
|
||||
![zsh Auto Completion][4]
|
||||
|
||||
## 使用 zsh 成为你的默认 shell
|
||||
|
||||
zsh 提供了很多插件,如 zsh-syntax-highlighting 和著名的 “Oh my zsh”([在此查看其页面][5])。也许你希望将其设为默认 shell,以便在你在开始会话或打开终端时运行。为此,请使用 chsh(“更改 shell”)命令:
|
||||
```
|
||||
$ chsh -s $(which zsh)
|
||||
|
||||
```
|
||||
|
||||
这个命令告诉你的系统你要设置(-s)默认shell 的正确位置(which zsh)。
|
||||
|
||||
图片来自 [Flickr][7] 由 [Kate Ter Haar][6] 提供(CC BY-SA)。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/set-zsh-fedora-system/
|
||||
|
||||
作者:[Eduard Lucena][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://fedoramagazine.org/author/x3mboy/
|
||||
[1]:https://en.wikipedia.org/wiki/Configuration_file
|
||||
[2]:https://fedoramagazine.org/wp-content/uploads/2017/12/zshFirstRun.gif
|
||||
[3]:https://fedoramagazine.org/wp-content/uploads/2017/12/zshChangingFeature-1.gif
|
||||
[4]:https://fedoramagazine.org/wp-content/uploads/2017/12/zshAutoCompletion.gif
|
||||
[5]:http://ohmyz.sh/
|
||||
[6]:https://www.flickr.com/photos/katerha/
|
||||
[7]:https://www.flickr.com/photos/katerha/34714051013/
|
119
translated/tech/20180524 4 Markdown-powered slide generators.md
Normal file
119
translated/tech/20180524 4 Markdown-powered slide generators.md
Normal file
@ -0,0 +1,119 @@
|
||||
4 种基于 Markdown 的幻灯片生成器
|
||||
======
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bus_presentation.png?itok=CQeyO61b)
|
||||
|
||||
假设你需要做一个<ruby>演示<rt>presentation</rt></ruby>。在准备的过程中,你想到“我需要写几张幻灯片”。
|
||||
|
||||
你可能倾向于简洁的[纯文本][1],认为 LibreOffice Writer 这样的软件对你要做的事情而言像是杀鸡用牛刀。或者你只是遵从你内心深处的极客意识。
|
||||
|
||||
将 [Markdown][2] 格式的文件转换为优雅的演示幻灯片并不困难。下面介绍可以完成这项工作的四种工具。
|
||||
|
||||
### Landslide
|
||||
|
||||
在这些工具中,[Landslide][3] 具有更高的灵活性。它是一个命令行工具,可以将 Markdown、[reStructuredText][4] 或 [Textile][5] 格式的文件转换为基于 [Google HTML5 幻灯片模板][6]的 HTML 文件。
|
||||
|
||||
你要做的不过是编写 Markdown 格式的幻灯片源文件,打开一个终端窗口并运行 `landslide` 命令即可,其中命令参数为 Markdown 文件的文件名。Landslide 会生成 presentation.html,可以在任何 Web 浏览器中打开。简单吧?
|
||||
|
||||
但不要被简易的操作误导你。Landslide 提供了不少有用的特性,例如增加注记以及为幻灯片增加配置文件。为何要使用这些特性呢?按照 Landslide 开发者的说法,这样可以汇聚不同演示中的源文件目录并重用。
|
||||
|
||||
|
||||
![landslide.png][8]
|
||||
|
||||
在 Landslide 演示中查看演示者注记。
|
||||
|
||||
### Marp
|
||||
|
||||
[Marp][9] 仍处于开发中,但值得期待。它是 "Markdown Presentation Writer" 的简写。Marp 是一个基于 [Electron][10] 的工具,让你在一个简单的双栏编辑器中编写幻灯片:在左栏编写 Markdown,在右栏中预览效果。
|
||||
|
||||
Marp 支持 [GitHub 风格 Markdown][11]。如果你需要一个使用 GitHub 风格 Markdown 编写幻灯片的快速教程,可以参考 [示例项目][12]。GitHub 风格 Markdown 比基础 Markdown 更加灵活。
|
||||
|
||||
Marp 只自带两个基础主题,但你可以为幻灯片增加背景图片、调整图片大小以及增加数学表达式。不足之处,目前只支持 PDF 格式导出。老实说,我很好奇为何不一开始就提供 HTML 格式导出。
|
||||
|
||||
|
||||
![marp.png][14]
|
||||
|
||||
使用 Marp 编辑简单的幻灯片
|
||||
|
||||
### Pandoc
|
||||
|
||||
你可能已经知道 [pandoc][15] 是一种支持多种<ruby>标记语言<rt>markup languages</rt></ruby>相互转换的神奇工具。但你可能不知道,pandoc 可以将 Markdown 格式文件转换为 [Slidy][16]、[Slideous][17]、[DZSlides][18] 和 [Reveal.js][20] 等演示框架支持的优雅 HTML 幻灯片。如果你使用 [LaTeX][21],可以使用 [Beamer 软件包][22]输出 PDF 格式的幻灯片。
|
||||
|
||||
你需要在幻灯片中[使用特定格式][23],但可以通过[变量][24]控制效果。你也可以更改幻灯片的外观与风格,增加幻灯片之间的暂停,添加演示者注记等。
|
||||
|
||||
当然,你需要在你的主机上安装你喜欢的演示框架,因为 Pandoc 只生成原始幻灯片文件。
|
||||
|
||||
|
||||
![pandoc.png][26]
|
||||
|
||||
查看使用 Pandoc 和 DZSlides 创建的幻灯片
|
||||
|
||||
### Hacker Slides
|
||||
|
||||
[Hacker Slides][27] 是一个 [Sandstorm][28] 和 [Sandstorm Oasis][29] 平台上的应用,基于 Markdown 和 [Reveal.js][20] 幻灯片框架。生成的幻灯片可以比较朴素,也可以很炫。
|
||||
|
||||
在浏览器的两栏界面中编写幻灯片,左栏输入 Markdown 文本,右栏渲染效果。当你制作完成后,可以在 Sandstorm 中演示,也可以生成分享链接让其它人演示。
|
||||
|
||||
你可能会说,你不使用 Sandstorm 或 Sandstorm Oasis 怎么办?不要担心,Hacker Slides 提供了可以在桌面或服务器上运行的[版本][30]。
|
||||
|
||||
|
||||
![hacker-slides.png][32]
|
||||
|
||||
在 Hacker Slides 中编辑幻灯片
|
||||
|
||||
### 两点特别补充
|
||||
|
||||
如果你使用 [Jupyter <ruby>笔记本<rt>Notebooks</rt></ruby>][33] (参考社区版主 Don Watkins 的[文章][34])发布数据或指令文本,你可以使用 [Jupyter2slides][35]。该工具基于 Reveal.js,可以将笔记本转换为一系列精美的 HTML 幻灯片。
|
||||
|
||||
如果你倾向于托管应用,试试 [GitPitch][36],支持 GitHub,GitLab 和 Bitbucket。只需在将幻灯片源文件推送到支持的代码仓库中,在 GitPitch 中指向该仓库,这样你就可以在 GitPitch 网站上看到你的幻灯片了。
|
||||
|
||||
你有最喜欢的基于 Markdown 的幻灯片生成器吗?留下评论分享吧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/18/5/markdown-slide-generators
|
||||
|
||||
作者:[Scott Nesbitt][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[pinewall](https://github.com/pinewall)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/scottnesbitt
|
||||
[1]:https://plaintextproject.online/
|
||||
[2]:https://en.wikipedia.org/wiki/Markdown
|
||||
[3]:https://github.com/adamzap/landslide
|
||||
[4]:https://en.wikipedia.org/wiki/ReStructuredText
|
||||
[5]:https://en.wikipedia.org/wiki/Textile_(markup_language)
|
||||
[6]:https://github.com/skaegi/html5slides
|
||||
[7]:/file/397441
|
||||
[8]:https://opensource.com/sites/default/files/uploads/landslide.png (landslide.png)
|
||||
[9]:https://yhatt.github.io/marp/
|
||||
[10]:https://en.wikipedia.org/wiki/Electron_(software_framework)
|
||||
[11]:https://guides.github.com/features/mastering-markdown/
|
||||
[12]:https://raw.githubusercontent.com/yhatt/marp/master/example.md
|
||||
[13]:/file/397446
|
||||
[14]:https://opensource.com/sites/default/files/uploads/marp.png (marp.png)
|
||||
[15]:https://pandoc.org/
|
||||
[16]:https://www.w3.org/Talks/Tools/Slidy2/Overview.html#(1)
|
||||
[17]:http://goessner.net/articles/slideous/
|
||||
[18]:http://paulrouget.com/dzslides/
|
||||
[19]:https://meyerweb.com/eric/tools/s5/
|
||||
[20]:https://revealjs.com/#/
|
||||
[21]:https://www.latex-project.org/
|
||||
[22]:https://en.wikipedia.org/wiki/Beamer_(LaTeX)
|
||||
[23]:https://pandoc.org/MANUAL.html#producing-slide-shows-with-pandoc
|
||||
[24]:https://pandoc.org/MANUAL.html#variables-for-slides
|
||||
[25]:/file/397451
|
||||
[26]:https://opensource.com/sites/default/files/uploads/pandoc.png (pandoc.png)
|
||||
[27]:https://github.com/jacksingleton/hacker-slides
|
||||
[28]:https://sandstorm.io/
|
||||
[29]:https://oasis.sandstorm.io/
|
||||
[30]:https://github.com/msoedov/hacker-slides
|
||||
[31]:/file/397456
|
||||
[32]:https://opensource.com/sites/default/files/uploads/hacker-slides.png (hacker-slides.png)
|
||||
[33]:http://jupyter.org/
|
||||
[34]:https://opensource.com/article/18/3/getting-started-jupyter-notebooks
|
||||
[35]:https://github.com/datitran/jupyter2slides
|
||||
[36]:https://gitpitch.com/
|
Loading…
Reference in New Issue
Block a user