**, 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 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 7ab67f5c22..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: (hopefully2333)
-[#]: 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.
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-cloud-safe.png?itok=yj2TFPzq)
-
-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/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
-======
-![](https://fedoramagazine.org/wp-content/uploads/2019/01/freemind-816x345.jpg)
-
-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/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 aaf72026b4..0000000000
--- a/sources/tech/20190129 Get started with gPodder, an open source podcast client.md
+++ /dev/null
@@ -1,64 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (geekpi)
-[#]: 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.
-
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/podcast-record-microphone.png?itok=8yUDOywf)
-
-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.
-
-![](https://opensource.com/sites/default/files/uploads/gpodder-1.png)
-
-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.
-
-![](https://opensource.com/sites/default/files/uploads/gpodder-2.png)
-
-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.
-
-![](https://opensource.com/sites/default/files/uploads/gpodder-3.png)
-
-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.
-
-![](https://opensource.com/sites/default/files/uploads/gpodder-4.png)
-
-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 Olive is a new Open Source Video Editor Aiming to Take On Biggies Like Final Cut Pro.md b/sources/tech/20190130 Olive is a new Open Source Video Editor Aiming to Take On Biggies Like Final Cut Pro.md
deleted file mode 100644
index b77873dc58..0000000000
--- a/sources/tech/20190130 Olive is a new Open Source Video Editor Aiming to Take On Biggies Like Final Cut Pro.md
+++ /dev/null
@@ -1,102 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Olive is a new Open Source Video Editor Aiming to Take On Biggies Like Final Cut Pro)
-[#]: via: (https://itsfoss.com/olive-video-editor)
-[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
-
-Olive is a new Open Source Video Editor Aiming to Take On Biggies Like Final Cut Pro
-======
-
-[Olive][1] is a new open source video editor under development. This non-linear video editor aims to provide a free alternative to high-end professional video editing software. Too high an aim? I think so.
-
-If you have read our [list of best video editors for Linux][2], you might have noticed that most of the ‘professional-grade’ video editors such as [Lightworks][3] or DaVinciResolve are neither free nor open source.
-
-[Kdenlive][4] and Shotcut are there but they don’t often meet the standards of professional video editing (that’s what many Linux users have expressed).
-
-This gap between the hobbyist and professional video editors prompted the developer(s) of Olive to start this project.
-
-![Olive Video Editor][5]Olive Video Editor Interface
-
-There is a detailed [review of Olive on Libre Graphics World][6]. Actually, this is where I came to know about Olive first. You should read the article if you are interested in knowing more about it.
-
-### Installing Olive Video Editor in Linux
-
-Let me remind you. Olive is in the early stages of development. You’ll find plenty of bugs and missing/incomplete features. You should not treat it as your main video editor just yet.
-
-If you want to test Olive, there are several ways to install it on Linux.
-
-#### Install Olive in Ubuntu-based distributions via PPA
-
-You can install Olive via its official PPA in Ubuntu, Mint and other Ubuntu-based distributions.
-
-```
-sudo add-apt-repository ppa:olive-editor/olive-editor
-sudo apt-get update
-sudo apt-get install olive-editor
-```
-
-#### Install Olive via Snap
-
-If your Linux distribution supports Snap, you can use the command below to install it.
-
-```
-sudo snap install --edge olive-editor
-```
-
-#### Install Olive via Flatpak
-
-If your [Linux distribution supports Flatpak][7], you can install Olive video editor via Flatpak.
-
-#### Use Olive via AppImage
-
-Don’t want to install it? Download the [AppImage][8] file, set it as executable and run it.
-
-Both 32-bit and 64-bit AppImage files are available. You should download the appropriate file.
-
-Olive is also available for Windows and macOS. You can get it from their [download page][9].
-
-### Want to support the development of Olive video editor?
-
-If you like what Olive is trying to achieve and want to support it, here are a few ways you can do that.
-
-If you are testing Olive and find some bugs, please report it on their GitHub repository.
-
-If you are a programmer, go and check out the source code of Olive and see if you could help the project with your coding skills.
-
-Contributing to projects financially is another way you can help the development of open source software. You can support Olive monetarily by becoming a patron.
-
-If you don’t have either the money or coding skills to support Olive, you could still help it. Share this article or Olive’s website on social media or in Linux/software related forums and groups you frequent. A little word of mouth should help it indirectly.
-
-### What do you think of Olive?
-
-It’s too early to judge Olive. I hope that the development continues rapidly and we have a stable release of Olive by the end of the year (if I am not being overly optimistic).
-
-What do you think of Olive? Do you agree with the developer’s aim of targeting the pro-users? What features would you like Olive to have?
-
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/olive-video-editor
-
-作者:[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.olivevideoeditor.org/
-[2]: https://itsfoss.com/best-video-editing-software-linux/
-[3]: https://www.lwks.com/
-[4]: https://kdenlive.org/en/
-[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/olive-video-editor-interface.jpg?resize=800%2C450&ssl=1
-[6]: http://libregraphicsworld.org/blog/entry/introducing-olive-new-non-linear-video-editor
-[7]: https://itsfoss.com/flatpak-guide/
-[8]: https://itsfoss.com/use-appimage-linux/
-[9]: https://www.olivevideoeditor.org/download.php
-[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/olive-video-editor-interface.jpg?fit=800%2C450&ssl=1
diff --git a/sources/tech/20190131 Will quantum computing break security.md b/sources/tech/20190131 Will quantum computing break security.md
deleted file mode 100644
index af374408dc..0000000000
--- a/sources/tech/20190131 Will quantum computing break security.md
+++ /dev/null
@@ -1,106 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (HankChow)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Will quantum computing break security?)
-[#]: via: (https://opensource.com/article/19/1/will-quantum-computing-break-security)
-[#]: author: (Mike Bursell https://opensource.com/users/mikecamel)
-
-Will quantum computing break security?
-======
-
-Do you want J. Random Hacker to be able to pretend they're your bank?
-
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security_privacy_lock.png?itok=ZWjrpFzx)
-
-Over the past few years, a new type of computer has arrived on the block: the quantum computer. It's arguably the sixth type of computer:
-
- 1. **Humans:** Before there were artificial computers, people used, well, people. And people with this job were called "computers."
-
- 2. **Mechanical analogue:** These are devices such as the [Antikythera mechanism][1], astrolabes, or slide rules.
-
- 3. **Mechanical digital:** In this category, I'd count anything that allowed discrete mathematics but didn't use electronics for the actual calculation: the abacus, Babbage's Difference Engine, etc.
-
- 4. **Electronic analogue:** Many of these were invented for military uses such as bomb sights, gun aiming, etc.
-
- 5. **Electronic digital:** I'm going to go out on a limb here and characterise Colossus as the first electronic digital computer1: these are basically what we use today for anything from mobile phones to supercomputers.
-
- 6. **Quantum computers:** These are coming and are fundamentally different from all of the previous generations.
-
-
-
-
-### What is quantum computing?
-
-Quantum computing uses concepts from quantum mechanics to allow very different types of calculations from what we're used to in "classical computing." I'm not even going to try to explain, because I know I'd do a terrible job, so I suggest you try something like [Wikipedia's definition][2] as a starting point. What's important for our purposes is to understand that quantum computers use qubits to do calculations, and for quite a few types of mathematical algorithms—and therefore computing operations––they can solve problems much faster than classical computers.
-
-What's "much faster"? Much, much faster: orders of magnitude faster. A calculation that might take years or decades with a classical computer could, in certain circumstances, take seconds. Impressive, yes? And scary. Because one of the types of problems that quantum computers should be good at solving is decrypting encrypted messages, even without the keys.
-
-This means that someone with a sufficiently powerful quantum computer should be able to read all of your current and past messages, decrypt any stored data, and maybe fake digital signatures. Is this a big thing? Yes. Do you want J. Random Hacker to be able to pretend they're your bank?2 Do you want that transaction on the blockchain where you were sold a 10 bedroom mansion in Mayfair to be "corrected" to be a bedsit in Weston-super-Mare?3
-
-### Some good news
-
-This is all scary stuff, but there's good news of various types.
-
-The first is that, in order to make any of this work at all, you need a quantum computer with a good number of qubits operating, and this is turning out to be hard.4 The general consensus is that we've got a few years before anybody has a "big" enough quantum computer to do serious damage to classical encryption algorithms.
-
-The second is that, even with a sufficient number of qubits to attacks our existing algorithms, you still need even more to allow for error correction.
-
-The third is that, although there are theoretical models to show how to attack some of our existing algorithms, actually making them work is significantly harder than you or I5 might expect. In fact, some of the attacks may turn out to be infeasible or just take more years to perfect than we worry about.
-
-The fourth is that there are clever people out there who are designing quantum-computation-resistant algorithms (sometimes referred to as "post-quantum algorithms") that we can use, at least for new encryption, once they've been tested and become widely available.
-
-All in all, in fact, there's a strong body of expert opinion that says we shouldn't be overly worried about quantum computing breaking our encryption in the next five or even 10 years.
-
-### And some bad news
-
-It's not all rosy, however. Two issues stick out to me as areas of concern.
-
- 1. People are still designing and rolling out systems that don't consider the issue. If you're coming up with a system that is likely to be in use for 10 or more years or will be encrypting or signing data that must remain confidential or attributable over those sorts of periods, then you should be considering the possible impact of quantum computing on your system.
-
- 2. Some of the new, quantum-computing-resistant algorithms are proprietary. This means that when you and I want to start implementing systems that are designed to be quantum-computing resistant, we'll have to pay to do so. I'm a big proponent of open source, and particularly of [open source cryptography][3], and my big worry is that we just won't be able to open source these things, and worse, that when new protocol standards are created––either de-facto or through standards bodies––they will choose proprietary algorithms that exclude the use of open source, whether on purpose, through ignorance, or because few good alternatives are available.
-
-
-
-
-### What to do?
-
-Luckily, there are things you can do to address both of the issues above. The first is to think and plan when designing a system about what the impact of quantum computing might be on it. Often—very often—you won't need to implement anything explicit now (and it could be hard to, given the current state of the art), but you should at least embrace [the concept of crypto-agility][4]: designing protocols and systems so you can swap out algorithms if required.7
-
-The second is a call to arms: Get involved in the open source movement and encourage everybody you know who has anything to do with cryptography to rally for open standards and for research into non-proprietary, quantum-computing-resistant algorithms. This is something that's very much on my to-do list, and an area where pressure and lobbying is just as important as the research itself.
-
-1\. I think it's fair to call it the first electronic, programmable computer. I know there were earlier non-programmable ones, and that some claim ENIAC, but I don't have the space or the energy to argue the case here.
-
-2\. No.
-
-3\. See 2. Don't get me wrong, by the way—I grew up near Weston-super-Mare, and it's got things going for it, but it's not Mayfair.
-
-4\. And if a quantum physicist says something's hard, then to my mind, it's hard.
-
-5\. And I'm assuming that neither of us is a quantum physicist or mathematician.6
-
-6\. I'm definitely not.
-
-7\. And not just for quantum-computing reasons: There's a good chance that some of our existing classical algorithms may just fall to other, non-quantum attacks such as new mathematical approaches.
-
-This article was originally published on [Alice, Eve, and Bob][5] and is reprinted with the author's permission.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/will-quantum-computing-break-security
-
-作者:[Mike Bursell][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/mikecamel
-[b]: https://github.com/lujun9972
-[1]: https://en.wikipedia.org/wiki/Antikythera_mechanism
-[2]: https://en.wikipedia.org/wiki/Quantum_computing
-[3]: https://opensource.com/article/17/10/many-eyes
-[4]: https://aliceevebob.com/2017/04/04/disbelieving-the-many-eyes-hypothesis/
-[5]: https://aliceevebob.com/2019/01/08/will-quantum-computing-break-security/
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
index 5b6e7f1bfa..afbcae9833 100644
--- a/sources/tech/20190204 Top 5 open source network monitoring tools.md
+++ b/sources/tech/20190204 Top 5 open source network monitoring tools.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (sugarfillet)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20190206 And, Ampersand, and - in Linux.md b/sources/tech/20190206 And, Ampersand, and - in Linux.md
index 88a0458539..2febc0a2ef 100644
--- a/sources/tech/20190206 And, Ampersand, and - in Linux.md
+++ b/sources/tech/20190206 And, Ampersand, and - in Linux.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (HankChow)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20190206 Getting started with Vim visual mode.md b/sources/tech/20190206 Getting started with Vim visual mode.md
index e6b9b1da9b..eadc031b88 100644
--- a/sources/tech/20190206 Getting started with Vim visual mode.md
+++ b/sources/tech/20190206 Getting started with Vim visual mode.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (MjSeven)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20190207 How to determine how much memory is installed, used on Linux systems.md b/sources/tech/20190207 How to determine how much memory is installed, used on Linux systems.md
deleted file mode 100644
index c6098fa12d..0000000000
--- a/sources/tech/20190207 How to determine how much memory is installed, used on Linux systems.md
+++ /dev/null
@@ -1,227 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How to determine how much memory is installed, used on Linux systems)
-[#]: via: (https://www.networkworld.com/article/3336174/linux/how-much-memory-is-installed-and-being-used-on-your-linux-systems.html)
-[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
-
-How to determine how much memory is installed, used on Linux systems
-======
-![](https://images.idgesg.net/images/article/2019/02/memory-100787327-large.jpg)
-
-There are numerous ways to get information on the memory installed on Linux systems and view how much of that memory is being used. Some commands provide an overwhelming amount of detail, while others provide succinct, though not necessarily easy-to-digest, answers. In this post, we'll look at some of the more useful tools for checking on memory and its usage.
-
-Before we get into the details, however, let's review a few details. Physical memory and virtual memory are not the same. The latter includes disk space that configured to be used as swap. Swap may include partitions set aside for this usage or files that are created to add to the available swap space when creating a new partition may not be practical. Some Linux commands provide information on both.
-
-Swap expands memory by providing disk space that can be used to house inactive pages in memory that are moved to disk when physical memory fills up.
-
-One file that plays a role in memory management is **/proc/kcore**. This file looks like a normal (though extremely large) file, but it does not occupy disk space at all. Instead, it is a virtual file like all of the files in /proc.
-
-```
-$ ls -l /proc/kcore
--r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcore
-```
-
-Interestingly, the two systems queried below do _not_ have the same amount of memory installed, yet the size of /proc/kcore is the same on both. The first of these two systems has 4 GB of memory installed; the second has 6 GB.
-
-```
-system1$ ls -l /proc/kcore
--r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcore
-system2$ ls -l /proc/kcore
--r-------- 1 root root 140737477881856 Feb 5 13:00 /proc/kcore
-```
-
-Explanations that claim the size of this file represents the amount of available virtual memory (maybe plus 4K) don't hold much weight. This number would suggest that the virtual memory on these systems is 128 terrabytes! That number seems to represent instead how much memory a 64-bit systems might be capable of addressing — not how much is available on the system. Calculations of what 128 terrabytes and that number, plus 4K would look like are fairly easy to make on the command line:
-
-```
-$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128
-140737488355328
-$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128 + 4096
-140737488359424
-```
-
-Another and more human-friendly command for examining memory is the **free** command. It gives you an easy-to-understand report on memory.
-
-```
-$ free
- total used free shared buff/cache available
-Mem: 6102476 812244 4090752 13112 1199480 4984140
-Swap: 2097148 0 2097148
-```
-
-With the **-g** option, free reports the values in gigabytes.
-
-```
-$ free -g
- total used free shared buff/cache available
-Mem: 5 0 3 0 1 4
-Swap: 1 0 1
-```
-
-With the **-t** option, free shows the same values as it does with no options (don't confuse -t with terrabytes!) but by adding a total line at the bottom of its output.
-
-```
-$ free -t
- total used free shared buff/cache available
-Mem: 6102476 812408 4090612 13112 1199456 4983984
-Swap: 2097148 0 2097148
-Total: 8199624 812408 6187760
-```
-
-And, of course, you can choose to use both options.
-
-```
-$ free -tg
- total used free shared buff/cache available
-Mem: 5 0 3 0 1 4
-Swap: 1 0 1
-Total: 7 0 5
-```
-
-You might be disappointed in this report if you're trying to answer the question "How much RAM is installed on this system?" This is the same system shown in the example above that was described as having 6GB of RAM. That doesn't mean this report is wrong, but that it's the system's view of the memory it has at its disposal.
-
-The free command also provides an option to update the display every X seconds (10 in the example below).
-
-```
-$ free -s 10
- total used free shared buff/cache available
-Mem: 6102476 812280 4090704 13112 1199492 4984108
-Swap: 2097148 0 2097148
-
- total used free shared buff/cache available
-Mem: 6102476 812260 4090712 13112 1199504 4984120
-Swap: 2097148 0 2097148
-```
-
-With **-l** , the free command provides high and low memory usage.
-
-```
-$ free -l
- total used free shared buff/cache available
-Mem: 6102476 812376 4090588 13112 1199512 4984000
-Low: 6102476 2011888 4090588
-High: 0 0 0
-Swap: 2097148 0 2097148
-```
-
-Another option for looking at memory is the **/proc/meminfo** file. Like /proc/kcore, this is a virtual file and one that gives a useful report showing how much memory is installed, free and available. Clearly, free and available do not represent the same thing. MemFree seems to represent unused RAM. MemAvailable is an estimate of how much memory is available for starting new applications.
-
-```
-$ head -3 /proc/meminfo
-MemTotal: 6102476 kB
-MemFree: 4090596 kB
-MemAvailable: 4984040 kB
-```
-
-If you only want to see total memory, you can use one of these commands:
-
-```
-$ awk '/MemTotal/ {print $2}' /proc/meminfo
-6102476
-$ grep MemTotal /proc/meminfo
-MemTotal: 6102476 kB
-```
-
-The **DirectMap** entries break information on memory into categories.
-
-```
-$ grep DirectMap /proc/meminfo
-DirectMap4k: 213568 kB
-DirectMap2M: 6076416 kB
-```
-
-DirectMap4k represents the amount of memory being mapped to standard 4k pages, while DirectMap2M shows the amount of memory being mapped to 2MB pages.
-
-The **getconf** command is one that will provide quite a bit more information than most of us want to contemplate.
-
-```
-$ getconf -a | more
-LINK_MAX 65000
-_POSIX_LINK_MAX 65000
-MAX_CANON 255
-_POSIX_MAX_CANON 255
-MAX_INPUT 255
-_POSIX_MAX_INPUT 255
-NAME_MAX 255
-_POSIX_NAME_MAX 255
-PATH_MAX 4096
-_POSIX_PATH_MAX 4096
-PIPE_BUF 4096
-_POSIX_PIPE_BUF 4096
-SOCK_MAXBUF
-_POSIX_ASYNC_IO
-_POSIX_CHOWN_RESTRICTED 1
-_POSIX_NO_TRUNC 1
-_POSIX_PRIO_IO
-_POSIX_SYNC_IO
-_POSIX_VDISABLE 0
-ARG_MAX 2097152
-ATEXIT_MAX 2147483647
-CHAR_BIT 8
-CHAR_MAX 127
---More--
-```
-
-Pare that output down to something specific with a command like the one shown below, and you'll get the same kind of information provided by some of the commands above.
-
-```
-$ getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'
-6102476 kB
-```
-
-That command calculates memory by multiplying the values in the first and last lines of output like this:
-
-```
-PAGESIZE 4096 <==
-_AVPHYS_PAGES 1022511
-_PHYS_PAGES 1525619 <==
-```
-
-Calculating that independently, we can see how that value is derived.
-
-```
-$ expr 4096 \* 1525619 / 1024
-6102476
-```
-
-Clearly that's one of those commands that deserves to be turned into an alias!
-
-Another command with very digestible output is **top**. In the first five lines of top's output, you'll see some numbers that show how memory is being used.
-
-```
-$ top
-top - 15:36:38 up 8 days, 2:37, 2 users, load average: 0.00, 0.00, 0.00
-Tasks: 266 total, 1 running, 265 sleeping, 0 stopped, 0 zombie
-%Cpu(s): 0.2 us, 0.4 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
-MiB Mem : 3244.8 total, 377.9 free, 1826.2 used, 1040.7 buff/cache
-MiB Swap: 3536.0 total, 3535.7 free, 0.3 used. 1126.1 avail Mem
-```
-
-And finally a command that will answer the question "So, how much RAM is installed on this system?" in a succinct fashion:
-
-```
-$ sudo dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END {print s / 1024 "GB"}'
-6GB
-```
-
-Depending on how much detail you want to see, Linux systems provide a lot of options for seeing how much memory is installed on your systems and how much is used and available.
-
-Join the Network World communities on [Facebook][1] and [LinkedIn][2] to comment on topics that are top of mind.
-
---------------------------------------------------------------------------------
-
-via: https://www.networkworld.com/article/3336174/linux/how-much-memory-is-installed-and-being-used-on-your-linux-systems.html
-
-作者:[Sandra Henry-Stocker][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.networkworld.com/author/Sandra-Henry_Stocker/
-[b]: https://github.com/lujun9972
-[1]: https://www.facebook.com/NetworkWorld/
-[2]: https://www.linkedin.com/company/network-world
diff --git a/sources/tech/20190211 How To Remove-Delete The Empty Lines In A File In Linux.md b/sources/tech/20190211 How To Remove-Delete The Empty Lines In A File In Linux.md
index a7b2c06a16..b55cbcd811 100644
--- a/sources/tech/20190211 How To Remove-Delete The Empty Lines In A File In Linux.md
+++ b/sources/tech/20190211 How To Remove-Delete The Empty Lines In A File In Linux.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: ( pityonline )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
@@ -180,7 +180,7 @@ via: https://www.2daygeek.com/remove-delete-empty-lines-in-a-file-in-linux/
作者:[Magesh Maruthamuthu][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
+译者:[pityonline](https://github.com/pityonline)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/sources/tech/20190212 How To Check CPU, Memory And Swap Utilization Percentage In Linux.md b/sources/tech/20190212 How To Check CPU, Memory And Swap Utilization Percentage In Linux.md
index 24fc867ac0..0fadc0908d 100644
--- a/sources/tech/20190212 How To Check CPU, Memory And Swap Utilization Percentage In Linux.md
+++ b/sources/tech/20190212 How To Check CPU, Memory And Swap Utilization Percentage In Linux.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (An-DJ)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
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/20190212 Two graphical tools for manipulating PDFs on the Linux desktop.md b/sources/tech/20190212 Two graphical tools for manipulating PDFs on the Linux desktop.md
deleted file mode 100644
index d1d640c30f..0000000000
--- a/sources/tech/20190212 Two graphical tools for manipulating PDFs on the Linux desktop.md
+++ /dev/null
@@ -1,99 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Two graphical tools for manipulating PDFs on the Linux desktop)
-[#]: via: (https://opensource.com/article/19/2/manipulating-pdfs-linux)
-[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
-
-Two graphical tools for manipulating PDFs on the Linux desktop
-======
-PDF-Shuffler and PDF Chain are great tools for modifying PDFs in Linux.
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_osyearbook2016_sysadmin_cc.png?itok=Y1AHCKI4)
-
-With the way I talk and write about PDFs and tools for working with them, some people think I'm in love with the format. I'm not, for a variety of reasons I won't go into here.
-
-I won't go so far as saying PDFs are a necessary evil in my personal and professional life—rather they're a necessary not-so-good. Often I have to use PDFs, even though there are better alternatives for delivering documents.
-
-When I work with PDFs, usually at the day job and with one of those other operating systems, I fiddle with them using Adobe Acrobat. But what about when I have to work with PDFs on the Linux desktop? Let's take a look at two of the graphical tools I use to manipulate PDFs.
-
-### PDF-Shuffler
-
-As its name suggests, you can use [PDF-Shuffler][1] to move pages around in a PDF file. It can do a little more, but the software's capabilities are limited. That doesn't mean PDF-Shuffler isn't useful. It is. Very useful.
-
-You can use PDF-Shuffler to:
-
- * Extract pages from PDF files
- * Add pages to a file
- * Rearrange the pages in a file
-
-
-
-Be aware that PDF-Shuffler has a few dependencies, like pyPDF and python-gtk. Usually, installing it via a package manager is the fastest and least frustrating route.
-
-Let's say you want to extract pages from a PDF, maybe to act as a sample chapter from your book. Open the PDF file by selecting **File > Add**.
-
-![](https://opensource.com/sites/default/files/uploads/pdfshuffler-book.png)
-
-To extract pages 7 to 9, press Ctrl and click-select the pages. Then, right-click and select **Export selection**.
-
-![](https://opensource.com/sites/default/files/uploads/pdfshuffler-export.png)
-
-Choose the directory where you want to save the file, give it a name, and click **Save**.
-
-To add a file—for example, to add a cover or re-insert scanned, signed pages of a contract or application—open a PDF file, then select **File > Add** and find the PDF file that you want to add. Click **Open**.
-
-PDF-Shuffler has an annoying habit of adding pages at the end of the PDF file you're working on. Click and drag the page you added to where you want it to go in the file. You can only click and drag one page in a file at a time.
-
-![](https://opensource.com/sites/default/files/uploads/pdfshuffler-move.png)
-
-### PDF Chain
-
-I'm a big fan of [PDFtk][2], a command-line app for doing some interesting things with and to PDFs. Since I don't use it frequently, I don't remember all of PDFtk's commands and options.
-
-[PDF Chain][3] is a very good alternative to PDFtk's command line. It gives you one-click access to PDFtk's most frequently used commands. Without touching a menu, you can:
-
- * Merge PDFs (including rotating the pages of one or more files)
- * Extract pages from a PDF and save them to individual files
- * Add a background or watermark to a PDF
- * Add attachments to a file
-
-![](https://opensource.com/sites/default/files/uploads/pdfchain1.png)
-
-You can also do more. Click on the **Tools** menu to:
-
- * Extract attachments from a PDF
- * Compress or uncompress a file
- * Extract the metadata from the file
- * Fill in PDF forms from an external [data file][4]
- * [Flatten][5] a PDF
- * Drop [XML Forms Architecture][6] (XFA) data from PDF forms
-
-
-
-To be honest, I only use the commands to extract attachments and compress or uncompress PDFs with PDF Chain or PDFtk. The rest are pretty much terra incognita for me.
-
-### Summing up
-
-The number of tools available on Linux for working with PDFs never ceases to amaze me. And neither does the breadth and depth of their features and functions. I can usually find one, whether command line or graphical, that does what I need to do. For the most part, PDF Mod and PDF Chain work well for me.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/2/manipulating-pdfs-linux
-
-作者:[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://savannah.nongnu.org/projects/pdfshuffler/
-[2]: https://en.wikipedia.org/wiki/PDFtk
-[3]: http://pdfchain.sourceforge.net/
-[4]: http://www.verypdf.com/pdfform/fdf.htm
-[5]: http://pdf-tips-tricks.blogspot.com/2009/03/flattening-pdf-layers.html
-[6]: http://en.wikipedia.org/wiki/XFA
diff --git a/sources/tech/20190213 How to use Linux Cockpit to manage system performance.md b/sources/tech/20190213 How to use Linux Cockpit to manage system performance.md
deleted file mode 100644
index 0633b0b3ab..0000000000
--- a/sources/tech/20190213 How to use Linux Cockpit to manage system performance.md
+++ /dev/null
@@ -1,89 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How to use Linux Cockpit to manage system performance)
-[#]: via: (https://www.networkworld.com/article/3340038/linux/sitting-in-the-linux-cockpit.html)
-[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
-
-How to use Linux Cockpit to manage system performance
-======
-
-Linux Cockpit is a web-based interface that provides graphical administrative access to a system. Here's a look at what it allows you to control.
-
-![](https://images.idgesg.net/images/article/2019/02/cockpit_airline_airplane_control_pilot-by-southerlycourse-getty-100787904-large.jpg)
-
-If you haven't tried the relatively new Linux Cockpit, you might be surprised by all it can do. It's a user-friendly web-based console that provides some very easy ways to administer Linux systems — _through the **web**_. You can monitor system resources, add or remove accounts, monitor system usage, shut down the system and perform quite a few other tasks — all through a very accessible web connection. It's also very easy to set up and use.
-
-While many Linux sysadmins spend most of their time on the command line, access to a remote system using a tool like PuTTY doesn't always provide the most useful command output. Linux Cockpit provides graphs and easy-to-use forms for viewing performance measures and making changes to your systems.
-
-Linux Cockpit allows you to view many aspects of system performance and make configuration changes, though the task list may depend on the particular flavor of Linux that you are using. Some of the categories of tasks include the following:
-
- * Monitoring system activity (CPU, memory, disk IO and network traffics) — **System**
- * Viewing system log entries — **Logs**
- * Seeing how full your disk partitions are — **Storage**
- * Watching networking activity (sent and received) — **Networking**
- * Taking a look at user accounts — **Accounts**
- * Checking the status of system services — **Services**
- * Pulling up information on installed applications — **Applications**
- * Viewing and installing available updates (if logged in as root) and restart the system if needed — **Software Updates**
- * Opening and using a terminal window — **Terminal**
-
-
-
-Some Linux Cockpit installations will also allow you to run diagnostic reports, dump the kernel, examine SELinux (security) settings, and list subscriptions.
-
-Here's an example of system activity as displayed by Linux Cockpit:
-
-![cockpit activity][1] Sandra Henry-Stocker
-
-Linux Cockpit display of system activity
-
-### How to set up Linux Cockpit
-
-On some Linux installations (e.g., recent RHEL), Linux Cockpit may already be installed and ready for use. On others, you may have to take some easy steps to install it and make it accessible.
-
-On Ubuntu, for example, these commands should work:
-
-```
-$ sudo apt-get install cockpit
-$ man cockpit <== just checking
-$ sudo systemctl enable --now cockpit.socket
-$ netstat -a | grep 9090
-tcp6 0 0 [::]:9090 [::]:* LISTEN
-$ sudo systemctl enable --now cockpit.socket
-$ sudo ufw allow 9090
-```
-
-Once Linux Cockpit is enabled, point your browser at **https:// :9090**.
-
-A list of distributions that work with Cockpit along with installation instructions is available at [the Cockpit Project][2].
-
-Linux Cockpit doesn't provide any recognition of **sudo** privileges without some additional configuration. If you are not allowed to make a change using the Cockpit interface, you will see one of those little red international prohibition signs imposed over the button you'd otherwise click on.
-
-To get sudo privileges working, you need to be sure that the user is in the **wheel** (RHEL) or **adm** (Debian) group in the **/etc/group** file, that the Server Administrator checkbox has been selected for this user account when logged into Cockpit as root and that the user selects "Reuse my password" when logging into Cockpit.
-
-It's nice to be able to get some graphical control over the Linux systems you administer even when they're thousands of miles away or lacking consoles. While I love working on the console, I like seeing a graph or a button now and then. Linux Cockpit provides a very useful interface for routine administrative tasks.
-
-Post updated Feb. 13, 11:30am ET
-
-Join the Network World communities on [Facebook][3] and [LinkedIn][4] to comment on topics that are top of mind.
-
---------------------------------------------------------------------------------
-
-via: https://www.networkworld.com/article/3340038/linux/sitting-in-the-linux-cockpit.html
-
-作者:[Sandra Henry-Stocker][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.networkworld.com/author/Sandra-Henry_Stocker/
-[b]: https://github.com/lujun9972
-[1]: https://images.idgesg.net/images/article/2019/02/cockpit-activity-100787994-large.jpg
-[2]: https://cockpit-project.org/running.html
-[3]: https://www.facebook.com/NetworkWorld/
-[4]: https://www.linkedin.com/company/network-world
diff --git a/sources/tech/20190216 FinalCrypt - An Open Source File Encryption Application.md b/sources/tech/20190216 FinalCrypt - An Open Source File Encryption Application.md
index 3d03dcfa0a..af54453727 100644
--- a/sources/tech/20190216 FinalCrypt - An Open Source File Encryption Application.md
+++ b/sources/tech/20190216 FinalCrypt - An Open Source File Encryption Application.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (geekpi)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20190216 How To Grant And Remove Sudo Privileges To Users On Ubuntu.md b/sources/tech/20190216 How To Grant And Remove Sudo Privileges To Users On Ubuntu.md
deleted file mode 100644
index 56e8bd0abc..0000000000
--- a/sources/tech/20190216 How To Grant And Remove Sudo Privileges To Users On Ubuntu.md
+++ /dev/null
@@ -1,103 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How To Grant And Remove Sudo Privileges To Users On Ubuntu)
-[#]: via: (https://www.ostechnix.com/how-to-grant-and-remove-sudo-privileges-to-users-on-ubuntu/)
-[#]: author: (SK https://www.ostechnix.com/author/sk/)
-
-How To Grant And Remove Sudo Privileges To Users On Ubuntu
-======
-![](https://www.ostechnix.com/wp-content/uploads/2019/02/sudo-privileges-720x340.png)
-
-As you know already, the user can perform any administrative tasks with sudo privileges on Ubuntu systems. When creating a new users on your Linux box, they can’t do any administrative tasks until you make them to be a member of **‘sudo’ group**. In this brief tutorial, we explain how to add a regular user to sudo group and remove the given privileges to make it as just a normal user.
-
-**Grant Sudo Privileges To A regular User On Linux**
-
-Usually, we use **‘adduser’** command to create new user like below.
-
-```
-$ sudo adduser ostechnix
-```
-
-If you want the newly created user to perform any administrative tasks with sudo, just add him to the sudo group using command:
-
-```
-$ sudo usermod -a -G sudo hduser
-```
-
-The above command will make the user called **‘ostechnix’** to be the member of sudo group.
-
-You can also use this command too to add the users to sudo group.
-
-```
-$ sudo adduser ostechnix sudo
-```
-
-Now, log out and log in back as the new user for this change to take effect. The user has now become an administrative user.
-
-To verify it, just use ‘sudo’ as prefix in a any command.
-
-```
-$ sudo mkdir /test
-[sudo] password for ostechnix:
-```
-
-### Remove sudo privileges of an User
-
-Sometimes, you might want to remove sudo privileges to a particular user without deleting it from your Linux box. To make any user as a normal user, just remove them from the sudo group.
-
-Say for example If you want to remove a user called **ostechnix** , from the sudo group, just run:
-
-```
-$ sudo deluser ostechnix sudo
-```
-
-**Sample output:**
-
-```
-Removing user `ostechnix' from group `sudo' ...
-Done.
-```
-
-This command will only remove user ‘ostechnix’ from the sudo group, but it will not delete the user permanently from the system. Now, He becomes a regular user and can’t do any administrative tasks as sudo user.
-
-Also, you can use the following command to revoke the sudo access from an user:
-
-```
-$ sudo gpasswd -d ostechnix sudo
-```
-
-Please be careful while removing users from the sudo group. Do not remove the real administrator from the “sudo” group.
-
-Verify the user “ostechnix” has been really removed from sudo group using command:
-
-```
-$ sudo -l -U ostechnix
-User ostechnix is not allowed to run sudo on ubuntuserver.
-```
-
-Yes, the user “ostechnix” has been removed from sudo group, and he can’t execute any administrative tasks.
-
-Please be careful while removing a user from a sudo group. If you have only one sudo user on your system and you remove him from the sudo group, you can’t perform any administrative stuffs such as installing, removing and updating programs on your system. So, please be careful. In our next, tutorial, we will explain how to restore sudo privileges to a user
-
-And, that’s all for now. Hope this was useful. More good stuffs to come. Stay tuned!
-
-Cheers!
-
-
-
---------------------------------------------------------------------------------
-
-via: https://www.ostechnix.com/how-to-grant-and-remove-sudo-privileges-to-users-on-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
diff --git a/sources/tech/20190217 How to Change User Password in Ubuntu -Beginner-s Tutorial.md b/sources/tech/20190217 How to Change User Password in Ubuntu -Beginner-s Tutorial.md
deleted file mode 100644
index 30691f7d5d..0000000000
--- a/sources/tech/20190217 How to Change User Password in Ubuntu -Beginner-s Tutorial.md
+++ /dev/null
@@ -1,130 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (An-DJ )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How to Change User Password in Ubuntu [Beginner’s Tutorial])
-[#]: via: (https://itsfoss.com/change-password-ubuntu)
-[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
-
-How to Change User Password in Ubuntu [Beginner’s Tutorial]
-======
-
-**Want to change root password in Ubuntu? Learn how to change the password for any user in Ubuntu Linux. Both terminal and GUI methods have been discussed.**
-
-When do you need to change the password in Ubuntu? Let me give you a couple of scenarios.
-
-When you install [Ubuntu][1], you create a user and set a password for it. It could be a weak password or perhaps a bit too complicated and you want to change it.
-
-If you are a sysadmin, you may need to change the password for other users on your system.
-
-You may have a few other reasons for doing this. Now the question comes, how to change the password for a user in Ubuntu or Linux?
-
-In this quick tutorial, I’ll show you the command line and the GUI ways of changing passwords in Ubuntu.
-
-### Change user password in Ubuntu [Command Line]
-
-![How to change user password in Ubuntu Linux][2]
-
-Changing user password in Ubuntu is dead simple. In fact, it’s the same with any Linu distribution because you use the generic Linux command called passwd for this purpose.
-
-If you want to change your current password, simply run this command in a terminal:
-
-```
-passwd
-```
-
-You’ll be asked to enter your current password and the new password twice.
-
-You won’t see anything on the screen while typing the password. This is perfectly normal behavior for UNIX and Linux.
-
-```
-passwd
-
-Changing password for abhishek.
-
-(current) UNIX password:
-
-Enter new UNIX password:
-
-Retype new UNIX password:
-
-passwd: password updated successfully
-```
-
-Since this is your admin account, you just changed the sudo password in Ubuntu without even realizing it.
-
-![Change user password in Linux command line][3]
-
-If you want to change password for some other user, you can do that as well with the passwd command. But in this case, you’ll have to use sudo.
-
-```
-sudo passwd
-```
-
-If you changed your password and forgot it later, don’t worry. You can [easily reset Ubuntu password][4].
-
-### Change root password in Ubuntu
-
-By default, the root user in Ubuntu doesn’t have a password. Don’t be surprised. You don’t use the root user in Ubuntu all the time. Confused? Let me explain it to you quickly.
-
-While [installing Ubuntu][5], you are forced to create a user. This user has admin access. This admin user can gain root access using the sudo command. But it uses its own password, not the root account’s password (because there is none).
-
-You can set or change root password using the **passwd** command. However, in most cases, you don’t need it and you shouldn’t be doing it.
-
-You’ll have to use sudo (with an account with admin privileges). If the root password has no password set up previously, it will ask you to set it up. Else, you can change it using the existing root password.
-
-```
-sudo password root
-```
-
-### Change Ubuntu password using GUI
-
-I have used GNOME desktop with Ubuntu 18.04 here. The steps should be more or less the same for other desktop environments and Ubuntu versions.
-
-Go to Menu (press Windows/Super key) and search for Settings.
-
-In the Settings, scroll down a bit and go to Details.
-
-![Go to details in Ubuntu GNOME settings][6]
-
-In here, click on Users to access all the available users on your system.
-
-![Users settings in Ubuntu][7]
-
-You can select any user you want, including your main admin account. You need to unlock the users first and then click the password field.
-
-![Changing user password in Ubuntu][8]
-
-You’ll be asked to set the password. If you are changing your own password, you’ll have to enter your current password as well.
-
-![Changing user password in Ubuntu][9]
-
-Once done, click on the Change button on the top. That’s it. You have successfully changed user password in Ubuntu.
-
-I hope this quick little tip helped you to change user password in Ubuntu. If you have questions or suggestions, please leave a comment below.
-
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/change-password-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.ubuntu.com/
-[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-password-ubuntu-linux.png?resize=800%2C450&ssl=1
-[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-linux-1.jpg?resize=800%2C253&ssl=1
-[4]: https://itsfoss.com/how-to-hack-ubuntu-password/
-[5]: https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/
-[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-2.jpg?resize=800%2C484&ssl=1
-[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-3.jpg?resize=800%2C488&ssl=1
-[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-4.jpg?resize=800%2C555&ssl=1
-[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-1.jpg?ssl=1
-[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-password-ubuntu-linux.png?fit=800%2C450&ssl=1
diff --git a/sources/tech/20190218 Emoji-Log- A new way to write Git commit messages.md b/sources/tech/20190218 Emoji-Log- A new way to write Git commit messages.md
new file mode 100644
index 0000000000..e821337a60
--- /dev/null
+++ b/sources/tech/20190218 Emoji-Log- A new way to write Git commit messages.md
@@ -0,0 +1,176 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Emoji-Log: A new way to write Git commit messages)
+[#]: via: (https://opensource.com/article/19/2/emoji-log-git-commit-messages)
+[#]: author: (Ahmad Awais https://opensource.com/users/mrahmadawais)
+
+Emoji-Log: A new way to write Git commit messages
+======
+Add context to your commits with Emoji-Log.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/emoji_tech_keyboard.jpg?itok=ncBNKZFl)
+
+I'm a full-time open source developer—or, as I like to call it, an 🎩 open sourcerer. I've been working with open source software for over a decade and [built hundreds][1] of open source software applications.
+
+I also am a big fan of the Don't Repeat Yourself (DRY) philosophy and believe writing better Git commit messages—ones that are contextual enough to serve as a changelog for your open source software—is an important component of DRY. One of the many workflows I've written is [Emoji-Log][2], a straightforward, open source Git commit log standard. It improves the developer experience (DX) by using emoji to create better Git commit messages.
+
+I've used Emoji-Log while building the [VSCode Tips & Tricks repo][3], my 🦄 [Shades of Purple VSCode theme repo][4], and even an [automatic changelog][5] that looks beautiful.
+
+### Emoji-Log's philosophy
+
+I like emoji (which is, in fact, the plural of emoji). I like 'em a lot. Programming, code, geeks/nerds, open source… all of that is inherently dull and sometimes boring. Emoji help me add colors and emotions to the mix. There's nothing wrong with wanting to attach feelings to the 2D, flat, text-based world of code.
+
+Instead of memorizing [hundreds of emoji][6], I've learned it's better to keep the categories small and general. Here's the philosophy that guides writing commit messages with Emoji-Log:
+
+ 1. **Imperative**
+ * Make your Git commit messages imperative.
+ * Write commit message like you're giving an order.
+ * e.g., Use ✅ **Add** instead of ❌ **Added**
+ * e.g., Use ✅ **Create** instead of ❌ **Creating**
+ 2. **Rules**
+ * A small number of categories are easy to memorize.
+ * Nothing more, nothing less
+ * e.g. **📦 NEW** , **👌 IMPROVE** , **🐛 FIX** , **📖 DOC** , **🚀 RELEASE** , and **✅ TEST**
+ 3. **Actions**
+ * Make Git commits based on actions you take.
+ * Use a good editor like [VSCode][7] to commit the right files with commit messages.
+
+
+
+### Writing commit messages
+
+Use only the following Git commit messages. The simple and small footprint is the key to Emoji-Logo.
+
+ 1. **📦 NEW: IMPERATIVE_MESSAGE**
+ * Use when you add something entirely new.
+ * e.g., **📦 NEW: Add Git ignore file**
+ 2. **👌 IMPROVE: IMPERATIVE_MESSAGE**
+ * Use when you improve/enhance piece of code like refactoring etc.
+ * e.g., **👌 IMPROVE: Remote IP API Function**
+ 3. **🐛 FIX: IMPERATIVE_MESSAGE**
+ * Use when you fix a bug. Need I say more?
+ * e.g., **🐛 FIX: Case converter**
+ 4. **📖 DOC: IMPERATIVE_MESSAGE**
+ * Use when you add documentation, like README.md or even inline docs.
+ * e.g., **📖 DOC: API Interface Tutorial**
+ 5. **🚀 RELEASE: IMPERATIVE_MESSAGE**
+ * Use when you release a new version. e.g., **🚀 RELEASE: Version 2.0.0**
+ 6. **✅ TEST: IMPERATIVE_MESSAGE**
+ * Use when you release a new version.
+ * e.g., **✅ TEST: Mock User Login/Logout**
+
+
+
+That's it for now. Nothing more, nothing less.
+
+### Emoji-Log functions
+
+For quick prototyping, I have made the following functions that you can add to your **.bashrc** / **.zshrc** files to use Emoji-Log quickly.
+
+```
+#.# Better Git Logs.
+
+### Using EMOJI-LOG (https://github.com/ahmadawais/Emoji-Log).
+
+
+
+# Git Commit, Add all and Push — in one step.
+
+function gcap() {
+ git add . && git commit -m "$*" && git push
+}
+
+# NEW.
+function gnew() {
+ gcap "📦 NEW: $@"
+}
+
+# IMPROVE.
+function gimp() {
+ gcap "👌 IMPROVE: $@"
+}
+
+# FIX.
+function gfix() {
+ gcap "🐛 FIX: $@"
+}
+
+# RELEASE.
+function grlz() {
+ gcap "🚀 RELEASE: $@"
+}
+
+# DOC.
+function gdoc() {
+ gcap "📖 DOC: $@"
+}
+
+# TEST.
+function gtst() {
+ gcap "✅ TEST: $@"
+}
+```
+
+To install these functions for the [fish shell][8], run the following commands:
+
+```
+function gcap; git add .; and git commit -m "$argv"; and git push; end;
+function gnew; gcap "📦 NEW: $argv"; end
+function gimp; gcap "👌 IMPROVE: $argv"; end;
+function gfix; gcap "🐛 FIX: $argv"; end;
+function grlz; gcap "🚀 RELEASE: $argv"; end;
+function gdoc; gcap "📖 DOC: $argv"; end;
+function gtst; gcap "✅ TEST: $argv"; end;
+funcsave gcap
+funcsave gnew
+funcsave gimp
+funcsave gfix
+funcsave grlz
+funcsave gdoc
+funcsave gtst
+```
+
+If you prefer, you can paste these aliases directly in your **~/.gitconfig** file:
+
+```
+# Git Commit, Add all and Push — in one step.
+cap = "!f() { git add .; git commit -m \"$@\"; git push; }; f"
+
+# NEW.
+new = "!f() { git cap \"📦 NEW: $@\"; }; f"
+# IMPROVE.
+imp = "!f() { git cap \"👌 IMPROVE: $@\"; }; f"
+# FIX.
+fix = "!f() { git cap \"🐛 FIX: $@\"; }; f"
+# RELEASE.
+rlz = "!f() { git cap \"🚀 RELEASE: $@\"; }; f"
+# DOC.
+doc = "!f() { git cap \"📖 DOC: $@\"; }; f"
+# TEST.
+tst = "!f() { git cap \"✅ TEST: $@\"; }; f"
+```
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/emoji-log-git-commit-messages
+
+作者:[Ahmad Awais][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/mrahmadawais
+[b]: https://github.com/lujun9972
+[1]: https://github.com/ahmadawais
+[2]: https://github.com/ahmadawais/Emoji-Log/
+[3]: https://github.com/ahmadawais/VSCode-Tips-Tricks
+[4]: https://github.com/ahmadawais/shades-of-purple-vscode/commits/master
+[5]: https://github.com/ahmadawais/shades-of-purple-vscode/blob/master/CHANGELOG.md
+[6]: https://gitmoji.carloscuesta.me/
+[7]: https://VSCode.pro
+[8]: https://en.wikipedia.org/wiki/Friendly_interactive_shell
diff --git a/sources/tech/20190218 Get started and organized with TiddlyWiki.md b/sources/tech/20190218 Get started and organized with TiddlyWiki.md
new file mode 100644
index 0000000000..25d6883a3a
--- /dev/null
+++ b/sources/tech/20190218 Get started and organized with TiddlyWiki.md
@@ -0,0 +1,156 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Get started and organized with TiddlyWiki)
+[#]: via: (https://opensource.com/article/19/2/tiddlywiki)
+[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
+
+Get started and organized with TiddlyWiki
+======
+Take notes, manage tasks, keep a journal, and otherwise stay organized with TiddlyWiki.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/life_paperclips.png?itok=j48op49T)
+
+When you think of the word wiki, chances are the first thing that comes to mind is Wikipedia. That's not a surprise, considering that Wikipedia did help put the concept of the wiki into the popular consciousness. Wikis, which are websites you can edit, are great tools for collaborating and organizing. But wikis usually require a lot of digital plumbing and a bit of care to use and maintain. All of that's overkill for personal use.
+
+While you can install [desktop wikis][1] on your computer, they're not as portable as some people want or need them to be.
+
+Enter [TiddlyWiki][2], the brainchild of British software developer [Jeremy Ruston][3]. Not only is it great for organizing yourself, but it's also easy to use and very portable.
+
+Let's take a quick look at the basics of using TiddlyWiki to get organized.
+
+### What's TiddlyWiki?
+
+TiddlyWiki isn't software quite as you know it. It's a large web page (consisting of HTML and a lot of JavaScript) that weighs in at around 2MB. You can edit and save the file in a web browser.
+
+It's very flexible. You can use TiddlyWiki to take notes, manage task lists, save bookmarks, publish a blog or website, create a presentation, and a lot more. And people have used it to do some [interesting things][4].
+
+As I mentioned, TiddlyWiki is very portable. You can put it in a folder in, say, [Nextcloud][5] and share a TiddlyWiki between computers and mobile devices. Or, you can carry it around on a flash drive.
+
+### Getting started
+
+Head over to the [TiddlyWiki website][6] and download the file empty.html. Rename that file to something a bit more meaningful and descriptive. Then open it in a web browser.
+
+You'll see the Getting Started tiddler (more on tiddlers in a moment):
+
+![](https://opensource.com/sites/default/files/uploads/tiddlywiki-get-started.png)
+
+Click the pencil icon in the top-right corner and change the information. Then, click the checkmark icon to save the TiddlyWiki.
+
+#### A note about saving your TiddlyWiki
+
+Since your web browser thinks a TiddlyWiki is a file, it'll save your TiddlyWiki to the folder on your computer where downloads go. And when it does that, your browser will probably save it with a file name like tiddlywiki(1).html. You don't want that.
+
+If you're using Chrome or Chromium, set the browser to ask you where to save files by selecting **Settings** , then clicking **Show advanced settings** on the Settings page. Then click the **Ask where to save each file before downloading** option.
+
+If you're using Firefox, click on the stacker menu in the top-right corner and select **Options**. Find the **Downloads** option, and click **Always ask you where to save files**.
+
+### Working with TiddlyWiki
+
+You can use TiddlyWiki for just about anything. And people have done just that. But instead of jumping into the scary depths, let's look at the basics of using TiddlyWiki.
+
+Since I prefer to focus on specific tasks with my tools, I'm going to look at using TiddlyWiki for:
+
+ * Taking notes
+ * Managing tasks
+ * Keeping a journal
+
+
+
+#### Taking notes
+
+To get going, create a new tiddler, which is an individual page within TiddlyWiki. To be honest, I don't know how many tiddlers a single TiddlyWiki can contain before it slows down, but I wouldn't be surprised if it's in the hundreds or thousands.
+
+Create a new tiddler by clicking the **+** icon.
+
+![](https://opensource.com/sites/default/files/uploads/tiddlywiki-new-tiddler.png)
+
+Give your tiddler a name, like Notes for netbooks essay. You can also type a tag in the **Tag name** field—doing that will let you filter your tiddlers so you can find them quickly when you have a lot of them. Then start typing.
+
+You can format your tiddler using TiddlyWiki's markup. You can also use the formatting toolbar to add character formatting, lists, quotes, headings, images, and links.
+
+When you're done, click the checkmark icon to save the tiddler.
+
+![](https://opensource.com/sites/default/files/uploads/tiddlywiki-example-tiddler.png)
+
+#### Creating a task list
+
+Again, create a new tiddler. Give it a name like Tasks - 4 May 2019 and type Tasks in the **Tag name** field.
+
+From there, type your tasks—one line for each. Put an asterisk (*) in front of each one to create a bullet list. Then save your list.
+
+![](https://opensource.com/sites/default/files/uploads/tiddlywiki-task-list.png)
+
+To mark off a completed task, edit the tiddler, highlight the task, and click the Strikethrough button on the toolbar.
+
+![](https://opensource.com/sites/default/files/uploads/tiddlywiki-complete-task.png)
+
+That's a pretty simple, and frankly lame, way to deal with tasks. If you're looking for something more visually appealing, [watch this video][7]. This method requires a bit more setup, but you also get nifty checkboxes that you can click when you finish a task.
+
+#### Keeping a journal
+
+If you want to keep a journal, first click the **Tools** tab and select the **New journal** option. That puts the **Create a new journal tiddler** button on the main TiddlyWiki toolbar.
+
+Click that button and you'll notice that the journal tiddler has today's date as its name and has been tagged **Journal**.
+
+As with any other tiddler, type your text and save the tiddler when you're done.
+
+### The power of plugins
+
+What if you want or need more from TiddlyWiki? You can use [plugins][8] to extend and customize TiddlyWiki's capabilities. You can change its appearance, add [editors][9] and [support for Markdown][10], turn TiddlyWiki into a personal [kanban board][11] (à la [WeKan][12]), add a more powerful search engine, and more.
+
+TiddlyWiki has a plugin library, which you can access from its control panel. There's a [list of plugins][13] created by users, and [this toolmap][14] lists over 600 plugins, tips, and tricks.
+
+### One TiddlyWiki or several?
+
+You can load up your TiddlyWiki with everything you need to do. Eventually, though, it could get so full of tiddlers that it's difficult to easily find what you need to find, even with good tagging.
+
+An alternative to that is to have several TiddlyWiki files—for example, one for notes, one for tasks, one for outlines, one for journaling. Keeping track of those files could become a chore. The [desktop version][15] can help you better organize two or more TiddlyWiki files.
+
+![](https://opensource.com/sites/default/files/uploads/tiddlywiki-desktop.png)
+
+### Learning more
+
+I've only covered the basics of using TiddlyWiki. There is a lot you can do with it, even if (like me) you're using it just for simple tasks.
+
+Here are some good resources that can help you learn more about using TiddlyWiki:
+
+ * The [TiddlyWiki website][6] has a number of tutorials in the Learning section
+ * Francis Meetze has created [several videos][16] explaining how to do things with TiddlyWiki
+ * A [one-page][17] TiddlyWiki cheatsheet PDF
+ * [Five Steps to TiddlyWiki 5][18], which helps you get up and running with TiddlyWiki
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/tiddlywiki
+
+作者:[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/article/17/2/3-desktop-wikis
+[2]: http://tiddlywiki.com/
+[3]: https://jermolene.com/
+[4]: https://tiddlywiki.com/static/Examples.html
+[5]: https://nextcloud.com/
+[6]: http://www.tiddlywiki.com
+[7]: https://www.youtube.com/watch?v=mzoMhKx0j8g
+[8]: https://tiddlywiki.com/#Plugins
+[9]: https://tiddlywiki.com/plugins/tiddlywiki/codemirror/
+[10]: https://tiddlywiki.com/plugins/tiddlywiki/markdown/
+[11]: https://ibnishak.github.io/Tesseract/projects/tekan/Tekan.html
+[12]: https://opensource.com/article/17/12/wekan-manage-your-work
+[13]: https://tiddlywiki.com/#OfficialPlugins
+[14]: https://dynalist.io/d/zUP-nIWu2FFoXH-oM7L7d9DM
+[15]: https://github.com/Jermolene/TiddlyDesktop
+[16]: https://www.youtube.com/channel/UCCYN_nzlUKKMiTj5rerv2lQ/videos
+[17]: http://www.tcm.phy.cam.ac.uk/~mdt26/PWT/hints.pdf
+[18]: http://www.richshumaker.com/tw5/FiveStepsToTiddlyWiki5.htm
diff --git a/sources/tech/20190218 How To Restore Sudo Privileges To A User.md b/sources/tech/20190218 How To Restore Sudo Privileges To A User.md
new file mode 100644
index 0000000000..8e6f6db66f
--- /dev/null
+++ b/sources/tech/20190218 How To Restore Sudo Privileges To A User.md
@@ -0,0 +1,194 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How To Restore Sudo Privileges To A User)
+[#]: via: (https://www.ostechnix.com/how-to-restore-sudo-privileges-to-a-user/)
+[#]: author: (SK https://www.ostechnix.com/author/sk/)
+
+How To Restore Sudo Privileges To A User
+======
+
+![](https://www.ostechnix.com/wp-content/uploads/2019/02/restore-sudo-privileges-720x340.png)
+
+The other day I was testing how to [**add a regular user to sudo group and remove the given privileges**][1] to make him as a normal user again on Ubuntu. While testing, I removed my administrative user from the **‘sudo’ group**. As you already know, a user should be in sudo group to do any administrative tasks. But, I had only one super user and I already took out his sudo privileges. Whenever I run a command with sudo prefix, I encountered an error – “ **sk is not in the sudoers file. This incident will be reported** “. I can’t do any administrative tasks. I couldn’t switch to root user using ‘sudo su’ command. As you know already, root user is disabled by default in Ubuntu, so I can’t log in as root user either. Have you ever been in a situation like this? No worries! This brief tutorial explains how to restore sudo privileges to a user on Linux. I tested this on Ubuntu 18.04 system, but it might work on other Linux distributions as well.
+
+### Restore Sudo Privileges
+
+Boot your Linux system into recovery mode.
+
+To do so, restart your system and press and hold the **SHIFT** key while booting. You will see the grub boot menu. Choose **“Advanced options for Ubuntu”** from the boot menu list.
+
+![][3]
+
+In the next screen, choose **“recovery mode”** option and hit ENTER:
+
+![][4]
+
+Next, choose **“Drop to root shell prompt”** option and hit ENTER key:
+
+![][5]
+
+You’re now in recovery mode as root user.
+
+![][6]
+
+Type the following command to mount root (/) file system in read/write mode.
+
+```
+mount -o remount,rw /
+```
+
+Now, add the user that you removed from the sudo group.
+
+In my case, I am adding the user called ‘sk’ to the sudo group using the following command:
+
+```
+adduser sk sudo
+```
+
+![][7]
+
+Then, type **exit** to return back to the recovery menu. Select **Resume** to start your Ubuntu system.
+
+![][8]
+
+Press ENTER to continue to log-in normal mode:
+
+![][9]
+
+Now check if the sudo privileges have been restored.
+
+To do so, type the following command from the Terminal.
+
+```
+$ sudo -l -U sk
+```
+
+Sample output:
+
+```
+[sudo] password for sk:
+Matching Defaults entries for sk on ubuntuserver:
+env_reset, mail_badpass,
+secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
+
+User sk may run the following commands on ubuntuserver:
+(ALL : ALL) ALL
+```
+
+As you see in the above message, the user sk can run all commands with sudo prefix. Congratulations! You have successfully restored the sudo privileges to the user.
+
+#### There are also other possibilities for causing broken sudo
+
+Please note that I actually did it on purpose. I removed myself from the sudo group and fixed the broken sudo privileges as described above. Don’t do this if you have only one sudo user. And, this method will work only on systems that you have physical access. If it is remote server or vps, it is very difficult to fix it. You might require your hosting provider’s help.
+
+Also, there are two other possibilities for causing broken sudo.
+
+ * The /etc/sudoers file might have been altered.
+ * You or someone might have changed the permission of /etc/sudoers file.
+
+
+
+If you have done any one or all of the above mentioned things and ended up with broken sudo, try the following solutions.
+
+**Solution 1:**
+
+If you have altered the contents of /etc/sudoers file, go to the recovery mode as described earlier.
+
+Backup the existing /etc/sudoers file before making any changes.
+
+```
+cp /etc/sudoers /etc/sudoers.bak
+```
+
+Then, open /etc/sudoers file:
+
+```
+visudo
+```
+
+Make the changes in the file to look like this:
+
+```
+#
+# This file MUST be edited with the 'visudo' command as root.
+#
+# Please consider adding local content in /etc/sudoers.d/ instead of
+# directly modifying this file.
+#
+# See the man page for details on how to write a sudoers file.
+#
+Defaults env_reset
+Defaults mail_badpass
+Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
+
+# Host alias specification
+
+# User alias specification
+
+# Cmnd alias specification
+
+# User privilege specification
+root ALL=(ALL:ALL) ALL
+
+# Members of the admin group may gain root privileges
+%admin ALL=(ALL) ALL
+
+# Allow members of group sudo to execute any command
+%sudo ALL=(ALL:ALL) ALL
+
+# See sudoers(5) for more information on "#include" directives:
+
+#includedir /etc/sudoers.d
+```
+
+Once you modified the contents to reflect like this, press **CTRL+X** and **y** save and close the file.
+
+Finally, type ‘exit’ and select **Resume** to start your Ubuntu system to exit from the recovery mode and continue booting as normal user.
+
+Now, try to use run any command with sudo prefix to verify if the sudo privileges are restored.
+
+**Solution 2:**
+
+If you changed the permission of the /etc/sudoers file, this method will fix the broken sudo issue.
+
+From the recovery mode, run the following command to set the correct permission to /etc/sudoers file:
+
+```
+chmod 0440 /etc/sudoers
+```
+
+Once you set the proper permission to the file, type ‘exit’ and select **Resume** to start your Ubuntu system in normal mode. Finally, verify if you can able to run any sudo command.
+
+**Suggested read:**
+
+And, that’s all for now. Hope this was useful . More good stuffs to come. Stay tuned!
+
+Cheers!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/how-to-restore-sudo-privileges-to-a-user/
+
+作者:[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]: https://www.ostechnix.com/how-to-grant-and-remove-sudo-privileges-to-users-on-ubuntu/
+[2]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[3]: http://www.ostechnix.com/wp-content/uploads/2019/02/fix-broken-sudo-1.png
+[4]: http://www.ostechnix.com/wp-content/uploads/2019/02/fix-broken-sudo-2.png
+[5]: http://www.ostechnix.com/wp-content/uploads/2019/02/fix-broken-sudo-3.png
+[6]: http://www.ostechnix.com/wp-content/uploads/2019/02/fix-broken-sudo-4.png
+[7]: http://www.ostechnix.com/wp-content/uploads/2019/02/fix-broken-sudo-5-1.png
+[8]: http://www.ostechnix.com/wp-content/uploads/2019/02/fix-broken-sudo-6.png
+[9]: http://www.ostechnix.com/wp-content/uploads/2019/02/fix-broken-sudo-7.png
diff --git a/sources/tech/20190219 3 tools for viewing files at the command line.md b/sources/tech/20190219 3 tools for viewing files at the command line.md
deleted file mode 100644
index 1443d3bfa9..0000000000
--- a/sources/tech/20190219 3 tools for viewing files at the command line.md
+++ /dev/null
@@ -1,97 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (3 tools for viewing files at the command line)
-[#]: via: (https://opensource.com/article/19/2/view-files-command-line)
-[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
-
-3 tools for viewing files at the command line
-======
-Take a look at less, Antiword, and odt2txt, three utilities for viewing files in the terminal.
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/command_line_prompt.png?itok=wbGiJ_yg)
-
-I always say you don't need to use the command line to use Linux effectively—I know many Linux users who never crack open a terminal window and are quite happy. However, even though I don't consider myself a techie, I spend about 20% of my computing time at the command line, manipulating files, processing text, and using utilities.
-
-One thing I often do in a terminal window is viewing files, whether text or word processor files. Sometimes it's just easier to use a command line utility than to fire up a text editor or a word processor.
-
-Here are three of the utilities I use to view files at the command line.
-
-### less
-
-The beauty of [less][1] is that it's easy to use and it breaks the files you're viewing down into discrete chunks (or pages), which makes them easier to read. You use it to view text files at the command line, such as a README, an HTML file, a LaTeX file, or anything else in plaintext. I took a look at less in a [previous article][2].
-
-To use less, just type:
-
-```
-less file_name
-```
-
-![](https://opensource.com/sites/default/files/uploads/less.png)
-
-Scroll down through the file by pressing the spacebar or PgDn key on your keyboard. You can move up through a file by pressing the PgUp key. To stop viewing the file, press the Q key on your keyboard.
-
-### Antiword
-
-[Antiword][3] is great little utility that you can use to that can convert Word documents to plaintext. If you want, you can also convert them to [PostScript][4] or [PDF][5]. For this article, let's just stick with the conversion to text.
-
-Antiword can read and convert files created with versions of Word from 2.0 to 2003. It doesn't read DOCX files—if you try, Antiword displays an error message that what you're trying to read is a ZIP file. That's technically correct, but it's still frustrating.
-
-To view a Word document using Antiword, type the following command:
-
-```
-antiword file_name.doc
-```
-
-Antiword converts the document to text and displays it in the terminal window. Unfortunately, it doesn't break the document into pages in the terminal. You can, though, redirect Antiword's output to a utility like less or [more][6] to paginate it. Do that by typing the following command:
-
-```
-antiword file_name.doc | less
-```
-
-If you're new to the command line, the | is called a pipe. That's what does the redirection.
-
-![](https://opensource.com/sites/default/files/uploads/antiword.png)
-
-### odt2txt
-
-Being a good open source citizen, you'll want to use as many open formats as possible. For your word processing needs, you might deal with [ODT][7] files (used by such word processors as LibreOffice Writer and AbiWord) instead of Word files. Even if you don't, you might run into ODT files. And they're easy to view at the command line, even if you don't have Writer or AbiWord installed on your computer.
-
-How? With a little utility called [odt2txt][8]. As you've probably guessed, odt2txt converts an ODT file to plaintext. To use it, run the command:
-
-```
-odt2txt file_name.odt
-```
-
-Like Antiword, odt2txt converts the document to text and displays it in the terminal window. And, like Antiword, it doesn't page the document. Once again, though, you can pipe the output from odt2txt to a utility like less or more using the following command:
-
-```
-odt2txt file_name.odt | more
-```
-
-![](https://opensource.com/sites/default/files/uploads/odt2txt.png)
-
-Do you have a favorite utility for viewing files at the command line? Feel free to share it with the community by leaving a comment.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/2/view-files-command-line
-
-作者:[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://www.gnu.org/software/less/
-[2]: https://opensource.com/article/18/4/using-less-view-text-files-command-line
-[3]: http://www.winfield.demon.nl/
-[4]: http://en.wikipedia.org/wiki/PostScript
-[5]: http://en.wikipedia.org/wiki/Portable_Document_Format
-[6]: https://opensource.com/article/19/1/more-text-files-linux
-[7]: http://en.wikipedia.org/wiki/OpenDocument
-[8]: https://github.com/dstosberg/odt2txt
diff --git a/sources/tech/20190219 4 secrets management tools for Git encryption.md b/sources/tech/20190219 4 secrets management tools for Git encryption.md
new file mode 100644
index 0000000000..303bc0ef87
--- /dev/null
+++ b/sources/tech/20190219 4 secrets management tools for Git encryption.md
@@ -0,0 +1,161 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (4 secrets management tools for Git encryption)
+[#]: via: (https://opensource.com/article/19/2/secrets-management-tools-git)
+[#]: author: (Austin Dewey https://opensource.com/users/adewey)
+
+4 secrets management tools for Git encryption
+======
+See how Git-crypt, BlackBox, SOPS, and Transcrypt stack up for storing secrets in Git.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003601_05_mech_osyearbook2016_security_cc.png?itok=3V07Lpko)
+
+There are a lot of great open source tools out there for storing secrets in Git. It can be hard to determine the right one for you and your organization—it depends on your use cases and requirements. To help you compare and choose, we'll look at four of the most popular open source tools for secrets management and see how they stack up against each other:
+
++ [Git-crypt](https://github.com/AGWA/git-crypt)
++ [BlackBox](https://github.com/StackExchange/blackbox)
++ [SOPS](https://github.com/mozilla/sops)
++ [Transcrypt](https://github.com/elasticdog/transcrypt)
+
+
+We won't review larger solutions like HashiCorp Vault. A production-ready Vault can be a rather large hurdle, especially if your organization is just getting started with secrets management. The tools above are easy to use and set up quickly.
+
+### Encryption types
+
+These secrets management tools use GNU Privacy Guard ([GPG][1]), symmetric key encryption, and/or cloud key services.
+
+ * GPG-based tools require users to create a GPG keypair. The public key is used to encrypt and is shared with other users, while the private key is used to decrypt and is known by only one user.
+ * Symmetric key tools are password-based and work when given the correct password.
+ * Cloud key services—Amazon Key Management Service (KMS), Google Cloud KMS, and Azure Key Vault-based tools—allow integration with services from cloud providers.
+
+
+
+The encryption types these secrets management tools use are:
+| | GPG | Symmetric key | Amazon KMS | Google KMS | Azure Key Vault |
+| Git-crypt | X | X | | | |
+| BlackBox | X | | | | |
+| SOPS | X | | X | X | X |
+| Transcrypt | | X | | | |
+
+As you can see, Git-crypt and SOPS use more than one encryption basis. This means Git-crypt can achieve encryption by using GPG OR a symmetric key, and SOPS can use GPG OR one of the cloud services.
+
+### Goals
+
+These tools have similar goals:
+
+| | Transparency with Git | Whole-file encryption | Partial-file encryption |
+| Git-crypt | X | X | |
+| BlackBox | X | X | |
+| SOPS | | X | X |
+| Transcrypt | X | X | |
+
+All but SOPS are transparent with Git, which means they have built-in mechanisms to ensure that files in source control are encrypted without much effort from users. They help prevent a **git push** from accidentally pushing plaintext secrets to Git.
+
+At this point, you might be wondering, "Why is SOPS here if it doesn't encrypt transparently with Git? Isn't this a post about Git encryption tools?" The reason is because of how it handles key-value-based files, such as YAML and JSON. When encrypting these types of files, SOPS will leave the keys unencrypted but will encrypt the values. There are often cases, especially in configuration management, where these types of files need to be encrypted in Git, but it would also be convenient to see what kind of information they contain. While SOPS does not provide native Git transparency, tools like [git-secrets][2] can be used alongside SOPS to help ensure plaintext secrets are not pushed to Git.
+
+Finally, all of these tools support whole-file encryption, in which secrets files are encrypted in their entirety.
+
+### Workflows and differences
+
+None of these tools are particularly difficult to use, but they all have quirks and operational challenges to consider.
+
+#### GPG
+
+The basic workflow for a GPG-based tool is:
+
+ 1. Initialize the repository with the encryption tool
+ 2. Create GPG keys for users that are allowed to manage secret files
+ 3. Add the corresponding public keys to the tool
+ 4. Designate the files that should be treated as "secret"
+ 5. Encrypt the files using the tool
+ 6. Repeat steps 2, 3, and 5 for each new user that is granted permission
+ 7. To revoke a user, remove the user and repeat step 5
+
+
+
+In theory, this workflow is simple. One operational issue is GPG key maintenance. Your team will need to back up its GPG keys to prevent a lock-out scenario if GPG keys are accidentally deleted. If you are using the tool for automation, you will also need to consider who will be responsible for creating and maintaining keys for that service. Additionally, if you need to add, remove, or rotate a key, you'll need to re-encrypt each file for the changes to take effect.
+
+Advantages and disadvantages of the GPG-based tools include:
+
+ * Git-crypt cannot remove GPG users natively, which means step 7 above is not easy to do. There are workarounds available, but it's not a built-in feature.
+ * Git-crypt will transparently perform step 5 above on a **git push** —even when new users are added.
+ * BlackBox provides a **blackbox_update_all_files** command, which can perform step 5 by re-encrypting all secret files in one command. This comes in handy in key rotation and adding/removing GPG keys, where all files need to be re-encrypted.
+ * SOPS makes key rotation and adding/removing GPG keys the most difficult, as it requires each file to be manually re-encrypted.
+ * BlackBox has a **blackbox_list_admins** command that returns the email address that corresponds with registered users' GPG keys. This makes it easier to discern who has access to the secrets versus trying to map plain GPG fingerprints.
+
+
+
+#### Cloud key services
+
+Here is a sample workflow using SOPS with Amazon KMS:
+
+ 1. Create identity and access management (IAM) entities
+ 2. Create KMS master key
+ 3. Grant IAM entities access to the master key
+ 4. Add the master key to each secret file with SOPS and encrypt the file (adding keys and encrypting is usually a one-step process with SOPS)
+ 5. Re-encrypt when adding or removing master keys
+
+
+
+Of these four tools, SOPS is the only one that allows users to configure encryption with a cloud-based key service. Cloud key services ease much of the operational burden that GPG-based solutions carry. Take Amazon KMS, for example: The master key is added to SOPS and access to secret files is controlled through IAM policies. Adding and removing users is as simple as granting or revoking permission with IAM, meaning secret files do not need to be re-encrypted when changing permissions, since nothing changed from SOPS's perspective. This solution does have its own set of operational challenges, however. Each member of the team must have an AWS account before they can access secret files. Also, admins must configure and maintain the IAM policies and KMS master key(s).
+
+#### Symmetric key encryption
+
+The workflow for symmetric key-based tools is probably the simplest:
+
+ 1. Initialize the repository with the encryption tool
+ 2. Designate files that should be treated as "secret"
+ 3. **git push** to transparently encrypt the files
+ 4. Share the symmetric key with other users who need access
+ 5. Rotate the key each time a user is revoked access
+
+
+
+Git-crypt and Transcrypt both provide a complex password as the symmetric key. The operational challenges are to find a secure way to share the symmetric key and to be sure to rotate the key each time a user is removed.
+
+Here are a few differences between Git-crypt and Transcrypt, our symmetric key-compatible tools:
+
+ * Git-crypt is compatible with both GPG and symmetric key encryption
+ * Git-crypt doesn't support symmetric key rotation, so you can't complete step 5 if you use it with a symmetric key
+ * Transcrypt provides a convenient **\--rekey** command for key rotation
+
+
+
+### Other features
+
+Other features and characteristics of the tools include:
+
+| | Editor-in-place | Auditing | Repo-level permission | File-level permission |
+| Git-crypt | | | X | |
+| BlackBox | X | | X | |
+| SOPS | X | X | | X |
+| Transcrypt | | | X | |
+
+Both BlackBox and SOPS feature an "editor-in-place" tool, which decrypts the file and opens a text editor specified by the **$EDITOR** environment variable. This enables the user to make in-place edits to the file before it is saved and re-encrypted, so users can modify secret files without requiring them to be "decrypted in place" first.
+
+SOPS is the only tool that provides an auditing feature. This feature tracks and monitors SOPS usage by forwarding events to a database. It requires a certain amount of setup, so check out SOPS's [README][3] for more information.
+
+Git-crypt, BlackBox, and Transcrypt handle access at the repo level, meaning that if you can view one decrypted file, you can view them all. Depending on your use case, this is either a feature or a misfeature. SOPS handles permissions at the file level, meaning just because users can view one file, they can't necessarily view other files in the repo.
+
+### For more information
+
+Hopefully, this high-level overview of four open source secrets management tools will help you make an educated decision about the right tool for you. For more information on the tools, please check out their GitHub pages (linked at the top of this article).
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/secrets-management-tools-git
+
+作者:[Austin Dewey][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/adewey
+[b]: https://github.com/lujun9972
+[1]: https://www.gnupg.org/
+[2]: https://github.com/awslabs/git-secrets
+[3]: https://github.com/mozilla/sops/blob/master/README.rst#auditing
diff --git a/sources/tech/20190220 An Automated Way To Install Essential Applications On Ubuntu.md b/sources/tech/20190220 An Automated Way To Install Essential Applications On Ubuntu.md
new file mode 100644
index 0000000000..719511ce27
--- /dev/null
+++ b/sources/tech/20190220 An Automated Way To Install Essential Applications On Ubuntu.md
@@ -0,0 +1,135 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (An Automated Way To Install Essential Applications On Ubuntu)
+[#]: via: (https://www.ostechnix.com/an-automated-way-to-install-essential-applications-on-ubuntu/)
+[#]: author: (SK https://www.ostechnix.com/author/sk/)
+
+An Automated Way To Install Essential Applications On Ubuntu
+======
+![](https://www.ostechnix.com/wp-content/uploads/2019/02/alfred-720x340.png)
+
+The default Ubuntu installation doesn’t come with all essential applications pre-installed . You may need to spend few hours on Internet or ask any Linux user’s help to find and install the necessary applications for your Ubuntu box. If you’re newbie, then you certainly need to spend more time to learn how to search and install applications either from command line (using apt-get or dpkg) or from the Ubuntu software center. Some users, especially newbies, might want to easily and quickly install every applications they like. If you’re one of them, no worries. In this guide, we will see how to install essential applications on Ubuntu using a simple command line utility called **“Alfred”**.
+
+Alfred is a free, open source script written in **Python** programming language. It uses **Zenity** to create a simple graphical interface that allows the users to easily select and install the applications of their choice with a few mouse clicks. You need not to spend hours to search for all essential applications, PPAs, debs, AppImage, snaps or flatpaks. Alfred brings all common applications, tools and utilities under one-roof and automatically installs the selected applications. If you’re a newbie who is recently migrated from Windows to Ubuntu Linux, Alfred helps you to do an unattended software installation on a freshly installed Ubuntu system, without much user intervention. Please be mindful that there is also a Mac OS app with similar name, but both serves different purposes.
+
+### Installing Alfred On Ubuntu
+
+Alfred installation is easy! Just download the script and launch it. It is that simple.
+
+```
+$ wget https://raw.githubusercontent.com/derkomai/alfred/master/alfred.py
+
+$ python3 alfred.py
+```
+
+Alternatively, download the script using wget as shown above and just move the **alfred.py** file to your $PATH:
+
+```
+$ sudo cp alfred.py /usr/local/bin/alfred
+```
+
+Make it executable:
+
+```
+$ sudo chmod +x /usr/local/bin/alfred
+```
+
+And, launch it using command:
+
+```
+$ alfred
+```
+
+### Easily And Quickly Install Essential Applications On Ubuntu Using Alfred Script
+
+Launch Alfred script as described in the installation section above. This is how Alfred default interface looks like.
+
+![][2]
+
+As you can see, Alfred lists a lot of most commonly used application types such as,
+
+ * Web browsers,
+ * Mail clients,
+ * Messengers,
+ * Cloud storage clients,
+ * Hardware drivers,
+ * Codecs,
+ * Developer tools,
+ * Android,
+ * Text editors,
+ * Git,
+ * Kernel update tool,
+ * Audio/video players,
+ * Screenshot tools,
+ * Screen recorders,
+ * Video encoders,
+ * Streaming apps,
+ * 3D modelling and animation tools,
+ * Image viewers and editors,
+ * CAD software,
+ * Pdf tools,
+ * Gaming emulators,
+ * Disk management tools,
+ * Encryption tools,
+ * Password managers,
+ * Archive tools,
+ * Ftp software,
+ * System resource monitors,
+ * Application launchers and many.
+
+
+
+You can pick any one or multiple applications of your choice and install them at once. Here, I am going to install the ‘Developer bundle’, hence I chose it and click OK button.
+
+![][3]
+
+Now, Alfred script will automatically add the necessary repositories, ppas on your Ubuntu system and start installing the selected applications.
+
+![][4]
+
+Once the installation is completed, you will see the following message.
+
+![][5]
+
+Congratulations! The selected packages have been installed.
+
+You can [**check recently installed applications**][6] on Ubuntu using the following command:
+
+```
+$ grep " install " /var/log/dpkg.log
+```
+
+You may need to reboot your system in-order to use some of the installed applications. Similarly, you can install any applications from the list without much hazzle.
+
+For your information, there is also a similar script named **post_install.sh** written by different developer. It is exactly same as Alfred, but provides a few different set of applications. Please check the following link for more details.
+
+These two scripts allows the lazy users, especially newbies, to be able to easily and fastly install most common apps, tools, updates, utilities they want to use in their Ubuntu Linux with few mouse clicks away, and stop depending on the help of official or non-official documentations.
+
+And, that’s all for now. Hope this was useful. More good stuffs to come. Stay tuned!
+
+Cheers!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/an-automated-way-to-install-essential-applications-on-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]: http://www.ostechnix.com/wp-content/uploads/2019/02/alfred-1.png
+[3]: http://www.ostechnix.com/wp-content/uploads/2019/02/alfred-2.png
+[4]: http://www.ostechnix.com/wp-content/uploads/2019/02/alfred-4.png
+[5]: http://www.ostechnix.com/wp-content/uploads/2019/02/alfred-5-1.png
+[6]: https://www.ostechnix.com/list-installed-packages-sorted-installation-date-linux/
diff --git a/sources/tech/20190220 Automation evolution.md b/sources/tech/20190220 Automation evolution.md
new file mode 100644
index 0000000000..09167521c6
--- /dev/null
+++ b/sources/tech/20190220 Automation evolution.md
@@ -0,0 +1,81 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Automation evolution)
+[#]: via: (https://leancrew.com/all-this/2019/02/automation-evolution/)
+[#]: author: (Dr.Drang https://leancrew.com)
+
+Automation evolution
+======
+
+In my experience, scripts and macros almost never end up the way they start. This shouldn’t be a surprise. Just as spending time performing a particular task makes you realize it should be automated, spending time working with the automation makes you realize how it can be improved. Contra [XKCD][3], this doesn’t mean the decision to automate a task puts you on an endless treadmill of tweaking that’s never worth the time you invest. It means you’re continuing to think about how you do things and how your methods can be improved. I have an example that I’ve been working on for years.
+
+Two of the essential but dull parts of my job involve sending out invoices to clients and following up when those invoices aren’t paid on time. I’ve gradually built up a system to handle both of these interrelated duties. I’ve written about certain details before, but here I want to talk about how and why the system has evolved.
+
+It started with [TextExpander][4] snippets. One was for the text of the email that accompanied the invoice when it was first sent, and it looked like this (albeit less terse):
+
+```
+Attached is invoice A for $B on project C. Payment is due on D.
+```
+
+where the A, B, C, and D were [fill-in fields][5]. Similarly, there was a snippet for the followup emails.
+
+```
+The attached invoice, X for $Y on project Z, is still outstanding
+and is now E days old. Pay up.
+```
+
+While these snippets was certainly better than typing this boilerplate out again and again, they weren’t using the computer for what it’s good at: looking things up and calculating. The invoices are PDFs that came out of my company’s accounting system and contain the information for X, Y, Z, and D. The age of the invoice, E, can be calculated from D and the current date.
+
+So after a month or two of using the snippets, I wrote an invoicing script in Python that read the invoice PDF and created an email message with all of the parts filled in. It also added a subject line and used a project database to look up the client’s email address to put in the To field. A similar script created a dunning email message. Both of these scripts could be run from the Terminal and took the invoice PDF as their argument, e.g.,
+
+```
+invoice 12345.pdf
+```
+
+and
+
+```
+dun 12345.pdf
+```
+
+I should mention that these scripts created the email messages, but they didn’t send them. Sometimes I need to add an extra sentence or two to handle particular situations, and these scripts stopped short of sending so I could do that.
+
+It didn’t take very long for me to realize that opening a Terminal window just to run a single command was itself a waste of time. I used Automator to add Quick Action workflows that run the `invoice` and `dun` scripts to the Services menu. That allowed me to run the scripts by right-clicking on an invoice PDF file in the Finder.
+
+This system lasted quite a while. Eventually, though, I decided it was foolish to rely on my memory (or periodic checking of my outstanding invoices) to decide when to send out the followup emails on unpaid bills. I added a section to the `invoice` script that created a reminder along with the invoicing email. The reminder went in the Invoices list of the Reminders app and was given a due date of the first Tuesday at least 45 days after the invoice date. My invoices are net 30, so 45 days seemed like a good starting time for followups. And rather than having the reminder pop up on any day of the week, I set it to Tuesday—early in the week but unlikely to be on a holiday.1
+
+Changing the `invoice` script changed the behavior of the Services menu item that called it; I didn’t have to make any changes in Automator.
+
+This system was the state of the art until it hit me that I could write a script that checked Reminders for every invoice that was past due and run the `dun` script on all of them, creating a series of followup emails in one fell swoop. I wrote this script as a combination of Python and AppleScript and embedded it in a [Keyboard Maestro][6] macro. With this macro in place, I no longer had to hunt for the invoices to right-click on.
+
+A couple of weeks ago, after reading Federico Viticci’s article on [using a Mac from iOS][7], I began thinking about the hole in my followup system: I have to be at my Mac to run Keyboard Maestro. What if I’m traveling on Tuesday and want to send out followup emails from my iPhone or iPad? OK, sure, I could use Screens to connect to the Mac and run the Keyboard Maestro macro that way, but that’s very slow and clumsy over a cellular network connection, especially when trying to manipulate windows on a 27″ iMac screen as viewed through an iPhone-sized keyhole.
+
+The obvious solution, which wasn’t obvious to me until I’d thought of and rejected a few other ideas, was to change the `dun` script to create and save the followup email. Saving the email puts it in the Drafts folder, which I can get at from all of my devices. I also changed the Keyboard Maestro macro that executes the `dun` script on every overdue invoice to run every Tuesday morning at 5:00 am. When the reminders pop up later in the day, the emails are already written and waiting for me in the Drafts folder.
+
+Yesterday was the first “live” test of the new system. I was in an airport restaurant—nothing but the best cuisine for me—when my watch buzzed with reminders for two overdue invoices. I pulled out my phone, opened Mail, and there were the emails, waiting to be sent. In this case, I didn’t have to edit the messages before sending, but it wouldn’t have been a big deal if I had—no more difficult than writing any other email from my phone.
+
+Am I done with this? History suggests I’m not, and I’m OK with that. By getting rid of more scutwork, I’ve made myself better at following up on old invoices, and my average time-to-collection has improved. Even XKCD would think that’s worth the effort.
+
+--------------------------------------------------------------------------------
+
+via: https://leancrew.com/all-this/2019/02/automation-evolution/
+
+作者:[Dr.Drang][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://leancrew.com
+[b]: https://github.com/lujun9972
+[1]: https://leancrew.com/all-this/2019/02/regex-groups-and-numerals/
+[2]: https://leancrew.com/all-this/2019/02/transparency/
+[3]: https://xkcd.com/1319/
+[4]: https://textexpander.com/
+[5]: https://textexpander.com/help/desktop/fillins.html
+[6]: https://www.keyboardmaestro.com/main/
+[7]: https://www.macstories.net/ipad-diaries/ipad-diaries-using-a-mac-from-ios-part-1-finder-folders-siri-shortcuts-and-app-windows-with-keyboard-maestro/
diff --git a/sources/tech/20190220 Infrastructure monitoring- Defense against surprise downtime.md b/sources/tech/20190220 Infrastructure monitoring- Defense against surprise downtime.md
new file mode 100644
index 0000000000..d71c3c521b
--- /dev/null
+++ b/sources/tech/20190220 Infrastructure monitoring- Defense against surprise downtime.md
@@ -0,0 +1,126 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Infrastructure monitoring: Defense against surprise downtime)
+[#]: via: (https://opensource.com/article/19/2/infrastructure-monitoring)
+[#]: author: (Abhishek Tamrakar https://opensource.com/users/tamrakar)
+
+Infrastructure monitoring: Defense against surprise downtime
+======
+A strong monitoring and alert system based on open source tools prevents problems before they affect your infrastructure.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/analytics-graphs-charts.png?itok=sersoqbV)
+
+Infrastructure monitoring is an integral part of infrastructure management. It is an IT manager's first line of defense against surprise downtime. Severe issues can inject considerable downtime to live infrastructure, sometimes causing heavy loss of money and material.
+
+Monitoring collects time-series data from your infrastructure so it can be analyzed to predict upcoming issues with the infrastructure and its underlying components. This gives the IT manager or support staff time to prepare and apply a resolution before a problem occurs.
+
+A good monitoring system provides:
+
+ 1. Measurement of the infrastructure's performance over time
+ 2. Node-level analysis and alerts
+ 3. Network-level analysis and alerts
+ 4. Downtime analysis and alerts
+ 5. Answers to the 5 W's of incident management and root cause analysis (RCA):
+ * What was the actual issue?
+ * When did it happen?
+ * Why did it happen?
+ * What was the downtime?
+ * What needs to be done to avoid it in the future?
+
+
+
+### Building a strong monitoring system
+
+There are a number of tools available that can build a viable and strong monitoring system. The only decision to make is which to use; your answer lies in what you want to achieve with monitoring as well as various financial and business factors you must consider.
+
+While some monitoring tools are proprietary, many open source tools, either unmanaged or community-managed software, will do the job even better than the closed source options.
+
+In this article, I will focus on open source tools and how to use them to create a strong monitoring architecture.
+
+### Log collection and analysis
+
+To say "logs are helpful" would be an understatement. Logs not only help in debugging issues; they also provide a lot of information to help you predict an upcoming issue. Logs are the first door to open when you encounter issues with software components.
+
+Both [Fluentd][1] and [Logstash][2] can be used for log collection; the only reason I would choose Fluentd over Logstash is because of its independence from the Java process; it is written in C+ Ruby, which is widely supported by container runtimes like Docker and orchestration tools like Kubernetes.
+
+Log analytics is the process of analyzing the log data you collect over time and producing real-time logging metrics. [Elasticsearch][3] is a powerful tool that can do just that.
+
+Finally, you need a tool that can collect logging metrics and enable you to visualize the log trends using charts and graphs that are easy to understand. [Kibana][4] is my favorite option for that purpose.
+
+![Logging workflow][6]
+
+Logging workflow
+
+Because logs can hold sensitive information, here are a few security pointers to remember:
+
+ * Always transport logs over a secure connection.
+ * The logging/monitoring infrastructure should be implemented inside the restricted subnet.
+ * Access to monitoring user interfaces (e.g., Kibana and [Grafana][7]) should be restricted or authenticated only to stakeholders.
+
+
+
+### Node-level metrics
+
+Not everything is logged!
+
+Yes, you heard that right: Logging monitors a software or a process, not every component in the infrastructure.
+
+Operating system disks, externally mounted data disks, Elastic Block Store, CPU, I/O, network packets, inbound and outbound connections, physical memory, virtual memory, buffer space, and queues are some of the major components that rarely appear in logs unless something fails for them.
+
+So, how could you collect this data?
+
+[Prometheus][8] is one answer. You just need to install software-specific exporters on the virtual machine nodes and configure Prometheus to collect time-based data from those unattended components. Grafana uses the data Prometheus collects to provide a live visual representation of your node's current status.
+
+If you are looking for a simpler solution to collect time-series metrics, consider [Metricbeat][9], [Elastic.io][10]'s in-house open source tool, which can be used with Kibana to replace Prometheus and Grafana.
+
+### Alerts and notifications
+
+You can't take advantage of monitoring without alerts and notifications. Unless stakeholders—no matter where they are in this big, big world—receive a notification about an issue, there's no way they can analyze and fix the issue, prevent the customer from being impacted, and avoid it in the future.
+
+Prometheus, with predefined alerting rules using its in-house [Alertmanager][11] and Grafana, can send alerts based on configured rules. [Sensu][12] and [Nagios][13] are other open source tools that offer alerting and monitoring services.
+
+The only problem people have with open source alerting tools is that the configuration time and the process sometimes seem hard, but once they are set up, these tools function better than proprietary alternatives.
+
+However, open source tools' biggest advantage is that we have control over their behavior.
+
+### Monitoring workflow and architecture
+
+A good monitoring architecture is the backbone of a strong and stable monitoring system. It might look something like this diagram.
+
+![](https://opensource.com/sites/default/files/uploads/image_2_architecture.png)
+
+In the end, you must choose a tool based on your needs and infrastructure. The open source tools discussed in this article are used by many organizations for monitoring their infrastructure and blessing it with high uptime.
+
+This article was adapted from a post on [Medium.com][14]'s [Hacker Noon][15] and is republished here with the author's permission.
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/infrastructure-monitoring
+
+作者:[Abhishek Tamrakar][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/tamrakar
+[b]: https://github.com/lujun9972
+[1]: https://www.fluentd.org/
+[2]: https://www.elastic.co/products/logstash
+[3]: https://www.elastic.co/products/elasticsearch
+[4]: https://www.elastic.co/products/kibana
+[5]: /file/420766
+[6]: https://opensource.com/sites/default/files/uploads/infrastructure-monitoring_logging.jpeg (Logging workflow)
+[7]: https://grafana.com/
+[8]: https://prometheus.io/
+[9]: https://www.elastic.co/products/beats/metricbeat
+[10]: http://Elastic.io
+[11]: https://prometheus.io/docs/alerting/alertmanager/
+[12]: https://sensu.io/
+[13]: https://www.nagios.org/
+[14]: http://Medium.com
+[15]: https://medium.com/@abhishek.tamrakar/infrastructure-monitoring-defense-against-surprise-downtime-ed32416df0c5
diff --git a/sources/tech/20190220 Set up two-factor authentication for SSH on Fedora.md b/sources/tech/20190220 Set up two-factor authentication for SSH on Fedora.md
new file mode 100644
index 0000000000..7410262f3f
--- /dev/null
+++ b/sources/tech/20190220 Set up two-factor authentication for SSH on Fedora.md
@@ -0,0 +1,170 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Set up two-factor authentication for SSH on Fedora)
+[#]: via: (https://fedoramagazine.org/two-factor-authentication-ssh-fedora/)
+[#]: author: (Curt Warfield https://fedoramagazine.org/author/rcurtiswarfield/)
+
+Set up two-factor authentication for SSH on Fedora
+======
+
+![](https://fedoramagazine.org/wp-content/uploads/2019/02/twofactor-auth-ssh-816x345.png)
+
+Every day there seems to be a security breach reported in the news where our data is at risk. Despite the fact that SSH is a secure way to connect remotely to a system, you can still make it even more secure. This article will show you how.
+
+That’s where two-factor authentication (2FA) comes in. Even if you disable passwords and only allow SSH connections using public and private keys, an unauthorized user could still gain access to your system if they steal your keys.
+
+With two-factor authentication, you can’t connect to a server with just your SSH keys. You also need to provide the randomly generated number displayed by an authenticator application on a mobile phone.
+
+The Time-based One-time Password algorithm (TOTP) is the method shown in this article. [Google Authenticator][1] is used as the server application. Google Authenticator is available by default in Fedora.
+
+For your mobile phone, you can use any two-way authentication application that is compatible with TOTP. There are numerous free applications for Android or IOS that work with TOTP and Google Authenticator. This article uses [FreeOTP][2] as an example.
+
+### Install and set up Google Authenticator
+
+First, install the Google Authenticator package on your server.
+
+```
+$ sudo dnf install -y google-authenticator
+```
+
+Run the application.
+
+```
+$ google-authenticator
+```
+
+The application presents you with a series of questions. The snippets below show you how to answer for a reasonably secure setup.
+
+```
+Do you want authentication tokens to be time-based (y/n) y
+Do you want me to update your "/home/user/.google_authenticator" file (y/n)? y
+```
+
+The app provides you with a secret key, verification code, and recovery codes. Keep these in a secure, safe location. The recovery codes are the **only** way to access your server if you lose your mobile phone.
+
+### Set up mobile phone authentication
+
+Install the authenticator application (FreeOTP) on your mobile phone. You can find it in Google Play if you have an Android phone, or in the iTunes store for an Apple iPhone.
+
+A QR code is displayed on the screen. Open up the FreeOTP app on your mobile phone. To add a new account, select the QR code shaped tool at the top on the app, and then scan the QR code. After the setup is complete, you’ll have to provide the random number generated by the authenticator application every time you connect to your server remotely.
+
+### Finish configuration
+
+The application asks further questions. The example below shows you how to answer to set up a reasonably secure configuration.
+
+```
+Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y
+By default, tokens are good for 30 seconds. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens).
+Do you want to do so? (y/n) n
+If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s.
+Do you want to enable rate-limiting (y/n) y
+```
+
+Now you have to set up SSH to take advantage of the new two-way authentication.
+
+### Configure SSH
+
+Before completing this step, **make sure you’ve already established a working SSH connection** using public SSH keys, since we’ll be disabling password connections. If there is a problem or mistake, having a connection will allow you to fix the problem.
+
+On your server, use [sudo][3] to edit the /etc/pam.d/sshd file.
+
+```
+$ sudo vi /etc/pam.d/ssh
+```
+
+Comment out the auth substack password-auth line:
+
+```
+#auth substack password-auth
+```
+
+Add the following line to the bottom of the file.
+
+```
+auth sufficient pam_google_authenticator.so
+```
+
+Save and close the file. Next, edit the /etc/ssh/sshd_config file.
+
+```
+$ sudo vi /etc/ssh/sshd_config
+```
+
+Look for the ChallengeResponseAuthentication line and change it to yes.
+
+```
+ChallengeResponseAuthentication yes
+```
+
+Look for the PasswordAuthentication line and change it to no.
+
+```
+PasswordAuthentication no
+```
+
+Add the following line to the bottom of the file.
+
+```
+AuthenticationMethods publickey,password publickey,keyboard-interactive
+```
+
+Save and close the file, and then restart SSH.
+
+```
+$ sudo systemctl restart sshd
+```
+
+### Testing your two-factor authentication
+
+When you attempt to connect to your server you’re now prompted for a verification code.
+
+```
+[user@client ~]$ ssh user@example.com
+Verification code:
+```
+
+The verification code is randomly generated by your authenticator application on your mobile phone. Since this number changes every few seconds, you need to enter it before it changes.
+
+![][4]
+
+If you do not enter the verification code, you won’t be able to access the system, and you’ll get a permission denied error:
+
+```
+[user@client ~]$ ssh user@example.com
+
+Verification code:
+
+Verification code:
+
+Verification code:
+
+Permission denied (keyboard-interactive).
+
+[user@client ~]$
+```
+
+### Conclusion
+
+By adding this simple two-way authentication, you’ve now made it much more difficult for an unauthorized user to gain access to your server.
+
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/two-factor-authentication-ssh-fedora/
+
+作者:[Curt Warfield][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/rcurtiswarfield/
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Google_Authenticator
+[2]: https://freeotp.github.io/
+[3]: https://fedoramagazine.org/howto-use-sudo/
+[4]: https://fedoramagazine.org/wp-content/uploads/2019/02/freeotp-1.png
diff --git a/sources/tech/20190221 Bash-Insulter - A Script That Insults An User When Typing A Wrong Command.md b/sources/tech/20190221 Bash-Insulter - A Script That Insults An User When Typing A Wrong Command.md
new file mode 100644
index 0000000000..bd81a843ac
--- /dev/null
+++ b/sources/tech/20190221 Bash-Insulter - A Script That Insults An User When Typing A Wrong Command.md
@@ -0,0 +1,194 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Bash-Insulter : A Script That Insults An User When Typing A Wrong Command)
+[#]: via: (https://www.2daygeek.com/bash-insulter-insults-the-user-when-typing-wrong-command/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+Bash-Insulter : A Script That Insults An User When Typing A Wrong Command
+======
+
+This is such a nice and funny script that insult an user whenever they are typing a wrong command in terminal.
+
+It’s make you to feel happy when you are working on some issues.
+
+But somebody feel bad when the get an insult. However, i really feel happy when i get an insulted on terminal.
+
+It’s a funny CLI tool that insults you with random phrases if you do mistake.
+
+Also, it allows you to update your own phrases.
+
+### How To Install Bash-Insulter In Linux?
+
+Make sure, git package were installed on your system before performing Bash-Insulter installation. If no, use the following command to install it.
+
+For **`Fedora`** system, use **[DNF Command][1]** to install git.
+
+```
+$ sudo dnf install git
+```
+
+For **`Debian/Ubuntu`** systems, use **[APT-GET Command][2]** or **[APT Command][3]** to install git.
+
+```
+$ sudo apt install git
+```
+
+For **`Arch Linux`** based systems, use **[Pacman Command][4]** to install git.
+
+```
+$ sudo pacman -S git
+```
+
+For **`RHEL/CentOS`** systems, use **[YUM Command][5]** to install git.
+
+```
+$ sudo yum install git
+```
+
+For **`openSUSE Leap`** system, use **[Zypper Command][6]** to install git.
+
+```
+$ sudo zypper install git
+```
+
+We can easily install it by cloning the developer github repository.
+
+First clone the Bash-insulter repository.
+
+```
+$ git clone https://github.com/hkbakke/bash-insulter.git bash-insulter
+```
+
+Move the downloaded file under `/etc` folder.
+
+```
+$ sudo cp bash-insulter/src/bash.command-not-found /etc/
+```
+
+Append the following lines into `/etc/bash.bashrc` file.
+
+```
+$ vi /etc/bash.bashrc
+
+#Bash Insulter
+if [ -f /etc/bash.command-not-found ]; then
+ . /etc/bash.command-not-found
+fi
+```
+
+Run the following command to take the changes to effect.
+
+```
+$ sudo source /etc/bash.bashrc
+```
+
+Do you want to test this? if so, type some wrong command in terminal and see how it insult you.
+
+```
+$ unam -a
+
+$ pin 2daygeek.com
+```
+
+![][8]
+
+If you would like to append your own phrases then navigate to the following file and update it.
+
+You can add your phrases within `messages` section.
+
+```
+# vi /etc/bash.command-not-found
+
+print_message () {
+
+ local messages
+ local message
+
+ messages=(
+ "Boooo!"
+ "Don't you know anything?"
+ "RTFM!"
+ "Haha, n00b!"
+ "Wow! That was impressively wrong!"
+ "Pathetic"
+ "The worst one today!"
+ "n00b alert!"
+ "Your application for reduced salary has been sent!"
+ "lol"
+ "u suk"
+ "lol... plz"
+ "plz uninstall"
+ "And the Darwin Award goes to.... ${USER}!"
+ "ERROR_INCOMPETENT_USER"
+ "Incompetence is also a form of competence"
+ "Bad."
+ "Fake it till you make it!"
+ "What is this...? Amateur hour!?"
+ "Come on! You can do it!"
+ "Nice try."
+ "What if... you type an actual command the next time!"
+ "What if I told you... it is possible to type valid commands."
+ "Y u no speak computer???"
+ "This is not Windows"
+ "Perhaps you should leave the command line alone..."
+ "Please step away from the keyboard!"
+ "error code: 1D10T"
+ "ACHTUNG! ALLES TURISTEN UND NONTEKNISCHEN LOOKENPEEPERS! DAS KOMPUTERMASCHINE IST NICHT FÜR DER GEFINGERPOKEN UND MITTENGRABEN! ODERWISE IST EASY TO SCHNAPPEN DER SPRINGENWERK, BLOWENFUSEN UND POPPENCORKEN MIT SPITZENSPARKEN. IST NICHT FÜR GEWERKEN BEI DUMMKOPFEN. DER RUBBERNECKEN SIGHTSEEREN KEEPEN DAS COTTONPICKEN HÄNDER IN DAS POCKETS MUSS. ZO RELAXEN UND WATSCHEN DER BLINKENLICHTEN."
+ "Pro tip: type a valid command!"
+ "Go outside."
+ "This is not a search engine."
+ "(╯°□°)╯︵ ┻━┻"
+ "¯\_(ツ)_/¯"
+ "So, I'm just going to go ahead and run rm -rf / for you."
+ "Why are you so stupid?!"
+ "Perhaps computers is not for you..."
+ "Why are you doing this to me?!"
+ "Don't you have anything better to do?!"
+ "I am _seriously_ considering 'rm -rf /'-ing myself..."
+ "This is why you get to see your children only once a month."
+ "This is why nobody likes you."
+ "Are you even trying?!"
+ "Try using your brain the next time!"
+ "My keyboard is not a touch screen!"
+ "Commands, random gibberish, who cares!"
+ "Typing incorrect commands, eh?"
+ "Are you always this stupid or are you making a special effort today?!"
+ "Dropped on your head as a baby, eh?"
+ "Brains aren't everything. In your case they're nothing."
+ "I don't know what makes you so stupid, but it really works."
+ "You are not as bad as people say, you are much, much worse."
+ "Two wrongs don't make a right, take your parents as an example."
+ "You must have been born on a highway because that's where most accidents happen."
+ "If what you don't know can't hurt you, you're invulnerable."
+ "If ignorance is bliss, you must be the happiest person on earth."
+ "You're proof that god has a sense of humor."
+ "Keep trying, someday you'll do something intelligent!"
+ "If shit was music, you'd be an orchestra."
+ "How many times do I have to flush before you go away?"
+ )
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/bash-insulter-insults-the-user-when-typing-wrong-command/
+
+作者:[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/
+[7]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[8]: https://www.2daygeek.com/wp-content/uploads/2019/02/bash-insulter-insults-the-user-when-typing-wrong-command-1.png
diff --git a/sources/tech/20190221 Some Incredible Stories Around Tux- Our Lovable Linux Mascot.md b/sources/tech/20190221 Some Incredible Stories Around Tux- Our Lovable Linux Mascot.md
new file mode 100644
index 0000000000..626dae5afe
--- /dev/null
+++ b/sources/tech/20190221 Some Incredible Stories Around Tux- Our Lovable Linux Mascot.md
@@ -0,0 +1,141 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Some Incredible Stories Around Tux: Our Lovable Linux Mascot!)
+[#]: via: (https://itsfoss.com/tux-trivia)
+[#]: author: (Avimanyu Bandyopadhyay https://itsfoss.com/author/avimanyu/)
+
+Some Incredible Stories Around Tux: Our Lovable Linux Mascot!
+======
+
+We’ve all heard about our favorite Linux Mascot! In this Linux trivia series, I’ve scoured every nook and corner of the web I could reach out to, to dig up some old archives to gather some interesting trivia about our cute and friendly penguin, starting from its early days.
+
+![History of Linux logo][1]
+
+Chances are you might have already heard about its origins. But in this article exclusively dedicated to Tux, we are jotting down some interesting stories around the cute little fella with some info that might have gone unknown!
+
+The first discussion about a mascot goes back to the early days of the Linux release, when [Linus Torvalds][2] shared his thoughts about choosing one that would gracefully be the torch-bearer of our beloved OS. That’s when many people dived in to contribute with their suggestions for the same.
+
+The first email that cites the discussion of bringing in a Mascot goes back to 1996. It started with a hot debate about choosing creatures such as sharks or eagles which stopped the moment Linus mentioned that he was rather fond of penguins!
+
+```
+Re: Linux Logo prototype.
+Linus Torvalds (torvalds@cs.helsinki.fi)
+Thu, 9 May 1996 17:48:56 +0300 (EET DST)
+.
+Somebody had a logo competition announcement, maybe people can send their ideas to a web-site..
+.
+Anyway, this one looks like the poor penguin is not really strong enough to hold up the world, and it’s going to get squashed. Not a good, positive logo, in that respect..
+.
+Now, when you think about penguins, first take a deep calming breath, and then think “cuddly”. Take another breath, and think “cute”. Go back to “cuddly” for a while (and go on breathing), then think “contented”.
+.
+With me so far? Good..
+.
+Now, with penguins, (cuddly such), “contented” means it has either just gotten laid, or it’s stuffed on herring. Take it from me, I’m an expert on penguins, those are really the only two options.
+.
+Now, working on that angle, we don’t really want to be associated with a randy penguin (well, we do, but it’s not politic, so we won’t), so we should be looking at the “stuffed to its brim with herring” angle here.
+.
+So when you think “penguin”, you should be imagining a slighly overweight penguin (*), sitting down after having gorged itself, and having just burped. It’s sitting there with a beatific smile – the world is a good place to be when you have just eaten a few gallons of raw fish and you can feel another “burp” coming.
+.
+(*) Not FAT, but you should be able to see that it’s sitting down because it’s really too stuffed to stand up. Think “bean bag” here.
+.
+Now, if you have problems associating yourself with something that gets off by eating raw fish, think “chocolate” or something, but you get the idea.
+.
+Ok, so we should be thinking of a lovable, cuddly, stuffed penguin sitting down after having gorged itself on herring. Still with me?
+.
+NOW comes the hard part. With this image firmly etched on your eyeballs, you then scetch a stylizied version of it. Not a lot of detail – just a black brush-type outline (you know the effect you get with a brush where the thickness of the line varies). THAT requires talent. Give people the outline, and they should say [ sickly sweet voice, babytalk almost ]”Ooh, what a cuddly penguin, I bet he is just stuffed with herring”, and small children will jump up and down and scream “mommy mommy, can I have one too?”.
+.
+Then we can do a larger version with some more detail (maybe leaning against a globe of the world, but I don’t think we really want to give any “macho penguin” image here about Atlas or anything). That more detailed version can spank billy-boy to tears for all I care, or play ice-hockey with the FreeBSD demon. But the simple, single penguin would be the logo, and the others would just be that cuddly penguin being used as an actor in some tableau.
+.
+Linus
+```
+
+There have been numerous reports about the origins of Tux on various portals. I could have focused on just the origins but thought rather bring into light some other lesser known facts instead.
+
+### How was Tux first created?
+
+Let’s start by discussing the tool with which Tux was designed. Yes, we have already covered it on It’s FOSS earlier. It’s [GIMP][4]!
+
+Based on discussions on a linux-kernel mailing list about Tux and an initial suggestion by Alan Cox, Larry Ewing used GIMP 0.54 to create the first Tux image!
+
+The majority of the drawing was done on a 486 DX2/50 running Linux with nothing but a mouse and GIMP. Since it was initially created on an 8-bit display, the final smoothing with GIMP was done on an SGI Crimson.
+
+Larry drew the image as a black and white outline as we can see below in the first attempt which was later colorized in a series of steps:
+
+![][5]How Tux came into existence
+
+One tool that he mentions in GIMP is [Convolve][6], which proved quite helpful after the shape and primary shading had been done. He used it to carry out hand anti-aliasing, controlled smoothing, and a host of other neat effects on Tux. It aided in blurring the image with several different brush sizes to smooth out the shading. The air-brush extensively lightened or darkened areas that had smoothed a little too flat.
+
+A complete description of Tux’s creation experience has been shared in his own words by Larry’s own page where he [notes][7] every detail of how Tux came to be as we know today.
+
+We hope this also inspires you to create your own mascot if you think of one someday!
+
+**Recommended** : [The Earliest Linux Distros: Before Mainstream Distros Became So Popular][8]
+
+### A Mascot Contender
+
+![This could have been the Linux mascot][9]Could this have been the Linux mascot?
+
+These were some other contenders that couldn’t make it to the spot while competing with Tux. Apart from debating about eagles or sharks, there were also people who did not accept Tux as a mascot in the early days and preferred it to be a Fox instead. Seems like a sly pun! But it could not remain such a contender for long. The aura of Tux is too overpowering you know!
+
+### Linux Logo vs Mascot
+
+![Earlier Linux logo][10]Earlier Linux logo
+
+Not a mascot but it was this logo for Linux 2.0 by Matt Ericson that could not replace Tux eventually in spite of winning a poll many years ago (1997). The logo got 785 votes whereas Tux got only 541. But look today! Tux is dominant everywhere! Tux is where Linux is!
+
+### The smallest known image of Tux!
+
+![Smallest image of Tux. The size is about 130 microns.][11]Smallest image of Tux. The size is about 130 microns.
+
+A chip designer reported a miniature replica of Tux of about 130 microns in size (1 micron = 1 x 10−6 meters), with the Linux penguin nesting in the pad ring of an integrated circuit of unknown type and function. It was probably a special microprocessor that was optimized for its operating system.
+
+The report that was briefly made about the same no longer exists on the internet. But thanks to the Way Back machine, you can still take a [look][12]!
+
+### When Tux went to Space!
+
+This was definitely an incredible feat on January 18, 2011, by the Linux community in Australia with a noble fund-raiser goal at the Linux Conference at Brisbane, for the Queensland Premier’s flood relief charity. Despite the terrible flood, the Conference still happened undauntedly clearing all initial doubts about the same.
+
+We’ve shared the photo with you before on our previous [NASA article][13]. A hard copy of the photo was signed by Vint Cerf (one of the “fathers” of the Internet), Eric Allman (of “sendmail” fame) and Linus Torvalds (the initiator of the Linux OS kernel). Tux and his photo were then auctioned at the conference dinner that followed, raising over $23,000AUD for the flood relief.
+
+[Project Horus][14], which made Tux a successful space tourist, was powered by Ham Radio, Linux, Open Source, and Open Hardware. Horus 14 – the high altitude balloon made it to space by reaching an altitude of 30-40km, about 3 times the altitude of a regular jet aircraft. The horizon was at a few 100 km, the black space-ish sky and the curvature of the Earth are quite visible. Air pressure was about 5% of the ground level and the temperature was -50 °C. The tracking beacon was powered by an [Arduino][15] micro.
+
+This last one is undoubtedly my favorite Tux Trivia!
+
+Hope you liked reading about all of these short but intriguing events in [Tux’s history][16] (You can refer to this hyperlink as a Tux Trivia Encyclopedia!).
+
+If you have been part of any memorable event that relates with Tux, please share with us in the comments below and we’d be delighted to read them!
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/tux-trivia
+
+作者:[Avimanyu Bandyopadhyay][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/avimanyu/
+[b]: https://github.com/lujun9972
+[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/history-of-linux-logo-mascot.png?resize=800%2C450&ssl=1
+[2]: https://itsfoss.com/linus-torvalds-facts/
+[3]: /cdn-cgi/l/email-protection
+[4]: https://itsfoss.com/gimp-2-10-release/
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/How-Larry-Ewing-Created-Tux-With-Gimp.jpg?resize=782%2C800&ssl=1
+[6]: https://docs.gimp.org/2.2/en/gimp-tool-convolve.html
+[7]: http://isc.tamu.edu/~lewing/linux/notes.html
+[8]: https://itsfoss.com/earliest-linux-distros/
+[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/Linux-Fox-The-Lesser-Known-Alternative-Mascot.jpg?ssl=1
+[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/Linux-2-0-Logo.jpg?ssl=1
+[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/micro-tux.jpg?ssl=1
+[12]: https://web.archive.org/web/20180620175359/https://micro.magnet.fsu.edu/creatures/pages/linuxpenguin.html
+[13]: https://itsfoss.com/nasa-open-science/
+[14]: http://www.projecthorus.org/
+[15]: _wp_link_placeholder
+[16]: https://sjbaker.org/wiki/index.php?title=The_History_of_Tux_the_Linux_Penguin
+[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/history-of-linux-logo-mascot.png?fit=800%2C450&ssl=1
diff --git a/sources/tech/20190221 Testing Bash with BATS.md b/sources/tech/20190221 Testing Bash with BATS.md
new file mode 100644
index 0000000000..16c65b2670
--- /dev/null
+++ b/sources/tech/20190221 Testing Bash with BATS.md
@@ -0,0 +1,265 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Testing Bash with BATS)
+[#]: via: (https://opensource.com/article/19/2/testing-bash-bats)
+[#]: author: (Darin London https://opensource.com/users/dmlond)
+
+Testing Bash with BATS
+======
+The Bash Automated Testing System puts Bash code through the same types of testing processes used by Java, Ruby, and Python developers.
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/todo_checklist_team_metrics_report.png?itok=oB5uQbzf)
+
+Software developers writing applications in languages such as Java, Ruby, and Python have sophisticated libraries to help them maintain their software's integrity over time. They create tests that run applications through a series of executions in structured environments to ensure all of their software's aspects work as expected.
+
+These tests are even more powerful when they're automated in a continuous integration (CI) system, where every push to the source repository causes the tests to run, and developers are immediately notified when tests fail. This fast feedback increases developers' confidence in the functional integrity of their applications.
+
+The Bash Automated Testing System ([BATS][1]) enables developers writing Bash scripts and libraries to apply the same practices used by Java, Ruby, Python, and other developers to their Bash code.
+
+### Installing BATS
+
+The BATS GitHub page includes installation instructions. There are two BATS helper libraries that provide more powerful assertions or allow overrides to the Test Anything Protocol ([TAP][2]) output format used by BATS. These can be installed in a standard location and sourced by all scripts. It may be more convenient to include a complete version of BATS and its helper libraries in the Git repository for each set of scripts or libraries being tested. This can be accomplished using the **[git submodule][3]** system.
+
+The following commands will install BATS and its helper libraries into the **test** directory in a Git repository.
+
+```
+git submodule init
+git submodule add https://github.com/sstephenson/bats test/libs/bats
+git submodule add https://github.com/ztombol/bats-assert test/libs/bats-assert
+git submodule add https://github.com/ztombol/bats-support test/libs/bats-support
+git add .
+git commit -m 'installed bats'
+```
+
+To clone a Git repository and install its submodules at the same time, use the
+**\--recurse-submodules** flag to **git clone**.
+
+Each BATS test script must be executed by the **bats** executable. If you installed BATS into your source code repo's **test/libs** directory, you can invoke the test with:
+
+```
+./test/libs/bats/bin/bats
+```
+
+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/20190223 Regex groups and numerals.md b/sources/tech/20190223 Regex groups and numerals.md
new file mode 100644
index 0000000000..c24505ee6b
--- /dev/null
+++ b/sources/tech/20190223 Regex groups and numerals.md
@@ -0,0 +1,60 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Regex groups and numerals)
+[#]: via: (https://leancrew.com/all-this/2019/02/regex-groups-and-numerals/)
+[#]: author: (Dr.Drang https://leancrew.com)
+
+Regex groups and numerals
+======
+
+A week or so ago, I was editing a program and decided I should change some variable names. I thought it would be a simple regex find/replace, and it was. Just not as simple as I thought.
+
+The variables were named `a10`, `v10`, and `x10`, and I wanted to change them to `a30`, `v30`, and `x30`, respectively. I brought up BBEdit’s Find window and entered this:
+
+![Mistaken BBEdit replacement pattern][2]
+
+I couldn’t just replace `10` with `30` because there were instances of `10` in the code that weren’t related to the variables. And because I think I’m clever, I didn’t want to do three non-regex replacements, one each for `a10`, `v10`, and `x10`. But I wasn’t clever enough to notice the blue coloring in the replacement pattern. Had I done so, I would have seen that BBEdit was interpreting my replacement pattern as “Captured group 13, followed by `0`” instead of “Captured group 1, followed by `30`,” which was what I intended. Since captured group 13 was blank, all my variable names were replaced with `0`.
+
+You see, BBEdit can capture up to 99 groups in the search pattern and, strictly speaking, we should use two-digit numbers when referring to them in the replacement pattern. But in most cases, we can use `\1` through `\9` instead of `\01` through `\09` because there’s no ambiguity. In other words, if I had been trying to change `a10`, `v10`, and `x10` to `az`, `vz`, and `xz`, a replacement pattern of `\1z` would have been just fine, because the trailing `z` means there’s no way to misinterpret the intent of the `\1` in that pattern.
+
+So after undoing the replacement, I changed the pattern to this,
+
+![Two-digit BBEdit replacement pattern][3]
+
+and all was right with the world.
+
+There was another option: a named group. Here’s how that would have looked, using `var` as the pattern name:
+
+![Named BBEdit replacement pattern][4]
+
+I don’t think I’ve ever used a named group in any situation, whether the regex was in a text editor or a script. My general feeling is that if the pattern is so complicated I have to use variables to keep track of all the groups, I should stop and break the problem down into smaller parts.
+
+By the way, you may have heard that BBEdit is celebrating its [25th anniversary][5] of not sucking. When a well-documented app has such a long history, the manual starts to accumulate delightful callbacks to the olden days. As I was looking up the notation for named groups in the BBEdit manual, I ran across this note:
+
+![BBEdit regex manual excerpt][6]
+
+BBEdit is currently on Version 12.5; Version 6.5 came out in 2001. But the manual wants to make sure that long-time customers (I believe it was on Version 4 when I first bought it) don’t get confused by changes in behavior, even when those changes occurred nearly two decades ago.
+
+
+--------------------------------------------------------------------------------
+
+via: https://leancrew.com/all-this/2019/02/regex-groups-and-numerals/
+
+作者:[Dr.Drang][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://leancrew.com
+[b]: https://github.com/lujun9972
+[1]: https://leancrew.com/all-this/2019/02/automation-evolution/
+[2]: https://leancrew.com/all-this/images2019/20190223-Mistaken%20BBEdit%20replacement%20pattern.png (Mistaken BBEdit replacement pattern)
+[3]: https://leancrew.com/all-this/images2019/20190223-Two-digit%20BBEdit%20replacement%20pattern.png (Two-digit BBEdit replacement pattern)
+[4]: https://leancrew.com/all-this/images2019/20190223-Named%20BBEdit%20replacement%20pattern.png (Named BBEdit replacement pattern)
+[5]: https://merch.barebones.com/
+[6]: https://leancrew.com/all-this/images2019/20190223-BBEdit%20regex%20manual%20excerpt.png (BBEdit regex manual excerpt)
diff --git a/translated/talk/20190123 Book Review- Fundamentals of Linux.md b/translated/talk/20190123 Book Review- Fundamentals of Linux.md
deleted file mode 100644
index fc05d96fec..0000000000
--- a/translated/talk/20190123 Book Review- Fundamentals of Linux.md
+++ /dev/null
@@ -1,73 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (mySoul8012)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Book Review: Fundamentals of Linux)
-[#]: via: (https://itsfoss.com/fundamentals-of-linux-book-review)
-[#]: author: (John Paul https://itsfoss.com/author/john/)
-
-书评:linux的基础知识
-======
-有很多很棒的书籍涵盖了Linux的基础知识以及它的工作原理,今天,我们将会书评这样一本书,讨论的主题为Oliver Pelz所写的[linux的基础知识][1],由[PacktPub][2]发布。
-
-[Oliver Pelz][3] 是一位超过十年软件开发人员和系统管理员经验人员,同时拥有生物信息学学位证书。
-
-### 什么是linux基础知识一书
-
-![Fundamental of Linux books][4]
-正如可以从标题中猜到那样,该书(Linux基础知识)的目标是为读者打下一个了解Linux命令行的坚实基础。这本书一共有两百多页。因此它专注于教授用户日常遇到的问题,以及任务。本书为想要成为Linux管理员的读者而书写。
-
-第一章首先概述了虚拟化。本书作者指导了读者如何在[VirtualBox][6]中创建[CentOS][5]实例。如何克隆实例,如何使用快照。并且同时你也会学习到如何通过SSH命令连接到虚拟机。
-
-第二章介绍了Linux的命令行的基础知识,包括shell GLOB模式,shell扩展,如何使用包含空格和特殊字符的文件名称。如何来获取命令手册的帮助页面。如何使用`sed`, `awk`这两个命令。如何浏览Linux的文件系统。
-
-第三章更深入的介绍了Linux文件系统。您将了解如何在Linux中链接文件,以及如何搜索它们。您还将获得用户,组,以及文件权限的概述。由于本章的重点介绍了如何与文件进行交互。因此还将会介绍如何从命令行中读取文本文件,以及如何使用vim编辑器。
-
-第四章重点介绍了如何使用命令行。以及涵盖的重要命令。如`cat`, `sort`, `awk`. `tee`, `tar`,`rsync`, `nmap`, `htop`等。您还将会了解这些命令的流程,以及如何相互使用,还将介绍Bash shell脚本。
-
-第五章同时也是本书的最后一章,将会介绍Linux和其他高级命令,以及网络的概念。本书的作者讨论了Linux如何处理网络并提供使用多个虚拟机的示例。同时还将会介绍如何安装新的程序,如何设置防火墙。
-
-### 关于这本书的想法
-
-Linux的基础知识可能看起来很见到,但是涵盖了相当多的信息。同时也将会获得如何使用命令行所需要的知识的一切。
-
-使用本书的时候,需要注意一件事情,即,本书专注于对命令行的关注,没有任何关于如何使用图形化的用户界面的任何教程。这是因为在Linux中有太多不同的桌面环境,以及很多的类似的操作系统。因此很难编写一本可以涵盖所有变量的书。部分原因还因为本书的面向的用户群体为Linux管理员。
-
-当我看到作者使用Centos教授Linux的时候有点惊讶。我原本以为他会使用更为常见的Linux的发行版本,例如Ubuntu,Debian或者Fedora。原因在于Centos是为服务器设计的发行版本。随着时间的推移变化很小。能够为Linux的基础知识打下一个非常坚实的基础。
-
-自己使用Linux已经操作五年了。我大部分时间都在使用桌面版本的Linux。我有些时候会使用命令行操作。但我并没有花太多的时间在哪里。我使用鼠标执行了本书中很多的操作。现在呢。我同时也知道了如何通过终端做出同样的事情。这种方式不会改变我完成任务的路径。但是会更加帮助自己理解幕后发生的事情。
-
-如果您刚刚使用Linux,或者计划使用。我不会推荐您阅读这本书。这可能有点绝对化。但是如何您已经花了一些时间在Linux上。或者可以快速掌握某种技术语言。那么这本书很适合你。
-
-如果您认为本书适合您的学习需求。您可以从以下链接获取到该书。
-
-我们将在未来几个月内尝试查看更多Linux书籍,敬请关注我们。
-
-你最喜欢的关于Linux的入门书籍是什么?请在下面的评论中告诉我们。
-
-如果您发现这篇文章很有趣,请花一点时间在社交媒体,黑客新闻或[Reddit][8]上分享
-
-
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/fundamentals-of-linux-book-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://www.packtpub.com/networking-and-servers/fundamentals-linux
-[2]: https://www.packtpub.com/
-[3]: http://www.oliverpelz.de/index.html
-[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/fundamentals-of-linux-book-review.jpeg?resize=800%2C450&ssl=1
-[5]: https://centos.org/
-[6]: https://www.virtualbox.org/
-[7]: https://www.centos.org/
-[8]: http://reddit.com/r/linuxusersgroup
diff --git a/translated/tech/20170223 Use Emacs to create OAuth 2.0 UML sequence diagrams.md b/translated/tech/20170223 Use Emacs to create OAuth 2.0 UML sequence diagrams.md
new file mode 100644
index 0000000000..996c45aaa2
--- /dev/null
+++ b/translated/tech/20170223 Use Emacs to create OAuth 2.0 UML sequence diagrams.md
@@ -0,0 +1,151 @@
+[#]:collector:(lujun9972)
+[#]:translator:(lujun9972)
+[#]:reviewer:( )
+[#]:publisher:( )
+[#]:url:( )
+[#]:subject:(Use Emacs to create OAuth 2.0 UML sequence diagrams)
+[#]:via:(https://www.onwebsecurity.com/configuration/use-emacs-to-create-oauth-2-0-uml-sequence-diagrams.html)
+[#]:author:(Peter Mosmans https://www.onwebsecurity.com)
+
+使用 Emacs 创建 OAuth 2.0 的 UML 序列图
+======
+
+![OAuth 2.0 abstract protocol flow][6]
+
+看起来 [OAuth 2.0 框架 ][7] 已经越来越广泛地应用于 web (和 移动) 应用。太棒了!
+
+虽然协议本身并不复杂,但有很多的使用场景,流程和实现可供选择。正如生活中的大多数事物一样,魔鬼在于细节之中。
+
+在审查 OAuth 2.0 实现或编写渗透测试报告时我习惯画出 UML 图。这方便让人理解发生了什么事情,并发现潜在的问题。毕竟,一图抵千言。
+
+使用基于 GPL 开源协议 [Emacs][8] 编辑器来实现,再加上基于 GPL 开源协议的工具 [PlantUML][9] (也可以选择基于 Eclipse Public 协议的 [Graphviz][10]) 很容易做到这一点。
+
+Emacs 是世界上最万能的编辑器。在这种场景中,我们用它来编辑文本,并自动将文本转换成图片。PlantUML 是一个允许你用人类可读的文本来写 UML 并完成该转换的工具。Graphviz 是一个可视化的软件,这里我们可以用它来显示图片。
+
+下载 [预先编译好了的 PlantUML jar 文件 ][11],[Emacs][12] 还可以选择下载并安装 [Graphviz][13]。
+
+安装并启动 Emacs,然后将下面 Lisp 代码(实际上是配置)写入你的启动文件中(` ~/.emacs.d/init.d` ),这段代码将会
+
+ * 配置 ` org-mode` (一种用来组织并编辑文本文件的模式) 来使用 PlantUML
+ * 将 ` plantuml` 添加到可识别的` org-babel` 语言中 (这让你可以在文本文件中执行源代码)
+ * 将 PlantUML 代码标注为安全的,从而允许执行
+ * 自动显示生成的结果图片
+
+
+
+```elisp
+ ;; tell org-mode where to find the plantuml JAR file (specify the JAR file)
+(setq org-plantuml-jar-path (expand-file-name "~/plantuml.jar"))
+
+;; use plantuml as org-babel language
+(org-babel-do-load-languages 'org-babel-load-languages '((plantuml . t)))
+
+;; helper function
+(defun my-org-confirm-babel-evaluate (lang body)
+"Do not ask for confirmation to evaluate code for specified languages."
+(member lang '("plantuml")))
+
+;; trust certain code as being safe
+(setq org-confirm-babel-evaluate 'my-org-confirm-babel-evaluate)
+
+;; automatically show the resulting image
+(add-hook 'org-babel-after-execute-hook 'org-display-inline-images)
+```
+
+如果你还没有启动文件,那么将该代码加入到 `~/.emacs.d/init.el` 文件中然后重启 Emacs。
+
+提示:Control-c Control-f 可以让你创建/打开(新)文件。Control-x Control-s 保存文件,而 Control-x Control-c 退出 Emacs。
+
+这就结了!
+
+要测试该配置,可以创建/打开( Control-c Control-f )后缀为 `.org` 的文件,例如 `test.org` . 这回让 Emacs 切换到 "org-mode" 并识别 "org-babel" 语法。
+
+输入下面代码,然后在代码中输入 Control-c Control-c 来测试是否安装正常:
+
+```
+#+BEGIN_SRC plantuml :file test.png
+@startuml
+version
+@enduml
+#+END_SRC
+```
+
+一切顺利的话,你会在 Emacs 中看到文本下面显示了一张图片。
+
+注意
+
+要快速插入类似 ` #+BEGIN_SRC` 和 ` #+END_SRC` 这样的代码片段,你可以使用内置的 Easy Templates 系统:输入 user : request authorization
+note left
+**grant types**:
+# authorization code
+# implicit
+# password
+# client_credentials
+end note
+user --> client : authorization grant
+end
+
+group token is generated
+client -> authorization : request token\npresent authorization grant
+authorization --> client :var: access token
+note left
+**response types**:
+# code
+# token
+end note
+end group
+
+group resource can be accessed
+client -> resource : request resource\npresent token
+resource --> client : resource
+end group
+@enduml
+#+END_SRC
+```
+
+你难道会不喜欢 Emacs 和开源工具的多功能性吗?
+
+--------------------------------------------------------------------------------
+
+via: https://www.onwebsecurity.com/configuration/use-emacs-to-create-oauth-2-0-uml-sequence-diagrams.html
+
+作者:[Peter Mosmans][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://www.onwebsecurity.com
+[b]: https://github.com/lujun9972
+[1]: https://www.onwebsecurity.com/category/configuration.html
+[2]: https://www.onwebsecurity.com/tag/emacs.html
+[3]: https://www.onwebsecurity.com/tag/oauth2.html
+[4]: https://www.onwebsecurity.com/tag/pentesting.html
+[5]: https://www.onwebsecurity.com/tag/security.html
+[6]: https://www.onwebsecurity.com/images/oauth2-abstract-protocol-flow.png
+[7]: https://tools.ietf.org/html/rfc6749
+[8]: https://www.gnu.org/software/emacs/
+[9]: https://plantuml.com
+[10]: http://www.graphviz.org/
+[11]: http://plantuml.com/download
+[12]: https://www.gnu.org/software/emacs/download.html
+[13]: http://www.graphviz.org/Download.php
diff --git a/translated/tech/20170721 Firefox and org-protocol URL Capture.md b/translated/tech/20170721 Firefox and org-protocol URL Capture.md
new file mode 100644
index 0000000000..0682649ed7
--- /dev/null
+++ b/translated/tech/20170721 Firefox and org-protocol URL Capture.md
@@ -0,0 +1,122 @@
+[#]:collector:(lujun9972)
+[#]:translator:(lujun9972)
+[#]:reviewer:( )
+[#]:publisher:( )
+[#]:url:( )
+[#]:subject:(Firefox and org-protocol URL Capture)
+[#]:via:(http://www.mediaonfire.com/blog/2017_07_21_org_protocol_firefox.html)
+[#]:author:(Andreas Viklund http://andreasviklund.com/)
+
+在 Firefox 上使用 org-protocol 捕获 URL
+======
+
+### 介绍
+
+作为一名 Emacs 人,我尽可能让所有的工作流都在 [org-mode][1] 上进行 – 我比较喜欢文本。
+
+我倾向于将书签记录为 [org-mode][1] 代办列表,而 [org-protocol][2] 则允许外部进程利用 [org-mode][1] 的某些功能。然而,要做到这一点配置起来很麻烦。([搜索引擎上 ][3]) 有很多教程,Firefox 也有很多这类 [扩展 ][4],然而我对它们都不太满意。
+
+因此我决定将我现在的配置记录在这篇博客中,方便其他有需要的人使用。
+
+### 配置 Emacs Org Mode
+
+启用 org-protocol:
+
+```
+(require 'org-protocol)
+```
+
+添加一个捕获模板 (capture template) - 我的配置是这样的:
+
+```
+(setq org-capture-templates
+ (quote (...
+ ("w" "org-protocol" entry (file "~/org/refile.org")
+ "* TODO Review %a\n%U\n%:initial\n" :immediate-finish)
+ ...)))
+```
+
+你可以从 [org-mode][1] 手册中 [capture templates][5] 章节中获取帮助。
+
+设置默认使用的模板:
+
+```
+(setq org-protocol-default-template-key "w")
+```
+
+执行这些新增配置让它们在当前 Emacs 会话中生效。
+
+### 快速测试
+
+在下一步开始前,最好测试一下配置:
+
+```
+emacsclient -n "org-protocol:///capture?url=http%3a%2f%2fduckduckgo%2ecom&title=DuckDuckGo"
+```
+
+基于的配置的模板,可能会弹出一个捕获窗口。请确保正常工作,否则后面的操作没有任何意义。如果工作不正常,检查刚才的配置并且确保你执行了这些代码块。
+
+如果你的 [org-mode][1] 版本比较老(老于 7 版本),测试的格式会有点不同:这种 URL 编码后的格式需要改成用斜杠来分割 url 和标题。在网上搜一下很容易找出这两者的不同。
+
+### Firefox 协议
+
+现在开始设置 Firefox。浏览 about:config。右击配置项列表,选择 New -> Boolean,然后输入 network.protocol-handler.expose.org-protocol 作为名字并且将值设置为 true。
+
+有些教程说这一步是可以省略的 – 配不配因人而异。
+
+### 添加 Desktop 文件
+
+大多数的教程都有这一步:
+
+增加一个文件 ~/.local/share/applications/org-protocol.desktop:
+
+```
+[Desktop Entry]
+Name=org-protocol
+Exec=/path/to/emacsclient -n %u
+Type=Application
+Terminal=false
+Categories=System;
+MimeType=x-scheme-handler/org-protocol;
+```
+
+然后运行更新器。对于 i3 窗口管理器我使用下面命令(跟 gnome 一样):
+
+```
+update-desktop-database ~/.local/share/applications/
+```
+
+KDE 的方法不太一样… 你可以查询其他相关教程。
+
+### 在 FireFox 中设置捕获按钮
+
+创建一个书签(我是在工具栏上创建这个书签的),地址栏输入下面内容:
+
+```
+javascript:location.href="org-protocol:///capture?url="+encodeURIComponent(location.href)+"&title="+encodeURIComponent(document.title||"[untitled page]")
+```
+
+保存该书签后,再次编辑该书签,你应该会看到其中的所有空格都被替换成了 '%20' – 也就是空格的 URL 编码形式。
+
+现在当你点击该书签,你就会在某个 Emacs Frame,可能是任何一个 Frame 中,打开一个窗口,显示你预定的模板。
+
+
+
+--------------------------------------------------------------------------------
+
+via: http://www.mediaonfire.com/blog/2017_07_21_org_protocol_firefox.html
+
+作者:[Andreas Viklund][a]
+选题:[lujun9972][b]
+译者:[lujun9972](https://github.com/lujun9972)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: http://andreasviklund.com/
+[b]: https://github.com/lujun9972
+[1]: http://orgmode.org/
+[2]: http://orgmode.org/worg/org-contrib/org-protocol.html
+[3]: https://duckduckgo.com/?q=org-protocol+firefox&t=ffab&ia=qa
+[4]: https://addons.mozilla.org/en-US/firefox/search/?q=org-protocol&cat=1,0&appver=53.0&platform=linux
+[5]: http://orgmode.org/manual/Capture-templates.html
diff --git a/translated/tech/20180122 Ick- a continuous integration system.md b/translated/tech/20180122 Ick- a continuous integration system.md
new file mode 100644
index 0000000000..eb1f3c6c45
--- /dev/null
+++ b/translated/tech/20180122 Ick- a continuous integration system.md
@@ -0,0 +1,74 @@
+Ick:一个连续集成系统
+======
+
+**TL;DR:** Ick 是一个连续集成或者 CI 系统。访问 获取跟多信息。
+
+更加详细的版本随后会出
+
+### 首个公开版本发行
+
+世界可能还不需要另一个连续集成系统(CI)但是我需要。我已对我尝试过或者看过的连续集成系统感到不满意了。更重要的是,几样我感兴趣的东西比我所听说过的连续集成系统要强大得多。因此我开始编写我自己的 CI 系统。
+
+我的新个人业余项目叫做 ick。它是一个 CI 系统,这意味着他可以运行自动化的步骤来搭建、测试软件。它的主页是,[下载][1]页面有导向源码、.deb 包和用来安装的 Ansible 脚本的链接。
+
+我现已发布了首个公开版本,绰号 ALPHA-1,版本号0.23。它现在是 alpha 品质,这意味着它并没拥有所有期望的特性,如果任何一个它已有的特性工作的话,你应该感到庆幸。
+
+### 诚邀英才
+
+Ick 目前是我的个人项目。我希望能让它不仅限于此,同时我也诚邀英才。访问[管理][2]页面查看章程,[开始][3]页面查看如何开始贡献的的小贴士,[联系][4]页面查看如何联络。
+
+### 架构
+
+Ick 拥有一个由几个通过 HTTPS 协议通信使用 RESTful API 和 JSON 处理结构化数据的部分组成的架构。访问[架构][5]页面查看细节。
+
+### 宣言
+
+连续集成(CI)是用于软件开发的强大工具。它不应枯燥、易溃或恼人。它搭建起来应简单快速,除非正在测试、搭建中的码有问题,不然它应在后台安静地工作。
+
+一个连续集成系统应该简单、易用、清楚、干净、可扩展、快速、综合、透明、可靠并推动你的生产力。搭建它不应花大力气、不应需要专门为 CI 而造的硬件、不应需要频繁留意以使其保持工作、开发者永远不必思考为什么某样东西不工作。
+
+一个连续集成系统应该足够灵活以适应你的搭建、测试需求。只要 CPU 架构和操作系统版本没问题,它应该支持各式操作者。
+
+同时像所有软件一样,CI 应该彻彻底底的免费,你的 CI 应由你做主。
+
+(目前的 Ick 仅稍具雏形,但是它会尝试着有朝一日变得完美,在最理想的情况下。)
+
+### 未来的梦想
+
+长远来看,我希望 ick 拥有像下面所描述的特性。落实全部特性可能需要一些时间。
+
+* 多种多样的事件都可以触发搭建。时间是一个明显的事件因为项目的源代码仓库改变了。更强大的是不管依赖是来自于 ick 搭建的另一个项目或则包比如说来自 Debian,任何用于搭建的依赖都会改变:ick 应当跟踪所有安装进一个项目搭建环境中的包,如果任何一个包的版本改变,都应再次触发项目搭建和测试。
+
+* Ick 应该支持搭建任何合理的目标,包括任何 Linux 发行版,任何免费的操作系统,以及任何一息尚存的收费操作系统。
+
+* Ick 应当不需要安装任何专门的代理,就能支持各种它能够通过 ssh 或者串口或者其它这种中性交流管道控制的操作者。Ick 不应默认它可以有比如说一个完整的 Java Runtime,如此一来,操作者就可以是一个微控制器了。
+
+* Ick 应当能轻松掌控一大批项目。我觉得不管一个新的 Debian 源包何时上传,Ick 都应该要能够跟得上在 Debian 中搭建所有东西的进度。(明显这可行与否取决于是否有足够的资源确实用在搭建上,但是 Ick 自己不应有瓶颈。)
+
+* 如果有需要的话 Ick 应当有选择性地补给操作者。如果所有特定种类的操作者处于忙碌中且 Ick 被设置成允许使用更多资源的话,它就应该这么做。这看起来用虚拟机、容器、云提供商等做可能会简单一些。
+
+* Ick 应当灵活提醒感兴趣的团体特别是关于其失败的方面。它应允许感兴趣的团体通过 IRC,Matrix,Mastodon, Twitter, email, SMS 甚至电话和语音合成来接受通知。例如“您好,感兴趣的团体。现在是四点钟您想被通知 hello 包什么时候为 RISC-V 搭建好。”
+
+
+
+
+### 请提供反馈
+
+如果你尝试 ick 或者甚至你仅仅是读到这,请在上面分享你的想法。[联系][4]页面查看如何发送反馈。相比私下反馈我更偏爱公开反馈。但如果你偏爱私下反馈,那也行。
+
+--------------------------------------------------------------------------------
+
+via: https://blog.liw.fi/posts/2018/01/22/ick_a_continuous_integration_system/
+
+作者:[Lars Wirzenius][a]
+译者:[tomjlw](https://github.com/tomjlw)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://blog.liw.fi/
+[1]:http://ick.liw.fi/download/
+[2]:http://ick.liw.fi/governance/
+[3]:http://ick.liw.fi/getting-started/
+[4]:http://ick.liw.fi/contact/
+[5]:http://ick.liw.fi/architecture/
diff --git a/translated/tech/20180128 Get started with Org mode without Emacs.md b/translated/tech/20180128 Get started with Org mode without Emacs.md
deleted file mode 100644
index c61600bd52..0000000000
--- a/translated/tech/20180128 Get started with Org mode without Emacs.md
+++ /dev/null
@@ -1,78 +0,0 @@
-[#]:collector:(lujun9972)
-[#]:translator:(lujun9972)
-[#]:reviewer:( )
-[#]:publisher:( )
-[#]:url:( )
-[#]:subject:(Get started with Org mode without Emacs)
-[#]:via:(https://opensource.com/article/19/1/productivity-tool-org-mode)
-[#]:author:(Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
-
-在没有 Emacs 的情况下开始使用 Org mode
-======
-不,你不需要 Emacs 也能用 Org,这是我开源工具系列的第 16 集,将会让你在 2019 年变得更加有生产率。
-
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/web_browser_desktop_devlopment_design_system_computer.jpg?itok=pfqRrJgh)
-
-每到年初似乎总有这么一个疯狂的冲动来寻找提高生产率的方法。新年决心,正确地开始一年的冲动,以及"向前看"的态度都是这种冲动的表现。软件推荐通常都会选择闭源和专利软件。但这不是必须的。
-
-这是我 2019 年改进生产率的 19 个新工具中的第 16 个。
-
-### Org (非 Emacs)
-
-[Org mode][1] (或者就是 Org) 并不是新鲜货,但依然有许多人没有用过。他们很乐意试用一下以体验 Org 是如何改善生产率的。但最大的障碍来自于 Org 是与 Emacs 相沟联的,而且很多人都认为两者缺一不可。并不是这样的!一旦你理解了其基础,Org 就可以与各种其他工具和编辑器一起使用。
-
-![](https://opensource.com/sites/default/files/uploads/org-1.png)
-
-Org,本质上,是一个结构化的文本文件。它有标题,子标题,以及各种关键字,其他工具可以根据这些关键字将文件解析成日程表和代办列表。Org 文件可以被任何纯文本编辑器编辑(例如。,[Vim][2],[Atom][3],或 [Visual Studio Code][4]),而且很多编辑器都有插件可以帮你创建和管理 Org 文件。
-
-一个基础的 Org 文件看起来是这样的:
-
-```
-* Task List
-** TODO Write Article for Day 16 - Org w/out emacs
- DEADLINE: <2019-01-25 12:00>
-*** DONE Write sample org snippet for article
- - Include at least one TODO and one DONE item
- - Show notes
- - Show SCHEDULED and DEADLINE
-*** TODO Take Screenshots
-** Dentist Appointment
- SCHEDULED: <2019-01-31 13:30-14:30>
-```
-
-Org 是一种大纲格式,它使用 ***** 作为标识指明事项的级别。任何以 TODO( 是的,全大些) 开头的事项都代办事项。标注为 DONE 的工作表示该工作已经完成。SCHEDULED 和 DEADLINE 标识与该事务相关的日期和时间。如何任何地方都没有时间,则该事务被视为全天活动。
-
-使用正确的插件,你喜欢的文本编辑器可以成为一个充满生产率和组织能力的强大工具。例如,[vim-orgmode][5] 插件拥有函数来创建 Org 文件,语法高亮,以及各种用来生成跨文件的日程和综合代办事项列表的关键命令。
-
-![](https://opensource.com/sites/default/files/uploads/org-2.png)
-
-Atom 的 [Organized][6] 插件在屏幕右边添加一个侧边栏,用来现实 Org 文件中的日程和代办事项。默认情况下它从配置项中设置的路径中读取多个 Org 文件。Todo 侧边栏允许你通过点击未完事项来将其标记为已完成,它会自动更新源 Org 文件。
-
-![](https://opensource.com/sites/default/files/uploads/org-3.png)
-
-还有一大堆 Org 工具可以帮助你保持生产率。使用 Python,Perl,PHP,NodeJS 等库,你可以开发自己的脚本和工具。当然,少不了 [Emacs][7],它的核心功能就包括支持 Org。
-
-![](https://opensource.com/sites/default/files/uploads/org-4.png)
-
-Org mode 是跟踪需要完成的工作和时间的最好工具之一。而且,与传闻相反,它无需 Emacs,任何一个文本编辑器都行。
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/productivity-tool-org-mode
-
-作者:[Kevin Sonney][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/ksonney (Kevin Sonney)
-[b]: https://github.com/lujun9972
-[1]: https://orgmode.org/
-[2]: https://www.vim.org/
-[3]: https://atom.io/
-[4]: https://code.visualstudio.com/
-[5]: https://github.com/jceb/vim-orgmode
-[6]: https://atom.io/packages/organized
-[7]: https://www.gnu.org/software/emacs/
diff --git a/translated/tech/20180307 3 open source tools for scientific publishing.md b/translated/tech/20180307 3 open source tools for scientific publishing.md
new file mode 100644
index 0000000000..697b8d50ea
--- /dev/null
+++ b/translated/tech/20180307 3 open source tools for scientific publishing.md
@@ -0,0 +1,76 @@
+3款用于学术发表的开源工具
+======
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LIFE_science.png?itok=WDKARWGV)
+有一个行业在采用数字或者开源工具方面已落后其它行业,那就是竞争与利润并存的学术出版业。根据 Stephen Buranyi 去年在 [The Guardian][1] 发表的一份图表,这个估值超过190亿英镑(260亿美元)的行业至今在其选择、发表甚至分享最重要的科学研究的系统方面,仍受限于印刷媒介的诸多限制。全新的数字时代科技展现了一个能够加速探索、推动科学合作性而不是竞争性以及将投入重新从基础建设导向有益社会的研究的巨大的机遇。
+
+非盈利性的 [eLife 倡议][2] 是由研究的资金赞助方建立,旨在通过使用数字或者开源技术来走出上述僵局。除了为生活中科学和生物医疗方面的重大成就出版开放式获取的杂志,eLife 已将自己变成了一个在研究交流方面的创新实验窗口——而大部分的实验都是基于开源精神的。
+
+参与开源出版项目给予我们加速接触、采用科学技术,提升用户体验的机会。我们认为这种机会对于推动学术出版行业是重要的。大而化之地说,开源产品的用户体验经常是有待开发的,而有时候这种情况会阻止其他人去使用它。作为我们在 OSS 开发中投入的一部分,为了鼓励更多用户使用这些产品,我们十分注重用户体验。
+
+我们所有的代码都是开源的并且我们也积极鼓励开源社区参与进我们的项目中。这对我们来说意味着更快的迭代、更多的实验、更大的透明度,同时也拓宽了我们工作的外延。
+
+我们现在参与的项目,例如 Libero (之前称作 [eLife Continuum][3])和 [可复制文档栈][4] 的开发以及我们最近和 [Hypothesis][5] 的合作,展示了 OSS 是如何在校队、发表以及新发现的沟通方面带来正面影响的。
+
+### Libero
+
+Libero 是面向发布者的服务及应用套餐,它包括一个后生产出版系统、整套前端用户界面、Libero 的棱镜阅读器、一个开放式的API以及一个搜索推荐引擎。
+
+去年我们采取了用户导向的途径重新设计了 Libero 的前端,做出了一个使用户较少地分心并更多地集中注意在研究文章上的站点。我们和 eLife 社区成员测试并迭代了站点所有的核心功能以确保给所有人最好的阅读体验。网站的新 API 也给可供机器阅读的内容提供了更简单的访问途径,其中包括文字挖掘、机器学习以及在线应用开发。我们网站上的内容以及引领新设计的样式都是开源的,以鼓励 eLife 和其它想要使用它的发布者后续的开发。
+
+### 可复制文档栈
+
+在与 [Substance][6] 和 [Stencila][7] 的合作下,eLife 也参与了一个项目来创建可复制的文档栈(RDS)——一个开放式的创作、编纂以及在线出版可复制的计算型手稿的工具栈。
+
+今天越来越多的研究员能够通过 [R、Markdown][8] 和 [Python][9] 等语言记录他们的计算型实验。这些可以作为实验记录的重要部分,但是尽管它们可以通过最终的研究文章独立地分享,传统出版流程经常将它们视为次级内容。为了发表论文,使用这些语言的研究员除了将他们的计算结果用图片的形式“扁平化”提交外别无他法。但是这导致了许多实验价值和代码和计算数据可重复利用性的流失。诸如 [Jupyter][10] 的电子笔记本解决方案确实可以使研究员以一种可重复利用、可执行的简单形式发布,但是这种方案仍然独立于整个手稿发布过程之外,而不是集成在其中。
+
+[可复制文档栈][11] 项目着眼于通过开发、发布一个能够把代码和数据集成在文档自身的产品雏形来突出这些挑战并阐述一个端对端的从创作到出版的完整科技。它将最终允许用户以一种包含嵌入代码块和计算结果(统计结果、图表或图片)的形式提交他们的手稿并在出版过程中保留这些可视、可执行的部分。那时发布者就可以将这些作为发布的在线文章的整体所保存。
+
+### 用 Hypothesis 进行开放式注解
+
+最近,我们与 [Hypothesis][12] 合作引进了开放式注解,使得我们网站的用户们可以写评语、高亮文章重要部分以及与在线阅读的群体互动。
+
+通过这样的合作,开源的 Hypothesis 软件被定制得更具有现代化的特性如单次登录验证、用户界面定制选项,给予了发布者在他们自己网站上更多的控制。这些提升正引导着关于发表的学术内容高质量的讨论。
+
+这个工具可以无缝集成进发布者的网站,学术发表平台 [PubFactory][13] 和内容解决方案供应商 [Ingenta][14] 已经利用了它优化后的特性集。[HighWire][15] 和 [Silverchair][16] 也为他们的发布者提供了实施这套方案的机会。
+
+ ### 其它产业和开源软件
+
+过段时间,我们希望看到更多的发布者采用 Hypothesis、Libero 以及其它开源软件去帮助他们促进重要科学研究的发现以及循环利用。但是 eLife 所能利用的因这些软件和其它 OSS 科技带来的创新机会在其他产业也很普遍。
+
+数据科学的世界离不开高质量、强支持的开源软件和围绕它们形成的社区;[TensorFlow][17] 就是这样一个好例子。感谢 OSS 以及其社区,AI 的所有领域和机器学习相比于计算机的其它领域有了迅速的提升和发展。与之类似的是 Linux 云端网页主机、Docker 容器、Github上最流行的开源项目之一的 Kubernetes 使用的爆炸性增长。
+
+所有的这些科技使得不同团体能够四两拨千斤并集中在创新而不是造轮子上。最后,那才是 OSS 真正的好处:它使得我们从互相的失败中学习,在互相的成功中成长。
+
+我们总是在寻找与研究和科技界面方面最好的人才和想法交流的机会。你可以在 [eLife Labs][18] 上或者联系 [innovation@elifesciences.org][19] 找到更多这种交流的信息。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/3/scientific-publishing-software
+
+作者:[Paul Shanno][a]
+译者:[tomjlw](https://github.com/tomjlw)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://opensource.com/users/pshannon
+[1]:https://www.theguardian.com/science/2017/jun/27/profitable-business-scientific-publishing-bad-for-science
+[2]:https://elifesciences.org/about
+[3]:https://elifesciences.org/inside-elife/33e4127f/elife-introduces-continuum-a-new-open-source-tool-for-publishing
+[4]:https://elifesciences.org/for-the-press/e6038800/elife-supports-development-of-open-technology-stack-for-publishing-reproducible-manuscripts-online
+[5]:https://elifesciences.org/for-the-press/81d42f7d/elife-enhances-open-annotation-with-hypothesis-to-promote-scientific-discussion-online
+[6]:https://github.com/substance
+[7]:https://github.com/stencila/stencila
+[8]:https://rmarkdown.rstudio.com/
+[9]:https://www.python.org/
+[10]:http://jupyter.org/
+[11]:https://elifesciences.org/labs/7dbeb390/reproducible-document-stack-supporting-the-next-generation-research-article
+[12]:https://github.com/hypothesis
+[13]:http://www.pubfactory.com/
+[14]:http://www.ingenta.com/
+[15]:https://github.com/highwire
+[16]:https://www.silverchair.com/community/silverchair-universe/hypothesis/
+[17]:https://www.tensorflow.org/
+[18]:https://elifesciences.org/labs
+[19]:mailto:innovation@elifesciences.org
diff --git a/translated/tech/20181216 Schedule a visit with the Emacs psychiatrist.md b/translated/tech/20181216 Schedule a visit with the Emacs psychiatrist.md
new file mode 100644
index 0000000000..7e05a0e930
--- /dev/null
+++ b/translated/tech/20181216 Schedule a visit with the Emacs psychiatrist.md
@@ -0,0 +1,62 @@
+[#]:collector:(lujun9972)
+[#]:translator:(lujun9972)
+[#]:reviewer:( )
+[#]:publisher:( )
+[#]:url:( )
+[#]:subject:(Schedule a visit with the Emacs psychiatrist)
+[#]:via:(https://opensource.com/article/18/12/linux-toy-eliza)
+[#]:author:(Jason Baker https://opensource.com/users/jason-baker)
+
+预约 Emacs 心理医生
+======
+Eliza 是一个隐藏于某个 Linux 最流行文本编辑器中的自然语言处理聊天机器人。
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/uploads/linux-toy-eliza.png?itok=3ioiBik_)
+
+欢迎你,今天时期 24 天的 Linux 命令行玩具的又一天。如果你是第一次访问本系列,你可能会问什么是命令行玩具呢。我们将会逐步确定这个概念,但一般来说,它可能是一个游戏,或任何能让你在终端玩的开心的其他东西。
+
+可能你们已经见过了很多我们之前挑选的那些玩具,但我们依然希望对所有人来说都至少有一件新鲜事物。
+
+今天的选择是 Emacs 中的一个彩蛋:Eliza,Rogerian 心理医生,一个准备好倾听你述说一切的终端玩具。
+
+旁白:虽然这个玩具很好玩,但你的健康不是用来开玩笑的。请在假期期间照顾好你自己,无论时身体上还是精神上,若假期中的压力和焦虑对你的健康产生负面影响,请考虑找专业人士进行指导。真的有用。
+
+要启动 [Eliza][1],首先,你需要启动 Emacs。很有可能 Emacs 已经安装在你的系统中了,但若没有,它基本上也肯定在你默认的软件仓库中。
+
+由于我要求本系列的工具一定要时运行在终端内,因此使用 **-nw** 标志来启动 Emacs 让它在你的终端模拟器中运行。
+
+```
+$ emacs -nw
+```
+
+在 Emacs 中,输入 M-x doctor 来启动 Eliza。对于像我这样有 Vim 背景的人可能不知道这是什么意思,只需要按下 escape,输入 x 然后输入 doctor。然后,向它倾述所有假日的烦恼吧。
+
+Eliza 历史悠久,最早可以追溯到 1960 年代中期的 MIT 人工智能实验室。[维基百科 ][2] 上有它历史的详细说明。
+
+Eliza 并不是 Emacs 中唯一的娱乐工具。查看 [手册 ][3] 可以看到一整列好玩的玩具。
+
+
+![Linux toy:eliza animated][5]
+
+你有什么喜欢的命令行玩具值得推荐吗?我们时间不多了,但我还是想听听你的建议。请在下面评论中告诉我,我会查看的。另外也欢迎告诉我你们对本次玩具的想法。
+
+请一定要看看昨天的玩具,[带着这个复刻版吃豆人来到 Linux 终端游乐中心 ][6],然后明天再来看另一个玩具!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/12/linux-toy-eliza
+
+作者:[Jason Baker][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/jason-baker
+[b]: https://github.com/lujun9972
+[1]: https://www.emacswiki.org/emacs/EmacsDoctor
+[2]: https://en.wikipedia.org/wiki/ELIZA
+[3]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Amusements.html
+[4]: /file/417326
+[5]: https://opensource.com/sites/default/files/uploads/linux-toy-eliza-animated.gif (Linux toy: eliza animated)
+[6]: https://opensource.com/article/18/12/linux-toy-myman
diff --git a/translated/tech/20190103 How to use Magit to manage Git projects.md b/translated/tech/20190103 How to use Magit to manage Git projects.md
deleted file mode 100644
index e2f43323e6..0000000000
--- a/translated/tech/20190103 How to use Magit to manage Git projects.md
+++ /dev/null
@@ -1,93 +0,0 @@
-[#]:collector:(lujun9972)
-[#]:translator:(lujun9972)
-[#]:reviewer:( )
-[#]:publisher:( )
-[#]:url:( )
-[#]:subject:(How to use Magit to manage Git projects)
-[#]:via:(https://opensource.com/article/19/1/how-use-magit)
-[#]:author:(Sachin Patil https://opensource.com/users/psachin)
-
-如何使用 Magit 管理 Git 项目
-======
-Emacs 的 Magit 扩展插件使得使用 Git 进行版本控制变得简单起来。
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolseriesk12_rh_021x_0.png?itok=fvorN0e-)
-
-[Git][1] 是一个很棒的用于项目管理的 [版本控制 ][2] 工具,就是新人学习起来太难。Git 的命令行工具很难用,你不仅需要熟悉它的标志和选项还需要知道什么环境下使用他们。这使人望而生畏,因此不少人只在有限的几个场景中才使用它。
-
-还在,现今大多数的集成开发环境 (IDE) 都包含了 Git 扩展,大大地简化了使用使用的难度。Emacs 中就有这么一款 Git 扩展名叫 [Magit][3]。
-
-Magit 项目成立有差不多 10 年了,它将自己定义为 "一件 Emacs 内的 Git 瓷器。" 也就是说,它是一个操作界面,每个操作都能一键完成。本文会带你领略一下 Magit 的操作界面并告诉你如何使用它来管理 Git 项目。
-
-若你还未 [安装 Emacs][4],则开始本教程之前请先 [安装 Magit][5]。
-
-### Magit 的界面
-
-首先用 Emacs 的 [Dired mode][6] 访问一个项目目录。比如我所有的 Emacs 配置存储在 **~/.emacs.d/** 目录中,就是用 Git 来进行管理的。
-
-![](https://opensource.com/sites/default/files/uploads/visiting_a_git_project.png)
-
-若你在命令行下工作,则你需要输入 **git status** 来查看项目的当前状态。Magit 也有类似的函数:**magit-status**。你可以通过 **M-x magit-status** (快捷方式是 **Alt+x magit-status** )来调用该函数。结果看起来像下面这样:
-
-![](https://opensource.com/sites/default/files/uploads/magit_status.png)
-
-Magit 显示的信息比 **git status** 命令的要多得多。它分别列出了未追踪文件列表、未暂存文件列表以及已暂存文件列表。它还列出了储藏 (stash) 列表以及最近几次的提交—所有这些信息都在一个窗口中展示。
-
-如果你想查看修改了哪些内容,按下 Tab 键。比如,我移动光标到未暂存文件 **custom_functions.org** 上然后按下 Tab 键,Magit 会显示修改了哪些内容:
-
-![](https://opensource.com/sites/default/files/uploads/show_unstaged_content.png)
-
-这跟运行命令 **git diff custom_functions.org** 类似。储藏文件更简单。只需要移动光标到文件上然后按下 **s** 键。该文件就会迅速移动到被储藏文件列表中:
-
-![](https://opensource.com/sites/default/files/uploads/staging_a_file.png)
-
-要反储藏 (unstage) 某个文件,使用 **u** 键。按下 **s** 和 **u** 键要比在命令行输入 **git add -u ** 和 **git reset HEAD ** 快的多也更有趣的多。
-
-### 提交更改
-
-在同一个 Magit 窗口中,按下 **c** 键会显示一个提交窗口,其中提供了许多标志,比如 **--all** 用来暂存所有文件或者 **--signoff** 来往提交信息中添加签名行。
-
-![](https://opensource.com/sites/default/files/uploads/magit_commit_popup.png)
-
-将光标移动到想要启动的行,比如 signoff 标签行,然后按下回车。**--signoff** 文本会变成高亮,这说明该标志已经被启用。
-
-![](https://opensource.com/sites/default/files/uploads/magit_signoff_commit.png)
-
-再次按下 **c** 键会显示一个窗口供你输入提交信息。
-
-![](https://opensource.com/sites/default/files/uploads/magit_commit_message.png)
-
-最后,使用 **C-c C-c **(按键 Ctrl+cc 的缩写形式) 来提交更改。
-
-![](https://opensource.com/sites/default/files/uploads/magit_commit_message_2.png)
-
-### 推送更改
-
-更改提交后,提交行将会显示在 **Recent commits** 段中显示。
-
-![](https://opensource.com/sites/default/files/uploads/magit_commit_log.png)
-
-将光标放到该提交处然后按下 **p** 来推送该变更。
-
-若你想感受一下使用 Magit 的感觉,我已经在 YouTube 上上传了一段 [演示 ][7]。本文只涉及到 Magit 的一点皮毛。它有许多超酷的功能可以帮你使用 Git 分支,变基等功能。你可以在 Magit 的主页上找到 [文档,支持,以及更多 ][8] 链接。
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/how-use-magit
-
-作者:[Sachin Patil][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/psachin
-[b]: https://github.com/lujun9972
-[1]: https://git-scm.com
-[2]: https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control
-[3]: https://magit.vc
-[4]: https://www.gnu.org/software/emacs/download.html
-[5]: https://magit.vc/manual/magit/Installing-from-Melpa.html#Installing-from-Melpa
-[6]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired-Enter.html#Dired-Enter
-[7]: https://youtu.be/Vvw75Pqp7Mc
-[8]: https://magit.vc/
diff --git a/translated/tech/20190104 Midori- A Lightweight Open Source Web Browser.md b/translated/tech/20190104 Midori- A Lightweight Open Source Web Browser.md
new file mode 100644
index 0000000000..9cc0673527
--- /dev/null
+++ b/translated/tech/20190104 Midori- A Lightweight Open Source Web Browser.md
@@ -0,0 +1,110 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Midori: A Lightweight Open Source Web Browser)
+[#]: via: (https://itsfoss.com/midori-browser)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+Midori:轻量级开源 Web 浏览器
+======
+
+**这是一个对再次回归的轻量级、快速、开源的 Web 浏览器 Midori 的快速回顾**
+
+如果你正在寻找一款轻量级[网络浏览器替代品][1],请试试 Midori。
+
+[Midori][2]是一款开源的网络浏览器,它更注重轻量级而不是提供大量功能。
+
+如果你从未听说过 Midori,你可能会认为它是一个新的应用程序,但实际上 Midori 于 2007 年首次发布。
+
+因为它专注于速度,所以 Midori 很快就聚集了一群爱好者,并成为了 Bodhi Linux、SilTaz 等轻量级 Linux 发行版的默认浏览器。
+
+其他发行版如 [elementary OS][3] 也使用了 Midori 作为其默认浏览器。但 Midori 的开发在 2016 年左右停滞了,它的粉丝开始怀疑 Midori 已经死了。由于这个原因,elementary OS 从最新版本中删除了它。
+
+好消息是 Midori 还没有死。经过近两年的不活跃,开发工作在 2018 年的最后一个季度恢复了。在后来的版本中添加了一些包括广告拦截器的扩展。
+
+### Midori 网络浏览器的功能
+
+![Midori web browser][4]
+
+以下是Midori浏览器的一些主要功能
+
+ * 使用 Vala 编写,带有 GTK+3 和 WebKit 渲染引擎。
+ * 标签、窗口和会话管理
+ * 快速拨号
+ * 默认保存下一个会话的选项卡
+ * 使用 DuckDuckGo 作为默认搜索引擎。可以更改为 Google 或 Yahoo。
+ * 书签管理
+ * 可定制和可扩展的界面
+ * 扩展模块可以用 C 和 Vala 编写
+ * 支持 HTML5
+ * 少量的扩展程序包括广告拦截器、彩色标签等。没有第三方扩展程序。
+ * 表格历史
+ * 隐私浏览
+ * 可用于 Linux 和 Windows
+
+
+
+小知识:Midori 是日语单词,意思是绿色。如果你因此在猜想一些东西,Midori 的开发者实际不是日本人。
+
+### 体验 Midori
+
+![Midori web browser in Ubuntu 18.04][5]
+
+这几天我一直在使用 Midori。体验基本很好。它支持 HTML5 并能快速渲染网站。广告拦截器也没问题。正如你对任何标准 Web 浏览器所期望的那样,浏览体验挺顺滑。
+
+缺少扩展一直是 Midori 的弱点所以我不打算谈论这个。
+
+我注意到的是它不支持国际语言。我找不到添加新语言支持的方法。它根本无法渲染印地语字体,我猜对其他非[罗曼语言][6]也是一样。
+
+我也在 YouTube 中也遇到了麻烦。有些视频会抛出播放错误而其他视频没问题。
+
+Midori 没有像 Chrome 那样吃我的内存,所以这是一个很大的优势。
+
+如果你想尝试 Midori,让我们看下你该如何安装。
+
+### 在 Linux 上安装 Midori
+
+在 Ubuntu 18.04 仓库中不再提供 Midori。但是,可以使用 [Snap 包][7]轻松安装较新版本的 Midori。
+
+如果你使用的是 Ubuntu,你可以在软件中心找到 Midori(Snap 版)并从那里安装。
+
+![Midori browser is available in Ubuntu Software Center][8]Midori browser is available in Ubuntu Software Center
+
+对于其他 Linux 发行版,请确保你[已启用 Snap 支持][9],然后你可以使用以下命令安装 Midori:
+
+```
+sudo snap install midori
+```
+
+你可以选择从源代码编译。你可以从 Midori 的网站下载它的代码。
+
+如果你喜欢 Midori 并希望帮助这个开源项目,请向他们捐赠或[从他们的商店购买 Midori 商品][10]。
+
+你在使用 Midori 还是曾经用过么?你的体验如何?你更喜欢使用哪种其他网络浏览器?请在下面的评论栏分享你的观点。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/midori-browser
+
+作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/open-source-browsers-linux/
+[2]: https://www.midori-browser.org/
+[3]: https://itsfoss.com/elementary-os-juno-features/
+[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/Midori-web-browser.jpeg?resize=800%2C450&ssl=1
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/midori-browser-linux.jpeg?resize=800%2C491&ssl=1
+[6]: https://en.wikipedia.org/wiki/Romance_languages
+[7]: https://itsfoss.com/use-snap-packages-ubuntu-16-04/
+[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/midori-ubuntu-software-center.jpeg?ssl=1
+[9]: https://itsfoss.com/install-snap-linux/
+[10]: https://www.midori-browser.org/shop
+[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/Midori-web-browser.jpeg?fit=800%2C450&ssl=1
diff --git a/translated/tech/20190108 How ASLR protects Linux systems from buffer overflow attacks.md b/translated/tech/20190108 How ASLR protects Linux systems from buffer overflow attacks.md
new file mode 100644
index 0000000000..5d0c059f9b
--- /dev/null
+++ b/translated/tech/20190108 How ASLR protects Linux systems from buffer overflow attacks.md
@@ -0,0 +1,132 @@
+[#]: collector: (lujun9972)
+[#]: translator: (leommxj)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How ASLR protects Linux systems from buffer overflow attacks)
+[#]: via: (https://www.networkworld.com/article/3331199/linux/what-does-aslr-do-for-linux.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+ASLR是如何保护Linux系统免受缓冲区溢出攻击的
+======
+
+![](https://images.idgesg.net/images/article/2019/01/shuffling-cards-100784640-large.jpg)
+
+地址空间随机化( ASLR )是一种操作系统用来抵御缓冲区溢出攻击的内存保护机制。这种技术使得系统上运行的进程的内存地址无法预测,使得与这些进程有关的漏洞变得更加难以利用。
+
+ASLR目前在 Linux , Windows 以及 MacOS 系统上都有使用。其最早出现在 2005 的Linux系统上。2007 年,这项技术被 Windows 和 MacOS 部署使用。尽管 ASLR 在各个系统上都提供相同的功能,却有着不同的实现。
+
+ASLR的有效性依赖于整个地址空间布局对于攻击者保持未知。此外,只有编译时作为位置无关可执行文件(PIE)的程序才能得到ASLR最大的保护,因为只有这样,可执行文件的所有代码节区才会被加载在随机地址。PIE 代码不管绝对地址是多少都可以正确执行。
+
+**[ 参见:[用于排除Linux故障的宝贵提示和技巧][1] ]**
+
+### ASLR 的局限性
+
+尽管 ASLR 使得对系统漏洞的利用更加困难了,但其保护系统的能力是有限的。理解关于 ASLR 的以下几点是很重要的:
+
+ * 不能解决漏洞,而是增加利用漏洞的难度
+ * 并不追踪或报告漏洞
+ * 不能对编译时没有开启 ASLR 支持的二进制文件提供保护
+ * 不能避免被绕过
+
+
+
+### ASLR 是如何工作的
+
+
+
+ASLR通过对攻击者在进行缓冲区溢出攻击时所要用到的内存布局中的偏移做随机化来加大攻击成功的难度,从而增强了系统的控制流完整性。
+
+
+通常认为 ASLR 在64位系统上效果更好,因为64位系统提供了更大的熵(可随机的地址范围)。
+
+### ASLR 是否正在你的 Linux 系统上运行?
+
+下面展示的两条命令都可以告诉你你的系统是否启用了 ASLR 功能
+
+```
+$ cat /proc/sys/kernel/randomize_va_space
+2
+$ sysctl -a --pattern randomize
+kernel.randomize_va_space = 2
+```
+
+上方指令结果中的数值 (2) 表示 ASLR 工作在全随机化模式。其可能为下面的几个数值之一:
+
+```
+0 = Disabled
+1 = Conservative Randomization
+2 = Full Randomization
+```
+
+如果你关闭了 ASLR 并且执行下面的指令,你将会注意到前后两条**ldd**的输出是完全一样的。**ldd**命令会加载共享对象并显示他们在内存中的地址。
+
+```
+$ sudo sysctl -w kernel.randomize_va_space=0 <== disable
+[sudo] password for shs:
+kernel.randomize_va_space = 0
+$ ldd /bin/bash
+ linux-vdso.so.1 (0x00007ffff7fd1000) <== same addresses
+ libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007ffff7c69000)
+ libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffff7c63000)
+ libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7a79000)
+ /lib64/ld-linux-x86-64.so.2 (0x00007ffff7fd3000)
+$ ldd /bin/bash
+ linux-vdso.so.1 (0x00007ffff7fd1000) <== same addresses
+ libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007ffff7c69000)
+ libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffff7c63000)
+ libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7a79000)
+ /lib64/ld-linux-x86-64.so.2 (0x00007ffff7fd3000)
+```
+
+如果将其重新设置为**2**来启用 ASLR,你将会看到每次运行**ldd**,得到的内存地址都不相同。
+
+```
+$ sudo sysctl -w kernel.randomize_va_space=2 <== enable
+[sudo] password for shs:
+kernel.randomize_va_space = 2
+$ ldd /bin/bash
+ linux-vdso.so.1 (0x00007fff47d0e000) <== first set of addresses
+ libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f1cb7ce0000)
+ libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1cb7cda000)
+ libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1cb7af0000)
+ /lib64/ld-linux-x86-64.so.2 (0x00007f1cb8045000)
+$ ldd /bin/bash
+ linux-vdso.so.1 (0x00007ffe1cbd7000) <== second set of addresses
+ libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fed59742000)
+ libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fed5973c000)
+ libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fed59552000)
+ /lib64/ld-linux-x86-64.so.2 (0x00007fed59aa7000)
+```
+
+### 尝试绕过 ASLR
+
+尽管这项技术有很多优点,绕过ASLR的攻击并不罕见,主要有以下几类:
+
+ * 利用地址泄露
+ * 访问与特定地址关联的数据
+ * 针对ASLR 实现的缺陷来猜测地址,常见于系统熵过低或 ASLR 实现不完善。
+ * 利用侧信道攻击
+
+### 总结
+
+ASLR 有很大的价值,尤其是在64位系统上运行并被正确实现时。虽然不能避免被绕过,但这项技术的确使得利用系统漏洞变得更加困难了。这份参考资料可以提供更多有关细节 [on the Effectiveness of Full-ASLR on 64-bit Linux][2] ,这篇论文介绍了一种利用分支预测绕过ASLR的技术 [bypass ASLR][3]。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3331199/linux/what-does-aslr-do-for-linux.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[leommxj](https://github.com/leommxj)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/article/3242170/linux/invaluable-tips-and-tricks-for-troubleshooting-linux.html
+[2]: https://cybersecurity.upv.es/attacks/offset2lib/offset2lib-paper.pdf
+[3]: http://www.cs.ucr.edu/~nael/pubs/micro16.pdf
+[4]: https://www.facebook.com/NetworkWorld/
+[5]: https://www.linkedin.com/company/network-world
diff --git a/translated/tech/20190109 Configure Anaconda on Emacs - iD.md b/translated/tech/20190109 Configure Anaconda on Emacs - iD.md
new file mode 100644
index 0000000000..09dcfd9a1c
--- /dev/null
+++ b/translated/tech/20190109 Configure Anaconda on Emacs - iD.md
@@ -0,0 +1,117 @@
+[#]:collector:(lujun9972)
+[#]:translator:(lujun9972)
+[#]:reviewer:( )
+[#]:publisher:( )
+[#]:url:( )
+[#]:subject:(Configure Anaconda on Emacs – iD)
+[#]:via:(https://idevji.com/configure-anaconda-on-emacs/)
+[#]:author:(Devji Chhanga https://idevji.com/author/admin/)
+
+在 Emacs 上配置 Anaconda
+======
+
+也许我所最求的究极 IDE 就是 [Emacs][1] 了。我的目标是使 Emacs 成为一款全能的 Python IDE。本文描述了如何在 Emacs 上配置 Anaconda。
+
+我的配置信息:
+
+```
+OS: Trisquel 8.0
+Emacs: GNU Emacs 25.3.2
+```
+
+快捷键说明 [(参见完全指南 )][2]:
+
+```
+C-x = Ctrl + x
+M-x = Alt + x
+RET = ENTER
+```
+
+### 1。下载并安装 Anaconda
+
+#### 1.1 下载:
+[从这儿 ][3] 下载 Anaconda。你应该下载 Python 3.x 版本因为 Python 2 在 2020 年就不再支持了。你无需预先安装 Python 3.x。安装脚本会自动进行安装。
+
+#### 1.2 安装:
+
+```
+ cd ~/Downloads
+bash Anaconda3-2018.12-Linux-x86.sh
+```
+
+
+### 2。将 Anaconda 添加到 Emacs
+
+#### 2.1 将 MELPA 添加到 Emacs
+我们需要用到 _anaconda-mode_ 这个 Emacs 包。该包位于 MELPA 仓库中。Emacs25 需要手工添加该仓库。
+
+[注意:点击本文查看如何将 MELPA 添加到 Emacs。][4]
+
+#### 2.2 为 Emacs 安装 anaconda-mode 包
+
+```
+M-x package-install RET
+anaconda-mode RET
+```
+
+#### 2.3 为 Emacs 配置 anaconda-mode
+
+```
+echo "(add-hook 'python-mode-hook 'anaconda-mode)" > ~/.emacs.d/init.el
+```
+
+
+### 3。在 Emacs 上通过 Anaconda 运行你第一个脚本
+
+#### 3.1 创建新 .py 文件
+
+```
+C-x C-f
+HelloWorld.py RET
+```
+
+#### 3.2 输入下面代码
+
+```
+print ("Hello World from Emacs")
+```
+
+#### 3.3 运行之
+
+```
+C-c C-p
+C-c C-c
+```
+
+输出为
+
+```
+Python 3.7.1 (default, Dec 14 2018, 19:46:24)
+[GCC 7.3.0] :: Anaconda, Inc. on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> python.el: native completion setup loaded
+>>> Hello World from Emacs
+>>>
+```
+
+我是受到 [Codingquark;][5] 的影响才开始使用 Emacs 的。
+有任何错误和遗漏请在评论中之处。干杯!
+
+--------------------------------------------------------------------------------
+
+via: https://idevji.com/configure-anaconda-on-emacs/
+
+作者:[Devji Chhanga][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://idevji.com/author/admin/
+[b]: https://github.com/lujun9972
+[1]: https://www.gnu.org/software/emacs/
+[2]: https://www.math.uh.edu/~bgb/emacs_keys.html
+[3]: https://www.anaconda.com/download/#linux
+[4]: https://melpa.org/#/getting-started
+[5]: https://codingquark.com
diff --git a/translated/tech/20190123 Mind map yourself using FreeMind and Fedora.md b/translated/tech/20190123 Mind map yourself using FreeMind and Fedora.md
new file mode 100644
index 0000000000..2e2331e698
--- /dev/null
+++ b/translated/tech/20190123 Mind map yourself using FreeMind and Fedora.md
@@ -0,0 +1,81 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: 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/)
+
+在 Fedora 中使用 FreeMind 制作自己的思维导图
+======
+![](https://fedoramagazine.org/wp-content/uploads/2019/01/freemind-816x345.jpg)
+
+你自己的思维导图一开始听起来有些牵强。它是关于神经通路么?还是心灵感应?完全不是。相反,自己的思维导图是一种在视觉上向他人描述自己的方式。它还展示了你拿来描述的特征之间的联系。这是一种以聪明的同时可控的与他人分享信息的有用方式。你可以使用任何思维导图应用来做到。本文向你展示如何使用 Fedora 中提供的 [FreeMind][1]。
+
+### 获取应用
+
+FreeMind 已经出现有一段时间了。虽然 UI 有点过时,你也可以使用新的,但它是一个功能强大的应用,提供了许多构建思维导图的选项。当然,它是 100% 开源的。还有其他思维导图应用可供 Fedora 和 Linux 用户使用。查看[此前一篇涵盖多个思维导图选择的文章][2]。
+
+如果你运行的是 Fedora Workstation,请使用“软件”应用从 Fedora 仓库安装 FreeMind。或者在终端中使用这个 [sudo][3] 命令:
+
+```
+$ sudo dnf install freemind
+```
+
+你可以从 Fedora Workstation 中的 GNOME Shell Overview 启动应用。或者使用桌面环境提供的应用启动服务。默认情况下,FreeMind 会显示一个新的空白脑图:
+
+![][4]
+FreeMind 初始(空白)思维导图
+
+脑图由链接的项目或描述(节点)组成。当你想到与节点相关的内容时,只需创建一个与其连接的新节点即可。
+
+###
+
+单击初始节点。编辑文本并点击**回车**将其替换为你的姓名。你就能开始你的思维导图。
+
+如果你必须向某人充分描述自己,你会怎么想?可能会有很多东西。你平时做什么?你喜欢什么?你不喜欢什么?你有什么价值?你有家庭吗?所有这些都可以在节点中体现。
+
+要添加节点连接,请选择现有节点,然后单击**插入**,或使用“灯泡”图标作为新的子节点。要在与新子级相同的层级添加另一个节点,请使用**回车**。
+
+如果你弄错了,别担心。你可以使用 **Delete** 键删除不需要的节点。内容上没有规则。但是最好是短节点。它们能让你在创建导图时思维更快。简洁的节点还能让其他浏览者更轻松地查看和理解。
+
+该示例使用节点规划了每个主要类别:
+
+![][5]
+个人思维导图,第一级
+
+你可以为这些区域中的每个区域另外迭代一次。让你的思想自由地连接想法以生成导图。不要担心“做得正确“。最好将所有内容从头脑中移到显示屏上。这是下一级导图的样子。
+
+![][6]
+个人思维导图,第二级
+
+你可以以相同的方式扩展任何这些节点。请注意你在示例中可以了解多少有关 John Q. Public 的信息。
+
+### 如何使用你的个人思维导图
+
+这是让团队或项目成员互相介绍的好方法。你可以将各种格式和颜色应用于导图以赋予其个性。当然,这些在纸上做很有趣。但是在 Fedora 中安装一个就意味着你可以随时修复错误,甚至可以在你改变的时候做出修改。
+
+祝你在探索个人思维导图上玩得开心!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/mind-map-yourself-using-freemind-and-fedora/
+
+作者:[Paul W. Frields][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://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/translated/tech/20190212 Two graphical tools for manipulating PDFs on the Linux desktop.md b/translated/tech/20190212 Two graphical tools for manipulating PDFs on the Linux desktop.md
new file mode 100644
index 0000000000..adcf6de0d3
--- /dev/null
+++ b/translated/tech/20190212 Two graphical tools for manipulating PDFs on the Linux desktop.md
@@ -0,0 +1,99 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Two graphical tools for manipulating PDFs on the Linux desktop)
+[#]: via: (https://opensource.com/article/19/2/manipulating-pdfs-linux)
+[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
+
+两款 Linux 桌面中的图形化操作 PDF 的工具
+======
+PDF-Shuffler 和 PDF Chain 是在 Linux 中修改 PDF 的绝佳工具。
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_osyearbook2016_sysadmin_cc.png?itok=Y1AHCKI4)
+
+由于我谈论并且写了些工作中使用 PDF 及其工具的文章,有些人认为我喜欢这种格式。其实我并不是,由于各种原因,我不会深入它。
+
+我不会说 PDF 是我个人和职业生活中的一个躲不开的坏事 - 相反,它们不是那么好。通常即使有更好的替代方案来交付文档,我也必须使用 PDF。
+
+当我使用 PDF 时,通常是在白天工作时在其他的操作系统上使用,我使用 Adobe Acrobat 进行操作。但是当我必须在 Linux 桌面上使用 PDF 时呢?我们来看看我用来操作 PDF 的两个图形工具。
+
+### PDF-Shuffler
+
+顾名思义,你可以使用 [PDF-Shuffler][1] 在 PDF 文件中移动页面。它可以做得更多,但软件的功能是有限的。这并不意味着 PDF-Shuffler 没用。它有用,很有用。
+
+你可以将 PDF-Shuffler 用来:
+
+ * 从 PDF 文件中提取页面
+ * 将页面添加到文件中
+ * 重新排列文件中的页面
+
+
+
+请注意,PDF-Shuffler 有一些依赖项,如 pyPDF 和 python-gtk。通常,通过包管理器安装它是最快且最不令人沮丧的途径。
+
+假设你想从 PDF 中提取页面,也许是作为你书中的样本章节。选择**文件>添加**打开 PDF 文件。
+
+![](https://opensource.com/sites/default/files/uploads/pdfshuffler-book.png)
+
+要提取第 7 页到第 9 页,请按住 Ctrl 并单击选择页面。然后,右键单击并选择**导出选择**。
+
+![](https://opensource.com/sites/default/files/uploads/pdfshuffler-export.png)
+
+选择要保存文件的目录,为其命名,然后单击**保存**。
+
+要添加文件 - 例如,要添加封面或重新插入已扫描的且已签名的合同或者应用 - 打开 PDF 文件,然后选择**文件>添加**并找到要添加的 PDF 文件。单击**打开**。
+
+PDF-Shuffler 有个不好的东西就是在你正在处理的 PDF 文件末尾添加页面。单击并将添加的页面拖动到文件中的所需位置。你一次只能在文件中单击并拖动一个页面。
+
+![](https://opensource.com/sites/default/files/uploads/pdfshuffler-move.png)
+
+### PDF Chain
+
+我是 [PDFtk][2] 的忠实粉丝,它是一个可以对 PDF 做一些有趣操作的命令行工具。由于我不经常使用它,我不记得所有 PDFtk 的命令和选项。
+
+[PDF Chain][3] 是 PDFtk 命令行的一个很好的替代品。它可以让你一键使用 PDFtk 最常用的命令。无需使用菜单,你可以:
+
+ * 合并 PDF(包括旋转一个或多个文件的页面)
+ * 从 PDF 中提取页面并将其保存到单个文件中
+ * 为 PDF 添加背景或水印
+ * 将附件添加到文件
+
+![](https://opensource.com/sites/default/files/uploads/pdfchain1.png)
+
+你也可以做得更多。点击**工具**菜单,你可以:
+
+ * 从 PDF 中提取附件
+ * 压缩或解压缩文件
+ * 从文件中提取元数据
+ * 用外部[数据][4]填充 PDF 表格
+ * [扁平化][5] PDF
+ * 从 PDF 表单中删除 [XML 表格结构][6](XFA)数据
+
+
+
+老实说,我只使用 PDF Chain 或 PDFtk 提取附件、压缩或解压缩 PDF。其余的对我来说基本没听说。
+
+### 总结
+
+Linux 上用于处理 PDF 的工具数量一直让我感到吃惊。它们的特性和功能的广度和深度也是如此。我通常可以找到一个,无论是命令行还是图形,它都能做我需要的。在大多数情况下,PDF Mod 和 PDF Chain 对我来说效果很好。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/manipulating-pdfs-linux
+
+作者:[Scott Nesbitt][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/scottnesbitt
+[b]: https://github.com/lujun9972
+[1]: https://savannah.nongnu.org/projects/pdfshuffler/
+[2]: https://en.wikipedia.org/wiki/PDFtk
+[3]: http://pdfchain.sourceforge.net/
+[4]: http://www.verypdf.com/pdfform/fdf.htm
+[5]: http://pdf-tips-tricks.blogspot.com/2009/03/flattening-pdf-layers.html
+[6]: http://en.wikipedia.org/wiki/XFA
diff --git a/translated/tech/20190213 How to use Linux Cockpit to manage system performance.md b/translated/tech/20190213 How to use Linux Cockpit to manage system performance.md
new file mode 100644
index 0000000000..b2c5136494
--- /dev/null
+++ b/translated/tech/20190213 How to use Linux Cockpit to manage system performance.md
@@ -0,0 +1,87 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to use Linux Cockpit to manage system performance)
+[#]: via: (https://www.networkworld.com/article/3340038/linux/sitting-in-the-linux-cockpit.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+如何使用 Linux Cockpit 来管理系统性能
+======
+
+Linux Cockpit 是一个基于 Web 界面的应用,它提供了对系统的图形化管理。看下它能够控制哪些。
+
+![](https://images.idgesg.net/images/article/2019/02/cockpit_airline_airplane_control_pilot-by-southerlycourse-getty-100787904-large.jpg)
+
+如果你还没有尝试过相对较新的 Linux Cockpit,你可能会对它所能做的一切感到惊讶。它是一个用户友好的基于 Web 的控制台,提供了一些非常简单的方法来管理 Linux 系统 —_通过**web**_。你可以通过一个非常简单的 web 来监控系统资源、添加或删除帐户、监控系统使用情况、关闭系统以及执行其他一些其他任务。它的设置和使用也非常简单。
+
+虽然许多 Linux 系统管理员将大部分时间花在命令行上,但使用 PuTTY 等工具访问远程系统并不总能提供最有用的命令输出。Linux Cockpit 提供了图形和易于使用的表单,来查看性能情况并对系统进行更改。
+
+Linux Cockpit 能让你查看系统性能的许多方面并进行配置更改,但任务列表可能取决于你使用的特定 Linux。任务分类包括以下内容:
+
+ * 监控系统活动(CPU、内存、磁盘 IO 和网络流量) — **系统**
+ * 查看系统日志条目 — **日志**
+ * 查看磁盘分区的容量 — **存储**
+ * 查看网络活动(发送和接收) — **网络**
+ * 查看用户帐户 — **帐户**
+ * 检查系统服务的状态 — **服务**
+ * 提取已安装应用的信息 — **应用**
+ * 查看和安装可用更新(如果以 root 身份登录)并在需要时重新启动系统 — **软件更新**
+ * 打开并使用终端窗口 — **终端**
+
+
+
+某些 Linux Cockpit 安装还允许你运行诊断报告、转储内核、检查 SELinux(安全)设置和列表订阅。
+
+以下是 Linux Cockpit 显示的系统活动示例:
+
+![cockpit activity][1] Sandra Henry-Stocker
+
+Linux Cockpit 显示系统活动
+
+### 如何设置 Linux Cockpit
+
+在某些 Linux 发行版(例如,最新的 RHEL)中,Linux Cockpit 可能已经安装并可以使用。在其他情况下,你可能需要采取一些简单的步骤来安装它并使其可使用。
+
+例如,在 Ubuntu 上,这些命令应该可用:
+
+```
+$ sudo apt-get install cockpit
+$ man cockpit <== just checking
+$ sudo systemctl enable --now cockpit.socket
+$ netstat -a | grep 9090
+tcp6 0 0 [::]:9090 [::]:* LISTEN
+$ sudo systemctl enable --now cockpit.socket
+$ sudo ufw allow 9090
+```
+
+启用 Linux Cockpit 后,在浏览器中打开 **https:// :9090**。
+
+可以在 [Cockpit Project]][2] 中找到可以使用 Cockpit 的发行版列表以及安装说明。
+
+没有额外的配置,Linux Cockpit 将无法识别 **sudo** 权限。如果你被禁止使用 Cockpit 进行更改,你将会在你点击的按钮上看到一个红色的国际禁止标志。
+
+要使 sudo 权限有效,你需要确保用户位于 **/etc/group** 文件中的 **wheel**(RHEL)或 **adm** (Debian)组中,即服务器当以 root 用户身份登录 Cockpit 并且用户在登录 Cockpit 时选择“重用我的密码”时,已勾选了 Server Administrator。
+
+在你管理的系统在千里之外或者没有控制台时,能使用图形界面控制也不错。虽然我喜欢在控制台上工作,但我偶然也乐于见到图形或者按钮。Linux Cockpit 为日常管理任务提供了非常有用的界面。
+
+在 [Facebook][3] 和 [LinkedIn][4] 中加入 Network World 社区,对你喜欢的文章评论。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3340038/linux/sitting-in-the-linux-cockpit.html
+
+作者:[Sandra Henry-Stocker][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://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://images.idgesg.net/images/article/2019/02/cockpit-activity-100787994-large.jpg
+[2]: https://cockpit-project.org/running.html
+[3]: https://www.facebook.com/NetworkWorld/
+[4]: https://www.linkedin.com/company/network-world
diff --git a/translated/tech/20190217 How to Change User Password in Ubuntu -Beginner-s Tutorial.md b/translated/tech/20190217 How to Change User Password in Ubuntu -Beginner-s Tutorial.md
new file mode 100644
index 0000000000..a2dfb77515
--- /dev/null
+++ b/translated/tech/20190217 How to Change User Password in Ubuntu -Beginner-s Tutorial.md
@@ -0,0 +1,129 @@
+[#]: collector: (lujun9972)
+[#]: translator: (An-DJ)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to Change User Password in Ubuntu [Beginner’s Tutorial])
+[#]: via: (https://itsfoss.com/change-password-ubuntu)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+Ubuntu下如何修改用户密码 [新手教程]
+======
+**想要在Ubuntu下修改root用户的密码?那我们来学习下如何在Ubuntu Linux下修改任意用户的密码。我们会讨论在终端下修改和在图形界面(GUI)修改两种做法**
+
+那么,在Ubuntu下什么时候会需要修改密码呢?这里我给出如下两种场景。
+
+当你刚安装[Ubuntu][1]系统时,你会创建一个用户并且为之设置一个密码。这个初始密码可能安全性较弱或者太过于复杂,你会想要对它做出修改。
+
+如果你是系统管理员,你可能需要去修改在你管理的系统内其他用户的密码。
+
+当然,你可能会有其他的一些原因做这样的一件事。不过现在问题来了,我们到底如何在Ubuntu或Linux系统下修改单个用户的密码呢?
+
+在这个快速教程中,我将会展示给你在Ubuntu中如何使用命令行和图形界面(GUI)两种方式修改密码。
+
+### 在Ubuntu中修改用户密码[通过命令行]
+
+![如何在Ubuntu Linux下修改用户密码][2]
+
+在Ubuntu下修改用户密码其实非常简单。事实上,在任何Linux发行版上修改的方式都是一样的,因为你要使用的是叫做 passwd 的普通Linux命令来达到此目的。
+
+如果你想要修改你的当前密码,只需要简单地在终端执行此命令:
+
+```
+passwd
+```
+
+系统会要求你输入当前密码和两次新的密码。
+
+在键入密码时,你不会从屏幕上看到任何东西。这在UNIX和Linux系统中是非常正常的表现。
+
+```
+passwd
+
+Changing password for abhishek.
+
+(current) UNIX password:
+
+Enter new UNIX password:
+
+Retype new UNIX password:
+
+passwd: password updated successfully
+```
+
+由于这是你的管理员账户,你刚刚修改了Ubuntu下sudo的密码,但你甚至没有意识到这个操作。
+
+![在Linux命令行中修改用户密码][3]
+
+如果你想要修改其他用户的密码,你也可以使用passwd命令来做。但是在这种情况下,你将不得不使用sudo。
+
+```
+sudo passwd
+```
+
+如果你对密码已经做出了修改,不过之后忘记了,不要担心。你可以[很容易地在Ubuntu下重置密码][4].
+
+### 修改Ubuntu下root用户密码
+
+默认情况下,Ubuntu中root用户是没有密码的。不必惊讶,你并不是在Ubuntu下一直使用root用户。不太懂?让我快速地给你解释下。
+
+当[安装Ubuntu][5]时,你会被强制创建一个用户。这个用户拥有管理员访问权限。这个管理员用户可以通过sudo命令获得root访问权限。但是,该用户使用的是自身的密码,而不是root账户的密码(因为就没有)。
+
+你可以使用**passwd**命令来设置或修改root用户的密码。然而,在大多数情况下,你并不需要它,而且你不应该去做这样的事。
+
+你将不得不使用sudo命令(对于拥有管理员权限的账户)。如果root用户的密码之前没有被设置,它会要求你设置。另外,你可以使用已有的root密码对它进行修改。
+
+```
+sudo password root
+```
+
+### 在Ubuntu下使用图形界面(GUI)修改密码
+
+我这里使用的是GNOME桌面环境,Ubuntu版本为18.04。这些步骤对于其他桌面环境和Ubuntu版本应该差别不大。
+
+打开菜单(按下Windows/Super键)并搜索Settings。
+
+在Settings中,向下滚动一段距离打开进入Details。
+
+![在Ubuntu GNOME Settings中进入Details][6]
+
+在这里,点击Users获取系统下可见的所有用户。
+
+![Ubuntu下用户设置][7]
+
+你可以选择任一你想要的用户,包括你的主要管理员账户。你需要先解锁用户并点击密码(password)区域。
+
+![Ubuntu下修改用户密码][8]
+
+你会被要求设置密码。如果你正在修改的是你自己的密码,你将必须也输入当前使用的密码。
+
+![Ubuntu下修改用户密码][9]
+
+做好这些后,点击上面的Change按钮,这样就完成了。你已经成功地在Ubuntu下修改了用户密码。
+
+我希望这篇快速精简的小教程能够帮助你在Ubuntu下修改用户密码。如果你对此还有一些问题或建议,请在下方留下评论。
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/change-password-ubuntu
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[An-DJ](https://github.com/An-DJ)
+校对:[校对者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.ubuntu.com/
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-password-ubuntu-linux.png?resize=800%2C450&ssl=1
+[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-linux-1.jpg?resize=800%2C253&ssl=1
+[4]: https://itsfoss.com/how-to-hack-ubuntu-password/
+[5]: https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-2.jpg?resize=800%2C484&ssl=1
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-3.jpg?resize=800%2C488&ssl=1
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-4.jpg?resize=800%2C555&ssl=1
+[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-1.jpg?ssl=1
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-password-ubuntu-linux.png?fit=800%2C450&ssl=1