**, and notice that the paragraph line is indented automatically.
-
-```
-
-
Vim plugins are awesome !
-
-```
-
-Vim Surround has many other options. Give it a try—and consult [GitHub][7] for additional information.
-
-### 4\. Vim Gitgutter
-
-The [Vim Gitgutter][8] plugin is useful for anyone using Git for version control. It shows the output of **Git diff** as symbols in the "gutter"—the sign column where Vim presents additional information, such as line numbers. For example, consider the following as the committed version in Git:
-
-```
- 1 package main
- 2
- 3 import "fmt"
- 4
- 5 func main() {
- 6 x := true
- 7 items := []string{"tv", "pc", "tablet"}
- 8
- 9 if x {
- 10 for _, i := range items {
- 11 fmt.Println(i)
- 12 }
- 13 }
- 14 }
-```
-
-After making some changes, Vim Gitgutter displays the following symbols in the gutter:
-
-```
- 1 package main
- 2
- 3 import "fmt"
- 4
-_ 5 func main() {
- 6 items := []string{"tv", "pc", "tablet"}
- 7
-~ 8 if len(items) > 0 {
- 9 for _, i := range items {
- 10 fmt.Println(i)
-+ 11 fmt.Println("------")
- 12 }
- 13 }
- 14 }
-```
-
-The **-** symbol shows that a line was deleted between lines 5 and 6. The **~** symbol shows that line 8 was modified, and the symbol **+** shows that line 11 was added.
-
-In addition, Vim Gitgutter allows you to navigate between "hunks"—individual changes made in the file—with **[c** and **]c** , or even stage individual hunks for commit by pressing **Leader+hs**.
-
-This plugin gives you immediate visual feedback of changes, and it's a great addition to your toolbox if you use Git.
-
-### 5\. VIM Fugitive
-
-[Vim Fugitive][9] is another great plugin for anyone incorporating Git into the Vim workflow. It's a Git wrapper that allows you to execute Git commands directly from Vim and integrates with Vim's interface. This plugin has many features—check its [GitHub][10] page for more information.
-
-Here's a basic Git workflow example using Vim Fugitive. Considering the changes we've made to the Go code block on section 4, you can use **git blame** by typing the command **:Gblame** :
-
-```
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 1 package main
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 2
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 3 import "fmt"
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 4
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│_ 5 func main() {
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 6 items := []string{"tv", "pc", "tablet"}
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 7
-00000000 (Not Committed Yet 2018-12-05 18:55:00 -0500)│~ 8 if len(items) > 0 {
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 9 for _, i := range items {
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 10 fmt.Println(i)
-00000000 (Not Committed Yet 2018-12-05 18:55:00 -0500)│+ 11 fmt.Println("------")
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 12 }
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 13 }
-e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 14 }
-```
-
-You can see that lines 8 and 11 have not been committed. Check the repository status by typing **:Gstatus** :
-
-```
- 1 # On branch master
- 2 # Your branch is up to date with 'origin/master'.
- 3 #
- 4 # Changes not staged for commit:
- 5 # (use "git add
..." to update what will be committed)
- 6 # (use "git checkout -- ..." to discard changes in working directory)
- 7 #
- 8 # modified: vim-5plugins/examples/test1.go
- 9 #
- 10 no changes added to commit (use "git add" and/or "git commit -a")
---------------------------------------------------------------------------------------------------------
- 1 package main
- 2
- 3 import "fmt"
- 4
-_ 5 func main() {
- 6 items := []string{"tv", "pc", "tablet"}
- 7
-~ 8 if len(items) > 0 {
- 9 for _, i := range items {
- 10 fmt.Println(i)
-+ 11 fmt.Println("------")
- 12 }
- 13 }
- 14 }
-```
-
-Vim Fugitive opens a split window with the result of **git status**. You can stage a file for commit by pressing the **-** key on the line with the name of the file. You can reset the status by pressing **-** again. The message updates to reflect the new status:
-
-```
- 1 # On branch master
- 2 # Your branch is up to date with 'origin/master'.
- 3 #
- 4 # Changes to be committed:
- 5 # (use "git reset HEAD ..." to unstage)
- 6 #
- 7 # modified: vim-5plugins/examples/test1.go
- 8 #
---------------------------------------------------------------------------------------------------------
- 1 package main
- 2
- 3 import "fmt"
- 4
-_ 5 func main() {
- 6 items := []string{"tv", "pc", "tablet"}
- 7
-~ 8 if len(items) > 0 {
- 9 for _, i := range items {
- 10 fmt.Println(i)
-+ 11 fmt.Println("------")
- 12 }
- 13 }
- 14 }
-```
-
-Now you can use the command **:Gcommit** to commit the changes. Vim Fugitive opens another split that allows you to enter a commit message:
-
-```
- 1 vim-5plugins: Updated test1.go example file
- 2 # Please enter the commit message for your changes. Lines starting
- 3 # with '#' will be ignored, and an empty message aborts the commit.
- 4 #
- 5 # On branch master
- 6 # Your branch is up to date with 'origin/master'.
- 7 #
- 8 # Changes to be committed:
- 9 # modified: vim-5plugins/examples/test1.go
- 10 #
-```
-
-Save the file with **:wq** to complete the commit:
-
-```
-[master c3bf80f] vim-5plugins: Updated test1.go example file
- 1 file changed, 2 insertions(+), 2 deletions(-)
-Press ENTER or type command to continue
-```
-
-You can use **:Gstatus** again to see the result and **:Gpush** to update the remote repository with the new commit.
-
-```
- 1 # On branch master
- 2 # Your branch is ahead of 'origin/master' by 1 commit.
- 3 # (use "git push" to publish your local commits)
- 4 #
- 5 nothing to commit, working tree clean
-```
-
-If you like Vim Fugitive and want to learn more, the GitHub repository has links to screencasts showing additional functionality and workflows. Check it out!
-
-### What's next?
-
-These Vim plugins help developers write code in any programming language. There are two other categories of plugins to help developers: code-completion plugins and syntax-checker plugins. They are usually related to specific programming languages, so I will cover them in a follow-up article.
-
-Do you have another Vim plugin you use when writing code? Please share it in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/vim-plugins-developers
-
-作者:[Ricardo Gerardi][a]
-选题:[lujun9972][b]
-译者:[pityonline](https://github.com/pityonline)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/rgerardi
-[b]: https://github.com/lujun9972
-[1]: https://www.vim.org/
-[2]: https://www.vim.org/scripts/script.php?script_id=3599
-[3]: https://github.com/jiangmiao/auto-pairs
-[4]: https://github.com/scrooloose/nerdcommenter
-[5]: http://vim.wikia.com/wiki/Filetype.vim
-[6]: https://www.vim.org/scripts/script.php?script_id=1697
-[7]: https://github.com/tpope/vim-surround
-[8]: https://github.com/airblade/vim-gitgutter
-[9]: https://www.vim.org/scripts/script.php?script_id=2975
-[10]: https://github.com/tpope/vim-fugitive
diff --git a/sources/tech/20190115 Getting started with Sandstorm, an open source web app platform.md b/sources/tech/20190115 Getting started with Sandstorm, an open source web app platform.md
deleted file mode 100644
index 2389a5d243..0000000000
--- a/sources/tech/20190115 Getting started with Sandstorm, an open source web app platform.md
+++ /dev/null
@@ -1,58 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Getting started with Sandstorm, an open source web app platform)
-[#]: via: (https://opensource.com/article/19/1/productivity-tool-sandstorm)
-[#]: author: (Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
-
-Getting started with Sandstorm, an open source web app platform
-======
-Learn about Sandstorm, the third in our series on open source tools that will make you more productive in 2019.
-
-
-There seems to be a mad rush at the beginning of every year to find ways to be more productive. New Year's resolutions, the itch to start the year off right, and of course, an "out with the old, in with the new" attitude all contribute to this. And the usual round of recommendations is heavily biased towards closed source and proprietary software. It doesn't have to be that way.
-
-Here's the third of my picks for 19 new (or new-to-you) open source tools to help you be more productive in 2019.
-
-### Sandstorm
-
-Being productive isn't just about to-do lists and keeping things organized. Often it requires a suite of tools linked to make a workflow go smoothly.
-
-
-
-[Sandstorm][1] is an open source collection of packaged apps, all accessible from a single web interface and managed from a central console. You can host it yourself or use the [Sandstorm Oasis][2] service—for a per-user fee.
-
-
-
-Sandstorm has a marketplace that makes it simple to install the apps that are available. It includes apps for productivity, finance, note taking, task tracking, chat, games, and a whole lot more. You can also package your own apps and upload them by following the application-packaging guidelines in the [developer documentation][3].
-
-
-
-Once installed, a user can create [grains][4]—basically containerized instances of app data. Grains are private by default and can be shared with other Sandstorm users. This means they are secure by default, and users can chose what to share with others.
-
-
-
-Sandstorm can authenticate from several different external sources as well as use a "passwordless" email-based authentication. Using an external service means you don't have to manage yet another set of credentials if you already use one of the supported services.
-
-In the end, Sandstorm makes installing and using supported collaborative apps quick, easy, and secure.
-
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/productivity-tool-sandstorm
-
-作者:[Kevin Sonney][a]
-选题:[lujun9972][b]
-译者:[译者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/ksonney (Kevin Sonney)
-[b]: https://github.com/lujun9972
-[1]: https://sandstorm.io/
-[2]: https://oasis.sandstorm.io
-[3]: https://docs.sandstorm.io/en/latest/developing/
-[4]: https://sandstorm.io/how-it-works
diff --git a/sources/tech/20190115 Linux Desktop Setup - HookRace Blog.md b/sources/tech/20190115 Linux Desktop Setup - HookRace Blog.md
new file mode 100644
index 0000000000..29d5f63d2a
--- /dev/null
+++ b/sources/tech/20190115 Linux Desktop Setup - HookRace Blog.md
@@ -0,0 +1,514 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Linux Desktop Setup · HookRace Blog)
+[#]: via: (https://hookrace.net/blog/linux-desktop-setup/)
+[#]: author: (Dennis Felsing http://felsin9.de/nnis/)
+
+Linux Desktop Setup
+======
+
+
+My software setup has been surprisingly constant over the last decade, after a few years of experimentation since I initially switched to Linux in 2006. It might be interesting to look back in another 10 years and see what changed. A quick overview of what’s running as I’m writing this post:
+
+[![htop overview][1]][2]
+
+### Motivation
+
+My software priorities are, in no specific order:
+
+ * Programs should run on my local system so that I’m in control of them, this excludes cloud solutions.
+ * Programs should run in the terminal, so that they can be used consistently from anywhere, including weak computers or a phone.
+ * Keyboard focused is nearly automatic by using terminal software. I prefer to use the mouse where it makes sense only, reaching for the mouse all the time during typing feels like a waste of time. Occasionally it took me an hour to notice that the mouse wasn’t even plugged in.
+ * Ideally use fast and efficient software, I don’t like hearing the fan and feeling the room heat up. I can also keep running older hardware for much longer, my 10 year old Thinkpad x200s is still fine for all the software I use.
+ * Be composable. I don’t want to do every step manually, instead automate more when it makes sense. This naturally favors the shell.
+
+
+
+### Operating Systems
+
+I had a hard start with Linux 12 years ago by removing Windows, armed with just the [Gentoo Linux][3] installation CD and a printed manual to get a functioning Linux system. It took me a few days of compiling and tinkering, but in the end I felt like I had learnt a lot.
+
+I haven’t looked back to Windows since then, but I switched to [Arch Linux][4] on my laptop after having the fan fail from the constant compilation stress. Later I also switched all my other computers and private servers to Arch Linux. As a rolling release distribution you get package upgrades all the time, but the most important breakages are nicely reported in the [Arch Linux News][5].
+
+One annoyance though is that Arch Linux removes the old kernel modules once you upgrade it. I usually notice that once I try plugging in a USB flash drive and the kernel fails to load the relevant module. Instead you’re supposed to reboot after each kernel upgrade. There are a few [hacks][6] around to get around the problem, but I haven’t been bothered enough to actually use them.
+
+Similar problems happen with other programs, commonly Firefox, cron or Samba requiring a restart after an upgrade, but annoyingly not warning you that that’s the case. [SUSE][7], which I use at work, nicely warns about such cases.
+
+For the [DDNet][8] production servers I prefer [Debian][9] over Arch Linux, so that I have a lower chance of breakage on each upgrade. For my firewall and router I used [OpenBSD][10] for its clean system, documentation and great [pf firewall][11], but right now I don’t have a need for a separate router anymore.
+
+### Window Manager
+
+Since I started out with Gentoo I quickly noticed the huge compile time of KDE, which made it a no-go for me. I looked around for more minimal solutions, and used [Openbox][12] and [Fluxbox][13] initially. At some point I jumped on the tiling window manager train in order to be more keyboard-focused and picked up [dwm][14] and [awesome][15] close to their initial releases.
+
+In the end I settled on [xmonad][16] thanks to its flexibility, extendability and being written and configured in pure [Haskell][17], a great functional programming language. One example of this is that at home I run a single 40” 4K screen, but often split it up into four virtual screens, each displaying a workspace on which my windows are automatically arranged. Of course xmonad has a [module][18] for that.
+
+[dzen][19] and [conky][20] function as a simple enough status bar for me. My entire conky config looks like this:
+
+```
+out_to_console yes
+update_interval 1
+total_run_times 0
+
+TEXT
+${downspeed eth0} ${upspeed eth0} | $cpu% ${loadavg 1} ${loadavg 2} ${loadavg 3} $mem/$memmax | ${time %F %T}
+```
+
+And gets piped straight into dzen2 with `conky | dzen2 -fn '-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*' -bg '#000000' -fg '#ffffff' -p -e '' -x 1000 -w 920 -xs 1 -ta r`.
+
+One important feature for me is to make the terminal emit a beep sound once a job is done. This is done simply by adding a `\a` character to the `PR_TITLEBAR` variable in zsh, which is shown whenever a job is done. Of course I disable the actual beep sound by blacklisting the `pcspkr` kernel module with `echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf`. Instead the sound gets turned into an urgency by urxvt’s `URxvt.urgentOnBell: true` setting. Then xmonad has an urgency hook to capture this and I can automatically focus the currently urgent window with a key combination. In dzen I get the urgent windowspaces displayed with a nice and bright `#ff0000`.
+
+The final result in all its glory on my Laptop:
+
+[![Laptop screenshot][21]][22]
+
+I hear that [i3][23] has become quite popular in the last years, but it requires more manual window alignment instead of specifying automated methods to do it.
+
+I realize that there are also terminal multiplexers like [tmux][24], but I still require a few graphical applications, so in the end I never used them productively.
+
+### Terminal Persistency
+
+In order to keep terminals alive I use [dtach][25], which is just the detach feature of screen. In order to make every terminal on my computer detachable I wrote a [small wrapper script][26]. This means that even if I had to restart my X server I could keep all my terminals running just fine, both local and remote.
+
+### Shell & Programming
+
+Instead of [bash][27] I use [zsh][28] as my shell for its huge number of features.
+
+As a terminal emulator I found [urxvt][29] to be simple enough, support Unicode and 256 colors and has great performance. Another great feature is being able to run the urxvt client and daemon separately, so that even a large number of terminals barely takes up any memory (except for the scrollback buffer).
+
+There is only one font that looks absolutely clean and perfect to me: [Terminus][30]. Since i’s a bitmap font everything is pixel perfect and renders extremely fast and at low CPU usage. In order to switch fonts on-demand in each terminal with `CTRL-WIN-[1-7]` my ~/.Xdefaults contains:
+
+```
+URxvt.font: -xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*
+dzen2.font: -xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*
+
+URxvt.keysym.C-M-1: command:\033]50;-xos4-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*\007
+URxvt.keysym.C-M-2: command:\033]50;-xos4-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*\007
+URxvt.keysym.C-M-3: command:\033]50;-xos4-terminus-medium-r-normal-*-18-*-*-*-*-*-*-*\007
+URxvt.keysym.C-M-4: command:\033]50;-xos4-terminus-medium-r-normal-*-22-*-*-*-*-*-*-*\007
+URxvt.keysym.C-M-5: command:\033]50;-xos4-terminus-medium-r-normal-*-24-*-*-*-*-*-*-*\007
+URxvt.keysym.C-M-6: command:\033]50;-xos4-terminus-medium-r-normal-*-28-*-*-*-*-*-*-*\007
+URxvt.keysym.C-M-7: command:\033]50;-xos4-terminus-medium-r-normal-*-32-*-*-*-*-*-*-*\007
+
+URxvt.keysym.C-M-n: command:\033]10;#ffffff\007\033]11;#000000\007\033]12;#ffffff\007\033]706;#00ffff\007\033]707;#ffff00\007
+URxvt.keysym.C-M-b: command:\033]10;#000000\007\033]11;#ffffff\007\033]12;#000000\007\033]706;#0000ff\007\033]707;#ff0000\007
+```
+
+For programming and writing I use [Vim][31] with syntax highlighting and [ctags][32] for indexing, as well as a few terminal windows with grep, sed and the other usual suspects for search and manipulation. This is probably not at the same level of comfort as an IDE, but allows me more automation.
+
+One problem with Vim is that you get so used to its key mappings that you’ll want to use them everywhere.
+
+[Python][33] and [Nim][34] do well as scripting languages where the shell is not powerful enough.
+
+### System Monitoring
+
+[htop][35] (look at the background of that site, it’s a live view of the server that’s hosting it) works great for getting a quick overview of what the software is currently doing. [lm_sensors][36] allows monitoring the hardware temperatures, fans and voltages. [powertop][37] is a great little tool by Intel to find power savings. [ncdu][38] lets you analyze disk usage interactively.
+
+[nmap][39], iptraf-ng, [tcpdump][40] and [Wireshark][41] are essential tools for analyzing network problems.
+
+There are of course many more great tools.
+
+### Mails & Synchronization
+
+On my home server I have a [fetchmail][42] daemon running for each email acccount that I have. Fetchmail just retrieves the incoming emails and invokes [procmail][43]:
+
+```
+#!/bin/sh
+for i in /home/deen/.fetchmail/*; do
+ FETCHMAILHOME=$i /usr/bin/fetchmail -m 'procmail -d %T' -d 60
+done
+```
+
+The configuration is as simple as it could be and waits for the server to inform us of fresh emails:
+
+```
+poll imap.1und1.de protocol imap timeout 120 user "dennis@felsin9.de" password "XXX" folders INBOX keep ssl idle
+```
+
+My `.procmailrc` config contains a few rules to backup all mails and sort them into the correct directories, for example based on the mailing list id or from field in the mail header:
+
+```
+MAILDIR=/home/deen/shared/Maildir
+LOGFILE=$HOME/.procmaillog
+LOGABSTRACT=no
+VERBOSE=off
+FORMAIL=/usr/bin/formail
+NL="
+"
+
+:0wc
+* ! ? test -d /media/mailarchive/`date +%Y`
+| mkdir -p /media/mailarchive/`date +%Y`
+
+# Make backups of all mail received in format YYYY/YYYY-MM
+:0c
+/media/mailarchive/`date +%Y`/`date +%Y-%m`
+
+:0
+* ^From: .*(.*@.*.kit.edu|.*@.*.uka.de|.*@.*.uni-karlsruhe.de)
+$MAILDIR/.uni/
+
+:0
+* ^list-Id:.*lists.kit.edu
+$MAILDIR/.uni-ml/
+
+[...]
+```
+
+To send emails I use [msmtp][44], which is also great to configure:
+
+```
+account default
+host smtp.1und1.de
+tls on
+tls_trust_file /etc/ssl/certs/ca-certificates.crt
+auth on
+from dennis@felsin9.de
+user dennis@felsin9.de
+password XXX
+
+[...]
+```
+
+But so far the emails are still on the server. My documents are all stored in a directory that I synchronize between all computers using [Unison][45]. Think of Unison as a bidirectional interactive [rsync][46]. My emails are part of this documents directory and thus they end up on my desktop computers.
+
+This also means that while the emails reach my server immediately, I only fetch them on deman instead of getting instant notifications when an email comes in.
+
+From there I read the mails with [mutt][47], using the sidebar plugin to display my mail directories. The `/etc/mailcap` file is essential to display non-plaintext mails containing HTML, Word or PDF:
+
+```
+text/html;w3m -I %{charset} -T text/html; copiousoutput
+application/msword; antiword %s; copiousoutput
+application/pdf; pdftotext -layout /dev/stdin -; copiousoutput
+```
+
+### News & Communication
+
+[Newsboat][48] is a nice little RSS/Atom feed reader in the terminal. I have it running on the server in a `tach` session with about 150 feeds. Filtering feeds locally is also possible, for example:
+
+```
+ignore-article "https://forum.ddnet.tw/feed.php" "title =~ \"Map Testing •\" or title =~ \"Old maps •\" or title =~ \"Map Bugs •\" or title =~ \"Archive •\" or title =~ \"Waiting for mapper •\" or title =~ \"Other mods •\" or title =~ \"Fixes •\""
+```
+
+I use [Irssi][49] the same way for communication via IRC.
+
+### Calendar
+
+[remind][50] is a calendar that can be used from the command line. Setting new reminders is done by editing the `rem` files:
+
+```
+# One time events
+REM 2019-01-20 +90 Flight to China %b
+
+# Recurring Holidays
+REM 1 May +90 Holiday "Tag der Arbeit" %b
+REM [trigger(easterdate(year(today()))-2)] +90 Holiday "Karfreitag" %b
+
+# Time Change
+REM Nov Sunday 1 --7 +90 Time Change (03:00 -> 02:00) %b
+REM Apr Sunday 1 --7 +90 Time Change (02:00 -> 03:00) %b
+
+# Birthdays
+FSET birthday(x) "'s " + ord(year(trigdate())-x) + " birthday is %b"
+REM 16 Apr +90 MSG Andreas[birthday(1994)]
+
+# Sun
+SET $LatDeg 49
+SET $LatMin 19
+SET $LatSec 49
+SET $LongDeg -8
+SET $LongMin -40
+SET $LongSec -24
+
+MSG Sun from [sunrise(trigdate())] to [sunset(trigdate())]
+[...]
+```
+
+Unfortunately there is no Chinese Lunar calendar function in remind yet, so Chinese holidays can’t be calculated easily.
+
+I use two aliases for remind:
+
+```
+rem -m -b1 -q -g
+```
+
+to see a list of the next events in chronological order and
+
+```
+rem -m -b1 -q -cuc12 -w$(($(tput cols)+1)) | sed -e "s/\f//g" | less
+```
+
+to show a calendar fitting just the width of my terminal:
+
+![remcal][51]
+
+### Dictionary
+
+[rdictcc][52] is a little known dictionary tool that uses the excellent dictionary files from [dict.cc][53] and turns them into a local database:
+
+```
+$ rdictcc rasch
+====================[ A => B ]====================
+rasch:
+ - apace
+ - brisk [speedy]
+ - cursory
+ - in a timely manner
+ - quick
+ - quickly
+ - rapid
+ - rapidly
+ - sharpish [Br.] [coll.]
+ - speedily
+ - speedy
+ - swift
+ - swiftly
+rasch [gehen]:
+ - smartly [quickly]
+Rasch {n} [Zittergras-Segge]:
+ - Alpine grass [Carex brizoides]
+ - quaking grass sedge [Carex brizoides]
+Rasch {m} [regional] [Putzrasch]:
+ - scouring pad
+====================[ B => A ]====================
+Rasch model:
+ - Rasch-Modell {n}
+```
+
+### Writing and Reading
+
+I have a simple todo file containing my tasks, that is basically always sitting open in a Vim session. For work I also use the todo file as a “done” file so that I can later check what tasks I finished on each day.
+
+For writing documents, letters and presentations I use [LaTeX][54] for its superior typesetting. A simple letter in German format can be set like this for example:
+
+```
+\documentclass[paper = a4, fromalign = right]{scrlttr2}
+\usepackage{german}
+\usepackage{eurosym}
+\usepackage[utf8]{inputenc}
+\setlength{\parskip}{6pt}
+\setlength{\parindent}{0pt}
+
+\setkomavar{fromname}{Dennis Felsing}
+\setkomavar{fromaddress}{Meine Str. 1\\69181 Leimen}
+\setkomavar{subject}{Titel}
+
+\setkomavar*{enclseparator}{Anlagen}
+
+\makeatletter
+\@setplength{refvpos}{89mm}
+\makeatother
+
+\begin{document}
+\begin{letter} {Herr Soundso\\Deine Str. 2\\69121 Heidelberg}
+\opening{Sehr geehrter Herr Soundso,}
+
+Sie haben bei mir seit dem Bla Bla Bla.
+
+Ich fordere Sie hiermit zu Bla Bla Bla auf.
+
+\closing{Mit freundlichen Grüßen}
+
+\end{letter}
+\end{document}
+```
+
+Further example documents and presentations can be found over at [my private site][55].
+
+To read PDFs [Zathura][56] is fast, has Vim-like controls and even supports two different PDF backends: Poppler and MuPDF. [Evince][57] on the other hand is more full-featured for the cases where I encounter documents that Zathura doesn’t like.
+
+### Graphical Editing
+
+[GIMP][58] and [Inkscape][59] are easy choices for photo editing and interactive vector graphics respectively.
+
+In some cases [Imagemagick][60] is good enough though and can be used straight from the command line and thus automated to edit images. Similarly [Graphviz][61] and [TikZ][62] can be used to draw graphs and other diagrams.
+
+### Web Browsing
+
+As a web browser I’ve always used [Firefox][63] for its extensibility and low resource usage compared to Chrome.
+
+Unfortunately the [Pentadactyl][64] extension development stopped after Firefox switched to Chrome-style extensions entirely, so I don’t have satisfying Vim-like controls in my browser anymore.
+
+### Media Players
+
+[mpv][65] with hardware decoding allows watching videos at 5% CPU load using the `vo=gpu` and `hwdec=vaapi` config settings. `audio-channels=2` in mpv seems to give me clearer downmixing to my stereo speakers / headphones than what PulseAudio does by default. A great little feature is exiting with `Shift-Q` instead of just `Q` to save the playback location. When watching with someone with another native tongue you can use `--secondary-sid=` to show two subtitles at once, the primary at the bottom, the secondary at the top of the screen
+
+My wirelss mouse can easily be made into a remote control with mpv with a small `~/.config/mpv/input.conf`:
+
+```
+MOUSE_BTN5 run "mixer" "pcm" "-2"
+MOUSE_BTN6 run "mixer" "pcm" "+2"
+MOUSE_BTN1 cycle sub-visibility
+MOUSE_BTN7 add chapter -1
+MOUSE_BTN8 add chapter 1
+```
+
+[youtube-dl][66] works great for watching videos hosted online, best quality can be achieved with `-f bestvideo+bestaudio/best --all-subs --embed-subs`.
+
+As a music player [MOC][67] hasn’t been actively developed for a while, but it’s still a simple player that plays every format conceivable, including the strangest Chiptune formats. In the AUR there is a [patch][68] adding PulseAudio support as well. Even with the CPU clocked down to 800 MHz MOC barely uses 1-2% of a single CPU core.
+
+![moc][69]
+
+My music collection sits on my home server so that I can access it from anywhere. It is mounted using [SSHFS][70] and automount in the `/etc/fstab/`:
+
+```
+root@server:/media/media /mnt/media fuse.sshfs noauto,x-systemd.automount,idmap=user,IdentityFile=/root/.ssh/id_rsa,allow_other,reconnect 0 0
+```
+
+### Cross-Platform Building
+
+Linux is great to build packages for any major operating system except Linux itself! In the beginning I used [QEMU][71] to with an old Debian, Windows and Mac OS X VM to build for these platforms.
+
+Nowadays I switched to using chroot for the old Debian distribution (for maximum Linux compatibility), [MinGW][72] to cross-compile for Windows and [OSXCross][73] to cross-compile for Mac OS X.
+
+The script used to [build DDNet][74] as well as the [instructions for updating library builds][75] are based on this.
+
+### Backups
+
+As usual, we nearly forgot about backups. Even if this is the last chapter, it should not be an afterthought.
+
+I wrote [rrb][76] (reverse rsync backup) 10 years ago to wrap rsync so that I only need to give the backup server root SSH rights to the computers that it is backing up. Surprisingly rrb needed 0 changes in the last 10 years, even though I kept using it the entire time.
+
+The backups are stored straight on the filesystem. Incremental backups are implemented using hard links (`--link-dest`). A simple [config][77] defines how long backups are kept, which defaults to:
+
+```
+KEEP_RULES=( \
+ 7 7 \ # One backup a day for the last 7 days
+ 31 8 \ # 8 more backups for the last month
+ 365 11 \ # 11 more backups for the last year
+1825 4 \ # 4 more backups for the last 5 years
+)
+```
+
+Since some of my computers don’t have a static IP / DNS entry and I still want to back them up using rrb I use a reverse SSH tunnel (as a systemd service) for them:
+
+```
+[Unit]
+Description=Reverse SSH Tunnel
+After=network.target
+
+[Service]
+ExecStart=/usr/bin/ssh -N -R 27276:localhost:22 -o "ExitOnForwardFailure yes" server
+KillMode=process
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
+```
+
+Now the server can reach the client through `ssh -p 27276 localhost` while the tunnel is running to perform the backup, or in `.ssh/config` format:
+
+```
+Host cr-remote
+ HostName localhost
+ Port 27276
+```
+
+While talking about SSH hacks, sometimes a server is not easily reachable thanks to some bad routing. In that case you can route the SSH connection through another server to get better routing, in this case going through the USA to reach my Chinese server which had not been reliably reachable from Germany for a few weeks:
+
+```
+Host chn.ddnet.tw
+ ProxyCommand ssh -q usa.ddnet.tw nc -q0 chn.ddnet.tw 22
+ Port 22
+```
+
+### Final Remarks
+
+Thanks for reading my random collection of tools. I probably forgot many programs that I use so naturally every day that I don’t even think about them anymore. Let’s see how stable my software setup stays in the next years. If you have any questions, feel free to get in touch with me at [dennis@felsin9.de][78].
+
+Comments on [Hacker News][79].
+
+--------------------------------------------------------------------------------
+
+via: https://hookrace.net/blog/linux-desktop-setup/
+
+作者:[Dennis Felsing][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: http://felsin9.de/nnis/
+[b]: https://github.com/lujun9972
+[1]: https://hookrace.net/public/linux-desktop/htop_small.png
+[2]: https://hookrace.net/public/linux-desktop/htop.png
+[3]: https://gentoo.org/
+[4]: https://www.archlinux.org/
+[5]: https://www.archlinux.org/news/
+[6]: https://www.reddit.com/r/archlinux/comments/4zrsc3/keep_your_system_fully_functional_after_a_kernel/
+[7]: https://www.suse.com/
+[8]: https://ddnet.tw/
+[9]: https://www.debian.org/
+[10]: https://www.openbsd.org/
+[11]: https://www.openbsd.org/faq/pf/
+[12]: http://openbox.org/wiki/Main_Page
+[13]: http://fluxbox.org/
+[14]: https://dwm.suckless.org/
+[15]: https://awesomewm.org/
+[16]: https://xmonad.org/
+[17]: https://www.haskell.org/
+[18]: http://hackage.haskell.org/package/xmonad-contrib-0.15/docs/XMonad-Layout-LayoutScreens.html
+[19]: http://robm.github.io/dzen/
+[20]: https://github.com/brndnmtthws/conky
+[21]: https://hookrace.net/public/linux-desktop/laptop_small.png
+[22]: https://hookrace.net/public/linux-desktop/laptop.png
+[23]: https://i3wm.org/
+[24]: https://github.com/tmux/tmux/wiki
+[25]: http://dtach.sourceforge.net/
+[26]: https://github.com/def-/tach/blob/master/tach
+[27]: https://www.gnu.org/software/bash/
+[28]: http://www.zsh.org/
+[29]: http://software.schmorp.de/pkg/rxvt-unicode.html
+[30]: http://terminus-font.sourceforge.net/
+[31]: https://www.vim.org/
+[32]: http://ctags.sourceforge.net/
+[33]: https://www.python.org/
+[34]: https://nim-lang.org/
+[35]: https://hisham.hm/htop/
+[36]: http://lm-sensors.org/
+[37]: https://01.org/powertop/
+[38]: https://dev.yorhel.nl/ncdu
+[39]: https://nmap.org/
+[40]: https://www.tcpdump.org/
+[41]: https://www.wireshark.org/
+[42]: http://www.fetchmail.info/
+[43]: http://www.procmail.org/
+[44]: https://marlam.de/msmtp/
+[45]: https://www.cis.upenn.edu/~bcpierce/unison/
+[46]: https://rsync.samba.org/
+[47]: http://www.mutt.org/
+[48]: https://newsboat.org/
+[49]: https://irssi.org/
+[50]: https://www.roaringpenguin.com/products/remind
+[51]: https://hookrace.net/public/linux-desktop/remcal.png
+[52]: https://github.com/tsdh/rdictcc
+[53]: https://www.dict.cc/
+[54]: https://www.latex-project.org/
+[55]: http://felsin9.de/nnis/research/
+[56]: https://pwmt.org/projects/zathura/
+[57]: https://wiki.gnome.org/Apps/Evince
+[58]: https://www.gimp.org/
+[59]: https://inkscape.org/
+[60]: https://imagemagick.org/Usage/
+[61]: https://www.graphviz.org/
+[62]: https://sourceforge.net/projects/pgf/
+[63]: https://www.mozilla.org/en-US/firefox/new/
+[64]: https://github.com/5digits/dactyl
+[65]: https://mpv.io/
+[66]: https://rg3.github.io/youtube-dl/
+[67]: http://moc.daper.net/
+[68]: https://aur.archlinux.org/packages/moc-pulse/
+[69]: https://hookrace.net/public/linux-desktop/moc.png
+[70]: https://github.com/libfuse/sshfs
+[71]: https://www.qemu.org/
+[72]: http://www.mingw.org/
+[73]: https://github.com/tpoechtrager/osxcross
+[74]: https://github.com/ddnet/ddnet-scripts/blob/master/ddnet-release.sh
+[75]: https://github.com/ddnet/ddnet-scripts/blob/master/ddnet-lib-update.sh
+[76]: https://github.com/def-/rrb/blob/master/rrb
+[77]: https://github.com/def-/rrb/blob/master/config.example
+[78]: mailto:dennis@felsin9.de
+[79]: https://news.ycombinator.com/item?id=18979731
diff --git a/sources/tech/20190116 The Evil-Twin Framework- A tool for improving WiFi security.md b/sources/tech/20190116 The Evil-Twin Framework- A tool for improving WiFi security.md
deleted file mode 100644
index 81b5d2ddf1..0000000000
--- a/sources/tech/20190116 The Evil-Twin Framework- A tool for improving WiFi security.md
+++ /dev/null
@@ -1,236 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (The Evil-Twin Framework: A tool for improving WiFi security)
-[#]: via: (https://opensource.com/article/19/1/evil-twin-framework)
-[#]: author: (André Esser https://opensource.com/users/andreesser)
-
-The Evil-Twin Framework: A tool for improving WiFi security
-======
-Learn about a pen-testing tool intended to test the security of WiFi access points for all types of threats.
-
-
-The increasing number of devices that connect over-the-air to the internet over-the-air and the wide availability of WiFi access points provide many opportunities for attackers to exploit users. By tricking users to connect to [rogue access points][1], hackers gain full control over the users' network connection, which allows them to sniff and alter traffic, redirect users to malicious sites, and launch other attacks over the network..
-
-To protect users and teach them to avoid risky online behaviors, security auditors and researchers must evaluate users' security practices and understand the reasons they connect to WiFi access points without being confident they are safe. There are a significant number of tools that can conduct WiFi audits, but no single tool can test the many different attack scenarios and none of the tools integrate well with one another.
-
-The **Evil-Twin Framework** (ETF) aims to fix these problems in the WiFi auditing process by enabling auditors to examine multiple scenarios and integrate multiple tools. This article describes the framework and its functionalities, then provides some examples to show how it can be used.
-
-### The ETF architecture
-
-The ETF framework was written in [Python][2] because the development language is very easy to read and make contributions to. In addition, many of the ETF's libraries, such as **[Scapy][3]** , were already developed for Python, making it easy to use them for ETF.
-
-The ETF architecture (Figure 1) is divided into different modules that interact with each other. The framework's settings are all written in a single configuration file. The user can verify and edit the settings through the user interface via the **ConfigurationManager** class. Other modules can only read these settings and run according to them.
-
-![Evil-Twin Framework Architecture][5]
-
-Figure 1: Evil-Twin framework architecture
-
-The ETF supports multiple user interfaces that interact with the framework. The current default interface is an interactive console, similar to the one on [Metasploit][6]. A graphical user interface (GUI) and a command line interface (CLI) are under development for desktop/browser use, and mobile interfaces may be an option in the future. The user can edit the settings in the configuration file using the interactive console (and eventually with the GUI). The user interface can interact with every other module that exists in the framework.
-
-The WiFi module ( **AirCommunicator** ) was built to support a wide range of WiFi capabilities and attacks. The framework identifies three basic pillars of Wi-Fi communication: **packet sniffing** , **custom packet injection** , and **access point creation**. The three main WiFi communication modules are **AirScanner** , **AirInjector** , and **AirHost** , which are responsible for packet sniffing, packet injection, and access point creation, respectively. The three classes are wrapped inside the main WiFi module, AirCommunicator, which reads the configuration file before starting the services. Any type of WiFi attack can be built using one or more of these core features.
-
-To enable man-in-the-middle (MITM) attacks, which are a common way to attack WiFi clients, the framework has an integrated module called ETFITM (Evil-Twin Framework-in-the-Middle). This module is responsible for the creation of a web proxy used to intercept and manipulate HTTP/HTTPS traffic.
-
-There are many other tools that can leverage the MITM position created by the ETF. Through its extensibility, ETF can support them—and, instead of having to call them separately, you can add the tools to the framework just by extending the Spawner class. This enables a developer or security auditor to call the program with a preconfigured argument string from within the framework.
-
-The other way to extend the framework is through plugins. There are two categories of plugins: **WiFi plugins** and **MITM plugins**. MITM plugins are scripts that can run while the MITM proxy is active. The proxy passes the HTTP(S) requests and responses through to the plugins where they can be logged or manipulated. WiFi plugins follow a more complex flow of execution but still expose a fairly simple API to contributors who wish to develop and use their own plugins. WiFi plugins can be further divided into three categories, one for each of the core WiFi communication modules.
-
-Each of the core modules has certain events that trigger the execution of a plugin. For instance, AirScanner has three defined events to which a response can be programmed. The events usually correspond to a setup phase before the service starts running, a mid-execution phase while the service is running, and a teardown or cleanup phase after a service finishes. Since Python allows multiple inheritance, one plugin can subclass more than one plugin class.
-
-Figure 1 above is a summary of the framework's architecture. Lines pointing away from the ConfigurationManager mean that the module reads information from it and lines pointing towards it mean that the module can write/edit configurations.
-
-### Examples of using the Evil-Twin Framework
-
-There are a variety of ways ETF can conduct penetration testing on WiFi network security or work on end users' awareness of WiFi security. The following examples describe some of the framework's pen-testing functionalities, such as access point and client detection, WPA and WEP access point attacks, and evil twin access point creation.
-
-These examples were devised using ETF with WiFi cards that allow WiFi traffic capture. They also utilize the following abbreviations for ETF setup commands:
-
- * **APS** access point SSID
- * **APB** access point BSSID
- * **APC** access point channel
- * **CM** client MAC address
-
-
-
-In a real testing scenario, make sure to replace these abbreviations with the correct information.
-
-#### Capturing a WPA 4-way handshake after a de-authentication attack
-
-This scenario (Figure 2) takes two aspects into consideration: the de-authentication attack and the possibility of catching a 4-way WPA handshake. The scenario starts with a running WPA/WPA2-enabled access point with one connected client device (in this case, a smartphone). The goal is to de-authenticate the client with a general de-authentication attack then capture the WPA handshake once it tries to reconnect. The reconnection will be done manually immediately after being de-authenticated.
-
-![Scenario for capturing a WPA handshake after a de-authentication attack][8]
-
-Figure 2: Scenario for capturing a WPA handshake after a de-authentication attack
-
-The consideration in this example is the ETF's reliability. The goal is to find out if the tools can consistently capture the WPA handshake. The scenario will be performed multiple times with each tool to check its reliability when capturing the WPA handshake.
-
-There is more than one way to capture a WPA handshake using the ETF. One way is to use a combination of the AirScanner and AirInjector modules; another way is to just use the AirInjector. The following scenario uses a combination of both modules.
-
-The ETF launches the AirScanner module and analyzes the IEEE 802.11 frames to find a WPA handshake. Then the AirInjector can launch a de-authentication attack to force a reconnection. The following steps must be done to accomplish this on the ETF:
-
- 1. Enter the AirScanner configuration mode: **config airscanner**
- 2. Configure the AirScanner to not hop channels: **config airscanner**
- 3. Set the channel to sniff the traffic on the access point channel (APC): **set fixed_sniffing_channel = **
- 4. Start the AirScanner module with the CredentialSniffer plugin: **start airscanner with credentialsniffer**
- 5. Add a target access point BSSID (APS) from the sniffed access points list: **add aps where ssid = **
- 6. Start the AirInjector, which by default lauches the de-authentication attack: **start airinjector**
-
-
-
-This simple set of commands enables the ETF to perform an efficient and successful de-authentication attack on every test run. The ETF can also capture the WPA handshake on every test run. The following code makes it possible to observe the ETF's successful execution.
-
-```
-███████╗████████╗███████╗
-██╔════╝╚══██╔══╝██╔════╝
-█████╗ ██║ █████╗
-██╔══╝ ██║ ██╔══╝
-███████╗ ██║ ██║
-╚══════╝ ╚═╝ ╚═╝
-
-
-[+] Do you want to load an older session? [Y/n]: n
-[+] Creating new temporary session on 02/08/2018
-[+] Enter the desired session name:
-ETF[etf/aircommunicator/]::> config airscanner
-ETF[etf/aircommunicator/airscanner]::> listargs
- sniffing_interface = wlan1; (var)
- probes = True; (var)
- beacons = True; (var)
- hop_channels = false; (var)
-fixed_sniffing_channel = 11; (var)
-ETF[etf/aircommunicator/airscanner]::> start airscanner with
-arpreplayer caffelatte credentialsniffer packetlogger selfishwifi
-ETF[etf/aircommunicator/airscanner]::> start airscanner with credentialsniffer
-[+] Successfully added credentialsniffer plugin.
-[+] Starting packet sniffer on interface 'wlan1'
-[+] Set fixed channel to 11
-ETF[etf/aircommunicator/airscanner]::> add aps where ssid = CrackWPA
-ETF[etf/aircommunicator/airscanner]::> start airinjector
-ETF[etf/aircommunicator/airscanner]::> [+] Starting deauthentication attack
- - 1000 bursts of 1 packets
- - 1 different packets
-[+] Injection attacks finished executing.
-[+] Starting post injection methods
-[+] Post injection methods finished
-[+] WPA Handshake found for client '70:3e:ac:bb:78:64' and network 'CrackWPA'
-```
-
-#### Launching an ARP replay attack and cracking a WEP network
-
-The next scenario (Figure 3) will also focus on the [Address Resolution Protocol][9] (ARP) replay attack's efficiency and the speed of capturing the WEP data packets containing the initialization vectors (IVs). The same network may require a different number of caught IVs to be cracked, so the limit for this scenario is 50,000 IVs. If the network is cracked during the first test with less than 50,000 IVs, that number will be the new limit for the following tests on the network. The cracking tool to be used will be **aircrack-ng**.
-
-The test scenario starts with an access point using WEP encryption and an offline client that knows the key—the key for testing purposes is 12345, but it can be a larger and more complex key. Once the client connects to the WEP access point, it will send out a gratuitous ARP packet; this is the packet that's meant to be captured and replayed. The test ends once the limit of packets containing IVs is captured.
-
-![Scenario for capturing a WPA handshake after a de-authentication attack][11]
-
-Figure 3: Scenario for capturing a WPA handshake after a de-authentication attack
-
-ETF uses Python's Scapy library for packet sniffing and injection. To minimize known performance problems in Scapy, ETF tweaks some of its low-level libraries to significantly speed packet injection. For this specific scenario, the ETF uses **tcpdump** as a background process instead of Scapy for more efficient packet sniffing, while Scapy is used to identify the encrypted ARP packet.
-
-This scenario requires the following commands and operations to be performed on the ETF:
-
- 1. Enter the AirScanner configuration mode: **config airscanner**
- 2. Configure the AirScanner to not hop channels: **set hop_channels = false**
- 3. Set the channel to sniff the traffic on the access point channel (APC): **set fixed_sniffing_channel = **
- 4. Enter the ARPReplayer plugin configuration mode: **config arpreplayer**
- 5. Set the target access point BSSID (APB) of the WEP network: **set target_ap_bssid **
- 6. Start the AirScanner module with the ARPReplayer plugin: **start airscanner with arpreplayer**
-
-
-
-After executing these commands, ETF correctly identifies the encrypted ARP packet, then successfully performs an ARP replay attack, which cracks the network.
-
-#### Launching a catch-all honeypot
-
-The scenario in Figure 4 creates multiple access points with the same SSID. This technique discovers the encryption type of a network that was probed for but out of reach. By launching multiple access points with all security settings, the client will automatically connect to the one that matches the security settings of the locally cached access point information.
-
-![Scenario for capturing a WPA handshake after a de-authentication attack][13]
-
-Figure 4: Scenario for capturing a WPA handshake after a de-authentication attack
-
-Using the ETF, it is possible to configure the **hostapd** configuration file then launch the program in the background. Hostapd supports launching multiple access points on the same wireless card by configuring virtual interfaces, and since it supports all types of security configurations, a complete catch-all honeypot can be set up. For the WEP and WPA(2)-PSK networks, a default password is used, and for the WPA(2)-EAP, an "accept all" policy is configured.
-
-For this scenario, the following commands and operations must be performed on the ETF:
-
- 1. Enter the APLauncher configuration mode: **config aplauncher**
- 2. Set the desired access point SSID (APS): **set ssid = **
- 3. Configure the APLauncher as a catch-all honeypot: **set catch_all_honeypot = true**
- 4. Start the AirHost module: **start airhost**
-
-
-
-With these commands, the ETF can launch a complete catch-all honeypot with all types of security configurations. ETF also automatically launches the DHCP and DNS servers that allow clients to stay connected to the internet. ETF offers a better, faster, and more complete solution to create catch-all honeypots. The following code enables the successful execution of the ETF to be observed.
-
-```
-███████╗████████╗███████╗
-██╔════╝╚══██╔══╝██╔════╝
-█████╗ ██║ █████╗
-██╔══╝ ██║ ██╔══╝
-███████╗ ██║ ██║
-╚══════╝ ╚═╝ ╚═╝
-
-
-[+] Do you want to load an older session? [Y/n]: n
-[+] Creating ne´,cxzw temporary session on 03/08/2018
-[+] Enter the desired session name:
-ETF[etf/aircommunicator/]::> config aplauncher
-ETF[etf/aircommunicator/airhost/aplauncher]::> setconf ssid CatchMe
-ssid = CatchMe
-ETF[etf/aircommunicator/airhost/aplauncher]::> setconf catch_all_honeypot true
-catch_all_honeypot = true
-ETF[etf/aircommunicator/airhost/aplauncher]::> start airhost
-[+] Killing already started processes and restarting network services
-[+] Stopping dnsmasq and hostapd services
-[+] Access Point stopped...
-[+] Running airhost plugins pre_start
-[+] Starting hostapd background process
-[+] Starting dnsmasq service
-[+] Running airhost plugins post_start
-[+] Access Point launched successfully
-[+] Starting dnsmasq service
-```
-
-### Conclusions and future work
-
-These scenarios use common and well-known attacks to help validate the ETF's capabilities for testing WiFi networks and clients. The results also validate that the framework's architecture enables new attack vectors and features to be developed on top of it while taking advantage of the platform's existing capabilities. This should accelerate development of new WiFi penetration-testing tools, since a lot of the code is already written. Furthermore, the fact that complementary WiFi technologies are all integrated in a single tool will make WiFi pen-testing simpler and more efficient.
-
-The ETF's goal is not to replace existing tools but to complement them and offer a broader choice to security auditors when conducting WiFi pen-testing and improving user awareness.
-
-The ETF is an open source project [available on GitHub][14] and community contributions to its development are welcomed. Following are some of the ways you can help.
-
-One of the limitations of current WiFi pen-testing is the inability to log important events during tests. This makes reporting identified vulnerabilities both more difficult and less accurate. The framework could implement a logger that can be accessed by every class to create a pen-testing session report.
-
-The ETF tool's capabilities cover many aspects of WiFi pen-testing. On one hand, it facilitates the phases of WiFi reconnaissance, vulnerability discovery, and attack. On the other hand, it doesn't offer a feature that facilitates the reporting phase. Adding the concept of a session and a session reporting feature, such as the logging of important events during a session, would greatly increase the value of the tool for real pen-testing scenarios.
-
-Another valuable contribution would be extending the framework to facilitate WiFi fuzzing. The IEEE 802.11 protocol is very complex, and considering there are multiple implementations of it, both on the client and access point side, it's safe to assume these implementations contain bugs and even security flaws. These bugs could be discovered by fuzzing IEEE 802.11 protocol frames. Since Scapy allows custom packet creation and injection, a fuzzer can be implemented through it.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/evil-twin-framework
-
-作者:[André Esser][a]
-选题:[lujun9972][b]
-译者:[译者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/andreesser
-[b]: https://github.com/lujun9972
-[1]: https://en.wikipedia.org/wiki/Rogue_access_point
-[2]: https://www.python.org/
-[3]: https://scapy.net
-[4]: /file/417776
-[5]: https://opensource.com/sites/default/files/uploads/pic1.png (Evil-Twin Framework Architecture)
-[6]: https://www.metasploit.com
-[7]: /file/417781
-[8]: https://opensource.com/sites/default/files/uploads/pic2.png (Scenario for capturing a WPA handshake after a de-authentication attack)
-[9]: https://en.wikipedia.org/wiki/Address_Resolution_Protocol
-[10]: /file/417786
-[11]: https://opensource.com/sites/default/files/uploads/pic3.png (Scenario for capturing a WPA handshake after a de-authentication attack)
-[12]: /file/417791
-[13]: https://opensource.com/sites/default/files/uploads/pic4.png (Scenario for capturing a WPA handshake after a de-authentication attack)
-[14]: https://github.com/Esser420/EvilTwinFramework
diff --git a/sources/tech/20190121 Akira- The Linux Design Tool We-ve Always Wanted.md b/sources/tech/20190121 Akira- The Linux Design Tool We-ve Always Wanted.md
deleted file mode 100644
index bd58eca5bf..0000000000
--- a/sources/tech/20190121 Akira- The Linux Design Tool We-ve Always Wanted.md
+++ /dev/null
@@ -1,92 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Akira: The Linux Design Tool We’ve Always Wanted?)
-[#]: via: (https://itsfoss.com/akira-design-tool)
-[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
-
-Akira: The Linux Design Tool We’ve Always Wanted?
-======
-
-Let’s make it clear, I am not a professional designer – but I’ve used certain tools on Windows (like Photoshop, Illustrator, etc.) and [Figma][1] (which is a browser-based interface design tool). I’m sure there are a lot more design tools available for Mac and Windows.
-
-Even on Linux, there is a limited number of dedicated [graphic design tools][2]. A few of these tools like [GIMP][3] and [Inkscape][4] are used by professionals as well. But most of them are not considered professional grade, unfortunately.
-
-Even if there are a couple more solutions – I’ve never come across a native Linux application that could replace [Sketch][5], Figma, or Adobe **** XD. Any professional designer would agree to that, isn’t it?
-
-### Is Akira going to replace Sketch, Figma, and Adobe XD on Linux?
-
-Well, in order to develop something that would replace those awesome proprietary tools – [Alessandro Castellani][6] – came up with a [Kickstarter campaign][7] by teaming up with a couple of experienced developers –
-[Alberto Fanjul][8], [Bilal Elmoussaoui][9], and [Felipe Escoto][10].
-
-So, yes, Akira is still pretty much just an idea- with a working prototype of its interface (as I observed in their [live stream session][11] via Kickstarter recently).
-
-### If it does not exist, why the Kickstarter campaign?
-
-![][12]
-
-The aim of the Kickstarter campaign is to gather funds in order to hire the developers and take a few months off to dedicate their time in order to make Akira possible.
-
-Nonetheless, if you want to support the project, you should know some details, right?
-
-Fret not, we asked a couple of questions in their livestream session – let’s get into it…
-
-### Akira: A few more details
-
-![Akira prototype interface][13]
-Image Credits: Kickstarter
-
-As the Kickstarter campaign describes:
-
-> The main purpose of Akira is to offer a fast and intuitive tool to **create Web and Mobile interfaces** , more like **Sketch** , **Figma** , or **Adobe XD** , with a completely native experience for Linux.
-
-They’ve also written a detailed description as to how the tool will be different from Inkscape, Glade, or QML Editor. Of course, if you want all the technical details, [Kickstarter][7] is the way to go. But, before that, let’s take a look at what they had to say when I asked some questions about Akira.
-
-Q: If you consider your project – similar to what Figma offers – why should one consider installing Akira instead of using the web-based tool? Is it just going to be a clone of those tools – offering a native Linux experience or is there something really interesting to encourage users to switch (except being an open source solution)?
-
-**Akira:** A native experience on Linux is always better and fast in comparison to a web-based electron app. Also, the hardware configuration matters if you choose to utilize Figma – but Akira will be light on system resource and you will still be able to do similar stuff without needing to go online.
-
-Q: Let’s assume that it becomes the open source solution that Linux users have been waiting for (with similar features offered by proprietary tools). What are your plans to sustain it? Do you plan to introduce any pricing plans – or rely on donations?
-
-**Akira** : The project will mostly rely on Donations (something like [Krita Foundation][14] could be an idea). But, there will be no “pro” pricing plans – it will be available for free and it will be an open source project.
-
-So, with the response I got, it definitely seems to be something promising that we should probably support.
-
-### Wrapping Up
-
-What do you think about Akira? Is it just going to remain a concept? Or do you hope to see it in action?
-
-Let us know your thoughts in the comments below.
-
-![][15]
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/akira-design-tool
-
-作者:[Ankush Das][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://itsfoss.com/author/ankush/
-[b]: https://github.com/lujun9972
-[1]: https://www.figma.com/
-[2]: https://itsfoss.com/best-linux-graphic-design-software/
-[3]: https://itsfoss.com/gimp-2-10-release/
-[4]: https://inkscape.org/
-[5]: https://www.sketchapp.com/
-[6]: https://github.com/Alecaddd
-[7]: https://www.kickstarter.com/projects/alecaddd/akira-the-linux-design-tool/description
-[8]: https://github.com/albfan
-[9]: https://github.com/bilelmoussaoui
-[10]: https://github.com/Philip-Scott
-[11]: https://live.kickstarter.com/alessandro-castellani/live-stream/the-current-state-of-akira
-[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/akira-design-tool-kickstarter.jpg?resize=800%2C451&ssl=1
-[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/akira-mockup.png?ssl=1
-[14]: https://krita.org/en/about/krita-foundation/
-[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/akira-design-tool-kickstarter.jpg?fit=812%2C458&ssl=1
diff --git a/sources/tech/20190121 Get started with TaskBoard, a lightweight kanban board.md b/sources/tech/20190121 Get started with TaskBoard, a lightweight kanban board.md
deleted file mode 100644
index e083d650e5..0000000000
--- a/sources/tech/20190121 Get started with TaskBoard, a lightweight kanban board.md
+++ /dev/null
@@ -1,59 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Get started with TaskBoard, a lightweight kanban board)
-[#]: via: (https://opensource.com/article/19/1/productivity-tool-taskboard)
-[#]: author: (Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
-
-Get started with TaskBoard, a lightweight kanban board
-======
-Check out the ninth tool in our series on open source tools that will make you more productive in 2019.
-
-
-
-There seems to be a mad rush at the beginning of every year to find ways to be more productive. New Year's resolutions, the itch to start the year off right, and of course, an "out with the old, in with the new" attitude all contribute to this. And the usual round of recommendations is heavily biased towards closed source and proprietary software. It doesn't have to be that way.
-
-Here's the ninth of my picks for 19 new (or new-to-you) open source tools to help you be more productive in 2019.
-
-### TaskBoard
-
-As I wrote in the [second article][1] in this series, [kanban boards][2] are pretty popular these days. And not all kanban boards are created equal. [TaskBoard][3] is a PHP application that is easy to set up on an existing web server and has a set of functions that make it easy to use and manage.
-
-
-
-[Installation][4] is as simple as unzipping the files on your web server, running a script or two, and making sure the correct directories are accessible. The first time you start it up, you're presented with a login form, and then it's time to start adding users and making boards. Board creation options include adding the columns you want to use and setting the default color of the cards. You can also assign users to boards so everyone sees only the boards they need to see.
-
-User management is lightweight, and all accounts are local to the server. You can set a default board for everyone on the server, and users can set their own default boards, too. These options can be useful when someone works on one board more than others.
-
-
-
-TaskBoard also allows you to create automatic actions, which are actions taken upon changes to user assignment, columns, or card categories. Although TaskBoard is not as powerful as some other kanban apps, you can set up automatic actions to make cards more visible for board users, clear due dates, and auto-assign new cards to people as needed. For example, in the screenshot below, if a card is assigned to the "admin" user, its color is changed to red, and when a card is assigned to my user, its color is changed to teal. I've also added an action to clear an item's due date if it's added to the "To-Do" column and to auto-assign cards to my user when that happens.
-
-
-
-The cards are very straightforward. While they don't have a start date, they do have end dates and a points field. Points can be used for estimating the time needed, effort required, or just general priority. Using points is optional, but if you are using TaskBoard for scrum planning or other agile techniques, it is a really handy feature. You can also filter the view by users and categories. This can be helpful on a team with multiple work streams going on, as it allows a team lead or manager to get status information about progress or a person's workload.
-
-
-
-If you need a reasonably lightweight kanban board, check out TaskBoard. It installs quickly, has some nice features, and is very, very easy to use. It's also flexible enough to be used for development teams, personal task tracking, and a whole lot more.
-
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/productivity-tool-taskboard
-
-作者:[Kevin Sonney][a]
-选题:[lujun9972][b]
-译者:[译者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/ksonney (Kevin Sonney)
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/article/19/1/productivity-tool-wekan
-[2]: https://en.wikipedia.org/wiki/Kanban
-[3]: https://taskboard.matthewross.me/
-[4]: https://taskboard.matthewross.me/docs/
diff --git a/sources/tech/20190122 Get started with Go For It, a flexible to-do list application.md b/sources/tech/20190122 Get started with Go For It, a flexible to-do list application.md
deleted file mode 100644
index 56dde41884..0000000000
--- a/sources/tech/20190122 Get started with Go For It, a flexible to-do list application.md
+++ /dev/null
@@ -1,60 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Get started with Go For It, a flexible to-do list application)
-[#]: via: (https://opensource.com/article/19/1/productivity-tool-go-for-it)
-[#]: author: (Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
-
-Get started with Go For It, a flexible to-do list application
-======
-Go For It, the tenth in our series on open source tools that will make you more productive in 2019, builds on the Todo.txt system to help you get more things done.
-
-
-There seems to be a mad rush at the beginning of every year to find ways to be more productive. New Year's resolutions, the itch to start the year off right, and of course, an "out with the old, in with the new" attitude all contribute to this. And the usual round of recommendations is heavily biased towards closed source and proprietary software. It doesn't have to be that way.
-
-Here's the tenth of my picks for 19 new (or new-to-you) open source tools to help you be more productive in 2019.
-
-### Go For It
-
-Sometimes what a person needs to be productive isn't a fancy kanban board or a set of notes, but a simple, straightforward to-do list. Something that is as basic as "add item to list, check it off when done." And for that, the [plain-text Todo.txt system][1] is possibly one of the easiest to use, and it's supported on almost every system out there.
-
-
-
-[Go For It][2] is a simple, easy-to-use graphical interface for Todo.txt. It can be used with an existing file, if you are already using Todo.txt, and will create both a to-do and a done file if you aren't. It allows drag-and-drop ordering of tasks, allowing users to organize to-do items in the order they want to execute them. It also supports priorities, projects, and contexts, as outlined in the [Todo.txt format guidelines][3]. And, it can filter tasks by context or project simply by clicking on the project or context in the task list.
-
-
-
-At first, Go For It may look the same as just about any other Todo.txt program, but looks can be deceiving. The real feature that sets Go For It apart is that it includes a built-in [Pomodoro Technique][4] timer. Select the task you want to complete, switch to the Timer tab, and click Start. When the task is done, simply click Done, and it will automatically reset the timer and pick the next task on the list. You can pause and restart the timer as well as click Skip to jump to the next task (or break). It provides a warning when 60 seconds are left for the current task. The default time for tasks is set at 25 minutes, and the default time for breaks is set at five minutes. You can adjust this in the Settings screen, as well as the location of the directory containing your Todo.txt and done.txt files.
-
-
-
-Go For It's third tab, Done, allows you to look at the tasks you've completed and clean them out when you want. Being able to look at what you've accomplished can be very motivating and a good way to get a feel for where you are in a longer process.
-
-
-
-It also has all of Todo.txt's other advantages. Go For It's list is accessible by other programs that use the same format, including [Todo.txt's original command-line tool][5] and any [add-ons][6] you've installed.
-
-Go For It seeks to be a simple tool to help manage your to-do list and get those items done. If you already use Todo.txt, Go For It is a fantastic addition to your toolkit, and if you don't, it's a really good way to start using one of the simplest and most flexible systems available.
-
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/productivity-tool-go-for-it
-
-作者:[Kevin Sonney][a]
-选题:[lujun9972][b]
-译者:[译者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/ksonney (Kevin Sonney)
-[b]: https://github.com/lujun9972
-[1]: http://todotxt.org/
-[2]: http://manuel-kehl.de/projects/go-for-it/
-[3]: https://github.com/todotxt/todo.txt
-[4]: https://en.wikipedia.org/wiki/Pomodoro_Technique
-[5]: https://github.com/todotxt/todo.txt-cli
-[6]: https://github.com/todotxt/todo.txt-cli/wiki/Todo.sh-Add-on-Directory
diff --git a/sources/tech/20190122 How To Copy A File-Folder From A Local System To Remote System In Linux.md b/sources/tech/20190122 How To Copy A File-Folder From A Local System To Remote System In Linux.md
deleted file mode 100644
index 6de6cd173f..0000000000
--- a/sources/tech/20190122 How To Copy A File-Folder From A Local System To Remote System In Linux.md
+++ /dev/null
@@ -1,398 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How To Copy A File/Folder From A Local System To Remote System In Linux?)
-[#]: via: (https://www.2daygeek.com/linux-scp-rsync-pscp-command-copy-files-folders-in-multiple-servers-using-shell-script/)
-[#]: author: (Prakash Subramanian https://www.2daygeek.com/author/prakash/)
-
-How To Copy A File/Folder From A Local System To Remote System In Linux?
-======
-
-Copying a file from one server to another server or local to remote is one of the routine task for Linux administrator.
-
-If anyone says no, i won’t accept because this is one of the regular activity wherever you go.
-
-It can be done in many ways and we are trying to cover all the possible options.
-
-You can choose the one which you would prefer. Also, check other commands as well that may help you for some other purpose.
-
-I have tested all these commands and script in my test environment so, you can use this for your routine work.
-
-By default every one go with SCP because it’s one of the native command that everyone use for file copy. But commands which is listed in this article are be smart so, give a try if you would like to try new things.
-
-This can be done in below four ways easily.
-
- * **`SCP:`** scp copies files between hosts on a network. It uses ssh for data transfer, and uses the same authentication and provides the same security as ssh.
- * **`RSYNC:`** rsync is a fast and extraordinarily versatile file copying tool. It can copy locally, to/from another host over any remote shell, or to/from a remote rsync daemon.
- * **`PSCP:`** pscp is a program for copying files in parallel to a number of hosts. It provides features such as passing a password to scp, saving output to files, and timing out.
- * **`PRSYNC:`** prsync is a program for copying files in parallel to a number of hosts. It provides features such as passing a password to ssh, saving output to files, and timing out.
-
-
-
-### Method-1: Copy Files/Folders From A Local System To Remote System In Linux Using SCP Command?
-
-scp command allow us to copy files/folders from a local system to remote system.
-
-We are going to copy the `output.txt` file from my local system to `2g.CentOS.com` remote system under `/opt/backup` directory.
-
-```
-# scp output.txt root@2g.CentOS.com:/opt/backup
-
-output.txt 100% 2468 2.4KB/s 00:00
-```
-
-We are going to copy two files `output.txt` and `passwd-up.sh` files from my local system to `2g.CentOS.com` remote system under `/opt/backup` directory.
-
-```
-# scp output.txt passwd-up.sh root@2g.CentOS.com:/opt/backup
-
-output.txt 100% 2468 2.4KB/s 00:00
-passwd-up.sh 100% 877 0.9KB/s 00:00
-```
-
-We are going to copy the `shell-script` directory from my local system to `2g.CentOS.com` remote system under `/opt/backup` directory.
-
-This will copy the `shell-script` directory and associated files under `/opt/backup` directory.
-
-```
-# scp -r /home/daygeek/2g/shell-script/ [email protected]:/opt/backup/
-
-output.txt 100% 2468 2.4KB/s 00:00
-ovh.sh 100% 76 0.1KB/s 00:00
-passwd-up.sh 100% 877 0.9KB/s 00:00
-passwd-up1.sh 100% 7 0.0KB/s 00:00
-server-list.txt 100% 23 0.0KB/s 00:00
-```
-
-### Method-2: Copy Files/Folders From A Local System To Multiple Remote System In Linux Using Shell Script with scp Command?
-
-If you would like to copy the same file into multiple remote servers then create the following small shell script to achieve this.
-
-To do so, get the servers list and add those into `server-list.txt` file. Make sure you have to update the servers list into `server-list.txt` file. Each server should be in separate line.
-
-Finally mention the file location which you want to copy like below.
-
-```
-# file-copy.sh
-
-#!/bin/sh
-for server in `more server-list.txt`
-do
- scp /home/daygeek/2g/shell-script/output.txt [email protected]$server:/opt/backup
-done
-```
-
-Once you done, set an executable permission to password-update.sh file.
-
-```
-# chmod +x file-copy.sh
-```
-
-Finally run the script to achieve this.
-
-```
-# ./file-copy.sh
-
-output.txt 100% 2468 2.4KB/s 00:00
-output.txt 100% 2468 2.4KB/s 00:00
-```
-
-Use the following script to copy the multiple files into multiple remote servers.
-
-```
-# file-copy.sh
-
-#!/bin/sh
-for server in `more server-list.txt`
-do
- scp /home/daygeek/2g/shell-script/output.txt passwd-up.sh [email protected]$server:/opt/backup
-done
-```
-
-The below output shows all the files twice as this copied into two servers.
-
-```
-# ./file-cp.sh
-
-output.txt 100% 2468 2.4KB/s 00:00
-passwd-up.sh 100% 877 0.9KB/s 00:00
-output.txt 100% 2468 2.4KB/s 00:00
-passwd-up.sh 100% 877 0.9KB/s 00:00
-```
-
-Use the following script to copy the directory recursively into multiple remote servers.
-
-```
-# file-copy.sh
-
-#!/bin/sh
-for server in `more server-list.txt`
-do
- scp -r /home/daygeek/2g/shell-script/ [email protected]$server:/opt/backup
-done
-```
-
-Output for the above script.
-
-```
-# ./file-cp.sh
-
-output.txt 100% 2468 2.4KB/s 00:00
-ovh.sh 100% 76 0.1KB/s 00:00
-passwd-up.sh 100% 877 0.9KB/s 00:00
-passwd-up1.sh 100% 7 0.0KB/s 00:00
-server-list.txt 100% 23 0.0KB/s 00:00
-
-output.txt 100% 2468 2.4KB/s 00:00
-ovh.sh 100% 76 0.1KB/s 00:00
-passwd-up.sh 100% 877 0.9KB/s 00:00
-passwd-up1.sh 100% 7 0.0KB/s 00:00
-server-list.txt 100% 23 0.0KB/s 00:00
-```
-
-### Method-3: Copy Files/Folders From A Local System To Multiple Remote System In Linux Using PSCP Command?
-
-pscp command directly allow us to perform the copy to multiple remote servers.
-
-Use the following pscp command to copy a single file to remote server.
-
-```
-# pscp.pssh -H 2g.CentOS.com /home/daygeek/2g/shell-script/output.txt /opt/backup
-
-[1] 18:46:11 [SUCCESS] 2g.CentOS.com
-```
-
-Use the following pscp command to copy a multiple files to remote server.
-
-```
-# pscp.pssh -H 2g.CentOS.com /home/daygeek/2g/shell-script/output.txt ovh.sh /opt/backup
-
-[1] 18:47:48 [SUCCESS] 2g.CentOS.com
-```
-
-Use the following pscp command to copy a directory recursively to remote server.
-
-```
-# pscp.pssh -H 2g.CentOS.com -r /home/daygeek/2g/shell-script/ /opt/backup
-
-[1] 18:48:46 [SUCCESS] 2g.CentOS.com
-```
-
-Use the following pscp command to copy a single file to multiple remote servers.
-
-```
-# pscp.pssh -h server-list.txt /home/daygeek/2g/shell-script/output.txt /opt/backup
-
-[1] 18:49:48 [SUCCESS] 2g.CentOS.com
-[2] 18:49:48 [SUCCESS] 2g.Debian.com
-```
-
-Use the following pscp command to copy a multiple files to multiple remote servers.
-
-```
-# pscp.pssh -h server-list.txt /home/daygeek/2g/shell-script/output.txt passwd-up.sh /opt/backup
-
-[1] 18:50:30 [SUCCESS] 2g.Debian.com
-[2] 18:50:30 [SUCCESS] 2g.CentOS.com
-```
-
-Use the following pscp command to copy a directory recursively to multiple remote servers.
-
-```
-# pscp.pssh -h server-list.txt -r /home/daygeek/2g/shell-script/ /opt/backup
-
-[1] 18:51:31 [SUCCESS] 2g.Debian.com
-[2] 18:51:31 [SUCCESS] 2g.CentOS.com
-```
-
-### Method-4: Copy Files/Folders From A Local System To Multiple Remote System In Linux Using rsync Command?
-
-Rsync is a fast and extraordinarily versatile file copying tool. It can copy locally, to/from another host over any remote shell, or to/from a remote rsync daemon.
-
-Use the following rsync command to copy a single file to remote server.
-
-```
-# rsync -avz /home/daygeek/2g/shell-script/output.txt [email protected]:/opt/backup
-
-sending incremental file list
-output.txt
-
-sent 598 bytes received 31 bytes 1258.00 bytes/sec
-total size is 2468 speedup is 3.92
-```
-
-Use the following pscp command to copy a multiple files to remote server.
-
-```
-# rsync -avz /home/daygeek/2g/shell-script/output.txt passwd-up.sh root@2g.CentOS.com:/opt/backup
-
-sending incremental file list
-output.txt
-passwd-up.sh
-
-sent 737 bytes received 50 bytes 1574.00 bytes/sec
-total size is 2537 speedup is 3.22
-```
-
-Use the following rsync command to copy a single file to remote server overh ssh.
-
-```
-# rsync -avzhe ssh /home/daygeek/2g/shell-script/output.txt root@2g.CentOS.com:/opt/backup
-
-sending incremental file list
-output.txt
-
-sent 598 bytes received 31 bytes 419.33 bytes/sec
-total size is 2.47K speedup is 3.92
-```
-
-Use the following pscp command to copy a directory recursively to remote server over ssh. This will copy only files not the base directory.
-
-```
-# rsync -avzhe ssh /home/daygeek/2g/shell-script/ root@2g.CentOS.com:/opt/backup
-
-sending incremental file list
-./
-output.txt
-ovh.sh
-passwd-up.sh
-passwd-up1.sh
-server-list.txt
-
-sent 3.85K bytes received 281 bytes 8.26K bytes/sec
-total size is 9.12K speedup is 2.21
-```
-
-### Method-5: Copy Files/Folders From A Local System To Multiple Remote System In Linux Using Shell Script with rsync Command?
-
-If you would like to copy the same file into multiple remote servers then create the following small shell script to achieve this.
-
-```
-# file-copy.sh
-
-#!/bin/sh
-for server in `more server-list.txt`
-do
- rsync -avzhe ssh /home/daygeek/2g/shell-script/ root@2g.CentOS.com$server:/opt/backup
-done
-```
-
-Output for the above shell script.
-
-```
-# ./file-copy.sh
-
-sending incremental file list
-./
-output.txt
-ovh.sh
-passwd-up.sh
-passwd-up1.sh
-server-list.txt
-
-sent 3.86K bytes received 281 bytes 8.28K bytes/sec
-total size is 9.13K speedup is 2.21
-
-sending incremental file list
-./
-output.txt
-ovh.sh
-passwd-up.sh
-passwd-up1.sh
-server-list.txt
-
-sent 3.86K bytes received 281 bytes 2.76K bytes/sec
-total size is 9.13K speedup is 2.21
-```
-
-### Method-6: Copy Files/Folders From A Local System To Multiple Remote System In Linux Using Shell Script with scp Command?
-
-In the above two shell script, we need to mention the file and folder location as a prerequiesties but here i did a small modification that allow the script to get a file or folder as a input. It could be very useful when you want to perform the copy multiple times in a day.
-
-```
-# file-copy.sh
-
-#!/bin/sh
-for server in `more server-list.txt`
-do
-scp -r $1 root@2g.CentOS.com$server:/opt/backup
-done
-```
-
-Run the shell script and give the file name as a input.
-
-```
-# ./file-copy.sh output1.txt
-
-output1.txt 100% 3558 3.5KB/s 00:00
-output1.txt 100% 3558 3.5KB/s 00:00
-```
-
-### Method-7: Copy Files/Folders From A Local System To Multiple Remote System In Linux With Non-Standard Port Number?
-
-Use the below shell script to copy a file or folder if you are using Non-Standard port.
-
-If you are using `Non-Standard` port, make sure you have to mention the port number as follow for SCP command.
-
-```
-# file-copy-scp.sh
-
-#!/bin/sh
-for server in `more server-list.txt`
-do
-scp -P 2222 -r $1 root@2g.CentOS.com$server:/opt/backup
-done
-```
-
-Run the shell script and give the file name as a input.
-
-```
-# ./file-copy.sh ovh.sh
-
-ovh.sh 100% 3558 3.5KB/s 00:00
-ovh.sh 100% 3558 3.5KB/s 00:00
-```
-
-If you are using `Non-Standard` port, make sure you have to mention the port number as follow for rsync command.
-
-```
-# file-copy-rsync.sh
-
-#!/bin/sh
-for server in `more server-list.txt`
-do
-rsync -avzhe 'ssh -p 2222' $1 root@2g.CentOS.com$server:/opt/backup
-done
-```
-
-Run the shell script and give the file name as a input.
-
-```
-# ./file-copy-rsync.sh passwd-up.sh
-sending incremental file list
-passwd-up.sh
-
-sent 238 bytes received 35 bytes 26.00 bytes/sec
-total size is 159 speedup is 0.58
-
-sending incremental file list
-passwd-up.sh
-
-sent 238 bytes received 35 bytes 26.00 bytes/sec
-total size is 159 speedup is 0.58
-```
---------------------------------------------------------------------------------
-
-via: https://www.2daygeek.com/linux-scp-rsync-pscp-command-copy-files-folders-in-multiple-servers-using-shell-script/
-
-作者:[Prakash Subramanian][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.2daygeek.com/author/prakash/
-[b]: https://github.com/lujun9972
diff --git a/sources/tech/20190123 Mind map yourself using FreeMind and Fedora.md b/sources/tech/20190123 Mind map yourself using FreeMind and Fedora.md
deleted file mode 100644
index 146f95752a..0000000000
--- a/sources/tech/20190123 Mind map yourself using FreeMind and Fedora.md
+++ /dev/null
@@ -1,81 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Mind map yourself using FreeMind and Fedora)
-[#]: via: (https://fedoramagazine.org/mind-map-yourself-using-freemind-and-fedora/)
-[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/)
-
-Mind map yourself using FreeMind and Fedora
-======
-
-
-A mind map of yourself sounds a little far-fetched at first. Is this process about neural pathways? Or telepathic communication? Not at all. Instead, a mind map of yourself is a way to describe yourself to others visually. It also shows connections among the characteristics you use to describe yourself. It’s a useful way to share information with others in a clever but also controllable way. You can use any mind map application for this purpose. This article shows you how to get started using [FreeMind][1], available in Fedora.
-
-### Get the application
-
-The FreeMind application has been around a while. While the UI is a bit dated and could use a refresh, it’s a powerful app that offers many options for building mind maps. And of course it’s 100% open source. There are other mind mapping apps available for Fedora and Linux users, as well. Check out [this previous article that covers several mind map options][2].
-
-Install FreeMind from the Fedora repositories using the Software app if you’re running Fedora Workstation. Or use this [sudo][3] command in a terminal:
-
-```
-$ sudo dnf install freemind
-```
-
-You can launch the app from the GNOME Shell Overview in Fedora Workstation. Or use the application start service your desktop environment provides. FreeMind shows you a new, blank map by default:
-
-![][4]
-FreeMind initial (blank) mind map
-
-A map consists of linked items or descriptions — nodes. When you think of something related to a node you want to capture, simply create a new node connected to it.
-
-### Mapping yourself
-
-Click in the initial node. Replace it with your name by editing the text and hitting **Enter**. You’ve just started your mind map.
-
-What would you think of if you had to fully describe yourself to someone? There are probably many things to cover. How do you spend your time? What do you enjoy? What do you dislike? What do you value? Do you have a family? All of this can be captured in nodes.
-
-To add a node connection, select the existing node, and hit **Insert** , or use the “light bulb” icon for a new child node. To add another node at the same level as the new child, use **Enter**.
-
-Don’t worry if you make a mistake. You can use the **Delete** key to remove an unwanted node. There’s no rules about content. Short nodes are best, though. They allow your mind to move quickly when creating the map. Concise nodes also let viewers scan and understand the map easily later.
-
-This example uses nodes to explore each of these major categories:
-
-![][5]
-Personal mind map, first level
-
-You could do another round of iteration for each of these areas. Let your mind freely connect ideas to generate the map. Don’t worry about “getting it right.” It’s better to get everything out of your head and onto the display. Here’s what a next-level map might look like.
-
-![][6]
-Personal mind map, second level
-
-You could expand on any of these nodes in the same way. Notice how much information you can quickly understand about John Q. Public in the example.
-
-### How to use your personal mind map
-
-This is a great way to have team or project members introduce themselves to each other. You can apply all sorts of formatting and color to the map to give it personality. These are fun to do on paper, of course. But having one on your Fedora system means you can always fix mistakes, or even make changes as you change.
-
-Have fun exploring your personal mind map!
-
-
-
---------------------------------------------------------------------------------
-
-via: https://fedoramagazine.org/mind-map-yourself-using-freemind-and-fedora/
-
-作者:[Paul W. Frields][a]
-选题:[lujun9972][b]
-译者:[译者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/pfrields/
-[b]: https://github.com/lujun9972
-[1]: http://freemind.sourceforge.net/wiki/index.php/Main_Page
-[2]: https://fedoramagazine.org/three-mind-mapping-tools-fedora/
-[3]: https://fedoramagazine.org/howto-use-sudo/
-[4]: https://fedoramagazine.org/wp-content/uploads/2019/01/Screenshot-from-2019-01-19-15-17-04-1024x736.png
-[5]: https://fedoramagazine.org/wp-content/uploads/2019/01/Screenshot-from-2019-01-19-15-32-38-1024x736.png
-[6]: https://fedoramagazine.org/wp-content/uploads/2019/01/Screenshot-from-2019-01-19-15-38-00-1024x736.png
diff --git a/sources/tech/20190124 Get started with LogicalDOC, an open source document management system.md b/sources/tech/20190124 Get started with LogicalDOC, an open source document management system.md
deleted file mode 100644
index 21687c0ce3..0000000000
--- a/sources/tech/20190124 Get started with LogicalDOC, an open source document management system.md
+++ /dev/null
@@ -1,62 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Get started with LogicalDOC, an open source document management system)
-[#]: via: (https://opensource.com/article/19/1/productivity-tool-logicaldoc)
-[#]: author: (Kevin Sonney https://opensource.com/users/ksonney)
-
-Get started with LogicalDOC, an open source document management system
-======
-Keep better track of document versions with LogicalDOC, the 12th in our series on open source tools that will make you more productive in 2019.
-
-
-
-There seems to be a mad rush at the beginning of every year to find ways to be more productive. New Year's resolutions, the itch to start the year off right, and of course, an "out with the old, in with the new" attitude all contribute to this. And the usual round of recommendations is heavily biased towards closed source and proprietary software. It doesn't have to be that way.
-
-Here's the 12th of my picks for 19 new (or new-to-you) open source tools to help you be more productive in 2019.
-
-### LogicalDOC
-
-Part of being productive is being able to find what you need when you need it. We've all seen directories full of similar files with similar names, a result of renaming them every time a document changes to keep track of all the versions. For example, my wife is a writer, and she often saves document revisions with new names before she sends them to reviewers.
-
-
-
-A coder's natural solution to this problem—Git or another version control tool—won't work for document creators because the systems used for code often don't play nice with the formats used by commercial text editors. And before someone says, "just change formats," [that isn't an option for everyone][1]. Also, many version control tools are not very friendly for the less technically inclined. In large organizations, there are tools to solve this problem, but they also require the resources of a large organization to run, manage, and support them.
-
-
-
-[LogicalDOC CE][2] is an open source document management system built to solve this problem. It allows users to check in, check out, version, search, and lock document files and keeps a history of versions, similar to the version control tools used by coders.
-
-LogicalDOC can be [installed][3] on Linux, MacOS, and Windows using a Java-based installer. During installation, you'll be prompted for details on the database where its data will be stored and have an option for a local-only file store. You'll get the URL and a default username and password to access the server as well as an option to save a script to automate future installations.
-
-After you log in, LogicalDOC's default screen lists the documents you have tagged, checked out, and any recent notes on them. Switching to the Documents tab will show the files you have access to. You can upload documents by selecting a file through the interface or using drag and drop. If you upload a ZIP file, LogicalDOC will expand it and add its individual files to the repository.
-
-
-
-Right-clicking on a file will bring up a menu of options to check out files, lock files against changes, and do a whole host of other things. Checking out a file downloads it to your local machine where it can be edited. A checked-out file cannot be modified by anyone else until it's checked back in. When the file is checked back in (using the same menu), the user can add tags to the version and is required to comment on what was done to it.
-
-
-
-Going back and looking at earlier versions is as easy as downloading them from the Versions page. There are also import and export options for some third-party services, with [Dropbox][4] support built-in.
-
-Document management is not just for big companies that can afford expensive solutions. LogicalDOC helps you keep track of the documents you're using with a revision history and a safe repository for documents that are otherwise difficult to manage.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/productivity-tool-logicaldoc
-
-作者:[Kevin Sonney][a]
-选题:[lujun9972][b]
-译者:[译者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/ksonney (Kevin Sonney)
-[b]: https://github.com/lujun9972
-[1]: http://www.antipope.org/charlie/blog-static/2013/10/why-microsoft-word-must-die.html
-[2]: https://www.logicaldoc.com/download-logicaldoc-community
-[3]: https://docs.logicaldoc.com/en/installation
-[4]: https://dropbox.com
diff --git a/sources/tech/20190124 ODrive (Open Drive) - Google Drive GUI Client For Linux.md b/sources/tech/20190124 ODrive (Open Drive) - Google Drive GUI Client For Linux.md
deleted file mode 100644
index 71a91ec3d8..0000000000
--- a/sources/tech/20190124 ODrive (Open Drive) - Google Drive GUI Client For Linux.md
+++ /dev/null
@@ -1,127 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (ODrive (Open Drive) – Google Drive GUI Client For Linux)
-[#]: via: (https://www.2daygeek.com/odrive-open-drive-google-drive-gui-client-for-linux/)
-[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
-
-ODrive (Open Drive) – Google Drive GUI Client For Linux
-======
-
-This we had discussed in so many times. However, i will give a small introduction about it.
-
-As of now there is no official Google Drive Client for Linux and we need to use unofficial clients.
-
-There are many applications available in Linux for Google Drive integration.
-
-Each application has came out with set of features.
-
-We had written few articles about this in our website in the past.
-
-Those are **[DriveSync][1]** , **[Google Drive Ocamlfuse Client][2]** and **[Mount Google Drive in Linux Using Nautilus File Manager][3]**.
-
-Today also we are going to discuss about the same topic and the utility name is ODrive.
-
-### What’s ODrive?
-
-ODrive stands for Open Drive. It’s a GUI client for Google Drive which was written in electron framework.
-
-It’s simple GUI which allow users to integrate the Google Drive with few steps.
-
-### How To Install & Setup ODrive on Linux?
-
-Since the developer is offering the AppImage package and there is no difficulty for installing the ODrive on Linux.
-
-Simple download the latest ODrive AppImage package from developer github page using **wget Command**.
-
-```
-$ wget https://github.com/liberodark/ODrive/releases/download/0.1.3/odrive-0.1.3-x86_64.AppImage
-```
-
-You have to set executable file permission to the ODrive AppImage file.
-
-```
-$ chmod +x odrive-0.1.3-x86_64.AppImage
-```
-
-Simple run the following ODrive AppImage file to launch the ODrive GUI for further setup.
-
-```
-$ ./odrive-0.1.3-x86_64.AppImage
-```
-
-You might get the same window like below when you ran the above command. Just hit the **`Next`** button for further setup.
-![][5]
-
-Click **`Connect`** link to add a Google drive account.
-![][6]
-
-Enter your email id which you want to setup a Google Drive account.
-![][7]
-
-Enter your password for the given email id.
-![][8]
-
-Allow ODrive (Open Drive) to access your Google account.
-![][9]
-
-By default, it will choose the folder location. You can change if you want to use the specific one.
-![][10]
-
-Finally hit **`Synchronize`** button to start download the files from Google Drive to your local system.
-![][11]
-
-Synchronizing is in progress.
-![][12]
-
-Once synchronizing is completed. It will show you all files downloaded.
-Once synchronizing is completed. It’s shows you that all the files has been downloaded.
-![][13]
-
-I have seen all the files were downloaded in the mentioned directory.
-![][14]
-
-If you want to sync any new files from local system to Google Drive. Just start the `ODrive` from the application menu but it won’t actual launch the application. But it will be running in the background that we can able to see by using the ps command.
-
-```
-$ ps -df | grep odrive
-```
-
-![][15]
-
-It will automatically sync once you add a new file into the google drive folder. The same has been checked through notification menu. Yes, i can see one file was synced to Google Drive.
-![][16]
-
-GUI is not loading after sync, and i’m not sure this functionality. I will check with developer and will add update based on his input.
-
---------------------------------------------------------------------------------
-
-via: https://www.2daygeek.com/odrive-open-drive-google-drive-gui-client-for-linux/
-
-作者:[Magesh Maruthamuthu][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.2daygeek.com/author/magesh/
-[b]: https://github.com/lujun9972
-[1]: https://www.2daygeek.com/drivesync-google-drive-sync-client-for-linux/
-[2]: https://www.2daygeek.com/mount-access-google-drive-on-linux-with-google-drive-ocamlfuse-client/
-[3]: https://www.2daygeek.com/mount-access-setup-google-drive-in-linux/
-[4]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
-[5]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-1.png
-[6]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-2.png
-[7]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-3.png
-[8]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-4.png
-[9]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-5.png
-[10]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-6.png
-[11]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-7.png
-[12]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-8a.png
-[13]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-9.png
-[14]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-11.png
-[15]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-9b.png
-[16]: https://www.2daygeek.com/wp-content/uploads/2019/01/odrive-open-drive-google-drive-gui-client-for-linux-10.png
diff --git a/sources/tech/20190124 What does DevOps mean to you.md b/sources/tech/20190124 What does DevOps mean to you.md
index c62f0f83ba..8b4d3ab33a 100644
--- a/sources/tech/20190124 What does DevOps mean to you.md
+++ b/sources/tech/20190124 What does DevOps mean to you.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (MZqk)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20190125 PyGame Zero- Games without boilerplate.md b/sources/tech/20190125 PyGame Zero- Games without boilerplate.md
deleted file mode 100644
index f60c2b3407..0000000000
--- a/sources/tech/20190125 PyGame Zero- Games without boilerplate.md
+++ /dev/null
@@ -1,99 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (xiqingongzi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (PyGame Zero: Games without boilerplate)
-[#]: via: (https://opensource.com/article/19/1/pygame-zero)
-[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
-
-PyGame Zero: Games without boilerplate
-======
-Say goodbye to boring boilerplate in your game development with PyGame Zero.
-
-
-Python is a good beginner programming language. And games are a good beginner project: they are visual, self-motivating, and fun to show off to friends and family. However, the most common library to write games in Python, [PyGame][1], can be frustrating for beginners because forgetting seemingly small details can easily lead to nothing rendering.
-
-Until people understand why all the parts are there, they treat many of them as "mindless boilerplate"—magic paragraphs that need to be copied and pasted into their program to make it work.
-
-[PyGame Zero][2] is intended to bridge that gap by putting a layer of abstraction over PyGame so it requires literally no boilerplate.
-
-When we say literally, we mean it.
-
-This is a valid PyGame Zero file:
-
-```
-# This comment is here for clarity reasons
-```
-
-We can run put it in a **game.py** file and run:
-
-```
-$ pgzrun game.py
-```
-
-This will show a window and run a game loop that can be shut down by closing the window or interrupting the program with **CTRL-C**.
-
-This will, sadly, be a boring game. Nothing happens.
-
-To make it slightly more interesting, we can draw a different background:
-
-```
-def draw():
- screen.fill((255, 0, 0))
-```
-
-This will make the background red instead of black. But it is still a boring game. Nothing is happening. We can make it slightly more interesting:
-
-```
-colors = [0, 0, 0]
-
-def draw():
- screen.fill(tuple(colors))
-
-def update():
- colors[0] = (colors[0] + 1) % 256
-```
-
-This will make a window that starts black, becomes brighter and brighter red, then goes back to black, over and over again.
-
-The **update** function updates parameters, while the **draw** function renders the game based on these parameters.
-
-However, there is no way for the player to interact with the game! Let's try something else:
-
-```
-colors = [0, 0, 0]
-
-def draw():
- screen.fill(tuple(colors))
-
-def update():
- colors[0] = (colors[0] + 1) % 256
-
-def on_key_down(key, mod, unicode):
- colors[1] = (colors[1] + 1) % 256
-```
-
-Now pressing keys on the keyboard will increase the "greenness."
-
-These comprise the three important parts of a game loop: respond to user input, update parameters, and re-render the screen.
-
-PyGame Zero offers much more, including functions for drawing sprites and playing sound clips.
-
-Try it out and see what type of game you can come up with!
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/pygame-zero
-
-作者:[Moshe Zadka][a]
-选题:[lujun9972][b]
-译者:[xiqingongzi](https://github.com/xiqingongzi)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/moshez
-[b]: https://github.com/lujun9972
-[1]: https://www.pygame.org/news
-[2]: https://pygame-zero.readthedocs.io/en/stable/
diff --git a/sources/tech/20190125 Top 5 Linux Distributions for Development in 2019.md b/sources/tech/20190125 Top 5 Linux Distributions for Development in 2019.md
deleted file mode 100644
index b3e2de22ba..0000000000
--- a/sources/tech/20190125 Top 5 Linux Distributions for Development in 2019.md
+++ /dev/null
@@ -1,161 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Top 5 Linux Distributions for Development in 2019)
-[#]: via: (https://www.linux.com/blog/2019/1/top-5-linux-distributions-development-2019)
-[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
-
-Top 5 Linux Distributions for Development in 2019
-======
-
-
-
-One of the most popular tasks undertaken on Linux is development. With good reason: Businesses rely on Linux. Without Linux, technology simply wouldn’t meet the demands of today’s ever-evolving world. Because of that, developers are constantly working to improve the environments with which they work. One way to manage such improvements is to have the right platform to start with. Thankfully, this is Linux, so you always have a plethora of choices.
-
-But sometimes, too many choices can be a problem in and of itself. Which distribution is right for your development needs? That, of course, depends on what you’re developing, but certain distributions that just make sense to use as a foundation for your task. I’ll highlight five distributions I consider the best for developers in 2019.
-
-### Ubuntu
-
-Let’s not mince words here. Although the Linux Mint faithful are an incredibly loyal group (with good reason, their distro of choice is fantastic), Ubuntu Linux gets the nod here. Why? Because, thanks to the likes of [AWS][1], Ubuntu is one of the most deployed server operating systems. That means developing on a Ubuntu desktop distribution makes for a much easier translation to Ubuntu Server. And because Ubuntu makes it incredibly easy to develop for, work with, and deploy containers, it makes perfect sense that you’d want to work with this platform. Couple that with Ubuntu’s inclusion of Snap Packages, and Canonical's operating system gets yet another boost in popularity.
-
-But it’s not just about what you can do with Ubuntu, it’s how easily you can do it. For nearly every task, Ubuntu is an incredibly easy distribution to use. And because Ubuntu is so popular, chances are every tool and IDE you want to work with can be easily installed from the Ubuntu Software GUI (Figure 1).
-
-![Ubuntu][3]
-
-Figure 1: Developer tools found in the Ubuntu Software tool.
-
-[Used with permission][4]
-
-If you’re looking for ease of use, simplicity of migration, and plenty of available tools, you cannot go wrong with Ubuntu as a development platform.
-
-### openSUSE
-
-There’s a very specific reason why I add openSUSE to this list. Not only is it an outstanding desktop distribution, it’s also one of the best rolling releases you’ll find on the market. So if you’re wanting to develop with and release for the most recent software available, [openSUSE Tumbleweed][5] should be one of your top choices. If you want to leverage the latest releases of your favorite IDEs, if you always want to make sure you’re developing with the most recent libraries and toolkits, Tumbleweed is your platform.
-
-But openSUSE doesn’t just offer a rolling release distribution. If you’d rather make use of a standard release platform, [openSUSE Leap][6] is what you want.
-
-Of course, it’s not just about standard or rolling releases. The openSUSE platform also has a Kubernetes-specific release, called [Kubic][7], which is based on Kubernetes atop openSUSE MicroOS. But even if you aren’t developing for Kubernetes, you’ll find plenty of software and tools to work with.
-
-And openSUSE also offers the ability to select your desktop environment, or (should you chose) a generic desktop or server (Figure 2).
-
-![openSUSE][9]
-
-Figure 2: The openSUSE Tumbleweed installation in action.
-
-[Used with permission][4]
-
-### Fedora
-
-Using Fedora as a development platform just makes sense. Why? The distribution itself seems geared toward developers. With a regular, six month release cycle, developers can be sure they won’t be working with out of date software for long. This can be important, when you need the most recent tools and libraries. And if you’re developing for enterprise-level businesses, Fedora makes for an ideal platform, as it is the upstream for Red Hat Enterprise Linux. What that means is the transition to RHEL should be painless. That’s important, especially if you hope to bring your project to a much larger market (one with deeper pockets than a desktop-centric target).
-
-Fedora also offers one of the best GNOME experiences you’ll come across (Figure 3). This translates to a very stable and fast desktops.
-
-![GNOME][11]
-
-Figure 3: The GNOME desktop on Fedora.
-
-[Used with permission][4]
-
-But if GNOME isn’t your jam, you can opt to install one of the [Fedora spins][12] (which includes KDE, XFCE, LXQT, Mate-Compiz, Cinnamon, LXDE, and SOAS).
-
-### Pop!_OS
-
-I’d be remiss if I didn’t include [System76][13]’s platform, customized specifically for their hardware (although it does work fine on other hardware). Why would I include such a distribution, especially one that doesn’t really venture far away from the Ubuntu platform for which is is based? Primarily because this is the distribution you want if you plan on purchasing a desktop or laptop from System76. But why would you do that (especially given that Linux works on nearly all off-the-shelf hardware)? Because System76 sells outstanding hardware. With the release of their Thelio desktop, you have available one of the most powerful desktop computers on the market. If you’re developing seriously large applications (especially ones that lean heavily on very large databases or require a lot of processing power for compilation), why not go for the best? And since Pop!_OS is perfectly tuned for System76 hardware, this is a no-brainer.
-Since Pop!_OS is based on Ubuntu, you’ll have all the tools available to the base platform at your fingertips (Figure 4).
-
-![Pop!_OS][15]
-
-Figure 4: The Anjunta IDE running on Pop!_OS.
-
-[Used with permission][4]
-
-Pop!_OS also defaults to encrypted drives, so you can trust your work will be safe from prying eyes (should your hardware fall into the wrong hands).
-
-### Manjaro
-
-For anyone that likes the idea of developing on Arch Linux, but doesn’t want to have to jump through all the hoops of installing and working with Arch Linux, there’s Manjaro. Manjaro makes it easy to have an Arch Linux-based distribution up and running (as easily as installing and using, say, Ubuntu).
-
-But what makes Manjaro developer-friendly (besides enjoying that Arch-y goodness at the base) is how many different flavors you’ll find available for download. From the [Manjaro download page][16], you can grab the following flavors:
-
- * GNOME
-
- * XFCE
-
- * KDE
-
- * OpenBox
-
- * Cinnamon
-
- * I3
-
- * Awesome
-
- * Budgie
-
- * Mate
-
- * Xfce Developer Preview
-
- * KDE Developer Preview
-
- * GNOME Developer Preview
-
- * Architect
-
- * Deepin
-
-
-
-
-Of note are the developer editions (which are geared toward testers and developers), the Architect edition (which is for users who want to build Manjaro from the ground up), and the Awesome edition (Figure 5 - which is for developers dealing with everyday tasks). The one caveat to using Manjaro is that, like any rolling release, the code you develop today may not work tomorrow. Because of this, you need to think with a certain level of agility. Of course, if you’re not developing for Manjaro (or Arch), and you’re doing more generic (or web) development, that will only affect you if the tools you use are updated and no longer work for you. Chances of that happening, however, are slim. And like with most Linux distributions, you’ll find a ton of developer tools available for Manjaro.
-
-![Manjaro][18]
-
-Figure 5: The Manjaro Awesome Edition is great for developers.
-
-[Used with permission][4]
-
-Manjaro also supports the Arch User Repository (a community-driven repository for Arch users), which includes cutting edge software and libraries, as well as proprietary applications like [Unity Editor][19] or yEd. A word of warning, however, about the Arch User Repository: It was discovered that the AUR contained software considered to be malicious. So, if you opt to work with that repository, do so carefully and at your own risk.
-
-### Any Linux Will Do
-
-Truth be told, if you’re a developer, just about any Linux distribution will work. This is especially true if you do most of your development from the command line. But if you prefer a good GUI running on top of a reliable desktop, give one of these distributions a try, they will not disappoint.
-
-Learn more about Linux through the free ["Introduction to Linux" ][20]course from The Linux Foundation and edX.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/blog/2019/1/top-5-linux-distributions-development-2019
-
-作者:[Jack Wallen][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.linux.com/users/jlwallen
-[b]: https://github.com/lujun9972
-[1]: https://aws.amazon.com/
-[2]: https://www.linux.com/files/images/dev1jpg
-[3]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/dev_1.jpg?itok=7QJQWBKi (Ubuntu)
-[4]: https://www.linux.com/licenses/category/used-permission
-[5]: https://en.opensuse.org/Portal:Tumbleweed
-[6]: https://en.opensuse.org/Portal:Leap
-[7]: https://software.opensuse.org/distributions/tumbleweed
-[8]: /files/images/dev2jpg
-[9]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/dev_2.jpg?itok=1GJmpr1t (openSUSE)
-[10]: /files/images/dev3jpg
-[11]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/dev_3.jpg?itok=_6Ki4EOo (GNOME)
-[12]: https://spins.fedoraproject.org/
-[13]: https://system76.com/
-[14]: /files/images/dev4jpg
-[15]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/dev_4.jpg?itok=nNG2Ax24 (Pop!_OS)
-[16]: https://manjaro.org/download/
-[17]: /files/images/dev5jpg
-[18]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/dev_5.jpg?itok=RGfF2UEi (Manjaro)
-[19]: https://unity3d.com/unity/editor
-[20]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
diff --git a/sources/tech/20190128 3 simple and useful GNOME Shell extensions.md b/sources/tech/20190128 3 simple and useful GNOME Shell extensions.md
deleted file mode 100644
index d7384030c5..0000000000
--- a/sources/tech/20190128 3 simple and useful GNOME Shell extensions.md
+++ /dev/null
@@ -1,73 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (3 simple and useful GNOME Shell extensions)
-[#]: via: (https://fedoramagazine.org/3-simple-and-useful-gnome-shell-extensions/)
-[#]: author: (Ryan Lerch https://fedoramagazine.org/introducing-flatpak/)
-
-3 simple and useful GNOME Shell extensions
-======
-
-
-
-The default desktop of Fedora Workstation — GNOME Shell — is known and loved by many users for its minimal, clutter-free user interface. It is also known for the ability to add to the stock interface using extensions. In this article, we cover 3 simple, and useful extensions for GNOME Shell. These three extensions provide a simple extra behaviour to your desktop; simple tasks that you might do every day.
-
-
-### Installing Extensions
-
-The quickest and easiest way to install GNOME Shell extensions is with the Software Application. Check out the previous post here on the Magazine for more details:
-
-
-
-### Removable Drive Menu
-
-![][1]
-Removable Drive Menu extension on Fedora 29
-
-First up is the [Removable Drive Menu][2] extension. It is a simple tool that adds a small widget in the system tray if you have a removable drive inserted into your computer. This allows you easy access to open Files for your removable drive, or quickly and easily eject the drive for safe removal of the device.
-
-![][3]
-Removable Drive Menu in the Software application
-
-### Extensions Extension.
-
-![][4]
-
-The [Extensions][5] extension is super useful if you are always installing and trying out new extensions. It provides a list of all the installed extensions, allowing you to enable or disable them. Additionally, if an extension has settings, it allows quick access to the settings dialog for each one.
-
-![][6]
-the Extensions extension in the Software application
-
-### Frippery Move Clock
-
-![][7]
-
-Finally, there is the simplest extension in the list. [Frippery Move Clock][8], simply moves the position of the clock from the center of the top bar to the right, next to the status area.
-
-![][9]
-
-
---------------------------------------------------------------------------------
-
-via: https://fedoramagazine.org/3-simple-and-useful-gnome-shell-extensions/
-
-作者:[Ryan Lerch][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://fedoramagazine.org/introducing-flatpak/
-[b]: https://github.com/lujun9972
-[1]: https://fedoramagazine.org/wp-content/uploads/2019/01/removable-disk-1024x459.jpg
-[2]: https://extensions.gnome.org/extension/7/removable-drive-menu/
-[3]: https://fedoramagazine.org/wp-content/uploads/2019/01/removable-software-1024x723.png
-[4]: https://fedoramagazine.org/wp-content/uploads/2019/01/extensions-extension-1024x459.jpg
-[5]: https://extensions.gnome.org/extension/1036/extensions/
-[6]: https://fedoramagazine.org/wp-content/uploads/2019/01/extensions-software-1024x723.png
-[7]: https://fedoramagazine.org/wp-content/uploads/2019/01/move_clock-1024x189.jpg
-[8]: https://extensions.gnome.org/extension/2/move-clock/
-[9]: https://fedoramagazine.org/wp-content/uploads/2019/01/Screenshot-from-2019-01-28-21-53-18-1024x723.png
diff --git a/sources/tech/20190128 Top Hex Editors for Linux.md b/sources/tech/20190128 Top Hex Editors for Linux.md
deleted file mode 100644
index 5cd47704b4..0000000000
--- a/sources/tech/20190128 Top Hex Editors for Linux.md
+++ /dev/null
@@ -1,146 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Top Hex Editors for Linux)
-[#]: via: (https://itsfoss.com/hex-editors-linux)
-[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
-
-Top Hex Editors for Linux
-======
-
-Hex editor lets you view/edit the binary data of a file – which is in the form of “hexadecimal” values and hence the name “Hex” editor. Let’s be frank, not everyone needs it. Only a specific group of users who have to deal with the binary data use it.
-
-If you have no idea, what it is, let me give you an example. Suppose, you have the configuration files of a game, you can open them using a hex editor and change certain values to have more ammo/score and so on. To know more about Hex editors, you should start with the [Wikipedia page][1].
-
-In case you already know what’s it used for – let us take a look at the best Hex editors available for Linux.
-
-### 5 Best Hex Editors Available
-
-![Best Hex Editors for Linux][2]
-
-**Note:** The hex editors mentioned are in no particular order of ranking.
-
-#### 1\. Bless Hex Editor
-
-![bless hex editor][3]
-
-**Key Features** :
-
- * Raw disk editing
- * Multilevel undo/redo operations.
- * Multiple tabs
- * Conversion table
- * Plugin support to extend the functionality
-
-
-
-Bless is one of the most popular Hex editor available for Linux. You can find it listed in your AppCenter or Software Center. If that is not the case, you can check out their [GitHub page][4] for the build and the instructions associated.
-
-It can easily handle editing big files without slowing down – so it’s a fast hex editor.
-
-#### 2\. GNOME Hex Editor
-
-![gnome hex editor][5]
-
-**Key Features:**
-
- * View/Edit in either Hex/Ascii
-
- * Edit large files
-
- *
-
-
-Yet another amazing Hex editor – specifically tailored for GNOME. Well, I personally use Elementary OS, so I find it listed in the App Center. You should find it in the Software Center as well. If not, refer to the [GitHub page][6] for the source.
-
-You can use this editor to view/edit in either hex or ASCII. The user interface is quite simple – as you can see in the image above.
-
-#### 3\. Okteta
-
-![okteta][7]
-
-**Key Features:**
-
- * Customizable data views
- * Multiple tabs
- * Character encodings: All 8-bit encodings as supplied by Qt, EBCDIC
- * Decoding table listing common simple data types.
-
-
-
-Okteta is a simple hex editor with not so fancy features. Although it can handle most of the tasks. There’s a separate module of it which you can use to embed this in other programs to view/edit files.
-
-Similar to all the above-mentioned editors, you can find this listed on your AppCenter and Software center as well.
-
-#### 4\. wxHexEditor
-
-![wxhexeditor][8]
-
-**Key Features:**
-
- * Easily handle big files
- * Has x86 disassembly support
- * **** Sector Indication **** on Disk devices
- * Supports customizable hex panel formatting and colors.
-
-
-
-This is something interesting. It is primarily a Hex editor but you can also use it as a low level disk editor. For example, if you have a problem with your HDD, you can use this editor to edit the the sectors in raw hex and fix it.
-
-You can find it listed on your App Center and Software Center. If not, [Sourceforge][9] is the way to go.
-
-#### 5\. Hexedit (Command Line)
-
-![hexedit][10]
-
-**Key Features** :
-
- * Works via terminal
- * It’s fast and simple
-
-
-
-If you want something to work on your terminal, you can go ahead and install Hexedit via the console. It’s my favorite Linux hex editor in command line.
-
-When you launch it, you will have to specify the location of the file, and it’ll then open it for you.
-
-To install it, just type in:
-
-```
-sudo apt install hexedit
-```
-
-### Wrapping Up
-
-Hex editors could come in handy to experiment and learn. If you are someone experienced, you should opt for the one with more feature – with a GUI. Although, it all comes down to personal preferences.
-
-What do you think about the usefulness of Hex editors? Which one do you use? Did we miss listing your favorite? Let us know in the comments!
-
-![][11]
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/hex-editors-linux
-
-作者:[Ankush Das][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://itsfoss.com/author/ankush/
-[b]: https://github.com/lujun9972
-[1]: https://en.wikipedia.org/wiki/Hex_editor
-[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/Linux-hex-editors-800x450.jpeg?resize=800%2C450&ssl=1
-[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/bless-hex-editor.jpg?ssl=1
-[4]: https://github.com/bwrsandman/Bless
-[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/ghex-hex-editor.jpg?ssl=1
-[6]: https://github.com/GNOME/ghex
-[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/okteta-hex-editor-800x466.jpg?resize=800%2C466&ssl=1
-[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/wxhexeditor.jpg?ssl=1
-[9]: https://sourceforge.net/projects/wxhexeditor/
-[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/hexedit-console.jpg?resize=800%2C566&ssl=1
-[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/Linux-hex-editors.jpeg?fit=800%2C450&ssl=1
diff --git a/sources/tech/20190129 A small notebook for a system administrator.md b/sources/tech/20190129 A small notebook for a system administrator.md
new file mode 100644
index 0000000000..45d6ba50eb
--- /dev/null
+++ b/sources/tech/20190129 A small notebook for a system administrator.md
@@ -0,0 +1,552 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (A small notebook for a system administrator)
+[#]: via: (https://habr.com/en/post/437912/)
+[#]: author: (sukhe https://habr.com/en/users/sukhe/)
+
+A small notebook for a system administrator
+======
+
+I am a system administrator, and I need a small, lightweight notebook for every day carrying. Of course, not just to carry it, but for use it to work.
+
+I already have a ThinkPad x200, but it’s heavier than I would like. And among the lightweight notebooks, I did not find anything suitable. All of them imitate the MacBook Air: thin, shiny, glamorous, and they all critically lack ports. Such notebook is suitable for posting photos on Instagram, but not for work. At least not for mine.
+
+After not finding anything suitable, I thought about how a notebook would turn out if it were developed not with design, but the needs of real users in mind. System administrators, for example. Or people serving telecommunications equipment in hard-to-reach places — on roofs, masts, in the woods, literally in the middle of nowhere.
+
+The results of my thoughts are presented in this article.
+
+
+[![Figure to attract attention][1]][2]
+
+Of course, your understanding of the admin notebook does not have to coincide with mine. But I hope you will find a couple of interesting thoughts here.
+
+Just keep in mind that «system administrator» is just the name of my position. And in fact, I have to work as a network engineer, and installer, and perform a significant part of other work related to hardware. Our company is tiny, we are far from large settlements, so all of us have to be universal specialist.
+
+In order not to constantly clarify «this notebook», later in the article I will call it the “adminbook”. Although it can be useful not only to administrators, but also to all who need a small, lightweight notebook with a lot of connectors. In fact, even large laptops don’t have as many connectors.
+
+So let's get started…
+
+### 1\. Dimensions and weight
+
+Of course, you want it smaller and more lightweight, but the keyboard with the screen should not be too small. And there has to be space for connectors, too.
+
+In my opinion, a suitable option is a notebook half the size of an x200. That is, approximately the size of a sheet of A5 paper (210x148mm). In addition, the side pockets of many bags and backpacks are designed for this size. This means that the adminbook doesn’t even have to be carried in the main compartment.
+
+Though I couldn’t fit everything I wanted into 210mm. To make a comfortable keyboard, the width had to be increased to 230mm.
+
+In the illustrations the adminbook may seem too thick. But that’s only an optical illusion. In fact, its thickness is 25mm (28mm taking the rubber feet into account).
+
+Its size is close to the usual hardcover book, 300-350 pages thick.
+
+It’s lightweight, too — about 800 grams (half the weight of the ThinkPad).
+
+The case of the adminbook is made of mithril aluminum. It’s a lightweight, durable metal with good thermal conductivity.
+
+### 2\. Keyboard and trackpoint
+
+A quality keyboard is very important for me. “Quality” there means the fastest possible typing and hotkey speed. It needs to be so “matter-of-fact” I don’t have to think about it at all, as if it types seemingly by force of thought.
+
+This is possible if the keys are normal size and in their typical positions. But the adminbook is too small for that. In width, it is even smaller than the main block of keys of a desktop keyboard. So, you have to work around that somehow.
+
+After a long search and numerous tests, I came up with what you see in the picture:
+
+
+Fig.2.1 — Adminbook keyboard
+
+This keyboard has the same vertical key distance as on a regular keyboard. A horizontal distance decreased just only 2mm (17 instead of 19).
+
+You can even type blindly on this keyboard! To do this, some keys have small bumps for tactile orientation.
+
+However, if you do not sit at a table, the main input method will be to press the keys “at a glance”. And here the muscle memory does not help — you have to look at the keys with your eyes.
+
+To hit the buttons faster, different key colors are used.
+
+For example, the numeric row is specifically colored gray to visually separate it from the QWERTY row, and NumLock is mapped to the “6” key, colored black to stand out.
+
+To the right of NumLock, gray indicates the area of the numeric keypad. These (and neighboring) buttons work like a numeric keypad in NumLock mode or when you press Fn. I must say, this is a useful feature for the admin computer — some users come up with passwords on the numpad in the form of a “cross”, “snake”, “spiral”, etc. I want to be able to type them that way too.
+
+As for the function keys. I don’t know about you, but it annoys me when, in a 15-inch laptop, this row is half-height and only accessible through pressing Fn. Given that there’s a lot free space around the keyboard!
+
+The adminbook doesn’t have free space at all. But the function keys can be pressed without Fn. These are separate keys that are even divided into groups of 4 using color coding and location.
+
+By the way, have you seen which key is to the right of AltGr on modern ThinkPads? I don’t know what they were thinking, but now they have PrintScreen there!
+
+Where? Where, I ask, is the context menu key that I use every day? It’s not there.
+
+So the adminbook has it. Two, even! You can put it up by pressing Fn + Alt. Sorry, I couldn’t map it to a separate key due to lack of space. Just in case, I added the “Right Win” key as Fn + CtrlR. Maybe some people use it for something.
+
+However, the adminbook allows you to customize the keyboard to your liking. The keyboard is fully reprogrammable. You can assign the scan codes you need to the keys. Setting the keyboard parameters is done via the “KEY” button (Fn + F3).
+
+Of course, the adminbook has a keyboard backlight. It is turned on with Fn + B (below the trackpoint, you can even find it in the dark). The backlight here is similar to the ThinkPad ThinkLight. That is, it’s an LED above the display, illuminating the keyboard from the top. In this case, it is better than a backlight from below, because it allows you to distinguish the color of the keys. In addition, keys have several characters printed on them, while only English letters are usually made translucent to the backlight.
+
+Since we’re on the topic of characters… Red letters are Ukrainian and Russian. I specifically drew them to show that keys have space for several alphabets: after all, English is not a native language for most of humanity.
+
+Since there isn’t enough space for a full touchpad, the trackpoint is used as the positioning device. If you have no experience working with it — don’t worry, it’s actually quite handy. The mouse cursor moves with slight inclines of the trackpoint, like an analog joystick, and its three buttons (under the spacebar) work the same as on the mouse.
+
+To the left of the trackpoint keys is a fingerprint scanner. That makes it possible to login by fingerprint. It’s very convenient in most cases.
+
+The space bar has an NFC antenna location mark. You can simply read data from devices equipped with NFC, and you can make it to lock the system while not in use. For example, if you wear an NFC-equipped ring, it looks like this: when you remove hands from the keyboard, the computer locks after a certain time, and unlocks when you put hands on the keyboard again.
+
+And now the unexpected part. The keyboard and the trackpoint can work as a USB keyboard and mouse for an external computer! For this, there are USB Type C and MicroUSB connectors on the back, labeled «OTG». You can connect to an external computer using a standard USB cable from a phone (which is usually always with you).
+
+
+Fig.2.2 — On the right: the power connector 5.5x2.5mm, the main LAN connector, POE indicator, USB 3.0 Type A, USB Type C (with alternate HDMI mode), microSD card reader and two «magic» buttons
+
+Switching to the external keyboard mode is done with the «K» button on the right side of the adminbook. And there are actually three modes, since the keyboard+trackpoint combo can also work as a Bluetooth keyboard/mouse!
+
+Moreover: to save energy, the keyboard and trackpoint can work autonomously from the rest of the adminbook. When the adminbook is turned off, pressing «K» can turn on only the keyboard and trackpoint to use them by connecting to another computer.
+
+Of course, the keyboard is water-resistant. Excess water is drained down through the drainage holes.
+
+### 3\. Video subsystem
+
+There are some devices that normally do not need a monitor and keyboard. For example, industrial computers, servers or DVRs. And since the monitor is «not needed», it is, in most cases, absent.
+
+And when there is a need to configure such a device from the console, it can be a big surprise that the entire office is working on laptops and there is not a single stationary monitor within reach. Therefore, in some cases you have to take a monitor with you.
+
+But you don’t need to worry about this if you have the adminbook.
+
+The fact is that the video outputs of the adminbook can switch «in the opposite direction» and work as video inputs by displaying the incoming image on the built-in screen. So, the adminbook can also replace the monitor (in addition to replace the mouse and keyboard).
+
+
+Fig.3.1 — On the left side of the adminbook, there are Mini DisplayPort, USB Type C (with alternate DisplayPort mode), SD card reader, USB 3.0 Type A connectors, HDMI, four audio connectors, VGA and power button
+
+Switching modes between input and output is done by pressing the «M» button on the right side of the adminbook.
+
+The video subsystem, as well as the keyboard, can work autonomously — that is, when used as a monitor, the other parts of the adminbook remain disabled. To turn on to this mode also uses the «M» button.
+
+Detailed screen adjustment (contrast, geometry, video input selection, etc.) is performed using the menu, brought up with the «SCR» button (Fn + F4).
+
+The adminbook has HDMI, MiniDP, VGA and USB Type C connectors (with DisplayPort and HDMI alternate mode) for video input / output. The integrated GPU can display the image simultaneously in three directions (including the integrated display).
+
+The adminbook display is FullHD (1920x1080), 9.5’’, matte screen. The brightness is sufficient for working outside during the day. And to do it better, the set includes folding blinds for protection from sunlight.
+
+
+Fig.3.2 — Blinds to protect from sunlight
+
+In addition to video output via these connectors, the adminbook can use wireless transmission via WiDi or Miracast protocols.
+
+### 4\. Emulation of external drives
+
+One of the options for installing the operating system is to install it from a CD / DVD, but now very few computers have optical drives. USB connectors are everywhere, though. Therefore, the adminbook can pretend to be an external optical drive connected via USB.
+
+That allows connecting it to any computer to install an operating system on it, while also running boot discs with test programs or antiviruses.
+
+To connect, it uses the same USB cable that’s used for connecting it to a desktop as an external keyboard/mouse.
+
+The “CD” button (Fn + F2) controls the drive emulation — select a disc image (in an .iso file) and mount / unmount it.
+
+If you need to copy data from a computer or to it, the adminbook can emulate an external hard drive connected via the same USB cable. HDD emulation is also enabled by the “CD” button.
+
+This button also turns on the emulation of bootable USB flash drives. They are now used to install operating systems almost more often than CDs. Therefore, the adminbook can pretend to be a bootable flash drive.
+
+The .iso files are located on a separate partition of the hard disk. This allows you to use them regardless of the operating system. Moreover, in the emulation menu you can connect a virtual drive to one of the USB interfaces of the adminbook. This makes it possible to install an operating system on the adminbook using itself as an installation disc drive.
+
+By the way, the adminbook is designed to work under Windows 10 and Debian / Kali / Ubuntu. The menu system called via function buttons with Fn works autonomously on a separate microcontroller.
+
+### 5\. Rear connectors
+
+First, a classic DB-9 connector for RS-232. Any admin notebook simply has to have it. We have it here, too, and galvanically isolated from the rest of the notebook.
+
+In addition to RS-232, RS-485 widely used in industrial automation is supported. It has a two-wire and four-wire version, with a terminating resistor and without, with the ability to enable a protective offset. It can also work in RS-422 and UART modes.
+
+All these protocols are configured in the on-screen menu, called by the «COM» button (Fn + F8).
+
+Since there are multiple protocols, it is possible to accidentally connect the equipment to a wrong connector and break it.
+
+To prevent this from happening, when you turn off the computer (or go into sleep mode, or close the display lid), the COM port switches to the default mode. This may be a “port disabled” state, or enabling one of the protocols.
+
+
+Fig.5.1 — The rear connectors: DB-9, SATA + SATA Power, HD Mini SAS, the second wired LAN connector, two USB 3.0 Type A connectors, two USB 2.0 MicroB connectors, three USB Type C connectors, a USIM card tray, a PBD-12 pin connector (jack)
+
+The adminbook has one more serial port. But if the first one uses the hardware UART chipset, the second one is connected to the USB 2.0 line through the FT232H converter.
+
+Thanks to this, via COM2, you can exchange data via I2C, SMBus, SPI, JTAG, UART protocols or use it as 8 outputs for Bit-bang / GPIO. These protocols are used when working with microcontrollers, flashing firmware on routers and debugging any other electronics. For this purpose, pin connectors are usually used with a 2.54mm pitch. Therefore, COM2 is made to look like one of these connectors.
+
+
+Fig.5.2 — USB to UART adapter replaced by COM2 port
+
+There is also a secondary LAN interface at the back. Like the main one, it is gigabit-capable, with support for VLAN. Both interfaces are able to test the integrity of the cable (for pair length and short circuits), the presence of connected devices, available communication speeds, the presence of POE voltage. With the using a wiremap adapter on the other side (see chapter 17) it is possible to determine how the cable is connected to crimps.
+
+The network interface menu is called with the “LAN” button (Fn + F6).
+
+The adminbook has a combined SATA + SATA Power connector, connected directly to the chipset. That makes it possible to perform low-level tests of hard drives that do not work through USB-SATA adapters. Previously, you had to do it through ExpressCards-type adapters, but the adminbook can do without them because it has a true SATA output.
+
+
+Fig.5.3 — USB to SATA/IDE and ExpressCard to SATA adapters
+
+The adminbook also has a connector that no other laptops have — HD Mini SAS (SFF-8643). PCIe x4 is routed outside through this connector. Thus, it's possible to connect an external U.2 (directly) or M.2 type (through an adapter) drives. Or even a typical desktop PCIe expansion card (like a graphics card).
+
+
+Fig.5.4 — HD Mini SAS (SFF-8643) to U.2 cable
+
+
+Fig.5.5 — U.2 drive
+
+
+Fig.5.6 — U.2 to M.2 adapter
+
+
+Fig.5.7 — Combined adapter from U.2 to M.2 and PCIe (sample M.2 22110 drive is installed)
+
+Unfortunately, the limitations of the chipset don’t allow arbitrary use of PCIe lanes. In addition, the processor uses the same data lanes for PCIe and SATA. Therefore, the rear connectors can only work in two ways:
+— all four PCIe lanes go to the Mini SAS connector (the second network interface and SATA don’t work)
+— two PCIe lanes go to the Mini SAS, and two lanes to the second network interface and SATA connector
+
+On the back there are also two USB connectors (usual and Type C), which are constantly powered. That allows you to charge other devices from your notebook, even when the notebook is turned off.
+
+### 6\. Power Supply
+
+The adminbook is designed to work in difficult and unpredictable conditions, therefore, it is able to receive power in various ways.
+
+**Method number one** is Power Delivery. The power supply cable can be connected to any USB Type C connector (except the one marked “OTG”).
+
+**The second option** is from a normal 5V phone charger with a microUSB or USB Type C connector. At the same time, if you connect to the ports labeled QC 3.0, the QuickCharge fast charging standard will be supported.
+
+**The third option** — from any source of 12-60V DC power. To connect, use a coaxial ( also known as “barrel”) 5.5x2.5mm power connector, often found in laptop power supplies.
+
+For greater safety, the 12-60V power supply is galvanically isolated from the rest of the notebook. In addition, there’s reverse polarity protection. In fact, the adminbook can receive energy even if positive and negative ends are mismatched.
+
+
+Fig.6.1 — The cable, connecting the power supply to the adminbook (terminated with 5.5x2.5mm connectors)
+
+Adapters for a car cigarette lighter and crocodile clips are included in the box.
+
+
+Fig.6.2 — Adapter from 5.5x2.5mm coaxial connector to crocodile clips
+
+
+Fig.6.3 — Adapter to a car cigarette lighter
+
+**The fourth option** — Power Over Ethernet (POE) through the main network adapter. Supported options are 802.3af, 802.3at and Passive POE. Input voltage from 12 to 60V. This method is convenient if you have to work on the roof or on the tower, setting up Wi-Fi antennas. Power to them comes through Ethernet cables, and there is no other electricity on the tower.
+
+POE electricity can be used in three ways:
+
+ * power the notebook only
+ * forward to a second network adapter and power the notebook from batteries
+ * power the notebook and the antenna at the same time
+
+
+
+To prevent equipment damage, if one of the Ethernet cables is disconnected, the power to the second network interface is terminated. The power can only be turned on manually through the corresponding menu item.
+
+When using the 802.3af / at protocols, you can set the power class that the adminbook will request from the power supply device. This and other POE properties are configured from the menu called with the “LAN” button (Fn + F6).
+
+By the way, you can remotely reset Ubiquity access points (which is done by closing certain wires in the cable) with the second network interface.
+
+The indicator next to the main network interface shows the presence and type of POE: green — 802.3af / at, red — Passive POE.
+
+**The last, fifth** power supply is the battery. Here it’s a LiPol, 42W/hour battery.
+
+In case the external power supply does not provide sufficient power, the missing power can be drawn from the battery. Thus, it can draw power from the battery and external sources at the same time.
+
+### 7\. Display unit
+
+The display can tilt 180 degrees, and it’s locked with latches while closed (opens with a button on the front side). When the display is closed, adminbook doesn’t react to pressing any external buttons.
+
+In addition to the screen, the notebook lid contains:
+
+ * front and rear cameras with lights, microphones, activity LEDs and mechanical curtains
+ * LED of the upper backlight of the keyboard (similar to ThinkLight)
+ * LED indicators for Wi-Fi, Bluetooth, HDD and others
+ * wireless protocol antennas (in the blue plastic insert)
+ * photo sensors and LEDs for the infrared remote
+ * gyroscope, accelerometer, magnetometer
+
+
+
+The plastic insert for the antennas does not reach the corners of the display lid. This is done because in the «traveling» notebooks the corners are most affected by impacts, and it's desirable that they be made of metal.
+
+### 8\. Webcams
+
+The notebook has 2 webcams. The front-facing one is 8MP (4K / UltraHD), while the “selfie” one is 2MP (FullHD). Both cameras have a backlight controlled by separate buttons (Fn + G and Fn + H). Each camera has a mechanical curtain and an activity LED. The shifted mechanical curtain also turns off the microphones of the corresponding side (configurable).
+
+The external camera has two quick launch buttons — Fn + 1 takes an instant photo, Fn + 2 turns on video recording. The internal camera has a combination of Fn + Q and Fn + W.
+
+You can configure cameras and microphones from the menu called up by the “CAM” button (Fn + F10).
+
+### 9\. Indicator row
+
+It has the following indicators: Microphone, NumLock, ScrollLock, hard drive access, battery charge, external power connection, sleep mode, mobile connection, WiFi, Bluetooth.
+
+Three indicators are made to shine through the back side of the display lid, so that they can be seen while the lid is closed: external power connection, battery charge, sleep mode.
+
+Indicators are color-coded.
+
+Microphone — lights up red when all microphones are muted
+
+Battery charge: more than 60% is green, 30-60% is yellow, less than 30% is red, less than 10% is blinking red.
+
+External power: green — power is supplied, the battery is charged; yellow — power is supplied, the battery is charging; red — there is not enough external power to operate, the battery is drained
+
+Mobile: 4G (LTE) — green, 3G — yellow, EDGE / GPRS — red, blinking red — on, but no connection
+
+Wi-Fi: green — connected to 5 GHz, yellow — to 2.4 GHz, red — on, but not connected
+
+You can configure the indication with the “IND” button (Fn + F9)
+
+### 10\. Infrared remote control
+
+Near the indicators (on the front and back of the display lid) there are infrared photo sensors and LEDs to recording and playback commands from IR remotes. You can set it up, as well as emulate a remote control by pressing the “IR” button (Fn + F5).
+
+### 11\. Wireless interfaces
+
+WiFi — dual-band, 802.11a/b/g/n/ac with support for Wireless Direct, Intel WI-Di / Miracast, Wake On Wireless LAN.
+
+You ask, why is Miracast here? Because is already embedded in many WiFi chips, so its presence does not lead to additional costs. But you can transfer the image wirelessly to TVs, projectors and TV set-top boxes, that already have Miracast built in.
+
+Regarding Bluetooth, there’s nothing special. It’s version 4.2 or newest. By the way, the keyboard and trackpoint have a separate Bluetooth module. This is much easier than connect them to the system-wide module.
+
+Of course, the adminbook has a built-in cellular modem for 4G (LTE) / 3G / EDGE / GPRS, as well as a GPS / GLONASS / Galileo / Beidou receiver. This receiver also doesn’t cost much, because it’s already built into the 4G modem.
+
+There is also an NFC communication module, with the antenna under the spacebar. Antennas of all other wireless interfaces are in a plastic insert above the display.
+
+You can configure wireless interfaces with the «WRLS» button (Fn + F7).
+
+### 12\. USB connectors
+
+In total, four USB 3.0 Type A connectors and four USB 3.1 Type C connectors are built into the adminbook. Peripherals are connected to the adminbook through these.
+
+One more Type C and MicroUSB are allocated only for keyboard / mouse / drive emulation (denoted as “OTG”).
+
+«QC 3.0» labeled MicroUSB connector can not only be used for power, but it can switch to normal USB 2.0 port mode, except using MicroB instead of normal Type A. Why is it necessary? Because to flash some electronics you sometimes need non-standard USB A to USB A cables.
+
+In order to not make adapters outselves, you can use a regular phone charging cable by plugging it into this Micro B connector. Or use an USB A to USB Type C cable (if you have one).
+
+
+Fig.12.1 — Homemade USB A to USB A cable
+
+Since USB Type C supports alternate modes, it makes sense to use it. Alternate modes are when the connector works as HDMI or DisplayPort video outputs. Though you’ll need adapters to connect it to a TV or monitor. Or appropriate cables that have Type C on one end and HDMI / DP on the other. However, USB Type C to USB Type C cables might soon become the most common video transfer cable.
+
+The Type C connector on the left side of the adminbook supports an alternate Display Port mode, and on the right side, HDMI. Like the other video outputs of the adminbook, they can work as both input and output.
+
+The one thing left to say is that Type C is bidirectional in regard to power delivery — it can both take in power as well as output it.
+
+### 13\. Other
+
+On the left side there are four audio connectors: Line In, Line Out, Microphone and the combo headset jack (headphones + microphone). Supports simple stereo, quad and 5.1 mode output.
+
+Audio outputs are specially placed next to the video connectors, so that when connected to any equipment, the wires are on one side.
+
+Built-in speakers are on the sides. Outside, they are covered with grills and acoustic fabric with water-repellent impregnation.
+
+There are also two slots for memory cards — full-size SD and MicroSD. If you think that the first slot is needed only for copying photos from the camera — you are mistaken. Now, both single-board computers like Raspberry Pi and even rack-mount servers are loaded from SD cards. MicroSD cards are also commonly found outside of phones. In general, you need both card slots.
+
+Sensors more familiar to phones — a gyroscope, an accelerometer and a magnetometer — are built into the lid of the notebook. Thanks to this, one can determine where the notebook cameras are directed and use this for augmented reality, as well as navigation. Sensors are controlled via the menu using the “SNSR” button (Fn + F11).
+
+Among the function buttons with Fn, F1 (“MAN”) and F12 (“ETC”) I haven’t described yet. The first is a built-in guide on connectors, modes and how to use the adminbook. The second is the settings of non-standard subsystems that have not separate buttons.
+
+### 14\. What's inside
+
+The adminbook is based on the Core i5-7Y57 CPU (Kaby Lake architecture). Although it’s less of a CPU, but more of a real SOC (System On a Chip). That is, almost the entire computer (without peripherals) fits in one chip the size of a thumb nail (2x1.6 cm).
+
+It emits from 3.5W to 7W of heat (depends on the frequency). So, a passive cooling system is adequate in this case.
+
+8GB of RAM are installed by default, expandable up to 16GB.
+
+A 256GB M.2 2280 SSD, connected with two PCIe lanes, is used as the hard drive.
+
+Wi-Fi + Bluetooth and WWAN + GNSS adapters are also designed as M.2 modules.
+
+RAM, the hard drive and wireless adapters are located on the top of the motherboard and can be replaced by the user — just unscrew and lift the keyboard.
+
+The battery is assembled from four LP545590 cells and can also be replaced.
+
+SOC and other irreplaceable hardware are located on the bottom of the motherboard. The heating components for cooling are pressed directly against the case.
+
+External connectors are located on daughter boards connected to the motherboard via ribbon cables. That allows to release different versions of the adminbook based on the same motherboard.
+
+For example, one of the possible version:
+
+
+Fig.14.1 — Adminbook A4 (front view)
+
+
+Fig.14.2 — Adminbook A4 (back view)
+
+
+Fig.14.3 — Adminbook A4 (keyboard)
+
+This is an adminbook with a 12.5” display, its overall dimensions are 210x297mm (A4 paper format). The keyboard is full-size, with a standard key size (only the top row is a bit narrower). All the standard keys are there, except for the numpad and the Right Win, available with Fn keys. And trackpad added.
+
+### 15\. The underside of the adminbook
+
+Not expecting anything interesting from the bottom? But there is!
+
+First I will say a few words about the rubber feet. On my ThinkPad, they sometimes fall away and lost. I don't know if it's a bad glue, or a backpack is not suitable for a notebook, but it happens.
+
+Therefore, in the adminbook, the rubber feet are screwed in (the screws are slightly buried in rubber, so as not to scratch the tables). The feet are sufficiently streamlined so that they cling less to other objects.
+
+On the bottom there are visible drainage holes marked with a water drop.
+
+And the four threaded holes for connecting the adminbook with fasteners.
+
+
+Fig.15.1 — The underside of the adminbook
+
+Large hole in the center has a tripod thread.
+
+
+Fig.15.2 — Camera clamp mount
+
+Why is it necessary? Because sometimes you have to hang on high, holding the mast with one hand, holding the notebook with the second, and typing something on the third… Unfortunately, I am not Shiva, so these tricks are not easy for me. And you can just screw the adminbook by a camera mount to any protruding part of the structure and free your hands!
+
+No protruding parts? No problem. A plate with neodymium magnets is screwed to three other holes and the adminbook is magnetised to any steel surface — even vertical! As you see, opening the display by 180° is pretty useful.
+
+
+Fig.15.3 — Fastening with magnets and shaped holes for nails / screws
+
+And if there is no metal? For example, working on the roof, and next to only a wooden wall. Then you can screw 1-2 screws in the wall and hang the adminbook on them. To do this, there are special slots in the mount, plus an eyelet on the handle.
+
+For especially difficult cases, there’s an arm mount. This is not very convenient, but better than nothing. Besides, it allows you to navigate even with a working notebook.
+
+
+Fig.15.4 — Arm mount
+
+In general, these three holes use a regular metric thread, specifically so that you can make some DIY fastening and fasten it with ordinary screws.
+
+Except fasteners, an additional radiator can be screwed to these holes, so that you can work for a long time under high load or at high ambient temperature.
+
+
+Fig.15.5 — Adminbook with additional radiator
+
+### 16\. Accessories
+
+The adminbook has some unique features, and some of them are implemented using equipment designed specifically for the adminbook. Therefore, these accessories are immediately included. However, non-unique accessories are also available immediately.
+
+Here is a complete list of both:
+
+ * fasteners with magnets
+ * arm mount
+ * heatsink
+ * screen blinds covering it from sunlight
+ * HD Mini SAS to U.2 cable
+ * combined adapter from U.2 to M.2 and PCIe
+ * power cable, terminated by coaxial 5.5x2.5mm connectors
+ * adapter from power cable to cigarette lighter
+ * adapter from power cable to crocodile clips
+ * different adapters from the power cable to coaxial connectors
+ * universal power supply and power cord from it into the outlet
+
+
+
+### 17\. Power supply
+
+Since this is a power supply for a system administrator's notebook, it would be nice to make it universal, capable of powering various electronic devices. Fortunately, the vast majority of devices are connected via coaxial connectors or USB. I mean devices with external power supplies: routers, switches, notebooks, nettops, single-board computers, DVRs, IPTV set top boxes, satellite tuners and more.
+
+
+Fig.17.1 — Adapters from 5.5x2.5mm coaxial connector to other types of connectors
+
+There aren’t many connector types, which allows to get by with an adjustable-voltage PSU and adapters for the necessary connectors. It also needs to support various power delivery standards.
+
+In our case, the power supply supports the following modes:
+
+ * Power Delivery — displayed as **[pd]**
+ * Quick Charge **[qc]**
+ * 802.3af/at **[at]**
+ * voltage from 5 to 54 volts in 0.5V increments (displayed voltage)
+
+
+
+
+Fig.17.2 — Mode display on the 7-segment indicator (1.9. = 19.5V)
+
+
+Fig.17.3 — Front and top sides of power supply
+
+USB outputs on the power supply (5V 2A) are always on. On the other outputs the voltage is applied by pressing the ON/OFF button.
+
+The desired mode is selected with the MODE button and this selection is remembered even when the power is turned off. The modes are listed like this: pd, qc, at, then a series of voltages.
+
+Voltage increases by pressing and holding the MODE button, decreases by short pressing. Step to the right — 1 Volt, step to the left — 0.5 Volt. Half a volt is needed because some equipment requires, for example, 19.5 volts. These half volts are displayed on the display with decimal points (19V -> **[19]** , 19.5V -> **[1.9.]** ).
+
+When power is on, the green LED is on. When a short-circuit or overcurrent protection is triggered, **[SH]** is displayed, and the LED lights up red.
+
+In the Power Delivery and Quick Charge modes, voltage is applied to the USB outputs (Type A and Type C). Only one of them can be used at one time.
+
+In 802.3af/at modes, the power supply acts as an injector, combining the supply voltage with data from the LAN connector and supplying it to the POE connector. Power is supplied only if a device with 802.3af or 802.3at support is plugged into the POE connector.
+
+But in the simple voltage supply mode, electricity throu the POE connector is issued immediately, without any checks. This is the so-called Passive POE — positive charge goes to conductors 4 and 5, and negative charge to conductors 7 and 8. At the same time, the voltage is applied to the coaxial connector. Adapters for various types of connectors are used in this mode.
+
+The power supply unit has a built-in button to remotely reset Ubiquity access points. This is a very useful feature that allows you to reset the antenna to factory settings without having to climb on the mast. I don’t know — is any other manufacturers support a feature like this?
+
+The power supply also has the passive wiremap adapter, which allows you to determine the correct Ethernet cable crimping. The active part is located in the Ethernet ports of the adminbook.
+
+
+Fig.17.4 — Back side and wiremap adapter
+
+Of course, the network cable tester built into the adminbook will not replace a professional OTDR, but for most tasks it will be enough.
+
+To prevent overheating, part of the PSU’s body acts as an aluminum heatsink. Power supply power — 65 watts, size 10x5x4cm.
+
+### 18\. Afterword
+
+“It won’t fit into such a small case!” — the sceptics will probably say. To be frank, I also sometimes think that way when re-reading what I wrote above.
+
+And then I open the 3D model and see, that all parts fits. Of course, I am not an electronic engineer, and for sure I miss some important things. But, I hope that if there are mistakes, they are “overcorrections”. That is, real engineers would fit all of that into a case even smaller.
+
+By and large, the adminbook can be divided into 5 functional parts:
+
+ * the usual part, as in all notebooks — processor, memory, hard drive, etc.
+ * keyboard and trackpoint that can work separately
+ * autonomous video subsystem
+ * subsystem for managing non-standard features (enable / disable POE, infrared remote control, PCIe mode switching, LAN testing, etc.)
+ * power subsystem
+
+
+
+If we consider them separately, then everything looks quite feasible.
+
+The **SOC Kaby Lake** contains a CPU, a graphics accelerator, a memory controller, PCIe, SATA controller, USB controller for 6 USB3 and 10 USB2 outputs, Gigabit Ethernet controller, 4 lanes to connect webcams, integrated audio and etc.
+
+All that remains is to trace the lanes to connectors and supply power to it.
+
+**Keyboard and trackpoint** is a separate module that connects via USB to the adminbook or to an external connector. Nothing complicated here: USB and Bluetooth keyboards are very widespread. In our case, in addition, needs to make a rewritable table of scan codes and transfer non-standard keys over a separate interface other than USB.
+
+**The video subsystem** receives the video signal from the adminbook or from external connectors. In fact, this is a regular monitor with a video switchboard plus a couple of VGA converters.
+
+**Non-standard features** are managed independently of the operating system. The easiest way to do it with via a separate microcontroller which receives codes for pressing non-standard keys (those that are pressed with Fn) and performs the corresponding actions.
+
+Since you have to display a menu to change the settings, the microcontroller has a video output, connected to the adminbook for the duration of the setup.
+
+**The internal PSU** is galvanically isolated from the rest of the system. Why not? On habr.com there was an article about making a 100W, 9.6mm thickness planar transformer! And it only costs $0.5.
+
+So the electronic part of the adminbook is quite feasible. There is the programming part, and I don’t know which part will harder.
+
+This concludes my fairly long article. It long, even though I simplified, shortened and threw out minor details.
+
+The ideal end of the article was a link to an online store where you can buy an adminbook. But it's not yet designed and released. Since this requires money.
+
+Unfortunately, I have no experience with Kickstarter or Indigogo. Maybe you have this experience? Let's do it together!
+
+### Update
+
+Many people asked for a simplified version. Ok. Done. Sorry — just a 3d model, without render.
+
+Deleted: second LAN adapter, micro SD card reader, one USB port Type C, second camera, camera lights and camera curtines, display latch, unnecessary audio connectors.
+
+Also in this version there will be no infrared remote control, a reprogrammable keyboard, QC 3.0 charging standard, and getting power by POE.
+
+
+
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://habr.com/en/post/437912/
+
+作者:[sukhe][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://habr.com/en/users/sukhe/
+[b]: https://github.com/lujun9972
+[1]: https://habrastorage.org/webt/_1/mp/vl/_1mpvlyujldpnad0cvvzvbci50y.jpeg
+[2]: https://habrastorage.org/webt/mr/m6/d3/mrm6d3szvghhpghfchsl_-lzgb4.jpeg
diff --git a/sources/tech/20190129 Get started with gPodder, an open source podcast client.md b/sources/tech/20190129 Get started with gPodder, an open source podcast client.md
deleted file mode 100644
index ca1556e16d..0000000000
--- a/sources/tech/20190129 Get started with gPodder, an open source podcast client.md
+++ /dev/null
@@ -1,64 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Get started with gPodder, an open source podcast client)
-[#]: via: (https://opensource.com/article/19/1/productivity-tool-gpodder)
-[#]: author: (Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
-
-Get started with gPodder, an open source podcast client
-======
-Keep your podcasts synced across your devices with gPodder, the 17th in our series on open source tools that will make you more productive in 2019.
-
-
-
-There seems to be a mad rush at the beginning of every year to find ways to be more productive. New Year's resolutions, the itch to start the year off right, and of course, an "out with the old, in with the new" attitude all contribute to this. And the usual round of recommendations is heavily biased towards closed source and proprietary software. It doesn't have to be that way.
-
-Here's the 17th of my picks for 19 new (or new-to-you) open source tools to help you be more productive in 2019.
-
-### gPodder
-
-I like podcasts. Heck, I like them so much I record three of them (you can find links to them in [my profile][1]). I learn a lot from podcasts and play them in the background when I'm working. But keeping them in sync between multiple desktops and mobile devices can be a bit of a challenge.
-
-[gPodder][2] is a simple, cross-platform podcast downloader, player, and sync tool. It supports RSS feeds, [FeedBurner][3], [YouTube][4], and [SoundCloud][5], and it also has an open source sync service that you can run if you want. gPodder doesn't do podcast playback; instead, it uses your audio or video player of choice.
-
-
-
-Installing gPodder is very straightforward. Installers are available for Windows and MacOS, and packages are available for major Linux distributions. If it isn't available in your distribution, you can run it directly from a Git checkout. With the "Add Podcasts via URL" menu option, you can enter a podcast's RSS feed URL or one of the "special" URLs for the other services. gPodder will fetch a list of episodes and present a dialog where you can select which episodes to download or mark old episodes on the list.
-
-
-
-One of its nicer features is that if a URL is already in your clipboard, gPodder will automatically place it in its URL field, which makes it really easy to add a new podcast to your list. If you already have an OPML file of podcast feeds, you can upload and import it. There is also a discovery option that allows you to search for podcasts on [gPodder.net][6], the free and open source podcast listing site by the people who write and maintain gPodder.
-
-
-
-A [mygpo][7] server synchronizes podcasts between devices. By default, gPodder uses [gPodder.net][8]'s servers, but you can change this in the configuration files if want to run your own (be aware that you'll have to modify the configuration file directly). Syncing allows you to keep your lists consistent between desktops and mobile devices. This is very useful if you listen to podcasts on multiple devices (for example, I listen on my work computer, home computer, and mobile phone), as it means no matter where you are, you have the most recent lists of podcasts and episodes without having to set things up again and again.
-
-
-
-Clicking on a podcast episode will bring up the text post associated with it, and clicking "Play" will launch your device's default audio or video player. If you want to use something other than the default, you can change this in gPodder's configuration settings.
-
-gPodder makes it simple to find, download, and listen to podcasts, synchronize them across devices, and access a lot of other features in an easy-to-use interface.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/productivity-tool-gpodder
-
-作者:[Kevin Sonney][a]
-选题:[lujun9972][b]
-译者:[译者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/ksonney (Kevin Sonney)
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/users/ksonney
-[2]: https://gpodder.github.io/
-[3]: https://feedburner.google.com/
-[4]: https://youtube.com
-[5]: https://soundcloud.com/
-[6]: http://gpodder.net
-[7]: https://github.com/gpodder/mygpo
-[8]: http://gPodder.net
diff --git a/sources/tech/20190130 Get started with Budgie Desktop, a Linux environment.md b/sources/tech/20190130 Get started with Budgie Desktop, a Linux environment.md
deleted file mode 100644
index 1c2389693f..0000000000
--- a/sources/tech/20190130 Get started with Budgie Desktop, a Linux environment.md
+++ /dev/null
@@ -1,60 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Get started with Budgie Desktop, a Linux environment)
-[#]: via: (https://opensource.com/article/19/1/productivity-tool-budgie-desktop)
-[#]: author: (Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
-
-Get started with Budgie Desktop, a Linux environment
-======
-Configure your desktop as you want with Budgie, the 18th in our series on open source tools that will make you more productive in 2019.
-
-
-
-There seems to be a mad rush at the beginning of every year to find ways to be more productive. New Year's resolutions, the itch to start the year off right, and of course, an "out with the old, in with the new" attitude all contribute to this. And the usual round of recommendations is heavily biased towards closed source and proprietary software. It doesn't have to be that way.
-
-Here's the 18th of my picks for 19 new (or new-to-you) open source tools to help you be more productive in 2019.
-
-### Budgie Desktop
-
-There are many, many desktop environments for Linux. From the easy to use and graphically stunning [GNOME desktop][1] (default on most major Linux distributions) and [KDE][2], to the minimalist [Openbox][3], to the highly configurable tiling [i3][4], there are a lot of options. What I look for in a good desktop environment is speed, unobtrusiveness, and a clean user experience. It is hard to be productive when a desktop works against you, not with or for you.
-
-
-
-[Budgie Desktop][5] is the default desktop on the [Solus][6] Linux distribution and is available as an add-on package for most of the major Linux distributions. It is based on GNOME and uses many of the same tools and libraries you likely already have on your computer.
-
-The default desktop is exceptionally minimalistic, with just the panel and a blank desktop. Budgie includes an integrated sidebar (called Raven) that gives quick access to the calendar, audio controls, and settings menu. Raven also contains an integrated notification area with a unified display of system messages similar to MacOS's.
-
-
-
-Clicking on the gear icon in Raven brings up Budgie's control panel with its configuration settings. Since Budgie is still in development, it is a little bare-bones compared to GNOME or KDE, and I hope it gets more options over time. The Top Panel option, which allows the user to configure the ordering, positioning, and contents of the top panel, is nice.
-
-
-
-The Budgie Welcome application (presented at first login) contains options to install additional software, panel applets, snaps, and Flatpack packages. There are applets to handle networking, screenshots, additional clocks and timers, and much, much more.
-
-
-
-Budgie provides a desktop that is clean and stable. It responds quickly and has many options that allow you to customize it as you see fit.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/productivity-tool-budgie-desktop
-
-作者:[Kevin Sonney][a]
-选题:[lujun9972][b]
-译者:[译者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/ksonney (Kevin Sonney)
-[b]: https://github.com/lujun9972
-[1]: https://www.gnome.org/
-[2]: https://www.kde.org/
-[3]: http://openbox.org/wiki/Main_Page
-[4]: https://i3wm.org/
-[5]: https://getsol.us/solus/experiences/
-[6]: https://getsol.us/home/
diff --git a/sources/tech/20190204 7 Best VPN Services For 2019.md b/sources/tech/20190204 7 Best VPN Services For 2019.md
new file mode 100644
index 0000000000..e72d7de3df
--- /dev/null
+++ b/sources/tech/20190204 7 Best VPN Services For 2019.md
@@ -0,0 +1,77 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (7 Best VPN Services For 2019)
+[#]: via: (https://www.ostechnix.com/7-best-opensource-vpn-services-for-2019/)
+[#]: author: (Editor https://www.ostechnix.com/author/editor/)
+
+7 Best VPN Services For 2019
+======
+
+At least 67 percent of global businesses in the past three years have faced data breaching. The breaching has been reported to expose hundreds of millions of customers. Studies show that an estimated 93 percent of these breaches would have been avoided had data security fundamentals been considered beforehand.
+
+Understand that poor data security can be extremely costly, especially to a business and could quickly lead to widespread disruption and possible harm to your brand reputation. Although some businesses can pick up the pieces the hard way, there are still those that fail to recover. Today however, you are fortunate to have access to data and network security software.
+
+
+
+As you start 2019, keep off cyber-attacks by investing in a **V** irtual **P** rivate **N** etwork commonly known as **VPN**. When it comes to online privacy and security, there are many uncertainties. There are hundreds of different VPN providers, and picking the right one means striking just the right balance between pricing, services, and ease of use.
+
+If you are looking for a solid 100 percent tested and secure VPN, you might want to do your due diligence and identify the best match. Here are the top 7 Best tried and tested VPN services For 2019.
+
+### 1. Vpnunlimitedapp
+
+With VPN Unlimited, you have total security. This VPN allows you to use any WIFI without worrying that your personal data can be leaked. With AES-256, your data is encrypted and protected against prying third-parties and hackers. This VPN ensures you stay anonymous and untracked on all websites no matter the location. It offers a 7-day trial and a variety of protocol options: OpenVPN, IKEv2, and KeepSolid Wise. Demanding users are entitled to special extras such as a personal server, lifetime VPN subscription, and personal IP options.
+
+### 2. VPN Lite
+
+VPN Lite is an easy-to-use and **free VPN service** that allows you to browse the internet at no charges. You remain anonymous and your privacy is protected. It obscures your IP and encrypts your data meaning third parties are not able to track your activities on all online platforms. You also get to access all online content. With VPN Lite, you get to access blocked sites in your state. You can also gain access to public WIFI without the worry of having sensitive information tracked and hacked by spyware and hackers.
+
+### 3. HotSpot Shield
+
+Launched in 2005, this is a popular VPN embraced by the majority of users. The VPN protocol here is integrated by at least 70 percent of the largest security companies globally. It is also known to have thousands of servers across the globe. It comes with two free options. One is completely free but supported by online advertisements, and the second one is a 7-day trial which is the flagship product. It contains military grade data encryption and protects against malware. HotSpot Shield guaranteed secure browsing and offers lightning-fast speeds.
+
+### 4. TunnelBear
+
+This is the best way to start if you are new to VPNs. It comes to you with a user-friendly interface complete with animated bears. With the help of TunnelBear, users are able to connect to servers in at least 22 countries at great speeds. It uses **AES 256-bit encryption** guaranteeing no data logging meaning your data stays protected. You also get unlimited data for up to five devices.
+
+### 5. ProtonVPN
+
+This VPN offers you a strong premium service. You may suffer from reduced connection speeds, but you also get to enjoy its unlimited data. It features an intuitive interface easy to use, and comes with a multi-platform compatibility. Proton’s servers are said to be specifically optimized for torrenting and thus cannot give access to Netflix. You get strong security features such as protocols and encryptions meaning your browsing activities remain secure.
+
+### 6. ExpressVPN
+
+This is known as the best offshore VPN for unblocking and privacy. It has gained recognition for being the top VPN service globally resulting from solid customer support and fast speeds. It offers routers that come with browser extensions and custom firmware. ExpressVPN also has an admirable scope of quality apps, plenty of servers, and can only support up to three devices.
+
+It’s not entirely free, and happens to be one of the most expensive VPNs on the market today because it is fully packed with the most advanced features. With it comes a 30-day money-back guarantee, meaning you can freely test this VPN for a month. Good thing is; it is completely risk-free. If you need a VPN for a short duration to bypass online censorship for instance, this could, be your go-to solution. You don’t want to give trials to a spammy, slow, free program.
+
+It is also one of the best ways to enjoy online streaming as well as outdoor security. Should you need to continue using it, you only have to renew or cancel your free trial if need be. Express VPN has over 2000 servers across 90 countries, unblocks Netflix, gives lightning fast connections, and gives users total privacy.
+
+### 7. PureVPN
+
+While this VPN may not be completely free, it falls under the most budget-friendly services on this list. Users can sign up for a free seven days trial and later choose one of its paid plans. With this VPN, you get to access 750-plus servers in at least 140 countries. There is also access to easy installation on almost all devices. All its paid features can still be accessed within the free trial window. That includes unlimited data transfers, IP leakage protection, and ISP invisibility. The supproted operating systems are iOS, Android, Windows, Linux, and macOS.
+
+### Summary
+
+With the large variety of available freemium VPN services today, why not take that opportunity to protect yourself and your customers? Understand that there are some great VPN services. Even the most secure free service however, cannot be touted as risk free. You might want to upgrade to a premium one for increased protection. Premium VPN allows you to test freely offering risk-free money-back guarantee. Whether you plan to sign up for a paid VPN or commit to a free one, it is highly advisable to have a VPN.
+
+**About the author:**
+
+**Renetta K. Molina** is a tech enthusiast and fitness enthusiast. She writes about technology, apps, WordPress and a variety of other topics. In her free time, she likes to play golf and read books. She loves to learn and try new things.
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/7-best-opensource-vpn-services-for-2019/
+
+作者:[Editor][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/editor/
+[b]: https://github.com/lujun9972
diff --git a/sources/tech/20190204 Top 5 open source network monitoring tools.md b/sources/tech/20190204 Top 5 open source network monitoring tools.md
new file mode 100644
index 0000000000..5b6e7f1bfa
--- /dev/null
+++ b/sources/tech/20190204 Top 5 open source network monitoring tools.md
@@ -0,0 +1,125 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Top 5 open source network monitoring tools)
+[#]: via: (https://opensource.com/article/19/2/network-monitoring-tools)
+[#]: author: (Paul Bischoff https://opensource.com/users/paulbischoff)
+
+Top 5 open source network monitoring tools
+======
+Keep an eye on your network to avoid downtime with these monitoring tools.
+
+
+Maintaining a live network is one of a system administrator's most essential tasks, and keeping a watchful eye over connected systems is essential to keeping a network functioning at its best.
+
+There are many different ways to keep tabs on a modern network. Network monitoring tools are designed for the specific purpose of monitoring network traffic and response times, while application performance management solutions use agents to pull performance data from the application stack. If you have a live network, you need network monitoring to make sure you aren't vulnerable to an attacker. Likewise, if you rely on lots of different applications to run your daily operations, you will need an [application performance management][1] solution as well.
+
+This article will focus on open source network monitoring tools. These tools help monitor individual nodes and applications for signs of poor performance. Through one window, you can view the performance of an entire network and even get alerts to keep you in the loop if you're away from your desk.
+
+Before we get into the top five network monitoring tools, let's look more closely at the reasons you need to use one.
+
+### Why do I need a network monitoring tool?
+
+Network monitoring tools are vital to maintaining networks because they allow you to keep an eye on devices connected to the network from a central location. These tools help flag devices with subpar performance so you can step in and run troubleshooting to get to the root of the problem.
+
+Running in-depth troubleshooting can minimize performance problems and prevent security breaches. In practical terms, this keeps the network online and eliminates the risk of falling victim to unnecessary downtime. Regular network maintenance can also help prevent outages that could take thousands of users offline.
+
+A network monitoring tool enables you to:
+
+ * Autodiscover devices connected to your network
+ * View live and historic performance data for a range of devices and applications
+ * Configure alerts to notify you of unusual activity
+ * Generate graphs and reports to analyze network activity in greater depth
+
+### The top 5 open source network monitoring tools
+
+Now, that you know why you need a network monitoring tool, take a look at the top 5 open source tools to see which might best meet your needs.
+
+#### Cacti
+
+
+
+If you know anything about open source network monitoring tools, you've probably heard of [Cacti][2]. It's a graphing solution that acts as an addition to [RRDTool][3] and is used by many network administrators to collect performance data in LANs. Cacti comes with Simple Network Management Protocol (SNMP) support on Windows and Linux to create graphs of traffic data.
+
+Cacti typically works by using data sourced from user-created scripts that ping hosts on a network. The values returned by the scripts are stored in a MySQL database, and this data is used to generate graphs.
+
+This sounds complicated, but Cacti has templates to help speed the process along. You can also create a graph or data source template that can be used for future monitoring activity. If you'd like to try it out, [download Cacti][4] for free on Linux and Windows.
+
+#### Nagios Core
+
+
+
+[Nagios Core][5] is one of the most well-known open source monitoring tools. It provides a network monitoring experience that combines open source extensibility with a top-of-the-line user interface. With Nagios Core, you can auto-discover devices, monitor connected systems, and generate sophisticated performance graphs.
+
+Support for customization is one of the main reasons Nagios Core has become so popular. For example, [Nagios V-Shell][6] was added as a PHP web interface built in AngularJS, searchable tables and a RESTful API designed with CodeIgniter.
+
+If you need more versatility, you can check the Nagios Exchange, which features a range of add-ons that can incorporate additional features into your network monitoring. These range from the strictly cosmetic to monitoring enhancements like [nagiosgraph][7]. You can try it out by [downloading Nagios Core][8] for free.
+
+#### Icinga 2
+
+
+
+[Icinga 2][9] is another widely used open source network monitoring tool. It builds on the groundwork laid by Nagios Core. It has a flexible RESTful API that allows you to enter your own configurations and view live performance data through the dashboard. Dashboards are customizable, so you can choose exactly what information you want to monitor in your network.
+
+Visualization is an area where Icinga 2 performs particularly well. It has native support for Graphite and InfluxDB, which can turn performance data into full-featured graphs for deeper performance analysis.
+
+Icinga2 also allows you to monitor both live and historical performance data. It offers excellent alerts capabilities for live monitoring, and you can configure it to send notifications of performance problems by email or text. You can [download Icinga 2][10] for free for Windows, Debian, DHEL, SLES, Ubuntu, Fedora, and OpenSUSE.
+
+#### Zabbix
+
+
+
+[Zabbix][11] is another industry-leading open source network monitoring tool, used by companies from Dell to Salesforce on account of its malleable network monitoring experience. Zabbix does network, server, cloud, application, and services monitoring very well.
+
+You can track network information such as network bandwidth usage, network health, and configuration changes, and weed out problems that need to be addressed. Performance data in Zabbix is connected through SNMP, Intelligent Platform Management Interface (IPMI), and IPv6.
+
+Zabbix offers a high level of convenience compared to other open source monitoring tools. For instance, you can automatically detect devices connected to your network before using an out-of-the-box template to begin monitoring your network. You can [download Zabbix][12] for free for CentOS, Debian, Oracle Linux, Red Hat Enterprise Linux, Ubuntu, and Raspbian.
+
+#### Prometheus
+
+
+
+[Prometheus][13] is an open source network monitoring tool with a large community following. It was built specifically for monitoring time-series data. You can identify time-series data by metric name or key-value pairs. Time-series data is stored on local disks so that it's easy to access in an emergency.
+
+Prometheus' [Alertmanager][14] allows you to view notifications every time it raises an event. Alertmanager can send notifications via email, PagerDuty, or OpsGenie, and you can silence alerts if necessary.
+
+Prometheus' visual elements are excellent and allow you to switch from the browser to the template language and Grafana integration. You can also integrate various third-party data sources into Prometheus from Docker, StatsD, and JMX to customize your Prometheus experience.
+
+As a network monitoring tool, Prometheus is suitable for organizations of all sizes. The onboard integrations and the easy-to-use Alertmanager make it capable of handling any workload, regardless of its size. You can [download Prometheus][15] for free.
+
+### Which are best?
+
+No matter what industry you're working in, if you rely on a network to do business, you need to implement some form of network monitoring. Network monitoring tools are an invaluable resource that help provide you with the visibility to keep your systems online. Monitoring your systems will give you the best chance to keep your equipment in working order.
+
+As the tools on this list show, you don't need to spend an exorbitant amount of money to reap the rewards of network monitoring. Of the five, I believe Icinga 2 and Zabbix are the best options for providing you with everything you need to start monitoring your network to keep it online. Staying vigilant will help to minimize the change of being caught off-guard by performance issues.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/network-monitoring-tools
+
+作者:[Paul Bischoff][a]
+选题:[lujun9972][b]
+译者:[译者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/paulbischoff
+[b]: https://github.com/lujun9972
+[1]: https://www.comparitech.com/net-admin/application-performance-management/
+[2]: https://www.cacti.net/index.php
+[3]: https://en.wikipedia.org/wiki/RRDtool
+[4]: https://www.cacti.net/download_cacti.php
+[5]: https://www.nagios.org/projects/nagios-core/
+[6]: https://exchange.nagios.org/directory/Addons/Frontends-%28GUIs-and-CLIs%29/Web-Interfaces/Nagios-V-2DShell/details
+[7]: https://exchange.nagios.org/directory/Addons/Graphing-and-Trending/nagiosgraph/details#_ga=2.79847774.890594951.1545045715-2010747642.1545045715
+[8]: https://www.nagios.org/downloads/nagios-core/
+[9]: https://icinga.com/products/icinga-2/
+[10]: https://icinga.com/download/
+[11]: https://www.zabbix.com/
+[12]: https://www.zabbix.com/download
+[13]: https://prometheus.io/
+[14]: https://prometheus.io/docs/alerting/alertmanager/
+[15]: https://prometheus.io/download/
diff --git a/sources/tech/20190205 12 Methods To Check The Hard Disk And Hard Drive Partition On Linux.md b/sources/tech/20190205 12 Methods To Check The Hard Disk And Hard Drive Partition On Linux.md
new file mode 100644
index 0000000000..ef8c8dc460
--- /dev/null
+++ b/sources/tech/20190205 12 Methods To Check The Hard Disk And Hard Drive Partition On Linux.md
@@ -0,0 +1,435 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (12 Methods To Check The Hard Disk And Hard Drive Partition On Linux)
+[#]: via: (https://www.2daygeek.com/linux-command-check-hard-disks-partitions/)
+[#]: author: (Vinoth Kumar https://www.2daygeek.com/author/vinoth/)
+
+12 Methods To Check The Hard Disk And Hard Drive Partition On Linux
+======
+
+Usually Linux admins check the available hard disk and it’s partitions whenever they want to add a new disks or additional partition in the system.
+
+We used to check the partition table of our hard disk to view the disk partitions.
+
+This will help you to view how many partitions were already created on the disk. Also, it allow us to verify whether we have any free space or not.
+
+In general hard disks can be divided into one or more logical disks called partitions.
+
+Each partitions can be used as a separate disk with its own file system and partition information is stored in a partition table.
+
+It’s a 64-byte data structure. The partition table is part of the master boot record (MBR), which is a small program that is executed when a computer boots.
+
+The partition information are saved in the 0 the sector of the disk. Make a note, all the partitions must be formatted with an appropriate file system before files can be written to it.
+
+This can be verified using the following 12 methods.
+
+ * **`fdisk:`** manipulate disk partition table
+ * **`sfdisk:`** display or manipulate a disk partition table
+ * **`cfdisk:`** display or manipulate a disk partition table
+ * **`parted:`** a partition manipulation program
+ * **`lsblk:`** lsblk lists information about all available or the specified block devices.
+ * **`blkid:`** locate/print block device attributes.
+ * **`hwinfo:`** hwinfo stands for hardware information tool is another great utility that used to probe for the hardware present in the system.
+ * **`lshw:`** lshw is a small tool to extract detailed information on the hardware configuration of the machine.
+ * **`inxi:`** inxi is a command line system information script built for for console and IRC.
+ * **`lsscsi:`** list SCSI devices (or hosts) and their attributes
+ * **`cat /proc/partitions:`**
+ * **`ls -lh /dev/disk/:`** The directory contains Disk manufacturer name, serial number, partition ID and real block device files, Those were symlink with real block device files.
+
+
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using fdisk Command?
+
+**[fdisk][1]** stands for fixed disk or format disk is a cli utility that allow users to perform following actions on disks. It allows us to view, create, resize, delete, move and copy the partitions.
+
+```
+# fdisk -l
+
+Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
+Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / 512 bytes
+Disklabel type: dos
+Disk identifier: 0xeab59449
+
+Device Boot Start End Sectors Size Id Type
+/dev/sda1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 20973568 62914559 41940992 20G 83 Linux
+
+
+Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
+Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / 512 bytes
+
+
+Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors
+Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / 512 bytes
+Disklabel type: dos
+Disk identifier: 0x8cc8f9e5
+
+Device Boot Start End Sectors Size Id Type
+/dev/sdc1 2048 2099199 2097152 1G 83 Linux
+/dev/sdc3 4196352 6293503 2097152 1G 83 Linux
+/dev/sdc4 6293504 20971519 14678016 7G 5 Extended
+/dev/sdc5 6295552 8392703 2097152 1G 83 Linux
+
+
+Disk /dev/sdd: 10 GiB, 10737418240 bytes, 20971520 sectors
+Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / 512 bytes
+
+
+Disk /dev/sde: 10 GiB, 10737418240 bytes, 20971520 sectors
+Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / 512 bytes
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using sfdisk Command?
+
+sfdisk is a script-oriented tool for partitioning any block device. sfdisk supports MBR (DOS), GPT, SUN and SGI disk labels, but no longer provides any functionality for CHS (Cylinder-Head-Sector) addressing.
+
+```
+# sfdisk -l
+
+Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
+Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / 512 bytes
+Disklabel type: dos
+Disk identifier: 0xeab59449
+
+Device Boot Start End Sectors Size Id Type
+/dev/sda1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 20973568 62914559 41940992 20G 83 Linux
+
+
+Disk /dev/sdb: 10 GiB, 10737418240 bytes, 20971520 sectors
+Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / 512 bytes
+
+
+Disk /dev/sdc: 10 GiB, 10737418240 bytes, 20971520 sectors
+Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / 512 bytes
+Disklabel type: dos
+Disk identifier: 0x8cc8f9e5
+
+Device Boot Start End Sectors Size Id Type
+/dev/sdc1 2048 2099199 2097152 1G 83 Linux
+/dev/sdc3 4196352 6293503 2097152 1G 83 Linux
+/dev/sdc4 6293504 20971519 14678016 7G 5 Extended
+/dev/sdc5 6295552 8392703 2097152 1G 83 Linux
+
+
+Disk /dev/sdd: 10 GiB, 10737418240 bytes, 20971520 sectors
+Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / 512 bytes
+
+
+Disk /dev/sde: 10 GiB, 10737418240 bytes, 20971520 sectors
+Units: sectors of 1 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 512 = 512 bytes
+Sector size (logical/physical): 512 bytes / 512 bytes
+I/O size (minimum/optimal): 512 bytes / 512 bytes
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using cfdisk Command?
+
+cfdisk is a curses-based program for partitioning any block device. The default device is /dev/sda. It provides basic partitioning functionality with a user-friendly interface.
+
+```
+# cfdisk /dev/sdc
+ Disk: /dev/sdc
+ Size: 10 GiB, 10737418240 bytes, 20971520 sectors
+ Label: dos, identifier: 0x8cc8f9e5
+
+ Device Boot Start End Sectors Size Id Type
+>> /dev/sdc1 2048 2099199 2097152 1G 83 Linux
+ Free space 2099200 4196351 2097152 1G
+ /dev/sdc3 4196352 6293503 2097152 1G 83 Linux
+ /dev/sdc4 6293504 20971519 14678016 7G 5 Extended
+ ├─/dev/sdc5 6295552 8392703 2097152 1G 83 Linux
+ └─Free space 8394752 20971519 12576768 6G
+
+
+
+ ┌───────────────────────────────────────────────────────────────────────────────┐
+ │ Partition type: Linux (83) │
+ │Filesystem UUID: d17e3c31-e2c9-4f11-809c-94a549bc43b7 │
+ │ Filesystem: ext2 │
+ │ Mountpoint: /part1 (mounted) │
+ └───────────────────────────────────────────────────────────────────────────────┘
+ [Bootable] [ Delete ] [ Quit ] [ Type ] [ Help ] [ Write ]
+ [ Dump ]
+
+ Quit program without writing changes
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using parted Command?
+
+**[parted][2]** is a program to manipulate disk partitions. It supports multiple partition table formats, including MS-DOS and GPT. It is useful for creating space for new operating systems, reorganising disk usage, and copying data to new hard disks.
+
+```
+# parted -l
+
+Model: ATA VBOX HARDDISK (scsi)
+Disk /dev/sda: 32.2GB
+Sector size (logical/physical): 512B/512B
+Partition Table: msdos
+Disk Flags:
+
+Number Start End Size Type File system Flags
+ 1 10.7GB 32.2GB 21.5GB primary ext4 boot
+
+
+Model: ATA VBOX HARDDISK (scsi)
+Disk /dev/sdb: 10.7GB
+Sector size (logical/physical): 512B/512B
+Partition Table: msdos
+Disk Flags:
+
+Model: ATA VBOX HARDDISK (scsi)
+Disk /dev/sdc: 10.7GB
+Sector size (logical/physical): 512B/512B
+Partition Table: msdos
+Disk Flags:
+
+Number Start End Size Type File system Flags
+ 1 1049kB 1075MB 1074MB primary ext2
+ 3 2149MB 3222MB 1074MB primary ext4
+ 4 3222MB 10.7GB 7515MB extended
+ 5 3223MB 4297MB 1074MB logical
+
+
+Model: ATA VBOX HARDDISK (scsi)
+Disk /dev/sdd: 10.7GB
+Sector size (logical/physical): 512B/512B
+Partition Table: msdos
+Disk Flags:
+
+Model: ATA VBOX HARDDISK (scsi)
+Disk /dev/sde: 10.7GB
+Sector size (logical/physical): 512B/512B
+Partition Table: msdos
+Disk Flags:
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using lsblk Command?
+
+lsblk lists information about all available or the specified block devices. The lsblk command reads the sysfs filesystem and udev db to gather information.
+
+If the udev db is not available or lsblk is compiled without udev support than it tries to read LABELs, UUIDs and filesystem types from the block device. In this case root permissions are necessary. The command prints all block devices (except RAM disks) in a tree-like format by default.
+
+```
+# lsblk
+NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
+sda 8:0 0 30G 0 disk
+└─sda1 8:1 0 20G 0 part /
+sdb 8:16 0 10G 0 disk
+sdc 8:32 0 10G 0 disk
+├─sdc1 8:33 0 1G 0 part /part1
+├─sdc3 8:35 0 1G 0 part /part2
+├─sdc4 8:36 0 1K 0 part
+└─sdc5 8:37 0 1G 0 part
+sdd 8:48 0 10G 0 disk
+sde 8:64 0 10G 0 disk
+sr0 11:0 1 1024M 0 rom
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using blkid Command?
+
+blkid is a command-line utility to locate/print block device attributes. It uses libblkid library to get disk partition UUID in Linux system.
+
+```
+# blkid
+/dev/sda1: UUID="d92fa769-e00f-4fd7-b6ed-ecf7224af7fa" TYPE="ext4" PARTUUID="eab59449-01"
+/dev/sdc1: UUID="d17e3c31-e2c9-4f11-809c-94a549bc43b7" TYPE="ext2" PARTUUID="8cc8f9e5-01"
+/dev/sdc3: UUID="ca307aa4-0866-49b1-8184-004025789e63" TYPE="ext4" PARTUUID="8cc8f9e5-03"
+/dev/sdc5: PARTUUID="8cc8f9e5-05"
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using hwinfo Command?
+
+**[hwinfo][3]** stands for hardware information tool is another great utility that used to probe for the hardware present in the system and display detailed information about varies hardware components in human readable format.
+
+```
+# hwinfo --block --short
+disk:
+ /dev/sdd VBOX HARDDISK
+ /dev/sdb VBOX HARDDISK
+ /dev/sde VBOX HARDDISK
+ /dev/sdc VBOX HARDDISK
+ /dev/sda VBOX HARDDISK
+partition:
+ /dev/sdc1 Partition
+ /dev/sdc3 Partition
+ /dev/sdc4 Partition
+ /dev/sdc5 Partition
+ /dev/sda1 Partition
+cdrom:
+ /dev/sr0 VBOX CD-ROM
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using lshw Command?
+
+**[lshw][4]** (stands for Hardware Lister) is a small nifty tool that generates detailed reports about various hardware components on the machine such as memory configuration, firmware version, mainboard configuration, CPU version and speed, cache configuration, usb, network card, graphics cards, multimedia, printers, bus speed, etc.
+
+```
+# lshw -short -class disk -class volume
+H/W path Device Class Description
+===================================================
+/0/3/0.0.0 /dev/cdrom disk CD-ROM
+/0/4/0.0.0 /dev/sda disk 32GB VBOX HARDDISK
+/0/4/0.0.0/1 /dev/sda1 volume 19GiB EXT4 volume
+/0/5/0.0.0 /dev/sdb disk 10GB VBOX HARDDISK
+/0/6/0.0.0 /dev/sdc disk 10GB VBOX HARDDISK
+/0/6/0.0.0/1 /dev/sdc1 volume 1GiB Linux filesystem partition
+/0/6/0.0.0/3 /dev/sdc3 volume 1GiB EXT4 volume
+/0/6/0.0.0/4 /dev/sdc4 volume 7167MiB Extended partition
+/0/6/0.0.0/4/5 /dev/sdc5 volume 1GiB Linux filesystem partition
+/0/7/0.0.0 /dev/sdd disk 10GB VBOX HARDDISK
+/0/8/0.0.0 /dev/sde disk 10GB VBOX HARDDISK
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using inxi Command?
+
+**[inxi][5]** is a nifty tool to check hardware information on Linux and offers wide range of option to get all the hardware information on Linux system that i never found in any other utility which are available in Linux. It was forked from the ancient and mindbendingly perverse yet ingenius infobash, by locsmif.
+
+```
+# inxi -Dp
+Drives: HDD Total Size: 75.2GB (22.3% used)
+ ID-1: /dev/sda model: VBOX_HARDDISK size: 32.2GB
+ ID-2: /dev/sdb model: VBOX_HARDDISK size: 10.7GB
+ ID-3: /dev/sdc model: VBOX_HARDDISK size: 10.7GB
+ ID-4: /dev/sdd model: VBOX_HARDDISK size: 10.7GB
+ ID-5: /dev/sde model: VBOX_HARDDISK size: 10.7GB
+Partition: ID-1: / size: 20G used: 16G (85%) fs: ext4 dev: /dev/sda1
+ ID-3: /part1 size: 1008M used: 1.3M (1%) fs: ext2 dev: /dev/sdc1
+ ID-4: /part2 size: 976M used: 2.6M (1%) fs: ext4 dev: /dev/sdc3
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using lsscsi Command?
+
+Uses information in sysfs (Linux kernel series 2.6 and later) to list SCSI devices (or hosts) currently attached to the system. Options can be used to control the amount and form of information provided for each device.
+
+By default in this utility device node names (e.g. “/dev/sda” or “/dev/root_disk”) are obtained by noting the major and minor numbers for the listed device obtained from sysfs
+
+```
+# lsscsi
+[0:0:0:0] cd/dvd VBOX CD-ROM 1.0 /dev/sr0
+[2:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sda
+[3:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sdb
+[4:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sdc
+[5:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sdd
+[6:0:0:0] disk ATA VBOX HARDDISK 1.0 /dev/sde
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using ProcFS?
+
+The proc filesystem (procfs) is a special filesystem in Unix-like operating systems that presents information about processes and other system information.
+
+It’s sometimes referred to as a process information pseudo-file system. It doesn’t contain ‘real’ files but runtime system information (e.g. system memory, devices mounted, hardware configuration, etc).
+
+```
+# cat /proc/partitions
+major minor #blocks name
+
+ 11 0 1048575 sr0
+ 8 0 31457280 sda
+ 8 1 20970496 sda1
+ 8 16 10485760 sdb
+ 8 32 10485760 sdc
+ 8 33 1048576 sdc1
+ 8 35 1048576 sdc3
+ 8 36 1 sdc4
+ 8 37 1048576 sdc5
+ 8 48 10485760 sdd
+ 8 64 10485760 sde
+```
+
+### How To Check Hard Disk And Hard Drive Partition In Linux Using /dev/disk Path?
+
+This directory contains four directories, it’s by-id, by-uuid, by-path and by-partuuid. Each directory contains some useful information and it’s symlinked with real block device files.
+
+```
+# ls -lh /dev/disk/by-id
+total 0
+lrwxrwxrwx 1 root root 9 Feb 2 23:08 ata-VBOX_CD-ROM_VB0-01f003f6 -> ../../sr0
+lrwxrwxrwx 1 root root 9 Feb 3 00:14 ata-VBOX_HARDDISK_VB26e827b5-668ab9f4 -> ../../sda
+lrwxrwxrwx 1 root root 10 Feb 3 00:14 ata-VBOX_HARDDISK_VB26e827b5-668ab9f4-part1 -> ../../sda1
+lrwxrwxrwx 1 root root 9 Feb 2 23:39 ata-VBOX_HARDDISK_VB3774c742-fb2b3e4e -> ../../sdd
+lrwxrwxrwx 1 root root 9 Feb 2 23:39 ata-VBOX_HARDDISK_VBe72672e5-029a918e -> ../../sdc
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 ata-VBOX_HARDDISK_VBe72672e5-029a918e-part1 -> ../../sdc1
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 ata-VBOX_HARDDISK_VBe72672e5-029a918e-part3 -> ../../sdc3
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 ata-VBOX_HARDDISK_VBe72672e5-029a918e-part4 -> ../../sdc4
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 ata-VBOX_HARDDISK_VBe72672e5-029a918e-part5 -> ../../sdc5
+lrwxrwxrwx 1 root root 9 Feb 2 23:39 ata-VBOX_HARDDISK_VBed1cf451-9f51c5f6 -> ../../sdb
+lrwxrwxrwx 1 root root 9 Feb 2 23:39 ata-VBOX_HARDDISK_VBf242dbdd-49a982eb -> ../../sde
+```
+
+Output of by-uuid
+
+```
+# ls -lh /dev/disk/by-uuid
+total 0
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 ca307aa4-0866-49b1-8184-004025789e63 -> ../../sdc3
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 d17e3c31-e2c9-4f11-809c-94a549bc43b7 -> ../../sdc1
+lrwxrwxrwx 1 root root 10 Feb 3 00:14 d92fa769-e00f-4fd7-b6ed-ecf7224af7fa -> ../../sda1
+```
+
+Output of by-path
+
+```
+# ls -lh /dev/disk/by-path
+total 0
+lrwxrwxrwx 1 root root 9 Feb 2 23:08 pci-0000:00:01.1-ata-1 -> ../../sr0
+lrwxrwxrwx 1 root root 9 Feb 3 00:14 pci-0000:00:0d.0-ata-1 -> ../../sda
+lrwxrwxrwx 1 root root 10 Feb 3 00:14 pci-0000:00:0d.0-ata-1-part1 -> ../../sda1
+lrwxrwxrwx 1 root root 9 Feb 2 23:39 pci-0000:00:0d.0-ata-2 -> ../../sdb
+lrwxrwxrwx 1 root root 9 Feb 2 23:39 pci-0000:00:0d.0-ata-3 -> ../../sdc
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 pci-0000:00:0d.0-ata-3-part1 -> ../../sdc1
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 pci-0000:00:0d.0-ata-3-part3 -> ../../sdc3
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 pci-0000:00:0d.0-ata-3-part4 -> ../../sdc4
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 pci-0000:00:0d.0-ata-3-part5 -> ../../sdc5
+lrwxrwxrwx 1 root root 9 Feb 2 23:39 pci-0000:00:0d.0-ata-4 -> ../../sdd
+lrwxrwxrwx 1 root root 9 Feb 2 23:39 pci-0000:00:0d.0-ata-5 -> ../../sde
+```
+
+Output of by-partuuid
+
+```
+# ls -lh /dev/disk/by-partuuid
+total 0
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 8cc8f9e5-01 -> ../../sdc1
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 8cc8f9e5-03 -> ../../sdc3
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 8cc8f9e5-04 -> ../../sdc4
+lrwxrwxrwx 1 root root 10 Feb 2 23:39 8cc8f9e5-05 -> ../../sdc5
+lrwxrwxrwx 1 root root 10 Feb 3 00:14 eab59449-01 -> ../../sda1
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-command-check-hard-disks-partitions/
+
+作者:[Vinoth Kumar][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/vinoth/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/linux-fdisk-command-to-manage-disk-partitions/
+[2]: https://www.2daygeek.com/how-to-manage-disk-partitions-using-parted-command/
+[3]: https://www.2daygeek.com/hwinfo-check-display-detect-system-hardware-information-linux/
+[4]: https://www.2daygeek.com/lshw-find-check-system-hardware-information-details-linux/
+[5]: https://www.2daygeek.com/inxi-system-hardware-information-on-linux/
diff --git a/sources/tech/20190205 5 Linux GUI Cloud Backup Tools.md b/sources/tech/20190205 5 Linux GUI Cloud Backup Tools.md
new file mode 100644
index 0000000000..45e0bf1342
--- /dev/null
+++ b/sources/tech/20190205 5 Linux GUI Cloud Backup Tools.md
@@ -0,0 +1,251 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (5 Linux GUI Cloud Backup Tools)
+[#]: via: (https://www.linux.com/blog/learn/2019/2/5-linux-gui-cloud-backup-tools)
+[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
+
+5 Linux GUI Cloud Backup Tools
+======
+
+
+We have reached a point in time where most every computer user depends upon the cloud … even if only as a storage solution. What makes the cloud really important to users, is when it’s employed as a backup. Why is that such a game changer? By backing up to the cloud, you have access to those files, from any computer you have associated with your cloud account. And because Linux powers the cloud, many services offer Linux tools.
+
+Let’s take a look at five such tools. I will focus on GUI tools, because they offer a much lower barrier to entry to many of the CLI tools. I’ll also be focusing on various, consumer-grade cloud services (e.g., [Google Drive][1], [Dropbox][2], [Wasabi][3], and [pCloud][4]). And, I will be demonstrating on the Elementary OS platform, but all of the tools listed will function on most Linux desktop distributions.
+
+Note: Of the following backup solutions, only Duplicati is licensed as open source. With that said, let’s see what’s available.
+
+### Insync
+
+I must confess, [Insync][5] has been my cloud backup of choice for a very long time. Since Google refuses to release a Linux desktop client for Google Drive (and I depend upon Google Drive daily), I had to turn to a third-party solution. Said solution is Insync. This particular take on syncing the desktop to Drive has not only been seamless, but faultless since I began using the tool.
+
+The cost of Insync is a one-time $29.99 fee (per Google account). Trust me when I say this tool is worth the price of entry. With Insync you not only get an easy-to-use GUI for managing your Google Drive backup and sync, you get a tool (Figure 1) that gives you complete control over what is backed up and how it is backed up. Not only that, but you can also install Nautilus integration (which also allows you to easy add folders outside of the configured Drive sync destination).
+
+![Insync app][7]
+
+Figure 1: The Insync app window on Elementary OS.
+
+[Used with permission][8]
+
+You can download Insync for Ubuntu (or its derivatives), Linux Mint, Debian, and Fedora from the [Insync download page][9]. Once you’ve installed Insync (and associated it with your account), you can then install Nautilus integration with these steps (demonstrating on Elementary OS):
+
+ 1. Open a terminal window and issue the command sudo nano /etc/apt/sources.list.d/insync.list.
+
+ 2. Paste the following into the new file: deb precise non-free contrib.
+
+ 3. Save and close the file.
+
+ 4. Update apt with the command sudo apt-get update.
+
+ 5. Install the necessary package with the command sudo apt-get install insync-nautilus.
+
+
+
+
+Allow the installation to complete. Once finished, restart Nautilus with the command nautilus -q (or log out and back into the desktop). You should now see an Insync entry in the Nautilus right-click context menu (Figure 2).
+
+
+
+Figure 2: Insync/Nautilus integration in action.
+
+[Used with permission][8]
+
+### Dropbox
+
+Although [Dropbox][2] drew the ire of many in the Linux community (by dropping support for all filesystems but unencrypted ext4), it still supports a great deal of Linux desktop deployments. In other words, if your distribution still uses the ext4 file system (and you do not opt to encrypt your full drive), you’re good to go.
+
+The good news is the Dropbox Linux desktop client is quite good. The tool offers a system tray icon that allows you to easily interact with your cloud syncing. Dropbox also includes CLI tools and a Nautilus integration (by way of an additional addon found [here][10]).
+
+The Linux Dropbox desktop sync tool works exactly as you’d expect. From the Dropbox system tray drop-down (Figure 3) you can open the Dropbox folder, launch the Dropbox website, view recently changed files, get more space, pause syncing, open the preferences window, find help, and quite Dropbox.
+
+![Dropbox][12]
+
+Figure 3: The Dropbox system tray drop-down on Elementary OS.
+
+[Used with permission][8]
+
+The Dropbox/Nautilus integration is an important component, as it makes quickly adding to your cloud backup seamless and fast. From the Nautilus file manager, locate and right-click the folder to bad added, and select Dropbox > Move to Dropbox (Figure 4).
+
+The only caveat to the Dropbox/Nautilus integration is that the only option is to move a folder to Dropbox. To some this might not be an option. The developers of this package would be wise to instead have the action create a link (instead of actually moving the folder).
+
+Outside of that one issue, the Dropbox cloud sync/backup solution for Linux is a great route to go.
+
+### pCloud
+
+pCloud might well be one of the finest cloud backup solutions you’ve never heard of. This take on cloud storage/backup includes features like:
+
+ * Encryption (subscription service required for this feature);
+
+ * Mobile apps for Android and iOS;
+
+ * Linux, Mac, and Windows desktop clients;
+
+ * Easy file/folder sharing;
+
+ * Built-in audio/video players;
+
+ * No file size limitation;
+
+ * Sync any folder from the desktop;
+
+ * Panel integration for most desktops; and
+
+ * Automatic file manager integration.
+
+
+
+
+pCloud offers both Linux desktop and CLI tools that function quite well. pCloud offers both a free plan (with 10GB of storage), a Premium Plan (with 500GB of storage for a one-time fee of $175.00), and a Premium Plus Plan (with 2TB of storage for a one-time fee of $350.00). Both non-free plans can also be paid on a yearly basis (instead of the one-time fee).
+
+The pCloud desktop client is quite user-friendly. Once installed, you have access to your account information (Figure 5), the ability to create sync pairs, create shares, enable crypto (which requires an added subscription), and general settings.
+
+![pCloud][14]
+
+Figure 5: The pCloud desktop client is incredibly easy to use.
+
+[Used with permission][8]
+
+The one caveat to pCloud is there’s no file manager integration for Linux. That’s overcome by the Sync folder in the pCloud client.
+
+### CloudBerry
+
+The primary focus for [CloudBerry][15] is for Managed Service Providers. The business side of CloudBerry does have an associated cost (one that is probably well out of the price range for the average user looking for a simple cloud backup solution). However, for home usage, CloudBerry is free.
+
+What makes CloudBerry different than the other tools is that it’s not a backup/storage solution in and of itself. Instead, CloudBerry serves as a link between your desktop and the likes of:
+
+ * AWS
+
+ * Microsoft Azure
+
+ * Google Cloud
+
+ * BackBlaze
+
+ * OpenStack
+
+ * Wasabi
+
+ * Local storage
+
+ * External drives
+
+ * Network Attached Storage
+
+ * Network Shares
+
+ * And more
+
+
+
+
+In other words, you use CloudBerry as the interface between the files/folders you want to share and the destination with which you want send them. This also means you must have an account with one of the many supported solutions.
+Once you’ve installed CloudBerry, you create a new Backup plan for the target storage solution. For that configuration, you’ll need such information as:
+
+ * Access Key
+
+ * Secret Key
+
+ * Bucket
+
+
+
+
+What you’ll need for the configuration will depend on the account you’re connecting to (Figure 6).
+
+![CloudBerry][17]
+
+Figure 6: Setting up a CloudBerry backup for Wasabi.
+
+[Used with permission][8]
+
+The one caveat to CloudBerry is that it does not integrate with any file manager, nor does it include a system tray icon for interaction with the service.
+
+### Duplicati
+
+[Duplicati][18] is another option that allows you to sync your local directories with either locally attached drives, network attached storage, or a number of cloud services. The options supported include:
+
+ * Local folders
+
+ * Attached drives
+
+ * FTP/SFTP
+
+ * OpenStack
+
+ * WebDAV
+
+ * Amazon Cloud Drive
+
+ * Amazon S3
+
+ * Azure Blob
+
+ * Box.com
+
+ * Dropbox
+
+ * Google Cloud Storage
+
+ * Google Drive
+
+ * Microsoft OneDrive
+
+ * And many more
+
+
+
+
+Once you install Duplicati (download the installer for Debian, Ubuntu, Fedora, or RedHat from the [Duplicati downloads page][19]), click on the entry in your desktop menu, which will open a web page to the tool (Figure 7), where you can configure the app settings, create a new backup, restore from a backup, and more.
+
+
+
+To create a backup, click Add backup and walk through the easy-to-use wizard (Figure 8). The backup service you choose will dictate what you need for a successful configuration.
+
+![Duplicati backup][21]
+
+Figure 8: Creating a new Duplicati backup for Google Drive.
+
+[Used with permission][8]
+
+For example, in order to create a backup to Google Drive, you’ll need an AuthID. For that, click the AuthID link in the Destination section of the setup, where you’ll be directed to select the Google Account to associate with the backup. Once you’ve allowed Duplicati access to the account, the AuthID will fill in and you’re ready to continue. Click Test connection and you’ll be asked to okay the creation of a new folder (if necessary). Click Next to complete the setup of the backup.
+
+### More Where That Came From
+
+These five cloud backup tools aren’t the end of this particular rainbow. There are plenty more options where these came from (including CLI-only tools). But any of these backup clients will do a great job of serving your Linux desktop-to-cloud backup needs.
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/learn/2019/2/5-linux-gui-cloud-backup-tools
+
+作者:[Jack Wallen][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/jlwallen
+[b]: https://github.com/lujun9972
+[1]: https://www.google.com/drive/
+[2]: https://www.dropbox.com/
+[3]: https://wasabi.com/
+[4]: https://www.pcloud.com/
+[5]: https://www.insynchq.com/
+[6]: /files/images/insync1jpg
+[7]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/insync_1.jpg?itok=_SDP77uE (Insync app)
+[8]: /licenses/category/used-permission
+[9]: https://www.insynchq.com/downloads
+[10]: https://www.dropbox.com/install-linux
+[11]: /files/images/dropbox1jpg
+[12]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/dropbox_1.jpg?itok=BYbg-sKB (Dropbox)
+[13]: /files/images/pcloud1jpg
+[14]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/pcloud_1.jpg?itok=cAUz8pya (pCloud)
+[15]: https://www.cloudberrylab.com
+[16]: /files/images/cloudberry1jpg
+[17]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/cloudberry_1.jpg?itok=s0aP5xuN (CloudBerry)
+[18]: https://www.duplicati.com/
+[19]: https://www.duplicati.com/download
+[20]: /files/images/duplicati2jpg
+[21]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/duplicati_2.jpg?itok=Xkn8s3jg (Duplicati backup)
diff --git a/sources/tech/20190205 5 Streaming Audio Players for Linux.md b/sources/tech/20190205 5 Streaming Audio Players for Linux.md
new file mode 100644
index 0000000000..1ddd4552f5
--- /dev/null
+++ b/sources/tech/20190205 5 Streaming Audio Players for Linux.md
@@ -0,0 +1,172 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (5 Streaming Audio Players for Linux)
+[#]: via: (https://www.linux.com/blog/2019/2/5-streaming-audio-players-linux)
+[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
+
+5 Streaming Audio Players for Linux
+======
+
+
+As I work, throughout the day, music is always playing in the background. Most often, that music is in the form of vinyl spinning on a turntable. But when I’m not in purist mode, I’ll opt to listen to audio by way of a streaming app. Naturally, I’m on the Linux platform, so the only tools I have at my disposal are those that play well on my operating system of choice. Fortunately, plenty of options exist for those who want to stream audio to their Linux desktops.
+
+In fact, Linux offers a number of solid offerings for music streaming, and I’ll highlight five of my favorite tools for this task. A word of warning, not all of these players are open source. But if you’re okay running a proprietary app on your open source desktop, you have some really powerful options. Let’s take a look at what’s available.
+
+### Spotify
+
+Spotify for Linux isn’t some dumb-downed, half-baked app that crashes every other time you open it, and doesn’t offer the full-range of features found on the macOS and Windows equivalent. In fact, the Linux version of Spotify is exactly the same as you’ll find on other platforms. With the Spotify streaming client you can listen to music and podcasts, create playlists, discover new artists, and so much more. And the Spotify interface (Figure 1) is quite easy to navigate and use.
+
+![Spotify][2]
+
+Figure 1: The Spotify interface makes it easy to find new music and old favorites.
+
+[Used with permission][3]
+
+You can install Spotify either using snap (with the command sudo snap install spotify), or from the official repository, with the following commands:
+
+ * sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 931FF8E79F0876134EDDBDCCA87FF9DF48BF1C90
+
+ * sudo echo deb stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list
+
+ * sudo apt-get update
+
+ * sudo apt-get install spotify-client
+
+
+
+
+Once installed, you’ll want to log into your Spotify account, so you can start streaming all of the great music to help motivate you to get your work done. If you have Spotify installed on other devices (and logged into the same account), you can dictate to which device the music should stream (by clicking the Devices Available icon near the bottom right corner of the Spotify window).
+
+### Clementine
+
+Clementine one of the best music players available to the Linux platform. Clementine not only allows user to play locally stored music, but to connect to numerous streaming audio services, such as:
+
+ * Amazon Cloud Drive
+
+ * Box
+
+ * Dropbox
+
+ * Icecast
+
+ * Jamendo
+
+ * Magnatune
+
+ * RockRadio.com
+
+ * Radiotunes.com
+
+ * SomaFM
+
+ * SoundCloud
+
+ * Spotify
+
+ * Subsonic
+
+ * Vk.com
+
+ * Or internet radio streams
+
+
+
+
+There are two caveats to using Clementine. The first is you must be using the most recent version (as the build available in some repositories is out of date and won’t install the necessary streaming plugins). Second, even with the most recent build, some streaming services won’t function as expected. For example, with Spotify, you’ll only have available to you the Top Tracks (and not your playlist … or the ability to search for songs).
+
+With Clementine Internet radio streaming, you’ll find musicians and bands you’ve never heard of (Figure 2), and plenty of them to tune into.
+
+![Clementine][5]
+
+Figure 2: Clementine Internet radio is a great way to find new music.
+
+[Used with permission][3]
+
+### Odio
+
+Odio is a cross-platform, proprietary app (available for Linux, MacOS, and Windows) that allows you to stream internet music stations of all genres. Radio stations are curated from [www.radio-browser.info][6] and the app itself does an incredible job of presenting the streams for you (Figure 3).
+
+
+![Odio][8]
+
+Figure 3: The Odio interface is one of the best you’ll find.
+
+[Used with permission][3]
+
+Odio makes it very easy to find unique Internet radio stations and even add those you find and enjoy to your library. Currently, the only way to install Odio on Linux is via Snap. If your distribution supports snap packages, install this streaming app with the command:
+
+sudo snap install odio
+
+Once installed, you can open the app and start using it. There is no need to log into (or create) an account. Odio is very limited in its settings. In fact, it only offers the choice between a dark or light theme in the settings window. However, as limited as it might be, Odio is one of your best bets for playing Internet radio on Linux.
+
+Streamtuner2 is an outstanding Internet radio station GUI tool. With it you can stream music from the likes of:
+
+ * Internet radio stations
+
+ * Jameno
+
+ * MyOggRadio
+
+ * Shoutcast.com
+
+ * SurfMusic
+
+ * TuneIn
+
+ * Xiph.org
+
+ * YouTube
+
+
+### StreamTuner2
+
+Streamtuner2 offers a nice (if not slightly outdated) interface, that makes it quite easy to find and stream your favorite music. The one caveat with StreamTuner2 is that it’s really just a GUI for finding the streams you want to hear. When you find a station, double-click on it to open the app associated with the stream. That means you must have the necessary apps installed, in order for the streams to play. If you don’t have the proper apps, you can’t play the streams. Because of this, you’ll spend a good amount of time figuring out what apps to install for certain streams (Figure 4).
+
+![Streamtuner2][10]
+
+Figure 4: Configuring Streamtuner2 isn’t for the faint of heart.
+
+[Used with permission][3]
+
+### VLC
+
+VLC has been, for a very long time, dubbed the best media playback tool for Linux. That’s with good reason, as it can play just about anything you throw at it. Included in that list is streaming radio stations. Although you won’t find VLC connecting to the likes of Spotify, you can head over to Internet-Radio, click on a playlist and have VLC open it without a problem. And considering how many internet radio stations are available at the moment, you won’t have any problem finding music to suit your tastes. VLC also includes tools like visualizers, equalizers (Figure 5), and more.
+
+![VLC ][12]
+
+Figure 5: The VLC visualizer and equalizer features in action.
+
+[Used with permission][3]
+
+The only caveat to VLC is that you do have to have a URL for the Internet Radio you wish you hear, as the tool itself doesn’t curate. But with those links in hand, you won’t find a better media player than VLC.
+
+### Always More Where That Came From
+
+If one of these five tools doesn’t fit your needs, I suggest you open your distribution’s app store and search for one that will. There are plenty of tools to make streaming music, podcasts, and more not only possible on Linux, but easy.
+
+Learn more about Linux through the free ["Introduction to Linux" ][13] course from The Linux Foundation and edX.
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/2019/2/5-streaming-audio-players-linux
+
+作者:[Jack Wallen][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/jlwallen
+[b]: https://github.com/lujun9972
+[2]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/spotify_0.jpg?itok=8-Ym-R61 (Spotify)
+[3]: https://www.linux.com/licenses/category/used-permission
+[5]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/clementine_0.jpg?itok=5oODJO3b (Clementine)
+[6]: http://www.radio-browser.info
+[8]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/odio.jpg?itok=sNPTSS3c (Odio)
+[10]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/streamtuner2.jpg?itok=1MSbafWj (Streamtuner2)
+[12]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/vlc_0.jpg?itok=QEOsq7Ii (VLC )
+[13]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
diff --git a/sources/tech/20190205 CFS- Completely fair process scheduling in Linux.md b/sources/tech/20190205 CFS- Completely fair process scheduling in Linux.md
new file mode 100644
index 0000000000..be44e75fea
--- /dev/null
+++ b/sources/tech/20190205 CFS- Completely fair process scheduling in Linux.md
@@ -0,0 +1,122 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (CFS: Completely fair process scheduling in Linux)
+[#]: via: (https://opensource.com/article/19/2/fair-scheduling-linux)
+[#]: author: (Marty kalin https://opensource.com/users/mkalindepauledu)
+
+CFS: Completely fair process scheduling in Linux
+======
+CFS gives every task a fair share of processor resources in a low-fuss but highly efficient way.
+
+
+Linux takes a modular approach to processor scheduling in that different algorithms can be used to schedule different process types. A scheduling class specifies which scheduling policy applies to which type of process. Completely fair scheduling (CFS), which became part of the Linux 2.6.23 kernel in 2007, is the scheduling class for normal (as opposed to real-time) processes and therefore is named **SCHED_NORMAL**.
+
+CFS is geared for the interactive applications typical in a desktop environment, but it can be configured as **SCHED_BATCH** to favor the batch workloads common, for example, on a high-volume web server. In any case, CFS breaks dramatically with what might be called "classic preemptive scheduling." Also, the "completely fair" claim has to be seen with a technical eye; otherwise, the claim might seem like an empty boast.
+
+Let's dig into the details of what sets CFS apart from—indeed, above—other process schedulers. Let's start with a quick review of some core technical terms.
+
+### Some core concepts
+
+Linux inherits the Unix view of a process as a program in execution. As such, a process must contend with other processes for shared system resources: memory to hold instructions and data, at least one processor to execute instructions, and I/O devices to interact with the external world. Process scheduling is how the operating system (OS) assigns tasks (e.g., crunching some numbers, copying a file) to processors—a running process then performs the task. A process has one or more threads of execution, which are sequences of machine-level instructions. To schedule a process is to schedule one of its threads on a processor.
+
+In a simplifying move, Linux turns process scheduling into thread scheduling by treating a scheduled process as if it were single-threaded. If a process is multi-threaded with N threads, then N scheduling actions would be required to cover the threads. Threads within a multi-threaded process remain related in that they share resources such as memory address space. Linux threads are sometimes described as lightweight processes, with the lightweight underscoring the sharing of resources among the threads within a process.
+
+Although a process can be in various states, two are of particular interest in scheduling. A blocked process is awaiting the completion of some event such as an I/O event. The process can resume execution only after the event completes. A runnable process is one that is not currently blocked.
+
+A process is processor-bound (aka compute-bound) if it consumes mostly processor as opposed to I/O resources, and I/O-bound in the opposite case; hence, a processor-bound process is mostly runnable, whereas an I/O-bound process is mostly blocked. As examples, crunching numbers is processor-bound, and accessing files is I/O-bound. Although an entire process might be characterized as either processor-bound or I/O-bound, a given process may be one or the other during different stages of its execution. Interactive desktop applications, such as browsers, tend to be I/O-bound.
+
+A good process scheduler has to balance the needs of processor-bound and I/O-bound tasks, especially in an operating system such as Linux that thrives on so many hardware platforms: desktop machines, embedded devices, mobile devices, server clusters, supercomputers, and more.
+
+### Classic preemptive scheduling versus CFS
+
+Unix popularized classic preemptive scheduling, which other operating systems including VAX/VMS, Windows NT, and Linux later adopted. At the center of this scheduling model is a fixed timeslice, the amount of time (e.g., 50ms) that a task is allowed to hold a processor until preempted in favor of some other task. If a preempted process has not finished its work, the process must be rescheduled. This model is powerful in that it supports multitasking (concurrency) through processor time-sharing, even on the single-CPU machines of yesteryear.
+
+The classic model typically includes multiple scheduling queues, one per process priority: Every process in a higher-priority queue gets scheduled before any process in a lower-priority queue. As an example, VAX/VMS uses 32 priority queues for scheduling.
+
+CFS dispenses with fixed timeslices and explicit priorities. The amount of time for a given task on a processor is computed dynamically as the scheduling context changes over the system's lifetime. Here is a sketch of the motivating ideas and technical details:
+
+ * Imagine a processor, P, which is idealized in that it can execute multiple tasks simultaneously. For example, tasks T1 and T2 can execute on P at the same time, with each receiving 50% of P's magical processing power. This idealization describes perfect multitasking, which CFS strives to achieve on actual as opposed to idealized processors. CFS is designed to approximate perfect multitasking.
+
+ * The CFS scheduler has a target latency, which is the minimum amount of time—idealized to an infinitely small duration—required for every runnable task to get at least one turn on the processor. If such a duration could be infinitely small, then each runnable task would have had a turn on the processor during any given timespan, however small (e.g., 10ms, 5ns, etc.). Of course, an idealized infinitely small duration must be approximated in the real world, and the default approximation is 20ms. Each runnable task then gets a 1/N slice of the target latency, where N is the number of tasks. For example, if the target latency is 20ms and there are four contending tasks, then each task gets a timeslice of 5ms. By the way, if there is only a single task during a scheduling event, this lucky task gets the entire target latency as its slice. The fair in CFS comes to the fore in the 1/N slice given to each task contending for a processor.
+
+ * The 1/N slice is, indeed, a timeslice—but not a fixed one because such a slice depends on N, the number of tasks currently contending for the processor. The system changes over time. Some processes terminate and new ones are spawned; runnable processes block and blocked processes become runnable. The value of N is dynamic and so, therefore, is the 1/N timeslice computed for each runnable task contending for a processor. The traditional **nice** value is used to weight the 1/N slice: a low-priority **nice** value means that only some fraction of the 1/N slice is given to a task, whereas a high-priority **nice** value means that a proportionately greater fraction of the 1/N slice is given to a task. In summary, **nice** values do not determine the slice, but only modify the 1/N slice that represents fairness among the contending tasks.
+
+ * The operating system incurs overhead whenever a context switch occurs; that is, when one process is preempted in favor of another. To keep this overhead from becoming unduly large, there is a minimum amount of time (with a typical setting of 1ms to 4ms) that any scheduled process must run before being preempted. This minimum is known as the minimum granularity. If many tasks (e.g., 20) are contending for the processor, then the minimum granularity (assume 4ms) might be more than the 1/N slice (in this case, 1ms). If the minimum granularity turns out to be larger than the 1/N slice, the system is overloaded because there are too many tasks contending for the processor—and fairness goes out the window.
+
+ * When does preemption occur? CFS tries to minimize context switches, given their overhead: time spent on a context switch is time unavailable for other tasks. Accordingly, once a task gets the processor, it runs for its entire weighted 1/N slice before being preempted in favor of some other task. Suppose task T1 has run for its weighted 1/N slice, and runnable task T2 currently has the lowest virtual runtime (vruntime) among the tasks contending for the processor. The vruntime records, in nanoseconds, how long a task has run on the processor. In this case, T1 would be preempted in favor of T2.
+
+ * The scheduler tracks the vruntime for all tasks, runnable and blocked. The lower a task's vruntime, the more deserving the task is for time on the processor. CFS accordingly moves low-vruntime tasks towards the front of the scheduling line. Details are forthcoming because the line is implemented as a tree, not a list.
+
+ * How often should the CFS scheduler reschedule? There is a simple way to determine the scheduling period. Suppose that the target latency (TL) is 20ms and the minimum granularity (MG) is 4ms:
+
+`TL / MG = (20 / 4) = 5 ## five or fewer tasks are ok`
+
+In this case, five or fewer tasks would allow each task a turn on the processor during the target latency. For example, if the task number is five, each runnable task has a 1/N slice of 4ms, which happens to equal the minimum granularity; if the task number is three, each task gets a 1/N slice of almost 7ms. In either case, the scheduler would reschedule in 20ms, the duration of the target latency.
+
+Trouble occurs if the number of tasks (e.g., 10) exceeds TL / MG because now each task must get the minimum time of 4ms instead of the computed 1/N slice, which is 2ms. In this case, the scheduler would reschedule in 40ms:
+
+`(number of tasks) core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated MG = (10 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 4) = 40ms ## period = 40ms`
+
+
+
+
+Linux schedulers that predate CFS use heuristics to promote the fair treatment of interactive tasks with respect to scheduling. CFS takes a quite different approach by letting the vruntime facts speak mostly for themselves, which happens to support sleeper fairness. An interactive task, by its very nature, tends to sleep a lot in the sense that it awaits user inputs and so becomes I/O-bound; hence, such a task tends to have a relatively low vruntime, which tends to move the task towards the front of the scheduling line.
+
+### Special features
+
+CFS supports symmetrical multiprocessing (SMP) in which any process (whether kernel or user) can execute on any processor. Yet configurable scheduling domains can be used to group processors for load balancing or even segregation. If several processors share the same scheduling policy, then load balancing among them is an option; if a particular processor has a scheduling policy different from the others, then this processor would be segregated from the others with respect to scheduling.
+
+Configurable scheduling groups are another CFS feature. As an example, consider the Nginx web server that's running on my desktop machine. At startup, this server has a master process and four worker processes, which act as HTTP request handlers. For any HTTP request, the particular worker that handles the request is irrelevant; it matters only that the request is handled in a timely manner, and so the four workers together provide a pool from which to draw a task-handler as requests come in. It thus seems fair to treat the four Nginx workers as a group rather than as individuals for scheduling purposes, and a scheduling group can be used to do just that. The four Nginx workers could be configured to have a single vruntime among them rather than individual vruntimes. Configuration is done in the traditional Linux way, through files. For vruntime-sharing, a file named **cpu.shares** , with the details given through familiar shell commands, would be created.
+
+As noted earlier, Linux supports scheduling classes so that different scheduling policies, together with their implementing algorithms, can coexist on the same platform. A scheduling class is implemented as a code module in C. CFS, the scheduling class described so far, is **SCHED_NORMAL**. There are also scheduling classes specifically for real-time tasks, **SCHED_FIFO** (first in, first out) and **SCHED_RR** (round robin). Under **SCHED_FIFO** , tasks run to completion; under **SCHED_RR** , tasks run until they exhaust a fixed timeslice and are preempted.
+
+### CFS implementation
+
+CFS requires efficient data structures to track task information and high-performance code to generate the schedules. Let's begin with a central term in scheduling, the runqueue. This is a data structure that represents a timeline for scheduled tasks. Despite the name, the runqueue need not be implemented in the traditional way, as a FIFO list. CFS breaks with tradition by using a time-ordered red-black tree as a runqueue. The data structure is well-suited for the job because it is a self-balancing binary search tree, with efficient **insert** and **remove** operations that execute in **O(log N)** time, where N is the number of nodes in the tree. Also, a tree is an excellent data structure for organizing entities into a hierarchy based on a particular property, in this case a vruntime.
+
+In CFS, the tree's internal nodes represent tasks to be scheduled, and the tree as a whole, like any runqueue, represents a timeline for task execution. Red-black trees are in wide use beyond scheduling; for example, Java uses this data structure to implement its **TreeMap**.
+
+Under CFS, every processor has a specific runqueue of tasks, and no task occurs at the same time in more than one runqueue. Each runqueue is a red-black tree. The tree's internal nodes represent tasks or task groups, and these nodes are indexed by their vruntime values so that (in the tree as a whole or in any subtree) the internal nodes to the left have lower vruntime values than the ones to the right:
+
+```
+ 25 ## 25 is a task vruntime
+ /\
+ 17 29 ## 17 roots the left subtree, 29 the right one
+ /\ ...
+ 5 19 ## and so on
+... \
+ nil ## leaf nodes are nil
+```
+
+In summary, tasks with the lowest vruntime—and, therefore, the greatest need for a processor—reside somewhere in the left subtree; tasks with relatively high vruntimes congregate in the right subtree. A preempted task would go into the right subtree, thus giving other tasks a chance to move leftwards in the tree. A task with the smallest vruntime winds up in the tree's leftmost (internal) node, which is thus the front of the runqueue.
+
+The CFS scheduler has an instance, the C **task_struct** , to track detailed information about each task to be scheduled. This structure embeds a **sched_entity** structure, which in turn has scheduling-specific information, in particular, the vruntime per task or task group:
+
+```
+struct task_struct { /bin /boot /dev /etc /home /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var info on a task **/
+ ...
+ struct sched_entity se; /** vruntime, etc. **/
+ ...
+};
+```
+
+The red-black tree is implemented in familiar C fashion, with a premium on pointers for efficiency. A **cfs_rq** structure instance embeds a **rb_root** field named **tasks_timeline** , which points to the root of a red-black tree. Each of the tree's internal nodes has pointers to the parent and the two child nodes; the leaf nodes have nil as their value.
+
+CFS illustrates how a straightforward idea—give every task a fair share of processor resources—can be implemented in a low-fuss but highly efficient way. It's worth repeating that CFS achieves fair and efficient scheduling without traditional artifacts such as fixed timeslices and explicit task priorities. The pursuit of even better schedulers goes on, of course; for the moment, however, CFS is as good as it gets for general-purpose processor scheduling.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/fair-scheduling-linux
+
+作者:[Marty kalin][a]
+选题:[lujun9972][b]
+译者:[译者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/mkalindepauledu
+[b]: https://github.com/lujun9972
diff --git a/sources/tech/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md b/sources/tech/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md
new file mode 100644
index 0000000000..13b441f85d
--- /dev/null
+++ b/sources/tech/20190205 Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS.md
@@ -0,0 +1,443 @@
+[#]: collector: (lujun9972)
+[#]: translator: (ustblixin)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS)
+[#]: via: (https://www.ostechnix.com/install-apache-mysql-php-lamp-stack-on-ubuntu-18-04-lts/)
+[#]: author: (SK https://www.ostechnix.com/author/sk/)
+
+Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS
+======
+
+
+
+**LAMP** stack is a popular, open source web development platform that can be used to run and deploy dynamic websites and web-based applications. Typically, LAMP stack consists of Apache webserver, MariaDB/MySQL databases, PHP/Python/Perl programming languages. LAMP is the acronym of **L** inux, **M** ariaDB/ **M** YSQL, **P** HP/ **P** ython/ **P** erl. This tutorial describes how to install Apache, MySQL, PHP (LAMP stack) in Ubuntu 18.04 LTS server.
+
+### Install Apache, MySQL, PHP (LAMP) Stack On Ubuntu 18.04 LTS
+
+For the purpose of this tutorial, we will be using the following Ubuntu testbox.
+
+ * **Operating System** : Ubuntu 18.04.1 LTS Server Edition
+ * **IP address** : 192.168.225.22/24
+
+
+
+#### 1. Install Apache web server
+
+First of all, update Ubuntu server using commands:
+
+```
+$ sudo apt update
+
+$ sudo apt upgrade
+```
+
+Next, install Apache web server:
+
+```
+$ sudo apt install apache2
+```
+
+Check if Apache web server is running or not:
+
+```
+$ sudo systemctl status apache2
+```
+
+Sample output would be:
+
+```
+● apache2.service - The Apache HTTP Server
+ Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: en
+ Drop-In: /lib/systemd/system/apache2.service.d
+ └─apache2-systemd.conf
+ Active: active (running) since Tue 2019-02-05 10:48:03 UTC; 1min 5s ago
+ Main PID: 2025 (apache2)
+ Tasks: 55 (limit: 2320)
+ CGroup: /system.slice/apache2.service
+ ├─2025 /usr/sbin/apache2 -k start
+ ├─2027 /usr/sbin/apache2 -k start
+ └─2028 /usr/sbin/apache2 -k start
+
+Feb 05 10:48:02 ubuntuserver systemd[1]: Starting The Apache HTTP Server...
+Feb 05 10:48:03 ubuntuserver apachectl[2003]: AH00558: apache2: Could not reliably
+Feb 05 10:48:03 ubuntuserver systemd[1]: Started The Apache HTTP Server.
+```
+
+Congratulations! Apache service is up and running!!
+
+##### 1.1 Adjust firewall to allow Apache web server
+
+By default, the apache web browser can’t be accessed from remote systems if you have enabled the UFW firewall in Ubuntu 18.04 LTS. You must allow the http and https ports by following the below steps.
+
+First, list out the application profiles available on your Ubuntu system using command:
+
+```
+$ sudo ufw app list
+```
+
+Sample output:
+
+```
+Available applications:
+Apache
+Apache Full
+Apache Secure
+OpenSSH
+```
+
+As you can see, Apache and OpenSSH applications have installed UFW profiles. You can list out information about each profile and its included rules using “ **ufw app info “Profile Name”** command.
+
+Let us look into the **“Apache Full”** profile. To do so, run:
+
+```
+$ sudo ufw app info "Apache Full"
+```
+
+Sample output:
+
+```
+Profile: Apache Full
+Title: Web Server (HTTP,HTTPS)
+Description: Apache v2 is the next generation of the omnipresent Apache web
+server.
+
+Ports:
+80,443/tcp
+```
+
+As you see, “Apache Full” profile has included the rules to enable traffic to the ports **80** and **443** :
+
+Now, run the following command to allow incoming HTTP and HTTPS traffic for this profile:
+
+```
+$ sudo ufw allow in "Apache Full"
+Rules updated
+Rules updated (v6)
+```
+
+If you don’t want to allow https traffic, but only http (80) traffic, run:
+
+```
+$ sudo ufw app info "Apache"
+```
+
+##### 1.2 Test Apache Web server
+
+Now, open your web browser and access Apache test page by navigating to **** or ****.
+
+
+
+If you are see a screen something like above, you are good to go. Apache server is working!
+
+#### 2. Install MySQL
+
+To install MySQL On Ubuntu, run:
+
+```
+$ sudo apt install mysql-server
+```
+
+Verify if MySQL service is running or not using command:
+
+```
+$ sudo systemctl status mysql
+```
+
+**Sample output:**
+
+```
+● mysql.service - MySQL Community Server
+Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enab
+Active: active (running) since Tue 2019-02-05 11:07:50 UTC; 17s ago
+Main PID: 3423 (mysqld)
+Tasks: 27 (limit: 2320)
+CGroup: /system.slice/mysql.service
+└─3423 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
+
+Feb 05 11:07:49 ubuntuserver systemd[1]: Starting MySQL Community Server...
+Feb 05 11:07:50 ubuntuserver systemd[1]: Started MySQL Community Server.
+```
+
+Mysql is running!
+
+##### 2.1 Setup database administrative user (root) password
+
+By default, MySQL **root** user password is blank. You need to secure your MySQL server by running the following script:
+
+```
+$ sudo mysql_secure_installation
+```
+
+You will be asked whether you want to setup **VALIDATE PASSWORD plugin** or not. This plugin allows the users to configure strong password for database credentials. If enabled, It will automatically check the strength of the password and enforces the users to set only those passwords which are secure enough. **It is safe to leave this plugin disabled**. However, you must use a strong and unique password for database credentials. If don’t want to enable this plugin, just press any key to skip the password validation part and continue the rest of the steps.
+
+If your answer is **Yes** , you will be asked to choose the level of password validation.
+
+```
+Securing the MySQL server deployment.
+
+Connecting to MySQL using a blank password.
+
+VALIDATE PASSWORD PLUGIN can be used to test passwords
+and improve security. It checks the strength of password
+and allows the users to set only those passwords which are
+secure enough. Would you like to setup VALIDATE PASSWORD plugin?
+
+Press y|Y for Yes, any other key for No y
+```
+
+The available password validations are **low** , **medium** and **strong**. Just enter the appropriate number (0 for low, 1 for medium and 2 for strong password) and hit ENTER key.
+
+```
+There are three levels of password validation policy:
+
+LOW Length >= 8
+MEDIUM Length >= 8, numeric, mixed case, and special characters
+STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
+
+Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
+```
+
+Now, enter the password for MySQL root user. Please be mindful that you must use password for mysql root user depending upon the password policy you choose in the previous step. If you didn’t enable the plugin, just use any strong and unique password of your choice.
+
+```
+Please set the password for root here.
+
+New password:
+
+Re-enter new password:
+
+Estimated strength of the password: 50
+Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
+```
+
+Once you entered the password twice, you will see the password strength (In our case it is **50** ). If it is OK for you, press Y to continue with the provided password. If not satisfied with password length, press any other key and set a strong password. I am OK with my current password, so I chose **y**.
+
+For the rest of questions, just type **y** and hit ENTER. This will remove anonymous user, disallow root user login remotely and remove test database.
+
+```
+Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
+Success.
+
+Normally, root should only be allowed to connect from
+'localhost'. This ensures that someone cannot guess at
+the root password from the network.
+
+Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
+Success.
+
+By default, MySQL comes with a database named 'test' that
+anyone can access. This is also intended only for testing,
+and should be removed before moving into a production
+environment.
+
+Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
+- Dropping test database...
+Success.
+
+- Removing privileges on test database...
+Success.
+
+Reloading the privilege tables will ensure that all changes
+made so far will take effect immediately.
+
+Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
+Success.
+
+All done!
+```
+
+That’s it. Password for MySQL root user has been set.
+
+##### 2.2 Change authentication method for MySQL root user
+
+By default, MySQL root user is set to authenticate using the **auth_socket** plugin in MySQL 5.7 and newer versions on Ubuntu. Even though it enhances the security, it will also complicate things when you access your database server using any external programs, for example phpMyAdmin. To fix this issue, you need to change authentication method from **auth_socket** to **mysql_native_password**. To do so, login to your MySQL prompt using command:
+
+```
+$ sudo mysql
+```
+
+Run the following command at the mysql prompt to find the current authentication method for all mysql user accounts:
+
+```
+SELECT user,authentication_string,plugin,host FROM mysql.user;
+```
+
+**Sample output:**
+
+```
++------------------|-------------------------------------------|-----------------------|-----------+
+| user | authentication_string | plugin | host |
++------------------|-------------------------------------------|-----------------------|-----------+
+| root | | auth_socket | localhost |
+| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
+| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
+| debian-sys-maint | *F126737722832701DD3979741508F05FA71E5BA0 | mysql_native_password | localhost |
++------------------|-------------------------------------------|-----------------------|-----------+
+4 rows in set (0.00 sec)
+```
+
+![][2]
+
+As you see, mysql root user uses `auth_socket` plugin for authentication.
+
+To change this authentication to **mysql_native_password** method, run the following command at mysql prompt. Don’t forget to replace **“password”** with a strong and unique password of your choice. If you have enabled VALIDATION plugin, make sure you have used a strong password based on the current policy requirements.
+
+```
+ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
+```
+
+Update the changes using command:
+
+```
+FLUSH PRIVILEGES;
+```
+
+Now check again if the authentication method is changed or not using command:
+
+```
+SELECT user,authentication_string,plugin,host FROM mysql.user;
+```
+
+Sample output:
+
+![][3]
+
+Good! Now the myql root user can authenticate using password to access mysql shell.
+
+Exit from the mysql prompt:
+
+```
+exit
+```
+
+#### 3\. Install PHP
+
+To install PHP, run:
+
+```
+$ sudo apt install php libapache2-mod-php php-mysql
+```
+
+After installing PHP, create **info.php** file in the Apache root document folder. Usually, the apache root document folder will be **/var/www/html/** or **/var/www/** in most Debian based Linux distributions. In Ubuntu 18.04 LTS, it is **/var/www/html/**.
+
+Let us create **info.php** file in the apache root folder:
+
+```
+$ sudo vi /var/www/html/info.php
+```
+
+Add the following lines:
+
+```
+
+```
+
+Press ESC key and type **:wq** to save and quit the file. Restart apache service to take effect the changes.
+
+```
+$ sudo systemctl restart apache2
+```
+
+##### 3.1 Test PHP
+
+Open up your web browser and navigate to **** URL.
+
+You will see the php test page now.
+
+
+
+Usually, when a user requests a directory from the web server, Apache will first look for a file named **index.html**. If you want to change Apache to serve php files rather than others, move **index.php** to first position in the **dir.conf** file as shown below
+
+```
+$ sudo vi /etc/apache2/mods-enabled/dir.conf
+```
+
+Here is the contents of the above file.
+
+```
+
+DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
+
+
+# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
+```
+
+Move the “index.php” file to first. Once you made the changes, your **dir.conf** file will look like below.
+
+```
+
+DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
+
+
+# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
+```
+
+Press **ESC** key and type **:wq** to save and close the file. Restart Apache service to take effect the changes.
+
+```
+$ sudo systemctl restart apache2
+```
+
+##### 3.2 Install PHP modules
+
+To improve the functionality of PHP, you can install some additional PHP modules.
+
+To list the available PHP modules, run:
+
+```
+$ sudo apt-cache search php- | less
+```
+
+**Sample output:**
+
+![][4]
+
+Use the arrow keys to go through the result. To exit, type **q** and hit ENTER key.
+
+To find the details of any particular php module, for example **php-gd** , run:
+
+```
+$ sudo apt-cache show php-gd
+```
+
+To install a php module run:
+
+```
+$ sudo apt install php-gd
+```
+
+To install all modules (not necessary though), run:
+
+```
+$ sudo apt-get install php*
+```
+
+Do not forget to restart Apache service after installing any php module. To check if the module is loaded or not, open info.php file in your browser and check if it is present.
+
+Next, you might want to install any database management tools to easily manage databases via a web browser. If so, install phpMyAdmin as described in the following link.
+
+Congratulations! We have successfully setup LAMP stack in Ubuntu 18.04 LTS server.
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/install-apache-mysql-php-lamp-stack-on-ubuntu-18-04-lts/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: http://www.ostechnix.com/wp-content/uploads/2019/02/mysql-1.png
+[3]: http://www.ostechnix.com/wp-content/uploads/2019/02/mysql-2.png
+[4]: http://www.ostechnix.com/wp-content/uploads/2016/06/php-modules.png
diff --git a/sources/tech/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md b/sources/tech/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md
new file mode 100644
index 0000000000..55c1067d12
--- /dev/null
+++ b/sources/tech/20190208 3 Ways to Install Deb Files on Ubuntu Linux.md
@@ -0,0 +1,185 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (3 Ways to Install Deb Files on Ubuntu Linux)
+[#]: via: (https://itsfoss.com/install-deb-files-ubuntu)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+3 Ways to Install Deb Files on Ubuntu Linux
+======
+
+**This beginner article explains how to install deb packages in Ubuntu. It also shows you how to remove those deb packages afterwards.**
+
+This is another article in the Ubuntu beginner series. If you are absolutely new to Ubuntu, you might wonder about [how to install applications][1].
+
+The easiest way is to use the Ubuntu Software Center. Search for an application by its name and install it from there.
+
+Life would be too simple if you could find all the applications in the Software Center. But that does not happen, unfortunately.
+
+Some software are available via DEB packages. These are archived files that end with .deb extension.
+
+You can think of .deb files as the .exe files in Windows. You double click on the .exe file and it starts the installation procedure in Windows. DEB packages are pretty much the same.
+
+You can find these DEB packages from the download section of the software provider’s website. For example, if you want to [install Google Chrome on Ubuntu][2], you can download the DEB package of Chrome from its website.
+
+Now the question arises, how do you install deb files? There are multiple ways of installing DEB packages in Ubuntu. I’ll show them to you one by one in this tutorial.
+
+![Install deb files in Ubuntu][3]
+
+### Installing .deb files in Ubuntu and Debian-based Linux Distributions
+
+You can choose a GUI tool or a command line tool for installing a deb package. The choice is yours.
+
+Let’s go on and see how to install deb files.
+
+#### Method 1: Use the default Software Center
+
+The simplest method is to use the default software center in Ubuntu. You have to do nothing special here. Simply go to the folder where you have downloaded the .deb file (it should be the Downloads folder) and double click on this file.
+
+![Google Chrome deb file on Ubuntu][4]Double click on the downloaded .deb file to start installation
+
+It will open the software center and you should see the option to install the software. All you have to do is to hit the install button and enter your login password.
+
+![Install Google Chrome in Ubuntu Software Center][5]The installation of deb file will be carried out via Software Center
+
+See, it’s even simple than installing from a .exe files on Windows, isn’t it?
+
+#### Method 2: Use Gdebi application for installing deb packages with dependencies
+
+Again, life would be a lot simpler if things always go smooth. But that’s not life as we know it.
+
+Now that you know that .deb files can be easily installed via Software Center, let me tell you about the dependency error that you may encounter with some packages.
+
+What happens is that a program may be dependent on another piece of software (libraries). When the developer is preparing the DEB package for you, he/she may assume that your system already has that piece of software on your system.
+
+But if that’s not the case and your system doesn’t have those required pieces of software, you’ll encounter the infamous ‘dependency error’.
+
+The Software Center cannot handle such errors on its own so you have to use another tool called [gdebi][6].
+
+gdebi is a lightweight GUI application that has the sole purpose of installing deb packages.
+
+It identifies the dependencies and tries to install these dependencies along with installing the .deb files.
+
+![gdebi handling dependency while installing deb package][7]Image Credit: [Xmodulo][8]
+
+Personally, I prefer gdebi over software center for installing deb files. It is a lightweight application so the installation seems quicker. You can read in detail about [using gDebi and making it the default for installing DEB packages][6].
+
+You can install gdebi from the software center or using the command below:
+
+```
+sudo apt install gdebi
+```
+
+#### Method 3: Install .deb files in command line using dpkg
+
+If you want to install deb packages in command lime, you can use either apt command or dpkg command. Apt command actually uses [dpkg command][9] underneath it but apt is more popular and easy to use.
+
+If you want to use the apt command for deb files, use it like this:
+
+```
+sudo apt install path_to_deb_file
+```
+
+If you want to use dpkg command for installing deb packages, here’s how to do it:
+
+```
+sudo dpkg -i path_to_deb_file
+```
+
+In both commands, you should replace the path_to_deb_file with the path and name of the deb file you have downloaded.
+
+![Install deb files using dpkg command in Ubuntu][10]Installing deb files using dpkg command in Ubuntu
+
+If you get a dependency error while installing the deb packages, you may use the following command to fix the dependency issues:
+
+```
+sudo apt install -f
+```
+
+### How to remove deb packages
+
+Removing a deb package is not a big deal as well. And no, you don’t need the original deb file that you had used for installing the program.
+
+#### Method 1: Remove deb packages using apt commands
+
+All you need is the name of the program that you have installed and then you can use apt or dpkg to remove that program.
+
+```
+sudo apt remove program_name
+```
+
+Now the question comes, how do you find the exact program name that you need to use in the remove command? The apt command has a solution for that as well.
+
+You can find the list of all installed files with apt command but manually going through this will be a pain. So you can use the grep command to search for your package.
+
+For example, I installed AppGrid application in the previous section but if I want to know the exact program name, I can use something like this:
+
+```
+sudo apt list --installed | grep grid
+```
+
+This will give me all the packages that have grid in their name and from there, I can get the exact program name.
+
+```
+apt list --installed | grep grid
+WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
+appgrid/now 0.298 all [installed,local]
+```
+
+As you can see, a program called appgrid has been installed. Now you can use this program name with the apt remove command.
+
+#### Method 2: Remove deb packages using dpkg commands
+
+You can use dpkg to find the installed program’s name:
+
+```
+dpkg -l | grep grid
+```
+
+The output will give all the packages installed that has grid in its name.
+
+```
+dpkg -l | grep grid
+
+ii appgrid 0.298 all Discover and install apps for Ubuntu
+```
+
+ii in the above command output means package has been correctly installed.
+
+Now that you have the program name, you can use dpkg command to remove it:
+
+```
+dpkg -r program_name
+```
+
+**Tip: Updating deb packages**
+Some deb packages (like Chrome) provide updates through system updates but for most other programs, you’ll have to remove the existing program and install the newer version.
+
+I hope this beginner guide helped you to install deb packages on Ubuntu. I added the remove part so that you’ll have better control over the programs you installed.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-deb-files-ubuntu
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/remove-install-software-ubuntu/
+[2]: https://itsfoss.com/install-chrome-ubuntu/
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/deb-packages-ubuntu.png?resize=800%2C450&ssl=1
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-4.jpeg?resize=800%2C347&ssl=1
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-5.jpeg?resize=800%2C516&ssl=1
+[6]: https://itsfoss.com/gdebi-default-ubuntu-software-center/
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/gdebi-handling-dependency.jpg?ssl=1
+[8]: http://xmodulo.com
+[9]: https://help.ubuntu.com/lts/serverguide/dpkg.html.en
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/install-deb-file-with-dpkg.png?ssl=1
+[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/deb-packages-ubuntu.png?fit=800%2C450&ssl=1
diff --git a/sources/tech/20190211 How does rootless Podman work.md b/sources/tech/20190211 How does rootless Podman work.md
new file mode 100644
index 0000000000..a085ae9014
--- /dev/null
+++ b/sources/tech/20190211 How does rootless Podman work.md
@@ -0,0 +1,107 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How does rootless Podman work?)
+[#]: via: (https://opensource.com/article/19/2/how-does-rootless-podman-work)
+[#]: author: (Daniel J Walsh https://opensource.com/users/rhatdan)
+
+How does rootless Podman work?
+======
+Learn how Podman takes advantage of user namespaces to run in rootless mode.
+
+
+In my [previous article][1] on user namespace and [Podman][2], I discussed how you can use Podman commands to launch different containers with different user namespaces giving you better separation between containers. Podman also takes advantage of user namespaces to be able to run in rootless mode. Basically, when a non-privileged user runs Podman, the tool sets up and joins a user namespace. After Podman becomes root inside of the user namespace, Podman is allowed to mount certain filesystems and set up the container. Note there is no privilege escalation here other then additional UIDs available to the user, explained below.
+
+### How does Podman create the user namespace?
+
+#### shadow-utils
+
+Most current Linux distributions include a version of shadow-utils that uses the **/etc/subuid** and **/etc/subgid** files to determine what UIDs and GIDs are available for a user in a user namespace.
+
+```
+$ cat /etc/subuid
+dwalsh:100000:65536
+test:165536:65536
+$ cat /etc/subgid
+dwalsh:100000:65536
+test:165536:65536
+```
+
+The useradd program automatically allocates 65536 UIDs for each user added to the system. If you have existing users on a system, you would need to allocate the UIDs yourself. The format of these files is **username:STARTUID:TOTALUIDS**. Meaning in my case, dwalsh is allocated UIDs 100000 through 165535 along with my default UID, which happens to be 3265 defined in /etc/passwd. You need to be careful when allocating these UID ranges that they don't overlap with any **real** UID on the system. If you had a user listed as UID 100001, now I (dwalsh) would be able to become this UID and potentially read/write/execute files owned by the UID.
+
+Shadow-utils also adds two setuid programs (or setfilecap). On Fedora I have:
+
+```
+$ getcap /usr/bin/newuidmap
+/usr/bin/newuidmap = cap_setuid+ep
+$ getcap /usr/bin/newgidmap
+/usr/bin/newgidmap = cap_setgid+ep
+```
+
+Podman executes these files to set up the user namespace. You can see the mappings by examining /proc/self/uid_map and /proc/self/gid_map from inside of the rootless container.
+
+```
+$ podman run alpine cat /proc/self/uid_map /proc/self/gid_map
+ 0 3267 1
+ 1 100000 65536
+ 0 3267 1
+ 1 100000 65536
+```
+
+As seen above, Podman defaults to mapping root in the container to your current UID (3267) and then maps ranges of allocated UIDs/GIDs in /etc/subuid and /etc/subgid starting at 1. Meaning in my example, UID=1 in the container is UID 100000, UID=2 is UID 100001, all the way up to 65536, which is 165535.
+
+Any item from outside of the user namespace that is owned by a UID or GID that is not mapped into the user namespace appears to belong to the user configured in the **kernel.overflowuid** sysctl, which by default is 35534, which my /etc/passwd file says has the name **nobody**. Since your process can't run as an ID that isn't mapped, the owner and group permissions don't apply, so you can only access these files based on their "other" permissions. This includes all files owned by **real** root on the system running the container, since root is not mapped into the user namespace.
+
+The [Buildah][3] command has a cool feature, [**buildah unshare**][4]. This puts you in the same user namespace that Podman runs in, but without entering the container's filesystem, so you can list the contents of your home directory.
+
+```
+$ ls -ild /home/dwalsh
+8193 drwx--x--x. 290 dwalsh dwalsh 20480 Jan 29 07:58 /home/dwalsh
+$ buildah unshare ls -ld /home/dwalsh
+drwx--x--x. 290 root root 20480 Jan 29 07:58 /home/dwalsh
+```
+
+Notice that when listing the home dir attributes outside the user namespace, the kernel reports the ownership as dwalsh, while inside the user namespace it reports the directory as owned by root. This is because the home directory is owned by 3267, and inside the user namespace we are treating that UID as root.
+
+### What happens next in Podman after the user namespace is set up?
+
+Podman uses [containers/storage][5] to pull the container image, and containers/storage is smart enough to map all files owned by root in the image to the root of the user namespace, and any other files owned by different UIDs to their user namespace UIDs. By default, this content gets written to ~/.local/share/containers/storage. Container storage works in rootless mode with either the vfs mode or with Overlay. Note: Overlay is supported only if the [fuse-overlayfs][6] executable is installed.
+
+The kernel only allows user namespace root to mount certain types of filesystems; at this time it allows mounting of procfs, sysfs, tmpfs, fusefs, and bind mounts (as long as the source and destination are owned by the user running Podman. OverlayFS is not supported yet, although the kernel teams are working on allowing it).
+
+Podman then mounts the container's storage if it is using fuse-overlayfs; if the storage driver is using vfs, then no mounting is required. Podman on vfs requires a lot of space though, since each container copies the entire underlying filesystem.
+
+Podman then mounts /proc and /sys along with a few tmpfs and creates the devices in the container.
+
+In order to use networking other than the host networking, Podman uses the [slirp4netns][7] program to set up **User mode networking for unprivileged network namespace**. Slirp4netns allows Podman to expose ports within the container to the host. Note that the kernel still will not allow a non-privileged process to bind to ports less than 1024. Podman-1.1 or later is required for binding to ports.
+
+Rootless Podman can use user namespace for container separation, but you only have access to the UIDs defined in the /etc/subuid file.
+
+### Conclusion
+
+The Podman tool is enabling people to build and use containers without sacrificing the security of the system; you can give your developers the access they need without giving them root.
+
+And when you put your containers into production, you can take advantage of the extra security provided by the user namespace to keep the workloads isolated from each other.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/how-does-rootless-podman-work
+
+作者:[Daniel J Walsh][a]
+选题:[lujun9972][b]
+译者:[译者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/rhatdan
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/article/18/12/podman-and-user-namespaces
+[2]: https://podman.io/
+[3]: https://buildah.io/
+[4]: https://github.com/containers/buildah/blob/master/docs/buildah-unshare.md
+[5]: https://github.com/containers/storage
+[6]: https://github.com/containers/fuse-overlayfs
+[7]: https://github.com/rootless-containers/slirp4netns
diff --git a/sources/tech/20190211 What-s the right amount of swap space for a modern Linux system.md b/sources/tech/20190211 What-s the right amount of swap space for a modern Linux system.md
new file mode 100644
index 0000000000..c04d47e5ca
--- /dev/null
+++ b/sources/tech/20190211 What-s the right amount of swap space for a modern Linux system.md
@@ -0,0 +1,68 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (What's the right amount of swap space for a modern Linux system?)
+[#]: via: (https://opensource.com/article/19/2/swap-space-poll)
+[#]: author: (David Both https://opensource.com/users/dboth)
+
+What's the right amount of swap space for a modern Linux system?
+======
+Complete our survey and voice your opinion on how much swap space to allocate.
+
+
+Swap space is one of those things that everyone seems to have an idea about, and I am no exception. All my sysadmin friends have their opinions, and most distributions make recommendations too.
+
+Many years ago, the rule of thumb for the amount of swap space that should be allocated was 2X the amount of RAM installed in the computer. Of course that was when a typical computer's RAM was measured in KB or MB. So if a computer had 64KB of RAM, a swap partition of 128KB would be an optimum size.
+
+This took into account the fact that RAM memory sizes were typically quite small, and allocating more than 2X RAM for swap space did not improve performance. With more than twice RAM for swap, most systems spent more time thrashing than performing useful work.
+
+RAM memory has become quite inexpensive and many computers now have RAM in the tens of gigabytes. Most of my newer computers have at least 4GB or 8GB of RAM, two have 32GB, and my main workstation has 64GB. When dealing with computers with huge amounts of RAM, the limiting performance factor for swap space is far lower than the 2X multiplier. As a consequence, recommended swap space is considered a function of system memory workload, not system memory.
+
+Table 1 provides the Fedora Project's recommended size for a swap partition, depending on the amount of RAM in your system and whether you want enough memory for your system to hibernate. To allow for hibernation, you need to edit the swap space in the custom partitioning stage. The "recommended" swap partition size is established automatically during a default installation, but I usually find it's either too large or too small for my needs.
+
+The [Fedora 28 Installation Guide][1] defines current thinking about swap space allocation. Note that other versions of Fedora and other Linux distributions may differ slightly, but this is the same table Red Hat Enterprise Linux uses for its recommendations. These recommendations have not changed since Fedora 19.
+
+| Amount of RAM installed in system | Recommended swap space | Recommended swap space with hibernation |
+| --------------------------------- | ---------------------- | --------------------------------------- |
+| ≤ 2GB | 2X RAM | 3X RAM |
+| 2GB – 8GB | = RAM | 2X RAM |
+| 8GB – 64GB | 4G to 0.5X RAM | 1.5X RAM |
+| >64GB | Minimum 4GB | Hibernation not recommended |
+
+Table 1: Recommended system swap space in Fedora 28's documentation.
+
+Table 2 contains my recommendations based on my experiences in multiple environments over the years.
+| Amount of RAM installed in system | Recommended swap space |
+| --------------------------------- | ---------------------- |
+| ≤ 2GB | 2X RAM |
+| 2GB – 8GB | = RAM |
+| > 8GB | 8GB |
+
+Table 2: My recommended system swap space.
+
+It's possible that neither of these tables will work for your environment, but they will give you a place to start. The main consideration is that as the amount of RAM increases, adding more swap space simply leads to thrashing well before the swap space comes close to being filled. If you have too little virtual memory, you should add more RAM, if possible, rather than more swap space.
+
+In order to test the Fedora (and RHEL) swap space recommendations, I used its recommendation of **0.5*RAM** on my two largest systems (the ones with 32GB and 64GB of RAM). Even when running four or five VMs, multiple documents in LibreOffice, Thunderbird, the Chrome web browser, several terminal emulator sessions, the Xfe file manager, and a number of other background applications, the only time I see any use of swap is during backups I have scheduled for every morning at about 2am. Even then, swap usage is no more than 16MB—yes megabytes. These results are for my system with my loads and do not necessarily apply to your real-world environment.
+
+I recently had a conversation about swap space with some of the other Community Moderators here at [Opensource.com][2], and Chris Short, one of my friends in that illustrious and talented group, pointed me to an old [article][3] where he recommended using 1GB for swap space. This article was written in 2003, and he told me later that he now recommends zero swap space.
+
+So, we wondered, what you think? What do you recommend or use on your systems for swap space?
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/swap-space-poll
+
+作者:[David Both][a]
+选题:[lujun9972][b]
+译者:[译者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/dboth
+[b]: https://github.com/lujun9972
+[1]: https://docs.fedoraproject.org/en-US/fedora/f28/install-guide/
+[2]: http://Opensource.com
+[3]: https://chrisshort.net/moving-to-linux-partitioning/
diff --git a/sources/tech/20190212 Top 10 Best Linux Media Server Software.md b/sources/tech/20190212 Top 10 Best Linux Media Server Software.md
new file mode 100644
index 0000000000..8fcea6343a
--- /dev/null
+++ b/sources/tech/20190212 Top 10 Best Linux Media Server Software.md
@@ -0,0 +1,229 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Top 10 Best Linux Media Server Software)
+[#]: via: (https://itsfoss.com/best-linux-media-server)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Top 10 Best Linux Media Server Software
+======
+
+Did someone tell you that Linux is just for programmers? That is so wrong! You have got a lot of great tools for [digital artists][1], [writers][2] and musicians.
+
+We have covered such tools in the past. Today it’s going to be slightly different. Instead of creating new digital content, let’s talk about consuming it.
+
+You have probably heard of media servers? Basically these software (and sometimes gadgets) allow you to view your local or cloud media (music, videos etc) in an intuitive interface. You can even use it to stream the content to other devices on your network. Sort of your personal Netflix.
+
+In this article, we will talk about the best media software available for Linux that you can use as a media player or as a media server software – as per your requirements.
+
+Some of these applications can also be used with Google’s Chromecast and Amazon’s Firestick.
+
+### Best Media Server Software for Linux
+
+![Best Media Server Software for Linux][3]
+
+The mentioned Linux media server software are in no particular order of ranking.
+
+I have tried to provide installation instructions for Ubuntu and Debian based distributions. It’s not possible to list installation steps for all Linux distributions for all the media servers mentioned here. Please take no offence for that.
+
+A couple of software in this list are not open source. If that’s the case, I have highlighted it appropriately.
+
+### 1\. Kodi
+
+![Kodi Media Server][4]
+
+Kod is one of the most popular media server software and player. Recently, Kodi 18.0 dropped in with a bunch of improvements that includes the support for Digital Rights Management (DRM) decryption, game emulators, ROMs, voice control, and more.
+
+It is a completely free and open source software. An active community for discussions and support exists as well. The user interface for Kodi is beautiful. I haven’t had the chance to use it in its early days – but I was amazed to see such a good UI for a Linux application.
+
+It has got great playback support – so you can add any supported 3rd party media service for the content or manually add the ripped video files to watch.
+
+#### How to install Kodi
+
+Type in the following commands in the terminal to install the latest version of Kodi via its [official PPA][5].
+
+```
+sudo apt-get install software-properties-common
+sudo add-apt-repository ppa:team-xbmc/ppa
+sudo apt-get update
+sudo apt-get install kodi
+```
+
+To know more about installing a development build or upgrading Kodi, refer to the [official installation guide][6].
+
+### 2\. Plex
+
+![Plex Media Server][7]
+
+Plex is yet another impressive media player or could be used as a media server software. It is a great alternative to Kodi for the users who mostly utilize it to create an offline network of their media collection to sync and watch across multiple devices.
+
+Unlike Kodi, **Plex is not entirely open source**. It does offer a free account in order to use it. In addition, it offers premium pricing plans to unlock more features and have a greater control over your media while also being able to get a detailed insight on who/what/how Plex is being used.
+
+If you are an audiophile, you would love the integration of Plex with [TIDAL][8] music streaming service. You can also set up Live TV by adding it to your tuner.
+
+#### How to install Plex
+
+You can simply download the .deb file available on their official webpage and install it directly (or using [GDebi][9])
+
+### 3\. Jellyfin
+
+![Emby media server][10]
+
+Yet another open source media server software with a bunch of features. [Jellyfin][11] is actually a fork of Emby media server. It may be one of the best out there available for ‘free’ but the multi-platform support still isn’t there yet.
+
+You can run it on a browser or utilize Chromecast – however – you will have to wait if you want the Android app or if you want it to support several devices.
+
+#### How to install Jellyfin
+
+Jellyfin provides a [detailed documentation][12] on how to install it from the binary packages/image available for Linux, Docker, and more.
+
+You will also find it easy to install it from the repository via the command line for Debian-based distribution. Check out their [installation guide][13] for more information.
+
+### 4\. LibreELEC
+
+![libreELEC][14]
+
+LibreELEC is an interesting media server software which is based on Kodi v18.0. They have recently released a new version (9.0.0) with a complete overhaul of the core OS support, hardware compatibility and user experience.
+
+Of course, being based on Kodi, it also has the DRM support. In addition, you can utilize its generic Linux builds or the special ones tailored for Raspberry Pi builds, WeTek devices, and more.
+
+#### How to install LibreELEC
+
+You can download the installer from their [official site][15]. For detailed instructions on how to use it, please refer to the [installation guide][16].
+
+### 5\. OpenFLIXR Media Server
+
+![OpenFLIXR Media Server][17]
+
+Want something similar that compliments Plex media server but also compatible with VirtualBox or VMWare? You got it!
+
+OpenFLIXR is an automated media server software which integrates with Plex to provide all the features along with the ability to auto download TV shows and movies from Torrents. It even fetches the subtitles automatically giving you a seamless experience when coupled with Plex media software.
+
+You can also automate your home theater with this installed. In case you do not want to run it on a physical instance, it supports VMware, VirtualBox and Hyper-V as well. The best part is – it is an open source solution and based on Ubuntu Server.
+
+#### How to install OpenFLIXR
+
+The best way to do it is by installing VirtualBox – it will be easier. After you do that, just download it from the [official website][18] and import it.
+
+### 6\. MediaPortal
+
+![MediaPortal][19]
+
+MediaPortal is just another open source simple media server software with a decent user interface. It all depends on your personal preference – event though I would recommend Kodi over this.
+
+You can play DVDs, stream videos on your local network, and listen to music as well. It does not offer a fancy set of features but the ones you will mostly need.
+
+It gives you the option to choose from two different versions (one that is stable and the second which tries to incorporate new features – could be unstable).
+
+#### How to install MediaPotal
+
+Depending on what you want to setup (A TV-server only or a complete server setup), follow the [official setup guide][20] to install it properly.
+
+### 7\. Gerbera
+
+![Gerbera Media Center][21]
+
+A simple implementation for a media server to be able to stream using your local network. It does support transcoding which will convert the media in the format your device supports.
+
+If you have been following the options for media server form a very long time, then you might identify this as the rebranded (and improved) version of MediaTomb. Even though it is not a popular choice among the Linux users – it is still something usable when all fails or for someone who prefers a straightforward and a basic media server.
+
+#### How to install Gerbera
+
+Type in the following commands in the terminal to install it on any Ubuntu-based distro:
+
+```
+sudo apt install gerbera
+```
+
+For other Linux distributions, refer to the [documentation][22].
+
+### 8\. OSMC (Open Source Media Center)
+
+![OSMC Open Source Media Center][23]
+
+It is an elegant-looking media server software originally based on Kodi media center. I was quite impressed with the user interface. It is simple and robust, being a free and open source solution. In a nutshell, all the essential features you would expect in a media server software.
+
+You can also opt in to purchase OSMC’s flagship device. It will play just about anything up to 4K standards with HD audio. In addition, it supports Raspberry Pi builds and 1st-gen Apple TV.
+
+#### How to install OSMC
+
+If your device is compatible, you can just select your operating system and download the device installer from the official [download page][24] and create a bootable image to install.
+
+### 9\. Universal Media Server
+
+![][25]
+
+Yet another simple addition to this list. Universal Media Server does not offer any fancy features but just helps you transcode / stream video and audio without needing much configuration.
+
+It supports Xbox 360, PS 3, and just about any other [DLNA][26]-capable devices.
+
+#### How to install Universal Media Center
+
+You can find all the packages listed on [FossHub][27] but you should follow the [official forum][28] to know more about how to install the package that you downloaded from the website.
+
+### 10\. Red5 Media Server
+
+![Red5 Media Server][29]Image Credit: [Red5 Server][30]
+
+A free and open source media server tailored for enterprise usage. You can use it for live streaming solutions – no matter if it is for entertainment or just video conferencing.
+
+They also offer paid licensing options for mobiles and high scalability.
+
+#### How to install Red5
+
+Even though it is not the quickest installation method, follow the [installation guide on GitHub][31] to get started with the server without needing to tinker around.
+
+### Wrapping Up
+
+Every media server software listed here has its own advantages – you should pick one up and try the one which suits your requirement.
+
+Did we miss any of your favorite media server software? Let us know about it in the comments below!
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/best-linux-media-server
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/best-linux-graphic-design-software/
+[2]: https://itsfoss.com/open-source-tools-writers/
+[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/best-media-server-linux.png?resize=800%2C450&ssl=1
+[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/kodi-18-media-server.jpg?fit=800%2C450&ssl=1
+[5]: https://itsfoss.com/ppa-guide/
+[6]: https://kodi.wiki/view/HOW-TO:Install_Kodi_for_Linux
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/plex.jpg?fit=800%2C368&ssl=1
+[8]: https://tidal.com/
+[9]: https://itsfoss.com/gdebi-default-ubuntu-software-center/
+[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/emby-server.jpg?fit=800%2C373&ssl=1
+[11]: https://jellyfin.github.io/
+[12]: https://jellyfin.readthedocs.io/en/latest/
+[13]: https://jellyfin.readthedocs.io/en/latest/administrator-docs/installing/
+[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/libreelec.jpg?resize=800%2C600&ssl=1
+[15]: https://libreelec.tv/downloads_new/
+[16]: https://libreelec.wiki/libreelec_usb-sd_creator
+[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/openflixr-media-server.jpg?fit=800%2C449&ssl=1
+[18]: http://www.openflixr.com/#Download
+[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/mediaportal.jpg?ssl=1
+[20]: https://www.team-mediaportal.com/wiki/display/MediaPortal1/Quick+Setup
+[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/gerbera-server-softwarei.jpg?fit=800%2C583&ssl=1
+[22]: http://docs.gerbera.io/en/latest/install.html
+[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/osmc-server.jpg?fit=800%2C450&ssl=1
+[24]: https://osmc.tv/download/
+[25]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/universal-media-server.jpg?ssl=1
+[26]: https://en.wikipedia.org/wiki/Digital_Living_Network_Alliance
+[27]: https://www.fosshub.com/Universal-Media-Server.html?dwl=UMS-7.8.0.tgz
+[28]: https://www.universalmediaserver.com/forum/viewtopic.php?t=10275
+[29]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/red5.jpg?resize=800%2C364&ssl=1
+[30]: https://www.red5server.com/
+[31]: https://github.com/Red5/red5-server/wiki/Installation-on-Linux
+[32]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/best-media-server-linux.png?fit=800%2C450&ssl=1
diff --git a/sources/tech/20190213 How to build a WiFi picture frame with a Raspberry Pi.md b/sources/tech/20190213 How to build a WiFi picture frame with a Raspberry Pi.md
new file mode 100644
index 0000000000..615f7620ed
--- /dev/null
+++ b/sources/tech/20190213 How to build a WiFi picture frame with a Raspberry Pi.md
@@ -0,0 +1,135 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to build a WiFi picture frame with a Raspberry Pi)
+[#]: via: (https://opensource.com/article/19/2/wifi-picture-frame-raspberry-pi)
+[#]: author: (Manuel Dewald https://opensource.com/users/ntlx)
+
+How to build a WiFi picture frame with a Raspberry Pi
+======
+DIY a digital photo frame that streams photos from the cloud.
+
+
+
+Digital picture frames are really nice because they let you enjoy your photos without having to print them out. Plus, adding and removing digital files is a lot easier than opening a traditional frame and swapping the picture inside when you want to display a new photo. Even so, it's still a bit of overhead to remove your SD card, USB stick, or other storage from a digital picture frame, plug it into your computer, and copy new pictures onto it.
+
+An easier option is a digital picture frame that gets its pictures over WiFi, for example from a cloud service. Here's how to make one.
+
+### Gather your materials
+
+ * Old [TFT][1] LCD screen
+ * HDMI-to-DVI cable (as the TFT screen supports DVI)
+ * Raspberry Pi 3
+ * Micro SD card
+ * Raspberry Pi power supply
+ * Keyboard
+ * Mouse (optional)
+
+
+
+Connect the Raspberry Pi to the display using the cable and attach the power supply.
+
+### Install Raspbian
+
+**sudo raspi-config**. There I change the hostname (e.g., to **picframe** ) in Network Options and enable SSH to work remotely on the Raspberry Pi in Interfacing Options. Connect to the Raspberry Pi using (for example) .
+
+### Build and install the cloud client
+
+Download and flash Raspbian to the Micro SD card by following these [directions][2] . Plug the Micro SD card into the Raspberry Pi, boot it up, and configure your WiFi. My first action after a new Raspbian installation is usually running. There I change the hostname (e.g., to) in Network Options and enable SSH to work remotely on the Raspberry Pi in Interfacing Options. Connect to the Raspberry Pi using (for example)
+
+I use [Nextcloud][3] to synchronize my pictures, but you could use NFS, [Dropbox][4], or whatever else fits your needs to upload pictures to the frame.
+
+If you use Nextcloud, get a client for Raspbian by following these [instructions][5]. This is handy for placing new pictures on your picture frame and will give you the client application you may be familiar with on a desktop PC. When connecting the client application to your Nextcloud server, make sure to select only the folder where you'll store the images you want to be displayed on the picture frame.
+
+### Set up the slideshow
+
+The easiest way I've found to set up the slideshow is with a [lightweight slideshow project][6] built for exactly this purpose. There are some alternatives, like configuring a screensaver, but this application appears to be the simplest to set up.
+
+On your Raspberry Pi, download the binaries from the latest release, unpack them, and move them to an executable folder:
+
+```
+wget https://github.com/NautiluX/slide/releases/download/v0.9.0/slide_pi_stretch_0.9.0.tar.gz
+tar xf slide_pi_stretch_0.9.0.tar.gz
+mv slide_0.9.0/slide /usr/local/bin/
+```
+
+Install the dependencies:
+
+```
+sudo apt install libexif12 qt5-default
+```
+
+Run the slideshow by executing the command below (don't forget to modify the path to your images). If you access your Raspberry Pi via SSH, set the **DISPLAY** variable to start the slideshow on the display attached to the Raspberry Pi.
+
+```
+DISPLAY=:0.0 slide -p /home/pi/nextcloud/picframe
+```
+
+### Autostart the slideshow
+
+To autostart the slideshow on Raspbian Stretch, create the following folder and add an **autostart** file to it:
+
+```
+mkdir -p /home/pi/.config/lxsession/LXDE/
+vi /home/pi/.config/lxsession/LXDE/autostart
+```
+
+Insert the following commands to autostart your slideshow. The **slide** command can be adjusted to your needs:
+
+```
+@xset s noblank
+@xset s off
+@xset -dpms
+@slide -p -t 60 -o 200 -p /home/pi/nextcloud/picframe
+```
+
+Disable screen blanking, which the Raspberry Pi normally does after 10 minutes, by editing the following file:
+
+```
+vi /etc/lightdm/lightdm.conf
+```
+
+and adding these two lines to the end:
+
+```
+[SeatDefaults]
+xserver-command=X -s 0 -dpms
+```
+
+### Configure a power-on schedule
+
+You can schedule your picture frame to turn on and off at specific times by using two simple cronjobs. For example, say you want it to turn on automatically at 7 am and turn off at 11 pm. Run **crontab -e** and insert the following two lines.
+
+```
+0 23 * * * /opt/vc/bin/tvservice -o
+
+0 7 * * * /opt/vc/bin/tvservice -p && sudo systemctl restart display-manager
+```
+
+Note that this won't turn the Raspberry Pi power's on and off; it will just turn off HDMI, which will turn the screen off. The first line will power off HDMI at 11 pm. The second line will bring the display back up and restart the display manager at 7 am.
+
+### Add a final touch
+
+By following these simple steps, you can create your own WiFi picture frame. If you want to give it a nicer look, build a wooden frame for the display.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/wifi-picture-frame-raspberry-pi
+
+作者:[Manuel Dewald][a]
+选题:[lujun9972][b]
+译者:[译者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/ntlx
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Thin-film-transistor_liquid-crystal_display
+[2]: https://www.raspberrypi.org/documentation/installation/installing-images/README.md
+[3]: https://nextcloud.com/
+[4]: http://dropbox.com/
+[5]: https://github.com/nextcloud/client_theming#building-on-debian
+[6]: https://github.com/NautiluX/slide/releases/tag/v0.9.0
diff --git a/sources/tech/20190215 Make websites more readable with a shell script.md b/sources/tech/20190215 Make websites more readable with a shell script.md
new file mode 100644
index 0000000000..06b748cfb5
--- /dev/null
+++ b/sources/tech/20190215 Make websites more readable with a shell script.md
@@ -0,0 +1,258 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Make websites more readable with a shell script)
+[#]: via: (https://opensource.com/article/19/2/make-websites-more-readable-shell-script)
+[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
+
+Make websites more readable with a shell script
+======
+Calculate the contrast ratio between your website's text and background to make sure your site is easy to read.
+
+
+
+If you want people to find your website useful, they need to be able to read it. The colors you choose for your text can affect the readability of your site. Unfortunately, a popular trend in web design is to use low-contrast colors when printing text, such as gray text on a white background. Maybe that looks really cool to the web designer, but it is really hard for many of us to read.
+
+The W3C provides Web Content Accessibility Guidelines, which includes guidance to help web designers pick text and background colors that can be easily distinguished from each other. This is called the "contrast ratio." The W3C definition of the contrast ratio requires several calculations: given two colors, you first compute the relative luminance of each, then calculate the contrast ratio. The ratio will fall in the range 1 to 21 (typically written 1:1 to 21:1). The higher the contrast ratio, the more the text will stand out against the background. For example, black text on a white background is highly visible and has a contrast ratio of 21:1. And white text on a white background is unreadable at a contrast ratio of 1:1.
+
+The [W3C says body text][1] should have a contrast ratio of at least 4.5:1 with headings at least 3:1. But that seems to be the bare minimum. The W3C also recommends at least 7:1 for body text and at least 4.5:1 for headings.
+
+Calculating the contrast ratio can be a chore, so it's best to automate it. I've done that with this handy Bash script. In general, the script does these things:
+
+ 1. Gets the text color and background color
+ 2. Computes the relative luminance of each
+ 3. Calculates the contrast ratio
+
+
+
+### Get the colors
+
+You may know that every color on your monitor can be represented by red, green, and blue (R, G, and B). To calculate the relative luminance of a color, my script will need to know the red, green, and blue components of the color. Ideally, my script would read this information as separate R, G, and B values. Web designers might know the specific RGB code for their favorite colors, but most humans don't know RGB values for the different colors. Instead, most people reference colors by names like "red" or "gold" or "maroon."
+
+Fortunately, the GNOME [Zenity][2] tool has a color-picker app that lets you use different methods to select a color, then returns the RGB values in a predictable format of "rgb( **R** , **G** , **B** )". Using Zenity makes it easy to get a color value:
+
+```
+color=$( zenity --title 'Set text color' --color-selection --color='black' )
+```
+
+In case the user (accidentally) clicks the Cancel button, the script assumes a color:
+
+```
+if [ $? -ne 0 ] ; then
+ echo '** color canceled .. assume black'
+ color='rgb(0,0,0)'
+fi
+```
+
+My script does something similar to set the background color value as **$background**.
+
+### Compute the relative luminance
+
+Once you have the foreground color in **$color** and the background color in **$background** , the next step is to compute the relative luminance for each. On its website, the [W3C provides an algorithm][3] to compute the relative luminance of a color.
+
+> For the sRGB colorspace, the relative luminance of a color is defined as
+> **L = 0.2126 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated R + 0.7152 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated G + 0.0722 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated B** where R, G and B are defined as:
+>
+> if RsRGB <= 0.03928 then R = RsRGB/12.92
+> else R = ((RsRGB+0.055)/1.055) ^ 2.4
+>
+> if GsRGB <= 0.03928 then G = GsRGB/12.92
+> else G = ((GsRGB+0.055)/1.055) ^ 2.4
+>
+> if BsRGB <= 0.03928 then B = BsRGB/12.92
+> else B = ((BsRGB+0.055)/1.055) ^ 2.4
+>
+> and RsRGB, GsRGB, and BsRGB are defined as:
+>
+> RsRGB = R8bit/255
+>
+> GsRGB = G8bit/255
+>
+> BsRGB = B8bit/255
+
+Since Zenity returns color values in the format "rgb( **R** , **G** , **B** )," the script can easily pull apart the R, B, and G values to compute the relative luminance. AWK makes this a simple task, using the comma as the field separator ( **-F,** ) and using AWK's **substr()** string function to pick just the text we want from the "rgb( **R** , **G** , **B** )" color value:
+
+```
+R=$( echo $color | awk -F, '{print substr($1,5)}' )
+G=$( echo $color | awk -F, '{print $2}' )
+B=$( echo $color | awk -F, '{n=length($3); print substr($3,1,n-1)}' )
+```
+
+**(For more on extracting and displaying data with AWK,[Get our AWK cheat sheet][4].)**
+
+Calculating the final relative luminance is best done using the BC calculator. BC supports the simple if-then-else needed in the calculation, which makes this part simple. But since BC cannot directly calculate exponentiation using a non-integer exponent, we need to do some extra math using the natural logarithm instead:
+
+```
+echo "scale=4
+rsrgb=$R/255
+gsrgb=$G/255
+bsrgb=$B/255
+if ( rsrgb <= 0.03928 ) r = rsrgb/12.92 else r = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((rsrgb+0.055)/1.055) )
+if ( gsrgb <= 0.03928 ) g = gsrgb/12.92 else g = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((gsrgb+0.055)/1.055) )
+if ( bsrgb <= 0.03928 ) b = bsrgb/12.92 else b = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((bsrgb+0.055)/1.055) )
+0.2126 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated r + 0.7152 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated g + 0.0722 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated b" | bc -l
+```
+
+This passes several instructions to BC, including the if-then-else statements that are part of the relative luminance formula. BC then prints the final value.
+
+### Calculate the contrast ratio
+
+With the relative luminance of the text color and the background color, now the script can calculate the contrast ratio. The [W3C determines the contrast ratio][5] with this formula:
+
+> (L1 + 0.05) / (L2 + 0.05), where
+> L1 is the relative luminance of the lighter of the colors, and
+> L2 is the relative luminance of the darker of the colors
+
+Given two relative luminance values **$r1** and **$r2** , it's easy to calculate the contrast ratio using the BC calculator:
+
+```
+echo "scale=2
+if ( $r1 > $r2 ) { l1=$r1; l2=$r2 } else { l1=$r2; l2=$r1 }
+(l1 + 0.05) / (l2 + 0.05)" | bc
+```
+
+This uses an if-then-else statement to determine which value ( **$r1** or **$r2** ) is the lighter or darker color. BC performs the resulting calculation and prints the result, which the script can store in a variable.
+
+### The final script
+
+With the above, we can pull everything together into a final script. I use Zenity to display the final result in a text box:
+
+```
+#!/bin/sh
+# script to calculate contrast ratio of colors
+
+# read color and background color:
+# zenity returns values like 'rgb(255,140,0)' and 'rgb(255,255,255)'
+
+color=$( zenity --title 'Set text color' --color-selection --color='black' )
+if [ $? -ne 0 ] ; then
+ echo '** color canceled .. assume black'
+ color='rgb(0,0,0)'
+fi
+
+background=$( zenity --title 'Set background color' --color-selection --color='white' )
+if [ $? -ne 0 ] ; then
+ echo '** background canceled .. assume white'
+ background='rgb(255,255,255)'
+fi
+
+# compute relative luminance:
+
+function luminance()
+{
+ R=$( echo $1 | awk -F, '{print substr($1,5)}' )
+ G=$( echo $1 | awk -F, '{print $2}' )
+ B=$( echo $1 | awk -F, '{n=length($3); print substr($3,1,n-1)}' )
+
+ echo "scale=4
+rsrgb=$R/255
+gsrgb=$G/255
+bsrgb=$B/255
+if ( rsrgb <= 0.03928 ) r = rsrgb/12.92 else r = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((rsrgb+0.055)/1.055) )
+if ( gsrgb <= 0.03928 ) g = gsrgb/12.92 else g = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((gsrgb+0.055)/1.055) )
+if ( bsrgb <= 0.03928 ) b = bsrgb/12.92 else b = e( 2.4 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated l((bsrgb+0.055)/1.055) )
+0.2126 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated r + 0.7152 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated g + 0.0722 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated b" | bc -l
+}
+
+lum1=$( luminance $color )
+lum2=$( luminance $background )
+
+# compute contrast
+
+function contrast()
+{
+ echo "scale=2
+if ( $1 > $2 ) { l1=$1; l2=$2 } else { l1=$2; l2=$1 }
+(l1 + 0.05) / (l2 + 0.05)" | bc
+}
+
+rel=$( contrast $lum1 $lum2 )
+
+# print results
+
+( cat<
+```
+
+Alternatively, add the following to the beginning of each of your BATS test scripts:
+
+```
+#!/usr/bin/env ./test/libs/bats/bin/bats
+load 'libs/bats-support/load'
+load 'libs/bats-assert/load'
+```
+
+and **chmod +x **. This will a) make them executable with the BATS installed in **./test/libs/bats** and b) include these helper libraries. BATS test scripts are typically stored in the **test** directory and named for the script being tested, but with the **.bats** extension. For example, a BATS script that tests **bin/build** should be called **test/build.bats**.
+
+You can also run an entire set of BATS test files by passing a regular expression to BATS, e.g., **./test/lib/bats/bin/bats test/*.bats**.
+
+### Organizing libraries and scripts for BATS coverage
+
+Bash scripts and libraries must be organized in a way that efficiently exposes their inner workings to BATS. In general, library functions and shell scripts that run many commands when they are called or executed are not amenable to efficient BATS testing.
+
+For example, [build.sh][4] is a typical script that many people write. It is essentially a big pile of code. Some might even put this pile of code in a function in a library. But it's impossible to run a big pile of code in a BATS test and cover all possible types of failures it can encounter in separate test cases. The only way to test this pile of code with sufficient coverage is to break it into many small, reusable, and, most importantly, independently testable functions.
+
+It's straightforward to add more functions to a library. An added benefit is that some of these functions can become surprisingly useful in their own right. Once you have broken your library function into lots of smaller functions, you can **source** the library in your BATS test and run the functions as you would any other command to test them.
+
+Bash scripts must also be broken down into multiple functions, which the main part of the script should call when the script is executed. In addition, there is a very useful trick to make it much easier to test Bash scripts with BATS: Take all the code that is executed in the main part of the script and move it into a function, called something like **run_main**. Then, add the following to the end of the script:
+
+```
+if [[ "${BASH_SOURCE[0]}" == "${0}" ]]
+then
+ run_main
+fi
+```
+
+This bit of extra code does something special. It makes the script behave differently when it is executed as a script than when it is brought into the environment with **source**. This trick enables the script to be tested the same way a library is tested, by sourcing it and testing the individual functions. For example, here is [build.sh refactored for better BATS testability][5].
+
+### Writing and running tests
+
+As mentioned above, BATS is a TAP-compliant testing framework with a syntax and output that will be familiar to those who have used other TAP-compliant testing suites, such as JUnit, RSpec, or Jest. Its tests are organized into individual test scripts. Test scripts are organized into one or more descriptive **@test** blocks that describe the unit of the application being tested. Each **@test** block will run a series of commands that prepares the test environment, runs the command to be tested, and makes assertions about the exit and output of the tested command. Many assertion functions are imported with the **bats** , **bats-assert** , and **bats-support** libraries, which are loaded into the environment at the beginning of the BATS test script. Here is a typical BATS test block:
+
+```
+@test "requires CI_COMMIT_REF_SLUG environment variable" {
+ unset CI_COMMIT_REF_SLUG
+ assert_empty "${CI_COMMIT_REF_SLUG}"
+ run some_command
+ assert_failure
+ assert_output --partial "CI_COMMIT_REF_SLUG"
+}
+```
+
+If a BATS script includes **setup** and/or **teardown** functions, they are automatically executed by BATS before and after each test block runs. This makes it possible to create environment variables, test files, and do other things needed by one or all tests, then tear them down after each test runs. [**Build.bats**][6] is a full BATS test of our newly formatted **build.sh** script. (The **mock_docker** command in this test will be explained below, in the section on mocking/stubbing.)
+
+When the test script runs, BATS uses **exec** to run each **@test** block as a separate subprocess. This makes it possible to export environment variables and even functions in one **@test** without affecting other **@test** s or polluting your current shell session. The output of a test run is a standard format that can be understood by humans and parsed or manipulated programmatically by TAP consumers. Here is an example of the output for the **CI_COMMIT_REF_SLUG** test block when it fails:
+
+```
+ ✗ requires CI_COMMIT_REF_SLUG environment variable
+ (from function `assert_output' in file test/libs/bats-assert/src/assert.bash, line 231,
+ in test file test/ci_deploy.bats, line 26)
+ `assert_output --partial "CI_COMMIT_REF_SLUG"' failed
+
+ -- output does not contain substring --
+ substring (1 lines):
+ CI_COMMIT_REF_SLUG
+ output (3 lines):
+ ./bin/deploy.sh: join_string_by: command not found
+ oc error
+ Could not login
+ --
+
+ ** Did not delete , as test failed **
+
+1 test, 1 failure
+```
+
+Here is the output of a successful test:
+
+```
+✓ requires CI_COMMIT_REF_SLUG environment variable
+```
+
+### Helpers
+
+Like any shell script or library, BATS test scripts can include helper libraries to share common code across tests or enhance their capabilities. These helper libraries, such as **bats-assert** and **bats-support** , can even be tested with BATS.
+
+Libraries can be placed in the same test directory as the BATS scripts or in the **test/libs** directory if the number of files in the test directory gets unwieldy. BATS provides the **load** function that takes a path to a Bash file relative to the script being tested (e.g., **test** , in our case) and sources that file. Files must end with the prefix **.bash** , but the path to the file passed to the **load** function can't include the prefix. **build.bats** loads the **bats-assert** and **bats-support** libraries, a small **[helpers.bash][7]** library, and a **docker_mock.bash** library (described below) with the following code placed at the beginning of the test script below the interpreter magic line:
+
+```
+load 'libs/bats-support/load'
+load 'libs/bats-assert/load'
+load 'helpers'
+load 'docker_mock'
+```
+
+### Stubbing test input and mocking external calls
+
+The majority of Bash scripts and libraries execute functions and/or executables when they run. Often they are programmed to behave in specific ways based on the exit status or output ( **stdout** , **stderr** ) of these functions or executables. To properly test these scripts, it is often necessary to make fake versions of these commands that are designed to behave in a specific way during a specific test, a process called "stubbing." It may also be necessary to spy on the program being tested to ensure it calls a specific command, or it calls a specific command with specific arguments, a process called "mocking." For more on this, check out this great [discussion of mocking and stubbing][8] in Ruby RSpec, which applies to any testing system.
+
+The Bash shell provides tricks that can be used in your BATS test scripts to do mocking and stubbing. All require the use of the Bash **export** command with the **-f** flag to export a function that overrides the original function or executable. This must be done before the tested program is executed. Here is a simple example that overrides the **cat** executable:
+
+```
+function cat() { echo "THIS WOULD CAT ${*}" }
+export -f cat
+```
+
+This method overrides a function in the same manner. If a test needs to override a function within the script or library being tested, it is important to source the tested script or library before the function is stubbed or mocked. Otherwise, the stub/mock will be replaced with the actual function when the script is sourced. Also, make sure to stub/mock before you run the command you're testing. Here is an example from **build.bats** that mocks the **raise** function described in **build.sh** to ensure a specific error message is raised by the login fuction:
+
+```
+@test ".login raises on oc error" {
+ source ${profile_script}
+ function raise() { echo "${1} raised"; }
+ export -f raise
+ run login
+ assert_failure
+ assert_output -p "Could not login raised"
+}
+```
+
+Normally, it is not necessary to unset a stub/mock function after the test, since **export** only affects the current subprocess during the **exec** of the current **@test** block. However, it is possible to mock/stub commands (e.g. **cat** , **sed** , etc.) that the BATS **assert** * functions use internally. These mock/stub functions must be **unset** before these assert commands are run, or they will not work properly. Here is an example from **build.bats** that mocks **sed** , runs the **build_deployable** function, and unsets **sed** before running any assertions:
+
+```
+@test ".build_deployable prints information, runs docker build on a modified Dockerfile.production and publish_image when its not a dry_run" {
+ local expected_dockerfile='Dockerfile.production'
+ local application='application'
+ local environment='environment'
+ local expected_original_base_image="${application}"
+ local expected_candidate_image="${application}-candidate:${environment}"
+ local expected_deployable_image="${application}:${environment}"
+ source ${profile_script}
+ mock_docker build --build-arg OAUTH_CLIENT_ID --build-arg OAUTH_REDIRECT --build-arg DDS_API_BASE_URL -t "${expected_deployable_image}" -
+ function publish_image() { echo "publish_image ${*}"; }
+ export -f publish_image
+ function sed() {
+ echo "sed ${*}" >&2;
+ echo "FROM application-candidate:environment";
+ }
+ export -f sed
+ run build_deployable "${application}" "${environment}"
+ assert_success
+ unset sed
+ assert_output --regexp "sed.*${expected_dockerfile}"
+ assert_output -p "Building ${expected_original_base_image} deployable ${expected_deployable_image} FROM ${expected_candidate_image}"
+ assert_output -p "FROM ${expected_candidate_image} piped"
+ assert_output -p "build --build-arg OAUTH_CLIENT_ID --build-arg OAUTH_REDIRECT --build-arg DDS_API_BASE_URL -t ${expected_deployable_image} -"
+ assert_output -p "publish_image ${expected_deployable_image}"
+}
+```
+
+Sometimes the same command, e.g. foo, will be invoked multiple times, with different arguments, in the same function being tested. These situations require the creation of a set of functions:
+
+ * mock_foo: takes expected arguments as input, and persists these to a TMP file
+ * foo: the mocked version of the command, which processes each call with the persisted list of expected arguments. This must be exported with export -f.
+ * cleanup_foo: removes the TMP file, for use in teardown functions. This can test to ensure that a @test block was successful before removing.
+
+
+
+Since this functionality is often reused in different tests, it makes sense to create a helper library that can be loaded like other libraries.
+
+A good example is **[docker_mock.bash][9]**. It is loaded into **build.bats** and used in any test block that tests a function that calls the Docker executable. A typical test block using **docker_mock** looks like:
+
+```
+@test ".publish_image fails if docker push fails" {
+ setup_publish
+ local expected_image="image"
+ local expected_publishable_image="${CI_REGISTRY_IMAGE}/${expected_image}"
+ source ${profile_script}
+ mock_docker tag "${expected_image}" "${expected_publishable_image}"
+ mock_docker push "${expected_publishable_image}" and_fail
+ run publish_image "${expected_image}"
+ assert_failure
+ assert_output -p "tagging ${expected_image} as ${expected_publishable_image}"
+ assert_output -p "tag ${expected_image} ${expected_publishable_image}"
+ assert_output -p "pushing image to gitlab registry"
+ assert_output -p "push ${expected_publishable_image}"
+}
+```
+
+This test sets up an expectation that Docker will be called twice with different arguments. With the second call to Docker failing, it runs the tested command, then tests the exit status and expected calls to Docker.
+
+One aspect of BATS introduced by **mock_docker.bash** is the **${BATS_TMPDIR}** environment variable, which BATS sets at the beginning to allow tests and helpers to create and destroy TMP files in a standard location. The **mock_docker.bash** library will not delete its persisted mocks file if a test fails, but it will print where it is located so it can be viewed and deleted. You may need to periodically clean old mock files out of this directory.
+
+One note of caution regarding mocking/stubbing: The **build.bats** test consciously violates a dictum of testing that states: [Don't mock what you don't own!][10] This dictum demands that calls to commands that the test's developer didn't write, like **docker** , **cat** , **sed** , etc., should be wrapped in their own libraries, which should be mocked in tests of scripts that use them. The wrapper libraries should then be tested without mocking the external commands.
+
+This is good advice and ignoring it comes with a cost. If the Docker CLI API changes, the test scripts will not detect this change, resulting in a false positive that won't manifest until the tested **build.sh** script runs in a production setting with the new version of Docker. Test developers must decide how stringently they want to adhere to this standard, but they should understand the tradeoffs involved with their decision.
+
+### Conclusion
+
+Introducing a testing regime to any software development project creates a tradeoff between a) the increase in time and organization required to develop and maintain code and tests and b) the increased confidence developers have in the integrity of the application over its lifetime. Testing regimes may not be appropriate for all scripts and libraries.
+
+In general, scripts and libraries that meet one or more of the following should be tested with BATS:
+
+ * They are worthy of being stored in source control
+ * They are used in critical processes and relied upon to run consistently for a long period of time
+ * They need to be modified periodically to add/remove/modify their function
+ * They are used by others
+
+
+
+Once the decision is made to apply a testing discipline to one or more Bash scripts or libraries, BATS provides the comprehensive testing features that are available in other software development environments.
+
+Acknowledgment: I am indebted to [Darrin Mann][11] for introducing me to BATS testing.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/testing-bash-bats
+
+作者:[Darin London][a]
+选题:[lujun9972][b]
+译者:[译者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/dmlond
+[b]: https://github.com/lujun9972
+[1]: https://github.com/sstephenson/bats
+[2]: http://testanything.org/
+[3]: https://git-scm.com/book/en/v2/Git-Tools-Submodules
+[4]: https://github.com/dmlond/how_to_bats/blob/preBats/build.sh
+[5]: https://github.com/dmlond/how_to_bats/blob/master/bin/build.sh
+[6]: https://github.com/dmlond/how_to_bats/blob/master/test/build.bats
+[7]: https://github.com/dmlond/how_to_bats/blob/master/test/helpers.bash
+[8]: https://www.codewithjason.com/rspec-mocks-stubs-plain-english/
+[9]: https://github.com/dmlond/how_to_bats/blob/master/test/docker_mock.bash
+[10]: https://github.com/testdouble/contributing-tests/wiki/Don't-mock-what-you-don't-own
+[11]: https://github.com/dmann
diff --git a/sources/tech/20190222 Q4OS Linux Revives Your Old Laptop with Windows- Looks.md b/sources/tech/20190222 Q4OS Linux Revives Your Old Laptop with Windows- Looks.md
new file mode 100644
index 0000000000..93549ac45b
--- /dev/null
+++ b/sources/tech/20190222 Q4OS Linux Revives Your Old Laptop with Windows- Looks.md
@@ -0,0 +1,192 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Q4OS Linux Revives Your Old Laptop with Windows’ Looks)
+[#]: via: (https://itsfoss.com/q4os-linux-review)
+[#]: author: (John Paul https://itsfoss.com/author/john/)
+
+Q4OS Linux Revives Your Old Laptop with Windows’ Looks
+======
+
+There are quite a few Linux distros available that seek to make new users feel at home by [imitating the look and feel of Windows][1]. Today, we’ll look at a distro that attempts to do this with limited success We’ll be looking at [Q4OS][2].
+
+### Q4OS Linux focuses on performance on low hardware
+
+![Q4OS Linux desktop after first boot][3]Q4OS after first boot
+
+> Q4OS is a fast and powerful operating system based on the latest technologies while offering highly productive desktop environment. We focus on security, reliability, long-term stability and conservative integration of verified new features. System is distinguished by speed and very low hardware requirements, runs great on brand new machines as well as legacy computers. It is also very applicable for virtualization and cloud computing.
+>
+> Q4OS Website
+
+Q4OS currently has two different release branches: 2.# Scorpion and 3.# Centaurus. Scorpion is the Long-Term-Support (LTS) release and will be supported for five years. That support should last until 2022. The most recent version of Scorpion is 2.6, which is based on [Debian][4] 9 Stretch. Centaurus is considered the testing branch and is based on Debian Buster. Centaurus will become the LTS when Debian Buster becomes stable.
+
+Q4OS is one of the few Linux distros that still support both 32-bit and 64-bit. It has also been ported to ARM devices, specifically the Raspberry PI and the PineBook.
+
+The one major thing that separates Q4OS from the majority of Linux distros is their use of the Trinity Desktop Environment as the default desktop environment.
+
+#### The not-so-famous Trinity Desktop Environment
+
+![][5]Trinity Desktop Environment
+
+I’m sure that most people are unfamiliar with the [Trinity Desktop Environment (TDE)][6]. I didn’t know until I discovered Q4OS a couple of years ago. TDE is a fork of [KDE][7], specifically KDE 3.5. TDE was created by Timothy Pearson and the first release took place in April 2010.
+
+From what I read, it sounds like TDE was created for the same reason as [MATE][8]). Early versions of KDE 4 were prone to crash and users were unhappy with the direction the new release was taking, it was decided to fork the previous release. That is where the similarities end. MATE has taken on a life of its own and grew to become an equal among desktop environments. Development of TDE seems to have slowed. There were two years between the last two point releases.
+
+Quick side note: TDE uses its own fork of Qt 3, named TQt.
+
+#### System Requirements
+
+According to the [Q4OS download page][9], the system requirements differ based on the desktop environment you install.
+
+**TDE Version**
+
+ * At least 300MHz CPU
+ * 128 MB of RAM
+ * 3 GB Storage
+
+
+
+**KDE Version**
+
+ * At least 1GHz CPU
+ * 1 GB of RAM
+ * 5 GB Storage
+
+
+
+You can see from the system requirements that Q4OS is a [lightweight Linux distribution suitable for older computers][10].
+
+#### Included apps by default
+
+The following applications are included in the full install of Q4OS:
+
+ * Google Chrome
+ * Thunderbird
+ * LibreOffice
+ * VLC player
+ * Konqueror browser
+ * Dolphin file manager
+ * AisleRiot Solitaire
+ * Konsole
+ * Software Center
+
+
+ * KMines
+ * Ockular
+ * KBounce
+ * DigiKam
+ * Kooka
+ * KolourPaint
+ * KSnapshot
+ * Gwenview
+ * Ark
+
+
+ * KMail
+ * SMPlayer
+ * KRec
+ * Brasero
+ * Amarok player
+ * qpdfview
+ * KOrganizer
+ * KMag
+ * KNotes
+
+
+
+Of course, you can install additional applications through the software center. Since Q4OS is based on Debian, you can also [install applications from deb packages][11].
+
+#### Q4OS can be installed from within Windows
+
+I was able to successfully install TrueOS on my Dell Latitude D630 without any issues. This laptop has an Intel Centrino Duo Core processor running at 2.00 GHz, NVIDIA Quadro NVS 135M graphics chip, and 4 GB of RAM.
+
+You have a couple of options to choose from when installing Q4OS. You can either install Q4OS with a CD (Live or install) or you can install it from inside Window. The Windows installer asks for the drive location you want to install to, how much space you want Q4OS to take up and what login information do you want to use.
+
+![][12]Q4OS Windows installer
+
+Compared to most distros, the Live ISOs are small. The KDE version weighs less than 1GB and the TDE version is just a little north of 500 MB.
+
+### Experiencing Q4OS: Feels like older Windows versions
+
+Please note that while there is a KDE installation ISO, I used the TDE installation ISO. The KDE Live CD is a recent addition, so TDE is more in line with the project’s long term goals.
+
+When you boot into Q4OS for the first time, it feels like you jumped through a time portal and are staring at Windows 2000. The initial app offerings are very slim, you have access to a file manager, a web browser and not much else. There isn’t even a screenshot tool installed.
+
+![][13]Konqueror film manager
+
+When you try to use the TDE browser (Konqueror), a dialog box pops up recommending using the Desktop Profiler to [install Google Chrome][14] or some other recent web browser.
+
+The Desktop Profiler allows you to choose between a bare-bones, basic or full desktop and which desktop environment you wish to use as default. You can also use the Desktop Profiler to install other desktop environments, such as MATE, Xfce, LXQT, LXDE, Cinnamon and GNOME.
+
+![Q4OS Welcome Screen][15]![Q4OS Welcome Screen][15]Q4OS Welcome Screen
+
+Q4OS comes with its own application center. However, the offerings are limited to less than 20 options, including Synaptic, Google Chrome, Chromium, Firefox, LibreOffice, Update Manager, VLC, Multimedia codecs, Thunderbird, LookSwitcher, NVIDIA drivers, Network Manager, Skype, GParted, Wine, Blueman, X2Go server, X2Go Client, and Virtualbox additions.
+
+![][16]Q4OS Software Centre
+
+If you want to install anything else, you need to either use the command line or the [synaptic package manager][17]. Synaptic is a very good package manager and has been very serviceable for many years, but it isn’t quite newbie friendly.
+
+If you install an application from the Software Centre, you are treated to an installer that looks a lot like a Windows installer. I can only imagine that this is for people converting to Linux from Windows.
+
+![][18]Firefox installer
+
+As I mentioned earlier, when you boot into Q4OS’ desktop for the first time it looks like something out of the 1990s. Thankfully, you can install a utility named LookSwitcher to install a different theme. Initially, you are only shown half a dozen themes. There are other themes that are considered works-in-progress. You can also enhance the default theme by picking a more vibrant background and making the bottom panel transparent.
+
+![][19]Q4OS using the Debonair theme
+
+### Final Thoughts on Q4OS
+
+I may have mentioned a few times in this review that Q4OS looks like a dated version of Windows. It is obviously a very conscious decision because great care was taken to make even the control panel and file manager look Windows-eque. The problem is that it reminds me more of [ReactOS][20] than something modern. The Q4OS website says that it is made using the latest technology. The look of the system disagrees and will probably put some new users off.
+
+The fact that the install ISOs are smaller than most means that they are very quick to download. Unfortunately, it also means that if you want to be productive, you’ll have to spend quite a bit of time downloading software, either manually or automatically. You’ll also need an active internet connection. There is a reason why most ISOs are several gigabytes.
+
+I made sure to test the Windows installer. I installed a test copy of Windows 10 and ran the Q4OS installer. The process took a few minutes because the installer, which is less than 10 MB had to download an ISO. When the process was done, I rebooted. I selected Q4OS from the menu, but it looked like I was booting into Windows 10 (got the big blue circle). I thought that the install failed, but I eventually got to Q4OS.
+
+One of the few things that I liked about Q4OS was how easy it was to install the NVIDIA drivers. After I logged in for the first time, a little pop-up told me that there were NVIDIA drivers available and asked me if I wanted to install them.
+
+Using Q4OS was definitely an interesting experience, especially using TDE for the first time and the Windows look and feel. However, the lack of apps in the Software Centre and some of the design choices stop me from recommending this distro.
+
+**Do you like Q4OS?**
+
+Have you ever used Q4OS? What is your favorite Debian-based distro? Please let us know in the comments below.
+
+If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][21].
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/q4os-linux-review
+
+作者:[John Paul][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/john/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/windows-like-linux-distributions/
+[2]: https://q4os.org/
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os1.jpg?resize=800%2C500&ssl=1
+[4]: https://www.debian.org/
+[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os4.jpg?resize=800%2C412&ssl=1
+[6]: https://www.trinitydesktop.org/
+[7]: https://en.wikipedia.org/wiki/KDE
+[8]: https://en.wikipedia.org/wiki/MATE_(software
+[9]: https://q4os.org/downloads1.html
+[10]: https://itsfoss.com/lightweight-linux-beginners/
+[11]: https://itsfoss.com/list-installed-packages-ubuntu/
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os-windows-installer.jpg?resize=800%2C610&ssl=1
+[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os2.jpg?resize=800%2C606&ssl=1
+[14]: https://itsfoss.com/install-chrome-ubuntu/
+[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os10.png?ssl=1
+[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os3.jpg?resize=800%2C507&ssl=1
+[17]: https://www.nongnu.org/synaptic/
+[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os5.jpg?resize=800%2C616&ssl=1
+[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os8Debonaire.jpg?resize=800%2C500&ssl=1
+[20]: https://www.reactos.org/
+[21]: http://reddit.com/r/linuxusersgroup
+[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os1.jpg?fit=800%2C500&ssl=1
diff --git a/sources/tech/20190225 How To Identify That The Linux Server Is Integrated With Active Directory (AD).md b/sources/tech/20190225 How To Identify That The Linux Server Is Integrated With Active Directory (AD).md
new file mode 100644
index 0000000000..55d30a7910
--- /dev/null
+++ b/sources/tech/20190225 How To Identify That The Linux Server Is Integrated With Active Directory (AD).md
@@ -0,0 +1,177 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How To Identify That The Linux Server Is Integrated With Active Directory (AD)?)
+[#]: via: (https://www.2daygeek.com/how-to-identify-that-the-linux-server-is-integrated-with-active-directory-ad/)
+[#]: author: (Vinoth Kumar https://www.2daygeek.com/author/vinoth/)
+
+How To Identify That The Linux Server Is Integrated With Active Directory (AD)?
+======
+
+Single Sign On (SSO) Authentication is an implemented in most of the organizations due to multiple applications access.
+
+It allows a user to logs in with a single ID and password to all the applications which is available in the organization.
+
+It uses a centralized authentication system for all the applications.
+
+A while ago we had written an article, **[how to integrate Linux system with AD][1]**.
+
+Today we are going to show you, how to check that the Linux system is integrated with AD using multiple ways.
+
+It can be done in four ways and we will explain one by one.
+
+ * **`ps Command:`** It report a snapshot of the current processes.
+ * **`id Command:`** It prints user identity.
+ * **`/etc/nsswitch.conf file:`** It is Name Service Switch configuration file.
+ * **`/etc/pam.d/system-auth file:`** It is Common configuration file for PAMified services.
+
+
+
+### How To Identify That The Linux Server Is Integrated With AD Using PS Command?
+
+ps command displays information about a selection of the active processes.
+
+To integrate the Linux server with AD, we need to use either `winbind` or `sssd` or `ldap` service.
+
+So, use the ps command to filter these services.
+
+If you found any of these services is running on system then we can decide that the system is currently integrate with AD using “winbind” or “sssd” or “ldap” service.
+
+You might get the output similar to below if the system is integrated with AD using `SSSD` service.
+
+```
+# ps -ef | grep -i "winbind\|sssd"
+
+root 29912 1 0 2017 ? 00:19:09 /usr/sbin/sssd -f -D
+root 29913 29912 0 2017 ? 04:36:59 /usr/libexec/sssd/sssd_be --domain 2daygeek.com --uid 0 --gid 0 --debug-to-files
+root 29914 29912 0 2017 ? 00:29:28 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --debug-to-files
+root 29915 29912 0 2017 ? 00:09:19 /usr/libexec/sssd/sssd_pam --uid 0 --gid 0 --debug-to-files
+root 31584 26666 0 13:41 pts/3 00:00:00 grep sssd
+```
+
+You might get the output similer to below if the system is integrated with AD using `winbind` service.
+
+```
+# ps -ef | grep -i "winbind\|sssd"
+
+root 676 21055 0 2017 ? 00:00:22 winbindd
+root 958 21055 0 2017 ? 00:00:35 winbindd
+root 21055 1 0 2017 ? 00:59:07 winbindd
+root 21061 21055 0 2017 ? 11:48:49 winbindd
+root 21062 21055 0 2017 ? 00:01:28 winbindd
+root 21959 4570 0 13:50 pts/2 00:00:00 grep -i winbind\|sssd
+root 27780 21055 0 2017 ? 00:00:21 winbindd
+```
+
+### How To Identify That The Linux Server Is Integrated With AD Using id Command?
+
+It Prints information for given user name, or the current user. It displays the UID, GUID, User Name, Primary Group Name and Secondary Group Name, etc.,
+
+If the Linux system is integrated with AD then you might get the output like below. The GID clearly shows that the user is coming from AD “domain users”.
+
+```
+# id daygeek
+
+uid=1918901106(daygeek) gid=1918900513(domain users) groups=1918900513(domain users)
+```
+
+### How To Identify That The Linux Server Is Integrated With AD Using nsswitch.conf file?
+
+The Name Service Switch (NSS) configuration file, `/etc/nsswitch.conf`, is used by the GNU C Library and certain other applications to determine the sources from which to obtain name-service information in a range of categories, and in what order. Each category of information is identified by a database name.
+
+You might get the output similar to below if the system is integrated with AD using `SSSD` service.
+
+```
+# cat /etc/nsswitch.conf | grep -i "sss\|winbind\|ldap"
+
+passwd: files sss
+shadow: files sss
+group: files sss
+services: files sss
+netgroup: files sss
+automount: files sss
+```
+
+You might get the output similar to below if the system is integrated with AD using `winbind` service.
+
+```
+# cat /etc/nsswitch.conf | grep -i "sss\|winbind\|ldap"
+
+passwd: files [SUCCESS=return] winbind
+shadow: files [SUCCESS=return] winbind
+group: files [SUCCESS=return] winbind
+```
+
+You might get the output similer to below if the system is integrated with AD using `ldap` service.
+
+```
+# cat /etc/nsswitch.conf | grep -i "sss\|winbind\|ldap"
+
+passwd: files ldap
+shadow: files ldap
+group: files ldap
+```
+
+### How To Identify That The Linux Server Is Integrated With AD Using system-auth file?
+
+It is Common configuration file for PAMified services.
+
+PAM stands for Pluggable Authentication Module that provides dynamic authentication support for applications and services in Linux.
+
+system-auth configuration file is provide a common interface for all applications and service daemons calling into the PAM library.
+
+The system-auth configuration file is included from nearly all individual service configuration files with the help of the include directive.
+
+You might get the output similar to below if the system is integrated with AD using `SSSD` service.
+
+```
+# cat /etc/pam.d/system-auth | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so"
+or
+# cat /etc/pam.d/system-auth-ac | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so"
+
+auth sufficient pam_sss.so use_first_pass
+account [default=bad success=ok user_unknown=ignore] pam_sss.so
+password sufficient pam_sss.so use_authtok
+session optional pam_sss.so
+```
+
+You might get the output similar to below if the system is integrated with AD using `winbind` service.
+
+```
+# cat /etc/pam.d/system-auth | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so"
+or
+# cat /etc/pam.d/system-auth-ac | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so"
+
+auth sufficient pam_winbind.so cached_login use_first_pass
+account [default=bad success=ok user_unknown=ignore] pam_winbind.so cached_login
+password sufficient pam_winbind.so cached_login use_authtok
+```
+
+You might get the output similar to below if the system is integrated with AD using `ldap` service.
+
+```
+# cat /etc/pam.d/system-auth | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so"
+or
+# cat /etc/pam.d/system-auth-ac | grep -i "pam_sss.so\|pam_winbind.so\|pam_ldap.so"
+
+auth sufficient pam_ldap.so cached_login use_first_pass
+account [default=bad success=ok user_unknown=ignore] pam_ldap.so cached_login
+password sufficient pam_ldap.so cached_login use_authtok
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/how-to-identify-that-the-linux-server-is-integrated-with-active-directory-ad/
+
+作者:[Vinoth Kumar][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/vinoth/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/join-integrate-rhel-centos-linux-system-to-windows-active-directory-ad-domain/
diff --git a/sources/tech/20190225 How to Install VirtualBox on Ubuntu -Beginner-s Tutorial.md b/sources/tech/20190225 How to Install VirtualBox on Ubuntu -Beginner-s Tutorial.md
new file mode 100644
index 0000000000..4ba0580ece
--- /dev/null
+++ b/sources/tech/20190225 How to Install VirtualBox on Ubuntu -Beginner-s Tutorial.md
@@ -0,0 +1,156 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to Install VirtualBox on Ubuntu [Beginner’s Tutorial])
+[#]: via: (https://itsfoss.com/install-virtualbox-ubuntu)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+How to Install VirtualBox on Ubuntu [Beginner’s Tutorial]
+======
+
+**This beginner’s tutorial explains various ways to install VirtualBox on Ubuntu and other Debian-based Linux distributions.**
+
+Oracle’s free and open source offering [VirtualBox][1] is an excellent virtualization tool, specially for desktop operating systems. I prefer using it over [VMWare Workstation in Linux][2], another virtualization tool.
+
+You can use virtualization software like VirtualBox for installing and using another operating system within a virtual machine.
+
+For example, you can [install Linux on VirtualBox inside Windows][3]. Similarly, you can also [install Windows inside Linux using VirtualBox][4].
+
+You can also use VirtualBox for installing another Linux distribution in your current Linux system. Actually, this is what I use it for. If I hear about a nice Linux distribution, instead of installing it on a real system, I test it on a virtual machine. It’s more convenient when you just want to try out a distribution before making a decision about installing it on your actual machine.
+
+![Linux installed inside Linux using VirtualBox][5]Ubuntu 18.10 installed inside Ubuntu 18.04
+
+In this beginner’s tutorial, I’ll show you various ways of installing Oracle VirtualBox on Ubuntu and other Debian-based distributions.
+
+### Installing VirtualBox on Ubuntu and Debian based Linux distributions
+
+The installation methods mentioned here should also work for other Debian and Ubuntu-based Linux distributions such as Linux Mint, elementary OS etc.
+
+#### Method 1: Install VirtualBox from Ubuntu Repository
+
+**Pros** : Easy installation
+
+**Cons** : Installs older version
+
+The easiest way to install VirtualBox on Ubuntu would be to search for it in the Software Center and install it from there.
+
+![VirtualBox in Ubuntu Software Center][6]VirtualBox is available in Ubuntu Software Center
+
+You can also install it from the command line using the command:
+
+```
+sudo apt install virtualbox
+```
+
+However, if you [check the package version before installing it][7], you’ll see that the VirtualBox provided by Ubuntu’s repository is quite old.
+
+For example, the current VirtualBox version at the time of writing this tutorial is 6.0 but the one in Software Center is 5.2. This means you won’t get the newer features introduced in the [latest version of VirtualBox][8].
+
+#### Method 2: Install VirtualBox using Deb file from Oracle’s website
+
+**Pros** : Easily install the latest version
+
+**Cons** : Can’t upgrade to newer version
+
+If you want to use the latest version of VirtualBox on Ubuntu, the easiest way would be to [use the deb file][9].
+
+Oracle provides read to use binary files for VirtualBox releases. If you look at its download page, you’ll see the option to download the deb installer files for Ubuntu and other distributions.
+
+![VirtualBox Linux Download][10]
+
+You just have to download this deb file and double click on it to install it. It’s as simple as that.
+
+However, the problem with this method is that you won’t get automatically updated to the newer VirtualBox releases. The only way is to remove the existing version, download the newer version and install it again. That’s not very convenient, is it?
+
+#### Method 3: Install VirualBox using Oracle’s repository
+
+**Pros** : Automatically updates with system updates
+
+**Cons** : Slightly complicated installation
+
+Now this is the command line method and it may seem complicated to you but it has advantages over the previous two methods. You’ll get the latest version of VirtualBox and it will be automatically updated to the future releases. That’s what you would want, I presume.
+
+To install VirtualBox using command line, you add the Oracle VirtualBox’s repository in your list of repositories. You add its GPG key so that your system trusts this repository. Now when you install VirtualBox, it will be installed from Oracle’s repository instead of Ubuntu’s repository. If there is a new version released, VirtualBox install will be updated along with the system updates. Let’s see how to do that.
+
+First, add the key for the repository. You can download and add the key using this single command.
+
+```
+wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
+```
+
+```
+Important for Mint users
+
+The next step will work for Ubuntu only. If you are using Linux Mint or some other distribution based on Ubuntu, replace $(lsb_release -cs) in the command with the Ubuntu version your current version is based on. For example, Linux Mint 19 series users should use bionic and Mint 18 series users should use xenial. Something like this
+
+sudo add-apt-repository “deb [arch=amd64] **bionic** contrib“
+```
+
+Now add the Oracle VirtualBox repository in the list of repositories using this command:
+
+```
+sudo add-apt-repository "deb [arch=amd64] http://download.virtualbox.org/virtualbox/debian $(lsb_release -cs) contrib"
+```
+
+If you have read my article on [checking Ubuntu version][11], you probably know that ‘lsb_release -cs’ will print the codename of your Ubuntu system.
+
+**Note** : If you see [add-apt-repository command not found][12] error, you’ll have to install software-properties-common package.
+
+Now that you have the correct repository added, refresh the list of available packages through these repositories and install VirtualBox.
+
+```
+sudo apt update && sudo apt install virtualbox-6.0
+```
+
+**Tip** : A good idea would be to type sudo apt install **virtualbox–** and hit tab to see the various VirtualBox versions available for installation and then select one of them by typing it completely.
+
+![Install VirtualBox via terminal][13]
+
+### How to remove VirtualBox from Ubuntu
+
+Now that you have learned to install VirtualBox, I would also mention the steps to remove it.
+
+If you installed it from the Software Center, the easiest way to remove the application is from the Software Center itself. You just have to find it in the [list of installed applications][14] and click the Remove button.
+
+Another ways is to use the command line.
+
+```
+sudo apt remove virtualbox virtualbox-*
+```
+
+Note that this will not remove the virtual machines and the files associated with the operating systems you installed using VirtualBox. That’s not entirely a bad thing because you may want to keep them safe to use it later or in some other system.
+
+**In the end…**
+
+I hope you were able to pick one of the methods to install VirtualBox. I’ll also write about using it effectively in another article. For the moment, if you have and tips or suggestions or any questions, feel free to leave a comment below.
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-virtualbox-ubuntu
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://www.virtualbox.org
+[2]: https://itsfoss.com/install-vmware-player-ubuntu-1310/
+[3]: https://itsfoss.com/install-linux-in-virtualbox/
+[4]: https://itsfoss.com/install-windows-10-virtualbox-linux/
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/linux-inside-linux-virtualbox.png?resize=800%2C450&ssl=1
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/virtualbox-ubuntu-software-center.jpg?ssl=1
+[7]: https://itsfoss.com/know-program-version-before-install-ubuntu/
+[8]: https://itsfoss.com/oracle-virtualbox-release/
+[9]: https://itsfoss.com/install-deb-files-ubuntu/
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/virtualbox-download.jpg?resize=800%2C433&ssl=1
+[11]: https://itsfoss.com/how-to-know-ubuntu-unity-version/
+[12]: https://itsfoss.com/add-apt-repository-command-not-found/
+[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/install-virtualbox-ubuntu-terminal.png?resize=800%2C165&ssl=1
+[14]: https://itsfoss.com/list-installed-packages-ubuntu/
diff --git a/sources/tech/20190225 Netboot a Fedora Live CD.md b/sources/tech/20190225 Netboot a Fedora Live CD.md
new file mode 100644
index 0000000000..2767719b8c
--- /dev/null
+++ b/sources/tech/20190225 Netboot a Fedora Live CD.md
@@ -0,0 +1,187 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Netboot a Fedora Live CD)
+[#]: via: (https://fedoramagazine.org/netboot-a-fedora-live-cd/)
+[#]: author: (Gregory Bartholomew https://fedoramagazine.org/author/glb/)
+
+Netboot a Fedora Live CD
+======
+
+
+
+[Live CDs][1] are useful for many tasks such as:
+
+ * installing the operating system to a hard drive
+ * repairing a boot loader or performing other rescue-mode operations
+ * providing a consistent and minimal environment for web browsing
+ * …and [much more][2].
+
+
+
+As an alternative to using DVDs and USB drives to store your Live CD images, you can upload them to an [iSCSI][3] server where they will be less likely to get lost or damaged. This guide shows you how to load your Live CD images onto an iSCSI server and access them with the [iPXE][4] boot loader.
+
+### Download a Live CD Image
+
+```
+$ MY_RLSE=27
+$ MY_LIVE=$(wget -q -O - https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/$MY_RLSE/Workstation/x86_64/iso | perl -ne '/(Fedora[^ ]*?-Live-[^ ]*?\.iso)(?{print $^N})/;')
+$ MY_NAME=fc$MY_RLSE
+$ wget -O $MY_NAME.iso https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/$MY_RLSE/Workstation/x86_64/iso/$MY_LIVE
+```
+
+The above commands download the Fedora-Workstation-Live-x86_64-27-1.6.iso Fedora Live image and save it as fc27.iso. Change the value of MY_RLSE to download other archived versions. Or you can browse to to download the latest Fedora live image. Versions prior to 21 used different naming conventions, and must be [downloaded manually here][5]. If you download a Live CD image manually, set the MY_NAME variable to the basename of the file without the extension. That way the commands in the following sections will reference the correct file.
+
+### Convert the Live CD Image
+
+Use the livecd-iso-to-disk tool to convert the ISO file to a disk image and add the netroot parameter to the embedded kernel command line:
+
+```
+$ sudo dnf install -y livecd-tools
+$ MY_SIZE=$(du -ms $MY_NAME.iso | cut -f 1)
+$ dd if=/dev/zero of=$MY_NAME.img bs=1MiB count=0 seek=$(($MY_SIZE+512))
+$ MY_SRVR=server-01.example.edu
+$ MY_RVRS=$(echo $MY_SRVR | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_SRVR})
+$ MY_LOOP=$(sudo losetup --show --nooverlap --find $MY_NAME.img)
+$ sudo livecd-iso-to-disk --format --extra-kernel-args netroot=iscsi:$MY_SRVR:::1:iqn.$MY_RVRS:$MY_NAME $MY_NAME.iso $MY_LOOP
+$ sudo losetup -d $MY_LOOP
+```
+
+### Upload the Live Image to your Server
+
+Create a directory on your iSCSI server to store your live images and then upload your modified image to it.
+
+**For releases 21 and greater:**
+
+```
+$ MY_FLDR=/images
+$ scp $MY_NAME.img $MY_SRVR:$MY_FLDR/
+```
+
+**For releases prior to 21:**
+
+```
+$ MY_FLDR=/images
+$ MY_LOOP=$(sudo losetup --show --nooverlap --find --partscan $MY_NAME.img)
+$ sudo tune2fs -O ^has_journal ${MY_LOOP}p1
+$ sudo e2fsck ${MY_LOOP}p1
+$ sudo dd status=none if=${MY_LOOP}p1 | ssh $MY_SRVR "dd of=$MY_FLDR/$MY_NAME.img"
+$ sudo losetup -d $MY_LOOP
+```
+
+### Define the iSCSI Target
+
+Run the following commands on your iSCSI server:
+
+```
+$ sudo -i
+# MY_NAME=fc27
+# MY_FLDR=/images
+# MY_SRVR=`hostname`
+# MY_RVRS=$(echo $MY_SRVR | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_SRVR})
+# cat << END > /etc/tgt/conf.d/$MY_NAME.conf
+
+ backing-store $MY_FLDR/$MY_NAME.img
+ readonly 1
+ allow-in-use yes
+
+END
+# tgt-admin --update ALL
+```
+
+### Create a Bootable USB Drive
+
+The [iPXE][4] boot loader has a [sanboot][6] command you can use to connect to and start the live images hosted on your iSCSI server. It can be compiled in many different [formats][7]. The format that works best depends on the type of hardware you’re running. As an example, the following instructions show how to [chain load][8] iPXE from [syslinux][9] on a USB drive.
+
+First, download iPXE and build it in its lkrn format. This should be done as a normal user on a workstation:
+
+```
+$ sudo dnf install -y git
+$ git clone http://git.ipxe.org/ipxe.git $HOME/ipxe
+$ sudo dnf groupinstall -y "C Development Tools and Libraries"
+$ cd $HOME/ipxe/src
+$ make clean
+$ make bin/ipxe.lkrn
+$ cp bin/ipxe.lkrn /tmp
+```
+
+Next, prepare a USB drive with a MSDOS partition table and a FAT32 file system. The below commands assume that you have already connected the USB drive to be formatted. **Be careful that you do not format the wrong drive!**
+
+```
+$ sudo -i
+# dnf install -y parted util-linux dosfstools
+# echo; find /dev/disk/by-id ! -regex '.*-part.*' -name 'usb-*' -exec readlink -f {} \; | xargs -i bash -c "parted -s {} unit MiB print | perl -0 -ne '/^Model: ([^(]*).*\n.*?([0-9]*MiB)/i && print \"Found: {} = \$2 \$1\n\"'"; echo; read -e -i "$(find /dev/disk/by-id ! -regex '.*-part.*' -name 'usb-*' -exec readlink -f {} \; -quit)" -p "Drive to format: " MY_USB
+# umount $MY_USB?
+# wipefs -a $MY_USB
+# parted -s $MY_USB mklabel msdos mkpart primary fat32 1MiB 100% set 1 boot on
+# mkfs -t vfat -F 32 ${MY_USB}1
+```
+
+Finally, install syslinux on the USB drive and configure it to chain load iPXE:
+
+```
+# dnf install -y syslinux-nonlinux
+# syslinux -i ${MY_USB}1
+# dd if=/usr/share/syslinux/mbr.bin of=${MY_USB}
+# MY_MNT=$(mktemp -d)
+# mount ${MY_USB}1 $MY_MNT
+# MY_NAME=fc27
+# MY_SRVR=server-01.example.edu
+# MY_RVRS=$(echo $MY_SRVR | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_SRVR})
+# cat << END > $MY_MNT/syslinux.cfg
+ui menu.c32
+default $MY_NAME
+timeout 100
+menu title SYSLINUX
+label $MY_NAME
+ menu label ${MY_NAME^^}
+ kernel ipxe.lkrn
+ append dhcp && sanboot iscsi:$MY_SRVR:::1:iqn.$MY_RVRS:$MY_NAME
+END
+# cp /usr/share/syslinux/menu.c32 $MY_MNT
+# cp /usr/share/syslinux/libutil.c32 $MY_MNT
+# cp /tmp/ipxe.lkrn $MY_MNT
+# umount ${MY_USB}1
+```
+
+You should be able to use this same USB drive to netboot additional iSCSI targets simply by editing the syslinux.cfg file and adding additional menu entries.
+
+This is just one method of loading iPXE. You could install syslinux directly on your workstation. Another option is to compile iPXE as an EFI executable and place it directly in your [ESP][10]. Yet another is to compile iPXE as a PXE loader and place it on your TFTP server to be referenced by DHCP. The best option depends on your environment.
+
+### Final Notes
+
+ * You may want to add the –filename \EFI\BOOT\grubx64.efi parameter to the sanboot command if you compile iPXE in its EFI format.
+ * It is possible to create custom live images. Refer to [Creating and using live CD][11] for more information.
+ * It is possible to add the –overlay-size-mb and –home-size-mb parameters to the livecd-iso-to-disk command to create live images with persistent storage. However, if you have multiple concurrent users, you’ll need to set up your iSCSI server to manage separate per-user writeable overlays. This is similar to what was shown in the “[How to Build a Netboot Server, Part 4][12]” article.
+ * The live images support a persistenthome option on their kernel command line (e.g. persistenthome=LABEL=HOME). Used together with CHAP-authenticated iSCSI targets, the persistenthome option provides an interesting alternative to NFS for centralized home directories.
+
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/netboot-a-fedora-live-cd/
+
+作者:[Gregory Bartholomew][a]
+选题:[lujun9972][b]
+译者:[译者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/glb/
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Live_CD
+[2]: https://en.wikipedia.org/wiki/Live_CD#Uses
+[3]: https://en.wikipedia.org/wiki/ISCSI
+[4]: https://ipxe.org/
+[5]: https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/
+[6]: http://ipxe.org/cmd/sanboot/
+[7]: https://ipxe.org/appnote/buildtargets#boot_type
+[8]: https://en.wikipedia.org/wiki/Chain_loading
+[9]: https://www.syslinux.org/wiki/index.php?title=SYSLINUX
+[10]: https://en.wikipedia.org/wiki/EFI_system_partition
+[11]: https://docs.fedoraproject.org/en-US/quick-docs/creating-and-using-a-live-installation-image/#proc_creating-and-using-live-cd
+[12]: https://fedoramagazine.org/how-to-build-a-netboot-server-part-4/
diff --git a/sources/tech/20190227 How to Display Weather Information in Ubuntu 18.04.md b/sources/tech/20190227 How to Display Weather Information in Ubuntu 18.04.md
new file mode 100644
index 0000000000..da0c0df203
--- /dev/null
+++ b/sources/tech/20190227 How to Display Weather Information in Ubuntu 18.04.md
@@ -0,0 +1,290 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to Display Weather Information in Ubuntu 18.04)
+[#]: via: (https://itsfoss.com/display-weather-ubuntu)
+[#]: author: (Sergiu https://itsfoss.com/author/sergiu/)
+
+How to Display Weather Information in Ubuntu 18.04
+======
+
+You’ve got a fresh Ubuntu install and you’re [customizing Ubuntu][1] to your liking. You want the best experience and the best apps for your needs.
+
+The only thing missing is a weather app. Luckily for you, we got you covered. Just make sure you have the Universe repository enabled.
+
+![Tools to Display Weather Information in Ubuntu Linux][2]
+
+### 8 Ways to Display Weather Information in Ubuntu 18.04
+
+Back in the Unity days, there were a few popular options like My Weather Indicator to display weather on your system. Those options are either discontinued or not available in Ubuntu 18.04 and higher versions anymore.
+
+Fortunately, there are many other options to choose from. Some are minimalist and plain simple to use, some offer detailed information (or even present you with news headlines) and some are made for terminal gurus. Whatever your needs may be, the right app is waiting for you.
+
+**Note:** The presented apps are in no particular order of ranking.
+
+**Top Panel Apps**
+
+These applications usually sit on the top panel of your screen. Good for quick look at the temperature.
+
+#### 1\. OpenWeather Shell Extension
+
+![Open Weather Gnome Shell Extesnsion][3]
+
+**Key features:**
+
+ * Simple to install and customize
+ * Uses OpenWeatherMap (by default)
+ * Many Units and Layout options
+ * Can save multiple locations (that can easily be changed)
+
+
+
+This is a great extension presenting you information in a simple manner. There are multiple ways to install this. It is the weather app that I find myself using the most, because it’s just a simple, no-hassle integrated weather display for the top panel.
+
+**How to Install:**
+
+I recommend reading this [detailed tutorial about using GNOME extensions][4]. The easiest way to install this extension is to open up a terminal and run:
+
+```
+sudo apt install gnome-shell-extension-weather
+```
+
+Then all you have to restart the gnome shell by executing:
+
+```
+Alt+F2
+```
+
+Enter **r** and press **Enter**.
+
+Now open up **Tweaks** (gnome tweak tool) and enable **Openweather** in the **Extensions** tab.
+
+#### 2\. gnome-weather
+
+![Gnome Weather App UI][5]
+![Gnome Weather App Top Panel][6]
+
+**Key features:**
+
+ * Pleasant Design
+ * Integrated into Calendar (Top Panel)
+ * Simple Install
+ * Flatpak install available
+
+
+
+This app is great for new users. The installation is only one command and the app is easy to use. Although it doesn’t have as many features as other apps, it is still great if you don’t want to bother with multiple settings and a complex install procedure.
+
+**How to Install:**
+
+All you have to do is run:
+
+```
+sudo apt install gnome-weather
+```
+
+Now search for **Weather** and the app should pop up. After logging out (and logging back in), the Calendar extension will be displayed.
+
+If you prefer, you can get a [flatpak][7] version.
+
+#### 3\. Meteo
+
+![Meteo Weather App UI][8]
+![Meteo Weather System Tray][9]
+
+**Key features:**
+
+ * Great UI
+ * Integrated into System Tray (Top Panel)
+ * Simple Install
+ * Great features (Maps)
+
+
+
+Meteo is a snap app on the heavier side. Most of that weight comes from the great Maps features, with maps presenting temperatures, clouds, precipitations, pressure and wind speed. It’s a distinct feature that I haven’t encountered in any other weather app.
+
+**Note** : After changing location, you might have to quit and restart the app for the changes to be applied in the system tray.
+
+**How to Install:**
+
+Open up the **Ubuntu Software Center** and search for **Meteo**. Install and launch.
+
+**Desktop Apps**
+
+These are basically desktop widgets. They look good and provide more information at a glance.
+
+#### 4\. Temps
+
+![Temps Weather App UI][10]
+
+**Key features:**
+
+ * Beautiful Design
+ * Useful Hotkeys
+ * Hourly Temperature Graph
+
+
+
+Temps is an electron app with a beautiful UI (though not exactly “light”). The most unique features are the temperature graphs. The hotkeys might feel unintuitive at first, but they prove to be useful in the long run. The app will minimize when you click somewhere else. Just press Ctrl+Shift+W to bring it back.
+
+This app is **Open-Source** , and the developer can’t afford the cost of a faster API key, so you might want to create your own API at [OpenWeatherMap][11].
+
+**How to Install:**
+
+Go to the website and download the version you need (probably 64-bit). Extract the archive. Open the extracted directory and double-click on **Temps**. Press Ctrl+Shift+W if the window minimizes.
+
+#### 5\. Cumulus
+
+![Cumulus Weather App UI][12]
+
+**Key features:**
+
+ * Color Selector for background and text
+
+ * Re-sizable window
+
+ * Tray Icon (temperature only)
+
+ * Allows multiple instances with different locations etc.
+
+
+
+
+Cumulus is a greatly customizable weather app, with a backend supporting Yahoo! Weather and OpenWeatherMap. The UI is great and the installer is simple to use. This app has amazing features. It’s one of the few weather apps that allow for multiple instances. You should definitely try it you are looking for an experience tailored to your preferences.
+
+**How to Install:**
+
+Go to the website and download the (online) installer. Open up a terminal and **cd** (change directory) to the directory where you downloaded the file.
+
+Then run
+
+```
+chmod +x Cumulus-online-installer-x64
+./Cumulus-online-installer-x64
+```
+
+Search for **Cumulus** and enjoy the app!
+
+**Terminal Apps**
+
+You are a terminal dweller? You can check the weather right in your terminal.
+
+#### 7\. WeGo
+
+![WeGo Weather App Terminal][13]
+
+**Key features:**
+
+ * Supports different APIs
+ * Pretty detailed
+ * Customizable config
+ * Multi-language support
+ * 1 to 7 day forecast
+
+
+
+WeGo is a Go app for displaying weather info in the terminal. It’s install can be a little tricky, but it’s easy to set up. You’ll need to register an API Key [here][14] (if using **forecast.io** , which is default). Once you set it up, it’s fairly practical for someone who mostly works in the terminal.
+
+**How to Install:**
+
+I recommend you to check out the GitHub page for complete information on installation, setup and features.
+
+#### 8\. Wttr.in
+
+![Wttr.in Weather App Terminal][15]
+
+**Key features:**
+
+ * Simple install
+ * Easy to use
+ * Lightweight
+ * 3 day forecast
+ * Moon phase
+
+
+
+If you really live in the terminal, this is the weather app for you. This is as lightweight as it gets. You can specify location (by default the app tries to detect your current location) and a few other parameters (eg. units).
+
+**How to Install:**
+
+Open up a terminal and install Curl:
+
+```
+sudo apt install curl
+```
+
+Then:
+
+```
+curl wttr.in
+```
+
+That’s it. You can specify location and parameters like so:
+
+```
+curl wttr.in/london?m
+```
+
+To check out other options type:
+
+```
+curl wttr.in/:help
+```
+
+If you found some settings you enjoy and you find yourself using them frequently, you might want to add an **alias**. To do so, open **~/.bashrc** with your favorite editor (that’s **vim** , terminal wizard). Go to the end and paste in
+
+```
+alias wttr='curl wttr.in/CITY_NAME?YOUR_PARAMS'
+```
+
+For example:
+
+```
+alias wttr='curl wttr.in/london?m'
+```
+
+Save and close **~/.bashrc** and run the command below to source the new file.
+
+```
+source ~/.bashrc
+```
+
+Now, typing **wttr** in the terminal and pressing Enter should execute your custom command.
+
+**Wrapping Up**
+
+These are a handful of the weather apps available for Ubuntu. We hope our list helped you discover an app fitting your needs, be that something with pleasant aesthetics or just a quick tool.
+
+What is your favorite weather app? Tell us about what you enjoy and why in the comments section.
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/display-weather-ubuntu
+
+作者:[Sergiu][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/sergiu/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/gnome-tricks-ubuntu/
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/display-weather-ubuntu.png?resize=800%2C450&ssl=1
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/open_weather_gnome_shell-1-1.jpg?fit=800%2C383&ssl=1
+[4]: https://itsfoss.com/gnome-shell-extensions/
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/gnome_weather_ui.jpg?fit=800%2C599&ssl=1
+[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/gnome_weather_top_panel.png?fit=800%2C587&ssl=1
+[7]: https://flatpak.org/
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/meteo_ui.jpg?fit=800%2C547&ssl=1
+[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/meteo_system_tray.png?fit=800%2C653&ssl=1
+[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/temps_ui.png?fit=800%2C623&ssl=1
+[11]: https://openweathermap.org/
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/cumulus_ui.png?fit=800%2C651&ssl=1
+[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/wego_terminal.jpg?fit=800%2C531&ssl=1
+[14]: https://developer.forecast.io/register
+[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/wttr_in_terminal.jpg?fit=800%2C526&ssl=1
diff --git a/sources/tech/20190228 3 open source behavior-driven development tools.md b/sources/tech/20190228 3 open source behavior-driven development tools.md
new file mode 100644
index 0000000000..9c004a14c2
--- /dev/null
+++ b/sources/tech/20190228 3 open source behavior-driven development tools.md
@@ -0,0 +1,83 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (3 open source behavior-driven development tools)
+[#]: via: (https://opensource.com/article/19/2/behavior-driven-development-tools)
+[#]: author: (Christine Ketterlin Fisher https://opensource.com/users/cketterlin)
+
+3 open source behavior-driven development tools
+======
+Having the right motivation is as important as choosing the right tool when implementing BDD.
+
+
+[Behavior-driven development][1] (BDD) seems very easy. Tests are written in an easily readable format that allows for feedback from product owners, business sponsors, and developers. Those tests are living documentation for your team, so you don't need requirements. The tools are easy to use and allow you to automate your test suite. Reports are generated with each test run to document every step and show you where tests are failing.
+
+Quick recap: Easily readable! Living documentation! Automation! Reports! What could go wrong, and why isn't everybody doing this?
+
+### Getting started with BDD
+
+So, you're ready to jump in and can't wait to pick the right open source tool for your team. You want it to be easy to use, automate all your tests, and provide easily understandable reports for each test run. Great, let's get started!
+
+Except, not so fast … First, what is your motivation for trying to implement BDD on your team? If the answer is simply to automate tests, go ahead and choose any of the tools listed below because chances are you're going to see minimal success in the long run.
+
+### My first effort
+
+I manage a team of business analysts (BA) and quality assurance (QA) engineers, but my background is on the business analysis side. About a year ago, I attended a talk where a developer talked about the benefits of BDD. He said that he and his team had given it a try during their last project. That should have been the first red flag, but I didn't realize it at the time. You cannot simply choose to "give BDD a try." It takes planning, preparation, and forethought into what you want your team to accomplish.
+
+However, you can try various parts of BDD without a large investment, and I eventually realized he and his team had written feature files and automated those tests using Cucumber. I also learned it was an experiment done solely by the team's developers, not the BA or QA staff, which defeats the purpose of understanding the end user's behavior.
+
+During the talk we were encouraged to try BDD, so my test analyst and I went to our boss and said we were willing to give it a shot. And then, we didn't know what to do. We had no guidance, no plan in place, and a leadership team who just wanted to automate testing. I don't think I need to tell you how this story ended. Actually, there wasn't even an end, just a slow fizzle after a few initial attempts at writing behavioral scenarios.
+
+### A fresh start
+
+Fast-forward a year, and I'm at a different company with a team of my own and BDD on the brain. I knew there was value there, but I also knew it went deeper than what I had initially been sold. I spent a lot of time thinking about how BDD could make a positive impact, not only on my team, but on our entire development team. Then I read [Discovery: Explore Behaviour Using Examples][2] by Gaspar Nagy and Seb Rose, and one of the first things I learned was that automation of tests is a benefit of BDD, but it should not be the main goal. No wonder we failed!
+
+This book changed how I viewed BDD and helped me start to fill in the pieces I had been missing. We are now on the (hopefully correct!) path to implementing BDD on our team. It involves active involvement from our product owners, business analysts, and manual and automated testers and buy-in and support from our executive leadership. We have a plan in place for our approach and our measures of success.
+
+We are still writing requirements (don't ever let anyone tell you that these scenarios can completely replace requirements!), but we are doing so with a more critical eye and evaluating where requirements and test scenarios overlap and how we can streamline the two.
+
+I have told the team we cannot even try to automate these tests for at least two quarters, at which point we'll evaluate and determine whether we're ready to move forward or not. Our current priorities are defining our team's standard language, practicing writing given/when/then scenarios, learning the Gherkin syntax, determining where to store these tests, and investigating how to integrate these tests into our pipeline.
+
+### 3 BDD tools to choose
+
+At its core, BDD is a way to help the entire team understand the end user's actions and behaviors, which will lead to more clear requirements, tests, and ultimately higher-quality applications. Before you pick your tool, do your pre-work. Think about your motivation, and understand that while the different parts and pieces of BDD are fairly simple, integrating them into your team is more challenging and needs careful thought and planning. Also, think about where your people fit in.
+
+Every organization has different roles, and BDD should not belong solely to developers nor test automation engineers. If you don't involve the business side, you're never going to gain the full benefit of this methodology. Once you have a strategy defined and are ready to move forward with automating your BDD scenarios, there are several open source tools for you to choose from.
+
+#### Cucumber
+
+[Cucumber][3] is probably the most recognized tool available that supports BDD. It is widely seen as a straightforward tool to learn and is easy to get started with. Cucumber relies on test scenarios that are written in plain text and follow the given/when/then format. Each scenario is an individual test. Scenarios are grouped into features, which is comparable to a test suite. Scenarios must be written in the Gherkin syntax for Cucumber to understand and execute the scenario's steps. The human-readable steps in the scenarios are tied to the step definitions in your code through the Cucumber framework. To successfully write and automate the scenarios, you need the right mix of business knowledge and technical ability. Identify the skill sets on your team to determine who will write and maintain the scenarios and who will automate them; most likely these should be managed by different roles. Because these tests are executed from the step definitions, reporting is very robust and can show you at which exact step your test failed. Cucumber works well with a variety of browser and API automation tools.
+
+#### JBehave
+
+[JBehave][4] is very similar to Cucumber. Scenarios are still written in the given/when/then format and are easily understandable by the entire team. JBehave supports Gherkin but also has its own JBehave syntax that can be used. Gherkin is more universal, but either option will work as long as you are consistent in your choice. JBehave has more configuration options than Cucumber, and its reports, although very detailed, need more configuration to get feedback from each step. JBehave is a powerful tool, but because it can be more customized, it is not quite as easy to get started with. Teams need to ask themselves exactly what features they need and whether or not learning the tool's various configurations is worth the time investment.
+
+#### Gauge
+
+Where Cucumber and JBehave are specifically designed to work with BDD, [Gauge][5] is not. If automation is your main goal (and not the entire BDD process), it is worth a look. Gauge tests are written in Markdown, which makes them easily readable. However, without a more standard format, such as the given/when/then BDD scenarios, tests can vary widely and, depending on the author, some tests will be much more digestible for business owners than others. Gauge works with multiple languages, so the automation team can leverage what they already use. Gauge also offers reporting with screenshots to show where the tests failed.
+
+### What are your needs?
+
+Implementing BDD allows the team to test the users' behaviors. This can be done without automating any tests at all, but when done correctly, can result in a powerful, reusable test suite. As a team, you will need to identify exactly what your automation needs are and whether or not you are truly going to use BDD or if you would rather focus on automating tests that are written in plain text. Either way, open source tools are available for you to use and to help support your testing evolution.
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/behavior-driven-development-tools
+
+作者:[Christine Ketterlin Fisher][a]
+选题:[lujun9972][b]
+译者:[译者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/cketterlin
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Behavior-driven_development
+[2]: https://www.amazon.com/gp/product/1983591254/ref=dbs_a_def_rwt_bibl_vppi_i0
+[3]: https://cucumber.io/
+[4]: https://jbehave.org/
+[5]: https://www.gauge.org/
diff --git a/sources/tech/20190228 MiyoLinux- A Lightweight Distro with an Old-School Approach.md b/sources/tech/20190228 MiyoLinux- A Lightweight Distro with an Old-School Approach.md
new file mode 100644
index 0000000000..3217e304cd
--- /dev/null
+++ b/sources/tech/20190228 MiyoLinux- A Lightweight Distro with an Old-School Approach.md
@@ -0,0 +1,161 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (MiyoLinux: A Lightweight Distro with an Old-School Approach)
+[#]: via: (https://www.linux.com/blog/learn/2019/2/miyolinux-lightweight-distro-old-school-approach)
+[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
+
+MiyoLinux: A Lightweight Distro with an Old-School Approach
+======
+
+
+I must confess, although I often wax poetic about the old ways of the Linux desktop, I much prefer my distributions to help make my daily workflow as efficient as possible. Because of that, my taste in Linux desktop distributions veers very far toward the modern side of things. I want a distribution that integrates apps seamlessly, gives me notifications, looks great, and makes it easy to work with certain services that I use.
+
+However, every so often it’s nice to dip my toes back into those old-school waters and remind myself why I fell in love with Linux in the first place. That’s precisely what [MiyoLinux][1] did for me recently. This lightweight distribution is based on [Devuan][2] and makes use of the [i3 Tiling Window Manager][3].
+
+Why is it important that MiyoLinux is based on Devuan? Because that means it doesn’t use systemd. There are many within the Linux community who’d be happy to make the switch to an old-school Linux distribution that opts out of systemd. If that’s you, MiyoLinux might just charm you into submission.
+
+But don’t think MiyoLinux is going to be as easy to get up and running as, say, Ubuntu Linux, Elementary OS, or Linux Mint. Although it’s not nearly as challenging as Arch or Gentoo, MiyoLinux does approach installation and basic usage a bit differently. Let’s take a look at how this particular distro handles things.
+
+### Installation
+
+The installation GUI of MiyoLinux is pretty basic. The first thing you’ll notice is that you are presented with a good amount of notes, regarding the usage of the MiyoLinux desktop. If you happen to be testing MiyoLinux via VirtualBox, you’ll wind up having to deal with the frustration of not being able to resize the window (Figure 1), as the Guest Additions cannot be installed. This also means mouse integration cannot be enabled during the installation, so you’ll have to tab through the windows and use your keyboard cursor keys and Enter key to make selections.
+
+![MiyoLinux][5]
+
+Figure 1: The first step in the MiyoLinux installation.
+
+[Used with permission][6]
+
+Once you click the Install MiyoLinux button, you’ll be prompted to continue using either ‘su” or sudo. Click the use sudo button to continue with the installation.
+
+The next screen of importance is the Installation Options window (Figure 2), where you can select various options for MiyoLinux (such as encryption, file system labels, disable automatic login, etc.).
+
+![Configuration][8]
+
+Figure 2: Configuration Installation options for MiyoLinux.
+
+[Used with permission][6]
+
+The MiyoLinux installation does not include an automatic partition tool. Instead, you’ll be prompted to run either cfdisk or GParted (Figure 3). If you don’t know your way around cfdisk, select GParted and make use of the GUI tool.
+
+![partitioning ][10]
+
+Figure 3: Select your partitioning tool for MiyoLinux.
+
+[Used with permission][6]
+
+With your disk partitioned (Figure 4), you’ll be required to take care of the following steps:
+
+ * Configure the GRUB bootloader.
+
+ * Select the filesystem for the bootloader.
+
+ * Configure time zone and locales.
+
+ * Configure keyboard, keyboard language, and keyboard layout.
+
+ * Okay the installation.
+
+
+
+
+Once, you’ve okay’d the installation, all packages will be installed and you will then be prompted to install the bootloader. Following that, you’ll be prompted to configure the following:
+
+ * Hostname.
+
+ * User (Figure 5).
+
+ * Root password.
+
+
+
+
+With the above completed, reboot and log into your new MiyoLinux installation.
+
+![hostname][12]
+
+Figure 5: Configuring hostname and username.
+
+[Creative Commons Zero][13]
+
+### Usage
+
+Once you’ve logged into the MiyoLinux desktop, you’ll find things get a bit less-than-user-friendly. This is by design. You won’t find any sort of mouse menu available anywhere on the desktop. Instead you use keyboard shortcuts to open the different types of menus. The Alt+m key combination will open the PMenu, which is what one would consider a fairly standard desktop mouse menu (Figure 6).
+
+The Alt+d key combination will open the dmenu, a search tool at the top of the desktop, where you can scroll through (using the cursor keys) or search for an app you want to launch (Figure 7).
+
+![dmenu][15]
+
+Figure 7: The dmenu in action.
+
+[Used with permission][6]
+
+### Installing Apps
+
+If you open the PMenu, click System > Synaptic Package Manager. From within that tool you can search for any app you want to install. However, if you find Synaptic doesn’t want to start from the PMenu, open the dmenu, search for terminal, and (once the terminal opens), issue the command sudo synaptic. That will get the package manager open, where you can start installing any applications you want (Figure 8).
+
+![Synaptic][17]
+
+Figure 8: The Synaptic Package Manager on MiyoLinux.
+
+[Used with permission][6]
+
+Of course, you can always install applications from the command line. MiyoLinux depends upon the Apt package manager, so installing applications is as easy as:
+
+```
+sudo apt-get install libreoffice -y
+```
+
+Once installed, you can start the new package from either the PMenu or dmenu tools.
+
+### MiyoLinux Accessories
+
+If you find you need a bit more from the MiyoLinux desktop, type the keyboard combination Alt+Ctrl+a to open the MiyoLinux Accessories tool (Figure 9). From this tool you can configure a number of options for the desktop.
+
+![Accessories][19]
+
+Figure 9: Configure i3, Conky, Compton, your touchpad, and more with the Accessories tool.
+
+[Used with permission][6]
+
+All other necessary keyboard shortcuts are listed on the default desktop wallpaper. Make sure to put those shortcuts to memory, as you won’t get very far in the i3 desktop without them.
+
+### A Nice Nod to Old-School Linux
+
+If you’re itching to throw it back to a time when Linux offered you a bit of challenge to your daily grind, MiyoLinux might be just the operating system for you. It’s a lightweight operating system that makes good use of a minimal set of tools. Anyone who likes their distributions to be less modern and more streamlined will love this take on the Linux desktop. However, if you prefer your desktop with the standard bells and whistles, found on modern distributions, you’ll probably find MiyoLinux nothing more than a fun distraction from the standard fare.
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/learn/2019/2/miyolinux-lightweight-distro-old-school-approach
+
+作者:[Jack Wallen][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/jlwallen
+[b]: https://github.com/lujun9972
+[1]: https://sourceforge.net/p/miyolinux/wiki/Home/
+[2]: https://devuan.org/
+[3]: https://i3wm.org/
+[4]: /files/images/miyo1jpg
+[5]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_1.jpg?itok=5PxRDYRE (MiyoLinux)
+[6]: /licenses/category/used-permission
+[7]: /files/images/miyo2jpg
+[8]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_2.jpg?itok=svlVr7VI (Configuration)
+[9]: /files/images/miyo3jpg
+[10]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_3.jpg?itok=lpNzZBPz (partitioning)
+[11]: /files/images/miyo5jpg
+[12]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_5.jpg?itok=lijIsgZ2 (hostname)
+[13]: /licenses/category/creative-commons-zero
+[14]: /files/images/miyo7jpg
+[15]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_7.jpg?itok=I8Ow3PX6 (dmenu)
+[16]: /files/images/miyo8jpg
+[17]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_8.jpg?itok=oa502KfM (Synaptic)
+[18]: /files/images/miyo9jpg
+[19]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/miyo_9.jpg?itok=gUM4mxEv (Accessories)
diff --git a/sources/tech/20190301 Emacs for (even more of) the win.md b/sources/tech/20190301 Emacs for (even more of) the win.md
new file mode 100644
index 0000000000..c1697f3cae
--- /dev/null
+++ b/sources/tech/20190301 Emacs for (even more of) the win.md
@@ -0,0 +1,84 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Emacs for (even more of) the win)
+[#]: via: (https://so.nwalsh.com/2019/03/01/emacs)
+[#]: author: (Norman Walsh https://so.nwalsh.com)
+
+Emacs for (even more of) the win
+======
+
+I use Emacs every day. I rarely notice it. But when I do, it usually brings me joy.
+
+>If you are a professional writer…Emacs outshines all other editing software in approximately the same way that the noonday sun does the stars. It is not just bigger and brighter; it simply makes everything else vanish.
+
+I’ve been using [Emacs][1] for well over twenty years. I use it for writing almost anything and everything (I edit Scala and Java in [IntelliJ][2]). I read my email in it. If it can be done in Emacs, that’s where I prefer to do it.
+
+Although I’ve used Emacs for literally decades, I realized around the new year that very little about my use of Emacs had changed in the past decade or more. New editing modes had come along, of course, I’d picked up a package or two, and I did adopt [Helm][3] a few years ago, but mostly it just did all the heavy lifting that I required of it, day in and day out without complaining or getting in my way. On the one hand, that’s a testament to how good it is. On the other hand, that’s an invitation to dig in and see what I’ve missed.
+
+At about the same time, I resolved to improve several aspects of my work life:
+
+ * **Better meeting management.** I’m lead on a couple of projects at work and those projects have meetings, both regularly scheduled and ad hoc; some of them I run, some of them, I only attend.
+
+I realized I’d become sloppy about my participation in meetings. It’s all too easy sit in a room where there’s a meeting going on but actually read email and work on other items. (I strongly oppose the “no laptops” rule in meetings, but that’s a topic for another day.)
+
+There are a couple of problems with sloppy participation. First, it’s disrespectful to the person who convened the meeting and the other participants. That’s actually sufficient reason not to do it, but I think there’s another problem: it disguises the cost of meetings.
+
+If you’re in a meeting but also answering your email and maybe fixing a bug, then that meeting didn’t cost anything (or as much). If meetings are cheap, then there will be more of them.
+
+I want fewer, shorter meetings. I don’t want to disguise their cost, I want them to be perceived as damned expensive and to be avoided unless absolutely necessary.
+
+Sometimes, they are absolutely necessary. And I appreciate that a quick meeting can sometimes resolve an issue quickly. But if I have ten short meetings a day, let’s not pretend that I’m getting anything else productive accomplished.
+
+I resolved to take notes at all the meetings I attend. I’m not offering to take minutes, necessarily, but I am taking minutes of a sort. It keeps me focused on the meeting and not catching up on other things.
+
+ * **Better time management.** There are lots and lots of things that I need or want to do, both professionally and personally. I’ve historically kept track off some of them in issue lists, some in saved email threads (in Emacs and [Gmail][4], for slightly different types of reminders), in my calendar, on “todo lists” of various sorts on my phone, and on little scraps of paper. And probably other places as well.
+
+I resolved to keep them all in one place. Not because I think there’s one place that’s uniformly best or better, but because I hope to accomplish two things. First, by having them all in one place, I hope to be able to develop a better and more holistic view of where I’m putting my energies. Second, because I want to develop a habitn. “A settled or regular tendency or practice, especially one that is hard to give up.” of recording, tracking, and preserving them.
+
+ * **Better accountability.** If you work in certain science or engineering disciplines, you will have developed the habit of keeping a [lab notebook][5]. Alas, I did not. But I resolved to do so.
+
+I’m not interested in the legal aspects that encourage bound pages or scribing only in permanent marker. What I’m interested in is developing the habit of keeping a record. My goal is to have a place to jot down ideas and design sketches and the like. If I have sudden inspiration or if I think of an edge case that isn’t in the test suite, I want my instinct to be to write it in my journal instead of scribbling it on a scrap of paper or promising myself that I’ll remember it.
+
+
+
+
+This confluence of resolutions led me quickly and more-or-less directly to [Org][6]. There is a large, active, and loyal community of Org users. I’ve played with it in the past (I even [wrote about it][7], at least in passing, a couple of years ago) and I tinkered long enough to [integrate MarkLogic][8] into it. (Boy has that paid off in the last week or two!)
+
+But I never used it.
+
+I am now using it. I take minutes in it, I record all of my todo items in it, and I keep a journal in it. I’m not sure there’s much value in me attempting to wax eloquent about it or enumerate all its features, you’ll find plenty of either with a quick web search.
+
+If you use Emacs, you should be using Org. If you don’t use Emacs, I’m confident you wouldn’t be the first person who started because of Org. It does a lot. It takes a little time to learn your way around and remember the shortcuts, but I think it’s worth it. (And if you carry an [iOS][9] device in your pocket, I recommend [beorg][10] for recording items while you’re on the go.)
+
+Naturally, I worked out how to [get XML out of it][11]⊕“Worked out” sure is a funny way to spell “hacked together in elisp.”. And from there, how to turn it back into the markup my weblog expects (and do so at the push of a button in Emacs, of course). So this is the first posting written in Org. It won’t be the last.
+
+P.S. Happy birthday [little weblog][12].
+
+--------------------------------------------------------------------------------
+
+via: https://so.nwalsh.com/2019/03/01/emacs
+
+作者:[Norman Walsh][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://so.nwalsh.com
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Emacs
+[2]: https://en.wikipedia.org/wiki/IntelliJ_IDEA
+[3]: https://emacs-helm.github.io/helm/
+[4]: https://en.wikipedia.org/wiki/Gmail
+[5]: https://en.wikipedia.org/wiki/Lab_notebook
+[6]: https://en.wikipedia.org/wiki/Org-mode
+[7]: https://www.balisage.net/Proceedings/vol17/html/Walsh01/BalisageVol17-Walsh01.html
+[8]: https://github.com/ndw/ob-ml-marklogic/
+[9]: https://en.wikipedia.org/wiki/IOS
+[10]: https://beorgapp.com/
+[11]: https://github.com/ndw/org-to-xml
+[12]: https://so.nwalsh.com/2017/03/01/helloWorld
diff --git a/sources/tech/20190301 Guide to Install VMware Tools on Linux.md b/sources/tech/20190301 Guide to Install VMware Tools on Linux.md
new file mode 100644
index 0000000000..e6a43bcde1
--- /dev/null
+++ b/sources/tech/20190301 Guide to Install VMware Tools on Linux.md
@@ -0,0 +1,143 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Guide to Install VMware Tools on Linux)
+[#]: via: (https://itsfoss.com/install-vmware-tools-linux)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Guide to Install VMware Tools on Linux
+======
+
+**VMware Tools enhances your VM experience by allowing you to share clipboard and folder among other things. Learn how to install VMware tools on Ubuntu and other Linux distributions.**
+
+In an earlier tutorial, you learned to [install VMware Workstation on Ubuntu][1]. You can further enhance the functionality of your virtual machines by installing VMware Tools.
+
+If you have already installed a guest OS on VMware, you must have noticed the requirement for [VMware tools][2] – even though not completely aware of what it is needed for.
+
+In this article, we will highlight the importance of VMware tools, the features it offers, and the method to install VMware tools on Ubuntu or any other Linux distribution.
+
+### VMware Tools: Overview & Features
+
+![Installing VMware Tools on Ubuntu][3]Installing VMware Tools on Ubuntu
+
+For obvious reasons, the virtual machine (your Guest OS) will not behave exactly like the host. There will be certain limitations in terms of its performance and operationg. And, that is why a set of utilities (VMware Tools) was introduced.
+
+VMware tools help in managing the guest OS in an efficient manner while also improving its performance.
+
+#### What exactly is VMware tool responsible for?
+
+![How to Install VMware tools on Linux][4]
+
+You have got a vague idea of what it does – but let us talk about the details:
+
+ * Synchronize the time between the guest OS and the host to make things easier.
+ * Unlocks the ability to pass messages from host OS to guest OS. For example, you copy a text on the host to your clipboard and you can easily paste it to your guest OS.
+ * Enables sound in guest OS.
+ * Improves video resolution.
+ * Improves the cursor movement.
+ * Fixes incorrect network speed data.
+ * Eliminates inadequate color depth.
+
+
+
+These are the major changes that happen when you install VMware tools on Guest OS. But, what exactly does it contain / feature in order to unlock/enhance these functionalities? Let’s see..
+
+#### VMware tools: Core Feature Details
+
+![Sharing clipboard between guest and host OS with VMware Tools][5]Sharing clipboard between guest and host OS with VMware Tools
+
+If you do not want to know what it includes to enable the functionalities, you can skip this part. But, for the curious readers, let us briefly discuss about it:
+
+**VMware device drivers:** It really depends on the OS. Most of the major operating systems do include device drivers by default. So, you do not have to install it separately. This generally involves – memory control driver, mouse driver, audio driver, NIC driver, VGA driver and so on.
+
+**VMware user process:** This is where things get really interesting. With this, you get the ability to copy-paste and drag-drop between the host and the guest OS. You can basically copy and paste the text from the host to the virtual machine or vice versa.
+
+You get to drag and drop files as well. In addition, it enables the pointer release/lock when you do not have an SVGA driver installed.
+
+**VMware tools lifecycle management** : Well, we will take a look at how to install VMware tools below – but this feature helps you easily install/upgrade VMware tools in the virtual machine.
+
+**Shared Folders** : In addition to these, VMware tools also allow you to have shared folders between the guest OS and the host.
+
+![Sharing folder between guest and host OS using VMware Tools in Linux][6]Sharing folder between guest and host OS using VMware Tools in Linux
+
+Of course, what it does and facilitates also depends on the host OS. For example, on Windows, you get a Unity mode on VMware to run programs on virtual machine and operate it from the host OS.
+
+### How to install VMware Tools on Ubuntu & other Linux distributions
+
+**Note:** For Linux guest operating systems, you should already have “Open VM Tools” suite installed, eliminating the need of installing VMware tools separately, most of the time.
+
+Most of the time, when you install a guest OS, you will get a prompt as a software update or a popup telling you to install VMware tools if the operating system supports [Easy Install][7].
+
+Windows and Ubuntu does support Easy Install. So, even if you are using Windows as your host OS or trying to install VMware tools on Ubuntu, you should first get an option to install the VMware tools easily as popup message. Here’s how it should look like:
+
+![Pop-up to install VMware Tools][8]Pop-up to install VMware Tools
+
+This is the easiest way to get it done. So, make sure you have an active network connection when you setup the virtual machine.
+
+If you do not get any of these pop ups – or options to easily install VMware tools. You have to manually install it. Here’s how to do that:
+
+1\. Launch VMware Workstation Player.
+
+2\. From the menu, navigate through **Virtual Machine - > Install VMware tools**. If you already have it installed, and want to repair the installation, you will observe the same option to appear as “ **Re-install VMware tools** “.
+
+3\. Once you click on that, you will observe a virtual CD/DVD mounted in the guest OS.
+
+4\. Open that and copy/paste the **tar.gz** file to any location of your choice and extract it, here we choose the **Desktop**.
+
+![][9]
+
+5\. After extraction, launch the terminal and navigate to the folder inside by typing in the following command:
+
+```
+cd Desktop/VMwareTools-10.3.2-9925305/vmware-tools-distrib
+```
+
+You need to check the name of the folder and path in your case – depending on the version and where you extracted – it might vary.
+
+![][10]
+
+Replace **Desktop** with your storage location (such as cd Downloads) and the rest should remain the same if you are installing **10.3.2 version**.
+
+6\. Now, simply type in the following command to start the installation:
+
+```
+sudo ./vmware-install.pl -d
+```
+
+![][11]
+
+You will be asked the password for permission to install, type it in and you should be good to go.
+
+That’s it. You are done. These set of steps should be applicable to almost any Ubuntu-based guest operating system. If you want to install VMware tools on Ubuntu Server, or any other OS.
+
+**Wrapping Up**
+
+Installing VMware tools on Ubuntu Linux is pretty easy. In addition to the easy method, we have also explained the manual method to do it. If you still need help, or have a suggestion regarding the installation, let us know in the comments down below.
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-vmware-tools-linux
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/install-vmware-player-ubuntu-1310/
+[2]: https://kb.vmware.com/s/article/340
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-downloading.jpg?fit=800%2C531&ssl=1
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/install-vmware-tools-linux.png?resize=800%2C450&ssl=1
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-features.gif?resize=800%2C500&ssl=1
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-shared-folder.jpg?fit=800%2C660&ssl=1
+[7]: https://docs.vmware.com/en/VMware-Workstation-Player-for-Linux/15.0/com.vmware.player.linux.using.doc/GUID-3F6B9D0E-6CFC-4627-B80B-9A68A5960F60.html
+[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools.jpg?fit=800%2C481&ssl=1
+[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-extraction.jpg?fit=800%2C564&ssl=1
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-folder.jpg?fit=800%2C487&ssl=1
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-installation-ubuntu.jpg?fit=800%2C492&ssl=1
diff --git a/sources/tech/20190302 Create a Custom System Tray Indicator For Your Tasks on Linux.md b/sources/tech/20190302 Create a Custom System Tray Indicator For Your Tasks on Linux.md
new file mode 100644
index 0000000000..d9d42b7a2f
--- /dev/null
+++ b/sources/tech/20190302 Create a Custom System Tray Indicator For Your Tasks on Linux.md
@@ -0,0 +1,187 @@
+[#]: collector: (lujun9972)
+[#]: translator: (lujun9972)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Create a Custom System Tray Indicator For Your Tasks on Linux)
+[#]: via: (https://fosspost.org/tutorials/custom-system-tray-icon-indicator-linux)
+[#]: author: (M.Hanny Sabbagh https://fosspost.org/author/mhsabbagh)
+
+Create a Custom System Tray Indicator For Your Tasks on Linux
+======
+
+System Tray icons are still considered to be an amazing functionality today. By just right-clicking on the icon, and then selecting which actions you would like to take, you may ease your life a lot and save many unnecessary clicks on daily basis.
+
+When talking about useful system tray icons, examples like Skype, Dropbox and VLC do come to mind:
+
+![Create a Custom System Tray Indicator For Your Tasks on Linux 11][1]
+
+However, system tray icons can actually be quite a lot more useful; By simply building one yourself for your own needs. In this tutorial, we’ll explain how to do that for you in very simple steps.
+
+### Prerequisites
+
+We are going to build a custom system tray indicator using Python. Python is probably installed by default on all the major Linux distributions, so just check it’s there (version 2.7). Additionally, we’ll need the gir1.2-appindicator3 package installed. It’s the library allowing us to easily create system tray indicators.
+
+To install it on Ubuntu/Mint/Debian:
+
+```
+sudo apt-get install gir1.2-appindicator3
+```
+
+On Fedora:
+
+```
+sudo dnf install libappindicator-gtk3
+```
+
+For other distributions, just search for any packages containing appindicator.
+
+On GNOME Shell, system tray icons are removed starting from 3.26. You’ll need to install the [following extension][2] (Or possibly other extensions) to re-enable the feature on your desktop. Otherwise, you won’t be able to see the indicator we are going to create here.
+
+### Basic Code
+
+Here’s the basic code of the indicator:
+
+```
+#!/usr/bin/python
+import os
+from gi.repository import Gtk as gtk, AppIndicator3 as appindicator
+
+def main():
+ indicator = appindicator.Indicator.new("customtray", "semi-starred-symbolic", appindicator.IndicatorCategory.APPLICATION_STATUS)
+ indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
+ indicator.set_menu(menu())
+ gtk.main()
+
+def menu():
+ menu = gtk.Menu()
+
+ command_one = gtk.MenuItem('My Notes')
+ command_one.connect('activate', note)
+ menu.append(command_one)
+
+ exittray = gtk.MenuItem('Exit Tray')
+ exittray.connect('activate', quit)
+ menu.append(exittray)
+
+ menu.show_all()
+ return menu
+
+def note(_):
+ os.system("gedit $HOME/Documents/notes.txt")
+
+def quit(_):
+ gtk.main_quit()
+
+if __name__ == "__main__":
+ main()
+```
+
+We’ll explain how the code works later. But for know, just save it in a text file under the name tray.py, and run it using Python:
+
+```
+python tray.py
+```
+
+You’ll see the indicator working as follows:
+
+![Create a Custom System Tray Indicator For Your Tasks on Linux 13][3]
+
+Now, to explain how we did the magic:
+
+ * The first 3 lines of the code are nothing more than just specifying the Python path and importing the libraries we are going to use in our indicator.
+
+ * def main() : This is the main function of the indicator. Under it we write the code to initialize and build the indicator.
+
+ * indicator = appindicator.Indicator.new(“customtray”, “semi-starred-symbolic”, appindicator.IndicatorCategory.APPLICATION_STATUS) : Here we are specially creating a new indicator and calling it `customtray` . This is the special name of the indicator so that the system doesn’t mix it with other indicators that may be running. Also, we used the `semi-starred-symbolic` icon name as the default icon for our indicator. You could possibly change thing to any other things; Say `firefox` (if you want to see Firefox icon being used for the indicator), or any other icon name you would like. The last part regarding the `APPLICATION_STATUS` is just ordinary code for the categorization/scope of that indicator.
+
+ * `indicator.set_status(appindicator.IndicatorStatus.ACTIVE)` : This line just turns the indicator on.
+
+ * `indicator.set_menu(menu())` : Here, we are saying that we want to use the `menu()` function (which we’ll define later) for creating the menu items of our indicator. This is important so that when you click on the indicator, you can see a list of possible actions to take.
+
+ * `gtk.main()` : Just run the main GTK loop.
+
+ * Under `menu()` you’ll see that we are creating the actions/items we want to provide using our indicator. `command_one = gtk.MenuItem(‘My Notes’)` simply initializes the first menu item with the text “My notes”, and then `command_one.connect(‘activate’, note)` connects the `activate` signal of that menu item to the `note()` function defined later; In other words, we are telling our system here: “When this menu item is clicked, run the note() function”. Finally, `menu.append(command_one)` adds that menu item to the list.
+
+ * The lines regarding `exittray` are just for creating an exit menu item to close the indicator any time you want.
+
+ * `menu.show_all()` and `return menu` are just ordinary codes for returning the menu list to the indicator.
+
+ * Under `note(_)` you’ll see the code that must be executed when the “My Notes” menu item is clicked. Here, we just wrote `os.system(“gedit $HOME/Documents/notes.txt”)` ; The `os.system` function is a function that allows us to run shell commands from inside Python, so here we wrote a command to open a file called `notes.txt` under the `Documents` folder in our home directory using the `gedit` editor. This for example can be your daily notes taking program from now on!
+
+### Adding your Needed Tasks
+
+There are only 2 things you need to touch in the code:
+
+ 1. Define a new menu item under `menu()` for your desired task.
+
+ 2. Create a new function to run a specific action when that menu item is clicked.
+
+
+So, let’s say that you want to create a new menu item, which when clicked, plays a specific video/audio file on your hard disk using VLC? To do it, simply add the following 3 lines in line 17:
+
+```
+command_two = gtk.MenuItem('Play video/audio')
+command_two.connect('activate', play)
+menu.append(command_two)
+```
+
+And the following lines in line 30:
+
+```
+def play(_):
+ os.system("vlc /home//Videos/somevideo.mp4")
+```
+
+Replace /home//Videos/somevideo.mp4 with the path to the video/audio file you want. Now save the file and run the indicator again:
+
+```
+python tray.py
+```
+
+This is how you’ll see it now:
+
+![Create a Custom System Tray Indicator For Your Tasks on Linux 15][4]
+
+And when you click on the newly-created menu item, VLC will start playing!
+
+To create other items/tasks, simply redo the steps again. Just be careful to replace command_two with another name, like command_three, so that no clash between variables happen. And then define new separate functions like what we did with the play(_) function.
+
+The possibilities are endless from here; I am using this way for example to fetch some data from the web (using the urllib2 library) and display them for me any time. I am also using it for playing an mp3 file in the background using the mpg123 command, and I am defining another menu item to killall mpg123 to stop playing that audio whenever I want. CS:GO on Steam for example takes a huge time to exit (the window doesn’t close automatically), so as a workaround for this, I simply minimize the window and click on a menu item that I created which will execute killall -9 csgo_linux64.
+
+You can use this indicator for anything: Updating your system packages, possibly running some other scripts any time you want.. Literally anything.
+
+### Autostart on Boot
+
+We want our system tray indicator to start automatically on boot, we don’t want to run it manually each time. To do that, simply add the following command to your startup applications (after you replace the path to the tray.py file with yours):
+
+```
+nohup python /home//tray.py &
+```
+
+The very next time you reboot your system, the indicator will start working automatically after boot!
+
+### Conclusion
+
+You now know how to create your own system tray indicator for any task that you may want. This method should save you a lot of time depending on the nature and number of tasks you need to run on daily basis. Some users may prefer creating aliases from the command line, but this will require you to always open the terminal window or have a drop-down terminal emulator available, while here, the system tray indicator is always working and available for you.
+
+Have you used this method to run your tasks before? Would love to hear your thoughts.
+
+
+--------------------------------------------------------------------------------
+
+via: https://fosspost.org/tutorials/custom-system-tray-icon-indicator-linux
+
+作者:[M.Hanny Sabbagh][a]
+选题:[lujun9972][b]
+译者:[lujun9972](https://github.com/lujun9972)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fosspost.org/author/mhsabbagh
+[b]: https://github.com/lujun9972
+[1]: https://i2.wp.com/fosspost.org/wp-content/uploads/2019/02/Screenshot-at-2019-02-28-0808.png?resize=407%2C345&ssl=1 (Create a Custom System Tray Indicator For Your Tasks on Linux 12)
+[2]: https://extensions.gnome.org/extension/1031/topicons/
+[3]: https://i2.wp.com/fosspost.org/wp-content/uploads/2019/03/Screenshot-at-2019-03-02-1041.png?resize=434%2C140&ssl=1 (Create a Custom System Tray Indicator For Your Tasks on Linux 14)
+[4]: https://i2.wp.com/fosspost.org/wp-content/uploads/2019/03/Screenshot-at-2019-03-02-1141.png?resize=440%2C149&ssl=1 (Create a Custom System Tray Indicator For Your Tasks on Linux 16)
diff --git a/sources/tech/20190304 How to Install MongoDB on Ubuntu.md b/sources/tech/20190304 How to Install MongoDB on Ubuntu.md
new file mode 100644
index 0000000000..30d588ddba
--- /dev/null
+++ b/sources/tech/20190304 How to Install MongoDB on Ubuntu.md
@@ -0,0 +1,238 @@
+[#]: collector: (lujun9972)
+[#]: translator: (An-DJ)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to Install MongoDB on Ubuntu)
+[#]: via: (https://itsfoss.com/install-mongodb-ubuntu)
+[#]: author: (Sergiu https://itsfoss.com/author/sergiu/)
+
+How to Install MongoDB on Ubuntu
+======
+
+**This tutorial presents two ways to install MongoDB on Ubuntu and Ubuntu-based Linux distributions.**
+
+[MongoDB][1] is an increasingly popular free and open-source NoSQL database that stores data in collections of JSON-like, flexible documents, in contrast to the usual table approach you’ll find in SQL databases.
+
+You are most likely to find MongoDB used in modern web applications. Its document model makes it very intuitive to access and handle with various programming languages.
+
+![mongodb Ubuntu][2]
+
+In this article, I’ll cover two ways you can install MongoDB on your Ubuntu system.
+
+### Installing MongoDB on Ubuntu based Distributions
+
+ 1. Install MongoDB using Ubuntu’s repository. Easy but not the latest version of MongoDB
+ 2. Install MongoDB using its official repository. Slightly complicated but you get the latest version of MongoDB.
+
+
+
+The first installation method is easier, but I recommend the second method if you plan on using the latest release with official support.
+
+Some people might prefer using snap packages. There are snaps available in the Ubuntu Software Center, but I wouldn’t recommend using them; they’re outdated at the moment and I won’t be covering that.
+
+#### Method 1. Install MongoDB from Ubuntu Repository
+
+This is the easy way to install MongoDB on your system, you only need to type in a simple command.
+
+##### Installing MongoDB
+
+First, make sure your packages are up-to-date. Open up a terminal and type:
+
+```
+sudo apt update && sudo apt upgrade -y
+```
+
+Go ahead and install MongoDB with:
+
+```
+sudo apt install mongodb
+```
+
+That’s it! MongoDB is now installed on your machine.
+
+The MongoDB service should automatically be started on install, but to check the status type
+
+```
+sudo systemctl status mongodb
+```
+
+![Check if the MongoDB service is running.][3]
+
+You can see that the service is **active**.
+
+##### Running MongoDB
+
+MongoDB is currently a systemd service, so we’ll use **systemctl** to check and modify it’s state, using the following commands:
+
+```
+sudo systemctl status mongodb
+sudo systemctl stop mongodb
+sudo systemctl start mongodb
+sudo systemctl restart mongodb
+```
+
+You can also change if MongoDB automatically starts when the system starts up ( **default** : enabled):
+
+```
+sudo systemctl disable mongodb
+sudo systemctl enable mongodb
+```
+
+To start working with (creating and editing) databases, type:
+
+```
+mongo
+```
+
+This will start up the **mongo shell**. Please check out the [manual][4] for detailed information on the available queries and options.
+
+**Note:** Depending on how you plan to use MongoDB, you might need to adjust your Firewall. That’s unfortunately more involved than what I can cover here and depends on your configuration.
+
+##### Uninstall MongoDB
+
+If you installed MongoDB from the Ubuntu Repository and want to uninstall it (maybe to install using the officially supported way), type:
+
+```
+sudo systemctl stop mongodb
+sudo apt purge mongodb
+sudo apt autoremove
+```
+
+This should completely get rid of your MongoDB install. Make sure to **backup** any collections or documents you might want to keep since they will be wiped out!
+
+#### Method 2. Install MongoDB Community Edition on Ubuntu
+
+This is the way the recommended way to install MongoDB, using the package manager. You’ll have to type a few more commands and it might be intimidating if you are newer to the Linux world.
+
+But there’s nothing to be afraid of! We’ll go through the installation process step by step.
+
+##### Installing MongoDB
+
+The package maintained by MongoDB Inc. is called **mongodb-org** , not **mongodb** (this is the name of the package in the Ubuntu Repository). Make sure **mongodb** is not installed on your system before applying this steps. The packages will conflict. Let’s get to it!
+
+First, we’ll have to import the public key:
+
+```
+sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
+```
+
+Now, you need to add a new repository in your sources list so that you can install MongoDB Community Edition and also get automatic updates:
+
+```
+echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
+```
+
+To be able to install **mongodb-org** , we’ll have to update our package database so that your system is aware of the new packages available:
+
+```
+sudo apt update
+```
+
+Now you can ether install the **latest stable version** of MongoDB:
+
+```
+sudo apt install -y mongodb-org
+```
+
+or a **specific version** (change the version number after **equal** sign)
+
+```
+sudo apt install -y mongodb-org=4.0.6 mongodb-org-server=4.0.6 mongodb-org-shell=4.0.6 mongodb-org-mongos=4.0.6 mongodb-org-tools=4.0.6
+```
+
+If you choose to install a specific version, make sure you change the version number everywhere. If you only change it in the **mongodb-org=4.0.6** part, the latest version will be installed.
+
+By default, when updating using the package manager ( **apt-get** ), MongoDB will be updated to the newest updated version. To stop that from happening (and freezing to the installed version), use:
+
+```
+echo "mongodb-org hold" | sudo dpkg --set-selections
+echo "mongodb-org-server hold" | sudo dpkg --set-selections
+echo "mongodb-org-shell hold" | sudo dpkg --set-selections
+echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
+echo "mongodb-org-tools hold" | sudo dpkg --set-selections
+```
+
+You have now successfully installed MongoDB!
+
+##### Configuring MongoDB
+
+By default, the package manager will create **/var/lib/mongodb** and **/var/log/mongodb** and MongoDB will run using the **mongodb** user account.
+
+I won’t go into changing these default settings since that is beyond the scope of this guide. You can check out the [manual][5] for detailed information.
+
+The settings in **/etc/mongod.conf** are applied when starting/restarting the **mongodb** service instance.
+
+##### Running MongoDB
+
+To start the mongodb daemon **mongod** , type:
+
+```
+sudo service mongod start
+```
+
+Now you should verify that the **mongod** process started successfully. This information is stored (by default) at **/var/log/mongodb/mongod.log**. Let’s check the contents of that file:
+
+```
+sudo cat /var/log/mongodb/mongod.log
+```
+
+![Check MongoDB logs to see if the process is running properly.][6]
+
+As long as you get this: **[initandlisten] waiting for connections on port 27017** somewhere in there, the process is running properly.
+
+**Note: 27017** is the default port of **mongod.**
+
+To stop/restart **mongod** enter:
+
+```
+sudo service mongod stop
+sudo service mongod restart
+```
+
+Now, you can use MongoDB by opening the **mongo shell** :
+
+```
+mongo
+```
+
+##### Uninstall MongoDB
+
+Run the following commands
+
+```
+sudo service mongod stop
+sudo apt purge mongodb-org*
+```
+
+To remove the **databases** and **log files** (make sure to **backup** what you want to keep!):
+
+```
+sudo rm -r /var/log/mongodb
+sudo rm -r /var/lib/mongodb
+```
+
+**Wrapping Up**
+
+MongoDB is a great NoSQL database, easy to integrate into modern projects. I hope this tutorial helped you to set it up on your Ubuntu machine! Let us know how you plan on using MongoDB in the comments below.
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-mongodb-ubuntu
+
+作者:[Sergiu][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/sergiu/
+[b]: https://github.com/lujun9972
+[1]: https://www.mongodb.com/
+[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/mongodb-ubuntu.jpeg?resize=800%2C450&ssl=1
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/mongodb_check_status.jpg?fit=800%2C574&ssl=1
+[4]: https://docs.mongodb.com/manual/tutorial/getting-started/
+[5]: https://docs.mongodb.com/manual/
+[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/mongodb_org_check_logs.jpg?fit=800%2C467&ssl=1
diff --git a/sources/tech/20190304 What you need to know about Ansible modules.md b/sources/tech/20190304 What you need to know about Ansible modules.md
new file mode 100644
index 0000000000..8330d4bd59
--- /dev/null
+++ b/sources/tech/20190304 What you need to know about Ansible modules.md
@@ -0,0 +1,311 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (What you need to know about Ansible modules)
+[#]: via: (https://opensource.com/article/19/3/developing-ansible-modules)
+[#]: author: (Jairo da Silva Junior https://opensource.com/users/jairojunior)
+
+What you need to know about Ansible modules
+======
+Learn how and when to develop custom modules for Ansible.
+
+
+Ansible works by connecting to nodes and sending small programs called modules to be executed remotely. This makes it a push architecture, where configuration is pushed from Ansible to servers without agents, as opposed to the pull model, common in agent-based configuration management systems, where configuration is pulled.
+
+These modules are mapped to resources and their respective states, which are represented in YAML files. They enable you to manage virtually everything that has an API, CLI, or configuration file you can interact with, including network devices like load balancers, switches, firewalls, container orchestrators, containers themselves, and even virtual machine instances in a hypervisor or in a public (e.g., AWS, GCE, Azure) and/or private (e.g., OpenStack, CloudStack) cloud, as well as storage and security appliances and system configuration.
+
+With Ansible's batteries-included model, hundreds of modules are included and any task in a playbook has a module behind it.
+
+The contract for building modules is simple: JSON in the stdout. The configurations declared in YAML files are delivered over the network via SSH/WinRM—or any other connection plugin—as small scripts to be executed in the target server(s). Modules can be written in any language capable of returning JSON, although most Ansible modules (except for Windows PowerShell) are written in Python using the Ansible API (this eases the development of new modules).
+
+Modules are one way of expanding Ansible capabilities. Other alternatives, like dynamic inventories and plugins, can also increase Ansible's power. It's important to know about them so you know when to use one instead of the other.
+
+Plugins are divided into several categories with distinct goals, like Action, Cache, Callback, Connection, Filters, Lookup, and Vars. The most popular plugins are:
+
+ * **Connection plugins:** These implement a way to communicate with servers in your inventory (e.g., SSH, WinRM, Telnet); in other words, how automation code is transported over the network to be executed.
+ * **Filters plugins:** These allow you to manipulate data inside your playbook. This is a Jinja2 feature that is harnessed by Ansible to solve infrastructure-as-code problems.
+ * **Lookup plugins:** These fetch data from an external source (e.g., env, file, Hiera, database, HashiCorp Vault).
+
+
+
+Ansible's official docs are a good resource on [developing plugins][1].
+
+### When should you develop a module?
+
+Although many modules are delivered with Ansible, there is a chance that your problem is not yet covered or it's something too specific—for example, a solution that might make sense only in your organization. Fortunately, the official docs provide excellent guidelines on [developing modules][2].
+
+**IMPORTANT:** Before you start working on something new, always check for open pull requests, ask developers at #ansible-devel (IRC/Freenode), or search the [development list][3] and/or existing [working groups][4] to see if a module exists or is in development.
+
+Signs that you need a new module instead of using an existing one include:
+
+ * Conventional configuration management methods (e.g., templates, file, get_url, lineinfile) do not solve your problem properly.
+ * You have to use a complex combination of commands, shells, filters, text processing with magic regexes, and API calls using curl to achieve your goals.
+ * Your playbooks are complex, imperative, non-idempotent, and even non-deterministic.
+
+
+
+In the ideal scenario, the tool or service already has an API or CLI for management, and it returns some sort of structured data (JSON, XML, YAML).
+
+### Identifying good and bad playbooks
+
+> "Make love, but don't make a shell script in YAML."
+
+So, what makes a bad playbook?
+
+```
+- name: Read a remote resource
+ command: "curl -v http://xpto/resource/abc"
+ register: resource
+ changed_when: False
+
+ - name: Create a resource in case it does not exist
+ command: "curl -X POST http://xpto/resource/abc -d '{ config:{ client: xyz, url: http://beta, pattern: core.md Dict.md lctt2014.md lctt2016.md lctt2018.md README.md } }'"
+ when: "resource.stdout | 404"
+
+ # Leave it here in case I need to remove it hehehe
+ #- name: Remove resource
+ # command: "curl -X DELETE http://xpto/resource/abc"
+ # when: resource.stdout == 1
+```
+
+Aside from being very fragile—what if the resource state includes a 404 somewhere?—and demanding extra code to be idempotent, this playbook can't update the resource when its state changes.
+
+Playbooks written this way disrespect many infrastructure-as-code principles. They're not readable by human beings, are hard to reuse and parameterize, and don't follow the declarative model encouraged by most configuration management tools. They also fail to be idempotent and to converge to the declared state.
+
+Bad playbooks can jeopardize your automation adoption. Instead of harnessing configuration management tools to increase your speed, they have the same problems as an imperative automation approach based on scripts and command execution. This creates a scenario where you're using Ansible just as a means to deliver your old scripts, copying what you already have into YAML files.
+
+Here's how to rewrite this example to follow infrastructure-as-code principles.
+
+```
+- name: XPTO
+ xpto:
+ name: abc
+ state: present
+ config:
+ client: xyz
+ url: http://beta
+ pattern: "*.*"
+```
+
+The benefits of this approach, based on custom modules, include:
+
+ * It's declarative—resources are properly represented in YAML.
+ * It's idempotent.
+ * It converges from the declared state to the current state.
+ * It's readable by human beings.
+ * It's easily parameterized or reused.
+
+
+
+### Implementing a custom module
+
+Let's use [WildFly][5], an open source Java application server, as an example to introduce a custom module for our not-so-good playbook:
+
+```
+ - name: Read datasource
+ command: "jboss-cli.sh -c '/subsystem=datasources/data-source=DemoDS:read-resource()'"
+ register: datasource
+
+ - name: Create datasource
+ command: "jboss-cli.sh -c '/subsystem=datasources/data-source=DemoDS:add(driver-name=h2, user-name=sa, password=sa, min-pool-size=20, max-pool-size=40, connection-url=.jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE..)'"
+ when: 'datasource.stdout | outcome => failed'
+```
+
+Problems:
+
+ * It's not declarative.
+ * JBoss-CLI returns plaintext in a JSON-like syntax; therefore, this approach is very fragile, since we need a type of parser for this notation. Even a seemingly simple parser can be too complex to treat many [exceptions][6].
+ * JBoss-CLI is just an interface to send requests to the management API (port 9990).
+ * Sending an HTTP request is more efficient than opening a new JBoss-CLI session, connecting, and sending a command.
+ * It does not converge to the desired state; it only creates the resource when it doesn't exist.
+
+
+
+A custom module for this would look like:
+
+```
+- name: Configure datasource
+ jboss_resource:
+ name: "/subsystem=datasources/data-source=DemoDS"
+ state: present
+ attributes:
+ driver-name: h2
+ connection-url: "jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"
+ jndi-name: "java:jboss/datasources/DemoDS"
+ user-name: sa
+ password: sa
+ min-pool-size: 20
+ max-pool-size: 40
+```
+
+This playbook is declarative, idempotent, more readable, and converges to the desired state regardless of the current state.
+
+### Why learn to build custom modules?
+
+Good reasons to learn how to build custom modules include:
+
+ * Improving existing modules
+ * You have bad playbooks and want to improve them, or …
+ * You don't, but want to avoid having bad playbooks.
+ * Knowing how to build a module considerably improves your ability to debug problems in playbooks, thereby increasing your productivity.
+
+
+
+> "…abstractions save us time working, but they don't save us time learning." —Joel Spolsky, [The Law of Leaky Abstractions][7]
+
+#### Custom Ansible modules 101
+
+ * JSON (JavaScript Object Notation) in stdout: that's the contract!
+ * They can be written in any language, but …
+ * Python is usually the best option (or the second best)
+ * Most modules delivered with Ansible ( **lib/ansible/modules** ) are written in Python and should support compatible versions.
+
+
+
+#### The Ansible way
+
+ * First step:
+
+```
+git clone https://github.com/ansible/ansible.git
+```
+
+ * Navigate in **lib/ansible/modules/** and read the existing modules code.
+
+ * Your tools are: Git, Python, virtualenv, pdb (Python debugger)
+
+ * For comprehensive instructions, consult the [official docs][8].
+
+
+
+
+#### An alternative: drop it in the library directory
+
+```
+library/ # if any custom modules, put them here (optional)
+module_utils/ # if any custom module_utils to support modules, put them here (optional)
+filter_plugins/ # if any custom filter plugins, put them here (optional)
+
+site.yml # master playbook
+webservers.yml # playbook for webserver tier
+dbservers.yml # playbook for dbserver tier
+
+roles/
+ common/ # this hierarchy represents a "role"
+ library/ # roles can also include custom modules
+ module_utils/ # roles can also include custom module_utils
+ lookup_plugins/ # or other types of plugins, like lookup in this case
+```
+
+ * It's easier to start.
+ * Doesn't require anything besides Ansible and your favorite IDE/text editor.
+ * This is your best option if it's something that will be used internally.
+
+
+
+**TIP:** You can use this directory layout to overwrite existing modules if, for example, you need to patch a module.
+
+#### First steps
+
+You could do it in your own—including using another language—or you could use the AnsibleModule class, as it is easier to put JSON in the stdout ( **exit_json()** , **fail_json()** ) in the way Ansible expects ( **msg** , **meta** , **has_changed** , **result** ), and it's also easier to process the input ( **params[]** ) and log its execution ( **log()** , **debug()** ).
+
+```
+def main():
+
+ arguments = dict(name=dict(required=True, type='str'),
+ state=dict(choices=['present', 'absent'], default='present'),
+ config=dict(required=False, type='dict'))
+
+ module = AnsibleModule(argument_spec=arguments, supports_check_mode=True)
+ try:
+ if module.check_mode:
+ # Do not do anything, only verifies current state and report it
+ module.exit_json(changed=has_changed, meta=result, msg='Fez alguma coisa ou não...')
+
+ if module.params['state'] == 'present':
+ # Verify the presence of a resource
+ # Desired state `module.params['param_name'] is equal to the current state?
+ module.exit_json(changed=has_changed, meta=result)
+
+ if module.params['state'] == 'absent':
+ # Remove the resource in case it exists
+ module.exit_json(changed=has_changed, meta=result)
+
+ except Error as err:
+ module.fail_json(msg=str(err))
+```
+
+**NOTES:** The **check_mode** ("dry run") allows a playbook to be executed or just verifies if changes are required, but doesn't perform them. **** Also, the **module_utils** directory can be used for shared code among different modules.
+
+For the full Wildfly example, check [this pull request][9].
+
+### Running tests
+
+#### The Ansible way
+
+The Ansible codebase is heavily tested, and every commit triggers a build in its continuous integration (CI) server, [Shippable][10], which includes linting, unit tests, and integration tests.
+
+For integration tests, it uses containers and Ansible itself to perform the setup and verify phase. Here is a test case (written in Ansible) for our custom module's sample code:
+
+```
+- name: Configure datasource
+ jboss_resource:
+ name: "/subsystem=datasources/data-source=DemoDS"
+ state: present
+ attributes:
+ connection-url: "jdbc:h2:mem:demo;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"
+ ...
+ register: result
+
+- name: assert output message that datasource was created
+ assert:
+ that:
+ - "result.changed == true"
+ - "'Added /subsystem=datasources/data-source=DemoDS' in result.msg"
+```
+
+#### An alternative: bundling a module with your role
+
+Here is a [full example][11] inside a simple role:
+
+```
+[*Molecule*]() + [*Vagrant*]() + [*pytest*](): `molecule init` (inside roles/)
+```
+
+It offers greater flexibility to choose:
+
+ * Simplified setup
+ * How to spin up your infrastructure: e.g., Vagrant, Docker, OpenStack, EC2
+ * How to verify your infrastructure tests: Testinfra and Goss
+
+
+
+But your tests would have to be written using pytest with Testinfra or Goss, instead of plain Ansible. If you'd like to learn more about testing Ansible roles, see my article about [using Molecule][12].
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/developing-ansible-modules
+
+作者:[Jairo da Silva Junior][a]
+选题:[lujun9972][b]
+译者:[译者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/jairojunior
+[b]: https://github.com/lujun9972
+[1]: https://docs.ansible.com/ansible/latest/dev_guide/developing_plugins.html#developing-plugins
+[2]: https://docs.ansible.com/ansible/latest/dev_guide/developing_modules.html
+[3]: https://groups.google.com/forum/#!forum/ansible-devel
+[4]: https://github.com/ansible/community/
+[5]: http://www.wildfly.org/
+[6]: https://tools.ietf.org/html/rfc7159
+[7]: https://en.wikipedia.org/wiki/Leaky_abstraction#The_Law_of_Leaky_Abstractions
+[8]: https://docs.ansible.com/ansible/latest/dev_guide/developing_modules_general.html#developing-modules-general
+[9]: https://github.com/ansible/ansible/pull/43682/files
+[10]: https://app.shippable.com/github/ansible/ansible/dashboard
+[11]: https://github.com/jairojunior/ansible-role-jboss/tree/with_modules
+[12]: https://opensource.com/article/18/12/testing-ansible-roles-molecule
diff --git a/sources/tech/20190305 How rootless Buildah works- Building containers in unprivileged environments.md b/sources/tech/20190305 How rootless Buildah works- Building containers in unprivileged environments.md
new file mode 100644
index 0000000000..cf046ec1b3
--- /dev/null
+++ b/sources/tech/20190305 How rootless Buildah works- Building containers in unprivileged environments.md
@@ -0,0 +1,133 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How rootless Buildah works: Building containers in unprivileged environments)
+[#]: via: (https://opensource.com/article/19/3/tips-tricks-rootless-buildah)
+[#]: author: (Daniel J Walsh https://opensource.com/users/rhatdan)
+
+How rootless Buildah works: Building containers in unprivileged environments
+======
+Buildah is a tool and library for building Open Container Initiative (OCI) container images.
+
+
+In previous articles, including [How does rootless Podman work?][1], I talked about [Podman][2], a tool that enables users to manage pods, containers, and container images.
+
+[Buildah][3] is a tool and library for building Open Container Initiative ([OCI][4]) container images that is complementary to Podman. (Both projects are maintained by the [containers][5] organization, of which I'm a member.) In this article, I will talk about rootless Buildah, including the differences between it and Podman.
+
+Our goal with Buildah was to build a low-level tool that could be used either directly or vendored into other tools to build container images.
+
+### Why Buildah?
+
+Here is how I describe a container image: It is basically a rootfs directory that contains the code needed to run your container. This directory is called a rootfs because it usually looks like **/ (root)** on a Linux machine, meaning you are likely to find directories in a rootfs like **/etc** , **/usr** , **/bin** , etc.
+
+The second part of a container image is a JSON file that describes the contents of the rootfs. It contains fields like the command to run the container, the entrypoint, the environment variables required to run the container, the working directory of the container, etc. Basically this JSON file allows the developer of the container image to describe how the container image is expected to be used. The fields in this JSON file have been standardized in the [OCI Image Format specification][6]
+
+The rootfs and the JSON file then get tar'd together to create an image bundle that is stored in a container registry. To create a layered image, you install more software into the rootfs and modify the JSON file. Then you tar up the differences of the new and the old rootfs and store that in another image tarball. The second JSON file refers back to the first JSON file via a checksum.
+
+Many years ago, Docker introduced Dockerfile, a simplified scripting language for building container images. Dockerfile was great and really took off, but it has many shortcomings that users have complained about. For example:
+
+ * Dockerfile encourages the inclusion of tools used to build containers inside the container image. Container images do not need to include yum/dnf/apt, but most contain one of them and all their dependencies.
+
+ * Each line causes a layer to be created. Because of this, secrets can mistakenly get added to container images. If you create a secret in one line of the Dockerfile and delete it in the next, the secret is still in the image.
+
+
+
+
+One of my biggest complaints about the "container revolution" is that six years since it started, the only way to build a container image was still with Dockerfiles. Lots of tools other than **docker build** have appeared besides Buildah, but most still deal only with Dockerfile. So users continue hacking around the problems with Dockerfile.
+
+Note that [umoci][7] is an alternative to **docker build** that allows you to build container images without Dockerfile.
+
+Our goal with Buildah was to build a simple tool that could just create a rootfs directory on disk and allow other tools to populate the directory, then create the JSON file. Finally, Buildah would create the OCI image and push it to a container registry where it could be used by any container engine, like [Docker][8], Podman, [CRI-O][9], or another Buildah.
+
+Buildah also supports Dockerfile, since we know the bulk of people building containers have created Dockerfiles.
+
+### Using Buildah directly
+
+Lots of people use Buildah directly. A cool feature of Buildah is that you can script up the container build directly in Bash.
+
+The example below creates a Bash script called **myapp.sh** , which uses Buildah to pull down the Fedora image, and then uses **dnf** and **make** on a machine to install software into the container image rootfs, **$mnt**. It then adds some fields to the JSON file using **buildah config** and commits the container to a container image **myapp**. Finally, it pushes the container image to a container registry, **quay.io**. (It could push it to any container registry.) Now this OCI image can be used by any container engine or Kubernetes.
+
+```
+cat myapp.sh
+#!/bin/sh
+ctr=$(buildah from fedora)
+mnt=($buildah mount $ctr)
+dnf -y install --installroot $mnt httpd
+make install DESTDIR=$mnt myapp
+rm -rf $mnt/var/cache $mnt/var/log/*
+buildah config --command /usr/bin/myapp -env foo=bar --working-dir=/root $ctr
+buildah commit $ctr myapp
+buildah push myapp http://quay.io/username/myapp
+```
+
+To create really small images, you could replace **fedora** in the script above with **scratch** , and Buildah will build a container image that only has the requirements for the **httpd** package inside the container image. No need for Python or DNF.
+
+### Podman's relationship to Buildah
+
+With Buildah, we have a low-level tool for building container images. Buildah also provides a library for other tools to build container images. Podman was designed to replace the Docker command line interface (CLI). One of the Docker CLI commands is **docker build**. We needed to have **podman build** to support building container images with Dockerfiles. Podman vendored in the Buildah library to allow it to do **podman build**. Any time you do a **podman build** , you are executing Buildah code to build your container images. If you are only going to use Dockerfiles to build container images, we recommend you only use Podman; there's no need for Buildah at all.
+
+### Other tools using the Buildah library
+
+Podman is not the only tool to take advantage of the Buildah library. [OpenShift 4 Source-to-Image][10] (S2I) will also use Buildah to build container images. OpenShift S2I allows developers using OpenShift to use Git commands to modify source code; when they push the changes for their source code to the Git repository, OpenShift kicks off a job to compile the source changes and create a container image. It also uses Buildah under the covers to build this image.
+
+[Ansible-Bender][11] is a new project to build container images via an Ansible playbook. For those familiar with Ansible, Ansible-Bender makes it easy to describe the contents of the container image and then uses Buildah to package up the container image and send it to a container registry.
+
+We would love to see other tools and languages for describing and building a container image and would welcome others use Buildah to do the conversion.
+
+### Problems with rootless
+
+Buildah works fine in rootless mode. It uses user namespace the same way Podman does. If you execute
+
+```
+$ buildah bud --tag myapp -f Dockerfile .
+$ buildah push myapp http://quay.io/username/myapp
+```
+
+in your home directory, everything works great.
+
+However, if you execute the script described above, it will fail!
+
+The problem is that, when running the **buildah mount** command in rootless mode, the **buildah** command must put itself inside the user namespace and create a new mount namespace. Rootless users are not allowed to mount filesystems when not running in a user namespace.
+
+When the Buildah executable exits, the user namespace and mount namespace disappear, so the mount point no longer exists. This means the commands after **buildah mount** that attempt to write to **$mnt** will fail since **$mnt** is no longer mounted.
+
+How can we make the script work in rootless mode?
+
+#### Buildah unshare
+
+Buildah has a special command, **buildah unshare** , that allows you to enter the user namespace. If you execute it with no commands, it will launch a shell in the user namespace, and your shell will seem like it is running as root and all the contents of the home directory will seem like they are owned by root. If you look at the owner or files in **/usr** , it will list them as owned by **nfsnobody** (or nobody). This is because your user ID (UID) is now root inside the user namespace and real root (UID=0) is not mapped into the user namespace. The kernel represents all files owned by UIDs not mapped into the user namespace as the NFSNOBODY user. When you exit the shell, you will exit the user namespace, you will be back to your normal UID, and the home directory will be owned by your UID again.
+
+If you want to execute the **myapp.sh** command defined above, you can execute **buildah unshare myapp.sh** and the script will now run correctly.
+
+#### Conclusion
+
+Building and running containers in unprivileged environments is now possible and quite useable. There is little reason for developers to develop containers as root.
+
+If you want to use a traditional container engine, and use Dockerfile's for builds, then you should probably just use Podman. But if you want to experiment with building container images in new ways without using Dockerfile, then you should really take a look at Buildah.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/tips-tricks-rootless-buildah
+
+作者:[Daniel J Walsh][a]
+选题:[lujun9972][b]
+译者:[译者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/rhatdan
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/article/19/2/how-does-rootless-podman-work
+[2]: https://podman.io/
+[3]: https://github.com/containers/buildah
+[4]: https://www.opencontainers.org/
+[5]: https://github.com/containers
+[6]: https://github.com/opencontainers/image-spec
+[7]: https://github.com/openSUSE/umoci
+[8]: https://github.com/docker
+[9]: https://cri-o.io/
+[10]: https://github.com/openshift/source-to-image
+[11]: https://github.com/TomasTomecek/ansible-bender
diff --git a/sources/tech/20190305 Running the ‘Real Debian- on Raspberry Pi 3- -For DIY Enthusiasts.md b/sources/tech/20190305 Running the ‘Real Debian- on Raspberry Pi 3- -For DIY Enthusiasts.md
new file mode 100644
index 0000000000..785a6eeb5a
--- /dev/null
+++ b/sources/tech/20190305 Running the ‘Real Debian- on Raspberry Pi 3- -For DIY Enthusiasts.md
@@ -0,0 +1,134 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Running the ‘Real Debian’ on Raspberry Pi 3+ [For DIY Enthusiasts])
+[#]: via: (https://itsfoss.com/debian-raspberry-pi)
+[#]: author: (Shirish https://itsfoss.com/author/shirish/)
+
+Running the ‘Real Debian’ on Raspberry Pi 3+ [For DIY Enthusiasts]
+======
+
+If you have ever used a Raspberry Pi device, you probably already know that it recommends a Linux distribution called [Raspbian][1].
+
+Raspbian is a heavily customized form of Debian to run on low-powered ARM processors. It’s not bad. In fact, it’s an excellent OS for Raspberry Pi devices but it’s not the real Debian.
+
+[Debian purists like me][2] would prefer to run the actual Debian over the Raspberry Pi’s customized Debian version. I trust Debian more than any other distribution to provide me a vast amount of properly vetted free software packages. Moreover, a project like this would help other ARM devices as well.
+
+Above all, running the official Debian on Raspberry Pi is sort of challenge and I like such challenges.
+
+![Real Debian on Raspberry Pi][3]
+
+I am not the only one who thinks like this. There are many other Debian users who share the same feeling and this is why there exists an ongoing project to create a [Debian image for Raspberry Pi][4].
+
+About two and a half months back, a Debian Developer (DD) named [Gunnar Wolf][5] took over that unofficial Raspberry Pi image generation project.
+
+I’ll be quickly showing you how can you install this Raspberry Pi Debian Buster preview image on your Raspberry Pi 3 (or higher) devices.
+
+### Getting Debian on Raspberry Pi [For Experts]
+
+```
+Warning
+
+Be aware this Debian image is very raw and unsupported at the moment. Though it’s very new, I believe experienced Raspberry Pi and Debian users should be able to use it.
+```
+
+Now as far as [Debian][6] is concerned, here is the Debian image and instructions that you could use to put the Debian stock image on your Raspberry pi 3 Model B+.
+
+#### Step 1: Download the Debian Raspberry Pi Buster image
+
+You can download the preview images using wget command:
+
+```
+wget https://people.debian.org/~gwolf/raspberrypi3/20190206/20190206-raspberry-pi-3-buster-PREVIEW.img.xz
+```
+
+#### Step 2: Verify checksum (optional)
+
+It’s optional but you should [verify the checksum][7]. You can do that by downloading the SHA256 hashfile and then comparing it with that of the downloaded Raspberry Pi Debian image.
+
+At my end I had moved both the .sha256 file as img.xz to a directory to make it easier to check although it’s not necessary.
+
+```
+wget https://people.debian.org/~gwolf/raspberrypi3/20190206/20190206-raspberry-pi-3-buster-PREVIEW.img.xz.sha256
+
+sha256sum -c 20190206-raspberry-pi-3-buster-PREVIEW.img.xz.sha256
+```
+
+#### Step 3: Write the image to your SD card
+
+Once you have verified the image, take a look at it. It is around 400MB in the compressed xzip format. You can extract it to get an image of around 1.5GB in size.
+
+Insert your SD card. **Before you carry on to the next command please change the sdX to a suitable name that corresponds to your SD card.**
+
+The command basically extracts the img.xz archive to the SD card. The progress switch/flag enables you to see a progress line with a number as to know how much the archive has extracted.
+
+```
+xzcat 20190206-raspberry-pi-3-buster-PREVIEW.img.xz | dd of=/dev/sdX bs=64k oflag=dsync status=progress$ xzcat 20190206-raspberry-pi-3-buster-PREVIEW.img.xz | dd of=/dev/sdX bs=64k oflag=dsync status=progress
+```
+
+Once you have successfully flashed your SD card, you should be able test if the installation went ok by sshing into your Raspberry Pi. The default root password is raspberry.
+
+```
+ssh root@rpi3
+```
+
+If you are curious to know how the Raspberry Pi image was built, you can look at the [build scripts][8].
+
+You can find more info on the project homepage.
+
+[DEBIAN RASPBERRY PI IMAGE][15]
+
+### How to contribute to the Raspberry Pi Buster effort
+
+There is a mailing list called [debian-arm][9] where people could contribute their efforts and ask questions. As you can see in the list, there is already a new firmware which was released [few days back][10] which might make booting directly a reality instead of the workaround shared above.
+
+If you want you could make a new image using the raspi3-image-spec shared above or wait for Gunnar to make a new image which might take time.
+
+Most of the maintainers also hang out at #vmdb2 at #OFTC. You can either use your IRC client or [Riot client][11], register your name at Nickserv and connect with either Gunnar Wolf, Roman Perier or/and Lars Wirzenius, author of [vmdb2][12]. I might do a follow-up on vmdb2 as it’s a nice little tool by itself.
+
+### The Road Ahead
+
+If there are enough interest and contributors, for instance, the lowest-hanging fruit would be to make sure that the ARM64 port [wiki page][13] is as current as possible. The benefits are and can be enormous.
+
+There are a huge number of projects which could benefit from either having a [Pi farm][14] to making your media server or a SiP phone or whatever you want to play/work with.
+
+Another low-hanging fruit might be synchronization between devices, say an ARM cluster sharing reports to either a Debian desktop by way of notification or on mobile or both ways.
+
+While I have shared about Raspberry Pi, there are loads of single-board computers on the market already and lot more coming, both from MIPS as well as OpenRISC-V so there is going to plenty of competition in the days ahead.
+
+Also, OpenRISC-V is and would be open-sourcing lot of its IP so non-free firmware or binary blobs would not be needed. Even MIPS is rumored to be more open which may challenge ARM if MIPS and OpenRISC-V are able to get their logistics and pricing right, but that is a story for another day.
+
+There are many more vendors, I am just sharing the ones whom I am most interested to see what they come up with.
+
+I hope the above sheds some light why it makes sense to have Debian on the Raspberry Pi.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/debian-raspberry-pi
+
+作者:[Shirish][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/shirish/
+[b]: https://github.com/lujun9972
+[1]: https://www.raspberrypi.org/downloads/raspbian/
+[2]: https://itsfoss.com/reasons-why-i-love-debian/
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/debian-raspberry-pi.png?resize=800%2C450&ssl=1
+[4]: https://wiki.debian.org/RaspberryPi3
+[5]: https://gwolf.org/node/4139
+[6]: https://www.debian.org/
+[7]: https://itsfoss.com/checksum-tools-guide-linux/
+[8]: https://github.com/Debian/raspi3-image-spec
+[9]: https://lists.debian.org/debian-arm/2019/02/threads.html
+[10]: https://alioth-lists.debian.net/pipermail/pkg-raspi-maintainers/Week-of-Mon-20190225/000310.html
+[11]: https://itsfoss.com/riot-desktop/
+[12]: https://liw.fi/vmdb2/
+[13]: https://wiki.debian.org/Arm64Port
+[14]: https://raspi.farm/
+[15]: https://wiki.debian.org/RaspberryPi3
diff --git a/sources/tech/20190306 Blockchain 2.0- Revolutionizing The Financial System -Part 2.md b/sources/tech/20190306 Blockchain 2.0- Revolutionizing The Financial System -Part 2.md
new file mode 100644
index 0000000000..5a8b34577a
--- /dev/null
+++ b/sources/tech/20190306 Blockchain 2.0- Revolutionizing The Financial System -Part 2.md
@@ -0,0 +1,52 @@
+[#]: collector: (lujun9972)
+[#]: translator: (sanfusu)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Blockchain 2.0: Revolutionizing The Financial System [Part 2])
+[#]: via: (https://www.ostechnix.com/blockchain-2-0-revolutionizing-the-financial-system/)
+[#]: author: (EDITOR https://www.ostechnix.com/author/editor/)
+
+Blockchain 2.0: Revolutionizing The Financial System [Part 2]
+======
+
+This is the second part of our [**Blockchain 2.0**][1] series. The blockchain can transform how individuals and institutions deal with their finances. This post looks at how the existing monetary system evolved and how new blockchain systems are bringing in change as the next crucial step in the evolution of money.
+
+Two key ideas will lay the foundation for this article. **PayPal** , when it was launched, was revolutionary in terms of its operation. The company would gather, process and confirm massive amounts of consumer data to facilitate online transactions of all kinds, virtually allowing platforms such as eBay to grow into trustful sources for commerce, and laying the benchmark for digital payment systems worldwide. The second, albeit much more important key idea to be highlighted here, is a somewhat existential question. We all use money or rather currency for our day-to-day needs. A ten-dollar bill will get you a cup or two from your favorite coffee shop and get you a head start on your day for instance. We depend on our respective national currencies for virtually everything.
+
+Sure, mankind has come a long way since the **barter system** ruled what you ate for breakfast, but still, what exactly is currency? Who or what gives it it’s a value? And as the popular rumor suggests, does going to a bank and giving them a dollar bill actually get you the true value of whatever that currency “token” stands for?
+
+The answer to most of those questions doesn’t exist. If they do, they’ll to be undependably vague and subjective at best. Back in the day when civilization started off establishing small cities and towns, the local currency deemed legal by the guy who ruled over them, was almost always made of something precious to that community. Indians are thought to have transacted in peppercorns while ancient Greeks and Romans in **salt** [1]. Gradually most of these little prehistoric civilizations adopted precious metals and stones as their tokens to transact. Gold coins, silver heirlooms, and rubies became eponymous with “value”. With the industrial revolution, people started printing these tokens of transaction and we finally seemed to have found our calling in paper currencies. They were dependable and cheap to produce and as long as a nation-state guaranteed its users that the piece of paper, they were holding was just a token for an amount of “value” they had and as long as they were able to show them that this value when demanded could be supported with precious substances such as gold or hard assets, people were happy to use them. However, if you still believe that the currency note you hold in your hand right now has the same guarantee, you’re wrong. We currently live in an age where almost all the major currencies in circulation around the globe are what economists would call a **fiat currency** [2]. Value-less pieces of paper that are only backed by the guarantees of the nation-state you’re residing in. The exact nature of fiat currencies and why they may possibly be a flawed system falls into the domain of economics and we won’t get into that now.
+
+In fact, the only takeaway from all of this history that is relevant to this post is that civilizations started using tokens that hinted or represented value for trading goods and services rather than the non-practical barter system. Tokens. Naturally, this is the crucial concept behind cryptocurrencies as well. They don’t have any inherent value attached to them. Their value is tied to the number of people adopting that particular platform, the trust the adopters have on the system, and of course if released by a supervising entity, the background of the entity itself. The high price and market cap of **Bitcoin (BTC)** isn’t a coincidence, they were among the first in business and had a lot of early adopters. This ultimate truth behind cryptocurrencies is what makes it so important yet so unforgivingly complex to understand. It’s the natural next step in the evolution of “money”. Some understand this and some still like to think of the solid currency concept where “real” money is always backed by something of inherent value.[3] Though there have been countless debates and studies on this dilemma, there is no looking back from a blockchain powered future.
+
+For instance, the country of **Ecuador** made headlines in 2015 for its purported plans to develop and release **its own national cryptocurrency** [4]. Albeit the attempt officially was to aid and support their existing currency system. Since then other countries and their regulatory bodies have or are drafting up papers to control the “epidemic” that is cryptocurrency with some already having published frameworks to the extent of creating a roadmap for blockchain and crypto development. **Germany** is thought to be investing in a long term blockchain project to streamline its taxation and financial systems[5]. Banks in developing countries are joining in on something called a Bank chain, cooperating in creating a **private blockchain** to increase efficiency in and optimize their operations
+
+Now is when we tie both the ends of the stories together, remember the first mention of PayPal before the casual history lesson? Experts have compared Bitcoin’s (BTC) adoption rate with that of PayPal when it was launched. Initial consumer hesitation, where only a few early adopters are ready to jump into using the said product and then all a wider adoption gradually becoming a benchmark for similar platforms. Bitcoin (BTC) is already a benchmark for similar cryptocurrency platforms with major coins such as **Ethereum (ETH)** and **Ripple (XRP)** [6]. Adoption is steadily increasing, legal and regulatory frameworks being made to support it, and active research and development being done on the front as well. And not unlike PayPal, experts believe that cryptocurrencies and platforms utilizing blockchain tech for their digital infrastructure will soon become the standard norm rather than the exception.
+
+Although the rise in cryptocurrency prices in 2018 can be termed as an economic bubble, companies and governments have continued to invest as much or more into the development of their own blockchain platforms and financial tokens. To counteract and prevent such an incident in the future while still looking forward to investing in the area, an alternative to traditional cryptocurrencies called **stablecoins** have made the rounds recently.
+
+Financial behemoth **JP Morgan** came out with their own enterprise ready blockchain solution called **Quorum** handling their stablecoin called **JPM Coin** [7]. Each such JPM coin is tied to 1 USD and their value is guaranteed by the parent organization under supporting legal frameworks, in this case, JP Morgan. Platforms such as this one make it easier for large financial transactions to the tunes of millions or billions of dollars to be transferred instantaneously over the internet without having to rely on conventional banking systems such as SWIFT which involve lengthy procedures and are themselves decades old.
+
+In the same spirit of making the niceties of the blockchain available for everyone, The Ethereum platform allows 3rd parties to utilize their blockchain or derive from it to create and administer their own takes on the triad of the **Blockchain-protocol-token** system thereby leading to wider adoption of the standard with lesser work on its foundations.
+
+The blockchain allows for digital versions of existing financial instruments to be created, recorded, and traded quickly over a network without the need for third-party monitoring. The inherent safety and security features of the system makes the entire process totally safe and immune to fraud and tampering, basically the only reason why third-party monitoring was required in the sector. Another area where governmental and regulatory bodies presided over when it came to financial services and instruments were in regards to transparency and auditing. With blockchain banks and other financial institutes will be able to maintain a fully transparent, layered, almost permanent and tamper-proof record of all their transactions rendering auditing tasks near useless. Much needed developments and changes to the current financial system and services industry can be made possible by exploiting blockchains. The platform being distributed, tamper-proof, near permanent, and quick to execute is highly valuable to bankers and government regulators alike and their investments in this regard seem to be well placed[8].
+
+In the next article of the series, we see how companies are using blockchains to deliver the next generation of financial services. Looking at individual firms creating ripples in the industry, we explore how the future of a blockchain backed economy would look like.
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/blockchain-2-0-revolutionizing-the-financial-system/
+
+作者:[EDITOR][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/editor/
+[b]: https://github.com/lujun9972
+[1]: https://www.ostechnix.com/blockchain-2-0-an-introduction/
diff --git a/sources/tech/20190306 ClusterShell - A Nifty Tool To Run Commands On Cluster Nodes In Parallel.md b/sources/tech/20190306 ClusterShell - A Nifty Tool To Run Commands On Cluster Nodes In Parallel.md
new file mode 100644
index 0000000000..8f69143d36
--- /dev/null
+++ b/sources/tech/20190306 ClusterShell - A Nifty Tool To Run Commands On Cluster Nodes In Parallel.md
@@ -0,0 +1,309 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (ClusterShell – A Nifty Tool To Run Commands On Cluster Nodes In Parallel)
+[#]: via: (https://www.2daygeek.com/clustershell-clush-run-commands-on-cluster-nodes-remote-system-in-parallel-linux/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+ClusterShell – A Nifty Tool To Run Commands On Cluster Nodes In Parallel
+======
+
+We had written two articles in the past to run commands on multiple remote server in parallel.
+
+These are **[Parallel SSH (PSSH)][1]** or **[Distributed Shell (DSH)][2]**.
+
+Today also, we are going to discuss about the same kind of topic but it allows us to perform the same on cluster nodes as well.
+
+You may think, i can write a small shell script to archive this instead of installing these third party packages.
+
+Of course you are right and if you are going to run some commands in 10-15 remote systems then you don’t need to use this.
+
+However, the scripts take some time to complete this task as it’s running in a sequential order.
+
+Think about if you would like to run some commands on 1000+ servers what will be the options?
+
+In this case your script won’t help you. Also, it would take good amount of time to complete a task.
+
+So, to overcome this kind of issue and situation. We need to run the command in parallel on remote machines.
+
+For that, we need use in one of the Parallel applications. I hope this explanation might fulfilled your doubts about parallel utilities.
+
+### What Is ClusterShell?
+
+clush stands for [ClusterShell][3]. ClusterShell is an event-driven open source Python library, designed to run local or distant commands in parallel on server farms or on large Linux clusters.
+
+It will take care of common issues encountered on HPC clusters, such as operating on groups of nodes, running distributed commands using optimized execution algorithms, as well as gathering results and merging identical outputs, or retrieving return codes.
+
+ClusterShell takes advantage of existing remote shell facilities already installed on your systems, like SSH.
+
+ClusterShell’s primary goal is to improve the administration of high- performance clusters by providing a lightweight but scalable Python API for developers. It also provides clush, clubak and cluset/nodeset, convenient command-line tools that allow traditional shell scripts to benefit from some of the library features.
+
+ClusterShell’s written in Python and it requires Python (v2.6+ or v3.4+) to run on your system.
+
+### How To Install ClusterShell On Linux?
+
+ClusterShell package is available in most of the distribution official package manager. So, use the distribution package manager tool to install it.
+
+For **`Fedora`** system, use **[DNF Command][4]** to install clustershell.
+
+```
+$ sudo dnf install clustershell
+```
+
+Python 2 module and tools are installed and if it’s default on your system then run the following command to install Python 3 development on Fedora System.
+
+```
+$ sudo dnf install python3-clustershell
+```
+
+Make sure you should have enabled the **[EPEL repository][5]** on your system before performing clustershell installation.
+
+For **`RHEL/CentOS`** systems, use **[YUM Command][6]** to install clustershell.
+
+```
+$ sudo yum install clustershell
+```
+
+Python 2 module and tools are installed and if it’s default on your system then run the following command to install Python 3 development on CentOS/RHEL System.
+
+```
+$ sudo yum install python34-clustershell
+```
+
+For **`openSUSE Leap`** system, use **[Zypper Command][7]** to install clustershell.
+
+```
+$ sudo zypper install clustershell
+```
+
+Python 2 module and tools are installed and if it’s default on your system then run the following command to install Python 3 development on OpenSUSE System.
+
+```
+$ sudo zypper install python3-clustershell
+```
+
+For **`Debian/Ubuntu`** systems, use **[APT-GET Command][8]** or **[APT Command][9]** to install clustershell.
+
+```
+$ sudo apt install clustershell
+```
+
+### How To Install ClusterShell In Linux Using PIP?
+
+Use PIP to install ClusterShell because it’s written in Python.
+
+Make sure you should have enabled the **[Python][10]** and **[PIP][11]** on your system before performing clustershell installation.
+
+```
+$ sudo pip install ClusterShell
+```
+
+### How To Use ClusterShell On Linux?
+
+It’s straight forward and awesome tool compared with other utilities such as pssh and dsh. It has so many options to perform the remote execution in parallel.
+
+Make sure you should have enabled the **[password less login][12]** on your system before start using clustershell.
+
+The following configuration file defines system-wide default values. You no need to modify anything here.
+
+```
+$ cat /etc/clustershell/clush.conf
+```
+
+If you would like to create a servers group. Here you can go. By default some examples were available so, do the same for your requirements.
+
+```
+$ cat /etc/clustershell/groups.d/local.cfg
+```
+
+Just run the clustershell command in the following format to get the information from the given nodes.
+
+```
+$ clush -w 192.168.1.4,192.168.1.9 cat /proc/version
+192.168.1.9: Linux version 4.15.0-45-generic ([email protected]) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #48-Ubuntu SMP Tue Jan 29 16:28:13 UTC 2019
+192.168.1.4: Linux version 3.10.0-957.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Nov 8 23:39:32 UTC 2018
+```
+
+**Option:**
+
+ * **`-w:`** nodes where to run the command.
+
+
+
+You can use the regular expressions instead of using full hostname and IPs.
+
+```
+$ clush -w 192.168.1.[4,9] uname -r
+192.168.1.9: 4.15.0-45-generic
+192.168.1.4: 3.10.0-957.el7.x86_64
+```
+
+Alternatively you can use the following format if you have the servers in the same IP series.
+
+```
+$ clush -w 192.168.1.[4-9] date
+192.168.1.6: Mon Mar 4 21:08:29 IST 2019
+192.168.1.7: Mon Mar 4 21:08:29 IST 2019
+192.168.1.8: Mon Mar 4 21:08:29 IST 2019
+192.168.1.5: Mon Mar 4 09:16:30 CST 2019
+192.168.1.9: Mon Mar 4 21:08:29 IST 2019
+192.168.1.4: Mon Mar 4 09:16:30 CST 2019
+```
+
+clustershell allow us to run the command in batch mode. Use the following format to achieve this.
+
+```
+$ clush -w 192.168.1.4,192.168.1.9 -b
+Enter 'quit' to leave this interactive mode
+Working with nodes: 192.168.1.[4,9]
+clush> hostnamectl
+---------------
+192.168.1.4
+---------------
+ Static hostname: CentOS7.2daygeek.com
+ Icon name: computer-vm
+ Chassis: vm
+ Machine ID: 002f47b82af248f5be1d67b67e03514c
+ Boot ID: f9b37a073c534dec8b236885e754cb56
+ Virtualization: kvm
+ Operating System: CentOS Linux 7 (Core)
+ CPE OS Name: cpe:/o:centos:centos:7
+ Kernel: Linux 3.10.0-957.el7.x86_64
+ Architecture: x86-64
+---------------
+192.168.1.9
+---------------
+ Static hostname: Ubuntu18
+ Icon name: computer-vm
+ Chassis: vm
+ Machine ID: 27f6c2febda84dc881f28fd145077187
+ Boot ID: f176f2eb45524d4f906d12e2b5716649
+ Virtualization: oracle
+ Operating System: Ubuntu 18.04.2 LTS
+ Kernel: Linux 4.15.0-45-generic
+ Architecture: x86-64
+clush> free -m
+---------------
+192.168.1.4
+---------------
+ total used free shared buff/cache available
+Mem: 1838 641 217 19 978 969
+Swap: 2047 0 2047
+---------------
+192.168.1.9
+---------------
+ total used free shared buff/cache available
+Mem: 1993 352 1067 1 573 1473
+Swap: 1425 0 1425
+clush> w
+---------------
+192.168.1.4
+---------------
+ 09:21:14 up 3:21, 3 users, load average: 0.00, 0.01, 0.05
+USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
+daygeek :0 :0 06:02 ?xdm? 1:28 0.30s /usr/libexec/gnome-session-binary --session gnome-classic
+daygeek pts/0 :0 06:03 3:17m 0.06s 0.06s bash
+daygeek pts/1 192.168.1.6 06:03 52:26 0.10s 0.10s -bash
+---------------
+192.168.1.9
+---------------
+ 21:13:12 up 3:12, 1 user, load average: 0.08, 0.03, 0.00
+USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
+daygeek pts/0 192.168.1.6 20:42 29:41 0.05s 0.05s -bash
+clush> quit
+```
+
+If you would like to run the command on a group of nodes then use the following format.
+
+```
+$ clush -w @dev uptime
+or
+$ clush -g dev uptime
+or
+$ clush --group=dev uptime
+
+192.168.1.9: 21:10:10 up 3:09, 1 user, load average: 0.09, 0.03, 0.01
+192.168.1.4: 09:18:12 up 3:18, 3 users, load average: 0.01, 0.02, 0.05
+```
+
+If you would like to run the command on more than one group of nodes then use the following format.
+
+```
+$ clush -w @dev,@uat uptime
+or
+$ clush -g dev,uat uptime
+or
+$ clush --group=dev,uat uptime
+
+192.168.1.7: 07:57:19 up 59 min, 1 user, load average: 0.08, 0.03, 0.00
+192.168.1.9: 20:27:20 up 1:00, 1 user, load average: 0.00, 0.00, 0.00
+192.168.1.5: 08:57:21 up 59 min, 1 user, load average: 0.00, 0.01, 0.05
+```
+
+clustershell allow us to copy a file to remote machines. To copy local file or directory to the remote nodes in the same location.
+
+```
+$ clush -w 192.168.1.[4,9] --copy /home/daygeek/passwd-up.sh
+```
+
+We can verify the same by running the following command.
+
+```
+$ clush -w 192.168.1.[4,9] ls -lh /home/daygeek/passwd-up.sh
+192.168.1.4: -rwxr-xr-x. 1 daygeek daygeek 159 Mar 4 09:00 /home/daygeek/passwd-up.sh
+192.168.1.9: -rwxr-xr-x 1 daygeek daygeek 159 Mar 4 20:52 /home/daygeek/passwd-up.sh
+```
+
+To copy local file or directory to the remote nodes in the different location.
+
+```
+$ clush -g uat --copy /home/daygeek/passwd-up.sh --dest /tmp
+```
+
+We can verify the same by running the following command.
+
+```
+$ clush --group=uat ls -lh /tmp/passwd-up.sh
+192.168.1.7: -rwxr-xr-x. 1 daygeek daygeek 159 Mar 6 07:44 /tmp/passwd-up.sh
+```
+
+To copy file or directory from remote nodes to local system.
+
+```
+$ clush -w 192.168.1.7 --rcopy /home/daygeek/Documents/magi.txt --dest /tmp
+```
+
+We can verify the same by running the following command.
+
+```
+$ ls -lh /tmp/magi.txt.192.168.1.7
+-rw-r--r-- 1 daygeek daygeek 35 Mar 6 20:24 /tmp/magi.txt.192.168.1.7
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/clustershell-clush-run-commands-on-cluster-nodes-remote-system-in-parallel-linux/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/pssh-parallel-ssh-run-execute-commands-on-multiple-linux-servers/
+[2]: https://www.2daygeek.com/dsh-run-execute-shell-commands-on-multiple-linux-servers-at-once/
+[3]: https://cea-hpc.github.io/clustershell/
+[4]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
+[5]: https://www.2daygeek.com/install-enable-epel-repository-on-rhel-centos-scientific-linux-oracle-linux/
+[6]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
+[7]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
+[8]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
+[9]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
+[10]: https://www.2daygeek.com/3-methods-to-install-latest-python3-package-on-centos-6-system/
+[11]: https://www.2daygeek.com/install-pip-manage-python-packages-linux/
+[12]: https://www.2daygeek.com/linux-passwordless-ssh-login-using-ssh-keygen/
diff --git a/sources/tech/20190306 Get cooking with GNOME Recipes on Fedora.md b/sources/tech/20190306 Get cooking with GNOME Recipes on Fedora.md
new file mode 100644
index 0000000000..a45c3b04fd
--- /dev/null
+++ b/sources/tech/20190306 Get cooking with GNOME Recipes on Fedora.md
@@ -0,0 +1,64 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Get cooking with GNOME Recipes on Fedora)
+[#]: via: (https://fedoramagazine.org/get-cooking-with-gnome-recipes-on-fedora/)
+[#]: author: (Ryan Lerch https://fedoramagazine.org/introducing-flatpak/)
+
+Get cooking with GNOME Recipes on Fedora
+======
+
+
+Do you love to cook? Looking for a better way to manage your recipes using Fedora? GNOME Recipes is an awesome application available to install in Fedora to store and organize your recipe collection.
+
+![][1]
+
+GNOME Recipes is an recipe management tool from the GNOME project. It has the visual style of a modern GNOME style application, and feels similar to GNOME Software, but for food.
+
+### Installing GNOME Recipes
+
+Recipes is available to install from the 3rd party Flathub repositories. If you have never installed an application from Flathub before, set it up using the following guide:
+
+[Install Flathub apps on Fedora](https://fedoramagazine.org/install-flathub-apps-fedora/)
+
+After correctly setting up Flathub as a software source, you will be able to search for and install Recipes via GNOME Software.
+
+### Recipe management
+
+Recipes allows you to manually add your own collection of recipes, including photos, ingredients, directions, as well as extra metadata like preparation time, cuisine style, and spiciness.
+
+![][2]
+
+When entering in a new item, GNOME Recipes there are a range of different measurement units to choose from, as well as special tags for items like temperature, allowing you to easily switch units.
+
+### Community recipes
+
+In addition to manually entering in your favourite dishes for your own use, it also allows you to find, use, and contribute recipes to the community. Additionally, you can mark your favourites, and search the collection by the myriad of metadata available for each recipe.
+
+![][3]
+
+### Step by step guidance
+
+One of the awesome little features in GNOME Recipes is the step by step fullscreen mode. When you are ready to cook, simply activate this mode, move you laptop to the kitchen, and you will have a full screen display of the current step in the cooking method. Futhermore, you can set up the recipes to have timers displayed on this mode when something is in the oven.
+
+![][4]
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/get-cooking-with-gnome-recipes-on-fedora/
+
+作者:[Ryan Lerch][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/introducing-flatpak/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-06-19-45-06-1024x727.png
+[2]: https://fedoramagazine.org/wp-content/uploads/2019/03/gnome-recipes1-1024x727.png
+[3]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-06-20-08-45-1024x725.png
+[4]: https://fedoramagazine.org/wp-content/uploads/2019/03/Screenshot-from-2019-03-06-20-39-44-1024x640.png
diff --git a/sources/tech/20190306 Getting started with the Geany text editor.md b/sources/tech/20190306 Getting started with the Geany text editor.md
new file mode 100644
index 0000000000..7da5f95686
--- /dev/null
+++ b/sources/tech/20190306 Getting started with the Geany text editor.md
@@ -0,0 +1,141 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Getting started with the Geany text editor)
+[#]: via: (https://opensource.com/article/19/3/getting-started-geany-text-editor)
+[#]: author: (James Mawson https://opensource.com/users/dxmjames)
+
+Getting started with the Geany text editor
+======
+Geany is a light and swift text editor with IDE features.
+
+
+
+I have to admit, it took me a rather embarrassingly long time to really get into Linux as a daily driver. One thing I recall from these years in the wilderness was how strange it was to watch open source types get so worked up about text editors.
+
+It wasn't just that opinions differed. Disagreements were intense. And you'd see them again and again.
+
+I mean, I suppose it makes some sense. Doing dev or admin work means you're spending a lot of time with a text editor. And when it gets in the way or won't do quite what you want? In that exact moment, that's the most frustrating thing in the world.
+
+And I know what it means to really hate a text editor. I learned this many years ago in the computer labs at university trying to figure out Emacs. I was quite shocked that a piece of software could have so many sadomasochistic overtones. People were doing that to each other deliberately!
+
+So perhaps it's a rite of passage that now I have one I very much like. It's called [Geany][1], it's on GPL, and it's [in the repositories][2] of most popular distributions.
+
+Here's why it works for me.
+
+### I'm into simplicity
+
+The main thing I want from a text editor is just to edit text. I don't think there should be any kind of learning curve in the way. I should be able to open it and use it.
+
+For that reason, I've generally used whatever is included with an operating system. On Windows 10, I used Notepad far longer than I should have. When I finally replaced it, it was with Notepad++. In the Linux terminal, I like Nano.
+
+I was perfectly aware I was missing out on a lot of useful functionality. But it was never enough of a pain point to make a change. And it's not that I've never tried anything more elaborate. I did some of my first real programming on Visual Basic and Borland Delphi.
+
+These development environments gave you a graphical interface to design your windows visually, various windows where you could configure properties and settings, a text interface to write your functions, and various odds and ends for debugging. This was a great way to build desktop applications, so long as you used it the way it was intended.
+
+But if you wanted to do something the authors didn't anticipate, all these extra moving parts suddenly got in the way. As software became more and more about the web and the internet, this situation started happening all the time.
+
+In the past, I used HTML editing suites like Macromedia Dreamweaver (as it was back then) and FirstPage for static websites. Again, I found the features could get in the way as much as they helped. These applications had their own ideas about how to organize your project, and if you had a different view, it was an awful bother.
+
+More recently, after a long break from programming, I started learning the people's language: [Python][3]. I bought a book of introductory tutorials, which said to install [IDLE][4], so I did. I think I got about five minutes into it before ditching it to run the interpreter from the command line. It had way too many moving parts to deal with. Especially for HelloWorld.py.
+
+But I always went back to Notepad++ and Nano whenever I could get away with it.
+
+So what changed? Well, a few months ago I [ditched Windows 10][5] completely (hooray!). Sticking with what I knew, I used Nano as my main text editor for a few weeks.
+
+I learned that Nano is great when you're already on the command line and you need to launch a Navy SEAL mission. You know what I mean. A lightning-fast raid. Get in, complete the objective, and get out.
+
+It's less ideal for long campaigns—or even moderately short ones. Even just adding a new page to a static website turns out to involve many repetitive keystrokes. As much as anything else, I really missed being able to navigate and select text with the mouse.
+
+### Introducing Geany
+
+The Geany project began in 2005 and is still actively developed.
+
+It has minimal dependencies: just the [GTK Toolkit][6] and the libraries that GTK depends on. If you have any kind of desktop environment installed, you almost certainly have GTK on your machine.
+
+I'm using it on Xfce, but thanks to these minimal dependencies, Geany is portable across desktop environments.
+
+Geany is fast and light. Installing Geany from the package manager took mere moments, and it uses only 3.1MB of space on my machine.
+
+So far, I've used it for HTML, CSS, and Python and to edit configuration files. It also recognizes C, Java, JavaScript, Perl, and [more][7].
+
+### No-compromise simplicity
+
+Geany has a lot of great features that make life easier. Just listing them would miss the best bit, which is this: Geany makes sense right out of the box. As soon as it's installed, you can start editing files straightaway, and it just works.
+
+For all the IDE functionality, none of it gets in the way. The default settings are set intelligently, and the menus are laid out nicely enough that it's no hassle to change them.
+
+It doesn't try to organize your project for you, and it doesn't have strong opinions about how you should do anything.
+
+### Handles whitespace beautifully
+
+By default, every time you press Enter, Geany preserves the indentation on the new line. In addition to saving a few tedious keystrokes, it avoids the inconsistent use of tabs and spaces, which can sometimes sneak in when your mind's elsewhere and make your code hard to follow for anyone with a different text editor.
+
+But what if you're editing a file that's already suffered this treatment? For example, I needed to edit an HTML file that was indented with a mix of tabs and spaces, making it a nightmare to figure out how the tags were nested.
+
+With Geany, it took just seconds to hunt through the menus to change the tab length from four spaces to eight. Even better was the option to convert those tabs to spaces. Problem solved!
+
+### Clever shortcuts and automation
+
+How often do you write the correct code on the wrong line? I do it all the time.
+
+Geany makes it easy to move lines of code up and down using Alt+PgUp and Alt+PgDn. This is a little nicer than just a regular cut and paste—instead of needing four or five key presses, you only need one.
+
+When coding HTML, Geany automatically closes tags for you. As well as saving time, this avoids a lot of annoying bugs. When you forget to close a tag, you can spend ages scouring the document looking for something far more complex.
+
+It gets even better in Python, where indentation is crucial. Whenever you end a line with a colon, Geany automatically indents it for you.
+
+One nice little side effect is that when you forget to include the colon—something I do with embarrassing regularity—you realize it immediately when you don't get the automatic indentation you expected.
+
+The default indentation is a single tab, while I prefer two spaces. Because Geany's menus are very well laid out, it took me only a few seconds to figure out how to change it.
+
+You, of course, get syntax highlighting too. In addition, it tracks your [variable scope][8] and offers useful autocompletion.
+
+### Large plugin library
+
+Geany has a [big library of plugins][9], but so far I haven't needed to try any. Even so, I still feel like I benefit from them. How? Well, it means that my editor isn't crammed with functionality I don't use.
+
+I reckon this attitude of adding extra functionality into a big library of plugins is a great ethos—no matter your specific needs, you get to have all the stuff you want and none of what you don't.
+
+### Remote file editing
+
+One thing that's really nice about terminal text editors is that it's no problem to use them in a remote shell.
+
+Geany handles this beautifully, as well. You can open remote files anywhere you have SSH access as easily as you can open files on your own machine.
+
+One frustration I had at first was I only seemed to be able to authenticate with a username and password, which was annoying, because certificates are so much nicer. It turned out that this was just me being a noob by keeping certificates in my home directory rather than in ~/.ssh.
+
+When editing Python scripts remotely, autocompletion doesn't work when you use packages installed on the server and not on your local machine. This isn't really that big a deal for me, but it's there.
+
+### In summary
+
+Text editors are such a personal preference that the right one will be different for different people.
+
+Geany is excellent if you already know what you want to write and want to just get on with it while enjoying plenty of useful shortcuts to speed up the menial parts.
+
+Geany is a great way to have your cake and eat it too.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/getting-started-geany-text-editor
+
+作者:[James Mawson][a]
+选题:[lujun9972][b]
+译者:[译者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/dxmjames
+[b]: https://github.com/lujun9972
+[1]: https://www.geany.org/
+[2]: https://www.geany.org/Download/ThirdPartyPackages
+[3]: https://opensource.com/resources/python
+[4]: https://en.wikipedia.org/wiki/IDLE
+[5]: https://blog.dxmtechsupport.com.au/linux-on-the-desktop-are-we-nearly-there-yet/
+[6]: https://www.gtk.org/
+[7]: https://www.geany.org/Main/AllFiletypes
+[8]: https://cscircles.cemc.uwaterloo.ca/11b-how-functions-work/
+[9]: https://plugins.geany.org/
diff --git a/sources/tech/20190307 How to Restart a Network in Ubuntu -Beginner-s Tip.md b/sources/tech/20190307 How to Restart a Network in Ubuntu -Beginner-s Tip.md
new file mode 100644
index 0000000000..44d5531d83
--- /dev/null
+++ b/sources/tech/20190307 How to Restart a Network in Ubuntu -Beginner-s Tip.md
@@ -0,0 +1,208 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to Restart a Network in Ubuntu [Beginner’s Tip])
+[#]: via: (https://itsfoss.com/restart-network-ubuntu)
+[#]: author: (Sergiu https://itsfoss.com/author/sergiu/)
+
+How to Restart a Network in Ubuntu [Beginner’s Tip]
+======
+
+You’re [using an Ubuntu-based system and you just can’t seem to connect to your network][1]? You’d be surprised how many problems can a simple restart fix.
+
+In this article, I’ll go over multiple ways you can restart network in Ubuntu and other Linux distributions, so you can use whatever suits your needs. The methods are basically divided into two parts:
+
+![Ubuntu Restart Network][2]
+
+### Restart network in Ubuntu using command line
+
+If you are using Ubuntu server edition, you are already in the terminal. If you are using the desktop edition, you can access the terminal using Ctrl+Alt+T [keyboard shortcut in Ubuntu][3].
+
+Now you have several commands at your disposal to restart network in Ubuntu. Some (or perhaps most) commands mentioned here should be applicable for restarting network in Debian and other Linux distributions as well.
+
+#### 1\. network manager service
+
+This is the easiest way to restart your network using the command line. It’s equivalent to the graphical way of doing it (restarts the Network-Manager service).
+
+```
+sudo service network-manager restart
+```
+
+The network icon should disappear for a moment and then reappear.
+
+#### 2\. systemd
+
+The **service** command is just a wrapper for this method (and also for init.d scripts and Upstart commands). The **systemctl** command is much more versatile than **service**. This is what I usually prefer.
+
+```
+sudo systemctl restart NetworkManager.service
+```
+
+The network icon (again) should disappear for a moment. To check out other **systemctl** options, you can refer to its man page.
+
+#### 3\. nmcli
+
+This is yet another tool for handling networks on a Linux machine. It is a pretty powerful tool that I find very practical. Many sysadmins prefer it since it is easy to use.
+
+There are two steps to this method: turning the network off, and then turning it back on.
+
+```
+sudo nmcli networking off
+```
+
+The network will shut down and the icon will disappear. To turn it back on:
+
+```
+sudo nmcli networking on
+```
+
+You can check out the man page of nmcli for more options.
+
+#### 4\. ifup & ifdown
+
+This commands handle a network interface directly, changing it’s state to one in which it either can or can not transmit and receive data. It’s one of the [must know networking commands in Linux][4].
+
+To shut down all network interfaces, use ifdown and then use ifup to turn all network interfaces back on.
+
+A good practice would be to combine both of these commands:
+
+```
+sudo ifdown -a && sudo ifup -a
+```
+
+**Note:** This method will not make the network icon in your systray disappear, and yet you won’t be able to have a connection of any sort.
+
+**Bonus tool: nmtui (click to expand)**
+
+This is another method often used by system administrators. It is a text menu for managing networks right in your terminal.
+
+```
+nmtui
+```
+
+This should open up the following menu:
+
+![nmtui Menu][5]
+
+**Note** that in **nmtui** , you can select another option by using the **up** and **down arrow keys**.
+
+Select **Activate a connection** :
+
+![nmtui Menu Select "Activate a connection"][6]
+
+Press **Enter**. This should now open the **connections** menu.
+
+![nmtui Connections Menu][7]
+
+Here, go ahead and select the network with a **star (*)** next to it. In my case, it’s MGEO72.
+
+![Select your connection in the nmtui connections menu.][8]
+
+Press **Enter**. This should **deactivate** your connection.
+
+![nmtui Connections Menu with no active connection][9]
+
+Select the connection you want to activate:
+
+![Select the connection you want in the nmtui connections menu.][10]
+
+Press **Enter**. This should reactivate the selected connection.
+
+![nmtui Connections Menu][11]
+
+Press **Tab** twice to select **Back** :
+
+![Select "Back" in the nmtui connections menu.][12]
+
+Press **Enter**. This should bring you back to the **nmtui** main menu.
+
+![nmtui Main Menu][13]
+
+Select **Quit** :
+
+![nmtui Quit Main Menu][14]
+
+This should exit the application and bring you back to your terminal.
+
+That’s it! You have successfully restarted your network
+
+### Restart network in Ubuntu graphically
+
+This is, of course, the easiest way of restarting the network for Ubuntu desktop users. If this one doesn’t work, you can of course check the command line options mentioned in the previous section.
+
+NM-applet is the system tray applet indicator for [NetworkManager][15]. That’s what we’re going to use to restart our network.
+
+First of all, check out your top panel. You should find a network icon in your system tray (in my case, it is a Wi-Fi icon, since that’s what I use).
+
+Go ahead and click on that icon (or the sound or battery icon). This will open up the menu. Select “Turn Off” here.
+
+![Restart network in Ubuntu][16]Turn off your network
+
+The network icon should now disappear from the top panel. This means the network has been successfully turned off.
+
+Click again on your systray to reopen the menu. Select “Turn On”.
+
+![Restarting network in Ubuntu][17]Turn the network back on
+
+Congratulations! You have now restarted your network.
+
+#### Bonus Tip: Refresh available network list
+
+Suppose you are connected to a network already but you want to connect to another network. How do you refresh the WiFi to see what other networks are available? Let me show you that.
+
+Ubuntu doesn’t have a ‘refresh wifi networks’ option directly. It’s sort of hidden.
+
+You’ll have to open the setting menu again and this time, click on “Select Network”.
+
+![Refresh wifi network list in Ubuntu][18]Select Network to change your WiFi connection
+
+Now, you won’t see the list of available wireless networks immediately. When you open the networks list, it takes around 5 seconds to refresh and show up other available wireless networks.
+
+![Select another wifi network in Ubuntu][19]Wait for around 5- seconds to see other available networks
+
+And here, you can select the network of your choice and click connect. That’s it.
+
+**Wrapping Up**
+
+Restarting your network or connection is something that every Linux user has to go through at some point in their experience.
+
+We hope that we helped you with plenty of methods for handling such issues!
+
+What do you use to restart/handle your network? Is there something we missed? Leave us a comment below.
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/restart-network-ubuntu
+
+作者:[Sergiu][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/sergiu/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/fix-no-wireless-network-ubuntu/
+[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/ubuntu-restart-network.png?resize=800%2C450&ssl=1
+[3]: https://itsfoss.com/ubuntu-shortcuts/
+[4]: https://itsfoss.com/basic-linux-networking-commands/
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nmtui_menu.png?fit=800%2C602&ssl=1
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/nmtui_menu_select_option.png?fit=800%2C579&ssl=1
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nmui_connection_menu_on.png?fit=800%2C585&ssl=1
+[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nmui_select_connection_on.png?fit=800%2C576&ssl=1
+[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nmui_connection_menu_off.png?fit=800%2C572&ssl=1
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/nmui_select_connection_off.png?fit=800%2C566&ssl=1
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nmui_connection_menu_on-1.png?fit=800%2C585&ssl=1
+[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nmui_connection_menu_back.png?fit=800%2C585&ssl=1
+[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nmtui_menu_select_option-1.png?fit=800%2C579&ssl=1
+[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/nmui_menu_quit.png?fit=800%2C580&ssl=1
+[15]: https://wiki.gnome.org/Projects/NetworkManager
+[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/restart-network-ubuntu-1.jpg?resize=800%2C400&ssl=1
+[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/restart-network-ubuntu-2.jpg?resize=800%2C400&ssl=1
+[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/select-wifi-network-ubuntu.jpg?resize=800%2C400&ssl=1
+[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/select-wifi-network-ubuntu-1.jpg?resize=800%2C400&ssl=1
+[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/ubuntu-restart-network.png?fit=800%2C450&ssl=1
diff --git a/sources/tech/20190308 Virtual filesystems in Linux- Why we need them and how they work.md b/sources/tech/20190308 Virtual filesystems in Linux- Why we need them and how they work.md
new file mode 100644
index 0000000000..1114863bf7
--- /dev/null
+++ b/sources/tech/20190308 Virtual filesystems in Linux- Why we need them and how they work.md
@@ -0,0 +1,196 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Virtual filesystems in Linux: Why we need them and how they work)
+[#]: via: (https://opensource.com/article/19/3/virtual-filesystems-linux)
+[#]: author: (Alison Chariken )
+
+Virtual filesystems in Linux: Why we need them and how they work
+======
+Virtual filesystems are the magic abstraction that makes the "everything is a file" philosophy of Linux possible.
+
+
+What is a filesystem? According to early Linux contributor and author [Robert Love][1], "A filesystem is a hierarchical storage of data adhering to a specific structure." However, this description applies equally well to VFAT (Virtual File Allocation Table), Git, and [Cassandra][2] (a [NoSQL database][3]). So what distinguishes a filesystem?
+
+### Filesystem basics
+
+The Linux kernel requires that for an entity to be a filesystem, it must also implement the **open()** , **read()** , and **write()** methods on persistent objects that have names associated with them. From the point of view of [object-oriented programming][4], the kernel treats the generic filesystem as an abstract interface, and these big-three functions are "virtual," with no default definition. Accordingly, the kernel's default filesystem implementation is called a virtual filesystem (VFS).
+
+
+![][5]
+If we can open(), read(), and write(), it is a file as this console session shows.
+
+VFS underlies the famous observation that in Unix-like systems "everything is a file." Consider how weird it is that the tiny demo above featuring the character device /dev/console actually works. The image shows an interactive Bash session on a virtual teletype (tty). Sending a string into the virtual console device makes it appear on the virtual screen. VFS has other, even odder properties. For example, it's [possible to seek in them][6].
+
+The familiar filesystems like ext4, NFS, and /proc all provide definitions of the big-three functions in a C-language data structure called [file_operations][7] . In addition, particular filesystems extend and override the VFS functions in the familiar object-oriented way. As Robert Love points out, the abstraction of VFS enables Linux users to blithely copy files to and from foreign operating systems or abstract entities like pipes without worrying about their internal data format. On behalf of userspace, via a system call, a process can copy from a file into the kernel's data structures with the read() method of one filesystem, then use the write() method of another kind of filesystem to output the data.
+
+The function definitions that belong to the VFS base type itself are found in the [fs/*.c files][8] in kernel source, while the subdirectories of fs/ contain the specific filesystems. The kernel also contains filesystem-like entities such as cgroups, /dev, and tmpfs, which are needed early in the boot process and are therefore defined in the kernel's init/ subdirectory. Note that cgroups, /dev, and tmpfs do not call the file_operations big-three functions, but directly read from and write to memory instead.
+
+The diagram below roughly illustrates how userspace accesses various types of filesystems commonly mounted on Linux systems. Not shown are constructs like pipes, dmesg, and POSIX clocks that also implement struct file_operations and whose accesses therefore pass through the VFS layer.
+
+![How userspace accesses various types of filesystems][9]
+VFS are a "shim layer" between system calls and implementors of specific file_operations like ext4 and procfs. The file_operations functions can then communicate either with device-specific drivers or with memory accessors. tmpfs, devtmpfs and cgroups don't make use of file_operations but access memory directly.
+
+VFS's existence promotes code reuse, as the basic methods associated with filesystems need not be re-implemented by every filesystem type. Code reuse is a widely accepted software engineering best practice! Alas, if the reused code [introduces serious bugs][10], then all the implementations that inherit the common methods suffer from them.
+
+### /tmp: A simple tip
+
+An easy way to find out what VFSes are present on a system is to type **mount | grep -v sd | grep -v :/** , which will list all mounted filesystems that are not resident on a disk and not NFS on most computers. One of the listed VFS mounts will assuredly be /tmp, right?
+
+![Man with shocked expression][11]
+Everyone knows that keeping /tmp on a physical storage device is crazy! credit:
+
+Why is keeping /tmp on storage inadvisable? Because the files in /tmp are temporary(!), and storage devices are slower than memory, where tmpfs are created. Further, physical devices are more subject to wear from frequent writing than memory is. Last, files in /tmp may contain sensitive information, so having them disappear at every reboot is a feature.
+
+Unfortunately, installation scripts for some Linux distros still create /tmp on a storage device by default. Do not despair should this be the case with your system. Follow simple instructions on the always excellent [Arch Wiki][12] to fix the problem, keeping in mind that memory allocated to tmpfs is not available for other purposes. In other words, a system with a gigantic tmpfs with large files in it can run out of memory and crash. Another tip: when editing the /etc/fstab file, be sure to end it with a newline, as your system will not boot otherwise. (Guess how I know.)
+
+### /proc and /sys
+
+Besides /tmp, the VFSes with which most Linux users are most familiar are /proc and /sys. (/dev relies on shared memory and has no file_operations). Why two flavors? Let's have a look in more detail.
+
+The procfs offers a snapshot into the instantaneous state of the kernel and the processes that it controls for userspace. In /proc, the kernel publishes information about the facilities it provides, like interrupts, virtual memory, and the scheduler. In addition, /proc/sys is where the settings that are configurable via the [sysctl command][13] are accessible to userspace. Status and statistics on individual processes are reported in /proc/ directories.
+
+![Console][14]
+/proc/meminfo is an empty file that nonetheless contains valuable information.
+
+The behavior of /proc files illustrates how unlike on-disk filesystems VFS can be. On the one hand, /proc/meminfo contains the information presented by the command **free**. On the other hand, it's also empty! How can this be? The situation is reminiscent of a famous article written by Cornell University physicist N. David Mermin in 1985 called "[Is the moon there when nobody looks?][15] Reality and the quantum theory." The truth is that the kernel gathers statistics about memory when a process requests them from /proc, and there actually is nothing in the files in /proc when no one is looking. As [Mermin said][16], "It is a fundamental quantum doctrine that a measurement does not, in general, reveal a preexisting value of the measured property." (The answer to the question about the moon is left as an exercise.)
+
+![Full moon][17]
+The files in /proc are empty when no process accesses them. ([Source][18])
+
+The apparent emptiness of procfs makes sense, as the information available there is dynamic. The situation with sysfs is different. Let's compare how many files of at least one byte in size there are in /proc versus /sys.
+
+
+
+Procfs has precisely one, namely the exported kernel configuration, which is an exception since it needs to be generated only once per boot. On the other hand, /sys has lots of larger files, most of which comprise one page of memory. Typically, sysfs files contain exactly one number or string, in contrast to the tables of information produced by reading files like /proc/meminfo.
+
+The purpose of sysfs is to expose the readable and writable properties of what the kernel calls "kobjects" to userspace. The only purpose of kobjects is reference-counting: when the last reference to a kobject is deleted, the system will reclaim the resources associated with it. Yet, /sys constitutes most of the kernel's famous "[stable ABI to userspace][19]" which [no one may ever, under any circumstances, "break."][20] That doesn't mean the files in sysfs are static, which would be contrary to reference-counting of volatile objects.
+
+The kernel's stable ABI instead constrains what can appear in /sys, not what is actually present at any given instant. Listing the permissions on files in sysfs gives an idea of how the configurable, tunable parameters of devices, modules, filesystems, etc. can be set or read. Logic compels the conclusion that procfs is also part of the kernel's stable ABI, although the kernel's [documentation][19] doesn't state so explicitly.
+
+![Console][21]
+Files in sysfs describe exactly one property each for an entity and may be readable, writable or both. The "0" in the file reveals that the SSD is not removable.
+
+### Snooping on VFS with eBPF and bcc tools
+
+The easiest way to learn how the kernel manages sysfs files is to watch it in action, and the simplest way to watch on ARM64 or x86_64 is to use eBPF. eBPF (extended Berkeley Packet Filter) consists of a [virtual machine running inside the kernel][22] that privileged users can query from the command line. Kernel source tells the reader what the kernel can do; running eBPF tools on a booted system shows instead what the kernel actually does.
+
+Happily, getting started with eBPF is pretty easy via the [bcc][23] tools, which are available as [packages from major Linux distros][24] and have been [amply documented][25] by Brendan Gregg. The bcc tools are Python scripts with small embedded snippets of C, meaning anyone who is comfortable with either language can readily modify them. At this count, [there are 80 Python scripts in bcc/tools][26], making it highly likely that a system administrator or developer will find an existing one relevant to her/his needs.
+
+To get a very crude idea about what work VFSes are performing on a running system, try the simple [vfscount][27] or [vfsstat][28], which show that dozens of calls to vfs_open() and its friends occur every second.
+
+![Console - vfsstat.py][29]
+vfsstat.py is a Python script with an embedded C snippet that simply counts VFS function calls.
+
+For a less trivial example, let's watch what happens in sysfs when a USB stick is inserted on a running system.
+
+![Console when USB is inserted][30]
+Watch with eBPF what happens in /sys when a USB stick is inserted, with simple and complex examples.
+
+In the first simple example above, the [trace.py][31] bcc tools script prints out a message whenever the sysfs_create_files() command runs. We see that sysfs_create_files() was started by a kworker thread in response to the USB stick insertion, but what file was created? The second example illustrates the full power of eBPF. Here, trace.py is printing the kernel backtrace (-K option) plus the name of the file created by sysfs_create_files(). The snippet inside the single quotes is some C source code, including an easily recognizable format string, that the provided Python script [induces a LLVM just-in-time compiler][32] to compile and execute inside an in-kernel virtual machine. The full sysfs_create_files() function signature must be reproduced in the second command so that the format string can refer to one of the parameters. Making mistakes in this C snippet results in recognizable C-compiler errors. For example, if the **-I** parameter is omitted, the result is "Failed to compile BPF text." Developers who are conversant with either C or Python will find the bcc tools easy to extend and modify.
+
+When the USB stick is inserted, the kernel backtrace appears showing that PID 7711 is a kworker thread that created a file called "events" in sysfs. A corresponding invocation with sysfs_remove_files() shows that removal of the USB stick results in removal of the events file, in keeping with the idea of reference counting. Watching sysfs_create_link() with eBPF during USB stick insertion (not shown) reveals that no fewer than 48 symbolic links are created.
+
+What is the purpose of the events file anyway? Using [cscope][33] to find the function [__device_add_disk()][34] reveals that it calls disk_add_events(), and either "media_change" or "eject_request" may be written to the events file. Here, the kernel's block layer is informing userspace about the appearance and disappearance of the "disk." Consider how quickly informative this method of investigating how USB stick insertion works is compared to trying to figure out the process solely from the source.
+
+### Read-only root filesystems make embedded devices possible
+
+Assuredly, no one shuts down a server or desktop system by pulling out the power plug. Why? Because mounted filesystems on the physical storage devices may have pending writes, and the data structures that record their state may become out of sync with what is written on the storage. When that happens, system owners will have to wait at next boot for the [fsck filesystem-recovery tool][35] to run and, in the worst case, will actually lose data.
+
+Yet, aficionados will have heard that many IoT and embedded devices like routers, thermostats, and automobiles now run Linux. Many of these devices almost entirely lack a user interface, and there's no way to "unboot" them cleanly. Consider jump-starting a car with a dead battery where the power to the [Linux-running head unit][36] goes up and down repeatedly. How is it that the system boots without a long fsck when the engine finally starts running? The answer is that embedded devices rely on [a read-only root fileystem][37] (ro-rootfs for short).
+
+![Photograph of a console][38]
+ro-rootfs are why embedded systems don't frequently need to fsck. Credit (with permission):
+
+A ro-rootfs offers many advantages that are less obvious than incorruptibility. One is that malware cannot write to /usr or /lib if no Linux process can write there. Another is that a largely immutable filesystem is critical for field support of remote devices, as support personnel possess local systems that are nominally identical to those in the field. Perhaps the most important (but also most subtle) advantage is that ro-rootfs forces developers to decide during a project's design phase which system objects will be immutable. Dealing with ro-rootfs may often be inconvenient or even painful, as [const variables in programming languages][39] often are, but the benefits easily repay the extra overhead.
+
+Creating a read-only rootfs does require some additional amount of effort for embedded developers, and that's where VFS comes in. Linux needs files in /var to be writable, and in addition, many popular applications that embedded systems run will try to create configuration dot-files in $HOME. One solution for configuration files in the home directory is typically to pregenerate them and build them into the rootfs. For /var, one approach is to mount it on a separate writable partition while / itself is mounted as read-only. Using bind or overlay mounts is another popular alternative.
+
+### Bind and overlay mounts and their use by containers
+
+Running **[man mount][40]** is the best place to learn about bind and overlay mounts, which give embedded developers and system administrators the power to create a filesystem in one path location and then provide it to applications at a second one. For embedded systems, the implication is that it's possible to store the files in /var on an unwritable flash device but overlay- or bind-mount a path in a tmpfs onto the /var path at boot so that applications can scrawl there to their heart's delight. At next power-on, the changes in /var will be gone. Overlay mounts provide a union between the tmpfs and the underlying filesystem and allow apparent modification to an existing file in a ro-rootfs, while bind mounts can make new empty tmpfs directories show up as writable at ro-rootfs paths. While overlayfs is a proper filesystem type, bind mounts are implemented by the [VFS namespace facility][41].
+
+Based on the description of overlay and bind mounts, no one will be surprised that [Linux containers][42] make heavy use of them. Let's spy on what happens when we employ [systemd-nspawn][43] to start up a container by running bcc's mountsnoop tool:
+
+![Console - system-nspawn invocation][44]
+The system-nspawn invocation fires up the container while mountsnoop.py runs.
+
+And let's see what happened:
+
+![Console - Running mountsnoop][45]
+Running mountsnoop during the container "boot" reveals that the container runtime relies heavily on bind mounts. (Only the beginning of the lengthy output is displayed)
+
+Here, systemd-nspawn is providing selected files in the host's procfs and sysfs to the container at paths in its rootfs. Besides the MS_BIND flag that sets bind-mounting, some of the other flags that the "mount" system call invokes determine the relationship between changes in the host namespace and in the container. For example, the bind-mount can either propagate changes in /proc and /sys to the container, or hide them, depending on the invocation.
+
+### Summary
+
+Understanding Linux internals can seem an impossible task, as the kernel itself contains a gigantic amount of code, leaving aside Linux userspace applications and the system-call interface in C libraries like glibc. One way to make progress is to read the source code of one kernel subsystem with an emphasis on understanding the userspace-facing system calls and headers plus major kernel internal interfaces, exemplified here by the file_operations table. The file operations are what makes "everything is a file" actually work, so getting a handle on them is particularly satisfying. The kernel C source files in the top-level fs/ directory constitute its implementation of virtual filesystems, which are the shim layer that enables broad and relatively straightforward interoperability of popular filesystems and storage devices. Bind and overlay mounts via Linux namespaces are the VFS magic that makes containers and read-only root filesystems possible. In combination with a study of source code, the eBPF kernel facility and its bcc interface makes probing the kernel simpler than ever before.
+
+Much thanks to [Akkana Peck][46] and [Michael Eager][47] for comments and corrections.
+
+Alison Chaiken will present [Virtual filesystems: why we need them and how they work][48] at the 17th annual Southern California Linux Expo ([SCaLE 17x][49]) March 7-10 in Pasadena, Calif.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/virtual-filesystems-linux
+
+作者:[Alison Chariken][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:
+[b]: https://github.com/lujun9972
+[1]: https://www.pearson.com/us/higher-education/program/Love-Linux-Kernel-Development-3rd-Edition/PGM202532.html
+[2]: http://cassandra.apache.org/
+[3]: https://en.wikipedia.org/wiki/NoSQL
+[4]: http://lwn.net/Articles/444910/
+[5]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_1-console.png (Console)
+[6]: https://lwn.net/Articles/22355/
+[7]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/fs.h
+[8]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/fs
+[9]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_2-shim-layer.png (How userspace accesses various types of filesystems)
+[10]: https://lwn.net/Articles/774114/
+[11]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_3-crazy.jpg (Man with shocked expression)
+[12]: https://wiki.archlinux.org/index.php/Tmpfs
+[13]: http://man7.org/linux/man-pages/man8/sysctl.8.html
+[14]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_4-proc-meminfo.png (Console)
+[15]: http://www-f1.ijs.si/~ramsak/km1/mermin.moon.pdf
+[16]: https://en.wikiquote.org/wiki/David_Mermin
+[17]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_5-moon.jpg (Full moon)
+[18]: https://commons.wikimedia.org/wiki/Moon#/media/File:Full_Moon_Luc_Viatour.jpg
+[19]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/ABI/stable
+[20]: https://lkml.org/lkml/2012/12/23/75
+[21]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_7-sysfs.png (Console)
+[22]: https://events.linuxfoundation.org/sites/events/files/slides/bpf_collabsummit_2015feb20.pdf
+[23]: https://github.com/iovisor/bcc
+[24]: https://github.com/iovisor/bcc/blob/master/INSTALL.md
+[25]: http://brendangregg.com/ebpf.html
+[26]: https://github.com/iovisor/bcc/tree/master/tools
+[27]: https://github.com/iovisor/bcc/blob/master/tools/vfscount_example.txt
+[28]: https://github.com/iovisor/bcc/blob/master/tools/vfsstat.py
+[29]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_8-vfsstat.png (Console - vfsstat.py)
+[30]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_9-ebpf.png (Console when USB is inserted)
+[31]: https://github.com/iovisor/bcc/blob/master/tools/trace_example.txt
+[32]: https://events.static.linuxfound.org/sites/events/files/slides/bpf_collabsummit_2015feb20.pdf
+[33]: http://northstar-www.dartmouth.edu/doc/solaris-forte/manuals/c/user_guide/cscope.html
+[34]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/block/genhd.c#n665
+[35]: http://www.man7.org/linux/man-pages/man8/fsck.8.html
+[36]: https://wiki.automotivelinux.org/_media/eg-rhsa/agl_referencehardwarespec_v0.1.0_20171018.pdf
+[37]: https://elinux.org/images/1/1f/Read-only_rootfs.pdf
+[38]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_10-code.jpg (Photograph of a console)
+[39]: https://www.meetup.com/ACCU-Bay-Area/events/drpmvfytlbqb/
+[40]: http://man7.org/linux/man-pages/man8/mount.8.html
+[41]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/sharedsubtree.txt
+[42]: https://coreos.com/os/docs/latest/kernel-modules.html
+[43]: https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html
+[44]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_11-system-nspawn.png (Console - system-nspawn invocation)
+[45]: https://opensource.com/sites/default/files/uploads/virtualfilesystems_12-mountsnoop.png (Console - Running mountsnoop)
+[46]: http://shallowsky.com/
+[47]: http://eagercon.com/
+[48]: https://www.socallinuxexpo.org/scale/17x/presentations/virtual-filesystems-why-we-need-them-and-how-they-work
+[49]: https://www.socallinuxexpo.org/
diff --git a/sources/tech/20190311 7 resources for learning to use your Raspberry Pi.md b/sources/tech/20190311 7 resources for learning to use your Raspberry Pi.md
new file mode 100644
index 0000000000..3989b3993b
--- /dev/null
+++ b/sources/tech/20190311 7 resources for learning to use your Raspberry Pi.md
@@ -0,0 +1,80 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (7 resources for learning to use your Raspberry Pi)
+[#]: via: (https://opensource.com/article/19/3/resources-raspberry-pi)
+[#]: author: (Manuel Dewald https://opensource.com/users/ntlx)
+
+7 resources for learning to use your Raspberry Pi
+======
+Books, courses, and websites to shorten your Raspberry Pi learning curve.
+
+
+The [Raspberry Pi][1] is a small, single-board computer originally intended for teaching and learning programming and computer science. But today it's so much more. It is affordable, low-energy computing power that people can use for all kinds of things—from home entertainment over server applications to Internet of Things (IoT) projects.
+
+There are so many resources on the topic and so many different projects you can do, it's hard to know where to begin. Following are some resources that will help you get started with the Raspberry Pi. Have fun browsing through it, but don't stop here. By looking left and right you will find a lot to discover and get deeper into the rabbit hole of the Raspberry Pi wonderland.
+
+### Books
+
+There are many books available in different languages about the Raspberry Pi. These two will help you start—then dive deep—into Raspberry Pi topics.
+
+#### Raspberry Pi Cookbook: Software and Hardware Problems and Solutions by Simon Monk
+
+Simon Monk is a software engineer and was a hobbyist maker for years. He was first attracted to the Arduino as an easy-to-use board for electronics development and later published a [book][2] about it. Later, he moved on to the Raspberry Pi and wrote [Raspberry Pi Cookbook: Software and Hardware Problems and Solutions][3]. In the book, you can find a lot of best practices for Raspberry Pi projects and solutions for all kinds of challenges you may face.
+
+#### Programming the Raspberry Pi: Getting Started with Python by Simon Monk
+
+Python has evolved as the go-to programming language for getting started with Raspberry Pi projects, as it is easy to learn and use, even if you don't have any programming experience. Also, a lot of its libraries help you focus on what makes your project special instead of implementing protocols to communicate with your sensors again and again. Monk wrote two chapters about Python programming in the Raspberry Pi Cookbook, but [Programming the Raspberry Pi: Getting Started with Python][4] is a more thorough quickstart. It introduces you to Python and shows you some projects you can create with it on the Raspberry Pi.
+
+### Online course
+
+There are many online courses and tutorials new Raspberry Pi users can choose from, including this introductory class.
+
+#### Raspberry Pi Class
+
+Instructables' free [Raspberry Pi Class][5] online course offers you an all-around introduction to the Raspberry Pi. It starts with Raspberry Pi and Linux operating basics, then gets into Python programming and GPIO communication. This makes it a good top-to-bottom Raspberry Pi guide if you are new to the topic and want to get started quickly.
+
+### Websites
+
+The web is rife with excellent information about Raspberry Pi, but these four sites should be on the top of any new user's list.
+
+#### RaspberryPi.org
+
+The official [Raspberry Pi][6] website is one of the best places to get started. Many articles about specific projects link to the site for the basics like installing Raspbian onto the Raspberry Pi. (This is what I tend to do, instead of repeating the instructions in every how-to.) You can also find [sample projects][7] and courses on [teaching][8] tech topics to students.
+
+#### Opensource.com
+
+On Opensource.com, you can find a number of different Raspberry Pi project how-to's, getting started guides, success stories, updates, and more. Take a look at the [Raspberry Pi topic page][9] to find out what people are doing with Raspberry Pi.
+
+#### Instructables and Hackaday
+
+Do you want to build your own retro arcade gaming console? Or for your mirror to display weather information, the time, and the first event on the day's calendar? Are you looking to create a word clock or maybe a photo booth for a party? Chances are good that you will find instructions on how to do all of this (and more!) with a Raspberry Pi on sites like [Instructables][10] and [Hackaday][11]. If you're not sure if you should get a Raspberry Pi, browse these sites, and you'll find plenty of reasons to buy one.
+
+What are your favorite Raspberry Pi resources? Please share them in the comments!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/resources-raspberry-pi
+
+作者:[Manuel Dewald][a]
+选题:[lujun9972][b]
+译者:[译者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/ntlx
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/resources/raspberry-pi
+[2]: http://simonmonk.org/progardui2ed/
+[3]: http://simonmonk.org/raspberry-pi-cookbook-ed2/
+[4]: http://simonmonk.org/programming-raspberry-pi-ed2/
+[5]: https://www.instructables.com/class/Raspberry-Pi-Class/
+[6]: https://raspberrypi.org
+[7]: https://projects.raspberrypi.org/
+[8]: https://www.raspberrypi.org/training/online
+[9]: https://opensource.com/tags/raspberry-pi
+[10]: https://www.instructables.com/technology/raspberry-pi/
+[11]: https://hackaday.io/projects?tag=raspberry%20pi
diff --git a/sources/tech/20190311 Blockchain 2.0- Redefining Financial Services -Part 3.md b/sources/tech/20190311 Blockchain 2.0- Redefining Financial Services -Part 3.md
new file mode 100644
index 0000000000..5f82bc87ff
--- /dev/null
+++ b/sources/tech/20190311 Blockchain 2.0- Redefining Financial Services -Part 3.md
@@ -0,0 +1,63 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Blockchain 2.0: Redefining Financial Services [Part 3])
+[#]: via: (https://www.ostechnix.com/blockchain-2-0-redefining-financial-services/)
+[#]: author: (EDITOR https://www.ostechnix.com/author/editor/)
+
+Blockchain 2.0: Redefining Financial Services [Part 3]
+======
+
+
+
+The [**previous article of this series**][1] focused on building context to bring forth why moving our existing monetary system to a futuristic [**blockchain**][2] system is the next natural step in the evolution of “money”. We looked at the features of a blockchain platform which would aid in such a move. However, the financial markets are far more complex and composed of numerous other instruments that people trade rather than just a currency.
+
+This part will explore the features of blockchain which will enable institutions to transform and interlace traditional banking and financing systems with it. As previously discussed, and proved, if enough people participate in a given blockchain network and support the protocols for transactions, the nominal value that can be attributed to the “token” increases and becomes more stable. Take, for instance, Bitcoin (BTC). Like the simple paper currency, we’re all used to, cryptocurrencies such as Bitcoin and Ether can be utilized for all the former’s purposes from buying food to ships and from loaning money to insurance.
+
+Chances are you are already involved with a bank or any other financial institution that makes use of blockchain ledger technology. The most significant uses of blockchain tech in the finance industry will be in setting up payments infrastructure, fund transfer technologies, and digital identity management. The latter two have traditionally been handled by legacy systems in the financial services industry. These systems are slowly being migrated to blockchain systems owing to their efficiency in handling work like this. The blockchain also offers high-quality data analytics solutions to these firms, an aspect that is quickly gaining prominence because of recent developments in data sciences.[1]
+
+Considering the start-ups and projects at the cutting edge of innovation in this space first seems warranted due to their products or services already doing the rounds in the market today.
+
+Starting with PayPal, an online payments company started in 1998, and now among the largest of such platforms, it is considered to be a benchmark in terms of operations and technical prowess. PayPal derives largely from the existing monetary system. Its contribution to innovation came by how it collected and leveraged consumer data to provide services online at instantaneous speeds. Online transactions are taken for granted today with minimal innovation in the industry in terms of the tech that it’s based on. Having a solid foundation is a good thing, but that won’t give anyone an edge over their competition in this fast-paced IT world with new standards and technology being pioneered every other day. In 2014 PayPal subsidiary, **Braintree** announced partnerships with popular cryptocurrency payment solutions including **Coinbase** and **GoCoin** , in a bid to gradually integrate Bitcoin and other popular cryptocurrencies into its service platform. This basically gave its consumers a chance to explore and experience the side of what’s to come under the familiar umbrella cover and reliability of PayPal. In fact, ride-hailing company **Uber** had an exclusive partnership with Braintree to allow customers to pay for rides using Bitcoin.[2][3]
+
+**Ripple** is making it easier for people to operate between multiple blockchains. Ripple has been in the headlines for moving ahead with regional banks in the US, for instance, to facilitate transferring money bilaterally to other regional banks without the need for a 3rd party intermediary resulting in reduced cost and time overheads. Ripple’s **Codius platform** allows for interoperability between blockchains and opens the doors to smart contracts programmed into the system for minimal tampering and confusion. Built on technology that is highly advanced, secure and scalable to suit needs, Ripple’s platform currently has names such as UBS and Standard Chartered on their client’s list. Many more are expected to join in.[4][5]
+
+**Kraken** , a US-based cryptocurrency exchange operating in locations around the globe is known for their reliable **crypto quant** estimates even providing Bitcoin pricing data real time to the Bloomberg terminal. In 2015, they partnered with **Fidor Bank** to form what was then the world’s first Cryptocurrency Bank offering customers banking services and products which dealt with cryptocurrencies.[6]
+
+**Circle** , another FinTech company is currently among the largest of its sorts involved with allowing users to invest and trade in cryptocurrency derived assets, similar to traditional money market assets.[7]
+
+Companies such as **Wyre** and **Stellar** today have managed to bring down the lead time involved in international wire transfers from an average of 3 days to under 6 hours. Claims have been made saying that once a proper regulatory system is in place the same 6 hours can be brought down to a matter of seconds.[8]
+
+Now while all of the above have focused on the start-up projects involved, it has to be remembered that the reach and capabilities of the older more respectable financial institutions should not be ignored. Institutions that have existed for decades if not centuries moving billions of dollars worldwide are equally interested in leveraging the blockchain and its potential.
+
+As we already mentioned in the previous article, **JP Morgan** recently unveiled their plans to exploit cryptocurrencies and the underlying ledger like the functionality of the blockchain for enterprises. The project, called **Quorum** , is defined as an **“Enterprise-ready distributed ledger and smart contract platform”**. The main goal being that gradually the bulk of the bank’s operations would one day be migrated to Quorum thus cutting significant investments that firms such as JP Morgan need to make in order to guarantee privacy, security, and transparency. They’re claimed to be the only player in the industry now to have complete ownership over the whole stack of the blockchain, protocol, and token system. They also released a cryptocurrency called **JPM Coin** meant to be used in transacting high volume settlements instantaneously. JPM coin is among the first “stable coins” to be backed by a major bank such as JP Morgan. A stable coin is a cryptocurrency whose price is linked to an existing major monetary system. Quorum is also touted for its capabilities to process almost 100 transactions a second which is leaps and bounds ahead of its contemporaries.[9]
+
+**Barclay’s** , a British multinational financial giant is reported to have registered two blockchain-based patents supposedly with the aim of streamlining fund transfers and KYC procedures. Barclay’s proposals though are more aimed toward improving their banking operations’ efficiency. One of the application deals with creating a private blockchain network for storing KYC details of consumers. Once verified, stored and confirmed, these details are immutable and nullifies the need for further verifications down the line. If implemented the protocol will do away with the need for multiple verifications of KYC details. Developing and densely populated countries such as India where a bulk of the population is yet to be inducted into a formal banking system will find the innovative KYC system useful in reducing random errors and lead times involved in the process[10]. Barclay’s is also rumored to be exploring the capabilities of a blockchain system to address credit status ratings and insurance claims.
+
+Such blockchain backed systems are designed to eliminate needless maintenance costs and leverage the power of smart contracts for enterprises which operate in industries where discretion, security, and speed determine competitive advantage. Being enterprise products, they’re built on protocols that ensure complete transaction and contract privacy along with a consensus mechanism which essentially nullifies corruption and bribery.
+
+**PwC’s Global Fintech Report** from 2017 states that by 2020, an estimated 77% of all Fintech companies are estimated to switch to blockchain based technologies and processes concerning their operations. A whopping 90 percent of their respondents said that they were planning to adopt blockchain technology as part of an in-production system by 2020. Their judgments are not misplaced as significant cost savings and transparency gains from a regulatory point of view are guaranteed by moving to a blockchain based system.[11]
+
+Since regulatory capabilities are built into the blockchain platform by default the migration of firms from legacy systems to modern networks running blockchain ledgers is a welcome move for industry regulators as well. Transactions and trade movements can be verified and tracked on the fly once and for all rather than after. This, in the long run, will likely result in better regulation and risk management. Not to mention improved accountability from the part of firms and individuals alike.[11]
+
+While considerable investments in the space and leaping innovations are courtesy of large investments by established corporates it is misleading to think that such measures wouldn’t permeate the benefits to the end user. As banks and financial institutions start to adopt the blockchain, it will result in increased cost savings and efficiency for them which will ultimately mean good for the end consumer too. The added benefits of transparency and fraud protection will improve customer sentiments and more importantly improve the trust that people place on the banking and financial system. A much-needed revolution in the financial services industry is possible with blockchains and their integration into traditional services.
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/blockchain-2-0-redefining-financial-services/
+
+作者:[EDITOR][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/editor/
+[b]: https://github.com/lujun9972
+[1]: https://www.ostechnix.com/blockchain-2-0-revolutionizing-the-financial-system/
+[2]: https://www.ostechnix.com/blockchain-2-0-an-introduction/
diff --git a/sources/tech/20190311 Building the virtualization stack of the future with rust-vmm.md b/sources/tech/20190311 Building the virtualization stack of the future with rust-vmm.md
new file mode 100644
index 0000000000..b1e7fbf046
--- /dev/null
+++ b/sources/tech/20190311 Building the virtualization stack of the future with rust-vmm.md
@@ -0,0 +1,76 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Building the virtualization stack of the future with rust-vmm)
+[#]: via: (https://opensource.com/article/19/3/rust-virtual-machine)
+[#]: author: (Andreea Florescu )
+
+Building the virtualization stack of the future with rust-vmm
+======
+rust-vmm facilitates sharing core virtualization components between Rust Virtual Machine Monitors.
+
+
+More than a year ago we started developing [Firecracker][1], a virtual machine monitor (VMM) that runs on top of KVM (the kernel-based virtual machine). We wanted to create a lightweight VMM that starts virtual machines (VMs) in a fraction of a second, with a low memory footprint, to enable high-density cloud environments.
+
+We started out developing Firecracker by forking the Chrome OS VMM ([CrosVM][2]), but we diverged shortly after because we targeted different customer use cases. CrosVM provides Linux application isolation in ChromeOS, while Firecracker is used for running multi-tenant workloads at scale. Even though we now walk different paths, we still have common virtualization components, such as wrappers over KVM input/output controls (ioctls), a minimal kernel loader, and use of the [Virtio][3] device models.
+
+With this in mind, we started thinking about the best approach for sharing the common code. Having a shared codebase raises the security and quality bar for both projects. Currently, fixing security bugs requires duplicated work in terms of porting the changes from one project to the other and going through different review processes for merging the changes. After open sourcing Firecracker, we've received requests for adding features including GPU support and booting [bzImage][4] files. Some of the requests didn't align with Firecracker's goals, but were otherwise valid use cases that just haven't found the right place for an implementation.
+
+### The rust-vmm project
+
+The [rust-vmm][5] project came to life in December 2018 when Amazon, Google, Intel, and Red Hat employees started talking about the best way of sharing virtualization packages. More contributors have joined this initiative along the way. We are still at the beginning of this journey, with only one component published to [Crates.io][6] (Rust's package registry) and several others (such as Virtio devices, Linux kernel loaders, and KVM ioctls wrappers) being developed. With two VMMs written in Rust under active development and growing interest in building other specialized VMMs, rust-vmm was born as the host for sharing core virtualization components.
+
+The goal of rust-vmm is to enable the community to create custom VMMs that import just the required building blocks for their use case. We decided to organize rust-vmm as a multi-repository project, where each repository corresponds to an independent virtualization component. Each individual building block is published on Crates.io.
+
+### Creating custom VMMs with rust-vmm
+
+The components discussed below are currently under development.
+
+
+
+Each box on the right side of the diagram is a GitHub repository corresponding to one package, which in Rust is called a crate. The functionality of one crate can be further split into modules, for example virtio-devices. Let's have a look at these components and some of their potential use cases.
+
+ * **KVM interface:** Creating our VMM on top of KVM requires an interface that can invoke KVM functionality from Rust. The kvm-bindings crate represents the Rust Foreign Function Interface (FFI) to KVM kernel headers. Because headers only include structures and defines, we also have wrappers over the KVM ioctls (kvm-ioctls) that we use for opening dev/kvm, creating a VM, creating vCPUs, and so on.
+
+ * **Virtio devices and rate limiting:** Virtio has a frontend-backend architecture. Currently in rust-vmm, the frontend is implemented in the virtio-devices crate, and the backend lies in the vhost package. Vhost has support for both user-land and kernel-land drivers, but users can also plug virtio-devices to their custom backend. The virtio-bindings are the bindings for Virtio devices generated using the Virtio Linux headers. All devices in the virtio-devices crate are exported independently as modules using conditional compilation. Some devices, such as block, net, and vsock support rate limiting in terms of I/O per second and bandwidth. This can be achieved by using the functionality provided in the rate-limiter crate.
+
+ * The kernel-loader is responsible for loading the contents of an [ELF][7] kernel image in guest memory.
+
+
+
+
+For example, let's say we want to build a custom VMM that allows users to create and configure a single VM running on top of KVM. As part of the configuration, users will be able to specify the kernel image file, the root file system, the number of vCPUs, and the memory size. Creating and configuring the resources of the VM can be implemented using the kvm-ioctls crate. The kernel image can be loaded in guest memory with kernel-loader, and specifying a root filesystem can be achieved with the virtio-devices block module. The last thing needed for our VMM is writing VMM Glue, the code that takes care of integrating rust-vmm components with the VMM user interface, which allows users to create and manage VMs.
+
+### How you can help
+
+This is the beginning of an exciting journey, and we are looking forward to getting more people interested in VMMs, Rust, and the place where you can find both: [rust-vmm][5].
+
+We currently have [sync meetings][8] every two weeks to discuss the future of the rust-vmm organization. The meetings are open to anyone willing to participate. If you have any questions, please open an issue in the [community repository][9] or send an email to the rust-vmm [mailing list][10] (you can also [subscribe][11]). We also have a [Slack channel][12] and encourage you to join, if you are interested.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/rust-virtual-machine
+
+作者:[Andreea Florescu][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:
+[b]: https://github.com/lujun9972
+[1]: https://github.com/firecracker-microvm/firecracker
+[2]: https://chromium.googlesource.com/chromiumos/platform/crosvm/
+[3]: https://www.linux-kvm.org/page/Virtio
+[4]: https://en.wikipedia.org/wiki/Vmlinux#bzImage
+[5]: https://github.com/rust-vmm
+[6]: https://crates.io/
+[7]: https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
+[8]: http://lists.opendev.org/pipermail/rust-vmm/2019-January/000103.html
+[9]: https://github.com/rust-vmm/community
+[10]: mailto:rust-vmm@lists.opendev.org
+[11]: http://lists.opendev.org/cgi-bin/mailman/listinfo/rust-vmm
+[12]: https://join.slack.com/t/rust-vmm/shared_invite/enQtNTI3NDM2NjA5MzMzLTJiZjUxOGEwMTJkZDVkYTcxYjhjMWU3YzVhOGQ0M2Y5NmU5MzExMjg5NGE3NjlmNzNhZDlhMmY4ZjVhYTQ4ZmQ
diff --git a/sources/tech/20190312 BackBox Linux for Penetration Testing.md b/sources/tech/20190312 BackBox Linux for Penetration Testing.md
new file mode 100644
index 0000000000..b79a4a5cee
--- /dev/null
+++ b/sources/tech/20190312 BackBox Linux for Penetration Testing.md
@@ -0,0 +1,200 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (BackBox Linux for Penetration Testing)
+[#]: via: (https://www.linux.com/blog/learn/2019/3/backbox-linux-penetration-testing)
+[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
+
+BackBox Linux for Penetration Testing
+======
+
+
+Any given task can succeed or fail depending upon the tools at hand. For security engineers in particular, building just the right toolkit can make life exponentially easier. Luckily, with open source, you have a wide range of applications and environments at your disposal, ranging from simple commands to complicated and integrated tools.
+
+The problem with the piecemeal approach, however, is that you might wind up missing out on something that can make or break a job… or you waste a lot of time hunting down the right tools for the job. To that end, it’s always good to consider an operating system geared specifically for penetration testing (aka pentesting).
+
+Within the world of open source, the most popular pentesting distribution is [Kali Linux][1]. It is, however, not the only tool in the shop. In fact, there’s another flavor of Linux, aimed specifically at pentesting, called [BackBox][2]. BackBox is based on Ubuntu Linux, which also means you have easy access to a host of other outstanding applications besides those that are included, out of the box.
+
+### What Makes BackBox Special?
+
+BackBox includes a suite of ethical hacking tools, geared specifically toward pentesting. These testing tools include the likes of:
+
+ * Web application analysis
+
+ * Exploitation testing
+
+ * Network analysis
+
+ * Stress testing
+
+ * Privilege escalation
+
+ * Vulnerability assessment
+
+ * Computer forensic analysis and exploitation
+
+ * And much more
+
+
+
+
+Out of the box, one of the most significant differences between Kali Linux and BackBox is the number of installed tools. Whereas Kali Linux ships with hundreds of tools pre-installed, BackBox significantly limits that number to around 70. Nonetheless, BackBox includes many of the tools necessary to get the job done, such as:
+
+ * Ettercap
+
+ * Msfconsole
+
+ * Wireshark
+
+ * ZAP
+
+ * Zenmap
+
+ * BeEF Browser Exploitation
+
+ * Sqlmap
+
+ * Driftnet
+
+ * Tcpdump
+
+ * Cryptcat
+
+ * Weevely
+
+ * Siege
+
+ * Autopsy
+
+
+
+
+BackBox is in active development, the latest version (5.3) was released February 18, 2019. But how is BackBox as a usable tool? Let’s install and find out.
+
+### Installation
+
+If you’ve installed one Linux distribution, you’ve installed them all … with only slight variation. BackBox is pretty much the same as any other installation. [Download the ISO][3], burn the ISO onto a USB drive, boot from the USB drive, and click the Install icon.
+
+The installer (Figure 1) will be instantly familiar to anyone who has installed a Ubuntu or Debian derivative. Just because BackBox is a distribution geared specifically toward security administrators, doesn’t mean the operating system is a challenge to get up and running. In fact, BackBox is a point-and-click affair that anyone, regardless of skills, can install.
+
+![installation][5]
+
+Figure 1: The installation of BackBox will be immediately familiar to anyone.
+
+[Used with permission][6]
+
+The trickiest section of the installation is the Installation Type. As you can see (Figure 2), even this step is quite simple.
+
+![BackBox][8]
+
+Figure 2: Selecting the type of installation for BackBox.
+
+[Used with permission][6]
+
+Once you’ve installed BackBox, reboot the system, remove the USB drive, and wait for it to land on the login screen. Log into the desktop and you’re ready to go (Figure 3).
+
+![desktop][10]
+
+Figure 3: The BackBox Linux desktop, running as a VirtualBox virtual machine.
+
+[Used with permission][6]
+
+### Using BackBox
+
+Thanks to the [Xfce desktop environment][11], BackBox is easy enough for a Linux newbie to navigate. Click on the menu button in the top left corner to reveal the menu (Figure 4).
+
+![desktop menu][13]
+
+Figure 4: The BackBox desktop menu in action.
+
+[Used with permission][6]
+
+From the desktop menu, click on any one of the favorites (in the left pane) or click on a category to reveal the related tools (Figure 5).
+
+![Auditing][15]
+
+Figure 5: The Auditing category in the BackBox menu.
+
+[Used with permission][6]
+
+The menu entries you’ll most likely be interested in are:
+
+ * Anonymous - allows you to start an anonymous networking session.
+
+ * Auditing - the majority of the pentesting tools are found in here.
+
+ * Services - allows you to start/stop services such as Apache, Bluetooth, Logkeys, Networking, Polipo, SSH, and Tor.
+
+
+
+
+Before you run any of the testing tools, I would recommend you first making sure to update and upgrade BackBox. This can be done via a GUI or the command line. If you opt to go the GUI route, click on the desktop menu, click System, and click Software Updater. When the updater completes its check for updates, it will prompt you if any are available, or if (after an upgrade) a reboot is necessary (Figure 6).
+
+![reboot][17]
+
+Figure 6: Time to reboot after an upgrade.
+
+[Used with permission][6]
+
+Should you opt to go the manual route, open a terminal window and issue the following two commands:
+
+```
+sudo apt-get update
+
+sudo apt-get upgrade -y
+```
+
+Many of the BackBox pentesting tools do require a solid understanding of how each tool works, so before you attempt to use any given tool, make sure you know how to use said tool. Some tools (such as Metasploit) are made a bit easier to work with, thanks to BackBox. To run Metasploit, click on the desktop menu button and click msfconsole from the favorites (left pane). When the tool opens for the first time, you’ll be asked to configure a few options. Simply select each default given by clicking your keyboard Enter key when prompted. Once you see the Metasploit prompt, you can run commands like:
+
+```
+db_nmap 192.168.0/24
+```
+
+The above command will list out all discovered ports on a 192.168.1.x network scheme (Figure 7).
+
+![Metasploit][19]
+
+Figure 7: Open port discovery made simple with Metasploit on BackBox.
+
+[Used with permission][6]
+
+Even often-challenging tools like Metasploit are made far easier than they are with other distributions (partially because you don’t have to bother with installing the tools). That alone is worth the price of entry for BackBox (which is, of course, free).
+
+### The Conclusion
+
+Although BackBox usage may not be as widespread as Kali Linux, it still deserves your attention. For anyone looking to do pentesting on their various environments, BackBox makes the task far easier than so many other operating systems. Give this Linux distribution a go and see if it doesn’t aid you in your journey to security nirvana.
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/learn/2019/3/backbox-linux-penetration-testing
+
+作者:[Jack Wallen][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/jlwallen
+[b]: https://github.com/lujun9972
+[1]: https://www.kali.org/
+[2]: https://linux.backbox.org/
+[3]: https://www.backbox.org/download/
+[4]: /files/images/backbox1jpg
+[5]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_1.jpg?itok=pn4fQVp7 (installation)
+[6]: /licenses/category/used-permission
+[7]: /files/images/backbox2jpg
+[8]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_2.jpg?itok=tf-1zo8Z (BackBox)
+[9]: /files/images/backbox3jpg
+[10]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_3.jpg?itok=GLowoAUb (desktop)
+[11]: https://www.xfce.org/
+[12]: /files/images/backbox4jpg
+[13]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_4.jpg?itok=VmQXtuZL (desktop menu)
+[14]: /files/images/backbox5jpg
+[15]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_5.jpg?itok=UnfM_OxG (Auditing)
+[16]: /files/images/backbox6jpg
+[17]: https://www.linux.com/sites/lcom/files/styles/floated_images/public/backbox_6.jpg?itok=2t1BiKPn (reboot)
+[18]: /files/images/backbox7jpg
+[19]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/backbox_7.jpg?itok=Vw_GEub3 (Metasploit)
diff --git a/sources/tech/20190312 Star LabTop Mk III Open Source Edition- An Interesting Laptop.md b/sources/tech/20190312 Star LabTop Mk III Open Source Edition- An Interesting Laptop.md
new file mode 100644
index 0000000000..2e4b8f098a
--- /dev/null
+++ b/sources/tech/20190312 Star LabTop Mk III Open Source Edition- An Interesting Laptop.md
@@ -0,0 +1,93 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Star LabTop Mk III Open Source Edition: An Interesting Laptop)
+[#]: via: (https://itsfoss.com/star-labtop-open-source-edition)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Star LabTop Mk III Open Source Edition: An Interesting Laptop
+======
+
+[Star Labs Systems][1] have been producing Laptops tailored for Linux for some time. While you can purchase other variants available on their website, they have recently launched a [Kickstarter campaign][2] for their upcoming ‘Open Source Edition’ laptop that incorporates more features as per the requests by the users or reviewers.
+
+It may not be the best laptop you’ve ever come across for around a **1000 Euros** – but it certainly is interesting for some specific features.
+
+In this article, we will talk about what makes it an interesting deal and whether or not it’s worth investing for.
+
+![star labtop mk III][3]
+
+### Key Highlight: Open-source Coreboot Firmware
+
+Normally, you will observe proprietary firmware (BIOS) on computers, American Megatrends Inc, for example.
+
+But, here, Star Labs have tailored the [coreboot firmware][4] (a.k.a known as the LinuxBIOS) which is an open source alternative to proprietary solutions for this laptop.
+
+Not just open source but it is also a lighter firmware for better control over your laptop. With [TianoCore EDK II][5], it ensures that you get the maximum compatibility for most of the major Operating Systems.
+
+### Other Features of Star LabTop Mk III
+
+![sat labtop mk III][6]
+
+In addition to the open source firmware, the laptop features an **8th-gen i7 chipse** t ( **i7-8550u** ) coupled with **16 Gigs of LPDDR4 RAM** clocked at **2400 MHz**.
+
+The GPU being the integrated **Intel UHD Graphics 620** should be enough for professional tasks – except video editing and gaming. It will be rocking a **Full HD 13.3-inch IPS** panel as the display.
+
+The storage option includes **480 GB or 960 GB of PCIe SSD** – which is impressive as well. In addition to all this, it comes with the **USB Type-C** support.
+
+Interestingly, the **BIOS, Embedded Controller and SSD** will be receiving automatic [firmware updates][7] via the [LVFS][8] (the Mk III standard edition has this feature already).
+
+You should also check out a review video of [Star LabTob Mk III][9] to get an idea of how the open source edition could look like:
+
+If you are curious about the detailed tech specs, you should check out the [Kickstarter page][2].
+
+
+
+### Our Opinion
+
+![star labtop mk III][10]
+
+The inclusion of coreboot firmware and being something tailored for various Linux distributions originally is the reason why it is being termed as the “ **Open Source Edition”**.
+
+The price for the ultimate bundle on Kickstarter is **1087 Euros**.
+
+Can you get better laptop deals at this price? **Yes** , definitely. But, it really comes down to your preference and your passion for open source – of what you require.
+
+However, if you want a performance-driven laptop specifically tailored for Linux, yes, this is an option you might want to consider with something new to offer (and potentially considering your requests for their future builds).
+
+Of course, you cannot consider this for video editing and gaming – for obvious reasons. So, they should considering adding a dedicated GPU to make it a complete package for computing, gaming, video editing and much more. Maybe even a bigger screen, say 15.6-inch?
+
+### Wrapping Up
+
+For what it is worth, if you are a Linux and open source enthusiast and want a performance-driven laptop, this could be an option to go with and back this up on Kickstarter right now.
+
+What do you think about it? Will you be interested in a laptop like this? If not, why?
+
+Let us know your thoughts in the comments below.
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/star-labtop-open-source-edition
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://starlabs.systems
+[2]: https://www.kickstarter.com/projects/starlabs/star-labtop-mk-iii-open-source-edition
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/star-labtop-mkiii-2.jpg?resize=800%2C450&ssl=1
+[4]: https://en.wikipedia.org/wiki/Coreboot
+[5]: https://github.com/tianocore/tianocore.github.io/wiki/EDK-II
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/star-labtop-mkiii-1.jpg?ssl=1
+[7]: https://itsfoss.com/update-firmware-ubuntu/
+[8]: https://fwupd.org/
+[9]: https://starlabs.systems/pages/star-labtop
+[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/star-labtop-mkiii.jpg?resize=800%2C435&ssl=1
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/star-labtop-mkiii-2.jpg?fit=800%2C450&ssl=1
diff --git a/sources/tech/20190313 Game Review- Steel Rats is an Enjoyable Bike-Combat Game.md b/sources/tech/20190313 Game Review- Steel Rats is an Enjoyable Bike-Combat Game.md
new file mode 100644
index 0000000000..5af0ae30d3
--- /dev/null
+++ b/sources/tech/20190313 Game Review- Steel Rats is an Enjoyable Bike-Combat Game.md
@@ -0,0 +1,95 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Game Review: Steel Rats is an Enjoyable Bike-Combat Game)
+[#]: via: (https://itsfoss.com/steel-rats)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Game Review: Steel Rats is an Enjoyable Bike-Combat Game
+======
+
+Steel Rats is a quite impressive 2.5D motorbike combat game with exciting stunts involved. It was already available for Windows on [Steam][1] – however, recently it has been made available for Linux and Mac as well.
+
+In case you didn’t know, you can easily [install Steam on Ubuntu][2] or other distributions and [enable Steam Play feature to run some Windows games on Linux][3].
+
+So, in this article, we shall take a look at what the game is all about and if it is a good purchase for you.
+
+This game is neither free nor open source. We have covered it here because the game developers made an effort to port it to Linux.
+
+### Story Overview
+
+![steel rats][4]
+
+You belong to a biker gang – “ **Steel Rats** ” – who stepped up to protect their city from alien robots invasion. The alien robots aren’t just any tiny toys that you can easily defeat but with deadly weapons and abilities.
+
+The games features the setting as an alternative version of 1940’s USA – with the retro theme in place. You have to use your bike as the ultimate weapon to go against waves of alien robot and boss fights as well.
+
+You will encounter 4 different characters with unique abilities to switch from after progressing through a couple of rounds.
+
+You will start playing as “ **Toshi** ” and unlock other characters as you progress. **Toshi** is a genius and will be using a drone as his gadget to fight the alien robots. **James** – is the leader with the hammer attack as his special ability. **Lisa** would be the one utilizing fire to burn the junk robots. And, **Randall** will have his harpoon ready to destroy aerial robots with ease.
+
+### Gameplay
+
+![][5]
+
+Honestly, I am not a fan of 2.5 D (or 2D games). But, games like [Unravel][6] will be the exception – which is still not available for Linux, such a shame – EA.
+
+In this case, I did end up enjoying “ **Steel Rats** ” as one of the few 2D games I play.
+
+There is really no rocket science for this game – you just have to get good with the controls. No matter whether you use a controller or a keyboard, it is definitely challenging to get comfortable with the controls.
+
+You do not need to plan ahead in order to save your health or nitro boost because you will always have it when needed while also having checkpoints to resume your progress.
+
+You just need to keep the right pace and the perfect jump while hitting every enemy to get the best score in the leader boards. Once you do that, the game ends up being an easy and fun experience.
+
+If you’re curious about the gameplay, we recommend watching this video:
+
+ )
+```
+
+![Using a Gaussian filter in SciPy][19]
+
+### 4\. PIL/Pillow
+
+**PIL** (Python Imaging Library) is a free library for the Python programming language that adds support for opening, manipulating, and saving many different image file formats. However, its development has stagnated, with its last release in 2009. Fortunately, there is [**Pillow**][20], an actively developed fork of PIL, that is easier to install, runs on all major operating systems, and supports Python 3. The library contains basic image processing functionality, including point operations, filtering with a set of built-in convolution kernels, and color-space conversions.
+
+#### Resources
+
+The [documentation][21] has instructions for installation as well as examples covering every module of the library.
+
+#### Usage
+
+Enhancing an image in Pillow using ImageFilter:
+
+```
+from PIL import Image,ImageFilter
+#Read image
+im = Image.open('image.jpg')
+#Display image
+im.show()
+
+from PIL import ImageEnhance
+enh = ImageEnhance.Contrast(im)
+enh.enhance(1.8).show("30% more contrast")
+```
+
+![Enhancing an image in Pillow using ImageFilter][23]
+
+[Image source code][24]
+
+### 5\. OpenCV-Python
+
+**OpenCV** (Open Source Computer Vision Library) is one of the most widely used libraries for computer vision applications. [**OpenCV-Python**][25] is the Python API for OpenCV. OpenCV-Python is not only fast, since the background consists of code written in C/C++, but it is also easy to code and deploy (due to the Python wrapper in the foreground). This makes it a great choice to perform computationally intensive computer vision programs.
+
+#### Resources
+
+The [OpenCV2-Python-Guide][26] makes it easy to get started with OpenCV-Python.
+
+#### Usage
+
+Using _Image Blending using Pyramids_ in OpenCV-Python to create an "Orapple":
+
+
+![Image blending using Pyramids in OpenCV-Python][28]
+
+[Image source code][29]
+
+### 6\. SimpleCV
+
+[**SimpleCV**][30] is another open source framework for building computer vision applications. It offers access to several high-powered computer vision libraries such as OpenCV, but without having to know about bit depths, file formats, color spaces, etc. Its learning curve is substantially smaller than OpenCV's, and (as its tagline says), "it's computer vision made easy." Some points in favor of SimpleCV are:
+
+ * Even beginning programmers can write simple machine vision tests
+ * Cameras, video files, images, and video streams are all interoperable
+
+
+
+#### Resources
+
+The official [documentation][31] is very easy to follow and has tons of examples and use cases to follow.
+
+#### Usage
+
+### [7-_simplecv.png][32]
+
+![SimpleCV][33]
+
+### 7\. Mahotas
+
+**[Mahotas][34]** is another computer vision and image processing library for Python. It contains traditional image processing functions such as filtering and morphological operations, as well as more modern computer vision functions for feature computation, including interest point detection and local descriptors. The interface is in Python, which is appropriate for fast development, but the algorithms are implemented in C++ and tuned for speed. Mahotas' library is fast with minimalistic code and even minimum dependencies. Read its [official paper][35] for more insights.
+
+#### Resources
+
+The [documentation][36] contains installation instructions, examples, and even some tutorials to help you get started using Mahotas easily.
+
+#### Usage
+
+The Mahotas library relies on simple code to get things done. For example, it does a good job with the [Finding Wally][37] problem with a minimum amount of code.
+
+Solving the Finding Wally problem:
+
+![Finding Wally problem in Mahotas][39]
+
+[Image source code][40]
+
+![Finding Wally problem in Mahotas][42]
+
+[Image source code][40]
+
+### 8\. SimpleITK
+
+[**ITK**][43] (Insight Segmentation and Registration Toolkit) is an "open source, cross-platform system that provides developers with an extensive suite of software tools for image analysis. **[SimpleITK][44]** is a simplified layer built on top of ITK, intended to facilitate its use in rapid prototyping, education, [and] interpreted languages." It's also an image analysis toolkit with a [large number of components][45] supporting general filtering operations, image segmentation, and registration. SimpleITK is written in C++, but it's available for a large number of programming languages including Python.
+
+#### Resources
+
+There are a large number of [Jupyter Notebooks][46] illustrating the use of SimpleITK for educational and research activities. The notebooks demonstrate using SimpleITK for interactive image analysis using the Python and R programming languages.
+
+#### Usage
+
+Visualization of a rigid CT/MR registration process created with SimpleITK and Python:
+
+![SimpleITK animation][48]
+
+[Image source code][49]
+
+### 9\. pgmagick
+
+[**pgmagick**][50] is a Python-based wrapper for the GraphicsMagick library. The [**GraphicsMagick**][51] image processing system is sometimes called the Swiss Army Knife of image processing. Its robust and efficient collection of tools and libraries supports reading, writing, and manipulating images in over 88 major formats including DPX, GIF, JPEG, JPEG-2000, PNG, PDF, PNM, and TIFF.
+
+#### Resources
+
+pgmagick's [GitHub repository][52] has installation instructions and requirements. There is also a detailed [user guide][53].
+
+#### Usage
+
+Image scaling:
+
+![Image scaling in pgmagick][55]
+
+[Image source code][56]
+
+Edge extraction:
+
+![Edge extraction in pgmagick][58]
+
+[Image source code][59]
+
+### 10\. Pycairo
+
+[**Pycairo**][60] is a set of Python bindings for the [Cairo][61] graphics library. Cairo is a 2D graphics library for drawing vector graphics. Vector graphics are interesting because they don't lose clarity when resized or transformed. Pycairo can call Cairo commands from Python.
+
+#### Resources
+
+The Pycairo [GitHub repository][62] is a good resource with detailed instructions on installation and usage. There is also a [getting started guide][63], which has a brief tutorial on Pycairo.
+
+#### Usage
+
+Drawing lines, basic shapes, and radial gradients with Pycairo:
+
+![Pycairo][65]
+
+[Image source code][66]
+
+### Conclusion
+
+These are some of the useful and freely available image processing libraries in Python. Some are well known and others may be new to you. Try them out to get to know more about them!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/python-image-manipulation-tools
+
+作者:[Parul Pandey][a]
+选题:[lujun9972][b]
+译者:[译者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/parul-pandey
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/daisy_gimp_art_design.jpg?itok=6kCxAKWO
+[2]: https://scikit-image.org/
+[3]: http://docs.scipy.org/doc/numpy/reference/index.html#module-numpy
+[4]: http://scikit-image.org/docs/stable/user_guide.html
+[5]: /file/426206
+[6]: https://opensource.com/sites/default/files/uploads/1-scikit-image.png (Image filtering in scikit-image)
+[7]: http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_template.html#sphx-glr-auto-examples-features-detection-plot-template-py
+[8]: /file/426211
+[9]: https://opensource.com/sites/default/files/uploads/2-scikit-image.png (Template matching in scikit-image)
+[10]: https://scikit-image.org/docs/dev/auto_examples
+[11]: http://www.numpy.org/
+[12]: /file/426216
+[13]: https://opensource.com/sites/default/files/uploads/3-numpy.png (NumPy)
+[14]: https://www.scipy.org/
+[15]: https://docs.scipy.org/doc/scipy/reference/ndimage.html#module-scipy.ndimage
+[16]: https://docs.scipy.org/doc/scipy/reference/tutorial/ndimage.html#correlation-and-convolution
+[17]: https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.gaussian_filter.html
+[18]: /file/426221
+[19]: https://opensource.com/sites/default/files/uploads/4-scipy.png (Using a Gaussian filter in SciPy)
+[20]: https://python-pillow.org/
+[21]: https://pillow.readthedocs.io/en/3.1.x/index.html
+[22]: /file/426226
+[23]: https://opensource.com/sites/default/files/uploads/5-pillow.png (Enhancing an image in Pillow using ImageFilter)
+[24]: http://sipi.usc.edu/database/
+[25]: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_intro/py_intro.html
+[26]: https://github.com/abidrahmank/OpenCV2-Python-Tutorials
+[27]: /file/426236
+[28]: https://opensource.com/sites/default/files/uploads/6-opencv.jpeg (Image blending using Pyramids in OpenCV-Python)
+[29]: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_pyramids/py_pyramids.html#pyramids
+[30]: http://simplecv.org/
+[31]: http://examples.simplecv.org/en/latest/
+[32]: /file/426241
+[33]: https://opensource.com/sites/default/files/uploads/7-_simplecv.png (SimpleCV)
+[34]: https://mahotas.readthedocs.io/en/latest/
+[35]: https://openresearchsoftware.metajnl.com/articles/10.5334/jors.ac/
+[36]: https://mahotas.readthedocs.io/en/latest/install.html
+[37]: https://blog.clarifai.com/wheres-waldo-using-machine-learning-to-find-all-the-waldos
+[38]: /file/426246
+[39]: https://opensource.com/sites/default/files/uploads/8-mahotas.png (Finding Wally problem in Mahotas)
+[40]: https://mahotas.readthedocs.io/en/latest/wally.html
+[41]: /file/426251
+[42]: https://opensource.com/sites/default/files/uploads/9-mahotas.png (Finding Wally problem in Mahotas)
+[43]: https://itk.org/
+[44]: http://www.simpleitk.org/
+[45]: https://itk.org/ITK/resources/resources.html
+[46]: http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/
+[47]: /file/426256
+[48]: https://opensource.com/sites/default/files/uploads/10-simpleitk.gif (SimpleITK animation)
+[49]: https://github.com/InsightSoftwareConsortium/SimpleITK-Notebooks/blob/master/Utilities/intro_animation.py
+[50]: https://pypi.org/project/pgmagick/
+[51]: http://www.graphicsmagick.org/
+[52]: https://github.com/hhatto/pgmagick
+[53]: https://pgmagick.readthedocs.io/en/latest/
+[54]: /file/426261
+[55]: https://opensource.com/sites/default/files/uploads/11-pgmagick.png (Image scaling in pgmagick)
+[56]: https://pgmagick.readthedocs.io/en/latest/cookbook.html#scaling-a-jpeg-image
+[57]: /file/426266
+[58]: https://opensource.com/sites/default/files/uploads/12-pgmagick.png (Edge extraction in pgmagick)
+[59]: https://pgmagick.readthedocs.io/en/latest/cookbook.html#edge-extraction
+[60]: https://pypi.org/project/pycairo/
+[61]: https://cairographics.org/
+[62]: https://github.com/pygobject/pycairo
+[63]: https://pycairo.readthedocs.io/en/latest/tutorial.html
+[64]: /file/426271
+[65]: https://opensource.com/sites/default/files/uploads/13-pycairo.png (Pycairo)
+[66]: http://zetcode.com/gfx/pycairo/basicdrawing/
diff --git a/sources/tech/20190318 3 Ways To Check Whether A Port Is Open On The Remote Linux System.md b/sources/tech/20190318 3 Ways To Check Whether A Port Is Open On The Remote Linux System.md
new file mode 100644
index 0000000000..046682ef83
--- /dev/null
+++ b/sources/tech/20190318 3 Ways To Check Whether A Port Is Open On The Remote Linux System.md
@@ -0,0 +1,162 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (3 Ways To Check Whether A Port Is Open On The Remote Linux System?)
+[#]: via: (https://www.2daygeek.com/how-to-check-whether-a-port-is-open-on-the-remote-linux-system-server/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+3 Ways To Check Whether A Port Is Open On The Remote Linux System?
+======
+
+This is an important topic, which is not only for Linux administrator and it will be very helpful for all.
+
+I mean to say. It’s very useful for users who are working in IT Infra.
+
+They have to check whether the port is open or not on Linux server before proceeding to next steps.
+
+If it’s not open then they can directly ask the Linux admin to check on this.
+
+If it’s open then we need to check with application team, etc,.
+
+In this article, we will show you, how to check this using three methods.
+
+It can be done using the following Linux commands.
+
+ * **`nc:`** Netcat is a simple Unix utility which reads and writes data across network connections, using TCP or UDP protocol.
+ * **`nmap:`** Nmap (“Network Mapper”) is an open source tool for network exploration and security auditing. It was designed to rapidly scan large networks.
+ * **`telnet:`** The telnet command is used for interactive communication with another host using the TELNET protocol.
+
+
+
+### How To Check Whether A Port Is Open On The Remote Linux System Using nc (netcat) Command?
+
+nc stands for netcat. Netcat is a simple Unix utility which reads and writes data across network connections, using TCP or UDP protocol.
+
+It is designed to be a reliable “back-end” tool that can be used directly or easily driven by other programs and scripts.
+
+At the same time, it is a feature-rich network debugging and exploration tool, since it can create almost any kind of connection you would need and has several interesting built-in capabilities.
+
+Netcat has three main modes of functionality. These are the connect mode, the listen mode, and the tunnel mode.
+
+**Common Syntax for nc (netcat):**
+
+```
+$ nc [-options] [HostName or IP] [PortNumber]
+```
+
+In this example, we are going to check whether the port 22 is open or not on the remote Linux system.
+
+If it’s success then you will be getting the following output.
+
+```
+# nc -zvw3 192.168.1.8 22
+Connection to 192.168.1.8 22 port [tcp/ssh] succeeded!
+```
+
+**Details:**
+
+ * **`nc:`** It’s a command.
+ * **`z:`** zero-I/O mode (used for scanning).
+ * **`v:`** For verbose.
+ * **`w3:`** timeout wait seconds
+ * **`192.168.1.8:`** Destination system IP.
+ * **`22:`** Port number needs to be verified.
+
+
+
+If it’s fail then you will be getting the following output.
+
+```
+# nc -zvw3 192.168.1.95 22
+nc: connect to 192.168.1.95 port 22 (tcp) failed: Connection refused
+```
+
+### How To Check Whether A Port Is Open On The Remote Linux System Using nmap Command?
+
+Nmap (“Network Mapper”) is an open source tool for network exploration and security auditing. It was designed to rapidly scan large networks, although it works fine against single hosts.
+
+Nmap uses raw IP packets in novel ways to determine what hosts are available on the network, what services (application name and version) those hosts are offering, what operating systems (and OS versions) they are running, what type of packet filters/firewalls are in use, and dozens of other characteristics.
+
+While Nmap is commonly used for security audits, many systems and network administrators find it useful for routine tasks such as network inventory, managing service upgrade schedules, and monitoring host or service uptime.
+
+**Common Syntax for nmap:**
+
+```
+$ nmap [-options] [HostName or IP] [-p] [PortNumber]
+```
+
+If it’s success then you will be getting the following output.
+
+```
+# nmap 192.168.1.8 -p 22
+
+Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-16 03:37 IST Nmap scan report for 192.168.1.8 Host is up (0.00031s latency).
+
+PORT STATE SERVICE
+
+22/tcp open ssh
+
+Nmap done: 1 IP address (1 host up) scanned in 13.06 seconds
+```
+
+If it’s fail then you will be getting the following output.
+
+```
+# nmap 192.168.1.8 -p 80
+Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-16 04:30 IST
+Nmap scan report for 192.168.1.8
+Host is up (0.00036s latency).
+
+PORT STATE SERVICE
+80/tcp closed http
+
+Nmap done: 1 IP address (1 host up) scanned in 13.07 seconds
+```
+
+### How To Check Whether A Port Is Open On The Remote Linux System Using telnet Command?
+
+The telnet command is used for interactive communication with another host using the TELNET protocol.
+
+**Common Syntax for telnet:**
+
+```
+$ telnet [HostName or IP] [PortNumber]
+```
+
+If it’s success then you will be getting the following output.
+
+```
+$ telnet 192.168.1.9 22
+Trying 192.168.1.9...
+Connected to 192.168.1.9.
+Escape character is '^]'.
+SSH-2.0-OpenSSH_5.3
+^]
+Connection closed by foreign host.
+```
+
+If it’s fail then you will be getting the following output.
+
+```
+$ telnet 192.168.1.9 80
+Trying 192.168.1.9...
+telnet: Unable to connect to remote host: Connection refused
+```
+
+We had found only the above three methods. If you found any other ways, please let us know by updating your query in the comments section.
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/how-to-check-whether-a-port-is-open-on-the-remote-linux-system-server/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
diff --git a/sources/tech/20190318 Building and augmenting libraries by calling Rust from JavaScript.md b/sources/tech/20190318 Building and augmenting libraries by calling Rust from JavaScript.md
new file mode 100644
index 0000000000..935f8eded5
--- /dev/null
+++ b/sources/tech/20190318 Building and augmenting libraries by calling Rust from JavaScript.md
@@ -0,0 +1,176 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Building and augmenting libraries by calling Rust from JavaScript)
+[#]: via: (https://opensource.com/article/19/3/calling-rust-javascript)
+[#]: author: (Ryan Levick https://opensource.com/users/ryanlevick)
+
+Building and augmenting libraries by calling Rust from JavaScript
+======
+
+Explore how to use WebAssembly (Wasm) to embed Rust inside JavaScript.
+
+![JavaScript in Vim][1]
+
+In _[Why should you use Rust in WebAssembly?][2]_ , I looked at why you might want to write WebAssembly (Wasm), and why you might choose Rust as the language to do it in. Now I'll share what that looks like by exploring ways to embed Rust inside JavaScript.
+
+This is something that separates Rust from Go, C#, and other languages with large runtimes that can compile to Wasm. Rust has a minimal runtime (basically just an allocator), making it easy to use Rust from JavaScript libraries. C and C++ have similar stories, but what sets Rust apart is its tooling, which we'll take a look at now.
+
+### The basics
+
+If you've never used Rust before, you'll first want to get that set up. It's pretty easy. First download [**Rustup**][3], which is a way to control versions of Rust and different toolchains for cross-compilation. This will give you access to [**Cargo**][4], which is the Rust build tool and package manager.
+
+Now we have a decision to make. We can easily write Rust code that runs in the browser through WebAssembly, but if we want to do anything other than make people's CPU fans spin, we'll probably at some point want to interact with the Document Object Model (DOM) or use some JavaScript API. In other words: _we need JavaScript interop_ (aka the JavaScript interoperability API).
+
+### The problem and the solutions
+
+WebAssembly is an extremely simple machine language. If we want to be able to communicate with JavaScript, Wasm gives us only four data types to do it with: 32- and 64-bit floats and integers. Wasm doesn't have a concept of strings, arrays, objects, or any other rich data type. Basically, we can only pass around pointers between Rust and JavaScript. Needless to say, this is less than ideal.
+
+The good news is there are two libraries that facilitate communication between Rust-based Wasm and JavaScript: [**wasm-bindgen**][5] and [**stdweb**][6]. The bad news, however, is these two libraries are unfortunately incompatible with each other. **wasm-bindgen** is lower-level than **stdweb** and attempts to provide full control over how JavaScript and Rust interact. In fact, there is even talk of [rewriting **stdweb** using **wasm-bindgen**][7], which would get rid of the issue of incompatibility.
+
+Because **wasm-bindgen** is the lighter-weight option (and the option officially worked on by the official [Rust WebAssembly working group][8]), we'll focus at that.
+
+### wasm-bindgen and wasm-pack
+
+We're going to create a function that takes a string from JavaScript, makes it uppercase and prepends "HELLO, " to it, and returns it back to JavaScript. We'll call this function **excited_greeting**!
+
+First, let's create our Rust library that will house this fabulous function:
+
+```
+$ cargo new my-wasm-library --lib
+$ cd my-wasm-library
+```
+
+Now we'll want to replace the contents of **src/lib.rs** with our exciting logic. I think it's best to write the code out instead of copy/pasting.
+
+```
+// Include the `wasm_bindgen` attribute into the current namespace.
+use wasm_bindgen::prelude::wasm_bindgen;
+
+// This attribute makes calling Rust from JavaScript possible.
+// It generates code that can convert the basic types wasm understands
+// (integers and floats) into more complex types like strings and
+// vice versa. If you're interested in how this works, check this out:
+//
+#[wasm_bindgen]
+// This is pretty plain Rust code. If you've written Rust before this
+// should look extremely familiar. If not, why wait?! Check this out:
+//
+pub fn excited_greeting(original: &str) -> String {
+format!("HELLO, {}", original.to_uppercase())
+}
+```
+
+Second, we'll have to make two changes to our **Cargo.toml** configuration file:
+
+ * Add **wasm_bindgen** as a dependency.
+ * Configure the type of library binary to be a **cdylib** or dynamic system library. In this case, our system is **wasm** , and setting this option is how we produce **.wasm** binary files.
+
+
+```
+[package]
+name = "my-wasm-library"
+version = "0.1.0"
+authors = ["$YOUR_INFO"]
+edition = "2018"
+
+[lib]
+crate-type = ["cdylib", "rlib"]
+
+[dependencies]
+wasm-bindgen = "0.2.33"
+```
+
+Now let's build! If we just use **cargo build** , we'll get a **.wasm** binary, but in order to make it easy to call our Rust code from JavaScript, we'd like to have some JavaScript code that converts rich JavaScript types like strings and objects to pointers and passes these pointers to the Wasm module on our behalf. Doing this manually is tedious and prone to bugs.
+
+Luckily, in addition to being a library, **wasm-bindgen** also has the ability to create this "glue" JavaScript for us. This means in our code we can interact with our Wasm module using normal JavaScript types, and the generated code from **wasm-bindgen** will do the dirty work of converting these rich types into the pointer types that Wasm actually understands.
+
+We can use the awesome **wasm-pack** to build our Wasm binary, invoke the **wasm-bindgen** CLI tool, and package all of our JavaScript (and any optional generated TypeScript types) into one nice and neat package. Let's do that now!
+
+First we'll need to install **wasm-pack** :
+
+```
+$ cargo install wasm-pack
+```
+
+By default, **wasm-bindgen** produces ES6 modules. We'll use our code from a simple script tag, so we just want it to produce a plain old JavaScript object that gives us access to our Wasm functions. To do this, we'll pass it the **\--target no-modules** option.
+
+```
+$ wasm-pack build --target no-modules
+```
+
+We now have a **pkg** directory in our project. If we look at the contents, we'll see the following:
+
+ * **package.json** : useful if we want to package this up as an NPM module
+ * **my_wasm_library_bg.wasm** : our actual Wasm code
+ * **my_wasm_library.js** : the JavaScript "glue" code
+ * Some TypeScript definition files
+
+
+
+Now we can create an **index.html** file that will make use of our JavaScript and Wasm:
+
+```
+<[html][9]>
+<[head][10]>
+<[meta][11] content="text/html;charset=utf-8" http-equiv="Content-Type" />
+[head][10]>
+<[body][12]>
+
+<[script][13] src='./pkg/my_wasm_library.js'>[script][13]>
+
+<[script][13]>
+window.addEventListener('load', async () => {
+// Load the wasm file
+await wasm_bindgen('./pkg/my_wasm_library_bg.wasm');
+// Once it's loaded the `wasm_bindgen` object is populated
+// with the functions defined in our Rust code
+const greeting = wasm_bindgen.excited_greeting("Ryan")
+console.log(greeting)
+});
+[script][13]>
+[body][12]>
+[html][9]>
+```
+
+You may be tempted to open the HTML file in your browser, but unfortunately, this is not possible. For security reasons, Wasm files have to be served from the same domain as the HTML file. You'll need an HTTP server. If you have a favorite static HTTP server that can serve files from your filesystem, feel free to use that. I like to use [**basic-http-server**][14], which you can install and run like so:
+
+```
+$ cargo install basic-http-server
+$ basic-http-server
+```
+
+Now open the **index.html** file through the web server by going to **** and check your JavaScript console. You should see a very exciting greeting there!
+
+If you have any questions, please [let me know][15]. Next time, we'll take a look at how we can use various browser and JavaScript APIs from within our Rust code.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/calling-rust-javascript
+
+作者:[Ryan Levick][a]
+选题:[lujun9972][b]
+译者:[译者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/ryanlevick
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/javascript_vim.jpg?itok=mqkAeakO (JavaScript in Vim)
+[2]: https://opensource.com/article/19/2/why-use-rust-webassembly
+[3]: https://rustup.rs/
+[4]: https://doc.rust-lang.org/cargo/
+[5]: https://github.com/rustwasm/wasm-bindgen
+[6]: https://github.com/koute/stdweb
+[7]: https://github.com/koute/stdweb/issues/318
+[8]: https://www.rust-lang.org/governance/wgs/wasm
+[9]: http://december.com/html/4/element/html.html
+[10]: http://december.com/html/4/element/head.html
+[11]: http://december.com/html/4/element/meta.html
+[12]: http://december.com/html/4/element/body.html
+[13]: http://december.com/html/4/element/script.html
+[14]: https://github.com/brson/basic-http-server
+[15]: https://twitter.com/ryan_levick
diff --git a/sources/tech/20190318 Install MEAN.JS Stack In Ubuntu 18.04 LTS.md b/sources/tech/20190318 Install MEAN.JS Stack In Ubuntu 18.04 LTS.md
new file mode 100644
index 0000000000..925326e0d7
--- /dev/null
+++ b/sources/tech/20190318 Install MEAN.JS Stack In Ubuntu 18.04 LTS.md
@@ -0,0 +1,266 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Install MEAN.JS Stack In Ubuntu 18.04 LTS)
+[#]: via: (https://www.ostechnix.com/install-mean-js-stack-ubuntu/)
+[#]: author: (sk https://www.ostechnix.com/author/sk/)
+
+Install MEAN.JS Stack In Ubuntu 18.04 LTS
+======
+
+![Install MEAN.JS Stack][1]
+
+**MEAN.JS** is an Open-Source, full-Stack JavaScript solution for building fast, and robust web applications. **MEAN.JS** stack consists of **MongoDB** (NoSQL database), **ExpressJs** (NodeJS server-side application web framework), **AngularJS** (Client-side web application framework), and **Node.js** (JavaScript run-time, popular for being a web server platform). In this tutorial, we will be discussing how to install MEAN.JS stack in Ubuntu. This guide was tested in Ubuntu 18.04 LTS server. However, it should work on other Ubuntu versions and Ubuntu variants.
+
+### Install MongoDB
+
+**MongoDB** is a free, cross-platform, open source, NoSQL document-oriented database. To install MongoDB on your Ubuntu system, refer the following guide:
+
+ * [**Install MongoDB Community Edition In Linux**][2]
+
+
+
+### Install Node.js
+
+**NodeJS** is an open source, cross-platform, and lightweight JavaScript run-time environment that can be used to build scalable network applications.
+
+To install NodeJS on your system, refer the following guide:
+
+ * [**How To Install NodeJS On Linux**][3]
+
+
+
+After installing, MongoDB, and Node.js, we need to install the other required components such as **Yarn** , **Grunt** , and **Gulp** for MEAN.js stack.
+
+### Install Yarn package manager
+
+Yarn is a package manager used by MEAN.JS stack to manage front-end packages.
+
+To install Bower, run the following command:
+
+```
+$ npm install -g yarn
+```
+
+### Install Grunt Task Runner
+
+Grunt Task Runner is used to to automate the development process.
+
+To install Grunt, run:
+
+```
+$ npm install -g grunt-cli
+```
+
+To verify if Yarn and Grunt have been installed, run:
+
+```
+$ npm list -g --depth=0 /home/sk/.nvm/versions/node/v11.11.0/lib ├── [email protected] ├── [email protected] └── [email protected]
+```
+
+### Install Gulp Task Runner (Optional)
+
+This is optional. You can use Gulp instead of Grunt. To install Gulp Task Runner, run the following command:
+
+```
+$ npm install -g gulp
+```
+
+We have installed all required prerequisites. Now, let us deploy MEAN.JS stack.
+
+### Download and Install MEAN.JS Stack
+
+Install Git if it is not installed already:
+
+```
+$ sudo apt-get install git
+```
+
+Next, git clone the MEAN.JS repository with command:
+
+```
+$ git clone https://github.com/meanjs/mean.git meanjs
+```
+
+**Sample output:**
+
+```
+Cloning into 'meanjs'...
+remote: Counting objects: 8596, done.
+remote: Compressing objects: 100% (12/12), done.
+remote: Total 8596 (delta 3), reused 0 (delta 0), pack-reused 8584 Receiving objects: 100% (8596/8596), 2.62 MiB | 140.00 KiB/s, done.
+Resolving deltas: 100% (4322/4322), done.
+Checking connectivity... done.
+```
+
+The above command will clone the latest version of the MEAN.JS repository to **meanjs** folder in your current working directory.
+
+Go to the meanjs folder:
+
+```
+$ cd meanjs/
+```
+
+Run the following command to install the Node.js dependencies required for testing and running our application:
+
+```
+$ npm install
+```
+
+This will take some time. Please be patient.
+
+* * *
+
+**Troubleshooting:**
+
+When I run the above command in Ubuntu 18.04 LTS, I get the following error:
+
+```
+Downloading binary from https://github.com/sass/node-sass/releases/download/v4.5.3/linux-x64-67_binding.node
+Cannot download "https://github.com/sass/node-sass/releases/download/v4.5.3/linux-x64-67_binding.node":
+
+HTTP error 404 Not Found
+
+[....]
+```
+
+If you ever get these type of common errors like “node-sass and gulp-sass”, do the following:
+
+First uninstall the project and global gulp-sass modules using the following commands:
+
+```
+$ npm uninstall gulp-sass
+$ npm uninstall -g gulp-sass
+```
+
+Next uninstall the global node-sass module:
+
+```
+$ npm uninstall -g node-sass
+```
+
+Install the global node-sass first. Then install the gulp-sass module at the local project level.
+
+```
+$ npm install -g node-sass
+$ npm install gulp-sass
+```
+
+Now try the npm install again from the project folder using command:
+
+```
+$ npm install
+```
+
+Now all dependencies will start to install without any issues.
+
+* * *
+
+Once all dependencies are installed, run the following command to install all the front-end modules needed for the application:
+
+```
+$ yarn --allow-root --config.interactive=false install
+```
+
+Or,
+
+```
+$ yarn --allow-root install
+```
+
+You will see the following message at the end if the installation is successful.
+
+```
+[...]
+> meanjs@0.6.0 snyk-protect /home/sk/meanjs
+> snyk protect
+
+Successfully applied Snyk patches
+
+Done in 99.47s.
+```
+
+### Test MEAN.JS
+
+MEAN.JS stack has been installed. We can now able to start a sample application using command:
+
+```
+$ npm start
+```
+
+After a few seconds, you will see a message like below. This means MEAN.JS stack is working!
+
+```
+[...]
+MEAN.JS - Development Environment
+
+Environment: development
+Server: http://0.0.0.0:3000
+Database: mongodb://localhost/mean-dev
+App version: 0.6.0
+MEAN.JS version: 0.6.0
+```
+
+![][4]
+
+To verify, open up the browser and navigate to **** or ****. You should see a screen something like below.
+
+![][5]
+
+Mean stack test page
+
+Congratulations! MEAN.JS stack is ready to start building web applications.
+
+For further details, I recommend you to refer **[MEAN.JS stack official documentation][6]**.
+
+* * *
+
+Want to setup MEAN.JS stack in CentOS, RHEL, Scientific Linux? Check the following link for more details.
+
+ * **[Install MEAN.JS Stack in CentOS 7][7]**
+
+
+
+* * *
+
+And, that’s all for now, folks. Hope this tutorial will help you to setup MEAN.JS stack.
+
+If you find this tutorial useful, please share it on your social, professional networks and support OSTechNix.
+
+More good stuffs to come. Stay tuned!
+
+Cheers!
+
+**Resources:**
+
+ * **[MEAN.JS website][8]**
+ * [**MEAN.JS GitHub Repository**][9]
+
+
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/install-mean-js-stack-ubuntu/
+
+作者:[sk][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: https://www.ostechnix.com/install-mongodb-linux/
+[3]: https://www.ostechnix.com/install-node-js-linux/
+[4]: http://www.ostechnix.com/wp-content/uploads/2016/03/meanjs.png
+[5]: http://www.ostechnix.com/wp-content/uploads/2016/03/mean-stack-test-page.png
+[6]: http://meanjs.org/docs.html
+[7]: http://www.ostechnix.com/install-mean-js-stack-centos-7/
+[8]: http://meanjs.org/
+[9]: https://github.com/meanjs/mean
diff --git a/sources/tech/20190318 Solus 4 ‘Fortitude- Released with Significant Improvements.md b/sources/tech/20190318 Solus 4 ‘Fortitude- Released with Significant Improvements.md
new file mode 100644
index 0000000000..c7a8d4bc55
--- /dev/null
+++ b/sources/tech/20190318 Solus 4 ‘Fortitude- Released with Significant Improvements.md
@@ -0,0 +1,108 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Solus 4 ‘Fortitude’ Released with Significant Improvements)
+[#]: via: (https://itsfoss.com/solus-4-release)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Solus 4 ‘Fortitude’ Released with Significant Improvements
+======
+
+Finally, after a year of work, the much anticipated Solus 4 is here. It’s a significant release not just because this is a major upgrade, but also because this is the first major release after [Ikey Doherty (the founder of Solus) left the project][1] a few months ago.
+
+Now that everything’s under control with the new _management_ , **Solus 4 Fortitude** with updated Budgie desktop and other significant improvements has officially released.
+
+### What’s New in Solus 4
+
+![Solus 4 Fortitude][2]
+
+#### Core Improvements
+
+Solus 4 comes loaded with **[Linux Kernel 4.20.16][3]** which enables better hardware support (like Touchpad support, improved support for Intel Coffee Lake and Ice Lake CPUs, and for AMD Picasso & Raven2 APUs).
+
+This release also ships with the latest [FFmpeg 4.1.1][4]. Also, they have enabled the support for [dav1d][5] in [VLC][6] – which is an open source AV1 decoder. So, you can consider these upgrades to significantly improve the Multimedia experience.
+
+It also includes some minor fixes to the Software Center – if you were encountering any issues while finding an application or viewing the description.
+
+In addition, WPS Office has been removed from the listing.
+
+#### UI Improvements
+
+![Budgie 10.5][7]
+
+The Budgie desktop update includes some minor changes and also comes baked in with the [Plata (Noir) GTK Theme.][8]
+
+You will no longer observe same applications multiple times in the menu, they’ve fixed this. They have also introduced a “ **Caffeine** ” mode as applet which prevents the system from suspending, locking the screen or changing the brightness while you are working. You can schedule the time accordingly.
+
+![Caffeine Mode][9]
+
+The new Budgie desktop experience also adds quick actions to the app icons on the task bar, dubbed as “ **Icon Tasklist** “. It makes it easy to manage the active tabs on a browser or the actions to minimize and move it to a new workplace (as shown in the image below).
+
+![Icon Tasklist][10]
+
+As the [change log][11] mentions, the above pop over design lets you do more:
+
+ * _Close all instances of the selected application_
+ * _Easily access per-window controls for marking it always on top, maximizing / unmaximizing, minimizing, and moving it to various workspaces._
+ * _Quickly favorite / unfavorite apps_
+ * _Quickly launch a new instance of the selected application_
+ * _Scroll up or down on an IconTasklist button when a single window is open to activate and bring it into focus, or minimize it, based on the scroll direction._
+ * _Toggle to minimize and unminimize various application windows_
+
+
+
+The notification area now groups the notifications from specific applications instead of piling it all up. So, that’s a good improvement.
+
+In addition to these, the sound widget got some cool improvements while letting you personalize the look and feel of your desktop in an efficient manner.
+
+To know about all the nitty-gritty details, do refer the official [release note][11]s.
+
+### Download Solus 4
+
+You can get the latest version of Solus from its download page below. It is available in the default Budgie, GNOME and MATE desktop flavors.
+
+[Get Solus 4][12]
+
+### Wrapping Up**
+
+Solus 4 is definitely an impressive upgrade – without introducing any unnecessary fancy features but by adding only the useful ones, subtle changes.
+
+What do you think about the latest Solus 4 Fortitude? Have you tried it yet?
+
+Let us know your thoughts in the comments below.
+
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/solus-4-release
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/ikey-leaves-solus/
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/solus-4-featured.jpg?fit=800%2C450&ssl=1
+[3]: https://itsfoss.com/kernel-4-20-release/
+[4]: https://www.ffmpeg.org/
+[5]: https://code.videolan.org/videolan/dav1d
+[6]: https://www.videolan.org/index.html
+[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/Budgie-desktop.jpg?resize=800%2C450&ssl=1
+[8]: https://gitlab.com/tista500/plata-theme
+[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/caffeine-mode.jpg?ssl=1
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/IconTasklistPopover.jpg?ssl=1
+[11]: https://getsol.us/2019/03/17/solus-4-released/
+[12]: https://getsol.us/download/
+[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/Budgie-desktop.jpg?fit=800%2C450&ssl=1
+[14]: https://www.facebook.com/sharer.php?t=Solus%204%20%E2%80%98Fortitude%E2%80%99%20Released%20with%20Significant%20Improvements&u=https%3A%2F%2Fitsfoss.com%2Fsolus-4-release%2F
+[15]: https://twitter.com/intent/tweet?text=Solus+4+%E2%80%98Fortitude%E2%80%99+Released+with+Significant+Improvements&url=https%3A%2F%2Fitsfoss.com%2Fsolus-4-release%2F&via=itsfoss2
+[16]: https://www.linkedin.com/shareArticle?title=Solus%204%20%E2%80%98Fortitude%E2%80%99%20Released%20with%20Significant%20Improvements&url=https%3A%2F%2Fitsfoss.com%2Fsolus-4-release%2F&mini=true
+[17]: https://www.reddit.com/submit?title=Solus%204%20%E2%80%98Fortitude%E2%80%99%20Released%20with%20Significant%20Improvements&url=https%3A%2F%2Fitsfoss.com%2Fsolus-4-release%2F
diff --git a/sources/tech/20190319 Blockchain 2.0- Blockchain In Real Estate -Part 4.md b/sources/tech/20190319 Blockchain 2.0- Blockchain In Real Estate -Part 4.md
new file mode 100644
index 0000000000..9e85b82f2c
--- /dev/null
+++ b/sources/tech/20190319 Blockchain 2.0- Blockchain In Real Estate -Part 4.md
@@ -0,0 +1,50 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Blockchain 2.0: Blockchain In Real Estate [Part 4])
+[#]: via: (https://www.ostechnix.com/blockchain-2-0-blockchain-in-real-estate/)
+[#]: author: (EDITOR https://www.ostechnix.com/author/editor/)
+
+Blockchain 2.0: Blockchain In Real Estate [Part 4]
+======
+
+
+
+### Blockchain 2.0: Smart‘er’ Real Estate
+
+The [**previous article**][1] of this series explored the features of blockchain which will enable institutions to transform and interlace **traditional banking** and **financing systems** with it. This part will explore – **Blockchain in real estate**. The real estate industry is ripe for a revolution. It’s among the most actively traded most significant asset classes known to man. However, filled with regulatory hurdles and numerous possibilities of fraud and deceit, it’s also one of the toughest to participate in. The distributed ledger capabilities of the blockchain utilizing an appropriate consensus algorithm are touted as the way forward for the industry which is traditionally regarded as conservative in its attitude to change.
+
+Real estate has always been a very conservative industry in terms of its myriad operations. Somewhat rightfully so as well. A major economic crisis such as the 2008 financial crisis or the great depression from the early half of the 20th century managed to destroy the industry and its participants. However, like most products of economic value, the real estate industry is resilient and this resilience is rooted in its conservative nature.
+
+The global real estate market comprises an asset class worth **$228 trillion dollars** [1]. Give or take. Other investment assets such as stocks, bonds, and shares combined are only worth **$170 trillion**. Obviously, any and all transactions implemented in such an industry is naturally carefully planned and meticulously executed, for the most part. For the most part, because real estate is also notorious for numerous instances of fraud and devastating loses which ensue them. The industry because of the very conservative nature of its operations is also tough to navigate. It’s heavily regulated with complex laws creating an intertwined web of nuances that are just too difficult for an average person to understand fully. This makes entry and participation near impossible for most people. If you’ve ever been involved in one such deal, you’ll know how heavy and long the paper trail was.
+
+This hard reality is now set to change, albeit a slow and gradual transformation. The very reasons the industry has stuck to its hardy tested roots all this while can finally give way to its modern-day counterpart. The backbone of the real estate industry has always been its paper records. Land deeds, titles, agreements, rental insurance, proofs, and declarations etc., are just the tip of the iceberg here. If you’ve noticed the pattern here, this should be obvious, the distributed ledger technology that is blockchain, fits in perfectly with the needs here. Forget paper records, conventional database systems are also points of major failure. They can be modified by multiple participants, is not tamper proof or un-hackable, has a complicated set of ever-changing regulatory parameters making auditing and verifying data a nightmare. The blockchain perfectly solves all of these issues and more.
+
+Starting with a trivial albeit an important example to show just how bad the current record management practices are in the real estate sector, consider the **Title Insurance business** [2], [3]. Title Insurance is used to hedge against the possibility of the land’s titles and ownership records being inadmissible and hence unenforceable. An insurance product such as this is also referred to as an indemnity cover. It is by law required in many cases that properties have title insurance, especially when dealing with property that has changed hands multiple times over the years. Mortgage firms might insist on the same as well when they back real estate deals. The fact that a product of this kind has existed since the 1850s and that it does business worth at least **$1.5 trillion a year in the US alone** is a testament to the statement at the start. A revolution in terms of how these records are maintained is imperative to have in this situation and the blockchain provides a sustainable solution. Title fraud averages around $100k per case on average as per the **American Land Title Association** and 25% of all titles involved in transactions have an issue regarding their documents[4]. The blockchain allows for setting up an immutable permanent database that will track the property itself, recording each and every transaction or investment that has gone into it. Such a ledger system will make life easier for everyone involved in the real estate industry including one-time home buyers and make financial products such as Title Insurance basically irrelevant. Converting a physical asset such as real estate to a digital asset like this is unconventional and is extant only in theory at the moment. However, such a change is imminent sooner rather than later[5].
+
+Among the areas in which blockchain will have the most impact within real estate is as highlighted above in maintaining a transparent and secure title management system for properties. A blockchain based record of the property can contain information about the property, its location, history of ownership, and any related public record of the same[6]. This will permit closing real estate deals fast and obliviates the need for 3rd party monitoring and oversight. Tasks such as real estate appraisal and tax calculations become matters of tangible objective parameters rather than subjective measures and guesses because of reliable historical data which is publicly verifiable. **UBITQUITY** is one such platform that offers customized blockchain-based solutions to enterprise customers. The platform allows customers to keep track of all property details, payment records, mortgage records and even allows running smart contracts that’ll take care of taxation and leasing automatically[7].
+
+This brings us to the second biggest opportunity and use case of blockchains in real estate. Since the sector is highly regulated by numerous 3rd parties apart from the counterparties involved in the trade, due-diligence and financial evaluations can be significantly time-consuming. These processes are predominantly carried out using offline channels and paperwork needs to travel for days before a final evaluation report comes out. This is especially true for corporate real estate deals and forms a bulk of the total billable hours charged by consultants. In case the transaction is backed by a mortgage, duplication of these processes is unavoidable. Once combined with digital identities for the people and institutions involved along with the property, the current inefficiencies can be avoided altogether and transactions can take place in a matter of seconds. The tenants, investors, institutions involved, consultants etc., could individually validate the data and arrive at a critical consensus thereby validating the property records for perpetuity[8]. This increases the accuracy of verification manifold. Real estate giant **RE/MAX** has recently announced a partnership with service provider **XYO Network Partners** for building a national database of real estate listings in Mexico. They hope to one day create one of the largest (as of yet) decentralized real estate title registry in the world[9].
+
+However, another significant and arguably a very democratic change that the blockchain can bring about is with respect to investing in real estate. Unlike other investment asset classes where even small household investors can potentially participate, real estate often requires large hands-down payments to participate. Companies such as **ATLANT** and **BitOfProperty** tokenize the book value of a property and convert them into equivalents of a cryptocurrency. These tokens are then put for sale on their exchanges similar to how stocks and shares are traded. Any cash flow that the real estate property generates afterward is credited or debited to the token owners depending on their “share” in the property[4].
+
+However, even with all of that said, Blockchain technology is still in very early stages of adoption in the real estate sector and current regulations are not exactly defined for it to be either[8]. Concepts such as distributed applications, distributed anonymous organizations, smart contracts etc., are unheard of in the legal domain in many countries. A complete overhaul of existing regulations and guidelines once all the stakeholders are well educated on the intricacies of the blockchain is the most pragmatic way forward. Again, it’ll be a slow and gradual change to go through, however a much-needed one nonetheless. The next article of the series will look at how **“Smart Contracts”** , such as those implemented by companies such as UBITQUITY and XYO are created and executed in the blockchain.
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/blockchain-2-0-blockchain-in-real-estate/
+
+作者:[EDITOR][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/editor/
+[b]: https://github.com/lujun9972
+[1]: https://www.ostechnix.com/blockchain-2-0-redefining-financial-services/
diff --git a/sources/tech/20190319 Five Commands To Use Calculator In Linux Command Line.md b/sources/tech/20190319 Five Commands To Use Calculator In Linux Command Line.md
new file mode 100644
index 0000000000..c419d15268
--- /dev/null
+++ b/sources/tech/20190319 Five Commands To Use Calculator In Linux Command Line.md
@@ -0,0 +1,342 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Five Commands To Use Calculator In Linux Command Line?)
+[#]: via: (https://www.2daygeek.com/linux-command-line-calculator-bc-calc-qalc-gcalccmd/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+Five Commands To Use Calculator In Linux Command Line?
+======
+
+As a Linux administrator you may use the command line calculator many times in a day for some purpose.
+
+I had used this especially when LVM creation using the PE values.
+
+There are many commands available for this purpose and i’m going to list most used commands in this article.
+
+These command line calculators are allow us to perform all kind of actions such as scientific, financial, or even simple calculation.
+
+Also, we can use these commands in shell scripts for complex math.
+
+In this article, I’m listing the top five command line calculator commands.
+
+Those command line calculator commands are below.
+
+ * **`bc:`** An arbitrary precision calculator language
+ * **`calc:`** arbitrary precision calculator
+ * **`expr:`** evaluate expressions
+ * **`gcalccmd:`** gnome-calculator – a desktop calculator
+ * **`qalc:`**
+ * **`Linux Shell:`**
+
+
+
+### How To Perform Calculation In Linux Using bc Command?
+
+bs stands for Basic Calculator. bc is a language that supports arbitrary precision numbers with interactive execution of statements. There are some similarities in the syntax to the C programming language.
+
+A standard math library is available by command line option. If requested, the math library is defined before processing any files. bc starts by processing code from all the files listed on the command line in the order listed.
+
+After all files have been processed, bc reads from the standard input. All code is executed as it is read.
+
+By default bc command has installed in all the Linux system. If not, use the following procedure to install it.
+
+For **`Fedora`** system, use **[DNF Command][1]** to install bc.
+
+```
+$ sudo dnf install bc
+```
+
+For **`Debian/Ubuntu`** systems, use **[APT-GET Command][2]** or **[APT Command][3]** to install bc.
+
+```
+$ sudo apt install bc
+```
+
+For **`Arch Linux`** based systems, use **[Pacman Command][4]** to install bc.
+
+```
+$ sudo pacman -S bc
+```
+
+For **`RHEL/CentOS`** systems, use **[YUM Command][5]** to install bc.
+
+```
+$ sudo yum install bc
+```
+
+For **`openSUSE Leap`** system, use **[Zypper Command][6]** to install bc.
+
+```
+$ sudo zypper install bc
+```
+
+### How To Use The bc Command To Perform Calculation In Linux?
+
+We can use the bc command to perform all kind of calculation right from the terminal.
+
+```
+$ bc
+bc 1.07.1
+Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
+This is free software with ABSOLUTELY NO WARRANTY.
+For details type `warranty'.
+
+1+2
+3
+
+10-5
+5
+
+2*5
+10
+
+10/2
+5
+
+(2+4)*5-5
+25
+
+quit
+```
+
+Use `-l` flag to define the standard math library.
+
+```
+$ bc -l
+bc 1.07.1
+Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
+This is free software with ABSOLUTELY NO WARRANTY.
+For details type `warranty'.
+
+3/5
+.60000000000000000000
+
+quit
+```
+
+### How To Perform Calculation In Linux Using calc Command?
+
+calc is an arbitrary precision calculator. It’s a simple calculator that allow us to perform all kind of calculation in Linux command line.
+
+For **`Fedora`** system, use **[DNF Command][1]** to install calc.
+
+```
+$ sudo dnf install calc
+```
+
+For **`Debian/Ubuntu`** systems, use **[APT-GET Command][2]** or **[APT Command][3]** to install calc.
+
+```
+$ sudo apt install calc
+```
+
+For **`Arch Linux`** based systems, use **[Pacman Command][4]** to install calc.
+
+```
+$ sudo pacman -S calc
+```
+
+For **`RHEL/CentOS`** systems, use **[YUM Command][5]** to install calc.
+
+```
+$ sudo yum install calc
+```
+
+For **`openSUSE Leap`** system, use **[Zypper Command][6]** to install calc.
+
+```
+$ sudo zypper install calc
+```
+
+### How To Use The calc Command To Perform Calculation In Linux?
+
+We can use the calc command to perform all kind of calculation right from the terminal.
+
+Intractive mode
+
+```
+$ calc
+C-style arbitrary precision calculator (version 2.12.7.1)
+Calc is open software. For license details type: help copyright
+[Type "exit" to exit, or "help" for help.]
+
+; 5+1
+ 6
+; 5-1
+ 4
+; 5*2
+ 10
+; 10/2
+ 5
+; quit
+```
+
+Non-Intractive mode
+
+```
+$ calc 3/5
+ 0.6
+```
+
+### How To Perform Calculation In Linux Using expr Command?
+
+Print the value of EXPRESSION to standard output. A blank line below separates increasing precedence groups. It’s part of coreutils so, we no need to install it.
+
+### How To Use The expr Command To Perform Calculation In Linux?
+
+Use the following format for basic calculations.
+
+For addition
+
+```
+$ expr 5 + 1
+6
+```
+
+For subtraction
+
+```
+$ expr 5 - 1
+4
+```
+
+For division.
+
+```
+$ expr 10 / 2
+5
+```
+
+### How To Perform Calculation In Linux Using gcalccmd Command?
+
+gnome-calculator is the official calculator of the GNOME desktop environment. gcalccmd is the console version of Gnome Calculator utility. By default it has installed in the GNOME desktop.
+
+### How To Use The gcalccmd Command To Perform Calculation In Linux?
+
+I have added few examples on this.
+
+```
+$ gcalccmd
+
+> 5+1
+6
+
+> 5-1
+4
+
+> 5*2
+10
+
+> 10/2
+5
+
+> sqrt(16)
+4
+
+> 3/5
+0.6
+
+> quit
+```
+
+### How To Perform Calculation In Linux Using qalc Command?
+
+Qalculate is a multi-purpose cross-platform desktop calculator. It is simple to use but provides power and versatility normally reserved for complicated math packages, as well as useful tools for everyday needs (such as currency conversion and percent calculation).
+
+Features include a large library of customizable functions, unit calculations and conversion, symbolic calculations (including integrals and equations), arbitrary precision, uncertainty propagation, interval arithmetic, plotting, and a user-friendly interface (GTK+ and CLI).
+
+For **`Fedora`** system, use **[DNF Command][1]** to install qalc.
+
+```
+$ sudo dnf install libqalculate
+```
+
+For **`Debian/Ubuntu`** systems, use **[APT-GET Command][2]** or **[APT Command][3]** to install qalc.
+
+```
+$ sudo apt install libqalculate
+```
+
+For **`Arch Linux`** based systems, use **[Pacman Command][4]** to install qalc.
+
+```
+$ sudo pacman -S libqalculate
+```
+
+For **`RHEL/CentOS`** systems, use **[YUM Command][5]** to install qalc.
+
+```
+$ sudo yum install libqalculate
+```
+
+For **`openSUSE Leap`** system, use **[Zypper Command][6]** to install qalc.
+
+```
+$ sudo zypper install libqalculate
+```
+
+### How To Use The qalc Command To Perform Calculation In Linux?
+
+I have added few examples on this.
+
+```
+$ qalc
+> 5+1
+
+ 5 + 1 = 6
+
+> ans*2
+
+ ans * 2 = 12
+
+> ans-2
+
+ ans - 2 = 10
+
+> 1 USD to INR
+It has been 36 day(s) since the exchange rates last were updated.
+Do you wish to update the exchange rates now? y
+
+ error: Failed to download exchange rates from coinbase.com: Resolving timed out after 15000 milliseconds.
+ 1 * dollar = approx. INR 69.638581
+
+> 10 USD to INR
+
+ 10 * dollar = approx. INR 696.38581
+
+> quit
+```
+
+### How To Perform Calculation In Linux Using Linux Shell Command?
+
+We can use the shell commands such as echo, awk, etc to perform the calculation.
+
+For Addition using echo command.
+
+```
+$ echo $((5+5))
+10
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-command-line-calculator-bc-calc-qalc-gcalccmd/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
+[2]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
+[3]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
+[4]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
+[5]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
+[6]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
diff --git a/sources/tech/20190319 How To Set Up a Firewall with GUFW on Linux.md b/sources/tech/20190319 How To Set Up a Firewall with GUFW on Linux.md
new file mode 100644
index 0000000000..26b9850109
--- /dev/null
+++ b/sources/tech/20190319 How To Set Up a Firewall with GUFW on Linux.md
@@ -0,0 +1,365 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How To Set Up a Firewall with GUFW on Linux)
+[#]: via: (https://itsfoss.com/set-up-firewall-gufw)
+[#]: author: (Sergiu https://itsfoss.com/author/sergiu/)
+
+How To Set Up a Firewall with GUFW on Linux
+======
+
+**UFW (Uncomplicated Firewall)** is a simple to use firewall utility with plenty of options for most users. It is an interface for the **iptables** , which is the classic (and harder to get comfortable with) way to set up rules for your network.
+
+**Do you really need a firewall for desktop?**
+
+![][1]
+
+A **[firewall][2]** is a way to regulate the incoming and outgoing traffic on your network. A well-configured firewall is crucial for the security of servers.
+
+But what about normal, desktop users? Do you need a firewall on your Linux system? Most likely you are connected to internet via a router linked to your internet service provider (ISP). Some routers already have built-in firewall. On top of that, your actual system is hidden behind NAT. In other words, you probably have a security layer when you are on your home network.
+
+Now that you know you should be using a firewall on your system, let’s see how you can easily install and configure a firewall on Ubuntu or any other Linux distribution.
+
+### Setting Up A Firewall With GUFW
+
+**[GUFW][3]** is a graphical utility for managing [Uncomplicated Firewall][4] ( **UFW** ). In this guide, I’ll go over configuring a firewall using **GUFW** that suits your needs, going over the different modes and rules.
+
+But first, let’s see how to install GUFW.
+
+#### Installing GUFW on Ubuntu and other Linux
+
+GUFW is available in all major Linux distributions. I advise using your distribution’s package manager for installing GUFW.
+
+If you are using Ubuntu, make sure you have the Universe Repository enabled. To do that, open up a terminal (default hotkey**:** CTRL+ALT+T) and enter:
+
+```
+sudo add-apt-repository universe
+sudo apt update -y
+```
+
+Now you can install GUFW with this command:
+
+```
+sudo apt install gufw -y
+```
+
+That’s it! If you prefer not touching the terminal, you can install it from the Software Center as well.
+
+Open Software Center and search for **gufw** and click on the search result.
+
+![Search for gufw in software center][5]
+
+Go ahead and click **Install**.
+
+![Install GUFW from the Software Center][6]
+
+To open **gufw** , go to your menu and search for it.
+
+![Start GUFW][7]
+
+This will open the firewall application and you’ll be greeted by a “ **Getting Started** ” section.
+
+![GUFW Interface and Welcome Screen][8]
+
+#### Turn on the firewall
+
+The first thing to notice about this menu is the **Status** toggle. Pressing this button will turn on/off the firewall ( **default:** off), applying your preferences (policies and rules).
+
+![Turn on the firewall][9]
+
+If turned on, the shield icon turn from grey to colored. The colors, as noted later in this article, reflect your policies. This will also make the firewall **automatically start** on system startup.
+
+**Note:** _**Home** will be turned **off** by default. The other profiles (see next section) will be turned **on.**_
+
+#### Understanding GUFW and its profiles
+
+As you can see in the menu, you can select different **profiles**. Each profile comes with different **default policies**. What this means is that they offer different behaviors for incoming and outgoing traffic.
+
+The **default profiles** are:
+
+ * Home
+ * Public
+ * Office
+
+
+
+You can select another profile by clicking on the current one ( **default: Home** ).
+
+![][10]
+
+Selecting one of them will modify the default behavior. Further down, you can change Incoming and Outgoing traffic preferences.
+
+By default, both in **Home** and in **Office** , these policies are **Deny Incoming** and **Allow Outgoing**. This enables you to use services such as http/https without letting anything get in ( **e.g.** ssh).
+
+For **Public** , they are **Reject Incoming** and **Allow Outgoing**. **Reject** , similar to **deny** , doesn’t let services in, but also sends feedback to the user/service that tried accessing your machine (instead of simply dropping/hanging the connection).
+
+Note
+
+If you are an average desktop user, you can stick with the default profiles. You’ll have to manually change the profiles if you change the network.
+
+So if you are travelling, set the firewall on public profile and the from here forwards, firewall will be set in public mode on each reboot.
+
+#### Configuring firewall rules and policies [for advanced users]
+
+All profiles use the same rules, only the policies the rules build upon will differ. Changing the behavior of a policy ( **Incoming/Outgoing** ) will apply the changes to the selected profile.
+
+Note that the policies can only be changed while the firewall is active (Status: ON).
+
+Profiles can easily be added, deleted and renamed from the **Preferences** menu.
+
+##### Preferences
+
+In the top bar, click on **Edit**. Select **Preferences**.
+
+![Open Preferences Menu in GUFW][11]
+
+This will open up the **Preferences** menu.
+
+![][12]
+
+Let’s go over the options you have here!
+
+**Logging** means exactly what you would think: how much information does the firewall write down in the log files.
+
+The options under **Gufw** are quite self-explanatory.
+
+In the section under **Profiles** is where we can add, delete and rename profiles. Double-clicking on a profile will allow you to **rename** it. Pressing **Enter** will complete this process and pressing **Esc** will cancel the rename.
+
+![][13]
+
+To **add** a new profile, click on the **+** under the list of profiles. This will add a new profile. However, it won’t notify you about it. You’ll also have to scroll down the list to see the profile you created (using the mouse wheel or the scroll bar on the right side of the list).
+
+**Note:** _The newly added profile will **Deny Incoming** and **Allow Outgoing** traffic._
+
+![][14]
+
+Clicking a profile highlight that profile. Pressing the **–** button will **delete** the highlighted profile.
+
+![][15]
+
+**Note:** _You can’t rename/remove the currently selected profile_.
+
+You can now click on **Close**. Next, I’ll go into setting up different **rules**.
+
+##### Rules
+
+Back to the main menu, somewhere in the middle of the screen you can select different tabs ( **Home, Rules, Report, Logs)**. We already covered the **Home** tab (that’s the quick guide you see when you start the app).
+
+![][16]
+
+Go ahead and select **Rules**.
+
+![][17]
+
+This will be the bulk of your firewall configuration: networking rules. You need to understand the concepts UFW is based on. That is **allowing, denying, rejecting** and **limiting** traffic.
+
+**Note:** _In UFW, the rules apply from top to bottom (the top rules take effect first and on top of them are added the following ones)._
+
+**Allow, Deny, Reject, Limit:**These are the available policies for the rules you’ll add to your firewall.
+
+Let’s see exactly what each of them means:
+
+ * **Allow:** allows any entry traffic to a port
+ * **Deny:** denies any entry traffic to a port
+ * **Reject:** denies any entry traffic to a port and informs the requester about the rejection
+ * **Limit:** denies entry traffic if an IP address has attempted to initiate 6 or more connections in the last 30 seconds
+
+
+
+##### Adding Rules
+
+There are three ways to add rules in GUFW. I’ll present all three methods in the following section.
+
+**Note:** _After you added the rules, changing their order is a very tricky process and it’s easier to just delete them and add them in the right order._
+
+But first, click on the **+** at the bottom of the **Rules** tab.
+
+![][18]
+
+This should open a pop-up menu ( **Add a Firewall Rule** ).
+
+![][19]
+
+At the top of this menu, you can see the three ways you can add rules. I’ll guide you through each method i.e. **Preconfigured, Simple, Advanced**. Click to expand each section.
+
+**Preconfigured Rules**
+
+This is the most beginner-friendly way to add rules.
+
+The first step is choosing a policy for the rule (from the ones detailed above).
+
+![][20]
+
+The next step is to choose the direction the rule will affect ( **Incoming, Outgoing, Both** ).
+
+![][21]
+
+The **Category** and **Subcategory** choices are plenty. These narrow down the **Applications** you can select
+
+Choosing an **Application** will set up a set of ports based on what is needed for that particular application. This is especially useful for apps that might operate on multiple ports, or if you don’t want to bother with manually creating rules for handwritten port numbers.
+
+If you wish to further customize the rule, you can click on the **orange arrow icon**. This will copy the current settings (Application with it’s ports etc.) and take you to the **Advanced** rule menu. I’ll cover that later in this article.
+
+For this example, I picked an **Office Database** app: **MySQL**. I’ll deny all incoming traffic to the ports used by this app.
+To create the rule, click on **Add**.
+
+![][22]
+
+You can now **Close** the pop-up (if you don’t want to add any other rules). You can see that the rule has been successfully added.
+
+![][23]
+
+The ports have been added by GUFW, and the rules have been automatically numbered. You may wonder why are there two new rules instead of just one; the answer is that UFW automatically adds both a standard **IP** rule and an **IPv6** rule.
+
+**Simple Rules**
+
+Although setting up preconfigured rules is nice, there is another easy way to add a rule. Click on the **+** icon again and go to the **Simple** tab.
+
+![][24]
+
+The options here are straight forward. Enter a name for your rule and select the policy and the direction. I’ll add a rule for rejecting incoming SSH attempts.
+
+![][25]
+
+The **Protocols** you can choose are **TCP, UDP** or **Both**.
+
+You must now enter the **Port** for which you want to manage the traffic. You can enter a **port number** (e.g. 22 for ssh), a **port range** with inclusive ends separated by a **:** ( **colon** ) (e.g. 81:89) or a **service name** (e.g. ssh). I’ll use **ssh** and select **both TCP and UDP** for this example. As before, click on **Add** to completing the creation of your rule. You can click the **red arrow icon** to copy the settings to the **Advanced** rule creation menu.
+
+![][26]
+
+If you select **Close** , you can see that the new rule (along with the corresponding IPv6 rule) has been added.
+
+![][27]
+
+**Advanced Rules**
+
+I’ll now go into how to set up more advanced rules, to handle traffic from specific IP addresses and subnets and targeting different interfaces.
+
+Let’s open up the **Rules** menu again. Select the **Advanced** tab.
+
+![][28]
+
+By now, you should already be familiar with the basic options: **Name, Policy, Direction, Protocol, Port**. These are the same as before.
+
+![][29]
+
+**Note:** _You can choose both a receiving port and a requesting port._
+
+What changes is that now you have additional options to further specialize our rules.
+
+I mentioned before that rules are automatically numbered by GUFW. With **Advanced** rules you specify the position of your rule by entering a number in the **Insert** option.
+
+**Note:** _Inputting **position 0** will add your rule after all existing rules._
+
+**Interface** let’s you select any network interface available on your machine. By doing so, the rule will only have effect on traffic to and from that specific interface.
+
+**Log** changes exactly that: what will and what won’t be logged.
+
+You can also choose IPs for the requesting and for the receiving port/service ( **From** , **To** ).
+
+All you have to do is specify an **IP address** (e.g. 192.168.0.102) or an entire **subnet** (e.g. 192.168.0.0/24 for IPv4 addresses ranging from 192.168.0.0 to 192.168.0.255).
+
+In my example, I’ll set up a rule to allow all incoming TCP SSH requests from systems on my subnet to a specific network interface of the machine I’m currently running. I’ll add the rule after all my standard IP rules, so that it takes effect on top of the other rules I have set up.
+
+![][30]
+
+**Close** the menu.
+
+![][31]
+
+The rule has been successfully added after the other standard IP rules.
+
+##### Edit Rules
+
+Clicking a rule in the rules list will highlight it. Now, if you click on the **little cog icon** at the bottom, you can **edit** the highlighted rule.
+
+![][32]
+
+This will open up a menu looking something like the **Advanced** menu I explained in the last section.
+
+![][33]
+
+**Note:** _Editing any options of a rule will move it to the end of your list._
+
+You can now ether select on **Apply** to modify your rule and move it to the end of the list, or hit **Cancel**.
+
+##### Delete Rules
+
+After selecting (highlighting) a rule, you can also click on the **–** icon.
+
+![][34]
+
+##### Reports
+
+Select the **Report** tab. Here you can see services that are currently running (along with information about them, such as Protocol, Port, Address and Application name). From here, you can **Pause Listening Report (Pause Icon)** or **Create a rule from a highlighted service from the listening report (+ Icon)**.
+
+![][35]
+
+##### Logs
+
+Select the **Logs** tab. Here is where you’ll have to check for any errors are suspicious rules. I’ve tried creating some invalid rules to show you what these might look like when you don’t know why you can’t add a certain rule. In the bottom section, there are two icons. Clicking the **first icon copies the logs** to your clipboard and clicking the **second icon** **clears the log**.
+
+![][36]
+
+### Wrapping Up
+
+Having a firewall that is properly configured can greatly contribute to your Ubuntu experience, making your machine safer to use and allowing you to have full control over incoming and outgoing traffic.
+
+I have covered the different uses and modes of **GUFW** , going into how to set up different rules and configure a firewall to your needs. I hope that this guide has been helpful to you.
+
+If you are a beginner, this should prove to be a comprehensive guide; even if you are more versed in the Linux world and maybe getting your feet wet into servers and networking, I hope you learned something new.
+
+Let us know in the comments if this article helped you and why did you decide a firewall would improve your system!
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/set-up-firewall-gufw
+
+作者:[Sergiu][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/sergiu/
+[b]: https://github.com/lujun9972
+[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/firewall-linux.png?resize=800%2C450&ssl=1
+[2]: https://en.wikipedia.org/wiki/Firewall_(computing)
+[3]: http://gufw.org/
+[4]: https://en.wikipedia.org/wiki/Uncomplicated_Firewall
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/ubuntu_software_gufw-1.jpg?ssl=1
+[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/ubuntu_software_install_gufw.jpg?ssl=1
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/show_applications_gufw.jpg?ssl=1
+[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw.jpg?ssl=1
+[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_toggle_status.jpg?ssl=1
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_select_profile-1.jpg?ssl=1
+[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_open_preferences.jpg?ssl=1
+[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_preferences.png?fit=800%2C585&ssl=1
+[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_rename_profile.png?fit=800%2C551&ssl=1
+[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_profile.png?ssl=1
+[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_delete_profile.png?ssl=1
+[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_home_tab.png?ssl=1
+[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_rules_tab.png?ssl=1
+[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_rule.png?ssl=1
+[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_rules_menu.png?ssl=1
+[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_preconfigured_rule_policy.png?ssl=1
+[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_preconfigured_rule_direction.png?ssl=1
+[22]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_preconfigured_add_rule.png?ssl=1
+[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_preconfigured_rule_added.png?ssl=1
+[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_simple_rules_menu.png?ssl=1
+[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_simple_rule_name_policy_direction.png?ssl=1
+[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_simple_rule.png?ssl=1
+[27]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_simple_rule_added.png?ssl=1
+[28]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_advanced_rules_menu.png?ssl=1
+[29]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_advanced_rule_basic_options.png?ssl=1
+[30]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_add_advanced_rule.png?ssl=1
+[31]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_advanced_rule_added.png?ssl=1
+[32]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_edit_highlighted_rule.png?ssl=1
+[33]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_edit_rule_menu.png?ssl=1
+[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_delete_rule.png?ssl=1
+[35]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_report_tab.png?ssl=1
+[36]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/gufw_log_tab-1.png?ssl=1
+[37]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/firewall-linux.png?fit=800%2C450&ssl=1
diff --git a/sources/tech/20190319 How to set up a homelab from hardware to firewall.md b/sources/tech/20190319 How to set up a homelab from hardware to firewall.md
new file mode 100644
index 0000000000..28a50d8a43
--- /dev/null
+++ b/sources/tech/20190319 How to set up a homelab from hardware to firewall.md
@@ -0,0 +1,107 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to set up a homelab from hardware to firewall)
+[#]: via: (https://opensource.com/article/19/3/home-lab)
+[#]: author: (Michael Zamot (Red Hat) https://opensource.com/users/mzamot)
+
+How to set up a homelab from hardware to firewall
+======
+
+Take a look at hardware and software options for building your own homelab.
+
+![][1]
+
+Do you want to create a homelab? Maybe you want to experiment with different technologies, create development environments, or have your own private cloud. There are many reasons to have a homelab, and this guide aims to make it easier to get started.
+
+There are three categories to consider when planning a home lab: hardware, software, and maintenance. We'll look at the first two categories here and save maintaining your computer lab for a future article.
+
+### Hardware
+
+When thinking about your hardware needs, first consider how you plan to use your lab as well as your budget, noise, space, and power usage.
+
+If buying new hardware is too expensive, search local universities, ads, and websites like eBay or Craigslist for recycled servers. They are usually inexpensive, and server-grade hardware is built to last many years. You'll need three types of hardware: a virtualization server, storage, and a router/firewall.
+
+#### Virtualization servers
+
+A virtualization server allows you to run several virtual machines that share the physical box's resources while maximizing and isolating resources. If you break one virtual machine, you won't have to rebuild the entire server, just the virtual one. If you want to do a test or try something without the risk of breaking your entire system, just spin up a new virtual machine and you're ready to go.
+
+The two most important factors to consider in a virtualization server are the number and speed of its CPU cores and its memory. If there are not enough resources to share among all the virtual machines, they'll be overallocated and try to steal each other's CPU cycles and memory.
+
+So, consider a CPU platform with multiple cores. You want to ensure the CPU supports virtualization instructions (VT-x for Intel and AMD-V for AMD). Examples of good consumer-grade processors that can handle virtualization are Intel i5 or i7 and AMD Ryzen. If you are considering server-grade hardware, the Xeon class for Intel and EPYC for AMD are good options. Memory can be expensive, especially the latest DDR4 SDRAM. When estimating memory requirements, factor at least 2GB for the host operating system's memory consumption.
+
+If your electricity bill or noise is a concern, solutions like Intel's NUC devices provide a small form factor, low power usage, and reduced noise, but at the expense of expandability.
+
+#### Network-attached storage (NAS)
+
+If you want a machine loaded with hard drives to store all your personal data, movies, pictures, etc. and provide storage for the virtualization server, network-attached storage (NAS) is what you want.
+
+In most cases, you won't need a powerful CPU; in fact, many commercial NAS solutions use low-powered ARM CPUs. A motherboard that supports multiple SATA disks is a must. If your motherboard doesn't have enough ports, use a host bus adapter (HBA) SAS controller to add extras.
+
+Network performance is critical for a NAS, so select a gigabit network interface (or better).
+
+Memory requirements will differ based on your filesystem. ZFS is one of the most popular filesystems for NAS, and you'll need more memory to use features such as caching or deduplication. Error-correcting code (ECC) memory is your best bet to protect data from corruption (but make sure your motherboard supports it before you buy). Last, but not least, don't forget an uninterruptible power supply (UPS), because losing power can cause data corruption.
+
+#### Firewall and router
+
+Have you ever realized that a cheap router/firewall is usually the main thing protecting your home network from the exterior world? These routers rarely receive timely security updates, if they receive any at all. Scared now? Well, [you should be][2]!
+
+You usually don't need a powerful CPU or a great deal of memory to build your own router/firewall, unless you are handling a huge throughput or want to do CPU-intensive tasks, like a VPN server or traffic filtering. In such cases, you'll need a multicore CPU with AES-NI support.
+
+You may want to get at least two 1-gigabit or better Ethernet network interface cards (NICs), also, not needed, but recommended, a managed switch to connect your DIY-router to create VLANs to further isolate and secure your network.
+
+![Home computer lab PfSense][4]
+
+### Software
+
+After you've selected your virtualization server, NAS, and firewall/router, the next step is exploring the different operating systems and software to maximize their benefits. While you could use a regular Linux distribution like CentOS, Debian, or Ubuntu, they usually take more time to configure and administer than the following options.
+
+#### Virtualization software
+
+**[KVM][5]** (Kernel-based Virtual Machine) lets you turn Linux into a hypervisor so you can run multiple virtual machines in the same box. The best thing is that KVM is part of Linux, and it is the go-to option for many enterprises and home users. If you are comfortable, you can install **[libvirt][6]** and **[virt-manager][7]** to manage your virtualization platform.
+
+**[Proxmox VE][8]** is a robust, enterprise-grade solution and a full open source virtualization and container platform. It is based on Debian and uses KVM as its hypervisor and LXC for containers. Proxmox offers a powerful web interface, an API, and can scale out to many clustered nodes, which is helpful because you'll never know when you'll run out of capacity in your lab.
+
+**[oVirt][9] (RHV)** is another enterprise-grade solution that uses KVM as the hypervisor. Just because it's enterprise doesn't mean you can't use it at home. oVirt offers a powerful web interface and an API and can handle hundreds of nodes (if you are running that many servers, I don't want to be your neighbor!). The potential problem with oVirt for a home lab is that it requires a minimum set of nodes: You'll need one external storage, such as a NAS, and at least two additional virtualization nodes (you can run it just on one, but you'll run into problems in maintenance of your environment).
+
+#### NAS software
+
+**[FreeNAS][10]** is the most popular open source NAS distribution, and it's based on the rock-solid FreeBSD operating system. One of its most robust features is its use of the ZFS filesystem, which provides data-integrity checking, snapshots, replication, and multiple levels of redundancy (mirroring, striped mirrors, and striping). On top of that, everything is managed from the powerful and easy-to-use web interface. Before installing FreeNAS, check its hardware support, as it is not as wide as Linux-based distributions.
+
+Another popular alternative is the Linux-based **[OpenMediaVault][11]**. One of its main features is its modularity, with plugins that extend and add features. Among its included features are a web-based administration interface; protocols like CIFS, SFTP, NFS, iSCSI; and volume management, including software RAID, quotas, access control lists (ACLs), and share management. Because it is Linux-based, it has extensive hardware support.
+
+#### Firewall/router software
+
+**[pfSense][12]** is an open source, enterprise-grade FreeBSD-based router and firewall distribution. It can be installed directly on a server or even inside a virtual machine (to manage your virtual or physical networks and save space). It has many features and can be expanded using packages. It is managed entirely using the web interface, although it also has command-line access. It has all the features you would expect from a router and firewall, like DHCP and DNS, as well as more advanced features, such as intrusion detection (IDS) and intrusion prevention (IPS) systems. You can create multiple networks listening on different interfaces or using VLANs, and you can create a secure VPN server with a few clicks. pfSense uses pf, a stateful packet filter that was developed for the OpenBSD operating system using a syntax similar to IPFilter. Many companies and organizations use pfSense.
+
+* * *
+
+With all this information in mind, it's time for you to get your hands dirty and start building your lab. In a future article, I will get into the third category of running a home lab: using automation to deploy and maintain it.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/home-lab
+
+作者:[Michael Zamot (Red Hat)][a]
+选题:[lujun9972][b]
+译者:[译者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/mzamot
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_keyboard_laptop_development_code_woman.png?itok=vbYz6jjb
+[2]: https://opensource.com/article/18/5/how-insecure-your-router
+[3]: /file/427426
+[4]: https://opensource.com/sites/default/files/uploads/pfsense2.png (Home computer lab PfSense)
+[5]: https://www.linux-kvm.org/page/Main_Page
+[6]: https://libvirt.org/
+[7]: https://virt-manager.org/
+[8]: https://www.proxmox.com/en/proxmox-ve
+[9]: https://ovirt.org/
+[10]: https://freenas.org/
+[11]: https://www.openmediavault.org/
+[12]: https://www.pfsense.org/
diff --git a/sources/tech/20190320 4 cool terminal multiplexers.md b/sources/tech/20190320 4 cool terminal multiplexers.md
new file mode 100644
index 0000000000..e8650b4f56
--- /dev/null
+++ b/sources/tech/20190320 4 cool terminal multiplexers.md
@@ -0,0 +1,121 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (4 cool terminal multiplexers)
+[#]: via: (https://fedoramagazine.org/4-cool-terminal-multiplexers/)
+[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/)
+
+4 cool terminal multiplexers
+======
+
+![][1]
+
+The Fedora OS is comfortable and easy for lots of users. It has a stunning desktop that makes it easy to get everyday tasks done. Under the hood is all the power of a Linux system, and the terminal is the easiest way for power users to harness it. By default terminals are simple and somewhat limited. However, a _terminal multiplexer_ allows you to turn your terminal into an even more incredible powerhouse. This article shows off some popular terminal multiplexers and how to install them.
+
+Why would you want to use one? Well, for one thing, it lets you logout of your system while _leaving your terminal session undisturbed_. It’s incredibly useful to logout of your console, secure it, travel somewhere else, then remotely login with SSH and continue where you left off. Here are some utilities to check out.
+
+One of the oldest and most well-known terminal multiplexers is _screen._ However, because the code is no longer maintained, this article focuses on more recent apps. (“Recent” is relative — some of these have been around for years!)
+
+### Tmux
+
+The _tmux_ utility is one of the most widely used replacements for _screen._ It has a highly configurable interface. You can program tmux to start up specific kinds of sessions based on your needs. You’ll find a lot more about tmux in this article published earlier:
+
+> [Use tmux for a more powerful terminal][2]
+
+Already a tmux user? You might like [this additional article on making your tmux sessions more effective][3].
+
+To install tmux, use the _sudo_ command along with _dnf_ , since you’re probably in a terminal already:
+
+```
+$ sudo dnf install tmux
+```
+
+To start learning, run the _tmux_ command. A single pane window starts with your default shell. Tmux uses a _modifier key_ to signal that a command is coming next. This key is **Ctrl+B** by default. If you enter **Ctrl+B, C** you’ll create a new window with a shell in it.
+
+Here’s a hint: Use **Ctrl+B, ?** to enter a help mode that lists all the keys you can use. To keep things simple, look for the lines starting with _bind-key -T prefix_ at first. These are keys you can use right after the modifier key to configure your tmux session. You can hit **Ctrl+C** to exit the help mode back to tmux.
+
+To completely exit tmux, use the standard _exit_ command or _Ctrl+D_ keystroke to exit all the shells.
+
+### Dvtm
+
+You might have recently seen the Magazine article on [dwm, a dynamic window manager][4]. Like dwm, _dvtm_ is for tiling window management — but in a terminal. It’s designed to adhere to the legacy UNIX philosophy of “do one thing well” — in this case managing windows in a terminal.
+
+Installing dvtm is easy as well. However, if you want the logout functionality mentioned earlier, you’ll also need the _abduco_ package which handles session management for dvtm.
+
+```
+$ sudo dnf install dvtm abduco
+```
+
+The dvtm utility has many keystrokes already mapped to allow you to manage windows in the terminal. By default, it uses **Ctrl+G** as its modifier key. This keystroke tells dvtm that the following character is going to be a command it should process. For instance, **Ctrl+G, C** creates a new window and **Ctrl+G, X** removes it.
+
+For more information on using dvtm, check out the dvtm [home page][5] which includes numerous tips and get-started information.
+
+### Byobu
+
+While _byobu_ isn’t truly a multiplexer on its own — it wraps _tmux_ or even the older _screen_ to add functions — it’s worth covering here too. Byobu makes terminal multiplexers better for novices, by adding a help menu and window tabs that are slightly easier to navigate.
+
+Of course it’s available in the Fedora repos as well. To install, use this command:
+
+```
+$ sudo dnf install byobu
+```
+
+By default the _byobu_ command runs _screen_ underneath, so you might want to run _byobu-tmux_ to wrap _tmux_ instead. You can then use the **F9** key to open up a help menu for more information to help you get started.
+
+### Mtm
+
+The _mtm_ utility is one of the smallest multiplexers you’ll find. In fact, it’s only about 1000 lines of code! You might find it helpful if you’re in a limited environment such as old hardware, a minimal container, and so forth. To get started, you’ll need a couple packages.
+
+```
+$ sudo dnf install git ncurses-devel make gcc
+```
+
+Then clone the repository where mtm lives:
+
+```
+$ git clone https://github.com/deadpixi/mtm.git
+```
+
+Change directory into the _mtm_ folder and build the program:
+
+```
+$ make
+```
+
+You might receive a few warnings, but when you’re done, you’ll have the very small _mtm_ utility. Run it with this command:
+
+```
+$ ./mtm
+```
+
+You can find all the documentation for the utility [on its GitHub page][6].
+
+These are just some of the terminal multiplexers out there. Got one you’d like to recommend? Leave a comment below with your tips and enjoy building windows in your terminal!
+
+* * *
+
+_Photo by _[ _Michael_][7]_ on [Unsplash][8]._
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/4-cool-terminal-multiplexers/
+
+作者:[Paul W. Frields][a]
+选题:[lujun9972][b]
+译者:[译者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/pfrields/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2018/08/tmuxers-4-816x345.jpg
+[2]: https://fedoramagazine.org/use-tmux-more-powerful-terminal/
+[3]: https://fedoramagazine.org/4-tips-better-tmux-sessions/
+[4]: https://fedoramagazine.org/lets-try-dwm-dynamic-window-manger/
+[5]: http://www.brain-dump.org/projects/dvtm/#why
+[6]: https://github.com/deadpixi/mtm
+[7]: https://unsplash.com/photos/48yI_ZyzuLo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
+[8]: https://unsplash.com/search/photos/windows?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
diff --git a/sources/tech/20190320 Choosing an open messenger client- Alternatives to WhatsApp.md b/sources/tech/20190320 Choosing an open messenger client- Alternatives to WhatsApp.md
new file mode 100644
index 0000000000..cb590455a5
--- /dev/null
+++ b/sources/tech/20190320 Choosing an open messenger client- Alternatives to WhatsApp.md
@@ -0,0 +1,97 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Choosing an open messenger client: Alternatives to WhatsApp)
+[#]: via: (https://opensource.com/article/19/3/open-messenger-client)
+[#]: author: (Chris Hermansen (Community Moderator) https://opensource.com/users/clhermansen)
+
+Choosing an open messenger client: Alternatives to WhatsApp
+======
+
+Keep in touch with far-flung family, friends, and colleagues without sacrificing your privacy.
+
+![Team communication, chat][1]
+
+Like many families, mine is inconveniently spread around, and I have many colleagues in North and South America. So, over the years, I've relied more and more on WhatsApp to stay in touch with people. The claimed end-to-end encryption appeals to me, as I prefer to maintain some shreds of privacy, and moreover to avoid forcing those with whom I communicate to use an insecure mechanism. But all this [WhatsApp/Facebook/Instagram "convergence"][2] has led our family to decide to vote with our feet. We no longer use WhatsApp for anything except communicating with others who refuse to use anything else, and we're working on them.
+
+So what do we use instead? Before I spill the beans, I'd like to explain what other options we looked at and how we chose.
+
+### Options we considered and how we evaluated them
+
+There is an absolutely [crazy number of messaging apps out there][3], and we spent a good deal of time thinking about what we needed for a replacement. We started by reading Dan Arel's article on [five social media alternatives to protect privacy][4].
+
+Then we came up with our list of core needs:
+
+ * Our entire family uses Android phones.
+ * One of us has a Windows desktop; the rest use Linux.
+ * Our main interest is something we can use to chat, both individually and as a group, on our phones, but it would be nice to have a desktop client available.
+ * It would also be nice to have voice and video calling as well.
+ * Our privacy is important. Ideally, the code should be open source to facilitate security reviews. If the operation is not pure peer-to-peer, then the organization operating the server components should not operate a business based on the commercialization of our personal information.
+
+
+
+At that point, we narrowed the long list down to [Viber][5], [Line][6], [Signal][7], [Threema][8], [Wire][9], and [Riot.im][10]. While I lean strongly to open source, we wanted to include some closed source and paid solutions to make sure we weren't missing something important. Here's how those six alternatives measured up.
+
+### Line
+
+[Line][11] is a popular messaging application, and it's part of a larger Line "ecosystem"—online gaming, Taxi (an Uber-like service in Japan), Wow (a food delivery service), Today (a news hub), shopping, and others. For us, Line checks a few too many boxes with all those add-on features. Also, I could not determine its current security quality, and it's not open source. The business model seems to be to build a community and figure out how to make money through that community.
+
+### Riot.im
+
+[Riot.im][12] operates on top of the Matrix protocol and therefore lets the user choose a Matrix provider. It also appears to check all of our "needs" boxes, although in operation it looks more like Slack, with a room-oriented and interoperable/federated design. It offers desktop clients, and it's open source. Since the Matrix protocol can be hosted anywhere, any business model would be particular to the Matrix provider.
+
+### Signal
+
+[Signal][13] offers a similar user experience to WhatsApp. It checks all of our "needs" boxes, with solid security validated by external audit. It is open source, and it is developed and operated by a not-for-profit foundation, in principle similar to the Mozilla Foundation. Interestingly, Signal's communications protocol appears to be used by other messaging apps, [including WhatsApp][14].
+
+### Threema
+
+[Threema][15] is extremely privacy-focused. It checks some of our "needs" boxes, with decent external audit results of its security. It doesn't offer a desktop client, and it [isn't fully open source][16] though some of its core components are. Threema's business model appears to be to offer paid secure communications.
+
+### Viber
+
+[Viber][17] is a very popular messaging application. It checks most of our "needs" boxes; however, it doesn't seem to have solid proof of its security—it seems to use a proprietary encryption mechanism, and as far as I could determine, its current security mechanisms are not externally audited. It's not open source. The owner, Rakuten, seems to be planning for a paid subscription as a business model.
+
+### Wire
+
+[Wire][18] was started and is built by some ex-Skype people. It appears to check all of our "needs" boxes, although I am not completely comfortable with its security profile since it stores client data that apparently is not encrypted on its servers. It offers desktop clients and is open source. The developer and operator, Wire Swiss, appears to have a [pay-for-service track][9] as its future business model.
+
+### The final verdict
+
+In the end, we picked Signal. We liked its open-by-design approach, its serious and ongoing [privacy and security stance][7] and having a Signal app on our GNOME (and Windows) desktops. It performs very well on our Android handsets and our desktops. Moreover, it wasn't a big surprise to our small user community; it feels much more like WhatsApp than, for example, Riot.im, which we also tried extensively. Having said that, if we were trying to replace Slack, we'd probably move to Riot.im.
+
+_Have a favorite messenger? Tell us about it in the comments below._
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/open-messenger-client
+
+作者:[Chris Hermansen (Community Moderator)][a]
+选题:[lujun9972][b]
+译者:[译者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/clhermansen
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_team_mobile_desktop.png?itok=d7sRtKfQ (Team communication, chat)
+[2]: https://www.cnbc.com/2018/03/28/facebook-new-privacy-settings-dont-address-instagram-whatsapp.html
+[3]: https://en.wikipedia.org/wiki/Comparison_of_instant_messaging_clients
+[4]: https://opensource.com/article/19/1/open-source-social-media-alternatives
+[5]: https://en.wikipedia.org/wiki/Viber
+[6]: https://en.wikipedia.org/wiki/Line_(software)
+[7]: https://en.wikipedia.org/wiki/Signal_(software)
+[8]: https://en.wikipedia.org/wiki/Threema
+[9]: https://en.wikipedia.org/wiki/Wire_(software)
+[10]: https://en.wikipedia.org/wiki/Riot.im
+[11]: https://line.me/en/
+[12]: https://about.riot.im/
+[13]: https://signal.org/
+[14]: https://en.wikipedia.org/wiki/Signal_Protocol
+[15]: https://threema.ch/en
+[16]: https://threema.ch/en/faq/source_code
+[17]: https://www.viber.com/
+[18]: https://wire.com/en/
diff --git a/sources/tech/20190320 Move your dotfiles to version control.md b/sources/tech/20190320 Move your dotfiles to version control.md
new file mode 100644
index 0000000000..7d070760c7
--- /dev/null
+++ b/sources/tech/20190320 Move your dotfiles to version control.md
@@ -0,0 +1,130 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Move your dotfiles to version control)
+[#]: via: (https://opensource.com/article/19/3/move-your-dotfiles-version-control)
+[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg)
+
+Move your dotfiles to version control
+======
+Back up or sync your custom configurations across your systems by sharing dotfiles on GitLab or GitHub.
+
+
+
+There is something truly exciting about customizing your operating system through the collection of hidden files we call dotfiles. In [What a Shell Dotfile Can Do For You][1], H. "Waldo" Grunenwald goes into excellent detail about the why and how of setting up your dotfiles. Let's dig into the why and how of sharing them.
+
+### What's a dotfile?
+
+"Dotfiles" is a common term for all the configuration files we have floating around our machines. These files usually start with a **.** at the beginning of the filename, like **.gitconfig** , and operating systems often hide them by default. For example, when I use **ls -a** on MacOS, it shows all the lovely dotfiles that would otherwise not be in the output.
+
+```
+dotfiles on master
+➜ ls
+README.md Rakefile bin misc profiles zsh-custom
+
+dotfiles on master
+➜ ls -a
+. .gitignore .oh-my-zsh README.md zsh-custom
+.. .gitmodules .tmux Rakefile
+.gemrc .global_ignore .vimrc bin
+.git .gvimrc .zlogin misc
+.gitconfig .maid .zshrc profiles
+```
+
+If I take a look at one, **.gitconfig** , which I use for Git configuration, I see a ton of customization. I have account information, terminal color preferences, and tons of aliases that make my command-line interface feel like mine. Here's a snippet from the **[alias]** block:
+
+```
+87 # Show the diff between the latest commit and the current state
+88 d = !"git diff-index --quiet HEAD -- || clear; git --no-pager diff --patch-with-stat"
+89
+90 # `git di $number` shows the diff between the state `$number` revisions ago and the current state
+91 di = !"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d"
+92
+93 # Pull in remote changes for the current repository and all its submodules
+94 p = !"git pull; git submodule foreach git pull origin master"
+95
+96 # Checkout a pull request from origin (of a github repository)
+97 pr = !"pr() { git fetch origin pull/$1/head:pr-$1; git checkout pr-$1; }; pr"
+```
+
+Since my **.gitconfig** has over 200 lines of customization, I have no interest in rewriting it on every new computer or system I use, and either does anyone else. This is one reason sharing dotfiles has become more and more popular, especially with the rise of the social coding site GitHub. The canonical article advocating for sharing dotfiles is Zach Holman's [Dotfiles Are Meant to Be Forked][2] from 2008. The premise is true to this day: I want to share them, with myself, with those new to dotfiles, and with those who have taught me so much by sharing their customizations.
+
+### Sharing dotfiles
+
+Many of us have multiple systems or know hard drives are fickle enough that we want to back up our carefully curated customizations. How do we keep these wonderful files in sync across environments?
+
+My favorite answer is distributed version control, preferably a service that will handle the heavy lifting for me. I regularly use GitHub and continue to enjoy GitLab as I get more experienced with it. Either one is a perfect place to share your information. To set yourself up:
+
+ 1. Sign into your preferred Git-based service.
+ 2. Create a repository called "dotfiles." (Make it public! Sharing is caring.)
+ 3. Clone it to your local environment.*
+ 4. Copy your dotfiles into the folder.
+ 5. Symbolically link (symlink) them back to their target folder (most often **$HOME** ).
+ 6. Push them to the remote repository.
+
+
+
+* You may need to set up your Git configuration commands to clone the repository. Both GitHub and GitLab will prompt you with the commands to run.
+
+
+
+Step 4 above is the crux of this effort and can be a bit tricky. Whether you use a script or do it by hand, the workflow is to symlink from your dotfiles folder to the dotfiles destination so that any updates to your dotfiles are easily pushed to the remote repository. To do this for my **.gitconfig** file, I would enter:
+
+```
+$ cd dotfiles/
+$ ln -nfs .gitconfig $HOME/.gitconfig
+```
+
+The flags added to the symlinking command offer a few additional benefits:
+
+ * **-s** creates a symbolic link instead of a hard link
+ * **-f** continues with other symlinking when an error occurs (not needed here, but useful in loops)
+ * **-n** avoids symlinking a symlink (same as **-h** for other versions of **ln** )
+
+
+
+You can review the IEEE and Open Group [specification of **ln**][3] and the version on [MacOS 10.14.3][4] if you want to dig deeper into the available parameters. I had to look up these flags since I pulled them from someone else's dotfiles.
+
+You can also make updating simpler with a little additional code, like the [Rakefile][5] I forked from [Brad Parbs][6]. Alternatively, you can keep it incredibly simple, as Jeff Geerling does [in his dotfiles][7]. He symlinks files using [this Ansible playbook][8]. Keeping everything in sync at this point is easy: you can cron job or occasionally **git push** from your dotfiles folder.
+
+### Quick aside: What not to share
+
+Before we move on, it is worth noting what you should not add to a shared dotfile repository—even if it starts with a dot. Anything that is a security risk, like files in your **.ssh/** folder, is not a good choice to share using this method. Be sure to double-check your configuration files before publishing them online and triple-check that no API tokens are in your files.
+
+### Where should I start?
+
+If Git is new to you, my [article about the terminology][9] and [a cheat sheet][10] of my most frequently used commands should help you get going.
+
+There are other incredible resources to help you get started with dotfiles. Years ago, I came across [dotfiles.github.io][11] and continue to go back to it for a broader look at what people are doing. There is a lot of tribal knowledge hidden in other people's dotfiles. Take the time to scroll through some and don't be shy about adding them to your own.
+
+I hope this will get you started on the joy of having consistent dotfiles across your computers.
+
+What's your favorite dotfile trick? Add a comment or tweet me [@mbbroberg][12].
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/move-your-dotfiles-version-control
+
+作者:[Matthew Broberg][a]
+选题:[lujun9972][b]
+译者:[译者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/mbbroberg
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/article/18/9/shell-dotfile
+[2]: https://zachholman.com/2010/08/dotfiles-are-meant-to-be-forked/
+[3]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ln.html
+[4]: https://www.unix.com/man-page/FreeBSD/1/ln/
+[5]: https://github.com/mbbroberg/dotfiles/blob/master/Rakefile
+[6]: https://github.com/bradp/dotfiles
+[7]: https://github.com/geerlingguy/dotfiles
+[8]: https://github.com/geerlingguy/mac-dev-playbook
+[9]: https://opensource.com/article/19/2/git-terminology
+[10]: https://opensource.com/downloads/cheat-sheet-git
+[11]: http://dotfiles.github.io/
+[12]: https://twitter.com/mbbroberg?lang=en
diff --git a/sources/tech/20190320 Nuvola- Desktop Music Player for Streaming Services.md b/sources/tech/20190320 Nuvola- Desktop Music Player for Streaming Services.md
new file mode 100644
index 0000000000..ba0d8d550d
--- /dev/null
+++ b/sources/tech/20190320 Nuvola- Desktop Music Player for Streaming Services.md
@@ -0,0 +1,186 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Nuvola: Desktop Music Player for Streaming Services)
+[#]: via: (https://itsfoss.com/nuvola-music-player)
+[#]: author: (Atharva Lele https://itsfoss.com/author/atharva/)
+
+Nuvola: Desktop Music Player for Streaming Services
+======
+
+[Nuvola][1] is not like your usual music players. It’s different because it allows you to play a number of streaming services in a desktop music player.
+
+Nuvola provides a runtime called [Nuvola Apps Runtime][2] which runs web apps. This is why Nuvola can support a host of streaming services. Some of the major players it supports are:
+
+ * Spotify
+ * Google Play Music
+ * YouTube, YouTube Music
+ * [Pandora][3]
+ * [SoundCloud][4]
+ * and many many more.
+
+
+
+You can find the full list [here][1] in the Music streaming services section. Apple Music is not supported, if you were wondering.
+
+Why would you use a streaming music service in a different desktop player when you can run it in a web browser? The advantage with Nuvola is that it provides tight integration with many [desktop environments][5].
+
+Ideally it should work with all DEs, but the officially supported ones are GNOME, Unity, and Pantheon (elementary OS).
+
+### Features of Nuvola Music Player
+
+Let’s see some of the main features of the open source project Nuvola:
+
+ * Supports a wide variety of music streaming services
+ * Desktop integration with GNOME, Unity, and Pantheon.
+ * Keyboard shortcuts with the ability to customize them
+ * Support for keyboard’s multimedia keys (paid feature)
+ * Background play with notifications
+ * [GNOME Media Player][6] extension support
+ * App Tray indicator
+ * Dark and Light themes
+ * Enable or disable features
+ * Password Manager for web services
+ * Remote control over internet (paid feature)
+ * Available for a lot of distros ([Flatpak][7] packages)
+
+
+
+Complete list of features is available [here][8].
+
+### How to install Nuvola on Ubuntu & other Linux distributions
+
+Installing Nuvola consists of a few more steps than simply adding a PPA and then installing the software. Since it is based on [Flatpak][7], you have to set up Flatpak first and then you can install Nuvola.
+
+[Enable Flatpak Support][9]
+
+The steps are pretty simple. You can follow the guide [here][10] if you want to install using the GUI, however I prefer terminal commands since they’re easier and faster.
+
+**Warning: If already installed, remove the older version of Nuvola (Click to expand)**
+
+If you have ever installed Nuvola before, you need to uninstall it to avoid issues. Run these commands in the terminal to do so.
+
+```
+sudo apt remove nuvolaplayer*
+```
+
+```
+rm -rf ~/.cache/nuvolaplayer3 ~/.local/share/nuvolaplayer ~/.config/nuvolaplayer3 ~/.local/share/applications/nuvolaplayer3*
+```
+
+Once you have made sure that your system has Flatpak, you can install Nuvola using this command:
+
+```
+flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
+flatpak remote-add --if-not-exists nuvola https://dl.tiliado.eu/flatpak/nuvola.flatpakrepo
+```
+
+This is an optional step but I recommend you install this since the service allows you to commonly configure settings like shortcuts for each of the streaming service that you might use.
+
+```
+flatpak install nuvola eu.tiliado.Nuvola
+```
+
+Nuvola supports 29 streaming services. To get them, you need to add those services individually. You can find all the supported music services are available on this [page][10].
+
+For the purpose of this tutorial, I’m going to go with [YouTube Music][11].
+
+```
+flatpak install nuvola eu.tiliado.NuvolaAppYoutubeMusic
+```
+
+After this, you should have the app installed and should be able to see the icon if you search for it.
+
+![Nuvola App specific icons][12]
+
+Clicking on the icon will pop-up the first time setup. You’ll have to accept the Privacy Policy and then continue.
+
+![Terms and Conditions page][13]
+
+After accepting terms and conditions, you should launch into the web app of the respective streaming service, YouTube Music in this case.
+
+![YouTube Music web app running on Nuvola Runtime][14]
+
+In case of installation on other distributions, specific guidelines are available on the [Nuvola website][15].
+
+### My experience with Nuvola Music Player
+
+Initially I thought that it wouldn’t be too different than simply running the web app in [Firefox][16], since many desktop environments like KDE support media controls and shortcuts for media playing in Firefox.
+
+However, this isn’t the case with many other desktops environments and that’s where Nuvola comes in handy. Often, it’s also faster to access than loading the website on the browser.
+
+Once loaded, it behaves pretty much like a normal web app with the benefit of keyboard shortcuts. Speaking of shortcuts, you should check out the list of must know [Ubuntu shortcuts][17].
+
+![Viewing an Artist’s page][18]
+
+Integration with the DE comes in handy when you quickly want to change a song or play/pause your music without leaving your current application. Nuvola gives you access in GNOME notifications as well as provides an app tray icon.
+
+ * ![Notification music controls][19]
+
+ * ![App tray music controls][20]
+
+
+
+
+Keyboard shortcuts work well, globally as well as in-app. You get a notification when the song changes. Whether you do it yourself or it automatically switches to the next song.
+
+![][21]
+
+By default, very few keyboard shortcuts are provided. However you can enable them for almost everything you can do with the app. For example I set the song change shortcuts to Ctrl + Arrow keys as you can see in the screenshot.
+
+![Keyboard Shortcuts][22]
+
+All in all, it works pretty well and it’s fast and responsive. Definitely more so than your usual Snap app.
+
+**Some criticism**
+
+Some thing that did not please me as much was the installation size. Since it requires a browser back-end and GNOME integration it essentially installs a browser and necessary GNOME libraries for Flatpak, so that results in having to install almost 350MB in dependencies.
+
+After that, you install individual apps. The individual apps themselves are not heavy at all. But if you just use one streaming service, having a 300+ MB installation might not be ideal if you’re concerned about disk space.
+
+Nuvola also does not support local music, at least as far as I could find.
+
+**Conclusion**
+
+Hope this article helped you to know more about Nuvola Music Player and its features. If you like such different applications, why not take a look at some of the [lesser known music players for Linux][23]?
+
+As always, if you have any suggestions or questions, I look forward to reading your comments.
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/nuvola-music-player
+
+作者:[Atharva Lele][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/atharva/
+[b]: https://github.com/lujun9972
+[1]: https://nuvola.tiliado.eu/
+[2]: https://nuvola.tiliado.eu/#fn:1
+[3]: https://itsfoss.com/install-pandora-linux-client/
+[4]: https://itsfoss.com/install-soundcloud-linux/
+[5]: https://itsfoss.com/best-linux-desktop-environments/
+[6]: https://extensions.gnome.org/extension/55/media-player-indicator/
+[7]: https://flatpak.org/
+[8]: http://tiliado.github.io/nuvolaplayer/documentation/4/explore.html
+[9]: https://itsfoss.com/flatpak-guide/
+[10]: https://nuvola.tiliado.eu/nuvola/ubuntu/bionic/
+[11]: https://nuvola.tiliado.eu/app/youtube_music/ubuntu/bionic/
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_youtube_music_icon.png?resize=800%2C450&ssl=1
+[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_eula.png?resize=800%2C450&ssl=1
+[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_youtube_music.png?resize=800%2C450&ssl=1
+[15]: https://nuvola.tiliado.eu/index/
+[16]: https://itsfoss.com/why-firefox/
+[17]: https://itsfoss.com/ubuntu-shortcuts/
+[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_web_player.png?resize=800%2C449&ssl=1
+[19]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_music_controls.png?fit=800%2C450&ssl=1
+[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_web_player2.png?fit=800%2C450&ssl=1
+[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_song_change_notification-e1553077619208.png?ssl=1
+[22]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/nuvola_shortcuts.png?resize=800%2C450&ssl=1
+[23]: https://itsfoss.com/lesser-known-music-players-linux/
diff --git a/sources/tech/20190321 How To Setup Linux Media Server Using Jellyfin.md b/sources/tech/20190321 How To Setup Linux Media Server Using Jellyfin.md
new file mode 100644
index 0000000000..9c3de11bc5
--- /dev/null
+++ b/sources/tech/20190321 How To Setup Linux Media Server Using Jellyfin.md
@@ -0,0 +1,268 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How To Setup Linux Media Server Using Jellyfin)
+[#]: via: (https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/)
+[#]: author: (sk https://www.ostechnix.com/author/sk/)
+
+How To Setup Linux Media Server Using Jellyfin
+======
+
+![Setup Linux Media Server Using Jellyfin][1]
+
+We’ve already written about setting up your own streaming media server on Linux using [**Streama**][2]. Today, we will going to setup yet another media server using **Jellyfin**. Jellyfin is a free, cross-platform and open source alternative to propriety media streaming applications such as **Emby** and **Plex**. The main developer of Jellyfin forked it from Emby after the announcement of Emby transitioning to a proprietary model. Jellyfin doesn’t include any premium features, licenses or membership plans. It is completely free and open source project supported by hundreds of community members. Using jellyfin, we can instantly setup Linux media server in minutes and access it via LAN/WAN from any devices using multiple apps.
+
+### Setup Linux Media Server Using Jellyfin
+
+Jellyfin supports GNU/Linux, Mac OS and Microsoft Windows operating systems. You can install it on your Linux distribution as described below.
+
+##### Install Jellyfin On Linux
+
+As of writing this guide, Jellyfin packages are available for most popular Linux distributions, such as Arch Linux, Debian, CentOS, Fedora and Ubuntu.
+
+On **Arch Linux** and its derivatives like **Antergos** , **Manjaro Linux** , you can install Jellyfin using any AUR helper tools, for example [**YaY**][3].
+
+```
+$ yay -S jellyfin-git
+```
+
+On **CentOS/RHEL** :
+
+Download the latest Jellyfin rpm package from [**here**][4] and install it as shown below.
+
+```
+$ wget https://repo.jellyfin.org/releases/server/centos/jellyfin-10.2.2-1.el7.x86_64.rpm
+
+$ sudo yum localinstall jellyfin-10.2.2-1.el7.x86_64.rpm
+```
+
+On **Fedora** :
+
+Download Jellyfin for Fedora from [**here**][5].
+
+```
+$ wget https://repo.jellyfin.org/releases/server/fedora/jellyfin-10.2.2-1.fc29.x86_64.rpm
+
+$ sudo dnf install jellyfin-10.2.2-1.fc29.x86_64.rpm
+```
+
+On **Debian** :
+
+Install HTTPS transport for APT if it is not installed already:
+
+```
+$ sudo apt install apt-transport-https
+```
+
+Import Jellyfin GPG signing key:``
+
+```
+$ wget -O - https://repo.jellyfin.org/debian/jellyfin_team.gpg.key | sudo apt-key add -
+```
+
+Add Jellyfin repository:
+
+```
+$ sudo touch /etc/apt/sources.list.d/jellyfin.list
+
+$ echo "deb [arch=amd64] https://repo.jellyfin.org/debian $( lsb_release -c -s ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list
+```
+
+Finally, update Jellyfin repository and install Jellyfin using commands:``
+
+```
+$ sudo apt update
+
+$ sudo apt install jellyfin
+```
+
+On **Ubuntu 18.04 LTS** :
+
+Install HTTPS transport for APT if it is not installed already:
+
+```
+$ sudo apt install apt-transport-https
+```
+
+Import and add Jellyfin GPG signing key:``
+
+```
+$ wget -O - https://repo.jellyfin.org/debian/jellyfin_team.gpg.key | sudo apt-key add -
+```
+
+Add the Jellyfin repository:
+
+```
+$ sudo touch /etc/apt/sources.list.d/jellyfin.list
+
+$ echo "deb https://repo.jellyfin.org/ubuntu bionic main" | sudo tee /etc/apt/sources.list.d/jellyfin.list
+```
+
+For Ubuntu 16.04, just replace **bionic** with **xenial** in the above URL.
+
+Finally, update Jellyfin repository and install Jellyfin using commands:``
+
+```
+$ sudo apt update
+
+$ sudo apt install jellyfin
+```
+
+##### Start Jellyfin service
+
+Run the following commands to enable and start jellyfin service on every reboot:
+
+```
+$ sudo systemctl enable jellyfin
+
+$ sudo systemctl start jellyfin
+```
+
+To check if the service has been started or not, run:
+
+```
+$ sudo systemctl status jellyfin
+```
+
+Sample output:
+
+```
+● jellyfin.service - Jellyfin Media Server
+Loaded: loaded (/lib/systemd/system/jellyfin.service; enabled; vendor preset: enabled)
+Drop-In: /etc/systemd/system/jellyfin.service.d
+└─jellyfin.service.conf
+Active: active (running) since Wed 2019-03-20 12:20:19 UTC; 1s ago
+Main PID: 4556 (jellyfin)
+Tasks: 11 (limit: 2320)
+CGroup: /system.slice/jellyfin.service
+└─4556 /usr/bin/jellyfin --datadir=/var/lib/jellyfin --configdir=/etc/jellyfin --logdir=/var/log/jellyfin --cachedir=/var/cache/jellyfin --r
+
+Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading Emby.Photos, Version=10.2.2.0, Culture=neutral, PublicKeyToken=null
+Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading Emby.Server.Implementations, Version=10.2.2.0, Culture=neutral, PublicKeyToken=nu
+Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading MediaBrowser.MediaEncoding, Version=10.2.2.0, Culture=neutral, PublicKeyToken=nul
+Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading Emby.Dlna, Version=10.2.2.0, Culture=neutral, PublicKeyToken=null
+Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading MediaBrowser.LocalMetadata, Version=10.2.2.0, Culture=neutral, PublicKeyToken=nul
+Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading Emby.Notifications, Version=10.2.2.0, Culture=neutral, PublicKeyToken=null
+Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading MediaBrowser.XbmcMetadata, Version=10.2.2.0, Culture=neutral, PublicKeyToken=null
+Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Loading jellyfin, Version=10.2.2.0, Culture=neutral, PublicKeyToken=null
+Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Sqlite version: 3.26.0
+Mar 20 12:20:21 ubuntuserver jellyfin[4556]: [12:20:21] [INF] Sqlite compiler options: COMPILER=gcc-5.4.0 20160609,DEFAULT_FOREIGN_KEYS,ENABLE_COLUMN_M
+```
+
+If you see an output something, congratulations! Jellyfin service has been started.
+
+Next, we should do some initial configuration.
+
+##### Configure Jellyfin
+
+Once jellyfin is installed, open the browser and navigate to – **http:// :8096** or **http:// :8096** URL.
+
+You will see the following welcome screen. Select your preferred language and click Next.
+
+![][6]
+
+Enter your user details. You can add more users later from the Jellyfin Dashboard.
+
+![][7]
+
+The next step is to select media files which we want to stream. To do so, click “Add media Library” button:
+
+![][8]
+
+Choose the content type (i.e audio, video, movies etc.,), display name and click plus (+) sign next to the Folders icon to choose the location where you kept your media files. You can further choose other library settings such as the preferred download language, country etc. Click Ok after choosing the preferred options.
+
+![][9]
+
+Similarly, add all of the media files. Once you have chosen everything to stream, click Next.
+
+![][10]
+
+Choose the Metadata language and click Next:
+
+![][11]
+
+Next, you need to configure whether you want to allow remote connections to this media server. Make sure you have allowed the remote connections. Also, enable automatic port mapping and click Next:
+
+![][12]
+
+You’re all set! Click Finish to complete Jellyfin configuration.
+
+![][13]
+
+You will now be redirected to Jellyfin login page. Click on the username and enter it’s password which we setup earlier.
+
+![][14]
+
+This is how Jellyfin dashboard looks like.
+
+![][15]
+
+As you see in the screenshot, all of your media files are shown in the dashboard itself under My Media section. Just click on the any media file of your choice and start watching it!!
+
+![][16]
+
+You can access this Jellyfin media server from any systems on the network using URL – . You need not to install any extra apps. All you need is a modern web browser.
+
+If you want to change anything or reconfigure, click on the three horizontal bars from the Home screen. Here, you can add users, media files, change playback settings, add TV/DVR, install plugins, change default port no and a lot more settings.
+
+![][17]
+
+For more details, check out [**Jellyfin official documentation**][18] page.
+
+And, that’s all for now. As you can see setting up a streaming media server on Linux is no big-deal. I tested it on my Ubuntu 18.04 LTS VM. It worked fine out of the box. I can be able to watch the movies from other systems in my LAN. If you’re looking for easy, quick and free solution for hosting a media server, Jellyfin is a good choice.
+
+Cheers!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/
+
+作者:[sk][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: https://www.ostechnix.com/streama-setup-your-own-streaming-media-server-in-minutes/
+[3]: https://www.ostechnix.com/yay-found-yet-another-reliable-aur-helper/
+[4]: https://repo.jellyfin.org/releases/server/centos/
+[5]: https://repo.jellyfin.org/releases/server/fedora/
+[6]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-1.png
+[7]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-2-1.png
+[8]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-3-1.png
+[9]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-4-1.png
+[10]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-5-1.png
+[11]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-6.png
+[12]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-7.png
+[13]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-8-1.png
+[14]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-9.png
+[15]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-10.png
+[16]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-11.png
+[17]: http://www.ostechnix.com/wp-content/uploads/2019/03/jellyfin-12.png
+[18]: https://jellyfin.readthedocs.io/en/latest/
+[19]: https://github.com/jellyfin/jellyfin
+[20]: http://feedburner.google.com/fb/a/mailverify?uri=ostechnix (Subscribe to our Email newsletter)
+[21]: https://www.paypal.me/ostechnix (Donate Via PayPal)
+[22]: http://ostechnix.tradepub.com/category/information-technology/1207/
+[23]: https://www.facebook.com/ostechnix/
+[24]: https://twitter.com/ostechnix
+[25]: https://plus.google.com/+SenthilkumarP/
+[26]: https://www.linkedin.com/in/ostechnix
+[27]: http://feeds.feedburner.com/Ostechnix
+[28]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=reddit (Click to share on Reddit)
+[29]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=twitter (Click to share on Twitter)
+[30]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=facebook (Click to share on Facebook)
+[31]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=linkedin (Click to share on LinkedIn)
+[32]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=pocket (Click to share on Pocket)
+[33]: https://api.whatsapp.com/send?text=How%20To%20Setup%20Linux%20Media%20Server%20Using%20Jellyfin%20https%3A%2F%2Fwww.ostechnix.com%2Fhow-to-setup-linux-media-server-using-jellyfin%2F (Click to share on WhatsApp)
+[34]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=telegram (Click to share on Telegram)
+[35]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/?share=email (Click to email this to a friend)
+[36]: https://www.ostechnix.com/how-to-setup-linux-media-server-using-jellyfin/#print (Click to print)
diff --git a/sources/tech/20190322 12 open source tools for natural language processing.md b/sources/tech/20190322 12 open source tools for natural language processing.md
new file mode 100644
index 0000000000..99031acf68
--- /dev/null
+++ b/sources/tech/20190322 12 open source tools for natural language processing.md
@@ -0,0 +1,113 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (12 open source tools for natural language processing)
+[#]: via: (https://opensource.com/article/19/3/natural-language-processing-tools)
+[#]: author: (Dan Barker (Community Moderator) https://opensource.com/users/barkerd427)
+
+12 open source tools for natural language processing
+======
+
+Take a look at a dozen options for your next NLP application.
+
+![Chat bubbles][1]
+
+Natural language processing (NLP), the technology that powers all the chatbots, voice assistants, predictive text, and other speech/text applications that permeate our lives, has evolved significantly in the last few years. There are a wide variety of open source NLP tools out there, so I decided to survey the landscape to help you plan your next voice- or text-based application.
+
+For this review, I focused on tools that use languages I'm familiar with, even though I'm not familiar with all the tools. (I didn't find a great selection of tools in the languages I'm not familiar with anyway.) That said, I excluded tools in three languages I am familiar with, for various reasons.
+
+The most obvious language I didn't include might be R, but most of the libraries I found hadn't been updated in over a year. That doesn't always mean they aren't being maintained well, but I think they should be getting updates more often to compete with other tools in the same space. I also chose languages and tools that are most likely to be used in production scenarios (rather than academia and research), and I have mostly used R as a research and discovery tool.
+
+I was also surprised to see that the Scala libraries are fairly stagnant. It has been a couple of years since I last used Scala, when it was pretty popular. Most of the libraries haven't been updated since that time—or they've only had a few updates.
+
+Finally, I excluded C++. This is mostly because it's been many years since I last wrote in C++, and the organizations I've worked in have not used C++ for NLP or any data science work.
+
+### Python tools
+
+#### Natural Language Toolkit (NLTK)
+
+It would be easy to argue that [Natural Language Toolkit (NLTK)][2] is the most full-featured tool of the ones I surveyed. It implements pretty much any component of NLP you would need, like classification, tokenization, stemming, tagging, parsing, and semantic reasoning. And there's often more than one implementation for each, so you can choose the exact algorithm or methodology you'd like to use. It also supports many languages. However, it represents all data in the form of strings, which is fine for simple constructs but makes it hard to use some advanced functionality. The documentation is also quite dense, but there is a lot of it, as well as [a great book][3]. The library is also a bit slow compared to other tools. Overall, this is a great toolkit for experimentation, exploration, and applications that need a particular combination of algorithms.
+
+#### SpaCy
+
+[SpaCy][4] is probably the main competitor to NLTK. It is faster in most cases, but it only has a single implementation for each NLP component. Also, it represents everything as an object rather than a string, which simplifies the interface for building applications. This also helps it integrate with many other frameworks and data science tools, so you can do more once you have a better understanding of your text data. However, SpaCy doesn't support as many languages as NLTK. It does have a simple interface with a simplified set of choices and great documentation, as well as multiple neural models for various components of language processing and analysis. Overall, this is a great tool for new applications that need to be performant in production and don't require a specific algorithm.
+
+#### TextBlob
+
+[TextBlob][5] is kind of an extension of NLTK. You can access many of NLTK's functions in a simplified manner through TextBlob, and TextBlob also includes functionality from the Pattern library. If you're just starting out, this might be a good tool to use while learning, and it can be used in production for applications that don't need to be overly performant. Overall, TextBlob is used all over the place and is great for smaller projects.
+
+#### Textacy
+
+This tool may have the best name of any library I've ever used. Say "[Textacy][6]" a few times while emphasizing the "ex" and drawing out the "cy." Not only is it great to say, but it's also a great tool. It uses SpaCy for its core NLP functionality, but it handles a lot of the work before and after the processing. If you were planning to use SpaCy, you might as well use Textacy so you can easily bring in many types of data without having to write extra helper code.
+
+#### PyTorch-NLP
+
+[PyTorch-NLP][7] has been out for just a little over a year, but it has already gained a tremendous community. It is a great tool for rapid prototyping. It's also updated often with the latest research, and top companies and researchers have released many other tools to do all sorts of amazing processing, like image transformations. Overall, PyTorch is targeted at researchers, but it can also be used for prototypes and initial production workloads with the most advanced algorithms available. The libraries being created on top of it might also be worth looking into.
+
+### Node tools
+
+#### Retext
+
+[Retext][8] is part of the [unified collective][9]. Unified is an interface that allows multiple tools and plugins to integrate and work together effectively. Retext is one of three syntaxes used by the unified tool; the others are Remark for markdown and Rehype for HTML. This is a very interesting idea, and I'm excited to see this community grow. Retext doesn't expose a lot of its underlying techniques, but instead uses plugins to achieve the results you might be aiming for with NLP. It's easy to do things like checking spelling, fixing typography, detecting sentiment, or making sure text is readable with simple plugins. Overall, this is an excellent tool and community if you just need to get something done without having to understand everything in the underlying process.
+
+#### Compromise
+
+[Compromise][10] certainly isn't the most sophisticated tool. If you're looking for the most advanced algorithms or the most complete system, this probably isn't the right tool for you. However, if you want a performant tool that has a wide breadth of features and can function on the client side, you should take a look at Compromise. Overall, its name is accurate in that the creators compromised on functionality and accuracy by focusing on a small package with much more specific functionality that benefits from the user understanding more of the context surrounding the usage.
+
+#### Natural
+
+[Natural][11] includes most functions you might expect in a general NLP library. It is mostly focused on English, but some other languages have been contributed, and the community is open to additional contributions. It supports tokenizing, stemming, classification, phonetics, term frequency–inverse document frequency, WordNet, string similarity, and some inflections. It might be most comparable to NLTK, in that it tries to include everything in one package, but it is easier to use and isn't necessarily focused around research. Overall, this is a pretty full library, but it is still in active development and may require additional knowledge of underlying implementations to be fully effective.
+
+#### Nlp.js
+
+[Nlp.js][12] is built on top of several other NLP libraries, including Franc and Brain.js. It provides a nice interface into many components of NLP, like classification, sentiment analysis, stemming, named entity recognition, and natural language generation. It also supports quite a few languages, which is helpful if you plan to work in something other than English. Overall, this is a great general tool with a simplified interface into several other great tools. This will likely take you a long way in your applications before you need something more powerful or more flexible.
+
+### Java tools
+
+#### OpenNLP
+
+[OpenNLP][13] is hosted by the Apache Foundation, so it's easy to integrate it into other Apache projects, like Apache Flink, Apache NiFi, and Apache Spark. It is a general NLP tool that covers all the common processing components of NLP, and it can be used from the command line or within an application as a library. It also has wide support for multiple languages. Overall, OpenNLP is a powerful tool with a lot of features and ready for production workloads if you're using Java.
+
+#### StanfordNLP
+
+[Stanford CoreNLP][14] is a set of tools that provides statistical NLP, deep learning NLP, and rule-based NLP functionality. Many other programming language bindings have been created so this tool can be used outside of Java. It is a very powerful tool created by an elite research institution, but it may not be the best thing for production workloads. This tool is dual-licensed with a special license for commercial purposes. Overall, this is a great tool for research and experimentation, but it may incur additional costs in a production system. The Python implementation might also interest many readers more than the Java version. Also, one of the best Machine Learning courses is taught by a Stanford professor on Coursera. [Check it out][15] along with other great resources.
+
+#### CogCompNLP
+
+[CogCompNLP][16], developed by the University of Illinois, also has a Python library with similar functionality. It can be used to process text, either locally or on remote systems, which can remove a tremendous burden from your local device. It provides processing functions such as tokenization, part-of-speech tagging, chunking, named-entity tagging, lemmatization, dependency and constituency parsing, and semantic role labeling. Overall, this is a great tool for research, and it has a lot of components that you can explore. I'm not sure it's great for production workloads, but it's worth trying if you plan to use Java.
+
+* * *
+
+What are your favorite open source tools and libraries for NLP? Please share in the comments—especially if there's one I didn't include.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/natural-language-processing-tools
+
+作者:[Dan Barker (Community Moderator)][a]
+选题:[lujun9972][b]
+译者:[译者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/barkerd427
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_communication_team.png?itok=CYfZ_gE7 (Chat bubbles)
+[2]: http://www.nltk.org/
+[3]: http://www.nltk.org/book_1ed/
+[4]: https://spacy.io/
+[5]: https://textblob.readthedocs.io/en/dev/
+[6]: https://readthedocs.org/projects/textacy/
+[7]: https://pytorchnlp.readthedocs.io/en/latest/
+[8]: https://www.npmjs.com/package/retext
+[9]: https://unified.js.org/
+[10]: https://www.npmjs.com/package/compromise
+[11]: https://www.npmjs.com/package/natural
+[12]: https://www.npmjs.com/package/node-nlp
+[13]: https://opennlp.apache.org/
+[14]: https://stanfordnlp.github.io/CoreNLP/
+[15]: https://opensource.com/article/19/2/learn-data-science-ai
+[16]: https://github.com/CogComp/cogcomp-nlp
diff --git a/sources/tech/20190322 Easy means easy to debug.md b/sources/tech/20190322 Easy means easy to debug.md
new file mode 100644
index 0000000000..4b0b4d52d2
--- /dev/null
+++ b/sources/tech/20190322 Easy means easy to debug.md
@@ -0,0 +1,83 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Easy means easy to debug)
+[#]: via: (https://arp242.net/weblog/easy.html)
+[#]: author: (Martin Tournoij https://arp242.net/)
+
+
+What does it mean for a framework, library, or tool to be “easy”? There are many possible definitions one could use, but my definition is usually that it’s easy to debug. I often see people advertise a particular program, framework, library, file format, or something else as easy because “look with how little effort I can do task X, this is so easy!” That’s great, but an incomplete picture.
+
+You only write software once, but will almost always go through several debugging cycles. With debugging cycle I don’t mean “there is a bug in the code you need to fix”, but rather “I need to look at this code to fix the bug”. To debug code, you need to understand it, so “easy to debug” by extension means “easy to understand”.
+
+Abstractions which make something easier to write often come at the cost of make things harder to understand. Sometimes this is a good trade-off, but often it’s not. In general I will happily spend a little but more effort writing something now if that makes things easier to understand and debug later on, as it’s often a net time-saver.
+
+Simplicity isn’t the only thing that makes programs easier to debug, but it is probably the most important. Good documentation helps too, but unfortunately good documentation is uncommon (note that quality is not measured by word count!)
+
+This is not exactly a novel insight; from the 1974 The Elements of Programming Style by Brian W. Kernighan and P. J. Plauger:
+
+> Everyone knows that debugging is twice as hard as writing a program in the first place. So if you’re as clever as you can be when you write it, how will you ever debug it?
+
+A lot of stuff I see seems to be written “as clever as can be” and is consequently hard to debug. I’ll list a few examples of this pattern below. It’s not my intention to argue that any of these things are bad per se, I just want to highlight the trade-offs in “easy to use” vs. “easy to debug”.
+
+ * When I tried running [Let’s Encrypt][1] a few years ago it required running a daemon as root(!) to automatically rewrite nginx files. I looked at the source a bit to understand how it worked and it was all pretty complex, so I was “let’s not” and opted to just pay €10 to the CA mafia, as not much can go wrong with putting a file in /etc/nginx/, whereas a lot can go wrong with complex Python daemons running as root.
+
+(I don’t know the current state/options for Let’s Encrypt; at a quick glance there may be better/alternative ACME clients that suck less now.)
+
+ * Some people claim that systemd is easier than SysV init.d scripts because it’s easier to write systemd unit files than it is to write shell scripts. In particular, this is the argument Lennart Poettering used in his [systemd myths][2] post (point 5).
+
+I think is completely missing the point. I agree with Poettering that shell scripts are hard – [I wrote an entire post about that][3] – but by making the interface easier doesn’t mean the entire system becomes easier. Look at [this issue][4] I encountered and [the fix][5] for it. Does that look easy to you?
+
+ * Many JavaScript frameworks I’ve used can be hard to fully understand. Clever state keeping logic is great and all, until that state won’t work as you expect, and then you better hope there’s a Stack Overflow post or GitHub issue to help you out.
+
+ * Docker is great, right up to the point you get:
+
+```
+ ERROR: for elasticsearch Cannot start service elasticsearch:
+oci runtime error: container_linux.go:247: starting container process caused "process_linux.go:258:
+applying cgroup configuration for process caused \"failed to write 898 to cgroup.procs: write
+/sys/fs/cgroup/cpu,cpuacct/docker/b13312efc203e518e3864fc3f9d00b4561168ebd4d9aad590cc56da610b8dd0e/cgroup.procs:
+invalid argument\""
+```
+
+or
+
+```
+ERROR: for elasticsearch Cannot start service elasticsearch: EOF
+```
+
+And … now what?
+
+ * Many testing libraries can make things harder to debug. Ruby’s rspec is a good example where I’ve occasionally used the library wrong by accident and had to spend quite a long time figuring out what exactly went wrong (as the errors it gave me were very confusing!)
+
+I wrote a bit more about that in my [Testing isn’t everything][6] post.
+
+ * ORM libraries can make database queries a lot easier, at the cost of making things a lot harder to understand once you want to solve a problem.
+
+
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://arp242.net/weblog/easy.html
+
+作者:[Martin Tournoij][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://arp242.net/
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Let%27s_Encrypt
+[2]: http://0pointer.de/blog/projects/the-biggest-myths.html
+[3]: https://arp242.net/weblog/shell-scripting-trap.html
+[4]: https://unix.stackexchange.com/q/185495/33645
+[5]: https://cgit.freedesktop.org/systemd/systemd/commit/?id=6e392c9c45643d106673c6643ac8bf4e65da13c1
+[6]: /weblog/testing.html
+[7]: mailto:martin@arp242.net
+[8]: https://github.com/Carpetsmoker/arp242.net/issues/new
diff --git a/sources/tech/20190322 How to Install OpenLDAP on Ubuntu Server 18.04.md b/sources/tech/20190322 How to Install OpenLDAP on Ubuntu Server 18.04.md
new file mode 100644
index 0000000000..a4325fe74b
--- /dev/null
+++ b/sources/tech/20190322 How to Install OpenLDAP on Ubuntu Server 18.04.md
@@ -0,0 +1,205 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to Install OpenLDAP on Ubuntu Server 18.04)
+[#]: via: (https://www.linux.com/blog/2019/3/how-install-openldap-ubuntu-server-1804)
+[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
+
+How to Install OpenLDAP on Ubuntu Server 18.04
+======
+
+![OpenLDAP][1]
+
+In part one of this short tutorial series, Jack Wallen explains how to install OpenLDAP.
+
+[Creative Commons Zero][2]
+
+The Lightweight Directory Access Protocol (LDAP) allows for the querying and modification of an X.500-based directory service. In other words, LDAP is used over a Local Area Network (LAN) to manage and access a distributed directory service. LDAPs primary purpose is to provide a set of records in a hierarchical structure. What can you do with those records? The best use-case is for user validation/authentication against desktops. If both server and client are set up properly, you can have all your Linux desktops authenticating against your LDAP server. This makes for a great single point of entry so that you can better manage (and control) user accounts.
+
+The most popular iteration of LDAP for Linux is [OpenLDAP][3]. OpenLDAP is a free, open-source implementation of the Lightweight Directory Access Protocol, and makes it incredibly easy to get your LDAP server up and running.
+
+In this three-part series, I’ll be walking you through the steps of:
+
+ 1. Installing OpenLDAP server.
+
+ 2. Installing the web-based LDAP Account Manager.
+
+ 3. Configuring Linux desktops, such that they can communicate with your LDAP server.
+
+
+
+
+In the end, all of your Linux desktop machines (that have been configured properly) will be able to authenticate against a centralized location, which means you (as the administrator) have much more control over the management of users on your network.
+
+In this first piece, I’ll be demonstrating the installation and configuration of OpenLDAP on Ubuntu Server 18.04. All you will need to make this work is a running instance of Ubuntu Server 18.04 and a user account with sudo privileges.
+Let’s get to work.
+
+### Update/Upgrade
+
+The first thing you’ll want to do is update and upgrade your server. Do note, if the kernel gets updated, the server will need to be rebooted (unless you have Live Patch, or a similar service running). Because of this, run the update/upgrade at a time when the server can be rebooted.
+To update and upgrade Ubuntu, log into your server and run the following commands:
+
+```
+sudo apt-get update
+
+sudo apt-get upgrade -y
+```
+
+When the upgrade completes, reboot the server (if necessary), and get ready to install and configure OpenLDAP.
+
+### Installing OpenLDAP
+
+Since we’ll be using OpenLDAP as our LDAP server software, it can be installed from the standard repository. To install the necessary pieces, log into your Ubuntu Server and issue the following command:
+
+### sudo apt-get instal slapd ldap-utils -y
+
+During the installation, you’ll be first asked to create an administrator password for the LDAP directory. Type and verify that password (Figure 1).
+
+![password][4]
+
+Figure 1: Creating an administrator password for LDAP.
+
+[Used with permission][5]
+
+Configuring LDAP
+
+With the installation of the components complete, it’s time to configure LDAP. Fortunately, there’s a handy tool we can use to make this happen. From the terminal window, issue the command:
+
+```
+sudo dpkg-reconfigure slapd
+```
+
+In the first window, hit Enter to select No and continue on. In the second window of the configuration tool (Figure 2), you must type the DNS domain name for your server. This will serve as the base DN (the point from where a server will search for users) for your LDAP directory. In my example, I’ve used example.com (you’ll want to change this to fit your needs).
+
+![domain name][6]
+
+Figure 2: Configuring the domain name for LDAP.
+
+[Used with permission][5]
+
+In the next window, type your Organizational name (ie the name of your company or department). You will then be prompted to (once again) create an administrator password (you can use the same one as you did during the installation). Once you’ve taken care of that, you’ll be asked the following questions:
+
+ * Database backend to use - select **MDB**.
+
+ * Do you want the database to be removed with slapd is purged? - Select **No.**
+
+ * Move old database? - Select **Yes.**
+
+
+
+
+OpenLDAP is now ready for data.
+
+### Adding Initial Data
+
+Now that OpenLDAP is installed and running, it’s time to populate the directory with a bit of initial data. In the second piece of this series, we’ll be installing a web-based GUI that makes it much easier to handle this task, but it’s always good to know how to add data the manual way.
+
+One of the best ways to add data to the LDAP directory is via text file, which can then be imported in with the __ldapadd__ command. Create a new file with the command:
+
+```
+nano ldap_data.ldif
+```
+
+In that file, paste the following contents:
+
+```
+dn: ou=People,dc=example,dc=com
+
+objectClass: organizationalUnit
+
+ou: People
+
+
+dn: ou=Groups,dc=EXAMPLE,dc=COM
+
+objectClass: organizationalUnit
+
+ou: Groups
+
+
+dn: cn=DEPARTMENT,ou=Groups,dc=EXAMPLE,dc=COM
+
+objectClass: posixGroup
+
+cn: SUBGROUP
+
+gidNumber: 5000
+
+
+dn: uid=USER,ou=People,dc=EXAMPLE,dc=COM
+
+objectClass: inetOrgPerson
+
+objectClass: posixAccount
+
+objectClass: shadowAccount
+
+uid: USER
+
+sn: LASTNAME
+
+givenName: FIRSTNAME
+
+cn: FULLNAME
+
+displayName: DISPLAYNAME
+
+uidNumber: 10000
+
+gidNumber: 5000
+
+userPassword: PASSWORD
+
+gecos: FULLNAME
+
+loginShell: /bin/bash
+
+homeDirectory: USERDIRECTORY
+```
+
+In the above file, every entry in all caps needs to be modified to fit your company needs. Once you’ve modified the above file, save and close it with the [Ctrl]+[x] key combination.
+
+To add the data from the file to the LDAP directory, issue the command:
+
+```
+ldapadd -x -D cn=admin,dc=EXAMPLE,dc=COM -W -f ldap_data.ldif
+```
+
+Remember to alter the dc entries (EXAMPLE and COM) in the above command to match your domain name. After running the command, you will be prompted for the LDAP admin password. When you successfully authentication to the LDAP server, the data will be added. You can then ensure the data is there, by running a search like so:
+
+```
+ldapsearch -x -LLL -b dc=EXAMPLE,dc=COM 'uid=USER' cn gidNumber
+```
+
+Where EXAMPLE and COM is your domain name and USER is the user to search for. The command should report the entry you searched for (Figure 3).
+
+![search][7]
+
+Figure 3: Our search was successful.
+
+[Used with permission][5]
+
+Now that you have your first entry into your LDAP directory, you can edit the above file to create even more. Or, you can wait until the next entry into the series (installing LDAP Account Manager) and take care of the process with the web-based GUI. Either way, you’re one step closer to having LDAP authentication on your network.
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/2019/3/how-install-openldap-ubuntu-server-1804
+
+作者:[Jack Wallen][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/jlwallen
+[b]: https://github.com/lujun9972
+[1]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldap.png?itok=r9viT8n6 (OpenLDAP)
+[2]: /LICENSES/CATEGORY/CREATIVE-COMMONS-ZERO
+[3]: https://www.openldap.org/
+[4]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldap_1.jpg?itok=vbWScztB (password)
+[5]: /LICENSES/CATEGORY/USED-PERMISSION
+[6]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldap_2.jpg?itok=10CSCm6Z (domain name)
+[7]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ldap_3.jpg?itok=df2Y65Dv (search)
diff --git a/sources/tech/20190718 3 Emacs modes for taking notes.md b/sources/tech/20190718 3 Emacs modes for taking notes.md
new file mode 100644
index 0000000000..2627357182
--- /dev/null
+++ b/sources/tech/20190718 3 Emacs modes for taking notes.md
@@ -0,0 +1,74 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (3 Emacs modes for taking notes)
+[#]: via: (https://opensource.com/article/18/7/emacs-modes-note-taking)
+[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
+
+3 Emacs modes for taking notes
+======
+Keep track of information easily with these Emacs modes.
+
+
+No matter what line of work you're in, it's inevitable you have to take a few notes. Often, more than a few. If you're like many people in this day and age, you take your notes digitally.
+
+Open source enthusiasts have a variety of options for jotting down their ideas, thoughts, and research in electronic format. You might use a [web-based tool][1]. You might go for a [desktop application][2]. Or, you might [turn to the command line][3].
+
+If you use [Emacs][4], that wonderful operating system disguised as a text editor, there are modes that can help you take notes more efficiently. Let's look at three of them.
+
+### Deft
+
+
+On those rare occasions I'm forced to use a Mac, there's one tool I can't do without: the [nvALT][5] note-taking application. [Deft mode][6] brings the nvALT experience to Emacs.
+
+Deft stores your notes as text files in a single folder on your computer. When you enter Deft mode, it displays a list of your notes along with a short summary. The summary is taken from the first line of the text file. If you add, say, Markdown, LaTeX, or even Emacs Org mode formatting to the first line, Deft ignores the formatting and displays only the text.
+
+To open a note, just scroll down to it and press Enter. Deft does a bit more, though. According to Deft's developer, Jason Blevins, its _primary operation is searching and filtering_. Deft does that simply but efficiently. Type a keyword and Deft displays only the notes that have that keyword in their title. That's useful if you have a lot of notes and want to find one quickly.
+
+### Org mode
+
+
+There would be a couple or three people who would have jumped all over me if I didn't include [Org mode][7] in this article. Why? It's arguably the most flexible and the most widely used Emacs mode for taking notes. Used in the right way, Org mode can supercharge your note-taking.
+
+Org mode's main strength is how it organizes your notes. In Org mode, a note file is set up as a large outline. Each section is a node in the outline, which you can expand and collapse. Those sections can have subsections, which also expand and collapse. That not only lets you focus on one section at a time, but it also gives you an at-a-glance overview of the information you have.
+
+You can [link][8] between sections of your notes, quickly move sections without cutting and pasting, and [attach files][9] to your notes. Org mode supports character formatting and tables. If you need to convert your notes to something else, Org mode has a number of [export options][10].
+
+### Howm
+
+
+
+When I started using Emacs regularly, [howm][11] quickly became one of the modes I leaned heavily on. And even though I'm deep into using Org mode, I still have a soft spot for howm.
+
+Howm acts like a small wiki. You can create notes and task lists and link between them. By typing or clicking a link, you can jump between notes. If you need to, you can also tag your notes with a keyword. On top of that, you can search, sort, and concatenate your notes.
+
+Howm isn't the prettiest Emacs mode, and it doesn't have the best UX. It takes a bit of getting used to. Once you do, taking and maneuvering around notes is a breeze.
+
+Do you have a favorite Emacs mode for taking notes? Feel free to share it by leaving a comment.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/7/emacs-modes-note-taking
+
+作者:[Scott Nesbitt][a]
+选题:[lujun9972][b]
+译者:[译者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
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/alternatives/evernote
+[2]: https://opensource.com/life/16/9/4-desktop-note-taking-applications
+[3]: https://opensource.com/article/18/3/command-line-note-taking-applications
+[4]: https://www.gnu.org/software/emacs/
+[5]: http://brettterpstra.com/projects/nvalt/
+[6]: https://jblevins.org/projects/deft/
+[7]: https://orgmode.org/
+[8]: https://orgmode.org/org.html#Hyperlinks
+[9]: https://orgmode.org/org.html#Attachments
+[10]: https://orgmode.org/org.html#Exporting
+[11]: https://howm.osdn.jp/
diff --git a/translated/talk/20180206 Building Slack for the Linux community and adopting snaps.md b/translated/talk/20180206 Building Slack for the Linux community and adopting snaps.md
deleted file mode 100644
index ef97cf3485..0000000000
--- a/translated/talk/20180206 Building Slack for the Linux community and adopting snaps.md
+++ /dev/null
@@ -1,71 +0,0 @@
-为 Linux 社区采用 snaps 搭建 Slack
-======
-![][1]
-
-作为一个被数以百万计用户使用的企业级软件平台,[Slack][2] 允许任意规模的团队和企业有效地沟通。Slack 通过在一个单一集成环境中与其它软件工具无缝衔接,为一个组织内的通讯、信息和项目提供了一个易于接触的档案馆。尽管自从诞生后 Slack 就在过去四年中快速成长,但是他们负责该平台跨 Windows、MacOS 和 Linux 运行的桌面工程师团队仅由四人组成。我们通过与在这个团队中负责追踪[上月首发的 Slack snap][3] 的主任工程师 Felix Rieseberg 交谈,来探索更多有关该公司对于 Linux 社区的态度以及他们决定搭建一个 snap 的原因。
-
-[安装 Slack snap][4]
-
-### 你们能告诉我们更多关于已发布的 Slack snap 的信息吗?
-
-我们上月发布了我们的第一个 snap 作为我们为Linux 社区的一种新的发布形式。在企业界,我们发现人们更倾向于以一种相对于个人消费者较慢的速度来采用新科技, 因此我们将会在未来继续提供 .deb 形式的 snap。
-
-### 你们觉得 Linux 社区会对 Slack 有多大的兴趣呢?
-
-在所有的平台上人们对 Slack 的兴趣都正在增长,这一点使我感到十分兴奋。因此这对于我们来说,很难说源自 Linux 社区的兴趣和我们大体上所见到的兴趣有什么区别。当然,不管用户们在什么平台上面工作,满足他们对我们都是很重要的。我们有一个专门负责 Linux 的测试工程师并且我们同时也尽全力提供最好的用户体验。只是我们发现总体相对于 Windows 来说,为 Linux 搭建 snap 略微有点难度,因为我们是在一个较难以预测的平台上工作——而这正是 Linux 社区之光照耀的领域。在汇报程序缺陷以及寻找程序崩溃原因方面,我们有相当多数极富帮助的用户。
-
-### 你们是如何得知 snap 的?
-
-Canonical 公司的 Martin Wimpress 和我接触并向我解释了 snap 的概念。说实话尽管我也用 Ubuntu 但最初我还是迟疑的,因为它看起来像需要搭建与维护的另一套标准。尽管如此,一当我了解到其中的好处之后,我确信这是一笔有回报的投入。
-
-### snap 的什么方面吸引了你们并使你们决定投入其中?
-
-毫无疑问,我们决定搭建 snap 最重要的原因是它的更新特性。在 Slack 上我们大量运用网页技术,这些技术反过来也使得我们提供大量的特性——比如将 YouTube 视频或者 Spotify 播放列表集成在 Slack 中。与浏览器十分相似,这意味着我们需要频繁更新应用。
-
-在 MacOS 和 Windows 上,我们已经有了一个甚至无需用户考虑更新的专门的自动更新器。我们发现哪怕是为了更新,任何形式的中断都是一种我们需要避免的烦恼。因此通过 snap 自动化的更新就显得无缝和便捷得多。
-
-### 相比于其它形式的打包方式,搭建 snap 感觉如何? 将它与现有的设施和进程集成在一起有多简便呢?
-
-就 Linux 而言,我们尚未尝试其它新的打包方式,但我们迟早会的。鉴于我们的大多数用户都使用 Ubuntu,snap 是一个很简便的选项。同时 snap 在其它发行版上同样也可以使用,这也是一个巨大的加分项。Canonical 正将 snap 做到跨发行版而不是仅仅集中在 Ubuntu 上,这一点我认为是很好的。
-
-搭建 snap 简单得出乎意料,我们有一个创建安装器和软件包的统一流程,我们的 snap 创建过程从一个 .deb 软件包炮制出一个 snap。对于其它技术而言,有时候我们不得不为了支持搭建链先造一个内部工具。但是 snapcraft 工具正是我们需要的东西。在整个过程中 Canonical 的团队不可思议般得有助,因为我们一路上确实碰到了一些问题。
-
-### 你们觉得 snap 商店是如何改变用户们寻找、安装你们软件的方式的呢?
-
-Slack 真正的独特之处在于人们不仅仅是碰巧发现它,他们从别的地方知道它并积极地试图找到它。因此尽管我们已经有了相当高的觉悟,我希望对于我们的用户来说,在商店中可以获得 snap 能够让安装过程变得简单一点。
-
-### 你们对用 snap 而不是为了其它发行版不得不再发行软件包有什么期待,或者有什么已经是你们可见的节省呢?
-
-我们希望 snap 可以给予我们的用户更多的便利并确保他们能够更加享受使用 Slack。在我们看来,鉴于用户们不必被困在之前的版本,这自然而然地解决了许多问题,因此 snap 可以让我们在客户支持方面节约时间。有 snap 对我们来说也是一个额外的加分项,因为我们能有一个可供搭建的平台而不是替换我们现有的东西。
-
-### 如果存在的话,你们正使用或者准备使用边缘 (edge)、测试 (beta)、候选 (candidate)、稳定 (stable) 中的哪种发行频道?
-
-我们仅仅在开发中使用边缘 (edge) 频道以与 Canonical 的团队共享。为 Linux 打造的 Slack 总体任在测试 (beta) 频道中。但是长远来看,拥有不同频道的选项十分有意思,同时能够提早一点为感兴趣的客户发行版本也肯定是有好处的。
-
-### 你们认为将软件打包成一个 snap 是如何能够帮助用户的?你们从用户那边得到了什么反馈吗?
-
-对我们的用户来说一个很大的好处是安装和更新总体来说都会变得简便一点。长远来看,问题在于“那些安装 snap 的用户是不是比其它用户少碰到一些困难?”,我十分期望 snap 自带的依赖关系能够使其变成可能。
-
-### 你们有什么会和刚使用 snap 的新用户们分享的建议或知识呢?
-
-我会推荐从 Debian 软件包来着手搭建你们的 snap——那出乎意料得简单。这同样也缩小了开始的范围避免变得不堪重负。这只需要投入相当少的时间,并且很大可能是一笔值得的投入。同样如果你们可以的话,尽量试着找到 Canonical 的人员来协作——他们拥有了不起的工程师。
-
-### 对于开发来说,你们在什么地方看到了最大的机遇?
-
-我们现在正一步步来,先是让人们用上 snap,再从那里开始搭建。正在使用 snap 的人们将会感到更加稳健因为他们将会得益于最新的更新。
-
---------------------------------------------------------------------------------
-
-via: https://insights.ubuntu.com/2018/02/06/building-slack-for-the-linux-community-and-adopting-snaps/
-
-作者:[Sarah][a]
-译者:[tomjlw](https://github.com/tomjlw)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://insights.ubuntu.com/author/sarahfd/
-[1]:https://insights.ubuntu.com/wp-content/uploads/a115/Slack_linux_screenshot@2x-2.png
-[2]:https://slack.com/
-[3]:https://insights.ubuntu.com/2018/01/18/canonical-brings-slack-to-the-snap-ecosystem/
-[4]:https://snapcraft.io/slack/
diff --git a/translated/talk/20180809 Two Years With Emacs as a CEO (and now CTO).md b/translated/talk/20180809 Two Years With Emacs as a CEO (and now CTO).md
deleted file mode 100644
index b25721a59b..0000000000
--- a/translated/talk/20180809 Two Years With Emacs as a CEO (and now CTO).md
+++ /dev/null
@@ -1,87 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (oneforalone)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Two Years With Emacs as a CEO (and now CTO))
-[#]: via: (https://www.fugue.co/blog/2018-08-09-two-years-with-emacs-as-a-cto.html)
-[#]: author: (Josh Stella https://www.fugue.co/blog/author/josh-stella)
-
-作为 CEO 使用 Emacs 的两年经验之谈(现任 CTO)
-======
-
-两年前,我写了一篇[博客][1],并取得了一些反响。这让我有点受宠若惊。那篇博客写的是我准备将 Emacs 作为我的主办公软件,当时我还是 CEO,现在已经转为 CTO 了。现在回想起来,我发现我之前不是做程序员就是做软件架构师,而且那时我也喜欢用 Emacs 写代码。重新考虑 Emacs 是一次很不错的尝试,但我不太清楚具体该怎么实现。在网上,那篇博客也是褒贬不一,但是还是有数万的阅读量,所以总的来说,我写的还是不错的。在 [Reddit][2] 和 [HackerNews][3] 上有些令人哭笑不得的回复,说我的手会变形,或者说我会因白色的背景而近视。在这里我可以很肯定的回答 —— 完全没有这回事,相反,我的手腕还因此变得更灵活了。还有一些人担心,说使用 Emacs 会耗费一个 CEO 的精力。把 Fugue 从在家得到的想法变成强大的产品,并有一大批忠实的顾客,我觉得 Emacs 可以让你从复杂的事务中解脱出来。我现在还在用白色的背景。
-
-近段时间那篇博客又被翻出来了,并发到了 [HackerNews][4] 上。我收到了大量的跟帖者问我现在怎么样了,所以我写这篇博客来回应他们。在本文中,我还将重点讨论为什么 Emacs 和函数式编程有很高的相关性,以及我们是怎样使用 Emacs 来开发我们的产品 —— Fugue,一个使用函数式编程的自动化的云计算平台。由于我收到了很多反馈,比较有用的是一些细节的详细程度和有关背景色的注解,因此这篇博客比较长,而我确实也需要费点精力来解释我的想法,但这篇文章的主要内容还是反映了我担任 CEO 时处理的事务。而我想在之后更频繁地用 Emacs 写代码,所以需要提前做一些准备。一如既往,本文因人而异,后果自负。
-
-### 意外之喜
-
-我大部分时间都在不断得处理公司内外沟通。交流是解决问题的唯一方法,但也是反思及思考困难或是复杂问题的敌人。对我来说,作为创业公司的 CEO,最需要的是有时间专注工作而不别打扰。一旦开始投入时间来学习一些命令,Emacs 就很适合这种情况。其他的应用弹出提示,但是配置好了的 Emacs 就可以完全的忽略掉,无论是视觉上还是精神上。除非你想修改,否则的话他不会变,而且没有比空白屏幕和漂亮的字体更干净的界面了。在我不断被打扰的情况下,这种简洁让我能够专注于我在想什么,而不是电脑。好的程序能够默默地对电脑的进行访问。
-
-一些人指出,原来的帖子既是对现代图形界面的批判,也是对 Emacs 的赞许。我既不赞同,也不否认。现代的接口,特别是那些以应用程序为中心的方法(相对于以内容为中心的方法),既不是以用户为中心的,也不是面向进程的。Emacs 避免了这种错误,这也是我如此喜欢它的部分原因,而它也带来了其他优点。Emacs 是进入计算机本身的入口,这打开了一扇新世界的大门。它的核心是发现和创造属于自己的道路,对我来说这就是创造的定义。现代电脑的悲哀之处在于,它很大程度上是由带有闪亮界面的黑盒组成的,这些黑盒提供的是瞬间的满足感,而不是真正的满足感。这让我们变成了消费者,而不是技术的创造者。我不在乎你是谁或者你的背景是什么;你可以理解你的电脑,你可以用它做东西。它很有趣,令人满意,而且不是你想的那么难学!
-
-我们常常低估了环境对我们心理的影响。Emacs 给人一种平静和自由的感觉,而不是紧迫感、烦恼或兴奋——后者是思想和沉思的敌人。我喜欢那些持久的,不碍事的东西,当我花时间去关注它们的时候,它们会给我带来真知灼见。Emacs 满足我的所有这些标准。我每天都使用 Emacs 来创建内容,我也很高兴我很少考虑它。Emacs 确实有一个学习曲线,但不会比学自行车更陡,而且一旦你完成了它,你会得到相应的回报,你就不必再去想它了,它赋予你一种其他工具所没有的自由感。这是一个优雅的工具,来自一个更加文明的时代。我很高兴我们步入了另一个计算机时代,而 Emacs 也将越来越受欢迎。
-
-### 放弃用 Emacs 规划日程及处理待办事项
-
-在原来的文章中,我花了一些时间介绍如何使用 Org 模式来规划日程。我放弃了使用 Org 模式来处理待办事项之类的,因为我每天都有很多会要开,很多电话要打, 而我也不能让其他人来适应我选的工具,我也没有时间将事务转换或是自动移动到 Org 上 。我们主要是用 Mac shop,使用谷歌日历等,原生的 Mac OS/iOS 工具可以很好的进行协作。我还有支比较旧的笔用来在会议中做笔记,因为我发现在会议中使用笔记本电脑或者说键盘很不礼貌,而且这也限制了我的聆听和思考。因此,我基本上放弃了用 Org 帮我规划日程或安排生活的想法。当然,Org 模式对其他的方面也很有用,它是我编写文档的首选,包括本文。换句话说,我与其作者背道而驰,但它在这方面做得很好。我也希望有一天也有人这么说我们在 Fugue 的工作。
-
-### Emacs 在 Fugue 已经扩散
-
-我在上篇博客就有说,你可能会喜欢 Emacs,也可能不会。因此,当 Fugue 的文档组将 Emacs 作为标准工具时,我是有点担心的,因为我觉得他们可能是受了我的影响。几年后,我确信他们做出了个正确的选择。那个组长是一个很聪明的程序员,但是那两个编写文档的人却没有怎么接触过技术。我想,如果这是一个经理强加错误工具的案例,我就会得到投诉并去解决,因为 Fugue 有反威权文化,大家不怕惹麻烦,包括我在内。之前的组长去年辞职了,但[文档组][5]现在有了一个灵活的集成的 CI/CD 工具链。并且文档组的人已经成为了 Emacs 的忠实用户。Emacs 有一条学习曲线,但即使很陡,也不会那么陡,翻过后对生产力和总体幸福感都有益。这也提醒我们,学文科的人在技术方面和程序员一样聪明,一样能干,也许不应该那么倾向于技术而产生派别歧视。
-
-### 我的手腕得益于我的决定
-
-上世纪80年代中期以来,我每天花12个小时左右在电脑前工作,这给我的手腕(以及后背)造成了很大的损伤,在此我强烈安利 Tag Capisco 的椅子。Emacs 和人机工程学键盘的结合让手腕的 [RSI][10](Repetitive Strain Injury/Repetitive Motion Syndrome) 问题消失了,我已经一年多没有想过这种问题了。在那之前,我的手腕每天都会疼,尤其是右手,如果你也遇到这种问题,你就知道这很让人分心和担心。有几个人问过键盘和鼠标的问题,如果你感兴趣的话,我现在用的是[这款键盘][6]。虽然在过去的几年里我主要使用的是真正符合人体工程学的键盘。我已经换成现在的键盘有几个星期了,而且我爱死它了。键帽的形状很神奇,因为你不用看就能知道自己在哪里,而拇指键设计的很合理,尤其是对于 Emacs, Control和Meta是你的固定伙伴。不要再用小指做高度重复的任务了!
-
-我使用鼠标的次数比使用 Office 和 IDE 时要少得多,这对我有很大帮助,但我还是会用鼠标。我一直在使用外观相当过时,但功能和人体工程学明显优越的轨迹球,这是名副其实的。
-
-撇开具体的工具不谈,最重要的一点是,事实证明,一个很棒的键盘,再加上避免使用鼠标,在减少身体的磨损方面很有效。Emacs 是这方面的核心,因为我不需要在菜单上滑动鼠标来完成任务,而且导航键就在我的手指下面。我肯定,手离开标准打字姿势会给我的肌腱造成很大的压力。这因人而异,我也不是医生。
-
-### 还没完成大部分配置……
-
-有人说我会在界面配置上花很多的时间。我想验证下他们说的对不对,所以我留意了下。我不仅让配置基本上不受影响,关注这个问题还让我意识到我使用的其他工具是多么的耗费我的精力和时间。Emacs 是我用过的维护成本最低的软件。Mac OS 和 Windows 一直要求我更新它,但在我我看来,这远没有 Adobe 套件和 Office 的更新的困恼那么大。我只是偶尔更新 Emacs,但也没什么变化,所以对我来说,它基本上是一个接近于零成本的操作,我高兴什么时候跟新就什么时候更新。
-
-有一点然你们失望了,因为许多人想知道我为跟上 Emacs 社区的更新及其输出所做的事情,但是在过去的两年中,我只在配置中添加了一些内容。我认为也是成功的,因为 Emacs 只是一个工具,而不是我的爱好。也就是说,如果你想和我分享,我很乐意听到新的东西。
-
-### 期望实现控制云端
-
-我们在 Fugue 有很多 Emacs 的粉丝,所以我们有一段时间在用 [Ludwing 模式][7]。Ludwig 是我们用于自动化云基础设施和服务的声明式、功能性的 DSL。最近,Alex Schoof 利用飞机上和晚上的时间来构建 fugue 模式,它在 Fugue CLI 上充当 Emacs 控制台。要是你不熟悉 Fugue,我们会开发一个云自动化和管理工具,它利用函数式编程为用户提供与云的 api 交互的良好体验。它做的不止这些,但它也做了。fugue 模式很酷的原因有很多。它有一个不断报告云基础设备状态的缓冲区,而由于我经常修改这些设备,所以我可以快速看到编码的效果。Fugue 将云工作负载当成进程处理,fugue 模式非常类似于云工作负载的 top 模式。它还允许我执行一些操作,比如创建新的设备或删除过期的东西,而且也不需要太多输入。Fugue 模式只是个雏形,但它非常方便,而我现在也经常使用它。
-
-![fugue-mode-edited.gif][8]
-
-### 模式及监听
-
-我添加了一些模式和集成插件,但并不是真正用于 CEO 工作。我喜欢在周末时写写 Haskell 和 Scheme,所以我添加了 haskell 模式和 geiser。Emacs 对具有 REPL 的语言很友好,因为你可以在不同的窗口中运行不同的模式,包括 REPL 和 shell。Geiser 和 Scheme 很配,要是你还没有这样做过,那么用 SICP 工作也不失为一种乐趣,在这个有很多土鳖编程的例子的时代,这可能是一种启发。安装 MIT Scheme 和 geiser,你就会感觉有点像 lore 的符号环境。
-
-这就引出了我在 15 年的文章中没有提到的另一个话题:屏幕管理。我喜欢使用用竖屏来写作,我在家里和我的主要办公室都有这个配置。对于编程或混合使用,我喜欢 fuguer 提供的新的超宽显示器。对于宽屏,我更喜欢将屏幕分成三列,中间是主编辑缓冲区,左边是水平分隔的 shell 和 fugue 模式缓冲区,右边是文档缓冲区或另一个或两个编辑缓冲区。这个很简单,首先按 'Ctl-x 3' 两次,然后使用 'Ctl-x =' 使窗口的宽度相等。这将提供三个相等的列,你也可以使用 'Ctl-x 2' 进行水平分割。以下是我的截图。
-
-![Emacs Screen Shot][9]
-
-### 最后一篇 CEO/Emacs 文章……
-
-首先,我现在是 Fugue 的 CTO,其次我也想要写一些其他方面的博客,而我现在刚好有时间。我还打算写些更深入的东西,比如说函数式编程、基础结构类型安全,以及我们即将推出一些的新功能,还有一些关于 Fugue 在云上可以做什么。
-
---------------------------------------------------------------------------------
-
-via: https://www.fugue.co/blog/2018-08-09-two-years-with-emacs-as-a-cto.html
-
-作者:[Josh Stella][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/oneforalone)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.fugue.co/blog/author/josh-stella
-[b]: https://github.com/lujun9972
-[1]: https://blog.fugue.co/2015-11-11-guide-to-emacs.html
-[2]: https://www.reddit.com/r/emacs/comments/7efpkt/a_ceos_guide_to_emacs/
-[3]: https://news.ycombinator.com/item?id=10642088
-[4]: https://news.ycombinator.com/item?id=15753150
-[5]: https://docs.fugue.co/
-[6]: https://shop.keyboard.io/
-[7]: https://github.com/fugue/ludwig-mode
-[8]: https://www.fugue.co/hubfs/Imported_Blog_Media/fugue-mode-edited-1.gif
-[9]: https://www.fugue.co/hs-fs/hubfs/Emacs%20Screen%20Shot.png?width=929&name=Emacs%20Screen%20Shot.png
-[10]: https://baike.baidu.com/item/RSI/21509642
diff --git a/translated/talk/20190114 Remote Working Survival Guide.md b/translated/talk/20190114 Remote Working Survival Guide.md
deleted file mode 100644
index 54893cbdca..0000000000
--- a/translated/talk/20190114 Remote Working Survival Guide.md
+++ /dev/null
@@ -1,129 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (beamrolling)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Remote Working Survival Guide)
-[#]: via: (https://www.jonobacon.com/2019/01/14/remote-working-survival/)
-[#]: author: (Jono Bacon https://www.jonobacon.com/author/admin/)
-
-远程工作生存指南
-======
-
-
-远程工作似乎是最近的一个热门话题。CNBC 报道称, [70% 的专业人士至少每周在家工作一次][1]。同样地,CoSo Cloud 调查发现, [77% 的人在远程工作时效率更高][2] ,而 aftercollege 的一份调查显示, [8% 的千禧一代会更多地考虑提供远程工作的公司][3]。 这看起来很合理:技术,网络以及文化似乎越来越推动远程工作的发展。哦,自制咖啡也比以前任何时候更好喝了。
-
-目前,我准备写另一篇关于公司如何优化远程工作的文章(所以请确保你加入我们的会员以持续关注——这是免费的)。
-
-但今天,我想 **分享一些个人如何做好远程工作的建议**。 不管你是全职远程工作者,或者是可以选择一周某几天在家工作的人,希望这篇文章对你有用。
-
-眼下,你需要明白, **远程工作不是万能药**。当然,穿着睡衣满屋子乱逛,听听反社会音乐,喝一大杯咖啡看起来似乎挺完美的,但这不适合每个人。
-
-有的人需要办公室的结构。有的人需要办公室的社会元素。有的人需要从家里走出来。有的人在家里缺乏保持关注的纪律。有的人因为好几年未缴退税而避免政府工作人员来住处敲门。
-
-**远程工作就好像一块肌肉:如果你锻炼并且保持它,那么它能带来极大的力量和能力**。 如果不这么做,结果就不一样了。
-
-在我职业生涯的大多数时间里,我在家工作。我喜欢这么做。当我在家工作的时候,我更有效率,更开心,更有能力。我并非不喜欢在办公室工作,我享受办公室的社会元素,但我更喜欢在家工作时我的“空间”。 我喜欢听重金属音乐,但当整个办公室的人不想听到 [After The Burial][5] 的时候,这会引起一些问题。
-![][6]
-“Squirrel.”
-[图片来源][7]
-
-已经学会了如何正确平衡工作,旅行以及其他元素来管理我的远程工作,以下是我的一些建议。 请务必**在评论中分享一些你的建议**。
-
-### 1\.你需要训练和习惯(以及了解你的“波浪”)
-
-远程工作确实是需要训练的一块肌肉。就像构建真正的肌肉一样,它需要一个清楚的惯例和一小块健康的训练混合起来。
-
-永远保持穿戴整齐(不要穿睡衣)。设置你一天工作的开始和结束时间(大多时候我从早上9点工作到下午6点)。选好你的午餐休息时间(我的是中午12点)。选好你的早晨仪式(我的是电子邮件,紧接着是全面审查客户需求)。决定你的主工作地在哪(我的主工作地是我家里的工作室)。决定好每天你什么时候运动(大多数时候我在下午5点运动)。
-
-**设计一个实际的习惯并坚持66天**。构建一个习惯需要很长时间,不要尝试着背离你的习惯。你越坚持这个习惯,做下去所花费的功夫越少。在这66天的末尾,你想都不会想,自然而然地就按习惯去做了。
-
-话虽这么说,我们又不住在真空里 ([更干净,或者别的什么][8])。我们都有自己的“波浪”。
-
-“波浪”是你为了改变做事的方法时,对日常做出的一些改变。举个例子,夏天的时候我通常需要更多的阳光。那时我经常会在室外的花园工作。临近假期的时候我更容易分心,所以我在上班时间会更需要呆在室内。有时候我只想要多点人际接触,因此我会在咖啡馆工作几周。有时候我就是喜欢在厨房或者长椅上工作。你需要学习你的“波浪”并倾听你的身体。 **首先构建你自己的兴趣,然后在你认识到自己的“波浪”的时候再对它进行适当的修改**。
-
-### 2\. 和你的同事以及上司一起设立预期
-
-不是每个人都知道怎么远程工作,如果你的公司对远程工作没那么熟悉,你尤其需要和同事一起设立预期。
-
-这件事十分简单:**当你要设计自己的工作日常的时候,清楚地跟你的上司和团队进行交流。**让他们知道如何找到你,紧急情况下如何联系你,以及你在家的时候如何保持合作。
-
-这里的通信构件至关重要。有些远程工作者很怕离开他们的电脑,因为害怕当他们不在的时候有人给他们发消息(他们担心别人会觉得他们在边吃奇多边看 Netflix)。
-
-你需要离开一会的时间。你需要吃午餐的时候眼睛不用一直盯着电脑屏幕。你又不是911接线员。 **设定预期以后,有时候你可能不能立刻回复,但你会尽快回复**。
-
-同样地,设定你的一般可用性的预期。举个例子,我对客户设立的预期是我一般每天早上9点到下午6点工作。当然,如果某个客户急需某样东西,我很乐意在这段时间外回应他,但作为一个一般性规则,我通常只在这段时间内工作。这对于生活的平衡是必要的。
-
-### 3\. 分心是你的敌人,它们需要管理
-
-我们都会分心,这是人类的本能。让你分心的事情可能是你的孩子回家了,想玩变形金刚:救援机器人;可能是看看Facebook,Instagram,或者 Twitter 以确保你不会错过任何不受欢迎的政治观点,或者某人的午餐图片;可能是你生活中即将到来的某件事带走了你的注意力(例如,即将举办的婚礼,活动,或者一次大旅行)。
-
-**你需要明白什么让你分心以及如何管理它**。举个例子,我知道我的电子邮件和 Twitter 会让我分心。我经常查看它们,并且每次查看都会让我脱离我正在工作的空间。拿水或者咖啡的时候我总会分心去吃零食,看 Youtube 的视频。
-
-![][9]
-我的分心克星
-
-由电子产品造成的分心有一个简单对策:**锁起来**。直到你完成你手头的事情再关闭选项卡。有繁重的工作的时候我总这么干:我把让我分心的东西锁起来,直到做完手头的工作。这需要控制能力,但所有的一切都需要。
-
-因为别人影响而分心的元素更难解决。如果你是有家庭的人,你需要在你工作的时候不被打扰,你通常需要独处。这也是为什么家庭办公室这么重要:你需要设一些“爸爸/妈妈正在工作”的界限。如果有急事才能进来,否则让孩子自个儿玩去。
-
-把让你分心的事分开有许多方法:把你的电话静音;把自己的状态设成“离开”;换到一个没有让你分心的事的房间(或建筑物)。再重申一次,了解是什么让你分心并控制好它。如果不这么做,你会永远被分心的事摆布。
-
-### 4\. (良好的)关系需要面对面的关注
-
-有的角色比其他角色与远程工作更合拍。例如,我见过工程、质量保证、支持、安全以及其他团队(通常更专注于数字协作)的出色工作。其他团队,如设计或营销,往往在远程环境下更难熬(因为它们更注重触觉)。
-
-但是,对于任何团队而言,建立牢固的关系至关重要,而现场讨论,协作和社交很有必要。我们的许多感官(例如肢体语言)在数字环境中被删除,这些在我们建立信任和关系的方式中发挥着关键作用。
-
-![][10]
-火箭也很有帮助
-
-这尤为重要,如果(a)你初来这家公司,需要建立关系;(b)你是一个新角色,需要和你的团队建立关系;或者(c)你处于领导地位,建立买入和参与是你工作的关键部分。
-
-**解决方法是?合理搭配远程工作与面对面的时间。** 如果你的公司就在附近,可以用一部分的时间在家工作,一部分时间在公司工作。如果你的公司比较远,安排定期前往办公室(并对你的上司设定你需要这么做的预期)。例如,当我在 XPRIZE 工作的时候,我每几周就会飞往洛杉矶几天。当我在 Canonical 工作时(总部在伦敦),我们每三个月来一次冲刺。
-
-### 5\. 保持专注,不要松懈
-
-本文所有内容的关键在于构建能力,并培养远程工作的肌肉。这就像建立你的日常,坚持它,并明白你的“波浪”和让你分心的事情以及如何管理它们一样简单。
-
-我以一种相当具体的方式来看待这个世界:**我们所做的一切都有机会得到改进和完善**。举个例子,我已经公开演讲超过 15 年,但我总是能发现新的改进方法,以及修复新的错误(说到这些,请参阅我的 [提升你公众演讲的10个方法][11])。
-
-发现新的改善方法,以及把每个绊脚石和错误视为一个开启新的不同的“啊哈!”时刻让人兴奋。远程工作和这没什么不同:寻找有助于解锁方式的模式,让你的远程工作时间更高效,更舒适,更有趣。
-
-![][12]
-看看这些书。它们非常适合个人发展。
-参阅我的 [150 美元个人发展工具包][13] 文章
-
-...但别为此狂热。有的人花尽他们每一分钟来关注如何变得更好,他们经常以“做得还不够好”,“完成度不够高”等为由打击自己,无法达到他们内心关于完美的不切实际的观点。
-
-我们都是人,我们是有生命的,不是机器人。始终致力于改进,但要明白不是所有东西都是完美的。你将会有一些休息日或休息周。你将会因为压力和倦怠而挣扎。你将会处理一些在办公室比远程工作更容易的情况。从这些时刻中学习,但不要沉迷于此。生命太短暂了。
-
-**你有什么提示,技巧和建议吗?你如何管理远程工作?我的建议中还缺少什么吗?在评论区中与我分享!**
-
-
---------------------------------------------------------------------------------
-
-via: https://www.jonobacon.com/2019/01/14/remote-working-survival/
-
-作者:[Jono Bacon][a]
-选题:[lujun9972][b]
-译者:[beamrolling](https://github.com/beamrolling)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.jonobacon.com/author/admin/
-[b]: https://github.com/lujun9972
-[1]: https://www.cnbc.com/2018/05/30/70-percent-of-people-globally-work-remotely-at-least-once-a-week-iwg-study.html
-[2]: http://www.cosocloud.com/press-release/connectsolutions-survey-shows-working-remotely-benefits-employers-and-employees
-[3]: https://www.aftercollege.com/cf/2015-annual-survey
-[4]: https://www.jonobacon.com/join/
-[5]: https://www.facebook.com/aftertheburial/
-[6]: https://www.jonobacon.com/wp-content/uploads/2019/01/aftertheburial2.jpg
-[7]: https://skullsnbones.com/burial-live-photos-vans-warped-tour-denver-co/
-[8]: https://www.youtube.com/watch?v=wK1PNNEKZBY
-[9]: https://www.jonobacon.com/wp-content/uploads/2019/01/IMG_20190114_102429-1024x768.jpg
-[10]: https://www.jonobacon.com/wp-content/uploads/2019/01/15381733956_3325670fda_k-1024x576.jpg
-[11]: https://www.jonobacon.com/2018/12/11/10-ways-to-up-your-public-speaking-game/
-[12]: https://www.jonobacon.com/wp-content/uploads/2019/01/DwVBxhjX4AgtJgV-1024x532.jpg
-[13]: https://www.jonobacon.com/2017/11/13/150-dollar-personal-development-kit/
diff --git a/translated/talk/20190228 IRC vs IRL- How to run a good IRC meeting.md b/translated/talk/20190228 IRC vs IRL- How to run a good IRC meeting.md
new file mode 100644
index 0000000000..c7a4a37afc
--- /dev/null
+++ b/translated/talk/20190228 IRC vs IRL- How to run a good IRC meeting.md
@@ -0,0 +1,56 @@
+[#]:collector:(lujun9972)
+[#]:translator:(lujun9972)
+[#]:reviewer:()
+[#]:publisher:()
+[#]:url:()
+[#]:subject:(IRCvsIRL:HowtorunagoodIRCmeeting)
+[#]:via:(https://opensource。com/article/19/2/irc-vs-irl-meetings)
+[#]:author:(Ben Cotton https://opensource。com/users/bcotton)
+
+IRC vs IRL: 如何召开一个良好的 IRC 会议
+======
+若你遵守这些最佳实践,InternetRelayChat 会议可以很好滴推进项目进展。
+
+
+开展任何形式的会议都是门艺术。很多人已经学会了开展面对面会议和电话会议,但是 [InternetRelayChat][1](IRC) 会议因其特殊的性质有别于"现实 (inreallife)"(IRL) 会议。本文将会分享 IRC 这种会议形式的优势和劣势以及帮你更有效地领导 IRC 会议的小技巧。
+
+为什么是 IRC? 虽说现在有大量的实时聊天工具可供选择,[IRC 依然是开源项目的基石 ][2]。若你的项目使用其他沟通工具,也不要紧。这里大多数的建议都适用于同步的文本聊天机制,只需要进行一些微调。
+
+### IRC 会议的挑战
+
+与面对面会议相比,IRC 会议会遇到一些挑战。你应该直到一个人结束谈话到下一个人开始谈话之间的间隙吧?在 IRC 中这更糟糕,因为人们需要输入他们的所想。这比说话要更慢,—而且不像谈话一样—你不知道别人什么时候在组织消息。主持人在要求回复或转到下一主题前必须等待很长一段时间。而想要发言的人需要先插入一个简短的信息(例如,一个句号)来让主持人知道(他需要发言)。
+
+IRC 会议还缺少其他方法中能够获得的那些元数据。你无法通过文本了解面部表情和语调。这意味着你必须小心你的措辞。
+
+而且 IRC 会议很容易让人分心。至少在面对面会议中,当某人正在看搞笑的猫咪图片时,你可以看到他面带笑容而且在不合时宜的时候发出笑声。在 IRC 中,除非他们不小心粘贴了错误的短信,否者甚至都没有同伴的压力来让他们假装专注。你甚至可以同时参加多个 IRC 会议。我就这么做过,但如果你需要积极参与这些会议,那就很危险了。
+
+### IRC 会议的优势
+
+IRC 会议也有某些独一无二的优势。IRC 是一个非常轻资源的媒介。它并不怎么消耗带宽和 CPU。这降低了参与的门槛,这对贫困这和正在路上的人都是有利的。对于志愿者来说,这意味着他们可以在工作日参加会议。同时它也意味着参与者无需寻找一个安静的地方来让他们沟通而不打扰到周围的人。
+
+借助会议机器人,IRC 可以立即生成会议记录。在 Fedora 中,我们使用 Zodbot,Debian 的 [Meetbot][3] 的一个实例,来记录会议并提供交互。会议结束后,会议记录和完整的日志立即可供社区使用。这减少了开展会议的管理开销。
+
+### 这跟普通会议类似,但有所不同
+
+通过 IRC 或其他基于文本的媒介进行会议意味着以稍微不同寻常的方式来看待会议。虽然它缺少一些更高带宽沟通模式的有点,但它也有自己的有点。开展 IRC 会议可以让你有机会开发出各种规则,而这些规则有助于你开展各种类型的会议。
+
+与任何会议一样,IRC 会议最好有明确的日程和目的。一个好的会议主持者知道什么时候让谈话继续下去以及什么时候将话题拉回来。并没有什么硬性规定—这是一门艺术。但 IRC 在这方面有一个优势。通过这是频道主题为会议的当前主题,人们可以看到他们应该谈论的内容。
+
+如果你的项目尚未实施过同步会议,你应该考虑一下。对于项目成员分布在不同时区的项目,找到一个大家都认可的时间来组织会议很难。你不能把会议作为你唯一的协调方式。但他们可以是项目工作的重要组成部分。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/irc-vs-irl-meetings
+
+作者:[Ben Cotton][a]
+选题:[lujun9972][b]
+译者:[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/bcotton
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Internet_Relay_Chat
+[2]: https://opensource.com/article/16/6/getting-started-irc
+[3]: https://wiki.debian.org/MeetBot
diff --git a/translated/tech/20120203 Computer Laboratory - Raspberry Pi- Lesson 3 OK03.md b/translated/tech/20120203 Computer Laboratory - Raspberry Pi- Lesson 3 OK03.md
deleted file mode 100644
index 21cdb40c2f..0000000000
--- a/translated/tech/20120203 Computer Laboratory - Raspberry Pi- Lesson 3 OK03.md
+++ /dev/null
@@ -1,383 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (qhwdw)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Computer Laboratory – Raspberry Pi: Lesson 3 OK03)
-[#]: via: (https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ok03.html)
-[#]: author: (Robert Mullins http://www.cl.cam.ac.uk/~rdm34)
-
-计算机实验室 – 树莓派:课程 3 OK03
-======
-
-OK03 课程基于 OK02 课程来构建,它教你在汇编中如何使用函数让代码可复用和可读性更好。假设你已经有了 [课程 2:OK02][1] 的操作系统,我们将以它为基础。
-
-### 1、可复用的代码
-
-到目前为止,我们所写的代码都是以我们希望发生的事为顺序来输入的。对于非常小的程序来说,这种做法很好,但是如果我们以这种方式去写一个完整的系统,所写的代码可读性将非常差。我们应该去使用函数。
-
-```
-一个函数是一段可复用的代码片断,可以用于去计算某些答案,或执行某些动作。你也可以称它们为程序、整套动作或子动作。虽然它们都是不同的,但人们几乎都没有正确地使用这个术语。
-
-你应该在数学上遇到了函数的概念。例如,余弦函数应用于一个给定的数时,会得到介于 -1 到 1 之间的另一个数,这个数就是角的余弦。一般我们写成 cos(x) 来表示应用到一个值 x 上的余弦函数。
-
-在代码中,函数可以有多个输入(也可以没有输入),然后函数给出多个输出(也可以没有输出),并可能导致负面效应。例如一个函数可以在一个文件系统上创建一个文件,第一个输入是它的名字,第二个输入是文件的长度。
-```
-
-![Function as black boxes][2]
-
-```
-函数可以认为是一个“黑匣子”。我们给它输入,然后它给我们输出,而我们不需要知道它是如何工作的。
-```
-
-在像 C 或 C++ 这样的高级代码中,函数是语言的组成部分。在汇编代码中,函数只是我们的创意。
-
-理想情况下,我们希望能够在我们的寄存器中设置一些值,分支地址,以及预期在某个时刻,分支将返回,并通过代码来设置输出值到寄存器。这就是我们所设想的汇编代码中的函数。困难之处在于我们用什么样的方式去设置寄存器。如果我们只是使用平时所接触到的任意方法去设置寄存器,每个程序可能使用不同的方法,这样你将会发现你很难理解其他程序员所写的代码。另外,编译器也不能像使用汇编代码那样轻松地工作,因为它们压根不知道如何去使用函数。为避免这种困惑,为每个汇编语言设计了一个称为应用程序二进制接口(ABI)的标准,由它来规范函数如何去运行。如果每个人都使用相同的方法去写函数,这样每个人都可以去使用其他人写的函数。在这里,我将教你们这个标准,而从现在开始,我所写的函数将全部遵循这个标准。
-
-标准规定,寄存器 `r0`、`r1`、`r2` 和 `r3` 将被依此用于函数的输入。如果函数没有输入,那么它有没有值就无关紧要了。如果只需要一个输入,那么它应该总是在寄存器 `r0` 中,如果它需要两个输入,那么第一个输入在寄存器 `r0` 中,而第二个输入在寄存器 `r1` 中,依此类推。输出值也总是在寄存器 `r0` 中。如果函数没有输出,那么 `ro` 中是什么值就不重要了。
-
-另外,标准要求当一个函数运行之后,寄存器 `r4` 到 `r12` 的值必须与函数启动时的值相同。这意味着当你调用一个函数时,你可以确保寄存器 `r4` 到 `r12` 中的值没有发生变化,但是不能确保寄存器 `r0` 到 `r3` 中的值也没有发生变化。
-
-当一个函数运行完成后,它将返回到启动它的代码分支处。这意味着它必须知道启动它的代码的地址。为此,需要一个称为`lr`(链接寄存器)的专用寄存器,它总是在保存调用这个函数的指令的地址。
-
-表 1.1 ARM ABI 寄存器用法
-| 寄存器 | 简介 | 保留 | 规则 |
-| ------ | ---------- | ---- | ------------------------------------------------------------ |
-| r0 | 参数和结果 | 否 | r0 和 r1 用于给函数传递前两个参数,以及函数返回的结果。如果函数返回值不使用它,那么在函数运行之后,它们可以携带任何值。 |
-| r1 | 参数和结果 | 否 | |
-| r2 | 参数 | 否 | r2 和 r3 用去给函数传递后两个参数。在函数运行之后,它们可以携带任何值。 |
-| r3 | 参数 | 否 | |
-| r4 | 通用寄存器 | 是 | r4 到 r12 用于保存函数运行过程中的值,它们的值在函数调用之后必须与调用之前相同。 |
-| r5 | 通用寄存器 | 是 | |
-| r6 | 通用寄存器 | 是 | |
-| r7 | 通用寄存器 | 是 | |
-| r8 | 通用寄存器 | 是 | |
-| r9 | 通用寄存器 | 是 | |
-| r10 | 通用寄存器 | 是 | |
-| r11 | 通用寄存器 | 是 | |
-| r12 | 通用寄存器 | 是 | |
-| lr | 返回地址 | 否 | 当函数运行完成后,lr 中保存了分支的返回地址,但在函数运行完成之后,它将保存相同的地址。 |
-| sp | 栈指针 | 是 | sp 是栈指针,在下面有详细描述。它的值在函数运行完成后,必须是相同的。 |
-
-通常,函数需要使用很多的寄存器,而不仅是 `r0` 到 `r3`。但是,由于 `r4` 到 `r12` 必须在系列动作完成之后值必须保持相同,因此它们需要被保存到某个地方。我们将它们保存到称为栈的地方。
-
-
-![Stack diagram][3]
-```
-一个栈就是我们在计算中用来保存值的一个很形象的方法。就像是摞起来的一堆盘子,你可以从上到下来移除它们,而添加它们时,你只能从下到上来添加。
-
-在函数运行时,使用栈来保存寄存器值是个非常好的创意。例如,如果我有一个函数需要去使用寄存器 r4 和 r5,它将在一个栈上存放这些寄存器的值。最后用这种方式,它可以再次将它拿回来。更高明的是,如果为完成运行我的函数,需要去运行另一个函数,并且那个函数需要保存一些寄存器,在它运行时,它将把寄存器保存在栈顶上,然后在结束后再将它们拿走。而这并不会影响我保存在寄存器 r4 和 r5 中的值,因为它们是在栈顶上添加的,拿走时也是从栈顶上取出的。
-
-我们用专用的术语“栈帧”来表示使用特定的方法放到栈上的值。不是每种方法都使用一个栈帧,有些是不需要存储值的。
-```
-
-因为栈非常有用,它被直接实现在 ARMv6 的指令集中。一个名为 `sp` (栈指针)的专用寄存器用来保存栈的地址。当需要有东西添加到栈上时,`sp` 寄存器被更新,这样就总是保证它保存的是栈上前一个东西的地址。`push {r4,r5}` 将推送 `r4` 和 `r5` 中的值到栈顶上,而 `pop {r4,r5}` 将(以正确的次序)取回它们。
-
-### 2、我们的第一个函数
-
-现在,关于函数的原理我们已经有了一些概念,我们尝试来写一个函数。由于是我们的第一个很基础的例子,我们写一个没有输入的函数,它将输出 GPIO 的地址。在上一节课程中,我们就是写到这个值上,但将它写成函数更好,因为我们在真实的操作系统中经常需要用到它,而我们不可能总是能够记住这个地址。
-
-复制下列代码到一个名为 `gpio.s` 的新文件中。就像在`source` 目录中使用的 `main.s` 一样。我们将把与 GPIO 控制器相关的所有函数放到一个文件中,这样更好查找。
-
-```assembly
-.globl GetGpioAddress
-GetGpioAddress:
-ldr r0,=0x20200000
-mov pc,lr
-```
-
-```assembly
-.globl lbl 使标签 lbl 从其它文件中可访问。
-
-mov reg1,reg2 复制 reg2 中的值到 reg1 中。
-```
-
-这就是一个很简单的完整的函数。`.globl GetGpioAddress` 命令是通知汇编器,让标签 `GetGpioAddress` 在所有文件中全局可访问。这意味着在我们的 `main.s` 文件中,我们可以使用分支指令到标签 `GetGpioAddress` 上,即便这个标签在那个文件中没有定义也没有问题。
-
-你应该认得 `ldr r0,=0x20200000` 命令,它将 GPIO 控制器地址保存到 r0 中。由于这是一个函数,我们要让它输出寄存器 `r0` 中的值,因此我们不能再像以前那样随意使用任意一个寄存器了。
-
-`mov pc,lr` 将寄存器 `lr` 中的值复制到 `pc` 中。正如前面所提到的,寄存器 `lr` 总是保存着方法完成后我们要返回的代码的地址。`pc` 是一个专用寄存器,它总是包含下一个要运行的指令的地址。一个普通的分支命令只需要改变这个寄存器的值即可。通过将 `lr` 中的值复制到 `pc` 中,我们就可以将运行的下一行命令改变成我们将要返回的那一行。
-
-现在这里存在一个合乎常理的问题,那就是我们如何去运行这个代码?我们将需要一个特殊的分支类型 `bl`。它像一个普通的分支一样切换到一个标签,但它在切换之前先更新 `lr` 的值去包含一个分支之后的行的地址。这意味着当函数完成后,将返回到 `bl` 命令之后的那一行上。这就确保了函数能够像任何其它命令那样运行,它简单地运行,做任何需要做的事情,然后推进到下一行。这是函数最有用的方法。当我们使用它时,就将它们按“黑匣子”处理即可,不需要了解它是如何运行的,我们只了解它需要什么输入,以及它给我们什么输出即可。
-
-到现在为止,我们已经明白了函数如何使用,下一节我们将使用它。
-
-### 3、一个大的函数
-
-现在,我们继续去实现一个更大的函数。我们的第一项任务是启用 GPIO 第 16 号针脚的输出。如果它是一个函数那就太好了。我们能够简单地指定针脚号作为函数的输入,然后函数将设置那个针脚的值。那样,我们就可以使用这个代码去控制任意的 GPIO 针脚,而不只是 LED 了。
-
-将下列的命令复制到 `gpio.s` 文件中的 GetGpioAddress 函数中。
-
-```assembly
-.globl SetGpioFunction
-SetGpioFunction:
-cmp r0,#53
-cmpls r1,#7
-movhi pc,lr
-```
-
-```
-带后缀 ls 的命令只有在上一个比较命令的结果是第一个数字小于或等于第二个数字的情况下才会被运行。它是无符号的。
-
-带后缀 hi 的命令只有上一个比较命令的结果是第一个数字大于第二个数字的情况下才会被运行。它是无符号的。
-```
-
-在写一个函数时,我们首先要考虑的事情就是输入,如果输入错了我们怎么办?在这个函数中,我们有一个输入是 GPIO 针脚号,而它必须是介于 0 到 53 之间的数字,因为只有 54 个针脚。每个针脚有 8 个函数,被编号为 0 到 7,因此函数代码也必须是 0 到 7 之间的数字。我们可能假设输入应该是正确的,但是当在硬件上使用时,这种做法是非常危险的,因为不正确的值将导致极大的负面效应。所以,在这个案例中,我们希望确保输入值在正确的范围。
-
-为了确保输入值在正确的范围,我们需要做一个检查,即 r0 <= 53 并且 r1 <= 7。首先我们使用前面看到的比较命令去将 `r0` 的值与 53 做比较。下一个指令 `cmpls` 仅在前一个比较指令结果是小于等于 53 时才会去运行。如果一切正常,它将寄存器 `r1` 的值与 7 进行比较,其它的部分都和前面的是一样的。如果最后的比较结果是寄存器值大于那个数字,最后我们将返回到运行函数的代码处。
-
-这正是我们所希望的效果。如果 r0 中的值大于 53,那么 `cmpls` 命令将不会去运行,但是 `movhi` 会运行。如果 r0 中的值 <= 53,那么 `cmpls` 命令会运行,将 r1 中的值与 7 进行比较,如果它大于 7,`movhi` 会运行,函数结束,否则 `movhi` 不会运行,这样我们就确定 r0 <= 53 并且 r1 <= 7。
-
-`ls`(低于或相同)与 `le`(小于或等于)有一些细微的差别,以及后缀 `hi` (高于)和 `gt` (大于)也一样有一些细微差别,我们在后面将会讲到。
-
-将这些命令复制到上面的代码的下面位置。
-
-```assembly
-push {lr}
-mov r2,r0
-bl GetGpioAddress
-```
-
-```assembly
-push {reg1,reg2,...} 复制列出的寄存器 reg1、reg2、... 到栈顶。该命令仅能用于通用寄存器和 lr 寄存器。
-
-bl lbl sets lr 设置下一个指令的地址并切换到标签 lbl。
-```
-
-这三个命令用于调用我们第一个方法。`push {lr}` 命令复制 `lr` 中的值到栈顶,这样我们在后面可以检索到它。当我们调用 GetGpioAddress 时必须要这样做,我们将需要使用 `lr` 去保存我们函数的返回地址。
-
-如果我们对 `GetGpioAddress` 函数一无所知,我们应该假设它改变了 `r0`、`r1`、`r2` 和 `r3` 的值 ,我们将移动我们的值到 r4 和 r5 中,以保持在它完成之后寄存器的值相同。幸运的是,我们知道 `GetGpioAddress` 做了什么,并且我们也知道它仅改变了 `r0` 到地址,它并没有影响 `r1`、`r2` 或 `r3` 的值。因此,我们仅去将 GPIO 针脚号从 `r0` 中移出,这样它就不会被覆盖掉,但我们知道,可以将它安全地移到 `r2` 中,因为 `GetGpioAddress` 并不去改变 `r2`。
-
-最后我们使用 `bl` 指令去运行 `GetGpioAddress`。通常,运行一个函数,我们使用一个术语叫“调用”,从现在开始我们将一直使用这个术语。正如我们前面讨论过的,`bl` 通过更新 `lr` 中的下一个指令的地址,去调用一个函数,接着切换到函数。
-
-当一个函数结束时,我们称为“返回”。当一个 `GetGpioAddress` 调用返回时,我们已经知道了 `r0` 中包含了 GPIO 的地址,`r1` 中包含了函数代码,而 `r2` 中包含了 GPIO 针脚号。我前面说过,GPIO 函数每 10 个保存在一个块中,因此首先我们需要去判断我们的针脚在哪个块中。这似乎听起来像是要使用一个除法,但是除法做起来非常慢,因此对于这些比较小的数来说,不停地做减法要比除法更好。
-
-将下面的代码复制到上面的代码中最下面的位置。
-
-```assembly
-functionLoop$:
-
-cmp r2,#9
-subhi r2,#10
-addhi r0,#4
-bhi functionLoop$
-```
-
-```assembly
-add reg,#val 将数字 val 加到寄存器 reg 的内容上。
-```
-
-这个简单的循环代码将针脚号与 9 进行比较。如果它大于 9,它将从针脚号上减去 10,并且将 GPIO 控制器地址加上 4,然后再次运行检查。
-
-这样做的效果就是,现在,`r2` 中将包含一个 0 到 9 之间的数字,它是针脚号除以 9 的余数。`r0` 将包含这个针脚的函数所设置的 GPIO 控制器的地址。它就如同是 “GPIO 控制器地址 + 4 × (GPIO Pin Number ÷ 10)”。
-
-最后,将下面的代码复制到上面的代码中最下面的位置。
-
-```assembly
-add r2, r2,lsl #1
-lsl r1,r2
-str r1,[r0]
-pop {pc}
-```
-
-```assembly
-移位参数 reg,lsl #val 表示将寄存器 reg 中二进制表示的数逻辑左移 val 位之后的结果作为与前面运算的操作数。
-
-lsl reg,amt 将寄存器 reg 中的二进制数逻辑左移 amt 中的位数。
-
-str reg,[dst] 与 str reg,[dst,#0] 相同。
-
-pop {reg1,reg2,...} 从栈顶复制值到寄存器列表 reg1、reg2、.... 仅有通用寄存器与 pc 可以这样弹出值。
-```
-
-这个代码完成了这个方法。第一行其实是乘以 3 的变体。乘法在汇编中是一个大而慢的指令,因为电路需要很长时间才能给出答案。有时使用一些能够很快给出答案的指令会让它变得更快。在本案例中,我们知道 r2 × 3 与 r2 × 2 + r2 是相同的。一个寄存器乘以 2 是非常容易的,因为它可以通过将二进制表示的数左移一位来很方便地实现。
-
-ARMv6 汇编语言其中一个非常有用的特性就是,在使用它之前可以先移动参数所表示的位数。在本案例中,我将 `r2` 加上 `r2` 中二进制表示的数左移一位的结果。在汇编代码中,你可以经常使用这个技巧去更快更容易地计算出答案,但如果你觉得这个技巧使用起来不方便,你也可以写成类似 `mov r3,r2`; `add r2,r3`; `add r2,r3` 这样的代码。
-
-现在,我们可以将一个函数的值左移 `r2` 中所表示的位数。大多数对数量的指令(比如加法和减法)都有一个可以使用寄存器而不是数字的变体。我们执行这个移位是因为我们想去设置表示针脚号的位,并且每个针脚有三个位。
-
-然后,我们将函数计算后的值保存到 GPIO 控制器的地址上。我们在循环中已经算出了那个地址,因此我们不需要像 OK01 和 OK02 中那样在一个偏移量上保存它。
-
-最后,我们从这个方法调用中返回。由于我们将 `lr` 推送到了栈上,因此我们 `pop pc`,它将复制 `lr` 中的值并将它推送到 `pc` 中。这个操作类似于 `mov pc,lr`,因此函数调用将返回到运行它的那一行上。
-
-敏锐的人可能会注意到,这个函数其实并不能正确工作。虽然它将 GPIO 针脚函数设置为所要求的值,但它会导致在同一个块中的 10 个函数的所有针脚都归 0!在一个大量使用 GPIO 针脚的系统中,这将是一个很恼人的问题。我将这个问题留给有兴趣去修复这个函数的人,以确保只设置相关的 3 个位而不去覆写其它位,其它的所有位都保持不变。关于这个问题的解决方案可以在本课程的下载页面上找到。你可能会发现非常有用的几个函数是 `and`,它是计算两个寄存器的布尔与函数,`mvns` 是计算布尔非函数,而 `orr` 是计算布尔或函数。
-
-### 4、另一个函数
-
-现在,我们已经有了能够设置 GPIO 针脚的函数。我们还需要写一个能够打开或关闭 GPIO 针脚的函数。我们不需要写一个打开的函数和一个关闭的函数,只需要一个函数就可以做这两件事情。
-
-我们将写一个名为 `SetGpio` 的函数,它用 `r0` 中的值作为第一个输入,`r1` 中的值作为第二个输入。如果值为 `0`,我们将关闭针脚,而如果为非零则打开针脚。
-
-将下列的代码复制粘贴到 `gpio.s` 文件的结尾部分。
-
-```assembly
-.globl SetGpio
-SetGpio:
-pinNum .req r0
-pinVal .req r1
-```
-
-```assembly
-alias .req reg 设置寄存器 reg 的别名为 alias。
-```
-
-我们再次需要 `.globl` 命令,标记它为其它文件可访问的全局函数。这次我们将使用寄存器别名。寄存器别名允许我们为寄存器使用名字而不仅是 `r0` 或 `r1`。到目前为止,寄存器别名还不是很重要,但随着我们后面写的方法越来越大,它将被证明非常有用,现在开始我们将尝试使用别名。当在指令中使用到 `pinNum .req r0` 时,它的意思是 `pinNum` 表示 `r0`。
-
-将下面的代码复制粘贴到上述的代码下面位置。
-
-```assembly
-cmp pinNum,#53
-movhi pc,lr
-push {lr}
-mov r2,pinNum
-.unreq pinNum
-pinNum .req r2
-bl GetGpioAddress
-gpioAddr .req r0
-```
-
-```assembly
-.unreq alias 删除别名 alias。
-```
-
-就像在函数 `SetGpio` 中所做的第一件事情是检查给定的针脚号是否有效一样。我们需要同样的方式去将 `pinNum (r0)` 与 53 进行比较,如果它大于 53 将立即返回。一旦我们再次调用 `GetGpioAddress`,我们就需要将 `lr`推送到栈上来保护它,将将 `pinNum` 移动到 `r2` 中。然后我们使用 `.unreq` 语句来删除我们给 `r0` 定义的别名。因为针脚号现在保存在寄存器 `r2` 中,我们希望通过别名能够映射到它,因此我们重新定义到 `r2` 的别名。你应该每次在别名使用结束后,立即删除它,这样当它不再存在时,你就不会在后面的代码中因它而产生错误。
-
-然后,我们调用了 `GetGpioAddress`,并且我们创建了一个指向 `r0`的别名。
-
-将下面的代码复制粘贴到上述代码的后面位置。
-
-```assembly
-pinBank .req r3
-lsr pinBank,pinNum,#5a
-lsl pinBank,#2
-add gpioAddr,pinBank
-.unreq pinBank
-```
-
-```assembly
-lsr dst,src,#val 将 src 中二进制表示的数右移 val 位,并将结果保存到 dst。
-```
-
-对于打开和关闭 GPIO 针脚,每个针脚在 GPIO 控制器上有两个 4 字节组。在每个场景下,第一个 4 字节组控制前 32 个针脚,而第二个 4 字节组控制剩下的 22 个针脚。为了判断我们要设置的针脚在哪个 4 字节组中,我们需要将针脚号除以 32。幸运的是,这很容易,因为它等价于将二进制表示的针脚号右移 5 位。因此,在本案例中,我们将 `r3` 命名为 `pinBank`,然后计算 `pinNum ÷ 32`。因为它是一个 4 字节组,我们需要将它与 4 相乘的结果。它与二进制表示的数左移 2 位的相同的,这就是下一行的命令。你可能想知道我们能否将它右移 3 位呢,这样我们就可以先右移再左移。但是这样做是不行的,因为当我们做 ÷ 32 时有些答案可能是四舍五入的,而如果我们做 ÷ 8 时却不会这样。
-
-现在,`gpioAddr` 的结果有可能是 20200000~16~(如果针脚号介于 0 到 31 之间),也有可能是 20200004~16~(如果针脚号介于 32 到 53 之间)。这意味着如果加上 28~10~ ,我们将得到打开针脚的地址,而如果加上 40~10~ ,我们将得到关闭针脚的地址。由于我们使用了 `pinBank` ,所以在它之后立即使用 `.unreq` 去删除它。、
-
-将下面的代码复制粘贴到上述代码的下面位置。
-
-```assembly
-and pinNum,#31
-setBit .req r3
-mov setBit,#1
-lsl setBit,pinNum
-.unreq pinNum
-```
-
-```assembly
-and reg,#val 计算寄存器中的数与 val 的布尔与。
-```
-
-函数的下一个部分是产生一个正确的设置数的位。至于 GPIO 控制器去打开或关闭针脚,我们在针脚号除以 32 的余数的位置,给它一个设置数字的位。例如,设置 16 号针脚,我们需要第 16 位设置数字为 1 。设置 45 号针脚,我们需要设置第 13 位数字为 1,因为 45 ÷ 32 = 1 余数 13。
-
-这个 `and` 命令计算我们需要的余数。它是这样计算的,在输入中所有的二进制位都是 1 时,这个 `and` 运算的结果就是 1,否则就是 0。这是一个很基础的二进制操作,`and` 操作非常快。我们给定的输入是 “pinNum and 31~10~ = 11111~2~”。这意味着答案的后 5 位中只有 1,因此它肯定是在 0 到 31 之间。尤其是在 `pinNum` 的后 5 位的位置是 1 的地方它只有 1。这就如同被 32 整除的余数部分。就像 31 = 32 - 1 并不是巧合。
-
-![binary division example][4]
-
-代码的其余部分使用这个值去左移 1 位。这就有了创建我们所需要的二进制数的效果。
-
-将下面的代码复制粘贴到上述代码的下面位置。
-
-```assembly
-teq pinVal,#0
-.unreq pinVal
-streq setBit,[gpioAddr,#40]
-strne setBit,[gpioAddr,#28]
-.unreq setBit
-.unreq gpioAddr
-pop {pc}
-```
-
-```assembly
-teq reg,#val 检查寄存器 reg 中的数字与 val 是否相等。
-```
-
-这个代码是方法的结束部分。如前面所说,当 `pinVal` 为 0 时,我们关闭它,否则就打开它。`teq`(等于测试)是另一个比较操作,它仅能够测试是否相等。它类似于 `cmp` ,但它并不能算出哪个数大。如果你只是希望测试数字是否相同,你可以使用 `teq`。
-
-如果 `pinVal` 是 0,我们将 `setBit` 保存在 GPIO 地址偏移 40 的位置,我们已经知道,这样会关闭那个针脚。否则将它保存在 GPIO 地址偏移 28 的位置,它将打开那个针脚。最后,我们通过弹出 `pc` 返回,这将设置它为我们推送链接寄存器时保存的值。
-
-### 5、一个新的开始
-
-在完成上述工作后,我们终于有了我们的 GPIO 函数。现在,我们需要去修改 `main.s` 去使用它们。因为 `main.s` 现在已经有点大了,也更复杂了。将它分成两节将是一个很好的设计。到目前为止,我们一直使用的 `.init` 应该尽可能的让它保持小。我们可以更改代码来很容易地反映出这一点。
-
-将下列的代码插入到 `main.s` 文件中 `_start: ` 的后面:
-
-```
-b main
-
-.section .text
-main:
-mov sp,#0x8000
-```
-
-在这里重要的改变是引入了 `.text` 节。我设计了 `makefile` 和链接器脚本,它将 `.text` 节(它是默认节)中的代码放在地址为 8000~16~ 的 `.init` 节之后。这是默认加载地址,并且它给我们提供了一些空间去保存栈。由于栈存在于内存中,它也有一个地址。栈向下增长内存,因此每个新值都低于前一个地址,所以,这便得栈顶是最低的一个地址。
-
-```
-图中的 'ATAGs' 节的位置保存了有关树莓派的信息,比如它有多少内存,默认屏幕分辨率是多少。
-```
-
-![Layout diagram of operating system][5]
-
-用下面的代码替换掉所有设置 GPIO 函数针脚的代码:
-
-```assembly
-pinNum .req r0
-pinFunc .req r1
-mov pinNum,#16
-mov pinFunc,#1
-bl SetGpioFunction
-.unreq pinNum
-.unreq pinFunc
-```
-
-这个代码将使用针脚号 16 和函数代码 1 去调用 `SetGpioFunction`。它的效果就是启用了 OK LED 灯的输出。
-
-用下面的代码去替换打开 OK LED 灯的代码:
-
-```assembly
-pinNum .req r0
-pinVal .req r1
-mov pinNum,#16
-mov pinVal,#0
-bl SetGpio
-.unreq pinNum
-.unreq pinVal
-```
-
-这个代码使用 `SetGpio` 去关闭 GPIO 第 16 号针脚,因此将打开 OK LED。如果我们(将第 4 行)替换成 `mov pinVal,#1` 它将关闭 LED 灯。用以上的代码去替换掉你关闭 LED 灯的旧代码。
-
-### 6、继续向目标前进
-
-但愿你能够顺利地在你的树莓派上测试我们所做的这一切。到目前为止,我们已经写了一大段代码,因此不可避免会出现错误。如果有错误,可以去查看我们的排错页面。
-
-如果你的代码已经正常工作,恭喜你。虽然我们的操作系统除了做 [课程 2:OK02][1] 中的事情之外,还做不了别的任何事情,但我们已经学会了函数和格式有关的知识,并且我们现在可以更好更快地编写新特性了。现在,我们在操作系统上修改 GPIO 寄存器将变得非常简单,而它就是用于控制硬件的!
-
-在 [课程 4:OK04][6] 中,我们将处理我们的 `wait` 函数,目前,它的时间控制还不精确,这样我们就可以更好地控制我们的 LED 灯了,进而最终控制所有的 GPIO 针脚。
-
---------------------------------------------------------------------------------
-
-via: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ok03.html
-
-作者:[Robert Mullins][a]
-选题:[lujun9972][b]
-译者:[qhwdw](https://github.com/qhwdw )
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: http://www.cl.cam.ac.uk/~rdm34
-[b]: https://github.com/lujun9972
-[1]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ok02.html
-[2]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/images/functions.png
-[3]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/images/stack.png
-[4]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/images/binary3.png
-[5]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/images/osLayout.png
-[6]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ok04.html
diff --git a/translated/tech/20150616 Computer Laboratory - Raspberry Pi- Lesson 10 Input01.md b/translated/tech/20150616 Computer Laboratory - Raspberry Pi- Lesson 10 Input01.md
new file mode 100644
index 0000000000..ca6d421a15
--- /dev/null
+++ b/translated/tech/20150616 Computer Laboratory - Raspberry Pi- Lesson 10 Input01.md
@@ -0,0 +1,506 @@
+[#]: collector: (lujun9972)
+[#]: translator: (ezio )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Computer Laboratory – Raspberry Pi: Lesson 10 Input01)
+[#]: via: (https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/input01.html)
+[#]: author: (Alex Chadwick https://www.cl.cam.ac.uk)
+
+
+计算机实验课 – 树莓派: 课程 10 输入01
+======
+
+欢迎进入输入课程系列。在本系列,你将会学会如何使用键盘接收输入给树莓派。我们将会从揭示输入开始本课,然后开始传统的文本命令。
+
+这是第一堂输入课,会教授一些关于驱动和链接的理论,同样也包含键盘的知识,最后以在屏幕上显示文本结束。
+
+### 1 开始
+
+希望你已经完成了 OK 系列课程, 这会对你完成屏幕系列课程很有帮助。很多 OK 课程上的文件会被使用而不会做解释。如果你没有这些文件,或者希望使用一个正确的实现, 可以从该堂课的[下载页][1]下载模板。如果你使用你自己的实现,请删除调用了 `SetGraphicsAddress` 之后全部的代码。
+
+### 2 USB
+
+```
+USB 标准的设计目的是通过复杂的硬件来简化硬件。
+```
+
+如你所知,树莓派 B 型有两个 USB 接口,通常用来连接一个鼠标和一个键盘。这是一个非常好的设计决策,USB 是一个非常通用的接口, 很多种设备都可以使用它。这就很容易为它设计新外设,很容易为它编写设备驱动, 而且通过 USB 集线器可以非常容易扩展。还能更好吗?当然是不能,实际上对一个操作系统开发者来说,这就是我们的噩梦。USB 标准太大了。 我是真的,在你思考如何连接设备之前,它的文档将近 700 页。
+
+我和很多爱好操作系统的开发者谈过这些,而他们全部都说几句话:不要抱怨。“实现这个需要花费很久时间”,“你不可能写出关于 USB 的教程”,“收益太小了”。在很多方面,他们是对的,我不可能写出一个关于 USB 标准的教程, 那得花费几周时间。我同样不能教授如何为全部所有的设备编写外设驱动,所以使用自己写的驱动是没什么用的。然而,我可以做仅次于最好的事情是获取一个正常工作的 USB 驱动,拿一个键盘驱动,然后教授如何在操作系统中使用它们。我开始寻找可以运行在一个甚至不知道文件是什么的操作系统的自由驱动,但是我一个都找不到。他们都太高层了。所以我尝试写一个。每个人都是对的,这耗费了我几周时间。然而我高兴的说我我做这些工作没有获取操作系统以外的帮助,并且可以和鼠标和键盘通信。这句不是完整的,高效的,或者正确的,但是它能工作。驱动是以 C 编写的,而且有兴趣的可以在下载页找到全部源代码。
+
+所以,这一个教程不会是 USB 标准的课程(一点也没有)。实际上我们将会看到如何使用其他人的代码。
+
+### 3 链接
+
+```
+链接允许我们制作可重用的代码库,所有人都可以在他们的程序中使用。
+```
+
+既然我们要引进外部代码到操作系统,我们就需要谈一谈链接。链接是一种过程,可以在程序或者操作系统中链接函数。这意味着当一个程序生成之后,我们不必要编写每一个函数(几乎可以肯定,实际上并非如此)。链接就是我们做的用来把我们程序和别人代码中的函数连结在一起。这个实际上已经在我们的操作系统进行了,因为链接器吧所有不同的文件链接在一起,每个都是分开编译的。
+
+
+```
+程序经常知识调用库,这些库会调用其它的库,知道最终调用了我们写的操作系统。
+```
+
+有两种链接:静态和动态。静态链接就像我们在制作自己的操作系统时进行的。链接器找到全部函数的地址,然后在链接结束前,将这些地址都写入代码中。动态链接是在程序“完成”之后。当程序加载后,动态链接器检查程序,然后在操作系统的库找到所有不在程序里的函数。这就是我们的操作系统最终应该能够完成的一项工作,但是现在所有东西都将是静态链接的。
+
+我编写的 USB 驱动程序适合静态编译。这意味着我给你我的每个文件的编译后的代码,然后链接器找到你的代码中的那些没有实现的函数,就将这些函数链接到我的代码。在本课的 [下载页][1] 是一个 makefile 和我的 USB 驱动,这是接下来需要的。下载并使用这 makefile 替换你的代码中的 makefile, 同事将驱动放在和这个 makefile 相同的文件夹。
+
+### 4 键盘
+
+为了将输入传给我们的操作系统,我们需要在某种程度上理解键盘是如何实际工作的。键盘有两种按键:普通键和修饰键。普通按键是字母、数字、功能键,等等。他们构成了键盘上几乎每一个按键。修饰键是最多 8 个特殊键。他们是左 shift , 右 shift, 左 ctrl,右 ctrl,左 alt, 右 alt,左 GUI 和右 GUI。键盘可以检测出所有的组合中那个修饰键被按下了,以及最多 6 个普通键。每次一个按钮变化了(i.e. 是按下了还是释放了),键盘就会报告给电脑。通常,键盘也会有 3 个 LED 灯,分别指示 Caps 锁定,Num 锁定,和 Scroll 锁定,这些都是由电脑控制的,而不是键盘自己。键盘也可能由更多的灯,比如电源、静音,等等。
+
+为了帮助标准 USB 键盘,产生了一个按键值的表,每个键盘按键都一个唯一的数字,每个可能的 LED 也类似。下面的表格列出了前 126 个值。
+
+Table 4.1 USB 键盘值
+
+| 序号 | 描述 | 序号 | 描述 | 序号 | 描述 | 序号 | 描述 | |
+| ------ | ---------------- | ------- | ---------------------- | -------- | -------------- | --------------- | -------------------- |----|
+| 4 | a and A | 5 | b and B | 6 | c and C | 7 | d and D | |
+| 8 | e and E | 9 | f and F | 10 | g and G | 11 | h and H | |
+| 12 | i and I | 13 | j and J | 14 | k and K | 15 | l and L | |
+| 16 | m and M | 17 | n and N | 18 | o and O | 19 | p and P | |
+| 20 | q and Q | 21 | r and R | 22 | s and S | 23 | t and T | |
+| 24 | u and U | 25 | v and V | 26 | w and W | 27 | x and X | |
+| 28 | y and Y | 29 | z and Z | 30 | 1 and ! | 31 | 2 and @ | |
+| 32 | 3 and # | 33 | 4 and $ | 34 | 5 and % | 35 | 6 and ^ | |
+| 36 | 7 and & | 37 | 8 and * | 38 | 9 and ( | 39 | 0 and ) | |
+| 40 | Return (Enter) | 41 | Escape | 42 | Delete (Backspace) | 43 | Tab | |
+| 44 | Spacebar | 45 | - and _ | 46 | = and + | 47 | [ and { | |
+| 48 | ] and } | 49 | \ and | 50 | # and ~ | 51 | ; and : |
+| 52 | ' and " | 53 | ` and ~ | 54 | , and < | 55 | . and > | |
+| 56 | / and ? | 57 | Caps Lock | 58 | F1 | 59 | F2 | |
+| 60 | F3 | 61 | F4 | 62 | F5 | 63 | F6 | |
+| 64 | F7 | 65 | F8 | 66 | F9 | 67 | F10 | |
+| 68 | F11 | 69 | F12 | 70 | Print Screen | 71 | Scroll Lock | |
+| 72 | Pause | 73 | Insert | 74 | Home | 75 | Page Up | |
+| 76 | Delete forward | 77 | End | 78 | Page Down | 79 | Right Arrow | |
+| 80 | Left Arrow | 81 | Down Arrow | 82 | Up Arrow | 83 | Num Lock | |
+| 84 | Keypad / | 85 | Keypad * | 86 | Keypad - | 87 | Keypad + | |
+| 88 | Keypad Enter | 89 | Keypad 1 and End | 90 | Keypad 2 and Down Arrow | 91 | Keypad 3 and Page Down | |
+| 92 | Keypad 4 and Left Arrow | 93 | Keypad 5 | 94 | Keypad 6 and Right Arrow | 95 | Keypad 7 and Home | |
+| 96 | Keypad 8 and Up Arrow | 97 | Keypad 9 and Page Up | 98 | Keypad 0 and Insert | 99 | Keypad . and Delete | |
+| 100 | \ and | 101 | Application | 102 | Power | 103 | Keypad = |
+| 104 | F13 | 105 | F14 | 106 | F15 | 107 | F16 | |
+| 108 | F17 | 109 | F18 | 110 | F19 | 111 | F20 | |
+| 112 | F21 | 113 | F22 | 114 | F23 | 115 | F24 | |
+| 116 | Execute | 117 | Help | 118 | Menu | 119 | Select | |
+| 120 | Stop | 121 | Again | 122 | Undo | 123 | Cut | |
+| 124 | Copy | 125 | Paste | 126 | Find | 127 | Mute | |
+| 128 | Volume Up | 129 | Volume Down | | | | | |
+
+完全列表可以在[HID 页表 1.12][2]的 53 页,第 10 节找到
+
+### 5 车轮后的螺母
+
+```
+这些总结和代码的描述组成了一个 API - 应用程序产品接口。
+
+```
+
+通常,当你使用其他人的代码,他们会提供一份自己代码的总结,描述代码都做了什么,粗略介绍了是如何工作的,以及什么情况下会出错。下面是一个使用我的 USB 驱动的相关步骤要求。
+
+Table 5.1 CSUD 中和键盘相关的函数
+| 函数 | 参数 | 返回值 | 描述 |
+| ----------------------- | ----------------------- | ----------------------- | -----------------------|
+| UsbInitialise | None | r0 is result code | 这个方法是一个集多种功能于一身的方法,它加载USB驱动程序,枚举所有设备并尝试与它们通信。这种方法通常需要大约一秒钟的时间来执行,但是如果插入几个USB集线器,执行时间会明显更长。在此方法完成之后,键盘驱动程序中的方法就可用了,不管是否确实插入了键盘。返回代码如下解释。|
+| UsbCheckForChange | None | None | 本质上提供与 `usbinitialization` 相同的效果,但不提供相同的一次初始化。该方法递归地检查每个连接的集线器上的每个端口,如果已经添加了新设备,则添加它们。如果没有更改,这应该是非常快的,但是如果连接了多个设备的集线器,则可能需要几秒钟的时间。|
+| KeyboardCount | None | r0 is count | 返回当前连接并检测到的键盘数量。`UsbCheckForChange` 可能会对此进行更新。默认情况下最多支持4个键盘。多达这么多的键盘可以通过这个驱动程序访问。|
+| KeyboardGetAddress | r0 is index | r0 is address | 检索给定键盘的地址。所有其他函数都需要一个键盘地址,以便知道要访问哪个键盘。因此,要与键盘通信,首先要检查计数,然后检索地址,然后使用其他方法。注意,在调用 `UsbCheckForChange` 之后,此方法返回的键盘顺序可能会改变。
+|
+| KeyboardPoll | r0 is address | r0 is result code | 从键盘读取当前键状态。这是通过直接轮询设备来操作的,与最佳实践相反。这意味着,如果没有频繁地调用此方法,可能会错过一个按键。所有读取方法只返回上次轮询时的值。
+|
+| KeyboardGetModifiers | r0 is address | r0 is modifier state | 检索上次轮询时修饰符键的状态。这是两边的 `shift` 键、`alt` 键和 `GUI` 键。这回作为一个位字段返回,这样,位0中的1表示左控件被保留,位1表示左 `shift`,位2表示左 `alt` ,位3表示左 `GUI`,位4到7表示前几位的右版本。如果有问题,`r0` 包含0。|
+| KeyboardGetKeyDownCount | r0 is address | r0 is count | 检索当前按下键盘的键数。这排除了修饰键。这通常不能超过6次。如果有错误,这个方法返回0。|
+| KeyboardGetKeyDown | r0 is address, r1 is key number | r0 is scan code | 检索特定下拉键的扫描代码(见表4.1)。通常,要计算出哪些键是关闭的,可以调用 `KeyboardGetKeyDownCount`,然后多次调用 `KeyboardGetKeyDown` ,将 `r1` 的值递增,以确定哪些键是关闭的。如果有问题,返回0。在不调用 `KeyboardGetKeyDownCount` 并将0解释为未持有的键的情况下调用此方法是安全的(但不建议这样做)。注意,顺序或扫描代码可以随机更改(有些键盘按数字排序,有些键盘按时间排序,没有任何保证)。|
+| KeyboardGetKeyIsDown | r0 is address, r1 is scan code | r0 is status | 除了 `KeyboardGetKeyDown` 之外,还可以检查下拉键中是否有特定的扫描代码。如果不是,返回0;如果是,返回一个非零值。当检测特定的扫描代码(例如寻找ctrl+c)更快。出错时,返回0。
+|
+| KeyboardGetLedSupport | r0 is address | r0 is LEDs | 检查特定键盘支持哪些led。第0位代表数字锁定,第1位代表大写锁定,第2位代表滚动锁定,第3位代表合成,第4位代表假名,第5位代表能量,第6位代表静音,第7位代表合成。根据USB标准,这些led都不是自动更新的(例如,当检测到大写锁定扫描代码时,必须手动设置大写锁定)。|
+| KeyboardSetLeds | r0 is address, r1 is LEDs | r0 is result code | 试图打开/关闭键盘上指定的 LED 灯。查看下面的结果代码值。参见 `KeyboardGetLedSupport` 获取 LED 的值。
+|
+
+```
+返回值是一种处理错误的简单方法,但是通常更优雅的解决途径存在于更高层次的代码。
+```
+
+有几种方法返回 ‘返回值’。这些都是 C 代码的老生常谈了,就是用数字代表函数调用发生了什么。通常情况, 0 总是代表操作成功。下面的是驱动用到的返回值。
+
+Table 5.2 - CSUD 返回值
+
+| 代码 | 描述 |
+| ---- | ----------------------------------------------------------------------- |
+| 0 | 方法成功完成。 |
+| -2 | 参数: 函数调用了无效参数。 |
+| -4 | 设备: 设备没有正确响应请求。 |
+| -5 | 不匹配: 驱动不适用于这个请求或者设备。 |
+| -6 | 编译器: 驱动没有正确编译,或者被破坏了。 |
+| -7 | 内存: 驱动用尽了内存。 |
+| -8 | 超时: 设备没有在预期的时间内响应请求。 |
+| -9 | 断开连接: 被请求的设备断开连接,或者不能使用。 |
+
+驱动的通常用法如下:
+
+ 1. 调用 `UsbInitialise`
+ 2. 调用 `UsbCheckForChange`
+ 3. 调用 `KeyboardCount`
+ 4. 如果返回 0,重复步骤 2。
+ 5. 针对你支持的每种键盘:
+ 1. 调用 ·KeyboardGetAddress·
+ 2. 调用 ·KeybordGetKeyDownCount·
+ 3. 针对每个按下的按键:
+ 1. 检查它是否已经被按下了
+ 2. 保存按下的按键
+ 4. 针对每个保存的按键:
+ 3. 检查按键是否被释放了
+ 4. 如果释放了就删除
+ 6. 根据按下/释放的案件执行操作
+ 7. 重复步骤 2.
+
+
+最后,你可能做所有你想对键盘做的事,而这些方法应该允许你访问键盘的全部功能。在接下来的两节课,我们将会着眼于完成文本终端的输入部分,类似于大部分的命令行电脑,以及命令的解释。为了做这些,我们将需要在更有用的形式下得到一个键盘输入。你可能注意到我的驱动是(故意)没有太大帮助,因为它并没有方法来判断是否一个案件刚刚按下或释放了,它只有芳芳来判断当前那个按键是按下的。这就意味着我们需要自己编写这些方法。
+
+### 6 可用更新
+
+重复检查更新被称为 ‘轮询’。这是针对驱动 IO 中断而言的,这种情况下设备在准备好后会发一个信号。
+
+首先,让我们实现一个 `KeyboardUpdate` 方法,检查第一个键盘,并使用轮询方法来获取当前的输入,以及保存最后一个输入来对比。然后我们可以使用这个数据和其它方法来将扫描码转换成按键。这个方法应该按照下面的说明准确操作:
+
+ 1. 提取一个保存好的键盘地址(初始值为 0)。
+ 2. 如果不是0 ,进入步骤9.
+ 3. 调用 `UsbCheckForChange` 检测新键盘。
+ 4. 调用 `KeyboardCount` 检测有几个键盘在线。
+ 5. 如果返回0,意味着没有键盘可以让我们操作,只能退出了。
+ 6. 调用 `KeyboardGetAddress` 参数是 0,获取第一个键盘的地址。
+ 7. 保存这个地址。
+ 8. 如果这个值是0,那么退出,这里应该有些问题。
+ 9. 调用 `KeyboardGetKeyDown` 6 次,获取每次按键按下的值并保存。
+ 10. 调用 `KeyboardPoll`
+ 11. 如果返回值非 0,进入步骤 3。这里应该有些问题(比如键盘断开连接)。
+
+要保存上面提到的值,我们将需要下面 `.data` 段的值。
+
+```
+.section .data
+.align 2
+KeyboardAddress:
+.int 0
+KeyboardOldDown:
+.rept 6
+.hword 0
+.endr
+```
+
+```
+.hword num 直接将半字的常数插入文件。
+```
+
+```
+.rept num [commands] .endr 复制 `commands` 命令到输出 num 次。
+```
+
+试着自己实现这个方法。对此,我的实现如下:
+
+1.
+```
+.section .text
+.globl KeyboardUpdate
+KeyboardUpdate:
+push {r4,r5,lr}
+
+kbd .req r4
+ldr r0,=KeyboardAddress
+ldr kbd,[r0]
+```
+我们加载键盘的地址。
+
+2.
+```
+teq kbd,#0
+bne haveKeyboard$
+```
+如果地址非0,就说明我们有一个键盘。调用 `UsbCheckForChanges` 慢,所以如果全部事情都起作用,我们要避免调用这个函数。
+
+3.
+```
+getKeyboard$:
+bl UsbCheckForChange
+```
+如果我们一个键盘都没有,我们就必须检查新设备。
+
+4.
+```
+bl KeyboardCount
+```
+如果有心键盘添加,我们就会看到这个。
+
+5.
+```
+teq r0,#0
+ldreq r1,=KeyboardAddress
+streq r0,[r1]
+beq return$
+```
+如果没有键盘,我们就没有键盘地址。
+
+6.
+```
+mov r0,#0
+bl KeyboardGetAddress
+```
+让我们获取第一个键盘的地址。你可能想要更多。
+
+7.
+```
+ldr r1,=KeyboardAddress
+str r0,[r1]
+```
+保存键盘地址。
+
+8.
+```
+teq r0,#0
+beq return$
+mov kbd,r0
+```
+如果我们没有地址,这里就没有其它活要做了。
+
+9.
+```
+saveKeys$:
+ mov r0,kbd
+ mov r1,r5
+ bl KeyboardGetKeyDown
+
+ ldr r1,=KeyboardOldDown
+ add r1,r5,lsl #1
+ strh r0,[r1]
+ add r5,#1
+ cmp r5,#6
+ blt saveKeys$
+```
+Loop through all the keys, storing them in KeyboardOldDown. If we ask for too many, this returns 0 which is fine.
+查询遍全部按键,在 `KeyboardOldDown` 保存下来。如果我们询问的太多了,返回 0 也是正确的。
+
+10.
+```
+mov r0,kbd
+bl KeyboardPoll
+```
+现在哦我们得到了新的按键。
+
+11.
+```
+teq r0,#0
+bne getKeyboard$
+
+return$:
+pop {r4,r5,pc}
+.unreq kbd
+```
+最后我们要检查 `KeyboardOldDown` 是否工作了。如果没工作,那么我们可能是断开连接了。
+
+有了我们新的 `KeyboardUpdate` 方法,检查输入变得简单到固定周期调用这个方法,而它甚至可以检查断开连接,等等。这是一个有用的方法,因为我们实际的按键处理会根据条件不同而有所差别,所以能够用一个函数调以它的原始方式获取当前的输入是可行的。下一个方法我们理想希望的是 `KeyboardGetChar`,简单的返回下一个按下的按钮的 ASCII 字符,或者如果没有按键按下就返回 0。这可以扩展到支持将一个按键多次按下,如果它保持了一个特定时间,也支持‘锁定’键和修饰键。
+
+要使这个方法有用,如果我们有一个 `KeyWasDown` 方法,如果给定的扫描代码不在keyboard dolddown值中,它只返回0,否则返回一个非零值。你可以自己尝试一下。与往常一样,可以在下载页面找到解决方案。
+
+### 7 查找表
+
+```
+在编程的许多领域,程序越大,速度越快。查找表很大,但是速度很快。有些问题可以通过查找表和普通函数的组合来解决。
+```
+
+`KeyboardGetChar`方法如果写得不好,可能会非常复杂。有 100 多种扫描代码,每种代码都有不同的效果,这取决于 shift 键或其他修饰符的存在与否。并不是所有的键都可以转换成一个字符。对于一些字符,多个键可以生成相同的字符。在有如此多可能性的情况下,一个有用的技巧是查找表。查找表与物理意义上的查找表非常相似,它是一个值及其结果的表。对于一些有限的函数,推导出答案的最简单方法就是预先计算每个答案,然后通过检索返回正确的答案。在这种情况下,我们可以建立一个序列的值在内存中,n值序列的ASCII字符代码扫描代码n。这意味着我们的方法只会发现如果一个键被按下,然后从表中检索它的值。此外,当按住shift键时,我们可以为值创建一个单独的表,这样shift键就可以简单地更改正在处理的表。
+
+在 `.section` `.data` 命令之后,复制下面的表:
+
+```
+.align 3
+KeysNormal:
+ .byte 0x0, 0x0, 0x0, 0x0, 'a', 'b', 'c', 'd'
+ .byte 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'
+ .byte 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'
+ .byte 'u', 'v', 'w', 'x', 'y', 'z', '1', '2'
+ .byte '3', '4', '5', '6', '7', '8', '9', '0'
+ .byte '\n', 0x0, '\b', '\t', ' ', '-', '=', '['
+ .byte ']', '\\\', '#', ';', '\'', '`', ',', '.'
+ .byte '/', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
+ .byte 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
+ .byte 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
+ .byte 0x0, 0x0, 0x0, 0x0, '/', '*', '-', '+'
+ .byte '\n', '1', '2', '3', '4', '5', '6', '7'
+ .byte '8', '9', '0', '.', '\\\', 0x0, 0x0, '='
+
+.align 3
+KeysShift:
+ .byte 0x0, 0x0, 0x0, 0x0, 'A', 'B', 'C', 'D'
+ .byte 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'
+ .byte 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'
+ .byte 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '"'
+ .byte '£', '$', '%', '^', '&', '*', '(', ')'
+ .byte '\n', 0x0, '\b', '\t', ' ', '_', '+', '{'
+ .byte '}', '|', '~', ':', '@', '¬', '<', '>'
+ .byte '?', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
+ .byte 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
+ .byte 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
+ .byte 0x0, 0x0, 0x0, 0x0, '/', '*', '-', '+'
+ .byte '\n', '1', '2', '3', '4', '5', '6', '7'
+ .byte '8', '9', '0', '.', '|', 0x0, 0x0, '='
+```
+
+```
+.byte num 直接插入字节常量 num 到文件。
+```
+
+```
+大部分的汇编器和编译器识别转义序列;插入特殊字符的字符序列,如\t。
+```
+
+这些表直接将前 104 个扫描代码映射到 ASCII 字符,作为一个字节表。我们还有一个单独的表来描述 `shift` 键对这些扫描代码的影响。我使用 ASCII `null`字符(0)表示所有没有直接映射的 ASCII 键(例如函数键)。退格映射到ASCII退格字符(8表示 `\b` ), `enter` 映射到ASCII新行字符(10表示 `\n`), `tab` 映射到ASCII水平制表符(9表示 `\t` )。
+
+
+`KeyboardGetChar` 方法需要做以下工作:
+ 1. 检查 `KeyboardAddress` 是否返回 0。如果是,则返回0。
+ 2. 调用 `KeyboardGetKeyDown` 最多 6 次。每次:
+ 1. 如果按键时0,跳出循环。
+ 2. 调用 `KeyWasDown`。 如果返回是,处理下一个按键。
+ 3. 如果扫描码超过 103,进入下一个按键。
+ 4. 调用 `KeyboardGetModifiers`
+ 5. 如果 `shift` 是被按着的,就加载 `KeysShift` 的地址。否则加载 `KeysNormal` 的地址。
+ 6. 从表中读出 ASCII 码值。
+ 7. 如果是 0,进行下一个按键,否则返回 ASCII 码值并退出。
+ 3. 返回0。
+
+
+试着自己实现。我的实现展示在下面:
+
+1.
+```
+.globl KeyboardGetChar
+KeyboardGetChar:
+ldr r0,=KeyboardAddress
+ldr r1,[r0]
+teq r1,#0
+moveq r0,#0
+moveq pc,lr
+```
+简单的检查我们是否有键盘。
+
+2.
+```
+push {r4,r5,r6,lr}
+kbd .req r4
+key .req r6
+mov r4,r1
+mov r5,#0
+keyLoop$:
+ mov r0,kbd
+ mov r1,r5
+ bl KeyboardGetKeyDown
+```
+r5 will hold the index of the key, r4 holds the keyboard address.
+`r5` 将会保存按键的索引, `r4` 保存键盘的地址。
+
+ 1.
+ ```
+ teq r0,#0
+ beq keyLoopBreak$
+ ```
+ 如果扫描码是0,它要么意味着有错,要么说明没有更多按键了。
+
+ 2.
+ ```
+ mov key,r0
+ bl KeyWasDown
+ teq r0,#0
+ bne keyLoopContinue$
+ ```
+ 如果按键已经按下了,那么他就没意思了,我们只想知道按下的按键。
+
+ 3.
+ ```
+ cmp key,#104
+ bge keyLoopContinue$
+ ```
+ 如果一个按键有个超过 104 的扫描码,他将会超出我们的表,所以它是无关的按键。
+
+ 4.
+ ```
+ mov r0,kbd
+ bl KeyboardGetModifiers
+ ```
+ 我们需要知道修饰键来推断字符。
+
+ 5.
+ ```
+ tst r0,#0b00100010
+ ldreq r0,=KeysNormal
+ ldrne r0,=KeysShift
+ ```
+ 当将字符更改为其移位变体时,我们要同时检测左 `shift` 键和右 `shift` 键。记住,`tst` 指令计算的是逻辑和,然后将其与 0 进行比较,所以当且仅当移位位都为 0 时,它才等于0。
+
+
+ 1.
+ ```
+ ldrb r0,[r0,key]
+ ```
+ 现在我们可以从查找表加载按键了。
+
+ 1.
+ ```
+ teq r0,#0
+ bne keyboardGetCharReturn$
+ keyLoopContinue$:
+ add r5,#1
+ cmp r5,#6
+ blt keyLoop$
+ ```
+ 如果查找码包含一个 0,我们必须继续。为了继续,我们要增加索引,并检查是否到 6 次了。
+
+1.
+```
+keyLoopBreak$:
+mov r0,#0
+keyboardGetCharReturn$:
+pop {r4,r5,r6,pc}
+.unreq kbd
+.unreq key
+```
+在这里我们返回我们的按键,如果我们到达 `keyLoopBreak$` ,然后我们就知道这里没有按键被握住,所以返回0。
+
+### 8 记事本操作系统
+
+现在我们有了 `KeyboardGetChar` 方法,可以创建一个操作系统,只输入用户对着屏幕所写的内容。为了简单起见,我们将忽略所有不寻常的键。在 `main.s` ,删除`bl SetGraphicsAddress` 之后的所有代码。调用 `UsbInitialise`,将 `r4` 和 `r5` 设置为 0,然后循环执行以下命令:
+
+ 1. 调用 `KeyboardUpdate`
+ 2. 调用 `KeyboardGetChar`
+ 3. 如果返回 0,跳转到步骤1
+ 4. 复制 `r4` 和 `r5` 到 `r1` 和 `r2` ,然后调用 `DrawCharacter`
+ 5. 把 `r0` 加到 `r4`
+ 6. 如果 `r4` 是 1024,将 `r1` 加到 `r5`,然后设置 `r4` 为 0。
+ 7. 如果 `r5` 是 768,设置 `r5` 为0
+ 8. 跳转到步骤1
+
+
+
+现在编译这个,然后在 PI 上测试。您几乎可以立即开始在屏幕上输入文本。如果没有,请参阅我们的故障排除页面。
+
+当它工作时,祝贺您,您已经实现了与计算机的接口。现在您应该开始意识到,您几乎已经拥有了一个原始的操作系统。现在,您可以与计算机交互,发出命令,并在屏幕上接收反馈。在下一篇教程[输入02][3]中,我们将研究如何生成一个全文本终端,用户在其中输入命令,然后计算机执行这些命令。
+
+--------------------------------------------------------------------------------
+
+via: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/input01.html
+
+作者:[Alex Chadwick][a]
+选题:[lujun9972][b]
+译者:[ezio](https://github.com/oska874)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.cl.cam.ac.uk
+[b]: https://github.com/lujun9972
+[1]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/downloads.html
+[2]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/downloads/hut1_12v2.pdf
+[3]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/input02.html
diff --git a/translated/tech/20150616 Computer Laboratory - Raspberry Pi- Lesson 11 Input02.md b/translated/tech/20150616 Computer Laboratory - Raspberry Pi- Lesson 11 Input02.md
new file mode 100644
index 0000000000..6b5db8b104
--- /dev/null
+++ b/translated/tech/20150616 Computer Laboratory - Raspberry Pi- Lesson 11 Input02.md
@@ -0,0 +1,911 @@
+[#]: collector: (lujun9972)
+[#]: translator: (guevaraya )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Computer Laboratory – Raspberry Pi: Lesson 11 Input02)
+[#]: via: (https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/input02.html)
+[#]: author: (Alex Chadwick https://www.cl.cam.ac.uk)
+
+计算机实验室 – 树莓派开发: 课程11 输入02
+======
+
+课程输入02是以课程输入01基础讲解的,通过一个简单的命令行实现用户的命令输入和计算机的处理和显示。本文假设你已经具备 [课程11:输入01][1] 的操作系统代码基础。
+
+### 1 终端
+
+```
+早期的计算一般是在一栋楼里的一个巨型计算机系统,他有很多可以输命令的'终端'。计算机依次执行不同来源的命令。
+```
+
+几乎所有的操作系统都是以字符终端显示启动的。经典的黑底白字,通过键盘输入计算机要执行的命令,然后会提示你拼写错误,或者恰好得到你想要的执行结果。这种方法有两个主要优点:键盘和显示器可以提供简易,健壮的计算机交互机制,几乎所有的计算机系统都采用这个机制,这个也广泛被系统管理员应用。
+
+让我们分析下真正想要哪些信息:
+
+1. 计算机打开后,显示欢迎信息
+2. 计算机启动后可以接受输入标志
+3. 用户从键盘输入带参数的命令
+4. 用户输入回车键或提交按钮
+5. 计算机解析命令后执行可用的命令
+6. 计算机显示命令的执行结果,过程信息
+7. 循环跳转到步骤2
+
+
+这样的终端被定义为标准的输入输出设备。用于输入的屏幕和输出打印的屏幕是同一个。也就是说终端是对字符显示的一个抽象。字符显示中,单个字符是最小的单元,而不是像素。屏幕被划分成固定数量不同颜色的字符。我们可以在现有的屏幕代码基础上,先存储字符和对应的颜色,然后再用方法 DrawCharacter 把其推送到屏幕上。一旦我们需要字符显示,就只需要在屏幕上画出一行字符串。
+
+新建文件名为 terminal.s 如下:
+```
+.section .data
+.align 4
+terminalStart:
+.int terminalBuffer
+terminalStop:
+.int terminalBuffer
+terminalView:
+.int terminalBuffer
+terminalColour:
+.byte 0xf
+.align 8
+terminalBuffer:
+.rept 128*128
+.byte 0x7f
+.byte 0x0
+.endr
+terminalScreen:
+.rept 1024/8 core.md Dict.md lctt2014.md lctt2016.md lctt2018.md LICENSE published README.md scripts sources translated 768/16
+.byte 0x7f
+.byte 0x0
+.endr
+```
+这是文件终端的配置数据文件。我们有两个主要的存储变量:terminalBuffer 和 terminalScreen。terminalBuffer保存所有显示过的字符。它保存128行字符文本(1行包含128个字符)。每个字符有一个 ASCII 字符和颜色单元组成,初始值为0x7f(ASCII的删除键)和 0(前景色和背景色为黑)。terminalScreen 保存当前屏幕显示的字符。它保存128x48的字符,与 terminalBuffer 初始化值一样。你可能会想我仅需要terminalScreen就够了,为什么还要terminalBuffer,其实有两个好处:
+
+ 1. 我们可以很容易看到字符串的变化,只需画出有变化的字符。
+ 2. 我们可以回滚终端显示的历史字符,也就是缓冲的字符(有限制)
+
+
+你总是需要尝试去设计一个高效的系统,如果很少变化的条件这个系统会运行的更快。
+
+独特的技巧在低功耗系统里很常见。画屏是很耗时的操作,因此我们仅在不得已的时候才去执行这个操作。在这个系统里,我们可以任意改变terminalBuffer,然后调用一个仅拷贝屏幕上字节变化的方法。也就是说我们不需要持续画出每个字符,这样可以节省一大段跨行文本的操作时间。
+
+其他在 .data 段的值得含义如下:
+
+ * terminalStart
+ 写入到 terminalBuffer 的第一个字符
+ * terminalStop
+ 写入到 terminalBuffer 的最后一个字符
+ * terminalView
+ 表示当前屏幕的第一个字符,这样我们可以控制滚动屏幕
+ * temrinalColour
+ 即将被描画的字符颜色
+
+
+```
+循环缓冲区是**数据结构**一个例子。这是一个组织数据的思路,有时我们通过软件实现这种思路。
+```
+
+![显示 Hellow world 插入到大小为5的循环缓冲区的示意图。][2]
+terminalStart 需要保存起来的原因是 termainlBuffer 是一个循环缓冲区。意思是当缓冲区变满时,末尾地方会回滚覆盖开始位置,这样最后一个字符变成了第一个字符。因此我们需要将 terminalStart 往前推进,这样我们知道我们已经占满它了。如何实现缓冲区检测:如果索引越界到缓冲区的末尾,就将索引指向缓冲区的开始位置。循环缓冲区是一个比较常见的高明的存储大量数据的方法,往往这些数据的最近部分比较重要。它允许无限制的写入,只保证最近一些特定数据有效。这个常常用于信号处理和数据压缩算法。这样的情况,可以允许我们存储128行终端记录,超过128行也不会有问题。如果不是这样,当超过第128行时,我们需要把127行分别向前拷贝一次,这样很浪费时间。
+
+之前已经提到过 terminalColour 几次了。你可以根据你的想法实现终端颜色,但这个文本终端有16个前景色和16个背景色(这里相当于有16²=256种组合)。[CGA][3]终端的颜色定义如下:
+
+表格 1.1 - CGA 颜色编码
+
+| 序号 | 颜色 (R, G, B) |
+| ------ | ------------------------|
+| 0 | 黑 (0, 0, 0) |
+| 1 | 蓝 (0, 0, ⅔) |
+| 2 | 绿 (0, ⅔, 0) |
+| 3 | 青色 (0, ⅔, ⅔) |
+| 4 | 红色 (⅔, 0, 0) |
+| 5 | 品红 (⅔, 0, ⅔) |
+| 6 | 棕色 (⅔, ⅓, 0) |
+| 7 | 浅灰色 (⅔, ⅔, ⅔) |
+| 8 | 灰色 (⅓, ⅓, ⅓) |
+| 9 | 淡蓝色 (⅓, ⅓, 1) |
+| 10 | 淡绿色 (⅓, 1, ⅓) |
+| 11 | 淡青色 (⅓, 1, 1) |
+| 12 | 淡红色 (1, ⅓, ⅓) |
+| 13 | 浅品红 (1, ⅓, 1) |
+| 14 | 黄色 (1, 1, ⅓) |
+| 15 | 白色 (1, 1, 1) |
+
+```
+棕色作为替代色(黑黄色)既不吸引人也没有什么用处。
+```
+我们将前景色保存到颜色的低字节,背景色保存到颜色高字节。除过棕色,其他这些颜色遵循一种模式如二进制的高位比特代表增加 ⅓ 到每个组件,其他比特代表增加⅔到各自组件。这样很容易进行RGB颜色转换。
+
+我们需要一个方法从TerminalColour读取颜色编码的四个比特,然后用16比特等效参数调用 SetForeColour。尝试实现你自己实现。如果你感觉麻烦或者还没有完成屏幕系列课程,我们的实现如下:
+
+```
+.section .text
+TerminalColour:
+teq r0,#6
+ldreq r0,=0x02B5
+beq SetForeColour
+
+tst r0,#0b1000
+ldrne r1,=0x52AA
+moveq r1,#0
+tst r0,#0b0100
+addne r1,#0x15
+tst r0,#0b0010
+addne r1,#0x540
+tst r0,#0b0001
+addne r1,#0xA800
+mov r0,r1
+b SetForeColour
+```
+### 2 文本显示
+
+我们的终端第一个真正需要的方法是 TerminalDisplay,它用来把当前的数据从 terminalBuffe r拷贝到 terminalScreen 和实际的屏幕。如上所述,这个方法必须是最小开销的操作,因为我们需要频繁调用它。它主要比较 terminalBuffer 与 terminalDisplay的文本,然后只拷贝有差异的字节。请记住 terminalBuffer 是循环缓冲区运行的,这种情况,从 terminalView 到 terminalStop 或者 128*48 字符集,哪个来的最快。如果我们遇到 terminalStop,我们将会假定在这之后的所有字符是7f16 (ASCII delete),背景色为0(黑色前景色和背景色)。
+
+让我们看看必须要做的事情:
+
+ 1. 加载 terminalView ,terminalStop 和 terminalDisplay 的地址。
+ 2. 执行每一行:
+ 1. 执行每一列:
+ 1. 如果 terminalView 不等于 terminalStop,根据 terminalView 加载当前字符和颜色
+ 2. 否则加载 0x7f 和颜色 0
+ 3. 从 terminalDisplay 加载当前的字符
+ 4. 如果字符和颜色相同,直接跳转到10
+ 5. 存储字符和颜色到 terminalDisplay
+ 6. 用 r0 作为背景色参数调用 TerminalColour
+ 7. 用 r0 = 0x7f (ASCII 删除键, 一大块), r1 = x, r2 = y 调用 DrawCharacter
+ 8. 用 r0 作为前景色参数调用 TerminalColour
+ 9. 用 r0 = 字符, r1 = x, r2 = y 调用 DrawCharacter
+ 10. 对位置参数 terminalDisplay 累加2
+ 11. 如果 terminalView 不等于 terminalStop不能相等 terminalView 位置参数累加2
+ 12. 如果 terminalView 位置已经是文件缓冲器的末尾,将他设置为缓冲区的开始位置
+ 13. x 坐标增加8
+ 2. y 坐标增加16
+
+
+Try to implement this yourself. If you get stuck, my solution is given below:
+尝试去自己实现吧。如果你遇到问题,我们的方案下面给出来了:
+
+1.
+```
+.globl TerminalDisplay
+TerminalDisplay:
+push {r4,r5,r6,r7,r8,r9,r10,r11,lr}
+x .req r4
+y .req r5
+char .req r6
+col .req r7
+screen .req r8
+taddr .req r9
+view .req r10
+stop .req r11
+
+ldr taddr,=terminalStart
+ldr view,[taddr,#terminalView - terminalStart]
+ldr stop,[taddr,#terminalStop - terminalStart]
+add taddr,#terminalBuffer - terminalStart
+add taddr,#128*128*2
+mov screen,taddr
+```
+
+我这里的变量有点乱。为了方便起见,我用 taddr 存储 textBuffer 的末尾位置。
+
+2.
+```
+mov y,#0
+yLoop$:
+```
+从yLoop开始运行。
+
+ 1.
+ ```
+ mov x,#0
+ xLoop$:
+ ```
+ 从yLoop开始运行。
+
+ 1.
+ ```
+ teq view,stop
+ ldrneh char,[view]
+ ```
+ 为了方便起见,我把字符和颜色同时加载到 char 变量了
+
+ 2.
+ ```
+ moveq char,#0x7f
+ ```
+ 这行是对上面一行的补充说明:读取黑色的Delete键
+
+ 3.
+ ```
+ ldrh col,[screen]
+ ```
+ 为了简便我把字符和颜色同时加载到 col 里。
+
+ 4.
+ ```
+ teq col,char
+ beq xLoopContinue$
+ ```
+ 现在我用teq指令检查是否有数据变化
+
+ 5.
+ ```
+ strh char,[screen]
+ ```
+ 我可以容易的保存当前值
+
+ 6.
+ ```
+ lsr col,char,#8
+ and char,#0x7f
+ lsr r0,col,#4
+ bl TerminalColour
+ ```
+ 我用 bitshift(比特偏移) 指令和 and 指令从 char 变量中分离出颜色到 col 变量和字符到 char变量,然后再用bitshift(比特偏移)指令后调用TerminalColour 获取背景色。
+
+ 7.
+ ```
+ mov r0,#0x7f
+ mov r1,x
+ mov r2,y
+ bl DrawCharacter
+ ```
+ 写入一个彩色的删除字符块
+
+ 8.
+ ```
+ and r0,col,#0xf
+ bl TerminalColour
+ ```
+ 用 and 指令获取 col 变量的最低字节,然后调用TerminalColour
+
+ 9.
+ ```
+ mov r0,char
+ mov r1,x
+ mov r2,y
+ bl DrawCharacter
+ ```
+ 写入我们需要的字符
+
+ 10.
+ ```
+ xLoopContinue$:
+ add screen,#2
+ ```
+ 自增屏幕指针
+
+ 11.
+ ```
+ teq view,stop
+ addne view,#2
+ ```
+ 如果可能自增view指针
+
+ 12.
+ ```
+ teq view,taddr
+ subeq view,#128*128*2
+ ```
+ 很容易检测 view指针是否越界到缓冲区的末尾,因为缓冲区的地址保存在 taddr 变量里
+
+ 13.
+ ```
+ add x,#8
+ teq x,#1024
+ bne xLoop$
+ ```
+ 如果还有字符需要显示,我们就需要自增 x 变量然后循环到 xLoop 执行
+
+ 2.
+ ```
+ add y,#16
+ teq y,#768
+ bne yLoop$
+ ```
+ 如果还有更多的字符显示我们就需要自增 y 变量,然后循环到 yLoop 执行
+
+```
+pop {r4,r5,r6,r7,r8,r9,r10,r11,pc}
+.unreq x
+.unreq y
+.unreq char
+.unreq col
+.unreq screen
+.unreq taddr
+.unreq view
+.unreq stop
+```
+不要忘记最后清除变量
+
+
+### 3 行打印
+
+现在我有了自己 TerminalDisplay方法,它可以自动显示 terminalBuffer 到 terminalScreen,因此理论上我们可以画出文本。但是实际上我们没有任何基于字符显示的实例。 首先快速容易上手的方法便是 TerminalClear, 它可以彻底清除终端。这个方法没有循环很容易实现。可以尝试分析下面的方法应该不难:
+
+```
+.globl TerminalClear
+TerminalClear:
+ldr r0,=terminalStart
+add r1,r0,#terminalBuffer-terminalStart
+str r1,[r0]
+str r1,[r0,#terminalStop-terminalStart]
+str r1,[r0,#terminalView-terminalStart]
+mov pc,lr
+```
+
+现在我们需要构造一个字符显示的基础方法:打印函数。它将保存在 r0 的字符串和 保存在 r1 字符串长度简易的写到屏幕上。有一些特定字符需要特别的注意,这些特定的操作是确保 terminalView 是最新的。我们来分析一下需要做啥:
+
+ 1. 检查字符串的长度是否为0,如果是就直接返回
+ 2. 加载 terminalStop 和 terminalView
+ 3. 计算出 terminalStop 的 x 坐标
+ 4. 对每一个字符的操作:
+ 1. 检查字符是否为新起一行
+ 2. 如果是的话,自增 bufferStop 到行末,同时写入黑色删除键
+ 3. 否则拷贝当前 terminalColour 的字符
+ 4. 加成是在行末
+ 5. 如果是,检查从 terminalView 到 terminalStop 之间的字符数是否大于一屏
+ 6. 如果是,terminalView 自增一行
+ 7. 检查 terminalView 是否为缓冲区的末尾,如果是的话将其替换为缓冲区的起始位置
+ 8. 检查 terminalStop 是否为缓冲区的末尾,如果是的话将其替换为缓冲区的起始位置
+ 9. 检查 terminalStop 是否等于 terminalStart, 如果是的话 terminalStart 自增一行。
+ 10. 检查 terminalStart 是否为缓冲区的末尾,如果是的话将其替换为缓冲区的起始位置
+ 5. 存取 terminalStop 和 terminalView
+
+
+试一下自己去实现。我们的方案提供如下:
+
+1.
+```
+.globl Print
+Print:
+teq r1,#0
+moveq pc,lr
+```
+这个是打印函数开始快速检查字符串为0的代码
+
+2.
+```
+push {r4,r5,r6,r7,r8,r9,r10,r11,lr}
+bufferStart .req r4
+taddr .req r5
+x .req r6
+string .req r7
+length .req r8
+char .req r9
+bufferStop .req r10
+view .req r11
+
+mov string,r0
+mov length,r1
+
+ldr taddr,=terminalStart
+ldr bufferStop,[taddr,#terminalStop-terminalStart]
+ldr view,[taddr,#terminalView-terminalStart]
+ldr bufferStart,[taddr]
+add taddr,#terminalBuffer-terminalStart
+add taddr,#128*128*2
+```
+
+这里我做了很多配置。 bufferStart 代表 terminalStart, bufferStop代表terminalStop, view 代表 terminalView,taddr 代表 terminalBuffer 的末尾地址。
+
+3.
+```
+and x,bufferStop,#0xfe
+lsr x,#1
+```
+和通常一样,巧妙的对齐技巧让许多事情更容易。由于需要对齐 terminalBuffer,每个字符的 x 坐标需要8位要除以2。
+
+ 4.
+ 1.
+ ```
+ charLoop$:
+ ldrb char,[string]
+ and char,#0x7f
+ teq char,#'\n'
+ bne charNormal$
+ ```
+ 我们需要检查新行
+
+ 2.
+ ```
+ mov r0,#0x7f
+ clearLine$:
+ strh r0,[bufferStop]
+ add bufferStop,#2
+ add x,#1
+ teq x,#128 blt clearLine$
+
+ b charLoopContinue$
+ ```
+ 循环执行值到行末写入 0x7f;黑色删除键
+
+ 3.
+ ```
+ charNormal$:
+ strb char,[bufferStop]
+ ldr r0,=terminalColour
+ ldrb r0,[r0]
+ strb r0,[bufferStop,#1]
+ add bufferStop,#2
+ add x,#1
+ ```
+ 存储字符串的当前字符和 terminalBuffer 末尾的 terminalColour然后将它和 x 变量自增
+
+ 4.
+ ```
+ charLoopContinue$:
+ cmp x,#128
+ blt noScroll$
+ ```
+ 检查 x 是否为行末;128
+
+ 5.
+ ```
+ mov x,#0
+ subs r0,bufferStop,view
+ addlt r0,#128*128*2
+ cmp r0,#128*(768/16)*2
+ ```
+ 这是 x 为 0 然后检查我们是否已经显示超过1屏。请记住,我们是用的循环缓冲区,因此如果 bufferStop 和 view 之前差是负值,我们实际使用是环绕缓冲区。
+
+ 6.
+ ```
+ addge view,#128*2
+ ```
+ 增加一行字节到 view 的地址
+
+ 7.
+ ```
+ teq view,taddr
+ subeq view,taddr,#128*128*2
+ ```
+ 如果 view 地址是缓冲区的末尾,我们就从它上面减去缓冲区的长度,让其指向开始位置。我会在开始的时候设置 taddr 为缓冲区的末尾地址。
+
+ 8.
+ ```
+ noScroll$:
+ teq bufferStop,taddr
+ subeq bufferStop,taddr,#128*128*2
+ ```
+ 如果 stop 的地址在缓冲区末尾,我们就从它上面减去缓冲区的长度,让其指向开始位置。我会在开始的时候设置 taddr 为缓冲区的末尾地址。
+
+ 9.
+ ```
+ teq bufferStop,bufferStart
+ addeq bufferStart,#128*2
+ ```
+ 检查 bufferStop 是否等于 bufferStart。 如果等于增加一行到 bufferStart。
+
+ 10.
+ ```
+ teq bufferStart,taddr
+ subeq bufferStart,taddr,#128*128*2
+ ```
+ 如果 start 的地址在缓冲区的末尾,我们就从它上面减去缓冲区的长度,让其指向开始位置。我会在开始的时候设置 taddr 为缓冲区的末尾地址。
+
+```
+subs length,#1
+add string,#1
+bgt charLoop$
+```
+循环执行知道字符串结束
+
+5.
+```
+charLoopBreak$:
+sub taddr,#128*128*2
+sub taddr,#terminalBuffer-terminalStart
+str bufferStop,[taddr,#terminalStop-terminalStart]
+str view,[taddr,#terminalView-terminalStart]
+str bufferStart,[taddr]
+
+pop {r4,r5,r6,r7,r8,r9,r10,r11,pc}
+.unreq bufferStart
+.unreq taddr
+.unreq x
+.unreq string
+.unreq length
+.unreq char
+.unreq bufferStop
+.unreq view
+```
+保存变量然后返回
+
+
+这个方法允许我们打印任意字符到屏幕。然而我们用了颜色变量,但实际上没有设置它。一般终端用特性的组合字符去行修改颜色。如ASCII转移(1b16)后面跟着一个0-f的16进制的书,就可以设置前景色为 CGA颜色。如果你自己想尝试实现;在下载页面有一个我的详细的例子。
+
+
+### 4 标志输入
+
+```
+按照惯例,许多编程语言中,任意程序可以访问 stdin 和 stdin,他们可以连接到终端的输入和输出流。在图形程序其实也可以进行同样操作,但实际几乎不用。
+```
+
+现在我们有一个可以打印和显示文本的输出终端。这仅仅是说了一半,我们需要输入。我们想实现一个方法:Readline,可以保存文件的一行文本,文本位置有 r0 给出,最大的长度由 r1 给出,返回 r0 里面的字符串长度。棘手的是用户输出字符的时候要回显功能,同时想要退格键的删除功能和命令回车执行功能。他们还想需要一个闪烁的下划线代表计算机需要输入。这些完全合理的要求让构造这个方法更具有挑战性。有一个方法完成这些需求就是存储用户输入的文本和文件大小到内存的某个地方。然后当调用 ReadLine 的时候,移动 terminalStop 的地址到它开始的地方然后调用 Print。也就是说我们只需要确保在内存维护一个字符串,然后构造一个我们自己的打印函数。
+
+让我们看看 ReadLine做了哪些事情:
+
+ 1. 如果字符串可保存的最大长度为0,直接返回
+ 2. 检索 terminalStop 和 terminalStop 的当前值
+ 3. 如果字符串的最大长度大约缓冲区的一半,就设置大小为缓冲区的一半
+ 4. 从最大长度里面减去1来确保输入的闪烁字符或结束符
+ 5. 向字符串写入一个下划线
+ 6. 写入一个 terminalView 和 terminalStop 的地址到内存
+ 7. 调用 Print 大约当前字符串
+ 8. 调用 TerminalDisplay
+ 9. 调用 KeyboardUpdate
+ 10. 调用 KeyboardGetChar
+ 11. 如果为一个新行直接跳转到16
+ 12. 如果是一个退格键,将字符串长度减一(如果其大约0)
+ 13. 如果是一个普通字符,将他写入字符串(字符串大小确保小于最大值)
+ 14. 如果字符串是以下划线结束,写入一个空格,否则写入下划线
+ 15. 跳转到6
+ 16. 字符串的末尾写入一个新行
+ 17. 调用 Print 和 TerminalDisplay
+ 18. 用结束符替换新行
+ 19. 返回字符串的长度
+
+
+
+为了方便读者理解,然后然后自己去实现,我们的实现提供如下:
+
+1.
+```
+.globl ReadLine
+ReadLine:
+teq r1,#0
+moveq r0,#0
+moveq pc,lr
+```
+快速处理长度为0的情况
+
+2.
+```
+string .req r4
+maxLength .req r5
+input .req r6
+taddr .req r7
+length .req r8
+view .req r9
+
+push {r4,r5,r6,r7,r8,r9,lr}
+
+mov string,r0
+mov maxLength,r1
+ldr taddr,=terminalStart
+ldr input,[taddr,#terminalStop-terminalStart]
+ldr view,[taddr,#terminalView-terminalStart]
+mov length,#0
+```
+考虑到常见的场景,我们初期做了很多初始化动作。input 代表 terminalStop 的值,view 代表 terminalView。Length 默认为 0.
+
+3.
+```
+cmp maxLength,#128*64
+movhi maxLength,#128*64
+```
+我们必须检查异常大的读操作,我们不能处理超过 terminalBuffer 大小的输入(理论上可行,但是terminalStart 移动越过存储的terminalStop,会有很多问题)。
+
+4.
+```
+sub maxLength,#1
+```
+由于用户需要一个闪烁的光标,我们需要一个备用字符在理想状况在这个字符串后面放一个结束符。
+
+5.
+```
+mov r0,#'_'
+strb r0,[string,length]
+```
+写入一个下划线让用户知道我们可以输入了。
+
+6.
+```
+readLoop$:
+str input,[taddr,#terminalStop-terminalStart]
+str view,[taddr,#terminalView-terminalStart]
+```
+保存 terminalStop 和 terminalView。这个对重置一个终端很重要,它会修改这些变量。严格讲也可以修改 terminalStart,但是不可逆。
+
+7.
+```
+mov r0,string
+mov r1,length
+add r1,#1
+bl Print
+```
+写入当前的输入。由于下划线因此字符串长度加1
+8.
+```
+bl TerminalDisplay
+```
+拷贝下一个文本到屏幕
+
+9.
+```
+bl KeyboardUpdate
+```
+获取最近一次键盘输入
+
+10.
+```
+bl KeyboardGetChar
+```
+检索键盘输入键值
+
+11.
+```
+teq r0,#'\n'
+beq readLoopBreak$
+teq r0,#0
+beq cursor$
+teq r0,#'\b'
+bne standard$
+```
+
+如果我们有一个回车键,循环中断。如果有结束符和一个退格键也会同样跳出选好。
+
+12.
+```
+delete$:
+cmp length,#0
+subgt length,#1
+b cursor$
+```
+从 length 里面删除一个字符
+
+13.
+```
+standard$:
+cmp length,maxLength
+bge cursor$
+strb r0,[string,length]
+add length,#1
+```
+写回一个普通字符
+
+14.
+```
+cursor$:
+ldrb r0,[string,length]
+teq r0,#'_'
+moveq r0,#' '
+movne r0,#'_'
+strb r0,[string,length]
+```
+加载最近的一个字符,如果不是下换线则修改为下换线,如果是空格则修改为下划线
+
+15.
+```
+b readLoop$
+readLoopBreak$:
+```
+循环执行值到用户输入按下
+
+16.
+```
+mov r0,#'\n'
+strb r0,[string,length]
+```
+在字符串的结尾处存入一新行
+
+17.
+```
+str input,[taddr,#terminalStop-terminalStart]
+str view,[taddr,#terminalView-terminalStart]
+mov r0,string
+mov r1,length
+add r1,#1
+bl Print
+bl TerminalDisplay
+```
+重置 terminalView 和 terminalStop 然后调用 Print 和 TerminalDisplay 输入回显
+
+
+18.
+```
+mov r0,#0
+strb r0,[string,length]
+```
+写入一个结束符
+
+19.
+```
+mov r0,length
+pop {r4,r5,r6,r7,r8,r9,pc}
+.unreq string
+.unreq maxLength
+.unreq input
+.unreq taddr
+.unreq length
+.unreq view
+```
+返回长度
+
+
+
+
+### 5 终端: 机器进化
+
+现在我们理论用终端和用户可以交互了。最显而易见的事情就是拿去测试了!在 'main.s' 里UsbInitialise后面的删除代码如下
+
+```
+reset$:
+ mov sp,#0x8000
+ bl TerminalClear
+
+ ldr r0,=welcome
+ mov r1,#welcomeEnd-welcome
+ bl Print
+
+loop$:
+ ldr r0,=prompt
+ mov r1,#promptEnd-prompt
+ bl Print
+
+ ldr r0,=command
+ mov r1,#commandEnd-command
+ bl ReadLine
+
+ teq r0,#0
+ beq loopContinue$
+
+ mov r4,r0
+
+ ldr r5,=command
+ ldr r6,=commandTable
+
+ ldr r7,[r6,#0]
+ ldr r9,[r6,#4]
+ commandLoop$:
+ ldr r8,[r6,#8]
+ sub r1,r8,r7
+
+ cmp r1,r4
+ bgt commandLoopContinue$
+
+ mov r0,#0
+ commandName$:
+ ldrb r2,[r5,r0]
+ ldrb r3,[r7,r0]
+ teq r2,r3
+ bne commandLoopContinue$
+ add r0,#1
+ teq r0,r1
+ bne commandName$
+
+ ldrb r2,[r5,r0]
+ teq r2,#0
+ teqne r2,#' '
+ bne commandLoopContinue$
+
+ mov r0,r5
+ mov r1,r4
+ mov lr,pc
+ mov pc,r9
+ b loopContinue$
+
+ commandLoopContinue$:
+ add r6,#8
+ mov r7,r8
+ ldr r9,[r6,#4]
+ teq r9,#0
+ bne commandLoop$
+
+ ldr r0,=commandUnknown
+ mov r1,#commandUnknownEnd-commandUnknown
+ ldr r2,=formatBuffer
+ ldr r3,=command
+ bl FormatString
+
+ mov r1,r0
+ ldr r0,=formatBuffer
+ bl Print
+
+loopContinue$:
+ bl TerminalDisplay
+ b loop$
+
+echo:
+ cmp r1,#5
+ movle pc,lr
+
+ add r0,#5
+ sub r1,#5
+ b Print
+
+ok:
+ teq r1,#5
+ beq okOn$
+ teq r1,#6
+ beq okOff$
+ mov pc,lr
+
+ okOn$:
+ ldrb r2,[r0,#3]
+ teq r2,#'o'
+ ldreqb r2,[r0,#4]
+ teqeq r2,#'n'
+ movne pc,lr
+ mov r1,#0
+ b okAct$
+
+ okOff$:
+ ldrb r2,[r0,#3]
+ teq r2,#'o'
+ ldreqb r2,[r0,#4]
+ teqeq r2,#'f'
+ ldreqb r2,[r0,#5]
+ teqeq r2,#'f'
+ movne pc,lr
+ mov r1,#1
+
+ okAct$:
+
+ mov r0,#16
+ b SetGpio
+
+.section .data
+.align 2
+welcome: .ascii "Welcome to Alex's OS - Everyone's favourite OS"
+welcomeEnd:
+.align 2
+prompt: .ascii "\n> "
+promptEnd:
+.align 2
+command:
+ .rept 128
+ .byte 0
+ .endr
+commandEnd:
+.byte 0
+.align 2
+commandUnknown: .ascii "Command `%s' was not recognised.\n"
+commandUnknownEnd:
+.align 2
+formatBuffer:
+ .rept 256
+ .byte 0
+ .endr
+formatEnd:
+
+.align 2
+commandStringEcho: .ascii "echo"
+commandStringReset: .ascii "reset"
+commandStringOk: .ascii "ok"
+commandStringCls: .ascii "cls"
+commandStringEnd:
+
+.align 2
+commandTable:
+.int commandStringEcho, echo
+.int commandStringReset, reset$
+.int commandStringOk, ok
+.int commandStringCls, TerminalClear
+.int commandStringEnd, 0
+```
+这块代码集成了一个简易的命令行操作系统。支持命令:echo,reset,ok 和 cls。echo 拷贝任意文本到终端,reset命令会在系统出现问题的是复位操作系统,ok 有两个功能:设置 OK 灯亮灭,最后 cls 调用 TerminalClear 清空终端。
+
+试试树莓派的代码吧。如果遇到问题,请参照问题集锦页面吧。
+
+如果运行正常,祝贺你完成了一个操作系统基本终端和输入系列的课程。很遗憾这个教程先讲到这里,但是我希望将来能制作更多教程。有问题请反馈至awc32@cam.ac.uk。
+
+你已经在建立了一个简易的终端操作系统。我们的代码在 commandTable 构造了一个可用的命令表格。每个表格的入口是一个整型数字,用来表示字符串的地址,和一个整型数字表格代码的执行入口。 最后一个入口是 为 0 的commandStringEnd。尝试实现你自己的命令,可以参照已有的函数,建立一个新的。函数的参数 r0 是用户输入的命令地址,r1是其长度。你可以用这个传递你输入值到你的命令。也许你有一个计算器程序,或许是一个绘图程序或国际象棋。不管你的什么电子,让它跑起来!
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/input02.html
+
+作者:[Alex Chadwick][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/guevaraya)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.cl.cam.ac.uk
+[b]: https://github.com/lujun9972
+[1]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/input01.html
+[2]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/images/circular_buffer.png
+[3]: https://en.wikipedia.org/wiki/Color_Graphics_Adapter
diff --git a/translated/tech/20180220 JSON vs XML vs TOML vs CSON vs YAML.md b/translated/tech/20180220 JSON vs XML vs TOML vs CSON vs YAML.md
new file mode 100644
index 0000000000..eb6e10eddb
--- /dev/null
+++ b/translated/tech/20180220 JSON vs XML vs TOML vs CSON vs YAML.md
@@ -0,0 +1,212 @@
+[#]: collector: (lujun9972)
+[#]: translator: (GraveAccent)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (JSON vs XML vs TOML vs CSON vs YAML)
+[#]: via: (https://www.zionandzion.com/json-vs-xml-vs-toml-vs-cson-vs-yaml/)
+[#]: author: (Tim Anderson https://www.zionandzion.com)
+
+JSON vs XML vs TOML vs CSON vs YAML
+======
+
+
+### 一段超级严肃的关于样本序列化的集合、子集和超集的文字
+
+我是开发者。我读代码。我写代码。我写会写代码的代码。我写会写供其它代码读的代码的代码。这些都非常火星语,但是有其美妙之处。然而,最后一点,写会写供其它代码读的代码的代码,可以很快变得比这段文字更费解。有很多方法可以做到这一点。一种不那么复杂而且开发者社区最爱的方式是数据序列化。对于那些不了解我刚刚向你抛的时髦词的人,数据序列化是从一个系统获取一些信息,将其转换为其它系统可以读取的格式,然后将其传递给其它系统的过程。
+
+虽然[数据序列化格式][1]多到可以埋葬哈利法塔,但它们大多分为两类:
+
+ * 易于人类读写,
+ * 易于机器读写。
+
+
+
+很难两全其美,因为人类喜欢让我们更具表现力的松散类型和灵活格式标准,而机器倾向于被确切告知一切事情不带疑惑和细节缺失,并且认为“严格规范”是他们最爱的 Ben & Jerry's 口味。
+
+由于我是一名 web 开发者而且我们是一个创建网站的代理商,我们将坚持使用 web 系统可以理解或不需要太多努力就能理解以及对人类可读性特别有用的特殊格式:XML,JSON,TOML,CSON以及 YAML。每个都有各自的优缺点和适当的用例。
+
+### 事实最先
+
+回到互联网的早期,[一些非常聪明的家伙][2]决定整合一种标准语言,即每个系统都能理解,创造性地将其命名为标准通用标记语言(简称SGML)。SGML 非常灵活,发布者也很好地定义了它。他成为了 XML,SVG 和 HTML 等语言之父。所有这三个都符合 SGML 规范,可是它们都是规则更严格、灵活性更少的子集。
+
+最终,人们开始看到大量非常小、简洁、易读且易于生成的数据,这些数据可以在系统之间以程序的方式共享,而开销很小。大约在那个时候,JSON 诞生了并且能够满足所有的需求。反过来,其它语言开始出现以处理更多的专业用例,如 CSON,TOML 和 YAML。
+
+### XML: 不行了
+
+最初,XML语言非常灵活且易于编写,但它的缺点是冗长,人类难以阅读,计算机非常难以读取,并且有很多语法对于传达信息并不是完全必要的。
+
+今天,它在 web 上的数据序列化目的已经消失了。除非你在编写 HTML 或者 SVG,否则你不太能在许多其它地方看到XML。一些过时的系统今天仍在使用它,但是用它传递数据往往太重了。
+
+我已经可以听到 XML 老人开始在他们的石碑上乱写为什么 XML 是了不起的,所以我将提供一个小的附录:XML可以很容易地由系统和人读写。然而,真的,我的意思是荒谬,很难创建一个可以将其读入规范的系统。这是一个简单美观的 XML 示例:
+
+```
+
+Gambardella, Matthew
+XML Developer's Guide
+Computer
+44.95
+2000-10-01
+An in-depth look at creating applications
+with XML.
+
+```
+
+太棒了。易于阅读,推理,编写和编码的可以读写的系统。但请考虑这个例子:
+
+```
+b"> ]>
+
+
+b b
+ d
+
+```
+
+这上面是 100% 有效的 XML。不可能阅读、理解或推理。编写可以使用和理解这个的代码将花费至少36头的头发和248磅咖啡。我们没有那么多时间或咖啡,而且我们大多数老人现在都是秃头。所以,让它活在我们的记忆里,就像 [css hacks][3],[internet explorer][4] 和[真空管][5]那样。
+
+### JSON: 并列聚会
+
+好吧,我们都同意了。XML = 差劲。那么,什么是好的替代品?JavaScript 对象表示法,简称 JSON。JSON(读起来像 Jason 这个名字) 是 Brendan Eich 发明的,并且被 [JavaScript 的荷兰叔叔][6] Douglas Crockford 推广。它现在几乎用在任何地方。这种格式很容易由人和机器编写,相当容易用规范中的严格规则[解析][7],并且灵活-允许深层嵌套数据,所有原始数据类型和集合如数组和对象的解释。JSON 成为了将数据从一个系统传输到另一个系统的事实标准。几乎所有语言都有内置读写它的功能。
+
+JSON语法很简单。 方括号表示数组,花括号表示记录,由冒号分隔两个值表示属性(或“键”)在左边,值在右边。所有键必须用双引号括起来:
+
+```
+{
+"books": [
+{
+"id": "bk102",
+"author": "Crockford, Douglas",
+"title": "JavaScript: The Good Parts",
+"genre": "Computer",
+"price": 29.99,
+"publish_date": "2008-05-01",
+"description": "Unearthing the Excellence in JavaScript"
+}
+]
+}
+```
+
+这对你来说应该是完全合理的。它简洁明了,并且从 XML 中删除了大量额外废话以传达相同数量的信息。JSON 现在是王道,本文剩下的部分会介绍其它语言格式,这些格式只不过是煮沸了的 JSON,尝试让其更简洁或更易读,可结构还是非常相似的。
+
+### TOML: 缩短到彻底的利他主义
+
+ TOML(Tom 的显而易见最低限度语言)允许快速简洁地定义深层嵌套的数据结构。名字中的名字是指发明者 [Tom Preston Werner][8],他是一位活跃于我们行业的创造者和软件开发人员。与 JSON 相比,语法有点尴尬,更类似 [ini 文件][9]。这不是一个糟糕的语法,但是需要一些时间适应。
+
+```
+[[books]]
+id = 'bk101'
+author = 'Crockford, Douglas'
+title = 'JavaScript: The Good Parts'
+genre = 'Computer'
+price = 29.99
+publish_date = 2008-05-01T00:00:00+00:00
+description = 'Unearthing the Excellence in JavaScript'
+```
+
+TOML 中集成了一些很棒的功能,例如多行字符串,保留字符的自动转义,日期,时间,整数,浮点数,科学记数法和“表扩展”等数据类型。最后一点是特别的,是TOML如此简洁的原因:
+
+```
+[a.b.c]
+d = 'Hello'
+e = 'World'
+```
+
+以上扩展到以下内容:
+
+```
+{
+"a": {
+"b": {
+"c": {
+"d": "Hello"
+"e": "World"
+}
+}
+}
+}
+```
+
+使用TOML,你可以肯定在时间和文件长度上会节省不少。很少有系统使用它或非常类似的东西作为配置,这是它最大的缺点。根本没有很多语言或库可以用来解释 TOML。
+
+### CSON: 特定系统所包含的简单样本
+
+首先,有两个 CSON 规范。 一个代表 CoffeeScript Object Notation,另一个代表 Cursive Script Object Notation。后者不经常使用,所以我们不会关注它。我们只关注 CoffeeScript。
+
+[CSON][10] 会介绍一点。首先,我们来谈谈 CoffeeScript。[CoffeeScript][11] 是一种通过运行编译器生成 JavaScript 的语言。它允许你以更加简洁的语法编写 JavaScript 并[转译][12]成实际的 JavaScript,然后你可以在你的 web 应用程序中使用它。CoffeeScript 通过删除 JavaScript 中必需的许多额外语法,使编写 JavaScript 变得更容易。CoffeeScript 摆脱的一个大问题是花括号 - 不需要他们。同样,CSON 是没有大括号的 JSON。它依赖于缩进来确定数据的层次结构。CSON 非常易于读写,并且通常比 JSON 需要更少的代码行,因为没有括号。
+
+CSON 还提供一些 JSON 不提供的额外细节。多行字符串非常容易编写,你可以通过使用 hash 符号开始一行来输入[注释][13],并且不需要用逗号分隔键值对。
+
+```
+books: [
+id: 'bk102'
+author: 'Crockford, Douglas'
+title: 'JavaScript: The Good Parts'
+genre: 'Computer'
+price: 29.99
+publish_date: '2008-05-01'
+description: 'Unearthing the Excellence in JavaScript'
+]
+```
+
+这是 CSON 的重大问题。它是 **CoffeScript** 对象表示法。也就是说你用 CoffeeScript 解析/标记化/lex/转译或其它方式使用 CSON。CoffeeScript 是读取数据的系统。如果数据序列化的目的是允许数据从一个系统传递到另一个系统,这里我们有一个只能由单个系统读取的数据序列化格式,这使得它与防火的火柴、防水的海绵或者叉勺恼人的脆弱分叉处一样有用。
+
+如果其它系统采用这种格式,它在开发者世界中可能非常有用。到目前为止这整体上没有发生,所以在 PHP 或 JAVA 等替代语言中使用它是不行的。
+
+### YAML:年轻人的呼喊
+
+开发人员感到高兴,因为 YAML 来自[一个 Python 的贡献者][14]。YAML 具有与 CSON 相同的功能集和类似的语法,一系列新功能,以及几乎所有 web 编程语言都可用的解析器。它还有一些额外的功能,如循环引用,软包装,多行键,类型转换标签,二进制数据,对象合并和[集合映射][15]。它具有令人难以置信的良好的可读性和可写性,并且是 JSON 的超集,因此你可以在 YAML 中使用完全合格的 JSON 语法并且一切正常工作。你几乎从不需要引号,它可以解释大多数基本数据类型(字符串,整数,浮点数,布尔值等)。
+
+```
+books:
+- id: bk102
+author: Crockford, Douglas
+title: 'JavaScript: The Good Parts'
+genre: Computer
+price: 29.99
+publish_date: !!str 2008-05-01
+description: Unearthing the Excellence in JavaScript
+```
+
+业界的年轻人正在迅速采用 YAML 作为他们首选的数据序列化和系统配置格式。他们这样做很机智。YAML 有像 CSON 一样简洁带来的所有好处,有 JSON 在数据类型解释方面的所有功能。YAML 像加拿大人容易相处一样容易阅读。
+
+YAML 有两个问题,对我而言,第一个是大问题。在撰写本文时,YAML 解析器尚未内置于多种语言,因此你需要使用第三方库或扩展来为你选择的语言解析 .yaml 文件。这不是什么大问题,可似乎大多数为 YAML 创建解析器的开发人员都选择随机将“附加功能”放入解析器中。有些允许[标记化][16],有些允许[链引用][17],有些甚至允许内联计算。这一切都很好(某种意义上),除了这些功能都不是规范的一部分,因此很难在其他语言的其他解析器中找到。这导致系统锁定,你最终遇到了与 CSON 相同的问题。如果你使用仅在一个解析器中找到的功能,则其他解析器将无法解释输入。大多数这些功能都是无意义的,不属于数据集,而是属于你的应用程序逻辑,因此最好简单地忽略它们和编写符合规范的 YAML。
+
+第二个问题是很少有解析器完全实现规范。所有的基本要素都在那里,但是很难找到一些更复杂和更新的东西,比如软包装,文档标记和首选语言的循环引用。我还没有看到对这些东西的刚需,所以希望它们不让你很失望。考虑到上述情况,我倾向于保持 [1.1 规范][18] 中呈现的更成熟的功能集,避免在 [1.2 规范][19] 中找到的新东西。然而,编程是一个不断发展的怪兽,所以当你读完这篇文章时,你或许可以使用 1.2 规范。
+
+### 最终哲学
+
+这是最后一段话。每个序列化语言都应该以其用例的标准评价。当涉及机器的可读性时,有些是蜜蜂的膝盖。对于人类可读性,有些是猫的喵喵声,有些只是镀金的粪便。以下是最终细分:如果你要编写供其他代码阅读的代码,请使用 YAML。如果你正在编写能写供其他代码读取的代码的代码,请使用 JSON。最后,如果你正在编写将代码转译为供其他代码读取的代码的代码,请重新考虑你的人生选择。
+
+--------------------------------------------------------------------------------
+
+via: https://www.zionandzion.com/json-vs-xml-vs-toml-vs-cson-vs-yaml/
+
+作者:[Tim Anderson][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/GraveAccent)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.zionandzion.com
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats
+[2]: https://en.wikipedia.org/wiki/Standard_Generalized_Markup_Language#History
+[3]: https://www.quirksmode.org/css/csshacks.html
+[4]: http://www.ie6death.com/
+[5]: https://en.wikipedia.org/wiki/Vacuum_tube
+[6]: https://twitter.com/BrendanEich/status/773403975865470976
+[7]: https://en.wikipedia.org/wiki/Parsing#Parser
+[8]: https://en.wikipedia.org/wiki/Tom_Preston-Werner
+[9]: https://en.wikipedia.org/wiki/INI_file
+[10]: https://github.com/bevry/cson#what-is-cson
+[11]: http://coffeescript.org/
+[12]: https://en.wikipedia.org/wiki/Source-to-source_compiler
+[13]: https://en.wikipedia.org/wiki/Comment_(computer_programming)
+[14]: http://clarkevans.com/
+[15]: http://exploringjs.com/es6/ch_maps-sets.html
+[16]: https://www.tutorialspoint.com/compiler_design/compiler_design_lexical_analysis.htm
+[17]: https://en.wikipedia.org/wiki/Fluent_interface
+[18]: http://yaml.org/spec/1.1/current.html
+[19]: http://www.yaml.org/spec/1.2/spec.html
\ No newline at end of file
diff --git a/translated/tech/20180518 What-s a hero without a villain- How to add one to your Python game.md b/translated/tech/20180518 What-s a hero without a villain- How to add one to your Python game.md
new file mode 100644
index 0000000000..a4a2138136
--- /dev/null
+++ b/translated/tech/20180518 What-s a hero without a villain- How to add one to your Python game.md
@@ -0,0 +1,275 @@
+没有恶棍,英雄又将如何?如何向你的 Python 游戏中添加一个敌人
+======
+
+
+在本系列的前几篇文章中(参见 [第一部分][1]、[第二部分][2]、[第三部分][3] 以及 [第四部分][4]),你已经学习了如何使用 Pygame 和 Python 在一个空白的视频游戏世界中生成一个可玩的角色。但没有恶棍,英雄又将如何?
+
+如果你没有敌人,那将会是一个非常无聊的游戏。所以在此篇文章中,你将为你的游戏添加一个敌人并构建一个用于创建关卡的框架。
+
+在对玩家妖精实现全部功能仍有许多事情可做之前,跳向敌人似乎就很奇怪。但你已经学到了很多东西,创造恶棍与与创造玩家妖精非常相似。所以放轻松,使用你已经掌握的知识,看看能挑起怎样一些麻烦。
+
+针对本次训练,你能够从 [Open Game Art][5] 下载一些预创建的素材。此处是我使用的一些素材:
+
+
++ 印加花砖(译注:游戏中使用的花砖贴图)
++ 一些侵略者
++ 妖精、角色、物体以及特效
+
+
+### 创造敌方妖精
+
+是的,不管你意识到与否,你其实已经知道如何去实现敌人。这个过程与创造一个玩家妖精非常相似:
+
+ 1. 创建一个类用于敌人生成
+ 2. 创建 `update` 方法使得敌人能够检测碰撞
+ 3. 创建 `move` 方法使得敌人能够四处游荡
+
+
+
+从类入手。从概念上看,它与你的 Player 类大体相同。你设置一张或者一组图片,然后设置妖精的初始位置。
+
+在继续下一步之前,确保你有一张你的敌人的图像,即使只是一张临时图像。将图像放在你的游戏项目的 `images` 目录(你放置你的玩家图像的相同目录)。
+
+如果所有的活物都拥有动画,那么游戏看起来会好得多。为敌方妖精设置动画与为玩家妖精设置动画具有相同的方式。但现在,为了保持简单,我们使用一个没有动画的妖精。
+
+在你代码 `objects` 节的顶部,使用以下代码创建一个叫做 `Enemy` 的类:
+```
+class Enemy(pygame.sprite.Sprite):
+
+ '''
+
+ 生成一个敌人
+
+ '''
+
+ def __init__(self,x,y,img):
+
+ pygame.sprite.Sprite.__init__(self)
+
+ self.image = pygame.image.load(os.path.join('images',img))
+
+ self.image.convert_alpha()
+
+ self.image.set_colorkey(ALPHA)
+
+ self.rect = self.image.get_rect()
+
+ self.rect.x = x
+
+ self.rect.y = y
+
+```
+
+如果你想让你的敌人动起来,使用让你的玩家拥有动画的 [相同方式][4]。
+
+### 生成一个敌人
+
+你能够通过告诉类,妖精应使用哪张图像,应出现在世界上的什么地方,来生成不只一个敌人。这意味着,你能够使用相同的敌人类,在游戏世界的任意地方生成任意数量的敌方妖精。你需要做的仅仅是调用这个类,并告诉它应使用哪张图像,以及你期望生成点的 X 和 Y 坐标。
+
+再次,这从原则上与生成一个玩家精灵相似。在你脚本的 `setup` 节添加如下代码:
+```
+enemy = Enemy(20,200,'yeti.png') # 生成敌人
+
+enemy_list = pygame.sprite.Group() # 创建敌人组
+
+enemy_list.add(enemy) # 将敌人加入敌人组
+
+```
+
+在示例代码中,X 坐标为 20,Y 坐标为 200。你可能需要根据你的敌方妖精的大小,来调整这些数字,但尽量生成在一个地方,使得你的玩家妖精能够到它。`Yeti.png` 是用于敌人的图像。
+
+接下来,将敌人组的所有敌人绘制在屏幕上。现在,你只有一个敌人,如果你想要更多你可以稍后添加。一但你将一个敌人加入敌人组,它就会在主循环中被绘制在屏幕上。中间这一行是你需要添加的新行:
+```
+ player_list.draw(world)
+
+ enemy_list.draw(world) # 刷新敌人
+
+ pygame.display.flip()
+
+```
+
+启动你的游戏,你的敌人会出现在游戏世界中你选择的 X 和 Y 坐标处。
+
+### 关卡一
+
+你的游戏仍处在襁褓期,但你可能想要为它添加另一个关卡。为你的程序做好未来规划非常重要,因为随着你学会更多的编程技巧,你的程序也会随之成长。即使你现在仍没有一个完整的关卡,你也应该按照假设会有很多关卡来编程。
+
+思考一下“关卡”是什么。你如何知道你是在游戏中的一个特定关卡中呢?
+
+你可以把关卡想成一系列项目的集合。就像你刚刚创建的这个平台中,一个关卡,包含了平台、敌人放置、赃物等的一个特定排列。你可以创建一个类,用来在你的玩家附近创建关卡。最终,当你创建了超过一个关卡,你就可以在你的玩家达到特定目标时,使用这个类生成下一个关卡。
+
+将你写的用于生成敌人及其群组的代码,移动到一个每次生成新关卡时都会被调用的新函数中。你需要做一些修改,使得每次你创建新关卡时,你都能够创建一些敌人。
+```
+class Level():
+
+ def bad(lvl,eloc):
+
+ if lvl == 1:
+
+ enemy = Enemy(eloc[0],eloc[1],'yeti.png') # 生成敌人
+
+ enemy_list = pygame.sprite.Group() # 生成敌人组
+
+ enemy_list.add(enemy) # 将敌人加入敌人组
+
+ if lvl == 2:
+
+ print("Level " + str(lvl) )
+
+
+
+ return enemy_list
+
+```
+
+`return` 语句确保了当你调用 `Level.bad` 方法时,你将会得到一个 `enemy_list` 变量包含了所有你定义的敌人。
+
+因为你现在将创造敌人作为每个关卡的一部分,你的 `setup` 部分也需要做些更改。不同于创造一个敌人,取而代之的是你必须去定义敌人在那里生成,以及敌人属于哪个关卡。
+```
+eloc = []
+
+eloc = [200,20]
+
+enemy_list = Level.bad( 1, eloc )
+
+```
+
+再次运行游戏来确认你的关卡生成正确。与往常一样,你应该会看到你的玩家,并且能看到你在本章节中添加的敌人。
+
+### 痛击敌人
+
+一个敌人如果对玩家没有效果,那么它不太算得上是一个敌人。当玩家与敌人发生碰撞时,他们通常会对玩家造成伤害。
+
+因为你可能想要去跟踪玩家的生命值,因此碰撞检测发生在 Player 类,而不是 Enemy 类中。当然如果你想,你也可以跟踪敌人的生命值。它们之间的逻辑与代码大体相似,现在,我们只需要跟踪玩家的生命值。
+
+为了跟踪玩家的生命值,你必须为它确定一个变量。代码示例中的第一行是上下文提示,那么将第二行代码添加到你的 Player 类中:
+```
+ self.frame = 0
+
+ self.health = 10
+
+```
+
+在你 Player 类的 `update` 方法中,添加如下代码块:
+```
+ hit_list = pygame.sprite.spritecollide(self, enemy_list, False)
+
+ for enemy in hit_list:
+
+ self.health -= 1
+
+ print(self.health)
+
+```
+
+这段代码使用 Pygame 的 `sprite.spritecollide` 方法,建立了一个碰撞检测器,称作 `enemy_hit`。每当它的父类妖精(生成检测器的玩家妖精)的碰撞区触碰到 `enemy_list` 中的任一妖精的碰撞区时,碰撞检测器都会发出一个信号。当这个信号被接收,`for` 循环就会被触发,同时扣除一点玩家生命值。
+
+一旦这段代码出现在你 Player 类的 `update` 方法,并且 `update` 方法在你的主循环中被调用,Pygame 会在每个时钟 tick 检测一次碰撞。
+
+### 移动敌人
+
+如果你愿意,静止不动的敌人也可以很有用,比如能够对你的玩家造成伤害的尖刺和陷阱。但如果敌人能够四处徘徊,那么游戏将更富有挑战。
+
+与玩家妖精不同,敌方妖精不是由玩家控制,因此它必须自动移动。
+
+最终,你的游戏世界将会滚动。那么,如何在游戏世界自身滚动的情况下,使游戏世界中的敌人前后移动呢?
+
+举个例子,你告诉你的敌方妖精向右移动 10 步,向左移动 10 步。但敌方妖精不会计数,因此你需要创建一个变量来跟踪你的敌人已经移动了多少步,并根据计数变量的值来向左或向右移动你的敌人。
+
+首先,在你的 Enemy 类中创建计数变量。添加以下代码示例中的最后一行代码:
+```
+ self.rect = self.image.get_rect()
+
+ self.rect.x = x
+
+ self.rect.y = y
+
+ self.counter = 0 # 计数变量
+
+```
+
+然后,在你的 Enemy 类中创建一个 `move` 方法。使用 if-else 循环来创建一个所谓的死循环:
+
+ * 如果计数在 0 到 100 之间,向右移动;
+ * 如果计数在 100 到 200 之间,向左移动;
+ * 如果计数大于 200,则将计数重置为 0。
+
+
+
+死循环没有终点,因为循环判断条件永远为真,所以它将永远循环下去。在此情况下,计数器总是介于 0 到 100 或 100 到 200 之间,因此敌人会永远地从左向右再从右向左移动。
+
+你用于敌人在每个方向上移动距离的具体值,取决于你的屏幕尺寸,更确切地说,取决于你的敌人移动的平台大小。从较小的值开始,依据习惯逐步提高数值。首先进行如下尝试:
+```
+ def move(self):
+
+ '''
+
+ 敌人移动
+
+ '''
+
+ distance = 80
+
+ speed = 8
+
+
+
+ if self.counter >= 0 and self.counter <= distance:
+
+ self.rect.x += speed
+
+ elif self.counter >= distance and self.counter <= distance*2:
+
+ self.rect.x -= speed
+
+ else:
+
+ self.counter = 0
+
+
+
+ self.counter += 1
+
+```
+
+你可以根据需要调整距离和速度。
+
+当你现在启动游戏,这段代码有效果吗?
+
+当然不,你应该也知道原因。你必须在主循环中调用 `move` 方法。如下示例代码中的第一行是上下文提示,那么添加最后两行代码:
+```
+ enemy_list.draw(world) #refresh enemy
+
+ for e in enemy_list:
+
+ e.move()
+
+```
+
+启动你的游戏看看当你打击敌人时发生了什么。你可能需要调整妖精的生成地点,使得你的玩家和敌人能够碰撞。当他们发生碰撞时,查看 [IDLE][6] 或 [Ninja-IDE][7] 的控制台,你可以看到生命值正在被扣除。
+
+
+
+你应该已经注意到,在你的玩家和敌人接触时,生命值在时刻被扣除。这是一个问题,但你将在对 Python 进行更多练习以后解决它。
+
+现在,尝试添加更多敌人。记得将每个敌人加入 `enemy_list`。作为一个练习,看看你能否想到如何改变不同敌方妖精的移动距离。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/5/pygame-enemy
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[cycoe](https://github.com/cycoe)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[1]:https://opensource.com/article/17/10/python-101
+[2]:https://opensource.com/article/17/12/game-framework-python
+[3]:https://opensource.com/article/17/12/game-python-add-a-player
+[4]:https://opensource.com/article/17/12/game-python-moving-player
+[5]:https://opengameart.org
+[6]:https://docs.python.org/3/library/idle.html
+[7]:http://ninja-ide.org/
diff --git a/translated/tech/20180719 Building tiny container images.md b/translated/tech/20180719 Building tiny container images.md
new file mode 100644
index 0000000000..e392215ab8
--- /dev/null
+++ b/translated/tech/20180719 Building tiny container images.md
@@ -0,0 +1,356 @@
+如何打造更小巧的容器镜像
+======
+
+
+
+[Docker][1] 近几年的爆炸性发展让大家逐渐了解到容器和容器镜像的概念。尽管 Linux 容器技术在很早之前就已经出现,这项技术近来的蓬勃发展却还是要归功于 Docker 对用户友好的命令行界面以及使用 Dockerfile 轻松构建镜像的方式。纵然 Docker 大大降低了入门容器技术的难度,但构建一个兼具功能强大、体积小巧的容器镜像的过程中,有很多技巧需要了解。
+
+### 清理不必要的文件
+
+这一步和在普通服务器上清理文件没有太大的区别,而且要清理得更加仔细。一个小体积的容器镜像在传输方面有很大的优势,同时,在磁盘上存储大量不必要的数据也是对资源的一种浪费。这个原则对于所有服务器来说都是合适的。
+
+清理容器镜像中的缓存文件可以有效缩小镜像体积。下面的对比是分别使用 `dnf` 安装 [Nginx][2] 构建的镜像和使用 `yum` 安装 Nginx 后清理缓存文件构建的镜像:
+```
+# Dockerfile with cache
+
+FROM fedora:28
+
+LABEL maintainer Chris Collins
+
+
+
+RUN dnf install -y nginx
+
+
+
+-----
+
+
+
+# Dockerfile w/o cache
+
+FROM fedora:28
+
+LABEL maintainer Chris Collins
+
+
+
+RUN dnf install -y nginx \
+
+ && dnf clean all \
+
+ && rm -rf /var/cache/yum
+
+
+
+-----
+
+
+
+[chris@krang] $ docker build -t cache -f Dockerfile .
+
+[chris@krang] $ docker images --format "{{.Repository}}: {{.Size}}"
+
+| head -n 1
+
+cache: 464 MB
+
+
+
+[chris@krang] $ docker build -t no-cache -f Dockerfile-wo-cache .
+
+[chris@krang] $ docker images --format "{{.Repository}}: {{.Size}}" | head -n 1
+
+no-cache: 271 MB
+
+```
+
+从上面的结果来看,清理缓存文件的效果相当显著。和清除了 `yum` 缓存文件的容器镜像相比,不清除 `dnf` 缓存文件构建出来的容器镜像体积接近前者的两倍。除此以外,包管理器缓存文件、Ruby gem 临时文件、`nodejs` 缓存文件,甚至是下载的源码 tarball 最好都全部清理掉。
+
+### 层:一个潜在的隐患
+
+很不幸(当你往下读,你会发现这是不幸中的万幸),根据容器层的概念,不能简单地向 Dockerfile 中写一句 `RUN rm -rf /var/cache/yum` 就完事儿了。因为 Dockerfile 的每一条命令都以一个层的形式存储,并一层层地叠加。所以,如果你是这样写的:
+```
+RUN dnf install -y nginx
+
+RUN dnf clean all
+
+RUN rm -rf /var/cache/yum
+
+```
+
+你的容器镜像就会包含三层,而 `RUN dnf install -y nginx` 这一层仍然会保留着那些缓存文件,然后在另外两层中被移除,但缓存仍然是存在的,只是你在最终的容器镜像中见不到它们而已。
+
+在上一节的示例中,你会看到正确的做法是将几条命令连接起来,在产生缓存文件的同一层里把缓存文件清理掉:
+```
+RUN dnf install -y nginx \
+
+ && dnf clean all \
+
+ && rm -rf /var/cache/yum
+
+```
+
+这样就把几条命令连成了一条命令,在最终的镜像中只占用一个层。这样只会稍微多耗费一点点构建容器镜像的时间,但被清理掉的缓存文件就不会留存在最终的镜像中了。这是一个很好的折中方法,只需要把一些相关的命令(例如 `yum install` 和 `yum clean all`、下载文件、解压文件、移除 tarball 等等)连接成一个命令,就可以在最终的容器镜像中节省出大量体积,Docker 层也能更好地发挥作用。
+
+层还有一个更隐蔽的特性。每一层都记录了文件的更改,这里的更改并不仅仅指文件是否存在、文件内容是否被改动,而是包括文件属性在内的所有更改。因此即使是对文件使用了 `chmod` 操作也会被记录在层中。
+
+下面是一次 `docker images` 命令的输出内容。其中容器镜像 `layer_test_1` 是仅在 CentOS 基础镜像中增加了一个 1GB 大小的文件后构建出来的镜像,而容器镜像 `layer_test_2` 是使用了 `FROM layer_test_1` 语句,仅仅再执行一条 `chmod u+x` 命令后构建出来的镜像。
+```
+layer_test_2 latest e11b5e58e2fc 7 seconds ago 2.35 GB
+
+layer_test_1 latest 6eca792a4ebe 2 minutes ago 1.27 GB
+
+```
+
+如你所见,`layer_test_2` 镜像比 `layer_test_1` 镜像大了 1GB 以上。尽管 `layer_test_2` 基于 `layer_test_1` 且只比 `layer_test_1` 多出一层,但恰好就在这多出来的一层中包含了一个额外的 1GB 的文件。在构建容器镜像的过程中,如果在单独一层中进行移动、更改、删除文件,都会出现类似的结果。
+
+### 专用镜像和公用镜像
+
+就有这么一个亲身经历:我们的项目重度依赖于 [Ruby on Rails][3],于是我们开始使用容器。一开始我们就建立了一个 Ruby 的基础镜像供所有的团队使用,为了简单起见(实际上这样并不好),我们使用 [rbenv][4] 将 Ruby 最新的 4 个版本都安装到了这个镜像当中,目的是让开发人员只用这个镜像就可以将使用不同版本 Ruby 的应用程序迁移到容器中。我们当时还认为这是一个有点大但兼容性相当好的镜像,因为这个镜像可以同时满足各个团队的使用。
+
+实际上这是费力不讨好的。如果将不同版本应用程序安装在独立的镜像中,可以很轻松地实现镜像的自动化维护。同时,还可以在应用程序接近生命周期结束前提前做好预防措施,以免产生不可控的后果。庞大的公用镜像也会对资源造成浪费,当我们后来将这个庞大的镜像按照 Ruby 版本进行拆分之后,每个基于这些基础镜像构建出来的应用镜像体积都会比原来缩小很多,节省了大量的服务器存储资源。
+
+这个例子也不是说不能追求镜像的兼容性,但仅对于这个例子来说,分拆成多个小的专用镜像无疑能够节省存储资源和维护成本,同时不同的团队也能够根据特定的需求来做定制化的配置。
+
+### 从零开始:将你需要的内容添加到空白镜像中
+
+有一些和 Dockerfile 一样易用的工具可以轻松创建非常小的兼容 Docker 的容器镜像,这些镜像甚至不需要包含一个完整的操作系统。
+
+我曾经写过一篇[关于 Buildah 的文章][5],我想在这里再一次安利这个工具。它可以使用宿主机上的工具来操作一个空白镜像并安装打包好的应用程序,而且这些工具不会被包含到镜像当中。
+
+Buildah 取代了 `docker build` 命令。可以使用 Buildah 将容器的文件系统挂载到宿主机上并进行交互。
+
+下面来使用 Buildah 实现上文中 Nginx 的例子:
+```
+#!/usr/bin/env bash
+
+set -o errexit
+
+
+
+# Create a container
+
+container=$(buildah from scratch)
+
+
+
+# Mount the container filesystem
+
+mountpoint=$(buildah mount $container)
+
+
+
+# Install a basic filesystem and minimal set of packages, and nginx
+
+dnf install --installroot $mountpoint --releasever 28 glibc-minimal-langpack nginx --setopt install_weak_deps=false -y
+
+
+
+# Save the container to an image
+
+buildah commit --format docker $container nginx
+
+
+
+# Cleanup
+
+buildah unmount $container
+
+
+
+# Push the image to the Docker daemon’s storage
+
+buildah push nginx:latest docker-daemon:nginx:latest
+
+```
+
+你会发现这里使用的已经不是 Dockerfile 了,而是普通的 Bash 脚本,而且是从空白镜像开始构建的。上面这段 Bash 脚本将容器的根文件系统挂载到了宿主机上,然后使用宿主机的命令来安装及应用程序,这样的话就不需要把软件包管理器放置到容器镜像中了。
+
+这样所有无关的内容(例如 `dnf`)就不再会包含在镜像中了。在这个例子当中,构建出来的镜像大小只有 304 MB,比使用 Dockerfile 构建的镜像减少了 100 MB 以上。
+```
+[chris@krang] $ docker images |grep nginx
+
+docker.io/nginx buildah 2505d3597457 4 minutes ago 304 MB
+
+```
+
+_注:这个镜像是使用上面的构建脚本构建的,镜像名称中的 `docker.io` 只是在推送到镜像仓库时人为加上的。_
+
+对于一个 300MB 级别的容器镜像来说,能缩小 100MB 已经是很显著的节省了。使用软件包管理器来安装 Nginx 会带来大量的依赖项,如果能够使用宿主机直接从源代码对应用程序进行编译然后构建到容器镜像中,节省出来的空间还可以更多,因为这个时候可以精细的选用必要的依赖项,非必要的依赖项一概不构建到镜像中。
+
+[Tom Sweeney][6] 有一篇文章《[用 Buildah 构建更小的容器][7]》,如果你想在这方面做深入的优化,不妨参考一下。
+
+通过 Buildah 可以构建一个不包含完整操作系统和代码编译工具的容器镜像,大幅缩减了容器镜像的体积。因此可以采用这种方式,创建一个只包含应用程序本身的镜像。
+
+### 使用静态链接的二进制文件来构建镜像
+
+按照这个思路,我们甚至可以舍弃容器内部的管理工具。例如,如果我们不需要在容器中进行调试,是不是可以不要 Bash 了?是不是可以不要 [GNU 套件][8]了?是不是可以不要 Linux 基础文件系统了?如果你使用的编译型语言支持[静态链接库][9],将应用程序所需要的所有库和函数都编译成二进制文件,那么上面那些“累赘”可以统统省去。
+
+这种做法在 [Golang][10] 社区中已经十分常见,下面我们使用由 Go 语言编写的应用程序进行展示:
+
+以下这个 Dockerfile 基于 `golang:1.8` 构建一个 Hello World 应用程序镜像:
+```
+FROM golang:1.8
+
+
+
+ENV GOOS=linux
+
+ENV appdir=/go/src/gohelloworld
+
+
+
+COPY ./ /go/src/goHelloWorld
+
+WORKDIR /go/src/goHelloWorld
+
+
+
+RUN go get
+
+RUN go build -o /goHelloWorld -a
+
+
+
+CMD ["/goHelloWorld"]
+
+```
+
+构建出来的镜像中包含了二进制文件、源代码以及基础镜像层,一共 716MB。但对于应用程序运行唯一必要的只有编译后的二进制文件,其余内容在镜像中都是多余的。
+
+如果在编译的时候通过指定参数 `CGO_ENABLED=0` 来禁用 `cgo`,就可以在编译二进制文件的时候忽略某些 C 语言库:
+```
+GOOS=linux CGO_ENABLED=0 go build -a goHelloWorld.go
+```
+
+编译出来的二进制文件可以基于空白镜像来构建应用程序镜像:
+```
+FROM scratch
+
+COPY goHelloWorld /
+
+CMD ["/goHelloWorld"]
+
+```
+
+来看一下两次构建的镜像对比:
+```
+[ chris@krang ] $ docker images
+
+REPOSITORY TAG IMAGE ID CREATED SIZE
+
+goHello scratch a5881650d6e9 13 seconds ago 1.55 MB
+
+goHello builder 980290a100db 14 seconds ago 716 MB
+
+```
+
+从镜像体积来说简直是天差地别了。基于 `golang:1.8` 镜像构建出来的应用程序镜像(带有 builder 标签)体积是基于空白镜像构建出来的应用程序镜像的 460 倍!后者的整个镜像大小只有 1.55MB,也就是说,有 713MB 的数据都是非必要的。
+
+正如上面提到的,这种缩减镜像体积的方式在 Golang 社区非常流行,因此不乏这方面的文章。[Kelsey Hightower][11] 有一篇[文章][12]专门介绍了如何处理这些库的依赖关系。
+
+### 压缩镜像层
+
+除了前面几节中讲到的将多个命令连接成一个命令的技巧,还可以对镜像层进行压缩。镜像层压缩的实质是删除掉镜像构建过程中的所有中间层,然后使用镜像的当前状态导出单个镜像层。这样可以进一步将镜像缩小到更小的体积。
+
+在 Docker 1.13 之前,压缩镜像层的的过程可能比较麻烦,需要用到 `docker-squash` 之类的工具来导出容器的内容并重新导入成一个单层的镜像。但 Docker 在 Docker 1.13 中引入了 `--squash` 参数,可以在构建过程中实现同样的功能:
+```
+FROM fedora:28
+
+LABEL maintainer Chris Collins
+
+
+
+RUN dnf install -y nginx
+
+RUN dnf clean all
+
+RUN rm -rf /var/cache/yum
+
+
+
+[chris@krang] $ docker build -t squash -f Dockerfile-squash --squash .
+
+[chris@krang] $ docker images --format "{{.Repository}}: {{.Size}}" | head -n 1
+
+squash: 271 MB
+
+```
+
+通过这种方式使用 Dockerfile 构建出来的镜像有 271MB 大小,和上面连接多条命令的方案构建出来的镜像体积一样,因此这个方案也是有效的,但也有一个潜在的问题,而且是另一种问题。
+
+### Going too far: Too squashed, too small, too specialized
+
+容器镜像之间可以共享镜像层。一个镜像层本身会带有一定的体积,但只要存在于镜像仓库中,就可以被其它容器镜像复用。一个容器镜像的大小是基础镜像层加上每层的差异内容,因此,如果有数千个基于同一个基础镜像的容器镜像,其体积之和也有可能只比一个基础镜像大不了多少。
+
+因此,如果过度使用压缩图像层的方案,将不同镜像压缩成单个镜像层,各个容器镜像之间就没有可以共享的镜像层了,每个容器镜像都会占有单独的体积。如果你只需要维护少数几个容器镜像,这个问题可以忽略不计;但如果你要维护的容器镜像很多,从长远来看,就会耗费大量的存储空间。
+
+回顾上面 Nginx 的例子。在这个镜像中,有 Fedora 操作系统和 Nginx 应用程序,没有安装缓存,并且已经被压缩。但我们一般不会使用一个原始的 Nginx,而是会修改配置文件,以及引入其它代码或应用程序来配合 Nginx 使用,而要做到这些,Dockerfile 就变得更加复杂了。
+
+如果使用普通的镜像构建方式,构建出来的容器镜像就会带有 Fedora 操作系统的镜像层、一个安装了 Nginx 的镜像层、为 Nginx 作自定义配置的其它多个镜像层,而如果有其它容器镜像需要用到 Fedora 或者 Nginx,就可以复用这个容器镜像的前两层。
+
+```
+[ App 1 Layer ( 5 MB) ] [ App 2 Layer (6 MB) ]
+
+[ Nginx Layer ( 21 MB) ] ------------------^
+
+[ Fedora Layer (249 MB) ]
+
+```
+
+如果使用压缩镜像层的构建方式,Fedora 操作系统会和 Nginx 以及其它配置内容都被压缩到同一层里面,如果有其它容器镜像需要使用到 Fedora,就必须重新引入 Fedora 基础镜像,这样每个容器镜像都会额外增加 249MB 的大小。
+```
+[ Fedora + Nginx + App 1 (275 MB)] [ Fedora + Nginx + App 2 (276 MB) ]
+
+```
+
+当你构建了大量在功能上趋于分化的的小型容器镜像是,这个问题就会暴露出来了。
+
+就像生活中的每一件事一样,关键是要做到适度。根据镜像层的实现原理,如果一个容器镜像变得越小、越专用化,就越难和其它容器镜像共享基础的镜像层,这样反而带来不好的效果。
+
+对于仅在基础镜像上做微小变动构建出来的多个容器镜像,可以考虑共享基础镜像层。如上所述,一个镜像层本身会带有一定的体积,但只要存在于镜像仓库中,就可以被其它容器镜像复用。
+```
+[ specific app ] [ specific app 2 ]
+
+[ customizations ]--------------^
+
+[ base layer ]
+
+```
+
+一个容器镜像变得越小、越专用化,就越难和其它容器镜像共享基础的镜像层,最终会不必要地占用越来越多的存储空间。
+```
+ [ specific app 1 ] [ specific app 2 ] [ specific app 3 ]
+
+```
+
+### 总结
+
+减少处理容器镜像时所需的存储空间和带宽的方法有很多,其中最直接的方法就是减小容器镜像本身的大小。在使用容器的过程中,要经常留意容器镜像是否体积过大,根据不同的情况采用上述提到的清理缓存、压缩层、在空白镜像中放入二进制文件等不同的方法,将容器镜像的体积缩减到一个真实的规格。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/7/building-container-images
+
+作者:[Chris Collins][a]
+选题:[lujun9972](https://github.com/lujun9972)
+译者:[HankChow](https://github.com/HankChow)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://opensource.com/users/clcollins
+[1]:https://www.docker.com/
+[2]:https://www.nginx.com/
+[3]:https://rubyonrails.org/
+[4]:https://github.com/rbenv/rbenv
+[5]:https://opensource.com/article/18/6/getting-started-buildah
+[6]:https://twitter.com/TSweeneyRedHat
+[7]:https://opensource.com/article/18/5/containers-buildah
+[8]:https://www.gnu.org/software/coreutils/coreutils.html
+[9]:https://en.wikipedia.org/wiki/Static_library
+[10]:https://golang.org/
+[11]:https://twitter.com/kelseyhightower
+[12]:https://medium.com/@kelseyhightower/optimizing-docker-images-for-static-binaries-b5696e26eb07
+
diff --git a/translated/tech/20190303 Manage Your Mirrors with ArchLinux Mirrorlist Manager.md b/translated/tech/20190303 Manage Your Mirrors with ArchLinux Mirrorlist Manager.md
new file mode 100644
index 0000000000..d65b6da03f
--- /dev/null
+++ b/translated/tech/20190303 Manage Your Mirrors with ArchLinux Mirrorlist Manager.md
@@ -0,0 +1,96 @@
+[#]:collector:(lujun9972)
+[#]:translator:(lujun9972)
+[#]:reviewer:()
+[#]:publisher:()
+[#]:url:()
+[#]:subject:(ManageYourMirrorswithArchLinuxMirrorlistManager)
+[#]:via:(https://itsfoss。com/archlinux-mirrorlist-manager)
+[#]:author:(JohnPaulhttps://itsfoss.com/author/john/)
+
+使用 Arch Linux Mirrorlist Manager 管理你的镜像
+======
+
+**Arch Linux Mirrorlist Manager 时一个简单的图形化程序,它让你可以方便地管理 ArchLinux 中的镜像。**
+
+对于 Linux 用户来说,保持好的镜像列表非常重要。今天我们来介绍一个用来管理 Arch 镜像列表的应用程序。
+
+![Arch Linux Mirrorlist Manager][1]
+Arch Linux Mirrorlist Manager
+
+### 什么是镜像?
+
+至新手,Linux 操作系统有赖于分布全球的的一系列服务器。这些服务器包含了特定发行版的所有可用的软件包的相同副本。这就是为什么它们被称为“镜像”。
+
+这些服务器的最终目标时让每个国家都有多个镜像。这样就能让当地的用户可以快速升级系统。然而,这并不绝对。有时别国的镜像反而更快。
+
+### Arch Linux Mirrorlist Manager 让在 ArchLinux 中管理镜像更简单
+
+![Arch Linux Mirrorlist Manager][2]
+主界面
+
+在 Arch 中[管理并对有效镜像进行排序 ][3] 不是个简单的事情。它需要用到很长的命令。还好,有人想出了一个解决方案。
+
+去年,[RizwanHasan][4] 用 Python 编写了一个名为 [Arch Linux Mirrorlist Manager][5] 的 Qt 应用程序。你可能对 Rizwan 这个名字感到眼熟,因为这不是第一次我们在本站介绍他做的玩意了。一年多前,我介绍过一个名为 [MagpieOS][6] 的基于 Arch 的新 Linux 发行版就是 Rizwan 创造的。我想 Rizwan 创造 MagpieOS 的经历激励了他创建了这个程序。
+
+Arch Linux Mirrorlist Manager 的功能并不多。它让你根据回应速度对镜像进行排序,并可以根据数量和国家进行过滤。
+
+也就是说,若你在德国,你可以限制只保留在位于德国的最快的 3 个镜像。
+
+### 安装 Arch Linux Mirrorlist Manager
+
+```
+它仅适用于 Arch Linux 用户
+
+注意! ArchLinux Mirrorlist Manager 只能应用于Arch linux发行版. 不要在其他基于Arch的发行版中使用它,除非你能确定该发行版使用的是Arch镜像. 否则, 你将会遇到我在Manjaro中遇到的问题(在下面章节解释).
+```
+
+```
+Manjaro的镜像管理器替代者
+
+当使用类Arch的系统时, 我选择了Manjaro. 在开始本文之前, 我在Manjaro及其上安装了 ArchLinux Mirrorlist Manager. 它很快就对有效镜像进行了排序并保存到我的镜像列表中.
+
+然后我尝试进行系统更新却立即遇到了问题. 当 ArchLinux Mirrorlist Manager 对我系统使用的镜像进行排序时, 它使用普通的Arch镜像替换了我的 Manjaro 镜像. (Manjaro 基于Arch, 但却有着自己的镜像,这是因为开发团队会在推送软件包之前对所有这些软件包进行测试以保证不会出现系统崩溃的BUG.) 还好, Manjaro 论坛帮我修复了这个错误.
+
+若你是 Manjaro 用户, 请不要重蹈我的覆辙. ArchLinux Mirrorlist Manager 仅适用于Arch以及使用Arch镜像的衍生版本.
+
+幸运的是, manjaro有一个简单易用的终端程序来管理镜像列表. 那就是 [Pacman-mirrors][7]. 跟 ArchLinux Mirrorlist Manager 一样, 你可以根据回应速度进行排序. 只需要运行 `sudo pacman-mirrors --fasttrack` 即可. 若你像将结果局限在最快的5个镜像, 可以运行 `sudo pacman-mirrors --fasttrack 5`. 要像将结果局限在某个或某几个国家, 运行 `sudo pacman-mirrors --country Germany,Spain,Austria`. 你可以通过运行 `sudo pacman-mirrors --geoip` 来将结果局限在自己国家. 更多关于Pacman-mirrors的信息请参见 [Manjaro wiki][7].
+
+运行Pacman-mirrors后, 你还需要运行 `sudo pacman -Syyu` 来同步软件包数据库并升级系统.
+
+注意: Pacman-mirrors 仅仅适用于 **Manjaro**.
+```
+
+Arch Linux Mirrorlist Manager 包含在 [ArchUserRepository][8] 中。高级 Arch 用户可以直接从 [theGitHubpage][9] 下载 PKGBUILD。
+
+### 对 Arch Linux Mirrorlist Manager 的最后思考
+
+虽然 [Arch Linux Mirrorlist Manager][5] 对我不太有用,我很高兴有它的存在。这说明 Linux 用户正在努力让 Linux 更 n 加易于使用。正如我之前说过的,在 Arch 中管理镜像并不容易。Rizwan 的小工具可以让 Arch 对新手更加友好。
+
+你有用过 Arch Linux Mirrorlist Manager 吗?你是怎么管理 Arch 镜像的?请在下面的评论告诉我。
+
+如果你觉的本文有趣的话,请花点时间将它分享到社交媒体,HackerNews 或 [Reddit][10] 中去。
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/archlinux-mirrorlist-manager
+
+作者:[John Paul][a]
+选题:[lujun9972][b]
+译者:[lujun9972](https://github.com/lujun9972)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/john/
+[b]: https://github.com/lujun9972
+[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/mirrorlist-manager2.png?ssl=1
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/mirrorlist-manager4.jpg?ssl=1
+[3]: https://wiki.archlinux.org/index.php/Mirrors
+[4]: https://github.com/Rizwan-Hasan
+[5]: https://github.com/Rizwan-Hasan/ArchLinux-Mirrorlist-Manager
+[6]: https://itsfoss.com/magpieos/
+[7]: https://wiki.manjaro.org/index.php?title=Pacman-mirrors
+[8]: https://aur.archlinux.org/packages/mirrorlist-manager
+[9]: https://github.com/Rizwan-Hasan/MagpieOS-Packages/tree/master/ArchLinux-Mirrorlist-Manager
+[10]: http://reddit.com/r/linuxusersgroup
diff --git a/translated/tech/20190306 3 popular programming languages you can learn with Raspberry Pi.md b/translated/tech/20190306 3 popular programming languages you can learn with Raspberry Pi.md
new file mode 100644
index 0000000000..d2094fdf67
--- /dev/null
+++ b/translated/tech/20190306 3 popular programming languages you can learn with Raspberry Pi.md
@@ -0,0 +1,65 @@
+[#]: collector: (lujun9972)
+[#]: translator: (qhwdw)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (3 popular programming languages you can learn with Raspberry Pi)
+[#]: via: (https://opensource.com/article/19/3/programming-languages-raspberry-pi)
+[#]: author: (Anderson Silva https://opensource.com/users/ansilva)
+
+可以使用树莓派学习的 3 种流行编程语言
+======
+通过树莓派学习编程,让你在就业市场上更值钱。
+
+
+在本系列的上一篇文章中,我分享了 [教孩子们使用树莓派编程][1] 的一些方式。理论上,这些资源并不局限于只适用于孩子们,成人也是可以使用的。但是学习就业市场上急需的编程语言,可以让你得到更好的机会。
+
+这里是你可以使用树莓派学习的三种编程语言。
+
+### Python
+
+[Python][2] 已经成为开源世界里 [最流行的编程语言][3]。它的解释器已经打包进每个流行的 Linux 发行版中。如果你在树莓派中安装的是 Raspbian,你就会看到一个名为 [Thonny][4] 的应用,它是为新手准备的 Python 集成开发环境。简单来说,一个集成开发环境就是能够提供让你的代码运行起来所需要的任何东西的一个应用程序,一般来说,包括调试器、文档、自动编译,和仿真程序。[这是一个在树莓派上使用 Thonny 和 Python 入门的非常好的小教程][5]。
+
+
+
+### Java
+
+虽然 [Java][6] 已经不像以前那样引人注目了,但它仍然在世界各地的大学和企业中占据着重要的地位。因此,即便是一些人对我建议新手学习 Java 持反对意见,但我仍然强烈推荐大家去学习 Java;之所以这么做,原因之一是,它仍然很流行,原因之二是,它有大量的便于你学习的图书、课程、和其它的可用信息。在树莓派上学习它,你可以从使用 Java 集成开发环境 [BlueJ][7] 开始。
+
+
+
+### JavaScript
+
+“我的黄金时代…" [JavaScript][8] 的本质是一个允许用户去组织和自动化浏览器中的用户事件以及修改 HTML 元素的客户端语言。目前,JavaScript 已经不仅限于浏览器中,它在其它类型的客户端(移动应用)中也是可以使用的,甚至也用在服务器端编程。[Node.js][9] 是一个流行的运行时环境,它允许开发者在客户端-浏览器范式之外写程序。想学习在树莓派上运行 Node.js 的更多知识,请查看 [W3Schools 教程][10]。
+
+### 其它编程语言
+
+如果这里没有列出你想学习的编程语言,别失望。你可以使用你的树莓派去编译或解释任何你选择的语言,包括 C、C++、PHP、和 Ruby,这种可能性还是很大的。
+
+微软的 [Visual Studio Code][11] 也可以运行在 [树莓派][12] 上。它是来自微软的开源代码编辑器,它支持多种标记和编程语言。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/programming-languages-raspberry-pi
+
+作者:[Anderson Silva][a]
+选题:[lujun9972][b]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ansilva
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/article/19/2/teach-kids-program-raspberry-pi
+[2]: https://opensource.com/resources/python
+[3]: https://www.economist.com/graphic-detail/2018/07/26/python-is-becoming-the-worlds-most-popular-coding-language
+[4]: https://thonny.org/
+[5]: https://raspberrypihq.com/getting-started-with-python-programming-and-the-raspberry-pi/
+[6]: https://opensource.com/resources/java
+[7]: https://www.bluej.org/raspberrypi/
+[8]: https://developer.mozilla.org/en-US/docs/Web/JavaScript
+[9]: https://nodejs.org/en/
+[10]: https://www.w3schools.com/nodejs/nodejs_raspberrypi.asp
+[11]: https://code.visualstudio.com/
+[12]: https://pimylifeup.com/raspberry-pi-visual-studio-code/
diff --git a/translated/tech/20190307 How to keep your Raspberry Pi updated.md b/translated/tech/20190307 How to keep your Raspberry Pi updated.md
new file mode 100644
index 0000000000..b43f550e4a
--- /dev/null
+++ b/translated/tech/20190307 How to keep your Raspberry Pi updated.md
@@ -0,0 +1,45 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to keep your Raspberry Pi updated)
+[#]: via: (https://opensource.com/article/19/3/how-raspberry-pi-update)
+[#]: author: (Anderson Silva https://opensource.com/users/ansilva)
+
+如何更新树莓派
+======
+在我们的树莓派入门指南的第七篇学习如何给树莓派打补丁。
+
+
+像平板电脑、手机和笔记本电脑一样,你需要更新树莓派。最新的增强功能不仅可以使你的派运行顺畅,还可以让它更安全,特别是在如果你连接到网络的情况下。我们的树莓派入门指南中的第七篇会分享两条关于让派良好运行的建议。
+
+### 更新 Raspbian
+
+更新 Raspbian 有[两步][1]:
+
+ 1. 在终端中输入:**sudo apt-get update**。
+该命令的 **sudo** 让你以 admin(也就是 root)运行 **apt-get update**。请注意,**apt-get update** 不会在系统上安装任何新东西,而是将更新需要更新的包和依赖项列表。
+
+ 2. 接着输入:**sudo apt-get dist-upgrade**。
+摘自文档:”一般来说,定期执行此操作将使你的安装保持最新,因为它将等同于 [raspberrypi.org/downloads][2] 中发布的最新镜像。“
+
+
+### 小心 rpi-update
+
+Raspbian 带有另一个名为 [rpi-update][3] 的更新工具。此程序可用于将派升级到最新固件,该固件可能会或者不会有损坏/问题。你可能会发现如何使用的信息,但是建议你永远不要使用这个程序,除非你有充分的理由这样做。
+
+一句话:保持系统更新!
+
+--------------------------------------------------------------------------------
+via: https://opensource.com/article/19/3/how-raspberry-pi-update
+作者:[Anderson Silva][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+[a]: https://opensource.com/users/ansilva
+[b]: https://github.com/lujun9972
+[1]: https://www.raspberrypi.org/documentation/raspbian/updating.md
+[2]: https://www.raspberrypi.org/downloads/
+[3]: https://github.com/Hexxeh/rpi-update
diff --git a/translated/tech/20190308 How to use your Raspberry Pi for entertainment.md b/translated/tech/20190308 How to use your Raspberry Pi for entertainment.md
new file mode 100644
index 0000000000..2d7812154e
--- /dev/null
+++ b/translated/tech/20190308 How to use your Raspberry Pi for entertainment.md
@@ -0,0 +1,57 @@
+[#]: collector: (lujun9972)
+[#]: translator: (qhwdw)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to use your Raspberry Pi for entertainment)
+[#]: via: (https://opensource.com/article/19/3/raspberry-pi-entertainment)
+[#]: author: (Anderson Silva https://opensource.com/users/ansilva)
+
+如何用树莓派来娱乐
+======
+在我们的树莓派使用入门的第八篇文章中,我们将学习如何使用树莓派观看 Netflix 上的影片和用它来听音乐。
+
+
+到目前为止,本系列文章已经学习了很多话题 — 如何 [挑选][1]、[购买][2]、[设置][3]、和 [更新][4] 你的树莓派,以及 [儿童][5] 和 [成人][6] 如何使用它来做的不同的事情(包括学习 [Linux][7])。今天我们换一个话题,将学习一些娱乐方面的内容!我们将学习如何使用树莓派来做一些娱乐方面的事情,明天我们继续这个话题,将用它来玩游戏。
+
+### 观看电视和电影
+
+你可以使用你的树莓派和 [开源媒体中心][8] (OSMC) 去 [观看 Netflix][9]!OSMC 是一个基于 [Kodi][10] 项目的系统,你可以使用它来播放来自本地网络、附加存储、以及互联网上的多媒体。它因为良好的功能特性而在媒体播放应用界中拥有非常好的口碑。
+
+NOOBS(我们在本系列的 [第三篇文章][11] 中介绍过它)可以让你在你的树莓派中很容易地 [安装 OSMC][12]。在 NOOBS 中也提供了另外一个基于 Kodi 项目的媒体播放系统,它的名字叫 [LibreELEC][13]。
+
+### 听音乐
+
+
+
+你还可以让你的树莓派借助 [Pi Music Box][14] 项目通过网络来播放来自附加存储或像 Spotify 服务上的流媒体音乐。以前我 [写过关于这个主题的文章][15],但是你可以在 [Pi Music Box 网站][16] 上找到最新的指导,包括如何使用和 DIY 项目。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/raspberry-pi-entertainment
+
+作者:[Anderson Silva][a]
+选题:[lujun9972][b]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ansilva
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/article/19/3/which-raspberry-pi-choose
+[2]: https://opensource.com/article/19/2/how-buy-raspberry-pi
+[3]: https://opensource.com/article/19/2/how-boot-new-raspberry-pi
+[4]: https://opensource.com/article/19/2/how-keep-your-raspberry-pi-updated-and-patched
+[5]: https://opensource.com/article/19/3/teach-kids-program-raspberry-pi
+[6]: https://opensource.com/article/19/2/3-popular-programming-languages-you-can-learn-raspberry-pi
+[7]: https://opensource.com/article/19/2/learn-linux-raspberry-pi
+[8]: https://osmc.tv/
+[9]: https://www.dailydot.com/upstream/netflix-raspberry-pi/
+[10]: http://kodi.tv/
+[11]: https://opensource.com/article/19/3/how-boot-new-raspberry-pi
+[12]: https://www.raspberrypi.org/documentation/usage/kodi/
+[13]: https://libreelec.tv/
+[14]: https://github.com/pimusicbox/pimusicbox/tree/master
+[15]: https://opensource.com/life/15/3/pi-musicbox-guide
+[16]: https://www.pimusicbox.com/
diff --git a/translated/tech/20190309 Emulators and Native Linux games on the Raspberry Pi.md b/translated/tech/20190309 Emulators and Native Linux games on the Raspberry Pi.md
new file mode 100644
index 0000000000..ab2f9b7396
--- /dev/null
+++ b/translated/tech/20190309 Emulators and Native Linux games on the Raspberry Pi.md
@@ -0,0 +1,48 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Emulators and Native Linux games on the Raspberry Pi)
+[#]: via: (https://opensource.com/article/19/3/play-games-raspberry-pi)
+[#]: author: (Anderson Silva https://opensource.com/users/ansilva)
+
+树莓派上的模拟器和原生 Linux 游戏
+======
+树莓派是一个很棒的游戏平台。在我们的系列文章的第九篇中学习如何开始使用树莓派。
+
+
+
+回到我们关于树莓派入门系列文章的[第五篇][1],我提到 Minecraft 是一种教孩子们使用游戏平台进行编程的方法。作为一个不错的游戏平台,今天我们将讨论在树莓派上使用或者不使用模拟器来玩游戏的方式。
+
+### 使用模拟器玩游戏
+
+模拟器是一种能让你在树莓派上玩不同系统,不同年代游戏的软件。在如今众多的模拟器中,[RetroPi][2] 是树莓派中最受欢迎的。你可以用它来玩 Apple II、Amiga、Atari 2600、Commodore 64、Game Boy Advance 和[其他许多][3]游戏。
+
+如果 RetroPi 听起来有趣,请阅读[这些说明][4]开始使用,玩得开心!
+
+### 原生 Linux 游戏
+
+树莓派的操作系统 Raspbian 上也有很多原生 Linux 游戏。“Make Use Of” 有一篇关于如何在树莓派上[玩 10 个老经典游戏][5]如 Doom 和 Nuke Dukem 3D 的文章。
+
+你也可以将树莓派用作[游戏服务器][6]。例如,你可以在树莓派上安装 Terraria、Minecraft 和 QuakeWorld 服务器。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/play-games-raspberry-pi
+
+作者:[Anderson Silva][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ansilva
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/article/19/3/teach-kids-program-raspberry-pi
+[2]: https://retropie.org.uk/
+[3]: https://retropie.org.uk/about/systems
+[4]: https://opensource.com/article/19/1/retropie
+[5]: https://www.makeuseof.com/tag/classic-games-raspberry-pi-without-emulators/
+[6]: https://www.makeuseof.com/tag/raspberry-pi-game-servers/
diff --git a/translated/tech/20190310 Let-s get physical- How to use GPIO pins on the Raspberry Pi.md b/translated/tech/20190310 Let-s get physical- How to use GPIO pins on the Raspberry Pi.md
new file mode 100644
index 0000000000..386f257e69
--- /dev/null
+++ b/translated/tech/20190310 Let-s get physical- How to use GPIO pins on the Raspberry Pi.md
@@ -0,0 +1,48 @@
+[#]: collector: (lujun9972)
+[#]: translator: (qhwdw)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Let's get physical: How to use GPIO pins on the Raspberry Pi)
+[#]: via: (https://opensource.com/article/19/3/gpio-pins-raspberry-pi)
+[#]: author: (Anderson Silva https://opensource.com/users/ansilva)
+
+进入物理世界:如何使用树莓派的 GPIO 针脚
+======
+在树莓派使用入门的第十篇文章中,我们将学习如何使用 GPIO。
+
+
+到目前为止,本系列文章主要专注于树莓派的软件方面,而今天我们将学习硬件。在树莓派最初发布时,最让我感兴趣的主要特性之一就是它的 [通用输入输出][1](GPIO)针脚。GPIO 可以让你的树莓派程序与连接到它上面的传感器、继电器、和其它类型的电子元件与物理世界来交互。
+
+
+
+树莓派上的每个 GPIO 针脚要么有一个预定义的功能,要么被设计为通用的。另外,不同的树莓派型号要么 26 个,要么有 40 个 GPIO 针脚是你可以随意使用的。在维基百科上有一个 [关于每个针脚的非常详细的说明][2] 以及它的功能介绍。
+
+你可以使用树莓派的 GPIO 针脚做更多的事情。关于它的 GPIO 的使用我写过一些文章,包括使用树莓派来控制节日彩灯的三篇文章([第一篇][3]、 [第二篇][4]、和 [第三篇][5]),在这些文章中我通过使用开源程序让灯光随着音乐起舞。
+
+树莓派社区在不同编程语言上创建不同的库方面做了非常好的一些工作,因此,你能够使用 [C][6]、[Python][7]、 [Scratch][8]、和其它语言与 GPIO 进行交互。
+
+另外,如果你想在树莓派与物理世界交互方面获得更好的体验,你可以选用 [Raspberry Pi Sense Hat][9],它是插入树莓派 GPIO 针脚上的一个很便宜的电路板,借助它你可以通过程序与 LED、驾驶杆、气压计、温度计、温度计、 陀螺仪、加速度计、以及磁力仪来交互。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/gpio-pins-raspberry-pi
+
+作者:[Anderson Silva][a]
+选题:[lujun9972][b]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ansilva
+[b]: https://github.com/lujun9972
+[1]: https://www.raspberrypi.org/documentation/usage/gpio/
+[2]: https://en.wikipedia.org/wiki/Raspberry_Pi#General_purpose_input-output_(GPIO)_connector
+[3]: https://opensource.com/life/15/2/music-light-show-with-raspberry-pi
+[4]: https://opensource.com/life/15/12/ssh-your-christmas-tree-raspberry-pi
+[5]: https://opensource.com/article/18/12/lightshowpi-raspberry-pi
+[6]: https://www.bigmessowires.com/2018/05/26/raspberry-pi-gpio-programming-in-c/
+[7]: https://www.raspberrypi.org/documentation/usage/gpio/python/README.md
+[8]: https://www.raspberrypi.org/documentation/usage/gpio/scratch2/README.md
+[9]: https://opensource.com/life/16/4/experimenting-raspberry-pi-sense-hat
diff --git a/translated/tech/20190311 Learn about computer security with the Raspberry Pi and Kali Linux.md b/translated/tech/20190311 Learn about computer security with the Raspberry Pi and Kali Linux.md
new file mode 100644
index 0000000000..35089a3272
--- /dev/null
+++ b/translated/tech/20190311 Learn about computer security with the Raspberry Pi and Kali Linux.md
@@ -0,0 +1,62 @@
+[#]: collector: (lujun9972)
+[#]: translator: (hopefully2333)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Learn about computer security with the Raspberry Pi and Kali Linux)
+[#]: via: (https://opensource.com/article/19/3/computer-security-raspberry-pi)
+[#]: author: (Anderson Silva https://opensource.com/users/ansilva)
+
+通过树莓派和 kali Linux 学习计算机安全
+======
+树莓派是学习计算机安全的一个好方法。在我们入门系列的第 11 篇文章中会进行学习。
+
+
+是否有比保护你的计算机更热门的技术?一些专家会告诉你,没有绝对安全的系统。他们开玩笑说,如果你想要你的服务器或者应用程序真正的安全,就关掉你的服务器,从网络上断线,然后把它放在一个安全的地方。但问题是显而易见的:没人能用的应用程序或者服务器有什么用?
+
+这是围绕安全的一个难题,我们如何才能在保证安全性的同时,让服务器或应用程序依然可用且有价值?我无论如何都不是一个安全专家,虽然我希望有一天我能是。考虑到这一点,对于你能用树莓派做什么,分享和这有关的想法来学习计算机安全,我认为是有意义的。
+
+我会注意到,就像本系列中其他写给树莓派初学者的文章一样,我的目标不是深入研究,而是起个头,让你有兴趣去了解更多与这些主题相关的东西。
+
+### Kali Linux
+
+当我们谈到“做一些安全方面的事”的时候,出现在脑海中的一个 Linux 发行版就是 Kali Linux。kali Linux 的开发主要集中在调查取证和渗透测试方面。它有超过 600 个已经预先安装好了的渗透测试工具来测试你的计算机的安全性,以及取证模式,它可以防止自己接触到内部的硬盘驱动器或是被检查系统的交换空间。
+
+
+
+就像 Raspbian 一样,Kali Linux 基于 Debian 的发行版,你可以在 kali 的主文档门户网页上找到将它安装在树莓派上的文档(译者注:截至到翻译时,该网页是这个:https://docs.kali.org/kali-on-arm/install-kali-linux-arm-raspberry-pi)。如果你已经在你的树莓派上安装了 Raspbian 或者是其他的 Linux 发行版。那么你装 Kali 应该是没问题的,Kali 的创造者甚至将培训、研讨会和职业认证整合到了一起,以此来帮助提升你在安全领域内的职业生涯。
+
+### 其他的 Linux 发行版
+
+大多数的标准 Linux 发行版,比如 Raspbian,Ubuntu 和 Fedora 这些,在它们的仓库里同样也有很多可用的安全工具。一些很棒的探测工具包括 Nmap,Wireshark,auditctl,和 SELinux。
+
+### 项目
+
+你可以在树莓派上运行很多其他的安全相关的项目,例如蜜罐,广告拦截器和 USB 清洁器。花些时间了解它们!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/computer-security-raspberry-pi
+
+作者:[Anderson Silva][a]
+选题:[lujun9972][b]
+译者:[hopefully2333](https://github.com/hopefully2333)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ansilva
+[b]: https://github.com/lujun9972
+[1]: https://www.kali.org/
+[2]: https://en.wikipedia.org/wiki/Kali_Linux#Development
+[3]: https://docs.kali.org/general-use/kali-linux-forensics-mode
+[4]: https://docs.kali.org/kali-on-arm/install-kali-linux-arm-raspberry-pi
+[5]: https://www.kali.org/penetration-testing-with-kali-linux/
+[6]: https://linuxblog.darkduck.com/2019/02/9-best-linux-based-security-tools.html
+[7]: https://nmap.org/
+[8]: https://www.wireshark.org/
+[9]: https://linux.die.net/man/8/auditctl
+[10]: https://opensource.com/article/18/7/sysadmin-guide-selinux
+[11]: https://trustfoundry.net/honeypi-easy-honeypot-raspberry-pi/
+[12]: https://pi-hole.net/
+[13]: https://www.circl.lu/projects/CIRCLean/
diff --git a/translated/tech/20190312 Do advanced math with Mathematica on the Raspberry Pi.md b/translated/tech/20190312 Do advanced math with Mathematica on the Raspberry Pi.md
new file mode 100644
index 0000000000..74d8c6798d
--- /dev/null
+++ b/translated/tech/20190312 Do advanced math with Mathematica on the Raspberry Pi.md
@@ -0,0 +1,49 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Do advanced math with Mathematica on the Raspberry Pi)
+[#]: via: (https://opensource.com/article/19/3/do-math-raspberry-pi)
+[#]: author: (Anderson Silva https://opensource.com/users/ansilva)
+
+在树莓派上使用 Mathematica 进行高级数学运算
+======
+Wolfram 将一个版本 Mathematica 捆绑到了 Raspbian 中。在我们关于树莓派入门系列的第 12 篇文章中学习如何使用它。
+
+
+
+在 90 年代中期,我进入了大学数学专业,即使我以计算机科学学位毕业,第二专业数学我已经上了足够的课程,但还有两门小课没有上。当时,我被介绍了 [Wolfram][2] 中一个名为[Mathematica][1] 的应用,我们可以将黑板上的许多代数和微分方程输入计算机。我每月花几个小时在实验室学习 Wolfram 语言并在 Mathematica 上解决积分等问题。
+
+对于大学生来说 Mathematica 是闭源而且昂贵的,因此在差不多 20 年后,看到 Wolfram 将一个版本的 Mathematica 与 Raspbian 和 Raspberry Pi 捆绑在一起是一个惊喜。如果你决定使用另一个基于 Debian 的发行版,你可以从这里[下载][3]。请注意,此版本仅供非商业用途免费使用。
+
+树莓派基金会的 [Mathematica 简介][4]页面介绍了一些基本概念,如变量和循环、解决一些数学问题、创建图形、做线性代数,甚至通过应用与 GPIO 引脚交互。
+
+
+
+要深入了解 Mathematica,请查看 [Wolfram 语言文档][5]。如果你只是想解决一些基本的微积分问题,请[查看它的函数][6]部分。如果你想[绘制一些 2D 和 3D 图形][7],请阅读链接的教程。
+
+或者,如果你想在做数学运算时坚持使用开源工具,请查看命令行工具 **expr**、**factor** 和 **bc**。(记住使用 [**man** 命令][8] 阅读使用帮助)如果想画图,[Gnuplot][9] 是个不错的选择。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/do-math-raspberry-pi
+
+作者:[Anderson Silva][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ansilva
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Wolfram_Mathematica
+[2]: https://wolfram.com/
+[3]: https://www.wolfram.com/raspberry-pi/
+[4]: https://projects.raspberrypi.org/en/projects/getting-started-with-mathematica/
+[5]: https://www.wolfram.com/language/
+[6]: https://reference.wolfram.com/language/guide/Calculus.html
+[7]: https://reference.wolfram.com/language/howto/PlotAGraph.html
+[8]: https://opensource.com/article/19/3/learn-linux-raspberry-pi
+[9]: http://gnuplot.info/
\ No newline at end of file
diff --git a/translated/tech/20190321 How to add new disk in Linux.md b/translated/tech/20190321 How to add new disk in Linux.md
new file mode 100644
index 0000000000..0b325c9743
--- /dev/null
+++ b/translated/tech/20190321 How to add new disk in Linux.md
@@ -0,0 +1,146 @@
+[#]: collector: (lujun9972)
+[#]: translator: (luckyele)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to add new disk in Linux)
+[#]: via: (https://kerneltalks.com/hardware-config/how-to-add-new-disk-in-linux/)
+[#]: author: (kerneltalks https://kerneltalks.com)
+
+如何在Linux中添加新磁盘
+======
+
+* * *
+
+_在Linux机器中逐步添加磁盘的过程_
+
+![New disk addition in Linux][1]
+
+本文将向您介绍在Linux机器中添加新磁盘的步骤。将原始磁盘添加到 Linux 机器可能非常依赖于您所拥有的服务器类型,但是一旦将磁盘提供给机器,将其添加到挂载点的过程几乎相同。
+
+**目标** : 向服务器添加新的 10GB 磁盘,并使用 lvm 和新创建的卷组创建 5GB 装载点。
+
+* * *
+
+### 向 Linux 机器添加原始磁盘
+
+如果您使用的是 AWS EC2 Linux 服务器,可以 [按照以下步骤][2] 添加原始磁盘。 如果使用的是 VMware Linux VM,那么需要按照不同的步骤来添加磁盘。如果您正在运行物理机架安装/刀片服务器,那么添加磁盘将是一项物理任务。
+
+一旦磁盘物理/虚拟地连接到 Linux 机器上,它将被内核识别。
+
+* * *
+
+### 识别 Linux 最新添加的磁盘
+
+原始磁盘连接后,需要让内核去 [扫描新磁盘][3]。在新版中,它主要是由内核自动完成。
+
+第一件事是在内核中识别新添加的磁盘及其名称。实现这一点的方法有很多,以下作少量列举 –
+
+ * 可以在添加/扫描磁盘前后观察 `lsblk` 输出,以获取新的磁盘名。
+ * 检查 `/dev` 文件系统中新创建的磁盘文件。匹配文件和磁盘添加时间的时间戳。
+ * 观察 `fdisk-l` 添加/扫描磁盘前后的输出,以获取新的磁盘名。
+
+在本示例中,我使用的是 AWS EC2 服务器,向服务器添加了 5GB 磁盘。我的 lsblk 输出如下: –
+
+```
+[root@kerneltalks ~]# lsblk
+NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
+xvda 202:0 0 10G 0 disk
+├─xvda1 202:1 0 1M 0 part
+└─xvda2 202:2 0 10G 0 part /
+xvdf 202:80 0 10G 0 disk
+```
+
+可以看到 xvdf 是新添加的磁盘。完整路径是 `/dev/xvdf`。
+
+* * *
+
+### 在 LVM 中添加新磁盘
+
+我们这里使用 LVM,因为它是 Linux 平台上广泛使用的非常灵活的卷管理器。确认已安装 `lvm` 或 `lvm2` [安装在系统上的程序包][4]. 如未安装,请 [安装 lvm/lvm2 程序包][5].
+
+现在,我们将在逻辑卷管理器中添加这个原始磁盘,并从中创建 10GB 的挂接点。所用到的命令如下 –
+
+ * [pvcreate][6]
+ * [vgcreate][7]
+ * [lvcreate][8]
+
+如果要将磁盘添加到现有挂接点,并使用其空间来[扩展挂接点][9] ,则 `vgcreate` 应替换为 `vgextend`。
+
+会话示例输出如下: –
+
+```
+[root@kerneltalks ~]# pvcreate /dev/xvdf
+ Physical volume "/dev/xvdf" successfully created.
+[root@kerneltalks ~]# vgcreate vgdata /dev/xvdf
+ Volume group "vgdata" successfully created
+[root@kerneltalks ~]# lvcreate -L 5G -n lvdata vgdata
+ Logical volume "lvdata" created.
+```
+
+现在, 已完成逻辑卷创建。您需要使用所选的文件系统格式化它,并将其载入。在这里选择ext4文件系统,并使用 `mkfs.ext4` 进行格式化。
+
+```
+[root@kerneltalks ~]# mkfs.ext4 /dev/vgdata/lvdata
+mke2fs 1.42.9 (28-Dec-2013)
+Filesystem label=
+OS type: Linux
+Block size=4096 (log=2)
+Fragment size=4096 (log=2)
+Stride=0 blocks, Stripe width=0 blocks
+327680 inodes, 1310720 blocks
+65536 blocks (5.00%) reserved for the super user
+First data block=0
+Maximum filesystem blocks=1342177280
+40 block groups
+32768 blocks per group, 32768 fragments per group
+8192 inodes per group
+Superblock backups stored on blocks:
+ 32768, 98304, 163840, 229376, 294912, 819200, 884736
+
+Allocating group tables: done
+Writing inode tables: done
+Creating journal (32768 blocks): done
+Writing superblocks and filesystem accounting information: done
+```
+
+* * *
+
+### 在挂载点上从新磁盘挂载卷
+
+使用 `mount` 命令,在 /data 安装点上安装已创建并格式化的5GB逻辑卷。
+
+```
+[root@kerneltalks ~]# mount /dev/vgdata/lvdata /data
+[root@kerneltalks ~]# df -Ph /data
+Filesystem Size Used Avail Use% Mounted on
+/dev/mapper/vgdata-lvdata 4.8G 20M 4.6G 1% /data
+```
+
+使用df命令验证挂载点。如上所述,您都完成了!您可以在 [/etc/fstab][10] 中添加一个条目,以便在重新启动时保持此装载。
+
+您已将10GB磁盘连接到 Linux 计算机,并创建了 5GB 挂载点!
+
+--------------------------------------------------------------------------------
+
+via: https://kerneltalks.com/hardware-config/how-to-add-new-disk-in-linux/
+
+作者:[kerneltalks][a]
+选题:[lujun9972][b]
+译者:[luckyele](https://github.com/luckyele/)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://kerneltalks.com
+[b]: https://github.com/lujun9972
+[1]: https://i1.wp.com/kerneltalks.com/wp-content/uploads/2019/03/How-to-add-new-disk-in-Linux.png?ssl=1
+[2]: https://kerneltalks.com/cloud-services/how-to-add-ebs-disk-on-aws-linux-server/
+[3]: https://kerneltalks.com/disk-management/howto-scan-new-lun-disk-linux-hpux/
+[4]: https://kerneltalks.com/tools/check-package-installed-linux/
+[5]: https://kerneltalks.com/tools/package-installation-linux-yum-apt/
+[6]: https://kerneltalks.com/disk-management/lvm-command-tutorials-pvcreate-pvdisplay/
+[7]: https://kerneltalks.com/disk-management/lvm-commands-tutorial-vgcreate-vgdisplay-vgscan/
+[8]: https://kerneltalks.com/disk-management/lvm-commands-tutorial-lvcreate-lvdisplay-lvremove/
+[9]: https://kerneltalks.com/disk-management/extend-file-system-online-lvm/
+[10]: https://kerneltalks.com/config/understanding-etcfstab-file/